1#![no_std]
18#![warn(unused, future_incompatible, nonstandard_style, rust_2018_idioms, rust_2021_compatibility)]
19#![deny(unsafe_code)]
20
21extern crate alloc;
22
23pub mod block_ciphers;
24pub mod engines;
25pub mod ibe;
26pub mod tlock;
27use crate::engines::EngineBLS;
28
29const HASH_LENGTH: usize = 32;
31type Hash = [u8; HASH_LENGTH];
32const MESSAGE_SIZE: usize = 32;
38
39pub type MessageDigest = [u8; MESSAGE_SIZE];
40#[derive(Debug, Clone, Hash, PartialEq, Eq, PartialOrd, Ord)]
43pub struct Message(pub MessageDigest, pub alloc::vec::Vec<u8>);
44
45impl Message {
46 pub fn new(context: &[u8], message: &[u8]) -> Message {
47 use sha3::{
48 digest::{ExtendableOutput, Update, XofReader},
49 Shake128,
50 };
51 let mut h = Shake128::default();
52 h.update(context);
53 let l = message.len() as u64;
54 h.update(&l.to_le_bytes());
55 h.update(message);
56 let mut msg = [0u8; MESSAGE_SIZE];
57 h.finalize_xof().read(&mut msg[..]);
58 Message(msg, [context, message].concat())
59 }
60
61 pub fn hash_to_signature_curve<E: EngineBLS>(&self) -> E::SignatureGroup {
62 E::hash_to_signature_curve(&self.1[..])
63 }
64}
65
66impl From<&[u8]> for Message {
67 fn from(x: &[u8]) -> Message {
68 Message::new(b"", x)
69 }
70}