///////////////// Imports // const AES = @import("crypto/aes.zig"); const ED25519 = @import("crypto/ed25519.zig"); const HKDF = @import("crypto/hkdf.zig"); const HMAC = @import("crypto/hmac.zig"); const SHA256 = @import("crypto/sha256.zig"); const SHA512 = @import("crypto/sha512.zig"); const X25519= @import("crypto/x25519.zig"); const RANDOM = @import("crypto/random.zig"); ///////////////// Structs // pub const PartialEngine = struct { aes_cbc256: ? AES.CBC256_Implementation = null, ed25519: ? ED25519.Implementation = null, hkdf: ? HKDF.Implementation = null, hmac: ? HMAC.Implementation = null, sha256: ? SHA256.Implementation = null, sha512: ? SHA512.Implementation = null, x25519: ? X25519.Implementation = null, random: ? RANDOM.Implementation = null, }; pub const Engine = struct { aes_cbc256: AES.CBC256_Implementation, ed25519: ED25519.Implementation, hkdf: HKDF.Implementation, hmac: HMAC.Implementation, sha256: SHA256.Implementation, sha512: SHA512.Implementation, x25519: X25519.Implementation, random: RANDOM.Implementation, }; ///////////////// Functions // // Initializes the cyrpto engine with the functions given inside Provider // These functions must follow the same structure as the struct returned by this // function and its sub-structs. pub fn resolveEngine(comptime provider: PartialEngine) Engine { // Used by other engine components const randomImpl = provider.random orelse RANDOM.defaultImplementation; return .{ .aes_cbc256 = provider.aes_cbc256 orelse AES.CBC256_DefaultImplementation, .ed25519 = provider.ed25519 orelse ED25519.DefaultImplementation(randomImpl), .hkdf = provider.hkdf orelse HKDF.DefaultImplementation, .hmac = provider.hmac orelse HMAC.DefaultImplementation, .sha256 = provider.sha256 orelse SHA256.DefaultImplementation, .sha512 = provider.sha512 orelse SHA512.DefaultImplementation, .x25519 = provider.x25519 orelse X25519.DefaultImplementation, .random = randomImpl, }; } ///////////////// Tests // const std = @import("std"); test "AES encryption defaults" { const crypto = resolveEngine(.{}); var data = [_]u8{ 1, 2, 3, 4 }; const key = [_]u8{ 1, 2, 3, 4 }; const iv = [_]u8{ 1, 2, 3, 4 }; crypto.aes_cbc256.encrypt(&data, &key, &iv); }