Merge branch 'dev' of https://git.hush.is/hush/SilentDragonLite into sdl-odinzu
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -42,3 +42,5 @@ silentdragonlite_plugin_import.cpp
|
|||||||
silentdragonlite_resource.rc
|
silentdragonlite_resource.rc
|
||||||
SilentDragonLite
|
SilentDragonLite
|
||||||
.gdb_history
|
.gdb_history
|
||||||
|
.*sw?
|
||||||
|
core
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ make -j$(nproc) install
|
|||||||
```
|
```
|
||||||
# Build MXE (Cross-compiled Qt5 for Windows in Linux)
|
# Build MXE (Cross-compiled Qt5 for Windows in Linux)
|
||||||
```
|
```
|
||||||
mkdir ~/github && cd ~/github
|
mkdir ~/git && cd ~/git
|
||||||
git clone https://github.com/mxe/mxe.git
|
git clone https://github.com/mxe/mxe.git
|
||||||
cd mxe
|
cd mxe
|
||||||
|
|
||||||
|
|||||||
13
build.sh
13
build.sh
@@ -1,5 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# Copyright 2019-2021 The Hush Developers
|
# Copyright 2019-2021 The Hush Developers
|
||||||
|
# Released under the GPLv3
|
||||||
|
|
||||||
UNAME=$(uname)
|
UNAME=$(uname)
|
||||||
|
|
||||||
@@ -13,6 +14,18 @@ else
|
|||||||
JOBS=1
|
JOBS=1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# check if rustc and cargo are installed, otherwise exit with error
|
||||||
|
if ! command -v rustc &> /dev/null
|
||||||
|
then
|
||||||
|
echo "rustc could not be found. Please install it and try again."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if ! command -v cargo &> /dev/null
|
||||||
|
then
|
||||||
|
echo "cargo could not be found. Please install it and try again."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
VERSION=$(cat src/version.h |cut -d\" -f2)
|
VERSION=$(cat src/version.h |cut -d\" -f2)
|
||||||
echo "Compiling SilentDragonLite $VERSION with $JOBS threads..."
|
echo "Compiling SilentDragonLite $VERSION with $JOBS threads..."
|
||||||
CONF=silentdragon-lite.pro
|
CONF=silentdragon-lite.pro
|
||||||
|
|||||||
@@ -223,4 +223,4 @@ pub extern fn litelib_rust_free_string(s: *mut c_char) {
|
|||||||
if s.is_null() { return }
|
if s.is_null() { return }
|
||||||
CString::from_raw(s)
|
CString::from_raw(s)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,26 +1,51 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
# Copyright 2019-2021 The Hush developers
|
||||||
|
# Released under the GPLv3
|
||||||
|
VERSION=1.0.18
|
||||||
|
|
||||||
# First thing to do is see if libsodium.a exists in the res folder. If it does, then there's nothing to do
|
# First thing to do is see if libsodium.a exists in the res folder. If it does, then there's nothing to do
|
||||||
if [ -f res/libsodium.a ]; then
|
if [ -f res/libsodium.a ]; then
|
||||||
|
echo "libsodium $VERSION is already built! Nothing to do"
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Building libsodium"
|
echo "Building libsodium $VERSION"
|
||||||
|
|
||||||
|
if ! command -v curl &> /dev/null
|
||||||
|
then
|
||||||
|
echo "curl could not be found. Please install it and try again."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
# Go into the lib sodium directory
|
# Go into the lib sodium directory
|
||||||
cd res/libsodium
|
cd res/libsodium
|
||||||
if [ ! -f libsodium-1.0.18.tar.gz ]; then
|
if [ ! -f libsodium-1.0.18.tar.gz ]; then
|
||||||
|
echo "Downloading libsodium $VERSION"
|
||||||
curl -LO https://github.com/MyHush/libsodium/releases/download/1.0.18/libsodium-1.0.18.tar.gz
|
curl -LO https://github.com/MyHush/libsodium/releases/download/1.0.18/libsodium-1.0.18.tar.gz
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ ! -f libsodium-1.0.18.tar.gz ]; then
|
||||||
|
echo "Unable to download libsodium $VERSION !!! Aborting"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
if [ ! -d libsodium-1.0.18 ]; then
|
if [ ! -d libsodium-1.0.18 ]; then
|
||||||
|
echo "Unpacking libsodium $VERSION"
|
||||||
tar xf libsodium-1.0.18.tar.gz
|
tar xf libsodium-1.0.18.tar.gz
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ ! -d libsodium-1.0.18 ]; then
|
||||||
|
echo "Unable to unpack libsodium $VERSION !!! Aborting"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
# Now build it
|
# Now build it
|
||||||
cd libsodium-1.0.18
|
cd libsodium-1.0.18
|
||||||
|
echo "Configuring libsodium $VERSION"
|
||||||
LIBS="" ./configure
|
LIBS="" ./configure
|
||||||
make clean
|
make clean
|
||||||
|
|
||||||
|
echo "Compiling libsodium $VERSION"
|
||||||
if [[ "$OSTYPE" == "darwin"* ]]; then
|
if [[ "$OSTYPE" == "darwin"* ]]; then
|
||||||
make CFLAGS="-mmacosx-version-min=10.11" CPPFLAGS="-mmacosx-version-min=10.11" -j4
|
make CFLAGS="-mmacosx-version-min=10.11" CPPFLAGS="-mmacosx-version-min=10.11" -j4
|
||||||
else
|
else
|
||||||
@@ -28,5 +53,10 @@ else
|
|||||||
fi
|
fi
|
||||||
cd ..
|
cd ..
|
||||||
|
|
||||||
|
if [ ! -e libsodium-1.0.18/src/libsodium/.libs/libsodium.a ]; then
|
||||||
|
echo "Unable to compile libsodium $VERSION !!! Aborting"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
# copy the library to the parents's res/ folder
|
# copy the library to the parents's res/ folder
|
||||||
cp libsodium-1.0.18/src/libsodium/.libs/libsodium.a ../
|
cp libsodium-1.0.18/src/libsodium/.libs/libsodium.a ../
|
||||||
|
|||||||
@@ -1083,21 +1083,20 @@ void Controller::refreshTransactions() {
|
|||||||
unsigned char tag[crypto_secretstream_xchacha20poly1305_TAG_FINAL];
|
unsigned char tag[crypto_secretstream_xchacha20poly1305_TAG_FINAL];
|
||||||
crypto_secretstream_xchacha20poly1305_state state;
|
crypto_secretstream_xchacha20poly1305_state state;
|
||||||
|
|
||||||
/////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
|
|
||||||
// crypto_secretstream_xchacha20poly1305_keygen(client_rx);
|
|
||||||
if (crypto_secretstream_xchacha20poly1305_init_pull(&state, header, server_tx) != 0) {
|
if (crypto_secretstream_xchacha20poly1305_init_pull(&state, header, server_tx) != 0) {
|
||||||
/* Invalid header, no need to go any further */
|
/* Invalid header, no need to go any further */
|
||||||
qDebug() << "refreshTransactions: crypto_secretstream_xchacha20poly1305_init_pull error!";
|
qDebug() << "refreshTransactions: crypto_secretstream_xchacha20poly1305_init_pull error! Invalid header";
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (crypto_secretstream_xchacha20poly1305_pull(&state, decrypted, NULL, tag, MESSAGE2, CIPHERTEXT1_LEN, NULL, 0) != 0) {
|
if (crypto_secretstream_xchacha20poly1305_pull(&state, decrypted, NULL, tag, MESSAGE2, CIPHERTEXT1_LEN, NULL, 0) != 0) {
|
||||||
/* Invalid/incomplete/corrupted ciphertext - abort */
|
/* Invalid/incomplete/corrupted ciphertext - abort */
|
||||||
qDebug() << "refreshTransactions: crypto_secretstream_xchacha20poly1305_pull error!";
|
qDebug() << "refreshTransactions: crypto_secretstream_xchacha20poly1305_pull error! Invalid ciphertext";
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/////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<char*>(decrypted),MESSAGE1_LEN);
|
std::string decryptedMemo(reinterpret_cast<char*>(decrypted),MESSAGE1_LEN);
|
||||||
|
|
||||||
memodecrypt = QString::fromUtf8( decryptedMemo.data(), decryptedMemo.size());
|
memodecrypt = QString::fromUtf8( decryptedMemo.data(), decryptedMemo.size());
|
||||||
|
|||||||
@@ -516,16 +516,22 @@ void MainWindow::encryptWallet() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::removeWalletEncryption() {
|
void MainWindow::removeWalletEncryption() {
|
||||||
|
qDebug() << __func__ << ": removing wallet encryption";
|
||||||
QDialog d(this);
|
QDialog d(this);
|
||||||
Ui_removeencryption ed;
|
Ui_removeencryption ed;
|
||||||
ed.setupUi(&d);
|
ed.setupUi(&d);
|
||||||
|
|
||||||
|
qDebug() << __func__ << ": done with setupUi";
|
||||||
|
|
||||||
if (fileExists(dirwalletenc) == false) {
|
if (fileExists(dirwalletenc) == false) {
|
||||||
QMessageBox::information(this, tr("Wallet is not encrypted"),
|
QMessageBox::information(this, tr("Wallet is not encrypted"),
|
||||||
tr("Your wallet is not encrypted with a passphrase."),
|
tr("Your wallet is not encrypted with a passphrase."),
|
||||||
QMessageBox::Ok
|
QMessageBox::Ok
|
||||||
);
|
);
|
||||||
|
qDebug() << __func__ << ": wallet=" << dirwalletenc << " does NOT exist";
|
||||||
return;
|
return;
|
||||||
|
} else {
|
||||||
|
qDebug() << __func__ << ": wallet=" << dirwalletenc << " exists";
|
||||||
}
|
}
|
||||||
|
|
||||||
auto fnPasswordEdited = [=](const QString&) {
|
auto fnPasswordEdited = [=](const QString&) {
|
||||||
@@ -545,12 +551,16 @@ void MainWindow::removeWalletEncryption() {
|
|||||||
QObject::connect(ed.txtConfirmPassword, &QLineEdit::textChanged, fnPasswordEdited);
|
QObject::connect(ed.txtConfirmPassword, &QLineEdit::textChanged, fnPasswordEdited);
|
||||||
QObject::connect(ed.txtPassword, &QLineEdit::textChanged, fnPasswordEdited);
|
QObject::connect(ed.txtPassword, &QLineEdit::textChanged, fnPasswordEdited);
|
||||||
|
|
||||||
|
qDebug() << __func__ << ": connected GUI events";
|
||||||
|
|
||||||
if (d.exec() == QDialog::Accepted) {
|
if (d.exec() == QDialog::Accepted) {
|
||||||
QString passphraseBlank = ed.txtPassword->text(); // data comes from user inputs
|
QString passphraseBlank = ed.txtPassword->text(); // data comes from user inputs
|
||||||
QString passphrase = QString("HUSH3") + passphraseBlank + QString("SDL");
|
QString passphrase = QString("HUSH3") + passphraseBlank + QString("SDL");
|
||||||
|
|
||||||
int length = passphrase.length();
|
int length = passphrase.length();
|
||||||
|
|
||||||
|
qDebug() << __func__ << ": Passphrase length = " << length;
|
||||||
|
|
||||||
char *sequence = NULL;
|
char *sequence = NULL;
|
||||||
sequence = new char[length+1];
|
sequence = new char[length+1];
|
||||||
strncpy(sequence, passphrase.toUtf8(), length +1);
|
strncpy(sequence, passphrase.toUtf8(), length +1);
|
||||||
@@ -561,7 +571,6 @@ void MainWindow::removeWalletEncryption() {
|
|||||||
sequence1 = new char[length+1];
|
sequence1 = new char[length+1];
|
||||||
strncpy(sequence1, passphraseHash.toUtf8(), length+1);
|
strncpy(sequence1, passphraseHash.toUtf8(), length+1);
|
||||||
|
|
||||||
|
|
||||||
#define hash ((const unsigned char *) sequence1)
|
#define hash ((const unsigned char *) sequence1)
|
||||||
#define PASSWORD sequence
|
#define PASSWORD sequence
|
||||||
#define KEY_LEN crypto_box_SEEDBYTES
|
#define KEY_LEN crypto_box_SEEDBYTES
|
||||||
@@ -571,43 +580,41 @@ void MainWindow::removeWalletEncryption() {
|
|||||||
if (crypto_pwhash(key, sizeof key, PASSWORD, strlen(PASSWORD), hash,
|
if (crypto_pwhash(key, sizeof key, PASSWORD, strlen(PASSWORD), hash,
|
||||||
crypto_pwhash_OPSLIMIT_SENSITIVE, crypto_pwhash_MEMLIMIT_SENSITIVE, crypto_pwhash_ALG_DEFAULT) != 0) {
|
crypto_pwhash_OPSLIMIT_SENSITIVE, crypto_pwhash_MEMLIMIT_SENSITIVE, crypto_pwhash_ALG_DEFAULT) != 0) {
|
||||||
/* out of memory */
|
/* out of memory */
|
||||||
qDebug() << "crypto_pwhash failed!";
|
qDebug() << __func__ << ": crypto_pwhash failed! Possibly out of memory";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto dir = QDir(QStandardPaths::writableLocation(QStandardPaths::AppDataLocation));
|
auto dir = QDir(QStandardPaths::writableLocation(QStandardPaths::AppDataLocation));
|
||||||
auto dirHome = QDir(QStandardPaths::writableLocation(QStandardPaths::HomeLocation));
|
auto dirHome = QDir(QStandardPaths::writableLocation(QStandardPaths::HomeLocation));
|
||||||
QString target_encwallet_file = dirwalletenc;
|
QString target_encwallet_file = dirwalletenc;
|
||||||
QString target_decwallet_file = dirwallet;
|
QString target_decwallet_file = dirwallet;
|
||||||
|
|
||||||
FileEncryption::decrypt(target_decwallet_file, target_encwallet_file, key);
|
|
||||||
|
|
||||||
|
FileEncryption::decrypt(target_decwallet_file, target_encwallet_file, key);
|
||||||
|
|
||||||
QFile filencrypted(dirwalletenc);
|
QFile filencrypted(dirwalletenc);
|
||||||
QFile wallet(dirwallet);
|
QFile wallet(dirwallet);
|
||||||
|
|
||||||
|
qDebug() << __func__ << ": wallet size=" << wallet.size();
|
||||||
|
|
||||||
if (wallet.size() > 0) {
|
if (wallet.size() > 0) {
|
||||||
QMessageBox::information(this, tr("Wallet decryption Success"),
|
QMessageBox::information(this, tr("Wallet decryption Success"),
|
||||||
QString("Successfully delete the encryption"),
|
QString("Successfully delete the encryption"),
|
||||||
QMessageBox::Ok
|
QMessageBox::Ok
|
||||||
);
|
);
|
||||||
|
|
||||||
filencrypted.remove();
|
filencrypted.remove();
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
QMessageBox::critical(this, tr("Wallet Encryption Failed"),
|
QMessageBox::critical(this, tr("Wallet Encryption Failed"),
|
||||||
QString("False password, please try again"),
|
QString("False password, please try again"),
|
||||||
QMessageBox::Ok
|
QMessageBox::Ok
|
||||||
);
|
);
|
||||||
this->removeWalletEncryption();
|
this->removeWalletEncryption();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::removeWalletEncryptionStartUp() {
|
void MainWindow::removeWalletEncryptionStartUp() {
|
||||||
|
qDebug() << __func__ << ": removing wallet encryption";
|
||||||
QDialog d(this);
|
QDialog d(this);
|
||||||
Ui_startup ed;
|
Ui_startup ed;
|
||||||
ed.setupUi(&d);
|
ed.setupUi(&d);
|
||||||
@@ -652,30 +659,29 @@ void MainWindow::removeWalletEncryptionStartUp() {
|
|||||||
|
|
||||||
unsigned char key[KEY_LEN];
|
unsigned char key[KEY_LEN];
|
||||||
|
|
||||||
if (crypto_pwhash
|
if (crypto_pwhash(key, sizeof key, PASSWORD, strlen(PASSWORD), hash,
|
||||||
(key, sizeof key, PASSWORD, strlen(PASSWORD), hash,
|
|
||||||
crypto_pwhash_OPSLIMIT_SENSITIVE, crypto_pwhash_MEMLIMIT_SENSITIVE,
|
crypto_pwhash_OPSLIMIT_SENSITIVE, crypto_pwhash_MEMLIMIT_SENSITIVE,
|
||||||
crypto_pwhash_ALG_DEFAULT) != 0) {
|
crypto_pwhash_ALG_DEFAULT) != 0) {
|
||||||
/* out of memory */
|
/* out of memory */
|
||||||
}
|
qDebug() << __func__ << ": crypto_pwhash failed! Possibly out of memory";
|
||||||
QString passphraseHash1 = QByteArray(reinterpret_cast<const char*>(key), KEY_LEN).toHex();
|
return;
|
||||||
DataStore::getChatDataStore()->setPassword(passphraseHash1);
|
}
|
||||||
|
|
||||||
auto dir = QDir(QStandardPaths::writableLocation(QStandardPaths::AppDataLocation));
|
QString passphraseHash1 = QByteArray(reinterpret_cast<const char*>(key), KEY_LEN).toHex();
|
||||||
|
DataStore::getChatDataStore()->setPassword(passphraseHash1);
|
||||||
|
|
||||||
QString target_encwallet_file = dirwalletenc;
|
auto dir = QDir(QStandardPaths::writableLocation(QStandardPaths::AppDataLocation));
|
||||||
QString target_decwallet_file = dirwallet;
|
|
||||||
|
|
||||||
FileEncryption::decrypt(target_decwallet_file, target_encwallet_file, key);
|
QString target_encwallet_file = dirwalletenc;
|
||||||
|
QString target_decwallet_file = dirwallet;
|
||||||
|
|
||||||
|
FileEncryption::decrypt(target_decwallet_file, target_encwallet_file, key);
|
||||||
|
|
||||||
|
auto dirHome = QDir(QStandardPaths::writableLocation(QStandardPaths::HomeLocation));
|
||||||
|
QFile wallet(dirwallet);
|
||||||
|
qDebug() << __func__ << ": wallet size=" << wallet.size();
|
||||||
|
|
||||||
|
if (wallet.size() == 0) {
|
||||||
auto dirHome = QDir(QStandardPaths::writableLocation(QStandardPaths::HomeLocation));
|
|
||||||
QFile wallet(dirwallet);
|
|
||||||
|
|
||||||
if (wallet.size() == 0)
|
|
||||||
{
|
|
||||||
|
|
||||||
QMessageBox::critical(this, tr("Wallet Encryption Failed"),
|
QMessageBox::critical(this, tr("Wallet Encryption Failed"),
|
||||||
QString("false password please try again"),
|
QString("false password please try again"),
|
||||||
QMessageBox::Ok
|
QMessageBox::Ok
|
||||||
@@ -684,7 +690,6 @@ void MainWindow::removeWalletEncryptionStartUp() {
|
|||||||
}else{}
|
}else{}
|
||||||
|
|
||||||
}else{
|
}else{
|
||||||
|
|
||||||
this->doClosePw();
|
this->doClosePw();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user