diff options
| author | David Lönnhager <david.l@mullvad.net> | 2022-05-30 17:46:56 +0200 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2022-06-14 12:38:37 +0200 |
| commit | 2c1b2faa744d6222d08506bfe329faab41db4b72 (patch) | |
| tree | d91261760ee5d9d590228dc3f992d3da764b7da0 | |
| parent | 02246bb470dd8446c3195be4f93323e2e979fff3 (diff) | |
| download | mullvadvpn-2c1b2faa744d6222d08506bfe329faab41db4b72.tar.xz mullvadvpn-2c1b2faa744d6222d08506bfe329faab41db4b72.zip | |
Switch from liboqs to classic-mceliece-rust
| -rw-r--r-- | Cargo.lock | 261 | ||||
| -rw-r--r-- | Cargo.toml | 5 | ||||
| -rw-r--r-- | talpid-relay-config-client/Cargo.toml | 6 | ||||
| -rw-r--r-- | talpid-relay-config-client/src/lib.rs | 64 |
4 files changed, 109 insertions, 227 deletions
diff --git a/Cargo.lock b/Cargo.lock index f5e75ffcee..810c22e39c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -81,15 +81,6 @@ dependencies = [ ] [[package]] -name = "ansi_term" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" -dependencies = [ - "winapi 0.3.9", -] - -[[package]] name = "anyhow" version = "1.0.44" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -184,29 +175,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" [[package]] -name = "bindgen" -version = "0.59.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bd2a9a458e8f4304c52c43ebb0cfbd520289f8379a52e329a38afda99bf8eb8" -dependencies = [ - "bitflags", - "cexpr", - "clang-sys", - "clap 2.34.0", - "env_logger 0.9.0", - "lazy_static", - "lazycell", - "log", - "peeking_take_while", - "proc-macro2", - "quote", - "regex", - "rustc-hash", - "shlex", - "which", -] - -[[package]] name = "bitflags" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -218,7 +186,7 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" dependencies = [ - "block-padding", + "block-padding 0.1.5", "byte-tools", "byteorder", "generic-array 0.12.4", @@ -226,6 +194,16 @@ dependencies = [ [[package]] name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "block-padding 0.2.1", + "generic-array 0.14.4", +] + +[[package]] +name = "block-buffer" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1d36a02058e76b040de25a4464ba1c80935655595b661505c8b39b664828b95" @@ -234,6 +212,16 @@ dependencies = [ ] [[package]] +name = "block-modes" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cb03d1bed155d89dce0f845b7899b18a9a163e148fd004e1c28421a783e2d8e" +dependencies = [ + "block-padding 0.2.1", + "cipher", +] + +[[package]] name = "block-padding" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -243,13 +231,10 @@ dependencies = [ ] [[package]] -name = "build-deps" -version = "0.1.4" +name = "block-padding" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64f14468960818ce4f3e3553c32d524446687884f8e7af5d3e252331d8a87e43" -dependencies = [ - "glob", -] +checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" [[package]] name = "bumpalo" @@ -294,15 +279,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" [[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom", -] - -[[package]] name = "cfg-if" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -363,32 +339,6 @@ dependencies = [ ] [[package]] -name = "clang-sys" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cc00842eed744b858222c4c9faf7243aafc6d33f92f96935263ef4d8a41ce21" -dependencies = [ - "glob", - "libc", - "libloading", -] - -[[package]] -name = "clap" -version = "2.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" -dependencies = [ - "ansi_term", - "atty", - "bitflags", - "strsim 0.8.0", - "textwrap 0.11.0", - "unicode-width", - "vec_map", -] - -[[package]] name = "clap" version = "3.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -401,7 +351,7 @@ dependencies = [ "os_str_bytes", "strsim 0.10.0", "termcolor", - "textwrap 0.14.2", + "textwrap", ] [[package]] @@ -410,16 +360,21 @@ version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "678db4c39c013cc68b54d372bce2efc58e30a0337c497c9032fd196802df3bc3" dependencies = [ - "clap 3.0.14", + "clap", ] [[package]] -name = "cmake" -version = "0.1.46" +name = "classic-mceliece-rust" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7b858541263efe664aead4a5209a4ae5c5d2811167d4ed4ee0944503f8d2089" +checksum = "9fa9a48fdd99179698111d76d2e66f185ef18b4ef4851a4f9dde20f1ed6c9aa1" dependencies = [ - "cc", + "aes", + "block-modes", + "hex", + "lazy_static", + "rand 0.8.4", + "sha3", ] [[package]] @@ -505,16 +460,6 @@ dependencies = [ ] [[package]] -name = "cstr_core" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "644828c273c063ab0d39486ba42a5d1f3a499d35529c759e763a9c6cb8a0fb08" -dependencies = [ - "cty", - "memchr", -] - -[[package]] name = "ctr" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -534,12 +479,6 @@ dependencies = [ ] [[package]] -name = "cty" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35" - -[[package]] name = "curve25519-dalek" version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1121,12 +1060,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0a01e0497841a3b2db4f8afa483cce65f7e96a3498bd6c541734792aeac8fe7" [[package]] -name = "glob" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" - -[[package]] name = "h2" version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1513,6 +1446,12 @@ dependencies = [ ] [[package]] +name = "keccak" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9b7d56ba4a8344d6be9729995e6b06f928af29998cdf79fe390cbf6b1fee838" + +[[package]] name = "kernel32-sys" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1550,16 +1489,6 @@ dependencies = [ ] [[package]] -name = "libloading" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efbc0f03f9a775e9f6aed295c6a1ba2253c5757a9e03d55c6caa46a681abcddd" -dependencies = [ - "cfg-if 1.0.0", - "winapi 0.3.9", -] - -[[package]] name = "linked-hash-map" version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1660,12 +1589,6 @@ dependencies = [ ] [[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] name = "miniz_oxide" version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1796,7 +1719,7 @@ version = "2022.2.0" dependencies = [ "base64", "chrono", - "clap 3.0.14", + "clap", "clap_complete", "env_logger 0.8.4", "err-derive", @@ -1820,7 +1743,7 @@ dependencies = [ "android_logger", "cfg-if 1.0.0", "chrono", - "clap 3.0.14", + "clap", "ctrlc", "dirs-next", "duct", @@ -1924,7 +1847,7 @@ dependencies = [ name = "mullvad-problem-report" version = "2022.2.0" dependencies = [ - "clap 3.0.14", + "clap", "dirs-next", "duct", "env_logger 0.8.4", @@ -1968,7 +1891,7 @@ dependencies = [ name = "mullvad-setup" version = "2022.2.0" dependencies = [ - "clap 3.0.14", + "clap", "env_logger 0.8.4", "err-derive", "lazy_static", @@ -2147,16 +2070,6 @@ dependencies = [ ] [[package]] -name = "nom" -version = "7.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] name = "notify" version = "4.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2257,29 +2170,6 @@ dependencies = [ ] [[package]] -name = "oqs" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9534d1e8a22731bcd9fb97be6f6597503dcc4d86fd72e8a9deec214481884cc6" -dependencies = [ - "cstr_core", - "libc", - "oqs-sys", -] - -[[package]] -name = "oqs-sys" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "667693ecaa5afb140d88242bced5f259c9c2e2f477418f13b47834d784ed2b12" -dependencies = [ - "bindgen", - "build-deps", - "cmake", - "libc", -] - -[[package]] name = "os_pipe" version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2389,12 +2279,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf547ad0c65e31259204bd90935776d1c693cec2f4ff7abb7a1bbbd40dfe58" [[package]] -name = "peeking_take_while" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" - -[[package]] name = "percent-encoding" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2950,12 +2834,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" [[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] name = "rustc_version" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -3196,6 +3074,18 @@ dependencies = [ ] [[package]] +name = "sha3" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" +dependencies = [ + "block-buffer 0.9.0", + "digest 0.9.0", + "keccak", + "opaque-debug 0.3.0", +] + +[[package]] name = "shadowsocks" version = "1.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -3293,12 +3183,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "45bb67a18fa91266cc7807181f62f9178a6873bfad7dc788c42e6430db40184f" [[package]] -name = "shlex" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" - -[[package]] name = "signal-hook-registry" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -3371,12 +3255,6 @@ dependencies = [ [[package]] name = "strsim" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" - -[[package]] -name = "strsim" version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" @@ -3558,9 +3436,11 @@ dependencies = [ name = "talpid-relay-config-client" version = "0.1.0" dependencies = [ - "oqs", + "classic-mceliece-rust", + "log", "prost 0.8.0", "prost-types 0.9.0", + "rand 0.8.4", "talpid-types", "tokio", "tonic", @@ -3614,15 +3494,6 @@ dependencies = [ [[package]] name = "textwrap" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" -dependencies = [ - "unicode-width", -] - -[[package]] -name = "textwrap" version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0066c8d12af8b5acd21e00547c3797fde4e8677254a7ee429176ccebbe93dd80" @@ -4086,12 +3957,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b" [[package]] -name = "unicode-width" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" - -[[package]] name = "unicode-xid" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -4151,12 +4016,6 @@ dependencies = [ ] [[package]] -name = "vec_map" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" - -[[package]] name = "version_check" version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" diff --git a/Cargo.toml b/Cargo.toml index e4ab3c68fc..894abb4cb6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,3 +25,8 @@ members = [ [profile.release] opt-level = 3 lto = true + +# Key generation may take over one minute without optimizations +# enabled. +[profile.dev.package."classic-mceliece-rust"] +opt-level = 3 diff --git a/talpid-relay-config-client/Cargo.toml b/talpid-relay-config-client/Cargo.toml index a7107da2fd..410aaf8f4a 100644 --- a/talpid-relay-config-client/Cargo.toml +++ b/talpid-relay-config-client/Cargo.toml @@ -8,13 +8,15 @@ edition = "2021" publish = false [dependencies] +log = "0.4" +rand = "0.8" talpid-types = { path = "../talpid-types" } tonic = "0.5" prost = "0.8" prost-types = "0.9" tower = "0.4" -tokio = "1" -oqs = { version = "0.7.0", default-features = false, features = ["kems"] } +tokio = { version = "1", features = ["rt-multi-thread"] } +classic-mceliece-rust = { version = "1.0", features = ["mceliece8192128f"] } [build-dependencies] tonic-build = { version = "0.5", default-features = false, features = ["transport", "prost"] }
\ No newline at end of file diff --git a/talpid-relay-config-client/src/lib.rs b/talpid-relay-config-client/src/lib.rs index fd4931c506..c89fbc1e15 100644 --- a/talpid-relay-config-client/src/lib.rs +++ b/talpid-relay-config-client/src/lib.rs @@ -1,6 +1,10 @@ use std::net::IpAddr; -use oqs::kem::{self, Algorithm, Kem, SecretKey}; +use classic_mceliece_rust::{ + crypto_kem_dec, crypto_kem_keypair, AesState, RNGState, CRYPTO_BYTES, CRYPTO_CIPHERTEXTBYTES, + CRYPTO_PUBLICKEYBYTES, CRYPTO_SECRETKEYBYTES, +}; +use rand::RngCore; use talpid_types::net::wireguard::{PresharedKey, PrivateKey, PublicKey}; use tonic::transport::{Channel, Endpoint, Uri}; @@ -11,14 +15,15 @@ mod types { type RelayConfigService = types::post_quantum_secure_client::PostQuantumSecureClient<Channel>; const CONFIG_SERVICE_PORT: u16 = 1337; -const ALGORITHM: Algorithm = Algorithm::ClassicMcEliece8192128f; const STACK_SIZE: usize = 8 * 1024 * 1024; +const ALGORITHM_NAME: &str = "Classic-McEliece-8192128f"; #[derive(Debug)] pub enum Error { GrpcTransportError(tonic::transport::Error), GrpcError(tonic::Status), - OqsError(oqs::Error), + KeyGenerationFailed, + DecapsulationError, InvalidCiphertext, } @@ -37,31 +42,49 @@ pub async fn push_pq_key( wg_pubkey: current_pubkey.as_bytes().to_vec(), wg_psk_pubkey: oqs_key.public_key().as_bytes().to_vec(), oqs_pubkey: Some(types::OqsPubkey { - algorithm_name: algorithm_to_string(&ALGORITHM), - key_data: pubkey.into_vec(), + algorithm_name: ALGORITHM_NAME.to_string(), + key_data: pubkey.to_vec(), }), }) .await .map_err(Error::GrpcError)?; let ciphertext = response.into_inner().ciphertext; - let kem = Kem::new(ALGORITHM).map_err(Error::OqsError)?; - let ciphertext = kem - .ciphertext_from_bytes(&ciphertext) - .ok_or(Error::InvalidCiphertext)?; - let psk = kem - .decapsulate(&secret, ciphertext) - .map(|key| PresharedKey::from(<[u8; 32]>::try_from(key.as_ref()).unwrap())) - .map_err(Error::OqsError)?; - Ok((oqs_key, psk)) + let ct: [u8; CRYPTO_CIPHERTEXTBYTES] = ciphertext + .try_into() + .map_err(|_| Error::InvalidCiphertext)?; + let mut psk = [0u8; CRYPTO_BYTES]; + + crypto_kem_dec(&mut psk, &ct, &secret).map_err(|error| { + log::error!("KEM decapsulation failed: {error}"); + Error::DecapsulationError + })?; + Ok((oqs_key, PresharedKey::from(psk))) } -async fn generate_key() -> Result<(kem::PublicKey, SecretKey), Error> { +async fn generate_key() -> Result< + ( + Box<[u8; CRYPTO_PUBLICKEYBYTES]>, + Box<[u8; CRYPTO_SECRETKEYBYTES]>, + ), + Error, +> { let (tx, rx) = tokio::sync::oneshot::channel(); let gen_key = move || { - let kem = Kem::new(ALGORITHM).map_err(Error::OqsError)?; - let (pubkey, secret) = kem.keypair().map_err(Error::OqsError)?; + let mut rng = AesState::new(); + + let mut entropy = [0u8; 48]; + rand::thread_rng().fill_bytes(&mut entropy); + rng.randombytes_init(entropy); + + let mut pubkey = Box::new([0u8; CRYPTO_PUBLICKEYBYTES]); + let mut secret = Box::new([0u8; CRYPTO_SECRETKEYBYTES]); + crypto_kem_keypair(&mut pubkey, &mut secret, &mut rng).map_err(|error| { + log::error!("KEM keypair generation failed: {error}"); + Error::KeyGenerationFailed + })?; + Ok((pubkey, secret)) }; @@ -75,13 +98,6 @@ async fn generate_key() -> Result<(kem::PublicKey, SecretKey), Error> { rx.await.unwrap() } -fn algorithm_to_string(algorithm: &Algorithm) -> String { - match algorithm { - Algorithm::ClassicMcEliece8192128f => "Classic-McEliece-8192128f".to_string(), - _ => unimplemented!(), - } -} - async fn new_client(addr: IpAddr) -> Result<RelayConfigService, Error> { let channel = Endpoint::from_shared(format!("tcp://{addr}:{CONFIG_SERVICE_PORT}")) .expect("Failed to construct URI") |
