@ai-dossier/core 1.0.1
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/dist/checksum.d.ts +15 -0
- package/dist/checksum.d.ts.map +1 -0
- package/dist/checksum.js +45 -0
- package/dist/checksum.js.map +1 -0
- package/dist/formatter/formatter.d.ts +3 -0
- package/dist/formatter/formatter.d.ts.map +1 -0
- package/dist/formatter/formatter.js +120 -0
- package/dist/formatter/formatter.js.map +1 -0
- package/dist/formatter/index.d.ts +5 -0
- package/dist/formatter/index.d.ts.map +1 -0
- package/dist/formatter/index.js +32 -0
- package/dist/formatter/index.js.map +1 -0
- package/dist/formatter/types.d.ts +11 -0
- package/dist/formatter/types.d.ts.map +1 -0
- package/dist/formatter/types.js +9 -0
- package/dist/formatter/types.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +77 -0
- package/dist/index.js.map +1 -0
- package/dist/linter/config.d.ts +4 -0
- package/dist/linter/config.d.ts.map +1 -0
- package/dist/linter/config.js +42 -0
- package/dist/linter/config.js.map +1 -0
- package/dist/linter/index.d.ts +8 -0
- package/dist/linter/index.d.ts.map +1 -0
- package/dist/linter/index.js +69 -0
- package/dist/linter/index.js.map +1 -0
- package/dist/linter/registry.d.ts +10 -0
- package/dist/linter/registry.d.ts.map +1 -0
- package/dist/linter/registry.js +37 -0
- package/dist/linter/registry.js.map +1 -0
- package/dist/linter/rules/checksum-valid.d.ts +3 -0
- package/dist/linter/rules/checksum-valid.d.ts.map +1 -0
- package/dist/linter/rules/checksum-valid.js +46 -0
- package/dist/linter/rules/checksum-valid.js.map +1 -0
- package/dist/linter/rules/index.d.ts +11 -0
- package/dist/linter/rules/index.d.ts.map +1 -0
- package/dist/linter/rules/index.js +27 -0
- package/dist/linter/rules/index.js.map +1 -0
- package/dist/linter/rules/objective-quality.d.ts +3 -0
- package/dist/linter/rules/objective-quality.d.ts.map +1 -0
- package/dist/linter/rules/objective-quality.js +44 -0
- package/dist/linter/rules/objective-quality.js.map +1 -0
- package/dist/linter/rules/required-sections.d.ts +3 -0
- package/dist/linter/rules/required-sections.d.ts.map +1 -0
- package/dist/linter/rules/required-sections.js +32 -0
- package/dist/linter/rules/required-sections.js.map +1 -0
- package/dist/linter/rules/risk-level-consistency.d.ts +3 -0
- package/dist/linter/rules/risk-level-consistency.d.ts.map +1 -0
- package/dist/linter/rules/risk-level-consistency.js +24 -0
- package/dist/linter/rules/risk-level-consistency.js.map +1 -0
- package/dist/linter/rules/schema-valid.d.ts +3 -0
- package/dist/linter/rules/schema-valid.d.ts.map +1 -0
- package/dist/linter/rules/schema-valid.js +63 -0
- package/dist/linter/rules/schema-valid.js.map +1 -0
- package/dist/linter/rules/semver-version.d.ts +3 -0
- package/dist/linter/rules/semver-version.d.ts.map +1 -0
- package/dist/linter/rules/semver-version.js +34 -0
- package/dist/linter/rules/semver-version.js.map +1 -0
- package/dist/linter/rules/tools-check-command.d.ts +3 -0
- package/dist/linter/rules/tools-check-command.d.ts.map +1 -0
- package/dist/linter/rules/tools-check-command.js +27 -0
- package/dist/linter/rules/tools-check-command.js.map +1 -0
- package/dist/linter/types.d.ts +31 -0
- package/dist/linter/types.d.ts.map +1 -0
- package/dist/linter/types.js +3 -0
- package/dist/linter/types.js.map +1 -0
- package/dist/parser.d.ts +18 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +74 -0
- package/dist/parser.js.map +1 -0
- package/dist/schema/dossier-schema.json +745 -0
- package/dist/signature.d.ts +33 -0
- package/dist/signature.d.ts.map +1 -0
- package/dist/signature.js +111 -0
- package/dist/signature.js.map +1 -0
- package/dist/signers/ed25519.d.ts +17 -0
- package/dist/signers/ed25519.d.ts.map +1 -0
- package/dist/signers/ed25519.js +66 -0
- package/dist/signers/ed25519.js.map +1 -0
- package/dist/signers/index.d.ts +39 -0
- package/dist/signers/index.d.ts.map +1 -0
- package/dist/signers/index.js +18 -0
- package/dist/signers/index.js.map +1 -0
- package/dist/signers/kms.d.ts +20 -0
- package/dist/signers/kms.d.ts.map +1 -0
- package/dist/signers/kms.js +108 -0
- package/dist/signers/kms.js.map +1 -0
- package/dist/signers/registry.d.ts +29 -0
- package/dist/signers/registry.d.ts.map +1 -0
- package/dist/signers/registry.js +67 -0
- package/dist/signers/registry.js.map +1 -0
- package/dist/types.d.ts +79 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/crypto.d.ts +16 -0
- package/dist/utils/crypto.d.ts.map +1 -0
- package/dist/utils/crypto.js +25 -0
- package/dist/utils/crypto.js.map +1 -0
- package/dist/utils/errors.d.ts +18 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +32 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/fs.d.ts +12 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +24 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/verification.d.ts +11 -0
- package/dist/utils/verification.d.ts.map +1 -0
- package/dist/utils/verification.js +35 -0
- package/dist/utils/verification.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dossier Signature Verification
|
|
3
|
+
*
|
|
4
|
+
* This module provides signature verification for dossiers,
|
|
5
|
+
* supporting multiple signature schemes (Ed25519 and AWS KMS).
|
|
6
|
+
*/
|
|
7
|
+
import type { SignatureResult } from './signers';
|
|
8
|
+
/**
|
|
9
|
+
* Load trusted keys from file
|
|
10
|
+
* Default location: ~/.dossier/trusted-keys.txt
|
|
11
|
+
* Format: <public-key> <key-id>
|
|
12
|
+
*/
|
|
13
|
+
export declare function loadTrustedKeys(filePath?: string): Map<string, string>;
|
|
14
|
+
/**
|
|
15
|
+
* Verify signature using Ed25519
|
|
16
|
+
* @param content - The content to verify
|
|
17
|
+
* @param signature - Base64-encoded signature
|
|
18
|
+
* @param publicKey - PEM-format Ed25519 public key
|
|
19
|
+
*/
|
|
20
|
+
export declare function verifyWithEd25519(content: string, signature: string, publicKey: string): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Verify signature using AWS KMS (ECDSA-SHA-256)
|
|
23
|
+
*/
|
|
24
|
+
export declare function verifyWithKms(content: string, signature: string, keyId: string, region?: string): Promise<boolean>;
|
|
25
|
+
/**
|
|
26
|
+
* Verify signature using the registry pattern
|
|
27
|
+
* This is a convenience function that encapsulates registry lookup
|
|
28
|
+
* @param content - The content to verify
|
|
29
|
+
* @param signature - Signature result object containing algorithm and signature data
|
|
30
|
+
* @returns Promise<boolean> - true if signature is valid, false otherwise
|
|
31
|
+
*/
|
|
32
|
+
export declare function verifySignature(content: string, signature: SignatureResult): Promise<boolean>;
|
|
33
|
+
//# sourceMappingURL=signature.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signature.d.ts","sourceRoot":"","sources":["../src/signature.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAKjD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CA+BtE;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAiBhG;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,MAAM,SAAc,GACnB,OAAO,CAAC,OAAO,CAAC,CAsBlB;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,eAAe,GACzB,OAAO,CAAC,OAAO,CAAC,CAIlB"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Dossier Signature Verification
|
|
4
|
+
*
|
|
5
|
+
* This module provides signature verification for dossiers,
|
|
6
|
+
* supporting multiple signature schemes (Ed25519 and AWS KMS).
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.loadTrustedKeys = loadTrustedKeys;
|
|
10
|
+
exports.verifyWithEd25519 = verifyWithEd25519;
|
|
11
|
+
exports.verifyWithKms = verifyWithKms;
|
|
12
|
+
exports.verifySignature = verifySignature;
|
|
13
|
+
const node_crypto_1 = require("node:crypto");
|
|
14
|
+
const node_os_1 = require("node:os");
|
|
15
|
+
const node_path_1 = require("node:path");
|
|
16
|
+
const client_kms_1 = require("@aws-sdk/client-kms");
|
|
17
|
+
const signers_1 = require("./signers");
|
|
18
|
+
const crypto_1 = require("./utils/crypto");
|
|
19
|
+
const fs_1 = require("./utils/fs");
|
|
20
|
+
/**
|
|
21
|
+
* Load trusted keys from file
|
|
22
|
+
* Default location: ~/.dossier/trusted-keys.txt
|
|
23
|
+
* Format: <public-key> <key-id>
|
|
24
|
+
*/
|
|
25
|
+
function loadTrustedKeys(filePath) {
|
|
26
|
+
const keysPath = filePath || (0, node_path_1.join)((0, node_os_1.homedir)(), '.dossier', 'trusted-keys.txt');
|
|
27
|
+
const keys = new Map();
|
|
28
|
+
const content = (0, fs_1.readFileIfExists)(keysPath);
|
|
29
|
+
if (!content) {
|
|
30
|
+
return keys;
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
for (const line of content.split('\n')) {
|
|
34
|
+
const trimmed = line.trim();
|
|
35
|
+
// Skip empty lines and comments
|
|
36
|
+
if (!trimmed || trimmed.startsWith('#')) {
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
// Parse: <public-key> <key-id>
|
|
40
|
+
const parts = trimmed.split(/\s+/);
|
|
41
|
+
if (parts.length >= 2) {
|
|
42
|
+
const publicKey = parts[0];
|
|
43
|
+
const keyId = parts.slice(1).join(' ');
|
|
44
|
+
keys.set(publicKey, keyId);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch (_err) {
|
|
49
|
+
// Silently handle errors - consumers can check the returned Map size
|
|
50
|
+
}
|
|
51
|
+
return keys;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Verify signature using Ed25519
|
|
55
|
+
* @param content - The content to verify
|
|
56
|
+
* @param signature - Base64-encoded signature
|
|
57
|
+
* @param publicKey - PEM-format Ed25519 public key
|
|
58
|
+
*/
|
|
59
|
+
function verifyWithEd25519(content, signature, publicKey) {
|
|
60
|
+
try {
|
|
61
|
+
const signatureBuffer = Buffer.from(signature, 'base64');
|
|
62
|
+
const contentBuffer = Buffer.from(content, 'utf8');
|
|
63
|
+
// Create public key object from PEM
|
|
64
|
+
const publicKeyObject = (0, node_crypto_1.createPublicKey)({
|
|
65
|
+
key: publicKey,
|
|
66
|
+
format: 'pem',
|
|
67
|
+
type: 'spki',
|
|
68
|
+
});
|
|
69
|
+
// Verify Ed25519 signature (algorithm is null for Ed25519)
|
|
70
|
+
return (0, node_crypto_1.verify)(null, contentBuffer, publicKeyObject, signatureBuffer);
|
|
71
|
+
}
|
|
72
|
+
catch (_err) {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Verify signature using AWS KMS (ECDSA-SHA-256)
|
|
78
|
+
*/
|
|
79
|
+
async function verifyWithKms(content, signature, keyId, region = 'us-east-1') {
|
|
80
|
+
const client = new client_kms_1.KMSClient({ region });
|
|
81
|
+
// Calculate SHA256 digest of content (must match signing process)
|
|
82
|
+
const hash = (0, crypto_1.sha256Hash)(content);
|
|
83
|
+
const signatureBuffer = Buffer.from(signature, 'base64');
|
|
84
|
+
const command = new client_kms_1.VerifyCommand({
|
|
85
|
+
KeyId: keyId,
|
|
86
|
+
Message: hash,
|
|
87
|
+
MessageType: 'DIGEST',
|
|
88
|
+
Signature: signatureBuffer,
|
|
89
|
+
SigningAlgorithm: client_kms_1.SigningAlgorithmSpec.ECDSA_SHA_256,
|
|
90
|
+
});
|
|
91
|
+
try {
|
|
92
|
+
const response = await client.send(command);
|
|
93
|
+
return response.SignatureValid === true;
|
|
94
|
+
}
|
|
95
|
+
catch (_err) {
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Verify signature using the registry pattern
|
|
101
|
+
* This is a convenience function that encapsulates registry lookup
|
|
102
|
+
* @param content - The content to verify
|
|
103
|
+
* @param signature - Signature result object containing algorithm and signature data
|
|
104
|
+
* @returns Promise<boolean> - true if signature is valid, false otherwise
|
|
105
|
+
*/
|
|
106
|
+
async function verifySignature(content, signature) {
|
|
107
|
+
const verifierRegistry = (0, signers_1.getVerifierRegistry)();
|
|
108
|
+
const verifier = verifierRegistry.get(signature.algorithm);
|
|
109
|
+
return await verifier.verify(content, signature);
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=signature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signature.js","sourceRoot":"","sources":["../src/signature.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ed25519 Signer and Verifier using Node.js crypto
|
|
3
|
+
*/
|
|
4
|
+
import type { SignatureResult, Signer, Verifier } from './index';
|
|
5
|
+
export declare class Ed25519Signer implements Signer {
|
|
6
|
+
readonly algorithm = "ed25519";
|
|
7
|
+
private privateKey;
|
|
8
|
+
private publicKeyPem;
|
|
9
|
+
constructor(privateKeyPath: string);
|
|
10
|
+
sign(content: string): Promise<SignatureResult>;
|
|
11
|
+
getPublicKey(): Promise<string>;
|
|
12
|
+
}
|
|
13
|
+
export declare class Ed25519Verifier implements Verifier {
|
|
14
|
+
supports(algorithm: string): boolean;
|
|
15
|
+
verify(content: string, signature: SignatureResult): Promise<boolean>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=ed25519.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ed25519.d.ts","sourceRoot":"","sources":["../../src/signers/ed25519.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEjE,qBAAa,aAAc,YAAW,MAAM;IAC1C,QAAQ,CAAC,SAAS,aAAa;IAC/B,OAAO,CAAC,UAAU,CAAY;IAC9B,OAAO,CAAC,YAAY,CAAS;gBAEjB,cAAc,EAAE,MAAM;IAiB5B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAY/C,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;CAGtC;AAED,qBAAa,eAAgB,YAAW,QAAQ;IAC9C,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI9B,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;CAkB5E"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Ed25519 Signer and Verifier using Node.js crypto
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.Ed25519Verifier = exports.Ed25519Signer = void 0;
|
|
7
|
+
const node_crypto_1 = require("node:crypto");
|
|
8
|
+
const node_fs_1 = require("node:fs");
|
|
9
|
+
class Ed25519Signer {
|
|
10
|
+
algorithm = 'ed25519';
|
|
11
|
+
privateKey;
|
|
12
|
+
publicKeyPem;
|
|
13
|
+
constructor(privateKeyPath) {
|
|
14
|
+
// Load private key from PEM file
|
|
15
|
+
const privateKeyPem = (0, node_fs_1.readFileSync)(privateKeyPath, 'utf8');
|
|
16
|
+
this.privateKey = (0, node_crypto_1.createPrivateKey)({
|
|
17
|
+
key: privateKeyPem,
|
|
18
|
+
format: 'pem',
|
|
19
|
+
type: 'pkcs8',
|
|
20
|
+
});
|
|
21
|
+
// Extract public key
|
|
22
|
+
const publicKey = (0, node_crypto_1.createPublicKey)(this.privateKey);
|
|
23
|
+
this.publicKeyPem = publicKey.export({
|
|
24
|
+
type: 'spki',
|
|
25
|
+
format: 'pem',
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
async sign(content) {
|
|
29
|
+
const contentBuffer = Buffer.from(content, 'utf8');
|
|
30
|
+
const signatureBuffer = (0, node_crypto_1.sign)(null, contentBuffer, this.privateKey);
|
|
31
|
+
return {
|
|
32
|
+
algorithm: this.algorithm,
|
|
33
|
+
signature: signatureBuffer.toString('base64'),
|
|
34
|
+
public_key: this.publicKeyPem,
|
|
35
|
+
signed_at: new Date().toISOString(),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
async getPublicKey() {
|
|
39
|
+
return this.publicKeyPem;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
exports.Ed25519Signer = Ed25519Signer;
|
|
43
|
+
class Ed25519Verifier {
|
|
44
|
+
supports(algorithm) {
|
|
45
|
+
return algorithm === 'ed25519';
|
|
46
|
+
}
|
|
47
|
+
async verify(content, signature) {
|
|
48
|
+
try {
|
|
49
|
+
const signatureBuffer = Buffer.from(signature.signature, 'base64');
|
|
50
|
+
const contentBuffer = Buffer.from(content, 'utf8');
|
|
51
|
+
// Create public key object from PEM
|
|
52
|
+
const publicKeyObject = (0, node_crypto_1.createPublicKey)({
|
|
53
|
+
key: signature.public_key,
|
|
54
|
+
format: 'pem',
|
|
55
|
+
type: 'spki',
|
|
56
|
+
});
|
|
57
|
+
// Verify Ed25519 signature
|
|
58
|
+
return (0, node_crypto_1.verify)(null, contentBuffer, publicKeyObject, signatureBuffer);
|
|
59
|
+
}
|
|
60
|
+
catch (_err) {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
exports.Ed25519Verifier = Ed25519Verifier;
|
|
66
|
+
//# sourceMappingURL=ed25519.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ed25519.js","sourceRoot":"","sources":["../../src/signers/ed25519.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAGH,6CAA8E;AAC9E,qCAAuC;AAGvC,MAAa,aAAa;IACf,SAAS,GAAG,SAAS,CAAC;IACvB,UAAU,CAAY;IACtB,YAAY,CAAS;IAE7B,YAAY,cAAsB;QAChC,iCAAiC;QACjC,MAAM,aAAa,GAAG,IAAA,sBAAY,EAAC,cAAc,EAAE,MAAM,CAAC,CAAC;QAC3D,IAAI,CAAC,UAAU,GAAG,IAAA,8BAAgB,EAAC;YACjC,GAAG,EAAE,aAAa;YAClB,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,OAAO;SACd,CAAC,CAAC;QAEH,qBAAqB;QACrB,MAAM,SAAS,GAAG,IAAA,6BAAe,EAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACnD,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC,MAAM,CAAC;YACnC,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,KAAK;SACd,CAAW,CAAC;IACf,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAe;QACxB,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACnD,MAAM,eAAe,GAAG,IAAA,kBAAI,EAAC,IAAI,EAAE,aAAa,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAEnE,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC7C,UAAU,EAAE,IAAI,CAAC,YAAY;YAC7B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;CACF;AArCD,sCAqCC;AAED,MAAa,eAAe;IAC1B,QAAQ,CAAC,SAAiB;QACxB,OAAO,SAAS,KAAK,SAAS,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAe,EAAE,SAA0B;QACtD,IAAI,CAAC;YACH,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YACnE,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAEnD,oCAAoC;YACpC,MAAM,eAAe,GAAG,IAAA,6BAAe,EAAC;gBACtC,GAAG,EAAE,SAAS,CAAC,UAAU;gBACzB,MAAM,EAAE,KAAK;gBACb,IAAI,EAAE,MAAM;aACb,CAAC,CAAC;YAEH,2BAA2B;YAC3B,OAAO,IAAA,oBAAM,EAAC,IAAI,EAAE,aAAa,EAAE,eAAe,EAAE,eAAe,CAAC,CAAC;QACvE,CAAC;QAAC,OAAO,IAAI,EAAE,CAAC;YACd,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF;AAvBD,0CAuBC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Signer and Verifier interfaces for dossier signatures
|
|
3
|
+
*/
|
|
4
|
+
export interface SignatureResult {
|
|
5
|
+
algorithm: string;
|
|
6
|
+
signature: string;
|
|
7
|
+
public_key: string;
|
|
8
|
+
key_id?: string;
|
|
9
|
+
signed_by?: string;
|
|
10
|
+
signed_at: string;
|
|
11
|
+
}
|
|
12
|
+
export interface Signer {
|
|
13
|
+
/**
|
|
14
|
+
* Sign content and return signature metadata
|
|
15
|
+
*/
|
|
16
|
+
sign(content: string): Promise<SignatureResult>;
|
|
17
|
+
/**
|
|
18
|
+
* Get the public key in PEM format
|
|
19
|
+
*/
|
|
20
|
+
getPublicKey(): Promise<string>;
|
|
21
|
+
/**
|
|
22
|
+
* Algorithm identifier
|
|
23
|
+
*/
|
|
24
|
+
readonly algorithm: string;
|
|
25
|
+
}
|
|
26
|
+
export interface Verifier {
|
|
27
|
+
/**
|
|
28
|
+
* Verify a signature
|
|
29
|
+
*/
|
|
30
|
+
verify(content: string, signature: SignatureResult): Promise<boolean>;
|
|
31
|
+
/**
|
|
32
|
+
* Check if this verifier supports the given algorithm
|
|
33
|
+
*/
|
|
34
|
+
supports(algorithm: string): boolean;
|
|
35
|
+
}
|
|
36
|
+
export { Ed25519Signer, Ed25519Verifier } from './ed25519';
|
|
37
|
+
export { KmsSigner, KmsVerifier } from './kms';
|
|
38
|
+
export { getVerifierRegistry, VerifierRegistry, } from './registry';
|
|
39
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/signers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,MAAM;IACrB;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAEhD;;OAEG;IACH,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAEhC;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,QAAQ;IACvB;;OAEG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEtE;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;CACtC;AAGD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAG/C,OAAO,EACL,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Signer and Verifier interfaces for dossier signatures
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.VerifierRegistry = exports.getVerifierRegistry = exports.KmsVerifier = exports.KmsSigner = exports.Ed25519Verifier = exports.Ed25519Signer = void 0;
|
|
7
|
+
// Export implementations
|
|
8
|
+
var ed25519_1 = require("./ed25519");
|
|
9
|
+
Object.defineProperty(exports, "Ed25519Signer", { enumerable: true, get: function () { return ed25519_1.Ed25519Signer; } });
|
|
10
|
+
Object.defineProperty(exports, "Ed25519Verifier", { enumerable: true, get: function () { return ed25519_1.Ed25519Verifier; } });
|
|
11
|
+
var kms_1 = require("./kms");
|
|
12
|
+
Object.defineProperty(exports, "KmsSigner", { enumerable: true, get: function () { return kms_1.KmsSigner; } });
|
|
13
|
+
Object.defineProperty(exports, "KmsVerifier", { enumerable: true, get: function () { return kms_1.KmsVerifier; } });
|
|
14
|
+
// Export registry
|
|
15
|
+
var registry_1 = require("./registry");
|
|
16
|
+
Object.defineProperty(exports, "getVerifierRegistry", { enumerable: true, get: function () { return registry_1.getVerifierRegistry; } });
|
|
17
|
+
Object.defineProperty(exports, "VerifierRegistry", { enumerable: true, get: function () { return registry_1.VerifierRegistry; } });
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/signers/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAwCH,yBAAyB;AACzB,qCAA2D;AAAlD,wGAAA,aAAa,OAAA;AAAE,0GAAA,eAAe,OAAA;AACvC,6BAA+C;AAAtC,gGAAA,SAAS,OAAA;AAAE,kGAAA,WAAW,OAAA;AAE/B,kBAAkB;AAClB,uCAGoB;AAFlB,+GAAA,mBAAmB,OAAA;AACnB,4GAAA,gBAAgB,OAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AWS KMS Signer and Verifier
|
|
3
|
+
*/
|
|
4
|
+
import type { SignatureResult, Signer, Verifier } from './index';
|
|
5
|
+
export declare class KmsSigner implements Signer {
|
|
6
|
+
private keyId;
|
|
7
|
+
readonly algorithm = "ECDSA-SHA-256";
|
|
8
|
+
private client;
|
|
9
|
+
constructor(keyId: string, region?: string);
|
|
10
|
+
sign(content: string): Promise<SignatureResult>;
|
|
11
|
+
getPublicKey(): Promise<string>;
|
|
12
|
+
}
|
|
13
|
+
export declare class KmsVerifier implements Verifier {
|
|
14
|
+
private clients;
|
|
15
|
+
supports(algorithm: string): boolean;
|
|
16
|
+
verify(content: string, signature: SignatureResult): Promise<boolean>;
|
|
17
|
+
private getClient;
|
|
18
|
+
private extractRegionFromArn;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=kms.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kms.d.ts","sourceRoot":"","sources":["../../src/signers/kms.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEjE,qBAAa,SAAU,YAAW,MAAM;IAKpC,OAAO,CAAC,KAAK;IAJf,QAAQ,CAAC,SAAS,mBAAmB;IACrC,OAAO,CAAC,MAAM,CAAY;gBAGhB,KAAK,EAAE,MAAM,EACrB,MAAM,GAAE,MAAoB;IAKxB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAyC/C,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;CAYtC;AAED,qBAAa,WAAY,YAAW,QAAQ;IAC1C,OAAO,CAAC,OAAO,CAAqC;IAEpD,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI9B,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IA6B3E,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,oBAAoB;CAK7B"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* AWS KMS Signer and Verifier
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.KmsVerifier = exports.KmsSigner = void 0;
|
|
7
|
+
const client_kms_1 = require("@aws-sdk/client-kms");
|
|
8
|
+
const crypto_1 = require("../utils/crypto");
|
|
9
|
+
class KmsSigner {
|
|
10
|
+
keyId;
|
|
11
|
+
algorithm = 'ECDSA-SHA-256';
|
|
12
|
+
client;
|
|
13
|
+
constructor(keyId, region = 'us-east-1') {
|
|
14
|
+
this.keyId = keyId;
|
|
15
|
+
this.client = new client_kms_1.KMSClient({ region });
|
|
16
|
+
}
|
|
17
|
+
async sign(content) {
|
|
18
|
+
// Calculate SHA256 digest of content
|
|
19
|
+
const hash = (0, crypto_1.sha256Hash)(content);
|
|
20
|
+
// Sign the digest with KMS
|
|
21
|
+
const signCommand = new client_kms_1.SignCommand({
|
|
22
|
+
KeyId: this.keyId,
|
|
23
|
+
Message: hash,
|
|
24
|
+
MessageType: 'DIGEST',
|
|
25
|
+
SigningAlgorithm: client_kms_1.SigningAlgorithmSpec.ECDSA_SHA_256,
|
|
26
|
+
});
|
|
27
|
+
const signResponse = await this.client.send(signCommand);
|
|
28
|
+
if (!signResponse.Signature) {
|
|
29
|
+
throw new Error('KMS signing failed: no signature returned');
|
|
30
|
+
}
|
|
31
|
+
const signature = Buffer.from(signResponse.Signature).toString('base64');
|
|
32
|
+
// Get public key from KMS
|
|
33
|
+
const pubKeyCommand = new client_kms_1.GetPublicKeyCommand({
|
|
34
|
+
KeyId: this.keyId,
|
|
35
|
+
});
|
|
36
|
+
const pubKeyResponse = await this.client.send(pubKeyCommand);
|
|
37
|
+
if (!pubKeyResponse.PublicKey) {
|
|
38
|
+
throw new Error('KMS failed to return public key');
|
|
39
|
+
}
|
|
40
|
+
const publicKey = Buffer.from(pubKeyResponse.PublicKey).toString('base64');
|
|
41
|
+
const keyArn = pubKeyResponse.KeyId || this.keyId;
|
|
42
|
+
return {
|
|
43
|
+
algorithm: this.algorithm,
|
|
44
|
+
signature,
|
|
45
|
+
public_key: publicKey,
|
|
46
|
+
key_id: keyArn,
|
|
47
|
+
signed_at: new Date().toISOString(),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
async getPublicKey() {
|
|
51
|
+
const command = new client_kms_1.GetPublicKeyCommand({
|
|
52
|
+
KeyId: this.keyId,
|
|
53
|
+
});
|
|
54
|
+
const response = await this.client.send(command);
|
|
55
|
+
if (!response.PublicKey) {
|
|
56
|
+
throw new Error('KMS failed to return public key');
|
|
57
|
+
}
|
|
58
|
+
return Buffer.from(response.PublicKey).toString('base64');
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
exports.KmsSigner = KmsSigner;
|
|
62
|
+
class KmsVerifier {
|
|
63
|
+
clients = new Map();
|
|
64
|
+
supports(algorithm) {
|
|
65
|
+
return algorithm === 'ECDSA-SHA-256';
|
|
66
|
+
}
|
|
67
|
+
async verify(content, signature) {
|
|
68
|
+
if (!signature.key_id) {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
try {
|
|
72
|
+
// Extract region from key ARN if available, otherwise use default
|
|
73
|
+
const region = this.extractRegionFromArn(signature.key_id) || 'us-east-1';
|
|
74
|
+
const client = this.getClient(region);
|
|
75
|
+
// Calculate SHA256 digest to match what was signed
|
|
76
|
+
const hash = (0, crypto_1.sha256Hash)(content);
|
|
77
|
+
const signatureBuffer = Buffer.from(signature.signature, 'base64');
|
|
78
|
+
const command = new client_kms_1.VerifyCommand({
|
|
79
|
+
KeyId: signature.key_id,
|
|
80
|
+
Message: hash,
|
|
81
|
+
MessageType: 'DIGEST',
|
|
82
|
+
Signature: signatureBuffer,
|
|
83
|
+
SigningAlgorithm: client_kms_1.SigningAlgorithmSpec.ECDSA_SHA_256,
|
|
84
|
+
});
|
|
85
|
+
const response = await client.send(command);
|
|
86
|
+
return response.SignatureValid === true;
|
|
87
|
+
}
|
|
88
|
+
catch (_err) {
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
getClient(region) {
|
|
93
|
+
const existing = this.clients.get(region);
|
|
94
|
+
if (existing) {
|
|
95
|
+
return existing;
|
|
96
|
+
}
|
|
97
|
+
const client = new client_kms_1.KMSClient({ region });
|
|
98
|
+
this.clients.set(region, client);
|
|
99
|
+
return client;
|
|
100
|
+
}
|
|
101
|
+
extractRegionFromArn(keyId) {
|
|
102
|
+
// ARN format: arn:aws:kms:REGION:ACCOUNT:key/KEY_ID
|
|
103
|
+
const arnMatch = keyId.match(/^arn:aws:kms:([^:]+):/);
|
|
104
|
+
return arnMatch ? arnMatch[1] : null;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
exports.KmsVerifier = KmsVerifier;
|
|
108
|
+
//# sourceMappingURL=kms.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kms.js","sourceRoot":"","sources":["../../src/signers/kms.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry for Verifier instances
|
|
3
|
+
*/
|
|
4
|
+
import type { Verifier } from './index';
|
|
5
|
+
export declare class VerifierRegistry {
|
|
6
|
+
private verifiers;
|
|
7
|
+
/**
|
|
8
|
+
* Register a verifier
|
|
9
|
+
*/
|
|
10
|
+
register(verifier: Verifier): void;
|
|
11
|
+
/**
|
|
12
|
+
* Get a verifier that supports the given algorithm
|
|
13
|
+
* @throws Error if no verifier supports the algorithm
|
|
14
|
+
*/
|
|
15
|
+
get(algorithm: string): Verifier;
|
|
16
|
+
/**
|
|
17
|
+
* Check if any verifier supports the algorithm
|
|
18
|
+
*/
|
|
19
|
+
has(algorithm: string): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Get all supported algorithms
|
|
22
|
+
*/
|
|
23
|
+
getSupportedAlgorithms(): string[];
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Get the global verifier registry (creates it if needed)
|
|
27
|
+
*/
|
|
28
|
+
export declare function getVerifierRegistry(): VerifierRegistry;
|
|
29
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/signers/registry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,SAAS,CAAkB;IAEnC;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAIlC;;;OAGG;IACH,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ;IAQhC;;OAEG;IACH,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI/B;;OAEG;IACH,sBAAsB,IAAI,MAAM,EAAE;CAInC;AAKD;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,gBAAgB,CAOtD"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Registry for Verifier instances
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.VerifierRegistry = void 0;
|
|
7
|
+
exports.getVerifierRegistry = getVerifierRegistry;
|
|
8
|
+
class VerifierRegistry {
|
|
9
|
+
verifiers = [];
|
|
10
|
+
/**
|
|
11
|
+
* Register a verifier
|
|
12
|
+
*/
|
|
13
|
+
register(verifier) {
|
|
14
|
+
this.verifiers.push(verifier);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Get a verifier that supports the given algorithm
|
|
18
|
+
* @throws Error if no verifier supports the algorithm
|
|
19
|
+
*/
|
|
20
|
+
get(algorithm) {
|
|
21
|
+
const verifier = this.verifiers.find((v) => v.supports(algorithm));
|
|
22
|
+
if (!verifier) {
|
|
23
|
+
throw new Error(`No verifier registered for algorithm: ${algorithm}`);
|
|
24
|
+
}
|
|
25
|
+
return verifier;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Check if any verifier supports the algorithm
|
|
29
|
+
*/
|
|
30
|
+
has(algorithm) {
|
|
31
|
+
return this.verifiers.some((v) => v.supports(algorithm));
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Get all supported algorithms
|
|
35
|
+
*/
|
|
36
|
+
getSupportedAlgorithms() {
|
|
37
|
+
// Note: This returns a simple list, but verifiers may support multiple algorithms
|
|
38
|
+
return ['ed25519', 'ECDSA-SHA-256'];
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
exports.VerifierRegistry = VerifierRegistry;
|
|
42
|
+
// Global singleton instance
|
|
43
|
+
let globalVerifierRegistry = null;
|
|
44
|
+
/**
|
|
45
|
+
* Get the global verifier registry (creates it if needed)
|
|
46
|
+
*/
|
|
47
|
+
function getVerifierRegistry() {
|
|
48
|
+
if (!globalVerifierRegistry) {
|
|
49
|
+
globalVerifierRegistry = new VerifierRegistry();
|
|
50
|
+
// Auto-register built-in verifiers
|
|
51
|
+
initializeBuiltInVerifiers();
|
|
52
|
+
}
|
|
53
|
+
return globalVerifierRegistry;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Initialize built-in verifiers
|
|
57
|
+
*/
|
|
58
|
+
function initializeBuiltInVerifiers() {
|
|
59
|
+
if (!globalVerifierRegistry)
|
|
60
|
+
return;
|
|
61
|
+
// Import and register built-in verifiers
|
|
62
|
+
const { Ed25519Verifier } = require('./ed25519');
|
|
63
|
+
const { KmsVerifier } = require('./kms');
|
|
64
|
+
globalVerifierRegistry.register(new Ed25519Verifier());
|
|
65
|
+
globalVerifierRegistry.register(new KmsVerifier());
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/signers/registry.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAgDH,kDAOC;AAnDD,MAAa,gBAAgB;IACnB,SAAS,GAAe,EAAE,CAAC;IAEnC;;OAEG;IACH,QAAQ,CAAC,QAAkB;QACzB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAED;;;OAGG;IACH,GAAG,CAAC,SAAiB;QACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;QACnE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,yCAAyC,SAAS,EAAE,CAAC,CAAC;QACxE,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,SAAiB;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED;;OAEG;IACH,sBAAsB;QACpB,kFAAkF;QAClF,OAAO,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IACtC,CAAC;CACF;AApCD,4CAoCC;AAED,4BAA4B;AAC5B,IAAI,sBAAsB,GAA4B,IAAI,CAAC;AAE3D;;GAEG;AACH,SAAgB,mBAAmB;IACjC,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC5B,sBAAsB,GAAG,IAAI,gBAAgB,EAAE,CAAC;QAChD,mCAAmC;QACnC,0BAA0B,EAAE,CAAC;IAC/B,CAAC;IACD,OAAO,sBAAsB,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,SAAS,0BAA0B;IACjC,IAAI,CAAC,sBAAsB;QAAE,OAAO;IAEpC,yCAAyC;IACzC,MAAM,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACjD,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEzC,sBAAsB,CAAC,QAAQ,CAAC,IAAI,eAAe,EAAE,CAAC,CAAC;IACvD,sBAAsB,CAAC,QAAQ,CAAC,IAAI,WAAW,EAAE,CAAC,CAAC;AACrD,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript type definitions for Dossier format
|
|
3
|
+
*/
|
|
4
|
+
export interface DossierFrontmatter {
|
|
5
|
+
version: string;
|
|
6
|
+
protocol_version: string;
|
|
7
|
+
created: string;
|
|
8
|
+
updated: string;
|
|
9
|
+
title: string;
|
|
10
|
+
objective: string;
|
|
11
|
+
status: 'draft' | 'stable' | 'deprecated';
|
|
12
|
+
risk_level: 'low' | 'medium' | 'high' | 'critical';
|
|
13
|
+
risk_factors: string[];
|
|
14
|
+
destructive_operations: string[];
|
|
15
|
+
requires_approval: boolean;
|
|
16
|
+
checksum?: {
|
|
17
|
+
algorithm: string;
|
|
18
|
+
hash: string;
|
|
19
|
+
calculated_at: string;
|
|
20
|
+
};
|
|
21
|
+
signature?: {
|
|
22
|
+
algorithm: string;
|
|
23
|
+
signature: string;
|
|
24
|
+
public_key: string;
|
|
25
|
+
key_id: string;
|
|
26
|
+
signed_by: string;
|
|
27
|
+
signed_at: string;
|
|
28
|
+
};
|
|
29
|
+
[key: string]: unknown;
|
|
30
|
+
}
|
|
31
|
+
export interface ParsedDossier {
|
|
32
|
+
frontmatter: DossierFrontmatter;
|
|
33
|
+
body: string;
|
|
34
|
+
raw: string;
|
|
35
|
+
}
|
|
36
|
+
export interface IntegrityResult {
|
|
37
|
+
status: 'valid' | 'invalid' | 'missing';
|
|
38
|
+
message: string;
|
|
39
|
+
expectedHash?: string;
|
|
40
|
+
actualHash?: string;
|
|
41
|
+
}
|
|
42
|
+
export interface AuthenticityResult {
|
|
43
|
+
status: 'verified' | 'signed_unknown' | 'unsigned' | 'invalid' | 'error';
|
|
44
|
+
message: string;
|
|
45
|
+
signer?: string;
|
|
46
|
+
keyId?: string;
|
|
47
|
+
publicKey?: string;
|
|
48
|
+
isTrusted: boolean;
|
|
49
|
+
trustedAs?: string;
|
|
50
|
+
}
|
|
51
|
+
export interface RiskAssessment {
|
|
52
|
+
riskLevel: 'low' | 'medium' | 'high' | 'critical' | 'unknown';
|
|
53
|
+
riskFactors: string[];
|
|
54
|
+
destructiveOperations: string[];
|
|
55
|
+
requiresApproval: boolean;
|
|
56
|
+
}
|
|
57
|
+
export interface VerificationResult {
|
|
58
|
+
dossierFile: string;
|
|
59
|
+
integrity: IntegrityResult;
|
|
60
|
+
authenticity: AuthenticityResult;
|
|
61
|
+
riskAssessment: RiskAssessment;
|
|
62
|
+
recommendation: 'ALLOW' | 'WARN' | 'BLOCK';
|
|
63
|
+
message: string;
|
|
64
|
+
errors: string[];
|
|
65
|
+
}
|
|
66
|
+
export interface TrustedKey {
|
|
67
|
+
publicKey: string;
|
|
68
|
+
keyId: string;
|
|
69
|
+
}
|
|
70
|
+
export interface DossierListItem {
|
|
71
|
+
name: string;
|
|
72
|
+
path: string;
|
|
73
|
+
version: string;
|
|
74
|
+
protocol: string;
|
|
75
|
+
status: string;
|
|
76
|
+
objective: string;
|
|
77
|
+
riskLevel: string;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,GAAG,QAAQ,GAAG,YAAY,CAAC;IAC1C,UAAU,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;IACnD,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,sBAAsB,EAAE,MAAM,EAAE,CAAC;IACjC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,EAAE;QACT,SAAS,EAAE,MAAM,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,SAAS,CAAC,EAAE;QACV,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,kBAAkB,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,UAAU,GAAG,gBAAgB,GAAG,UAAU,GAAG,SAAS,GAAG,OAAO,CAAC;IACzE,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;IAC9D,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,eAAe,CAAC;IAC3B,YAAY,EAAE,kBAAkB,CAAC;IACjC,cAAc,EAAE,cAAc,CAAC;IAC/B,cAAc,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB"}
|