~ubuntu-branches/ubuntu/gutsy/wireshark/gutsy-security

« back to all changes in this revision

Viewing changes to epan/dissectors/packet-ntlmssp.c

  • Committer: Bazaar Package Importer
  • Author(s): Frederic Peters
  • Date: 2007-04-01 08:58:40 UTC
  • mfrom: (1.1.3 upstream)
  • Revision ID: james.westby@ubuntu.com-20070401085840-or3qhrpv8alt1bwg
Tags: 0.99.5-1
* New upstream release.
* debian/patches/09_idl2wrs.dpatch: updated to patch idl2wrs.sh.in.

Show diffs side-by-side

added added

removed removed

Lines of Context:
3
3
 * Devin Heitmueller <dheitmueller@netilla.com>
4
4
 * Copyright 2003, Tim Potter <tpot@samba.org>
5
5
 *
6
 
 * $Id: packet-ntlmssp.c 18871 2006-08-10 10:52:16Z sahlberg $
 
6
 * $Id: packet-ntlmssp.c 20359 2007-01-09 22:14:07Z gerald $
7
7
 *
8
8
 * Wireshark - Network traffic analyzer
9
9
 * By Gerald Combs <gerald@wireshark.org>
40
40
#include <epan/prefs.h>
41
41
#include <epan/emem.h>
42
42
#include <epan/tap.h>
43
 
#include <epan/crypt-rc4.h>
44
 
#include <epan/crypt-md4.h>
45
 
#include <epan/crypt-des.h>
 
43
#include <epan/crypt/crypt-rc4.h>
 
44
#include <epan/crypt/crypt-md4.h>
 
45
#include <epan/crypt/crypt-des.h>
46
46
#include "packet-dcerpc.h"
47
47
#include "packet-gssapi.h"
48
48
 
95
95
#define NTLMSSP_NEGOTIATE_NETWARE          0x00000100
96
96
#define NTLMSSP_NEGOTIATE_NTLM             0x00000200
97
97
#define NTLMSSP_NEGOTIATE_00000400         0x00000400
98
 
#define NTLMSSP_NEGOTIATE_00000800         0x00000800
 
98
#define NTLMSSP_NEGOTIATE_ANONYMOUS        0x00000800
99
99
#define NTLMSSP_NEGOTIATE_DOMAIN_SUPPLIED  0x00001000
100
100
#define NTLMSSP_NEGOTIATE_WORKSTATION_SUPPLIED 0x00002000
101
101
#define NTLMSSP_NEGOTIATE_THIS_IS_LOCAL_CALL  0x00004000
223
223
#define MAX_BLOB_SIZE 256
224
224
typedef struct _ntlmssp_blob {
225
225
  guint16 length;
226
 
  guint8 contents[MAX_BLOB_SIZE];  
 
226
  guint8 contents[MAX_BLOB_SIZE];
227
227
} ntlmssp_blob;
228
228
 
229
229
/* Used in the conversation function */
259
259
  Returns output in response, which is expected to be 24 bytes.
260
260
*/
261
261
static int ntlmssp_generate_challenge_response(guint8 *response,
262
 
                                               const guint8 *passhash, 
 
262
                                               const guint8 *passhash,
263
263
                                               const guint8 *challenge)
264
264
{
265
265
  guint8 pw21[21]; /* Password hash padded to 21 bytes */
266
 
  
 
266
 
267
267
  memset(pw21, 0x0, sizeof(pw21));
268
268
  memcpy(pw21, passhash, 16);
269
269
 
276
276
  return 1;
277
277
}
278
278
 
279
 
/* Create an NTLMSSP version 1 key.  
 
279
/* Create an NTLMSSP version 1 key.
280
280
 * password points to the ANSI password to encrypt, challenge points to
281
281
 * the 8 octet challenge string, key128 will do a 128 bit key if set to 1,
282
 
 * otherwise it will do a 40 bit key.  The result is stored in 
 
282
 * otherwise it will do a 40 bit key.  The result is stored in
283
283
 * sspkey (expected to be 16 octets)
284
284
 */
285
285
static void
286
 
