Composite Provider

Composite Provider 1.0

To ensure a secure transition to post-quantum cryptography, numerous standardization bodies like IETF or BSI recommend the use of hybrid technologies by combining traditional with quantum resistant algorithms. For X.509 public key infrastructures the IETF LAMPS working group introduced the composite signature model, which combines the NIST-standardized post-quantum signature scheme ML-DSA with established algorithms such as RSA, ECDSA, Ed25519, and Ed448, offering a pragmatic migration path towards quantum-safe PKI deployments.
By treating multiple signature algorithms as a single logical signature, composite schemes provide protocol-level compatibility and ensure that security is maintained even if one of the component algorithms is later found to be vulnerable.

Main Features

IAIK Composite represents a JCA (Java Cryptography Architecture) Provider allowing to use hybrid technology with the JCA Signature API. In its first version this Provider supports Signature, KeyPairGenerator and KeyFactory engines for all algorithms specified by https://www.ietf.org/archive/id/draft-ietf-lamps-pq-composite-sigs-19.html (Composite Module-Lattice-Based Digital Signature Algorithm (ML-DSA) for use in X.509 Public Key Infrastructure).
The IAIK Composite Provider cannot be used stand-alone. It requires the IAIK base Provider (iaik_jce.jar) for RSA and ASN.1, the IAIK-ECCelerateTM Provider (iaik_eccelarate.jar) for ECDSA and EdDSA, and the IAIK Post Quantum Provider (iaik_pq.jar) for ML-DSA.

Pricing and Licensing

For current prices of the IAIK Post Quantum Cryptography library, please see our price list and license conditions.

See Prices

Webshop

To order the product please visit our Shop

See Webshop

  • Implemented entirely in the JavaTM language guaranteeing cross platform portability
  • Works on JDK versions Java 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26 and compatible.
  • Implements IETF draft https://datatracker.ietf.org/doc/html/draft-ietf-lamps-pq-composite-sigs-19 (Composite Module-Lattice-Based Digital Signature Algorithm (ML-DSA) for use in X.509 Public Key Infrastructure)
  • Implements all specified composite signature algorithms:
    • MLDSA44-RSA2048-PKCS15-SHA256
    • MLDSA65-RSA3072-PKCS15-SHA512
    • MLDSA65-RSA4096-PKCS15-SHA512
    • MLDSA44-RSA2048-PSS-SHA256
    • MLDSA65-RSA3072-PSS-SHA512
    • MLDSA65-RSA4096-PSS-SHA512
    • MLDSA87-RSA3072-PSS-SHA512
    • MLDSA87-RSA4096-PSS-SHA512
    • MLDSA44-ECDSA-P256-SHA256
    • MLDSA65-ECDSA-P256-SHA512
    • MLDSA65-ECDSA-P384-SHA512
    • MLDSA87-ECDSA-P384-SHA512
    • MLDSA87-ECDSA-P521-SHA512
    • MLDSA65-ECDSA-brainpoolP256r1-SHA512
    • MLDSA87-ECDSA-brainpoolP384r1-SHA512
    • MLDSA44-Ed25519-SHA512
    • MLDSA65-Ed25519-SHA512
    • MLDSA87-Ed448-SHAKE256

The IETF is working on the specification of key formats and algorithm identifiers for using PQ algorithms in X.509 certificates and IETF based protocols like TLS, CMS or S/MIME. Although drafts of key and algorithm identifier specifications already exist they are also subject to change.

Online Javadoc for IAIK-COMPOSITE PROVIDER

Since implemented as JCA Provider, the JCA Signature API can be used for calculating/verfiying composite signatures:

  1. Use a JCA KeyPairGenerator to generate a composite key pair
  2. Use a JCA Signature enngine to calculate a composite signature value for a message with the composite private key
  3. Use a JCA Signature enngine to verify the composite signature value with the composite public key

The following example demonsrates key pair generation, signature calculation and signature verification for the MLDSA65-ECDSA-P256-SHA512 signature algorithm:

 // generate key pair
 KeyPairGenerator kpq = KeyPairGenerator.getInstance("MLDSA65-ECDSA-P256-SHA512", IaikComposite.getInstance());
 KeyPair kp = kpq.generateKeyPair();
 PublicKey publicKey = kp.getPublic();
 PrivateKey privateKey = kp.getPrivate();
 
 // the data to be signed
 byte[] data = ...;
 
 // create a Signature engine and initialize it with the private key for signing
 Signature signature = Signature.getInstance("MLDSA65-ECDSA-P256-SHA512", IaikComposite.getInstance());
 signature.initSign(privateKey);

 // update the Signature engine with the data
 signature.update(data);
 
 // calculate the signature value
 byte[] sigVal = signature.sign();

 // create a Signature engine and initialize it with the public key for verification
 Signature sigVer = Signature.getInstance("MLDSA65-ECDSA-P256-SHA512", IaikComposite.getInstance());
 // initialize the Signature engine for verification
 sigVer.initVerify(publicKey);

 // update the Signature engine with the data
 signVer.update(data);

 // verify the signature value 
 boolean valid = sigVer.verify(sigVal);

