@peac/crypto 0.10.9 → 0.10.11
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/LICENSE +1 -1
- package/dist/ed25519.d.ts +28 -0
- package/dist/ed25519.d.ts.map +1 -0
- package/dist/hash.d.ts +31 -0
- package/dist/hash.d.ts.map +1 -1
- package/dist/index.cjs +349 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.mjs +324 -0
- package/dist/index.mjs.map +1 -0
- package/dist/jws.d.ts.map +1 -1
- package/dist/testkit.cjs +32 -0
- package/dist/testkit.cjs.map +1 -0
- package/dist/testkit.mjs +30 -0
- package/dist/testkit.mjs.map +1 -0
- package/package.json +19 -14
- package/dist/base64url.js +0 -98
- package/dist/base64url.js.map +0 -1
- package/dist/errors.js +0 -45
- package/dist/errors.js.map +0 -1
- package/dist/hash.js +0 -171
- package/dist/hash.js.map +0 -1
- package/dist/index.js +0 -32
- package/dist/index.js.map +0 -1
- package/dist/jcs.js +0 -125
- package/dist/jcs.js.map +0 -1
- package/dist/jws.js +0 -219
- package/dist/jws.js.map +0 -1
- package/dist/testkit.js +0 -82
- package/dist/testkit.js.map +0 -1
package/dist/jws.js
DELETED
|
@@ -1,219 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* JWS compact serialization with Ed25519 (RFC 8032)
|
|
4
|
-
* Implements peac-receipt/0.1 wire format
|
|
5
|
-
*/
|
|
6
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
-
if (k2 === undefined) k2 = k;
|
|
8
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
-
}
|
|
12
|
-
Object.defineProperty(o, k2, desc);
|
|
13
|
-
}) : (function(o, m, k, k2) {
|
|
14
|
-
if (k2 === undefined) k2 = k;
|
|
15
|
-
o[k2] = m[k];
|
|
16
|
-
}));
|
|
17
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
-
}) : function(o, v) {
|
|
20
|
-
o["default"] = v;
|
|
21
|
-
});
|
|
22
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
-
var ownKeys = function(o) {
|
|
24
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
-
var ar = [];
|
|
26
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
-
return ar;
|
|
28
|
-
};
|
|
29
|
-
return ownKeys(o);
|
|
30
|
-
};
|
|
31
|
-
return function (mod) {
|
|
32
|
-
if (mod && mod.__esModule) return mod;
|
|
33
|
-
var result = {};
|
|
34
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
-
__setModuleDefault(result, mod);
|
|
36
|
-
return result;
|
|
37
|
-
};
|
|
38
|
-
})();
|
|
39
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
-
exports.sign = sign;
|
|
41
|
-
exports.verify = verify;
|
|
42
|
-
exports.decode = decode;
|
|
43
|
-
exports.generateKeypair = generateKeypair;
|
|
44
|
-
exports.derivePublicKey = derivePublicKey;
|
|
45
|
-
exports.validateKeypair = validateKeypair;
|
|
46
|
-
const ed25519 = __importStar(require("@noble/ed25519"));
|
|
47
|
-
const schema_1 = require("@peac/schema");
|
|
48
|
-
const base64url_1 = require("./base64url");
|
|
49
|
-
const errors_1 = require("./errors");
|
|
50
|
-
/**
|
|
51
|
-
* Sign a payload with Ed25519 and return JWS compact serialization
|
|
52
|
-
*
|
|
53
|
-
* @param payload - JSON-serializable payload
|
|
54
|
-
* @param privateKey - Ed25519 private key (32 bytes)
|
|
55
|
-
* @param kid - Key ID (ISO 8601 timestamp)
|
|
56
|
-
* @returns JWS compact serialization (header.payload.signature)
|
|
57
|
-
*/
|
|
58
|
-
async function sign(payload, privateKey, kid) {
|
|
59
|
-
if (privateKey.length !== 32) {
|
|
60
|
-
throw new errors_1.CryptoError('CRYPTO_INVALID_KEY_LENGTH', 'Ed25519 private key must be 32 bytes');
|
|
61
|
-
}
|
|
62
|
-
// Create header
|
|
63
|
-
const header = {
|
|
64
|
-
typ: schema_1.PEAC_WIRE_TYP,
|
|
65
|
-
alg: schema_1.PEAC_ALG,
|
|
66
|
-
kid,
|
|
67
|
-
};
|
|
68
|
-
// Encode header and payload
|
|
69
|
-
const headerB64 = (0, base64url_1.base64urlEncodeString)(JSON.stringify(header));
|
|
70
|
-
const payloadB64 = (0, base64url_1.base64urlEncodeString)(JSON.stringify(payload));
|
|
71
|
-
// Create signing input
|
|
72
|
-
const signingInput = `${headerB64}.${payloadB64}`;
|
|
73
|
-
const signingInputBytes = new TextEncoder().encode(signingInput);
|
|
74
|
-
// Sign with Ed25519
|
|
75
|
-
const signatureBytes = await ed25519.signAsync(signingInputBytes, privateKey);
|
|
76
|
-
// Encode signature
|
|
77
|
-
const signatureB64 = (0, base64url_1.base64urlEncode)(signatureBytes);
|
|
78
|
-
// Return JWS compact serialization
|
|
79
|
-
return `${signingInput}.${signatureB64}`;
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Verify a JWS compact serialization with Ed25519
|
|
83
|
-
*
|
|
84
|
-
* @param jws - JWS compact serialization
|
|
85
|
-
* @param publicKey - Ed25519 public key (32 bytes)
|
|
86
|
-
* @returns Verification result with decoded header and payload
|
|
87
|
-
*/
|
|
88
|
-
async function verify(jws, publicKey) {
|
|
89
|
-
if (publicKey.length !== 32) {
|
|
90
|
-
throw new errors_1.CryptoError('CRYPTO_INVALID_KEY_LENGTH', 'Ed25519 public key must be 32 bytes');
|
|
91
|
-
}
|
|
92
|
-
// Split JWS
|
|
93
|
-
const parts = jws.split('.');
|
|
94
|
-
if (parts.length !== 3) {
|
|
95
|
-
throw new errors_1.CryptoError('CRYPTO_INVALID_JWS_FORMAT', 'Invalid JWS: must have three dot-separated parts');
|
|
96
|
-
}
|
|
97
|
-
const [headerB64, payloadB64, signatureB64] = parts;
|
|
98
|
-
// Decode header
|
|
99
|
-
const headerJson = (0, base64url_1.base64urlDecodeString)(headerB64);
|
|
100
|
-
const header = JSON.parse(headerJson);
|
|
101
|
-
// Validate header
|
|
102
|
-
if (header.typ !== schema_1.PEAC_WIRE_TYP) {
|
|
103
|
-
throw new errors_1.CryptoError('CRYPTO_INVALID_TYP', `Invalid typ: expected ${schema_1.PEAC_WIRE_TYP}, got ${header.typ}`);
|
|
104
|
-
}
|
|
105
|
-
if (header.alg !== schema_1.PEAC_ALG) {
|
|
106
|
-
throw new errors_1.CryptoError('CRYPTO_INVALID_ALG', `Invalid alg: expected ${schema_1.PEAC_ALG}, got ${header.alg}`);
|
|
107
|
-
}
|
|
108
|
-
// Decode payload
|
|
109
|
-
const payloadJson = (0, base64url_1.base64urlDecodeString)(payloadB64);
|
|
110
|
-
const payload = JSON.parse(payloadJson);
|
|
111
|
-
// Decode signature
|
|
112
|
-
const signatureBytes = (0, base64url_1.base64urlDecode)(signatureB64);
|
|
113
|
-
// Verify signature
|
|
114
|
-
const signingInput = `${headerB64}.${payloadB64}`;
|
|
115
|
-
const signingInputBytes = new TextEncoder().encode(signingInput);
|
|
116
|
-
const valid = await ed25519.verifyAsync(signatureBytes, signingInputBytes, publicKey);
|
|
117
|
-
return {
|
|
118
|
-
header,
|
|
119
|
-
payload,
|
|
120
|
-
valid,
|
|
121
|
-
};
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* Decode JWS without verifying signature (use with caution!)
|
|
125
|
-
*
|
|
126
|
-
* @param jws - JWS compact serialization
|
|
127
|
-
* @returns Decoded header and payload (unverified)
|
|
128
|
-
*/
|
|
129
|
-
function decode(jws) {
|
|
130
|
-
const parts = jws.split('.');
|
|
131
|
-
if (parts.length !== 3) {
|
|
132
|
-
throw new errors_1.CryptoError('CRYPTO_INVALID_JWS_FORMAT', 'Invalid JWS: must have three dot-separated parts');
|
|
133
|
-
}
|
|
134
|
-
const [headerB64, payloadB64] = parts;
|
|
135
|
-
const headerJson = (0, base64url_1.base64urlDecodeString)(headerB64);
|
|
136
|
-
const header = JSON.parse(headerJson);
|
|
137
|
-
const payloadJson = (0, base64url_1.base64urlDecodeString)(payloadB64);
|
|
138
|
-
const payload = JSON.parse(payloadJson);
|
|
139
|
-
return { header, payload };
|
|
140
|
-
}
|
|
141
|
-
/**
|
|
142
|
-
* Generate a random Ed25519 keypair
|
|
143
|
-
*
|
|
144
|
-
* @returns Private key (32 bytes) and public key (32 bytes)
|
|
145
|
-
*/
|
|
146
|
-
async function generateKeypair() {
|
|
147
|
-
const privateKey = ed25519.utils.randomPrivateKey();
|
|
148
|
-
const publicKey = await ed25519.getPublicKeyAsync(privateKey);
|
|
149
|
-
return { privateKey, publicKey };
|
|
150
|
-
}
|
|
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
|
-
}
|
|
219
|
-
//# sourceMappingURL=jws.js.map
|
package/dist/jws.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"jws.js","sourceRoot":"","sources":["../src/jws.ts"],"names":[],"mappings":"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"}
|
package/dist/testkit.js
DELETED
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* PEAC Crypto Test Kit
|
|
4
|
-
*
|
|
5
|
-
* This module contains utilities for TEST FIXTURES ONLY.
|
|
6
|
-
* These functions are NOT exported from the main entry point.
|
|
7
|
-
*
|
|
8
|
-
* Import path: @peac/crypto/testkit
|
|
9
|
-
*
|
|
10
|
-
* SECURITY: Never use these in production. Production bundlers can
|
|
11
|
-
* tree-shake this module away since it's a separate export path.
|
|
12
|
-
*/
|
|
13
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
14
|
-
if (k2 === undefined) k2 = k;
|
|
15
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
16
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
17
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
18
|
-
}
|
|
19
|
-
Object.defineProperty(o, k2, desc);
|
|
20
|
-
}) : (function(o, m, k, k2) {
|
|
21
|
-
if (k2 === undefined) k2 = k;
|
|
22
|
-
o[k2] = m[k];
|
|
23
|
-
}));
|
|
24
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
25
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
26
|
-
}) : function(o, v) {
|
|
27
|
-
o["default"] = v;
|
|
28
|
-
});
|
|
29
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
30
|
-
var ownKeys = function(o) {
|
|
31
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
32
|
-
var ar = [];
|
|
33
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
34
|
-
return ar;
|
|
35
|
-
};
|
|
36
|
-
return ownKeys(o);
|
|
37
|
-
};
|
|
38
|
-
return function (mod) {
|
|
39
|
-
if (mod && mod.__esModule) return mod;
|
|
40
|
-
var result = {};
|
|
41
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
42
|
-
__setModuleDefault(result, mod);
|
|
43
|
-
return result;
|
|
44
|
-
};
|
|
45
|
-
})();
|
|
46
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47
|
-
exports.generateKeypairFromSeed = generateKeypairFromSeed;
|
|
48
|
-
const ed25519 = __importStar(require("@noble/ed25519"));
|
|
49
|
-
const errors_js_1 = require("./errors.js");
|
|
50
|
-
/**
|
|
51
|
-
* Generate an Ed25519 keypair from a deterministic seed.
|
|
52
|
-
*
|
|
53
|
-
* WARNING: FOR TEST FIXTURES ONLY. DO NOT USE IN PRODUCTION.
|
|
54
|
-
* Production code should use generateKeypair() which uses cryptographically
|
|
55
|
-
* secure random bytes. Seeded keys are predictable and compromise security.
|
|
56
|
-
*
|
|
57
|
-
* This function is intentionally in a separate module (@peac/crypto/testkit)
|
|
58
|
-
* so that production bundlers can tree-shake it away.
|
|
59
|
-
*
|
|
60
|
-
* @param seed - 32-byte seed (e.g., SHA-256 hash of a known string)
|
|
61
|
-
* @returns Private key (32 bytes) and public key (32 bytes)
|
|
62
|
-
*
|
|
63
|
-
* @example
|
|
64
|
-
* ```ts
|
|
65
|
-
* // Use only in test fixtures for reproducibility
|
|
66
|
-
* import { generateKeypairFromSeed } from '@peac/crypto/testkit';
|
|
67
|
-
*
|
|
68
|
-
* const seed = sha256('peac-test-key-001');
|
|
69
|
-
* const { privateKey, publicKey } = await generateKeypairFromSeed(seed);
|
|
70
|
-
* ```
|
|
71
|
-
*/
|
|
72
|
-
async function generateKeypairFromSeed(seed) {
|
|
73
|
-
if (seed.length !== 32) {
|
|
74
|
-
throw new errors_js_1.CryptoError('CRYPTO_INVALID_SEED_LENGTH', 'Ed25519 seed must be 32 bytes');
|
|
75
|
-
}
|
|
76
|
-
// In Ed25519, the private key IS the seed (32 bytes)
|
|
77
|
-
// The public key is derived from it
|
|
78
|
-
const privateKey = seed;
|
|
79
|
-
const publicKey = await ed25519.getPublicKeyAsync(privateKey);
|
|
80
|
-
return { privateKey, publicKey };
|
|
81
|
-
}
|
|
82
|
-
//# sourceMappingURL=testkit.js.map
|
package/dist/testkit.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"testkit.js","sourceRoot":"","sources":["../src/testkit.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BH,0DAcC;AAvCD,wDAA0C;AAC1C,2CAA0C;AAE1C;;;;;;;;;;;;;;;;;;;;;GAqBG;AACI,KAAK,UAAU,uBAAuB,CAAC,IAAgB;IAI5D,IAAI,IAAI,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QACvB,MAAM,IAAI,uBAAW,CAAC,4BAA4B,EAAE,+BAA+B,CAAC,CAAC;IACvF,CAAC;IAED,qDAAqD;IACrD,oCAAoC;IACpC,MAAM,UAAU,GAAG,IAAI,CAAC;IACxB,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAE9D,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;AACnC,CAAC"}
|