9 #include <botan/mem_ops.h>
10 #include <botan/exceptn.h>
15 const uint8_t input[],
19 static const uint8_t BIN_TO_HEX_UPPER[16] = {
20 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
21 'A',
'B',
'C',
'D',
'E',
'F' };
23 static const uint8_t BIN_TO_HEX_LOWER[16] = {
24 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
25 'a',
'b',
'c',
'd',
'e',
'f' };
27 const uint8_t* tbl = uppercase ? BIN_TO_HEX_UPPER : BIN_TO_HEX_LOWER;
29 for(
size_t i = 0; i != input_length; ++i)
32 output[2*i ] = tbl[(x >> 4) & 0x0F];
33 output[2*i+1] = tbl[(x ) & 0x0F];
41 std::string output(2 * input_length, 0);
44 hex_encode(&output.front(), input, input_length, uppercase);
52 size_t& input_consumed,
64 static const uint8_t HEX_TO_BIN[256] = {
65 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80,
66 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
67 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
68 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
69 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x01,
70 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0xFF, 0xFF,
71 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E,
72 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
73 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
74 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C,
75 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
76 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
77 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
78 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
79 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
80 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
81 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
82 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
83 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
84 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
85 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
86 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
87 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
88 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
89 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
90 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
92 uint8_t* out_ptr = output;
93 bool top_nibble =
true;
97 for(
size_t i = 0; i != input_length; ++i)
99 const uint8_t bin = HEX_TO_BIN[
static_cast<uint8_t
>(input[i])];
103 if(bin == 0x80 && ignore_ws)
106 std::string bad_char(1, input[i]);
109 else if(bad_char ==
"\n")
113 std::string(
"hex_decode: invalid hex character '") +
117 *out_ptr |= bin << (top_nibble*4);
119 top_nibble = !top_nibble;
124 input_consumed = input_length;
125 size_t written = (out_ptr - output);
146 size_t written =
hex_decode(output, input, input_length,
147 consumed, ignore_ws);
149 if(consumed != input_length)
156 const std::string& input,
159 return hex_decode(output, input.data(), input.length(), ignore_ws);
187 std::vector<uint8_t> bin(1 + input_length / 2);
201 return hex_decode(input.data(), input.size(), ignore_ws);
void clear_mem(T *ptr, size_t n)
std::vector< T, secure_allocator< T >> secure_vector
secure_vector< uint8_t > hex_decode_locked(const char input[], size_t input_length, bool ignore_ws)
void hex_encode(char output[], const uint8_t input[], size_t input_length, bool uppercase)
size_t hex_decode(uint8_t output[], const char input[], size_t input_length, size_t &input_consumed, bool ignore_ws)