lit_node_core/traits/encoding/
decaf377.rs

1use super::{BeBytes, CompressedBytes, LeBytes};
2use lit_rust_crypto::{decaf377, ff::PrimeField, group::GroupEncoding};
3
4// NOTE: There is no difference between compressed and uncompressed points for
5// this curve
6
7impl CompressedBytes for decaf377::Element {
8    fn to_compressed(&self) -> Vec<u8> {
9        self.to_bytes().to_vec()
10    }
11
12    fn from_compressed(bytes: &[u8]) -> Option<Self> {
13        let mut repr = <decaf377::Element as GroupEncoding>::Repr::default();
14        if bytes.len() != repr.len() {
15            return None;
16        }
17        repr.copy_from_slice(bytes);
18        Option::from(Self::from_bytes(&repr))
19    }
20}
21
22impl BeBytes for decaf377::Fr {
23    fn to_be_bytes(&self) -> Vec<u8> {
24        let mut bytes = self.to_bytes();
25        bytes.reverse();
26        bytes.to_vec()
27    }
28
29    fn from_be_bytes(bytes: &[u8]) -> Option<Self> {
30        let mut bytes = bytes.to_vec();
31        bytes.reverse();
32        let mut repr = <decaf377::Fr as PrimeField>::Repr::default();
33        repr.copy_from_slice(bytes.as_slice());
34        Option::from(Self::from_repr(repr))
35    }
36}
37
38impl LeBytes for decaf377::Fr {
39    fn to_le_bytes(&self) -> Vec<u8> {
40        self.to_bytes().to_vec()
41    }
42
43    fn from_le_bytes(bytes: &[u8]) -> Option<Self> {
44        let mut repr = <decaf377::Fr as PrimeField>::Repr::default();
45        repr.copy_from_slice(bytes);
46        Option::from(Self::from_repr(repr))
47    }
48}
49
50impl CompressedBytes for decaf377::Fr {
51    fn to_compressed(&self) -> Vec<u8> {
52        self.to_bytes().to_vec()
53    }
54
55    fn from_compressed(bytes: &[u8]) -> Option<Self> {
56        let mut repr = <decaf377::Fr as PrimeField>::Repr::default();
57        repr.copy_from_slice(bytes);
58        Option::from(Self::from_repr(repr))
59    }
60}