summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjsing <>2019-03-25 16:24:57 +0000
committerjsing <>2019-03-25 16:24:57 +0000
commit491a1b9b73d1852fd706b6845c3635f5bd3d3834 (patch)
tree13375f607f621c75e951e8c9dfb3c880fd5fb6e6
parented1f555802549862bf6249547c85f53ce8b3cd41 (diff)
downloadopenbsd-491a1b9b73d1852fd706b6845c3635f5bd3d3834.tar.gz
openbsd-491a1b9b73d1852fd706b6845c3635f5bd3d3834.tar.bz2
openbsd-491a1b9b73d1852fd706b6845c3635f5bd3d3834.zip
Add a chain member to CERT_PKEY and provide functions for manipulating it.
Note that this is not the full chain, as the leaf certificate currently remains in the x509 member of CERT_PKEY. Unfortunately we've got to contend with the fact that some OpenSSL *_chain_* APIs exclude the leaf certificate while others include it... ok beck@ tb@
-rw-r--r--src/lib/libssl/ssl_cert.c68
-rw-r--r--src/lib/libssl/ssl_locl.h9
2 files changed, 74 insertions, 3 deletions
diff --git a/src/lib/libssl/ssl_cert.c b/src/lib/libssl/ssl_cert.c
index 313ff3ae5c..ab76939116 100644
--- a/src/lib/libssl/ssl_cert.c
+++ b/src/lib/libssl/ssl_cert.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_cert.c,v 1.72 2018/11/19 14:42:01 jsing Exp $ */ 1/* $OpenBSD: ssl_cert.c,v 1.73 2019/03/25 16:24:57 jsing Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -275,6 +275,12 @@ ssl_cert_dup(CERT *cert)
275 SSLerrorx(SSL_R_LIBRARY_BUG); 275 SSLerrorx(SSL_R_LIBRARY_BUG);
276 } 276 }
277 } 277 }
278
279 if (cert->pkeys[i].chain != NULL) {
280 if ((ret->pkeys[i].chain =
281 X509_chain_up_ref(cert->pkeys[i].chain)) == NULL)
282 goto err;
283 }
278 } 284 }
279 285
280 /* 286 /*
@@ -291,12 +297,13 @@ ssl_cert_dup(CERT *cert)
291 297
292 return (ret); 298 return (ret);
293 299
294err: 300 err:
295 DH_free(ret->dh_tmp); 301 DH_free(ret->dh_tmp);
296 302
297 for (i = 0; i < SSL_PKEY_NUM; i++) { 303 for (i = 0; i < SSL_PKEY_NUM; i++) {
298 X509_free(ret->pkeys[i].x509); 304 X509_free(ret->pkeys[i].x509);
299 EVP_PKEY_free(ret->pkeys[i].privatekey); 305 EVP_PKEY_free(ret->pkeys[i].privatekey);
306 sk_X509_pop_free(ret->pkeys[i].chain, X509_free);
300 } 307 }
301 free (ret); 308 free (ret);
302 return NULL; 309 return NULL;
@@ -320,11 +327,68 @@ ssl_cert_free(CERT *c)
320 for (i = 0; i < SSL_PKEY_NUM; i++) { 327 for (i = 0; i < SSL_PKEY_NUM; i++) {
321 X509_free(c->pkeys[i].x509); 328 X509_free(c->pkeys[i].x509);
322 EVP_PKEY_free(c->pkeys[i].privatekey); 329 EVP_PKEY_free(c->pkeys[i].privatekey);
330 sk_X509_pop_free(c->pkeys[i].chain, X509_free);
323 } 331 }
324 332
325 free(c); 333 free(c);
326} 334}
327 335
336int
337ssl_cert_set0_chain(CERT *c, STACK_OF(X509) *chain)
338{
339 if (c->key == NULL)
340 return 0;
341
342 sk_X509_pop_free(c->key->chain, X509_free);
343 c->key->chain = chain;
344
345 return 1;
346}
347
348int
349ssl_cert_set1_chain(CERT *c, STACK_OF(X509) *chain)
350{
351 STACK_OF(X509) *new_chain = NULL;
352
353 if (chain != NULL) {
354 if ((new_chain = X509_chain_up_ref(chain)) == NULL)
355 return 0;
356 }
357 if (!ssl_cert_set0_chain(c, new_chain)) {
358 sk_X509_pop_free(new_chain, X509_free);
359 return 0;
360 }
361
362 return 1;
363}
364
365int
366ssl_cert_add0_chain_cert(CERT *c, X509 *cert)
367{
368 if (c->key == NULL)
369 return 0;
370
371 if (c->key->chain == NULL) {
372 if ((c->key->chain = sk_X509_new_null()) == NULL)
373 return 0;
374 }
375 if (!sk_X509_push(c->key->chain, cert))
376 return 0;
377
378 return 1;
379}
380
381int
382ssl_cert_add1_chain_cert(CERT *c, X509 *cert)
383{
384 if (!ssl_cert_add0_chain_cert(c, cert))
385 return 0;
386
387 X509_up_ref(cert);
388
389 return 1;
390}
391
328SESS_CERT * 392SESS_CERT *
329ssl_sess_cert_new(void) 393ssl_sess_cert_new(void)
330{ 394{
diff --git a/src/lib/libssl/ssl_locl.h b/src/lib/libssl/ssl_locl.h
index 82674121b4..509183a7fa 100644
--- a/src/lib/libssl/ssl_locl.h
+++ b/src/lib/libssl/ssl_locl.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_locl.h,v 1.238 2019/02/25 19:40:05 tb Exp $ */ 1/* $OpenBSD: ssl_locl.h,v 1.239 2019/03/25 16:24:57 jsing Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -961,6 +961,7 @@ typedef struct dtls1_state_internal_st {
961typedef struct cert_pkey_st { 961typedef struct cert_pkey_st {
962 X509 *x509; 962 X509 *x509;
963 EVP_PKEY *privatekey; 963 EVP_PKEY *privatekey;
964 STACK_OF(X509) *chain;
964 /* sigalg to use when signing */ 965 /* sigalg to use when signing */
965 const struct ssl_sigalg *sigalg; 966 const struct ssl_sigalg *sigalg;
966} CERT_PKEY; 967} CERT_PKEY;
@@ -1081,9 +1082,15 @@ void ssl_clear_cipher_state(SSL *s);
1081void ssl_clear_cipher_read_state(SSL *s); 1082void ssl_clear_cipher_read_state(SSL *s);
1082void ssl_clear_cipher_write_state(SSL *s); 1083void ssl_clear_cipher_write_state(SSL *s);
1083int ssl_clear_bad_session(SSL *s); 1084int ssl_clear_bad_session(SSL *s);
1085
1084CERT *ssl_cert_new(void); 1086CERT *ssl_cert_new(void);
1085CERT *ssl_cert_dup(CERT *cert); 1087CERT *ssl_cert_dup(CERT *cert);
1086void ssl_cert_free(CERT *c); 1088void ssl_cert_free(CERT *c);
1089int ssl_cert_set0_chain(CERT *c, STACK_OF(X509) *chain);
1090int ssl_cert_set1_chain(CERT *c, STACK_OF(X509) *chain);
1091int ssl_cert_add0_chain_cert(CERT *c, X509 *cert);
1092int ssl_cert_add1_chain_cert(CERT *c, X509 *cert);
1093
1087SESS_CERT *ssl_sess_cert_new(void); 1094SESS_CERT *ssl_sess_cert_new(void);
1088void ssl_sess_cert_free(SESS_CERT *sc); 1095void ssl_sess_cert_free(SESS_CERT *sc);
1089int ssl_get_new_session(SSL *s, int session); 1096int ssl_get_new_session(SSL *s, int session);