create_ntlmssp_v1_key(const char *nt_password, const guint8 *challenge, 
 
286
create_ntlmssp_v1_key(const char *nt_password, const guint8 *challenge,
287
287
                      int use_key_128, guint8 *sspkey)
288
288
{
289
289
  unsigned char lm_password_upper[16];
293
293
  guint8 pw21[21]; /* Password hash padded to 21 bytes */
294
294
  size_t password_len;
295
295
  unsigned int i;
296
 
  unsigned char lmhash_key[] = 
 
296
  unsigned char lmhash_key[] =
297
297
    {0x4b, 0x47, 0x53, 0x21, 0x40, 0x23, 0x24, 0x25};
298
298
 
299
299
  memset(lm_password_upper, 0, sizeof(lm_password_upper));
311
311
 
312
312
  crypt_des_ecb(lm_password_hash, lmhash_key, lm_password_upper, 1);
313
313
  crypt_des_ecb(lm_password_hash+8, lmhash_key, lm_password_upper+7, 1);
314
 
  
 
314
 
315
315
  /* Generate the LanMan Challenge Response */
316
316
  ntlmssp_generate_challenge_response(lm_challenge_response,
317
317
                                      lm_password_hash, challenge);
318
 
  
 
318
 
319
319
  /* Generate the NTLMSSP-v1 RC4 Key.
320
 
   * The RC4 key is derived from the Lan Manager Hash.  
 
320
   * The RC4 key is derived from the Lan Manager Hash.
321
321
   * See lkcl "DCE/RPC over SMB" page 254 for the algorithm.
322
322
   */
323
323
  memset(pw21, 0xBD, sizeof(pw21));
327
327
  crypt_des_ecb(rc4key, lm_challenge_response, pw21, 1);
328
328
  crypt_des_ecb(rc4key + 8, lm_challenge_response, pw21 + 7, 1);
329
329
  crypt_des_ecb(rc4key + 16, lm_challenge_response, pw21 + 14, 1);
330
 
  
 
330
 
331
331
  /* Create the SSP Key */
332
332
  memset(sspkey, 0, sizeof(sspkey));
333
333
  if (use_key_128) {
354
354
*/
355
355
static int
356
356
dissect_ntlmssp_string (tvbuff_t *tvb, int offset,
357
 
                        proto_tree *ntlmssp_tree, 
 
357
                        proto_tree *ntlmssp_tree,
358
358
                        gboolean unicode_strings,
359
359
                        int string_hf, int *start, int *end,
360
360
                        const char **stringp)
414
414
*/
415
415
static int
416
416
dissect_ntlmssp_blob (tvbuff_t *tvb, int offset,
417
 
                      proto_tree *ntlmssp_tree, 
 
417
                      proto_tree *ntlmssp_tree,
418
418
                      int blob_hf, int *end, ntlmssp_blob *result)
419
419
{
420
420
  proto_item *tf = NULL;
432
432
  }
433
433
 
434
434
  if (ntlmssp_tree) {
435
 
    tf = proto_tree_add_item (ntlmssp_tree, blob_hf, tvb, 
 
435
    tf = proto_tree_add_item (ntlmssp_tree, blob_hf, tvb,
436
436
                              blob_offset, blob_length, FALSE);
437
437
    tree = proto_item_add_subtree(tf, ett_ntlmssp_blob);
438
438
  }
617
617
 
618
618
        if (tree) {
619
619
                ntlmv2_item = proto_tree_add_item(
620
 
                        tree, hf_ntlmssp_ntlmv2_response, tvb, 
 
620
                        tree, hf_ntlmssp_ntlmv2_response, tvb,
621
621
                        offset, len, TRUE);
622
622
                ntlmv2_tree = proto_item_add_subtree(
623
623
                        ntlmv2_item, ett_ntlmssp_ntlmv2_response);
667
667
 
668
668
                if (ntlmv2_tree) {
669
669
                        name_item = proto_tree_add_item(
670
 
                                ntlmv2_tree, hf_ntlmssp_ntlmv2_response_name, 
 
670
                                ntlmv2_tree, hf_ntlmssp_ntlmv2_response_name,
671
671
                                tvb, offset, 0, TRUE);
672
672
                        name_tree = proto_item_add_subtree(
673
673
                                name_item, ett_ntlmssp_ntlmv2_response_name);
693
693
                case NTLM_NAME_END:
694
694
                        name = "NULL";
695
695
                        proto_item_append_text(
696
 
                                name_item, "%s", 
 
696
                                name_item, "%s",
697
697
                                val_to_str(name_type, ntlm_name_types,
698
698
                                           "Unknown"));
699
699
                        break;
700
700
                case NTLM_NAME_CLIENT_TIME:
701
701
                        dissect_nt_64bit_time(
702
 
                                tvb, name_tree, offset, 
 
702
                                tvb, name_tree, offset,
703
703
                                hf_ntlmssp_ntlmv2_response_client_time);
704
704
                        proto_item_append_text(
705
705
                                name_item, "Client Time");
713
713
                                tvb, offset, name_len / 2, TRUE);
714
714
 
715
715
                        proto_tree_add_text(
716
 
                                name_tree, tvb, offset, name_len, 
 
716
                                name_tree, tvb, offset, name_len,
717
717
                                "Name: %s", name);
718
718
                        proto_item_append_text(
719
719
                                name_item, "%s, %s",
764
764
   * sent at all, presumably meaning the length of the message
765
765
   * isn't enough to contain them.
766
766
   */
767
 
  offset = dissect_ntlmssp_string(tvb, offset, ntlmssp_tree, FALSE, 
 
767
  offset = dissect_ntlmssp_string(tvb, offset, ntlmssp_tree, FALSE,
768
768
                                  hf_ntlmssp_negotiate_domain,
769
769
                                  &start, &workstation_end, NULL);
770
 
  offset = dissect_ntlmssp_string(tvb, offset, ntlmssp_tree, FALSE, 
 
770
  offset = dissect_ntlmssp_string(tvb, offset, ntlmssp_tree, FALSE,
771
771
                                  hf_ntlmssp_negotiate_workstation,
772
772
                                  &start, &domain_end, NULL);
773
773
 
778
778
 
779
779
 
780
780
static int
781
 
dissect_ntlmssp_address_list (tvbuff_t *tvb, int offset, 
782
 
                              proto_tree *ntlmssp_tree, 
 
781
dissect_ntlmssp_address_list (tvbuff_t *tvb, int offset,
 
782
                              proto_tree *ntlmssp_tree,
783
783
                              int *end)
784
784
{
785
785
  guint16 list_length = tvb_get_letohs(tvb, offset);
802
802
  }
803
803
 
804
804
  if (ntlmssp_tree) {
805
 
    tf = proto_tree_add_item (ntlmssp_tree, hf_ntlmssp_address_list, tvb, 
 
805
    tf = proto_tree_add_item (ntlmssp_tree, hf_ntlmssp_address_list, tvb,
806
806
                              list_offset, list_length, FALSE);
807
807
    tree = proto_item_add_subtree(tf, ett_ntlmssp_address_list);
808
808
  }
880
880
    }
881
881
 
882
882
    /* Now show the actual bytes that made up the summary line */
883
 
    addr_tree = proto_item_add_subtree (addr_tf, 
 
883
    addr_tree = proto_item_add_subtree (addr_tf,
884
884
                                        ett_ntlmssp_address_list_item);
885
885
    proto_tree_add_item (addr_tree, hf_ntlmssp_address_list_item_type,
886
886
                         tvb, type_offset, 2, TRUE);
909
909
  ntlmssp_info *conv_ntlmssp_info;
910
910
  conversation_t *conversation;
911
911
  gboolean unicode_strings = FALSE;
912
 
  guint8 challenge[8];  
 
912
  guint8 challenge[8];
913
913
  guint8 sspkey[16]; /* NTLMSSP cipher key */
914
914
  guint8 ssp_key_len; /* Either 8 or 16 (40 bit or 128) */
915
915
 
923
923
   * XXX - the davenport document calls this the "Target Name",
924
924
   * presumably because non-domain targets are supported.
925
925
   */
926
 
  offset = dissect_ntlmssp_string(tvb, offset, ntlmssp_tree, unicode_strings, 
 
926
  offset = dissect_ntlmssp_string(tvb, offset, ntlmssp_tree, unicode_strings,
927
927
                         hf_ntlmssp_challenge_domain,
928
928
                         &item_start, &item_end, NULL);
929
929
  data_start = item_start;
946
946
                                   pinfo->ptype, pinfo->srcport,
947
947
                                   pinfo->destport, 0);
948
948
  if (!conversation) { /* Create one */
949
 
    conversation = conversation_new(pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype, 
 
949
    conversation = conversation_new(pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype,
950
950
                                    pinfo->srcport, pinfo->destport, 0);
951
951
  }
952
952
 
1090
1090
 
1091
1091
  /* domain name */
1092
1092
  item_start = tvb_get_letohl(tvb, offset+4);
1093
 
  offset = dissect_ntlmssp_string(tvb, offset, ntlmssp_tree, 
1094
 
                                  unicode_strings, 
 
1093
  offset = dissect_ntlmssp_string(tvb, offset, ntlmssp_tree,
 
1094
                                  unicode_strings,
1095
1095
                                  hf_ntlmssp_auth_domain,
1096
1096
                                  &item_start, &item_end, &(ntlmssph->domain_name));
1097
1097
  data_start = MIN(data_start, item_start);
1099
1099
 
1100
1100
  /* user name */
1101
1101
  item_start = tvb_get_letohl(tvb, offset+4);
1102
 
  offset = dissect_ntlmssp_string(tvb, offset, ntlmssp_tree, 
1103
 
                                  unicode_strings, 
 
1102
  offset = dissect_ntlmssp_string(tvb, offset, ntlmssp_tree,
 
1103
                                  unicode_strings,
1104
1104
                                  hf_ntlmssp_auth_username,
1105
1105
                                  &item_start, &item_end, &(ntlmssph->acct_name));
1106
1106
  data_start = MIN(data_start, item_start);
1112
1112
 
1113
1113
  /* hostname */
1114
1114
  item_start = tvb_get_letohl(tvb, offset+4);
1115
 
  offset = dissect_ntlmssp_string(tvb, offset, ntlmssp_tree, 
1116
 
                                  unicode_strings, 
 
1115
  offset = dissect_ntlmssp_string(tvb, offset, ntlmssp_tree,
 
1116
                                  unicode_strings,
1117
1117
                                  hf_ntlmssp_auth_hostname,
1118
1118
                                  &item_start, &item_end, &(ntlmssph->host_name));
1119
1119
  data_start = MIN(data_start, item_start);
1183
1183
    proto_tree_add_item (ntlmssp_tree, hf_ntlmssp_message_type,
1184
1184
                         tvb, offset, 4, TRUE);
1185
1185
    ntlmssph->type = tvb_get_letohl (tvb, offset);
1186
 
    offset += 4; 
 
1186
    offset += 4;
1187
1187
 
1188
1188
    if (check_col(pinfo->cinfo, COL_INFO))
1189
1189
            col_append_fstr(pinfo->cinfo, COL_INFO, ", %s",
1190
 
                            val_to_str(ntlmssph->type, 
 
1190
                            val_to_str(ntlmssph->type,
1191
1191
                                       ntlmssp_message_types,
1192
1192
                                       "Unknown message type"));
1193
1193
 
1222
1222
}
1223
1223
 
1224
1224
/*
1225
 
 * Get the encryption state tied to this conversation.  cryptpeer indicates 
 
1225
 * Get the encryption state tied to this conversation.  cryptpeer indicates
1226
1226
 * whether to retrieve the data for peer1 or peer2.
1227
1227
 */
1228
1228
static rc4_state_struct *
1323
1323
    /* Setup the buffer to decrypt to */
1324
1324
    tvb_memcpy(tvb, packet_ntlmssp_info->verifier,
1325
1325
               offset, encrypted_block_length);
1326
 
    
 
1326
 
1327
1327
    /* Do the actual decryption of the verifier */
1328
1328
    crypt_rc4(rc4_state, packet_ntlmssp_info->verifier,
1329
1329
              encrypted_block_length);
1353
1353
  /* Show the decrypted payload in the tree */
1354
1354
  tf = proto_tree_add_text(tree, decr_tvb, 0, -1,
1355
1355
                           "Decrypted Verifier (%d byte%s)",
1356
 
                           encrypted_block_length, 
 
1356
                           encrypted_block_length,
1357
1357
                           plurality(encrypted_block_length, "", "s"));
1358
1358
  decr_tree = proto_item_add_subtree (tf, ett_ntlmssp);
1359
1359
 
1420
1420
    proto_tree_add_item (ntlmssp_tree, hf_ntlmssp_verf_vers,
1421
1421
                         tvb, offset, 4, TRUE);
1422
1422
    offset += 4;
1423
 
  
 
1423
 
1424
1424
    /* Encrypted body */
1425
1425
    proto_tree_add_item (ntlmssp_tree, hf_ntlmssp_verf_body,
1426
1426
                         tvb, offset, encrypted_block_length, TRUE);
1439
1439
}
1440
1440
 
1441
1441
static tvbuff_t *
1442
 
dissect_ntlmssp_encrypted_payload(tvbuff_t *data_tvb, 
 
1442
dissect_ntlmssp_encrypted_payload(tvbuff_t *data_tvb,
1443
1443
                                  tvbuff_t *auth_tvb _U_,
1444
1444
                                  int offset,
1445
 
                                  packet_info *pinfo, 
 
1445
                                  packet_info *pinfo,
1446
1446
                                  dcerpc_auth_info *auth_info _U_)
1447
1447
{
1448
1448
  tvbuff_t *decr_tvb; /* Used to display decrypted buffer */
1464
1464
    memset(packet_ntlmssp_info, 0, sizeof(ntlmssp_packet_info));
1465
1465
    p_add_proto_data(pinfo->fd, proto_ntlmssp, packet_ntlmssp_info);
1466
1466
  }
1467
 
  
 
1467
 
1468
1468
  if (!packet_ntlmssp_info->payload_decrypted) {
1469
1469
    /* Pull the challenge info from the conversation */
1470
1470
    conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst,
1474
1474
      /* There is no conversation, thus no encryption state */
1475
1475
      return NULL;
1476
1476
    }
1477
 
    
 
1477
 
1478
1478
    conv_ntlmssp_info = conversation_get_proto_data(conversation,
1479
1479
                                                    proto_ntlmssp);
1480
1480
    if (conv_ntlmssp_info == NULL) {
1481
1481
      /* There is no NTLMSSP state tied to the conversation */
1482
1482
            return NULL;
1483
1483
    }
1484
 
    
 
1484
 
1485
1485
    /* Get the pair of RC4 state structures.  One is used for to decrypt the
1486
1486
       payload.  The other is used to re-encrypt the payload to represent
1487
1487
       the peer */
1492
1492
      rc4_state = get_encrypted_state(pinfo, 0);
1493
1493
      rc4_state_peer = get_encrypted_state(pinfo, 1);
1494
1494
    }
1495
 
    
 
1495
 
1496
1496
    if (rc4_state == NULL || rc4_state_peer == NULL) {
1497
1497
      /* There is no encryption state, so we cannot decrypt */
1498
1498
      return NULL;
1504
1504
                                                        encrypted_block_length);
1505
1505
    decrypted_payloads = g_slist_prepend(decrypted_payloads,
1506
1506
                                         packet_ntlmssp_info->decrypted_payload);
1507
 
    
 
1507
 
1508
1508
    /* Do the decryption of the payload */
1509
 
    crypt_rc4(rc4_state, packet_ntlmssp_info->decrypted_payload, 
 
1509
    crypt_rc4(rc4_state, packet_ntlmssp_info->decrypted_payload,
1510
1510
              encrypted_block_length);
1511
 
    
 
1511
 
1512
1512
    /* We setup a temporary buffer so we can re-encrypt the payload after
1513
1513
       decryption.  This is to update the opposite peer's RC4 state */
1514
1514
    peer_block = g_malloc(encrypted_block_length);
1516
1516
           encrypted_block_length);
1517
1517
    crypt_rc4(rc4_state_peer, peer_block, encrypted_block_length);
1518
1518
    g_free(peer_block);
1519
 
    
 
1519
 
1520
1520
    packet_ntlmssp_info->payload_decrypted = TRUE;
1521
1521
  }
1522
1522
 
1526
1526
                               encrypted_block_length);
1527
1527
 
1528
1528
  tvb_set_child_real_data_tvbuff(data_tvb, decr_tvb);
1529
 
  
 
1529
 
1530
1530
  offset += encrypted_block_length;
1531
1531
 
1532
1532
  return decr_tvb;
1589
1589
    { &hf_ntlmssp_negotiate_flags_400,
1590
1590
      { "Negotiate 0x00000400", "ntlmssp.negotiate00000400", FT_BOOLEAN, 32, TFS (&flags_set_truth), NTLMSSP_NEGOTIATE_00000400, "", HFILL }},
1591
1591
    { &hf_ntlmssp_negotiate_flags_800,
1592
 
      { "Negotiate 0x00000800", "ntlmssp.negotiate00000800", FT_BOOLEAN, 32, TFS (&flags_set_truth), NTLMSSP_NEGOTIATE_00000800, "", HFILL }},
 
1592
      { "Negotiate Anonymous", "ntlmssp.negotiateanonymous", FT_BOOLEAN, 32, TFS (&flags_set_truth), NTLMSSP_NEGOTIATE_ANONYMOUS, "", HFILL }},
1593
1593
    { &hf_ntlmssp_negotiate_flags_1000,
1594
1594
      { "Negotiate Domain Supplied", "ntlmssp.negotiatedomainsupplied", FT_BOOLEAN, 32, TFS (&flags_set_truth), NTLMSSP_NEGOTIATE_DOMAIN_SUPPLIED, "", HFILL }},
1595
1595
    { &hf_ntlmssp_negotiate_flags_2000,
1750
1750
    &ett_ntlmssp_ntlmv2_response_name
1751
1751
  };
1752
1752
  module_t *ntlmssp_module;
1753
 
  
 
1753
 
1754
1754
  proto_ntlmssp = proto_register_protocol (
1755
1755
                                           "NTLM Secure Service Provider", /* name */
1756
1756
                                           "NTLMSSP",   /* short name */
1761
1761
  register_init_routine(&ntlmssp_init_protocol);
1762
1762
 
1763
1763
  ntlmssp_module = prefs_register_protocol(proto_ntlmssp, NULL);
1764
 
  
 
1764
 
1765
1765
  prefs_register_string_preference(ntlmssp_module, "nt_password",
1766
1766
                                   "NT Password",
1767
1767
                                   "NT Password (used to decrypt payloads)",
1771
1771
  new_register_dissector("ntlmssp_verf", dissect_ntlmssp_verf, proto_ntlmssp);
1772
1772
}
1773
1773
 
1774
 
static int wrap_dissect_ntlmssp(tvbuff_t *tvb, int offset, packet_info *pinfo, 
 
1774
static int wrap_dissect_ntlmssp(tvbuff_t *tvb, int offset, packet_info *pinfo,
1775
1775
                                proto_tree *tree, guint8 *drep _U_)
1776
1776
{
1777
1777
        tvbuff_t *auth_tvb;
1779
1779
        auth_tvb = tvb_new_subset(
1780
1780
                tvb, offset, tvb_length_remaining(tvb, offset),
1781
1781
                tvb_length_remaining(tvb, offset));
1782
 
        
 
1782
 
1783
1783
        dissect_ntlmssp(auth_tvb, pinfo, tree);
1784
1784
 
1785
1785
        return tvb_length_remaining(tvb, offset);
1786
1786
}
1787
1787
 
1788
 
static int wrap_dissect_ntlmssp_verf(tvbuff_t *tvb, int offset, packet_info *pinfo, 
 
1788
static int wrap_dissect_ntlmssp_verf(tvbuff_t *tvb, int offset, packet_info *pinfo,
1789
1789
                                     proto_tree *tree, guint8 *drep _U_)
1790
1790
{
1791
1791
        tvbuff_t *auth_tvb;
1793
1793
        auth_tvb = tvb_new_subset(
1794
1794
                tvb, offset, tvb_length_remaining(tvb, offset),
1795
1795
                tvb_length_remaining(tvb, offset));
1796
 
        
 
1796
 
1797
1797
        return dissect_ntlmssp_verf(auth_tvb, pinfo, tree);
1798
1798
}
1799
1799
 
1819
1819
 
1820
1820
void
1821
1821
proto_reg_handoff_ntlmssp(void)
1822
 
{     
 
1822
{
1823
1823
  dissector_handle_t ntlmssp_handle, ntlmssp_wrap_handle;
1824
1824
 
1825
1825
  /* Register protocol with the GSS-API module */
1826
1826
 
1827
1827
  ntlmssp_handle = find_dissector("ntlmssp");
1828
1828
  ntlmssp_wrap_handle = find_dissector("ntlmssp_verf");
1829
 
  gssapi_init_oid("1.3.6.1.4.1.311.2.2.10", proto_ntlmssp, ett_ntlmssp, 
 
1829
  gssapi_init_oid("1.3.6.1.4.1.311.2.2.10", proto_ntlmssp, ett_ntlmssp,
1830
1830
                  ntlmssp_handle, ntlmssp_wrap_handle,
1831
1831
                  "NTLMSSP - Microsoft NTLM Security Support Provider");
1832
1832