@@ -3805,6 +3805,7 @@ int EchConfigGetSupportedCipherSuite(WOLFSSL_EchConfig* config)
38053805 int i = 0;
38063806
38073807 if (!wc_HpkeKemIsSupported(config->kemId)) {
3808+ WOLFSSL_MSG("ECH config: KEM not supported");
38083809 return WOLFSSL_FATAL_ERROR;
38093810 }
38103811
@@ -3815,6 +3816,7 @@ int EchConfigGetSupportedCipherSuite(WOLFSSL_EchConfig* config)
38153816 }
38163817 }
38173818
3819+ WOLFSSL_MSG("ECH config: KDF or AEAD not supported");
38183820 return WOLFSSL_FATAL_ERROR;
38193821}
38203822
@@ -3937,10 +3939,14 @@ static int EchCalcAcceptance(WOLFSSL* ssl, byte* label, word16 labelSz,
39373939
39383940 if (isHrr) {
39393941 /* the transcript hash of ClientHelloInner1 */
3940- hashSz = GetMsgHash(ssl, clientHelloInnerHash);
3941- if (hashSz > 0) {
3942+ ret = GetMsgHash(ssl, clientHelloInnerHash);
3943+ if (ret > 0) {
3944+ hashSz = ret;
39423945 ret = 0;
39433946 }
3947+ else if (ret == 0) {
3948+ ret = HASH_TYPE_E;
3949+ }
39443950
39453951 /* restart ECH transcript hash, similar to RestartHandshakeHash but
39463952 * don't add a cookie */
@@ -3980,6 +3986,9 @@ static int EchCalcAcceptance(WOLFSSL* ssl, byte* label, word16 labelSz,
39803986 if (ret > 0) {
39813987 ret = 0;
39823988 }
3989+ else if (ret == 0) {
3990+ ret = HASH_TYPE_E;
3991+ }
39833992 }
39843993
39853994 /* pick the right type and size based on mac_algorithm */
@@ -4765,15 +4774,18 @@ int SendTls13ClientHello(WOLFSSL* ssl)
47654774
47664775 /* get size for inner */
47674776 ret = TLSX_GetRequestSize(ssl, client_hello, &args->length);
4777+
4778+ /* set the type to outer */
4779+ args->ech->type = ECH_TYPE_OUTER;
47684780 if (ret != 0)
47694781 return ret;
47704782
4771- /* set the type to outer */
4772- args->ech->type = 0;
47734783 /* set innerClientHelloLen to ClientHelloInner + padding + tag */
47744784 args->ech->paddingLen = 31 - ((args->length - 1) % 32);
4775- args->ech->innerClientHelloLen = (word16)(args->length +
4776- args->ech->paddingLen + args->ech->hpke->Nt);
4785+ args->ech->innerClientHelloLen = args->length +
4786+ args->ech->paddingLen + args->ech->hpke->Nt;
4787+ if (args->ech->innerClientHelloLen > 0xFFFF)
4788+ return BUFFER_E;
47774789 /* set the length back to before we computed ClientHelloInner size */
47784790 args->length = (word32)args->preXLength;
47794791 }
@@ -4915,8 +4927,10 @@ int SendTls13ClientHello(WOLFSSL* ssl)
49154927 args->ech->innerClientHello =
49164928 (byte*)XMALLOC(args->ech->innerClientHelloLen - args->ech->hpke->Nt,
49174929 ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
4918- if (args->ech->innerClientHello == NULL)
4930+ if (args->ech->innerClientHello == NULL) {
4931+ args->ech->type = ECH_TYPE_OUTER;
49194932 return MEMORY_E;
4933+ }
49204934 /* set the padding bytes to 0 */
49214935 XMEMSET(args->ech->innerClientHello + args->ech->innerClientHelloLen -
49224936 args->ech->hpke->Nt - args->ech->paddingLen, 0,
@@ -4939,8 +4953,10 @@ int SendTls13ClientHello(WOLFSSL* ssl)
49394953 /* change the outer client random */
49404954 ret = wc_RNG_GenerateBlock(ssl->rng, args->output +
49414955 args->clientRandomOffset, RAN_LEN);
4942- if (ret != 0)
4956+ if (ret != 0) {
4957+ args->ech->type = ECH_TYPE_OUTER;
49434958 return ret;
4959+ }
49444960 /* copy the new client random */
49454961 XMEMCPY(ssl->arrays->clientRandom, args->output +
49464962 args->clientRandomOffset, RAN_LEN);
@@ -4949,10 +4965,10 @@ int SendTls13ClientHello(WOLFSSL* ssl)
49494965 ret = TLSX_WriteRequest(ssl, args->ech->innerClientHello + args->idx -
49504966 (RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ), client_hello,
49514967 &args->length);
4968+ /* set the type to outer */
4969+ args->ech->type = ECH_TYPE_OUTER;
49524970 if (ret != 0)
49534971 return ret;
4954- /* set the type to outer */
4955- args->ech->type = 0;
49564972 }
49574973#endif
49584974
@@ -5707,6 +5723,9 @@ int DoTls13ServerHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
57075723 /* check for acceptConfirmation */
57085724 if (ssl->echConfigs != NULL && !ssl->options.disableECH) {
57095725 args->echX = TLSX_Find(ssl->extensions, TLSX_ECH);
5726+ if (args->echX == NULL || args->echX->data == NULL)
5727+ return WOLFSSL_FATAL_ERROR;
5728+
57105729 /* account for hrr extension instead of server random */
57115730 if (args->extMsgType == hello_retry_request) {
57125731 args->acceptOffset =
@@ -8815,6 +8834,8 @@ int CreateSigData(WOLFSSL* ssl, byte* sigData, word16* sigDataSz,
88158834 ret = GetMsgHash(ssl, &sigData[idx]);
88168835 if (ret < 0)
88178836 return ret;
8837+ if (ret == 0)
8838+ return HASH_TYPE_E;
88188839
88198840 *sigDataSz = (word16)(idx + ret);
88208841 ret = 0;
0 commit comments