mpc_engine/primitives/
auth_share.rs

1//! This module defines the interface for share authentication.
2use serde::{Deserialize, Serialize};
3
4use crate::{primitives::mac::MAC_LENGTH, Error};
5
6use super::mac::{Mac, MacKey};
7
8/// A bit held by a party with a given ID.
9#[derive(Debug, Clone, Serialize, Deserialize)]
10pub struct Bit {
11    pub(crate) id: BitID,
12    pub(crate) value: bool,
13}
14#[derive(Debug, Clone, Serialize, Deserialize)]
15/// A bit identifier.
16///
17/// This is unique per party, not globally, so if referring bits held by another
18/// party, their party ID is also required to disambiguate.
19pub struct BitID(pub(crate) usize);
20
21#[derive(Debug, Clone, Serialize, Deserialize)]
22/// A bit authenticated between two parties.
23pub struct AuthBit {
24    pub(crate) bit: Bit,
25    pub(crate) macs: Vec<(usize, Mac)>,
26    pub(crate) mac_keys: Vec<BitKey>,
27}
28
29impl AuthBit {
30    /// Serialize the bit value and all MACs on the bit.
31    pub fn serialize_bit_macs(&self) -> Vec<u8> {
32        let mut result = vec![0u8; (self.macs.len() + 1) * MAC_LENGTH + 1];
33        result[0] = self.bit.value as u8;
34        for (key_holder, mac) in self.macs.iter() {
35            result[1 + key_holder * MAC_LENGTH..1 + (key_holder + 1) * MAC_LENGTH]
36                .copy_from_slice(mac);
37        }
38
39        result
40    }
41
42    /// Deserialize a bit and MACs on that bit.
43    pub fn deserialize_bit_macs(bytes: &[u8]) -> Result<(bool, Vec<[u8; MAC_LENGTH]>), Error> {
44        if bytes[0] > 1 {
45            return Err(Error::InvalidSerialization);
46        }
47        let bit_value = bytes[0] != 0;
48        let mac_chunks = bytes[1..].chunks_exact(MAC_LENGTH);
49        if !mac_chunks.remainder().is_empty() {
50            return Err(Error::InvalidSerialization);
51        }
52
53        let mut macs: Vec<[u8; MAC_LENGTH]> = Vec::new();
54        for mac in mac_chunks {
55            macs.push(
56                mac.try_into()
57                    .expect("chunks should be of the required length"),
58            )
59        }
60
61        Ok((bit_value, macs))
62    }
63}
64
65/// The key to authenticate a two-party authenticated bit.
66#[derive(Debug, Clone, Serialize, Deserialize)]
67pub struct BitKey {
68    pub(crate) holder_bit_id: BitID,
69    pub(crate) bit_holder: usize,
70    pub(crate) mac_key: MacKey,
71}