| 1 | // Copyright 2015 Brian Smith. |
| 2 | // |
| 3 | // Permission to use, copy, modify, and/or distribute this software for any |
| 4 | // purpose with or without fee is hereby granted, provided that the above |
| 5 | // copyright notice and this permission notice appear in all copies. |
| 6 | // |
| 7 | // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES |
| 8 | // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
| 9 | // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR |
| 10 | // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
| 11 | // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
| 12 | // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
| 13 | // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
| 14 | |
| 15 | //! webpki: Web PKI X.509 Certificate Validation. |
| 16 | //! |
| 17 | //! See `EndEntityCert`'s documentation for a description of the certificate |
| 18 | //! processing steps necessary for a TLS connection. |
| 19 | //! |
| 20 | //! # Features |
| 21 | //! |
| 22 | //! | Feature | Description | |
| 23 | //! | ------- | ----------- | |
| 24 | //! | `alloc` | Enable features that require use of the heap. Currently all RSA signature algorithms require this feature. | |
| 25 | //! | `std` | Enable features that require libstd. Implies `alloc`. | |
| 26 | //! | `ring` | Enable use of the *ring* crate for cryptography. | |
| 27 | //! | `aws-lc-rs` | Enable use of the aws-lc-rs crate for cryptography. Previously this feature was named `aws_lc_rs`. | |
| 28 | |
| 29 | #![no_std ] |
| 30 | #![warn (elided_lifetimes_in_paths, unreachable_pub, clippy::use_self)] |
| 31 | #![deny (missing_docs, clippy::as_conversions)] |
| 32 | #![allow ( |
| 33 | clippy::len_without_is_empty, |
| 34 | clippy::manual_let_else, |
| 35 | clippy::new_without_default, |
| 36 | clippy::single_match, |
| 37 | clippy::single_match_else, |
| 38 | clippy::type_complexity, |
| 39 | clippy::upper_case_acronyms |
| 40 | )] |
| 41 | // Enable documentation for all features on docs.rs |
| 42 | #![cfg_attr (docsrs, feature(doc_cfg, doc_auto_cfg))] |
| 43 | |
| 44 | #[cfg (any(feature = "std" , test))] |
| 45 | extern crate std; |
| 46 | |
| 47 | #[cfg (any(test, feature = "alloc" ))] |
| 48 | #[cfg_attr (test, macro_use)] |
| 49 | extern crate alloc; |
| 50 | |
| 51 | #[macro_use ] |
| 52 | mod der; |
| 53 | |
| 54 | #[cfg (feature = "aws-lc-rs" )] |
| 55 | mod aws_lc_rs_algs; |
| 56 | mod cert; |
| 57 | mod end_entity; |
| 58 | mod error; |
| 59 | #[cfg (feature = "ring" )] |
| 60 | mod ring_algs; |
| 61 | mod rpk_entity; |
| 62 | mod signed_data; |
| 63 | mod subject_name; |
| 64 | mod time; |
| 65 | mod trust_anchor; |
| 66 | |
| 67 | mod crl; |
| 68 | mod verify_cert; |
| 69 | mod x509; |
| 70 | |
| 71 | #[cfg (test)] |
| 72 | pub(crate) mod test_utils; |
| 73 | |
| 74 | pub use { |
| 75 | cert::Cert, |
| 76 | crl::{ |
| 77 | BorrowedCertRevocationList, BorrowedRevokedCert, CertRevocationList, ExpirationPolicy, |
| 78 | RevocationCheckDepth, RevocationOptions, RevocationOptionsBuilder, RevocationReason, |
| 79 | UnknownStatusPolicy, |
| 80 | }, |
| 81 | end_entity::EndEntityCert, |
| 82 | error::{DerTypeId, Error, InvalidNameContext}, |
| 83 | rpk_entity::RawPublicKeyEntity, |
| 84 | trust_anchor::anchor_from_trusted_cert, |
| 85 | verify_cert::KeyUsage, |
| 86 | verify_cert::VerifiedPath, |
| 87 | }; |
| 88 | |
| 89 | #[cfg (feature = "alloc" )] |
| 90 | pub use crl::{OwnedCertRevocationList, OwnedRevokedCert}; |
| 91 | |
| 92 | #[cfg (feature = "ring" )] |
| 93 | /// Signature verification algorithm implementations using the *ring* crypto library. |
| 94 | pub mod ring { |
| 95 | pub use super::ring_algs::{ |
| 96 | ECDSA_P256_SHA256, ECDSA_P256_SHA384, ECDSA_P384_SHA256, ECDSA_P384_SHA384, ED25519, |
| 97 | }; |
| 98 | |
| 99 | #[cfg (feature = "alloc" )] |
| 100 | pub use super::ring_algs::{ |
| 101 | RSA_PKCS1_2048_8192_SHA256, RSA_PKCS1_2048_8192_SHA384, RSA_PKCS1_2048_8192_SHA512, |
| 102 | RSA_PKCS1_3072_8192_SHA384, RSA_PSS_2048_8192_SHA256_LEGACY_KEY, |
| 103 | RSA_PSS_2048_8192_SHA384_LEGACY_KEY, RSA_PSS_2048_8192_SHA512_LEGACY_KEY, |
| 104 | }; |
| 105 | } |
| 106 | |
| 107 | #[cfg (feature = "aws-lc-rs" )] |
| 108 | /// Signature verification algorithm implementations using the aws-lc-rs crypto library. |
| 109 | pub mod aws_lc_rs { |
| 110 | pub use super::aws_lc_rs_algs::{ |
| 111 | ECDSA_P256_SHA256, ECDSA_P256_SHA384, ECDSA_P384_SHA256, ECDSA_P384_SHA384, |
| 112 | ECDSA_P521_SHA256, ECDSA_P521_SHA384, ECDSA_P521_SHA512, ED25519, |
| 113 | RSA_PKCS1_2048_8192_SHA256, RSA_PKCS1_2048_8192_SHA384, RSA_PKCS1_2048_8192_SHA512, |
| 114 | RSA_PKCS1_3072_8192_SHA384, RSA_PSS_2048_8192_SHA256_LEGACY_KEY, |
| 115 | RSA_PSS_2048_8192_SHA384_LEGACY_KEY, RSA_PSS_2048_8192_SHA512_LEGACY_KEY, |
| 116 | }; |
| 117 | } |
| 118 | |
| 119 | /// An array of all the verification algorithms exported by this crate. |
| 120 | /// |
| 121 | /// This will be empty if the crate is built without the `ring` and `aws-lc-rs` features. |
| 122 | pub static ALL_VERIFICATION_ALGS: &[&dyn pki_types::SignatureVerificationAlgorithm] = &[ |
| 123 | #[cfg (feature = "ring" )] |
| 124 | ring::ECDSA_P256_SHA256, |
| 125 | #[cfg (feature = "ring" )] |
| 126 | ring::ECDSA_P256_SHA384, |
| 127 | #[cfg (feature = "ring" )] |
| 128 | ring::ECDSA_P384_SHA256, |
| 129 | #[cfg (feature = "ring" )] |
| 130 | ring::ECDSA_P384_SHA384, |
| 131 | #[cfg (feature = "ring" )] |
| 132 | ring::ED25519, |
| 133 | #[cfg (all(feature = "ring" , feature = "alloc" ))] |
| 134 | ring::RSA_PKCS1_2048_8192_SHA256, |
| 135 | #[cfg (all(feature = "ring" , feature = "alloc" ))] |
| 136 | ring::RSA_PKCS1_2048_8192_SHA384, |
| 137 | #[cfg (all(feature = "ring" , feature = "alloc" ))] |
| 138 | ring::RSA_PKCS1_2048_8192_SHA512, |
| 139 | #[cfg (all(feature = "ring" , feature = "alloc" ))] |
| 140 | ring::RSA_PKCS1_3072_8192_SHA384, |
| 141 | #[cfg (all(feature = "ring" , feature = "alloc" ))] |
| 142 | ring::RSA_PSS_2048_8192_SHA256_LEGACY_KEY, |
| 143 | #[cfg (all(feature = "ring" , feature = "alloc" ))] |
| 144 | ring::RSA_PSS_2048_8192_SHA384_LEGACY_KEY, |
| 145 | #[cfg (all(feature = "ring" , feature = "alloc" ))] |
| 146 | ring::RSA_PSS_2048_8192_SHA512_LEGACY_KEY, |
| 147 | #[cfg (feature = "aws-lc-rs" )] |
| 148 | aws_lc_rs::ECDSA_P256_SHA256, |
| 149 | #[cfg (feature = "aws-lc-rs" )] |
| 150 | aws_lc_rs::ECDSA_P256_SHA384, |
| 151 | #[cfg (feature = "aws-lc-rs" )] |
| 152 | aws_lc_rs::ECDSA_P384_SHA256, |
| 153 | #[cfg (feature = "aws-lc-rs" )] |
| 154 | aws_lc_rs::ECDSA_P384_SHA384, |
| 155 | #[cfg (feature = "aws-lc-rs" )] |
| 156 | aws_lc_rs::ECDSA_P521_SHA256, |
| 157 | #[cfg (feature = "aws-lc-rs" )] |
| 158 | aws_lc_rs::ECDSA_P521_SHA384, |
| 159 | #[cfg (feature = "aws-lc-rs" )] |
| 160 | aws_lc_rs::ECDSA_P521_SHA512, |
| 161 | #[cfg (feature = "aws-lc-rs" )] |
| 162 | aws_lc_rs::ED25519, |
| 163 | #[cfg (feature = "aws-lc-rs" )] |
| 164 | aws_lc_rs::RSA_PKCS1_2048_8192_SHA256, |
| 165 | #[cfg (feature = "aws-lc-rs" )] |
| 166 | aws_lc_rs::RSA_PKCS1_2048_8192_SHA384, |
| 167 | #[cfg (feature = "aws-lc-rs" )] |
| 168 | aws_lc_rs::RSA_PKCS1_2048_8192_SHA512, |
| 169 | #[cfg (feature = "aws-lc-rs" )] |
| 170 | aws_lc_rs::RSA_PKCS1_3072_8192_SHA384, |
| 171 | #[cfg (feature = "aws-lc-rs" )] |
| 172 | aws_lc_rs::RSA_PSS_2048_8192_SHA256_LEGACY_KEY, |
| 173 | #[cfg (feature = "aws-lc-rs" )] |
| 174 | aws_lc_rs::RSA_PSS_2048_8192_SHA384_LEGACY_KEY, |
| 175 | #[cfg (feature = "aws-lc-rs" )] |
| 176 | aws_lc_rs::RSA_PSS_2048_8192_SHA512_LEGACY_KEY, |
| 177 | ]; |
| 178 | |
| 179 | fn public_values_eq(a: untrusted::Input<'_>, b: untrusted::Input<'_>) -> bool { |
| 180 | a.as_slice_less_safe() == b.as_slice_less_safe() |
| 181 | } |
| 182 | |