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