summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2021-02-23 13:25:00 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2021-02-25 16:16:25 +0100
commit5f8bc839e89ea6efa7f48ebcec8939861024649f (patch)
tree94fff4d939edd79621c60f66a4164822cb4296d4
parentlibtest: Report build label (diff)
downloadrtems-5f8bc839e89ea6efa7f48ebcec8939861024649f.tar.bz2
score: Add _IO_Base64url()
Update #4267.
-rw-r--r--cpukit/include/rtems/score/io.h51
-rw-r--r--cpukit/score/src/iobase64.c56
-rw-r--r--testsuites/sptests/spprintk/init.c12
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 );