In some environments it might be appropriate to calcualte the message digest from the message outside the Signature engine and then let the Signature engine calculate the signature value from the calculated hash value. For that purpose you can use a “raw” (e.g. NONEwithMLDSA65-ECDSA-P256-SHA512) Signature engine:

 // generate key pair
 KeyPairGenerator kpq = KeyPairGenerator.getInstance("MLDSA65-ECDSA-P256-SHA512", IaikComposite.getInstance());
 KeyPair kp = kpq.generateKeyPair();
 PublicKey publicKey = kp.getPublic();
 PrivateKey privateKey = kp.getPrivate();
 
 // the data to be signed
 byte[] data = ...;
  
 // calculate the hash value outside the Signature engine
 MessageDigest md = MessageDigest.getInstance("SHA-512");
 md.update(data);
 byte[] digest = md.digest();
 
 // create a raw Signature engine and initialize it for signing
 Signature signature = Signature.getInstance("NONEwithMLDSA65-ECDSA-P256-SHA512", IaikComposite.getInstance());
 signature.initSign(privateKey);

 // update the Signature engine with the externally calculated digest value 
 signature.update(digest);
 
 // calculate the signature value
 byte[] sigVal = signature.sign();

 // create a raw Signature engine and initialize it with the public key for verification
 Signature sigVer = Signature.getInstance("NONEwithMLDSA65-ECDSA-P256-SHA512", IaikComposite.getInstance());
 // initialize the Signature engine for verification
 sigVer.initVerify(publicKey);

 // update the Signature engine with the externally calculated digest value 
 sigVer.update(digest);

 // verify the signature value 
 boolean valid = sigVer.verify(sigVal);
 
IAIK Composite Provider 1.0 – 25. August 2026
Class or Package Bug / Change / New Feature Description and Examples
iaik.security.composite.provider NF

JCA Provider for composite (combination of traditional and quatum resistant) signature algorithms.

iaik.security.composite.sig NF

Signature, KeyPairGenerator and KeyFactory engines for all algorithms specified by https://datatracker.ietf.org/doc/html/draft-ietf-lamps-pq-composite-sigs-19:

  • MLDSA44-RSA2048-PKCS15-SHA256
  • MLDSA65-RSA3072-PKCS15-SHA512
  • MLDSA65-RSA4096-PKCS15-SHA512
  • MLDSA44-RSA2048-PSS-SHA256
  • MLDSA65-RSA3072-PSS-SHA512
  • MLDSA65-RSA4096-PSS-SHA512
  • MLDSA87-RSA3072-PSS-SHA512
  • MLDSA87-RSA4096-PSS-SHA512
  • MLDSA44-ECDSA-P256-SHA256
  • MLDSA65-ECDSA-P256-SHA512
  • MLDSA65-ECDSA-P384-SHA512
  • MLDSA87-ECDSA-P384-SHA512
  • MLDSA87-ECDSA-P521-SHA512
  • MLDSA65-ECDSA-brainpoolP256r1-SHA512
  • MLDSA87-ECDSA-brainpoolP384r1-SHA512
  • MLDSA44-Ed25519-SHA512
  • MLDSA65-Ed25519-SHA512
  • MLDSA87-Ed448-SHAKE256
IAIK Composite Provider 1.0 – 25. August 2026
Class or Package Bug / Change / New Feature Description and Examples
iaik.security.composite.provider NF

JCA Provider for composite (combination of traditional and quatum resistant) signature algorithms.

iaik.security.composite.sig NF

Signature, KeyPairGenerator and KeyFactory engines for all algorithms specified by https://datatracker.ietf.org/doc/html/draft-ietf-lamps-pq-composite-sigs-19:

  • MLDSA44-RSA2048-PKCS15-SHA256
  • MLDSA65-RSA3072-PKCS15-SHA512
  • MLDSA65-RSA4096-PKCS15-SHA512
  • MLDSA44-RSA2048-PSS-SHA256
  • MLDSA65-RSA3072-PSS-SHA512
  • MLDSA65-RSA4096-PSS-SHA512
  • MLDSA87-RSA3072-PSS-SHA512
  • MLDSA87-RSA4096-PSS-SHA512
  • MLDSA44-ECDSA-P256-SHA256
  • MLDSA65-ECDSA-P256-SHA512
  • MLDSA65-ECDSA-P384-SHA512
  • MLDSA87-ECDSA-P384-SHA512
  • MLDSA87-ECDSA-P521-SHA512
  • MLDSA65-ECDSA-brainpoolP256r1-SHA512
  • MLDSA87-ECDSA-brainpoolP384r1-SHA512
  • MLDSA44-Ed25519-SHA512
  • MLDSA65-Ed25519-SHA512
  • MLDSA87-Ed448-SHAKE256

Any questions?

Don‘t hestitate to ask us about our products.

Contact us