@@ -3502,6 +3502,51 @@ int wolfTPM2_RsaKey_TpmToWolf(WOLFTPM2_DEV* dev, WOLFTPM2_KEY* tpmKey,
35023502 return rc ;
35033503}
35043504
3505+ int wolfTPM2_CreateRsaKeyBlob (WOLFTPM2_DEV * dev , const WOLFTPM2_KEY * parentKey ,
3506+ RsaKey * wolfKey , WOLFTPM2_KEYBLOB * tpmKey )
3507+ {
3508+ int rc ;
3509+ word32 exponent ;
3510+ byte e [sizeof (exponent )];
3511+ byte n [WOLFTPM2_WRAP_RSA_KEY_BITS / 8 ];
3512+ byte d [WOLFTPM2_WRAP_RSA_KEY_BITS / 8 ];
3513+ byte p [WOLFTPM2_WRAP_RSA_KEY_BITS / 8 ];
3514+ byte q [WOLFTPM2_WRAP_RSA_KEY_BITS / 8 ];
3515+ word32 eSz = sizeof (e );
3516+ word32 nSz = sizeof (n );
3517+ word32 dSz = sizeof (d );
3518+ word32 pSz = sizeof (p );
3519+ word32 qSz = sizeof (q );
3520+
3521+ if (dev == NULL || tpmKey == NULL || wolfKey == NULL || parentKey == NULL ||
3522+ wolfKey -> type != RSA_PRIVATE ) {
3523+ return BAD_FUNC_ARG ;
3524+ }
3525+
3526+ XMEMSET (e , 0 , sizeof (e ));
3527+ XMEMSET (n , 0 , sizeof (n ));
3528+ XMEMSET (d , 0 , sizeof (d ));
3529+ XMEMSET (p , 0 , sizeof (p ));
3530+ XMEMSET (q , 0 , sizeof (q ));
3531+
3532+ /* export the raw private and public RSA as unsigned binary */
3533+ PRIVATE_KEY_UNLOCK ();
3534+ rc = wc_RsaExportKey (wolfKey , e , & eSz , n , & nSz ,
3535+ d , & dSz , p , & pSz , q , & qSz );
3536+ PRIVATE_KEY_LOCK ();
3537+ if (rc == 0 ) {
3538+ exponent = wolfTPM2_RsaKey_Exponent (e , eSz );
3539+
3540+ rc = wolfTPM2_ImportRsaPrivateKey (dev , parentKey , tpmKey , n , nSz ,
3541+ exponent , q , qSz , TPM_ALG_NULL , TPM_ALG_NULL );
3542+ }
3543+
3544+ /* not used */
3545+ (void )p ;
3546+
3547+ return rc ;
3548+ }
3549+
35053550int wolfTPM2_RsaKey_WolfToTpm_ex (WOLFTPM2_DEV * dev , const WOLFTPM2_KEY * parentKey ,
35063551 RsaKey * wolfKey , WOLFTPM2_KEY * tpmKey )
35073552{
@@ -3652,6 +3697,76 @@ int wolfTPM2_EccKey_TpmToWolf(WOLFTPM2_DEV* dev, WOLFTPM2_KEY* tpmKey,
36523697}
36533698#endif /* HAVE_ECC_KEY_IMPORT */
36543699#ifdef HAVE_ECC_KEY_EXPORT
3700+ int wolfTPM2_CreateEccKeyBlob (WOLFTPM2_DEV * dev , WOLFTPM2_KEY * parentKey ,
3701+ ecc_key * wolfKey , WOLFTPM2_KEYBLOB * tpmKey )
3702+ {
3703+ int rc , curve_id = 0 ;
3704+ byte qx [WOLFTPM2_WRAP_ECC_KEY_BITS / 8 ];
3705+ byte qy [WOLFTPM2_WRAP_ECC_KEY_BITS / 8 ];
3706+ byte d [WOLFTPM2_WRAP_ECC_KEY_BITS / 8 ];
3707+ word32 qxSz = sizeof (qx );
3708+ word32 qySz = sizeof (qy );
3709+ word32 dSz = sizeof (d );
3710+
3711+ if (dev == NULL || tpmKey == NULL || wolfKey == NULL || parentKey == NULL ||
3712+ wolfKey -> type == ECC_PUBLICKEY ) {
3713+ return BAD_FUNC_ARG ;
3714+ }
3715+
3716+ XMEMSET (tpmKey , 0 , sizeof (* tpmKey ));
3717+ XMEMSET (qx , 0 , sizeof (qx ));
3718+ XMEMSET (qy , 0 , sizeof (qy ));
3719+ XMEMSET (d , 0 , sizeof (d ));
3720+
3721+ if (wolfKey -> dp )
3722+ curve_id = wolfKey -> dp -> id ;
3723+
3724+ rc = TPM2_GetTpmCurve (curve_id );
3725+ if (rc < 0 )
3726+ return rc ;
3727+ curve_id = rc ;
3728+ rc = 0 ;
3729+
3730+ if (wolfKey -> type == ECC_PRIVATEKEY_ONLY ) {
3731+ /* compute public point without modifying incoming wolf key */
3732+ int keySz = wc_ecc_size (wolfKey );
3733+ ecc_point * point = wc_ecc_new_point ();
3734+ if (point == NULL ) {
3735+ rc = MEMORY_E ;
3736+ }
3737+ if (rc == 0 ) {
3738+ #ifdef ECC_TIMING_RESISTANT
3739+ rc = wc_ecc_make_pub_ex (wolfKey , point , wolfKey -> rng );
3740+ #else
3741+ rc = wc_ecc_make_pub (wolfKey , point );
3742+ #endif
3743+ if (rc == 0 )
3744+ rc = wc_export_int (point -> x , qx , & qxSz , keySz ,
3745+ WC_TYPE_UNSIGNED_BIN );
3746+ if (rc == 0 )
3747+ rc = wc_export_int (point -> y , qy , & qySz , keySz ,
3748+ WC_TYPE_UNSIGNED_BIN );
3749+ if (rc == 0 )
3750+ rc = wc_ecc_export_private_only (wolfKey , d , & dSz );
3751+ wc_ecc_del_point (point );
3752+ }
3753+ }
3754+ else {
3755+ /* export the raw private/public ECC portions */
3756+ rc = wc_ecc_export_private_raw (wolfKey ,
3757+ qx , & qxSz ,
3758+ qy , & qySz ,
3759+ d , & dSz );
3760+ }
3761+
3762+ if (rc == 0 ) {
3763+ rc = wolfTPM2_ImportEccPrivateKey (dev , parentKey , tpmKey , curve_id ,
3764+ qx , qxSz , qy , qySz , d , dSz );
3765+ }
3766+
3767+ return rc ;
3768+ }
3769+
36553770int wolfTPM2_EccKey_WolfToTpm_ex (WOLFTPM2_DEV * dev , WOLFTPM2_KEY * parentKey ,
36563771 ecc_key * wolfKey , WOLFTPM2_KEY * tpmKey )
36573772{
0 commit comments