public override RSAParameters ExportParameters(bool includePrivateParameters) { SecKeyPair keys = GetKeys(); SafeSecKeyRefHandle keyHandle = includePrivateParameters ? keys.PrivateKey : keys.PublicKey; if (keyHandle == null) { throw new CryptographicException(SR.Cryptography_OpenInvalidHandle); } DerSequenceReader keyReader = Interop.AppleCrypto.SecKeyExport(keyHandle, includePrivateParameters); RSAParameters parameters = new RSAParameters(); if (includePrivateParameters) { keyReader.ReadPkcs8Blob(ref parameters); } else { // When exporting a key handle opened from a certificate, it seems to // export as a PKCS#1 blob instead of an X509 SubjectPublicKeyInfo blob. // So, check for that. if (keyReader.PeekTag() == (byte)DerSequenceReader.DerTag.Integer) { keyReader.ReadPkcs1PublicBlob(ref parameters); } else { keyReader.ReadSubjectPublicKeyInfo(ref parameters); } } return(parameters); }
internal static void ReadSubjectPublicKeyInfo(this DerSequenceReader keyInfo, ref RSAParameters parameters) { // SubjectPublicKeyInfo::= SEQUENCE { // algorithm AlgorithmIdentifier, // subjectPublicKey BIT STRING } DerSequenceReader algorithm = keyInfo.ReadSequence(); string algorithmOid = algorithm.ReadOidAsString(); if (algorithmOid != RsaOid) { throw new CryptographicException(); } byte[] subjectPublicKeyBytes = keyInfo.ReadBitString(); DerSequenceReader subjectPublicKey = new DerSequenceReader(subjectPublicKeyBytes); subjectPublicKey.ReadPkcs1PublicBlob(ref parameters); }