authorgravatar for 124872+jedisct1@users.noreply.github.comFrank Denis <124872+jedisct1@users.noreply.github.com> 2026-09-20 16:08:56+02:00
committergravatar for 124872+jedisct1@users.noreply.github.comFrank Denis <124872+jedisct1@users.noreply.github.com> 2026-09-22 13:34:59+02:00
logd7e71546d5cfdbc9ce0dfd2b1d27178b503eb234
treee31e8947ae664f21204e4e686db5028f3acaa552
parent20af0e10a1d4b4159f5530df1af7ec70ed12ee13

std.crypto.Certificate.rsa: fix PSS verification wrapper

In fa515299f3 the RSA verification functions were changed to accept the modulus by pointer, but the RSS verification wrapper was forgotten. Add a test by the way.

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

lib/std/crypto/Certificate.zig+17-1
...@@ -1029,7 +1029,7 @@ pub const rsa = struct {...@@ -1029,7 +1029,7 @@ pub const rsa = struct {
10291029
1030 pub fn verify(1030 pub fn verify(
1031 comptime modulus_len: usize,1031 comptime modulus_len: usize,
1032 sig: [modulus_len]u8,1032 sig: *const [modulus_len]u8,
1033 msg: []const u8,1033 msg: []const u8,
1034 public_key: PublicKey,1034 public_key: PublicKey,
1035 comptime Hash: type,1035 comptime Hash: type,
...@@ -1371,3 +1371,19 @@ pub const rsa = struct {...@@ -1371,3 +1371,19 @@ pub const rsa = struct {
1371 return res;1371 return res;
1372 }1372 }
1373};1373};
1374
1375test "RSA-PSS verify wrapper" {
1376 const modulus_hex = "a1757161bd6ddb93e4a96329dfed3cf5bd729156686893b74e36cabfc929781316ab7a2ecab1d5a0e3fe1d2ab4b14f34dbb02d3a7c879fded3b2ba26d41f554a183f906b3b32a7c11be8194d25f7a26fef17020373fea72906ba2db5259a4ab4ba91937f078bcb57f9f82b06ca6dac17a2e0b673c721b1f7d0600b208fef0d43";
1377 const signature_hex = "32079b2b70f8828e4c70331abc9f08d2ccb805b29b7330c80f4ed17ddaa8c72b544faed138e9e7d41ca55e5770f408cb13d1149da7f1c13034dc5ce0da35dfc8417a2a8bfee1056b81e73954aae23acf6113c8db5b57b4a9242fd943c59c6b693d3d5d2dc40146dd75fc631507d1e43c6ce4f5a44b243804018107ae8bcacc86";
1378 var modulus: [modulus_hex.len / 2]u8 = undefined;
1379 _ = try std.fmt.hexToBytes(&modulus, modulus_hex);
1380 var signature: [signature_hex.len / 2]u8 = undefined;
1381 _ = try std.fmt.hexToBytes(&signature, signature_hex);
1382 const key = try rsa.PublicKey.fromBytes(&.{ 1, 0, 1 }, &modulus);
1383 const message = "Zig RSA-PSS wrapper regression";
1384
1385 try rsa.PSSSignature.verify(signature.len, &signature, message, key, std.crypto.hash.sha2.Sha256);
1386 try std.testing.expectError(error.InvalidSignature, rsa.PSSSignature.verify(signature.len, &signature, "wrong message", key, std.crypto.hash.sha2.Sha256));
1387 signature[signature.len - 1] ^= 1;
1388 try std.testing.expectError(error.InvalidSignature, rsa.PSSSignature.verify(signature.len, &signature, message, key, std.crypto.hash.sha2.Sha256));
1389}