From 4938953741a0581614890ee83e9e28e47fd71799 Mon Sep 17 00:00:00 2001 From: cscatgirl Date: Tue, 3 Mar 2026 20:13:24 -0500 Subject: [PATCH] Fixed error with base point --- src/main.zig | 40 +++++++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/src/main.zig b/src/main.zig index dc635e8..e9c4e01 100644 --- a/src/main.zig +++ b/src/main.zig @@ -1,7 +1,7 @@ const std = @import("std"); const p: u256 = (1 << 255) - 19; -const Bx: u256 = 15112221349535807912866137220509078750507884956996801852099526895779190960831; -const By: u256 = 46316835694926478169428394003475163141307993866256225615783033011972563869189; +const Bx: u256 = 15112221349535400772501151409588531511454012693041857206046113283949847762202; +const By: u256 = 46316835694926478169428394003475163141307993866256225615783033603165251855960; const d: u256 = 37095705934669439343138083508754565189542113879843219016388785533085940283555; const Point = struct { x: u256, @@ -11,24 +11,28 @@ const Point = struct { }; const ident = Point{ .x = 0, .y = 1, .z = 1, .t = 0 }; pub fn main() !void { - var seed: [32]u8 = undefined; - std.crypto.random.bytes(&seed); - var hash = std.crypto.hash.sha2.Sha512.init(.{}); - hash.update(&seed); - const digest = hash.finalResult(); - var scalar = digest[0..32].*; - scalar[0] &= 0b11111100; - scalar[31] &= 0b01111111; - scalar[31] |= 0b01000000; - const int_num: u256 = std.mem.readInt(u256, &scalar, .little); - const B = Point{ .x = Bx, .y = By, .z = 1, .t = mul(Bx, By) }; - const product = scalar_mult(B, int_num); - const final = compress(product); var gpa: std.heap.DebugAllocator(.{}) = .init; const alloc = gpa.allocator(); defer { _ = gpa.deinit(); } + var seed: [32]u8 = undefined; + std.crypto.random.bytes(&seed); + var digest: [64]u8 = undefined; + std.crypto.hash.sha2.Sha512.hash(&seed, &digest, .{}); + + var scalar = digest[0..32].*; + scalar[0] &= 0b11111000; + scalar[31] &= 0b01111111; + scalar[31] |= 0b01000000; + const int_num: u256 = std.mem.readInt(u256, &scalar, .little); + + const B = Point{ .x = Bx, .y = By, .z = 1, .t = mul(Bx, By) }; + + const product = scalar_mult(B, int_num); + + const final = compress(product); + var args_it = try std.process.argsWithAllocator(alloc); defer args_it.deinit(); _ = args_it.next(); @@ -37,9 +41,14 @@ pub fn main() !void { const priv_pem = try encodePrivateKey(alloc, seed, final, user); defer alloc.free(pub_pem); defer alloc.free(priv_pem); + std.debug.print("{s}", .{priv_pem}); std.debug.print("{s}", .{pub_pem}); + + std.debug.print("{s}\n", .{std.fmt.bytesToHex(seed, .lower)}); + std.debug.print("{s}\n", .{std.fmt.bytesToHex(final, .lower)}); } + fn scalar_mult(pon: Point, scalar: u256) Point { var result = ident; var current = pon; @@ -100,6 +109,7 @@ fn compress(point: Point) [32]u8 { var bytes: [32]u8 = undefined; std.mem.writeInt(u256, &bytes, y, .little); + bytes[31] &= 0x7f; bytes[31] |= @as(u8, @intCast(x & 1)) << 7; return bytes;