schnorr.rs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. use halo2_gadgets::ecc::chip::FixedPoint;
  2. use pasta_curves::{
  3. group::{ff::Field, Group, GroupEncoding},
  4. pallas,
  5. };
  6. use rand::rngs::OsRng;
  7. use crate::{
  8. crypto::{
  9. constants::{NullifierK, DRK_SCHNORR_DOMAIN},
  10. keypair::{PublicKey, SecretKey},
  11. util::{hash_to_scalar, mod_r_p},
  12. },
  13. serial::{Decodable, Encodable, SerialDecodable, SerialEncodable},
  14. };
  15. #[derive(Debug, Clone, PartialEq, Eq, SerialEncodable, SerialDecodable)]
  16. pub struct Signature {
  17. commit: pallas::Point,
  18. response: pallas::Scalar,
  19. }
  20. impl Signature {
  21. pub fn dummy() -> Self {
  22. Self { commit: pallas::Point::identity(), response: pallas::Scalar::zero() }
  23. }
  24. }
  25. pub trait SchnorrSecret {
  26. fn sign(&self, message: &[u8]) -> Signature;
  27. }
  28. pub trait SchnorrPublic {
  29. fn verify(&self, message: &[u8], signature: &Signature) -> bool;
  30. }
  31. impl SchnorrSecret for SecretKey {
  32. fn sign(&self, message: &[u8]) -> Signature {
  33. let mask = pallas::Scalar::random(&mut OsRng);
  34. let commit = NullifierK.generator() * mask;
  35. let challenge = hash_to_scalar(DRK_SCHNORR_DOMAIN, &commit.to_bytes(), message);
  36. let response = mask + challenge * mod_r_p(self.0);
  37. Signature { commit, response }
  38. }
  39. }
  40. impl SchnorrPublic for PublicKey {
  41. fn verify(&self, message: &[u8], signature: &Signature) -> bool {
  42. let challenge = hash_to_scalar(DRK_SCHNORR_DOMAIN, &signature.commit.to_bytes(), message);
  43. NullifierK.generator() * signature.response - self.0 * challenge == signature.commit
  44. }
  45. }
  46. #[cfg(feature = "serde")]
  47. impl serde::Serialize for Signature {
  48. fn serialize<S>(&self, serializer: S) -> core::result::Result<S::Ok, S::Error>
  49. where
  50. S: serde::Serializer,
  51. {
  52. let mut bytes = vec![];
  53. self.encode(&mut bytes).unwrap();
  54. let hex_repr = hex::encode(&bytes);
  55. serializer.serialize_str(&hex_repr)
  56. }
  57. }
  58. #[cfg(feature = "serde")]
  59. struct SignatureVisitor;
  60. #[cfg(feature = "serde")]
  61. impl<'de> serde::de::Visitor<'de> for SignatureVisitor {
  62. type Value = Signature;
  63. fn expecting(&self, formatter: &mut core::fmt::Formatter) -> core::fmt::Result {
  64. formatter.write_str("hex string")
  65. }
  66. fn visit_str<E>(self, value: &str) -> core::result::Result<Signature, E>
  67. where
  68. E: serde::de::Error,
  69. {
  70. let bytes = hex::decode(value).unwrap();
  71. let mut r = std::io::Cursor::new(bytes);
  72. let decoded: Signature = Signature::decode(&mut r).unwrap();
  73. Ok(decoded)
  74. }
  75. }
  76. #[cfg(feature = "serde")]
  77. impl<'de> serde::Deserialize<'de> for Signature {
  78. fn deserialize<D>(deserializer: D) -> core::result::Result<Signature, D::Error>
  79. where
  80. D: serde::Deserializer<'de>,
  81. {
  82. let bytes = deserializer.deserialize_str(SignatureVisitor).unwrap();
  83. Ok(bytes)
  84. }
  85. }
  86. #[cfg(test)]
  87. mod tests {
  88. use super::*;
  89. use crate::serial::{deserialize, serialize};
  90. #[test]
  91. fn test_schnorr() {
  92. let secret = SecretKey::random(&mut OsRng);
  93. let message = b"Foo bar";
  94. let signature = secret.sign(&message[..]);
  95. let public = PublicKey::from_secret(secret);
  96. assert!(public.verify(&message[..], &signature));
  97. let ser = serialize(&signature);
  98. let de = deserialize(&ser).unwrap();
  99. assert!(public.verify(&message[..], &de));
  100. }
  101. }