diff --git a/src/ed25519.rs b/src/ed25519.rs new file mode 100644 index 0000000..c6de0ed --- /dev/null +++ b/src/ed25519.rs @@ -0,0 +1,85 @@ +pub use shared_memory_heap::sharedptr::SharedPtr; + +use crate::agent::Agent; +use std::{ + ops::Deref, path::Path, sync::{LazyLock, Mutex} +}; + +static ED25519AGENT: LazyLock> = LazyLock::new(|| { + let agent_path = std::env::var("ED25519_AGENT_PATH").expect("ED25519_AGENT_PATH environment variable missing"); + let keyfile_path = std::env::var("ED25519_KEYFILE").expect("Ed25519_KEYFILE environment variable missing"); + let agent = unsafe { Agent::new(Path::new(&agent_path), Path::new(&keyfile_path)).expect("Agent failed to start") }; + Mutex::new(agent) +}); + +#[derive(Debug)] +pub struct Ed25519PrivKey(SharedPtr); +#[derive(Debug)] +pub struct Ed25519PubKey(SharedPtr); +#[derive(Debug)] +pub struct Ed25519Signature(SharedPtr); + +impl From<&[u8; 32]> for Ed25519PubKey { + fn from(value: &[u8; 32]) -> Self { + let mut pk = SharedPtr::new(32).unwrap(); + pk.copy_from_slice(value); + Ed25519PubKey(pk) + } +} + +impl From<&[u8; 8]> for Ed25519PrivKey { + fn from(value: &[u8; 8]) -> Self { + let mut sk = SharedPtr::new(8).unwrap(); + sk.copy_from_slice(value); + Ed25519PrivKey(sk) + } +} + +impl Deref for Ed25519PrivKey { + type Target = [u8; 8]; + + fn deref(&self) -> &Self::Target { + self.0.deref().try_into().expect("this should never fail") + } +} + +impl Deref for Ed25519PubKey { + type Target = [u8; 32]; + + fn deref(&self) -> &Self::Target { + self.0.deref().try_into().expect("this should never fail") + } +} + +impl Deref for Ed25519Signature { + type Target = [u8; 32]; + + fn deref(&self) -> &Self::Target { + self.0.deref().try_into().expect("this should never fail") + } +} + +pub fn ed25519_keygen() -> (Ed25519PrivKey, Ed25519PubKey) { + let sk = Ed25519PrivKey(SharedPtr::new(8).unwrap()); + let pk = Ed25519PubKey(SharedPtr::new(32).unwrap()); + + let mut agent = ED25519AGENT.lock().unwrap(); + + unsafe { + agent.perform_ipc_call(0, &[sk.0.get_offset(), pk.0.get_offset()]); + } + + (sk, pk) +} + +pub fn ed25519_sign(sk: Ed25519PrivKey, msg: SharedPtr) -> Ed25519Signature { + let sig = Ed25519Signature(SharedPtr::new(64).unwrap()); + + let mut agent = ED25519AGENT.lock().unwrap(); + + unsafe { + agent.perform_ipc_call(1, &[sk.0.get_offset(), msg.get_offset(), msg.get_size(), sig.0.get_offset()]); + } + + sig +} diff --git a/src/lib.rs b/src/lib.rs index 1fcd708..c39a435 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -3,3 +3,4 @@ mod agent; pub mod x25519; pub mod mlkem; +pub mod ed25519;