parent
448f532738
commit
e43c7e3c3a
1
index.js
1
index.js
|
@ -17,6 +17,7 @@ privsec.hash = require('./lib/hash');
|
|||
privsec.point = require('./lib/point');
|
||||
privsec.privkey = require('./lib/privkey');
|
||||
privsec.pubkey = require('./lib/pubkey');
|
||||
privsec.random = require('./lib/random');
|
||||
|
||||
//privsec.key = require('lib/key');
|
||||
//privsec.script = require('lib/script');
|
||||
|
|
|
@ -0,0 +1,54 @@
|
|||
function Random() {
|
||||
};
|
||||
|
||||
/* secure random bytes that sometimes throws an error due to lack of entropy */
|
||||
Random.getRandomBuffer = function(size) {
|
||||
if (typeof process === 'undefined' || process.browser)
|
||||
return Random.getRandomBufferBrowser(size);
|
||||
else
|
||||
return Random.getRandomBufferNode(size);
|
||||
};
|
||||
|
||||
Random.getRandomBufferNode = function(size) {
|
||||
var crypto = require('crypto');
|
||||
return crypto.randomBytes(size);
|
||||
}
|
||||
|
||||
Random.getRandomBufferBrowser = function(size) {
|
||||
if (!window.crypto && !window.msCrypto)
|
||||
throw new Error('random: window.crypto not available');
|
||||
|
||||
if (window.crypto && window.crypto.getRandomValues)
|
||||
var crypto = window.crypto;
|
||||
else if (window.msCrypto && window.msCrypto.getRandomValues) //internet explorer
|
||||
var crypto = window.msCrypto;
|
||||
else
|
||||
throw new Error('random: window.crypto.getRandomValues not available');
|
||||
|
||||
var bbuf = new Uint8Array(size);
|
||||
crypto.getRandomValues(bbuf);
|
||||
var buf = new Buffer(bbuf);
|
||||
|
||||
return buf;
|
||||
};
|
||||
|
||||
/* insecure random bytes, but it never fails */
|
||||
Random.getPseudoRandomBuffer = function(size) {
|
||||
var b32 = 0x100000000;
|
||||
var b = new Buffer(size);
|
||||
|
||||
for (var i = 0; i <= size; i++) {
|
||||
var j = Math.floor(i / 4);
|
||||
var k = i - j * 4;
|
||||
if (k == 0) {
|
||||
r = Math.random() * b32;
|
||||
b[i] = r & 0xff;
|
||||
} else {
|
||||
b[i] = (r = r >>> 8) & 0xff;
|
||||
}
|
||||
}
|
||||
|
||||
return b;
|
||||
};
|
||||
|
||||
module.exports = Random;
|
|
@ -0,0 +1,61 @@
|
|||
var should = require('chai').should();
|
||||
var Random = require('../lib/random');
|
||||
|
||||
describe('Random', function() {
|
||||
|
||||
describe('getRandomBuffer', function() {
|
||||
|
||||
it('should return a buffer', function() {
|
||||
var bytes = Random.getRandomBuffer(8);
|
||||
bytes.length.should.equal(8);
|
||||
Buffer.isBuffer(bytes).should.equal(true);
|
||||
});
|
||||
|
||||
it('should not equate two 256 bit random buffers', function() {
|
||||
var bytes1 = Random.getRandomBuffer(32);
|
||||
var bytes2 = Random.getRandomBuffer(32);
|
||||
bytes1.toString('hex').should.not.equal(bytes2.toString('hex'));
|
||||
});
|
||||
|
||||
it('should generate 1000 8 byte buffers in a row that are not equal', function() {
|
||||
var bufs = [];
|
||||
for (var i = 0; i < 100; i++)
|
||||
bufs[i] = Random.getRandomBuffer(8);
|
||||
for (var i = 0; i < 100; i++)
|
||||
for (var j = i + 1; j < 100; j++)
|
||||
bufs[i].toString('hex').should.not.equal(bufs[j].toString('hex'));
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
describe('getPseudoRandomBuffer', function() {
|
||||
|
||||
it('should generate 7 random bytes', function() {
|
||||
var buf = Random.getPseudoRandomBuffer(7);
|
||||
buf.length.should.equal(7);
|
||||
});
|
||||
|
||||
it('should generate 8 random bytes', function() {
|
||||
var buf = Random.getPseudoRandomBuffer(8);
|
||||
buf.length.should.equal(8);
|
||||
});
|
||||
|
||||
it('should generate 9 random bytes', function() {
|
||||
var buf = Random.getPseudoRandomBuffer(9);
|
||||
buf.length.should.equal(9);
|
||||
});
|
||||
|
||||
it('should generate 90 random bytes', function() {
|
||||
var buf = Random.getPseudoRandomBuffer(90);
|
||||
buf.length.should.equal(90);
|
||||
});
|
||||
|
||||
it('should generate two 8 byte buffers that are not equal', function() {
|
||||
var buf1 = Random.getPseudoRandomBuffer(8);
|
||||
var buf2 = Random.getPseudoRandomBuffer(8);
|
||||
buf1.toString('hex').should.not.equal(buf2.toString('hex'));
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
});
|
Loading…
Reference in New Issue