util.rs 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. use blake2b_simd::Params;
  2. use pasta_curves::{
  3. arithmetic::{CurveExt, FieldExt},
  4. group::ff::PrimeField,
  5. pallas,
  6. };
  7. use super::constants::fixed_bases::{
  8. VALUE_COMMITMENT_PERSONALIZATION, VALUE_COMMITMENT_R_BYTES, VALUE_COMMITMENT_V_BYTES,
  9. };
  10. use crate::crypto::{constants::util::gen_const_array, types::*};
  11. pub fn hash_to_scalar(persona: &[u8], a: &[u8], b: &[u8]) -> pallas::Scalar {
  12. let mut hasher = Params::new().hash_length(64).personal(persona).to_state();
  13. hasher.update(a);
  14. hasher.update(b);
  15. let ret = hasher.finalize();
  16. pallas::Scalar::from_bytes_wide(ret.as_array())
  17. }
  18. #[allow(non_snake_case)]
  19. pub fn pedersen_commitment_scalar(value: pallas::Scalar, blind: DrkValueBlind) -> DrkValueCommit {
  20. let hasher = DrkValueCommit::hash_to_curve(VALUE_COMMITMENT_PERSONALIZATION);
  21. let V = hasher(&VALUE_COMMITMENT_V_BYTES);
  22. let R = hasher(&VALUE_COMMITMENT_R_BYTES);
  23. V * value + R * blind
  24. }
  25. pub fn pedersen_commitment_u64(value: u64, blind: DrkValueBlind) -> DrkValueCommit {
  26. pedersen_commitment_scalar(mod_r_p(DrkValue::from(value)), blind)
  27. }
  28. /// Converts from pallas::Base to pallas::Scalar (aka $x \pmod{r_\mathbb{P}}$).
  29. ///
  30. /// This requires no modular reduction because Pallas' base field is smaller than its
  31. /// scalar field.
  32. pub fn mod_r_p(x: pallas::Base) -> pallas::Scalar {
  33. pallas::Scalar::from_repr(x.to_repr()).unwrap()
  34. }
  35. /// The sequence of bits representing a u64 in little-endian order.
  36. ///
  37. /// # Panics
  38. ///
  39. /// Panics if the expected length of the sequence `NUM_BITS` exceeds
  40. /// 64.
  41. pub fn i2lebsp<const NUM_BITS: usize>(int: u64) -> [bool; NUM_BITS] {
  42. assert!(NUM_BITS <= 64);
  43. gen_const_array(|mask: usize| (int & (1 << mask)) != 0)
  44. }