swactor/crates/bindings/wasm-crypto/src/lib.rs

42 lines
1.1 KiB
Rust
Raw Normal View History

#![no_std]
use core::ptr::addr_of_mut;
use ed25519_dalek::{SigningKey, Signer};
static mut BUF: [u8; 8192] = [0u8; 8192];
#[no_mangle]
pub extern "C" fn buffer_ptr() -> *const u8 {
addr_of_mut!(BUF).cast()
}
/// Read seed from BUF[0..32], write public key to BUF[32..64]
#[no_mangle]
pub extern "C" fn get_public_key() {
unsafe {
let buf = &mut *addr_of_mut!(BUF);
let seed: [u8; 32] = buf[0..32].try_into().unwrap_unchecked();
let sk = SigningKey::from_bytes(&seed);
buf[32..64].copy_from_slice(sk.verifying_key().as_bytes());
}
}
/// Read seed from BUF[0..32], message from BUF[128..128+msg_len].
/// Write 64-byte signature to BUF[64..128].
#[no_mangle]
pub extern "C" fn ed25519_sign(msg_len: usize) {
unsafe {
let buf = &mut *addr_of_mut!(BUF);
let seed: [u8; 32] = buf[0..32].try_into().unwrap_unchecked();
let msg = &buf[128..128 + msg_len];
let sk = SigningKey::from_bytes(&seed);
let sig = sk.sign(msg);
buf[64..128].copy_from_slice(&sig.to_bytes());
}
}
#[panic_handler]
fn panic(_: &core::panic::PanicInfo) -> ! {
core::arch::wasm32::unreachable()
}