@@ -202,9 +202,7 @@ lws_jwe_encrypt_ecdh(struct lws_jwe *jwe, char *temp, int *temp_len,
202202 uint8_t shared_secret [LWS_JWE_LIMIT_KEY_ELEMENT_BYTES ],
203203 derived [LWS_JWE_LIMIT_KEY_ELEMENT_BYTES ];
204204 int m , n , ret = -1 , ot = * temp_len , ss_len = sizeof (shared_secret ),
205- // kw_hlen = lws_genhash_size(jwe->jose.alg->hash_type),
206- enc_hlen = (int )lws_genhmac_size (jwe -> jose .enc_alg -> hmac_type ),
207- ekbytes = 32 ; //jwe->jose.alg->keybits_fixed / 8;
205+ enc_hlen = (int )lws_genhmac_size (jwe -> jose .enc_alg -> hmac_type );
208206 struct lws_genec_ctx ecctx ;
209207 struct lws_jwk * ephem = & jwe -> jose .recipient [jwe -> recip ].jwk_ephemeral ;
210208
@@ -219,14 +217,18 @@ lws_jwe_encrypt_ecdh(struct lws_jwe *jwe, char *temp, int *temp_len,
219217
220218 /* Generate jose.jwk_ephemeral on the peer public key curve */
221219
222- if (lws_genecdh_create (& ecctx , jwe -> jws .context , NULL ))
220+ if (lws_genecdh_create (& ecctx , jwe -> jws .context , NULL )) {
221+ lwsl_err ("%s: lws_genecdh_create failed\n" , __func__ );
223222 goto bail ;
223+ }
224224
225225 /* ephemeral context gets random key on same curve as recip pubkey */
226226 if (lws_genecdh_new_keypair (& ecctx , LDHS_OURS , (const char * )
227227 jwe -> jws .jwk -> e [LWS_GENCRYPTO_EC_KEYEL_CRV ].buf ,
228- ephem -> e ))
228+ ephem -> e )) {
229+ lwsl_err ("%s: lws_genecdh_new_keypair failed\n" , __func__ );
229230 goto bail ;
231+ }
230232
231233 /* peer context gets js->jwk key */
232234 if (lws_genecdh_set_key (& ecctx , jwe -> jws .jwk -> e , LDHS_THEIRS )) {
@@ -235,6 +237,7 @@ lws_jwe_encrypt_ecdh(struct lws_jwe *jwe, char *temp, int *temp_len,
235237 }
236238
237239 /* combine our ephemeral key and the peer pubkey to get the secret */
240+ ss_len = (int )jwe -> jws .jwk -> e [LWS_GENCRYPTO_EC_KEYEL_X ].len ;
238241
239242 if (lws_genecdh_compute_shared_secret (& ecctx , shared_secret , & ss_len )) {
240243 lwsl_notice ("%s: lws_genecdh_compute_shared_secret failed\n" ,
@@ -302,7 +305,7 @@ lws_jwe_encrypt_ecdh(struct lws_jwe *jwe, char *temp, int *temp_len,
302305 /* wrap with the derived key */
303306
304307 el .buf = derived ;
305- el .len = (unsigned int )enc_hlen / 2 ;
308+ el .len = (unsigned int )jwe -> jose . alg -> keybits_fixed / 8 ;
306309
307310 if (lws_genaes_create (& aesctx , LWS_GAESO_ENC , LWS_GAESM_KW , & el ,
308311 1 , NULL )) {
@@ -368,8 +371,8 @@ lws_jwe_encrypt_ecdh(struct lws_jwe *jwe, char *temp, int *temp_len,
368371 lws_genec_destroy (& ecctx );
369372
370373 /* cleanse the shared secret (watch out for cek at parent too) */
371- lws_explicit_bzero (shared_secret , ( unsigned int ) ekbytes );
372- lws_explicit_bzero (derived , ( unsigned int ) ekbytes );
374+ lws_explicit_bzero (shared_secret , sizeof ( shared_secret ) );
375+ lws_explicit_bzero (derived , sizeof ( derived ) );
373376
374377 return ret ;
375378}
@@ -380,7 +383,8 @@ lws_jwe_encrypt_ecdh_cbc_hs(struct lws_jwe *jwe, char *temp, int *temp_len)
380383 int ss_len , // kw_hlen = lws_genhash_size(jwe->jose.alg->hash_type),
381384 enc_hlen = (int )lws_genhmac_size (jwe -> jose .enc_alg -> hmac_type );
382385 uint8_t cek [LWS_JWE_LIMIT_KEY_ELEMENT_BYTES ];
383- int ekbytes = jwe -> jose .alg -> keybits_fixed / 8 ;
386+ int ekbytes = jwe -> jose .alg -> keybits_fixed ?
387+ jwe -> jose .alg -> keybits_fixed / 8 : enc_hlen ;
384388 int n , ot = * temp_len , ret = -1 ;
385389
386390 /* if we will produce an EKEY, make space for it */
@@ -454,8 +458,9 @@ lws_jwe_auth_and_decrypt_ecdh(struct lws_jwe *jwe)
454458{
455459 uint8_t shared_secret [LWS_JWE_LIMIT_KEY_ELEMENT_BYTES ],
456460 derived [LWS_JWE_LIMIT_KEY_ELEMENT_BYTES ];
457- int ekbytes = jwe -> jose .enc_alg -> keybits_fixed / 8 ,
458- enc_hlen = (int )lws_genhmac_size (jwe -> jose .enc_alg -> hmac_type );
461+ int enc_hlen = (int )lws_genhmac_size (jwe -> jose .enc_alg -> hmac_type );
462+ int ekbytes = jwe -> jose .enc_alg -> keybits_fixed ?
463+ jwe -> jose .enc_alg -> keybits_fixed / 8 : enc_hlen ;
459464 struct lws_genec_ctx ecctx ;
460465 int n , ret = -1 , ss_len = sizeof (shared_secret );
461466
@@ -501,6 +506,7 @@ lws_jwe_auth_and_decrypt_ecdh(struct lws_jwe *jwe)
501506 }
502507
503508 /* combine their ephemeral key and our private key to get the secret */
509+ ss_len = (int )jwe -> jws .jwk -> e [LWS_GENCRYPTO_EC_KEYEL_X ].len ;
504510
505511 if (lws_genecdh_compute_shared_secret (& ecctx , shared_secret , & ss_len )) {
506512 lwsl_notice ("%s: lws_genecdh_compute_shared_secret failed\n" ,
@@ -551,7 +557,7 @@ lws_jwe_auth_and_decrypt_ecdh(struct lws_jwe *jwe)
551557 /* unwrap with the KEK we derived */
552558
553559 el .buf = derived ;
554- el .len = (unsigned int )enc_hlen / 2 ;
560+ el .len = (unsigned int )jwe -> jose . alg -> keybits_fixed / 8 ;
555561
556562 if (lws_genaes_create (& aesctx , LWS_GAESO_DEC , LWS_GAESM_KW ,
557563 & el , 1 , NULL )) {
0 commit comments