summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNiels Möller <nisse@lysator.liu.se>2015-02-10 22:12:59 +0100
committerNiels Möller <nisse@lysator.liu.se>2015-02-10 22:12:59 +0100
commite172645c99c04fd7618654acb3611b0b1d7c5a77 (patch)
tree1364b3fc8ff9598d473a334fcbdc2ea63677f76b
parente6d4db6a9da6bc1bc59c6cb471e53d5e1a236966 (diff)
downloadnettle-e172645c99c04fd7618654acb3611b0b1d7c5a77.tar.gz
New struct nettle_armor for base64url.
-rw-r--r--ChangeLog8
-rw-r--r--Makefile.in2
-rw-r--r--base64url-meta.c63
-rw-r--r--nettle-meta-armors.c1
-rw-r--r--nettle-meta.h1
-rw-r--r--testsuite/base64-test.c11
-rw-r--r--testsuite/meta-armor-test.c3
7 files changed, 87 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 091d6d40..a44da8f0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
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
diff --git a/Makefile.in b/Makefile.in
index e861b23a..abba3cd9 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -81,7 +81,7 @@ nettle_SOURCES = aes-decrypt-internal.c aes-decrypt.c \
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 \
diff --git a/base64url-meta.c b/base64url-meta.c
new file mode 100644
index 00000000..af4afc95
--- /dev/null
+++ b/base64url-meta.c
@@ -0,0 +1,63 @@
+/* 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);
diff --git a/nettle-meta-armors.c b/nettle-meta-armors.c
index 04081eab..9b6c341e 100644
--- a/nettle-meta-armors.c
+++ b/nettle-meta-armors.c
@@ -38,6 +38,7 @@
const struct nettle_armor * const nettle_armors[] = {
&nettle_base64,
+ &nettle_base64url,
&nettle_base16,
NULL
};
diff --git a/nettle-meta.h b/nettle-meta.h
index 2d8d5b84..14b5e48e 100644
--- a/nettle-meta.h
+++ b/nettle-meta.h
@@ -220,6 +220,7 @@ struct nettle_armor
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
diff --git a/testsuite/base64-test.c b/testsuite/base64-test.c
index 9fe544f9..bdf8415a 100644
--- a/testsuite/base64-test.c
+++ b/testsuite/base64-test.c
@@ -91,8 +91,19 @@ test_main(void)
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";
diff --git a/testsuite/meta-armor-test.c b/testsuite/meta-armor-test.c
index 368ac2e3..406c8d01 100644
--- a/testsuite/meta-armor-test.c
+++ b/testsuite/meta-armor-test.c
@@ -3,7 +3,8 @@
const char* armors[] = {
"base16",
- "base64"
+ "base64",
+ "base64url",
};
void