def decrypt(self): if self.key is None or self.ciphertext is None: raise DecryptionError("Tried decryption without a key and ciphertext. Can't do that.") try: self.payload = symmetric_decrypt(self.key, self.ciphertext) return bytearray(self.payload) except (ValueError, CryptoError) as _e: # TODO: need to handle decryption errors, e.g. fake key or ciphertext raise DecryptionError("Decryption failed. Key does not match ciphertext.")
def test_encrypt_and_store(self): payload = bytearray(i for i in range(100)) sut = EncryptedCache(10, self.ALARM_QUEUE) ciphertext, block_hash = sut.encrypt_and_add_payload(payload) self.assertEqual(1, len(sut)) cache_item = sut._cache.get(block_hash) self.assertEqual(ciphertext, cache_item.ciphertext) self.assertEqual( payload, symmetric_decrypt(cache_item.key, cache_item.ciphertext))
def test_propagate_block_to_network_encrypted_block(self): self.node.opts.encrypt_blocks = True block_message = helpers.generate_bytearray(50) connection = MockConnection( MockSocketConnection(1, self.node, ip_address=LOCALHOST, port=9000), self.node) self.neutrality_service.propagate_block_to_network( block_message, connection) self.assertEqual(1, len(self.node.broadcast_messages)) broadcast_message, connection_types = self.node.broadcast_messages[0] self.assertTrue(ConnectionType.RELAY_BLOCK in connection_types[0]) raw_block_hash = bytes(broadcast_message.block_hash().binary) cache_item = self.node.in_progress_blocks._cache.get(raw_block_hash) self.assertEqual( cache_item.payload, crypto.symmetric_decrypt(cache_item.key, broadcast_message.blob().tobytes())) self.assertIn(broadcast_message.block_hash(), self.neutrality_service._receipt_tracker)