simplify random.js

This commit is contained in:
Bart Butler
2018-03-05 12:18:04 -08:00
parent 3df1d849b3
commit b088f005da
6 changed files with 38 additions and 67 deletions

View File

@@ -20,7 +20,6 @@ import crypto from '../crypto';
import packet from '../packet';
const INITIAL_RANDOM_SEED = 50000; // random bytes seeded to worker
const RANDOM_SEED_REQUEST = 20000; // random bytes seeded after worker request
/**
* Initializes a new proxy and loads the web worker
@@ -75,7 +74,7 @@ AsyncProxy.prototype.onMessage = function(event) {
delete this.tasks[msg.id];
break;
case 'request-seed':
this.seedRandom(RANDOM_SEED_REQUEST);
this.seedRandom(msg.amount);
break;
default:
throw new Error('Unknown Worker Event.');
@@ -87,24 +86,10 @@ AsyncProxy.prototype.onMessage = function(event) {
* @param {Integer} size Number of bytes to send
*/
AsyncProxy.prototype.seedRandom = function(size) {
const buf = this.getRandomBuffer(size);
const buf = crypto.random.getRandomBytes(size);
this.worker.postMessage({ event:'seed-random', buf }, util.getTransferables(buf));
};
/**
* Get Uint8Array with random numbers
* @param {Integer} size Length of buffer
* @return {Uint8Array}
*/
AsyncProxy.prototype.getRandomBuffer = function(size) {
if (!size) {
return null;
}
const buf = new Uint8Array(size);
crypto.random.getRandomValues(buf);
return buf;
};
/**
* Terminates the worker
*/

View File

@@ -24,10 +24,29 @@ self.window = {}; // to make UMD bundles work
importScripts('openpgp.js');
var openpgp = window.openpgp;
var randomQueue = [];
var randomRequested = false;
var MIN_SIZE_RANDOM_BUFFER = 40000;
var MAX_SIZE_RANDOM_BUFFER = 60000;
var MIN_SIZE_RANDOM_REQUEST = 20000;
openpgp.crypto.random.randomBuffer.init(MAX_SIZE_RANDOM_BUFFER);
/**
* Handle random buffer exhaustion by requesting more random bytes from the main window
* @return {Promise<Object>} Empty promise whose resolution indicates that the buffer has been refilled
*/
function randomCallback() {
if (!randomRequested) {
self.postMessage({ event: 'request-seed', amount: MAX_SIZE_RANDOM_BUFFER });
}
randomRequested = true;
return new Promise(function(resolve, reject) {
randomQueue.push(resolve);
});
}
openpgp.crypto.random.randomBuffer.init(MAX_SIZE_RANDOM_BUFFER, randomCallback);
/**
* Handle messages from the main window.
@@ -43,6 +62,13 @@ self.onmessage = function(event) {
case 'seed-random':
seedRandom(msg.buf);
var queueCopy = randomQueue;
randomQueue = [];
for (var i = 0; i < queueCopy.length; i++) {
queueCopy[i]();
}
break;
default:
@@ -99,8 +125,8 @@ function delegate(id, method, options) {
* @param {Object} event Contains event type and data
*/
function response(event) {
if (openpgp.crypto.random.randomBuffer.size < MIN_SIZE_RANDOM_BUFFER) {
self.postMessage({ event: 'request-seed' });
if (!randomRequested && openpgp.crypto.random.randomBuffer.size < MIN_SIZE_RANDOM_BUFFER) {
self.postMessage({ event: 'request-seed', amount: MIN_SIZE_RANDOM_REQUEST });
}
self.postMessage(event, openpgp.util.getTransferables(event.data));
}