Import OpenSSL 1.1.1i
This commit is contained in:
@@ -63,15 +63,15 @@ static void ctr_XOR(RAND_DRBG_CTR *ctr, const unsigned char *in, size_t inlen)
|
||||
* Process a complete block using BCC algorithm of SP 800-90A 10.3.3
|
||||
*/
|
||||
__owur static int ctr_BCC_block(RAND_DRBG_CTR *ctr, unsigned char *out,
|
||||
const unsigned char *in)
|
||||
const unsigned char *in, int len)
|
||||
{
|
||||
int i, outlen = AES_BLOCK_SIZE;
|
||||
|
||||
for (i = 0; i < 16; i++)
|
||||
for (i = 0; i < len; i++)
|
||||
out[i] ^= in[i];
|
||||
|
||||
if (!EVP_CipherUpdate(ctr->ctx_df, out, &outlen, out, AES_BLOCK_SIZE)
|
||||
|| outlen != AES_BLOCK_SIZE)
|
||||
if (!EVP_CipherUpdate(ctr->ctx_df, out, &outlen, out, len)
|
||||
|| outlen != len)
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
@@ -82,12 +82,16 @@ __owur static int ctr_BCC_block(RAND_DRBG_CTR *ctr, unsigned char *out,
|
||||
*/
|
||||
__owur static int ctr_BCC_blocks(RAND_DRBG_CTR *ctr, const unsigned char *in)
|
||||
{
|
||||
if (!ctr_BCC_block(ctr, ctr->KX, in)
|
||||
|| !ctr_BCC_block(ctr, ctr->KX + 16, in))
|
||||
return 0;
|
||||
if (ctr->keylen != 16 && !ctr_BCC_block(ctr, ctr->KX + 32, in))
|
||||
return 0;
|
||||
return 1;
|
||||
unsigned char in_tmp[48];
|
||||
unsigned char num_of_blk = 2;
|
||||
|
||||
memcpy(in_tmp, in, 16);
|
||||
memcpy(in_tmp + 16, in, 16);
|
||||
if (ctr->keylen != 16) {
|
||||
memcpy(in_tmp + 32, in, 16);
|
||||
num_of_blk = 3;
|
||||
}
|
||||
return ctr_BCC_block(ctr, ctr->KX, in_tmp, AES_BLOCK_SIZE * num_of_blk);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -96,19 +100,14 @@ __owur static int ctr_BCC_blocks(RAND_DRBG_CTR *ctr, const unsigned char *in)
|
||||
*/
|
||||
__owur static int ctr_BCC_init(RAND_DRBG_CTR *ctr)
|
||||
{
|
||||
unsigned char bltmp[48] = {0};
|
||||
unsigned char num_of_blk;
|
||||
|
||||
memset(ctr->KX, 0, 48);
|
||||
memset(ctr->bltmp, 0, 16);
|
||||
if (!ctr_BCC_block(ctr, ctr->KX, ctr->bltmp))
|
||||
return 0;
|
||||
ctr->bltmp[3] = 1;
|
||||
if (!ctr_BCC_block(ctr, ctr->KX + 16, ctr->bltmp))
|
||||
return 0;
|
||||
if (ctr->keylen != 16) {
|
||||
ctr->bltmp[3] = 2;
|
||||
if (!ctr_BCC_block(ctr, ctr->KX + 32, ctr->bltmp))
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
num_of_blk = ctr->keylen == 16 ? 2 : 3;
|
||||
bltmp[(AES_BLOCK_SIZE * 1) + 3] = 1;
|
||||
bltmp[(AES_BLOCK_SIZE * 2) + 3] = 2;
|
||||
return ctr_BCC_block(ctr, ctr->KX, bltmp, num_of_blk * AES_BLOCK_SIZE);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -197,20 +196,20 @@ __owur static int ctr_df(RAND_DRBG_CTR *ctr,
|
||||
|| !ctr_BCC_final(ctr))
|
||||
return 0;
|
||||
/* Set up key K */
|
||||
if (!EVP_CipherInit_ex(ctr->ctx, ctr->cipher, NULL, ctr->KX, NULL, 1))
|
||||
if (!EVP_CipherInit_ex(ctr->ctx_ecb, NULL, NULL, ctr->KX, NULL, -1))
|
||||
return 0;
|
||||
/* X follows key K */
|
||||
if (!EVP_CipherUpdate(ctr->ctx, ctr->KX, &outlen, ctr->KX + ctr->keylen,
|
||||
if (!EVP_CipherUpdate(ctr->ctx_ecb, ctr->KX, &outlen, ctr->KX + ctr->keylen,
|
||||
AES_BLOCK_SIZE)
|
||||
|| outlen != AES_BLOCK_SIZE)
|
||||
return 0;
|
||||
if (!EVP_CipherUpdate(ctr->ctx, ctr->KX + 16, &outlen, ctr->KX,
|
||||
if (!EVP_CipherUpdate(ctr->ctx_ecb, ctr->KX + 16, &outlen, ctr->KX,
|
||||
AES_BLOCK_SIZE)
|
||||
|| outlen != AES_BLOCK_SIZE)
|
||||
return 0;
|
||||
if (ctr->keylen != 16)
|
||||
if (!EVP_CipherUpdate(ctr->ctx, ctr->KX + 32, &outlen, ctr->KX + 16,
|
||||
AES_BLOCK_SIZE)
|
||||
if (!EVP_CipherUpdate(ctr->ctx_ecb, ctr->KX + 32, &outlen,
|
||||
ctr->KX + 16, AES_BLOCK_SIZE)
|
||||
|| outlen != AES_BLOCK_SIZE)
|
||||
return 0;
|
||||
return 1;
|
||||
@@ -229,31 +228,25 @@ __owur static int ctr_update(RAND_DRBG *drbg,
|
||||
{
|
||||
RAND_DRBG_CTR *ctr = &drbg->data.ctr;
|
||||
int outlen = AES_BLOCK_SIZE;
|
||||
unsigned char V_tmp[48], out[48];
|
||||
unsigned char len;
|
||||
|
||||
/* correct key is already set up. */
|
||||
memcpy(V_tmp, ctr->V, 16);
|
||||
inc_128(ctr);
|
||||
if (!EVP_CipherUpdate(ctr->ctx, ctr->K, &outlen, ctr->V, AES_BLOCK_SIZE)
|
||||
|| outlen != AES_BLOCK_SIZE)
|
||||
return 0;
|
||||
|
||||
/* If keylen longer than 128 bits need extra encrypt */
|
||||
if (ctr->keylen != 16) {
|
||||
memcpy(V_tmp + 16, ctr->V, 16);
|
||||
if (ctr->keylen == 16) {
|
||||
len = 32;
|
||||
} else {
|
||||
inc_128(ctr);
|
||||
if (!EVP_CipherUpdate(ctr->ctx, ctr->K+16, &outlen, ctr->V,
|
||||
AES_BLOCK_SIZE)
|
||||
|| outlen != AES_BLOCK_SIZE)
|
||||
return 0;
|
||||
memcpy(V_tmp + 32, ctr->V, 16);
|
||||
len = 48;
|
||||
}
|
||||
inc_128(ctr);
|
||||
if (!EVP_CipherUpdate(ctr->ctx, ctr->V, &outlen, ctr->V, AES_BLOCK_SIZE)
|
||||
|| outlen != AES_BLOCK_SIZE)
|
||||
if (!EVP_CipherUpdate(ctr->ctx_ecb, out, &outlen, V_tmp, len)
|
||||
|| outlen != len)
|
||||
return 0;
|
||||
|
||||
/* If 192 bit key part of V is on end of K */
|
||||
if (ctr->keylen == 24) {
|
||||
memcpy(ctr->V + 8, ctr->V, 8);
|
||||
memcpy(ctr->V, ctr->K + 24, 8);
|
||||
}
|
||||
memcpy(ctr->K, out, ctr->keylen);
|
||||
memcpy(ctr->V, out + ctr->keylen, 16);
|
||||
|
||||
if ((drbg->flags & RAND_DRBG_FLAG_CTR_NO_DF) == 0) {
|
||||
/* If no input reuse existing derived value */
|
||||
@@ -268,7 +261,8 @@ __owur static int ctr_update(RAND_DRBG *drbg,
|
||||
ctr_XOR(ctr, in2, in2len);
|
||||
}
|
||||
|
||||
if (!EVP_CipherInit_ex(ctr->ctx, ctr->cipher, NULL, ctr->K, NULL, 1))
|
||||
if (!EVP_CipherInit_ex(ctr->ctx_ecb, NULL, NULL, ctr->K, NULL, -1)
|
||||
|| !EVP_CipherInit_ex(ctr->ctx_ctr, NULL, NULL, ctr->K, NULL, -1))
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
@@ -285,8 +279,10 @@ __owur static int drbg_ctr_instantiate(RAND_DRBG *drbg,
|
||||
|
||||
memset(ctr->K, 0, sizeof(ctr->K));
|
||||
memset(ctr->V, 0, sizeof(ctr->V));
|
||||
if (!EVP_CipherInit_ex(ctr->ctx, ctr->cipher, NULL, ctr->K, NULL, 1))
|
||||
if (!EVP_CipherInit_ex(ctr->ctx_ecb, NULL, NULL, ctr->K, NULL, -1))
|
||||
return 0;
|
||||
|
||||
inc_128(ctr);
|
||||
if (!ctr_update(drbg, entropy, entropylen, pers, perslen, nonce, noncelen))
|
||||
return 0;
|
||||
return 1;
|
||||
@@ -296,20 +292,40 @@ __owur static int drbg_ctr_reseed(RAND_DRBG *drbg,
|
||||
const unsigned char *entropy, size_t entropylen,
|
||||
const unsigned char *adin, size_t adinlen)
|
||||
{
|
||||
RAND_DRBG_CTR *ctr = &drbg->data.ctr;
|
||||
|
||||
if (entropy == NULL)
|
||||
return 0;
|
||||
|
||||
inc_128(ctr);
|
||||
if (!ctr_update(drbg, entropy, entropylen, adin, adinlen, NULL, 0))
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void ctr96_inc(unsigned char *counter)
|
||||
{
|
||||
u32 n = 12, c = 1;
|
||||
|
||||
do {
|
||||
--n;
|
||||
c += counter[n];
|
||||
counter[n] = (u8)c;
|
||||
c >>= 8;
|
||||
} while (n);
|
||||
}
|
||||
|
||||
__owur static int drbg_ctr_generate(RAND_DRBG *drbg,
|
||||
unsigned char *out, size_t outlen,
|
||||
const unsigned char *adin, size_t adinlen)
|
||||
{
|
||||
RAND_DRBG_CTR *ctr = &drbg->data.ctr;
|
||||
unsigned int ctr32, blocks;
|
||||
int outl, buflen;
|
||||
|
||||
if (adin != NULL && adinlen != 0) {
|
||||
inc_128(ctr);
|
||||
|
||||
if (!ctr_update(drbg, adin, adinlen, NULL, 0, NULL, 0))
|
||||
return 0;
|
||||
/* This means we reuse derived value */
|
||||
@@ -321,28 +337,53 @@ __owur static int drbg_ctr_generate(RAND_DRBG *drbg,
|
||||
adinlen = 0;
|
||||
}
|
||||
|
||||
for ( ; ; ) {
|
||||
int outl = AES_BLOCK_SIZE;
|
||||
inc_128(ctr);
|
||||
|
||||
if (outlen == 0) {
|
||||
inc_128(ctr);
|
||||
if (outlen < 16) {
|
||||
/* Use K as temp space as it will be updated */
|
||||
if (!EVP_CipherUpdate(ctr->ctx, ctr->K, &outl, ctr->V,
|
||||
AES_BLOCK_SIZE)
|
||||
|| outl != AES_BLOCK_SIZE)
|
||||
return 0;
|
||||
memcpy(out, ctr->K, outlen);
|
||||
break;
|
||||
}
|
||||
if (!EVP_CipherUpdate(ctr->ctx, out, &outl, ctr->V, AES_BLOCK_SIZE)
|
||||
|| outl != AES_BLOCK_SIZE)
|
||||
|
||||
if (!ctr_update(drbg, adin, adinlen, NULL, 0, NULL, 0))
|
||||
return 0;
|
||||
out += 16;
|
||||
outlen -= 16;
|
||||
if (outlen == 0)
|
||||
break;
|
||||
return 1;
|
||||
}
|
||||
|
||||
memset(out, 0, outlen);
|
||||
|
||||
do {
|
||||
if (!EVP_CipherInit_ex(ctr->ctx_ctr,
|
||||
NULL, NULL, NULL, ctr->V, -1))
|
||||
return 0;
|
||||
|
||||
/*-
|
||||
* outlen has type size_t while EVP_CipherUpdate takes an
|
||||
* int argument and thus cannot be guaranteed to process more
|
||||
* than 2^31-1 bytes at a time. We process such huge generate
|
||||
* requests in 2^30 byte chunks, which is the greatest multiple
|
||||
* of AES block size lower than or equal to 2^31-1.
|
||||
*/
|
||||
buflen = outlen > (1U << 30) ? (1U << 30) : outlen;
|
||||
blocks = (buflen + 15) / 16;
|
||||
|
||||
ctr32 = GETU32(ctr->V + 12) + blocks;
|
||||
if (ctr32 < blocks) {
|
||||
/* 32-bit counter overflow into V. */
|
||||
if (ctr32 != 0) {
|
||||
blocks -= ctr32;
|
||||
buflen = blocks * 16;
|
||||
ctr32 = 0;
|
||||
}
|
||||
ctr96_inc(ctr->V);
|
||||
}
|
||||
PUTU32(ctr->V + 12, ctr32);
|
||||
|
||||
if (!EVP_CipherUpdate(ctr->ctx_ctr, out, &outl, out, buflen)
|
||||
|| outl != buflen)
|
||||
return 0;
|
||||
|
||||
out += buflen;
|
||||
outlen -= buflen;
|
||||
} while (outlen);
|
||||
|
||||
if (!ctr_update(drbg, adin, adinlen, NULL, 0, NULL, 0))
|
||||
return 0;
|
||||
return 1;
|
||||
@@ -350,7 +391,8 @@ __owur static int drbg_ctr_generate(RAND_DRBG *drbg,
|
||||
|
||||
static int drbg_ctr_uninstantiate(RAND_DRBG *drbg)
|
||||
{
|
||||
EVP_CIPHER_CTX_free(drbg->data.ctr.ctx);
|
||||
EVP_CIPHER_CTX_free(drbg->data.ctr.ctx_ecb);
|
||||
EVP_CIPHER_CTX_free(drbg->data.ctr.ctx_ctr);
|
||||
EVP_CIPHER_CTX_free(drbg->data.ctr.ctx_df);
|
||||
OPENSSL_cleanse(&drbg->data.ctr, sizeof(drbg->data.ctr));
|
||||
return 1;
|
||||
@@ -374,25 +416,36 @@ int drbg_ctr_init(RAND_DRBG *drbg)
|
||||
return 0;
|
||||
case NID_aes_128_ctr:
|
||||
keylen = 16;
|
||||
ctr->cipher = EVP_aes_128_ecb();
|
||||
ctr->cipher_ecb = EVP_aes_128_ecb();
|
||||
ctr->cipher_ctr = EVP_aes_128_ctr();
|
||||
break;
|
||||
case NID_aes_192_ctr:
|
||||
keylen = 24;
|
||||
ctr->cipher = EVP_aes_192_ecb();
|
||||
ctr->cipher_ecb = EVP_aes_192_ecb();
|
||||
ctr->cipher_ctr = EVP_aes_192_ctr();
|
||||
break;
|
||||
case NID_aes_256_ctr:
|
||||
keylen = 32;
|
||||
ctr->cipher = EVP_aes_256_ecb();
|
||||
ctr->cipher_ecb = EVP_aes_256_ecb();
|
||||
ctr->cipher_ctr = EVP_aes_256_ctr();
|
||||
break;
|
||||
}
|
||||
|
||||
drbg->meth = &drbg_ctr_meth;
|
||||
|
||||
ctr->keylen = keylen;
|
||||
if (ctr->ctx == NULL)
|
||||
ctr->ctx = EVP_CIPHER_CTX_new();
|
||||
if (ctr->ctx == NULL)
|
||||
if (ctr->ctx_ecb == NULL)
|
||||
ctr->ctx_ecb = EVP_CIPHER_CTX_new();
|
||||
if (ctr->ctx_ctr == NULL)
|
||||
ctr->ctx_ctr = EVP_CIPHER_CTX_new();
|
||||
if (ctr->ctx_ecb == NULL || ctr->ctx_ctr == NULL
|
||||
|| !EVP_CipherInit_ex(ctr->ctx_ecb,
|
||||
ctr->cipher_ecb, NULL, NULL, NULL, 1)
|
||||
|| !EVP_CipherInit_ex(ctr->ctx_ctr,
|
||||
ctr->cipher_ctr, NULL, NULL, NULL, 1))
|
||||
return 0;
|
||||
|
||||
drbg->meth = &drbg_ctr_meth;
|
||||
drbg->strength = keylen * 8;
|
||||
drbg->seedlen = keylen + 16;
|
||||
|
||||
@@ -410,7 +463,8 @@ int drbg_ctr_init(RAND_DRBG *drbg)
|
||||
if (ctr->ctx_df == NULL)
|
||||
return 0;
|
||||
/* Set key schedule for df_key */
|
||||
if (!EVP_CipherInit_ex(ctr->ctx_df, ctr->cipher, NULL, df_key, NULL, 1))
|
||||
if (!EVP_CipherInit_ex(ctr->ctx_df,
|
||||
ctr->cipher_ecb, NULL, df_key, NULL, 1))
|
||||
return 0;
|
||||
|
||||
drbg->min_entropylen = ctr->keylen;
|
||||
|
||||
@@ -327,13 +327,6 @@ int RAND_DRBG_instantiate(RAND_DRBG *drbg,
|
||||
max_entropylen += drbg->max_noncelen;
|
||||
}
|
||||
|
||||
drbg->reseed_next_counter = tsan_load(&drbg->reseed_prop_counter);
|
||||
if (drbg->reseed_next_counter) {
|
||||
drbg->reseed_next_counter++;
|
||||
if(!drbg->reseed_next_counter)
|
||||
drbg->reseed_next_counter = 1;
|
||||
}
|
||||
|
||||
if (drbg->get_entropy != NULL)
|
||||
entropylen = drbg->get_entropy(drbg, &entropy, min_entropy,
|
||||
min_entropylen, max_entropylen, 0);
|
||||
@@ -359,9 +352,15 @@ int RAND_DRBG_instantiate(RAND_DRBG *drbg,
|
||||
}
|
||||
|
||||
drbg->state = DRBG_READY;
|
||||
drbg->reseed_gen_counter = 1;
|
||||
drbg->generate_counter = 1;
|
||||
drbg->reseed_time = time(NULL);
|
||||
tsan_store(&drbg->reseed_prop_counter, drbg->reseed_next_counter);
|
||||
if (drbg->enable_reseed_propagation) {
|
||||
if (drbg->parent == NULL)
|
||||
tsan_counter(&drbg->reseed_counter);
|
||||
else
|
||||
tsan_store(&drbg->reseed_counter,
|
||||
tsan_load(&drbg->parent->reseed_counter));
|
||||
}
|
||||
|
||||
end:
|
||||
if (entropy != NULL && drbg->cleanup_entropy != NULL)
|
||||
@@ -428,14 +427,6 @@ int RAND_DRBG_reseed(RAND_DRBG *drbg,
|
||||
}
|
||||
|
||||
drbg->state = DRBG_ERROR;
|
||||
|
||||
drbg->reseed_next_counter = tsan_load(&drbg->reseed_prop_counter);
|
||||
if (drbg->reseed_next_counter) {
|
||||
drbg->reseed_next_counter++;
|
||||
if(!drbg->reseed_next_counter)
|
||||
drbg->reseed_next_counter = 1;
|
||||
}
|
||||
|
||||
if (drbg->get_entropy != NULL)
|
||||
entropylen = drbg->get_entropy(drbg, &entropy, drbg->strength,
|
||||
drbg->min_entropylen,
|
||||
@@ -451,9 +442,15 @@ int RAND_DRBG_reseed(RAND_DRBG *drbg,
|
||||
goto end;
|
||||
|
||||
drbg->state = DRBG_READY;
|
||||
drbg->reseed_gen_counter = 1;
|
||||
drbg->generate_counter = 1;
|
||||
drbg->reseed_time = time(NULL);
|
||||
tsan_store(&drbg->reseed_prop_counter, drbg->reseed_next_counter);
|
||||
if (drbg->enable_reseed_propagation) {
|
||||
if (drbg->parent == NULL)
|
||||
tsan_counter(&drbg->reseed_counter);
|
||||
else
|
||||
tsan_store(&drbg->reseed_counter,
|
||||
tsan_load(&drbg->parent->reseed_counter));
|
||||
}
|
||||
|
||||
end:
|
||||
if (entropy != NULL && drbg->cleanup_entropy != NULL)
|
||||
@@ -554,7 +551,9 @@ int rand_drbg_restart(RAND_DRBG *drbg,
|
||||
drbg->meth->reseed(drbg, adin, adinlen, NULL, 0);
|
||||
} else if (reseeded == 0) {
|
||||
/* do a full reseeding if it has not been done yet above */
|
||||
RAND_DRBG_reseed(drbg, NULL, 0, 0);
|
||||
if (!RAND_DRBG_reseed(drbg, NULL, 0, 0)) {
|
||||
RANDerr(RAND_F_RAND_DRBG_RESTART, RAND_R_RESEED_ERROR);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -612,7 +611,7 @@ int RAND_DRBG_generate(RAND_DRBG *drbg, unsigned char *out, size_t outlen,
|
||||
}
|
||||
|
||||
if (drbg->reseed_interval > 0) {
|
||||
if (drbg->reseed_gen_counter >= drbg->reseed_interval)
|
||||
if (drbg->generate_counter >= drbg->reseed_interval)
|
||||
reseed_required = 1;
|
||||
}
|
||||
if (drbg->reseed_time_interval > 0) {
|
||||
@@ -621,11 +620,8 @@ int RAND_DRBG_generate(RAND_DRBG *drbg, unsigned char *out, size_t outlen,
|
||||
|| now - drbg->reseed_time >= drbg->reseed_time_interval)
|
||||
reseed_required = 1;
|
||||
}
|
||||
if (drbg->parent != NULL) {
|
||||
unsigned int reseed_counter = tsan_load(&drbg->reseed_prop_counter);
|
||||
if (reseed_counter > 0
|
||||
&& tsan_load(&drbg->parent->reseed_prop_counter)
|
||||
!= reseed_counter)
|
||||
if (drbg->enable_reseed_propagation && drbg->parent != NULL) {
|
||||
if (drbg->reseed_counter != tsan_load(&drbg->parent->reseed_counter))
|
||||
reseed_required = 1;
|
||||
}
|
||||
|
||||
@@ -644,7 +640,7 @@ int RAND_DRBG_generate(RAND_DRBG *drbg, unsigned char *out, size_t outlen,
|
||||
return 0;
|
||||
}
|
||||
|
||||
drbg->reseed_gen_counter++;
|
||||
drbg->generate_counter++;
|
||||
|
||||
return 1;
|
||||
}
|
||||
@@ -706,8 +702,7 @@ int RAND_DRBG_set_callbacks(RAND_DRBG *drbg,
|
||||
RAND_DRBG_get_nonce_fn get_nonce,
|
||||
RAND_DRBG_cleanup_nonce_fn cleanup_nonce)
|
||||
{
|
||||
if (drbg->state != DRBG_UNINITIALISED
|
||||
|| drbg->parent != NULL)
|
||||
if (drbg->state != DRBG_UNINITIALISED)
|
||||
return 0;
|
||||
drbg->get_entropy = get_entropy;
|
||||
drbg->cleanup_entropy = cleanup_entropy;
|
||||
@@ -883,8 +878,9 @@ static RAND_DRBG *drbg_setup(RAND_DRBG *parent)
|
||||
if (parent == NULL && rand_drbg_enable_locking(drbg) == 0)
|
||||
goto err;
|
||||
|
||||
/* enable seed propagation */
|
||||
tsan_store(&drbg->reseed_prop_counter, 1);
|
||||
/* enable reseed propagation */
|
||||
drbg->enable_reseed_propagation = 1;
|
||||
drbg->reseed_counter = 1;
|
||||
|
||||
/*
|
||||
* Ignore instantiation error to support just-in-time instantiation.
|
||||
|
||||
@@ -174,8 +174,6 @@ size_t rand_drbg_get_entropy(RAND_DRBG *drbg,
|
||||
prediction_resistance,
|
||||
(unsigned char *)&drbg, sizeof(drbg)) != 0)
|
||||
bytes = bytes_needed;
|
||||
drbg->reseed_next_counter
|
||||
= tsan_load(&drbg->parent->reseed_prop_counter);
|
||||
rand_drbg_unlock(drbg->parent);
|
||||
|
||||
rand_pool_add_end(pool, bytes, 8 * bytes);
|
||||
|
||||
@@ -138,9 +138,11 @@ typedef struct rand_drbg_method_st {
|
||||
* The state of a DRBG AES-CTR.
|
||||
*/
|
||||
typedef struct rand_drbg_ctr_st {
|
||||
EVP_CIPHER_CTX *ctx;
|
||||
EVP_CIPHER_CTX *ctx_ecb;
|
||||
EVP_CIPHER_CTX *ctx_ctr;
|
||||
EVP_CIPHER_CTX *ctx_df;
|
||||
const EVP_CIPHER *cipher;
|
||||
const EVP_CIPHER *cipher_ecb;
|
||||
const EVP_CIPHER *cipher_ctr;
|
||||
size_t keylen;
|
||||
unsigned char K[32];
|
||||
unsigned char V[16];
|
||||
@@ -233,7 +235,7 @@ struct rand_drbg_st {
|
||||
size_t max_perslen, max_adinlen;
|
||||
|
||||
/* Counts the number of generate requests since the last reseed. */
|
||||
unsigned int reseed_gen_counter;
|
||||
unsigned int generate_counter;
|
||||
/*
|
||||
* Maximum number of generate requests until a reseed is required.
|
||||
* This value is ignored if it is zero.
|
||||
@@ -246,9 +248,15 @@ struct rand_drbg_st {
|
||||
* This value is ignored if it is zero.
|
||||
*/
|
||||
time_t reseed_time_interval;
|
||||
|
||||
/*
|
||||
* Enables reseed propagation (see following comment)
|
||||
*/
|
||||
unsigned int enable_reseed_propagation;
|
||||
|
||||
/*
|
||||
* Counts the number of reseeds since instantiation.
|
||||
* This value is ignored if it is zero.
|
||||
* This value is ignored if enable_reseed_propagation is zero.
|
||||
*
|
||||
* This counter is used only for seed propagation from the <master> DRBG
|
||||
* to its two children, the <public> and <private> DRBG. This feature is
|
||||
@@ -256,8 +264,7 @@ struct rand_drbg_st {
|
||||
* is added by RAND_add() or RAND_seed() will have an immediate effect on
|
||||
* the output of RAND_bytes() resp. RAND_priv_bytes().
|
||||
*/
|
||||
TSAN_QUALIFIER unsigned int reseed_prop_counter;
|
||||
unsigned int reseed_next_counter;
|
||||
TSAN_QUALIFIER unsigned int reseed_counter;
|
||||
|
||||
size_t seedlen;
|
||||
DRBG_STATUS state;
|
||||
|
||||
@@ -26,12 +26,12 @@
|
||||
# include <sys/utsname.h>
|
||||
# endif
|
||||
#endif
|
||||
#if defined(__FreeBSD__) && !defined(OPENSSL_SYS_UEFI)
|
||||
#if (defined(__FreeBSD__) || defined(__NetBSD__)) && !defined(OPENSSL_SYS_UEFI)
|
||||
# include <sys/types.h>
|
||||
# include <sys/sysctl.h>
|
||||
# include <sys/param.h>
|
||||
#endif
|
||||
#if defined(__OpenBSD__) || defined(__NetBSD__)
|
||||
#if defined(__OpenBSD__)
|
||||
# include <sys/param.h>
|
||||
#endif
|
||||
|
||||
@@ -247,10 +247,12 @@ static ssize_t sysctl_random(char *buf, size_t buflen)
|
||||
* when the sysctl returns long and we want to request something not a
|
||||
* multiple of longs, which should never be the case.
|
||||
*/
|
||||
#if defined(__FreeBSD__)
|
||||
if (!ossl_assert(buflen % sizeof(long) == 0)) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* On NetBSD before 4.0 KERN_ARND was an alias for KERN_URND, and only
|
||||
@@ -268,7 +270,7 @@ static ssize_t sysctl_random(char *buf, size_t buflen)
|
||||
mib[1] = KERN_ARND;
|
||||
|
||||
do {
|
||||
len = buflen;
|
||||
len = buflen > 256 ? 256 : buflen;
|
||||
if (sysctl(mib, 2, buf, &len, NULL, 0) == -1)
|
||||
return done > 0 ? done : -1;
|
||||
done += len;
|
||||
@@ -363,12 +365,19 @@ static ssize_t syscall_random(void *buf, size_t buflen)
|
||||
* - OpenBSD since 5.6
|
||||
* - Linux since 3.17 with glibc 2.25
|
||||
* - FreeBSD since 12.0 (1200061)
|
||||
*
|
||||
* Note: Sometimes getentropy() can be provided but not implemented
|
||||
* internally. So we need to check errno for ENOSYS
|
||||
*/
|
||||
# if defined(__GNUC__) && __GNUC__>=2 && defined(__ELF__) && !defined(__hpux)
|
||||
extern int getentropy(void *buffer, size_t length) __attribute__((weak));
|
||||
|
||||
if (getentropy != NULL)
|
||||
return getentropy(buf, buflen) == 0 ? (ssize_t)buflen : -1;
|
||||
if (getentropy != NULL) {
|
||||
if (getentropy(buf, buflen) == 0)
|
||||
return (ssize_t)buflen;
|
||||
if (errno != ENOSYS)
|
||||
return -1;
|
||||
}
|
||||
# else
|
||||
union {
|
||||
void *p;
|
||||
@@ -409,7 +418,8 @@ static struct random_device {
|
||||
} random_devices[OSSL_NELEM(random_device_paths)];
|
||||
static int keep_random_devices_open = 1;
|
||||
|
||||
# if defined(__linux) && defined(DEVRANDOM_WAIT)
|
||||
# if defined(__linux) && defined(DEVRANDOM_WAIT) \
|
||||
&& defined(OPENSSL_RAND_SEED_GETRANDOM)
|
||||
static void *shm_addr;
|
||||
|
||||
static void cleanup_shm(void)
|
||||
@@ -487,7 +497,7 @@ static int wait_random_seeded(void)
|
||||
}
|
||||
return seeded;
|
||||
}
|
||||
# else /* defined __linux */
|
||||
# else /* defined __linux && DEVRANDOM_WAIT && OPENSSL_RAND_SEED_GETRANDOM */
|
||||
static int wait_random_seeded(void)
|
||||
{
|
||||
return 1;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved.
|
||||
* Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the OpenSSL license (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
@@ -26,7 +26,7 @@
|
||||
#ifndef OPENSSL_NO_POSIX_IO
|
||||
# include <sys/stat.h>
|
||||
# include <fcntl.h>
|
||||
# ifdef _WIN32
|
||||
# if defined(_WIN32) && !defined(_WIN32_WCE)
|
||||
# include <windows.h>
|
||||
# include <io.h>
|
||||
# define stat _stat
|
||||
|
||||
Reference in New Issue
Block a user