diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-04 12:47:55 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-04 12:47:55 +0000 |
commit | 2aadc03ef15cb5ca5cc2af8a7c08e070742f0ac4 (patch) | |
tree | 033cc839730fda84ff08db877037977be94e5e3a /vendor/commoncrypto | |
parent | Initial commit. (diff) | |
download | cargo-upstream.tar.xz cargo-upstream.zip |
Adding upstream version 0.70.1+ds1.upstream/0.70.1+ds1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'vendor/commoncrypto')
-rw-r--r-- | vendor/commoncrypto/.cargo-checksum.json | 1 | ||||
-rw-r--r-- | vendor/commoncrypto/Cargo.toml | 15 | ||||
-rw-r--r-- | vendor/commoncrypto/debian/patches/no-clippy.patch | 16 | ||||
-rw-r--r-- | vendor/commoncrypto/debian/patches/series | 1 | ||||
-rw-r--r-- | vendor/commoncrypto/src/hash.rs | 127 | ||||
-rw-r--r-- | vendor/commoncrypto/src/lib.rs | 30 | ||||
-rw-r--r-- | vendor/commoncrypto/src/pbkdf2.rs | 66 | ||||
-rw-r--r-- | vendor/commoncrypto/tests/hash.rs | 18 | ||||
-rw-r--r-- | vendor/commoncrypto/tests/pbkdf2.rs | 16 |
9 files changed, 290 insertions, 0 deletions
diff --git a/vendor/commoncrypto/.cargo-checksum.json b/vendor/commoncrypto/.cargo-checksum.json new file mode 100644 index 0000000..05b5c13 --- /dev/null +++ b/vendor/commoncrypto/.cargo-checksum.json @@ -0,0 +1 @@ +{"files":{},"package":"d056a8586ba25a1e4d61cb090900e495952c7886786fc55f909ab2f819b69007"}
\ No newline at end of file diff --git a/vendor/commoncrypto/Cargo.toml b/vendor/commoncrypto/Cargo.toml new file mode 100644 index 0000000..2cc2b36 --- /dev/null +++ b/vendor/commoncrypto/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "commoncrypto" +version = "0.2.0" +authors = ["Mark Lee"] +description = "Idiomatic Rust wrappers for Mac OS X's CommonCrypto library" +documentation = "https://docs.rs/commoncrypto" +repository = "https://github.com/malept/rust-commoncrypto" +keywords = ["crypto", "hash", "digest", "osx", "commoncrypto"] +license = "MIT" + +[dependencies] +commoncrypto-sys = { version = "0.2.0", path = "../commoncrypto-sys" } + +[dev-dependencies] +hex = "0.2" diff --git a/vendor/commoncrypto/debian/patches/no-clippy.patch b/vendor/commoncrypto/debian/patches/no-clippy.patch new file mode 100644 index 0000000..b21a7ca --- /dev/null +++ b/vendor/commoncrypto/debian/patches/no-clippy.patch @@ -0,0 +1,16 @@ +--- a/Cargo.toml ++++ b/Cargo.toml +@@ -8,13 +8,8 @@ + keywords = ["crypto", "hash", "digest", "osx", "commoncrypto"] + license = "MIT" + +-[features] +-lint = ["clippy"] +- + [dependencies] + commoncrypto-sys = { version = "0.2.0", path = "../commoncrypto-sys" } + +-clippy = { version = "0.0", optional = true } +- + [dev-dependencies] + hex = "0.2" diff --git a/vendor/commoncrypto/debian/patches/series b/vendor/commoncrypto/debian/patches/series new file mode 100644 index 0000000..bce9063 --- /dev/null +++ b/vendor/commoncrypto/debian/patches/series @@ -0,0 +1 @@ +no-clippy.patch diff --git a/vendor/commoncrypto/src/hash.rs b/vendor/commoncrypto/src/hash.rs new file mode 100644 index 0000000..a30ee4d --- /dev/null +++ b/vendor/commoncrypto/src/hash.rs @@ -0,0 +1,127 @@ +// Copyright (c) 2016 Mark Lee +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +//! Idiomatic Rust wrapper for `CommonCrypto`'s `CCDigestCtx` struct. + +use commoncrypto_sys::{CCDigestCreate, CCDigestCtx, CCDigestDestroy, CCDigestFinal, + CCDigestGetOutputSizeFromRef, CCDigestReset, CCDigestUpdate}; +use std::io; + +pub use commoncrypto_sys::CCDigestAlgorithm; + +const MAX_DIGEST_SIZE: usize = 64; + +macro_rules! err_from_ccdigest_retval{ + ($func_name: expr, $val: expr) => { + Err(io::Error::new(io::ErrorKind::Other, + format!("{} returned nonzero: {}", $func_name, $val))) + } +} + +#[derive(PartialEq, Copy, Clone, Debug)] +enum State { + Reset, + Updated, + Finalized, +} + +/// Generates cryptographic hashes. +#[derive(Debug)] +pub struct Hasher { + ctx: *mut CCDigestCtx, + state: State, +} + +impl Hasher { + /// Creates a new `Hasher` which will use the given cryptographic `algorithm`. + pub fn new(algorithm: CCDigestAlgorithm) -> Hasher { + let ctx: *mut CCDigestCtx; + unsafe { + ctx = CCDigestCreate(algorithm); + } + Hasher { + ctx: ctx, + state: State::Reset, + } + } + + fn init(&mut self) { + match self.state { + State::Reset => return, + State::Updated => { + let _ = self.finish(); + } + State::Finalized => (), + } + unsafe { CCDigestReset(self.ctx) }; + self.state = State::Reset; + } + + /// Feeds data into the hasher. + pub fn update(&mut self, data: &[u8]) -> io::Result<usize> { + if self.state == State::Finalized { + self.init(); + } + let result = unsafe { CCDigestUpdate(self.ctx, data.as_ptr() as *mut _, data.len()) }; + if result == 0 { + self.state = State::Updated; + Ok(data.len()) + } else { + err_from_ccdigest_retval!("CCDigestCreate", result) + } + } + + /// Finalizes digest operations and produces the digest output. + pub fn finish(&mut self) -> io::Result<Vec<u8>> { + if self.state == State::Finalized { + self.init(); + } + let expected_len = unsafe { CCDigestGetOutputSizeFromRef(self.ctx) }; + let mut md = vec![0; MAX_DIGEST_SIZE]; + let result = unsafe { CCDigestFinal(self.ctx, md.as_mut_ptr()) }; + if result == 0 { + self.state = State::Finalized; + md.truncate(expected_len); + Ok(md) + } else { + err_from_ccdigest_retval!("CCDigestFinal", result) + } + } +} + +impl io::Write for Hasher { + #[inline] + fn write(&mut self, buf: &[u8]) -> io::Result<usize> { + self.update(buf) + } + + fn flush(&mut self) -> io::Result<()> { + Ok(()) + } +} + +impl Drop for Hasher { + fn drop(&mut self) { + if self.state != State::Finalized { + let _ = self.finish(); + } + unsafe { CCDigestDestroy(self.ctx) } + } +} diff --git a/vendor/commoncrypto/src/lib.rs b/vendor/commoncrypto/src/lib.rs new file mode 100644 index 0000000..3b58f91 --- /dev/null +++ b/vendor/commoncrypto/src/lib.rs @@ -0,0 +1,30 @@ +// Copyright (c) 2016 Mark Lee +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +//! Idiomatic Rust wrappers for `CommonCrypto` structs. + +#![warn(missing_docs)] + +extern crate commoncrypto_sys; + +#[warn(missing_docs)] +pub mod hash; +#[warn(missing_docs)] +pub mod pbkdf2; diff --git a/vendor/commoncrypto/src/pbkdf2.rs b/vendor/commoncrypto/src/pbkdf2.rs new file mode 100644 index 0000000..94cb937 --- /dev/null +++ b/vendor/commoncrypto/src/pbkdf2.rs @@ -0,0 +1,66 @@ +// Copyright (c) 2016 +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +//! Idiomatic Rust wrapper for `CommonCrypto`'s `CCKeyDerivationPBKDF` function. + +use commoncrypto_sys::{CCKeyDerivationPBKDF, CCPBKDFAlgorithm}; + +use std::io; + +pub use commoncrypto_sys::CCPseudoRandomAlgorithm; + +macro_rules! err_from_cckeyderivationpbkdf_retval { + ($func_name: expr, $val: expr) => {{ + let kind = match $val { + // kCCParamError is the only one that's specifically noted + -43000 => io::ErrorKind::InvalidInput, + _ => io::ErrorKind::Other, + }; + + Err(io::Error::new(kind, format!("{} returned nonzero: {}", $func_name, $val))) + }} +} + +/// Derive a key from a password or passphrase and a salt +pub fn pbkdf2(password: &[u8], + salt: &[u8], + prf: CCPseudoRandomAlgorithm, + rounds: u32, + key_len: usize) + -> io::Result<Vec<u8>> { + let mut pw_derived = vec![0u8; key_len]; + let result = unsafe { + CCKeyDerivationPBKDF(CCPBKDFAlgorithm::kCCPBKDF2, + password.as_ptr(), + password.len(), + salt.as_ptr(), + salt.len(), + prf, + rounds, + pw_derived.as_mut_ptr(), + pw_derived.len()) + }; + + if result == 0 { + Ok(pw_derived) + } else { + err_from_cckeyderivationpbkdf_retval!("CCKeyDerivationPBKDF", result) + } +} diff --git a/vendor/commoncrypto/tests/hash.rs b/vendor/commoncrypto/tests/hash.rs new file mode 100644 index 0000000..bccc86c --- /dev/null +++ b/vendor/commoncrypto/tests/hash.rs @@ -0,0 +1,18 @@ +extern crate commoncrypto; +extern crate hex; + +use commoncrypto::hash::{CCDigestAlgorithm, Hasher}; +use hex::ToHex; +use std::io::Write; + +const TO_HASH: &'static str = "The quick brown fox jumps over the lazy dog"; +const TO_HASH_MD5: &'static str = "9e107d9d372bb6826bd81d3542a419d6"; + +#[test] +fn md5_hasher() { + let mut hasher = Hasher::new(CCDigestAlgorithm::kCCDigestMD5); + assert!(hasher.write_all(TO_HASH.as_bytes()).is_ok()); + let result = hasher.finish(); + assert!(result.is_ok()); + assert_eq!(result.expect("Hash failed").to_hex(), TO_HASH_MD5) +} diff --git a/vendor/commoncrypto/tests/pbkdf2.rs b/vendor/commoncrypto/tests/pbkdf2.rs new file mode 100644 index 0000000..179c5ae --- /dev/null +++ b/vendor/commoncrypto/tests/pbkdf2.rs @@ -0,0 +1,16 @@ +extern crate commoncrypto; +extern crate hex; + +use commoncrypto::pbkdf2::{pbkdf2, CCPseudoRandomAlgorithm}; +use hex::ToHex; + +#[test] +fn derive_pbkdf2() { + let derived = pbkdf2(b"password", + b"salt", + CCPseudoRandomAlgorithm::kCCPRFHmacAlgSHA1, + 1, + 20) + .unwrap(); + assert_eq!("0c60c80f961f0e71f3a9b524af6012062fe037a6", derived.to_hex()); +} |