package org.bouncycastle.pqc.asn1; import java.math.BigInteger; import org.bouncycastle.asn1.ASN1EncodableVector; import org.bouncycastle.asn1.ASN1Integer; import org.bouncycastle.asn1.ASN1Object; import org.bouncycastle.asn1.ASN1OctetString; import org.bouncycastle.asn1.ASN1Primitive; import org.bouncycastle.asn1.ASN1Sequence; import org.bouncycastle.asn1.DEROctetString; import org.bouncycastle.asn1.DERSequence; 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 McEliecePrivateKey extends ASN1Object { private int n; private int k; private byte[] encField; private byte[] encGp; private byte[] encSInv; private byte[] encP1; private byte[] encP2; public McEliecePrivateKey(int n, int k, GF2mField field, PolynomialGF2mSmallM goppaPoly, Permutation p1, Permutation p2, GF2Matrix sInv) { this.n = n; this.k = k; this.encField = field.getEncoded(); this.encGp = goppaPoly.getEncoded(); this.encSInv = sInv.getEncoded(); this.encP1 = p1.getEncoded(); this.encP2 = p2.getEncoded(); } public static McEliecePrivateKey getInstance(Object o) { if (o instanceof McEliecePrivateKey) { return (McEliecePrivateKey)o; } else if (o != null) { return new McEliecePrivateKey(ASN1Sequence.getInstance(o)); } return null; } private McEliecePrivateKey(ASN1Sequence seq) { BigInteger bigN = ((ASN1Integer)seq.getObjectAt(0)).getValue(); n = bigN.intValue(); BigInteger bigK = ((ASN1Integer)seq.getObjectAt(1)).getValue(); k = bigK.intValue(); encField = ((ASN1OctetString)seq.getObjectAt(2)).getOctets(); encGp = ((ASN1OctetString)seq.getObjectAt(3)).getOctets(); encP1 = ((ASN1OctetString)seq.getObjectAt(4)).getOctets(); encP2 = ((ASN1OctetString)seq.getObjectAt(5)).getOctets(); encSInv = ((ASN1OctetString)seq.getObjectAt(6)).getOctets(); } public int getN() { return n; } public int getK() { return k; } public GF2mField getField() { return new GF2mField(encField); } public PolynomialGF2mSmallM getGoppaPoly() { return new PolynomialGF2mSmallM(this.getField(), encGp); } public GF2Matrix getSInv() { return new GF2Matrix(encSInv); } public Permutation getP1() { return new Permutation(encP1); } public Permutation getP2() { return new Permutation(encP2); } public ASN1Primitive toASN1Primitive() { ASN1EncodableVector v = new ASN1EncodableVector(); // encode <n> v.add(new ASN1Integer(n)); // encode <k> v.add(new ASN1Integer(k)); // encode <fieldPoly> v.add(new DEROctetString(encField)); // encode <goppaPoly> v.add(new DEROctetString(encGp)); // encode <p1> v.add(new DEROctetString(encP1)); // encode <p2> v.add(new DEROctetString(encP2)); // encode <sInv> v.add(new DEROctetString(encSInv)); return new DERSequence(v); } }