aboutsummaryrefslogtreecommitdiff
path: root/openssl
diff options
context:
space:
mode:
authorCody P Schafer <[email protected]>2016-01-19 21:48:44 -0500
committerCody P Schafer <[email protected]>2016-01-19 22:04:51 -0500
commit3c51f159a7f16c95061f51355536a66f77c6c63c (patch)
tree6f35b4465f3cc241ee550aef8399223f4e126d1d /openssl
parentFix should_panic check (diff)
downloadrust-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.c4
-rw-r--r--openssl/src/crypto/pkey.rs14
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;