public override unsafe void ImportPkcs8PrivateKey(ReadOnlySpan <byte> source, out int bytesRead) { fixed(byte *ptr = &MemoryMarshal.GetReference(source)) { using (MemoryManager <byte> manager = new PointerMemoryManager <byte>(ptr, source.Length)) { ReadOnlyMemory <byte> pkcs1 = KeyFormatHelper.ReadPkcs8( s_validOids, manager.Memory, out int localRead); ImportRSAPrivateKey(pkcs1.Span, out _); bytesRead = localRead; } } }
/// <summary> /// Imports the public/private keypair from a PKCS#8 PrivateKeyInfo structure /// after decryption, replacing the keys for this object. /// </summary> /// <param name="source">The bytes of a PKCS#8 PrivateKeyInfo 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 PrivateKeyInfo structure. /// </p> /// <p>-or-</p> /// <p> /// The contents of <paramref name="source" /> indicate the key is for an algorithm /// other than the algorithm represented by this instance. /// </p> /// <p>-or-</p> /// <p>The contents of <paramref name="source" /> represent the key in a format that is not supported.</p> /// <p>-or-</p> /// <p> /// The algorithm-specific key import failed. /// </p> /// </exception> /// <remarks> /// This method only supports the binary (BER/CER/DER) encoding of PrivateKeyInfo. /// 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 override unsafe void ImportPkcs8PrivateKey( ReadOnlySpan <byte> source, out int bytesRead) { KeyFormatHelper.ReadPkcs8 <ECParameters>( s_validOids, source, EccKeyFormatHelper.FromECPrivateKey, out int localRead, out ECParameters key); fixed(byte *privPin = key.D) { try { ImportParameters(key); bytesRead = localRead; } finally { CryptographicOperations.ZeroMemory(key.D); } } }