smesh_lol_web_common_crypto_nip44.mjs raw
1 // Package smesh.lol/web/common/crypto/nip44
2 // Generated by MoxieJS — Moxie JavaScript backend
3
4 import * as $rt from './$runtime/index.mjs';
5
6 import * as smesh$lol$web$common$crypto$chacha20 from './smesh_lol_web_common_crypto_chacha20.mjs';
7 import * as smesh$lol$web$common$crypto$hkdf from './smesh_lol_web_common_crypto_hkdf.mjs';
8 import * as smesh$lol$web$common$crypto$hmac from './smesh_lol_web_common_crypto_hmac.mjs';
9 import * as smesh$lol$web$common$helpers from './smesh_lol_web_common_helpers.mjs';
10 import * as smesh$lol$web$common$jsbridge$schnorr from './smesh_lol_web_common_jsbridge_schnorr.mjs';
11
12 // Package-level variables
13
14 export function init() {
15 return;
16 }
17
18 export function ConversationKey(seckey, pubkey) {
19 let $t0_1, $t1_2, $t2_3, $t3_4, $t4_5, $t5_6, $t6_7, $t7_8, $t8_9;
20 let $block = 0;
21 while (true) {
22 switch ($block) {
23 case 0: {
24 $t0_1 = { $value: $rt.builtin.makeSlice(32, 32, 0), $get() { return this.$value; }, $set(v) { this.$value = v; } };
25 $t0_1.$set($rt.builtin.cloneValue(seckey));
26 $t1_2 = { $value: $rt.builtin.makeSlice(32, 32, 0), $get() { return this.$value; }, $set(v) { this.$value = v; } };
27 $t1_2.$set($rt.builtin.cloneValue(pubkey));
28 $t2_3 = $rt.builtin.sliceSlice($t0_1.$get(), undefined, undefined, undefined);
29 $t3_4 = $rt.builtin.sliceSlice($t1_2.$get(), undefined, undefined, undefined);
30 $t4_5 = smesh$lol$web$common$jsbridge$schnorr.ECDH($t2_3, $t3_4);
31 $t5_6 = $t4_5[0];
32 $t6_7 = $t4_5[1];
33 if ($t6_7) {
34 $block = 2; break;
35 }
36 else {
37 $block = 1; break;
38 }
39 break;
40 }
41 case 1: {
42 return [$rt.builtin.makeSlice(32, 32, 0), false];
43 break;
44 }
45 case 2: {
46 $t7_8 = $rt.builtin.stringToBytes('nip44-v2');
47 $t8_9 = smesh$lol$web$common$crypto$hkdf.Extract($t7_8, $t5_6);
48 return [$t8_9, true];
49 break;
50 }
51 }
52 }
53 }
54
55 export function Encrypt(plaintext, conversationKey, nonce) {
56 let $t0_1, $t1_2, $t2_3, $t3_4, $t4_5, $t5_6, $t6_7, $t7_8, $t8_9, $t9_10, $t10_11, $t11_12, $t12_13, $t13_14, $t14_15, $t15_16, $t16_17, $t17_18, $t18_19, $t19_20, $t20_21, $t21_22, $t22_23, $t23_24, $t24_25, $t25_26, $t26_27, $t27_28, $t28_29, $t29_30, $t30_31, $t31_32, $t32_33, $t33_34, $t34_35, $t35_36, $t36_37, $t37_38, $t38_39, $t39_40, $t40_41;
57 $t0_1 = { $value: $rt.builtin.makeSlice(32, 32, 0), $get() { return this.$value; }, $set(v) { this.$value = v; } };
58 $t0_1.$set($rt.builtin.cloneValue(conversationKey));
59 $t1_2 = { $value: $rt.builtin.makeSlice(32, 32, 0), $get() { return this.$value; }, $set(v) { this.$value = v; } };
60 $t1_2.$set($rt.builtin.cloneValue(nonce));
61 $t2_3 = $rt.builtin.sliceSlice($t0_1.$get(), undefined, undefined, undefined);
62 $t3_4 = $rt.builtin.sliceSlice($t1_2.$get(), undefined, undefined, undefined);
63 $t4_5 = smesh$lol$web$common$crypto$hkdf.Expand($t2_3, $t3_4, 76);
64 $t5_6 = { $value: $rt.builtin.makeSlice(32, 32, 0), $get() { return this.$value; }, $set(v) { this.$value = v; } };
65 $t6_7 = { $value: $rt.builtin.makeSlice(12, 12, 0), $get() { return this.$value; }, $set(v) { this.$value = v; } };
66 $t7_8 = $rt.builtin.sliceSlice($t5_6.$get(), undefined, undefined, undefined);
67 $t8_9 = $rt.builtin.sliceSlice($t4_5, undefined, 32, undefined);
68 $t9_10 = $rt.builtin.copy($t7_8, $t8_9);
69 $t10_11 = $rt.builtin.sliceSlice($t6_7.$get(), undefined, undefined, undefined);
70 $t11_12 = $rt.builtin.sliceSlice($t4_5, 32, 44, undefined);
71 $t12_13 = $rt.builtin.copy($t10_11, $t11_12);
72 $t13_14 = $rt.builtin.sliceSlice($t4_5, 44, 76, undefined);
73 $t14_15 = pad(plaintext);
74 $t15_16 = $t5_6.$get();
75 $t16_17 = $t6_7.$get();
76 $t17_18 = smesh$lol$web$common$crypto$chacha20.XOR($t15_16, $t16_17, $t14_15);
77 $t18_19 = $rt.builtin.len($t17_18);
78 $t19_20 = (32 + $t18_19);
79 $t20_21 = $rt.builtin.makeSlice($t19_20, $t19_20, 0);
80 $t21_22 = $rt.builtin.sliceSlice($t1_2.$get(), undefined, undefined, undefined);
81 $t22_23 = $rt.builtin.copy($t20_21, $t21_22);
82 $t23_24 = $rt.builtin.sliceSlice($t20_21, 32, undefined, undefined);
83 $t24_25 = $rt.builtin.copy($t23_24, $t17_18);
84 $t25_26 = { $value: $rt.builtin.makeSlice(32, 32, 0), $get() { return this.$value; }, $set(v) { this.$value = v; } };
85 $t26_27 = smesh$lol$web$common$crypto$hmac.Sum($t13_14, $t20_21);
86 $t25_26.$set($rt.builtin.cloneValue($t26_27));
87 $t27_28 = $rt.builtin.len($t17_18);
88 $t28_29 = (33 + $t27_28);
89 $t29_30 = ($t28_29 + 32);
90 $t30_31 = $rt.builtin.makeSlice(0, $t29_30, 0);
91 $t31_32 = { $value: $rt.builtin.makeSlice(1, 1, 0), $get() { return this.$value; }, $set(v) { this.$value = v; } };
92 $t32_33 = $t31_32.$get().addr(0);
93 $t32_33.$set(2);
94 $t33_34 = $rt.builtin.sliceSlice($t31_32.$get(), undefined, undefined, undefined);
95 $t34_35 = $rt.builtin.appendSlice($t30_31, $t33_34);
96 $t35_36 = $rt.builtin.sliceSlice($t1_2.$get(), undefined, undefined, undefined);
97 $t36_37 = $rt.builtin.appendSlice($t34_35, $t35_36);
98 $t37_38 = $rt.builtin.appendSlice($t36_37, $t17_18);
99 $t38_39 = $rt.builtin.sliceSlice($t25_26.$get(), undefined, undefined, undefined);
100 $t39_40 = $rt.builtin.appendSlice($t37_38, $t38_39);
101 $t40_41 = smesh$lol$web$common$helpers.Base64Encode($t39_40);
102 return $t40_41;
103 }
104
105 export function Decrypt(b64payload, conversationKey) {
106 let $t0_1, $t1_2, $t2_3, $t3_4, $t4_5, $t5_6, $t6_7, $t7_8, $t8_9, $t9_10, $t10_11, $t11_12, $t12_13, $t13_14, $t14_15, $t15_16, $t16_17, $t17_18, $t18_19, $t19_20, $t20_21, $t21_22, $t22_23, $t23_24, $t24_25, $t25_26, $t26_27, $t27_28, $t28_29, $t29_30, $t30_31, $t31_32, $t32_33, $t33_34, $t34_35, $t35_36, $t36_37, $t37_38, $t38_39, $t39_40, $t40_41, $t41_42, $t42_43, $t43_44, $t44_45, $t45_46, $t46_47, $t47_48, $t48_49, $t49_50, $t50_51, $t51_52, $t52_53, $t53_54;
107 let $block = 0;
108 while (true) {
109 switch ($block) {
110 case 0: {
111 $t0_1 = { $value: $rt.builtin.makeSlice(32, 32, 0), $get() { return this.$value; }, $set(v) { this.$value = v; } };
112 $t0_1.$set($rt.builtin.cloneValue(conversationKey));
113 $t1_2 = smesh$lol$web$common$helpers.Base64Decode(b64payload);
114 $t2_3 = $rt.builtin.len($t1_2);
115 $t3_4 = ($t2_3 < 99);
116 if ($t3_4) {
117 $block = 1; break;
118 }
119 else {
120 $block = 2; break;
121 }
122 break;
123 }
124 case 1: {
125 $t4_5 = $rt.builtin.stringToBytes('');
126 return [$t4_5, false];
127 break;
128 }
129 case 2: {
130 $t5_6 = $t1_2.addr(0);
131 $t6_7 = $t5_6.$get();
132 $t7_8 = ($t6_7 !== 2);
133 if ($t7_8) {
134 $block = 3; break;
135 }
136 else {
137 $block = 4; break;
138 }
139 break;
140 }
141 case 3: {
142 $t8_9 = $rt.builtin.stringToBytes('');
143 return [$t8_9, false];
144 break;
145 }
146 case 4: {
147 $t9_10 = $rt.builtin.sliceSlice($t1_2, 1, 33, undefined);
148 $t10_11 = $rt.builtin.len($t1_2);
149 $t11_12 = ($t10_11 - 32);
150 $t12_13 = $rt.builtin.sliceSlice($t1_2, 33, $t11_12, undefined);
151 $t13_14 = $rt.builtin.len($t1_2);
152 $t14_15 = ($t13_14 - 32);
153 $t15_16 = $rt.builtin.sliceSlice($t1_2, $t14_15, undefined, undefined);
154 $t16_17 = $rt.builtin.sliceSlice($t0_1.$get(), undefined, undefined, undefined);
155 $t17_18 = smesh$lol$web$common$crypto$hkdf.Expand($t16_17, $t9_10, 76);
156 $t18_19 = { $value: $rt.builtin.makeSlice(32, 32, 0), $get() { return this.$value; }, $set(v) { this.$value = v; } };
157 $t19_20 = { $value: $rt.builtin.makeSlice(12, 12, 0), $get() { return this.$value; }, $set(v) { this.$value = v; } };
158 $t20_21 = $rt.builtin.sliceSlice($t18_19.$get(), undefined, undefined, undefined);
159 $t21_22 = $rt.builtin.sliceSlice($t17_18, undefined, 32, undefined);
160 $t22_23 = $rt.builtin.copy($t20_21, $t21_22);
161 $t23_24 = $rt.builtin.sliceSlice($t19_20.$get(), undefined, undefined, undefined);
162 $t24_25 = $rt.builtin.sliceSlice($t17_18, 32, 44, undefined);
163 $t25_26 = $rt.builtin.copy($t23_24, $t24_25);
164 $t26_27 = $rt.builtin.sliceSlice($t17_18, 44, 76, undefined);
165 $t27_28 = $rt.builtin.len($t12_13);
166 $t28_29 = (32 + $t27_28);
167 $t29_30 = $rt.builtin.makeSlice($t28_29, $t28_29, 0);
168 $t30_31 = $rt.builtin.copy($t29_30, $t9_10);
169 $t31_32 = $rt.builtin.sliceSlice($t29_30, 32, undefined, undefined);
170 $t32_33 = $rt.builtin.copy($t31_32, $t12_13);
171 $t33_34 = { $value: $rt.builtin.makeSlice(32, 32, 0), $get() { return this.$value; }, $set(v) { this.$value = v; } };
172 $t34_35 = smesh$lol$web$common$crypto$hmac.Sum($t26_27, $t29_30);
173 $t33_34.$set($rt.builtin.cloneValue($t34_35));
174 $t35_36 = (0 < 32);
175 if ($t35_36) {
176 $t36_37 = true;
177 $t37_38 = 0;
178 $block = 5; break;
179 }
180 else {
181 $t43_44 = true;
182 $block = 6; break;
183 }
184 break;
185 }
186 case 5: {
187 $t38_39 = $t15_16.addr($t37_38);
188 $t39_40 = $t38_39.$get();
189 $t40_41 = $t33_34.$get().addr($t37_38);
190 $t41_42 = $t40_41.$get();
191 $t42_43 = ($t39_40 !== $t41_42);
192 if ($t42_43) {
193 $block = 7; break;
194 }
195 else {
196 $t44_45 = $t36_37;
197 $block = 8; break;
198 }
199 break;
200 }
201 case 6: {
202 if ($t43_44) {
203 $block = 10; break;
204 }
205 else {
206 $block = 9; break;
207 }
208 break;
209 }
210 case 7: {
211 $t44_45 = false;
212 $block = 8; break;
213 break;
214 }
215 case 8: {
216 $t45_46 = ($t37_38 + 1);
217 $t46_47 = ($t45_46 < 32);
218 if ($t46_47) {
219 $t36_37 = $t44_45;
220 $t37_38 = $t45_46;
221 $block = 5; break;
222 }
223 else {
224 $t43_44 = $t44_45;
225 $block = 6; break;
226 }
227 break;
228 }
229 case 9: {
230 $t47_48 = $rt.builtin.stringToBytes('');
231 return [$t47_48, false];
232 break;
233 }
234 case 10: {
235 $t48_49 = $t18_19.$get();
236 $t49_50 = $t19_20.$get();
237 $t50_51 = smesh$lol$web$common$crypto$chacha20.XOR($t48_49, $t49_50, $t12_13);
238 $t51_52 = unpad($t50_51);
239 $t52_53 = $t51_52[0];
240 $t53_54 = $t51_52[1];
241 return [$t52_53, $t53_54];
242 break;
243 }
244 }
245 }
246 }
247
248 export function calcPadding(length) {
249 let $t0_1, $t1_2, $t2_3, $t3_4, $t4_5, $t5_6, $t6_7, $t7_8, $t8_9, $t9_10, $t10_11, $t11_12, $t12_13, $t13_14;
250 let $block = 0;
251 while (true) {
252 switch ($block) {
253 case 0: {
254 $t0_1 = (length <= 32);
255 if ($t0_1) {
256 $block = 1; break;
257 }
258 else {
259 $block = 2; break;
260 }
261 break;
262 }
263 case 1: {
264 return 32;
265 break;
266 }
267 case 2: {
268 $t1_2 = (length - 1);
269 $t11_12 = 0;
270 $t12_13 = $t1_2;
271 $block = 5; break;
272 break;
273 }
274 case 3: {
275 $t2_3 = ($t12_13 >> 1);
276 $t3_4 = ($t11_12 + 1);
277 $t11_12 = $t3_4;
278 $t12_13 = $t2_3;
279 $block = 5; break;
280 break;
281 }
282 case 4: {
283 $t4_5 = (1 << $t11_12);
284 $t5_6 = Math.trunc($t4_5 / 8);
285 $t6_7 = Math.max($t5_6, 32);
286 $t7_8 = (length - 1);
287 $t8_9 = Math.trunc($t7_8 / $t6_7);
288 $t9_10 = ($t8_9 + 1);
289 $t10_11 = ($t6_7 * $t9_10);
290 return $t10_11;
291 break;
292 }
293 case 5: {
294 $t13_14 = ($t12_13 > 0);
295 if ($t13_14) {
296 $block = 3; break;
297 }
298 else {
299 $block = 4; break;
300 }
301 break;
302 }
303 }
304 }
305 }
306
307 export function pad(plaintext) {
308 let $t0_1, $t1_2, $t2_3, $t3_4, $t4_5, $t5_6, $t6_7, $t7_8, $t8_9, $t9_10, $t10_11;
309 $t0_1 = $rt.builtin.len(plaintext);
310 $t1_2 = calcPadding($t0_1);
311 $t2_3 = (2 + $t1_2);
312 $t3_4 = $rt.builtin.makeSlice($t2_3, $t2_3, 0);
313 $t4_5 = ($t0_1 >> 8);
314 $t5_6 = ($t4_5 & 0xFF);
315 $t6_7 = $t3_4.addr(0);
316 $t6_7.$set($t5_6);
317 $t7_8 = ($t0_1 & 0xFF);
318 $t8_9 = $t3_4.addr(1);
319 $t8_9.$set($t7_8);
320 $t9_10 = $rt.builtin.sliceSlice($t3_4, 2, undefined, undefined);
321 $t10_11 = $rt.builtin.copy($t9_10, plaintext);
322 return $t3_4;
323 }
324
325 export function unpad(padded) {
326 let $t0_1, $t1_2, $t2_3, $t3_4, $t4_5, $t5_6, $t6_7, $t7_8, $t8_9, $t9_10, $t10_11, $t11_12, $t12_13, $t13_14, $t14_15, $t15_16, $t16_17, $t17_18, $t18_19, $t19_20, $t20_21, $t21_22, $t22_23, $t23_24, $t24_25, $t25_26, $t26_27;
327 let $block = 0;
328 while (true) {
329 switch ($block) {
330 case 0: {
331 $t0_1 = $rt.builtin.len(padded);
332 $t1_2 = ($t0_1 < 2);
333 if ($t1_2) {
334 $block = 1; break;
335 }
336 else {
337 $block = 2; break;
338 }
339 break;
340 }
341 case 1: {
342 $t2_3 = $rt.builtin.stringToBytes('');
343 return [$t2_3, false];
344 break;
345 }
346 case 2: {
347 $t3_4 = padded.addr(0);
348 $t4_5 = $t3_4.$get();
349 $t5_6 = $t4_5;
350 $t6_7 = ($t5_6 << 8);
351 $t7_8 = padded.addr(1);
352 $t8_9 = $t7_8.$get();
353 $t9_10 = $t8_9;
354 $t10_11 = ($t6_7 + $t9_10);
355 $t11_12 = ($t10_11 < 1);
356 if ($t11_12) {
357 $block = 3; break;
358 }
359 else {
360 $block = 5; break;
361 }
362 break;
363 }
364 case 3: {
365 $t12_13 = $rt.builtin.stringToBytes('');
366 return [$t12_13, false];
367 break;
368 }
369 case 4: {
370 $t13_14 = (2 + $t10_11);
371 $t17_18 = $t13_14;
372 $block = 6; break;
373 break;
374 }
375 case 5: {
376 $t14_15 = $rt.builtin.len(padded);
377 $t15_16 = ($t14_15 - 2);
378 $t16_17 = ($t10_11 > $t15_16);
379 if ($t16_17) {
380 $block = 3; break;
381 }
382 else {
383 $block = 4; break;
384 }
385 break;
386 }
387 case 6: {
388 $t18_19 = $rt.builtin.len(padded);
389 $t19_20 = ($t17_18 < $t18_19);
390 if ($t19_20) {
391 $block = 7; break;
392 }
393 else {
394 $block = 8; break;
395 }
396 break;
397 }
398 case 7: {
399 $t20_21 = padded.addr($t17_18);
400 $t21_22 = $t20_21.$get();
401 $t22_23 = ($t21_22 !== 0);
402 if ($t22_23) {
403 $block = 9; break;
404 }
405 else {
406 $block = 10; break;
407 }
408 break;
409 }
410 case 8: {
411 $t23_24 = (2 + $t10_11);
412 $t24_25 = $rt.builtin.sliceSlice(padded, 2, $t23_24, undefined);
413 return [$t24_25, true];
414 break;
415 }
416 case 9: {
417 $t25_26 = $rt.builtin.stringToBytes('');
418 return [$t25_26, false];
419 break;
420 }
421 case 10: {
422 $t26_27 = ($t17_18 + 1);
423 $t17_18 = $t26_27;
424 $block = 6; break;
425 break;
426 }
427 }
428 }
429 }
430
431 export function __moxie_concat(a, b) {
432 let $t0_1;
433 $t0_1 = $rt.types.makeInterface('string', '__moxie_concat: compiler failed to intercept');
434 $rt.runtime.panic($t0_1);
435 }
436
437 export function __moxie_eq(a, b) {
438 let $t0_1;
439 $t0_1 = $rt.types.makeInterface('string', '__moxie_eq: compiler failed to intercept');
440 $rt.runtime.panic($t0_1);
441 }
442
443 export function __moxie_lt(a, b) {
444 let $t0_1;
445 $t0_1 = $rt.types.makeInterface('string', '__moxie_lt: compiler failed to intercept');
446 $rt.runtime.panic($t0_1);
447 }
448
449 export function __moxie_secalloc(n) {
450 let $t0_1;
451 $t0_1 = $rt.types.makeInterface('string', '__moxie_secalloc: compiler failed to intercept');
452 $rt.runtime.panic($t0_1);
453 }
454
455