API Reference - aabmets/quantcrypt GitHub Wiki

Table of Contents

  1. Key Encapsulation Mechanisms
  2. Digital Signature Schemes
  3. The Krypton Cipher
  4. Key Derivation Functions
  5. Utilities
  6. Compilation Tools

Key Encapsulation Mechanisms

MLKEM_512

class MLKEM_512(BaseKEM):
    variant: PQAVariant
    spec: AlgoSpec

    def __init__(self, variant: const.PQAVariant = None, *, allow_fallback: bool = True) -> None:
        """Initializes the MLKEM_512 key encapsulation mechanism algorithm
        instance with compiled C extension binaries."""

    @property
    def param_sizes(self) -> KEMParamSizes: 
        """Returns the size of the params of this KEM algorithm."""

    def keygen(self) -> tuple[bytes, bytes]: 
        """Returns a tuple of public key and secret key bytes."""

    def encaps(self, public_key: bytes) -> tuple[bytes, bytes]:
        """Returns a tuple of ciphertext and shared secret bytes."""

    def decaps(self, secret_key: bytes, cipher_text: bytes) -> bytes:
        """Returns the bytes of the decapsulated shared secret."""

    def armor(self, key_bytes: bytes) -> str:
        """Returns a base64-encoded ASCII string of the key bytes."""

    def dearmor(self, armored_key: str) -> bytes:
        """Returns the key bytes from an armored key ASCII string."""

Back to Top

MLKEM_768

class MLKEM_768(BaseKEM):
    variant: PQAVariant
    spec: AlgoSpec

    def __init__(self, variant: const.PQAVariant = None, *, allow_fallback: bool = True) -> None:
        """Initializes the MLKEM_768 key encapsulation mechanism algorithm
        instance with compiled C extension binaries."""

    @property
    def param_sizes(self) -> KEMParamSizes: 
        """Returns the size of the params of this KEM algorithm."""

    def keygen(self) -> tuple[bytes, bytes]: 
        """Returns a tuple of public key and secret key bytes."""

    def encaps(self, public_key: bytes) -> tuple[bytes, bytes]:
        """Returns a tuple of ciphertext and shared secret bytes."""

    def decaps(self, secret_key: bytes, cipher_text: bytes) -> bytes:
        """Returns the bytes of the decapsulated shared secret."""

    def armor(self, key_bytes: bytes) -> str:
        """Returns a base64-encoded ASCII string of the key bytes."""

    def dearmor(self, armored_key: str) -> bytes:
        """Returns the key bytes from an armored key ASCII string."""

Back to Top

MLKEM_1024

class MLKEM_1024(BaseKEM):
    variant: PQAVariant
    spec: AlgoSpec

    def __init__(self, variant: const.PQAVariant = None, *, allow_fallback: bool = True) -> None:
        """Initializes the MLKEM_1024 key encapsulation mechanism algorithm
        instance with compiled C extension binaries."""

    @property
    def param_sizes(self) -> KEMParamSizes: 
        """Returns the size of the params of this KEM algorithm."""

    def keygen(self) -> tuple[bytes, bytes]: 
        """Returns a tuple of public key and secret key bytes."""

    def encaps(self, public_key: bytes) -> tuple[bytes, bytes]:
        """Returns a tuple of ciphertext and shared secret bytes."""

    def decaps(self, secret_key: bytes, cipher_text: bytes) -> bytes:
        """Returns the bytes of the decapsulated shared secret."""

    def armor(self, key_bytes: bytes) -> str:
        """Returns a base64-encoded ASCII string of the key bytes."""

    def dearmor(self, armored_key: str) -> bytes:
        """Returns the key bytes from an armored key ASCII string."""

Back to Top

Digital Signature Schemes

MLDSA_44

