private Payload GetPayload()
{
lock (_lock4GetPayload)
if (_payload == null)
{
PrivateKey myPrivkeyFrom = PrivateKey.GetPrivateKey(_bm.DB, KeyFrom);
if (myPrivkeyFrom == null)
{
throw new Exception("PrivateKey not found");
}
Pubkey pubkeyTo = Pubkey.Find(_bm.DB, KeyTo); // TODO Получать ключ, если его ещё нет
if (pubkeyTo == null)
{
throw new Exception("Pubkey not found");
}
var payload = new MemoryStream(1000 + Subject.Length + Body.Length); // TODO realy 1000?
var rnd = new Random();
ulong dt = DateTime.UtcNow.ToUnix() + (ulong)rnd.Next(600) - 300;
payload.Write(dt);
payload.WriteVarInt(Stream);
var dataToEncrypt = new MemoryStream(1000 + Subject.Length + Body.Length); // TODO realy 1000?
dataToEncrypt.WriteVarInt(Version);
byte[] publicAddress = myPrivkeyFrom.GetPayload4Broadcast();
dataToEncrypt.Write(publicAddress, 0, publicAddress.Length);
dataToEncrypt.Write(pubkeyTo.Hash, 0, 20);
var encodingType = (byte)EncodingType;
dataToEncrypt.Write(encodingType);
dataToEncrypt.WriteVarStr("Subject:" + Subject + "\nBody:" + Body);
byte[] askMsg = PayloadOfAskData().GetFullMsg();
dataToEncrypt.WriteVarInt((UInt64)askMsg.Length);
dataToEncrypt.Write(askMsg, 0, askMsg.Length);
byte[] signature = myPrivkeyFrom.Sign(dataToEncrypt.ToArray());
//Debug.WriteLine("data=" + dataToEncrypt.ToArray().ToHex());
//Debug.WriteLine("SigningKey=" + myPrivkeyFrom.SigningKey.ToHex());
//Debug.WriteLine("signature=" + signature.ToHex());
dataToEncrypt.WriteVarInt((UInt64)signature.Length);
dataToEncrypt.Write(signature, 0, signature.Length);
byte[] bytesToEncrypt = dataToEncrypt.ToArray();
byte[] encrypt = ECDSA.Encrypt(bytesToEncrypt, pubkeyTo.EncryptionKey);
payload.Write(encrypt, 0, encrypt.Length);
_payload = new Payload("msg", ProofOfWork.AddPow(payload.ToArray()));
}
return(_payload);
}