3737#define NUMBER_OF_SLOTS 6
3838
3939struct rsa_oaep_workmem {
40- uint8_t workmem [WORKMEM_SIZE ];
4140 uint8_t * wmem ;
4241 uint8_t * seed ;
4342 uint8_t * salt ;
4443 uint8_t * datablock ;
4544 uint8_t * datablockstart ;
4645 uint8_t * datablockend ;
46+ uint8_t workmem [WORKMEM_SIZE ];
4747};
4848
4949static 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
163163 return SX_OK ;
164164}
165165
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 )
168167{
169- workmem -> datablock =
170- cracen_get_rsa_workmem_pointer (workmem -> workmem , digestsz ) + digestsz + 1 ;
171168 workmem -> wmem = cracen_get_rsa_workmem_pointer (workmem -> workmem , digestsz );
172- workmem -> datablockstart = workmem -> wmem + datablockstart_offset ;
169+ workmem -> datablock = workmem -> wmem + digestsz + 1 ;
173170 workmem -> seed = workmem -> wmem + 1 ;
174171}
175172
@@ -181,14 +178,12 @@ int cracen_rsa_oaep_encrypt(const struct sxhashalg *hashalg, struct cracen_rsa_k
181178 psa_status_t psa_status = PSA_ERROR_CORRUPTION_DETECTED ;
182179 size_t digestsz = sx_hash_get_alg_digestsz (hashalg );
183180 size_t modulussz = CRACEN_RSA_KEY_OPSZ (rsa_key );
184- const size_t datablockstart_offset = digestsz + 1 ;
185181 struct rsa_oaep_workmem workmem ;
186182
187- rsa_oaep_encrypt_init (& workmem , digestsz , datablockstart_offset );
183+ rsa_oaep_encrypt_init (& workmem , digestsz );
188184 if (WORKMEM_SIZE < modulussz + digestsz + 4 ) {
189185 return SX_ERR_WORKMEM_BUFFER_TOO_SMALL ;
190186 }
191- const size_t wmem_size = cracen_get_rsa_workmem_size (sizeof (workmem .workmem ), digestsz );
192187
193188 /* detect invalid combinations of key size and hash function */
194189 if (modulussz < 2 * digestsz + 2 ) {
@@ -212,14 +207,14 @@ int cracen_rsa_oaep_encrypt(const struct sxhashalg *hashalg, struct cracen_rsa_k
212207 /* start encoding and request generation of the random seed */
213208
214209 /* pointer used to walk through the data block DB */
215- uint8_t * datab = workmem .datablockstart ;
210+ uint8_t * datab = workmem .datablock + digestsz ;
216211 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 );
220213
221214 /* 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 ;
223218
224219 /* write the 0x01 octet that follows PS in DB */
225220 * datab ++ = 1 ;
@@ -260,8 +255,8 @@ int cracen_rsa_oaep_encrypt(const struct sxhashalg *hashalg, struct cracen_rsa_k
260255 struct sx_pk_slot inputs [NUMBER_OF_SLOTS ];
261256
262257 /* 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 );
265260 if (sx_status != SX_OK ) {
266261 safe_memzero (workmem .workmem , sizeof (workmem .workmem ));
267262 sx_pk_release_req (pkreq .req );
@@ -276,7 +271,7 @@ int cracen_rsa_oaep_encrypt(const struct sxhashalg *hashalg, struct cracen_rsa_k
276271 sx_pk_release_req (pkreq .req );
277272
278273 memcpy (output , workmem .wmem , opsz );
279- * output_length = text -> sz ;
274+ * output_length = opsz ;
280275 safe_memzero (workmem .workmem , sizeof (workmem .workmem ));
281276 return SX_OK ;
282277}
0 commit comments