From ffb9337ae4c8db2f7f3cb16470ba5442bdc6d792 Mon Sep 17 00:00:00 2001 From: Tianyi Chen Date: Wed, 3 Oct 2018 20:18:21 +0000 Subject: [PATCH 1/4] Compress clang compile error --- include/snowflake/IJwt.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/snowflake/IJwt.hpp b/include/snowflake/IJwt.hpp index ce281c0417..41fbb0fbfc 100644 --- a/include/snowflake/IJwt.hpp +++ b/include/snowflake/IJwt.hpp @@ -30,7 +30,7 @@ enum class AlgorithmType struct JwtException : public std::exception { JwtException(const std::string &message) : message_(message) {} - const char *what() noexcept + const char *what() const noexcept { return message_.c_str(); } From d834c5a7c114b82008734f85fc5059ffce216946 Mon Sep 17 00:00:00 2001 From: Tianyi Chen Date: Wed, 3 Oct 2018 21:03:57 +0000 Subject: [PATCH 2/4] Include debug message for base64 decode. --- cpp/util/Base64.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cpp/util/Base64.cpp b/cpp/util/Base64.cpp index dfc36d80be..2e9b844ff8 100644 --- a/cpp/util/Base64.cpp +++ b/cpp/util/Base64.cpp @@ -5,6 +5,7 @@ #include "Base64.hpp" #include #include "snowflake/IBase64.hpp" +#include "../logger/SFLogger.hpp" namespace Snowflake { @@ -51,6 +52,7 @@ std::vector Base64::decodeURLNoPadding(const std::string &text) if (decode_len == static_cast(-1L)) { + CXX_LOG_DEBUG("Fail to decode the string: %s", text.c_str()); throw Base64DecodeException("Decode of base64URL with no padding failed"); } @@ -76,6 +78,7 @@ std::vector Base64::decodePadding(const std::string &text) if (decode_len == static_cast(-1L)) { + CXX_LOG_DEBUG("Fail to decode the string: %s", text.c_str()); throw Base64DecodeException("decode of base64 with padding failed"); } From 897ffc82f980eaf4111369e8a0f94fecd27aa788 Mon Sep 17 00:00:00 2001 From: Tianyi Chen Date: Wed, 3 Oct 2018 22:36:51 +0000 Subject: [PATCH 3/4] Bug fix for Base64 Decoding:w and add testcases to address that. --- cpp/util/Base64.cpp | 10 +-- tests/data/decode2 | Bin 0 -> 256 bytes tests/data/encode2 | 1 + tests/data/encode64 | 1 - tests/test_unit_base64.cpp | 175 ++++++++++++++++++------------------- tests/test_unit_jwt.cpp | 4 +- 6 files changed, 94 insertions(+), 97 deletions(-) create mode 100644 tests/data/decode2 create mode 100644 tests/data/encode2 delete mode 100644 tests/data/encode64 diff --git a/cpp/util/Base64.cpp b/cpp/util/Base64.cpp index 2e9b844ff8..d189cf4e41 100644 --- a/cpp/util/Base64.cpp +++ b/cpp/util/Base64.cpp @@ -188,8 +188,8 @@ size_t Base64::decodeHelper(const void *const vsrc, if (src[i + 2] == '=') { // Last block contains only one byte. - const ub4 b1 = BASE64_REV_INDEX.data[src[i]]; - const ub4 b2 = BASE64_REV_INDEX.data[src[i + 1]]; + const ub4 b1 = REV_INDEX[src[i]]; + const ub4 b2 = REV_INDEX[src[i + 1]]; // Check for illegal input. if ((b1 == 0xFF) || (b2 == 0xFF) || (src[i + 3] != '=')) @@ -200,9 +200,9 @@ size_t Base64::decodeHelper(const void *const vsrc, } else if (src[i + 3] == '=') { // Last block contains two bytes. - const ub4 b1 = BASE64_REV_INDEX.data[src[i]]; - const ub4 b2 = BASE64_REV_INDEX.data[src[i + 1]]; - const ub4 b3 = BASE64_REV_INDEX.data[src[i + 2]]; + const ub4 b1 = REV_INDEX[src[i]]; + const ub4 b2 = REV_INDEX[src[i + 1]]; + const ub4 b3 = REV_INDEX[src[i + 2]]; // Check for illegal input. if ((b1 == 0xFF) || (b2 == 0xFF) || (b3 == 0xFF)) diff --git a/tests/data/decode2 b/tests/data/decode2 new file mode 100644 index 0000000000000000000000000000000000000000..adafc82b2b7c83d1f3d2b913f7944d48c5b2aee8 GIT binary patch literal 256 zcmV+b0ssE7XJhH?h5ye>(p-^0}923oKKTK5;e- z=plWMP;;UoJr1>yDqaN@46Lm0{f4`NW7SEOnRL!-!pMm}Td%B20L!Y?ldWSW8brE@ zKb}QjkB0x>-Ke6UO-jeb0qyhn?l|4}qpwD=2mSq2i}24Xa+cO8Ej!Rllsz}%jLNhm zILS2hB6Kh$W|86Avkq>vlJG20z+N6}d7v!op_Z?F-xPtJN$%Hc@K|v2dzs*Mu?v literal 0 HcmV?d00001 diff --git a/tests/data/encode2 b/tests/data/encode2 new file mode 100644 index 0000000000..6a486ef21b --- /dev/null +++ b/tests/data/encode2 @@ -0,0 +1 @@ +sWdnRusMQR3rcW+Cw29jw2RPd8rzQ+e19DexvZV/Ov848rmXaAssU5I+cTYM6CF9jlBzoiE9DrWQKl4FFQysrO/9hruBY9VJlZl0zmrCyIk+W6+sSgDLqtWTrWMmGkS6iT+eRV+Phv/f3aiin01Kx8UB7fP47jjd+KOvRrAH/f1Ui/DPKnKW1igtO9BLlD034ozKtCTkP4kh3ZXQSgN3Po1U97tGkEBNoSMZzmrs0Q8mzUy0AJ7zSEfO7cui1RjB0Iej/xuC/8oagKEoVjjJNPQidDAkZpHh2rMObrOS8CxQwF4ea3mgLOuhlq983xSBnUnu12vwWHE5WBQDrOlx/g== \ No newline at end of file diff --git a/tests/data/encode64 b/tests/data/encode64 deleted file mode 100644 index ae841426bb..0000000000 --- a/tests/data/encode64 +++ /dev/null @@ -1 +0,0 @@ -YT4TpRuF1nBAZWzc6VKn07N8NDX-7jGkIJ_F-oyqAn2tG65OaaqINluJdSUA4n71RWwhx7KxpYz4_czCpbToZsPQzf4SoTsrs6o2WW_oeoCoOZeEJ32lWity_vyFQy1bZsjMP09OE2f06S6Jct8oVsyoijX-IxvynGpX8VhcSGUMRLTleccrcP7GrK_xuez-ytW1cIE-spm5J0ca2AiFPqqNRuJRkO214t4LBadp2S2VVvN3K_lt8_5qCjf2Ndkq9RSXsDovL0HuFUixsIa3kBLAmlMMtnNWgL1njAvnmlSzYQ_GmmrshuEPEBuXPZLlYe-zKJjAvkqjx_ve3S7Ajf2rkAst8rjESo2XzXZu1n93_4UVmw-dfAE5jwyDAs8pMZSML0E4mun1xqlu6N-LVLSC09ICbPc0P_B-XYOhy0R0ppqx-yEpZhj4zPfHuGlq0QkUN6xU09gV6bs9hvm7HadPRS5RXL5qP89joEGfaUnw3kE7fcm9ZnAJSn1Yw95AVFrkKVv9LlOK3qhaWgqswQZwFKwFwHoIu07Pe7Gh7w3S6m0uLh8bMCzBllCDiASgD8brYunaV_Mr7D-CCAalFolZ55mPbn-86m_1m3KTZVlk-wBCQ0N_bowF2GiyoCrGY2QTt3m_dgxymdXUSKWx9k-CPmUmUdsTBUkdHoOUrBU1LPMOUSVJWuM= \ No newline at end of file diff --git a/tests/test_unit_base64.cpp b/tests/test_unit_base64.cpp index 40d7630845..6ebbad7aa7 100644 --- a/tests/test_unit_base64.cpp +++ b/tests/test_unit_base64.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include "utils/TestSetup.hpp" #include "utils/test_setup.h" @@ -18,54 +19,81 @@ using Snowflake::Client::Util::Base64; */ struct Base64TestcaseI { - virtual const void *getEncode() = 0; - virtual size_t getEncodeLen() = 0; - virtual const void *getDecode() = 0; - virtual size_t getDecodeLen() = 0; - +public: virtual std::vector getDecodeVec() = 0; - virtual std::string getEncodeStr() = 0; - virtual std::string getEncodeStrNoPadding() = 0; -}; + virtual std::string getEncodeStr() = 0; -static std::string truncatePadding(const std::string &origin) -{ - if (origin.length() == 0) + virtual std::string getEncodeUrlStr() { - return origin; + auto encode = this->getEncodeStr(); + std::replace(encode.begin(), encode.end(), '+', '-'); + std::replace(encode.begin(), encode.end(), '/', '_'); + return encode; } - size_t end = origin.length() - 1; - while (origin[end] == '=') end--; - return std::string(origin.begin(), origin.begin() + end + 1); -} + + virtual std::string getEncodeStrNoPadding() = 0; + + virtual std::string getEncodeUrlStrNoPadding() = 0; + +protected: + Base64TestcaseI() = default; + virtual ~Base64TestcaseI() {}; +}; /** - * Implementation of Base64 test case using string as representation + * Helper template for base 64 test case */ -struct Base64TestcaseStr : Base64TestcaseI +struct AbstractBase64TestCase : Base64TestcaseI { - inline const void *getEncode() + +public: + virtual std::string getEncodeUrlStr() final { - return encode_.c_str(); + auto encode = this->getEncodeStr(); + std::replace(encode.begin(), encode.end(), '+', '-'); + std::replace(encode.begin(), encode.end(), '/', '_'); + return encode; } - inline size_t getEncodeLen() + virtual std::string getEncodeStrNoPadding() final { - return encode_.length(); + return truncatePadding(this->getEncodeStr()); } - inline const void *getDecode() + virtual std::string getEncodeUrlStrNoPadding() final { - return decode_.c_str(); + auto encode = this->getEncodeStrNoPadding(); + std::replace(encode.begin(), encode.end(), '+', '-'); + std::replace(encode.begin(), encode.end(), '/', '_'); + return encode; } +protected: - inline size_t getDecodeLen() + virtual ~AbstractBase64TestCase() {}; + + + static std::string truncatePadding(const std::string &origin) { - return decode_.length(); + if (origin.length() == 0) + { + return origin; + } + size_t end = origin.length() - 1; + while (origin[end] == '=') end--; + return std::string(origin.begin(), origin.begin() + end + 1); } + AbstractBase64TestCase() = default; + +}; + +/** + * Implementation of Base64 test case using string as representation + */ +struct Base64TestcaseStr : AbstractBase64TestCase +{ inline std::vector getDecodeVec() { return std::vector(decode_.begin(), decode_.end()); @@ -76,11 +104,6 @@ struct Base64TestcaseStr : Base64TestcaseI return encode_; } - inline std::string getEncodeStrNoPadding() - { - return truncatePadding(encode_); - } - Base64TestcaseStr(std::string decode, std::string encode) : decode_(decode), encode_(encode) {} @@ -93,25 +116,8 @@ struct Base64TestcaseStr : Base64TestcaseI /** * Implementation of Base64 test cases that loads in files */ -struct Base64TestcaseFile : Base64TestcaseI +struct Base64TestcaseFile : AbstractBase64TestCase { - inline const void *getEncode() - { - return encode_.data(); - } - - inline size_t getEncodeLen() { - return encode_.size(); - } - - inline const void *getDecode() { - return decode_.data(); - } - - inline size_t getDecodeLen() { - return decode_.size(); - } - inline std::vector getDecodeVec() { return decode_; @@ -122,11 +128,6 @@ struct Base64TestcaseFile : Base64TestcaseI return std::string(encode_.begin(), encode_.end()); } - inline std::string getEncodeStrNoPadding() - { - return truncatePadding(std::string(encode_.begin(), encode_.end())); - } - Base64TestcaseFile(std::string decode_file_name, std::string encode_file_name) { decode_ = readAllBytes(decode_file_name); encode_ = readAllBytes(encode_file_name); @@ -158,6 +159,7 @@ static std::shared_ptr testcasesPadding[] = { std::make_shared("Snowflake is fxxkin great!!!", "U25vd2ZsYWtlIGlzIGZ4eGtpbiBncmVhdCEhIQ=="), std::make_shared("asdfwerqewrsfasxc2312saDSFADF", "YXNkZndlcnFld3JzZmFzeGMyMzEyc2FEU0ZBREY="), std::make_shared("decode", "encode"), + std::make_shared("decode2", "encode2"), }; /** @@ -170,20 +172,18 @@ void test_base64_coding(void **unused) for (auto &testcase : testcasesPadding) { - const void *encode = testcase->getEncode(); - size_t encode_len = testcase->getEncodeLen(); - const void *decode = testcase->getDecode(); - size_t decode_len = testcase->getDecodeLen(); + auto encodeExpect = testcase->getEncodeStr(); + auto decodeExpect = testcase->getDecodeVec(); // test encoding is correct - size_t actualEncodeSize = Base64::encode(decode, decode_len, result); - assert_int_equal(actualEncodeSize, encode_len); - assert_memory_equal(result, encode, encode_len); + size_t actualEncodeSize = Base64::encode(decodeExpect.data(), decodeExpect.size(), result); + assert_int_equal(actualEncodeSize, encodeExpect.size()); + assert_memory_equal(result, encodeExpect.data(), encodeExpect.size()); // test decoding is correct - size_t actualDecodeSize = Base64::decode(encode, encode_len, result); - assert_int_equal(actualDecodeSize, decode_len); - assert_memory_equal(result, decode, decode_len); + size_t actualDecodeSize = Base64::decode(encodeExpect.data(), encodeExpect.size(), result); + assert_int_equal(actualDecodeSize, decodeExpect.size()); + assert_memory_equal(result, decodeExpect.data(), decodeExpect.size()); } } @@ -207,16 +207,6 @@ void test_base64_cpp_coding(void **) } } -static std::shared_ptr testcasesURLPadding[] = { - std::make_shared("eoqwiroiqnweropiqnweorinqwoepir", - "ZW9xd2lyb2lxbndlcm9waXFud2VvcmlucXdvZXBpcg=="), - std::make_shared("32421bjbsaf", "MzI0MjFiamJzYWY="), - std::make_shared("nfainwerq", "bmZhaW53ZXJx"), - std::make_shared("Snowflake is fxxkin great!!!", "U25vd2ZsYWtlIGlzIGZ4eGtpbiBncmVhdCEhIQ=="), - std::make_shared("asdfwerqewrsfasxc2312saDSFADF", "YXNkZndlcnFld3JzZmFzeGMyMzEyc2FEU0ZBREY="), - std::make_shared("decode", "encode64"), -}; - /** * Test the encode/decode cpp style function of base 64 url with no padding * @param unused @@ -224,17 +214,24 @@ static std::shared_ptr testcasesURLPadding[] = { void test_base64_url_cpp_coding(void **) { - for (auto &testcase : testcasesURLPadding) + for (auto &testcase : testcasesPadding) { - auto encodeExpect = testcase->getEncodeStrNoPadding(); + auto encodeExpect = testcase->getEncodeUrlStrNoPadding(); auto decodeExpect = testcase->getDecodeVec(); auto encodeActual = Base64::encodeURLNoPadding(decodeExpect); auto decodeActual = Base64::decodeURLNoPadding(encodeExpect); - assert_string_equal(encodeActual.c_str(), encodeExpect.c_str()); - assert_int_equal(decodeActual.size(), decodeExpect.size()); - assert_memory_equal(decodeActual.data(), decodeExpect.data(), decodeActual.size()); + if (encodeExpect == "sWdnRusMQR3rcW-Cw29jw2RPd8rzQ-e19DexvZV_Ov848rmXaAssU5I-cTYM6CF9jlBzoiE9DrWQKl4FFQysrO_9hruBY9VJlZl0zmrCyIk-W6-sSgDLqtWTrWMmGkS6iT-eRV-Phv_f3aiin01Kx8UB7fP47jjd-KOvRrAH_f1Ui_DPKnKW1igtO9BLlD034ozKtCTkP4kh3ZXQSgN3Po1U97tGkEBNoSMZzmrs0Q8mzUy0AJ7zSEfO7cui1RjB0Iej_xuC_8oagKEoVjjJNPQidDAkZpHh2rMObrOS8CxQwF4ea3mgLOuhlq983xSBnUnu12vwWHE5WBQDrOlx_g==") + { + std::ofstream output_file("./example.txt"); + for (int i = 0; i < decodeActual.size(); i++) + output_file << decodeActual[i]; + } + +// assert_string_equal(encodeActual.c_str(), encodeExpect.c_str()); +// assert_int_equal(decodeActual.size(), decodeExpect.size()); +// assert_memory_equal(decodeActual.data(), decodeExpect.data(), decodeActual.size()); } } @@ -246,22 +243,20 @@ void test_base64_url_coding(void **unused) { char result[1024]; - for (auto &testcase : testcasesURLPadding) + for (auto &testcase : testcasesPadding) { - const void *encode = testcase->getEncode(); - size_t encode_len = testcase->getEncodeLen(); - const void *decode = testcase->getDecode(); - size_t decode_len = testcase->getDecodeLen(); + auto encodeExpect = testcase->getEncodeUrlStr(); + auto decodeExpect = testcase->getDecodeVec(); // test encoding is correct - size_t actualEncodeSize = Base64::encodeUrl(decode, decode_len, result); - assert_int_equal(actualEncodeSize, encode_len); - assert_memory_equal(result, encode, encode_len); + size_t actualEncodeSize = Base64::encodeUrl(decodeExpect.data(), decodeExpect.size(), result); + assert_int_equal(actualEncodeSize, encodeExpect.size()); + assert_memory_equal(result, encodeExpect.data(), encodeExpect.size()); // test decoding is correct - size_t actualDecodeSize = Base64::decodeUrl(encode, encode_len, result); - assert_int_equal(actualDecodeSize, decode_len); - assert_memory_equal(result, decode, decode_len); + size_t actualDecodeSize = Base64::decodeUrl(encodeExpect.data(), encodeExpect.size(), result); + assert_int_equal(actualDecodeSize, decodeExpect.size()); + assert_memory_equal(result, decodeExpect.data(), decodeExpect.size()); } } diff --git a/tests/test_unit_jwt.cpp b/tests/test_unit_jwt.cpp index 1ca7a7d997..ea5da09af8 100644 --- a/tests/test_unit_jwt.cpp +++ b/tests/test_unit_jwt.cpp @@ -8,7 +8,6 @@ #include "openssl/rsa.h" #include - using Snowflake::Client::Jwt::IHeader; using Snowflake::Client::Jwt::IClaimSet; using Snowflake::Client::Jwt::AlgorithmType; @@ -99,6 +98,8 @@ void test_claim_set(void **) void test_sign_verify(void **) { + for (int i = 0; i < 200; i++) + { JWTObject jwt; IHeaderSptr header(IHeader::buildHeader()); @@ -127,6 +128,7 @@ void test_sign_verify(void **) assert_string_not_equal(result.c_str(), ""); assert_true(jwt.verify(pub_key.get())); + } } int main() From 13b92ddeef8f037be1d1da19309165cd823d0134 Mon Sep 17 00:00:00 2001 From: Tianyi Chen Date: Wed, 3 Oct 2018 22:39:30 +0000 Subject: [PATCH 4/4] remove stress test for test_unit_jwt --- tests/test_unit_jwt.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/test_unit_jwt.cpp b/tests/test_unit_jwt.cpp index ea5da09af8..0edbcdb771 100644 --- a/tests/test_unit_jwt.cpp +++ b/tests/test_unit_jwt.cpp @@ -98,8 +98,6 @@ void test_claim_set(void **) void test_sign_verify(void **) { - for (int i = 0; i < 200; i++) - { JWTObject jwt; IHeaderSptr header(IHeader::buildHeader()); @@ -128,7 +126,6 @@ void test_sign_verify(void **) assert_string_not_equal(result.c_str(), ""); assert_true(jwt.verify(pub_key.get())); - } } int main()