@enbox/dwn-sdk-js 0.4.7 → 0.4.8
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 +1 -1
- package/dist/browser.mjs.map +4 -4
- package/dist/esm/generated/precompiled-validators.js +319 -0
- package/dist/esm/generated/precompiled-validators.js.map +1 -1
- package/dist/esm/src/core/dwn-error.js +1 -0
- package/dist/esm/src/core/dwn-error.js.map +1 -1
- package/dist/esm/src/index.js +1 -1
- package/dist/esm/src/index.js.map +1 -1
- package/dist/esm/src/protocols/encryption.js +38 -6
- package/dist/esm/src/protocols/encryption.js.map +1 -1
- package/dist/esm/tests/protocols/encryption.spec.js +94 -3
- package/dist/esm/tests/protocols/encryption.spec.js.map +1 -1
- package/dist/esm/tests/validation/json-schemas/encryption/wrapped-grant-key-envelope.spec.js +43 -0
- package/dist/esm/tests/validation/json-schemas/encryption/wrapped-grant-key-envelope.spec.js.map +1 -0
- package/dist/types/generated/precompiled-validators.d.ts +16 -0
- package/dist/types/generated/precompiled-validators.d.ts.map +1 -1
- package/dist/types/src/core/dwn-error.d.ts +1 -0
- package/dist/types/src/core/dwn-error.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +2 -1
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/protocols/encryption.d.ts +15 -2
- package/dist/types/src/protocols/encryption.d.ts.map +1 -1
- package/dist/types/tests/validation/json-schemas/encryption/wrapped-grant-key-envelope.spec.d.ts +2 -0
- package/dist/types/tests/validation/json-schemas/encryption/wrapped-grant-key-envelope.spec.d.ts.map +1 -0
- package/package.json +1 -1
- package/src/core/dwn-error.ts +1 -0
- package/src/index.ts +2 -1
- package/src/protocols/encryption.ts +59 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"encryption.d.ts","sourceRoot":"","sources":["../../../../src/protocols/encryption.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAGjE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;
|
|
1
|
+
{"version":3,"file":"encryption.d.ts","sourceRoot":"","sources":["../../../../src/protocols/encryption.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAGjE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,KAAK,EAAE,0BAA0B,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAYlG,eAAO,MAAM,wBAAwB,8BAA8B,CAAC;AAEpE,MAAM,MAAM,uBAAuB,GAAG;IACpC,MAAM,EAAE,OAAO,wBAAwB,CAAC;IACxC,aAAa,EAAE,uBAAuB,CAAC;IACvC,iBAAiB,EAAE;QACjB,SAAS,EAAE,OAAO,0BAA0B,CAAC,OAAO,CAAC;QACrD,oBAAoB,EAAE,MAAM,CAAC;KAC9B,CAAC;IACF,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,IAAI,uBAAuB,CAU5G;AAED,qBAAa,kBAAmB,YAAW,YAAY;IACrD,gBAAuB,GAAG,0DAA2B;IACrD,gBAAuB,YAAY,cAAc;IAEjD,gBAAuB,UAAU,EAAE,kBAAkB,CA0BnD;IAEF,IAAW,GAAG,IAAI,MAAM,CAEvB;IAED,IAAW,UAAU,IAAI,kBAAkB,CAE1C;IAEY,eAAe,CAC1B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,mBAAmB,EAC5B,qBAAqB,EAAE,qBAAqB,GAC3C,OAAO,CAAC,IAAI,CAAC;IAMH,cAAc,CAAC,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;mBAY1E,kBAAkB;IA0BvC,OAAO,CAAC,MAAM,CAAC,mCAAmC;IAalD,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAqBrC,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAYnC,OAAO,CAAC,MAAM,CAAC,oBAAoB;mBAgBd,iBAAiB;IA8BtC,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAWnC,OAAO,CAAC,MAAM,CAAC,uBAAuB;mBAWjB,mBAAmB;IA0DjC,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAO3D,gCAAgC,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS;CAoBpF"}
|
package/dist/types/tests/validation/json-schemas/encryption/wrapped-grant-key-envelope.spec.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrapped-grant-key-envelope.spec.d.ts","sourceRoot":"","sources":["../../../../../../tests/validation/json-schemas/encryption/wrapped-grant-key-envelope.spec.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
package/src/core/dwn-error.ts
CHANGED
|
@@ -40,6 +40,7 @@ export enum DwnErrorCode {
|
|
|
40
40
|
EncryptionProtocolValidateGrantKeyGrantScopeMismatch = 'EncryptionProtocolValidateGrantKeyGrantScopeMismatch',
|
|
41
41
|
EncryptionProtocolValidateGrantKeyMissingRequiredTag = 'EncryptionProtocolValidateGrantKeyMissingRequiredTag',
|
|
42
42
|
EncryptionProtocolValidateGrantKeyRecipientMismatch = 'EncryptionProtocolValidateGrantKeyRecipientMismatch',
|
|
43
|
+
EncryptionProtocolValidateGrantKeyWrappedDeliveryInvalid = 'EncryptionProtocolValidateGrantKeyWrappedDeliveryInvalid',
|
|
43
44
|
EncryptionProtocolValidateSchemaUnexpectedRecord = 'EncryptionProtocolValidateSchemaUnexpectedRecord',
|
|
44
45
|
EventLogNotOpenError = 'EventLogNotOpenError',
|
|
45
46
|
EventLogProgressGap = 'EventLogProgressGap',
|
package/src/index.ts
CHANGED
|
@@ -86,7 +86,8 @@ export type { MessageInterface } from './types/message-interface.js';
|
|
|
86
86
|
export { PermissionGrant } from './protocols/permission-grant.js';
|
|
87
87
|
export { PermissionRequest } from './protocols/permission-request.js';
|
|
88
88
|
export { PermissionsProtocol } from './protocols/permissions.js';
|
|
89
|
-
export { EncryptionProtocol } from './protocols/encryption.js';
|
|
89
|
+
export { EncryptionProtocol, WRAPPED_GRANT_KEY_FORMAT, assertWrappedGrantKeyEnvelope } from './protocols/encryption.js';
|
|
90
|
+
export type { WrappedGrantKeyEnvelope } from './protocols/encryption.js';
|
|
90
91
|
export type { PermissionGrantCreateOptions, PermissionRequestCreateOptions, PermissionRevocationCreateOptions } from './protocols/permissions.js';
|
|
91
92
|
export { PermissionScopeMatcher } from './utils/permission-scope.js';
|
|
92
93
|
export type { ProtocolScope } from './utils/permission-scope.js';
|
|
@@ -6,14 +6,42 @@ import type { PermissionScope } from '../types/permission-types.js';
|
|
|
6
6
|
import type { ProtocolDefinition } from '../types/protocols-types.js';
|
|
7
7
|
import type { RecordsWriteMessage } from '../types/records-types.js';
|
|
8
8
|
import type { ValidationStateReader } from '../types/validation-state-reader.js';
|
|
9
|
+
import type { ContentEncryptionAlgorithm, X25519KeyEncryptionBase } from '../utils/encryption.js';
|
|
9
10
|
|
|
11
|
+
import { DwnConstant } from '../core/dwn-constant.js';
|
|
12
|
+
import { Encoder } from '../utils/encoder.js';
|
|
10
13
|
import { ENCRYPTION_PROTOCOL_URI } from '../core/constants.js';
|
|
11
14
|
import { FilterUtility } from '../utils/filter.js';
|
|
12
15
|
import { Message } from '../core/message.js';
|
|
13
16
|
import { Records } from '../utils/records.js';
|
|
17
|
+
import { validateJsonSchema } from '../schema-validator.js';
|
|
14
18
|
import { DwnError, DwnErrorCode } from '../core/dwn-error.js';
|
|
15
19
|
import { grantKeyScopeCoversDeliveredScope, isGrantKeyEligibleRecordsScope, isGrantKeyRecordsScope } from '../utils/grant-key-coverage.js';
|
|
16
20
|
|
|
21
|
+
export const WRAPPED_GRANT_KEY_FORMAT = 'enbox/wrapped-grant-key@1';
|
|
22
|
+
|
|
23
|
+
export type WrappedGrantKeyEnvelope = {
|
|
24
|
+
format: typeof WRAPPED_GRANT_KEY_FORMAT;
|
|
25
|
+
keyEncryption: X25519KeyEncryptionBase;
|
|
26
|
+
contentEncryption: {
|
|
27
|
+
algorithm: typeof ContentEncryptionAlgorithm.A256CTR;
|
|
28
|
+
initializationVector: string;
|
|
29
|
+
};
|
|
30
|
+
ciphertext: string;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export function assertWrappedGrantKeyEnvelope(envelope: unknown): asserts envelope is WrappedGrantKeyEnvelope {
|
|
34
|
+
try {
|
|
35
|
+
validateJsonSchema('WrappedGrantKeyEnvelope', envelope);
|
|
36
|
+
} catch (error) {
|
|
37
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
38
|
+
throw new DwnError(
|
|
39
|
+
DwnErrorCode.EncryptionProtocolValidateGrantKeyWrappedDeliveryInvalid,
|
|
40
|
+
`wrapped grantKey envelope is invalid: ${detail}`
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
17
45
|
export class EncryptionProtocol implements CoreProtocol {
|
|
18
46
|
public static readonly uri = ENCRYPTION_PROTOCOL_URI;
|
|
19
47
|
public static readonly grantKeyPath = 'grantKey';
|
|
@@ -64,9 +92,9 @@ export class EncryptionProtocol implements CoreProtocol {
|
|
|
64
92
|
}
|
|
65
93
|
}
|
|
66
94
|
|
|
67
|
-
public async validateRecord(message: RecordsWriteMessage,
|
|
95
|
+
public async validateRecord(message: RecordsWriteMessage, dataBytes: Uint8Array): Promise<void> {
|
|
68
96
|
if (message.descriptor.protocolPath === EncryptionProtocol.grantKeyPath) {
|
|
69
|
-
EncryptionProtocol.
|
|
97
|
+
EncryptionProtocol.verifyGrantKeyDelivery(message, dataBytes);
|
|
70
98
|
return;
|
|
71
99
|
}
|
|
72
100
|
|
|
@@ -81,7 +109,7 @@ export class EncryptionProtocol implements CoreProtocol {
|
|
|
81
109
|
message: RecordsWriteMessage,
|
|
82
110
|
validationStateReader: ValidationStateReader,
|
|
83
111
|
): Promise<void> {
|
|
84
|
-
EncryptionProtocol.
|
|
112
|
+
EncryptionProtocol.verifyInlineWrappedGrantKeyDelivery(message);
|
|
85
113
|
|
|
86
114
|
const grantId = EncryptionProtocol.getRequiredStringTag(message, 'grantId');
|
|
87
115
|
const protocol = EncryptionProtocol.getRequiredStringTag(message, 'protocol');
|
|
@@ -102,11 +130,36 @@ export class EncryptionProtocol implements CoreProtocol {
|
|
|
102
130
|
});
|
|
103
131
|
}
|
|
104
132
|
|
|
105
|
-
private static
|
|
106
|
-
if (message.encryption
|
|
133
|
+
private static verifyInlineWrappedGrantKeyDelivery(message: RecordsWriteMessage): void {
|
|
134
|
+
if (message.encryption !== undefined) {
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
if (message.descriptor.dataSize > DwnConstant.maxDataSizeAllowedToBeEncoded) {
|
|
139
|
+
throw new DwnError(
|
|
140
|
+
DwnErrorCode.EncryptionProtocolValidateEncryptedDeliveryMissingEncryption,
|
|
141
|
+
'plaintext grantKey records must carry an inline wrapped grantKey envelope.'
|
|
142
|
+
);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
private static verifyGrantKeyDelivery(message: RecordsWriteMessage, dataBytes: Uint8Array): void {
|
|
147
|
+
if (message.encryption !== undefined) {
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
try {
|
|
152
|
+
const envelope = Encoder.bytesToObject(dataBytes);
|
|
153
|
+
assertWrappedGrantKeyEnvelope(envelope);
|
|
154
|
+
} catch (error) {
|
|
155
|
+
if (error instanceof DwnError) {
|
|
156
|
+
throw error;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
107
160
|
throw new DwnError(
|
|
108
161
|
DwnErrorCode.EncryptionProtocolValidateEncryptedDeliveryMissingEncryption,
|
|
109
|
-
`${message.descriptor.protocolPath} records must be encrypted
|
|
162
|
+
`${message.descriptor.protocolPath} records must be encrypted or carry a valid wrapped grantKey envelope: ${detail}`
|
|
110
163
|
);
|
|
111
164
|
}
|
|
112
165
|
}
|