@haneullabs/seal 0.1.0 → 1.0.1

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 (157) hide show
  1. package/CHANGELOG.md +102 -57
  2. package/dist/bcs.d.mts +40 -0
  3. package/dist/bcs.d.mts.map +1 -0
  4. package/dist/bcs.mjs +89 -0
  5. package/dist/bcs.mjs.map +1 -0
  6. package/dist/bls12381.d.mts +30 -0
  7. package/dist/bls12381.d.mts.map +1 -0
  8. package/dist/bls12381.mjs +135 -0
  9. package/dist/bls12381.mjs.map +1 -0
  10. package/dist/client.d.mts +106 -0
  11. package/dist/client.d.mts.map +1 -0
  12. package/dist/client.mjs +274 -0
  13. package/dist/client.mjs.map +1 -0
  14. package/dist/decrypt.mjs +53 -0
  15. package/dist/decrypt.mjs.map +1 -0
  16. package/dist/dem.d.mts +1 -0
  17. package/dist/dem.mjs +134 -0
  18. package/dist/dem.mjs.map +1 -0
  19. package/dist/elgamal.mjs +35 -0
  20. package/dist/elgamal.mjs.map +1 -0
  21. package/dist/encrypt.d.mts +15 -0
  22. package/dist/encrypt.d.mts.map +1 -0
  23. package/dist/encrypt.mjs +61 -0
  24. package/dist/encrypt.mjs.map +1 -0
  25. package/dist/error.d.mts +75 -0
  26. package/dist/error.d.mts.map +1 -0
  27. package/dist/error.mjs +150 -0
  28. package/dist/error.mjs.map +1 -0
  29. package/dist/ibe.mjs +176 -0
  30. package/dist/ibe.mjs.map +1 -0
  31. package/dist/index.d.mts +7 -0
  32. package/dist/index.mjs +7 -0
  33. package/dist/kdf.mjs +81 -0
  34. package/dist/kdf.mjs.map +1 -0
  35. package/dist/key-server.d.mts +22 -0
  36. package/dist/key-server.d.mts.map +1 -0
  37. package/dist/key-server.mjs +195 -0
  38. package/dist/key-server.mjs.map +1 -0
  39. package/dist/session-key.d.mts +83 -0
  40. package/dist/session-key.d.mts.map +1 -0
  41. package/dist/session-key.mjs +171 -0
  42. package/dist/session-key.mjs.map +1 -0
  43. package/dist/shamir.mjs +730 -0
  44. package/dist/shamir.mjs.map +1 -0
  45. package/dist/types.d.mts +79 -0
  46. package/dist/types.d.mts.map +1 -0
  47. package/dist/utils.mjs +89 -0
  48. package/dist/utils.mjs.map +1 -0
  49. package/dist/version.mjs +6 -0
  50. package/dist/version.mjs.map +1 -0
  51. package/package.json +26 -24
  52. package/dist/cjs/bcs.d.ts +0 -71
  53. package/dist/cjs/bcs.js +0 -74
  54. package/dist/cjs/bcs.js.map +0 -7
  55. package/dist/cjs/bls12381.d.ts +0 -44
  56. package/dist/cjs/bls12381.js +0 -151
  57. package/dist/cjs/bls12381.js.map +0 -7
  58. package/dist/cjs/client.d.ts +0 -84
  59. package/dist/cjs/client.js +0 -414
  60. package/dist/cjs/client.js.map +0 -7
  61. package/dist/cjs/decrypt.d.ts +0 -22
  62. package/dist/cjs/decrypt.js +0 -109
  63. package/dist/cjs/decrypt.js.map +0 -7
  64. package/dist/cjs/dem.d.ts +0 -38
  65. package/dist/cjs/dem.js +0 -185
  66. package/dist/cjs/dem.js.map +0 -7
  67. package/dist/cjs/elgamal.d.ts +0 -13
  68. package/dist/cjs/elgamal.js +0 -46
  69. package/dist/cjs/elgamal.js.map +0 -7
  70. package/dist/cjs/encrypt.d.ts +0 -32
  71. package/dist/cjs/encrypt.js +0 -104
  72. package/dist/cjs/encrypt.js.map +0 -7
  73. package/dist/cjs/error.d.ts +0 -86
  74. package/dist/cjs/error.js +0 -239
  75. package/dist/cjs/error.js.map +0 -7
  76. package/dist/cjs/ibe.d.ts +0 -98
  77. package/dist/cjs/ibe.js +0 -167
  78. package/dist/cjs/ibe.js.map +0 -7
  79. package/dist/cjs/index.d.ts +0 -6
  80. package/dist/cjs/index.js +0 -33
  81. package/dist/cjs/index.js.map +0 -7
  82. package/dist/cjs/kdf.d.ts +0 -30
  83. package/dist/cjs/kdf.js +0 -97
  84. package/dist/cjs/kdf.js.map +0 -7
  85. package/dist/cjs/key-server.d.ts +0 -98
  86. package/dist/cjs/key-server.js +0 -171
  87. package/dist/cjs/key-server.js.map +0 -7
  88. package/dist/cjs/package.json +0 -5
  89. package/dist/cjs/session-key.d.ts +0 -74
  90. package/dist/cjs/session-key.js +0 -245
  91. package/dist/cjs/session-key.js.map +0 -7
  92. package/dist/cjs/shamir.d.ts +0 -91
  93. package/dist/cjs/shamir.js +0 -770
  94. package/dist/cjs/shamir.js.map +0 -7
  95. package/dist/cjs/types.d.ts +0 -83
  96. package/dist/cjs/types.js +0 -17
  97. package/dist/cjs/types.js.map +0 -7
  98. package/dist/cjs/utils.d.ts +0 -47
  99. package/dist/cjs/utils.js +0 -106
  100. package/dist/cjs/utils.js.map +0 -7
  101. package/dist/cjs/version.d.ts +0 -1
  102. package/dist/cjs/version.js +0 -25
  103. package/dist/cjs/version.js.map +0 -7
  104. package/dist/esm/bcs.d.ts +0 -71
  105. package/dist/esm/bcs.js +0 -54
  106. package/dist/esm/bcs.js.map +0 -7
  107. package/dist/esm/bls12381.d.ts +0 -44
  108. package/dist/esm/bls12381.js +0 -131
  109. package/dist/esm/bls12381.js.map +0 -7
  110. package/dist/esm/client.d.ts +0 -84
  111. package/dist/esm/client.js +0 -407
  112. package/dist/esm/client.js.map +0 -7
  113. package/dist/esm/decrypt.d.ts +0 -22
  114. package/dist/esm/decrypt.js +0 -94
  115. package/dist/esm/decrypt.js.map +0 -7
  116. package/dist/esm/dem.d.ts +0 -38
  117. package/dist/esm/dem.js +0 -165
  118. package/dist/esm/dem.js.map +0 -7
  119. package/dist/esm/elgamal.d.ts +0 -13
  120. package/dist/esm/elgamal.js +0 -26
  121. package/dist/esm/elgamal.js.map +0 -7
  122. package/dist/esm/encrypt.d.ts +0 -32
  123. package/dist/esm/encrypt.js +0 -84
  124. package/dist/esm/encrypt.js.map +0 -7
  125. package/dist/esm/error.d.ts +0 -86
  126. package/dist/esm/error.js +0 -219
  127. package/dist/esm/error.js.map +0 -7
  128. package/dist/esm/ibe.d.ts +0 -98
  129. package/dist/esm/ibe.js +0 -147
  130. package/dist/esm/ibe.js.map +0 -7
  131. package/dist/esm/index.d.ts +0 -6
  132. package/dist/esm/index.js +0 -12
  133. package/dist/esm/index.js.map +0 -7
  134. package/dist/esm/kdf.d.ts +0 -30
  135. package/dist/esm/kdf.js +0 -83
  136. package/dist/esm/kdf.js.map +0 -7
  137. package/dist/esm/key-server.d.ts +0 -98
  138. package/dist/esm/key-server.js +0 -151
  139. package/dist/esm/key-server.js.map +0 -7
  140. package/dist/esm/package.json +0 -5
  141. package/dist/esm/session-key.d.ts +0 -74
  142. package/dist/esm/session-key.js +0 -230
  143. package/dist/esm/session-key.js.map +0 -7
  144. package/dist/esm/shamir.d.ts +0 -91
  145. package/dist/esm/shamir.js +0 -750
  146. package/dist/esm/shamir.js.map +0 -7
  147. package/dist/esm/types.d.ts +0 -83
  148. package/dist/esm/types.js +0 -1
  149. package/dist/esm/types.js.map +0 -7
  150. package/dist/esm/utils.d.ts +0 -47
  151. package/dist/esm/utils.js +0 -86
  152. package/dist/esm/utils.js.map +0 -7
  153. package/dist/esm/version.d.ts +0 -1
  154. package/dist/esm/version.js +0 -5
  155. package/dist/esm/version.js.map +0 -7
  156. package/dist/tsconfig.esm.tsbuildinfo +0 -1
  157. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -0,0 +1,171 @@
