ethers.js/src.browser/random-bytes.ts

42 lines
1.2 KiB
TypeScript
Raw Normal View History

2016-07-27 09:53:40 +03:00
'use strict';
2018-06-17 23:47:28 +03:00
import { arrayify } from '../src.ts/utils/bytes';
2018-06-15 11:18:17 +03:00
import { defineReadOnly } from '../src.ts/utils/properties';
2016-07-27 09:53:40 +03:00
2018-06-15 11:18:17 +03:00
let crypto: any = global['crypto'] || global['msCrypto'];
2016-07-27 09:53:40 +03:00
if (!crypto || !crypto.getRandomValues) {
2016-07-27 09:53:40 +03:00
console.log('WARNING: Missing strong random number source; using weak randomBytes');
2016-07-27 09:53:40 +03:00
crypto = {
2018-06-15 11:18:17 +03:00
getRandomValues: function(buffer: Uint8Array) {
for (var round = 0; round < 20; round++) {
for (var i = 0; i < buffer.length; i++) {
if (round) {
2018-06-15 11:18:17 +03:00
buffer[i] ^= Math.trunc(256 * Math.random());
} else {
2018-06-15 11:18:17 +03:00
buffer[i] = Math.trunc(256 * Math.random());
}
}
2016-07-27 09:53:40 +03:00
}
return buffer;
},
_weakCrypto: true
};
}
2018-06-15 11:18:17 +03:00
export function randomBytes(length) {
2016-07-27 09:53:40 +03:00
if (length <= 0 || length > 1024 || parseInt(length) != length) {
throw new Error('invalid length');
}
var result = new Uint8Array(length);
crypto.getRandomValues(result);
2018-06-15 11:18:17 +03:00
return arrayify(result);
2016-07-27 09:53:40 +03:00
};
if (crypto._weakCrypto === true) {
2018-06-15 11:18:17 +03:00
defineReadOnly(randomBytes, '_weakCrypto', true);
2016-07-27 09:53:40 +03:00
}