mirror of
https://github.com/wolfSSL/wolfssl.git
synced 2025-08-02 04:04:39 +02:00
linuxkm/lkcapi_sha_glue.c: add interruptibility and additional relaxation where possible, and fix a leaked lock scenario, in get_drbg_n(), wc_linuxkm_drbg_seed(), wc_mix_pool_bytes(), and wc_crng_reseed();
wolfcrypt/src/asn.c: add a couple static attributes missed on the previous round of fixups.
This commit is contained in:
@@ -1083,8 +1083,11 @@ static inline struct wc_rng_inst *get_drbg_n(struct wc_linuxkm_drbg_ctx *ctx, in
|
|||||||
int expected = 0;
|
int expected = 0;
|
||||||
if (likely(__atomic_compare_exchange_n(&ctx->rngs[n].lock, &expected, 1, 0, __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE)))
|
if (likely(__atomic_compare_exchange_n(&ctx->rngs[n].lock, &expected, 1, 0, __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE)))
|
||||||
return &ctx->rngs[n];
|
return &ctx->rngs[n];
|
||||||
if (can_sleep)
|
if (can_sleep) {
|
||||||
|
if (signal_pending(current))
|
||||||
|
return NULL;
|
||||||
cond_resched();
|
cond_resched();
|
||||||
|
}
|
||||||
else
|
else
|
||||||
cpu_relax();
|
cpu_relax();
|
||||||
}
|
}
|
||||||
@@ -1192,6 +1195,11 @@ static int wc_linuxkm_drbg_seed(struct crypto_rng *tfm,
|
|||||||
for (n = ctx->n_rngs - 1; n >= 0; --n) {
|
for (n = ctx->n_rngs - 1; n >= 0; --n) {
|
||||||
struct wc_rng_inst *drbg = get_drbg_n(ctx, n);
|
struct wc_rng_inst *drbg = get_drbg_n(ctx, n);
|
||||||
|
|
||||||
|
if (! drbg) {
|
||||||
|
ret = -EINTR;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
/* perturb the seed with the CPU ID, so that no DRBG has the exact same
|
/* perturb the seed with the CPU ID, so that no DRBG has the exact same
|
||||||
* seed.
|
* seed.
|
||||||
*/
|
*/
|
||||||
@@ -1425,6 +1433,7 @@ static int wc_mix_pool_bytes(const void *buf, size_t len) {
|
|||||||
struct wc_linuxkm_drbg_ctx *ctx;
|
struct wc_linuxkm_drbg_ctx *ctx;
|
||||||
size_t i;
|
size_t i;
|
||||||
int n;
|
int n;
|
||||||
|
int can_sleep = (preempt_count() == 0);
|
||||||
|
|
||||||
if (len == 0)
|
if (len == 0)
|
||||||
return 0;
|
return 0;
|
||||||
@@ -1434,15 +1443,23 @@ static int wc_mix_pool_bytes(const void *buf, size_t len) {
|
|||||||
|
|
||||||
for (n = ctx->n_rngs - 1; n >= 0; --n) {
|
for (n = ctx->n_rngs - 1; n >= 0; --n) {
|
||||||
struct wc_rng_inst *drbg = get_drbg_n(ctx, n);
|
struct wc_rng_inst *drbg = get_drbg_n(ctx, n);
|
||||||
int V_offset = 0;
|
int V_offset;
|
||||||
|
|
||||||
for (i = 0; i < len; ++i) {
|
if (! drbg)
|
||||||
|
return -EINTR;
|
||||||
|
|
||||||
|
for (i = 0, V_offset = 0; i < len; ++i) {
|
||||||
((struct DRBG_internal *)drbg->rng.drbg)->V[V_offset++] += ((byte *)buf)[i];
|
((struct DRBG_internal *)drbg->rng.drbg)->V[V_offset++] += ((byte *)buf)[i];
|
||||||
if (V_offset == (int)sizeof ((struct DRBG_internal *)drbg->rng.drbg)->V)
|
if (V_offset == (int)sizeof ((struct DRBG_internal *)drbg->rng.drbg)->V)
|
||||||
V_offset = 0;
|
V_offset = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
put_drbg(drbg);
|
put_drbg(drbg);
|
||||||
|
if (can_sleep) {
|
||||||
|
if (signal_pending(current))
|
||||||
|
return -EINTR;
|
||||||
|
cond_resched();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -1458,7 +1475,12 @@ static int wc_crng_reseed(void) {
|
|||||||
|
|
||||||
for (n = ctx->n_rngs - 1; n >= 0; --n) {
|
for (n = ctx->n_rngs - 1; n >= 0; --n) {
|
||||||
struct wc_rng_inst *drbg = get_drbg_n(ctx, n);
|
struct wc_rng_inst *drbg = get_drbg_n(ctx, n);
|
||||||
|
|
||||||
|
if (! drbg)
|
||||||
|
return -EINTR;
|
||||||
|
|
||||||
((struct DRBG_internal *)drbg->rng.drbg)->reseedCtr = WC_RESEED_INTERVAL;
|
((struct DRBG_internal *)drbg->rng.drbg)->reseedCtr = WC_RESEED_INTERVAL;
|
||||||
|
|
||||||
if (can_sleep) {
|
if (can_sleep) {
|
||||||
byte scratch[4];
|
byte scratch[4];
|
||||||
int need_reenable_vec = (DISABLE_VECTOR_REGISTERS() == 0);
|
int need_reenable_vec = (DISABLE_VECTOR_REGISTERS() == 0);
|
||||||
@@ -1468,8 +1490,13 @@ static int wc_crng_reseed(void) {
|
|||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
pr_err("ERROR: wc_crng_reseed() wc_RNG_GenerateBlock() for DRBG #%d returned %d.", n, ret);
|
pr_err("ERROR: wc_crng_reseed() wc_RNG_GenerateBlock() for DRBG #%d returned %d.", n, ret);
|
||||||
put_drbg(drbg);
|
put_drbg(drbg);
|
||||||
|
if (signal_pending(current))
|
||||||
|
return -EINTR;
|
||||||
cond_resched();
|
cond_resched();
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
put_drbg(drbg);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@@ -26199,9 +26199,9 @@ static wcchar END_PKCS7 = "-----END PKCS7-----";
|
|||||||
static wcchar END_DSA_PRIV = "-----END DSA PRIVATE KEY-----";
|
static wcchar END_DSA_PRIV = "-----END DSA PRIVATE KEY-----";
|
||||||
#endif
|
#endif
|
||||||
#ifdef OPENSSL_EXTRA
|
#ifdef OPENSSL_EXTRA
|
||||||
wcchar BEGIN_PRIV_KEY_PREFIX = "-----BEGIN";
|
static wcchar BEGIN_PRIV_KEY_PREFIX = "-----BEGIN";
|
||||||
wcchar PRIV_KEY_SUFFIX = "PRIVATE KEY-----";
|
static wcchar PRIV_KEY_SUFFIX = "PRIVATE KEY-----";
|
||||||
wcchar END_PRIV_KEY_PREFIX = "-----END";
|
static wcchar END_PRIV_KEY_PREFIX = "-----END";
|
||||||
#endif
|
#endif
|
||||||
static wcchar BEGIN_PUB_KEY = "-----BEGIN PUBLIC KEY-----";
|
static wcchar BEGIN_PUB_KEY = "-----BEGIN PUBLIC KEY-----";
|
||||||
static wcchar END_PUB_KEY = "-----END PUBLIC KEY-----";
|
static wcchar END_PUB_KEY = "-----END PUBLIC KEY-----";
|
||||||
|
Reference in New Issue
Block a user