The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

Dependents:   hello SerialTestv11 SerialTestv12 Sierpinski ... more

mbed 2

This is the mbed 2 library. If you'd like to learn about Mbed OS please see the mbed-os docs.

TARGET_ARM_CM3DS_MPS2/TOOLCHAIN_GCC_ARM/tztrng_defs.h

Committer:
AnnaBridge
Date:
2019-02-20
Revision:
172:65be27845400
Parent:
171:3a7713b1edbc

File content as of revision 172:65be27845400:

/******************************************************************************
* Copyright (c) 2017-2017, ARM, 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.                                              *
******************************************************************************/
#ifndef _TZTRNG_DEFS_H_
#define _TZTRNG_DEFS_H_

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include "dx_reg_base_host.h"
#include "dx_rng.h"

#if (CC_CONFIG_TRNG_MODE == 1)
#include "config_trng90b.h"
#elif (CC_CONFIG_TRNG_MODE == 0)
#include "config_fetrng.h"
#else
#error "invalid VECT definition in Makefile"
#endif

#define CC_OK   0
#define CC_UNUSED_PARAM(prm)  ((void)prm)
#define CC_MAX_UINT32_VAL 	(0xFFFFFFFF)
#define LLF_RND_NUM_OF_ROSCS        4
#define TRNG_EHR_SIZE 6

/* TRNG Error definitions */
#define TRNG_MAX_CRNGT_ERRORS       (12)
#define TRNG_MAX_VN_ERRORS          (50)

extern unsigned long gCcRegBase;

typedef uint32_t CCError_t;
typedef uint32_t CCBool_t;

typedef enum {
    CC_FALSE = 0,
    CC_TRUE = 1
} CCBool;

/*
Requirements:
- Required entropy = 384 bits

Default values for Zynq FPGA:
- entropy per bit = 0.5
*/

/* amount of bytes for the required entropy bits = ROUND_UP(ROUND_UP(((required entropy bits)/(entropy per bit)), 1024), (EHR width in bytes)) / 8
   (multiple of the window size 1024 bits and multiple of the EHR width 192 bits) */
#define CC_CONFIG_TRNG90B_AMOUNT_OF_BYTES                      144  /* ROUND_UP(ROUND_UP((384/0.5), 1024), 192) / 8 = 144 */

/*** NIST SP 800-90B (2nd Draft) 4.4.1 ***/
/* C = ROUND_UP(1+(-log(W)/H)), W = 2^(-40), H=(entropy per bit) */
#define CC_CONFIG_TRNG90B_REPETITION_COUNTER_CUTOFF            81  /* ROUND_UP(1+(40/0.5)) = 81 */

/*** NIST SP 800-90B (2nd Draft) 4.4.2 ***/
/* C =CRITBINOM(W, power(2,(-H)),1-a), W = 1024, a = 2^(-40), H=(entropy per bit) */
#define CC_CONFIG_TRNG90B_ADAPTIVE_PROPORTION_CUTOFF           823      /* =CRITBINOM(1024, power(2,(-0.5)),1-2^(-40)) */

/*** For Startup Tests ***/
/* amount of bytes for the startup test = 528 (at least 4096 bits (NIST SP 800-90B (2nd Draft) 4.3.12) = 22 EHRs = 4224 bits) */
#define CC_CONFIG_TRNG90B_AMOUNT_OF_BYTES_STARTUP              528
/* Definitions of temp buffer for DMA */

#define CC_RND_WORK_BUFFER_SIZE_WORDS CC_CONFIG_TRNG90B_AMOUNT_OF_BYTES_STARTUP/4 /* the maximum possible usage of stack memory in words */

/* The CRYS Random Generator Parameters  structure CCRndParams_t -
   structure containing the user given Parameters */
typedef struct  CCRndParams_t
{
	/* allowed ring oscillator lengths: bits 0,1,2,3  */
	uint32_t  RoscsAllowed;

	/* sampling interval: count of ring oscillator cycles between
	   consecutive bits sampling */
	uint32_t  SubSamplingRatio;
	uint32_t  SubSamplingRatio1;
	uint32_t  SubSamplingRatio2;
	uint32_t  SubSamplingRatio3;
	uint32_t  SubSamplingRatio4;

} CCRndParams_t;

/*! RND state structure. Includes internal data that needs to be saved between boots by the user.*/
typedef  struct
{
	/* State flag (see definition of StateFlag above), containing bit-fields, defining:
	- b'0: instantiation steps:   0 - not done, 1 - done;
	- 2b'9,8: working or testing mode: 0 - working, 1 - KAT DRBG test, 2 -
	  KAT TRNG test;
	b'16: flag defining is Previous random valid or not:
	        0 - not valid, 1 - valid */
	/*! State flag used internally in the code.*/
	uint32_t StateFlag;

	/* Trng processing flag - indicates which ROSC lengths are:
	-  allowed (bits 0-3);
	-  total started (bits 8-11);
	-  processed (bits 16-19);
	-  started, but not processed (bits24-27)              */
	/*! TRNG process state used internally in the code */
	uint32_t TrngProcesState;

} CCRndState_t;

