@@ -51,6 +51,18 @@ int mbedtls_aes_setkey_enc(FAR mbedtls_aes_context *ctx,
51
51
FAR const unsigned char * key ,
52
52
unsigned int keybits )
53
53
{
54
+ switch (keybits )
55
+ {
56
+ case 128 :
57
+ break ;
58
+ case 192 :
59
+ break ;
60
+ case 256 :
61
+ break ;
62
+ default :
63
+ return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH ;
64
+ }
65
+
54
66
memcpy (ctx -> key , key , keybits / 8 );
55
67
ctx -> dev .session .key = (caddr_t )ctx -> key ;
56
68
ctx -> dev .session .keylen = keybits / 8 ;
@@ -74,6 +86,11 @@ int mbedtls_aes_crypt_ecb(FAR mbedtls_aes_context *ctx,
74
86
int ret ;
75
87
unsigned char iv [16 ];
76
88
89
+ if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT )
90
+ {
91
+ return MBEDTLS_ERR_AES_BAD_INPUT_DATA ;
92
+ }
93
+
77
94
ctx -> dev .session .cipher = CRYPTO_AES_CBC ;
78
95
ret = cryptodev_get_session (& ctx -> dev );
79
96
if (ret != 0 )
@@ -107,6 +124,16 @@ int mbedtls_aes_crypt_cbc(mbedtls_aes_context *ctx,
107
124
{
108
125
int ret ;
109
126
127
+ if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT )
128
+ {
129
+ return MBEDTLS_ERR_AES_BAD_INPUT_DATA ;
130
+ }
131
+
132
+ if (length % 16 )
133
+ {
134
+ return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH ;
135
+ }
136
+
110
137
ctx -> dev .session .cipher = CRYPTO_AES_CBC ;
111
138
ret = cryptodev_get_session (& ctx -> dev );
112
139
if (ret != 0 )
@@ -141,6 +168,11 @@ int mbedtls_aes_crypt_ctr(FAR mbedtls_aes_context *ctx,
141
168
{
142
169
int ret ;
143
170
171
+ if (* nc_off > 0x0f )
172
+ {
173
+ return MBEDTLS_ERR_AES_BAD_INPUT_DATA ;
174
+ }
175
+
144
176
ctx -> dev .session .cipher = CRYPTO_AES_CTR ;
145
177
memcpy (ctx -> key + ctx -> dev .session .keylen ,
146
178
nonce_counter , NONCE_LENGTH );
@@ -183,14 +215,22 @@ int mbedtls_aes_xts_setkey_enc(FAR mbedtls_aes_xts_context *ctx,
183
215
FAR const unsigned char * key ,
184
216
unsigned int keybits )
185
217
{
186
- return mbedtls_aes_setkey_enc (ctx , key , keybits );
218
+ if (keybits != 256 && keybits != 512 )
219
+ {
220
+ return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH ;
221
+ }
222
+
223
+ memcpy (ctx -> key , key , keybits / 8 );
224
+ ctx -> dev .session .key = (caddr_t )ctx -> key ;
225
+ ctx -> dev .session .keylen = keybits / 8 ;
226
+ return 0 ;
187
227
}
188
228
189
229
int mbedtls_aes_xts_setkey_dec (FAR mbedtls_aes_xts_context * ctx ,
190
230
FAR const unsigned char * key ,
191
231
unsigned int keybits )
192
232
{
193
- return mbedtls_aes_setkey_dec (ctx , key , keybits );
233
+ return mbedtls_aes_xts_setkey_enc (ctx , key , keybits );
194
234
}
195
235
196
236
int mbedtls_aes_crypt_xts (FAR mbedtls_aes_xts_context * ctx ,
@@ -203,6 +243,25 @@ int mbedtls_aes_crypt_xts(FAR mbedtls_aes_xts_context *ctx,
203
243
int ret ;
204
244
unsigned char iv [16 ];
205
245
246
+ if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT )
247
+ {
248
+ return MBEDTLS_ERR_AES_BAD_INPUT_DATA ;
249
+ }
250
+
251
+ /* Data units must be at least 16 bytes long. */
252
+
253
+ if (length < 16 )
254
+ {
255
+ return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH ;
256
+ }
257
+
258
+ /* NIST SP 800-38E disallows data units larger than 2**20 blocks. */
259
+
260
+ if (length > (1 << 20 ) * 16 )
261
+ {
262
+ return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH ;
263
+ }
264
+
206
265
ctx -> dev .session .cipher = CRYPTO_AES_XTS ;
207
266
ret = cryptodev_get_session (& ctx -> dev );
208
267
if (ret != 0 )
@@ -238,6 +297,16 @@ int mbedtls_aes_crypt_cfb128(FAR mbedtls_aes_context *ctx,
238
297
{
239
298
int ret ;
240
299
300
+ if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT )
301
+ {
302
+ return MBEDTLS_ERR_AES_BAD_INPUT_DATA ;
303
+ }
304
+
305
+ if (* iv_off > 15 )
306
+ {
307
+ return MBEDTLS_ERR_AES_BAD_INPUT_DATA ;
308
+ }
309
+
241
310
ctx -> dev .session .cipher = CRYPTO_AES_CFB_128 ;
242
311
ret = cryptodev_get_session (& ctx -> dev );
243
312
if (ret != 0 )
@@ -273,6 +342,11 @@ int mbedtls_aes_crypt_cfb8(FAR mbedtls_aes_context *ctx,
273
342
{
274
343
int ret ;
275
344
345
+ if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT )
346
+ {
347
+ return MBEDTLS_ERR_AES_BAD_INPUT_DATA ;
348
+ }
349
+
276
350
ctx -> dev .session .cipher = CRYPTO_AES_CFB_8 ;
277
351
ret = cryptodev_get_session (& ctx -> dev );
278
352
if (ret != 0 )
@@ -306,6 +380,11 @@ int mbedtls_aes_crypt_ofb(FAR mbedtls_aes_context *ctx,
306
380
{
307
381
int ret ;
308
382
383
+ if (* iv_off > 15 )
384
+ {
385
+ return MBEDTLS_ERR_AES_BAD_INPUT_DATA ;
386
+ }
387
+
309
388
ctx -> dev .session .cipher = CRYPTO_AES_OFB ;
310
389
ret = cryptodev_get_session (& ctx -> dev );
311
390
if (ret != 0 )
0 commit comments