Skip to content

Commit c6d0652

Browse files
authored
Merge pull request #72 from mmb/aes-ctr-test
Tests for AESCTR
2 parents bacb5eb + 2d76999 commit c6d0652

File tree

3 files changed

+64
-15
lines changed

3 files changed

+64
-15
lines changed

src/potr/compatcrypto/pycrypto.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
from Crypto.Hash import SHA as _SHA1
2626
from Crypto.Hash import HMAC as _HMAC
2727
from Crypto.PublicKey import DSA
28-
from Crypto.Random import random
28+
import Crypto.Random.random
2929
from numbers import Number
3030

3131
from potr.compatcrypto import common
@@ -106,7 +106,7 @@ def fingerprint(self):
106106

107107
def sign(self, data):
108108
# 2 <= K <= q
109-
K = random.randrange(2, self.priv.q)
109+
K = randrange(2, self.priv.q)
110110
r, s = self.priv.sign(data, K)
111111
return long_to_bytes(r, 20) + long_to_bytes(s, 20)
112112

@@ -141,3 +141,9 @@ def parsePayload(cls, data, private=False):
141141
x, data = read_mpi(data)
142142
return cls((y, g, p, q, x), private=True), data
143143
return cls((y, g, p, q), private=False), data
144+
145+
def getrandbits(k):
146+
return Crypto.Random.random.getrandbits(k)
147+
148+
def randrange(start, stop):
149+
return Crypto.Random.random.randrange(start, stop)

src/potr/crypt.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424

2525
from potr.compatcrypto import SHA256, SHA1, SHA1HMAC, SHA256HMAC, \
26-
Counter, AESCTR, PK, random
26+
Counter, AESCTR, PK, getrandbits, randrange
2727
from potr.utils import bytes_to_long, long_to_bytes, pack_mpi, read_mpi
2828
from potr import proto
2929

@@ -58,7 +58,7 @@ def set_params(cls, prime, gen):
5858
cls.gen = gen
5959

6060
def __init__(self):
61-
self.priv = random.randrange(2, 2**320)
61+
self.priv = randrange(2, 2**320)
6262
self.pub = pow(self.gen, self.priv, self.prime)
6363

6464
DH.set_params(DH_MODULUS, DH_GENERATOR)
@@ -350,7 +350,7 @@ def __init__(self, privkey, onSuccess):
350350
self.lastmsg = None
351351

352352
def startAKE(self):
353-
self.r = long_to_bytes(random.getrandbits(128), 16)
353+
self.r = long_to_bytes(getrandbits(128), 16)
354354

355355
gxmpi = pack_mpi(self.dh.pub)
356356

@@ -549,8 +549,8 @@ def handle(self, tlv, appdata=None):
549549

550550
self.g3o = msg[3]
551551

552-
self.x2 = random.randrange(2, DH_MAX)
553-
self.x3 = random.randrange(2, DH_MAX)
552+
self.x2 = randrange(2, DH_MAX)
553+
self.x3 = randrange(2, DH_MAX)
554554

555555
self.g2 = pow(msg[0], self.x2, DH_MODULUS)
556556
self.g3 = pow(msg[3], self.x3, DH_MODULUS)
@@ -586,7 +586,7 @@ def handle(self, tlv, appdata=None):
586586
self.abort(appdata=appdata)
587587
return
588588

589-
r = random.randrange(2, DH_MAX)
589+
r = randrange(2, DH_MAX)
590590
self.p = pow(self.g3, r, DH_MODULUS)
591591
msg = [self.p]
592592
qa1 = pow(self.g1, r, DH_MODULUS)
@@ -689,8 +689,8 @@ def gotSecret(self, secret, question=None, appdata=None):
689689

690690
self.secret = bytes_to_long(combSecret)
691691

692-
self.x2 = random.randrange(2, DH_MAX)
693-
self.x3 = random.randrange(2, DH_MAX)
692+
self.x2 = randrange(2, DH_MAX)
693+
self.x3 = randrange(2, DH_MAX)
694694

695695
msg = [pow(self.g1, self.x2, DH_MODULUS)]
696696
msg += proof_known_log(self.g1, self.x2, 1)
@@ -715,7 +715,7 @@ def gotSecret(self, secret, question=None, appdata=None):
715715
msg.append(pow(self.g1, self.x3, DH_MODULUS))
716716
msg += proof_known_log(self.g1, self.x3, 4)
717717

