@yielded/crypto 0.0.0-stage → 0.1.0-beta.19

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 (88) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +39 -2
  3. package/THIRD_PARTY_NOTICES.md +378 -0
  4. package/dist/Aead.d.mts +34 -0
  5. package/dist/Aead.mjs +28 -0
  6. package/dist/Aead.mjs.map +1 -0
  7. package/dist/Errors.d.mts +20 -0
  8. package/dist/Errors.mjs +19 -0
  9. package/dist/Errors.mjs.map +1 -0
  10. package/dist/Hmac.d.mts +39 -0
  11. package/dist/Hmac.mjs +26 -0
  12. package/dist/Hmac.mjs.map +1 -0
  13. package/dist/Kdf.d.mts +54 -0
  14. package/dist/Kdf.mjs +78 -0
  15. package/dist/Kdf.mjs.map +1 -0
  16. package/dist/KdfAdmission.d.mts +24 -0
  17. package/dist/KdfAdmission.mjs +48 -0
  18. package/dist/KdfAdmission.mjs.map +1 -0
  19. package/dist/Portable.d.mts +11 -0
  20. package/dist/Portable.mjs +13 -0
  21. package/dist/Portable.mjs.map +1 -0
  22. package/dist/Signature.d.mts +70 -0
  23. package/dist/Signature.mjs +73 -0
  24. package/dist/Signature.mjs.map +1 -0
  25. package/dist/WebCrypto.d.mts +20 -0
  26. package/dist/WebCrypto.mjs +33 -0
  27. package/dist/WebCrypto.mjs.map +1 -0
  28. package/dist/index.d.mts +7 -0
  29. package/dist/index.mjs +7 -0
  30. package/dist/internal/aead.mjs +81 -0
  31. package/dist/internal/aead.mjs.map +1 -0
  32. package/dist/internal/argon2-core.mjs +293 -0
  33. package/dist/internal/argon2-core.mjs.map +1 -0
  34. package/dist/internal/argon2.mjs +16 -0
  35. package/dist/internal/argon2.mjs.map +1 -0
  36. package/dist/internal/blake2b.mjs +359 -0
  37. package/dist/internal/blake2b.mjs.map +1 -0
  38. package/dist/internal/common.mjs +20 -0
  39. package/dist/internal/common.mjs.map +1 -0
  40. package/dist/internal/hmac.mjs +68 -0
  41. package/dist/internal/hmac.mjs.map +1 -0
  42. package/dist/internal/kdf.mjs +99 -0
  43. package/dist/internal/kdf.mjs.map +1 -0
  44. package/dist/internal/layer.mjs +26 -0
  45. package/dist/internal/layer.mjs.map +1 -0
  46. package/dist/internal/node.d.mts +11 -0
  47. package/dist/internal/node.mjs +34 -0
  48. package/dist/internal/node.mjs.map +1 -0
  49. package/dist/internal/poly1305.mjs +247 -0
  50. package/dist/internal/poly1305.mjs.map +1 -0
  51. package/dist/internal/signature.mjs +140 -0
  52. package/dist/internal/signature.mjs.map +1 -0
  53. package/dist/internal/word64.mjs +25 -0
  54. package/dist/internal/word64.mjs.map +1 -0
  55. package/dist/internal/xchacha-core.mjs +285 -0
  56. package/dist/internal/xchacha-core.mjs.map +1 -0
  57. package/dist/internal/xchacha.mjs +21 -0
  58. package/dist/internal/xchacha.mjs.map +1 -0
  59. package/dist/platform-bun.d.mts +2 -0
  60. package/dist/platform-bun.mjs +2 -0
  61. package/dist/platform-node.d.mts +2 -0
  62. package/dist/platform-node.mjs +2 -0
  63. package/package.json +1 -6
  64. package/src/Aead.ts +39 -0
  65. package/src/Errors.ts +27 -0
  66. package/src/Hmac.ts +41 -0
  67. package/src/Kdf.ts +87 -0
  68. package/src/KdfAdmission.ts +87 -0
  69. package/src/Portable.ts +8 -0
  70. package/src/Signature.ts +87 -0
  71. package/src/WebCrypto.ts +46 -0
  72. package/src/index.ts +6 -0
  73. package/src/internal/aead.ts +119 -0
  74. package/src/internal/argon2-core.ts +470 -0
  75. package/src/internal/argon2.ts +23 -0
  76. package/src/internal/blake2b.ts +230 -0
  77. package/src/internal/common.ts +44 -0
  78. package/src/internal/hmac.ts +111 -0
  79. package/src/internal/kdf.ts +150 -0
  80. package/src/internal/layer.ts +32 -0
  81. package/src/internal/node.ts +46 -0
  82. package/src/internal/poly1305.ts +289 -0
  83. package/src/internal/signature.ts +188 -0
  84. package/src/internal/word64.ts +48 -0
  85. package/src/internal/xchacha-core.ts +397 -0
  86. package/src/internal/xchacha.ts +26 -0
  87. package/src/platform-bun.ts +2 -0
  88. package/src/platform-node.ts +2 -0
