Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WIP: Encrypted Client Hello support (client only) #1718

Draft
wants to merge 11 commits into
base: main
Choose a base branch
from

Conversation

cpu
Copy link
Member

@cpu cpu commented Jan 2, 2024

Description

This is a work in progress branch that brings encrypted client hello (ECH) compatibility to Rustls clients based on draft-ietf-tls-esni-18.

Updates #199

Limitations

  • It does not add any support for writing Rustls' servers that accept ECH (in either shared or split mode). I think client support is the most important at this stage, and this branch is already very large/complex.

  • The only HPKE provider we have available at the moment is based on HPKE-RS with a Rust Crypto backend. This means the demo application is confined to the provider-example crate. For production usage we need an HPKE provider based on ring and AWS-LC-RS. This will be handled in a separate PR, and considered a prereq for merging this one.

  • Extension compression isn't implemented yet (see Section 5.1) - this is a "MAY" I've left out for while getting the core protocol implemented. We should try to implement this pre-merge.

TODOs

  • Bogo test coverage
  • Figure out the aws-lc-rs provider panic
  • Figure out the 5 remaining bogo tests I think require adjustment on our side
  • Look at implementing the HPKE provider interface w/ aws-lc-rs's updated primitives.
  • Look at implementing ext compression
  • Additional supplementary test coverage
  • (nice-to-have) Tooling for reading ECH configs from non-DNS sources. There's an individual draft kicking around for specifying a PEM format for carrying ECH configs we should look at for potential rustls-pemfile support.
Comparison to previous PRs:

Server Name Enum

Initially we expected to update the ServerName enum to have a variant for ECH - I tried this initially and found that it didn't fit the design of ECH very well. Mainly the issue is that we need to carry a lot of additional state beyond the inner SNI name. Putting that state into the ServerName is challenging, and an impedance mismatch with the existing usage. Having separate state and the ECH variant in ServerName meant having two pieces of information and having to contend with what to do if one is present but not the other. This is also made increasingly complex since we lifted the ServerName type into the pki-types crate. As a point of reference, you can compare this branch with the approach in #663 where a ServerIdentity enum stands in for ServerName and contains a EncryptedClientHello(Box<EncryptedClientHello>) variant that holds a Box of heap allocated state.

Credit where credit is due

I started this branch by first adopting work from what @sayrer started in #663. Many thanks for kicking this effort off and giving me a solid foundation to start with!

Some major changes compared to that branch:

  • This branch updates from draft-10 to draft-17, rolling in associated changes (mostly related to confirmation, extension types, etc).
  • As discussed above, I opted to not use a ServerName variant for holding the inner SNI name and associated state.
  • I've caught up the diff to the current Rustls main, adjusting for various Codec changes and associated code drift.
  • HPKE usage is handled through the trait, abstracting away the choice of implementation as opposed to using hpke-rs directly.
  • I've implemented support for ECH confirmation across Hello Retry Requests - this in turn required reworking how the "inner" transcript is maintained, calculating the HRR confirmation, and threading through more bits of state across the handshake.
  • I've implemented support for GREASE ECH offers.
  • I've tried to avoid duplicating encoding code, instead introducing an encoding Purpose that lets us share the message encoding logic as much as possible with the exception of the parts that are unique for ECH confirmation.
  • I've tried to roll requirements into the existing code where possible to avoid duplication (e.g. updating the hash transcripts to allow forking, updating the key derivation code to allow confirmation calculation).
  • I've wired in the "ECH required" alert, and pulling out ECH retry configs from the server's encrypted extensions.
  • TODO: catch this list up for the recent push.

@cpu cpu self-assigned this Jan 2, 2024
Copy link

codecov bot commented Jan 2, 2024

Codecov Report

Attention: Patch coverage is 94.29778% with 54 lines in your changes are missing coverage. Please review.

Project coverage is 93.52%. Comparing base (06dc1d5) to head (de52ea1).

Files Patch % Lines
rustls/src/client/ech.rs 94.25% 27 Missing ⚠️
rustls/src/msgs/handshake.rs 90.58% 21 Missing ⚠️
rustls/src/error.rs 0.00% 5 Missing ⚠️
rustls/src/client/hs.rs 99.19% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main    #1718      +/-   ##
==========================================
- Coverage   95.48%   93.52%   -1.96%     
==========================================
  Files          86       95       +9     
  Lines       18664    19950    +1286     