/* Register Offset macro */
#define CC_REG_OFFSET(unit_name, reg_name)               \
	(DX_ ## reg_name ## _REG_OFFSET)

/*!
 * Read TRNG memory-mapped-IO register.
 *
 * \param regOffset The offset of the ARM TRNG register to read
 * \return uint32_t Return the value of the given register
 */
#define CC_HAL_READ_REGISTER(regOffset) 				\
		(*((volatile uint32_t *)(gCcRegBase + (regOffset))))

/*!
 * Write TRNG memory-mapped-IO register.
 * \note This macro must be modified to make the operation synchronous, i.e. the write operation must complete,
 *       and the new value must be written to the register before the macro returns. The mechanisms required to
 *       achieve this are architecture-dependent (e.g., the memory barrier in ARM architecture).
 *
 * \param regOffset The offset of the ARM TRNG register to write
 * \param val The value to write
 */
#define CC_HAL_WRITE_REGISTER(regOffset, val) \
		(*((volatile uint32_t *)(gCcRegBase + (regOffset))) = (val))

#define LLF_RND_HW_TRNG_EHR_WIDTH_IN_WORDS  6
#define LLF_RND_HW_TRNG_EHR_WIDTH_IN_BYTES  (LLF_RND_HW_TRNG_EHR_WIDTH_IN_WORDS * sizeof(uint32_t))
#define LLF_RND_HW_DMA_EHR_SAMPLES_NUM_ON_TRNG90B_MODE  22UL
#define LLF_RND_HW_DEBUG_CONTROL_VALUE_ON_FE_MODE  0x00000000
/* ring oscillator offsets and numbers */
#define LLF_RND_HW_TRNG_ROSC0_BIT       0x1
#define LLF_RND_HW_TRNG_ROSC1_BIT       0x2
#define LLF_RND_HW_TRNG_ROSC2_BIT       0x4
#define LLF_RND_HW_TRNG_ROSC3_BIT       0x8
#define LLF_RND_HW_TRNG_ROSC0_NUM       0x0
#define LLF_RND_HW_TRNG_ROSC1_NUM       0x1
#define LLF_RND_HW_TRNG_ROSC2_NUM       0x2
#define LLF_RND_HW_TRNG_ROSC3_NUM       0x3

#define LLF_RND_HW_RND_SRC_ENABLE_VAL      	1UL
#define LLF_RND_HW_RND_SRC_DISABLE_VAL     	0UL
#define LLF_RND_HW_TRNG_WITH_DMA_CONFIG_VAL    0x4
#define LLF_RNG_INT_MASK_ON_TRNG90B_MODE  0xFFFFFFC5
#define LLF_RNG_INT_MASK_ON_FETRNG_MODE  0xFFFFFFEC

#define LLF_RND_HW_DMA_EHR_SAMPLES_NUM_ON_FE_MODE  2UL /*for both AES128 and AES256*/

/* Logging macros */
#define TRNG_LOG(format, ...) \
    fprintf(stderr, "tztrng:%s: " format , __func__, ##__VA_ARGS__)

#ifdef DEBUG
#define TRNG_LOG_DEBUG(format, ...) TRNG_LOG(format, ##__VA_ARGS__)
#else
#define TRNG_LOG_DEBUG(format, ...) do {} while (0)
#endif

#ifdef TZTRNG_EHR_DUMP
#define TRNG_EHR_DUMP(format, ...) \
    fprintf(stderr, format, ##__VA_ARGS__)
#else
#define TRNG_EHR_DUMP(format, ...) do {} while (0)
#endif

#define CC_ERROR_BASE          0x00F00000UL
#define CC_ERROR_LAYER_RANGE   0x00010000UL
#define CC_ERROR_MODULE_RANGE  0x00000100UL
#define CC_LAYER_ERROR_IDX     0x00UL
#define LLF_LAYER_ERROR_IDX      0x01UL
#define GENERIC_ERROR_IDX        0x05UL
#define RND_ERROR_IDX            0x0CUL
#define CC_RND_MODULE_ERROR_BASE   (CC_ERROR_BASE + \
                                     (CC_ERROR_LAYER_RANGE * CC_LAYER_ERROR_IDX) + \
                                     (CC_ERROR_MODULE_RANGE * RND_ERROR_IDX ) )

/*! Low level RND module error base address -  0x00F10C00. */
#define LLF_RND_MODULE_ERROR_BASE    (CC_ERROR_BASE + \
                                     (CC_ERROR_LAYER_RANGE * LLF_LAYER_ERROR_IDX) + \
                                     (CC_ERROR_MODULE_RANGE * RND_ERROR_IDX ) )
#define LLF_RND_HW_DEBUG_CONTROL_VALUE_ON_TRNG90B_MODE  0x0000000A	/* bypass Von-Neumann balancer and autocorrelation test */
#define LLF_RND_HW_VERSION_NOT_CORRECT_ERROR    	    (LLF_RND_MODULE_ERROR_BASE + 0x0UL)
#define LLF_RND_CPRNG_TEST_FAIL_ERROR			        (LLF_RND_MODULE_ERROR_BASE + 0x1UL)
#define LLF_RND_CRNGT_TEST_FAIL_ERROR			        (LLF_RND_MODULE_ERROR_BASE + 0x2UL)
#define LLF_RND_STATE_PTR_INVALID_ERROR			        (LLF_RND_MODULE_ERROR_BASE + 0x3UL)
#define LLF_RND_AES_256_NOT_SUPPORTED_ERROR             (LLF_RND_MODULE_ERROR_BASE + 0x4UL)

#define LLF_RND_TRNG_TIME_LIMIT_EXCEEDED_ERROR          (LLF_RND_MODULE_ERROR_BASE + 0x20UL)
#define LLF_RND_TRNG_ENTR_ESTIM_SIZE_EXCEED_ERROR       (LLF_RND_MODULE_ERROR_BASE + 0x21UL)

#define LLF_RND_TRNG_PREVIOUS_PARAMS_NOT_MATCH_ERROR    (LLF_RND_MODULE_ERROR_BASE + 0x30UL)
#define LLF_RND_TRNG_REQUIRED_ROSCS_NOT_ALLOWED_ERROR   (LLF_RND_MODULE_ERROR_BASE + 0x31UL)
#define LLF_RND_TRNG_GENERATION_NOT_COMPLETED_ERROR     (LLF_RND_MODULE_ERROR_BASE + 0x32UL)
#define LLF_RND_TRNG_LOW_ENTROPY_ERROR	   	            (LLF_RND_MODULE_ERROR_BASE + 0x33UL)
#define LLF_RND_TRNG_NULL_ENTROPY_ERROR	   	            (LLF_RND_MODULE_ERROR_BASE + 0x34UL)
#define LLF_RND_TRNG_ILLEGAL_PTR_ERROR   	            (LLF_RND_MODULE_ERROR_BASE + 0x35UL)
#define LLF_RND_TRNG_REPETITION_COUNTER_ERROR           (LLF_RND_MODULE_ERROR_BASE + 0x36UL)
#define LLF_RND_TRNG_ADAPTION_PROPORTION_ERROR          (LLF_RND_MODULE_ERROR_BASE + 0x37UL)

#define CC_RND_CPRNG_TEST_FAIL_ERROR		       	    (CC_RND_MODULE_ERROR_BASE + 0x2UL)
#define CC_RND_TRNG_KAT_NOT_SUPPORTED_ERROR             (CC_RND_MODULE_ERROR_BASE + 0x34UL)

void LLF_RND_TurnOffTrng(void);
CCError_t LLF_RND_GetFastestRosc( CCRndParams_t *trngParams_ptr, uint32_t *rosc_ptr/*in/out*/);
CCError_t LLF_RND_GetRoscSampleCnt( uint32_t rosc, CCRndParams_t *pTrngParams);
uint32_t LLF_RND_TRNG_RoscMaskToNum(uint32_t mask);

#define CC_RND_NOT_INSTANTIATED             	0UL
#define CC_RND_INSTANTIATED                	    1UL
#define CC_RND_INSTANTRESEED_AUTOCORR_ERRORS 	2UL
#define CC_RND_INSTANTRESEED_TIME_EXCEED     	4UL
#define CC_RND_INSTANTRESEED_LESS_ENTROPY    	8UL

CCError_t LLF_RND_RunTrngStartupTest(
                 CCRndState_t   *rndState_ptr,      /*in/out*/
                 CCRndParams_t  *trngParams_ptr,    /*out*/
                 uint32_t       *rndWorkBuff_ptr);  /*in*/

CCError_t LLF_RND_GetTrngSource(
				 CCRndState_t   *rndState_ptr,	    /*in/out*/
				 CCRndParams_t  *trngParams_ptr,    /*in/out*/
				 CCBool_t       isContinued,	    /*in*/
				 uint32_t       **sourceOut_ptr_ptr,/*out*/
				 uint32_t       *sourceOutSize_ptr, /*in/out*/
				 uint32_t       *rndWorkBuff_ptr);   /*in*/

#endif