aboutsummaryrefslogtreecommitdiffhomepage
path: root/oxish-aws-lc
diff options
context:
space:
mode:
Diffstat (limited to 'oxish-aws-lc')
-rw-r--r--oxish-aws-lc/src/lib.rs47
1 files changed, 45 insertions, 2 deletions
diff --git a/oxish-aws-lc/src/lib.rs b/oxish-aws-lc/src/lib.rs
index f63f2d8..f7e95cc 100644
--- a/oxish-aws-lc/src/lib.rs
+++ b/oxish-aws-lc/src/lib.rs
@@ -118,20 +118,26 @@ impl CryptoProvider for Provider {
) -> Result<&'static dyn KeyExchange, CryptoError> {
match algorithm {
KeyExchangeAlgorithm::MlKem768X25519Sha256 => Ok(&Mlkem768X25519Kx),
+ KeyExchangeAlgorithm::Curve25519Sha256 => Ok(&X25519Kx),
_ => Err(CryptoError::UnknownAlgorithm),
}
}
fn hash(&self, algorithm: &KeyExchangeAlgorithm<'_>) -> Result<&'static dyn Hash, CryptoError> {
match algorithm {
- KeyExchangeAlgorithm::MlKem768X25519Sha256 => Ok(&Sha256),
+ KeyExchangeAlgorithm::MlKem768X25519Sha256 | KeyExchangeAlgorithm::Curve25519Sha256 => {
+ Ok(&Sha256)
+ }
_ => Err(CryptoError::UnknownAlgorithm),
}
}
fn supported_algorithms(&self) -> SupportedAlgorithms {
SupportedAlgorithms {
- key_exchange: &[KeyExchangeAlgorithm::MlKem768X25519Sha256],
+ key_exchange: &[
+ KeyExchangeAlgorithm::MlKem768X25519Sha256,
+ KeyExchangeAlgorithm::Curve25519Sha256,
+ ],
public_key: &[
PublicKeyAlgorithm::EcdsaSha2Nistp256,
PublicKeyAlgorithm::Ed25519,
@@ -334,6 +340,43 @@ impl ActiveKeyExchange for Mlkem768X25519KeyExchange {
}
}
+/// The `curve25519-sha256` key exchange
+struct X25519Kx;
+
+impl KeyExchange for X25519Kx {
+ fn start(&self) -> Result<Box<dyn ActiveKeyExchange>, CryptoError> {
+ Ok(Box::new(X25519KeyExchange))
+ }
+}
+
+struct X25519KeyExchange;
+
+impl ActiveKeyExchange for X25519KeyExchange {
+ fn complete(self: Box<Self>, peer_public_key: &[u8]) -> Result<AgreedKey, CryptoError> {
+ let random = rand::SystemRandom::new();
+ let private_key = EphemeralPrivateKey::generate(&X25519, &random)
+ .map_err(|_| CryptoError::KeyGenerationFailed)?;
+ let public_key = private_key
+ .compute_public_key()
+ .map_err(|_| CryptoError::Unspecified)?
+ .as_ref()
+ .to_vec();
+
+ let peer = agreement::UnparsedPublicKey::new(&X25519, peer_public_key);
+ let shared_secret = agreement::agree_ephemeral(
+ private_key,
+ peer,
+ CryptoError::KeyAgreementFailed,
+ |shared_secret| Ok(SharedSecret::from(shared_secret.to_vec())),
+ )?;
+
+ Ok(AgreedKey {
+ public_key,
+ shared_secret,
+ })
+ }
+}
+
struct Ed25519SigningKey {
key_pair: Ed25519KeyPair,
public_key: Vec<u8>,