/jormungandr-lib/src/crypto/serde.rs

https://github.com/input-output-hk/jormungandr · Rust · 315 lines · 290 code · 25 blank · 0 comment · 26 complexity · fef2424d01da46e5c969e960e4776b5e MD5 · raw file

  1. use chain_crypto::bech32::Bech32;
  2. use chain_crypto::{
  3. AsymmetricKey, AsymmetricPublicKey, Blake2b256, PublicKey, SecretKey, Signature,
  4. VerificationAlgorithm,
  5. };
  6. use serde::{
  7. de::{Deserializer, Error as DeserializerError, Visitor},
  8. ser::Serializer,
  9. Serialize,
  10. };
  11. use std::fmt;
  12. use std::str::FromStr;
  13. pub fn serialize_secret<S, A>(key: &SecretKey<A>, serializer: S) -> Result<S::Ok, S::Error>
  14. where
  15. S: Serializer,
  16. A: AsymmetricKey,
  17. {
  18. if serializer.is_human_readable() {
  19. key.to_bech32_str().serialize(serializer)
  20. } else {
  21. panic!("binary encoding for serialization of the secret key does not exist in chain-crypto")
  22. }
  23. }
  24. pub fn serialize_public<S, A>(key: &PublicKey<A>, serializer: S) -> Result<S::Ok, S::Error>
  25. where
  26. S: Serializer,
  27. A: AsymmetricPublicKey,
  28. {
  29. if serializer.is_human_readable() {
  30. key.to_bech32_str().serialize(serializer)
  31. } else {
  32. key.as_ref().serialize(serializer)
  33. }
  34. }
  35. pub fn serialize_signature<S, T, A>(
  36. signature: &Signature<T, A>,
  37. serializer: S,
  38. ) -> Result<S::Ok, S::Error>
  39. where
  40. S: Serializer,
  41. A: VerificationAlgorithm,
  42. {
  43. if serializer.is_human_readable() {
  44. signature.to_bech32_str().serialize(serializer)
  45. } else {
  46. signature.as_ref().serialize(serializer)
  47. }
  48. }
  49. pub fn serialize_hash<S>(hash: &Blake2b256, serializer: S) -> Result<S::Ok, S::Error>
  50. where
  51. S: Serializer,
  52. {
  53. if serializer.is_human_readable() {
  54. hash.to_string().serialize(serializer)
  55. } else {
  56. hash.as_ref().serialize(serializer)
  57. }
  58. }
  59. pub fn deserialize_secret<'de, D, A>(deserializer: D) -> Result<SecretKey<A>, D::Error>
  60. where
  61. D: Deserializer<'de>,
  62. A: AsymmetricKey,
  63. {
  64. let secret_key_visitor = SecretKeyVisitor::new();
  65. if deserializer.is_human_readable() {
  66. deserializer.deserialize_str(secret_key_visitor)
  67. } else {
  68. deserializer.deserialize_bytes(secret_key_visitor)
  69. }
  70. }
  71. pub fn deserialize_public<'de, D, A>(deserializer: D) -> Result<PublicKey<A>, D::Error>
  72. where
  73. D: Deserializer<'de>,
  74. A: AsymmetricPublicKey,
  75. {
  76. let public_key_visitor = PublicKeyVisitor::new();
  77. if deserializer.is_human_readable() {
  78. deserializer.deserialize_str(public_key_visitor)
  79. } else {
  80. deserializer.deserialize_bytes(public_key_visitor)
  81. }
  82. }
  83. pub fn deserialize_signature<'de, D, T, A>(deserializer: D) -> Result<Signature<T, A>, D::Error>
  84. where
  85. D: Deserializer<'de>,
  86. A: VerificationAlgorithm,
  87. {
  88. let signature_visitor = SignatureVisitor::new();
  89. if deserializer.is_human_readable() {
  90. deserializer.deserialize_str(signature_visitor)
  91. } else {
  92. deserializer.deserialize_bytes(signature_visitor)
  93. }
  94. }
  95. pub fn deserialize_hash<'de, D>(deserializer: D) -> Result<Blake2b256, D::Error>
  96. where
  97. D: Deserializer<'de>,
  98. {
  99. let hash_visitor = HashVisitor::new();
  100. if deserializer.is_human_readable() {
  101. deserializer.deserialize_str(hash_visitor)
  102. } else {
  103. deserializer.deserialize_bytes(hash_visitor)
  104. }
  105. }
  106. struct HashVisitor;
  107. struct SecretKeyVisitor<A: AsymmetricKey> {
  108. _marker: std::marker::PhantomData<A>,
  109. }
  110. struct PublicKeyVisitor<A: AsymmetricPublicKey> {
  111. _marker: std::marker::PhantomData<A>,
  112. }
  113. struct SignatureVisitor<T, A: VerificationAlgorithm> {
  114. _marker_1: std::marker::PhantomData<T>,
  115. _marker_2: std::marker::PhantomData<A>,
  116. }
  117. impl HashVisitor {
  118. fn new() -> Self {
  119. HashVisitor
  120. }
  121. }
  122. impl<A: AsymmetricKey> SecretKeyVisitor<A> {
  123. fn new() -> Self {
  124. SecretKeyVisitor {
  125. _marker: std::marker::PhantomData,
  126. }
  127. }
  128. }
  129. impl<A: AsymmetricPublicKey> PublicKeyVisitor<A> {
  130. fn new() -> Self {
  131. PublicKeyVisitor {
  132. _marker: std::marker::PhantomData,
  133. }
  134. }
  135. }
  136. impl<T, A: VerificationAlgorithm> SignatureVisitor<T, A> {
  137. fn new() -> Self {
  138. SignatureVisitor {
  139. _marker_1: std::marker::PhantomData,
  140. _marker_2: std::marker::PhantomData,
  141. }
  142. }
  143. }
  144. impl<'de, A> Visitor<'de> for SecretKeyVisitor<A>
  145. where
  146. A: AsymmetricKey,
  147. {
  148. type Value = SecretKey<A>;
  149. fn expecting(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
  150. write!(
  151. fmt,
  152. "Expecting a secret key for algorithm {}",
  153. A::SECRET_BECH32_HRP
  154. )
  155. }
  156. fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
  157. where
  158. E: DeserializerError,
  159. {
  160. use chain_crypto::bech32::Error as Bech32Error;
  161. match Self::Value::try_from_bech32_str(&v) {
  162. Err(Bech32Error::DataInvalid(err)) => Err(E::custom(format!("Invalid data: {}", err))),
  163. Err(Bech32Error::HrpInvalid { expected, actual }) => Err(E::custom(format!(
  164. "Invalid prefix: expected {} but was {}",
  165. expected, actual
  166. ))),
  167. Err(Bech32Error::Bech32Malformed(err)) => {
  168. Err(E::custom(format!("Invalid bech32: {}", err)))
  169. }
  170. Ok(key) => Ok(key),
  171. }
  172. }
  173. fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
  174. where
  175. E: DeserializerError,
  176. {
  177. use chain_crypto::SecretKeyError;
  178. match Self::Value::from_binary(v) {
  179. Err(SecretKeyError::SizeInvalid) => Err(E::custom("Invalid size")),
  180. Err(SecretKeyError::StructureInvalid) => Err(E::custom("Invalid structure")),
  181. Ok(key) => Ok(key),
  182. }
  183. }
  184. }
  185. impl<'de, A> Visitor<'de> for PublicKeyVisitor<A>
  186. where
  187. A: AsymmetricPublicKey,
  188. {
  189. type Value = PublicKey<A>;
  190. fn expecting(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
  191. write!(
  192. fmt,
  193. "Expecting a public key for algorithm {}",
  194. A::PUBLIC_BECH32_HRP
  195. )
  196. }
  197. fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
  198. where
  199. E: DeserializerError,
  200. {
  201. use chain_crypto::bech32::Error as Bech32Error;
  202. match Self::Value::try_from_bech32_str(&v) {
  203. Err(Bech32Error::DataInvalid(err)) => Err(E::custom(format!("Invalid data: {}", err))),
  204. Err(Bech32Error::HrpInvalid { expected, actual }) => Err(E::custom(format!(
  205. "Invalid prefix: expected {} but was {}",
  206. expected, actual
  207. ))),
  208. Err(Bech32Error::Bech32Malformed(err)) => {
  209. Err(E::custom(format!("Invalid bech32: {}", err)))
  210. }
  211. Ok(key) => Ok(key),
  212. }
  213. }
  214. fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
  215. where
  216. E: DeserializerError,
  217. {
  218. use chain_crypto::PublicKeyError;
  219. match Self::Value::from_binary(v) {
  220. Err(PublicKeyError::SizeInvalid) => Err(E::custom(format!(
  221. "Invalid size (expected: {}bytes)",
  222. A::PUBLIC_KEY_SIZE
  223. ))),
  224. Err(PublicKeyError::StructureInvalid) => Err(E::custom("Invalid structure")),
  225. Ok(key) => Ok(key),
  226. }
  227. }
  228. }
  229. impl<'de, T, A> Visitor<'de> for SignatureVisitor<T, A>
  230. where
  231. A: VerificationAlgorithm,
  232. {
  233. type Value = Signature<T, A>;
  234. fn expecting(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
  235. write!(
  236. fmt,
  237. "Expecting a signature for algorithm {}",
  238. A::SIGNATURE_BECH32_HRP
  239. )
  240. }
  241. fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
  242. where
  243. E: DeserializerError,
  244. {
  245. use chain_crypto::bech32::Error as Bech32Error;
  246. match Self::Value::try_from_bech32_str(&v) {
  247. Err(Bech32Error::DataInvalid(err)) => Err(E::custom(format!("Invalid data: {}", err))),
  248. Err(Bech32Error::HrpInvalid { expected, actual }) => Err(E::custom(format!(
  249. "Invalid prefix: expected {} but was {}",
  250. expected, actual
  251. ))),
  252. Err(Bech32Error::Bech32Malformed(err)) => {
  253. Err(E::custom(format!("Invalid bech32: {}", err)))
  254. }
  255. Ok(key) => Ok(key),
  256. }
  257. }
  258. fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
  259. where
  260. E: DeserializerError,
  261. {
  262. use chain_crypto::SignatureError;
  263. match Self::Value::from_binary(v) {
  264. Err(SignatureError::SizeInvalid { expected, got }) => Err(E::custom(format!(
  265. "Invalid size (expected: {}bytes but received {}bytes)",
  266. expected, got,
  267. ))),
  268. Err(SignatureError::StructureInvalid) => Err(E::custom("Invalid structure")),
  269. Ok(key) => Ok(key),
  270. }
  271. }
  272. }
  273. impl<'de> Visitor<'de> for HashVisitor {
  274. type Value = Blake2b256;
  275. fn expecting(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
  276. write!(fmt, "Expecting a Blake2b256 Hash",)
  277. }
  278. fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
  279. where
  280. E: DeserializerError,
  281. {
  282. Blake2b256::from_str(v).map_err(E::custom)
  283. }
  284. fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
  285. where
  286. E: DeserializerError,
  287. {
  288. Blake2b256::try_from_slice(v).map_err(E::custom)
  289. }
  290. }