summaryrefslogtreecommitdiff
path: root/boost/beast/core/detail/base64.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/beast/core/detail/base64.hpp')
-rw-r--r--boost/beast/core/detail/base64.hpp182
1 files changed, 20 insertions, 162 deletions
diff --git a/boost/beast/core/detail/base64.hpp b/boost/beast/core/detail/base64.hpp
index 6cb3f67a77..7f91c04777 100644
--- a/boost/beast/core/detail/base64.hpp
+++ b/boost/beast/core/detail/base64.hpp
@@ -1,5 +1,5 @@
//
-// Copyright (c) 2016-2017 Vinnie Falco (vinnie dot falco at gmail dot com)
+// Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com)
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -7,39 +7,10 @@
// Official repository: https://github.com/boostorg/beast
//
-/*
- Portions from http://www.adp-gmbh.ch/cpp/common/base64.html
- Copyright notice:
-
- base64.cpp and base64.h
-
- Copyright (C) 2004-2008 Rene 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.
-
- Rene Nyffenegger rene.nyffenegger@adp-gmbh.ch
-
-*/
-
#ifndef BOOST_BEAST_DETAIL_BASE64_HPP
#define BOOST_BEAST_DETAIL_BASE64_HPP
+#include <boost/beast/core/string.hpp>
#include <cctype>
#include <string>
#include <utility>
@@ -50,44 +21,16 @@ namespace detail {
namespace base64 {
-inline
+BOOST_BEAST_DECL
char const*
-get_alphabet()
-{
- static char constexpr tab[] = {
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
- };
- return &tab[0];
-}
+get_alphabet();
-inline
+BOOST_BEAST_DECL
signed char const*
-get_inverse()
-{
- static signed char constexpr tab[] = {
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 0-15
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 16-31
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, // 32-47
- 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, // 48-63
- -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, // 64-79
- 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, // 80-95
- -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 96-111
- 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1, // 112-127
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 128-143
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 144-159
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 160-175
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 176-191
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 192-207
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 208-223
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 224-239
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 // 240-255
- };
- return &tab[0];
-}
-
+get_inverse();
/// Returns max chars needed to encode a base64 string
-inline
+BOOST_BEAST_DECL
std::size_t constexpr
encoded_size(std::size_t n)
{
@@ -100,7 +43,6 @@ std::size_t constexpr
decoded_size(std::size_t n)
{
return n / 4 * 3; // requires n&3==0, smaller
- //return 3 * n / 4;
}
/** Encode a series of octets as a padded, base64 string.
@@ -115,45 +57,9 @@ decoded_size(std::size_t n)
@return The number of characters written to `out`. This
will exclude any null termination.
*/
-template<class = void>
+BOOST_BEAST_DECL
std::size_t
-encode(void* dest, void const* src, std::size_t len)
-{
- char* out = static_cast<char*>(dest);
- char const* in = static_cast<char const*>(src);
- auto const tab = base64::get_alphabet();
-
- for(auto n = len / 3; n--;)
- {
- *out++ = tab[ (in[0] & 0xfc) >> 2];
- *out++ = tab[((in[0] & 0x03) << 4) + ((in[1] & 0xf0) >> 4)];
- *out++ = tab[((in[2] & 0xc0) >> 6) + ((in[1] & 0x0f) << 2)];
- *out++ = tab[ in[2] & 0x3f];
- in += 3;
- }
-
- switch(len % 3)
- {
- case 2:
- *out++ = tab[ (in[0] & 0xfc) >> 2];
- *out++ = tab[((in[0] & 0x03) << 4) + ((in[1] & 0xf0) >> 4)];
- *out++ = tab[ (in[1] & 0x0f) << 2];
- *out++ = '=';
- break;
-
- case 1:
- *out++ = tab[ (in[0] & 0xfc) >> 2];
- *out++ = tab[((in[0] & 0x03) << 4)];
- *out++ = '=';
- *out++ = '=';
- break;
-
- case 0:
- break;
- }
-
- return out - static_cast<char*>(dest);
-}
+encode(void* dest, void const* src, std::size_t len);
/** Decode a padded base64 string into a series of octets.
@@ -166,75 +72,23 @@ encode(void* dest, void const* src, std::size_t len)
the number of characters read from the input string,
expressed as a pair.
*/
-template<class = void>
+BOOST_BEAST_DECL
std::pair<std::size_t, std::size_t>
-decode(void* dest, char const* src, std::size_t len)
-{
- char* out = static_cast<char*>(dest);
- auto in = reinterpret_cast<unsigned char const*>(src);
- unsigned char c3[3], c4[4];
- int i = 0;
- int j = 0;
-
- auto const inverse = base64::get_inverse();
-
- while(len-- && *in != '=')
- {
- auto const v = inverse[*in];
- if(v == -1)
- break;
- ++in;
- c4[i] = v;
- if(++i == 4)
- {
- 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++)
- *out++ = c3[i];
- i = 0;
- }
- }
-
- if(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(j = 0; j < i - 1; j++)
- *out++ = c3[j];
- }
-
- return {out - static_cast<char*>(dest),
- in - reinterpret_cast<unsigned char const*>(src)};
-}
+decode(void* dest, char const* src, std::size_t len);
} // base64
-template<class = void>
+BOOST_BEAST_DECL
std::string
-base64_encode (std::uint8_t const* data,
- std::size_t len)
-{
- std::string dest;
- dest.resize(base64::encoded_size(len));
- dest.resize(base64::encode(&dest[0], data, len));
- return dest;
-}
+base64_encode(std::uint8_t const* data, std::size_t len);
-inline
+BOOST_BEAST_DECL
std::string
-base64_encode(std::string const& s)
-{
- return base64_encode (reinterpret_cast <
- std::uint8_t const*> (s.data()), s.size());
-}
+base64_encode(string_view s);
template<class = void>
std::string
-base64_decode(std::string const& data)
+base64_decode(string_view data)
{
std::string dest;
dest.resize(base64::decoded_size(data.size()));
@@ -248,4 +102,8 @@ base64_decode(std::string const& data)
} // beast
} // boost
+#ifdef BOOST_BEAST_HEADER_ONLY
+#include <boost/beast/core/detail/base64.ipp>
+#endif
+
#endif