@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.
Files changed (28) hide show
  1. package/dist/browser.mjs +1 -1
  2. package/dist/browser.mjs.map +4 -4
  3. package/dist/esm/generated/precompiled-validators.js +319 -0
  4. package/dist/esm/generated/precompiled-validators.js.map +1 -1
  5. package/dist/esm/src/core/dwn-error.js +1 -0
  6. package/dist/esm/src/core/dwn-error.js.map +1 -1
  7. package/dist/esm/src/index.js +1 -1
  8. package/dist/esm/src/index.js.map +1 -1
  9. package/dist/esm/src/protocols/encryption.js +38 -6
  10. package/dist/esm/src/protocols/encryption.js.map +1 -1
  11. package/dist/esm/tests/protocols/encryption.spec.js +94 -3
  12. package/dist/esm/tests/protocols/encryption.spec.js.map +1 -1
  13. package/dist/esm/tests/validation/json-schemas/encryption/wrapped-grant-key-envelope.spec.js +43 -0
  14. package/dist/esm/tests/validation/json-schemas/encryption/wrapped-grant-key-envelope.spec.js.map +1 -0
  15. package/dist/types/generated/precompiled-validators.d.ts +16 -0
  16. package/dist/types/generated/precompiled-validators.d.ts.map +1 -1
  17. package/dist/types/src/core/dwn-error.d.ts +1 -0
  18. package/dist/types/src/core/dwn-error.d.ts.map +1 -1
  19. package/dist/types/src/index.d.ts +2 -1
  20. package/dist/types/src/index.d.ts.map +1 -1
  21. package/dist/types/src/protocols/encryption.d.ts +15 -2
  22. package/dist/types/src/protocols/encryption.d.ts.map +1 -1
  23. package/dist/types/tests/validation/json-schemas/encryption/wrapped-grant-key-envelope.spec.d.ts +2 -0
  24. package/dist/types/tests/validation/json-schemas/encryption/wrapped-grant-key-envelope.spec.d.ts.map +1 -0
  25. package/package.json +1 -1
  26. package/src/core/dwn-error.ts +1 -0
  27. package/src/index.ts +2 -1
  28. 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;AASjF,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,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;mBAY3E,kBAAkB;IA0BvC,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAStC,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"}
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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=wrapped-grant-key-envelope.spec.d.ts.map
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@enbox/dwn-sdk-js",
3
- "version": "0.4.7",
3
+ "version": "0.4.8",
4
4
  "description": "A reference implementation of https://identity.foundation/decentralized-web-node/spec/",
5
5
  "repository": {
6
6
  "type": "git",
@@ -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, _dataBytes: Uint8Array): Promise<void> {
95
+ public async validateRecord(message: RecordsWriteMessage, dataBytes: Uint8Array): Promise<void> {
68
96
  if (message.descriptor.protocolPath === EncryptionProtocol.grantKeyPath) {
69
- EncryptionProtocol.verifyEncryptedDelivery(message);
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.verifyEncryptedDelivery(message);
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 verifyEncryptedDelivery(message: RecordsWriteMessage): void {
106
- if (message.encryption === undefined) {
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
  }