authorgravatar for 124872+jedisct1@users.noreply.github.comFrank Denis <124872+jedisct1@users.noreply.github.com> 2026-01-07 23:02:24+01:00
committergravatar for 124872+jedisct1@users.noreply.github.comFrank Denis <124872+jedisct1@users.noreply.github.com> 2026-01-07 23:02:24+01:00
log22380c78b1f9fd714ea6c89d2b902846ccf2e4f9
treef204317415a582729e1e1f3a328d38759b4a7883
parent62d6bbc7dc36dbb2f45da08e767076157deeb259

crypto.ed25519.Signer: get an std.io parameter rather than entropy

This is consistent with what all other similar functions now do, and is less dangerous.

1 files changed, 5 insertions(+), 6 deletions(-)

lib/std/crypto/25519/ed25519.zig+5-6
......@@ -392,16 +392,17 @@ pub const Ed25519 = struct {
392392 /// If set, should be something unique for each message, such as a
393393 /// random nonce, or a counter.
394394 noise: ?[noise_length]u8,
395 /// Filled with cryptographically secure randomness.
396 entropy: *const [noise_length]u8,
395 io: std.Io,
397396 ) (IdentityElementError || KeyMismatchError || NonCanonicalError || WeakPublicKeyError)!Signer {
398397 if (!mem.eql(u8, &key_pair.secret_key.publicKeyBytes(), &key_pair.public_key.toBytes())) {
399398 return error.KeyMismatch;
400399 }
401400 const scalar_and_prefix = key_pair.secret_key.scalarAndPrefix();
401 var entropy: [noise_length]u8 = undefined;
402 io.random(&entropy);
402403 var h = Sha512.init(.{});
403404 h.update(&scalar_and_prefix.prefix);
404 h.update(entropy);
405 h.update(&entropy);
405406 if (noise) |*z| {
406407 h.update(z);
407408 }
......@@ -748,9 +749,7 @@ test "signatures with streaming" {
748749 const io = std.testing.io;
749750 const kp = Ed25519.KeyPair.generate(io);
750751
751 var entropy: [Ed25519.noise_length]u8 = undefined;
752 io.random(&entropy);
753 var signer = try kp.signer(null, &entropy);
752 var signer = try kp.signer(null, io);
754753 signer.update("mes");
755754 signer.update("sage");
756755 const sig = signer.finalize();