From e594fab52f33786f9a51483ae26951fde1d4dcfe Mon Sep 17 00:00:00 2001 From: "Gu://em_" Date: Fri, 10 Jul 2026 19:17:22 +0200 Subject: [PATCH] Fixed remaining compilation issues --- src/crypto.zig | 10 ++++++++++ src/crypto/ed25519.zig | 25 ++++++++++++++----------- src/crypto/hkdf.zig | 6 ++++-- src/crypto/random.zig | 2 +- src/crypto/sha256.zig | 2 +- src/crypto/sha512.zig | 9 +++------ 6 files changed, 33 insertions(+), 21 deletions(-) diff --git a/src/crypto.zig b/src/crypto.zig index 7d15d16..921b0d0 100644 --- a/src/crypto.zig +++ b/src/crypto.zig @@ -11,6 +11,16 @@ const X25519= @import("crypto/x25519.zig"); const RANDOM = @import("crypto/random.zig"); +///////////////// Errors +// + +pub const CryptoError = error { + InvalidSignature, + FailedKeyGeneration, + InvalidKey, + NotImplemented +}; + ///////////////// Structs // diff --git a/src/crypto/ed25519.zig b/src/crypto/ed25519.zig index fffc743..889f713 100644 --- a/src/crypto/ed25519.zig +++ b/src/crypto/ed25519.zig @@ -1,3 +1,5 @@ +// Errors +const CryptoError = @import("../crypto.zig").CryptoError; // Constants and default implementation const Ed25519 = @import("std").crypto.sign.Ed25519; // Random number generation @@ -9,35 +11,36 @@ pub const signature_size : comptime_int = Ed25519.Signature.encoded_length; pub const Implementation = struct { - generateKeys: *const fn (pubkey_buffer: *[public_key_size]u8, privkey_buffer: *[secret_key_size]u8, rng: rngProvider) void, - sign: *const fn (key: *const [secret_key_size]u8, data: []const u8, signature_out: *const [signature_size]u8) void, - verify: *const fn (key: *const [public_key_size]u8, signature: *const [signature_size]u8, data: []const u8) void, + generateKeys: *const fn (pubkey_buffer: *[public_key_size]u8, privkey_buffer: *[secret_key_size]u8, rng: rngProvider) CryptoError!void, + sign: *const fn (key: *const [secret_key_size]u8, data: []const u8, signature_out: *const [signature_size]u8) CryptoError!void, + verify: *const fn (key: *const [public_key_size]u8, signature: *const [signature_size]u8, data: []const u8) CryptoError!void, }; pub fn generateKeys(pubkey_buffer: *[public_key_size]u8, privkey_buffer: *[secret_key_size]u8, rng: rngProvider) !void { - const seed_buffer: [Ed25519.KeyPair.seed_length]u8 = undefined; + var seed_buffer: [Ed25519.KeyPair.seed_length]u8 = undefined; rng.generate(&seed_buffer); - const keypair: Ed25519.KeyPair = try Ed25519.KeyPair.generateDeterministic(seed_buffer); + const keypair: Ed25519.KeyPair = Ed25519.KeyPair.generateDeterministic(seed_buffer) catch return CryptoError.FailedKeyGeneration; - @memcpy(pubkey_buffer[0..public_key_size], keypair.public_key.bytes); - @memcpy(privkey_buffer[0..secret_key_size], keypair.secret_key.bytes); + @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 u8, signature_out: *const [signature_size]u8) !void { _ = key; _ = data; _ = signature_out; - return error.NotImplemented; + return CryptoError.NotImplemented; } pub fn verify(key: *const [public_key_size]u8, signature: *const [signature_size]u8, data: []const u8) !void { - const sig = Ed25519.Signature.fromBytes(signature); - const pubkey = Ed25519.PublicKey.fromBytes(key); + // TODO maybe find a more efficient way to do that (excessive copies) + const sig = Ed25519.Signature.fromBytes(signature.*); + const pubkey = Ed25519.PublicKey.fromBytes(key.*) catch return CryptoError.InvalidKey; - return sig.verify(sig, data, pubkey); + return sig.verify(data, pubkey) catch CryptoError.InvalidSignature; } diff --git a/src/crypto/hkdf.zig b/src/crypto/hkdf.zig index 9565de0..d571a08 100644 --- a/src/crypto/hkdf.zig +++ b/src/crypto/hkdf.zig @@ -14,11 +14,13 @@ pub const Implementation = struct { fn expand(out: []u8, ctx: []const u8, prk: *[prk_length]u8) void { - Hkdf.expand(out, ctx, prk); + // TODO enhance efficiency (excessive copies) + Hkdf.expand(out, ctx, prk.*); } fn extract(out: *[prk_length]u8, salt: []const u8, ikm: []const u8) void { - out *= Hkdf.extract(salt, ikm); + // TODO enhance efficiency (excessive copies) + out.* = Hkdf.extract(salt, ikm); } diff --git a/src/crypto/random.zig b/src/crypto/random.zig index 48be61c..57530bb 100644 --- a/src/crypto/random.zig +++ b/src/crypto/random.zig @@ -5,7 +5,7 @@ pub const Implementation = struct { fn generate(out: []u8) void { // WARNING This is not secure at all, use only for testing purposes for(out) |*byte| { - byte *= undefined; + byte.* = undefined; } } diff --git a/src/crypto/sha256.zig b/src/crypto/sha256.zig index 647570c..34937e5 100644 --- a/src/crypto/sha256.zig +++ b/src/crypto/sha256.zig @@ -7,7 +7,7 @@ pub const Implementation = struct { hash: *const fn (buffer: []const u8, out: *[hash_len]u8) void, }; -pub fn hash(buffer: []const u8, out: *[hash_len]u8) !void { +pub fn hash(buffer: []const u8, out: *[hash_len]u8) void { Sha256.hash(buffer, out, .{}); } diff --git a/src/crypto/sha512.zig b/src/crypto/sha512.zig index 75e0aba..f42221b 100644 --- a/src/crypto/sha512.zig +++ b/src/crypto/sha512.zig @@ -1,16 +1,13 @@ -const Sha512 = @import("std").crypto.sha2.Sha512; +const Sha512 = @import("std").crypto.hash.sha2.Sha512; pub const hash_len: comptime_int = Sha512.digest_length; pub const Implementation = struct { - hash: *const fn (buffer: []const u8, out: []u8) void, + hash: *const fn (buffer: []const u8, out: *[hash_len]u8) void, }; -fn hash(buffer: []const u8, out: []u8) !void { - if (out.len < hash_len) { - return error.BufferTooShort; - } +pub fn hash(buffer: []const u8, out: *[hash_len]u8) void { Sha512.hash(buffer, out, .{}); }