1use crate::bases::BaseConversionError;
19
20pub fn str_hex_to_32bytes(text: &str) -> Result<[u8; 32], BaseConversionError> {
25 if text.len() != 64 {
26 Err(BaseConversionError::InvalidLength {
27 expected: 64,
28 found: text.len(),
29 })
30 } else {
31 let mut bytes = [0u8; 32];
32
33 let chars = text.as_bytes();
34
35 for i in 0..64 {
36 if i % 2 != 0 {
37 continue;
38 }
39
40 let byte1 = hex_char_byte_to_byte(chars[i], i)?;
41 let byte2 = hex_char_byte_to_byte(chars[i + 1], i + 1)?;
42
43 bytes[i / 2] = (byte1 << 4) | byte2;
44 }
45
46 Ok(bytes)
47 }
48}
49
50pub fn str_hex_to_64bytes(text: &str) -> Result<[u8; 64], BaseConversionError> {
55 if text.len() != 128 {
56 Err(BaseConversionError::InvalidLength {
57 expected: 128,
58 found: text.len(),
59 })
60 } else {
61 let mut bytes = [0u8; 64];
62
63 let chars = text.as_bytes();
64
65 for i in 0..128 {
66 if i % 2 != 0 {
67 continue;
68 }
69
70 let byte1 = hex_char_byte_to_byte(chars[i], i)?;
71 let byte2 = hex_char_byte_to_byte(chars[i + 1], i + 1)?;
72
73 bytes[i / 2] = (byte1 << 4) | byte2;
74 }
75
76 Ok(bytes)
77 }
78}
79
80fn hex_char_byte_to_byte(hex_char: u8, pos: usize) -> Result<u8, BaseConversionError> {
81 match hex_char {
82 b'0' => Ok(0),
83 b'1' => Ok(1),
84 b'2' => Ok(2),
85 b'3' => Ok(3),
86 b'4' => Ok(4),
87 b'5' => Ok(5),
88 b'6' => Ok(6),
89 b'7' => Ok(7),
90 b'8' => Ok(8),
91 b'9' => Ok(9),
92 b'A' => Ok(10),
93 b'B' => Ok(11),
94 b'C' => Ok(12),
95 b'D' => Ok(13),
96 b'E' => Ok(14),
97 b'F' => Ok(15),
98 c => Err(BaseConversionError::InvalidCharacter {
99 character: c as char,
100 offset: pos,
101 }),
102 }
103}