BA / SerialCom

Fork of OmniWheels by Gustav Atmel

Committer:
gustavatmel
Date:
Tue May 01 15:55:34 2018 +0000
Revision:
2:798925c9e4a8
Parent:
1:9c5af431a1f1
bluetooth

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gustavatmel 1:9c5af431a1f1 1 /*
gustavatmel 1:9c5af431a1f1 2 * Hardware entropy collector for NUC472's RNGA
gustavatmel 1:9c5af431a1f1 3 *
gustavatmel 1:9c5af431a1f1 4 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
gustavatmel 1:9c5af431a1f1 5 * SPDX-License-Identifier: Apache-2.0
gustavatmel 1:9c5af431a1f1 6 *
gustavatmel 1:9c5af431a1f1 7 * Licensed under the Apache License, Version 2.0 (the "License"); you may
gustavatmel 1:9c5af431a1f1 8 * not use this file except in compliance with the License.
gustavatmel 1:9c5af431a1f1 9 * You may obtain a copy of the License at
gustavatmel 1:9c5af431a1f1 10 *
gustavatmel 1:9c5af431a1f1 11 * http://www.apache.org/licenses/LICENSE-2.0
gustavatmel 1:9c5af431a1f1 12 *
gustavatmel 1:9c5af431a1f1 13 * Unless required by applicable law or agreed to in writing, software
gustavatmel 1:9c5af431a1f1 14 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
gustavatmel 1:9c5af431a1f1 15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
gustavatmel 1:9c5af431a1f1 16 * See the License for the specific language governing permissions and
gustavatmel 1:9c5af431a1f1 17 * limitations under the License.
gustavatmel 1:9c5af431a1f1 18 *
gustavatmel 1:9c5af431a1f1 19 */
gustavatmel 1:9c5af431a1f1 20
gustavatmel 1:9c5af431a1f1 21 #if DEVICE_TRNG
gustavatmel 1:9c5af431a1f1 22
gustavatmel 1:9c5af431a1f1 23 #include <stdlib.h>
gustavatmel 1:9c5af431a1f1 24 #include <string.h>
gustavatmel 1:9c5af431a1f1 25 #include "cmsis.h"
gustavatmel 1:9c5af431a1f1 26 #include "us_ticker_api.h"
gustavatmel 1:9c5af431a1f1 27 #include "trng_api.h"
gustavatmel 1:9c5af431a1f1 28 #include "crypto-misc.h"
gustavatmel 1:9c5af431a1f1 29
gustavatmel 1:9c5af431a1f1 30 /*
gustavatmel 1:9c5af431a1f1 31 * Get Random number generator.
gustavatmel 1:9c5af431a1f1 32 */
gustavatmel 1:9c5af431a1f1 33
gustavatmel 1:9c5af431a1f1 34 #define PRNG_KEY_SIZE (0x20UL)
gustavatmel 1:9c5af431a1f1 35
gustavatmel 1:9c5af431a1f1 36 static void trng_get(unsigned char *pConversionData)
gustavatmel 1:9c5af431a1f1 37 {
gustavatmel 1:9c5af431a1f1 38 uint32_t *p32ConversionData;
gustavatmel 1:9c5af431a1f1 39
gustavatmel 1:9c5af431a1f1 40 p32ConversionData = (uint32_t *)pConversionData;
gustavatmel 1:9c5af431a1f1 41
gustavatmel 1:9c5af431a1f1 42 PRNG_Open(PRNG_KEY_SIZE_256, 1, us_ticker_read());
gustavatmel 1:9c5af431a1f1 43 crypto_prng_prestart();
gustavatmel 1:9c5af431a1f1 44 PRNG_Start();
gustavatmel 1:9c5af431a1f1 45 crypto_prng_wait();
gustavatmel 1:9c5af431a1f1 46
gustavatmel 1:9c5af431a1f1 47 PRNG_Read(p32ConversionData);
gustavatmel 1:9c5af431a1f1 48 }
gustavatmel 1:9c5af431a1f1 49
gustavatmel 1:9c5af431a1f1 50 void trng_init(trng_t *obj)
gustavatmel 1:9c5af431a1f1 51 {
gustavatmel 1:9c5af431a1f1 52 (void)obj;
gustavatmel 1:9c5af431a1f1 53
gustavatmel 1:9c5af431a1f1 54 /* Init crypto module */
gustavatmel 1:9c5af431a1f1 55 crypto_init();
gustavatmel 1:9c5af431a1f1 56
gustavatmel 1:9c5af431a1f1 57 PRNG_ENABLE_INT();
gustavatmel 1:9c5af431a1f1 58 }
gustavatmel 1:9c5af431a1f1 59
gustavatmel 1:9c5af431a1f1 60 void trng_free(trng_t *obj)
gustavatmel 1:9c5af431a1f1 61 {
gustavatmel 1:9c5af431a1f1 62 (void)obj;
gustavatmel 1:9c5af431a1f1 63
gustavatmel 1:9c5af431a1f1 64 PRNG_DISABLE_INT();
gustavatmel 1:9c5af431a1f1 65
gustavatmel 1:9c5af431a1f1 66 /* Uninit crypto module */
gustavatmel 1:9c5af431a1f1 67 crypto_uninit();
gustavatmel 1:9c5af431a1f1 68 }
gustavatmel 1:9c5af431a1f1 69
gustavatmel 1:9c5af431a1f1 70 int trng_get_bytes(trng_t *obj, uint8_t *output, size_t length, size_t *output_length)
gustavatmel 1:9c5af431a1f1 71 {
gustavatmel 1:9c5af431a1f1 72 (void)obj;
gustavatmel 1:9c5af431a1f1 73 unsigned char tmpBuff[PRNG_KEY_SIZE];
gustavatmel 1:9c5af431a1f1 74 size_t cur_length = 0;
gustavatmel 1:9c5af431a1f1 75
gustavatmel 1:9c5af431a1f1 76 while (length >= sizeof(tmpBuff)) {
gustavatmel 1:9c5af431a1f1 77 trng_get(output);
gustavatmel 1:9c5af431a1f1 78 output += sizeof(tmpBuff);
gustavatmel 1:9c5af431a1f1 79 cur_length += sizeof(tmpBuff);
gustavatmel 1:9c5af431a1f1 80 length -= sizeof(tmpBuff);
gustavatmel 1:9c5af431a1f1 81 }
gustavatmel 1:9c5af431a1f1 82 if (length > 0) {
gustavatmel 1:9c5af431a1f1 83 trng_get(tmpBuff);
gustavatmel 1:9c5af431a1f1 84 memcpy(output, tmpBuff, length);
gustavatmel 1:9c5af431a1f1 85 cur_length += length;
gustavatmel 1:9c5af431a1f1 86 crypto_zeroize(tmpBuff, sizeof(tmpBuff));
gustavatmel 1:9c5af431a1f1 87 }
gustavatmel 1:9c5af431a1f1 88 *output_length = cur_length;
gustavatmel 1:9c5af431a1f1 89 return 0;
gustavatmel 1:9c5af431a1f1 90 }
gustavatmel 1:9c5af431a1f1 91
gustavatmel 1:9c5af431a1f1 92 #endif