1c9496f6bSchristos /*
2*4724848cSchristos * Copyright 1995-2022 The OpenSSL Project Authors. All Rights Reserved.
3*4724848cSchristos * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved
4c9496f6bSchristos *
5*4724848cSchristos * Licensed under the OpenSSL license (the "License"). You may not use
6*4724848cSchristos * this file except in compliance with the License. You can obtain a copy
7*4724848cSchristos * in the file LICENSE in the source distribution or at
8*4724848cSchristos * https://www.openssl.org/source/license.html
9c9496f6bSchristos */
10c9496f6bSchristos
11c9496f6bSchristos #include <stdio.h>
12c9496f6bSchristos #include <sys/types.h>
13c9496f6bSchristos
14*4724848cSchristos #include "internal/nelem.h"
15*4724848cSchristos #include "internal/o_dir.h"
16c9496f6bSchristos #include <openssl/bio.h>
17c9496f6bSchristos #include <openssl/pem.h>
18c9496f6bSchristos #include <openssl/x509v3.h>
19c9496f6bSchristos #include <openssl/dh.h>
20c9496f6bSchristos #include <openssl/bn.h>
21*4724848cSchristos #include <openssl/crypto.h>
22*4724848cSchristos #include "internal/refcount.h"
23*4724848cSchristos #include "ssl_local.h"
24*4724848cSchristos #include "ssl_cert_table.h"
25*4724848cSchristos #include "internal/thread_once.h"
26*4724848cSchristos
27*4724848cSchristos static int ssl_security_default_callback(const SSL *s, const SSL_CTX *ctx,
28*4724848cSchristos int op, int bits, int nid, void *other,
29*4724848cSchristos void *ex);
30*4724848cSchristos
31*4724848cSchristos static CRYPTO_ONCE ssl_x509_store_ctx_once = CRYPTO_ONCE_STATIC_INIT;
32*4724848cSchristos static volatile int ssl_x509_store_ctx_idx = -1;
33*4724848cSchristos
DEFINE_RUN_ONCE_STATIC(ssl_x509_store_ctx_init)34*4724848cSchristos DEFINE_RUN_ONCE_STATIC(ssl_x509_store_ctx_init)
35*4724848cSchristos {
36*4724848cSchristos ssl_x509_store_ctx_idx = X509_STORE_CTX_get_ex_new_index(0,
37*4724848cSchristos "SSL for verify callback",
38*4724848cSchristos NULL, NULL, NULL);
39*4724848cSchristos return ssl_x509_store_ctx_idx >= 0;
40*4724848cSchristos }
41c9496f6bSchristos
SSL_get_ex_data_X509_STORE_CTX_idx(void)42c9496f6bSchristos int SSL_get_ex_data_X509_STORE_CTX_idx(void)
43c9496f6bSchristos {
44c9496f6bSchristos
45*4724848cSchristos if (!RUN_ONCE(&ssl_x509_store_ctx_once, ssl_x509_store_ctx_init))
46*4724848cSchristos return -1;
47c9496f6bSchristos return ssl_x509_store_ctx_idx;
48c9496f6bSchristos }
49c9496f6bSchristos
ssl_cert_new(void)50c9496f6bSchristos CERT *ssl_cert_new(void)
51c9496f6bSchristos {
52*4724848cSchristos CERT *ret = OPENSSL_zalloc(sizeof(*ret));
53c9496f6bSchristos
54c9496f6bSchristos if (ret == NULL) {
55c9496f6bSchristos SSLerr(SSL_F_SSL_CERT_NEW, ERR_R_MALLOC_FAILURE);
56*4724848cSchristos return NULL;
57c9496f6bSchristos }
58c9496f6bSchristos
59*4724848cSchristos ret->key = &(ret->pkeys[SSL_PKEY_RSA]);
60c9496f6bSchristos ret->references = 1;
61*4724848cSchristos ret->sec_cb = ssl_security_default_callback;
62*4724848cSchristos ret->sec_level = OPENSSL_TLS_SECURITY_LEVEL;
63*4724848cSchristos ret->sec_ex = NULL;
64*4724848cSchristos ret->lock = CRYPTO_THREAD_lock_new();
65*4724848cSchristos if (ret->lock == NULL) {
66*4724848cSchristos SSLerr(SSL_F_SSL_CERT_NEW, ERR_R_MALLOC_FAILURE);
67*4724848cSchristos OPENSSL_free(ret);
68*4724848cSchristos return NULL;
69*4724848cSchristos }
70*4724848cSchristos
71*4724848cSchristos return ret;
72c9496f6bSchristos }
73c9496f6bSchristos
ssl_cert_dup(CERT * cert)74c9496f6bSchristos CERT *ssl_cert_dup(CERT *cert)
75c9496f6bSchristos {
76*4724848cSchristos CERT *ret = OPENSSL_zalloc(sizeof(*ret));
77c9496f6bSchristos int i;
78c9496f6bSchristos
79c9496f6bSchristos if (ret == NULL) {
80c9496f6bSchristos SSLerr(SSL_F_SSL_CERT_DUP, ERR_R_MALLOC_FAILURE);
81*4724848cSchristos return NULL;
82c9496f6bSchristos }
83c9496f6bSchristos
84c9496f6bSchristos ret->references = 1;
85*4724848cSchristos ret->key = &ret->pkeys[cert->key - cert->pkeys];
86*4724848cSchristos ret->lock = CRYPTO_THREAD_lock_new();
87*4724848cSchristos if (ret->lock == NULL) {
88*4724848cSchristos SSLerr(SSL_F_SSL_CERT_DUP, ERR_R_MALLOC_FAILURE);
89*4724848cSchristos OPENSSL_free(ret);
90*4724848cSchristos return NULL;
91c9496f6bSchristos }
92c9496f6bSchristos #ifndef OPENSSL_NO_DH
93c9496f6bSchristos if (cert->dh_tmp != NULL) {
94*4724848cSchristos ret->dh_tmp = cert->dh_tmp;
95*4724848cSchristos EVP_PKEY_up_ref(ret->dh_tmp);
96c9496f6bSchristos }
97c9496f6bSchristos ret->dh_tmp_cb = cert->dh_tmp_cb;
98*4724848cSchristos ret->dh_tmp_auto = cert->dh_tmp_auto;
99c9496f6bSchristos #endif
100c9496f6bSchristos
101c9496f6bSchristos for (i = 0; i < SSL_PKEY_NUM; i++) {
102c9496f6bSchristos CERT_PKEY *cpk = cert->pkeys + i;
103c9496f6bSchristos CERT_PKEY *rpk = ret->pkeys + i;
104c9496f6bSchristos if (cpk->x509 != NULL) {
105c9496f6bSchristos rpk->x509 = cpk->x509;
106*4724848cSchristos X509_up_ref(rpk->x509);
107c9496f6bSchristos }
108c9496f6bSchristos
109c9496f6bSchristos if (cpk->privatekey != NULL) {
110c9496f6bSchristos rpk->privatekey = cpk->privatekey;
111*4724848cSchristos EVP_PKEY_up_ref(cpk->privatekey);
112c9496f6bSchristos }
113c9496f6bSchristos
114c9496f6bSchristos if (cpk->chain) {
115c9496f6bSchristos rpk->chain = X509_chain_up_ref(cpk->chain);
116c9496f6bSchristos if (!rpk->chain) {
117c9496f6bSchristos SSLerr(SSL_F_SSL_CERT_DUP, ERR_R_MALLOC_FAILURE);
118c9496f6bSchristos goto err;
119c9496f6bSchristos }
120c9496f6bSchristos }
121c9496f6bSchristos if (cert->pkeys[i].serverinfo != NULL) {
122c9496f6bSchristos /* Just copy everything. */
123c9496f6bSchristos ret->pkeys[i].serverinfo =
124c9496f6bSchristos OPENSSL_malloc(cert->pkeys[i].serverinfo_length);
125c9496f6bSchristos if (ret->pkeys[i].serverinfo == NULL) {
126c9496f6bSchristos SSLerr(SSL_F_SSL_CERT_DUP, ERR_R_MALLOC_FAILURE);
127c9496f6bSchristos goto err;
128c9496f6bSchristos }
129*4724848cSchristos ret->pkeys[i].serverinfo_length = cert->pkeys[i].serverinfo_length;
130c9496f6bSchristos memcpy(ret->pkeys[i].serverinfo,
131*4724848cSchristos cert->pkeys[i].serverinfo, cert->pkeys[i].serverinfo_length);
132c9496f6bSchristos }
133c9496f6bSchristos }
134c9496f6bSchristos
135*4724848cSchristos /* Configured sigalgs copied across */
136c9496f6bSchristos if (cert->conf_sigalgs) {
137*4724848cSchristos ret->conf_sigalgs = OPENSSL_malloc(cert->conf_sigalgslen
138*4724848cSchristos * sizeof(*cert->conf_sigalgs));
139*4724848cSchristos if (ret->conf_sigalgs == NULL)
140c9496f6bSchristos goto err;
141*4724848cSchristos memcpy(ret->conf_sigalgs, cert->conf_sigalgs,
142*4724848cSchristos cert->conf_sigalgslen * sizeof(*cert->conf_sigalgs));
143c9496f6bSchristos ret->conf_sigalgslen = cert->conf_sigalgslen;
144c9496f6bSchristos } else
145c9496f6bSchristos ret->conf_sigalgs = NULL;
146c9496f6bSchristos
147c9496f6bSchristos if (cert->client_sigalgs) {
148*4724848cSchristos ret->client_sigalgs = OPENSSL_malloc(cert->client_sigalgslen
149*4724848cSchristos * sizeof(*cert->client_sigalgs));
150*4724848cSchristos if (ret->client_sigalgs == NULL)
151c9496f6bSchristos goto err;
152c9496f6bSchristos memcpy(ret->client_sigalgs, cert->client_sigalgs,
153*4724848cSchristos cert->client_sigalgslen * sizeof(*cert->client_sigalgs));
154c9496f6bSchristos ret->client_sigalgslen = cert->client_sigalgslen;
155c9496f6bSchristos } else
156c9496f6bSchristos ret->client_sigalgs = NULL;
157c9496f6bSchristos /* Copy any custom client certificate types */
158*4724848cSchristos if (cert->ctype) {
159*4724848cSchristos ret->ctype = OPENSSL_memdup(cert->ctype, cert->ctype_len);
160*4724848cSchristos if (ret->ctype == NULL)
161c9496f6bSchristos goto err;
162*4724848cSchristos ret->ctype_len = cert->ctype_len;
163c9496f6bSchristos }
164c9496f6bSchristos
165c9496f6bSchristos ret->cert_flags = cert->cert_flags;
166c9496f6bSchristos
167c9496f6bSchristos ret->cert_cb = cert->cert_cb;
168c9496f6bSchristos ret->cert_cb_arg = cert->cert_cb_arg;
169c9496f6bSchristos
170c9496f6bSchristos if (cert->verify_store) {
171*4724848cSchristos X509_STORE_up_ref(cert->verify_store);
172c9496f6bSchristos ret->verify_store = cert->verify_store;
173c9496f6bSchristos }
174c9496f6bSchristos
175c9496f6bSchristos if (cert->chain_store) {
176*4724848cSchristos X509_STORE_up_ref(cert->chain_store);
177c9496f6bSchristos ret->chain_store = cert->chain_store;
178c9496f6bSchristos }
179c9496f6bSchristos
180*4724848cSchristos ret->sec_cb = cert->sec_cb;
181*4724848cSchristos ret->sec_level = cert->sec_level;
182*4724848cSchristos ret->sec_ex = cert->sec_ex;
183c9496f6bSchristos
184*4724848cSchristos if (!custom_exts_copy(&ret->custext, &cert->custext))
185c9496f6bSchristos goto err;
186*4724848cSchristos #ifndef OPENSSL_NO_PSK
187*4724848cSchristos if (cert->psk_identity_hint) {
188*4724848cSchristos ret->psk_identity_hint = OPENSSL_strdup(cert->psk_identity_hint);
189*4724848cSchristos if (ret->psk_identity_hint == NULL)
190c9496f6bSchristos goto err;
191*4724848cSchristos }
192c9496f6bSchristos #endif
193*4724848cSchristos return ret;
194c9496f6bSchristos
195c9496f6bSchristos err:
196*4724848cSchristos ssl_cert_free(ret);
197c9496f6bSchristos
198c9496f6bSchristos return NULL;
199c9496f6bSchristos }
200c9496f6bSchristos
201c9496f6bSchristos /* Free up and clear all certificates and chains */
202c9496f6bSchristos
ssl_cert_clear_certs(CERT * c)203c9496f6bSchristos void ssl_cert_clear_certs(CERT *c)
204c9496f6bSchristos {
205c9496f6bSchristos int i;
206c9496f6bSchristos if (c == NULL)
207c9496f6bSchristos return;
208c9496f6bSchristos for (i = 0; i < SSL_PKEY_NUM; i++) {
209c9496f6bSchristos CERT_PKEY *cpk = c->pkeys + i;
210c9496f6bSchristos X509_free(cpk->x509);
211c9496f6bSchristos cpk->x509 = NULL;
212c9496f6bSchristos EVP_PKEY_free(cpk->privatekey);
213c9496f6bSchristos cpk->privatekey = NULL;
214c9496f6bSchristos sk_X509_pop_free(cpk->chain, X509_free);
215c9496f6bSchristos cpk->chain = NULL;
216c9496f6bSchristos OPENSSL_free(cpk->serverinfo);
217c9496f6bSchristos cpk->serverinfo = NULL;
218c9496f6bSchristos cpk->serverinfo_length = 0;
219c9496f6bSchristos }
220c9496f6bSchristos }
221c9496f6bSchristos
ssl_cert_free(CERT * c)222c9496f6bSchristos void ssl_cert_free(CERT *c)
223c9496f6bSchristos {
224c9496f6bSchristos int i;
225c9496f6bSchristos
226c9496f6bSchristos if (c == NULL)
227c9496f6bSchristos return;
228*4724848cSchristos CRYPTO_DOWN_REF(&c->references, &i, c->lock);
229*4724848cSchristos REF_PRINT_COUNT("CERT", c);
230c9496f6bSchristos if (i > 0)
231c9496f6bSchristos return;
232*4724848cSchristos REF_ASSERT_ISNT(i < 0);
233c9496f6bSchristos
234c9496f6bSchristos #ifndef OPENSSL_NO_DH
235*4724848cSchristos EVP_PKEY_free(c->dh_tmp);
236c9496f6bSchristos #endif
237c9496f6bSchristos
238c9496f6bSchristos ssl_cert_clear_certs(c);
239c9496f6bSchristos OPENSSL_free(c->conf_sigalgs);
240c9496f6bSchristos OPENSSL_free(c->client_sigalgs);
241*4724848cSchristos OPENSSL_free(c->ctype);
242c9496f6bSchristos X509_STORE_free(c->verify_store);
243c9496f6bSchristos X509_STORE_free(c->chain_store);
244*4724848cSchristos custom_exts_free(&c->custext);
245*4724848cSchristos #ifndef OPENSSL_NO_PSK
246*4724848cSchristos OPENSSL_free(c->psk_identity_hint);
247c9496f6bSchristos #endif
248*4724848cSchristos CRYPTO_THREAD_lock_free(c->lock);
249c9496f6bSchristos OPENSSL_free(c);
250c9496f6bSchristos }
251c9496f6bSchristos
ssl_cert_set0_chain(SSL * s,SSL_CTX * ctx,STACK_OF (X509)* chain)252*4724848cSchristos int ssl_cert_set0_chain(SSL *s, SSL_CTX *ctx, STACK_OF(X509) *chain)
253c9496f6bSchristos {
254*4724848cSchristos int i, r;
255*4724848cSchristos CERT_PKEY *cpk = s ? s->cert->key : ctx->cert->key;
256c9496f6bSchristos if (!cpk)
257c9496f6bSchristos return 0;
258*4724848cSchristos for (i = 0; i < sk_X509_num(chain); i++) {
259*4724848cSchristos r = ssl_security_cert(s, ctx, sk_X509_value(chain, i), 0, 0);
260*4724848cSchristos if (r != 1) {
261*4724848cSchristos SSLerr(SSL_F_SSL_CERT_SET0_CHAIN, r);
262*4724848cSchristos return 0;
263*4724848cSchristos }
264*4724848cSchristos }
265c9496f6bSchristos sk_X509_pop_free(cpk->chain, X509_free);
266c9496f6bSchristos cpk->chain = chain;
267c9496f6bSchristos return 1;
268c9496f6bSchristos }
269c9496f6bSchristos
ssl_cert_set1_chain(SSL * s,SSL_CTX * ctx,STACK_OF (X509)* chain)270*4724848cSchristos int ssl_cert_set1_chain(SSL *s, SSL_CTX *ctx, STACK_OF(X509) *chain)
271c9496f6bSchristos {
272c9496f6bSchristos STACK_OF(X509) *dchain;
273c9496f6bSchristos if (!chain)
274*4724848cSchristos return ssl_cert_set0_chain(s, ctx, NULL);
275c9496f6bSchristos dchain = X509_chain_up_ref(chain);
276c9496f6bSchristos if (!dchain)
277c9496f6bSchristos return 0;
278*4724848cSchristos if (!ssl_cert_set0_chain(s, ctx, dchain)) {
279c9496f6bSchristos sk_X509_pop_free(dchain, X509_free);
280c9496f6bSchristos return 0;
281c9496f6bSchristos }
282c9496f6bSchristos return 1;
283c9496f6bSchristos }
284c9496f6bSchristos
ssl_cert_add0_chain_cert(SSL * s,SSL_CTX * ctx,X509 * x)285*4724848cSchristos int ssl_cert_add0_chain_cert(SSL *s, SSL_CTX *ctx, X509 *x)
286c9496f6bSchristos {
287*4724848cSchristos int r;
288*4724848cSchristos CERT_PKEY *cpk = s ? s->cert->key : ctx->cert->key;
289c9496f6bSchristos if (!cpk)
290c9496f6bSchristos return 0;
291*4724848cSchristos r = ssl_security_cert(s, ctx, x, 0, 0);
292*4724848cSchristos if (r != 1) {
293*4724848cSchristos SSLerr(SSL_F_SSL_CERT_ADD0_CHAIN_CERT, r);
294*4724848cSchristos return 0;
295*4724848cSchristos }
296c9496f6bSchristos if (!cpk->chain)
297c9496f6bSchristos cpk->chain = sk_X509_new_null();
298c9496f6bSchristos if (!cpk->chain || !sk_X509_push(cpk->chain, x))
299c9496f6bSchristos return 0;
300c9496f6bSchristos return 1;
301c9496f6bSchristos }
302c9496f6bSchristos
ssl_cert_add1_chain_cert(SSL * s,SSL_CTX * ctx,X509 * x)303*4724848cSchristos int ssl_cert_add1_chain_cert(SSL *s, SSL_CTX *ctx, X509 *x)
304c9496f6bSchristos {
305*4724848cSchristos if (!ssl_cert_add0_chain_cert(s, ctx, x))
306c9496f6bSchristos return 0;
307*4724848cSchristos X509_up_ref(x);
308c9496f6bSchristos return 1;
309c9496f6bSchristos }
310c9496f6bSchristos
ssl_cert_select_current(CERT * c,X509 * x)311c9496f6bSchristos int ssl_cert_select_current(CERT *c, X509 *x)
312c9496f6bSchristos {
313c9496f6bSchristos int i;
314c9496f6bSchristos if (x == NULL)
315c9496f6bSchristos return 0;
316c9496f6bSchristos for (i = 0; i < SSL_PKEY_NUM; i++) {
317c9496f6bSchristos CERT_PKEY *cpk = c->pkeys + i;
318c9496f6bSchristos if (cpk->x509 == x && cpk->privatekey) {
319c9496f6bSchristos c->key = cpk;
320c9496f6bSchristos return 1;
321c9496f6bSchristos }
322c9496f6bSchristos }
323c9496f6bSchristos
324c9496f6bSchristos for (i = 0; i < SSL_PKEY_NUM; i++) {
325c9496f6bSchristos CERT_PKEY *cpk = c->pkeys + i;
326c9496f6bSchristos if (cpk->privatekey && cpk->x509 && !X509_cmp(cpk->x509, x)) {
327c9496f6bSchristos c->key = cpk;
328c9496f6bSchristos return 1;
329c9496f6bSchristos }
330c9496f6bSchristos }
331c9496f6bSchristos return 0;
332c9496f6bSchristos }
333c9496f6bSchristos
ssl_cert_set_current(CERT * c,long op)334c9496f6bSchristos int ssl_cert_set_current(CERT *c, long op)
335c9496f6bSchristos {
336c9496f6bSchristos int i, idx;
337c9496f6bSchristos if (!c)
338c9496f6bSchristos return 0;
339c9496f6bSchristos if (op == SSL_CERT_SET_FIRST)
340c9496f6bSchristos idx = 0;
341c9496f6bSchristos else if (op == SSL_CERT_SET_NEXT) {
342c9496f6bSchristos idx = (int)(c->key - c->pkeys + 1);
343c9496f6bSchristos if (idx >= SSL_PKEY_NUM)
344c9496f6bSchristos return 0;
345c9496f6bSchristos } else
346c9496f6bSchristos return 0;
347c9496f6bSchristos for (i = idx; i < SSL_PKEY_NUM; i++) {
348c9496f6bSchristos CERT_PKEY *cpk = c->pkeys + i;
349c9496f6bSchristos if (cpk->x509 && cpk->privatekey) {
350c9496f6bSchristos c->key = cpk;
351c9496f6bSchristos return 1;
352c9496f6bSchristos }
353c9496f6bSchristos }
354c9496f6bSchristos return 0;
355c9496f6bSchristos }
356c9496f6bSchristos
ssl_cert_set_cert_cb(CERT * c,int (* cb)(SSL * ssl,void * arg),void * arg)357c9496f6bSchristos void ssl_cert_set_cert_cb(CERT *c, int (*cb) (SSL *ssl, void *arg), void *arg)
358c9496f6bSchristos {
359c9496f6bSchristos c->cert_cb = cb;
360c9496f6bSchristos c->cert_cb_arg = arg;
361c9496f6bSchristos }
362c9496f6bSchristos
ssl_verify_cert_chain(SSL * s,STACK_OF (X509)* sk)363c9496f6bSchristos int ssl_verify_cert_chain(SSL *s, STACK_OF(X509) *sk)
364c9496f6bSchristos {
365c9496f6bSchristos X509 *x;
366*4724848cSchristos int i = 0;
367c9496f6bSchristos X509_STORE *verify_store;
368*4724848cSchristos X509_STORE_CTX *ctx = NULL;
369*4724848cSchristos X509_VERIFY_PARAM *param;
370*4724848cSchristos
371*4724848cSchristos if ((sk == NULL) || (sk_X509_num(sk) == 0))
372*4724848cSchristos return 0;
373c9496f6bSchristos
374c9496f6bSchristos if (s->cert->verify_store)
375c9496f6bSchristos verify_store = s->cert->verify_store;
376c9496f6bSchristos else
377c9496f6bSchristos verify_store = s->ctx->cert_store;
378c9496f6bSchristos
379*4724848cSchristos ctx = X509_STORE_CTX_new();
380*4724848cSchristos if (ctx == NULL) {
381*4724848cSchristos SSLerr(SSL_F_SSL_VERIFY_CERT_CHAIN, ERR_R_MALLOC_FAILURE);
382*4724848cSchristos return 0;
383*4724848cSchristos }
384c9496f6bSchristos
385c9496f6bSchristos x = sk_X509_value(sk, 0);
386*4724848cSchristos if (!X509_STORE_CTX_init(ctx, verify_store, x, sk)) {
387c9496f6bSchristos SSLerr(SSL_F_SSL_VERIFY_CERT_CHAIN, ERR_R_X509_LIB);
388*4724848cSchristos goto end;
389c9496f6bSchristos }
390*4724848cSchristos param = X509_STORE_CTX_get0_param(ctx);
391*4724848cSchristos /*
392*4724848cSchristos * XXX: Separate @AUTHSECLEVEL and @TLSSECLEVEL would be useful at some
393*4724848cSchristos * point, for now a single @SECLEVEL sets the same policy for TLS crypto
394*4724848cSchristos * and PKI authentication.
395*4724848cSchristos */
396*4724848cSchristos X509_VERIFY_PARAM_set_auth_level(param, SSL_get_security_level(s));
397*4724848cSchristos
398c9496f6bSchristos /* Set suite B flags if needed */
399*4724848cSchristos X509_STORE_CTX_set_flags(ctx, tls1_suiteb(s));
400*4724848cSchristos if (!X509_STORE_CTX_set_ex_data
401*4724848cSchristos (ctx, SSL_get_ex_data_X509_STORE_CTX_idx(), s)) {
402*4724848cSchristos goto end;
403*4724848cSchristos }
404*4724848cSchristos
405*4724848cSchristos /* Verify via DANE if enabled */
406*4724848cSchristos if (DANETLS_ENABLED(&s->dane))
407*4724848cSchristos X509_STORE_CTX_set0_dane(ctx, &s->dane);
408c9496f6bSchristos
409c9496f6bSchristos /*
410c9496f6bSchristos * We need to inherit the verify parameters. These can be determined by
411c9496f6bSchristos * the context: if its a server it will verify SSL client certificates or
412c9496f6bSchristos * vice versa.
413c9496f6bSchristos */
414c9496f6bSchristos
415*4724848cSchristos X509_STORE_CTX_set_default(ctx, s->server ? "ssl_client" : "ssl_server");
416c9496f6bSchristos /*
417*4724848cSchristos * Anything non-default in "s->param" should overwrite anything in the ctx.
418c9496f6bSchristos */
419*4724848cSchristos X509_VERIFY_PARAM_set1(param, s->param);
420c9496f6bSchristos
421c9496f6bSchristos if (s->verify_callback)
422*4724848cSchristos X509_STORE_CTX_set_verify_cb(ctx, s->verify_callback);
423c9496f6bSchristos
424c9496f6bSchristos if (s->ctx->app_verify_callback != NULL)
425*4724848cSchristos i = s->ctx->app_verify_callback(ctx, s->ctx->app_verify_arg);
426*4724848cSchristos else
427*4724848cSchristos i = X509_verify_cert(ctx);
428*4724848cSchristos
429*4724848cSchristos s->verify_result = X509_STORE_CTX_get_error(ctx);
430*4724848cSchristos sk_X509_pop_free(s->verified_chain, X509_free);
431*4724848cSchristos s->verified_chain = NULL;
432*4724848cSchristos if (X509_STORE_CTX_get0_chain(ctx) != NULL) {
433*4724848cSchristos s->verified_chain = X509_STORE_CTX_get1_chain(ctx);
434*4724848cSchristos if (s->verified_chain == NULL) {
435*4724848cSchristos SSLerr(SSL_F_SSL_VERIFY_CERT_CHAIN, ERR_R_MALLOC_FAILURE);
436c9496f6bSchristos i = 0;
437*4724848cSchristos }
438c9496f6bSchristos }
439c9496f6bSchristos
440*4724848cSchristos /* Move peername from the store context params to the SSL handle's */
441*4724848cSchristos X509_VERIFY_PARAM_move_peername(s->param, param);
442c9496f6bSchristos
443*4724848cSchristos end:
444*4724848cSchristos X509_STORE_CTX_free(ctx);
445*4724848cSchristos return i;
446c9496f6bSchristos }
447c9496f6bSchristos
set0_CA_list(STACK_OF (X509_NAME)** ca_list,STACK_OF (X509_NAME)* name_list)448*4724848cSchristos static void set0_CA_list(STACK_OF(X509_NAME) **ca_list,
449c9496f6bSchristos STACK_OF(X509_NAME) *name_list)
450c9496f6bSchristos {
451c9496f6bSchristos sk_X509_NAME_pop_free(*ca_list, X509_NAME_free);
452c9496f6bSchristos *ca_list = name_list;
453c9496f6bSchristos }
454c9496f6bSchristos
STACK_OF(X509_NAME)455*4724848cSchristos STACK_OF(X509_NAME) *SSL_dup_CA_list(const STACK_OF(X509_NAME) *sk)
456c9496f6bSchristos {
457c9496f6bSchristos int i;
458*4724848cSchristos const int num = sk_X509_NAME_num(sk);
459c9496f6bSchristos STACK_OF(X509_NAME) *ret;
460c9496f6bSchristos X509_NAME *name;
461c9496f6bSchristos
462*4724848cSchristos ret = sk_X509_NAME_new_reserve(NULL, num);
463*4724848cSchristos if (ret == NULL) {
464*4724848cSchristos SSLerr(SSL_F_SSL_DUP_CA_LIST, ERR_R_MALLOC_FAILURE);
465*4724848cSchristos return NULL;
466*4724848cSchristos }
467*4724848cSchristos for (i = 0; i < num; i++) {
468c9496f6bSchristos name = X509_NAME_dup(sk_X509_NAME_value(sk, i));
469*4724848cSchristos if (name == NULL) {
470*4724848cSchristos SSLerr(SSL_F_SSL_DUP_CA_LIST, ERR_R_MALLOC_FAILURE);
471c9496f6bSchristos sk_X509_NAME_pop_free(ret, X509_NAME_free);
472*4724848cSchristos return NULL;
473c9496f6bSchristos }
474*4724848cSchristos sk_X509_NAME_push(ret, name); /* Cannot fail after reserve call */
475c9496f6bSchristos }
476*4724848cSchristos return ret;
477c9496f6bSchristos }
478c9496f6bSchristos
SSL_set0_CA_list(SSL * s,STACK_OF (X509_NAME)* name_list)479*4724848cSchristos void SSL_set0_CA_list(SSL *s, STACK_OF(X509_NAME) *name_list)
480c9496f6bSchristos {
481*4724848cSchristos set0_CA_list(&s->ca_names, name_list);
482*4724848cSchristos }
483*4724848cSchristos
SSL_CTX_set0_CA_list(SSL_CTX * ctx,STACK_OF (X509_NAME)* name_list)484*4724848cSchristos void SSL_CTX_set0_CA_list(SSL_CTX *ctx, STACK_OF(X509_NAME) *name_list)
485*4724848cSchristos {
486*4724848cSchristos set0_CA_list(&ctx->ca_names, name_list);
487*4724848cSchristos }
488*4724848cSchristos
STACK_OF(X509_NAME)489*4724848cSchristos const STACK_OF(X509_NAME) *SSL_CTX_get0_CA_list(const SSL_CTX *ctx)
490*4724848cSchristos {
491*4724848cSchristos return ctx->ca_names;
492*4724848cSchristos }
493*4724848cSchristos
STACK_OF(X509_NAME)494*4724848cSchristos const STACK_OF(X509_NAME) *SSL_get0_CA_list(const SSL *s)
495*4724848cSchristos {
496*4724848cSchristos return s->ca_names != NULL ? s->ca_names : s->ctx->ca_names;
497c9496f6bSchristos }
498c9496f6bSchristos
SSL_CTX_set_client_CA_list(SSL_CTX * ctx,STACK_OF (X509_NAME)* name_list)499c9496f6bSchristos void SSL_CTX_set_client_CA_list(SSL_CTX *ctx, STACK_OF(X509_NAME) *name_list)
500c9496f6bSchristos {
501*4724848cSchristos set0_CA_list(&ctx->client_ca_names, name_list);
502c9496f6bSchristos }
503c9496f6bSchristos
STACK_OF(X509_NAME)504c9496f6bSchristos STACK_OF(X509_NAME) *SSL_CTX_get_client_CA_list(const SSL_CTX *ctx)
505c9496f6bSchristos {
506*4724848cSchristos return ctx->client_ca_names;
507*4724848cSchristos }
508*4724848cSchristos
SSL_set_client_CA_list(SSL * s,STACK_OF (X509_NAME)* name_list)509*4724848cSchristos void SSL_set_client_CA_list(SSL *s, STACK_OF(X509_NAME) *name_list)
510*4724848cSchristos {
511*4724848cSchristos set0_CA_list(&s->client_ca_names, name_list);
512*4724848cSchristos }
513*4724848cSchristos
STACK_OF(X509_NAME)514*4724848cSchristos const STACK_OF(X509_NAME) *SSL_get0_peer_CA_list(const SSL *s)
515*4724848cSchristos {
516*4724848cSchristos return s->s3 != NULL ? s->s3->tmp.peer_ca_names : NULL;
517c9496f6bSchristos }
518c9496f6bSchristos
STACK_OF(X509_NAME)519c9496f6bSchristos STACK_OF(X509_NAME) *SSL_get_client_CA_list(const SSL *s)
520c9496f6bSchristos {
521*4724848cSchristos if (!s->server)
522*4724848cSchristos return s->s3 != NULL ? s->s3->tmp.peer_ca_names : NULL;
523*4724848cSchristos return s->client_ca_names != NULL ? s->client_ca_names
524*4724848cSchristos : s->ctx->client_ca_names;
525c9496f6bSchristos }
526c9496f6bSchristos
add_ca_name(STACK_OF (X509_NAME)** sk,const X509 * x)527*4724848cSchristos static int add_ca_name(STACK_OF(X509_NAME) **sk, const X509 *x)
528c9496f6bSchristos {
529c9496f6bSchristos X509_NAME *name;
530c9496f6bSchristos
531c9496f6bSchristos if (x == NULL)
532*4724848cSchristos return 0;
533*4724848cSchristos if (*sk == NULL && ((*sk = sk_X509_NAME_new_null()) == NULL))
534*4724848cSchristos return 0;
535c9496f6bSchristos
536c9496f6bSchristos if ((name = X509_NAME_dup(X509_get_subject_name(x))) == NULL)
537*4724848cSchristos return 0;
538c9496f6bSchristos
539c9496f6bSchristos if (!sk_X509_NAME_push(*sk, name)) {
540c9496f6bSchristos X509_NAME_free(name);
541*4724848cSchristos return 0;
542c9496f6bSchristos }
543*4724848cSchristos return 1;
544c9496f6bSchristos }
545c9496f6bSchristos
SSL_add1_to_CA_list(SSL * ssl,const X509 * x)546*4724848cSchristos int SSL_add1_to_CA_list(SSL *ssl, const X509 *x)
547*4724848cSchristos {
548*4724848cSchristos return add_ca_name(&ssl->ca_names, x);
549*4724848cSchristos }
550*4724848cSchristos
SSL_CTX_add1_to_CA_list(SSL_CTX * ctx,const X509 * x)551*4724848cSchristos int SSL_CTX_add1_to_CA_list(SSL_CTX *ctx, const X509 *x)
552*4724848cSchristos {
553*4724848cSchristos return add_ca_name(&ctx->ca_names, x);
554*4724848cSchristos }
555*4724848cSchristos
556*4724848cSchristos /*
557*4724848cSchristos * The following two are older names are to be replaced with
558*4724848cSchristos * SSL(_CTX)_add1_to_CA_list
559*4724848cSchristos */
SSL_add_client_CA(SSL * ssl,X509 * x)560c9496f6bSchristos int SSL_add_client_CA(SSL *ssl, X509 *x)
561c9496f6bSchristos {
562*4724848cSchristos return add_ca_name(&ssl->client_ca_names, x);
563c9496f6bSchristos }
564c9496f6bSchristos
SSL_CTX_add_client_CA(SSL_CTX * ctx,X509 * x)565c9496f6bSchristos int SSL_CTX_add_client_CA(SSL_CTX *ctx, X509 *x)
566c9496f6bSchristos {
567*4724848cSchristos return add_ca_name(&ctx->client_ca_names, x);
568c9496f6bSchristos }
569c9496f6bSchristos
xname_cmp(const X509_NAME * a,const X509_NAME * b)570*4724848cSchristos static int xname_cmp(const X509_NAME *a, const X509_NAME *b)
571c9496f6bSchristos {
572*4724848cSchristos unsigned char *abuf = NULL, *bbuf = NULL;
573*4724848cSchristos int alen, blen, ret;
574*4724848cSchristos
575*4724848cSchristos /* X509_NAME_cmp() itself casts away constness in this way, so
576*4724848cSchristos * assume it's safe:
577*4724848cSchristos */
578*4724848cSchristos alen = i2d_X509_NAME((X509_NAME *)a, &abuf);
579*4724848cSchristos blen = i2d_X509_NAME((X509_NAME *)b, &bbuf);
580*4724848cSchristos
581*4724848cSchristos if (alen < 0 || blen < 0)
582*4724848cSchristos ret = -2;
583*4724848cSchristos else if (alen != blen)
584*4724848cSchristos ret = alen - blen;
585*4724848cSchristos else /* alen == blen */
586*4724848cSchristos ret = memcmp(abuf, bbuf, alen);
587*4724848cSchristos
588*4724848cSchristos OPENSSL_free(abuf);
589*4724848cSchristos OPENSSL_free(bbuf);
590*4724848cSchristos
591*4724848cSchristos return ret;
592c9496f6bSchristos }
593c9496f6bSchristos
xname_sk_cmp(const X509_NAME * const * a,const X509_NAME * const * b)594*4724848cSchristos static int xname_sk_cmp(const X509_NAME *const *a, const X509_NAME *const *b)
595*4724848cSchristos {
596*4724848cSchristos return xname_cmp(*a, *b);
597*4724848cSchristos }
598*4724848cSchristos
xname_hash(const X509_NAME * a)599*4724848cSchristos static unsigned long xname_hash(const X509_NAME *a)
600*4724848cSchristos {
601*4724848cSchristos return X509_NAME_hash((X509_NAME *)a);
602*4724848cSchristos }
603*4724848cSchristos
STACK_OF(X509_NAME)604c9496f6bSchristos STACK_OF(X509_NAME) *SSL_load_client_CA_file(const char *file)
605c9496f6bSchristos {
606*4724848cSchristos BIO *in = BIO_new(BIO_s_file());
607c9496f6bSchristos X509 *x = NULL;
608c9496f6bSchristos X509_NAME *xn = NULL;
609*4724848cSchristos STACK_OF(X509_NAME) *ret = NULL;
610*4724848cSchristos LHASH_OF(X509_NAME) *name_hash = lh_X509_NAME_new(xname_hash, xname_cmp);
611c9496f6bSchristos
612*4724848cSchristos if ((name_hash == NULL) || (in == NULL)) {
613c9496f6bSchristos SSLerr(SSL_F_SSL_LOAD_CLIENT_CA_FILE, ERR_R_MALLOC_FAILURE);
614c9496f6bSchristos goto err;
615c9496f6bSchristos }
616c9496f6bSchristos
617c9496f6bSchristos if (!BIO_read_filename(in, file))
618c9496f6bSchristos goto err;
619c9496f6bSchristos
620c9496f6bSchristos for (;;) {
621c9496f6bSchristos if (PEM_read_bio_X509(in, &x, NULL, NULL) == NULL)
622c9496f6bSchristos break;
623c9496f6bSchristos if (ret == NULL) {
624c9496f6bSchristos ret = sk_X509_NAME_new_null();
625c9496f6bSchristos if (ret == NULL) {
626c9496f6bSchristos SSLerr(SSL_F_SSL_LOAD_CLIENT_CA_FILE, ERR_R_MALLOC_FAILURE);
627c9496f6bSchristos goto err;
628c9496f6bSchristos }
629c9496f6bSchristos }
630c9496f6bSchristos if ((xn = X509_get_subject_name(x)) == NULL)
631c9496f6bSchristos goto err;
632c9496f6bSchristos /* check for duplicates */
633c9496f6bSchristos xn = X509_NAME_dup(xn);
634c9496f6bSchristos if (xn == NULL)
635c9496f6bSchristos goto err;
636*4724848cSchristos if (lh_X509_NAME_retrieve(name_hash, xn) != NULL) {
637*4724848cSchristos /* Duplicate. */
638c9496f6bSchristos X509_NAME_free(xn);
639*4724848cSchristos xn = NULL;
640*4724848cSchristos } else {
641*4724848cSchristos lh_X509_NAME_insert(name_hash, xn);
642*4724848cSchristos if (!sk_X509_NAME_push(ret, xn))
643*4724848cSchristos goto err;
644c9496f6bSchristos }
645c9496f6bSchristos }
646*4724848cSchristos goto done;
647c9496f6bSchristos
648c9496f6bSchristos err:
649*4724848cSchristos X509_NAME_free(xn);
650c9496f6bSchristos sk_X509_NAME_pop_free(ret, X509_NAME_free);
651c9496f6bSchristos ret = NULL;
652*4724848cSchristos done:
653c9496f6bSchristos BIO_free(in);
654c9496f6bSchristos X509_free(x);
655*4724848cSchristos lh_X509_NAME_free(name_hash);
656c9496f6bSchristos if (ret != NULL)
657c9496f6bSchristos ERR_clear_error();
658*4724848cSchristos return ret;
659c9496f6bSchristos }
660c9496f6bSchristos
SSL_add_file_cert_subjects_to_stack(STACK_OF (X509_NAME)* stack,const char * file)661c9496f6bSchristos int SSL_add_file_cert_subjects_to_stack(STACK_OF(X509_NAME) *stack,
662c9496f6bSchristos const char *file)
663c9496f6bSchristos {
664c9496f6bSchristos BIO *in;
665c9496f6bSchristos X509 *x = NULL;
666c9496f6bSchristos X509_NAME *xn = NULL;
667c9496f6bSchristos int ret = 1;
668c9496f6bSchristos int (*oldcmp) (const X509_NAME *const *a, const X509_NAME *const *b);
669c9496f6bSchristos
670*4724848cSchristos oldcmp = sk_X509_NAME_set_cmp_func(stack, xname_sk_cmp);
671c9496f6bSchristos
672*4724848cSchristos in = BIO_new(BIO_s_file());
673c9496f6bSchristos
674c9496f6bSchristos if (in == NULL) {
675*4724848cSchristos SSLerr(SSL_F_SSL_ADD_FILE_CERT_SUBJECTS_TO_STACK, ERR_R_MALLOC_FAILURE);
676c9496f6bSchristos goto err;
677c9496f6bSchristos }
678c9496f6bSchristos
679c9496f6bSchristos if (!BIO_read_filename(in, file))
680c9496f6bSchristos goto err;
681c9496f6bSchristos
682c9496f6bSchristos for (;;) {
683c9496f6bSchristos if (PEM_read_bio_X509(in, &x, NULL, NULL) == NULL)
684c9496f6bSchristos break;
685c9496f6bSchristos if ((xn = X509_get_subject_name(x)) == NULL)
686c9496f6bSchristos goto err;
687c9496f6bSchristos xn = X509_NAME_dup(xn);
688c9496f6bSchristos if (xn == NULL)
689c9496f6bSchristos goto err;
690*4724848cSchristos if (sk_X509_NAME_find(stack, xn) >= 0) {
691*4724848cSchristos /* Duplicate. */
692c9496f6bSchristos X509_NAME_free(xn);
693*4724848cSchristos } else if (!sk_X509_NAME_push(stack, xn)) {
694*4724848cSchristos X509_NAME_free(xn);
695*4724848cSchristos goto err;
696*4724848cSchristos }
697c9496f6bSchristos }
698c9496f6bSchristos
699c9496f6bSchristos ERR_clear_error();
700*4724848cSchristos goto done;
701c9496f6bSchristos
702c9496f6bSchristos err:
703c9496f6bSchristos ret = 0;
704*4724848cSchristos done:
705c9496f6bSchristos BIO_free(in);
706c9496f6bSchristos X509_free(x);
707c9496f6bSchristos (void)sk_X509_NAME_set_cmp_func(stack, oldcmp);
708c9496f6bSchristos return ret;
709c9496f6bSchristos }
710c9496f6bSchristos
SSL_add_dir_cert_subjects_to_stack(STACK_OF (X509_NAME)* stack,const char * dir)711c9496f6bSchristos int SSL_add_dir_cert_subjects_to_stack(STACK_OF(X509_NAME) *stack,
712c9496f6bSchristos const char *dir)
713c9496f6bSchristos {
714c9496f6bSchristos OPENSSL_DIR_CTX *d = NULL;
715c9496f6bSchristos const char *filename;
716c9496f6bSchristos int ret = 0;
717c9496f6bSchristos
718c9496f6bSchristos /* Note that a side effect is that the CAs will be sorted by name */
719c9496f6bSchristos
720c9496f6bSchristos while ((filename = OPENSSL_DIR_read(&d, dir))) {
721c9496f6bSchristos char buf[1024];
722c9496f6bSchristos int r;
723c9496f6bSchristos
724*4724848cSchristos if (strlen(dir) + strlen(filename) + 2 > sizeof(buf)) {
725c9496f6bSchristos SSLerr(SSL_F_SSL_ADD_DIR_CERT_SUBJECTS_TO_STACK,
726c9496f6bSchristos SSL_R_PATH_TOO_LONG);
727c9496f6bSchristos goto err;
728c9496f6bSchristos }
729c9496f6bSchristos #ifdef OPENSSL_SYS_VMS
730*4724848cSchristos r = BIO_snprintf(buf, sizeof(buf), "%s%s", dir, filename);
731c9496f6bSchristos #else
732*4724848cSchristos r = BIO_snprintf(buf, sizeof(buf), "%s/%s", dir, filename);
733c9496f6bSchristos #endif
734c9496f6bSchristos if (r <= 0 || r >= (int)sizeof(buf))
735c9496f6bSchristos goto err;
736c9496f6bSchristos if (!SSL_add_file_cert_subjects_to_stack(stack, buf))
737c9496f6bSchristos goto err;
738c9496f6bSchristos }
739c9496f6bSchristos
740c9496f6bSchristos if (errno) {
741c9496f6bSchristos SYSerr(SYS_F_OPENDIR, get_last_sys_error());
742c9496f6bSchristos ERR_add_error_data(3, "OPENSSL_DIR_read(&ctx, '", dir, "')");
743c9496f6bSchristos SSLerr(SSL_F_SSL_ADD_DIR_CERT_SUBJECTS_TO_STACK, ERR_R_SYS_LIB);
744c9496f6bSchristos goto err;
745c9496f6bSchristos }
746c9496f6bSchristos
747c9496f6bSchristos ret = 1;
748c9496f6bSchristos
749c9496f6bSchristos err:
750c9496f6bSchristos if (d)
751c9496f6bSchristos OPENSSL_DIR_end(&d);
752*4724848cSchristos
753c9496f6bSchristos return ret;
754c9496f6bSchristos }
755c9496f6bSchristos
756c9496f6bSchristos /* Build a certificate chain for current certificate */
ssl_build_cert_chain(SSL * s,SSL_CTX * ctx,int flags)757*4724848cSchristos int ssl_build_cert_chain(SSL *s, SSL_CTX *ctx, int flags)
758c9496f6bSchristos {
759*4724848cSchristos CERT *c = s ? s->cert : ctx->cert;
760c9496f6bSchristos CERT_PKEY *cpk = c->key;
761*4724848cSchristos X509_STORE *chain_store = NULL;
762*4724848cSchristos X509_STORE_CTX *xs_ctx = NULL;
763c9496f6bSchristos STACK_OF(X509) *chain = NULL, *untrusted = NULL;
764c9496f6bSchristos X509 *x;
765c9496f6bSchristos int i, rv = 0;
766c9496f6bSchristos
767c9496f6bSchristos if (!cpk->x509) {
768c9496f6bSchristos SSLerr(SSL_F_SSL_BUILD_CERT_CHAIN, SSL_R_NO_CERTIFICATE_SET);
769c9496f6bSchristos goto err;
770c9496f6bSchristos }
771c9496f6bSchristos /* Rearranging and check the chain: add everything to a store */
772c9496f6bSchristos if (flags & SSL_BUILD_CHAIN_FLAG_CHECK) {
773c9496f6bSchristos chain_store = X509_STORE_new();
774*4724848cSchristos if (chain_store == NULL)
775c9496f6bSchristos goto err;
776c9496f6bSchristos for (i = 0; i < sk_X509_num(cpk->chain); i++) {
777c9496f6bSchristos x = sk_X509_value(cpk->chain, i);
778*4724848cSchristos if (!X509_STORE_add_cert(chain_store, x))
779c9496f6bSchristos goto err;
780c9496f6bSchristos }
781c9496f6bSchristos /* Add EE cert too: it might be self signed */
782*4724848cSchristos if (!X509_STORE_add_cert(chain_store, cpk->x509))
783c9496f6bSchristos goto err;
784c9496f6bSchristos } else {
785c9496f6bSchristos if (c->chain_store)
786c9496f6bSchristos chain_store = c->chain_store;
787*4724848cSchristos else if (s)
788*4724848cSchristos chain_store = s->ctx->cert_store;
789*4724848cSchristos else
790*4724848cSchristos chain_store = ctx->cert_store;
791c9496f6bSchristos
792c9496f6bSchristos if (flags & SSL_BUILD_CHAIN_FLAG_UNTRUSTED)
793c9496f6bSchristos untrusted = cpk->chain;
794c9496f6bSchristos }
795c9496f6bSchristos
796*4724848cSchristos xs_ctx = X509_STORE_CTX_new();
797*4724848cSchristos if (xs_ctx == NULL) {
798*4724848cSchristos SSLerr(SSL_F_SSL_BUILD_CERT_CHAIN, ERR_R_MALLOC_FAILURE);
799*4724848cSchristos goto err;
800*4724848cSchristos }
801*4724848cSchristos if (!X509_STORE_CTX_init(xs_ctx, chain_store, cpk->x509, untrusted)) {
802c9496f6bSchristos SSLerr(SSL_F_SSL_BUILD_CERT_CHAIN, ERR_R_X509_LIB);
803c9496f6bSchristos goto err;
804c9496f6bSchristos }
805c9496f6bSchristos /* Set suite B flags if needed */
806*4724848cSchristos X509_STORE_CTX_set_flags(xs_ctx,
807c9496f6bSchristos c->cert_flags & SSL_CERT_FLAG_SUITEB_128_LOS);
808c9496f6bSchristos
809*4724848cSchristos i = X509_verify_cert(xs_ctx);
810c9496f6bSchristos if (i <= 0 && flags & SSL_BUILD_CHAIN_FLAG_IGNORE_ERROR) {
811c9496f6bSchristos if (flags & SSL_BUILD_CHAIN_FLAG_CLEAR_ERROR)
812c9496f6bSchristos ERR_clear_error();
813c9496f6bSchristos i = 1;
814c9496f6bSchristos rv = 2;
815c9496f6bSchristos }
816c9496f6bSchristos if (i > 0)
817*4724848cSchristos chain = X509_STORE_CTX_get1_chain(xs_ctx);
818c9496f6bSchristos if (i <= 0) {
819c9496f6bSchristos SSLerr(SSL_F_SSL_BUILD_CERT_CHAIN, SSL_R_CERTIFICATE_VERIFY_FAILED);
820*4724848cSchristos i = X509_STORE_CTX_get_error(xs_ctx);
821c9496f6bSchristos ERR_add_error_data(2, "Verify error:",
822c9496f6bSchristos X509_verify_cert_error_string(i));
823c9496f6bSchristos
824c9496f6bSchristos goto err;
825c9496f6bSchristos }
826c9496f6bSchristos /* Remove EE certificate from chain */
827c9496f6bSchristos x = sk_X509_shift(chain);
828c9496f6bSchristos X509_free(x);
829c9496f6bSchristos if (flags & SSL_BUILD_CHAIN_FLAG_NO_ROOT) {
830c9496f6bSchristos if (sk_X509_num(chain) > 0) {
831c9496f6bSchristos /* See if last cert is self signed */
832c9496f6bSchristos x = sk_X509_value(chain, sk_X509_num(chain) - 1);
833*4724848cSchristos if (X509_get_extension_flags(x) & EXFLAG_SS) {
834c9496f6bSchristos x = sk_X509_pop(chain);
835c9496f6bSchristos X509_free(x);
836c9496f6bSchristos }
837c9496f6bSchristos }
838c9496f6bSchristos }
839*4724848cSchristos /*
840*4724848cSchristos * Check security level of all CA certificates: EE will have been checked
841*4724848cSchristos * already.
842*4724848cSchristos */
843*4724848cSchristos for (i = 0; i < sk_X509_num(chain); i++) {
844*4724848cSchristos x = sk_X509_value(chain, i);
845*4724848cSchristos rv = ssl_security_cert(s, ctx, x, 0, 0);
846*4724848cSchristos if (rv != 1) {
847*4724848cSchristos SSLerr(SSL_F_SSL_BUILD_CERT_CHAIN, rv);
848*4724848cSchristos sk_X509_pop_free(chain, X509_free);
849*4724848cSchristos rv = 0;
850*4724848cSchristos goto err;
851*4724848cSchristos }
852*4724848cSchristos }
853*4724848cSchristos sk_X509_pop_free(cpk->chain, X509_free);
854c9496f6bSchristos cpk->chain = chain;
855c9496f6bSchristos if (rv == 0)
856c9496f6bSchristos rv = 1;
857c9496f6bSchristos err:
858c9496f6bSchristos if (flags & SSL_BUILD_CHAIN_FLAG_CHECK)
859c9496f6bSchristos X509_STORE_free(chain_store);
860*4724848cSchristos X509_STORE_CTX_free(xs_ctx);
861c9496f6bSchristos
862c9496f6bSchristos return rv;
863c9496f6bSchristos }
864c9496f6bSchristos
ssl_cert_set_cert_store(CERT * c,X509_STORE * store,int chain,int ref)865c9496f6bSchristos int ssl_cert_set_cert_store(CERT *c, X509_STORE *store, int chain, int ref)
866c9496f6bSchristos {
867c9496f6bSchristos X509_STORE **pstore;
868c9496f6bSchristos if (chain)
869c9496f6bSchristos pstore = &c->chain_store;
870c9496f6bSchristos else
871c9496f6bSchristos pstore = &c->verify_store;
872c9496f6bSchristos X509_STORE_free(*pstore);
873c9496f6bSchristos *pstore = store;
874c9496f6bSchristos if (ref && store)
875*4724848cSchristos X509_STORE_up_ref(store);
876c9496f6bSchristos return 1;
877c9496f6bSchristos }
878*4724848cSchristos
ssl_cert_get_cert_store(CERT * c,X509_STORE ** pstore,int chain)879*4724848cSchristos int ssl_cert_get_cert_store(CERT *c, X509_STORE **pstore, int chain)
880*4724848cSchristos {
881*4724848cSchristos *pstore = (chain ? c->chain_store : c->verify_store);
882*4724848cSchristos return 1;
883*4724848cSchristos }
884*4724848cSchristos
ssl_get_security_level_bits(const SSL * s,const SSL_CTX * ctx,int * levelp)885*4724848cSchristos int ssl_get_security_level_bits(const SSL *s, const SSL_CTX *ctx, int *levelp)
886*4724848cSchristos {
887*4724848cSchristos int level;
888*4724848cSchristos static const int minbits_table[5 + 1] = { 0, 80, 112, 128, 192, 256 };
889*4724848cSchristos
890*4724848cSchristos if (ctx != NULL)
891*4724848cSchristos level = SSL_CTX_get_security_level(ctx);
892*4724848cSchristos else
893*4724848cSchristos level = SSL_get_security_level(s);
894*4724848cSchristos
895*4724848cSchristos if (level > 5)
896*4724848cSchristos level = 5;
897*4724848cSchristos else if (level < 0)
898*4724848cSchristos level = 0;
899*4724848cSchristos
900*4724848cSchristos if (levelp != NULL)
901*4724848cSchristos *levelp = level;
902*4724848cSchristos
903*4724848cSchristos return minbits_table[level];
904*4724848cSchristos }
905*4724848cSchristos
ssl_security_default_callback(const SSL * s,const SSL_CTX * ctx,int op,int bits,int nid,void * other,void * ex)906*4724848cSchristos static int ssl_security_default_callback(const SSL *s, const SSL_CTX *ctx,
907*4724848cSchristos int op, int bits, int nid, void *other,
908*4724848cSchristos void *ex)
909*4724848cSchristos {
910*4724848cSchristos int level, minbits, pfs_mask;
911*4724848cSchristos
912*4724848cSchristos minbits = ssl_get_security_level_bits(s, ctx, &level);
913*4724848cSchristos
914*4724848cSchristos if (level == 0) {
915*4724848cSchristos /*
916*4724848cSchristos * No EDH keys weaker than 1024-bits even at level 0, otherwise,
917*4724848cSchristos * anything goes.
918*4724848cSchristos */
919*4724848cSchristos if (op == SSL_SECOP_TMP_DH && bits < 80)
920*4724848cSchristos return 0;
921*4724848cSchristos return 1;
922*4724848cSchristos }
923*4724848cSchristos switch (op) {
924*4724848cSchristos case SSL_SECOP_CIPHER_SUPPORTED:
925*4724848cSchristos case SSL_SECOP_CIPHER_SHARED:
926*4724848cSchristos case SSL_SECOP_CIPHER_CHECK:
927*4724848cSchristos {
928*4724848cSchristos const SSL_CIPHER *c = other;
929*4724848cSchristos /* No ciphers below security level */
930*4724848cSchristos if (bits < minbits)
931*4724848cSchristos return 0;
932*4724848cSchristos /* No unauthenticated ciphersuites */
933*4724848cSchristos if (c->algorithm_auth & SSL_aNULL)
934*4724848cSchristos return 0;
935*4724848cSchristos /* No MD5 mac ciphersuites */
936*4724848cSchristos if (c->algorithm_mac & SSL_MD5)
937*4724848cSchristos return 0;
938*4724848cSchristos /* SHA1 HMAC is 160 bits of security */
939*4724848cSchristos if (minbits > 160 && c->algorithm_mac & SSL_SHA1)
940*4724848cSchristos return 0;
941*4724848cSchristos /* Level 2: no RC4 */
942*4724848cSchristos if (level >= 2 && c->algorithm_enc == SSL_RC4)
943*4724848cSchristos return 0;
944*4724848cSchristos /* Level 3: forward secure ciphersuites only */
945*4724848cSchristos pfs_mask = SSL_kDHE | SSL_kECDHE | SSL_kDHEPSK | SSL_kECDHEPSK;
946*4724848cSchristos if (level >= 3 && c->min_tls != TLS1_3_VERSION &&
947*4724848cSchristos !(c->algorithm_mkey & pfs_mask))
948*4724848cSchristos return 0;
949*4724848cSchristos break;
950*4724848cSchristos }
951*4724848cSchristos case SSL_SECOP_VERSION:
952*4724848cSchristos if (!SSL_IS_DTLS(s)) {
953*4724848cSchristos /* SSLv3 not allowed at level 2 */
954*4724848cSchristos if (nid <= SSL3_VERSION && level >= 2)
955*4724848cSchristos return 0;
956*4724848cSchristos /* TLS v1.1 and above only for level 3 */
957*4724848cSchristos if (nid <= TLS1_VERSION && level >= 3)
958*4724848cSchristos return 0;
959*4724848cSchristos /* TLS v1.2 only for level 4 and above */
960*4724848cSchristos if (nid <= TLS1_1_VERSION && level >= 4)
961*4724848cSchristos return 0;
962*4724848cSchristos } else {
963*4724848cSchristos /* DTLS v1.2 only for level 4 and above */
964*4724848cSchristos if (DTLS_VERSION_LT(nid, DTLS1_2_VERSION) && level >= 4)
965*4724848cSchristos return 0;
966*4724848cSchristos }
967*4724848cSchristos break;
968*4724848cSchristos
969*4724848cSchristos case SSL_SECOP_COMPRESSION:
970*4724848cSchristos if (level >= 2)
971*4724848cSchristos return 0;
972*4724848cSchristos break;
973*4724848cSchristos case SSL_SECOP_TICKET:
974*4724848cSchristos if (level >= 3)
975*4724848cSchristos return 0;
976*4724848cSchristos break;
977*4724848cSchristos default:
978*4724848cSchristos if (bits < minbits)
979*4724848cSchristos return 0;
980*4724848cSchristos }
981*4724848cSchristos return 1;
982*4724848cSchristos }
983*4724848cSchristos
ssl_security(const SSL * s,int op,int bits,int nid,void * other)984*4724848cSchristos int ssl_security(const SSL *s, int op, int bits, int nid, void *other)
985*4724848cSchristos {
986*4724848cSchristos return s->cert->sec_cb(s, NULL, op, bits, nid, other, s->cert->sec_ex);
987*4724848cSchristos }
988*4724848cSchristos
ssl_ctx_security(const SSL_CTX * ctx,int op,int bits,int nid,void * other)989*4724848cSchristos int ssl_ctx_security(const SSL_CTX *ctx, int op, int bits, int nid, void *other)
990*4724848cSchristos {
991*4724848cSchristos return ctx->cert->sec_cb(NULL, ctx, op, bits, nid, other,
992*4724848cSchristos ctx->cert->sec_ex);
993*4724848cSchristos }
994*4724848cSchristos
ssl_cert_lookup_by_nid(int nid,size_t * pidx)995*4724848cSchristos int ssl_cert_lookup_by_nid(int nid, size_t *pidx)
996*4724848cSchristos {
997*4724848cSchristos size_t i;
998*4724848cSchristos
999*4724848cSchristos for (i = 0; i < OSSL_NELEM(ssl_cert_info); i++) {
1000*4724848cSchristos if (ssl_cert_info[i].nid == nid) {
1001*4724848cSchristos *pidx = i;
1002*4724848cSchristos return 1;
1003*4724848cSchristos }
1004*4724848cSchristos }
1005*4724848cSchristos
1006*4724848cSchristos return 0;
1007*4724848cSchristos }
1008*4724848cSchristos
ssl_cert_lookup_by_pkey(const EVP_PKEY * pk,size_t * pidx)1009*4724848cSchristos const SSL_CERT_LOOKUP *ssl_cert_lookup_by_pkey(const EVP_PKEY *pk, size_t *pidx)
1010*4724848cSchristos {
1011*4724848cSchristos int nid = EVP_PKEY_id(pk);
1012*4724848cSchristos size_t tmpidx;
1013*4724848cSchristos
1014*4724848cSchristos if (nid == NID_undef)
1015*4724848cSchristos return NULL;
1016*4724848cSchristos
1017*4724848cSchristos if (!ssl_cert_lookup_by_nid(nid, &tmpidx))
1018*4724848cSchristos return NULL;
1019*4724848cSchristos
1020*4724848cSchristos if (pidx != NULL)
1021*4724848cSchristos *pidx = tmpidx;
1022*4724848cSchristos
1023*4724848cSchristos return &ssl_cert_info[tmpidx];
1024*4724848cSchristos }
1025*4724848cSchristos
ssl_cert_lookup_by_idx(size_t idx)1026*4724848cSchristos const SSL_CERT_LOOKUP *ssl_cert_lookup_by_idx(size_t idx)
1027*4724848cSchristos {
1028*4724848cSchristos if (idx >= OSSL_NELEM(ssl_cert_info))
1029*4724848cSchristos return NULL;
1030*4724848cSchristos return &ssl_cert_info[idx];
1031*4724848cSchristos }
1032