Skip to content

Commit 9831024

Browse files
committed
rename parameters in decrypt filter; add testcase for failing writing to RAM
1 parent 812fac3 commit 9831024

File tree

3 files changed

+72
-46
lines changed

3 files changed

+72
-46
lines changed

subsys/suit/stream/stream_filters/include/suit_decrypt_filter.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,17 @@ extern "C" {
1818
/**
1919
* @brief Get decrypt filter object
2020
*
21-
* @param[out] dec_sink Pointer to destination sink_stream to pass decrypted data
21+
* @param[out] in_sink Pointer to input sink_stream to pass encrypted data
2222
* @param[in] enc_info Pointer to the structure with encryption info.
2323
* @param[in] class_id Pointer to the manifest class ID of the destination component
24-
* @param[in] enc_sink Pointer to source sink_stream to be filled with encrypted data
24+
* @param[in] out_sink Pointer to output sink_stream to be filled with decrypted data
2525
*
2626
* @return SUIT_PLAT_SUCCESS if success otherwise error code
2727
*/
28-
suit_plat_err_t suit_decrypt_filter_get(struct stream_sink *dec_sink,
28+
suit_plat_err_t suit_decrypt_filter_get(struct stream_sink *in_sink,
2929
struct suit_encryption_info *enc_info,
3030
const suit_manifest_class_id_t *class_id,
31-
struct stream_sink *enc_sink);
31+
struct stream_sink *out_sink);
3232

3333
#ifdef __cplusplus
3434
}

