예제 #1
0
        private static byte[] ReadPrimeFieldElement(XmlReader reader, string localName, string ns, int keyLength)
        {
            var isEmpty = reader.IsEmptyElement;

            if (!reader.MoveToAttribute(TypeTag, XmlSchema.InstanceNamespace))
            {
                throw new NotImplementedException();
            }
            reader.ReadAttributeValue();
            var xsiType = reader.Value;

            if (xsiType != PrimeFieldElemTypeValue)
            {
                throw new NotImplementedException();
            }
            if (!reader.MoveToAttribute(ValueTag))
            {
                throw new NotImplementedException();
            }
            reader.ReadAttributeValue();
            var result = CryptoUtils.ToNormalizedByteArray(
                BigInteger.Parse(reader[ValueTag], CultureInfo.InvariantCulture),
                keyLength);

            reader.MoveToElement();
            reader.ReadStartElement(localName, ns);
            if (!isEmpty)
            {
                reader.ReadEndElement();
            }
            return(result);
        }
예제 #2
0
        public ECPoint ToECPoint(int keySize)
        {
            var size = keySize / 8;

            return(new ECPoint
            {
                X = CryptoUtils.ToNormalizedByteArray(X, size),
                Y = CryptoUtils.ToNormalizedByteArray(Y, size),
            });
        }
예제 #3
0
        private static byte[] ReadPrimeFieldParameters(XmlReader reader, string localName, string ns, int keyLength)
        {
            reader.ReadStartElement(localName, ns);
            reader.MoveToContent();
            var value = CryptoUtils.ToNormalizedByteArray(
                BigInteger.Parse(reader.ReadElementContentAsString(PTag, Namespace), CultureInfo.InvariantCulture),
                keyLength);

            reader.ReadEndElement();
            return(value);
        }
예제 #4
0
        private static ECCurve ReadExplicitParameters(XmlReader reader, int keyLength)
        {
            reader.ReadStartElement(ExplicitParamsTag, Namespace);
            reader.MoveToContent();
            var prime = ReadPrimeFieldParameters(reader, FieldParamsTag, Namespace, keyLength);

            reader.MoveToContent();
            reader.ReadStartElement(CurveParamsTag, Namespace);
            reader.MoveToContent();
            var a = ReadPrimeFieldElement(reader, ATag, Namespace, keyLength);

            reader.MoveToContent();
            var b = ReadPrimeFieldElement(reader, BTag, Namespace, keyLength);

            reader.ReadEndElement();
            reader.MoveToContent();
            reader.ReadStartElement(BasePointParamsTag, Namespace);
            reader.MoveToContent();
            var baseBoint = ReadECPoint(reader, BasePointTag, Namespace, keyLength);

            reader.MoveToContent();
            var order = CryptoUtils.ToNormalizedByteArray(
                BigInteger.Parse(reader.ReadElementContentAsString(OrderTag, Namespace), CultureInfo.InvariantCulture),
                keyLength);

            byte[]? cofactor;
            if (reader.IsStartElement(CofactorTag, Namespace))
            {
                cofactor = CryptoUtils.ToNormalizedByteArray(
                    BigInteger.Parse(reader.ReadElementContentAsString(), CultureInfo.InvariantCulture),
                    keyLength);
            }
            else
            {
                cofactor = null;
            }
            reader.ReadEndElement();
            reader.ReadEndElement();

            return(new ECCurve
            {
                CurveType = ECCurve.ECCurveType.PrimeShortWeierstrass,
                Prime = prime,
                A = a,
                B = b,
                G = baseBoint,
                Order = order,
                Cofactor = cofactor,
            });
        }