{ "rounds,salt,expand: %{sha1;rounds=1000,salt=%{other-value}:value} %{other-value}", "rounds,salt,expand: 49a598ee110af615e175f2e4511cc5d7ccff96ab other-example" },
{ "format: %4.8{sha1:value}", "format: 9c272973" },
{ "base64: %{sha1;format=base64:value}", "base64: w0mcJylzCn+AfvuGdqkty2+KP48=" },
+ { "base64url: %{sha1;format=base64url:value}", "base64url: w0mcJylzCn-AfvuGdqkty2-KP48" },
};
static const struct var_expand_func_table func_table[] = {
enum {
FORMAT_HEX,
FORMAT_HEX_UC,
- FORMAT_BASE64
+ FORMAT_BASE64,
+ FORMAT_BASE64_URL,
} format = FORMAT_HEX;
const char *p = strchr(key, ';');
format = FORMAT_HEX_UC;
} else if (strcmp(value, "base64") == 0) {
format = FORMAT_BASE64;
+ } else if (strcmp(value, "base64url") == 0) {
+ format = FORMAT_BASE64_URL;
} else {
*error_r = t_strdup_printf(
"Cannot parse hash arguments:"
*result_r = str_c(dest);
return 1;
}
+ case FORMAT_BASE64_URL: {
+ string_t *dest = t_str_new(64);
+ base64url_encode(BASE64_ENCODE_FLAG_NO_PADDING, 0,
+ tmp->data, tmp->used, dest);
+ *result_r = str_c(dest);
+ return 1;
+ }
}
i_unreached();