package org.bouncycastle.pqc.crypto.mceliece;
import org.bouncycastle.pqc.math.linearalgebra.GF2Matrix;
import org.bouncycastle.pqc.math.linearalgebra.GF2mField;
import org.bouncycastle.pqc.math.linearalgebra.Permutation;
import org.bouncycastle.pqc.math.linearalgebra.PolynomialGF2mSmallM;
/**
*
*
*
*/
public class McElieceCCA2PrivateKeyParameters
extends McElieceCCA2KeyParameters
{
// the OID of the algorithm
private String oid;
// the length of the code
private int n;
// the dimension of the code
private int k;
// the finte field GF(2^m)
private GF2mField field;
// the irreducible Goppa polynomial
private PolynomialGF2mSmallM goppaPoly;
// the permutation
private Permutation p;
// the canonical check matrix
private GF2Matrix h;
// the matrix used to compute square roots in (GF(2^m))^t
private PolynomialGF2mSmallM[] qInv;
/**
* Constructor.
*
* @param n the length of the code
* @param k the dimension of the code
* @param field the finite field <tt>GF(2<sup>m</sup>)</tt>
* @param gp the irreducible Goppa polynomial
* @param p the permutation
* @param h the canonical check matrix
* @param qInv the matrix used to compute square roots in
* <tt>(GF(2^m))^t</tt>
* @param params McElieceCCA2Parameters
*/
public McElieceCCA2PrivateKeyParameters(String oid, int n, int k, GF2mField field,
PolynomialGF2mSmallM gp, Permutation p, GF2Matrix h,
PolynomialGF2mSmallM[] qInv, McElieceCCA2Parameters params)
{
super(true, params);
this.oid = oid;
this.n = n;
this.k = k;
this.field = field;
this.goppaPoly = gp;
this.p = p;
this.h = h;
this.qInv = qInv;
}
/**
* Constructor used by the {@link McElieceKeyFactory}.
*
* @param n the length of the code
* @param k the dimension of the code
* @param encFieldPoly the encoded field polynomial defining the finite field
* <tt>GF(2<sup>m</sup>)</tt>
* @param encGoppaPoly the encoded irreducible Goppa polynomial
* @param encP the encoded permutation
* @param encH the encoded canonical check matrix
* @param encQInv the encoded matrix used to compute square roots in
* <tt>(GF(2^m))^t</tt>
* @param params McElieceCCA2Parameters
*/
public McElieceCCA2PrivateKeyParameters(String oid, int n, int k, byte[] encFieldPoly,
byte[] encGoppaPoly, byte[] encP, byte[] encH, byte[][] encQInv, McElieceCCA2Parameters params)
{
super(true, params);
this.oid = oid;
this.n = n;
this.k = k;
field = new GF2mField(encFieldPoly);
goppaPoly = new PolynomialGF2mSmallM(field, encGoppaPoly);
p = new Permutation(encP);
h = new GF2Matrix(encH);
qInv = new PolynomialGF2mSmallM[encQInv.length];
for (int i = 0; i < encQInv.length; i++)
{
qInv[i] = new PolynomialGF2mSmallM(field, encQInv[i]);
}
}
/**
* @return the length of the code
*/
public int getN()
{
return n;
}
/**
* @return the dimension of the code
*/
public int getK()
{
return k;
}
/**
* @return the degree of the Goppa polynomial (error correcting capability)
*/
public int getT()
{
return goppaPoly.getDegree();
}
/**
* @return the finite field
*/
public GF2mField getField()
{
return field;
}
/**
* @return the irreducible Goppa polynomial
*/
public PolynomialGF2mSmallM getGoppaPoly()
{
return goppaPoly;
}
/**
* @return the permutation P
*/
public Permutation getP()
{
return p;
}
/**
* @return the canonical check matrix H
*/
public GF2Matrix getH()
{
return h;
}
/**
* @return the matrix used to compute square roots in <tt>(GF(2^m))^t</tt>
*/
public PolynomialGF2mSmallM[] getQInv()
{
return qInv;
}
public String getOIDString()
{
return oid;
}
}