@bsv/wallet-toolbox 1.1.62 → 1.2.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 (185) hide show
  1. package/docs/client.md +2339 -182
  2. package/docs/wallet.md +2339 -182
  3. package/out/src/CWIStyleWalletManager.d.ts +417 -0
  4. package/out/src/CWIStyleWalletManager.d.ts.map +1 -0
  5. package/out/src/CWIStyleWalletManager.js +1153 -0
  6. package/out/src/CWIStyleWalletManager.js.map +1 -0
  7. package/out/src/SimpleWalletManager.d.ts +169 -0
  8. package/out/src/SimpleWalletManager.d.ts.map +1 -0
  9. package/out/src/SimpleWalletManager.js +315 -0
  10. package/out/src/SimpleWalletManager.js.map +1 -0
  11. package/out/src/Wallet.d.ts +6 -1
  12. package/out/src/Wallet.d.ts.map +1 -1
  13. package/out/src/Wallet.js +39 -7
  14. package/out/src/Wallet.js.map +1 -1
  15. package/out/src/WalletAuthenticationManager.d.ts +33 -0
  16. package/out/src/WalletAuthenticationManager.d.ts.map +1 -0
  17. package/out/src/WalletAuthenticationManager.js +110 -0
  18. package/out/src/WalletAuthenticationManager.js.map +1 -0
  19. package/out/src/WalletPermissionsManager.d.ts +575 -0
  20. package/out/src/WalletPermissionsManager.d.ts.map +1 -0
  21. package/out/src/WalletPermissionsManager.js +1789 -0
  22. package/out/src/WalletPermissionsManager.js.map +1 -0
  23. package/out/src/WalletSettingsManager.d.ts +59 -0
  24. package/out/src/WalletSettingsManager.d.ts.map +1 -0
  25. package/out/src/WalletSettingsManager.js +189 -0
  26. package/out/src/WalletSettingsManager.js.map +1 -0
  27. package/out/src/__tests/CWIStyleWalletManager.test.d.ts +2 -0
  28. package/out/src/__tests/CWIStyleWalletManager.test.d.ts.map +1 -0
  29. package/out/src/__tests/CWIStyleWalletManager.test.js +471 -0
  30. package/out/src/__tests/CWIStyleWalletManager.test.js.map +1 -0
  31. package/out/src/__tests/WalletPermissionsManager.callbacks.test.d.ts +2 -0
  32. package/out/src/__tests/WalletPermissionsManager.callbacks.test.d.ts.map +1 -0
  33. package/out/src/__tests/WalletPermissionsManager.callbacks.test.js +239 -0
  34. package/out/src/__tests/WalletPermissionsManager.callbacks.test.js.map +1 -0
  35. package/out/src/__tests/WalletPermissionsManager.checks.test.d.ts +2 -0
  36. package/out/src/__tests/WalletPermissionsManager.checks.test.d.ts.map +1 -0
  37. package/out/src/__tests/WalletPermissionsManager.checks.test.js +637 -0
  38. package/out/src/__tests/WalletPermissionsManager.checks.test.js.map +1 -0
  39. package/out/src/__tests/WalletPermissionsManager.encryption.test.d.ts +2 -0
  40. package/out/src/__tests/WalletPermissionsManager.encryption.test.d.ts.map +1 -0
  41. package/out/src/__tests/WalletPermissionsManager.encryption.test.js +295 -0
  42. package/out/src/__tests/WalletPermissionsManager.encryption.test.js.map +1 -0
  43. package/out/src/__tests/WalletPermissionsManager.fixtures.d.ts +83 -0
  44. package/out/src/__tests/WalletPermissionsManager.fixtures.d.ts.map +1 -0
  45. package/out/src/__tests/WalletPermissionsManager.fixtures.js +261 -0
  46. package/out/src/__tests/WalletPermissionsManager.fixtures.js.map +1 -0
  47. package/out/src/__tests/WalletPermissionsManager.flows.test.d.ts +2 -0
  48. package/out/src/__tests/WalletPermissionsManager.flows.test.d.ts.map +1 -0
  49. package/out/src/__tests/WalletPermissionsManager.flows.test.js +377 -0
  50. package/out/src/__tests/WalletPermissionsManager.flows.test.js.map +1 -0
  51. package/out/src/__tests/WalletPermissionsManager.initialization.test.d.ts +2 -0
  52. package/out/src/__tests/WalletPermissionsManager.initialization.test.d.ts.map +1 -0
  53. package/out/src/__tests/WalletPermissionsManager.initialization.test.js +227 -0
  54. package/out/src/__tests/WalletPermissionsManager.initialization.test.js.map +1 -0
  55. package/out/src/__tests/WalletPermissionsManager.proxying.test.d.ts +2 -0
  56. package/out/src/__tests/WalletPermissionsManager.proxying.test.d.ts.map +1 -0
  57. package/out/src/__tests/WalletPermissionsManager.proxying.test.js +566 -0
  58. package/out/src/__tests/WalletPermissionsManager.proxying.test.js.map +1 -0
  59. package/out/src/__tests/WalletPermissionsManager.tokens.test.d.ts +2 -0
  60. package/out/src/__tests/WalletPermissionsManager.tokens.test.d.ts.map +1 -0
  61. package/out/src/__tests/WalletPermissionsManager.tokens.test.js +454 -0
  62. package/out/src/__tests/WalletPermissionsManager.tokens.test.js.map +1 -0
  63. package/out/src/index.all.d.ts +9 -0
  64. package/out/src/index.all.d.ts.map +1 -1
  65. package/out/src/index.all.js +9 -0
  66. package/out/src/index.all.js.map +1 -1
  67. package/out/src/index.client.d.ts +9 -0
  68. package/out/src/index.client.d.ts.map +1 -1
  69. package/out/src/index.client.js +9 -0
  70. package/out/src/index.client.js.map +1 -1
  71. package/out/src/sdk/CertOpsWallet.d.ts +7 -0
  72. package/out/src/sdk/CertOpsWallet.d.ts.map +1 -0
  73. package/out/src/sdk/CertOpsWallet.js +3 -0
  74. package/out/src/sdk/CertOpsWallet.js.map +1 -0
  75. package/out/src/sdk/__test/CertificateLifeCycle.test.js +19 -82
  76. package/out/src/sdk/__test/CertificateLifeCycle.test.js.map +1 -1
  77. package/out/src/sdk/index.d.ts +1 -1
  78. package/out/src/sdk/index.d.ts.map +1 -1
  79. package/out/src/sdk/index.js +1 -1
  80. package/out/src/sdk/index.js.map +1 -1
  81. package/out/src/sdk/validationHelpers.d.ts.map +1 -1
  82. package/out/src/sdk/validationHelpers.js +13 -12
  83. package/out/src/sdk/validationHelpers.js.map +1 -1
  84. package/out/src/services/__tests/bitrails.test.js +7 -2
  85. package/out/src/services/__tests/bitrails.test.js.map +1 -1
  86. package/out/src/services/providers/__tests/WhatsOnChain.test.js +3 -3
  87. package/out/src/services/providers/__tests/WhatsOnChain.test.js.map +1 -1
  88. package/out/src/signer/methods/proveCertificate.d.ts.map +1 -1
  89. package/out/src/signer/methods/proveCertificate.js +3 -19
  90. package/out/src/signer/methods/proveCertificate.js.map +1 -1
  91. package/out/src/storage/__test/WalletStorageManager.test.js +1 -1
  92. package/out/src/storage/__test/WalletStorageManager.test.js.map +1 -1
  93. package/out/src/storage/remoting/StorageClient.d.ts +2 -2
  94. package/out/src/storage/remoting/StorageClient.d.ts.map +1 -1
  95. package/out/src/storage/remoting/StorageClient.js +1 -1
  96. package/out/src/storage/remoting/StorageClient.js.map +1 -1
  97. package/out/src/utility/identityUtils.d.ts +31 -0
  98. package/out/src/utility/identityUtils.d.ts.map +1 -0
  99. package/out/src/utility/identityUtils.js +116 -0
  100. package/out/src/utility/identityUtils.js.map +1 -0
  101. package/out/src/wab-client/WABClient.d.ts +49 -0
  102. package/out/src/wab-client/WABClient.d.ts.map +1 -0
  103. package/out/src/wab-client/WABClient.js +83 -0
  104. package/out/src/wab-client/WABClient.js.map +1 -0
  105. package/out/src/wab-client/__tests/WABClient.man.test.d.ts +2 -0
  106. package/out/src/wab-client/__tests/WABClient.man.test.d.ts.map +1 -0
  107. package/out/src/wab-client/__tests/WABClient.man.test.js +52 -0
  108. package/out/src/wab-client/__tests/WABClient.man.test.js.map +1 -0
  109. package/out/src/wab-client/auth-method-interactors/AuthMethodInteractor.d.ts +34 -0
  110. package/out/src/wab-client/auth-method-interactors/AuthMethodInteractor.d.ts.map +1 -0
  111. package/out/src/wab-client/auth-method-interactors/AuthMethodInteractor.js +16 -0
  112. package/out/src/wab-client/auth-method-interactors/AuthMethodInteractor.js.map +1 -0
  113. package/out/src/wab-client/auth-method-interactors/PersonaIDInteractor.d.ts +7 -0
  114. package/out/src/wab-client/auth-method-interactors/PersonaIDInteractor.d.ts.map +1 -0
  115. package/out/src/wab-client/auth-method-interactors/PersonaIDInteractor.js +36 -0
  116. package/out/src/wab-client/auth-method-interactors/PersonaIDInteractor.js.map +1 -0
  117. package/out/src/wab-client/auth-method-interactors/TwilioPhoneInteractor.d.ts +28 -0
  118. package/out/src/wab-client/auth-method-interactors/TwilioPhoneInteractor.d.ts.map +1 -0
  119. package/out/src/wab-client/auth-method-interactors/TwilioPhoneInteractor.js +69 -0
  120. package/out/src/wab-client/auth-method-interactors/TwilioPhoneInteractor.js.map +1 -0
  121. package/out/test/Wallet/action/internalizeAction.a.test.js +1 -1
  122. package/out/test/Wallet/action/internalizeAction.a.test.js.map +1 -1
  123. package/out/test/Wallet/certificate/acquireCertificate.test.js +26 -29
  124. package/out/test/Wallet/certificate/acquireCertificate.test.js.map +1 -1
  125. package/out/test/storage/KnexMigrations.test.js +1 -1
  126. package/out/test/storage/KnexMigrations.test.js.map +1 -1
  127. package/out/test/storage/update.test.js +1 -1
  128. package/out/test/storage/update.test.js.map +1 -1
  129. package/out/test/utils/TestUtilsWalletStorage.d.ts +9 -5
  130. package/out/test/utils/TestUtilsWalletStorage.d.ts.map +1 -1
  131. package/out/test/utils/TestUtilsWalletStorage.js +15 -9
  132. package/out/test/utils/TestUtilsWalletStorage.js.map +1 -1
  133. package/out/test/wallet/action/internalizeAction.test.js +1 -1
  134. package/out/test/wallet/action/internalizeAction.test.js.map +1 -1
  135. package/out/test/wallet/list/listActions2.test.js +1 -1
  136. package/out/test/wallet/list/listActions2.test.js.map +1 -1
  137. package/out/test/wallet/sync/Wallet.sync.test.js +1 -1
  138. package/out/test/wallet/sync/Wallet.sync.test.js.map +1 -1
  139. package/out/tsconfig.all.tsbuildinfo +1 -1
  140. package/package.json +3 -4
  141. package/src/CWIStyleWalletManager.ts +1738 -0
  142. package/src/SimpleWalletManager.ts +526 -0
  143. package/src/Wallet.ts +70 -7
  144. package/src/WalletAuthenticationManager.ts +150 -0
  145. package/src/WalletPermissionsManager.ts +2424 -0
  146. package/src/WalletSettingsManager.ts +243 -0
  147. package/src/__tests/CWIStyleWalletManager.test.ts +604 -0
  148. package/src/__tests/WalletPermissionsManager.callbacks.test.ts +323 -0
  149. package/src/__tests/WalletPermissionsManager.checks.test.ts +839 -0
  150. package/src/__tests/WalletPermissionsManager.encryption.test.ts +370 -0
  151. package/src/__tests/WalletPermissionsManager.fixtures.ts +284 -0
  152. package/src/__tests/WalletPermissionsManager.flows.test.ts +457 -0
  153. package/src/__tests/WalletPermissionsManager.initialization.test.ts +300 -0
  154. package/src/__tests/WalletPermissionsManager.proxying.test.ts +706 -0
  155. package/src/__tests/WalletPermissionsManager.tokens.test.ts +546 -0
  156. package/src/index.all.ts +9 -0
  157. package/src/index.client.ts +9 -0
  158. package/src/sdk/CertOpsWallet.ts +18 -0
  159. package/src/sdk/__test/CertificateLifeCycle.test.ts +66 -113
  160. package/src/sdk/index.ts +1 -1
  161. package/src/sdk/validationHelpers.ts +12 -11
  162. package/src/services/__tests/bitrails.test.ts +7 -2
  163. package/src/services/providers/__tests/WhatsOnChain.test.ts +3 -3
  164. package/src/signer/methods/proveCertificate.ts +14 -21
  165. package/src/storage/__test/WalletStorageManager.test.ts +1 -1
  166. package/src/storage/remoting/StorageClient.ts +4 -4
  167. package/src/utility/identityUtils.ts +159 -0
  168. package/src/wab-client/WABClient.ts +94 -0
  169. package/src/wab-client/__tests/WABClient.man.test.ts +59 -0
  170. package/src/wab-client/auth-method-interactors/AuthMethodInteractor.ts +47 -0
  171. package/src/wab-client/auth-method-interactors/PersonaIDInteractor.ts +35 -0
  172. package/src/wab-client/auth-method-interactors/TwilioPhoneInteractor.ts +72 -0
  173. package/test/Wallet/action/internalizeAction.a.test.ts +1 -1
  174. package/test/Wallet/certificate/acquireCertificate.test.ts +89 -30
  175. package/test/storage/KnexMigrations.test.ts +1 -1
  176. package/test/storage/update.test.ts +1 -1
  177. package/test/utils/TestUtilsWalletStorage.ts +24 -13
  178. package/test/wallet/action/internalizeAction.test.ts +1 -1
  179. package/test/wallet/list/listActions2.test.ts +1 -1
  180. package/test/wallet/sync/Wallet.sync.test.ts +1 -1
  181. package/out/src/sdk/CertOps.d.ts +0 -66
  182. package/out/src/sdk/CertOps.d.ts.map +0 -1
  183. package/out/src/sdk/CertOps.js +0 -190
  184. package/out/src/sdk/CertOps.js.map +0 -1
  185. package/src/sdk/CertOps.ts +0 -274
