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
+ } ;
0 commit comments