2015-02-10 Niels Möller <nisse@lysator.liu.se>
+ * base64url-meta.c (nettle_base64url): New file.
+ * nettle-meta.h (nettle_base64url): Declare it.
+ * nettle-meta-armors.c (nettle_armors): Added nettle_base64url.
+ * testsuite/meta-armor-test.c: Updated testcase.
+ * testsuite/base64-test.c (test_main): Additional tests, using
+ nettle_base64url.
+ * Makefile.in (nettle_SOURCES): Added base64url-meta.c.
+
Base-64 generalization to support RFC4648 URL safe alphabet,
contributed by Amos Jeffries.
* base64url-decode.c (base64url_decode_init): New file and
arctwo.c arctwo-meta.c blowfish.c \
base16-encode.c base16-decode.c base16-meta.c \
base64-encode.c base64-decode.c base64-meta.c \
- base64url-encode.c base64url-decode.c \
+ base64url-encode.c base64url-decode.c base64url-meta.c \
buffer.c buffer-init.c \
camellia-crypt-internal.c camellia-table.c \
camellia-absorb.c camellia-invert-key.c \
--- /dev/null
+/* base64url-meta.c
+
+ Copyright (C) 2015 Niels Möller
+
+ This file is part of GNU Nettle.
+
+ GNU Nettle is free software: you can redistribute it and/or
+ modify it under the terms of either:
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at your
+ option) any later version.
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your
+ option) any later version.
+
+ or both in parallel, as here.
+
+ GNU Nettle is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see http://www.gnu.org/licenses/.
+*/
+
+#if HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "nettle-meta.h"
+
+#include "base64.h"
+
+/* Same as the macros with the same name */
+static nettle_armor_length_func base64url_encode_length;
+static size_t
+base64url_encode_length(size_t length)
+{
+ return BASE64_ENCODE_LENGTH(length);
+}
+
+static nettle_armor_length_func base64url_decode_length;
+static size_t
+base64url_decode_length(size_t length)
+{
+ return BASE64_DECODE_LENGTH(length);
+}
+
+#define base64url_encode_ctx base64_encode_ctx
+#define base64url_encode_update base64_encode_update
+#define base64url_encode_final base64_encode_final
+#define base64url_decode_ctx base64_decode_ctx
+#define base64url_decode_update base64_decode_update
+#define base64url_decode_final base64_decode_final
+
+const struct nettle_armor nettle_base64url
+= _NETTLE_ARMOR(base64url, BASE64);
const struct nettle_armor * const nettle_armors[] = {
&nettle_base64,
+ &nettle_base64url,
&nettle_base16,
NULL
};
extern const struct nettle_armor * const nettle_armors[];
extern const struct nettle_armor nettle_base64;
+extern const struct nettle_armor nettle_base64url;
extern const struct nettle_armor nettle_base16;
#ifdef __cplusplus
test_armor(&nettle_base64, 4, "Hell", "SGVsbA==");
test_armor(&nettle_base64, 5, "Hello", "SGVsbG8=");
test_armor(&nettle_base64, 6, "Hello", "SGVsbG8A");
+ test_armor(&nettle_base64, 9, "Hello?>>>", "SGVsbG8/Pj4+");
test_armor(&nettle_base64, 4, "\xff\xff\xff\xff", "/////w==");
+ test_armor(&nettle_base64url, 0, "", "");
+ test_armor(&nettle_base64url, 1, "H", "SA==");
+ test_armor(&nettle_base64url, 2, "He", "SGU=");
+ test_armor(&nettle_base64url, 3, "Hel", "SGVs");
+ test_armor(&nettle_base64url, 4, "Hell", "SGVsbA==");
+ test_armor(&nettle_base64url, 5, "Hello", "SGVsbG8=");
+ test_armor(&nettle_base64url, 6, "Hello", "SGVsbG8A");
+ test_armor(&nettle_base64url, 9, "Hello?>>>", "SGVsbG8_Pj4-");
+ test_armor(&nettle_base64url, 4, "\xff\xff\xff\xff", "_____w==");
+
{
/* Test overlapping areas */
uint8_t buffer[] = "Helloxxxx";
const char* armors[] = {
"base16",
- "base64"
+ "base64",
+ "base64url",
};
void