class MLDSA_44(BaseDSS):
    variant: PQAVariant
    spec: AlgoSpec

    def __init__(self, variant: const.PQAVariant = None, *, allow_fallback: bool = True) -> None:
        """Initializes the MLDSA_44 digital signature scheme algorithm
        instance with compiled C extension binaries."""

    @property
    def param_sizes(self) -> DSSParamSizes: 
        """Returns the size of the params of this DSS algorithm."""

    def keygen(self) -> tuple[bytes, bytes]: 
        """Returns a tuple of public key and secret key bytes."""

    def sign(self, secret_key: bytes, message: bytes) -> bytes:
        """Returns bytes of the generated signature."""

    def verify(
            self, 
            public_key: bytes, 
            message: bytes, 
            signature: bytes, 
            *, 
            raises: bool = True
    ) -> bool:
        """Returns True on successful signature verification."""

    def sign_file(
            self, 
            secret_key: str | bytes, 
            data_file: str | Path, 
            callback: Optional[Callable] = None
    ) -> SignedFile:
        """Computes and signs the hash of the data file to generate the signature."""

    def verify_file(
            self, 
            public_key: str | bytes, 
            data_file: str | Path, 
            signature: bytes, 
            callback: Optional[Callable] = None, 
            *, 
            raises: bool = True
    ) -> bool:
        """Verifies the signature against the computed hash of the data file."""

    def armor(self, key_bytes: bytes) -> str:
        """Returns a base64-encoded ASCII string of the key bytes."""

    def dearmor(self, armored_key: str) -> bytes:
        """Returns the key bytes from an armored key ASCII string."""

Back to Top

MLDSA_65

class MLDSA_65(BaseDSS):
    variant: PQAVariant
    spec: AlgoSpec

    def __init__(self, variant: const.PQAVariant = None, *, allow_fallback: bool = True) -> None:
        """Initializes the MLDSA_65 digital signature scheme algorithm
        instance with compiled C extension binaries."""

    @property
    def param_sizes(self) -> DSSParamSizes: 
        """Returns the size of the params of this DSS algorithm."""

    def keygen(self) -> tuple[bytes, bytes]: 
        """Returns a tuple of public key and secret key bytes."""

    def sign(self, secret_key: bytes, message: bytes) -> bytes:
        """Returns bytes of the generated signature."""

    def verify(
            self, 
            public_key: bytes, 
            message: bytes, 
            signature: bytes, 
            *, 
            raises: bool = True
    ) -> bool:
        """Returns True on successful signature verification."""

    def sign_file(
            self, 
            secret_key: str | bytes, 
            data_file: str | Path, 
            callback: Optional[Callable] = None
    ) -> SignedFile:
        """Computes and signs the hash of the data file to generate the signature."""

    def verify_file(
            self, 
            public_key: str | bytes, 
            data_file: str | Path, 
            signature: bytes, 
            callback: Optional[Callable] = None, 
            *, 
            raises: bool = True
    ) -> bool:
        """Verifies the signature against the computed hash of the data file."""

    def armor(self, key_bytes: bytes) -> str:
        """Returns a base64-encoded ASCII string of the key bytes."""

    def dearmor(self, armored_key: str) -> bytes:
        """Returns the key bytes from an armored key ASCII string."""

Back to Top

MLDSA_87

class MLDSA_87(BaseDSS):
    variant: PQAVariant
    spec: AlgoSpec

    def __init__(self, variant: const.PQAVariant = None, *, allow_fallback: bool = True) -> None:
        """Initializes the MLDSA_87 digital signature scheme algorithm
        instance with compiled C extension binaries."""

    @property
    def param_sizes(self) -> DSSParamSizes: 
        """Returns the size of the params of this DSS algorithm."""

    def keygen(self) -> tuple[bytes, bytes]: 
        """Returns a tuple of public key and secret key bytes."""

    def sign(self, secret_key: bytes, message: bytes) -> bytes:
        """Returns bytes of the generated signature."""

    def verify(
            self, 
            public_key: bytes, 
            message: bytes, 
            signature: bytes, 
            *, 
            raises: bool = True
    ) -> bool:
        """Returns True on successful signature verification."""

    def sign_file(
            self, 
            secret_key: str | bytes, 
            data_file: str | Path, 
            callback: Optional[Callable] = None
    ) -> SignedFile:
        """Computes and signs the hash of the data file to generate the signature."""

    def verify_file(
            self, 
            public_key: str | bytes, 
            data_file: str | Path, 
            signature: bytes, 
            callback: Optional[Callable] = None, 
            *, 
            raises: bool = True
    ) -> bool:
        """Verifies the signature against the computed hash of the data file."""

    def armor(self, key_bytes: bytes) -> str:
        """Returns a base64-encoded ASCII string of the key bytes."""

    def dearmor(self, armored_key: str) -> bytes:
        """Returns the key bytes from an armored key ASCII string."""

