1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2022-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 <delegated_attestation.h> 9*91f16700Schasinglulu #include <psa/client.h> 10*91f16700Schasinglulu #include <psa_manifest/sid.h> 11*91f16700Schasinglulu 12*91f16700Schasinglulu psa_status_t 13*91f16700Schasinglulu rss_delegated_attest_get_delegated_key(uint8_t ecc_curve, 14*91f16700Schasinglulu uint32_t key_bits, 15*91f16700Schasinglulu uint8_t *key_buf, 16*91f16700Schasinglulu size_t key_buf_size, 17*91f16700Schasinglulu size_t *key_size, 18*91f16700Schasinglulu uint32_t hash_algo) 19*91f16700Schasinglulu { 20*91f16700Schasinglulu psa_status_t status; 21*91f16700Schasinglulu psa_invec in_vec[] = { 22*91f16700Schasinglulu {&ecc_curve, sizeof(ecc_curve)}, 23*91f16700Schasinglulu {&key_bits, sizeof(key_bits)}, 24*91f16700Schasinglulu {&hash_algo, sizeof(hash_algo)} 25*91f16700Schasinglulu }; 26*91f16700Schasinglulu psa_outvec out_vec[] = { 27*91f16700Schasinglulu {key_buf, key_buf_size} 28*91f16700Schasinglulu }; 29*91f16700Schasinglulu 30*91f16700Schasinglulu if (key_size == NULL) { 31*91f16700Schasinglulu return PSA_ERROR_INVALID_ARGUMENT; 32*91f16700Schasinglulu } 33*91f16700Schasinglulu 34*91f16700Schasinglulu status = psa_call(RSS_DELEGATED_SERVICE_HANDLE, 35*91f16700Schasinglulu RSS_DELEGATED_ATTEST_GET_DELEGATED_KEY, 36*91f16700Schasinglulu in_vec, IOVEC_LEN(in_vec), 37*91f16700Schasinglulu out_vec, IOVEC_LEN(out_vec)); 38*91f16700Schasinglulu if (status == PSA_SUCCESS) { 39*91f16700Schasinglulu *key_size = out_vec[0].len; 40*91f16700Schasinglulu } 41*91f16700Schasinglulu 42*91f16700Schasinglulu return status; 43*91f16700Schasinglulu } 44*91f16700Schasinglulu 45*91f16700Schasinglulu psa_status_t 46*91f16700Schasinglulu rss_delegated_attest_get_token(const uint8_t *dak_pub_hash, 47*91f16700Schasinglulu size_t dak_pub_hash_size, 48*91f16700Schasinglulu uint8_t *token_buf, 49*91f16700Schasinglulu size_t token_buf_size, 50*91f16700Schasinglulu size_t *token_size) 51*91f16700Schasinglulu { 52*91f16700Schasinglulu psa_status_t status; 53*91f16700Schasinglulu psa_invec in_vec[] = { 54*91f16700Schasinglulu {dak_pub_hash, dak_pub_hash_size} 55*91f16700Schasinglulu }; 56*91f16700Schasinglulu psa_outvec out_vec[] = { 57*91f16700Schasinglulu {token_buf, token_buf_size} 58*91f16700Schasinglulu }; 59*91f16700Schasinglulu 60*91f16700Schasinglulu if (token_size == NULL) { 61*91f16700Schasinglulu return PSA_ERROR_INVALID_ARGUMENT; 62*91f16700Schasinglulu } 63*91f16700Schasinglulu 64*91f16700Schasinglulu status = psa_call(RSS_DELEGATED_SERVICE_HANDLE, 65*91f16700Schasinglulu RSS_DELEGATED_ATTEST_GET_PLATFORM_TOKEN, 66*91f16700Schasinglulu in_vec, IOVEC_LEN(in_vec), 67*91f16700Schasinglulu out_vec, IOVEC_LEN(out_vec)); 68*91f16700Schasinglulu if (status == PSA_SUCCESS) { 69*91f16700Schasinglulu *token_size = out_vec[0].len; 70*91f16700Schasinglulu } 71*91f16700Schasinglulu 72*91f16700Schasinglulu return status; 73*91f16700Schasinglulu } 74