core_crypto/
obfuscate.rs

1use crate::prelude::{ClientId, ConversationId};
2use derive_more::{Constructor, From};
3use hex;
4use log::kv::{ToValue, Value};
5use openmls::framing::Sender;
6use openmls::group::QueuedProposal;
7use openmls::prelude::Proposal;
8use sha2::{Digest, Sha256};
9use std::fmt::{Debug, Formatter};
10
11pub(crate) trait Obfuscate {
12    fn obfuscate(&self, f: &mut Formatter<'_>) -> core::fmt::Result;
13}
14
15impl Obfuscate for &ConversationId {
16    fn obfuscate(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
17        f.write_str(hex::encode(compute_hash(self)).as_str())
18    }
19}
20
21impl Obfuscate for &ClientId {
22    fn obfuscate(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
23        f.write_str(hex::encode(compute_hash(self)).as_str())
24    }
25}
26
27impl Obfuscate for &Proposal {
28    fn obfuscate(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
29        f.write_str(match self {
30            Proposal::Add(_) => "Add",
31            Proposal::Update(_) => "Update",
32            Proposal::Remove(_) => "Remove",
33            Proposal::PreSharedKey(_) => "PreSharedKey",
34            Proposal::ReInit(_) => "ReInit",
35            Proposal::ExternalInit(_) => "ExternalInit",
36            Proposal::AppAck(_) => "AppAck",
37            Proposal::GroupContextExtensions(_) => "GroupContextExtensions",
38        })
39    }
40}
41
42impl Obfuscate for &QueuedProposal {
43    fn obfuscate(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
44        (&self.proposal).obfuscate(f)
45    }
46}
47
48impl Obfuscate for &Sender {
49    fn obfuscate(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
50        match self {
51            Sender::Member(leaf_node_index) => write!(f, "Member{leaf_node_index}"),
52            Sender::External(external_sender_index) => write!(f, "External{external_sender_index:?}"),
53            Sender::NewMemberProposal => write!(f, "NewMemberProposal"),
54            Sender::NewMemberCommit => write!(f, "NewMemberCommit"),
55        }
56    }
57}
58
59#[derive(From, Constructor)]
60pub(crate) struct Obfuscated<T>(T);
61
62impl<T> Debug for Obfuscated<T>
63where
64    T: Obfuscate,
65{
66    fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
67        self.0.obfuscate(f)
68    }
69}
70
71impl<T> ToValue for Obfuscated<T>
72where
73    T: Obfuscate,
74{
75    fn to_value(&self) -> Value {
76        Value::from_debug(self)
77    }
78}
79
80fn compute_hash(bytes: &[u8]) -> [u8; 10] {
81    let mut hasher = Sha256::new();
82    let mut output = [0; 10];
83    hasher.update(bytes);
84    output.copy_from_slice(&hasher.finalize().as_slice()[0..10]);
85    output
86}