Protocol: freeze device proof and browser CSRF contracts
This commit is contained in:
@@ -1976,6 +1976,21 @@ impl VersionNegotiation {
|
||||
pub fn features(&self) -> &Vec<String> { &self.features }
|
||||
}
|
||||
|
||||
pub fn device_registration_proof_transcript(server_id: &[u8], principal_id: &[u8], device_id: &[u8], challenge: &[u8], expiry_unix_milliseconds: i64) -> Result<Vec<u8>, ValidationError> {
|
||||
for (field, value, length) in [("server_id", server_id, 16), ("principal_id", principal_id, 16), ("device_id", device_id, 16), ("challenge", challenge, 32)] {
|
||||
if value.len() != length { return Err(ValidationError::new(field, "invalid_length")); }
|
||||
}
|
||||
if expiry_unix_milliseconds < 0 { return Err(ValidationError::new("expiry_unix_milliseconds", "minimum")); }
|
||||
let mut transcript = Vec::with_capacity(112);
|
||||
transcript.extend_from_slice(b"versevdi-device-proof-v1");
|
||||
transcript.extend_from_slice(server_id);
|
||||
transcript.extend_from_slice(principal_id);
|
||||
transcript.extend_from_slice(device_id);
|
||||
transcript.extend_from_slice(challenge);
|
||||
transcript.extend_from_slice(&(expiry_unix_milliseconds as u64).to_be_bytes());
|
||||
Ok(transcript)
|
||||
}
|
||||
|
||||
pub fn intersect_capability_profiles(profiles: &[CapabilityProfile]) -> Result<CapabilityProfile, ValidationError> {
|
||||
let mut selected = profiles.first().ok_or_else(|| ValidationError::new("capabilities", "no_overlap"))?.clone();
|
||||
selected.validate().map_err(|_| ValidationError::new("capabilities", "no_overlap"))?;
|
||||
|
||||
Reference in New Issue
Block a user