@@ -24,7 +24,7 @@ LOG_MODULE_REGISTER(suit_decrypt_filter, CONFIG_SUIT_LOG_LEVEL);
2424struct 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}
0 commit comments