Skip to content

Commit 49c5b0e

Browse files
committed
feat: implement getRandomValues and randomUUID - resolves #213 and #214
1 parent 460a13b commit 49c5b0e

File tree

3 files changed

+43
-0
lines changed

3 files changed

+43
-0
lines changed

index.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,29 @@
11
'use strict'
22

33
exports.randomBytes = exports.rng = exports.pseudoRandomBytes = exports.prng = require('randombytes')
4+
5+
exports.getRandomValues = function (abv) {
6+
var l = abv.length
7+
while (l--) {
8+
var bytes = exports.randomBytes(7)
9+
var randomFloat = (bytes[0] % 32) / 32
10+
11+
for (var i = 0; i < bytes.length; i++) {
12+
var byte = bytes[i]
13+
randomFloat = (randomFloat + byte) / 256
14+
}
15+
16+
abv[l] = Math.floor(randomFloat * 256)
17+
}
18+
return abv
19+
}
20+
21+
exports.randomUUID = function () {
22+
return '10000000-1000-4000-8000-100000000000'.replace(/[018]/g, function (c) {
23+
return (c ^ (exports.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16)
24+
})
25+
}
26+
427
exports.createHash = exports.Hash = require('create-hash')
528
exports.createHmac = exports.Hmac = require('create-hmac')
629

test/index.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ if (!process.browser) {
55
}
66

77
require('./pbkdf2')
8+
9+
require('./random-uuid')
10+
811
try {
912
require('randombytes')(8)
1013
require('./ecdh')

test/random-uuid.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
var test = require('tape')
2+
var crypto = require('../')
3+
4+
test('randomuuid', function (t) {
5+
var uuid1 = crypto.randomUUID()
6+
var uuid2 = crypto.randomUUID()
7+
8+
t.ok(uuid1, 'first uuid truthy')
9+
t.ok(uuid2, 'second uuid truthy')
10+
11+
t.notEqual(uuid1, uuid2, 'consecutive uuid\'s do not match')
12+
13+
t.match(uuid1, /^[0-9A-F]{8}-[0-9A-F]{4}-[4][0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i, 'first uuid matches uuid regex')
14+
t.match(uuid2, /^[0-9A-F]{8}-[0-9A-F]{4}-[4][0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i, 'second uuid matches uuid regex')
15+
16+
t.end()
17+
})

0 commit comments

Comments
 (0)