==========================================
+ Hits        17821    18658     +837     
- Misses        843     1292     +449     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@ctz
Copy link
Member

ctz commented Jan 2, 2024

As an intermediate step it might be worthwhile to add a Go/OpenSSL server tests in CI (input here welcome!).

Definitely worth looking at the boringssl test suite -- there are ECH tests there that should be ready to go (albeit with some neccessary additions to our bogo_shim.rs). Currently they are disabled here:

https://github.com/rustls/rustls/blob/main/bogo/config.json#L34

@cpu
Copy link
Member Author

cpu commented Jan 2, 2024

Definitely worth looking at the boringssl test suite -- there are ECH tests there that should be ready to go

Oh great! Thanks for the pointer. I will focus attention there 👍

@djc
Copy link
Member

djc commented Jan 4, 2024

Might also be useful to do a bogo update before this work? I assume ECH tests may have evolved since June.

Copy link
Member

@djc djc left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looking good! I have a bunch of nits (hope that's useful at this stage) but not much substantial feedback.

I feel like the commit history overindexes a bit on small commits and might benefit from some squashing of things together so more context is available in commits.

rustls/src/crypto/hpke.rs Outdated Show resolved Hide resolved
rustls/src/crypto/hpke.rs Outdated Show resolved Hide resolved
rustls/src/enums.rs Outdated Show resolved Hide resolved
rustls/src/enums.rs Show resolved Hide resolved
rustls/src/msgs/handshake.rs Outdated Show resolved Hide resolved
rustls/src/client/hs.rs Outdated Show resolved Hide resolved
rustls/src/client/hs.rs Show resolved Hide resolved
rustls/src/client/tls13.rs Outdated Show resolved Hide resolved
rustls/src/client/tls13.rs Outdated Show resolved Hide resolved
provider-example/examples/ech-client.rs Outdated Show resolved Hide resolved
@cpu
Copy link
Member Author

cpu commented Jan 9, 2024

Now that a bunch of the smaller work has been pulled out and merged I will try to find time to rebase this and address the remaining feedback from djc's first review pass.

As a quick note: ISRG wants me to focus on finishing some of the remaining no-alloc/async work ahead of prioritizing ECH completion, so I'll be picking up work for this branch after making more progress on that front.

@ctz
Copy link
Member

ctz commented Jan 10, 2024

Might also be useful to do a bogo update before this work? I assume ECH tests may have evolved since June.

#1740

@cpu
Copy link
Member Author

cpu commented Jan 18, 2024

I needed a break from my current tasks so I rebased this branch and addressed some of the low hanging review feedback. I haven't resolved all of it yet (so probably not ready for a second pass).

@sayrer
Copy link
Contributor

sayrer commented Mar 26, 2024

It all looks good to me.

I think the Server Name Enum choices are good. I just threw stuff on the heap because I didn't really know what was going to be required. You're right that the spec is complicated and out-of-order when you sit down to write the implementation. I'd recommend reading it all the way through once before writing any more code, just to keep it all in your head. That's what I had to do a few times, anyway.

The HPKE trait is good, too. I wrote mine when rustls only had ring and didn't let one vary the dependencies, and was assuming ring would add that. I see you already have the OpenSSL server in your tests. You can find some variations that will trigger HRR via your HPKE choice here:
https://mailarchive.ietf.org/arch/msg/tls/DmMuf-CCzNNxSNY9LvxxQlu-fy4/

Those might be good for connect tests, and as a way to go once the server code is added.

As a practical matter, I think you will have to implement the handshake compression stuff. I showed up because I saw that you've added support for Kyber/X25519. In that case, you will really need it.

@cpu
Copy link
Member Author

cpu commented Mar 26, 2024

Hey sayrer,

It all looks good to me.

Awesome. Thanks so much for taking a look. I'm focused on this branch again as of the past couple of days and hope we can get it across the line soon.

I think the Server Name Enum choices are good. I just threw stuff on the heap because I didn't really know what was going to be required.

Makes sense 👍

You're right that the spec is complicated and out-of-order when you sit down to write the implementation. I'd recommend reading it all the way through once before writing any more code, just to keep it all in your head. That's what I had to do a few times, anyway.

Yeah :-( That's what I ended up doing too. It's some comfort to hear I wasn't alone in feeling this. From my perspective it feels like it's a bit too late in the document's process to try and fix the "editorial narrative" to be closer aligned to what an implementer might want. That's unfortunate but c'est la vie.

You can find some variations that will trigger HRR via your HPKE choice here:
https://mailarchive.ietf.org/arch/msg/tls/DmMuf-CCzNNxSNY9LvxxQlu-fy4/

Useful pointers, thank you 🔖

As a practical matter, I think you will have to implement the handshake compression stuff. I showed up because I saw that you've added support for Kyber/X25519. In that case, you will really need it.

100% agreed. IIRC your initial branch had an implementation of the compression (or at least the start of one). I think we'll want to revive that before merging this work. I left it out only to try and keep the scope contained while figuring out the bigger picture.

Thanks again for the feedback (and the original work!).

@sayrer
Copy link
Contributor

sayrer commented Mar 26, 2024

100% agreed. IIRC your initial branch had an implementation of the compression (or at least the start of one). I think we'll want to revive that before merging this work. I left it out only to try and keep the scope contained while figuring out the bigger picture.

I think it was a little more ready for that part than this branch, but it didn't do it either (I think it did sort the extensions to prepare, I think the draft-07 one was better). It's been a while, but it really wanted some Iter features that were nightly-only at the time. I think you can probably get a good version now.

@sayrer
Copy link
Contributor

sayrer commented Mar 28, 2024

For that reason we may want to keep this as an experimental feature, and potentially hold merging the work?

I don't think you need to be so cautious. Firefox, Chrome, and Cloudflare are all shipping it.

Screenshot 2024-03-28 at 9 48 49 AM

@dconnolly
Copy link

For that reason we may want to keep this as an experimental feature, and potentially hold merging the work?

I don't think you need to be so cautious. Firefox, Chrome, and Cloudflare are all shipping it.

ECH has gone through working group last call so it's unlikely to change significantly beyond version -18

@cpu
Copy link
Member Author

cpu commented Apr 12, 2024

cpu force-pushed the cpu-client-ech branch from 9e8d367 to 68cfb74

Pushed some progress from my local branch:

  • changed the user facing API for configuring ECH to fit into the builder paradigm.
  • git patch on add EchConfigListBytes for encrypted client hello configs pki-types#46 to experiment with a typed representation for the TLS encoded ECH config bytes. (Note; this also temporarily breaks the cargo semver and fuzzer targets/clippy since they won't play nice with the git patch).
  • adjusted to be no-std compatible throughout, removing a pile of #[cfg(feature = "std")] gates I threw all over to get the build passing before.
  • updated the ECH config handling to properly detect unsupported but mandatory ECH config extensions.
  • reworked the GREASE implementation to provide more control to the user, and to fit better into the new builder model.
  • reworked the commit history to prefer a style where pieces are introduced when they're used instead of ahead of time with dead_code allows.
  • the ech-client example program is more sophisticated and easier to use for testing.
  • some other small bits of tidying/refactoring.

I'm still working through bogo coverage and that's now my major focus. I've grokked the overall test approach and done some bogo_shim updates and initial results indicate there's a ways to go w.r.t protocol compatibility in the cornercases. In particular the client ECH bogo tests are flagging that the inner hello contains some extensions it shouldn't, and most importantly, that I believe I've broken resumption in the presence of ECH. Hope to have some more updates on this front shortly.

rustls/src/client/ech.rs Outdated Show resolved Hide resolved
@cpu
Copy link
Member Author

cpu commented Apr 26, 2024

Figure out the aws-lc-rs provider panic

I traced this down to a limit that aws-lc-rs was placing on the maximum allowable info size for an HKDF expansion. The limit in use was 80 bytes, but ECH confirmation calculations using SHA-384 or SHA-512 for the transcript digest produces info parameters of 81 and 97 bytes, exceeding the limit. I've proposed a limit increase in aws/aws-lc-rs#411 and applying a git patch on aws-lc-rs in this branch allowed restoring the bogo coverage for aws-lc-rs without any additional changes. *ring*'s impl has no similar limit and so was working without error already.

Copy link
Member

@ctz ctz left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

up to and including ech: construct ECH client hello

rustls/src/msgs/handshake.rs Outdated Show resolved Hide resolved
rustls/src/crypto/hpke.rs Outdated Show resolved Hide resolved
connect-tests/tests/ech.rs Show resolved Hide resolved
rustls/src/error.rs Outdated Show resolved Hide resolved
rustls/src/msgs/handshake.rs Outdated Show resolved Hide resolved
rustls/src/msgs/handshake.rs Outdated Show resolved Hide resolved
rustls/src/msgs/handshake.rs Outdated Show resolved Hide resolved
rustls/src/client/ech.rs Outdated Show resolved Hide resolved
Copy link
Member

@ctz ctz left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good stuff!

rustls/src/client/ech.rs Outdated Show resolved Hide resolved
rustls/tests/api.rs Outdated Show resolved Hide resolved
@cpu cpu force-pushed the cpu-client-ech branch 2 times, most recently from 7903425 to 97b8911 Compare April 29, 2024 16:38
@cpu
Copy link
Member Author

cpu commented Apr 30, 2024

Figure out the ~5 remaining bogo tests I think require adjustment on our side

I think I've gotten to the bottom of 4 of the 5 of these ignored tests (still TODO: TLS-ECH-Client-EarlyData). I'm going to have to do a little bit of refactoring to fix the issue (need to adjust HRR behaviour) so I'd suggest waiting before doing a review pass until I've pushed the update.

@cpu cpu force-pushed the cpu-client-ech branch 2 times, most recently from f7aa7c0 to 4fec0a1 Compare May 1, 2024 19:53
@cpu
Copy link
Member Author

cpu commented May 1, 2024

I'd suggest waiting before doing a review pass until I've pushed the update.

Done.

I think I've gotten to the bottom of 4 of the 5 of these ignored tests

For the curious, for 3 of the 5 tests (TLS-ECH-Client-Reject-HelloRetryRequest, TLS-ECH-Client-GREASE-IgnoreHRRExtension and TLS-ECH-GREASE-Client-TLS13-HelloRetryRequest), it was sort of two issues. The first was rejecting too early in the handshake in the HRR case and the second was incorrectly regenerating the ECH or grease ECH ext when making a second hello in the case where HRR rejects ECH or we GREASE'd.

For 1 of the 5, TLS-ECH-Client-Reject-ResumeInnerSession-TLS13, I realized it expects an :UNEXPECTED_EXTENSION: error based on the BoringSSL ECH impl not sending GREASE PSK. This is a SHOULD that BoringSSL chose not to implement but we did. As a result we return :ECH_REJECTED: for this test and have to ignore it. The resumption extension is only unexpected if the outer hello didn't include a PSK ext.

That means there's just one bogo failure left to chase down, TLS-ECH-Client-EarlyData. I will dig into this after some higher priority support work is settled.

@mishase mishase mentioned this pull request May 5, 2024
2 tasks
@cpu cpu force-pushed the cpu-client-ech branch 2 times, most recently from 944df73 to 1fa3a32 Compare May 6, 2024 18:29
@cpu
Copy link
Member Author

cpu commented May 6, 2024

That means there's just one bogo failure left to chase down, TLS-ECH-Client-EarlyData. I will dig into this after some higher priority support work is settled.

Fixed; I was using the wrong transcript/random in one more place related to the early data key schedule w/ ECH. All the bogo tests I think are relevant are now passing so I'm going to switch my focus to implementing an HPKE provider backed by aws-lc-rs.

cpu added 11 commits May 16, 2024 11:25
The SVCB/HTTPS record handling in hickory-dns 0.24 was stripping the TLS
encoded list prefix from the `ECHConfigList` that is serialized into DNS
records. This meant our previous `ech.rs` connect test was subtly wrong:
it would only ever deserialize a single `EchConfig` from what it found
in DNS.

This commit updates Rustls to:

1. Use the new `EchConfigListBytes` type from pki-types to represent
   what it gets from DNS. Soon we will have more API surface expecting
   this type.

2. Use a hickory-dns release with some upstream fixes that ensure we get
   the correct wire-encoding of the `ECHConfigList`.

3. Update the ech connect tests unit tests to assert all of the ECH
   configs that may be found are the correct version.
This commit introduces the first piece of ECH support to the public API:
configuring a client connection with an optional ECH config.

Since ECH requires TLS 1.3 we offer a configuration entry-point
`with_ech(...)` on the `ConfigBuilder<ClientConfig,
WantsVersions>` state, and fix the supported protocol versions to only
TLS 1.3.

Handling configurations in a way that will be forward compatible and
adhering to the draft spec requires some extra care. Notably we need to
be able to treat ECH configs in an ECH config list with an unsupported
version as opaque blobs. This requires splitting our config
representation into an enum with two variants: one for a recognized ECH
config and one for an unsupported one.

Similarly we need to process optional extensions in ECH config contents
to ensure that:

1. There MUST NOT be duplicate extensions.
2. We MUST parse and check for unsupported mandatory extensions.

An example TLS client that fetches ECH configurations using
DNS-over-HTTPS and configures Rustls to use ECH is added to the
`provider-example` crate. When we've implemented an ECH provider using
the `aws-lc-rs` or `*ring*` we can move the example - presently we're
relying on the RustCrypto backend of `hpke-rs` and so it's a better fit
for the provider example crate.

An updated pki-types dependency is required for the new shared
`EchConfigListBytes` type, representing raw TLS-encoded ECH
configuration data in list form.

As of this commit the ECH configuration is not used (except as a TODO to
avoid a `dead_code` warning). Subsequent commits will introduce actual
ECH offering and protocol support.
In order to support ECH we need to be prepared for
`emit_client_hello_for_retry` to return an `Error` where it was
otherwise infallible - this can occur (for e.g.) if the HPKE provider we
use for ECH encryption fails.

This commit changes `emit_client_hello_for_retry` to return
`NextStateOrError` instead of `NextState` in preparation for that.
Previously we separately iterated the `input.hello.sent_extensions` to
track our sent extensions before constructing a `ClientHelloPayload`
that contained them. The `ClientHelloPayload` was constructed in-line
for the `HandshakeMessagePayload` towards the end of
`emit_client_hello_for_retry`.

To support ECH we will want to do some additional work with the
`ClientHelloPayload`, and so this commit does some minor rearranging to
facilitate this.
This commit continues the implementation of client-side ECH support. We
now act on the provided ECH configuration when available to produce an
appropriate outer/inner client hello.

Adding this support requires introduction of a new `EchState`
struct for maintaining the required handshake state specific to ECH. We
use this in combination with new types for representing the ECH
extensions to produce the outer and inner client hello messages.

We do not yet properly handle confirmation of ECH acceptance, resulting
in decrypt errors when offering ECH. Subsequent commits will update
hello retry request and server hello handling to fix this.
This commit continues the implementation of client-side ECH by
processing the result of offering ECH in the non-HRR case. This involves
processing the received server hello, attempting to derive and match
a shared secret indicating ECH acceptance, and forwarding on our
understanding of ECH status (not offered, offered and rejected, or
offered and accepted) to later steps of the handshake.

If we arrive at the end of the handshake and our ECH offer wasn't
accepted, then we emit an appropriate alert and return an error
potentially containing ECH configs to retry with from the server's
response.

If our offer _was_ accepted, we change out the handshake transcript,
sent extensions and client hello as if the inner client hello was used
as the outer client hello. TLS handshaking continues as normal from that
point.

This level of support is sufficient for the ech-client example to
successfully use ECH with the defo.ie test server.

Importantly we do **not** yet handle the case where we offer ECH and the
server sends a hello retry request. This support will follow in
a subsequent commit.
This commit continues the implementation of client-side ECH by
supporting the case where we offer ECH and the server replies with
a hello retry request (HRR).

In this case we detect ECH acceptance in a slightly different manner. If
ECH was accepted we update the separate ECH transcript using the
received HRR and proceed to offer ECH again in our retried hello. After
this point ECH acceptance is handled as normal.

This completes the primary functionality of client-side ECH. The
remaining work involves GREASE ECH and extension compression.
In the situation where an ECH config is not available some clients may
wish to send a "GREASE" ECH extension as an anti-ossification mechanism
(see RFC 8701[0] for more information on the general concept of GREASE).

To support this we update the configuration to accept an optional ECH
mode instead of an optional ECH config. The ECH mode has a variant for
enabling ECH that holds an ECH config, and a separate variant that holds
only what's required to emit a GREASE ECH extension.

We don't automatically fall back to GREASE if ECH configs are provided
but none are compatible. If desired this should be handled by the
caller. Similarly we don't default to sending GREASE, it is opt-in.

[0]: https://www.rfc-editor.org/rfc/rfc8701
* Use docopt to make it feasible to provide args/flags
* Add flags for choosing CA cert, DNS-over-HTTPS server, etc
* Add config for performing placeholder "GREASE" ECH for hosts without
  ECH configs, doing so by default for hosts without ECH configs, and
  forcing it if desired
* Add config flag for specifying a ECH config from disk.
* Add flag for specifying how many requests to do, to test resumption.
* Asserts on the expected ECH status after handshaking.
This matches the rustls crate's current default provider choice.
Getting bogo test coverage working for ECH requires taking a (temporary)
dev-dep. on the provider-example crate so we can use the Rust Crypto
HPKE provider. This in turn means that we now have two Rustls versions
in tree, the src crate and the older version being used by the
provider example by way of hickory-dns. This will fall away when proper
HPKE support is implemented with one/both built-in crypto providers but
in the meantime requires some small adjustments in CI and the runme
script. In general the scope of a proper HPKE impl will be much less
invasive than implementing ECH so we can use this hack for now and
revisit shortly.

The bogo shim also requires some updates to support new command line
flags. Additionally in order to be able to assert some details in errors
(e.g. that an ECH required err contained expected retry configs) we have
to pipe the `Options` struct deeper into the client/server processing
logic.

Beyond these changes, it's worth discussing the ignored tests. They're
either not applicable, or need upstream bogo fixes:

"TLS-ECH-Server*":
  We ignore all the TLS-ECH-Server tests. We haven't implemented server
  side ECH yet

"TLS-ECH-Client-ExpectECHOuterExtensions"
"TLS-ECH-Client-CompressSupportedVersions":
  These rely on extension compression between inner/outer hellos. NYI.

"TLS-ECH-Client-SelectECHConfig"
"TLS-ECH-Client-NoSupportedConfigs"
  These are meant to test unsupported configs are handled correctly: we
  happen to support the HPKE ciphersuites that make them "unsupported".
  There's a fix for this upstream we can take later.

"TLS-ECH-Client-SkipInvalidPublicName*":
  Our name validation allows underscores in names. We also don't
  fallback to GREASE when there are no valid ECH configs.

"TLS-ECH-Client-NoSupportedConfigs-GREASE":
  We don't fallback to GREASE for no ECH configs.

"TLS-ECH-Client-Reject-ResumeInnerSession-TLS13":
  This test expects an unexpected extension error in the resumption
  connection, but this only happens if the outer hello didn't include
  GREASE PSK. BoringSSL's impl doesn't. Ours does. As a result we
  produce `:ECH_REJECTED:` instead of :UNEXPECTED_EXTENSION:` and have
  to ignore this test.

"TLS-ECH-Client-TLS12-RejectRetryConfigs"
"TLS-ECH-Client-Reject-NoClientCertificate-TLS12"
"TLS-ECH-Client-Reject-TLS12"
"TLS-ECH-Client-Reject-ResumeInnerSession-TLS12"
"TLS-ECH-GREASE-Client-TLS12-RejectRetryConfigs"
"TLS-ECH-Client-Reject-EarlyDataRejected-TLS12"
"TLS-ECH-Client-Reject-NoClientCertificate-TLS12-Async"
  We never offer/support TLS 1.2 when using ECH. There's no fallback to
  plaintext or GREASE for a server that won't support TLS 1.3
@cpu
Copy link
Member Author

cpu commented May 16, 2024

cpu force-pushed the cpu-client-ech branch from 1fa3a32 to de52ea1

@cpu
Copy link
Member Author

cpu commented May 21, 2024

I'm going to switch my focus to implementing an HPKE provider backed by aws-lc-rs.

First pass for this up for review: #1963 I will rebase this branch on top and remove the provider-example workaround hacks shortly.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

5 participants