authorgravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-07-16 22:27:30 -07:00
committergravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-07-16 22:27:30 -07:00
logefb495816d077c75aacac593036d0dc2b22bd5c9
tree641a3a2b8101821d801a27a3dd6c611554493f1c
parentbc0b3669c619c1093e903ce41300df3e3571a6e1
signaturebadge-check Signed by SSH key SHA256:4hHJbtBRU58AYXwjL7fkz2fnQHdiye8x1QpTCQ0sHNw

Signature: ssh: support ecdsa-sha2-nistp384


1 files changed, 23 insertions(+), 1 deletions(-)

git.zig+23-1
......@@ -2596,9 +2596,31 @@ pub const Signature = union(enum) {
25962596 const sig = ns.Signature.fromBytes((r[0..C.scalar.encoded_length] ++ s[0..C.scalar.encoded_length]).*);
25972597 valid = if (sig.verify(signed_data.items, pk)) true else |_| false;
25982598 }
2599 if (std.mem.eql(u8, sigformat, "ecdsa-sha2-nistp384")) blk: {
2600 const C = std.crypto.ecc.P384;
2601 const H = std.crypto.hash.sha2.Sha384;
2602 const ns = std.crypto.sign.ecdsa.Ecdsa(C, H);
2603 const ident_len = pkfixed.readInt(u32, .big) catch break :blk;
2604 if (ident_len != "nistp384".len) break :blk;
2605 if (!(pkfixed.readExpected("nistp384") catch break :blk)) break :blk;
2606 const q_len = pkfixed.readInt(u32, .big) catch break :blk;
2607 const q = pkfixed.readSlice(q_len) catch break :blk;
2608 const pk = ns.PublicKey.fromSec1(q) catch break :blk;
2609 const sigblob_len = sigfixed.readInt(u32, .big) catch break :blk;
2610 _ = sigblob_len;
2611 const r_len = sigfixed.readInt(u32, .big) catch break :blk;
2612 var r = sigfixed.readSlice(r_len) catch break :blk;
2613 if (r[0] == 0) r = r[1..];
2614 if (r.len != C.scalar.encoded_length) break :blk;
2615 const s_len = sigfixed.readInt(u32, .big) catch break :blk;
2616 var s = sigfixed.readSlice(s_len) catch break :blk;
2617 if (s[0] == 0) s = s[1..];
2618 if (s.len != C.scalar.encoded_length) break :blk;
2619 const sig = ns.Signature.fromBytes((r[0..C.scalar.encoded_length] ++ s[0..C.scalar.encoded_length]).*);
2620 valid = if (sig.verify(signed_data.items, pk)) true else |_| false;
2621 }
25992622 // ssh-dss (dsa)
26002623 // sk-ecdsa-sha2-nistp256@openssh.com
2601 // ecdsa-sha2-nistp384
26022624 // ecdsa-sha2-nistp521
26032625 // sk-ssh-ed25519@openssh.com
26042626 // rsa-sha2-256