github.com/n00py/Slackor@v0.0.0-20200610224921-d007fcea1740/impacket/tests/SMB_RPC/test_ntlm.py (about)

     1  from __future__ import print_function
     2  import unittest
     3  import struct
     4  
     5  from six import b
     6  from impacket import ntlm
     7  from impacket.structure import hexdump
     8  
     9  # Common values
    10  
    11  class NTLMTests(unittest.TestCase):
    12      def setUp(self):
    13          # Turn test case mode on
    14          ntlm.TEST_CASE = True
    15          self.user = "User"
    16          self.domain = "Domain"
    17          self.password = "Password"
    18          self.serverName = "Server"
    19          self.workstationName = "COMPUTER"
    20          self.randomSessionKey = b("U"*16)
    21          self.time = b('\x00'*8)
    22          self.clientChallenge = b("\xaa"*8)
    23          self.serverChallenge = b("\x01\x23\x45\x67\x89\xab\xcd\xef")
    24          self.flags =  ntlm.NTLMSSP_NEGOTIATE_KEY_EXCH | ntlm.NTLMSSP_NEGOTIATE_56 | ntlm.NTLMSSP_NEGOTIATE_128 | ntlm.NTLMSSP_NEGOTIATE_VERSION | ntlm.NTLMSSP_TARGET_TYPE_SERVER | ntlm.NTLMSSP_NEGOTIATE_ALWAYS_SIGN | ntlm.NTLMSSP_NEGOTIATE_NTLM | ntlm.NTLMSSP_NEGOTIATE_SEAL | ntlm.NTLMSSP_NEGOTIATE_SIGN | ntlm.NTLM_NEGOTIATE_OEM | ntlm.NTLMSSP_NEGOTIATE_UNICODE
    25          self.seqNum = 0
    26          self.nonce = b('\x00'*16)
    27          self.plaintext = 'Plaintext'.encode('utf-16le')
    28  
    29          print("## BEFORE RUNNING THESE TESTS")
    30          print("Don't forget to set up aTime = '\\x00'*8 in computeResponseNTLMv2 otherwise the results won't be right. ")
    31          print("Look for that in ntlm.py and uncomment the lines, comment the other ones and don't forget to revert everything back whenever finished testing")
    32          print("Flags")
    33          hexdump(struct.pack('<L',self.flags))
    34  
    35      def test_ntlmv1(self):
    36          print("####### 4.2.2 NTLMv1 Authentication")
    37          ntlm.USE_NTLMv2 = False
    38          print("4.2.2.1 LMOWFv1()")
    39          res = ntlm.LMOWFv1(self.password)
    40          hexdump(res)
    41          self.assertTrue(res==bytearray(b'\xe5,\xacgA\x9a\x9a"J;\x10\x8f?\xa6\xcbm'))
    42          print("\n")
    43          print("4.2.2.1.2 NTOWFv1()")
    44          res = ntlm.NTOWFv1(self.password)
    45          hexdump(res)
    46          self.assertTrue(res==bytearray(b'\xa4\xf4\x9c\x40\x65\x10\xbd\xca\xb6\x82\x4e\xe7\xc3\x0f\xd8\x52'))
    47          print("\n")
    48          print("4.2.2.1.3 Session Base Key and Key Exchange Key")
    49          ntResponse, lmResponse, sessionBaseKey  = ntlm.computeResponseNTLMv1(int(self.flags), self.serverChallenge,
    50                                                                               self.clientChallenge, self.serverName,
    51                                                                               self.domain, self.user, self.password, '', '')
    52          hexdump(sessionBaseKey)
    53          self.assertTrue(sessionBaseKey==bytearray(b'\xD8\x72\x62\xB0\xCD\xE4\xB1\xCB\x74\x99\xBE\xCC\xCD\xF1\x07\x84'))
    54          print("\n")
    55          print("4.2.2.2.1 NTLMv1 Response")
    56          hexdump(ntResponse)
    57          self.assertTrue(ntResponse==bytearray(b'\x67\xC4\x30\x11\xF3\x02\x98\xA2\xAD\x35\xEC\xE6\x4F\x16\x33\x1C\x44\xBD\xBE\xD9\x27\x84\x1F\x94'))
    58          print("\n")
    59          print("4.2.2.2.2 LMv1 Response")
    60          hexdump(lmResponse)
    61          self.assertTrue(lmResponse==bytearray(b'\x98\xDE\xF7\xB8\x7F\x88\xAA\x5D\xAF\xE2\xDF\x77\x96\x88\xA1\x72\xde\xf1\x1c\x7d\x5c\xcd\xef\x13'))
    62          print("\n")
    63          print("4.2.2.2.2 LMv1 Response with NTLMSSP_NEGOTIATE_LM_KEY set")
    64          flags2 = self.flags
    65          #flags2 = flags | ntlm.NTLMSSP_LM_KEY
    66          #hexdump(struct.pack('<L',flags2))
    67          ntResponse, lmResponse, sessionBaseKey  = ntlm.computeResponseNTLMv1(int(flags2), self.serverChallenge,
    68                                                  self.clientChallenge, self.serverName, self.domain, self.user,
    69                                                  self.password, '', '')
    70          hexdump(lmResponse)
    71          print("\n")
    72          print("4.2.2.2.3 Encrypted Session Key ")
    73          ntResponse, lmResponse, sessionBaseKey  = ntlm.computeResponseNTLMv1(int(self.flags), self.serverChallenge,
    74                                          self.clientChallenge, self.serverName, self.domain, self.user, self.password, '', '')
    75          keyExchangeKey = ntlm.KXKEY(self.flags, sessionBaseKey, lmResponse, self.serverChallenge, self.password,'','')
    76          encryptedSessionKey = ntlm.generateEncryptedSessionKey(keyExchangeKey,self.randomSessionKey)
    77          hexdump(encryptedSessionKey)
    78          self.assertTrue(encryptedSessionKey==bytearray(b'\x51\x88\x22\xB1\xB3\xF3\x50\xC8\x95\x86\x82\xEC\xBB\x3E\x3C\xB7'))
    79          print("\n")
    80          print("4.2.2.2.3 Encrypted Session Key (NTLMSSP_NON_NT_KEY)")
    81          flags2 = self.flags | ntlm.NTLMSSP_REQUEST_NON_NT_SESSION_KEY
    82          keyExchangeKey = ntlm.KXKEY(flags2, sessionBaseKey, lmResponse, self.serverChallenge, self.password,'','')
    83          encryptedSessionKey = ntlm.generateEncryptedSessionKey(keyExchangeKey,self.randomSessionKey)
    84          hexdump(encryptedSessionKey)
    85          #ToDo Fix this
    86          #self.assertTrue(encryptedSessionKey==bytearray(b'\x74\x52\xca\x55\xc2\x25\xa1\xca\x04\xb4\x8f\xae\x32\xcf\x56\xfc'))
    87          print("\n")
    88          print("4.2.2.2.3 Encrypted Session Key (NTLMSSP_LM_KEY)")
    89          flags2 = self.flags | ntlm.NTLMSSP_NEGOTIATE_LM_KEY
    90          #hexdump(struct.pack('<L',flags2))
    91          keyExchangeKey = ntlm.KXKEY(flags2, sessionBaseKey, lmResponse, self.serverChallenge, self.password,'','')
    92          encryptedSessionKey = ntlm.generateEncryptedSessionKey(keyExchangeKey,self.randomSessionKey)
    93          hexdump(encryptedSessionKey)
    94          #ToDo Fix this
    95          #self.assertTrue(encryptedSessionKey==bytearray(b'\x4c\xd7\xbb\x57\xd6\x97\xef\x9b\x54\x9f\x02\xb8\xf9\xb3\x78\x64')
    96          print("\n")
    97          print("4.2.2.3 AUTHENTICATE MESSAGE")
    98          ntResponse, lmResponse, sessionBaseKey  = ntlm.computeResponseNTLMv1(int(self.flags), self.serverChallenge,
    99                                                  self.clientChallenge, self.serverName, self.domain, self.user, self.password, '', '')
   100          keyExchangeKey = ntlm.KXKEY(self.flags, sessionBaseKey, lmResponse, self.serverChallenge, self.password,'','')
   101          encryptedSessionKey = ntlm.generateEncryptedSessionKey(keyExchangeKey,self.randomSessionKey)
   102          ntlmChallengeResponse = ntlm.NTLMAuthChallengeResponse(self.user, self.password, self.serverChallenge)
   103          ntlmChallengeResponse['flags'] = flags2
   104          ntlmChallengeResponse['host_name'] = self.workstationName.encode('utf-16le')
   105          ntlmChallengeResponse['domain_name'] = self.domain.encode('utf-16le')
   106          ntlmChallengeResponse['lanman'] = lmResponse
   107          ntlmChallengeResponse['ntlm'] = ntResponse
   108          ntlmChallengeResponse['session_key'] = encryptedSessionKey
   109          hexdump(ntlmChallengeResponse.getData())
   110          self.assertTrue(ntlmChallengeResponse.getData()==bytearray(b'NTLMSSP\x00\x03\x00\x00\x00\x18\x00\x18\x00|\x00\x00\x00\x18\x00\x18\x00\x94\x00\x00\x00\x0c\x00\x0c\x00X\x00\x00\x00\x08\x00\x08\x00d\x00\x00\x00\x10\x00\x10\x00l\x00\x00\x00\x10\x00\x10\x00\xac\x00\x00\x00\xb3\x82\x02\xe2D\x00o\x00m\x00a\x00i\x00n\x00U\x00s\x00e\x00r\x00C\x00O\x00M\x00P\x00U\x00T\x00E\x00R\x00\x98\xde\xf7\xb8\x7f\x88\xaa]\xaf\xe2\xdfw\x96\x88\xa1r\xde\xf1\x1c}\\\xcd\xef\x13g\xc40\x11\xf3\x02\x98\xa2\xad5\xec\xe6O\x163\x1cD\xbd\xbe\xd9\'\x84\x1f\x94Q\x88"\xb1\xb3\xf3P\xc8\x95\x86\x82\xec\xbb><\xb7'))
   111          print("\n")
   112  
   113          print("4.2.2.4 GSS_WrapEx")
   114          print("Output of SEAL()")
   115          from Cryptodome.Cipher import ARC4
   116          cipher = ARC4.new(self.randomSessionKey)
   117          handle = cipher.encrypt
   118          print("Plaintext")
   119          hexdump(self.plaintext)
   120          print("\n")
   121          sealedMsg, signature = ntlm.SEAL(self.flags, self.nonce, self.nonce, self.plaintext, self.plaintext, self.seqNum, handle)
   122          #signature = ntlm.SIGN(flags, nonce, plaintext, seqNum, handle)
   123          hexdump(sealedMsg)
   124          self.assertTrue(sealedMsg==bytearray(b'V\xfe\x04\xd8a\xf91\x9a\xf0\xd7#\x8a.;ME\x7f\xb8'))
   125          print("\n")
   126          hexdump(signature.getData())
   127          self.assertTrue(signature.getData()==bytearray(b'\x01\x00\x00\x00\x00\x00\x00\x00\t\xdc\xd1\xdf.E\x9d6'))
   128          print("\n")
   129  
   130          print("####### 4.2.3 NTLMv1 with Client Challenge")
   131          flags =  ntlm.NTLMSSP_NEGOTIATE_56 | ntlm.NTLMSSP_NEGOTIATE_VERSION | ntlm.NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY \
   132                   | ntlm.NTLMSSP_TARGET_TYPE_SERVER | ntlm.NTLMSSP_NEGOTIATE_ALWAYS_SIGN | ntlm.NTLMSSP_NEGOTIATE_NTLM |\
   133                   ntlm.NTLMSSP_NEGOTIATE_SEAL | ntlm.NTLMSSP_NEGOTIATE_SIGN | ntlm.NTLM_NEGOTIATE_OEM | ntlm.NTLMSSP_NEGOTIATE_UNICODE
   134          print("Flags")
   135          hexdump(struct.pack('<L',flags))
   136          print("\n")
   137          print("4.2.3.1.1 NTOWFv1(password)")
   138          hexdump(ntlm.NTOWFv1(self.password))
   139          print("\n")
   140          print("4.2.3.1.2 Session Base Key")
   141          ntResponse, lmResponse, sessionBaseKey  = ntlm.computeResponseNTLMv1(int(flags), self.serverChallenge, self.clientChallenge,
   142                                                                              self.serverName, self.domain, self.user, self.password, '', '')
   143          hexdump(sessionBaseKey)
   144          self.assertTrue(sessionBaseKey==bytearray(b'\xd8rb\xb0\xcd\xe4\xb1\xcbt\x99\xbe\xcc\xcd\xf1\x07\x84'))
   145          print("\n")
   146          print("4.2.3.1.3 Key Exchange Key")
   147          keyExchangeKey = ntlm.KXKEY(flags, sessionBaseKey, lmResponse, self.serverChallenge, self.password,'','')
   148          hexdump(keyExchangeKey)
   149          # ToDo: Fix this
   150          #self.assertTrue(keyExchangeKey==bytearray(b'\xeb\x93\x42\x9a\x8b\xd9\x52\xf8\xb8\x9c\x55\xb8\x7f\x47\x5e\xdc'))
   151          print("\n")
   152  
   153          print("4.2.3.2.1 LMv1 Response")
   154          hexdump(lmResponse)
   155          #self.assertTrue(lmResponse==bytearray(b'\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'))
   156          print("\n")
   157  
   158          print("4.2.3.2.2 NTLMv1 Response")
   159          hexdump(ntResponse)
   160          # ToDo: Fix this
   161          #self.assertTrue(ntResponse==bytearray(b'\x75\x37\xf8\x03\xae\x36\x71\x28\xca\x45\x82\x04\xbd\xe7\xca\xf8\x1e\x97\xed\x26\x83\x26\x72\x32'))
   162          print("\n")
   163          print("AUTHENTICATE MESSAGE")
   164          ntlm.generateEncryptedSessionKey(keyExchangeKey,self.randomSessionKey)
   165          ntlmChallengeResponse = ntlm.NTLMAuthChallengeResponse(self.user, self.password, self.serverChallenge)
   166          ntlmChallengeResponse['flags'] = flags2
   167          ntlmChallengeResponse['host_name'] = self.workstationName.encode('utf-16le')
   168          ntlmChallengeResponse['domain_name'] = self.domain.encode('utf-16le')
   169          ntlmChallengeResponse['lanman'] = lmResponse
   170          ntlmChallengeResponse['ntlm'] = ntResponse
   171          hexdump(ntlmChallengeResponse.getData())
   172          self.assertTrue(ntlmChallengeResponse.getData()==bytearray(b'NTLMSSP\x00\x03\x00\x00\x00\x18\x00\x18\x00|\x00\x00\x00\x18\x00\x18\x00\x94\x00\x00\x00\x0c\x00\x0c\x00X\x00\x00\x00\x08\x00\x08\x00d\x00\x00\x00\x10\x00\x10\x00l\x00\x00\x00\x00\x00\x00\x00\xac\x00\x00\x00\xb3\x82\x02\xe2D\x00o\x00m\x00a\x00i\x00n\x00U\x00s\x00e\x00r\x00C\x00O\x00M\x00P\x00U\x00T\x00E\x00R\x00\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00u7\xf8\x03\xae6q(\xcaE\x82\x04\xbd\xe7\xca\xf8\x1e\x97\xed&\x83&r2'))
   173  
   174          print("\n")
   175          print("4.2.3.4 GSS_WrapEx")
   176          print("Plaintext")
   177          hexdump(self.plaintext)
   178          print("\n")
   179          print("Output of SEAL()")
   180  
   181          exportedSessionKey = keyExchangeKey
   182          clientSigningKey = ntlm.SIGNKEY(flags, exportedSessionKey)
   183          clientSealingKey = ntlm.SEALKEY(flags, exportedSessionKey)
   184  
   185          from Cryptodome.Cipher import ARC4
   186          cipher = ARC4.new(clientSigningKey)
   187  
   188          cipher2 = ARC4.new(clientSealingKey)
   189          client_sealing_h = cipher2.encrypt
   190          print("SEALKEY()")
   191          hexdump(clientSealingKey)
   192          print("\n")
   193          print("SIGNKEY()")
   194          hexdump(clientSigningKey)
   195          print("\n")
   196          print("Sealed Data")
   197          sealedMsg, signature = ntlm.SEAL(flags, clientSealingKey, clientSigningKey,
   198                                           self.plaintext, self.plaintext, self.seqNum, client_sealing_h)
   199          #signature = ntlm.SIGN(flags, clientSigningKey, plaintext, seqNum, client_sealing_h)
   200          hexdump(sealedMsg)
   201          # ToDo: Fix this
   202          #self.assertTrue(ntResponse==bytearray(b'\xa0\x23\x72\xf6\x53\x02\x73\xf3\xaa\x1e\xb9\x01\x90\xce\x52\x00\xc9\x9d'))
   203          print("\n")
   204          print("Signature")
   205          hexdump(signature.getData())
   206          # ToDo: Fix this
   207          #self.assertTrue(ntResponse==bytearray(b'\x01\x00\x00\x00\xff\x2a\xeb\x52\xf6\x81\x79\x3a\x00\x00\x00\x00')
   208          print("\n")
   209  
   210      def test_ntlmv2(self):
   211          print("####### 4.2.4 NTLMv2 Authentication")
   212          ntlm.USE_NTLMv2 = True
   213          serverName = b('\x02\x00\x0c\x00\x44\x00\x6f\x00\x6d\x00\x61\x00\x69\x00\x6e\x00\x01\x00\x0c\x00\x53\x00\x65\x00\x72\x00\x76\x00\x65\x00\x72\x00\x00\x00\x00\x00')
   214          # Still the aTime won't be set to zero. that must be changed in ntlm.computeResponseNTLM2. Gotta make this more automated
   215  
   216          flags = ntlm.NTLMSSP_NEGOTIATE_KEY_EXCH | ntlm.NTLMSSP_NEGOTIATE_56 | ntlm.NTLMSSP_NEGOTIATE_128 | \
   217                  ntlm.NTLMSSP_NEGOTIATE_VERSION | ntlm.NTLMSSP_NEGOTIATE_TARGET_INFO | \
   218                  ntlm.NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY | ntlm.NTLMSSP_TARGET_TYPE_SERVER | \
   219                  ntlm.NTLMSSP_NEGOTIATE_ALWAYS_SIGN | ntlm.NTLMSSP_NEGOTIATE_NTLM | ntlm.NTLMSSP_NEGOTIATE_SEAL | \
   220                  ntlm.NTLMSSP_NEGOTIATE_SIGN | ntlm.NTLM_NEGOTIATE_OEM | ntlm.NTLMSSP_NEGOTIATE_UNICODE
   221          print("Flags")
   222          hexdump(struct.pack('<L',flags))
   223          print("\n")
   224          print("4.2.4.1.1 NTOWFv2 and LMOWFv2")
   225          res = ntlm.NTOWFv2(self.user,self.password,self.domain)
   226          hexdump(res)
   227          self.assertTrue(res==bytearray(b'\x0c\x86\x8a@;\xfdz\x93\xa3\x00\x1e\xf2.\xf0.?'))
   228          print("\n")
   229          print("\n")
   230          print("4.2.4.1.2 Session Base Key")
   231          ntResponse, lmResponse, sessionBaseKey = ntlm.computeResponseNTLMv2(flags, self.serverChallenge,
   232                              self.clientChallenge, serverName, self.domain, self.user, self.password, '', '' )
   233          hexdump(sessionBaseKey)
   234          self.assertTrue(sessionBaseKey==bytearray(b'\x8d\xe4\x0c\xca\xdb\xc1\x4a\x82\xf1\x5c\xb0\xad\x0d\xe9\x5c\xa3'))
   235          print("\n")
   236  
   237          print("4.2.4.2.1 LMv2 Response")
   238          hexdump(lmResponse)
   239          self.assertTrue(lmResponse==bytearray(b'\x86\xc3P\x97\xac\x9c\xec\x10%TvJW\xcc\xcc\x19\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa'))
   240          print("\n")
   241          print("4.2.4.2.2 NTLMv2 Response")
   242          hexdump(ntResponse[:16])
   243          self.assertTrue(ntResponse[:16]==bytearray(b'\x68\xcd\x0a\xb8\x51\xe5\x1c\x96\xaa\xbc\x92\x7b\xeb\xef\x6a\x1c'))
   244          print("\n")
   245          print("4.2.4.2.3 Encrypted Session Key")
   246          keyExchangeKey = ntlm.KXKEY(flags, sessionBaseKey, lmResponse, self.serverChallenge, self.password,'','')
   247          encryptedSessionKey = ntlm.generateEncryptedSessionKey(keyExchangeKey,self.randomSessionKey)
   248          hexdump(encryptedSessionKey)
   249          self.assertTrue(encryptedSessionKey==bytearray(b'\xC5\xDA\xD2\x54\x4F\xC9\x79\x90\x94\xCE\x1C\xE9\x0B\xC9\xD0\x3E'))
   250          print("\n")
   251  
   252          print("AUTHENTICATE MESSAGE")
   253          encryptedSessionKey = ntlm.generateEncryptedSessionKey(keyExchangeKey,self.randomSessionKey)
   254          ntlmChallengeResponse = ntlm.NTLMAuthChallengeResponse(self.user, self.password, self.serverChallenge)
   255          ntlmChallengeResponse['flags'] = flags
   256          ntlmChallengeResponse['host_name'] = self.workstationName.encode('utf-16le')
   257          ntlmChallengeResponse['domain_name'] = self.domain.encode('utf-16le')
   258          ntlmChallengeResponse['lanman'] = lmResponse
   259          ntlmChallengeResponse['ntlm'] = ntResponse
   260          ntlmChallengeResponse['session_key'] = encryptedSessionKey
   261          hexdump(ntlmChallengeResponse.getData())
   262          self.assertTrue(ntlmChallengeResponse.getData()==bytearray(b'NTLMSSP\x00\x03\x00\x00\x00\x18\x00\x18\x00|\x00\x00\x00T\x00T\x00\x94\x00\x00\x00\x0c\x00\x0c\x00X\x00\x00\x00\x08\x00\x08\x00d\x00\x00\x00\x10\x00\x10\x00l\x00\x00\x00\x10\x00\x10\x00\xe8\x00\x00\x003\x82\x8a\xe2D\x00o\x00m\x00a\x00i\x00n\x00U\x00s\x00e\x00r\x00C\x00O\x00M\x00P\x00U\x00T\x00E\x00R\x00\x86\xc3P\x97\xac\x9c\xec\x10%TvJW\xcc\xcc\x19\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaah\xcd\n\xb8Q\xe5\x1c\x96\xaa\xbc\x92{\xeb\xefj\x1c\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x00\x00\x00\x00\x02\x00\x0c\x00D\x00o\x00m\x00a\x00i\x00n\x00\x01\x00\x0c\x00S\x00e\x00r\x00v\x00e\x00r\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc5\xda\xd2TO\xc9y\x90\x94\xce\x1c\xe9\x0b\xc9\xd0>'))
   263          print("\n")
   264          print("4.2.4.4 GSS_WrapEx")
   265          print("Plaintext")
   266          hexdump(self.plaintext)
   267          print("\n")
   268          print("Output of SEAL()")
   269  
   270          exportedSessionKey = self.randomSessionKey
   271          clientSigningKey = ntlm.SIGNKEY(flags, exportedSessionKey)
   272          clientSealingKey = ntlm.SEALKEY(flags, exportedSessionKey)
   273  
   274          from Cryptodome.Cipher import ARC4
   275  
   276          cipher2 = ARC4.new(clientSealingKey)
   277          client_sealing_h = cipher2.encrypt
   278          print("SEALKEY()")
   279          hexdump(clientSealingKey)
   280          self.assertTrue(clientSealingKey==bytearray(b'Y\xf6\x00\x97<\xc4\x96\n%H\n|\x19nLX'))
   281          print("\n")
   282          print("SIGNKEY()")
   283          hexdump(clientSigningKey)
   284          self.assertTrue(clientSigningKey==bytearray(b'G\x88\xdc\x86\x1bG\x82\xf3]C\xfd\x98\xfe\x1a-9'))
   285          print("\n")
   286          print("Sealed Data")
   287          sealedMsg, signature = ntlm.SEAL(flags, clientSealingKey, clientSigningKey,
   288                                           self.plaintext, self.plaintext, self.seqNum, client_sealing_h)
   289          #signature = ntlm.SIGN(flags, clientSigningKey, plaintext, seqNum, client_sealing_h)
   290          hexdump(sealedMsg)
   291          self.assertTrue(sealedMsg==bytearray(b'T\xe5\x01e\xbf\x196\xdc\x99` \xc1\x81\x1b\x0f\x06\xfb_'))
   292          print("\n")
   293          print("Signature")
   294          hexdump(signature.getData())
   295          self.assertTrue(signature.getData()==bytearray(b'\x01\x00\x00\x00\x00\xc1a\xa1\x1e@\x03\x9f\x00\x00\x00\x00'))
   296          #print (repr(bytearray(str(signature))))
   297          #raise
   298          print("\n")
   299  
   300  if __name__ == '__main__':
   301      import sys
   302      if len(sys.argv) > 1:
   303          testcase = sys.argv[1]
   304          suite = unittest.TestLoader().loadTestsFromTestCase(globals()[testcase])
   305      else:
   306          suite = unittest.TestLoader().loadTestsFromTestCase(NTLMTests)
   307      unittest.TextTestRunner(verbosity=1).run(suite)