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); }
public ECPoint ToECPoint(int keySize) { var size = keySize / 8; return(new ECPoint { X = CryptoUtils.ToNormalizedByteArray(X, size), Y = CryptoUtils.ToNormalizedByteArray(Y, size), }); }
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); }
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, }); }