1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
use elliptic_curve::FromBytes;
use ergotree_ir::sigma_protocol::dlog_group;
use ergotree_ir::sigma_protocol::sigma_boolean::ProveDlog;
use k256::Scalar;
use crate::util::IntoOption;
#[derive(PartialEq, Debug, Clone)]
pub struct DlogProverInput {
pub w: Scalar,
}
impl DlogProverInput {
pub const SIZE_BYTES: usize = 32;
pub fn random() -> DlogProverInput {
DlogProverInput {
w: dlog_group::random_scalar_in_group_range(),
}
}
pub fn from_bytes(bytes: &[u8; DlogProverInput::SIZE_BYTES]) -> Option<DlogProverInput> {
Scalar::from_bytes(bytes.into())
.into_option()
.map(DlogProverInput::from)
}
pub fn to_bytes(&self) -> [u8; DlogProverInput::SIZE_BYTES] {
self.w.to_bytes().into()
}
pub fn public_image(&self) -> ProveDlog {
let g = dlog_group::generator();
ProveDlog::new(dlog_group::exponentiate(&g, &self.w))
}
}
impl From<Scalar> for DlogProverInput {
fn from(w: Scalar) -> Self {
DlogProverInput { w }
}
}
pub enum PrivateInput {
DlogProverInput(DlogProverInput),
DiffieHellmanTupleProverInput,
}
#[cfg(feature = "arbitrary")]
mod arbitrary {
use super::*;
use proptest::prelude::*;
impl Arbitrary for DlogProverInput {
type Parameters = ();
type Strategy = BoxedStrategy<Self>;
fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy {
prop_oneof![Just(DlogProverInput::random()),].boxed()
}
}
}
#[cfg(test)]
#[cfg(feature = "arbitrary")]
mod tests {}