
org.spongycastle.pqc.asn1.McEliecePrivateKey Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of core Show documentation
Show all versions of core Show documentation
Spongy Castle is a package-rename (org.bouncycastle.* to org.spongycastle.*) of Bouncy Castle
intended for the Android platform. Android unfortunately ships with a stripped-down version of
Bouncy Castle, which prevents easy upgrades - Spongy Castle overcomes this and provides a full,
up-to-date version of the Bouncy Castle cryptographic libs.
package org.spongycastle.pqc.asn1;
import java.math.BigInteger;
import org.spongycastle.asn1.ASN1EncodableVector;
import org.spongycastle.asn1.ASN1Integer;
import org.spongycastle.asn1.ASN1Object;
import org.spongycastle.asn1.ASN1ObjectIdentifier;
import org.spongycastle.asn1.ASN1OctetString;
import org.spongycastle.asn1.ASN1Primitive;
import org.spongycastle.asn1.ASN1Sequence;
import org.spongycastle.asn1.DEROctetString;
import org.spongycastle.asn1.DERSequence;
import org.spongycastle.pqc.math.linearalgebra.GF2Matrix;
import org.spongycastle.pqc.math.linearalgebra.GF2mField;
import org.spongycastle.pqc.math.linearalgebra.Permutation;
import org.spongycastle.pqc.math.linearalgebra.PolynomialGF2mSmallM;
public class McEliecePrivateKey
extends ASN1Object
{
private ASN1ObjectIdentifier oid;
private int n;
private int k;
private byte[] encField;
private byte[] encGp;
private byte[] encSInv;
private byte[] encP1;
private byte[] encP2;
private byte[] encH;
private byte[][] encqInv;
public McEliecePrivateKey(ASN1ObjectIdentifier oid, int n, int k, GF2mField field, PolynomialGF2mSmallM goppaPoly, GF2Matrix sInv, Permutation p1, Permutation p2, GF2Matrix h, PolynomialGF2mSmallM[] qInv)
{
this.oid = oid;
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();
this.encH = h.getEncoded();
this.encqInv = new byte[qInv.length][];
for (int i = 0; i != qInv.length; i++)
{
encqInv[i] = qInv[i].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)
{
//
oid = ((ASN1ObjectIdentifier)seq.getObjectAt(0));
BigInteger bigN = ((ASN1Integer)seq.getObjectAt(1)).getValue();
n = bigN.intValue();
BigInteger bigK = ((ASN1Integer)seq.getObjectAt(2)).getValue();
k = bigK.intValue();
encField = ((ASN1OctetString)seq.getObjectAt(3)).getOctets();
encGp = ((ASN1OctetString)seq.getObjectAt(4)).getOctets();
encSInv = ((ASN1OctetString)seq.getObjectAt(5)).getOctets();
encP1 = ((ASN1OctetString)seq.getObjectAt(6)).getOctets();
encP2 = ((ASN1OctetString)seq.getObjectAt(7)).getOctets();
encH = ((ASN1OctetString)seq.getObjectAt(8)).getOctets();
ASN1Sequence asnQInv = (ASN1Sequence)seq.getObjectAt(9);
encqInv = new byte[asnQInv.size()][];
for (int i = 0; i < asnQInv.size(); i++)
{
encqInv[i] = ((ASN1OctetString)asnQInv.getObjectAt(i)).getOctets();
}
}
public ASN1ObjectIdentifier getOID()
{
return oid;
}
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 GF2Matrix getH()
{
return new GF2Matrix(encH);
}
public PolynomialGF2mSmallM[] getQInv()
{
PolynomialGF2mSmallM[] qInv = new PolynomialGF2mSmallM[encqInv.length];
GF2mField field = this.getField();
for (int i = 0; i < encqInv.length; i++)
{
qInv[i] = new PolynomialGF2mSmallM(field, encqInv[i]);
}
return qInv;
}
public ASN1Primitive toASN1Primitive()
{
ASN1EncodableVector v = new ASN1EncodableVector();
// encode
v.add(oid);
// encode
v.add(new ASN1Integer(n));
// encode
v.add(new ASN1Integer(k));
// encode
v.add(new DEROctetString(encField));
// encode
v.add(new DEROctetString(encGp));
// encode
v.add(new DEROctetString(encSInv));
// encode
v.add(new DEROctetString(encP1));
// encode
v.add(new DEROctetString(encP2));
// encode
v.add(new DEROctetString(encH));
// encode
ASN1EncodableVector asnQInv = new ASN1EncodableVector();
for (int i = 0; i < encqInv.length; i++)
{
asnQInv.add(new DEROctetString(encqInv[i]));
}
v.add(new DERSequence(asnQInv));
return new DERSequence(v);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy