diff options
author | Steven Fackler <sfackler@gmail.com> | 2016-10-22 09:16:38 -0700 |
---|---|---|
committer | Steven Fackler <sfackler@gmail.com> | 2016-10-22 09:16:38 -0700 |
commit | 98b7f2f9352e4d92b44245d0737f9a45adb4ae2b (patch) | |
tree | 983929f8b6cd8be9e42e226ac74a5ddc5f29ccd5 /openssl/src/memcmp.rs | |
parent | 58f6d1138afc6381694c9080c398eb851b455ecd (diff) | |
download | rust-openssl-98b7f2f9352e4d92b44245d0737f9a45adb4ae2b.zip |
Flatten crypto module
Diffstat (limited to 'openssl/src/memcmp.rs')
-rw-r--r-- | openssl/src/memcmp.rs | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/openssl/src/memcmp.rs b/openssl/src/memcmp.rs new file mode 100644 index 00000000..cf08bdb5 --- /dev/null +++ b/openssl/src/memcmp.rs @@ -0,0 +1,39 @@ +use libc::size_t; +use ffi; + +/// Returns `true` iff `a` and `b` contain the same bytes. +/// +/// This operation takes an amount of time dependent on the length of the two +/// arrays given, but is independent of the contents of a and b. +/// +/// # Failure +/// +/// This function will panic the current task if `a` and `b` do not have the same +/// length. +pub fn eq(a: &[u8], b: &[u8]) -> bool { + assert!(a.len() == b.len()); + let ret = unsafe { + ffi::CRYPTO_memcmp(a.as_ptr() as *const _, + b.as_ptr() as *const _, + a.len() as size_t) + }; + ret == 0 +} + +#[cfg(test)] +mod tests { + use super::eq; + + #[test] + fn test_eq() { + assert!(eq(&[], &[])); + assert!(eq(&[1], &[1])); + assert!(!eq(&[1, 2, 3], &[1, 2, 4])); + } + + #[test] + #[should_panic] + fn test_diff_lens() { + eq(&[], &[1]); + } +} |