1 /* Do not modify this file. Changes will be overwritten. */
2 /* Generated automatically by the ASN.1 to Wireshark dissector compiler */
4 /* ../../tools/asn2wrs.py -b -C -p credssp -c ./credssp.cnf -s ./packet-credssp-template -D . -O ../../epan/dissectors CredSSP.asn */
6 /* Input file: packet-credssp-template.c */
8 #line 1 "../../asn1/credssp/packet-credssp-template.c"
10 * Routines for CredSSP (Credential Security Support Provider) packet dissection
15 * Wireshark - Network traffic analyzer
16 * By Gerald Combs <gerald@wireshark.org>
17 * Copyright 1998 Gerald Combs
19 * This program is free software; you can redistribute it and/or
20 * modify it under the terms of the GNU General Public License
21 * as published by the Free Software Foundation; either version 2
22 * of the License, or (at your option) any later version.
24 * This program is distributed in the hope that it will be useful,
25 * but WITHOUT ANY WARRANTY; without even the implied warranty of
26 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
27 * GNU General Public License for more details.
29 * You should have received a copy of the GNU General Public License
30 * along with this program; if not, write to the Free Software
31 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
37 #include <epan/packet.h>
38 #include <epan/asn1.h>
40 #include <epan/exported_pdu.h>
42 #include "packet-ber.h"
43 #include "packet-credssp.h"
46 #define PNAME "Credential Security Support Provider"
47 #define PSNAME "CredSSP"
48 #define PFNAME "credssp"
50 #define TS_PASSWORD_CREDS 1
51 #define TS_SMARTCARD_CREDS 2
52 static gint creds_type
;
54 static gint exported_pdu_tap
= -1;
56 /* Initialize the protocol and registered fields */
57 static int proto_credssp
= -1;
59 /* List of dissectors to call for negoToken data */
60 static heur_dissector_list_t credssp_heur_subdissector_list
;
62 static int hf_credssp_TSPasswordCreds
= -1; /* TSPasswordCreds */
63 static int hf_credssp_TSSmartCardCreds
= -1; /* TSSmartCardCreds */
64 static int hf_credssp_TSCredentials
= -1; /* TSCredentials */
66 /*--- Included file: packet-credssp-hf.c ---*/
67 #line 1 "../../asn1/credssp/packet-credssp-hf.c"
68 static int hf_credssp_TSRequest_PDU
= -1; /* TSRequest */
69 static int hf_credssp_NegoData_item
= -1; /* NegoData_item */
70 static int hf_credssp_negoToken
= -1; /* T_negoToken */
71 static int hf_credssp_domainName
= -1; /* OCTET_STRING */
72 static int hf_credssp_userName
= -1; /* OCTET_STRING */
73 static int hf_credssp_password
= -1; /* OCTET_STRING */
74 static int hf_credssp_keySpec
= -1; /* INTEGER */
75 static int hf_credssp_cardName
= -1; /* OCTET_STRING */
76 static int hf_credssp_readerName
= -1; /* OCTET_STRING */
77 static int hf_credssp_containerName
= -1; /* OCTET_STRING */
78 static int hf_credssp_cspName
= -1; /* OCTET_STRING */
79 static int hf_credssp_pin
= -1; /* OCTET_STRING */
80 static int hf_credssp_cspData
= -1; /* TSCspDataDetail */
81 static int hf_credssp_userHint
= -1; /* OCTET_STRING */
82 static int hf_credssp_domainHint
= -1; /* OCTET_STRING */
83 static int hf_credssp_credType
= -1; /* T_credType */
84 static int hf_credssp_credentials
= -1; /* T_credentials */
85 static int hf_credssp_version
= -1; /* INTEGER */
86 static int hf_credssp_negoTokens
= -1; /* NegoData */
87 static int hf_credssp_authInfo
= -1; /* T_authInfo */
88 static int hf_credssp_pubKeyAuth
= -1; /* OCTET_STRING */
90 /*--- End of included file: packet-credssp-hf.c ---*/
91 #line 58 "../../asn1/credssp/packet-credssp-template.c"
93 /* Initialize the subtree pointers */
94 static gint ett_credssp
= -1;
96 /*--- Included file: packet-credssp-ett.c ---*/
97 #line 1 "../../asn1/credssp/packet-credssp-ett.c"
98 static gint ett_credssp_NegoData
= -1;
99 static gint ett_credssp_NegoData_item
= -1;
100 static gint ett_credssp_TSPasswordCreds
= -1;
101 static gint ett_credssp_TSCspDataDetail
= -1;
102 static gint ett_credssp_TSSmartCardCreds
= -1;
103 static gint ett_credssp_TSCredentials
= -1;
104 static gint ett_credssp_TSRequest
= -1;
106 /*--- End of included file: packet-credssp-ett.c ---*/
107 #line 62 "../../asn1/credssp/packet-credssp-template.c"
110 /*--- Included file: packet-credssp-fn.c ---*/
111 #line 1 "../../asn1/credssp/packet-credssp-fn.c"
115 dissect_credssp_T_negoToken(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
116 #line 46 "../../asn1/credssp/credssp.cnf"
117 tvbuff_t
*token_tvb
= NULL
;
119 offset
= dissect_ber_octet_string(implicit_tag
, actx
, tree
, tvb
, offset
, hf_index
,
123 if(token_tvb
!= NULL
)
124 dissector_try_heuristic(credssp_heur_subdissector_list
,
125 token_tvb
, actx
->pinfo
, proto_tree_get_root(tree
), NULL
);
134 static const ber_sequence_t NegoData_item_sequence
[] = {
135 { &hf_credssp_negoToken
, BER_CLASS_CON
, 0, 0, dissect_credssp_T_negoToken
},
136 { NULL
, 0, 0, 0, NULL
}
140 dissect_credssp_NegoData_item(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
141 offset
= dissect_ber_sequence(implicit_tag
, actx
, tree
, tvb
, offset
,
142 NegoData_item_sequence
, hf_index
, ett_credssp_NegoData_item
);
148 static const ber_sequence_t NegoData_sequence_of
[1] = {
149 { &hf_credssp_NegoData_item
, BER_CLASS_UNI
, BER_UNI_TAG_SEQUENCE
, BER_FLAGS_NOOWNTAG
, dissect_credssp_NegoData_item
},
153 dissect_credssp_NegoData(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
154 offset
= dissect_ber_sequence_of(implicit_tag
, actx
, tree
, tvb
, offset
,
155 NegoData_sequence_of
, hf_index
, ett_credssp_NegoData
);
163 dissect_credssp_OCTET_STRING(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
164 offset
= dissect_ber_octet_string(implicit_tag
, actx
, tree
, tvb
, offset
, hf_index
,
171 static const ber_sequence_t TSPasswordCreds_sequence
[] = {
172 { &hf_credssp_domainName
, BER_CLASS_CON
, 0, 0, dissect_credssp_OCTET_STRING
},
173 { &hf_credssp_userName
, BER_CLASS_CON
, 1, 0, dissect_credssp_OCTET_STRING
},
174 { &hf_credssp_password
, BER_CLASS_CON
, 2, 0, dissect_credssp_OCTET_STRING
},
175 { NULL
, 0, 0, 0, NULL
}
179 dissect_credssp_TSPasswordCreds(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
180 offset
= dissect_ber_sequence(implicit_tag
, actx
, tree
, tvb
, offset
,
181 TSPasswordCreds_sequence
, hf_index
, ett_credssp_TSPasswordCreds
);
189 dissect_credssp_INTEGER(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
190 offset
= dissect_ber_integer(implicit_tag
, actx
, tree
, tvb
, offset
, hf_index
,
197 static const ber_sequence_t TSCspDataDetail_sequence
[] = {
198 { &hf_credssp_keySpec
, BER_CLASS_CON
, 0, 0, dissect_credssp_INTEGER
},
199 { &hf_credssp_cardName
, BER_CLASS_CON
, 1, BER_FLAGS_OPTIONAL
, dissect_credssp_OCTET_STRING
},
200 { &hf_credssp_readerName
, BER_CLASS_CON
, 2, BER_FLAGS_OPTIONAL
, dissect_credssp_OCTET_STRING
},
201 { &hf_credssp_containerName
, BER_CLASS_CON
, 3, BER_FLAGS_OPTIONAL
, dissect_credssp_OCTET_STRING
},
202 { &hf_credssp_cspName
, BER_CLASS_CON
, 4, BER_FLAGS_OPTIONAL
, dissect_credssp_OCTET_STRING
},
203 { NULL
, 0, 0, 0, NULL
}
207 dissect_credssp_TSCspDataDetail(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
208 offset
= dissect_ber_sequence(implicit_tag
, actx
, tree
, tvb
, offset
,
209 TSCspDataDetail_sequence
, hf_index
, ett_credssp_TSCspDataDetail
);
215 static const ber_sequence_t TSSmartCardCreds_sequence
[] = {
216 { &hf_credssp_pin
, BER_CLASS_CON
, 0, 0, dissect_credssp_OCTET_STRING
},
217 { &hf_credssp_cspData
, BER_CLASS_CON
, 1, 0, dissect_credssp_TSCspDataDetail
},
218 { &hf_credssp_userHint
, BER_CLASS_CON
, 2, BER_FLAGS_OPTIONAL
, dissect_credssp_OCTET_STRING
},
219 { &hf_credssp_domainHint
, BER_CLASS_CON
, 3, BER_FLAGS_OPTIONAL
, dissect_credssp_OCTET_STRING
},
220 { NULL
, 0, 0, 0, NULL
}
224 dissect_credssp_TSSmartCardCreds(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
225 offset
= dissect_ber_sequence(implicit_tag
, actx
, tree
, tvb
, offset
,
226 TSSmartCardCreds_sequence
, hf_index
, ett_credssp_TSSmartCardCreds
);
234 dissect_credssp_T_credType(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
235 offset
= dissect_ber_integer(implicit_tag
, actx
, tree
, tvb
, offset
, hf_index
,
244 dissect_credssp_T_credentials(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
245 #line 24 "../../asn1/credssp/credssp.cnf"
246 tvbuff_t
*creds_tvb
= NULL
;
247 tvbuff_t
*decr_tvb
= NULL
;
249 offset
= dissect_ber_octet_string(implicit_tag
, actx
, tree
, tvb
, offset
, hf_index
,
253 if((decr_tvb
!= NULL
) &&
254 ((creds_type
== TS_PASSWORD_CREDS
) || (creds_type
== TS_SMARTCARD_CREDS
))) {
257 case TS_PASSWORD_CREDS
:
258 offset
= dissect_credssp_TSPasswordCreds(FALSE
, decr_tvb
, 0, actx
, tree
, hf_credssp_TSPasswordCreds
);
260 case TS_SMARTCARD_CREDS
:
261 offset
= dissect_credssp_TSSmartCardCreds(FALSE
, decr_tvb
, 0, actx
, tree
, hf_credssp_TSSmartCardCreds
);
273 static const ber_sequence_t TSCredentials_sequence
[] = {
274 { &hf_credssp_credType
, BER_CLASS_CON
, 0, 0, dissect_credssp_T_credType
},
275 { &hf_credssp_credentials
, BER_CLASS_CON
, 1, 0, dissect_credssp_T_credentials
},
276 { NULL
, 0, 0, 0, NULL
}
280 dissect_credssp_TSCredentials(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
281 offset
= dissect_ber_sequence(implicit_tag
, actx
, tree
, tvb
, offset
,
282 TSCredentials_sequence
, hf_index
, ett_credssp_TSCredentials
);
290 dissect_credssp_T_authInfo(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
291 #line 11 "../../asn1/credssp/credssp.cnf"
292 tvbuff_t
*auth_tvb
= NULL
;
293 tvbuff_t
*decr_tvb
= NULL
;
295 offset
= dissect_ber_octet_string(implicit_tag
, actx
, tree
, tvb
, offset
, hf_index
,
300 offset
= dissect_credssp_TSCredentials(FALSE
, decr_tvb
, 0, actx
, tree
, hf_credssp_TSCredentials
);
309 static const ber_sequence_t TSRequest_sequence
[] = {
310 { &hf_credssp_version
, BER_CLASS_CON
, 0, 0, dissect_credssp_INTEGER
},
311 { &hf_credssp_negoTokens
, BER_CLASS_CON
, 1, BER_FLAGS_OPTIONAL
, dissect_credssp_NegoData
},
312 { &hf_credssp_authInfo
, BER_CLASS_CON
, 2, BER_FLAGS_OPTIONAL
, dissect_credssp_T_authInfo
},
313 { &hf_credssp_pubKeyAuth
, BER_CLASS_CON
, 3, BER_FLAGS_OPTIONAL
, dissect_credssp_OCTET_STRING
},
314 { NULL
, 0, 0, 0, NULL
}
318 dissect_credssp_TSRequest(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
319 offset
= dissect_ber_sequence(implicit_tag
, actx
, tree
, tvb
, offset
,
320 TSRequest_sequence
, hf_index
, ett_credssp_TSRequest
);
327 static void dissect_TSRequest_PDU(tvbuff_t
*tvb _U_
, packet_info
*pinfo _U_
, proto_tree
*tree _U_
) {
329 asn1_ctx_init(&asn1_ctx
, ASN1_ENC_BER
, TRUE
, pinfo
);
330 dissect_credssp_TSRequest(FALSE
, tvb
, 0, &asn1_ctx
, tree
, hf_credssp_TSRequest_PDU
);
334 /*--- End of included file: packet-credssp-fn.c ---*/
335 #line 64 "../../asn1/credssp/packet-credssp-template.c"
338 * Dissect CredSSP PDUs
341 dissect_credssp(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*parent_tree
)
343 proto_item
*item
=NULL
;
344 proto_tree
*tree
=NULL
;
347 item
= proto_tree_add_item(parent_tree
, proto_credssp
, tvb
, 0, -1, ENC_NA
);
348 tree
= proto_item_add_subtree(item
, ett_credssp
);
350 col_set_str(pinfo
->cinfo
, COL_PROTOCOL
, "CredSSP");
351 col_clear(pinfo
->cinfo
, COL_INFO
);
354 dissect_TSRequest_PDU(tvb
, pinfo
, tree
);
358 dissect_credssp_heur(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*parent_tree
, void *data _U_
)
367 asn1_ctx_init(&asn1_ctx
, ASN1_ENC_BER
, TRUE
, pinfo
);
369 /* Look for SEQUENCE, CONTEXT 0, and INTEGER 2 */
370 if(tvb_length(tvb
) > 7) {
371 offset
= get_ber_identifier(tvb
, offset
, &ber_class
, &pc
, &tag
);
372 if((ber_class
== BER_CLASS_UNI
) && (tag
== BER_UNI_TAG_SEQUENCE
) && (pc
== TRUE
)) {
373 offset
= get_ber_length(tvb
, offset
, NULL
, NULL
);
374 offset
= get_ber_identifier(tvb
, offset
, &ber_class
, &pc
, &tag
);
375 if((ber_class
== BER_CLASS_CON
) && (tag
== 0)) {
376 offset
= get_ber_length(tvb
, offset
, NULL
, NULL
);
377 offset
= get_ber_identifier(tvb
, offset
, &ber_class
, &pc
, &tag
);
378 if((ber_class
== BER_CLASS_UNI
) && (tag
== BER_UNI_TAG_INTEGER
)) {
379 offset
= get_ber_length(tvb
, offset
, &length
, NULL
);
380 if((length
== 1) && (tvb_get_guint8(tvb
, offset
) == 2)) {
381 if (have_tap_listener(exported_pdu_tap
)) {
382 exp_pdu_data_t
*exp_pdu_data
;
384 exp_pdu_data
= load_export_pdu_tags(pinfo
, "credssp", -1,
385 (EXP_PDU_TAG_IP_SRC_BIT
| EXP_PDU_TAG_IP_DST_BIT
| EXP_PDU_TAG_SRC_PORT_BIT
|
386 EXP_PDU_TAG_DST_PORT_BIT
| EXP_PDU_TAG_ORIG_FNO_BIT
));
388 exp_pdu_data
->tvb_length
= tvb_length(tvb
);
389 exp_pdu_data
->pdu_tvb
= tvb
;
391 tap_queue_packet(exported_pdu_tap
, pinfo
, exp_pdu_data
);
393 dissect_credssp(tvb
, pinfo
, parent_tree
);
404 /*--- proto_register_credssp -------------------------------------------*/
405 void proto_register_credssp(void) {
408 static hf_register_info hf
[] =
410 { &hf_credssp_TSPasswordCreds
,
411 { "TSPasswordCreds", "credssp.TSPasswordCreds",
412 FT_NONE
, BASE_NONE
, NULL
, 0,
414 { &hf_credssp_TSSmartCardCreds
,
415 { "TSSmartCardCreds", "credssp.TSSmartCardCreds",
416 FT_NONE
, BASE_NONE
, NULL
, 0,
418 { &hf_credssp_TSCredentials
,
419 { "TSCredentials", "credssp.TSCredentials",
420 FT_NONE
, BASE_NONE
, NULL
, 0,
423 /*--- Included file: packet-credssp-hfarr.c ---*/
424 #line 1 "../../asn1/credssp/packet-credssp-hfarr.c"
425 { &hf_credssp_TSRequest_PDU
,
426 { "TSRequest", "credssp.TSRequest_element",
427 FT_NONE
, BASE_NONE
, NULL
, 0,
429 { &hf_credssp_NegoData_item
,
430 { "NegoData item", "credssp.NegoData_item_element",
431 FT_NONE
, BASE_NONE
, NULL
, 0,
433 { &hf_credssp_negoToken
,
434 { "negoToken", "credssp.negoToken",
435 FT_BYTES
, BASE_NONE
, NULL
, 0,
437 { &hf_credssp_domainName
,
438 { "domainName", "credssp.domainName",
439 FT_BYTES
, BASE_NONE
, NULL
, 0,
440 "OCTET_STRING", HFILL
}},
441 { &hf_credssp_userName
,
442 { "userName", "credssp.userName",
443 FT_BYTES
, BASE_NONE
, NULL
, 0,
444 "OCTET_STRING", HFILL
}},
445 { &hf_credssp_password
,
446 { "password", "credssp.password",
447 FT_BYTES
, BASE_NONE
, NULL
, 0,
448 "OCTET_STRING", HFILL
}},
449 { &hf_credssp_keySpec
,
450 { "keySpec", "credssp.keySpec",
451 FT_INT32
, BASE_DEC
, NULL
, 0,
453 { &hf_credssp_cardName
,
454 { "cardName", "credssp.cardName",
455 FT_BYTES
, BASE_NONE
, NULL
, 0,
456 "OCTET_STRING", HFILL
}},
457 { &hf_credssp_readerName
,
458 { "readerName", "credssp.readerName",
459 FT_BYTES
, BASE_NONE
, NULL
, 0,
460 "OCTET_STRING", HFILL
}},
461 { &hf_credssp_containerName
,
462 { "containerName", "credssp.containerName",
463 FT_BYTES
, BASE_NONE
, NULL
, 0,
464 "OCTET_STRING", HFILL
}},
465 { &hf_credssp_cspName
,
466 { "cspName", "credssp.cspName",
467 FT_BYTES
, BASE_NONE
, NULL
, 0,
468 "OCTET_STRING", HFILL
}},
470 { "pin", "credssp.pin",
471 FT_BYTES
, BASE_NONE
, NULL
, 0,
472 "OCTET_STRING", HFILL
}},
473 { &hf_credssp_cspData
,
474 { "cspData", "credssp.cspData_element",
475 FT_NONE
, BASE_NONE
, NULL
, 0,
476 "TSCspDataDetail", HFILL
}},
477 { &hf_credssp_userHint
,
478 { "userHint", "credssp.userHint",
479 FT_BYTES
, BASE_NONE
, NULL
, 0,
480 "OCTET_STRING", HFILL
}},
481 { &hf_credssp_domainHint
,
482 { "domainHint", "credssp.domainHint",
483 FT_BYTES
, BASE_NONE
, NULL
, 0,
484 "OCTET_STRING", HFILL
}},
485 { &hf_credssp_credType
,
486 { "credType", "credssp.credType",
487 FT_INT32
, BASE_DEC
, NULL
, 0,
489 { &hf_credssp_credentials
,
490 { "credentials", "credssp.credentials",
491 FT_BYTES
, BASE_NONE
, NULL
, 0,
493 { &hf_credssp_version
,
494 { "version", "credssp.version",
495 FT_INT32
, BASE_DEC
, NULL
, 0,
497 { &hf_credssp_negoTokens
,
498 { "negoTokens", "credssp.negoTokens",
499 FT_UINT32
, BASE_DEC
, NULL
, 0,
500 "NegoData", HFILL
}},
501 { &hf_credssp_authInfo
,
502 { "authInfo", "credssp.authInfo",
503 FT_BYTES
, BASE_NONE
, NULL
, 0,
505 { &hf_credssp_pubKeyAuth
,
506 { "pubKeyAuth", "credssp.pubKeyAuth",
507 FT_BYTES
, BASE_NONE
, NULL
, 0,
508 "OCTET_STRING", HFILL
}},
510 /*--- End of included file: packet-credssp-hfarr.c ---*/
511 #line 151 "../../asn1/credssp/packet-credssp-template.c"
514 /* List of subtrees */
515 static gint
*ett
[] = {
518 /*--- Included file: packet-credssp-ettarr.c ---*/
519 #line 1 "../../asn1/credssp/packet-credssp-ettarr.c"
520 &ett_credssp_NegoData
,
521 &ett_credssp_NegoData_item
,
522 &ett_credssp_TSPasswordCreds
,
523 &ett_credssp_TSCspDataDetail
,
524 &ett_credssp_TSSmartCardCreds
,
525 &ett_credssp_TSCredentials
,
526 &ett_credssp_TSRequest
,
528 /*--- End of included file: packet-credssp-ettarr.c ---*/
529 #line 157 "../../asn1/credssp/packet-credssp-template.c"
533 /* Register protocol */
534 proto_credssp
= proto_register_protocol(PNAME
, PSNAME
, PFNAME
);
535 register_dissector("credssp", dissect_credssp
, proto_credssp
);
537 /* Register fields and subtrees */
538 proto_register_field_array(proto_credssp
, hf
, array_length(hf
));
539 proto_register_subtree_array(ett
, array_length(ett
));
541 /* heuristic dissectors for any premable e.g. CredSSP before RDP */
542 register_heur_dissector_list("credssp", &credssp_heur_subdissector_list
);
547 /*--- proto_reg_handoff_credssp --- */
548 void proto_reg_handoff_credssp(void) {
550 heur_dissector_add("ssl", dissect_credssp_heur
, proto_credssp
);
551 exported_pdu_tap
= find_tap_id(EXPORT_PDU_TAP_NAME_LAYER_7
);