From 4c7669785ffa3755d42f13dd19a93611805b0cb7 Mon Sep 17 00:00:00 2001 From: "Gu://em_" Date: Wed, 8 Jul 2026 17:12:40 +0200 Subject: [PATCH] Refactored the Ed25510 module and fixed the insecure (and not functionnal) seed generation --- src/crypto/ed25519.zig | 71 ++++++++++++++++++++++++------------------ 1 file changed, 40 insertions(+), 31 deletions(-) diff --git a/src/crypto/ed25519.zig b/src/crypto/ed25519.zig index f058b62..ff6d552 100644 --- a/src/crypto/ed25519.zig +++ b/src/crypto/ed25519.zig @@ -1,41 +1,50 @@ pub const Implementation = struct { - pub const KEY_SIZE = 32; - pub const SIGNATURE_SIZE = 64; + secret_key_size: comptime_int, + public_key_size: comptime_int, + signature_size: comptime_int, - 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, + generateKeys: *const fn (pubkey_buffer: *[Implementation.public_key_size]u8, privkey_buffer: *[Implementation.secret_key_size]u8) void, + sign: *const fn (key: *const [Implementation.private_key_size]u8, data: *const []const u8, signature_out: *const [Implementation.signature_size]u8) void, + verify: *const fn (key: *const [Implementation.public_key_size]u8, data: *const []const u8, signature: *const [Implementation.signature_size]u8) void, }; -// TODO -pub const defaultImplementation = struct { +// Random number generation +const rngProvider = @import("random.zig").Implementation; - const Ed25519 = @import("std").crypto.sign.Ed25519; +pub fn defaultImplementation(comptime random: rngProvider) type { - 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); + return struct { - @memcpy(pubkey_buffer[0..Ed25519.PublicKey.encoded_length], keypair.public_key.bytes); - @memcpy(privkey_buffer[0..Ed25519.SecretKey.encoded_length], keypair.secret_key.bytes); - } + const Ed25519 = @import("std").crypto.sign.Ed25519; - 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 const secret_key_size = Ed25519.SecretKey.encoded_length; + pub const public_key_size = Ed25519.PublicKey.encoded_length; + pub const signature_size = Ed25519.Signature.encoded_length; - pub fn verify(signature: *const [64]u8, data: *const []const u8) !void { - _ = signature; - _ = data; - return error.NotImplemented; - } -}; + pub fn generateKeys(pubkey_buffer: *[Ed25519.SecretKey.encoded_length]u8, privkey_buffer: *[Ed25519.SecretKey.encoded_length]u8) !void { + + const seed_buffer: [Ed25519.KeyPair.seed_length]u8 = undefined; + random.generate(&seed_buffer); + const keypair: Ed25519.KeyPair = try Ed25519.KeyPair.generateDeterministic(seed_buffer); + + + @memcpy(pubkey_buffer[0..public_key_size], keypair.public_key.bytes); + @memcpy(privkey_buffer[0..secret_key_size], keypair.secret_key.bytes); + } + + pub fn sign(key: *const [secret_key_size]u8, data: *const []const u8, signature_out: *const [signature_size]u8) !void { + _ = key; + _ = data; + _ = signature_out; + return error.NotImplemented; + } + + pub fn verify(signature: *const [signature_size]u8, data: *const []const u8) !void { + _ = signature; + _ = data; + return error.NotImplemented; + } + }; + +}