@quantakrypto/core 0.4.4 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +76 -27
- package/dist/cbom-merge.d.ts.map +1 -1
- package/dist/cbom-merge.js +30 -8
- package/dist/cbom-merge.js.map +1 -1
- package/dist/cbom.d.ts +5 -0
- package/dist/cbom.d.ts.map +1 -1
- package/dist/cbom.js +132 -37
- package/dist/cbom.js.map +1 -1
- package/dist/comments.d.ts +2 -23
- package/dist/comments.d.ts.map +1 -1
- package/dist/comments.js +24 -5
- package/dist/comments.js.map +1 -1
- package/dist/crypto-agility.d.ts +158 -0
- package/dist/crypto-agility.d.ts.map +1 -0
- package/dist/crypto-agility.js +285 -0
- package/dist/crypto-agility.js.map +1 -0
- package/dist/dependencies.d.ts.map +1 -1
- package/dist/dependencies.js +180 -18
- package/dist/dependencies.js.map +1 -1
- package/dist/detect-utils.d.ts +55 -21
- package/dist/detect-utils.d.ts.map +1 -1
- package/dist/detect-utils.js +133 -7
- package/dist/detect-utils.js.map +1 -1
- package/dist/detectors/age.d.ts +16 -0
- package/dist/detectors/age.d.ts.map +1 -0
- package/dist/detectors/age.js +40 -0
- package/dist/detectors/age.js.map +1 -0
- package/dist/detectors/ansible.d.ts +13 -0
- package/dist/detectors/ansible.d.ts.map +1 -0
- package/dist/detectors/ansible.js +108 -0
- package/dist/detectors/ansible.js.map +1 -0
- package/dist/detectors/bicep.d.ts +20 -0
- package/dist/detectors/bicep.d.ts.map +1 -0
- package/dist/detectors/bicep.js +74 -0
- package/dist/detectors/bicep.js.map +1 -0
- package/dist/detectors/c.d.ts.map +1 -1
- package/dist/detectors/c.js +30 -3
- package/dist/detectors/c.js.map +1 -1
- package/dist/detectors/cicd.d.ts.map +1 -1
- package/dist/detectors/cicd.js +18 -5
- package/dist/detectors/cicd.js.map +1 -1
- package/dist/detectors/cloud-kms.d.ts +8 -5
- package/dist/detectors/cloud-kms.d.ts.map +1 -1
- package/dist/detectors/cloud-kms.js +62 -20
- package/dist/detectors/cloud-kms.js.map +1 -1
- package/dist/detectors/cloudformation.d.ts +8 -0
- package/dist/detectors/cloudformation.d.ts.map +1 -1
- package/dist/detectors/cloudformation.js +41 -10
- package/dist/detectors/cloudformation.js.map +1 -1
- package/dist/detectors/codesign.d.ts +50 -0
- package/dist/detectors/codesign.d.ts.map +1 -0
- package/dist/detectors/codesign.js +143 -0
- package/dist/detectors/codesign.js.map +1 -0
- package/dist/detectors/csharp.d.ts.map +1 -1
- package/dist/detectors/csharp.js +13 -3
- package/dist/detectors/csharp.js.map +1 -1
- package/dist/detectors/dart.d.ts +35 -0
- package/dist/detectors/dart.d.ts.map +1 -0
- package/dist/detectors/dart.js +177 -0
- package/dist/detectors/dart.js.map +1 -0
- package/dist/detectors/database.d.ts +5 -3
- package/dist/detectors/database.d.ts.map +1 -1
- package/dist/detectors/database.js +45 -8
- package/dist/detectors/database.js.map +1 -1
- package/dist/detectors/dkim.d.ts +54 -0
- package/dist/detectors/dkim.d.ts.map +1 -0
- package/dist/detectors/dkim.js +92 -0
- package/dist/detectors/dkim.js.map +1 -0
- package/dist/detectors/dnssec.d.ts.map +1 -1
- package/dist/detectors/dnssec.js +19 -10
- package/dist/detectors/dnssec.js.map +1 -1
- package/dist/detectors/elixir.d.ts.map +1 -1
- package/dist/detectors/elixir.js +34 -2
- package/dist/detectors/elixir.js.map +1 -1
- package/dist/detectors/java.d.ts.map +1 -1
- package/dist/detectors/java.js +33 -3
- package/dist/detectors/java.js.map +1 -1
- package/dist/detectors/jose.d.ts.map +1 -1
- package/dist/detectors/jose.js +13 -3
- package/dist/detectors/jose.js.map +1 -1
- package/dist/detectors/jwk.d.ts +7 -7
- package/dist/detectors/jwk.d.ts.map +1 -1
- package/dist/detectors/jwk.js +44 -8
- package/dist/detectors/jwk.js.map +1 -1
- package/dist/detectors/k8s.d.ts.map +1 -1
- package/dist/detectors/k8s.js +5 -2
- package/dist/detectors/k8s.js.map +1 -1
- package/dist/detectors/keystore.d.ts +19 -0
- package/dist/detectors/keystore.d.ts.map +1 -0
- package/dist/detectors/keystore.js +76 -0
- package/dist/detectors/keystore.js.map +1 -0
- package/dist/detectors/mesh.d.ts +7 -8
- package/dist/detectors/mesh.d.ts.map +1 -1
- package/dist/detectors/mesh.js +17 -35
- package/dist/detectors/mesh.js.map +1 -1
- package/dist/detectors/messaging.d.ts +2 -2
- package/dist/detectors/messaging.d.ts.map +1 -1
- package/dist/detectors/messaging.js +19 -12
- package/dist/detectors/messaging.js.map +1 -1
- package/dist/detectors/objc.d.ts +41 -0
- package/dist/detectors/objc.d.ts.map +1 -0
- package/dist/detectors/objc.js +146 -0
- package/dist/detectors/objc.js.map +1 -0
- package/dist/detectors/openpgp.d.ts +20 -0
- package/dist/detectors/openpgp.d.ts.map +1 -0
- package/dist/detectors/openpgp.js +151 -0
- package/dist/detectors/openpgp.js.map +1 -0
- package/dist/detectors/pem.d.ts.map +1 -1
- package/dist/detectors/pem.js +32 -0
- package/dist/detectors/pem.js.map +1 -1
- package/dist/detectors/php.d.ts +2 -1
- package/dist/detectors/php.d.ts.map +1 -1
- package/dist/detectors/php.js +7 -3
- package/dist/detectors/php.js.map +1 -1
- package/dist/detectors/pkcs11.d.ts +17 -0
- package/dist/detectors/pkcs11.d.ts.map +1 -0
- package/dist/detectors/pkcs11.js +87 -0
- package/dist/detectors/pkcs11.js.map +1 -0
- package/dist/detectors/proxy.d.ts +52 -0
- package/dist/detectors/proxy.d.ts.map +1 -0
- package/dist/detectors/proxy.js +157 -0
- package/dist/detectors/proxy.js.map +1 -0
- package/dist/detectors/pulumi.d.ts +19 -0
- package/dist/detectors/pulumi.d.ts.map +1 -0
- package/dist/detectors/pulumi.js +80 -0
- package/dist/detectors/pulumi.js.map +1 -0
- package/dist/detectors/rust.d.ts.map +1 -1
- package/dist/detectors/rust.js +5 -0
- package/dist/detectors/rust.js.map +1 -1
- package/dist/detectors/secrets.d.ts +4 -1
- package/dist/detectors/secrets.d.ts.map +1 -1
- package/dist/detectors/secrets.js +5 -21
- package/dist/detectors/secrets.js.map +1 -1
- package/dist/detectors/solidity.d.ts +50 -0
- package/dist/detectors/solidity.d.ts.map +1 -0
- package/dist/detectors/solidity.js +108 -0
- package/dist/detectors/solidity.js.map +1 -0
- package/dist/detectors/source.d.ts.map +1 -1
- package/dist/detectors/source.js +105 -6
- package/dist/detectors/source.js.map +1 -1
- package/dist/detectors/spire.d.ts +49 -0
- package/dist/detectors/spire.d.ts.map +1 -0
- package/dist/detectors/spire.js +77 -0
- package/dist/detectors/spire.js.map +1 -0
- package/dist/detectors/ssh-ca.d.ts +72 -0
- package/dist/detectors/ssh-ca.d.ts.map +1 -0
- package/dist/detectors/ssh-ca.js +119 -0
- package/dist/detectors/ssh-ca.js.map +1 -0
- package/dist/detectors/supply-chain.d.ts +17 -0
- package/dist/detectors/supply-chain.d.ts.map +1 -0
- package/dist/detectors/supply-chain.js +89 -0
- package/dist/detectors/supply-chain.js.map +1 -0
- package/dist/detectors/swift.d.ts +22 -0
- package/dist/detectors/swift.d.ts.map +1 -0
- package/dist/detectors/swift.js +120 -0
- package/dist/detectors/swift.js.map +1 -0
- package/dist/detectors/terraform.d.ts.map +1 -1
- package/dist/detectors/terraform.js +35 -8
- package/dist/detectors/terraform.js.map +1 -1
- package/dist/detectors/vault.d.ts +15 -0
- package/dist/detectors/vault.d.ts.map +1 -0
- package/dist/detectors/vault.js +97 -0
- package/dist/detectors/vault.js.map +1 -0
- package/dist/detectors/vpn.d.ts +8 -8
- package/dist/detectors/vpn.d.ts.map +1 -1
- package/dist/detectors/vpn.js +12 -38
- package/dist/detectors/vpn.js.map +1 -1
- package/dist/detectors/weak-hash.d.ts +71 -0
- package/dist/detectors/weak-hash.d.ts.map +1 -0
- package/dist/detectors/weak-hash.js +116 -0
- package/dist/detectors/weak-hash.js.map +1 -0
- package/dist/detectors/webauthn.d.ts +61 -0
- package/dist/detectors/webauthn.d.ts.map +1 -0
- package/dist/detectors/webauthn.js +109 -0
- package/dist/detectors/webauthn.js.map +1 -0
- package/dist/detectors/xmldsig.d.ts +23 -0
- package/dist/detectors/xmldsig.d.ts.map +1 -0
- package/dist/detectors/xmldsig.js +84 -0
- package/dist/detectors/xmldsig.js.map +1 -0
- package/dist/evidence.d.ts +74 -4
- package/dist/evidence.d.ts.map +1 -1
- package/dist/evidence.js +71 -0
- package/dist/evidence.js.map +1 -1
- package/dist/hndl.d.ts +241 -0
- package/dist/hndl.d.ts.map +1 -0
- package/dist/hndl.js +752 -0
- package/dist/hndl.js.map +1 -0
- package/dist/index.d.ts +18 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -11
- package/dist/index.js.map +1 -1
- package/dist/inventory.d.ts +0 -2
- package/dist/inventory.d.ts.map +1 -1
- package/dist/inventory.js +15 -6
- package/dist/inventory.js.map +1 -1
- package/dist/parallel.d.ts.map +1 -1
- package/dist/parallel.js +22 -23
- package/dist/parallel.js.map +1 -1
- package/dist/registry.d.ts +9 -4
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +51 -4
- package/dist/registry.js.map +1 -1
- package/dist/remediate-pipeline.d.ts +0 -3
- package/dist/remediate-pipeline.d.ts.map +1 -1
- package/dist/remediate-pipeline.js +1 -1
- package/dist/remediate-pipeline.js.map +1 -1
- package/dist/remediation.d.ts +10 -0
- package/dist/remediation.d.ts.map +1 -1
- package/dist/remediation.js +32 -0
- package/dist/remediation.js.map +1 -1
- package/dist/report.d.ts +17 -0
- package/dist/report.d.ts.map +1 -1
- package/dist/report.js +106 -20
- package/dist/report.js.map +1 -1
- package/dist/scan-worker.js +5 -3
- package/dist/scan-worker.js.map +1 -1
- package/dist/scan.d.ts.map +1 -1
- package/dist/scan.js +35 -6
- package/dist/scan.js.map +1 -1
- package/dist/standards-profiles.d.ts +58 -0
- package/dist/standards-profiles.d.ts.map +1 -0
- package/dist/standards-profiles.js +100 -0
- package/dist/standards-profiles.js.map +1 -0
- package/dist/types.d.ts +7 -6
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/dist/vex.d.ts +39 -0
- package/dist/vex.d.ts.map +1 -0
- package/dist/vex.js +87 -0
- package/dist/vex.js.map +1 -0
- package/dist/walk.d.ts +39 -4
- package/dist/walk.d.ts.map +1 -1
- package/dist/walk.js +62 -10
- package/dist/walk.js.map +1 -1
- package/package.json +1 -1
- package/src/cbom-merge.ts +38 -8
- package/src/cbom.ts +153 -39
- package/src/comments.ts +25 -6
- package/src/crypto-agility.ts +407 -0
- package/src/dependencies.ts +182 -16
- package/src/detect-utils.ts +133 -11
- package/src/detectors/age.ts +60 -0
- package/src/detectors/ansible.ts +140 -0
- package/src/detectors/bicep.ts +107 -0
- package/src/detectors/c.ts +31 -3
- package/src/detectors/cicd.ts +18 -5
- package/src/detectors/cloud-kms.ts +79 -25
- package/src/detectors/cloudformation.ts +45 -10
- package/src/detectors/codesign.ts +214 -0
- package/src/detectors/csharp.ts +13 -3
- package/src/detectors/dart.ts +237 -0
- package/src/detectors/database.ts +64 -11
- package/src/detectors/dkim.ts +172 -0
- package/src/detectors/dnssec.ts +19 -10
- package/src/detectors/elixir.ts +33 -2
- package/src/detectors/java.ts +37 -3
- package/src/detectors/jose.ts +19 -3
- package/src/detectors/jwk.ts +59 -17
- package/src/detectors/k8s.ts +5 -2
- package/src/detectors/keystore.ts +109 -0
- package/src/detectors/mesh.ts +21 -45
- package/src/detectors/messaging.ts +22 -14
- package/src/detectors/objc.ts +209 -0
- package/src/detectors/openpgp.ts +194 -0
- package/src/detectors/pem.ts +30 -0
- package/src/detectors/php.ts +9 -4
- package/src/detectors/pkcs11.ts +113 -0
- package/src/detectors/proxy.ts +236 -0
- package/src/detectors/pulumi.ts +106 -0
- package/src/detectors/rust.ts +5 -0
- package/src/detectors/secrets.ts +15 -26
- package/src/detectors/solidity.ts +176 -0
- package/src/detectors/source.ts +110 -5
- package/src/detectors/spire.ts +143 -0
- package/src/detectors/ssh-ca.ts +215 -0
- package/src/detectors/supply-chain.ts +117 -0
- package/src/detectors/swift.ts +149 -0
- package/src/detectors/terraform.ts +42 -8
- package/src/detectors/vault.ts +120 -0
- package/src/detectors/vpn.ts +20 -48
- package/src/detectors/weak-hash.ts +217 -0
- package/src/detectors/webauthn.ts +205 -0
- package/src/detectors/xmldsig.ts +115 -0
- package/src/evidence.ts +127 -4
- package/src/hndl.ts +1012 -0
- package/src/index.ts +93 -13
- package/src/inventory.ts +15 -7
- package/src/parallel.ts +21 -20
- package/src/registry.ts +51 -4
- package/src/remediate-pipeline.ts +1 -1
- package/src/remediation.ts +39 -0
- package/src/report.ts +120 -20
- package/src/scan-worker.ts +5 -3
- package/src/scan.ts +41 -6
- package/src/standards-profiles.ts +136 -0
- package/src/types.ts +18 -5
- package/src/version.ts +1 -1
- package/src/vex.ts +122 -0
- package/src/walk.ts +80 -12
package/dist/hndl.d.ts
ADDED
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
import type { Confidence, Finding, Severity } from "./types.js";
|
|
2
|
+
/** Version of the exposure model. Bump on any weight / formula change. */
|
|
3
|
+
export declare const HNDL_MODEL_VERSION: "1";
|
|
4
|
+
/** Canonical `hndl.yml` file name discovered at a scan root. */
|
|
5
|
+
export declare const HNDL_FILENAME = "hndl.yml";
|
|
6
|
+
/** Data sensitivity classes, least → most sensitive. Vocabulary aligned with the
|
|
7
|
+
* readiness DPE (data-protection) practice. */
|
|
8
|
+
export type DataClassification = "public" | "internal" | "confidential" | "regulated";
|
|
9
|
+
/**
|
|
10
|
+
* Logical scope a finding belongs to, used for optional scope-bound assets. The
|
|
11
|
+
* two detector scopes ("source" / "config") plus "dependency" (manifest
|
|
12
|
+
* findings, which are not produced by a Detector).
|
|
13
|
+
*/
|
|
14
|
+
export type HndlScope = "source" | "config" | "dependency";
|
|
15
|
+
/** Crypto-vulnerability weight (V) contributed by a finding's severity. */
|
|
16
|
+
export declare const SEVERITY_VULNERABILITY: Record<Severity, number>;
|
|
17
|
+
/** Crypto-vulnerability weight (V) scaled by detector confidence. */
|
|
18
|
+
export declare const CONFIDENCE_WEIGHT: Record<Confidence, number>;
|
|
19
|
+
/** Data-sensitivity weight (S) per classification. */
|
|
20
|
+
export declare const CLASSIFICATION_SENSITIVITY: Record<DataClassification, number>;
|
|
21
|
+
/**
|
|
22
|
+
* Discount applied to V when a finding is NOT harvest-now-decrypt-later exposed
|
|
23
|
+
* (e.g. a pure signature). A forged signature is a future-integrity problem, not
|
|
24
|
+
* a retroactive-confidentiality one, so it barely moves the HNDL needle.
|
|
25
|
+
*/
|
|
26
|
+
export declare const NON_HNDL_DISCOUNT = 0.15;
|
|
27
|
+
/**
|
|
28
|
+
* Default years until a cryptographically-relevant quantum computer is assumed
|
|
29
|
+
* to exist (Z in Mosca's inequality). 15 years is a defensible mid-point of the
|
|
30
|
+
* commonly-cited Mosca / NIST window; override per-org in `hndl.yml`.
|
|
31
|
+
*/
|
|
32
|
+
export declare const DEFAULT_QUANTUM_THREAT_YEARS = 15;
|
|
33
|
+
/**
|
|
34
|
+
* Default years to complete the org's PQC migration (Y in Mosca's inequality).
|
|
35
|
+
* Override per-org in `hndl.yml`.
|
|
36
|
+
*/
|
|
37
|
+
export declare const DEFAULT_MIGRATION_HORIZON_YEARS = 5;
|
|
38
|
+
/** Classification assumed for findings that bind to no declared asset. */
|
|
39
|
+
export declare const DEFAULT_UNBOUND_CLASSIFICATION: DataClassification;
|
|
40
|
+
/** A single declared data asset from `hndl.yml`. */
|
|
41
|
+
export interface HndlDataAsset {
|
|
42
|
+
/** Stable id (referenced by finding exposures + the website's `data_asset.key`). */
|
|
43
|
+
key: string;
|
|
44
|
+
/** Human name. */
|
|
45
|
+
name: string;
|
|
46
|
+
classification: DataClassification;
|
|
47
|
+
/** How long the data is retained, in years. */
|
|
48
|
+
retentionYears: number;
|
|
49
|
+
/** How long the data must remain confidential once captured, in years. */
|
|
50
|
+
secrecyLifetimeYears: number;
|
|
51
|
+
/** Path globs (POSIX, relative to scan root) whose findings bind to this asset. */
|
|
52
|
+
paths: string[];
|
|
53
|
+
/** Optional detector-scope filter: only findings of these scopes bind here. */
|
|
54
|
+
scopes?: HndlScope[];
|
|
55
|
+
}
|
|
56
|
+
/** The Mosca horizons that gate the exposure model. */
|
|
57
|
+
export interface HndlHorizon {
|
|
58
|
+
/** Z: years until a cryptographically-relevant quantum computer is assumed. */
|
|
59
|
+
quantumThreatYears: number;
|
|
60
|
+
/** Y: years to complete the org's PQC migration. */
|
|
61
|
+
migrationHorizonYears: number;
|
|
62
|
+
}
|
|
63
|
+
/** Defaults applied to findings that bind to no declared asset. */
|
|
64
|
+
export interface HndlDefaults {
|
|
65
|
+
classification: DataClassification;
|
|
66
|
+
}
|
|
67
|
+
/** A fully-parsed, validated `hndl.yml`. */
|
|
68
|
+
export interface HndlMap {
|
|
69
|
+
version: number;
|
|
70
|
+
horizon: HndlHorizon;
|
|
71
|
+
defaults: HndlDefaults;
|
|
72
|
+
assets: HndlDataAsset[];
|
|
73
|
+
}
|
|
74
|
+
/** Thrown when `hndl.yml` is malformed (structure or a bad known value). */
|
|
75
|
+
export declare class HndlError extends Error {
|
|
76
|
+
readonly name = "HndlError";
|
|
77
|
+
/** The `hndl.yml` path the error relates to, when known. */
|
|
78
|
+
readonly path: string | undefined;
|
|
79
|
+
constructor(message: string, hndlPath?: string);
|
|
80
|
+
}
|
|
81
|
+
/** Full, auditable breakdown of one finding's exposure score. */
|
|
82
|
+
export interface ExposureRationale {
|
|
83
|
+
/** V - crypto-vulnerability factor (0..1). */
|
|
84
|
+
vulnerability: number;
|
|
85
|
+
/** S - data-sensitivity factor (0..1). */
|
|
86
|
+
sensitivity: number;
|
|
87
|
+
/** M - Mosca factor (0..1): fraction of the protection horizon past the threat. */
|
|
88
|
+
mosca: number;
|
|
89
|
+
classification: DataClassification;
|
|
90
|
+
retentionYears: number;
|
|
91
|
+
secrecyLifetimeYears: number;
|
|
92
|
+
/** X = max(retention, secrecy lifetime): the data's protection requirement. */
|
|
93
|
+
secrecyHorizonYears: number;
|
|
94
|
+
/** Z - quantum-threat horizon (years). */
|
|
95
|
+
quantumThreatYears: number;
|
|
96
|
+
/** Y - migration horizon (years). */
|
|
97
|
+
migrationHorizonYears: number;
|
|
98
|
+
/** (X + Y) - Z; positive means Mosca's inequality is breached. */
|
|
99
|
+
moscaMarginYears: number;
|
|
100
|
+
/** True when (X + Y) > Z (data captured today is exposed while still secret). */
|
|
101
|
+
moscaBreach: boolean;
|
|
102
|
+
/** Whether the finding is HNDL-exposed (drives {@link NON_HNDL_DISCOUNT}). */
|
|
103
|
+
hndl: boolean;
|
|
104
|
+
severity: Severity;
|
|
105
|
+
confidence: Confidence;
|
|
106
|
+
scope: HndlScope;
|
|
107
|
+
/** True when the finding matched a declared asset (false = defaults applied). */
|
|
108
|
+
bound: boolean;
|
|
109
|
+
}
|
|
110
|
+
/** A finding's computed exposure, keyed by fingerprint for website ingest. */
|
|
111
|
+
export interface FindingExposure {
|
|
112
|
+
/** Finding identity: `finding.fingerprint` when present, else the canonical
|
|
113
|
+
* `fingerprintFinding()` hash. This is the join key the website stores. */
|
|
114
|
+
fingerprint: string;
|
|
115
|
+
ruleId: string;
|
|
116
|
+
file: string;
|
|
117
|
+
/** The bound data asset's stable key, or null when unbound. */
|
|
118
|
+
dataAsset: string | null;
|
|
119
|
+
/** 0..100 exposure score. */
|
|
120
|
+
exposureScore: number;
|
|
121
|
+
rationale: ExposureRationale;
|
|
122
|
+
}
|
|
123
|
+
/** Per-asset rollup for the repo summary. */
|
|
124
|
+
export interface AssetExposure {
|
|
125
|
+
key: string;
|
|
126
|
+
name: string;
|
|
127
|
+
classification: DataClassification;
|
|
128
|
+
retentionYears: number;
|
|
129
|
+
secrecyLifetimeYears: number;
|
|
130
|
+
/** Number of findings bound to this asset. */
|
|
131
|
+
findings: number;
|
|
132
|
+
/** Highest exposure among this asset's findings. */
|
|
133
|
+
maxExposure: number;
|
|
134
|
+
/** True when the data's secrecy horizon outlives the quantum threat (X > Z). */
|
|
135
|
+
outlivesThreat: boolean;
|
|
136
|
+
}
|
|
137
|
+
/** Repo-level HNDL summary. */
|
|
138
|
+
export interface HndlSummary {
|
|
139
|
+
findingsScored: number;
|
|
140
|
+
assetsDeclared: number;
|
|
141
|
+
/** Declared assets that bound at least one finding. */
|
|
142
|
+
assetsWithFindings: number;
|
|
143
|
+
/** Declared assets whose secrecy horizon outlives the quantum threat (X > Z). */
|
|
144
|
+
assetsOutlivingHorizon: number;
|
|
145
|
+
/** Findings whose Mosca inequality is breached ((X + Y) > Z). */
|
|
146
|
+
moscaBreaches: number;
|
|
147
|
+
maxExposure: number;
|
|
148
|
+
/** Rounded mean exposure across scored findings. */
|
|
149
|
+
meanExposure: number;
|
|
150
|
+
/** The worst findings, most-exposed first (capped). */
|
|
151
|
+
topExposures: FindingExposure[];
|
|
152
|
+
}
|
|
153
|
+
/** The complete HNDL analysis of a scan. */
|
|
154
|
+
export interface HndlReport {
|
|
155
|
+
modelVersion: string;
|
|
156
|
+
horizon: HndlHorizon;
|
|
157
|
+
/** Per-finding exposures, in input order. */
|
|
158
|
+
exposures: FindingExposure[];
|
|
159
|
+
/** Fingerprint → exposure, for reporters to annotate each finding. */
|
|
160
|
+
byFingerprint: Map<string, FindingExposure>;
|
|
161
|
+
/** Per-asset rollups. */
|
|
162
|
+
assets: AssetExposure[];
|
|
163
|
+
summary: HndlSummary;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Identity key for a finding's exposure. Prefers a `finding.fingerprint` field
|
|
167
|
+
* when a build supplies one (another workstream is adding it to core's Finding
|
|
168
|
+
* type + reporters); falls back to the canonical `fingerprintFinding()` hash
|
|
169
|
+
* (`sha256(ruleId|file|normalizedSnippet)`) otherwise. INTEGRATION POINT: once
|
|
170
|
+
* `Finding.fingerprint` lands, this transparently switches to it - no caller
|
|
171
|
+
* change needed.
|
|
172
|
+
*/
|
|
173
|
+
export declare function findingFingerprint(f: Finding): string;
|
|
174
|
+
/**
|
|
175
|
+
* The scope a finding belongs to. Dependency findings (from the manifest
|
|
176
|
+
* scanner, category "dependency") are "dependency"; everything else is looked up
|
|
177
|
+
* by ruleId in the detector registry, defaulting to "source".
|
|
178
|
+
*/
|
|
179
|
+
export declare function findingScope(f: Finding): HndlScope;
|
|
180
|
+
/**
|
|
181
|
+
* Match a POSIX path against a glob supporting `**` (any path segments incl.
|
|
182
|
+
* `/`), `*` (any run of non-`/` chars), and `?` (a single non-`/` char). A
|
|
183
|
+
* trailing `/**` also matches the directory itself. Everything else is literal.
|
|
184
|
+
*/
|
|
185
|
+
export declare function globMatch(glob: string, filePath: string): boolean;
|
|
186
|
+
/** V - crypto-vulnerability factor for a finding (0..1). */
|
|
187
|
+
export declare function vulnerabilityFactor(f: Finding): number;
|
|
188
|
+
/**
|
|
189
|
+
* M - the Mosca factor (0..1). `X` is the data's protection horizon
|
|
190
|
+
* (max of retention + secrecy lifetime), `Y` the migration horizon, `Z` the
|
|
191
|
+
* quantum-threat horizon. M is the fraction of `X + Y` that falls after `Z`:
|
|
192
|
+
* 0 when the threat is beyond the whole horizon, 1 when the threat is already
|
|
193
|
+
* here. Mosca's inequality (X + Y > Z) is exactly `M > 0`.
|
|
194
|
+
*/
|
|
195
|
+
export declare function moscaFactor(secrecyHorizonYears: number, horizon: HndlHorizon): number;
|
|
196
|
+
/**
|
|
197
|
+
* Compute HNDL exposure for a set of findings against a declared data map.
|
|
198
|
+
*
|
|
199
|
+
* A finding binds to every declared asset whose path glob (and optional scope
|
|
200
|
+
* filter) matches its file; when several match, the WORST-CASE (highest)
|
|
201
|
+
* exposure is chosen and its asset recorded, since risk ranking should not be
|
|
202
|
+
* diluted by an incidental low-sensitivity overlap. A finding that binds to no
|
|
203
|
+
* asset is still scored, using the map's `defaults.classification` and the
|
|
204
|
+
* global horizons, and flagged `bound: false` so it is visibly a fallback. Its
|
|
205
|
+
* secrecy lifetime is assumed to be the quantum-threat horizon Z (the
|
|
206
|
+
* minimum-concern horizon; see {@link scoreFinding} call below and docs/HNDL.md
|
|
207
|
+
* §4), so the fallback classification produces a real, rankable exposure rather
|
|
208
|
+
* than a dead 0.
|
|
209
|
+
*
|
|
210
|
+
* Purely additive: it never mutates findings and never affects a scan's exit
|
|
211
|
+
* code.
|
|
212
|
+
*/
|
|
213
|
+
export declare function computeHndl(findings: readonly Finding[], map: HndlMap): HndlReport;
|
|
214
|
+
/**
|
|
215
|
+
* Validate a parsed `hndl.yml` object into a typed {@link HndlMap}. Applies
|
|
216
|
+
* defaults for `version`, `horizon`, and `defaults`; requires each asset to have
|
|
217
|
+
* a unique `key`, a `name`, a valid `classification`, non-negative retention +
|
|
218
|
+
* secrecy lifetime, and at least one path glob.
|
|
219
|
+
*/
|
|
220
|
+
export declare function parseHndlMap(text: string, file?: string): HndlMap;
|
|
221
|
+
/**
|
|
222
|
+
* Load and validate the `hndl.yml` for a scan. By default reads
|
|
223
|
+
* `<root>/hndl.yml`; pass an explicit `*.yml` path to read a named file. A
|
|
224
|
+
* missing file is always an error here (the caller opted into `--hndl`).
|
|
225
|
+
*
|
|
226
|
+
* @throws {HndlError} On a missing file, unreadable file, or malformed content.
|
|
227
|
+
*/
|
|
228
|
+
export declare function loadHndlMap(root: string): Promise<{
|
|
229
|
+
map: HndlMap;
|
|
230
|
+
path: string;
|
|
231
|
+
}>;
|
|
232
|
+
/**
|
|
233
|
+
* Scaffold an `hndl.yml` document seeded from a scan's findings. Config-scope,
|
|
234
|
+
* HNDL-exposed findings are the crypto-to-data join points (KMS, secrets-at-rest,
|
|
235
|
+
* database TDE, brokers, JOSE/JWE), so each directory that contains one becomes a
|
|
236
|
+
* proposed asset stub the user fills in. The returned string is valid `hndl.yml`
|
|
237
|
+
* (it round-trips through {@link parseHndlMap}); the classification / retention /
|
|
238
|
+
* secrecy values are conservative placeholders the user is expected to correct.
|
|
239
|
+
*/
|
|
240
|
+
export declare function scaffoldHndlYaml(findings: readonly Finding[]): string;
|
|
241
|
+
//# sourceMappingURL=hndl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hndl.d.ts","sourceRoot":"","sources":["../src/hndl.ts"],"names":[],"mappings":"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"}
|