Latest update.
This commit is contained in:
+2
-1
@@ -8,6 +8,7 @@
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <openssl/macros.h>
|
||||
#include <openssl/objects.h>
|
||||
#include "ssl_local.h"
|
||||
|
||||
@@ -172,7 +173,7 @@ IMPLEMENT_dtls1_meth_func(DTLS_ANY_VERSION, 0, 0,
|
||||
DTLS_client_method,
|
||||
ssl_undefined_function,
|
||||
ossl_statem_connect, DTLSv1_2_enc_data)
|
||||
#if !OPENSSL_API_1_1_0
|
||||
#ifndef OPENSSL_NO_DEPRECATED_1_1_0
|
||||
# ifndef OPENSSL_NO_TLS1_2_METHOD
|
||||
const SSL_METHOD *TLSv1_2_method(void)
|
||||
{
|
||||
|
||||
@@ -426,6 +426,7 @@ int ssl3_write_bytes(SSL *s, int type, const void *buf_, size_t len,
|
||||
len >= 4 * (max_send_fragment = ssl_get_max_send_fragment(s)) &&
|
||||
s->compress == NULL && s->msg_callback == NULL &&
|
||||
!SSL_WRITE_ETM(s) && SSL_USE_EXPLICIT_IV(s) &&
|
||||
(BIO_get_ktls_send(s->wbio) == 0) &&
|
||||
EVP_CIPHER_flags(EVP_CIPHER_CTX_cipher(s->enc_write_ctx)) &
|
||||
EVP_CIPH_FLAG_TLS1_1_MULTIBLOCK) {
|
||||
unsigned char aad[13];
|
||||
@@ -985,7 +986,7 @@ int do_ssl3_write(SSL *s, int type, const unsigned char *buf,
|
||||
* in the wb->buf
|
||||
*/
|
||||
|
||||
if (!SSL_WRITE_ETM(s) && mac_size != 0) {
|
||||
if (!BIO_get_ktls_send(s->wbio) && !SSL_WRITE_ETM(s) && mac_size != 0) {
|
||||
unsigned char *mac;
|
||||
|
||||
if (!WPACKET_allocate_bytes(thispkt, mac_size, &mac)
|
||||
|
||||
@@ -870,7 +870,7 @@ int ssl3_do_compress(SSL *ssl, SSL3_RECORD *wr)
|
||||
* SSLfatal() for internal errors, but not otherwise.
|
||||
*
|
||||
* Returns:
|
||||
* 0: (in non-constant time) if the record is publically invalid (i.e. too
|
||||
* 0: (in non-constant time) if the record is publicly invalid (i.e. too
|
||||
* short etc).
|
||||
* 1: if the record's padding is valid / the encryption was successful.
|
||||
* -1: if the record's padding is invalid or, if sending, an internal error
|
||||
@@ -961,7 +961,7 @@ int ssl3_enc(SSL *s, SSL3_RECORD *inrecs, size_t n_recs, int sending)
|
||||
* internal errors, but not otherwise.
|
||||
*
|
||||
* Returns:
|
||||
* 0: (in non-constant time) if the record is publically invalid (i.e. too
|
||||
* 0: (in non-constant time) if the record is publicly invalid (i.e. too
|
||||
* short etc).
|
||||
* 1: if the record's padding is valid / the encryption was successful.
|
||||
* -1: if the record's padding/AEAD-authenticator is invalid or, if sending,
|
||||
@@ -1108,7 +1108,7 @@ int tls1_enc(SSL *s, SSL3_RECORD *recs, size_t n_recs, int sending)
|
||||
} else if ((bs != 1) && sending) {
|
||||
padnum = bs - (reclen[ctr] % bs);
|
||||
|
||||
/* Add weird padding of upto 256 bytes */
|
||||
/* Add weird padding of up to 256 bytes */
|
||||
|
||||
if (padnum > MAX_PADDING) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS1_ENC,
|
||||
@@ -1688,7 +1688,7 @@ int dtls1_process_record(SSL *s, DTLS1_BITMAP *bitmap)
|
||||
enc_err = s->method->ssl3_enc->enc(s, rr, 1, 0);
|
||||
/*-
|
||||
* enc_err is:
|
||||
* 0: (in non-constant time) if the record is publically invalid.
|
||||
* 0: (in non-constant time) if the record is publicly invalid.
|
||||
* 1: if the padding is valid
|
||||
* -1: if the padding is invalid
|
||||
*/
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
* internal errors, but not otherwise.
|
||||
*
|
||||
* Returns:
|
||||
* 0: (in non-constant time) if the record is publically invalid (i.e. too
|
||||
* 0: (in non-constant time) if the record is publicly invalid (i.e. too
|
||||
* short etc).
|
||||
* 1: if the record encryption was successful.
|
||||
* -1: if the record's AEAD-authenticator is invalid or, if sending,
|
||||
|
||||
+1
-1
@@ -3939,7 +3939,7 @@ long ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg)
|
||||
srp_password_from_info_cb;
|
||||
if (ctx->srp_ctx.info != NULL)
|
||||
OPENSSL_free(ctx->srp_ctx.info);
|
||||
if ((ctx->srp_ctx.info = BUF_strdup((char *)parg)) == NULL) {
|
||||
if ((ctx->srp_ctx.info = OPENSSL_strdup((char *)parg)) == NULL) {
|
||||
SSLerr(SSL_F_SSL3_CTX_CTRL, ERR_R_INTERNAL_ERROR);
|
||||
return 0;
|
||||
}
|
||||
|
||||
+66
-28
@@ -15,6 +15,7 @@
|
||||
#include "internal/o_dir.h"
|
||||
#include <openssl/bio.h>
|
||||
#include <openssl/pem.h>
|
||||
#include <openssl/store.h>
|
||||
#include <openssl/x509v3.h>
|
||||
#include <openssl/dh.h>
|
||||
#include <openssl/bn.h>
|
||||
@@ -601,14 +602,6 @@ static unsigned long xname_hash(const X509_NAME *a)
|
||||
return X509_NAME_hash((X509_NAME *)a);
|
||||
}
|
||||
|
||||
/**
|
||||
* Load CA certs from a file into a ::STACK. Note that it is somewhat misnamed;
|
||||
* it doesn't really have anything to do with clients (except that a common use
|
||||
* for a stack of CAs is to send it to the client). Actually, it doesn't have
|
||||
* much to do with CAs, either, since it will load any old cert.
|
||||
* \param file the file containing one or more certs.
|
||||
* \return a ::STACK containing the certs.
|
||||
*/
|
||||
STACK_OF(X509_NAME) *SSL_load_client_CA_file(const char *file)
|
||||
{
|
||||
BIO *in = BIO_new(BIO_s_file());
|
||||
@@ -666,15 +659,6 @@ STACK_OF(X509_NAME) *SSL_load_client_CA_file(const char *file)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a file of certs to a stack.
|
||||
* \param stack the stack to add to.
|
||||
* \param file the file to add from. All certs in this file that are not
|
||||
* already in the stack will be added.
|
||||
* \return 1 for success, 0 for failure. Note that in the case of failure some
|
||||
* certs may have been added to \c stack.
|
||||
*/
|
||||
|
||||
int SSL_add_file_cert_subjects_to_stack(STACK_OF(X509_NAME) *stack,
|
||||
const char *file)
|
||||
{
|
||||
@@ -725,17 +709,6 @@ int SSL_add_file_cert_subjects_to_stack(STACK_OF(X509_NAME) *stack,
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a directory of certs to a stack.
|
||||
* \param stack the stack to append to.
|
||||
* \param dir the directory to append from. All files in this directory will be
|
||||
* examined as potential certs. Any that are acceptable to
|
||||
* SSL_add_dir_cert_subjects_to_stack() that are not already in the stack will be
|
||||
* included.
|
||||
* \return 1 for success, 0 for failure. Note that in the case of failure some
|
||||
* certs may have been added to \c stack.
|
||||
*/
|
||||
|
||||
int SSL_add_dir_cert_subjects_to_stack(STACK_OF(X509_NAME) *stack,
|
||||
const char *dir)
|
||||
{
|
||||
@@ -782,6 +755,71 @@ int SSL_add_dir_cert_subjects_to_stack(STACK_OF(X509_NAME) *stack,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int add_uris_recursive(STACK_OF(X509_NAME) *stack,
|
||||
const char *uri, int depth)
|
||||
{
|
||||
int ok = 1;
|
||||
OSSL_STORE_CTX *ctx = NULL;
|
||||
X509 *x = NULL;
|
||||
X509_NAME *xn = NULL;
|
||||
|
||||
if ((ctx = OSSL_STORE_open(uri, NULL, NULL, NULL, NULL)) == NULL)
|
||||
goto err;
|
||||
|
||||
while (!OSSL_STORE_eof(ctx) && !OSSL_STORE_error(ctx)) {
|
||||
OSSL_STORE_INFO *info = OSSL_STORE_load(ctx);
|
||||
int infotype = info == 0 ? 0 : OSSL_STORE_INFO_get_type(info);
|
||||
|
||||
if (info == NULL)
|
||||
continue;
|
||||
|
||||
if (infotype == OSSL_STORE_INFO_NAME) {
|
||||
/*
|
||||
* This is an entry in the "directory" represented by the current
|
||||
* uri. if |depth| allows, dive into it.
|
||||
*/
|
||||
if (depth > 0)
|
||||
ok = add_uris_recursive(stack, OSSL_STORE_INFO_get0_NAME(info),
|
||||
depth - 1);
|
||||
} else if (infotype == OSSL_STORE_INFO_CERT) {
|
||||
if ((x = OSSL_STORE_INFO_get0_CERT(info)) == NULL
|
||||
|| (xn = X509_get_subject_name(x)) == NULL
|
||||
|| (xn = X509_NAME_dup(xn)) == NULL)
|
||||
goto err;
|
||||
if (sk_X509_NAME_find(stack, xn) >= 0) {
|
||||
/* Duplicate. */
|
||||
X509_NAME_free(xn);
|
||||
} else if (!sk_X509_NAME_push(stack, xn)) {
|
||||
X509_NAME_free(xn);
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
|
||||
OSSL_STORE_INFO_free(info);
|
||||
}
|
||||
|
||||
ERR_clear_error();
|
||||
goto done;
|
||||
|
||||
err:
|
||||
ok = 0;
|
||||
done:
|
||||
OSSL_STORE_close(ctx);
|
||||
|
||||
return ok;
|
||||
}
|
||||
|
||||
int SSL_add_store_cert_subjects_to_stack(STACK_OF(X509_NAME) *stack,
|
||||
const char *store)
|
||||
{
|
||||
int (*oldcmp) (const X509_NAME *const *a, const X509_NAME *const *b)
|
||||
= sk_X509_NAME_set_cmp_func(stack, xname_sk_cmp);
|
||||
int ret = add_uris_recursive(stack, store, 1);
|
||||
|
||||
(void)sk_X509_NAME_set_cmp_func(stack, oldcmp);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Build a certificate chain for current certificate */
|
||||
int ssl_build_cert_chain(SSL *s, SSL_CTX *ctx, int flags)
|
||||
{
|
||||
|
||||
+1
-8
@@ -466,7 +466,6 @@ DEFINE_RUN_ONCE_STATIC(do_load_builtin_compressions)
|
||||
SSL_COMP *comp = NULL;
|
||||
COMP_METHOD *method = COMP_zlib();
|
||||
|
||||
CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_DISABLE);
|
||||
ssl_comp_methods = sk_SSL_COMP_new(sk_comp_cmp);
|
||||
|
||||
if (COMP_get_type(method) != NID_undef && ssl_comp_methods != NULL) {
|
||||
@@ -479,7 +478,6 @@ DEFINE_RUN_ONCE_STATIC(do_load_builtin_compressions)
|
||||
sk_SSL_COMP_sort(ssl_comp_methods);
|
||||
}
|
||||
}
|
||||
CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ENABLE);
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -1648,7 +1646,7 @@ STACK_OF(SSL_CIPHER) *ssl_create_cipher_list(const SSL_METHOD *ssl_method,
|
||||
rule_p++;
|
||||
}
|
||||
|
||||
if (ok && (strlen(rule_p) > 0))
|
||||
if (ok && (rule_p[0] != '\0'))
|
||||
ok = ssl_cipher_process_rulestr(rule_p, &head, &tail, ca_list, c);
|
||||
|
||||
OPENSSL_free(ca_list); /* Not needed anymore */
|
||||
@@ -2071,10 +2069,8 @@ int SSL_COMP_add_compression_method(int id, COMP_METHOD *cm)
|
||||
return 1;
|
||||
}
|
||||
|
||||
CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_DISABLE);
|
||||
comp = OPENSSL_malloc(sizeof(*comp));
|
||||
if (comp == NULL) {
|
||||
CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ENABLE);
|
||||
SSLerr(SSL_F_SSL_COMP_ADD_COMPRESSION_METHOD, ERR_R_MALLOC_FAILURE);
|
||||
return 1;
|
||||
}
|
||||
@@ -2084,18 +2080,15 @@ int SSL_COMP_add_compression_method(int id, COMP_METHOD *cm)
|
||||
load_builtin_compressions();
|
||||
if (ssl_comp_methods && sk_SSL_COMP_find(ssl_comp_methods, comp) >= 0) {
|
||||
OPENSSL_free(comp);
|
||||
CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ENABLE);
|
||||
SSLerr(SSL_F_SSL_COMP_ADD_COMPRESSION_METHOD,
|
||||
SSL_R_DUPLICATE_COMPRESSION_ID);
|
||||
return 1;
|
||||
}
|
||||
if (ssl_comp_methods == NULL || !sk_SSL_COMP_push(ssl_comp_methods, comp)) {
|
||||
OPENSSL_free(comp);
|
||||
CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ENABLE);
|
||||
SSLerr(SSL_F_SSL_COMP_ADD_COMPRESSION_METHOD, ERR_R_MALLOC_FAILURE);
|
||||
return 1;
|
||||
}
|
||||
CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ENABLE);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
+48
-6
@@ -455,10 +455,12 @@ static int cmd_ServerInfoFile(SSL_CONF_CTX *cctx, const char *value)
|
||||
}
|
||||
|
||||
static int do_store(SSL_CONF_CTX *cctx,
|
||||
const char *CAfile, const char *CApath, int verify_store)
|
||||
const char *CAfile, const char *CApath, const char *CAstore,
|
||||
int verify_store)
|
||||
{
|
||||
CERT *cert;
|
||||
X509_STORE **st;
|
||||
|
||||
if (cctx->ctx)
|
||||
cert = cctx->ctx->cert;
|
||||
else if (cctx->ssl)
|
||||
@@ -471,27 +473,44 @@ static int do_store(SSL_CONF_CTX *cctx,
|
||||
if (*st == NULL)
|
||||
return 0;
|
||||
}
|
||||
return X509_STORE_load_locations(*st, CAfile, CApath) > 0;
|
||||
|
||||
if (CAfile != NULL && !X509_STORE_load_file(*st, CAfile))
|
||||
return 0;
|
||||
if (CApath != NULL && !X509_STORE_load_path(*st, CApath))
|
||||
return 0;
|
||||
if (CAstore != NULL && !X509_STORE_load_store(*st, CAstore))
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int cmd_ChainCAPath(SSL_CONF_CTX *cctx, const char *value)
|
||||
{
|
||||
return do_store(cctx, NULL, value, 0);
|
||||
return do_store(cctx, NULL, value, NULL, 0);
|
||||
}
|
||||
|
||||
static int cmd_ChainCAFile(SSL_CONF_CTX *cctx, const char *value)
|
||||
{
|
||||
return do_store(cctx, value, NULL, 0);
|
||||
return do_store(cctx, value, NULL, NULL, 0);
|
||||
}
|
||||
|
||||
static int cmd_ChainCAStore(SSL_CONF_CTX *cctx, const char *value)
|
||||
{
|
||||
return do_store(cctx, NULL, NULL, value, 0);
|
||||
}
|
||||
|
||||
static int cmd_VerifyCAPath(SSL_CONF_CTX *cctx, const char *value)
|
||||
{
|
||||
return do_store(cctx, NULL, value, 1);
|
||||
return do_store(cctx, NULL, value, NULL, 1);
|
||||
}
|
||||
|
||||
static int cmd_VerifyCAFile(SSL_CONF_CTX *cctx, const char *value)
|
||||
{
|
||||
return do_store(cctx, value, NULL, 1);
|
||||
return do_store(cctx, value, NULL, NULL, 1);
|
||||
}
|
||||
|
||||
static int cmd_VerifyCAStore(SSL_CONF_CTX *cctx, const char *value)
|
||||
{
|
||||
return do_store(cctx, NULL, NULL, value, 1);
|
||||
}
|
||||
|
||||
static int cmd_RequestCAFile(SSL_CONF_CTX *cctx, const char *value)
|
||||
@@ -522,6 +541,20 @@ static int cmd_ClientCAPath(SSL_CONF_CTX *cctx, const char *value)
|
||||
return cmd_RequestCAPath(cctx, value);
|
||||
}
|
||||
|
||||
static int cmd_RequestCAStore(SSL_CONF_CTX *cctx, const char *value)
|
||||
{
|
||||
if (cctx->canames == NULL)
|
||||
cctx->canames = sk_X509_NAME_new_null();
|
||||
if (cctx->canames == NULL)
|
||||
return 0;
|
||||
return SSL_add_store_cert_subjects_to_stack(cctx->canames, value);
|
||||
}
|
||||
|
||||
static int cmd_ClientCAStore(SSL_CONF_CTX *cctx, const char *value)
|
||||
{
|
||||
return cmd_RequestCAStore(cctx, value);
|
||||
}
|
||||
|
||||
#ifndef OPENSSL_NO_DH
|
||||
static int cmd_DHParameters(SSL_CONF_CTX *cctx, const char *value)
|
||||
{
|
||||
@@ -651,10 +684,14 @@ static const ssl_conf_cmd_tbl ssl_conf_cmds[] = {
|
||||
SSL_CONF_TYPE_DIR),
|
||||
SSL_CONF_CMD(ChainCAFile, "chainCAfile", SSL_CONF_FLAG_CERTIFICATE,
|
||||
SSL_CONF_TYPE_FILE),
|
||||
SSL_CONF_CMD(ChainCAStore, "chainCAstore", SSL_CONF_FLAG_CERTIFICATE,
|
||||
SSL_CONF_TYPE_STORE),
|
||||
SSL_CONF_CMD(VerifyCAPath, "verifyCApath", SSL_CONF_FLAG_CERTIFICATE,
|
||||
SSL_CONF_TYPE_DIR),
|
||||
SSL_CONF_CMD(VerifyCAFile, "verifyCAfile", SSL_CONF_FLAG_CERTIFICATE,
|
||||
SSL_CONF_TYPE_FILE),
|
||||
SSL_CONF_CMD(VerifyCAStore, "verifyCAstore", SSL_CONF_FLAG_CERTIFICATE,
|
||||
SSL_CONF_TYPE_STORE),
|
||||
SSL_CONF_CMD(RequestCAFile, "requestCAFile", SSL_CONF_FLAG_CERTIFICATE,
|
||||
SSL_CONF_TYPE_FILE),
|
||||
SSL_CONF_CMD(ClientCAFile, NULL,
|
||||
@@ -665,6 +702,11 @@ static const ssl_conf_cmd_tbl ssl_conf_cmds[] = {
|
||||
SSL_CONF_CMD(ClientCAPath, NULL,
|
||||
SSL_CONF_FLAG_SERVER | SSL_CONF_FLAG_CERTIFICATE,
|
||||
SSL_CONF_TYPE_DIR),
|
||||
SSL_CONF_CMD(RequestCAStore, "requestCAStore", SSL_CONF_FLAG_CERTIFICATE,
|
||||
SSL_CONF_TYPE_STORE),
|
||||
SSL_CONF_CMD(ClientCAStore, NULL,
|
||||
SSL_CONF_FLAG_SERVER | SSL_CONF_FLAG_CERTIFICATE,
|
||||
SSL_CONF_TYPE_STORE),
|
||||
#ifndef OPENSSL_NO_DH
|
||||
SSL_CONF_CMD(DHParameters, "dhparam",
|
||||
SSL_CONF_FLAG_SERVER | SSL_CONF_FLAG_CERTIFICATE,
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Generated by util/mkerr.pl DO NOT EDIT
|
||||
* Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved.
|
||||
* Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License 2.0 (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
|
||||
+59
-17
@@ -1261,9 +1261,9 @@ void SSL_free(SSL *s)
|
||||
#ifndef OPENSSL_NO_EC
|
||||
OPENSSL_free(s->ext.ecpointformats);
|
||||
OPENSSL_free(s->ext.peer_ecpointformats);
|
||||
#endif /* OPENSSL_NO_EC */
|
||||
OPENSSL_free(s->ext.supportedgroups);
|
||||
OPENSSL_free(s->ext.peer_supportedgroups);
|
||||
#endif /* OPENSSL_NO_EC */
|
||||
sk_X509_EXTENSION_pop_free(s->ext.ocsp.exts, X509_EXTENSION_free);
|
||||
#ifndef OPENSSL_NO_OCSP
|
||||
sk_OCSP_RESPID_pop_free(s->ext.ocsp.ids, OCSP_RESPID_free);
|
||||
@@ -2127,11 +2127,11 @@ ossl_ssize_t SSL_sendfile(SSL *s, int fd, off_t offset, size_t size, int flags)
|
||||
return -1;
|
||||
}
|
||||
|
||||
#ifndef OPENSSL_NO_KTLS
|
||||
ret = ktls_sendfile(SSL_get_wfd(s), fd, offset, size, flags);
|
||||
#ifdef OPENSSL_NO_KTLS
|
||||
ERR_raise_data(ERR_LIB_SYS, ERR_R_INTERNAL_ERROR, "calling sendfile()");
|
||||
return -1;
|
||||
#else
|
||||
ret = -1;
|
||||
#endif
|
||||
ret = ktls_sendfile(SSL_get_wfd(s), fd, offset, size, flags);
|
||||
if (ret < 0) {
|
||||
#if defined(EAGAIN) && defined(EINTR) && defined(EBUSY)
|
||||
if ((get_last_sys_error() == EAGAIN) ||
|
||||
@@ -2140,16 +2140,12 @@ ossl_ssize_t SSL_sendfile(SSL *s, int fd, off_t offset, size_t size, int flags)
|
||||
BIO_set_retry_write(s->wbio);
|
||||
else
|
||||
#endif
|
||||
#ifdef OPENSSL_NO_KTLS
|
||||
ERR_raise_data(ERR_LIB_SYS, get_last_sys_error(),
|
||||
"calling sendfile()");
|
||||
#else
|
||||
SSLerr(SSL_F_SSL_SENDFILE, SSL_R_UNINITIALIZED);
|
||||
#endif
|
||||
return ret;
|
||||
}
|
||||
s->rwstate = SSL_NOTHING;
|
||||
return ret;
|
||||
#endif
|
||||
}
|
||||
|
||||
int SSL_write(SSL *s, const void *buf, int num)
|
||||
@@ -3350,8 +3346,8 @@ void SSL_CTX_free(SSL_CTX *a)
|
||||
|
||||
#ifndef OPENSSL_NO_EC
|
||||
OPENSSL_free(a->ext.ecpointformats);
|
||||
OPENSSL_free(a->ext.supportedgroups);
|
||||
#endif
|
||||
OPENSSL_free(a->ext.supportedgroups);
|
||||
OPENSSL_free(a->ext.alpn);
|
||||
OPENSSL_secure_free(a->ext.secure);
|
||||
|
||||
@@ -4246,10 +4242,13 @@ int SSL_CTX_set_default_verify_dir(SSL_CTX *ctx)
|
||||
lookup = X509_STORE_add_lookup(ctx->cert_store, X509_LOOKUP_hash_dir());
|
||||
if (lookup == NULL)
|
||||
return 0;
|
||||
|
||||
/* We ignore errors, in case the directory doesn't exist */
|
||||
ERR_set_mark();
|
||||
|
||||
X509_LOOKUP_add_dir(lookup, NULL, X509_FILETYPE_DEFAULT);
|
||||
|
||||
/* Clear any errors if the default directory does not exist */
|
||||
ERR_clear_error();
|
||||
ERR_pop_to_mark();
|
||||
|
||||
return 1;
|
||||
}
|
||||
@@ -4262,19 +4261,62 @@ int SSL_CTX_set_default_verify_file(SSL_CTX *ctx)
|
||||
if (lookup == NULL)
|
||||
return 0;
|
||||
|
||||
/* We ignore errors, in case the directory doesn't exist */
|
||||
ERR_set_mark();
|
||||
|
||||
X509_LOOKUP_load_file(lookup, NULL, X509_FILETYPE_DEFAULT);
|
||||
|
||||
/* Clear any errors if the default file does not exist */
|
||||
ERR_clear_error();
|
||||
ERR_pop_to_mark();
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int SSL_CTX_set_default_verify_store(SSL_CTX *ctx)
|
||||
{
|
||||
X509_LOOKUP *lookup;
|
||||
|
||||
lookup = X509_STORE_add_lookup(ctx->cert_store, X509_LOOKUP_store());
|
||||
if (lookup == NULL)
|
||||
return 0;
|
||||
|
||||
/* We ignore errors, in case the directory doesn't exist */
|
||||
ERR_set_mark();
|
||||
|
||||
X509_LOOKUP_add_store(lookup, NULL);
|
||||
|
||||
ERR_pop_to_mark();
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int SSL_CTX_load_verify_file(SSL_CTX *ctx, const char *CAfile)
|
||||
{
|
||||
return X509_STORE_load_file(ctx->cert_store, CAfile);
|
||||
}
|
||||
|
||||
int SSL_CTX_load_verify_dir(SSL_CTX *ctx, const char *CApath)
|
||||
{
|
||||
return X509_STORE_load_path(ctx->cert_store, CApath);
|
||||
}
|
||||
|
||||
int SSL_CTX_load_verify_store(SSL_CTX *ctx, const char *CAstore)
|
||||
{
|
||||
return X509_STORE_load_store(ctx->cert_store, CAstore);
|
||||
}
|
||||
|
||||
#ifndef OPENSSL_NO_DEPRECATED_3_0
|
||||
int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile,
|
||||
const char *CApath)
|
||||
{
|
||||
return X509_STORE_load_locations(ctx->cert_store, CAfile, CApath);
|
||||
if (CAfile == NULL && CApath == NULL)
|
||||
return 0;
|
||||
if (CAfile != NULL && !SSL_CTX_load_verify_file(ctx, CAfile))
|
||||
return 0;
|
||||
if (CApath != NULL && !SSL_CTX_load_verify_dir(ctx, CApath))
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
void SSL_set_info_callback(SSL *ssl,
|
||||
void (*cb) (const SSL *ssl, int type, int val))
|
||||
@@ -4687,7 +4729,7 @@ int SSL_is_server(const SSL *s)
|
||||
return s->server;
|
||||
}
|
||||
|
||||
#if !OPENSSL_API_1_1_0
|
||||
#ifndef OPENSSL_NO_DEPRECATED_1_1_0
|
||||
void SSL_set_debug(SSL *s, int debug)
|
||||
{
|
||||
/* Old function was do-nothing anyway... */
|
||||
|
||||
+62
-19
@@ -10,7 +10,7 @@
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include "ssl_locl.h"
|
||||
#include "ssl_local.h"
|
||||
#include "e_os.h"
|
||||
#include <openssl/objects.h>
|
||||
#include <openssl/x509v3.h>
|
||||
@@ -877,7 +877,7 @@ int SSL_up_ref(SSL *s)
|
||||
int SSL_CTX_set_session_id_context(SSL_CTX *ctx, const unsigned char *sid_ctx,
|
||||
unsigned int sid_ctx_len)
|
||||
{
|
||||
if (sid_ctx_len > sizeof(ctx->sid_ctx)) {
|
||||
if (sid_ctx_len > SSL_MAX_SID_CTX_LENGTH) {
|
||||
SSLerr(SSL_F_SSL_CTX_SET_SESSION_ID_CONTEXT,
|
||||
SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG);
|
||||
return 0;
|
||||
@@ -1195,9 +1195,9 @@ void SSL_free(SSL *s)
|
||||
#ifndef OPENSSL_NO_EC
|
||||
OPENSSL_free(s->ext.ecpointformats);
|
||||
OPENSSL_free(s->ext.peer_ecpointformats);
|
||||
#endif /* OPENSSL_NO_EC */
|
||||
OPENSSL_free(s->ext.supportedgroups);
|
||||
OPENSSL_free(s->ext.peer_supportedgroups);
|
||||
#endif /* OPENSSL_NO_EC */
|
||||
sk_X509_EXTENSION_pop_free(s->ext.ocsp.exts, X509_EXTENSION_free);
|
||||
#ifndef OPENSSL_NO_OCSP
|
||||
sk_OCSP_RESPID_pop_free(s->ext.ocsp.ids, OCSP_RESPID_free);
|
||||
@@ -2061,11 +2061,11 @@ ossl_ssize_t SSL_sendfile(SSL *s, int fd, off_t offset, size_t size, int flags)
|
||||
return -1;
|
||||
}
|
||||
|
||||
#ifndef OPENSSL_NO_KTLS
|
||||
ret = ktls_sendfile(SSL_get_wfd(s), fd, offset, size, flags);
|
||||
#ifdef OPENSSL_NO_KTLS
|
||||
ERR_raise_data(ERR_LIB_SYS, ERR_R_INTERNAL_ERROR, "calling sendfile()");
|
||||
return -1;
|
||||
#else
|
||||
ret = -1;
|
||||
#endif
|
||||
ret = ktls_sendfile(SSL_get_wfd(s), fd, offset, size, flags);
|
||||
if (ret < 0) {
|
||||
#if defined(EAGAIN) && defined(EINTR) && defined(EBUSY)
|
||||
if ((get_last_sys_error() == EAGAIN) ||
|
||||
@@ -2074,15 +2074,12 @@ ossl_ssize_t SSL_sendfile(SSL *s, int fd, off_t offset, size_t size, int flags)
|
||||
BIO_set_retry_write(s->wbio);
|
||||
else
|
||||
#endif
|
||||
#ifdef OPENSSL_NO_KTLS
|
||||
SYSerr(SYS_F_SENDFILE, get_last_sys_error());
|
||||
#else
|
||||
SSLerr(SSL_F_SSL_SENDFILE, SSL_R_UNINITIALIZED);
|
||||
#endif
|
||||
return ret;
|
||||
}
|
||||
s->rwstate = SSL_NOTHING;
|
||||
return ret;
|
||||
#endif
|
||||
}
|
||||
|
||||
int SSL_write(SSL *s, const void *buf, int num)
|
||||
@@ -2856,7 +2853,7 @@ void SSL_get0_next_proto_negotiated(const SSL *s, const unsigned char **data,
|
||||
unsigned *len)
|
||||
{
|
||||
*data = s->ext.npn;
|
||||
if (!*data) {
|
||||
if (*data == NULL) {
|
||||
*len = 0;
|
||||
} else {
|
||||
*len = (unsigned int)s->ext.npn_len;
|
||||
@@ -3290,8 +3287,8 @@ void SSL_CTX_free(SSL_CTX *a)
|
||||
|
||||
#ifndef OPENSSL_NO_EC
|
||||
OPENSSL_free(a->ext.ecpointformats);
|
||||
OPENSSL_free(a->ext.supportedgroups);
|
||||
#endif
|
||||
OPENSSL_free(a->ext.supportedgroups);
|
||||
OPENSSL_free(a->ext.alpn);
|
||||
OPENSSL_secure_free(a->ext.secure);
|
||||
|
||||
@@ -4184,10 +4181,13 @@ int SSL_CTX_set_default_verify_dir(SSL_CTX *ctx)
|
||||
lookup = X509_STORE_add_lookup(ctx->cert_store, X509_LOOKUP_hash_dir());
|
||||
if (lookup == NULL)
|
||||
return 0;
|
||||
|
||||
/* We ignore errors, in case the directory doesn't exist */
|
||||
ERR_set_mark();
|
||||
|
||||
X509_LOOKUP_add_dir(lookup, NULL, X509_FILETYPE_DEFAULT);
|
||||
|
||||
/* Clear any errors if the default directory does not exist */
|
||||
ERR_clear_error();
|
||||
ERR_pop_to_mark();
|
||||
|
||||
return 1;
|
||||
}
|
||||
@@ -4200,19 +4200,62 @@ int SSL_CTX_set_default_verify_file(SSL_CTX *ctx)
|
||||
if (lookup == NULL)
|
||||
return 0;
|
||||
|
||||
/* We ignore errors, in case the directory doesn't exist */
|
||||
ERR_set_mark();
|
||||
|
||||
X509_LOOKUP_load_file(lookup, NULL, X509_FILETYPE_DEFAULT);
|
||||
|
||||
/* Clear any errors if the default file does not exist */
|
||||
ERR_clear_error();
|
||||
ERR_pop_to_mark();
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int SSL_CTX_set_default_verify_store(SSL_CTX *ctx)
|
||||
{
|
||||
X509_LOOKUP *lookup;
|
||||
|
||||
lookup = X509_STORE_add_lookup(ctx->cert_store, X509_LOOKUP_store());
|
||||
if (lookup == NULL)
|
||||
return 0;
|
||||
|
||||
/* We ignore errors, in case the directory doesn't exist */
|
||||
ERR_set_mark();
|
||||
|
||||
X509_LOOKUP_add_store(lookup, NULL);
|
||||
|
||||
ERR_pop_to_mark();
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int SSL_CTX_load_verify_file(SSL_CTX *ctx, const char *CAfile)
|
||||
{
|
||||
return X509_STORE_load_file(ctx->cert_store, CAfile);
|
||||
}
|
||||
|
||||
int SSL_CTX_load_verify_dir(SSL_CTX *ctx, const char *CApath)
|
||||
{
|
||||
return X509_STORE_load_path(ctx->cert_store, CApath);
|
||||
}
|
||||
|
||||
int SSL_CTX_load_verify_store(SSL_CTX *ctx, const char *CAstore)
|
||||
{
|
||||
return X509_STORE_load_store(ctx->cert_store, CAstore);
|
||||
}
|
||||
|
||||
#ifndef OPENSSL_NO_DEPRECATED_3_0
|
||||
int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile,
|
||||
const char *CApath)
|
||||
{
|
||||
return X509_STORE_load_locations(ctx->cert_store, CAfile, CApath);
|
||||
if (CAfile == NULL && CApath == NULL)
|
||||
return 0;
|
||||
if (CAfile != NULL && !SSL_CTX_load_verify_file(ctx, CAfile))
|
||||
return 0;
|
||||
if (CApath != NULL && !SSL_CTX_load_verify_dir(ctx, CApath))
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
void SSL_set_info_callback(SSL *ssl,
|
||||
void (*cb) (const SSL *ssl, int type, int val))
|
||||
@@ -4625,7 +4668,7 @@ int SSL_is_server(const SSL *s)
|
||||
return s->server;
|
||||
}
|
||||
|
||||
#if !OPENSSL_API_1_1_0
|
||||
#ifndef OPENSSL_NO_DEPRECATED_1_1_0
|
||||
void SSL_set_debug(SSL *s, int debug)
|
||||
{
|
||||
/* Old function was do-nothing anyway... */
|
||||
|
||||
+8
-6
@@ -914,8 +914,9 @@ int SSL_CTX_use_serverinfo_file(SSL_CTX *ctx, const char *file)
|
||||
long extension_length = 0;
|
||||
char *name = NULL;
|
||||
char *header = NULL;
|
||||
char namePrefix1[] = "SERVERINFO FOR ";
|
||||
char namePrefix2[] = "SERVERINFOV2 FOR ";
|
||||
static const char namePrefix1[] = "SERVERINFO FOR ";
|
||||
static const char namePrefix2[] = "SERVERINFOV2 FOR ";
|
||||
unsigned int name_len;
|
||||
int ret = 0;
|
||||
BIO *bin = NULL;
|
||||
size_t num_extensions = 0, contextoff = 0;
|
||||
@@ -951,19 +952,20 @@ int SSL_CTX_use_serverinfo_file(SSL_CTX *ctx, const char *file)
|
||||
break;
|
||||
}
|
||||
/* Check that PEM name starts with "BEGIN SERVERINFO FOR " */
|
||||
if (strlen(name) < strlen(namePrefix1)) {
|
||||
name_len = strlen(name);
|
||||
if (name_len < sizeof(namePrefix1) - 1) {
|
||||
SSLerr(SSL_F_SSL_CTX_USE_SERVERINFO_FILE, SSL_R_PEM_NAME_TOO_SHORT);
|
||||
goto end;
|
||||
}
|
||||
if (strncmp(name, namePrefix1, strlen(namePrefix1)) == 0) {
|
||||
if (strncmp(name, namePrefix1, sizeof(namePrefix1) - 1) == 0) {
|
||||
version = SSL_SERVERINFOV1;
|
||||
} else {
|
||||
if (strlen(name) < strlen(namePrefix2)) {
|
||||
if (name_len < sizeof(namePrefix2) - 1) {
|
||||
SSLerr(SSL_F_SSL_CTX_USE_SERVERINFO_FILE,
|
||||
SSL_R_PEM_NAME_TOO_SHORT);
|
||||
goto end;
|
||||
}
|
||||
if (strncmp(name, namePrefix2, strlen(namePrefix2)) != 0) {
|
||||
if (strncmp(name, namePrefix2, sizeof(namePrefix2) - 1) != 0) {
|
||||
SSLerr(SSL_F_SSL_CTX_USE_SERVERINFO_FILE,
|
||||
SSL_R_PEM_NAME_BAD_PREFIX);
|
||||
goto end;
|
||||
|
||||
@@ -949,7 +949,7 @@ static int final_server_name(SSL *s, unsigned int context, int sent)
|
||||
*/
|
||||
if (s->server) {
|
||||
/* TODO(OpenSSL1.2) revisit !sent case */
|
||||
if (sent && ret == SSL_TLSEXT_ERR_OK && (!s->hit || SSL_IS_TLS13(s))) {
|
||||
if (sent && ret == SSL_TLSEXT_ERR_OK && !s->hit) {
|
||||
/* Only store the hostname in the session if we accepted it. */
|
||||
OPENSSL_free(s->session->ext.hostname);
|
||||
s->session->ext.hostname = OPENSSL_strdup(s->ext.hostname);
|
||||
@@ -1446,7 +1446,7 @@ int tls_psk_do_binder(SSL *s, const EVP_MD *md, const unsigned char *msgstart,
|
||||
unsigned char finishedkey[EVP_MAX_MD_SIZE], tmpbinder[EVP_MAX_MD_SIZE];
|
||||
unsigned char *early_secret;
|
||||
#ifdef CHARSET_EBCDIC
|
||||
static const unsigned char resumption_label[] = { 0x72, 0x65, 0x64, 0x20, 0x62, 0x69, 0x6E, 0x64, 0x65, 0x72, 0x00 };
|
||||
static const unsigned char resumption_label[] = { 0x72, 0x65, 0x73, 0x20, 0x62, 0x69, 0x6E, 0x64, 0x65, 0x72, 0x00 };
|
||||
static const unsigned char external_label[] = { 0x65, 0x78, 0x74, 0x20, 0x62, 0x69, 0x6E, 0x64, 0x65, 0x72, 0x00 };
|
||||
#else
|
||||
static const unsigned char resumption_label[] = "res binder";
|
||||
|
||||
+92
-131
@@ -24,9 +24,25 @@
|
||||
#include <openssl/bn.h>
|
||||
#include <openssl/md5.h>
|
||||
#include <openssl/trace.h>
|
||||
#include <openssl/core_names.h>
|
||||
#include <openssl/asn1t.h>
|
||||
|
||||
#define TICKET_NONCE_SIZE 8
|
||||
|
||||
typedef struct {
|
||||
ASN1_TYPE *kxBlob;
|
||||
ASN1_TYPE *opaqueBlob;
|
||||
} GOST_KX_MESSAGE;
|
||||
|
||||
DECLARE_ASN1_FUNCTIONS(GOST_KX_MESSAGE)
|
||||
|
||||
ASN1_SEQUENCE(GOST_KX_MESSAGE) = {
|
||||
ASN1_SIMPLE(GOST_KX_MESSAGE, kxBlob, ASN1_ANY),
|
||||
ASN1_OPT(GOST_KX_MESSAGE, opaqueBlob, ASN1_ANY),
|
||||
} ASN1_SEQUENCE_END(GOST_KX_MESSAGE)
|
||||
|
||||
IMPLEMENT_ASN1_FUNCTIONS(GOST_KX_MESSAGE)
|
||||
|
||||
static int tls_construct_encrypted_extensions(SSL *s, WPACKET *pkt);
|
||||
|
||||
/*
|
||||
@@ -2967,16 +2983,15 @@ static int tls_process_cke_psk_preamble(SSL *s, PACKET *pkt)
|
||||
static int tls_process_cke_rsa(SSL *s, PACKET *pkt)
|
||||
{
|
||||
#ifndef OPENSSL_NO_RSA
|
||||
unsigned char rand_premaster_secret[SSL_MAX_MASTER_KEY_LENGTH];
|
||||
int decrypt_len;
|
||||
unsigned char decrypt_good, version_good;
|
||||
size_t j, padding_len;
|
||||
size_t outlen;
|
||||
PACKET enc_premaster;
|
||||
RSA *rsa = NULL;
|
||||
EVP_PKEY *rsa = NULL;
|
||||
unsigned char *rsa_decrypt = NULL;
|
||||
int ret = 0;
|
||||
EVP_PKEY_CTX *ctx = NULL;
|
||||
OSSL_PARAM params[3], *p = params;
|
||||
|
||||
rsa = EVP_PKEY_get0_RSA(s->cert->pkeys[SSL_PKEY_RSA].privatekey);
|
||||
rsa = s->cert->pkeys[SSL_PKEY_RSA].privatekey;
|
||||
if (rsa == NULL) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_RSA,
|
||||
SSL_R_MISSING_RSA_CERTIFICATE);
|
||||
@@ -3001,124 +3016,77 @@ static int tls_process_cke_rsa(SSL *s, PACKET *pkt)
|
||||
* (SSL_MAX_MASTER_KEY_LENGTH). Reject overly short RSA keys because
|
||||
* their ciphertext cannot accommodate a premaster secret anyway.
|
||||
*/
|
||||
if (RSA_size(rsa) < SSL_MAX_MASTER_KEY_LENGTH) {
|
||||
if (EVP_PKEY_size(rsa) < RSA_PKCS1_PADDING_SIZE
|
||||
+ SSL_MAX_MASTER_KEY_LENGTH) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_RSA,
|
||||
RSA_R_KEY_SIZE_TOO_SMALL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
rsa_decrypt = OPENSSL_malloc(RSA_size(rsa));
|
||||
outlen = SSL_MAX_MASTER_KEY_LENGTH;
|
||||
rsa_decrypt = OPENSSL_malloc(outlen);
|
||||
if (rsa_decrypt == NULL) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_RSA,
|
||||
ERR_R_MALLOC_FAILURE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
ctx = EVP_PKEY_CTX_new(rsa, NULL);
|
||||
if (ctx == NULL) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_RSA,
|
||||
ERR_R_MALLOC_FAILURE);
|
||||
goto err;
|
||||
}
|
||||
|
||||
/*
|
||||
* We must not leak whether a decryption failure occurs because of
|
||||
* Bleichenbacher's attack on PKCS #1 v1.5 RSA padding (see RFC 2246,
|
||||
* section 7.4.7.1). The code follows that advice of the TLS RFC and
|
||||
* generates a random premaster secret for the case that the decrypt
|
||||
* fails. See https://tools.ietf.org/html/rfc5246#section-7.4.7.1
|
||||
* section 7.4.7.1). We use the special padding type
|
||||
* RSA_PKCS1_WITH_TLS_PADDING to do that. It will automaticaly decrypt the
|
||||
* RSA, check the padding and check that the client version is as expected
|
||||
* in the premaster secret. If any of that fails then the function appears
|
||||
* to return successfully but with a random result. The call below could
|
||||
* still fail if the input is publicly invalid.
|
||||
* See https://tools.ietf.org/html/rfc5246#section-7.4.7.1
|
||||
*/
|
||||
|
||||
if (RAND_priv_bytes(rand_premaster_secret,
|
||||
sizeof(rand_premaster_secret)) <= 0) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_RSA,
|
||||
ERR_R_INTERNAL_ERROR);
|
||||
goto err;
|
||||
}
|
||||
|
||||
/*
|
||||
* Decrypt with no padding. PKCS#1 padding will be removed as part of
|
||||
* the timing-sensitive code below.
|
||||
*/
|
||||
/* TODO(size_t): Convert this function */
|
||||
decrypt_len = (int)RSA_private_decrypt((int)PACKET_remaining(&enc_premaster),
|
||||
PACKET_data(&enc_premaster),
|
||||
rsa_decrypt, rsa, RSA_NO_PADDING);
|
||||
if (decrypt_len < 0) {
|
||||
SSLfatal(s, SSL_AD_DECRYPT_ERROR, SSL_F_TLS_PROCESS_CKE_RSA,
|
||||
ERR_R_INTERNAL_ERROR);
|
||||
goto err;
|
||||
}
|
||||
|
||||
/* Check the padding. See RFC 3447, section 7.2.2. */
|
||||
|
||||
/*
|
||||
* The smallest padded premaster is 11 bytes of overhead. Small keys
|
||||
* are publicly invalid, so this may return immediately. This ensures
|
||||
* PS is at least 8 bytes.
|
||||
*/
|
||||
if (decrypt_len < 11 + SSL_MAX_MASTER_KEY_LENGTH) {
|
||||
if (EVP_PKEY_decrypt_init(ctx) <= 0
|
||||
|| EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_WITH_TLS_PADDING) <= 0) {
|
||||
SSLfatal(s, SSL_AD_DECRYPT_ERROR, SSL_F_TLS_PROCESS_CKE_RSA,
|
||||
SSL_R_DECRYPTION_FAILED);
|
||||
goto err;
|
||||
}
|
||||
|
||||
padding_len = decrypt_len - SSL_MAX_MASTER_KEY_LENGTH;
|
||||
decrypt_good = constant_time_eq_int_8(rsa_decrypt[0], 0) &
|
||||
constant_time_eq_int_8(rsa_decrypt[1], 2);
|
||||
for (j = 2; j < padding_len - 1; j++) {
|
||||
decrypt_good &= ~constant_time_is_zero_8(rsa_decrypt[j]);
|
||||
}
|
||||
decrypt_good &= constant_time_is_zero_8(rsa_decrypt[padding_len - 1]);
|
||||
*p++ = OSSL_PARAM_construct_uint(OSSL_ASYM_CIPHER_PARAM_TLS_CLIENT_VERSION,
|
||||
(unsigned int *)&s->client_version);
|
||||
if ((s->options & SSL_OP_TLS_ROLLBACK_BUG) != 0)
|
||||
*p++ = OSSL_PARAM_construct_uint(
|
||||
OSSL_ASYM_CIPHER_PARAM_TLS_NEGOTIATED_VERSION,
|
||||
(unsigned int *)&s->version);
|
||||
*p++ = OSSL_PARAM_construct_end();
|
||||
|
||||
/*
|
||||
* If the version in the decrypted pre-master secret is correct then
|
||||
* version_good will be 0xff, otherwise it'll be zero. The
|
||||
* Klima-Pokorny-Rosa extension of Bleichenbacher's attack
|
||||
* (http://eprint.iacr.org/2003/052/) exploits the version number
|
||||
* check as a "bad version oracle". Thus version checks are done in
|
||||
* constant time and are treated like any other decryption error.
|
||||
*/
|
||||
version_good =
|
||||
constant_time_eq_8(rsa_decrypt[padding_len],
|
||||
(unsigned)(s->client_version >> 8));
|
||||
version_good &=
|
||||
constant_time_eq_8(rsa_decrypt[padding_len + 1],
|
||||
(unsigned)(s->client_version & 0xff));
|
||||
|
||||
/*
|
||||
* The premaster secret must contain the same version number as the
|
||||
* ClientHello to detect version rollback attacks (strangely, the
|
||||
* protocol does not offer such protection for DH ciphersuites).
|
||||
* However, buggy clients exist that send the negotiated protocol
|
||||
* version instead if the server does not support the requested
|
||||
* protocol version. If SSL_OP_TLS_ROLLBACK_BUG is set, tolerate such
|
||||
* clients.
|
||||
*/
|
||||
if (s->options & SSL_OP_TLS_ROLLBACK_BUG) {
|
||||
unsigned char workaround_good;
|
||||
workaround_good = constant_time_eq_8(rsa_decrypt[padding_len],
|
||||
(unsigned)(s->version >> 8));
|
||||
workaround_good &=
|
||||
constant_time_eq_8(rsa_decrypt[padding_len + 1],
|
||||
(unsigned)(s->version & 0xff));
|
||||
version_good |= workaround_good;
|
||||
if (!EVP_PKEY_CTX_set_params(ctx, params)
|
||||
|| EVP_PKEY_decrypt(ctx, rsa_decrypt, &outlen,
|
||||
PACKET_data(&enc_premaster),
|
||||
PACKET_remaining(&enc_premaster)) <= 0) {
|
||||
SSLfatal(s, SSL_AD_DECRYPT_ERROR, SSL_F_TLS_PROCESS_CKE_RSA,
|
||||
SSL_R_DECRYPTION_FAILED);
|
||||
goto err;
|
||||
}
|
||||
|
||||
/*
|
||||
* Both decryption and version must be good for decrypt_good to
|
||||
* remain non-zero (0xff).
|
||||
* This test should never fail (otherwise we should have failed above) but
|
||||
* we double check anyway.
|
||||
*/
|
||||
decrypt_good &= version_good;
|
||||
|
||||
/*
|
||||
* Now copy rand_premaster_secret over from p using
|
||||
* decrypt_good_mask. If decryption failed, then p does not
|
||||
* contain valid plaintext, however, a check above guarantees
|
||||
* it is still sufficiently large to read from.
|
||||
*/
|
||||
for (j = 0; j < sizeof(rand_premaster_secret); j++) {
|
||||
rsa_decrypt[padding_len + j] =
|
||||
constant_time_select_8(decrypt_good,
|
||||
rsa_decrypt[padding_len + j],
|
||||
rand_premaster_secret[j]);
|
||||
if (outlen != SSL_MAX_MASTER_KEY_LENGTH) {
|
||||
OPENSSL_cleanse(rsa_decrypt, SSL_MAX_MASTER_KEY_LENGTH);
|
||||
SSLfatal(s, SSL_AD_DECRYPT_ERROR, SSL_F_TLS_PROCESS_CKE_RSA,
|
||||
SSL_R_DECRYPTION_FAILED);
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (!ssl_generate_master_secret(s, rsa_decrypt + padding_len,
|
||||
sizeof(rand_premaster_secret), 0)) {
|
||||
/* Also cleanses rsa_decrypt (on success or failure) */
|
||||
if (!ssl_generate_master_secret(s, rsa_decrypt,
|
||||
SSL_MAX_MASTER_KEY_LENGTH, 0)) {
|
||||
/* SSLfatal() already called */
|
||||
goto err;
|
||||
}
|
||||
@@ -3126,6 +3094,7 @@ static int tls_process_cke_rsa(SSL *s, PACKET *pkt)
|
||||
ret = 1;
|
||||
err:
|
||||
OPENSSL_free(rsa_decrypt);
|
||||
EVP_PKEY_CTX_free(ctx);
|
||||
return ret;
|
||||
#else
|
||||
/* Should never happen */
|
||||
@@ -3324,9 +3293,9 @@ static int tls_process_cke_gost(SSL *s, PACKET *pkt)
|
||||
const unsigned char *start;
|
||||
size_t outlen = 32, inlen;
|
||||
unsigned long alg_a;
|
||||
unsigned int asn1id, asn1len;
|
||||
GOST_KX_MESSAGE *pKX = NULL;
|
||||
const unsigned char *ptr;
|
||||
int ret = 0;
|
||||
PACKET encdata;
|
||||
|
||||
/* Get our certificate private key */
|
||||
alg_a = s->s3.tmp.new_cipher->algorithm_auth;
|
||||
@@ -3367,42 +3336,33 @@ static int tls_process_cke_gost(SSL *s, PACKET *pkt)
|
||||
if (EVP_PKEY_derive_set_peer(pkey_ctx, client_pub_pkey) <= 0)
|
||||
ERR_clear_error();
|
||||
}
|
||||
/* Decrypt session key */
|
||||
if (!PACKET_get_1(pkt, &asn1id)
|
||||
|| asn1id != (V_ASN1_SEQUENCE | V_ASN1_CONSTRUCTED)
|
||||
|| !PACKET_peek_1(pkt, &asn1len)) {
|
||||
SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CKE_GOST,
|
||||
SSL_R_DECRYPTION_FAILED);
|
||||
goto err;
|
||||
}
|
||||
if (asn1len == 0x81) {
|
||||
/*
|
||||
* Long form length. Should only be one byte of length. Anything else
|
||||
* isn't supported.
|
||||
* We did a successful peek before so this shouldn't fail
|
||||
*/
|
||||
if (!PACKET_forward(pkt, 1)) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_GOST,
|
||||
SSL_R_DECRYPTION_FAILED);
|
||||
goto err;
|
||||
}
|
||||
} else if (asn1len >= 0x80) {
|
||||
/*
|
||||
* Indefinite length, or more than one long form length bytes. We don't
|
||||
* support it
|
||||
*/
|
||||
SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CKE_GOST,
|
||||
SSL_R_DECRYPTION_FAILED);
|
||||
goto err;
|
||||
} /* else short form length */
|
||||
|
||||
if (!PACKET_as_length_prefixed_1(pkt, &encdata)) {
|
||||
SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CKE_GOST,
|
||||
ptr = PACKET_data(pkt);
|
||||
/* Some implementations provide extra data in the opaqueBlob
|
||||
* We have nothing to do with this blob so we just skip it */
|
||||
pKX = d2i_GOST_KX_MESSAGE(NULL, &ptr, PACKET_remaining(pkt));
|
||||
if (pKX == NULL
|
||||
|| pKX->kxBlob == NULL
|
||||
|| ASN1_TYPE_get(pKX->kxBlob) != V_ASN1_SEQUENCE) {
|
||||
SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CKE_GOST,
|
||||
SSL_R_DECRYPTION_FAILED);
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (!PACKET_forward(pkt, ptr - PACKET_data(pkt))) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_GOST,
|
||||
SSL_R_DECRYPTION_FAILED);
|
||||
goto err;
|
||||
}
|
||||
inlen = PACKET_remaining(&encdata);
|
||||
start = PACKET_data(&encdata);
|
||||
|
||||
if (PACKET_remaining(pkt) != 0) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_GOST,
|
||||
SSL_R_DECRYPTION_FAILED);
|
||||
goto err;
|
||||
}
|
||||
|
||||
inlen = pKX->kxBlob->value.sequence->length;
|
||||
start = pKX->kxBlob->value.sequence->data;
|
||||
|
||||
if (EVP_PKEY_decrypt(pkey_ctx, premaster_secret, &outlen, start,
|
||||
inlen) <= 0) {
|
||||
@@ -3424,6 +3384,7 @@ static int tls_process_cke_gost(SSL *s, PACKET *pkt)
|
||||
ret = 1;
|
||||
err:
|
||||
EVP_PKEY_CTX_free(pkey_ctx);
|
||||
GOST_KX_MESSAGE_free(pKX);
|
||||
return ret;
|
||||
#else
|
||||
/* Should never happen */
|
||||
|
||||
+95
-134
@@ -10,9 +10,9 @@
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include "../ssl_locl.h"
|
||||
#include "statem_locl.h"
|
||||
#include "internal/constant_time_locl.h"
|
||||
#include "../ssl_local.h"
|
||||
#include "statem_local.h"
|
||||
#include "internal/constant_time.h"
|
||||
#include "internal/cryptlib.h"
|
||||
#include <openssl/buffer.h>
|
||||
#include <openssl/rand.h>
|
||||
@@ -24,9 +24,25 @@
|
||||
#include <openssl/bn.h>
|
||||
#include <openssl/md5.h>
|
||||
#include <openssl/trace.h>
|
||||
#include <openssl/core_names.h>
|
||||
#include <openssl/asn1t.h>
|
||||
|
||||
#define TICKET_NONCE_SIZE 8
|
||||
|
||||
typedef struct {
|
||||
ASN1_TYPE *kxBlob;
|
||||
ASN1_TYPE *opaqueBlob;
|
||||
} GOST_KX_MESSAGE;
|
||||
|
||||
DECLARE_ASN1_FUNCTIONS(GOST_KX_MESSAGE)
|
||||
|
||||
ASN1_SEQUENCE(GOST_KX_MESSAGE) = {
|
||||
ASN1_SIMPLE(GOST_KX_MESSAGE, kxBlob, ASN1_ANY),
|
||||
ASN1_OPT(GOST_KX_MESSAGE, opaqueBlob, ASN1_ANY),
|
||||
} ASN1_SEQUENCE_END(GOST_KX_MESSAGE)
|
||||
|
||||
IMPLEMENT_ASN1_FUNCTIONS(GOST_KX_MESSAGE)
|
||||
|
||||
static int tls_construct_encrypted_extensions(SSL *s, WPACKET *pkt);
|
||||
|
||||
/*
|
||||
@@ -2966,16 +2982,15 @@ static int tls_process_cke_psk_preamble(SSL *s, PACKET *pkt)
|
||||
static int tls_process_cke_rsa(SSL *s, PACKET *pkt)
|
||||
{
|
||||
#ifndef OPENSSL_NO_RSA
|
||||
unsigned char rand_premaster_secret[SSL_MAX_MASTER_KEY_LENGTH];
|
||||
int decrypt_len;
|
||||
unsigned char decrypt_good, version_good;
|
||||
size_t j, padding_len;
|
||||
size_t outlen;
|
||||
PACKET enc_premaster;
|
||||
RSA *rsa = NULL;
|
||||
EVP_PKEY *rsa = NULL;
|
||||
unsigned char *rsa_decrypt = NULL;
|
||||
int ret = 0;
|
||||
EVP_PKEY_CTX *ctx = NULL;
|
||||
OSSL_PARAM params[3], *p = params;
|
||||
|
||||
rsa = EVP_PKEY_get0_RSA(s->cert->pkeys[SSL_PKEY_RSA].privatekey);
|
||||
rsa = s->cert->pkeys[SSL_PKEY_RSA].privatekey;
|
||||
if (rsa == NULL) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_RSA,
|
||||
SSL_R_MISSING_RSA_CERTIFICATE);
|
||||
@@ -3000,124 +3015,77 @@ static int tls_process_cke_rsa(SSL *s, PACKET *pkt)
|
||||
* (SSL_MAX_MASTER_KEY_LENGTH). Reject overly short RSA keys because
|
||||
* their ciphertext cannot accommodate a premaster secret anyway.
|
||||
*/
|
||||
if (RSA_size(rsa) < SSL_MAX_MASTER_KEY_LENGTH) {
|
||||
if (EVP_PKEY_size(rsa) < RSA_PKCS1_PADDING_SIZE
|
||||
+ SSL_MAX_MASTER_KEY_LENGTH) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_RSA,
|
||||
RSA_R_KEY_SIZE_TOO_SMALL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
rsa_decrypt = OPENSSL_malloc(RSA_size(rsa));
|
||||
outlen = SSL_MAX_MASTER_KEY_LENGTH;
|
||||
rsa_decrypt = OPENSSL_malloc(outlen);
|
||||
if (rsa_decrypt == NULL) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_RSA,
|
||||
ERR_R_MALLOC_FAILURE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
ctx = EVP_PKEY_CTX_new(rsa, NULL);
|
||||
if (ctx == NULL) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_RSA,
|
||||
ERR_R_MALLOC_FAILURE);
|
||||
goto err;
|
||||
}
|
||||
|
||||
/*
|
||||
* We must not leak whether a decryption failure occurs because of
|
||||
* Bleichenbacher's attack on PKCS #1 v1.5 RSA padding (see RFC 2246,
|
||||
* section 7.4.7.1). The code follows that advice of the TLS RFC and
|
||||
* generates a random premaster secret for the case that the decrypt
|
||||
* fails. See https://tools.ietf.org/html/rfc5246#section-7.4.7.1
|
||||
* section 7.4.7.1). We use the special padding type
|
||||
* RSA_PKCS1_WITH_TLS_PADDING to do that. It will automaticaly decrypt the
|
||||
* RSA, check the padding and check that the client version is as expected
|
||||
* in the premaster secret. If any of that fails then the function appears
|
||||
* to return successfully but with a random result. The call below could
|
||||
* still fail if the input is publicly invalid.
|
||||
* See https://tools.ietf.org/html/rfc5246#section-7.4.7.1
|
||||
*/
|
||||
|
||||
if (RAND_priv_bytes(rand_premaster_secret,
|
||||
sizeof(rand_premaster_secret)) <= 0) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_RSA,
|
||||
ERR_R_INTERNAL_ERROR);
|
||||
goto err;
|
||||
}
|
||||
|
||||
/*
|
||||
* Decrypt with no padding. PKCS#1 padding will be removed as part of
|
||||
* the timing-sensitive code below.
|
||||
*/
|
||||
/* TODO(size_t): Convert this function */
|
||||
decrypt_len = (int)RSA_private_decrypt((int)PACKET_remaining(&enc_premaster),
|
||||
PACKET_data(&enc_premaster),
|
||||
rsa_decrypt, rsa, RSA_NO_PADDING);
|
||||
if (decrypt_len < 0) {
|
||||
SSLfatal(s, SSL_AD_DECRYPT_ERROR, SSL_F_TLS_PROCESS_CKE_RSA,
|
||||
ERR_R_INTERNAL_ERROR);
|
||||
goto err;
|
||||
}
|
||||
|
||||
/* Check the padding. See RFC 3447, section 7.2.2. */
|
||||
|
||||
/*
|
||||
* The smallest padded premaster is 11 bytes of overhead. Small keys
|
||||
* are publicly invalid, so this may return immediately. This ensures
|
||||
* PS is at least 8 bytes.
|
||||
*/
|
||||
if (decrypt_len < 11 + SSL_MAX_MASTER_KEY_LENGTH) {
|
||||
if (EVP_PKEY_decrypt_init(ctx) <= 0
|
||||
|| EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_WITH_TLS_PADDING) <= 0) {
|
||||
SSLfatal(s, SSL_AD_DECRYPT_ERROR, SSL_F_TLS_PROCESS_CKE_RSA,
|
||||
SSL_R_DECRYPTION_FAILED);
|
||||
goto err;
|
||||
}
|
||||
|
||||
padding_len = decrypt_len - SSL_MAX_MASTER_KEY_LENGTH;
|
||||
decrypt_good = constant_time_eq_int_8(rsa_decrypt[0], 0) &
|
||||
constant_time_eq_int_8(rsa_decrypt[1], 2);
|
||||
for (j = 2; j < padding_len - 1; j++) {
|
||||
decrypt_good &= ~constant_time_is_zero_8(rsa_decrypt[j]);
|
||||
}
|
||||
decrypt_good &= constant_time_is_zero_8(rsa_decrypt[padding_len - 1]);
|
||||
*p++ = OSSL_PARAM_construct_uint(OSSL_ASYM_CIPHER_PARAM_TLS_CLIENT_VERSION,
|
||||
(unsigned int *)&s->client_version);
|
||||
if ((s->options & SSL_OP_TLS_ROLLBACK_BUG) != 0)
|
||||
*p++ = OSSL_PARAM_construct_uint(
|
||||
OSSL_ASYM_CIPHER_PARAM_TLS_NEGOTIATED_VERSION,
|
||||
(unsigned int *)&s->version);
|
||||
*p++ = OSSL_PARAM_construct_end();
|
||||
|
||||
/*
|
||||
* If the version in the decrypted pre-master secret is correct then
|
||||
* version_good will be 0xff, otherwise it'll be zero. The
|
||||
* Klima-Pokorny-Rosa extension of Bleichenbacher's attack
|
||||
* (http://eprint.iacr.org/2003/052/) exploits the version number
|
||||
* check as a "bad version oracle". Thus version checks are done in
|
||||
* constant time and are treated like any other decryption error.
|
||||
*/
|
||||
version_good =
|
||||
constant_time_eq_8(rsa_decrypt[padding_len],
|
||||
(unsigned)(s->client_version >> 8));
|
||||
version_good &=
|
||||
constant_time_eq_8(rsa_decrypt[padding_len + 1],
|
||||
(unsigned)(s->client_version & 0xff));
|
||||
|
||||
/*
|
||||
* The premaster secret must contain the same version number as the
|
||||
* ClientHello to detect version rollback attacks (strangely, the
|
||||
* protocol does not offer such protection for DH ciphersuites).
|
||||
* However, buggy clients exist that send the negotiated protocol
|
||||
* version instead if the server does not support the requested
|
||||
* protocol version. If SSL_OP_TLS_ROLLBACK_BUG is set, tolerate such
|
||||
* clients.
|
||||
*/
|
||||
if (s->options & SSL_OP_TLS_ROLLBACK_BUG) {
|
||||
unsigned char workaround_good;
|
||||
workaround_good = constant_time_eq_8(rsa_decrypt[padding_len],
|
||||
(unsigned)(s->version >> 8));
|
||||
workaround_good &=
|
||||
constant_time_eq_8(rsa_decrypt[padding_len + 1],
|
||||
(unsigned)(s->version & 0xff));
|
||||
version_good |= workaround_good;
|
||||
if (!EVP_PKEY_CTX_set_params(ctx, params)
|
||||
|| EVP_PKEY_decrypt(ctx, rsa_decrypt, &outlen,
|
||||
PACKET_data(&enc_premaster),
|
||||
PACKET_remaining(&enc_premaster)) <= 0) {
|
||||
SSLfatal(s, SSL_AD_DECRYPT_ERROR, SSL_F_TLS_PROCESS_CKE_RSA,
|
||||
SSL_R_DECRYPTION_FAILED);
|
||||
goto err;
|
||||
}
|
||||
|
||||
/*
|
||||
* Both decryption and version must be good for decrypt_good to
|
||||
* remain non-zero (0xff).
|
||||
* This test should never fail (otherwise we should have failed above) but
|
||||
* we double check anyway.
|
||||
*/
|
||||
decrypt_good &= version_good;
|
||||
|
||||
/*
|
||||
* Now copy rand_premaster_secret over from p using
|
||||
* decrypt_good_mask. If decryption failed, then p does not
|
||||
* contain valid plaintext, however, a check above guarantees
|
||||
* it is still sufficiently large to read from.
|
||||
*/
|
||||
for (j = 0; j < sizeof(rand_premaster_secret); j++) {
|
||||
rsa_decrypt[padding_len + j] =
|
||||
constant_time_select_8(decrypt_good,
|
||||
rsa_decrypt[padding_len + j],
|
||||
rand_premaster_secret[j]);
|
||||
if (outlen != SSL_MAX_MASTER_KEY_LENGTH) {
|
||||
OPENSSL_cleanse(rsa_decrypt, SSL_MAX_MASTER_KEY_LENGTH);
|
||||
SSLfatal(s, SSL_AD_DECRYPT_ERROR, SSL_F_TLS_PROCESS_CKE_RSA,
|
||||
SSL_R_DECRYPTION_FAILED);
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (!ssl_generate_master_secret(s, rsa_decrypt + padding_len,
|
||||
sizeof(rand_premaster_secret), 0)) {
|
||||
/* Also cleanses rsa_decrypt (on success or failure) */
|
||||
if (!ssl_generate_master_secret(s, rsa_decrypt,
|
||||
SSL_MAX_MASTER_KEY_LENGTH, 0)) {
|
||||
/* SSLfatal() already called */
|
||||
goto err;
|
||||
}
|
||||
@@ -3125,6 +3093,7 @@ static int tls_process_cke_rsa(SSL *s, PACKET *pkt)
|
||||
ret = 1;
|
||||
err:
|
||||
OPENSSL_free(rsa_decrypt);
|
||||
EVP_PKEY_CTX_free(ctx);
|
||||
return ret;
|
||||
#else
|
||||
/* Should never happen */
|
||||
@@ -3323,9 +3292,9 @@ static int tls_process_cke_gost(SSL *s, PACKET *pkt)
|
||||
const unsigned char *start;
|
||||
size_t outlen = 32, inlen;
|
||||
unsigned long alg_a;
|
||||
unsigned int asn1id, asn1len;
|
||||
GOST_KX_MESSAGE *pKX = NULL;
|
||||
const unsigned char *ptr;
|
||||
int ret = 0;
|
||||
PACKET encdata;
|
||||
|
||||
/* Get our certificate private key */
|
||||
alg_a = s->s3.tmp.new_cipher->algorithm_auth;
|
||||
@@ -3366,42 +3335,33 @@ static int tls_process_cke_gost(SSL *s, PACKET *pkt)
|
||||
if (EVP_PKEY_derive_set_peer(pkey_ctx, client_pub_pkey) <= 0)
|
||||
ERR_clear_error();
|
||||
}
|
||||
/* Decrypt session key */
|
||||
if (!PACKET_get_1(pkt, &asn1id)
|
||||
|| asn1id != (V_ASN1_SEQUENCE | V_ASN1_CONSTRUCTED)
|
||||
|| !PACKET_peek_1(pkt, &asn1len)) {
|
||||
SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CKE_GOST,
|
||||
SSL_R_DECRYPTION_FAILED);
|
||||
goto err;
|
||||
}
|
||||
if (asn1len == 0x81) {
|
||||
/*
|
||||
* Long form length. Should only be one byte of length. Anything else
|
||||
* isn't supported.
|
||||
* We did a successful peek before so this shouldn't fail
|
||||
*/
|
||||
if (!PACKET_forward(pkt, 1)) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_GOST,
|
||||
SSL_R_DECRYPTION_FAILED);
|
||||
goto err;
|
||||
}
|
||||
} else if (asn1len >= 0x80) {
|
||||
/*
|
||||
* Indefinite length, or more than one long form length bytes. We don't
|
||||
* support it
|
||||
*/
|
||||
SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CKE_GOST,
|
||||
SSL_R_DECRYPTION_FAILED);
|
||||
goto err;
|
||||
} /* else short form length */
|
||||
|
||||
if (!PACKET_as_length_prefixed_1(pkt, &encdata)) {
|
||||
SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CKE_GOST,
|
||||
ptr = PACKET_data(pkt);
|
||||
/* Some implementations provide extra data in the opaqueBlob
|
||||
* We have nothing to do with this blob so we just skip it */
|
||||
pKX = d2i_GOST_KX_MESSAGE(NULL, &ptr, PACKET_remaining(pkt));
|
||||
if (pKX == NULL
|
||||
|| pKX->kxBlob == NULL
|
||||
|| ASN1_TYPE_get(pKX->kxBlob) != V_ASN1_SEQUENCE) {
|
||||
SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CKE_GOST,
|
||||
SSL_R_DECRYPTION_FAILED);
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (!PACKET_forward(pkt, ptr - PACKET_data(pkt))) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_GOST,
|
||||
SSL_R_DECRYPTION_FAILED);
|
||||
goto err;
|
||||
}
|
||||
inlen = PACKET_remaining(&encdata);
|
||||
start = PACKET_data(&encdata);
|
||||
|
||||
if (PACKET_remaining(pkt) != 0) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_GOST,
|
||||
SSL_R_DECRYPTION_FAILED);
|
||||
goto err;
|
||||
}
|
||||
|
||||
inlen = pKX->kxBlob->value.sequence->length;
|
||||
start = pKX->kxBlob->value.sequence->data;
|
||||
|
||||
if (EVP_PKEY_decrypt(pkey_ctx, premaster_secret, &outlen, start,
|
||||
inlen) <= 0) {
|
||||
@@ -3423,6 +3383,7 @@ static int tls_process_cke_gost(SSL *s, PACKET *pkt)
|
||||
ret = 1;
|
||||
err:
|
||||
EVP_PKEY_CTX_free(pkey_ctx);
|
||||
GOST_KX_MESSAGE_free(pKX);
|
||||
return ret;
|
||||
#else
|
||||
/* Should never happen */
|
||||
|
||||
+48
-2
@@ -151,11 +151,15 @@ int tls1_change_cipher_state(SSL *s, int which)
|
||||
size_t n, i, j, k, cl;
|
||||
int reuse_dd = 0;
|
||||
#ifndef OPENSSL_NO_KTLS
|
||||
# ifdef __FreeBSD__
|
||||
struct tls_enable crypto_info;
|
||||
# else
|
||||
struct tls12_crypto_info_aes_gcm_128 crypto_info;
|
||||
BIO *bio;
|
||||
unsigned char geniv[12];
|
||||
int count_unprocessed;
|
||||
int bit;
|
||||
# endif
|
||||
BIO *bio;
|
||||
#endif
|
||||
|
||||
c = s->s3.tmp.new_sym_enc;
|
||||
@@ -387,6 +391,45 @@ int tls1_change_cipher_state(SSL *s, int which)
|
||||
if (ssl_get_max_send_fragment(s) != SSL3_RT_MAX_PLAIN_LENGTH)
|
||||
goto skip_ktls;
|
||||
|
||||
# ifdef __FreeBSD__
|
||||
memset(&crypto_info, 0, sizeof(crypto_info));
|
||||
switch (s->s3.tmp.new_cipher->algorithm_enc) {
|
||||
case SSL_AES128GCM:
|
||||
case SSL_AES256GCM:
|
||||
crypto_info.cipher_algorithm = CRYPTO_AES_NIST_GCM_16;
|
||||
crypto_info.iv_len = EVP_GCM_TLS_FIXED_IV_LEN;
|
||||
break;
|
||||
case SSL_AES128:
|
||||
case SSL_AES256:
|
||||
if (s->ext.use_etm)
|
||||
goto skip_ktls;
|
||||
switch (s->s3.tmp.new_cipher->algorithm_mac) {
|
||||
case SSL_SHA1:
|
||||
crypto_info.auth_algorithm = CRYPTO_SHA1_HMAC;
|
||||
break;
|
||||
case SSL_SHA256:
|
||||
crypto_info.auth_algorithm = CRYPTO_SHA2_256_HMAC;
|
||||
break;
|
||||
case SSL_SHA384:
|
||||
crypto_info.auth_algorithm = CRYPTO_SHA2_384_HMAC;
|
||||
break;
|
||||
default:
|
||||
goto skip_ktls;
|
||||
}
|
||||
crypto_info.cipher_algorithm = CRYPTO_AES_CBC;
|
||||
crypto_info.iv_len = EVP_CIPHER_iv_length(c);
|
||||
crypto_info.auth_key = ms;
|
||||
crypto_info.auth_key_len = *mac_secret_size;
|
||||
break;
|
||||
default:
|
||||
goto skip_ktls;
|
||||
}
|
||||
crypto_info.cipher_key = key;
|
||||
crypto_info.cipher_key_len = EVP_CIPHER_key_length(c);
|
||||
crypto_info.iv = iv;
|
||||
crypto_info.tls_vmajor = (s->version >> 8) & 0x000000ff;
|
||||
crypto_info.tls_vminor = (s->version & 0x000000ff);
|
||||
# else
|
||||
/* check that cipher is AES_GCM_128 */
|
||||
if (EVP_CIPHER_nid(c) != NID_aes_128_gcm
|
||||
|| EVP_CIPHER_mode(c) != EVP_CIPH_GCM_MODE
|
||||
@@ -396,6 +439,7 @@ int tls1_change_cipher_state(SSL *s, int which)
|
||||
/* check version is 1.2 */
|
||||
if (s->version != TLS1_2_VERSION)
|
||||
goto skip_ktls;
|
||||
# endif
|
||||
|
||||
if (which & SSL3_CC_WRITE)
|
||||
bio = s->wbio;
|
||||
@@ -422,6 +466,7 @@ int tls1_change_cipher_state(SSL *s, int which)
|
||||
goto err;
|
||||
}
|
||||
|
||||
# ifndef __FreeBSD__
|
||||
memset(&crypto_info, 0, sizeof(crypto_info));
|
||||
crypto_info.info.cipher_type = TLS_CIPHER_AES_GCM_128;
|
||||
crypto_info.info.version = s->version;
|
||||
@@ -455,6 +500,7 @@ int tls1_change_cipher_state(SSL *s, int which)
|
||||
count_unprocessed--;
|
||||
}
|
||||
}
|
||||
# endif
|
||||
|
||||
/* ktls works with user provided buffers directly */
|
||||
if (BIO_set_ktls(bio, &crypto_info, which & SSL3_CC_WRITE)) {
|
||||
@@ -595,7 +641,7 @@ int tls1_generate_master_secret(SSL *s, unsigned char *out, unsigned char *p,
|
||||
unsigned char hash[EVP_MAX_MD_SIZE * 2];
|
||||
size_t hashlen;
|
||||
/*
|
||||
* Digest cached records keeping record buffer (if present): this wont
|
||||
* Digest cached records keeping record buffer (if present): this won't
|
||||
* affect client auth because we're freezing the buffer at the same
|
||||
* point (after client key exchange and before certificate verify)
|
||||
*/
|
||||
|
||||
@@ -2864,6 +2864,26 @@ int tls_choose_sigalg(SSL *s, int fatalerrs)
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
#ifndef OPENSSL_NO_GOST
|
||||
/*
|
||||
* Some Windows-based implementations do not send GOST algorithms indication
|
||||
* in supported_algorithms extension, so when we have GOST-based ciphersuite,
|
||||
* we have to assume GOST support.
|
||||
*/
|
||||
if (i == s->shared_sigalgslen && s->s3.tmp.new_cipher->algorithm_auth & (SSL_aGOST01 | SSL_aGOST12)) {
|
||||
if ((lu = tls1_get_legacy_sigalg(s, -1)) == NULL) {
|
||||
if (!fatalerrs)
|
||||
return 1;
|
||||
SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE,
|
||||
SSL_F_TLS_CHOOSE_SIGALG,
|
||||
SSL_R_NO_SUITABLE_SIGNATURE_ALGORITHM);
|
||||
return 0;
|
||||
} else {
|
||||
i = 0;
|
||||
sig_idx = lu->sig_idx;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (i == s->shared_sigalgslen) {
|
||||
if (!fatalerrs)
|
||||
return 1;
|
||||
|
||||
@@ -1110,6 +1110,10 @@ static int ssl_print_client_keyex(BIO *bio, int indent, const SSL *ssl,
|
||||
if (!ssl_print_hexbuf(bio, indent + 2, "ecdh_Yc", 1, &msg, &msglen))
|
||||
return 0;
|
||||
break;
|
||||
case SSL_kGOST:
|
||||
ssl_print_hex(bio, indent + 2, "GostKeyTransportBlob", msg, msglen);
|
||||
msglen = 0;
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -49,7 +49,7 @@ int tls13_hkdf_expand(SSL *s, const EVP_MD *md, const unsigned char *secret,
|
||||
* prefix and label + bytes for the label itself + 1 byte length of hash
|
||||
* + bytes for the hash itself
|
||||
*/
|
||||
unsigned char hkdflabel[sizeof(uint16_t) + sizeof(uint8_t) +
|
||||
unsigned char hkdflabel[sizeof(uint16_t) + sizeof(uint8_t)
|
||||
+ (sizeof(label_prefix) - 1) + TLS13_MAX_LABEL_LEN
|
||||
+ 1 + EVP_MAX_MD_SIZE];
|
||||
WPACKET pkt;
|
||||
|
||||
+2
-2
@@ -104,7 +104,7 @@ int SSL_SRP_CTX_init(struct ssl_st *s)
|
||||
goto err;
|
||||
}
|
||||
if ((ctx->srp_ctx.info != NULL) &&
|
||||
((s->srp_ctx.info = BUF_strdup(ctx->srp_ctx.info)) == NULL)) {
|
||||
((s->srp_ctx.info = OPENSSL_strdup(ctx->srp_ctx.info)) == NULL)) {
|
||||
SSLerr(SSL_F_SSL_SRP_CTX_INIT, ERR_R_INTERNAL_ERROR);
|
||||
goto err;
|
||||
}
|
||||
@@ -235,7 +235,7 @@ int SSL_set_srp_server_param(SSL *s, const BIGNUM *N, const BIGNUM *g,
|
||||
if (info != NULL) {
|
||||
if (s->srp_ctx.info)
|
||||
OPENSSL_free(s->srp_ctx.info);
|
||||
if ((s->srp_ctx.info = BUF_strdup(info)) == NULL)
|
||||
if ((s->srp_ctx.info = OPENSSL_strdup(info)) == NULL)
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user