subsys/suit/stream/stream_filters/src/suit_decrypt_filter.c

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ LOG_MODULE_REGISTER(suit_decrypt_filter, CONFIG_SUIT_LOG_LEVEL);
2424
struct decrypt_ctx {
2525
mbedtls_svc_key_id_t cek_key_id;
2626
psa_aead_operation_t operation;
27-
struct stream_sink enc_sink;
27+
struct stream_sink out_sink;
2828
size_t tag_size;
2929
size_t stored_tag_bytes;
3030
uint8_t tag[PSA_AEAD_TAG_MAX_SIZE];
@@ -67,8 +67,8 @@ static suit_plat_err_t erase(void *ctx)
6767
decrypt_ctx->stored_tag_bytes = 0;
6868
memset(decrypt_ctx->tag, 0, sizeof(decrypt_ctx->tag));
6969

70-
if (decrypt_ctx->enc_sink.erase != NULL) {
71-
res = decrypt_ctx->enc_sink.erase(decrypt_ctx->enc_sink.ctx);
70+
if (decrypt_ctx->out_sink.erase != NULL) {
71+
res = decrypt_ctx->out_sink.erase(decrypt_ctx->out_sink.ctx);
7272
}
7373
} else {
7474
res = SUIT_PLAT_ERR_INVAL;
@@ -131,7 +131,7 @@ static suit_plat_err_t write(void *ctx, const uint8_t *buf, size_t size)
131131
goto cleanup;
132132
}
133133

134-
err = decrypt_ctx->enc_sink.write(decrypt_ctx->enc_sink.ctx, decrypted_buf,
134+
err = decrypt_ctx->out_sink.write(decrypt_ctx->out_sink.ctx, decrypted_buf,
135135
decrypted_len);
136136

137137
if (err != SUIT_PLAT_SUCCESS) {
@@ -195,13 +195,15 @@ static suit_plat_err_t flush(void *ctx)
195195
} else {
196196
LOG_INF("Firmware decryption successful");
197197

198-
/* Using enc_sink without a write API is blocked by the filter constructor.
198+
/* Using out_sink without a write API is blocked by the filter constructor.
199199
*/
200200
if (decrypted_len > 0) {
201-
res = decrypt_ctx->enc_sink.write(decrypt_ctx->enc_sink.ctx,
201+
res = decrypt_ctx->out_sink.write(decrypt_ctx->out_sink.ctx,
202202
decrypted_buf, decrypted_len);
203203
if (res != SUIT_PLAT_SUCCESS) {
204204
LOG_ERR("Failed to write decrypted data: %d", res);
205+
/* Revert all the changes so that no decrypted data remains */
206+
erase(decrypt_ctx);
205207
}
206208
}
207209
}
@@ -236,16 +238,16 @@ static suit_plat_err_t release(void *ctx)
236238

237239
suit_plat_err_t res = flush(ctx);
238240

239-
if (decrypt_ctx->enc_sink.release != NULL) {
241+
if (decrypt_ctx->out_sink.release != NULL) {
240242
suit_plat_err_t release_ret =
241-
decrypt_ctx->enc_sink.release(decrypt_ctx->enc_sink.ctx);
243+
decrypt_ctx->out_sink.release(decrypt_ctx->out_sink.ctx);
242244

243245
if (res == SUIT_SUCCESS) {
244246
res = release_ret;
245247
}
246248
}
247249

248-
zeroize(&decrypt_ctx->enc_sink, sizeof(struct stream_sink));
250+
zeroize(&decrypt_ctx->out_sink, sizeof(struct stream_sink));
249251

250252
decrypt_ctx->in_use = false;
251253

@@ -261,8 +263,8 @@ static suit_plat_err_t used_storage(void *ctx, size_t *size)
261263
return SUIT_PLAT_ERR_INVAL;
262264
}
263265

264-
if (decrypt_ctx->enc_sink.used_storage != NULL) {
265-
return decrypt_ctx->enc_sink.used_storage(decrypt_ctx->enc_sink.ctx, size);
266+
if (decrypt_ctx->out_sink.used_storage != NULL) {
267+
return decrypt_ctx->out_sink.used_storage(decrypt_ctx->out_sink.ctx, size);
266268
}
267269

268270
return SUIT_PLAT_ERR_UNSUPPORTED;
@@ -344,10 +346,10 @@ static suit_plat_err_t get_psa_alg_info(enum suit_cose_alg cose_alg_id, psa_algo
344346
return SUIT_PLAT_SUCCESS;
345347
}
346348

347-
suit_plat_err_t suit_decrypt_filter_get(struct stream_sink *dec_sink,
349+
suit_plat_err_t suit_decrypt_filter_get(struct stream_sink *in_sink,
348350
struct suit_encryption_info *enc_info,
349351
const suit_manifest_class_id_t *class_id,
350-
struct stream_sink *enc_sink)
352+
struct stream_sink *out_sink)
351353
{
352354
suit_plat_err_t ret = SUIT_PLAT_SUCCESS;
353355

@@ -356,8 +358,8 @@ suit_plat_err_t suit_decrypt_filter_get(struct stream_sink *dec_sink,
356358
return SUIT_PLAT_ERR_BUSY;
357359
}
358360

359-
if ((enc_info == NULL) || (enc_sink == NULL) || (dec_sink == NULL) ||
360-
(enc_sink->write == NULL) || class_id == NULL) {
361+
if ((enc_info == NULL) || (out_sink == NULL) || (in_sink == NULL) ||
362+
(out_sink->write == NULL) || class_id == NULL) {
361363
return SUIT_PLAT_ERR_INVAL;
362364
}
363365

@@ -411,22 +413,22 @@ suit_plat_err_t suit_decrypt_filter_get(struct stream_sink *dec_sink,
411413
}
412414

413415
ctx.stored_tag_bytes = 0;
414-
memcpy(&ctx.enc_sink, enc_sink, sizeof(struct stream_sink));
416+
memcpy(&ctx.out_sink, out_sink, sizeof(struct stream_sink));
415417

416-
dec_sink->ctx = &ctx;
418+
in_sink->ctx = &ctx;
417419

418-
dec_sink->write = write;
419-
dec_sink->erase = erase;
420-
dec_sink->release = release;
421-
dec_sink->flush = flush;
422-
if (enc_sink->used_storage != NULL) {
423-
dec_sink->used_storage = used_storage;
420+
in_sink->write = write;
421+
in_sink->erase = erase;
422+
in_sink->release = release;
423+
in_sink->flush = flush;
424+
if (out_sink->used_storage != NULL) {
425+
in_sink->used_storage = used_storage;
424426
} else {
425-
dec_sink->used_storage = NULL;
427+
in_sink->used_storage = NULL;
426428
}
427429

428430
/* Seeking is not possible on encrypted payload. */
429-
dec_sink->seek = NULL;
431+
in_sink->seek = NULL;
430432

431433
return SUIT_PLAT_SUCCESS;
432434
}

tests/subsys/suit/unit/suit_decrypt_filter/src/main.c

Lines changed: 41 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ struct suit_decrypt_filter_tests_fixture {
7171
size_t decrypted_output_length;
7272
psa_status_t aead_update_status;
7373
psa_status_t aead_verify_status;
74+
suit_plat_err_t ram_sink_write_status;
7475

7576
// ram_sink interfaces call counters. Not really 'fixtures', but something
7677
// we verify as a side effect of test run.
@@ -158,7 +159,7 @@ static suit_plat_err_t write_ram(void *ctx, const uint8_t *buf, size_t size)
158159

159160
tests_fixture.ram_sink_write_call_cnt++;
160161

161-
return SUIT_PLAT_SUCCESS;
162+
return tests_fixture.ram_sink_write_status;
162163
}
163164

164165
static suit_plat_err_t used_storage(void *ctx, size_t *size)
@@ -462,14 +463,6 @@ ZTEST_F(suit_decrypt_filter_tests, test_flush_verify_fail)
462463
"Incorrect number of ram_sink write function calls");
463464
zassert_equal(psa_aead_abort_fake.call_count, 1,
464465
"Invalid number of calls to psa_aead_abort");
465-
// zassert_equal(fixture->dec_sink.ctx->cek_key_id, 0,
466-
// "Invalid cek_key_id of decrypt stream context");
467-
// zassert_equal(fixture->dec_sink.ctx->operation, 0,
468-
// "Invalid operation of decrypt stream context");
469-
// zassert_equal(fixture->dec_sink.ctx->tag_size, 0,
470-
// "Invalid tag_size of decrypt stream context");
471-
// zassert_equal(fixture->dec_sink.ctx->tag_bytes, 0,
472-
// "Invalid tag_bytes of decrypt stream context");
473466
}
474467

475468
ZTEST_F(suit_decrypt_filter_tests, test_flush_happy_path)
@@ -506,12 +499,43 @@ ZTEST_F(suit_decrypt_filter_tests, test_flush_happy_path)
506499
"Incorrect number of ram_sink write function calls");
507500
zassert_equal(psa_aead_abort_fake.call_count, 0,
508501
"Invalid number of calls to psa_aead_abort");
509-
// zassert_equal(fixture->dec_sink.ctx->cek_key_id, 0,
510-
// "Invalid cek_key_id of decrypt stream context");
511-
// zassert_equal(fixture->dec_sink.ctx->operation, 0,
512-
// "Invalid operation of decrypt stream context");
513-
// zassert_equal(fixture->dec_sink.ctx->tag_size, 0,
514-
// "Invalid tag_size of decrypt stream context");
515-
// zassert_equal(fixture->dec_sink.ctx->tag_bytes, 0,
516-
// "Invalid tag_bytes of decrypt stream context");
502+
}
503+
504+
ZTEST_F(suit_decrypt_filter_tests, test_flush_ram_write_fail)
505+
{
506+
struct suit_encryption_info enc_info = ENC_INFO_DEFAULT_INIT;
507+
508+
suit_plat_decode_key_id_fake.custom_fake = custom_suit_plat_decode_key_id;
509+
suit_plat_err_t err = suit_decrypt_filter_get(&fixture->dec_sink, &enc_info,
510+
&sample_class_id, &fixture->ram_sink);
511+
512+
zassert_equal(err, SUIT_PLAT_SUCCESS,
513+
"Incorrect error code when getting decrypt filter");
514+
515+
psa_aead_update_fake.custom_fake = custom_psa_aead_update;
516+
fixture->aead_update_status = PSA_SUCCESS;
517+
fixture->decrypted_output_length = 100; // Anything greater than 0.
518+
519+
err = fixture->dec_sink.write(fixture->dec_sink.ctx, ciphertext_direct,
520+
sizeof(ciphertext_direct));
521+
522+
zassert_equal(err, SUIT_PLAT_SUCCESS,
523+
"Incorrect error code when calling filter write interface");
524+
525+
psa_aead_verify_fake.custom_fake = custom_psa_aead_verify;
526+
fixture->aead_verify_status = PSA_SUCCESS;
527+
fixture->decrypted_output_length = 100; // Anything greater than 0.
528+
tests_fixture.ram_sink_write_status = SUIT_PLAT_ERR_NOMEM;
529+
530+
err = fixture->dec_sink.flush(fixture->dec_sink.ctx);
531+
532+
zassert_equal(err, SUIT_PLAT_ERR_NOMEM,
533+
"Incorrect error code when calling filter flush interface");
534+
zassert_equal(fixture->ram_sink_write_call_cnt, 2, // Called 2 times because we
535+
// also call write (< SINGLE_CHUNK_SIZE).
536+
"Incorrect number of ram_sink write function calls");
537+
zassert_equal(psa_aead_abort_fake.call_count, 0,
538+
"Invalid number of calls to psa_aead_abort");
539+
zassert_equal(fixture->ram_sink_erase_call_cnt, 1,
540+
"Incorrect number of ram_sink erase function calls");
517541
}

0 commit comments

Comments
 (0)