Replace epee base64 with oxen-encoding

This commit is contained in:
Jason Rhinelander 2022-02-11 14:13:30 -04:00
parent a66fc8ae61
commit c86a7a2a28
No known key found for this signature in database
GPG Key ID: C4992CE7A88D4262
6 changed files with 19 additions and 267 deletions

View File

@ -1,243 +0,0 @@
// Copyright (c) 2006-2013, Andrey N. Sabelnikov, www.sabelnikov.net
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
// * Neither the name of the Andrey N. Sabelnikov nor the
// names of its contributors may be used to endorse or promote products
// derived from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER BE LIABLE FOR ANY
// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
#ifndef _STRING_CODING_H_
#define _STRING_CODING_H_
#include <string>
namespace epee
{
namespace string_encoding
{
inline std::string convert_to_ansii(const std::wstring& str_from)
{
std::string res(str_from.begin(), str_from.end());
return res;
/*
std::string result;
std::locale loc;
for(unsigned int i= 0; i < str_from.size(); ++i)
{
result += std::use_facet<std::ctype<wchar_t> >(loc).narrow(str_from[i]);
}
return result;
*/
//return boost::lexical_cast<std::string>(str_from);
/*
std::string str_trgt;
if(!str_from.size())
return str_trgt;
int cb = ::WideCharToMultiByte( code_page, 0, str_from.data(), (__int32)str_from.size(), 0, 0, 0, 0 );
if(!cb)
return str_trgt;
str_trgt.resize(cb);
::WideCharToMultiByte( code_page, 0, str_from.data(), (int)str_from.size(),
(char*)str_trgt.data(), (int)str_trgt.size(), 0, 0);
return str_trgt;*/
}
inline std::string convert_to_ansii(const std::string& str_from)
{
return str_from;
}
inline std::wstring convert_to_unicode(const std::string& str_from)
{
std::wstring result;
std::locale loc;
for(unsigned int i= 0; i < str_from.size(); ++i)
{
result += std::use_facet<std::ctype<wchar_t> >(loc).widen(str_from[i]);
}
return result;
//return boost::lexical_cast<std::wstring>(str_from);
/*
std::wstring str_trgt;
if(!str_from.size())
return str_trgt;
int cb = ::MultiByteToWideChar( code_page, 0, str_from.data(), (int)str_from.size(), 0, 0 );
if(!cb)
return str_trgt;
str_trgt.resize(cb);
::MultiByteToWideChar( code_page, 0, str_from.data(),(int)str_from.size(),
(wchar_t*)str_trgt.data(),(int)str_trgt.size());
return str_trgt;*/
}
inline std::wstring convert_to_unicode(const std::wstring& str_from)
{
return str_from;
}
template<class target_string>
inline target_string convert_to_t(const std::wstring& str_from);
template<>
inline std::string convert_to_t<std::string>(const std::wstring& str_from)
{
return convert_to_ansii(str_from);
}
template<>
inline std::wstring convert_to_t<std::wstring>(const std::wstring& str_from)
{
return str_from;
}
template<class target_string>
inline target_string convert_to_t(const std::string& str_from);
template<>
inline std::string convert_to_t<std::string>(const std::string& str_from)
{
return str_from;
}
template<>
inline std::wstring convert_to_t<std::wstring>(const std::string& str_from)
{
return convert_to_unicode(str_from);
}
inline
std::string& base64_chars()
{
static std::string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"0123456789+/";
return chars;
}
inline
std::string base64_encode(unsigned char const* bytes_to_encode, size_t in_len) {
std::string ret;
int i = 0;
int j = 0;
unsigned char char_array_3[3];
unsigned char char_array_4[4];
while (in_len--) {
char_array_3[i++] = *(bytes_to_encode++);
if (i == 3) {
char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
char_array_4[3] = char_array_3[2] & 0x3f;
for(i = 0; (i <4) ; i++)
ret += base64_chars()[char_array_4[i]];
i = 0;
}
}
if (i)
{
for(j = i; j < 3; j++)
char_array_3[j] = '\0';
char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
char_array_4[3] = char_array_3[2] & 0x3f;
for (j = 0; (j < i + 1); j++)
ret += base64_chars()[char_array_4[j]];
while((i++ < 3))
ret += '=';
}
return ret;
}
inline
std::string base64_encode(const std::string& str)
{
return base64_encode((unsigned char const* )str.data(), str.size());
}
inline bool is_base64(unsigned char c) {
return (isalnum(c) || (c == '+') || (c == '/'));
}
inline
std::string base64_decode(std::string const& encoded_string) {
size_t in_len = encoded_string.size();
size_t i = 0;
size_t j = 0;
size_t in_ = 0;
unsigned char char_array_4[4], char_array_3[3];
std::string ret;
while (in_len-- && ( encoded_string[in_] != '=') && is_base64(encoded_string[in_])) {
char_array_4[i++] = encoded_string[in_]; in_++;
if (i ==4) {
for (i = 0; i <4; i++)
char_array_4[i] = (unsigned char)base64_chars().find(char_array_4[i]);
char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
for (i = 0; (i < 3); i++)
ret += char_array_3[i];
i = 0;
}
}
if (i) {
for (j = i; j <4; j++)
char_array_4[j] = 0;
for (j = 0; j <4; j++)
char_array_4[j] = (unsigned char)base64_chars().find(char_array_4[j]);
char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
for (j = 0; (j < i - 1); j++) ret += char_array_3[j];
}
return ret;
}
}
}
#endif //_STRING_CODING_H_

