Exemplo n.º 1
0
def test_get_data_fragment_2_fragments():
    udp_payload = get_random_bytes(400)
    fragmented_payload = bytes()

    f = FragmentGenerator(udp_payload)

    fragment = f.get_data_fragment()

    msg_id, is_last, fragment_id, payload = parse_fragment(fragment)

    fragmented_payload += payload

    assert msg_id == f.message_id
    assert not is_last
    assert fragment_id == 0

    fragment = f.get_data_fragment()

    msg_id, is_last, fragment_id, payload = parse_fragment(fragment)

    fragmented_payload += payload

    assert msg_id == f.message_id
    assert is_last
    assert fragment_id == 1
    assert udp_payload == fragmented_payload
Exemplo n.º 2
0
def test_get_data_fragment_too_many():
    udp_payload = get_random_bytes(400)

    f = FragmentGenerator(udp_payload)

    try:
        for _ in range(1000):
            f.get_data_fragment()
        assert False
    except ValueError:
        assert True
Exemplo n.º 3
0
def test_get_init_fragment():
    udp_payload = get_random_bytes(120)

    f = FragmentGenerator(udp_payload)

    fragment = f.get_init_fragment()

    msg_id, is_last, fragment_id, payload = parse_fragment(fragment)

    assert msg_id == f.message_id
    assert is_last
    assert fragment_id == 0
    assert udp_payload == payload
Exemplo n.º 4
0
    def recv_response(self, response):
        self.last_interaction = time()
        """Turns the response into a MixMessage and saves its fragments for
        later sending.
        """
        frag_gen = FragmentGenerator(response)

        while frag_gen:
            print(self, "Data", "<-", len(frag_gen.udp_payload))

            fragment = frag_gen.get_data_fragment()
            packet = fragment + get_random_bytes(MIX_COUNT * CTR_PREFIX_LEN)

            ChannelExit.to_mix.append(DATA_MSG_FLAG + i2b(self.in_chan_id, CHAN_ID_SIZE) + packet)
Exemplo n.º 5
0
def test_get_data_fragment():
    udp_payload = get_random_bytes(DATA_FRAG_PAYLOAD_SIZE)

    f = FragmentGenerator(udp_payload)

    fragment = f.get_data_fragment()

    _, frag_byte, payload = cut(fragment, FRAG_ID_SIZE, FRAG_FLAG_SIZE)

    assert b2i(frag_byte) & FragmentGenerator.LAST_FRAG_FLAG
    assert b2i(frag_byte) == 0b0100_0000
    assert payload[0:DATA_FRAG_PAYLOAD_SIZE] == udp_payload
    assert len(
        fragment) == DATA_FRAG_PAYLOAD_SIZE + FRAG_ID_SIZE + FRAG_FLAG_SIZE
Exemplo n.º 6
0
    def _make_request_fragments(self, request):
        generator = FragmentGenerator(request)

        self.packets.append(generator)

        timed_out = check_for_timed_out_channels(ChannelEntry.table, timeout=25)

        for channel_id in timed_out:
            del ChannelEntry.table[channel_id]
Exemplo n.º 7
0
def test_get_data_fragment_with_padding():
    udp_payload = get_random_bytes(DATA_FRAG_PAYLOAD_SIZE - 1)

    f = FragmentGenerator(udp_payload)

    fragment = f.get_data_fragment()

    _, frag_byte, _, payload = cut(fragment, FRAG_ID_SIZE, FRAG_FLAG_SIZE, 1)

    assert b2i(frag_byte) & FragmentGenerator.LAST_FRAG_FLAG
    assert b2i(frag_byte) & FragmentGenerator.PADDING_FLAG
    assert b2i(frag_byte) == 0b1100_0000
    assert payload[0:DATA_FRAG_PAYLOAD_SIZE - 1] == udp_payload
    assert len(
        fragment) == DATA_FRAG_PAYLOAD_SIZE + FRAG_ID_SIZE + FRAG_FLAG_SIZE

    udp_payload = get_random_bytes(1)

    f = FragmentGenerator(udp_payload)

    fragment = f.get_data_fragment()

    _, frag_byte, _, payload = cut(fragment, FRAG_ID_SIZE, FRAG_FLAG_SIZE, 2)

    assert b2i(frag_byte) & FragmentGenerator.LAST_FRAG_FLAG
    assert b2i(frag_byte) & FragmentGenerator.PADDING_FLAG
    assert b2i(frag_byte) == 0b1100_0000
    assert payload[0:1] == udp_payload
    assert len(
        fragment) == DATA_FRAG_PAYLOAD_SIZE + FRAG_ID_SIZE + FRAG_FLAG_SIZE
Exemplo n.º 8
0
def test_encrypt_fragment():
    channel = ChannelEntry(src_addr, dest_addr, public_keys)

    sym_key = gen_sym_key()
    channel.sym_keys = [sym_key] * MIX_COUNT

    fragment = FragmentGenerator(bytes(100)).get_data_fragment()

    packet1 = channel._encrypt_fragment(fragment)

    packet2 = fragment
    counter = 1

    for _ in range(MIX_COUNT):
        cipher = ctr_cipher(sym_key, counter)

        packet2 = i2b(counter, CTR_PREFIX_LEN) + cipher.encrypt(packet2)

    assert packet1 == packet2
Exemplo n.º 9
0
def test_decrypt_fragment():
    channel = ChannelEntry(src_addr, dest_addr, public_keys)

    sym_key = gen_sym_key()
    channel.sym_keys = [sym_key] * MIX_COUNT

    fragment = FragmentGenerator(bytes(100)).get_data_fragment()

    fragment = channel._encrypt_fragment(fragment)

    packet1 = channel._decrypt_fragment(fragment)

    for _ in range(MIX_COUNT):
        msg_ctr, fragment = cut(fragment, CTR_PREFIX_LEN)

        cipher = ctr_cipher(sym_key, b2i(msg_ctr))

        fragment = cipher.decrypt(fragment)

    packet2 = fragment

    assert packet1 == packet2
Exemplo n.º 10
0
def test_replay_detection():
    channel = ChannelEntry(src_addr, dest_addr, public_keys)

    counter = 1234
    sym_key = gen_sym_key()
    channel.sym_keys = [sym_key] * MIX_COUNT

    print("Counter: {}".format(counter))

    packet = FragmentGenerator(bytes(100)).get_data_fragment()

    packet = channel._encrypt_fragment(packet)

    channel._receive_response_fragment(packet)

    try:
        channel._receive_response_fragment(packet)
        assert False
    except ReplayDetectedError:
        assert True

    packet = channel._encrypt_fragment(packet)

    channel._receive_response_fragment(packet)