import org.bouncycastle.math.ec.ECPoint; //导入方法依赖的package包/类
/**
* Construct a SP800-90A Dual EC DRBG.
*
* Minimum entropy requirement is the security strength requested.
*
* @param digest source digest to use with the DRB stream.
* @param securityStrength security strength required (in bits)
* @param entropySource source of entropy to use for seeding/reseeding.
* @param personalizationString personalization string to distinguish this DRBG (may be null).
* @param nonce nonce to further distinguish this DRBG (may be null).
*/
public DualECSP800DRBG(Digest digest, int securityStrength, EntropySource entropySource, byte[] personalizationString, byte[] nonce)
{
_digest = digest;
_entropySource = entropySource;
_securityStrength = securityStrength;
if (Utils.isTooLarge(personalizationString, MAX_PERSONALIZATION_STRING / 8))
{
throw new IllegalArgumentException("Personalization string too large");
}
if (entropySource.entropySize() < securityStrength || entropySource.entropySize() > MAX_ENTROPY_LENGTH)
{
throw new IllegalArgumentException("EntropySource must provide between " + securityStrength + " and " + MAX_ENTROPY_LENGTH + " bits");
}
byte[] entropy = entropySource.getEntropy();
byte[] seedMaterial = Arrays.concatenate(entropy, nonce, personalizationString);
if (securityStrength <= 128)
{
if (Utils.getMaxSecurityStrength(digest) < 128)
{
throw new IllegalArgumentException("Requested security strength is not supported by digest");
}
_seedlen = 256;
_outlen = 240 / 8;
_curve = (ECCurve.Fp)NISTNamedCurves.getByName("P-256").getCurve();
_P = new ECPoint.Fp(_curve, new ECFieldElement.Fp(_curve.getQ(), p256_Px), new ECFieldElement.Fp(_curve.getQ(), p256_Py));
_Q = new ECPoint.Fp(_curve, new ECFieldElement.Fp(_curve.getQ(), p256_Qx), new ECFieldElement.Fp(_curve.getQ(), p256_Qy));
}
else if (securityStrength <= 192)
{
if (Utils.getMaxSecurityStrength(digest) < 192)
{
throw new IllegalArgumentException("Requested security strength is not supported by digest");
}
_seedlen = 384;
_outlen = 368 / 8;
_curve = (ECCurve.Fp)NISTNamedCurves.getByName("P-384").getCurve();
_P = new ECPoint.Fp(_curve, new ECFieldElement.Fp(_curve.getQ(), p384_Px), new ECFieldElement.Fp(_curve.getQ(), p384_Py));
_Q = new ECPoint.Fp(_curve, new ECFieldElement.Fp(_curve.getQ(), p384_Qx), new ECFieldElement.Fp(_curve.getQ(), p384_Qy));
}
else if (securityStrength <= 256)
{
if (Utils.getMaxSecurityStrength(digest) < 256)
{
throw new IllegalArgumentException("Requested security strength is not supported by digest");
}
_seedlen = 521;
_outlen = 504 / 8;
_curve = (ECCurve.Fp)NISTNamedCurves.getByName("P-521").getCurve();
_P = new ECPoint.Fp(_curve, new ECFieldElement.Fp(_curve.getQ(), p521_Px), new ECFieldElement.Fp(_curve.getQ(), p521_Py));
_Q = new ECPoint.Fp(_curve, new ECFieldElement.Fp(_curve.getQ(), p521_Qx), new ECFieldElement.Fp(_curve.getQ(), p521_Qy));
}
else
{
throw new IllegalArgumentException("security strength cannot be greater than 256 bits");
}
_s = Utils.hash_df(_digest, seedMaterial, _seedlen);
_sLength = _s.length;
_reseedCounter = 0;
}