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)