1 /*
2 * Copyright (c) 2020 - 2024 Renesas Electronics Corporation and/or its affiliates
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6 
7 /***********************************************************************************************************************
8  * Includes
9  ***********************************************************************************************************************/
10 
11 #include "bsp_api.h"
12 #include "hw_sce_aes_private.h"
13 #include "hw_sce_ra_private.h"
14 
15 /***********************************************************************************************************************
16  * Global variables and functions
17  ***********************************************************************************************************************/
18 
HW_SCE_AES_128CtrEncrypt(const uint32_t * InData_Key,const uint32_t * InData_IV,const uint32_t num_words,const uint32_t * InData_Text,uint32_t * OutData_Text,uint32_t * OutData_IV)19 fsp_err_t HW_SCE_AES_128CtrEncrypt (const uint32_t * InData_Key,
20                                     const uint32_t * InData_IV,
21                                     const uint32_t   num_words,
22                                     const uint32_t * InData_Text,
23                                     uint32_t       * OutData_Text,
24                                     uint32_t       * OutData_IV)
25 {
26     fsp_err_t iret = FSP_SUCCESS;
27     FSP_PARAMETER_NOT_USED(OutData_IV);
28 #if RM_TINYCRYPT_PORT_CFG_PARAM_CHECKING_ENABLE
29     if ((InData_Key == (const uint32_t *) 0) ||
30         ((InData_IV == (const uint32_t *) 0) || (InData_Text == (const uint32_t *) 0)) ||
31         (OutData_Text == (const uint32_t *) 0) || (num_words == 0))
32     {
33         iret = FSP_ERR_INVALID_ARGUMENT;
34     }
35 #endif
36 
37     R_AES_B->AESCNTL = R_AES_AESCNTL_CTR_128_ENC;
38     hw_aes_set_key((uint8_t *) InData_Key, SIZE_AES_128BIT_KEYLEN_BYTES);
39 
40     if (FSP_SUCCESS == iret)
41     {
42         hw_aes_set_iv((uint8_t *) InData_IV);
43         R_AES_B->AESDCNTL = R_AES_AESDCNTL_BIT_2_3_MODE_2;
44         hw_aes_start((uint8_t *) InData_Text, (uint8_t *) OutData_Text, num_words);
45     }
46 
47     return iret;
48 }
49 
HW_SCE_AES_192CtrEncrypt(const uint32_t * InData_Key,const uint32_t * InData_IV,const uint32_t num_words,const uint32_t * InData_Text,uint32_t * OutData_Text,uint32_t * OutData_IV)50 fsp_err_t HW_SCE_AES_192CtrEncrypt (const uint32_t * InData_Key,
51                                     const uint32_t * InData_IV,
52                                     const uint32_t   num_words,
53                                     const uint32_t * InData_Text,
54                                     uint32_t       * OutData_Text,
55                                     uint32_t       * OutData_IV)
56 {
57     fsp_err_t iret = FSP_SUCCESS;
58     FSP_PARAMETER_NOT_USED(OutData_IV);
59 #if RM_TINYCRYPT_PORT_CFG_PARAM_CHECKING_ENABLE
60     if ((InData_Key == (const uint32_t *) 0) ||
61         ((InData_IV == (const uint32_t *) 0) || (InData_Text == (const uint32_t *) 0)) ||
62         (OutData_Text == (const uint32_t *) 0) || (num_words == 0))
63     {
64         iret = FSP_ERR_INVALID_ARGUMENT;
65     }
66 #endif
67 
68     R_AES_B->AESCNTL = R_AES_AESCNTL_CTR_192_ENC;
69     hw_aes_set_key((uint8_t *) InData_Key, SIZE_AES_192BIT_KEYLEN_BYTES);
70 
71     if (FSP_SUCCESS == iret)
72     {
73         hw_aes_set_iv((uint8_t *) InData_IV);
74         R_AES_B->AESDCNTL = R_AES_AESDCNTL_BIT_2_3_MODE_2;
75         hw_aes_start((uint8_t *) InData_Text, (uint8_t *) OutData_Text, num_words);
76     }
77 
78     return iret;
79 }
80 
HW_SCE_AES_256CtrEncrypt(const uint32_t * InData_Key,const uint32_t * InData_IV,const uint32_t num_words,const uint32_t * InData_Text,uint32_t * OutData_Text,uint32_t * OutData_IV)81 fsp_err_t HW_SCE_AES_256CtrEncrypt (const uint32_t * InData_Key,
82                                     const uint32_t * InData_IV,
83                                     const uint32_t   num_words,
84                                     const uint32_t * InData_Text,
85                                     uint32_t       * OutData_Text,
86                                     uint32_t       * OutData_IV)
87 {
88     fsp_err_t iret = FSP_SUCCESS;
89     FSP_PARAMETER_NOT_USED(OutData_IV);
90 #if RM_TINYCRYPT_PORT_CFG_PARAM_CHECKING_ENABLE
91     if ((InData_Key == (const uint32_t *) 0) ||
92         ((InData_IV == (const uint32_t *) 0) || (InData_Text == (const uint32_t *) 0)) ||
93         (OutData_Text == (const uint32_t *) 0) || (num_words == 0))
94     {
95         iret = FSP_ERR_INVALID_ARGUMENT;
96     }
97 #endif
98 
99     R_AES_B->AESCNTL = R_AES_AESCNTL_CTR_256_ENC;
100     hw_aes_set_key((uint8_t *) InData_Key, SIZE_AES_256BIT_KEYLEN_BYTES);
101 
102     if (FSP_SUCCESS == iret)
103     {
104         hw_aes_set_iv((uint8_t *) InData_IV);
105         R_AES_B->AESDCNTL = R_AES_AESDCNTL_BIT_2_3_MODE_2;
106         hw_aes_start((uint8_t *) InData_Text, (uint8_t *) OutData_Text, num_words);
107     }
108 
109     return iret;
110 }
111 
HW_SCE_AES_128CtrDecrypt(const uint32_t * InData_Key,const uint32_t * InData_IV,const uint32_t num_words,const uint32_t * InData_Text,uint32_t * OutData_Text)112 fsp_err_t HW_SCE_AES_128CtrDecrypt (const uint32_t * InData_Key,
113                                     const uint32_t * InData_IV,
114                                     const uint32_t   num_words,
115                                     const uint32_t * InData_Text,
116                                     uint32_t       * OutData_Text)
117 {
118     fsp_err_t iret = FSP_SUCCESS;
119 #if RM_TINYCRYPT_PORT_CFG_PARAM_CHECKING_ENABLE
120     if ((InData_Key == (const uint32_t *) 0) ||
121         ((InData_IV == (const uint32_t *) 0) || (InData_Text == (const uint32_t *) 0)) ||
122         (OutData_Text == (const uint32_t *) 0))
123     {
124         iret = FSP_ERR_INVALID_ARGUMENT;
125     }
126 #endif
127 
128     R_AES_B->AESCNTL = R_AES_AESCNTL_CTR_128_DEC;
129     hw_aes_set_key((uint8_t *) InData_Key, SIZE_AES_128BIT_KEYLEN_BYTES);
130 
131     if (FSP_SUCCESS == iret)
132     {
133         hw_aes_set_iv((uint8_t *) InData_IV);
134         R_AES_B->AESDCNTL = R_AES_AESDCNTL_BIT_2_3_MODE_2;
135         hw_aes_start((uint8_t *) InData_Text, (uint8_t *) OutData_Text, num_words);
136     }
137 
138     return iret;
139 }
140 
HW_SCE_AES_192CtrDecrypt(const uint32_t * InData_Key,const uint32_t * InData_IV,const uint32_t num_words,const uint32_t * InData_Text,uint32_t * OutData_Text)141 fsp_err_t HW_SCE_AES_192CtrDecrypt (const uint32_t * InData_Key,
142                                     const uint32_t * InData_IV,
143                                     const uint32_t   num_words,
144                                     const uint32_t * InData_Text,
145                                     uint32_t       * OutData_Text)
146 {
147     fsp_err_t iret = FSP_SUCCESS;
148 #if RM_TINYCRYPT_PORT_CFG_PARAM_CHECKING_ENABLE
149     if ((InData_Key == (const uint32_t *) 0) ||
150         ((InData_IV == (const uint32_t *) 0) || (InData_Text == (const uint32_t *) 0)) ||
151         (OutData_Text == (const uint32_t *) 0))
152     {
153         iret = FSP_ERR_INVALID_ARGUMENT;
154     }
155 #endif
156 
157     R_AES_B->AESCNTL = R_AES_AESCNTL_CTR_192_DEC;
158     hw_aes_set_key((uint8_t *) InData_Key, SIZE_AES_192BIT_KEYLEN_BYTES);
159 
160     if (FSP_SUCCESS == iret)
161     {
162         hw_aes_set_iv((uint8_t *) InData_IV);
163         R_AES_B->AESDCNTL = R_AES_AESDCNTL_BIT_2_3_MODE_2;
164         hw_aes_start((uint8_t *) InData_Text, (uint8_t *) OutData_Text, num_words);
165     }
166 
167     return iret;
168 }
169 
HW_SCE_AES_256CtrDecrypt(const uint32_t * InData_Key,const uint32_t * InData_IV,const uint32_t num_words,const uint32_t * InData_Text,uint32_t * OutData_Text)170 fsp_err_t HW_SCE_AES_256CtrDecrypt (const uint32_t * InData_Key,
171                                     const uint32_t * InData_IV,
172                                     const uint32_t   num_words,
173                                     const uint32_t * InData_Text,
174                                     uint32_t       * OutData_Text)
175 {
176     fsp_err_t iret = FSP_SUCCESS;
177 #if RM_TINYCRYPT_PORT_CFG_PARAM_CHECKING_ENABLE
178     if ((InData_Key == (const uint32_t *) 0) ||
179         ((InData_IV == (const uint32_t *) 0) || (InData_Text == (const uint32_t *) 0)) ||
180         (OutData_Text == (const uint32_t *) 0))
181     {
182         iret = FSP_ERR_INVALID_ARGUMENT;
183     }
184 #endif
185 
186     R_AES_B->AESCNTL = R_AES_AESCNTL_CTR_256_DEC;
187     hw_aes_set_key((uint8_t *) InData_Key, SIZE_AES_256BIT_KEYLEN_BYTES);
188 
189     if (FSP_SUCCESS == iret)
190     {
191         hw_aes_set_iv((uint8_t *) InData_IV);
192         R_AES_B->AESDCNTL = R_AES_AESDCNTL_BIT_2_3_MODE_2;
193         hw_aes_start((uint8_t *) InData_Text, (uint8_t *) OutData_Text, num_words);
194     }
195 
196     return iret;
197 }
198