public override void ImportSubjectPublicKeyInfo( ReadOnlySpan <byte> source, out int bytesRead) { DSAKeyFormatHelper.ReadSubjectPublicKeyInfo( source, out int localRead, out DSAParameters key); ImportParameters(key); bytesRead = localRead; }
public override DSAParameters ExportParameters(bool includePrivateParameters) { // Apple requires all private keys to be exported encrypted, but since we're trying to export // as parsed structures we will need to decrypt it for the user. const string ExportPassword = "******"; SecKeyPair keys = GetKeys(); if (keys.PublicKey == null || (includePrivateParameters && keys.PrivateKey == null)) { throw new CryptographicException(SR.Cryptography_OpenInvalidHandle); } byte[] keyBlob = Interop.AppleCrypto.SecKeyExport( includePrivateParameters ? keys.PrivateKey : keys.PublicKey, exportPrivate: includePrivateParameters, password: ExportPassword); try { if (!includePrivateParameters) { DSAKeyFormatHelper.ReadSubjectPublicKeyInfo( keyBlob, out int localRead, out DSAParameters key); Debug.Assert(localRead == keyBlob.Length); return(key); } else { DSAKeyFormatHelper.ReadEncryptedPkcs8( keyBlob, ExportPassword, out int localRead, out DSAParameters key); Debug.Assert(localRead == keyBlob.Length); return(key); } } finally { CryptographicOperations.ZeroMemory(keyBlob); } }
public override unsafe void ImportSubjectPublicKeyInfo( ReadOnlySpan <byte> source, out int bytesRead) { fixed(byte *ptr = &MemoryMarshal.GetReference(source)) { using (MemoryManager <byte> manager = new PointerMemoryManager <byte>(ptr, source.Length)) { // Validate the DER value and get the number of bytes. DSAKeyFormatHelper.ReadSubjectPublicKeyInfo( manager.Memory, out int localRead); SafeSecKeyRefHandle publicKey = Interop.AppleCrypto.ImportEphemeralKey(source.Slice(0, localRead), false); SetKey(SecKeyPair.PublicOnly(publicKey)); bytesRead = localRead; } } }