Back to Top

FALCON_512

class FALCON_512(BaseDSS):
    variant: PQAVariant
    spec: AlgoSpec

    def __init__(self, variant: const.PQAVariant = None, *, allow_fallback: bool = True) -> None:
        """Initializes the FALCON_512 digital signature scheme algorithm
        instance with compiled C extension binaries."""

    @property
    def param_sizes(self) -> DSSParamSizes: 
        """Returns the size of the params of this DSS algorithm."""

    def keygen(self) -> tuple[bytes, bytes]: 
        """Returns a tuple of public key and secret key bytes."""

    def sign(self, secret_key: bytes, message: bytes) -> bytes:
        """Returns bytes of the generated signature."""

    def verify(
            self, 
            public_key: bytes, 
            message: bytes, 
            signature: bytes, 
            *, 
            raises: bool = True
    ) -> bool:
        """Returns True on successful signature verification."""

    def sign_file(
            self, 
            secret_key: str | bytes, 
            data_file: str | Path, 
            callback: Optional[Callable] = None
    ) -> SignedFile:
        """Computes and signs the hash of the data file to generate the signature."""

    def verify_file(
            self, 
            public_key: str | bytes, 
            data_file: str | Path, 
            signature: bytes, 
            callback: Optional[Callable] = None, 
            *, 
            raises: bool = True
    ) -> bool:
        """Verifies the signature against the computed hash of the data file."""

    def armor(self, key_bytes: bytes) -> str:
        """Returns a base64-encoded ASCII string of the key bytes."""

    def dearmor(self, armored_key: str) -> bytes:
        """Returns the key bytes from an armored key ASCII string."""

Back to Top

FALCON_1024

class FALCON_1024(BaseDSS):
    variant: PQAVariant
    spec: AlgoSpec

    def __init__(self, variant: const.PQAVariant = None, *, allow_fallback: bool = True) -> None:
        """Initializes the FALCON_1024 digital signature scheme algorithm
        instance with compiled C extension binaries."""

    @property
    def param_sizes(self) -> DSSParamSizes: 
        """Returns the size of the params of this DSS algorithm."""

    def keygen(self) -> tuple[bytes, bytes]: 
        """Returns a tuple of public key and secret key bytes."""

    def sign(self, secret_key: bytes, message: bytes) -> bytes:
        """Returns bytes of the generated signature."""

    def verify(
            self, 
            public_key: bytes, 
            message: bytes, 
            signature: bytes, 
            *, 
            raises: bool = True
    ) -> bool:
        """Returns True on successful signature verification."""

    def sign_file(
            self, 
            secret_key: str | bytes, 
            data_file: str | Path, 
            callback: Optional[Callable] = None
    ) -> SignedFile:
        """Computes and signs the hash of the data file to generate the signature."""

    def verify_file(
            self, 
            public_key: str | bytes, 
            data_file: str | Path, 
            signature: bytes, 
            callback: Optional[Callable] = None, 
            *, 
            raises: bool = True
    ) -> bool:
        """Verifies the signature against the computed hash of the data file."""

    def armor(self, key_bytes: bytes) -> str:
        """Returns a base64-encoded ASCII string of the key bytes."""

    def dearmor(self, armored_key: str) -> bytes:
        """Returns the key bytes from an armored key ASCII string."""

Back to Top

FAST_SPHINCS

