source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
-[[package]]
-name = "block-buffer"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4"
-dependencies = [
- "generic-array",
-]
-
[[package]]
name = "block-buffer"
version = "0.10.0"
"generic-array",
]
-[[package]]
-name = "crypto-mac"
-version = "0.11.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714"
-dependencies = [
- "generic-array",
- "subtle",
-]
-
[[package]]
name = "curve25519-dalek"
version = "3.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b697d66081d42af4fba142d56918a3cb21dc8eb63372c6b85d14f44fb9c5979b"
dependencies = [
- "block-buffer 0.10.0",
+ "block-buffer",
"crypto-common",
"generic-array",
+ "subtle",
]
[[package]]
[[package]]
name = "hkdf"
-version = "0.11.0"
+version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "01706d578d5c281058480e673ae4086a9f4710d8df1ad80a5b03e39ece5f886b"
+checksum = "94f41e9c77b6fc05b57497b960aad55942a9bbc5b20e1e623cf7fb1868f695d1"
dependencies = [
- "digest 0.9.0",
"hmac",
]
[[package]]
name = "hmac"
-version = "0.11.0"
+version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b"
+checksum = "ddca131f3e7f2ce2df364b57949a9d47915cfbd35e46cfee355ccebbf794d6a2"
dependencies = [
- "crypto-mac",
- "digest 0.9.0",
+ "digest 0.10.1",
]
[[package]]
"autocfg 1.0.1",
]
-[[package]]
-name = "opaque-debug"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5"
-
[[package]]
name = "rand"
version = "0.6.5"
"digest 0.10.1",
]
-[[package]]
-name = "sha2"
-version = "0.9.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b69f9a4c9740d74c5baa3fd2e547f9525fa8088a8a958e0ca2409a514e33f5fa"
-dependencies = [
- "block-buffer 0.9.0",
- "cfg-if",
- "cpufeatures",
- "digest 0.9.0",
- "opaque-debug",
-]
-
[[package]]
name = "sha2"
version = "0.10.1"
"hkdf",
"num-bigint",
"rand_core 0.5.1",
- "sha2 0.9.8",
+ "sha2",
]
[[package]]
"num-traits",
"rand",
"sha-1",
- "sha2 0.10.1",
+ "sha2",
"subtle",
]
//! [6]: http://eprint.iacr.org/2003/038.pdf "Pretty-Simple Password-Authenticated Key-Exchange Under Standard Assumptions"
//! [7]: https://moderncrypto.org/mail-archive/curves/2015/000419.html "PAKE questions"
-use curve25519_dalek::constants::ED25519_BASEPOINT_POINT;
-use curve25519_dalek::edwards::CompressedEdwardsY;
-use curve25519_dalek::edwards::EdwardsPoint as c2_Element;
-use curve25519_dalek::scalar::Scalar as c2_Scalar;
+use core::{fmt, ops::Deref, str};
+use curve25519_dalek::{
+ constants::ED25519_BASEPOINT_POINT,
+ edwards::{CompressedEdwardsY, EdwardsPoint as c2_Element},
+ scalar::Scalar as c2_Scalar,
+};
use hkdf::Hkdf;
use rand_core::{CryptoRng, OsRng, RngCore};
use sha2::{Digest, Sha256};
-use std::fmt;
-use std::ops::Deref;
/* "newtype pattern": it's a Vec<u8>, but only used for a specific argument
* type, to distinguish between ones that are meant as passwords, and ones
}
}
-fn maybe_utf8(s: &[u8]) -> String {
- match String::from_utf8(s.to_vec()) {
- Ok(m) => format!("(s={})", m),
- Err(_) => format!("(hex={})", hex::encode(s)),
- }
-}
-
impl<G: Group> fmt::Debug for SPAKE2<G> {
fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
fmt.debug_struct("SPAKE2")
.field("group", &G::name())
.field("side", &self.side)
- .field("idA", &maybe_utf8(&self.id_a))
- .field("idB", &maybe_utf8(&self.id_b))
- .field("idS", &maybe_utf8(&self.id_s))
+ .field("idA", &MaybeUtf8(&self.id_a))
+ .field("idB", &MaybeUtf8(&self.id_b))
+ .field("idS", &MaybeUtf8(&self.id_s))
.finish()
}
}
+struct MaybeUtf8<'a>(&'a [u8]);
+
+impl fmt::Debug for MaybeUtf8<'_> {
+ fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
+ if let Ok(s) = str::from_utf8(self.0) {
+ write!(fmt, "(s={})", s)
+ } else {
+ write!(fmt, "(hex=")?;
+
+ for byte in self.0 {
+ write!(fmt, "{:x}", byte)?;
+ }
+
+ write!(fmt, ")")
+ }
+ }
+}
+
#[cfg(test)]
mod tests;
println!("s1: {:?}", s1);
assert_eq!(
format!("{:?}", s1),
- "SPAKE2 { group: \"Ed25519\", side: A, idA: \"(s=idA)\", idB: \"(s=idB)\", idS: \"(s=)\" }"
+ "SPAKE2 { group: \"Ed25519\", side: A, idA: (s=idA), idB: (s=idB), idS: (s=) }"
);
let (s2, _msg1) = SPAKE2::<Ed25519Group>::start_symmetric(
&Identity::new(b"idS"),
);
println!("s2: {:?}", s2);
- assert_eq!(format!("{:?}", s2),
- "SPAKE2 { group: \"Ed25519\", side: Symmetric, idA: \"(s=)\", idB: \"(s=)\", idS: \"(s=idS)\" }");
+ assert_eq!(
+ format!("{:?}", s2),
+ "SPAKE2 { group: \"Ed25519\", side: Symmetric, idA: (s=), idB: (s=), idS: (s=idS) }"
+ );
}