diff --git a/src/crypto.zig b/src/crypto.zig index 83abb09..4fa74f6 100644 --- a/src/crypto.zig +++ b/src/crypto.zig @@ -1,7 +1,3 @@ -// WARNING NOT FUNCTIONAL !!! -// This is just a draft -// TODO - ///////////////// Imports // @@ -73,5 +69,5 @@ test "AES encryption defaults" { var data = [_]u8{ 1, 2, 3, 4 }; const key = [_]u8{ 1, 2, 3, 4 }; const iv = [_]u8{ 1, 2, 3, 4 }; - crypto.Aes.CBC_265.encrypt(&data, &key, &iv); + crypto.aes_cbc256.encrypt(&data, &key, &iv); } diff --git a/src/crypto/aes.zig b/src/crypto/aes.zig index df886b2..aceb2c9 100644 --- a/src/crypto/aes.zig +++ b/src/crypto/aes.zig @@ -9,7 +9,7 @@ pub const CBC256_Implementation = struct { }; // TODO -pub const CBC265_DefaultImplementation = struct { +pub const CBC256_DefaultImplementation = struct { // Zig stdlib seems to provide no support for AES CBC265 // It may need some custom implementation or another library diff --git a/src/crypto/hkdf.zig b/src/crypto/hkdf.zig index f1e9458..05a93a8 100644 --- a/src/crypto/hkdf.zig +++ b/src/crypto/hkdf.zig @@ -1,9 +1,29 @@ pub const Implementation = struct { + prk_length: comptime_int, + + expand: *const fn (out: []u8, ctx: []const u8, prk: *[Implementation.prk_length]u8) void, + extract: *const fn (out: *[Implementation.prk_length]u8, salt: []const u8, ikm: []const u8) void, + }; pub const defaultImplementation = struct { - const Hkdf = @import("std").crypto.kdf.hkdf.Hkdf; + const Sha256 = @import("std").crypto.hash.sha2.Sha256; + + const HashImpl = Sha256; + const HmacImpl = @import("std").crypto.auth.hmac.Hmac(HashImpl); + + const Hkdf = @import("std").crypto.kdf.hkdf.Hkdf(HmacImpl); + + pub const prk_length = Hkdf.prk_length; + + pub fn expand(out: []u8, ctx: []const u8, prk: *[prk_length]u8) void { + Hkdf.expand(out, ctx, prk); + } + + pub fn extract(out: *[prk_length]u8, salt: []const u8, ikm: []const u8) void { + out *= Hkdf.extract(salt, ikm); + } }; diff --git a/src/crypto/hmac.zig b/src/crypto/hmac.zig index cb096e8..131bb20 100644 --- a/src/crypto/hmac.zig +++ b/src/crypto/hmac.zig @@ -1,15 +1,20 @@ pub const Implementation = struct { + mac_length: comptime_int, + + create: *const fn (out: *[Implementation.mac_length]u8, msg: []const u8, key: []const u8) void, }; pub const defaultImplementation = struct { - const Hmac = @import("std").crypto.auth.hmac.Hmac; + const Sha256 = @import("std").crypto.hash.sha2.Sha256; - pub fn create(out: []u8, msg: []const u8, key: []const u8) !void { - _ = out; - _ = msg; - _ = key; - return error.NotImplemented; + const HashImpl = Sha256; + const Hmac = @import("std").crypto.auth.hmac.Hmac(Sha256); + + pub const mac_length = Hmac.mac_length; + + pub fn create(out: *[mac_length]u8, msg: []const u8, key: []const u8) void { + Hmac.create(out, msg, key); } }; diff --git a/src/crypto/sha256.zig b/src/crypto/sha256.zig index 70478e0..0d913a1 100644 --- a/src/crypto/sha256.zig +++ b/src/crypto/sha256.zig @@ -1,18 +1,17 @@ pub const Implementation = struct { - hash: *const fn (buffer: []const u8, out: []u8) void, + hash_length: comptime_int, + + hash: *const fn (buffer: []const u8, out: *[Implementation.hash_length]u8) void, }; pub const defaultImplementation = struct { const Sha256 = @import("std").crypto.hash.sha2.Sha256; - const HASH_LEN = 32; // In bytes + pub const hash_len = Sha256.digest_length; - pub 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 { Sha256.hash(buffer, out, .{}); } };