concordium_base 10.0.0-alpha.0

A library that defines common types and functionality that are needed by Concordium Rust projects.
Documentation
//! Elgamal message  types

use core::fmt;
use rand::*;
use std::fmt::{Debug, Formatter};

use crate::{common::*, curve_arithmetic::Curve};

#[derive(PartialEq, Eq, Serialize, SerdeBase16Serialize)]
#[repr(transparent)]
/// Message to be encrypted. This is a simple wrapper around a group element,
/// but we use it for added type safety.
pub struct Message<C: Curve> {
    pub value: C,
}

impl<C: Curve> Debug for Message<C> {
    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
        f.write_str("<Message>")
    }
}

impl<C: Curve> Message<C> {
    // generate random message (for testing)
    pub fn generate<T>(csprng: &mut T) -> Self
    where
        T: Rng,
    {
        Message {
            value: C::generate(csprng),
        }
    }
}

#[cfg(test)]
mod tests {
    use ark_bls12_381::{G1Projective, G2Projective};

    use crate::curve_arithmetic::arkworks_instances::ArkGroup;

    use super::*;

    fn test_message_serialization_helper<C: Curve>() {
        let mut csprng = thread_rng();
        for _i in 1..100 {
            let m: Message<C> = Message::generate(&mut csprng);
            let s = serialize_deserialize(&m);
            assert!(s.is_ok());
            assert_eq!(m, s.unwrap());
        }
    }

    #[test]
    pub fn message_to_byte_conversion_g1() {
        test_message_serialization_helper::<ArkGroup<G1Projective>>();
    }
    #[test]
    pub fn message_to_byte_conversion_g2() {
        test_message_serialization_helper::<ArkGroup<G2Projective>>();
    }
}