beaconcrypt 0.3.3

Cryptographic transport for C2 channels
Documentation
from beaconcrypt import BeaconCryptBeacon, BeaconCryptServer


def register_beacon(
    server: BeaconCryptServer,
    beacon: BeaconCryptBeacon,
) -> bytes | None:
    message = bytes(0xFF * 32)
    phase_1 = beacon.generate_registration()
    assert phase_1 is not None
    reg_out = server.register_beacon(phase_1, message)
    assert reg_out is not None
    phase2 = beacon.process_initial_message(reg_out.serialized())
    assert phase2 is not None
    assert phase2 == message
    return phase2


def test_encrypt_to_multiple():
    server = BeaconCryptServer(0, None)
    server_pk = server.id_pk()
    b1 = BeaconCryptBeacon(0, server_pk)
    b2 = BeaconCryptBeacon(0, server_pk)
    message = bytes(0x1 * 32)

    b1_initial = register_beacon(server, b1)
    b2_initial = register_beacon(server, b2)
    assert b2_initial == b1_initial

    b1_m1 = server.encrypt_to_beacon(message, 1)
    b2_m1 = server.encrypt_to_beacon(message, 2)
    assert b1_m1 is not None and b2_m1 is not None and b1_m1 != b2_m1


def test_encrypt_multiple():
    server = BeaconCryptServer(0, None)
    server_pk = server.id_pk()
    b1 = BeaconCryptBeacon(0, server_pk)
    message = bytes(0x1 * 32)

    _ = register_beacon(server, b1)

    b1_m1 = server.encrypt_to_beacon(message, 1)
    b1_m2 = server.encrypt_to_beacon(message, 1)
    assert b1_m1 is not None and b1_m2 is not None and b1_m1 != b1_m2


def test_decrypt_multiple():
    server = BeaconCryptServer(0, None)
    server_pk = server.id_pk()
    beacon = BeaconCryptBeacon(0, server_pk)
    message = bytes(0x1 * 32)

    _ = register_beacon(server, beacon)
    m1 = server.encrypt_to_beacon(message, 1)
    m2 = server.encrypt_to_beacon(message, 1)
    assert m1 != m2

    plain1 = beacon.decrypt_server_message(m1)
    plain2 = beacon.decrypt_server_message(m2)
    assert plain2 is not None and plain1 is not None
    assert plain2 == plain1 == message


def test_decrypt_multiple_signed():
    server = BeaconCryptServer(0, None)
    server_pk = server.id_pk()
    beacon = BeaconCryptBeacon(0, server_pk)
    message = bytes(0x1 * 32)

    _ = register_beacon(server, beacon)
    m1 = server.encrypt_to_beacon_signed(message, 1)
    m2 = server.encrypt_to_beacon_signed(message, 1)
    assert m1 != m2

    plain1 = beacon.decrypt_server_message_signed(m1)
    plain2 = beacon.decrypt_server_message_signed(m2)
    assert plain2 is not None and plain1 is not None
    assert plain2 == plain1 == message


def test_decrypt_catch_up():
    server = BeaconCryptServer(0, None)
    server_pk = server.id_pk()
    beacon = BeaconCryptBeacon(0, server_pk)
    message = bytes(0x1 * 32)

    _ = register_beacon(server, beacon)
    m1 = server.encrypt_to_beacon(message, 1)
    m2 = server.encrypt_to_beacon(message, 1)
    assert m1 != m2

    plain2 = beacon.decrypt_server_message(m2)
    plain1 = beacon.decrypt_server_message(m1)
    assert plain2 is not None and plain1 is not None
    assert plain2 == plain1 == message