#![no_std] #![cfg_attr(docsrs, feature(doc_auto_cfg))] #![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" )] #![doc = include_str!("../README.md")] #![warn( clippy::integer_arithmetic, clippy::mod_module_files, clippy::panic, clippy::panic_in_result_fn, clippy::unwrap_used, missing_docs, rust_2018_idioms, unsafe_code, unused_lifetimes, unused_qualifications )] //! # Usage //! //! ## Allocating (enable `alloc` crate feature) //! //! ``` //! # #[cfg(feature = "alloc")] //! # { //! use base64ct::{Base64, Encoding}; //! //! let bytes = b"example bytestring!"; //! let encoded = Base64::encode_string(bytes); //! assert_eq!(encoded, "ZXhhbXBsZSBieXRlc3RyaW5nIQ=="); //! //! let decoded = Base64::decode_vec(&encoded).unwrap(); //! assert_eq!(decoded, bytes); //! # } //! ``` //! //! ## Heapless `no_std` usage //! //! ``` //! use base64ct::{Base64, Encoding}; //! //! const BUF_SIZE: usize = 128; //! //! let bytes = b"example bytestring!"; //! assert!(Base64::encoded_len(bytes) <= BUF_SIZE); //! //! let mut enc_buf = [0u8; BUF_SIZE]; //! let encoded = Base64::encode(bytes, &mut enc_buf).unwrap(); //! assert_eq!(encoded, "ZXhhbXBsZSBieXRlc3RyaW5nIQ=="); //! //! let mut dec_buf = [0u8; BUF_SIZE]; //! let decoded = Base64::decode(encoded, &mut dec_buf).unwrap(); //! assert_eq!(decoded, bytes); //! ``` //! //! # Implementation //! //! Implemented using integer arithmetic alone without any lookup tables or //! data-dependent branches, thereby providing portable "best effort" //! constant-time operation. //! //! Not constant-time with respect to message length (only data). //! //! Adapted from the following constant-time C++ implementation of Base64: //! //! //! //! Copyright (c) 2014 Steve "Sc00bz" Thomas (steve at tobtu dot com). //! Derived code is dual licensed MIT + Apache 2 (with permission from Sc00bz). #[cfg(feature = "alloc")] #[macro_use] extern crate alloc; #[cfg(feature = "std")] extern crate std; mod alphabet; mod decoder; mod encoder; mod encoding; mod errors; mod line_ending; #[cfg(test)] mod test_vectors; pub use crate::{ alphabet::{ bcrypt::Base64Bcrypt, crypt::Base64Crypt, shacrypt::Base64ShaCrypt, standard::{Base64, Base64Unpadded}, url::{Base64Url, Base64UrlUnpadded}, }, decoder::Decoder, encoder::Encoder, encoding::Encoding, errors::{Error, InvalidEncodingError, InvalidLengthError}, line_ending::LineEnding, }; /// Minimum supported line width. const MIN_LINE_WIDTH: usize = 4;