1 from ctypescrypto.oid import Oid
2 from ctypescrypto import cipher
7 class TestCipherType(unittest.TestCase):
8 def test_ciphdescbc(self):
9 ct=cipher.CipherType("des-cbc")
10 self.assertEqual(ct.block_size(),8)
11 self.assertEqual(ct.key_length(),8)
12 self.assertEqual(ct.iv_length(),8)
13 self.assertEqual(ct.algo(),'DES-CBC')
14 self.assertEqual(ct.oid().shortname(),"DES-CBC")
15 self.assertEqual(ct.mode(),"CBC")
16 def test_ciphaesofb(self):
17 ct=cipher.CipherType("aes-256-ofb")
18 self.assertEqual(ct.block_size(),1)
19 self.assertEqual(ct.key_length(),32)
20 self.assertEqual(ct.iv_length(),16)
21 self.assertEqual(ct.algo(),'AES-256-OFB')
22 self.assertEqual(ct.oid().shortname(),"AES-256-OFB")
23 self.assertEqual(ct.mode(),"OFB")
24 def test_unknowncipher(self):
25 with self.assertRaises(cipher.CipherError):
26 ct=cipher.CipherType("no-such-cipher")
28 class TestEncryptDecrypt(unittest.TestCase):
29 def test_cons_nokey(self):
30 ct=cipher.CipherType("DES-CBC")
31 with self.assertRaises(ValueError):
32 c=cipher.Cipher(ct,None,None)
33 def test_blockcipher(self):
36 c=cipher.new("DES-CBC",key)
37 enc=c.update(data)+c.finish()
38 # See if padding is added by default
39 self.assertEqual(len(enc),16)
40 d=cipher.new("DES-CBC",key,encrypt=False)
41 dec=d.update(enc)+d.finish()
42 self.assertEqual(data,dec)
43 def test_blockcipher_nopadding(self):
46 c=cipher.new("DES-CBC",key)
48 enc=c.update(data)+c.finish()
49 # See if padding is added by default
50 self.assertEqual(len(enc),8)
51 d=cipher.new("DES-CBC",key,encrypt=False)
53 dec=d.update(enc)+d.finish()
54 self.assertEqual(data,dec)
55 def test_ofb_cipher(self):
59 c=cipher.new("DES-OFB",key,iv=iv)
60 enc=c.update(data)+c.finish()
61 # See if padding is added by default
62 self.assertEqual(len(enc),len(data))
63 d=cipher.new("DES-OFB",key,encrypt=False,iv=iv)
64 dec=d.update(enc)+d.finish()
65 self.assertEqual(data,dec)
67 def test_ofb_noiv(self):
69 encryptkey='abcdabcd'*4
70 decryptkey=encryptkey[0:5]+encryptkey[5:]
73 c=cipher.new("AES-256-OFB",encryptkey)
74 enc=c.update(data)+c.finish()
75 # See if padding is added by default
76 self.assertEqual(len(enc),len(data))
77 d=cipher.new("AES-256-OFB",decryptkey,encrypt=False)
78 dec=d.update(enc)+d.finish()
79 self.assertEqual(data,dec)
80 def test_wrong_keylength(self):
83 with self.assertRaises(ValueError):
84 c=cipher.new("AES-128-OFB",key)
85 def test_wrong_ivlength(self):
86 key="abcdabcdabcdabcd"
88 with self.assertRaises(ValueError):
89 c=cipher.new("AES-128-OFB",key,iv=iv)
90 def test_variable_keylength(self):
91 encryptkey="abcdefabcdefghtlgvasdgdgsdgdsg"
92 data="asdfsdfsdfsdfsdfsdfsdfsdf"
94 c=cipher.new("bf-ofb",encryptkey,iv=iv)
95 ciphertext=c.update(data)+c.finish()
96 decryptkey=encryptkey[0:5]+encryptkey[5:]
97 d=cipher.new("bf-ofb",decryptkey,encrypt=False,iv=iv)
98 deciph=d.update(ciphertext)+d.finish()
99 self.assertEqual(deciph,data)
101 if __name__ == '__main__':