# Synta
**Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)*
- [Installation](#installation)
- [Quick Start](#quick-start)
- [Features](#features)
- [Core ASN.1 codec](#core-asn1-codec)
- [Code generation ([synta-codegen](synta-codegen/README.md))](#code-generation-synta-codegen)
- [X.509 PKI ([synta-certificate](synta-certificate/README.md#features))](#x509-pki-synta-certificate)
- [CBOR codec ([synta-cbor](synta-cbor/))](#cbor-codec-synta-cbor)
- [Protocol schemas](#protocol-schemas)
- [X.509 path validation ([synta-x509-verification](synta-x509-verification/README.md))](#x509-path-validation-synta-x509-verification)
- [Language bindings](#language-bindings)
- [Documentation](#documentation)
- [Testing](#testing)
- [Performance](#performance)
- [License](#license)
High-performance Rust library for ASN.1 parsing, encoding, and decoding.
**~0.48 µs** per X.509 certificate parse-only — 3.1× faster than the next-best
pure-Rust implementation, 18× faster than NSS. See [docs/performance.md](docs/performance.md).
## Installation
```toml
[dependencies]
synta = "0.1"
# With serde Serialize/Deserialize support
synta = { version = "0.1", features = ["serde"] }
# no_std with alloc
synta = { version = "0.1", default-features = false, features = ["alloc"] }
```
## Quick Start
Decode and encode a primitive type:
```rust
use synta::{Decoder, Encoder, Encoding, Integer};
let data = &[0x02, 0x01, 0x2A]; // DER INTEGER 42
let mut decoder = Decoder::new(data, Encoding::Der);
let value: Integer = decoder.decode().unwrap();
assert_eq!(value.as_i64().unwrap(), 42);
let mut encoder = Encoder::new(Encoding::Der);
encoder.encode(&value).unwrap();
assert_eq!(encoder.finish().unwrap(), data);
```
Typed parsing with derive macros — the recommended approach for production use:
```rust,ignore
use synta::{Decoder, Encoding, Integer, ObjectIdentifier};
use synta_derive::Asn1Sequence;
#[derive(Asn1Sequence)]
struct AlgorithmIdentifier {
pub algorithm: ObjectIdentifier,
#[asn1(optional)]
pub parameters: Option<Integer>,
}
let mut decoder = Decoder::new(der_bytes, Encoding::Der);
let alg: AlgorithmIdentifier = decoder.decode()?;
```
Typed decoding generates compile-time-specialised, inlined decode paths and is
3.3× faster than equivalent generic `Element` traversal.
See [docs/tutorial.md](docs/tutorial.md) for a step-by-step introduction and
[docs/usage.md](docs/usage.md) for the full API guide.
## Features
### Core ASN.1 codec
- **Typed parsing** — `Asn1Sequence`, `Asn1Choice`, `Asn1Set` derive macros generate compile-time-specialised decoders; 3.3× faster than generic `Element` traversal
- **Zero-copy** — `RawDer<'a>`, `OctetStringRef<'a>`, `BitStringRef<'a>` borrow from the input buffer with no allocation for large fields
- **Encoding rules** — DER, BER, and CER all supported
- **no_std** — core functionality works in embedded environments with the `alloc` feature; see [docs/no_std.md](docs/no_std.md)
- **Serde** — optional `Serialize`/`Deserialize` via `features = ["serde"]`
### Code generation ([synta-codegen](synta-codegen/README.md))
- Compiles ASN.1 schema files to ready-to-use Rust or C structs
- Supports ASN.1 Information Object Class parsing, configurable derive-macro gating (`DeriveMode`), and `RawDer` output for `ANY` fields
### X.509 PKI ([synta-certificate](synta-certificate/README.md#features))
- **Parsing** — X.509 v3 certificates, CRLs (RFC 5280), CSRs (RFC 2986), OCSP responses (RFC 6960)
- **Builders** — `CertificateBuilder`, `CsrBuilder`, `Pkcs12Builder`, `CertificateListBuilder`, `OCSPResponseBuilder`, `AttributeCertificateBuilder`, `CertReqMsgBuilder`, `CMPMessageBuilder` with pluggable signer and encryptor traits; `OpensslCertificateSigner` and `OpensslPkcs12Encryptor` backends
- **Bundle formats** — PKCS#7 SignedData certificate extraction; PKCS#12 certificate/private-key extraction and creation
- **CMS full suite** — `SignedData`, `EnvelopedData` (one-call `create_enveloped_data` or two-step `prepare_enveloped_data` + builder for originator info), `EncryptedData` (AES-CBC encrypt/decrypt), `DigestedData`, KEM recipient info; requires `openssl` feature for crypto
- **Post-quantum** — standalone ML-DSA-44/65/87 (FIPS 204) and 18 composite ML-DSA algorithms (draft-ietf-lamps-pq-composite-sigs-19, OID sub-arcs 37–54) combining ML-DSA with RSA/ECDSA/EdDSA; `PrivateKeyBuilder::composite_ml_dsa(sub_arc)` for backend-agnostic key generation; requires `openssl` + `pqc` (OpenSSL 3.3+) or `nss` feature
- **Schema types** — RFC 3279 algorithm parameters, Attribute Certificates (RFC 5755), CRMF (RFC 4211), CMP v3 (RFC 9810)
- **Helpers** — DN formatting and attribute parsing, SAN parsing, zero-alloc algorithm identification, PEM encode/decode
### CBOR codec ([synta-cbor](synta-cbor/))
- `CborEncode` / `CborDecode` traits — CBOR-specific codec API, separate from the DER/BER `Encode`/`Decode` traits
- `CborEncoder` / `CborDecoder` — streaming wrappers over `ciborium_ll` for writing and reading CBOR headers and bodies
- `ToCbor` / `FromCbor` — blanket convenience traits (like `ToDer` / `FromDer`) that serialise to / from `Vec<u8>`
- Full type coverage: all ASN.1 primitives, string types, time types, constructed types, `ObjectIdentifier` (RFC 9090 tag 111), tagged types
- Optional `certificate` feature: `unwrap_cms_cbor` CMS helper requires `synta-certificate`
### Protocol schemas
- **Kerberos V5** — RFC 4120/4121/4178/6113 types; typed flag wrappers for `KDCOptions`, `TicketFlags`, `APOptions`; principal, time, address, and GSS token helpers ([synta-krb5](synta-krb5/README.md#features))
- **Merkle Tree Certificates** — draft-ietf-plants-merkle-tree-certs issuance log builder, inclusion proof generation and verification, trust anchor management with cosignature support ([synta-mtc](synta-mtc/README.md))
### X.509 path validation ([synta-x509-verification](synta-x509-verification/README.md))
- RFC 5280 §6 + CABF Baseline Requirements chain verification
- Crypto-agnostic via `SignatureVerifier` plug-in trait; OpenSSL backend available
- Name constraint enforcement (DNS, IP, RFC 822 email)
- Configurable extension policy and trust store
- OCSP revocation checking via `OcspStore`
- Python bindings in `synta.x509` (`TrustStore`, `VerificationPolicy`, `verify_server_certificate`, `verify_client_certificate`)
### Language bindings
**C/C++ FFI** ([synta-ffi](synta-ffi/README.md#cargo-features)) — 100+ exported functions covering:
- ASN.1 primitives, string types, time types, constructed types, OIDs
- X.509 certificates, CRLs (RFC 5280), PKCS#10 CSRs, OCSP responses (RFC 6960)
- PEM encode/decode; PKCS#7 and PKCS#12 certificate extraction
- Full CMS: `ContentInfo`, `SignedData`, `EnvelopedData`, `EncryptedData` (AES-CBC, `openssl` feature), `DigestedData`
- Header auto-generated at `include/synta.h` by cbindgen
**Python** ([synta-python](synta-python/README.md#cargo-features)) — PyO3-based, Python 3.8+ stable ABI:
- `Certificate`, `CertificationRequest`, `CertificateList`, `OCSPResponse`, `PublicKey`, `PrivateKey` (with ML-DSA/ML-KEM key generation, sign, verify, KEM encapsulate/decapsulate; composite ML-DSA OIDs recognized for parsing/verification)
- Builders: `CertificateBuilder`, `CsrBuilder`, `CertificateListBuilder`, `OCSPResponseBuilder`, `AttributeCertificateBuilder`, `CertReqMsgBuilder`/`CertReqMessagesBuilder`, `CMPMessageBuilder`; PKCS#12: `load_pkcs12_*`, `create_pkcs12`
- `synta.cms` — full CMS suite: `ContentInfo`, `SignedData`, `EnvelopedData`, `EnvelopedDataBuilder`, `EncryptedData`, `DigestedData`, KEM recipient info
- `synta.kem` — KEM recipient info types (`KEMRecipientInfo`, `CMSORIforKEMOtherInfo`) and ML-KEM OID constants (RFC 9629)
- `synta.pkcs8` — PKCS #8 / RFC 5958 private key parsing (`OneAsymmetricKey` / `PrivateKeyInfo`)
- `synta.pkcs9` — PKCS #9 attribute OID constants (13 OIDs from RFC 2985 / RFC 5652)
- `synta.x509` — RFC 5280 / CABF chain verification; `synta.krb5` — Kerberos V5 / PKINIT types
- `synta.oids` — well-known OID constants and algorithm identification helpers
## Documentation
| Tutorial (step-by-step) | [docs/tutorial.md](docs/tutorial.md) |
| Usage guide — typing, sequences, serde, config | [docs/usage.md](docs/usage.md) |
| Codegen CLI and library API reference | [docs/api-reference.md](docs/api-reference.md) |
| Rust code generation from ASN.1 schemas | [docs/rust-generation.md](docs/rust-generation.md), [synta-codegen/README.md](synta-codegen/README.md) |
| C code generation from ASN.1 schemas | [docs/c-generation.md](docs/c-generation.md) |
| Supported ASN.1 syntax | [docs/asn1-support.md](docs/asn1-support.md) |
| C/C++ FFI reference | [docs/C_API.md](docs/C_API.md), [docs/C_MEMORY.md](docs/C_MEMORY.md) |
| Python bindings documentation | [docs/python/src/introduction.md](docs/python/src/introduction.md) |
| Kerberos V5 types | [synta-krb5/README.md](synta-krb5/README.md) |
| X.509 path validation | [synta-x509-verification/README.md](synta-x509-verification/README.md) |
| Performance benchmarks | [docs/performance.md](docs/performance.md) |
| Best practices | [docs/best-practices.md](docs/best-practices.md) |
| no_std environments | [docs/no_std.md](docs/no_std.md) |
| Migration from OpenSSL | [docs/MIGRATION_OPENSSL.md](docs/MIGRATION_OPENSSL.md) |
| Migration from libtasn1 | [docs/MIGRATION_LIBTASN1.md](docs/MIGRATION_LIBTASN1.md) |
| Contributing | [docs/contribution.md](docs/contribution.md) |
| CI reference | [contrib/ci/README.md](contrib/ci/README.md) |
## Testing
```bash
cargo test # core library
cargo test --workspace --all-features # full workspace
# Full CI pipeline: fmt, clippy, doc, C tests, Python tests, benchmarks
./contrib/ci/local-ci.sh all
./contrib/ci/local-ci.sh clippy # individual job
./contrib/ci/local-ci.sh --valgrind c-test test
```
See [contrib/ci/README.md](contrib/ci/README.md) for all available jobs and flags.
## Performance
X.509 certificate parsing (traditional RSA/ECDSA, avg of 5 certs):
| **synta** | **0.48 µs** | **1.38 µs** |
| cryptography-x509 | 1.51 µs | 1.51 µs |
| x509-parser | 2.13 µs | 2.11 µs |
| x509-cert | 3.33 µs | 3.36 µs |
| NSS | 8.46 µs | 8.50 µs |
Parse time is **size-independent**: 7 KB post-quantum ML-DSA certificates parse as fast
as 900 B traditional ones. Full data including post-quantum, CA store throughput, and
methodology: [docs/performance.md](docs/performance.md).
## License
Apache-2.0 or MIT, at your option.
See [LICENSE-APACHE](LICENSE-APACHE) and [LICENSE-MIT](LICENSE-MIT).