#![no_std] #![cfg_attr(docsrs, feature(doc_auto_cfg))] #![doc = include_str!("../README.md")] #![doc( html_logo_url = "https://raw.githubusercontent.com/RustCrypto/media/6ee8e381/logo.svg", html_favicon_url = "https://raw.githubusercontent.com/RustCrypto/media/6ee8e381/logo.svg" )] #![forbid(unsafe_code)] #![warn( clippy::mod_module_files, clippy::unwrap_used, missing_docs, rust_2018_idioms, unused_lifetimes, unused_qualifications )] //! ## About this crate //! This library provides generalized PKCS#8 support designed to work with a //! number of different algorithms. It supports `no_std` platforms including //! ones without a heap (albeit with reduced functionality). //! //! It supports decoding/encoding the following types: //! //! - [`EncryptedPrivateKeyInfo`]: (with `pkcs5` feature) encrypted key. //! - [`PrivateKeyInfo`]: algorithm identifier and data representing a private key. //! Optionally also includes public key data for asymmetric keys. //! - [`SubjectPublicKeyInfo`]: algorithm identifier and data representing a public key //! (re-exported from the [`spki`] crate) //! //! When the `pem` feature is enabled, it also supports decoding/encoding //! documents from "PEM encoding" format as defined in RFC 7468. //! //! ## Encrypted Private Key Support //! [`EncryptedPrivateKeyInfo`] supports decoding/encoding encrypted PKCS#8 //! private keys and is gated under the `pkcs5` feature. //! //! When the `encryption` feature of this crate is enabled, it provides //! [`EncryptedPrivateKeyInfo::decrypt`] and [`PrivateKeyInfo::encrypt`] //! functions which are able to decrypt/encrypt keys using the following //! algorithms: //! //! - [PKCS#5v2 Password Based Encryption Scheme 2 (RFC 8018)] //! - Key derivation functions: //! - [scrypt] ([RFC 7914]) //! - PBKDF2 ([RFC 8018](https://datatracker.ietf.org/doc/html/rfc8018#section-5.2)) //! - SHA-2 based PRF with HMAC-SHA224, HMAC-SHA256, HMAC-SHA384, or HMAC-SHA512 //! - SHA-1 based PRF with HMAC-SHA1, when the `sha1` feature of this crate is enabled. //! - Symmetric encryption: AES-128-CBC, AES-192-CBC, or AES-256-CBC //! (best available options for PKCS#5v2) //! //! ## Legacy DES-CBC and DES-EDE3-CBC (3DES) support (optional) //! When the `des-insecure` and/or `3des` features are enabled this crate provides support for //! private keys encrypted with with DES-CBC and DES-EDE3-CBC (3DES or Triple DES) symmetric //! encryption, respectively. //! //! ⚠️ WARNING ⚠️ //! //! DES support (gated behind the `des-insecure` feature) is implemented to //! allow for decryption of legacy PKCS#8 files only. //! //! Such PKCS#8 documents should be considered *INSECURE* due to the short //! 56-bit key size of DES. //! //! New keys should use AES instead. //! //! [RFC 5208]: https://tools.ietf.org/html/rfc5208 //! [RFC 5958]: https://tools.ietf.org/html/rfc5958 //! [RFC 7914]: https://datatracker.ietf.org/doc/html/rfc7914 //! [PKCS#5v2 Password Based Encryption Scheme 2 (RFC 8018)]: https://tools.ietf.org/html/rfc8018#section-6.2 //! [scrypt]: https://en.wikipedia.org/wiki/Scrypt #[cfg(feature = "pem")] extern crate alloc; #[cfg(feature = "std")] extern crate std; mod error; mod private_key_info; mod traits; mod version; #[cfg(feature = "pkcs5")] pub(crate) mod encrypted_private_key_info; pub use crate::{ error::{Error, Result}, private_key_info::PrivateKeyInfo, traits::DecodePrivateKey, version::Version, }; pub use der::{self, asn1::ObjectIdentifier, oid::AssociatedOid}; pub use spki::{ self, AlgorithmIdentifierRef, DecodePublicKey, SubjectPublicKeyInfo, SubjectPublicKeyInfoRef, }; #[cfg(feature = "alloc")] pub use { crate::traits::EncodePrivateKey, der::{Document, SecretDocument}, spki::EncodePublicKey, }; #[cfg(feature = "pem")] pub use der::pem::LineEnding; #[cfg(feature = "pkcs5")] pub use {encrypted_private_key_info::EncryptedPrivateKeyInfo, pkcs5}; #[cfg(feature = "rand_core")] pub use rand_core;