diff --git a/sys/base64/base64.c b/sys/base64/base64.c index a0d28df4a2..0749bf9f3d 100644 --- a/sys/base64/base64.c +++ b/sys/base64/base64.c @@ -66,8 +66,9 @@ int base64_encode(const void *data_in, size_t data_in_size, return BASE64_ERROR_DATA_IN; } - if (data_in_size < 1) { - return BASE64_ERROR_DATA_IN_SIZE; + if (data_in_size == 0) { + *base64_out_size = 0; + return BASE64_SUCCESS; } if (*base64_out_size < required_size) { @@ -170,6 +171,11 @@ int base64_decode(const unsigned char *base64_in, size_t base64_in_size, return BASE64_ERROR_DATA_IN; } + if (base64_in_size == 0) { + *data_out_size = 0; + return BASE64_SUCCESS; + } + if (base64_in_size < 4) { return BASE64_ERROR_DATA_IN_SIZE; } diff --git a/sys/include/base64.h b/sys/include/base64.h index 84c9655f91..af2bf6894b 100644 --- a/sys/include/base64.h +++ b/sys/include/base64.h @@ -71,8 +71,7 @@ static inline size_t base64_estimate_encode_size(size_t data_in_size) BASE64_ERROR_BUFFER_OUT_SIZE on insufficient size for encoding to `base64_out`, BASE64_ERROR_BUFFER_OUT if `base64_out` equals NULL but the `base64_out_size` is sufficient, - BASE64_ERROR_DATA_IN if `data_in` equals NULL, - BASE64_ERROR_DATA_IN_SIZE if `data_in_size` is less than 1. + BASE64_ERROR_DATA_IN if `data_in` equals NULL. */ int base64_encode(const void *data_in, size_t data_in_size, unsigned char *base64_out, size_t *base64_out_size); @@ -93,7 +92,7 @@ int base64_encode(const void *data_in, size_t data_in_size, BASE64_ERROR_BUFFER_OUT if `data_out` equals NULL but the size for `data_out_size` is sufficient, BASE64_ERROR_DATA_IN if `base64_in` equals NULL, - BASE64_ERROR_DATA_IN_SIZE if `base64_in_size` is less than 4. + BASE64_ERROR_DATA_IN_SIZE if `base64_in_size` is between 1 and 4. */ int base64_decode(const unsigned char *base64_in, size_t base64_in_size, void *data_out, size_t *data_out_size); diff --git a/tests/unittests/tests-base64/tests-base64.c b/tests/unittests/tests-base64/tests-base64.c index 762b1d972e..f988c3d393 100644 --- a/tests/unittests/tests-base64/tests-base64.c +++ b/tests/unittests/tests-base64/tests-base64.c @@ -383,6 +383,33 @@ static void test_base64_09_encode_size_determination(void) TEST_ASSERT_EQUAL_INT(required_out_size, expected_out_size); } +static void test_base64_10_encode_empty(void) +{ + unsigned char data_in[] = ""; + + size_t base64_out_size = 8; + unsigned char base64_out[8]; + + int ret = base64_encode(data_in, 0, base64_out, &base64_out_size); + + TEST_ASSERT_EQUAL_INT(BASE64_SUCCESS, ret); + TEST_ASSERT_EQUAL_INT(0, base64_out_size); +} + +static void test_base64_10_decode_empty(void) +{ + unsigned char data_in[] = ""; + + size_t base64_out_size = 8; + unsigned char base64_out[8]; + + int ret = base64_decode(data_in, 0, base64_out, &base64_out_size); + + TEST_ASSERT_EQUAL_INT(BASE64_SUCCESS, ret); + TEST_ASSERT_EQUAL_INT(0, base64_out_size); +} + + Test *tests_base64_tests(void) { EMB_UNIT_TESTFIXTURES(fixtures) { @@ -395,6 +422,8 @@ Test *tests_base64_tests(void) new_TestFixture(test_base64_07_stream_decode), new_TestFixture(test_base64_08_encode_16_bytes), new_TestFixture(test_base64_09_encode_size_determination), + new_TestFixture(test_base64_10_encode_empty), + new_TestFixture(test_base64_10_decode_empty), }; EMB_UNIT_TESTCALLER(base64_tests, NULL, NULL, fixtures);