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.GoppaCode;
import org.bouncycastle.pqc.math.linearalgebra.Permutation;
import org.bouncycastle.pqc.math.linearalgebra.PolynomialGF2mSmallM;
import org.bouncycastle.pqc.math.linearalgebra.PolynomialRingGF2m;

/**
 *
 *
 *
 */
public class McElieceCCA2PrivateKeyParameters
    extends McElieceCCA2KeyParameters
{
    // 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 digest McElieceCCA2Parameters
     */
    public McElieceCCA2PrivateKeyParameters(int n, int k, GF2mField field,
                                            PolynomialGF2mSmallM gp, Permutation p, String digest)
    {
        super(true, digest);
        this.n = n;
        this.k = k;
        this.field = field;
        this.goppaPoly = gp;
        this.p = p;

        this.h = GoppaCode.createCanonicalCheckMatrix(field, gp);

        PolynomialRingGF2m ring = new PolynomialRingGF2m(field, gp);

        // matrix for computing square roots in (GF(2^m))^t
        this.qInv = ring.getSquareRootMatrix();
    }

    /**
     * @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;
    }
}

@@ -1769,32 +1769,1143 @@
 2m(field, gp);%0A%0A
+        // matrix for computing square roots in (GF(2%5Em))%5Et%0A        this.qInv = ring.getSquareRootMatrix();%0A    %7D%0A    %0A    /**%0A     * Constructor.%0A     *%0A     * @param n                         the length of the code%0A     * @param k                         the dimension of the code%0A     * @param field                     the finite field %3Ctt%3EGF(2%3Csup%3Em%3C/sup%3E)%3C/tt%3E%0A     * @param gp                        the irreducible Goppa polynomial%0A     * @param canonicalCheckMatrix      the canonical check matrix%0A     * @param p                         the permutation%0A     * @param digest                    McElieceCCA2Parameters%0A     */%0A    public McElieceCCA2PrivateKeyParameters(int n, int k, GF2mField field, PolynomialGF2mSmallM gp, %0A                                            GF2Matrix canonicalCheckMatrix, Permutation p, String digest)%0A    %7B%0A        super(true, digest);%0A        this.n = n;%0A        this.k = k;%0A        this.field = field;%0A        this.goppaPoly = gp;%0A        this.h = canonicalCheckMatrix;%0A        this.p = p;%0A        %0A        PolynomialRingGF2m ring = new PolynomialRingGF2m(field, gp);%0A%0A
         // matri

add Constructor