blob: 6e907ce834093662cbd2af1dca1688b194deb066 [file] [log] [blame]
Marton Berke6fd21f12019-07-02 13:43:07 +02001/*
Mingyang Sunc9bdcd72020-06-04 11:44:49 +08002 * Copyright (c) 2017-2020 Arm Limited. All rights reserved.
Marton Berke6fd21f12019-07-02 13:43:07 +02003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Marton Berke6fd21f12019-07-02 13:43:07 +020017#include <stddef.h>
David Hu6d2bc652020-03-25 15:48:53 +080018#include <string.h>
19
Raef Coles4d6ea2f2019-10-15 14:30:40 +010020#include "psa/crypto_types.h"
David Hu6d2bc652020-03-25 15:48:53 +080021#include "tfm_plat_crypto_keys.h"
Marton Berke6fd21f12019-07-02 13:43:07 +020022
23/* FIXME: Functions in this file should be implemented by platform vendor. For
24 * the security of the storage system, it is critical to use a hardware unique
25 * key. For the security of the attestation, it is critical to use a unique key
26 * pair and keep the private key is secret.
27 */
28
29#define TFM_KEY_LEN_BYTES 16
30
31static const uint8_t sample_tfm_key[TFM_KEY_LEN_BYTES] =
32 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, \
33 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F};
34
David Hu10eddf62020-01-17 15:12:13 +080035#ifdef SYMMETRIC_INITIAL_ATTESTATION
36extern const psa_algorithm_t tfm_attest_hmac_sign_alg;
37extern const uint8_t initial_attestation_hmac_sha256_key[];
38extern const size_t initial_attestation_hmac_sha256_key_size;
David Hu6d2bc652020-03-25 15:48:53 +080039extern const char *initial_attestation_kid;
David Hu10eddf62020-01-17 15:12:13 +080040#else /* SYMMETRIC_INITIAL_ATTESTATION */
Summer Qin0e5b2e02020-10-22 11:23:39 +080041extern const psa_ecc_family_t initial_attestation_curve_type;
Marton Berke6fd21f12019-07-02 13:43:07 +020042extern const uint8_t initial_attestation_private_key[];
43extern const uint32_t initial_attestation_private_key_size;
David Hu10eddf62020-01-17 15:12:13 +080044#endif /* SYMMETRIC_INITIAL_ATTESTATION */
Marton Berke6fd21f12019-07-02 13:43:07 +020045
Marton Berke6fd21f12019-07-02 13:43:07 +020046/**
47 * \brief Copy the key to the destination buffer
48 *
49 * \param[out] p_dst Pointer to buffer where to store the key
50 * \param[in] p_src Pointer to the key
51 * \param[in] size Length of the key
52 */
53static inline void copy_key(uint8_t *p_dst, const uint8_t *p_src, size_t size)
54{
55 uint32_t i;
56
57 for (i = size; i > 0; i--) {
58 *p_dst = *p_src;
59 p_src++;
60 p_dst++;
61 }
62}
63
Jamie Fox104f7502019-09-25 18:56:48 +010064enum tfm_plat_err_t tfm_plat_get_huk_derived_key(const uint8_t *label,
65 size_t label_size,
66 const uint8_t *context,
67 size_t context_size,
68 uint8_t *key,
69 size_t key_size)
70{
71 (void)label;
72 (void)label_size;
73 (void)context;
74 (void)context_size;
75
76 if (key_size > TFM_KEY_LEN_BYTES) {
77 return TFM_PLAT_ERR_SYSTEM_ERR;
78 }
79
80 /* FIXME: Do key derivation */
81 copy_key(key, sample_tfm_key, key_size);
82
83 return TFM_PLAT_ERR_SUCCESS;
84}
85
David Hu10eddf62020-01-17 15:12:13 +080086#ifdef SYMMETRIC_INITIAL_ATTESTATION
87enum tfm_plat_err_t tfm_plat_get_symmetric_iak(uint8_t *key_buf,
88 size_t buf_len,
89 size_t *key_len,
90 psa_algorithm_t *key_alg)
91{
92 if (!key_buf || !key_len || !key_alg) {
93 return TFM_PLAT_ERR_INVALID_INPUT;
94 }
95
96 if (buf_len < initial_attestation_hmac_sha256_key_size) {
97 return TFM_PLAT_ERR_INVALID_INPUT;
98 }
99
100 /*
101 * Actual implementation may derive a key with other input, other than
102 * directly providing provisioned symmetric initial attestation key.
103 */
104 copy_key(key_buf, initial_attestation_hmac_sha256_key,
105 initial_attestation_hmac_sha256_key_size);
106
107 *key_alg = tfm_attest_hmac_sign_alg;
108 *key_len = initial_attestation_hmac_sha256_key_size;
109
110 return TFM_PLAT_ERR_SUCCESS;
111}
David Hu6d2bc652020-03-25 15:48:53 +0800112
113enum tfm_plat_err_t tfm_plat_get_symmetric_iak_id(void *kid_buf,
114 size_t buf_len,
115 size_t *kid_len)
116{
117 /* kid is string in this example. '\0' is ignore. */
118 size_t len = strlen(initial_attestation_kid);
119
120 if (!kid_buf || !kid_len || (buf_len < len)) {
121 return TFM_PLAT_ERR_INVALID_INPUT;
122 }
123
124 copy_key(kid_buf, (const uint8_t *)initial_attestation_kid, len);
125 *kid_len = len;
126
127 return TFM_PLAT_ERR_SUCCESS;
128}
David Hu10eddf62020-01-17 15:12:13 +0800129#else /* SYMMETRIC_INITIAL_ATTESTATION */
Marton Berke6fd21f12019-07-02 13:43:07 +0200130enum tfm_plat_err_t
131tfm_plat_get_initial_attest_key(uint8_t *key_buf,
132 uint32_t size,
133 struct ecc_key_t *ecc_key,
Summer Qin0e5b2e02020-10-22 11:23:39 +0800134 psa_ecc_family_t *curve_type)
Marton Berke6fd21f12019-07-02 13:43:07 +0200135{
136 uint8_t *key_dst;
137 const uint8_t *key_src;
138 uint32_t key_size;
Raef Colesf51cb2d2019-10-15 14:27:53 +0100139 uint32_t full_key_size = initial_attestation_private_key_size;
Marton Berke6fd21f12019-07-02 13:43:07 +0200140
141 if (size < full_key_size) {
142 return TFM_PLAT_ERR_SYSTEM_ERR;
143 }
144
145 /* Set the EC curve type which the key belongs to */
146 *curve_type = initial_attestation_curve_type;
147
148 /* Copy the private key to the buffer, it MUST be present */
149 key_dst = key_buf;
150 key_src = initial_attestation_private_key;
151 key_size = initial_attestation_private_key_size;
152 copy_key(key_dst, key_src, key_size);
153 ecc_key->priv_key = key_dst;
154 ecc_key->priv_key_size = key_size;
155
Raef Colesf51cb2d2019-10-15 14:27:53 +0100156 ecc_key->pubx_key = NULL;
157 ecc_key->pubx_key_size = 0;
158 ecc_key->puby_key = NULL;
159 ecc_key->puby_key_size = 0;
Marton Berke6fd21f12019-07-02 13:43:07 +0200160
161 return TFM_PLAT_ERR_SUCCESS;
162}
David Hu10eddf62020-01-17 15:12:13 +0800163#endif /* SYMMETRIC_INITIAL_ATTESTATION */