nut01.rs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  1. //! Mint public key exchange
  2. // https://github.com/cashubtc/nuts/blob/main/01.md
  3. use std::collections::{BTreeMap, HashMap};
  4. use std::str::FromStr;
  5. use bip32::{DerivationPath, XPrv};
  6. use bip39::Mnemonic;
  7. use k256::elliptic_curve::generic_array::GenericArray;
  8. use k256::schnorr::{SigningKey, VerifyingKey};
  9. use serde::{Deserialize, Serialize};
  10. use super::{Id, KeySet};
  11. use crate::error::Error;
  12. use crate::Amount;
  13. #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
  14. #[serde(transparent)]
  15. pub struct PublicKey(#[serde(with = "crate::serde_utils::serde_public_key")] k256::PublicKey);
  16. impl From<PublicKey> for k256::PublicKey {
  17. fn from(value: PublicKey) -> k256::PublicKey {
  18. value.0
  19. }
  20. }
  21. impl From<&PublicKey> for k256::PublicKey {
  22. fn from(value: &PublicKey) -> k256::PublicKey {
  23. value.0
  24. }
  25. }
  26. impl From<k256::PublicKey> for PublicKey {
  27. fn from(value: k256::PublicKey) -> Self {
  28. Self(value)
  29. }
  30. }
  31. impl TryFrom<PublicKey> for VerifyingKey {
  32. type Error = Error;
  33. fn try_from(value: PublicKey) -> Result<VerifyingKey, Self::Error> {
  34. (&value).try_into()
  35. }
  36. }
  37. impl TryFrom<&PublicKey> for VerifyingKey {
  38. type Error = Error;
  39. fn try_from(value: &PublicKey) -> Result<VerifyingKey, Self::Error> {
  40. let bytes = value.0.to_sec1_bytes();
  41. let bytes = if bytes.len().eq(&33) {
  42. bytes.iter().skip(1).cloned().collect()
  43. } else {
  44. bytes.to_vec()
  45. };
  46. VerifyingKey::from_bytes(&bytes).map_err(|_| Error::Key)
  47. }
  48. }
  49. impl From<VerifyingKey> for PublicKey {
  50. fn from(value: VerifyingKey) -> PublicKey {
  51. PublicKey(value.try_into().unwrap())
  52. }
  53. }
  54. impl PublicKey {
  55. pub fn from_hex(hex: String) -> Result<Self, Error> {
  56. let hex = hex::decode(hex)?;
  57. Ok(PublicKey(k256::PublicKey::from_sec1_bytes(&hex)?))
  58. }
  59. pub fn to_hex(&self) -> String {
  60. let bytes = self.0.to_sec1_bytes();
  61. hex::encode(bytes)
  62. }
  63. pub fn to_bytes(&self) -> Box<[u8]> {
  64. self.0.to_sec1_bytes()
  65. }
  66. }
  67. impl FromStr for PublicKey {
  68. type Err = Error;
  69. fn from_str(hex: &str) -> Result<Self, Self::Err> {
  70. let hex = hex::decode(hex)?;
  71. Ok(PublicKey(k256::PublicKey::from_sec1_bytes(&hex)?))
  72. }
  73. }
  74. impl std::fmt::Display for PublicKey {
  75. fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
  76. f.write_str(&self.to_hex())
  77. }
  78. }
  79. #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
  80. #[serde(transparent)]
  81. pub struct SecretKey(#[serde(with = "crate::serde_utils::serde_secret_key")] k256::SecretKey);
  82. impl From<SecretKey> for k256::SecretKey {
  83. fn from(value: SecretKey) -> k256::SecretKey {
  84. value.0
  85. }
  86. }
  87. impl From<k256::SecretKey> for SecretKey {
  88. fn from(value: k256::SecretKey) -> Self {
  89. Self(value)
  90. }
  91. }
  92. impl TryFrom<SecretKey> for SigningKey {
  93. type Error = Error;
  94. fn try_from(value: SecretKey) -> Result<SigningKey, Self::Error> {
  95. Ok(value.0.into())
  96. }
  97. }
  98. impl SecretKey {
  99. pub fn to_hex(&self) -> String {
  100. let bytes = self.0.to_bytes();
  101. hex::encode(bytes)
  102. }
  103. pub fn from_hex(hex: &str) -> Result<Self, Error> {
  104. Ok(k256::SecretKey::from_bytes(GenericArray::from_slice(&hex::decode(hex)?))?.into())
  105. }
  106. pub fn public_key(&self) -> PublicKey {
  107. self.0.public_key().into()
  108. }
  109. // TODO: put behind feature
  110. pub fn from_seed(mnemonic: &Mnemonic, keyset_id: Id, counter: u64) -> Self {
  111. let path = DerivationPath::from_str(&format!(
  112. "m/129372'/0'/{}'/{}'/1",
  113. u64::from(keyset_id),
  114. counter
  115. ))
  116. .unwrap();
  117. let signing_key = XPrv::derive_from_path(mnemonic.to_seed(""), &path).unwrap();
  118. let private_key = signing_key.private_key();
  119. Self(private_key.into())
  120. }
  121. pub fn random() -> Self {
  122. let mut rng = rand::thread_rng();
  123. SecretKey(k256::SecretKey::random(&mut rng))
  124. }
  125. }
  126. /// Mint Keys [NUT-01]
  127. #[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
  128. pub struct Keys(BTreeMap<Amount, PublicKey>);
  129. impl From<mint::Keys> for Keys {
  130. fn from(keys: mint::Keys) -> Self {
  131. Self(
  132. keys.0
  133. .iter()
  134. .map(|(amount, keypair)| (*amount, keypair.public_key.clone()))
  135. .collect(),
  136. )
  137. }
  138. }
  139. impl Keys {
  140. pub fn new(keys: BTreeMap<Amount, PublicKey>) -> Self {
  141. Self(keys)
  142. }
  143. pub fn keys(&self) -> BTreeMap<Amount, PublicKey> {
  144. self.0.clone()
  145. }
  146. pub fn amount_key(&self, amount: Amount) -> Option<PublicKey> {
  147. self.0.get(&amount).cloned()
  148. }
  149. /// As serialized hashmap
  150. pub fn as_hashmap(&self) -> HashMap<Amount, String> {
  151. self.0
  152. .iter()
  153. .map(|(k, v)| (k.to_owned(), hex::encode(v.0.to_sec1_bytes())))
  154. .collect()
  155. }
  156. /// Iterate through the (`Amount`, `PublicKey`) entries in the Map
  157. pub fn iter(&self) -> impl Iterator<Item = (&Amount, &PublicKey)> {
  158. self.0.iter()
  159. }
  160. }
  161. /// Mint Public Keys [NUT-01]
  162. #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
  163. pub struct KeysResponse {
  164. pub keysets: Vec<KeySet>,
  165. }
  166. /*
  167. impl<'de> serde::de::Deserialize<'de> for KeysResponse {
  168. fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
  169. where
  170. D: serde::Deserializer<'de>,
  171. {
  172. struct KeysVisitor;
  173. impl<'de> serde::de::Visitor<'de> for KeysVisitor {
  174. type Value = KeysResponse;
  175. fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
  176. formatter.write_str("")
  177. }
  178. fn visit_map<M>(self, mut m: M) -> Result<Self::Value, M::Error>
  179. where
  180. M: serde::de::MapAccess<'de>,
  181. {
  182. let mut keys: BTreeMap<Amount, PublicKey> = BTreeMap::new();
  183. while let Some((a, k)) = m.next_entry::<String, String>()? {
  184. let amount = a.parse::<u64>();
  185. let pub_key = PublicKey::from_hex(k);
  186. if let (Ok(amount), Ok(pubkey)) = (amount, pub_key) {
  187. let amount = Amount::from(amount);
  188. keys.insert(amount, pubkey);
  189. }
  190. // TODO: Should return an error if an amount or key is
  191. // invalid and not continue
  192. }
  193. Ok(KeysResponse { keys: Keys(keys) })
  194. }
  195. }
  196. deserializer.deserialize_map(KeysVisitor)
  197. }
  198. }
  199. */
  200. pub mod mint {
  201. use std::collections::BTreeMap;
  202. use serde::{Deserialize, Serialize};
  203. use super::{PublicKey, SecretKey};
  204. use crate::Amount;
  205. #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
  206. pub struct Keys(pub BTreeMap<Amount, KeyPair>);
  207. #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
  208. pub struct KeyPair {
  209. pub public_key: PublicKey,
  210. pub secret_key: SecretKey,
  211. }
  212. impl KeyPair {
  213. pub fn from_secret_key(secret_key: SecretKey) -> Self {
  214. Self {
  215. public_key: secret_key.public_key(),
  216. secret_key,
  217. }
  218. }
  219. }
  220. }
  221. #[cfg(test)]
  222. mod tests {
  223. use super::*;
  224. #[test]
  225. fn pubkey() {
  226. let pubkey_str = "02c020067db727d586bc3183aecf97fcb800c3f4cc4759f69c626c9db5d8f5b5d4";
  227. let pubkey = PublicKey::from_hex(pubkey_str.to_string()).unwrap();
  228. assert_eq!(pubkey_str, pubkey.to_hex())
  229. }
  230. #[test]
  231. fn verying_key() {
  232. let key_str = "026562efcfadc8e86d44da6a8adf80633d974302e62c850774db1fb36ff4cc7198";
  233. let pubkey = PublicKey::from_str(key_str).unwrap();
  234. let v_key: VerifyingKey = pubkey.clone().try_into().unwrap();
  235. let p: PublicKey = v_key.try_into().unwrap();
  236. assert_eq!(p, pubkey);
  237. }
  238. #[test]
  239. fn key_response() {
  240. let res: String = r#"{"1":"02f71e2d93aa95fc52b938735a24774ad926406c81e9dc9d2aa699fb89281548fd","2":"03b28dd9c19aaf1ec847be31b60c6a5e1a6cb6f87434afcdb0d9348ba0e2bdb150","4":"03ede0e704e223e764a82f73984b0fec0fdbde15ef57b4de95b527f7182af7487e","8":"020fd24fbd552445df70c244be2af77da2b2f634ccfda9e9620b347b5cd50dbdd8","16":"03ef9ef2515df5c0d0851ed9419a24a571ef5e03206d9d2fc6572ac050c5afe1aa","32":"02dbd455474176b30234c178573e874cc79d0c2fc1920cf0e9f133204cf43299c1","64":"0237c1eb11b8a214cca3e0104684227952188039a05cd55c1ad3896a572c70a7c3","128":"02655041771766b94a269f9f1ec1860f2eade55bb472c4db74ac1257ef54aac52b","256":"02b9e0be7b423bded7d60ff7114549de8d2d5b9c099edf8887aff474037e4bc0cf","512":"0320454cc41e646f49e1ac0a62b9667c80dee45545b045575f2a26f01770dc2521","1024":"0267fc1dabac016f46b3d1a650d97b56f3e56540106720f3d24ff7a6e9cd7183e9","2048":"035a9a25251a4da56f49667ca50677470fc6d8e186a875ab7b32aa064eb9e9e948","4096":"02f607a9eed310825c2d2e66d6e64fb237fe21b640b9a66cc7646b2a6480d91457","8192":"033346f7dce2ef71a80c5d657a8930bdd19c7c1708d03829daf43f20eaeda76768","16384":"024fad3b0b60c6b71d848deac173183fae8ddde31bbde531f18ab23473ddff541d","32768":"020d195466819d96d8c7eee9150565b7bd37196c7d12d0e96e389f56be8aebb44b","65536":"038c9bf295a745726c38d14988851d68d201296a802c296faa838000c2f44d25e0","131072":"032ff6491cdeff0bf9b34acd5deceef3cca7682b5f94dbe3068af8bb3b5aa34b81","262144":"02570090f5b6900955fd794d8f22c23fb35fc87fa03069b9b16bea63ea7cda419a","524288":"029d3c751c7d1c3e1d3e4b7791e1e809f6dedf2c28e172a82967d49a14b7c26ce2","1048576":"03b4a41d39cc6f2a8925f694c514e107b87d7ddb8f5ac55c9e4b7895139d0decd8","2097152":"02d4abbce491f87656eb0d2e66ef18eb009f6320169ef12e66703298d5395f2b91","4194304":"0359023fb85f6e6ede0141ab8f4a1277c19ed62b49b8ef5c5e2c8ca7fefe9b2f91","8388608":"0353d3ae1dad05e1b46ab85a366bfcdb7a645e3457f7714003e0fb06f4d75f4d87","16777216":"032d0847606465b97f15aca30c69f5baeeb43bf6188b4679f723119ce6fb9708c5","33554432":"028a673a53e78aa8c992128e21efb3b33fbd54de20afcf81a67e69eaf2bab7e0e9","67108864":"0278b66e140559352bb5aeca854a6466bc439ee206a9f349ed7926aae4335269b7","134217728":"023834651da0737f484a77204c2d06543fb65ad2dd8d095a2be48ca12ebf2664ec","268435456":"032cba9068638965ccc3870c140c72a1b028a820851f36fe59639e7ab3093a8ffd","536870912":"03eae5e4b22dfa5ad77476c925717dc4e005da78142e75b47fb28569d745483af3","1073741824":"02d17d61027602432a8484b65e6d6063ed9157c51ce92099d61ac2820411c59f9f","2147483648":"0236870e39b3a739d5caa04988dce432e3d7988420f04d9b415125af22672e2726"}"#.to_string();
  241. let response: Keys = serde_json::from_str(&res).unwrap();
  242. assert_eq!(&serde_json::to_string(&response).unwrap(), &res)
  243. }
  244. #[test]
  245. fn test_ser_der_secret() {
  246. let secret = SecretKey::random();
  247. let json = serde_json::to_string(&secret).unwrap();
  248. let sec: SecretKey = serde_json::from_str(&json).unwrap();
  249. assert_eq!(sec, secret);
  250. }
  251. #[test]
  252. fn test_vectors_01() {
  253. let incorrect_1 = r#"{
  254. "1":"03a40f20667ed53513075dc51e715ff2046cad64eb68960632269ba7f0210e38","2":"03fd4ce5a16b65576145949e6f99f445f8249fee17c606b688b504a849cdc452de","4":"02648eccfa4c026960966276fa5a4cae46ce0fd432211a4f449bf84f13aa5f8303","8":"02fdfd6796bfeac490cbee12f778f867f0a2c68f6508d17c649759ea0dc3547528"
  255. }"#;
  256. let response: Result<Keys, serde_json::Error> = serde_json::from_str(incorrect_1);
  257. assert!(response.is_err());
  258. let incorrect_1 = r#"{
  259. "1":"03a40f20667ed53513075dc51e715ff2046cad64eb68960632269ba7f0210e38bc","2":"04fd4ce5a16b65576145949e6f99f445f8249fee17c606b688b504a849cdc452de3625246cb2c27dac965cb7200a5986467eee92eb7d496bbf1453b074e223e481","4":"02648eccfa4c026960966276fa5a4cae46ce0fd432211a4f449bf84f13aa5f8303","8":"02fdfd6796bfeac490cbee12f778f867f0a2c68f6508d17c649759ea0dc3547528"
  260. }"#;
  261. let response: Result<Keys, serde_json::Error> = serde_json::from_str(incorrect_1);
  262. assert!(response.is_err());
  263. let incorrect_1 = r#"{
  264. "1":"03a40f20667ed53513075dc51e715ff2046cad64eb68960632269ba7f0210e38bc","2":"03fd4ce5a16b65576145949e6f99f445f8249fee17c606b688b504a849cdc452de","4":"02648eccfa4c026960966276fa5a4cae46ce0fd432211a4f449bf84f13aa5f8303","8":"02fdfd6796bfeac490cbee12f778f867f0a2c68f6508d17c649759ea0dc3547528"
  265. }"#;
  266. let response: Result<Keys, serde_json::Error> = serde_json::from_str(incorrect_1);
  267. assert!(response.is_ok());
  268. let incorrect_1 = r#"{
  269. "1":"03ba786a2c0745f8c30e490288acd7a72dd53d65afd292ddefa326a4a3fa14c566","2":"03361cd8bd1329fea797a6add1cf1990ffcf2270ceb9fc81eeee0e8e9c1bd0cdf5","4":"036e378bcf78738ddf68859293c69778035740e41138ab183c94f8fee7572214c7","8":"03909d73beaf28edfb283dbeb8da321afd40651e8902fcf5454ecc7d69788626c0","16":"028a36f0e6638ea7466665fe174d958212723019ec08f9ce6898d897f88e68aa5d","32":"03a97a40e146adee2687ac60c2ba2586a90f970de92a9d0e6cae5a4b9965f54612","64":"03ce86f0c197aab181ddba0cfc5c5576e11dfd5164d9f3d4a3fc3ffbbf2e069664","128":"0284f2c06d938a6f78794814c687560a0aabab19fe5e6f30ede38e113b132a3cb9","256":"03b99f475b68e5b4c0ba809cdecaae64eade2d9787aa123206f91cd61f76c01459","512":"03d4db82ea19a44d35274de51f78af0a710925fe7d9e03620b84e3e9976e3ac2eb","1024":"031fbd4ba801870871d46cf62228a1b748905ebc07d3b210daf48de229e683f2dc","2048":"0276cedb9a3b160db6a158ad4e468d2437f021293204b3cd4bf6247970d8aff54b","4096":"02fc6b89b403ee9eb8a7ed457cd3973638080d6e04ca8af7307c965c166b555ea2","8192":"0320265583e916d3a305f0d2687fcf2cd4e3cd03a16ea8261fda309c3ec5721e21","16384":"036e41de58fdff3cb1d8d713f48c63bc61fa3b3e1631495a444d178363c0d2ed50","32768":"0365438f613f19696264300b069d1dad93f0c60a37536b72a8ab7c7366a5ee6c04","65536":"02408426cfb6fc86341bac79624ba8708a4376b2d92debdf4134813f866eb57a8d","131072":"031063e9f11c94dc778c473e968966eac0e70b7145213fbaff5f7a007e71c65f41","262144":"02f2a3e808f9cd168ec71b7f328258d0c1dda250659c1aced14c7f5cf05aab4328","524288":"038ac10de9f1ff9395903bb73077e94dbf91e9ef98fd77d9a2debc5f74c575bc86","1048576":"0203eaee4db749b0fc7c49870d082024b2c31d889f9bc3b32473d4f1dfa3625788","2097152":"033cdb9d36e1e82ae652b7b6a08e0204569ec7ff9ebf85d80a02786dc7fe00b04c","4194304":"02c8b73f4e3a470ae05e5f2fe39984d41e9f6ae7be9f3b09c9ac31292e403ac512","8388608":"025bbe0cfce8a1f4fbd7f3a0d4a09cb6badd73ef61829dc827aa8a98c270bc25b0","16777216":"037eec3d1651a30a90182d9287a5c51386fe35d4a96839cf7969c6e2a03db1fc21","33554432":"03280576b81a04e6abd7197f305506476f5751356b7643988495ca5c3e14e5c262","67108864":"03268bfb05be1dbb33ab6e7e00e438373ca2c9b9abc018fdb452d0e1a0935e10d3","134217728":"02573b68784ceba9617bbcc7c9487836d296aa7c628c3199173a841e7a19798020","268435456":"0234076b6e70f7fbf755d2227ecc8d8169d662518ee3a1401f729e2a12ccb2b276","536870912":"03015bd88961e2a466a2163bd4248d1d2b42c7c58a157e594785e7eb34d880efc9","1073741824":"02c9b076d08f9020ebee49ac8ba2610b404d4e553a4f800150ceb539e9421aaeee","2147483648":"034d592f4c366afddc919a509600af81b489a03caf4f7517c2b3f4f2b558f9a41a","4294967296":"037c09ecb66da082981e4cbdb1ac65c0eb631fc75d85bed13efb2c6364148879b5","8589934592":"02b4ebb0dda3b9ad83b39e2e31024b777cc0ac205a96b9a6cfab3edea2912ed1b3","17179869184":"026cc4dacdced45e63f6e4f62edbc5779ccd802e7fabb82d5123db879b636176e9","34359738368":"02b2cee01b7d8e90180254459b8f09bbea9aad34c3a2fd98c85517ecfc9805af75","68719476736":"037a0c0d564540fc574b8bfa0253cca987b75466e44b295ed59f6f8bd41aace754","137438953472":"021df6585cae9b9ca431318a713fd73dbb76b3ef5667957e8633bca8aaa7214fb6","274877906944":"02b8f53dde126f8c85fa5bb6061c0be5aca90984ce9b902966941caf963648d53a","549755813888":"029cc8af2840d59f1d8761779b2496623c82c64be8e15f9ab577c657c6dd453785","1099511627776":"03e446fdb84fad492ff3a25fc1046fb9a93a5b262ebcd0151caa442ea28959a38a","2199023255552":"02d6b25bd4ab599dd0818c55f75702fde603c93f259222001246569018842d3258","4398046511104":"03397b522bb4e156ec3952d3f048e5a986c20a00718e5e52cd5718466bf494156a","8796093022208":"02d1fb9e78262b5d7d74028073075b80bb5ab281edcfc3191061962c1346340f1e","17592186044416":"030d3f2ad7a4ca115712ff7f140434f802b19a4c9b2dd1c76f3e8e80c05c6a9310","35184372088832":"03e325b691f292e1dfb151c3fb7cad440b225795583c32e24e10635a80e4221c06","70368744177664":"03bee8f64d88de3dee21d61f89efa32933da51152ddbd67466bef815e9f93f8fd1","140737488355328":"0327244c9019a4892e1f04ba3bf95fe43b327479e2d57c25979446cc508cd379ed","281474976710656":"02fb58522cd662f2f8b042f8161caae6e45de98283f74d4e99f19b0ea85e08a56d","562949953421312":"02adde4b466a9d7e59386b6a701a39717c53f30c4810613c1b55e6b6da43b7bc9a","1125899906842624":"038eeda11f78ce05c774f30e393cda075192b890d68590813ff46362548528dca9","2251799813685248":"02ec13e0058b196db80f7079d329333b330dc30c000dbdd7397cbbc5a37a664c4f","4503599627370496":"02d2d162db63675bd04f7d56df04508840f41e2ad87312a3c93041b494efe80a73","9007199254740992":"0356969d6aef2bb40121dbd07c68b6102339f4ea8e674a9008bb69506795998f49","18014398509481984":"02f4e667567ebb9f4e6e180a4113bb071c48855f657766bb5e9c776a880335d1d6","36028797018963968":"0385b4fe35e41703d7a657d957c67bb536629de57b7e6ee6fe2130728ef0fc90b0","72057594037927936":"02b2bc1968a6fddbcc78fb9903940524824b5f5bed329c6ad48a19b56068c144fd","144115188075855872":"02e0dbb24f1d288a693e8a49bc14264d1276be16972131520cf9e055ae92fba19a","288230376151711744":"03efe75c106f931a525dc2d653ebedddc413a2c7d8cb9da410893ae7d2fa7d19cc","576460752303423488":"02c7ec2bd9508a7fc03f73c7565dc600b30fd86f3d305f8f139c45c404a52d958a","1152921504606846976":"035a6679c6b25e68ff4e29d1c7ef87f21e0a8fc574f6a08c1aa45ff352c1d59f06","2305843009213693952":"033cdc225962c052d485f7cfbf55a5b2367d200fe1fe4373a347deb4cc99e9a099","4611686018427387904":"024a4b806cf413d14b294719090a9da36ba75209c7657135ad09bc65328fba9e6f","9223372036854775808":"0377a6fe114e291a8d8e991627c38001c8305b23b9e98b1c7b1893f5cd0dda6cad"
  270. }"#;
  271. let response: Result<Keys, serde_json::Error> = serde_json::from_str(incorrect_1);
  272. assert!(response.is_ok());
  273. }
  274. }