summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2011-09-22 10:18:17 -0400
committerNick Mathewson <nickm@torproject.org>2011-10-10 23:14:16 -0400
commit0a4f56277290d4736db3b15dc4c2071000f7883f (patch)
tree7bede05aa8fdd15409cc9e0eab27bba8ad2d4026 /src
parent92602345e001d8e66038d5d98cbb21eea5ef40c9 (diff)
downloadtor-0a4f56277290d4736db3b15dc4c2071000f7883f.tar.gz
tor-0a4f56277290d4736db3b15dc4c2071000f7883f.zip
Functions to get a public RSA key from a cert
Diffstat (limited to 'src')
-rw-r--r--src/common/tortls.c34
-rw-r--r--src/common/tortls.h2
2 files changed, 36 insertions, 0 deletions
diff --git a/src/common/tortls.c b/src/common/tortls.c
index 332d78465a..5d36fd04a6 100644
--- a/src/common/tortls.c
+++ b/src/common/tortls.c
@@ -838,6 +838,40 @@ tor_tls_get_my_certs(int server,
return 0;
}
+/**
+ * Return the authentication key that we use to authenticate ourselves as a
+ * client in the V3 in-protocol handshake.
+ */
+crypto_pk_env_t *
+tor_tls_get_my_client_auth_key(void)
+{
+ if (! client_tls_context)
+ return NULL;
+ return client_tls_context->auth_key;
+}
+
+/**
+ * Return the public key that a cetificate certifies. Return NULL if the
+ * cert's key is not RSA.
+ */
+crypto_pk_env_t *
+tor_tls_cert_get_key(tor_cert_t *cert)
+{
+ crypto_pk_env_t *result = NULL;
+ EVP_PKEY *pkey = X509_get_pubkey(cert->cert);
+ RSA *rsa;
+ if (!pkey)
+ return NULL;
+ rsa = EVP_PKEY_get1_RSA(pkey);
+ if (!rsa) {
+ EVP_PKEY_free(pkey);
+ return NULL;
+ }
+ result = _crypto_new_pk_env_rsa(rsa);
+ EVP_PKEY_free(pkey);
+ return result;
+}
+
/** Return true iff <b>a</b> and <b>b</b> represent the same public key. */
static int
pkey_eq(EVP_PKEY *a, EVP_PKEY *b)
diff --git a/src/common/tortls.h b/src/common/tortls.h
index 70d24a5303..b522dd112a 100644
--- a/src/common/tortls.h
+++ b/src/common/tortls.h
@@ -118,6 +118,8 @@ const digests_t *tor_cert_get_cert_digests(const tor_cert_t *cert);
int tor_tls_get_my_certs(int server,
const tor_cert_t **link_cert_out,
const tor_cert_t **id_cert_out);
+crypto_pk_env_t *tor_tls_get_my_client_auth_key(void);
+crypto_pk_env_t *tor_tls_cert_get_key(tor_cert_t *cert);
int tor_tls_cert_matches_key(const tor_tls_t *tls, const tor_cert_t *cert);
int tor_tls_cert_is_valid(const tor_cert_t *cert,
const tor_cert_t *signing_cert);