diff options
Diffstat (limited to 'bcprov/src/main/java/org/bouncycastle/crypto/prng/drbg/DualECPoints.java')
-rw-r--r-- | bcprov/src/main/java/org/bouncycastle/crypto/prng/drbg/DualECPoints.java | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/bcprov/src/main/java/org/bouncycastle/crypto/prng/drbg/DualECPoints.java b/bcprov/src/main/java/org/bouncycastle/crypto/prng/drbg/DualECPoints.java new file mode 100644 index 0000000..7dcfa94 --- /dev/null +++ b/bcprov/src/main/java/org/bouncycastle/crypto/prng/drbg/DualECPoints.java @@ -0,0 +1,82 @@ +package org.bouncycastle.crypto.prng.drbg; + +import org.bouncycastle.math.ec.ECPoint; + +/** + * General class for providing point pairs for use with DualEC DRBG. See NIST SP 800-90A for further details. + */ +public class DualECPoints +{ + private final ECPoint p; + private final ECPoint q; + private final int securityStrength; + private final int cofactor; + + /** + * Base Constructor. + * <p> + * The cofactor is used to calculate the output block length (maxOutlen) according to + * <pre> + * max_outlen = largest multiple of 8 less than ((field size in bits) - (13 + log2(cofactor)) + * </pre> + * + * @param securityStrength maximum security strength to be associated with these parameters + * @param p the P point. + * @param q the Q point. + * @param cofactor cofactor associated with the domain parameters for the point generation. + */ + public DualECPoints(int securityStrength, ECPoint p, ECPoint q, int cofactor) + { + if (!p.getCurve().equals(q.getCurve())) + { + throw new IllegalArgumentException("points need to be on the same curve"); + } + + this.securityStrength = securityStrength; + this.p = p; + this.q = q; + this.cofactor = cofactor; + } + + public int getSeedLen() + { + return p.getCurve().getFieldSize(); + } + + public int getMaxOutlen() + { + return ((p.getCurve().getFieldSize() - (13 + log2(cofactor))) / 8) * 8; + } + + public ECPoint getP() + { + return p; + } + + public ECPoint getQ() + { + return q; + } + + public int getSecurityStrength() + { + return securityStrength; + } + + public int getCofactor() + { + return cofactor; + } + + private static int log2(int value) + { + int log = 0; + + while ((value >>= 1) != 0) + { + log++; + } + + return log; + } +} |