@@ -0,0 +1,34 @@
1
+ import { CryptoUnavailable, UnsupportedAlgorithm } from "../Errors.mjs";
2
+ import { makeLayer } from "./layer.mjs";
3
+ import { xchacha } from "./xchacha.mjs";
4
+ import { Effect, Result } from "effect";
5
+ import * as crypto from "node:crypto";
6
+ //#region src/internal/node.ts
7
+ const argon2 = Effect.fnUntraced(function* (input) {
8
+ if (typeof crypto.argon2 !== "function") return yield* UnsupportedAlgorithm.make({});
9
+ return yield* Effect.callback((resume) => {
10
+ const registration = Result.try({
11
+ try: () => crypto.argon2("argon2id", {
12
+ message: input.password,
13
+ nonce: input.salt,
14
+ parallelism: input.parallelism,
15
+ memory: input.memoryKiB,
16
+ passes: input.passes,
17
+ tagLength: input.length,
18
+ secret: input.secret,
19
+ associatedData: input.associatedData
20
+ }, (error, key) => resume(error === null ? Effect.succeed(key) : Effect.fail(CryptoUnavailable.make({})))),
21
+ catch: () => CryptoUnavailable.make({})
22
+ });
23
+ if (Result.isFailure(registration)) resume(Effect.fail(registration.failure));
24
+ }).pipe(Effect.uninterruptible);
25
+ });
26
+ /** Node-compatible WebCrypto/Argon2id with the portable XChaCha20-Poly1305 extension. */
27
+ const layer = (limits = {}) => makeLayer(crypto.webcrypto.subtle, limits, {
28
+ argon2,
29
+ xchacha
30
+ });
31
+ //#endregion
32
+ export { layer };
33
+
34
+ //# sourceMappingURL=node.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.mjs","names":[],"sources":["../../src/internal/node.ts"],"sourcesContent":["import * as crypto from \"node:crypto\";\n\nimport { Effect, Result } from \"effect\";\n\nimport { CryptoUnavailable, UnsupportedAlgorithm } from \"../Errors\";\nimport type { Limits } from \"../Kdf\";\nimport type { Argon2, Argon2Parameters } from \"./kdf\";\nimport { makeLayer } from \"./layer\";\nimport { xchacha } from \"./xchacha\";\n\nconst argon2: Argon2 = Effect.fnUntraced(function* (input: Argon2Parameters) {\n // Namespace import keeps this module loadable on Node versions without Argon2.\n if (typeof crypto.argon2 !== \"function\") return yield* UnsupportedAlgorithm.make({});\n\n // Node cannot cancel this work. Keep borrowed buffers and admission until the\n // callback completes, including when its caller has requested interruption.\n return yield* Effect.callback<Uint8Array, CryptoUnavailable>((resume) => {\n const registration = Result.try({\n try: () =>\n crypto.argon2(\n \"argon2id\",\n {\n message: input.password,\n nonce: input.salt,\n parallelism: input.parallelism,\n memory: input.memoryKiB,\n passes: input.passes,\n tagLength: input.length,\n secret: input.secret,\n associatedData: input.associatedData,\n },\n (error, key) =>\n resume(error === null ? Effect.succeed(key) : Effect.fail(CryptoUnavailable.make({}))),\n ),\n catch: () => CryptoUnavailable.make({}),\n });\n\n if (Result.isFailure(registration)) resume(Effect.fail(registration.failure));\n }).pipe(Effect.uninterruptible);\n});\n\n/** Node-compatible WebCrypto/Argon2id with the portable XChaCha20-Poly1305 extension. */\nexport const layer = (limits: Partial<Limits> = {}) =>\n // Node's declarations include additional key usages absent from lib.dom. The\n // standard operations used here share the WebCrypto ABI; no payload is cast.\n makeLayer(crypto.webcrypto.subtle as SubtleCrypto, limits, { argon2, xchacha });\n"],"mappings":";;;;;;AAUA,MAAM,SAAiB,OAAO,WAAW,WAAW,OAAyB;CAE3E,IAAI,OAAO,OAAO,WAAW,YAAY,OAAO,OAAO,qBAAqB,KAAK,CAAC,CAAC;CAInF,OAAO,OAAO,OAAO,UAAyC,WAAW;EACvE,MAAM,eAAe,OAAO,IAAI;GAC9B,WACE,OAAO,OACL,YACA;IACE,SAAS,MAAM;IACf,OAAO,MAAM;IACb,aAAa,MAAM;IACnB,QAAQ,MAAM;IACd,QAAQ,MAAM;IACd,WAAW,MAAM;IACjB,QAAQ,MAAM;IACd,gBAAgB,MAAM;GACxB,IACC,OAAO,QACN,OAAO,UAAU,OAAO,OAAO,QAAQ,GAAG,IAAI,OAAO,KAAK,kBAAkB,KAAK,CAAC,CAAC,CAAC,CAAC,CACzF;GACF,aAAa,kBAAkB,KAAK,CAAC,CAAC;EACxC,CAAC;EAED,IAAI,OAAO,UAAU,YAAY,GAAG,OAAO,OAAO,KAAK,aAAa,OAAO,CAAC;CAC9E,CAAC,CAAC,CAAC,KAAK,OAAO,eAAe;AAChC,CAAC;;AAGD,MAAa,SAAS,SAA0B,CAAC,MAG/C,UAAU,OAAO,UAAU,QAAwB,QAAQ;CAAE;CAAQ;AAAQ,CAAC"}
@@ -0,0 +1,247 @@
1
+ //#region src/internal/poly1305.ts
2
+ /**
3
+ * Adapted from noble-ciphers, Copyright (c) 2022 Paul Miller.
4
+ * MIT; source revision 785181b0772ba84afbe812025714163e4e48262f.
5
+ * Poly1305 arithmetic derives from the public-domain poly1305-donna implementation.
6
+ * See ../../THIRD_PARTY_NOTICES.md for source mapping and licenses.
7
+ */
8
+ function u8to16(a, i) {
9
+ return a[i++] & 255 | (a[i++] & 255) << 8;
10
+ }
11
+ var Poly1305 = class {
12
+ blockLen = 16;
13
+ outputLen = 16;
14
+ buffer = /* @__PURE__ */ new Uint8Array(16);
15
+ r = /* @__PURE__ */ new Uint16Array(10);
16
+ h = /* @__PURE__ */ new Uint16Array(10);
17
+ pad = /* @__PURE__ */ new Uint16Array(8);
18
+ pos = 0;
19
+ constructor(key) {
20
+ const t0 = u8to16(key, 0);
21
+ const t1 = u8to16(key, 2);
22
+ const t2 = u8to16(key, 4);
23
+ const t3 = u8to16(key, 6);
24
+ const t4 = u8to16(key, 8);
25
+ const t5 = u8to16(key, 10);
26
+ const t6 = u8to16(key, 12);
27
+ const t7 = u8to16(key, 14);
28
+ this.r[0] = t0 & 8191;
29
+ this.r[1] = (t0 >>> 13 | t1 << 3) & 8191;
30
+ this.r[2] = (t1 >>> 10 | t2 << 6) & 7939;
31
+ this.r[3] = (t2 >>> 7 | t3 << 9) & 8191;
32
+ this.r[4] = (t3 >>> 4 | t4 << 12) & 255;
33
+ this.r[5] = t4 >>> 1 & 8190;
34
+ this.r[6] = (t4 >>> 14 | t5 << 2) & 8191;
35
+ this.r[7] = (t5 >>> 11 | t6 << 5) & 8065;
36
+ this.r[8] = (t6 >>> 8 | t7 << 8) & 8191;
37
+ this.r[9] = t7 >>> 5 & 127;
38
+ for (let i = 0; i < 8; i++) this.pad[i] = u8to16(key, 16 + 2 * i);
39
+ }
40
+ process(data, offset, isLast = false) {
41
+ const hibit = isLast ? 0 : 2048;
42
+ const { h, r } = this;
43
+ const r0 = r[0];
44
+ const r1 = r[1];
45
+ const r2 = r[2];
46
+ const r3 = r[3];
47
+ const r4 = r[4];
48
+ const r5 = r[5];
49
+ const r6 = r[6];
50
+ const r7 = r[7];
51
+ const r8 = r[8];
52
+ const r9 = r[9];
53
+ const t0 = u8to16(data, offset + 0);
54
+ const t1 = u8to16(data, offset + 2);
55
+ const t2 = u8to16(data, offset + 4);
56
+ const t3 = u8to16(data, offset + 6);
57
+ const t4 = u8to16(data, offset + 8);
58
+ const t5 = u8to16(data, offset + 10);
59
+ const t6 = u8to16(data, offset + 12);
60
+ const t7 = u8to16(data, offset + 14);
61
+ let h0 = h[0] + (t0 & 8191);
62
+ let h1 = h[1] + ((t0 >>> 13 | t1 << 3) & 8191);
63
+ let h2 = h[2] + ((t1 >>> 10 | t2 << 6) & 8191);
64
+ let h3 = h[3] + ((t2 >>> 7 | t3 << 9) & 8191);
65
+ let h4 = h[4] + ((t3 >>> 4 | t4 << 12) & 8191);
66
+ let h5 = h[5] + (t4 >>> 1 & 8191);
67
+ let h6 = h[6] + ((t4 >>> 14 | t5 << 2) & 8191);
68
+ let h7 = h[7] + ((t5 >>> 11 | t6 << 5) & 8191);
69
+ let h8 = h[8] + ((t6 >>> 8 | t7 << 8) & 8191);
70
+ let h9 = h[9] + (t7 >>> 5 | hibit);
71
+ let c = 0;
72
+ let d0 = c + h0 * r0 + h1 * (5 * r9) + h2 * (5 * r8) + h3 * (5 * r7) + h4 * (5 * r6);
73
+ c = d0 >>> 13;
74
+ d0 &= 8191;
75
+ d0 += h5 * (5 * r5) + h6 * (5 * r4) + h7 * (5 * r3) + h8 * (5 * r2) + h9 * (5 * r1);
76
+ c += d0 >>> 13;
77
+ d0 &= 8191;
78
+ let d1 = c + h0 * r1 + h1 * r0 + h2 * (5 * r9) + h3 * (5 * r8) + h4 * (5 * r7);
79
+ c = d1 >>> 13;
80
+ d1 &= 8191;
81
+ d1 += h5 * (5 * r6) + h6 * (5 * r5) + h7 * (5 * r4) + h8 * (5 * r3) + h9 * (5 * r2);
82
+ c += d1 >>> 13;
83
+ d1 &= 8191;
84
+ let d2 = c + h0 * r2 + h1 * r1 + h2 * r0 + h3 * (5 * r9) + h4 * (5 * r8);
85
+ c = d2 >>> 13;
86
+ d2 &= 8191;
87
+ d2 += h5 * (5 * r7) + h6 * (5 * r6) + h7 * (5 * r5) + h8 * (5 * r4) + h9 * (5 * r3);
88
+ c += d2 >>> 13;
89
+ d2 &= 8191;
90
+ let d3 = c + h0 * r3 + h1 * r2 + h2 * r1 + h3 * r0 + h4 * (5 * r9);
91
+ c = d3 >>> 13;
92
+ d3 &= 8191;
93
+ d3 += h5 * (5 * r8) + h6 * (5 * r7) + h7 * (5 * r6) + h8 * (5 * r5) + h9 * (5 * r4);
94
+ c += d3 >>> 13;
95
+ d3 &= 8191;
96
+ let d4 = c + h0 * r4 + h1 * r3 + h2 * r2 + h3 * r1 + h4 * r0;
97
+ c = d4 >>> 13;
98
+ d4 &= 8191;
99
+ d4 += h5 * (5 * r9) + h6 * (5 * r8) + h7 * (5 * r7) + h8 * (5 * r6) + h9 * (5 * r5);
100
+ c += d4 >>> 13;
101
+ d4 &= 8191;
102
+ let d5 = c + h0 * r5 + h1 * r4 + h2 * r3 + h3 * r2 + h4 * r1;
103
+ c = d5 >>> 13;
104
+ d5 &= 8191;
105
+ d5 += h5 * r0 + h6 * (5 * r9) + h7 * (5 * r8) + h8 * (5 * r7) + h9 * (5 * r6);
106
+ c += d5 >>> 13;
107
+ d5 &= 8191;
108
+ let d6 = c + h0 * r6 + h1 * r5 + h2 * r4 + h3 * r3 + h4 * r2;
109
+ c = d6 >>> 13;
110
+ d6 &= 8191;
111
+ d6 += h5 * r1 + h6 * r0 + h7 * (5 * r9) + h8 * (5 * r8) + h9 * (5 * r7);
112
+ c += d6 >>> 13;
113
+ d6 &= 8191;
114
+ let d7 = c + h0 * r7 + h1 * r6 + h2 * r5 + h3 * r4 + h4 * r3;
115
+ c = d7 >>> 13;
116
+ d7 &= 8191;
117
+ d7 += h5 * r2 + h6 * r1 + h7 * r0 + h8 * (5 * r9) + h9 * (5 * r8);
118
+ c += d7 >>> 13;
119
+ d7 &= 8191;
120
+ let d8 = c + h0 * r8 + h1 * r7 + h2 * r6 + h3 * r5 + h4 * r4;
121
+ c = d8 >>> 13;
122
+ d8 &= 8191;
123
+ d8 += h5 * r3 + h6 * r2 + h7 * r1 + h8 * r0 + h9 * (5 * r9);
124
+ c += d8 >>> 13;
125
+ d8 &= 8191;
126
+ let d9 = c + h0 * r9 + h1 * r8 + h2 * r7 + h3 * r6 + h4 * r5;
127
+ c = d9 >>> 13;
128
+ d9 &= 8191;
129
+ d9 += h5 * r4 + h6 * r3 + h7 * r2 + h8 * r1 + h9 * r0;
130
+ c += d9 >>> 13;
131
+ d9 &= 8191;
132
+ c = (c << 2) + c | 0;
133
+ c = c + d0 | 0;
134
+ d0 = c & 8191;
135
+ c = c >>> 13;
136
+ d1 += c;
137
+ h[0] = d0;
138
+ h[1] = d1;
139
+ h[2] = d2;
140
+ h[3] = d3;
141
+ h[4] = d4;
142
+ h[5] = d5;
143
+ h[6] = d6;
144
+ h[7] = d7;
145
+ h[8] = d8;
146
+ h[9] = d9;
147
+ }
148
+ finalize() {
149
+ const { h, pad } = this;
150
+ const g = /* @__PURE__ */ new Uint16Array(10);
151
+ let c = h[1] >>> 13;
152
+ h[1] &= 8191;
153
+ for (let i = 2; i < 10; i++) {
154
+ h[i] += c;
155
+ c = h[i] >>> 13;
156
+ h[i] &= 8191;
157
+ }
158
+ h[0] += c * 5;
159
+ c = h[0] >>> 13;
160
+ h[0] &= 8191;
161
+ h[1] += c;
162
+ c = h[1] >>> 13;
163
+ h[1] &= 8191;
164
+ h[2] += c;
165
+ g[0] = h[0] + 5;
166
+ c = g[0] >>> 13;
167
+ g[0] &= 8191;
168
+ for (let i = 1; i < 10; i++) {
169
+ g[i] = h[i] + c;
170
+ c = g[i] >>> 13;
171
+ g[i] &= 8191;
172
+ }
173
+ g[9] -= 8192;
174
+ let mask = (c ^ 1) - 1;
175
+ for (let i = 0; i < 10; i++) g[i] &= mask;
176
+ mask = ~mask;
177
+ for (let i = 0; i < 10; i++) h[i] = h[i] & mask | g[i];
178
+ h[0] = (h[0] | h[1] << 13) & 65535;
179
+ h[1] = (h[1] >>> 3 | h[2] << 10) & 65535;
180
+ h[2] = (h[2] >>> 6 | h[3] << 7) & 65535;
181
+ h[3] = (h[3] >>> 9 | h[4] << 4) & 65535;
182
+ h[4] = (h[4] >>> 12 | h[5] << 1 | h[6] << 14) & 65535;
183
+ h[5] = (h[6] >>> 2 | h[7] << 11) & 65535;
184
+ h[6] = (h[7] >>> 5 | h[8] << 8) & 65535;
185
+ h[7] = (h[8] >>> 8 | h[9] << 5) & 65535;
186
+ let f = h[0] + pad[0];
187
+ h[0] = f & 65535;
188
+ for (let i = 1; i < 8; i++) {
189
+ f = (h[i] + pad[i] | 0) + (f >>> 16) | 0;
190
+ h[i] = f & 65535;
191
+ }
192
+ g.fill(0);
193
+ }
194
+ update(data) {
195
+ const { buffer, blockLen } = this;
196
+ const len = data.length;
197
+ for (let pos = 0; pos < len;) {
198
+ const take = Math.min(blockLen - this.pos, len - pos);
199
+ if (take === blockLen) {
200
+ for (; blockLen <= len - pos; pos += blockLen) this.process(data, pos);
201
+ continue;
202
+ }
203
+ buffer.set(data.subarray(pos, pos + take), this.pos);
204
+ this.pos += take;
205
+ pos += take;
206
+ if (this.pos === blockLen) {
207
+ this.process(buffer, 0, false);
208
+ this.pos = 0;
209
+ }
210
+ }
211
+ return this;
212
+ }
213
+ destroy() {
214
+ this.h.fill(0);
215
+ this.r.fill(0);
216
+ this.buffer.fill(0);
217
+ this.pad.fill(0);
218
+ this.pos = 0;
219
+ }
220
+ digestInto(out) {
221
+ const { buffer, h } = this;
222
+ let { pos } = this;
223
+ if (pos) {
224
+ buffer[pos++] = 1;
225
+ for (; pos < 16; pos++) buffer[pos] = 0;
226
+ this.process(buffer, 0, true);
227
+ }
228
+ this.finalize();
229
+ let opos = 0;
230
+ for (let i = 0; i < 8; i++) {
231
+ out[opos++] = h[i] >>> 0;
232
+ out[opos++] = h[i] >>> 8;
233
+ }
234
+ return out;
235
+ }
236
+ digest() {
237
+ const { buffer, outputLen } = this;
238
+ this.digestInto(buffer);
239
+ const res = buffer.slice(0, outputLen);
240
+ this.destroy();
241
+ return res;
242
+ }
243
+ };
244
+ //#endregion
245
+ export { Poly1305 };
246
+
247
+ //# sourceMappingURL=poly1305.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poly1305.mjs","names":[],"sources":["../../src/internal/poly1305.ts"],"sourcesContent":["/**\n * Adapted from noble-ciphers, Copyright (c) 2022 Paul Miller.\n * MIT; source revision 785181b0772ba84afbe812025714163e4e48262f.\n * Poly1305 arithmetic derives from the public-domain poly1305-donna implementation.\n * See ../../THIRD_PARTY_NOTICES.md for source mapping and licenses.\n */\nfunction u8to16(a: Uint8Array, i: number) {\n return (a[i++] & 0xff) | ((a[i++] & 0xff) << 8);\n}\n\nexport class Poly1305 {\n readonly blockLen = 16;\n readonly outputLen = 16;\n private buffer = new Uint8Array(16);\n private r = new Uint16Array(10);\n private h = new Uint16Array(10);\n private pad = new Uint16Array(8);\n private pos = 0;\n\n constructor(key: Uint8Array) {\n const t0 = u8to16(key, 0);\n const t1 = u8to16(key, 2);\n const t2 = u8to16(key, 4);\n const t3 = u8to16(key, 6);\n const t4 = u8to16(key, 8);\n const t5 = u8to16(key, 10);\n const t6 = u8to16(key, 12);\n const t7 = u8to16(key, 14);\n\n // https://github.com/floodyberry/poly1305-donna/blob/e6ad6e091d30d7f4ec2d4f978be1fcfcbce72781/poly1305-donna-16.h#L47\n this.r[0] = t0 & 0x1fff;\n this.r[1] = ((t0 >>> 13) | (t1 << 3)) & 0x1fff;\n this.r[2] = ((t1 >>> 10) | (t2 << 6)) & 0x1f03;\n this.r[3] = ((t2 >>> 7) | (t3 << 9)) & 0x1fff;\n this.r[4] = ((t3 >>> 4) | (t4 << 12)) & 0x00ff;\n this.r[5] = (t4 >>> 1) & 0x1ffe;\n this.r[6] = ((t4 >>> 14) | (t5 << 2)) & 0x1fff;\n this.r[7] = ((t5 >>> 11) | (t6 << 5)) & 0x1f81;\n this.r[8] = ((t6 >>> 8) | (t7 << 8)) & 0x1fff;\n this.r[9] = (t7 >>> 5) & 0x007f;\n for (let i = 0; i < 8; i++) this.pad[i] = u8to16(key, 16 + 2 * i);\n }\n\n private process(data: Uint8Array, offset: number, isLast = false) {\n const hibit = isLast ? 0 : 1 << 11;\n const { h, r } = this;\n const r0 = r[0];\n const r1 = r[1];\n const r2 = r[2];\n const r3 = r[3];\n const r4 = r[4];\n const r5 = r[5];\n const r6 = r[6];\n const r7 = r[7];\n const r8 = r[8];\n const r9 = r[9];\n\n const t0 = u8to16(data, offset + 0);\n const t1 = u8to16(data, offset + 2);\n const t2 = u8to16(data, offset + 4);\n const t3 = u8to16(data, offset + 6);\n const t4 = u8to16(data, offset + 8);\n const t5 = u8to16(data, offset + 10);\n const t6 = u8to16(data, offset + 12);\n const t7 = u8to16(data, offset + 14);\n\n let h0 = h[0] + (t0 & 0x1fff);\n let h1 = h[1] + (((t0 >>> 13) | (t1 << 3)) & 0x1fff);\n let h2 = h[2] + (((t1 >>> 10) | (t2 << 6)) & 0x1fff);\n let h3 = h[3] + (((t2 >>> 7) | (t3 << 9)) & 0x1fff);\n let h4 = h[4] + (((t3 >>> 4) | (t4 << 12)) & 0x1fff);\n let h5 = h[5] + ((t4 >>> 1) & 0x1fff);\n let h6 = h[6] + (((t4 >>> 14) | (t5 << 2)) & 0x1fff);\n let h7 = h[7] + (((t5 >>> 11) | (t6 << 5)) & 0x1fff);\n let h8 = h[8] + (((t6 >>> 8) | (t7 << 8)) & 0x1fff);\n let h9 = h[9] + ((t7 >>> 5) | hibit);\n\n let c = 0;\n\n let d0 = c + h0 * r0 + h1 * (5 * r9) + h2 * (5 * r8) + h3 * (5 * r7) + h4 * (5 * r6);\n\n c = d0 >>> 13;\n d0 &= 0x1fff;\n d0 += h5 * (5 * r5) + h6 * (5 * r4) + h7 * (5 * r3) + h8 * (5 * r2) + h9 * (5 * r1);\n c += d0 >>> 13;\n d0 &= 0x1fff;\n\n let d1 = c + h0 * r1 + h1 * r0 + h2 * (5 * r9) + h3 * (5 * r8) + h4 * (5 * r7);\n\n c = d1 >>> 13;\n d1 &= 0x1fff;\n d1 += h5 * (5 * r6) + h6 * (5 * r5) + h7 * (5 * r4) + h8 * (5 * r3) + h9 * (5 * r2);\n c += d1 >>> 13;\n d1 &= 0x1fff;\n\n let d2 = c + h0 * r2 + h1 * r1 + h2 * r0 + h3 * (5 * r9) + h4 * (5 * r8);\n\n c = d2 >>> 13;\n d2 &= 0x1fff;\n d2 += h5 * (5 * r7) + h6 * (5 * r6) + h7 * (5 * r5) + h8 * (5 * r4) + h9 * (5 * r3);\n c += d2 >>> 13;\n d2 &= 0x1fff;\n\n let d3 = c + h0 * r3 + h1 * r2 + h2 * r1 + h3 * r0 + h4 * (5 * r9);\n\n c = d3 >>> 13;\n d3 &= 0x1fff;\n d3 += h5 * (5 * r8) + h6 * (5 * r7) + h7 * (5 * r6) + h8 * (5 * r5) + h9 * (5 * r4);\n c += d3 >>> 13;\n d3 &= 0x1fff;\n\n let d4 = c + h0 * r4 + h1 * r3 + h2 * r2 + h3 * r1 + h4 * r0;\n\n c = d4 >>> 13;\n d4 &= 0x1fff;\n d4 += h5 * (5 * r9) + h6 * (5 * r8) + h7 * (5 * r7) + h8 * (5 * r6) + h9 * (5 * r5);\n c += d4 >>> 13;\n d4 &= 0x1fff;\n\n let d5 = c + h0 * r5 + h1 * r4 + h2 * r3 + h3 * r2 + h4 * r1;\n\n c = d5 >>> 13;\n d5 &= 0x1fff;\n d5 += h5 * r0 + h6 * (5 * r9) + h7 * (5 * r8) + h8 * (5 * r7) + h9 * (5 * r6);\n c += d5 >>> 13;\n d5 &= 0x1fff;\n\n let d6 = c + h0 * r6 + h1 * r5 + h2 * r4 + h3 * r3 + h4 * r2;\n\n c = d6 >>> 13;\n d6 &= 0x1fff;\n d6 += h5 * r1 + h6 * r0 + h7 * (5 * r9) + h8 * (5 * r8) + h9 * (5 * r7);\n c += d6 >>> 13;\n d6 &= 0x1fff;\n\n let d7 = c + h0 * r7 + h1 * r6 + h2 * r5 + h3 * r4 + h4 * r3;\n\n c = d7 >>> 13;\n d7 &= 0x1fff;\n d7 += h5 * r2 + h6 * r1 + h7 * r0 + h8 * (5 * r9) + h9 * (5 * r8);\n c += d7 >>> 13;\n d7 &= 0x1fff;\n\n let d8 = c + h0 * r8 + h1 * r7 + h2 * r6 + h3 * r5 + h4 * r4;\n\n c = d8 >>> 13;\n d8 &= 0x1fff;\n d8 += h5 * r3 + h6 * r2 + h7 * r1 + h8 * r0 + h9 * (5 * r9);\n c += d8 >>> 13;\n d8 &= 0x1fff;\n\n let d9 = c + h0 * r9 + h1 * r8 + h2 * r7 + h3 * r6 + h4 * r5;\n\n c = d9 >>> 13;\n d9 &= 0x1fff;\n d9 += h5 * r4 + h6 * r3 + h7 * r2 + h8 * r1 + h9 * r0;\n c += d9 >>> 13;\n d9 &= 0x1fff;\n\n c = ((c << 2) + c) | 0;\n c = (c + d0) | 0;\n d0 = c & 0x1fff;\n c = c >>> 13;\n d1 += c;\n\n h[0] = d0;\n h[1] = d1;\n h[2] = d2;\n h[3] = d3;\n h[4] = d4;\n h[5] = d5;\n h[6] = d6;\n h[7] = d7;\n h[8] = d8;\n h[9] = d9;\n }\n\n private finalize() {\n const { h, pad } = this;\n const g = new Uint16Array(10);\n let c = h[1] >>> 13;\n\n h[1] &= 0x1fff;\n for (let i = 2; i < 10; i++) {\n h[i] += c;\n c = h[i] >>> 13;\n h[i] &= 0x1fff;\n }\n h[0] += c * 5;\n c = h[0] >>> 13;\n h[0] &= 0x1fff;\n h[1] += c;\n c = h[1] >>> 13;\n h[1] &= 0x1fff;\n h[2] += c;\n\n g[0] = h[0] + 5;\n c = g[0] >>> 13;\n g[0] &= 0x1fff;\n for (let i = 1; i < 10; i++) {\n g[i] = h[i] + c;\n c = g[i] >>> 13;\n g[i] &= 0x1fff;\n }\n g[9] -= 1 << 13;\n\n let mask = (c ^ 1) - 1;\n\n for (let i = 0; i < 10; i++) g[i] &= mask;\n mask = ~mask;\n for (let i = 0; i < 10; i++) h[i] = (h[i] & mask) | g[i];\n h[0] = (h[0] | (h[1] << 13)) & 0xffff;\n h[1] = ((h[1] >>> 3) | (h[2] << 10)) & 0xffff;\n h[2] = ((h[2] >>> 6) | (h[3] << 7)) & 0xffff;\n h[3] = ((h[3] >>> 9) | (h[4] << 4)) & 0xffff;\n h[4] = ((h[4] >>> 12) | (h[5] << 1) | (h[6] << 14)) & 0xffff;\n h[5] = ((h[6] >>> 2) | (h[7] << 11)) & 0xffff;\n h[6] = ((h[7] >>> 5) | (h[8] << 8)) & 0xffff;\n h[7] = ((h[8] >>> 8) | (h[9] << 5)) & 0xffff;\n\n let f = h[0] + pad[0];\n\n h[0] = f & 0xffff;\n for (let i = 1; i < 8; i++) {\n f = (((h[i] + pad[i]) | 0) + (f >>> 16)) | 0;\n h[i] = f & 0xffff;\n }\n g.fill(0);\n }\n update(data: Uint8Array): this {\n const { buffer, blockLen } = this;\n const len = data.length;\n\n for (let pos = 0; pos < len;) {\n const take = Math.min(blockLen - this.pos, len - pos);\n\n // Fast path: we have at least one block in input\n if (take === blockLen) {\n for (; blockLen <= len - pos; pos += blockLen) this.process(data, pos);\n continue;\n }\n buffer.set(data.subarray(pos, pos + take), this.pos);\n this.pos += take;\n pos += take;\n if (this.pos === blockLen) {\n this.process(buffer, 0, false);\n this.pos = 0;\n }\n }\n\n return this;\n }\n destroy(): void {\n this.h.fill(0);\n this.r.fill(0);\n this.buffer.fill(0);\n this.pad.fill(0);\n this.pos = 0;\n }\n digestInto(out: Uint8Array): Uint8Array {\n const { buffer, h } = this;\n let { pos } = this;\n\n if (pos) {\n buffer[pos++] = 1;\n for (; pos < 16; pos++) buffer[pos] = 0;\n this.process(buffer, 0, true);\n }\n this.finalize();\n let opos = 0;\n\n for (let i = 0; i < 8; i++) {\n out[opos++] = h[i] >>> 0;\n out[opos++] = h[i] >>> 8;\n }\n\n return out;\n }\n digest(): Uint8Array {\n const { buffer, outputLen } = this;\n\n this.digestInto(buffer);\n const res = buffer.slice(0, outputLen);\n\n this.destroy();\n\n return res;\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,140 @@
1
+ import { InvalidInput } from "../Errors.mjs";
2
+ import { PrivateKeyParameters, PublicKeyParameters, SignInput, Signature, VerifyInput } from "../Signature.mjs";
3
+ import { copy, decode, importError, nativeError, withSecret } from "./common.mjs";
4
+ import { Effect, Redacted, Schema } from "effect";
5
+ import { Base64Url } from "effect/encoding";
6
+ //#region src/internal/signature.ts
7
+ const derBytes = Schema.Uint8Array.check(Schema.isMinLength(1), Schema.isMaxLength(16384));
8
+ const RsaAlgorithm = Schema.Struct({ modulusLength: Schema.Int.check(Schema.isGreaterThanOrEqualTo(2048)) });
9
+ const importAlgorithm = (algorithm) => {
10
+ switch (algorithm) {
11
+ case "ECDSA-P256-SHA256": return {
12
+ name: "ECDSA",
13
+ namedCurve: "P-256"
14
+ };
15
+ case "RSA-PSS-SHA256": return {
16
+ name: "RSA-PSS",
17
+ hash: "SHA-256"
18
+ };
19
+ case "RSASSA-PKCS1-v1_5-SHA256": return {
20
+ name: "RSASSA-PKCS1-v1_5",
21
+ hash: "SHA-256"
22
+ };
23
+ case "Ed25519": return { name: "Ed25519" };
24
+ }
25
+ };
26
+ const operationAlgorithm = (algorithm) => {
27
+ switch (algorithm) {
28
+ case "ECDSA-P256-SHA256": return {
29
+ name: "ECDSA",
30
+ hash: "SHA-256"
31
+ };
32
+ case "RSA-PSS-SHA256": return {
33
+ name: "RSA-PSS",
34
+ saltLength: 32
35
+ };
36
+ case "RSASSA-PKCS1-v1_5-SHA256": return { name: "RSASSA-PKCS1-v1_5" };
37
+ case "Ed25519": return { name: "Ed25519" };
38
+ }
39
+ };
40
+ const makeSignature = (subtle) => {
41
+ const importComponents = Effect.fnUntraced(function* (parameters, usage) {
42
+ let jwk;
43
+ switch (parameters.algorithm) {
44
+ case "ECDSA-P256-SHA256":
45
+ jwk = {
46
+ kty: "EC",
47
+ crv: "P-256",
48
+ x: Base64Url.encode(parameters.x),
49
+ y: Base64Url.encode(parameters.y)
50
+ };
51
+ break;
52
+ case "Ed25519":
53
+ jwk = {
54
+ kty: "OKP",
55
+ crv: "Ed25519",
56
+ x: Base64Url.encode(parameters.x)
57
+ };
58
+ break;
59
+ case "RSASSA-PKCS1-v1_5-SHA256":
60
+ case "RSA-PSS-SHA256":
61
+ jwk = {
62
+ kty: "RSA",
63
+ n: Base64Url.encode(parameters.n),
64
+ e: Base64Url.encode(parameters.e)
65
+ };
66
+ if ("p" in parameters) {
67
+ jwk.p = Base64Url.encode(parameters.p);
68
+ jwk.q = Base64Url.encode(parameters.q);
69
+ jwk.dp = Base64Url.encode(parameters.dp);
70
+ jwk.dq = Base64Url.encode(parameters.dq);
71
+ jwk.qi = Base64Url.encode(parameters.qi);
72
+ }
73
+ }
74
+ if ("d" in parameters) jwk.d = Base64Url.encode(parameters.d);
75
+ const key = yield* Effect.tryPromise({
76
+ try: () => subtle.importKey("jwk", jwk, importAlgorithm(parameters.algorithm), true, [usage]),
77
+ catch: importError
78
+ });
79
+ if (parameters.algorithm === "RSA-PSS-SHA256" || parameters.algorithm === "RSASSA-PKCS1-v1_5-SHA256") yield* Schema.decodeUnknownEffect(RsaAlgorithm)(key.algorithm).pipe(Effect.mapError(() => InvalidInput.make({ reason: "key" })));
80
+ return key;
81
+ });
82
+ const importKey = Effect.fnUntraced(function* (algorithm, format, material) {
83
+ yield* decode(derBytes, material, "key");
84
+ const key = yield* Effect.tryPromise({
85
+ try: () => subtle.importKey(format, material, importAlgorithm(algorithm), false, [format === "pkcs8" ? "sign" : "verify"]),
86
+ catch: importError
87
+ });
88
+ if (algorithm === "RSA-PSS-SHA256" || algorithm === "RSASSA-PKCS1-v1_5-SHA256") yield* Schema.decodeUnknownEffect(RsaAlgorithm)(key.algorithm).pipe(Effect.mapError(() => InvalidInput.make({ reason: "key" })));
89
+ return key;
90
+ });
91
+ return Signature.of({
92
+ encodePublicKey: Effect.fnUntraced(function* (input) {
93
+ const parameters = yield* decode(PublicKeyParameters, input, "key");
94
+ const key = yield* importComponents(parameters, "verify");
95
+ const encoded = yield* Effect.tryPromise({
96
+ try: () => subtle.exportKey("spki", key),
97
+ catch: nativeError
98
+ });
99
+ return new Uint8Array(encoded);
100
+ }),
101
+ encodePrivateKey: Effect.fnUntraced(function* (input) {
102
+ const wrapped = yield* decode(Schema.Redacted(PrivateKeyParameters, { disallowJsonEncode: true }), input, "key");
103
+ const parameters = Redacted.value(wrapped);
104
+ const key = yield* importComponents(parameters, "sign");
105
+ const encoded = yield* Effect.tryPromise({
106
+ try: () => subtle.exportKey("pkcs8", key),
107
+ catch: nativeError
108
+ });
109
+ return Redacted.make(new Uint8Array(encoded));
110
+ }),
111
+ sign: Effect.fnUntraced(function* (input) {
112
+ const value = yield* decode(SignInput, input, "data");
113
+ const data = yield* copy(value.data);
114
+ return yield* withSecret(value.privateKey, (material) => Effect.gen(function* () {
115
+ const key = yield* importKey(value.algorithm, "pkcs8", material);
116
+ const result = yield* Effect.tryPromise({
117
+ try: () => subtle.sign(operationAlgorithm(value.algorithm), key, data),
118
+ catch: nativeError
119
+ });
120
+ return new Uint8Array(result);
121
+ }).pipe(Effect.uninterruptible));
122
+ }),
123
+ verify: Effect.fnUntraced(function* (input) {
124
+ const value = yield* decode(VerifyInput, input, "data");
125
+ const material = yield* copy(value.publicKey);
126
+ const data = yield* copy(value.data);
127
+ const signature = yield* copy(value.signature);
128
+ const key = yield* importKey(value.algorithm, "spki", material);
129
+ if ((value.algorithm === "ECDSA-P256-SHA256" || value.algorithm === "Ed25519") && signature.length !== 64) return false;
130
+ return yield* Effect.tryPromise({
131
+ try: () => subtle.verify(operationAlgorithm(value.algorithm), key, signature, data),
132
+ catch: nativeError
133
+ });
134
+ })
135
+ });
136
+ };
137
+ //#endregion
138
+ export { makeSignature };
139
+
140
+ //# sourceMappingURL=signature.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signature.mjs","names":[],"sources":["../../src/internal/signature.ts"],"sourcesContent":["import { Effect, Redacted, Schema } from \"effect\";\nimport { Base64Url } from \"effect/encoding\";\n\nimport { InvalidInput } from \"../Errors\";\nimport {\n type Algorithm,\n PrivateKeyParameters,\n PublicKeyParameters,\n SignInput,\n Signature,\n VerifyInput,\n} from \"../Signature\";\nimport { copy, decode, importError, nativeError, withSecret } from \"./common\";\n\nconst derBytes = Schema.Uint8Array.check(Schema.isMinLength(1), Schema.isMaxLength(16384));\n\nconst RsaAlgorithm = Schema.Struct({\n modulusLength: Schema.Int.check(Schema.isGreaterThanOrEqualTo(2048)),\n});\n\nconst importAlgorithm = (algorithm: Algorithm) => {\n switch (algorithm) {\n case \"ECDSA-P256-SHA256\":\n return { name: \"ECDSA\", namedCurve: \"P-256\" };\n case \"RSA-PSS-SHA256\":\n return { name: \"RSA-PSS\", hash: \"SHA-256\" };\n case \"RSASSA-PKCS1-v1_5-SHA256\":\n return { name: \"RSASSA-PKCS1-v1_5\", hash: \"SHA-256\" };\n case \"Ed25519\":\n return { name: \"Ed25519\" };\n }\n};\n\nconst operationAlgorithm = (algorithm: Algorithm) => {\n switch (algorithm) {\n case \"ECDSA-P256-SHA256\":\n return { name: \"ECDSA\", hash: \"SHA-256\" };\n case \"RSA-PSS-SHA256\":\n return { name: \"RSA-PSS\", saltLength: 32 };\n case \"RSASSA-PKCS1-v1_5-SHA256\":\n return { name: \"RSASSA-PKCS1-v1_5\" };\n case \"Ed25519\":\n return { name: \"Ed25519\" };\n }\n};\n\nexport const makeSignature = (subtle: SubtleCrypto): Signature[\"Service\"] => {\n // JOSE owns JWK metadata and policy. The adapter translates validated raw\n // components through its platform key parser.\n const importComponents = Effect.fnUntraced(function* (\n parameters: PublicKeyParameters | PrivateKeyParameters,\n usage: \"sign\" | \"verify\",\n ) {\n let jwk: JsonWebKey;\n\n switch (parameters.algorithm) {\n case \"ECDSA-P256-SHA256\":\n jwk = {\n kty: \"EC\",\n crv: \"P-256\",\n x: Base64Url.encode(parameters.x),\n y: Base64Url.encode(parameters.y),\n };\n break;\n case \"Ed25519\":\n jwk = { kty: \"OKP\", crv: \"Ed25519\", x: Base64Url.encode(parameters.x) };\n break;\n case \"RSASSA-PKCS1-v1_5-SHA256\":\n case \"RSA-PSS-SHA256\":\n jwk = { kty: \"RSA\", n: Base64Url.encode(parameters.n), e: Base64Url.encode(parameters.e) };\n if (\"p\" in parameters) {\n jwk.p = Base64Url.encode(parameters.p);\n jwk.q = Base64Url.encode(parameters.q);\n jwk.dp = Base64Url.encode(parameters.dp);\n jwk.dq = Base64Url.encode(parameters.dq);\n jwk.qi = Base64Url.encode(parameters.qi);\n }\n }\n if (\"d\" in parameters) jwk.d = Base64Url.encode(parameters.d);\n\n const key = yield* Effect.tryPromise({\n try: () => subtle.importKey(\"jwk\", jwk, importAlgorithm(parameters.algorithm), true, [usage]),\n catch: importError,\n });\n\n if (\n parameters.algorithm === \"RSA-PSS-SHA256\" ||\n parameters.algorithm === \"RSASSA-PKCS1-v1_5-SHA256\"\n ) {\n yield* Schema.decodeUnknownEffect(RsaAlgorithm)(key.algorithm).pipe(\n Effect.mapError(() => InvalidInput.make({ reason: \"key\" })),\n );\n }\n\n return key;\n });\n\n const importKey = Effect.fnUntraced(function* (\n algorithm: Algorithm,\n format: \"pkcs8\" | \"spki\",\n material: Uint8Array<ArrayBuffer>,\n ) {\n yield* decode(derBytes, material, \"key\");\n\n const key = yield* Effect.tryPromise({\n try: () =>\n subtle.importKey(format, material, importAlgorithm(algorithm), false, [\n format === \"pkcs8\" ? \"sign\" : \"verify\",\n ]),\n catch: importError,\n });\n\n if (algorithm === \"RSA-PSS-SHA256\" || algorithm === \"RSASSA-PKCS1-v1_5-SHA256\") {\n // The platform parsed this DER key. Validate its actual modulus, not caller metadata.\n yield* Schema.decodeUnknownEffect(RsaAlgorithm)(key.algorithm).pipe(\n Effect.mapError(() => InvalidInput.make({ reason: \"key\" })),\n );\n }\n\n return key;\n });\n\n return Signature.of({\n encodePublicKey: Effect.fnUntraced(function* (input) {\n const parameters = yield* decode(PublicKeyParameters, input, \"key\");\n const key = yield* importComponents(parameters, \"verify\");\n\n const encoded = yield* Effect.tryPromise({\n try: () => subtle.exportKey(\"spki\", key),\n catch: nativeError,\n });\n\n return new Uint8Array(encoded);\n }),\n encodePrivateKey: Effect.fnUntraced(function* (input) {\n const wrapped = yield* decode(\n Schema.Redacted(PrivateKeyParameters, { disallowJsonEncode: true }),\n input,\n \"key\",\n );\n\n const parameters = Redacted.value(wrapped);\n const key = yield* importComponents(parameters, \"sign\");\n\n const encoded = yield* Effect.tryPromise({\n try: () => subtle.exportKey(\"pkcs8\", key),\n catch: nativeError,\n });\n\n return Redacted.make(new Uint8Array(encoded));\n }),\n sign: Effect.fnUntraced(function* (input) {\n const value = yield* decode(SignInput, input, \"data\");\n const data = yield* copy(value.data);\n\n return yield* withSecret(value.privateKey, (material) =>\n Effect.gen(function* () {\n const key = yield* importKey(value.algorithm, \"pkcs8\", material);\n\n const result = yield* Effect.tryPromise({\n try: () => subtle.sign(operationAlgorithm(value.algorithm), key, data),\n catch: nativeError,\n });\n\n return new Uint8Array(result);\n }).pipe(Effect.uninterruptible),\n );\n }),\n verify: Effect.fnUntraced(function* (input) {\n const value = yield* decode(VerifyInput, input, \"data\");\n const material = yield* copy(value.publicKey);\n const data = yield* copy(value.data);\n const signature = yield* copy(value.signature);\n const key = yield* importKey(value.algorithm, \"spki\", material);\n\n if (\n (value.algorithm === \"ECDSA-P256-SHA256\" || value.algorithm === \"Ed25519\") &&\n signature.length !== 64\n )\n return false;\n\n return yield* Effect.tryPromise({\n try: () => subtle.verify(operationAlgorithm(value.algorithm), key, signature, data),\n catch: nativeError,\n });\n }),\n });\n};\n"],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ //#region src/internal/word64.ts
2
+ /**
3
+ * Adapted from noble-hashes, Copyright (c) 2022 Paul Miller.
4
+ * MIT; source revision 8060cc83bbab6681d23c9eed071db3f3a6b442da.
5
+ * See ../../THIRD_PARTY_NOTICES.md for source mapping and license.
6
+ */
7
+ const rotrSH = (h, l, s) => h >>> s | l << 32 - s;
8
+ const rotrSL = (h, l, s) => h << 32 - s | l >>> s;
9
+ const rotrBH = (h, l, s) => h << 64 - s | l >>> s - 32;
10
+ const rotrBL = (h, l, s) => h >>> s - 32 | l << 64 - s;
11
+ const rotr32H = (_h, l) => l;
12
+ const rotr32L = (h, _l) => h;
13
+ function add(Ah, Al, Bh, Bl) {
14
+ const l = (Al >>> 0) + (Bl >>> 0);
15
+ return {
16
+ h: Ah + Bh + (l / 2 ** 32 | 0) | 0,
17
+ l: l | 0
18
+ };
19
+ }
20
+ const add3L = (Al, Bl, Cl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0);
21
+ const add3H = (low, Ah, Bh, Ch) => Ah + Bh + Ch + (low / 2 ** 32 | 0) | 0;
22
+ //#endregion
23
+ export { add, add3H, add3L, rotr32H, rotr32L, rotrBH, rotrBL, rotrSH, rotrSL };
24
+
25
+ //# sourceMappingURL=word64.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"word64.mjs","names":[],"sources":["../../src/internal/word64.ts"],"sourcesContent":["/**\n * Adapted from noble-hashes, Copyright (c) 2022 Paul Miller.\n * MIT; source revision 8060cc83bbab6681d23c9eed071db3f3a6b442da.\n * See ../../THIRD_PARTY_NOTICES.md for source mapping and license.\n */\n// High 32-bit half of a 64-bit right rotate, valid for `s` in `1..31`.\nexport const rotrSH = (h: number, l: number, s: number): number => (h >>> s) | (l << (32 - s));\n// Low 32-bit half of a 64-bit right rotate, valid for `s` in `1..31`.\nexport const rotrSL = (h: number, l: number, s: number): number => (h << (32 - s)) | (l >>> s);\n\n// High 32-bit half of a 64-bit right rotate, valid for `s` in `33..63`; `32` uses `rotr32*`.\nexport const rotrBH = (h: number, l: number, s: number): number =>\n (h << (64 - s)) | (l >>> (s - 32));\n\n// Low 32-bit half of a 64-bit right rotate, valid for `s` in `33..63`; `32` uses `rotr32*`.\nexport const rotrBL = (h: number, l: number, s: number): number =>\n (h >>> (s - 32)) | (l << (64 - s));\n\n// High 32-bit half of a 64-bit right rotate for `s === 32`; this is just the swapped low half.\nexport const rotr32H = (_h: number, l: number): number => l;\n// Low 32-bit half of a 64-bit right rotate for `s === 32`; this is just the swapped high half.\nexport const rotr32L = (h: number, _l: number): number => h;\n\n// Add two split 64-bit words and return the split `{ h, l }` sum.\n// JS uses 32-bit signed integers for bitwise operations, so we cannot simply shift the carry out\n// of the low sum and instead use division.\nexport function add(\n Ah: number,\n Al: number,\n Bh: number,\n Bl: number,\n): {\n h: number;\n l: number;\n} {\n const l = (Al >>> 0) + (Bl >>> 0);\n\n return { h: (Ah + Bh + ((l / 2 ** 32) | 0)) | 0, l: l | 0 };\n}\n\n// Addition with more than 2 elements\n// Unmasked low-word accumulator for 3-way addition; pass the raw result into `add3H(...)`.\nexport const add3L = (Al: number, Bl: number, Cl: number): number =>\n (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0);\n\n// High-word finalize step for 3-way addition; `low` must be the untruncated output of `add3L(...)`.\nexport const add3H = (low: number, Ah: number, Bh: number, Ch: number): number =>\n (Ah + Bh + Ch + ((low / 2 ** 32) | 0)) | 0;\n"],"mappings":";;;;;;AAMA,MAAa,UAAU,GAAW,GAAW,MAAuB,MAAM,IAAM,KAAM,KAAK;AAE3F,MAAa,UAAU,GAAW,GAAW,MAAuB,KAAM,KAAK,IAAO,MAAM;AAG5F,MAAa,UAAU,GAAW,GAAW,MAC1C,KAAM,KAAK,IAAO,MAAO,IAAI;AAGhC,MAAa,UAAU,GAAW,GAAW,MAC1C,MAAO,IAAI,KAAQ,KAAM,KAAK;AAGjC,MAAa,WAAW,IAAY,MAAsB;AAE1D,MAAa,WAAW,GAAW,OAAuB;AAK1D,SAAgB,IACd,IACA,IACA,IACA,IAIA;CACA,MAAM,KAAK,OAAO,MAAM,OAAO;CAE/B,OAAO;EAAE,GAAI,KAAK,MAAO,IAAI,KAAK,KAAM,KAAM;EAAG,GAAG,IAAI;CAAE;AAC5D;AAIA,MAAa,SAAS,IAAY,IAAY,QAC3C,OAAO,MAAM,OAAO,MAAM,OAAO;AAGpC,MAAa,SAAS,KAAa,IAAY,IAAY,OACxD,KAAK,KAAK,MAAO,MAAM,KAAK,KAAM,KAAM"}