- 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>>()
+}