Swisspost 460d0e0780 sVote source code publication | 5 years ago | |
---|---|---|
.. | ||
lib | 5 years ago | |
spec | 5 years ago | |
.jshintrc | 5 years ago | |
.npmrc | 5 years ago | |
LICENSE | 5 years ago | |
README.md | 5 years ago | |
karma.conf.js | 5 years ago | |
package-lock.json | 5 years ago | |
package.json | 5 years ago | |
pom.xml | 5 years ago |
This module defines the secure random API for Scytl's JavaScript cryptographic library. The starting point for using this module is the instantiation of a secure random service.
Start by git cloning the project comm/scytl-cryptolib
from Stash
.
The source code of this module will be found in the directory scytl-cryptolib/cryptolib-js-securerandom/lib
.
To build this module, change to the directory scytl-cryptolib/cryptolib-js-securerandom
and do the following:
npm install
--or--
mvn clean install -DskipTests
The unit tests of this module will be found in the directory scytl-cryptolib/cryptolib-js-securerandom/spec
. To run the tests, change to the directory scytl-cryptolib/cryptolib-js-securerandom
and do the following:
karma test
--or--
mvn test
To only run a chosen test suite, add an f
in front of the corresponding describe
statement. For example:
fdescribe('create a secure random generator that should be able to', function()
...
To only run a chosen test, add an f
in front of the corresponding it
statement. For example:
fit('generate a specified number of random bytes', function()
...
Note: To build and test the entire scytl-cryptolib
project, change to the directory scytl-cryptolib
and do the following:
mvn clean install
To generate the JSDoc for this module, change to the directory scytl-cryptolib/cryptolib-js-securerandom
, build the module (if not already done) and do the following:
node_modules/.bin/jsdoc lib
This will generate a file called out
. Double click on the file out/index.html
to view the JSDoc.
npm
install this moduleTo npm
install this module in standalone mode, do the following:
npm install --registry https://nexus.scytl.net/content/groups/public-npm/ scytl-securerandom
To npm
install this module as a dependency of your own module, do the following:
Add the following lines to the dependencies
section of your module's package.json
file.
"scytl-bitwise": "^2.1.0",
"scytl-codec": "^2.1.0",
"scytl-securerandom": "^2.1.0",
Make sure that the .npmrc
file of your module contains the following line.
registry=https://nexus.scytl.net/content/groups/public-npm/
Install all dependencies.
npm install
The following example shows the default way to create a new instance of a secure random service.
var secureRandom = require('scytl-securerandom');
var secureRandomService = secureRandom.newService();
The secure random service accepts an optional input argument that can be used to override the default values used by the service.
For example, to provide one's own seed to initialize the PRNG used internally by the service, one could do the following, where the seed is provided as an array of bytes, wrapped in a Uint8Array object:
var myPrngSeed = ...;
var secureRandomService = secureRandom.newService({prngSeed: myPrngSeed});
In addition, the optional input argument can be used to override the default entropy collection behavior of the secure random service. A detailed description of the available fields is provided in the section How to configure the entropy collection behavior.
The following example shows the default way to create a new secure random generator.
var randomGenerator = secureRandomService.newRandomGenerator();
The following example shows how to create a new secure random generator, using a specified maximum allowed number of bytes that can be generated per method call (Default is 512):
var randomGenerator = secureRandomService.newRandomGenerator({maxNumBytes: 1024});
The following example shows how to create a new secure random generator, using a specified maximum allowed number of BigInteger digits that can be generated per method call (Default is 512):
var randomGenerator = secureRandomService.newRandomGenerator({maxNumDigits: 1024});
The following example shows how to generate an array of random bytes of length 8, wrapped in a Uint8Array
object:
var randomBytes = randomGenerator.nextBytes(8);
The following example shows how to generate a random BigInteger
object with a value that is 256 bits in length:
var randomBigInteger = randomGenerator.nextBigInteger(256);
The following example shows how to generate a random BigInteger
object with a value that contains 10 digits:
var randomBigInteger = randomGenerator.nextBigIntegerByDigits(10);
The following example shows how to generate a 16 byte random seed, wrapped in a Uint8Array
object, that can be used to initialize the PRNG of a new SecureRandomService object. If no input argument is provided, the resulting seed will be 32 bytes in length:
var randomSeed = secureRandomService.nextSeed(16);
...
var secureRandomService2 = new SecureRandomService({prngSeed: randomSeed});
Entropy collection will start as soon as the secure random service is instantiated and will stop once the required amount of entropy has been collected or when the PRNG is needed for the first time. If the WebKit entropy collector is available, it will be used exclusively. Otherwise, the entropy will be collected from a combination of several available sources (e.g. mouse movement, key board activity).
As mentioned above, the optional argument used for secure random service instantiation can be used to override the default entropy collection behavior. The available entropy related fields for the optional argument are the following:
maxEntropyCounter
: The amount of entropy to accumulate before stopping the collectors (Default is 256). It must be a positive number.hashUpdaterInterval
: The interval (in milliseconds) at which entropy data is to be hashed (Default is 1000). It must be a positive number.windowObject
: The window object provided to the collectors (Default is built-in window object).cryptoApi
: The cryptographic library supplied to the WebKit entropy collector, if being used (Default is user's built-in cryptographic library)privateKeyData
: The private key entropy collector data (By default, this collector is not used). If provided, it must consist of an object with the following two fields:
privateKeyData.privateKey
: The private key, in PEM format.privateKeyData.pinEntropy
: The PIN entropy of the private key. It must be a positive number.noDefaultCollectors
: If true, indicates that no default entropy collectors are to be used (Default is false).In addition, the SecureRandomService object defines some methods that can be used for work with entropy collection.
The following example shows how to start the entropy collection manually. It will have no effect if the SecureRandomService object is already collecting entropy. The optional input argument is a callback function that will be executed when the entropy collection process has completed.
secureRandomService.startEntropyCollection(callback);
The following example shows how to stop the entropy collection manually. It will have no effect if the SecureRandomService object is not collecting entropy. After entropy collection is stopped, the service will be reseeded using the resulting entropy as the seed. The return value of this method can be used to determine if the maximum amount of entropy required was collected:
secureRandomService.stopEntropyCollection();
--or--
var maxEntropyCollected = secureRandomService.stopEntropyCollection();
The following example shows how to retrieve the percentage of entropy collected so far, as a percentage of the maximum amount of entropy required:
secureRandomService.getEntropyPercentage();