internal ECParameters ExportParameters(bool includePrivateParameters, int keySizeInBIts)
        {
            SecKeyPair keys = GetOrGenerateKeys(keySizeInBIts);

            SafeSecKeyRefHandle keyHandle = includePrivateParameters ? keys.PrivateKey : keys.PublicKey;

            if (keyHandle == null)
            {
                throw new CryptographicException(SR.Cryptography_OpenInvalidHandle);
            }

            DerSequenceReader keyReader  = Interop.AppleCrypto.SecKeyExport(keyHandle, includePrivateParameters);
            ECParameters      parameters = new ECParameters();

            if (includePrivateParameters)
            {
                keyReader.ReadPkcs8Blob(ref parameters);
            }
            else
            {
                keyReader.ReadSubjectPublicKeyInfo(ref parameters);
            }

            int size = AsymmetricAlgorithmHelpers.BitsToBytes(keySizeInBIts);

            KeyBlobHelpers.PadOrTrim(ref parameters.Q.X, size);
            KeyBlobHelpers.PadOrTrim(ref parameters.Q.Y, size);

            if (includePrivateParameters)
            {
                KeyBlobHelpers.PadOrTrim(ref parameters.D, size);
            }

            return(parameters);
        }
示例#2
0
            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);
            }
示例#3
0
            public override DSAParameters ExportParameters(bool includePrivateParameters)
            {
                SecKeyPair keys = GetKeys();

                if (keys.PublicKey == null ||
                    (includePrivateParameters && keys.PrivateKey == null))
                {
                    throw new CryptographicException(SR.Cryptography_OpenInvalidHandle);
                }

                DSAParameters parameters = new DSAParameters();

                DerSequenceReader publicKeyReader =
                    Interop.AppleCrypto.SecKeyExport(keys.PublicKey, exportPrivate: false);

                publicKeyReader.ReadSubjectPublicKeyInfo(ref parameters);

                if (includePrivateParameters)
                {
                    DerSequenceReader privateKeyReader =
                        Interop.AppleCrypto.SecKeyExport(keys.PrivateKey, exportPrivate: true);

                    privateKeyReader.ReadPkcs8Blob(ref parameters);
                }

                KeyBlobHelpers.TrimPaddingByte(ref parameters.P);
                KeyBlobHelpers.TrimPaddingByte(ref parameters.Q);

                KeyBlobHelpers.PadOrTrim(ref parameters.G, parameters.P.Length);
                KeyBlobHelpers.PadOrTrim(ref parameters.Y, parameters.P.Length);

                if (includePrivateParameters)
                {
                    KeyBlobHelpers.PadOrTrim(ref parameters.X, parameters.Q.Length);
                }

                return(parameters);
            }