From 4d74555c171011d52f7912a7fa4c672293f42299 Mon Sep 17 00:00:00 2001 From: DenioD <41270280+DenioD@users.noreply.github.com> Date: Mon, 1 Jun 2020 00:03:11 +0200 Subject: [PATCH] first message encryption with static keys - work in progress --- src/chatmodel.cpp | 198 ++++----------------------------------------- src/controller.cpp | 110 +++++++++++++++++++++++-- 2 files changed, 121 insertions(+), 187 deletions(-) diff --git a/src/chatmodel.cpp b/src/chatmodel.cpp index 8b5f97d..9a2e5f5 100644 --- a/src/chatmodel.cpp +++ b/src/chatmodel.cpp @@ -386,217 +386,53 @@ Tx MainWindow::createTxFromChatPage() { //////////////////////////////////////////////////Lets create Alice keys for the conversation/////////////////////////////////// /////////////////Alice Pubkey - #define MESSAGEAP ((const unsigned char *) "Ioesd")///////////static atm, in future we will use the CID here + #define MESSAGEAP ((const unsigned char *) "Hallo")///////////static atm, in future we will use the CID here #define MESSAGEAP_LEN 5 - unsigned char alice_publickey[crypto_secretstream_xchacha20poly1305_KEYBYTES]; + unsigned char alice_publickey[crypto_box_PUBLICKEYBYTES]; crypto_generichash(alice_publickey, sizeof alice_publickey, MESSAGEAP, MESSAGEAP_LEN, NULL, 0); QString alice = QString::fromLocal8Bit((char*)alice_publickey); - qDebug()<<"Alice Pubkey : "<( c1 ) ); - - qDebug()<<"Size QString with encrypted data :"<< memo.length(); ////We check the length here, to compare it with the length our QString - - ///////Just for testing we convert the unsigned char* to std::string, to see if we can decrypt,and that works.//////////// - - std::string encryptedMemo(reinterpret_cast(c1), CIPHERTEXT_LEN); - - - qDebug()<<"Size std::string with encrypted data :"<< encryptedMemo.length(); ////We check the length here, to compare it with the length our QString - - - - /////////////////////////////////Now we create Bobs keys, just for testing at this place. If the encryption/decryption works we put it in Controller.cpp (RefreshTransactions) + #define CIPHERTEXT_LEN (crypto_box_MACBYTES + MESSAGE_LEN) + unsigned char ciphertext[CIPHERTEXT_LEN]; + + //////Encrypt the message. ATM static keys, this will change! + if (crypto_box_easy(ciphertext, MESSAGE, MESSAGE_LEN, alice_publickey, + alice_publickey, alice_publickey) != 0) { + /* error */ + } - /////////////////Bob Pubkey///////////////////////////////// - #define MESSAGEBAP1 ((const unsigned char *) "Hal12")///////////static atm, in future we will use the CID here - #define MESSAGEBAP1_LEN 5 - - unsigned char bob1_publickey[crypto_secretstream_xchacha20poly1305_KEYBYTES]; - - crypto_generichash(bob1_publickey, sizeof bob1_publickey, - MESSAGEBAP1, MESSAGEBAP1_LEN, - NULL, 0); - - qDebug()<<"Bobs Pubkey created"; - - /////////////////Bob Secretkey - #define MESSAGEBS ((const unsigned char *) "Hal11")///////////static atm, in future we will use the Passphrase here - #define MESSAGEBS_LEN 5 - - unsigned char bob_secretkey[crypto_secretstream_xchacha20poly1305_HEADERBYTES]; - - crypto_generichash(bob_secretkey, sizeof bob_secretkey, - MESSAGEBS, MESSAGEBS_LEN, - NULL, 0); - - qDebug()<<"Bobs Pubkey created"; - - /////////////////Alice Pubkey bob creates - #define MESSAGEA121 ((const unsigned char *) "Ioesd")///////////static atm, in future we will use the CID here - #define MESSAGEAP121_LEN 5 - - unsigned char alice1_publickey[crypto_secretstream_xchacha20poly1305_KEYBYTES]; - - crypto_generichash(alice1_publickey, sizeof alice1_publickey, - MESSAGEA121, MESSAGEAP121_LEN, - NULL, 0); - - QString alice1 = QString::fromLocal8Bit((char*)alice1_publickey); - qDebug()<<"Alice Pubkey Bob create: "<(m),MESSAGE1_LEN); - /////Now we can convert it to QString - QString memodecrypt = QString::fromUtf8( decryptedMemo.data(), decryptedMemo.size()); - - //////////////Give us the output of the decrypted message as debug to see if it was successfully - qDebug()<<"OUT decrypt:" << memodecrypt; - + /////CIphertext Memo + QString memo = QByteArray(reinterpret_cast(ciphertext), CIPHERTEXT_LEN).toHex(); + + tx.toAddrs.push_back(ToFields{addr, amt, hmemo}); tx.toAddrs.push_back(ToFields{addr, amt, memo}); diff --git a/src/controller.cpp b/src/controller.cpp index 0c79240..39efa6a 100644 --- a/src/controller.cpp +++ b/src/controller.cpp @@ -907,10 +907,12 @@ void Controller::refreshTransactions() { this->refresh(true); } + // QString memo1; + QString memo; if (!o["memo"].is_null()) { - memo = QString::fromStdString(o["memo"]); - + QString memo = QString::fromStdString(o["memo"].get()); + QString cid; bool isNotarized; @@ -921,12 +923,89 @@ void Controller::refreshTransactions() { isNotarized = false; } +/////////////////////////////////Now we create Bobs keys, just for testing at this place. If the encryption/decryption works we put it in Controller.cpp (RefreshTransactions) + + /////////////////Alice Pubkey bob create + #define MESSAGEAP ((const unsigned char *) "Hallo")///////////static atm, in future we will use the CID here + #define MESSAGEAP_LEN 5 + + unsigned char alice_publickey[crypto_box_PUBLICKEYBYTES]; + + crypto_generichash(alice_publickey, sizeof alice_publickey, + MESSAGEAP, MESSAGEAP_LEN, + NULL, 0); + + + /////////////////Bob Secretkey + + #define MESSAGEAS ((const unsigned char *) "Hallo")///////////static atm, in future we will use the Passphrase here + #define MESSAGEAS_LEN 5 + + unsigned char bob_secretkey[crypto_box_SECRETKEYBYTES]; + + crypto_generichash(bob_secretkey, sizeof bob_secretkey, + MESSAGEAS, MESSAGEAS_LEN, + NULL, 0); + + /////////////////Bob Pubkey + #define MESSAGEBAP ((const unsigned char *) "Hallo")///////////static atm, in future we will use the CID here + #define MESSAGEBAP_LEN 5 + + unsigned char bob_publickey[crypto_box_PUBLICKEYBYTES]; + + crypto_generichash(bob_publickey, sizeof bob_publickey, + MESSAGEBAP, MESSAGEBAP_LEN, + NULL, 0); + + + + /////We need to filter out Memos smaller then the ciphertext size, or it will dump + + if ((memo.length() > 120) && (memo.startsWith("{") == false)) + { + + + const QByteArray ba = QByteArray::fromHex(memo.toLatin1()); + const unsigned char *encryptedMemo = reinterpret_cast(ba.constData()); + + int encryptedMemoSize1 = ba.length(); + + //////unsigned char* as message from QString + #define MESSAGE2 (const unsigned char *) encryptedMemo + + ///////// length of the encrypted message + #define CIPHERTEXT1_LEN encryptedMemoSize1 + + ///////Message length is smaller then the encrypted message + #define MESSAGE1_LEN encryptedMemoSize1 - crypto_box_MACBYTES + + //////Set the length of the decrypted message + + unsigned char decrypted[MESSAGE1_LEN]; + + ///////Decrypt the message + if (crypto_box_open_easy(decrypted, MESSAGE2, CIPHERTEXT1_LEN, alice_publickey, + alice_publickey, alice_publickey) != 0) { + /* message for Bob pretending to be from Alice has been forged! */ + } + + /////Our decrypted message is now in decrypted. We need it as QString to render it + /////Only the QString gives weird data, so convert first to std::string + + std::string decryptedMemo(reinterpret_cast(decrypted),MESSAGE1_LEN); + + /////Now we can convert it to QString + QString memodecrypt = QString::fromUtf8( decryptedMemo.data(), decryptedMemo.size()); - ChatItem item = ChatItem( + //////////////Give us the output of the decrypted message as debug to see if it was successfully + qDebug()<<"OUT decrypt:" << memodecrypt; + + + ChatItem item = ChatItem( datetime, address, QString(""), - memo, + memodecrypt, QString(""), QString(""), cid, @@ -940,9 +1019,28 @@ void Controller::refreshTransactions() { - } + }else{ + + + ChatItem item = ChatItem( + datetime, + address, + QString(""), + memo, + QString(""), + QString(""), + cid, + txid, + confirmations, + true, + isNotarized, + false + ); + DataStore::getChatDataStore()->setData(ChatIDGenerator::getInstance()->generateID(item), item); + + } - + } items.push_back(TransactionItemDetail{address, amount, memo}); total_amount = total_amount + amount; }