@@ -93,6 +93,7 @@ static uint64_t rtapp_load_addr, rtapp_size, rttapp_loaded = 0;
9393#define K230_DISABLE_NONE_SECURITY_MASK 0x1U
9494#define K230_GCM_IV_LEN 12U
9595#define K230_GCM_TAG_LEN 16U
96+ #define K230_SM4_IV_LEN 16U
9697#define K230_GCM_UPDATE_CHUNK_SIZE 0x10000U
9798#define K230_DOWNSTREAM_AES_KEY_SLOT OTPKEY_3
9899#define K230_DOWNSTREAM_RSA_HASH_SLOT OTPKEY_8
@@ -126,11 +127,6 @@ unsigned long k230_get_rttapp_load_addr(void)
126127 return addr & ~(4096 - 1 );
127128}
128129
129- static const uint8_t * k230_get_firmware_sm4_iv (void )
130- {
131- return k230_firmware_sm4_iv ;
132- }
133-
134130static bool k230_calc_range_end (ulong start , ulong size , ulong * end )
135131{
136132 ulong max_value = ~0UL ;
@@ -388,7 +384,9 @@ static int k230_boot_check_and_get_plain_data(firmware_head_s *pfh,
388384 uint8_t puk_hash_otp [SHA256_SUM_LEN ];
389385 pufs_ec_point_st puk = { .qlen = 32 };
390386 pufs_ecdsa_sig_st sig = { .qlen = 32 };
391- const uint8_t * sm4_iv = k230_get_firmware_sm4_iv ();
387+ const uint8_t * sm4_iv ;
388+ const uint8_t * sm4_input ;
389+ uint32_t sm4_input_len ;
392390
393391 if (pufs_read_otp (puk_hash_otp , sizeof (puk_hash_otp ),
394392 (K230_DOWNSTREAM_SM2_HASH_SLOT - OTPKEY_0 ) * OTP_KEY_LEN ) != SUCCESS ) {
@@ -423,9 +421,18 @@ static int k230_boot_check_and_get_plain_data(firmware_head_s *pfh,
423421 return 16 ;
424422 }
425423
424+ if (pfh -> length < K230_SM4_IV_LEN ) {
425+ printf ("sm4 payload too short\n" );
426+ return 17 ;
427+ }
428+
429+ sm4_iv = cipher_data ;
430+ sm4_input = cipher_data + K230_SM4_IV_LEN ;
431+ sm4_input_len = pfh -> length - K230_SM4_IV_LEN ;
432+
426433 plain_addr = k230_get_encrypted_image_decrypt_addr ();
427434 if (cb_pufs_dec_cbc ((uint8_t * )plain_addr , & outlen ,
428- cipher_data , pfh -> length ,
435+ sm4_input , sm4_input_len ,
429436 SM4 , OTPKEY , K230_DOWNSTREAM_SM4_KEY_SLOT , 128 ,
430437 sm4_iv , 0 ) != SUCCESS ) {
431438 printf ("sm4 decrypt error\n" );
0 commit comments