@claude-flow/cli 3.5.1 → 3.5.3
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/README.md +156 -26
- package/dist/src/appliance/gguf-engine.d.ts +91 -0
- package/dist/src/appliance/gguf-engine.d.ts.map +1 -0
- package/dist/src/appliance/gguf-engine.js +425 -0
- package/dist/src/appliance/gguf-engine.js.map +1 -0
- package/dist/src/appliance/ruvllm-bridge.d.ts +102 -0
- package/dist/src/appliance/ruvllm-bridge.d.ts.map +1 -0
- package/dist/src/appliance/ruvllm-bridge.js +292 -0
- package/dist/src/appliance/ruvllm-bridge.js.map +1 -0
- package/dist/src/appliance/rvfa-builder.d.ts +44 -0
- package/dist/src/appliance/rvfa-builder.d.ts.map +1 -0
- package/dist/src/appliance/rvfa-builder.js +329 -0
- package/dist/src/appliance/rvfa-builder.js.map +1 -0
- package/dist/src/appliance/rvfa-distribution.d.ts +97 -0
- package/dist/src/appliance/rvfa-distribution.d.ts.map +1 -0
- package/dist/src/appliance/rvfa-distribution.js +370 -0
- package/dist/src/appliance/rvfa-distribution.js.map +1 -0
- package/dist/src/appliance/rvfa-format.d.ts +111 -0
- package/dist/src/appliance/rvfa-format.d.ts.map +1 -0
- package/dist/src/appliance/rvfa-format.js +393 -0
- package/dist/src/appliance/rvfa-format.js.map +1 -0
- package/dist/src/appliance/rvfa-runner.d.ts +69 -0
- package/dist/src/appliance/rvfa-runner.d.ts.map +1 -0
- package/dist/src/appliance/rvfa-runner.js +237 -0
- package/dist/src/appliance/rvfa-runner.js.map +1 -0
- package/dist/src/appliance/rvfa-signing.d.ts +123 -0
- package/dist/src/appliance/rvfa-signing.d.ts.map +1 -0
- package/dist/src/appliance/rvfa-signing.js +347 -0
- package/dist/src/appliance/rvfa-signing.js.map +1 -0
- package/dist/src/commands/appliance-advanced.d.ts +9 -0
- package/dist/src/commands/appliance-advanced.d.ts.map +1 -0
- package/dist/src/commands/appliance-advanced.js +215 -0
- package/dist/src/commands/appliance-advanced.js.map +1 -0
- package/dist/src/commands/appliance.d.ts +8 -0
- package/dist/src/commands/appliance.d.ts.map +1 -0
- package/dist/src/commands/appliance.js +406 -0
- package/dist/src/commands/appliance.js.map +1 -0
- package/dist/src/commands/benchmark.js +2 -2
- package/dist/src/commands/benchmark.js.map +1 -1
- package/dist/src/commands/claims.js +1 -1
- package/dist/src/commands/claims.js.map +1 -1
- package/dist/src/commands/config.js +1 -1
- package/dist/src/commands/config.js.map +1 -1
- package/dist/src/commands/deployment.js +1 -1
- package/dist/src/commands/deployment.js.map +1 -1
- package/dist/src/commands/doctor.d.ts.map +1 -1
- package/dist/src/commands/doctor.js +25 -42
- package/dist/src/commands/doctor.js.map +1 -1
- package/dist/src/commands/embeddings.js +1 -1
- package/dist/src/commands/embeddings.js.map +1 -1
- package/dist/src/commands/hooks.js +1 -1
- package/dist/src/commands/hooks.js.map +1 -1
- package/dist/src/commands/index.d.ts +2 -0
- package/dist/src/commands/index.d.ts.map +1 -1
- package/dist/src/commands/index.js +6 -0
- package/dist/src/commands/index.js.map +1 -1
- package/dist/src/commands/init.js +11 -11
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/memory.d.ts.map +1 -1
- package/dist/src/commands/memory.js +24 -0
- package/dist/src/commands/memory.js.map +1 -1
- package/dist/src/commands/neural.js +1 -1
- package/dist/src/commands/neural.js.map +1 -1
- package/dist/src/commands/performance.js +1 -1
- package/dist/src/commands/performance.js.map +1 -1
- package/dist/src/commands/plugins.js +1 -1
- package/dist/src/commands/plugins.js.map +1 -1
- package/dist/src/commands/providers.js +1 -1
- package/dist/src/commands/providers.js.map +1 -1
- package/dist/src/commands/security.js +1 -1
- package/dist/src/commands/security.js.map +1 -1
- package/dist/src/commands/start.js +11 -11
- package/dist/src/commands/start.js.map +1 -1
- package/dist/src/commands/status.js +3 -3
- package/dist/src/commands/status.js.map +1 -1
- package/dist/src/commands/transfer-store.js +1 -1
- package/dist/src/commands/transfer-store.js.map +1 -1
- package/dist/src/index.js +2 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/init/claudemd-generator.js +1 -1
- package/dist/src/init/claudemd-generator.js.map +1 -1
- package/dist/src/init/executor.d.ts.map +1 -1
- package/dist/src/init/executor.js +20 -46
- package/dist/src/init/executor.js.map +1 -1
- package/dist/src/init/settings-generator.d.ts.map +1 -1
- package/dist/src/init/settings-generator.js +68 -40
- package/dist/src/init/settings-generator.js.map +1 -1
- package/dist/src/init/statusline-generator.d.ts +1 -1
- package/dist/src/init/statusline-generator.js +4 -4
- package/dist/src/mcp-tools/coordination-tools.js +1 -1
- package/dist/src/mcp-tools/coordination-tools.js.map +1 -1
- package/dist/src/mcp-tools/daa-tools.js +5 -5
- package/dist/src/mcp-tools/daa-tools.js.map +1 -1
- package/dist/src/mcp-tools/github-tools.js +2 -2
- package/dist/src/mcp-tools/github-tools.js.map +1 -1
- package/dist/src/mcp-tools/hooks-tools.js +1 -1
- package/dist/src/mcp-tools/hooks-tools.js.map +1 -1
- package/dist/src/mcp-tools/performance-tools.js +1 -1
- package/dist/src/mcp-tools/performance-tools.js.map +1 -1
- package/dist/src/mcp-tools/system-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/system-tools.js +21 -6
- package/dist/src/mcp-tools/system-tools.js.map +1 -1
- package/dist/src/memory/memory-initializer.d.ts +6 -0
- package/dist/src/memory/memory-initializer.d.ts.map +1 -1
- package/dist/src/memory/memory-initializer.js +54 -2
- package/dist/src/memory/memory-initializer.js.map +1 -1
- package/dist/src/runtime/headless.js +3 -3
- package/dist/src/runtime/headless.js.map +1 -1
- package/dist/src/services/claim-service.js +1 -1
- package/dist/src/services/claim-service.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RVFA Ed25519 Code Signing -- Digital signatures for RVFA appliance files.
|
|
3
|
+
*
|
|
4
|
+
* Provides tamper detection and publisher identity verification using
|
|
5
|
+
* Ed25519 (RFC 8032) via Node.js native crypto. Zero external dependencies.
|
|
6
|
+
*
|
|
7
|
+
* @module @claude-flow/cli/appliance/rvfa-signing
|
|
8
|
+
*/
|
|
9
|
+
import { generateKeyPairSync, createHash, sign, verify, createPublicKey, createPrivateKey, } from 'node:crypto';
|
|
10
|
+
import { readFile, writeFile, stat, chmod, mkdir } from 'node:fs/promises';
|
|
11
|
+
// ── Constants ────────────────────────────────────────────────
|
|
12
|
+
const PREAMBLE_SIZE = 12; // 4B magic + 4B version + 4B header_len
|
|
13
|
+
const SHA256_SIZE = 32;
|
|
14
|
+
const KEY_FILE_MODE = 0o600;
|
|
15
|
+
// ── Key Management ───────────────────────────────────────────
|
|
16
|
+
/** Compute the fingerprint of a public key: first 16 hex chars of its SHA256. */
|
|
17
|
+
function computeFingerprint(publicKeyPem) {
|
|
18
|
+
return createHash('sha256')
|
|
19
|
+
.update(publicKeyPem, 'utf-8')
|
|
20
|
+
.digest('hex')
|
|
21
|
+
.slice(0, 16);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Generate a new Ed25519 key pair for RVFA signing.
|
|
25
|
+
*/
|
|
26
|
+
export async function generateKeyPair() {
|
|
27
|
+
const { publicKey, privateKey } = generateKeyPairSync('ed25519', {
|
|
28
|
+
publicKeyEncoding: { type: 'spki', format: 'pem' },
|
|
29
|
+
privateKeyEncoding: { type: 'pkcs8', format: 'pem' },
|
|
30
|
+
});
|
|
31
|
+
const pubBuf = Buffer.from(publicKey, 'utf-8');
|
|
32
|
+
const privBuf = Buffer.from(privateKey, 'utf-8');
|
|
33
|
+
const fingerprint = computeFingerprint(publicKey);
|
|
34
|
+
return { publicKey: pubBuf, privateKey: privBuf, fingerprint };
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Save a key pair to disk as PEM files.
|
|
38
|
+
*
|
|
39
|
+
* @param keyPair The key pair to persist.
|
|
40
|
+
* @param dir Directory to write files into.
|
|
41
|
+
* @param name Base name for the key files (default: 'rvfa-signing').
|
|
42
|
+
* @returns Paths to the written public and private key files.
|
|
43
|
+
*/
|
|
44
|
+
export async function saveKeyPair(keyPair, dir, name = 'rvfa-signing') {
|
|
45
|
+
await mkdir(dir, { recursive: true });
|
|
46
|
+
const pubPath = `${dir}/${name}.pub`;
|
|
47
|
+
const privPath = `${dir}/${name}.key`;
|
|
48
|
+
await writeFile(pubPath, keyPair.publicKey);
|
|
49
|
+
await writeFile(privPath, keyPair.privateKey, { mode: KEY_FILE_MODE });
|
|
50
|
+
// Ensure private key has restrictive permissions even on existing files
|
|
51
|
+
await chmod(privPath, KEY_FILE_MODE);
|
|
52
|
+
return { publicKeyPath: pubPath, privateKeyPath: privPath };
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Load a key pair from PEM files on disk.
|
|
56
|
+
*
|
|
57
|
+
* @param dir Directory containing the key files.
|
|
58
|
+
* @param name Base name for the key files (default: 'rvfa-signing').
|
|
59
|
+
*/
|
|
60
|
+
export async function loadKeyPair(dir, name = 'rvfa-signing') {
|
|
61
|
+
const pubPath = `${dir}/${name}.pub`;
|
|
62
|
+
const privPath = `${dir}/${name}.key`;
|
|
63
|
+
const publicKey = await readFile(pubPath);
|
|
64
|
+
const privateKey = await readFile(privPath);
|
|
65
|
+
// Warn if private key permissions are too open
|
|
66
|
+
const privStat = await stat(privPath);
|
|
67
|
+
const mode = privStat.mode & 0o777;
|
|
68
|
+
if (mode & 0o077) {
|
|
69
|
+
console.warn(`[rvfa-signing] WARNING: Private key ${privPath} has open permissions ` +
|
|
70
|
+
`(${mode.toString(8)}). Consider running: chmod 600 ${privPath}`);
|
|
71
|
+
}
|
|
72
|
+
const fingerprint = computeFingerprint(publicKey.toString('utf-8'));
|
|
73
|
+
return { publicKey, privateKey, fingerprint };
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Load a public key from a single PEM file.
|
|
77
|
+
*/
|
|
78
|
+
export async function loadPublicKey(path) {
|
|
79
|
+
return readFile(path);
|
|
80
|
+
}
|
|
81
|
+
// ── Internal Helpers ─────────────────────────────────────────
|
|
82
|
+
/**
|
|
83
|
+
* Recursively sort object keys for canonical JSON serialization.
|
|
84
|
+
* Produces deterministic output regardless of insertion order.
|
|
85
|
+
*/
|
|
86
|
+
function canonicalJson(value) {
|
|
87
|
+
return JSON.stringify(value, (_key, val) => {
|
|
88
|
+
if (val !== null && typeof val === 'object' && !Array.isArray(val) && !Buffer.isBuffer(val)) {
|
|
89
|
+
const sorted = {};
|
|
90
|
+
for (const k of Object.keys(val).sort()) {
|
|
91
|
+
sorted[k] = val[k];
|
|
92
|
+
}
|
|
93
|
+
return sorted;
|
|
94
|
+
}
|
|
95
|
+
return val;
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Parse an RVFA binary into its components without full validation.
|
|
100
|
+
* Returns the header object, header JSON bytes, section data region, and footer.
|
|
101
|
+
*/
|
|
102
|
+
function parseRvfaBinary(buf) {
|
|
103
|
+
if (buf.length < PREAMBLE_SIZE + SHA256_SIZE) {
|
|
104
|
+
throw new Error('Buffer too small to be a valid RVFA file');
|
|
105
|
+
}
|
|
106
|
+
const magic = buf.subarray(0, 4).toString('ascii');
|
|
107
|
+
if (magic !== 'RVFA') {
|
|
108
|
+
throw new Error(`Invalid RVFA magic: expected "RVFA", got "${magic}"`);
|
|
109
|
+
}
|
|
110
|
+
const headerLen = buf.readUInt32LE(8);
|
|
111
|
+
const headerStart = PREAMBLE_SIZE;
|
|
112
|
+
const headerEnd = headerStart + headerLen;
|
|
113
|
+
if (headerEnd > buf.length - SHA256_SIZE) {
|
|
114
|
+
throw new Error('Header length extends beyond buffer');
|
|
115
|
+
}
|
|
116
|
+
const headerJson = buf.subarray(headerStart, headerEnd).toString('utf-8');
|
|
117
|
+
let header;
|
|
118
|
+
try {
|
|
119
|
+
header = JSON.parse(headerJson);
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
throw new Error('Failed to parse RVFA header JSON');
|
|
123
|
+
}
|
|
124
|
+
const footer = buf.subarray(buf.length - SHA256_SIZE);
|
|
125
|
+
const sectionData = buf.subarray(headerEnd, buf.length - SHA256_SIZE);
|
|
126
|
+
return { header, headerStart, headerEnd, sectionData, footer };
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Compute the signing digest for an RVFA file.
|
|
130
|
+
*
|
|
131
|
+
* The digest is SHA256 of: canonical_header_json (without signature field)
|
|
132
|
+
* + section_data_bytes
|
|
133
|
+
* + footer_32_bytes
|
|
134
|
+
*/
|
|
135
|
+
function computeSigningDigest(header, sectionData, footer) {
|
|
136
|
+
// Strip signature field from header for digest computation
|
|
137
|
+
const stripped = { ...header };
|
|
138
|
+
delete stripped.signature;
|
|
139
|
+
const canonical = Buffer.from(canonicalJson(stripped), 'utf-8');
|
|
140
|
+
return createHash('sha256')
|
|
141
|
+
.update(canonical)
|
|
142
|
+
.update(sectionData)
|
|
143
|
+
.update(footer)
|
|
144
|
+
.digest();
|
|
145
|
+
}
|
|
146
|
+
/** Convert a Buffer or PEM string into a KeyObject. */
|
|
147
|
+
function toPrivateKeyObject(key) {
|
|
148
|
+
const pem = Buffer.isBuffer(key) ? key.toString('utf-8') : key;
|
|
149
|
+
return createPrivateKey(pem);
|
|
150
|
+
}
|
|
151
|
+
/** Convert a Buffer or PEM string into a KeyObject. */
|
|
152
|
+
function toPublicKeyObject(key) {
|
|
153
|
+
const pem = Buffer.isBuffer(key) ? key.toString('utf-8') : key;
|
|
154
|
+
return createPublicKey(pem);
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Rebuild the RVFA binary with an updated header.
|
|
158
|
+
*
|
|
159
|
+
* Preserves the original preamble version, recalculates header length,
|
|
160
|
+
* and keeps section data and footer intact.
|
|
161
|
+
*/
|
|
162
|
+
function rebuildRvfa(originalBuf, newHeader, sectionData, footer) {
|
|
163
|
+
const headerJson = Buffer.from(JSON.stringify(newHeader), 'utf-8');
|
|
164
|
+
// Preamble: magic + version + new header length
|
|
165
|
+
const preamble = Buffer.alloc(PREAMBLE_SIZE);
|
|
166
|
+
originalBuf.copy(preamble, 0, 0, 8); // magic + version unchanged
|
|
167
|
+
preamble.writeUInt32LE(headerJson.length, 8);
|
|
168
|
+
return Buffer.concat([preamble, headerJson, sectionData, footer]);
|
|
169
|
+
}
|
|
170
|
+
// ── RvfaSigner ───────────────────────────────────────────────
|
|
171
|
+
/**
|
|
172
|
+
* Signs RVFA appliance files and data with Ed25519.
|
|
173
|
+
*/
|
|
174
|
+
export class RvfaSigner {
|
|
175
|
+
keyObj;
|
|
176
|
+
fingerprint;
|
|
177
|
+
constructor(privateKey) {
|
|
178
|
+
this.keyObj = toPrivateKeyObject(privateKey);
|
|
179
|
+
// Derive public key to compute fingerprint
|
|
180
|
+
const pubPem = createPublicKey(this.keyObj)
|
|
181
|
+
.export({ type: 'spki', format: 'pem' });
|
|
182
|
+
this.fingerprint = computeFingerprint(pubPem);
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Sign an RVFA appliance file in-place.
|
|
186
|
+
*
|
|
187
|
+
* Algorithm:
|
|
188
|
+
* 1. Read and parse the RVFA binary
|
|
189
|
+
* 2. Strip any existing signature from the header
|
|
190
|
+
* 3. Compute SHA256 of [canonical_header + section_data + footer]
|
|
191
|
+
* 4. Sign the digest with Ed25519
|
|
192
|
+
* 5. Embed signature metadata into the header
|
|
193
|
+
* 6. Write the updated binary back to the file
|
|
194
|
+
*
|
|
195
|
+
* @param rvfaPath Path to the .rvf appliance file.
|
|
196
|
+
* @param signedBy Optional publisher name.
|
|
197
|
+
* @returns The signature metadata that was embedded.
|
|
198
|
+
*/
|
|
199
|
+
async signAppliance(rvfaPath, signedBy) {
|
|
200
|
+
const buf = await readFile(rvfaPath);
|
|
201
|
+
const { header, sectionData, footer } = parseRvfaBinary(buf);
|
|
202
|
+
// Compute digest over header (without signature) + sections + footer
|
|
203
|
+
const digest = computeSigningDigest(header, sectionData, footer);
|
|
204
|
+
// Ed25519 sign
|
|
205
|
+
const sig = sign(null, digest, this.keyObj);
|
|
206
|
+
const metadata = {
|
|
207
|
+
algorithm: 'ed25519',
|
|
208
|
+
publicKeyFingerprint: this.fingerprint,
|
|
209
|
+
signature: sig.toString('hex'),
|
|
210
|
+
signedAt: new Date().toISOString(),
|
|
211
|
+
signedBy,
|
|
212
|
+
scope: 'full',
|
|
213
|
+
};
|
|
214
|
+
// Embed signature in header and rebuild
|
|
215
|
+
header.signature = metadata;
|
|
216
|
+
const rebuilt = rebuildRvfa(buf, header, sectionData, footer);
|
|
217
|
+
await writeFile(rvfaPath, rebuilt);
|
|
218
|
+
return metadata;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Sign a section footer hash (detached signature).
|
|
222
|
+
*
|
|
223
|
+
* @param footerHash The 32-byte SHA256 footer hash from an RVFA file.
|
|
224
|
+
* @returns Hex-encoded Ed25519 signature.
|
|
225
|
+
*/
|
|
226
|
+
async signSections(footerHash) {
|
|
227
|
+
if (footerHash.length !== SHA256_SIZE) {
|
|
228
|
+
throw new Error(`Footer hash must be ${SHA256_SIZE} bytes, got ${footerHash.length}`);
|
|
229
|
+
}
|
|
230
|
+
const sig = sign(null, footerHash, this.keyObj);
|
|
231
|
+
return sig.toString('hex');
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Sign an RVFP patch file (detached signature).
|
|
235
|
+
*
|
|
236
|
+
* @param patchData The raw patch binary data.
|
|
237
|
+
* @returns Hex-encoded Ed25519 signature.
|
|
238
|
+
*/
|
|
239
|
+
async signPatch(patchData) {
|
|
240
|
+
const digest = createHash('sha256').update(patchData).digest();
|
|
241
|
+
const sig = sign(null, digest, this.keyObj);
|
|
242
|
+
return sig.toString('hex');
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
// ── RvfaVerifier ─────────────────────────────────────────────
|
|
246
|
+
/**
|
|
247
|
+
* Verifies Ed25519 signatures on RVFA appliance files and data.
|
|
248
|
+
*/
|
|
249
|
+
export class RvfaVerifier {
|
|
250
|
+
keyObj;
|
|
251
|
+
fingerprint;
|
|
252
|
+
constructor(publicKey) {
|
|
253
|
+
this.keyObj = toPublicKeyObject(publicKey);
|
|
254
|
+
const pem = Buffer.isBuffer(publicKey) ? publicKey.toString('utf-8') : publicKey;
|
|
255
|
+
this.fingerprint = computeFingerprint(pem);
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Verify the Ed25519 signature embedded in an RVFA appliance file.
|
|
259
|
+
*
|
|
260
|
+
* @param rvfaPath Path to the .rvf appliance file.
|
|
261
|
+
* @returns Verification result with details and any errors.
|
|
262
|
+
*/
|
|
263
|
+
async verifyAppliance(rvfaPath) {
|
|
264
|
+
const errors = [];
|
|
265
|
+
let buf;
|
|
266
|
+
try {
|
|
267
|
+
buf = await readFile(rvfaPath);
|
|
268
|
+
}
|
|
269
|
+
catch (err) {
|
|
270
|
+
return { valid: false, errors: [`Failed to read file: ${err.message}`] };
|
|
271
|
+
}
|
|
272
|
+
let parsed;
|
|
273
|
+
try {
|
|
274
|
+
parsed = parseRvfaBinary(buf);
|
|
275
|
+
}
|
|
276
|
+
catch (err) {
|
|
277
|
+
return { valid: false, errors: [`Invalid RVFA file: ${err.message}`] };
|
|
278
|
+
}
|
|
279
|
+
const { header, sectionData, footer } = parsed;
|
|
280
|
+
// Extract signature metadata from header
|
|
281
|
+
const sigRaw = header.signature;
|
|
282
|
+
if (!sigRaw || typeof sigRaw !== 'object') {
|
|
283
|
+
return { valid: false, errors: ['No signature found in RVFA header'] };
|
|
284
|
+
}
|
|
285
|
+
const sigMeta = sigRaw;
|
|
286
|
+
if (sigMeta.algorithm !== 'ed25519') {
|
|
287
|
+
errors.push(`Unsupported algorithm: ${String(sigMeta.algorithm)}`);
|
|
288
|
+
return { valid: false, errors };
|
|
289
|
+
}
|
|
290
|
+
if (typeof sigMeta.signature !== 'string' || !sigMeta.signature) {
|
|
291
|
+
errors.push('Signature field is missing or empty');
|
|
292
|
+
return { valid: false, errors };
|
|
293
|
+
}
|
|
294
|
+
// Recompute the digest the same way the signer did
|
|
295
|
+
const digest = computeSigningDigest(header, sectionData, footer);
|
|
296
|
+
// Verify
|
|
297
|
+
let sigBuf;
|
|
298
|
+
try {
|
|
299
|
+
sigBuf = Buffer.from(sigMeta.signature, 'hex');
|
|
300
|
+
}
|
|
301
|
+
catch {
|
|
302
|
+
errors.push('Signature is not valid hex');
|
|
303
|
+
return { valid: false, errors };
|
|
304
|
+
}
|
|
305
|
+
let valid;
|
|
306
|
+
try {
|
|
307
|
+
valid = verify(null, digest, this.keyObj, sigBuf);
|
|
308
|
+
}
|
|
309
|
+
catch (err) {
|
|
310
|
+
errors.push(`Verification error: ${err.message}`);
|
|
311
|
+
return { valid: false, errors };
|
|
312
|
+
}
|
|
313
|
+
if (!valid) {
|
|
314
|
+
errors.push('Ed25519 signature verification failed: data may be tampered');
|
|
315
|
+
}
|
|
316
|
+
return {
|
|
317
|
+
valid,
|
|
318
|
+
signerFingerprint: sigMeta.publicKeyFingerprint,
|
|
319
|
+
signedAt: sigMeta.signedAt,
|
|
320
|
+
signedBy: sigMeta.signedBy,
|
|
321
|
+
errors,
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Verify a detached Ed25519 signature over arbitrary data.
|
|
326
|
+
*
|
|
327
|
+
* @param data The data that was signed.
|
|
328
|
+
* @param signature Hex-encoded Ed25519 signature.
|
|
329
|
+
*/
|
|
330
|
+
async verifyDetached(data, signature) {
|
|
331
|
+
const digest = createHash('sha256').update(data).digest();
|
|
332
|
+
const sigBuf = Buffer.from(signature, 'hex');
|
|
333
|
+
return verify(null, digest, this.keyObj, sigBuf);
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Verify an RVFP patch file signature.
|
|
337
|
+
*
|
|
338
|
+
* @param patchData The raw patch binary data.
|
|
339
|
+
* @param signature Hex-encoded Ed25519 signature.
|
|
340
|
+
*/
|
|
341
|
+
async verifyPatch(patchData, signature) {
|
|
342
|
+
const digest = createHash('sha256').update(patchData).digest();
|
|
343
|
+
const sigBuf = Buffer.from(signature, 'hex');
|
|
344
|
+
return verify(null, digest, this.keyObj, sigBuf);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
//# sourceMappingURL=rvfa-signing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rvfa-signing.js","sourceRoot":"","sources":["../../../src/appliance/rvfa-signing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* V3 CLI Appliance Advanced Commands (Phase 3-4)
|
|
3
|
+
* Sign, publish, and hot-patch RVFA appliances.
|
|
4
|
+
*/
|
|
5
|
+
import type { Command } from '../types.js';
|
|
6
|
+
export declare const signCommand: Command;
|
|
7
|
+
export declare const publishCommand: Command;
|
|
8
|
+
export declare const updateAppCommand: Command;
|
|
9
|
+
//# sourceMappingURL=appliance-advanced.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"appliance-advanced.d.ts","sourceRoot":"","sources":["../../../src/commands/appliance-advanced.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAiC,MAAM,aAAa,CAAC;AAoC1E,eAAO,MAAM,WAAW,EAAE,OAyDzB,CAAC;AAGF,eAAO,MAAM,cAAc,EAAE,OAmC5B,CAAC;AAGF,eAAO,MAAM,gBAAgB,EAAE,OA+E9B,CAAC"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* V3 CLI Appliance Advanced Commands (Phase 3-4)
|
|
3
|
+
* Sign, publish, and hot-patch RVFA appliances.
|
|
4
|
+
*/
|
|
5
|
+
import { output } from '../output.js';
|
|
6
|
+
function fmtSize(bytes) {
|
|
7
|
+
if (bytes < 1024)
|
|
8
|
+
return `${bytes} B`;
|
|
9
|
+
if (bytes < 1024 * 1024)
|
|
10
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
11
|
+
if (bytes < 1024 * 1024 * 1024)
|
|
12
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
13
|
+
return `${(bytes / (1024 * 1024 * 1024)).toFixed(2)} GB`;
|
|
14
|
+
}
|
|
15
|
+
function errMsg(err) {
|
|
16
|
+
return err instanceof Error ? err.message : String(err);
|
|
17
|
+
}
|
|
18
|
+
const fail = (msg, detail) => {
|
|
19
|
+
output.printError(msg, detail);
|
|
20
|
+
return { success: false, exitCode: 1 };
|
|
21
|
+
};
|
|
22
|
+
function hdr(title) {
|
|
23
|
+
output.writeln();
|
|
24
|
+
output.writeln(output.bold(title));
|
|
25
|
+
output.writeln(output.dim('─'.repeat(50)));
|
|
26
|
+
output.writeln();
|
|
27
|
+
}
|
|
28
|
+
async function requireFile(file) {
|
|
29
|
+
const fs = await import('fs');
|
|
30
|
+
if (!fs.existsSync(file)) {
|
|
31
|
+
output.printError(`File not found: ${file}`);
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
// SIGN
|
|
37
|
+
export const signCommand = {
|
|
38
|
+
name: 'sign',
|
|
39
|
+
description: 'Sign an RVFA appliance with Ed25519 for tamper detection',
|
|
40
|
+
options: [
|
|
41
|
+
{ name: 'file', short: 'f', type: 'string', description: 'Path to .rvf file', required: true },
|
|
42
|
+
{ name: 'key', short: 'k', type: 'string', description: 'Path to Ed25519 private key (PEM)' },
|
|
43
|
+
{ name: 'generate-keys', type: 'boolean', description: 'Generate a new key pair' },
|
|
44
|
+
{ name: 'key-dir', type: 'string', description: 'Directory for key storage', default: '.rvfa-keys' },
|
|
45
|
+
{ name: 'signer', type: 'string', description: 'Publisher name for signature metadata' },
|
|
46
|
+
],
|
|
47
|
+
action: async (ctx) => {
|
|
48
|
+
const file = ctx.flags.file;
|
|
49
|
+
const keyPath = ctx.flags.key;
|
|
50
|
+
const genKeys = ctx.flags['generate-keys'];
|
|
51
|
+
const keyDir = ctx.flags['key-dir'] || '.rvfa-keys';
|
|
52
|
+
const signer = ctx.flags.signer;
|
|
53
|
+
if (!file)
|
|
54
|
+
return fail('--file is required');
|
|
55
|
+
try {
|
|
56
|
+
const signing = await import('../appliance/rvfa-signing.js');
|
|
57
|
+
if (genKeys) {
|
|
58
|
+
hdr('Generating Ed25519 Key Pair');
|
|
59
|
+
const kp = await signing.generateKeyPair();
|
|
60
|
+
const paths = await signing.saveKeyPair(kp, keyDir);
|
|
61
|
+
output.printSuccess(`Public key: ${paths.publicKeyPath}`);
|
|
62
|
+
output.printSuccess(`Private key: ${paths.privateKeyPath}`);
|
|
63
|
+
output.printInfo(`Fingerprint: ${kp.fingerprint}`);
|
|
64
|
+
output.writeln(output.dim(' Keep the private key secure. Share only the public key.'));
|
|
65
|
+
output.writeln();
|
|
66
|
+
}
|
|
67
|
+
if (!(await requireFile(file)))
|
|
68
|
+
return { success: false, exitCode: 1 };
|
|
69
|
+
hdr('Signing RVFA Appliance');
|
|
70
|
+
let privateKey;
|
|
71
|
+
if (keyPath) {
|
|
72
|
+
const fs = await import('fs');
|
|
73
|
+
privateKey = fs.readFileSync(keyPath);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
const kp = await signing.loadKeyPair(keyDir);
|
|
77
|
+
privateKey = kp.privateKey;
|
|
78
|
+
}
|
|
79
|
+
const s = new signing.RvfaSigner(privateKey);
|
|
80
|
+
const meta = await s.signAppliance(file, signer);
|
|
81
|
+
output.printSuccess('Appliance signed successfully');
|
|
82
|
+
output.printInfo(`Algorithm: ${meta.algorithm}`);
|
|
83
|
+
output.printInfo(`Fingerprint: ${meta.publicKeyFingerprint}`);
|
|
84
|
+
output.printInfo(`Signed at: ${meta.signedAt}`);
|
|
85
|
+
if (signer)
|
|
86
|
+
output.printInfo(`Signed by: ${signer}`);
|
|
87
|
+
output.printInfo(`Signature: ${meta.signature.slice(0, 32)}...`);
|
|
88
|
+
return { success: true, data: meta };
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
return fail('Signing failed', errMsg(err));
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
// PUBLISH
|
|
96
|
+
export const publishCommand = {
|
|
97
|
+
name: 'publish',
|
|
98
|
+
description: 'Publish an RVFA appliance to IPFS via Pinata',
|
|
99
|
+
options: [
|
|
100
|
+
{ name: 'file', short: 'f', type: 'string', description: 'Path to .rvf file', required: true },
|
|
101
|
+
{ name: 'name', short: 'n', type: 'string', description: 'Publication name' },
|
|
102
|
+
{ name: 'description', type: 'string', description: 'Description' },
|
|
103
|
+
],
|
|
104
|
+
action: async (ctx) => {
|
|
105
|
+
const file = ctx.flags.file;
|
|
106
|
+
if (!file)
|
|
107
|
+
return fail('--file is required');
|
|
108
|
+
if (!(await requireFile(file)))
|
|
109
|
+
return { success: false, exitCode: 1 };
|
|
110
|
+
try {
|
|
111
|
+
const dist = await import('../appliance/rvfa-distribution.js');
|
|
112
|
+
hdr('Publishing RVFA to IPFS');
|
|
113
|
+
output.printInfo(`File: ${file}`);
|
|
114
|
+
output.writeln();
|
|
115
|
+
const publisher = dist.createPublisher();
|
|
116
|
+
const result = await publisher.publish(file, {
|
|
117
|
+
name: ctx.flags.name,
|
|
118
|
+
description: ctx.flags.description,
|
|
119
|
+
});
|
|
120
|
+
output.printSuccess('Published successfully');
|
|
121
|
+
output.printInfo(`CID: ${output.bold(result.cid)}`);
|
|
122
|
+
output.printInfo(`Size: ${fmtSize(result.size)}`);
|
|
123
|
+
output.printInfo(`Gateway: ${result.gatewayUrl}`);
|
|
124
|
+
return { success: true, data: result };
|
|
125
|
+
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
return fail('Publishing failed', errMsg(err));
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
// UPDATE (hot-patch)
|
|
132
|
+
export const updateAppCommand = {
|
|
133
|
+
name: 'update',
|
|
134
|
+
description: 'Hot-patch a section in an RVFA appliance',
|
|
135
|
+
options: [
|
|
136
|
+
{ name: 'file', short: 'f', type: 'string', description: 'Path to .rvf file', required: true },
|
|
137
|
+
{ name: 'section', short: 's', type: 'string', description: 'Section to patch (e.g. ruflo, models)', required: true },
|
|
138
|
+
{ name: 'patch', short: 'p', type: 'string', description: 'Path to .rvfp patch file' },
|
|
139
|
+
{ name: 'data', short: 'd', type: 'string', description: 'Path to new section data (creates patch automatically)' },
|
|
140
|
+
{ name: 'version', type: 'string', description: 'Patch version', default: '0.0.1' },
|
|
141
|
+
{ name: 'no-backup', type: 'boolean', description: 'Skip backup creation' },
|
|
142
|
+
{ name: 'public-key', type: 'string', description: 'Path to public key for patch verification' },
|
|
143
|
+
],
|
|
144
|
+
action: async (ctx) => {
|
|
145
|
+
const file = ctx.flags.file;
|
|
146
|
+
const section = ctx.flags.section;
|
|
147
|
+
const patchPath = ctx.flags.patch;
|
|
148
|
+
const dataPath = ctx.flags.data;
|
|
149
|
+
if (!file || !section)
|
|
150
|
+
return fail('--file and --section are required');
|
|
151
|
+
if (!patchPath && !dataPath)
|
|
152
|
+
return fail('Provide --patch (RVFP file) or --data (raw section data)');
|
|
153
|
+
if (!(await requireFile(file)))
|
|
154
|
+
return { success: false, exitCode: 1 };
|
|
155
|
+
try {
|
|
156
|
+
const dist = await import('../appliance/rvfa-distribution.js');
|
|
157
|
+
const { RvfaReader } = await import('../appliance/rvfa-format.js');
|
|
158
|
+
const fs = await import('fs');
|
|
159
|
+
hdr('RVFA Hot-Patch Update');
|
|
160
|
+
output.printInfo(`Appliance: ${file}`);
|
|
161
|
+
output.printInfo(`Section: ${section}`);
|
|
162
|
+
output.writeln();
|
|
163
|
+
let patchBuf;
|
|
164
|
+
if (patchPath) {
|
|
165
|
+
if (!(await requireFile(patchPath)))
|
|
166
|
+
return { success: false, exitCode: 1 };
|
|
167
|
+
patchBuf = fs.readFileSync(patchPath);
|
|
168
|
+
output.printInfo(`Patch file: ${patchPath} (${fmtSize(patchBuf.length)})`);
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
if (!(await requireFile(dataPath)))
|
|
172
|
+
return { success: false, exitCode: 1 };
|
|
173
|
+
const newData = fs.readFileSync(dataPath);
|
|
174
|
+
const reader = await RvfaReader.fromFile(file);
|
|
175
|
+
const appHdr = reader.getHeader();
|
|
176
|
+
output.printInfo(`Creating patch for section "${section}" (${fmtSize(newData.length)} new data)`);
|
|
177
|
+
patchBuf = await dist.RvfaPatcher.createPatch({
|
|
178
|
+
targetName: appHdr.name,
|
|
179
|
+
targetVersion: appHdr.appVersion,
|
|
180
|
+
sectionId: section,
|
|
181
|
+
sectionData: newData,
|
|
182
|
+
patchVersion: ctx.flags.version || '0.0.1',
|
|
183
|
+
compression: 'gzip',
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
let pubKey;
|
|
187
|
+
if (ctx.flags['public-key']) {
|
|
188
|
+
const pkPath = ctx.flags['public-key'];
|
|
189
|
+
if (!(await requireFile(pkPath)))
|
|
190
|
+
return { success: false, exitCode: 1 };
|
|
191
|
+
pubKey = fs.readFileSync(pkPath);
|
|
192
|
+
}
|
|
193
|
+
const result = await dist.RvfaPatcher.applyPatch(file, patchBuf, {
|
|
194
|
+
backup: !ctx.flags['no-backup'],
|
|
195
|
+
verify: true,
|
|
196
|
+
publicKey: pubKey,
|
|
197
|
+
});
|
|
198
|
+
if (result.success) {
|
|
199
|
+
output.printSuccess(`Section "${result.patchedSection}" updated successfully`);
|
|
200
|
+
output.printInfo(`New size: ${fmtSize(result.newSize)}`);
|
|
201
|
+
if (result.backupPath)
|
|
202
|
+
output.printInfo(`Backup: ${result.backupPath}`);
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
output.printError('Patch failed');
|
|
206
|
+
result.errors.forEach(e => output.writeln(` ${output.error('X')} ${e}`));
|
|
207
|
+
}
|
|
208
|
+
return { success: result.success, exitCode: result.success ? 0 : 1, data: result };
|
|
209
|
+
}
|
|
210
|
+
catch (err) {
|
|
211
|
+
return fail('Update failed', errMsg(err));
|
|
212
|
+
}
|
|
213
|
+
},
|
|
214
|
+
};
|
|
215
|
+
//# sourceMappingURL=appliance-advanced.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"appliance-advanced.js","sourceRoot":"","sources":["../../../src/commands/appliance-advanced.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* V3 CLI Appliance Command
|
|
3
|
+
* Self-contained RVFA appliance management (build, inspect, verify, extract, run, sign, publish, update)
|
|
4
|
+
*/
|
|
5
|
+
import type { Command } from '../types.js';
|
|
6
|
+
export declare const applianceCommand: Command;
|
|
7
|
+
export default applianceCommand;
|
|
8
|
+
//# sourceMappingURL=appliance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"appliance.d.ts","sourceRoot":"","sources":["../../../src/commands/appliance.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAiC,MAAM,aAAa,CAAC;AA4Y1E,eAAO,MAAM,gBAAgB,EAAE,OA0C9B,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
|