mirror of
https://github.com/qTox/qTox.git
synced 2024-03-22 14:00:36 +08:00
chore(tools): replace unsafe signing C++ code with Rust
This commit is contained in:
parent
f041522257
commit
b5af649190
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -46,3 +46,7 @@ qrc_*
|
||||||
Makefile
|
Makefile
|
||||||
*.qm
|
*.qm
|
||||||
/.qmake.stash
|
/.qmake.stash
|
||||||
|
|
||||||
|
# Rust
|
||||||
|
target/
|
||||||
|
.cargo/
|
||||||
|
|
15
.travis.yml
15
.travis.yml
|
@ -10,6 +10,9 @@ branches:
|
||||||
|
|
||||||
matrix:
|
matrix:
|
||||||
fast_finish: true
|
fast_finish: true
|
||||||
|
allow_failures:
|
||||||
|
- rust: beta
|
||||||
|
- rust: nightly
|
||||||
include:
|
include:
|
||||||
- os: linux
|
- os: linux
|
||||||
env: JOB=verify-commit-format
|
env: JOB=verify-commit-format
|
||||||
|
@ -24,6 +27,18 @@ matrix:
|
||||||
# the actual compilin'
|
# the actual compilin'
|
||||||
- os: linux
|
- os: linux
|
||||||
env: JOB=build-ubuntu-14-04
|
env: JOB=build-ubuntu-14-04
|
||||||
|
- os: linux
|
||||||
|
env: JOB=build-rust
|
||||||
|
language: rust
|
||||||
|
rust: stable
|
||||||
|
- os: linux
|
||||||
|
env: JOB=build-rust
|
||||||
|
language: rust
|
||||||
|
rust: beta
|
||||||
|
- os: linux
|
||||||
|
env: JOB=build-rust
|
||||||
|
language: rust
|
||||||
|
rust: nightly
|
||||||
- os: osx
|
- os: osx
|
||||||
osx_image: xcode7.3
|
osx_image: xcode7.3
|
||||||
env: JOB=build-osx
|
env: JOB=build-osx
|
||||||
|
|
71
.travis/build-rust.sh
Executable file
71
.travis/build-rust.sh
Executable file
|
@ -0,0 +1,71 @@
|
||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# Copyright © 2016 by The qTox Project Contributors
|
||||||
|
#
|
||||||
|
# This program is libre software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
|
||||||
|
# used in travis to:
|
||||||
|
# - pull in dependencies for building libsodium
|
||||||
|
# - build required libsodium
|
||||||
|
|
||||||
|
# Fail out on error
|
||||||
|
set -eu -o pipefail
|
||||||
|
|
||||||
|
readonly LIBSODIUM_VER="1.0.11"
|
||||||
|
|
||||||
|
build_libsodium() {
|
||||||
|
sudo apt-get update -qq
|
||||||
|
sudo apt-get install -y \
|
||||||
|
build-essential \
|
||||||
|
libtool \
|
||||||
|
autotools-dev \
|
||||||
|
automake \
|
||||||
|
checkinstall \
|
||||||
|
check \
|
||||||
|
git \
|
||||||
|
yasm \
|
||||||
|
pkg-config || yes
|
||||||
|
|
||||||
|
git clone https://github.com/jedisct1/libsodium.git libsodium \
|
||||||
|
--branch $LIBSODIUM_VER \
|
||||||
|
--depth 1
|
||||||
|
|
||||||
|
cd libsodium
|
||||||
|
./autogen.sh
|
||||||
|
./configure
|
||||||
|
make -j$(nproc)
|
||||||
|
sudo checkinstall \
|
||||||
|
--install \
|
||||||
|
--pkgname libsodium \
|
||||||
|
--pkgversion $LIBSODIUM_VER \
|
||||||
|
--nodoc \
|
||||||
|
-y
|
||||||
|
sudo ldconfig
|
||||||
|
cd ..
|
||||||
|
}
|
||||||
|
|
||||||
|
build_rust_bits() {
|
||||||
|
# TODO: make it a loop over paths once there are more rust bits
|
||||||
|
cd tools/update-server/qtox-updater-sign
|
||||||
|
cargo build --verbose
|
||||||
|
cargo test --verbose
|
||||||
|
# add `cargo doc` once it's needed?
|
||||||
|
}
|
||||||
|
|
||||||
|
main() {
|
||||||
|
build_libsodium
|
||||||
|
build_rust_bits
|
||||||
|
}
|
||||||
|
main
|
41
tools/update-server/qtox-updater-sign/Cargo.lock
generated
Normal file
41
tools/update-server/qtox-updater-sign/Cargo.lock
generated
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
[root]
|
||||||
|
name = "qtox-updater-sign"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"sodiumoxide 0.0.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "libc"
|
||||||
|
version = "0.2.18"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "libsodium-sys"
|
||||||
|
version = "0.0.12"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"pkg-config 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pkg-config"
|
||||||
|
version = "0.3.8"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde"
|
||||||
|
version = "0.7.15"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "sodiumoxide"
|
||||||
|
version = "0.0.12"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"libsodium-sys 0.0.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"serde 0.7.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
7
tools/update-server/qtox-updater-sign/Cargo.toml
Normal file
7
tools/update-server/qtox-updater-sign/Cargo.toml
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
[package]
|
||||||
|
name = "qtox-updater-sign"
|
||||||
|
version = "0.1.0"
|
||||||
|
authors = ["Zetok Zalbavar <zetok@openmailbox.org>"]
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
sodiumoxide = "0.0.12"
|
26
tools/update-server/qtox-updater-sign/README.md
Normal file
26
tools/update-server/qtox-updater-sign/README.md
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
# qtox-updater-sign
|
||||||
|
|
||||||
|
Simple program for signing releases.
|
||||||
|
|
||||||
|
Requires a file named `qtox-updater-skey` in the working directory that
|
||||||
|
contains the secret key.
|
||||||
|
|
||||||
|
To sign a release, either supply the name of the file to be signed as an
|
||||||
|
argument, or pipe data via stdin.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./qtox-updater-sign sign-this-binary > signature_file
|
||||||
|
# or
|
||||||
|
./qtox-updater-sign < sign-this-binary > signature_file
|
||||||
|
```
|
||||||
|
|
||||||
|
# Compiling
|
||||||
|
|
||||||
|
Requires `libsodium` and Rust.
|
||||||
|
|
||||||
|
To build a debug version: `cargo build`
|
||||||
|
|
||||||
|
To build a release version: `cargo build --release`
|
||||||
|
|
||||||
|
This will produce `qtox-updater-sign` binary in `target/debug` or
|
||||||
|
`target/release` directory respectively.
|
|
@ -1,42 +0,0 @@
|
||||||
#include <sodium.h>
|
|
||||||
#include <QByteArray>
|
|
||||||
#include <QFile>
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
int main(int argc, char* argv[])
|
|
||||||
{
|
|
||||||
QFile io;
|
|
||||||
QByteArray msg;
|
|
||||||
if (argc > 1)
|
|
||||||
{
|
|
||||||
msg = QByteArray(argv[1]);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
io.open(stdin, QIODevice::ReadOnly);
|
|
||||||
msg = io.readAll();
|
|
||||||
io.close();
|
|
||||||
}
|
|
||||||
io.open(stdout, QIODevice::WriteOnly);
|
|
||||||
|
|
||||||
QFile skeyFile("qtox-updater-skey");
|
|
||||||
if (!skeyFile.open(QIODevice::ReadOnly))
|
|
||||||
{
|
|
||||||
io.write("ERROR: qtox-updater-sign can't open the secret (private) key file\n");
|
|
||||||
io.close();
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
QByteArray skeyData = skeyFile.readAll();
|
|
||||||
skeyFile.close();
|
|
||||||
|
|
||||||
unsigned char sig[crypto_sign_BYTES];
|
|
||||||
crypto_sign_detached(sig, nullptr, (unsigned char*)msg.data(), msg.size(), (unsigned char*)skeyData.data());
|
|
||||||
|
|
||||||
io.write((char*)sig, crypto_sign_BYTES);
|
|
||||||
io.write(msg);
|
|
||||||
io.close();
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
TEMPLATE = app
|
|
||||||
CONFIG += console c++11
|
|
||||||
QT += core
|
|
||||||
|
|
||||||
SOURCES += main.cpp
|
|
||||||
|
|
||||||
LIBS += -lsodium
|
|
66
tools/update-server/qtox-updater-sign/src/main.rs
Normal file
66
tools/update-server/qtox-updater-sign/src/main.rs
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
/*
|
||||||
|
Copyright © 2016 by The qTox Project Contributors
|
||||||
|
|
||||||
|
This file is part of qTox, a Qt-based graphical interface for Tox.
|
||||||
|
|
||||||
|
qTox is libre software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
qTox is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with qTox. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
extern crate sodiumoxide;
|
||||||
|
|
||||||
|
use std::io::prelude::*;
|
||||||
|
use std::io;
|
||||||
|
use std::fs::File;
|
||||||
|
|
||||||
|
use sodiumoxide::crypto::sign::*;
|
||||||
|
|
||||||
|
/// file that contains secret key
|
||||||
|
const SKEY_FNAME: &'static str = "qtox-updater-skey";
|
||||||
|
|
||||||
|
/// if there is more than just the program name in args, treat "1st" arg as the
|
||||||
|
/// data to sign
|
||||||
|
/// otherwise just read bytes from stdin
|
||||||
|
fn read_from_file_or_stdin(buf: &mut Vec<u8>) {
|
||||||
|
if std::env::args().count() > 1 {
|
||||||
|
let data = std::env::args().nth(1).expect("Failed to get fname");
|
||||||
|
buf.extend_from_slice(&data.into_bytes());
|
||||||
|
} else {
|
||||||
|
io::stdin().read_to_end(buf).expect("Failed to read stdin");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// get SecretKey from `SKEY_FNAME` file
|
||||||
|
fn get_secret_key() -> SecretKey {
|
||||||
|
let mut skey_file = File::open(SKEY_FNAME)
|
||||||
|
.expect(&format!("ERROR: {} can't open the secret (private) key file\n",
|
||||||
|
std::env::args().next().unwrap()));
|
||||||
|
|
||||||
|
let mut skey_bytes = Vec::with_capacity(SECRETKEYBYTES);
|
||||||
|
skey_file.read_to_end(&mut skey_bytes)
|
||||||
|
.expect(&format!("Failed to read {}", SKEY_FNAME));
|
||||||
|
|
||||||
|
SecretKey::from_slice(&skey_bytes[..SECRETKEYBYTES])
|
||||||
|
.expect("Failed to get right amount of bytes for SecretKey")
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let mut plaintext = Vec::new();
|
||||||
|
read_from_file_or_stdin(&mut plaintext);
|
||||||
|
|
||||||
|
let sk = get_secret_key();
|
||||||
|
let signed = sign(&plaintext, &sk);
|
||||||
|
|
||||||
|
io::stdout().write_all(&signed).expect("Failed to write signature");
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user