22
22
#if defined(MBEDTLS_CCM_ALT )
23
23
#include <string.h>
24
24
#include "mbedtls/platform.h"
25
+ #include "mbedtls/platform_util.h"
25
26
#include "mbedtls/aes.h"
26
-
27
- /* Implementation that should never be optimized out by the compiler */
28
- static void mbedtls_zeroize ( void * v , size_t n ) {
29
- volatile unsigned char * p = (unsigned char * )v ;
30
- while ( n -- ) * p ++ = 0 ;
31
- }
27
+ #include "crys_aesccm_error.h"
32
28
33
29
void mbedtls_ccm_init ( mbedtls_ccm_context * ctx )
34
30
{
@@ -37,7 +33,7 @@ void mbedtls_ccm_init( mbedtls_ccm_context *ctx )
37
33
38
34
void mbedtls_ccm_free ( mbedtls_ccm_context * ctx )
39
35
{
40
- mbedtls_zeroize ( ctx , sizeof ( mbedtls_ccm_context ) );
36
+ mbedtls_platform_zeroize ( ctx , sizeof ( mbedtls_ccm_context ) );
41
37
}
42
38
43
39
int mbedtls_ccm_setkey ( mbedtls_ccm_context * ctx ,
@@ -46,18 +42,30 @@ int mbedtls_ccm_setkey( mbedtls_ccm_context *ctx,
46
42
unsigned int keybits )
47
43
{
48
44
if ( ctx == NULL )
49
- return ( MBEDTLS_ERR_CCM_BAD_INPUT );
45
+ return ( MBEDTLS_ERR_CCM_BAD_INPUT );
46
+
47
+ if ( cipher != MBEDTLS_CIPHER_ID_AES )
48
+ {
49
+ return ( MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED );
50
+ }
50
51
51
- if ( cipher != MBEDTLS_CIPHER_ID_AES ||
52
- keybits != 128 )
52
+ switch ( keybits )
53
53
{
54
- return ( MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED );
54
+ case 128 :
55
+ {
56
+ memcpy ( ctx -> cipher_key , key , keybits / 8 );
57
+ ctx -> key_size = CRYS_AES_Key128BitSize ;
58
+ }
59
+ break ;
60
+ case 192 :
61
+ case 256 :
62
+ return ( MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED );
63
+ default :
64
+ return ( MBEDTLS_ERR_CCM_BAD_INPUT );
55
65
}
56
66
57
- memcpy ( ctx -> cipher_key , key , keybits / 8 );
58
- ctx -> keySize_ID = CRYS_AES_Key128BitSize ;
59
67
60
- return ( 0 );
68
+ return ( 0 );
61
69
62
70
}
63
71
@@ -66,36 +74,55 @@ int mbedtls_ccm_setkey( mbedtls_ccm_context *ctx,
66
74
*/
67
75
68
76
int mbedtls_ccm_encrypt_and_tag ( mbedtls_ccm_context * ctx , size_t length ,
69
- const unsigned char * iv , size_t iv_len ,
70
- const unsigned char * add , size_t add_len ,
71
- const unsigned char * input , unsigned char * output ,
72
- unsigned char * tag , size_t tag_len )
77
+ const unsigned char * iv , size_t iv_len ,
78
+ const unsigned char * add , size_t add_len ,
79
+ const unsigned char * input ,
80
+ unsigned char * output ,
81
+ unsigned char * tag , size_t tag_len )
73
82
74
83
{
75
- CRYSError_t CrysRet = CRYS_OK ;
84
+ CRYSError_t crys_ret = CRYS_OK ;
85
+ CRYS_AESCCM_Mac_Res_t cc_mac_res = { 0 };
86
+ int ret = 0 ;
76
87
/*
77
88
* Check length requirements: SP800-38C A.1
78
89
* Additional requirement: a < 2^16 - 2^8 to simplify the code.
79
90
* 'length' checked later (when writing it to the first block)
80
91
*/
81
92
if ( tag_len < 4 || tag_len > 16 || tag_len % 2 != 0 )
82
- return ( MBEDTLS_ERR_CCM_BAD_INPUT );
93
+ return ( MBEDTLS_ERR_CCM_BAD_INPUT );
94
+
95
+ if ( tag_len > sizeof ( cc_mac_res ) )
96
+ return ( MBEDTLS_ERR_CCM_BAD_INPUT );
83
97
84
98
/* Also implies q is within bounds */
85
99
if ( iv_len < 7 || iv_len > 13 )
86
- return ( MBEDTLS_ERR_CCM_BAD_INPUT );
100
+ return ( MBEDTLS_ERR_CCM_BAD_INPUT );
87
101
88
102
#if SIZE_MAX > UINT_MAX
89
103
if ( length > 0xFFFFFFFF || add_len > 0xFFFFFFFF )
90
- return ( MBEDTLS_ERR_CCM_BAD_INPUT );
104
+ return ( MBEDTLS_ERR_CCM_BAD_INPUT );
91
105
#endif
92
106
93
- CrysRet = CRYS_AESCCM ( SASI_AES_ENCRYPT , ctx -> cipher_key , ctx -> keySize_ID ,(uint8_t * )iv , iv_len ,
94
- (uint8_t * )add , add_len , (uint8_t * )input , length , output , tag_len , tag );
95
- if ( CrysRet != CRYS_OK )
96
- return ( MBEDTLS_ERR_PLATFORM_HW_ACCEL_FAILED );
107
+ crys_ret = CRYS_AESCCM ( SASI_AES_ENCRYPT , ctx -> cipher_key , ctx -> key_size ,
108
+ (uint8_t * )iv , iv_len , (uint8_t * )add , add_len ,
109
+ (uint8_t * )input , length , output , tag_len ,
110
+ cc_mac_res );
111
+ if ( crys_ret == CRYS_AESCCM_ILLEGAL_PARAMETER_SIZE_ERROR )
112
+ {
113
+ ret = MBEDTLS_ERR_CCM_BAD_INPUT ;
114
+ goto exit ;
115
+ }
116
+ else if ( crys_ret != CRYS_OK )
117
+ {
118
+ ret = MBEDTLS_ERR_PLATFORM_HW_ACCEL_FAILED ;
119
+ goto exit ;
120
+ }
121
+
122
+ memcpy ( tag , cc_mac_res , tag_len );
97
123
98
- return ( 0 );
124
+ exit :
125
+ return ( ret );
99
126
100
127
}
101
128
@@ -109,31 +136,80 @@ int mbedtls_ccm_auth_decrypt( mbedtls_ccm_context *ctx, size_t length,
109
136
const unsigned char * tag , size_t tag_len )
110
137
111
138
{
112
- CRYSError_t CrysRet = CRYS_OK ;
139
+ CRYSError_t crys_ret = CRYS_OK ;
140
+ int ret = 0 ;
113
141
/*
114
142
* Check length requirements: SP800-38C A.1
115
143
* Additional requirement: a < 2^16 - 2^8 to simplify the code.
116
144
* 'length' checked later (when writing it to the first block)
117
145
*/
118
146
if ( tag_len < 4 || tag_len > 16 || tag_len % 2 != 0 )
119
- return ( MBEDTLS_ERR_CCM_BAD_INPUT );
147
+ return ( MBEDTLS_ERR_CCM_BAD_INPUT );
120
148
121
149
/* Also implies q is within bounds */
122
150
if ( iv_len < 7 || iv_len > 13 )
123
- return ( MBEDTLS_ERR_CCM_BAD_INPUT );
151
+ return ( MBEDTLS_ERR_CCM_BAD_INPUT );
124
152
125
153
#if SIZE_MAX > UINT_MAX
126
154
if ( length > 0xFFFFFFFF || add_len > 0xFFFFFFFF )
127
- return ( MBEDTLS_ERR_CCM_BAD_INPUT );
155
+ return ( MBEDTLS_ERR_CCM_BAD_INPUT );
128
156
#endif
129
157
130
- CrysRet = CRYS_AESCCM ( SASI_AES_DECRYPT , ctx -> cipher_key , ctx -> keySize_ID ,(uint8_t * )iv , iv_len ,
131
- (uint8_t * )add , add_len , (uint8_t * )input , length , output , tag_len , (uint8_t * )tag );
132
- if ( CrysRet != CRYS_OK )
133
- return ( MBEDTLS_ERR_PLATFORM_HW_ACCEL_FAILED );
158
+ crys_ret = CRYS_AESCCM ( SASI_AES_DECRYPT , ctx -> cipher_key , ctx -> key_size ,
159
+ (uint8_t * )iv , iv_len , (uint8_t * )add , add_len ,
160
+ (uint8_t * )input , length , output , tag_len ,
161
+ (uint8_t * )tag );
162
+ if ( crys_ret == CRYS_AESCCM_ILLEGAL_PARAMETER_SIZE_ERROR )
163
+ {
164
+ /*
165
+ * When CRYS_AESCCM_ILLEGAL_PARAMETER_SIZE_ERROR is returned,
166
+ * no operation has occured, and no need to zeroize output.
167
+ * In addition, it could be that the message length is too big,
168
+ * returning this error code, and we don't want to overflow
169
+ * the output buffer.
170
+ */
171
+ return ( MBEDTLS_ERR_CCM_BAD_INPUT );
172
+ }
173
+ else if ( crys_ret == CRYS_FATAL_ERROR )
174
+ {
175
+ /*
176
+ * Unfortunately, Crys AESCCM returns CRYS_FATAL_ERROR when
177
+ * MAC isn't as expected.
178
+ */
179
+ ret = MBEDTLS_ERR_CCM_AUTH_FAILED ;
180
+ goto exit ;
181
+ }
182
+ else if ( crys_ret != CRYS_OK )
183
+ {
184
+ ret = MBEDTLS_ERR_PLATFORM_HW_ACCEL_FAILED ;
185
+ goto exit ;
186
+ }
134
187
135
- return ( 0 );
188
+ exit :
189
+ if ( ret != 0 )
190
+ mbedtls_platform_zeroize ( output , length );
191
+ return ( ret );
136
192
137
193
}
138
194
195
+ int mbedtls_ccm_star_encrypt_and_tag ( mbedtls_ccm_context * ctx , size_t length ,
196
+ const unsigned char * iv , size_t iv_len ,
197
+ const unsigned char * add , size_t add_len ,
198
+ const unsigned char * input ,
199
+ unsigned char * output ,
200
+ unsigned char * tag , size_t tag_len )
201
+ {
202
+ return ( MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED );
203
+ }
204
+
205
+ int mbedtls_ccm_star_auth_decrypt ( mbedtls_ccm_context * ctx , size_t length ,
206
+ const unsigned char * iv , size_t iv_len ,
207
+ const unsigned char * add , size_t add_len ,
208
+ const unsigned char * input ,
209
+ unsigned char * output ,
210
+ const unsigned char * tag , size_t tag_len )
211
+ {
212
+ return ( MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED );
213
+ }
214
+
139
215
#endif
0 commit comments