mirror of
https://github.com/overte-org/overte.git
synced 2025-07-23 06:26:14 +02:00
86 lines
No EOL
2.9 KiB
C++
86 lines
No EOL
2.9 KiB
C++
//
|
|
// SignedWalletTransaction.cpp
|
|
// interface/src
|
|
//
|
|
// Created by Stephen Birarda on 2014-07-11.
|
|
// Copyright 2014 High Fidelity, Inc.
|
|
//
|
|
// Distributed under the Apache License, Version 2.0.
|
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
|
//
|
|
|
|
#include <QtCore/QCryptographicHash>
|
|
#include <QtCore/QDebug>
|
|
#include <QtCore/QFile>
|
|
|
|
#include <openssl/bio.h>
|
|
#include <openssl/rsa.h>
|
|
#include <openssl/pem.h>
|
|
|
|
#include <AccountManager.h>
|
|
|
|
#include "Menu.h"
|
|
|
|
#include "SignedWalletTransaction.h"
|
|
|
|
SignedWalletTransaction::SignedWalletTransaction(const QUuid& destinationUUID, qint64 amount,
|
|
qint64 messageTimestamp, qint64 expiryDelta) :
|
|
WalletTransaction(destinationUUID, amount),
|
|
_messageTimestamp(messageTimestamp),
|
|
_expiryDelta(expiryDelta)
|
|
{
|
|
|
|
}
|
|
|
|
QByteArray SignedWalletTransaction::binaryMessage() {
|
|
// build the message using the components of this transaction
|
|
|
|
// UUID, source UUID, destination UUID, message timestamp, expiry delta, amount
|
|
QByteArray messageBinary;
|
|
|
|
messageBinary.append(_uuid.toRfc4122());
|
|
|
|
messageBinary.append(reinterpret_cast<const char*>(&_messageTimestamp), sizeof(_messageTimestamp));
|
|
messageBinary.append(reinterpret_cast<const char*>(&_expiryDelta), sizeof(_expiryDelta));
|
|
|
|
messageBinary.append(AccountManager::getInstance().getAccountInfo().getWalletID().toRfc4122());
|
|
|
|
messageBinary.append(_destinationUUID.toRfc4122());
|
|
|
|
messageBinary.append(reinterpret_cast<const char*>(&_amount), sizeof(_amount));
|
|
|
|
return messageBinary;
|
|
}
|
|
|
|
QByteArray SignedWalletTransaction::hexMessage() {
|
|
return binaryMessage().toHex();
|
|
}
|
|
|
|
QByteArray SignedWalletTransaction::messageDigest() {
|
|
return QCryptographicHash::hash(hexMessage(), QCryptographicHash::Sha256).toHex();
|
|
}
|
|
|
|
QByteArray SignedWalletTransaction::signedMessageDigest() {
|
|
// pull the current private key from menu into RSA structure in memory
|
|
QByteArray privateKeyByteArray = Menu::getInstance()->getWalletPrivateKey();
|
|
|
|
BIO* privateKeyBIO = NULL;
|
|
RSA* rsaPrivateKey = NULL;
|
|
|
|
privateKeyBIO = BIO_new_mem_buf(privateKeyByteArray.data(), privateKeyByteArray.size());
|
|
PEM_read_bio_RSAPrivateKey(privateKeyBIO, &rsaPrivateKey, NULL, NULL);
|
|
|
|
QByteArray digestToEncrypt = messageDigest();
|
|
QByteArray encryptedDigest(RSA_size(rsaPrivateKey), 0);
|
|
|
|
int encryptReturn = RSA_private_encrypt(digestToEncrypt.size(),
|
|
reinterpret_cast<const unsigned char*>(digestToEncrypt.constData()),
|
|
reinterpret_cast<unsigned char*>(encryptedDigest.data()),
|
|
rsaPrivateKey, RSA_PKCS1_PADDING);
|
|
|
|
// free the two structures used
|
|
BIO_free(privateKeyBIO);
|
|
RSA_free(rsaPrivateKey);
|
|
|
|
return (encryptReturn != -1) ? encryptedDigest : QByteArray();
|
|
} |