1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2023, Arm Limited. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu * 6*91f16700Schasinglulu */ 7*91f16700Schasinglulu 8*91f16700Schasinglulu #include <psa/client.h> 9*91f16700Schasinglulu #include <psa_manifest/sid.h> 10*91f16700Schasinglulu #include <rss_crypto_defs.h> 11*91f16700Schasinglulu #include <rss_platform_api.h> 12*91f16700Schasinglulu 13*91f16700Schasinglulu psa_status_t 14*91f16700Schasinglulu rss_platform_nv_counter_increment(uint32_t counter_id) 15*91f16700Schasinglulu { 16*91f16700Schasinglulu struct psa_invec in_vec[1]; 17*91f16700Schasinglulu 18*91f16700Schasinglulu in_vec[0].base = &counter_id; 19*91f16700Schasinglulu in_vec[0].len = sizeof(counter_id); 20*91f16700Schasinglulu 21*91f16700Schasinglulu return psa_call(RSS_PLATFORM_SERVICE_HANDLE, 22*91f16700Schasinglulu RSS_PLATFORM_API_ID_NV_INCREMENT, 23*91f16700Schasinglulu in_vec, 1, NULL, 0); 24*91f16700Schasinglulu } 25*91f16700Schasinglulu 26*91f16700Schasinglulu psa_status_t 27*91f16700Schasinglulu rss_platform_nv_counter_read(uint32_t counter_id, 28*91f16700Schasinglulu uint32_t size, uint8_t *val) 29*91f16700Schasinglulu { 30*91f16700Schasinglulu struct psa_invec in_vec[1]; 31*91f16700Schasinglulu struct psa_outvec out_vec[1]; 32*91f16700Schasinglulu 33*91f16700Schasinglulu in_vec[0].base = &counter_id; 34*91f16700Schasinglulu in_vec[0].len = sizeof(counter_id); 35*91f16700Schasinglulu 36*91f16700Schasinglulu out_vec[0].base = val; 37*91f16700Schasinglulu out_vec[0].len = size; 38*91f16700Schasinglulu 39*91f16700Schasinglulu return psa_call(RSS_PLATFORM_SERVICE_HANDLE, 40*91f16700Schasinglulu RSS_PLATFORM_API_ID_NV_READ, 41*91f16700Schasinglulu in_vec, 1, out_vec, 1); 42*91f16700Schasinglulu } 43*91f16700Schasinglulu 44*91f16700Schasinglulu psa_status_t 45*91f16700Schasinglulu rss_platform_key_read(enum rss_key_id_builtin_t key, uint8_t *data, 46*91f16700Schasinglulu size_t data_size, size_t *data_length) 47*91f16700Schasinglulu { 48*91f16700Schasinglulu psa_status_t status; 49*91f16700Schasinglulu 50*91f16700Schasinglulu struct rss_crypto_pack_iovec iov = { 51*91f16700Schasinglulu .function_id = RSS_CRYPTO_EXPORT_PUBLIC_KEY_SID, 52*91f16700Schasinglulu .key_id = key, 53*91f16700Schasinglulu }; 54*91f16700Schasinglulu 55*91f16700Schasinglulu psa_invec in_vec[] = { 56*91f16700Schasinglulu {.base = &iov, .len = sizeof(struct rss_crypto_pack_iovec)}, 57*91f16700Schasinglulu }; 58*91f16700Schasinglulu psa_outvec out_vec[] = { 59*91f16700Schasinglulu {.base = data, .len = data_size} 60*91f16700Schasinglulu }; 61*91f16700Schasinglulu 62*91f16700Schasinglulu status = psa_call(RSS_CRYPTO_HANDLE, PSA_IPC_CALL, 63*91f16700Schasinglulu in_vec, IOVEC_LEN(in_vec), 64*91f16700Schasinglulu out_vec, IOVEC_LEN(out_vec)); 65*91f16700Schasinglulu 66*91f16700Schasinglulu *data_length = out_vec[0].len; 67*91f16700Schasinglulu 68*91f16700Schasinglulu return status; 69*91f16700Schasinglulu } 70