From 547a515952fe79d5720c2d27dc0f025ec890baaf Mon Sep 17 00:00:00 2001 From: "Gu://em_" Date: Mon, 20 Jul 2026 00:09:47 +0200 Subject: [PATCH] Implemented X25519 generateKeys and fromEd25519 functions --- src/crypto/x25519.zig | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/src/crypto/x25519.zig b/src/crypto/x25519.zig index 0d756e8..a350fa5 100644 --- a/src/crypto/x25519.zig +++ b/src/crypto/x25519.zig @@ -1,13 +1,39 @@ -//TODO +// Errors +const CryptoError = @import("../crypto.zig").CryptoError; +// Constants and default implementation +const X25519 = @import("std").crypto.dh.X25519; +const Ed25519 = @import("std").crypto.sign.Ed25519; +// Random number generation +const rngProvider = @import("random.zig").Implementation; -const X25519 = @import("std").std.crypto.dh.X25519; +pub const secret_key_length: comptime_int = X25519.secret_length; +pub const public_key_length: comptime_int = X25519.public_length; +pub const seed_length: comptime_int = X25519.seed_length; pub const Implementation = struct { + generateKeys: *const fn (pubkey_buffer: ?*[public_key_length]u8, privkey_buffer: *[secret_key_length]u8, rng: rngProvider) CryptoError!void, + fromEd25519: *const fn (ed25519_keypair: *Ed25519.Keypair, x25519_keypair: *X25519.KeyPair, rng: rngProvider) CryptoError!void, + // TODO + // maybe switch to a Keypair system based on the stdlib implementation + // generateKeys: *const fn (keypair: *X25519.KeyPair, rng: rngProvider) CryptoError!void, }; +fn generateKeys (pubkey_buffer: ?*[public_key_length]u8, privkey_buffer: *[secret_key_length]u8, rng: rngProvider) !void { + + var seed_buffer: [seed_length]u8 = undefined; + rng.generate(&seed_buffer); + const keypair: X25519.KeyPair = X25519.KeyPair.generateDeterministic(seed_buffer) catch return CryptoError.FailedKeyGeneration; + + if (pubkey_buffer != null) @memcpy(pubkey_buffer.?[0..public_key_length], &keypair.public_key.bytes); + @memcpy(privkey_buffer[0..secret_key_length], &keypair.secret_key.bytes); +} + +fn fromEd25519 (ed25519_keypair: *Ed25519.Keypair, x25519_keypair: *X25519.KeyPair) CryptoError!void { + x25519_keypair.* = X25519.KeyPair.fromEd25519(ed25519_keypair); +} + pub const defaultImplementation: Implementation = .{ - - // One problem, it uses the zig's io module, which is not supported yet as it depends on the target OS - // It may need a custom implementation or some other library + .generateKeys = generateKeys, + .fromEd25519 = fromEd25519, };