def test_syndication_init_real_world_encrypt_decrypt():
    token = 'fb47ce0f-aa3f-43f6-a3ac-c05e6d7ca0dc'
    seq_id = 189
    send_id = 13389333505314606326
    url = "http://www.really-long-url.example.com/longpath/to/the/files/we_might/need.py"
    data = "636dd7ad8c004d09b2c391d0cc3aa2b0"

    assert len(data) == 32

    x = pySRUPLib.SRUP_Syndication_Init()
    y = pySRUPLib.SRUP_Syndication_Init()

    x.token = token
    x.sequence_id = seq_id
    x.sender_id = send_id
    x.url = url

    x.encrypt_keystring(data, pub_keystring)
    r_data = x.decrypt(keyfile)
    assert r_data == data
    assert len(r_data) == 32

    assert x.sign(keyfile) is True
    z = x.serialize()
    assert y.deserialize(z) is True
    assert y.verify(pubkeyfile) is True

    r_data_y = y.decrypt(keyfile)
    assert r_data_y == data
    assert len(r_data_y) == 32
    assert y.url == url
def test_syndication_init_uuid_deserializer_keystring():
    token = "TOKEN12345"
    seq_id = 0x1234567890ABCDEF
    send_id = 0x5F5F5F5F5F5F5F5F
    url = "http://www.really-long-url.example.com/longpath/to/the/files/we_might/need.py"
    uid = uuid.uuid4().hex

    x = pySRUPLib.SRUP_Syndication_Init()
    y = pySRUPLib.SRUP_Syndication_Init()

    x.token = token
    x.sequence_id = seq_id
    x.sender_id = send_id
    x.url = url

    x.encrypt_keystring(uid, pub_keystring)
    assert x.sign_keystring(priv_keystring) is True
    z = x.serialize()

    assert y.deserialize(z) is True
    assert y.verify_keystring(pub_keystring) is True
    assert y.token == token
    assert y.sender_id == send_id
    assert y.sequence_id == seq_id
    assert y.url == url

    new_data = y.decrypt_keystring(priv_keystring)
    assert new_data == uid
def test_syndication_init_deserializer():
    token = "TOKEN12345"
    seq_id = 0x1234567890ABCDEF
    send_id = 0x5F5F5F5F5F5F5F5F
    data = "0123456789ABCDEF0123456789ABCDEF"
    url = "http://www.really-long-url.example.com/longpath/to/the/files/we_might/need.py"

    x = pySRUPLib.SRUP_Syndication_Init()
    y = pySRUPLib.SRUP_Syndication_Init()

    x.token = token
    x.sequence_id = seq_id
    x.sender_id = send_id
    x.url = url

    x.encrypt(data, pubkeyfile)
    assert x.sign(keyfile) is True
    z = x.serialize()

    assert y.deserialize(z) is True
    assert y.verify(pubkeyfile) is True
    assert y.token == token
    assert y.sender_id == send_id
    assert y.sequence_id == seq_id
    assert y.url == url

    new_data = y.decrypt(keyfile)
    assert new_data == data
def test_syndication_init_uuid_signing_keystring():
    blank = ""
    uid = uuid.uuid4().bytes

    x = pySRUPLib.SRUP_Syndication_Init()
    assert x.sign_keystring(blank) is False
    assert x.sign_keystring(priv_keystring) is False

    x.url = "http://www.really-long-url.example.com/longpath/to/the/files/we_might/need.py"
    assert x.sign_keystring(priv_keystring) is False

    x.token = "TOKEN12345"
    assert x.sign_keystring(priv_keystring) is False

    x.encrypt_keystring(uid, pub_keystring)
    assert x.sign(keyfile) is False

    x.sequence_id = 0x1234567890ABCDEF
    assert x.sign_keystring(priv_keystring) is False

    x.sender_id = 0x5F5F5F5F5F5F5F5F
    assert x.sign_keystring(blank) is False
    assert x.sign_keystring(priv_keystring) is True

    assert x.verify_keystring(pub_keystring) is True
