0
Fork 0
mirror of https://github.com/penpot/penpot.git synced 2025-03-15 17:21:17 -05:00

Add uuid generation functions that uses high quality RNG.

This commit is contained in:
Andrey Antukh 2016-04-24 21:49:14 +03:00
parent 5f86df81ec
commit 6e4d243897
No known key found for this signature in database
GPG key ID: 4DFEBCB8316A8B95
3 changed files with 116 additions and 0 deletions

25
vendor/uuid/core.cljs vendored Normal file
View file

@ -0,0 +1,25 @@
;; This Source Code Form is subject to the terms of the Mozilla Public
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) 2016 Andrey Antukh <niwi@niwi.nz>
(ns uuid.core
"Provides a UUID v4 uuid generation.
In difference with builtin `random-uuid` function this
implementation tries to use high quality RNG if is
available (browser crypto object or nodejs crypto module).
If no high qualiry RNG, switches to the default Math based
RNG with proper waring in the console."
(:require [uuid.impl :as impl]))
(defn v4
"Generate a v4 (random) UUID."
[]
(uuid (impl/v4)))
(def random
"Alias for `uuid.core/v4`."
v4)

47
vendor/uuid/impl.js vendored Normal file
View file

@ -0,0 +1,47 @@
/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* Copyright (c) 2016 Andrey Antukh <niwi@niwi.nz>
*/
"use strict";
goog.provide("uuid.impl");
goog.require("uuid.rng");
goog.scope(function() {
const rng = uuid.rng;
const hexMap = [];
for (let i = 0; i < 256; i++) {
hexMap[i] = (i + 0x100).toString(16).substr(1);
}
function toHexString(buf) {
let i = 0;
return (hexMap[buf[i++]] +
hexMap[buf[i++]] +
hexMap[buf[i++]] +
hexMap[buf[i++]] + '-' +
hexMap[buf[i++]] +
hexMap[buf[i++]] + '-' +
hexMap[buf[i++]] +
hexMap[buf[i++]] + '-' +
hexMap[buf[i++]] +
hexMap[buf[i++]] + '-' +
hexMap[buf[i++]] +
hexMap[buf[i++]] +
hexMap[buf[i++]] +
hexMap[buf[i++]] +
hexMap[buf[i++]] +
hexMap[buf[i++]]);
}
uuid.impl.v4 = function() {
const buf = rng.getBytes(16);
buf[6] = (buf[6] & 0x0f) | 0x40;
buf[8] = (buf[8] & 0x3f) | 0x80;
return cljs.core.uuid(toHexString(buf));
};
})

44
vendor/uuid/rng.js vendored Normal file
View file

@ -0,0 +1,44 @@
/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* Copyright (c) 2016 Andrey Antukh <niwi@niwi.nz>
*/
"use strict";
goog.provide("uuid.rng");
goog.scope(function() {
uuid.rng.getBytes = null;
// Check if nodejs rng is available (high quality);
if (goog.global.require !== undefined) {
const crypto = goog.global.require("crypto");
uuid.rng.getBytes = function(n) {
return crypto.randomBytes(n);
};
}
// Check if whatwg rng is available (high quality);
else if (goog.global.crypto.getRandomValues !== undefined) {
uuid.rng.getBytes = function(n) {
const buf = new Uint8Array(16);
goog.global.crypto.getRandomValues(buf);
return buf;
};
}
// Switch Back to the Math.random (low quality);
else {
console.warn("No high quality RNG available, switching back to Math.random.");
uuid.rng.getBytes = function(n) {
const buf = new Array(16);
for (let i = 0, r; i < 16; i++) {
if ((i & 0x03) === 0) { r = Math.random() * 0x100000000; }
buf[i] = r >>> ((i & 0x03) << 3) & 0xff;
}
return buf;
};
}
});