snarkvm_console_account/compute_key/
try_from.rs1use super::*;
17
18#[cfg(feature = "private_key")]
19impl<N: Network> TryFrom<PrivateKey<N>> for ComputeKey<N> {
20 type Error = Error;
21
22 fn try_from(private_key: PrivateKey<N>) -> Result<Self, Self::Error> {
24 Self::try_from(&private_key)
25 }
26}
27
28#[cfg(feature = "private_key")]
29impl<N: Network> TryFrom<&PrivateKey<N>> for ComputeKey<N> {
30 type Error = Error;
31
32 fn try_from(private_key: &PrivateKey<N>) -> Result<Self, Self::Error> {
34 let pk_sig = N::g_scalar_multiply(&private_key.sk_sig());
36 let pr_sig = N::g_scalar_multiply(&private_key.r_sig());
38 Self::try_from((pk_sig, pr_sig))
40 }
41}
42
43impl<N: Network> TryFrom<(Group<N>, Group<N>)> for ComputeKey<N> {
44 type Error = Error;
45
46 fn try_from((pk_sig, pr_sig): (Group<N>, Group<N>)) -> Result<Self> {
48 let sk_prf = N::hash_to_scalar_psd4(&[pk_sig.to_x_coordinate(), pr_sig.to_x_coordinate()])?;
50 Ok(Self { pk_sig, pr_sig, sk_prf })
52 }
53}
54
55impl<N: Network> TryFrom<&(Group<N>, Group<N>)> for ComputeKey<N> {
56 type Error = Error;
57
58 fn try_from((pk_sig, pr_sig): &(Group<N>, Group<N>)) -> Result<Self> {
60 Self::try_from((*pk_sig, *pr_sig))
61 }
62}
63
64#[cfg(test)]
65mod tests {
66 use super::*;
67 use snarkvm_console_network::MainnetV0;
68
69 type CurrentNetwork = MainnetV0;
70
71 const ITERATIONS: u64 = 1000;
72
73 #[test]
74 fn test_try_from() -> Result<()> {
75 let mut rng = TestRng::default();
76
77 for _ in 0..ITERATIONS {
78 let private_key = PrivateKey::<CurrentNetwork>::new(&mut rng)?;
80 let candidate = ComputeKey::try_from(private_key)?;
81
82 let candidate_sk_prf = CurrentNetwork::hash_to_scalar_psd4(&[
85 candidate.pk_sig().to_x_coordinate(),
86 candidate.pr_sig().to_x_coordinate(),
87 ])?;
88 assert_eq!(candidate.sk_prf(), candidate_sk_prf);
89
90 assert_eq!(candidate, ComputeKey::try_from((candidate.pk_sig(), candidate.pr_sig()))?);
92 }
93 Ok(())
94 }
95}