2015-10-12 17:02:59 +00:00
|
|
|
/*
|
2015-10-12 17:48:40 +00:00
|
|
|
* Copyright (c) 2015 Cryptonomex, Inc., and contributors.
|
|
|
|
|
*
|
2016-01-06 09:51:18 +00:00
|
|
|
* The MIT License
|
2015-10-12 17:48:40 +00:00
|
|
|
*
|
2016-01-06 09:51:18 +00:00
|
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
|
|
|
* of this software and associated documentation files (the "Software"), to deal
|
|
|
|
|
* in the Software without restriction, including without limitation the rights
|
|
|
|
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
|
|
|
* copies of the Software, and to permit persons to whom the Software is
|
|
|
|
|
* furnished to do so, subject to the following conditions:
|
2015-10-12 17:48:40 +00:00
|
|
|
*
|
2016-01-06 09:51:18 +00:00
|
|
|
* The above copyright notice and this permission notice shall be included in
|
|
|
|
|
* all copies or substantial portions of the Software.
|
2015-10-12 17:02:59 +00:00
|
|
|
*
|
2016-01-06 09:51:18 +00:00
|
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
|
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
|
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
|
|
|
* THE SOFTWARE.
|
2015-10-12 17:02:59 +00:00
|
|
|
*/
|
2015-07-08 20:39:23 +00:00
|
|
|
#include <graphene/chain/protocol/memo.hpp>
|
|
|
|
|
#include <fc/crypto/aes.hpp>
|
2019-05-13 22:18:12 +00:00
|
|
|
#include <fc/io/raw.hpp>
|
2015-07-08 20:39:23 +00:00
|
|
|
|
|
|
|
|
namespace graphene { namespace chain {
|
|
|
|
|
|
|
|
|
|
void memo_data::set_message(const fc::ecc::private_key& priv, const fc::ecc::public_key& pub,
|
|
|
|
|
const string& msg, uint64_t custom_nonce)
|
|
|
|
|
{
|
2021-11-18 17:32:30 +00:00
|
|
|
if( priv != fc::ecc::private_key() && pub.valid() )
|
2015-07-08 20:39:23 +00:00
|
|
|
{
|
2015-07-27 20:01:16 +00:00
|
|
|
from = priv.get_public_key();
|
|
|
|
|
to = pub;
|
2015-07-08 20:39:23 +00:00
|
|
|
if( custom_nonce == 0 )
|
|
|
|
|
{
|
|
|
|
|
uint64_t entropy = fc::sha224::hash(fc::ecc::private_key::generate())._hash[0];
|
|
|
|
|
entropy <<= 32;
|
|
|
|
|
entropy &= 0xff00000000000000;
|
|
|
|
|
nonce = (fc::time_point::now().time_since_epoch().count() & 0x00ffffffffffffff) | entropy;
|
|
|
|
|
} else
|
|
|
|
|
nonce = custom_nonce;
|
|
|
|
|
auto secret = priv.get_shared_secret(pub);
|
|
|
|
|
auto nonce_plus_secret = fc::sha512::hash(fc::to_string(nonce) + secret.str());
|
|
|
|
|
string text = memo_message(digest_type::hash(msg)._hash[0], msg).serialize();
|
|
|
|
|
message = fc::aes_encrypt( nonce_plus_secret, vector<char>(text.begin(), text.end()) );
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
auto text = memo_message(0, msg).serialize();
|
|
|
|
|
message = vector<char>(text.begin(), text.end());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
string memo_data::get_message(const fc::ecc::private_key& priv,
|
|
|
|
|
const fc::ecc::public_key& pub)const
|
|
|
|
|
{
|
2021-11-18 17:32:30 +00:00
|
|
|
if( from != public_key_type() && pub.valid() )
|
2015-07-08 20:39:23 +00:00
|
|
|
{
|
|
|
|
|
auto secret = priv.get_shared_secret(pub);
|
|
|
|
|
auto nonce_plus_secret = fc::sha512::hash(fc::to_string(nonce) + secret.str());
|
|
|
|
|
auto plain_text = fc::aes_decrypt( nonce_plus_secret, message );
|
|
|
|
|
auto result = memo_message::deserialize(string(plain_text.begin(), plain_text.end()));
|
|
|
|
|
FC_ASSERT( result.checksum == uint32_t(digest_type::hash(result.text)._hash[0]) );
|
|
|
|
|
return result.text;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return memo_message::deserialize(string(message.begin(), message.end())).text;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
string memo_message::serialize() const
|
|
|
|
|
{
|
|
|
|
|
auto serial_checksum = string(sizeof(checksum), ' ');
|
|
|
|
|
(uint32_t&)(*serial_checksum.data()) = checksum;
|
|
|
|
|
return serial_checksum + text;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
memo_message memo_message::deserialize(const string& serial)
|
|
|
|
|
{
|
|
|
|
|
memo_message result;
|
|
|
|
|
FC_ASSERT( serial.size() >= sizeof(result.checksum) );
|
|
|
|
|
result.checksum = ((uint32_t&)(*serial.data()));
|
|
|
|
|
result.text = serial.substr(sizeof(result.checksum));
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} } // graphene::chain
|
2019-05-19 09:38:40 +00:00
|
|
|
|
|
|
|
|
GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::memo_message )
|
|
|
|
|
GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::memo_data )
|