internal static CngKey FromXml(string xml)
        {
            CngKey key;

            using (TextReader reader = new StringReader(xml))
            {
                using (XmlTextReader reader2 = new XmlTextReader(reader))
                {
                    BigInteger     integer;
                    BigInteger     integer2;
                    XPathNavigator navigator = new XPathDocument(reader2).CreateNavigator();
                    if (!navigator.MoveToFirstChild())
                    {
                        throw new ArgumentException(System.SR.GetString("Cryptography_MissingDomainParameters"));
                    }
                    CngAlgorithm algorithm = ReadAlgorithm(navigator);
                    if (!navigator.MoveToNext(XPathNodeType.Element))
                    {
                        throw new ArgumentException(System.SR.GetString("Cryptography_MissingPublicKey"));
                    }
                    ReadPublicKey(navigator, out integer, out integer2);
                    key = CngKey.Import(NCryptNative.BuildEccPublicBlob(algorithm.Algorithm, integer, integer2), CngKeyBlobFormat.EccPublicBlob);
                }
            }
            return(key);
        }
Exemplo n.º 2
0
        /// <summary>
        ///     Restore a key from XML
        /// </summary>
        internal static CngKey FromXml(string xml)
        {
            Contract.Requires(xml != null);
            Contract.Ensures(Contract.Result <CngKey>() != null);

            // Load the XML into an XPathNavigator to access sub elements
            using (TextReader textReader = new StringReader(xml))
                using (XmlTextReader xmlReader = new XmlTextReader(textReader)) {
                    XPathDocument  document  = new XPathDocument(xmlReader);
                    XPathNavigator navigator = document.CreateNavigator();

                    // Move into the root element - we don't do a specific namespace check here for compatibility
                    // with XML that Windows generates.
                    if (!navigator.MoveToFirstChild())
                    {
                        throw new ArgumentException(SR.GetString(SR.Cryptography_MissingDomainParameters));
                    }

                    // First figure out which algorithm this key belongs to
                    CngAlgorithm algorithm = ReadAlgorithm(navigator);

                    // Then read out the public key value
                    if (!navigator.MoveToNext(XPathNodeType.Element))
                    {
                        throw new ArgumentException(SR.GetString(SR.Cryptography_MissingPublicKey));
                    }

                    BigInteger x;
                    BigInteger y;
                    ReadPublicKey(navigator, out x, out y);

                    // Finally, convert them into a key blob to import into a CngKey
                    byte[] keyBlob = NCryptNative.BuildEccPublicBlob(algorithm.Algorithm, x, y);
                    return(CngKey.Import(keyBlob, CngKeyBlobFormat.EccPublicBlob));
                }
        }