[5.18.0] - 2026-03-25
๐ Features
Post-Quantum Cryptography (ML-KEM + ML-DSA + SLH-DSA) (#787)
Full support for NIST post-quantum algorithms via OpenSSL 3.x default provider
(non-FIPS builds only):
- ML-KEM (Key Encapsulation Mechanism): ML-KEM-512, ML-KEM-768, ML-KEM-1024 โ key pair
creation, encapsulation, and decapsulation via KMIP Encrypt/Decrypt operations - ML-DSA (Digital Signature Algorithm): ML-DSA-44, ML-DSA-65, ML-DSA-87 โ key pair
creation, signing, and verification via KMIP Sign/SignatureVerify operations - SLH-DSA (Supersingular Isogeny-based Hash-based DSA): SLH-DSA-SHA2-128s, SLH-DSA-SHA2-192s,
SLH-DSA-SHA2-256s โ key pair creation, signing, and verification via KMIP Sign/SignatureVerify
operations - New KMIP enumeration values for all six PQC algorithms
- Server dispatch for PQC key creation, encrypt/decrypt (KEM), and sign/verify
- CLI actions:
ckms pqc keys create,ckms pqc encapsulate,ckms pqc decapsulate,
ckms pqc sign,ckms pqc verify - WASM bindings:
create_pqc_key_pair_ttlv_request(),get_pqc_algorithms() - Web UI pages: PQC key creation, ML-KEM encapsulate/decapsulate, ML-DSA sign/verify
- Playwright E2E tests for all PQC UI flows
- CLI integration tests for ML-KEM and ML-DSA roundtrips
Configurable Hybrid KEM merged into PQC (#787)
- Merged the standalone
ckms kemsubcommand intockms pqcโ the four hybridized KEM
algorithms (ml-kem-512-p256, ml-kem-768-p256, ml-kem-512-curve25519, ml-kem-768-curve25519)
are now created, encapsulated, and decapsulated through the standard PQC workflow - Auto-detection in encapsulate response handles both PQC and ConfigurableKEM response formats
- WASM bindings updated with the 4 hybrid algorithms
- UI branding supports
hiddenPqcAlgorithmsto hide specific algorithms from the PQC dropdown - CLI and ckms integration tests added for configurable hybrid KEM roundtrips
Support of AWS Bring Your Own Key (BYOK) (#681)
- Introduce 2 CLI actions for AWS BYOK
- Add scripts that automate the AWS BYOK flow, available to download with the documentation
Oracle TDE HSM integration on Windows (#794)
- New PowerShell scripts
test_oracle_tde.ps1andset_hsm.ps1installcosmian_pkcs11.dll
and run a full end-to-end Oracle TDE test on a native Windows Oracle installation (no Docker) - Workarounds for two Oracle 26ai Windows bugs: DLL placed at
C:\opt\oracle\extapi\64\pkcs11\
(drive-relative Linux path) and TDE parameters injected via plain PFILE to bypass the
ALTER SYSTEM SET pkcs11_library_locationvalidator that rejects Windows paths
HSM multi-admin support with wildcard (#801)
hsm_admin is now a list of KMS usernames with HSM admin privileges. Use ["*"] to grant all
authenticated users access to all HSM operations. TOML: hsm_admin = ["alice", "bob"];
CLI: --hsm-admin alice --hsm-admin bob; env: KMS_HSM_ADMIN=alice,bob.
Migration to jsonwebtoken crate for JWT validation (#790)
JWT validation: complete migration from alcoholic_jwt to jsonwebtoken in server middleware,
adding support for multiple algorithms (RS256, ES256, ...).
Update the documentation, Google CSE routes, and OIDC UI auth flow; updated Google CSE tests accordingly.
HMAC-SHA-1 and HMAC-SHA-224 Support (#786) (#797)
NIST SP 800-131A Rev. 2 Table 7 classifies HMAC-SHA-1 and HMAC-SHA-224 as
Acceptable algorithms. The KMS server previously blocked them via the
algorithm policy layer. They are now fully supported.
Synology DSM NAS Volume Encryption Integration
Cosmian KMS is now validated against Synology DSM 7.x KMIP-based volume
encryption. A Python simulation client (scripts/synology_dsm_client.py)
replays the exact KMIP operation sequence performed by DSM when it configures
an external KMS server, and a corresponding CI job (synology_dsm) is added
to the test matrix so regressions are caught automatically:
-
Simulates all 10 DSM KMIP steps:
DiscoverVersions โ Query โ Create (AES-256) โ Activate โ GetAttributes โ ModifyAttribute โ Get โ Locate โ Revoke โ Destroy -
New documentation page
documentation/docs/synology_dsm.mdcovering server
setup, DSM configuration, and automated CI testing -
README.mdupdated with Synology DSM in the disk encryption compatibility table -
Synology DSM simulation (PyKMIP): fix
ModifyAttributestep after issue #820 server fix:
KMIPProxy.send_request_payload()returns the response payload object on success (not a batch
item), so the returned object has noresult_statusfield. Calling_check_result()on it
always returnedFalse, causing spurious cleanup (Destroy) even when the server returned
SUCCESS. Fix: drop the_check_resultcall โsend_request_payloadraises
OperationFailureon server errors; reaching the success path without an exception is sufficient.
Also fixedtest_pykmip.shset -epreventing simulation output from being visible when the
script fails. Fixes CI failure forTest on pykmip - non-fips. (#799) -
OperationPolicyNameround-trip preservation (issue #796): KMIP 1.x clients (e.g. Synology
DSM 7.2.2) include theOperationPolicyNameattribute in Register/Create requests per the KMIP
1.0 spec section 3.18. This attribute was deprecated in KMIP 1.3 and removed in KMIP 2.0+. The
server now emits aWARNlog entry (useful for tracing legacy clients in server logs) and
preserves the value internally as a vendor attribute (KMIP1 / __Operation Policy Name__) so
that a subsequentGetAttributesrequest for"Operation Policy Name"from the same KMIP 1.x
client returns the expected value. Additionally, the server correctly ignoresOperationPolicyName
when sent viaAddAttributeto avoid creating a duplicate entry on top of the one already stored
during Create/Register.
Fixes (#796) -
KMIP 1.x โ 2.1 attribute conversion fixes: Several KMIP 1.x attributes were incorrectly
lost or corrupted during the KMIP 1.x โ 2.1 internal conversion:X509CertificateIdentifier,X509CertificateIssuer,X509CertificateSubject,Digest,
andPkcs12FriendlyNameall exist in KMIP 2.1 but were being dropped with aWARNin the
bulk conversion path (Create/Register), and mapped to a garbageCommentattribute in the
single-attribute path (AddAttribute/SetAttribute). They are now correctly mapped to their
KMIP 2.1 equivalents in both paths.CertificateIdentifier,CertificateIssuer, andCertificateSubject(the non-X509 variants
removed in KMIP 2.0+) are now preserved asVendorAttribute(KMIP1, ...)in both paths
instead of being silently dropped, and are decoded back to their KMIP 1.4 types when a KMIP
1.x client retrieves them viaGetAttributes.StorageStatusMaskin the single-attribute path no longer corrupts theCommentattribute
slot; it is preserved as aVendorAttributewith aWARN. (#799)
-
TransparentECPrivateKey/TransparentECPublicKeyโ KMIP 1.4 conversion: The
TryFrom<kmip_2_1::KeyFormatType> for kmip_1_4::KeyFormatTypeconversion previously returned
an error for these key format types even though KMIP 1.4 defines them with the same numeric
values (0x14/0x15). They are now correctly converted, enabling KMIP 1.4 clients to retrieve
EC keys whose format was stored internally by the server using the KMIP 2.1 canonical type. (#799) -
ModifyAttribute: Fully implement
ModifyAttributeoperation โ attribute changes are now persisted
and ACL checks enforced; settingActivationDateto a past/present date on a Pre-Active object
now correctly transitions it to Active (KMIP spec ยง3.22). Fixes an incompatibility with Synology
DSM (#760) (#788) -
Name attribute stored as VendorExtension instead of standard KMIP attribute: Setting the
Name
attribute via the CLI (ckms attributes set --name <value>) or the web UI now correctly stores it
as the standard KMIPNameattribute instead of aVendorAttribute(hex-encoded bytes inside
VendorExtension). Fixes (#746) (#795)
KMIP 1.0 XML Non-Regression Test Vectors (#799)
All 84 official OASIS KMIP 1.0 XML conformance test vectors are now parsed and
validated as part of the test suite:
mandatory/โ 57 files (19 unique test cases ร 3 minor-version variants):
SKLC-M-1..3 (symmetric key lifecycle), SKFF-M-1..12 (symmetric key
foundry/factory), AKLC-M-1..3 (asymmetric key lifecycle), OMOS-M-1
(opaque managed object store)optional/โ 27 files (9 unique test cases ร 3 minor-version variants):
SKLC-O-1, SKFF-O-1..6, AKLC-O-1, OMOS-O-1
As a side effect, the XML deserializer now correctly maps the SKIPJACK
enumeration token (0x0000_0018) used by SKFF-O-1..3, fixing a
previously-unknown parse error for those optional vectors.
Microsoft SQL Server External Key Management (EKM) (#809)
- Microsoft SQL Server EKM is now available via a Windows DLL provider that forwards key operations to the Cosmian KMS over mutual TLS.
ckms new features
ckms bench concurrency sweep with time limits (#816)
ckms bench: added benchmarks for AES-XTS, AES-GCM-SIV, ECIES, Salsa Sealed Box, Covercrypt, and Configurable KEM (ML-KEM-512/768, hybrid variants);run_benchmarks.shnow injectslscpuoutput and KMS server version intodocumentation/docs/benchmarks.mdckms bench: added--formatoption (text/json); JSON mode collects criterion estimates intotarget/criterion/benchmarks.jsonckms bench: criterion is now a regular dependency (not just dev-dependency)ckms bench: fixed ChaCha20-Poly1305 benchmarks โ changed from[128, 256]to[256]key sizes (ChaCha20 only supports 256-bit keys)
PEM client certificate support in ckms arguments (#804) (#829)
The ckms configure wizard now exposes PEM client certificate authentication in addition to
PKCS#12. Users can select "Client certificate (PEM)" or "Both (PEM cert + token)" and provide
the certificate (.crt/.pem) and private key (.key/.pem) paths separately. The
ssl_client_pem_cert_path and ssl_client_pem_key_path config fields were already supported by
the HTTP client but were not reachable through the interactive wizard.
๐ Bug Fixes
- AZURE BYOK: Fix Azure BYOK silent error when exporting a previously wrapped key (#685)
- Fix AWS BYOK silent when exporting a previously wrapped key. (#681)
- CLI:
benchandmarkdownsubcommands are now visible inckms --help(#821) (#816); both were incorrectly hidden with#[clap(hide = true)]. - CI: Fix intermittent ckms config parse error ("missing field
http_config") caused by a cross-process TOCTOU race whencargo test --workspace --libruns multiple test binaries concurrently; config temp files now include the process ID in their name. Fixes (#779) (#812) - CI (UI FIPS): Fix
ERR_OSSL_EVP_UNSUPPORTEDcrash when runningnix.sh --variant fips test ui; pnpm 9.x uses MD4 increateBase32Hashwhich is blocked by the FIPS provider loaded viaLD_PRELOADin the Nix shell.test_ui.shnow stripsLD_PRELOAD/OPENSSL_CONF/OPENSSL_MODULESfrom all pnpm invocations so Node.js uses the default OpenSSL provider while Rust/cargo builds remain FIPS-mode.
HSM related fixes
- HSM: CKA_ID missing on HSM-created keys: Keys generated via the HSM PKCS#11 path were stored
without aCKA_ID, making them invisible to some PKCS#11 tools. The KMS now setsCKA_IDat
key creation time for all HSM backends (Proteccio, Utimaco, SoftHSM2). (#801) - HSM: HSM key lookup (
get_object_handle) now searches byCKA_IDfirst (primary
path for KMS-created keys) and falls back toCKA_LABELfor externally provisioned keys
that may not haveCKA_IDset;get_object_idfollows the same order (#801) - HSM: Non-admin users can now create KMS keys wrapped by the server-level
key_encryption_key; the ownership check is skipped for this shared server resource
(#761) (#801) - HSM/CLI:
ckms sym keys unwrap -i hsm::<slot>::<label>no longer fails with
"This key is sensitive and cannot be exported from the HSM"; the unwrap is now performed
server-side through the KMS crypto oracle so the HSM key material is never exported
(#762) (#801) - Fix Locate for mixed HSM + software key environments
- Server:
HsmStore.find()now returns HSM keys to all authenticated users for read-only listing (previously required HSM admin), and populates basic attributes (algorithm, length, object type) from HSM metadata so Locate and/access/owneddisplay key info without a separateGetAttributesround-trip. - UI: Locate page now correctly merges HSM keys (
hsm::prefix) into results even when they are absent from/access/owned; HSM keys default to "Active" state during enrichment. - UI Locate: Fix "State: Unknown" shown for all objects when clicking "Search Objects" with no filters โ state is now resolved from
/access/owned(software keys) and defaults to "Active" for HSM keys without invoking per-objectGetAttributes. - UI E2E: New
locate-hsm.spec.tsPlaywright integration tests run against a real SoftHSM2 KMS;test_ui.sh(vianix.sh test ui) wires up the full stack (WASM build โ KMS server โ SoftHSM2 token โ pre-created keys โ Vite preview โ Playwright) on both Linux and macOS.test_ui.shnow requiressofthsm2-utilto be installed and errors out with a clear message if it is missing. (#822)
- Server:
โ๏ธ Build
- (deps) Bump pnpm/action-setup from 4 to 5 (#800)
- (deps) Bump rustls-webpki in the cargo group across 1 directory (#815)
๐งช Testing
- Create integration tests for AWS KMS BYOK using OpenSSL to unwrap locally and mock the AWS infrastructure (#681)
๐ Documentation
- Documentation for AWS BYOK on docs.cosmian (#681)