Newer
Older
mbed-os / targets / TARGET_NXP / TARGET_MCUXpresso_MCUS / TARGET_MCU_LPC546XX / trng_api.c
@Harrison Mutai Harrison Mutai on 15 Oct 2020 1 KB Add SPDX license identifier to Arm files
/* mbed Microcontroller Library
 * Copyright (c) 2018 ARM Limited
 * 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 "trng_api.h"

#if defined(DEVICE_TRNG)
#include "fsl_rng.h"

void trng_init(trng_t *obj)
{
}

void trng_free(trng_t *obj)
{
}

int trng_get_bytes(trng_t *obj, uint8_t *output, size_t length, size_t *output_length)
{
    uint32_t skip;
    uint32_t data;
    size_t idx = 0;
    int i;

    /* Get Random data */
    while (idx < length) {

        data = RNG_GetRandomData();

        for (i = 0; ((i < 4) && (idx < length)); i++) {
            output[idx++] = (data >> (i * 8)) & 0xFF;
        }

        /* Skip next 32 random numbers for better entropy */
        for (skip = 0; skip < 32; skip++) {
            RNG_GetRandomData();
        }
    }

    *output_length = idx;

    /* Zeroize to avoid leakage of entropy on the stack. Also ensure this is not removed by compiler optimizations */
    *((volatile uint32_t*) &data) = 0;

    return (idx == length ? 0 : -1);
}
#endif