From 5ab9c4dc193a7ac01f3d6e2d9d908e007d08d152 Mon Sep 17 00:00:00 2001 From: Jonas Platte Date: Tue, 29 Sep 2020 23:20:53 +0200 Subject: [PATCH] signatures: Use BTreeMap instead of HashMap --- ruma-signatures/src/functions.rs | 19 +++++++++---------- ruma-signatures/src/keys.rs | 6 +++--- ruma-signatures/src/lib.rs | 18 +++++++++--------- 3 files changed, 21 insertions(+), 22 deletions(-) diff --git a/ruma-signatures/src/functions.rs b/ruma-signatures/src/functions.rs index 2fc5308e..bad9cb66 100644 --- a/ruma-signatures/src/functions.rs +++ b/ruma-signatures/src/functions.rs @@ -1,6 +1,6 @@ //! Functions for signing and verifying JSON and events. -use std::{cmp, collections::HashMap, mem}; +use std::{cmp, collections::BTreeMap, mem}; use base64::{decode_config, encode_config, STANDARD_NO_PAD, URL_SAFE_NO_PAD}; use ring::digest::{digest, SHA256}; @@ -147,7 +147,7 @@ where Some(signatures) => from_value(Value::Object(signatures.clone()))?, None => return Err(Error::new("field `signatures` must be a JSON object")), }, - None => HashMap::with_capacity(1), + None => BTreeMap::new(), }; maybe_unsigned = map.remove("unsigned"); @@ -160,8 +160,7 @@ where let signature = key_pair.sign(json.as_bytes()); // Insert the new signature in the map we pulled out (or created) previously. - let signature_set = - signature_map.entry(entity_id.to_string()).or_insert_with(|| HashMap::with_capacity(1)); + let signature_set = signature_map.entry(entity_id.to_string()).or_insert_with(BTreeMap::new); signature_set.insert(signature.id(), signature.base64()); @@ -225,7 +224,7 @@ pub fn canonical_json(value: &Value) -> Result { /// # Examples /// /// ```rust -/// use std::collections::HashMap; +/// use std::collections::BTreeMap; /// /// const PUBLIC_KEY: &str = "XGX0JRS2Af3be3knz2fBiRbApjm2Dh61gXDJA8kcJNI"; /// @@ -241,9 +240,9 @@ pub fn canonical_json(value: &Value) -> Result { /// ).unwrap(); /// /// // Create the `PublicKeyMap` that will inform `verify_json` which signatures to verify. -/// let mut public_key_set = HashMap::new(); +/// let mut public_key_set = BTreeMap::new(); /// public_key_set.insert("ed25519:1".into(), PUBLIC_KEY.to_string()); -/// let mut public_key_map = HashMap::new(); +/// let mut public_key_map = BTreeMap::new(); /// public_key_map.insert("domain".into(), public_key_set); /// /// // Verify at least one signature for each entity in `public_key_map`. @@ -552,7 +551,7 @@ where /// # Examples /// /// ```rust -/// # use std::collections::HashMap; +/// # use std::collections::BTreeMap; /// # use ruma_identifiers::RoomVersionId; /// # use ruma_signatures::verify_event; /// # @@ -585,9 +584,9 @@ where /// ).unwrap(); /// /// // Create the `PublicKeyMap` that will inform `verify_json` which signatures to verify. -/// let mut public_key_set = HashMap::new(); +/// let mut public_key_set = BTreeMap::new(); /// public_key_set.insert("ed25519:1".into(), PUBLIC_KEY.to_string()); -/// let mut public_key_map = HashMap::new(); +/// let mut public_key_map = BTreeMap::new(); /// public_key_map.insert("domain".into(), public_key_set); /// /// // Verify at least one signature for each entity in `public_key_map`. diff --git a/ruma-signatures/src/keys.rs b/ruma-signatures/src/keys.rs index a8921230..74db5b6f 100644 --- a/ruma-signatures/src/keys.rs +++ b/ruma-signatures/src/keys.rs @@ -1,7 +1,7 @@ //! Public and private key pairs. use std::{ - collections::HashMap, + collections::BTreeMap, fmt::{Debug, Formatter, Result as FmtResult}, }; @@ -99,12 +99,12 @@ impl Debug for Ed25519KeyPair { /// A map from entity names to sets of public keys for that entity. /// /// "Entity" is generally a homeserver, e.g. "example.com". -pub type PublicKeyMap = HashMap; +pub type PublicKeyMap = BTreeMap; /// A set of public keys for a single homeserver. /// /// This is represented as a map from key ID to Base64-encoded signature. -pub type PublicKeySet = HashMap; +pub type PublicKeySet = BTreeMap; #[cfg(test)] mod tests { diff --git a/ruma-signatures/src/lib.rs b/ruma-signatures/src/lib.rs index 24a98f23..d5e6e211 100644 --- a/ruma-signatures/src/lib.rs +++ b/ruma-signatures/src/lib.rs @@ -172,7 +172,7 @@ fn split_id(id: &str) -> Result<(Algorithm, String), SplitError<'_>> { #[cfg(test)] mod test { - use std::collections::HashMap; + use std::collections::BTreeMap; use base64::{decode_config, STANDARD_NO_PAD}; use ring::signature::{Ed25519KeyPair as RingEd25519KeyPair, KeyPair as _}; @@ -318,10 +318,10 @@ mod test { fn verify_empty_json() { let value = from_str(r#"{"signatures":{"domain":{"ed25519:1":"lXjsnvhVlz8t3etR+6AEJ0IT70WujeHC1CFjDDsVx0xSig1Bx7lvoi1x3j/2/GPNjQM4a2gD34UqsXFluaQEBA"}}}"#).unwrap(); - let mut signature_set = HashMap::new(); + let mut signature_set = BTreeMap::new(); signature_set.insert("ed25519:1".into(), public_key_string()); - let mut public_key_map = HashMap::new(); + let mut public_key_map = BTreeMap::new(); public_key_map.insert("domain".into(), signature_set); assert!(verify_json(&public_key_map, &value).is_ok()); @@ -369,10 +369,10 @@ mod test { r#"{"one":1,"signatures":{"domain":{"ed25519:1":"t6Ehmh6XTDz7qNWI0QI5tNPSliWLPQP/+Fzz3LpdCS7q1k2G2/5b5Embs2j4uG3ZeivejrzqSVoBcdocRpa+AQ"}},"two":"Two"}"# ).unwrap(); - let mut signature_set = HashMap::new(); + let mut signature_set = BTreeMap::new(); signature_set.insert("ed25519:1".into(), public_key_string()); - let mut public_key_map = HashMap::new(); + let mut public_key_map = BTreeMap::new(); public_key_map.insert("domain".into(), signature_set); assert!(verify_json(&public_key_map, &value).is_ok()); @@ -388,10 +388,10 @@ mod test { fn fail_verify_json() { let value = from_str(r#"{"not":"empty","signatures":{"domain":"lXjsnvhVlz8t3etR+6AEJ0IT70WujeHC1CFjDDsVx0xSig1Bx7lvoi1x3j/2/GPNjQM4a2gD34UqsXFluaQEBA"}}"#).unwrap(); - let mut signature_set = HashMap::new(); + let mut signature_set = BTreeMap::new(); signature_set.insert("ed25519:1".into(), public_key_string()); - let mut public_key_map = HashMap::new(); + let mut public_key_map = BTreeMap::new(); public_key_map.insert("domain".into(), signature_set); assert!(verify_json(&public_key_map, &value).is_err()); @@ -466,10 +466,10 @@ mod test { #[test] fn verify_minimal_event() { - let mut signature_set = HashMap::new(); + let mut signature_set = BTreeMap::new(); signature_set.insert("ed25519:1".into(), public_key_string()); - let mut public_key_map = HashMap::new(); + let mut public_key_map = BTreeMap::new(); public_key_map.insert("domain".into(), signature_set); let value = from_str(