def test_syndication_init_signing():
    blank = ""

    x = pySRUPLib.SRUP_Syndication_Init()
    assert x.sign(blank) is False
    assert x.sign(keyfile) is False

    x.token = "TOKEN12345"
    assert x.sign(keyfile) is False

    x.encrypt("0123456789ABCDEF", pubkeyfile)
    assert x.sign(keyfile) is False

    x.sequence_id = 0x1234567890ABCDEF
    assert x.sign(keyfile) is False

    x.url = "http://www.really-long-url.example.com/longpath/to/the/files/we_might/need.py"
    assert x.sign(keyfile) is False

    x.sender_id = 0x5F5F5F5F5F5F5F5F
    assert x.sign(blank) is False
    assert x.sign(keyfile) is True

    assert x.verify(pubkeyfile) is True

    # Transpose a digit in the digest...
    x.sequence_id = 0x5F5F5F5F5F5F5F5F - 1
    assert x.verify(pubkeyfile) is False
def test_empty_object_keystring():
    x = pySRUPLib.SRUP_Syndication_Init()
    assert x.token is None
    assert x.sequence_id is None
    assert x.sender_id is None
    assert x.url is None
    assert x.sign("") is False
    assert x.decrypt_keystring(priv_keystring) is None
def test_syndication_init_serializer_keystring():
    x = pySRUPLib.SRUP_Syndication_Init()
    x.token = "TOKEN12345"
    x.sequence_id = 0x1234567890ABCDEF
    x.sender_id = 0x5F5F5F5F5F5F5F5F
    x.encrypt_keystring("0123456789ABCDEF", pub_keystring)
    x.url = "http://www.really-long-url.example.com/longpath/to/the/files/we_might/need.py"
    assert x.sign_keystring(priv_keystring) is True
    z = x.serialize()
    assert z is not None
def test_syndication_init_sender():
    MAX_SENDER = 0xFFFFFFFFFFFFFFFF
    ZERO_SENDER = 0x00
    VALID_SENDER = 0x7FFFFFFFFFFFFFE7

    x = pySRUPLib.SRUP_Syndication_Init()

    x.sender_id = MAX_SENDER
    assert x.sender_id == MAX_SENDER

    x.sender_id = VALID_SENDER
    assert x.sender_id == VALID_SENDER

    x.sender_id = ZERO_SENDER
    assert x.sender_id == ZERO_SENDER

    with pytest.raises(OverflowError):
        x.sender_id = MAX_SENDER + 1

    with pytest.raises(OverflowError):
        x.sender_id = ZERO_SENDER - 1
def test_syndication_init_seqid():
    MAX_SEQID = 0xFFFFFFFFFFFFFFFF
    ZERO_SEQID = 0x00
    VALID_SEQID = 0x7FFFFFFFFFFFFFE7

    x = pySRUPLib.SRUP_Syndication_Init()

    x.sequence_id = MAX_SEQID
    assert x.sequence_id == MAX_SEQID

    x.sequence_id = VALID_SEQID
    assert x.sequence_id == VALID_SEQID

    x.sequence_id = ZERO_SEQID
    assert x.sequence_id == ZERO_SEQID

    with pytest.raises(OverflowError):
        x.sequence_id = MAX_SEQID + 1

    with pytest.raises(OverflowError):
        x.sequence_id = ZERO_SEQID - 1
def test_syndication_init_generic_deserializer_keystring():
    token = "TOKEN12345"
    seq_id = 0x1234567890ABCDEF
    send_id = 0x5F5F5F5F5F5F5F5F
    data = "0123456789ABCDEF"
    url = "http://www.really-long-url.example.com/longpath/to/the/files/we_might/need.py"

    x = pySRUPLib.SRUP_Syndication_Init()
    i = pySRUPLib.SRUP_Generic()

    x.token = token
    x.sequence_id = seq_id
    x.sender_id = send_id
    x.url = url

    x.encrypt_keystring(data, pub_keystring)
    assert x.sign_keystring(priv_keystring) is True
    z = x.serialize()

    assert i.deserialize(z) is True
    assert i.msg_type == pySRUPLib.__syndication_init_message_type()
def test_syndication_init_url():
    x = pySRUPLib.SRUP_Syndication_Init()
    url = "http://www.really-long-url.example.com/longpath/to/the/files/we_might/need.py"
    assert x.url is None
    x.url = url
    assert x.url == url
def test_syndication_init_type():
    x = pySRUPLib.SRUP_Syndication_Init()
    assert x.msg_type == pySRUPLib.__syndication_init_message_type()
