Branch data Line data Source code
1 : : /* 2 : : * Copyright (c) 2019 Nordic Semiconductor ASA 3 : : * 4 : : * SPDX-License-Identifier: Apache-2.0 5 : : */ 6 : : 7 : : #include <stddef.h> 8 : : #include <zephyr/types.h> 9 : : #include <errno.h> 10 : : #include <sys/util.h> 11 : : 12 : 0 : int char2hex(char c, uint8_t *x) 13 : : { 14 [ # # # # ]: 0 : if (c >= '0' && c <= '9') { 15 : 0 : *x = c - '0'; 16 [ # # # # ]: 0 : } else if (c >= 'a' && c <= 'f') { 17 : 0 : *x = c - 'a' + 10; 18 [ # # # # ]: 0 : } else if (c >= 'A' && c <= 'F') { 19 : 0 : *x = c - 'A' + 10; 20 : : } else { 21 : 0 : return -EINVAL; 22 : : } 23 : : 24 : 0 : return 0; 25 : : } 26 : : 27 : 0 : int hex2char(uint8_t x, char *c) 28 : : { 29 [ # # ]: 0 : if (x <= 9) { 30 : 0 : *c = x + '0'; 31 [ # # ]: 0 : } else if (x <= 15) { 32 : 0 : *c = x - 10 + 'a'; 33 : : } else { 34 : 0 : return -EINVAL; 35 : : } 36 : : 37 : 0 : return 0; 38 : : } 39 : : 40 : 0 : size_t bin2hex(const uint8_t *buf, size_t buflen, char *hex, size_t hexlen) 41 : : { 42 [ # # ]: 0 : if (hexlen < (buflen * 2 + 1)) { 43 : 0 : return 0; 44 : : } 45 : : 46 [ # # ]: 0 : for (size_t i = 0; i < buflen; i++) { 47 [ # # ]: 0 : if (hex2char(buf[i] >> 4, &hex[2 * i]) < 0) { 48 : 0 : return 0; 49 : : } 50 [ # # ]: 0 : if (hex2char(buf[i] & 0xf, &hex[2 * i + 1]) < 0) { 51 : 0 : return 0; 52 : : } 53 : : } 54 : : 55 : 0 : hex[2 * buflen] = '\0'; 56 : 0 : return 2 * buflen; 57 : : } 58 : : 59 : 0 : size_t hex2bin(const char *hex, size_t hexlen, uint8_t *buf, size_t buflen) 60 : : { 61 : : uint8_t dec; 62 : : 63 [ # # ]: 0 : if (buflen < hexlen / 2 + hexlen % 2) { 64 : 0 : return 0; 65 : : } 66 : : 67 : : /* if hexlen is uneven, insert leading zero nibble */ 68 [ # # ]: 0 : if (hexlen % 2) { 69 [ # # ]: 0 : if (char2hex(hex[0], &dec) < 0) { 70 : 0 : return 0; 71 : : } 72 : 0 : buf[0] = dec; 73 : 0 : hex++; 74 : 0 : buf++; 75 : : } 76 : : 77 : : /* regular hex conversion */ 78 [ # # ]: 0 : for (size_t i = 0; i < hexlen / 2; i++) { 79 [ # # ]: 0 : if (char2hex(hex[2 * i], &dec) < 0) { 80 : 0 : return 0; 81 : : } 82 : 0 : buf[i] = dec << 4; 83 : : 84 [ # # ]: 0 : if (char2hex(hex[2 * i + 1], &dec) < 0) { 85 : 0 : return 0; 86 : : } 87 : 0 : buf[i] += dec; 88 : : } 89 : : 90 : 0 : return hexlen / 2 + hexlen % 2; 91 : : }