/** * @brief Convert base64 to hex * * Example: "%{base64tohex:Zm9v}" == "666f6f" */ static size_t base64_to_hex_xlat(UNUSED void *instance, REQUEST *request, char *fmt, char *out, size_t outlen, UNUSED RADIUS_ESCAPE_STRING func) { char buffer[1024]; char decbuf[1024]; size_t declen = sizeof(decbuf); size_t len; while (isspace((int) *fmt)) fmt++; len = radius_xlat(buffer, sizeof(buffer), fmt, request, func); if (!len) { radlog(L_ERR, "rlm_expr: xlat failed."); *out = '\0'; return 0; } if (!fr_base64_decode(buffer, len, decbuf, &declen)) { radlog(L_ERR, "rlm_expr: base64 string invalid"); *out = '\0'; return 0; } if ((size_t)((declen * 2) + 1) > outlen) { radlog(L_ERR, "rlm_expr: Base64 conversion failed, " "output buffer exhausted, needed %zd bytes, " "have %zd bytes", (declen * 2) + 1, outlen); } fr_bin2hex(decbuf, out, declen); return declen * 2; }
/** * @brief Convert base64 to hex * * Example: "%{base64tohex:Zm9v}" == "666f6f" */ static size_t base64_to_hex_xlat(UNUSED void *instance, UNUSED REQUEST *request, char const *fmt, char *out, size_t outlen) { uint8_t decbuf[1024], *p; ssize_t declen; size_t freespace = outlen; ssize_t len = strlen(fmt); *out = '\0'; declen = fr_base64_decode(fmt, len, decbuf, sizeof(decbuf)); if (declen < 0) { REDEBUG("Base64 string invalid"); return 0; } p = decbuf; while ((declen-- > 0) && (--freespace > 0)) { if (freespace < 3) { break; } snprintf(out, 3, "%02x", *p++); /* Already decremented */ freespace -= 1; out += 2; } return outlen - freespace; }
/** * @brief Convert base64 to hex * * Example: "%{base64tohex:Zm9v}" == "666f6f" */ static size_t base64_to_hex_xlat(UNUSED void *instance, REQUEST *request, const char *fmt, char *out, size_t outlen) { char buffer[1024]; uint8_t decbuf[1024], *p; ssize_t declen; size_t freespace = outlen; size_t len; len = radius_xlat(buffer, sizeof(buffer), fmt, request, NULL, NULL); if (!len) { RDEBUGE("xlat failed."); *out = '\0'; return 0; } declen = fr_base64_decode(buffer, len, decbuf, sizeof(decbuf)); if (declen < 0) { RDEBUGE("base64 string invalid"); *out = '\0'; return 0; } p = decbuf; while ((declen-- > 0) && (--freespace > 0)) { if (freespace < 3) break; snprintf(out, 3, "%02x", *p++); /* Already decremented */ freespace -= 1; out += 2; } return outlen - freespace; }
/** Convert base64 to hex * * Example: "%{base64tohex:Zm9v}" == "666f6f" */ static ssize_t base64_to_hex_xlat(UNUSED void *instance, UNUSED REQUEST *request, char const *fmt, char *out, size_t outlen) { uint8_t decbuf[1024]; ssize_t declen; ssize_t len = strlen(fmt); *out = '\0'; declen = fr_base64_decode(decbuf, sizeof(decbuf), fmt, len); if (declen < 0) { REDEBUG("Base64 string invalid"); return -1; } if ((size_t)((declen * 2) + 1) > outlen) { REDEBUG("Base64 conversion failed, output buffer exhausted, needed %zd bytes, have %zd bytes", (declen * 2) + 1, outlen); return -1; } return fr_bin2hex(out, decbuf, declen); }