buffer = rand_pool_add_begin(pool, bytes_needed);
if (buffer != NULL) {
-
- /* If RDSEED is available, use that. */
+ /* Whichever comes first, use RDSEED, RDRAND or nothing */
if ((OPENSSL_ia32cap_P[2] & (1 << 18)) != 0) {
if (OPENSSL_ia32_rdseed_bytes(buffer, bytes_needed)
- == bytes_needed)
- return rand_pool_add_end(pool,
- bytes_needed,
- 8 * bytes_needed);
- }
-
- /* Second choice is RDRAND. */
- if ((OPENSSL_ia32cap_P[1] & (1 << (62 - 32))) != 0) {
+ == bytes_needed) {
+ rand_pool_add_end(pool, bytes_needed, 8 * bytes_needed);
+ }
+ } else if ((OPENSSL_ia32cap_P[1] & (1 << (62 - 32))) != 0) {
if (OPENSSL_ia32_rdrand_bytes(buffer, bytes_needed)
- == bytes_needed)
- return rand_pool_add_end(pool,
- bytes_needed,
- 8 * bytes_needed);
+ == bytes_needed) {
+ rand_pool_add_end(pool, bytes_needed, 8 * bytes_needed);
+ }
+ } else {
+ rand_pool_add_end(pool, 0, 0);
}
-
- return rand_pool_add_end(pool, 0, 0);
}
}
bytes = bytes_needed;
rand_drbg_unlock(drbg->parent);
- entropy_available = rand_pool_add_end(pool, bytes, 8 * bytes);
+ rand_pool_add_end(pool, bytes, 8 * bytes);
+ entropy_available = rand_pool_entropy_available(pool);
}
} else {
* random input which contains at least |entropy| bits of
* randomness.
*
- * Return available amount of entropy after this operation.
- * (see rand_pool_entropy_available(pool))
+ * Returns 1 if the added amount is adequate, otherwise 0
*/
-size_t rand_pool_add(RAND_POOL *pool,
- const unsigned char *buffer, size_t len, size_t entropy)
+int rand_pool_add(RAND_POOL *pool,
+ const unsigned char *buffer, size_t len, size_t entropy)
{
if (len > pool->max_len - pool->len) {
RANDerr(RAND_F_RAND_POOL_ADD, RAND_R_ENTROPY_INPUT_TOO_LONG);
pool->entropy += entropy;
}
- return rand_pool_entropy_available(pool);
+ return 1;
}
/*
* to the buffer which contain at least |entropy| bits of randomness.
* It is allowed to add less bytes than originally reserved.
*/
-size_t rand_pool_add_end(RAND_POOL *pool, size_t len, size_t entropy)
+int rand_pool_add_end(RAND_POOL *pool, size_t len, size_t entropy)
{
if (len > pool->max_len - pool->len) {
RANDerr(RAND_F_RAND_POOL_ADD_END, RAND_R_RANDOM_POOL_OVERFLOW);
pool->entropy += entropy;
}
- return rand_pool_entropy_available(pool);
+ return 1;
}
int RAND_set_rand_method(const RAND_METHOD *meth)
if (getrandom(buffer, bytes_needed, 0) == (int)bytes_needed)
bytes = bytes_needed;
- entropy_available = rand_pool_add_end(pool, bytes, 8 * bytes);
+ rand_pool_add_end(pool, bytes, 8 * bytes);
+ entropy_available = rand_pool_entropy_available(pool);
}
if (entropy_available > 0)
return entropy_available;
if (fread(buffer, 1, bytes_needed, fp) == bytes_needed)
bytes = bytes_needed;
- entropy_available = rand_pool_add_end(pool, bytes, 8 * bytes);
+ rand_pool_add_end(pool, bytes, 8 * bytes);
+ entropy_available = rand_pool_entropy_available(pool);
}
fclose(fp);
if (entropy_available > 0)
if (num == (int)bytes_needed)
bytes = bytes_needed;
- entropy_available = rand_pool_add_end(pool, bytes, 8 * bytes);
+ rand_pool_add_end(pool, bytes, 8 * bytes);
+ entropy_available = rand_pool_entropy_available(pool);
}
if (entropy_available > 0)
return entropy_available;
if (total_length > bytes_remaining)
total_length = bytes_remaining;
- return rand_pool_add(pool, (PTR_T)data_buffer, total_length,
- total_length * ENTROPY_BITS_PER_BYTE);
+ rand_pool_add(pool, (PTR_T)data_buffer, total_length,
+ total_length * ENTROPY_BITS_PER_BYTE);
+ return rand_pool_entropy_available(pool);
}
#endif
BCRYPT_USE_SYSTEM_PREFERRED_RNG) == STATUS_SUCCESS)
bytes = bytes_needed;
- entropy_available = rand_pool_add_end(pool, bytes, 8 * bytes);
+ rand_pool_add_end(pool, bytes, 8 * bytes);
+ entropy_available = rand_pool_entropy_available(pool);
}
if (entropy_available > 0)
return entropy_available;
CryptReleaseContext(hProvider, 0);
}
- entropy_available = rand_pool_add_end(pool, bytes, 8 * bytes);
+ rand_pool_add_end(pool, bytes, 8 * bytes);
+ entropy_available = rand_pool_entropy_available(pool);
}
if (entropy_available > 0)
return entropy_available;
CryptReleaseContext(hProvider, 0);
}
- entropy_available = rand_pool_add_end(pool, bytes, 8 * bytes);
+ rand_pool_add_end(pool, bytes, 8 * bytes);
+ entropy_available = rand_pool_entropy_available(pool);
}
if (entropy_available > 0)
return entropy_available;