aboutsummaryrefslogtreecommitdiffhomepage
path: root/oxish-graviola/src
diff options
context:
space:
mode:
Diffstat (limited to 'oxish-graviola/src')
-rw-r--r--oxish-graviola/src/lib.rs40
1 files changed, 38 insertions, 2 deletions
diff --git a/oxish-graviola/src/lib.rs b/oxish-graviola/src/lib.rs
index e170ea9..7cccdbf 100644
--- a/oxish-graviola/src/lib.rs
+++ b/oxish-graviola/src/lib.rs
@@ -126,20 +126,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,
@@ -325,6 +331,36 @@ 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 private_key =
+ x25519::PrivateKey::new_random().map_err(|_| CryptoError::NoRandomness)?;
+ let public_key = private_key.public_key().as_bytes().to_vec();
+
+ let peer = x25519::PublicKey::try_from_slice(peer_public_key)
+ .map_err(|_| CryptoError::KeyRejected)?;
+ let shared = private_key
+ .diffie_hellman(&peer)
+ .map_err(|_| CryptoError::KeyAgreementFailed)?;
+
+ Ok(AgreedKey {
+ public_key,
+ shared_secret: SharedSecret::from(shared.as_bytes().to_vec()),
+ })
+ }
+}
+
struct Ed25519Key {
key: Ed25519SigningKey,
public_key: Vec<u8>,