From 292f9e7014056125f9abadd8df1b2850141bc6c0 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Fri, 17 Sep 2021 08:35:32 +0200 Subject: base64: Migrate over to osmocom This containts the osmocom changes to the mbedtls base64 code merged in the previous commit. Change-Id: I82c1bf5f827c8def370dbcb80b146e9e4184c4a3 --- include/Makefile.am | 1 + include/osmocom/core/base64.h | 19 ++------ src/Makefile.am | 1 + src/base64.c | 101 +++++------------------------------------- tests/Makefile.am | 4 ++ tests/base64/base64_test.c | 57 ++++++++++++++++++++++++ tests/base64/base64_test.ok | 3 ++ tests/testsuite.at | 6 +++ 8 files changed, 85 insertions(+), 107 deletions(-) create mode 100644 tests/base64/base64_test.c create mode 100644 tests/base64/base64_test.ok diff --git a/include/Makefile.am b/include/Makefile.am index e25ed48e..7df651aa 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -6,6 +6,7 @@ nobase_include_HEADERS = \ osmocom/codec/gsm610_bits.h \ osmocom/core/application.h \ osmocom/core/backtrace.h \ + osmocom/core/base64.h \ osmocom/core/bit16gen.h \ osmocom/core/bit32gen.h \ osmocom/core/bit64gen.h \ diff --git a/include/osmocom/core/base64.h b/include/osmocom/core/base64.h index 0f7233d2..f73db0d8 100644 --- a/include/osmocom/core/base64.h +++ b/include/osmocom/core/base64.h @@ -21,14 +21,10 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef MBEDTLS_BASE64_H -#define MBEDTLS_BASE64_H +#pragma once #include -#define MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL -0x002A /**< Output buffer too small. */ -#define MBEDTLS_ERR_BASE64_INVALID_CHARACTER -0x002C /**< Invalid character in input. */ - #ifdef __cplusplus extern "C" { #endif @@ -49,7 +45,7 @@ extern "C" { * \note Call this function with dlen = 0 to obtain the * required buffer size in *olen */ -int mbedtls_base64_encode( unsigned char *dst, size_t dlen, size_t *olen, +int osmo_base64_encode( unsigned char *dst, size_t dlen, size_t *olen, const unsigned char *src, size_t slen ); /** @@ -69,18 +65,9 @@ int mbedtls_base64_encode( unsigned char *dst, size_t dlen, size_t *olen, * \note Call this function with *dst = NULL or dlen = 0 to obtain * the required buffer size in *olen */ -int mbedtls_base64_decode( unsigned char *dst, size_t dlen, size_t *olen, +int osmo_base64_decode( unsigned char *dst, size_t dlen, size_t *olen, const unsigned char *src, size_t slen ); -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mbedtls_base64_self_test( int verbose ); - #ifdef __cplusplus } #endif - -#endif /* base64.h */ diff --git a/src/Makefile.am b/src/Makefile.am index 2f18d092..3c589e6b 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -31,6 +31,7 @@ libosmocore_la_SOURCES = context.c timer.c timer_gettimeofday.c timer_clockgetti exec.c \ it_q.c \ probes.d \ + base64.c \ $(NULL) if HAVE_SSSE3 diff --git a/src/base64.c b/src/base64.c index 11cb30bb..dbc908b8 100644 --- a/src/base64.c +++ b/src/base64.c @@ -20,27 +20,11 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#if !defined(MBEDTLS_CONFIG_FILE) -#include "mbedtls/config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#if defined(MBEDTLS_BASE64_C) - -#include "mbedtls/base64.h" +#include #include - -#if defined(MBEDTLS_SELF_TEST) -#include -#if defined(MBEDTLS_PLATFORM_C) -#include "mbedtls/platform.h" -#else #include -#define mbedtls_printf printf -#endif /* MBEDTLS_PLATFORM_C */ -#endif /* MBEDTLS_SELF_TEST */ +#include static const unsigned char base64_enc_map[64] = { @@ -73,7 +57,7 @@ static const unsigned char base64_dec_map[128] = /* * Encode a buffer into base64 format */ -int mbedtls_base64_encode( unsigned char *dst, size_t dlen, size_t *olen, +int osmo_base64_encode( unsigned char *dst, size_t dlen, size_t *olen, const unsigned char *src, size_t slen ) { size_t i, n; @@ -98,7 +82,7 @@ int mbedtls_base64_encode( unsigned char *dst, size_t dlen, size_t *olen, if( dlen < n + 1 ) { *olen = n + 1; - return( MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL ); + return( -ENOBUFS ); } n = ( slen / 3 ) * 3; @@ -139,7 +123,7 @@ int mbedtls_base64_encode( unsigned char *dst, size_t dlen, size_t *olen, /* * Decode a base64-formatted buffer */ -int mbedtls_base64_decode( unsigned char *dst, size_t dlen, size_t *olen, +int osmo_base64_decode( unsigned char *dst, size_t dlen, size_t *olen, const unsigned char *src, size_t slen ) { size_t i, n; @@ -170,16 +154,16 @@ int mbedtls_base64_decode( unsigned char *dst, size_t dlen, size_t *olen, /* Space inside a line is an error */ if( x != 0 ) - return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER ); + return( -EINVAL ); if( src[i] == '=' && ++j > 2 ) - return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER ); + return( -EINVAL ); if( src[i] > 127 || base64_dec_map[src[i]] == 127 ) - return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER ); + return( -EINVAL ); if( base64_dec_map[src[i]] < 64 && j != 0 ) - return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER ); + return( -EINVAL ); n++; } @@ -193,7 +177,7 @@ int mbedtls_base64_decode( unsigned char *dst, size_t dlen, size_t *olen, if( dst == NULL || dlen < n ) { *olen = n; - return( MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL ); + return( -ENOBUFS ); } for( j = 3, n = x = 0, p = dst; i > 0; i--, src++ ) @@ -217,68 +201,3 @@ int mbedtls_base64_decode( unsigned char *dst, size_t dlen, size_t *olen, return( 0 ); } - -#if defined(MBEDTLS_SELF_TEST) - -static const unsigned char base64_test_dec[64] = -{ - 0x24, 0x48, 0x6E, 0x56, 0x87, 0x62, 0x5A, 0xBD, - 0xBF, 0x17, 0xD9, 0xA2, 0xC4, 0x17, 0x1A, 0x01, - 0x94, 0xED, 0x8F, 0x1E, 0x11, 0xB3, 0xD7, 0x09, - 0x0C, 0xB6, 0xE9, 0x10, 0x6F, 0x22, 0xEE, 0x13, - 0xCA, 0xB3, 0x07, 0x05, 0x76, 0xC9, 0xFA, 0x31, - 0x6C, 0x08, 0x34, 0xFF, 0x8D, 0xC2, 0x6C, 0x38, - 0x00, 0x43, 0xE9, 0x54, 0x97, 0xAF, 0x50, 0x4B, - 0xD1, 0x41, 0xBA, 0x95, 0x31, 0x5A, 0x0B, 0x97 -}; - -static const unsigned char base64_test_enc[] = - "JEhuVodiWr2/F9mixBcaAZTtjx4Rs9cJDLbpEG8i7hPK" - "swcFdsn6MWwINP+Nwmw4AEPpVJevUEvRQbqVMVoLlw=="; - -/* - * Checkup routine - */ -int mbedtls_base64_self_test( int verbose ) -{ - size_t len; - const unsigned char *src; - unsigned char buffer[128]; - - if( verbose != 0 ) - mbedtls_printf( " Base64 encoding test: " ); - - src = base64_test_dec; - - if( mbedtls_base64_encode( buffer, sizeof( buffer ), &len, src, 64 ) != 0 || - memcmp( base64_test_enc, buffer, 88 ) != 0 ) - { - if( verbose != 0 ) - mbedtls_printf( "failed\n" ); - - return( 1 ); - } - - if( verbose != 0 ) - mbedtls_printf( "passed\n Base64 decoding test: " ); - - src = base64_test_enc; - - if( mbedtls_base64_decode( buffer, sizeof( buffer ), &len, src, 88 ) != 0 || - memcmp( base64_test_dec, buffer, 64 ) != 0 ) - { - if( verbose != 0 ) - mbedtls_printf( "failed\n" ); - - return( 1 ); - } - - if( verbose != 0 ) - mbedtls_printf( "passed\n\n" ); - - return( 0 ); -} - -#endif /* MBEDTLS_SELF_TEST */ - -#endif /* MBEDTLS_BASE64_C */ diff --git a/tests/Makefile.am b/tests/Makefile.am index 5c6f30c5..22591fb9 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -43,6 +43,7 @@ check_PROGRAMS = timer/timer_test sms/sms_test ussd/ussd_test \ bssmap_le/bssmap_le_test \ it_q/it_q_test \ gsm48/rest_octets_test \ + base64/base64_test \ $(NULL) if ENABLE_MSGFILE @@ -79,6 +80,8 @@ if ENABLE_GB check_PROGRAMS += gb/bssgp_fc_test gb/gprs_bssgp_test gb/gprs_bssgp_rim_test gb/gprs_ns_test gb/gprs_ns2_test fr/fr_test endif +base64_base64_test_SOURCES = base64/base64_test.c + utils_utils_test_SOURCES = utils/utils_test.c utils_utils_test_LDADD = $(LDADD) $(top_builddir)/src/gsm/libosmogsm.la @@ -405,6 +408,7 @@ EXTRA_DIST = testsuite.at $(srcdir)/package.m4 $(TESTSUITE) \ bssmap_le/bssmap_le_test.ok \ it_q/it_q_test.ok \ gsm48/rest_octets_test.ok \ + base64/base64_test.ok \ $(NULL) if ENABLE_LIBSCTP diff --git a/tests/base64/base64_test.c b/tests/base64/base64_test.c new file mode 100644 index 00000000..e85f6490 --- /dev/null +++ b/tests/base64/base64_test.c @@ -0,0 +1,57 @@ +#include +#include +#include + +static const unsigned char base64_test_dec[64] = +{ + 0x24, 0x48, 0x6E, 0x56, 0x87, 0x62, 0x5A, 0xBD, + 0xBF, 0x17, 0xD9, 0xA2, 0xC4, 0x17, 0x1A, 0x01, + 0x94, 0xED, 0x8F, 0x1E, 0x11, 0xB3, 0xD7, 0x09, + 0x0C, 0xB6, 0xE9, 0x10, 0x6F, 0x22, 0xEE, 0x13, + 0xCA, 0xB3, 0x07, 0x05, 0x76, 0xC9, 0xFA, 0x31, + 0x6C, 0x08, 0x34, 0xFF, 0x8D, 0xC2, 0x6C, 0x38, + 0x00, 0x43, 0xE9, 0x54, 0x97, 0xAF, 0x50, 0x4B, + 0xD1, 0x41, 0xBA, 0x95, 0x31, 0x5A, 0x0B, 0x97 +}; + +static const unsigned char base64_test_enc[] = + "JEhuVodiWr2/F9mixBcaAZTtjx4Rs9cJDLbpEG8i7hPK" + "swcFdsn6MWwINP+Nwmw4AEPpVJevUEvRQbqVMVoLlw=="; + +/* + * Checkup routine + */ +int main(int argc, char **argv) +{ + size_t len; + const unsigned char *src; + unsigned char buffer[128]; + + printf( " Base64 encoding test: " ); + + src = base64_test_dec; + + if( osmo_base64_encode( buffer, sizeof( buffer ), &len, src, 64 ) != 0 || + memcmp( base64_test_enc, buffer, 88 ) != 0 ) + { + printf( "failed\n" ); + + return( 1 ); + } + + printf( "passed\n Base64 decoding test: " ); + + src = base64_test_enc; + + if( osmo_base64_decode( buffer, sizeof( buffer ), &len, src, 88 ) != 0 || + memcmp( base64_test_dec, buffer, 64 ) != 0 ) + { + printf( "failed\n" ); + + return( 1 ); + } + + printf( "passed\n\n" ); + + return( 0 ); +} diff --git a/tests/base64/base64_test.ok b/tests/base64/base64_test.ok new file mode 100644 index 00000000..ff187d9c --- /dev/null +++ b/tests/base64/base64_test.ok @@ -0,0 +1,3 @@ + Base64 encoding test: passed + Base64 decoding test: passed + diff --git a/tests/testsuite.at b/tests/testsuite.at index cb842294..6ac59709 100644 --- a/tests/testsuite.at +++ b/tests/testsuite.at @@ -446,3 +446,9 @@ AT_KEYWORDS([it_q]) cat $abs_srcdir/it_q/it_q_test.ok > expout AT_CHECK([$abs_top_builddir/tests/it_q/it_q_test], [0], [expout], [ignore]) AT_CLEANUP + +AT_SETUP([base64]) +AT_KEYWORDS([base64]) +cat $abs_srcdir/base64/base64_test.ok > expout +AT_CHECK([$abs_top_builddir/tests/base64/base64_test], [0], [expout], [ignore]) +AT_CLEANUP -- cgit v1.2.3