@peac/crypto 0.10.6 → 0.10.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.
@@ -1,21 +1,37 @@
1
1
  /**
2
2
  * Base64url encoding/decoding (RFC 4648 §5)
3
- * Used for JWS compact serialization
3
+ *
4
+ * Platform-agnostic implementation that works in Node.js, browser, and edge runtimes.
5
+ * No Buffer dependency - uses pure JavaScript for maximum portability.
6
+ *
7
+ * @packageDocumentation
4
8
  */
5
9
  /**
6
10
  * Encode bytes to base64url string (no padding)
11
+ *
12
+ * @param bytes - Byte array to encode
13
+ * @returns Base64url encoded string (no padding)
7
14
  */
8
15
  export declare function base64urlEncode(bytes: Uint8Array): string;
9
16
  /**
10
17
  * Decode base64url string to bytes
18
+ *
19
+ * @param str - Base64url encoded string
20
+ * @returns Decoded bytes
11
21
  */
12
22
  export declare function base64urlDecode(str: string): Uint8Array;
13
23
  /**
14
24
  * Encode UTF-8 string to base64url
25
+ *
26
+ * @param str - UTF-8 string to encode
27
+ * @returns Base64url encoded string
15
28
  */
16
29
  export declare function base64urlEncodeString(str: string): string;
17
30
  /**
18
31
  * Decode base64url to UTF-8 string
32
+ *
33
+ * @param str - Base64url encoded string
34
+ * @returns Decoded UTF-8 string
19
35
  */
20
36
  export declare function base64urlDecodeString(str: string): string;
21
37
  //# sourceMappingURL=base64url.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"base64url.d.ts","sourceRoot":"","sources":["../src/base64url.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAGzD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAYvD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEzD"}
