diff --git a/src/identity.zig b/src/identity.zig index dee9100..e467daa 100644 --- a/src/identity.zig +++ b/src/identity.zig @@ -1,7 +1,7 @@ ///////////////// Imports // -const CryptoEngine = @import("crypto.zig").Engine; +const Crypto = @import("crypto.zig"); ///////////////// Constants // @@ -13,25 +13,25 @@ const CryptoEngine = @import("crypto.zig").Engine; // // TODO -pub fn Identity(comptime crypto_engine: CryptoEngine) type { - _ = crypto_engine; +pub fn resolveIdentity(comptime crypto_engine: Crypto.Engine) type { return struct { + const Self = @This(); + //////// Fields // - publicKey: []const u8, - privateKey: []const u8, - signature: []const u8, + privKey: [Crypto.Ed25519.secret_key_length]u8, + signatureKey: [Crypto.X25519.secret_key_size]u8, hash: []const u8, //////// Functions // - pub fn generate() !Identity { - return .{ - // .privateKey = crypto_engine.ed25519.generateKey(...), - // .signature = crypto_engine.x25519. - }; + pub fn generate() !Self { + const result: Self = undefined; + crypto_engine.ed25519.generateKeys(null, &result.signatureKey, crypto_engine.random); + // TODO privKey and signature + return result; } }; } @@ -46,3 +46,44 @@ pub fn Identity(comptime crypto_engine: CryptoEngine) type { const std = @import("std"); const expect = std.testing.expect; +const memeql = std.mem.eql; + +const testPattern: u8 = 0b10101010; +const pubkey_size = Crypto.Ed25519.public_key_length; +const privkey_size = Crypto.Ed25519.secret_key_length; + +// Fills out with alternating 0s and 1s +fn fillPattern(out: []u8) void { + for(out) |*byte| { + byte.* = testPattern; + } +} + +pub fn generateFakeKeys(pubkey_buffer: *[pubkey_size]u8, privkey_buffer: *[privkey_size]u8, rng: Crypto.Random.Implementation) Crypto.CryptoError!void { + _ = rng; + fillPattern(pubkey_buffer); + fillPattern(privkey_buffer); +} + +test "Basic identity generation" { + + const fake_rng: Crypto.Random.Implementation = .{ + .generate = fillPattern, + }; + const fake_ed25519: Crypto.Ed25519.Implementation = .{ + .generateKeys = generateFakeKeys, + }; + const crypto_engine = Crypto.resolveEngine(.{ + .random = fake_rng, + .ed25519 = fake_ed25519, + }); + + const Identity = resolveIdentity(crypto_engine); + const new_id: Identity = try Identity.generate(); + + + try expect(memeql(u8, new_id.privKey, testPattern)); + try expect(memeql(u8, new_id.signatureKey, testPattern)); + // try expect(memeql(u8, new_id.hash, testPattern)); + +}