diff options
Diffstat (limited to 'src/common')
-rw-r--r-- | src/common/crypto.c | 17 | ||||
-rw-r--r-- | src/common/crypto.h | 1 |
2 files changed, 18 insertions, 0 deletions
diff --git a/src/common/crypto.c b/src/common/crypto.c index f7874844d6..f35620a7a6 100644 --- a/src/common/crypto.c +++ b/src/common/crypto.c @@ -672,6 +672,23 @@ crypto_pk_dup_key(crypto_pk_env_t *env) return env; } +/** Make a real honest-to-goodness copy of <b>env</b>, and return it. */ +crypto_pk_env_t * +crypto_pk_copy_full(crypto_pk_env_t *env) +{ + RSA *new_key; + tor_assert(env); + tor_assert(env->key); + + if (PRIVATE_KEY_OK(env)) { + new_key = RSAPrivateKey_dup(env->key); + } else { + new_key = RSAPublicKey_dup(env->key); + } + + return _crypto_new_pk_env_rsa(new_key); +} + /** Encrypt <b>fromlen</b> bytes from <b>from</b> with the public key * in <b>env</b>, using the padding method <b>padding</b>. On success, * write the result to <b>to</b>, and return the number of bytes diff --git a/src/common/crypto.h b/src/common/crypto.h index a0ddd3da20..86dfa88076 100644 --- a/src/common/crypto.h +++ b/src/common/crypto.h @@ -92,6 +92,7 @@ int crypto_pk_check_key(crypto_pk_env_t *env); int crypto_pk_cmp_keys(crypto_pk_env_t *a, crypto_pk_env_t *b); size_t crypto_pk_keysize(crypto_pk_env_t *env); crypto_pk_env_t *crypto_pk_dup_key(crypto_pk_env_t *orig); +crypto_pk_env_t *crypto_pk_copy_full(crypto_pk_env_t *orig); int crypto_pk_key_is_private(const crypto_pk_env_t *key); int crypto_pk_public_encrypt(crypto_pk_env_t *env, char *to, |