summaryrefslogtreecommitdiff
path: root/src/lib/libssl/s3_lib.c
diff options
context:
space:
mode:
authorjsing <>2019-04-04 15:03:21 +0000
committerjsing <>2019-04-04 15:03:21 +0000
commitef18f5fcfa9cf3eeefcc89685bead61b8239028f (patch)
tree3b602635dbbb5b70f50030b6207d774c40c1b7b8 /src/lib/libssl/s3_lib.c
parent3b50812b7511c2b9b68aa78ee812e5eb6939a3d5 (diff)
downloadopenbsd-ef18f5fcfa9cf3eeefcc89685bead61b8239028f.tar.gz
openbsd-ef18f5fcfa9cf3eeefcc89685bead61b8239028f.tar.bz2
openbsd-ef18f5fcfa9cf3eeefcc89685bead61b8239028f.zip
Provide SSL chain/cert chain APIs.
These allow for chains to be managed on a per-certificate basis rather than as a single "extra certificates" list. Note that "chain" in this context does not actually include the leaf certificate however, unlike SSL_CTX_use_certificate_chain_{file,mem}(). Thanks to sthen@ for running this through a bulk ports build. ok beck@ tb@
Diffstat (limited to 'src/lib/libssl/s3_lib.c')
-rw-r--r--src/lib/libssl/s3_lib.c114
1 files changed, 113 insertions, 1 deletions
diff --git a/src/lib/libssl/s3_lib.c b/src/lib/libssl/s3_lib.c
index 49f402d065..0357a70ca3 100644
--- a/src/lib/libssl/s3_lib.c
+++ b/src/lib/libssl/s3_lib.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: s3_lib.c,v 1.185 2019/03/25 17:21:18 jsing Exp $ */ 1/* $OpenBSD: s3_lib.c,v 1.186 2019/04/04 15:03:21 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 *
@@ -1876,6 +1876,47 @@ _SSL_set_tlsext_status_ocsp_resp(SSL *s, unsigned char *resp, int resp_len)
1876} 1876}
1877 1877
1878int 1878int
1879SSL_set0_chain(SSL *ssl, STACK_OF(X509) *chain)
1880{
1881 return ssl_cert_set0_chain(ssl->cert, chain);
1882}
1883
1884int
1885SSL_set1_chain(SSL *ssl, STACK_OF(X509) *chain)
1886{
1887 return ssl_cert_set1_chain(ssl->cert, chain);
1888}
1889
1890int
1891SSL_add0_chain_cert(SSL *ssl, X509 *x509)
1892{
1893 return ssl_cert_add0_chain_cert(ssl->cert, x509);
1894}
1895
1896int
1897SSL_add1_chain_cert(SSL *ssl, X509 *x509)
1898{
1899 return ssl_cert_add1_chain_cert(ssl->cert, x509);
1900}
1901
1902int
1903SSL_get0_chain_certs(const SSL *ssl, STACK_OF(X509) **out_chain)
1904{
1905 *out_chain = NULL;
1906
1907 if (ssl->cert->key != NULL)
1908 *out_chain = ssl->cert->key->chain;
1909
1910 return 1;
1911}
1912
1913int
1914SSL_clear_chain_certs(SSL *ssl)
1915{
1916 return ssl_cert_set0_chain(ssl->cert, NULL);
1917}
1918
1919int
1879SSL_set1_groups(SSL *s, const int *groups, size_t groups_len) 1920SSL_set1_groups(SSL *s, const int *groups, size_t groups_len)
1880{ 1921{
1881 return tls1_set_groups(&s->internal->tlsext_supportedgroups, 1922 return tls1_set_groups(&s->internal->tlsext_supportedgroups,
@@ -1956,6 +1997,21 @@ ssl3_ctrl(SSL *s, int cmd, long larg, void *parg)
1956 case SSL_CTRL_SET_TLSEXT_STATUS_REQ_OCSP_RESP: 1997 case SSL_CTRL_SET_TLSEXT_STATUS_REQ_OCSP_RESP:
1957 return _SSL_set_tlsext_status_ocsp_resp(s, parg, larg); 1998 return _SSL_set_tlsext_status_ocsp_resp(s, parg, larg);
1958 1999
2000 case SSL_CTRL_CHAIN:
2001 if (larg == 0)
2002 return SSL_set0_chain(s, (STACK_OF(X509) *)parg);
2003 else
2004 return SSL_set1_chain(s, (STACK_OF(X509) *)parg);
2005
2006 case SSL_CTRL_CHAIN_CERT:
2007 if (larg == 0)
2008 return SSL_add0_chain_cert(s, (X509 *)parg);
2009 else
2010 return SSL_add1_chain_cert(s, (X509 *)parg);
2011
2012 case SSL_CTRL_GET_CHAIN_CERTS:
2013 return SSL_get0_chain_certs(s, (STACK_OF(X509) **)parg);
2014
1959 case SSL_CTRL_SET_GROUPS: 2015 case SSL_CTRL_SET_GROUPS:
1960 return SSL_set1_groups(s, parg, larg); 2016 return SSL_set1_groups(s, parg, larg);
1961 2017
@@ -2127,6 +2183,47 @@ _SSL_CTX_set_tlsext_status_arg(SSL_CTX *ctx, void *arg)
2127 return 1; 2183 return 1;
2128} 2184}
2129 2185
2186int
2187SSL_CTX_set0_chain(SSL_CTX *ctx, STACK_OF(X509) *chain)
2188{
2189 return ssl_cert_set0_chain(ctx->internal->cert, chain);
2190}
2191
2192int
2193SSL_CTX_set1_chain(SSL_CTX *ctx, STACK_OF(X509) *chain)
2194{
2195 return ssl_cert_set1_chain(ctx->internal->cert, chain);
2196}
2197
2198int
2199SSL_CTX_add0_chain_cert(SSL_CTX *ctx, X509 *x509)
2200{
2201 return ssl_cert_add0_chain_cert(ctx->internal->cert, x509);
2202}
2203
2204int
2205SSL_CTX_add1_chain_cert(SSL_CTX *ctx, X509 *x509)
2206{
2207 return ssl_cert_add1_chain_cert(ctx->internal->cert, x509);
2208}
2209
2210int
2211SSL_CTX_get0_chain_certs(const SSL_CTX *ctx, STACK_OF(X509) **out_chain)
2212{
2213 *out_chain = NULL;
2214
2215 if (ctx->internal->cert->key != NULL)
2216 *out_chain = ctx->internal->cert->key->chain;
2217
2218 return 1;
2219}
2220
2221int
2222SSL_CTX_clear_chain_certs(SSL_CTX *ctx)
2223{
2224 return ssl_cert_set0_chain(ctx->internal->cert, NULL);
2225}
2226
2130static int 2227static int
2131_SSL_CTX_add_extra_chain_cert(SSL_CTX *ctx, X509 *cert) 2228_SSL_CTX_add_extra_chain_cert(SSL_CTX *ctx, X509 *cert)
2132{ 2229{
@@ -2208,6 +2305,21 @@ ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg)
2208 case SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB_ARG: 2305 case SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB_ARG:
2209 return _SSL_CTX_set_tlsext_status_arg(ctx, parg); 2306 return _SSL_CTX_set_tlsext_status_arg(ctx, parg);
2210 2307
2308 case SSL_CTRL_CHAIN:
2309 if (larg == 0)
2310 return SSL_CTX_set0_chain(ctx, (STACK_OF(X509) *)parg);
2311 else
2312 return SSL_CTX_set1_chain(ctx, (STACK_OF(X509) *)parg);
2313
2314 case SSL_CTRL_CHAIN_CERT:
2315 if (larg == 0)
2316 return SSL_CTX_add0_chain_cert(ctx, (X509 *)parg);
2317 else
2318 return SSL_CTX_add1_chain_cert(ctx, (X509 *)parg);
2319
2320 case SSL_CTRL_GET_CHAIN_CERTS:
2321 return SSL_CTX_get0_chain_certs(ctx, (STACK_OF(X509) **)parg);
2322
2211 case SSL_CTRL_EXTRA_CHAIN_CERT: 2323 case SSL_CTRL_EXTRA_CHAIN_CERT:
2212 return _SSL_CTX_add_extra_chain_cert(ctx, parg); 2324 return _SSL_CTX_add_extra_chain_cert(ctx, parg);
2213 2325