feat: add Ed25519

This commit is contained in:
2024-10-10 17:44:15 +02:00
parent 5c4067608c
commit 14f782b46a
2 changed files with 86 additions and 0 deletions

85
src/ed25519.rs Normal file
View File

@@ -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<Mutex<Agent>> = 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
}

View File

@@ -3,3 +3,4 @@
mod agent; mod agent;
pub mod x25519; pub mod x25519;
pub mod mlkem; pub mod mlkem;
pub mod ed25519;