return s;
}
+static int parse_nibble(char nibble) {
+ // Handle digits
+ if (nibble >= '0' && nibble <= '9')
+ return nibble - '0';
+
+ // Handle lowercase letters
+ if (nibble >= 'a' && nibble <= 'f')
+ return 10 + nibble - 'a';
+
+ // Handle uppercase letters
+ if (nibble >= 'A' && nibble <= 'F')
+ return 10 + nibble - 'A';
+
+ // Error
+ return -1;
+}
+
int __pakfire_unhexlify(unsigned char* dst, const size_t l, const char* src) {
- const char* p = src;
+ if (!src) {
+ errno = EINVAL;
+ return 1;
+ }
- for (unsigned int i = 0; i < l && *p; i++) {
- int r = sscanf(p, "%02X", (unsigned int*)&dst[i]);
- if (r != 1)
+ // Determine input length
+ const size_t length = strlen(src);
+
+ for (unsigned int i = 0, j = 0; i < length && j < l; i += 2, j++) {
+ int h = parse_nibble(src[i]);
+ int l = parse_nibble(src[i+1]);
+
+ // Check for invalid input
+ if (h < 0 || l < 0) {
+ errno = EINVAL;
return 1;
+ }
- p += 2;
+ // Store result
+ dst[j] = h << 4 | l;
}
return 0;