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