| var test = require('tape') |
| var crypto = require('../') |
| |
| var randomBytesFunctions = { |
| randomBytes: require('randombytes'), |
| pseudoRandomBytes: crypto.pseudoRandomBytes |
| } |
| |
| for (var randomBytesName in randomBytesFunctions) { |
| // Both randomBytes and pseudoRandomBytes should provide the same interface |
| var randomBytes = randomBytesFunctions[randomBytesName] |
| |
| test('get error message', function (t) { |
| try { |
| var b = randomBytes(10) |
| t.ok(Buffer.isBuffer(b)) |
| t.end() |
| } catch (err) { |
| t.ok(/not supported/.test(err.message), '"not supported" is in error message') |
| t.end() |
| } |
| }) |
| |
| test(randomBytesName, function (t) { |
| t.plan(5) |
| t.equal(randomBytes(10).length, 10) |
| t.ok(Buffer.isBuffer(randomBytes(10))) |
| randomBytes(10, function (ex, bytes) { |
| t.error(ex) |
| t.equal(bytes.length, 10) |
| t.ok(Buffer.isBuffer(bytes)) |
| t.end() |
| }) |
| }) |
| |
| test(randomBytesName + ' seem random', function (t) { |
| var L = 1000 |
| var b = randomBytes(L) |
| |
| var mean = [].reduce.call(b, function (a, b) { return a + b }, 0) / L |
| |
| // test that the random numbers are plausably random. |
| // Math.random() will pass this, but this will catch |
| // terrible mistakes such as this blunder: |
| // https://github.com/dominictarr/crypto-browserify/commit/3267955e1df7edd1680e52aeede9a89506ed2464#commitcomment-7916835 |
| |
| // this doesn't check that the bytes are in a random *order* |
| // but it's better than nothing. |
| |
| var expected = 256 / 2 |
| var smean = Math.sqrt(mean) |
| |
| // console.log doesn't work right on testling, *grumble grumble* |
| console.log(JSON.stringify([expected - smean, mean, expected + smean])) |
| t.ok(mean < expected + smean) |
| t.ok(mean > expected - smean) |
| |
| t.end() |
| }) |
| } |