Nuvoton / Mbed OS mbed-os-example-pelion

Fork of mbed-os-example-pelion by cc li

Committer:
ccli8
Date:
Mon Aug 31 10:59:06 2020 +0800
Revision:
12:f58b10070853
Child:
14:0e7b5aeba173
Organize platform-specific files to under targets directory

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ccli8 12:f58b10070853 1 /*
ccli8 12:f58b10070853 2 * Copyright (c) 2019 Nuvoton Technology Corporation
ccli8 12:f58b10070853 3 *
ccli8 12:f58b10070853 4 * SPDX-License-Identifier: Apache-2.0
ccli8 12:f58b10070853 5 *
ccli8 12:f58b10070853 6 * Licensed under the Apache License, Version 2.0 (the "License");
ccli8 12:f58b10070853 7 * you may not use this file except in compliance with the License.
ccli8 12:f58b10070853 8 * You may obtain a copy of the License at
ccli8 12:f58b10070853 9 *
ccli8 12:f58b10070853 10 * http://www.apache.org/licenses/LICENSE-2.0
ccli8 12:f58b10070853 11 *
ccli8 12:f58b10070853 12 * Unless required by applicable law or agreed to in writing, software
ccli8 12:f58b10070853 13 * distributed under the License is distributed on an "AS IS" BASIS,
ccli8 12:f58b10070853 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
ccli8 12:f58b10070853 15 * See the License for the specific language governing permissions and
ccli8 12:f58b10070853 16 * limitations under the License.
ccli8 12:f58b10070853 17 */
ccli8 12:f58b10070853 18
ccli8 12:f58b10070853 19 #if !DEVICE_TRNG && !TARGET_PSA
ccli8 12:f58b10070853 20
ccli8 12:f58b10070853 21 #include "mbed.h"
ccli8 12:f58b10070853 22 #include "mbedtls/config.h"
ccli8 12:f58b10070853 23
ccli8 12:f58b10070853 24 #if defined(MBEDTLS_ENTROPY_HARDWARE_ALT)
ccli8 12:f58b10070853 25
ccli8 12:f58b10070853 26 /* Support entropy source with EADC seeded PRNG on non-PSA targets without TRNG
ccli8 12:f58b10070853 27 *
ccli8 12:f58b10070853 28 * Follow the steps below to replace TRNG with EADC seeded PRNG:
ccli8 12:f58b10070853 29 *
ccli8 12:f58b10070853 30 * 1. Seed PRNG with EADC band gap
ccli8 12:f58b10070853 31 * 2. Define MBEDTLS_ENTROPY_HARDWARE_ALT and provide custom mbedtls_hardware_poll(...)
ccli8 12:f58b10070853 32 *
ccli8 12:f58b10070853 33 * Reference configuration in mbed_app.json:
ccli8 12:f58b10070853 34 *
ccli8 12:f58b10070853 35 * For Pelion/mbedtls:
ccli8 12:f58b10070853 36 *
ccli8 12:f58b10070853 37 * "target.macros_add": [
ccli8 12:f58b10070853 38 * "MBEDTLS_USER_CONFIG_FILE=\"mbedTLSConfig_mbedOS.h\"",
ccli8 12:f58b10070853 39 * "MBEDTLS_ENTROPY_HARDWARE_ALT"
ccli8 12:f58b10070853 40 * ],
ccli8 12:f58b10070853 41 *
ccli8 12:f58b10070853 42 * For non-Pelion/mbedtls:
ccli8 12:f58b10070853 43 *
ccli8 12:f58b10070853 44 * "target.macros_add": [
ccli8 12:f58b10070853 45 * "MBEDTLS_ENTROPY_HARDWARE_ALT"
ccli8 12:f58b10070853 46 * ],
ccli8 12:f58b10070853 47 *
ccli8 12:f58b10070853 48 * For both Pelion/non-Pelion (skip when done in targets.json):
ccli8 12:f58b10070853 49 *
ccli8 12:f58b10070853 50 * "target.device_has_remove": ["TRNG"],
ccli8 12:f58b10070853 51 *
ccli8 12:f58b10070853 52 * WARNING: If the security level of EADC seeded PRNG cannot meet requirements, replace it with another entropy source.
ccli8 12:f58b10070853 53 */
ccli8 12:f58b10070853 54
ccli8 12:f58b10070853 55 #include "crypto-misc.h"
ccli8 12:f58b10070853 56
ccli8 12:f58b10070853 57 extern "C" {
ccli8 12:f58b10070853 58 int mbedtls_hardware_poll(void *data, unsigned char *output, size_t len, size_t *olen);
ccli8 12:f58b10070853 59 }
ccli8 12:f58b10070853 60
ccli8 12:f58b10070853 61 /* Support EADC band gap
ccli8 12:f58b10070853 62 *
ccli8 12:f58b10070853 63 * Mbed OS defines analog-in HAL for normal purposes, but EADC band gap is not defined.
ccli8 12:f58b10070853 64 * To avoid EADC code conflict and fit into existent analog-in HAL, we:
ccli8 12:f58b10070853 65 *
ccli8 12:f58b10070853 66 * 1. Hijack AnalogIn driver to involve analog-in HAL protection and EADC initialization.
ccli8 12:f58b10070853 67 * This needs one dedicated EADC pin EADC_AUX_PINNAME.
ccli8 12:f58b10070853 68 * 2. Run EADC band gap conversion, with EADC module already initialized via above. This needs
ccli8 12:f58b10070853 69 * one dedicated sample module and one dedicated channel.
ccli8 12:f58b10070853 70 */
ccli8 12:f58b10070853 71
ccli8 12:f58b10070853 72 #if TARGET_NUC472
ccli8 12:f58b10070853 73 #define EADC_AUX_PINNAME A0
ccli8 12:f58b10070853 74 #define EADC_BANDGAP_SMPLMOD 7
ccli8 12:f58b10070853 75 #define EADC_BANDGAP_CHN 8
ccli8 12:f58b10070853 76 #define PRNG_KEYSIZE_ID PRNG_KEY_SIZE_128
ccli8 12:f58b10070853 77 #define PRNG_KEYSIZE 16
ccli8 12:f58b10070853 78 #elif TARGET_M480
ccli8 12:f58b10070853 79 #define EADC_AUX_PINNAME A0
ccli8 12:f58b10070853 80 #define EADC_BANDGAP_SMPLMOD 16
ccli8 12:f58b10070853 81 #define EADC_BANDGAP_CHN 16
ccli8 12:f58b10070853 82 #define PRNG_KEYSIZE_ID PRNG_KEY_SIZE_128
ccli8 12:f58b10070853 83 #define PRNG_KEYSIZE 16
ccli8 12:f58b10070853 84 #else
ccli8 12:f58b10070853 85 #error("Target not support")
ccli8 12:f58b10070853 86 #endif
ccli8 12:f58b10070853 87
ccli8 12:f58b10070853 88 class NuBandGap : public mbed::AnalogIn {
ccli8 12:f58b10070853 89 public:
ccli8 12:f58b10070853 90 NuBandGap();
ccli8 12:f58b10070853 91 ~NuBandGap();
ccli8 12:f58b10070853 92
ccli8 12:f58b10070853 93 /* Generate bitstream based on EADC band gap
ccli8 12:f58b10070853 94 *
ccli8 12:f58b10070853 95 * @returns 1/0 bitstream
ccli8 12:f58b10070853 96 */
ccli8 12:f58b10070853 97 uint16_t read_bitstream();
ccli8 12:f58b10070853 98 };
ccli8 12:f58b10070853 99
ccli8 12:f58b10070853 100 class NuEADCSeedPRNG : private mbed::NonCopyable<NuEADCSeedPRNG>
ccli8 12:f58b10070853 101 {
ccli8 12:f58b10070853 102 public:
ccli8 12:f58b10070853 103 NuEADCSeedPRNG();
ccli8 12:f58b10070853 104 ~NuEADCSeedPRNG();
ccli8 12:f58b10070853 105
ccli8 12:f58b10070853 106 /* Get random data
ccli8 12:f58b10070853 107 *
ccli8 12:f58b10070853 108 * @param output The pointer to an output array
ccli8 12:f58b10070853 109 * @param len The size of output data, to avoid buffer overwrite
ccli8 12:f58b10070853 110 * @param olen The length of generated data
ccli8 12:f58b10070853 111 */
ccli8 12:f58b10070853 112 int get_bytes(unsigned char *output, size_t len, size_t *olen);
ccli8 12:f58b10070853 113
ccli8 12:f58b10070853 114 private:
ccli8 12:f58b10070853 115 NuBandGap band_gap;
ccli8 12:f58b10070853 116 };
ccli8 12:f58b10070853 117
ccli8 12:f58b10070853 118 int mbedtls_hardware_poll(MBED_UNUSED void *data, unsigned char *output, size_t len, size_t *olen)
ccli8 12:f58b10070853 119 {
ccli8 12:f58b10070853 120 static NuEADCSeedPRNG eadc_seed_prng;
ccli8 12:f58b10070853 121
ccli8 12:f58b10070853 122 return eadc_seed_prng.get_bytes(output, len, olen);
ccli8 12:f58b10070853 123 }
ccli8 12:f58b10070853 124
ccli8 12:f58b10070853 125 NuBandGap::NuBandGap() : mbed::AnalogIn(EADC_AUX_PINNAME)
ccli8 12:f58b10070853 126 {
ccli8 12:f58b10070853 127 EADC_T *eadc_base = (EADC_T *) EADC_BASE;
ccli8 12:f58b10070853 128
ccli8 12:f58b10070853 129 EADC_ConfigSampleModule(eadc_base, EADC_BANDGAP_SMPLMOD, EADC_SOFTWARE_TRIGGER, EADC_BANDGAP_CHN);
ccli8 12:f58b10070853 130 }
ccli8 12:f58b10070853 131
ccli8 12:f58b10070853 132 NuBandGap::~NuBandGap()
ccli8 12:f58b10070853 133 {
ccli8 12:f58b10070853 134 }
ccli8 12:f58b10070853 135
ccli8 12:f58b10070853 136 uint16_t NuBandGap::read_bitstream()
ccli8 12:f58b10070853 137 {
ccli8 12:f58b10070853 138 uint16_t one_or_zero;
ccli8 12:f58b10070853 139
ccli8 12:f58b10070853 140 lock();
ccli8 12:f58b10070853 141
ccli8 12:f58b10070853 142 EADC_T *eadc_base = (EADC_T *) EADC_BASE;
ccli8 12:f58b10070853 143
ccli8 12:f58b10070853 144 EADC_START_CONV(eadc_base, 1 << EADC_BANDGAP_SMPLMOD);
ccli8 12:f58b10070853 145 while (EADC_GET_DATA_VALID_FLAG(eadc_base, 1 << EADC_BANDGAP_SMPLMOD) != (1 << EADC_BANDGAP_SMPLMOD));
ccli8 12:f58b10070853 146 uint16_t conv_res_12 = EADC_GET_CONV_DATA(eadc_base, EADC_BANDGAP_SMPLMOD);
ccli8 12:f58b10070853 147
ccli8 12:f58b10070853 148 /* 1 as number of 'one' is odd; 0 otherwise */
ccli8 12:f58b10070853 149 unsigned i;
ccli8 12:f58b10070853 150 uint16_t count_one = 0;
ccli8 12:f58b10070853 151 for (i = 0; i < 12; i ++) {
ccli8 12:f58b10070853 152 if (conv_res_12 & 1) {
ccli8 12:f58b10070853 153 count_one ++;
ccli8 12:f58b10070853 154 }
ccli8 12:f58b10070853 155 conv_res_12 >>= 1;
ccli8 12:f58b10070853 156 }
ccli8 12:f58b10070853 157 one_or_zero = count_one & 1;
ccli8 12:f58b10070853 158
ccli8 12:f58b10070853 159 unlock();
ccli8 12:f58b10070853 160
ccli8 12:f58b10070853 161 return one_or_zero;
ccli8 12:f58b10070853 162 }
ccli8 12:f58b10070853 163
ccli8 12:f58b10070853 164 NuEADCSeedPRNG::NuEADCSeedPRNG()
ccli8 12:f58b10070853 165 {
ccli8 12:f58b10070853 166 crypto_init();
ccli8 12:f58b10070853 167 PRNG_ENABLE_INT();
ccli8 12:f58b10070853 168
ccli8 12:f58b10070853 169 uint32_t seed = 0;
ccli8 12:f58b10070853 170 unsigned i = 32;
ccli8 12:f58b10070853 171
ccli8 12:f58b10070853 172 /* Get seed from EADC band gap */
ccli8 12:f58b10070853 173 while (i --) {
ccli8 12:f58b10070853 174 seed <<= 1;
ccli8 12:f58b10070853 175 seed |= band_gap.read_bitstream();
ccli8 12:f58b10070853 176 }
ccli8 12:f58b10070853 177
ccli8 12:f58b10070853 178 /* PRNG reload seed */
ccli8 12:f58b10070853 179 PRNG_Open(PRNG_KEYSIZE_ID, 1, seed);
ccli8 12:f58b10070853 180 }
ccli8 12:f58b10070853 181
ccli8 12:f58b10070853 182 NuEADCSeedPRNG::~NuEADCSeedPRNG()
ccli8 12:f58b10070853 183 {
ccli8 12:f58b10070853 184 PRNG_DISABLE_INT();
ccli8 12:f58b10070853 185 crypto_uninit();
ccli8 12:f58b10070853 186 }
ccli8 12:f58b10070853 187
ccli8 12:f58b10070853 188 int NuEADCSeedPRNG::get_bytes(unsigned char *output, size_t len, size_t *olen)
ccli8 12:f58b10070853 189 {
ccli8 12:f58b10070853 190 /* Check argument validity */
ccli8 12:f58b10070853 191 if (!output && len) {
ccli8 12:f58b10070853 192 return -1;
ccli8 12:f58b10070853 193 }
ccli8 12:f58b10070853 194
ccli8 12:f58b10070853 195 unsigned char *output_ind = output;
ccli8 12:f58b10070853 196 size_t rmn = len;
ccli8 12:f58b10070853 197 uint32_t rand_data[PRNG_KEYSIZE / sizeof(uint32_t)];
ccli8 12:f58b10070853 198 while (rmn) {
ccli8 12:f58b10070853 199 crypto_prng_prestart();
ccli8 12:f58b10070853 200 PRNG_Start();
ccli8 12:f58b10070853 201 crypto_prng_wait();
ccli8 12:f58b10070853 202
ccli8 12:f58b10070853 203 PRNG_Read(rand_data);
ccli8 12:f58b10070853 204
ccli8 12:f58b10070853 205 size_t n = (rmn >= PRNG_KEYSIZE) ? PRNG_KEYSIZE : rmn;
ccli8 12:f58b10070853 206 memcpy(output_ind, rand_data, n);
ccli8 12:f58b10070853 207
ccli8 12:f58b10070853 208 output_ind += n;
ccli8 12:f58b10070853 209 rmn -= n;
ccli8 12:f58b10070853 210 }
ccli8 12:f58b10070853 211
ccli8 12:f58b10070853 212 if (olen) {
ccli8 12:f58b10070853 213 *olen = len;
ccli8 12:f58b10070853 214 }
ccli8 12:f58b10070853 215
ccli8 12:f58b10070853 216 return 0;
ccli8 12:f58b10070853 217 }
ccli8 12:f58b10070853 218
ccli8 12:f58b10070853 219 #else
ccli8 12:f58b10070853 220
ccli8 12:f58b10070853 221 /* Support entropy source with mbedtls NV seed on non-PSA targets without TRNG
ccli8 12:f58b10070853 222 *
ccli8 12:f58b10070853 223 * Follow the steps below to replace TRNG with mbedtls NV seed:
ccli8 12:f58b10070853 224 *
ccli8 12:f58b10070853 225 * 1. Define MBEDTLS_ENTROPY_NV_SEED
ccli8 12:f58b10070853 226 * 2. Define MBEDTLS_PLATFORM_NV_SEED_READ_MACRO/MBEDTLS_PLATFORM_NV_SEED_WRITE_MACRO and provide custom mbedtls_nv_seed_read(...)/mbedtls_nv_seed_write(...).
ccli8 12:f58b10070853 227 * 3. Don't define MBEDTLS_PSA_INJECT_ENTROPY. Meet mbedtls_psa_inject_entropy(...) undefined and then provide custom one, which must be compatible with mbedtls_nv_seed_read(...)/mbedtls_nv_seed_write(...) above.
ccli8 12:f58b10070853 228 * 4. For development, simulating partial provision process, inject entropy seed via mbedtls_psa_inject_entropy(...) pre-main.
ccli8 12:f58b10070853 229 *
ccli8 12:f58b10070853 230 * Reference configuration in mbed_app.json:
ccli8 12:f58b10070853 231 *
ccli8 12:f58b10070853 232 * For Pelion/mbedtls, don't define MBEDTLS_ENTROPY_NV_SEED because it has defined in:
ccli8 12:f58b10070853 233 * https://github.com/ARMmbed/mbed-cloud-client/blob/master/mbed-client-pal/Configs/mbedTLS/mbedTLSConfig_mbedOS_SW_TRNG.h
ccli8 12:f58b10070853 234 *
ccli8 12:f58b10070853 235 * "target.macros_add": [
ccli8 12:f58b10070853 236 * "MBEDTLS_USER_CONFIG_FILE=\"mbedTLSConfig_mbedOS_SW_TRNG.h\"",
ccli8 12:f58b10070853 237 * "PAL_USE_HW_TRNG=0",
ccli8 12:f58b10070853 238 * "MBEDTLS_PLATFORM_NV_SEED_READ_MACRO=mbedtls_platform_seed_read",
ccli8 12:f58b10070853 239 * "MBEDTLS_PLATFORM_NV_SEED_WRITE_MACRO=mbedtls_platform_seed_write"
ccli8 12:f58b10070853 240 * ],
ccli8 12:f58b10070853 241 *
ccli8 12:f58b10070853 242 * For non-Pelion/mbedtls:
ccli8 12:f58b10070853 243 *
ccli8 12:f58b10070853 244 * "target.macros_add": [
ccli8 12:f58b10070853 245 * "MBEDTLS_ENTROPY_NV_SEED",
ccli8 12:f58b10070853 246 * "MBEDTLS_PLATFORM_NV_SEED_READ_MACRO=mbedtls_platform_seed_read",
ccli8 12:f58b10070853 247 * "MBEDTLS_PLATFORM_NV_SEED_WRITE_MACRO=mbedtls_platform_seed_write"
ccli8 12:f58b10070853 248 * ],
ccli8 12:f58b10070853 249 *
ccli8 12:f58b10070853 250 * For both Pelion/non-Pelion (skip when done in targets.json):
ccli8 12:f58b10070853 251 *
ccli8 12:f58b10070853 252 * "target.device_has_remove": ["TRNG"],
ccli8 12:f58b10070853 253 *
ccli8 12:f58b10070853 254 * WARNING: The injection of mbedtls NV seed pre-main is only for development. Run provision process for mass production.
ccli8 12:f58b10070853 255 */
ccli8 12:f58b10070853 256
ccli8 12:f58b10070853 257 #include "entropy_poll.h"
ccli8 12:f58b10070853 258 #include "psa/crypto.h"
ccli8 12:f58b10070853 259 #include "KVStore.h"
ccli8 12:f58b10070853 260 #include "TDBStore.h"
ccli8 12:f58b10070853 261 #include "KVMap.h"
ccli8 12:f58b10070853 262 #include "kv_config.h"
ccli8 12:f58b10070853 263
ccli8 12:f58b10070853 264 extern "C" {
ccli8 12:f58b10070853 265 psa_status_t mbedtls_psa_inject_entropy(const uint8_t *seed, size_t seed_size);
ccli8 12:f58b10070853 266 int mbedtls_platform_seed_read(unsigned char *buf, size_t buf_len);
ccli8 12:f58b10070853 267 int mbedtls_platform_seed_write(unsigned char *buf, size_t buf_len);
ccli8 12:f58b10070853 268 }
ccli8 12:f58b10070853 269
ccli8 12:f58b10070853 270 /* Requirement of seed size
ccli8 12:f58b10070853 271 *
ccli8 12:f58b10070853 272 * 1. >= MBEDTLS_ENTROPY_MIN_PLATFORM
ccli8 12:f58b10070853 273 * 2. >= MBEDTLS_ENTROPY_BLOCK_SIZE
ccli8 12:f58b10070853 274 * 3. <= MBEDTLS_ENTROPY_MAX_SEED_SIZE
ccli8 12:f58b10070853 275 */
ccli8 12:f58b10070853 276 #define SEED_SIZE 64
ccli8 12:f58b10070853 277 MBED_STATIC_ASSERT(SEED_SIZE >= MBEDTLS_ENTROPY_MIN_PLATFORM, "Seed size must be larger than or equal to MBEDTLS_ENTROPY_MIN_PLATFORM");
ccli8 12:f58b10070853 278 MBED_STATIC_ASSERT(SEED_SIZE >= MBEDTLS_ENTROPY_BLOCK_SIZE, "Seed size must be larger than or equal to MBEDTLS_ENTROPY_BLOCK_SIZE");
ccli8 12:f58b10070853 279 MBED_STATIC_ASSERT(SEED_SIZE <= MBEDTLS_ENTROPY_MAX_SEED_SIZE, "Seed size must be smaller than or equal to MBEDTLS_ENTROPY_MAX_SEED_SIZE");
ccli8 12:f58b10070853 280
ccli8 12:f58b10070853 281 /* Seed key name in kvstore */
ccli8 12:f58b10070853 282 #define KV_KEY_SEED "seed"
ccli8 12:f58b10070853 283
ccli8 12:f58b10070853 284 /* Inject an initial entropy seed for the random generator into secure storage
ccli8 12:f58b10070853 285 *
ccli8 12:f58b10070853 286 * See reference below for its prototype:
ccli8 12:f58b10070853 287 * https://github.com/ARMmbed/mbed-os/blob/master/features/mbedtls/mbed-crypto/inc/psa/crypto_extra.h
ccli8 12:f58b10070853 288 */
ccli8 12:f58b10070853 289 psa_status_t mbedtls_psa_inject_entropy(const uint8_t *seed, size_t seed_size)
ccli8 12:f58b10070853 290 {
ccli8 12:f58b10070853 291 /* Check seed size requirement */
ccli8 12:f58b10070853 292 if ((( seed_size < MBEDTLS_ENTROPY_MIN_PLATFORM) || (seed_size < MBEDTLS_ENTROPY_BLOCK_SIZE)) ||
ccli8 12:f58b10070853 293 (seed_size > MBEDTLS_ENTROPY_MAX_SEED_SIZE)) {
ccli8 12:f58b10070853 294 return PSA_ERROR_INVALID_ARGUMENT;
ccli8 12:f58b10070853 295 }
ccli8 12:f58b10070853 296
ccli8 12:f58b10070853 297 /* Get kvstore internal storage where seed is injected */
ccli8 12:f58b10070853 298 KVMap &kv_map = KVMap::get_instance();
ccli8 12:f58b10070853 299 KVStore *inner_store = kv_map.get_internal_kv_instance(NULL);
ccli8 12:f58b10070853 300 if (inner_store == NULL) {
ccli8 12:f58b10070853 301 return PSA_ERROR_STORAGE_FAILURE;
ccli8 12:f58b10070853 302 }
ccli8 12:f58b10070853 303
ccli8 12:f58b10070853 304 /* Check if seed has injected */
ccli8 12:f58b10070853 305 KVStore::info_t kv_info;
ccli8 12:f58b10070853 306 int kv_status = inner_store->get_info(KV_KEY_SEED, &kv_info);
ccli8 12:f58b10070853 307 if (kv_status == MBED_SUCCESS) {
ccli8 12:f58b10070853 308 return PSA_ERROR_NOT_PERMITTED;
ccli8 12:f58b10070853 309 } else if (kv_status == MBED_ERROR_ITEM_NOT_FOUND) {
ccli8 12:f58b10070853 310 /* No seed injected, inject it below */
ccli8 12:f58b10070853 311 } else {
ccli8 12:f58b10070853 312 return PSA_ERROR_STORAGE_FAILURE;
ccli8 12:f58b10070853 313 }
ccli8 12:f58b10070853 314
ccli8 12:f58b10070853 315 /* Inject seed into kvstore internal storage */
ccli8 12:f58b10070853 316 kv_status = inner_store->set(KV_KEY_SEED, seed, seed_size, 0);
ccli8 12:f58b10070853 317 if (kv_status == MBED_SUCCESS) {
ccli8 12:f58b10070853 318 return PSA_SUCCESS;
ccli8 12:f58b10070853 319 } else {
ccli8 12:f58b10070853 320 return PSA_ERROR_STORAGE_FAILURE;
ccli8 12:f58b10070853 321 }
ccli8 12:f58b10070853 322 }
ccli8 12:f58b10070853 323
ccli8 12:f58b10070853 324 int mbedtls_platform_seed_read(unsigned char *buf, size_t buf_len)
ccli8 12:f58b10070853 325 {
ccli8 12:f58b10070853 326 /* Get kvstore internal storage where seed is injected */
ccli8 12:f58b10070853 327 KVMap &kv_map = KVMap::get_instance();
ccli8 12:f58b10070853 328 KVStore *inner_store = kv_map.get_internal_kv_instance(NULL);
ccli8 12:f58b10070853 329 if (inner_store == NULL) {
ccli8 12:f58b10070853 330 return -1;
ccli8 12:f58b10070853 331 }
ccli8 12:f58b10070853 332
ccli8 12:f58b10070853 333 /* Read seed from kvstore internal storage */
ccli8 12:f58b10070853 334 size_t actual_size = 0;
ccli8 12:f58b10070853 335 int kv_status = inner_store->get(KV_KEY_SEED, buf, buf_len, &actual_size, 0);
ccli8 12:f58b10070853 336 if (kv_status != MBED_SUCCESS || actual_size != buf_len) {
ccli8 12:f58b10070853 337 return -1;
ccli8 12:f58b10070853 338 } else {
ccli8 12:f58b10070853 339 return buf_len;
ccli8 12:f58b10070853 340 }
ccli8 12:f58b10070853 341 }
ccli8 12:f58b10070853 342
ccli8 12:f58b10070853 343 int mbedtls_platform_seed_write(unsigned char *buf, size_t buf_len)
ccli8 12:f58b10070853 344 {
ccli8 12:f58b10070853 345 /* Get kvstore internal storage where seed is injected */
ccli8 12:f58b10070853 346 KVMap &kv_map = KVMap::get_instance();
ccli8 12:f58b10070853 347 KVStore *inner_store = kv_map.get_internal_kv_instance(NULL);
ccli8 12:f58b10070853 348 if (inner_store == NULL) {
ccli8 12:f58b10070853 349 return -1;
ccli8 12:f58b10070853 350 }
ccli8 12:f58b10070853 351
ccli8 12:f58b10070853 352 /* Write seed into kvstore internal storage */
ccli8 12:f58b10070853 353 int kv_status = inner_store->set(KV_KEY_SEED, buf, buf_len, 0);
ccli8 12:f58b10070853 354 if (kv_status != MBED_SUCCESS) {
ccli8 12:f58b10070853 355 return -1;
ccli8 12:f58b10070853 356 } else {
ccli8 12:f58b10070853 357 return buf_len;
ccli8 12:f58b10070853 358 }
ccli8 12:f58b10070853 359 }
ccli8 12:f58b10070853 360
ccli8 12:f58b10070853 361 #endif /* #if defined(MBEDTLS_ENTROPY_HARDWARE_ALT) */
ccli8 12:f58b10070853 362
ccli8 12:f58b10070853 363 #endif /* !DEVICE_TRNG && !TARGET_PSA */