summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjsing <>2019-04-04 15:03:21 +0000
committerjsing <>2019-04-04 15:03:21 +0000
commitef18f5fcfa9cf3eeefcc89685bead61b8239028f (patch)
tree3b602635dbbb5b70f50030b6207d774c40c1b7b8
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@
-rw-r--r--src/lib/libssl/Symbols.list12
-rw-r--r--src/lib/libssl/s3_lib.c114
-rw-r--r--src/lib/libssl/ssl.h37
3 files changed, 161 insertions, 2 deletions
diff --git a/src/lib/libssl/Symbols.list b/src/lib/libssl/Symbols.list
index 425d71126b..e72616a779 100644
--- a/src/lib/libssl/Symbols.list
+++ b/src/lib/libssl/Symbols.list
@@ -57,14 +57,18 @@ SSL_CIPHER_is_aead
57SSL_COMP_add_compression_method 57SSL_COMP_add_compression_method
58SSL_COMP_get_compression_methods 58SSL_COMP_get_compression_methods
59SSL_COMP_get_name 59SSL_COMP_get_name
60SSL_CTX_add0_chain_cert
61SSL_CTX_add1_chain_cert
60SSL_CTX_add_client_CA 62SSL_CTX_add_client_CA
61SSL_CTX_add_session 63SSL_CTX_add_session
62SSL_CTX_callback_ctrl 64SSL_CTX_callback_ctrl
63SSL_CTX_check_private_key 65SSL_CTX_check_private_key
66SSL_CTX_clear_chain_certs
64SSL_CTX_ctrl 67SSL_CTX_ctrl
65SSL_CTX_flush_sessions 68SSL_CTX_flush_sessions
66SSL_CTX_free 69SSL_CTX_free
67SSL_CTX_get0_certificate 70SSL_CTX_get0_certificate
71SSL_CTX_get0_chain_certs
68SSL_CTX_get0_param 72SSL_CTX_get0_param
69SSL_CTX_get_cert_store 73SSL_CTX_get_cert_store
70SSL_CTX_get_ciphers 74SSL_CTX_get_ciphers
@@ -93,6 +97,8 @@ SSL_CTX_sess_set_get_cb
93SSL_CTX_sess_set_new_cb 97SSL_CTX_sess_set_new_cb
94SSL_CTX_sess_set_remove_cb 98SSL_CTX_sess_set_remove_cb
95SSL_CTX_sessions 99SSL_CTX_sessions
100SSL_CTX_set0_chain
101SSL_CTX_set1_chain
96SSL_CTX_set1_groups 102SSL_CTX_set1_groups
97SSL_CTX_set1_groups_list 103SSL_CTX_set1_groups_list
98SSL_CTX_set1_param 104SSL_CTX_set1_param
@@ -164,6 +170,8 @@ SSL_SESSION_set_time
164SSL_SESSION_set_timeout 170SSL_SESSION_set_timeout
165SSL_SESSION_up_ref 171SSL_SESSION_up_ref
166SSL_accept 172SSL_accept
173SSL_add0_chain_cert
174SSL_add1_chain_cert
167SSL_add_client_CA 175SSL_add_client_CA
168SSL_add_dir_cert_subjects_to_stack 176SSL_add_dir_cert_subjects_to_stack
169SSL_add_file_cert_subjects_to_stack 177SSL_add_file_cert_subjects_to_stack
@@ -175,6 +183,7 @@ SSL_cache_hit
175SSL_callback_ctrl 183SSL_callback_ctrl
176SSL_check_private_key 184SSL_check_private_key
177SSL_clear 185SSL_clear
186SSL_clear_chain_certs
178SSL_connect 187SSL_connect
179SSL_copy_session_id 188SSL_copy_session_id
180SSL_ctrl 189SSL_ctrl
@@ -184,6 +193,7 @@ SSL_dup_CA_list
184SSL_export_keying_material 193SSL_export_keying_material
185SSL_free 194SSL_free
186SSL_get0_alpn_selected 195SSL_get0_alpn_selected
196SSL_get0_chain_certs
187SSL_get0_next_proto_negotiated 197SSL_get0_next_proto_negotiated
188SSL_get0_param 198SSL_get0_param
189SSL_get1_session 199SSL_get1_session
@@ -247,6 +257,8 @@ SSL_renegotiate_pending
247SSL_rstate_string 257SSL_rstate_string
248SSL_rstate_string_long 258SSL_rstate_string_long
249SSL_select_next_proto 259SSL_select_next_proto
260SSL_set0_chain
261SSL_set1_chain
250SSL_set1_groups 262SSL_set1_groups
251SSL_set1_groups_list 263SSL_set1_groups_list
252SSL_set1_host 264SSL_set1_host
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
diff --git a/src/lib/libssl/ssl.h b/src/lib/libssl/ssl.h
index 58b1be6d0d..fc89b0ef6e 100644
--- a/src/lib/libssl/ssl.h
+++ b/src/lib/libssl/ssl.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl.h,v 1.165 2019/03/17 17:28:08 jsing Exp $ */ 1/* $OpenBSD: ssl.h,v 1.166 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 *
@@ -1118,6 +1118,9 @@ int PEM_write_SSL_SESSION(FILE *fp, SSL_SESSION *x);
1118#define SSL_CTRL_GET_EXTRA_CHAIN_CERTS 82 1118#define SSL_CTRL_GET_EXTRA_CHAIN_CERTS 82
1119#define SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS 83 1119#define SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS 83
1120 1120
1121#define SSL_CTRL_CHAIN 88
1122#define SSL_CTRL_CHAIN_CERT 89
1123
1121#define SSL_CTRL_SET_GROUPS 91 1124#define SSL_CTRL_SET_GROUPS 91
1122#define SSL_CTRL_SET_GROUPS_LIST 92 1125#define SSL_CTRL_SET_GROUPS_LIST 92
1123 1126
@@ -1125,6 +1128,8 @@ int PEM_write_SSL_SESSION(FILE *fp, SSL_SESSION *x);
1125 1128
1126#define SSL_CTRL_GET_SERVER_TMP_KEY 109 1129#define SSL_CTRL_GET_SERVER_TMP_KEY 109
1127 1130
1131#define SSL_CTRL_GET_CHAIN_CERTS 115
1132
1128#define SSL_CTRL_SET_DH_AUTO 118 1133#define SSL_CTRL_SET_DH_AUTO 118
1129 1134
1130#define SSL_CTRL_SET_MIN_PROTO_VERSION 123 1135#define SSL_CTRL_SET_MIN_PROTO_VERSION 123
@@ -1174,6 +1179,20 @@ int PEM_write_SSL_SESSION(FILE *fp, SSL_SESSION *x);
1174#define SSL_set_ecdh_auto(s, onoff) \ 1179#define SSL_set_ecdh_auto(s, onoff) \
1175 SSL_ctrl(s,SSL_CTRL_SET_ECDH_AUTO,onoff,NULL) 1180 SSL_ctrl(s,SSL_CTRL_SET_ECDH_AUTO,onoff,NULL)
1176 1181
1182int SSL_CTX_set0_chain(SSL_CTX *ctx, STACK_OF(X509) *chain);
1183int SSL_CTX_set1_chain(SSL_CTX *ctx, STACK_OF(X509) *chain);
1184int SSL_CTX_add0_chain_cert(SSL_CTX *ctx, X509 *x509);
1185int SSL_CTX_add1_chain_cert(SSL_CTX *ctx, X509 *x509);
1186int SSL_CTX_get0_chain_certs(const SSL_CTX *ctx, STACK_OF(X509) **out_chain);
1187int SSL_CTX_clear_chain_certs(SSL_CTX *ctx);
1188
1189int SSL_set0_chain(SSL *ssl, STACK_OF(X509) *chain);
1190int SSL_set1_chain(SSL *ssl, STACK_OF(X509) *chain);
1191int SSL_add0_chain_cert(SSL *ssl, X509 *x509);
1192int SSL_add1_chain_cert(SSL *ssl, X509 *x509);
1193int SSL_get0_chain_certs(const SSL *ssl, STACK_OF(X509) **out_chain);
1194int SSL_clear_chain_certs(SSL *ssl);
1195
1177int SSL_CTX_set1_groups(SSL_CTX *ctx, const int *groups, size_t groups_len); 1196int SSL_CTX_set1_groups(SSL_CTX *ctx, const int *groups, size_t groups_len);
1178int SSL_CTX_set1_groups_list(SSL_CTX *ctx, const char *groups); 1197int SSL_CTX_set1_groups_list(SSL_CTX *ctx, const char *groups);
1179 1198
@@ -1215,14 +1234,30 @@ int SSL_set_max_proto_version(SSL *ssl, uint16_t version);
1215 * Also provide those functions as macros for compatibility with 1234 * Also provide those functions as macros for compatibility with
1216 * existing users. 1235 * existing users.
1217 */ 1236 */
1237#define SSL_CTX_set0_chain SSL_CTX_set0_chain
1238#define SSL_CTX_set1_chain SSL_CTX_set1_chain
1239#define SSL_CTX_add0_chain_cert SSL_CTX_add0_chain_cert
1240#define SSL_CTX_add1_chain_cert SSL_CTX_add1_chain_cert
1241#define SSL_CTX_get0_chain_certs SSL_CTX_get0_chain_certs
1242#define SSL_CTX_clear_chain_certs SSL_CTX_clear_chain_certs
1243
1244#define SSL_add0_chain_cert SSL_add0_chain_cert
1245#define SSL_add1_chain_cert SSL_add1_chain_cert
1246#define SSL_set0_chain SSL_set0_chain
1247#define SSL_set1_chain SSL_set1_chain
1248#define SSL_get0_chain_certs SSL_get0_chain_certs
1249#define SSL_clear_chain_certs SSL_clear_chain_certs
1250
1218#define SSL_CTX_set1_groups SSL_CTX_set1_groups 1251#define SSL_CTX_set1_groups SSL_CTX_set1_groups
1219#define SSL_CTX_set1_groups_list SSL_CTX_set1_groups_list 1252#define SSL_CTX_set1_groups_list SSL_CTX_set1_groups_list
1220#define SSL_set1_groups SSL_set1_groups 1253#define SSL_set1_groups SSL_set1_groups
1221#define SSL_set1_groups_list SSL_set1_groups_list 1254#define SSL_set1_groups_list SSL_set1_groups_list
1255
1222#define SSL_CTX_get_min_proto_version SSL_CTX_get_min_proto_version 1256#define SSL_CTX_get_min_proto_version SSL_CTX_get_min_proto_version
1223#define SSL_CTX_get_max_proto_version SSL_CTX_get_max_proto_version 1257#define SSL_CTX_get_max_proto_version SSL_CTX_get_max_proto_version
1224#define SSL_CTX_set_min_proto_version SSL_CTX_set_min_proto_version 1258#define SSL_CTX_set_min_proto_version SSL_CTX_set_min_proto_version
1225#define SSL_CTX_set_max_proto_version SSL_CTX_set_max_proto_version 1259#define SSL_CTX_set_max_proto_version SSL_CTX_set_max_proto_version
1260
1226#define SSL_get_min_proto_version SSL_get_min_proto_version 1261#define SSL_get_min_proto_version SSL_get_min_proto_version
1227#define SSL_get_max_proto_version SSL_get_max_proto_version 1262#define SSL_get_max_proto_version SSL_get_max_proto_version
1228#define SSL_set_min_proto_version SSL_set_min_proto_version 1263#define SSL_set_min_proto_version SSL_set_min_proto_version