keypair.rs 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. use std::{convert::TryFrom, io, str::FromStr};
  2. use halo2_gadgets::ecc::chip::FixedPoint;
  3. use pasta_curves::{
  4. group::{
  5. ff::{Field, PrimeField},
  6. Group, GroupEncoding,
  7. },
  8. pallas,
  9. };
  10. use rand::RngCore;
  11. use crate::{
  12. crypto::{address::Address, constants::NullifierK, util::mod_r_p},
  13. util::serial::{Decodable, Encodable, ReadExt, SerialDecodable, SerialEncodable, WriteExt},
  14. Error, Result,
  15. };
  16. #[derive(Copy, Clone, PartialEq, Debug)]
  17. #[cfg(feature = "serde")]
  18. #[derive(serde::Deserialize, serde::Serialize)]
  19. pub struct Keypair {
  20. pub secret: SecretKey,
  21. pub public: PublicKey,
  22. }
  23. impl Keypair {
  24. pub fn new(secret: SecretKey) -> Self {
  25. let public = PublicKey::from_secret(secret);
  26. Self { secret, public }
  27. }
  28. pub fn random(mut rng: impl RngCore) -> Self {
  29. let secret = SecretKey::random(&mut rng);
  30. Self::new(secret)
  31. }
  32. }
  33. #[derive(Copy, Clone, PartialEq, Debug, SerialDecodable, SerialEncodable)]
  34. pub struct SecretKey(pub pallas::Base);
  35. impl SecretKey {
  36. pub fn random(mut rng: impl RngCore) -> Self {
  37. let x = pallas::Base::random(&mut rng);
  38. Self(x)
  39. }
  40. pub fn to_bytes(self) -> [u8; 32] {
  41. self.0.to_repr()
  42. }
  43. pub fn from_bytes(bytes: [u8; 32]) -> Result<Self> {
  44. match pallas::Base::from_repr(bytes).into() {
  45. Some(k) => Ok(Self(k)),
  46. None => Err(Error::SecretKeyFromBytes),
  47. }
  48. }
  49. }
  50. #[derive(Copy, Clone, PartialEq, Debug, SerialDecodable, SerialEncodable)]
  51. pub struct PublicKey(pub pallas::Point);
  52. impl PublicKey {
  53. pub fn random(mut rng: impl RngCore) -> Self {
  54. let p = pallas::Point::random(&mut rng);
  55. Self(p)
  56. }
  57. pub fn from_secret(s: SecretKey) -> Self {
  58. let nfk = NullifierK;
  59. let p = nfk.generator() * mod_r_p(s.0);
  60. Self(p)
  61. }
  62. pub fn to_bytes(self) -> [u8; 32] {
  63. self.0.to_bytes()
  64. }
  65. pub fn from_bytes(bytes: &[u8; 32]) -> Result<Self> {
  66. match pallas::Point::from_bytes(bytes).into() {
  67. Some(k) => Ok(Self(k)),
  68. None => Err(Error::PublicKeyFromBytes),
  69. }
  70. }
  71. }
  72. impl FromStr for PublicKey {
  73. type Err = crate::Error;
  74. /// Tries to create a `PublicKey` instance from a base58 encoded string.
  75. fn from_str(encoded: &str) -> std::result::Result<Self, crate::Error> {
  76. let decoded = bs58::decode(encoded).into_vec()?;
  77. if decoded.len() != 32 {
  78. return Err(Error::PublicKeyFromStr)
  79. }
  80. Self::from_bytes(&decoded.try_into().unwrap())
  81. }
  82. }
  83. impl TryFrom<Address> for PublicKey {
  84. type Error = Error;
  85. fn try_from(address: Address) -> Result<Self> {
  86. let mut bytes = [0u8; 32];
  87. bytes.copy_from_slice(&address.0[1..33]);
  88. Self::from_bytes(&bytes)
  89. }
  90. }
  91. impl Encodable for pallas::Base {
  92. fn encode<S: io::Write>(&self, mut s: S) -> Result<usize> {
  93. s.write_slice(&self.to_repr()[..])?;
  94. Ok(32)
  95. }
  96. }
  97. impl Decodable for pallas::Base {
  98. fn decode<D: io::Read>(mut d: D) -> Result<Self> {
  99. let mut bytes = [0u8; 32];
  100. d.read_slice(&mut bytes)?;
  101. let result = pallas::Base::from_repr(bytes);
  102. if result.is_some().into() {
  103. Ok(result.unwrap())
  104. } else {
  105. Err(Error::BadOperationType)
  106. }
  107. }
  108. }
  109. impl Encodable for pallas::Scalar {
  110. fn encode<S: io::Write>(&self, mut s: S) -> Result<usize> {
  111. s.write_slice(&self.to_repr()[..])?;
  112. Ok(32)
  113. }
  114. }
  115. impl Decodable for pallas::Scalar {
  116. fn decode<D: io::Read>(mut d: D) -> Result<Self> {
  117. let mut bytes = [0u8; 32];
  118. d.read_slice(&mut bytes)?;
  119. let result = pallas::Scalar::from_repr(bytes);
  120. if result.is_some().into() {
  121. Ok(result.unwrap())
  122. } else {
  123. Err(Error::BadOperationType)
  124. }
  125. }
  126. }
  127. impl Encodable for pallas::Point {
  128. fn encode<S: io::Write>(&self, mut s: S) -> Result<usize> {
  129. s.write_slice(&self.to_bytes()[..])?;
  130. Ok(32)
  131. }
  132. }
  133. impl Decodable for pallas::Point {
  134. fn decode<D: io::Read>(mut d: D) -> Result<Self> {
  135. let mut bytes = [0u8; 32];
  136. d.read_slice(&mut bytes)?;
  137. let result = Self::from_bytes(&bytes);
  138. if result.is_some().into() {
  139. Ok(result.unwrap())
  140. } else {
  141. Err(Error::BadOperationType)
  142. }
  143. }
  144. }
  145. #[cfg(feature = "serde")]
  146. impl serde::Serialize for SecretKey {
  147. fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
  148. where
  149. S: serde::Serializer,
  150. {
  151. let mut bytes = vec![];
  152. self.encode(&mut bytes).unwrap();
  153. let hex_repr = hex::encode(&bytes);
  154. serializer.serialize_str(&hex_repr)
  155. }
  156. }
  157. #[cfg(feature = "serde")]
  158. struct SecretKeyVisitor;
  159. #[cfg(feature = "serde")]
  160. impl<'de> serde::de::Visitor<'de> for SecretKeyVisitor {
  161. type Value = SecretKey;
  162. fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
  163. formatter.write_str("hex string")
  164. }
  165. fn visit_str<E>(self, value: &str) -> std::result::Result<SecretKey, E>
  166. where
  167. E: serde::de::Error,
  168. {
  169. let bytes = hex::decode(value).unwrap();
  170. let mut r = std::io::Cursor::new(bytes);
  171. let decoded: SecretKey = SecretKey::decode(&mut r).unwrap();
  172. Ok(decoded)
  173. }
  174. }
  175. #[cfg(feature = "serde")]
  176. impl<'de> serde::Deserialize<'de> for SecretKey {
  177. fn deserialize<D>(deserializer: D) -> std::result::Result<SecretKey, D::Error>
  178. where
  179. D: serde::Deserializer<'de>,
  180. {
  181. let bytes = deserializer.deserialize_str(SecretKeyVisitor).unwrap();
  182. Ok(bytes)
  183. }
  184. }
  185. #[cfg(feature = "serde")]
  186. impl serde::Serialize for PublicKey {
  187. fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
  188. where
  189. S: serde::Serializer,
  190. {
  191. let mut bytes = vec![];
  192. self.encode(&mut bytes).unwrap();
  193. let hex_repr = hex::encode(&bytes);
  194. serializer.serialize_str(&hex_repr)
  195. }
  196. }
  197. #[cfg(feature = "serde")]
  198. struct PublicKeyVisitor;
  199. #[cfg(feature = "serde")]
  200. impl<'de> serde::de::Visitor<'de> for PublicKeyVisitor {
  201. type Value = PublicKey;
  202. fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
  203. formatter.write_str("hex string")
  204. }
  205. fn visit_str<E>(self, value: &str) -> std::result::Result<PublicKey, E>
  206. where
  207. E: serde::de::Error,
  208. {
  209. let bytes = hex::decode(value).unwrap();
  210. let mut r = std::io::Cursor::new(bytes);
  211. let decoded: PublicKey = PublicKey::decode(&mut r).unwrap();
  212. Ok(decoded)
  213. }
  214. }
  215. #[cfg(feature = "serde")]
  216. impl<'de> serde::Deserialize<'de> for PublicKey {
  217. fn deserialize<D>(deserializer: D) -> std::result::Result<PublicKey, D::Error>
  218. where
  219. D: serde::Deserializer<'de>,
  220. {
  221. let bytes = deserializer.deserialize_str(PublicKeyVisitor).unwrap();
  222. Ok(bytes)
  223. }
  224. }
  225. #[cfg(test)]
  226. mod tests {
  227. use super::*;
  228. use crate::{
  229. crypto::util::pedersen_commitment_scalar,
  230. util::serial::{deserialize, serialize},
  231. };
  232. #[test]
  233. fn test_pasta_serialization() -> Result<()> {
  234. let fifty_five = pallas::Base::from(55);
  235. let serialized = serialize(&fifty_five);
  236. assert_eq!(
  237. serialized,
  238. vec![
  239. 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  240. 0, 0, 0, 0, 0
  241. ]
  242. );
  243. assert_eq!(deserialize(&serialized).ok(), Some(fifty_five));
  244. let fourtwenty = pallas::Scalar::from(42069);
  245. let serialized = serialize(&fourtwenty);
  246. assert_eq!(
  247. serialized,
  248. vec![
  249. 85, 164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  250. 0, 0, 0, 0, 0
  251. ]
  252. );
  253. assert_eq!(deserialize(&serialized).ok(), Some(fourtwenty));
  254. let a = pallas::Scalar::from(420);
  255. let b = pallas::Scalar::from(69);
  256. let pc: pallas::Point = pedersen_commitment_scalar(a, b);
  257. let serialized = serialize(&pc);
  258. assert_eq!(
  259. serialized,
  260. vec![
  261. 55, 48, 126, 42, 114, 27, 18, 55, 155, 141, 83, 75, 44, 50, 244, 223, 254, 216, 22,
  262. 167, 208, 59, 212, 201, 150, 149, 96, 207, 216, 74, 60, 131
  263. ]
  264. );
  265. assert_eq!(deserialize(&serialized).ok(), Some(pc));
  266. Ok(())
  267. }
  268. }