From e172645c99c04fd7618654acb3611b0b1d7c5a77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20M=C3=B6ller?= <nisse@lysator.liu.se> Date: Tue, 10 Feb 2015 22:12:59 +0100 Subject: [PATCH] New struct nettle_armor for base64url. --- ChangeLog | 8 +++++ Makefile.in | 2 +- base64url-meta.c | 63 +++++++++++++++++++++++++++++++++++++ nettle-meta-armors.c | 1 + nettle-meta.h | 1 + testsuite/base64-test.c | 11 +++++++ testsuite/meta-armor-test.c | 3 +- 7 files changed, 87 insertions(+), 2 deletions(-) create mode 100644 base64url-meta.c 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 -- GitLab