@@ -499,18 +499,32 @@ static int test_she_crypto_cb(int devIdArg, wc_CryptoInfo* info, void* ctx)
499499 info -> she .op .generateM1M2M3 .m3Sz );
500500 break ;
501501 case WC_SHE_GENERATE_M4M5 :
502- ret = wc_SHE_GenerateM4M5 (she ,
503- info -> she .op .generateM4M5 .uid ,
504- info -> she .op .generateM4M5 .uidSz ,
505- info -> she .op .generateM4M5 .authKeyId ,
506- info -> she .op .generateM4M5 .targetKeyId ,
507- info -> she .op .generateM4M5 .newKey ,
508- info -> she .op .generateM4M5 .newKeySz ,
509- info -> she .op .generateM4M5 .counter ,
510- info -> she .op .generateM4M5 .m4 ,
511- info -> she .op .generateM4M5 .m4Sz ,
512- info -> she .op .generateM4M5 .m5 ,
513- info -> she .op .generateM4M5 .m5Sz );
502+ if (info -> she .op .generateM4M5 .uid == NULL &&
503+ she -> generated ) {
504+ /* LoadKey flow: M1/M2/M3 already imported, simulate HSM
505+ * returning M4/M5 from known test vectors. */
506+ if (info -> she .op .generateM4M5 .m4 != NULL )
507+ XMEMCPY (info -> she .op .generateM4M5 .m4 ,
508+ sheTestExpM4 , WC_SHE_M4_SZ );
509+ if (info -> she .op .generateM4M5 .m5 != NULL )
510+ XMEMCPY (info -> she .op .generateM4M5 .m5 ,
511+ sheTestExpM5 , WC_SHE_M5_SZ );
512+ ret = 0 ;
513+ }
514+ else {
515+ ret = wc_SHE_GenerateM4M5 (she ,
516+ info -> she .op .generateM4M5 .uid ,
517+ info -> she .op .generateM4M5 .uidSz ,
518+ info -> she .op .generateM4M5 .authKeyId ,
519+ info -> she .op .generateM4M5 .targetKeyId ,
520+ info -> she .op .generateM4M5 .newKey ,
521+ info -> she .op .generateM4M5 .newKeySz ,
522+ info -> she .op .generateM4M5 .counter ,
523+ info -> she .op .generateM4M5 .m4 ,
524+ info -> she .op .generateM4M5 .m4Sz ,
525+ info -> she .op .generateM4M5 .m5 ,
526+ info -> she .op .generateM4M5 .m5Sz );
527+ }
514528 break ;
515529 case WC_SHE_EXPORT_KEY :
516530 /* Simulate hardware export -- fill with test pattern */
@@ -635,4 +649,120 @@ int test_wc_SHE_CryptoCb(void)
635649 return EXPECT_RESULT ();
636650}
637651
652+ #ifndef NO_WC_SHE_LOADKEY
653+
654+ int test_wc_SHE_LoadKey (void )
655+ {
656+ EXPECT_DECLS ;
657+ int sheTestDevId = 54322 ;
658+ byte m1 [WC_SHE_M1_SZ ];
659+ byte m2 [WC_SHE_M2_SZ ];
660+ byte m3 [WC_SHE_M3_SZ ];
661+ byte m4 [WC_SHE_M4_SZ ];
662+ byte m5 [WC_SHE_M5_SZ ];
663+
664+ ExpectIntEQ (wc_CryptoCb_RegisterDevice (sheTestDevId ,
665+ test_she_crypto_cb , NULL ), 0 );
666+
667+ /* Generate valid M1/M2/M3 from test vectors */
668+ {
669+ wc_SHE she ;
670+ ExpectIntEQ (wc_SHE_Init (& she , NULL , INVALID_DEVID ), 0 );
671+ ExpectIntEQ (wc_SHE_GenerateM1M2M3 (& she ,
672+ sheTestUid , sizeof (sheTestUid ),
673+ WC_SHE_MASTER_ECU_KEY_ID ,
674+ sheTestAuthKey , sizeof (sheTestAuthKey ),
675+ 4 , sheTestNewKey , sizeof (sheTestNewKey ), 1 , 0 ,
676+ m1 , WC_SHE_M1_SZ , m2 , WC_SHE_M2_SZ ,
677+ m3 , WC_SHE_M3_SZ ), 0 );
678+ wc_SHE_Free (& she );
679+ }
680+
681+ /* Basic: LoadKey should import M1/M2/M3 and produce M4/M5 via callback */
682+ ExpectIntEQ (wc_SHE_LoadKey (NULL , sheTestDevId ,
683+ m1 , WC_SHE_M1_SZ , m2 , WC_SHE_M2_SZ , m3 , WC_SHE_M3_SZ ,
684+ m4 , WC_SHE_M4_SZ , m5 , WC_SHE_M5_SZ ), 0 );
685+ ExpectIntEQ (XMEMCMP (m4 , sheTestExpM4 , WC_SHE_M4_SZ ), 0 );
686+ ExpectIntEQ (XMEMCMP (m5 , sheTestExpM5 , WC_SHE_M5_SZ ), 0 );
687+
688+ /* Bad args: NULL m1 */
689+ ExpectIntEQ (wc_SHE_LoadKey (NULL , sheTestDevId ,
690+ NULL , WC_SHE_M1_SZ , m2 , WC_SHE_M2_SZ , m3 , WC_SHE_M3_SZ ,
691+ m4 , WC_SHE_M4_SZ , m5 , WC_SHE_M5_SZ ),
692+ WC_NO_ERR_TRACE (BAD_FUNC_ARG ));
693+
694+ /* Bad args: NULL m4 output */
695+ ExpectIntEQ (wc_SHE_LoadKey (NULL , sheTestDevId ,
696+ m1 , WC_SHE_M1_SZ , m2 , WC_SHE_M2_SZ , m3 , WC_SHE_M3_SZ ,
697+ NULL , WC_SHE_M4_SZ , m5 , WC_SHE_M5_SZ ),
698+ WC_NO_ERR_TRACE (BAD_FUNC_ARG ));
699+
700+ /* Bad args: INVALID_DEVID */
701+ ExpectIntEQ (wc_SHE_LoadKey (NULL , INVALID_DEVID ,
702+ m1 , WC_SHE_M1_SZ , m2 , WC_SHE_M2_SZ , m3 , WC_SHE_M3_SZ ,
703+ m4 , WC_SHE_M4_SZ , m5 , WC_SHE_M5_SZ ),
704+ WC_NO_ERR_TRACE (BAD_FUNC_ARG ));
705+
706+ /* Bad args: wrong M1 size */
707+ ExpectIntEQ (wc_SHE_LoadKey (NULL , sheTestDevId ,
708+ m1 , WC_SHE_M1_SZ - 1 , m2 , WC_SHE_M2_SZ ,
709+ m3 , WC_SHE_M3_SZ ,
710+ m4 , WC_SHE_M4_SZ , m5 , WC_SHE_M5_SZ ),
711+ WC_NO_ERR_TRACE (BAD_FUNC_ARG ));
712+
713+ wc_CryptoCb_UnRegisterDevice (sheTestDevId );
714+ return EXPECT_RESULT ();
715+ }
716+
717+ int test_wc_SHE_LoadKey_Verify (void )
718+ {
719+ EXPECT_DECLS ;
720+ int sheTestDevId = 54323 ;
721+ byte m1 [WC_SHE_M1_SZ ];
722+ byte m2 [WC_SHE_M2_SZ ];
723+ byte m3 [WC_SHE_M3_SZ ];
724+ byte m4 [WC_SHE_M4_SZ ];
725+ byte m5 [WC_SHE_M5_SZ ];
726+ byte badM4 [WC_SHE_M4_SZ ];
727+
728+ ExpectIntEQ (wc_CryptoCb_RegisterDevice (sheTestDevId ,
729+ test_she_crypto_cb , NULL ), 0 );
730+
731+ /* Generate valid M1/M2/M3 from test vectors */
732+ {
733+ wc_SHE she ;
734+ ExpectIntEQ (wc_SHE_Init (& she , NULL , INVALID_DEVID ), 0 );
735+ ExpectIntEQ (wc_SHE_GenerateM1M2M3 (& she ,
736+ sheTestUid , sizeof (sheTestUid ),
737+ WC_SHE_MASTER_ECU_KEY_ID ,
738+ sheTestAuthKey , sizeof (sheTestAuthKey ),
739+ 4 , sheTestNewKey , sizeof (sheTestNewKey ), 1 , 0 ,
740+ m1 , WC_SHE_M1_SZ , m2 , WC_SHE_M2_SZ ,
741+ m3 , WC_SHE_M3_SZ ), 0 );
742+ wc_SHE_Free (& she );
743+ }
744+
745+ /* Matching: expected M4/M5 match what the callback produces */
746+ ExpectIntEQ (wc_SHE_LoadKey_Verify (NULL , sheTestDevId ,
747+ m1 , WC_SHE_M1_SZ , m2 , WC_SHE_M2_SZ , m3 , WC_SHE_M3_SZ ,
748+ m4 , WC_SHE_M4_SZ , m5 , WC_SHE_M5_SZ ,
749+ sheTestExpM4 , WC_SHE_M4_SZ ,
750+ sheTestExpM5 , WC_SHE_M5_SZ ), 0 );
751+
752+ /* Mismatch: wrong expected M4 should fail with SIG_VERIFY_E */
753+ XMEMCPY (badM4 , sheTestExpM4 , WC_SHE_M4_SZ );
754+ badM4 [0 ] ^= 0xFF ;
755+ ExpectIntEQ (wc_SHE_LoadKey_Verify (NULL , sheTestDevId ,
756+ m1 , WC_SHE_M1_SZ , m2 , WC_SHE_M2_SZ , m3 , WC_SHE_M3_SZ ,
757+ m4 , WC_SHE_M4_SZ , m5 , WC_SHE_M5_SZ ,
758+ badM4 , WC_SHE_M4_SZ ,
759+ sheTestExpM5 , WC_SHE_M5_SZ ),
760+ WC_NO_ERR_TRACE (SIG_VERIFY_E ));
761+
762+ wc_CryptoCb_UnRegisterDevice (sheTestDevId );
763+ return EXPECT_RESULT ();
764+ }
765+
766+ #endif /* !NO_WC_SHE_LOADKEY */
767+
638768#endif /* WOLF_CRYPTO_CB && WOLFSSL_SHE && !NO_AES */
0 commit comments