From dd940d57699325a17f5f00f0d24f7d3bd76f6af6 Mon Sep 17 00:00:00 2001 From: oxalica Date: Sun, 22 Sep 2024 07:27:24 -0400 Subject: [PATCH] feat(types): `impl Debug,From<{&,}VerifyingKey> for PubKey` --- blah-types/src/lib.rs | 26 ++++++++++++++++++++++---- blahctl/src/main.rs | 12 ++++++------ blahd/benches/register-pow.rs | 4 ++-- blahd/tests/webapi.rs | 6 +++--- 4 files changed, 33 insertions(+), 15 deletions(-) diff --git a/blah-types/src/lib.rs b/blah-types/src/lib.rs index 9ca6a11..faabc4f 100644 --- a/blah-types/src/lib.rs +++ b/blah-types/src/lib.rs @@ -61,7 +61,7 @@ pub struct UserKey { pub act_key: PubKey, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(transparent)] pub struct PubKey(#[serde(with = "hex::serde")] pub [u8; PUBLIC_KEY_LENGTH]); @@ -73,6 +73,12 @@ impl FromStr for PubKey { } } +impl fmt::Debug for PubKey { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_tuple("PubKey").field(&self.to_string()).finish() + } +} + impl fmt::Display for PubKey { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let mut buf = [0u8; PUBLIC_KEY_LENGTH * 2]; @@ -81,6 +87,18 @@ impl fmt::Display for PubKey { } } +impl From for PubKey { + fn from(vk: VerifyingKey) -> Self { + Self(vk.to_bytes()) + } +} + +impl From<&VerifyingKey> for PubKey { + fn from(vk: &VerifyingKey) -> Self { + Self(vk.to_bytes()) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct Signed { @@ -157,7 +175,7 @@ impl Signed { payload, timestamp, user: UserKey { - act_key: PubKey(act_key.verifying_key().to_bytes()), + act_key: act_key.verifying_key().into(), id_key: id_key.clone(), }, }; @@ -578,7 +596,7 @@ mod sql_impl { let rawkey = <[u8; PUBLIC_KEY_LENGTH]>::column_result(value)?; let key = VerifyingKey::from_bytes(&rawkey) .map_err(|err| FromSqlError::Other(format!("invalid pubkey: {err}").into()))?; - Ok(PubKey(key.to_bytes())) + Ok(key.into()) } } @@ -635,7 +653,7 @@ mod tests { room: Id(42), } .sign_msg_with( - &PubKey(id_key.verifying_key().to_bytes()), + &id_key.verifying_key().into(), &act_key, timestamp, &mut fake_rng, diff --git a/blahctl/src/main.rs b/blahctl/src/main.rs index 3f3bea0..126cd03 100644 --- a/blahctl/src/main.rs +++ b/blahctl/src/main.rs @@ -268,7 +268,7 @@ fn userkey_parser(s: &str) -> clap::error::Result { impl User { async fn fetch_key(&self) -> Result { let rawkey = if let Some(key) = &self.key { - return Ok(PubKey(key.to_bytes())); + return Ok(key.into()); } else if let Some(path) = &self.public_key_file { fs::read_to_string(path).context("failed to read key file")? } else if let Some(url) = &self.url { @@ -336,7 +336,7 @@ fn main_id(cmd: IdCommand) -> Result<()> { id_url, } => { let id_key_priv = SigningKey::generate(&mut thread_rng()); - let id_key = PubKey(id_key_priv.verifying_key().to_bytes()); + let id_key = PubKey::from(id_key_priv.verifying_key()); let act_key_desc = UserActKeyDesc { act_key: id_key.clone(), @@ -378,7 +378,7 @@ fn main_id(cmd: IdCommand) -> Result<()> { let mut id_desc = serde_json::from_str::(&id_desc) .context("failed to parse desc_file")?; let id_key_priv = load_signing_key(&id_key_file)?; - let id_key = PubKey(id_key_priv.verifying_key().to_bytes()); + let id_key = id_key_priv.verifying_key().into(); // TODO: Dedup this check. ensure!(id_key == id_desc.id_key, "id_key mismatch with key file"); ensure!( @@ -416,7 +416,7 @@ fn main_id(cmd: IdCommand) -> Result<()> { let mut id_desc = serde_json::from_str::(&id_desc) .context("failed to parse desc_file")?; let id_key_priv = load_signing_key(&id_key_file)?; - let id_key = PubKey(id_key_priv.verifying_key().to_bytes()); + let id_key = id_key_priv.verifying_key().into(); ensure!(id_key == id_desc.id_key, "id_key mismatch with key file"); let exists = id_desc .act_keys @@ -494,7 +494,7 @@ async fn main_api(api_url: Url, command: ApiCommand) -> Result<()> { title, }) // FIXME: Same key. - .sign_msg(&PubKey(key.to_bytes()), &key) + .sign_msg(&key.verifying_key().into(), &key) .expect("serialization cannot fail"); let ret = client @@ -518,7 +518,7 @@ async fn main_api(api_url: Url, command: ApiCommand) -> Result<()> { rich_text: RichText::from(text), } // FIXME: Same key. - .sign_msg(&PubKey(key.to_bytes()), &key) + .sign_msg(&key.verifying_key().into(), &key) .expect("serialization cannot fail"); let ret = client diff --git a/blahd/benches/register-pow.rs b/blahd/benches/register-pow.rs index f1d9560..f514bf4 100644 --- a/blahd/benches/register-pow.rs +++ b/blahd/benches/register-pow.rs @@ -12,9 +12,9 @@ fn bench_register_pow(c: &mut Criterion) { let rng = &mut thread_rng(); let id_key_priv = SigningKey::from_bytes(&[0x1A; 32]); - let id_key = PubKey(id_key_priv.verifying_key().to_bytes()); + let id_key = PubKey::from(id_key_priv.verifying_key()); let act_key_priv = SigningKey::from_bytes(&[0x2B; 32]); - let act_key = PubKey(act_key_priv.verifying_key().to_bytes()); + let act_key = act_key_priv.verifying_key().into(); let payload = UserRegisterPayload { id_key: id_key.clone(), server_url: "http://some.example.com".parse().unwrap(), diff --git a/blahd/tests/webapi.rs b/blahd/tests/webapi.rs index ab40f05..7c0b49e 100644 --- a/blahd/tests/webapi.rs +++ b/blahd/tests/webapi.rs @@ -12,7 +12,7 @@ use axum::http::HeaderMap; use blah_types::identity::{IdUrl, UserActKeyDesc, UserIdentityDesc, UserProfile}; use blah_types::{ AuthPayload, ChatPayload, CreateGroup, CreatePeerChat, CreateRoomPayload, DeleteRoomPayload, - Id, MemberPermission, PubKey, RichText, RoomAdminOp, RoomAdminPayload, RoomAttrs, RoomMetadata, + Id, MemberPermission, RichText, RoomAdminOp, RoomAdminPayload, RoomAttrs, RoomMetadata, ServerPermission, SignExt, Signed, SignedChatMsg, UserKey, UserRegisterPayload, WithMsgId, X_BLAH_DIFFICULTY, X_BLAH_NONCE, }; @@ -68,8 +68,8 @@ impl User { let act_priv = SigningKey::from_bytes(&[b.to_ascii_lowercase(); 32]); Self { pubkeys: UserKey { - id_key: PubKey(id_priv.verifying_key().to_bytes()), - act_key: PubKey(act_priv.verifying_key().to_bytes()), + id_key: id_priv.verifying_key().into(), + act_key: act_priv.verifying_key().into(), }, id_priv, act_priv,