querysub 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (169) hide show
  1. package/.dependency-cruiser.js +304 -0
  2. package/.eslintrc.js +51 -0
  3. package/.github/copilot-instructions.md +1 -0
  4. package/.vscode/settings.json +25 -0
  5. package/bin/deploy.js +4 -0
  6. package/bin/function.js +4 -0
  7. package/bin/server.js +4 -0
  8. package/costsBenefits.txt +112 -0
  9. package/deploy.ts +3 -0
  10. package/inject.ts +1 -0
  11. package/package.json +60 -0
  12. package/prompts.txt +54 -0
  13. package/spec.txt +820 -0
  14. package/src/-a-archives/archiveCache.ts +913 -0
  15. package/src/-a-archives/archives.ts +148 -0
  16. package/src/-a-archives/archivesBackBlaze.ts +792 -0
  17. package/src/-a-archives/archivesDisk.ts +418 -0
  18. package/src/-a-archives/copyLocalToBackblaze.ts +24 -0
  19. package/src/-a-auth/certs.ts +517 -0
  20. package/src/-a-auth/der.ts +122 -0
  21. package/src/-a-auth/ed25519.ts +1015 -0
  22. package/src/-a-auth/node-forge-ed25519.d.ts +17 -0
  23. package/src/-b-authorities/dnsAuthority.ts +203 -0
  24. package/src/-b-authorities/emailAuthority.ts +57 -0
  25. package/src/-c-identity/IdentityController.ts +200 -0
  26. package/src/-d-trust/NetworkTrust2.ts +150 -0
  27. package/src/-e-certs/EdgeCertController.ts +288 -0
  28. package/src/-e-certs/certAuthority.ts +192 -0
  29. package/src/-f-node-discovery/NodeDiscovery.ts +543 -0
  30. package/src/-g-core-values/NodeCapabilities.ts +134 -0
  31. package/src/-g-core-values/oneTimeForward.ts +91 -0
  32. package/src/-h-path-value-serialize/PathValueSerializer.ts +769 -0
  33. package/src/-h-path-value-serialize/stringSerializer.ts +176 -0
  34. package/src/0-path-value-core/LoggingClient.tsx +24 -0
  35. package/src/0-path-value-core/NodePathAuthorities.ts +978 -0
  36. package/src/0-path-value-core/PathController.ts +1 -0
  37. package/src/0-path-value-core/PathValueCommitter.ts +565 -0
  38. package/src/0-path-value-core/PathValueController.ts +231 -0
  39. package/src/0-path-value-core/archiveLocks/ArchiveLocks.ts +154 -0
  40. package/src/0-path-value-core/archiveLocks/ArchiveLocks2.ts +820 -0
  41. package/src/0-path-value-core/archiveLocks/archiveSnapshots.ts +180 -0
  42. package/src/0-path-value-core/debugLogs.ts +90 -0
  43. package/src/0-path-value-core/pathValueArchives.ts +483 -0
  44. package/src/0-path-value-core/pathValueCore.ts +2217 -0
  45. package/src/1-path-client/RemoteWatcher.ts +558 -0
  46. package/src/1-path-client/pathValueClientWatcher.ts +702 -0
  47. package/src/2-proxy/PathValueProxyWatcher.ts +1857 -0
  48. package/src/2-proxy/archiveMoveHarness.ts +376 -0
  49. package/src/2-proxy/garbageCollection.ts +753 -0
  50. package/src/2-proxy/pathDatabaseProxyBase.ts +37 -0
  51. package/src/2-proxy/pathValueProxy.ts +139 -0
  52. package/src/2-proxy/schema2.ts +518 -0
  53. package/src/3-path-functions/PathFunctionHelpers.ts +129 -0
  54. package/src/3-path-functions/PathFunctionRunner.ts +619 -0
  55. package/src/3-path-functions/PathFunctionRunnerMain.ts +67 -0
  56. package/src/3-path-functions/deployBlock.ts +10 -0
  57. package/src/3-path-functions/deployCheck.ts +7 -0
  58. package/src/3-path-functions/deployMain.ts +160 -0
  59. package/src/3-path-functions/pathFunctionLoader.ts +282 -0
  60. package/src/3-path-functions/syncSchema.ts +475 -0
  61. package/src/3-path-functions/tests/functionsTest.ts +135 -0
  62. package/src/3-path-functions/tests/rejectTest.ts +77 -0
  63. package/src/4-dom/css.tsx +29 -0
  64. package/src/4-dom/cssTypes.d.ts +212 -0
  65. package/src/4-dom/qreact.tsx +2322 -0
  66. package/src/4-dom/qreactTest.tsx +417 -0
  67. package/src/4-querysub/Querysub.ts +877 -0
  68. package/src/4-querysub/QuerysubController.ts +620 -0
  69. package/src/4-querysub/copyEvent.ts +0 -0
  70. package/src/4-querysub/permissions.ts +289 -0
  71. package/src/4-querysub/permissionsShared.ts +1 -0
  72. package/src/4-querysub/querysubPrediction.ts +525 -0
  73. package/src/5-diagnostics/FullscreenModal.tsx +67 -0
  74. package/src/5-diagnostics/GenericFormat.tsx +165 -0
  75. package/src/5-diagnostics/Modal.tsx +79 -0
  76. package/src/5-diagnostics/Table.tsx +183 -0
  77. package/src/5-diagnostics/TimeGrouper.tsx +114 -0
  78. package/src/5-diagnostics/diskValueAudit.ts +216 -0
  79. package/src/5-diagnostics/memoryValueAudit.ts +442 -0
  80. package/src/5-diagnostics/nodeMetadata.ts +135 -0
  81. package/src/5-diagnostics/qreactDebug.tsx +309 -0
  82. package/src/5-diagnostics/shared.ts +26 -0
  83. package/src/5-diagnostics/synchronousLagTracking.ts +47 -0
  84. package/src/TestController.ts +35 -0
  85. package/src/allowclient.flag +0 -0
  86. package/src/bits.ts +86 -0
  87. package/src/buffers.ts +69 -0
  88. package/src/config.ts +53 -0
  89. package/src/config2.ts +48 -0
  90. package/src/diagnostics/ActionsHistory.ts +56 -0
  91. package/src/diagnostics/NodeViewer.tsx +503 -0
  92. package/src/diagnostics/SizeLimiter.ts +62 -0
  93. package/src/diagnostics/TimeDebug.tsx +18 -0
  94. package/src/diagnostics/benchmark.ts +139 -0
  95. package/src/diagnostics/errorLogs/ErrorLogController.ts +515 -0
  96. package/src/diagnostics/errorLogs/ErrorLogCore.ts +274 -0
  97. package/src/diagnostics/errorLogs/LogClassifiers.tsx +302 -0
  98. package/src/diagnostics/errorLogs/LogFilterUI.tsx +84 -0
  99. package/src/diagnostics/errorLogs/LogNotify.tsx +101 -0
  100. package/src/diagnostics/errorLogs/LogTimeSelector.tsx +724 -0
  101. package/src/diagnostics/errorLogs/LogViewer.tsx +757 -0
  102. package/src/diagnostics/errorLogs/hookErrors.ts +60 -0
  103. package/src/diagnostics/errorLogs/logFiltering.tsx +149 -0
  104. package/src/diagnostics/heapTag.ts +13 -0
  105. package/src/diagnostics/listenOnDebugger.ts +77 -0
  106. package/src/diagnostics/logs/DiskLoggerPage.tsx +572 -0
  107. package/src/diagnostics/logs/ObjectDisplay.tsx +165 -0
  108. package/src/diagnostics/logs/ansiFormat.ts +108 -0
  109. package/src/diagnostics/logs/diskLogGlobalContext.ts +38 -0
  110. package/src/diagnostics/logs/diskLogger.ts +305 -0
  111. package/src/diagnostics/logs/diskShimConsoleLogs.ts +32 -0
  112. package/src/diagnostics/logs/injectFileLocationToConsole.ts +50 -0
  113. package/src/diagnostics/logs/logGitHashes.ts +30 -0
  114. package/src/diagnostics/managementPages.tsx +289 -0
  115. package/src/diagnostics/periodic.ts +89 -0
  116. package/src/diagnostics/runSaturationTest.ts +416 -0
  117. package/src/diagnostics/satSchema.ts +64 -0
  118. package/src/diagnostics/trackResources.ts +82 -0
  119. package/src/diagnostics/watchdog.ts +55 -0
  120. package/src/errors.ts +132 -0
  121. package/src/forceProduction.ts +3 -0
  122. package/src/fs.ts +72 -0
  123. package/src/heapDumps.ts +666 -0
  124. package/src/https.ts +2 -0
  125. package/src/inject.ts +1 -0
  126. package/src/library-components/ATag.tsx +84 -0
  127. package/src/library-components/Button.tsx +344 -0
  128. package/src/library-components/ButtonSelector.tsx +64 -0
  129. package/src/library-components/DropdownCustom.tsx +151 -0
  130. package/src/library-components/DropdownSelector.tsx +32 -0
  131. package/src/library-components/Input.tsx +334 -0
  132. package/src/library-components/InputLabel.tsx +198 -0
  133. package/src/library-components/InputPicker.tsx +125 -0
  134. package/src/library-components/LazyComponent.tsx +62 -0
  135. package/src/library-components/MeasureHeightCSS.tsx +48 -0
  136. package/src/library-components/MeasuredDiv.tsx +47 -0
  137. package/src/library-components/ShowMore.tsx +51 -0
  138. package/src/library-components/SyncedController.ts +171 -0
  139. package/src/library-components/TimeRangeSelector.tsx +407 -0
  140. package/src/library-components/URLParam.ts +263 -0
  141. package/src/library-components/colors.tsx +14 -0
  142. package/src/library-components/drag.ts +114 -0
  143. package/src/library-components/icons.tsx +692 -0
  144. package/src/library-components/niceStringify.ts +50 -0
  145. package/src/library-components/renderToString.ts +52 -0
  146. package/src/misc/PromiseRace.ts +101 -0
  147. package/src/misc/color.ts +30 -0
  148. package/src/misc/getParentProcessId.cs +53 -0
  149. package/src/misc/getParentProcessId.ts +53 -0
  150. package/src/misc/hash.ts +83 -0
  151. package/src/misc/ipPong.js +13 -0
  152. package/src/misc/networking.ts +2 -0
  153. package/src/misc/random.ts +45 -0
  154. package/src/misc.ts +19 -0
  155. package/src/noserverhotreload.flag +0 -0
  156. package/src/path.ts +226 -0
  157. package/src/persistentLocalStore.ts +37 -0
  158. package/src/promise.ts +15 -0
  159. package/src/server.ts +73 -0
  160. package/src/src.d.ts +1 -0
  161. package/src/test/heapProcess.ts +36 -0
  162. package/src/test/mongoSatTest.tsx +55 -0
  163. package/src/test/satTest.ts +193 -0
  164. package/src/test/test.tsx +552 -0
  165. package/src/zip.ts +92 -0
  166. package/src/zipThreaded.ts +106 -0
  167. package/src/zipThreadedWorker.js +19 -0
  168. package/tsconfig.json +27 -0
  169. package/yarnSpec.txt +56 -0
