Updating envelope structure to support two fixed modes (#108)
* Moving id_u and id_s from ClientLoginStartParameters to ClientLoginFinishParameters * Updating envelope format to support two fixed modes
This commit is contained in:
@@ -5,26 +5,6 @@
|
||||
|
||||
use crate::errors::PakeError;
|
||||
|
||||
#[derive(Copy, Clone, Eq, Hash, PartialEq)]
|
||||
pub enum CredentialType {
|
||||
SkU,
|
||||
PkU,
|
||||
PkS,
|
||||
IdU,
|
||||
IdS,
|
||||
}
|
||||
|
||||
pub(crate) fn u8_to_credential_type(x: u8) -> Option<CredentialType> {
|
||||
match x {
|
||||
1 => Some(CredentialType::SkU),
|
||||
2 => Some(CredentialType::PkU),
|
||||
3 => Some(CredentialType::PkS),
|
||||
4 => Some(CredentialType::IdU),
|
||||
5 => Some(CredentialType::IdS),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
// Corresponds to the I2OSP() function from RFC8017
|
||||
pub(crate) fn i2osp(input: usize, length: usize) -> Vec<u8> {
|
||||
if length <= std::mem::size_of::<usize>() {
|
||||
|
||||
+22
-18
@@ -5,7 +5,7 @@
|
||||
|
||||
use crate::{
|
||||
ciphersuite::CipherSuite,
|
||||
envelope::Envelope,
|
||||
envelope::{Envelope, InnerEnvelopeMode},
|
||||
group::Group,
|
||||
key_exchange::{
|
||||
traits::{KeyExchange, ToBytes},
|
||||
@@ -34,7 +34,6 @@ impl CipherSuite for Default {
|
||||
type SlowHash = crate::slow_hash::NoOpHash;
|
||||
}
|
||||
|
||||
const MAX_ID_LENGTH: usize = 10;
|
||||
const MAX_INFO_LENGTH: usize = 10;
|
||||
|
||||
fn random_ristretto_point() -> RistrettoPoint {
|
||||
@@ -80,6 +79,7 @@ fn server_registration_roundtrip() {
|
||||
|
||||
// Construct a mock envelope
|
||||
let mut mock_envelope_bytes = Vec::new();
|
||||
mock_envelope_bytes.extend_from_slice(&[0; 1]); // mode = 0
|
||||
mock_envelope_bytes.extend_from_slice(&[0; NONCE_LEN]); // empty nonce
|
||||
mock_envelope_bytes.extend_from_slice(&[0, 0]); // empty ciphertext
|
||||
mock_envelope_bytes.extend_from_slice(&[0, 0]); // empty auth_data
|
||||
@@ -121,7 +121,6 @@ fn register_second_message_roundtrip() {
|
||||
let mut rng = OsRng;
|
||||
let skp = Default::generate_random_keypair(&mut rng).unwrap();
|
||||
let pubkey_bytes = skp.public().to_arr();
|
||||
let credential_types = [1, 1, 1, 3];
|
||||
|
||||
let beta_length: usize = beta_bytes.len();
|
||||
let pubkey_length: usize = pubkey_bytes.len();
|
||||
@@ -131,7 +130,6 @@ fn register_second_message_roundtrip() {
|
||||
input.extend_from_slice(beta_bytes.as_slice());
|
||||
input.extend_from_slice(&pubkey_length.to_be_bytes()[std::mem::size_of::<usize>() - 2..]);
|
||||
input.extend_from_slice(&pubkey_bytes.as_slice());
|
||||
input.extend_from_slice(&credential_types);
|
||||
|
||||
let r2 = RegistrationResponse::<RistrettoPoint>::deserialize(input.as_slice()).unwrap();
|
||||
let r2_bytes = r2.serialize();
|
||||
@@ -150,8 +148,14 @@ fn register_third_message_roundtrip() {
|
||||
let mut msg = [0u8; 32];
|
||||
rng.fill_bytes(&mut msg);
|
||||
|
||||
let (envelope, _) =
|
||||
Envelope::<sha2::Sha256>::seal_raw(&key, &msg, &pubkey_bytes, &mut rng).unwrap();
|
||||
let (envelope, _) = Envelope::<sha2::Sha256>::seal_raw(
|
||||
&mut rng,
|
||||
&key,
|
||||
&msg,
|
||||
&pubkey_bytes,
|
||||
InnerEnvelopeMode::Base,
|
||||
)
|
||||
.unwrap();
|
||||
let envelope_bytes = envelope.serialize();
|
||||
|
||||
let pubkey_length: usize = pubkey_bytes.len();
|
||||
@@ -206,6 +210,7 @@ fn login_second_message_roundtrip() {
|
||||
let mut rng = OsRng;
|
||||
let skp = Default::generate_random_keypair(&mut rng).unwrap();
|
||||
let pubkey_bytes = skp.public().to_arr();
|
||||
let pubkey_length: usize = pubkey_bytes.len();
|
||||
|
||||
let mut key = [0u8; 32];
|
||||
rng.fill_bytes(&mut key);
|
||||
@@ -213,8 +218,14 @@ fn login_second_message_roundtrip() {
|
||||
let mut msg = [0u8; 32];
|
||||
rng.fill_bytes(&mut msg);
|
||||
|
||||
let (envelope, _) =
|
||||
Envelope::<sha2::Sha256>::seal_raw(&key, &msg, &pubkey_bytes, &mut rng).unwrap();
|
||||
let (envelope, _) = Envelope::<sha2::Sha256>::seal_raw(
|
||||
&mut rng,
|
||||
&key,
|
||||
&msg,
|
||||
&pubkey_bytes,
|
||||
InnerEnvelopeMode::Base,
|
||||
)
|
||||
.unwrap();
|
||||
|
||||
let server_e_kp = Default::generate_random_keypair(&mut rng).unwrap();
|
||||
let mut mac = [0u8; 32];
|
||||
@@ -239,6 +250,8 @@ fn login_second_message_roundtrip() {
|
||||
let mut input = Vec::new();
|
||||
input.extend_from_slice(&pt_bytes.len().to_be_bytes()[std::mem::size_of::<usize>() - 2..]);
|
||||
input.extend_from_slice(pt_bytes.as_slice());
|
||||
input.extend_from_slice(&pubkey_length.to_be_bytes()[std::mem::size_of::<usize>() - 2..]);
|
||||
input.extend_from_slice(&pubkey_bytes.as_slice());
|
||||
input.extend_from_slice(&envelope.serialize());
|
||||
input.extend_from_slice(&ke2m[..]);
|
||||
|
||||
@@ -273,13 +286,6 @@ fn login_third_message_roundtrip() {
|
||||
fn client_login_roundtrip() {
|
||||
let pw = b"hunter2";
|
||||
let mut rng = OsRng;
|
||||
let id_u_length: usize = rng.gen_range(0, MAX_ID_LENGTH);
|
||||
let id_s_length: usize = rng.gen_range(0, MAX_ID_LENGTH);
|
||||
let mut id_u = [0u8; MAX_ID_LENGTH];
|
||||
rng.fill_bytes(&mut id_u);
|
||||
let mut id_s = [0u8; MAX_ID_LENGTH];
|
||||
rng.fill_bytes(&mut id_s);
|
||||
|
||||
let sc = <RistrettoPoint as Group>::random_scalar(&mut rng);
|
||||
|
||||
let client_e_kp = Default::generate_random_keypair(&mut rng).unwrap();
|
||||
@@ -291,10 +297,8 @@ fn client_login_roundtrip() {
|
||||
hasher.update(l1_data);
|
||||
let hashed_l1 = hasher.finalize();
|
||||
|
||||
// serialization order: id_u, id_s, scalar, password, ke1_state
|
||||
// serialization order: scalar, password, ke1_state
|
||||
let bytes: Vec<u8> = [
|
||||
&serialize(&id_u[..id_u_length], 2)[..],
|
||||
&serialize(&id_s[..id_s_length], 2)[..],
|
||||
&sc.as_bytes()[..],
|
||||
&pw[..],
|
||||
client_e_kp.public(),
|
||||
|
||||
Reference in New Issue
Block a user