use independent verification key

there are 3 key blobs in the database, gossip_key, public_key and verified_key.
the verification_key should not change if, for any reasons,
the public_key or the gossip_key changes.
This commit is contained in:
B. Petersen
2019-09-27 23:55:45 +02:00
parent f28a971b96
commit 8a4caeba95
2 changed files with 9 additions and 51 deletions

View File

@@ -804,14 +804,14 @@ impl Contact {
} }
if let Some(peerstate) = peerstate { if let Some(peerstate) = peerstate {
if peerstate.verified_key().is_some() { if peerstate.verified_key.is_some() {
return VerifiedStatus::BidirectVerified; return VerifiedStatus::BidirectVerified;
} }
} }
let peerstate = Peerstate::from_addr(context, &context.sql, &self.addr); let peerstate = Peerstate::from_addr(context, &context.sql, &self.addr);
if let Some(ps) = peerstate { if let Some(ps) = peerstate {
if ps.verified_key().is_some() { if ps.verified_key.is_some() {
return VerifiedStatus::BidirectVerified; return VerifiedStatus::BidirectVerified;
} }
} }

View File

@@ -23,7 +23,7 @@ pub struct Peerstate<'a> {
pub gossip_key: Option<Key>, pub gossip_key: Option<Key>,
pub gossip_timestamp: i64, pub gossip_timestamp: i64,
pub gossip_key_fingerprint: Option<String>, pub gossip_key_fingerprint: Option<String>,
verified_key: VerifiedKey, pub verified_key: Option<Key>,
pub verified_key_fingerprint: Option<String>, pub verified_key_fingerprint: Option<String>,
pub to_save: Option<ToSave>, pub to_save: Option<ToSave>,
pub degrade_event: Option<DegradeEvent>, pub degrade_event: Option<DegradeEvent>,
@@ -85,32 +85,6 @@ pub enum DegradeEvent {
FingerprintChanged = 0x02, FingerprintChanged = 0x02,
} }
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
enum VerifiedKey {
Gossip,
Public,
None,
}
impl Default for VerifiedKey {
fn default() -> Self {
VerifiedKey::None
}
}
impl VerifiedKey {
pub fn is_none(&self) -> bool {
match self {
VerifiedKey::None => true,
_ => false,
}
}
pub fn is_some(&self) -> bool {
!self.is_none()
}
}
impl<'a> Peerstate<'a> { impl<'a> Peerstate<'a> {
pub fn new(context: &'a Context) -> Self { pub fn new(context: &'a Context) -> Self {
Peerstate { Peerstate {
@@ -124,21 +98,13 @@ impl<'a> Peerstate<'a> {
gossip_key: None, gossip_key: None,
gossip_key_fingerprint: None, gossip_key_fingerprint: None,
gossip_timestamp: 0, gossip_timestamp: 0,
verified_key: Default::default(), verified_key: None,
verified_key_fingerprint: None, verified_key_fingerprint: None,
to_save: None, to_save: None,
degrade_event: None, degrade_event: None,
} }
} }
pub fn verified_key(&self) -> Option<&Key> {
match self.verified_key {
VerifiedKey::Public => self.public_key.as_ref(),
VerifiedKey::Gossip => self.gossip_key.as_ref(),
VerifiedKey::None => None,
}
}
pub fn from_header(context: &'a Context, header: &Aheader, message_time: i64) -> Self { pub fn from_header(context: &'a Context, header: &Aheader, message_time: i64) -> Self {
let mut res = Self::new(context); let mut res = Self::new(context);
@@ -242,19 +208,11 @@ impl<'a> Peerstate<'a> {
.get(6) .get(6)
.ok() .ok()
.and_then(|blob: Vec<u8>| Key::from_slice(&blob, KeyType::Public)); .and_then(|blob: Vec<u8>| Key::from_slice(&blob, KeyType::Public));
let vk = row res.verified_key = row
.get(9) .get(9)
.ok() .ok()
.and_then(|blob: Vec<u8>| Key::from_slice(&blob, KeyType::Public)); .and_then(|blob: Vec<u8>| Key::from_slice(&blob, KeyType::Public));
res.verified_key = if vk == res.gossip_key && res.gossip_key.is_some() {
VerifiedKey::Gossip
} else if vk == res.public_key {
VerifiedKey::Public
} else {
VerifiedKey::None
};
Ok(res) Ok(res)
}) })
.ok() .ok()
@@ -374,7 +332,7 @@ impl<'a> Peerstate<'a> {
} }
if 0 != min_verified { if 0 != min_verified {
return self.verified_key(); return self.verified_key.as_ref();
} }
if self.public_key.is_some() { if self.public_key.is_some() {
return self.public_key.as_ref(); return self.public_key.as_ref();
@@ -391,7 +349,7 @@ impl<'a> Peerstate<'a> {
&& self.public_key_fingerprint.as_ref().unwrap() == fingerprint && self.public_key_fingerprint.as_ref().unwrap() == fingerprint
{ {
self.to_save = Some(ToSave::All); self.to_save = Some(ToSave::All);
self.verified_key = VerifiedKey::Public; self.verified_key = self.public_key.clone();
self.verified_key_fingerprint = self.public_key_fingerprint.clone(); self.verified_key_fingerprint = self.public_key_fingerprint.clone();
success = true; success = true;
} }
@@ -400,7 +358,7 @@ impl<'a> Peerstate<'a> {
&& self.gossip_key_fingerprint.as_ref().unwrap() == fingerprint && self.gossip_key_fingerprint.as_ref().unwrap() == fingerprint
{ {
self.to_save = Some(ToSave::All); self.to_save = Some(ToSave::All);
self.verified_key = VerifiedKey::Gossip; self.verified_key = self.gossip_key.clone();
self.verified_key_fingerprint = self.gossip_key_fingerprint.clone(); self.verified_key_fingerprint = self.gossip_key_fingerprint.clone();
success = true; success = true;
} }
@@ -438,7 +396,7 @@ impl<'a> Peerstate<'a> {
self.gossip_key.as_ref().map(|k| k.to_bytes()), self.gossip_key.as_ref().map(|k| k.to_bytes()),
&self.public_key_fingerprint, &self.public_key_fingerprint,
&self.gossip_key_fingerprint, &self.gossip_key_fingerprint,
self.verified_key().map(|k| k.to_bytes()), self.verified_key.as_ref().map(|k| k.to_bytes()),
&self.verified_key_fingerprint, &self.verified_key_fingerprint,
&self.addr, &self.addr,
], ],