diff --git a/.github/workflows/argon2.yml b/.github/workflows/argon2.yml index 9dd054d7..dbeccda6 100644 --- a/.github/workflows/argon2.yml +++ b/.github/workflows/argon2.yml @@ -22,7 +22,7 @@ jobs: strategy: matrix: rust: - - 1.51.0 # MSRV + - 1.57.0 # MSRV - stable target: - thumbv7em-none-eabi @@ -51,7 +51,7 @@ jobs: strategy: matrix: rust: - - 1.51.0 # MSRV + - 1.57.0 # MSRV - stable steps: - uses: actions/checkout@v2 diff --git a/.github/workflows/balloon-hash.yml b/.github/workflows/balloon-hash.yml index d0fa5fb0..8f40a6f7 100644 --- a/.github/workflows/balloon-hash.yml +++ b/.github/workflows/balloon-hash.yml @@ -22,7 +22,7 @@ jobs: strategy: matrix: rust: - - 1.56.1 # MSRV + - 1.57.0 # MSRV - stable target: - thumbv7em-none-eabi @@ -50,7 +50,7 @@ jobs: strategy: matrix: rust: - - 1.56.1 # MSRV + - 1.57.0 # MSRV - stable steps: - uses: actions/checkout@v2 diff --git a/.github/workflows/bcrypt-pbkdf.yml b/.github/workflows/bcrypt-pbkdf.yml index 6fba5994..357f323c 100644 --- a/.github/workflows/bcrypt-pbkdf.yml +++ b/.github/workflows/bcrypt-pbkdf.yml @@ -22,7 +22,7 @@ jobs: strategy: matrix: rust: - - 1.56.0 # MSRV + - 1.57.0 # MSRV - stable target: - thumbv7em-none-eabi @@ -48,7 +48,7 @@ jobs: strategy: matrix: rust: - - 1.56.0 # MSRV + - 1.57.0 # MSRV - stable steps: - uses: actions/checkout@v2 diff --git a/.github/workflows/pbkdf2.yml b/.github/workflows/pbkdf2.yml index eda69d1d..8a160122 100644 --- a/.github/workflows/pbkdf2.yml +++ b/.github/workflows/pbkdf2.yml @@ -22,7 +22,7 @@ jobs: strategy: matrix: rust: - - 1.51.0 # MSRV + - 1.57.0 # MSRV - stable target: - thumbv7em-none-eabi @@ -49,7 +49,7 @@ jobs: strategy: matrix: rust: - - 1.51.0 # MSRV + - 1.57.0 # MSRV - stable steps: - uses: actions/checkout@v2 diff --git a/.github/workflows/scrypt.yml b/.github/workflows/scrypt.yml index 99df7972..7b811a71 100644 --- a/.github/workflows/scrypt.yml +++ b/.github/workflows/scrypt.yml @@ -22,7 +22,7 @@ jobs: strategy: matrix: rust: - - 1.56.0 # MSRV + - 1.57.0 # MSRV - stable target: - thumbv7em-none-eabi @@ -49,7 +49,7 @@ jobs: strategy: matrix: rust: - - 1.56.0 # MSRV + - 1.57.0 # MSRV - stable steps: - uses: actions/checkout@v2 diff --git a/.github/workflows/workspace.yml b/.github/workflows/workspace.yml index 2a728954..87073197 100644 --- a/.github/workflows/workspace.yml +++ b/.github/workflows/workspace.yml @@ -17,7 +17,7 @@ jobs: - uses: RustCrypto/actions/cargo-cache@master - uses: actions-rs/toolchain@v1 with: - toolchain: 1.56.1 # MSRV + toolchain: 1.57.0 components: clippy override: true profile: minimal diff --git a/Cargo.lock b/Cargo.lock index 14c49a52..ff78de67 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,7 +4,7 @@ version = 3 [[package]] name = "argon2" -version = "0.3.4" +version = "0.4.0-pre" dependencies = [ "base64ct", "blake2", @@ -22,7 +22,7 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "balloon-hash" -version = "0.1.1" +version = "0.2.0-pre" dependencies = [ "crypto-bigint", "digest", @@ -276,9 +276,9 @@ dependencies = [ [[package]] name = "password-hash" -version = "0.3.2" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d791538a6dcc1e7cb7fe6f6b58aca40e7f79403c45b2bc274008b5e647af1d8" +checksum = "aa26fd5c3cd6e6bb83dd9c0cef40fbeb77d7596339ca46c18a6f66919bb07769" dependencies = [ "base64ct", "rand_core", @@ -287,7 +287,7 @@ dependencies = [ [[package]] name = "pbkdf2" -version = "0.10.1" +version = "0.11.0-pre" dependencies = [ "digest", "hex-literal", @@ -377,7 +377,7 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "scrypt" -version = "0.9.0" +version = "0.10.0-pre" dependencies = [ "hmac", "password-hash", diff --git a/argon2/Cargo.toml b/argon2/Cargo.toml index 5009cd2d..27be6e9c 100644 --- a/argon2/Cargo.toml +++ b/argon2/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "argon2" -version = "0.3.4" # Also update html_root_url in lib.rs when bumping this +version = "0.4.0-pre" # Also update html_root_url in lib.rs when bumping this description = """ Pure Rust implementation of the Argon2 password hashing function with support for the Argon2d, Argon2i, and Argon2id algorithmic variants @@ -19,13 +19,13 @@ base64ct = "1" blake2 = { version = "0.10.4", default-features = false } # optional dependencies -password-hash = { version = "0.3", optional = true } +password-hash = { version = "0.4", optional = true } rayon = { version = "1.2", optional = true } -zeroize = { version = ">=1, <1.6", optional = true } +zeroize = { version = "1", optional = true } [dev-dependencies] hex-literal = "0.3" -password-hash = { version = "0.3", features = ["rand_core"] } +password-hash = { version = "0.4", features = ["rand_core"] } [features] default = ["alloc", "password-hash", "rand"] diff --git a/argon2/README.md b/argon2/README.md index 3c064a61..ec2d3ac8 100644 --- a/argon2/README.md +++ b/argon2/README.md @@ -2,10 +2,10 @@ [![crate][crate-image]][crate-link] [![Docs][docs-image]][docs-link] +[![Build Status][build-image]][build-link] ![Apache2/MIT licensed][license-image] ![Rust Version][rustc-image] [![Project Chat][chat-image]][chat-link] -[![Build Status][build-image]][build-link] Pure Rust implementation of the [Argon2] password hashing function. @@ -13,7 +13,7 @@ Pure Rust implementation of the [Argon2] password hashing function. ## Minimum Supported Rust Version -Rust **1.51** or higher. +Rust **1.57** or higher. Minimum supported Rust version can be changed in the future, but it will be done with a minor version bump. @@ -45,7 +45,7 @@ dual licensed as above, without any additional terms or conditions. [docs-image]: https://docs.rs/argon2/badge.svg [docs-link]: https://docs.rs/argon2/ [license-image]: https://img.shields.io/badge/license-Apache2.0/MIT-blue.svg -[rustc-image]: https://img.shields.io/badge/rustc-1.51+-blue.svg +[rustc-image]: https://img.shields.io/badge/rustc-1.57+-blue.svg [chat-image]: https://img.shields.io/badge/zulip-join_chat-blue.svg [chat-link]: https://rustcrypto.zulipchat.com/#narrow/stream/260046-password-hashes [build-image]: https://github.com/RustCrypto/password-hashes/workflows/argon2/badge.svg?branch=master&event=push diff --git a/argon2/src/algorithm.rs b/argon2/src/algorithm.rs index fa9db096..c7ae2dd7 100644 --- a/argon2/src/algorithm.rs +++ b/argon2/src/algorithm.rs @@ -12,17 +12,17 @@ use {core::convert::TryFrom, password_hash::Ident}; /// Argon2d algorithm identifier #[cfg(feature = "password-hash")] #[cfg_attr(docsrs, doc(cfg(feature = "password-hash")))] -pub const ARGON2D_IDENT: Ident<'_> = Ident::new("argon2d"); +pub const ARGON2D_IDENT: Ident<'_> = Ident::new_unwrap("argon2d"); /// Argon2i algorithm identifier #[cfg(feature = "password-hash")] #[cfg_attr(docsrs, doc(cfg(feature = "password-hash")))] -pub const ARGON2I_IDENT: Ident<'_> = Ident::new("argon2i"); +pub const ARGON2I_IDENT: Ident<'_> = Ident::new_unwrap("argon2i"); /// Argon2id algorithm identifier #[cfg(feature = "password-hash")] #[cfg_attr(docsrs, doc(cfg(feature = "password-hash")))] -pub const ARGON2ID_IDENT: Ident<'_> = Ident::new("argon2id"); +pub const ARGON2ID_IDENT: Ident<'_> = Ident::new_unwrap("argon2id"); /// Argon2 primitive type: variants of the algorithm. #[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord)] diff --git a/argon2/src/lib.rs b/argon2/src/lib.rs index 0284d736..ef7e4e87 100644 --- a/argon2/src/lib.rs +++ b/argon2/src/lib.rs @@ -74,7 +74,7 @@ #![doc( html_logo_url = "https://raw.githubusercontent.com/RustCrypto/media/8f1a9894/logo.svg", html_favicon_url = "https://raw.githubusercontent.com/RustCrypto/media/8f1a9894/logo.svg", - html_root_url = "https://docs.rs/argon2/0.3.4" + html_root_url = "https://docs.rs/argon2/0.4.0-pre" )] #![warn(rust_2018_idioms, missing_docs)] diff --git a/balloon-hash/Cargo.toml b/balloon-hash/Cargo.toml index 6c498fed..f2e222ab 100644 --- a/balloon-hash/Cargo.toml +++ b/balloon-hash/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "balloon-hash" -version = "0.1.1" # Also update html_root_url in lib.rs when bumping this +version = "0.2.0-pre" # Also update html_root_url in lib.rs when bumping this description = "Pure Rust implementation of the Balloon password hashing function" authors = ["RustCrypto Developers"] license = "MIT OR Apache-2.0" @@ -17,7 +17,7 @@ digest = { version = "0.10.3", default-features = false } crypto-bigint = { version = "0.3", default-features = false, features = ["generic-array"] } # optional dependencies -password-hash = { version = "0.3", default-features = false, optional = true } +password-hash = { version = "0.4", default-features = false, optional = true } rayon = { version = "1.2", optional = true } [dev-dependencies] diff --git a/balloon-hash/README.md b/balloon-hash/README.md index 1821a222..444f6b7f 100644 --- a/balloon-hash/README.md +++ b/balloon-hash/README.md @@ -2,10 +2,10 @@ [![crate][crate-image]][crate-link] [![Docs][docs-image]][docs-link] +[![Build Status][build-image]][build-link] ![Apache2/MIT licensed][license-image] ![Rust Version][rustc-image] [![Project Chat][chat-image]][chat-link] -[![Build Status][build-image]][build-link] Pure Rust implementation of the [Balloon] password hashing function. @@ -26,7 +26,7 @@ This algorithm is first practical password hashing function that provides: ## Minimum Supported Rust Version -Rust **1.56** or higher. +Rust **1.57** or higher. Minimum supported Rust version can be changed in the future, but it will be done with a minor version bump. @@ -58,7 +58,7 @@ dual licensed as above, without any additional terms or conditions. [docs-image]: https://docs.rs/balloon-hash/badge.svg [docs-link]: https://docs.rs/balloon-hash/ [license-image]: https://img.shields.io/badge/license-Apache2.0/MIT-blue.svg -[rustc-image]: https://img.shields.io/badge/rustc-1.56+-blue.svg +[rustc-image]: https://img.shields.io/badge/rustc-1.57+-blue.svg [chat-image]: https://img.shields.io/badge/zulip-join_chat-blue.svg [chat-link]: https://rustcrypto.zulipchat.com/#narrow/stream/260046-password-hashes [build-image]: https://github.com/RustCrypto/password-hashes/workflows/balloon/badge.svg?branch=master&event=push diff --git a/balloon-hash/src/algorithm.rs b/balloon-hash/src/algorithm.rs index ebea21a1..7263ce5e 100644 --- a/balloon-hash/src/algorithm.rs +++ b/balloon-hash/src/algorithm.rs @@ -32,12 +32,12 @@ impl Algorithm { /// Balloon algorithm identifier #[cfg(feature = "password-hash")] #[cfg_attr(docsrs, doc(cfg(feature = "password-hash")))] - pub const BALLOON_IDENT: Ident<'static> = Ident::new("balloon"); + pub const BALLOON_IDENT: Ident<'static> = Ident::new_unwrap("balloon"); /// BalloonM algorithm identifier #[cfg(feature = "password-hash")] #[cfg_attr(docsrs, doc(cfg(feature = "password-hash")))] - pub const BALLOON_M_IDENT: Ident<'static> = Ident::new("balloon-m"); + pub const BALLOON_M_IDENT: Ident<'static> = Ident::new_unwrap("balloon-m"); /// Parse an [`Algorithm`] from the provided string. pub fn new(id: impl AsRef) -> Result { diff --git a/balloon-hash/src/lib.rs b/balloon-hash/src/lib.rs index 2735a11b..c3c8bd23 100644 --- a/balloon-hash/src/lib.rs +++ b/balloon-hash/src/lib.rs @@ -4,7 +4,7 @@ #![doc( html_logo_url = "https://raw.githubusercontent.com/RustCrypto/media/8f1a9894/logo.svg", html_favicon_url = "https://raw.githubusercontent.com/RustCrypto/media/8f1a9894/logo.svg", - html_root_url = "https://docs.rs/balloon-hash/0.1.1" + html_root_url = "https://docs.rs/balloon-hash/0.2.0-pre" )] #![warn(rust_2018_idioms, missing_docs)] @@ -18,7 +18,7 @@ //! //! ```toml //! [dependencies] -//! balloon-hash = "0.1" +//! balloon-hash = "0.2" //! rand_core = { version = "0.6", features = ["std"] } //! sha2 = "0.9" //! ``` diff --git a/bcrypt-pbkdf/Cargo.toml b/bcrypt-pbkdf/Cargo.toml index 0330a654..ed1714ea 100644 --- a/bcrypt-pbkdf/Cargo.toml +++ b/bcrypt-pbkdf/Cargo.toml @@ -14,7 +14,7 @@ categories = ["cryptography"] [dependencies] blowfish = { version = "0.9.1", features = ["bcrypt"] } -pbkdf2 = { version = "0.10.1", default-features = false, path = "../pbkdf2" } +pbkdf2 = { version = "=0.11.0-pre", default-features = false, path = "../pbkdf2" } sha2 = { version = "0.10.2", default-features = false } zeroize = { version = ">=1, <1.6", default-features = false, optional = true } diff --git a/bcrypt-pbkdf/README.md b/bcrypt-pbkdf/README.md index 6e3a529b..ab2fcc5e 100644 --- a/bcrypt-pbkdf/README.md +++ b/bcrypt-pbkdf/README.md @@ -2,10 +2,10 @@ [![crate][crate-image]][crate-link] [![Docs][docs-image]][docs-link] +[![Build Status][build-image]][build-link] ![Apache2/MIT licensed][license-image] ![Rust Version][rustc-image] [![Project Chat][chat-image]][chat-link] -[![Build Status][build-image]][build-link] Pure Rust implementation of the bcrypt-pbkdf password-based key derivation function. @@ -13,7 +13,7 @@ Pure Rust implementation of the bcrypt-pbkdf password-based key derivation funct ## Minimum Supported Rust Version -Rust **1.56** or higher. +Rust **1.57** or higher. Minimum supported Rust version can be changed in the future, but it will be done with a minor version bump. @@ -45,7 +45,7 @@ dual licensed as above, without any additional terms or conditions. [docs-image]: https://docs.rs/bcrypt-pbkdf/badge.svg [docs-link]: https://docs.rs/bcrypt-pbkdf/ [license-image]: https://img.shields.io/badge/license-Apache2.0/MIT-blue.svg -[rustc-image]: https://img.shields.io/badge/rustc-1.56+-blue.svg +[rustc-image]: https://img.shields.io/badge/rustc-1.57+-blue.svg [chat-image]: https://img.shields.io/badge/zulip-join_chat-blue.svg [chat-link]: https://rustcrypto.zulipchat.com/#narrow/stream/260046-password-hashes [build-image]: https://github.com/RustCrypto/password-hashes/workflows/bcrypt-pbkdf/badge.svg?branch=master&event=push diff --git a/pbkdf2/Cargo.toml b/pbkdf2/Cargo.toml index fa98a77b..182d7888 100644 --- a/pbkdf2/Cargo.toml +++ b/pbkdf2/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pbkdf2" -version = "0.10.1" # Also update html_root_url in lib.rs when bumping this +version = "0.11.0-pre" # Also update html_root_url in lib.rs when bumping this authors = ["RustCrypto Developers"] license = "MIT OR Apache-2.0" description = "Generic implementation of PBKDF2" @@ -16,7 +16,7 @@ digest = { version = "0.10.3", features = ["mac"] } # optional dependencies rayon = { version = "1.2", optional = true } -password-hash = { version = "0.3", default-features = false, optional = true, features = ["rand_core"] } +password-hash = { version = "0.4", default-features = false, optional = true, features = ["rand_core"] } hmac = { version = "0.12", default-features = false, optional = true } sha1 = { version = "0.10", package = "sha-1", default-features = false, optional = true } sha2 = { version = "0.10", default-features = false, optional = true } diff --git a/pbkdf2/README.md b/pbkdf2/README.md index 0127a1b7..5c7cb6c3 100644 --- a/pbkdf2/README.md +++ b/pbkdf2/README.md @@ -13,7 +13,7 @@ Pure Rust implementation of the [Password-Based Key Derivation Function v2 (PBKD ## Minimum Supported Rust Version -Rust **1.51** or higher. +Rust **1.57** or higher. Minimum supported Rust version can be changed in the future, but it will be done with a minor version bump. diff --git a/pbkdf2/src/lib.rs b/pbkdf2/src/lib.rs index 179c6c0b..9483d0d7 100644 --- a/pbkdf2/src/lib.rs +++ b/pbkdf2/src/lib.rs @@ -7,7 +7,7 @@ //! //! ```toml //! [dependencies] -//! pbkdf2 = { version = "0.10", default-features = false } +//! pbkdf2 = { version = "0.11", default-features = false } //! ``` //! //! # Usage (simple with default params) @@ -57,7 +57,7 @@ #![doc( html_logo_url = "https://raw.githubusercontent.com/RustCrypto/media/8f1a9894/logo.svg", html_favicon_url = "https://raw.githubusercontent.com/RustCrypto/media/8f1a9894/logo.svg", - html_root_url = "https://docs.rs/pbkdf2/0.10.1" + html_root_url = "https://docs.rs/pbkdf2/0.11.0-pre" )] #[cfg(feature = "std")] diff --git a/pbkdf2/src/simple.rs b/pbkdf2/src/simple.rs index aa215f0c..fe9f5a72 100644 --- a/pbkdf2/src/simple.rs +++ b/pbkdf2/src/simple.rs @@ -19,13 +19,13 @@ use sha1::Sha1; /// PBKDF2 (SHA-1) #[cfg(feature = "sha1")] -pub const PBKDF2_SHA1: Ident = Ident::new("pbkdf2"); +pub const PBKDF2_SHA1: Ident = Ident::new_unwrap("pbkdf2"); /// PBKDF2 (SHA-256) -pub const PBKDF2_SHA256: Ident = Ident::new("pbkdf2-sha256"); +pub const PBKDF2_SHA256: Ident = Ident::new_unwrap("pbkdf2-sha256"); /// PBKDF2 (SHA-512) -pub const PBKDF2_SHA512: Ident = Ident::new("pbkdf2-sha512"); +pub const PBKDF2_SHA512: Ident = Ident::new_unwrap("pbkdf2-sha512"); /// PBKDF2 type for use with [`PasswordHasher`]. #[derive(Copy, Clone, Debug, Eq, PartialEq)] diff --git a/scrypt/Cargo.toml b/scrypt/Cargo.toml index 5c349279..bf493620 100644 --- a/scrypt/Cargo.toml +++ b/scrypt/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "scrypt" -version = "0.9.0" # Also update html_root_url in lib.rs when bumping this +version = "0.10.0-pre" # Also update html_root_url in lib.rs when bumping this description = "Scrypt password-based key derivation function" authors = ["RustCrypto Developers"] license = "MIT OR Apache-2.0" @@ -14,15 +14,15 @@ categories = ["cryptography"] [dependencies] hmac = "0.12.1" -pbkdf2 = { version = "0.10.1", default-features = false, path = "../pbkdf2" } +pbkdf2 = { version = "=0.11.0-pre", default-features = false, path = "../pbkdf2" } salsa20 = { version = "0.10.2", default-features = false } sha2 = { version = "0.10", default-features = false } # optional dependencies -password-hash = { version = "0.3", default-features = false, features = ["rand_core"], optional = true } +password-hash = { version = "0.4", default-features = false, features = ["rand_core"], optional = true } [dev-dependencies] -password-hash = { version = "0.3", features = ["rand_core"] } +password-hash = { version = "0.4", features = ["rand_core"] } [features] default = ["simple", "std"] diff --git a/scrypt/README.md b/scrypt/README.md index 21faaef6..e5951159 100644 --- a/scrypt/README.md +++ b/scrypt/README.md @@ -2,10 +2,10 @@ [![crate][crate-image]][crate-link] [![Docs][docs-image]][docs-link] +[![Build Status][build-image]][build-link] ![Apache2/MIT licensed][license-image] ![Rust Version][rustc-image] [![Project Chat][chat-image]][chat-link] -[![Build Status][build-image]][build-link] Pure Rust implementation of the [scrypt key derivation function][1]. @@ -13,7 +13,7 @@ Pure Rust implementation of the [scrypt key derivation function][1]. ## Minimum Supported Rust Version -Rust **1.56** or higher. +Rust **1.57** or higher. Minimum supported Rust version can be changed in the future, but it will be done with a minor version bump. @@ -45,7 +45,7 @@ dual licensed as above, without any additional terms or conditions. [docs-image]: https://docs.rs/scrypt/badge.svg [docs-link]: https://docs.rs/scrypt/ [license-image]: https://img.shields.io/badge/license-Apache2.0/MIT-blue.svg -[rustc-image]: https://img.shields.io/badge/rustc-1.56+-blue.svg +[rustc-image]: https://img.shields.io/badge/rustc-1.57+-blue.svg [chat-image]: https://img.shields.io/badge/zulip-join_chat-blue.svg [chat-link]: https://rustcrypto.zulipchat.com/#narrow/stream/260046-password-hashes [build-image]: https://github.com/RustCrypto/password-hashes/workflows/scrypt/badge.svg?branch=master&event=push diff --git a/scrypt/src/lib.rs b/scrypt/src/lib.rs index 82a27cd6..c5b988d7 100644 --- a/scrypt/src/lib.rs +++ b/scrypt/src/lib.rs @@ -47,7 +47,7 @@ #![doc( html_logo_url = "https://raw.githubusercontent.com/RustCrypto/media/8f1a9894/logo.svg", html_favicon_url = "https://raw.githubusercontent.com/RustCrypto/media/8f1a9894/logo.svg", - html_root_url = "https://docs.rs/scrypt/0.9.0" + html_root_url = "https://docs.rs/scrypt/0.10.0-pre" )] #[macro_use] diff --git a/scrypt/src/simple.rs b/scrypt/src/simple.rs index 2bd1eeaa..6114f03b 100644 --- a/scrypt/src/simple.rs +++ b/scrypt/src/simple.rs @@ -4,7 +4,7 @@ use crate::{scrypt, Params}; use password_hash::{Decimal, Error, Ident, Output, PasswordHash, PasswordHasher, Result, Salt}; /// Algorithm identifier -pub const ALG_ID: Ident = Ident::new("scrypt"); +pub const ALG_ID: Ident = Ident::new_unwrap("scrypt"); /// scrypt type for use with [`PasswordHasher`]. #[derive(Copy, Clone, Debug, Eq, PartialEq)]