noqtis for Python 
Post-quantum signatures, key encapsulation, hashes and sealed file capsules, from the noqtis C library. The library is compiled into the package: no runtime dependencies, and wheels for Linux (glibc and musl), macOS and Windows on x86-64 and arm64, one abi3 wheel per platform for CPython 3.9 and later.
| Family | Algorithms | Standard |
|---|---|---|
| Signatures | ML-DSA-44/65/87 | FIPS 204 |
| SLH-DSA-SHA2 and SLH-DSA-SHAKE, 128/192/256, s and f | FIPS 205 | |
| Ed25519; hybrids ML-DSA-44/65/87+Ed25519 (both parts must verify) | RFC 8032 | |
| KEMs | ML-KEM-512/768/1024 | FIPS 203 |
| HQC-128/192/256 | HQC round 4 | |
| Hashes | SHA-224 ... SHA-512/256, SHA3-224 ... SHA3-512, SHAKE128/256, HMAC | FIPS 180-4, FIPS 202 |
pip install noqtis # or: uv add noqtis
Signatures
from noqtis import sign
pk, sk = sign.keygen("ML-DSA-65")
sig = sign.sign("ML-DSA-65", sk, b"message", ctx=b"app-v1")
assert sign.verify("ML-DSA-65", pk, b"message", sig, ctx=b"app-v1")
keygen(alg, seed=None)returns(pk, sk); a seed gives the standard's deterministic key pair.sign(alg, sk, msg, ctx=b"", deterministic=False, prehash=None):prehash="SHA-512"(or any name fromnoqtis.hashes()) selects HashML-DSA / HashSLH-DSA;msgis still the message.verify(...)returnsTrueorFalse; it never raises for a bad or malformed signature.
Key encapsulation
from noqtis import kem
pk, sk = kem.keygen("ML-KEM-768")
ct, ss = kem.encap("ML-KEM-768", pk)
assert kem.decap("ML-KEM-768", sk, ct) == ss
A tampered ciphertext decapsulates to an unrelated secret rather than an error (implicit rejection, as FIPS 203 requires).
Hashes
import noqtis
noqtis.hash("SHA3-256", b"abc")
noqtis.hash("SHAKE256", b"abc", 100) # 100 bytes of output
noqtis.hmac("SHA-256", b"key", b"data")
Capsules
A capsule is a folder sealed with a manifest of every file in it
(noqtis.json) and a post-quantum signature over it (noqtis.sig).
import noqtis
pk, sk = noqtis.sign.keygen("ML-DSA-65")
noqtis.seal("results/", sk, pk, meta={"project": "survey-2026"})
report = noqtis.check("results/", pk)
print(report.ok) # True only if every check passed
for row in report.rows: # (check, ok, detail)
print(row)
Without pk, check trusts the key inside the seal and its report says
so. anchors=[der, ...] requires an RFC 3161 timestamp under one of the
given TSA certificates.
Format 2, proofs and lineage
seal(..., format=2) adds a Merkle tree over the files to the manifest
and signs its head. prove then shows some files to a reader without
the names or digests of the others:
noqtis.seal("results/", sk, pk, format=2)
proof = noqtis.prove("results/", ["tables/t1.csv"]) # bytes (JSON)
noqtis.check(proof=proof, pk=pk).ok # the proof alone
noqtis.check("results/", pk, proof=proof).ok # and the files
seal(..., inputs=["raw/", ("cleaned", "clean/")]) records the capsules
this one was made from, by id (noqtis.capid(dir), 32 bytes);
check(dir, pk, lineage=["raw/", "clean/"]) finds each input among those
folders and checks it, to 64 levels. check(dir, pk, only=["a.csv"])
checks just those files (a "partial" row says so). noqtis.files(dir)
lists what the manifest holds, File(path, size, sha256), with nothing
checked.
Key statements
st = noqtis.rotate(old_sk, old_pk, new_sk, new_pk, reason="yearly")
noqtis.check("results/", old_pk, keys=[st]).ok # sealed by the new key
rv = noqtis.revoke(old_sk, old_pk, at=1767225600)
A statement (bytes, or a file path) needs pk, the trusted key. With
it, check accepts a seal by a key the trusted key was rotated to, and
requires a verified timestamp from before a seal key was rotated away or
revoked. Ed25519 alone cannot make statements.
Identity cards
card = noqtis.idcard(sk, pk, "Ada Lovelace", orcid="0000-0002-1825-0097",
url="https://example.org/ada")
c = noqtis.idcheck(card) # a Card, or None when it does not verify
c.name, c.orcid, c.key_sha256 # compare the key with the one published
noqtis.idcheck(card, pk) # None unless the card is for pk
A card (noqtis-idcard-1, JSON) binds a signing key to its holder's name
and, when given, ORCID iD (check digit verified), e-mail address,
https:// page and affiliation, signed by the key under its own context,
so it is never a seal or a key statement. It is self-signed: it shows
the key's holder wrote it, not that the name is true. A field out of its
limits raises ArgError; input that is not a card, DecodeError.
DSSE envelopes
from noqtis import dsse
env = dsse.sign("ML-DSA-65", sk, pk, "application/vnd.in-toto+json", stmt)
dsse.verify("ML-DSA-65", pk, env) # Signed(type, payload), or None
The envelope (in-toto and SLSA's signing wrapper) is canonical JSON with
one signature over the pre-authentication encoding; its keyid is the hex
SHA-256 of pk. verify returns None when no signature verifies and
raises DecodeError for text that is not an envelope.
Key files
noqtis.keyfile reads and writes the text key files noqtis keygen
makes (noqtis-key-1 <alg> <pub|sec>, then base64), as strictly as the
command-line tool reads them:
from noqtis import keyfile
k = keyfile.read("me", "sec") # Key(alg, kind, key); "me.pub" for pub
noqtis.sign.sign(k.alg, k.key, b"a message")
pk, sk = noqtis.sign.keygen("ML-DSA-65")
keyfile.write("you", "ML-DSA-65", "sec", sk) # owner-only, no overwrite
keyfile.write("you.pub", "ML-DSA-65", "pub", pk)
text = keyfile.encode("ML-DSA-65", "pub", pk) # the same text, as a str
assert keyfile.decode(text).key == pk
write never replaces a file unless force=True. Python's base64 is not
constant time: decode secret key files where timing is not observable.
Errors
Every failure raises a subclass of noqtis.NoqtisError, one per library
error code: ArgError, BufError, VerifyError, DecodeError,
RandError, MemError, FileError, UnsupportedError, LimitError,
StateError. Each has .code, the library's NQE* value.
Notes
- Inputs may be
bytes,bytearrayormemoryview; outputs arebytes. Python cannot wipebytes, so secret keys and shared secrets you hold in Python live until the garbage collector frees them. - Long operations release the GIL, so threads sign and verify in parallel.
- The package is typed (
py.typed).
Licensed under Apache-2.0 WITH LLVM-exception.
Metadata
Release files for noqtis 0.1.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| noqtis-0.1.2.tar.gz | 249.6 kB | With provenance | Details for noqtis-0.1.2.tar.gz |
Built distributions (wheels)
Total release size: 3.1 MB
Release files / noqtis-0.1.2.tar.gz
| Download URL | noqtis-0.1.2.tar.gz |
|---|---|
| Size | 249.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5b15333170308bec232f5744ef66724f0f0af2899d5312f107d94d7fc0c2ea66
|
|
BLAKE2b-256 checksum How to use checksums |
39d7374a0a03fdf91fa43148baea600ebc773c31bff708ff2778e7cd3c32b682
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 31, 2026.
Transparency logRelease files / noqtis-0.1.2-cp39-abi3-win_arm64.whl
| Download URL | noqtis-0.1.2-cp39-abi3-win_arm64.whl |
|---|---|
| Size | 215.1 kB |
| Tags | CPython 3.9 Windows ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
957b3b53bf204539fa0b39fa2854b35b0391500f955528bdd859ffe14d863887
|
|
BLAKE2b-256 checksum How to use checksums |
0d83097e7be5eb83cae0152bbf8bfeacaf0d1228ebe48085dc9e9829a46ade46
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 31, 2026.
Transparency logRelease files / noqtis-0.1.2-cp39-abi3-win_amd64.whl
| Download URL | noqtis-0.1.2-cp39-abi3-win_amd64.whl |
|---|---|
| Size | 237.8 kB |
| Tags | CPython 3.9 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
f59b855fc29d017f6ec79c63384e4027487aeeaf937d916394f83ee5f958a9ea
|
|
BLAKE2b-256 checksum How to use checksums |
60779fd1aedfb5fb173ed5a6133ddd820f369bce197d493325755f57f15de757
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 31, 2026.
Transparency logRelease files / noqtis-0.1.2-cp39-abi3-musllinux_1_2_x86_64.whl
| Download URL | noqtis-0.1.2-cp39-abi3-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 239.5 kB |
| Tags | CPython 3.9 Linux musl 1.2+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
17d925f2937edb66884a33c4c055484d1d65c36491a24f69788c600f70171041
|
|
BLAKE2b-256 checksum How to use checksums |
68ed86d2b6af75d0b6976a401ddc179b2c78c14b40a9236c20c9db4481c98a7d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 31, 2026.
Transparency logRelease files / noqtis-0.1.2-cp39-abi3-musllinux_1_2_aarch64.whl
| Download URL | noqtis-0.1.2-cp39-abi3-musllinux_1_2_aarch64.whl |
|---|---|
| Size | 243.3 kB |
| Tags | CPython 3.9 Linux musl 1.2+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
9d1b2329c0a6fddd9cdc1a68ffae767d75984d30db70f71ae8760b85597b3621
|
|
BLAKE2b-256 checksum How to use checksums |
01d6681f7e9b86886f8dfd7a03d5db78d3440b77c31c998471a7bc225df89f49
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 31, 2026.
Transparency logRelease files / noqtis-0.1.2-cp39-abi3-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl
| Download URL | noqtis-0.1.2-cp39-abi3-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl |
|---|---|
| Size | 228.6 kB |
| Tags | CPython 3.9 Linux glibc 2.34+ RISC-V 64 Linux glibc 2.39+ RISC-V 64 abi3 |
|
SHA-256 checksum How to use checksums |
c9ca7c792ed086e2d8a63dd1c9e71460d95746ba42700abd2f71f13f6be9266a
|
|
BLAKE2b-256 checksum How to use checksums |
bec81761fe7a00a0cb748befed8f9a9d030a8889d8113b1a287c00f23c839b0e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 31, 2026.
Transparency logRelease files / noqtis-0.1.2-cp39-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl
| Download URL | noqtis-0.1.2-cp39-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 235.6 kB |
| Tags | CPython 3.9 Linux glibc 2.26+ x86-64 Linux glibc 2.28+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
cfdace999f09cb6e592e322f377318aba5411374338a2e872bb4ca994f1e7b1a
|
|
BLAKE2b-256 checksum How to use checksums |
57089fcb907c25d5c80feeafe97013c3fae1a6796a7d82a281f362409fa43d51
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 31, 2026.
Transparency logRelease files / noqtis-0.1.2-cp39-abi3-manylinux_2_26_s390x.manylinux_2_28_s390x.whl
| Download URL | noqtis-0.1.2-cp39-abi3-manylinux_2_26_s390x.manylinux_2_28_s390x.whl |
|---|---|
| Size | 465.7 kB |
| Tags | CPython 3.9 Linux glibc 2.26+ IBM System/390x Linux glibc 2.28+ IBM System/390x abi3 |
|
SHA-256 checksum How to use checksums |
99f8b9b67fd61906b62667993eadc3cd1b904792f9bd5f256f4f480b268de229
|
|
BLAKE2b-256 checksum How to use checksums |
28490ba01364b271679674ed56a89fdfe1382eec92dc732e2e18cb773d35a654
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 31, 2026.
Transparency logRelease files / noqtis-0.1.2-cp39-abi3-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl
| Download URL | noqtis-0.1.2-cp39-abi3-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl |
|---|---|
| Size | 314.1 kB |
| Tags | CPython 3.9 Linux glibc 2.26+ PowerPC 64-le Linux glibc 2.28+ PowerPC 64-le abi3 |
|
SHA-256 checksum How to use checksums |
1f5583a3887c536e035920ffcc9f79173877cea805c19da1a6b3330a4cec3235
|
|
BLAKE2b-256 checksum How to use checksums |
2ffe25d998b3d99f130925eafd8287afe66083d2a16a48fc1fa325e639f5fff2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 31, 2026.
Transparency logRelease files / noqtis-0.1.2-cp39-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
| Download URL | noqtis-0.1.2-cp39-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 235.6 kB |
| Tags | CPython 3.9 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
f7f19d01264895e6b4583b022deb0776b28f995a6af10d08043866c1041b4290
|
|
BLAKE2b-256 checksum How to use checksums |
cec6a7ea01fa72b681449ab6f54ecb89960fc063275a61b089148b66a2a0bee2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 31, 2026.
Transparency logRelease files / noqtis-0.1.2-cp39-abi3-macosx_11_0_x86_64.whl
| Download URL | noqtis-0.1.2-cp39-abi3-macosx_11_0_x86_64.whl |
|---|---|
| Size | 227.5 kB |
| Tags | CPython 3.9 abi3 macOS 11.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
e4f3fb9e9791651924bb93a300e58ea25b97ea90fdba69d925a26b6a367d40e9
|
|
BLAKE2b-256 checksum How to use checksums |
00447f5ee74d8fb37cd77555648b6db961697aa3d0bf6f589a1588c3fc0d7db7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 31, 2026.
Transparency logRelease files / noqtis-0.1.2-cp39-abi3-macosx_11_0_arm64.whl
| Download URL | noqtis-0.1.2-cp39-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 223.7 kB |
| Tags | CPython 3.9 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
a449414fed8a7b4623854a3229b020455b8cfc8cbe2945056d56a8b4322627d1
|
|
BLAKE2b-256 checksum How to use checksums |
577dda04fce4f5645c1d046d77f6077fa4b5600c091d624fe25be77004c55d08
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 31, 2026.
Transparency logSecurity for noqtis 0.1.2
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 12 files in this release have been uploaded with provenance metadata.
Attestation for noqtis-0.1.2.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 31, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.