def test1_createProtocolMessages( self ): # An empty message consists only of a header. self.failUnless(len(message.createProtocolMessages("")[0]) == \ const.HDR_LENGTH) msg = message.createProtocolMessages('X' * const.MPU) self.failUnless((len(msg) == 1) and (len(msg[0]) == const.MTU)) msg = message.createProtocolMessages('X' * (const.MPU + 1)) self.failUnless((len(msg) == 2) and \ (len(msg[0]) == const.MTU) and \ (len(msg[1]) == (const.HDR_LENGTH + 1)))
def sendRemote(self, data, flags=const.FLAG_PAYLOAD): """ Send data to the remote end after a connection was established. The given `data' is first encapsulated in protocol messages. Then, the protocol message(s) are sent over the wire. The argument `flags' specifies the protocol message flags with the default flags signalling payload. """ log.debug("Processing %d bytes of outgoing data." % len(data)) # Wrap the application's data in ScrambleSuit protocol messages. messages = message.createProtocolMessages(data, flags=flags) blurb = "".join([ msg.encryptAndHMAC(self.sendCrypter, self.sendHMAC) for msg in messages ]) # Flush data chunk for chunk to obfuscate inter-arrival times. if const.USE_IAT_OBFUSCATION: if len(self.choppingBuf) == 0: self.choppingBuf.write(blurb) reactor.callLater(self.iatMorpher.randomSample(), self.flushPieces) else: # flushPieces() is still busy processing the chopping buffer. self.choppingBuf.write(blurb) else: padBlurb = self.pktMorpher.getPadding(self.sendCrypter, self.sendHMAC, len(blurb)) self.circuit.downstream.write(blurb + padBlurb)
def sendRemote( self, data, flags=const.FLAG_PAYLOAD ): """ Send data to the remote end after a connection was established. The given `data' is first encapsulated in protocol messages. Then, the protocol message(s) are sent over the wire. The argument `flags' specifies the protocol message flags with the default flags signalling payload. """ log.debug("Processing %d bytes of outgoing data." % len(data)) # Wrap the application's data in ScrambleSuit protocol messages. messages = message.createProtocolMessages(data, flags=flags) blurb = "".join([msg.encryptAndHMAC(self.sendCrypter, self.sendHMAC) for msg in messages]) # Flush data chunk for chunk to obfuscate inter-arrival times. if const.USE_IAT_OBFUSCATION: if len(self.choppingBuf) == 0: self.choppingBuf.write(blurb) reactor.callLater(self.iatMorpher.randomSample(), self.flushPieces) else: # flushPieces() is still busy processing the chopping buffer. self.choppingBuf.write(blurb) else: padBlurb = self.pktMorpher.getPadding(self.sendCrypter, self.sendHMAC, len(blurb)) self.circuit.downstream.write(blurb + padBlurb)
def sendRemote( self, data, flags=const.FLAG_PAYLOAD ): """ Send data to the remote end after a connection was established. The given `data' is first encapsulated in protocol messages. Then, the protocol message(s) are sent over the wire. The argument `flags' specifies the protocol message flags with the default flags signalling payload. """ log.debug("Processing %d bytes of outgoing data." % len(data)) # Wrap the application's data in ScrambleSuit protocol messages. messages = message.createProtocolMessages(data, flags=flags) # Let the packet morpher tell us how much we should pad. paddingLen = self.pktMorpher.calcPadding(sum([len(msg) for msg in messages])) # If padding > header length, a single message will do... if paddingLen > const.HDR_LENGTH: messages.append(message.new("", paddingLen=paddingLen - const.HDR_LENGTH)) # ...otherwise, we use two padding-only messages. else: messages.append(message.new("", paddingLen=const.MPU - const.HDR_LENGTH)) messages.append(message.new("", paddingLen=paddingLen)) blurb = "".join([msg.encryptAndHMAC(self.sendCrypter, self.sendHMAC) for msg in messages]) # Flush data chunk for chunk to obfuscate inter arrival times. if const.USE_IAT_OBFUSCATION: if len(self.choppingBuf) == 0: self.choppingBuf.write(blurb) reactor.callLater(self.iatMorpher.randomSample(), self.flushPieces) else: # flushPieces() is still busy processing the chopping buffer. self.choppingBuf.write(blurb) else: self.circuit.downstream.write(blurb)