summaryrefslogtreecommitdiff
path: root/src/common
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2008-12-18 05:28:27 +0000
committerNick Mathewson <nickm@torproject.org>2008-12-18 05:28:27 +0000
commitcebdf93949c4dc203aca700705dc4032917db96c (patch)
treecf2c2e635728fe1d69cd9d8868542820f5f0de40 /src/common
parent7b5be147ee8ddbbddf866cb94600fde65f12f621 (diff)
downloadtor-cebdf93949c4dc203aca700705dc4032917db96c.tar.gz
tor-cebdf93949c4dc203aca700705dc4032917db96c.zip
Fix bug 889: share deep-copied keys between threads to avoid races in reference counts. Bugfix on 0.1.0.1-rc.
svn:r17672
Diffstat (limited to 'src/common')
-rw-r--r--src/common/crypto.c17
-rw-r--r--src/common/crypto.h1
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,