Fix calculation of draft-13 ECH confirmation signal. Apparently both we and Go flipped the parameter order for HKDF-Extract relative to the HKDF spec. (The spec orders the salt before the key.) Not sure how that happened. Found doing interop testing with Stephen Farrell's implementation. https://pkg.go.dev/golang.org/x/crypto/hkdf#Extract https://datatracker.ietf.org/doc/html/rfc5869#section-2.2 https://datatracker.ietf.org/doc/html/draft-ietf-tls-esni-13#section-7.2 Bug: 275 Change-Id: I40a7d53b45cb548e93e6a7ae235e98e55dec4a7a Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/49185 Reviewed-by: Adam Langley <agl@google.com>
diff --git a/include/openssl/hkdf.h b/include/openssl/hkdf.h index 59aaa49..5b27acc 100644 --- a/include/openssl/hkdf.h +++ b/include/openssl/hkdf.h
@@ -41,6 +41,10 @@ // keying material |secret| and salt |salt| using |digest|, and outputs // |out_len| bytes to |out_key|. The maximum output size is |EVP_MAX_MD_SIZE|. // It returns one on success and zero on error. +// +// WARNING: This function orders the inputs differently from RFC 5869 +// specification. Double-check which parameter is the secret/IKM and which is +// the salt when using. OPENSSL_EXPORT int HKDF_extract(uint8_t *out_key, size_t *out_len, const EVP_MD *digest, const uint8_t *secret, size_t secret_len, const uint8_t *salt,
diff --git a/ssl/test/runner/prf.go b/ssl/test/runner/prf.go index f5290c3..5731be0 100644 --- a/ssl/test/runner/prf.go +++ b/ssl/test/runner/prf.go
@@ -410,7 +410,7 @@ // sections 7.2 and 7.2.1 of draft-ietf-tls-esni-13. The transcript hash is // computed by concatenating |h| with |extraMessages|. func (h *finishedHash) echAcceptConfirmation(clientRandom, label, extraMessages []byte) []byte { - secret := hkdf.Extract(h.suite.hash().New, h.zeroSecret(), clientRandom) + secret := hkdf.Extract(h.suite.hash().New, clientRandom, h.zeroSecret()) hashCopy := copyHash(h.hash, h.suite.hash()) hashCopy.Write(extraMessages) return hkdfExpandLabel(h.suite.hash(), secret, label, hashCopy.Sum(nil), echAcceptConfirmationLength)
diff --git a/ssl/tls13_enc.cc b/ssl/tls13_enc.cc index 6942887..c7b75a6 100644 --- a/ssl/tls13_enc.cc +++ b/ssl/tls13_enc.cc
@@ -565,9 +565,9 @@ uint8_t secret[EVP_MAX_MD_SIZE]; size_t secret_len; - if (!HKDF_extract(secret, &secret_len, transcript.Digest(), kZeros, - transcript.DigestLen(), client_random.data(), - client_random.size())) { + if (!HKDF_extract(secret, &secret_len, transcript.Digest(), + client_random.data(), client_random.size(), kZeros, + transcript.DigestLen())) { return false; }