Latest update
This commit is contained in:
+22
-2
@@ -3735,9 +3735,15 @@ long ssl3_ctrl(SSL *s, int cmd, long larg, void *parg)
|
||||
*(int *)parg = s->s3->tmp.peer_sigalg->hash;
|
||||
return 1;
|
||||
|
||||
case SSL_CTRL_GET_SERVER_TMP_KEY:
|
||||
case SSL_CTRL_GET_SIGNATURE_NID:
|
||||
if (s->s3->tmp.sigalg == NULL)
|
||||
return 0;
|
||||
*(int *)parg = s->s3->tmp.sigalg->hash;
|
||||
return 1;
|
||||
|
||||
case SSL_CTRL_GET_PEER_TMP_KEY:
|
||||
#if !defined(OPENSSL_NO_DH) || !defined(OPENSSL_NO_EC)
|
||||
if (s->server || s->session == NULL || s->s3->peer_tmp == NULL) {
|
||||
if (s->session == NULL || s->s3->peer_tmp == NULL) {
|
||||
return 0;
|
||||
} else {
|
||||
EVP_PKEY_up_ref(s->s3->peer_tmp);
|
||||
@@ -3747,6 +3753,20 @@ long ssl3_ctrl(SSL *s, int cmd, long larg, void *parg)
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
|
||||
case SSL_CTRL_GET_TMP_KEY:
|
||||
#if !defined(OPENSSL_NO_DH) || !defined(OPENSSL_NO_EC)
|
||||
if (s->session == NULL || s->s3->tmp.pkey == NULL) {
|
||||
return 0;
|
||||
} else {
|
||||
EVP_PKEY_up_ref(s->s3->tmp.pkey);
|
||||
*(EVP_PKEY **)parg = s->s3->tmp.pkey;
|
||||
return 1;
|
||||
}
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
|
||||
#ifndef OPENSSL_NO_EC
|
||||
case SSL_CTRL_GET_EC_POINT_FORMATS:
|
||||
{
|
||||
|
||||
+7
-6
@@ -501,17 +501,17 @@ const STACK_OF(X509_NAME) *SSL_get0_CA_list(const SSL *s)
|
||||
|
||||
void SSL_CTX_set_client_CA_list(SSL_CTX *ctx, STACK_OF(X509_NAME) *name_list)
|
||||
{
|
||||
SSL_CTX_set0_CA_list(ctx, name_list);
|
||||
set0_CA_list(&ctx->client_ca_names, name_list);
|
||||
}
|
||||
|
||||
STACK_OF(X509_NAME) *SSL_CTX_get_client_CA_list(const SSL_CTX *ctx)
|
||||
{
|
||||
return ctx->ca_names;
|
||||
return ctx->client_ca_names;
|
||||
}
|
||||
|
||||
void SSL_set_client_CA_list(SSL *s, STACK_OF(X509_NAME) *name_list)
|
||||
{
|
||||
SSL_set0_CA_list(s, name_list);
|
||||
set0_CA_list(&s->client_ca_names, name_list);
|
||||
}
|
||||
|
||||
const STACK_OF(X509_NAME) *SSL_get0_peer_CA_list(const SSL *s)
|
||||
@@ -523,7 +523,8 @@ STACK_OF(X509_NAME) *SSL_get_client_CA_list(const SSL *s)
|
||||
{
|
||||
if (!s->server)
|
||||
return s->s3 != NULL ? s->s3->tmp.peer_ca_names : NULL;
|
||||
return s->ca_names != NULL ? s->ca_names : s->ctx->ca_names;
|
||||
return s->client_ca_names != NULL ? s->client_ca_names
|
||||
: s->ctx->client_ca_names;
|
||||
}
|
||||
|
||||
static int add_ca_name(STACK_OF(X509_NAME) **sk, const X509 *x)
|
||||
@@ -561,12 +562,12 @@ int SSL_CTX_add1_to_CA_list(SSL_CTX *ctx, const X509 *x)
|
||||
*/
|
||||
int SSL_add_client_CA(SSL *ssl, X509 *x)
|
||||
{
|
||||
return add_ca_name(&ssl->ca_names, x);
|
||||
return add_ca_name(&ssl->client_ca_names, x);
|
||||
}
|
||||
|
||||
int SSL_CTX_add_client_CA(SSL_CTX *ctx, X509 *x)
|
||||
{
|
||||
return add_ca_name(&ctx->ca_names, x);
|
||||
return add_ca_name(&ctx->client_ca_names, x);
|
||||
}
|
||||
|
||||
static int xname_cmp(const X509_NAME *a, const X509_NAME *b)
|
||||
|
||||
+38
-13
@@ -1260,6 +1260,7 @@ void SSL_free(SSL *s)
|
||||
EVP_MD_CTX_free(s->pha_dgst);
|
||||
|
||||
sk_X509_NAME_pop_free(s->ca_names, X509_NAME_free);
|
||||
sk_X509_NAME_pop_free(s->client_ca_names, X509_NAME_free);
|
||||
|
||||
sk_X509_pop_free(s->verified_chain, X509_free);
|
||||
|
||||
@@ -3019,6 +3020,9 @@ SSL_CTX *SSL_CTX_new(const SSL_METHOD *meth)
|
||||
if ((ret->ca_names = sk_X509_NAME_new_null()) == NULL)
|
||||
goto err;
|
||||
|
||||
if ((ret->client_ca_names = sk_X509_NAME_new_null()) == NULL)
|
||||
goto err;
|
||||
|
||||
if (!CRYPTO_new_ex_data(CRYPTO_EX_INDEX_SSL_CTX, ret, &ret->ex_data))
|
||||
goto err;
|
||||
|
||||
@@ -3176,6 +3180,7 @@ void SSL_CTX_free(SSL_CTX *a)
|
||||
sk_SSL_CIPHER_free(a->tls13_ciphersuites);
|
||||
ssl_cert_free(a->cert);
|
||||
sk_X509_NAME_pop_free(a->ca_names, X509_NAME_free);
|
||||
sk_X509_NAME_pop_free(a->client_ca_names, X509_NAME_free);
|
||||
sk_X509_pop_free(a->extra_certs, X509_free);
|
||||
a->comp_methods = NULL;
|
||||
#ifndef OPENSSL_NO_SRTP
|
||||
@@ -3721,10 +3726,38 @@ const char *SSL_get_version(const SSL *s)
|
||||
return ssl_protocol_to_string(s->version);
|
||||
}
|
||||
|
||||
SSL *SSL_dup(SSL *s)
|
||||
static int dup_ca_names(STACK_OF(X509_NAME) **dst, STACK_OF(X509_NAME) *src)
|
||||
{
|
||||
STACK_OF(X509_NAME) *sk;
|
||||
X509_NAME *xn;
|
||||
int i;
|
||||
|
||||
if (src == NULL) {
|
||||
*dst = NULL;
|
||||
return 1;
|
||||
}
|
||||
|
||||
if ((sk = sk_X509_NAME_new_null()) == NULL)
|
||||
return 0;
|
||||
for (i = 0; i < sk_X509_NAME_num(src); i++) {
|
||||
xn = X509_NAME_dup(sk_X509_NAME_value(src, i));
|
||||
if (xn == NULL) {
|
||||
sk_X509_NAME_pop_free(sk, X509_NAME_free);
|
||||
return 0;
|
||||
}
|
||||
if (sk_X509_NAME_insert(sk, xn, i) == 0) {
|
||||
X509_NAME_free(xn);
|
||||
sk_X509_NAME_pop_free(sk, X509_NAME_free);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
*dst = sk;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
SSL *SSL_dup(SSL *s)
|
||||
{
|
||||
SSL *ret;
|
||||
int i;
|
||||
|
||||
@@ -3831,18 +3864,10 @@ SSL *SSL_dup(SSL *s)
|
||||
}
|
||||
|
||||
/* Dup the client_CA list */
|
||||
if (s->ca_names != NULL) {
|
||||
if ((sk = sk_X509_NAME_dup(s->ca_names)) == NULL)
|
||||
goto err;
|
||||
ret->ca_names = sk;
|
||||
for (i = 0; i < sk_X509_NAME_num(sk); i++) {
|
||||
xn = sk_X509_NAME_value(sk, i);
|
||||
if (sk_X509_NAME_set(sk, i, X509_NAME_dup(xn)) == NULL) {
|
||||
X509_NAME_free(xn);
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!dup_ca_names(&ret->ca_names, s->ca_names)
|
||||
|| !dup_ca_names(&ret->client_ca_names, s->client_ca_names))
|
||||
goto err;
|
||||
|
||||
return ret;
|
||||
|
||||
err:
|
||||
|
||||
+11
-2
@@ -892,9 +892,11 @@ struct ssl_ctx_st {
|
||||
/*
|
||||
* What we put in certificate_authorities extension for TLS 1.3
|
||||
* (ClientHello and CertificateRequest) or just client cert requests for
|
||||
* earlier versions.
|
||||
* earlier versions. If client_ca_names is populated then it is only used
|
||||
* for client cert requests, and in preference to ca_names.
|
||||
*/
|
||||
STACK_OF(X509_NAME) *ca_names;
|
||||
STACK_OF(X509_NAME) *client_ca_names;
|
||||
|
||||
/*
|
||||
* Default values to use in SSL structures follow (these are copied by
|
||||
@@ -1273,8 +1275,14 @@ struct ssl_st {
|
||||
long verify_result;
|
||||
/* extra application data */
|
||||
CRYPTO_EX_DATA ex_data;
|
||||
/* for server side, keep the list of CA_dn we can use */
|
||||
/*
|
||||
* What we put in certificate_authorities extension for TLS 1.3
|
||||
* (ClientHello and CertificateRequest) or just client cert requests for
|
||||
* earlier versions. If client_ca_names is populated then it is only used
|
||||
* for client cert requests, and in preference to ca_names.
|
||||
*/
|
||||
STACK_OF(X509_NAME) *ca_names;
|
||||
STACK_OF(X509_NAME) *client_ca_names;
|
||||
CRYPTO_REF_COUNT references;
|
||||
/* protocol behaviour */
|
||||
uint32_t options;
|
||||
@@ -2611,6 +2619,7 @@ __owur int tls1_process_sigalgs(SSL *s);
|
||||
__owur int tls1_set_peer_legacy_sigalg(SSL *s, const EVP_PKEY *pkey);
|
||||
__owur int tls1_lookup_md(const SIGALG_LOOKUP *lu, const EVP_MD **pmd);
|
||||
__owur size_t tls12_get_psigalgs(SSL *s, int sent, const uint16_t **psigs);
|
||||
__owur int tls_check_sigalg_curve(const SSL *s, int curve);
|
||||
__owur int tls12_check_peer_sigalg(SSL *s, uint16_t, EVP_PKEY *pkey);
|
||||
__owur int ssl_set_client_disabled(SSL *s);
|
||||
__owur int ssl_cipher_disabled(SSL *s, const SSL_CIPHER *c, int op, int echde);
|
||||
|
||||
@@ -1198,7 +1198,7 @@ static EXT_RETURN tls_construct_certificate_authorities(SSL *s, WPACKET *pkt,
|
||||
X509 *x,
|
||||
size_t chainidx)
|
||||
{
|
||||
const STACK_OF(X509_NAME) *ca_sk = SSL_get0_CA_list(s);
|
||||
const STACK_OF(X509_NAME) *ca_sk = get_ca_names(s);
|
||||
|
||||
if (ca_sk == NULL || sk_X509_NAME_num(ca_sk) == 0)
|
||||
return EXT_RETURN_NOT_SENT;
|
||||
@@ -1211,7 +1211,7 @@ static EXT_RETURN tls_construct_certificate_authorities(SSL *s, WPACKET *pkt,
|
||||
return EXT_RETURN_FAIL;
|
||||
}
|
||||
|
||||
if (!construct_ca_names(s, pkt)) {
|
||||
if (!construct_ca_names(s, ca_sk, pkt)) {
|
||||
/* SSLfatal() already called */
|
||||
return EXT_RETURN_FAIL;
|
||||
}
|
||||
|
||||
+32
-4
@@ -1506,7 +1506,8 @@ static int ssl_method_error(const SSL *s, const SSL_METHOD *method)
|
||||
*/
|
||||
static int is_tls13_capable(const SSL *s)
|
||||
{
|
||||
int i;
|
||||
int i, curve;
|
||||
EC_KEY *eckey;
|
||||
|
||||
#ifndef OPENSSL_NO_PSK
|
||||
if (s->psk_server_callback != NULL)
|
||||
@@ -1527,7 +1528,20 @@ static int is_tls13_capable(const SSL *s)
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (ssl_has_cert(s, i))
|
||||
if (!ssl_has_cert(s, i))
|
||||
continue;
|
||||
if (i != SSL_PKEY_ECC)
|
||||
return 1;
|
||||
/*
|
||||
* Prior to TLSv1.3 sig algs allowed any curve to be used. TLSv1.3 is
|
||||
* more restrictive so check that our sig algs are consistent with this
|
||||
* EC cert. See section 4.2.3 of RFC8446.
|
||||
*/
|
||||
eckey = EVP_PKEY_get0_EC_KEY(s->cert->pkeys[SSL_PKEY_ECC].privatekey);
|
||||
if (eckey == NULL)
|
||||
continue;
|
||||
curve = EC_GROUP_get_curve_name(EC_KEY_get0_group(eckey));
|
||||
if (tls_check_sigalg_curve(s, curve))
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -2295,10 +2309,24 @@ int parse_ca_names(SSL *s, PACKET *pkt)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int construct_ca_names(SSL *s, WPACKET *pkt)
|
||||
const STACK_OF(X509_NAME) *get_ca_names(SSL *s)
|
||||
{
|
||||
const STACK_OF(X509_NAME) *ca_sk = SSL_get0_CA_list(s);
|
||||
const STACK_OF(X509_NAME) *ca_sk = NULL;;
|
||||
|
||||
if (s->server) {
|
||||
ca_sk = SSL_get_client_CA_list(s);
|
||||
if (ca_sk != NULL && sk_X509_NAME_num(ca_sk) == 0)
|
||||
ca_sk = NULL;
|
||||
}
|
||||
|
||||
if (ca_sk == NULL)
|
||||
ca_sk = SSL_get0_CA_list(s);
|
||||
|
||||
return ca_sk;
|
||||
}
|
||||
|
||||
int construct_ca_names(SSL *s, const STACK_OF(X509_NAME) *ca_sk, WPACKET *pkt)
|
||||
{
|
||||
/* Start sub-packet for client CA list */
|
||||
if (!WPACKET_start_sub_packet_u16(pkt)) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_CONSTRUCT_CA_NAMES,
|
||||
|
||||
@@ -61,7 +61,8 @@ int create_synthetic_message_hash(SSL *s, const unsigned char *hashval,
|
||||
size_t hashlen, const unsigned char *hrr,
|
||||
size_t hrrlen);
|
||||
int parse_ca_names(SSL *s, PACKET *pkt);
|
||||
int construct_ca_names(SSL *s, WPACKET *pkt);
|
||||
const STACK_OF(X509_NAME) *get_ca_names(SSL *s);
|
||||
int construct_ca_names(SSL *s, const STACK_OF(X509_NAME) *ca_sk, WPACKET *pkt);
|
||||
size_t construct_key_exchange_tbs(SSL *s, unsigned char **ptbs,
|
||||
const void *param, size_t paramlen);
|
||||
|
||||
|
||||
@@ -2881,7 +2881,7 @@ int tls_construct_certificate_request(SSL *s, WPACKET *pkt)
|
||||
}
|
||||
}
|
||||
|
||||
if (!construct_ca_names(s, pkt)) {
|
||||
if (!construct_ca_names(s, get_ca_names(s), pkt)) {
|
||||
/* SSLfatal() already called */
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -949,6 +949,37 @@ size_t tls12_get_psigalgs(SSL *s, int sent, const uint16_t **psigs)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Called by servers only. Checks that we have a sig alg that supports the
|
||||
* specified EC curve.
|
||||
*/
|
||||
int tls_check_sigalg_curve(const SSL *s, int curve)
|
||||
{
|
||||
const uint16_t *sigs;
|
||||
size_t siglen, i;
|
||||
|
||||
if (s->cert->conf_sigalgs) {
|
||||
sigs = s->cert->conf_sigalgs;
|
||||
siglen = s->cert->conf_sigalgslen;
|
||||
} else {
|
||||
sigs = tls12_sigalgs;
|
||||
siglen = OSSL_NELEM(tls12_sigalgs);
|
||||
}
|
||||
|
||||
for (i = 0; i < siglen; i++) {
|
||||
const SIGALG_LOOKUP *lu = tls1_lookup_sigalg(sigs[i]);
|
||||
|
||||
if (lu == NULL)
|
||||
continue;
|
||||
if (lu->sig == EVP_PKEY_EC
|
||||
&& lu->curve != NID_undef
|
||||
&& curve == lu->curve)
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check signature algorithm is consistent with sent supported signature
|
||||
* algorithms and if so set relevant digest and signature scheme in
|
||||
@@ -1091,6 +1122,14 @@ int SSL_get_peer_signature_type_nid(const SSL *s, int *pnid)
|
||||
return 1;
|
||||
}
|
||||
|
||||
int SSL_get_signature_type_nid(const SSL *s, int *pnid)
|
||||
{
|
||||
if (s->s3->tmp.sigalg == NULL)
|
||||
return 0;
|
||||
*pnid = s->s3->tmp.sigalg->sig;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set a mask of disabled algorithms: an algorithm is disabled if it isn't
|
||||
* supported, doesn't appear in supported signature algorithms, isn't supported
|
||||
|
||||
Reference in New Issue
Block a user