3535
3636#define LARGE_TEMP_SZ 4096
3737
38- #define DEBUG_CRYPTOCB
39-
4038#if defined(WOLF_CRYPTO_CB ) && defined(WOLFSSL_CERT_REQ ) && \
4139 defined(WOLFSSL_CERT_EXT ) && defined(WOLFSSL_CERT_GEN ) && \
4240 (!defined(NO_RSA ) || defined(HAVE_ECC ) || defined(HAVE_ED25519 ))
@@ -72,14 +70,10 @@ typedef struct {
7270/* Forward declarations */
7371static int load_key_file (const char * fname , byte * derBuf , word32 * derLen ,
7472 int isPubKey );
75- #ifdef DEBUG_CRYPTOCB
76- static const char * GetAlgoTypeStr (int algo );
77- static const char * GetPkTypeStr (int pk );
78- #endif
7973
8074/* Example crypto dev callback function that calls software version */
8175/* This is where you would plug-in calls to your own hardware crypto */
82- static int myCryptoDevCb (int devIdArg , wc_CryptoInfo * info , void * ctx )
76+ static int myCryptoCb (int devIdArg , wc_CryptoInfo * info , void * ctx )
8377{
8478 int ret = CRYPTOCB_UNAVAILABLE ; /* return this to bypass HW and use SW */
8579 myCryptoCbCtx * myCtx = (myCryptoCbCtx * )ctx ;
@@ -88,15 +82,14 @@ static int myCryptoDevCb(int devIdArg, wc_CryptoInfo* info, void* ctx)
8882 if (info == NULL )
8983 return BAD_FUNC_ARG ;
9084
85+ #ifdef DEBUG_CRYPTOCB
86+ wc_CryptoCb_InfoString (info );
87+ #endif
88+
9189 if (info -> algo_type == WC_ALGO_TYPE_PK ) {
9290 byte der [LARGE_TEMP_SZ ];
9391 word32 derSz ;
9492
95- #ifdef DEBUG_CRYPTOCB
96- printf ("CryptoCb: %s %s (%d)\n" , GetAlgoTypeStr (info -> algo_type ),
97- GetPkTypeStr (info -> pk .type ), info -> pk .type );
98- #endif
99-
10093 ret = load_key_file (myCtx -> keyFilePriv , der , & derSz , 0 );
10194 if (ret != 0 ) {
10295 printf ("Error %d loading %s\n" , ret , myCtx -> keyFilePriv );
@@ -105,36 +98,42 @@ static int myCryptoDevCb(int devIdArg, wc_CryptoInfo* info, void* ctx)
10598
10699 #ifndef NO_RSA
107100 if (info -> pk .type == WC_PK_TYPE_RSA ) {
108- RsaKey rsaPriv ;
109- ret = wc_InitRsaKey_ex (& rsaPriv , NULL , INVALID_DEVID );
110- if (ret != 0 ) {
111- return ret ;
112- }
113- ret = wc_RsaPrivateKeyDecode (der , & idx , & rsaPriv , derSz );
114- if (ret != 0 ) {
115- wc_FreeRsaKey (& rsaPriv );
116- return ret ;
117- }
118-
119101 switch (info -> pk .rsa .type ) {
120102 case RSA_PUBLIC_ENCRYPT :
121103 case RSA_PUBLIC_DECRYPT :
104+ /* set devId to invalid, so software is used */
105+ info -> pk .rsa .key -> devId = INVALID_DEVID ;
122106 /* perform software based RSA public op */
123107 ret = wc_RsaFunction (
124108 info -> pk .rsa .in , info -> pk .rsa .inLen ,
125109 info -> pk .rsa .out , info -> pk .rsa .outLen ,
126- info -> pk .rsa .type , & rsaPriv , info -> pk .rsa .rng );
110+ info -> pk .rsa .type , info -> pk .rsa .key , info -> pk .rsa .rng );
111+ info -> pk .rsa .key -> devId = devIdArg ; /* reset devId */
127112 break ;
128113 case RSA_PRIVATE_ENCRYPT :
129114 case RSA_PRIVATE_DECRYPT :
115+ {
116+ RsaKey rsaPriv ;
117+
118+ ret = wc_InitRsaKey_ex (& rsaPriv , NULL , INVALID_DEVID );
119+ if (ret != 0 ) {
120+ return ret ;
121+ }
122+ ret = wc_RsaPrivateKeyDecode (der , & idx , & rsaPriv , derSz );
123+ if (ret != 0 ) {
124+ wc_FreeRsaKey (& rsaPriv );
125+ return ret ;
126+ }
127+
130128 /* perform software based RSA private op */
131129 ret = wc_RsaFunction (
132130 info -> pk .rsa .in , info -> pk .rsa .inLen ,
133131 info -> pk .rsa .out , info -> pk .rsa .outLen ,
134132 info -> pk .rsa .type , & rsaPriv , info -> pk .rsa .rng );
133+ wc_FreeRsaKey (& rsaPriv );
135134 break ;
135+ }
136136 }
137- wc_FreeRsaKey (& rsaPriv );
138137 }
139138 #endif /* !NO_RSA */
140139 #ifdef HAVE_ECC
@@ -188,38 +187,6 @@ static int myCryptoDevCb(int devIdArg, wc_CryptoInfo* info, void* ctx)
188187 return ret ;
189188}
190189
191-
192- #ifdef DEBUG_CRYPTOCB
193- static const char * GetAlgoTypeStr (int algo )
194- {
195- switch (algo ) { /* enum wc_AlgoType */
196- case WC_ALGO_TYPE_HASH : return "Hash" ;
197- case WC_ALGO_TYPE_CIPHER : return "Cipher" ;
198- case WC_ALGO_TYPE_PK : return "PK" ;
199- case WC_ALGO_TYPE_RNG : return "RNG" ;
200- case WC_ALGO_TYPE_SEED : return "Seed" ;
201- case WC_ALGO_TYPE_HMAC : return "HMAC" ;
202- }
203- return NULL ;
204- }
205- static const char * GetPkTypeStr (int pk )
206- {
207- switch (pk ) {
208- case WC_PK_TYPE_RSA : return "RSA" ;
209- case WC_PK_TYPE_DH : return "DH" ;
210- case WC_PK_TYPE_ECDH : return "ECDH" ;
211- case WC_PK_TYPE_ECDSA_SIGN : return "ECDSA-Sign" ;
212- case WC_PK_TYPE_ECDSA_VERIFY : return "ECDSA-Verify" ;
213- case WC_PK_TYPE_ED25519_SIGN : return "ED25519-Sign" ;
214- case WC_PK_TYPE_ED25519_VERIFY : return "ED25519-Verify" ;
215- case WC_PK_TYPE_CURVE25519 : return "CURVE25519" ;
216- case WC_PK_TYPE_RSA_KEYGEN : return "RSA KeyGen" ;
217- case WC_PK_TYPE_EC_KEYGEN : return "ECC KeyGen" ;
218- }
219- return NULL ;
220- }
221- #endif /* DEBUG_CRYPTOCB */
222-
223190/* reads file size, allocates buffer, reads into buffer, returns buffer */
224191static int load_file (const char * fname , byte * * buf , size_t * bufLen )
225192{
@@ -364,7 +331,7 @@ static int gen_csr(const char* arg1)
364331 wolfCrypt_Init ();
365332
366333 /* register a devID for crypto callbacks */
367- ret = wc_CryptoCb_RegisterDevice (devId , myCryptoDevCb , & myCtx );
334+ ret = wc_CryptoCb_RegisterDevice (devId , myCryptoCb , & myCtx );
368335 if (ret != 0 ) {
369336 printf ("Crypto callback register failed: %d\n" , ret );
370337 goto exit ;
@@ -481,7 +448,7 @@ static int gen_csr(const char* arg1)
481448 if (type == ED25519_TYPE )
482449 req .sigType = CTC_ED25519 ;
483450#endif
484- /* Because the key has devId set, it will call myCryptoDevCb for signing */
451+ /* Because the key has devId set, it will call myCryptoCb for signing */
485452 ret = wc_SignCert_ex (req .bodySz , req .sigType , der , sizeof (der ), type ,
486453 keyPtr , & rng );
487454 if (ret <= 0 ) {
0 commit comments