util.rs 1.1 KB

1234567891011121314151617181920212223242526272829303132333435
  1. use blake2b_simd::Params;
  2. use pasta_curves as pasta;
  3. use pasta_curves::{
  4. arithmetic::{CurveExt, FieldExt},
  5. group::ff::PrimeField,
  6. };
  7. use super::constants::fixed_bases::{
  8. VALUE_COMMITMENT_PERSONALIZATION, VALUE_COMMITMENT_R_BYTES, VALUE_COMMITMENT_V_BYTES,
  9. };
  10. pub fn hash_to_scalar(persona: &[u8], a: &[u8], b: &[u8]) -> pasta::Fq {
  11. let mut hasher = Params::new().hash_length(64).personal(persona).to_state();
  12. hasher.update(a);
  13. hasher.update(b);
  14. let ret = hasher.finalize();
  15. pasta::Fq::from_bytes_wide(ret.as_array())
  16. }
  17. #[allow(non_snake_case)]
  18. pub fn pedersen_commitment_scalar(value: pasta::Fq, blind: pasta::Fq) -> pasta::Ep {
  19. let hasher = pasta::Ep::hash_to_curve(VALUE_COMMITMENT_PERSONALIZATION);
  20. let V = hasher(&VALUE_COMMITMENT_V_BYTES);
  21. let R = hasher(&VALUE_COMMITMENT_R_BYTES);
  22. V * value + R * blind
  23. }
  24. pub fn pedersen_commitment_u64(value: u64, blind: pasta::Fq) -> pasta::Ep {
  25. pedersen_commitment_scalar(pasta::Fq::from_u64(value), blind)
  26. }
  27. pub fn mod_r_p(x: pasta::Fp) -> pasta::Fq {
  28. pasta::Fq::from_repr(x.to_repr()).unwrap()
  29. }