"""This module is for generating ack payload.""" import highlevelcrypto import helper_random from binascii import hexlify from struct import pack from addresses import encodeVarint # This function generates payload objects for message acknowledgements # Several stealth levels are available depending on the privacy needs; # a higher level means better stealth, but also higher cost (size+POW) # - level 0: a random 32-byte sequence with a message header appended # - level 1: a getpubkey request for a (random) dummy key hash # - level 2: a standard message, encrypted to a random pubkey def genAckPayload(streamNumber=1, stealthLevel=0): """Generate and return payload obj.""" if (stealthLevel == 2): # Generate privacy-enhanced payload # Generate a dummy privkey and derive the pubkey dummyPubKeyHex = highlevelcrypto.privToPub( hexlify(helper_random.randomBytes(32))) # Generate a dummy message of random length # (the smallest possible standard-formatted message is 234 bytes) dummyMessage = helper_random.randomBytes( helper_random.randomrandrange(234, 801)) # Encrypt the message using standard BM encryption (ECIES) ackdata = highlevelcrypto.encrypt(dummyMessage, dummyPubKeyHex) acktype = 2 # message version = 1 elif (stealthLevel == 1): # Basic privacy payload (random getpubkey) ackdata = helper_random.randomBytes(32) acktype = 0 # getpubkey version = 4 else: # Minimum viable payload (non stealth) ackdata = helper_random.randomBytes(32) acktype = 2 # message version = 1 ackobject = pack('>I', acktype) + encodeVarint( version) + encodeVarint(streamNumber) + ackdata return ackobject