diff --git a/ChangeLog b/ChangeLog index 091d6d4031f0017e232c73bbf49ac1d4662a5614..a44da8f08ab0f76bab78959a550a348f3f97c266 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 e861b23a0bed03b69e564f7fa8cd8f8ba1befa96..abba3cd94c35cbcaf4ce34eb4bd5445a66f19b47 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 0000000000000000000000000000000000000000..af4afc951371a93eb88fd999e1e3552a9f0f64c8 --- /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 04081eab68fd07667b1b7c30dcb00491fc2fe6d4..9b6c341e22a7d4c573aa74ed208df45ec424b172 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 2d8d5b84b8fb65e4975b42fdb36a0e1a1e9ef48f..14b5e48ed0c166c1fa30059f5c1235c69127c4d4 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 9fe544f9695b58e5283240e568861ad2afd83629..bdf8415a9fdd21b3478e6fc1fa3fc5fa1c820d17 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 368ac2e3bdb7eaa16acaf467fedaa9773c8dbcb1..406c8d0197edcae1f891aba43bc5df06483d043c 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