private static unsafe AsnWriter?RewritePkcs8ECPrivateKeyWithZeroPublicKey(ReadOnlySpan <byte> source) { fixed(byte *ptr = &MemoryMarshal.GetReference(source)) { using (MemoryManager <byte> manager = new PointerMemoryManager <byte>(ptr, source.Length)) { PrivateKeyInfoAsn privateKeyInfo = PrivateKeyInfoAsn.Decode(manager.Memory, AsnEncodingRules.BER); AlgorithmIdentifierAsn privateAlgorithm = privateKeyInfo.PrivateKeyAlgorithm; if (privateAlgorithm.Algorithm.Value != Oids.EcPublicKey) { return(null); } ECPrivateKey privateKey = ECPrivateKey.Decode(privateKeyInfo.PrivateKey, AsnEncodingRules.BER); EccKeyFormatHelper.FromECPrivateKey(privateKey, privateAlgorithm, out ECParameters ecParameters); fixed(byte *pD = ecParameters.D) { try { if (!ecParameters.Curve.IsExplicit || ecParameters.Q.X != null || ecParameters.Q.Y != null) { return(null); } byte[] zero = new byte[ecParameters.D !.Length];
/// <summary> /// Imports the public/private keypair from an ECPrivateKey structure, /// replacing the keys for this object. /// </summary> /// <param name="source">The bytes of an ECPrivateKey structure in the ASN.1-BER encoding.</param> /// <param name="bytesRead"> /// When this method returns, contains a value that indicates the number /// of bytes read from <paramref name="source" />. This parameter is treated as uninitialized. /// </param> /// <exception cref="NotSupportedException"> /// A derived class has not provided an implementation for <see cref="ImportParameters" />. /// </exception> /// <exception cref="CryptographicException"> /// <p> /// The contents of <paramref name="source" /> do not represent an /// ASN.1-BER-encoded PKCS#8 ECPrivateKey structure. /// </p> /// <p>-or-</p> /// <p>The key import failed.</p> /// </exception> /// <remarks> /// This method only supports the binary (BER/CER/DER) encoding of ECPrivateKey. /// If the value is Base64-encoded, the caller must Base64-decode the contents before calling this method. /// If the value is PEM-encoded, <see cref="ImportFromPem" /> should be used. /// </remarks> public virtual unsafe void ImportECPrivateKey(ReadOnlySpan <byte> source, out int bytesRead) { ECParameters ecParameters = EccKeyFormatHelper.FromECPrivateKey(source, out int localRead); fixed(byte *privPin = ecParameters.D) { try { ImportParameters(ecParameters); bytesRead = localRead; } finally { CryptographicOperations.ZeroMemory(ecParameters.D); } } }