diff --git a/base32.cpp b/base32.cpp index 6444caba..f474de07 100644 --- a/base32.cpp +++ b/base32.cpp @@ -26,16 +26,30 @@ void Base32Decoder::IsolatedInitialize(const NameValuePairs ¶meters) MakeParameters(Name::DecodingLookupArray(), GetDefaultDecodingLookupArray(), false)(Name::Log2Base(), 5, true))); } +ANONYMOUS_NAMESPACE_BEGIN +static const int s_array[256] = { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 24, 25, 26, 27, 28, 29, 30, 31, -1, -1, -1, -1, -1, -1, + -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -1, 11, 12, -1, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, -1, -1, -1, + -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -1, 11, 12, -1, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 +}; +NAMESPACE_END + +// Unrolled initialization, http://github.com/weidai11/cryptopp/issues/376 const int *Base32Decoder::GetDefaultDecodingLookupArray() { - static volatile bool s_initialized = false; - static int s_array[256]; - - if (!s_initialized) - { - InitializeDecodingLookupArray(s_array, s_vecUpper, 32, true); - s_initialized = true; - } return s_array; } diff --git a/base64.cpp b/base64.cpp index 9ba4226e..63f7b12b 100644 --- a/base64.cpp +++ b/base64.cpp @@ -53,17 +53,30 @@ void Base64Decoder::IsolatedInitialize(const NameValuePairs ¶meters) MakeParameters(Name::DecodingLookupArray(), GetDecodingLookupArray(), false)(Name::Log2Base(), 6, true))); } +ANONYMOUS_NAMESPACE_BEGIN +static const int s_stdArray[256] = { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, + -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, + -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 +}; +NAMESPACE_END + const int *Base64Decoder::GetDecodingLookupArray() { - static volatile bool s_initialized = false; - static int s_array[256]; - - if (!s_initialized) - { - InitializeDecodingLookupArray(s_array, s_stdVec, 64, false); - s_initialized = true; - } - return s_array; + return s_stdArray; } void Base64URLDecoder::IsolatedInitialize(const NameValuePairs ¶meters) @@ -73,17 +86,31 @@ void Base64URLDecoder::IsolatedInitialize(const NameValuePairs ¶meters) MakeParameters(Name::DecodingLookupArray(), GetDecodingLookupArray(), false)(Name::Log2Base(), 6, true))); } +ANONYMOUS_NAMESPACE_BEGIN +static const int s_urlArray[256] = { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, + -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, 63, + -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 +}; +NAMESPACE_END + +// Unrolled initialization, http://github.com/weidai11/cryptopp/issues/376 const int *Base64URLDecoder::GetDecodingLookupArray() { - static volatile bool s_initialized = false; - static int s_array[256]; - - if (!s_initialized) - { - InitializeDecodingLookupArray(s_array, s_urlVec, 64, false); - s_initialized = true; - } - return s_array; + return s_urlArray; } NAMESPACE_END diff --git a/hex.cpp b/hex.cpp index 133c97e7..3871c4bd 100644 --- a/hex.cpp +++ b/hex.cpp @@ -29,16 +29,30 @@ void HexDecoder::IsolatedInitialize(const NameValuePairs ¶meters) MakeParameters(Name::DecodingLookupArray(), GetDefaultDecodingLookupArray(), false)(Name::Log2Base(), 4, true))); } +ANONYMOUS_NAMESPACE_BEGIN +static const int s_array[256] = { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, + -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 +}; +NAMESPACE_END + +// Unrolled initialization, http://github.com/weidai11/cryptopp/issues/376 const int *HexDecoder::GetDefaultDecodingLookupArray() { - static volatile bool s_initialized = false; - static int s_array[256]; - - if (!s_initialized) - { - InitializeDecodingLookupArray(s_array, s_vecUpper, 16, true); - s_initialized = true; - } return s_array; } diff --git a/validat1.cpp b/validat1.cpp index 0e3baf92..06c8113d 100644 --- a/validat1.cpp +++ b/validat1.cpp @@ -2430,33 +2430,44 @@ bool ValidateBaseCode() byte data[255]; for (unsigned int i=0; i<255; i++) data[i] = byte(i); - static const char hexEncoded[] = -"000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627" -"28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F" -"505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677" -"78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F" -"A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7" -"C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF" -"F0F1F2F3F4F5F6F7F8F9FAFBFCFDFE"; - static const char base32Encoded[] = -"AAASEA2EAWDAQCAJBIFS2DIQB6IBCESVCSKTNF22DEPBYHA7D2RUAIJCENUCKJTHFAWUWK3NFWZC8NBT" -"GI3VIPJYG66DUQT5HS8V6R4AIFBEGTCFI3DWSUKKJPGE4VURKBIXEW4WKXMFQYC3MJPX2ZK8M7SGC2VD" -"NTUYN35IPFXGY5DPP3ZZA6MUQP4HK7VZRB6ZW856RX9H9AEBSKB2JBNGS8EIVCWMTUG27D6SUGJJHFEX" -"U4M3TGN4VQQJ5HW9WCS4FI7EWYVKRKFJXKX43MPQX82MDNXVYU45PP72ZG7MZRF7Z496BSQC2RCNMTYH" -"3DE6XU8N3ZHN9WGT4MJ7JXQY49NPVYY55VQ77Z9A6HTQH3HF65V8T4RK7RYQ55ZR8D29F69W8Z5RR8H3" -"9M7939R8"; - const char *base64AndHexEncoded = -"41414543417751464267634943516F4C4441304F4478415245684D554652595847426B6147787764" -"486838674953496A4A43556D4A7967704B6973734C5334764D4445794D7A51310A4E6A63344F546F" -"375044302B50304242516B4E4552555A4853456C4B5330784E546B395155564A5456465657563168" -"5A576C746358563566594746695932526C5A6D646F615770720A6247317562334278636E4E306458" -"5A3365486C3665337839666E2B4167594B44684957476834694A696F754D6A5936506B4A47536B35" -"53566C7065596D5A71626E4A32656E3643680A6F714F6B7061616E714B6D717136797472712B7773" -"624B7A744C573274376935757275387662362F774D484377385446787366497963724C7A4D334F7A" -"39445230745055316462580A324E6E6132397A6433742F6734654C6A354F586D352B6A7036757673" -"3765377638504879382F5431397666342B6672372F50332B0A"; - std::cout << "\nBase64, base32 and hex coding validation suite running...\n\n"; + static const char hexEncoded[] = + "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627" + "28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F" + "505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677" + "78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F" + "A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7" + "C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF" + "F0F1F2F3F4F5F6F7F8F9FAFBFCFDFE"; + static const char base32Encoded[] = + "AAASEA2EAWDAQCAJBIFS2DIQB6IBCESVCSKTNF22DEPBYHA7D2RUAIJCENUCKJTHFAWUWK3NFWZC8NBT" + "GI3VIPJYG66DUQT5HS8V6R4AIFBEGTCFI3DWSUKKJPGE4VURKBIXEW4WKXMFQYC3MJPX2ZK8M7SGC2VD" + "NTUYN35IPFXGY5DPP3ZZA6MUQP4HK7VZRB6ZW856RX9H9AEBSKB2JBNGS8EIVCWMTUG27D6SUGJJHFEX" + "U4M3TGN4VQQJ5HW9WCS4FI7EWYVKRKFJXKX43MPQX82MDNXVYU45PP72ZG7MZRF7Z496BSQC2RCNMTYH" + "3DE6XU8N3ZHN9WGT4MJ7JXQY49NPVYY55VQ77Z9A6HTQH3HF65V8T4RK7RYQ55ZR8D29F69W8Z5RR8H3" + "9M7939R8"; + static const char base64AndHexEncoded[] = + "41414543417751464267634943516F4C4441304F4478415245684D554652595847426B6147787764" + "486838674953496A4A43556D4A7967704B6973734C5334764D4445794D7A51310A4E6A63344F546F" + "375044302B50304242516B4E4552555A4853456C4B5330784E546B395155564A5456465657563168" + "5A576C746358563566594746695932526C5A6D646F615770720A6247317562334278636E4E306458" + "5A3365486C3665337839666E2B4167594B44684957476834694A696F754D6A5936506B4A47536B35" + "53566C7065596D5A71626E4A32656E3643680A6F714F6B7061616E714B6D717136797472712B7773" + "624B7A744C573274376935757275387662362F774D484377385446787366497963724C7A4D334F7A" + "39445230745055316462580A324E6E6132397A6433742F6734654C6A354F586D352B6A7036757673" + "3765377638504879382F5431397666342B6672372F50332B0A"; + static const char base64URLAndHexEncoded[] = + "41414543417751464267634943516F4C4441304F4478415245684D554652595847426B6147787764" + "486838674953496A4A43556D4A7967704B6973734C5334764D4445794D7A51314E6A63344F546F37" + "5044302D50304242516B4E4552555A4853456C4B5330784E546B395155564A54564656575631685A" + "576C746358563566594746695932526C5A6D646F615770726247317562334278636E4E3064585A33" + "65486C3665337839666E2D4167594B44684957476834694A696F754D6A5936506B4A47536B355356" + "6C7065596D5A71626E4A32656E3643686F714F6B7061616E714B6D717136797472712D7773624B7A" + "744C573274376935757275387662365F774D484377385446787366497963724C7A4D334F7A394452" + "3074505531646258324E6E6132397A6433745F6734654C6A354F586D352D6A703675767337653776" + "38504879385F5431397666342D6672375F50332D"; + + std::cout << "\nBase64, Base64URL, Base32 and Base16 coding validation suite running...\n\n"; fail = !TestFilter(HexEncoder().Ref(), data, 255, (const byte *)hexEncoded, strlen(hexEncoded)); std::cout << (fail ? "FAILED " : "passed "); @@ -2488,6 +2499,16 @@ bool ValidateBaseCode() std::cout << "Base64 Decoding\n"; pass = pass && !fail; + fail = !TestFilter(Base64URLEncoder(new HexEncoder).Ref(), data, 255, (const byte *)base64URLAndHexEncoded, strlen(base64URLAndHexEncoded)); + std::cout << (fail ? "FAILED " : "passed "); + std::cout << "Base64 URL Encoding\n"; + pass = pass && !fail; + + fail = !TestFilter(HexDecoder(new Base64URLDecoder).Ref(), (const byte *)base64URLAndHexEncoded, strlen(base64URLAndHexEncoded), data, 255); + std::cout << (fail ? "FAILED " : "passed "); + std::cout << "Base64 URL Decoding\n"; + pass = pass && !fail; + return pass; }