mirror of
https://github.com/chatmail/core.git
synced 2026-05-02 12:56:30 +03:00
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:
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
],
|
],
|
||||||
|
|||||||
Reference in New Issue
Block a user