@mysten/seal 0.0.0-experimental-20250330082435

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 (109) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/README.md +4 -0
  3. package/dist/cjs/bcs.d.ts +132 -0
  4. package/dist/cjs/bcs.js +67 -0
  5. package/dist/cjs/bcs.js.map +7 -0
  6. package/dist/cjs/bls12381.d.ts +37 -0
  7. package/dist/cjs/bls12381.js +110 -0
  8. package/dist/cjs/bls12381.js.map +7 -0
  9. package/dist/cjs/client.d.ts +83 -0
  10. package/dist/cjs/client.js +283 -0
  11. package/dist/cjs/client.js.map +7 -0
  12. package/dist/cjs/decrypt.d.ts +15 -0
  13. package/dist/cjs/decrypt.js +94 -0
  14. package/dist/cjs/decrypt.js.map +7 -0
  15. package/dist/cjs/dem.d.ts +36 -0
  16. package/dist/cjs/dem.js +173 -0
  17. package/dist/cjs/dem.js.map +7 -0
  18. package/dist/cjs/elgamal.d.ts +11 -0
  19. package/dist/cjs/elgamal.js +46 -0
  20. package/dist/cjs/elgamal.js.map +7 -0
  21. package/dist/cjs/encrypt.d.ts +33 -0
  22. package/dist/cjs/encrypt.js +118 -0
  23. package/dist/cjs/encrypt.js.map +7 -0
  24. package/dist/cjs/error.d.ts +58 -0
  25. package/dist/cjs/error.js +175 -0
  26. package/dist/cjs/error.js.map +7 -0
  27. package/dist/cjs/ibe.d.ts +63 -0
  28. package/dist/cjs/ibe.js +104 -0
  29. package/dist/cjs/ibe.js.map +7 -0
  30. package/dist/cjs/index.d.ts +4 -0
  31. package/dist/cjs/index.js +31 -0
  32. package/dist/cjs/index.js.map +7 -0
  33. package/dist/cjs/kdf.d.ts +14 -0
  34. package/dist/cjs/kdf.js +64 -0
  35. package/dist/cjs/kdf.js.map +7 -0
  36. package/dist/cjs/key-server.d.ts +38 -0
  37. package/dist/cjs/key-server.js +101 -0
  38. package/dist/cjs/key-server.js.map +7 -0
  39. package/dist/cjs/keys.d.ts +17 -0
  40. package/dist/cjs/keys.js +61 -0
  41. package/dist/cjs/keys.js.map +7 -0
  42. package/dist/cjs/package.json +5 -0
  43. package/dist/cjs/session-key.d.ts +42 -0
  44. package/dist/cjs/session-key.js +140 -0
  45. package/dist/cjs/session-key.js.map +7 -0
  46. package/dist/cjs/types.d.ts +1 -0
  47. package/dist/cjs/types.js +17 -0
  48. package/dist/cjs/types.js.map +7 -0
  49. package/dist/cjs/utils.d.ts +10 -0
  50. package/dist/cjs/utils.js +51 -0
  51. package/dist/cjs/utils.js.map +7 -0
  52. package/dist/cjs/version.d.ts +1 -0
  53. package/dist/cjs/version.js +25 -0
  54. package/dist/cjs/version.js.map +7 -0
  55. package/dist/esm/bcs.d.ts +132 -0
  56. package/dist/esm/bcs.js +47 -0
  57. package/dist/esm/bcs.js.map +7 -0
  58. package/dist/esm/bls12381.d.ts +37 -0
  59. package/dist/esm/bls12381.js +90 -0
  60. package/dist/esm/bls12381.js.map +7 -0
  61. package/dist/esm/client.d.ts +83 -0
  62. package/dist/esm/client.js +268 -0
  63. package/dist/esm/client.js.map +7 -0
  64. package/dist/esm/decrypt.d.ts +15 -0
  65. package/dist/esm/decrypt.js +74 -0
  66. package/dist/esm/decrypt.js.map +7 -0
  67. package/dist/esm/dem.d.ts +36 -0
  68. package/dist/esm/dem.js +153 -0
  69. package/dist/esm/dem.js.map +7 -0
  70. package/dist/esm/elgamal.d.ts +11 -0
  71. package/dist/esm/elgamal.js +26 -0
  72. package/dist/esm/elgamal.js.map +7 -0
  73. package/dist/esm/encrypt.d.ts +33 -0
  74. package/dist/esm/encrypt.js +98 -0
  75. package/dist/esm/encrypt.js.map +7 -0
  76. package/dist/esm/error.d.ts +58 -0
  77. package/dist/esm/error.js +155 -0
  78. package/dist/esm/error.js.map +7 -0
  79. package/dist/esm/ibe.d.ts +63 -0
  80. package/dist/esm/ibe.js +84 -0
  81. package/dist/esm/ibe.js.map +7 -0
  82. package/dist/esm/index.d.ts +4 -0
  83. package/dist/esm/index.js +10 -0
  84. package/dist/esm/index.js.map +7 -0
  85. package/dist/esm/kdf.d.ts +14 -0
  86. package/dist/esm/kdf.js +44 -0
  87. package/dist/esm/kdf.js.map +7 -0
  88. package/dist/esm/key-server.d.ts +38 -0
  89. package/dist/esm/key-server.js +86 -0
  90. package/dist/esm/key-server.js.map +7 -0
  91. package/dist/esm/keys.d.ts +17 -0
  92. package/dist/esm/keys.js +41 -0
  93. package/dist/esm/keys.js.map +7 -0
  94. package/dist/esm/package.json +5 -0
  95. package/dist/esm/session-key.d.ts +42 -0
  96. package/dist/esm/session-key.js +124 -0
  97. package/dist/esm/session-key.js.map +7 -0
  98. package/dist/esm/types.d.ts +1 -0
  99. package/dist/esm/types.js +1 -0
  100. package/dist/esm/types.js.map +7 -0
  101. package/dist/esm/utils.d.ts +10 -0
  102. package/dist/esm/utils.js +31 -0
  103. package/dist/esm/utils.js.map +7 -0
  104. package/dist/esm/version.d.ts +1 -0
  105. package/dist/esm/version.js +5 -0
  106. package/dist/esm/version.js.map +7 -0
  107. package/dist/tsconfig.esm.tsbuildinfo +1 -0
  108. package/dist/tsconfig.tsbuildinfo +1 -0
  109. package/package.json +59 -0
