Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/quite/humla-spongycastle.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'prov/src/main/java/org/spongycastle/pqc/jcajce/provider/rainbow/BCRainbowPublicKey.java')
-rw-r--r--prov/src/main/java/org/spongycastle/pqc/jcajce/provider/rainbow/BCRainbowPublicKey.java170
1 files changed, 170 insertions, 0 deletions
diff --git a/prov/src/main/java/org/spongycastle/pqc/jcajce/provider/rainbow/BCRainbowPublicKey.java b/prov/src/main/java/org/spongycastle/pqc/jcajce/provider/rainbow/BCRainbowPublicKey.java
new file mode 100644
index 00000000..12f16ed9
--- /dev/null
+++ b/prov/src/main/java/org/spongycastle/pqc/jcajce/provider/rainbow/BCRainbowPublicKey.java
@@ -0,0 +1,170 @@
+package org.spongycastle.pqc.jcajce.provider.rainbow;
+
+import java.security.PublicKey;
+
+import org.spongycastle.asn1.DERNull;
+import org.spongycastle.asn1.x509.AlgorithmIdentifier;
+import org.spongycastle.pqc.asn1.PQCObjectIdentifiers;
+import org.spongycastle.pqc.asn1.RainbowPublicKey;
+import org.spongycastle.pqc.crypto.rainbow.RainbowParameters;
+import org.spongycastle.pqc.crypto.rainbow.RainbowPublicKeyParameters;
+import org.spongycastle.pqc.crypto.rainbow.util.RainbowUtil;
+import org.spongycastle.pqc.jcajce.provider.util.KeyUtil;
+import org.spongycastle.pqc.jcajce.spec.RainbowPublicKeySpec;
+import org.spongycastle.util.Arrays;
+
+/**
+ * This class implements CipherParameters and PublicKey.
+ * <p/>
+ * The public key in Rainbow consists of n - v1 polynomial components of the
+ * private key's F and the field structure of the finite field k.
+ * <p/>
+ * The quadratic (or mixed) coefficients of the polynomials from the public key
+ * are stored in the 2-dimensional array in lexicographical order, requiring n *
+ * (n + 1) / 2 entries for each polynomial. The singular terms are stored in a
+ * 2-dimensional array requiring n entries per polynomial, the scalar term of
+ * each polynomial is stored in a 1-dimensional array.
+ * <p/>
+ * More detailed information on the public key is to be found in the paper of
+ * Jintai Ding, Dieter Schmidt: Rainbow, a New Multivariable Polynomial
+ * Signature Scheme. ACNS 2005: 164-175 (http://dx.doi.org/10.1007/11496137_12)
+ */
+public class BCRainbowPublicKey
+ implements PublicKey
+{
+ private static final long serialVersionUID = 1L;
+
+ private short[][] coeffquadratic;
+ private short[][] coeffsingular;
+ private short[] coeffscalar;
+ private int docLength; // length of possible document to sign
+
+ private RainbowParameters rainbowParams;
+
+ /**
+ * Constructor
+ *
+ * @param docLength
+ * @param coeffQuadratic
+ * @param coeffSingular
+ * @param coeffScalar
+ */
+ public BCRainbowPublicKey(int docLength,
+ short[][] coeffQuadratic, short[][] coeffSingular,
+ short[] coeffScalar)
+ {
+ this.docLength = docLength;
+ this.coeffquadratic = coeffQuadratic;
+ this.coeffsingular = coeffSingular;
+ this.coeffscalar = coeffScalar;
+ }
+
+ /**
+ * Constructor (used by the {@link RainbowKeyFactorySpi}).
+ *
+ * @param keySpec a {@link RainbowPublicKeySpec}
+ */
+ public BCRainbowPublicKey(RainbowPublicKeySpec keySpec)
+ {
+ this(keySpec.getDocLength(), keySpec.getCoeffQuadratic(), keySpec
+ .getCoeffSingular(), keySpec.getCoeffScalar());
+ }
+
+ public BCRainbowPublicKey(
+ RainbowPublicKeyParameters params)
+ {
+ this(params.getDocLength(), params.getCoeffQuadratic(), params.getCoeffSingular(), params.getCoeffScalar());
+ }
+
+ /**
+ * @return the docLength
+ */
+ public int getDocLength()
+ {
+ return this.docLength;
+ }
+
+ /**
+ * @return the coeffQuadratic
+ */
+ public short[][] getCoeffQuadratic()
+ {
+ return coeffquadratic;
+ }
+
+ /**
+ * @return the coeffSingular
+ */
+ public short[][] getCoeffSingular()
+ {
+ short[][] copy = new short[coeffsingular.length][];
+
+ for (int i = 0; i != coeffsingular.length; i++)
+ {
+ copy[i] = Arrays.clone(coeffsingular[i]);
+ }
+
+ return copy;
+ }
+
+
+ /**
+ * @return the coeffScalar
+ */
+ public short[] getCoeffScalar()
+ {
+ return Arrays.clone(coeffscalar);
+ }
+
+ /**
+ * Compare this Rainbow public key with another object.
+ *
+ * @param other the other object
+ * @return the result of the comparison
+ */
+ public boolean equals(Object other)
+ {
+ if (other == null || !(other instanceof BCRainbowPublicKey))
+ {
+ return false;
+ }
+ BCRainbowPublicKey otherKey = (BCRainbowPublicKey)other;
+
+ return docLength == otherKey.getDocLength()
+ && RainbowUtil.equals(coeffquadratic, otherKey.getCoeffQuadratic())
+ && RainbowUtil.equals(coeffsingular, otherKey.getCoeffSingular())
+ && RainbowUtil.equals(coeffscalar, otherKey.getCoeffScalar());
+ }
+
+ public int hashCode()
+ {
+ int hash = docLength;
+
+ hash = hash * 37 + Arrays.hashCode(coeffquadratic);
+ hash = hash * 37 + Arrays.hashCode(coeffsingular);
+ hash = hash * 37 + Arrays.hashCode(coeffscalar);
+
+ return hash;
+ }
+
+ /**
+ * @return name of the algorithm - "Rainbow"
+ */
+ public final String getAlgorithm()
+ {
+ return "Rainbow";
+ }
+
+ public String getFormat()
+ {
+ return "X.509";
+ }
+
+ public byte[] getEncoded()
+ {
+ RainbowPublicKey key = new RainbowPublicKey(docLength, coeffquadratic, coeffsingular, coeffscalar);
+ AlgorithmIdentifier algorithmIdentifier = new AlgorithmIdentifier(PQCObjectIdentifiers.rainbow, DERNull.INSTANCE);
+
+ return KeyUtil.getEncodedSubjectPublicKeyInfo(algorithmIdentifier, key);
+ }
+}