View File

@ -39,7 +39,6 @@
#include "common/util.h"
#include "common/file.h"
#include "common/string_util.h"
#include "epee/string_coding.h"
#include "epee/string_tools.h"
#include "epee/storages/portable_storage_template_helper.h"

View File

@ -84,7 +84,6 @@
#include "wallet/message_store.h"
#endif
#include "wallet/wallet_rpc_server_commands_defs.h"
#include "epee/string_coding.h"
extern "C"
{

View File

@ -27,10 +27,10 @@
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "message_transporter.h"
#include "epee/string_coding.h"
#include <boost/format.hpp>
#include "wallet_errors.h"
#include <algorithm>
#include <oxenc/base64.h>
#undef OXEN_DEFAULT_LOG_CATEGORY
#define OXEN_DEFAULT_LOG_CATEGORY "wallet.mms"
@ -129,26 +129,26 @@ bool message_transporter::receive_messages(const std::vector<std::string> &desti
const bitmessage_rpc::message_info &message_info = bitmessage_res.inboxMessages[i];
if (std::find(destination_transport_addresses.begin(), destination_transport_addresses.end(), message_info.toAddress) != destination_transport_addresses.end())
{
transport_message message{};
bool is_mms_message = false;
try
{
// First Base64-decoding: The message body is Base64 in the Bitmessage API
std::string message_body = epee::string_encoding::base64_decode(message_info.message);
if (!oxenc::is_base64(message_info.message))
throw std::runtime_error{"not base64"};
std::string message_body = oxenc::from_base64(message_info.message);
// Second Base64-decoding: The MMS uses Base64 to hide non-textual data in its JSON from Bitmessage
json = epee::string_encoding::base64_decode(message_body);
if (!epee::serialization::load_t_from_json(message, json))
MERROR("Failed to deserialize message");
else
is_mms_message = true;
// (WTF?)
if (!oxenc::is_base64(message_body))
throw std::runtime_error{"decoded base64 does not contain more base64"};
transport_message message{};
if (!epee::serialization::load_t_from_json(message, oxenc::from_base64(message_body)))
throw std::runtime_error{"epee json-to-type deserialization failed"};
message.transport_id = message_info.msgid;
messages.push_back(std::move(message));
}
catch(const std::exception& e)
{
}
if (is_mms_message)
{
message.transport_id = message_info.msgid;
messages.push_back(message);
MERROR("Failed to deserialize message: " << e.what());
}
}
}
@ -164,9 +164,8 @@ void message_transporter::send_message(const transport_message &message)
add_xml_rpc_string_param(request, message.destination_transport_address);
add_xml_rpc_string_param(request, message.source_transport_address);
add_xml_rpc_base64_param(request, message.subject);
std::string json = epee::serialization::store_t_to_json(message);
std::string message_body = epee::string_encoding::base64_encode(json); // See comment in "receive_message" about reason for (double-)Base64 encoding
add_xml_rpc_base64_param(request, message_body);
// See comment in "receive_message" about (shitty) reason for (double-)Base64 encoding
add_xml_rpc_base64_param(request, oxenc::to_base64(epee::serialization::store_t_to_json(message)));
add_xml_rpc_integer_param(request, 2);
end_xml_rpc_cmd(request);
std::string answer;
@ -294,8 +293,7 @@ void message_transporter::add_xml_rpc_string_param(std::string &xml, const std::
void message_transporter::add_xml_rpc_base64_param(std::string &xml, const std::string &param)
{
// Bitmessage expects some arguments Base64-encoded, but it wants them as parameters of type "string", not "base64" that is also part of XML-RPC
std::string encoded_param = epee::string_encoding::base64_encode(param);
xml += (boost::format("<param><value><string>%s</string></value></param>") % encoded_param).str();
xml += (boost::format("<param><value><string>%s</string></value></param>") % oxenc::to_base64(param)).str();
}
void message_transporter::add_xml_rpc_integer_param(std::string &xml, const int32_t &param)

View File

@ -89,7 +89,6 @@
#include "cryptonote_core/service_node_rules.h"
#include "common/oxen.h"
#include "oxen_economy.h"
#include "epee/string_coding.h"
extern "C"
{

View File

@ -35,6 +35,7 @@
#include "cryptonote_basic/cryptonote_basic_impl.h"
#include <chrono>
#include <exception>
#include <oxenc/base64.h>
#include "wallet_rpc_server_error_codes.h"
#include "wallet_rpc_server.h"
@ -47,7 +48,6 @@
#include "cryptonote_basic/account.h"
#include "multisig/multisig.h"
#include "epee/misc_language.h"
#include "epee/string_coding.h"
#include "epee/string_tools.h"
#include "epee/wipeable_string.h"
#include "crypto/hash.h"
@ -544,7 +544,7 @@ namespace tools
crypto::rand(rand_128bit.size(), rand_128bit.data());
m_login.emplace(
default_rpc_username,
epee::string_encoding::base64_encode(rand_128bit.data(), rand_128bit.size())
oxenc::to_base64(rand_128bit.begin(), rand_128bit.end())
);
std::string temp = "oxen-wallet-rpc." + std::to_string(port) + ".login";