/// <summary> /// Create another instance of SafeEvpPKeyHandle which has an independent lifetime /// from this instance, but tracks the same resource. /// </summary> /// <returns>An equivalent SafeEvpPKeyHandle with a different lifetime</returns> public SafeEvpPKeyHandle DuplicateHandle() { if (IsInvalid) throw new InvalidOperationException(SR.Cryptography_OpenInvalidHandle); // 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(this); // 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); return safeHandle; }
/// <summary> /// Create another instance of SafeEvpPKeyHandle which has an independent lifetime /// from this instance, but tracks the same resource. /// </summary> /// <returns>An equivalent SafeEvpPKeyHandle with a different lifetime</returns> public SafeEvpPKeyHandle DuplicateHandle() { if (IsInvalid) throw new InvalidOperationException(SR.Cryptography_OpenInvalidHandle); // 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(this); // 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.Crypto.CreateOpenSslCryptographicException(); } // Since we didn't actually create a new handle, copy the handle // to the new SafeHandle. safeHandle.SetHandle(handle); return safeHandle; }
/// <summary> /// Create another instance of SafeEvpPKeyHandle which has an independent lifetime /// from this instance, but tracks the same resource. /// </summary> /// <returns>An equivalent SafeEvpPKeyHandle with a different lifetime</returns> public SafeEvpPKeyHandle DuplicateHandle() { if (IsInvalid) { throw new InvalidOperationException(SR.Cryptography_OpenInvalidHandle); } // 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 success = Interop.Crypto.UpRefEvpPkey(this); if (success != 1) { Debug.Fail("Called UpRefEvpPkey on a key which was already marked for destruction"); Exception e = Interop.Crypto.CreateOpenSslCryptographicException(); safeHandle.Dispose(); throw e; } // Since we didn't actually create a new handle, copy the handle // to the new SafeHandle. safeHandle.SetHandle(handle); return(safeHandle); }