@enbox/agent 0.1.3 → 0.1.4
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.
- package/dist/browser.mjs +45 -52
- package/dist/browser.mjs.map +4 -4
- package/dist/esm/crypto-api.js +6 -13
- package/dist/esm/crypto-api.js.map +1 -1
- package/dist/esm/dwn-api.js +80 -78
- package/dist/esm/dwn-api.js.map +1 -1
- package/dist/esm/hd-identity-vault.js +4 -5
- package/dist/esm/hd-identity-vault.js.map +1 -1
- package/dist/esm/identity-api.js +1 -1
- package/dist/esm/identity-api.js.map +1 -1
- package/dist/esm/index.js +0 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/local-key-manager.js +31 -32
- package/dist/esm/local-key-manager.js.map +1 -1
- package/dist/esm/prototyping/crypto/jose/jwe-compact.js +1 -2
- package/dist/esm/prototyping/crypto/jose/jwe-compact.js.map +1 -1
- package/dist/esm/prototyping/crypto/jose/jwe-flattened.js +15 -4
- package/dist/esm/prototyping/crypto/jose/jwe-flattened.js.map +1 -1
- package/dist/esm/prototyping/crypto/jose/jwe.js +1 -1
- package/dist/esm/prototyping/crypto/jose/jwe.js.map +1 -1
- package/dist/esm/store-data.js +3 -3
- package/dist/esm/store-data.js.map +1 -1
- package/dist/esm/store-did.js +1 -1
- package/dist/esm/store-did.js.map +1 -1
- package/dist/esm/sync-engine-level.js +49 -11
- package/dist/esm/sync-engine-level.js.map +1 -1
- package/dist/esm/test-harness.js +24 -8
- package/dist/esm/test-harness.js.map +1 -1
- package/dist/esm/types/dwn.js +1 -1
- package/dist/esm/types/dwn.js.map +1 -1
- package/dist/esm/web5-user-agent.js +1 -1
- package/dist/esm/web5-user-agent.js.map +1 -1
- package/dist/types/crypto-api.d.ts +8 -12
- package/dist/types/crypto-api.d.ts.map +1 -1
- package/dist/types/dwn-api.d.ts +10 -10
- package/dist/types/dwn-api.d.ts.map +1 -1
- package/dist/types/hd-identity-vault.d.ts.map +1 -1
- package/dist/types/identity-api.d.ts.map +1 -1
- package/dist/types/index.d.ts +0 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/local-key-manager.d.ts +15 -18
- package/dist/types/local-key-manager.d.ts.map +1 -1
- package/dist/types/prototyping/crypto/jose/jwe-compact.d.ts +1 -3
- package/dist/types/prototyping/crypto/jose/jwe-compact.d.ts.map +1 -1
- package/dist/types/prototyping/crypto/jose/jwe-flattened.d.ts +1 -3
- package/dist/types/prototyping/crypto/jose/jwe-flattened.d.ts.map +1 -1
- package/dist/types/prototyping/crypto/jose/jwe.d.ts +1 -3
- package/dist/types/prototyping/crypto/jose/jwe.d.ts.map +1 -1
- package/dist/types/store-data.d.ts +2 -2
- package/dist/types/store-did.d.ts.map +1 -1
- package/dist/types/sync-engine-level.d.ts +18 -6
- package/dist/types/sync-engine-level.d.ts.map +1 -1
- package/dist/types/test-harness.d.ts.map +1 -1
- package/dist/types/types/agent.d.ts +1 -1
- package/dist/types/types/agent.d.ts.map +1 -1
- package/dist/types/types/dwn.d.ts +2 -2
- package/dist/types/types/dwn.d.ts.map +1 -1
- package/dist/types/types/key-manager.d.ts +15 -22
- package/dist/types/types/key-manager.d.ts.map +1 -1
- package/dist/types/utils-internal.d.ts +1 -1
- package/dist/types/utils-internal.d.ts.map +1 -1
- package/dist/types/web5-user-agent.d.ts +1 -1
- package/dist/types/web5-user-agent.d.ts.map +1 -1
- package/package.json +10 -12
- package/src/crypto-api.ts +24 -20
- package/src/dwn-api.ts +109 -102
- package/src/hd-identity-vault.ts +4 -5
- package/src/identity-api.ts +2 -1
- package/src/index.ts +0 -2
- package/src/local-key-manager.ts +43 -44
- package/src/prototyping/crypto/jose/jwe-compact.ts +3 -7
- package/src/prototyping/crypto/jose/jwe-flattened.ts +20 -9
- package/src/prototyping/crypto/jose/jwe.ts +2 -6
- package/src/store-data.ts +3 -3
- package/src/store-did.ts +1 -1
- package/src/sync-engine-level.ts +59 -16
- package/src/test-harness.ts +23 -8
- package/src/types/agent.ts +1 -1
- package/src/types/dwn.ts +2 -2
- package/src/types/key-manager.ts +31 -22
- package/src/utils-internal.ts +1 -1
- package/src/web5-user-agent.ts +2 -2
- package/dist/browser.js +0 -2213
- package/dist/browser.js.map +0 -7
- package/dist/esm/dwn-registrar.js +0 -120
- package/dist/esm/dwn-registrar.js.map +0 -1
- package/dist/esm/prototyping/clients/dwn-rpc-types.js +0 -2
- package/dist/esm/prototyping/clients/dwn-rpc-types.js.map +0 -1
- package/dist/esm/prototyping/clients/dwn-server-info-cache-memory.js +0 -74
- package/dist/esm/prototyping/clients/dwn-server-info-cache-memory.js.map +0 -1
- package/dist/esm/prototyping/clients/http-dwn-rpc-client.js +0 -112
- package/dist/esm/prototyping/clients/http-dwn-rpc-client.js.map +0 -1
- package/dist/esm/prototyping/clients/json-rpc-socket.js +0 -167
- package/dist/esm/prototyping/clients/json-rpc-socket.js.map +0 -1
- package/dist/esm/prototyping/clients/json-rpc.js +0 -58
- package/dist/esm/prototyping/clients/json-rpc.js.map +0 -1
- package/dist/esm/prototyping/clients/server-info-types.js +0 -2
- package/dist/esm/prototyping/clients/server-info-types.js.map +0 -1
- package/dist/esm/prototyping/clients/web-socket-clients.js +0 -90
- package/dist/esm/prototyping/clients/web-socket-clients.js.map +0 -1
- package/dist/esm/prototyping/common/object.js +0 -14
- package/dist/esm/prototyping/common/object.js.map +0 -1
- package/dist/esm/prototyping/common/type-utils.js +0 -2
- package/dist/esm/prototyping/common/type-utils.js.map +0 -1
- package/dist/esm/prototyping/crypto/algorithms/aes-gcm.js +0 -147
- package/dist/esm/prototyping/crypto/algorithms/aes-gcm.js.map +0 -1
- package/dist/esm/prototyping/crypto/algorithms/aes-kw.js +0 -136
- package/dist/esm/prototyping/crypto/algorithms/aes-kw.js.map +0 -1
- package/dist/esm/prototyping/crypto/algorithms/ecdsa.js +0 -311
- package/dist/esm/prototyping/crypto/algorithms/ecdsa.js.map +0 -1
- package/dist/esm/prototyping/crypto/algorithms/eddsa.js +0 -268
- package/dist/esm/prototyping/crypto/algorithms/eddsa.js.map +0 -1
- package/dist/esm/prototyping/crypto/algorithms/hkdf.js +0 -38
- package/dist/esm/prototyping/crypto/algorithms/hkdf.js.map +0 -1
- package/dist/esm/prototyping/crypto/algorithms/pbkdf2.js +0 -40
- package/dist/esm/prototyping/crypto/algorithms/pbkdf2.js.map +0 -1
- package/dist/esm/prototyping/crypto/crypto-error.js +0 -41
- package/dist/esm/prototyping/crypto/crypto-error.js.map +0 -1
- package/dist/esm/prototyping/crypto/types/crypto-api.js +0 -2
- package/dist/esm/prototyping/crypto/types/crypto-api.js.map +0 -1
- package/dist/esm/prototyping/crypto/types/key-converter.js +0 -2
- package/dist/esm/prototyping/crypto/types/key-converter.js.map +0 -1
- package/dist/esm/prototyping/crypto/types/key-deriver.js +0 -2
- package/dist/esm/prototyping/crypto/types/key-deriver.js.map +0 -1
- package/dist/esm/prototyping/crypto/types/key-io.js +0 -2
- package/dist/esm/prototyping/crypto/types/key-io.js.map +0 -1
- package/dist/esm/prototyping/crypto/types/key-manager.js +0 -2
- package/dist/esm/prototyping/crypto/types/key-manager.js.map +0 -1
- package/dist/esm/prototyping/crypto/types/params-direct.js +0 -2
- package/dist/esm/prototyping/crypto/types/params-direct.js.map +0 -1
- package/dist/esm/prototyping/crypto/types/params-kms.js +0 -2
- package/dist/esm/prototyping/crypto/types/params-kms.js.map +0 -1
- package/dist/esm/prototyping/crypto/utils.js +0 -19
- package/dist/esm/prototyping/crypto/utils.js.map +0 -1
- package/dist/esm/prototyping/dids/resolver-cache-memory.js +0 -77
- package/dist/esm/prototyping/dids/resolver-cache-memory.js.map +0 -1
- package/dist/esm/prototyping/dids/utils.js +0 -9
- package/dist/esm/prototyping/dids/utils.js.map +0 -1
- package/dist/esm/rpc-client.js +0 -123
- package/dist/esm/rpc-client.js.map +0 -1
- package/dist/types/dwn-registrar.d.ts +0 -29
- package/dist/types/dwn-registrar.d.ts.map +0 -1
- package/dist/types/prototyping/clients/dwn-rpc-types.d.ts +0 -45
- package/dist/types/prototyping/clients/dwn-rpc-types.d.ts.map +0 -1
- package/dist/types/prototyping/clients/dwn-server-info-cache-memory.d.ts +0 -57
- package/dist/types/prototyping/clients/dwn-server-info-cache-memory.d.ts.map +0 -1
- package/dist/types/prototyping/clients/http-dwn-rpc-client.d.ts +0 -13
- package/dist/types/prototyping/clients/http-dwn-rpc-client.d.ts.map +0 -1
- package/dist/types/prototyping/clients/json-rpc-socket.d.ts +0 -43
- package/dist/types/prototyping/clients/json-rpc-socket.d.ts.map +0 -1
- package/dist/types/prototyping/clients/json-rpc.d.ts +0 -49
- package/dist/types/prototyping/clients/json-rpc.d.ts.map +0 -1
- package/dist/types/prototyping/clients/server-info-types.d.ts +0 -20
- package/dist/types/prototyping/clients/server-info-types.d.ts.map +0 -1
- package/dist/types/prototyping/clients/web-socket-clients.d.ts +0 -10
- package/dist/types/prototyping/clients/web-socket-clients.d.ts.map +0 -1
- package/dist/types/prototyping/common/object.d.ts +0 -2
- package/dist/types/prototyping/common/object.d.ts.map +0 -1
- package/dist/types/prototyping/common/type-utils.d.ts +0 -7
- package/dist/types/prototyping/common/type-utils.d.ts.map +0 -1
- package/dist/types/prototyping/crypto/algorithms/aes-gcm.d.ts +0 -151
- package/dist/types/prototyping/crypto/algorithms/aes-gcm.d.ts.map +0 -1
- package/dist/types/prototyping/crypto/algorithms/aes-kw.d.ts +0 -108
- package/dist/types/prototyping/crypto/algorithms/aes-kw.d.ts.map +0 -1
- package/dist/types/prototyping/crypto/algorithms/ecdsa.d.ts +0 -160
- package/dist/types/prototyping/crypto/algorithms/ecdsa.d.ts.map +0 -1
- package/dist/types/prototyping/crypto/algorithms/eddsa.d.ts +0 -157
- package/dist/types/prototyping/crypto/algorithms/eddsa.d.ts.map +0 -1
- package/dist/types/prototyping/crypto/algorithms/hkdf.d.ts +0 -20
- package/dist/types/prototyping/crypto/algorithms/hkdf.d.ts.map +0 -1
- package/dist/types/prototyping/crypto/algorithms/pbkdf2.d.ts +0 -20
- package/dist/types/prototyping/crypto/algorithms/pbkdf2.d.ts.map +0 -1
- package/dist/types/prototyping/crypto/crypto-error.d.ts +0 -29
- package/dist/types/prototyping/crypto/crypto-error.d.ts.map +0 -1
- package/dist/types/prototyping/crypto/types/crypto-api.d.ts +0 -34
- package/dist/types/prototyping/crypto/types/crypto-api.d.ts.map +0 -1
- package/dist/types/prototyping/crypto/types/key-converter.d.ts +0 -49
- package/dist/types/prototyping/crypto/types/key-converter.d.ts.map +0 -1
- package/dist/types/prototyping/crypto/types/key-deriver.d.ts +0 -50
- package/dist/types/prototyping/crypto/types/key-deriver.d.ts.map +0 -1
- package/dist/types/prototyping/crypto/types/key-io.d.ts +0 -49
- package/dist/types/prototyping/crypto/types/key-io.d.ts.map +0 -1
- package/dist/types/prototyping/crypto/types/key-manager.d.ts +0 -69
- package/dist/types/prototyping/crypto/types/key-manager.d.ts.map +0 -1
- package/dist/types/prototyping/crypto/types/params-direct.d.ts +0 -75
- package/dist/types/prototyping/crypto/types/params-direct.d.ts.map +0 -1
- package/dist/types/prototyping/crypto/types/params-kms.d.ts +0 -63
- package/dist/types/prototyping/crypto/types/params-kms.d.ts.map +0 -1
- package/dist/types/prototyping/crypto/utils.d.ts +0 -7
- package/dist/types/prototyping/crypto/utils.d.ts.map +0 -1
- package/dist/types/prototyping/dids/resolver-cache-memory.d.ts +0 -57
- package/dist/types/prototyping/dids/resolver-cache-memory.d.ts.map +0 -1
- package/dist/types/prototyping/dids/utils.d.ts +0 -3
- package/dist/types/prototyping/dids/utils.d.ts.map +0 -1
- package/dist/types/rpc-client.d.ts +0 -51
- package/dist/types/rpc-client.d.ts.map +0 -1
- package/src/dwn-registrar.ts +0 -127
- package/src/prototyping/clients/dwn-rpc-types.ts +0 -55
- package/src/prototyping/clients/dwn-server-info-cache-memory.ts +0 -79
- package/src/prototyping/clients/http-dwn-rpc-client.ts +0 -119
- package/src/prototyping/clients/json-rpc-socket.ts +0 -189
- package/src/prototyping/clients/json-rpc.ts +0 -113
- package/src/prototyping/clients/server-info-types.ts +0 -21
- package/src/prototyping/clients/web-socket-clients.ts +0 -103
- package/src/prototyping/common/object.ts +0 -15
- package/src/prototyping/common/type-utils.ts +0 -6
- package/src/prototyping/crypto/algorithms/aes-gcm.ts +0 -211
- package/src/prototyping/crypto/algorithms/aes-kw.ts +0 -160
- package/src/prototyping/crypto/algorithms/ecdsa.ts +0 -366
- package/src/prototyping/crypto/algorithms/eddsa.ts +0 -311
- package/src/prototyping/crypto/algorithms/hkdf.ts +0 -38
- package/src/prototyping/crypto/algorithms/pbkdf2.ts +0 -41
- package/src/prototyping/crypto/crypto-error.ts +0 -45
- package/src/prototyping/crypto/types/crypto-api.ts +0 -77
- package/src/prototyping/crypto/types/key-converter.ts +0 -53
- package/src/prototyping/crypto/types/key-deriver.ts +0 -56
- package/src/prototyping/crypto/types/key-io.ts +0 -51
- package/src/prototyping/crypto/types/key-manager.ts +0 -83
- package/src/prototyping/crypto/types/params-direct.ts +0 -95
- package/src/prototyping/crypto/types/params-kms.ts +0 -76
- package/src/prototyping/crypto/utils.ts +0 -41
- package/src/prototyping/dids/resolver-cache-memory.ts +0 -83
- package/src/prototyping/dids/utils.ts +0 -10
- package/src/rpc-client.ts +0 -160
package/dist/esm/crypto-api.js
CHANGED
|
@@ -7,13 +7,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
7
7
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
|
-
import { computeJwkThumbprint, CryptoError, CryptoErrorCode, Sha2Algorithm } from '@enbox/crypto';
|
|
11
|
-
import { AesGcmAlgorithm } from './prototyping/crypto/algorithms/aes-gcm.js';
|
|
12
|
-
import { AesKwAlgorithm } from './prototyping/crypto/algorithms/aes-kw.js';
|
|
13
|
-
import { EcdsaAlgorithm } from './prototyping/crypto/algorithms/ecdsa.js';
|
|
14
|
-
import { EdDsaAlgorithm } from './prototyping/crypto/algorithms/eddsa.js';
|
|
15
|
-
import { HkdfAlgorithm } from './prototyping/crypto/algorithms/hkdf.js';
|
|
16
|
-
import { Pbkdf2Algorithm } from './prototyping/crypto/algorithms/pbkdf2.js';
|
|
10
|
+
import { AesGcmAlgorithm, AesKwAlgorithm, computeJwkThumbprint, CryptoError, CryptoErrorCode, EcdsaAlgorithm, EdDsaAlgorithm, HkdfAlgorithm, Pbkdf2Algorithm, Sha2Algorithm, X25519Algorithm, } from '@enbox/crypto';
|
|
17
11
|
/**
|
|
18
12
|
* `supportedAlgorithms` is an object mapping algorithm names to their respective implementations
|
|
19
13
|
* Each entry in this map specifies the algorithm name and its associated properties, including the
|
|
@@ -62,6 +56,11 @@ const supportedAlgorithms = {
|
|
|
62
56
|
implementation: Sha2Algorithm,
|
|
63
57
|
names: ['SHA-256'],
|
|
64
58
|
operations: ['digest'],
|
|
59
|
+
},
|
|
60
|
+
'X25519': {
|
|
61
|
+
implementation: X25519Algorithm,
|
|
62
|
+
names: ['X25519'],
|
|
63
|
+
operations: ['bytesToPrivateKey', 'generateKey'],
|
|
65
64
|
}
|
|
66
65
|
};
|
|
67
66
|
export class AgentCryptoApi {
|
|
@@ -209,12 +208,6 @@ export class AgentCryptoApi {
|
|
|
209
208
|
return privateKey;
|
|
210
209
|
});
|
|
211
210
|
}
|
|
212
|
-
// ! TODO: Remove this once the `Dsa` interface is updated in @enbox/crypto to remove KMS-specific methods.
|
|
213
|
-
getKeyUri(_params) {
|
|
214
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
215
|
-
throw new Error('Method not implemented.');
|
|
216
|
-
});
|
|
217
|
-
}
|
|
218
211
|
getPublicKey(_a) {
|
|
219
212
|
return __awaiter(this, arguments, void 0, function* ({ key }) {
|
|
220
213
|
// Determine the algorithm name based on the JWK's `alg` and `crv` properties.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crypto-api.js","sourceRoot":"","sources":["../../src/crypto-api.ts"],"names":[],"mappings":";;;;;;;;;
|
|
1
|
+
{"version":3,"file":"crypto-api.js","sourceRoot":"","sources":["../../src/crypto-api.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/dwn-api.js
CHANGED
|
@@ -7,9 +7,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
7
7
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
|
-
import { CryptoUtils } from '@enbox/crypto';
|
|
11
10
|
import { TtlCache } from '@enbox/common';
|
|
12
|
-
import { Cid, DataStoreLevel, DataStream, Dwn, DwnInterfaceName, DwnMethodName, Encoder, Encryption, EventEmitterStream, Jws, KeyDerivationScheme, Message, MessageStoreLevel, Protocols, Records, ResumableTaskStoreLevel,
|
|
11
|
+
import { Cid, ContentEncryptionAlgorithm, DataStoreLevel, DataStream, Dwn, DwnInterfaceName, DwnMethodName, Encoder, Encryption, EventEmitterStream, Jws, KeyDerivationScheme, Message, MessageStoreLevel, Protocols, Records, ResumableTaskStoreLevel, StateIndexLevel } from '@enbox/dwn-sdk-js';
|
|
12
|
+
import { CryptoUtils, X25519 } from '@enbox/crypto';
|
|
13
13
|
import { DidDht, DidJwk, DidResolverCacheLevel, UniversalResolver } from '@enbox/dids';
|
|
14
14
|
import { KeyDeliveryProtocolDefinition } from './store-data-protocols.js';
|
|
15
15
|
import { DwnInterface, dwnMessageConstructors } from './types/dwn.js';
|
|
@@ -148,7 +148,7 @@ export class AgentDwnApi {
|
|
|
148
148
|
const recordsWriteMessage = message;
|
|
149
149
|
// Reactive root-record upgrade (PR E): if this is an externally-authored
|
|
150
150
|
// root record with only ProtocolPath encryption, the owner upgrades it by
|
|
151
|
-
// appending a ProtocolContext
|
|
151
|
+
// appending a ProtocolContext recipient entry so that context key
|
|
152
152
|
// holders (including the external author) can also decrypt.
|
|
153
153
|
const authorDid = Jws.getSignerDid(recordsWriteMessage.authorization.signature.signatures[0]);
|
|
154
154
|
const isExternallyAuthored = authorDid !== request.target;
|
|
@@ -185,7 +185,7 @@ export class AgentDwnApi {
|
|
|
185
185
|
keyUri,
|
|
186
186
|
derivationPath: contextDerivationPath,
|
|
187
187
|
});
|
|
188
|
-
const contextDerivedPrivateJwk = yield
|
|
188
|
+
const contextDerivedPrivateJwk = yield X25519.bytesToPrivateKey({ privateKeyBytes: contextDerivedPrivateKeyBytes });
|
|
189
189
|
const contextKeyPayload = {
|
|
190
190
|
rootKeyId: keyId,
|
|
191
191
|
derivationScheme: KeyDerivationScheme.ProtocolContext,
|
|
@@ -401,7 +401,7 @@ export class AgentDwnApi {
|
|
|
401
401
|
// For cross-DWN writes (target !== author), the external author cannot
|
|
402
402
|
// derive the target's context key. Root records use the target's ProtocolPath
|
|
403
403
|
// public key. The target's agent reactively upgrades the record to include a
|
|
404
|
-
// ProtocolContext
|
|
404
|
+
// ProtocolContext recipient entry. Non-root records extract the context
|
|
405
405
|
// public key (derivedPublicKey) from existing ProtocolContext-encrypted records
|
|
406
406
|
// in the same context on the target's DWN.
|
|
407
407
|
// Tracks deferred context encryption info for root multi-party records.
|
|
@@ -465,8 +465,8 @@ export class AgentDwnApi {
|
|
|
465
465
|
}
|
|
466
466
|
// 5. Generate random DEK and IV
|
|
467
467
|
const dataEncryptionKey = crypto.getRandomValues(new Uint8Array(32));
|
|
468
|
-
const dataEncryptionIV = crypto.getRandomValues(new Uint8Array(
|
|
469
|
-
// 6. Build EncryptionInput
|
|
468
|
+
const dataEncryptionIV = crypto.getRandomValues(new Uint8Array(12));
|
|
469
|
+
// 6. Build partial EncryptionInput (authenticationTag added after AEAD encryption)
|
|
470
470
|
let encryptionInput;
|
|
471
471
|
const buildProtocolPathInput = () => this.buildEncryptionInput(dataEncryptionKey, dataEncryptionIV, ruleSet.$encryption.rootKeyId, ruleSet.$encryption.publicKeyJwk, KeyDerivationScheme.ProtocolPath);
|
|
472
472
|
if (isCrossDwn && isMultiPartyContext && isRootRecord) {
|
|
@@ -474,7 +474,7 @@ export class AgentDwnApi {
|
|
|
474
474
|
// External authors cannot derive the target's context key (HKDF requires
|
|
475
475
|
// the private key). Use the target's ProtocolPath public key from their
|
|
476
476
|
// protocol definition. The target's agent will reactively upgrade the record
|
|
477
|
-
// to include a ProtocolContext
|
|
477
|
+
// to include a ProtocolContext recipient entry.
|
|
478
478
|
encryptionInput = buildProtocolPathInput();
|
|
479
479
|
}
|
|
480
480
|
else if (isCrossDwn && isMultiPartyContext && !isRootRecord) {
|
|
@@ -524,8 +524,8 @@ export class AgentDwnApi {
|
|
|
524
524
|
// --- Local single-party → ProtocolPath key (existing logic) ---
|
|
525
525
|
encryptionInput = buildProtocolPathInput();
|
|
526
526
|
}
|
|
527
|
-
// 7. Encrypt data with AES-256-
|
|
528
|
-
const { encryptedBytes, dataCid, dataSize } = yield this.encryptAndComputeCid(plaintextBytes, dataEncryptionKey, dataEncryptionIV);
|
|
527
|
+
// 7. Encrypt data with AEAD (AES-256-GCM) and compute CID
|
|
528
|
+
const { encryptedBytes, dataCid, dataSize, authenticationTag } = yield this.encryptAndComputeCid(plaintextBytes, dataEncryptionKey, dataEncryptionIV);
|
|
529
529
|
// 8. Replace plaintext with encrypted data
|
|
530
530
|
messageParams.dataCid = dataCid;
|
|
531
531
|
messageParams.dataSize = dataSize;
|
|
@@ -533,11 +533,12 @@ export class AgentDwnApi {
|
|
|
533
533
|
readableStream = DataStream.fromBytes(encryptedBytes);
|
|
534
534
|
request.dataStream = undefined;
|
|
535
535
|
if (encryptionInput) {
|
|
536
|
+
encryptionInput.authenticationTag = authenticationTag;
|
|
536
537
|
messageParams.encryptionInput = encryptionInput;
|
|
537
538
|
}
|
|
538
539
|
else {
|
|
539
540
|
// Deferred — store info for post-creation encryption
|
|
540
|
-
deferredContextEncryption = { dataEncryptionKey, dataEncryptionIV, encryptedBytes };
|
|
541
|
+
deferredContextEncryption = { dataEncryptionKey, dataEncryptionIV, encryptedBytes, authenticationTag };
|
|
541
542
|
}
|
|
542
543
|
// 9. For cross-DWN writes in multi-party contexts, attach the author's
|
|
543
544
|
// key-delivery ProtocolPath public key so the DWN owner can encrypt
|
|
@@ -577,7 +578,8 @@ export class AgentDwnApi {
|
|
|
577
578
|
const recordsWriteInstance = dwnMessage;
|
|
578
579
|
const contextId = recordsWriteInstance.message.recordId;
|
|
579
580
|
const { encryptionInput: contextEncryptionInput, keyId, keyUri, contextDerivationPath } = yield this.deriveContextEncryptionInput(request.author, contextId, deferredContextEncryption.dataEncryptionKey, deferredContextEncryption.dataEncryptionIV);
|
|
580
|
-
|
|
581
|
+
const fullContextInput = Object.assign(Object.assign({}, contextEncryptionInput), { authenticationTag: deferredContextEncryption.authenticationTag });
|
|
582
|
+
yield recordsWriteInstance.encryptSymmetricEncryptionKey(fullContextInput);
|
|
581
583
|
yield recordsWriteInstance.sign({ signer });
|
|
582
584
|
// Cache context key info for subsequent writes in this context
|
|
583
585
|
this._contextKeyCache.set(contextId, { keyId, keyUri, contextDerivationPath });
|
|
@@ -657,7 +659,7 @@ export class AgentDwnApi {
|
|
|
657
659
|
* @param didUri - The DID URI to resolve encryption key info for
|
|
658
660
|
* @returns keyId (fully qualified verification method ID), keyUri (KMS reference),
|
|
659
661
|
* and publicKeyJwk. No private key material is returned.
|
|
660
|
-
* @throws If the DID has no keyAgreement verification method or it's not
|
|
662
|
+
* @throws If the DID has no keyAgreement verification method or it's not X25519.
|
|
661
663
|
*/
|
|
662
664
|
getEncryptionKeyInfo(didUri) {
|
|
663
665
|
return __awaiter(this, void 0, void 0, function* () {
|
|
@@ -672,7 +674,7 @@ export class AgentDwnApi {
|
|
|
672
674
|
const keyAgreementRefs = didDocument.keyAgreement;
|
|
673
675
|
if (!keyAgreementRefs || keyAgreementRefs.length === 0) {
|
|
674
676
|
throw new Error(`AgentDwnApi: DID '${didUri}' does not have a keyAgreement ` +
|
|
675
|
-
`verification method. Create the identity with
|
|
677
|
+
`verification method. Create the identity with an X25519 key ` +
|
|
676
678
|
`with keyAgreement purpose to use protocol encryption.`);
|
|
677
679
|
}
|
|
678
680
|
// 3. Resolve the verification method (handle both inline and string refs)
|
|
@@ -691,11 +693,11 @@ export class AgentDwnApi {
|
|
|
691
693
|
throw new Error(`AgentDwnApi: keyAgreement verification method for '${didUri}' ` +
|
|
692
694
|
`does not contain a public key in JWK format.`);
|
|
693
695
|
}
|
|
694
|
-
// 4. Verify it's
|
|
696
|
+
// 4. Verify it's an X25519 key
|
|
695
697
|
const publicKeyJwk = verificationMethod.publicKeyJwk;
|
|
696
|
-
if (publicKeyJwk.crv !== '
|
|
698
|
+
if (publicKeyJwk.crv !== 'X25519') {
|
|
697
699
|
throw new Error(`AgentDwnApi: keyAgreement key for '${didUri}' uses curve ` +
|
|
698
|
-
`'${publicKeyJwk.crv}', but DWN encryption requires '
|
|
700
|
+
`'${publicKeyJwk.crv}', but DWN encryption requires 'X25519'.`);
|
|
699
701
|
}
|
|
700
702
|
// 5. Compute the KMS key URI (does NOT export the key)
|
|
701
703
|
const keyUri = yield this.agent.keyManager.getKeyUri({ key: publicKeyJwk });
|
|
@@ -707,9 +709,9 @@ export class AgentDwnApi {
|
|
|
707
709
|
});
|
|
708
710
|
}
|
|
709
711
|
/**
|
|
710
|
-
* Builds
|
|
711
|
-
*
|
|
712
|
-
*
|
|
712
|
+
* Builds a partial EncryptionInput object for a single key-encryption entry.
|
|
713
|
+
* The `authenticationTag` is NOT set here — the caller must set it after
|
|
714
|
+
* AEAD encryption produces the tag.
|
|
713
715
|
*/
|
|
714
716
|
buildEncryptionInput(dek, iv, publicKeyId, publicKey, derivationScheme) {
|
|
715
717
|
return {
|
|
@@ -723,18 +725,17 @@ export class AgentDwnApi {
|
|
|
723
725
|
};
|
|
724
726
|
}
|
|
725
727
|
/**
|
|
726
|
-
* Encrypts plaintext bytes with AES-256-
|
|
727
|
-
* resulting ciphertext. Returns everything needed to attach
|
|
728
|
-
* data to a DWN message.
|
|
728
|
+
* Encrypts plaintext bytes with AEAD (AES-256-GCM by default) and computes
|
|
729
|
+
* the CID of the resulting ciphertext. Returns everything needed to attach
|
|
730
|
+
* the encrypted data to a DWN message, including the authentication tag.
|
|
729
731
|
*/
|
|
730
732
|
encryptAndComputeCid(plaintextBytes, dek, iv) {
|
|
731
733
|
return __awaiter(this, void 0, void 0, function* () {
|
|
732
|
-
const
|
|
733
|
-
const
|
|
734
|
-
const encryptedBytes = yield DataStream.toBytes(encryptedStream);
|
|
734
|
+
const { ciphertextStream, tag: authenticationTag } = yield Encryption.aeadEncryptStream(ContentEncryptionAlgorithm.A256GCM, dek, iv, DataStream.fromBytes(plaintextBytes));
|
|
735
|
+
const encryptedBytes = yield DataStream.toBytes(ciphertextStream);
|
|
735
736
|
const cidStream = DataStream.fromBytes(encryptedBytes);
|
|
736
737
|
const dataCid = yield Cid.computeDagPbCidFromStream(cidStream);
|
|
737
|
-
return { encryptedBytes, dataCid, dataSize: encryptedBytes.length };
|
|
738
|
+
return { encryptedBytes, dataCid, dataSize: encryptedBytes.length, authenticationTag };
|
|
738
739
|
});
|
|
739
740
|
}
|
|
740
741
|
/**
|
|
@@ -756,7 +757,7 @@ export class AgentDwnApi {
|
|
|
756
757
|
});
|
|
757
758
|
}
|
|
758
759
|
/**
|
|
759
|
-
* Builds a KMS-backed
|
|
760
|
+
* Builds a KMS-backed JWE key unwrap callback. Used for both ProtocolPath
|
|
760
761
|
* and ProtocolContext decryption where the KMS holds the root private key.
|
|
761
762
|
*/
|
|
762
763
|
buildKmsDecryptCallback(keyId, keyUri, derivationScheme) {
|
|
@@ -764,14 +765,12 @@ export class AgentDwnApi {
|
|
|
764
765
|
return {
|
|
765
766
|
rootKeyId: keyId,
|
|
766
767
|
derivationScheme,
|
|
767
|
-
decrypt: (fullDerivationPath,
|
|
768
|
-
return keyManager.
|
|
768
|
+
decrypt: (fullDerivationPath, jwePayload) => __awaiter(this, void 0, void 0, function* () {
|
|
769
|
+
return keyManager.jweKeyUnwrap({
|
|
769
770
|
keyUri,
|
|
770
771
|
derivationPath: fullDerivationPath,
|
|
771
|
-
|
|
772
|
-
ephemeralPublicKey:
|
|
773
|
-
initializationVector: eciesPayload.initializationVector,
|
|
774
|
-
messageAuthenticationCode: eciesPayload.messageAuthenticationCode,
|
|
772
|
+
encryptedKey: jwePayload.encryptedKey,
|
|
773
|
+
ephemeralPublicKey: jwePayload.ephemeralPublicKey,
|
|
775
774
|
});
|
|
776
775
|
}),
|
|
777
776
|
};
|
|
@@ -1054,15 +1053,15 @@ export class AgentDwnApi {
|
|
|
1054
1053
|
if (queryReply.status.code !== 200 || !((_a = queryReply.entries) === null || _a === void 0 ? void 0 : _a.length)) {
|
|
1055
1054
|
return undefined;
|
|
1056
1055
|
}
|
|
1057
|
-
// Search entries for one with a ProtocolContext
|
|
1056
|
+
// Search entries for one with a ProtocolContext recipient entry
|
|
1058
1057
|
// that includes derivedPublicKey
|
|
1059
1058
|
for (const entry of queryReply.entries) {
|
|
1060
|
-
if ((_b = entry.encryption) === null || _b === void 0 ? void 0 : _b.
|
|
1061
|
-
const contextEntry = entry.encryption.
|
|
1062
|
-
if (contextEntry === null || contextEntry === void 0 ? void 0 : contextEntry.derivedPublicKey) {
|
|
1059
|
+
if ((_b = entry.encryption) === null || _b === void 0 ? void 0 : _b.recipients) {
|
|
1060
|
+
const contextEntry = entry.encryption.recipients.find((r) => r.header.derivationScheme === KeyDerivationScheme.ProtocolContext && r.header.derivedPublicKey);
|
|
1061
|
+
if (contextEntry === null || contextEntry === void 0 ? void 0 : contextEntry.header.derivedPublicKey) {
|
|
1063
1062
|
return {
|
|
1064
|
-
rootKeyId: contextEntry.
|
|
1065
|
-
derivedPublicKey: contextEntry.derivedPublicKey,
|
|
1063
|
+
rootKeyId: contextEntry.header.kid,
|
|
1064
|
+
derivedPublicKey: contextEntry.header.derivedPublicKey,
|
|
1066
1065
|
};
|
|
1067
1066
|
}
|
|
1068
1067
|
}
|
|
@@ -1072,7 +1071,7 @@ export class AgentDwnApi {
|
|
|
1072
1071
|
}
|
|
1073
1072
|
/**
|
|
1074
1073
|
* Reactively upgrades an externally-authored root record that has only
|
|
1075
|
-
* ProtocolPath encryption by appending a ProtocolContext
|
|
1074
|
+
* ProtocolPath encryption by appending a ProtocolContext recipient entry.
|
|
1076
1075
|
*
|
|
1077
1076
|
* After the upgrade, both the owner (ProtocolPath) and context key holders —
|
|
1078
1077
|
* including the external author (ProtocolContext) — can decrypt the record.
|
|
@@ -1081,7 +1080,7 @@ export class AgentDwnApi {
|
|
|
1081
1080
|
* 1. Decrypt the DEK using the owner's ProtocolPath-derived private key
|
|
1082
1081
|
* 2. Derive the context public key from the owner's #enc key
|
|
1083
1082
|
* 3. ECIES-encrypt the same DEK to the context public key
|
|
1084
|
-
* 4. Append the ProtocolContext
|
|
1083
|
+
* 4. Append the ProtocolContext recipient entry (using PR 0b append mode)
|
|
1085
1084
|
* 5. Re-sign the record as owner
|
|
1086
1085
|
*
|
|
1087
1086
|
* The author's signature payload includes an `encryptionCid` that becomes
|
|
@@ -1106,32 +1105,32 @@ export class AgentDwnApi {
|
|
|
1106
1105
|
return;
|
|
1107
1106
|
}
|
|
1108
1107
|
// Verify: has ProtocolPath but NOT ProtocolContext
|
|
1109
|
-
const hasProtocolPath = encryption.
|
|
1110
|
-
const hasProtocolContext = encryption.
|
|
1108
|
+
const hasProtocolPath = encryption.recipients.some((r) => r.header.derivationScheme === KeyDerivationScheme.ProtocolPath);
|
|
1109
|
+
const hasProtocolContext = encryption.recipients.some((r) => r.header.derivationScheme === KeyDerivationScheme.ProtocolContext);
|
|
1111
1110
|
if (!hasProtocolPath || hasProtocolContext) {
|
|
1112
1111
|
return;
|
|
1113
1112
|
}
|
|
1114
1113
|
// 1. Decrypt the DEK using the owner's ProtocolPath key
|
|
1115
1114
|
const keyDecrypter = yield this.getKeyDecrypter(tenantDid);
|
|
1116
|
-
// Find the ProtocolPath
|
|
1117
|
-
const
|
|
1115
|
+
// Find the ProtocolPath recipient entry
|
|
1116
|
+
const pathRecipient = encryption.recipients.find((r) => r.header.derivationScheme === KeyDerivationScheme.ProtocolPath);
|
|
1118
1117
|
const fullDerivationPath = Records.constructKeyDerivationPathUsingProtocolPathScheme(recordsWrite.descriptor);
|
|
1119
1118
|
const dataEncryptionKey = yield keyDecrypter.decrypt(fullDerivationPath, {
|
|
1120
|
-
|
|
1121
|
-
ephemeralPublicKey:
|
|
1122
|
-
initializationVector: Encoder.base64UrlToBytes(pathEntry.initializationVector),
|
|
1123
|
-
messageAuthenticationCode: Encoder.base64UrlToBytes(pathEntry.messageAuthenticationCode),
|
|
1119
|
+
encryptedKey: Encoder.base64UrlToBytes(pathRecipient.encrypted_key),
|
|
1120
|
+
ephemeralPublicKey: pathRecipient.header.epk,
|
|
1124
1121
|
});
|
|
1125
1122
|
// 2. Derive the context public key — contextId = recordId for root records
|
|
1126
1123
|
const contextId = recordsWrite.recordId;
|
|
1127
|
-
const encryptionIV = Encoder.base64UrlToBytes(encryption.
|
|
1128
|
-
// 3 & 4. Append the ProtocolContext
|
|
1124
|
+
const encryptionIV = Encoder.base64UrlToBytes(encryption.iv);
|
|
1125
|
+
// 3 & 4. Append the ProtocolContext recipient entry using append mode.
|
|
1129
1126
|
// Append mode preserves the author's identity and authorization so that
|
|
1130
1127
|
// signAsOwner() can be called in step 5.
|
|
1131
1128
|
const { encryptionInput: contextEncryptionInput, keyId, keyUri, contextDerivationPath } = yield this.deriveContextEncryptionInput(tenantDid, contextId, dataEncryptionKey, encryptionIV);
|
|
1129
|
+
// Set the authentication tag from the existing JWE encryption property
|
|
1130
|
+
const fullContextInput = Object.assign(Object.assign({}, contextEncryptionInput), { authenticationTag: Encoder.base64UrlToBytes(encryption.tag) });
|
|
1132
1131
|
// Parse the message to get a RecordsWrite instance we can mutate
|
|
1133
1132
|
const recordsWriteInstance = yield dwnMessageConstructors[DwnInterface.RecordsWrite].parse(recordsWrite);
|
|
1134
|
-
yield recordsWriteInstance.encryptSymmetricEncryptionKey(
|
|
1133
|
+
yield recordsWriteInstance.encryptSymmetricEncryptionKey(fullContextInput, { append: true });
|
|
1135
1134
|
// 5. Re-sign as owner — the author's signature is preserved but its
|
|
1136
1135
|
// encryptionCid is now stale; the owner's signature vouches for the
|
|
1137
1136
|
// updated encryption property.
|
|
@@ -1145,29 +1144,37 @@ export class AgentDwnApi {
|
|
|
1145
1144
|
// We must also update the state index and event stream to keep sync and
|
|
1146
1145
|
// real-time subscribers consistent — without this, the upgraded record
|
|
1147
1146
|
// would never propagate to remote DWNs or notify subscribers.
|
|
1148
|
-
const
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1147
|
+
const { messageStore, stateIndex, eventStream } = this._dwn.storage;
|
|
1148
|
+
// Validate the upgrade only changed encryption and authorization fields.
|
|
1149
|
+
// The descriptor, recordId, contextId, and data must remain identical.
|
|
1150
|
+
// Note: parse() may produce a new descriptor object, so we compare by value.
|
|
1151
|
+
const upgradedMessage = recordsWriteInstance.message;
|
|
1152
|
+
if (JSON.stringify(upgradedMessage.descriptor) !== JSON.stringify(recordsWrite.descriptor)) {
|
|
1153
|
+
throw new Error('AgentDwnApi: upgradeExternalRootRecord() must not modify the descriptor.');
|
|
1154
|
+
}
|
|
1155
|
+
if (upgradedMessage.recordId !== recordsWrite.recordId) {
|
|
1156
|
+
throw new Error('AgentDwnApi: upgradeExternalRootRecord() must not modify the recordId.');
|
|
1157
|
+
}
|
|
1152
1158
|
// Fetch the stored original (which carries encodedData for small payloads)
|
|
1153
1159
|
const originalCid = yield Message.getCid(recordsWrite);
|
|
1154
1160
|
const storedOriginal = yield messageStore.get(tenantDid, originalCid);
|
|
1155
|
-
// Remove the original message and its state index entry
|
|
1156
|
-
yield messageStore.delete(tenantDid, originalCid);
|
|
1157
|
-
yield stateIndex.delete(tenantDid, [originalCid]);
|
|
1158
1161
|
// Build indexes for the upgraded message (mark as latest base state)
|
|
1159
1162
|
const isLatestBaseState = true;
|
|
1160
1163
|
const upgradedIndexes = yield recordsWriteInstance.constructIndexes(isLatestBaseState);
|
|
1161
1164
|
// Carry over the encoded data from the stored original (the handler
|
|
1162
1165
|
// base64url-encodes small payloads into encodedData during processMessage)
|
|
1163
|
-
const upgradedMessage = recordsWriteInstance.message;
|
|
1164
1166
|
if (storedOriginal === null || storedOriginal === void 0 ? void 0 : storedOriginal.encodedData) {
|
|
1165
1167
|
upgradedMessage.encodedData = storedOriginal.encodedData;
|
|
1166
1168
|
}
|
|
1167
|
-
//
|
|
1168
|
-
|
|
1169
|
+
// Use put-before-delete ordering: if a crash occurs after the put but
|
|
1170
|
+
// before the delete, we end up with a duplicate (recoverable via the
|
|
1171
|
+
// isLatestBaseState index) rather than data loss (unrecoverable).
|
|
1169
1172
|
const upgradedCid = yield Message.getCid(upgradedMessage);
|
|
1173
|
+
yield messageStore.put(tenantDid, upgradedMessage, upgradedIndexes);
|
|
1170
1174
|
yield stateIndex.insert(tenantDid, upgradedCid, upgradedIndexes);
|
|
1175
|
+
// Now remove the original message and its state index entry.
|
|
1176
|
+
yield messageStore.delete(tenantDid, originalCid);
|
|
1177
|
+
yield stateIndex.delete(tenantDid, [originalCid]);
|
|
1171
1178
|
// Notify real-time subscribers (mirrors handler behavior)
|
|
1172
1179
|
if (eventStream !== undefined) {
|
|
1173
1180
|
eventStream.emit(tenantDid, { message: upgradedMessage }, upgradedIndexes);
|
|
@@ -1188,17 +1195,17 @@ export class AgentDwnApi {
|
|
|
1188
1195
|
return __awaiter(this, void 0, void 0, function* () {
|
|
1189
1196
|
const { encryption } = recordsWrite;
|
|
1190
1197
|
// Check if the record uses context-derived encryption
|
|
1191
|
-
const hasContextKey = encryption === null || encryption === void 0 ? void 0 : encryption.
|
|
1198
|
+
const hasContextKey = encryption === null || encryption === void 0 ? void 0 : encryption.recipients.some((r) => r.header.derivationScheme === KeyDerivationScheme.ProtocolContext);
|
|
1192
1199
|
if (!hasContextKey || !recordsWrite.contextId) {
|
|
1193
1200
|
// Single-party protocol-path encryption
|
|
1194
1201
|
return this.getKeyDecrypter(authorDid);
|
|
1195
1202
|
}
|
|
1196
1203
|
// --- Multi-party context encryption ---
|
|
1197
|
-
const contextKeyEntry = encryption.
|
|
1204
|
+
const contextKeyEntry = encryption.recipients.find((r) => r.header.derivationScheme === KeyDerivationScheme.ProtocolContext);
|
|
1198
1205
|
const rootContextId = recordsWrite.contextId.split('/')[0];
|
|
1199
1206
|
// Case 1: I am the context creator — rootKeyId matches my encryption key
|
|
1200
1207
|
const { keyId, keyUri } = yield this.getEncryptionKeyInfo(authorDid);
|
|
1201
|
-
if (contextKeyEntry.
|
|
1208
|
+
if (contextKeyEntry.header.kid === keyId) {
|
|
1202
1209
|
return this.buildKmsDecryptCallback(keyId, keyUri, KeyDerivationScheme.ProtocolContext);
|
|
1203
1210
|
}
|
|
1204
1211
|
// Case 2: I am a participant — fetch my context key from the key-delivery protocol
|
|
@@ -1246,15 +1253,10 @@ export class AgentDwnApi {
|
|
|
1246
1253
|
return {
|
|
1247
1254
|
rootKeyId: contextKey.rootKeyId,
|
|
1248
1255
|
derivationScheme: contextKey.derivationScheme,
|
|
1249
|
-
decrypt: (fullDerivationPath,
|
|
1250
|
-
const
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
ciphertext: eciesPayload.ciphertext,
|
|
1254
|
-
ephemeralPublicKey: eciesPayload.ephemeralPublicKey,
|
|
1255
|
-
initializationVector: eciesPayload.initializationVector,
|
|
1256
|
-
messageAuthenticationCode: eciesPayload.messageAuthenticationCode,
|
|
1257
|
-
});
|
|
1256
|
+
decrypt: (fullDerivationPath, jwePayload) => __awaiter(this, void 0, void 0, function* () {
|
|
1257
|
+
const leafPrivateKeyBytes = yield Records.derivePrivateKey(contextKey, fullDerivationPath);
|
|
1258
|
+
const leafPrivateKeyJwk = yield X25519.bytesToPrivateKey({ privateKeyBytes: leafPrivateKeyBytes });
|
|
1259
|
+
return Encryption.ecdhEsUnwrapKey(leafPrivateKeyJwk, jwePayload.ephemeralPublicKey, jwePayload.encryptedKey);
|
|
1258
1260
|
}),
|
|
1259
1261
|
};
|
|
1260
1262
|
}
|
|
@@ -1415,9 +1417,9 @@ export class AgentDwnApi {
|
|
|
1415
1417
|
// Manually build encryption input targeting the recipient's key so the
|
|
1416
1418
|
// record is decryptable only by the recipient.
|
|
1417
1419
|
const dataEncryptionKey = crypto.getRandomValues(new Uint8Array(32));
|
|
1418
|
-
const dataEncryptionIV = crypto.getRandomValues(new Uint8Array(
|
|
1419
|
-
const { encryptedBytes, dataCid, dataSize } = yield this.encryptAndComputeCid(plaintextBytes, dataEncryptionKey, dataEncryptionIV);
|
|
1420
|
-
const encryptionInput = this.buildEncryptionInput(dataEncryptionKey, dataEncryptionIV, recipientKeyDeliveryPublicKey.rootKeyId, recipientKeyDeliveryPublicKey.publicKeyJwk, KeyDerivationScheme.ProtocolPath);
|
|
1420
|
+
const dataEncryptionIV = crypto.getRandomValues(new Uint8Array(12));
|
|
1421
|
+
const { encryptedBytes, dataCid, dataSize, authenticationTag } = yield this.encryptAndComputeCid(plaintextBytes, dataEncryptionKey, dataEncryptionIV);
|
|
1422
|
+
const encryptionInput = Object.assign(Object.assign({}, this.buildEncryptionInput(dataEncryptionKey, dataEncryptionIV, recipientKeyDeliveryPublicKey.rootKeyId, recipientKeyDeliveryPublicKey.publicKeyJwk, KeyDerivationScheme.ProtocolPath)), { authenticationTag });
|
|
1421
1423
|
({ message, reply: { status } } = yield this.processRequest({
|
|
1422
1424
|
author: tenantDid,
|
|
1423
1425
|
target: tenantDid,
|