diff --git a/Cargo.toml b/Cargo.toml index c749341..48892f9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,7 +24,10 @@ clap = { version = "4.5.42", features = ["derive"] , optional = true} tokio = { version = "1", features = ["macros", "net", "rt", "rt-multi-thread", "io-util", "sync"], optional = true} [dev-dependencies] +hex = "0.4.3" rand = {version = "0.9.2"} +serde = { version = "1.0.228", features = ["derive"] } +serde_json = "1.0.145" [[bin]] name = "beb" diff --git a/src/ll.rs b/src/ll.rs index b3672e4..6f64f38 100644 --- a/src/ll.rs +++ b/src/ll.rs @@ -176,12 +176,23 @@ pub fn individual_secrets(secret: &sha256::Hash, keys: &[[u8; 33]]) -> Vec<[u8; pub fn inner_encrypt( secret: sha256::Hash, - mut data: Vec, + data: Vec, #[cfg(not(feature = "rand"))] nonce: [u8; 12], ) -> Result<([u8; 12], Vec), Error> { #[cfg(feature = "rand")] let nonce = nonce(); + encrypt_with_nonce(secret, data, nonce) +} + +pub fn encrypt_with_nonce( + secret: sha256::Hash, + mut data: Vec, + nonce: [u8; 12], +) -> Result<([u8; 12], Vec), Error> { + if data.is_empty() { + return Err(Error::EmptyBytes); + } #[allow(deprecated)] let key = Key::::from_slice(secret.as_byte_array()); let cipher = Aes256Gcm::new(key); @@ -370,12 +381,12 @@ pub fn decode_v1( )) } -pub fn encrypt_aes_gcm_256_v1( +fn encrypt_aes_gcm_256_v1_with_nonce( derivation_paths: Vec, content_metadata: Content, keys: Vec, data: &[u8], - #[cfg(not(feature = "rand"))] nonce: [u8; 12], + nonce: [u8; 12], ) -> Result, Error> { // drop duplicates keys and sort out bip341 nums let keys = keys @@ -424,12 +435,7 @@ pub fn encrypt_aes_gcm_256_v1( let mut payload = content_metadata; payload.append(&mut data.to_vec()); - let (nonce, cyphertext) = inner_encrypt( - secret, - payload.to_vec(), - #[cfg(not(feature = "rand"))] - nonce, - )?; + let (nonce, cyphertext) = encrypt_with_nonce(secret, payload.to_vec(), nonce)?; let encrypted_payload = encode_encrypted_payload(nonce, cyphertext.as_slice())?; Ok(encode_v1( @@ -441,6 +447,18 @@ pub fn encrypt_aes_gcm_256_v1( )) } +pub fn encrypt_aes_gcm_256_v1( + derivation_paths: Vec, + content_metadata: Content, + keys: Vec, + data: &[u8], + #[cfg(not(feature = "rand"))] nonce: [u8; 12], +) -> Result, Error> { + #[cfg(feature = "rand")] + let nonce = nonce(); + encrypt_aes_gcm_256_v1_with_nonce(derivation_paths, content_metadata, keys, data, nonce) +} + pub fn try_decrypt_aes_gcm_256( cyphertext: &[u8], secret: &[u8; 32], @@ -1228,3 +1246,470 @@ mod tests { assert!(fails.is_none()); } } + +#[cfg(all(test, feature = "rand"))] +mod derivation_paths { + use super::*; + use alloc::{string::String, vec::Vec}; + use core::str::FromStr; + use miniscript::bitcoin::bip32::DerivationPath; + + const TEST_VECTORS_JSON: &str = include_str!("../test_vectors/derivation_path.json"); + + #[derive(serde::Deserialize)] + struct TestVector { + description: String, + paths: Vec, + expected: Option, + } + + #[test] + fn test_vector_derivation_path_ser_deser() { + let vectors: Vec = serde_json::from_str(TEST_VECTORS_JSON).unwrap(); + + let mut cases: Vec<( + Vec, + Option>, + String, /* description */ + )> = vec![]; + for v in vectors { + let p = v + .paths + .into_iter() + .map(|s| DerivationPath::from_str(&s).unwrap()) + .collect(); + let ser: Option> = v + .expected + .map(|hex_str| hex::decode(hex_str).expect(&v.description)); + cases.push((p, ser, v.description)); + } + + for (paths, expected, description) in cases { + // serialize + let result = encode_derivation_paths(paths.clone()).ok(); + if result != expected { + panic!("Derivation path serialization failed: {description}"); + } + + // deserialize + if let Some(serialized) = expected { + let (_, paths2) = parse_derivation_paths(&serialized).expect(&description); + if paths != paths2 { + panic!("Derivation path deserialization failed: {description}"); + } + } + } + } +} + +#[cfg(all(test, feature = "rand"))] +mod individual_secrets_vectors { + use super::*; + use alloc::{string::String, vec::Vec}; + + const TEST_VECTORS_JSON: &str = include_str!("../test_vectors/individual_secrets.json"); + + #[derive(serde::Deserialize)] + struct TestVector { + description: String, + secrets: Vec, + expected: Option, + } + + #[test] + #[allow(clippy::type_complexity)] + fn test_vector_individual_secrets_ser_deser() { + let vectors: Vec = serde_json::from_str(TEST_VECTORS_JSON).unwrap(); + + let mut cases: Vec<( + Vec<[u8; 32]>, + Option>, + String, /* description */ + )> = vec![]; + + for v in vectors { + let secrets = v + .secrets + .into_iter() + .map(|hex_str| { + let bytes = hex::decode(hex_str).expect(&v.description); + let arr: [u8; 32] = bytes.try_into().expect("secret must be 32 bytes"); + arr + }) + .collect(); + let ser: Option> = v + .expected + .map(|hex_str| hex::decode(hex_str).expect(&v.description)); + cases.push((secrets, ser, v.description)); + } + + for (mut secrets, expected, description) in cases { + // serialize + let result = encode_individual_secrets(&secrets).ok(); + if result != expected { + panic!("Individual secrets serialization failed: {description}"); + } + + // deserialize + if let Some(exp) = expected { + let (_, mut parsed) = parse_individual_secrets(&exp).expect(&description); + secrets.sort(); + parsed.sort(); + + if secrets != parsed { + panic!("Individual secrets deserialization failed: {description}"); + } + } + } + } +} + +#[cfg(all(test, feature = "rand"))] +mod encryption_secret { + use super::*; + use alloc::{string::String, vec::Vec}; + use core::str::FromStr; + + const TEST_VECTORS_JSON: &str = include_str!("../test_vectors/encryption_secret.json"); + + #[derive(serde::Deserialize)] + struct TestVector { + description: String, + keys: Vec, + decryption_secret: String, + individual_secrets: Vec, + } + + #[test] + fn test_vector_encryption_secret() { + let vectors: Vec = serde_json::from_str(TEST_VECTORS_JSON).unwrap(); + + for v in vectors { + let description = &v.description; + + // Parse public keys + let keys: Vec = v + .keys + .iter() + .map(|hex_str| secp256k1::PublicKey::from_str(hex_str).expect(description)) + .collect(); + + // Convert to raw bytes and sort + let mut raw_keys: Vec<[u8; 33]> = keys.iter().map(|k| k.serialize()).collect(); + raw_keys.sort(); + raw_keys.dedup(); + + // Parse expected decryption secret + let expected_decryption_secret = hex::decode(&v.decryption_secret).expect(description); + let expected_decryption_secret: [u8; 32] = expected_decryption_secret + .try_into() + .expect("decryption secret must be 32 bytes"); + + // Parse expected individual secrets + let expected_individual_secrets: Vec<[u8; 32]> = v + .individual_secrets + .iter() + .map(|hex_str| { + let bytes = hex::decode(hex_str).expect(description); + let arr: [u8; 32] = bytes + .try_into() + .expect("individual secret must be 32 bytes"); + arr + }) + .collect(); + + // Test decryption_secret generation + let computed_decryption_secret = decryption_secret(&raw_keys); + assert_eq!( + computed_decryption_secret.as_byte_array(), + &expected_decryption_secret, + "Decryption secret mismatch: {}", + description + ); + + // Test individual_secrets generation + let computed_individual_secrets = + individual_secrets(&computed_decryption_secret, &raw_keys); + assert_eq!( + computed_individual_secrets.len(), + expected_individual_secrets.len(), + "Individual secrets count mismatch: {}", + description + ); + + for (i, (computed, expected)) in computed_individual_secrets + .iter() + .zip(expected_individual_secrets.iter()) + .enumerate() + { + assert_eq!( + computed, expected, + "Individual secret {} mismatch: {}", + i, description + ); + } + + // Test round-trip: recover decryption secret from individual secrets + for (i, raw_key) in raw_keys.iter().enumerate() { + let individual_sec = computed_individual_secrets[i]; + + // Compute Si = SHA256("BEB_BACKUP_INDIVIDUAL_SECRET" || key) + let mut engine = sha256::HashEngine::default(); + engine.input(INDIVIDUAL_SECRET.as_bytes()); + engine.input(raw_key); + let si = sha256::Hash::from_engine(engine); + + // Recover secret: S = Ci XOR Si + let recovered_secret = xor(&individual_sec, si.as_byte_array()); + + assert_eq!( + recovered_secret, expected_decryption_secret, + "Round-trip recovery failed for key {}: {}", + i, description + ); + } + } + } +} + +#[cfg(all(test, feature = "rand"))] +mod encryption_vectors { + use super::*; + use alloc::{string::String, vec::Vec}; + + const TEST_VECTORS_JSON: &str = include_str!("../test_vectors/aesgcm256_encryption.json"); + + #[derive(serde::Deserialize)] + struct TestVector { + description: String, + nonce: String, + plaintext: String, + secret: String, + ciphertext: Option, + } + + #[test] + fn test_vector_aesgcm256_encryption() { + let vectors: Vec = serde_json::from_str(TEST_VECTORS_JSON).unwrap(); + + for v in vectors { + let description = &v.description; + + // Parse inputs + let nonce_bytes = hex::decode(&v.nonce).expect(description); + let nonce: [u8; 12] = nonce_bytes.try_into().expect("nonce must be 12 bytes"); + + let secret_bytes = hex::decode(&v.secret).expect(description); + let secret: [u8; 32] = secret_bytes.try_into().expect("secret must be 32 bytes"); + let secret_hash = sha256::Hash::from_byte_array(secret); + + let plaintext = if v.plaintext.is_empty() { + vec![] + } else { + hex::decode(&v.plaintext).expect(description) + }; + + if let Some(expected_ciphertext_hex) = v.ciphertext { + // Expected to succeed + let expected_ciphertext = hex::decode(&expected_ciphertext_hex).expect(description); + + // Test encryption + let (_, computed_ciphertext) = + encrypt_with_nonce(secret_hash, plaintext.clone(), nonce).expect(description); + + assert_eq!( + computed_ciphertext, expected_ciphertext, + "Ciphertext mismatch: {}", + description + ); + + // Test decryption + let decrypted = try_decrypt_aes_gcm_256(&computed_ciphertext, &secret, nonce) + .expect(description); + + assert_eq!(decrypted, plaintext, "Decryption failed: {}", description); + } else { + // Expected to fail + let result = encrypt_with_nonce(secret_hash, plaintext, nonce); + assert!( + result.is_err(), + "Encryption should have failed: {}", + description + ); + } + } + } +} + +#[cfg(all(test, feature = "rand"))] +mod encrypted_backup { + use super::*; + use alloc::{string::String, vec::Vec}; + use core::str::FromStr; + + const TEST_VECTORS_JSON: &str = include_str!("../test_vectors/encrypted_backup.json"); + + #[derive(serde::Deserialize)] + struct TestVector { + description: String, + version: u8, + encryption: u8, + content: String, + keys: Vec, + derivation_paths: Vec, + plaintext: String, + nonce: String, + expected: String, + } + + #[test] + fn test_vector_encrypted_backup() { + let vectors: Vec = serde_json::from_str(TEST_VECTORS_JSON).unwrap(); + + for v in vectors { + let description = &v.description; + + // Parse content metadata from hex + let content_bytes = hex::decode(&v.content).expect(description); + let (_, content) = parse_content_metadata(&content_bytes) + .ok() + .unwrap_or_else(|| panic!("Failed to parse content for: {}", description)); + + let keys: Vec = v + .keys + .iter() + .map(|s| secp256k1::PublicKey::from_str(s).expect(description)) + .collect(); + + let mut derivation_paths: Vec = v + .derivation_paths + .iter() + .map(|s| DerivationPath::from_str(s).expect(description)) + .collect(); + + let plaintext = v.plaintext; + + let nonce_bytes = hex::decode(&v.nonce).expect(description); + let nonce: [u8; 12] = nonce_bytes.try_into().expect("nonce must be 12 bytes"); + + let expected_bytes = hex::decode(&v.expected).expect(description); + + // Test encryption + let encrypted = encrypt_aes_gcm_256_v1_with_nonce( + derivation_paths.clone(), + content.clone(), + keys.clone(), + plaintext.as_bytes(), + nonce, + ) + .expect(description); + + assert_eq!( + encrypted, expected_bytes, + "Encrypted payload mismatch: {}", + description + ); + + // Test decryption + let version = decode_version(&encrypted).expect(description); + assert_eq!(version, v.version, "Version mismatch: {}", description); + + let mut parsed_derivation_paths = + decode_derivation_paths(&encrypted).expect(description); + + parsed_derivation_paths.sort(); + derivation_paths.sort(); + assert_eq!( + parsed_derivation_paths, derivation_paths, + "Derivation paths mismatch: {}", + description + ); + + let (_, individual_secrets, encryption_type, parsed_nonce, cyphertext) = + decode_v1(&encrypted).expect(description); + + assert_eq!( + encryption_type, v.encryption, + "Encryption type mismatch: {}", + description + ); + assert_eq!(parsed_nonce, nonce, "Nonce mismatch: {}", description); + + // Test decryption with each key + for key in &keys { + let (decrypted_content, decrypted_plaintext) = decrypt_aes_gcm_256_v1( + *key, + &individual_secrets, + cyphertext.clone(), + parsed_nonce, + ) + .expect(description); + + let decrypted_plaintext = String::from_utf8(decrypted_plaintext).unwrap(); + + assert_eq!( + decrypted_content, content, + "Content metadata mismatch: {}", + description + ); + assert_eq!( + decrypted_plaintext, plaintext, + "Decrypted plaintext mismatch: {}", + description + ); + } + } + } +} + +#[cfg(all(test, feature = "rand"))] +mod content_vectors { + use super::*; + use alloc::{ + string::{String, ToString}, + vec::Vec, + }; + + const TEST_VECTORS_JSON: &str = include_str!("../test_vectors/content_type.json"); + + #[derive(serde::Deserialize, serde::Serialize)] + + struct TestVector { + description: String, + valid: bool, + content: String, + } + + #[test] + fn test_vector_content() { + let vectors: Vec = serde_json::from_str(TEST_VECTORS_JSON).unwrap(); + + let mut parsed = vec![]; + for v in vectors { + let content = hex::decode(&v.content).expect(&v.description); + match parse_content_metadata(&content) { + Ok((_, content)) => { + assert!(v.valid); + parsed.push((content, v.description.to_string())); + } + Err(_) => assert!(!v.valid), + } + } + + let expected = vec![ + (Content::None, "None".to_string()), + (Content::Bip380, "Bip 380".to_string()), + (Content::Bip388, "Bip 388".to_string()), + (Content::Bip329, "Bip 329".to_string()), + (Content::BIP(999), "Bip 999".to_string()), + (Content::BIP(65535), "Bip max".to_string()), + (Content::BIP(0), "Bip min".to_string()), + ( + Content::Proprietary(vec![0x00, 0x01, 0x02, 0x03]), + "Propietary 00010203".to_string(), + ), + ]; + + assert_eq!(parsed, expected); + } +} diff --git a/test_vectors/aesgcm256_encryption.json b/test_vectors/aesgcm256_encryption.json new file mode 100644 index 0000000..1b27e99 --- /dev/null +++ b/test_vectors/aesgcm256_encryption.json @@ -0,0 +1,39 @@ +[ + { + "description": "Basic encryption with short plaintext", + "nonce": "000102030405060708090a0b", + "plaintext": "48656c6c6f", + "secret": "0000000000000000000000000000000000000000000000000000000000000000", + "ciphertext": "c0ae5f3e6f609000697cc7c8de2b30ce8817ca44fa" + }, + { + "description": "Empty plaintext should fail", + "nonce": "000102030405060708090a0b", + "plaintext": "", + "secret": "0000000000000000000000000000000000000000000000000000000000000000", + "ciphertext": null + }, + { + "description": "Encryption with all zeros", + "nonce": "000000000000000000000000", + "plaintext": "00000000000000000000000000000000", + "secret": "0000000000000000000000000000000000000000000000000000000000000000", + "ciphertext": "cea7403d4d606b6e074ec5d3baf39d18d0d1c8a799996bf0265b98b5d48ab919" + }, + { + "description": "Encryption with all FFs", + "nonce": "ffffffffffffffffffffffff", + "plaintext": "ffffffffffffffffffffffffffffffff", + "secret": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "ciphertext": "42c4417ae76f276beb09973a4b9b37155b3f5fe9af300dd8d2372023367d86b7" + }, + { + "description": "Longer plaintext", + "nonce": "0f1e2d3c4b5a69788796a5b4", + "plaintext": "546869732069732061206c6f6e67657220706c61696e746578742074686174207368756c6420626520656e637279707465642070726f7065726c792e", + "secret": "deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef", + "ciphertext": "ea2e3d6ac4724e3301f138b449495b9eed1f01207eb5f62d1c0e103f2237a8e459b1770a8c7b8eabf2d69922e5f767ad4de4d8d7bf737e49dd6fef6d7996158207af0edd60e87faf8a353d7c" + } +] + + diff --git a/test_vectors/content_type.json b/test_vectors/content_type.json new file mode 100644 index 0000000..d76195f --- /dev/null +++ b/test_vectors/content_type.json @@ -0,0 +1,77 @@ +[ + { + "description": "None", + "valid": true, + "content": "00" + }, + { + "description": "Bip 380", + "valid": true, + "content": "02017c" + }, + { + "description": "Bip 388", + "valid": true, + "content": "020184" + }, + { + "description": "Bip 329", + "valid": true, + "content": "020149" + }, + { + "description": "Bip 999", + "valid": true, + "content": "0203e7" + }, + { + "description": "Bip max", + "valid": true, + "content": "02ffff" + }, + { + "description": "Bip min", + "valid": true, + "content": "020000" + }, + { + "description": "Propietary 00010203", + "valid": true, + "content": "0400010203" + }, + { + "description": "Invalid BIP", + "valid": false, + "content": "0200" + }, + { + "description": "Invalid proprietary", + "valid": false, + "content": "0300" + }, + { + "description": "Invalid proprietary", + "valid": false, + "content": "030000" + }, + { + "description": "Starting with 0xFF is reserved", + "valid": false, + "content": "ff" + }, + { + "description": "Starting with 0xFF is reserved", + "valid": false, + "content": "ff000000" + }, + { + "description": "Starting with 0x01 is invalid", + "valid": false, + "content": "01" + }, + { + "description": "Starting with 0x01 is invalid", + "valid": false, + "content": "0100" + } +] diff --git a/test_vectors/derivation_path.json b/test_vectors/derivation_path.json new file mode 100644 index 0000000..2ce20db --- /dev/null +++ b/test_vectors/derivation_path.json @@ -0,0 +1,141 @@ +[ + { + "description": "Empty derivation paths", + "paths": [], + "expected": "00" + }, + { + "description": "Single path with one child: m/0", + "paths": ["m/0"], + "expected": "010100000000" + }, + { + "description": "Single path with hardened child: m/44'", + "paths": ["m/44'"], + "expected": "01018000002c" + }, + { + "description": "Standard BIP-84 path: m/84'/0'/0'", + "paths": ["m/84'/0'/0'"], + "expected": "0103800000548000000080000000" + }, + { + "description": "Mixed hardened and normal: m/0/1'/2/3'", + "paths": ["m/0/1'/2/3'"], + "expected": "010400000000800000010000000280000003" + }, + { + "description": "Multiple paths: m/0/1'/2/3' and m/84'/0'/0'/2'", + "paths": ["m/0/1'/2/3'", "m/84'/0'/0'/2'"], + "expected": "0204000000008000000100000002800000030480000054800000008000000080000002" + }, + { + "description": "Path with large indices: m/2147483647'/2147483646", + "paths": ["m/2147483647'/2147483646"], + "expected": "0102ffffffff7ffffffe" + }, + { + "description": "Single child path: m/1", + "paths": ["m/1"], + "expected": "010100000001" + }, + { + "description": "Path with max normal index: m/2147483647", + "paths": ["m/2147483647"], + "expected": "01017fffffff" + }, + { + "description": "Path with multiple normal indices: m/0/1/2/3/4", + "paths": ["m/0/1/2/3/4"], + "expected": "01050000000000000001000000020000000300000004" + }, + { + "description": "Path with all hardened: m/0'/1'/2'", + "paths": ["m/0'/1'/2'"], + "expected": "0103800000008000000180000002" + }, + { + "description": "Two different single-child paths: m/0 and m/1", + "paths": ["m/0", "m/1"], + "expected": "0201000000000100000001" + }, + { + "description": "BIP-44 account 0: m/44'/0'/0'", + "paths": ["m/44'/0'/0'"], + "expected": "01038000002c8000000080000000" + }, + { + "description": "BIP-49 account 0: m/49'/0'/0'", + "paths": ["m/49'/0'/0'"], + "expected": "0103800000318000000080000000" + }, + { + "description": "256 paths should fail (exceeds u8::MAX)", + "paths": [ + "m/0", "m/1", "m/2", "m/3", "m/4", "m/5", "m/6", "m/7", "m/8", "m/9", + "m/10", "m/11", "m/12", "m/13", "m/14", "m/15", "m/16", "m/17", "m/18", "m/19", + "m/20", "m/21", "m/22", "m/23", "m/24", "m/25", "m/26", "m/27", "m/28", "m/29", + "m/30", "m/31", "m/32", "m/33", "m/34", "m/35", "m/36", "m/37", "m/38", "m/39", + "m/40", "m/41", "m/42", "m/43", "m/44", "m/45", "m/46", "m/47", "m/48", "m/49", + "m/50", "m/51", "m/52", "m/53", "m/54", "m/55", "m/56", "m/57", "m/58", "m/59", + "m/60", "m/61", "m/62", "m/63", "m/64", "m/65", "m/66", "m/67", "m/68", "m/69", + "m/70", "m/71", "m/72", "m/73", "m/74", "m/75", "m/76", "m/77", "m/78", "m/79", + "m/80", "m/81", "m/82", "m/83", "m/84", "m/85", "m/86", "m/87", "m/88", "m/89", + "m/90", "m/91", "m/92", "m/93", "m/94", "m/95", "m/96", "m/97", "m/98", "m/99", + "m/100", "m/101", "m/102", "m/103", "m/104", "m/105", "m/106", "m/107", "m/108", "m/109", + "m/110", "m/111", "m/112", "m/113", "m/114", "m/115", "m/116", "m/117", "m/118", "m/119", + "m/120", "m/121", "m/122", "m/123", "m/124", "m/125", "m/126", "m/127", "m/128", "m/129", + "m/130", "m/131", "m/132", "m/133", "m/134", "m/135", "m/136", "m/137", "m/138", "m/139", + "m/140", "m/141", "m/142", "m/143", "m/144", "m/145", "m/146", "m/147", "m/148", "m/149", + "m/150", "m/151", "m/152", "m/153", "m/154", "m/155", "m/156", "m/157", "m/158", "m/159", + "m/160", "m/161", "m/162", "m/163", "m/164", "m/165", "m/166", "m/167", "m/168", "m/169", + "m/170", "m/171", "m/172", "m/173", "m/174", "m/175", "m/176", "m/177", "m/178", "m/179", + "m/180", "m/181", "m/182", "m/183", "m/184", "m/185", "m/186", "m/187", "m/188", "m/189", + "m/190", "m/191", "m/192", "m/193", "m/194", "m/195", "m/196", "m/197", "m/198", "m/199", + "m/200", "m/201", "m/202", "m/203", "m/204", "m/205", "m/206", "m/207", "m/208", "m/209", + "m/210", "m/211", "m/212", "m/213", "m/214", "m/215", "m/216", "m/217", "m/218", "m/219", + "m/220", "m/221", "m/222", "m/223", "m/224", "m/225", "m/226", "m/227", "m/228", "m/229", + "m/230", "m/231", "m/232", "m/233", "m/234", "m/235", "m/236", "m/237", "m/238", "m/239", + "m/240", "m/241", "m/242", "m/243", "m/244", "m/245", "m/246", "m/247", "m/248", "m/249", + "m/250", "m/251", "m/252", "m/253", "m/254", "m/255" + ], + "expected": null + }, + { + "description": "Path with 256 children should fail (exceeds u8::MAX)", + "paths": ["m/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0"], + "expected": null + }, + { + "description": "255 paths should succeed (maximum allowed)", + "paths": [ + "m/0", "m/1", "m/2", "m/3", "m/4", "m/5", "m/6", "m/7", "m/8", "m/9", + "m/10", "m/11", "m/12", "m/13", "m/14", "m/15", "m/16", "m/17", "m/18", "m/19", + "m/20", "m/21", "m/22", "m/23", "m/24", "m/25", "m/26", "m/27", "m/28", "m/29", + "m/30", "m/31", "m/32", "m/33", "m/34", "m/35", "m/36", "m/37", "m/38", "m/39", + "m/40", "m/41", "m/42", "m/43", "m/44", "m/45", "m/46", "m/47", "m/48", "m/49", + "m/50", "m/51", "m/52", "m/53", "m/54", "m/55", "m/56", "m/57", "m/58", "m/59", + "m/60", "m/61", "m/62", "m/63", "m/64", "m/65", "m/66", "m/67", "m/68", "m/69", + "m/70", "m/71", "m/72", "m/73", "m/74", "m/75", "m/76", "m/77", "m/78", "m/79", + "m/80", "m/81", "m/82", "m/83", "m/84", "m/85", "m/86", "m/87", "m/88", "m/89", + "m/90", "m/91", "m/92", "m/93", "m/94", "m/95", "m/96", "m/97", "m/98", "m/99", + "m/100", "m/101", "m/102", "m/103", "m/104", "m/105", "m/106", "m/107", "m/108", "m/109", + "m/110", "m/111", "m/112", "m/113", "m/114", "m/115", "m/116", "m/117", "m/118", "m/119", + "m/120", "m/121", "m/122", "m/123", "m/124", "m/125", "m/126", "m/127", "m/128", "m/129", + "m/130", "m/131", "m/132", "m/133", "m/134", "m/135", "m/136", "m/137", "m/138", "m/139", + "m/140", "m/141", "m/142", "m/143", "m/144", "m/145", "m/146", "m/147", "m/148", "m/149", + "m/150", "m/151", "m/152", "m/153", "m/154", "m/155", "m/156", "m/157", "m/158", "m/159", + "m/160", "m/161", "m/162", "m/163", "m/164", "m/165", "m/166", "m/167", "m/168", "m/169", + "m/170", "m/171", "m/172", "m/173", "m/174", "m/175", "m/176", "m/177", "m/178", "m/179", + "m/180", "m/181", "m/182", "m/183", "m/184", "m/185", "m/186", "m/187", "m/188", "m/189", + "m/190", "m/191", "m/192", "m/193", "m/194", "m/195", "m/196", "m/197", "m/198", "m/199", + "m/200", "m/201", "m/202", "m/203", "m/204", "m/205", "m/206", "m/207", "m/208", "m/209", + "m/210", "m/211", "m/212", "m/213", "m/214", "m/215", "m/216", "m/217", "m/218", "m/219", + "m/220", "m/221", "m/222", "m/223", "m/224", "m/225", "m/226", "m/227", "m/228", "m/229", + "m/230", "m/231", "m/232", "m/233", "m/234", "m/235", "m/236", "m/237", "m/238", "m/239", + "m/240", "m/241", "m/242", "m/243", "m/244", "m/245", "m/246", "m/247", "m/248", "m/249", + "m/250", "m/251", "m/252", "m/253", "m/254" + ], + "expected": "ff0100000000010000000101000000020100000003010000000401000000050100000006010000000701000000080100000009010000000a010000000b010000000c010000000d010000000e010000000f0100000010010000001101000000120100000013010000001401000000150100000016010000001701000000180100000019010000001a010000001b010000001c010000001d010000001e010000001f0100000020010000002101000000220100000023010000002401000000250100000026010000002701000000280100000029010000002a010000002b010000002c010000002d010000002e010000002f0100000030010000003101000000320100000033010000003401000000350100000036010000003701000000380100000039010000003a010000003b010000003c010000003d010000003e010000003f0100000040010000004101000000420100000043010000004401000000450100000046010000004701000000480100000049010000004a010000004b010000004c010000004d010000004e010000004f0100000050010000005101000000520100000053010000005401000000550100000056010000005701000000580100000059010000005a010000005b010000005c010000005d010000005e010000005f0100000060010000006101000000620100000063010000006401000000650100000066010000006701000000680100000069010000006a010000006b010000006c010000006d010000006e010000006f0100000070010000007101000000720100000073010000007401000000750100000076010000007701000000780100000079010000007a010000007b010000007c010000007d010000007e010000007f0100000080010000008101000000820100000083010000008401000000850100000086010000008701000000880100000089010000008a010000008b010000008c010000008d010000008e010000008f0100000090010000009101000000920100000093010000009401000000950100000096010000009701000000980100000099010000009a010000009b010000009c010000009d010000009e010000009f01000000a001000000a101000000a201000000a301000000a401000000a501000000a601000000a701000000a801000000a901000000aa01000000ab01000000ac01000000ad01000000ae01000000af01000000b001000000b101000000b201000000b301000000b401000000b501000000b601000000b701000000b801000000b901000000ba01000000bb01000000bc01000000bd01000000be01000000bf01000000c001000000c101000000c201000000c301000000c401000000c501000000c601000000c701000000c801000000c901000000ca01000000cb01000000cc01000000cd01000000ce01000000cf01000000d001000000d101000000d201000000d301000000d401000000d501000000d601000000d701000000d801000000d901000000da01000000db01000000dc01000000dd01000000de01000000df01000000e001000000e101000000e201000000e301000000e401000000e501000000e601000000e701000000e801000000e901000000ea01000000eb01000000ec01000000ed01000000ee01000000ef01000000f001000000f101000000f201000000f301000000f401000000f501000000f601000000f701000000f801000000f901000000fa01000000fb01000000fc01000000fd01000000fe" + } +] diff --git a/test_vectors/encrypted_backup.json b/test_vectors/encrypted_backup.json new file mode 100644 index 0000000..ffe32b7 --- /dev/null +++ b/test_vectors/encrypted_backup.json @@ -0,0 +1,57 @@ +[ + { + "description": "Single key, no derivation paths, no content metadata", + "version": 1, + "encryption": 1, + "content": "00", + "keys": [ + "02e6642fd69bd211f93f7f1f36ca51a26a5290eb2dd1b0d8279a87bb0d480c8443" + ], + "derivation_paths": [], + "plaintext": "00", + "nonce": "a1b2c3d4e5f607080910a1b2", + "expected": "42454201000152e3b41f1e01c7ed4eb3464cb36bd401538002b20402876e3e7e5be720ae189001a1b2c3d4e5f607080910a1b213a208315d1be8d22c436e1d994d13a568cca38e" + }, + { + "description": "Two keys, 1 derivation paths, BIP380 content", + "version": 1, + "encryption": 1, + "content": "02017c", + "keys": [ + "02e6642fd69bd211f93f7f1f36ca51a26a5290eb2dd1b0d8279a87bb0d480c8443", + "0384526253c27c7aef56c7b71a5cd25bebb66dddda437826defc5b2568bde81f07" + ], + "derivation_paths": ["m/48'/1'/0'/2'"], + "plaintext": "wsh(or_d(pk([9d69155f/48'/1'/0'/2']tpubDDxT9mkZzWwkKwpGT5fY6iiM9muYTPkTx6Eig8dpHR7TChuGGCWYAHVmpW1ciido5RiFWwjzYsF1GZHkEHg2nrYp3zNtx3QQRkznyLhQ77x/<0;1>/*),and_v(v:pkh([9d69155f/48'/1'/0'/2']tpubDDxT9mkZzWwkKwpGT5fY6iiM9muYTPkTx6Eig8dpHR7TChuGGCWYAHVmpW1ciido5RiFWwjzYsF1GZHkEHg2nrYp3zNtx3QQRkznyLhQ77x/<2;3>/*),older(52596))))#gx5f42wh", + "nonce": "0102030405060708090a0b0c", + "expected": "4245420101048000003080000001800000008000000202af0551aea6c8caa35cdf87909d9a01e4f0f8a68117072016f97c94088f5b70e7c404cec9efb2fc463dc54f9cd8be6387acccc5b13c9f2dc912cff447ea110f7b010102030405060708090a0b0cfd630165d3ba9e10a58f95fe47c6ec6ddb5f470325c3f0d514d21791ffd885cebdca8c1b699cbca1e2a23260a96af2c4631080a6cbe1a05ad35b5a3c9fdfb03492438fd71f49aa4ec9fd0e86a19ec6c93b509c9ac2048d7c11776a59303ed202407fffd726bce033a5b1af634b5f3d81cddbf1b82dffb471f847d8b701454d4c4a98392c3b342b64ea1f462b689dac1939ca5cdb32ea6f7dbe8562ef828c7d296af62890f8ae20ff2524b5911ce79c4a1e685f240a9ad1e23a236da7c1bbd9c59d92b667193762190ecfb5bd02d6b2e74b74bc281cf46c5a0a6dc3c7a7dc9a122586c03636f93adb5c171b87bda62c60c2b8b7bb98840a7f901df63da5e08186d7a88602a79ea1d1b9d1ea8f55bc1fee47f589e4cf2ca25daeaff1d56a218121540745bbcf2b1cff63d68c0f6b5fb53402be0f5fd012eb0882fe2cb05acedc5a93426202ce05d0d31c225a7fd9cf3beb80afed81885a029e2c89c767a32998bde574ced68e92" + }, + { + "description": "Three keys, multiple derivation paths, BIP329 content", + "version": 1, + "encryption": 1, + "content": "020149", + "keys": [ + "02e6642fd69bd211f93f7f1f36ca51a26a5290eb2dd1b0d8279a87bb0d480c8443", + "0384526253c27c7aef56c7b71a5cd25bebb66dddda437826defc5b2568bde81f07", + "03c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5" + ], + "derivation_paths": ["m/84'/0'/0'", "m/0/1'/2/3'"], + "plaintext": "{\"type\":\"tx\",\"ref\":\"f91d0a8a78462bc59398f2c5d7a84fcff491c26ba54c4833478b202796c8aafd\",\"label\":\"Transaction\",\"origin\":\"wpkh([d34db33f/84'/0'/0'])\"}\n{\"type\":\"addr\",\"ref\":\"bc1q34aq5drpuwy3wgl9lhup9892qp6svr8ldzyy7c\",\"label\":\"Address\"}\n{\"type\":\"pubkey\",\"ref\":\"0283409659355b6d1cc3c32decd5d561abaac86c37a353b52895a5e6c196d6f448\",\"label\":\"Public Key\"}\n{\"type\":\"input\",\"ref\":\"f91d0a8a78462bc59398f2c5d7a84fcff491c26ba54c4833478b202796c8aafd:0\",\"label\":\"Input\"}\n{\"type\":\"output\",\"ref\":\"f91d0a8a78462bc59398f2c5d7a84fcff491c26ba54c4833478b202796c8aafd:1\",\"label\":\"Output\",\"spendable\":false}\n{\"type\":\"xpub\",\"ref\":\"xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8\",\"label\":\"Extended Public Key\"}\n{\"type\":\"tx\",\"ref\":\"f546156d9044844e02b181026a1a407abfca62e7ea1159f87bbeaa77b4286c74\",\"label\":\"Account #1 Transaction\",\"origin\":\"wpkh([d34db33f/84'/0'/1'])\"}", + "nonce": "deadbeefcafebabe12345678", + "expected": "424542010204000000008000000100000002800000030380000054800000008000000003a8ec03dd2b01f553362627cb9fbb326ef2fd2b1f76a765e2fbe4372c36707b64c3ed9cba627bc3b6573cefc7da9f500daec9482f5d3f683d10575763533a04f8d05e74e2e9554a3fc1fd09a2570bcb05541db7e6a65f0792ee2c7c8bf6059a4b01deadbeefcafebabe12345678fd9c03fe0f78b8f3ce71fd744243d3b8b26dfc7a14fd0981175659a3eb0ef73339416b59f06629eac635d66d13d0ed75bdd34f992f067596fd55b5152c0ab26c7cbff090c815cb18c2c558071b705fd342b20dd07fae5c4ae9c32f7dd9f61cdc1570c4c945e0f84a8cd4f0a1f1499ed9403391b7a043f92fd1fa81d9f70279f75598dd300bc220a3089475463923dc3ef7c73d4476c0c5c4924c0b644f8cde6efcff8081e982fcbb5e800515ab0ad3251fdaa0f285aa540441c9deae917896fa04eab0176771ece9abecafbc726f36a99259808f96b3cdeaafc758ecd973d3c3b166d644d99aaa5a188b2886d0bcaf6125980c8803ae27799739a7be1aec0e6d0e2f941eb546e8a382768a3855054f766014539069da89ff51ade391da13f60c8d819724d421101806d56439c3314c259447878e95011f26aae3866b6474c329f0b72a489e516ed2529f74a116f453468c9e54bfcd04232a6c5fb77921a4b8d46360e81fae3c6bb9f052778086c0b49646b42160b933b7a84b029e4d51935b4b82f89472ed9d8fcc54b55cffc782341e23ba3bb6ca2de54a41cdb0e1b230feda2d7d04459d7c6875551c7c6413c0b3a8e68f77d5980d68846f05719128bf0fe6bd5a72edb1e979d631ef8a2f5decb2ec3aaeb6d979129140cc70a0aeb6b77c48988cfe996b466d7f4b85b139fcd223ae403c234163bda0dad3f5ca4db749d059b8086a764e76dfba9b1061e00aacb9508a948ba24f240ff23d588be4f6377c2a684d49fa58e2ff982441cdc3f8996086f449e3d8864a9ae9a4fb3d125c97ed64377538cfaa9c0f814cf28c9d05d89262587d81b251c2aa549eed1f32e9311e7a9df4e215f72df297d3353b0dfddf1957dec3a77c0b95f121db0197f519d920ebff08cad0309a1b11d83e8d8ca3b8de1c908cde76db404471f892dc0492e7aedc6a466519df7885a3ef7495005e6adb960914a5f7ab8c301c229fad28fc0f772b3c62866f7319be7867e6100426de6ff6bb2630ddc4a1537bfd88f3f19bec7a0e5a56b0002e707fe2ef7020d057a4604f1bb2cef272dcb0fccd7a008044d3140e23bf5432c8f9e8a26ec2cc141f6fdd4017519e94168bdab770c8d4bdc6d004dce7df5efaf43188869ec0d0f50d0df11087d9b45fd022c1cee10ed284beddbbce2547bef9abda65ef08a8bd3a37c8bab1f0ca58131412b95e29ff70d1609435b07ebe5a240726bd07434b5490b0a52dad22db3fe579b329255b4a434212f1a157a3ad6103abf2955c76635d14f2c87ce05ec26499a9d0ca5a36b10f73e6bed0" + }, + { + "description": "Single key, proprietary content (3 bytes)", + "version": 1, + "encryption": 1, + "content": "03deadbeef", + "keys": [ + "02e6642fd69bd211f93f7f1f36ca51a26a5290eb2dd1b0d8279a87bb0d480c8443" + ], + "derivation_paths": [], + "plaintext": "706c61696e74657874", + "nonce": "000102030405060708090a0b", + "expected": "42454201000152e3b41f1e01c7ed4eb3464cb36bd401538002b20402876e3e7e5be720ae189001000102030405060708090a0b26f84c8c15f2be19f27e748d2cfee936c6826c64745411034bb9508d0abf645434e686c83ffe97" + } +] diff --git a/test_vectors/encryption_secret.json b/test_vectors/encryption_secret.json new file mode 100644 index 0000000..9ae7930 --- /dev/null +++ b/test_vectors/encryption_secret.json @@ -0,0 +1,89 @@ +[ + { + "description": "Single public key", + "keys": [ + "02e6642fd69bd211f93f7f1f36ca51a26a5290eb2dd1b0d8279a87bb0d480c8443" + ], + "decryption_secret": "752a7552d8aea88ad52cd65ba4d2c1e250cf9f10b12899d9b6253bf391f18190", + "individual_secrets": [ + "52e3b41f1e01c7ed4eb3464cb36bd401538002b20402876e3e7e5be720ae1890" + ] + }, + { + "description": "Two public keys", + "keys": [ + "02e6642fd69bd211f93f7f1f36ca51a26a5290eb2dd1b0d8279a87bb0d480c8443", + "0384526253c27c7aef56c7b71a5cd25bebb66dddda437826defc5b2568bde81f07" + ], + "decryption_secret": "e3cd0f84291d9321a65adf8bcf077664af83581389b5337e9a9494535b4e967b", + "individual_secrets": [ + "c404cec9efb2fc463dc54f9cd8be6387acccc5b13c9f2dc912cff447ea110f7b", + "af0551aea6c8caa35cdf87909d9a01e4f0f8a68117072016f97c94088f5b70e7" + ] + }, + { + "description": "Three public keys", + "keys": [ + "02e6642fd69bd211f93f7f1f36ca51a26a5290eb2dd1b0d8279a87bb0d480c8443", + "0384526253c27c7aef56c7b71a5cd25bebb66dddda437826defc5b2568bde81f07", + "03c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5" + ], + "decryption_secret": "8f25c290edae9a34adb9b7dc8802278df1b2b6bdc38d7b5573bf5738872fe264", + "individual_secrets": [ + "a8ec03dd2b01f553362627cb9fbb326ef2fd2b1f76a765e2fbe4372c36707b64", + "c3ed9cba627bc3b6573cefc7da9f500daec9482f5d3f683d10575763533a04f8", + "d05e74e2e9554a3fc1fd09a2570bcb05541db7e6a65f0792ee2c7c8bf6059a4b" + ] + }, + { + "description": "Three public keys bis (different sorting)", + "keys": [ + "03c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5", + "02e6642fd69bd211f93f7f1f36ca51a26a5290eb2dd1b0d8279a87bb0d480c8443", + "0384526253c27c7aef56c7b71a5cd25bebb66dddda437826defc5b2568bde81f07" + ], + "decryption_secret": "8f25c290edae9a34adb9b7dc8802278df1b2b6bdc38d7b5573bf5738872fe264", + "individual_secrets": [ + "a8ec03dd2b01f553362627cb9fbb326ef2fd2b1f76a765e2fbe4372c36707b64", + "c3ed9cba627bc3b6573cefc7da9f500daec9482f5d3f683d10575763533a04f8", + "d05e74e2e9554a3fc1fd09a2570bcb05541db7e6a65f0792ee2c7c8bf6059a4b" + ] + }, + { + "description": "Three public keys ter (different sorting)", + "keys": [ + "0384526253c27c7aef56c7b71a5cd25bebb66dddda437826defc5b2568bde81f07", + "03c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5", + "02e6642fd69bd211f93f7f1f36ca51a26a5290eb2dd1b0d8279a87bb0d480c8443" + ], + "decryption_secret": "8f25c290edae9a34adb9b7dc8802278df1b2b6bdc38d7b5573bf5738872fe264", + "individual_secrets": [ + "a8ec03dd2b01f553362627cb9fbb326ef2fd2b1f76a765e2fbe4372c36707b64", + "c3ed9cba627bc3b6573cefc7da9f500daec9482f5d3f683d10575763533a04f8", + "d05e74e2e9554a3fc1fd09a2570bcb05541db7e6a65f0792ee2c7c8bf6059a4b" + ] + }, + { + "description": "Keys processed in sorted order", + "keys": [ + "0384526253c27c7aef56c7b71a5cd25bebb66dddda437826defc5b2568bde81f07", + "02e6642fd69bd211f93f7f1f36ca51a26a5290eb2dd1b0d8279a87bb0d480c8443" + ], + "decryption_secret": "e3cd0f84291d9321a65adf8bcf077664af83581389b5337e9a9494535b4e967b", + "individual_secrets": [ + "c404cec9efb2fc463dc54f9cd8be6387acccc5b13c9f2dc912cff447ea110f7b", + "af0551aea6c8caa35cdf87909d9a01e4f0f8a68117072016f97c94088f5b70e7" + ] + }, + { + "description": "Duplicate keys should be handled", + "keys": [ + "02e6642fd69bd211f93f7f1f36ca51a26a5290eb2dd1b0d8279a87bb0d480c8443", + "02e6642fd69bd211f93f7f1f36ca51a26a5290eb2dd1b0d8279a87bb0d480c8443" + ], + "decryption_secret": "752a7552d8aea88ad52cd65ba4d2c1e250cf9f10b12899d9b6253bf391f18190", + "individual_secrets": [ + "52e3b41f1e01c7ed4eb3464cb36bd401538002b20402876e3e7e5be720ae1890" + ] + } +] diff --git a/test_vectors/individual_secrets.json b/test_vectors/individual_secrets.json new file mode 100644 index 0000000..8e4f1a4 --- /dev/null +++ b/test_vectors/individual_secrets.json @@ -0,0 +1,554 @@ +[ + { + "description": "Single secret", + "secrets": [ + "0000000000000000000000000000000000000000000000000000000000000000" + ], + "expected": "010000000000000000000000000000000000000000000000000000000000000000" + }, + { + "description": "Two different secrets", + "secrets": [ + "0000000000000000000000000000000000000000000000000000000000000000", + "0101010101010101010101010101010101010101010101010101010101010101" + ], + "expected": "0200000000000000000000000000000000000000000000000000000000000000000101010101010101010101010101010101010101010101010101010101010101" + }, + { + "description": "Three secrets with different patterns", + "secrets": [ + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "0000000000000000000000000000000000000000000000000000000000000000", + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + ], + "expected": "030000000000000000000000000000000000000000000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + }, + { + "description": "Empty secrets should fail", + "secrets": [], + "expected": null + }, + { + "description": "256 secrets should fail (exceeds u8::MAX)", + "secrets": [ + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000001", + "0000000000000000000000000000000000000000000000000000000000000002", + "0000000000000000000000000000000000000000000000000000000000000003", + "0000000000000000000000000000000000000000000000000000000000000004", + "0000000000000000000000000000000000000000000000000000000000000005", + "0000000000000000000000000000000000000000000000000000000000000006", + "0000000000000000000000000000000000000000000000000000000000000007", + "0000000000000000000000000000000000000000000000000000000000000008", + "0000000000000000000000000000000000000000000000000000000000000009", + "000000000000000000000000000000000000000000000000000000000000000a", + "000000000000000000000000000000000000000000000000000000000000000b", + "000000000000000000000000000000000000000000000000000000000000000c", + "000000000000000000000000000000000000000000000000000000000000000d", + "000000000000000000000000000000000000000000000000000000000000000e", + "000000000000000000000000000000000000000000000000000000000000000f", + "0000000000000000000000000000000000000000000000000000000000000010", + "0000000000000000000000000000000000000000000000000000000000000011", + "0000000000000000000000000000000000000000000000000000000000000012", + "0000000000000000000000000000000000000000000000000000000000000013", + "0000000000000000000000000000000000000000000000000000000000000014", + "0000000000000000000000000000000000000000000000000000000000000015", + "0000000000000000000000000000000000000000000000000000000000000016", + "0000000000000000000000000000000000000000000000000000000000000017", + "0000000000000000000000000000000000000000000000000000000000000018", + "0000000000000000000000000000000000000000000000000000000000000019", + "000000000000000000000000000000000000000000000000000000000000001a", + "000000000000000000000000000000000000000000000000000000000000001b", + "000000000000000000000000000000000000000000000000000000000000001c", + "000000000000000000000000000000000000000000000000000000000000001d", + "000000000000000000000000000000000000000000000000000000000000001e", + "000000000000000000000000000000000000000000000000000000000000001f", + "0000000000000000000000000000000000000000000000000000000000000020", + "0000000000000000000000000000000000000000000000000000000000000021", + "0000000000000000000000000000000000000000000000000000000000000022", + "0000000000000000000000000000000000000000000000000000000000000023", + "0000000000000000000000000000000000000000000000000000000000000024", + "0000000000000000000000000000000000000000000000000000000000000025", + "0000000000000000000000000000000000000000000000000000000000000026", + "0000000000000000000000000000000000000000000000000000000000000027", + "0000000000000000000000000000000000000000000000000000000000000028", + "0000000000000000000000000000000000000000000000000000000000000029", + "000000000000000000000000000000000000000000000000000000000000002a", + "000000000000000000000000000000000000000000000000000000000000002b", + "000000000000000000000000000000000000000000000000000000000000002c", + "000000000000000000000000000000000000000000000000000000000000002d", + "000000000000000000000000000000000000000000000000000000000000002e", + "000000000000000000000000000000000000000000000000000000000000002f", + "0000000000000000000000000000000000000000000000000000000000000030", + "0000000000000000000000000000000000000000000000000000000000000031", + "0000000000000000000000000000000000000000000000000000000000000032", + "0000000000000000000000000000000000000000000000000000000000000033", + "0000000000000000000000000000000000000000000000000000000000000034", + "0000000000000000000000000000000000000000000000000000000000000035", + "0000000000000000000000000000000000000000000000000000000000000036", + "0000000000000000000000000000000000000000000000000000000000000037", + "0000000000000000000000000000000000000000000000000000000000000038", + "0000000000000000000000000000000000000000000000000000000000000039", + "000000000000000000000000000000000000000000000000000000000000003a", + "000000000000000000000000000000000000000000000000000000000000003b", + "000000000000000000000000000000000000000000000000000000000000003c", + "000000000000000000000000000000000000000000000000000000000000003d", + "000000000000000000000000000000000000000000000000000000000000003e", + "000000000000000000000000000000000000000000000000000000000000003f", + "0000000000000000000000000000000000000000000000000000000000000040", + "0000000000000000000000000000000000000000000000000000000000000041", + "0000000000000000000000000000000000000000000000000000000000000042", + "0000000000000000000000000000000000000000000000000000000000000043", + "0000000000000000000000000000000000000000000000000000000000000044", + "0000000000000000000000000000000000000000000000000000000000000045", + "0000000000000000000000000000000000000000000000000000000000000046", + "0000000000000000000000000000000000000000000000000000000000000047", + "0000000000000000000000000000000000000000000000000000000000000048", + "0000000000000000000000000000000000000000000000000000000000000049", + "000000000000000000000000000000000000000000000000000000000000004a", + "000000000000000000000000000000000000000000000000000000000000004b", + "000000000000000000000000000000000000000000000000000000000000004c", + "000000000000000000000000000000000000000000000000000000000000004d", + "000000000000000000000000000000000000000000000000000000000000004e", + "000000000000000000000000000000000000000000000000000000000000004f", + "0000000000000000000000000000000000000000000000000000000000000050", + "0000000000000000000000000000000000000000000000000000000000000051", + "0000000000000000000000000000000000000000000000000000000000000052", + "0000000000000000000000000000000000000000000000000000000000000053", + "0000000000000000000000000000000000000000000000000000000000000054", + "0000000000000000000000000000000000000000000000000000000000000055", + "0000000000000000000000000000000000000000000000000000000000000056", + "0000000000000000000000000000000000000000000000000000000000000057", + "0000000000000000000000000000000000000000000000000000000000000058", + "0000000000000000000000000000000000000000000000000000000000000059", + "000000000000000000000000000000000000000000000000000000000000005a", + "000000000000000000000000000000000000000000000000000000000000005b", + "000000000000000000000000000000000000000000000000000000000000005c", + "000000000000000000000000000000000000000000000000000000000000005d", + "000000000000000000000000000000000000000000000000000000000000005e", + "000000000000000000000000000000000000000000000000000000000000005f", + "0000000000000000000000000000000000000000000000000000000000000060", + "0000000000000000000000000000000000000000000000000000000000000061", + "0000000000000000000000000000000000000000000000000000000000000062", + "0000000000000000000000000000000000000000000000000000000000000063", + "0000000000000000000000000000000000000000000000000000000000000064", + "0000000000000000000000000000000000000000000000000000000000000065", + "0000000000000000000000000000000000000000000000000000000000000066", + "0000000000000000000000000000000000000000000000000000000000000067", + "0000000000000000000000000000000000000000000000000000000000000068", + "0000000000000000000000000000000000000000000000000000000000000069", + "000000000000000000000000000000000000000000000000000000000000006a", + "000000000000000000000000000000000000000000000000000000000000006b", + "000000000000000000000000000000000000000000000000000000000000006c", + "000000000000000000000000000000000000000000000000000000000000006d", + "000000000000000000000000000000000000000000000000000000000000006e", + "000000000000000000000000000000000000000000000000000000000000006f", + "0000000000000000000000000000000000000000000000000000000000000070", + "0000000000000000000000000000000000000000000000000000000000000071", + "0000000000000000000000000000000000000000000000000000000000000072", + "0000000000000000000000000000000000000000000000000000000000000073", + "0000000000000000000000000000000000000000000000000000000000000074", + "0000000000000000000000000000000000000000000000000000000000000075", + "0000000000000000000000000000000000000000000000000000000000000076", + "0000000000000000000000000000000000000000000000000000000000000077", + "0000000000000000000000000000000000000000000000000000000000000078", + "0000000000000000000000000000000000000000000000000000000000000079", + "000000000000000000000000000000000000000000000000000000000000007a", + "000000000000000000000000000000000000000000000000000000000000007b", + "000000000000000000000000000000000000000000000000000000000000007c", + "000000000000000000000000000000000000000000000000000000000000007d", + "000000000000000000000000000000000000000000000000000000000000007e", + "000000000000000000000000000000000000000000000000000000000000007f", + "0000000000000000000000000000000000000000000000000000000000000080", + "0000000000000000000000000000000000000000000000000000000000000081", + "0000000000000000000000000000000000000000000000000000000000000082", + "0000000000000000000000000000000000000000000000000000000000000083", + "0000000000000000000000000000000000000000000000000000000000000084", + "0000000000000000000000000000000000000000000000000000000000000085", + "0000000000000000000000000000000000000000000000000000000000000086", + "0000000000000000000000000000000000000000000000000000000000000087", + "0000000000000000000000000000000000000000000000000000000000000088", + "0000000000000000000000000000000000000000000000000000000000000089", + "000000000000000000000000000000000000000000000000000000000000008a", + "000000000000000000000000000000000000000000000000000000000000008b", + "000000000000000000000000000000000000000000000000000000000000008c", + "000000000000000000000000000000000000000000000000000000000000008d", + "000000000000000000000000000000000000000000000000000000000000008e", + "000000000000000000000000000000000000000000000000000000000000008f", + "0000000000000000000000000000000000000000000000000000000000000090", + "0000000000000000000000000000000000000000000000000000000000000091", + "0000000000000000000000000000000000000000000000000000000000000092", + "0000000000000000000000000000000000000000000000000000000000000093", + "0000000000000000000000000000000000000000000000000000000000000094", + "0000000000000000000000000000000000000000000000000000000000000095", + "0000000000000000000000000000000000000000000000000000000000000096", + "0000000000000000000000000000000000000000000000000000000000000097", + "0000000000000000000000000000000000000000000000000000000000000098", + "0000000000000000000000000000000000000000000000000000000000000099", + "000000000000000000000000000000000000000000000000000000000000009a", + "000000000000000000000000000000000000000000000000000000000000009b", + "000000000000000000000000000000000000000000000000000000000000009c", + "000000000000000000000000000000000000000000000000000000000000009d", + "000000000000000000000000000000000000000000000000000000000000009e", + "000000000000000000000000000000000000000000000000000000000000009f", + "00000000000000000000000000000000000000000000000000000000000000a0", + "00000000000000000000000000000000000000000000000000000000000000a1", + "00000000000000000000000000000000000000000000000000000000000000a2", + "00000000000000000000000000000000000000000000000000000000000000a3", + "00000000000000000000000000000000000000000000000000000000000000a4", + "00000000000000000000000000000000000000000000000000000000000000a5", + "00000000000000000000000000000000000000000000000000000000000000a6", + "00000000000000000000000000000000000000000000000000000000000000a7", + "00000000000000000000000000000000000000000000000000000000000000a8", + "00000000000000000000000000000000000000000000000000000000000000a9", + "00000000000000000000000000000000000000000000000000000000000000aa", + "00000000000000000000000000000000000000000000000000000000000000ab", + "00000000000000000000000000000000000000000000000000000000000000ac", + "00000000000000000000000000000000000000000000000000000000000000ad", + "00000000000000000000000000000000000000000000000000000000000000ae", + "00000000000000000000000000000000000000000000000000000000000000af", + "00000000000000000000000000000000000000000000000000000000000000b0", + "00000000000000000000000000000000000000000000000000000000000000b1", + "00000000000000000000000000000000000000000000000000000000000000b2", + "00000000000000000000000000000000000000000000000000000000000000b3", + "00000000000000000000000000000000000000000000000000000000000000b4", + "00000000000000000000000000000000000000000000000000000000000000b5", + "00000000000000000000000000000000000000000000000000000000000000b6", + "00000000000000000000000000000000000000000000000000000000000000b7", + "00000000000000000000000000000000000000000000000000000000000000b8", + "00000000000000000000000000000000000000000000000000000000000000b9", + "00000000000000000000000000000000000000000000000000000000000000ba", + "00000000000000000000000000000000000000000000000000000000000000bb", + "00000000000000000000000000000000000000000000000000000000000000bc", + "00000000000000000000000000000000000000000000000000000000000000bd", + "00000000000000000000000000000000000000000000000000000000000000be", + "00000000000000000000000000000000000000000000000000000000000000bf", + "00000000000000000000000000000000000000000000000000000000000000c0", + "00000000000000000000000000000000000000000000000000000000000000c1", + "00000000000000000000000000000000000000000000000000000000000000c2", + "00000000000000000000000000000000000000000000000000000000000000c3", + "00000000000000000000000000000000000000000000000000000000000000c4", + "00000000000000000000000000000000000000000000000000000000000000c5", + "00000000000000000000000000000000000000000000000000000000000000c6", + "00000000000000000000000000000000000000000000000000000000000000c7", + "00000000000000000000000000000000000000000000000000000000000000c8", + "00000000000000000000000000000000000000000000000000000000000000c9", + "00000000000000000000000000000000000000000000000000000000000000ca", + "00000000000000000000000000000000000000000000000000000000000000cb", + "00000000000000000000000000000000000000000000000000000000000000cc", + "00000000000000000000000000000000000000000000000000000000000000cd", + "00000000000000000000000000000000000000000000000000000000000000ce", + "00000000000000000000000000000000000000000000000000000000000000cf", + "00000000000000000000000000000000000000000000000000000000000000d0", + "00000000000000000000000000000000000000000000000000000000000000d1", + "00000000000000000000000000000000000000000000000000000000000000d2", + "00000000000000000000000000000000000000000000000000000000000000d3", + "00000000000000000000000000000000000000000000000000000000000000d4", + "00000000000000000000000000000000000000000000000000000000000000d5", + "00000000000000000000000000000000000000000000000000000000000000d6", + "00000000000000000000000000000000000000000000000000000000000000d7", + "00000000000000000000000000000000000000000000000000000000000000d8", + "00000000000000000000000000000000000000000000000000000000000000d9", + "00000000000000000000000000000000000000000000000000000000000000da", + "00000000000000000000000000000000000000000000000000000000000000db", + "00000000000000000000000000000000000000000000000000000000000000dc", + "00000000000000000000000000000000000000000000000000000000000000dd", + "00000000000000000000000000000000000000000000000000000000000000de", + "00000000000000000000000000000000000000000000000000000000000000df", + "00000000000000000000000000000000000000000000000000000000000000e0", + "00000000000000000000000000000000000000000000000000000000000000e1", + "00000000000000000000000000000000000000000000000000000000000000e2", + "00000000000000000000000000000000000000000000000000000000000000e3", + "00000000000000000000000000000000000000000000000000000000000000e4", + "00000000000000000000000000000000000000000000000000000000000000e5", + "00000000000000000000000000000000000000000000000000000000000000e6", + "00000000000000000000000000000000000000000000000000000000000000e7", + "00000000000000000000000000000000000000000000000000000000000000e8", + "00000000000000000000000000000000000000000000000000000000000000e9", + "00000000000000000000000000000000000000000000000000000000000000ea", + "00000000000000000000000000000000000000000000000000000000000000eb", + "00000000000000000000000000000000000000000000000000000000000000ec", + "00000000000000000000000000000000000000000000000000000000000000ed", + "00000000000000000000000000000000000000000000000000000000000000ee", + "00000000000000000000000000000000000000000000000000000000000000ef", + "00000000000000000000000000000000000000000000000000000000000000f0", + "00000000000000000000000000000000000000000000000000000000000000f1", + "00000000000000000000000000000000000000000000000000000000000000f2", + "00000000000000000000000000000000000000000000000000000000000000f3", + "00000000000000000000000000000000000000000000000000000000000000f4", + "00000000000000000000000000000000000000000000000000000000000000f5", + "00000000000000000000000000000000000000000000000000000000000000f6", + "00000000000000000000000000000000000000000000000000000000000000f7", + "00000000000000000000000000000000000000000000000000000000000000f8", + "00000000000000000000000000000000000000000000000000000000000000f9", + "00000000000000000000000000000000000000000000000000000000000000fa", + "00000000000000000000000000000000000000000000000000000000000000fb", + "00000000000000000000000000000000000000000000000000000000000000fc", + "00000000000000000000000000000000000000000000000000000000000000fd", + "00000000000000000000000000000000000000000000000000000000000000fe", + "00000000000000000000000000000000000000000000000000000000000000ff" + ], + "expected": null + }, + { + "description": "256 secrets should pass)", + "secrets": [ + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000001", + "0000000000000000000000000000000000000000000000000000000000000002", + "0000000000000000000000000000000000000000000000000000000000000003", + "0000000000000000000000000000000000000000000000000000000000000004", + "0000000000000000000000000000000000000000000000000000000000000005", + "0000000000000000000000000000000000000000000000000000000000000006", + "0000000000000000000000000000000000000000000000000000000000000007", + "0000000000000000000000000000000000000000000000000000000000000008", + "0000000000000000000000000000000000000000000000000000000000000009", + "000000000000000000000000000000000000000000000000000000000000000a", + "000000000000000000000000000000000000000000000000000000000000000b", + "000000000000000000000000000000000000000000000000000000000000000c", + "000000000000000000000000000000000000000000000000000000000000000d", + "000000000000000000000000000000000000000000000000000000000000000e", + "000000000000000000000000000000000000000000000000000000000000000f", + "0000000000000000000000000000000000000000000000000000000000000010", + "0000000000000000000000000000000000000000000000000000000000000011", + "0000000000000000000000000000000000000000000000000000000000000012", + "0000000000000000000000000000000000000000000000000000000000000013", + "0000000000000000000000000000000000000000000000000000000000000014", + "0000000000000000000000000000000000000000000000000000000000000015", + "0000000000000000000000000000000000000000000000000000000000000016", + "0000000000000000000000000000000000000000000000000000000000000017", + "0000000000000000000000000000000000000000000000000000000000000018", + "0000000000000000000000000000000000000000000000000000000000000019", + "000000000000000000000000000000000000000000000000000000000000001a", + "000000000000000000000000000000000000000000000000000000000000001b", + "000000000000000000000000000000000000000000000000000000000000001c", + "000000000000000000000000000000000000000000000000000000000000001d", + "000000000000000000000000000000000000000000000000000000000000001e", + "000000000000000000000000000000000000000000000000000000000000001f", + "0000000000000000000000000000000000000000000000000000000000000020", + "0000000000000000000000000000000000000000000000000000000000000021", + "0000000000000000000000000000000000000000000000000000000000000022", + "0000000000000000000000000000000000000000000000000000000000000023", + "0000000000000000000000000000000000000000000000000000000000000024", + "0000000000000000000000000000000000000000000000000000000000000025", + "0000000000000000000000000000000000000000000000000000000000000026", + "0000000000000000000000000000000000000000000000000000000000000027", + "0000000000000000000000000000000000000000000000000000000000000028", + "0000000000000000000000000000000000000000000000000000000000000029", + "000000000000000000000000000000000000000000000000000000000000002a", + "000000000000000000000000000000000000000000000000000000000000002b", + "000000000000000000000000000000000000000000000000000000000000002c", + "000000000000000000000000000000000000000000000000000000000000002d", + "000000000000000000000000000000000000000000000000000000000000002e", + "000000000000000000000000000000000000000000000000000000000000002f", + "0000000000000000000000000000000000000000000000000000000000000030", + "0000000000000000000000000000000000000000000000000000000000000031", + "0000000000000000000000000000000000000000000000000000000000000032", + "0000000000000000000000000000000000000000000000000000000000000033", + "0000000000000000000000000000000000000000000000000000000000000034", + "0000000000000000000000000000000000000000000000000000000000000035", + "0000000000000000000000000000000000000000000000000000000000000036", + "0000000000000000000000000000000000000000000000000000000000000037", + "0000000000000000000000000000000000000000000000000000000000000038", + "0000000000000000000000000000000000000000000000000000000000000039", + "000000000000000000000000000000000000000000000000000000000000003a", + "000000000000000000000000000000000000000000000000000000000000003b", + "000000000000000000000000000000000000000000000000000000000000003c", + "000000000000000000000000000000000000000000000000000000000000003d", + "000000000000000000000000000000000000000000000000000000000000003e", + "000000000000000000000000000000000000000000000000000000000000003f", + "0000000000000000000000000000000000000000000000000000000000000040", + "0000000000000000000000000000000000000000000000000000000000000041", + "0000000000000000000000000000000000000000000000000000000000000042", + "0000000000000000000000000000000000000000000000000000000000000043", + "0000000000000000000000000000000000000000000000000000000000000044", + "0000000000000000000000000000000000000000000000000000000000000045", + "0000000000000000000000000000000000000000000000000000000000000046", + "0000000000000000000000000000000000000000000000000000000000000047", + "0000000000000000000000000000000000000000000000000000000000000048", + "0000000000000000000000000000000000000000000000000000000000000049", + "000000000000000000000000000000000000000000000000000000000000004a", + "000000000000000000000000000000000000000000000000000000000000004b", + "000000000000000000000000000000000000000000000000000000000000004c", + "000000000000000000000000000000000000000000000000000000000000004d", + "000000000000000000000000000000000000000000000000000000000000004e", + "000000000000000000000000000000000000000000000000000000000000004f", + "0000000000000000000000000000000000000000000000000000000000000050", + "0000000000000000000000000000000000000000000000000000000000000051", + "0000000000000000000000000000000000000000000000000000000000000052", + "0000000000000000000000000000000000000000000000000000000000000053", + "0000000000000000000000000000000000000000000000000000000000000054", + "0000000000000000000000000000000000000000000000000000000000000055", + "0000000000000000000000000000000000000000000000000000000000000056", + "0000000000000000000000000000000000000000000000000000000000000057", + "0000000000000000000000000000000000000000000000000000000000000058", + "0000000000000000000000000000000000000000000000000000000000000059", + "000000000000000000000000000000000000000000000000000000000000005a", + "000000000000000000000000000000000000000000000000000000000000005b", + "000000000000000000000000000000000000000000000000000000000000005c", + "000000000000000000000000000000000000000000000000000000000000005d", + "000000000000000000000000000000000000000000000000000000000000005e", + "000000000000000000000000000000000000000000000000000000000000005f", + "0000000000000000000000000000000000000000000000000000000000000060", + "0000000000000000000000000000000000000000000000000000000000000061", + "0000000000000000000000000000000000000000000000000000000000000062", + "0000000000000000000000000000000000000000000000000000000000000063", + "0000000000000000000000000000000000000000000000000000000000000064", + "0000000000000000000000000000000000000000000000000000000000000065", + "0000000000000000000000000000000000000000000000000000000000000066", + "0000000000000000000000000000000000000000000000000000000000000067", + "0000000000000000000000000000000000000000000000000000000000000068", + "0000000000000000000000000000000000000000000000000000000000000069", + "000000000000000000000000000000000000000000000000000000000000006a", + "000000000000000000000000000000000000000000000000000000000000006b", + "000000000000000000000000000000000000000000000000000000000000006c", + "000000000000000000000000000000000000000000000000000000000000006d", + "000000000000000000000000000000000000000000000000000000000000006e", + "000000000000000000000000000000000000000000000000000000000000006f", + "0000000000000000000000000000000000000000000000000000000000000070", + "0000000000000000000000000000000000000000000000000000000000000071", + "0000000000000000000000000000000000000000000000000000000000000072", + "0000000000000000000000000000000000000000000000000000000000000073", + "0000000000000000000000000000000000000000000000000000000000000074", + "0000000000000000000000000000000000000000000000000000000000000075", + "0000000000000000000000000000000000000000000000000000000000000076", + "0000000000000000000000000000000000000000000000000000000000000077", + "0000000000000000000000000000000000000000000000000000000000000078", + "0000000000000000000000000000000000000000000000000000000000000079", + "000000000000000000000000000000000000000000000000000000000000007a", + "000000000000000000000000000000000000000000000000000000000000007b", + "000000000000000000000000000000000000000000000000000000000000007c", + "000000000000000000000000000000000000000000000000000000000000007d", + "000000000000000000000000000000000000000000000000000000000000007e", + "000000000000000000000000000000000000000000000000000000000000007f", + "0000000000000000000000000000000000000000000000000000000000000080", + "0000000000000000000000000000000000000000000000000000000000000081", + "0000000000000000000000000000000000000000000000000000000000000082", + "0000000000000000000000000000000000000000000000000000000000000083", + "0000000000000000000000000000000000000000000000000000000000000084", + "0000000000000000000000000000000000000000000000000000000000000085", + "0000000000000000000000000000000000000000000000000000000000000086", + "0000000000000000000000000000000000000000000000000000000000000087", + "0000000000000000000000000000000000000000000000000000000000000088", + "0000000000000000000000000000000000000000000000000000000000000089", + "000000000000000000000000000000000000000000000000000000000000008a", + "000000000000000000000000000000000000000000000000000000000000008b", + "000000000000000000000000000000000000000000000000000000000000008c", + "000000000000000000000000000000000000000000000000000000000000008d", + "000000000000000000000000000000000000000000000000000000000000008e", + "000000000000000000000000000000000000000000000000000000000000008f", + "0000000000000000000000000000000000000000000000000000000000000090", + "0000000000000000000000000000000000000000000000000000000000000091", + "0000000000000000000000000000000000000000000000000000000000000092", + "0000000000000000000000000000000000000000000000000000000000000093", + "0000000000000000000000000000000000000000000000000000000000000094", + "0000000000000000000000000000000000000000000000000000000000000095", + "0000000000000000000000000000000000000000000000000000000000000096", + "0000000000000000000000000000000000000000000000000000000000000097", + "0000000000000000000000000000000000000000000000000000000000000098", + "0000000000000000000000000000000000000000000000000000000000000099", + "000000000000000000000000000000000000000000000000000000000000009a", + "000000000000000000000000000000000000000000000000000000000000009b", + "000000000000000000000000000000000000000000000000000000000000009c", + "000000000000000000000000000000000000000000000000000000000000009d", + "000000000000000000000000000000000000000000000000000000000000009e", + "000000000000000000000000000000000000000000000000000000000000009f", + "00000000000000000000000000000000000000000000000000000000000000a0", + "00000000000000000000000000000000000000000000000000000000000000a1", + "00000000000000000000000000000000000000000000000000000000000000a2", + "00000000000000000000000000000000000000000000000000000000000000a3", + "00000000000000000000000000000000000000000000000000000000000000a4", + "00000000000000000000000000000000000000000000000000000000000000a5", + "00000000000000000000000000000000000000000000000000000000000000a6", + "00000000000000000000000000000000000000000000000000000000000000a7", + "00000000000000000000000000000000000000000000000000000000000000a8", + "00000000000000000000000000000000000000000000000000000000000000a9", + "00000000000000000000000000000000000000000000000000000000000000aa", + "00000000000000000000000000000000000000000000000000000000000000ab", + "00000000000000000000000000000000000000000000000000000000000000ac", + "00000000000000000000000000000000000000000000000000000000000000ad", + "00000000000000000000000000000000000000000000000000000000000000ae", + "00000000000000000000000000000000000000000000000000000000000000af", + "00000000000000000000000000000000000000000000000000000000000000b0", + "00000000000000000000000000000000000000000000000000000000000000b1", + "00000000000000000000000000000000000000000000000000000000000000b2", + "00000000000000000000000000000000000000000000000000000000000000b3", + "00000000000000000000000000000000000000000000000000000000000000b4", + "00000000000000000000000000000000000000000000000000000000000000b5", + "00000000000000000000000000000000000000000000000000000000000000b6", + "00000000000000000000000000000000000000000000000000000000000000b7", + "00000000000000000000000000000000000000000000000000000000000000b8", + "00000000000000000000000000000000000000000000000000000000000000b9", + "00000000000000000000000000000000000000000000000000000000000000ba", + "00000000000000000000000000000000000000000000000000000000000000bb", + "00000000000000000000000000000000000000000000000000000000000000bc", + "00000000000000000000000000000000000000000000000000000000000000bd", + "00000000000000000000000000000000000000000000000000000000000000be", + "00000000000000000000000000000000000000000000000000000000000000bf", + "00000000000000000000000000000000000000000000000000000000000000c0", + "00000000000000000000000000000000000000000000000000000000000000c1", + "00000000000000000000000000000000000000000000000000000000000000c2", + "00000000000000000000000000000000000000000000000000000000000000c3", + "00000000000000000000000000000000000000000000000000000000000000c4", + "00000000000000000000000000000000000000000000000000000000000000c5", + "00000000000000000000000000000000000000000000000000000000000000c6", + "00000000000000000000000000000000000000000000000000000000000000c7", + "00000000000000000000000000000000000000000000000000000000000000c8", + "00000000000000000000000000000000000000000000000000000000000000c9", + "00000000000000000000000000000000000000000000000000000000000000ca", + "00000000000000000000000000000000000000000000000000000000000000cb", + "00000000000000000000000000000000000000000000000000000000000000cc", + "00000000000000000000000000000000000000000000000000000000000000cd", + "00000000000000000000000000000000000000000000000000000000000000ce", + "00000000000000000000000000000000000000000000000000000000000000cf", + "00000000000000000000000000000000000000000000000000000000000000d0", + "00000000000000000000000000000000000000000000000000000000000000d1", + "00000000000000000000000000000000000000000000000000000000000000d2", + "00000000000000000000000000000000000000000000000000000000000000d3", + "00000000000000000000000000000000000000000000000000000000000000d4", + "00000000000000000000000000000000000000000000000000000000000000d5", + "00000000000000000000000000000000000000000000000000000000000000d6", + "00000000000000000000000000000000000000000000000000000000000000d7", + "00000000000000000000000000000000000000000000000000000000000000d8", + "00000000000000000000000000000000000000000000000000000000000000d9", + "00000000000000000000000000000000000000000000000000000000000000da", + "00000000000000000000000000000000000000000000000000000000000000db", + "00000000000000000000000000000000000000000000000000000000000000dc", + "00000000000000000000000000000000000000000000000000000000000000dd", + "00000000000000000000000000000000000000000000000000000000000000de", + "00000000000000000000000000000000000000000000000000000000000000df", + "00000000000000000000000000000000000000000000000000000000000000e0", + "00000000000000000000000000000000000000000000000000000000000000e1", + "00000000000000000000000000000000000000000000000000000000000000e2", + "00000000000000000000000000000000000000000000000000000000000000e3", + "00000000000000000000000000000000000000000000000000000000000000e4", + "00000000000000000000000000000000000000000000000000000000000000e5", + "00000000000000000000000000000000000000000000000000000000000000e6", + "00000000000000000000000000000000000000000000000000000000000000e7", + "00000000000000000000000000000000000000000000000000000000000000e8", + "00000000000000000000000000000000000000000000000000000000000000e9", + "00000000000000000000000000000000000000000000000000000000000000ea", + "00000000000000000000000000000000000000000000000000000000000000eb", + "00000000000000000000000000000000000000000000000000000000000000ec", + "00000000000000000000000000000000000000000000000000000000000000ed", + "00000000000000000000000000000000000000000000000000000000000000ee", + "00000000000000000000000000000000000000000000000000000000000000ef", + "00000000000000000000000000000000000000000000000000000000000000f0", + "00000000000000000000000000000000000000000000000000000000000000f1", + "00000000000000000000000000000000000000000000000000000000000000f2", + "00000000000000000000000000000000000000000000000000000000000000f3", + "00000000000000000000000000000000000000000000000000000000000000f4", + "00000000000000000000000000000000000000000000000000000000000000f5", + "00000000000000000000000000000000000000000000000000000000000000f6", + "00000000000000000000000000000000000000000000000000000000000000f7", + "00000000000000000000000000000000000000000000000000000000000000f8", + "00000000000000000000000000000000000000000000000000000000000000f9", + "00000000000000000000000000000000000000000000000000000000000000fa", + "00000000000000000000000000000000000000000000000000000000000000fb", + "00000000000000000000000000000000000000000000000000000000000000fc", + "00000000000000000000000000000000000000000000000000000000000000fd", + "00000000000000000000000000000000000000000000000000000000000000fe" + ], + "expected": "ff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001100000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000150000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001b000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000001f0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002100000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000023000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000250000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002700000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000029000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000002f0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000033000000000000000000000000000000000000000000000000000000000000003400000000000000000000000000000000000000000000000000000000000000350000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000003700000000000000000000000000000000000000000000000000000000000000380000000000000000000000000000000000000000000000000000000000000039000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000003b000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000003d000000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000003f0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004100000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000000000000000000000000000043000000000000000000000000000000000000000000000000000000000000004400000000000000000000000000000000000000000000000000000000000000450000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000004700000000000000000000000000000000000000000000000000000000000000480000000000000000000000000000000000000000000000000000000000000049000000000000000000000000000000000000000000000000000000000000004a000000000000000000000000000000000000000000000000000000000000004b000000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000004d000000000000000000000000000000000000000000000000000000000000004e000000000000000000000000000000000000000000000000000000000000004f0000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000005100000000000000000000000000000000000000000000000000000000000000520000000000000000000000000000000000000000000000000000000000000053000000000000000000000000000000000000000000000000000000000000005400000000000000000000000000000000000000000000000000000000000000550000000000000000000000000000000000000000000000000000000000000056000000000000000000000000000000000000000000000000000000000000005700000000000000000000000000000000000000000000000000000000000000580000000000000000000000000000000000000000000000000000000000000059000000000000000000000000000000000000000000000000000000000000005a000000000000000000000000000000000000000000000000000000000000005b000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000005d000000000000000000000000000000000000000000000000000000000000005e000000000000000000000000000000000000000000000000000000000000005f0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000006100000000000000000000000000000000000000000000000000000000000000620000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000650000000000000000000000000000000000000000000000000000000000000066000000000000000000000000000000000000000000000000000000000000006700000000000000000000000000000000000000000000000000000000000000680000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000006b000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000006d000000000000000000000000000000000000000000000000000000000000006e000000000000000000000000000000000000000000000000000000000000006f0000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000007100000000000000000000000000000000000000000000000000000000000000720000000000000000000000000000000000000000000000000000000000000073000000000000000000000000000000000000000000000000000000000000007400000000000000000000000000000000000000000000000000000000000000750000000000000000000000000000000000000000000000000000000000000076000000000000000000000000000000000000000000000000000000000000007700000000000000000000000000000000000000000000000000000000000000780000000000000000000000000000000000000000000000000000000000000079000000000000000000000000000000000000000000000000000000000000007a000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000007c000000000000000000000000000000000000000000000000000000000000007d000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000008100000000000000000000000000000000000000000000000000000000000000820000000000000000000000000000000000000000000000000000000000000083000000000000000000000000000000000000000000000000000000000000008400000000000000000000000000000000000000000000000000000000000000850000000000000000000000000000000000000000000000000000000000000086000000000000000000000000000000000000000000000000000000000000008700000000000000000000000000000000000000000000000000000000000000880000000000000000000000000000000000000000000000000000000000000089000000000000000000000000000000000000000000000000000000000000008a000000000000000000000000000000000000000000000000000000000000008b000000000000000000000000000000000000000000000000000000000000008c000000000000000000000000000000000000000000000000000000000000008d000000000000000000000000000000000000000000000000000000000000008e000000000000000000000000000000000000000000000000000000000000008f0000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000009100000000000000000000000000000000000000000000000000000000000000920000000000000000000000000000000000000000000000000000000000000093000000000000000000000000000000000000000000000000000000000000009400000000000000000000000000000000000000000000000000000000000000950000000000000000000000000000000000000000000000000000000000000096000000000000000000000000000000000000000000000000000000000000009700000000000000000000000000000000000000000000000000000000000000980000000000000000000000000000000000000000000000000000000000000099000000000000000000000000000000000000000000000000000000000000009a000000000000000000000000000000000000000000000000000000000000009b000000000000000000000000000000000000000000000000000000000000009c000000000000000000000000000000000000000000000000000000000000009d000000000000000000000000000000000000000000000000000000000000009e000000000000000000000000000000000000000000000000000000000000009f00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000a100000000000000000000000000000000000000000000000000000000000000a200000000000000000000000000000000000000000000000000000000000000a300000000000000000000000000000000000000000000000000000000000000a400000000000000000000000000000000000000000000000000000000000000a500000000000000000000000000000000000000000000000000000000000000a600000000000000000000000000000000000000000000000000000000000000a700000000000000000000000000000000000000000000000000000000000000a800000000000000000000000000000000000000000000000000000000000000a900000000000000000000000000000000000000000000000000000000000000aa00000000000000000000000000000000000000000000000000000000000000ab00000000000000000000000000000000000000000000000000000000000000ac00000000000000000000000000000000000000000000000000000000000000ad00000000000000000000000000000000000000000000000000000000000000ae00000000000000000000000000000000000000000000000000000000000000af00000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000b100000000000000000000000000000000000000000000000000000000000000b200000000000000000000000000000000000000000000000000000000000000b300000000000000000000000000000000000000000000000000000000000000b400000000000000000000000000000000000000000000000000000000000000b500000000000000000000000000000000000000000000000000000000000000b600000000000000000000000000000000000000000000000000000000000000b700000000000000000000000000000000000000000000000000000000000000b800000000000000000000000000000000000000000000000000000000000000b900000000000000000000000000000000000000000000000000000000000000ba00000000000000000000000000000000000000000000000000000000000000bb00000000000000000000000000000000000000000000000000000000000000bc00000000000000000000000000000000000000000000000000000000000000bd00000000000000000000000000000000000000000000000000000000000000be00000000000000000000000000000000000000000000000000000000000000bf00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000c100000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000c300000000000000000000000000000000000000000000000000000000000000c400000000000000000000000000000000000000000000000000000000000000c500000000000000000000000000000000000000000000000000000000000000c600000000000000000000000000000000000000000000000000000000000000c700000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000c900000000000000000000000000000000000000000000000000000000000000ca00000000000000000000000000000000000000000000000000000000000000cb00000000000000000000000000000000000000000000000000000000000000cc00000000000000000000000000000000000000000000000000000000000000cd00000000000000000000000000000000000000000000000000000000000000ce00000000000000000000000000000000000000000000000000000000000000cf00000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000d100000000000000000000000000000000000000000000000000000000000000d200000000000000000000000000000000000000000000000000000000000000d300000000000000000000000000000000000000000000000000000000000000d400000000000000000000000000000000000000000000000000000000000000d500000000000000000000000000000000000000000000000000000000000000d600000000000000000000000000000000000000000000000000000000000000d700000000000000000000000000000000000000000000000000000000000000d800000000000000000000000000000000000000000000000000000000000000d900000000000000000000000000000000000000000000000000000000000000da00000000000000000000000000000000000000000000000000000000000000db00000000000000000000000000000000000000000000000000000000000000dc00000000000000000000000000000000000000000000000000000000000000dd00000000000000000000000000000000000000000000000000000000000000de00000000000000000000000000000000000000000000000000000000000000df00000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000e200000000000000000000000000000000000000000000000000000000000000e300000000000000000000000000000000000000000000000000000000000000e400000000000000000000000000000000000000000000000000000000000000e500000000000000000000000000000000000000000000000000000000000000e600000000000000000000000000000000000000000000000000000000000000e700000000000000000000000000000000000000000000000000000000000000e800000000000000000000000000000000000000000000000000000000000000e900000000000000000000000000000000000000000000000000000000000000ea00000000000000000000000000000000000000000000000000000000000000eb00000000000000000000000000000000000000000000000000000000000000ec00000000000000000000000000000000000000000000000000000000000000ed00000000000000000000000000000000000000000000000000000000000000ee00000000000000000000000000000000000000000000000000000000000000ef00000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000f100000000000000000000000000000000000000000000000000000000000000f200000000000000000000000000000000000000000000000000000000000000f300000000000000000000000000000000000000000000000000000000000000f400000000000000000000000000000000000000000000000000000000000000f500000000000000000000000000000000000000000000000000000000000000f600000000000000000000000000000000000000000000000000000000000000f700000000000000000000000000000000000000000000000000000000000000f800000000000000000000000000000000000000000000000000000000000000f900000000000000000000000000000000000000000000000000000000000000fa00000000000000000000000000000000000000000000000000000000000000fb00000000000000000000000000000000000000000000000000000000000000fc00000000000000000000000000000000000000000000000000000000000000fd00000000000000000000000000000000000000000000000000000000000000fe" + } +]