1 /*
2 * Copyright (c) 2023, The TrustedFirmware-M Contributors. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7 #include <assert.h>
8 #include "cc3xx_drbg.h"
9 #include "cc3xx_config.h"
10
cc3xx_lowlevel_drbg_init(cc3xx_drbg_id_t id,struct cc3xx_drbg_state_t * state,const uint8_t * entropy,size_t entropy_len,const uint8_t * nonce,size_t nonce_len,const uint8_t * personalization,size_t personalization_len)11 cc3xx_err_t cc3xx_lowlevel_drbg_init(
12 cc3xx_drbg_id_t id,
13 struct cc3xx_drbg_state_t *state,
14 const uint8_t *entropy, size_t entropy_len,
15 const uint8_t *nonce, size_t nonce_len,
16 const uint8_t *personalization, size_t personalization_len)
17 {
18 assert(id < CC3XX_DRBG_MAX);
19
20 state->id = id;
21
22 switch (id) {
23 #ifdef CC3XX_CONFIG_DRBG_CTR_ENABLE
24 case CC3XX_DRBG_CTR:
25 return cc3xx_lowlevel_drbg_ctr_init(
26 &state->ctr,
27 entropy, entropy_len,
28 nonce, nonce_len,
29 personalization, personalization_len);
30 #endif /* CC3XX_CONFIG_DRBG_CTR_ENABLE */
31 #ifdef CC3XX_CONFIG_DRBG_HMAC_ENABLE
32 case CC3XX_DRBG_HMAC:
33 return cc3xx_lowlevel_drbg_hmac_instantiate(
34 &state->hmac,
35 entropy, entropy_len,
36 nonce, nonce_len,
37 personalization, personalization_len);
38 #endif /* CC3XX_CONFIG_DRBG_HMAC_ENABLE */
39 #ifdef CC3XX_CONFIG_DRBG_HASH_ENABLE
40 case CC3XX_DRBG_HASH:
41 return cc3xx_lowlevel_drbg_hash_init(
42 &state->hash,
43 entropy, entropy_len,
44 nonce, nonce_len,
45 personalization, personalization_len);
46 #endif /* CC3XX_CONFIG_DRBG_HASH_ENABLE */
47 default:
48 return CC3XX_ERR_DRBG_INVALID_ID;
49 }
50 }
51
cc3xx_lowlevel_drbg_generate(struct cc3xx_drbg_state_t * state,size_t len_bits,uint8_t * returned_bits,const uint8_t * additional_input,size_t additional_input_len)52 cc3xx_err_t cc3xx_lowlevel_drbg_generate(
53 struct cc3xx_drbg_state_t *state,
54 size_t len_bits, uint8_t *returned_bits,
55 const uint8_t *additional_input, size_t additional_input_len)
56 {
57 switch (state->id) {
58 #ifdef CC3XX_CONFIG_DRBG_CTR_ENABLE
59 case CC3XX_DRBG_CTR:
60 return cc3xx_lowlevel_drbg_ctr_generate(
61 &state->ctr, len_bits, returned_bits, additional_input, additional_input_len);
62 #endif /* CC3XX_CONFIG_DRBG_CTR_ENABLE */
63 #ifdef CC3XX_CONFIG_DRBG_HMAC_ENABLE
64 case CC3XX_DRBG_HMAC:
65 return cc3xx_lowlevel_drbg_hmac_generate(
66 &state->hmac, len_bits, returned_bits, additional_input, additional_input_len);
67 #endif /* CC3XX_CONFIG_DRBG_HMAC_ENABLE */
68 #ifdef CC3XX_CONFIG_DRBG_HASH_ENABLE
69 case CC3XX_DRBG_HASH:
70 return cc3xx_lowlevel_drbg_hash_generate(
71 &state->hash, len_bits, returned_bits, additional_input, additional_input_len);
72 #endif /* CC3XX_CONFIG_DRBG_HASH_ENABLE */
73 default:
74 return CC3XX_ERR_DRBG_INVALID_ID;
75 }
76 }
77
cc3xx_lowlevel_drbg_reseed(struct cc3xx_drbg_state_t * state,const uint8_t * entropy,size_t entropy_len,const uint8_t * additional_input,size_t additional_input_len)78 cc3xx_err_t cc3xx_lowlevel_drbg_reseed(
79 struct cc3xx_drbg_state_t *state,
80 const uint8_t *entropy, size_t entropy_len,
81 const uint8_t *additional_input, size_t additional_input_len)
82 {
83 switch (state->id) {
84 #ifdef CC3XX_CONFIG_DRBG_CTR_ENABLE
85 case CC3XX_DRBG_CTR:
86 return cc3xx_lowlevel_drbg_ctr_reseed(
87 &state->ctr, entropy, entropy_len, additional_input, additional_input_len);
88 #endif /* CC3XX_CONFIG_DRBG_CTR_ENABLE */
89 #ifdef CC3XX_CONFIG_DRBG_HMAC_ENABLE
90 case CC3XX_DRBG_HMAC:
91 return cc3xx_lowlevel_drbg_hmac_reseed(
92 &state->hmac, entropy, entropy_len, additional_input, additional_input_len);
93 #endif /* CC3XX_CONFIG_DRBG_HMAC_ENABLE */
94 #ifdef CC3XX_CONFIG_DRBG_HASH_ENABLE
95 case CC3XX_DRBG_HASH:
96 return cc3xx_lowlevel_drbg_hash_reseed(
97 &state->hash, entropy, entropy_len, additional_input, additional_input_len);
98 #endif /* CC3XX_CONFIG_DRBG_HASH_ENABLE */
99 default:
100 return CC3XX_ERR_DRBG_INVALID_ID;
101 }
102 }
103
cc3xx_lowlevel_drbg_uninit(struct cc3xx_drbg_state_t * state)104 cc3xx_err_t cc3xx_lowlevel_drbg_uninit(struct cc3xx_drbg_state_t *state)
105 {
106 switch (state->id) {
107 #ifdef CC3XX_CONFIG_DRBG_CTR_ENABLE
108 case CC3XX_DRBG_CTR:
109 return cc3xx_lowlevel_drbg_ctr_uninit(&state->ctr);
110 #endif /* CC3XX_CONFIG_DRBG_CTR_ENABLE */
111 #ifdef CC3XX_CONFIG_DRBG_HMAC_ENABLE
112 case CC3XX_DRBG_HMAC:
113 return cc3xx_lowlevel_drbg_hmac_uninit(&state->hmac);
114 #endif /* CC3XX_CONFIG_DRBG_HMAC_ENABLE */
115 #ifdef CC3XX_CONFIG_DRBG_HASH_ENABLE
116 case CC3XX_DRBG_HASH:
117 return cc3xx_lowlevel_drbg_hash_uninit(&state->hash);
118 #endif /* CC3XX_CONFIG_DRBG_HASH_ENABLE */
119 default:
120 return CC3XX_ERR_DRBG_INVALID_ID;
121 }
122 }
123