11use crate :: { errors:: AuthError , groups:: * , utils:: * } ;
22use alloc:: vec:: Vec ;
3+ use bigint:: { BoxedUint , ConcatenatingMul , Odd , Resize , modular:: BoxedMontyForm } ;
34use core:: marker:: PhantomData ;
4- use crypto_bigint:: { BoxedUint , ConcatenatingMul , Odd , Resize , modular:: BoxedMontyForm } ;
55use digest:: { Digest , Output } ;
66use subtle:: ConstantTimeEq ;
77
@@ -38,12 +38,15 @@ pub type ClientG4096<D> = Client<G4096, D>;
3838/// Next send handshake data (username and `a_pub`) to the server and receive
3939/// `salt` and `b_pub`:
4040///
41- /// ```rust
41+ #[ cfg_attr( feature = "getrandom" , doc = "```" ) ]
42+ #[ cfg_attr( not( feature = "getrandom" ) , doc = "```ignore" ) ]
4243/// # let client = srp::ClientG2048::<sha2::Sha256>::new();
4344/// # fn server_response()-> (Vec<u8>, Vec<u8>) { (vec![], vec![]) }
45+ /// // NOTE: requires `getrandom` crate feature is enabled
46+ ///
47+ /// use srp::{EphemeralSecret, Generate};
4448///
45- /// let mut a = [0u8; 64];
46- /// // rng.fill_bytes(&mut a);
49+ /// let mut a = EphemeralSecret::generate();
4750/// let a_pub = client.compute_public_ephemeral(&a);
4851/// let (salt, b_pub) = server_response();
4952/// ```
@@ -58,9 +61,8 @@ pub type ClientG4096<D> = Client<G4096, D>;
5861/// # let password = b"password";
5962/// # let salt = b"salt";
6063/// # let b_pub = b"b_pub";
61- ///
6264/// let private_key = (username, password, salt);
63- /// let verifier = client.process_reply_legacy (&a, username, password, salt, b_pub);
65+ /// let verifier = client.process_reply (&a, username, password, salt, b_pub);
6466/// ```
6567///
6668/// Finally verify the server: first generate user proof,
@@ -71,7 +73,6 @@ pub type ClientG4096<D> = Client<G4096, D>;
7173/// # let client = srp::ClientG2048::<sha2::Sha256>::new();
7274/// # let verifier = client.process_reply(b"", b"", b"", b"", b"1").unwrap();
7375/// # fn send_proof(_: &[u8]) -> Vec<u8> { vec![173, 202, 13, 26, 207, 73, 0, 46, 121, 238, 48, 170, 96, 146, 60, 49, 88, 76, 12, 184, 152, 76, 207, 220, 140, 205, 190, 189, 117, 6, 131, 63] }
74- ///
7576/// let client_proof = verifier.proof();
7677/// let server_proof = send_proof(client_proof);
7778/// verifier.verify_server(&server_proof).unwrap();
@@ -81,40 +82,21 @@ pub type ClientG4096<D> = Client<G4096, D>;
8182/// key using `key()` method.
8283/// ```rust
8384/// # let client = srp::ClientG2048::<sha2::Sha256>::new();
84- /// # let verifier = client.process_reply_legacy(b"", b"", b"", b"", b"1").unwrap();
85- ///
85+ /// # let verifier = client.process_reply(b"", b"", b"", b"", b"1").unwrap();
8686/// verifier.key();
8787/// ```
8888///
89- ///
90- /// Alternatively, you can use `process_reply_rfc5054` method to process parameters
91- /// according to RFC 5054 if the server is using it. This way, it generates M1 and
92- /// M2 differently and also the `verify_server` method will return a shared session
93- /// key in case of correct server data.
94- ///
95- /// ```ignore
96- /// # let client = srp::ClientG2048::<sha2::Sha256>::new();
97- /// # let verifier = client.process_reply_rfc5054(b"", b"", b"", b"", b"1").unwrap();
98- /// # fn send_proof(_: &[u8]) -> Vec<u8> { vec![10, 215, 214, 40, 136, 200, 122, 121, 68, 160, 38, 32, 85, 82, 128, 30, 199, 194, 126, 222, 61, 55, 2, 28, 120, 181, 155, 102, 141, 65, 17, 64] }
99- ///
100- /// let client_proof = verifier.proof();
101- /// let server_proof = send_proof(client_proof);
102- /// let session_key = verifier.verify_server(&server_proof).unwrap();
103- /// ```
104- ///
105- ///
10689/// For user registration on the server first generate salt (e.g. 32 bytes long)
10790/// and get password verifier which depends on private key. Send username, salt
108- /// and password verifier over protected channel to protect against
109- /// Man-in-the-middle (MITM) attack for registration.
91+ /// and password verifier over a protected channel to protect against Man-in-the-middle
92+ /// (MITM) attack for registration.
11093///
11194/// ```rust
11295/// # let client = srp::ClientG2048::<sha2::Sha256>::new();
11396/// # let username = b"username";
11497/// # let password = b"password";
11598/// # let salt = b"salt";
11699/// # fn send_registration_data(_: &[u8], _: &[u8], _: &[u8]) {}
117- ///
118100/// let pwd_verifier = client.compute_verifier(username, password, salt);
119101/// send_registration_data(username, salt, &pwd_verifier);
120102/// ```
@@ -272,10 +254,7 @@ impl<G: Group, D: Digest> Client<G, D> {
272254 /// - `a` is a random value,
273255 /// - `username`, `password` is supplied by the user
274256 /// - `salt` and `b_pub` come from the server
275- #[ deprecated(
276- since = "0.7.0" ,
277- note = "please switch to `Client::process_reply_rfc5054`"
278- ) ]
257+ #[ deprecated( since = "0.7.0" , note = "please use `Client::process_reply` (RFC5054)" ) ]
279258 #[ allow( deprecated) ]
280259 pub fn process_reply_legacy (
281260 & self ,
0 commit comments