--- .../iobase64.c => base64/base64-encode.c} | 48 +++---- cpukit/include/rtems/base64.h | 125 ++++++++++++++++++ cpukit/include/rtems/dev/io.h | 62 --------- cpukit/libtest/gcovdumpinfobase64.c | 6 +- cpukit/libtest/t-test-hash-sha256.c | 5 +- cpukit/libtrace/record/record-dump-base64.c | 7 +- cpukit/libtrace/record/record-dump-zbase64.c | 9 +- cpukit/score/src/hash.c | 4 +- spec/build/cpukit/librtemscpu.yml | 3 +- testsuites/sptests/spprintk/init.c | 23 ++-- 10 files changed, 181 insertions(+), 111 deletions(-) rename cpukit/{dev/iobase64.c => base64/base64-encode.c} (61%) create mode 100644 cpukit/include/rtems/base64.h
diff --git a/cpukit/dev/iobase64.c b/cpukit/base64/base64-encode.c similarity index 61% rename from cpukit/dev/iobase64.c rename to cpukit/base64/base64-encode.c index 0ac70d3ddb..e72657cc5f 100644 --- a/cpukit/dev/iobase64.c +++ b/cpukit/base64/base64-encode.c @@ -3,14 +3,14 @@ /** * @file * - * @ingroup RTEMSDeviceIO + * @ingroup RTEMSImplBase64 * * @brief This source file contains the implementation of - * _IO_Base64() and _IO_Base64url(). + * _Base64_Encode() and _Base64url_Encode(). */ /* - * Copyright (C) 2020, 2021 embedded brains GmbH & Co. KG + * Copyright (C) 2020, 2024 embedded brains GmbH & Co. KG * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1998-2001, 2003 Internet Software Consortium. * @@ -27,16 +27,16 @@ * PERFORMANCE OF THIS SOFTWARE. */ -#include <rtems/dev/io.h> +#include <rtems/base64.h> static void -_IO_Put(int c, void *arg, IO_Put_char put_char) +_Base64_Put(int c, void *arg, IO_Put_char put_char) { (*put_char)(c, arg); } static int -_IO_Base64_with_encoding(IO_Put_char put_char, void *arg, const void *src, +_Base64_Do_encode(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; @@ -48,12 +48,12 @@ _IO_Base64_with_encoding(IO_Put_char put_char, void *arg, const void *src, } while (srclen > 2) { - _IO_Put(encoding[(in[0]>>2)&0x3f], arg, put_char); - _IO_Put(encoding[((in[0]<<4)&0x30)| + _Base64_Put(encoding[(in[0]>>2)&0x3f], arg, put_char); + _Base64_Put(encoding[((in[0]<<4)&0x30)| ((in[1]>>4)&0x0f)], arg, put_char); - _IO_Put(encoding[((in[1]<<2)&0x3c)| + _Base64_Put(encoding[((in[1]<<2)&0x3c)| ((in[2]>>6)&0x03)], arg, put_char); - _IO_Put(encoding[in[2]&0x3f], arg, put_char); + _Base64_Put(encoding[in[2]&0x3f], arg, put_char); in += 3; srclen -= 3; out += 4; @@ -65,24 +65,24 @@ _IO_Base64_with_encoding(IO_Put_char put_char, void *arg, const void *src, const char *w = wordbreak; loops = 0; while (*w != '\0') { - _IO_Put(*w, arg, put_char); + _Base64_Put(*w, arg, put_char); ++w; ++out; } } } if (srclen == 2) { - _IO_Put(encoding[(in[0]>>2)&0x3f], arg, put_char); - _IO_Put(encoding[((in[0]<<4)&0x30)| + _Base64_Put(encoding[(in[0]>>2)&0x3f], arg, put_char); + _Base64_Put(encoding[((in[0]<<4)&0x30)| ((in[1]>>4)&0x0f)], arg, put_char); - _IO_Put(encoding[((in[1]<<2)&0x3c)], arg, put_char); - _IO_Put('=', arg, put_char); + _Base64_Put(encoding[((in[1]<<2)&0x3c)], arg, put_char); + _Base64_Put('=', arg, put_char); out += 4; } else if (srclen == 1) { - _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); + _Base64_Put(encoding[(in[0]>>2)&0x3f], arg, put_char); + _Base64_Put(encoding[((in[0]<<4)&0x30)], arg, put_char); + _Base64_Put('=', arg, put_char); + _Base64_Put('=', arg, put_char); out += 4; } return out; @@ -92,10 +92,10 @@ static const char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; int -_IO_Base64(IO_Put_char put_char, void *arg, const void *src, size_t srclen, +_Base64_Encode(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, + return _Base64_Do_encode(put_char, arg, src, srclen, wordbreak, wordlen, base64); } @@ -103,9 +103,9 @@ 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) +_Base64url_Encode(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, + return _Base64_Do_encode(put_char, arg, src, srclen, wordbreak, wordlen, base64url); } diff --git a/cpukit/include/rtems/base64.h b/cpukit/include/rtems/base64.h new file mode 100644 index 0000000000..10c1e50840 --- /dev/null +++ b/cpukit/include/rtems/base64.h @@ -0,0 +1,125 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @ingroup RTEMSImplBase64 + * + * @brief This header file provides the interfaces of the + * @ref RTEMSImplBase64. + */ + +/* + * Copyright (C) 2020, 2024 embedded brains GmbH & Co. KG + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _RTEMS_BASE64_H +#define _RTEMS_BASE64_H + +#include <rtems/dev/io.h> + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/** + * @defgroup RTEMSImplBase64 Base64 Encoding and Decoding + * + * @ingroup RTEMSImpl + * + * @brief This group contains support functions for base64 and base64url + * encoding and decoding. + * + * @{ + */ + +/** + * @brief Outputs the source buffer in base64 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 _Base64_Encode( + IO_Put_char put_char, + void *arg, + const void *src, + size_t len, + const char *wordbreak, + 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 _Base64url_Encode( + IO_Put_char put_char, + void *arg, + const void *src, + size_t len, + const char *wordbreak, + int wordlen +); + +/** @} */ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _RTEMS_BASE64_H */ diff --git a/cpukit/include/rtems/dev/io.h b/cpukit/include/rtems/dev/io.h index 93f384a551..b8bcde7af4 100644 --- a/cpukit/include/rtems/dev/io.h +++ b/cpukit/include/rtems/dev/io.h @@ -106,68 +106,6 @@ int _IO_Vprintf( va_list ap ); -/** - * @brief Outputs the source buffer in base64 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_Base64( - IO_Put_char put_char, - void *arg, - const void *src, - size_t len, - const char *wordbreak, - 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 -); - /** * @brief Issues a couple of no-operation instructions. * diff --git a/cpukit/libtest/gcovdumpinfobase64.c b/cpukit/libtest/gcovdumpinfobase64.c index 0b8d901c69..f75d157ab9 100644 --- a/cpukit/libtest/gcovdumpinfobase64.c +++ b/cpukit/libtest/gcovdumpinfobase64.c @@ -43,6 +43,8 @@ #include <limits.h> #include <string.h> +#include <rtems/base64.h> + typedef struct { IO_Put_char put_char; void *arg; @@ -77,7 +79,7 @@ static void _Gcov_Base64_encode( int c, void *arg ) if ( index == RTEMS_ARRAY_SIZE( ctx->buf ) - 1 ) { index = 0; - _IO_Base64( + _Base64_Encode( _Gcov_Base64_put_char, ctx, ctx->buf, @@ -100,5 +102,5 @@ void _Gcov_Dump_info_base64( IO_Put_char put_char, void *arg ) ctx.put_char = put_char; ctx.arg = arg; _Gcov_Dump_info( _Gcov_Base64_encode, &ctx ); - _IO_Base64( _Gcov_Base64_put_char, &ctx, ctx.buf, ctx.index, NULL, INT_MAX ); + _Base64_Encode( _Gcov_Base64_put_char, &ctx, ctx.buf, ctx.index, NULL, INT_MAX ); } diff --git a/cpukit/libtest/t-test-hash-sha256.c b/cpukit/libtest/t-test-hash-sha256.c index b83285326b..79da4b5dfb 100644 --- a/cpukit/libtest/t-test-hash-sha256.c +++ b/cpukit/libtest/t-test-hash-sha256.c @@ -35,7 +35,6 @@ */ #include <rtems/test.h> -#include <rtems/dev/io.h> #include <limits.h> @@ -45,6 +44,8 @@ #include <openssl/sha.h> #endif +#include <rtems/base64.h> + typedef struct { SHA256_CTX sha256; T_putchar putchar; @@ -94,7 +95,7 @@ T_report_hash_sha256_finalize(void) ctx = &T_report_hash_sha256_instance; SHA256_Final(hash, &ctx->sha256); T_printf("Y:ReportHash:SHA256:"); - (void)_IO_Base64url(ctx->putchar, ctx->putchar_arg, hash, + (void)_Base64url_Encode(ctx->putchar, ctx->putchar_arg, hash, sizeof(hash), NULL, INT_MAX); T_printf("\n"); } diff --git a/cpukit/libtrace/record/record-dump-base64.c b/cpukit/libtrace/record/record-dump-base64.c index 8d403e9c27..9438041664 100644 --- a/cpukit/libtrace/record/record-dump-base64.c +++ b/cpukit/libtrace/record/record-dump-base64.c @@ -30,11 +30,12 @@ #endif #include <rtems/recorddump.h> -#include <rtems/dev/io.h> #include <limits.h> #include <string.h> +#include <rtems/base64.h> + typedef struct { IO_Put_char put_char; void *arg; @@ -76,7 +77,7 @@ static void chunk( void *arg, const void *data, size_t length ) if ( index == RTEMS_ARRAY_SIZE( ctx->buf ) - 1 ) { index = 0; - _IO_Base64( + _Base64_Encode( put_char, ctx, ctx->buf, @@ -94,7 +95,7 @@ static void chunk( void *arg, const void *data, size_t length ) static void flush( dump_context *ctx ) { - _IO_Base64( put_char, ctx, ctx->buf, ctx->index, NULL, INT_MAX ); + _Base64_Encode( put_char, ctx, ctx->buf, ctx->index, NULL, INT_MAX ); } void rtems_record_dump_base64( IO_Put_char put_char, void *arg ) diff --git a/cpukit/libtrace/record/record-dump-zbase64.c b/cpukit/libtrace/record/record-dump-zbase64.c index 0979e36a47..43bd0ecff8 100644 --- a/cpukit/libtrace/record/record-dump-zbase64.c +++ b/cpukit/libtrace/record/record-dump-zbase64.c @@ -30,11 +30,12 @@ #endif #include <rtems/recorddump.h> -#include <rtems/dev/io.h> #include <limits.h> #include <string.h> +#include <rtems/base64.h> + static void *dump_zalloc( void *opaque, unsigned items, unsigned size ) { rtems_record_dump_base64_zlib_context *ctx; @@ -96,7 +97,7 @@ static void chunk( void *arg, const void *data, size_t length ) ctx->stream.next_out = &ctx->buf[ 0 ]; ctx->stream.avail_out = sizeof( ctx->buf ); - _IO_Base64( put_char, ctx, ctx->buf, sizeof( ctx->buf ), NULL, INT_MAX ); + _Base64_Encode( put_char, ctx, ctx->buf, sizeof( ctx->buf ), NULL, INT_MAX ); } } } @@ -115,11 +116,11 @@ static void flush( rtems_record_dump_base64_zlib_context *ctx ) ctx->stream.next_out = &ctx->buf[ 0 ]; ctx->stream.avail_out = sizeof( ctx->buf ); - _IO_Base64( put_char, ctx, ctx->buf, sizeof( ctx->buf ), NULL, INT_MAX ); + _Base64_Encode( put_char, ctx, ctx->buf, sizeof( ctx->buf ), NULL, INT_MAX ); } } - _IO_Base64( + _Base64_Encode( put_char, ctx, ctx->buf, diff --git a/cpukit/score/src/hash.c b/cpukit/score/src/hash.c index 888a618751..0b9f127e54 100644 --- a/cpukit/score/src/hash.c +++ b/cpukit/score/src/hash.c @@ -39,7 +39,7 @@ #include <rtems/score/hash.h> #include <rtems/score/assert.h> -#include <rtems/dev/io.h> +#include <rtems/base64.h> #include <limits.h> @@ -64,7 +64,7 @@ void _Hash_Finalize( Hash_Context *context, Hash_Control *hash ) context->hash = hash; context->index = 0; hash->chars[ sizeof( *hash ) - 1 ] = '\0'; - n = _IO_Base64url( + n = _Base64url_Encode( _Hash_Put_char, context, digest, diff --git a/spec/build/cpukit/librtemscpu.yml b/spec/build/cpukit/librtemscpu.yml index 9202c31715..24b63af8de 100644 --- a/spec/build/cpukit/librtemscpu.yml +++ b/spec/build/cpukit/librtemscpu.yml @@ -79,6 +79,7 @@ install: - destination: ${BSP_INCLUDEDIR}/rtems source: - cpukit/include/rtems/assoc.h + - cpukit/include/rtems/base64.h - cpukit/include/rtems/bdbuf.h - cpukit/include/rtems/bdpart.h - cpukit/include/rtems/blkdev.h @@ -527,6 +528,7 @@ source: - cpukit/compression/xz/xz_crc32.c - cpukit/compression/xz/xz_dec_lzma2.c - cpukit/compression/xz/xz_dec_stream.c +- cpukit/base64/base64-encode.c - cpukit/dev/flash/flashdev.c - cpukit/dev/i2c/eeprom.c - cpukit/dev/i2c/fpga-i2c-slave.c @@ -539,7 +541,6 @@ source: - cpukit/dev/i2c/ti-lm25066a.c - cpukit/dev/i2c/ti-tmp112.c - cpukit/dev/i2c/xilinx-axi-i2c.c -- cpukit/dev/iobase64.c - cpukit/dev/ioprintf.c - cpukit/dev/iorelax.c - cpukit/dev/iovprintf.c diff --git a/testsuites/sptests/spprintk/init.c b/testsuites/sptests/spprintk/init.c index b69edc095e..4fc1c0cc97 100644 --- a/testsuites/sptests/spprintk/init.c +++ b/testsuites/sptests/spprintk/init.c @@ -32,6 +32,7 @@ #include "config.h" #endif +#include <rtems/base64.h> #include <rtems/dev/io.h> /* @@ -212,52 +213,52 @@ static void test_io_base64( test_context *ctx ) int n; clear( ctx ); - n = _IO_Base64( put_char, ctx, buf, 9, "\n", 0 ); + n = _Base64_Encode( put_char, ctx, buf, 9, "\n", 0 ); rtems_test_assert( n == 14 ); rtems_test_assert( strcmp( ctx->buf, "YWJj\nZGVm\nZ2hp" ) == 0 ); clear( ctx ); - n = _IO_Base64( put_char, ctx, buf, 8, "\n", 4 ); + n = _Base64_Encode( put_char, ctx, buf, 8, "\n", 4 ); rtems_test_assert( n == 14 ); rtems_test_assert( strcmp( ctx->buf, "YWJj\nZGVm\nZ2g=" ) == 0 ); clear( ctx ); - n = _IO_Base64( put_char, ctx, buf, 7, "\n", 4 ); + n = _Base64_Encode( put_char, ctx, buf, 7, "\n", 4 ); rtems_test_assert( n == 14 ); rtems_test_assert( strcmp( ctx->buf, "YWJj\nZGVm\nZw==" ) == 0 ); clear( ctx ); - n = _IO_Base64( put_char, ctx, buf, 6, "\n", 4 ); + n = _Base64_Encode( put_char, ctx, buf, 6, "\n", 4 ); rtems_test_assert( n == 9 ); rtems_test_assert( strcmp( ctx->buf, "YWJj\nZGVm" ) == 0 ); clear( ctx ); - n = _IO_Base64( put_char, ctx, buf, 5, "\n", 4 ); + n = _Base64_Encode( put_char, ctx, buf, 5, "\n", 4 ); rtems_test_assert( n == 9 ); rtems_test_assert( strcmp( ctx->buf, "YWJj\nZGU=" ) == 0 ); clear( ctx ); - n = _IO_Base64( put_char, ctx, buf, 4, "\n", 4 ); + n = _Base64_Encode( put_char, ctx, buf, 4, "\n", 4 ); rtems_test_assert( n == 9 ); rtems_test_assert( strcmp( ctx->buf, "YWJj\nZA==" ) == 0 ); clear( ctx ); - n = _IO_Base64( put_char, ctx, buf, 3, "\n", 4 ); + n = _Base64_Encode( put_char, ctx, buf, 3, "\n", 4 ); rtems_test_assert( n == 4 ); rtems_test_assert( strcmp( ctx->buf, "YWJj" ) == 0 ); clear( ctx ); - n = _IO_Base64( put_char, ctx, buf, 2, "\n", 4 ); + n = _Base64_Encode( put_char, ctx, buf, 2, "\n", 4 ); rtems_test_assert( n == 4 ); rtems_test_assert( strcmp( ctx->buf, "YWI=" ) == 0 ); clear( ctx ); - n = _IO_Base64( put_char, ctx, buf, 1, "\n", 4 ); + n = _Base64_Encode( put_char, ctx, buf, 1, "\n", 4 ); rtems_test_assert( n == 4 ); rtems_test_assert( strcmp( ctx->buf, "YQ==" ) == 0 ); clear( ctx ); - n = _IO_Base64( put_char, ctx, buf, 0, "\n", 4 ); + n = _Base64_Encode( put_char, ctx, buf, 0, "\n", 4 ); rtems_test_assert( n == 0 ); } @@ -267,7 +268,7 @@ static void test_io_base64url( test_context *ctx ) int n; clear( ctx ); - n = _IO_Base64url( put_char, ctx, buf, sizeof( buf ), "\n", 0 ); + n = _Base64url_Encode( put_char, ctx, buf, sizeof( buf ), "\n", 0 ); rtems_test_assert( n == 9 ); rtems_test_assert( strcmp( ctx->buf, "AAA-\nAAA_" ) == 0 ); } -- 2.35.3 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel