You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
3.7 KiB
88 lines
3.7 KiB
import base64 |
|
import string |
|
import random |
|
|
|
import pytest |
|
|
|
from jmdaemon import (init_keypair, get_pubkey, init_pubkey, as_init_encryption, |
|
NaclError, encrypt_encode, decode_decrypt) |
|
|
|
|
|
@pytest.mark.parametrize("ab_message,ba_message,num_iterations", |
|
[ |
|
# short ascii |
|
(b"Attack at dawn", b"Not tonight Josephine!", 5), |
|
# long base64 encoded |
|
(base64.b64encode(b''.join(random.choice( |
|
string.ascii_letters).encode('ascii') for _ in range(5000))), |
|
base64.b64encode(b''.join(random.choice( |
|
string.ascii_letters).encode('ascii') for _ in range(5000))), |
|
5,), |
|
# large number of messages on the same connection |
|
(b'rand', b'rand', 40000), |
|
# 1 character |
|
(b'\x00', b'\x00', 5), |
|
]) |
|
def test_enc_wrapper(alice_bob_boxes, ab_message, ba_message, num_iterations): |
|
alice_box, bob_box = alice_bob_boxes |
|
|
|
for i in range(num_iterations): |
|
ab_message = (''.join( |
|
random.choice(string.ascii_letters) |
|
for x in range(100))).encode('ascii') if ab_message == b'rand' else ab_message |
|
ba_message = (''.join( |
|
random.choice(string.ascii_letters) |
|
for x in range(100))).encode('ascii') if ba_message == b'rand' else ba_message |
|
otw_amsg = alice_box.encrypt(ab_message) |
|
bob_ptext = bob_box.decrypt(otw_amsg) |
|
|
|
assert bob_ptext == ab_message, "Encryption test: FAILED. Alice sent: {}, Bob received: {}".format( |
|
ab_message, bob_ptext) |
|
|
|
otw_bmsg = bob_box.encrypt(ba_message) |
|
alice_ptext = alice_box.decrypt(otw_bmsg) |
|
assert alice_ptext == ba_message, "Encryption test: FAILED. Bob sent: {}, Alice received: {}".format( |
|
ba_message, alice_ptext) |
|
assert decode_decrypt(encrypt_encode(ab_message, bob_box), bob_box) == ab_message |
|
|
|
@pytest.mark.parametrize("invalid_pubkey", |
|
[ |
|
# short ascii |
|
("abcdef"), |
|
("tt"*32), |
|
("ab"*33), |
|
("cd"*31), |
|
]) |
|
def test_invalid_nacl_keys(alice_bob_boxes, invalid_pubkey): |
|
with pytest.raises(NaclError) as e_info: |
|
x = init_pubkey(invalid_pubkey) |
|
with pytest.raises(NaclError) as e_info: |
|
alice_kp = init_keypair() |
|
box = as_init_encryption(alice_kp, invalid_pubkey) |
|
#also try when using the wrong object type as a keypair |
|
with pytest.raises(NaclError) as e_info: |
|
alice_bad_kp = init_pubkey("02"*32) |
|
box = as_init_encryption(alice_bad_kp, alice_bad_kp) |
|
#try to load a pubkey from a non-keypair object |
|
with pytest.raises(NaclError) as e_info: |
|
pk = get_pubkey(invalid_pubkey) |
|
|
|
@pytest.fixture() |
|
def alice_bob_boxes(): |
|
alice_kp = init_keypair("alicekey") |
|
bob_kp = init_keypair("bobkey") |
|
|
|
# this is the DH key exchange part |
|
bob_otwpk = get_pubkey(bob_kp, True) |
|
alice_otwpk = get_pubkey(alice_kp, True) |
|
|
|
bob_pk = init_pubkey(bob_otwpk) |
|
alice_box = as_init_encryption(alice_kp, bob_pk) |
|
alice_pk = init_pubkey(alice_otwpk, "alicepubkey") |
|
bob_box = as_init_encryption(bob_kp, alice_pk) |
|
|
|
# now Alice and Bob can use their 'box' |
|
# constructs (both of which utilise the same |
|
# shared secret) to perform encryption/decryption |
|
# to test the encryption functionality |
|
return (alice_box, bob_box)
|
|
|