static void sha384_finish_wrap( void *ctx, unsigned char *output ) { mbedtls_sha512_finish( (mbedtls_sha512_context *) ctx, output ); }
int mbedtls_entropy_func(void *data, unsigned char *output, size_t len) { int ret, count = 0, i, done; mbedtls_entropy_context *ctx = (mbedtls_entropy_context *)data; unsigned char buf[MBEDTLS_ENTROPY_BLOCK_SIZE]; if (len > MBEDTLS_ENTROPY_BLOCK_SIZE) { return (MBEDTLS_ERR_ENTROPY_SOURCE_FAILED); } #if defined(MBEDTLS_ENTROPY_NV_SEED) /* Update the NV entropy seed before generating any entropy for outside * use. */ if (ctx->initial_entropy_run == 0) { ctx->initial_entropy_run = 1; if ((ret = mbedtls_entropy_update_nv_seed(ctx)) != 0) { return (ret); } } #endif #if defined(MBEDTLS_THREADING_C) if ((ret = mbedtls_mutex_lock(&ctx->mutex)) != 0) { return (ret); } #endif /* * Always gather extra entropy before a call */ do { if (count++ > ENTROPY_MAX_LOOP) { ret = MBEDTLS_ERR_ENTROPY_SOURCE_FAILED; goto exit; } if ((ret = entropy_gather_internal(ctx)) != 0) { goto exit; } done = 1; for (i = 0; i < ctx->source_count; i++) if (ctx->source[i].size < ctx->source[i].threshold) { done = 0; } } while (!done); memset(buf, 0, MBEDTLS_ENTROPY_BLOCK_SIZE); #if defined(MBEDTLS_ENTROPY_SHA512_ACCUMULATOR) mbedtls_sha512_finish(&ctx->accumulator, buf); /* * Reset accumulator and counters and recycle existing entropy */ memset(&ctx->accumulator, 0, sizeof(mbedtls_sha512_context)); mbedtls_sha512_starts(&ctx->accumulator, 0); mbedtls_sha512_update(&ctx->accumulator, buf, MBEDTLS_ENTROPY_BLOCK_SIZE); /* * Perform second SHA-512 on entropy */ mbedtls_sha512(buf, MBEDTLS_ENTROPY_BLOCK_SIZE, buf, 0); #else /* MBEDTLS_ENTROPY_SHA512_ACCUMULATOR */ mbedtls_sha256_finish(&ctx->accumulator, buf); /* * Reset accumulator and counters and recycle existing entropy */ memset(&ctx->accumulator, 0, sizeof(mbedtls_sha256_context)); mbedtls_sha256_starts(&ctx->accumulator, 0); mbedtls_sha256_update(&ctx->accumulator, buf, MBEDTLS_ENTROPY_BLOCK_SIZE); /* * Perform second SHA-256 on entropy */ mbedtls_sha256(buf, MBEDTLS_ENTROPY_BLOCK_SIZE, buf, 0); #endif /* MBEDTLS_ENTROPY_SHA512_ACCUMULATOR */ for (i = 0; i < ctx->source_count; i++) { ctx->source[i].size = 0; } memcpy(output, buf, len); ret = 0; exit: #if defined(MBEDTLS_THREADING_C) if (mbedtls_mutex_unlock(&ctx->mutex) != 0) { return (MBEDTLS_ERR_THREADING_MUTEX_ERROR); } #endif return (ret); }