@@ -1,66 +0,0 @@
1
- import { Base64String, Certificate as BsvCertificate, CertificateFieldNameUnder50Bytes, GetPublicKeyArgs, GetPublicKeyResult, OriginatorDomainNameStringUnder250Bytes, PubKeyHex, WalletCertificate, WalletDecryptArgs, WalletDecryptResult, WalletEncryptArgs, WalletEncryptResult, WalletProtocol } from '@bsv/sdk';
2
- export interface CertOpsWallet {
3
- getPublicKey(args: GetPublicKeyArgs, originator?: OriginatorDomainNameStringUnder250Bytes): Promise<GetPublicKeyResult>;
4
- encrypt(args: WalletEncryptArgs, originator?: OriginatorDomainNameStringUnder250Bytes): Promise<WalletEncryptResult>;
5
- decrypt(args: WalletDecryptArgs, originator?: OriginatorDomainNameStringUnder250Bytes): Promise<WalletDecryptResult>;
6
- }
7
- export declare class CertOps extends BsvCertificate {
8
- wallet: CertOpsWallet;
9
- _keyring?: Record<CertificateFieldNameUnder50Bytes, string>;
10
- _encryptedFields?: Record<CertificateFieldNameUnder50Bytes, Base64String>;
11
- _decryptedFields?: Record<CertificateFieldNameUnder50Bytes, string>;
12
- constructor(wallet: CertOpsWallet, wc: WalletCertificate);
13
- static fromCounterparty(wallet: CertOpsWallet, e: {
14
- certificate: WalletCertificate;
15
- keyring: Record<CertificateFieldNameUnder50Bytes, string>;
16
- counterparty: PubKeyHex;
17
- }): Promise<CertOps>;
18
- static fromCertifier(wallet: CertOpsWallet, e: {
19
- certificate: WalletCertificate;
20
- keyring: Record<CertificateFieldNameUnder50Bytes, string>;
21
- }): Promise<CertOps>;
22
- static fromEncrypted(wallet: CertOpsWallet, wc: WalletCertificate, keyring: Record<CertificateFieldNameUnder50Bytes, string>): Promise<CertOps>;
23
- static fromDecrypted(wallet: CertOpsWallet, wc: WalletCertificate): Promise<CertOps>;
24
- static copyFields<T>(fields: Record<CertificateFieldNameUnder50Bytes, T>): Record<CertificateFieldNameUnder50Bytes, T>;
25
- static getProtocolForCertificateFieldEncryption(serialNumber: string, fieldName: string): {
26
- protocolID: WalletProtocol;
27
- keyID: string;
28
- };
29
- exportForSubject(): {
30
- certificate: WalletCertificate;
31
- keyring: Record<CertificateFieldNameUnder50Bytes, string>;
32
- };
33
- toWalletCertificate(): WalletCertificate;
34
- encryptFields(counterparty?: 'self' | PubKeyHex): Promise<{
35
- fields: Record<CertificateFieldNameUnder50Bytes, string>;
36
- keyring: Record<CertificateFieldNameUnder50Bytes, string>;
37
- }>;
38
- decryptFields(counterparty?: PubKeyHex, keyring?: Record<CertificateFieldNameUnder50Bytes, string>): Promise<Record<CertificateFieldNameUnder50Bytes, string>>;
39
- exportForCounterparty(
40
- /** The incoming counterparty is who they are to us. */
41
- counterparty: PubKeyHex, fieldsToReveal: CertificateFieldNameUnder50Bytes[]): Promise<{
42
- certificate: WalletCertificate;
43
- keyring: Record<CertificateFieldNameUnder50Bytes, string>;
44
- counterparty: PubKeyHex;
45
- }>;
46
- /**
47
- * Creates a verifiable certificate structure for a specific verifier, allowing them access to specified fields.
48
- * This method decrypts the master field keys for each field specified in `fieldsToReveal` and re-encrypts them
49
- * for the verifier's identity key. The resulting certificate structure includes only the fields intended to be
50
- * revealed and a verifier-specific keyring for field decryption.
51
- *
52
- * @param {PubKeyHex} verifierIdentityKey - The public identity key of the verifier who will receive access to the specified fields.
53
- * @param {CertificateFieldNameUnder50Bytes[]} fieldsToReveal - An array of field names to be revealed to the verifier. Must be a subset of the certificate's fields.
54
- * @returns {Promise<Record<CertificateFieldNameUnder50Bytes[], Base64String>} - A new certificate structure containing the original encrypted fields, the verifier-specific field decryption keyring, and essential certificate metadata.
55
- * @throws {WERR_INVALID_PARAMETER} Throws an error if:
56
- * - fieldsToReveal is empty or a field in `fieldsToReveal` does not exist in the certificate.
57
- * - The decrypted master field key fails to decrypt the corresponding field (indicating an invalid key).
58
- */
59
- createKeyringForVerifier(verifierIdentityKey: PubKeyHex, fieldsToReveal: CertificateFieldNameUnder50Bytes[]): Promise<Record<CertificateFieldNameUnder50Bytes, Base64String>>;
60
- /**
61
- * encrypt plaintext field values for the subject
62
- * update the signature using the certifier's private key.
63
- */
64
- encryptAndSignNewCertificate(): Promise<void>;
65
- }
66
- //# sourceMappingURL=CertOps.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CertOps.d.ts","sourceRoot":"","sources":["../../../src/sdk/CertOps.ts"],"names":[],"mappings":"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"}
@@ -1,190 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CertOps = void 0;
4
- const sdk_1 = require("@bsv/sdk");
5
- const index_client_1 = require("../index.client");
6
- const sdk_2 = require("@bsv/sdk");
7
- const WERR_errors_1 = require("./WERR_errors");
8
- class CertOps extends sdk_1.Certificate {
9
- constructor(wallet, wc) {
10
- super(wc.type, wc.serialNumber, wc.subject, wc.certifier, wc.revocationOutpoint, wc.fields, wc.signature);
11
- this.wallet = wallet;
12
- }
13
- static async fromCounterparty(wallet, e) {
14
- const c = new CertOps(wallet, e.certificate);
15
- // confirm cert verifies and decrypts.
16
- await c.verify();
17
- await c.decryptFields(e.counterparty, e.keyring);
18
- // un-decrypt
19
- c.fields = c._encryptedFields;
20
- return c;
21
- }
22
- static async fromCertifier(wallet, e) {
23
- return await CertOps.fromCounterparty(wallet, {
24
- counterparty: e.certificate.certifier,
25
- ...e
26
- });
27
- }
28
- static async fromEncrypted(wallet, wc, keyring) {
29
- const c = new CertOps(wallet, wc);
30
- c._keyring = keyring;
31
- c._encryptedFields = this.copyFields(c.fields);
32
- c._decryptedFields = await c.decryptFields();
33
- await c.verify();
34
- return c;
35
- }
36
- static async fromDecrypted(wallet, wc) {
37
- const c = new CertOps(wallet, wc);
38
- ({ fields: c._encryptedFields, keyring: c._keyring } = await c.encryptFields());
39
- c._decryptedFields = await c.decryptFields();
40
- return c;
41
- }
42
- static copyFields(fields) {
43
- const copy = {};
44
- for (const [n, v] of Object.entries(fields))
45
- copy[n] = v;
46
- return copy;
47
- }
48
- static getProtocolForCertificateFieldEncryption(serialNumber, fieldName) {
49
- return {
50
- protocolID: [2, 'certificate field encryption'],
51
- keyID: `${serialNumber} ${fieldName}`
52
- };
53
- }
54
- exportForSubject() {
55
- if (!this._keyring || !this._encryptedFields || !this.signature || this.signature.length === 0)
56
- throw new WERR_errors_1.WERR_INVALID_OPERATION(`Certificate must be encrypted and signed prior to export.`);
57
- const certificate = this.toWalletCertificate();
58
- const keyring = this._keyring;
59
- return { certificate, keyring };
60
- }
61
- toWalletCertificate() {
62
- const wc = {
63
- signature: '',
64
- ...this
65
- };
66
- return wc;
67
- }
68
- async encryptFields(counterparty = 'self') {
69
- const fields = this._decryptedFields || this.fields;
70
- const encryptedFields = {};
71
- const keyring = {};
72
- for (const fieldName of Object.keys(fields)) {
73
- const fieldSymmetricKey = sdk_2.SymmetricKey.fromRandom();
74
- const encryptedFieldValue = fieldSymmetricKey.encrypt(sdk_2.Utils.toArray(this.fields[fieldName], 'utf8'));
75
- encryptedFields[fieldName] = sdk_2.Utils.toBase64(encryptedFieldValue);
76
- const encryptedFieldKey = await this.wallet.encrypt({
77
- plaintext: fieldSymmetricKey.toArray(),
78
- counterparty,
79
- ...CertOps.getProtocolForCertificateFieldEncryption(this.serialNumber, fieldName)
80
- });
81
- keyring[fieldName] = sdk_2.Utils.toBase64(encryptedFieldKey.ciphertext);
82
- }
83
- this._keyring = keyring;
84
- this._decryptedFields = fields;
85
- this.fields = this._encryptedFields = encryptedFields;
86
- return { fields: encryptedFields, keyring };
87
- }
88
- async decryptFields(counterparty, keyring) {
89
- keyring || (keyring = this._keyring);
90
- const fields = this._encryptedFields || this.fields;
91
- const decryptedFields = {};
92
- if (!keyring)
93
- throw new index_client_1.sdk.WERR_INVALID_PARAMETER('keyring', 'valid');
94
- try {
95
- for (const fieldName of Object.keys(keyring)) {
96
- const { plaintext: fieldRevelationKey } = await this.wallet.decrypt({
97
- ciphertext: sdk_2.Utils.toArray(keyring[fieldName], 'base64'),
98
- counterparty: counterparty || this.subject,
99
- ...CertOps.getProtocolForCertificateFieldEncryption(this.serialNumber, fieldName)
100
- });
101
- const fieldValue = new sdk_2.SymmetricKey(fieldRevelationKey).decrypt(sdk_2.Utils.toArray(fields[fieldName], 'base64'));
102
- decryptedFields[fieldName] = sdk_2.Utils.toUTF8(fieldValue);
103
- }
104
- this._keyring = keyring;
105
- this._encryptedFields = fields;
106
- this.fields = this._decryptedFields = decryptedFields;
107
- return decryptedFields;
108
- }
109
- catch (eu) {
110
- const e = index_client_1.sdk.WalletError.fromUnknown(eu);
111
- throw e;
112
- }
113
- }
114
- async exportForCounterparty(
115
- /** The incoming counterparty is who they are to us. */
116
- counterparty, fieldsToReveal) {
117
- if (!this._keyring || !this._encryptedFields || !this.signature || this.signature.length === 0)
118
- throw new WERR_errors_1.WERR_INVALID_OPERATION(`Certificate must be encrypted and signed prior to export.`);
119
- const certificate = this.toWalletCertificate();
120
- const keyring = await this.createKeyringForVerifier(counterparty, fieldsToReveal);
121
- // The exported counterparty is who we are to them...
122
- return {
123
- certificate,
124
- keyring,
125
- counterparty: await (0, index_client_1.getIdentityKey)(this.wallet)
126
- };
127
- }
128
- /**
129
- * Creates a verifiable certificate structure for a specific verifier, allowing them access to specified fields.
130
- * This method decrypts the master field keys for each field specified in `fieldsToReveal` and re-encrypts them
131
- * for the verifier's identity key. The resulting certificate structure includes only the fields intended to be
132
- * revealed and a verifier-specific keyring for field decryption.
133
- *
134
- * @param {PubKeyHex} verifierIdentityKey - The public identity key of the verifier who will receive access to the specified fields.
135
- * @param {CertificateFieldNameUnder50Bytes[]} fieldsToReveal - An array of field names to be revealed to the verifier. Must be a subset of the certificate's fields.
136
- * @returns {Promise<Record<CertificateFieldNameUnder50Bytes[], Base64String>} - A new certificate structure containing the original encrypted fields, the verifier-specific field decryption keyring, and essential certificate metadata.
137
- * @throws {WERR_INVALID_PARAMETER} Throws an error if:
138
- * - fieldsToReveal is empty or a field in `fieldsToReveal` does not exist in the certificate.
139
- * - The decrypted master field key fails to decrypt the corresponding field (indicating an invalid key).
140
- */
141
- async createKeyringForVerifier(verifierIdentityKey, fieldsToReveal) {
142
- if (!this._keyring || !this._encryptedFields)
143
- throw new index_client_1.sdk.WERR_INVALID_OPERATION(`certificate must be encrypted`);
144
- if (!Array.isArray(fieldsToReveal) || fieldsToReveal.some(n => this._encryptedFields[n] === undefined))
145
- throw new index_client_1.sdk.WERR_INVALID_PARAMETER('fieldsToReveal', `an array of certificate field names`);
146
- const fieldRevelationKeyring = {};
147
- for (const fieldName of fieldsToReveal) {
148
- // Create a keyID
149
- const encryptedFieldKey = this._keyring[fieldName];
150
- const protocol = CertOps.getProtocolForCertificateFieldEncryption(this.serialNumber, fieldName);
151
- // Decrypt the master field key
152
- const { plaintext: fieldKey } = await this.wallet.decrypt({
153
- ciphertext: sdk_2.Utils.toArray(encryptedFieldKey, 'base64'),
154
- counterparty: this.certifier,
155
- ...protocol
156
- });
157
- // Verify that derived key actually decrypts requested field
158
- try {
159
- new sdk_2.SymmetricKey(fieldKey).decrypt(sdk_2.Utils.toArray(this.fields[fieldName], 'base64'));
160
- }
161
- catch (_) {
162
- throw new index_client_1.sdk.WERR_INTERNAL(`unable to decrypt field "${fieldName}" using derived field key.`);
163
- }
164
- // Encrypt derived fieldRevelationKey for verifier
165
- const { ciphertext: encryptedFieldRevelationKey } = await this.wallet.encrypt({
166
- plaintext: fieldKey,
167
- counterparty: verifierIdentityKey,
168
- ...protocol
169
- });
170
- // Add encryptedFieldRevelationKey to fieldRevelationKeyring
171
- fieldRevelationKeyring[fieldName] = sdk_2.Utils.toBase64(encryptedFieldRevelationKey);
172
- }
173
- // Return the field revelation keyring which can be used to create a verifiable certificate for a verifier.
174
- return fieldRevelationKeyring;
175
- }
176
- /**
177
- * encrypt plaintext field values for the subject
178
- * update the signature using the certifier's private key.
179
- */
180
- async encryptAndSignNewCertificate() {
181
- if ((await (0, index_client_1.getIdentityKey)(this.wallet)) !== this.certifier)
182
- throw new index_client_1.sdk.WERR_INVALID_PARAMETER('wallet', 'the certifier for new certificate issuance.');
183
- await this.encryptFields(this.subject);
184
- await this.sign(this.wallet);
185
- // Confirm the signed certificate verifies:
186
- await this.verify();
187
- }
188
- }
189
- exports.CertOps = CertOps;
190
- //# sourceMappingURL=CertOps.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CertOps.js","sourceRoot":"","sources":["../../../src/sdk/CertOps.ts"],"names":[],"mappings":";;;AAAA,kCAeiB;AACjB,kDAAqD;AACrD,kCAA8C;AAC9C,+CAAsD;AAWtD,MAAa,OAAQ,SAAQ,iBAAc;IAKzC,YACS,MAAqB,EAC5B,EAAqB;QAErB,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,kBAAkB,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,CAAC,CAAA;QAHlG,WAAM,GAAN,MAAM,CAAe;IAI9B,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAC3B,MAAqB,EACrB,CAIC;QAED,MAAM,CAAC,GAAG,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,WAAW,CAAC,CAAA;QAC5C,sCAAsC;QACtC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAA;QAChB,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC,CAAA;QAChD,aAAa;QACb,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,gBAAiB,CAAA;QAC9B,OAAO,CAAC,CAAA;IACV,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,aAAa,CACxB,MAAqB,EACrB,CAGC;QAED,OAAO,MAAM,OAAO,CAAC,gBAAgB,CAAC,MAAM,EAAE;YAC5C,YAAY,EAAE,CAAC,CAAC,WAAW,CAAC,SAAS;YACrC,GAAG,CAAC;SACL,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,aAAa,CACxB,MAAqB,EACrB,EAAqB,EACrB,OAAyD;QAEzD,MAAM,CAAC,GAAG,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;QACjC,CAAC,CAAC,QAAQ,GAAG,OAAO,CAAA;QACpB,CAAC,CAAC,gBAAgB,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;QAC9C,CAAC,CAAC,gBAAgB,GAAG,MAAM,CAAC,CAAC,aAAa,EAAE,CAAA;QAC5C,MAAM,CAAC,CAAC,MAAM,EAAE,CAAA;QAChB,OAAO,CAAC,CAAA;IACV,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,MAAqB,EAAE,EAAqB;QACrE,MAAM,CAAC,GAAG,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAChC;QAAA,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,gBAAgB,EAAE,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,GAAG,MAAM,CAAC,CAAC,aAAa,EAAE,CAAC,CAAA;QAChF,CAAC,CAAC,gBAAgB,GAAG,MAAM,CAAC,CAAC,aAAa,EAAE,CAAA;QAC5C,OAAO,CAAC,CAAA;IACV,CAAC;IAED,MAAM,CAAC,UAAU,CACf,MAAmD;QAEnD,MAAM,IAAI,GAAgD,EAAE,CAAA;QAC5D,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QACxD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,CAAC,wCAAwC,CAC7C,YAAoB,EACpB,SAAiB;QAEjB,OAAO;YACL,UAAU,EAAE,CAAC,CAAC,EAAE,8BAA8B,CAAC;YAC/C,KAAK,EAAE,GAAG,YAAY,IAAI,SAAS,EAAE;SACtC,CAAA;IACH,CAAC;IAED,gBAAgB;QAId,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;YAC5F,MAAM,IAAI,oCAAsB,CAAC,2DAA2D,CAAC,CAAA;QAC/F,MAAM,WAAW,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAA;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAS,CAAA;QAC9B,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,CAAA;IACjC,CAAC;IAED,mBAAmB;QACjB,MAAM,EAAE,GAAsB;YAC5B,SAAS,EAAE,EAAE;YACb,GAAG,IAAI;SACR,CAAA;QACD,OAAO,EAAE,CAAA;IACX,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,eAAmC,MAAM;QAI3D,MAAM,MAAM,GAAqD,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,MAAM,CAAA;QACrG,MAAM,eAAe,GAA2D,EAAE,CAAA;QAClF,MAAM,OAAO,GAA2D,EAAE,CAAA;QAE1E,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5C,MAAM,iBAAiB,GAAG,kBAAY,CAAC,UAAU,EAAE,CAAA;YACnD,MAAM,mBAAmB,GAAG,iBAAiB,CAAC,OAAO,CAAC,WAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,CAAC,CAAA;YACpG,eAAe,CAAC,SAAS,CAAC,GAAG,WAAK,CAAC,QAAQ,CAAC,mBAA+B,CAAC,CAAA;YAE5E,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;gBAClD,SAAS,EAAE,iBAAiB,CAAC,OAAO,EAAE;gBACtC,YAAY;gBACZ,GAAG,OAAO,CAAC,wCAAwC,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC;aAClF,CAAC,CAAA;YACF,OAAO,CAAC,SAAS,CAAC,GAAG,WAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAA;QACnE,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAA;QACvB,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAA;QAC9B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,gBAAgB,GAAG,eAAe,CAAA;QACrD,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,CAAA;IAC7C,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,YAAwB,EACxB,OAA0D;QAE1D,OAAO,KAAP,OAAO,GAAK,IAAI,CAAC,QAAQ,EAAA;QACzB,MAAM,MAAM,GAA2D,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,MAAM,CAAA;QAC3G,MAAM,eAAe,GAAqD,EAAE,CAAA;QAC5E,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,kBAAG,CAAC,sBAAsB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;QAEtE,IAAI,CAAC;YACH,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC7C,MAAM,EAAE,SAAS,EAAE,kBAAkB,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;oBAClE,UAAU,EAAE,WAAK,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC;oBACvD,YAAY,EAAE,YAAY,IAAI,IAAI,CAAC,OAAO;oBAC1C,GAAG,OAAO,CAAC,wCAAwC,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC;iBAClF,CAAC,CAAA;gBAEF,MAAM,UAAU,GAAG,IAAI,kBAAY,CAAC,kBAAkB,CAAC,CAAC,OAAO,CAAC,WAAK,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAA;gBAC3G,eAAe,CAAC,SAAS,CAAC,GAAG,WAAK,CAAC,MAAM,CAAC,UAAsB,CAAC,CAAA;YACnE,CAAC;YACD,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAA;YACvB,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAA;YAC9B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,gBAAgB,GAAG,eAAe,CAAA;YACrD,OAAO,eAAe,CAAA;QACxB,CAAC;QAAC,OAAO,EAAW,EAAE,CAAC;YACrB,MAAM,CAAC,GAAG,kBAAG,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;YACzC,MAAM,CAAC,CAAA;QACT,CAAC;IACH,CAAC;IAED,KAAK,CAAC,qBAAqB;IACzB,uDAAuD;IACvD,YAAuB,EACvB,cAAkD;QAMlD,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;YAC5F,MAAM,IAAI,oCAAsB,CAAC,2DAA2D,CAAC,CAAA;QAC/F,MAAM,WAAW,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAA;QAC9C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,wBAAwB,CAAC,YAAY,EAAE,cAAc,CAAC,CAAA;QACjF,qDAAqD;QACrD,OAAO;YACL,WAAW;YACX,OAAO;YACP,YAAY,EAAE,MAAM,IAAA,6BAAc,EAAC,IAAI,CAAC,MAAM,CAAC;SAChD,CAAA;IACH,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,wBAAwB,CAC5B,mBAA8B,EAC9B,cAAkD;QAElD,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,gBAAgB;YAAE,MAAM,IAAI,kBAAG,CAAC,sBAAsB,CAAC,+BAA+B,CAAC,CAAA;QACnH,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,gBAAiB,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC;YACrG,MAAM,IAAI,kBAAG,CAAC,sBAAsB,CAAC,gBAAgB,EAAE,qCAAqC,CAAC,CAAA;QAC/F,MAAM,sBAAsB,GAAG,EAAE,CAAA;QACjC,KAAK,MAAM,SAAS,IAAI,cAAc,EAAE,CAAC;YACvC,iBAAiB;YACjB,MAAM,iBAAiB,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;YAClD,MAAM,QAAQ,GAAG,OAAO,CAAC,wCAAwC,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAA;YAE/F,+BAA+B;YAC/B,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;gBACxD,UAAU,EAAE,WAAK,CAAC,OAAO,CAAC,iBAAiB,EAAE,QAAQ,CAAC;gBACtD,YAAY,EAAE,IAAI,CAAC,SAAS;gBAC5B,GAAG,QAAQ;aACZ,CAAC,CAAA;YAEF,4DAA4D;YAC5D,IAAI,CAAC;gBACH,IAAI,kBAAY,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,WAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAA;YACrF,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,IAAI,kBAAG,CAAC,aAAa,CAAC,4BAA4B,SAAS,4BAA4B,CAAC,CAAA;YAChG,CAAC;YAED,kDAAkD;YAClD,MAAM,EAAE,UAAU,EAAE,2BAA2B,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;gBAC5E,SAAS,EAAE,QAAQ;gBACnB,YAAY,EAAE,mBAAmB;gBACjC,GAAG,QAAQ;aACZ,CAAC,CAAA;YAEF,4DAA4D;YAC5D,sBAAsB,CAAC,SAAS,CAAC,GAAG,WAAK,CAAC,QAAQ,CAAC,2BAA2B,CAAC,CAAA;QACjF,CAAC;QAED,2GAA2G;QAC3G,OAAO,sBAAsB,CAAA;IAC/B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,4BAA4B;QAChC,IAAI,CAAC,MAAM,IAAA,6BAAc,EAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS;YACxD,MAAM,IAAI,kBAAG,CAAC,sBAAsB,CAAC,QAAQ,EAAE,6CAA6C,CAAC,CAAA;QAE/F,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACtC,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAoC,CAAC,CAAA;QAC1D,2CAA2C;QAC3C,MAAM,IAAI,CAAC,MAAM,EAAE,CAAA;IACrB,CAAC;CACF;AApPD,0BAoPC"}
@@ -1,274 +0,0 @@
1
- import {
2
- Base64String,
3
- Certificate as BsvCertificate,
4
- CertificateFieldNameUnder50Bytes,
5
- GetPublicKeyArgs,
6
- GetPublicKeyResult,
7
- OriginatorDomainNameStringUnder250Bytes,
8
- PubKeyHex,
9
- WalletCertificate,
10
- WalletDecryptArgs,
11
- WalletDecryptResult,
12
- WalletEncryptArgs,
13
- WalletEncryptResult,
14
- WalletInterface,
15
- WalletProtocol
16
- } from '@bsv/sdk'
17
- import { getIdentityKey, sdk } from '../index.client'
18
- import { SymmetricKey, Utils } from '@bsv/sdk'
19
- import { WERR_INVALID_OPERATION } from './WERR_errors'
20
-
21
- export interface CertOpsWallet {
22
- getPublicKey(
23
- args: GetPublicKeyArgs,
24
- originator?: OriginatorDomainNameStringUnder250Bytes
25
- ): Promise<GetPublicKeyResult>
26
- encrypt(args: WalletEncryptArgs, originator?: OriginatorDomainNameStringUnder250Bytes): Promise<WalletEncryptResult>
27
- decrypt(args: WalletDecryptArgs, originator?: OriginatorDomainNameStringUnder250Bytes): Promise<WalletDecryptResult>
28
- }
29
-
30
- export class CertOps extends BsvCertificate {
31
- _keyring?: Record<CertificateFieldNameUnder50Bytes, string>
32
- _encryptedFields?: Record<CertificateFieldNameUnder50Bytes, Base64String>
33
- _decryptedFields?: Record<CertificateFieldNameUnder50Bytes, string>
34
-
35
- constructor(
36
- public wallet: CertOpsWallet,
37
- wc: WalletCertificate
38
- ) {
39
- super(wc.type, wc.serialNumber, wc.subject, wc.certifier, wc.revocationOutpoint, wc.fields, wc.signature)
40
- }
41
-
42
- static async fromCounterparty(
43
- wallet: CertOpsWallet,
44
- e: {
45
- certificate: WalletCertificate
46
- keyring: Record<CertificateFieldNameUnder50Bytes, string>
47
- counterparty: PubKeyHex
48
- }
49
- ): Promise<CertOps> {
50
- const c = new CertOps(wallet, e.certificate)
51
- // confirm cert verifies and decrypts.
52
- await c.verify()
53
- await c.decryptFields(e.counterparty, e.keyring)
54
- // un-decrypt
55
- c.fields = c._encryptedFields!
56
- return c
57
- }
58
-
59
- static async fromCertifier(
60
- wallet: CertOpsWallet,
61
- e: {
62
- certificate: WalletCertificate
63
- keyring: Record<CertificateFieldNameUnder50Bytes, string>
64
- }
65
- ): Promise<CertOps> {
66
- return await CertOps.fromCounterparty(wallet, {
67
- counterparty: e.certificate.certifier,
68
- ...e
69
- })
70
- }
71
-
72
- static async fromEncrypted(
73
- wallet: CertOpsWallet,
74
- wc: WalletCertificate,
75
- keyring: Record<CertificateFieldNameUnder50Bytes, string>
76
- ): Promise<CertOps> {
77
- const c = new CertOps(wallet, wc)
78
- c._keyring = keyring
79
- c._encryptedFields = this.copyFields(c.fields)
80
- c._decryptedFields = await c.decryptFields()
81
- await c.verify()
82
- return c
83
- }
84
-
85
- static async fromDecrypted(wallet: CertOpsWallet, wc: WalletCertificate): Promise<CertOps> {
86
- const c = new CertOps(wallet, wc)
87
- ;({ fields: c._encryptedFields, keyring: c._keyring } = await c.encryptFields())
88
- c._decryptedFields = await c.decryptFields()
89
- return c
90
- }
91
-
92
- static copyFields<T>(
93
- fields: Record<CertificateFieldNameUnder50Bytes, T>
94
- ): Record<CertificateFieldNameUnder50Bytes, T> {
95
- const copy: Record<CertificateFieldNameUnder50Bytes, T> = {}
96
- for (const [n, v] of Object.entries(fields)) copy[n] = v
97
- return copy
98
- }
99
-
100
- static getProtocolForCertificateFieldEncryption(
101
- serialNumber: string,
102
- fieldName: string
103
- ): { protocolID: WalletProtocol; keyID: string } {
104
- return {
105
- protocolID: [2, 'certificate field encryption'],
106
- keyID: `${serialNumber} ${fieldName}`
107
- }
108
- }
109
-
110
- exportForSubject(): {
111
- certificate: WalletCertificate
112
- keyring: Record<CertificateFieldNameUnder50Bytes, string>
113
- } {
114
- if (!this._keyring || !this._encryptedFields || !this.signature || this.signature.length === 0)
115
- throw new WERR_INVALID_OPERATION(`Certificate must be encrypted and signed prior to export.`)
116
- const certificate = this.toWalletCertificate()
117
- const keyring = this._keyring!
118
- return { certificate, keyring }
119
- }
120
-
121
- toWalletCertificate(): WalletCertificate {
122
- const wc: WalletCertificate = {
123
- signature: '',
124
- ...this
125
- }
126
- return wc
127
- }
128
-
129
- async encryptFields(counterparty: 'self' | PubKeyHex = 'self'): Promise<{
130
- fields: Record<CertificateFieldNameUnder50Bytes, string>
131
- keyring: Record<CertificateFieldNameUnder50Bytes, string>
132
- }> {
133
- const fields: Record<CertificateFieldNameUnder50Bytes, string> = this._decryptedFields || this.fields
134
- const encryptedFields: Record<CertificateFieldNameUnder50Bytes, Base64String> = {}
135
- const keyring: Record<CertificateFieldNameUnder50Bytes, Base64String> = {}
136
-
137
- for (const fieldName of Object.keys(fields)) {
138
- const fieldSymmetricKey = SymmetricKey.fromRandom()
139
- const encryptedFieldValue = fieldSymmetricKey.encrypt(Utils.toArray(this.fields[fieldName], 'utf8'))
140
- encryptedFields[fieldName] = Utils.toBase64(encryptedFieldValue as number[])
141
-
142
- const encryptedFieldKey = await this.wallet.encrypt({
143
- plaintext: fieldSymmetricKey.toArray(),
144
- counterparty,
145
- ...CertOps.getProtocolForCertificateFieldEncryption(this.serialNumber, fieldName)
146
- })
147
- keyring[fieldName] = Utils.toBase64(encryptedFieldKey.ciphertext)
148
- }
149
- this._keyring = keyring
150
- this._decryptedFields = fields
151
- this.fields = this._encryptedFields = encryptedFields
152
- return { fields: encryptedFields, keyring }
153
- }
154
-
155
- async decryptFields(
156
- counterparty?: PubKeyHex,
157
- keyring?: Record<CertificateFieldNameUnder50Bytes, string>
158
- ): Promise<Record<CertificateFieldNameUnder50Bytes, string>> {
159
- keyring ||= this._keyring
160
- const fields: Record<CertificateFieldNameUnder50Bytes, Base64String> = this._encryptedFields || this.fields
161
- const decryptedFields: Record<CertificateFieldNameUnder50Bytes, string> = {}
162
- if (!keyring) throw new sdk.WERR_INVALID_PARAMETER('keyring', 'valid')
163
-
164
- try {
165
- for (const fieldName of Object.keys(keyring)) {
166
- const { plaintext: fieldRevelationKey } = await this.wallet.decrypt({
167
- ciphertext: Utils.toArray(keyring[fieldName], 'base64'),
168
- counterparty: counterparty || this.subject,
169
- ...CertOps.getProtocolForCertificateFieldEncryption(this.serialNumber, fieldName)
170
- })
171
-
172
- const fieldValue = new SymmetricKey(fieldRevelationKey).decrypt(Utils.toArray(fields[fieldName], 'base64'))
173
- decryptedFields[fieldName] = Utils.toUTF8(fieldValue as number[])
174
- }
175
- this._keyring = keyring
176
- this._encryptedFields = fields
177
- this.fields = this._decryptedFields = decryptedFields
178
- return decryptedFields
179
- } catch (eu: unknown) {
180
- const e = sdk.WalletError.fromUnknown(eu)
181
- throw e
182
- }
183
- }
184
-
185
- async exportForCounterparty(
186
- /** The incoming counterparty is who they are to us. */
187
- counterparty: PubKeyHex,
188
- fieldsToReveal: CertificateFieldNameUnder50Bytes[]
189
- ): Promise<{
190
- certificate: WalletCertificate
191
- keyring: Record<CertificateFieldNameUnder50Bytes, string>
192
- counterparty: PubKeyHex
193
- }> {
194
- if (!this._keyring || !this._encryptedFields || !this.signature || this.signature.length === 0)
195
- throw new WERR_INVALID_OPERATION(`Certificate must be encrypted and signed prior to export.`)
196
- const certificate = this.toWalletCertificate()
197
- const keyring = await this.createKeyringForVerifier(counterparty, fieldsToReveal)
198
- // The exported counterparty is who we are to them...
199
- return {
200
- certificate,
201
- keyring,
202
- counterparty: await getIdentityKey(this.wallet)
203
- }
204
- }
205
-
206
- /**
207
- * Creates a verifiable certificate structure for a specific verifier, allowing them access to specified fields.
208
- * This method decrypts the master field keys for each field specified in `fieldsToReveal` and re-encrypts them
209
- * for the verifier's identity key. The resulting certificate structure includes only the fields intended to be
210
- * revealed and a verifier-specific keyring for field decryption.
211
- *
212
- * @param {PubKeyHex} verifierIdentityKey - The public identity key of the verifier who will receive access to the specified fields.
213
- * @param {CertificateFieldNameUnder50Bytes[]} fieldsToReveal - An array of field names to be revealed to the verifier. Must be a subset of the certificate's fields.
214
- * @returns {Promise<Record<CertificateFieldNameUnder50Bytes[], Base64String>} - A new certificate structure containing the original encrypted fields, the verifier-specific field decryption keyring, and essential certificate metadata.
215
- * @throws {WERR_INVALID_PARAMETER} Throws an error if:
216
- * - fieldsToReveal is empty or a field in `fieldsToReveal` does not exist in the certificate.
217
- * - The decrypted master field key fails to decrypt the corresponding field (indicating an invalid key).
218
- */
219
- async createKeyringForVerifier(
220
- verifierIdentityKey: PubKeyHex,
221
- fieldsToReveal: CertificateFieldNameUnder50Bytes[]
222
- ): Promise<Record<CertificateFieldNameUnder50Bytes, Base64String>> {
223
- if (!this._keyring || !this._encryptedFields) throw new sdk.WERR_INVALID_OPERATION(`certificate must be encrypted`)
224
- if (!Array.isArray(fieldsToReveal) || fieldsToReveal.some(n => this._encryptedFields![n] === undefined))
225
- throw new sdk.WERR_INVALID_PARAMETER('fieldsToReveal', `an array of certificate field names`)
226
- const fieldRevelationKeyring = {}
227
- for (const fieldName of fieldsToReveal) {
228
- // Create a keyID
229
- const encryptedFieldKey = this._keyring[fieldName]
230
- const protocol = CertOps.getProtocolForCertificateFieldEncryption(this.serialNumber, fieldName)
231
-
232
- // Decrypt the master field key
233
- const { plaintext: fieldKey } = await this.wallet.decrypt({
234
- ciphertext: Utils.toArray(encryptedFieldKey, 'base64'),
235
- counterparty: this.certifier,
236
- ...protocol
237
- })
238
-
239
- // Verify that derived key actually decrypts requested field
240
- try {
241
- new SymmetricKey(fieldKey).decrypt(Utils.toArray(this.fields[fieldName], 'base64'))
242
- } catch (_) {
243
- throw new sdk.WERR_INTERNAL(`unable to decrypt field "${fieldName}" using derived field key.`)
244
- }
245
-
246
- // Encrypt derived fieldRevelationKey for verifier
247
- const { ciphertext: encryptedFieldRevelationKey } = await this.wallet.encrypt({
248
- plaintext: fieldKey,
249
- counterparty: verifierIdentityKey,
250
- ...protocol
251
- })
252
-
253
- // Add encryptedFieldRevelationKey to fieldRevelationKeyring
254
- fieldRevelationKeyring[fieldName] = Utils.toBase64(encryptedFieldRevelationKey)
255
- }
256
-
257
- // Return the field revelation keyring which can be used to create a verifiable certificate for a verifier.
258
- return fieldRevelationKeyring
259
- }
260
-
261
- /**
262
- * encrypt plaintext field values for the subject
263
- * update the signature using the certifier's private key.
264
- */
265
- async encryptAndSignNewCertificate(): Promise<void> {
266
- if ((await getIdentityKey(this.wallet)) !== this.certifier)
267
- throw new sdk.WERR_INVALID_PARAMETER('wallet', 'the certifier for new certificate issuance.')
268
-
269
- await this.encryptFields(this.subject)
270
- await this.sign(this.wallet as unknown as WalletInterface)
271
- // Confirm the signed certificate verifies:
272
- await this.verify()
273
- }
274
- }