* Initial P256 implementation * Add P256 VOPRF test vectors * Fix implementation * Forgot `Cargo.toml` and CI * Fix MSRV * Fix MSRV tests * Remove accidental leftovers * Document constants * Use included constant time checks * Add P-256 VOPRF test vector checks * Remove unnecessary bound on `CipherSuite::Group` * P-256 improvement and fixes * Add OPAQUE test vectors for P-256 * Remove fixed key size for 3DH * Hide P-256 test vectors behind feature flag * Split `Group` into modules * Fix `hash_to_scalar` * Point to source * Move constants to `once_cell` Co-authored-by: Kevin Lewi <[email protected]>
The OPAQUE key exchange protocol 
OPAQUE is an asymmetric password-authenticated key exchange protocol. It allows a client to authenticate to a server using a password, without ever having to expose the plaintext password to the server.
This implementation is based on the Internet Draft for OPAQUE.
Background
Asymmetric Password Authenticated Key Exchange (aPAKE) protocols are designed to provide password authentication and mutually authenticated key exchange without relying on PKI (except during user/password registration) and without disclosing passwords to servers or other entities other than the client machine.
OPAQUE is a PKI-free aPAKE that is secure against pre-computation attacks and capable of using a secret salt.
Documentation
The API can be found here along with an example for usage. More examples can be found in the examples directory.
Installation
Add the following line to the dependencies of your Cargo.toml:
opaque-ke = "0.6.0"
Minimum Supported Rust Version
Rust 1.51 or higher.
Resources
- OPAQUE academic publication, including formal definitions and a proof of security
- draft-irtf-cfrg-opaque-05, containing a detailed (byte-level) specification for OPAQUE
- "Let's talk about PAKE", an introductory blog post written by Matthew Green that covers OPAQUE
- opaque-wasm, a WebAssembly package for this library
Contributors
The authors of this code are Kevin Lewi (@kevinlewi) and François Garillot (@huitseeker). To learn more about contributing to this project, see this document.
Acknowledgments
Special thanks go to Hugo Krawczyk and Chris Wood for helping to clarify discrepancies and making suggestions for improving this implementation.
License
This project is MIT licensed.