util.rs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. use crate::Result;
  2. use crate::serial::{deserialize, serialize};
  3. use sha2::{Digest, Sha256};
  4. use serde_json::Value;
  5. use log::*;
  6. use std::path::{Path, PathBuf};
  7. pub fn join_config_path(file: &PathBuf) -> Result<PathBuf> {
  8. let mut path = PathBuf::new();
  9. let dfi_path = Path::new("darkfi");
  10. match dirs::config_dir() {
  11. Some(v) => path.push(v),
  12. // This should not fail on any modern OS
  13. None => {}
  14. }
  15. path.push(dfi_path);
  16. path.push(file);
  17. Ok(path)
  18. }
  19. // here we hash the alphanumeric token ID. if it fails, we change the last 4 bytes and hash it
  20. // again, and keep repeating until it works.
  21. pub fn parse_id(token: &Value) -> Result<jubjub::Fr> {
  22. let tkn_str = token.as_str().unwrap();
  23. if bs58::decode(tkn_str).into_vec().is_err() {
  24. // TODO: make this an error
  25. debug!(target: "CASHIER", "COULD NOT DECODE STR");
  26. }
  27. let mut data = bs58::decode(tkn_str).into_vec().unwrap();
  28. let token_id = deserialize::<jubjub::Fr>(&data);
  29. if token_id.is_err() {
  30. let mut counter = 0;
  31. loop {
  32. data.truncate(28);
  33. let serialized_counter = serialize(&counter);
  34. data.extend(serialized_counter.iter());
  35. let mut hasher = Sha256::new();
  36. hasher.update(&data);
  37. let hash = hasher.finalize();
  38. let token_id = deserialize::<jubjub::Fr>(&hash);
  39. if token_id.is_err() {
  40. counter += 1;
  41. continue;
  42. }
  43. debug!(target: "CASHIER", "DESERIALIZATION SUCCESSFUL");
  44. let tkn = token_id.unwrap();
  45. return Ok(tkn);
  46. }
  47. }
  48. unreachable!();
  49. }
  50. #[cfg(test)]
  51. mod tests {
  52. use crate::serial::{deserialize, serialize};
  53. use sha2::{Digest, Sha256};
  54. #[test]
  55. fn test_jubjub_parsing() {
  56. // 1. counter = 0
  57. // 2. serialized_counter = serialize(counter)
  58. // 3. asset_id_data = hash(data + serialized_counter)
  59. // 4. asset_id = deserialize(asset_id_data)
  60. // 5. test parse
  61. // 6. loop
  62. let tkn_str = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v";
  63. println!("{}", tkn_str);
  64. if bs58::decode(tkn_str).into_vec().is_err() {
  65. println!("Could not decode str into vec");
  66. }
  67. let mut data = bs58::decode(tkn_str).into_vec().unwrap();
  68. println!("{:?}", data);
  69. let mut hasher = Sha256::new();
  70. hasher.update(&data);
  71. let hash = hasher.finalize();
  72. let token_id = deserialize::<jubjub::Fr>(&hash);
  73. println!("{:?}", token_id);
  74. let mut counter = 0;
  75. if token_id.is_err() {
  76. println!("could not deserialize tkn 58");
  77. loop {
  78. println!("TOKEN IS NONE. COMMENCING LOOP");
  79. counter += 1;
  80. println!("LOOP NUMBER {}", counter);
  81. println!("{:?}", data.len());
  82. data.truncate(28);
  83. let serialized_counter = serialize(&counter);
  84. println!("{:?}", serialized_counter);
  85. data.extend(serialized_counter.iter());
  86. println!("{:?}", data.len());
  87. let mut hasher = Sha256::new();
  88. hasher.update(&data);
  89. let hash = hasher.finalize();
  90. let token_id = deserialize::<jubjub::Fr>(&hash);
  91. println!("{:?}", token_id);
  92. if token_id.is_err() {
  93. continue;
  94. }
  95. if counter > 10 {
  96. break;
  97. }
  98. println!("deserialization successful");
  99. token_id.unwrap();
  100. break;
  101. }
  102. };
  103. }
  104. }