@@ -177,80 +177,123 @@ int wolfTPM2_CryptoDevCb(int devId, wc_CryptoInfo* info, void* ctx)
177177 #endif /* !NO_RSA */
178178 #ifdef HAVE_ECC
179179 if (info -> pk .type == WC_PK_TYPE_EC_KEYGEN ) {
180- #ifdef WOLFTPM2_USE_SW_ECDHE
181- rc = exit_rc ;
182- #else
183180 int curve_id ;
184181 WOLFTPM2_KEY * key ;
185182
183+ #ifdef WOLFTPM2_USE_SW_ECDHE
184+ if (tlsCtx -> ecdhKey == NULL ) {
185+ return exit_rc ;
186+ }
187+ #endif
188+
189+ if ( tlsCtx -> eccKey == NULL
190+ && tlsCtx -> ecdsaKey == NULL
191+ && tlsCtx -> ecdhKey == NULL
192+ ) {
193+ #ifdef DEBUG_WOLFTPM
194+ printf ("No crypto callback key pointer set!\n" );
195+ #endif
196+ return BAD_FUNC_ARG ;
197+ }
198+
186199 /* Make sure an ECDH key has been set and curve is supported */
187200 curve_id = info -> pk .eckg .curveId ;
188201 if (curve_id == 0 && info -> pk .eckg .key -> dp != NULL ) {
189202 curve_id = info -> pk .eckg .key -> dp -> id ; /* use dp */
190203 }
191204 rc = TPM2_GetTpmCurve (curve_id );
192- if (rc < 0 || ( tlsCtx -> ecdhKey == NULL && tlsCtx -> eccKey == NULL ) ) {
205+ if (rc < 0 ) {
193206 return exit_rc ;
194207 }
195208 curve_id = rc ;
196209 rc = 0 ;
197210
198211 /* If ecdhKey is NULL then it is a signing key */
199- if (tlsCtx -> ecdhKey == NULL ) {
212+ #ifndef WOLFTPM2_USE_SW_ECDHE
213+ if (tlsCtx -> ecdhKey == NULL )
214+ #endif
215+ {
200216 /* Create an ECC key for ECDSA - if one isn't already created */
201- key = tlsCtx -> eccKey ;
217+ key = (tlsCtx -> ecdsaKey != NULL ) ?
218+ (WOLFTPM2_KEY * )tlsCtx -> ecdsaKey : tlsCtx -> eccKey ;
202219 if (key -> handle .hndl == 0 ||
203220 key -> handle .hndl == TPM_RH_NULL
204221 ) {
205222 TPMT_PUBLIC publicTemplate ;
206- XMEMSET (& publicTemplate , 0 , sizeof (publicTemplate ));
223+ TPMI_ALG_HASH hashAlg ;
224+
225+ if (curve_id == TPM_ECC_NIST_P521 )
226+ hashAlg = TPM_ALG_SHA512 ;
227+ else if (curve_id == TPM_ECC_NIST_P384 )
228+ hashAlg = TPM_ALG_SHA384 ;
229+ else
230+ hashAlg = TPM_ALG_SHA256 ;
207231
208- rc = wolfTPM2_GetKeyTemplate_ECC (& publicTemplate ,
232+ XMEMSET (& publicTemplate , 0 , sizeof (publicTemplate ));
233+ rc = wolfTPM2_GetKeyTemplate_ECC_ex (& publicTemplate , hashAlg ,
209234 TPMA_OBJECT_sensitiveDataOrigin | TPMA_OBJECT_userWithAuth |
210235 TPMA_OBJECT_sign | TPMA_OBJECT_noDA ,
211- curve_id , TPM_ALG_ECDSA );
236+ curve_id , TPM_ALG_ECDSA , hashAlg );
212237 if (rc == 0 ) {
213- publicTemplate .nameAlg = TPM_ALG_SHA256 ; /* make sure its SHA256 */
214- rc = wolfTPM2_CreateAndLoadKey (tlsCtx -> dev , key ,
215- & tlsCtx -> storageKey -> handle , & publicTemplate ,
216- (byte * )key -> handle .auth .buffer ,
217- key -> handle .auth .size );
238+ if (tlsCtx -> ecdsaKey != NULL ) {
239+ /* Use create key and load key directly instead to make
240+ * sure the private portion is populated */
241+ rc = wolfTPM2_CreateKey (tlsCtx -> dev , tlsCtx -> ecdsaKey ,
242+ & tlsCtx -> storageKey -> handle , & publicTemplate ,
243+ (byte * )key -> handle .auth .buffer ,
244+ key -> handle .auth .size );
245+ if (rc == TPM_RC_SUCCESS ) {
246+ rc = wolfTPM2_LoadKey (tlsCtx -> dev , tlsCtx -> ecdsaKey ,
247+ & tlsCtx -> storageKey -> handle );
248+ }
249+ }
250+ else {
251+ /* Create and load key - encrypted private is not exported */
252+ rc = wolfTPM2_CreateAndLoadKey (tlsCtx -> dev , tlsCtx -> eccKey ,
253+ & tlsCtx -> storageKey -> handle , & publicTemplate ,
254+ (byte * )key -> handle .auth .buffer ,
255+ key -> handle .auth .size );
256+ }
218257 }
219258 }
220259 }
260+ #ifndef WOLFTPM2_USE_SW_ECDHE
221261 else {
222262 /* Generate ephemeral key - if one isn't already created */
223263 key = tlsCtx -> ecdhKey ;
224264 if (key -> handle .hndl == 0 ||
225265 key -> handle .hndl == TPM_RH_NULL ) {
226- rc = wolfTPM2_ECDHGenKey (tlsCtx -> dev , key , curve_id ,
227- NULL , 0 /* no auth for ephemeral key */
266+ rc = wolfTPM2_ECDHGenKey (tlsCtx -> dev , tlsCtx -> ecdhKey ,
267+ curve_id , NULL , 0 /* no auth for ephemeral key */
228268 );
229269 }
230270 }
271+ #endif
272+
231273 if (rc == 0 ) {
232274 /* Export public key info to wolf ecc_key */
233275 rc = wolfTPM2_EccKey_TpmToWolf (tlsCtx -> dev , key ,
234276 info -> pk .eckg .key );
235277 if (rc != 0 ) {
236278 /* if failure, release key */
237- wolfTPM2_UnloadHandle (tlsCtx -> dev , & tlsCtx -> ecdhKey -> handle );
279+ wolfTPM2_UnloadHandle (tlsCtx -> dev , & key -> handle );
238280 }
239281 }
240282 else if (rc & TPM_RC_CURVE ) {
241283 /* if the curve is not supported on TPM, then fall-back to software */
242284 rc = exit_rc ;
243- /* Make sure ECDHE key indicates nothing loaded */
285+ /* Make sure key indicates nothing loaded */
244286 key -> handle .hndl = TPM_RH_NULL ;
245287 }
246- #endif /* WOLFTPM2_USE_SW_ECDHE */
247288 }
248289 else if (info -> pk .type == WC_PK_TYPE_ECDSA_SIGN ) {
249290 byte sigRS [MAX_ECC_BYTES * 2 ];
250291 word32 rsLen = sizeof (sigRS ), keySz ;
251292 word32 inlen = info -> pk .eccsign .inlen ;
293+ WOLFTPM2_KEY * key = (tlsCtx -> ecdsaKey != NULL ) ?
294+ (WOLFTPM2_KEY * )tlsCtx -> ecdsaKey : tlsCtx -> eccKey ;
252295
253- if (tlsCtx -> eccKey == NULL ) {
296+ if (key == NULL ) {
254297 /* TPM key not setup, fallback to software */
255298 return exit_rc ;
256299 }
@@ -260,13 +303,13 @@ int wolfTPM2_CryptoDevCb(int devId, wc_CryptoInfo* info, void* ctx)
260303 if (keySz == 0 ) {
261304 /* if not populated fallback to key size for TPM key */
262305 keySz = TPM2_GetCurveSize (
263- tlsCtx -> eccKey -> pub .publicArea .parameters .eccDetail .curveID );
306+ key -> pub .publicArea .parameters .eccDetail .curveID );
264307 }
265308 /* truncate input to match key size */
266309 if (inlen > keySz )
267310 inlen = keySz ;
268311
269- rc = wolfTPM2_SignHash (tlsCtx -> dev , tlsCtx -> eccKey ,
312+ rc = wolfTPM2_SignHash (tlsCtx -> dev , key ,
270313 info -> pk .eccsign .in , inlen , sigRS , (int * )& rsLen );
271314 if (rc == 0 ) {
272315 byte * r , * s ;
@@ -335,8 +378,9 @@ int wolfTPM2_CryptoDevCb(int devId, wc_CryptoInfo* info, void* ctx)
335378 TPM2B_ECC_POINT pubPoint ;
336379
337380 /* Make sure an ECDH key has been set */
338- if (tlsCtx -> ecdhKey == NULL || tlsCtx -> eccKey == NULL ||
339- tlsCtx -> ecdhKey -> handle .hndl == TPM_RH_NULL ) {
381+ if (tlsCtx -> ecdhKey == NULL ||
382+ tlsCtx -> ecdhKey -> handle .hndl == TPM_RH_NULL ||
383+ tlsCtx -> ecdhKey -> handle .hndl == 0 ) {
340384 return exit_rc ;
341385 }
342386
0 commit comments