oblivious_http: Overloaded Parsing method to read payload using QuicheDataReader
PiperOrigin-RevId: 482235418
diff --git a/quiche/oblivious_http/buffers/oblivious_http_request.cc b/quiche/oblivious_http/buffers/oblivious_http_request.cc
index e7903b6..76029a3 100644
--- a/quiche/oblivious_http/buffers/oblivious_http_request.cc
+++ b/quiche/oblivious_http/buffers/oblivious_http_request.cc
@@ -49,23 +49,22 @@
if (gateway_ctx == nullptr) {
return SslErrorAsStatus("Failed to initialize Gateway/Server's Context.");
}
- // TODO(anov) Add ParseOhttpPayloadHeader(QuicheDataReader) to read fields out
- // of payload, and eliminate sub-stringing.
- auto is_hdr_ok = ohttp_key_config.ParseOhttpPayloadHeader(encrypted_data);
+
+ QuicheDataReader reader(encrypted_data);
+
+ auto is_hdr_ok = ohttp_key_config.ParseOhttpPayloadHeader(reader);
if (!is_hdr_ok.ok()) {
return is_hdr_ok;
}
- absl::string_view enc_plus_ciphertext =
- encrypted_data.substr(ObliviousHttpHeaderKeyConfig::kHeaderLength);
size_t enc_key_len = EVP_HPKE_KEM_enc_len(EVP_HPKE_KEY_kem(&gateway_key));
- if (enc_plus_ciphertext.size() < enc_key_len) {
+
+ absl::string_view enc_key_received;
+ if (!reader.ReadStringPiece(&enc_key_received, enc_key_len)) {
return absl::FailedPreconditionError(absl::StrCat(
"Failed to extract encapsulation key of expected len=", enc_key_len,
"from payload."));
}
- absl::string_view enc_key_received =
- enc_plus_ciphertext.substr(0, enc_key_len);
std::string info = ohttp_key_config.SerializeRecipientContextInfo();
if (!EVP_HPKE_CTX_setup_recipient(
gateway_ctx.get(), &gateway_key, ohttp_key_config.GetHpkeKdf(),
@@ -76,9 +75,7 @@
return SslErrorAsStatus("Failed to setup recipient context");
}
- absl::string_view ciphertext_received =
- enc_plus_ciphertext.substr(enc_key_len);
-
+ absl::string_view ciphertext_received = reader.ReadRemainingPayload();
// Decrypt the message.
std::string decrypted(ciphertext_received.size(), '\0');
size_t decrypted_len;
diff --git a/quiche/oblivious_http/common/oblivious_http_header_key_config.cc b/quiche/oblivious_http/common/oblivious_http_header_key_config.cc
index d378b4c..2963ca2 100644
--- a/quiche/oblivious_http/common/oblivious_http_header_key_config.cc
+++ b/quiche/oblivious_http/common/oblivious_http_header_key_config.cc
@@ -125,6 +125,11 @@
return absl::InvalidArgumentError("Empty request payload.");
}
QuicheDataReader reader(payload_bytes);
+ return ParseOhttpPayloadHeader(reader);
+}
+
+absl::Status ObliviousHttpHeaderKeyConfig::ParseOhttpPayloadHeader(
+ QuicheDataReader& reader) const {
uint8_t key_id;
if (!reader.ReadUInt8(&key_id)) {
return absl::InvalidArgumentError("Failed to read key_id from header.");
diff --git a/quiche/oblivious_http/common/oblivious_http_header_key_config.h b/quiche/oblivious_http/common/oblivious_http_header_key_config.h
index 1c89bc3..6447bab 100644
--- a/quiche/oblivious_http/common/oblivious_http_header_key_config.h
+++ b/quiche/oblivious_http/common/oblivious_http_header_key_config.h
@@ -60,7 +60,6 @@
// https://www.ietf.org/archive/id/draft-ietf-ohai-ohttp-03.html#section-4.1-10
std::string SerializeRecipientContextInfo() const;
- // TODO(anov): Replace with ObliviousRequest/Response abstraction
// Parses the below Header
// [keyID(1 byte), kemID(2 bytes), kdfID(2 bytes), aeadID(2 bytes)]
// from the payload received in Ohttp Request, and verifies that these values
@@ -69,6 +68,14 @@
// https://www.ietf.org/archive/id/draft-ietf-ohai-ohttp-03.html#section-4.1-7
absl::Status ParseOhttpPayloadHeader(absl::string_view payload_bytes) const;
+ // Parses the Oblivious HTTP header [keyID(1 byte), kemID(2 bytes), kdfID(2
+ // bytes), aeadID(2 bytes)] from the buffer initialized within
+ // `QuicheDataReader`, and verifies these values against instantiated class
+ // data namely [key_id_, kem_id_, kdf_id_, aead_id_] for a match. On
+ // success(i.e., if matched successfully), leaves `reader` pointing at the
+ // first byte after the header.
+ absl::Status ParseOhttpPayloadHeader(QuicheDataReader& reader) const;
+
// Extracts Key ID from the OHTTP Request payload.
static absl::StatusOr<uint8_t> ParseKeyIdFromObliviousHttpRequestPayload(
absl::string_view payload_bytes);