[5.23.0] - 2026-05-25
π Features
REST Crypto API (JOSE/JWE)
- New REST API under
/v1/cryptoβ JOSE-compatible encrypt, decrypt, sign, verify, and MAC without a KMIP client library (RFC 7515/7516/7518) (#868) - Key management:
POST /v1/crypto/keys(symmetric, RSA, EC),DELETE /v1/crypto/keys/{kid}with cascade destroy - Encryption/decryption: AES-GCM direct and RSA-OAEP/RSA-OAEP-256 key wrapping with
A128/192/256GCM; AAD binding - Signing/verification: RS256/384/512, PS256/384/512, ES256/384/512; HMAC compute and verify (HS256/384/512)
- JOSE algorithm fields replaced with
JoseAlgorithm/JoseEncAlgorithmenums β invalid values rejected at deserialization (400)
Multi-HSM Support
[[hsm_instances]]TOML array-of-tables for simultaneous multiple HSM instances; prefix-based routing (hsm::<model>::<slot>::<key>) (#942)GET /hsm/statusendpoint (auth required) returning JSON array of all connected HSM instances with per-slot info- Web UI β new
Objects β HSM Statuspage;Locate.tsxupdated to handle all multi-HSM UID prefix patterns - HSM keys now default to
sensitive=true;Destroy/Revokerestricted to HSM admins;Get-as-wildcard removed for HSM keys
PQC X.509 Certificates
Certifysupports ML-DSA-44/65/87 and all SLH-DSA variants as subject key and issuer signing algorithms (non-FIPS) (#943)- ML-KEM-512/768/1024 CA-issued X.509 certificates (RFC 9935); RFC 9881/9909 critical
keyUsageauto-added for PQC certs id-ce-noRevAvail(RFC 9608, OID 2.5.29.56) auto-added to self-signed certs with no CRL DP;authorityInfoAccess(AIA) extension support fixedCertifysplit into dedicated RFC submodules (rfc9881.rs,rfc9909.rs,rfc9935.rs,rfc9608.rs)
ReKeyKeyPair
ReKeyKeyPair(KMIP Β§6.1.47): implemented for RSA, EC, Ed25519, X25519, ML-KEM/ML-DSA/SLH-DSA; shared lifecycle logic inrekey_common.rs; KMIP 1.4 wire-format support added (#845)
OpenAPI / Swagger UI
- New
/openapi.yamlendpoint serving the OpenAPI 3.1 spec, embedded at compile time; new/swaggerendpoint with locally-vendored Swagger UI (swagger-ui-dist 5.18.2), no CDN dependency, strict CSP header, and relative server URL for correct origin binding
Rebranding (Cosmian β Eviden)
- Web UI: increased Eviden logo height, orange logo in dark mode, new
E-letter favicon (eviden-favicon.svg) - Documentation: replaced all "Cosmian VM" / "Cosmian VM KMS" references with "Eviden VM" / "Eviden VM KMS"
π Security
- COSMIAN-2026-016 β KEK wrapping bypass:
ModifyAttribute/SetAttribute/AddAttribute/Activateauto-unwrapped KEK-wrapped keys and persisted plaintext back to DB; fixed by skipping unwrap for attribute-only operations (#960) - COSMIAN-2026-015 β KEK plaintext leak via UsageLimits:
decrypt.rs/sign.rspersisted unwrapped key material when UsageLimits were configured; fixed by cloning before unwrapping (#959) - Attribute-mutation authorization bypass: attribute ops (
SetAttribute,ModifyAttribute,AddAttribute,DeleteAttribute) used relaxedGetAttributespermission; now require the correct per-operation permission (#959) - HSM key permissions hardening: admin-only Destroy; block
Destroy/Revokegrants;Locateand/access/ownedvisibility filtering for non-admin users (#942) - COSMIAN-2026-017 / COSMIAN-2026-018:
ReKeyandActivatenow check ownership /KmipOperation::Activatepermission β previously any user with any grant could activate or rotate another user's key - ReKey / ReKeyKeyPair privileged-user enforcement: both operations now respect
privileged_usersCreate-permission gating, consistent withCreate,Import, andRegister - GPL dependency removal: replace
actix-governor(GPL-3.0-or-later) with a directgovernor(MIT/Apache-2.0) middleware; removeGPL-3.0-or-laterfromdeny.tomlallow list (#967)
π Bug Fixes
VAST Data / KMIP 1.x Interoperability
- Fix
ReKey,DeriveKey,ReCertify,CheckreturningInvalid_Messagefor KMIP 1.4 clients (#845) - Fix RFC 3394 vs RFC 5649 wrapping mismatch β default to
NISTKeyWrap(RFC 3394) forGetwithKeyWrappingSpecification(#845) - Fix
DerivationParametersdeserialization βSalt,DerivationData,IterationCountwere silently ignored due to missing#[serde(rename_all = "PascalCase")](#845) - Fix
ReKeycreating replacement key material in-place β now creates a new UID and links old/new viaReplacementObjectLink/ReplacedObjectLink; existing key State is not changed per KMIP 2.1 Β§6.1.46 (#845)
Google CSE
- Fix
InvalidAudiencerejecting all CSE authorization tokens with jsonwebtoken 10.x (#947) - Fix KACLS migration
rewrap/privilegedunwrapflow β set expected audience"kacls-migration"for whitelist configs (#947) - Add JWKS refresh-retry on validation failure to prevent permanent auth failures after periodic refresh errors (#947)
- Register
POST /google_cse/wrapprivatekeyendpoint in the Google CSE scope β was defined but not reachable
Multi-HSM
- Fix longest-prefix matching in
get_object_storeβ model-based UIDs (hsm::softhsm2::0::key) were routed to legacyhsmbackend (#942) - Fix
HsmStore::find()/atomic()hardcoded"hsm::"prefix breaking multi-HSM setups (#942) - Fix
GetβExportequivalence β holding either now grants both on HSM keys (#942) - Fix SQL
INNER JOIN objectsexcluding HSM keys from/access/obtainedresults β changed toLEFT JOIN(#942)
Certificates / WASM
- Fix
id-ce-noRevAvailOID (2.5.29.56) was incorrectly set to1.3.6.1.5.5.7.1.56;noRevAvailnow excluded from CA certs per RFC 9608 Β§3 - Fix WASM empty-string
Option<String>passed asSome("")causing422 Object_Not_Foundfor cleared form fields - Fix
certificatePoliciesextension failing with "no config database" when a CPS qualifier (CPS:urlorCPS.N:url) is in--certificate-extensionsCNF; replaced OpenSSL conf-basedX509Extension::new_nidpath with a native Rust DER builder (also handles numberedCPS.1:,CPS.2:syntax)
Misc
- Fix ECDSA verify returning HTTP 500 on corrupted signature instead of
{"valid": false} - Fix Web UI
AccessGrant/AccessRevokehardcoded 8-operation list β replaced with WASM-exported dynamic list of all 21 operations (#959) - Fix
KmipOperation::to_string()serialisation β grant/revoke for attribute operations returned HTTP 400unknown variant 'set_attribute'(#959) - Fix
ActivateonDestroyedorCompromisedobjects returningObject_Not_Foundβ now returns the correctWrong_Key_Lifecycle_StateKMIP error - Fix
operation_typesenum values inopenapi.yaml(were PascalCase; server expects lowercase due to#[serde(rename_all = "lowercase")]); fix/access/createand/access/privilegedresponse schemas; documentPOST /v1/crypto/keys400 response - Fix test temp-directory collisions: embed
std::process::id()in path names to prevent SQLitedatabase is lockedfailures under parallelcargo test --workspace
UI Encryption
- Fix HTML error page displayed in UI when encrypt payload exceeds server limit β KMIP endpoint now returns plain text errors instead of HTML (#966)
- Fix WASM panic "capacity overflow" encrypting large files β TTLV serializer accumulates
Vec<u8>byte-like tags directly into aByteStringinstead of allocating one TTLV element per byte; prevents OOM on 32-bit WASM for payloads >~10 MB (#967) - Fix client-side upload limit: corrected from 45 MB to 30 MB to account for TTLV hex encoding (2Γ expansion); a 35 MB file produces a ~70 MB JSON body, exceeding the server's 64 MB payload limit (#967)
β»οΈ Refactor
- KMIP
fmt::Display/fmt::Debug: replaced withimpl_display!/debug_from_display!macros (~330 lines saved) - Server attribute operations: new
attribute_ops_dispatch.rswith shared macros (match_add_attribute!, etc.) (~1 126 lines saved) - Server lifecycle helpers: extracted
setup_object_lifecycle(),fill_missing_cp_fields()intostate_utils.rs(~165 lines saved) - Web UI: shared
useActionStatehook andActionResponsecomponent across 66 action components (~3 177 lines saved) - Generic
CryptoOpSpectrait unifying all 6 crypto operations (Encrypt, Decrypt, Sign, SignatureVerify, MAC, MACVerify) intoperform_crypto_operation<Op>()(#959) - Net: 72 files changed, β3 177 net lines (#959)
π§ͺ Testing
- KMIP regression vector infrastructure: 8 integration suites converted to binary TTLV wire format (KMIP 1.0β1.4); FortiGate, MySQL, Percona, Synology DSM, Veeam, VMware, MongoDB, PyKMIP (#953)
- 24 Known-Answer Test (KAT) vectors (NIST FIPS 180-4/202, SP 800-38A/D, RFC 4231/8439/8452/5869/8018/7539); 39 new dynamic vectors (PQC, Ed448, secp256k1, ChaCha20, AES-XTS, key-wrap)
- 31 Certify integration tests and 26 PQC chain validation tests; 15 PQC self-signed CLI test cases (non-FIPS)
- VAST Data regression vector: 10-step AES key lifecycle (CreateβActivateβReKeyβCheckβGetβDestroy) (#845)
- KEK wrapping regression tests:
test_decrypt_preserves_kek_wrapping_with_usage_limits,test_sign_preserves_kek_wrapping_with_usage_limits(#959) - 32 HSM key authorization non-regression scenarios in
crate/server/src/tests/hsm/permissions.rs(#942) - JOSE integration tests (
encrypt_decrypt,sign_verify,mac,error_cases,rfc_vectors) + Pythonjwcryptointerop (#929) - Access control privilege escalation vectors: self-grant, non-owner grant, destroy without permission (#959)
- Total: 134β148+ vectors, 1 127β1 154+ tests
- TTLV serializer regression test: 1 MB
Vec<u8>round-trip viaByteString(verifies no capacity overflow) (#967) - 24 new
ReKeyKeyPairtest vectors (RSA, EC, PQC, edge cases); 3 KMIP 1.4 protocol vectors; access-control vectors for ReKey/Activate privilege escalation (#845) certificatePoliciespositive and negative unit tests (test_certificate_policies_with_cps_qualifier,test_old_new_nid_fails_for_cps_syntax); bash regression script.github/scripts/test/test_certificate_policies.sh- Playwright E2E suite
swagger.spec.ts: OpenAPI spec structure, HTTP contracts, CSP headers, locally-served assets, live server cross-validation
π Documentation
- New
documentation/docs/integrations/rest_crypto_api.mdβ JOSE REST API reference with examples (#868) - New
documentation/docs/hsm_support/multi_hsm.mdβ multi-HSM routing, TOML config,/hsm/statusendpoint (#942) - PKI page consolidated:
pqc_x509_certificates.mdβpki.md; covers RFC 5280/8017/5480/8032/9881/9909/9935/9608 and classical + PQC algorithms (#943) - New
documentation/docs/integrations/storage/vast_data.mdβ VAST Data setup, KEK/DEK workflow, troubleshooting (#845) - JOSE security audit report:
documentation/docs/certifications_and_compliance/audit/jose_security_audit_2026_05.md(#929) authorization.mdupdated with all 22 delegable operations including attribute ops;TESTS.mdadded with test architecture, mermaid diagrams, and vector format spec (#959)- New
documentation/docs/kmip_support/openapi.mdβ OpenAPI/Swagger UI usage, endpoints, tooling integration, security headers, and spec versioning; registered indocumentation/mkdocs.ymlunder KMIP Support;README.mdupdated with OpenAPI 3.1 and Swagger UI mentions - VAST Data integration doc (
vast_data.md) updated: workflow description and sequence diagram corrected β old key remains Active afterReKey;Revoke+Destroymust be called explicitly on both old and new keys
βοΈ CI
- Oracle TDE: refactored CI into standalone
upgrade-kms.sh+smoke-test-tde.shscripts; 6/6 TDE proofs validated on Oracle 23ai Free with Cosmian PKCS#11 provider (#918) - New
joseCI test type (non-FIPS): curl-based REST crypto tests + Pythonjwcryptointeroperability (#929) - Add
cargo deny list -l crate > sbom/licenses.txtpre-commit hook; automate SBOM license generation inrelease.ymlpreparejob (#967)