internal unsafe int ImportSubjectPublicKeyInfo( ReadOnlySpan <byte> source, out int bytesRead) { ThrowIfDisposed(); 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. EccKeyFormatHelper.ReadSubjectPublicKeyInfo( manager.Memory, out int localRead); SafeSecKeyRefHandle publicKey = Interop.AppleCrypto.ImportEphemeralKey(source.Slice(0, localRead), false); SecKeyPair newKeys = SecKeyPair.PublicOnly(publicKey); int size = GetKeySize(newKeys); SetKey(newKeys); bytesRead = localRead; return(size); } } }
internal ECParameters ExportParameters(bool includePrivateParameters, int keySizeInBits) { // 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 = GetOrGenerateKeys(keySizeInBits); 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) { EccKeyFormatHelper.ReadSubjectPublicKeyInfo( keyBlob, out int localRead, out ECParameters key); return(key); } else { EccKeyFormatHelper.ReadEncryptedPkcs8( keyBlob, ExportPassword, out int localRead, out ECParameters key); return(key); } } finally { CryptographicOperations.ZeroMemory(keyBlob); } }
private static ECParameters ExportParametersFromLegacyKey(SecKeyPair keys, 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 = "******"; byte[] keyBlob = Interop.AppleCrypto.SecKeyExport( includePrivateParameters ? keys.PrivateKey : keys.PublicKey, exportPrivate: includePrivateParameters, password: ExportPassword); try { if (!includePrivateParameters) { EccKeyFormatHelper.ReadSubjectPublicKeyInfo( keyBlob, out int localRead, out ECParameters key); return(key); } else { EccKeyFormatHelper.ReadEncryptedPkcs8( keyBlob, ExportPassword, out int localRead, out ECParameters key); return(key); } } finally { CryptographicOperations.ZeroMemory(keyBlob); } }