diff --git a/Cargo.lock b/Cargo.lock index 6444720..e6987d6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,12 +2,6 @@ # It is not intended for manual editing. version = 3 -[[package]] -name = "autocfg" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" - [[package]] name = "bech32" version = "0.9.1" @@ -47,36 +41,6 @@ version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62b02a5381cc465bd3041d84623d0fa3b66738b52b8e2fc3bab8ad63ab032f4a" -[[package]] -name = "num-bigint" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-integer" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" -dependencies = [ - "autocfg", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" -dependencies = [ - "autocfg", -] - [[package]] name = "proc-macro2" version = "1.0.63" @@ -157,7 +121,6 @@ version = "0.1.0" dependencies = [ "bech32", "hex", - "num-bigint", "secp256k1", "serde", "serde_json", diff --git a/Cargo.toml b/Cargo.toml index 7fde291..4f1f93f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,9 +10,6 @@ edition = "2021" secp256k1 = {version = "0.27", features = ["bitcoin-hashes-std"] } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" -# rust-crypto = "0.2" -# sha2 = "0.10" hex = "0.4" bech32 = "0.9" # bip32 = { version = "0.5", features = ["alloc"] } -num-bigint = "0.4.0" diff --git a/send_and_receive_test_vectors.json b/send_and_receive_test_vectors.json index bb56406..363db42 100644 --- a/send_and_receive_test_vectors.json +++ b/send_and_receive_test_vectors.json @@ -58,7 +58,7 @@ "03856d771421394858fcb58554f5460a39073e77e3a70bda471841155c391e2b26" ], "bip32_seed": "0x01", - "labels": [], + "labels": {}, "outputs": [ "feb563950e21c2f1a7bab35c774beab453653bdd6b5a665adb22ce1a30fb083e" ] @@ -137,7 +137,7 @@ "03856d771421394858fcb58554f5460a39073e77e3a70bda471841155c391e2b26" ], "bip32_seed": "0x01", - "labels": [], + "labels": {}, "outputs": [ "feb563950e21c2f1a7bab35c774beab453653bdd6b5a665adb22ce1a30fb083e" ] @@ -216,7 +216,7 @@ "03856d771421394858fcb58554f5460a39073e77e3a70bda471841155c391e2b26" ], "bip32_seed": "0x01", - "labels": [], + "labels": {}, "outputs": [ "b7d731d1c0e9d586b3310bdece728f09b487226de5e3ab0660a7368852f3ff02" ] @@ -295,7 +295,7 @@ "03856d771421394858fcb58554f5460a39073e77e3a70bda471841155c391e2b26" ], "bip32_seed": "0x01", - "labels": [], + "labels": {}, "outputs": [ "1b8b6f04c8d9e866fb89d9e04722d4d43675be977f2b251656472caeec423c9e" ] @@ -374,7 +374,7 @@ "0213615388aac3f4a672feef7b6145d65c5f4dd0f83261785279f4d01441445027" ], "bip32_seed": "0x01", - "labels": [], + "labels": {}, "outputs": [ "ebffe68f65898730750aab1770d71d5a0d83c9fc3753f3d277ab6095250046af" ] @@ -453,7 +453,7 @@ "856d771421394858fcb58554f5460a39073e77e3a70bda471841155c391e2b26" ], "bip32_seed": "0x01", - "labels": [], + "labels": {}, "outputs": [ "d628eb16f111d127a21927d8d1821457ec651d9990cf074746b34bf2b84e4b9b" ] @@ -532,7 +532,7 @@ "856d771421394858fcb58554f5460a39073e77e3a70bda471841155c391e2b26" ], "bip32_seed": "0x01", - "labels": [], + "labels": {}, "outputs": [ "d628eb16f111d127a21927d8d1821457ec651d9990cf074746b34bf2b84e4b9b" ] @@ -611,7 +611,7 @@ "03d47a01f7625f02001c2bd4975ea1d5d09f453818f49f2acf9b1d8636e62f6cd7" ], "bip32_seed": "0x01", - "labels": [], + "labels": {}, "outputs": [ "66b7d24355f2ca5437d51f459601ab89a2ec66e3cf4aad039df0b1d9dbacc519" ] @@ -690,7 +690,7 @@ "03d47a01f7625f02001c2bd4975ea1d5d09f453818f49f2acf9b1d8636e62f6cd7" ], "bip32_seed": "0x01", - "labels": [], + "labels": {}, "outputs": [ "a0969f9f9ffc3c1e3e84bf30da980e405ec977c0e8a39ffab76bd73f780d907d" ] @@ -776,7 +776,7 @@ "03856d771421394858fcb58554f5460a39073e77e3a70bda471841155c391e2b26" ], "bip32_seed": "0x01", - "labels": [], + "labels": {}, "outputs": [ "feb563950e21c2f1a7bab35c774beab453653bdd6b5a665adb22ce1a30fb083e", "68e1fc9289d4754230e4f7f8025252f93b58182c0d45b2ddfffdf694fad55b73", @@ -884,7 +884,7 @@ "03856d771421394858fcb58554f5460a39073e77e3a70bda471841155c391e2b26" ], "bip32_seed": "0x01", - "labels": [], + "labels": {}, "outputs": [ "feb563950e21c2f1a7bab35c774beab453653bdd6b5a665adb22ce1a30fb083e", "68e1fc9289d4754230e4f7f8025252f93b58182c0d45b2ddfffdf694fad55b73", @@ -927,7 +927,7 @@ "03856d771421394858fcb58554f5460a39073e77e3a70bda471841155c391e2b26" ], "bip32_seed": "0x02", - "labels": [], + "labels": {}, "outputs": [ "feb563950e21c2f1a7bab35c774beab453653bdd6b5a665adb22ce1a30fb083e", "68e1fc9289d4754230e4f7f8025252f93b58182c0d45b2ddfffdf694fad55b73", @@ -1015,9 +1015,9 @@ ], "bip32_seed": "0x01", "labels": { - "02c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5": 2, - "02f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9": 3, - "03348b4f5feb64b557dac8cfa10044bdc2094fca9147163bf514f68687e0d1dba6": 1001337 + "02c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5": "0000000000000000000000000000000000000000000000000000000000000002", + "02f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9": "0000000000000000000000000000000000000000000000000000000000000003", + "03348b4f5feb64b557dac8cfa10044bdc2094fca9147163bf514f68687e0d1dba6": "00000000000000000000000000000000000000000000000000000000000f4779" }, "outputs": [ "14467ccf40b1436244cf78297dbf394d1d801b04cc804f89b79ff6fce9f90696" @@ -1101,9 +1101,9 @@ ], "bip32_seed": "0x01", "labels": { - "02c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5": 2, - "02f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9": 3, - "03348b4f5feb64b557dac8cfa10044bdc2094fca9147163bf514f68687e0d1dba6": 1001337 + "02c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5": "0000000000000000000000000000000000000000000000000000000000000002", + "02f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9": "0000000000000000000000000000000000000000000000000000000000000003", + "03348b4f5feb64b557dac8cfa10044bdc2094fca9147163bf514f68687e0d1dba6": "00000000000000000000000000000000000000000000000000000000000f4779" }, "outputs": [ "ee381b2caa9c5b0184f9061f0b577417fe547ce9f00580f4a9794aa4c2cffb03" @@ -1187,9 +1187,9 @@ ], "bip32_seed": "0x01", "labels": { - "02c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5": 2, - "02f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9": 3, - "03348b4f5feb64b557dac8cfa10044bdc2094fca9147163bf514f68687e0d1dba6": 1001337 + "02c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5": "0000000000000000000000000000000000000000000000000000000000000002", + "02f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9": "0000000000000000000000000000000000000000000000000000000000000003", + "03348b4f5feb64b557dac8cfa10044bdc2094fca9147163bf514f68687e0d1dba6": "00000000000000000000000000000000000000000000000000000000000f4779" }, "outputs": [ "3eb48b7940b733b15e8333ec8f6e9445a7e247ef653f4876d605b31f1fbc1c27" @@ -1280,7 +1280,7 @@ ], "bip32_seed": "0x01", "labels": { - "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798": 1 + "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798": "0000000000000000000000000000000000000000000000000000000000000001" }, "outputs": [ "feb563950e21c2f1a7bab35c774beab453653bdd6b5a665adb22ce1a30fb083e", @@ -1375,7 +1375,7 @@ ], "bip32_seed": "0x01", "labels": { - "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798": 1 + "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798": "0000000000000000000000000000000000000000000000000000000000000001" }, "outputs": [ "c39acba526c1ae264c64101e9fc51312d364628a9b6d2608b1209811e1e2dae9", @@ -1484,8 +1484,8 @@ ], "bip32_seed": "0x01", "labels": { - "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798": 1, - "02db0c51cc634a4096374b0b895584a3ca2fb3bea4fd0ee2361f8db63a650fcee6": 1337 + "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798": "0000000000000000000000000000000000000000000000000000000000000001", + "02db0c51cc634a4096374b0b895584a3ca2fb3bea4fd0ee2361f8db63a650fcee6": "0000000000000000000000000000000000000000000000000000000000000539" }, "outputs": [ "feb563950e21c2f1a7bab35c774beab453653bdd6b5a665adb22ce1a30fb083e", @@ -1593,7 +1593,7 @@ ], "bip32_seed": "0x00", "labels": { - "02c7120a4e2a14b73fc818ee187e91006626232754f1c90a054cf80a03a3c7fdc1": 61707410023122809948607768024730556383395257260459987367828836358530927314165 + "02c7120a4e2a14b73fc818ee187e91006626232754f1c90a054cf80a03a3c7fdc1": "886d280801f09b65955e83cf85830f7b2f8454b8bb41a70f54a8b6e5569a44f5" }, "outputs": [ "feb563950e21c2f1a7bab35c774beab453653bdd6b5a665adb22ce1a30fb083e", @@ -1631,7 +1631,7 @@ "03856d771421394858fcb58554f5460a39073e77e3a70bda471841155c391e2b26" ], "bip32_seed": "0x01", - "labels": [], + "labels": {}, "outputs": [ "feb563950e21c2f1a7bab35c774beab453653bdd6b5a665adb22ce1a30fb083e", "6a9352c6f71b4c08d6252fdfb43f15584d3e2b71e03268336462287ba15a4478" diff --git a/src/input.rs b/src/input.rs index 5090f4c..f6e30be 100644 --- a/src/input.rs +++ b/src/input.rs @@ -1,8 +1,8 @@ -use num_bigint::BigUint; use serde::Deserialize; -use serde_json::{from_str, Value}; +use serde_json::from_str; + use std::hash::{Hash, Hasher}; -use std::{collections::HashMap, fs::File, io::Read, str::FromStr}; +use std::{collections::HashMap, fs::File, io::Read}; #[derive(Debug, Deserialize)] pub struct TestData { @@ -22,51 +22,10 @@ pub struct ReceivingDataGiven { pub outpoints: Vec<(String, u32)>, pub input_pub_keys: Vec, pub bip32_seed: String, - #[serde(deserialize_with = "empty_array_as_map")] - pub labels: HashMap, + pub labels: HashMap, pub outputs: Vec, } -fn empty_array_as_map<'de, D>(deserializer: D) -> Result, D::Error> -where - D: serde::Deserializer<'de>, -{ - let v = Value::deserialize(deserializer)?; - - match v { - Value::Array(array) => { - if array.is_empty() { - Ok(HashMap::new()) - } else { - Err(serde::de::Error::custom("Expected map or empty array")) - } - } - Value::Object(map) => { - // let len = map.len(); - let result: HashMap = map - .into_iter() - .filter_map(|(k, v)| { - if let Value::Number(num) = v { - num.as_i64() - .and_then(|n| BigUint::from_str(&n.to_string()).ok()) - .map(|n| (k, n)) - } else { - None - } - }) - .collect(); - - // if result.len() != len { - // return Err(serde::de::Error::custom( - // "Failed to parse map values as BigUint", - // )); - // } - Ok(result) - } - _ => Err(serde::de::Error::custom("Expected map or empty array")), - } -} - #[derive(Debug, Deserialize)] pub struct ReceivingDataExpected { pub addresses: Vec, diff --git a/src/receiving.rs b/src/receiving.rs index 72e2a6f..93e38e1 100644 --- a/src/receiving.rs +++ b/src/receiving.rs @@ -1,19 +1,14 @@ use bech32::ToBase32; -use num_bigint::BigUint; use secp256k1::{hashes::Hash, Message, PublicKey, Scalar, Secp256k1, SecretKey, XOnlyPublicKey}; use std::{collections::HashMap, str::FromStr}; -use crate::{ - input::ReceivingDataOutputs, - sha256, - utils::ser_uint32, -}; +use crate::{input::ReceivingDataOutputs, sha256, utils::ser_uint32}; pub fn get_receiving_addresses( B_scan: PublicKey, B_spend: PublicKey, - labels: &HashMap, + labels: &HashMap, ) -> Vec { let mut receiving_addresses: Vec = vec![]; receiving_addresses.push(encode_silent_payment_address(B_scan, B_spend, None, None)); @@ -104,18 +99,13 @@ fn encode_silent_payment_address( fn create_labeled_silent_payment_address( B_scan: PublicKey, B_spend: PublicKey, - m: &BigUint, + m: &String, hrp: Option<&str>, version: Option, ) -> String { - let bytes = m.to_bytes_be(); + let bytes = hex::decode(m).unwrap().try_into().unwrap(); - let mut array = [0u8; 32]; - let start = array.len() - bytes.len(); - - array[start..].copy_from_slice(&bytes); - - let scalar = Scalar::from_be_bytes(array).unwrap(); + let scalar = Scalar::from_be_bytes(bytes).unwrap(); let secp = Secp256k1::new(); let G: PublicKey = SecretKey::from_slice(&Scalar::ONE.to_be_bytes()) .unwrap() @@ -173,7 +163,7 @@ pub fn scanning( A_sum: PublicKey, outpoints_hash: [u8; 32], outputs_to_check: Vec, - labels: Option<&HashMap>, + labels: Option<&HashMap>, ) -> Vec { let secp = secp256k1::Secp256k1::new(); let ecdh_shared_secret = calculate_ecdh_secret(&A_sum, b_scan, outpoints_hash); @@ -212,13 +202,8 @@ pub fn scanning( if keys.iter().any(|x| x.eq(&labelkey)) { let P_nm = hex::encode(output.serialize()); let label = labels.get(labelkeystr).unwrap(); - let label_in_bytes = label.to_bytes_be(); - let mut array = [0u8; 32]; - let start = array.len() - label_in_bytes.len(); - - //ugly, fails if bytes > 32 - array[start..].copy_from_slice(&label_in_bytes); - let label_scalar = Scalar::from_be_bytes(array).unwrap(); + let label_bytes = hex::decode(label).unwrap().try_into().unwrap(); + let label_scalar = Scalar::from_be_bytes(label_bytes).unwrap(); let t_n_as_secret_key = SecretKey::from_slice(&t_n).unwrap(); let priv_key_tweak = hex::encode( t_n_as_secret_key diff --git a/src/sending.rs b/src/sending.rs index 21c89e6..dee5a79 100644 --- a/src/sending.rs +++ b/src/sending.rs @@ -3,7 +3,11 @@ use bech32::FromBase32; use secp256k1::{Parity, PublicKey, Scalar, Secp256k1, SecretKey}; use std::{collections::HashMap, str::FromStr}; -use crate::{hash_outpoints, input::SendingDataGiven, utils::{ser_uint32, sha256} }; +use crate::{ + hash_outpoints, + input::SendingDataGiven, + utils::{ser_uint32, sha256}, +}; fn get_a_sum_secret_keys(input: &Vec<(String, bool)>) -> SecretKey { let secp = Secp256k1::new();