It is also possible to XOR mnemonics with differing numbers of words. For this the xored value takes on the entropy surplus of the longer seed.
use seed_xor::Mnemonic; use std::str::FromStr; // Coldcard example: https://github.com/Coldcard/firmware/blob/master/docs/seed-xor.md let a_str = "romance wink lottery autumn shop bring dawn tongue range crater truth ability miss spice fitness easy legal release recall obey exchange recycle dragon room"; let b_str = "lion misery divide hurry latin fluid camp advance illegal lab pyramid unaware eager fringe sick camera series noodle toy crowd jeans select depth lounge"; let c_str = "vault nominee cradle silk own frown throw leg cactus recall talent worry gadget surface shy planet purpose coffee drip few seven term squeeze educate"; let result_str = "silent toe meat possible chair blossom wait occur this worth option bag nurse find fish scene bench asthma bike wage world quit primary indoor"; // Mnemonic is a wrapper for bip39::Mnemonic which implements the XOR operation `^`. // Mnemonics can also be created from entropy. let a = Mnemonic::from_str(a_str).unwrap(); let b = Mnemonic::from_str(b_str).unwrap(); let c = Mnemonic::from_str(c_str).unwrap(); let result = Mnemonic::from_str(result_str).unwrap(); assert_eq!(result, a ^ b ^ c);
Trait for a