class FAST_SPHINCS(BaseDSS):
    variant: PQAVariant
    spec: AlgoSpec

    def __init__(self, variant: const.PQAVariant = None, *, allow_fallback: bool = True) -> None:
        """Initializes the FAST_SPHINCS digital signature scheme algorithm
        instance with compiled C extension binaries."""

    @property
    def param_sizes(self) -> DSSParamSizes: 
        """Returns the size of the params of this DSS algorithm."""

    def keygen(self) -> tuple[bytes, bytes]: 
        """Returns a tuple of public key and secret key bytes."""

    def sign(self, secret_key: bytes, message: bytes) -> bytes:
        """Returns bytes of the generated signature."""

    def verify(
            self, 
            public_key: bytes, 
            message: bytes, 
            signature: bytes, 
            *, 
            raises: bool = True
    ) -> bool:
        """Returns True on successful signature verification."""

    def sign_file(
            self, 
            secret_key: str | bytes, 
            data_file: str | Path, 
            callback: Optional[Callable] = None
    ) -> SignedFile:
        """Computes and signs the hash of the data file to generate the signature."""

    def verify_file(
            self, 
            public_key: str | bytes, 
            data_file: str | Path, 
            signature: bytes, 
            callback: Optional[Callable] = None, 
            *, 
            raises: bool = True
    ) -> bool:
        """Verifies the signature against the computed hash of the data file."""

    def armor(self, key_bytes: bytes) -> str:
        """Returns a base64-encoded ASCII string of the key bytes."""

    def dearmor(self, armored_key: str) -> bytes:
        """Returns the key bytes from an armored key ASCII string."""

Back to Top

SMALL_SPHINCS

class SMALL_SPHINCS(BaseDSS):
    variant: PQAVariant
    spec: AlgoSpec

    def __init__(self, variant: const.PQAVariant = None, *, allow_fallback: bool = True) -> None:
        """Initializes the SMALL_SPHINCS digital signature scheme algorithm
        instance with compiled C extension binaries."""

    @property
    def param_sizes(self) -> DSSParamSizes: 
        """Returns the size of the params of this DSS algorithm."""

    def keygen(self) -> tuple[bytes, bytes]: 
        """Returns a tuple of public key and secret key bytes."""

    def sign(self, secret_key: bytes, message: bytes) -> bytes:
        """Returns bytes of the generated signature."""

    def verify(
            self, 
            public_key: bytes, 
            message: bytes, 
            signature: bytes, 
            *, 
            raises: bool = True
    ) -> bool:
        """Returns True on successful signature verification."""

    def sign_file(
            self, 
            secret_key: str | bytes, 
            data_file: str | Path, 
            callback: Optional[Callable] = None
    ) -> SignedFile:
        """Computes and signs the hash of the data file to generate the signature."""

    def verify_file(
            self, 
            public_key: str | bytes, 
            data_file: str | Path, 
            signature: bytes, 
            callback: Optional[Callable] = None, 
            *, 
            raises: bool = True
    ) -> bool:
        """Verifies the signature against the computed hash of the data file."""

    def armor(self, key_bytes: bytes) -> str:
        """Returns a base64-encoded ASCII string of the key bytes."""

    def dearmor(self, armored_key: str) -> bytes:
        """Returns the key bytes from an armored key ASCII string."""

Back to Top

The Krypton Cipher

Krypton

class Krypton:
    def __init__(
            self, 
            secret_key: bytes, 
            context: bytes = b'', 
            chunk_size: ChunkSize.Atd = None
    ) -> None:
        """
        Creates a new Krypton instance for encrypting and/or decrypting
        multiple messages with the same secret key and configuration.
        """

    def flush(self) -> None:
        """Resets the ciphers internal state."""

    def begin_encryption(self, header: bytes = b'') -> None:
        """Prepares the Krypton instance for encryption mode."""

    def encrypt(self, plaintext: bytes) -> bytes:
        """Encrypts plaintext into ciphertext."""

    def finish_encryption(self) -> bytes:
        """Finalizes the encryption process."""

    def begin_decryption(self, verif_data: bytes, header: bytes = b'') -> None:
        """Prepares the Krypton instance for decryption mode."""

    def decrypt(self, ciphertext: bytes) -> bytes:
        """Decrypts ciphertext into plaintext."""

    def finish_decryption(self) -> None:
        """Finalizes the decryption process."""

Back to Top

KryptonFile