1
+ import { ExpiredSessionKeyError, InvalidPackageError, InvalidPersonalMessageSignatureError, UserError } from "./error.mjs";
2
+ import { generateSecretKey, toPublicKey, toVerificationKey } from "./elgamal.mjs";
3
+ import { toBase64 } from "@haneullabs/bcs";
4
+ import { bcs as bcs$1 } from "@haneullabs/haneul/bcs";
5
+ import { isValidHaneulAddress, isValidHaneulObjectId, isValidNamedPackage } from "@haneullabs/haneul/utils";
6
+ import { Ed25519Keypair } from "@haneullabs/haneul/keypairs/ed25519";
7
+ import { verifyPersonalMessageSignature } from "@haneullabs/haneul/verify";
8
+
9
+ //#region src/session-key.ts
10
+ const RequestFormat = bcs$1.struct("RequestFormat", {
11
+ ptb: bcs$1.byteVector(),
12
+ encKey: bcs$1.byteVector(),
13
+ encVerificationKey: bcs$1.byteVector()
14
+ });
15
+ var SessionKey = class SessionKey {
16
+ #address;
17
+ #packageId;
18
+ #mvrName;
19
+ #creationTimeMs;
20
+ #ttlMin;
21
+ #sessionKey;
22
+ #personalMessageSignature;
23
+ #signer;
24
+ #suiClient;
25
+ constructor({ address, packageId, mvrName, ttlMin, signer, suiClient }) {
26
+ if (mvrName && !isValidNamedPackage(mvrName)) throw new UserError(`Invalid package name ${mvrName}`);
27
+ if (!isValidHaneulObjectId(packageId) || !isValidHaneulAddress(address)) throw new UserError(`Invalid package ID ${packageId} or address ${address}`);
28
+ if (ttlMin > 30 || ttlMin < 1) throw new UserError(`Invalid TTL ${ttlMin}, must be between 1 and 30`);
29
+ if (signer && signer.getPublicKey().toSuiAddress() !== address) throw new UserError("Signer address does not match session key address");
30
+ this.#address = address;
31
+ this.#packageId = packageId;
32
+ this.#mvrName = mvrName;
33
+ this.#creationTimeMs = Date.now();
34
+ this.#ttlMin = ttlMin;
35
+ this.#sessionKey = Ed25519Keypair.generate();
36
+ this.#signer = signer;
37
+ this.#suiClient = suiClient;
38
+ }
39
+ /**
40
+ * Create a new SessionKey instance.
41
+ * @param address - The address of the user.
42
+ * @param packageId - The ID of the package.
43
+ * @param mvrName - Optional. The name of the MVR, if there is one.
44
+ * @param ttlMin - The TTL in minutes.
45
+ * @param signer - Optional. The signer instance, e.g. EnokiSigner.
46
+ * @param suiClient - The Haneul client.
47
+ * @returns A new SessionKey instance.
48
+ */
49
+ static async create({ address, packageId, mvrName, ttlMin, signer, suiClient }) {
50
+ const packageObj = await suiClient.core.getObject({ objectId: packageId });
51
+ if (String(packageObj.object.version) !== "1") throw new InvalidPackageError(`Package ${packageId} is not the first version`);
52
+ return new SessionKey({
53
+ address,
54
+ packageId,
55
+ mvrName,
56
+ ttlMin,
57
+ signer,
58
+ suiClient
59
+ });
60
+ }
61
+ isExpired() {
62
+ return this.#creationTimeMs + this.#ttlMin * 60 * 1e3 - 1e4 < Date.now();
63
+ }
64
+ getAddress() {
65
+ return this.#address;
66
+ }
67
+ getPackageName() {
68
+ if (this.#mvrName) return this.#mvrName;
69
+ return this.#packageId;
70
+ }
71
+ getPackageId() {
72
+ return this.#packageId;
73
+ }
74
+ getPersonalMessage() {
75
+ const creationTimeUtc = new Date(this.#creationTimeMs).toISOString().slice(0, 19).replace("T", " ") + " UTC";
76
+ const message = `Accessing keys of package ${this.getPackageName()} for ${this.#ttlMin} mins from ${creationTimeUtc}, session key ${toBase64(this.#sessionKey.getPublicKey().toRawBytes())}`;
77
+ return new TextEncoder().encode(message);
78
+ }
79
+ async setPersonalMessageSignature(personalMessageSignature) {
80
+ if (!this.#personalMessageSignature) try {
81
+ await verifyPersonalMessageSignature(this.getPersonalMessage(), personalMessageSignature, {
82
+ address: this.#address,
83
+ client: this.#suiClient
84
+ });
85
+ this.#personalMessageSignature = personalMessageSignature;
86
+ } catch {
87
+ throw new InvalidPersonalMessageSignatureError("Not valid");
88
+ }
89
+ }
90
+ async getCertificate() {
91
+ if (!this.#personalMessageSignature) if (this.#signer) {
92
+ const { signature } = await this.#signer.signPersonalMessage(this.getPersonalMessage());
93
+ this.#personalMessageSignature = signature;
94
+ } else throw new InvalidPersonalMessageSignatureError("Personal message signature is not set");
95
+ return {
96
+ user: this.#address,
97
+ session_vk: toBase64(this.#sessionKey.getPublicKey().toRawBytes()),
98
+ creation_time: this.#creationTimeMs,
99
+ ttl_min: this.#ttlMin,
100
+ signature: this.#personalMessageSignature,
101
+ mvr_name: this.#mvrName
102
+ };
103
+ }
104
+ /**
105
+ * Create request params for the given transaction bytes.
106
+ * @param txBytes - The transaction bytes.
107
+ * @returns The request params containing the ephemeral secret key,
108
+ * its public key and its verification key.
109
+ */
110
+ async createRequestParams(txBytes) {
111
+ if (this.isExpired()) throw new ExpiredSessionKeyError();
112
+ const encKey = generateSecretKey();
113
+ const encKeyPk = toPublicKey(encKey);
114
+ const encVerificationKey = toVerificationKey(encKey);
115
+ const msgToSign = RequestFormat.serialize({
116
+ ptb: txBytes.slice(1),
117
+ encKey: encKeyPk,
118
+ encVerificationKey
119
+ }).toBytes();
120
+ return {
121
+ encKey,
122
+ encKeyPk,
123
+ encVerificationKey,
124
+ requestSignature: toBase64(await this.#sessionKey.sign(msgToSign))
125
+ };
126
+ }
127
+ /**
128
+ * Export the Session Key object from the instance. Store the object in IndexedDB to persist.
129
+ */
130
+ export() {
131
+ const obj = {
132
+ address: this.#address,
133
+ packageId: this.#packageId,
134
+ mvrName: this.#mvrName,
135
+ creationTimeMs: this.#creationTimeMs,
136
+ ttlMin: this.#ttlMin,
137
+ personalMessageSignature: this.#personalMessageSignature,
138
+ sessionKey: this.#sessionKey.getSecretKey()
139
+ };
140
+ Object.defineProperty(obj, "toJSON", {
141
+ enumerable: false,
142
+ value: () => {
143
+ throw new Error("This object is not serializable");
144
+ }
145
+ });
146
+ return obj;
147
+ }
148
+ /**
149
+ * Restore a SessionKey instance for the given object.
150
+ * @returns A new SessionKey instance with restored state
151
+ */
152
+ static import(data, suiClient, signer) {
153
+ const instance = new SessionKey({
154
+ address: data.address,
155
+ packageId: data.packageId,
156
+ mvrName: data.mvrName,
157
+ ttlMin: data.ttlMin,
158
+ signer,
159
+ suiClient
160
+ });
161
+ instance.#creationTimeMs = data.creationTimeMs;
162
+ instance.#sessionKey = Ed25519Keypair.fromSecretKey(data.sessionKey);
163
+ instance.#personalMessageSignature = data.personalMessageSignature;
164
+ if (instance.isExpired()) throw new ExpiredSessionKeyError();
165
+ return instance;
166
+ }
167
+ };
168
+
169
+ //#endregion
170
+ export { SessionKey };
171
+ //# sourceMappingURL=session-key.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-key.mjs","names":["bcs","#address","#packageId","#mvrName","#creationTimeMs","#ttlMin","#sessionKey","#signer","#suiClient","#personalMessageSignature"],"sources":["../src/session-key.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { toBase64 } from '@haneullabs/bcs';\nimport { bcs } from '@haneullabs/haneul/bcs';\nimport type { Signer } from '@haneullabs/haneul/cryptography';\nimport { Ed25519Keypair } from '@haneullabs/haneul/keypairs/ed25519';\nimport { isValidNamedPackage, isValidHaneulAddress, isValidHaneulObjectId } from '@haneullabs/haneul/utils';\nimport { verifyPersonalMessageSignature } from '@haneullabs/haneul/verify';\nimport { generateSecretKey, toPublicKey, toVerificationKey } from './elgamal.js';\nimport {\n\tExpiredSessionKeyError,\n\tInvalidPackageError,\n\tInvalidPersonalMessageSignatureError,\n\tUserError,\n} from './error.js';\nimport type { SealCompatibleClient } from './types.js';\n\nexport const RequestFormat = bcs.struct('RequestFormat', {\n\tptb: bcs.byteVector(),\n\tencKey: bcs.byteVector(),\n\tencVerificationKey: bcs.byteVector(),\n});\n\nexport type Certificate = {\n\tuser: string;\n\tsession_vk: string;\n\tcreation_time: number;\n\tttl_min: number;\n\tsignature: string;\n\tmvr_name?: string;\n};\n\nexport type ExportedSessionKey = {\n\taddress: string;\n\tpackageId: string;\n\tmvrName?: string;\n\tcreationTimeMs: number;\n\tttlMin: number;\n\tpersonalMessageSignature?: string;\n\tsessionKey: string;\n};\n\nexport class SessionKey {\n\t#address: string;\n\t#packageId: string;\n\t#mvrName?: string;\n\t#creationTimeMs: number;\n\t#ttlMin: number;\n\t#sessionKey: Ed25519Keypair;\n\t#personalMessageSignature?: string;\n\t#signer?: Signer;\n\t#suiClient: SealCompatibleClient;\n\n\tprivate constructor({\n\t\taddress,\n\t\tpackageId,\n\t\tmvrName,\n\t\tttlMin,\n\t\tsigner,\n\t\tsuiClient,\n\t}: {\n\t\taddress: string;\n\t\tpackageId: string;\n\t\tmvrName?: string;\n\t\tttlMin: number;\n\t\tsigner?: Signer;\n\t\tsuiClient: SealCompatibleClient;\n\t}) {\n\t\tif (mvrName && !isValidNamedPackage(mvrName)) {\n\t\t\tthrow new UserError(`Invalid package name ${mvrName}`);\n\t\t}\n\t\tif (!isValidHaneulObjectId(packageId) || !isValidHaneulAddress(address)) {\n\t\t\tthrow new UserError(`Invalid package ID ${packageId} or address ${address}`);\n\t\t}\n\t\tif (ttlMin > 30 || ttlMin < 1) {\n\t\t\tthrow new UserError(`Invalid TTL ${ttlMin}, must be between 1 and 30`);\n\t\t}\n\t\tif (signer && signer.getPublicKey().toSuiAddress() !== address) {\n\t\t\tthrow new UserError('Signer address does not match session key address');\n\t\t}\n\n\t\tthis.#address = address;\n\t\tthis.#packageId = packageId;\n\t\tthis.#mvrName = mvrName;\n\t\tthis.#creationTimeMs = Date.now();\n\t\tthis.#ttlMin = ttlMin;\n\t\tthis.#sessionKey = Ed25519Keypair.generate();\n\t\tthis.#signer = signer;\n\t\tthis.#suiClient = suiClient;\n\t}\n\n\t/**\n\t * Create a new SessionKey instance.\n\t * @param address - The address of the user.\n\t * @param packageId - The ID of the package.\n\t * @param mvrName - Optional. The name of the MVR, if there is one.\n\t * @param ttlMin - The TTL in minutes.\n\t * @param signer - Optional. The signer instance, e.g. EnokiSigner.\n\t * @param suiClient - The Haneul client.\n\t * @returns A new SessionKey instance.\n\t */\n\tstatic async create({\n\t\taddress,\n\t\tpackageId,\n\t\tmvrName,\n\t\tttlMin,\n\t\tsigner,\n\t\tsuiClient,\n\t}: {\n\t\taddress: string;\n\t\tpackageId: string;\n\t\tmvrName?: string;\n\t\tttlMin: number;\n\t\tsigner?: Signer;\n\t\tsuiClient: SealCompatibleClient;\n\t}): Promise<SessionKey> {\n\t\tconst packageObj = await suiClient.core.getObject({ objectId: packageId });\n\t\tif (String(packageObj.object.version) !== '1') {\n\t\t\tthrow new InvalidPackageError(`Package ${packageId} is not the first version`);\n\t\t}\n\n\t\treturn new SessionKey({\n\t\t\taddress,\n\t\t\tpackageId,\n\t\t\tmvrName,\n\t\t\tttlMin,\n\t\t\tsigner,\n\t\t\tsuiClient,\n\t\t});\n\t}\n\tisExpired(): boolean {\n\t\t// Allow 10 seconds for clock skew\n\t\treturn this.#creationTimeMs + this.#ttlMin * 60 * 1000 - 10_000 < Date.now();\n\t}\n\n\tgetAddress(): string {\n\t\treturn this.#address;\n\t}\n\n\tgetPackageName(): string {\n\t\tif (this.#mvrName) {\n\t\t\treturn this.#mvrName;\n\t\t}\n\t\treturn this.#packageId;\n\t}\n\n\tgetPackageId(): string {\n\t\treturn this.#packageId;\n\t}\n\n\tgetPersonalMessage(): Uint8Array {\n\t\tconst creationTimeUtc =\n\t\t\tnew Date(this.#creationTimeMs).toISOString().slice(0, 19).replace('T', ' ') + ' UTC';\n\t\tconst message = `Accessing keys of package ${this.getPackageName()} for ${this.#ttlMin} mins from ${creationTimeUtc}, session key ${toBase64(this.#sessionKey.getPublicKey().toRawBytes())}`;\n\t\treturn new TextEncoder().encode(message);\n\t}\n\n\tasync setPersonalMessageSignature(personalMessageSignature: string) {\n\t\tif (!this.#personalMessageSignature) {\n\t\t\ttry {\n\t\t\t\tawait verifyPersonalMessageSignature(this.getPersonalMessage(), personalMessageSignature, {\n\t\t\t\t\taddress: this.#address,\n\t\t\t\t\tclient: this.#suiClient,\n\t\t\t\t});\n\t\t\t\tthis.#personalMessageSignature = personalMessageSignature;\n\t\t\t} catch {\n\t\t\t\tthrow new InvalidPersonalMessageSignatureError('Not valid');\n\t\t\t}\n\t\t}\n\t}\n\n\tasync getCertificate(): Promise<Certificate> {\n\t\tif (!this.#personalMessageSignature) {\n\t\t\tif (this.#signer) {\n\t\t\t\tconst { signature } = await this.#signer.signPersonalMessage(this.getPersonalMessage());\n\t\t\t\tthis.#personalMessageSignature = signature;\n\t\t\t} else {\n\t\t\t\tthrow new InvalidPersonalMessageSignatureError('Personal message signature is not set');\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tuser: this.#address,\n\t\t\tsession_vk: toBase64(this.#sessionKey.getPublicKey().toRawBytes()),\n\t\t\tcreation_time: this.#creationTimeMs,\n\t\t\tttl_min: this.#ttlMin,\n\t\t\tsignature: this.#personalMessageSignature,\n\t\t\tmvr_name: this.#mvrName,\n\t\t};\n\t}\n\n\t/**\n\t * Create request params for the given transaction bytes.\n\t * @param txBytes - The transaction bytes.\n\t * @returns The request params containing the ephemeral secret key,\n\t * its public key and its verification key.\n\t */\n\tasync createRequestParams(txBytes: Uint8Array): Promise<{\n\t\tencKey: Uint8Array<ArrayBuffer>;\n\t\tencKeyPk: Uint8Array<ArrayBuffer>;\n\t\tencVerificationKey: Uint8Array<ArrayBuffer>;\n\t\trequestSignature: string;\n\t}> {\n\t\tif (this.isExpired()) {\n\t\t\tthrow new ExpiredSessionKeyError();\n\t\t}\n\t\tconst encKey = generateSecretKey();\n\t\tconst encKeyPk = toPublicKey(encKey);\n\t\tconst encVerificationKey = toVerificationKey(encKey);\n\n\t\tconst msgToSign = RequestFormat.serialize({\n\t\t\tptb: txBytes.slice(1),\n\t\t\tencKey: encKeyPk,\n\t\t\tencVerificationKey,\n\t\t}).toBytes();\n\t\treturn {\n\t\t\tencKey,\n\t\t\tencKeyPk,\n\t\t\tencVerificationKey,\n\t\t\trequestSignature: toBase64(await this.#sessionKey.sign(msgToSign)),\n\t\t};\n\t}\n\n\t/**\n\t * Export the Session Key object from the instance. Store the object in IndexedDB to persist.\n\t */\n\texport(): ExportedSessionKey {\n\t\tconst obj = {\n\t\t\taddress: this.#address,\n\t\t\tpackageId: this.#packageId,\n\t\t\tmvrName: this.#mvrName,\n\t\t\tcreationTimeMs: this.#creationTimeMs,\n\t\t\tttlMin: this.#ttlMin,\n\t\t\tpersonalMessageSignature: this.#personalMessageSignature,\n\t\t\tsessionKey: this.#sessionKey.getSecretKey(), // bech32 encoded string\n\t\t};\n\n\t\tObject.defineProperty(obj, 'toJSON', {\n\t\t\tenumerable: false,\n\t\t\tvalue: () => {\n\t\t\t\tthrow new Error('This object is not serializable');\n\t\t\t},\n\t\t});\n\t\treturn obj;\n\t}\n\n\t/**\n\t * Restore a SessionKey instance for the given object.\n\t * @returns A new SessionKey instance with restored state\n\t */\n\tstatic import(\n\t\tdata: ExportedSessionKey,\n\t\tsuiClient: SealCompatibleClient,\n\t\tsigner?: Signer,\n\t): SessionKey {\n\t\tconst instance = new SessionKey({\n\t\t\taddress: data.address,\n\t\t\tpackageId: data.packageId,\n\t\t\tmvrName: data.mvrName,\n\t\t\tttlMin: data.ttlMin,\n\t\t\tsigner,\n\t\t\tsuiClient,\n\t\t});\n\n\t\tinstance.#creationTimeMs = data.creationTimeMs;\n\t\tinstance.#sessionKey = Ed25519Keypair.fromSecretKey(data.sessionKey);\n\t\tinstance.#personalMessageSignature = data.personalMessageSignature;\n\n\t\tif (instance.isExpired()) {\n\t\t\tthrow new ExpiredSessionKeyError();\n\t\t}\n\t\treturn instance;\n\t}\n}\n"],"mappings":"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"}