@@ -130,7 +130,8 @@ int wolfEtsiClientMakeRequest(EtsiClientType type, const char* fingerprint,
130130 const char * groups , const char * contextstr , byte * request , word32 * requestSz )
131131{
132132 int ret ;
133- char uri [256 ];
133+ char uri [HTTP_MAX_URI * 3 ]; /* fingerprint, groups, contextStr */
134+ size_t uriLen ;
134135 HttpHeader headers [1 ];
135136 HttpMethodType httpType ;
136137 headers [0 ].type = HTTP_HDR_ACCEPT ;
@@ -145,11 +146,36 @@ int wolfEtsiClientMakeRequest(EtsiClientType type, const char* fingerprint,
145146 else {
146147 /* use GET with either fingerprint (with optional groups/context) */
147148 httpType = HTTP_METHOD_GET ;
148- snprintf (uri , sizeof (uri ),
149- "/.well-known/enterprise-transport-security/keys?fingerprints=%s%s%s%s%s" ,
150- fingerprint == NULL ? "" : fingerprint ,
151- groups == NULL ? "" : "&groups=" , groups == NULL ? "" : groups ,
152- contextstr == NULL ? "" : "&contextstr=" , contextstr == NULL ? "" : contextstr );
149+ strncpy (uri ,
150+ "/.well-known/enterprise-transport-security/keys?fingerprints=" ,
151+ sizeof (uri ));
152+ uriLen = strlen (uri );
153+ if (fingerprint != NULL ) {
154+ ret = wolfHttpUriEncode (fingerprint , strlen (fingerprint ),
155+ uri + uriLen , sizeof (uri )- uriLen );
156+ if (ret < 0 )
157+ return WOLFKM_BAD_ARGS ;
158+ uriLen += ret ;
159+ }
160+ if (groups != NULL ) {
161+ strncpy (uri + uriLen , "&groups=" , sizeof (uri )- uriLen );
162+ uriLen = strlen (uri );
163+ ret = wolfHttpUriEncode (groups , strlen (groups ),
164+ uri + uriLen , sizeof (uri )- uriLen );
165+ if (ret < 0 )
166+ return WOLFKM_BAD_ARGS ;
167+ uriLen += ret ;
168+ }
169+ if (contextstr != NULL ) {
170+ strncpy (uri + uriLen , "&contextstr=" , sizeof (uri )- uriLen );
171+ uriLen = strlen (uri );
172+ ret = wolfHttpUriEncode (contextstr , strlen (contextstr ),
173+ uri + uriLen , sizeof (uri )- uriLen );
174+ if (ret < 0 )
175+ return WOLFKM_BAD_ARGS ;
176+ uriLen += ret ;
177+ }
178+ uri [uriLen ] = '\0' ; /* null term */
153179 }
154180 ret = wolfHttpClient_EncodeRequest (httpType , uri , request ,
155181 requestSz , headers , sizeof (headers )/sizeof (HttpHeader ));
@@ -353,6 +379,57 @@ int wolfEtsiKeyGetPkType(EtsiKey* key)
353379 return WC_PK_TYPE_NONE ;
354380}
355381
382+ const char * wolfEtsiKeyGetTypeStr (EtsiKeyType type )
383+ {
384+ switch (type ) {
385+ case ETSI_KEY_TYPE_SECP160K1 :
386+ return "SECP160K1" ;
387+ case ETSI_KEY_TYPE_SECP160R1 :
388+ return "SECP160R1" ;
389+ case ETSI_KEY_TYPE_SECP160R2 :
390+ return "SECP160R2" ;
391+ case ETSI_KEY_TYPE_SECP192K1 :
392+ return "SECP192K1" ;
393+ case ETSI_KEY_TYPE_SECP192R1 :
394+ return "SECP192R1" ;
395+ case ETSI_KEY_TYPE_SECP224K1 :
396+ return "SECP224K1" ;
397+ case ETSI_KEY_TYPE_SECP224R1 :
398+ return "SECP224R1" ;
399+ case ETSI_KEY_TYPE_SECP256K1 :
400+ return "SECP256K1" ;
401+ case ETSI_KEY_TYPE_SECP256R1 :
402+ return "SECP256R1" ;
403+ case ETSI_KEY_TYPE_SECP384R1 :
404+ return "SECP384R1" ;
405+ case ETSI_KEY_TYPE_SECP521R1 :
406+ return "SECP521R1" ;
407+ case ETSI_KEY_TYPE_BRAINPOOLP256R1 :
408+ return "BRAINPOOLP256R1" ;
409+ case ETSI_KEY_TYPE_BRAINPOOLP384R1 :
410+ return "BRAINPOOLP384R1" ;
411+ case ETSI_KEY_TYPE_BRAINPOOLP512R1 :
412+ return "BRAINPOOLP512R1" ;
413+ case ETSI_KEY_TYPE_X25519 :
414+ return "X25519" ;
415+ case ETSI_KEY_TYPE_X448 :
416+ return "X448" ;
417+ case ETSI_KEY_TYPE_FFDHE_2048 :
418+ return "FFDHE_2048" ;
419+ case ETSI_KEY_TYPE_FFDHE_3072 :
420+ return "FFDHE_3072" ;
421+ case ETSI_KEY_TYPE_FFDHE_4096 :
422+ return "FFDHE_4096" ;
423+ case ETSI_KEY_TYPE_FFDHE_6144 :
424+ return "FFDHE_6144" ;
425+ case ETSI_KEY_TYPE_FFDHE_8192 :
426+ return "FFDHE_8192" ;
427+ default :
428+ break ;
429+ }
430+ return NULL ;
431+ }
432+
356433int wolfEtsiKeyLoadCTX (EtsiKey * key , WOLFSSL_CTX * ctx )
357434{
358435 int keyAlgo ;
@@ -406,7 +483,8 @@ int wolfEtsiKeyPrint(EtsiKey* key)
406483 ret = wc_EccPrivateKeyDecode ((byte * )key -> response , & idx , & ecKey ,
407484 key -> responseSz );
408485 if (ret == 0 ) {
409- byte pubX [32 * 2 + 1 ], pubY [32 * 2 + 1 ];
486+ byte pubX [MAX_ECC_BYTES * 2 + 1 ];
487+ byte pubY [MAX_ECC_BYTES * 2 + 1 ];
410488 word32 pubXLen = sizeof (pubX ), pubYLen = sizeof (pubY );
411489 ret = wc_ecc_export_ex (& ecKey ,
412490 pubX , & pubXLen ,
@@ -423,9 +501,22 @@ int wolfEtsiKeyPrint(EtsiKey* key)
423501#endif
424502#ifndef NO_DH
425503 if (keyAlgo == WC_PK_TYPE_DH ) {
426- /* TODO: add example for loading DHE key and print */
427- //DhKey dh;
428- XLOG (WOLFKM_LOG_INFO , "DH Pub: TODO\n" );
504+ /* example for loading DHE key */
505+ DhKey dhKey ;
506+ ret = wc_InitDhKey (& dhKey );
507+ if (ret == 0 ) {
508+ word32 idx = 0 ;
509+ ret = wc_DhKeyDecode ((byte * )key -> response , & idx , & dhKey , key -> responseSz );
510+ if (ret == 0 ) {
511+ byte pubKey [MAX_DH_PUB_SZ ];
512+ word32 pubKeyLen = sizeof (pubKey );
513+ ret = wc_DhExportKeyPair (& dhKey , NULL , NULL , pubKey , & pubKeyLen );
514+ if (ret == 0 ) {
515+ XLOG (WOLFKM_LOG_INFO , "DH Pub: %d\n" , pubKeyLen );
516+ }
517+ }
518+ wc_FreeDhKey (& dhKey );
519+ }
429520 }
430521#endif
431522#ifdef HAVE_CURVE25519
0 commit comments