37
37
#define NUMBER_OF_SLOTS 6
38
38
39
39
struct rsa_oaep_workmem {
40
- uint8_t workmem [WORKMEM_SIZE ];
41
40
uint8_t * wmem ;
42
41
uint8_t * seed ;
43
42
uint8_t * salt ;
44
43
uint8_t * datablock ;
45
44
uint8_t * datablockstart ;
46
45
uint8_t * datablockend ;
46
+ uint8_t workmem [WORKMEM_SIZE ];
47
47
};
48
48
49
49
static void rsa_oaep_decrypt_init (struct rsa_oaep_workmem * workmem , size_t digestsz ,
@@ -163,13 +163,10 @@ int cracen_rsa_oaep_decrypt(const struct sxhashalg *hashalg, struct cracen_rsa_k
163
163
return SX_OK ;
164
164
}
165
165
166
- static void rsa_oaep_encrypt_init (struct rsa_oaep_workmem * workmem , size_t digestsz ,
167
- size_t datablockstart_offset )
166
+ static void rsa_oaep_encrypt_init (struct rsa_oaep_workmem * workmem , size_t digestsz )
168
167
{
169
- workmem -> datablock =
170
- cracen_get_rsa_workmem_pointer (workmem -> workmem , digestsz ) + digestsz + 1 ;
171
168
workmem -> wmem = cracen_get_rsa_workmem_pointer (workmem -> workmem , digestsz );
172
- workmem -> datablockstart = workmem -> wmem + datablockstart_offset ;
169
+ workmem -> datablock = workmem -> wmem + digestsz + 1 ;
173
170
workmem -> seed = workmem -> wmem + 1 ;
174
171
}
175
172
@@ -181,14 +178,12 @@ int cracen_rsa_oaep_encrypt(const struct sxhashalg *hashalg, struct cracen_rsa_k
181
178
psa_status_t psa_status = PSA_ERROR_CORRUPTION_DETECTED ;
182
179
size_t digestsz = sx_hash_get_alg_digestsz (hashalg );
183
180
size_t modulussz = CRACEN_RSA_KEY_OPSZ (rsa_key );
184
- const size_t datablockstart_offset = digestsz + 1 ;
185
181
struct rsa_oaep_workmem workmem ;
186
182
187
- rsa_oaep_encrypt_init (& workmem , digestsz , datablockstart_offset );
183
+ rsa_oaep_encrypt_init (& workmem , digestsz );
188
184
if (WORKMEM_SIZE < modulussz + digestsz + 4 ) {
189
185
return SX_ERR_WORKMEM_BUFFER_TOO_SMALL ;
190
186
}
191
- const size_t wmem_size = cracen_get_rsa_workmem_size (sizeof (workmem .workmem ), digestsz );
192
187
193
188
/* detect invalid combinations of key size and hash function */
194
189
if (modulussz < 2 * digestsz + 2 ) {
@@ -212,14 +207,14 @@ int cracen_rsa_oaep_encrypt(const struct sxhashalg *hashalg, struct cracen_rsa_k
212
207
/* start encoding and request generation of the random seed */
213
208
214
209
/* pointer used to walk through the data block DB */
215
- uint8_t * datab = workmem .datablockstart ;
210
+ uint8_t * datab = workmem .datablock + digestsz ;
216
211
size_t datablocksz = modulussz - digestsz - 1 ;
217
- size_t paddingstrsz = datablocksz - digestsz - text -> sz - 1 ;
218
-
219
- datab += paddingstrsz ;
212
+ size_t paddingstrsz = datablocksz - (digestsz + text -> sz + 1 );
220
213
221
214
/* write the padding string PS, consisting of zero octets */
222
- safe_memset (datab , wmem_size - (datablockstart_offset + digestsz ), 0 , paddingstrsz );
215
+ safe_memzero (datab , paddingstrsz );
216
+
217
+ datab += paddingstrsz ;
223
218
224
219
/* write the 0x01 octet that follows PS in DB */
225
220
* datab ++ = 1 ;
@@ -260,8 +255,8 @@ int cracen_rsa_oaep_encrypt(const struct sxhashalg *hashalg, struct cracen_rsa_k
260
255
struct sx_pk_slot inputs [NUMBER_OF_SLOTS ];
261
256
262
257
/* modular exponentiation m^d mod n (RSASP1 sign primitive) */
263
- sx_status = cracen_rsa_modexp ( & pkreq , inputs , rsa_key , workmem . wmem ,
264
- modulussz , input_sizes );
258
+ sx_status =
259
+ cracen_rsa_modexp ( & pkreq , inputs , rsa_key , workmem . wmem , modulussz , input_sizes );
265
260
if (sx_status != SX_OK ) {
266
261
safe_memzero (workmem .workmem , sizeof (workmem .workmem ));
267
262
sx_pk_release_req (pkreq .req );
@@ -276,7 +271,7 @@ int cracen_rsa_oaep_encrypt(const struct sxhashalg *hashalg, struct cracen_rsa_k
276
271
sx_pk_release_req (pkreq .req );
277
272
278
273
memcpy (output , workmem .wmem , opsz );
279
- * output_length = text -> sz ;
274
+ * output_length = opsz ;
280
275
safe_memzero (workmem .workmem , sizeof (workmem .workmem ));
281
276
return SX_OK ;
282
277
}
0 commit comments