@midnight-ntwrk/credential-compact 0.3.0-rc1 → 0.3.0

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/CHANGELOG.md CHANGED
@@ -2,6 +2,14 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 0.3.0 - 2026-10-01
6
+
7
+ - Keep the repository's pnpm requirement development-only so published Compact
8
+ consumers are not coupled to this monorepo's package manager.
9
+ - BREAKING: Make typed Compact payload decoding fail closed unless descriptor
10
+ re-encoding reproduces the exact payload, rejecting alternate zero-padded
11
+ chunk widths and lossy descriptor round trips while preserving untyped chunk
12
+ framing.
5
13
  - Add the supported explicit-holder presentation-proof composition, including
6
14
  credential-to-presentation holder equality, signer-reference and accepted-key
7
15
  binding, internally derived body-root verification, and substitution-negative
package/README.md CHANGED
@@ -8,6 +8,21 @@ Supported pre-1.0 package for reusable, family-neutral Compact VC/VP
8
8
  semantics. This is a library include surface, not a deployable contract,
9
9
  credential family, proof artifact, or registry authority.
10
10
 
11
+ ## Install
12
+
13
+ ```bash
14
+ pnpm add -E @midnight-ntwrk/credential-compact@0.2.0
15
+ ```
16
+
17
+ `0.2.0` is the current stable release. To evaluate the current 0.3 release
18
+ candidate explicitly, install
19
+ `@midnight-ntwrk/credential-compact@0.3.0-rc1` and keep every package in the
20
+ VC graph on that same version. Confirm the moving `rc` tag before adopting it:
21
+
22
+ ```bash
23
+ npm view @midnight-ntwrk/credential-compact dist-tags --json
24
+ ```
25
+
11
26
  ## Scope
12
27
 
13
28
  The package contains generic VC/VP envelopes, schema references, issuer and
@@ -95,3 +110,34 @@ the repository's npm publication runbook.
95
110
  Consumers must use the package name and explicit exports, never repository
96
111
  relative includes or `src`/`managed` paths. Candidate tarball and clean-consumer
97
112
  checks compile every advertised Compact entrypoint outside this repository.
113
+
114
+ ## TypeScript value framing
115
+
116
+ The TypeScript export encodes and decodes canonical Compact runtime values for
117
+ transport or storage. Typed application payloads should use
118
+ `encodeCompactPayload` and `decodeCompactPayload` with the generated descriptor
119
+ for that type.
120
+
121
+ ```ts
122
+ import {
123
+ decodeCompactValue,
124
+ encodeCompactValue,
125
+ } from "@midnight-ntwrk/credential-compact";
126
+
127
+ const encoded = encodeCompactValue([Uint8Array.of(1, 2, 3)]);
128
+ const decoded = decodeCompactValue(encoded);
129
+ ```
130
+
131
+ ## Compatibility and support
132
+
133
+ - The TypeScript surface is ESM-only and supports Node.js 24 or newer.
134
+ - Compact consumers use compiler `0.31.1`, runtime `0.16.0`, and Ledger
135
+ `8.0.2`.
136
+ - During `0.x`, breaking API changes may ship in a minor release. Keep exact
137
+ versions pinned and read [`CHANGELOG.md`](./CHANGELOG.md) before upgrading.
138
+ - Release candidates are supported only until a newer candidate or stable
139
+ release in the same minor line is published.
140
+
141
+ Technical ownership belongs to `@midnightntwrk/ex-identus`. Release operations
142
+ belong to `@midnightntwrk/mn-sre`. Security reports follow the repository
143
+ [`SECURITY.md`](../../../SECURITY.md) process.
@@ -6,7 +6,7 @@
6
6
  "version": "0.16.0"
7
7
  },
8
8
  "sourceDigest": "3a2e6360bfce9c9d182bee43b852347ae5ec3395c5e2ec0726a39b3c137d03dd",
