Trait Validator

Source
pub trait Validator<'a> {
    type Item;

    // Required method
    fn validate<L: Logger>(&self, item: &'a Self::Item, l: &mut L) -> bool;

    // Provided method
    fn chain<V2>(self, v2: V2) -> ChainValidator<'a, Self, V2, Self::Item>
       where Self: Sized,
             V2: Validator<'a, Item = Self::Item> { ... }
}
Available on crate feature validate only.
Expand description

Trait for build item validators (for ex. validate X.509 structure)

See X509StructureValidator for a default implementation, validating the DER structure of a X.509 Certificate.

See implementors of the Logger trait for methods to collect or handle warnings and errors.

§Examples

Collecting warnings and errors to Vec:

use x509_parser::certificate::X509Certificate;
use x509_parser::validate::*;

#[cfg(feature = "validate")]
fn validate_certificate(x509: &X509Certificate<'_>) -> Result<(), &'static str> {
    let mut logger = VecLogger::default();
    println!("  Subject: {}", x509.subject());
    // validate and print warnings and errors to stderr
    let ok = X509StructureValidator.validate(&x509, &mut logger);
    print!("Structure validation status: ");
    if ok {
        println!("Ok");
    } else {
        println!("FAIL");
    }
    for warning in logger.warnings() {
        eprintln!("  [W] {}", warning);
    }
    for error in logger.errors() {
        eprintln!("  [E] {}", error);
    }
    println!();
    if !logger.errors().is_empty() {
        return Err("validation failed");
    }
    Ok(())
}

Required Associated Types§

Source

type Item

The item to validate

Required Methods§

Source

fn validate<L: Logger>(&self, item: &'a Self::Item, l: &mut L) -> bool

Attempts to validate current item.

Returns true if item was validated.

Call l.warn() if a non-fatal error was encountered, and l.err() if the error is fatal. These functions receive a description of the error.

Provided Methods§

Source

fn chain<V2>(self, v2: V2) -> ChainValidator<'a, Self, V2, Self::Item>
where Self: Sized, V2: Validator<'a, Item = Self::Item>,

Examples found in repository?
examples/print-cert.rs (line 188)
155fn print_x509_info(x509: &X509Certificate) -> io::Result<()> {
156    let version = x509.version();
157    if version.0 < 3 {
158        println!("  Version: {}", version);
159    } else {
160        println!("  Version: INVALID({})", version.0);
161    }
162    println!("  Serial: {}", x509.tbs_certificate.raw_serial_as_string());
163    println!("  Subject: {}", x509.subject());
164    println!("  Issuer: {}", x509.issuer());
165    println!("  Validity:");
166    println!("    NotBefore: {}", x509.validity().not_before);
167    println!("    NotAfter:  {}", x509.validity().not_after);
168    println!("    is_valid:  {}", x509.validity().is_valid());
169    println!("  Subject Public Key Info:");
170    print_x509_ski(x509.public_key());
171    print_x509_signature_algorithm(&x509.signature_algorithm, 4);
172
173    println!("  Signature Value:");
174    for l in format_number_to_hex_with_colon(&x509.signature_value.data, 16) {
175        println!("      {}", l);
176    }
177    println!("  Extensions:");
178    for ext in x509.extensions() {
179        print_x509_extension(&ext.oid, ext);
180    }
181    println!();
182    print!("Structure validation status: ");
183    #[cfg(feature = "validate")]
184    {
185        let mut logger = VecLogger::default();
186        // structure validation status
187        let ok = X509StructureValidator
188            .chain(X509CertificateValidator)
189            .validate(x509, &mut logger);
190        if ok {
191            println!("Ok");
192        } else {
193            println!("FAIL");
194        }
195        for warning in logger.warnings() {
196            println!("  [W] {}", warning);
197        }
198        for error in logger.errors() {
199            println!("  [E] {}", error);
200        }
201        println!();
202        if VALIDATE_ERRORS_FATAL && !logger.errors().is_empty() {
203            return Err(io::Error::new(io::ErrorKind::Other, "validation failed"));
204        }
205    }
206    #[cfg(not(feature = "validate"))]
207    {
208        println!("Unknown (feature 'validate' not enabled)");
209    }
210    #[cfg(feature = "verify")]
211    {
212        print!("Signature verification: ");
213        if x509.subject() == x509.issuer() {
214            if x509.verify_signature(None).is_ok() {
215                println!("OK");
216                println!("  [I] certificate is self-signed");
217            } else if x509.subject() == x509.issuer() {
218                println!("FAIL");
219                println!("  [W] certificate looks self-signed, but signature verification failed");
220            }
221        } else {
222            // if subject is different from issuer, we cannot verify certificate without the public key of the issuer
223            println!("N/A");
224        }
225    }
226    Ok(())
227}

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementors§