Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 425de2d

Browse files
committed
Distribution
Include dist, but not lib
1 parent 1b515b6 commit 425de2d

File tree

6 files changed

+328
-20
lines changed

6 files changed

+328
-20
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
node_modules
2-
dist
32
*~
3+
.DS_Store

.npmignore

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,4 @@
11
lib
22
test
33
*~
4-
5-
.idea
6-
*.iml
7-
npm-debug.log
8-
dump.rdb
94
node_modules
10-
results.tap
11-
results.xml
12-
npm-shrinkwrap.json
13-
config.json
14-
.DS_Store
15-
*/.DS_Store
16-
*/*/.DS_Store
17-
._*
18-
*/._*
19-
*/*/._*
20-
coverage.*
21-
lib-cov
22-

dist/lib/charSet.js

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
'use strict';
2+
3+
Object.defineProperty(exports, "__esModule", {
4+
value: true
5+
});
6+
7+
var _log = require('babel-runtime/core-js/math/log2');
8+
9+
var _log2 = _interopRequireDefault(_log);
10+
11+
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
12+
13+
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
14+
15+
var _createClass2 = require('babel-runtime/helpers/createClass');
16+
17+
var _createClass3 = _interopRequireDefault(_createClass2);
18+
19+
var _lcm = require('./lcm');
20+
21+
var _lcm2 = _interopRequireDefault(_lcm);
22+
23+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
24+
25+
var CharSet = function () {
26+
function CharSet(chars) {
27+
(0, _classCallCheck3.default)(this, CharSet);
28+
29+
this.chars = chars;
30+
this.len = chars.length;
31+
this.entropyPerChar = Math.floor((0, _log2.default)(this.len));
32+
33+
if (this.entropyPerChar != (0, _log2.default)(this.len)) {
34+
throw new Error('EntropyString only supports CharSets with a power of 2 characters');
35+
}
36+
37+
this.charsPerChunk = (0, _lcm2.default)(this.entropyPerChar, 8) / this.entropyPerChar;
38+
}
39+
40+
(0, _createClass3.default)(CharSet, [{
41+
key: 'use',
42+
value: function use(chars) {
43+
var len = chars.length;
44+
// Ensure correct number of characters
45+
if (len != this.len) {
46+
throw new Error('Invalid character count');
47+
}
48+
49+
// Ensure no repeated characters
50+
for (var i = 0; i < len; i++) {
51+
var c = chars.charAt(i);
52+
for (var j = i + 1; j < len; j++) {
53+
if (c === chars.charAt(j)) {
54+
throw new Error('Characters not unique');
55+
}
56+
}
57+
}
58+
59+
this.chars = chars;
60+
}
61+
}]);
62+
return CharSet;
63+
}();
64+
65+
var charSet64 = new CharSet("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_");
66+
var charSet32 = new CharSet("2346789bdfghjmnpqrtBDFGHJLMNPQRT");
67+
var charSet16 = new CharSet("0123456789abcdef");
68+
var charSet8 = new CharSet("01234567");
69+
var charSet4 = new CharSet("ATCG");
70+
var charSet2 = new CharSet("01");
71+
72+
var isValid = function isValid(charSet) {
73+
return charSet instanceof CharSet;
74+
};
75+
76+
exports.default = {
77+
charSet64: charSet64,
78+
charSet32: charSet32,
79+
charSet16: charSet16,
80+
charSet8: charSet8,
81+
charSet4: charSet4,
82+
charSet2: charSet2,
83+
isValid: isValid
84+
};

dist/lib/entropy.js

Lines changed: 219 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,219 @@
1+
'use strict';
2+
3+
Object.defineProperty(exports, "__esModule", {
4+
value: true
5+
});
6+
7+
var _log = require('babel-runtime/core-js/math/log10');
8+
9+
var _log2 = _interopRequireDefault(_log);
10+
11+
var _log3 = require('babel-runtime/core-js/math/log2');
12+
13+
var _log4 = _interopRequireDefault(_log3);
14+
15+
var _charSet = require('./charSet');
16+
17+
var _charSet2 = _interopRequireDefault(_charSet);
18+
19+
var _lcm = require('./lcm');
20+
21+
var _lcm2 = _interopRequireDefault(_lcm);
22+
23+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
24+
25+
var crypto = require('crypto');
26+
27+
var log2 = _log4.default;
28+
var log10 = _log2.default;
29+
var log2_10 = log2(10);
30+
31+
var bits = function bits(total, risk) {
32+
if (total == 0) {
33+
return 0;
34+
}
35+
36+
var N = 0;
37+
if (total < 10001) {
38+
N = log2(total) + log2(total - 1) + log2_10 * log10(risk) - 1;
39+
} else {
40+
var n = 2 * log10(total) + log10(risk);
41+
N = n * log2_10 - 1;
42+
}
43+
return N;
44+
};
45+
46+
var bitsWithRiskPower = function bitsWithRiskPower(total, rPower) {
47+
if (total == 0) {
48+
return 0;
49+
}
50+
51+
var N = 0;
52+
if (total < 10001) {
53+
N = log2(total) + log2(total - 1) + log2_10 * rPower - 1;
54+
} else {
55+
var n = 2 * log10(total) + rPower;
56+
N = n * log2_10 - 1;
57+
}
58+
return N;
59+
};
60+
61+
var bitsWithPowers = function bitsWithPowers(tPower, rPower) {
62+
var N = 0;
63+
if (tPower < 5) {
64+
return bitsWithRiskPower(Math.pow(10, tPower), rPower);
65+
} else {
66+
var n = 2 * tPower + rPower;
67+
N = n * log2_10 - 1;
68+
}
69+
return N;
70+
};
71+
72+
var randomString = function randomString(bits, charSet) {
73+
if (!_charSet2.default.isValid(charSet)) {
74+
throw new Error('Invalid CharSet');
75+
}
76+
77+
var count = Math.ceil(bits / charSet.entropyPerChar);
78+
if (count <= 0) {
79+
return '';
80+
}
81+
82+
var bytes = randomBytes(count, charSet);
83+
84+
return randomStringWithBytes(bits, charSet, bytes);
85+
};
86+
87+
var randomStringWithBytes = function randomStringWithBytes(bits, charSet, bytes) {
88+
if (!_charSet2.default.isValid(charSet)) {
89+
console.log('WTF?');
90+
throw new Error('Invalid CharSet');
91+
}
92+
93+
if (bits <= 0) {
94+
return '';
95+
}
96+
97+
var count = Math.ceil(bits / charSet.entropyPerChar);
98+
if (count <= 0) {
99+
return '';
100+
}
101+
102+
var needed = Math.ceil(count * (charSet.entropyPerChar / 8));
103+
if (bytes.length < needed) {
104+
throw new Error('Insufficient bytes');
105+
}
106+
107+
var chunks = Math.floor(count / charSet.charsPerChunk);
108+
var partials = count % charSet.charsPerChunk;
109+
110+
var chars = void 0,
111+
ndxFn = void 0;
112+
switch (charSet) {
113+
case _charSet2.default.charSet64:
114+
chars = _charSet2.default.charSet64.chars;
115+
ndxFn = ndx64;
116+
break;
117+
case _charSet2.default.charSet32:
118+
chars = _charSet2.default.charSet32.chars;
119+
ndxFn = ndx32;
120+
break;
121+
case _charSet2.default.charSet16:
122+
chars = _charSet2.default.charSet16.chars;
123+
ndxFn = ndx16;
124+
break;
125+
case _charSet2.default.charSet8:
126+
chars = _charSet2.default.charSet8.chars;
127+
ndxFn = ndx8;
128+
break;
129+
case _charSet2.default.charSet4:
130+
chars = _charSet2.default.charSet4.chars;
131+
ndxFn = ndx4;
132+
break;
133+
case _charSet2.default.charSet2:
134+
chars = _charSet2.default.charSet2.chars;
135+
ndxFn = ndx2;
136+
break;
137+
default:
138+
break;
139+
}
140+
141+
var string = '';
142+
for (var chunk = 0; chunk < chunks; chunk++) {
143+
for (var slice = 0; slice < charSet.charsPerChunk; slice++) {
144+
var ndx = ndxFn(chunk, slice, bytes);
145+
string += chars[ndx];
146+
}
147+
}
148+
for (var _slice = 0; _slice < partials; _slice++) {
149+
var _ndx = ndxFn(chunks, _slice, bytes);
150+
string += chars[_ndx];
151+
}
152+
return string;
153+
};
154+
155+
var randomBytes = function randomBytes(count, charSet) {
156+
var bytesPerSlice = charSet.entropyPerChar / 8;
157+
var bytesNeeded = Math.ceil(count * bytesPerSlice);
158+
return Buffer.from(crypto.randomBytes(bytesNeeded));
159+
};
160+
161+
var ndx64 = function ndx64(chunk, slice, bytes) {
162+
return ndxGen(chunk, slice, bytes, 6);
163+
};
164+
165+
var ndx32 = function ndx32(chunk, slice, bytes) {
166+
return ndxGen(chunk, slice, bytes, 5);
167+
};
168+
169+
var ndx16 = function ndx16(chunk, slice, bytes) {
170+
return (bytes[chunk] << 4 * slice & 0xff) >> 4;
171+
};
172+
173+
var ndx8 = function ndx8(chunk, slice, bytes) {
174+
return ndxGen(chunk, slice, bytes, 3);
175+
};
176+
177+
var ndx4 = function ndx4(chunk, slice, bytes) {
178+
return (bytes[chunk] << 2 * slice & 0xff) >> 6;
179+
};
180+
181+
var ndx2 = function ndx2(chunk, slice, bytes) {
182+
return (bytes[chunk] << slice & 0xff) >> 7;
183+
};
184+
185+
var ndxGen = function ndxGen(chunk, slice, bytes, bitsPerSlice) {
186+
var bitsPerByte = 8;
187+
var slicesPerChunk = (0, _lcm2.default)(bitsPerSlice, bitsPerByte) / bitsPerByte;
188+
189+
var bNum = chunk * slicesPerChunk;
190+
191+
var rShift = bitsPerByte - bitsPerSlice;
192+
193+
var lOffset = Math.floor(slice * bitsPerSlice / bitsPerByte);
194+
var lShift = slice * bitsPerSlice % bitsPerByte;
195+
196+
var ndx = (bytes[bNum + lOffset] << lShift & 0xff) >> rShift;
197+
198+
var rOffset = Math.ceil(slice * bitsPerSlice / bitsPerByte);
199+
var rShiftIt = ((rOffset + 1) * bitsPerByte - (slice + 1) * bitsPerSlice) % bitsPerByte;
200+
if (rShift < rShiftIt) {
201+
ndx += bytes[bNum + rOffset] >> rShiftIt;
202+
}
203+
return ndx;
204+
};
205+
206+
exports.default = {
207+
bits: bits,
208+
bitsWithRiskPower: bitsWithRiskPower,
209+
bitsWithPowers: bitsWithPowers,
210+
randomString: randomString,
211+
randomStringWithBytes: randomStringWithBytes,
212+
213+
charSet64: _charSet2.default.charSet64,
214+
charSet32: _charSet2.default.charSet32,
215+
charSet16: _charSet2.default.charSet16,
216+
charSet8: _charSet2.default.charSet8,
217+
charSet4: _charSet2.default.charSet4,
218+
charSet2: _charSet2.default.charSet2
219+
};

dist/lib/lcm.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
"use strict";
2+
3+
Object.defineProperty(exports, "__esModule", {
4+
value: true
5+
});
6+
7+
var gcd = function gcd(a, b) {
8+
while (b != 0) {
9+
var h = a;
10+
a = b;
11+
b = h % b;
12+
// (a, b) = (b, a % b)
13+
}
14+
return Math.abs(a);
15+
};
16+
17+
// const lcm = (a, b) => {
18+
// return (a / gcd(a, b)) * b
19+
// }
20+
21+
exports.default = function (a, b) {
22+
return a / gcd(a, b) * b;
23+
};

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "entropy-string",
3-
"version": "1.0.4",
3+
"version": "1.0.5",
44
"description": "Efficiently generate cryptographically strong random strings of specified entropy from various character sets.",
55
"main": "entropy-string.js",
66
"directories": {

0 commit comments

Comments
 (0)