def test_syndication_init_encrypt_decrypt_keystring():
    token = "TOKEN12345"
    seq_id = 0x1234567890ABCDEF
    send_id = 0x5F5F5F5F5F5F5F5F

    data = "0123456789ABCDEF0123456789ABCDEF"

    long_data = "1234567890123456789012345678901234567890"
    short_data = "123"
    very_long_data = "QWERTYUIOPASDFGHJKLZXCVBNM1234567890-=!@#$%^&*()_+[]{};':,./<>?\\|"
    url = "http://www.really-long-url.example.com/longpath/to/the/files/we_might/need.py"

    x = pySRUPLib.SRUP_Syndication_Init()
    y = pySRUPLib.SRUP_Syndication_Init()

    x.token = token
    x.sequence_id = seq_id
    x.sender_id = send_id
    x.url = url

    # The encrypted data is expected to be 32-bytes...
    # So assigning longer sequences will result in truncation...
    # (See elsewhere in the tests for notes).
    x.encrypt_keystring(long_data, pub_keystring)
    assert x.decrypt_keystring(priv_keystring) == long_data[:32]
    assert x.sign_keystring(priv_keystring) is True
    z = x.serialize()
    assert y.deserialize(z) is True
    assert y.verify_keystring(pub_keystring) is True
    assert y.decrypt_keystring(priv_keystring) == long_data[:32]
    assert y.url == url

    x.encrypt_keystring(very_long_data, pub_keystring)
    assert x.decrypt_keystring(priv_keystring) == very_long_data[:32]
    assert x.sign_keystring(priv_keystring) is True
    z = x.serialize()
    assert y.deserialize(z) is True
    assert y.verify_keystring(pub_keystring) is True
    assert y.decrypt_keystring(priv_keystring) == very_long_data[:32]

    # ... whilst shorter sequences will be padded with 0x00's
    x.encrypt_keystring(short_data, pub_keystring)
    padded_short_data = short_data.ljust(32, chr(0x00))
    assert x.decrypt_keystring(priv_keystring) == padded_short_data
    assert x.sign_keystring(priv_keystring) is True
    z = x.serialize()
    assert y.deserialize(z) is True
    assert y.verify_keystring(pub_keystring) is True
    assert y.decrypt_keystring(priv_keystring) == padded_short_data

    # We can use strings for short-hand – but the real data will be raw bytes...
    # So let's test that too.
    byte_data = chr(0x00)
    byte_data += chr(0x01)
    byte_data += chr(0x02)
    byte_data += chr(0x03)
    byte_data += chr(0x04)
    byte_data += chr(0x05)
    byte_data += chr(0x06)
    byte_data += chr(0x07)
    byte_data += chr(0x08)
    byte_data += chr(0x09)
    byte_data += chr(0x0A)
    byte_data += chr(0x0B)
    byte_data += chr(0x0C)
    byte_data += chr(0x0D)
    byte_data += chr(0x0E)
    byte_data += chr(0x0F)
    byte_data += chr(0x00)
    byte_data += chr(0x01)
    byte_data += chr(0x02)
    byte_data += chr(0x03)
    byte_data += chr(0x04)
    byte_data += chr(0x05)
    byte_data += chr(0x06)
    byte_data += chr(0x07)
    byte_data += chr(0x08)
    byte_data += chr(0x09)
    byte_data += chr(0x0A)
    byte_data += chr(0x0B)
    byte_data += chr(0x0C)
    byte_data += chr(0x0D)
    byte_data += chr(0x0E)
    byte_data += chr(0x0F)

    x.encrypt_keystring(byte_data, pub_keystring)
    assert x.decrypt_keystring(priv_keystring) == byte_data
    assert x.sign_keystring(priv_keystring) is True
    z = x.serialize()
    assert y.deserialize(z) is True
    assert y.verify_keystring(pub_keystring) is True
    assert y.decrypt_keystring(priv_keystring) == byte_data

    # Lastly we'll test with a "regular" 32-character string.
    x.encrypt_keystring(data, pub_keystring)
    assert x.decrypt_keystring(priv_keystring) == data
    assert x.sign_keystring(priv_keystring) is True
    z = x.serialize()
    assert y.deserialize(z) is True
    assert y.verify_keystring(pub_keystring) is True
    assert y.decrypt_keystring(priv_keystring) == data
    assert y.url == url
def test_syndication_init_token():
    x = pySRUPLib.SRUP_Syndication_Init()
    assert x.token is None
    x.token = "TEST_TOKEN"
    assert x.token == "TEST_TOKEN"