1 /* 2 * Copyright (c) 2023, Arm Limited. All rights reserved. 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 * 6 */ 7 8 #include <psa/client.h> 9 #include <psa_manifest/sid.h> 10 #if CRYPTO_SUPPORT 11 #include <rse_crypto_defs.h> 12 #endif 13 #include <rse_platform_api.h> 14 15 psa_status_t 16 rse_platform_nv_counter_increment(uint32_t counter_id) 17 { 18 struct psa_invec in_vec[1]; 19 20 in_vec[0].base = &counter_id; 21 in_vec[0].len = sizeof(counter_id); 22 23 return psa_call(RSE_PLATFORM_SERVICE_HANDLE, 24 RSE_PLATFORM_API_ID_NV_INCREMENT, 25 in_vec, 1, NULL, 0); 26 } 27 28 psa_status_t 29 rse_platform_nv_counter_read(uint32_t counter_id, 30 uint32_t size, uint8_t *val) 31 { 32 struct psa_invec in_vec[1]; 33 struct psa_outvec out_vec[1]; 34 35 in_vec[0].base = &counter_id; 36 in_vec[0].len = sizeof(counter_id); 37 38 out_vec[0].base = val; 39 out_vec[0].len = size; 40 41 return psa_call(RSE_PLATFORM_SERVICE_HANDLE, 42 RSE_PLATFORM_API_ID_NV_READ, 43 in_vec, 1, out_vec, 1); 44 } 45 46 #if CRYPTO_SUPPORT 47 psa_status_t 48 rse_platform_key_read(enum rse_key_id_builtin_t key, uint8_t *data, 49 size_t data_size, size_t *data_length) 50 { 51 psa_status_t status; 52 53 struct rse_crypto_pack_iovec iov = { 54 .function_id = RSE_CRYPTO_EXPORT_PUBLIC_KEY_SID, 55 .key_id = key, 56 }; 57 58 psa_invec in_vec[] = { 59 {.base = &iov, .len = sizeof(struct rse_crypto_pack_iovec)}, 60 }; 61 psa_outvec out_vec[] = { 62 {.base = data, .len = data_size} 63 }; 64 65 status = psa_call(RSE_CRYPTO_HANDLE, PSA_IPC_CALL, 66 in_vec, IOVEC_LEN(in_vec), 67 out_vec, IOVEC_LEN(out_vec)); 68 69 *data_length = out_vec[0].len; 70 71 return status; 72 } 73 74 psa_status_t 75 rse_platform_get_entropy(uint8_t *data, size_t data_size) 76 { 77 psa_status_t status; 78 79 struct rse_crypto_pack_iovec iov = { 80 .function_id = RSE_CRYPTO_GENERATE_RANDOM_SID, 81 }; 82 83 psa_invec in_vec[] = { 84 {.base = &iov, .len = sizeof(struct rse_crypto_pack_iovec)}, 85 }; 86 psa_outvec out_vec[] = { 87 {.base = data, .len = data_size} 88 }; 89 90 status = psa_call(RSE_CRYPTO_HANDLE, PSA_IPC_CALL, 91 in_vec, IOVEC_LEN(in_vec), 92 out_vec, IOVEC_LEN(out_vec)); 93 94 return status; 95 } 96 #endif 97