@@ -0,0 +1,1015 @@
1
+ module.allowclient = true;
2
+
3
+ // https://letsencrypt.org/docs/a-warm-welcome-to-asn1-and-der/
4
+ // https://lapo.it/asn1js/#MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgdtVjL6oGqHBkD_SAu21f9qTJRi5s1Se0KGgWwj-K-kyhRANCAARtS6Pi8viOgF3GvXA8XZop4jj9LHDW5NS-Z6YHPc5I-a93SXyD6MVj-Gf4rQh41P5fZIXVU957tJIh0VU5hv7G
5
+ // https://datatracker.ietf.org/doc/html/rfc8410#section-10.3
6
+
7
+ // NOTE: We could make this synchronous by moving sha512 to be inline (it is about 1000 lines),
8
+ // and by removing support for RSA (which is fine, there is no reason to move back to it from ED25519).
9
+ export async function signWithPEM(config: {
10
+ pem: Buffer | string;
11
+ data: object | string | number | boolean;
12
+ }): Promise<Buffer> {
13
+ let { pem, data } = config;
14
+ let inputMessageStr = JSON.stringify(data);
15
+ let inputMessage = Buffer.from(inputMessageStr);
16
+ function isED25519(key: string | Buffer) {
17
+ return key.length < 256;
18
+ }
19
+ if (isED25519(pem)) {
20
+ let key = extractRawED25519PrivateKey(pem);
21
+ let signature = await signED25519(key, inputMessage);
22
+ return signature;
23
+ } else {
24
+ let key = await globalThis.crypto.subtle.importKey("spki", Buffer.from(pem), { name: "RSASSA-PKCS1-v1_5", hash: "SHA-256" }, false, ["sign"]);
25
+ let signatureBuffer = await globalThis.crypto.subtle.sign("RSASSA-PKCS1-v1_5", key, inputMessage);
26
+ return Buffer.from(signatureBuffer);
27
+ }
28
+ }
29
+
30
+ export function extractRawED25519PrivateKey(pem: string | Buffer) {
31
+ let keyPart = pem.toString().replaceAll("-----BEGIN PRIVATE KEY-----", "").replaceAll("-----END PRIVATE KEY-----", "").replaceAll("\n", "").replaceAll("\r", "");
32
+ let forgeParsed = berTagParser(Buffer.from(keyPart, "base64"));
33
+ return forgeParsed[0].children![2].data.slice(2, 2 + 32);
34
+ }
35
+ function wrapWithPEM(rawED25519Key: Buffer) {
36
+ let forgeBase = encodeBerTags([
37
+ { type: tagLookup.OCTET_STRING, data: rawED25519Key, }
38
+ ]);
39
+ let forgeValue = encodeBerTags([
40
+ {
41
+ type: tagLookup.SEQUENCE,
42
+ children: [
43
+ { type: tagLookup.INTEGER, data: [0], },
44
+ {
45
+ type: tagLookup.SEQUENCE,
46
+ children: [
47
+ { type: tagLookup.OBJECT_IDENTIFIER, data: [43, 101, 112], }
48
+ ]
49
+ },
50
+ { type: tagLookup.OCTET_STRING, data: forgeBase, }
51
+ ],
52
+ }
53
+ ]);
54
+
55
+ return "-----BEGIN PRIVATE KEY-----\n" + forgeValue.toString("base64") + "\n-----END PRIVATE KEY-----";
56
+ }
57
+
58
+ export async function signED25519(privateKey: Buffer, inputMessage: Buffer): Promise<Buffer> {
59
+ if (privateKey.length !== 32) {
60
+ throw new Error(`Invalid private key length, expected 32, got ${privateKey.length}`);
61
+ }
62
+ var pk = Buffer.alloc(32);
63
+ var sk = Buffer.alloc(64);
64
+ privateKey.copy(sk);
65
+ await crypto_sign_keypair(pk, sk);
66
+
67
+ let signedOutput = Buffer.alloc(64 + inputMessage.length);
68
+ await crypto_sign(signedOutput, inputMessage, sk);
69
+ return signedOutput.slice(0, 64);
70
+ }
71
+ export async function extractPublicKey(privateKey: Buffer): Promise<Buffer> {
72
+ if (privateKey.length !== 32) throw new Error(`Invalid private key length, expected 32, got ${privateKey.length}. Only ED25519 is presently supported`);
73
+ var pk = Buffer.alloc(32);
74
+ var sk = Buffer.alloc(64);
75
+ privateKey.copy(sk);
76
+ await crypto_sign_keypair(pk, sk);
77
+ return pk;
78
+ }
79
+ export async function verifyED25519(publicKey: Buffer, inputMessage: Buffer, signature: Buffer): Promise<boolean> {
80
+ var sm = Buffer.alloc(64 + inputMessage.length);
81
+ var m = Buffer.alloc(64 + inputMessage.length);
82
+ var i;
83
+ for (i = 0; i < 64; ++i) {
84
+ sm[i] = signature[i];
85
+ }
86
+ for (i = 0; i < inputMessage.length; i++) {
87
+ sm[i + 64] = inputMessage[i];
88
+ }
89
+ let resultLen = await crypto_sign_open(m, sm, sm.length, publicKey);
90
+ return resultLen >= 0;
91
+ }
92
+
93
+ var gf0 = gf();
94
+ var gf1 = gf([1]);
95
+ var D = gf([
96
+ 0x78a3, 0x1359, 0x4dca, 0x75eb, 0xd8ab, 0x4141, 0x0a4d, 0x0070,
97
+ 0xe898, 0x7779, 0x4079, 0x8cc7, 0xfe73, 0x2b6f, 0x6cee, 0x5203]);
98
+ var D2 = gf([
99
+ 0xf159, 0x26b2, 0x9b94, 0xebd6, 0xb156, 0x8283, 0x149a, 0x00e0,
100
+ 0xd130, 0xeef3, 0x80f2, 0x198e, 0xfce7, 0x56df, 0xd9dc, 0x2406]);
101
+ var X = gf([
102
+ 0xd51a, 0x8f25, 0x2d60, 0xc956, 0xa7b2, 0x9525, 0xc760, 0x692c,
103
+ 0xdc5c, 0xfdd6, 0xe231, 0xc0a4, 0x53fe, 0xcd6e, 0x36d3, 0x2169]);
104
+ var Y = gf([
105
+ 0x6658, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666,
106
+ 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666]);
107
+ var L = new Float64Array([
108
+ 0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58,
109
+ 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14,
110
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x10]);
111
+ var I = gf([
112
+ 0xa0b0, 0x4a0e, 0x1b27, 0xc4ee, 0xe478, 0xad2f, 0x1806, 0x2f43,
113
+ 0xd7a7, 0x3dfb, 0x0099, 0x2b4d, 0xdf0b, 0x4fc1, 0x2480, 0x2b83]);
114
+
115
+ // TODO: update forge buffer implementation to use `Buffer` or `Uint8Array`,
116
+ // whichever is available, to improve performance
117
+ async function sha512(msg: Uint8Array, msgLen: number): Promise<Buffer> {
118
+ let result = await globalThis.crypto.subtle.digest("SHA-512", msg.slice(0, msgLen));
119
+ return Buffer.from(result);
120
+ //return Buffer.from(sha512js.sha512(msg.slice(0, msgLen)), "hex");
121
+ }
122
+
123
+ async function crypto_sign_keypair(publicKey: Buffer, secretKey: Buffer) {
124
+ var p = [gf(), gf(), gf(), gf()];
125
+ var i;
126
+
127
+ var d = await sha512(secretKey, 32);
128
+ d[0] &= 248;
129
+ d[31] &= 127;
130
+ d[31] |= 64;
131
+
132
+ scalarbase(p, d);
133
+ pack(publicKey, p);
134
+
135
+ for (i = 0; i < 32; ++i) {
136
+ secretKey[i + 32] = publicKey[i];
137
+ }
138
+ }
139
+
140
+ // Note: difference from C - smlen returned, not passed as argument.
141
+ async function crypto_sign(sm: Buffer, m: Buffer, sk: Buffer) {
142
+ let n = m.length;
143
+ var i, j, x = new Float64Array(64);
144
+ var p = [gf(), gf(), gf(), gf()];
145
+
146
+ var d = await sha512(sk, 32);
147
+ d[0] &= 248;
148
+ d[31] &= 127;
149
+ d[31] |= 64;
150
+
151
+ var smlen = n + 64;
152
+ for (i = 0; i < n; ++i) {
153
+ sm[64 + i] = m[i];
154
+ }
155
+ for (i = 0; i < 32; ++i) {
156
+ sm[32 + i] = d[32 + i];
157
+ }
158
+
159
+ var r = await sha512(sm.subarray(32), n + 32);
160
+ reduce(r);
161
+ scalarbase(p, r);
162
+ pack(sm, p);
163
+
164
+ for (i = 32; i < 64; ++i) {
165
+ sm[i] = sk[i];
166
+ }
167
+ var h = await sha512(sm, n + 64);
168
+ reduce(h);
169
+
170
+ for (i = 32; i < 64; ++i) {
171
+ x[i] = 0;
172
+ }
173
+ for (i = 0; i < 32; ++i) {
174
+ x[i] = r[i];
175
+ }
176
+ for (i = 0; i < 32; ++i) {
177
+ for (j = 0; j < 32; j++) {
178
+ x[i + j] += h[i] * d[j];
179
+ }
180
+ }
181
+
182
+ modL(sm.subarray(32), x);
183
+ return smlen;
184
+ }
185
+
186
+ async function crypto_sign_open(m: Buffer, sm: Buffer, n: number, pk: Buffer) {
187
+ var i, mlen;
188
+ var t = Buffer.alloc(32);
189
+ var p = [gf(), gf(), gf(), gf()],
190
+ q = [gf(), gf(), gf(), gf()];
191
+
192
+ mlen = -1;
193
+ if (n < 64) {
194
+ return -1;
195
+ }
196
+
197
+ if (unpackneg(q, pk)) {
198
+ return -1;
199
+ }
200
+
201
+ for (i = 0; i < n; ++i) {
202
+ m[i] = sm[i];
203
+ }
204
+ for (i = 0; i < 32; ++i) {
205
+ m[i + 32] = pk[i];
206
+ }
207
+ var h = await sha512(m, n);
208
+ reduce(h);
209
+ scalarmult(p, q, h);
210
+
211
+ scalarbase(q, sm.subarray(32));
212
+ add(p, q);
213
+ pack(t, p);
214
+
215
+ n -= 64;
216
+ if (crypto_verify_32(sm, 0, t, 0)) {
217
+ for (i = 0; i < n; ++i) {
218
+ m[i] = 0;
219
+ }
220
+ return -1;
221
+ }
222
+
223
+ for (i = 0; i < n; ++i) {
224
+ m[i] = sm[i + 64];
225
+ }
226
+ mlen = n;
227
+ return mlen;
228
+ }
229
+
230
+ function modL(r: Buffer, x: Buffer | Float64Array) {
231
+ var carry, i, j, k;
232
+ for (i = 63; i >= 32; --i) {
233
+ carry = 0;
234
+ for (j = i - 32, k = i - 12; j < k; ++j) {
235
+ x[j] += carry - 16 * x[i] * L[j - (i - 32)];
236
+ carry = (x[j] + 128) >> 8;
237
+ x[j] -= carry * 256;
238
+ }
239
+ x[j] += carry;
240
+ x[i] = 0;
241
+ }
242
+ carry = 0;
243
+ for (j = 0; j < 32; ++j) {
244
+ x[j] += carry - (x[31] >> 4) * L[j];
245
+ carry = x[j] >> 8;
246
+ x[j] &= 255;
247
+ }
248
+ for (j = 0; j < 32; ++j) {
249
+ x[j] -= carry * L[j];
250
+ }
251
+ for (i = 0; i < 32; ++i) {
252
+ x[i + 1] += x[i] >> 8;
253
+ r[i] = x[i] & 255;
254
+ }
255
+ }
256
+
257
+ function reduce(r: Buffer) {
258
+ var x = new Float64Array(64);
259
+ for (var i = 0; i < 64; ++i) {
260
+ x[i] = r[i];
261
+ r[i] = 0;
262
+ }
263
+ modL(r, x);
264
+ }
265
+
266
+ function add(p: Buffer[] | Float64Array[], q: Buffer[] | Float64Array[]) {
267
+ var a = gf(), b = gf(), c = gf(),
268
+ d = gf(), e = gf(), f = gf(),
269
+ g = gf(), h = gf(), t = gf();
270
+
271
+ Z(a, p[1], p[0]);
272
+ Z(t, q[1], q[0]);
273
+ M(a, a, t);
274
+ A(b, p[0], p[1]);
275
+ A(t, q[0], q[1]);
276
+ M(b, b, t);
277
+ M(c, p[3], q[3]);
278
+ M(c, c, D2);
279
+ M(d, p[2], q[2]);
280
+ A(d, d, d);
281
+ Z(e, b, a);
282
+ Z(f, d, c);
283
+ A(g, d, c);
284
+ A(h, b, a);
285
+
286
+ M(p[0], e, f);
287
+ M(p[1], h, g);
288
+ M(p[2], g, f);
289
+ M(p[3], e, h);
290
+ }
291
+
292
+ function cswap(p: Buffer[] | Float64Array[], q: Buffer[] | Float64Array[], b: number) {
293
+ for (var i = 0; i < 4; ++i) {
294
+ sel25519(p[i], q[i], b);
295
+ }
296
+ }
297
+
298
+ function pack(r: Buffer, p: Buffer[] | Float64Array[]) {
299
+ var tx = gf(), ty = gf(), zi = gf();
300
+ inv25519(zi, p[2]);
301
+ M(tx, p[0], zi);
302
+ M(ty, p[1], zi);
303
+ pack25519(r, ty);
304
+ r[31] ^= par25519(tx) << 7;
305
+ }
306
+
307
+ function pack25519(o: Buffer, n: Buffer | Float64Array) {
308
+ var i, j, b;
309
+ var m = gf(), t = gf();
310
+ for (i = 0; i < 16; ++i) {
311
+ t[i] = n[i];
312
+ }
313
+ car25519(t);
314
+ car25519(t);
315
+ car25519(t);
316
+ for (j = 0; j < 2; ++j) {
317
+ m[0] = t[0] - 0xffed;
318
+ for (i = 1; i < 15; ++i) {
319
+ m[i] = t[i] - 0xffff - ((m[i - 1] >> 16) & 1);
320
+ m[i - 1] &= 0xffff;
321
+ }
322
+ m[15] = t[15] - 0x7fff - ((m[14] >> 16) & 1);
323
+ b = (m[15] >> 16) & 1;
324
+ m[14] &= 0xffff;
325
+ sel25519(t, m, 1 - b);
326
+ }
327
+ for (i = 0; i < 16; i++) {
328
+ o[2 * i] = t[i] & 0xff;
329
+ o[2 * i + 1] = t[i] >> 8;
330
+ }
331
+ }
332
+
333
+ function unpackneg(r: Float64Array[], p: Buffer) {
334
+ var t = gf(), chk = gf(), num = gf(),
335
+ den = gf(), den2 = gf(), den4 = gf(),
336
+ den6 = gf();
337
+
338
+ set25519(r[2], gf1);
339
+ unpack25519(r[1], p);
340
+ S(num, r[1]);
341
+ M(den, num, D);
342
+ Z(num, num, r[2]);
343
+ A(den, r[2], den);
344
+
345
+ S(den2, den);
346
+ S(den4, den2);
347
+ M(den6, den4, den2);
348
+ M(t, den6, num);
349
+ M(t, t, den);
350
+
351
+ pow2523(t, t);
352
+ M(t, t, num);
353
+ M(t, t, den);
354
+ M(t, t, den);
355
+ M(r[0], t, den);
356
+
357
+ S(chk, r[0]);
358
+ M(chk, chk, den);
359
+ if (neq25519(chk, num)) {
360
+ M(r[0], r[0], I);
361
+ }
362
+
363
+ S(chk, r[0]);
364
+ M(chk, chk, den);
365
+ if (neq25519(chk, num)) {
366
+ return -1;
367
+ }
368
+
369
+ if (par25519(r[0]) === (p[31] >> 7)) {
370
+ Z(r[0], gf0, r[0]);
371
+ }
372
+
373
+ M(r[3], r[0], r[1]);
374
+ return 0;
375
+ }
376
+
377
+ function unpack25519(o: Float64Array, n: Buffer) {
378
+ var i;
379
+ for (i = 0; i < 16; ++i) {
380
+ o[i] = n[2 * i] + (n[2 * i + 1] << 8);
381
+ }
382
+ o[15] &= 0x7fff;
383
+ }
384
+
385
+ function pow2523(o: Float64Array, i: Float64Array) {
386
+ var c = gf();
387
+ var a;
388
+ for (a = 0; a < 16; ++a) {
389
+ c[a] = i[a];
390
+ }
391
+ for (a = 250; a >= 0; --a) {
392
+ S(c, c);
393
+ if (a !== 1) {
394
+ M(c, c, i);
395
+ }
396
+ }
397
+ for (a = 0; a < 16; ++a) {
398
+ o[a] = c[a];
399
+ }
400
+ }
401
+
402
+ function neq25519(a: Float64Array, b: Float64Array) {
403
+ var c = Buffer.alloc(32);
404
+ var d = Buffer.alloc(32);
405
+ pack25519(c, a);
406
+ pack25519(d, b);
407
+ return crypto_verify_32(c, 0, d, 0);
408
+ }
409
+
410
+ function crypto_verify_32(x: Buffer, xi: number, y: Buffer, yi: number) {
411
+ return vn(x, xi, y, yi, 32);
412
+ }
413
+
414
+ function vn(x: Buffer, xi: number, y: Buffer, yi: number, n: number) {
415
+ var i, d = 0;
416
+ for (i = 0; i < n; ++i) {
417
+ d |= x[xi + i] ^ y[yi + i];
418
+ }
419
+ return (1 & ((d - 1) >>> 8)) - 1;
420
+ }
421
+
422
+ function par25519(a: Float64Array) {
423
+ var d = Buffer.alloc(32);
424
+ pack25519(d, a);
425
+ return d[0] & 1;
426
+ }
427
+
428
+ function scalarmult(p: Buffer[] | Float64Array[], q: Buffer[] | Float64Array[], s: Buffer) {
429
+ var b, i;
430
+ set25519(p[0], gf0);
431
+ set25519(p[1], gf1);
432
+ set25519(p[2], gf1);
433
+ set25519(p[3], gf0);
434
+ for (i = 255; i >= 0; --i) {
435
+ b = (s[(i / 8) | 0] >> (i & 7)) & 1;
436
+ cswap(p, q, b);
437
+ add(q, p);
438
+ add(p, p);
439
+ cswap(p, q, b);
440
+ }
441
+ }
442
+
443
+ function scalarbase(p: Buffer[] | Float64Array[], s: Buffer) {
444
+ var q = [gf(), gf(), gf(), gf()];
445
+ set25519(q[0], X);
446
+ set25519(q[1], Y);
447
+ set25519(q[2], gf1);
448
+ M(q[3], X, Y);
449
+ scalarmult(p, q, s);
450
+ }
451
+
452
+ function set25519(r: Float64Array | Buffer, a: Float64Array | Buffer) {
453
+ var i;
454
+ for (i = 0; i < 16; i++) {
455
+ r[i] = a[i] | 0;
456
+ }
457
+ }
458
+
459
+ function inv25519(o: Float64Array, i: Float64Array | Buffer) {
460
+ var c = gf();
461
+ var a;
462
+ for (a = 0; a < 16; ++a) {
463
+ c[a] = i[a];
464
+ }
465
+ for (a = 253; a >= 0; --a) {
466
+ S(c, c);
467
+ if (a !== 2 && a !== 4) {
468
+ M(c, c, i);
469
+ }
470
+ }
471
+ for (a = 0; a < 16; ++a) {
472
+ o[a] = c[a];
473
+ }
474
+ }
475
+
476
+ function car25519(o: Float64Array) {
477
+ var i, v, c = 1;
478
+ for (i = 0; i < 16; ++i) {
479
+ v = o[i] + c + 65535;
480
+ c = Math.floor(v / 65536);
481
+ o[i] = v - c * 65536;
482
+ }
483
+ o[0] += c - 1 + 37 * (c - 1);
484
+ }
485
+
486
+ function sel25519(p: Buffer | Float64Array, q: Buffer | Float64Array, b: number) {
487
+ var t, c = ~(b - 1);
488
+ for (var i = 0; i < 16; ++i) {
489
+ t = c & (p[i] ^ q[i]);
490
+ p[i] ^= t;
491
+ q[i] ^= t;
492
+ }
493
+ }
494
+
495
+ function gf(init?: Buffer | number[]) {
496
+ var i, r = new Float64Array(16);
497
+ if (init) {
498
+ for (i = 0; i < init.length; ++i) {
499
+ r[i] = init[i];
500
+ }
501
+ }
502
+ return r;
503
+ }
504
+
505
+ function A(o: Float64Array | Buffer, a: Float64Array | Buffer, b: Float64Array | Buffer) {
506
+ for (var i = 0; i < 16; ++i) {
507
+ o[i] = a[i] + b[i];
508
+ }
509
+ }
510
+
511
+ function Z(o: Float64Array | Buffer, a: Float64Array | Buffer, b: Float64Array | Buffer) {
512
+ for (var i = 0; i < 16; ++i) {
513
+ o[i] = a[i] - b[i];
514
+ }
515
+ }
516
+
517
+ function S(o: Float64Array, a: Float64Array) {
518
+ M(o, a, a);
519
+ }
520
+
521
+ function M(o: Float64Array | Buffer, a: Float64Array | Buffer, b: Float64Array | Buffer) {
522
+ var v, c,
523
+ t0 = 0, t1 = 0, t2 = 0, t3 = 0, t4 = 0, t5 = 0, t6 = 0, t7 = 0,
524
+ t8 = 0, t9 = 0, t10 = 0, t11 = 0, t12 = 0, t13 = 0, t14 = 0, t15 = 0,
525
+ t16 = 0, t17 = 0, t18 = 0, t19 = 0, t20 = 0, t21 = 0, t22 = 0, t23 = 0,
526
+ t24 = 0, t25 = 0, t26 = 0, t27 = 0, t28 = 0, t29 = 0, t30 = 0,
527
+ b0 = b[0],
528
+ b1 = b[1],
529
+ b2 = b[2],
530
+ b3 = b[3],
531
+ b4 = b[4],
532
+ b5 = b[5],
533
+ b6 = b[6],
534
+ b7 = b[7],
535
+ b8 = b[8],
536
+ b9 = b[9],
537
+ b10 = b[10],
538
+ b11 = b[11],
539
+ b12 = b[12],
540
+ b13 = b[13],
541
+ b14 = b[14],
542
+ b15 = b[15];
543
+
544
+ v = a[0];
545
+ t0 += v * b0;
546
+ t1 += v * b1;
547
+ t2 += v * b2;
548
+ t3 += v * b3;
549
+ t4 += v * b4;
550
+ t5 += v * b5;
551
+ t6 += v * b6;
552
+ t7 += v * b7;
553
+ t8 += v * b8;
554
+ t9 += v * b9;
555
+ t10 += v * b10;
556
+ t11 += v * b11;
557
+ t12 += v * b12;
558
+ t13 += v * b13;
559
+ t14 += v * b14;
560
+ t15 += v * b15;
561
+ v = a[1];
562
+ t1 += v * b0;
563
+ t2 += v * b1;
564
+ t3 += v * b2;
565
+ t4 += v * b3;
566
+ t5 += v * b4;
567
+ t6 += v * b5;
568
+ t7 += v * b6;
569
+ t8 += v * b7;
570
+ t9 += v * b8;
571
+ t10 += v * b9;
572
+ t11 += v * b10;
573
+ t12 += v * b11;
574
+ t13 += v * b12;
575
+ t14 += v * b13;
576
+ t15 += v * b14;
577
+ t16 += v * b15;
578
+ v = a[2];
579
+ t2 += v * b0;
580
+ t3 += v * b1;
581
+ t4 += v * b2;
582
+ t5 += v * b3;
583
+ t6 += v * b4;
584
+ t7 += v * b5;
585
+ t8 += v * b6;
586
+ t9 += v * b7;
587
+ t10 += v * b8;
588
+ t11 += v * b9;
589
+ t12 += v * b10;
590
+ t13 += v * b11;
591
+ t14 += v * b12;
592
+ t15 += v * b13;
593
+ t16 += v * b14;
594
+ t17 += v * b15;
595
+ v = a[3];
596
+ t3 += v * b0;
597
+ t4 += v * b1;
598
+ t5 += v * b2;
599
+ t6 += v * b3;
600
+ t7 += v * b4;
601
+ t8 += v * b5;
602
+ t9 += v * b6;
603
+ t10 += v * b7;
604
+ t11 += v * b8;
605
+ t12 += v * b9;
606
+ t13 += v * b10;
607
+ t14 += v * b11;
608
+ t15 += v * b12;
609
+ t16 += v * b13;
610
+ t17 += v * b14;
611
+ t18 += v * b15;
612
+ v = a[4];
613
+ t4 += v * b0;
614
+ t5 += v * b1;
615
+ t6 += v * b2;
616
+ t7 += v * b3;
617
+ t8 += v * b4;
618
+ t9 += v * b5;
619
+ t10 += v * b6;
620
+ t11 += v * b7;
621
+ t12 += v * b8;
622
+ t13 += v * b9;
623
+ t14 += v * b10;
624
+ t15 += v * b11;
625
+ t16 += v * b12;
626
+ t17 += v * b13;
627
+ t18 += v * b14;
628
+ t19 += v * b15;
629
+ v = a[5];
630
+ t5 += v * b0;
631
+ t6 += v * b1;
632
+ t7 += v * b2;
633
+ t8 += v * b3;
634
+ t9 += v * b4;
635
+ t10 += v * b5;
636
+ t11 += v * b6;
637
+ t12 += v * b7;
638
+ t13 += v * b8;
639
+ t14 += v * b9;
640
+ t15 += v * b10;
641
+ t16 += v * b11;
642
+ t17 += v * b12;
643
+ t18 += v * b13;
644
+ t19 += v * b14;
645
+ t20 += v * b15;
646
+ v = a[6];
647
+ t6 += v * b0;
648
+ t7 += v * b1;
649
+ t8 += v * b2;
650
+ t9 += v * b3;
651
+ t10 += v * b4;
652
+ t11 += v * b5;
653
+ t12 += v * b6;
654
+ t13 += v * b7;
655
+ t14 += v * b8;
656
+ t15 += v * b9;
657
+ t16 += v * b10;
658
+ t17 += v * b11;
659
+ t18 += v * b12;
660
+ t19 += v * b13;
661
+ t20 += v * b14;
662
+ t21 += v * b15;
663
+ v = a[7];
664
+ t7 += v * b0;
665
+ t8 += v * b1;
666
+ t9 += v * b2;
667
+ t10 += v * b3;
668
+ t11 += v * b4;
669
+ t12 += v * b5;
670
+ t13 += v * b6;
671
+ t14 += v * b7;
672
+ t15 += v * b8;
673
+ t16 += v * b9;
674
+ t17 += v * b10;
675
+ t18 += v * b11;
676
+ t19 += v * b12;
677
+ t20 += v * b13;
678
+ t21 += v * b14;
679
+ t22 += v * b15;
680
+ v = a[8];
681
+ t8 += v * b0;
682
+ t9 += v * b1;
683
+ t10 += v * b2;
684
+ t11 += v * b3;
685
+ t12 += v * b4;
686
+ t13 += v * b5;
687
+ t14 += v * b6;
688
+ t15 += v * b7;
689
+ t16 += v * b8;
690
+ t17 += v * b9;
691
+ t18 += v * b10;
692
+ t19 += v * b11;
693
+ t20 += v * b12;
694
+ t21 += v * b13;
695
+ t22 += v * b14;
696
+ t23 += v * b15;
697
+ v = a[9];
698
+ t9 += v * b0;
699
+ t10 += v * b1;
700
+ t11 += v * b2;
701
+ t12 += v * b3;
702
+ t13 += v * b4;
703
+ t14 += v * b5;
704
+ t15 += v * b6;
705
+ t16 += v * b7;
706
+ t17 += v * b8;
707
+ t18 += v * b9;
708
+ t19 += v * b10;
709
+ t20 += v * b11;
710
+ t21 += v * b12;
711
+ t22 += v * b13;
712
+ t23 += v * b14;
713
+ t24 += v * b15;
714
+ v = a[10];
715
+ t10 += v * b0;
716
+ t11 += v * b1;
717
+ t12 += v * b2;
718
+ t13 += v * b3;
719
+ t14 += v * b4;
720
+ t15 += v * b5;
721
+ t16 += v * b6;
722
+ t17 += v * b7;
723
+ t18 += v * b8;
724
+ t19 += v * b9;
725
+ t20 += v * b10;
726
+ t21 += v * b11;
727
+ t22 += v * b12;
728
+ t23 += v * b13;
729
+ t24 += v * b14;
730
+ t25 += v * b15;
731
+ v = a[11];
732
+ t11 += v * b0;
733
+ t12 += v * b1;
734
+ t13 += v * b2;
735
+ t14 += v * b3;
736
+ t15 += v * b4;
737
+ t16 += v * b5;
738
+ t17 += v * b6;
739
+ t18 += v * b7;
740
+ t19 += v * b8;
741
+ t20 += v * b9;
742
+ t21 += v * b10;
743
+ t22 += v * b11;
744
+ t23 += v * b12;
745
+ t24 += v * b13;
746
+ t25 += v * b14;
747
+ t26 += v * b15;
748
+ v = a[12];
749
+ t12 += v * b0;
750
+ t13 += v * b1;
751
+ t14 += v * b2;
752
+ t15 += v * b3;
753
+ t16 += v * b4;
754
+ t17 += v * b5;
755
+ t18 += v * b6;
756
+ t19 += v * b7;
757
+ t20 += v * b8;
758
+ t21 += v * b9;
759
+ t22 += v * b10;
760
+ t23 += v * b11;
761
+ t24 += v * b12;
762
+ t25 += v * b13;
763
+ t26 += v * b14;
764
+ t27 += v * b15;
765
+ v = a[13];
766
+ t13 += v * b0;
767
+ t14 += v * b1;
768
+ t15 += v * b2;
769
+ t16 += v * b3;
770
+ t17 += v * b4;
771
+ t18 += v * b5;
772
+ t19 += v * b6;
773
+ t20 += v * b7;
774
+ t21 += v * b8;
775
+ t22 += v * b9;
776
+ t23 += v * b10;
777
+ t24 += v * b11;
778
+ t25 += v * b12;
779
+ t26 += v * b13;
780
+ t27 += v * b14;
781
+ t28 += v * b15;
782
+ v = a[14];
783
+ t14 += v * b0;
784
+ t15 += v * b1;
785
+ t16 += v * b2;
786
+ t17 += v * b3;
787
+ t18 += v * b4;
788
+ t19 += v * b5;
789
+ t20 += v * b6;
790
+ t21 += v * b7;
791
+ t22 += v * b8;
792
+ t23 += v * b9;
793
+ t24 += v * b10;
794
+ t25 += v * b11;
795
+ t26 += v * b12;
796
+ t27 += v * b13;
797
+ t28 += v * b14;
798
+ t29 += v * b15;
799
+ v = a[15];
800
+ t15 += v * b0;
801
+ t16 += v * b1;
802
+ t17 += v * b2;
803
+ t18 += v * b3;
804
+ t19 += v * b4;
805
+ t20 += v * b5;
806
+ t21 += v * b6;
807
+ t22 += v * b7;
808
+ t23 += v * b8;
809
+ t24 += v * b9;
810
+ t25 += v * b10;
811
+ t26 += v * b11;
812
+ t27 += v * b12;
813
+ t28 += v * b13;
814
+ t29 += v * b14;
815
+ t30 += v * b15;
816
+
817
+ t0 += 38 * t16;
818
+ t1 += 38 * t17;
819
+ t2 += 38 * t18;
820
+ t3 += 38 * t19;
821
+ t4 += 38 * t20;
822
+ t5 += 38 * t21;
823
+ t6 += 38 * t22;
824
+ t7 += 38 * t23;
825
+ t8 += 38 * t24;
826
+ t9 += 38 * t25;
827
+ t10 += 38 * t26;
828
+ t11 += 38 * t27;
829
+ t12 += 38 * t28;
830
+ t13 += 38 * t29;
831
+ t14 += 38 * t30;
832
+ // t15 left as is
833
+
834
+ // first car
835
+ c = 1;
836
+ v = t0 + c + 65535; c = Math.floor(v / 65536); t0 = v - c * 65536;
837
+ v = t1 + c + 65535; c = Math.floor(v / 65536); t1 = v - c * 65536;
838
+ v = t2 + c + 65535; c = Math.floor(v / 65536); t2 = v - c * 65536;
839
+ v = t3 + c + 65535; c = Math.floor(v / 65536); t3 = v - c * 65536;
840
+ v = t4 + c + 65535; c = Math.floor(v / 65536); t4 = v - c * 65536;
841
+ v = t5 + c + 65535; c = Math.floor(v / 65536); t5 = v - c * 65536;
842
+ v = t6 + c + 65535; c = Math.floor(v / 65536); t6 = v - c * 65536;
843
+ v = t7 + c + 65535; c = Math.floor(v / 65536); t7 = v - c * 65536;
844
+ v = t8 + c + 65535; c = Math.floor(v / 65536); t8 = v - c * 65536;
845
+ v = t9 + c + 65535; c = Math.floor(v / 65536); t9 = v - c * 65536;
846
+ v = t10 + c + 65535; c = Math.floor(v / 65536); t10 = v - c * 65536;
847
+ v = t11 + c + 65535; c = Math.floor(v / 65536); t11 = v - c * 65536;
848
+ v = t12 + c + 65535; c = Math.floor(v / 65536); t12 = v - c * 65536;
849
+ v = t13 + c + 65535; c = Math.floor(v / 65536); t13 = v - c * 65536;
850
+ v = t14 + c + 65535; c = Math.floor(v / 65536); t14 = v - c * 65536;
851
+ v = t15 + c + 65535; c = Math.floor(v / 65536); t15 = v - c * 65536;
852
+ t0 += c - 1 + 37 * (c - 1);
853
+
854
+ // second car
855
+ c = 1;
856
+ v = t0 + c + 65535; c = Math.floor(v / 65536); t0 = v - c * 65536;
857
+ v = t1 + c + 65535; c = Math.floor(v / 65536); t1 = v - c * 65536;
858
+ v = t2 + c + 65535; c = Math.floor(v / 65536); t2 = v - c * 65536;
859
+ v = t3 + c + 65535; c = Math.floor(v / 65536); t3 = v - c * 65536;
860
+ v = t4 + c + 65535; c = Math.floor(v / 65536); t4 = v - c * 65536;
861
+ v = t5 + c + 65535; c = Math.floor(v / 65536); t5 = v - c * 65536;
862
+ v = t6 + c + 65535; c = Math.floor(v / 65536); t6 = v - c * 65536;
863
+ v = t7 + c + 65535; c = Math.floor(v / 65536); t7 = v - c * 65536;
864
+ v = t8 + c + 65535; c = Math.floor(v / 65536); t8 = v - c * 65536;
865
+ v = t9 + c + 65535; c = Math.floor(v / 65536); t9 = v - c * 65536;
866
+ v = t10 + c + 65535; c = Math.floor(v / 65536); t10 = v - c * 65536;
867
+ v = t11 + c + 65535; c = Math.floor(v / 65536); t11 = v - c * 65536;
868
+ v = t12 + c + 65535; c = Math.floor(v / 65536); t12 = v - c * 65536;
869
+ v = t13 + c + 65535; c = Math.floor(v / 65536); t13 = v - c * 65536;
870
+ v = t14 + c + 65535; c = Math.floor(v / 65536); t14 = v - c * 65536;
871
+ v = t15 + c + 65535; c = Math.floor(v / 65536); t15 = v - c * 65536;
872
+ t0 += c - 1 + 37 * (c - 1);
873
+
874
+ o[0] = t0;
875
+ o[1] = t1;
876
+ o[2] = t2;
877
+ o[3] = t3;
878
+ o[4] = t4;
879
+ o[5] = t5;
880
+ o[6] = t6;
881
+ o[7] = t7;
882
+ o[8] = t8;
883
+ o[9] = t9;
884
+ o[10] = t10;
885
+ o[11] = t11;
886
+ o[12] = t12;
887
+ o[13] = t13;
888
+ o[14] = t14;
889
+ o[15] = t15;
890
+ }
891
+
892
+
893
+
894
+
895
+
896
+ let tagTypes: { [tag: number]: string } = {
897
+ 0x01: "BOOLEAN",
898
+ 0x02: "INTEGER",
899
+ 0x03: "BIT STRING",
900
+ 0x04: "OCTET STRING",
901
+ 0x05: "NULL",
902
+ 0x06: "OBJECT IDENTIFIER",
903
+ 0x0C: "UTF8String",
904
+ 0x13: "PrintableString",
905
+ 0x14: "TeletexString",
906
+ 0x16: "IA5String",
907
+ 0x17: "UTCTime",
908
+ 0x18: "GeneralizedTime",
909
+ 0x10: "SEQUENCE",
910
+ 0x11: "SET",
911
+ };
912
+ let tagLookup = {
913
+ BOOLEAN: 0x01,
914
+ INTEGER: 0x02,
915
+ BIT_STRING: 0x03,
916
+ OCTET_STRING: 0x04,
917
+ NULL: 0x05,
918
+ OBJECT_IDENTIFIER: 0x06,
919
+ UTF8String: 0x0C,
920
+ PrintableString: 0x13,
921
+ TeletexString: 0x14,
922
+ IA5String: 0x16,
923
+ UTCTime: 0x17,
924
+ GeneralizedTime: 0x18,
925
+ SEQUENCE: 0x10,
926
+ SET: 0x11,
927
+ };
928
+
929
+ interface BERTag {
930
+ type: number;
931
+ typeName: string;
932
+ data: Buffer;
933
+ children?: BERTag[];
934
+ }
935
+ type BERTagInput = {
936
+ type: number;
937
+ data: Buffer | number[];
938
+ } | {
939
+ type: number;
940
+ children: BERTagInput[];
941
+ };
942
+ interface Stream {
943
+ pos: number;
944
+ buffer: Buffer;
945
+ }
946
+ function readVarLengthNumber(stream: Stream): number {
947
+ let value = stream.buffer[stream.pos++];
948
+ if (value > 128) {
949
+ let length = value - 128;
950
+ if (length === 0) {
951
+ throw new Error(`Indefinite length not supported`);
952
+ }
953
+ let bytes = stream.buffer.slice(stream.pos, stream.pos + length);
954
+ stream.pos += length;
955
+ value = 0;
956
+ for (let byte of bytes) {
957
+ value = value * 256 + byte;
958
+ }
959
+ return value;
960
+ }
961
+ return value;
962
+ }
963
+ function berTagParser(buffer: Buffer): BERTag[] {
964
+ let stream: Stream = { pos: 0, buffer };
965
+ // type, length, data
966
+ let tags: BERTag[] = [];
967
+ while (stream.pos < stream.buffer.length) {
968
+ let type = stream.buffer[stream.pos++];
969
+ let length = readVarLengthNumber(stream);
970
+ let data = stream.buffer.slice(stream.pos, stream.pos + length);
971
+ stream.pos += length;
972
+ let tag = { type, data, typeName: "" } as BERTag;
973
+ tags.push(tag);
974
+ if (tag.type & 0x20) {
975
+ tag.type -= 0x20;
976
+ tag.children = berTagParser(data);
977
+ }
978
+ tag.typeName = tagTypes[tag.type] || `Unknown ${tag.type}`;
979
+ }
980
+ return tags;
981
+ }
982
+
983
+
984
+ function encodeVarLengthNumber(value: number): number[] {
985
+ if (value < 128) {
986
+ return [value];
987
+ }
988
+ let bytes = [];
989
+ let value2 = value;
990
+ while (value2) {
991
+ bytes.push(value2 & 0xFF);
992
+ value2 = Math.floor(value2 / 256);
993
+ }
994
+ bytes.reverse();
995
+ bytes.unshift(bytes.length + 128);
996
+ return bytes;
997
+ }
998
+
999
+ function encodeBerTags(tags: BERTagInput[]): Buffer {
1000
+ return Buffer.from(encodeBerTagsBase(tags));
1001
+ }
1002
+ function encodeBerTagsBase(tags: BERTagInput[]): number[] {
1003
+ let result: number[] = [];
1004
+ for (let tag of tags) {
1005
+ let type = tag.type;
1006
+ if ("children" in tag) {
1007
+ type = type | 0x20;
1008
+ }
1009
+ result.push(type);
1010
+ let data = "data" in tag ? [...tag.data] : encodeBerTagsBase(tag.children);
1011
+ result.push(...encodeVarLengthNumber(data.length));
1012
+ result.push(...data);
1013
+ }
1014
+ return result;
1015
+ }