1
+ {"version":3,"file":"base64url.d.ts","sourceRoot":"","sources":["../src/base64url.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAkBH;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAmBzD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CA4BvD;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEzD"}
package/dist/base64url.js CHANGED
@@ -1,42 +1,96 @@
1
1
  "use strict";
2
2
  /**
3
3
  * Base64url encoding/decoding (RFC 4648 §5)
4
- * Used for JWS compact serialization
4
+ *
5
+ * Platform-agnostic implementation that works in Node.js, browser, and edge runtimes.
6
+ * No Buffer dependency - uses pure JavaScript for maximum portability.
7
+ *
8
+ * @packageDocumentation
5
9
  */
6
10
  Object.defineProperty(exports, "__esModule", { value: true });
7
11
  exports.base64urlEncode = base64urlEncode;
8
12
  exports.base64urlDecode = base64urlDecode;
9
13
  exports.base64urlEncodeString = base64urlEncodeString;
10
14
  exports.base64urlDecodeString = base64urlDecodeString;
15
+ // Standard base64 alphabet
16
+ const BASE64_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
17
+ // Reverse lookup table (lazily initialized)
18
+ let base64Lookup = null;
19
+ function getBase64Lookup() {
20
+ if (!base64Lookup) {
21
+ base64Lookup = new Map();
22
+ for (let i = 0; i < BASE64_ALPHABET.length; i++) {
23
+ base64Lookup.set(BASE64_ALPHABET[i], i);
24
+ }
25
+ }
26
+ return base64Lookup;
27
+ }
11
28
  /**
12
29
  * Encode bytes to base64url string (no padding)
30
+ *
31
+ * @param bytes - Byte array to encode
32
+ * @returns Base64url encoded string (no padding)
13
33
  */
14
34
  function base64urlEncode(bytes) {
15
- const base64 = Buffer.from(bytes).toString('base64');
16
- return base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '');
35
+ let result = '';
36
+ let i = 0;
37
+ while (i < bytes.length) {
38
+ const a = bytes[i++];
39
+ const b = bytes[i++] ?? 0;
40
+ const c = bytes[i++] ?? 0;
41
+ const triplet = (a << 16) | (b << 8) | c;
42
+ result += BASE64_ALPHABET[(triplet >> 18) & 0x3f];
43
+ result += BASE64_ALPHABET[(triplet >> 12) & 0x3f];
44
+ result += i - 2 < bytes.length ? BASE64_ALPHABET[(triplet >> 6) & 0x3f] : '';
45
+ result += i - 1 < bytes.length ? BASE64_ALPHABET[triplet & 0x3f] : '';
46
+ }
47
+ // Convert to base64url (no padding)
48
+ return result.replace(/\+/g, '-').replace(/\//g, '_');
17
49
  }
18
50
  /**
19
51
  * Decode base64url string to bytes
52
+ *
53
+ * @param str - Base64url encoded string
54
+ * @returns Decoded bytes
20
55
  */
21
56
  function base64urlDecode(str) {
57
+ // Convert base64url to base64
58
+ let base64 = str.replace(/-/g, '+').replace(/_/g, '/');
22
59
  // Add padding if needed
23
- let padded = str;
24
- const mod = str.length % 4;
25
- if (mod > 0) {
26
- padded += '='.repeat(4 - mod);
60
+ while (base64.length % 4 !== 0) {
61
+ base64 += '=';
27
62
  }
28
- // Convert base64url to base64
29
- const base64 = padded.replace(/-/g, '+').replace(/_/g, '/');
30
- return new Uint8Array(Buffer.from(base64, 'base64'));
63
+ const lookup = getBase64Lookup();
64
+ const bytes = [];
65
+ for (let i = 0; i < base64.length; i += 4) {
66
+ const a = lookup.get(base64[i]) ?? 0;
67
+ const b = lookup.get(base64[i + 1]) ?? 0;
68
+ const c = lookup.get(base64[i + 2]) ?? 0;
69
+ const d = lookup.get(base64[i + 3]) ?? 0;
70
+ bytes.push((a << 2) | (b >> 4));
71
+ if (base64[i + 2] !== '=') {
72
+ bytes.push(((b & 0x0f) << 4) | (c >> 2));
73
+ }
74
+ if (base64[i + 3] !== '=') {
75
+ bytes.push(((c & 0x03) << 6) | d);
76
+ }
77
+ }
78
+ return new Uint8Array(bytes);
31
79
  }
32
80
  /**
33
81
  * Encode UTF-8 string to base64url
82
+ *
83
+ * @param str - UTF-8 string to encode
84
+ * @returns Base64url encoded string
34
85
  */
35
86
  function base64urlEncodeString(str) {
36
87
  return base64urlEncode(new TextEncoder().encode(str));
37
88
  }
38
89
  /**
39
90
  * Decode base64url to UTF-8 string
91
+ *
92
+ * @param str - Base64url encoded string
93
+ * @returns Decoded UTF-8 string
40
94
  */
41
95
  function base64urlDecodeString(str) {
42
96
  return new TextDecoder().decode(base64urlDecode(str));
@@ -1 +1 @@
1
- {"version":3,"file":"base64url.js","sourceRoot":"","sources":["../src/base64url.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAKH,0CAGC;AAKD,0CAYC;AAKD,sDAEC;AAKD,sDAEC;AArCD;;GAEG;AACH,SAAgB,eAAe,CAAC,KAAiB;IAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACrD,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAC1E,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe,CAAC,GAAW;IACzC,wBAAwB;IACxB,IAAI,MAAM,GAAG,GAAG,CAAC;IACjB,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3B,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;IAChC,CAAC;IAED,8BAA8B;IAC9B,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAE5D,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;AACvD,CAAC;AAED;;GAEG;AACH,SAAgB,qBAAqB,CAAC,GAAW;IAC/C,OAAO,eAAe,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,SAAgB,qBAAqB,CAAC,GAAW;IAC/C,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;AACxD,CAAC"}
1
+ {"version":3,"file":"base64url.js","sourceRoot":"","sources":["../src/base64url.ts"],"names":[],"mappings":"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"}
package/dist/hash.d.ts ADDED
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Cryptographic hash utilities
3
+ *
4
+ * Platform-agnostic SHA-256 implementation that works in Node.js, browser, and edge runtimes.
5
+ * Uses Web Crypto API with Node.js crypto fallback.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ /**
10
+ * Compute SHA-256 hash of data and return as lowercase hex string
11
+ *
12
+ * Uses Web Crypto API if available, falls back to Node.js crypto.
13
+ *
14
+ * @param data - Data to hash (Uint8Array or string)
15
+ * @returns Lowercase hex string (64 characters)
16
+ */
17
+ export declare function sha256Hex(data: Uint8Array | string): Promise<string>;
18
+ /**
19
+ * Compute SHA-256 hash of data and return as Uint8Array (32 bytes)
20
+ *
21
+ * @param data - Data to hash (Uint8Array or string)
22
+ * @returns Hash as Uint8Array (32 bytes)
23
+ */
24
+ export declare function sha256Bytes(data: Uint8Array | string): Promise<Uint8Array>;
25
+ /**
26
+ * Convert hex string to Uint8Array
27
+ *
28
+ * @param hex - Lowercase hex string
29
+ * @returns Uint8Array
30
+ */
31
+ export declare function hexToBytes(hex: string): Uint8Array;
32
+ /**
33
+ * Convert Uint8Array to lowercase hex string
34
+ *
35
+ * @param bytes - Byte array
36
+ * @returns Lowercase hex string
37
+ */
38
+ export declare function bytesToHex(bytes: Uint8Array): string;
39
+ /**
40
+ * JWK structure for Ed25519 public keys (minimal required fields for thumbprint)
41
+ */
42
+ export interface JWKThumbprintInput {
43
+ /** Key type - must be "OKP" for Ed25519 */
44
+ kty: string;
45
+ /** Curve - must be "Ed25519" */
46
+ crv: string;
47
+ /** Public key (base64url) */
48
+ x: string;
49
+ }
50
+ /**
51
+ * Compute RFC 7638 JWK Thumbprint (base64url, SHA-256)
52
+ *
53
+ * For Ed25519 keys, the canonical JSON is: {"crv":"Ed25519","kty":"OKP","x":"<base64url>"}
54
+ * Returns base64url-encoded SHA-256 hash (43 characters).
55
+ *
56
+ * @param jwk - JWK with kty, crv, x fields
57
+ * @returns Base64url-encoded SHA-256 thumbprint (43 characters)
58
+ */
59
+ export declare function computeJwkThumbprint(jwk: JWKThumbprintInput): Promise<string>;
60
+ /**
61
+ * Convert JWK to Ed25519 public key bytes (32 bytes)
62
+ *
63
+ * @param jwk - JWK with kty, crv, x fields
64
+ * @returns Public key as 32-byte Uint8Array
65
+ */
66
+ export declare function jwkToPublicKeyBytes(jwk: JWKThumbprintInput): Uint8Array;
67
+ //# sourceMappingURL=hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../src/hash.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH;;;;;;;GAOG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAqB1E;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAkBhF;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAalD;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAIpD;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,2CAA2C;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,gCAAgC;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,6BAA6B;IAC7B,CAAC,EAAE,MAAM,CAAC;CACX;AAED;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAcnF;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,kBAAkB,GAAG,UAAU,CAWvE"}
package/dist/hash.js ADDED
@@ -0,0 +1,171 @@
1
+ "use strict";
2
+ /**
3
+ * Cryptographic hash utilities
4
+ *
5
+ * Platform-agnostic SHA-256 implementation that works in Node.js, browser, and edge runtimes.
6
+ * Uses Web Crypto API with Node.js crypto fallback.
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ var desc = Object.getOwnPropertyDescriptor(m, k);
13
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
14
+ desc = { enumerable: true, get: function() { return m[k]; } };
15
+ }
16
+ Object.defineProperty(o, k2, desc);
17
+ }) : (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ o[k2] = m[k];
20
+ }));
21
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
22
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
23
+ }) : function(o, v) {
24
+ o["default"] = v;
25
+ });
26
+ var __importStar = (this && this.__importStar) || (function () {
27
+ var ownKeys = function(o) {
28
+ ownKeys = Object.getOwnPropertyNames || function (o) {
29
+ var ar = [];
30
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
31
+ return ar;
32
+ };
33
+ return ownKeys(o);
34
+ };
35
+ return function (mod) {
36
+ if (mod && mod.__esModule) return mod;
37
+ var result = {};
38
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
39
+ __setModuleDefault(result, mod);
40
+ return result;
41
+ };
42
+ })();
43
+ Object.defineProperty(exports, "__esModule", { value: true });
44
+ exports.sha256Hex = sha256Hex;
45
+ exports.sha256Bytes = sha256Bytes;
46
+ exports.hexToBytes = hexToBytes;
47
+ exports.bytesToHex = bytesToHex;
48
+ exports.computeJwkThumbprint = computeJwkThumbprint;
49
+ exports.jwkToPublicKeyBytes = jwkToPublicKeyBytes;
50
+ const base64url_js_1 = require("./base64url.js");
51
+ /**
52
+ * Compute SHA-256 hash of data and return as lowercase hex string
53
+ *
54
+ * Uses Web Crypto API if available, falls back to Node.js crypto.
55
+ *
56
+ * @param data - Data to hash (Uint8Array or string)
57
+ * @returns Lowercase hex string (64 characters)
58
+ */
59
+ async function sha256Hex(data) {
60
+ const bytes = typeof data === 'string' ? new TextEncoder().encode(data) : data;
61
+ // Try Web Crypto API first (works in browser, edge, and Node 20+)
62
+ if (typeof globalThis.crypto?.subtle?.digest === 'function') {
63
+ const hashBuffer = await globalThis.crypto.subtle.digest('SHA-256', bytes);
64
+ const hashArray = Array.from(new Uint8Array(hashBuffer));
65
+ return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');
66
+ }
67
+ // Fallback to Node.js crypto
68
+ try {
69
+ const { createHash } = await Promise.resolve().then(() => __importStar(require('crypto')));
70
+ const hash = createHash('sha256');
71
+ hash.update(bytes);
72
+ return hash.digest('hex');
73
+ }
74
+ catch {
75
+ throw new Error('No SHA-256 implementation available. Ensure Web Crypto API or Node.js crypto is available.');
76
+ }
77
+ }
78
+ /**
79
+ * Compute SHA-256 hash of data and return as Uint8Array (32 bytes)
80
+ *
81
+ * @param data - Data to hash (Uint8Array or string)
82
+ * @returns Hash as Uint8Array (32 bytes)
83
+ */
84
+ async function sha256Bytes(data) {
85
+ const bytes = typeof data === 'string' ? new TextEncoder().encode(data) : data;
86
+ // Try Web Crypto API first
87
+ if (typeof globalThis.crypto?.subtle?.digest === 'function') {
88
+ const hashBuffer = await globalThis.crypto.subtle.digest('SHA-256', bytes);
89
+ return new Uint8Array(hashBuffer);
90
+ }
91
+ // Fallback to Node.js crypto
92
+ try {
93
+ const { createHash } = await Promise.resolve().then(() => __importStar(require('crypto')));
94
+ const hash = createHash('sha256');
95
+ hash.update(bytes);
96
+ return new Uint8Array(hash.digest());
97
+ }
98
+ catch {
99
+ throw new Error('No SHA-256 implementation available.');
100
+ }
101
+ }
102
+ /**
103
+ * Convert hex string to Uint8Array
104
+ *
105
+ * @param hex - Lowercase hex string
106
+ * @returns Uint8Array
107
+ */
108
+ function hexToBytes(hex) {
109
+ // Validate: must be even length and contain only hex characters
110
+ if (hex.length % 2 !== 0 || !/^[0-9a-fA-F]*$/.test(hex)) {
111
+ throw new Error('Invalid hex string');
112
+ }
113
+ if (hex.length === 0) {
114
+ return new Uint8Array([]);
115
+ }
116
+ const matches = hex.match(/.{2}/g);
117
+ if (!matches) {
118
+ throw new Error('Invalid hex string');
119
+ }
120
+ return new Uint8Array(matches.map((byte) => parseInt(byte, 16)));
121
+ }
122
+ /**
123
+ * Convert Uint8Array to lowercase hex string
124
+ *
125
+ * @param bytes - Byte array
126
+ * @returns Lowercase hex string
127
+ */
128
+ function bytesToHex(bytes) {
129
+ return Array.from(bytes)
130
+ .map((b) => b.toString(16).padStart(2, '0'))
131
+ .join('');
132
+ }
133
+ /**
134
+ * Compute RFC 7638 JWK Thumbprint (base64url, SHA-256)
135
+ *
136
+ * For Ed25519 keys, the canonical JSON is: {"crv":"Ed25519","kty":"OKP","x":"<base64url>"}
137
+ * Returns base64url-encoded SHA-256 hash (43 characters).
138
+ *
139
+ * @param jwk - JWK with kty, crv, x fields
140
+ * @returns Base64url-encoded SHA-256 thumbprint (43 characters)
141
+ */
142
+ async function computeJwkThumbprint(jwk) {
143
+ if (jwk.kty !== 'OKP' || jwk.crv !== 'Ed25519') {
144
+ throw new Error('Only Ed25519 keys (OKP/Ed25519) are supported for thumbprint computation');
145
+ }
146
+ // Canonical JSON per RFC 7638 (alphabetically sorted members, no whitespace)
147
+ const canonical = JSON.stringify({
148
+ crv: jwk.crv,
149
+ kty: jwk.kty,
150
+ x: jwk.x,
151
+ });
152
+ const hashBytes = await sha256Bytes(canonical);
153
+ return (0, base64url_js_1.base64urlEncode)(hashBytes);
154
+ }
155
+ /**
156
+ * Convert JWK to Ed25519 public key bytes (32 bytes)
157
+ *
158
+ * @param jwk - JWK with kty, crv, x fields
159
+ * @returns Public key as 32-byte Uint8Array
160
+ */
161
+ function jwkToPublicKeyBytes(jwk) {
162
+ if (jwk.kty !== 'OKP' || jwk.crv !== 'Ed25519') {
163
+ throw new Error('Only Ed25519 keys (OKP/Ed25519) are supported');
164
+ }
165
+ const xBytes = (0, base64url_js_1.base64urlDecode)(jwk.x);
166
+ if (xBytes.length !== 32) {
167
+ throw new Error(`Ed25519 public key must be 32 bytes, got ${xBytes.length}`);
168
+ }
169
+ return xBytes;
170
+ }
171
+ //# sourceMappingURL=hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.js","sourceRoot":"","sources":["../src/hash.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,9 +1,16 @@
1
1
  /**
2
2
  * PEAC Protocol Crypto Package
3
- * Ed25519 JWS signing/verification and JSON Canonicalization (RFC 8785)
3
+ *
4
+ * Ed25519 JWS signing/verification, JSON Canonicalization (RFC 8785),
5
+ * and platform-agnostic cryptographic utilities.
6
+ *
7
+ * All primitives are runtime-agnostic (Node.js, browser, edge workers).
8
+ *
9
+ * @packageDocumentation
4
10
  */
5
11
  export * from './base64url';
6
12
  export * from './errors';
13
+ export * from './hash';
7
14
  export * from './jcs';
8
15
  export * from './jws';
9
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,OAAO,CAAC;AACtB,cAAc,OAAO,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,OAAO,CAAC;AACtB,cAAc,OAAO,CAAC"}
package/dist/index.js CHANGED
@@ -1,7 +1,13 @@
1
1
  "use strict";
2
2
  /**
3
3
  * PEAC Protocol Crypto Package
4
- * Ed25519 JWS signing/verification and JSON Canonicalization (RFC 8785)
4
+ *
5
+ * Ed25519 JWS signing/verification, JSON Canonicalization (RFC 8785),
6
+ * and platform-agnostic cryptographic utilities.
7
+ *
8
+ * All primitives are runtime-agnostic (Node.js, browser, edge workers).
9
+ *
10
+ * @packageDocumentation
5
11
  */
6
12
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
13
  if (k2 === undefined) k2 = k;
@@ -20,6 +26,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
20
26
  Object.defineProperty(exports, "__esModule", { value: true });
21
27
  __exportStar(require("./base64url"), exports);
22
28
  __exportStar(require("./errors"), exports);
29
+ __exportStar(require("./hash"), exports);
23
30
  __exportStar(require("./jcs"), exports);
24
31
  __exportStar(require("./jws"), exports);
25
32
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;AAEH,8CAA4B;AAC5B,2CAAyB;AACzB,wCAAsB;AACtB,wCAAsB"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;;;;;;;;;;;;;;AAEH,8CAA4B;AAC5B,2CAAyB;AACzB,yCAAuB;AACvB,wCAAsB;AACtB,wCAAsB"}
package/dist/jcs.d.ts CHANGED
@@ -1,9 +1,54 @@
1
1
  /**
2
2
  * JSON Canonicalization Scheme (RFC 8785)
3
3
  * Deterministic JSON serialization for cryptographic hashing
4
+ *
5
+ * PROTOCOL DECISION: JavaScript `undefined` Handling
6
+ * ===================================================
7
+ *
8
+ * RFC 8785 canonicalizes JSON values, and `undefined` is NOT a JSON value.
9
+ * This implementation adopts "JS-ergonomic" semantics that match JSON.stringify:
10
+ *
11
+ * 1. **Object properties with undefined values are OMITTED**
12
+ * - `canonicalize({a: 1, b: undefined})` -> `{"a":1}`
13
+ * - Matches: `JSON.stringify({a: 1, b: undefined})` -> `{"a":1}`
14
+ *
15
+ * 2. **Array elements that are undefined become null**
16
+ * - `canonicalize([1, undefined, 3])` -> `[1,null,3]`
17
+ * - Matches: `JSON.stringify([1, undefined, 3])` -> `[1,null,3]`
18
+ *
19
+ * 3. **Top-level undefined THROWS**
20
+ * - `canonicalize(undefined)` -> throws Error
21
+ * - Rationale: No valid JSON representation exists
22
+ *
23
+ * CROSS-LANGUAGE INTEROPERABILITY WARNING:
24
+ * =========================================
25
+ * Cross-language producers MUST NOT rely on "undefined" semantics. To achieve
26
+ * identical hashes across implementations, explicitly encode `null` in arrays
27
+ * and omit keys in objects. Other language implementations (Go, Rust, Python)
28
+ * will never produce `undefined` since it's JavaScript-specific.
29
+ *
30
+ * Guidelines:
31
+ * - Producers MUST emit explicit `null` or omit keys; do NOT rely on coercion
32
+ * - Verifiers SHOULD sanitize inputs before hashing (remove undefined properties)
33
+ * - The canonical output is identical whether you pass `{a: undefined}` or `{}`
34
+ *
35
+ * This behavior is NORMATIVE for PEAC hashing and MUST NOT change without
36
+ * a wire format version bump.
4
37
  */
5
38
  /**
6
- * Canonicalize a JSON value according to RFC 8785
39
+ * Canonicalize a JSON value according to RFC 8785.
40
+ *
41
+ * @param obj - The value to canonicalize. Must be a valid JSON type (null, boolean,
42
+ * number, string, array, object). Functions and Symbols throw.
43
+ * @returns Canonical JSON string with sorted keys and no whitespace.
44
+ * @throws Error if the value cannot be canonicalized (undefined at top level,
45
+ * non-finite numbers, functions, symbols).
46
+ *
47
+ * @example
48
+ * ```ts
49
+ * canonicalize({ b: 2, a: 1 }) // '{"a":1,"b":2}'
50
+ * canonicalize([1, null, "x"]) // '[1,null,"x"]'
51
+ * ```
7
52
  */
8
53
  export declare function canonicalize(obj: unknown): string;
9
54
  /**
package/dist/jcs.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"jcs.d.ts","sourceRoot":"","sources":["../src/jcs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CA8CjD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,CAG1D;AAED;;GAEG;AACH,wBAAsB,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAO3D"}
1
+ {"version":3,"file":"jcs.d.ts","sourceRoot":"","sources":["../src/jcs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAsDjD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,CAG1D;AAED;;GAEG;AACH,wBAAsB,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAO3D"}
package/dist/jcs.js CHANGED
@@ -2,13 +2,58 @@
2
2
  /**
3
3
  * JSON Canonicalization Scheme (RFC 8785)
4
4
  * Deterministic JSON serialization for cryptographic hashing
5
+ *
6
+ * PROTOCOL DECISION: JavaScript `undefined` Handling
7
+ * ===================================================
8
+ *
9
+ * RFC 8785 canonicalizes JSON values, and `undefined` is NOT a JSON value.
10
+ * This implementation adopts "JS-ergonomic" semantics that match JSON.stringify:
11
+ *
12
+ * 1. **Object properties with undefined values are OMITTED**
13
+ * - `canonicalize({a: 1, b: undefined})` -> `{"a":1}`
14
+ * - Matches: `JSON.stringify({a: 1, b: undefined})` -> `{"a":1}`
15
+ *
16
+ * 2. **Array elements that are undefined become null**
17
+ * - `canonicalize([1, undefined, 3])` -> `[1,null,3]`
18
+ * - Matches: `JSON.stringify([1, undefined, 3])` -> `[1,null,3]`
19
+ *
20
+ * 3. **Top-level undefined THROWS**
21
+ * - `canonicalize(undefined)` -> throws Error
22
+ * - Rationale: No valid JSON representation exists
23
+ *
24
+ * CROSS-LANGUAGE INTEROPERABILITY WARNING:
25
+ * =========================================
26
+ * Cross-language producers MUST NOT rely on "undefined" semantics. To achieve
27
+ * identical hashes across implementations, explicitly encode `null` in arrays
28
+ * and omit keys in objects. Other language implementations (Go, Rust, Python)
29
+ * will never produce `undefined` since it's JavaScript-specific.
30
+ *
31
+ * Guidelines:
32
+ * - Producers MUST emit explicit `null` or omit keys; do NOT rely on coercion
33
+ * - Verifiers SHOULD sanitize inputs before hashing (remove undefined properties)
34
+ * - The canonical output is identical whether you pass `{a: undefined}` or `{}`
35
+ *
36
+ * This behavior is NORMATIVE for PEAC hashing and MUST NOT change without
37
+ * a wire format version bump.
5
38
  */
6
39
  Object.defineProperty(exports, "__esModule", { value: true });
7
40
  exports.canonicalize = canonicalize;
8
41
  exports.canonicalizeBytes = canonicalizeBytes;
9
42
  exports.jcsHash = jcsHash;
10
43
  /**
11
- * Canonicalize a JSON value according to RFC 8785
44
+ * Canonicalize a JSON value according to RFC 8785.
45
+ *
46
+ * @param obj - The value to canonicalize. Must be a valid JSON type (null, boolean,
47
+ * number, string, array, object). Functions and Symbols throw.
48
+ * @returns Canonical JSON string with sorted keys and no whitespace.
49
+ * @throws Error if the value cannot be canonicalized (undefined at top level,
50
+ * non-finite numbers, functions, symbols).
51
+ *
52
+ * @example
53
+ * ```ts
54
+ * canonicalize({ b: 2, a: 1 }) // '{"a":1,"b":2}'
55
+ * canonicalize([1, null, "x"]) // '[1,null,"x"]'
56
+ * ```
12
57
  */
13
58
  function canonicalize(obj) {
14
59
  if (obj === null) {
@@ -37,16 +82,24 @@ function canonicalize(obj) {
37
82
  return JSON.stringify(obj);
38
83
  }
39
84
  if (Array.isArray(obj)) {
40
- const elements = obj.map(canonicalize);
85
+ // PROTOCOL DECISION: undefined in arrays becomes null (matches JSON.stringify)
86
+ // See module-level documentation for cross-language interoperability notes.
87
+ const elements = obj.map((el) => (el === undefined ? 'null' : canonicalize(el)));
41
88
  return `[${elements.join(',')}]`;
42
89
  }
43
90
  if (typeof obj === 'object') {
44
- // Sort keys lexicographically by UTF-16 code unit
91
+ // Sort keys lexicographically by UTF-16 code unit (RFC 8785 requirement)
45
92
  const keys = Object.keys(obj).sort();
46
- const pairs = keys.map((key) => {
93
+ const pairs = [];
94
+ for (const key of keys) {
47
95
  const value = obj[key];
48
- return `${JSON.stringify(key)}:${canonicalize(value)}`;
49
- });
96
+ // PROTOCOL DECISION: Skip undefined values (matches JSON.stringify)
97
+ // See module-level documentation for cross-language interoperability notes.
98
+ if (value === undefined) {
99
+ continue;
100
+ }
101
+ pairs.push(`${JSON.stringify(key)}:${canonicalize(value)}`);
102
+ }
50
103
  return `{${pairs.join(',')}}`;
51
104
  }
52
105
  throw new Error(`Cannot canonicalize type: ${typeof obj}`);
package/dist/jcs.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"jcs.js","sourceRoot":"","sources":["../src/jcs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"jcs.js","sourceRoot":"","sources":["../src/jcs.ts"],"names":[],"mappings":"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"}
package/dist/jws.d.ts CHANGED
@@ -55,4 +55,47 @@ export declare function generateKeypair(): Promise<{
55
55
  privateKey: Uint8Array;
56
56
  publicKey: Uint8Array;
57
57
  }>;
58
+ /**
59
+ * Ed25519 JWK interface for private keys
60
+ */
61
+ export interface Ed25519PrivateJwk {
62
+ kty: 'OKP';
63
+ crv: 'Ed25519';
64
+ /** Public key (base64url encoded, 32 bytes) */
65
+ x: string;
66
+ /** Private key (base64url encoded, 32 bytes) */
67
+ d: string;
68
+ }
69
+ /**
70
+ * Derive the Ed25519 public key from a private key
71
+ *
72
+ * @param privateKey - Ed25519 private key (32 bytes)
73
+ * @returns Public key (32 bytes)
74
+ */
75
+ export declare function derivePublicKey(privateKey: Uint8Array): Promise<Uint8Array>;
76
+ /**
77
+ * Validate that an Ed25519 JWK has a consistent keypair
78
+ *
79
+ * Derives the public key from the private key (d) and verifies it matches
80
+ * the declared public key (x). This catches configuration errors where
81
+ * the wrong key components are paired.
82
+ *
83
+ * @param jwk - Ed25519 JWK with both public (x) and private (d) components
84
+ * @returns true if the keypair is consistent, false otherwise
85
+ *
86
+ * @example
87
+ * ```typescript
88
+ * const jwk = {
89
+ * kty: 'OKP',
90
+ * crv: 'Ed25519',
91
+ * x: 'base64url-encoded-public-key',
92
+ * d: 'base64url-encoded-private-key',
93
+ * };
94
+ *
95
+ * if (!await validateKeypair(jwk)) {
96
+ * throw new Error('Invalid keypair: d does not derive to x');
97
+ * }
98
+ * ```
99
+ */
100
+ export declare function validateKeypair(jwk: Ed25519PrivateJwk): Promise<boolean>;
58
101
  //# sourceMappingURL=jws.d.ts.map
package/dist/jws.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"jws.d.ts","sourceRoot":"","sources":["../src/jws.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AASvD;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,OAAO,aAAa,CAAC;IAC1B,GAAG,EAAE,OAAO,QAAQ,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,OAAO;IACvC,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE,CAAC,CAAC;IACX,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,wBAAsB,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA4BjG;AAED;;;;;;GAMG;AACH,wBAAsB,MAAM,CAAC,CAAC,GAAG,OAAO,EACtC,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,UAAU,GACpB,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAoD1B;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,CAAC,CAAA;CAAE,CAkBlF;AAED;;;;GAIG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC;IAC/C,UAAU,EAAE,UAAU,CAAC;IACvB,SAAS,EAAE,UAAU,CAAC;CACvB,CAAC,CAKD"}
1
+ {"version":3,"file":"jws.d.ts","sourceRoot":"","sources":["../src/jws.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AASvD;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,OAAO,aAAa,CAAC;IAC1B,GAAG,EAAE,OAAO,QAAQ,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,OAAO;IACvC,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE,CAAC,CAAC;IACX,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,wBAAsB,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA4BjG;AAED;;;;;;GAMG;AACH,wBAAsB,MAAM,CAAC,CAAC,GAAG,OAAO,EACtC,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,UAAU,GACpB,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAoD1B;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,CAAC,CAAA;CAAE,CAkBlF;AAED;;;;GAIG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC;IAC/C,UAAU,EAAE,UAAU,CAAC;IACvB,SAAS,EAAE,UAAU,CAAC;CACvB,CAAC,CAKD;AAMD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,KAAK,CAAC;IACX,GAAG,EAAE,SAAS,CAAC;IACf,+CAA+C;IAC/C,CAAC,EAAE,MAAM,CAAC;IACV,gDAAgD;IAChD,CAAC,EAAE,MAAM,CAAC;CACX;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAKjF;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,CAqC9E"}
package/dist/jws.js CHANGED
@@ -41,6 +41,8 @@ exports.sign = sign;
41
41
  exports.verify = verify;
42
42
  exports.decode = decode;
43
43
  exports.generateKeypair = generateKeypair;
44
+ exports.derivePublicKey = derivePublicKey;
45
+ exports.validateKeypair = validateKeypair;
44
46
  const ed25519 = __importStar(require("@noble/ed25519"));
45
47
  const schema_1 = require("@peac/schema");
46
48
  const base64url_1 = require("./base64url");
@@ -146,7 +148,72 @@ async function generateKeypair() {
146
148
  const publicKey = await ed25519.getPublicKeyAsync(privateKey);
147
149
  return { privateKey, publicKey };
148
150
  }
149
- // NOTE: generateKeypairFromSeed has been moved to @peac/crypto/testkit
150
- // It's intentionally NOT exported from the main module to prevent accidental
151
- // use in production. Use: import { generateKeypairFromSeed } from '@peac/crypto/testkit'
151
+ /**
152
+ * Derive the Ed25519 public key from a private key
153
+ *
154
+ * @param privateKey - Ed25519 private key (32 bytes)
155
+ * @returns Public key (32 bytes)
156
+ */
157
+ async function derivePublicKey(privateKey) {
158
+ if (privateKey.length !== 32) {
159
+ throw new errors_1.CryptoError('CRYPTO_INVALID_KEY_LENGTH', 'Ed25519 private key must be 32 bytes');
160
+ }
161
+ return ed25519.getPublicKeyAsync(privateKey);
162
+ }
163
+ /**
164
+ * Validate that an Ed25519 JWK has a consistent keypair
165
+ *
166
+ * Derives the public key from the private key (d) and verifies it matches
167
+ * the declared public key (x). This catches configuration errors where
168
+ * the wrong key components are paired.
169
+ *
170
+ * @param jwk - Ed25519 JWK with both public (x) and private (d) components
171
+ * @returns true if the keypair is consistent, false otherwise
172
+ *
173
+ * @example
174
+ * ```typescript
175
+ * const jwk = {
176
+ * kty: 'OKP',
177
+ * crv: 'Ed25519',
178
+ * x: 'base64url-encoded-public-key',
179
+ * d: 'base64url-encoded-private-key',
180
+ * };
181
+ *
182
+ * if (!await validateKeypair(jwk)) {
183
+ * throw new Error('Invalid keypair: d does not derive to x');
184
+ * }
185
+ * ```
186
+ */
187
+ async function validateKeypair(jwk) {
188
+ // Validate JWK structure
189
+ if (jwk.kty !== 'OKP' || jwk.crv !== 'Ed25519') {
190
+ return false;
191
+ }
192
+ // Decode the keys
193
+ let privateKeyBytes;
194
+ let declaredPublicKeyBytes;
195
+ try {
196
+ privateKeyBytes = (0, base64url_1.base64urlDecode)(jwk.d);
197
+ declaredPublicKeyBytes = (0, base64url_1.base64urlDecode)(jwk.x);
198
+ }
199
+ catch {
200
+ return false;
201
+ }
202
+ // Validate lengths
203
+ if (privateKeyBytes.length !== 32 || declaredPublicKeyBytes.length !== 32) {
204
+ return false;
205
+ }
206
+ // Derive the actual public key from the private key
207
+ const derivedPublicKeyBytes = await ed25519.getPublicKeyAsync(privateKeyBytes);
208
+ // Compare derived public key with declared public key
209
+ if (derivedPublicKeyBytes.length !== declaredPublicKeyBytes.length) {
210
+ return false;
211
+ }
212
+ for (let i = 0; i < derivedPublicKeyBytes.length; i++) {
213
+ if (derivedPublicKeyBytes[i] !== declaredPublicKeyBytes[i]) {
214
+ return false;
215
+ }
216
+ }
217
+ return true;
218
+ }
152
219
  //# sourceMappingURL=jws.js.map
package/dist/jws.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"jws.js","sourceRoot":"","sources":["../src/jws.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"jws.js","sourceRoot":"","sources":["../src/jws.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@peac/crypto",
3
- "version": "0.10.6",
3
+ "version": "0.10.8",
4
4
  "description": "Ed25519 JWS signing and verification for PEAC protocol",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -38,7 +38,7 @@
38
38
  },
39
39
  "dependencies": {
40
40
  "@noble/ed25519": "^2.0.0",
41
- "@peac/schema": "0.10.6"
41
+ "@peac/schema": "0.10.8"
42
42
  },
43
43
  "devDependencies": {
44
44
  "@types/node": "^20.10.0",