public X9ECParameters(Asn1Sequence seq)
    {
        if (!(seq[0] is DerInteger) || !((DerInteger)seq[0]).Value.Equals(BigInteger.One))
        {
            throw new ArgumentException("bad version in X9ECParameters");
        }
        X9Curve x9Curve = new X9Curve(X9FieldID.GetInstance(seq[1]), Asn1Sequence.GetInstance(seq[2]));

        curve = x9Curve.Curve;
        object obj = seq[3];

        if (obj is X9ECPoint)
        {
            g = (X9ECPoint)obj;
        }
        else
        {
            g = new X9ECPoint(curve, (Asn1OctetString)obj);
        }
        n    = ((DerInteger)seq[4]).Value;
        seed = x9Curve.GetSeed();
        if (seq.Count == 6)
        {
            h = ((DerInteger)seq[5]).Value;
        }
    }
 public X9ECParameters(ECCurve curve, X9ECPoint g, BigInteger n, BigInteger h, byte[] seed)
 {
     this.curve = curve;
     this.g     = g;
     this.n     = n;
     this.h     = h;
     this.seed  = seed;
     if (ECAlgorithms.IsFpCurve(curve))
     {
         fieldID = new X9FieldID(curve.Field.Characteristic);
         return;
     }
     if (ECAlgorithms.IsF2mCurve(curve))
     {
         IPolynomialExtensionField polynomialExtensionField = (IPolynomialExtensionField)curve.Field;
         int[] exponentsPresent = polynomialExtensionField.MinimalPolynomial.GetExponentsPresent();
         if (exponentsPresent.Length == 3)
         {
             fieldID = new X9FieldID(exponentsPresent[2], exponentsPresent[1]);
             return;
         }
         if (exponentsPresent.Length == 5)
         {
             fieldID = new X9FieldID(exponentsPresent[4], exponentsPresent[1], exponentsPresent[2], exponentsPresent[3]);
             return;
         }
         throw new ArgumentException("Only trinomial and pentomial curves are supported");
     }
     throw new ArgumentException("'curve' is of an unsupported type");
 }
예제 #3
0
 public X9Curve(X9FieldID fieldID, Asn1Sequence seq)
 {
     if (fieldID == null)
     {
         throw new ArgumentNullException("fieldID");
     }
     if (seq == null)
     {
         throw new ArgumentNullException("seq");
     }
     fieldIdentifier = fieldID.Identifier;
     if (fieldIdentifier.Equals(X9ObjectIdentifiers.PrimeField))
     {
         BigInteger     value           = ((DerInteger)fieldID.Parameters).Value;
         X9FieldElement x9FieldElement  = new X9FieldElement(value, (Asn1OctetString)seq[0]);
         X9FieldElement x9FieldElement2 = new X9FieldElement(value, (Asn1OctetString)seq[1]);
         curve = new FpCurve(value, x9FieldElement.Value.ToBigInteger(), x9FieldElement2.Value.ToBigInteger());
     }
     else if (fieldIdentifier.Equals(X9ObjectIdentifiers.CharacteristicTwoField))
     {
         DerSequence         derSequence         = (DerSequence)fieldID.Parameters;
         int                 intValue            = ((DerInteger)derSequence[0]).Value.IntValue;
         DerObjectIdentifier derObjectIdentifier = (DerObjectIdentifier)derSequence[1];
         int                 num = 0;
         int                 k   = 0;
         int                 k2  = 0;
         if (derObjectIdentifier.Equals(X9ObjectIdentifiers.TPBasis))
         {
             num = ((DerInteger)derSequence[2]).Value.IntValue;
         }
         else
         {
             DerSequence derSequence2 = (DerSequence)derSequence[2];
             num = ((DerInteger)derSequence2[0]).Value.IntValue;
             k   = ((DerInteger)derSequence2[1]).Value.IntValue;
             k2  = ((DerInteger)derSequence2[2]).Value.IntValue;
         }
         X9FieldElement x9FieldElement3 = new X9FieldElement(intValue, num, k, k2, (Asn1OctetString)seq[0]);
         X9FieldElement x9FieldElement4 = new X9FieldElement(intValue, num, k, k2, (Asn1OctetString)seq[1]);
         curve = new F2mCurve(intValue, num, k, k2, x9FieldElement3.Value.ToBigInteger(), x9FieldElement4.Value.ToBigInteger());
     }
     if (seq.Count == 3)
     {
         seed = ((DerBitString)seq[2]).GetBytes();
     }
 }