Latest update - pre9
This commit is contained in:
@@ -216,6 +216,18 @@ EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_new(int id, int flags,
|
||||
goto err;
|
||||
}
|
||||
|
||||
/*
|
||||
* One of the following must be true:
|
||||
*
|
||||
* pem_str == NULL AND ASN1_PKEY_ALIAS is set
|
||||
* pem_str != NULL AND ASN1_PKEY_ALIAS is clear
|
||||
*
|
||||
* Anything else is an error and may lead to a corrupt ASN1 method table
|
||||
*/
|
||||
if (!((pem_str == NULL && (flags & ASN1_PKEY_ALIAS) != 0)
|
||||
|| (pem_str != NULL && (flags & ASN1_PKEY_ALIAS) == 0)))
|
||||
goto err;
|
||||
|
||||
if (pem_str) {
|
||||
ameth->pem_str = OPENSSL_strdup(pem_str);
|
||||
if (!ameth->pem_str)
|
||||
|
||||
@@ -883,8 +883,6 @@ static MIME_HEADER *mime_hdr_find(STACK_OF(MIME_HEADER) *hdrs, const char *name)
|
||||
htmp.params = NULL;
|
||||
|
||||
idx = sk_MIME_HEADER_find(hdrs, &htmp);
|
||||
if (idx < 0)
|
||||
return NULL;
|
||||
return sk_MIME_HEADER_value(hdrs, idx);
|
||||
}
|
||||
|
||||
@@ -896,8 +894,6 @@ static MIME_PARAM *mime_param_find(MIME_HEADER *hdr, const char *name)
|
||||
param.param_name = (char *)name;
|
||||
param.param_value = NULL;
|
||||
idx = sk_MIME_PARAM_find(hdr->params, ¶m);
|
||||
if (idx < 0)
|
||||
return NULL;
|
||||
return sk_MIME_PARAM_value(hdr->params, idx);
|
||||
}
|
||||
|
||||
|
||||
+23
-12
@@ -58,8 +58,10 @@ int asn1_set_choice_selector(ASN1_VALUE **pval, int value,
|
||||
int asn1_do_lock(ASN1_VALUE **pval, int op, const ASN1_ITEM *it)
|
||||
{
|
||||
const ASN1_AUX *aux;
|
||||
int *lck, ret;
|
||||
CRYPTO_REF_COUNT *lck;
|
||||
CRYPTO_RWLOCK **lock;
|
||||
int ret = -1;
|
||||
|
||||
if ((it->itype != ASN1_ITYPE_SEQUENCE)
|
||||
&& (it->itype != ASN1_ITYPE_NDEF_SEQUENCE))
|
||||
return 0;
|
||||
@@ -68,25 +70,34 @@ int asn1_do_lock(ASN1_VALUE **pval, int op, const ASN1_ITEM *it)
|
||||
return 0;
|
||||
lck = offset2ptr(*pval, aux->ref_offset);
|
||||
lock = offset2ptr(*pval, aux->ref_lock);
|
||||
if (op == 0) {
|
||||
*lck = 1;
|
||||
|
||||
switch (op) {
|
||||
case 0:
|
||||
*lck = ret = 1;
|
||||
*lock = CRYPTO_THREAD_lock_new();
|
||||
if (*lock == NULL) {
|
||||
ASN1err(ASN1_F_ASN1_DO_LOCK, ERR_R_MALLOC_FAILURE);
|
||||
return -1;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
if (CRYPTO_atomic_add(lck, op, &ret, *lock) < 0)
|
||||
return -1; /* failed */
|
||||
break;
|
||||
case 1:
|
||||
if (!CRYPTO_UP_REF(lck, &ret, *lock))
|
||||
return -1;
|
||||
break;
|
||||
case -1:
|
||||
if (!CRYPTO_DOWN_REF(lck, &ret, *lock))
|
||||
return -1; /* failed */
|
||||
#ifdef REF_PRINT
|
||||
fprintf(stderr, "%p:%4d:%s\n", it, *lck, it->sname);
|
||||
fprintf(stderr, "%p:%4d:%s\n", it, ret, it->sname);
|
||||
#endif
|
||||
REF_ASSERT_ISNT(ret < 0);
|
||||
if (ret == 0) {
|
||||
CRYPTO_THREAD_lock_free(*lock);
|
||||
*lock = NULL;
|
||||
REF_ASSERT_ISNT(ret < 0);
|
||||
if (ret == 0) {
|
||||
CRYPTO_THREAD_lock_free(*lock);
|
||||
*lock = NULL;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -63,8 +63,7 @@ static c448_error_t hash_init_with_dom(EVP_MD_CTX *hashctx, uint8_t prehashed,
|
||||
if (!EVP_DigestInit_ex(hashctx, EVP_shake256(), NULL)
|
||||
|| !EVP_DigestUpdate(hashctx, dom_s, strlen(dom_s))
|
||||
|| !EVP_DigestUpdate(hashctx, dom, sizeof(dom))
|
||||
|| (context_len > 0
|
||||
&& !EVP_DigestUpdate(hashctx, context, context_len)))
|
||||
|| !EVP_DigestUpdate(hashctx, context, context_len))
|
||||
return C448_FAILURE;
|
||||
|
||||
return C448_SUCCESS;
|
||||
@@ -161,8 +160,7 @@ c448_error_t c448_ed448_sign(
|
||||
|| !EVP_DigestUpdate(hashctx,
|
||||
expanded + EDDSA_448_PRIVATE_BYTES,
|
||||
EDDSA_448_PRIVATE_BYTES)
|
||||
|| (message_len > 0
|
||||
&& !EVP_DigestUpdate(hashctx, message, message_len))) {
|
||||
|| !EVP_DigestUpdate(hashctx, message, message_len)) {
|
||||
OPENSSL_cleanse(expanded, sizeof(expanded));
|
||||
goto err;
|
||||
}
|
||||
@@ -202,8 +200,7 @@ c448_error_t c448_ed448_sign(
|
||||
if (!hash_init_with_dom(hashctx, prehashed, 0, context, context_len)
|
||||
|| !EVP_DigestUpdate(hashctx, nonce_point, sizeof(nonce_point))
|
||||
|| !EVP_DigestUpdate(hashctx, pubkey, EDDSA_448_PUBLIC_BYTES)
|
||||
|| (message_len > 0
|
||||
&& !EVP_DigestUpdate(hashctx, message, message_len))
|
||||
|| !EVP_DigestUpdate(hashctx, message, message_len)
|
||||
|| !EVP_DigestFinalXOF(hashctx, challenge, sizeof(challenge)))
|
||||
goto err;
|
||||
|
||||
|
||||
@@ -75,14 +75,10 @@ int engine_free_util(ENGINE *e, int not_locked)
|
||||
|
||||
if (e == NULL)
|
||||
return 1;
|
||||
#ifdef HAVE_ATOMICS
|
||||
CRYPTO_DOWN_REF(&e->struct_ref, &i, global_engine_lock);
|
||||
#else
|
||||
if (not_locked)
|
||||
CRYPTO_atomic_add(&e->struct_ref, -1, &i, global_engine_lock);
|
||||
CRYPTO_DOWN_REF(&e->struct_ref, &i, global_engine_lock);
|
||||
else
|
||||
i = --e->struct_ref;
|
||||
#endif
|
||||
engine_ref_debug(e, 0, -1);
|
||||
if (i > 0)
|
||||
return 1;
|
||||
|
||||
@@ -22,3 +22,4 @@ INCLUDE[e_camellia.o]=.. ../modes
|
||||
INCLUDE[e_sm4.o]=.. ../modes
|
||||
INCLUDE[e_des.o]=..
|
||||
INCLUDE[e_des3.o]=..
|
||||
INCLUDE[m_sha3.o]=..
|
||||
@@ -217,10 +217,9 @@ int EVP_PBE_find(int type, int pbe_nid,
|
||||
pbelu.pbe_type = type;
|
||||
pbelu.pbe_nid = pbe_nid;
|
||||
|
||||
if (pbe_algs) {
|
||||
if (pbe_algs != NULL) {
|
||||
i = sk_EVP_PBE_CTL_find(pbe_algs, &pbelu);
|
||||
if (i != -1)
|
||||
pbetmp = sk_EVP_PBE_CTL_value(pbe_algs, i);
|
||||
pbetmp = sk_EVP_PBE_CTL_value(pbe_algs, i);
|
||||
}
|
||||
if (pbetmp == NULL) {
|
||||
pbetmp = OBJ_bsearch_pbe2(&pbelu, builtin_pbe, OSSL_NELEM(builtin_pbe));
|
||||
|
||||
+231
-7
@@ -66,6 +66,9 @@ static int sha3_update(EVP_MD_CTX *evp_ctx, const void *_inp, size_t len)
|
||||
size_t bsz = ctx->block_size;
|
||||
size_t num, rem;
|
||||
|
||||
if (len == 0)
|
||||
return 1;
|
||||
|
||||
if ((num = ctx->num) != 0) { /* process intermediate buffer? */
|
||||
rem = bsz - num;
|
||||
|
||||
@@ -134,7 +137,227 @@ static int shake_ctrl(EVP_MD_CTX *evp_ctx, int cmd, int p1, void *p2)
|
||||
}
|
||||
}
|
||||
|
||||
#define EVP_MD_SHA3(bitlen) \
|
||||
#if defined(OPENSSL_CPUID_OBJ) && defined(__s390__) && defined(KECCAK1600_ASM)
|
||||
/*
|
||||
* IBM S390X support
|
||||
*/
|
||||
# include "s390x_arch.h"
|
||||
|
||||
# define S390X_SHA3_FC(ctx) ((ctx)->pad)
|
||||
|
||||
# define S390X_sha3_224_CAPABLE ((OPENSSL_s390xcap_P.kimd[0] & \
|
||||
S390X_CAPBIT(S390X_SHA3_224)) && \
|
||||
(OPENSSL_s390xcap_P.klmd[0] & \
|
||||
S390X_CAPBIT(S390X_SHA3_224)))
|
||||
# define S390X_sha3_256_CAPABLE ((OPENSSL_s390xcap_P.kimd[0] & \
|
||||
S390X_CAPBIT(S390X_SHA3_256)) && \
|
||||
(OPENSSL_s390xcap_P.klmd[0] & \
|
||||
S390X_CAPBIT(S390X_SHA3_256)))
|
||||
# define S390X_sha3_384_CAPABLE ((OPENSSL_s390xcap_P.kimd[0] & \
|
||||
S390X_CAPBIT(S390X_SHA3_384)) && \
|
||||
(OPENSSL_s390xcap_P.klmd[0] & \
|
||||
S390X_CAPBIT(S390X_SHA3_384)))
|
||||
# define S390X_sha3_512_CAPABLE ((OPENSSL_s390xcap_P.kimd[0] & \
|
||||
S390X_CAPBIT(S390X_SHA3_512)) && \
|
||||
(OPENSSL_s390xcap_P.klmd[0] & \
|
||||
S390X_CAPBIT(S390X_SHA3_512)))
|
||||
# define S390X_shake128_CAPABLE ((OPENSSL_s390xcap_P.kimd[0] & \
|
||||
S390X_CAPBIT(S390X_SHAKE_128)) && \
|
||||
(OPENSSL_s390xcap_P.klmd[0] & \
|
||||
S390X_CAPBIT(S390X_SHAKE_128)))
|
||||
# define S390X_shake256_CAPABLE ((OPENSSL_s390xcap_P.kimd[0] & \
|
||||
S390X_CAPBIT(S390X_SHAKE_256)) && \
|
||||
(OPENSSL_s390xcap_P.klmd[0] & \
|
||||
S390X_CAPBIT(S390X_SHAKE_256)))
|
||||
|
||||
/* Convert md-size to block-size. */
|
||||
# define S390X_KECCAK1600_BSZ(n) ((KECCAK1600_WIDTH - ((n) << 1)) >> 3)
|
||||
|
||||
static int s390x_sha3_init(EVP_MD_CTX *evp_ctx)
|
||||
{
|
||||
KECCAK1600_CTX *ctx = evp_ctx->md_data;
|
||||
const size_t bsz = evp_ctx->digest->block_size;
|
||||
|
||||
/*-
|
||||
* KECCAK1600_CTX structure's pad field is used to store the KIMD/KLMD
|
||||
* function code.
|
||||
*/
|
||||
switch (bsz) {
|
||||
case S390X_KECCAK1600_BSZ(224):
|
||||
ctx->pad = S390X_SHA3_224;
|
||||
break;
|
||||
case S390X_KECCAK1600_BSZ(256):
|
||||
ctx->pad = S390X_SHA3_256;
|
||||
break;
|
||||
case S390X_KECCAK1600_BSZ(384):
|
||||
ctx->pad = S390X_SHA3_384;
|
||||
break;
|
||||
case S390X_KECCAK1600_BSZ(512):
|
||||
ctx->pad = S390X_SHA3_512;
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
||||
memset(ctx->A, 0, sizeof(ctx->A));
|
||||
ctx->num = 0;
|
||||
ctx->block_size = bsz;
|
||||
ctx->md_size = evp_ctx->digest->md_size;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int s390x_shake_init(EVP_MD_CTX *evp_ctx)
|
||||
{
|
||||
KECCAK1600_CTX *ctx = evp_ctx->md_data;
|
||||
const size_t bsz = evp_ctx->digest->block_size;
|
||||
|
||||
/*-
|
||||
* KECCAK1600_CTX structure's pad field is used to store the KIMD/KLMD
|
||||
* function code.
|
||||
*/
|
||||
switch (bsz) {
|
||||
case S390X_KECCAK1600_BSZ(128):
|
||||
ctx->pad = S390X_SHAKE_128;
|
||||
break;
|
||||
case S390X_KECCAK1600_BSZ(256):
|
||||
ctx->pad = S390X_SHAKE_256;
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
||||
memset(ctx->A, 0, sizeof(ctx->A));
|
||||
ctx->num = 0;
|
||||
ctx->block_size = bsz;
|
||||
ctx->md_size = evp_ctx->digest->md_size;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int s390x_sha3_update(EVP_MD_CTX *evp_ctx, const void *_inp, size_t len)
|
||||
{
|
||||
KECCAK1600_CTX *ctx = evp_ctx->md_data;
|
||||
const unsigned char *inp = _inp;
|
||||
const size_t bsz = ctx->block_size;
|
||||
size_t num, rem;
|
||||
|
||||
if (len == 0)
|
||||
return 1;
|
||||
|
||||
if ((num = ctx->num) != 0) {
|
||||
rem = bsz - num;
|
||||
|
||||
if (len < rem) {
|
||||
memcpy(ctx->buf + num, inp, len);
|
||||
ctx->num += len;
|
||||
return 1;
|
||||
}
|
||||
memcpy(ctx->buf + num, inp, rem);
|
||||
inp += rem;
|
||||
len -= rem;
|
||||
s390x_kimd(ctx->buf, bsz, ctx->pad, ctx->A);
|
||||
ctx->num = 0;
|
||||
}
|
||||
rem = len % bsz;
|
||||
|
||||
s390x_kimd(inp, len - rem, ctx->pad, ctx->A);
|
||||
|
||||
if (rem) {
|
||||
memcpy(ctx->buf, inp + len - rem, rem);
|
||||
ctx->num = rem;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int s390x_sha3_final(EVP_MD_CTX *evp_ctx, unsigned char *md)
|
||||
{
|
||||
KECCAK1600_CTX *ctx = evp_ctx->md_data;
|
||||
|
||||
s390x_klmd(ctx->buf, ctx->num, NULL, 0, ctx->pad, ctx->A);
|
||||
memcpy(md, ctx->A, ctx->md_size);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int s390x_shake_final(EVP_MD_CTX *evp_ctx, unsigned char *md)
|
||||
{
|
||||
KECCAK1600_CTX *ctx = evp_ctx->md_data;
|
||||
|
||||
s390x_klmd(ctx->buf, ctx->num, md, ctx->md_size, ctx->pad, ctx->A);
|
||||
return 1;
|
||||
}
|
||||
|
||||
# define EVP_MD_SHA3(bitlen) \
|
||||
const EVP_MD *EVP_sha3_##bitlen(void) \
|
||||
{ \
|
||||
static const EVP_MD s390x_sha3_##bitlen##_md = { \
|
||||
NID_sha3_##bitlen, \
|
||||
NID_RSA_SHA3_##bitlen, \
|
||||
bitlen / 8, \
|
||||
EVP_MD_FLAG_DIGALGID_ABSENT, \
|
||||
s390x_sha3_init, \
|
||||
s390x_sha3_update, \
|
||||
s390x_sha3_final, \
|
||||
NULL, \
|
||||
NULL, \
|
||||
(KECCAK1600_WIDTH - bitlen * 2) / 8, \
|
||||
sizeof(KECCAK1600_CTX), \
|
||||
}; \
|
||||
static const EVP_MD sha3_##bitlen##_md = { \
|
||||
NID_sha3_##bitlen, \
|
||||
NID_RSA_SHA3_##bitlen, \
|
||||
bitlen / 8, \
|
||||
EVP_MD_FLAG_DIGALGID_ABSENT, \
|
||||
sha3_init, \
|
||||
sha3_update, \
|
||||
sha3_final, \
|
||||
NULL, \
|
||||
NULL, \
|
||||
(KECCAK1600_WIDTH - bitlen * 2) / 8, \
|
||||
sizeof(KECCAK1600_CTX), \
|
||||
}; \
|
||||
return S390X_sha3_##bitlen##_CAPABLE ? \
|
||||
&s390x_sha3_##bitlen##_md : \
|
||||
&sha3_##bitlen##_md; \
|
||||
}
|
||||
|
||||
# define EVP_MD_SHAKE(bitlen) \
|
||||
const EVP_MD *EVP_shake##bitlen(void) \
|
||||
{ \
|
||||
static const EVP_MD s390x_shake##bitlen##_md = { \
|
||||
NID_shake##bitlen, \
|
||||
0, \
|
||||
bitlen / 8, \
|
||||
EVP_MD_FLAG_XOF, \
|
||||
s390x_shake_init, \
|
||||
s390x_sha3_update, \
|
||||
s390x_shake_final, \
|
||||
NULL, \
|
||||
NULL, \
|
||||
(KECCAK1600_WIDTH - bitlen * 2) / 8, \
|
||||
sizeof(KECCAK1600_CTX), \
|
||||
shake_ctrl \
|
||||
}; \
|
||||
static const EVP_MD shake##bitlen##_md = { \
|
||||
NID_shake##bitlen, \
|
||||
0, \
|
||||
bitlen / 8, \
|
||||
EVP_MD_FLAG_XOF, \
|
||||
shake_init, \
|
||||
sha3_update, \
|
||||
sha3_final, \
|
||||
NULL, \
|
||||
NULL, \
|
||||
(KECCAK1600_WIDTH - bitlen * 2) / 8, \
|
||||
sizeof(KECCAK1600_CTX), \
|
||||
shake_ctrl \
|
||||
}; \
|
||||
return S390X_shake##bitlen##_CAPABLE ? \
|
||||
&s390x_shake##bitlen##_md : \
|
||||
&shake##bitlen##_md; \
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
# define EVP_MD_SHA3(bitlen) \
|
||||
const EVP_MD *EVP_sha3_##bitlen(void) \
|
||||
{ \
|
||||
static const EVP_MD sha3_##bitlen##_md = { \
|
||||
@@ -153,12 +376,7 @@ const EVP_MD *EVP_sha3_##bitlen(void) \
|
||||
return &sha3_##bitlen##_md; \
|
||||
}
|
||||
|
||||
EVP_MD_SHA3(224)
|
||||
EVP_MD_SHA3(256)
|
||||
EVP_MD_SHA3(384)
|
||||
EVP_MD_SHA3(512)
|
||||
|
||||
#define EVP_MD_SHAKE(bitlen) \
|
||||
# define EVP_MD_SHAKE(bitlen) \
|
||||
const EVP_MD *EVP_shake##bitlen(void) \
|
||||
{ \
|
||||
static const EVP_MD shake##bitlen##_md = { \
|
||||
@@ -177,6 +395,12 @@ const EVP_MD *EVP_shake##bitlen(void) \
|
||||
}; \
|
||||
return &shake##bitlen##_md; \
|
||||
}
|
||||
#endif
|
||||
|
||||
EVP_MD_SHA3(224)
|
||||
EVP_MD_SHA3(256)
|
||||
EVP_MD_SHA3(384)
|
||||
EVP_MD_SHA3(512)
|
||||
|
||||
EVP_MD_SHAKE(128)
|
||||
EVP_MD_SHAKE(256)
|
||||
@@ -182,6 +182,7 @@ struct x509_st {
|
||||
unsigned char sha1_hash[SHA_DIGEST_LENGTH];
|
||||
X509_CERT_AUX *aux;
|
||||
CRYPTO_RWLOCK *lock;
|
||||
volatile int ex_cached;
|
||||
} /* X509 */ ;
|
||||
|
||||
/*
|
||||
|
||||
@@ -157,16 +157,18 @@ void *OPENSSL_LH_retrieve(OPENSSL_LHASH *lh, const void *data)
|
||||
OPENSSL_LH_NODE **rn;
|
||||
void *ret;
|
||||
|
||||
lh->error = 0;
|
||||
tsan_store((TSAN_QUALIFIER int *)&lh->error, 0);
|
||||
|
||||
rn = getrn(lh, data, &hash);
|
||||
|
||||
if (*rn == NULL) {
|
||||
lh->num_retrieve_miss++;
|
||||
tsan_counter(&lh->num_retrieve_miss);
|
||||
return NULL;
|
||||
} else {
|
||||
ret = (*rn)->data;
|
||||
lh->num_retrieve++;
|
||||
tsan_counter(&lh->num_retrieve);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -296,7 +298,7 @@ static OPENSSL_LH_NODE **getrn(OPENSSL_LHASH *lh,
|
||||
OPENSSL_LH_COMPFUNC cf;
|
||||
|
||||
hash = (*(lh->hash)) (data);
|
||||
lh->num_hash_calls++;
|
||||
tsan_counter(&lh->num_hash_calls);
|
||||
*rhash = hash;
|
||||
|
||||
nn = hash % lh->pmax;
|
||||
@@ -306,12 +308,12 @@ static OPENSSL_LH_NODE **getrn(OPENSSL_LHASH *lh,
|
||||
cf = lh->comp;
|
||||
ret = &(lh->b[(int)nn]);
|
||||
for (n1 = *ret; n1 != NULL; n1 = n1->next) {
|
||||
lh->num_hash_comps++;
|
||||
tsan_counter(&lh->num_hash_comps);
|
||||
if (n1->hash != hash) {
|
||||
ret = &(n1->next);
|
||||
continue;
|
||||
}
|
||||
lh->num_comp_calls++;
|
||||
tsan_counter(&lh->num_comp_calls);
|
||||
if (cf(n1->data, data) == 0)
|
||||
break;
|
||||
ret = &(n1->next);
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
*/
|
||||
#include <openssl/crypto.h>
|
||||
|
||||
#include "internal/tsan_assist.h"
|
||||
|
||||
struct lhash_node_st {
|
||||
void *data;
|
||||
struct lhash_node_st *next;
|
||||
@@ -29,14 +31,14 @@ struct lhash_st {
|
||||
unsigned long num_expand_reallocs;
|
||||
unsigned long num_contracts;
|
||||
unsigned long num_contract_reallocs;
|
||||
unsigned long num_hash_calls;
|
||||
unsigned long num_comp_calls;
|
||||
TSAN_QUALIFIER unsigned long num_hash_calls;
|
||||
TSAN_QUALIFIER unsigned long num_comp_calls;
|
||||
unsigned long num_insert;
|
||||
unsigned long num_replace;
|
||||
unsigned long num_delete;
|
||||
unsigned long num_no_delete;
|
||||
unsigned long num_retrieve;
|
||||
unsigned long num_retrieve_miss;
|
||||
unsigned long num_hash_comps;
|
||||
TSAN_QUALIFIER unsigned long num_retrieve;
|
||||
TSAN_QUALIFIER unsigned long num_retrieve_miss;
|
||||
TSAN_QUALIFIER unsigned long num_hash_comps;
|
||||
int error;
|
||||
};
|
||||
+9
-9
@@ -31,13 +31,13 @@ static void (*free_impl)(void *, const char *, int)
|
||||
= CRYPTO_free;
|
||||
|
||||
#ifndef OPENSSL_NO_CRYPTO_MDEBUG
|
||||
static int malloc_count;
|
||||
static int realloc_count;
|
||||
static int free_count;
|
||||
static int dummy;
|
||||
# include "internal/tsan_assist.h"
|
||||
|
||||
# define INCREMENT(x) CRYPTO_atomic_add(&x, 1, &dummy, memdbg_lock)
|
||||
# define GET(ret, val) CRYPTO_atomic_read(&val, ret, memdbg_lock)
|
||||
static TSAN_QUALIFIER int malloc_count;
|
||||
static TSAN_QUALIFIER int realloc_count;
|
||||
static TSAN_QUALIFIER int free_count;
|
||||
|
||||
# define INCREMENT(x) tsan_counter(&(x))
|
||||
|
||||
static char *md_failstring;
|
||||
static long md_count;
|
||||
@@ -98,11 +98,11 @@ void CRYPTO_get_mem_functions(
|
||||
void CRYPTO_get_alloc_counts(int *mcount, int *rcount, int *fcount)
|
||||
{
|
||||
if (mcount != NULL)
|
||||
GET(mcount, malloc_count);
|
||||
*mcount = tsan_load(&malloc_count);
|
||||
if (rcount != NULL)
|
||||
GET(rcount, realloc_count);
|
||||
*rcount = tsan_load(&realloc_count);
|
||||
if (fcount != NULL)
|
||||
GET(fcount, free_count);
|
||||
*fcount = tsan_load(&free_count);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -46,10 +46,9 @@ int OBJ_find_sigid_algs(int signid, int *pdig_nid, int *ppkey_nid)
|
||||
const nid_triple *rv = NULL;
|
||||
tmp.sign_id = signid;
|
||||
|
||||
if (sig_app) {
|
||||
if (sig_app != NULL) {
|
||||
int idx = sk_nid_triple_find(sig_app, &tmp);
|
||||
if (idx >= 0)
|
||||
rv = sk_nid_triple_value(sig_app, idx);
|
||||
rv = sk_nid_triple_value(sig_app, idx);
|
||||
}
|
||||
#ifndef OBJ_XREF_TEST2
|
||||
if (rv == NULL) {
|
||||
|
||||
@@ -1605,7 +1605,7 @@ secg-scheme 14 3 : dhSinglePass-cofactorDH-sha512kdf-scheme
|
||||
id-pkinit 4 : pkInitClientAuth : PKINIT Client Auth
|
||||
id-pkinit 5 : pkInitKDC : Signing KDC Response
|
||||
|
||||
# New algorithms from draft-ietf-curdle-pkix-04
|
||||
# From RFC8410
|
||||
1 3 101 110 : X25519
|
||||
1 3 101 111 : X448
|
||||
1 3 101 112 : ED25519
|
||||
|
||||
@@ -12,6 +12,10 @@
|
||||
|
||||
# ifndef __ASSEMBLER__
|
||||
|
||||
void s390x_kimd(const unsigned char *in, size_t len, unsigned int fc,
|
||||
void *param);
|
||||
void s390x_klmd(const unsigned char *in, size_t inlen, unsigned char *out,
|
||||
size_t outlen, unsigned int fc, void *param);
|
||||
void s390x_km(const unsigned char *in, size_t len, unsigned char *out,
|
||||
unsigned int fc, void *param);
|
||||
void s390x_kmac(const unsigned char *in, size_t len, unsigned int fc,
|
||||
|
||||
@@ -262,6 +262,48 @@ OPENSSL_vx_probe:
|
||||
.size OPENSSL_vx_probe,.-OPENSSL_vx_probe
|
||||
___
|
||||
|
||||
{
|
||||
################
|
||||
# void s390x_kimd(const unsigned char *in, size_t len, unsigned int fc,
|
||||
# void *param)
|
||||
my ($in,$len,$fc,$param) = map("%r$_",(2..5));
|
||||
$code.=<<___;
|
||||
.globl s390x_kimd
|
||||
.type s390x_kimd,\@function
|
||||
.align 16
|
||||
s390x_kimd:
|
||||
llgfr %r0,$fc
|
||||
lgr %r1,$param
|
||||
|
||||
.long 0xb93e0002 # kimd %r0,%r2
|
||||
brc 1,.-4 # pay attention to "partial completion"
|
||||
|
||||
br $ra
|
||||
.size s390x_kimd,.-s390x_kimd
|
||||
___
|
||||
}
|
||||
|
||||
{
|
||||
################
|
||||
# void s390x_klmd(const unsigned char *in, size_t inlen, unsigned char *out,
|
||||
# size_t outlen, unsigned int fc, void *param)
|
||||
my ($in,$inlen,$out,$outlen,$fc) = map("%r$_",(2..6));
|
||||
$code.=<<___;
|
||||
.globl s390x_klmd
|
||||
.type s390x_klmd,\@function
|
||||
.align 32
|
||||
s390x_klmd:
|
||||
llgfr %r0,$fc
|
||||
l${g} %r1,$stdframe($sp)
|
||||
|
||||
.long 0xb93f0042 # klmd %r4,%r2
|
||||
brc 1,.-4 # pay attention to "partial completion"
|
||||
|
||||
br $ra
|
||||
.size s390x_klmd,.-s390x_klmd
|
||||
___
|
||||
}
|
||||
|
||||
################
|
||||
# void s390x_km(const unsigned char *in, size_t len, unsigned char *out,
|
||||
# unsigned int fc, void *param)
|
||||
|
||||
@@ -329,10 +329,7 @@ static int get_cert_by_subject(X509_LOOKUP *xl, X509_LOOKUP_TYPE type,
|
||||
*/
|
||||
CRYPTO_THREAD_write_lock(ctx->lock);
|
||||
j = sk_X509_OBJECT_find(xl->store_ctx->objs, &stmp);
|
||||
if (j != -1)
|
||||
tmp = sk_X509_OBJECT_value(xl->store_ctx->objs, j);
|
||||
else
|
||||
tmp = NULL;
|
||||
tmp = sk_X509_OBJECT_value(xl->store_ctx->objs, j);
|
||||
CRYPTO_THREAD_unlock(ctx->lock);
|
||||
|
||||
/* If a CRL, update the last file suffix added for this */
|
||||
@@ -343,11 +340,10 @@ static int get_cert_by_subject(X509_LOOKUP *xl, X509_LOOKUP_TYPE type,
|
||||
* Look for entry again in case another thread added an entry
|
||||
* first.
|
||||
*/
|
||||
if (!hent) {
|
||||
if (hent == NULL) {
|
||||
htmp.hash = h;
|
||||
idx = sk_BY_DIR_HASH_find(ent->hashes, &htmp);
|
||||
if (idx >= 0)
|
||||
hent = sk_BY_DIR_HASH_value(ent->hashes, idx);
|
||||
hent = sk_BY_DIR_HASH_value(ent->hashes, idx);
|
||||
}
|
||||
if (hent == NULL) {
|
||||
hent = OPENSSL_malloc(sizeof(*hent));
|
||||
|
||||
@@ -619,17 +619,18 @@ STACK_OF(X509_CRL) *X509_STORE_CTX_get1_crls(X509_STORE_CTX *ctx, X509_NAME *nm)
|
||||
X509_OBJECT *X509_OBJECT_retrieve_match(STACK_OF(X509_OBJECT) *h,
|
||||
X509_OBJECT *x)
|
||||
{
|
||||
int idx, i;
|
||||
int idx, i, num;
|
||||
X509_OBJECT *obj;
|
||||
|
||||
idx = sk_X509_OBJECT_find(h, x);
|
||||
if (idx == -1)
|
||||
if (idx < 0)
|
||||
return NULL;
|
||||
if ((x->type != X509_LU_X509) && (x->type != X509_LU_CRL))
|
||||
return sk_X509_OBJECT_value(h, idx);
|
||||
for (i = idx; i < sk_X509_OBJECT_num(h); i++) {
|
||||
for (i = idx, num = sk_X509_OBJECT_num(h); i < num; i++) {
|
||||
obj = sk_X509_OBJECT_value(h, i);
|
||||
if (x509_object_cmp
|
||||
((const X509_OBJECT **)&obj, (const X509_OBJECT **)&x))
|
||||
if (x509_object_cmp((const X509_OBJECT **)&obj,
|
||||
(const X509_OBJECT **)&x))
|
||||
return NULL;
|
||||
if (x->type == X509_LU_X509) {
|
||||
if (!X509_cmp(obj->data.x509, x->data.x509))
|
||||
|
||||
@@ -98,13 +98,14 @@ int X509_TRUST_get_by_id(int id)
|
||||
{
|
||||
X509_TRUST tmp;
|
||||
int idx;
|
||||
|
||||
if ((id >= X509_TRUST_MIN) && (id <= X509_TRUST_MAX))
|
||||
return id - X509_TRUST_MIN;
|
||||
tmp.trust = id;
|
||||
if (!trtable)
|
||||
if (trtable == NULL)
|
||||
return -1;
|
||||
tmp.trust = id;
|
||||
idx = sk_X509_TRUST_find(trtable, &tmp);
|
||||
if (idx == -1)
|
||||
if (idx < 0)
|
||||
return -1;
|
||||
return idx + X509_TRUST_COUNT;
|
||||
}
|
||||
|
||||
@@ -555,10 +555,9 @@ int X509_VERIFY_PARAM_add0_table(X509_VERIFY_PARAM *param)
|
||||
return 0;
|
||||
} else {
|
||||
idx = sk_X509_VERIFY_PARAM_find(param_table, param);
|
||||
if (idx != -1) {
|
||||
ptmp = sk_X509_VERIFY_PARAM_value(param_table, idx);
|
||||
if (idx >= 0) {
|
||||
ptmp = sk_X509_VERIFY_PARAM_delete(param_table, idx);
|
||||
X509_VERIFY_PARAM_free(ptmp);
|
||||
(void)sk_X509_VERIFY_PARAM_delete(param_table, idx);
|
||||
}
|
||||
}
|
||||
if (!sk_X509_VERIFY_PARAM_push(param_table, param))
|
||||
@@ -588,9 +587,9 @@ const X509_VERIFY_PARAM *X509_VERIFY_PARAM_lookup(const char *name)
|
||||
X509_VERIFY_PARAM pm;
|
||||
|
||||
pm.name = (char *)name;
|
||||
if (param_table) {
|
||||
if (param_table != NULL) {
|
||||
idx = sk_X509_VERIFY_PARAM_find(param_table, &pm);
|
||||
if (idx != -1)
|
||||
if (idx >= 0)
|
||||
return sk_X509_VERIFY_PARAM_value(param_table, idx);
|
||||
}
|
||||
return OBJ_bsearch_table(&pm, default_table, OSSL_NELEM(default_table));
|
||||
|
||||
@@ -26,8 +26,8 @@ int X509_NAME_get_text_by_NID(X509_NAME *name, int nid, char *buf, int len)
|
||||
return X509_NAME_get_text_by_OBJ(name, obj, buf, len);
|
||||
}
|
||||
|
||||
int X509_NAME_get_text_by_OBJ(X509_NAME *name, const ASN1_OBJECT *obj, char *buf,
|
||||
int len)
|
||||
int X509_NAME_get_text_by_OBJ(X509_NAME *name, const ASN1_OBJECT *obj,
|
||||
char *buf, int len)
|
||||
{
|
||||
int i;
|
||||
const ASN1_STRING *data;
|
||||
@@ -36,9 +36,11 @@ int X509_NAME_get_text_by_OBJ(X509_NAME *name, const ASN1_OBJECT *obj, char *buf
|
||||
if (i < 0)
|
||||
return -1;
|
||||
data = X509_NAME_ENTRY_get_data(X509_NAME_get_entry(name, i));
|
||||
i = (data->length > (len - 1)) ? (len - 1) : data->length;
|
||||
if (buf == NULL)
|
||||
return data->length;
|
||||
if (len <= 0)
|
||||
return 0;
|
||||
i = (data->length > (len - 1)) ? (len - 1) : data->length;
|
||||
memcpy(buf, data->data, i);
|
||||
buf[i] = '\0';
|
||||
return i;
|
||||
|
||||
+7
-3
@@ -383,8 +383,11 @@ static int def_crl_lookup(X509_CRL *crl,
|
||||
X509_NAME *issuer)
|
||||
{
|
||||
X509_REVOKED rtmp, *rev;
|
||||
int idx;
|
||||
rtmp.serialNumber = *serial;
|
||||
int idx, num;
|
||||
|
||||
if (crl->crl.revoked == NULL)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* Sort revoked into serial number order if not already sorted. Do this
|
||||
* under a lock to avoid race condition.
|
||||
@@ -394,11 +397,12 @@ static int def_crl_lookup(X509_CRL *crl,
|
||||
sk_X509_REVOKED_sort(crl->crl.revoked);
|
||||
CRYPTO_THREAD_unlock(crl->lock);
|
||||
}
|
||||
rtmp.serialNumber = *serial;
|
||||
idx = sk_X509_REVOKED_find(crl->crl.revoked, &rtmp);
|
||||
if (idx < 0)
|
||||
return 0;
|
||||
/* Need to look for matching name */
|
||||
for (; idx < sk_X509_REVOKED_num(crl->crl.revoked); idx++) {
|
||||
for (num = sk_X509_REVOKED_num(crl->crl.revoked); idx < num; idx++) {
|
||||
rev = sk_X509_REVOKED_value(crl->crl.revoked, idx);
|
||||
if (ASN1_INTEGER_cmp(&rev->serialNumber, serial))
|
||||
return 0;
|
||||
|
||||
@@ -26,19 +26,19 @@ static int policy_cache_set_int(long *out, ASN1_INTEGER *value);
|
||||
static int policy_cache_create(X509 *x,
|
||||
CERTIFICATEPOLICIES *policies, int crit)
|
||||
{
|
||||
int i, ret = 0;
|
||||
int i, num, ret = 0;
|
||||
X509_POLICY_CACHE *cache = x->policy_cache;
|
||||
X509_POLICY_DATA *data = NULL;
|
||||
POLICYINFO *policy;
|
||||
|
||||
if (sk_POLICYINFO_num(policies) == 0)
|
||||
if ((num = sk_POLICYINFO_num(policies)) <= 0)
|
||||
goto bad_policy;
|
||||
cache->data = sk_X509_POLICY_DATA_new(policy_data_cmp);
|
||||
if (cache->data == NULL) {
|
||||
X509V3err(X509V3_F_POLICY_CACHE_CREATE, ERR_R_MALLOC_FAILURE);
|
||||
goto just_cleanup;
|
||||
}
|
||||
for (i = 0; i < sk_POLICYINFO_num(policies); i++) {
|
||||
for (i = 0; i < num; i++) {
|
||||
policy = sk_POLICYINFO_value(policies, i);
|
||||
data = policy_data_new(policy, NULL, crit);
|
||||
if (data == NULL) {
|
||||
@@ -54,7 +54,7 @@ static int policy_cache_create(X509 *x,
|
||||
goto bad_policy;
|
||||
}
|
||||
cache->anyPolicy = data;
|
||||
} else if (sk_X509_POLICY_DATA_find(cache->data, data) != -1) {
|
||||
} else if (sk_X509_POLICY_DATA_find(cache->data, data) >=0 ) {
|
||||
ret = -1;
|
||||
goto bad_policy;
|
||||
} else if (!sk_X509_POLICY_DATA_push(cache->data, data)) {
|
||||
@@ -204,8 +204,6 @@ X509_POLICY_DATA *policy_cache_find_data(const X509_POLICY_CACHE *cache,
|
||||
X509_POLICY_DATA tmp;
|
||||
tmp.valid_policy = (ASN1_OBJECT *)id;
|
||||
idx = sk_X509_POLICY_DATA_find(cache->data, &tmp);
|
||||
if (idx == -1)
|
||||
return NULL;
|
||||
return sk_X509_POLICY_DATA_value(cache->data, idx);
|
||||
}
|
||||
|
||||
|
||||
@@ -36,9 +36,6 @@ X509_POLICY_NODE *tree_find_sk(STACK_OF(X509_POLICY_NODE) *nodes,
|
||||
l.data = &n;
|
||||
|
||||
idx = sk_X509_POLICY_NODE_find(nodes, &l);
|
||||
if (idx == -1)
|
||||
return NULL;
|
||||
|
||||
return sk_X509_POLICY_NODE_value(nodes, idx);
|
||||
|
||||
}
|
||||
|
||||
@@ -442,7 +442,7 @@ static int tree_add_auth_node(STACK_OF(X509_POLICY_NODE) **pnodes,
|
||||
if (*pnodes == NULL &&
|
||||
(*pnodes = policy_node_cmp_new()) == NULL)
|
||||
return 0;
|
||||
if (sk_X509_POLICY_NODE_find(*pnodes, pcy) != -1)
|
||||
if (sk_X509_POLICY_NODE_find(*pnodes, pcy) >= 0)
|
||||
return 1;
|
||||
return sk_X509_POLICY_NODE_push(*pnodes, pcy) != 0;
|
||||
}
|
||||
|
||||
@@ -64,8 +64,6 @@ const X509V3_EXT_METHOD *X509V3_EXT_get_nid(int nid)
|
||||
if (!ext_list)
|
||||
return NULL;
|
||||
idx = sk_X509V3_EXT_METHOD_find(ext_list, &tmp);
|
||||
if (idx == -1)
|
||||
return NULL;
|
||||
return sk_X509V3_EXT_METHOD_value(ext_list, idx);
|
||||
}
|
||||
|
||||
|
||||
+13
-5
@@ -13,6 +13,7 @@
|
||||
#include <openssl/x509v3.h>
|
||||
#include <openssl/x509_vfy.h>
|
||||
#include "internal/x509_int.h"
|
||||
#include "internal/tsan_assist.h"
|
||||
|
||||
static void x509v3_cache_extensions(X509 *x);
|
||||
|
||||
@@ -133,13 +134,14 @@ int X509_PURPOSE_get_by_id(int purpose)
|
||||
{
|
||||
X509_PURPOSE tmp;
|
||||
int idx;
|
||||
|
||||
if ((purpose >= X509_PURPOSE_MIN) && (purpose <= X509_PURPOSE_MAX))
|
||||
return purpose - X509_PURPOSE_MIN;
|
||||
tmp.purpose = purpose;
|
||||
if (!xptable)
|
||||
if (xptable == NULL)
|
||||
return -1;
|
||||
tmp.purpose = purpose;
|
||||
idx = sk_X509_PURPOSE_find(xptable, &tmp);
|
||||
if (idx == -1)
|
||||
if (idx < 0)
|
||||
return -1;
|
||||
return idx + X509_PURPOSE_COUNT;
|
||||
}
|
||||
@@ -350,10 +352,10 @@ static void x509v3_cache_extensions(X509 *x)
|
||||
ASN1_BIT_STRING *ns;
|
||||
EXTENDED_KEY_USAGE *extusage;
|
||||
X509_EXTENSION *ex;
|
||||
|
||||
int i;
|
||||
|
||||
if (x->ex_flags & EXFLAG_SET)
|
||||
/* fast lock-free check, see end of the function for details. */
|
||||
if (tsan_load((TSAN_QUALIFIER int *)&x->ex_cached))
|
||||
return;
|
||||
|
||||
CRYPTO_THREAD_write_lock(x->lock);
|
||||
@@ -497,6 +499,12 @@ static void x509v3_cache_extensions(X509 *x)
|
||||
x509_init_sig_info(x);
|
||||
x->ex_flags |= EXFLAG_SET;
|
||||
CRYPTO_THREAD_unlock(x->lock);
|
||||
/*
|
||||
* It has to be placed after memory barrier, which is implied by unlock.
|
||||
* Worst thing that can happen is that another thread proceeds to lock
|
||||
* and checks x->ex_flags & EXFLAGS_SET. See beginning of the function.
|
||||
*/
|
||||
tsan_store((TSAN_QUALIFIER int *)&x->ex_cached, 1);
|
||||
}
|
||||
|
||||
/*-
|
||||
|
||||
Reference in New Issue
Block a user