mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Wed Feb 20 22:31:08 2019 +0000
Revision:
189:f392fc9709a3
Parent:
186:707f6e361f3e
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Anna Bridge 186:707f6e361f3e 1 /*
Anna Bridge 186:707f6e361f3e 2 * Copyright (c) 2017 Nordic Semiconductor ASA
Anna Bridge 186:707f6e361f3e 3 * All rights reserved.
Anna Bridge 186:707f6e361f3e 4 *
Anna Bridge 186:707f6e361f3e 5 * Redistribution and use in source and binary forms, with or without modification,
Anna Bridge 186:707f6e361f3e 6 * are permitted provided that the following conditions are met:
Anna Bridge 186:707f6e361f3e 7 *
Anna Bridge 186:707f6e361f3e 8 * 1. Redistributions of source code must retain the above copyright notice, this list
Anna Bridge 186:707f6e361f3e 9 * of conditions and the following disclaimer.
Anna Bridge 186:707f6e361f3e 10 *
Anna Bridge 186:707f6e361f3e 11 * 2. Redistributions in binary form, except as embedded into a Nordic Semiconductor ASA
Anna Bridge 186:707f6e361f3e 12 * integrated circuit in a product or a software update for such product, must reproduce
Anna Bridge 186:707f6e361f3e 13 * the above copyright notice, this list of conditions and the following disclaimer in
Anna Bridge 186:707f6e361f3e 14 * the documentation and/or other materials provided with the distribution.
Anna Bridge 186:707f6e361f3e 15 *
Anna Bridge 186:707f6e361f3e 16 * 3. Neither the name of Nordic Semiconductor ASA nor the names of its contributors may be
Anna Bridge 186:707f6e361f3e 17 * used to endorse or promote products derived from this software without specific prior
Anna Bridge 186:707f6e361f3e 18 * written permission.
Anna Bridge 186:707f6e361f3e 19 *
Anna Bridge 186:707f6e361f3e 20 * 4. This software, with or without modification, must only be used with a
Anna Bridge 186:707f6e361f3e 21 * Nordic Semiconductor ASA integrated circuit.
Anna Bridge 186:707f6e361f3e 22 *
Anna Bridge 186:707f6e361f3e 23 * 5. Any software provided in binary or object form under this license must not be reverse
Anna Bridge 186:707f6e361f3e 24 * engineered, decompiled, modified and/or disassembled.
Anna Bridge 186:707f6e361f3e 25 *
Anna Bridge 186:707f6e361f3e 26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
Anna Bridge 186:707f6e361f3e 27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
Anna Bridge 186:707f6e361f3e 28 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Anna Bridge 186:707f6e361f3e 29 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
Anna Bridge 186:707f6e361f3e 30 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
Anna Bridge 186:707f6e361f3e 31 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
Anna Bridge 186:707f6e361f3e 32 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
Anna Bridge 186:707f6e361f3e 33 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Anna Bridge 186:707f6e361f3e 34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
Anna Bridge 186:707f6e361f3e 35 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Anna Bridge 186:707f6e361f3e 36 *
Anna Bridge 186:707f6e361f3e 37 */
Anna Bridge 186:707f6e361f3e 38
AnnaBridge 189:f392fc9709a3 39 #if DEVICE_TRNG
Anna Bridge 186:707f6e361f3e 40 #if !defined(FEATURE_CRYPTOCELL310)
Anna Bridge 186:707f6e361f3e 41 #include "hal/trng_api.h"
Anna Bridge 186:707f6e361f3e 42 #include "hal/critical_section_api.h"
Anna Bridge 186:707f6e361f3e 43
Anna Bridge 186:707f6e361f3e 44 #include "nrf_drv_rng.h"
Anna Bridge 186:707f6e361f3e 45
Anna Bridge 186:707f6e361f3e 46 /* Keep track of instantiated FlashIAP objects. */
Anna Bridge 186:707f6e361f3e 47 static int nordic_trng_counter = 0;
Anna Bridge 186:707f6e361f3e 48
Anna Bridge 186:707f6e361f3e 49 void trng_init(trng_t *obj)
Anna Bridge 186:707f6e361f3e 50 {
Anna Bridge 186:707f6e361f3e 51 MBED_ASSERT(obj);
Anna Bridge 186:707f6e361f3e 52
Anna Bridge 186:707f6e361f3e 53 /* Increment global counter. */
Anna Bridge 186:707f6e361f3e 54 nordic_trng_counter++;
Anna Bridge 186:707f6e361f3e 55
Anna Bridge 186:707f6e361f3e 56 /* Initialize TRNG on first object only. */
Anna Bridge 186:707f6e361f3e 57 if (nordic_trng_counter == 1) {
Anna Bridge 186:707f6e361f3e 58 nrf_drv_rng_init(NULL);
Anna Bridge 186:707f6e361f3e 59 }
Anna Bridge 186:707f6e361f3e 60 }
Anna Bridge 186:707f6e361f3e 61
Anna Bridge 186:707f6e361f3e 62 void trng_free(trng_t *obj)
Anna Bridge 186:707f6e361f3e 63 {
Anna Bridge 186:707f6e361f3e 64 MBED_ASSERT(obj);
Anna Bridge 186:707f6e361f3e 65
Anna Bridge 186:707f6e361f3e 66 /* Decrement global counter. */
Anna Bridge 186:707f6e361f3e 67 nordic_trng_counter--;
Anna Bridge 186:707f6e361f3e 68
Anna Bridge 186:707f6e361f3e 69 /* Deinitialize TRNG when all objects have been freed. */
Anna Bridge 186:707f6e361f3e 70 if (nordic_trng_counter == 0) {
Anna Bridge 186:707f6e361f3e 71 nrf_drv_rng_uninit();
Anna Bridge 186:707f6e361f3e 72 }
Anna Bridge 186:707f6e361f3e 73 }
Anna Bridge 186:707f6e361f3e 74
Anna Bridge 186:707f6e361f3e 75 /* Get random data from NRF5x TRNG peripheral.
Anna Bridge 186:707f6e361f3e 76 *
Anna Bridge 186:707f6e361f3e 77 * This implementation returns num of random bytes in range <1, length>.
Anna Bridge 186:707f6e361f3e 78 * For parameters description see trng_api.h file.
Anna Bridge 186:707f6e361f3e 79 */
Anna Bridge 186:707f6e361f3e 80 int trng_get_bytes(trng_t *obj, uint8_t *output, size_t length, size_t *output_length)
Anna Bridge 186:707f6e361f3e 81 {
Anna Bridge 186:707f6e361f3e 82 MBED_ASSERT(obj);
Anna Bridge 186:707f6e361f3e 83 MBED_ASSERT(output);
Anna Bridge 186:707f6e361f3e 84 MBED_ASSERT(output_length);
Anna Bridge 186:707f6e361f3e 85
Anna Bridge 186:707f6e361f3e 86 int result = 0;
Anna Bridge 186:707f6e361f3e 87
Anna Bridge 186:707f6e361f3e 88 /* Return immediately if requested length is zero. */
Anna Bridge 186:707f6e361f3e 89 if (length != 0) {
Anna Bridge 186:707f6e361f3e 90
Anna Bridge 186:707f6e361f3e 91 /* Query how many bytes are available. */
Anna Bridge 186:707f6e361f3e 92 uint8_t bytes_available;
Anna Bridge 186:707f6e361f3e 93 nrf_drv_rng_bytes_available(&bytes_available);
Anna Bridge 186:707f6e361f3e 94
Anna Bridge 186:707f6e361f3e 95 /* If no bytes are cached, block until at least 1 byte is available. */
Anna Bridge 186:707f6e361f3e 96 if (bytes_available == 0) {
Anna Bridge 186:707f6e361f3e 97 nrf_drv_rng_block_rand(output, 1);
Anna Bridge 186:707f6e361f3e 98 *output_length = 1;
Anna Bridge 186:707f6e361f3e 99 } else {
Anna Bridge 186:707f6e361f3e 100
Anna Bridge 186:707f6e361f3e 101 /* Get up to the requested number of bytes. */
Anna Bridge 186:707f6e361f3e 102 if (bytes_available > length) {
Anna Bridge 186:707f6e361f3e 103 bytes_available = length;
Anna Bridge 186:707f6e361f3e 104 }
Anna Bridge 186:707f6e361f3e 105
Anna Bridge 186:707f6e361f3e 106 ret_code_t result = nrf_drv_rng_rand(output, bytes_available);
Anna Bridge 186:707f6e361f3e 107
Anna Bridge 186:707f6e361f3e 108 /* Set output length with available bytes. */
Anna Bridge 186:707f6e361f3e 109 if (result == NRF_SUCCESS) {
Anna Bridge 186:707f6e361f3e 110 *output_length = bytes_available;
Anna Bridge 186:707f6e361f3e 111 } else {
Anna Bridge 186:707f6e361f3e 112 *output_length = 0;
Anna Bridge 186:707f6e361f3e 113 }
Anna Bridge 186:707f6e361f3e 114 }
Anna Bridge 186:707f6e361f3e 115
Anna Bridge 186:707f6e361f3e 116 /* Set return value based on how many bytes were read. */
Anna Bridge 186:707f6e361f3e 117 result = (*output_length == 0) ? -1 : 0;
Anna Bridge 186:707f6e361f3e 118 }
Anna Bridge 186:707f6e361f3e 119
Anna Bridge 186:707f6e361f3e 120 return result;
Anna Bridge 186:707f6e361f3e 121 }
Anna Bridge 186:707f6e361f3e 122 #endif/* !FEATURE_CRYPTOCELL310 */
Anna Bridge 186:707f6e361f3e 123 #endif