class KryptonFile:
    def __init__(
            self, 
            secret_key: bytes, 
            context: bytes = b'', 
            callback: Optional[Callable] = None, 
            chunk_size: ChunkSize.Atd = None
    ) -> None:
        """
        Creates a new KryptonFile instance for encrypting and/or decrypting multiple
        files of arbitrary sizes with the same secret key using the same configuration.
        """

    def encrypt(
            self, 
            data_file: str | Path, 
            output_file: str | Path, 
            header: bytes = b''
    ) -> None:
        """
        Reads plaintext from the `data_file` in chunks and encrypts them into
        ciphertext, writing the encrypted ciphertext chunks into the output_file.
        The header data is also written into the `output_file`.
        """

    def decrypt_to_file(
            self, 
            encrypted_file: str | Path, 
            output_file: str | Path
    ) -> bytes:
        """
        Reads ciphertext from the `encrypted_file` in chunks and decrypts them
        into plaintext, writing the decrypted plaintext chunks into the output_file.
        """

    def decrypt_to_memory(self, encrypted_file: str | Path) -> DecryptedFile:
        """
        Reads ciphertext from the `encrypted_file` in chunks and decrypts
        them into plaintext, storing the entire decrypted plaintext into memory.
        """

    @classmethod
    def read_file_header(cls, encrypted_file: str | Path) -> bytes:
        """Reads the header bytes from a Krypton ciphertext file."""

Back to Top

KryptonKEM

class KryptonKEM:
    def __init__(
            self, 
            kem_class: Type[BaseKEM],
            kdf_params: KDFParams = None,
            context: bytes = b"quantcrypt",
            callback: Optional[Callable] = None, 
            chunk_size: ChunkSize.Atd = None
    ) -> None:
        """
        Creates a new KryptonKEM instance for encrypting and/or decrypting
        multiple files of arbitrary sizes with KEM public and private keys
        using the same configuration. Internally uses **KryptonFile** class.
        """

    def encrypt(
            self, 
            public_key: str | bytes,
            data_file: str | Path, 
            output_file: str | Path
    ) -> None:
        """
        Encapsulates the provided public_key into a shared secret, which is
        transformed with Argon2.Key into a 64 byte key for the KryptonFile class.
        Then, encrypts the plaintext data from the data_file and writes it into 
        the output_file along with any necessary metadata to decrypt the file 
        with the secret_key of the KEM keypair.
        """

    def decrypt_to_file(
            self, 
            secret_key: str | bytes,
            encrypted_file: str | Path, 
            output_file: str | Path = None
    ) -> bytes:
        """
        Decapsulates the shared secret from the file metadata using the 
        provided KEM secret key, which is then transformed with Argon2.Key
        into a 64 byte key for the KryptonFile class. Then, decrypts the
        ciphertext data from the encrypted file and writes the plaintext 
        into the output_file, recreating the original plaintext file.
        """

    def decrypt_to_memory(
            self, 
            secret_key: str | bytes, 
            encrypted_file: str | Path
    ) -> DecryptedFile:
        """
        Decapsulates the shared secret from the file metadata using the 
        provided KEM secret key, which is then transformed with Argon2.Key
        into a 64 byte key for the KryptonFile class. Then, decrypts the
        ciphertext data from the encrypted file and writes the plaintext 
        into memory. **Note:** Do NOT decrypt huge files (>100MB) into 
        memory, use your best judgement.
        """

Back to Top

Key Derivation Functions

Argon2

class Argon2:
    Hash = Argon2Hash
    Key = Argon2Key

Back to Top

Argon2Hash

class Argon2Hash(BaseArgon2):
    public_hash: Optional[str] = None
    rehashed: bool = False
    verified: bool = False

    def __init__(
            self,
            password: str | bytes,
            verif_hash: str | bytes = None,
            *,
            min_years: int = 1,
            params: KDFParams = None
    ) -> None:
        """
        Computes the Argon2 hash immediately on class 
        instantiation using the provided parameters.
        """

Back to Top

Argon2Key