@@ -0,0 +1,153 @@
1
+ import { bcs } from "@mysten/bcs";
2
+ import { equalBytes } from "@noble/curves/abstract/utils";
3
+ import { hmac } from "@noble/hashes/hmac";
4
+ import { sha3_256 } from "@noble/hashes/sha3";
5
+ import { InvalidCiphertextError } from "./error.js";
6
+ import { xorUnchecked } from "./utils.js";
7
+ const iv = Uint8Array.from([
8
+ 138,
9
+ 55,
10
+ 153,
11
+ 253,
12
+ 198,
13
+ 46,
14
+ 121,
15
+ 219,
16
+ 160,
17
+ 128,
18
+ 89,
19
+ 7,
20
+ 214,
21
+ 156,
22
+ 148,
23
+ 220
24
+ ]);
25
+ async function generateAesKey() {
26
+ const key = await crypto.subtle.generateKey(
27
+ {
28
+ name: "AES-GCM",
29
+ length: 256
30
+ },
31
+ true,
32
+ ["encrypt", "decrypt"]
33
+ );
34
+ return await crypto.subtle.exportKey("raw", key).then((keyData) => new Uint8Array(keyData));
35
+ }
36
+ class AesGcm256 {
37
+ constructor(msg, aad) {
38
+ this.plaintext = msg;
39
+ this.aad = aad;
40
+ }
41
+ generateKey() {
42
+ return generateAesKey();
43
+ }
44
+ async encrypt(key) {
45
+ const aesCryptoKey = await crypto.subtle.importKey("raw", key, "AES-GCM", false, ["encrypt"]);
46
+ const blob = new Uint8Array(
47
+ await crypto.subtle.encrypt(
48
+ {
49
+ name: "AES-GCM",
50
+ iv,
51
+ additionalData: this.aad
52
+ },
53
+ aesCryptoKey,
54
+ this.plaintext
55
+ )
56
+ );
57
+ return {
58
+ Aes256Gcm: {
59
+ blob,
60
+ aad: this.aad ?? []
61
+ }
62
+ };
63
+ }
64
+ static async decrypt(key, ciphertext) {
65
+ if (!("Aes256Gcm" in ciphertext)) {
66
+ throw new InvalidCiphertextError(`Invalid ciphertext ${ciphertext}`);
67
+ }
68
+ const aesCryptoKey = await crypto.subtle.importKey("raw", key, "AES-GCM", false, ["decrypt"]);
69
+ return new Uint8Array(
70
+ await crypto.subtle.decrypt(
71
+ {
72
+ name: "AES-GCM",
73
+ iv,
74
+ additionalData: new Uint8Array(ciphertext.Aes256Gcm.aad ?? [])
75
+ },
76
+ aesCryptoKey,
77
+ new Uint8Array(ciphertext.Aes256Gcm.blob)
78
+ )
79
+ );
80
+ }
81
+ }
82
+ class Plain {
83
+ async encrypt(_key) {
84
+ return {
85
+ Plain: {}
86
+ };
87
+ }
88
+ generateKey() {
89
+ return generateAesKey();
90
+ }
91
+ }
92
+ class Hmac256Ctr {
93
+ constructor(msg, aad) {
94
+ this.plaintext = msg;
95
+ this.aad = aad;
96
+ }
97
+ generateKey() {
98
+ return generateAesKey();
99
+ }
100
+ async encrypt(key) {
101
+ const blob = Hmac256Ctr.encryptInCtrMode(key, this.plaintext);
102
+ const mac = Hmac256Ctr.computeMac(key, this.aad, blob);
103
+ return {
104
+ Hmac256Ctr: {
105
+ blob,
106
+ mac,
107
+ aad: this.aad ?? []
108
+ }
109
+ };
110
+ }
111
+ static async decrypt(key, ciphertext) {
112
+ if (!("Hmac256Ctr" in ciphertext)) {
113
+ throw new InvalidCiphertextError(`Invalid ciphertext ${ciphertext}`);
114
+ }
115
+ const aad = new Uint8Array(ciphertext.Hmac256Ctr.aad ?? []);
116
+ const blob = new Uint8Array(ciphertext.Hmac256Ctr.blob);
117
+ const mac = Hmac256Ctr.computeMac(key, aad, blob);
118
+ if (!equalBytes(mac, new Uint8Array(ciphertext.Hmac256Ctr.mac))) {
119
+ throw new InvalidCiphertextError(`Invalid MAC ${mac}`);
120
+ }
121
+ return Hmac256Ctr.encryptInCtrMode(key, blob);
122
+ }
123
+ static computeMac(key, aad, ciphertext) {
124
+ const macKey = hmac(sha3_256, key, MacKeyTag);
125
+ const macInput = new Uint8Array([...toBytes(aad.length), ...aad, ...ciphertext]);
126
+ const mac = hmac(sha3_256, macKey, macInput);
127
+ return mac;
128
+ }
129
+ static encryptInCtrMode(key, msg) {
130
+ const blockSize = 32;
131
+ let result = Uint8Array.from({ length: msg.length }, () => 0);
132
+ const encryptionKey = hmac(sha3_256, key, EncryptionKeyTag);
133
+ for (let i = 0; i * blockSize < msg.length; i++) {
134
+ const block = msg.slice(i * blockSize, (i + 1) * blockSize);
135
+ let mask = hmac(sha3_256, encryptionKey, toBytes(i));
136
+ const encryptedBlock = xorUnchecked(block, mask);
137
+ result.set(encryptedBlock, i * blockSize);
138
+ }
139
+ return result;
140
+ }
141
+ }
142
+ function toBytes(n) {
143
+ return bcs.u64().serialize(n).toBytes();
144
+ }
145
+ const EncryptionKeyTag = new Uint8Array([1]);
146
+ const MacKeyTag = new Uint8Array([2]);
147
+ export {
148
+ AesGcm256,
149
+ Hmac256Ctr,
150
+ Plain,
151
+ iv
152
+ };
153
+ //# sourceMappingURL=dem.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/dem.ts"],
4
+ "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { bcs } from '@mysten/bcs';\nimport { equalBytes } from '@noble/curves/abstract/utils';\nimport { hmac } from '@noble/hashes/hmac';\nimport { sha3_256 } from '@noble/hashes/sha3';\n\nimport type { Ciphertext } from './bcs.js';\nimport { InvalidCiphertextError } from './error.js';\nimport { xorUnchecked } from './utils.js';\n\n// Use a fixed IV for AES.\nexport const iv = Uint8Array.from([\n\t138, 55, 153, 253, 198, 46, 121, 219, 160, 128, 89, 7, 214, 156, 148, 220,\n]);\n\nasync function generateAesKey(): Promise<Uint8Array> {\n\tconst key = await crypto.subtle.generateKey(\n\t\t{\n\t\t\tname: 'AES-GCM',\n\t\t\tlength: 256,\n\t\t},\n\t\ttrue,\n\t\t['encrypt', 'decrypt'],\n\t);\n\treturn await crypto.subtle.exportKey('raw', key).then((keyData) => new Uint8Array(keyData));\n}\n\nexport interface EncryptionInput {\n\tencrypt(key: Uint8Array): Promise<typeof Ciphertext.$inferInput>;\n\tgenerateKey(): Promise<Uint8Array>;\n}\n\nexport class AesGcm256 implements EncryptionInput {\n\treadonly plaintext: Uint8Array;\n\treadonly aad: Uint8Array;\n\n\tconstructor(msg: Uint8Array, aad: Uint8Array) {\n\t\tthis.plaintext = msg;\n\t\tthis.aad = aad;\n\t}\n\n\tgenerateKey(): Promise<Uint8Array> {\n\t\treturn generateAesKey();\n\t}\n\n\tasync encrypt(key: Uint8Array): Promise<typeof Ciphertext.$inferInput> {\n\t\tconst aesCryptoKey = await crypto.subtle.importKey('raw', key, 'AES-GCM', false, ['encrypt']);\n\n\t\tconst blob = new Uint8Array(\n\t\t\tawait crypto.subtle.encrypt(\n\t\t\t\t{\n\t\t\t\t\tname: 'AES-GCM',\n\t\t\t\t\tiv,\n\t\t\t\t\tadditionalData: this.aad,\n\t\t\t\t},\n\t\t\t\taesCryptoKey,\n\t\t\t\tthis.plaintext,\n\t\t\t),\n\t\t);\n\n\t\treturn {\n\t\t\tAes256Gcm: {\n\t\t\t\tblob,\n\t\t\t\taad: this.aad ?? [],\n\t\t\t},\n\t\t};\n\t}\n\n\tstatic async decrypt(\n\t\tkey: Uint8Array,\n\t\tciphertext: typeof Ciphertext.$inferInput,\n\t): Promise<Uint8Array> {\n\t\tif (!('Aes256Gcm' in ciphertext)) {\n\t\t\tthrow new InvalidCiphertextError(`Invalid ciphertext ${ciphertext}`);\n\t\t}\n\n\t\tconst aesCryptoKey = await crypto.subtle.importKey('raw', key, 'AES-GCM', false, ['decrypt']);\n\n\t\treturn new Uint8Array(\n\t\t\tawait crypto.subtle.decrypt(\n\t\t\t\t{\n\t\t\t\t\tname: 'AES-GCM',\n\t\t\t\t\tiv,\n\t\t\t\t\tadditionalData: new Uint8Array(ciphertext.Aes256Gcm.aad ?? []),\n\t\t\t\t},\n\t\t\t\taesCryptoKey,\n\t\t\t\tnew Uint8Array(ciphertext.Aes256Gcm.blob),\n\t\t\t),\n\t\t);\n\t}\n}\n\nexport class Plain implements EncryptionInput {\n\tasync encrypt(_key: Uint8Array): Promise<typeof Ciphertext.$inferInput> {\n\t\treturn {\n\t\t\tPlain: {},\n\t\t};\n\t}\n\n\tgenerateKey(): Promise<Uint8Array> {\n\t\treturn generateAesKey();\n\t}\n}\n\n/**\n * Authenticated encryption using CTR mode with HMAC-SHA3-256 as a PRF.\n * 1. Derive an encryption key, <i>k<sub>1</sub> = <b>hmac</b>(key, 1)</i>.\n * 2. Chunk the message into blocks of 32 bytes, <i>m = m<sub>1</sub> || ... || m<sub>n</sub></i>.\n * 3. Let the ciphertext be defined by <i>c = c<sub>1</sub> || ... || c<sub>n</sub></i> where <i>c<sub>i</sub> = m<sub>i</sub> \u2295 <b>hmac</b>(k<sub>1</sub>, i)</i>.\n * 4. Compute a MAC over the AAD and the ciphertext, <i>mac = <b>hmac</b>(k<sub>2</sub>, aad || c) where k<sub>2</sub> = <b>hmac</b>(key, 2)</i>.\n * 5. Return <i>mac || c</i>.\n */\nexport class Hmac256Ctr implements EncryptionInput {\n\treadonly plaintext: Uint8Array;\n\treadonly aad: Uint8Array;\n\n\tconstructor(msg: Uint8Array, aad: Uint8Array) {\n\t\tthis.plaintext = msg;\n\t\tthis.aad = aad;\n\t}\n\n\tgenerateKey(): Promise<Uint8Array> {\n\t\treturn generateAesKey();\n\t}\n\n\tasync encrypt(key: Uint8Array): Promise<typeof Ciphertext.$inferInput> {\n\t\tconst blob = Hmac256Ctr.encryptInCtrMode(key, this.plaintext);\n\t\tconst mac = Hmac256Ctr.computeMac(key, this.aad, blob);\n\t\treturn {\n\t\t\tHmac256Ctr: {\n\t\t\t\tblob,\n\t\t\t\tmac,\n\t\t\t\taad: this.aad ?? [],\n\t\t\t},\n\t\t};\n\t}\n\n\tstatic async decrypt(\n\t\tkey: Uint8Array,\n\t\tciphertext: typeof Ciphertext.$inferInput,\n\t): Promise<Uint8Array> {\n\t\tif (!('Hmac256Ctr' in ciphertext)) {\n\t\t\tthrow new InvalidCiphertextError(`Invalid ciphertext ${ciphertext}`);\n\t\t}\n\t\tconst aad = new Uint8Array(ciphertext.Hmac256Ctr.aad ?? []);\n\t\tconst blob = new Uint8Array(ciphertext.Hmac256Ctr.blob);\n\t\tconst mac = Hmac256Ctr.computeMac(key, aad, blob);\n\t\tif (!equalBytes(mac, new Uint8Array(ciphertext.Hmac256Ctr.mac))) {\n\t\t\tthrow new InvalidCiphertextError(`Invalid MAC ${mac}`);\n\t\t}\n\t\treturn Hmac256Ctr.encryptInCtrMode(key, blob);\n\t}\n\n\tprivate static computeMac(key: Uint8Array, aad: Uint8Array, ciphertext: Uint8Array): Uint8Array {\n\t\tconst macKey = hmac(sha3_256, key, MacKeyTag);\n\t\tconst macInput = new Uint8Array([...toBytes(aad.length), ...aad, ...ciphertext]);\n\t\tconst mac = hmac(sha3_256, macKey, macInput);\n\t\treturn mac;\n\t}\n\n\tprivate static encryptInCtrMode(key: Uint8Array, msg: Uint8Array): Uint8Array {\n\t\tconst blockSize = 32;\n\t\tlet result = Uint8Array.from({ length: msg.length }, () => 0);\n\t\tconst encryptionKey = hmac(sha3_256, key, EncryptionKeyTag);\n\t\tfor (let i = 0; i * blockSize < msg.length; i++) {\n\t\t\tconst block = msg.slice(i * blockSize, (i + 1) * blockSize);\n\t\t\tlet mask = hmac(sha3_256, encryptionKey, toBytes(i));\n\t\t\tconst encryptedBlock = xorUnchecked(block, mask);\n\t\t\tresult.set(encryptedBlock, i * blockSize);\n\t\t}\n\t\treturn result;\n\t}\n}\n\n/**\n * Convert a u64 to bytes using little-endian representation.\n */\nfunction toBytes(n: number): Uint8Array {\n\treturn bcs.u64().serialize(n).toBytes();\n}\n\nconst EncryptionKeyTag = new Uint8Array([1]);\nconst MacKeyTag = new Uint8Array([2]);\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Decrypt a ciphertext with a given secret key. The secret key must be a 32-byte scalar.
3
+ * The ciphertext is a pair of G1Elements (48 bytes).
4
+ */
5
+ export declare function elgamalDecrypt(sk: Uint8Array, ciphertext: [Uint8Array, Uint8Array]): Uint8Array;
6
+ /** Generate a random secret key. */
7
+ export declare function generateSecretKey(): Uint8Array;
8
+ /** Derive the BLS public key for a given secret key. */
9
+ export declare function toPublicKey(sk: Uint8Array): Uint8Array;
10
+ /** Derive the BLS verification key for a given secret key. */
11
+ export declare function toVerificationKey(sk: Uint8Array): Uint8Array;
@@ -0,0 +1,26 @@
1
+ import { G1Element, G2Element, Scalar } from "./bls12381.js";
2
+ function elgamalDecrypt(sk, ciphertext) {
3
+ return decrypt(Scalar.fromBytes(sk), [
4
+ G1Element.fromBytes(ciphertext[0]),
5
+ G1Element.fromBytes(ciphertext[1])
6
+ ]).toBytes();
7
+ }
8
+ function decrypt(sk, encryption) {
9
+ return encryption[1].subtract(encryption[0].multiply(sk));
10
+ }
11
+ function generateSecretKey() {
12
+ return Scalar.random().toBytes();
13
+ }
14
+ function toPublicKey(sk) {
15
+ return G1Element.generator().multiply(Scalar.fromBytes(sk)).toBytes();
16
+ }
17
+ function toVerificationKey(sk) {
18
+ return G2Element.generator().multiply(Scalar.fromBytes(sk)).toBytes();
19
+ }
20
+ export {
21
+ elgamalDecrypt,
22
+ generateSecretKey,
23
+ toPublicKey,
24
+ toVerificationKey
25
+ };
26
+ //# sourceMappingURL=elgamal.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/elgamal.ts"],
4
+ "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { G1Element, G2Element, Scalar } from './bls12381.js';\n\n/**\n * Decrypt a ciphertext with a given secret key. The secret key must be a 32-byte scalar.\n * The ciphertext is a pair of G1Elements (48 bytes).\n */\nexport function elgamalDecrypt(sk: Uint8Array, ciphertext: [Uint8Array, Uint8Array]): Uint8Array {\n\treturn decrypt(Scalar.fromBytes(sk), [\n\t\tG1Element.fromBytes(ciphertext[0]),\n\t\tG1Element.fromBytes(ciphertext[1]),\n\t]).toBytes();\n}\n\n/**\n * Decrypt a ciphertext with a given secret key. The secret key must be a 32-byte scalar.\n * The ciphertext is a pair of G1Elements (48 bytes).\n */\nfunction decrypt(sk: Scalar, encryption: [G1Element, G1Element]): G1Element {\n\treturn encryption[1].subtract(encryption[0].multiply(sk));\n}\n\n/** Generate a random secret key. */\nexport function generateSecretKey(): Uint8Array {\n\treturn Scalar.random().toBytes();\n}\n\n/** Derive the BLS public key for a given secret key. */\nexport function toPublicKey(sk: Uint8Array): Uint8Array {\n\treturn G1Element.generator().multiply(Scalar.fromBytes(sk)).toBytes();\n}\n\n/** Derive the BLS verification key for a given secret key. */\nexport function toVerificationKey(sk: Uint8Array): Uint8Array {\n\treturn G2Element.generator().multiply(Scalar.fromBytes(sk)).toBytes();\n}\n"],
5
+ "mappings": "AAGA,SAAS,WAAW,WAAW,cAAc;AAMtC,SAAS,eAAe,IAAgB,YAAkD;AAChG,SAAO,QAAQ,OAAO,UAAU,EAAE,GAAG;AAAA,IACpC,UAAU,UAAU,WAAW,CAAC,CAAC;AAAA,IACjC,UAAU,UAAU,WAAW,CAAC,CAAC;AAAA,EAClC,CAAC,EAAE,QAAQ;AACZ;AAMA,SAAS,QAAQ,IAAY,YAA+C;AAC3E,SAAO,WAAW,CAAC,EAAE,SAAS,WAAW,CAAC,EAAE,SAAS,EAAE,CAAC;AACzD;AAGO,SAAS,oBAAgC;AAC/C,SAAO,OAAO,OAAO,EAAE,QAAQ;AAChC;AAGO,SAAS,YAAY,IAA4B;AACvD,SAAO,UAAU,UAAU,EAAE,SAAS,OAAO,UAAU,EAAE,CAAC,EAAE,QAAQ;AACrE;AAGO,SAAS,kBAAkB,IAA4B;AAC7D,SAAO,UAAU,UAAU,EAAE,SAAS,OAAO,UAAU,EAAE,CAAC,EAAE,QAAQ;AACrE;",
6
+ "names": []
7
+ }
@@ -0,0 +1,33 @@
1
+ import type { EncryptionInput } from './dem.js';
2
+ import type { KeyServer } from './key-server.js';
3
+ export declare const MAX_U8 = 255;
4
+ /**
5
+ * Given full ID and what key servers to use, return the encrypted message under the identity and return the bcs bytes of the encrypted object.
6
+ *
7
+ * @param keyServers - A list of KeyServers (same server can be used multiple times)
8
+ * @param kemType - The type of KEM to use.
9
+ * @param packageId - packageId
10
+ * @param id - id
11
+ * @param encryptionInput - Input to the encryption. Should be one of the EncryptionInput types, AesGcmEncryptionInput or Plain.
12
+ * @param threshold - The threshold for the TSS encryption.
13
+ * @returns The bcs bytes of the encrypted object containing all metadata and the 256-bit symmetric key that was used to encrypt the object.
14
+ * Since the key can be used to decrypt, it should not be shared but can be used eg. for backup.
15
+ */
16
+ export declare function encrypt({ keyServers, kemType, threshold, packageId, id, encryptionInput, }: {
17
+ keyServers: KeyServer[];
18
+ kemType: KemType;
19
+ threshold: number;
20
+ packageId: string;
21
+ id: string;
22
+ encryptionInput: EncryptionInput;
23
+ }): Promise<{
24
+ encryptedObject: Uint8Array;
25
+ key: Uint8Array;
26
+ }>;
27
+ export declare enum KemType {
28
+ BonehFranklinBLS12381DemCCA = 0
29
+ }
30
+ export declare enum DemType {
31
+ AesGcm256 = 0,
32
+ Hmac256Ctr = 1
33
+ }
@@ -0,0 +1,98 @@
1
+ import { fromHex } from "@mysten/bcs";
2
+ import { isValidSuiObjectId } from "@mysten/sui/utils";
3
+ import { split as externalSplit } from "shamir-secret-sharing";
4
+ import { EncryptedObject } from "./bcs.js";
5
+ import { UserError } from "./error.js";
6
+ import { BonehFranklinBLS12381Services, DST } from "./ibe.js";
7
+ import { deriveKey, KeyPurpose } from "./kdf.js";
8
+ import { createFullId } from "./utils.js";
9
+ const MAX_U8 = 255;
10
+ async function encrypt({
11
+ keyServers,
12
+ kemType,
13
+ threshold,
14
+ packageId,
15
+ id,
16
+ encryptionInput
17
+ }) {
18
+ if (keyServers.length < threshold || threshold === 0 || keyServers.length > MAX_U8 || threshold > MAX_U8 || !isValidSuiObjectId(packageId)) {
19
+ throw new UserError(
20
+ `Invalid key servers or threshold ${threshold} for ${keyServers.length} key servers for package ${packageId}`
21
+ );
22
+ }
23
+ const key = await encryptionInput.generateKey();
24
+ const demKey = deriveKey(KeyPurpose.DEM, key);
25
+ const ciphertext = await encryptionInput.encrypt(demKey);
26
+ const shares = await split(key, keyServers.length, threshold);
27
+ const fullId = createFullId(DST, packageId, id);
28
+ const encryptedShares = encryptBatched(
29
+ keyServers,
30
+ kemType,
31
+ fromHex(fullId),
32
+ shares.map(({ share, index }) => ({
33
+ msg: share,
34
+ index
35
+ })),
36
+ deriveKey(KeyPurpose.EncryptedRandomness, key)
37
+ );
38
+ const services = keyServers.map((server, i) => [
39
+ server.objectId,
40
+ shares[i].index
41
+ ]);
42
+ return {
43
+ encryptedObject: EncryptedObject.serialize({
44
+ version: 0,
45
+ packageId,
46
+ id,
47
+ services,
48
+ threshold,
49
+ encryptedShares,
50
+ ciphertext
51
+ }).toBytes(),
52
+ key: demKey
53
+ };
54
+ }
55
+ var KemType = /* @__PURE__ */ ((KemType2) => {
56
+ KemType2[KemType2["BonehFranklinBLS12381DemCCA"] = 0] = "BonehFranklinBLS12381DemCCA";
57
+ return KemType2;
58
+ })(KemType || {});
59
+ var DemType = /* @__PURE__ */ ((DemType2) => {
60
+ DemType2[DemType2["AesGcm256"] = 0] = "AesGcm256";
61
+ DemType2[DemType2["Hmac256Ctr"] = 1] = "Hmac256Ctr";
62
+ return DemType2;
63
+ })(DemType || {});
64
+ function encryptBatched(keyServers, kemType, id, shares, randomnessKey) {
65
+ switch (kemType) {
66
+ case 0 /* BonehFranklinBLS12381DemCCA */:
67
+ return new BonehFranklinBLS12381Services(keyServers).encryptBatched(
68
+ id,
69
+ shares,
70
+ randomnessKey
71
+ );
72
+ }
73
+ }
74
+ async function split(secret, n, threshold) {
75
+ if (n === 0 || threshold === 0 || threshold > n) {
76
+ throw new Error("Invalid threshold or number of shares");
77
+ } else if (threshold === 1) {
78
+ const result = [];
79
+ for (let i = 0; i < n; i++) {
80
+ result.push({ share: secret, index: i });
81
+ }
82
+ return Promise.resolve(result);
83
+ }
84
+ return externalSplit(secret, n, threshold).then(
85
+ (share) => share.map((s) => ({
86
+ share: s.subarray(0, s.length - 1),
87
+ // split() returns the share index in the last byte
88
+ index: s[s.length - 1]
89
+ }))
90
+ );
91
+ }
92
+ export {
93
+ DemType,
94
+ KemType,
95
+ MAX_U8,
96
+ encrypt
97
+ };
98
+ //# sourceMappingURL=encrypt.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/encrypt.ts"],
4
+ "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { fromHex } from '@mysten/bcs';\nimport { isValidSuiObjectId } from '@mysten/sui/utils';\nimport { split as externalSplit } from 'shamir-secret-sharing';\n\nimport type { IBEEncryptions } from './bcs.js';\nimport { EncryptedObject } from './bcs.js';\nimport type { EncryptionInput } from './dem.js';\nimport { UserError } from './error.js';\nimport { BonehFranklinBLS12381Services, DST } from './ibe.js';\nimport { deriveKey, KeyPurpose } from './kdf.js';\nimport type { KeyServer } from './key-server.js';\nimport { createFullId } from './utils.js';\n\nexport const MAX_U8 = 255;\n\n/**\n * Given full ID and what key servers to use, return the encrypted message under the identity and return the bcs bytes of the encrypted object.\n *\n * @param keyServers - A list of KeyServers (same server can be used multiple times)\n * @param kemType - The type of KEM to use.\n * @param packageId - packageId\n * @param id - id\n * @param encryptionInput - Input to the encryption. Should be one of the EncryptionInput types, AesGcmEncryptionInput or Plain.\n * @param threshold - The threshold for the TSS encryption.\n * @returns The bcs bytes of the encrypted object containing all metadata and the 256-bit symmetric key that was used to encrypt the object.\n * Since the key can be used to decrypt, it should not be shared but can be used eg. for backup.\n */\nexport async function encrypt({\n\tkeyServers,\n\tkemType,\n\tthreshold,\n\tpackageId,\n\tid,\n\tencryptionInput,\n}: {\n\tkeyServers: KeyServer[];\n\tkemType: KemType;\n\tthreshold: number;\n\tpackageId: string;\n\tid: string;\n\tencryptionInput: EncryptionInput;\n}): Promise<{\n\tencryptedObject: Uint8Array;\n\tkey: Uint8Array;\n}> {\n\t// Check inputs\n\tif (\n\t\tkeyServers.length < threshold ||\n\t\tthreshold === 0 ||\n\t\tkeyServers.length > MAX_U8 ||\n\t\tthreshold > MAX_U8 ||\n\t\t!isValidSuiObjectId(packageId)\n\t) {\n\t\tthrow new UserError(\n\t\t\t`Invalid key servers or threshold ${threshold} for ${keyServers.length} key servers for package ${packageId}`,\n\t\t);\n\t}\n\n\t// Generate a random symmetric key and encrypt the encryption input using this key.\n\tconst key = await encryptionInput.generateKey();\n\tconst demKey = deriveKey(KeyPurpose.DEM, key);\n\tconst ciphertext = await encryptionInput.encrypt(demKey);\n\n\t// Split the symmetric key into shares and encrypt each share with the public keys of the key servers.\n\tconst shares = await split(key, keyServers.length, threshold);\n\n\t// Encrypt the shares with the public keys of the key servers.\n\tconst fullId = createFullId(DST, packageId, id);\n\tconst encryptedShares = encryptBatched(\n\t\tkeyServers,\n\t\tkemType,\n\t\tfromHex(fullId),\n\t\tshares.map(({ share, index }) => ({\n\t\t\tmsg: share,\n\t\t\tindex,\n\t\t})),\n\t\tderiveKey(KeyPurpose.EncryptedRandomness, key),\n\t);\n\n\t// Services and indices of their shares are stored as a tuple\n\tconst services: [string, number][] = keyServers.map((server, i) => [\n\t\tserver.objectId,\n\t\tshares[i].index,\n\t]);\n\n\treturn {\n\t\tencryptedObject: EncryptedObject.serialize({\n\t\t\tversion: 0,\n\t\t\tpackageId,\n\t\t\tid,\n\t\t\tservices,\n\t\t\tthreshold,\n\t\t\tencryptedShares,\n\t\t\tciphertext,\n\t\t}).toBytes(),\n\t\tkey: demKey,\n\t};\n}\n\nexport enum KemType {\n\tBonehFranklinBLS12381DemCCA = 0,\n}\n\nexport enum DemType {\n\tAesGcm256 = 0,\n\tHmac256Ctr = 1,\n}\n\nfunction encryptBatched(\n\tkeyServers: KeyServer[],\n\tkemType: KemType,\n\tid: Uint8Array,\n\tshares: { msg: Uint8Array; index: number }[],\n\trandomnessKey: Uint8Array,\n): typeof IBEEncryptions.$inferType {\n\tswitch (kemType) {\n\t\tcase KemType.BonehFranklinBLS12381DemCCA:\n\t\t\treturn new BonehFranklinBLS12381Services(keyServers).encryptBatched(\n\t\t\t\tid,\n\t\t\t\tshares,\n\t\t\t\trandomnessKey,\n\t\t\t);\n\t}\n}\n\nasync function split(\n\tsecret: Uint8Array,\n\tn: number,\n\tthreshold: number,\n): Promise<{ index: number; share: Uint8Array }[]> {\n\t// The externalSplit function is from the 'shamir-secret-sharing' package and requires t > 1 and n >= 2.\n\t// So we handle the special cases here.\n\tif (n === 0 || threshold === 0 || threshold > n) {\n\t\tthrow new Error('Invalid threshold or number of shares');\n\t} else if (threshold === 1) {\n\t\t// If the threshold is 1, the secret is not split.\n\t\tconst result = [];\n\t\tfor (let i = 0; i < n; i++) {\n\t\t\t// The shared polynomial is a constant in this case, so the index doesn't matter.\n\t\t\t// To make sure they are unique, we use a counter.\n\t\t\tresult.push({ share: secret, index: i });\n\t\t}\n\t\treturn Promise.resolve(result);\n\t}\n\n\treturn externalSplit(secret, n, threshold).then((share) =>\n\t\tshare.map((s) => ({\n\t\t\tshare: s.subarray(0, s.length - 1),\n\t\t\t// split() returns the share index in the last byte\n\t\t\tindex: s[s.length - 1],\n\t\t})),\n\t);\n}\n"],
5
+ "mappings": "AAGA,SAAS,eAAe;AACxB,SAAS,0BAA0B;AACnC,SAAS,SAAS,qBAAqB;AAGvC,SAAS,uBAAuB;AAEhC,SAAS,iBAAiB;AAC1B,SAAS,+BAA+B,WAAW;AACnD,SAAS,WAAW,kBAAkB;AAEtC,SAAS,oBAAoB;AAEtB,MAAM,SAAS;AActB,eAAsB,QAAQ;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,GAUG;AAEF,MACC,WAAW,SAAS,aACpB,cAAc,KACd,WAAW,SAAS,UACpB,YAAY,UACZ,CAAC,mBAAmB,SAAS,GAC5B;AACD,UAAM,IAAI;AAAA,MACT,oCAAoC,SAAS,QAAQ,WAAW,MAAM,4BAA4B,SAAS;AAAA,IAC5G;AAAA,EACD;AAGA,QAAM,MAAM,MAAM,gBAAgB,YAAY;AAC9C,QAAM,SAAS,UAAU,WAAW,KAAK,GAAG;AAC5C,QAAM,aAAa,MAAM,gBAAgB,QAAQ,MAAM;AAGvD,QAAM,SAAS,MAAM,MAAM,KAAK,WAAW,QAAQ,SAAS;AAG5D,QAAM,SAAS,aAAa,KAAK,WAAW,EAAE;AAC9C,QAAM,kBAAkB;AAAA,IACvB;AAAA,IACA;AAAA,IACA,QAAQ,MAAM;AAAA,IACd,OAAO,IAAI,CAAC,EAAE,OAAO,MAAM,OAAO;AAAA,MACjC,KAAK;AAAA,MACL;AAAA,IACD,EAAE;AAAA,IACF,UAAU,WAAW,qBAAqB,GAAG;AAAA,EAC9C;AAGA,QAAM,WAA+B,WAAW,IAAI,CAAC,QAAQ,MAAM;AAAA,IAClE,OAAO;AAAA,IACP,OAAO,CAAC,EAAE;AAAA,EACX,CAAC;AAED,SAAO;AAAA,IACN,iBAAiB,gBAAgB,UAAU;AAAA,MAC1C,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD,CAAC,EAAE,QAAQ;AAAA,IACX,KAAK;AAAA,EACN;AACD;AAEO,IAAK,UAAL,kBAAKA,aAAL;AACN,EAAAA,kBAAA,iCAA8B,KAA9B;AADW,SAAAA;AAAA,GAAA;AAIL,IAAK,UAAL,kBAAKC,aAAL;AACN,EAAAA,kBAAA,eAAY,KAAZ;AACA,EAAAA,kBAAA,gBAAa,KAAb;AAFW,SAAAA;AAAA,GAAA;AAKZ,SAAS,eACR,YACA,SACA,IACA,QACA,eACmC;AACnC,UAAQ,SAAS;AAAA,IAChB,KAAK;AACJ,aAAO,IAAI,8BAA8B,UAAU,EAAE;AAAA,QACpD;AAAA,QACA;AAAA,QACA;AAAA,MACD;AAAA,EACF;AACD;AAEA,eAAe,MACd,QACA,GACA,WACkD;AAGlD,MAAI,MAAM,KAAK,cAAc,KAAK,YAAY,GAAG;AAChD,UAAM,IAAI,MAAM,uCAAuC;AAAA,EACxD,WAAW,cAAc,GAAG;AAE3B,UAAM,SAAS,CAAC;AAChB,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAG3B,aAAO,KAAK,EAAE,OAAO,QAAQ,OAAO,EAAE,CAAC;AAAA,IACxC;AACA,WAAO,QAAQ,QAAQ,MAAM;AAAA,EAC9B;AAEA,SAAO,cAAc,QAAQ,GAAG,SAAS,EAAE;AAAA,IAAK,CAAC,UAChD,MAAM,IAAI,CAAC,OAAO;AAAA,MACjB,OAAO,EAAE,SAAS,GAAG,EAAE,SAAS,CAAC;AAAA;AAAA,MAEjC,OAAO,EAAE,EAAE,SAAS,CAAC;AAAA,IACtB,EAAE;AAAA,EACH;AACD;",
6
+ "names": ["KemType", "DemType"]
7
+ }
@@ -0,0 +1,58 @@
1
+ export declare class SealError extends Error {
2
+ }
3
+ export declare class UserError extends SealError {
4
+ }
5
+ export declare class SealAPIError extends SealError {
6
+ #private;
7
+ requestId?: string | undefined;
8
+ status?: number | undefined;
9
+ constructor(message: string, requestId?: string | undefined, status?: number | undefined);
10
+ static assertResponse(response: Response, requestId: string): Promise<void>;
11
+ }
12
+ export declare class InvalidPTBError extends SealAPIError {
13
+ constructor(requestId?: string);
14
+ }
15
+ export declare class InvalidPackageError extends SealAPIError {
16
+ constructor(requestId?: string);
17
+ }
18
+ export declare class OldPackageError extends SealAPIError {
19
+ constructor(requestId?: string);
20
+ }
21
+ export declare class InvalidUserSignatureError extends SealAPIError {
22
+ constructor(requestId?: string);
23
+ }
24
+ export declare class InvalidSessionKeySignatureError extends SealAPIError {
25
+ constructor(requestId?: string);
26
+ }
27
+ /** Server error indicating that the user does not have access to one or more of the requested keys */
28
+ export declare class NoAccessError extends SealAPIError {
29
+ constructor(requestId?: string);
30
+ }
31
+ /** Server error indicating that the session key has expired */
32
+ export declare class ExpiredSessionKeyError extends SealAPIError {
33
+ constructor(requestId?: string);
34
+ }
35
+ /** Internal server error, caller should retry */
36
+ export declare class InternalError extends SealAPIError {
37
+ constructor(requestId?: string);
38
+ }
39
+ /** General server errors that are not specific to the Seal API (e.g., 404 "Not Found") */
40
+ export declare class GeneralError extends SealAPIError {
41
+ }
42
+ export declare class InvalidPersonalMessageSignatureError extends UserError {
43
+ }
44
+ export declare class InvalidGetObjectError extends UserError {
45
+ }
46
+ export declare class UnsupportedFeatureError extends UserError {
47
+ }
48
+ export declare class UnsupportedNetworkError extends UserError {
49
+ }
50
+ export declare class InvalidKeyServerError extends UserError {
51
+ }
52
+ export declare class InvalidCiphertextError extends UserError {
53
+ }
54
+ export declare class InvalidThresholdError extends UserError {
55
+ }
56
+ export declare class InconsistentKeyServersError extends UserError {
57
+ }
58
+ export declare function toMajorityError(errors: Error[]): Error;
@@ -0,0 +1,155 @@
1
+ var __typeError = (msg) => {
2
+ throw TypeError(msg);
3
+ };
4
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
5
+ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
6
+ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
7
+ var _SealAPIError_static, generate_fn;
8
+ class SealError extends Error {
9
+ }
10
+ class UserError extends SealError {
11
+ }
12
+ const _SealAPIError = class _SealAPIError extends SealError {
13
+ constructor(message, requestId, status) {
14
+ super(message);
15
+ this.requestId = requestId;
16
+ this.status = status;
17
+ }
18
+ static async assertResponse(response, requestId) {
19
+ var _a;
20
+ if (response.ok) {
21
+ return;
22
+ }
23
+ let errorInstance;
24
+ try {
25
+ const text = await response.text();
26
+ const error = JSON.parse(text)["error"];
27
+ errorInstance = __privateMethod(_a = _SealAPIError, _SealAPIError_static, generate_fn).call(_a, error, requestId);
28
+ } catch (e) {
29
+ errorInstance = new GeneralError(response.statusText, requestId, response.status);
30
+ }
31
+ throw errorInstance;
32
+ }
33
+ };
34
+ _SealAPIError_static = new WeakSet();
35
+ generate_fn = function(message, requestId, status) {
36
+ switch (message) {
37
+ case "InvalidPTB":
38
+ return new InvalidPTBError(requestId);
39
+ case "InvalidPackage":
40
+ return new InvalidPackageError(requestId);
41
+ case "NoAccess":
42
+ return new NoAccessError(requestId);
43
+ case "InvalidCertificate":
44
+ return new ExpiredSessionKeyError(requestId);
45
+ case "OldPackageVersion":
46
+ return new OldPackageError(requestId);
47
+ case "InvalidSignature":
48
+ return new InvalidUserSignatureError(requestId);
49
+ case "InvalidSessionSignature":
50
+ return new InvalidSessionKeySignatureError(requestId);
51
+ case "Failure":
52
+ return new InternalError(requestId);
53
+ default:
54
+ return new GeneralError(message, requestId, status);
55
+ }
56
+ };
57
+ __privateAdd(_SealAPIError, _SealAPIError_static);
58
+ let SealAPIError = _SealAPIError;
59
+ class InvalidPTBError extends SealAPIError {
60
+ constructor(requestId) {
61
+ super("PTB does not conform to the expected format", requestId);
62
+ }
63
+ }
64
+ class InvalidPackageError extends SealAPIError {
65
+ constructor(requestId) {
66
+ super("Package ID used in PTB is invalid", requestId);
67
+ }
68
+ }
69
+ class OldPackageError extends SealAPIError {
70
+ constructor(requestId) {
71
+ super("PTB must call the latest version of the package", requestId);
72
+ }
73
+ }
74
+ class InvalidUserSignatureError extends SealAPIError {
75
+ constructor(requestId) {
76
+ super("User signature on the session key is invalid", requestId);
77
+ }
78
+ }
79
+ class InvalidSessionKeySignatureError extends SealAPIError {
80
+ constructor(requestId) {
81
+ super("Session key signature is invalid", requestId);
82
+ }
83
+ }
84
+ class NoAccessError extends SealAPIError {
85
+ constructor(requestId) {
86
+ super("User does not have access to one or more of the requested keys", requestId);
87
+ }
88
+ }
89
+ class ExpiredSessionKeyError extends SealAPIError {
90
+ constructor(requestId) {
91
+ super("Session key has expired", requestId);
92
+ }
93
+ }
94
+ class InternalError extends SealAPIError {
95
+ constructor(requestId) {
96
+ super("Internal server error, caller should retry", requestId);
97
+ }
98
+ }
99
+ class GeneralError extends SealAPIError {
100
+ }
101
+ class InvalidPersonalMessageSignatureError extends UserError {
102
+ }
103
+ class InvalidGetObjectError extends UserError {
104
+ }
105
+ class UnsupportedFeatureError extends UserError {
106
+ }
107
+ class UnsupportedNetworkError extends UserError {
108
+ }
109
+ class InvalidKeyServerError extends UserError {
110
+ }
111
+ class InvalidCiphertextError extends UserError {
112
+ }
113
+ class InvalidThresholdError extends UserError {
114
+ }
115
+ class InconsistentKeyServersError extends UserError {
116
+ }
117
+ function toMajorityError(errors) {
118
+ let maxCount = 0;
119
+ let majorityError = errors[0];
120
+ const counts = /* @__PURE__ */ new Map();
121
+ for (const error of errors) {
122
+ const errorName = error.constructor.name;
123
+ const newCount = (counts.get(errorName) || 0) + 1;
124
+ counts.set(errorName, newCount);
125
+ if (newCount > maxCount) {
126
+ maxCount = newCount;
127
+ majorityError = error;
128
+ }
129
+ }
130
+ return majorityError;
131
+ }
132
+ export {
133
+ ExpiredSessionKeyError,
134
+ GeneralError,
135
+ InconsistentKeyServersError,
136
+ InternalError,
137
+ InvalidCiphertextError,
138
+ InvalidGetObjectError,
139
+ InvalidKeyServerError,
140
+ InvalidPTBError,
141
+ InvalidPackageError,
142
+ InvalidPersonalMessageSignatureError,
143
+ InvalidSessionKeySignatureError,
144
+ InvalidThresholdError,
145
+ InvalidUserSignatureError,
146
+ NoAccessError,
147
+ OldPackageError,
148
+ SealAPIError,
149
+ SealError,
150
+ UnsupportedFeatureError,
151
+ UnsupportedNetworkError,
152
+ UserError,
153
+ toMajorityError
154
+ };
155
+ //# sourceMappingURL=error.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/error.ts"],
4
+ "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nexport class SealError extends Error {}\n\nexport class UserError extends SealError {}\n\n// Errors returned by the Seal server\nexport class SealAPIError extends SealError {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic requestId?: string,\n\t\tpublic status?: number,\n\t) {\n\t\tsuper(message);\n\t}\n\n\tstatic #generate(message: string, requestId: string, status?: number) {\n\t\tswitch (message) {\n\t\t\tcase 'InvalidPTB':\n\t\t\t\treturn new InvalidPTBError(requestId);\n\t\t\tcase 'InvalidPackage':\n\t\t\t\treturn new InvalidPackageError(requestId);\n\t\t\tcase 'NoAccess':\n\t\t\t\treturn new NoAccessError(requestId);\n\t\t\tcase 'InvalidCertificate':\n\t\t\t\treturn new ExpiredSessionKeyError(requestId);\n\t\t\tcase 'OldPackageVersion':\n\t\t\t\treturn new OldPackageError(requestId);\n\t\t\tcase 'InvalidSignature':\n\t\t\t\treturn new InvalidUserSignatureError(requestId);\n\t\t\tcase 'InvalidSessionSignature':\n\t\t\t\treturn new InvalidSessionKeySignatureError(requestId);\n\t\t\tcase 'Failure':\n\t\t\t\treturn new InternalError(requestId);\n\t\t\tdefault:\n\t\t\t\treturn new GeneralError(message, requestId, status);\n\t\t}\n\t}\n\n\tstatic async assertResponse(response: Response, requestId: string) {\n\t\tif (response.ok) {\n\t\t\treturn;\n\t\t}\n\t\tlet errorInstance: SealAPIError;\n\t\ttry {\n\t\t\tconst text = await response.text();\n\t\t\tconst error = JSON.parse(text)['error'];\n\t\t\terrorInstance = SealAPIError.#generate(error, requestId);\n\t\t} catch (e) {\n\t\t\t// If we can't parse the response as JSON or if it doesn't have the expected format,\n\t\t\t// fall back to using the status text\n\t\t\terrorInstance = new GeneralError(response.statusText, requestId, response.status);\n\t\t}\n\t\tthrow errorInstance;\n\t}\n}\n\n// Errors returned by the Seal server that indicate that the PTB is invalid\n\nexport class InvalidPTBError extends SealAPIError {\n\tconstructor(requestId?: string) {\n\t\tsuper('PTB does not conform to the expected format', requestId);\n\t}\n}\n\nexport class InvalidPackageError extends SealAPIError {\n\tconstructor(requestId?: string) {\n\t\tsuper('Package ID used in PTB is invalid', requestId);\n\t}\n}\n\nexport class OldPackageError extends SealAPIError {\n\tconstructor(requestId?: string) {\n\t\tsuper('PTB must call the latest version of the package', requestId);\n\t}\n}\n\n// Errors returned by the Seal server that indicate that the user's signature is invalid\n\nexport class InvalidUserSignatureError extends SealAPIError {\n\tconstructor(requestId?: string) {\n\t\tsuper('User signature on the session key is invalid', requestId);\n\t}\n}\n\nexport class InvalidSessionKeySignatureError extends SealAPIError {\n\tconstructor(requestId?: string) {\n\t\tsuper('Session key signature is invalid', requestId);\n\t}\n}\n\n/** Server error indicating that the user does not have access to one or more of the requested keys */\nexport class NoAccessError extends SealAPIError {\n\tconstructor(requestId?: string) {\n\t\tsuper('User does not have access to one or more of the requested keys', requestId);\n\t}\n}\n\n/** Server error indicating that the session key has expired */\nexport class ExpiredSessionKeyError extends SealAPIError {\n\tconstructor(requestId?: string) {\n\t\tsuper('Session key has expired', requestId);\n\t}\n}\n\n/** Internal server error, caller should retry */\nexport class InternalError extends SealAPIError {\n\tconstructor(requestId?: string) {\n\t\tsuper('Internal server error, caller should retry', requestId);\n\t}\n}\n\n/** General server errors that are not specific to the Seal API (e.g., 404 \"Not Found\") */\nexport class GeneralError extends SealAPIError {}\n\n// Errors returned by the SDK\nexport class InvalidPersonalMessageSignatureError extends UserError {}\nexport class InvalidGetObjectError extends UserError {}\nexport class UnsupportedFeatureError extends UserError {}\nexport class UnsupportedNetworkError extends UserError {}\nexport class InvalidKeyServerError extends UserError {}\nexport class InvalidCiphertextError extends UserError {}\nexport class InvalidThresholdError extends UserError {}\nexport class InconsistentKeyServersError extends UserError {}\n\nexport function toMajorityError(errors: Error[]): Error {\n\tlet maxCount = 0;\n\tlet majorityError = errors[0];\n\tconst counts = new Map<string, number>();\n\tfor (const error of errors) {\n\t\tconst errorName = error.constructor.name;\n\t\tconst newCount = (counts.get(errorName) || 0) + 1;\n\t\tcounts.set(errorName, newCount);\n\n\t\tif (newCount > maxCount) {\n\t\t\tmaxCount = newCount;\n\t\t\tmajorityError = error;\n\t\t}\n\t}\n\n\treturn majorityError;\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }