fix: Typos in Rust code, readme and man pages

This commit is contained in:
Steffen Vogel
2023-05-31 11:39:11 +02:00
committed by Karolin Varner
parent 397a776c55
commit b958eacaae
7 changed files with 39 additions and 39 deletions

View File

@@ -41,7 +41,7 @@ operations, respectively.
.Bl -tag -width Ds .Bl -tag -width Ds
.It Ar genkey Ar PRIVATE_KEYS_DIR .It Ar genkey Ar PRIVATE_KEYS_DIR
Creates a new directory with appropriate permissions and generates all the Creates a new directory with appropriate permissions and generates all the
neccessary private keys required for a peer to participate in a rosenpass necessary private keys required for a peer to participate in a rosenpass
connection. connection.
.It Ar pubkey Ar PRIVATE_KEYS_DIR Ar PUBLIC_KEYS_DIR .It Ar pubkey Ar PRIVATE_KEYS_DIR Ar PUBLIC_KEYS_DIR
Creates a fresh directory at Creates a fresh directory at

View File

@@ -14,14 +14,14 @@ This repository contains
## Getting started ## Getting started
First, [install rosenpass](#Getting-Rosenpass). Then, check out the help funtions of `rp` & `rosenpass`: First, [install rosenpass](#Getting-Rosenpass). Then, check out the help functions of `rp` & `rosenpass`:
```sh ```sh
rp help rp help
rosenpass help rosenpass help
``` ```
Follow [quickstart instructions](https://rosenpass.eu/#start) to get a VPN up and running. Follow [quick start instructions](https://rosenpass.eu/#start) to get a VPN up and running.
## Software architecture ## Software architecture
@@ -54,7 +54,7 @@ We are working on a cryptographic proof of security, but we already provide a sy
(manual) $ ./analyze.sh (manual) $ ./analyze.sh
``` ```
The analysis is implemented according to modern software engineering principles: Using the C preprocessor, we where able to split the analysis into multiple files and uses some metaprogramming to avoid repetition. The analysis is implemented according to modern software engineering principles: Using the C preprocessor, we where able to split the analysis into multiple files and uses some meta programming to avoid repetition.
The code uses a variety of optimizations to speed up analysis such as using secret functions to model trusted/malicious setup. We split the model into two separate entry points which can be analyzed in parallel. Each is much faster than both models combined. The code uses a variety of optimizations to speed up analysis such as using secret functions to model trusted/malicious setup. We split the model into two separate entry points which can be analyzed in parallel. Each is much faster than both models combined.
A wrapper script provides instant feedback about which queries execute as expected in color: A red cross if a query fails and a green check if it succeeds. A wrapper script provides instant feedback about which queries execute as expected in color: A red cross if a query fails and a green check if it succeeds.
@@ -62,12 +62,12 @@ A wrapper script provides instant feedback about which queries execute as expect
[^libsodium]: https://doc.libsodium.org/ [^libsodium]: https://doc.libsodium.org/
[^wg]: https://www.wireguard.com/ [^wg]: https://www.wireguard.com/
[^pqwg]: https://eprint.iacr.org/2020/379 [^pqwg]: https://eprint.iacr.org/2020/379
[^pqwg-statedis]: Unless supplied with a pre-shared-key, but this defeates the purpose of a key exchange protocol [^pqwg-statedis]: Unless supplied with a pre-shared-key, but this defeats the purpose of a key exchange protocol
[^wg-statedis]: https://lists.zx2c4.com/pipermail/wireguard/2021-August/006916.htmlA [^wg-statedis]: https://lists.zx2c4.com/pipermail/wireguard/2021-August/006916.htmlA
# Getting Rosenpass # Getting Rosenpass
Rosenpass is packaged for more and more distros, maybe also for the distro of your choice? Rosenpass is packaged for more and more distributions, maybe also for the distribution of your choice?
[![Packaging status](https://repology.org/badge/vertical-allrepos/rosenpass.svg)](https://repology.org/project/rosenpass/versions) [![Packaging status](https://repology.org/badge/vertical-allrepos/rosenpass.svg)](https://repology.org/project/rosenpass/versions)

View File

@@ -353,13 +353,13 @@ impl AppServer {
// When no socket is specified, rosenpass should open one port on all // When no socket is specified, rosenpass should open one port on all
// available interfaces best-effort. Here are the cases how this can possibly go: // available interfaces best-effort. Here are the cases how this can possibly go:
// //
// Some operating systems (such as linux [^linux] and freebsd [^freebsd]) // Some operating systems (such as Linux [^linux] and FreeBSD [^freebsd])
// using IPv6 sockets to handle IPv4 connections; on these systems // using IPv6 sockets to handle IPv4 connections; on these systems
// binding to the `[::]:0` address will typically open a dual-stack // binding to the `[::]:0` address will typically open a dual-stack
// socket. Some other systems such as openbsd [^openbsd] do not support this feature. // socket. Some other systems such as OpenBSD [^openbsd] do not support this feature.
// //
// Dual-stack systems provide a flag to enable or disable this // Dual-stack systems provide a flag to enable or disable this
// behavior the IPV6_V6ONLY flag. Openbsd supports this flag // behavior the IPV6_V6ONLY flag. OpenBSD supports this flag
// read-only. MIO[^mio] provides a way to read this flag but not // read-only. MIO[^mio] provides a way to read this flag but not
// to write it. // to write it.
// //
@@ -372,7 +372,7 @@ impl AppServer {
// - One IPv4 socket and no IPv6 socket if opening the IPv6 socket fails // - One IPv4 socket and no IPv6 socket if opening the IPv6 socket fails
// - One dual-stack IPv6 socket and a redundant IPv4 socket if dual-stack sockets are // - One dual-stack IPv6 socket and a redundant IPv4 socket if dual-stack sockets are
// supported but the operating system does not correctly report this (specifically, // supported but the operating system does not correctly report this (specifically,
// if the only_v6() call raises an errror) // if the only_v6() call raises an error)
// - Rosenpass exits if no socket could be opened // - Rosenpass exits if no socket could be opened
// //
// [^freebsd]: https://man.freebsd.org/cgi/man.cgi?query=ip6&sektion=4&manpath=FreeBSD+6.0-RELEASE // [^freebsd]: https://man.freebsd.org/cgi/man.cgi?query=ip6&sektion=4&manpath=FreeBSD+6.0-RELEASE
@@ -423,7 +423,7 @@ impl AppServer {
.register(socket, Token(i), Interest::READABLE)?; .register(socket, Token(i), Interest::READABLE)?;
} }
// TODO use mio::net::UnixStream together with std::os::unix::net::UnixStream for linux // TODO use mio::net::UnixStream together with std::os::unix::net::UnixStream for Linux
Ok(Self { Ok(Self {
crypt: CryptoServer::new(sk, pk), crypt: CryptoServer::new(sk, pk),
@@ -490,7 +490,7 @@ impl AppServer {
err.backtrace() err.backtrace()
); );
if tries_left > 0 { if tries_left > 0 {
error!("reinitializing networking in {sleep}! {tries_left} tries left."); error!("re-initializing networking in {sleep}! {tries_left} tries left.");
std::thread::sleep(self.crypt.timebase.dur(sleep)); std::thread::sleep(self.crypt.timebase.dur(sleep));
continue; continue;
} }
@@ -612,7 +612,7 @@ impl AppServer {
}; };
// this is intentionally writing to stdout instead of stderr, because // this is intentionally writing to stdout instead of stderr, because
// it is meant to allow external detection of a succesful key-exchange // it is meant to allow external detection of a successful key-exchange
println!( println!(
"output-key peer {} key-file {of:?} {why}", "output-key peer {} key-file {of:?} {why}",
fmt_b64(&*peerid) fmt_b64(&*peerid)
@@ -669,7 +669,7 @@ impl AppServer {
return Ok(None); return Ok(None);
} }
// NOTE when using mio::Poll, there are some finickies (taken from // NOTE when using mio::Poll, there are some particularities (taken from
// https://docs.rs/mio/latest/mio/struct.Poll.html): // https://docs.rs/mio/latest/mio/struct.Poll.html):
// //
// - poll() might return readiness, even if nothing is ready // - poll() might return readiness, even if nothing is ready
@@ -677,7 +677,7 @@ impl AppServer {
// - after receiving readiness for a source, it must be drained until a WouldBlock // - after receiving readiness for a source, it must be drained until a WouldBlock
// is received // is received
// //
// This would ususally require us to maintain the drainage status of each socket; // This would usually require us to maintain the drainage status of each socket;
// a socket would only become drained when it returned WouldBlock and only // a socket would only become drained when it returned WouldBlock and only
// non-drained when receiving a readiness event from mio for it. Then, only the // non-drained when receiving a readiness event from mio for it. Then, only the
// ready sockets should be worked on, ideally without requiring an O(n) search // ready sockets should be worked on, ideally without requiring an O(n) search
@@ -708,7 +708,7 @@ impl AppServer {
Err(e) if e.kind() == ErrorKind::WouldBlock => { Err(e) if e.kind() == ErrorKind::WouldBlock => {
would_block_count += 1; would_block_count += 1;
} }
// TODO if one socket continuesly returns an error, then we never poll, thus we never wait for a timeout, thus we have a spin-lock // TODO if one socket continuously returns an error, then we never poll, thus we never wait for a timeout, thus we have a spin-lock
Err(e) => return Err(e.into()), Err(e) => return Err(e.into()),
} }
} }

View File

@@ -63,7 +63,7 @@ pub enum Cli {
GenConfig { GenConfig {
config_file: PathBuf, config_file: PathBuf,
/// Forecefully overwrite existing config file /// Forcefully overwrite existing config file
#[clap(short, long)] #[clap(short, long)]
force: bool, force: bool,
}, },
@@ -84,7 +84,7 @@ pub enum Cli {
#[clap(short, long)] #[clap(short, long)]
secret_key: Option<PathBuf>, secret_key: Option<PathBuf>,
/// Forecefully overwrite public- & secret-key file /// Forcefully overwrite public- & secret-key file
#[clap(short, long)] #[clap(short, long)]
force: bool, force: bool,
}, },

View File

@@ -10,7 +10,7 @@ pub fn protocol() -> Result<PrfTree> {
PrfTree::zero().mix("Rosenpass v1 mceliece460896 Kyber512 ChaChaPoly1305 BLAKE2s".as_bytes()) PrfTree::zero().mix("Rosenpass v1 mceliece460896 Kyber512 ChaChaPoly1305 BLAKE2s".as_bytes())
} }
// TODO Use labels that can serve as idents // TODO Use labels that can serve as identifiers
macro_rules! prflabel { macro_rules! prflabel {
($base:ident, $name:ident, $($lbl:expr),* ) => { ($base:ident, $name:ident, $($lbl:expr),* ) => {
pub fn $name() -> Result<PrfTree> { pub fn $name() -> Result<PrfTree> {

View File

@@ -9,7 +9,7 @@
//! will eventually yield a [PollResult]. Said [PollResult] contains //! will eventually yield a [PollResult]. Said [PollResult] contains
//! prescriptive activities to be carried out. [CryptoServer::osk] can than //! prescriptive activities to be carried out. [CryptoServer::osk] can than
//! be used to extract the shared key for two peers, once a key-exchange was //! be used to extract the shared key for two peers, once a key-exchange was
//! succesfull. //! successful.
//! //!
//! TODO explain briefly the role of epki //! TODO explain briefly the role of epki
//! //!
@@ -115,7 +115,7 @@ pub const BISCUIT_EPOCH: Timing = 300.0;
// Retransmission pub constants; will retransmit for up to _ABORT ms; starting with a delay of // Retransmission pub constants; will retransmit for up to _ABORT ms; starting with a delay of
// _DELAY_BEG ms and increasing the delay exponentially by a factor of // _DELAY_BEG ms and increasing the delay exponentially by a factor of
// _DELAY_GROWTH up to _DELAY_END. An .secretadditional jitter factor of ±_DELAY_JITTER // _DELAY_GROWTH up to _DELAY_END. An additional jitter factor of ±_DELAY_JITTER
// is added. // is added.
pub const RETRANSMIT_ABORT: Timing = 120.0; pub const RETRANSMIT_ABORT: Timing = 120.0;
pub const RETRANSMIT_DELAY_GROWTH: Timing = 2.0; pub const RETRANSMIT_DELAY_GROWTH: Timing = 2.0;
@@ -188,7 +188,7 @@ pub struct CryptoServer {
/// A Biscuit is like a fancy cookie. To avoid state disruption attacks, /// A Biscuit is like a fancy cookie. To avoid state disruption attacks,
/// the responder doesn't store state. Instead the state is stored in a /// the responder doesn't store state. Instead the state is stored in a
/// Biscuit, that is encrypted using the [BiscuitKey] which is only known to /// Biscuit, that is encrypted using the [BiscuitKey] which is only known to
/// the Respnder. Thus secrecy of the Responder state is not violated, still /// the Responder. Thus secrecy of the Responder state is not violated, still
/// the responder can avoid storing this state. /// the responder can avoid storing this state.
#[derive(Debug)] #[derive(Debug)]
pub struct BiscuitKey { pub struct BiscuitKey {
@@ -287,24 +287,24 @@ pub struct Session {
pub ck: SecretPrfTreeBranch, pub ck: SecretPrfTreeBranch,
/// Key for Transmission ("transmission key mine") /// Key for Transmission ("transmission key mine")
pub txkm: SymKey, pub txkm: SymKey,
/// Key for Receival ("transmission key theirs") /// Key for Reception ("transmission key theirs")
pub txkt: SymKey, pub txkt: SymKey,
/// Nonce for Transmission ("transmission nonce mine") /// Nonce for Transmission ("transmission nonce mine")
pub txnm: u64, pub txnm: u64,
/// Nonce for Receival ("transmission nonce theirs") /// Nonce for Reception ("transmission nonce theirs")
pub txnt: u64, pub txnt: u64,
} }
/// Lifecycle of a Secret /// Lifecycle of a Secret
/// ///
/// The order implies the readiness for usage of a secret, the highes/biggest /// The order implies the readiness for usage of a secret, the highest/biggest
/// variant ([Lifecycle::Young]) is the most preferable one in a class of /// variant ([Lifecycle::Young]) is the most preferable one in a class of
/// equal-role secrets. /// equal-role secrets.
#[derive(Hash, PartialEq, Eq, PartialOrd, Ord, Debug)] #[derive(Hash, PartialEq, Eq, PartialOrd, Ord, Debug)]
enum Lifecycle { enum Lifecycle {
/// Not even generated /// Not even generated
Void = 0, Void = 0,
/// Secret must be zeroized, disposal adviced /// Secret must be zeroed, disposal advised
Dead, Dead,
/// Soon to be dead: the secret might be used for receiving /// Soon to be dead: the secret might be used for receiving
/// data, but must not be used for future sending /// data, but must not be used for future sending
@@ -495,7 +495,7 @@ impl CryptoServer {
Ok(PeerPtr(peerno)) Ok(PeerPtr(peerno))
} }
/// Register a new session (during a sucesfull handshake, persisting longer /// Register a new session (during a successful handshake, persisting longer
/// than the handshake). Might return an error on session id collision /// than the handshake). Might return an error on session id collision
pub fn register_session(&mut self, id: SessionId, peer: PeerPtr) -> Result<()> { pub fn register_session(&mut self, id: SessionId, peer: PeerPtr) -> Result<()> {
match self.index.entry(IndexKey::Sid(id)) { match self.index.entry(IndexKey::Sid(id)) {
@@ -614,7 +614,7 @@ impl Session {
// BISCUIT KEY /////////////////////////////////// // BISCUIT KEY ///////////////////////////////////
/// Biscuit Keys are always randomized, so that even if through a bug some /// Biscuit Keys are always randomized, so that even if through a bug some
/// secrete is encrypted with an unitialized [BiscuitKey], nobody instead of /// secrete is encrypted with an initialized [BiscuitKey], nobody instead of
/// everybody may read the secret. /// everybody may read the secret.
impl BiscuitKey { impl BiscuitKey {
// new creates a random value, that might be counterintuitive for a Default // new creates a random value, that might be counterintuitive for a Default
@@ -733,7 +733,7 @@ impl CryptoServer {
/// Initiate a new handshake, put it to the `tx_buf` __and__ to the /// Initiate a new handshake, put it to the `tx_buf` __and__ to the
/// retransmission storage /// retransmission storage
// NOTE retransmission? yes if initiator, no if responder // NOTE retransmission? yes if initiator, no if responder
// TODO remove unecessary copying between global tx_buf and per-peer buf // TODO remove unnecessary copying between global tx_buf and per-peer buf
// TODO move retransmission storage to io server // TODO move retransmission storage to io server
pub fn initiate_handshake(&mut self, peer: PeerPtr, tx_buf: &mut [u8]) -> Result<usize> { pub fn initiate_handshake(&mut self, peer: PeerPtr, tx_buf: &mut [u8]) -> Result<usize> {
let mut msg = tx_buf.envelope::<InitHello<()>>()?; // Envelope::<InitHello>::default(); // TODO let mut msg = tx_buf.envelope::<InitHello<()>>()?; // Envelope::<InitHello>::default(); // TODO
@@ -758,7 +758,7 @@ impl CryptoServer {
/// ///
/// The response is only dependent on the incoming message, thus this /// The response is only dependent on the incoming message, thus this
/// function is called regardless of whether the the the calling context is /// function is called regardless of whether the the the calling context is
/// an iniator, a responder or both. The flow of is as follows: /// an initiator, a responder or both. The flow of is as follows:
/// ///
/// 1. check incoming message for valid [MsgType] /// 1. check incoming message for valid [MsgType]
/// 2. check that the seal is intact, e.g. that the message is /// 2. check that the seal is intact, e.g. that the message is
@@ -768,11 +768,11 @@ impl CryptoServer {
/// 4. if the protocol foresees a response to this message, generate one /// 4. if the protocol foresees a response to this message, generate one
/// 5. seal the response with cryptographic authentication /// 5. seal the response with cryptographic authentication
/// 6. if the response is a ResponseHello, store the sealed response for /// 6. if the response is a ResponseHello, store the sealed response for
/// further retransmision /// further retransmission
/// 7. return some peerpointer if the exchange completed with this message /// 7. return some peer pointer if the exchange completed with this message
/// 8. return the length of the response generated /// 8. return the length of the response generated
/// ///
/// This is the sequence of a succesful handshake: /// This is the sequence of a successful handshake:
/// ///
/// | time | Initiator | direction | Responder | /// | time | Initiator | direction | Responder |
/// | --- | ---: | :---: | :--- | /// | --- | ---: | :---: | :--- |
@@ -782,7 +782,7 @@ impl CryptoServer {
/// | t3 | | <- | `EmptyData` | /// | t3 | | <- | `EmptyData` |
pub fn handle_msg(&mut self, rx_buf: &[u8], tx_buf: &mut [u8]) -> Result<HandleMsgResult> { pub fn handle_msg(&mut self, rx_buf: &[u8], tx_buf: &mut [u8]) -> Result<HandleMsgResult> {
let seal_broken = "Message seal broken!"; let seal_broken = "Message seal broken!";
// lengt of the response. We assume no response, so None for now // length of the response. We assume no response, so None for now
let mut len = 0; let mut len = 0;
let mut exchanged = false; let mut exchanged = false;
@@ -1296,7 +1296,7 @@ impl HandshakeState {
sodium_bigint_inc(&mut *srv.biscuit_ctr); sodium_bigint_inc(&mut *srv.biscuit_ctr);
// The first bit of the nonce indicates which biscuit key was used // The first bit of the nonce indicates which biscuit key was used
// TODO: This is premature optimiaztion. Remove! // TODO: This is premature optimization. Remove!
let bk = srv.active_biscuit_key(); let bk = srv.active_biscuit_key();
let mut n = XAEADNonce::random(); let mut n = XAEADNonce::random();
n[0] &= 0b0111_1111; n[0] &= 0b0111_1111;
@@ -1320,7 +1320,7 @@ impl HandshakeState {
// The first bit of the biscuit indicates which biscuit key was used // The first bit of the biscuit indicates which biscuit key was used
let bk = BiscuitKeyPtr(((biscuit_ct[0] & 0b1000_0000) >> 7) as usize); let bk = BiscuitKeyPtr(((biscuit_ct[0] & 0b1000_0000) >> 7) as usize);
// Calculate addtional data fields // Calculate additional data fields
let ad = lprf::biscuit_ad()? let ad = lprf::biscuit_ad()?
.mix(srv.spkm.secret())? .mix(srv.spkm.secret())?
.mix(sidi.as_slice())? .mix(sidi.as_slice())?
@@ -1648,7 +1648,7 @@ impl CryptoServer {
// TODO: Implementing RP should be possible without touching the live session stuff // TODO: Implementing RP should be possible without touching the live session stuff
// TODO: I fear that this may lead to race conditions; the acknowledgement may be // TODO: I fear that this may lead to race conditions; the acknowledgement may be
// sent on a different session than the incoming packet. This should be mitigated // sent on a different session than the incoming packet. This should be mitigated
// by the deliberate backoff in SessionPtr::retire_at as in practice only one // by the deliberate back off in SessionPtr::retire_at as in practice only one
// handshake should be going on at a time. // handshake should be going on at a time.
// I think it may not be possible to formulate the protocol in such a way that // I think it may not be possible to formulate the protocol in such a way that
// we can be sure that the other party possesses a matching key; maybe we should // we can be sure that the other party possesses a matching key; maybe we should
@@ -1673,7 +1673,7 @@ impl CryptoServer {
.session() .session()
.get_mut(self) .get_mut(self)
.as_mut() .as_mut()
.context("Cannot send acknoledgement. No session.")?; .context("Cannot send acknowledgement. No session.")?;
rc.sid_mut().copy_from_slice(&ses.sidt.value); rc.sid_mut().copy_from_slice(&ses.sidt.value);
rc.ctr_mut().copy_from_slice(&ses.txnm.to_le_bytes()); rc.ctr_mut().copy_from_slice(&ses.txnm.to_le_bytes());
ses.txnm += 1; // Increment nonce before encryption, just in case an error is raised ses.txnm += 1; // Increment nonce before encryption, just in case an error is raised

View File

@@ -200,7 +200,7 @@ impl<const N: usize> LoadValueB64 for Secret<N> {
// in practice this is likely not a problem because the stack likely // in practice this is likely not a problem because the stack likely
// will be overwritten by something else soon but this is not exactly // will be overwritten by something else soon but this is not exactly
// guaranteed. It would be possible to remedy this, but since the secret // guaranteed. It would be possible to remedy this, but since the secret
// data will linger in the linux page cache anyways with the current // data will linger in the Linux page cache anyways with the current
// implementation, going to great length to erase the secret here is // implementation, going to great length to erase the secret here is
// not worth it right now. // not worth it right now.
b64_reader(&mut fopen_r(p)?) b64_reader(&mut fopen_r(p)?)