Commit c41b9d7508
Changed files (1)
lib
std
crypto
lib/std/crypto/ecdsa.zig
@@ -135,20 +135,22 @@ pub fn Ecdsa(comptime Curve: type, comptime Hash: type) type {
/// The function returns a slice, that can be shorter than der_encoded_length_max.
pub fn toDer(sig: Signature, buf: *[der_encoded_length_max]u8) []u8 {
var w: std.Io.Writer = .fixed(buf);
- const r_len = @as(u8, @intCast(sig.r.len + (sig.r[0] >> 7)));
- const s_len = @as(u8, @intCast(sig.s.len + (sig.s[0] >> 7)));
+ const sig_r = mem.trimLeft(u8, &sig.r, &.{0});
+ const sig_s = mem.trimLeft(u8, &sig.s, &.{0});
+ const r_len = @as(u8, @intCast(sig_r.len + (sig_r[0] >> 7)));
+ const s_len = @as(u8, @intCast(sig_s.len + (sig_s[0] >> 7)));
const seq_len = @as(u8, @intCast(2 + r_len + 2 + s_len));
w.writeAll(&[_]u8{ 0x30, seq_len }) catch unreachable;
w.writeAll(&[_]u8{ 0x02, r_len }) catch unreachable;
- if (sig.r[0] >> 7 != 0) {
+ if (sig_r[0] >> 7 != 0) {
w.writeByte(0x00) catch unreachable;
}
- w.writeAll(&sig.r) catch unreachable;
+ w.writeAll(sig_r) catch unreachable;
w.writeAll(&[_]u8{ 0x02, s_len }) catch unreachable;
- if (sig.s[0] >> 7 != 0) {
+ if (sig_s[0] >> 7 != 0) {
w.writeByte(0x00) catch unreachable;
}
- w.writeAll(&sig.s) catch unreachable;
+ w.writeAll(sig_s) catch unreachable;
return w.buffered();
}