PHP Classes

How to Use PHP Cryptography Library to Secure Information Following the United States Government FIPS Standards Using the Package ext-pqcrypto: PHP extension to encrypt data with FIPS algorithms

Recommend this page to a friend!
  Info   Documentation   View files Files   Install with Composer Install with Composer   Download Download   Reputation   Support forum   Blog    
Last Updated Ratings Unique User Downloads Download Rankings
2026-04-30 (6 hours ago) RSS 2.0 feedNot yet rated by the usersTotal: Not yet counted Not yet ranked
Version License PHP version Categories
ext-pqcrypto 1.0Custom (specified...8.1Cryptography, PHP 8
Description 

Author

This package provides a PHP extension to encrypt data with FIPS algorithms.

It provides the code of a PHP extension written in the Rust language that implements several encryption algorithms.

Currently it implements the algorithms:

- FIPS 203 (ML-KEM)

- FIPS 204 (ML-DSA)

- FIPS 205 (SLH-DSA)

- X-Wing (hybrid X25519 + ML-KEM-768)

Picture of Scott Arciszewski
  Performance   Level  
Name: Scott Arciszewski <contact>
Classes: 39 packages by
Country: United States United States
Innovation award
Innovation award
Nominee: 29x

Winner: 1x

Instructions

Please read this document to learn how to build the pqcrypto extension and call the encryption functions.

Documentation

ext-pqcrypto: Post-Quantum Cryptography for PHP

CI Latest Stable Version License Downloads crates.io

A PHP extension (written in Rust) that exposes post-quantum cryptography algorithms from the RustCrypto project.

Implements FIPS 203 (ML-KEM), FIPS 204 (ML-DSA), FIPS 205 (SLH-DSA), and X-Wing (hybrid X25519 + ML-KEM-768).

Requirements

  • PHP >= 8.1
  • Rust toolchain (rustc >= 1.85, nightly)
  • `php-config` in PATH (for ext-php-rs build)

Building

make build   # cargo build --release
make test    # run PHP test suite
make install # copy to PHP extension dir

After installing, add extension=pqcrypto to your php.ini, then run:

var_dump(extension_loaded('pqcrypto')); // bool(true)

Usage

X-Wing (Hybrid KEM: X25519 + ML-KEM-768)

> [!TIP] > > X-Wing is the recommend hybrid post-quantum KEM.

[$sk, $pk] = PQCrypto\XWing::generateKeypair();

[$sharedSecret, $ciphertext] = $pk->encapsulate();
$recipientSecret = $sk->decapsulate($ciphertext);

assert(hash_equals($recipientSecret, $sharedSecret));

ML-KEM (Key Encapsulation)

> [!TIP] > > We do not recommend ML-KEM-512, but include it for completeness. > ML-KEM-768 or ML-KEM-1024 should be used if X-Wing is not acceptable.

// ML-KEM-768 (also: MLKem512, MLKem1024)
[$sk, $pk] = PQCrypto\MLKem768::generateKeypair();

[$sharedSecret, $ciphertext] = $pk->encapsulate();
$recipientSecret = $sk->decapsulate($ciphertext);

assert(hash_equals($recipientSecret, $sharedSecret));

// Serialize / restore
$skBytes = $sk->bytes();  // 64-byte seed
$sk2 = PQCrypto\MLKem768\DecapsulationKey::fromBytes($skBytes);

ML-DSA (Digital Signatures)

> [!TIP] > > ML-DSA-44 is fine. The larger parameter sets should only be used if you specifically need them for compliance reasons > (i.e., CNSA 2.0).

// ML-DSA-44 (also: MLDSA65, MLDSA87)
[$signingKey, $verifyingKey] = PQCrypto\MLDSA44::generateKeypair();

$signature = $signingKey->sign('message');
$valid = $verifyingKey->verify($signature, 'message'); // true
$invalid = $verifyingKey->verify($signature, 'wrong');  // false

// Serialize / restore
$seed = $signingKey->bytes(); // 32-byte seed
$sk2 = PQCrypto\MLDSA44\SigningKey::fromBytes($seed);

SLH-DSA (Stateless Hash-Based Signatures)

// Parameters: hash function + speed
// Hash: 'shake128', 'shake192', 'shake256',
//       'sha2-128', 'sha2-192', 'sha2-256'
// Speed: 'fast' (larger sigs) or 'small' (smaller sigs)
$slh = new PQCrypto\SLHDSA('shake256', 'fast');

[$signingKey, $verifyingKey] = $slh->generateKeypair();

$signature = $signingKey->sign('message');
$valid = $verifyingKey->verify($signature, 'message');

// Import keys
$sk2 = $slh->importSigningKey($signingKey->bytes());
$vk2 = $slh->importVerifyingKey($verifyingKey->bytes());

Key Sizes

KEM

| Algorithm | Seed | Public Key | Ciphertext | Shared Secret | |-------------|-------|------------|------------|---------------| | ML-KEM-512 | 64 | 800 | 768 | 32 | | ML-KEM-768 | 64 | 1184 | 1088 | 32 | | ML-KEM-1024 | 64 | 1568 | 1568 | 32 | | X-Wing | 32 | 1216 | 1120 | 32 |

Signatures

| Algorithm | Seed | Public Key | Signature | |------------------|------|------------|-----------| | ML-DSA-44 | 32 | 1312 | 2420 | | ML-DSA-65 | 32 | 1952 | 3309 | | ML-DSA-87 | 32 | 2592 | 4627 | | SLH-DSA-*-128s | 64 | 32 | 7856 | | SLH-DSA-*-128f | 64 | 32 | 17088 | | SLH-DSA-*-192s | 96 | 48 | 16224 | | SLH-DSA-*-192f | 96 | 48 | 35664 | | SLH-DSA-*-256s | 128 | 64 | 29792 | | SLH-DSA-*-256f | 128 | 64 | 49856 |

All sizes above are measured in bytes.

Secret keys are stored as seeds, never semi-expanded secrets. This is a deliberate design choice.


  Files folder image Files (23)  
File Role Description
Files folder image.cargo (1 file)
Files folder image.github (1 directory)
Files folder imagepie (3 files)
Files folder imagesrc (3 files)
Files folder imagetests (5 files)
Accessible without login Plain text file build.rs Data Auxiliary data
Accessible without login Plain text file Cargo.lock Data Auxiliary data
Accessible without login Plain text file Cargo.toml Data Auxiliary data
Accessible without login Plain text file composer.json Data Auxiliary data
Accessible without login Plain text file LICENSE Lic. License text
Accessible without login Plain text file Makefile Data Auxiliary data
Accessible without login Plain text file phpunit.xml Data Auxiliary data
Accessible without login Plain text file README.md Doc. Documentation
Accessible without login Plain text file rust-toolchain.toml Data Auxiliary data

  Files folder image Files (23)  /  .cargo  
File Role Description
  Accessible without login Plain text file config.toml Data Auxiliary data

  Files folder image Files (23)  /  .github  
File Role Description
Files folder imageworkflows (2 files)

  Files folder image Files (23)  /  .github  /  workflows  
File Role Description
  Accessible without login Plain text file ci.yml Data Auxiliary data
  Accessible without login Plain text file release.yml Data Auxiliary data

  Files folder image Files (23)  /  pie  
File Role Description
  Accessible without login Plain text file config.m4 Data Auxiliary data
  Accessible without login Plain text file Makefile.frag Data Auxiliary data
  Accessible without login Plain text file pqcrypto.c Data Auxiliary data

  Files folder image Files (23)  /  src  
File Role Description
  Accessible without login Plain text file kem.rs Data Auxiliary data
  Accessible without login Plain text file lib.rs Data Auxiliary data
  Accessible without login Plain text file sig.rs Data Auxiliary data

  Files folder image Files (23)  /  tests  
File Role Description
  Accessible without login Plain text file ExtensionTest.php Class Class source
  Accessible without login Plain text file MLDSATest.php Class Class source
  Accessible without login Plain text file MLKemTest.php Class Class source
  Accessible without login Plain text file SLHDSATest.php Class Class source
  Accessible without login Plain text file XWingTest.php Class Class source

The PHP Classes site has supported package installation using the Composer tool since 2013, as you may verify by reading this instructions page.
Install with Composer Install with Composer
 Version Control Unique User Downloads  
 100%
Total:0
This week:0