2020-06-13 02:09:31 +00:00
/*
* Copyright ( c ) 2020 , Tom Lebreux < tomlebreux @ hotmail . com >
*
2021-04-22 08:24:48 +00:00
* SPDX - License - Identifier : BSD - 2 - Clause
2020-06-13 02:09:31 +00:00
*/
2021-04-25 05:53:23 +00:00
# include <LibTest/TestCase.h>
2020-06-13 02:09:31 +00:00
# include <AK/Base64.h>
2023-12-16 14:19:34 +00:00
# include <AK/ByteString.h>
2021-01-12 18:21:59 +00:00
# include <string.h>
2020-06-13 02:09:31 +00:00
2020-06-13 02:12:59 +00:00
TEST_CASE ( test_decode )
{
2022-07-11 20:30:25 +00:00
auto decode_equal = [ & ] ( StringView input , StringView expected ) {
2023-05-07 18:14:06 +00:00
auto decoded = TRY_OR_FAIL ( decode_base64 ( input ) ) ;
2023-12-16 14:19:34 +00:00
EXPECT ( ByteString : : copy ( decoded ) = = expected ) ;
2022-07-11 20:30:25 +00:00
EXPECT ( expected . length ( ) < = calculate_base64_decoded_length ( input . bytes ( ) ) ) ;
2020-06-13 02:12:59 +00:00
} ;
2022-07-11 20:30:25 +00:00
decode_equal ( " " sv , " " sv ) ;
decode_equal ( " Zg== " sv , " f " sv ) ;
decode_equal ( " Zm8= " sv , " fo " sv ) ;
decode_equal ( " Zm9v " sv , " foo " sv ) ;
decode_equal ( " Zm9vYg== " sv , " foob " sv ) ;
decode_equal ( " Zm9vYmE= " sv , " fooba " sv ) ;
decode_equal ( " Zm9vYmFy " sv , " foobar " sv ) ;
2024-03-24 12:51:44 +00:00
decode_equal ( " Zm9vYmFy " sv , " foobar " sv ) ;
decode_equal ( " \n \r \t Zm9vYmFy \n " sv , " foobar " sv ) ;
2024-03-20 12:21:59 +00:00
decode_equal ( " aGVsbG8/d29ybGQ= " sv , " hello?world " sv ) ;
2020-06-13 02:12:59 +00:00
}
2021-10-23 13:43:59 +00:00
TEST_CASE ( test_decode_invalid )
2021-10-22 21:17:54 +00:00
{
2022-07-11 20:30:25 +00:00
EXPECT ( decode_base64 ( ( " asdf \xff qwe " sv ) ) . is_error ( ) ) ;
EXPECT ( decode_base64 ( ( " asdf \x80 qwe " sv ) ) . is_error ( ) ) ;
EXPECT ( decode_base64 ( ( " asdf:qwe " sv ) ) . is_error ( ) ) ;
EXPECT ( decode_base64 ( ( " asdf=qwe " sv ) ) . is_error ( ) ) ;
2024-03-20 12:21:59 +00:00
EXPECT ( decode_base64 ( " aGVsbG8_d29ybGQ= " sv ) . is_error ( ) ) ;
EXPECT ( decode_base64url ( " aGVsbG8/d29ybGQ= " sv ) . is_error ( ) ) ;
}
TEST_CASE ( test_decode_only_padding )
{
// Only padding is not allowed
EXPECT ( decode_base64 ( " = " sv ) . is_error ( ) ) ;
EXPECT ( decode_base64 ( " == " sv ) . is_error ( ) ) ;
EXPECT ( decode_base64 ( " === " sv ) . is_error ( ) ) ;
EXPECT ( decode_base64 ( " ==== " sv ) . is_error ( ) ) ;
EXPECT ( decode_base64url ( " = " sv ) . is_error ( ) ) ;
EXPECT ( decode_base64url ( " == " sv ) . is_error ( ) ) ;
EXPECT ( decode_base64url ( " === " sv ) . is_error ( ) ) ;
EXPECT ( decode_base64url ( " ==== " sv ) . is_error ( ) ) ;
2021-10-22 21:17:54 +00:00
}
2020-06-13 02:09:31 +00:00
TEST_CASE ( test_encode )
{
2022-07-11 20:30:25 +00:00
auto encode_equal = [ & ] ( StringView input , StringView expected ) {
2022-12-18 23:23:47 +00:00
auto encoded = MUST ( encode_base64 ( input . bytes ( ) ) ) ;
EXPECT ( encoded = = expected ) ;
2022-07-11 20:30:25 +00:00
EXPECT_EQ ( expected . length ( ) , calculate_base64_encoded_length ( input . bytes ( ) ) ) ;
2020-06-13 02:09:31 +00:00
} ;
2022-07-11 20:30:25 +00:00
encode_equal ( " " sv , " " sv ) ;
encode_equal ( " f " sv , " Zg== " sv ) ;
encode_equal ( " fo " sv , " Zm8= " sv ) ;
encode_equal ( " foo " sv , " Zm9v " sv ) ;
encode_equal ( " foob " sv , " Zm9vYg== " sv ) ;
encode_equal ( " fooba " sv , " Zm9vYmE= " sv ) ;
encode_equal ( " foobar " sv , " Zm9vYmFy " sv ) ;
2020-06-13 02:09:31 +00:00
}
2024-03-20 12:21:59 +00:00
TEST_CASE ( test_urldecode )
{
auto decode_equal = [ & ] ( StringView input , StringView expected ) {
auto decoded = TRY_OR_FAIL ( decode_base64url ( input ) ) ;
EXPECT ( ByteString : : copy ( decoded ) = = expected ) ;
EXPECT ( expected . length ( ) < = calculate_base64_decoded_length ( input . bytes ( ) ) ) ;
} ;
decode_equal ( " " sv , " " sv ) ;
decode_equal ( " Zg== " sv , " f " sv ) ;
decode_equal ( " Zm8= " sv , " fo " sv ) ;
decode_equal ( " Zm9v " sv , " foo " sv ) ;
decode_equal ( " Zm9vYg== " sv , " foob " sv ) ;
decode_equal ( " Zm9vYmE= " sv , " fooba " sv ) ;
decode_equal ( " Zm9vYmFy " sv , " foobar " sv ) ;
2024-03-24 12:51:44 +00:00
decode_equal ( " Zm9vYmFy " sv , " foobar " sv ) ;
decode_equal ( " \n \r \t Zm9vYmFy \n " sv , " foobar " sv ) ;
2024-03-20 12:21:59 +00:00
decode_equal ( " TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEu " sv , " Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. " sv ) ;
decode_equal ( " aGVsbG8_d29ybGQ= " sv , " hello?world " sv ) ;
}
TEST_CASE ( test_urlencode )
{
auto encode_equal = [ & ] ( StringView input , StringView expected ) {
auto encoded = MUST ( encode_base64url ( input . bytes ( ) ) ) ;
EXPECT ( encoded = = expected ) ;
EXPECT_EQ ( expected . length ( ) , calculate_base64_encoded_length ( input . bytes ( ) ) ) ;
} ;
encode_equal ( " " sv , " " sv ) ;
encode_equal ( " f " sv , " Zg== " sv ) ;
encode_equal ( " fo " sv , " Zm8= " sv ) ;
encode_equal ( " foo " sv , " Zm9v " sv ) ;
encode_equal ( " foob " sv , " Zm9vYg== " sv ) ;
encode_equal ( " fooba " sv , " Zm9vYmE= " sv ) ;
encode_equal ( " foobar " sv , " Zm9vYmFy " sv ) ;
encode_equal ( " Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. " sv , " TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEu " sv ) ;
encode_equal ( " hello?world " sv , " aGVsbG8_d29ybGQ= " sv ) ;
encode_equal ( " hello!!world " sv , " aGVsbG8hIXdvcmxk " sv ) ;
}