Skip to content

Commit fac107a

Browse files
degjorvarlubos
authored andcommitted
nrf_security: CRACEN: Fix failing TF-m test
RSA OAEP incorrectly set the output length to the text size Updated to use correct key size instead RSA OAEP incorrectly overwrote part of the hash value Updated to zero the correct part of the workmem Remove variables that are not needed Signed-off-by: Dag Erik Gjørvad <[email protected]>
1 parent e69ed8f commit fac107a

File tree

2 files changed

+15
-18
lines changed

2 files changed

+15
-18
lines changed

subsys/nrf_security/src/drivers/cracen/cracenpsa/src/asymmetric.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,11 @@ cracen_asymmetric_crypt_internal(const psa_key_attributes_t *attributes, const u
9191
}
9292

9393
if (sx_status != SX_OK) {
94+
safe_memzero(output, output_size);
9495
return silex_statuscodes_to_psa(sx_status);
9596
}
96-
if (text.sz > output_size) {
97+
if (*output_length > output_size) {
98+
safe_memzero(output, output_size);
9799
return PSA_ERROR_BUFFER_TOO_SMALL;
98100
}
99101
return PSA_SUCCESS;

subsys/nrf_security/src/drivers/cracen/cracenpsa/src/rsaes_oaep.c

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,13 @@
3737
#define NUMBER_OF_SLOTS 6
3838

3939
struct 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

4949
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
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

Comments
 (0)