Nuvoton / Mbed OS mbed-os-example-pelion

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

Committer:
ccli8
Date:
Mon Sep 28 18:03:20 2020 +0800
Revision:
14:0e7b5aeba173
Parent:
12:f58b10070853
Make code compatible across mbed-os 5.15/6.0

1. Since Mbedd OS 6.0, device key is not installed automatically and silently, possibly via generate_derived_key(...). Install it manually. 16-byte version is required to be compatible with mbed-bootloader.
2. Fix PRGN API calling code with M480 BSP update
3. Fix COMPONENT_NUSD.lib with M480 BSP update

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 14:0e7b5aeba173 167 #if TARGET_NUC472 || (MBED_MAJOR_VERSION < 6)
ccli8 12:f58b10070853 168 PRNG_ENABLE_INT();
ccli8 14:0e7b5aeba173 169 #else
ccli8 14:0e7b5aeba173 170 PRNG_ENABLE_INT(CRPT);
ccli8 14:0e7b5aeba173 171 #endif
ccli8 12:f58b10070853 172
ccli8 12:f58b10070853 173 uint32_t seed = 0;
ccli8 12:f58b10070853 174 unsigned i = 32;
ccli8 12:f58b10070853 175
ccli8 12:f58b10070853 176 /* Get seed from EADC band gap */
ccli8 12:f58b10070853 177 while (i --) {
ccli8 12:f58b10070853 178 seed <<= 1;
ccli8 12:f58b10070853 179 seed |= band_gap.read_bitstream();
ccli8 12:f58b10070853 180 }
ccli8 12:f58b10070853 181
ccli8 12:f58b10070853 182 /* PRNG reload seed */
ccli8 14:0e7b5aeba173 183 #if TARGET_NUC472 || (MBED_MAJOR_VERSION < 6)
ccli8 12:f58b10070853 184 PRNG_Open(PRNG_KEYSIZE_ID, 1, seed);
ccli8 14:0e7b5aeba173 185 #else
ccli8 14:0e7b5aeba173 186 PRNG_Open(CRPT, PRNG_KEYSIZE_ID, 1, seed);
ccli8 14:0e7b5aeba173 187 #endif
ccli8 12:f58b10070853 188 }
ccli8 12:f58b10070853 189
ccli8 12:f58b10070853 190 NuEADCSeedPRNG::~NuEADCSeedPRNG()
ccli8 12:f58b10070853 191 {
ccli8 14:0e7b5aeba173 192 #if TARGET_NUC472 || (MBED_MAJOR_VERSION < 6)
ccli8 12:f58b10070853 193 PRNG_DISABLE_INT();
ccli8 14:0e7b5aeba173 194 #else
ccli8 14:0e7b5aeba173 195 PRNG_DISABLE_INT(CRPT);
ccli8 14:0e7b5aeba173 196 #endif
ccli8 12:f58b10070853 197 crypto_uninit();
ccli8 12:f58b10070853 198 }
ccli8 12:f58b10070853 199
ccli8 12:f58b10070853 200 int NuEADCSeedPRNG::get_bytes(unsigned char *output, size_t len, size_t *olen)
ccli8 12:f58b10070853 201 {
ccli8 12:f58b10070853 202 /* Check argument validity */
ccli8 12:f58b10070853 203 if (!output && len) {
ccli8 12:f58b10070853 204 return -1;
ccli8 12:f58b10070853 205 }
ccli8 12:f58b10070853 206
ccli8 12:f58b10070853 207 unsigned char *output_ind = output;
ccli8 12:f58b10070853 208 size_t rmn = len;
ccli8 12:f58b10070853 209 uint32_t rand_data[PRNG_KEYSIZE / sizeof(uint32_t)];
ccli8 12:f58b10070853 210 while (rmn) {
ccli8 12:f58b10070853 211 crypto_prng_prestart();
ccli8 14:0e7b5aeba173 212 #if TARGET_NUC472 || (MBED_MAJOR_VERSION < 6)
ccli8 12:f58b10070853 213 PRNG_Start();
ccli8 14:0e7b5aeba173 214 #else
ccli8 14:0e7b5aeba173 215 PRNG_Start(CRPT);
ccli8 14:0e7b5aeba173 216 #endif
ccli8 12:f58b10070853 217 crypto_prng_wait();
ccli8 12:f58b10070853 218
ccli8 14:0e7b5aeba173 219 #if TARGET_NUC472 || (MBED_MAJOR_VERSION < 6)
ccli8 12:f58b10070853 220 PRNG_Read(rand_data);
ccli8 14:0e7b5aeba173 221 #else
ccli8 14:0e7b5aeba173 222 PRNG_Read(CRPT, rand_data);
ccli8 14:0e7b5aeba173 223 #endif
ccli8 12:f58b10070853 224
ccli8 12:f58b10070853 225 size_t n = (rmn >= PRNG_KEYSIZE) ? PRNG_KEYSIZE : rmn;
ccli8 12:f58b10070853 226 memcpy(output_ind, rand_data, n);
ccli8 12:f58b10070853 227
ccli8 12:f58b10070853 228 output_ind += n;
ccli8 12:f58b10070853 229 rmn -= n;
ccli8 12:f58b10070853 230 }
ccli8 12:f58b10070853 231
ccli8 12:f58b10070853 232 if (olen) {
ccli8 12:f58b10070853 233 *olen = len;
ccli8 12:f58b10070853 234 }
ccli8 12:f58b10070853 235
ccli8 12:f58b10070853 236 return 0;
ccli8 12:f58b10070853 237 }
ccli8 12:f58b10070853 238
ccli8 12:f58b10070853 239 #else
ccli8 12:f58b10070853 240
ccli8 12:f58b10070853 241 /* Support entropy source with mbedtls NV seed on non-PSA targets without TRNG
ccli8 12:f58b10070853 242 *
ccli8 12:f58b10070853 243 * Follow the steps below to replace TRNG with mbedtls NV seed:
ccli8 12:f58b10070853 244 *
ccli8 12:f58b10070853 245 * 1. Define MBEDTLS_ENTROPY_NV_SEED
ccli8 12:f58b10070853 246 * 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 247 * 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 248 * 4. For development, simulating partial provision process, inject entropy seed via mbedtls_psa_inject_entropy(...) pre-main.
ccli8 12:f58b10070853 249 *
ccli8 12:f58b10070853 250 * Reference configuration in mbed_app.json:
ccli8 12:f58b10070853 251 *
ccli8 12:f58b10070853 252 * For Pelion/mbedtls, don't define MBEDTLS_ENTROPY_NV_SEED because it has defined in:
ccli8 12:f58b10070853 253 * https://github.com/ARMmbed/mbed-cloud-client/blob/master/mbed-client-pal/Configs/mbedTLS/mbedTLSConfig_mbedOS_SW_TRNG.h
ccli8 12:f58b10070853 254 *
ccli8 12:f58b10070853 255 * "target.macros_add": [
ccli8 12:f58b10070853 256 * "MBEDTLS_USER_CONFIG_FILE=\"mbedTLSConfig_mbedOS_SW_TRNG.h\"",
ccli8 12:f58b10070853 257 * "PAL_USE_HW_TRNG=0",
ccli8 12:f58b10070853 258 * "MBEDTLS_PLATFORM_NV_SEED_READ_MACRO=mbedtls_platform_seed_read",
ccli8 12:f58b10070853 259 * "MBEDTLS_PLATFORM_NV_SEED_WRITE_MACRO=mbedtls_platform_seed_write"
ccli8 12:f58b10070853 260 * ],
ccli8 12:f58b10070853 261 *
ccli8 12:f58b10070853 262 * For non-Pelion/mbedtls:
ccli8 12:f58b10070853 263 *
ccli8 12:f58b10070853 264 * "target.macros_add": [
ccli8 12:f58b10070853 265 * "MBEDTLS_ENTROPY_NV_SEED",
ccli8 12:f58b10070853 266 * "MBEDTLS_PLATFORM_NV_SEED_READ_MACRO=mbedtls_platform_seed_read",
ccli8 12:f58b10070853 267 * "MBEDTLS_PLATFORM_NV_SEED_WRITE_MACRO=mbedtls_platform_seed_write"
ccli8 12:f58b10070853 268 * ],
ccli8 12:f58b10070853 269 *
ccli8 12:f58b10070853 270 * For both Pelion/non-Pelion (skip when done in targets.json):
ccli8 12:f58b10070853 271 *
ccli8 12:f58b10070853 272 * "target.device_has_remove": ["TRNG"],
ccli8 12:f58b10070853 273 *
ccli8 12:f58b10070853 274 * WARNING: The injection of mbedtls NV seed pre-main is only for development. Run provision process for mass production.
ccli8 12:f58b10070853 275 */
ccli8 12:f58b10070853 276
ccli8 12:f58b10070853 277 #include "entropy_poll.h"
ccli8 12:f58b10070853 278 #include "psa/crypto.h"
ccli8 12:f58b10070853 279 #include "KVStore.h"
ccli8 12:f58b10070853 280 #include "TDBStore.h"
ccli8 12:f58b10070853 281 #include "KVMap.h"
ccli8 12:f58b10070853 282 #include "kv_config.h"
ccli8 12:f58b10070853 283
ccli8 12:f58b10070853 284 extern "C" {
ccli8 12:f58b10070853 285 psa_status_t mbedtls_psa_inject_entropy(const uint8_t *seed, size_t seed_size);
ccli8 12:f58b10070853 286 int mbedtls_platform_seed_read(unsigned char *buf, size_t buf_len);
ccli8 12:f58b10070853 287 int mbedtls_platform_seed_write(unsigned char *buf, size_t buf_len);
ccli8 12:f58b10070853 288 }
ccli8 12:f58b10070853 289
ccli8 12:f58b10070853 290 /* Requirement of seed size
ccli8 12:f58b10070853 291 *
ccli8 12:f58b10070853 292 * 1. >= MBEDTLS_ENTROPY_MIN_PLATFORM
ccli8 12:f58b10070853 293 * 2. >= MBEDTLS_ENTROPY_BLOCK_SIZE
ccli8 12:f58b10070853 294 * 3. <= MBEDTLS_ENTROPY_MAX_SEED_SIZE
ccli8 12:f58b10070853 295 */
ccli8 12:f58b10070853 296 #define SEED_SIZE 64
ccli8 12:f58b10070853 297 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 298 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 299 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 300
ccli8 12:f58b10070853 301 /* Seed key name in kvstore */
ccli8 12:f58b10070853 302 #define KV_KEY_SEED "seed"
ccli8 12:f58b10070853 303
ccli8 12:f58b10070853 304 /* Inject an initial entropy seed for the random generator into secure storage
ccli8 12:f58b10070853 305 *
ccli8 12:f58b10070853 306 * See reference below for its prototype:
ccli8 12:f58b10070853 307 * https://github.com/ARMmbed/mbed-os/blob/master/features/mbedtls/mbed-crypto/inc/psa/crypto_extra.h
ccli8 12:f58b10070853 308 */
ccli8 12:f58b10070853 309 psa_status_t mbedtls_psa_inject_entropy(const uint8_t *seed, size_t seed_size)
ccli8 12:f58b10070853 310 {
ccli8 12:f58b10070853 311 /* Check seed size requirement */
ccli8 12:f58b10070853 312 if ((( seed_size < MBEDTLS_ENTROPY_MIN_PLATFORM) || (seed_size < MBEDTLS_ENTROPY_BLOCK_SIZE)) ||
ccli8 12:f58b10070853 313 (seed_size > MBEDTLS_ENTROPY_MAX_SEED_SIZE)) {
ccli8 12:f58b10070853 314 return PSA_ERROR_INVALID_ARGUMENT;
ccli8 12:f58b10070853 315 }
ccli8 12:f58b10070853 316
ccli8 12:f58b10070853 317 /* Get kvstore internal storage where seed is injected */
ccli8 12:f58b10070853 318 KVMap &kv_map = KVMap::get_instance();
ccli8 12:f58b10070853 319 KVStore *inner_store = kv_map.get_internal_kv_instance(NULL);
ccli8 12:f58b10070853 320 if (inner_store == NULL) {
ccli8 12:f58b10070853 321 return PSA_ERROR_STORAGE_FAILURE;
ccli8 12:f58b10070853 322 }
ccli8 12:f58b10070853 323
ccli8 12:f58b10070853 324 /* Check if seed has injected */
ccli8 12:f58b10070853 325 KVStore::info_t kv_info;
ccli8 12:f58b10070853 326 int kv_status = inner_store->get_info(KV_KEY_SEED, &kv_info);
ccli8 12:f58b10070853 327 if (kv_status == MBED_SUCCESS) {
ccli8 12:f58b10070853 328 return PSA_ERROR_NOT_PERMITTED;
ccli8 12:f58b10070853 329 } else if (kv_status == MBED_ERROR_ITEM_NOT_FOUND) {
ccli8 12:f58b10070853 330 /* No seed injected, inject it below */
ccli8 12:f58b10070853 331 } else {
ccli8 12:f58b10070853 332 return PSA_ERROR_STORAGE_FAILURE;
ccli8 12:f58b10070853 333 }
ccli8 12:f58b10070853 334
ccli8 12:f58b10070853 335 /* Inject seed into kvstore internal storage */
ccli8 12:f58b10070853 336 kv_status = inner_store->set(KV_KEY_SEED, seed, seed_size, 0);
ccli8 12:f58b10070853 337 if (kv_status == MBED_SUCCESS) {
ccli8 12:f58b10070853 338 return PSA_SUCCESS;
ccli8 12:f58b10070853 339 } else {
ccli8 12:f58b10070853 340 return PSA_ERROR_STORAGE_FAILURE;
ccli8 12:f58b10070853 341 }
ccli8 12:f58b10070853 342 }
ccli8 12:f58b10070853 343
ccli8 12:f58b10070853 344 int mbedtls_platform_seed_read(unsigned char *buf, size_t buf_len)
ccli8 12:f58b10070853 345 {
ccli8 12:f58b10070853 346 /* Get kvstore internal storage where seed is injected */
ccli8 12:f58b10070853 347 KVMap &kv_map = KVMap::get_instance();
ccli8 12:f58b10070853 348 KVStore *inner_store = kv_map.get_internal_kv_instance(NULL);
ccli8 12:f58b10070853 349 if (inner_store == NULL) {
ccli8 12:f58b10070853 350 return -1;
ccli8 12:f58b10070853 351 }
ccli8 12:f58b10070853 352
ccli8 12:f58b10070853 353 /* Read seed from kvstore internal storage */
ccli8 12:f58b10070853 354 size_t actual_size = 0;
ccli8 12:f58b10070853 355 int kv_status = inner_store->get(KV_KEY_SEED, buf, buf_len, &actual_size, 0);
ccli8 12:f58b10070853 356 if (kv_status != MBED_SUCCESS || actual_size != buf_len) {
ccli8 12:f58b10070853 357 return -1;
ccli8 12:f58b10070853 358 } else {
ccli8 12:f58b10070853 359 return buf_len;
ccli8 12:f58b10070853 360 }
ccli8 12:f58b10070853 361 }
ccli8 12:f58b10070853 362
ccli8 12:f58b10070853 363 int mbedtls_platform_seed_write(unsigned char *buf, size_t buf_len)
ccli8 12:f58b10070853 364 {
ccli8 12:f58b10070853 365 /* Get kvstore internal storage where seed is injected */
ccli8 12:f58b10070853 366 KVMap &kv_map = KVMap::get_instance();
ccli8 12:f58b10070853 367 KVStore *inner_store = kv_map.get_internal_kv_instance(NULL);
ccli8 12:f58b10070853 368 if (inner_store == NULL) {
ccli8 12:f58b10070853 369 return -1;
ccli8 12:f58b10070853 370 }
ccli8 12:f58b10070853 371
ccli8 12:f58b10070853 372 /* Write seed into kvstore internal storage */
ccli8 12:f58b10070853 373 int kv_status = inner_store->set(KV_KEY_SEED, buf, buf_len, 0);
ccli8 12:f58b10070853 374 if (kv_status != MBED_SUCCESS) {
ccli8 12:f58b10070853 375 return -1;
ccli8 12:f58b10070853 376 } else {
ccli8 12:f58b10070853 377 return buf_len;
ccli8 12:f58b10070853 378 }
ccli8 12:f58b10070853 379 }
ccli8 12:f58b10070853 380
ccli8 12:f58b10070853 381 #endif /* #if defined(MBEDTLS_ENTROPY_HARDWARE_ALT) */
ccli8 12:f58b10070853 382
ccli8 12:f58b10070853 383 #endif /* !DEVICE_TRNG && !TARGET_PSA */