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
use secp256kfun::{marker::*, Point, Scalar};
#[derive(Clone, Debug, PartialEq)]
#[cfg_attr(
feature = "serde",
derive(serde::Deserialize, serde::Serialize),
serde(crate = "serde_crate")
)]
pub struct EncryptedSignature<S = Public> {
pub R: Point<EvenY, Public>,
pub s_hat: Scalar<S, Zero>,
pub needs_negation: bool,
}
impl<OldSec> EncryptedSignature<OldSec> {
#[must_use]
pub fn mark<NewSec: Secrecy>(self) -> EncryptedSignature<NewSec> {
EncryptedSignature {
R: self.R,
s_hat: self.s_hat.mark::<NewSec>(),
needs_negation: self.needs_negation,
}
}
}
#[cfg(test)]
mod test {
#[cfg(feature = "serde")]
#[test]
fn encrypted_signature_serialization_roundtrip() {
use super::*;
use crate::{adaptor::*, fun::Scalar};
let schnorr = crate::test_instance!();
let kp = schnorr.new_keypair(Scalar::random(&mut rand::thread_rng()));
let encryption_key = Point::random(&mut rand::thread_rng());
let encrypted_signature =
schnorr.encrypted_sign(&kp, &encryption_key, b"test".as_ref().mark::<Public>());
let serialized = bincode::serialize(&encrypted_signature).unwrap();
assert_eq!(serialized.len(), 65);
let deserialized = bincode::deserialize::<EncryptedSignature>(&serialized).unwrap();
assert_eq!(encrypted_signature, deserialized);
}
}