public void Dispose() { if (_caStackHandle != null) { _caStackHandle.Dispose(); _caStackHandle = null; } if (_x509Handle != null) { _x509Handle.Dispose(); _x509Handle = null; } if (_evpPkeyHandle != null) { _evpPkeyHandle.Dispose(); _evpPkeyHandle = null; } if (_pkcs12Handle != null) { _pkcs12Handle.Dispose(); } }
internal static extern SafePkcs12Handle PKCS12_create( string pass, string name, SafeEvpPkeyHandle pkey, SafeX509Handle cert, SafeX509StackHandle ca, int nid_key, int nid_cert, int iter, int mac_iter, int keytype);
internal static SafeEvpPkeyHandle DuplicateHandle(SafeEvpPkeyHandle handle) { Debug.Assert(handle != null && !handle.IsInvalid); // Reliability: Allocate the SafeHandle before calling UpRefEvpPkey so // that we don't lose a tracked reference in low-memory situations. SafeEvpPkeyHandle safeHandle = new SafeEvpPkeyHandle(); int newRefCount = Interop.NativeCrypto.UpRefEvpPkey(handle); // UpRefEvpPkey returns the number of references to this key, if it's less than 2 // (the incoming handle, and this one) then someone has already Disposed() this key // into non-existence. if (newRefCount < 2) { Debug.Fail("Called UpRefEvpPkey on a key which was already marked for destruction"); throw Interop.libcrypto.CreateOpenSslCryptographicException(); } // Since we didn't actually create a new handle, copy the handle // to the new SafeHandle. safeHandle.SetHandle(handle.DangerousGetHandle()); return safeHandle; }
internal static SafeEvpPkeyHandle DuplicateHandle(SafeEvpPkeyHandle handle) { Debug.Assert(handle != null && !handle.IsInvalid); // Reliability: Allocate the SafeHandle before calling UpRefEvpPkey so // that we don't lose a tracked reference in low-memory situations. SafeEvpPkeyHandle safeHandle = new SafeEvpPkeyHandle(); int newRefCount = Interop.Crypto.UpRefEvpPkey(handle); // UpRefEvpPkey returns the number of references to this key, if it's less than 2 // (the incoming handle, and this one) then someone has already Disposed() this key // into non-existence. if (newRefCount < 2) { Debug.Fail("Called UpRefEvpPkey on a key which was already marked for destruction"); throw Interop.libcrypto.CreateOpenSslCryptographicException(); } // Since we didn't actually create a new handle, copy the handle // to the new SafeHandle. safeHandle.SetHandle(handle.DangerousGetHandle()); return(safeHandle); }
public void Dispose() { if (_privateKey != null) { _privateKey.Dispose(); _privateKey = null; } if (_cert != null) { _cert.Dispose(); _cert = null; } }
internal void SetPrivateKey(SafeEvpPkeyHandle privateKey) { _privateKey = privateKey; }
public List<OpenSslX509CertificateReader> ReadCertificates() { var certs = new List<OpenSslX509CertificateReader>(); if (_caStackHandle != null && !_caStackHandle.IsInvalid) { int caCertCount = Interop.Crypto.GetX509StackFieldCount(_caStackHandle); for (int i = 0; i < caCertCount; i++) { IntPtr certPtr = Interop.Crypto.GetX509StackField(_caStackHandle, i); if (certPtr != IntPtr.Zero) { // The STACK_OF(X509) still needs to be cleaned up, so duplicate the handle out of it. certs.Add(new OpenSslX509CertificateReader(Interop.libcrypto.X509_dup(certPtr))); } } } if (_x509Handle != null && !_x509Handle.IsInvalid) { // The certificate and (if applicable) private key handles will be given over // to the OpenSslX509CertificateReader, and the fields here are thus nulled out to // prevent double-Dispose. OpenSslX509CertificateReader reader = new OpenSslX509CertificateReader(_x509Handle); _x509Handle = null; if (_evpPkeyHandle != null && !_evpPkeyHandle.IsInvalid) { reader.SetPrivateKey(_evpPkeyHandle); _evpPkeyHandle = null; } certs.Add(reader); } return certs; }
internal static extern bool PKCS12_parse(SafePkcs12Handle p12, string pass, out SafeEvpPkeyHandle pkey, out SafeX509Handle cert, out SafeX509StackHandle ca);
internal static extern SafeEcKeyHandle EVP_PKEY_get1_EC_KEY(SafeEvpPkeyHandle pkey);
internal static extern SafeRsaHandle EVP_PKEY_get1_RSA(SafeEvpPkeyHandle pkey);