718-
r = random.randrange(2, DH_MAX)
718+
r = randrange(2, DH_MAX)
719719

720720
self.p = pow(self.g3, r, DH_MODULUS)
721721
msg.append(self.p)
@@ -731,8 +731,8 @@ def gotSecret(self, secret, question=None, appdata=None):
731731
self.sendTLV(proto.SMP2TLV(msg), appdata=appdata)
732732

733733
def proof_equal_coords(self, r, v):
734-
r1 = random.randrange(2, DH_MAX)
735-
r2 = random.randrange(2, DH_MAX)
734+
r1 = randrange(2, DH_MAX)
735+
r2 = randrange(2, DH_MAX)
736736
temp2 = pow(self.g1, r1, DH_MODULUS) \
737737
* pow(self.g2, r2, DH_MODULUS) % DH_MODULUS
738738
temp1 = pow(self.g3, r1, DH_MODULUS)
@@ -761,7 +761,7 @@ def check_equal_coords(self, coords, v):
761761
return long_to_bytes(c, 32) == cprime
762762

763763
def proof_equal_logs(self, v):
764-
r = random.randrange(2, DH_MAX)
764+
r = randrange(2, DH_MAX)
765765
temp1 = pow(self.g1, r, DH_MODULUS)
766766
temp2 = pow(self.qab, r, DH_MODULUS)
767767

@@ -783,7 +783,7 @@ def check_equal_logs(self, logs, v):
783783
return long_to_bytes(c, 32) == cprime
784784

785785
def proof_known_log(g, x, v):
786-
r = random.randrange(2, DH_MAX)
786+
r = randrange(2, DH_MAX)
787787
c = bytes_to_long(SHA256(struct.pack(b'B', v) + pack_mpi(pow(g, r, DH_MODULUS))))
788788
temp = x * c % SM_ORDER
789789
return c, (r-temp) % SM_ORDER

tests/test_compatcrypto.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,46 @@ def test_SHA256HMAC(self):
3939
self.assertEqual(
4040
to_hex(potr.compatcrypto.SHA256HMAC(b'key', b'this is a test')),
4141
b'a85e8284b3aabd90add3da46176bce8e10eff8eafd7d096d8ba7d9396623b894')
42+
43+
def test_AESCTR_default_counter(self):
44+
key = potr.utils.long_to_bytes(
45+
potr.compatcrypto.getrandbits(128), 16)
46+
47+
aes_encrypter = potr.compatcrypto.AESCTR(key)
48+
ciphertext = aes_encrypter.encrypt(b'setec astronomy')
49+
50+
aes_decrypter = potr.compatcrypto.AESCTR(key)
51+
self.assertEqual(aes_decrypter.decrypt(ciphertext), b'setec astronomy')
52+
53+
def test_AESCTR_number_counter(self):
54+
key = potr.utils.long_to_bytes(
55+
potr.compatcrypto.getrandbits(128), 16)
56+
57+
aes_encrypter = potr.compatcrypto.AESCTR(key, 2010)
58+
ciphertext = aes_encrypter.encrypt(b'setec astronomy')
59+
60+
aes_decrypter = potr.compatcrypto.AESCTR(key, 2010)
61+
self.assertEqual(aes_decrypter.decrypt(ciphertext), b'setec astronomy')
62+
63+
def test_AESCTR_counter_counter(self):
64+
key = potr.utils.long_to_bytes(
65+
potr.compatcrypto.getrandbits(128), 16)
66+
67+
aes_encrypter = potr.compatcrypto.AESCTR(key, potr.compatcrypto.Counter(2013))
68+
ciphertext = aes_encrypter.encrypt(b'setec astronomy')
69+
70+
aes_decrypter = potr.compatcrypto.AESCTR(key, potr.compatcrypto.Counter(2013))
71+
self.assertEqual(aes_decrypter.decrypt(ciphertext), b'setec astronomy')
72+
73+
def test_getrandbits(self):
74+
bits = potr.compatcrypto.getrandbits(128)
75+
byts = potr.utils.long_to_bytes(bits, 16)
76+
self.assertEquals(len(byts), 16)
77+
78+
def test_randrange(self):
79+
pick = potr.compatcrypto.randrange(7, 8)
80+
self.assertEqual(pick, 7)
81+
82+
pick = potr.compatcrypto.randrange(0, 10000)
83+
self.assertGreaterEqual(pick, 0)
84+
self.assertLess(pick, 10000)

0 commit comments

Comments
 (0)