From: Steinar H. Gunderson Date: Tue, 12 Nov 2013 21:08:12 +0000 (+0100) Subject: die() if the wrong amount of randomness comes in. X-Git-Url: https://git.sesse.net/?p=www-csrf;a=commitdiff_plain;h=80a40fdedd8dc58264dd6ef1c14d679cf2291add die() if the wrong amount of randomness comes in. --- diff --git a/lib/WWW/CSRF.pm b/lib/WWW/CSRF.pm index 9197a6e..77d8e79 100644 --- a/lib/WWW/CSRF.pm +++ b/lib/WWW/CSRF.pm @@ -20,8 +20,10 @@ sub generate_csrf_token { my @digest_bytes = _to_byte_array($digest); # Mask the token to avoid the BREACH attack. - if (!defined($random) || length($random) != length($digest)) { + if (!defined($random)) { $random = Bytes::Random::Secure::random_bytes(scalar @digest_bytes); + } elsif (length($random) != length($digest)) { + die "Given randomness is of the wrong length (should be " . length($digest) . " bytes)"; } my @random_bytes = _to_byte_array($random); diff --git a/t/01_generate.t b/t/01_generate.t index 3e97a6f..a2147de 100644 --- a/t/01_generate.t +++ b/t/01_generate.t @@ -1,4 +1,4 @@ -use Test::More tests => 5; +use Test::More tests => 6; use WWW::CSRF qw(generate_csrf_token); @@ -24,3 +24,9 @@ $random = pack('H*', '112233445566778899aabbccddeeff0011223340'); is(generate_csrf_token("id", "secret", { Random => $random, Time => 1234567890 }), "5df5e9f17c929a45af5d33624ec052903599958b,112233445566778899aabbccddeeff0011223340,1234567890", "bitflip in mask flips corresponding bit in token"); + +$random = pack('H*', '112233445566778899aabbccddeeff00112233'); +eval { + my $ignored = generate_csrf_token("id", "secret", { Random => $random, Time => 1234567890 }); +}; +ok($@, "check that wrong amount of randomness causes die()");