diff options
author | szszszsz <szszszsz@users.noreply.github.com> | 2016-09-10 11:02:38 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-09-10 11:02:38 +0200 |
commit | b16e89ad4445fe9bbb66e8e7f8771a6ca6b333cf (patch) | |
tree | d332db36123c80ac84474c75b9be4acdff81bf54 /misc.cc | |
parent | e164c5f3dc74fb2335b1fc573ce446cdd76a07dc (diff) | |
parent | a46491a97da08e495c92bba8046426678b5564f7 (diff) | |
download | libnitrokey-b16e89ad4445fe9bbb66e8e7f8771a6ca6b333cf.tar.gz libnitrokey-b16e89ad4445fe9bbb66e8e7f8771a6ca6b333cf.tar.bz2 |
Merge pull request #36 from Nitrokey/issue_31-secret_as_hex
#31 pass secret to OTP as hex (breaking change - previously any string was accepted)
Diffstat (limited to 'misc.cc')
-rw-r--r-- | misc.cc | 28 |
1 files changed, 28 insertions, 0 deletions
@@ -2,10 +2,38 @@ #include <string> #include "misc.h" #include "inttypes.h" +#include <cstdlib> +#include <cstring> +#include "LibraryException.h" namespace nitrokey { namespace misc { +std::vector<uint8_t> hex_string_to_byte(const char* hexString){ + const size_t big_string_size = 256; //arbitrary 'big' number + const size_t s_size = strlen(hexString); + const size_t d_size = s_size/2; + if (s_size%2!=0 || s_size==0 || s_size>big_string_size){ + throw InvalidHexString(0); + } + auto data = std::vector<uint8_t>(d_size, 0); + + char buf[2]; + for(int i=0; i<s_size; i++){ + + char c = hexString[i]; + bool char_from_range = (('0' <= c && c <='9') || ('A' <= c && c <= 'F') || ('a' <= c && c<= 'f')); + if (!char_from_range){ + throw InvalidHexString(c); + } + buf[i%2] = c; + if (i%2==1){ + data[i/2] = strtoul(buf, NULL, 16) & 0xFF; + } + } + return data; +}; + std::string hexdump(const char *p, size_t size, bool print_header) { std::stringstream out; char formatbuf[128]; |