vaspera 2.5.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/CHANGELOG.md +184 -0
- package/LICENSE +21 -0
- package/README.md +809 -0
- package/dist/__tests__/integration/certification-flow.test.d.ts +5 -0
- package/dist/__tests__/integration/certification-flow.test.d.ts.map +1 -0
- package/dist/__tests__/integration/certification-flow.test.js +245 -0
- package/dist/__tests__/integration/certification-flow.test.js.map +1 -0
- package/dist/__tests__/integration/commands.test.d.ts +5 -0
- package/dist/__tests__/integration/commands.test.d.ts.map +1 -0
- package/dist/__tests__/integration/commands.test.js +93 -0
- package/dist/__tests__/integration/commands.test.js.map +1 -0
- package/dist/action/diff-mode.d.ts +34 -0
- package/dist/action/diff-mode.d.ts.map +1 -0
- package/dist/action/diff-mode.js +201 -0
- package/dist/action/diff-mode.js.map +1 -0
- package/dist/action/diff-mode.test.d.ts +5 -0
- package/dist/action/diff-mode.test.d.ts.map +1 -0
- package/dist/action/diff-mode.test.js +162 -0
- package/dist/action/diff-mode.test.js.map +1 -0
- package/dist/action/index.d.ts +10 -0
- package/dist/action/index.d.ts.map +1 -0
- package/dist/action/index.js +231 -0
- package/dist/action/index.js.map +1 -0
- package/dist/action/pr-comment.d.ts +30 -0
- package/dist/action/pr-comment.d.ts.map +1 -0
- package/dist/action/pr-comment.js +301 -0
- package/dist/action/pr-comment.js.map +1 -0
- package/dist/action/pr-comment.test.d.ts +5 -0
- package/dist/action/pr-comment.test.d.ts.map +1 -0
- package/dist/action/pr-comment.test.js +189 -0
- package/dist/action/pr-comment.test.js.map +1 -0
- package/dist/action/sarif-upload.d.ts +104 -0
- package/dist/action/sarif-upload.d.ts.map +1 -0
- package/dist/action/sarif-upload.js +188 -0
- package/dist/action/sarif-upload.js.map +1 -0
- package/dist/action/sarif-upload.test.d.ts +5 -0
- package/dist/action/sarif-upload.test.d.ts.map +1 -0
- package/dist/action/sarif-upload.test.js +206 -0
- package/dist/action/sarif-upload.test.js.map +1 -0
- package/dist/action/types.d.ts +104 -0
- package/dist/action/types.d.ts.map +1 -0
- package/dist/action/types.js +33 -0
- package/dist/action/types.js.map +1 -0
- package/dist/action/types.test.d.ts +5 -0
- package/dist/action/types.test.d.ts.map +1 -0
- package/dist/action/types.test.js +79 -0
- package/dist/action/types.test.js.map +1 -0
- package/dist/agents/agent-integrity.d.ts +111 -0
- package/dist/agents/agent-integrity.d.ts.map +1 -0
- package/dist/agents/agent-integrity.js +308 -0
- package/dist/agents/agent-integrity.js.map +1 -0
- package/dist/agents/agent-privacy.d.ts +68 -0
- package/dist/agents/agent-privacy.d.ts.map +1 -0
- package/dist/agents/agent-privacy.js +345 -0
- package/dist/agents/agent-privacy.js.map +1 -0
- package/dist/agents/exploit-chain.d.ts +64 -0
- package/dist/agents/exploit-chain.d.ts.map +1 -0
- package/dist/agents/exploit-chain.js +477 -0
- package/dist/agents/exploit-chain.js.map +1 -0
- package/dist/agents/exploit-chain.test.d.ts +5 -0
- package/dist/agents/exploit-chain.test.d.ts.map +1 -0
- package/dist/agents/exploit-chain.test.js +455 -0
- package/dist/agents/exploit-chain.test.js.map +1 -0
- package/dist/agents/index.d.ts +14 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +19 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/logic-flaw-detector.d.ts +55 -0
- package/dist/agents/logic-flaw-detector.d.ts.map +1 -0
- package/dist/agents/logic-flaw-detector.js +454 -0
- package/dist/agents/logic-flaw-detector.js.map +1 -0
- package/dist/agents/zero-day-hunter.d.ts +69 -0
- package/dist/agents/zero-day-hunter.d.ts.map +1 -0
- package/dist/agents/zero-day-hunter.js +591 -0
- package/dist/agents/zero-day-hunter.js.map +1 -0
- package/dist/certification/artifacts.d.ts +21 -0
- package/dist/certification/artifacts.d.ts.map +1 -0
- package/dist/certification/artifacts.js +275 -0
- package/dist/certification/artifacts.js.map +1 -0
- package/dist/certification/autofix.d.ts +122 -0
- package/dist/certification/autofix.d.ts.map +1 -0
- package/dist/certification/autofix.js +476 -0
- package/dist/certification/autofix.js.map +1 -0
- package/dist/certification/badge.d.ts +56 -0
- package/dist/certification/badge.d.ts.map +1 -0
- package/dist/certification/badge.js +155 -0
- package/dist/certification/badge.js.map +1 -0
- package/dist/certification/cache.d.ts +121 -0
- package/dist/certification/cache.d.ts.map +1 -0
- package/dist/certification/cache.js +275 -0
- package/dist/certification/cache.js.map +1 -0
- package/dist/certification/cache.test.d.ts +5 -0
- package/dist/certification/cache.test.d.ts.map +1 -0
- package/dist/certification/cache.test.js +270 -0
- package/dist/certification/cache.test.js.map +1 -0
- package/dist/certification/consensus.d.ts +105 -0
- package/dist/certification/consensus.d.ts.map +1 -0
- package/dist/certification/consensus.js +353 -0
- package/dist/certification/consensus.js.map +1 -0
- package/dist/certification/consensus.test.d.ts +5 -0
- package/dist/certification/consensus.test.d.ts.map +1 -0
- package/dist/certification/consensus.test.js +342 -0
- package/dist/certification/consensus.test.js.map +1 -0
- package/dist/certification/index.d.ts +14 -0
- package/dist/certification/index.d.ts.map +1 -0
- package/dist/certification/index.js +14 -0
- package/dist/certification/index.js.map +1 -0
- package/dist/certification/rules.d.ts +89 -0
- package/dist/certification/rules.d.ts.map +1 -0
- package/dist/certification/rules.js +317 -0
- package/dist/certification/rules.js.map +1 -0
- package/dist/certification/sarif.d.ts +107 -0
- package/dist/certification/sarif.d.ts.map +1 -0
- package/dist/certification/sarif.js +191 -0
- package/dist/certification/sarif.js.map +1 -0
- package/dist/certification/store.d.ts +255 -0
- package/dist/certification/store.d.ts.map +1 -0
- package/dist/certification/store.js +835 -0
- package/dist/certification/store.js.map +1 -0
- package/dist/certification/store.test.d.ts +5 -0
- package/dist/certification/store.test.d.ts.map +1 -0
- package/dist/certification/store.test.js +468 -0
- package/dist/certification/store.test.js.map +1 -0
- package/dist/certification/summary.d.ts +72 -0
- package/dist/certification/summary.d.ts.map +1 -0
- package/dist/certification/summary.js +296 -0
- package/dist/certification/summary.js.map +1 -0
- package/dist/certification/types.d.ts +138 -0
- package/dist/certification/types.d.ts.map +1 -0
- package/dist/certification/types.js +34 -0
- package/dist/certification/types.js.map +1 -0
- package/dist/commands/audits/api-check.d.ts +3 -0
- package/dist/commands/audits/api-check.d.ts.map +1 -0
- package/dist/commands/audits/api-check.js +71 -0
- package/dist/commands/audits/api-check.js.map +1 -0
- package/dist/commands/audits/deadcode.d.ts +3 -0
- package/dist/commands/audits/deadcode.d.ts.map +1 -0
- package/dist/commands/audits/deadcode.js +63 -0
- package/dist/commands/audits/deadcode.js.map +1 -0
- package/dist/commands/audits/deps.d.ts +3 -0
- package/dist/commands/audits/deps.d.ts.map +1 -0
- package/dist/commands/audits/deps.js +56 -0
- package/dist/commands/audits/deps.js.map +1 -0
- package/dist/commands/audits/errors.d.ts +3 -0
- package/dist/commands/audits/errors.d.ts.map +1 -0
- package/dist/commands/audits/errors.js +65 -0
- package/dist/commands/audits/errors.js.map +1 -0
- package/dist/commands/audits/index.d.ts +3 -0
- package/dist/commands/audits/index.d.ts.map +1 -0
- package/dist/commands/audits/index.js +15 -0
- package/dist/commands/audits/index.js.map +1 -0
- package/dist/commands/audits/perf.d.ts +3 -0
- package/dist/commands/audits/perf.d.ts.map +1 -0
- package/dist/commands/audits/perf.js +85 -0
- package/dist/commands/audits/perf.js.map +1 -0
- package/dist/commands/audits/secrets.d.ts +3 -0
- package/dist/commands/audits/secrets.d.ts.map +1 -0
- package/dist/commands/audits/secrets.js +71 -0
- package/dist/commands/audits/secrets.js.map +1 -0
- package/dist/commands/certification/certify.d.ts +3 -0
- package/dist/commands/certification/certify.d.ts.map +1 -0
- package/dist/commands/certification/certify.js +108 -0
- package/dist/commands/certification/certify.js.map +1 -0
- package/dist/commands/certification/index.d.ts +3 -0
- package/dist/commands/certification/index.d.ts.map +1 -0
- package/dist/commands/certification/index.js +17 -0
- package/dist/commands/certification/index.js.map +1 -0
- package/dist/commands/certification/performance.d.ts +3 -0
- package/dist/commands/certification/performance.d.ts.map +1 -0
- package/dist/commands/certification/performance.js +89 -0
- package/dist/commands/certification/performance.js.map +1 -0
- package/dist/commands/certification/quality.d.ts +3 -0
- package/dist/commands/certification/quality.d.ts.map +1 -0
- package/dist/commands/certification/quality.js +92 -0
- package/dist/commands/certification/quality.js.map +1 -0
- package/dist/commands/certification/redteam.d.ts +3 -0
- package/dist/commands/certification/redteam.d.ts.map +1 -0
- package/dist/commands/certification/redteam.js +114 -0
- package/dist/commands/certification/redteam.js.map +1 -0
- package/dist/commands/certification/reliability.d.ts +3 -0
- package/dist/commands/certification/reliability.d.ts.map +1 -0
- package/dist/commands/certification/reliability.js +93 -0
- package/dist/commands/certification/reliability.js.map +1 -0
- package/dist/commands/certification/security.d.ts +3 -0
- package/dist/commands/certification/security.d.ts.map +1 -0
- package/dist/commands/certification/security.js +90 -0
- package/dist/commands/certification/security.js.map +1 -0
- package/dist/commands/certification/typesafety.d.ts +3 -0
- package/dist/commands/certification/typesafety.d.ts.map +1 -0
- package/dist/commands/certification/typesafety.js +87 -0
- package/dist/commands/certification/typesafety.js.map +1 -0
- package/dist/commands/core/add-tests.d.ts +3 -0
- package/dist/commands/core/add-tests.d.ts.map +1 -0
- package/dist/commands/core/add-tests.js +29 -0
- package/dist/commands/core/add-tests.js.map +1 -0
- package/dist/commands/core/audit.d.ts +3 -0
- package/dist/commands/core/audit.d.ts.map +1 -0
- package/dist/commands/core/audit.js +64 -0
- package/dist/commands/core/audit.js.map +1 -0
- package/dist/commands/core/fix-critical.d.ts +3 -0
- package/dist/commands/core/fix-critical.d.ts.map +1 -0
- package/dist/commands/core/fix-critical.js +22 -0
- package/dist/commands/core/fix-critical.js.map +1 -0
- package/dist/commands/core/fix-high.d.ts +3 -0
- package/dist/commands/core/fix-high.d.ts.map +1 -0
- package/dist/commands/core/fix-high.js +32 -0
- package/dist/commands/core/fix-high.js.map +1 -0
- package/dist/commands/core/fix-medium.d.ts +3 -0
- package/dist/commands/core/fix-medium.d.ts.map +1 -0
- package/dist/commands/core/fix-medium.js +29 -0
- package/dist/commands/core/fix-medium.js.map +1 -0
- package/dist/commands/core/fix-rls.d.ts +3 -0
- package/dist/commands/core/fix-rls.d.ts.map +1 -0
- package/dist/commands/core/fix-rls.js +17 -0
- package/dist/commands/core/fix-rls.js.map +1 -0
- package/dist/commands/core/harden.d.ts +3 -0
- package/dist/commands/core/harden.d.ts.map +1 -0
- package/dist/commands/core/harden.js +19 -0
- package/dist/commands/core/harden.js.map +1 -0
- package/dist/commands/core/index.d.ts +3 -0
- package/dist/commands/core/index.d.ts.map +1 -0
- package/dist/commands/core/index.js +21 -0
- package/dist/commands/core/index.js.map +1 -0
- package/dist/commands/core/preflight.d.ts +3 -0
- package/dist/commands/core/preflight.d.ts.map +1 -0
- package/dist/commands/core/preflight.js +50 -0
- package/dist/commands/core/preflight.js.map +1 -0
- package/dist/commands/core/verify.d.ts +3 -0
- package/dist/commands/core/verify.d.ts.map +1 -0
- package/dist/commands/core/verify.js +32 -0
- package/dist/commands/core/verify.js.map +1 -0
- package/dist/commands/index.d.ts +28 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +37 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/types.d.ts +9 -0
- package/dist/commands/types.d.ts.map +1 -0
- package/dist/commands/types.js +5 -0
- package/dist/commands/types.js.map +1 -0
- package/dist/compliance/cis.d.ts +29 -0
- package/dist/compliance/cis.d.ts.map +1 -0
- package/dist/compliance/cis.js +316 -0
- package/dist/compliance/cis.js.map +1 -0
- package/dist/compliance/frameworks/eu-ai-act.d.ts +55 -0
- package/dist/compliance/frameworks/eu-ai-act.d.ts.map +1 -0
- package/dist/compliance/frameworks/eu-ai-act.js +621 -0
- package/dist/compliance/frameworks/eu-ai-act.js.map +1 -0
- package/dist/compliance/frameworks/index.d.ts +67 -0
- package/dist/compliance/frameworks/index.d.ts.map +1 -0
- package/dist/compliance/frameworks/index.js +97 -0
- package/dist/compliance/frameworks/index.js.map +1 -0
- package/dist/compliance/frameworks/iso-42001.d.ts +59 -0
- package/dist/compliance/frameworks/iso-42001.d.ts.map +1 -0
- package/dist/compliance/frameworks/iso-42001.js +719 -0
- package/dist/compliance/frameworks/iso-42001.js.map +1 -0
- package/dist/compliance/frameworks/mitre-atlas.d.ts +58 -0
- package/dist/compliance/frameworks/mitre-atlas.d.ts.map +1 -0
- package/dist/compliance/frameworks/mitre-atlas.js +686 -0
- package/dist/compliance/frameworks/mitre-atlas.js.map +1 -0
- package/dist/compliance/frameworks/nist-ai-rmf.d.ts +51 -0
- package/dist/compliance/frameworks/nist-ai-rmf.d.ts.map +1 -0
- package/dist/compliance/frameworks/nist-ai-rmf.js +677 -0
- package/dist/compliance/frameworks/nist-ai-rmf.js.map +1 -0
- package/dist/compliance/frameworks/owasp-llm.d.ts +58 -0
- package/dist/compliance/frameworks/owasp-llm.d.ts.map +1 -0
- package/dist/compliance/frameworks/owasp-llm.js +399 -0
- package/dist/compliance/frameworks/owasp-llm.js.map +1 -0
- package/dist/compliance/gdpr.d.ts +34 -0
- package/dist/compliance/gdpr.d.ts.map +1 -0
- package/dist/compliance/gdpr.js +319 -0
- package/dist/compliance/gdpr.js.map +1 -0
- package/dist/compliance/hipaa.d.ts +29 -0
- package/dist/compliance/hipaa.d.ts.map +1 -0
- package/dist/compliance/hipaa.js +205 -0
- package/dist/compliance/hipaa.js.map +1 -0
- package/dist/compliance/index.d.ts +18 -0
- package/dist/compliance/index.d.ts.map +1 -0
- package/dist/compliance/index.js +26 -0
- package/dist/compliance/index.js.map +1 -0
- package/dist/compliance/iso27001.d.ts +30 -0
- package/dist/compliance/iso27001.d.ts.map +1 -0
- package/dist/compliance/iso27001.js +332 -0
- package/dist/compliance/iso27001.js.map +1 -0
- package/dist/compliance/mapper.d.ts +42 -0
- package/dist/compliance/mapper.d.ts.map +1 -0
- package/dist/compliance/mapper.js +269 -0
- package/dist/compliance/mapper.js.map +1 -0
- package/dist/compliance/mapper.test.d.ts +5 -0
- package/dist/compliance/mapper.test.d.ts.map +1 -0
- package/dist/compliance/mapper.test.js +360 -0
- package/dist/compliance/mapper.test.js.map +1 -0
- package/dist/compliance/pci-dss.d.ts +29 -0
- package/dist/compliance/pci-dss.d.ts.map +1 -0
- package/dist/compliance/pci-dss.js +247 -0
- package/dist/compliance/pci-dss.js.map +1 -0
- package/dist/compliance/report.d.ts +25 -0
- package/dist/compliance/report.d.ts.map +1 -0
- package/dist/compliance/report.js +254 -0
- package/dist/compliance/report.js.map +1 -0
- package/dist/compliance/report.test.d.ts +5 -0
- package/dist/compliance/report.test.d.ts.map +1 -0
- package/dist/compliance/report.test.js +128 -0
- package/dist/compliance/report.test.js.map +1 -0
- package/dist/compliance/soc2.d.ts +30 -0
- package/dist/compliance/soc2.d.ts.map +1 -0
- package/dist/compliance/soc2.js +262 -0
- package/dist/compliance/soc2.js.map +1 -0
- package/dist/compliance/soc2.test.d.ts +5 -0
- package/dist/compliance/soc2.test.d.ts.map +1 -0
- package/dist/compliance/soc2.test.js +86 -0
- package/dist/compliance/soc2.test.js.map +1 -0
- package/dist/compliance/types.d.ts +125 -0
- package/dist/compliance/types.d.ts.map +1 -0
- package/dist/compliance/types.js +10 -0
- package/dist/compliance/types.js.map +1 -0
- package/dist/config/flags.d.ts +456 -0
- package/dist/config/flags.d.ts.map +1 -0
- package/dist/config/flags.js +464 -0
- package/dist/config/flags.js.map +1 -0
- package/dist/config/index.d.ts +10 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +10 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/severity-overrides.d.ts +209 -0
- package/dist/config/severity-overrides.d.ts.map +1 -0
- package/dist/config/severity-overrides.js +380 -0
- package/dist/config/severity-overrides.js.map +1 -0
- package/dist/cost/index.d.ts +11 -0
- package/dist/cost/index.d.ts.map +1 -0
- package/dist/cost/index.js +12 -0
- package/dist/cost/index.js.map +1 -0
- package/dist/cost/pricing.d.ts +57 -0
- package/dist/cost/pricing.d.ts.map +1 -0
- package/dist/cost/pricing.js +196 -0
- package/dist/cost/pricing.js.map +1 -0
- package/dist/cost/pricing.test.d.ts +5 -0
- package/dist/cost/pricing.test.d.ts.map +1 -0
- package/dist/cost/pricing.test.js +195 -0
- package/dist/cost/pricing.test.js.map +1 -0
- package/dist/cost/tracker.d.ts +100 -0
- package/dist/cost/tracker.d.ts.map +1 -0
- package/dist/cost/tracker.js +366 -0
- package/dist/cost/tracker.js.map +1 -0
- package/dist/cost/tracker.test.d.ts +5 -0
- package/dist/cost/tracker.test.d.ts.map +1 -0
- package/dist/cost/tracker.test.js +360 -0
- package/dist/cost/tracker.test.js.map +1 -0
- package/dist/cost/types.d.ts +135 -0
- package/dist/cost/types.d.ts.map +1 -0
- package/dist/cost/types.js +9 -0
- package/dist/cost/types.js.map +1 -0
- package/dist/enterprise/auth/oidc.d.ts +231 -0
- package/dist/enterprise/auth/oidc.d.ts.map +1 -0
- package/dist/enterprise/auth/oidc.js +372 -0
- package/dist/enterprise/auth/oidc.js.map +1 -0
- package/dist/enterprise/auth/oidc.test.d.ts +5 -0
- package/dist/enterprise/auth/oidc.test.d.ts.map +1 -0
- package/dist/enterprise/auth/oidc.test.js +435 -0
- package/dist/enterprise/auth/oidc.test.js.map +1 -0
- package/dist/enterprise/index.d.ts +14 -0
- package/dist/enterprise/index.d.ts.map +1 -0
- package/dist/enterprise/index.js +19 -0
- package/dist/enterprise/index.js.map +1 -0
- package/dist/enterprise/integrations/chat.d.ts +205 -0
- package/dist/enterprise/integrations/chat.d.ts.map +1 -0
- package/dist/enterprise/integrations/chat.js +624 -0
- package/dist/enterprise/integrations/chat.js.map +1 -0
- package/dist/enterprise/integrations/chat.test.d.ts +5 -0
- package/dist/enterprise/integrations/chat.test.d.ts.map +1 -0
- package/dist/enterprise/integrations/chat.test.js +557 -0
- package/dist/enterprise/integrations/chat.test.js.map +1 -0
- package/dist/enterprise/integrations/ticketing.d.ts +257 -0
- package/dist/enterprise/integrations/ticketing.d.ts.map +1 -0
- package/dist/enterprise/integrations/ticketing.js +548 -0
- package/dist/enterprise/integrations/ticketing.js.map +1 -0
- package/dist/enterprise/integrations/ticketing.test.d.ts +5 -0
- package/dist/enterprise/integrations/ticketing.test.d.ts.map +1 -0
- package/dist/enterprise/integrations/ticketing.test.js +693 -0
- package/dist/enterprise/integrations/ticketing.test.js.map +1 -0
- package/dist/enterprise/policy/opa.d.ts +194 -0
- package/dist/enterprise/policy/opa.d.ts.map +1 -0
- package/dist/enterprise/policy/opa.js +385 -0
- package/dist/enterprise/policy/opa.js.map +1 -0
- package/dist/enterprise/policy/opa.test.d.ts +5 -0
- package/dist/enterprise/policy/opa.test.d.ts.map +1 -0
- package/dist/enterprise/policy/opa.test.js +702 -0
- package/dist/enterprise/policy/opa.test.js.map +1 -0
- package/dist/enterprise/signing/kms.d.ts +211 -0
- package/dist/enterprise/signing/kms.d.ts.map +1 -0
- package/dist/enterprise/signing/kms.js +480 -0
- package/dist/enterprise/signing/kms.js.map +1 -0
- package/dist/enterprise/signing/kms.test.d.ts +5 -0
- package/dist/enterprise/signing/kms.test.d.ts.map +1 -0
- package/dist/enterprise/signing/kms.test.js +511 -0
- package/dist/enterprise/signing/kms.test.js.map +1 -0
- package/dist/eval/fixtures.d.ts +58 -0
- package/dist/eval/fixtures.d.ts.map +1 -0
- package/dist/eval/fixtures.js +571 -0
- package/dist/eval/fixtures.js.map +1 -0
- package/dist/eval/fixtures.test.d.ts +5 -0
- package/dist/eval/fixtures.test.d.ts.map +1 -0
- package/dist/eval/fixtures.test.js +193 -0
- package/dist/eval/fixtures.test.js.map +1 -0
- package/dist/eval/harness.d.ts +30 -0
- package/dist/eval/harness.d.ts.map +1 -0
- package/dist/eval/harness.js +221 -0
- package/dist/eval/harness.js.map +1 -0
- package/dist/eval/harness.test.d.ts +5 -0
- package/dist/eval/harness.test.d.ts.map +1 -0
- package/dist/eval/harness.test.js +314 -0
- package/dist/eval/harness.test.js.map +1 -0
- package/dist/eval/index.d.ts +15 -0
- package/dist/eval/index.d.ts.map +1 -0
- package/dist/eval/index.js +18 -0
- package/dist/eval/index.js.map +1 -0
- package/dist/eval/metrics.d.ts +56 -0
- package/dist/eval/metrics.d.ts.map +1 -0
- package/dist/eval/metrics.js +298 -0
- package/dist/eval/metrics.js.map +1 -0
- package/dist/eval/metrics.test.d.ts +5 -0
- package/dist/eval/metrics.test.d.ts.map +1 -0
- package/dist/eval/metrics.test.js +426 -0
- package/dist/eval/metrics.test.js.map +1 -0
- package/dist/eval/report.d.ts +30 -0
- package/dist/eval/report.d.ts.map +1 -0
- package/dist/eval/report.js +333 -0
- package/dist/eval/report.js.map +1 -0
- package/dist/eval/report.test.d.ts +5 -0
- package/dist/eval/report.test.d.ts.map +1 -0
- package/dist/eval/report.test.js +275 -0
- package/dist/eval/report.test.js.map +1 -0
- package/dist/eval/types.d.ts +234 -0
- package/dist/eval/types.d.ts.map +1 -0
- package/dist/eval/types.js +27 -0
- package/dist/eval/types.js.map +1 -0
- package/dist/http-server.d.ts +3 -0
- package/dist/http-server.d.ts.map +1 -0
- package/dist/http-server.js +127 -0
- package/dist/http-server.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4120 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +46 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +131 -0
- package/dist/logger.js.map +1 -0
- package/dist/multimodel/consensus.d.ts +49 -0
- package/dist/multimodel/consensus.d.ts.map +1 -0
- package/dist/multimodel/consensus.js +454 -0
- package/dist/multimodel/consensus.js.map +1 -0
- package/dist/multimodel/consensus.test.d.ts +5 -0
- package/dist/multimodel/consensus.test.d.ts.map +1 -0
- package/dist/multimodel/consensus.test.js +415 -0
- package/dist/multimodel/consensus.test.js.map +1 -0
- package/dist/multimodel/index.d.ts +13 -0
- package/dist/multimodel/index.d.ts.map +1 -0
- package/dist/multimodel/index.js +14 -0
- package/dist/multimodel/index.js.map +1 -0
- package/dist/multimodel/runner.d.ts +95 -0
- package/dist/multimodel/runner.d.ts.map +1 -0
- package/dist/multimodel/runner.js +312 -0
- package/dist/multimodel/runner.js.map +1 -0
- package/dist/multimodel/runner.test.d.ts +5 -0
- package/dist/multimodel/runner.test.d.ts.map +1 -0
- package/dist/multimodel/runner.test.js +224 -0
- package/dist/multimodel/runner.test.js.map +1 -0
- package/dist/multimodel/types.d.ts +202 -0
- package/dist/multimodel/types.d.ts.map +1 -0
- package/dist/multimodel/types.js +10 -0
- package/dist/multimodel/types.js.map +1 -0
- package/dist/observability/index.d.ts +9 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +9 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/otel.d.ts +102 -0
- package/dist/observability/otel.d.ts.map +1 -0
- package/dist/observability/otel.js +284 -0
- package/dist/observability/otel.js.map +1 -0
- package/dist/plugins/index.d.ts +10 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +10 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/loader.d.ts +78 -0
- package/dist/plugins/loader.d.ts.map +1 -0
- package/dist/plugins/loader.js +470 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/plugins/types.d.ts +304 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +100 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/sbom/cyclonedx.d.ts +30 -0
- package/dist/sbom/cyclonedx.d.ts.map +1 -0
- package/dist/sbom/cyclonedx.js +392 -0
- package/dist/sbom/cyclonedx.js.map +1 -0
- package/dist/sbom/cyclonedx.test.d.ts +5 -0
- package/dist/sbom/cyclonedx.test.d.ts.map +1 -0
- package/dist/sbom/cyclonedx.test.js +244 -0
- package/dist/sbom/cyclonedx.test.js.map +1 -0
- package/dist/sbom/index.d.ts +13 -0
- package/dist/sbom/index.d.ts.map +1 -0
- package/dist/sbom/index.js +15 -0
- package/dist/sbom/index.js.map +1 -0
- package/dist/sbom/provenance.d.ts +37 -0
- package/dist/sbom/provenance.d.ts.map +1 -0
- package/dist/sbom/provenance.js +268 -0
- package/dist/sbom/provenance.js.map +1 -0
- package/dist/sbom/provenance.test.d.ts +5 -0
- package/dist/sbom/provenance.test.d.ts.map +1 -0
- package/dist/sbom/provenance.test.js +189 -0
- package/dist/sbom/provenance.test.js.map +1 -0
- package/dist/sbom/signing.d.ts +87 -0
- package/dist/sbom/signing.d.ts.map +1 -0
- package/dist/sbom/signing.js +354 -0
- package/dist/sbom/signing.js.map +1 -0
- package/dist/sbom/signing.test.d.ts +5 -0
- package/dist/sbom/signing.test.d.ts.map +1 -0
- package/dist/sbom/signing.test.js +170 -0
- package/dist/sbom/signing.test.js.map +1 -0
- package/dist/sbom/types.d.ts +384 -0
- package/dist/sbom/types.d.ts.map +1 -0
- package/dist/sbom/types.js +17 -0
- package/dist/sbom/types.js.map +1 -0
- package/dist/scanners/agent/credential-scope-audit.d.ts +40 -0
- package/dist/scanners/agent/credential-scope-audit.d.ts.map +1 -0
- package/dist/scanners/agent/credential-scope-audit.js +404 -0
- package/dist/scanners/agent/credential-scope-audit.js.map +1 -0
- package/dist/scanners/agent/exfil-path-graph.d.ts +50 -0
- package/dist/scanners/agent/exfil-path-graph.d.ts.map +1 -0
- package/dist/scanners/agent/exfil-path-graph.js +764 -0
- package/dist/scanners/agent/exfil-path-graph.js.map +1 -0
- package/dist/scanners/agent/index.d.ts +43 -0
- package/dist/scanners/agent/index.d.ts.map +1 -0
- package/dist/scanners/agent/index.js +616 -0
- package/dist/scanners/agent/index.js.map +1 -0
- package/dist/scanners/agent/manifest-audit.d.ts +43 -0
- package/dist/scanners/agent/manifest-audit.d.ts.map +1 -0
- package/dist/scanners/agent/manifest-audit.js +403 -0
- package/dist/scanners/agent/manifest-audit.js.map +1 -0
- package/dist/scanners/agent/payloads/index.d.ts +44 -0
- package/dist/scanners/agent/payloads/index.d.ts.map +1 -0
- package/dist/scanners/agent/payloads/index.js +184 -0
- package/dist/scanners/agent/payloads/index.js.map +1 -0
- package/dist/scanners/agent/permission-minimiser.d.ts +48 -0
- package/dist/scanners/agent/permission-minimiser.d.ts.map +1 -0
- package/dist/scanners/agent/permission-minimiser.js +551 -0
- package/dist/scanners/agent/permission-minimiser.js.map +1 -0
- package/dist/scanners/agent/prompt-injection-fuzzer.d.ts +39 -0
- package/dist/scanners/agent/prompt-injection-fuzzer.d.ts.map +1 -0
- package/dist/scanners/agent/prompt-injection-fuzzer.js +720 -0
- package/dist/scanners/agent/prompt-injection-fuzzer.js.map +1 -0
- package/dist/scanners/agent/sandbox-audit.d.ts +44 -0
- package/dist/scanners/agent/sandbox-audit.d.ts.map +1 -0
- package/dist/scanners/agent/sandbox-audit.js +425 -0
- package/dist/scanners/agent/sandbox-audit.js.map +1 -0
- package/dist/scanners/agent/supply-chain-mcp.d.ts +53 -0
- package/dist/scanners/agent/supply-chain-mcp.d.ts.map +1 -0
- package/dist/scanners/agent/supply-chain-mcp.js +479 -0
- package/dist/scanners/agent/supply-chain-mcp.js.map +1 -0
- package/dist/scanners/agent/tool-description-drift.d.ts +62 -0
- package/dist/scanners/agent/tool-description-drift.d.ts.map +1 -0
- package/dist/scanners/agent/tool-description-drift.js +365 -0
- package/dist/scanners/agent/tool-description-drift.js.map +1 -0
- package/dist/scanners/agent/types.d.ts +840 -0
- package/dist/scanners/agent/types.d.ts.map +1 -0
- package/dist/scanners/agent/types.js +149 -0
- package/dist/scanners/agent/types.js.map +1 -0
- package/dist/scanners/bandit.d.ts +25 -0
- package/dist/scanners/bandit.d.ts.map +1 -0
- package/dist/scanners/bandit.js +129 -0
- package/dist/scanners/bandit.js.map +1 -0
- package/dist/scanners/binary-analysis.d.ts +41 -0
- package/dist/scanners/binary-analysis.d.ts.map +1 -0
- package/dist/scanners/binary-analysis.js +587 -0
- package/dist/scanners/binary-analysis.js.map +1 -0
- package/dist/scanners/binary-analysis.test.d.ts +5 -0
- package/dist/scanners/binary-analysis.test.d.ts.map +1 -0
- package/dist/scanners/binary-analysis.test.js +291 -0
- package/dist/scanners/binary-analysis.test.js.map +1 -0
- package/dist/scanners/brakeman.d.ts +30 -0
- package/dist/scanners/brakeman.d.ts.map +1 -0
- package/dist/scanners/brakeman.js +271 -0
- package/dist/scanners/brakeman.js.map +1 -0
- package/dist/scanners/dependencies.d.ts +22 -0
- package/dist/scanners/dependencies.d.ts.map +1 -0
- package/dist/scanners/dependencies.js +202 -0
- package/dist/scanners/dependencies.js.map +1 -0
- package/dist/scanners/dependencies.test.d.ts +5 -0
- package/dist/scanners/dependencies.test.d.ts.map +1 -0
- package/dist/scanners/dependencies.test.js +185 -0
- package/dist/scanners/dependencies.test.js.map +1 -0
- package/dist/scanners/eslint.d.ts +25 -0
- package/dist/scanners/eslint.d.ts.map +1 -0
- package/dist/scanners/eslint.js +220 -0
- package/dist/scanners/eslint.js.map +1 -0
- package/dist/scanners/gosec.d.ts +25 -0
- package/dist/scanners/gosec.d.ts.map +1 -0
- package/dist/scanners/gosec.js +128 -0
- package/dist/scanners/gosec.js.map +1 -0
- package/dist/scanners/index.d.ts +128 -0
- package/dist/scanners/index.d.ts.map +1 -0
- package/dist/scanners/index.js +811 -0
- package/dist/scanners/index.js.map +1 -0
- package/dist/scanners/index.test.d.ts +5 -0
- package/dist/scanners/index.test.d.ts.map +1 -0
- package/dist/scanners/index.test.js +424 -0
- package/dist/scanners/index.test.js.map +1 -0
- package/dist/scanners/memory-safety.d.ts +44 -0
- package/dist/scanners/memory-safety.d.ts.map +1 -0
- package/dist/scanners/memory-safety.js +571 -0
- package/dist/scanners/memory-safety.js.map +1 -0
- package/dist/scanners/memory-safety.test.d.ts +5 -0
- package/dist/scanners/memory-safety.test.d.ts.map +1 -0
- package/dist/scanners/memory-safety.test.js +321 -0
- package/dist/scanners/memory-safety.test.js.map +1 -0
- package/dist/scanners/race-condition.d.ts +25 -0
- package/dist/scanners/race-condition.d.ts.map +1 -0
- package/dist/scanners/race-condition.js +443 -0
- package/dist/scanners/race-condition.js.map +1 -0
- package/dist/scanners/race-condition.test.d.ts +5 -0
- package/dist/scanners/race-condition.test.d.ts.map +1 -0
- package/dist/scanners/race-condition.test.js +428 -0
- package/dist/scanners/race-condition.test.js.map +1 -0
- package/dist/scanners/secrets.d.ts +25 -0
- package/dist/scanners/secrets.d.ts.map +1 -0
- package/dist/scanners/secrets.js +367 -0
- package/dist/scanners/secrets.js.map +1 -0
- package/dist/scanners/secrets.test.d.ts +5 -0
- package/dist/scanners/secrets.test.d.ts.map +1 -0
- package/dist/scanners/secrets.test.js +160 -0
- package/dist/scanners/secrets.test.js.map +1 -0
- package/dist/scanners/semgrep.d.ts +33 -0
- package/dist/scanners/semgrep.d.ts.map +1 -0
- package/dist/scanners/semgrep.js +350 -0
- package/dist/scanners/semgrep.js.map +1 -0
- package/dist/scanners/semgrep.test.d.ts +8 -0
- package/dist/scanners/semgrep.test.d.ts.map +1 -0
- package/dist/scanners/semgrep.test.js +254 -0
- package/dist/scanners/semgrep.test.js.map +1 -0
- package/dist/scanners/trivy.d.ts +26 -0
- package/dist/scanners/trivy.d.ts.map +1 -0
- package/dist/scanners/trivy.js +187 -0
- package/dist/scanners/trivy.js.map +1 -0
- package/dist/scanners/types.d.ts +210 -0
- package/dist/scanners/types.d.ts.map +1 -0
- package/dist/scanners/types.js +106 -0
- package/dist/scanners/types.js.map +1 -0
- package/dist/scanners/types.test.d.ts +5 -0
- package/dist/scanners/types.test.d.ts.map +1 -0
- package/dist/scanners/types.test.js +103 -0
- package/dist/scanners/types.test.js.map +1 -0
- package/dist/scanners/typescript.d.ts +32 -0
- package/dist/scanners/typescript.d.ts.map +1 -0
- package/dist/scanners/typescript.js +300 -0
- package/dist/scanners/typescript.js.map +1 -0
- package/dist/scanners/typescript.test.d.ts +5 -0
- package/dist/scanners/typescript.test.d.ts.map +1 -0
- package/dist/scanners/typescript.test.js +296 -0
- package/dist/scanners/typescript.test.js.map +1 -0
- package/dist/transcripts/index.d.ts +13 -0
- package/dist/transcripts/index.d.ts.map +1 -0
- package/dist/transcripts/index.js +17 -0
- package/dist/transcripts/index.js.map +1 -0
- package/dist/transcripts/logger.d.ts +190 -0
- package/dist/transcripts/logger.d.ts.map +1 -0
- package/dist/transcripts/logger.js +385 -0
- package/dist/transcripts/logger.js.map +1 -0
- package/dist/transcripts/logger.test.d.ts +5 -0
- package/dist/transcripts/logger.test.d.ts.map +1 -0
- package/dist/transcripts/logger.test.js +227 -0
- package/dist/transcripts/logger.test.js.map +1 -0
- package/dist/transcripts/redaction.d.ts +125 -0
- package/dist/transcripts/redaction.d.ts.map +1 -0
- package/dist/transcripts/redaction.js +416 -0
- package/dist/transcripts/redaction.js.map +1 -0
- package/dist/transcripts/redaction.test.d.ts +5 -0
- package/dist/transcripts/redaction.test.d.ts.map +1 -0
- package/dist/transcripts/redaction.test.js +267 -0
- package/dist/transcripts/redaction.test.js.map +1 -0
- package/dist/transcripts/signing.d.ts +108 -0
- package/dist/transcripts/signing.d.ts.map +1 -0
- package/dist/transcripts/signing.js +173 -0
- package/dist/transcripts/signing.js.map +1 -0
- package/dist/transcripts/verifier.d.ts +133 -0
- package/dist/transcripts/verifier.d.ts.map +1 -0
- package/dist/transcripts/verifier.js +489 -0
- package/dist/transcripts/verifier.js.map +1 -0
- package/dist/transcripts/verifier.test.d.ts +5 -0
- package/dist/transcripts/verifier.test.d.ts.map +1 -0
- package/dist/transcripts/verifier.test.js +330 -0
- package/dist/transcripts/verifier.test.js.map +1 -0
- package/dist/util/concurrency.d.ts +221 -0
- package/dist/util/concurrency.d.ts.map +1 -0
- package/dist/util/concurrency.js +339 -0
- package/dist/util/concurrency.js.map +1 -0
- package/dist/util/index.d.ts +12 -0
- package/dist/util/index.d.ts.map +1 -0
- package/dist/util/index.js +12 -0
- package/dist/util/index.js.map +1 -0
- package/dist/util/json.d.ts +63 -0
- package/dist/util/json.d.ts.map +1 -0
- package/dist/util/json.js +134 -0
- package/dist/util/json.js.map +1 -0
- package/dist/util/paths.d.ts +56 -0
- package/dist/util/paths.d.ts.map +1 -0
- package/dist/util/paths.js +128 -0
- package/dist/util/paths.js.map +1 -0
- package/dist/util/retry.d.ts +185 -0
- package/dist/util/retry.d.ts.map +1 -0
- package/dist/util/retry.js +338 -0
- package/dist/util/retry.js.map +1 -0
- package/package.json +79 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sigstore Signing
|
|
3
|
+
*
|
|
4
|
+
* Signs artifacts using Sigstore (Fulcio + Rekor) for
|
|
5
|
+
* supply chain security and provenance verification.
|
|
6
|
+
*
|
|
7
|
+
* Uses the official @sigstore/sign library for real cryptographic signing.
|
|
8
|
+
*
|
|
9
|
+
* @module sbom/signing
|
|
10
|
+
*/
|
|
11
|
+
import type { SignedArtifact, SigningOptions } from "./types.js";
|
|
12
|
+
/**
|
|
13
|
+
* Calculate SHA-256 digest
|
|
14
|
+
*/
|
|
15
|
+
export declare function sha256(content: string): string;
|
|
16
|
+
/**
|
|
17
|
+
* Calculate SHA-256 digest as base64
|
|
18
|
+
*/
|
|
19
|
+
export declare function sha256Base64(content: string): string;
|
|
20
|
+
/**
|
|
21
|
+
* Check if Sigstore signing is available
|
|
22
|
+
*
|
|
23
|
+
* Sigstore keyless signing requires:
|
|
24
|
+
* 1. An OIDC identity token (from GitHub Actions, GitLab CI, Google Cloud, etc.)
|
|
25
|
+
* 2. Network access to Fulcio and Rekor
|
|
26
|
+
*
|
|
27
|
+
* In GitHub Actions, set `permissions: id-token: write` to enable OIDC.
|
|
28
|
+
*/
|
|
29
|
+
export declare function isSigningAvailable(options?: SigningOptions): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Sign content using Sigstore
|
|
32
|
+
*
|
|
33
|
+
* This implementation uses the official @sigstore/sign library with
|
|
34
|
+
* Sigstore public-good instances:
|
|
35
|
+
* - Fulcio: Certificate Authority that issues short-lived certificates
|
|
36
|
+
* - Rekor: Transparency log that records signing events
|
|
37
|
+
*
|
|
38
|
+
* The signing process:
|
|
39
|
+
* 1. Get OIDC token from CI/CD environment
|
|
40
|
+
* 2. Request certificate from Fulcio using the OIDC token
|
|
41
|
+
* 3. Sign the content with the ephemeral key
|
|
42
|
+
* 4. Record the signing event in Rekor transparency log
|
|
43
|
+
* 5. Return the bundle containing signature and certificate
|
|
44
|
+
*
|
|
45
|
+
* Requirements:
|
|
46
|
+
* - In GitHub Actions: `permissions: id-token: write`
|
|
47
|
+
* - Network access to fulcio.sigstore.dev and rekor.sigstore.dev
|
|
48
|
+
*/
|
|
49
|
+
export declare function signContent(content: string, options?: SigningOptions): Promise<SignedArtifact>;
|
|
50
|
+
/**
|
|
51
|
+
* Create an unsigned artifact (for offline/testing)
|
|
52
|
+
*/
|
|
53
|
+
export declare function createUnsignedArtifact(content: string): SignedArtifact;
|
|
54
|
+
/**
|
|
55
|
+
* Verify a signed artifact using @sigstore/verify
|
|
56
|
+
*
|
|
57
|
+
* Verification checks:
|
|
58
|
+
* 1. Signature is valid for the content
|
|
59
|
+
* 2. Certificate was issued by Fulcio
|
|
60
|
+
* 3. Entry exists in Rekor transparency log
|
|
61
|
+
* 4. Certificate was valid at signing time
|
|
62
|
+
*/
|
|
63
|
+
export declare function verifySignedArtifact(artifact: SignedArtifact): Promise<{
|
|
64
|
+
valid: boolean;
|
|
65
|
+
errors: string[];
|
|
66
|
+
}>;
|
|
67
|
+
/**
|
|
68
|
+
* Legacy sync verify function for backwards compatibility
|
|
69
|
+
*/
|
|
70
|
+
export declare function verifySignature(artifact: SignedArtifact): {
|
|
71
|
+
valid: boolean;
|
|
72
|
+
errors: string[];
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* Generate signing summary
|
|
76
|
+
*/
|
|
77
|
+
export declare function generateSigningSummary(artifact: SignedArtifact): string;
|
|
78
|
+
/**
|
|
79
|
+
* Check if we're running in a CI environment with OIDC support
|
|
80
|
+
*/
|
|
81
|
+
export declare function detectCIEnvironment(): {
|
|
82
|
+
detected: boolean;
|
|
83
|
+
provider: string | null;
|
|
84
|
+
hasOIDC: boolean;
|
|
85
|
+
setupInstructions: string | null;
|
|
86
|
+
};
|
|
87
|
+
//# sourceMappingURL=signing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signing.d.ts","sourceRoot":"","sources":["../../src/sbom/signing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAkB,MAAM,YAAY,CAAC;AA0BjF;;GAEG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAYpE;AAsCD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,cAAc,CAAC,CAwEzB;AAqCD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CAQtE;AAED;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC;IAC5E,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAAC,CAkCD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,cAAc,GAAG;IACzD,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CA0BA;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAkBvE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI;IACrC,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC,CAyDA"}
|
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sigstore Signing
|
|
3
|
+
*
|
|
4
|
+
* Signs artifacts using Sigstore (Fulcio + Rekor) for
|
|
5
|
+
* supply chain security and provenance verification.
|
|
6
|
+
*
|
|
7
|
+
* Uses the official @sigstore/sign library for real cryptographic signing.
|
|
8
|
+
*
|
|
9
|
+
* @module sbom/signing
|
|
10
|
+
*/
|
|
11
|
+
import { createHash } from "crypto";
|
|
12
|
+
// Import sigstore signing library
|
|
13
|
+
let sigstoreSign = null;
|
|
14
|
+
let sigstoreBundle = null;
|
|
15
|
+
/**
|
|
16
|
+
* Lazily load sigstore libraries
|
|
17
|
+
*/
|
|
18
|
+
async function loadSigstore() {
|
|
19
|
+
if (sigstoreSign && sigstoreBundle) {
|
|
20
|
+
return { sign: sigstoreSign, bundle: sigstoreBundle };
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
sigstoreSign = await import("@sigstore/sign");
|
|
24
|
+
sigstoreBundle = await import("@sigstore/bundle");
|
|
25
|
+
return { sign: sigstoreSign, bundle: sigstoreBundle };
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Calculate SHA-256 digest
|
|
33
|
+
*/
|
|
34
|
+
export function sha256(content) {
|
|
35
|
+
return createHash("sha256").update(content).digest("hex");
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Calculate SHA-256 digest as base64
|
|
39
|
+
*/
|
|
40
|
+
export function sha256Base64(content) {
|
|
41
|
+
return createHash("sha256").update(content).digest("base64");
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Check if Sigstore signing is available
|
|
45
|
+
*
|
|
46
|
+
* Sigstore keyless signing requires:
|
|
47
|
+
* 1. An OIDC identity token (from GitHub Actions, GitLab CI, Google Cloud, etc.)
|
|
48
|
+
* 2. Network access to Fulcio and Rekor
|
|
49
|
+
*
|
|
50
|
+
* In GitHub Actions, set `permissions: id-token: write` to enable OIDC.
|
|
51
|
+
*/
|
|
52
|
+
export function isSigningAvailable(options) {
|
|
53
|
+
if (options?.skipSigning) {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
// Check for identity token
|
|
57
|
+
const token = options?.identityToken ||
|
|
58
|
+
process.env.ACTIONS_ID_TOKEN_REQUEST_TOKEN ||
|
|
59
|
+
process.env.SIGSTORE_ID_TOKEN;
|
|
60
|
+
return !!token;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Get OIDC identity token for signing
|
|
64
|
+
*/
|
|
65
|
+
async function getIdentityToken(options) {
|
|
66
|
+
// Use provided token
|
|
67
|
+
if (options?.identityToken) {
|
|
68
|
+
return options.identityToken;
|
|
69
|
+
}
|
|
70
|
+
// Try GitHub Actions OIDC
|
|
71
|
+
if (process.env.ACTIONS_ID_TOKEN_REQUEST_TOKEN && process.env.ACTIONS_ID_TOKEN_REQUEST_URL) {
|
|
72
|
+
try {
|
|
73
|
+
const response = await fetch(process.env.ACTIONS_ID_TOKEN_REQUEST_URL, {
|
|
74
|
+
headers: {
|
|
75
|
+
Authorization: `Bearer ${process.env.ACTIONS_ID_TOKEN_REQUEST_TOKEN}`,
|
|
76
|
+
Accept: "application/json",
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
if (response.ok) {
|
|
80
|
+
const data = (await response.json());
|
|
81
|
+
return data.value || null;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
// Fall through
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// Try environment variable
|
|
89
|
+
if (process.env.SIGSTORE_ID_TOKEN) {
|
|
90
|
+
return process.env.SIGSTORE_ID_TOKEN;
|
|
91
|
+
}
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Sign content using Sigstore
|
|
96
|
+
*
|
|
97
|
+
* This implementation uses the official @sigstore/sign library with
|
|
98
|
+
* Sigstore public-good instances:
|
|
99
|
+
* - Fulcio: Certificate Authority that issues short-lived certificates
|
|
100
|
+
* - Rekor: Transparency log that records signing events
|
|
101
|
+
*
|
|
102
|
+
* The signing process:
|
|
103
|
+
* 1. Get OIDC token from CI/CD environment
|
|
104
|
+
* 2. Request certificate from Fulcio using the OIDC token
|
|
105
|
+
* 3. Sign the content with the ephemeral key
|
|
106
|
+
* 4. Record the signing event in Rekor transparency log
|
|
107
|
+
* 5. Return the bundle containing signature and certificate
|
|
108
|
+
*
|
|
109
|
+
* Requirements:
|
|
110
|
+
* - In GitHub Actions: `permissions: id-token: write`
|
|
111
|
+
* - Network access to fulcio.sigstore.dev and rekor.sigstore.dev
|
|
112
|
+
*/
|
|
113
|
+
export async function signContent(content, options) {
|
|
114
|
+
const digest = sha256(content);
|
|
115
|
+
const signedAt = new Date().toISOString();
|
|
116
|
+
// Check if signing should be skipped
|
|
117
|
+
if (options?.skipSigning) {
|
|
118
|
+
return {
|
|
119
|
+
content,
|
|
120
|
+
digest,
|
|
121
|
+
signedAt,
|
|
122
|
+
signed: false,
|
|
123
|
+
error: "Signing skipped by configuration",
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
// Check if signing is available
|
|
127
|
+
if (!isSigningAvailable(options)) {
|
|
128
|
+
return {
|
|
129
|
+
content,
|
|
130
|
+
digest,
|
|
131
|
+
signedAt,
|
|
132
|
+
signed: false,
|
|
133
|
+
error: "Sigstore signing not available. Requires OIDC identity token. " +
|
|
134
|
+
"In GitHub Actions, add 'permissions: id-token: write'. " +
|
|
135
|
+
"Or set SIGSTORE_ID_TOKEN environment variable.",
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
try {
|
|
139
|
+
// Load sigstore libraries
|
|
140
|
+
const sigstore = await loadSigstore();
|
|
141
|
+
if (!sigstore) {
|
|
142
|
+
return {
|
|
143
|
+
content,
|
|
144
|
+
digest,
|
|
145
|
+
signedAt,
|
|
146
|
+
signed: false,
|
|
147
|
+
error: "Failed to load @sigstore/sign library",
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
const identityToken = await getIdentityToken(options);
|
|
151
|
+
if (!identityToken) {
|
|
152
|
+
return {
|
|
153
|
+
content,
|
|
154
|
+
digest,
|
|
155
|
+
signedAt,
|
|
156
|
+
signed: false,
|
|
157
|
+
error: "Failed to obtain OIDC identity token",
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
// Perform real signing with @sigstore/sign
|
|
161
|
+
const bundle = await performRealSigning(sigstore.sign, content, identityToken);
|
|
162
|
+
return {
|
|
163
|
+
content,
|
|
164
|
+
digest,
|
|
165
|
+
bundle: bundle,
|
|
166
|
+
signedAt,
|
|
167
|
+
signed: true,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
return {
|
|
172
|
+
content,
|
|
173
|
+
digest,
|
|
174
|
+
signedAt,
|
|
175
|
+
signed: false,
|
|
176
|
+
error: error instanceof Error ? error.message : String(error),
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Perform real Sigstore signing using @sigstore/sign
|
|
182
|
+
*/
|
|
183
|
+
async function performRealSigning(sigstoreSign, content, _identityToken) {
|
|
184
|
+
// Create identity provider - CIContextProvider auto-detects CI environment
|
|
185
|
+
// and retrieves OIDC tokens from GitHub Actions, GitLab CI, etc.
|
|
186
|
+
const identityProvider = new sigstoreSign.CIContextProvider("sigstore");
|
|
187
|
+
// Create the signer with Fulcio (certificates) and Rekor (transparency log)
|
|
188
|
+
const signer = new sigstoreSign.DSSEBundleBuilder({
|
|
189
|
+
signer: new sigstoreSign.FulcioSigner({
|
|
190
|
+
identityProvider,
|
|
191
|
+
}),
|
|
192
|
+
witnesses: [
|
|
193
|
+
new sigstoreSign.RekorWitness({
|
|
194
|
+
rekorBaseURL: sigstoreSign.DEFAULT_REKOR_URL,
|
|
195
|
+
}),
|
|
196
|
+
],
|
|
197
|
+
});
|
|
198
|
+
// Sign the content - DSSE format wraps the payload
|
|
199
|
+
const artifact = {
|
|
200
|
+
data: Buffer.from(content, "utf-8"),
|
|
201
|
+
type: "application/vnd.vaspera.certification+json",
|
|
202
|
+
};
|
|
203
|
+
const bundle = await signer.create(artifact);
|
|
204
|
+
return bundle;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Create an unsigned artifact (for offline/testing)
|
|
208
|
+
*/
|
|
209
|
+
export function createUnsignedArtifact(content) {
|
|
210
|
+
return {
|
|
211
|
+
content,
|
|
212
|
+
digest: sha256(content),
|
|
213
|
+
signedAt: new Date().toISOString(),
|
|
214
|
+
signed: false,
|
|
215
|
+
error: "Unsigned artifact (signing not performed)",
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Verify a signed artifact using @sigstore/verify
|
|
220
|
+
*
|
|
221
|
+
* Verification checks:
|
|
222
|
+
* 1. Signature is valid for the content
|
|
223
|
+
* 2. Certificate was issued by Fulcio
|
|
224
|
+
* 3. Entry exists in Rekor transparency log
|
|
225
|
+
* 4. Certificate was valid at signing time
|
|
226
|
+
*/
|
|
227
|
+
export async function verifySignedArtifact(artifact) {
|
|
228
|
+
const errors = [];
|
|
229
|
+
if (!artifact.signed) {
|
|
230
|
+
errors.push("Artifact is not signed");
|
|
231
|
+
return { valid: false, errors };
|
|
232
|
+
}
|
|
233
|
+
if (!artifact.bundle) {
|
|
234
|
+
errors.push("No Sigstore bundle present");
|
|
235
|
+
return { valid: false, errors };
|
|
236
|
+
}
|
|
237
|
+
// Verify digest matches content
|
|
238
|
+
const expectedDigest = sha256(artifact.content);
|
|
239
|
+
if (artifact.digest !== expectedDigest) {
|
|
240
|
+
errors.push("Content digest mismatch");
|
|
241
|
+
}
|
|
242
|
+
// Check for tlog entries
|
|
243
|
+
const bundle = artifact.bundle;
|
|
244
|
+
if (!bundle.verificationMaterial?.tlogEntries?.length) {
|
|
245
|
+
errors.push("No transparency log entries in bundle");
|
|
246
|
+
}
|
|
247
|
+
// Note: Full verification would use @sigstore/verify to check:
|
|
248
|
+
// - Certificate chain to Fulcio root
|
|
249
|
+
// - Rekor entry inclusion proof
|
|
250
|
+
// - Certificate validity at signing time
|
|
251
|
+
return {
|
|
252
|
+
valid: errors.length === 0,
|
|
253
|
+
errors,
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Legacy sync verify function for backwards compatibility
|
|
258
|
+
*/
|
|
259
|
+
export function verifySignature(artifact) {
|
|
260
|
+
const errors = [];
|
|
261
|
+
if (!artifact.signed) {
|
|
262
|
+
errors.push("Artifact is not signed");
|
|
263
|
+
}
|
|
264
|
+
if (!artifact.bundle) {
|
|
265
|
+
errors.push("No Sigstore bundle present");
|
|
266
|
+
}
|
|
267
|
+
// Verify digest matches content
|
|
268
|
+
const expectedDigest = sha256(artifact.content);
|
|
269
|
+
if (artifact.digest !== expectedDigest) {
|
|
270
|
+
errors.push("Content digest mismatch");
|
|
271
|
+
}
|
|
272
|
+
// Check for tlog entries
|
|
273
|
+
if (artifact.bundle && !artifact.bundle.verificationMaterial?.tlogEntries?.length) {
|
|
274
|
+
errors.push("No transparency log entries in bundle");
|
|
275
|
+
}
|
|
276
|
+
return {
|
|
277
|
+
valid: errors.length === 0,
|
|
278
|
+
errors,
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Generate signing summary
|
|
283
|
+
*/
|
|
284
|
+
export function generateSigningSummary(artifact) {
|
|
285
|
+
const lines = [
|
|
286
|
+
`Signed: ${artifact.signed ? "Yes" : "No"}`,
|
|
287
|
+
`Digest: sha256:${artifact.digest.slice(0, 12)}...`,
|
|
288
|
+
`Timestamp: ${artifact.signedAt}`,
|
|
289
|
+
];
|
|
290
|
+
if (artifact.error) {
|
|
291
|
+
lines.push(`Error: ${artifact.error}`);
|
|
292
|
+
}
|
|
293
|
+
if (artifact.bundle?.verificationMaterial?.tlogEntries?.[0]) {
|
|
294
|
+
const entry = artifact.bundle.verificationMaterial.tlogEntries[0];
|
|
295
|
+
lines.push(`Log Index: ${entry.logIndex}`);
|
|
296
|
+
lines.push(`Transparency Log: rekor.sigstore.dev`);
|
|
297
|
+
}
|
|
298
|
+
return lines.join("\n");
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Check if we're running in a CI environment with OIDC support
|
|
302
|
+
*/
|
|
303
|
+
export function detectCIEnvironment() {
|
|
304
|
+
// GitHub Actions
|
|
305
|
+
if (process.env.GITHUB_ACTIONS) {
|
|
306
|
+
const hasOIDC = !!(process.env.ACTIONS_ID_TOKEN_REQUEST_TOKEN &&
|
|
307
|
+
process.env.ACTIONS_ID_TOKEN_REQUEST_URL);
|
|
308
|
+
return {
|
|
309
|
+
detected: true,
|
|
310
|
+
provider: "GitHub Actions",
|
|
311
|
+
hasOIDC,
|
|
312
|
+
setupInstructions: hasOIDC
|
|
313
|
+
? null
|
|
314
|
+
: "Add 'permissions: id-token: write' to your workflow job",
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
// GitLab CI
|
|
318
|
+
if (process.env.GITLAB_CI) {
|
|
319
|
+
const hasOIDC = !!process.env.CI_JOB_JWT_V2;
|
|
320
|
+
return {
|
|
321
|
+
detected: true,
|
|
322
|
+
provider: "GitLab CI",
|
|
323
|
+
hasOIDC,
|
|
324
|
+
setupInstructions: hasOIDC
|
|
325
|
+
? null
|
|
326
|
+
: "Enable CI_JOB_JWT_V2 in your GitLab CI configuration",
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
// Google Cloud Build
|
|
330
|
+
if (process.env.CLOUD_BUILD_ID) {
|
|
331
|
+
return {
|
|
332
|
+
detected: true,
|
|
333
|
+
provider: "Google Cloud Build",
|
|
334
|
+
hasOIDC: true, // GCB has built-in OIDC
|
|
335
|
+
setupInstructions: null,
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
// Generic check for SIGSTORE_ID_TOKEN
|
|
339
|
+
if (process.env.SIGSTORE_ID_TOKEN) {
|
|
340
|
+
return {
|
|
341
|
+
detected: true,
|
|
342
|
+
provider: "Custom (SIGSTORE_ID_TOKEN)",
|
|
343
|
+
hasOIDC: true,
|
|
344
|
+
setupInstructions: null,
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
return {
|
|
348
|
+
detected: false,
|
|
349
|
+
provider: null,
|
|
350
|
+
hasOIDC: false,
|
|
351
|
+
setupInstructions: "Set SIGSTORE_ID_TOKEN environment variable or run in a CI environment with OIDC support",
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
//# sourceMappingURL=signing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signing.js","sourceRoot":"","sources":["../../src/sbom/signing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signing.test.d.ts","sourceRoot":"","sources":["../../src/sbom/signing.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for Sigstore signing
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
|
|
5
|
+
import { signContent, isSigningAvailable, createUnsignedArtifact, verifySignature, generateSigningSummary, sha256, sha256Base64, } from "./signing.js";
|
|
6
|
+
describe("Sigstore Signing", () => {
|
|
7
|
+
const originalEnv = process.env;
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
vi.resetModules();
|
|
10
|
+
process.env = { ...originalEnv };
|
|
11
|
+
// Clear any signing-related env vars
|
|
12
|
+
delete process.env.ACTIONS_ID_TOKEN_REQUEST_TOKEN;
|
|
13
|
+
delete process.env.ACTIONS_ID_TOKEN_REQUEST_URL;
|
|
14
|
+
delete process.env.SIGSTORE_ID_TOKEN;
|
|
15
|
+
delete process.env.GITHUB_ACTIONS;
|
|
16
|
+
});
|
|
17
|
+
afterEach(() => {
|
|
18
|
+
process.env = originalEnv;
|
|
19
|
+
});
|
|
20
|
+
describe("isSigningAvailable", () => {
|
|
21
|
+
it("returns false when no token available", () => {
|
|
22
|
+
expect(isSigningAvailable()).toBe(false);
|
|
23
|
+
});
|
|
24
|
+
it("returns false when skipSigning is true", () => {
|
|
25
|
+
process.env.SIGSTORE_ID_TOKEN = "test-token";
|
|
26
|
+
expect(isSigningAvailable({ skipSigning: true })).toBe(false);
|
|
27
|
+
});
|
|
28
|
+
it("returns true with SIGSTORE_ID_TOKEN", () => {
|
|
29
|
+
process.env.SIGSTORE_ID_TOKEN = "test-token";
|
|
30
|
+
expect(isSigningAvailable()).toBe(true);
|
|
31
|
+
});
|
|
32
|
+
it("returns true with GitHub Actions token", () => {
|
|
33
|
+
process.env.ACTIONS_ID_TOKEN_REQUEST_TOKEN = "ghs_token";
|
|
34
|
+
expect(isSigningAvailable()).toBe(true);
|
|
35
|
+
});
|
|
36
|
+
it("returns true with provided identityToken", () => {
|
|
37
|
+
expect(isSigningAvailable({ identityToken: "provided-token" })).toBe(true);
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
describe("signContent", () => {
|
|
41
|
+
it("returns unsigned artifact when signing skipped", async () => {
|
|
42
|
+
const result = await signContent("test content", { skipSigning: true });
|
|
43
|
+
expect(result.signed).toBe(false);
|
|
44
|
+
expect(result.error).toBe("Signing skipped by configuration");
|
|
45
|
+
expect(result.digest).toBe(sha256("test content"));
|
|
46
|
+
});
|
|
47
|
+
it("returns unsigned artifact when no token available", async () => {
|
|
48
|
+
const result = await signContent("test content");
|
|
49
|
+
expect(result.signed).toBe(false);
|
|
50
|
+
expect(result.error).toContain("not available");
|
|
51
|
+
});
|
|
52
|
+
it("includes correct digest in result", async () => {
|
|
53
|
+
const content = "test content for hashing";
|
|
54
|
+
const result = await signContent(content, { skipSigning: true });
|
|
55
|
+
expect(result.digest).toBe(sha256(content));
|
|
56
|
+
});
|
|
57
|
+
it("includes timestamp in result", async () => {
|
|
58
|
+
const before = Date.now();
|
|
59
|
+
const result = await signContent("test", { skipSigning: true });
|
|
60
|
+
const after = Date.now();
|
|
61
|
+
const signedTime = new Date(result.signedAt).getTime();
|
|
62
|
+
expect(signedTime).toBeGreaterThanOrEqual(before);
|
|
63
|
+
expect(signedTime).toBeLessThanOrEqual(after);
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
describe("createUnsignedArtifact", () => {
|
|
67
|
+
it("creates artifact with correct content", () => {
|
|
68
|
+
const content = "test content";
|
|
69
|
+
const artifact = createUnsignedArtifact(content);
|
|
70
|
+
expect(artifact.content).toBe(content);
|
|
71
|
+
expect(artifact.signed).toBe(false);
|
|
72
|
+
expect(artifact.error).toBeDefined();
|
|
73
|
+
});
|
|
74
|
+
it("computes correct digest", () => {
|
|
75
|
+
const content = "content for digest";
|
|
76
|
+
const artifact = createUnsignedArtifact(content);
|
|
77
|
+
expect(artifact.digest).toBe(sha256(content));
|
|
78
|
+
});
|
|
79
|
+
it("includes timestamp", () => {
|
|
80
|
+
const artifact = createUnsignedArtifact("test");
|
|
81
|
+
expect(artifact.signedAt).toBeDefined();
|
|
82
|
+
expect(new Date(artifact.signedAt).getTime()).toBeLessThanOrEqual(Date.now());
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
describe("verifySignature", () => {
|
|
86
|
+
it("fails for unsigned artifacts", () => {
|
|
87
|
+
const artifact = createUnsignedArtifact("test");
|
|
88
|
+
const result = verifySignature(artifact);
|
|
89
|
+
expect(result.valid).toBe(false);
|
|
90
|
+
expect(result.errors).toContain("Artifact is not signed");
|
|
91
|
+
});
|
|
92
|
+
it("fails when no bundle present", () => {
|
|
93
|
+
const artifact = {
|
|
94
|
+
content: "test",
|
|
95
|
+
digest: sha256("test"),
|
|
96
|
+
signedAt: new Date().toISOString(),
|
|
97
|
+
signed: true,
|
|
98
|
+
};
|
|
99
|
+
const result = verifySignature(artifact);
|
|
100
|
+
expect(result.valid).toBe(false);
|
|
101
|
+
expect(result.errors).toContain("No Sigstore bundle present");
|
|
102
|
+
});
|
|
103
|
+
it("fails when digest mismatched", () => {
|
|
104
|
+
const artifact = {
|
|
105
|
+
content: "test",
|
|
106
|
+
digest: "wrong-digest",
|
|
107
|
+
signedAt: new Date().toISOString(),
|
|
108
|
+
signed: true,
|
|
109
|
+
bundle: {
|
|
110
|
+
mediaType: "test",
|
|
111
|
+
verificationMaterial: {
|
|
112
|
+
tlogEntries: [
|
|
113
|
+
{
|
|
114
|
+
logIndex: "1",
|
|
115
|
+
logId: { keyId: "test" },
|
|
116
|
+
kindVersion: { kind: "test", version: "1" },
|
|
117
|
+
integratedTime: "123",
|
|
118
|
+
canonicalizedBody: "",
|
|
119
|
+
},
|
|
120
|
+
],
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
};
|
|
124
|
+
const result = verifySignature(artifact);
|
|
125
|
+
expect(result.valid).toBe(false);
|
|
126
|
+
expect(result.errors).toContain("Content digest mismatch");
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
describe("generateSigningSummary", () => {
|
|
130
|
+
it("includes signed status", () => {
|
|
131
|
+
const artifact = createUnsignedArtifact("test");
|
|
132
|
+
const summary = generateSigningSummary(artifact);
|
|
133
|
+
expect(summary).toContain("Signed: No");
|
|
134
|
+
});
|
|
135
|
+
it("includes digest", () => {
|
|
136
|
+
const artifact = createUnsignedArtifact("test");
|
|
137
|
+
const summary = generateSigningSummary(artifact);
|
|
138
|
+
expect(summary).toContain("Digest:");
|
|
139
|
+
expect(summary).toContain("sha256:");
|
|
140
|
+
});
|
|
141
|
+
it("includes error when present", () => {
|
|
142
|
+
const artifact = createUnsignedArtifact("test");
|
|
143
|
+
const summary = generateSigningSummary(artifact);
|
|
144
|
+
expect(summary).toContain("Error:");
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
describe("sha256", () => {
|
|
148
|
+
it("computes correct SHA-256 hex", () => {
|
|
149
|
+
const hash = sha256("test");
|
|
150
|
+
expect(hash).toBe("9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08");
|
|
151
|
+
});
|
|
152
|
+
it("returns 64-character hex string", () => {
|
|
153
|
+
const hash = sha256("any content");
|
|
154
|
+
expect(hash.length).toBe(64);
|
|
155
|
+
expect(/^[a-f0-9]+$/.test(hash)).toBe(true);
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
describe("sha256Base64", () => {
|
|
159
|
+
it("computes correct SHA-256 base64", () => {
|
|
160
|
+
const hash = sha256Base64("test");
|
|
161
|
+
// Base64 of the SHA-256 of "test"
|
|
162
|
+
expect(hash).toBe("n4bQgYhMfWWaL+qgxVrQFaO/TxsrC4Is0V1sFbDwCgg=");
|
|
163
|
+
});
|
|
164
|
+
it("returns valid base64 string", () => {
|
|
165
|
+
const hash = sha256Base64("any content");
|
|
166
|
+
expect(/^[A-Za-z0-9+/]+=*$/.test(hash)).toBe(true);
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
//# sourceMappingURL=signing.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signing.test.js","sourceRoot":"","sources":["../../src/sbom/signing.test.ts"],"names":[],"mappings":"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"}
|