Update #4267. --- cpukit/include/rtems/score/io.h | 51 +++++++++++++++++++++++---- cpukit/score/src/iobase64.c | 56 ++++++++++++++++++++---------- testsuites/sptests/spprintk/init.c | 12 +++++++ 3 files changed, 94 insertions(+), 25 deletions(-)
diff --git a/cpukit/include/rtems/score/io.h b/cpukit/include/rtems/score/io.h index f851d30b8a..f7b576fddd 100644 --- a/cpukit/include/rtems/score/io.h +++ b/cpukit/include/rtems/score/io.h @@ -64,15 +64,21 @@ int _IO_Vprintf( * After word length of output characters produced by the encoding a word break * is produced. * - * @param put_char The put character function. - * @param arg The argument passed to the put character function. - * @param src The pointer to the source buffer begin. - * @param srclen The length of the source buffer in bytes. - * @param wordbreak The word break string. - * @param wordlen The word length in bytes. If the word length is less than + * @param put_char is the put character function used to output the encoded + * source buffer. + * + * @param arg is the argument passed to the put character function. + * + * @param src is the pointer to the source buffer begin. + * + * @param srclen is the length of the source buffer in bytes. + * + * @param wordbreak is the word break string. + * + * @param wordlen is the word length in bytes. If the word length is less than * four, then a word length of four will be used. * - * @return The count of output characters. + * @return Returns the count of output characters. */ int _IO_Base64( IO_Put_char put_char, @@ -83,6 +89,37 @@ int _IO_Base64( int wordlen ); +/** + * @brief Outputs the source buffer in base64url encoding. + * + * After word length of output characters produced by the encoding a word break + * is produced. + * + * @param put_char is the put character function used to output the encoded + * source buffer. + * + * @param arg is the argument passed to the put character function. + * + * @param src is the pointer to the source buffer begin. + * + * @param srclen is the length of the source buffer in bytes. + * + * @param wordbreak is the word break string. + * + * @param wordlen is the word length in bytes. If the word length is less than + * four, then a word length of four will be used. + * + * @return Returns the count of output characters. + */ +int _IO_Base64url( + IO_Put_char put_char, + void *arg, + const void *src, + size_t len, + const char *wordbreak, + int wordlen +); + /** @} */ #ifdef __cplusplus diff --git a/cpukit/score/src/iobase64.c b/cpukit/score/src/iobase64.c index bbf7658c2a..38bc2cd22c 100644 --- a/cpukit/score/src/iobase64.c +++ b/cpukit/score/src/iobase64.c @@ -6,11 +6,11 @@ * @ingroup RTEMSScoreIO * * @brief This source file contains the implementation of - * _IO_Base64(). + * _IO_Base64() and _IO_Base64url(). */ /* - * Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de) + * Copyright (C) 2020, 2021 embedded brains GmbH (http://www.embedded-brains.de) * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1998-2001, 2003 Internet Software Consortium. * @@ -29,17 +29,15 @@ #include <rtems/score/io.h> -static const char base64[] = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; - -static void _IO_Put(int c, void *arg, IO_Put_char put_char) +static void +_IO_Put(int c, void *arg, IO_Put_char put_char) { (*put_char)(c, arg); } -int -_IO_Base64(IO_Put_char put_char, void *arg, const void *src, size_t srclen, - const char *wordbreak, int wordlen) +static int +_IO_Base64_with_encoding(IO_Put_char put_char, void *arg, const void *src, + size_t srclen, const char *wordbreak, int wordlen, const char *encoding) { unsigned int loops = 0; const unsigned char *in = src; @@ -50,12 +48,12 @@ _IO_Base64(IO_Put_char put_char, void *arg, const void *src, size_t srclen, } while (srclen > 2) { - _IO_Put(base64[(in[0]>>2)&0x3f], arg, put_char); - _IO_Put(base64[((in[0]<<4)&0x30)| + _IO_Put(encoding[(in[0]>>2)&0x3f], arg, put_char); + _IO_Put(encoding[((in[0]<<4)&0x30)| ((in[1]>>4)&0x0f)], arg, put_char); - _IO_Put(base64[((in[1]<<2)&0x3c)| + _IO_Put(encoding[((in[1]<<2)&0x3c)| ((in[2]>>6)&0x03)], arg, put_char); - _IO_Put(base64[in[2]&0x3f], arg, put_char); + _IO_Put(encoding[in[2]&0x3f], arg, put_char); in += 3; srclen -= 3; out += 4; @@ -74,18 +72,40 @@ _IO_Base64(IO_Put_char put_char, void *arg, const void *src, size_t srclen, } } if (srclen == 2) { - _IO_Put(base64[(in[0]>>2)&0x3f], arg, put_char); - _IO_Put(base64[((in[0]<<4)&0x30)| + _IO_Put(encoding[(in[0]>>2)&0x3f], arg, put_char); + _IO_Put(encoding[((in[0]<<4)&0x30)| ((in[1]>>4)&0x0f)], arg, put_char); - _IO_Put(base64[((in[1]<<2)&0x3c)], arg, put_char); + _IO_Put(encoding[((in[1]<<2)&0x3c)], arg, put_char); _IO_Put('=', arg, put_char); out += 4; } else if (srclen == 1) { - _IO_Put(base64[(in[0]>>2)&0x3f], arg, put_char); - _IO_Put(base64[((in[0]<<4)&0x30)], arg, put_char); + _IO_Put(encoding[(in[0]>>2)&0x3f], arg, put_char); + _IO_Put(encoding[((in[0]<<4)&0x30)], arg, put_char); _IO_Put('=', arg, put_char); _IO_Put('=', arg, put_char); out += 4; } return out; } + +static const char base64[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; + +int +_IO_Base64(IO_Put_char put_char, void *arg, const void *src, size_t srclen, + const char *wordbreak, int wordlen) +{ + return _IO_Base64_with_encoding(put_char, arg, src, srclen, wordbreak, + wordlen, base64); +} + +static const char base64url[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_="; + +int +_IO_Base64url(IO_Put_char put_char, void *arg, const void *src, size_t srclen, + const char *wordbreak, int wordlen) +{ + return _IO_Base64_with_encoding(put_char, arg, src, srclen, wordbreak, + wordlen, base64url); +} diff --git a/testsuites/sptests/spprintk/init.c b/testsuites/sptests/spprintk/init.c index 0c0e4c7fb8..ffabb9ae91 100644 --- a/testsuites/sptests/spprintk/init.c +++ b/testsuites/sptests/spprintk/init.c @@ -242,6 +242,17 @@ static void test_io_base64( test_context *ctx ) rtems_test_assert( n == 0 ); } +static void test_io_base64url( test_context *ctx ) +{ + unsigned char buf[] = { 0, 0, 62, 0, 0, 63 }; + int n; + + clear( ctx ); + n = _IO_Base64url( put_char, ctx, buf, sizeof( buf ), "\n", 0 ); + rtems_test_assert( n == 9 ); + rtems_test_assert( strcmp( ctx->buf, "AAA-\nAAA_" ) == 0 ); +} + static rtems_task Init( rtems_task_argument argument ) @@ -257,6 +268,7 @@ static rtems_task Init( do_getchark(); test_io_printf(&test_instance); test_io_base64(&test_instance); + test_io_base64url(&test_instance); TEST_END(); rtems_test_exit( 0 ); -- 2.26.2 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel