A X.509 v3 ([RFC5280]) parser, implemented with the nom parser combinator framework.
It is written in pure Rust, fast, and makes extensive use of zero-copy. A lot of care is taken to ensure security and safety of this crate, including design (recursion limit, defensive programming), tests, and fuzzing. It also aims to be panic-free.
The code is available on Github and is part of the Rusticata project.
The main parsing method is parse_x509_der
, which takes a
DER-encoded certificate as input, and builds a
X509Certificate
object.
For PEM-encoded certificates, use the pem
module.
Parsing a certificate in DER format:
```rust use x509parser::parsex509_der;
static IGCADER: &'static [u8] = includebytes!("../assets/IGC_A.der");
let res = parsex509der(IGCADER); match res { Ok((rem, cert)) => { assert!(rem.isempty()); // asserteq!(cert.tbscertificate.version, 2); }, _ => panic!("x509 parsing failed: {:?}", res), } ```
See also examples/print-cert.rs
.
verify
feature adds support for (cryptographic) signature verification, based on ring.
It adds the verify_signature
to X509Certificate
.rust
/// Cryptographic signature verification: returns true if certificate was signed by issuer
pub fn check_signature(cert: &X509Certificate<'_>, issuer: &X509Certificate<'_>) -> bool {
let issuer_public_key = &issuer.tbs_certificate.subject_pki;
cert
.verify_signature(Some(issuer_public_key))
.is_ok()
}
There is a build error in arrayvec
with rust 1.34: error[E0658]: use of unstable library feature 'maybe_uninit'
To fix it, force the version of lexical-core
down:
cargo update -p lexical-core --precise 0.6.7
der-parser
4.0nid2obj
argument is now passed by copy, not referenceverify
feature to verify cryptographic signature by a public keyThanks: @jannschu
Pem::read
time_to_expiration
to Validity
objectPem
object from BufRead + Seek
Pem
to decode and extract certificateparse_subject_public_key_info
publicsn2oid
(get an OID by short name)Licensed under either of
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.