class Argon2Key(BaseArgon2):
    secret_key: Optional[bytes] = None
    public_salt: Optional[str] = None

    def __init__(
            self,
            password: str | bytes,
            public_salt: str | bytes = None,
            *,
            min_years: int = 10,
            params: KDFParams = None
    ) -> None:
        """
        Computes the Argon2 derived secret key immediately on 
        class instantiation using the provided parameters.
        """

Back to Top

KKDF

class KKDF:
    def __new__(
            cls,
            master: bytes,
            key_len: int = 32,
            num_keys: int = 1,
            salt: bytes = None,
            context: bytes = None
    ) -> tuple[bytes, ...]:
        """
        Computes the KMAC-KDF derived secret keys immediately 
        on class instantiation using the provided parameters. 
        Returns the generated keys as a tuple of bytes.
        """

Back to Top

Utilities

DecryptedFile

@dataclass
class DecryptedFile:
    plaintext: bytes
    header: bytes

Back to Top

MemCost

class MemCost:
    MB = MemCostMB
    GB = MemCostGB

class MemCostMB(dict):
    def __init__(self, size: Literal[32, 64, 128, 256, 512]) -> None:
        """Converts the size input argument value of megabytes to kilobytes."""

class MemCostGB(dict):
    def __init__(self, size: Literal[1, 2, 3, 4, 5, 6, 7, 8]) -> None:
        """Converts the size input argument value of gigabytes to kilobytes."""

Back to Top

KDFParams

class KDFParams(DotMap):
    def __init__(
            self,
            memory_cost: MemCostMB | MemCostGB,
            parallelism: int,
            time_cost: int,
            hash_len: int = 32,
            salt_len: int = 32
    ) -> None:
        """
        Custom parameters for altering the security
        level of key derivation functions.
        """

Back to Top

PQAVariant

class PQAVariant(ExtendedEnum):
    REF = "clean"
    OPT_AMD = "avx2"
    OPT_ARM = "aarch64"

Back to Top

PQAType

class PQAType(ExtendedEnum):
    KEM = "crypto_kem"
    DSS = "crypto_sign"

Back to Top

AlgoSpec

@dataclass(frozen=True)
class AlgoSpec:
    type: PQAType
    src_subdir: Path
    pqclean_name: str
    class_name: str

Back to Top

SupportedAlgos

class AlgoSpecsList(list):
    def pqclean_names(self: list[AlgoSpec]) -> list[str]:
        """Returns the pqclean_names of all contained AlgoSpecs."""

    def armor_names(self: list[AlgoSpec], pqa_type: PQAType | None = None) -> list[str]:
        """Returns the armor_names of all contained AlgoSpecs. Permits filtering by PQAType."""

    def filter(self, armor_names: list[str], invert: bool = False) -> list[AlgoSpec]:
        """Returns specs which exist in armor_names. Can invert filtering behavior."""


SupportedAlgos: AlgoSpecList[AlgoSpec]

Back to Top

SignedFile

@dataclass
class SignedFile:
    algo_name: str
    signature: bytes
    file_digest: bytes

Back to Top

ChunkSize

class ChunkSize:
    KB = ChunkSizeKB
    MB = ChunkSizeMB

class ChunkSizeKB(dict):
    def __init__(self, size: Literal[1, 2, 4, 8, 16, 32, 64, 128, 256]) -> None:
        """Converts the size input argument value of kilobytes to bytes."""

class ChunkSizeMB(dict):
    def __init__(self, size: Literal[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) -> None:
        """Converts the size input argument value of megabytes to bytes."""

Back to Top

Compilation Tools

Target

@dataclass(frozen=True)
class Target:
    spec: const.AlgoSpec
    variant: const.PQAVariant
    source_dir: Path
    required_flags: list[str]
    accepted: bool

Back to Top

Compiler

class Compiler:
    @classmethod
    def run(cls,
            target_variants: list[const.PQAVariant] = None,
            target_algos: list[const.AlgoSpec] = None,
            *,
            in_subprocess: bool = False,
            verbose: bool = False,
            debug: bool = False,
    ) -> subprocess.Popen | list[Target]:
        """
        Compiles the target variants of the target algorithms and stores the 
        compiled binaries within the internals of the QuantCrypt library.
        """

Back to Top

⚠️ **GitHub.com Fallback** ⚠️