diff --git a/Builds/VisualStudio2013/RippleD.vcxproj b/Builds/VisualStudio2013/RippleD.vcxproj index e8f4f24879..0cd80d13aa 100644 --- a/Builds/VisualStudio2013/RippleD.vcxproj +++ b/Builds/VisualStudio2013/RippleD.vcxproj @@ -298,6 +298,8 @@ + + @@ -321,6 +323,9 @@ + + True + True diff --git a/Builds/VisualStudio2013/RippleD.vcxproj.filters b/Builds/VisualStudio2013/RippleD.vcxproj.filters index d906a128fe..d338e23361 100644 --- a/Builds/VisualStudio2013/RippleD.vcxproj.filters +++ b/Builds/VisualStudio2013/RippleD.vcxproj.filters @@ -891,6 +891,9 @@ beast + + beast\crypto + beast\crypto @@ -918,6 +921,9 @@ beast\crypto + + beast\crypto\tests + beast\crypto\tests diff --git a/src/beast/beast/crypto/Crypto.unity.cpp b/src/beast/beast/crypto/Crypto.unity.cpp index 7c158fcbae..2e9e0f320e 100644 --- a/src/beast/beast/crypto/Crypto.unity.cpp +++ b/src/beast/beast/crypto/Crypto.unity.cpp @@ -26,5 +26,6 @@ #include #include +#include #include diff --git a/src/beast/beast/crypto/base64.h b/src/beast/beast/crypto/base64.h new file mode 100644 index 0000000000..634610da23 --- /dev/null +++ b/src/beast/beast/crypto/base64.h @@ -0,0 +1,186 @@ +//------------------------------------------------------------------------------ +/* + This file is part of Beast: https://github.com/vinniefalco/Beast + Copyright 2013, Vinnie Falco + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#ifndef BEAST_CRYPTO_BASE64_H_INCLUDED +#define BEAST_CRYPTO_BASE64_H_INCLUDED + +#include +#include + +namespace beast { + +/* + Portions from http://www.adp-gmbh.ch/cpp/common/base64.html + Copyright notice: + + base64.cpp and base64.h + + Copyright (C) 2004-2008 René Nyffenegger + + This source code is provided 'as-is', without any express or implied + warranty. In no event will the author be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this source code must not be misrepresented; you must not + claim that you wrote the original source code. If you use this source code + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original source code. + + 3. This notice may not be removed or altered from any source distribution. + + René Nyffenegger rene.nyffenegger@adp-gmbh.ch + +*/ + +template +std::string const& +base64_alphabet() +{ + static std::string const alphabet = + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789+/"; + return alphabet; +} + +inline +bool +is_base64(unsigned char c) +{ + return (std::isalnum(c) || (c == '+') || (c == '/')); +} + +template +std::string +base64_encode (std::uint8_t const* data, + std::size_t in_len) +{ + unsigned char c3[3], c4[4]; + int i = 0; + int j = 0; + + std::string ret; + ret.reserve (3 + in_len * 8 / 6); + + char const* alphabet (base64_alphabet().data()); + + while(in_len--) + { + c3[i++] = *(data++); + if(i == 3) + { + c4[0] = (c3[0] & 0xfc) >> 2; + c4[1] = ((c3[0] & 0x03) << 4) + ((c3[1] & 0xf0) >> 4); + c4[2] = ((c3[1] & 0x0f) << 2) + ((c3[2] & 0xc0) >> 6); + c4[3] = c3[2] & 0x3f; + for(i = 0; (i < 4); i++) + ret += alphabet[c4[i]]; + i = 0; + } + } + + if(i) + { + for(j = i; j < 3; j++) + c3[j] = '\0'; + + c4[0] = (c3[0] & 0xfc) >> 2; + c4[1] = ((c3[0] & 0x03) << 4) + ((c3[1] & 0xf0) >> 4); + c4[2] = ((c3[1] & 0x0f) << 2) + ((c3[2] & 0xc0) >> 6); + c4[3] = c3[2] & 0x3f; + + for(j = 0; (j < i + 1); j++) + ret += alphabet[c4[j]]; + + while((i++ < 3)) + ret += '='; + } + + return ret; + +} + +template +std::string +base64_encode (std::string const& s) +{ + return base64_encode (reinterpret_cast < + std::uint8_t const*> (s.data()), s.size()); +} + +template +std::string +base64_decode(std::string const& data) +{ + int in_len = data.size(); + unsigned char c3[3], c4[4]; + int i = 0; + int j = 0; + int in_ = 0; + + std::string ret; + ret.reserve (in_len * 6 / 8); // ??? + + while(in_len-- && (data[in_] != '=') && + is_base64(data[in_])) + { + c4[i++] = data[in_]; in_++; + if(i == 4) { + for(i = 0; i < 4; i++) + c4[i] = base64_alphabet().find(c4[i]); + + c3[0] = (c4[0] << 2) + ((c4[1] & 0x30) >> 4); + c3[1] = ((c4[1] & 0xf) << 4) + ((c4[2] & 0x3c) >> 2); + c3[2] = ((c4[2] & 0x3) << 6) + c4[3]; + + for(i = 0; (i < 3); i++) + ret += c3[i]; + i = 0; + } + } + + if(i) + { + for(j = i; j < 4; j++) + c4[j] = 0; + + for(j = 0; j < 4; j++) + c4[j] = base64_alphabet().find(c4[j]); + + c3[0] = (c4[0] << 2) + ((c4[1] & 0x30) >> 4); + c3[1] = ((c4[1] & 0xf) << 4) + ((c4[2] & 0x3c) >> 2); + c3[2] = ((c4[2] & 0x3) << 6) + c4[3]; + + for(j = 0; (j < i - 1); j++) + ret += c3[j]; + } + + return ret; +} + +} + +#endif diff --git a/src/beast/beast/crypto/tests/base64.test.cpp b/src/beast/beast/crypto/tests/base64.test.cpp new file mode 100644 index 0000000000..d42a82802d --- /dev/null +++ b/src/beast/beast/crypto/tests/base64.test.cpp @@ -0,0 +1,51 @@ +//------------------------------------------------------------------------------ +/* + This file is part of Beast: https://github.com/vinniefalco/Beast + Copyright 2013, Vinnie Falco + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#include +#include + +namespace beast { + +class base64_test : public unit_test::suite +{ +public: + void + check (std::string const& in, std::string const& out) + { + auto const encoded = base64_encode (in); + expect (encoded == out); + expect (base64_decode (encoded) == in); + } + + void + run() + { + check ("", ""); + check ("f", "Zg=="); + check ("fo", "Zm8="); + check ("foo", "Zm9v"); + check ("foob", "Zm9vYg=="); + check ("fooba", "Zm9vYmE="); + check ("foobar", "Zm9vYmFy"); + } +}; + +BEAST_DEFINE_TESTSUITE(base64,crypto,beast); + +}