github.com/n00py/Slackor@v0.0.0-20200610224921-d007fcea1740/impacket/tests/misc/test_krb5_crypto.py (about) 1 from __future__ import print_function 2 import unittest 3 from binascii import hexlify, unhexlify 4 5 from impacket.krb5.crypto import (Key, Enctype, encrypt, decrypt, 6 Cksumtype, verify_checksum, _zeropad, 7 string_to_key, prf, cf2) 8 9 def h(hexstr): 10 return unhexlify(hexstr) 11 12 class AESTests(unittest.TestCase): 13 def test_AES128(self): 14 # AES128 encrypt and decrypt 15 kb = h('9062430C8CDA3388922E6D6A509F5B7A') 16 conf = h('94B491F481485B9A0678CD3C4EA386AD') 17 keyusage = 2 18 plain = b'9 bytesss' 19 ctxt = h('68FB9679601F45C78857B2BF820FD6E53ECA8D42FD4B1D7024A09205ABB7CD2E' 20 'C26C355D2F') 21 k = Key(Enctype.AES128, kb) 22 self.assertEqual(encrypt(k, keyusage, plain, conf), ctxt) 23 self.assertEqual(decrypt(k, keyusage, ctxt), plain) 24 25 def test_AES256(self): 26 # AES256 encrypt and decrypt 27 kb = h('F1C795E9248A09338D82C3F8D5B567040B0110736845041347235B1404231398') 28 conf = h('E45CA518B42E266AD98E165E706FFB60') 29 keyusage = 4 30 plain = b'30 bytes bytes bytes bytes byt' 31 ctxt = h('D1137A4D634CFECE924DBC3BF6790648BD5CFF7DE0E7B99460211D0DAEF3D79A' 32 '295C688858F3B34B9CBD6EEBAE81DAF6B734D4D498B6714F1C1D') 33 k = Key(Enctype.AES256, kb) 34 self.assertEqual(encrypt(k, keyusage, plain, conf), ctxt) 35 self.assertEqual(decrypt(k, keyusage, ctxt), plain) 36 37 def test_AES128_checksum(self): 38 # AES128 checksum 39 kb = h('9062430C8CDA3388922E6D6A509F5B7A') 40 keyusage = 3 41 plain = b'eight nine ten eleven twelve thirteen' 42 cksum = h('01A4B088D45628F6946614E3') 43 k = Key(Enctype.AES128, kb) 44 verify_checksum(Cksumtype.SHA1_AES128, k, keyusage, plain, cksum) 45 46 def test_AES256_checksum(self): 47 # AES256 checksum 48 kb = h('B1AE4CD8462AFF1677053CC9279AAC30B796FB81CE21474DD3DDBCFEA4EC76D7') 49 keyusage = 4 50 plain = b'fourteen' 51 cksum = h('E08739E3279E2903EC8E3836') 52 k = Key(Enctype.AES256, kb) 53 verify_checksum(Cksumtype.SHA1_AES256, k, keyusage, plain, cksum) 54 55 def test_AES128_string_to_key(self): 56 # AES128 string-to-key 57 string = 'password' 58 salt = b'ATHENA.MIT.EDUraeburn' 59 params = h('00000002') 60 kb = h('C651BF29E2300AC27FA469D693BDDA13') 61 k = string_to_key(Enctype.AES128, string, salt, params) 62 self.assertEqual(k.contents, kb) 63 64 def test_AES256_string_to_key(self): 65 # AES256 string-to-key 66 string = 'X' * 64 67 salt = b'pass phrase equals block size' 68 params = h('000004B0') 69 kb = h('89ADEE3608DB8BC71F1BFBFE459486B05618B70CBAE22092534E56C553BA4B34') 70 k = string_to_key(Enctype.AES256, string, salt, params) 71 self.assertEqual(k.contents, kb) 72 73 def test_AES128_prf(self): 74 # AES128 prf 75 kb = h('77B39A37A868920F2A51F9DD150C5717') 76 k = string_to_key(Enctype.AES128, b'key1', b'key1') 77 self.assertEqual(prf(k, b'\x01\x61'), kb) 78 79 def test_AES256_prf(self): 80 # AES256 prf 81 kb = h('0D674DD0F9A6806525A4D92E828BD15A') 82 k = string_to_key(Enctype.AES256, b'key2', b'key2') 83 self.assertEqual(prf(k, b'\x02\x62'), kb) 84 85 def test_AES128_cf2(self): 86 # AES128 cf2 87 kb = h('97DF97E4B798B29EB31ED7280287A92A') 88 k1 = string_to_key(Enctype.AES128, b'key1', b'key1') 89 k2 = string_to_key(Enctype.AES128, b'key2', b'key2') 90 k = cf2(Enctype.AES128, k1, k2, b'a', b'b') 91 self.assertEqual(k.contents, kb) 92 93 def test_AES256_cf2(self): 94 # AES256 cf2 95 kb = h('4D6CA4E629785C1F01BAF55E2E548566B9617AE3A96868C337CB93B5E72B1C7B') 96 k1 = string_to_key(Enctype.AES256, b'key1', b'key1') 97 k2 = string_to_key(Enctype.AES256, b'key2', b'key2') 98 k = cf2(Enctype.AES256, k1, k2, b'a', b'b') 99 self.assertEqual(k.contents, kb) 100 101 def test_DES3(self): 102 # DES3 encrypt and decrypt 103 kb = h('0DD52094E0F41CECCB5BE510A764B35176E3981332F1E598') 104 conf = h('94690A17B2DA3C9B') 105 keyusage = 3 106 plain = b'13 bytes byte' 107 ctxt = h('839A17081ECBAFBCDC91B88C6955DD3C4514023CF177B77BF0D0177A16F705E8' 108 '49CB7781D76A316B193F8D30') 109 k = Key(Enctype.DES3, kb) 110 self.assertEqual(encrypt(k, keyusage, plain, conf), ctxt) 111 self.assertEqual(decrypt(k, keyusage, ctxt), _zeropad(plain, 8)) 112 113 def test_DES3_string_to_key(self): 114 # DES3 string-to-key 115 string = b'password' 116 salt = b'ATHENA.MIT.EDUraeburn' 117 kb = h('850BB51358548CD05E86768C313E3BFEF7511937DCF72C3E') 118 k = string_to_key(Enctype.DES3, string, salt) 119 self.assertEqual(k.contents, kb) 120 121 def test_DES3_checksum(self): 122 # DES3 checksum 123 kb = h('7A25DF8992296DCEDA0E135BC4046E2375B3C14C98FBC162') 124 keyusage = 2 125 plain = b'six seven' 126 cksum = h('0EEFC9C3E049AABC1BA5C401677D9AB699082BB4') 127 k = Key(Enctype.DES3, kb) 128 verify_checksum(Cksumtype.SHA1_DES3, k, keyusage, plain, cksum) 129 130 def test_DES3_cf2(self): 131 # DES3 cf2 132 kb = h('E58F9EB643862C13AD38E529313462A7F73E62834FE54A01') 133 k1 = string_to_key(Enctype.DES3, b'key1', b'key1') 134 k2 = string_to_key(Enctype.DES3, b'key2', b'key2') 135 k = cf2(Enctype.DES3, k1, k2, b'a', b'b') 136 self.assertEqual(k.contents, kb) 137 138 def test_RC4(self): 139 # RC4 encrypt and decrypt 140 kb = h('68F263DB3FCE15D031C9EAB02D67107A') 141 conf = h('37245E73A45FBF72') 142 keyusage = 4 143 plain = b'30 bytes bytes bytes bytes byt' 144 ctxt = h('95F9047C3AD75891C2E9B04B16566DC8B6EB9CE4231AFB2542EF87A7B5A0F260' 145 'A99F0460508DE0CECC632D07C354124E46C5D2234EB8') 146 k = Key(Enctype.RC4, kb) 147 self.assertEqual(encrypt(k, keyusage, plain, conf), ctxt) 148 self.assertEqual(decrypt(k, keyusage, ctxt), plain) 149 150 def test_RC4_string_to_key(self): 151 # RC4 string-to-key 152 string = 'foo' 153 kb = h('AC8E657F83DF82BEEA5D43BDAF7800CC') 154 k = string_to_key(Enctype.RC4, string, None) 155 self.assertEqual(k.contents, kb) 156 157 def test_RC4_checksum(self): 158 # RC4 checksum 159 kb = h('F7D3A155AF5E238A0B7A871A96BA2AB2') 160 keyusage = 6 161 plain = b'seventeen eighteen nineteen twenty' 162 cksum = h('EB38CC97E2230F59DA4117DC5859D7EC') 163 k = Key(Enctype.RC4, kb) 164 verify_checksum(Cksumtype.HMAC_MD5, k, keyusage, plain, cksum) 165 166 def test_RC4_cf2(self): 167 # RC4 cf2 168 kb = h('24D7F6B6BAE4E5C00D2082C5EBAB3672') 169 k1 = string_to_key(Enctype.RC4, 'key1', 'key1') 170 k2 = string_to_key(Enctype.RC4, 'key2', 'key2') 171 k = cf2(Enctype.RC4, k1, k2, b'a', b'b') 172 self.assertEqual(k.contents, kb) 173 174 def test_DES_string_to_key(self): 175 # DES string-to-key 176 string = b'password' 177 salt = b'ATHENA.MIT.EDUraeburn' 178 kb = h('cbc22fae235298e3') 179 k = string_to_key(Enctype.DES_MD5, string, salt) 180 self.assertEqual(k.contents, kb) 181 182 # DES string-to-key 183 string = b'potatoe' 184 salt = b'WHITEHOUSE.GOVdanny' 185 kb = h('df3d32a74fd92a01') 186 k = string_to_key(Enctype.DES_MD5, string, salt) 187 self.assertEqual(k.contents, kb) 188 189 if __name__=='__main__': 190 unittest.main(verbosity=1)