diff options
| author | Cody P Schafer <[email protected]> | 2016-01-19 21:48:44 -0500 |
|---|---|---|
| committer | Cody P Schafer <[email protected]> | 2016-01-19 22:04:51 -0500 |
| commit | 3c51f159a7f16c95061f51355536a66f77c6c63c (patch) | |
| tree | 6f35b4465f3cc241ee550aef8399223f4e126d1d /openssl | |
| parent | Fix should_panic check (diff) | |
| download | rust-openssl-3c51f159a7f16c95061f51355536a66f77c6c63c.tar.xz rust-openssl-3c51f159a7f16c95061f51355536a66f77c6c63c.zip | |
crypto/pkey: impl Clone for PKey using openssl's ref counting
Diffstat (limited to 'openssl')
| -rw-r--r-- | openssl/src/c_helpers.c | 4 | ||||
| -rw-r--r-- | openssl/src/crypto/pkey.rs | 14 |
2 files changed, 18 insertions, 0 deletions
diff --git a/openssl/src/c_helpers.c b/openssl/src/c_helpers.c index 402c36ec..dfbfbf81 100644 --- a/openssl/src/c_helpers.c +++ b/openssl/src/c_helpers.c @@ -7,3 +7,7 @@ void rust_SSL_clone(SSL *ssl) { void rust_SSL_CTX_clone(SSL_CTX *ctx) { CRYPTO_add(&ctx->references,1,CRYPTO_LOCK_SSL_CTX); } + +void rust_EVP_PKEY_clone(EVP_PKEY *pkey) { + CRYPTO_add(&pkey->references,1,CRYPTO_LOCK_EVP_PKEY); +} diff --git a/openssl/src/crypto/pkey.rs b/openssl/src/crypto/pkey.rs index 9d653c13..934a93ed 100644 --- a/openssl/src/crypto/pkey.rs +++ b/openssl/src/crypto/pkey.rs @@ -52,6 +52,10 @@ fn openssl_hash_nid(hash: HashType) -> c_int { } } +extern "C" { + fn rust_EVP_PKEY_clone(pkey: *mut ffi::EVP_PKEY); +} + pub struct PKey { evp: *mut ffi::EVP_PKEY, parts: Parts, @@ -600,6 +604,16 @@ impl Drop for PKey { } } +impl Clone for PKey { + fn clone(&self) -> Self { + unsafe { + rust_EVP_PKEY_clone(self.evp); + } + + PKey::from_handle(self.evp, self.parts) + } +} + #[cfg(test)] mod tests { use std::path::Path; |