From eebf9ddc5a4f59d7f17097b4ce77e9fd76e0f24e Mon Sep 17 00:00:00 2001 From: ghassmo Date: Thu, 23 Sep 2021 13:32:33 +0300 Subject: [PATCH] move parse_id function to src/util.rs --- src/util.rs | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) diff --git a/src/util.rs b/src/util.rs index fcfa77531..ba28db6db 100644 --- a/src/util.rs +++ b/src/util.rs @@ -1,4 +1,9 @@ use crate::Result; +use crate::serial::{deserialize, serialize}; + +use sha2::{Digest, Sha256}; +use serde_json::Value; +use log::*; use std::path::{Path, PathBuf}; @@ -17,3 +22,94 @@ pub fn join_config_path(file: &PathBuf) -> Result { Ok(path) } + +// here we hash the alphanumeric token ID. if it fails, we change the last 4 bytes and hash it +// again, and keep repeating until it works. +pub fn parse_id(token: &Value) -> Result { + let tkn_str = token.as_str().unwrap(); + if bs58::decode(tkn_str).into_vec().is_err() { + // TODO: make this an error + debug!(target: "CASHIER", "COULD NOT DECODE STR"); + } + let mut data = bs58::decode(tkn_str).into_vec().unwrap(); + let token_id = deserialize::(&data); + if token_id.is_err() { + let mut counter = 0; + loop { + data.truncate(28); + let serialized_counter = serialize(&counter); + data.extend(serialized_counter.iter()); + let mut hasher = Sha256::new(); + hasher.update(&data); + let hash = hasher.finalize(); + let token_id = deserialize::(&hash); + if token_id.is_err() { + counter += 1; + continue; + } + debug!(target: "CASHIER", "DESERIALIZATION SUCCESSFUL"); + let tkn = token_id.unwrap(); + return Ok(tkn); + } + } + unreachable!(); +} + + + +#[cfg(test)] +mod tests { + use crate::serial::{deserialize, serialize}; + use sha2::{Digest, Sha256}; + + #[test] + fn test_jubjub_parsing() { + // 1. counter = 0 + // 2. serialized_counter = serialize(counter) + // 3. asset_id_data = hash(data + serialized_counter) + // 4. asset_id = deserialize(asset_id_data) + // 5. test parse + // 6. loop + let tkn_str = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"; + println!("{}", tkn_str); + if bs58::decode(tkn_str).into_vec().is_err() { + println!("Could not decode str into vec"); + } + let mut data = bs58::decode(tkn_str).into_vec().unwrap(); + println!("{:?}", data); + let mut hasher = Sha256::new(); + hasher.update(&data); + let hash = hasher.finalize(); + let token_id = deserialize::(&hash); + println!("{:?}", token_id); + let mut counter = 0; + if token_id.is_err() { + println!("could not deserialize tkn 58"); + loop { + println!("TOKEN IS NONE. COMMENCING LOOP"); + counter += 1; + println!("LOOP NUMBER {}", counter); + println!("{:?}", data.len()); + data.truncate(28); + let serialized_counter = serialize(&counter); + println!("{:?}", serialized_counter); + data.extend(serialized_counter.iter()); + println!("{:?}", data.len()); + let mut hasher = Sha256::new(); + hasher.update(&data); + let hash = hasher.finalize(); + let token_id = deserialize::(&hash); + println!("{:?}", token_id); + if token_id.is_err() { + continue; + } + if counter > 10 { + break; + } + println!("deserialization successful"); + token_id.unwrap(); + break; + } + }; + } +}