9
- "artifactDigest": "9615f24e1497d911225fb6452afdcddfccf152923634ec1d71c704e7108c2cf4",
9
+ "artifactDigest": "ea1cda2a6f0c0c7b113d8f6caf72da6dd06611b6cfca8dbf934b501a69fbff0d",
10
10
  "sourceFiles": [
11
11
  "src/credentials/composable.compact",
12
12
  "src/credentials/holder-bindings.compact",
@@ -1 +1 @@
1
- {"version":3,"file":"compact-value-codec.d.ts","sourceRoot":"","sources":["../src/compact-value-codec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,iCAAiC,CAAC;AAE1E,eAAO,MAAM,sBAAsB,EAAG,4BAAqC,CAAC;AAS5E,MAAM,MAAM,oBAAoB,GAAG,OAAO,sBAAsB,CAAC;AAEjE,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IACxC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,CAAC;AAgFF,eAAO,MAAM,mBAAmB,GAC9B,OAAO,SAAS,UAAU,EAAE,KAC3B,UAiBF,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,OAAO,UAAU,KAAG,KAyBzD,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAC7B,OAAO,SAAS,UAAU,EAAE,KAC3B,mBAGD,CAAC;AAEH,eAAO,MAAM,kBAAkB,GAAI,SAAS,mBAAmB,KAAG,KAKjE,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,CAAC,EACpC,YAAY,WAAW,CAAC,CAAC,CAAC,EAC1B,OAAO,CAAC,KACP,mBAAoE,CAAC;AAExE,eAAO,MAAM,oBAAoB,GAAI,CAAC,EACpC,YAAY,WAAW,CAAC,CAAC,CAAC,EAC1B,SAAS,mBAAmB,KAC3B,CASF,CAAC"}
1
+ {"version":3,"file":"compact-value-codec.d.ts","sourceRoot":"","sources":["../src/compact-value-codec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,iCAAiC,CAAC;AAE1E,eAAO,MAAM,sBAAsB,EAAG,4BAAqC,CAAC;AAS5E,MAAM,MAAM,oBAAoB,GAAG,OAAO,sBAAsB,CAAC;AAEjE,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IACxC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,CAAC;AAgFF,eAAO,MAAM,mBAAmB,GAC9B,OAAO,SAAS,UAAU,EAAE,KAC3B,UAiBF,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,OAAO,UAAU,KAAG,KAyBzD,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAC7B,OAAO,SAAS,UAAU,EAAE,KAC3B,mBAGD,CAAC;AAEH,eAAO,MAAM,kBAAkB,GAAI,SAAS,mBAAmB,KAAG,KAKjE,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,CAAC,EACpC,YAAY,WAAW,CAAC,CAAC,CAAC,EAC1B,OAAO,CAAC,KACP,mBAAoE,CAAC;AAExE,eAAO,MAAM,oBAAoB,GAAI,CAAC,EACpC,YAAY,WAAW,CAAC,CAAC,CAAC,EAC1B,SAAS,mBAAmB,KAC3B,CAYF,CAAC"}
@@ -130,6 +130,9 @@ export const decodeCompactPayload = (descriptor, encoded) => {
130
130
  if (runtimeValue.length !== 0) {
131
131
  throw new Error("Compact value payload contains trailing chunks for descriptor");
132
132
  }
133
+ if (encodeCompactPayload(descriptor, decoded).payload !== encoded.payload) {
134
+ throw new Error("Compact value payload is not canonical for descriptor");
135
+ }
133
136
  return decoded;
134
137
  };
135
138
  //# sourceMappingURL=compact-value-codec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"compact-value-codec.js","sourceRoot":"","sources":["../src/compact-value-codec.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CompactType, Value } from \"@midnight-ntwrk/compact-runtime\";\n\nexport const COMPACT_VALUE_ENCODING = \"compact-value-v1.base64url\" as const;\n\nconst MAGIC = new Uint8Array([0x4d, 0x43, 0x56, 0x31]); // MCV1\nconst HEADER_LENGTH = MAGIC.length + 4;\nconst CHUNK_LENGTH_BYTES = 4;\nconst BASE64URL_ALPHABET =\n \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\";\nconst BASE64URL_TEXT = /^[A-Za-z0-9_-]+$/u;\n\nexport type CompactValueEncoding = typeof COMPACT_VALUE_ENCODING;\n\nexport type EncodedCompactValue = {\n readonly encoding: CompactValueEncoding;\n readonly payload: string;\n};\n\nconst assertUint32 = (value: number, label: string): void => {\n if (!Number.isInteger(value) || value < 0 || value > 0xffffffff) {\n throw new Error(`${label} must fit into uint32`);\n }\n};\n\nconst writeUint32 = (\n target: Uint8Array,\n offset: number,\n value: number,\n): void => {\n assertUint32(value, \"uint32 value\");\n target[offset] = (value >>> 24) & 0xff;\n target[offset + 1] = (value >>> 16) & 0xff;\n target[offset + 2] = (value >>> 8) & 0xff;\n target[offset + 3] = value & 0xff;\n};\n\nconst readUint32 = (source: Uint8Array, offset: number): number => {\n if (offset + CHUNK_LENGTH_BYTES > source.length) {\n throw new Error(\"Compact value payload ended before uint32 field\");\n }\n return (\n source[offset] * 0x1000000 +\n ((source[offset + 1] ?? 0) << 16) +\n ((source[offset + 2] ?? 0) << 8) +\n (source[offset + 3] ?? 0)\n );\n};\n\nconst toBase64Url = (bytes: Uint8Array): string => {\n let encoded = \"\";\n for (let offset = 0; offset < bytes.length; offset += 3) {\n const first = bytes[offset] ?? 0;\n const second = bytes[offset + 1] ?? 0;\n const third = bytes[offset + 2] ?? 0;\n const packed = (first << 16) | (second << 8) | third;\n encoded += BASE64URL_ALPHABET[(packed >>> 18) & 0x3f];\n encoded += BASE64URL_ALPHABET[(packed >>> 12) & 0x3f];\n if (offset + 1 < bytes.length) {\n encoded += BASE64URL_ALPHABET[(packed >>> 6) & 0x3f];\n }\n if (offset + 2 < bytes.length) {\n encoded += BASE64URL_ALPHABET[packed & 0x3f];\n }\n }\n return encoded;\n};\n\nconst fromBase64Url = (value: string): Uint8Array => {\n if (value.length === 0) {\n throw new Error(\"Compact value payload must not be empty\");\n }\n if (!BASE64URL_TEXT.test(value) || value.length % 4 === 1) {\n throw new Error(\"Compact value payload is not valid unpadded base64url\");\n }\n const decoded = new Uint8Array(Math.floor((value.length * 6) / 8));\n let accumulator = 0;\n let bitCount = 0;\n let outputOffset = 0;\n for (const character of value) {\n const index = BASE64URL_ALPHABET.indexOf(character);\n accumulator = (accumulator << 6) | index;\n bitCount += 6;\n if (bitCount >= 8) {\n bitCount -= 8;\n decoded[outputOffset] = (accumulator >>> bitCount) & 0xff;\n outputOffset += 1;\n }\n }\n if (toBase64Url(decoded) !== value) {\n throw new Error(\n \"Compact value payload is not canonical unpadded base64url\",\n );\n }\n return decoded;\n};\n\nexport const compactValueToBytes = (\n value: readonly Uint8Array[],\n): Uint8Array => {\n assertUint32(value.length, \"Compact value chunk count\");\n const bodyLength = value.reduce((total, chunk) => {\n assertUint32(chunk.length, \"Compact value chunk length\");\n return total + CHUNK_LENGTH_BYTES + chunk.length;\n }, 0);\n const result = new Uint8Array(HEADER_LENGTH + bodyLength);\n result.set(MAGIC, 0);\n writeUint32(result, MAGIC.length, value.length);\n let offset = HEADER_LENGTH;\n for (const chunk of value) {\n writeUint32(result, offset, chunk.length);\n offset += CHUNK_LENGTH_BYTES;\n result.set(chunk, offset);\n offset += chunk.length;\n }\n return result;\n};\n\nexport const compactValueFromBytes = (bytes: Uint8Array): Value => {\n if (bytes.length < HEADER_LENGTH) {\n throw new Error(\"Compact value payload is shorter than the header\");\n }\n for (let i = 0; i < MAGIC.length; i += 1) {\n if (bytes[i] !== MAGIC[i]) {\n throw new Error(\"Compact value payload has an unexpected magic header\");\n }\n }\n const chunkCount = readUint32(bytes, MAGIC.length);\n const chunks: Uint8Array[] = [];\n let offset = HEADER_LENGTH;\n for (let i = 0; i < chunkCount; i += 1) {\n const length = readUint32(bytes, offset);\n offset += CHUNK_LENGTH_BYTES;\n if (offset + length > bytes.length) {\n throw new Error(\"Compact value chunk exceeds payload length\");\n }\n chunks.push(bytes.slice(offset, offset + length));\n offset += length;\n }\n if (offset !== bytes.length) {\n throw new Error(\"Compact value payload contains trailing bytes\");\n }\n return chunks;\n};\n\nexport const encodeCompactValue = (\n value: readonly Uint8Array[],\n): EncodedCompactValue => ({\n encoding: COMPACT_VALUE_ENCODING,\n payload: toBase64Url(compactValueToBytes(value)),\n});\n\nexport const decodeCompactValue = (encoded: EncodedCompactValue): Value => {\n if (encoded.encoding !== COMPACT_VALUE_ENCODING) {\n throw new Error(`Unsupported Compact value encoding \"${encoded.encoding}\"`);\n }\n return compactValueFromBytes(fromBase64Url(encoded.payload));\n};\n\nexport const encodeCompactPayload = <T>(\n descriptor: CompactType<T>,\n value: T,\n): EncodedCompactValue => encodeCompactValue(descriptor.toValue(value));\n\nexport const decodeCompactPayload = <T>(\n descriptor: CompactType<T>,\n encoded: EncodedCompactValue,\n): T => {\n const runtimeValue = decodeCompactValue(encoded);\n const decoded = descriptor.fromValue(runtimeValue);\n if (runtimeValue.length !== 0) {\n throw new Error(\n \"Compact value payload contains trailing chunks for descriptor\",\n );\n }\n return decoded;\n};\n"]}
1
+ {"version":3,"file":"compact-value-codec.js","sourceRoot":"","sources":["../src/compact-value-codec.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,sBAAsB,GAAG,4BAAqC,CAAC;AAE5E,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO;AAC/D,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;AACvC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAC7B,MAAM,kBAAkB,GACtB,kEAAkE,CAAC;AACrE,MAAM,cAAc,GAAG,mBAAmB,CAAC;AAS3C,MAAM,YAAY,GAAG,CAAC,KAAa,EAAE,KAAa,EAAQ,EAAE;IAC1D,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,UAAU,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,uBAAuB,CAAC,CAAC;IACnD,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAClB,MAAkB,EAClB,MAAc,EACd,KAAa,EACP,EAAE;IACR,YAAY,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;IACpC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IACvC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IAC3C,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC;IAC1C,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC;AACpC,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,MAAkB,EAAE,MAAc,EAAU,EAAE;IAChE,IAAI,MAAM,GAAG,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,CACL,MAAM,CAAC,MAAM,CAAC,GAAG,SAAS;QAC1B,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QACjC,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAC1B,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,KAAiB,EAAU,EAAE;IAChD,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC;QACxD,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC;QACrD,OAAO,IAAI,kBAAkB,CAAC,CAAC,MAAM,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QACtD,OAAO,IAAI,kBAAkB,CAAC,CAAC,MAAM,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QACtD,IAAI,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAC9B,OAAO,IAAI,kBAAkB,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACvD,CAAC;QACD,IAAI,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAC9B,OAAO,IAAI,kBAAkB,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,KAAa,EAAc,EAAE;IAClD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACnE,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,KAAK,MAAM,SAAS,IAAI,KAAK,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,kBAAkB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACpD,WAAW,GAAG,CAAC,WAAW,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC;QACzC,QAAQ,IAAI,CAAC,CAAC;QACd,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;YAClB,QAAQ,IAAI,CAAC,CAAC;YACd,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,KAAK,QAAQ,CAAC,GAAG,IAAI,CAAC;YAC1D,YAAY,IAAI,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IACD,IAAI,WAAW,CAAC,OAAO,CAAC,KAAK,KAAK,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CACb,2DAA2D,CAC5D,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,KAA4B,EAChB,EAAE;IACd,YAAY,CAAC,KAAK,CAAC,MAAM,EAAE,2BAA2B,CAAC,CAAC;IACxD,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAC/C,YAAY,CAAC,KAAK,CAAC,MAAM,EAAE,4BAA4B,CAAC,CAAC;QACzD,OAAO,KAAK,GAAG,kBAAkB,GAAG,KAAK,CAAC,MAAM,CAAC;IACnD,CAAC,EAAE,CAAC,CAAC,CAAC;IACN,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,aAAa,GAAG,UAAU,CAAC,CAAC;IAC1D,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACrB,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAChD,IAAI,MAAM,GAAG,aAAa,CAAC;IAC3B,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;QAC1B,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,IAAI,kBAAkB,CAAC;QAC7B,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC;IACzB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,KAAiB,EAAS,EAAE;IAChE,IAAI,KAAK,CAAC,MAAM,GAAG,aAAa,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IACD,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACnD,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,IAAI,MAAM,GAAG,aAAa,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACzC,MAAM,IAAI,kBAAkB,CAAC;QAC7B,IAAI,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC;QAClD,MAAM,IAAI,MAAM,CAAC;IACnB,CAAC;IACD,IAAI,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,KAA4B,EACP,EAAE,CAAC,CAAC;IACzB,QAAQ,EAAE,sBAAsB;IAChC,OAAO,EAAE,WAAW,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;CACjD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,OAA4B,EAAS,EAAE;IACxE,IAAI,OAAO,CAAC,QAAQ,KAAK,sBAAsB,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,uCAAuC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,qBAAqB,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;AAC/D,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,UAA0B,EAC1B,KAAQ,EACa,EAAE,CAAC,kBAAkB,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AAExE,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,UAA0B,EAC1B,OAA4B,EACzB,EAAE;IACL,MAAM,YAAY,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACnD,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CACb,+DAA+D,CAChE,CAAC;IACJ,CAAC;IACD,IAAI,oBAAoB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC;QAC1E,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC","sourcesContent":["import type { CompactType, Value } from \"@midnight-ntwrk/compact-runtime\";\n\nexport const COMPACT_VALUE_ENCODING = \"compact-value-v1.base64url\" as const;\n\nconst MAGIC = new Uint8Array([0x4d, 0x43, 0x56, 0x31]); // MCV1\nconst HEADER_LENGTH = MAGIC.length + 4;\nconst CHUNK_LENGTH_BYTES = 4;\nconst BASE64URL_ALPHABET =\n \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\";\nconst BASE64URL_TEXT = /^[A-Za-z0-9_-]+$/u;\n\nexport type CompactValueEncoding = typeof COMPACT_VALUE_ENCODING;\n\nexport type EncodedCompactValue = {\n readonly encoding: CompactValueEncoding;\n readonly payload: string;\n};\n\nconst assertUint32 = (value: number, label: string): void => {\n if (!Number.isInteger(value) || value < 0 || value > 0xffffffff) {\n throw new Error(`${label} must fit into uint32`);\n }\n};\n\nconst writeUint32 = (\n target: Uint8Array,\n offset: number,\n value: number,\n): void => {\n assertUint32(value, \"uint32 value\");\n target[offset] = (value >>> 24) & 0xff;\n target[offset + 1] = (value >>> 16) & 0xff;\n target[offset + 2] = (value >>> 8) & 0xff;\n target[offset + 3] = value & 0xff;\n};\n\nconst readUint32 = (source: Uint8Array, offset: number): number => {\n if (offset + CHUNK_LENGTH_BYTES > source.length) {\n throw new Error(\"Compact value payload ended before uint32 field\");\n }\n return (\n source[offset] * 0x1000000 +\n ((source[offset + 1] ?? 0) << 16) +\n ((source[offset + 2] ?? 0) << 8) +\n (source[offset + 3] ?? 0)\n );\n};\n\nconst toBase64Url = (bytes: Uint8Array): string => {\n let encoded = \"\";\n for (let offset = 0; offset < bytes.length; offset += 3) {\n const first = bytes[offset] ?? 0;\n const second = bytes[offset + 1] ?? 0;\n const third = bytes[offset + 2] ?? 0;\n const packed = (first << 16) | (second << 8) | third;\n encoded += BASE64URL_ALPHABET[(packed >>> 18) & 0x3f];\n encoded += BASE64URL_ALPHABET[(packed >>> 12) & 0x3f];\n if (offset + 1 < bytes.length) {\n encoded += BASE64URL_ALPHABET[(packed >>> 6) & 0x3f];\n }\n if (offset + 2 < bytes.length) {\n encoded += BASE64URL_ALPHABET[packed & 0x3f];\n }\n }\n return encoded;\n};\n\nconst fromBase64Url = (value: string): Uint8Array => {\n if (value.length === 0) {\n throw new Error(\"Compact value payload must not be empty\");\n }\n if (!BASE64URL_TEXT.test(value) || value.length % 4 === 1) {\n throw new Error(\"Compact value payload is not valid unpadded base64url\");\n }\n const decoded = new Uint8Array(Math.floor((value.length * 6) / 8));\n let accumulator = 0;\n let bitCount = 0;\n let outputOffset = 0;\n for (const character of value) {\n const index = BASE64URL_ALPHABET.indexOf(character);\n accumulator = (accumulator << 6) | index;\n bitCount += 6;\n if (bitCount >= 8) {\n bitCount -= 8;\n decoded[outputOffset] = (accumulator >>> bitCount) & 0xff;\n outputOffset += 1;\n }\n }\n if (toBase64Url(decoded) !== value) {\n throw new Error(\n \"Compact value payload is not canonical unpadded base64url\",\n );\n }\n return decoded;\n};\n\nexport const compactValueToBytes = (\n value: readonly Uint8Array[],\n): Uint8Array => {\n assertUint32(value.length, \"Compact value chunk count\");\n const bodyLength = value.reduce((total, chunk) => {\n assertUint32(chunk.length, \"Compact value chunk length\");\n return total + CHUNK_LENGTH_BYTES + chunk.length;\n }, 0);\n const result = new Uint8Array(HEADER_LENGTH + bodyLength);\n result.set(MAGIC, 0);\n writeUint32(result, MAGIC.length, value.length);\n let offset = HEADER_LENGTH;\n for (const chunk of value) {\n writeUint32(result, offset, chunk.length);\n offset += CHUNK_LENGTH_BYTES;\n result.set(chunk, offset);\n offset += chunk.length;\n }\n return result;\n};\n\nexport const compactValueFromBytes = (bytes: Uint8Array): Value => {\n if (bytes.length < HEADER_LENGTH) {\n throw new Error(\"Compact value payload is shorter than the header\");\n }\n for (let i = 0; i < MAGIC.length; i += 1) {\n if (bytes[i] !== MAGIC[i]) {\n throw new Error(\"Compact value payload has an unexpected magic header\");\n }\n }\n const chunkCount = readUint32(bytes, MAGIC.length);\n const chunks: Uint8Array[] = [];\n let offset = HEADER_LENGTH;\n for (let i = 0; i < chunkCount; i += 1) {\n const length = readUint32(bytes, offset);\n offset += CHUNK_LENGTH_BYTES;\n if (offset + length > bytes.length) {\n throw new Error(\"Compact value chunk exceeds payload length\");\n }\n chunks.push(bytes.slice(offset, offset + length));\n offset += length;\n }\n if (offset !== bytes.length) {\n throw new Error(\"Compact value payload contains trailing bytes\");\n }\n return chunks;\n};\n\nexport const encodeCompactValue = (\n value: readonly Uint8Array[],\n): EncodedCompactValue => ({\n encoding: COMPACT_VALUE_ENCODING,\n payload: toBase64Url(compactValueToBytes(value)),\n});\n\nexport const decodeCompactValue = (encoded: EncodedCompactValue): Value => {\n if (encoded.encoding !== COMPACT_VALUE_ENCODING) {\n throw new Error(`Unsupported Compact value encoding \"${encoded.encoding}\"`);\n }\n return compactValueFromBytes(fromBase64Url(encoded.payload));\n};\n\nexport const encodeCompactPayload = <T>(\n descriptor: CompactType<T>,\n value: T,\n): EncodedCompactValue => encodeCompactValue(descriptor.toValue(value));\n\nexport const decodeCompactPayload = <T>(\n descriptor: CompactType<T>,\n encoded: EncodedCompactValue,\n): T => {\n const runtimeValue = decodeCompactValue(encoded);\n const decoded = descriptor.fromValue(runtimeValue);\n if (runtimeValue.length !== 0) {\n throw new Error(\n \"Compact value payload contains trailing chunks for descriptor\",\n );\n }\n if (encodeCompactPayload(descriptor, decoded).payload !== encoded.payload) {\n throw new Error(\"Compact value payload is not canonical for descriptor\");\n }\n return decoded;\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@midnight-ntwrk/credential-compact",
3
- "version": "0.3.0-rc1",
3
+ "version": "0.3.0",
4
4
  "description": "Family-neutral Compact VC and VP semantics",
5
5
  "license": "Apache-2.0",
6
6
  "private": false,
@@ -24,8 +24,7 @@
24
24
  ],
25
25
  "sideEffects": [],
26
26
  "engines": {
27
- "node": ">=24",
28
- "pnpm": ">=10.34.5"
27
+ "node": ">=24"
29
28
  },
30
29
  "main": "dist/index.js",
31
30
  "module": "dist/index.js",
@@ -42,6 +41,9 @@
42
41
  "dependencies": {
43
42
  "@midnight-ntwrk/compact-runtime": "0.16.0"
44
43
  },
44
+ "devDependencies": {
45
+ "fast-check": "^4.10.2"
46
+ },
45
47
  "files": [
46
48
  "dist/**",
47
49
  "README.md",