mirror of
https://github.com/openpgpjs/openpgpjs.git
synced 2026-03-15 12:54:53 +00:00
simplify random.js
This commit is contained in:
@@ -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
|
||||
*/
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user