- remove dependency on hex-literal crate
- add helper for converting between hex strings and bytes
Change-Id: I073b597cfb1b2687dd7d1743441bdfaaf601810d
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/58225
Reviewed-by: Bob Beck <bbe@google.com>
Commit-Queue: Bob Beck <bbe@google.com>
diff --git a/rust/bssl-crypto/src/aes.rs b/rust/bssl-crypto/src/aes.rs
index c2eb4412..e3ec5bd 100644
--- a/rust/bssl-crypto/src/aes.rs
+++ b/rust/bssl-crypto/src/aes.rs
@@ -123,102 +123,102 @@
#[cfg(test)]
mod tests {
use crate::aes::{Aes, AesDecryptKey, AesEncryptKey};
- use hex_literal::hex;
+ use crate::test_helpers::decode_hex;
// test data from https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38a.pdf F.1.1
#[test]
fn aes_128_test_encrypt() {
- let key = AesEncryptKey::new_aes_128(hex!("2b7e151628aed2a6abf7158809cf4f3c"));
+ let key = AesEncryptKey::new_aes_128(decode_hex("2b7e151628aed2a6abf7158809cf4f3c"));
let mut block = [0_u8; 16];
- block.copy_from_slice(&hex!("6bc1bee22e409f96e93d7e117393172a"));
+ block.copy_from_slice(&decode_hex::<16>("6bc1bee22e409f96e93d7e117393172a"));
Aes::encrypt(&key, &mut block);
- assert_eq!(hex!("3ad77bb40d7a3660a89ecaf32466ef97"), block);
+ assert_eq!(decode_hex("3ad77bb40d7a3660a89ecaf32466ef97"), block);
- block.copy_from_slice(&hex!("ae2d8a571e03ac9c9eb76fac45af8e51"));
+ block.copy_from_slice(&decode_hex::<16>("ae2d8a571e03ac9c9eb76fac45af8e51"));
Aes::encrypt(&key, &mut block);
- assert_eq!(hex!("f5d3d58503b9699de785895a96fdbaaf"), block);
+ assert_eq!(decode_hex("f5d3d58503b9699de785895a96fdbaaf"), block);
- block.copy_from_slice(&hex!("30c81c46a35ce411e5fbc1191a0a52ef"));
+ block.copy_from_slice(&decode_hex::<16>("30c81c46a35ce411e5fbc1191a0a52ef"));
Aes::encrypt(&key, &mut block);
- assert_eq!(hex!("43b1cd7f598ece23881b00e3ed030688"), block);
+ assert_eq!(decode_hex("43b1cd7f598ece23881b00e3ed030688"), block);
- block.copy_from_slice(&hex!("f69f2445df4f9b17ad2b417be66c3710"));
+ block.copy_from_slice(&decode_hex::<16>("f69f2445df4f9b17ad2b417be66c3710"));
Aes::encrypt(&key, &mut block);
- assert_eq!(hex!("7b0c785e27e8ad3f8223207104725dd4"), block);
+ assert_eq!(decode_hex("7b0c785e27e8ad3f8223207104725dd4"), block);
}
// test data from https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38a.pdf F.1.2
#[test]
fn aes_128_test_decrypt() {
- let key = AesDecryptKey::new_aes_128(hex!("2b7e151628aed2a6abf7158809cf4f3c"));
+ let key = AesDecryptKey::new_aes_128(decode_hex("2b7e151628aed2a6abf7158809cf4f3c"));
let mut block = [0_u8; 16];
- block.copy_from_slice(&hex!("3ad77bb40d7a3660a89ecaf32466ef97"));
+ block.copy_from_slice(&decode_hex::<16>("3ad77bb40d7a3660a89ecaf32466ef97"));
Aes::decrypt(&key, &mut block);
- assert_eq!(hex!("6bc1bee22e409f96e93d7e117393172a"), block);
+ assert_eq!(decode_hex::<16>("6bc1bee22e409f96e93d7e117393172a"), block);
- block.copy_from_slice(&hex!("f5d3d58503b9699de785895a96fdbaaf"));
+ block.copy_from_slice(&decode_hex::<16>("f5d3d58503b9699de785895a96fdbaaf"));
Aes::decrypt(&key, &mut block);
- assert_eq!(hex!("ae2d8a571e03ac9c9eb76fac45af8e51"), block);
+ assert_eq!(decode_hex::<16>("ae2d8a571e03ac9c9eb76fac45af8e51"), block);
- block.copy_from_slice(&hex!("43b1cd7f598ece23881b00e3ed030688"));
+ block.copy_from_slice(&decode_hex::<16>("43b1cd7f598ece23881b00e3ed030688"));
Aes::decrypt(&key, &mut block);
- assert_eq!(hex!("30c81c46a35ce411e5fbc1191a0a52ef"), block);
+ assert_eq!(decode_hex::<16>("30c81c46a35ce411e5fbc1191a0a52ef"), block);
- block.copy_from_slice(&hex!("7b0c785e27e8ad3f8223207104725dd4"));
+ block.copy_from_slice(&decode_hex::<16>("7b0c785e27e8ad3f8223207104725dd4").as_slice());
Aes::decrypt(&key, &mut block);
- assert_eq!(hex!("f69f2445df4f9b17ad2b417be66c3710"), block);
+ assert_eq!(decode_hex::<16>("f69f2445df4f9b17ad2b417be66c3710"), block);
}
// test data from https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38a.pdf F.1.5
#[test]
pub fn aes_256_test_encrypt() {
- let key = AesEncryptKey::new_aes_256(hex!(
- "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4"
+ let key = AesEncryptKey::new_aes_256(decode_hex(
+ "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4",
));
let mut block: [u8; 16];
- block = hex!("6bc1bee22e409f96e93d7e117393172a");
+ block = decode_hex("6bc1bee22e409f96e93d7e117393172a");
Aes::encrypt(&key, &mut block);
- assert_eq!(hex!("f3eed1bdb5d2a03c064b5a7e3db181f8"), block);
+ assert_eq!(decode_hex("f3eed1bdb5d2a03c064b5a7e3db181f8"), block);
- block = hex!("ae2d8a571e03ac9c9eb76fac45af8e51");
+ block = decode_hex("ae2d8a571e03ac9c9eb76fac45af8e51");
Aes::encrypt(&key, &mut block);
- assert_eq!(hex!("591ccb10d410ed26dc5ba74a31362870"), block);
+ assert_eq!(decode_hex("591ccb10d410ed26dc5ba74a31362870"), block);
- block = hex!("30c81c46a35ce411e5fbc1191a0a52ef");
+ block = decode_hex("30c81c46a35ce411e5fbc1191a0a52ef");
Aes::encrypt(&key, &mut block);
- assert_eq!(hex!("b6ed21b99ca6f4f9f153e7b1beafed1d"), block);
+ assert_eq!(decode_hex("b6ed21b99ca6f4f9f153e7b1beafed1d"), block);
- block = hex!("f69f2445df4f9b17ad2b417be66c3710");
+ block = decode_hex("f69f2445df4f9b17ad2b417be66c3710");
Aes::encrypt(&key, &mut block);
- assert_eq!(hex!("23304b7a39f9f3ff067d8d8f9e24ecc7"), block);
+ assert_eq!(decode_hex("23304b7a39f9f3ff067d8d8f9e24ecc7"), block);
}
// test data from https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38a.pdf F.1.6
#[test]
fn aes_256_test_decrypt() {
- let key = AesDecryptKey::new_aes_256(hex!(
- "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4"
+ let key = AesDecryptKey::new_aes_256(decode_hex(
+ "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4",
));
let mut block: [u8; 16];
- block = hex!("f3eed1bdb5d2a03c064b5a7e3db181f8");
+ block = decode_hex("f3eed1bdb5d2a03c064b5a7e3db181f8");
Aes::decrypt(&key, &mut block);
- assert_eq!(hex!("6bc1bee22e409f96e93d7e117393172a"), block);
+ assert_eq!(decode_hex("6bc1bee22e409f96e93d7e117393172a"), block);
- block = hex!("591ccb10d410ed26dc5ba74a31362870");
+ block = decode_hex("591ccb10d410ed26dc5ba74a31362870");
Aes::decrypt(&key, &mut block);
- assert_eq!(hex!("ae2d8a571e03ac9c9eb76fac45af8e51"), block);
+ assert_eq!(decode_hex("ae2d8a571e03ac9c9eb76fac45af8e51"), block);
- block = hex!("b6ed21b99ca6f4f9f153e7b1beafed1d");
+ block = decode_hex("b6ed21b99ca6f4f9f153e7b1beafed1d");
Aes::decrypt(&key, &mut block);
- assert_eq!(hex!("30c81c46a35ce411e5fbc1191a0a52ef"), block);
+ assert_eq!(decode_hex("30c81c46a35ce411e5fbc1191a0a52ef"), block);
- block = hex!("23304b7a39f9f3ff067d8d8f9e24ecc7");
+ block = decode_hex("23304b7a39f9f3ff067d8d8f9e24ecc7");
Aes::decrypt(&key, &mut block);
- assert_eq!(hex!("f69f2445df4f9b17ad2b417be66c3710"), block);
+ assert_eq!(decode_hex("f69f2445df4f9b17ad2b417be66c3710"), block);
}
}
diff --git a/rust/bssl-crypto/src/hkdf.rs b/rust/bssl-crypto/src/hkdf.rs
index db6c5b6..66b8d60 100644
--- a/rust/bssl-crypto/src/hkdf.rs
+++ b/rust/bssl-crypto/src/hkdf.rs
@@ -97,45 +97,45 @@
#[cfg(test)]
mod tests {
use crate::hkdf::{HkdfSha256, HkdfSha512};
+ use crate::test_helpers::{decode_hex, decode_hex_into_vec};
use core::iter;
- use hex_literal::hex;
- struct Test<'a> {
- ikm: &'a [u8],
- salt: &'a [u8],
- info: &'a [u8],
- okm: &'a [u8],
+ struct Test {
+ ikm: Vec<u8>,
+ salt: Vec<u8>,
+ info: Vec<u8>,
+ okm: Vec<u8>,
}
#[test]
fn hkdf_sha_256_test() {
- let ikm = hex!("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b");
- let salt = hex!("000102030405060708090a0b0c");
- let info = hex!("f0f1f2f3f4f5f6f7f8f9");
+ let ikm = decode_hex_into_vec("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b");
+ let salt = decode_hex_into_vec("000102030405060708090a0b0c");
+ let info = decode_hex_into_vec("f0f1f2f3f4f5f6f7f8f9");
- let hk = HkdfSha256::new(Some(&salt[..]), &ikm);
+ let hk = HkdfSha256::new(Some(salt.as_slice()), ikm.as_slice());
let mut okm = [0u8; 42];
hk.expand(&info, &mut okm)
.expect("42 is a valid length for Sha256 to output");
- let expected = hex!(
- "3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf34007208d5b887185865"
+ let expected = decode_hex(
+ "3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf34007208d5b887185865",
);
assert_eq!(okm, expected);
}
#[test]
fn hkdf_sha512_test() {
- let ikm = hex!("5d3db20e8238a90b62a600fa57fdb318");
- let salt = hex!("1d6f3b38a1e607b5e6bcd4af1800a9d3");
- let info = hex!("2bc5f39032b6fc87da69ba8711ce735b169646fd");
+ let ikm = decode_hex_into_vec("5d3db20e8238a90b62a600fa57fdb318");
+ let salt = decode_hex_into_vec("1d6f3b38a1e607b5e6bcd4af1800a9d3");
+ let info = decode_hex_into_vec("2bc5f39032b6fc87da69ba8711ce735b169646fd");
- let hk = HkdfSha512::new(Some(&salt[..]), &ikm);
+ let hk = HkdfSha512::new(Some(salt.as_slice()), ikm.as_slice());
let mut okm = [0u8; 42];
hk.expand(&info, &mut okm).expect("Should succeed");
- let expected = hex!(
- "8c3cf7122dcb5eb7efaf02718f1faf70bca20dcb75070e9d0871a413a6c05fc195a75aa9ffc349d70aae"
+ let expected = decode_hex(
+ "8c3cf7122dcb5eb7efaf02718f1faf70bca20dcb75070e9d0871a413a6c05fc195a75aa9ffc349d70aae",
);
assert_eq!(okm, expected);
}
@@ -146,69 +146,50 @@
let tests = [
Test {
// Test Case 1
- ikm: &hex!("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b"),
- salt: &hex!("000102030405060708090a0b0c"),
- info: &hex!("f0f1f2f3f4f5f6f7f8f9"),
- okm: &hex!(
- "
- 3cb25f25faacd57a90434f64d0362f2a
- 2d2d0a90cf1a5a4c5db02d56ecc4c5bf
- 34007208d5b887185865
- "
- ),
+ ikm: decode_hex_into_vec("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b"),
+ salt: decode_hex_into_vec("000102030405060708090a0b0c"),
+ info: decode_hex_into_vec("f0f1f2f3f4f5f6f7f8f9"),
+ okm: decode_hex_into_vec("3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf34007208d5b887185865")
},
Test {
// Test Case 2
- ikm: &hex!(
- "
- 000102030405060708090a0b0c0d0e0f
- 101112131415161718191a1b1c1d1e1f
- 202122232425262728292a2b2c2d2e2f
- 303132333435363738393a3b3c3d3e3f
- 404142434445464748494a4b4c4d4e4f
- "
+ ikm: decode_hex_into_vec(
+ "000102030405060708090a0b0c0d0e0f\
+ 101112131415161718191a1b1c1d1e1f\
+ 202122232425262728292a2b2c2d2e2f\
+ 303132333435363738393a3b3c3d3e3f\
+ 404142434445464748494a4b4c4d4e4f",
),
- salt: &hex!(
- "
- 606162636465666768696a6b6c6d6e6f
- 707172737475767778797a7b7c7d7e7f
- 808182838485868788898a8b8c8d8e8f
- 909192939495969798999a9b9c9d9e9f
- a0a1a2a3a4a5a6a7a8a9aaabacadaeaf
- "
+ salt: decode_hex_into_vec(
+ "606162636465666768696a6b6c6d6e6f\
+ 707172737475767778797a7b7c7d7e7f\
+ 808182838485868788898a8b8c8d8e8f\
+ 909192939495969798999a9b9c9d9e9f\
+ a0a1a2a3a4a5a6a7a8a9aaabacadaeaf",
),
- info: &hex!(
- "
- b0b1b2b3b4b5b6b7b8b9babbbcbdbebf
- c0c1c2c3c4c5c6c7c8c9cacbcccdcecf
- d0d1d2d3d4d5d6d7d8d9dadbdcdddedf
- e0e1e2e3e4e5e6e7e8e9eaebecedeeef
- f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff
- "
+ info: decode_hex_into_vec(
+ "b0b1b2b3b4b5b6b7b8b9babbbcbdbebf\
+ c0c1c2c3c4c5c6c7c8c9cacbcccdcecf\
+ d0d1d2d3d4d5d6d7d8d9dadbdcdddedf\
+ e0e1e2e3e4e5e6e7e8e9eaebecedeeef\
+ f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
),
- okm: &hex!(
- "
- b11e398dc80327a1c8e7f78c596a4934
- 4f012eda2d4efad8a050cc4c19afa97c
- 59045a99cac7827271cb41c65e590e09
- da3275600c2f09b8367793a9aca3db71
- cc30c58179ec3e87c14c01d5c1f3434f
- 1d87
- "
- ),
+ okm: decode_hex_into_vec(
+ "b11e398dc80327a1c8e7f78c596a4934\
+ 4f012eda2d4efad8a050cc4c19afa97c\
+ 59045a99cac7827271cb41c65e590e09\
+ da3275600c2f09b8367793a9aca3db71\
+ cc30c58179ec3e87c14c01d5c1f3434f\
+ 1d87",
+ )
},
Test {
// Test Case 3
- ikm: &hex!("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b"),
- salt: &hex!(""),
- info: &hex!(""),
- okm: &hex!(
- "
- 8da4e775a563c18f715f802a063c5a31
- b8a11f5c5ee1879ec3454e5f3c738d2d
- 9d201395faa4b61a96c8
- "
- ),
+ ikm: decode_hex_into_vec("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b"),
+ salt: Vec::new(),
+ info: Vec::new(),
+ okm: decode_hex_into_vec(
+ "8da4e775a563c18f715f802a063c5a31b8a11f5c5ee1879ec3454e5f3c738d2d9d201395faa4b61a96c8"),
},
];
for Test {
@@ -221,12 +202,12 @@
let salt = if salt.is_empty() {
None
} else {
- Some(&salt[..])
+ Some(salt.as_slice())
};
- let hkdf = HkdfSha256::new(salt, ikm);
+ let hkdf = HkdfSha256::new(salt, ikm.as_slice());
let mut okm2 = vec![0u8; okm.len()];
- assert!(hkdf.expand(&info[..], &mut okm2).is_ok());
- assert_eq!(okm2[..], okm[..]);
+ assert!(hkdf.expand(info.as_slice(), &mut okm2).is_ok());
+ assert_eq!(okm2.as_slice(), okm.as_slice());
}
}
diff --git a/rust/bssl-crypto/src/lib.rs b/rust/bssl-crypto/src/lib.rs
index 9c4a214..8400337 100644
--- a/rust/bssl-crypto/src/lib.rs
+++ b/rust/bssl-crypto/src/lib.rs
@@ -37,6 +37,9 @@
/// BoringSSL implemented hmac operations.
pub mod hmac;
+#[cfg(test)]
+mod test_helpers;
+
/// This is a helper struct which provides functions for passing slices over FFI.
struct CSlice<'a>(&'a [u8]);
diff --git a/rust/bssl-crypto/src/test_helpers.rs b/rust/bssl-crypto/src/test_helpers.rs
new file mode 100644
index 0000000..ea2d9db
--- /dev/null
+++ b/rust/bssl-crypto/src/test_helpers.rs
@@ -0,0 +1,31 @@
+/* Copyright (c) 2023, Google Inc.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+pub(crate) fn decode_hex<const N: usize>(s: &str) -> [u8; N] {
+ (0..s.len())
+ .step_by(2)
+ .map(|i| u8::from_str_radix(&s[i..i + 2], 16).expect("Invalid hex string"))
+ .collect::<Vec<u8>>()
+ .as_slice()
+ .try_into()
+ .unwrap()
+}
+
+pub(crate) fn decode_hex_into_vec(s: &str) -> Vec<u8> {
+ (0..s.len())
+ .step_by(2)
+ .map(|i| u8::from_str_radix(&s[i..i + 2], 16).expect("Invalid hex string"))
+ .collect::<Vec<u8>>()
+}