summaryrefslogtreecommitdiffstats
path: root/PICA_client.c
diff options
context:
space:
mode:
Diffstat (limited to 'PICA_client.c')
-rw-r--r--PICA_client.c70
1 files changed, 39 insertions, 31 deletions
diff --git a/PICA_client.c b/PICA_client.c
index 9f25e0c..4083de7 100644
--- a/PICA_client.c
+++ b/PICA_client.c
@@ -319,29 +319,52 @@ static int c2c_stage3_starttls(struct PICA_c2c *chnl)
return PICA_OK;
}
-static int c2c_verify_peer_cert(struct PICA_c2c *chnl)
+static int verify_peer_cert_common(X509 **peer_cert, SSL *ssl, const unsigned char *peer_id)
{
- chnl->peer_cert = SSL_get_peer_certificate(chnl->ssl);
+ unsigned char idbuf[PICA_ID_SIZE];
+ EVP_PKEY *pubkey;
+ RSA *rsa;
+
+ *peer_cert = SSL_get_peer_certificate(ssl);
+
+ if (!*peer_cert)
+ return PICA_ERRNOPEERCERT;
+
+ pubkey = (*peer_cert)->cert_info->key->pkey;
+
+ if (!pubkey)
+ return PICA_ERRNOPEERCERT;
+
+ rsa = EVP_PKEY_get1_RSA(pubkey);
+
+ if (!rsa || !rsa->n || BN_num_bits(rsa->n) < PICA_RSA_MINKEYSIZE)
+ return PICA_ERRNOPEERCERT;
- if (!chnl->peer_cert)
+ fprintf(stderr, "rsa key bits: %d\n", BN_num_bits(rsa->n));
+
+ RSA_free(rsa);
+
+ if (PICA_id_from_X509(*peer_cert, idbuf) == 0)
{
return PICA_ERRNOPEERCERT;
}
+ if (memcmp(idbuf, peer_id, PICA_ID_SIZE) != 0)
{
- unsigned char temp_id[PICA_ID_SIZE];
+ return PICA_ERRINVPEERCERT;
+ }
- if (PICA_id_from_X509(chnl->peer_cert, temp_id) == 0)
- {
- return PICA_ERRNOPEERCERT;
- }
+ return PICA_OK;
+}
- if (memcmp(temp_id, chnl->peer_id, PICA_ID_SIZE) != 0)
- {
- return PICA_ERRINVPEERCERT;
- }
- }
+static int c2c_verify_peer_cert(struct PICA_c2c *chnl)
+{
+ int ret;
+
+ ret = verify_peer_cert_common(&chnl->peer_cert, chnl->ssl, chnl->peer_id);
+ if (ret != PICA_OK)
+ return ret;
{
BIO *mem = BIO_new(BIO_s_mem());
@@ -2006,27 +2029,12 @@ static struct PICA_c2c * find_matching_c2c(struct PICA_c2n *c2n, struct PICA_dir
return NULL;
}
+
+
static int directc2c_verify_peer_cert(struct PICA_directc2c *d, struct PICA_c2c *c2c)
{
PICA_TRACEFUNC
- unsigned char idbuf[PICA_ID_SIZE];
-
- d->peer_cert = SSL_get_peer_certificate(d->ssl);
-
- if (!d->peer_cert)
- return PICA_ERRNOPEERCERT;
-
- if (PICA_id_from_X509(d->peer_cert, idbuf) == 0)
- {
- return PICA_ERRNOPEERCERT;
- }
-
- if (memcmp(idbuf, c2c->peer_id, PICA_ID_SIZE) != 0)
- {
- return PICA_ERRINVPEERCERT;
- }
-
- return PICA_OK;
+ return verify_peer_cert_common(&d->peer_cert, d->ssl, c2c->peer_id);
}
static void process_directc2c(struct PICA_c2n *c2n, fd_set *rfds, fd_set *wfds)