summaryrefslogtreecommitdiffstats
path: root/vendor/commoncrypto
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-04 12:47:55 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-04 12:47:55 +0000
commit2aadc03ef15cb5ca5cc2af8a7c08e070742f0ac4 (patch)
tree033cc839730fda84ff08db877037977be94e5e3a /vendor/commoncrypto
parentInitial commit. (diff)
downloadcargo-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.json1
-rw-r--r--vendor/commoncrypto/Cargo.toml15
-rw-r--r--vendor/commoncrypto/debian/patches/no-clippy.patch16
-rw-r--r--vendor/commoncrypto/debian/patches/series1
-rw-r--r--vendor/commoncrypto/src/hash.rs127
-rw-r--r--vendor/commoncrypto/src/lib.rs30
-rw-r--r--vendor/commoncrypto/src/pbkdf2.rs66
-rw-r--r--vendor/commoncrypto/tests/hash.rs18
-rw-r--r--vendor/commoncrypto/tests/pbkdf2.rs16
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());
+}