1 /*
2  * Copyright (c) 2021-2022, Arm Limited. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 #include "tfm_plat_crypto_nv_seed.h"
9 #include "tfm_plat_otp.h"
10 #include "psa/internal_trusted_storage.h"
11 #include "config_tfm.h"
12 
13 #define NV_SEED_SIZE 64
14 #if NV_SEED_SIZE > ITS_MAX_ASSET_SIZE
15 #error "ITS_MAX_ASSET_SIZE is too small to store the entropy seed"
16 #endif
17 
tfm_plat_crypto_provision_entropy_seed(void)18 int tfm_plat_crypto_provision_entropy_seed(void)
19 {
20     enum tfm_plat_err_t plat_err;
21     int err;
22     uint8_t buf[NV_SEED_SIZE];
23 
24     /* If the seed is already provisioned, then return successfully */
25     err = tfm_plat_crypto_nv_seed_read(buf, sizeof(buf));
26     if (err == TFM_CRYPTO_NV_SEED_SUCCESS) {
27         return err;
28     }
29 
30     plat_err = tfm_plat_otp_read(PLAT_OTP_ID_ENTROPY_SEED, sizeof(buf), buf);
31     if(plat_err != TFM_PLAT_ERR_SUCCESS) {
32         return TFM_CRYPTO_NV_SEED_FAILED;
33     }
34 
35     err = tfm_plat_crypto_nv_seed_write(buf, sizeof(buf));
36     if (err != TFM_CRYPTO_NV_SEED_SUCCESS) {
37         return err;
38     }
39 
40     return TFM_CRYPTO_NV_SEED_SUCCESS;
41 }
42 
tfm_plat_crypto_nv_seed_read(unsigned char * buf,size_t buf_len)43 int tfm_plat_crypto_nv_seed_read(unsigned char *buf, size_t buf_len)
44 {
45     psa_storage_uid_t uid = NV_SEED_FILE_ID;
46     psa_status_t status;
47     size_t data_length = 0;
48 
49     status = psa_its_get(uid, 0, buf_len, buf, &data_length);
50 
51     if (status == PSA_SUCCESS && data_length == buf_len) {
52         return TFM_CRYPTO_NV_SEED_SUCCESS;
53     } else {
54         return TFM_CRYPTO_NV_SEED_FAILED;
55     }
56 }
57 
tfm_plat_crypto_nv_seed_write(const unsigned char * buf,size_t buf_len)58 int tfm_plat_crypto_nv_seed_write(const unsigned char *buf, size_t buf_len)
59 {
60     psa_storage_uid_t uid = NV_SEED_FILE_ID;
61     psa_status_t status;
62 
63     status = psa_its_set(uid, buf_len, buf, 0);
64 
65     if (status == PSA_SUCCESS) {
66         return TFM_CRYPTO_NV_SEED_SUCCESS;
67     } else {
68         return TFM_CRYPTO_NV_SEED_FAILED;
69     }
70 }
71