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 <zephyr/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 : : return -EINVAL; 22 : : } 23 : : 24 : : return 0; 25 : : } 26 : : 27 : 0 : int hex2char(uint8_t x, char *c) 28 : : { 29 [ # # ]: 0 : if (x <= 9) { 30 : 0 : *c = x + (char)'0'; 31 [ # # ]: 0 : } else if (x <= 15) { 32 : 0 : *c = x - 10 + (char)'a'; 33 : : } else { 34 : : return -EINVAL; 35 : : } 36 : : 37 : : 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 * 2U) + 1U)) { 43 : : return 0; 44 : : } 45 : : 46 [ # # ]: 0 : for (size_t i = 0; i < buflen; i++) { 47 [ # # ]: 0 : if (hex2char(buf[i] >> 4, &hex[2U * i]) < 0) { 48 : : return 0; 49 : : } 50 [ # # ]: 0 : if (hex2char(buf[i] & 0xf, &hex[2U * i + 1U]) < 0) { 51 : : return 0; 52 : : } 53 : : } 54 : : 55 : 0 : hex[2U * buflen] = '\0'; 56 : 0 : return 2U * buflen; 57 : : } 58 : : 59 : 0 : size_t hex2bin(const char *hex, size_t hexlen, uint8_t *buf, size_t buflen) 60 : : { 61 : 0 : uint8_t dec; 62 : : 63 [ # # ]: 0 : if (buflen < (hexlen / 2U + hexlen % 2U)) { 64 : : return 0; 65 : : } 66 : : 67 : : /* if hexlen is uneven, insert leading zero nibble */ 68 [ # # ]: 0 : if ((hexlen % 2U) != 0) { 69 [ # # ]: 0 : if (char2hex(hex[0], &dec) < 0) { 70 : : 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 / 2U); i++) { 79 [ # # ]: 0 : if (char2hex(hex[2U * i], &dec) < 0) { 80 : : return 0; 81 : : } 82 : 0 : buf[i] = dec << 4; 83 : : 84 [ # # ]: 0 : if (char2hex(hex[2U * i + 1U], &dec) < 0) { 85 : : return 0; 86 : : } 87 : 0 : buf[i] += dec; 88 : : } 89 : : 90 : : return hexlen / 2U + hexlen % 2U; 91 : : }