nullifier.rs 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. use std::io;
  2. use pasta_curves::{group::ff::PrimeField, pallas};
  3. use crate::{
  4. crypto::{keypair::SecretKey, util::poseidon_hash},
  5. util::serial::{Decodable, Encodable, ReadExt, WriteExt},
  6. Result,
  7. };
  8. #[derive(Clone, Copy, Debug, PartialEq, Eq)]
  9. pub struct Nullifier(pub pallas::Base);
  10. impl Nullifier {
  11. pub fn new(secret: SecretKey, serial: pallas::Base) -> Self {
  12. let nullifier = poseidon_hash::<2>([secret.0, serial]);
  13. Nullifier(nullifier)
  14. }
  15. pub fn from_bytes(bytes: [u8; 32]) -> Self {
  16. pallas::Base::from_repr(bytes).map(Nullifier).unwrap()
  17. }
  18. pub fn to_bytes(self) -> [u8; 32] {
  19. self.0.to_repr()
  20. }
  21. pub(crate) fn inner(&self) -> pallas::Base {
  22. self.0
  23. }
  24. }
  25. impl Encodable for Nullifier {
  26. fn encode<S: io::Write>(&self, mut s: S) -> Result<usize> {
  27. s.write_slice(&self.to_bytes()[..])?;
  28. Ok(32)
  29. }
  30. }
  31. impl Decodable for Nullifier {
  32. fn decode<D: io::Read>(mut d: D) -> Result<Self> {
  33. let mut bytes = [0u8; 32];
  34. d.read_slice(&mut bytes)?;
  35. let result = Self::from_bytes(bytes);
  36. Ok(result)
  37. }
  38. }