Add post-quantum cryptography support with PqSoftCryptoProvider
Some checks failed
AOC Guard CI / aoc-guard (push) Has been cancelled
AOC Guard CI / aoc-verify (push) Has been cancelled
Concelier Attestation Tests / attestation-tests (push) Has been cancelled
Docs CI / lint-and-preview (push) Has been cancelled
Policy Lint & Smoke / policy-lint (push) Has been cancelled
Scanner Analyzers / Discover Analyzers (push) Has been cancelled
Scanner Analyzers / Build Analyzers (push) Has been cancelled
Scanner Analyzers / Test Language Analyzers (push) Has been cancelled
Scanner Analyzers / Validate Test Fixtures (push) Has been cancelled
Scanner Analyzers / Verify Deterministic Output (push) Has been cancelled
wine-csp-build / Build Wine CSP Image (push) Has been cancelled
Some checks failed
AOC Guard CI / aoc-guard (push) Has been cancelled
AOC Guard CI / aoc-verify (push) Has been cancelled
Concelier Attestation Tests / attestation-tests (push) Has been cancelled
Docs CI / lint-and-preview (push) Has been cancelled
Policy Lint & Smoke / policy-lint (push) Has been cancelled
Scanner Analyzers / Discover Analyzers (push) Has been cancelled
Scanner Analyzers / Build Analyzers (push) Has been cancelled
Scanner Analyzers / Test Language Analyzers (push) Has been cancelled
Scanner Analyzers / Validate Test Fixtures (push) Has been cancelled
Scanner Analyzers / Verify Deterministic Output (push) Has been cancelled
wine-csp-build / Build Wine CSP Image (push) Has been cancelled
- Implemented PqSoftCryptoProvider for software-only post-quantum algorithms (Dilithium3, Falcon512) using BouncyCastle. - Added PqSoftProviderOptions and PqSoftKeyOptions for configuration. - Created unit tests for Dilithium3 and Falcon512 signing and verification. - Introduced EcdsaPolicyCryptoProvider for compliance profiles (FIPS/eIDAS) with explicit allow-lists. - Added KcmvpHashOnlyProvider for KCMVP baseline compliance. - Updated project files and dependencies for new libraries and testing frameworks.
This commit is contained in:
@@ -3,34 +3,51 @@
|
||||
"exportId": "console-export::tenant-default::2025-12-06::0007",
|
||||
"tenantId": "tenant-default",
|
||||
"generatedAt": "2025-12-06T12:11:05Z",
|
||||
"expiresAt": "2025-12-13T12:11:05Z",
|
||||
"items": [
|
||||
{
|
||||
"type": "advisory",
|
||||
"id": "CVE-2024-12345",
|
||||
"format": "json",
|
||||
"url": "https://exports.local/tenant-default/0007/CVE-2024-12345.json?sig=...",
|
||||
"sha256": "cafe0001..."
|
||||
"sha256": "sha256:cafe0001...",
|
||||
"size": 18432
|
||||
},
|
||||
{
|
||||
"type": "vex",
|
||||
"id": "vex:tenant-default:jwt-auth:5d1a",
|
||||
"format": "ndjson",
|
||||
"url": "https://exports.local/tenant-default/0007/vex-jwt-auth.ndjson?sig=...",
|
||||
"sha256": "cafe0002..."
|
||||
"sha256": "sha256:cafe0002...",
|
||||
"size": 9216
|
||||
},
|
||||
{
|
||||
"type": "policy",
|
||||
"id": "policy://tenant-default/runtime-hardening",
|
||||
"format": "json",
|
||||
"url": "https://exports.local/tenant-default/0007/policy-runtime-hardening.json?sig=...",
|
||||
"sha256": "cafe0003..."
|
||||
"sha256": "sha256:cafe0003...",
|
||||
"size": 16384
|
||||
},
|
||||
{
|
||||
"type": "scan",
|
||||
"id": "scan::tenant-default::auth-api::2025-11-07",
|
||||
"format": "ndjson",
|
||||
"url": "https://exports.local/tenant-default/0007/scan-auth-api.ndjson?sig=...",
|
||||
"sha256": "cafe0004..."
|
||||
"sha256": "sha256:cafe0004...",
|
||||
"size": 32768
|
||||
},
|
||||
{
|
||||
"type": "bundle",
|
||||
"id": "console-export::tenant-default::2025-12-06::0007",
|
||||
"format": "tar.gz",
|
||||
"url": "https://exports.local/tenant-default/0007/bundle.tar.gz?sig=...",
|
||||
"sha256": "sha256:deadbeefcafefeed00000000000000000000000000000000000000000000000",
|
||||
"size": 48732102
|
||||
}
|
||||
],
|
||||
"checksums": {
|
||||
"manifest": "c0ffee...",
|
||||
"bundle": "deadbeef..."
|
||||
"manifest": "sha256:c0ffee00000000000000000000000000000000000000000000000000000000",
|
||||
"bundle": "sha256:deadbeef000000000000000000000000000000000000000000000000000000"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -310,11 +310,11 @@ data: {
|
||||
|
||||
> Until backend implementations ship, use the examples above to unblock DOCS-AIAI-31-004; replace them with live captures once the gateway endpoints are available in staging.
|
||||
|
||||
## Exports (draft contract v0.3)
|
||||
## Exports (draft contract v0.4 for sign-off)
|
||||
|
||||
### Routes
|
||||
- `POST /console/exports` — start an evidence bundle export job.
|
||||
- `GET /console/exports/{exportId}` — fetch job status and download locations.
|
||||
- `GET /console/exports/{exportId}` — fetch job status, manifest link, and download locations.
|
||||
- `GET /console/exports/{exportId}/events` — SSE stream of job progress (optional).
|
||||
|
||||
### Security / headers
|
||||
@@ -329,19 +329,20 @@ data: {
|
||||
```jsonc
|
||||
{
|
||||
"scope": { "tenantId": "t1", "projectId": "p1" },
|
||||
"sources": [ { "type": "advisory", "ids": ["CVE-2024-12345"] } ],
|
||||
"sources": [
|
||||
{ "type": "advisory", "ids": ["CVE-2024-12345"] },
|
||||
{ "type": "vex", "ids": ["vex:tenant-default:jwt-auth:5d1a"] }
|
||||
],
|
||||
"formats": ["json", "ndjson", "csv"],
|
||||
"attestations": { "include": true, "sigstoreBundle": true },
|
||||
"attestations": { "include": true, "sigstoreBundle": true, "dsse": true },
|
||||
"notify": { "webhooks": ["https://hooks.local/export"], "email": ["secops@example.com"] },
|
||||
"priority": "normal"
|
||||
}
|
||||
```
|
||||
|
||||
### Response: 202 Accepted
|
||||
- `exportId`: string
|
||||
- `status`: `queued|running|succeeded|failed|expired`
|
||||
- `estimateSeconds`: int
|
||||
- `retryAfter`: int seconds (for polling)
|
||||
- `exportId`, `status: queued|running|succeeded|failed|expired`
|
||||
- `estimateSeconds`, `retryAfter` (seconds)
|
||||
- `links`: `{ status: url, events?: url }`
|
||||
|
||||
### Response: GET status
|
||||
@@ -351,7 +352,14 @@ data: {
|
||||
"status": "running",
|
||||
"estimateSeconds": 420,
|
||||
"outputs": [
|
||||
{ "type": "manifest", "format": "json", "url": "https://.../manifest.json?sig=...", "sha256": "...", "expiresAt": "2025-12-06T13:10:00Z" }
|
||||
{
|
||||
"type": "manifest",
|
||||
"format": "json",
|
||||
"url": "https://exports.local/tenant-default/0007/manifest.json?sig=...",
|
||||
"sha256": "sha256:c0ffee...",
|
||||
"dsseUrl": "https://exports.local/tenant-default/0007/manifest.dsse?sig=...",
|
||||
"expiresAt": "2025-12-06T13:10:00Z"
|
||||
}
|
||||
],
|
||||
"progress": { "percent": 42, "itemsCompleted": 210, "itemsTotal": 500, "assetsReady": 12 },
|
||||
"errors": []
|
||||
@@ -361,25 +369,34 @@ data: {
|
||||
### Response: SSE events
|
||||
- `started`: `{ exportId, status }`
|
||||
- `progress`: `{ exportId, percent, itemsCompleted, itemsTotal }`
|
||||
- `asset_ready`: `{ exportId, type, id, url, sha256 }`
|
||||
- `completed`: `{ exportId, status: "succeeded", manifestUrl }`
|
||||
- `failed`: `{ exportId, status: "failed", code, message }`
|
||||
- `asset_ready`: `{ exportId, type, id, url, sha256, format }`
|
||||
- `completed`: `{ exportId, status: "succeeded", manifestUrl, manifestDsseUrl? }`
|
||||
- `failed`: `{ exportId, status: "failed", code, message, retryAfterSeconds? }`
|
||||
|
||||
### Manifest shape (downloaded via outputs)
|
||||
- `version`: string (date)
|
||||
- `exportId`, `tenantId`, `generatedAt`
|
||||
- `items[]`: `{ type: advisory|vex|policy|scan, id, url, sha256 }`
|
||||
- `checksums`: `{ manifest, bundle }`
|
||||
- Ordering: sort items by `(type asc, id asc, format asc, url asc)`.
|
||||
- `version`: string (date), `exportId`, `tenantId`, `generatedAt`, `expiresAt`
|
||||
- `items[]`: `{ type: advisory|vex|policy|scan|chart|bundle, id, format, url, sha256, size }`
|
||||
- `checksums`: `{ manifest: "sha256:<digest>", bundle?: "sha256:<digest>" }`
|
||||
- Optional DSSE envelope for manifest: `manifest.dsse` (payload type `stellaops.console.manifest`).
|
||||
|
||||
### Limits (proposed)
|
||||
- Max request body 256 KiB; max sources 50; max outputs 1000 assets/export.
|
||||
- Max bundle size 500 MiB compressed.
|
||||
- Default job timeout 30 minutes; idle SSE timeout 60s; backoff via `Retry-After`.
|
||||
|
||||
### Determinism, caching, retry
|
||||
- Responses set `Cache-Control: public, max-age=300, stale-while-revalidate=60, stale-if-error=300`.
|
||||
- `ETag` is SHA-256 over sorted payload; clients send `If-None-Match`.
|
||||
- Respect `Retry-After`; client backoff `1s,2s,4s,8s` capped at 30s.
|
||||
- Cursors (if introduced later) MUST be opaque, base64url, signed with tenant + sortKeys.
|
||||
|
||||
### Error codes (proposal)
|
||||
- `ERR_CONSOLE_EXPORT_INVALID_SOURCE`
|
||||
- `ERR_CONSOLE_EXPORT_TOO_LARGE`
|
||||
- `ERR_CONSOLE_EXPORT_RATE_LIMIT`
|
||||
- `ERR_CONSOLE_EXPORT_UNAVAILABLE`
|
||||
- `ERR_CONSOLE_EXPORT_EXPIRED`
|
||||
|
||||
### Samples
|
||||
- Request: `docs/api/console/samples/console-export-request.json`
|
||||
|
||||
Reference in New Issue
Block a user