private void AddMultisigChWallet(byte[] addr, MultisigWalletChangeType change_type, byte[] signer_pub_key, byte[] signer_nonce) { using (MemoryStream ms = new MemoryStream()) { using (BinaryWriter bw = new BinaryWriter(ms)) { bw.Write(multisigStartMarker[0]); bw.Write(multisigStartMarker[1]); bw.Write((byte)change_type); bw.Write(addr.Length); bw.Write(addr); bw.Write(signer_pub_key.Length); bw.Write(signer_pub_key); bw.Write(signer_nonce.Length); bw.Write(signer_nonce); data = ms.ToArray(); } } }
private object getChangeMultisigWalletData() { if (data == null || data.Length < 6) { return(null); } using (MemoryStream ms = new MemoryStream(data)) { using (BinaryReader rd = new BinaryReader(ms)) { try { byte start_marker_1 = rd.ReadByte(); byte start_marker_2 = rd.ReadByte(); if (start_marker_1 != multisigStartMarker[0] || start_marker_2 != multisigStartMarker[1]) { Logging.warn(String.Format("Multisig change transaction: Invalid multisig transaction: Data start marker does not match! ({0}, {1})", start_marker_1, start_marker_2)); return(null); } // multisig change type MultisigWalletChangeType change_type = (MultisigWalletChangeType)rd.ReadByte(); switch (change_type) { case MultisigWalletChangeType.AddSigner: int ch_addr_len = rd.ReadInt32(); if (ch_addr_len < 36 || ch_addr_len > 128) { Logging.warn("Multisig change transaction: Adding signer, but the data does not contain a valid address!"); return(null); } byte[] ch_addr = rd.ReadBytes(ch_addr_len); if (ch_addr == null || ch_addr.Length < ch_addr_len) { Logging.warn("Multisig change transaction: Adding signer, but the address data was corrupted."); return(null); } int signer_pub_key_len = rd.ReadInt32(); if (signer_pub_key_len < 36 || signer_pub_key_len > 2500) { Logging.warn(String.Format("Multisig transaction: Invalid signer pub key length stored in data: {0}", signer_pub_key_len)); return(null); } if (signer_pub_key_len == 0) { return(null); } byte[] signer_pub_key = rd.ReadBytes(signer_pub_key_len); int signer_nonce_len = rd.ReadInt32(); if (signer_nonce_len > 16) { Logging.warn(String.Format("Multisig transaction: Invalid signer nonce length stored in data: {0}", signer_nonce_len)); return(null); } byte[] signer_nonce = rd.ReadBytes(signer_nonce_len); return(new MultisigAddrAdd { addrToAdd = ch_addr, signerPubKey = signer_pub_key, signerNonce = signer_nonce }); case MultisigWalletChangeType.DelSigner: ch_addr_len = rd.ReadInt32(); if (ch_addr_len < 36 || ch_addr_len > 128) { Logging.warn("Multisig change transaction: Deleting signer, but the data does not contain a valid address!"); return(null); } ch_addr = rd.ReadBytes(ch_addr_len); if (ch_addr == null || ch_addr.Length < ch_addr_len) { Logging.warn("Multisig change transaction: Deleting signer, but the address data was corrupted."); return(null); } signer_pub_key_len = rd.ReadInt32(); if (signer_pub_key_len < 36 || signer_pub_key_len > 2500) { Logging.warn(String.Format("Multisig transaction: Invalid signer pub key length stored in data: {0}", signer_pub_key_len)); return(null); } if (signer_pub_key_len == 0) { return(null); } signer_pub_key = rd.ReadBytes(signer_pub_key_len); signer_nonce_len = rd.ReadInt32(); if (signer_nonce_len > 16) { Logging.warn(String.Format("Multisig transaction: Invalid signer nonce length stored in data: {0}", signer_nonce_len)); return(null); } signer_nonce = rd.ReadBytes(signer_nonce_len); return(new MultisigAddrDel { addrToDel = ch_addr, signerPubKey = signer_pub_key, signerNonce = signer_nonce }); case MultisigWalletChangeType.ChangeReqSigs: byte new_req_sigs = rd.ReadByte(); signer_pub_key_len = rd.ReadInt32(); if (signer_pub_key_len < 36 || signer_pub_key_len > 2500) { Logging.warn(String.Format("Multisig transaction: Invalid signer pub key length stored in data: {0}", signer_pub_key_len)); return(null); } if (signer_pub_key_len == 0) { return(null); } signer_pub_key = rd.ReadBytes(signer_pub_key_len); signer_nonce_len = rd.ReadInt32(); if (signer_nonce_len > 16) { Logging.warn(String.Format("Multisig transaction: Invalid signer nonce length stored in data: {0}", signer_nonce_len)); return(null); } signer_nonce = rd.ReadBytes(signer_nonce_len); return(new MultisigChSig { reqSigs = new_req_sigs, signerPubKey = signer_pub_key, signerNonce = signer_nonce }); default: Logging.warn(String.Format("Invalid MultisigWalletChangeType for a multisig change transaction {{ {0} }}.", id)); return(null); } } catch (Exception) { // early EOL or strange data error return(null); } } } }