/** * @brief Encode string as base64 * * Example: "%{tobase64:foo}" == "Zm9v" */ static size_t base64_xlat(UNUSED void *instance, UNUSED REQUEST *request, char const *fmt, char *out, size_t outlen) { ssize_t len; len = strlen(fmt); /* * We can accurately calculate the length of the output string * if it's larger than outlen, the output would be useless so abort. */ if ((len < 0) || ((FR_BASE64_ENC_LENGTH(len) + 1) > (ssize_t) outlen)) { REDEBUG("xlat failed."); *out = '\0'; return 0; } return fr_base64_encode((const uint8_t *) fmt, len, out, outlen); }
/** * @brief Encode string as base64 * * Example: "%{tobase64:foo}" == "Zm9v" */ static size_t base64_xlat(UNUSED void *instance, REQUEST *request, const char *fmt, char *out, size_t outlen) { size_t len; char buffer[1024]; len = radius_xlat(buffer, sizeof(buffer), fmt, request, NULL, NULL); /* * We can accurately calculate the length of the output string * if it's larger than outlen, the output would be useless so abort. */ if (!len || ((FR_BASE64_ENC_LENGTH(len) + 1) > outlen)) { RDEBUGE("xlat failed."); *out = '\0'; return 0; } return fr_base64_encode((uint8_t *) buffer, len, out, outlen); }
/** * @brief Print data as base64, not as VALUE */ static size_t xlat_base64(UNUSED void *instance, REQUEST *request, char *fmt, char *out, size_t outlen, UNUSED RADIUS_ESCAPE_STRING func) { VALUE_PAIR *vp; uint8_t buffer[MAX_STRING_LEN]; ssize_t ret; size_t len; size_t enc; while (isspace((int) *fmt)) fmt++; if (!radius_get_vp(request, fmt, &vp) || !vp) { *out = '\0'; return 0; } ret = rad_vp2data(vp, buffer, sizeof(buffer)); if (ret < 0) { *out = 0; return 0; } len = (size_t) ret; enc = FR_BASE64_ENC_LENGTH(len); /* * Don't truncate the data. */ if (outlen < (enc + 1)) { *out = 0; return 0; } fr_base64_encode(buffer, len, out, outlen); return enc; }
/** Encode string or attribute as base64 * * Example: "%{base64:foo}" == "Zm9v" */ static ssize_t base64_xlat(UNUSED void *instance, UNUSED REQUEST *request, char const *fmt, char *out, size_t outlen) { ssize_t inlen; uint8_t const *p; inlen = xlat_fmt_to_ref(&p, request, fmt); if (inlen < 0) { return -1; } /* * We can accurately calculate the length of the output string * if it's larger than outlen, the output would be useless so abort. */ if ((inlen < 0) || ((FR_BASE64_ENC_LENGTH(inlen) + 1) > (ssize_t) outlen)) { REDEBUG("xlat failed"); *out = '\0'; return -1; } return fr_base64_encode(out, outlen, p, inlen); }
/** * @brief Encode string as base64 * * Example: "%{tobase64:foo}" == "Zm9v" */ static size_t base64_xlat(UNUSED void *instance, REQUEST *request, char *fmt, char *out, size_t outlen, UNUSED RADIUS_ESCAPE_STRING func) { size_t len; char buffer[1024]; len = radius_xlat(buffer, sizeof(buffer), fmt, request, func); /* * We can accurately calculate the length of the output string * if it's larger than outlen, the output would be useless so abort. */ if (!len || ((FR_BASE64_ENC_LENGTH(len) + 1) > outlen)) { radlog(L_ERR, "rlm_expr: xlat failed."); *out = '\0'; return 0; } fr_base64_encode((uint8_t *) buffer, len, out, outlen); return strlen(out); }