Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
[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):
creation, encapsulation, and decapsulation via KMIP Encrypt/Decrypt operations
creation, signing, and verification via KMIP Sign/SignatureVerify operations
SLH-DSA-SHA2-256s — key pair creation, signing, and verification via KMIP Sign/SignatureVerify
operations
ckms pqc keys create,ckms pqc encapsulate,ckms pqc decapsulate,ckms pqc sign,ckms pqc verifycreate_pqc_key_pair_ttlv_request(),get_pqc_algorithms()Configurable Hybrid KEM merged into PQC (#787)
ckms kemsubcommand intockms pqc— the four hybridized KEMalgorithms (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
hiddenPqcAlgorithmsto hide specific algorithms from the PQC dropdownSupport of AWS Bring Your Own Key (BYOK) (#681)
Oracle TDE HSM integration on Windows (#794)
test_oracle_tde.ps1andset_hsm.ps1installcosmian_pkcs11.dlland run a full end-to-end Oracle TDE test on a native Windows Oracle installation (no Docker)
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 pathsHSM multi-admin support with wildcard (#801)
hsm_adminis now a list of KMS usernames with HSM admin privileges. Use["*"]to grant allauthenticated 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
jsonwebtokencrate for JWT validation (#790)JWT validation: complete migration from
alcoholic_jwttojsonwebtokenin 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 addedto 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 → DestroyNew documentation page
documentation/docs/synology_dsm.mdcovering serversetup, DSM configuration, and automated CI testing
README.mdupdated with Synology DSM in the disk encryption compatibility tableSynology DSM simulation (PyKMIP): fix
ModifyAttributestep after issue #820 server fix:KMIPProxy.send_request_payload()returns the response payload object on success (not a batchitem), so the returned object has no
result_statusfield. Calling_check_result()on italways returned
False, causing spurious cleanup (Destroy) even when the server returnedSUCCESS. Fix: drop the_check_resultcall —send_request_payloadraisesOperationFailureon server errors; reaching the success path without an exception is sufficient.Also fixed
test_pykmip.shset -epreventing simulation output from being visible when thescript fails. Fixes CI failure for
Test on pykmip - non-fips. (#799)OperationPolicyNameround-trip preservation (issue Synology DSM 7.2.2 require KMIP 1.0 OperationPolicyName attribute #796): KMIP 1.x clients (e.g. SynologyDSM 7.2.2) include the
OperationPolicyNameattribute in Register/Create requests per the KMIP1.0 spec section 3.18. This attribute was deprecated in KMIP 1.3 and removed in KMIP 2.0+. The
server now emits a
WARNlog entry (useful for tracing legacy clients in server logs) andpreserves the value internally as a vendor attribute (
KMIP1 / __Operation Policy Name__) sothat a subsequent
GetAttributesrequest for"Operation Policy Name"from the same KMIP 1.xclient returns the expected value. Additionally, the server correctly ignores
OperationPolicyNamewhen sent via
AddAttributeto avoid creating a duplicate entry on top of the one already storedduring 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,and
Pkcs12FriendlyNameall exist in KMIP 2.1 but were being dropped with aWARNin thebulk conversion path (Create/Register), and mapped to a garbage
Commentattribute in thesingle-attribute path (AddAttribute/SetAttribute). They are now correctly mapped to their
KMIP 2.1 equivalents in both paths.
CertificateIdentifier,CertificateIssuer, andCertificateSubject(the non-X509 variantsremoved in KMIP 2.0+) are now preserved as
VendorAttribute(KMIP1, ...)in both pathsinstead of being silently dropped, and are decoded back to their KMIP 1.4 types when a KMIP
1.x client retrieves them via
GetAttributes.StorageStatusMaskin the single-attribute path no longer corrupts theCommentattributeslot; it is preserved as a
VendorAttributewith aWARN. (#799)TransparentECPrivateKey/TransparentECPublicKey→ KMIP 1.4 conversion: TheTryFrom<kmip_2_1::KeyFormatType> for kmip_1_4::KeyFormatTypeconversion previously returnedan 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 persistedand ACL checks enforced; setting
ActivationDateto a past/present date on a Pre-Active objectnow 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
Nameattribute via the CLI (
ckms attributes set --name <value>) or the web UI now correctly stores itas the standard KMIP
Nameattribute instead of aVendorAttribute(hex-encoded bytes insideVendorExtension). 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
SKIPJACKenumeration token (
0x0000_0018) used bySKFF-O-1..3, fixing apreviously-unknown parse error for those optional vectors.
Microsoft SQL Server External Key Management (EKM) (#809)
ckms new features
ckms benchconcurrency 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 configurewizard now exposes PEM client certificate authentication in addition toPKCS#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. Thessl_client_pem_cert_pathandssl_client_pem_key_pathconfig fields were already supported bythe HTTP client but were not reachable through the interactive wizard.
🐛 Bug Fixes
benchandmarkdownsubcommands are now visible inckms --help(#821) (#816); both were incorrectly hidden with#[clap(hide = true)].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)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
without a
CKA_ID, making them invisible to some PKCS#11 tools. The KMS now setsCKA_IDatkey creation time for all HSM backends (Proteccio, Utimaco, SoftHSM2). (#801)
get_object_handle) now searches byCKA_IDfirst (primarypath for KMS-created keys) and falls back to
CKA_LABELfor externally provisioned keysthat may not have
CKA_IDset;get_object_idfollows the same order (#801)key_encryption_key; the ownership check is skipped for this shared server resource(#761) (#801)
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)
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.hsm::prefix) into results even when they are absent from/access/owned; HSM keys default to "Active" state during enrichment./access/owned(software keys) and defaults to "Active" for HSM keys without invoking per-objectGetAttributes.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)⚙️ Build
🧪 Testing
📚 Documentation