Adding client enumeration mitigations (#153)
This commit is contained in:
+29
-37
@@ -12,7 +12,7 @@ use crate::{
|
||||
traits::{FromBytes, KeyExchange, ToBytes},
|
||||
tripledh::{NonceLen, TripleDH},
|
||||
},
|
||||
opaque::*,
|
||||
keypair::{PublicKey, KeyPair},
|
||||
serialization::{i2osp, os2ip, serialize},
|
||||
*,
|
||||
};
|
||||
@@ -34,6 +34,7 @@ impl CipherSuite for Default {
|
||||
}
|
||||
|
||||
const MAX_INFO_LENGTH: usize = 10;
|
||||
const HASH_SIZE: usize = 64; // Because of SHA512
|
||||
const MAC_SIZE: usize = 64; // Because of SHA512
|
||||
|
||||
fn random_ristretto_point() -> RistrettoPoint {
|
||||
@@ -68,12 +69,8 @@ fn server_registration_roundtrip() {
|
||||
// If we don't have envelope and client_pk, the server registration just
|
||||
// contains the prf key
|
||||
let mut rng = OsRng;
|
||||
let oprf_key = <RistrettoPoint as Group>::random_nonzero_scalar(&mut rng);
|
||||
let mut oprf_bytes: Vec<u8> = vec![];
|
||||
oprf_bytes.extend_from_slice(oprf_key.as_bytes());
|
||||
let reg = ServerRegistration::<Default>::deserialize(&oprf_bytes[..]).unwrap();
|
||||
let reg_bytes = reg.serialize();
|
||||
assert_eq!(reg_bytes, oprf_bytes);
|
||||
let mut masking_key = [0u8; HASH_SIZE];
|
||||
rng.fill_bytes(&mut masking_key);
|
||||
|
||||
let mut ciphertext = [0u8; 32];
|
||||
rng.fill_bytes(&mut ciphertext);
|
||||
@@ -85,11 +82,11 @@ fn server_registration_roundtrip() {
|
||||
mock_envelope_bytes.extend_from_slice(&ciphertext); // ciphertext which is an encrypted private key
|
||||
mock_envelope_bytes.extend_from_slice(&[0; MAC_SIZE]); // length-MAC_SIZE hmac
|
||||
|
||||
let mock_client_kp = Default::generate_random_keypair(&mut rng);
|
||||
let mock_client_kp = KeyPair::<<Default as CipherSuite>::Group>::generate_random(&mut rng);
|
||||
// serialization order: oprf_key, public key, envelope
|
||||
let mut bytes = Vec::<u8>::new();
|
||||
bytes.extend_from_slice(oprf_key.as_bytes());
|
||||
bytes.extend_from_slice(&mock_client_kp.public().to_arr());
|
||||
bytes.extend_from_slice(&masking_key);
|
||||
bytes.extend_from_slice(&mock_envelope_bytes);
|
||||
let reg = ServerRegistration::<Default>::deserialize(&bytes[..]).unwrap();
|
||||
let reg_bytes = reg.serialize();
|
||||
@@ -125,7 +122,7 @@ fn registration_response_roundtrip() {
|
||||
let pt = random_ristretto_point();
|
||||
let beta_bytes = pt.to_arr();
|
||||
let mut rng = OsRng;
|
||||
let skp = Default::generate_random_keypair(&mut rng);
|
||||
let skp = KeyPair::<<Default as CipherSuite>::Group>::generate_random(&mut rng);
|
||||
let pubkey_bytes = skp.public().to_arr();
|
||||
|
||||
let mut input = Vec::new();
|
||||
@@ -151,12 +148,15 @@ fn registration_response_roundtrip() {
|
||||
#[test]
|
||||
fn registration_upload_roundtrip() {
|
||||
let mut rng = OsRng;
|
||||
let skp = Default::generate_random_keypair(&mut rng);
|
||||
let skp = KeyPair::<<Default as CipherSuite>::Group>::generate_random(&mut rng);
|
||||
let pubkey_bytes = skp.public().to_arr();
|
||||
|
||||
let mut key = [0u8; 32];
|
||||
rng.fill_bytes(&mut key);
|
||||
|
||||
let mut masking_key = vec![0u8; <sha2::Sha512 as Digest>::OutputSize::to_usize()];
|
||||
rng.fill_bytes(&mut masking_key);
|
||||
|
||||
let mut msg = [0u8; 32];
|
||||
rng.fill_bytes(&mut msg);
|
||||
|
||||
@@ -172,6 +172,7 @@ fn registration_upload_roundtrip() {
|
||||
|
||||
let mut input = Vec::new();
|
||||
input.extend_from_slice(&pubkey_bytes[..]);
|
||||
input.extend_from_slice(&masking_key[..]);
|
||||
input.extend_from_slice(&envelope_bytes);
|
||||
|
||||
let r3 = RegistrationUpload::<Default>::deserialize(&input[..]).unwrap();
|
||||
@@ -185,7 +186,7 @@ fn credential_request_roundtrip() {
|
||||
let alpha = random_ristretto_point();
|
||||
let alpha_bytes = alpha.to_arr().to_vec();
|
||||
|
||||
let client_e_kp = Default::generate_random_keypair(&mut rng);
|
||||
let client_e_kp = KeyPair::<<Default as CipherSuite>::Group>::generate_random(&mut rng);
|
||||
let mut client_nonce = vec![0u8; NonceLen::to_usize()];
|
||||
rng.fill_bytes(&mut client_nonce);
|
||||
|
||||
@@ -225,25 +226,18 @@ fn credential_response_roundtrip() {
|
||||
let pt_bytes = pt.to_arr().to_vec();
|
||||
|
||||
let mut rng = OsRng;
|
||||
let skp = Default::generate_random_keypair(&mut rng);
|
||||
let pubkey_bytes = skp.public().to_arr();
|
||||
|
||||
let mut key = [0u8; 32];
|
||||
rng.fill_bytes(&mut key);
|
||||
let mut masking_nonce = vec![0u8; 32];
|
||||
rng.fill_bytes(&mut masking_nonce);
|
||||
|
||||
let mut msg = [0u8; 32];
|
||||
rng.fill_bytes(&mut msg);
|
||||
let mut masked_response = vec![
|
||||
0u8;
|
||||
<PublicKey as SizedBytes>::Len::to_usize()
|
||||
+ Envelope::<<Default as CipherSuite>::Hash>::len()
|
||||
];
|
||||
rng.fill_bytes(&mut masked_response);
|
||||
|
||||
let (envelope, _) = Envelope::<sha2::Sha512>::seal_raw(
|
||||
&mut rng,
|
||||
&key,
|
||||
&msg,
|
||||
&pubkey_bytes,
|
||||
InnerEnvelopeMode::Base,
|
||||
)
|
||||
.unwrap();
|
||||
|
||||
let server_e_kp = Default::generate_random_keypair(&mut rng);
|
||||
let server_e_kp = KeyPair::<<Default as CipherSuite>::Group>::generate_random(&mut rng);
|
||||
let mut mac = [0u8; MAC_SIZE];
|
||||
rng.fill_bytes(&mut mac);
|
||||
let mut server_nonce = vec![0u8; NonceLen::to_usize()];
|
||||
@@ -260,12 +254,10 @@ fn credential_response_roundtrip() {
|
||||
]
|
||||
.concat();
|
||||
|
||||
let serialized_envelope = envelope.serialize();
|
||||
|
||||
let mut input = Vec::new();
|
||||
input.extend_from_slice(pt_bytes.as_slice());
|
||||
input.extend_from_slice(&pubkey_bytes.as_slice());
|
||||
input.extend_from_slice(&serialized_envelope);
|
||||
input.extend_from_slice(&masking_nonce);
|
||||
input.extend_from_slice(&masked_response);
|
||||
input.extend_from_slice(&ke2m[..]);
|
||||
|
||||
let l2 = CredentialResponse::<Default>::deserialize(&input).unwrap();
|
||||
@@ -279,8 +271,8 @@ fn credential_response_roundtrip() {
|
||||
assert!(match CredentialRequest::<Default>::deserialize(
|
||||
&[
|
||||
identity_bytes,
|
||||
pubkey_bytes.to_vec(),
|
||||
serialized_envelope,
|
||||
masking_nonce.to_vec(),
|
||||
masked_response,
|
||||
ke2m.to_vec()
|
||||
]
|
||||
.concat()
|
||||
@@ -309,7 +301,7 @@ fn client_login_roundtrip() {
|
||||
let mut rng = OsRng;
|
||||
let sc = <RistrettoPoint as Group>::random_nonzero_scalar(&mut rng);
|
||||
|
||||
let client_e_kp = Default::generate_random_keypair(&mut rng);
|
||||
let client_e_kp = KeyPair::<<Default as CipherSuite>::Group>::generate_random(&mut rng);
|
||||
let mut client_nonce = vec![0u8; NonceLen::to_usize()];
|
||||
rng.fill_bytes(&mut client_nonce);
|
||||
|
||||
@@ -333,7 +325,7 @@ fn client_login_roundtrip() {
|
||||
fn ke1_message_roundtrip() {
|
||||
let mut rng = OsRng;
|
||||
|
||||
let client_e_kp = Default::generate_random_keypair(&mut rng);
|
||||
let client_e_kp = KeyPair::<<Default as CipherSuite>::Group>::generate_random(&mut rng);
|
||||
let mut client_nonce = vec![0u8; NonceLen::to_usize()];
|
||||
rng.fill_bytes(&mut client_nonce);
|
||||
|
||||
@@ -358,7 +350,7 @@ fn ke1_message_roundtrip() {
|
||||
fn ke2_message_roundtrip() {
|
||||
let mut rng = OsRng;
|
||||
|
||||
let server_e_kp = Default::generate_random_keypair(&mut rng);
|
||||
let server_e_kp = KeyPair::<<Default as CipherSuite>::Group>::generate_random(&mut rng);
|
||||
let mut mac = [0u8; MAC_SIZE];
|
||||
rng.fill_bytes(&mut mac);
|
||||
let mut server_nonce = vec![0u8; NonceLen::to_usize()];
|
||||
|
||||
Reference in New Issue
Block a user