#include <freeradius-devel/base64.h>
#include <freeradius-devel/md5.h>
#include <freeradius-devel/sha1.h>
+#include <freeradius-devel/value.h>
#ifdef HAVE_OPENSSL_EVP_H
# include <openssl/evp.h>
#endif
*
* Example: "%{base64:foo}" == "Zm9v"
*/
-static ssize_t base64_xlat(UNUSED TALLOC_CTX *ctx, char **out, size_t outlen,
- UNUSED void const *mod_inst, UNUSED void const *xlat_inst,
- REQUEST *request, char const *fmt)
+static xlat_action_t xlat_base64(TALLOC_CTX *ctx, fr_cursor_t *out,
+ REQUEST *request, UNUSED void const *xlat_inst, UNUSED void *xlat_thread_inst,
+ fr_value_box_t **in)
{
- size_t inlen;
- uint8_t *p;
- TALLOC_CTX *tmp_ctx = NULL;
- ssize_t ret;
-
- VALUE_FROM_FMT(tmp_ctx, p, inlen, request, fmt);
-
+ size_t alen;
+ ssize_t elen;
+ char *buff;
+ fr_value_box_t *vb;
/*
- * We can accurately calculate the length of the output string
- * if it's larger than outlen, the output would be useless so abort.
+ * If there's no input, there's no output
*/
- if ((FR_BASE64_ENC_LENGTH(inlen) + 1) > outlen) {
- REDEBUG("xlat failed");
+ if (!in) return XLAT_ACTION_DONE;
- talloc_free(tmp_ctx);
+ if (fr_value_box_list_concat(ctx, *in, in, FR_TYPE_OCTETS, true) < 0) {
+ RPEDEBUG("Failed concatenating input");
+ return XLAT_ACTION_FAIL;
+ }
- return -1;
+ MEM(vb = fr_value_box_alloc_null(ctx));
+ alen = FR_BASE64_ENC_LENGTH((*in)->vb_length);
+ MEM(buff = talloc_array(ctx, char, alen + 1));
+
+ elen = fr_base64_encode(buff, alen + 1, (*in)->vb_octets, (*in)->vb_length);
+ if (elen < 0) {
+ RPEDEBUG("Base64 encoding failed");
+ talloc_free(vb);
+ return XLAT_ACTION_FAIL;
}
- ret = fr_base64_encode(*out, outlen, p, inlen);
- talloc_free(tmp_ctx);
+ rad_assert(elen <= alen);
- return ret;
+ if (fr_value_box_bstrsnteal(vb, vb, NULL, &buff, elen, false) < 0) {
+ RPEDEBUG("Failed assigning encoded data buffer to box");
+ talloc_free(vb);
+ return XLAT_ACTION_FAIL;
+ }
+
+ fr_cursor_append(out, vb);
+
+ return XLAT_ACTION_DONE;
}
/** Convert base64 to hex
buff = fr_value_box_list_asprint(result, *in, ",", '\0');
if (!buff) goto error;
- fr_value_box_strsteal(result, result, NULL, buff, fr_value_box_list_tainted(*in));
+ fr_value_box_bstrsteal(result, result, NULL, buff, fr_value_box_list_tainted(*in));
fr_cursor_insert(out, result);
xlat_register(NULL, "hmacsha1", hmac_sha1_xlat, NULL, NULL, 0, XLAT_DEFAULT_BUF_LEN, true);
xlat_register(NULL, "pairs", pairs_xlat, NULL, NULL, 0, XLAT_DEFAULT_BUF_LEN, true);
- xlat_register(NULL, "base64", base64_xlat, NULL, NULL, 0, XLAT_DEFAULT_BUF_LEN, true);
+
xlat_register(NULL, "base64tohex", base64_to_hex_xlat, NULL, NULL, 0, XLAT_DEFAULT_BUF_LEN, true);
xlat_register(NULL, "explode", explode_xlat, NULL, NULL, 0, XLAT_DEFAULT_BUF_LEN, true);
rad_assert(c != NULL);
c->internal = true;
+ xlat_async_register(NULL, "base64", xlat_base64, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
xlat_async_register(NULL, "concat", xlat_concat, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
xlat_async_register(NULL, "bin", xlat_bin, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
}
update request {
- &Tmp-String-0 := "%{base64:&Tmp-String-0}"
- &Tmp-String-1 := "%{base64:&Tmp-Octets-0}"
- &Tmp-String-2 := "%{base64:&Tmp-IP-Address-0}"
- &Tmp-String-3 := "%{base64:&Tmp-Date-0}"
- &Tmp-String-4 := "%{base64:&Tmp-Integer-0}"
- &Tmp-String-5 := "%{base64:&Tmp-Cast-Abinary}"
- &Tmp-String-6 := "%{base64:&Tmp-Cast-Ifid}"
- &Tmp-String-7 := "%{base64:&Tmp-Cast-IPv6Addr}"
- &Tmp-String-8 := "%{base64:&Tmp-Cast-IPv6Prefix}"
- &Tmp-String-9 := "%{base64:&Tmp-Cast-Byte}"
+ &Tmp-String-0 := "%{base64:%{Tmp-String-0}}"
+ &Tmp-String-1 := "%{base64:%{Tmp-Octets-0}}"
+ &Tmp-String-2 := "%{base64:%{Tmp-IP-Address-0}}"
+ &Tmp-String-3 := "%{base64:%{Tmp-Date-0}}"
+ &Tmp-String-4 := "%{base64:%{Tmp-Integer-0}}"
+ &Tmp-String-5 := "%{base64:%{Tmp-Cast-Abinary}}"
+ &Tmp-String-6 := "%{base64:%{Tmp-Cast-Ifid}}"
+ &Tmp-String-7 := "%{base64:%{Tmp-Cast-IPv6Addr}}"
+ &Tmp-String-8 := "%{base64:%{Tmp-Cast-IPv6Prefix}}"
+ &Tmp-String-9 := "%{base64:%{Tmp-Cast-Byte}}"
}
# String - bin 0x39383730
}
update request {
- &Tmp-String-0 := "%{base64:&Tmp-Cast-Short}"
- &Tmp-String-1 := "%{base64:&Tmp-Cast-Ether}"
- &Tmp-String-2 := "%{base64:&Tmp-Cast-Integer64}"
- &Tmp-String-3 := "%{base64:&Tmp-Cast-IPv4Prefix}"
+ &Tmp-String-0 := "%{base64:%{Tmp-Cast-Short}}"
+ &Tmp-String-1 := "%{base64:%{Tmp-Cast-Ether}}"
+ &Tmp-String-2 := "%{base64:%{Tmp-Cast-Integer64}}"
+ &Tmp-String-3 := "%{base64:%{Tmp-Cast-IPv4Prefix}}"
}
# short - bin 0x373b