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§
Required Methods§
Provided Methods§
Sourcefn chain<V2>(self, v2: V2) -> ChainValidator<'a, Self, V2, Self::Item>
fn chain<V2>(self, v2: V2) -> ChainValidator<'a, Self, V2, 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.