pub const Implementation = struct { pub const KEY_SIZE = 32; pub const SIGNATURE_SIZE = 64; generateKeys: *const fn (pubkey_buffer: []u8, privkey_buffer: []u8) void, sign: *const fn (key: *const [KEY_SIZE]u8, data: *const []const u8, signature_out: *const [SIGNATURE_SIZE]u8) void, verify: *const fn (key: *const [KEY_SIZE]u8, data: *const []const u8, signature: *const [SIGNATURE_SIZE]u8) void, }; // TODO pub const defaultImplementation = struct { const Ed25519 = @import("std").crypto.sign.Ed25519; pub fn generateKeys(pubkey_buffer: []u8, privkey_buffer: []u8) !void { if (Ed25519.SecretKey.encoded_length > privkey_buffer or Ed25519.SecretKey.encoded_length > privkey_buffer) { return error.BufferTooShort; } // TODO replace by a secure random number generator const keypair: Ed25519.KeyPair = try Ed25519.KeyPair.generateDeterministic(undefined); @memcpy(pubkey_buffer[0..Ed25519.PublicKey.encoded_length], keypair.public_key.bytes); @memcpy(privkey_buffer[0..Ed25519.SecretKey.encoded_length], keypair.secret_key.bytes); } pub fn sign(key: *const [32]u8, data: *const []const u8, signature_out: *const [64]u8) !void { _ = key; _ = data; _ = signature_out; return error.NotImplemented; } pub fn verify(signature: *const [64]u8, data: *const []const u8) !void { _ = signature; _ = data; return error.NotImplemented; } };