Newer
Older
mbed-os / connectivity / mbedtls / platform / src / shared_rng.cpp
@George Psimenos George Psimenos on 11 Aug 2020 1 KB Move mbedtls
/*
 *  shared_rng.cpp
 *
 *  Copyright (C) 2019-2020, Arm Limited, All Rights Reserved
 *  SPDX-License-Identifier: Apache-2.0
 *
 *  Licensed under the Apache License, Version 2.0 (the "License"); you may
 *  not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 */

#include "shared_rng.h"

#if defined(MBEDTLS_SSL_CONF_RNG)

#include "mbed_trace.h"

#define TRACE_GROUP "SRNG"

mbedtls_hmac_drbg_context global_hmac_drbg;
mbedtls_entropy_context global_entropy;
static bool is_initialized = false;

int init_global_rng()
{
    mbedtls_entropy_init(&global_entropy);
    mbedtls_hmac_drbg_init(&global_hmac_drbg);

    int ret = mbedtls_hmac_drbg_seed(&global_hmac_drbg,
                                     mbedtls_md_info_from_type(MBEDTLS_MD_SHA256),
                                     mbedtls_entropy_func, &global_entropy, NULL, 0);

    if (ret != 0) {
        tr_error(" init_global_rng failed! mbedtls_hmac_drbg_seed returned -0x%x", -ret);
        free_global_rng();
    } else {
        is_initialized = true;
    }

    return ret;
}

void free_global_rng()
{
    mbedtls_entropy_free(&global_entropy);
    mbedtls_hmac_drbg_free(&global_hmac_drbg);
    is_initialized = false;
}

int global_rng( void *ctx, unsigned char *dst, size_t len )
{
    if (!is_initialized) {
        return MBED_SHARED_RNG_NOT_INITIALIZED;
    }
    return mbedtls_hmac_drbg_random(&global_hmac_drbg, dst, len);
}

mbedtls_hmac_drbg_context *get_global_hmac_drbg()
{
    return &global_hmac_drbg;
}

mbedtls_entropy_context *get_global_entropy()
{
    return &global_entropy;
}

#endif // MBEDTLS_SSL_CONF_RNG