1 /* Do not modify this file. Changes will be overwritten. */
2 /* Generated automatically by the ASN.1 to Wireshark dissector compiler */
4 /* asn2wrs.py -b -p ldap -c ./ldap.cnf -s ./packet-ldap-template -D . -O ../.. Lightweight-Directory-Access-Protocol-V3.asn */
6 /* Input file: packet-ldap-template.c */
8 #line 1 "./asn1/ldap/packet-ldap-template.c"
9 /* packet-ldap-template.c
10 * Routines for ldap packet dissection
12 * See RFC 3494 (LDAP v2), RFC 4511 (LDAP v3), and RFC 2222 (SASL).
14 * Wireshark - Network traffic analyzer
15 * By Gerald Combs <gerald@wireshark.org>
16 * Copyright 1998 Gerald Combs
18 * SPDX-License-Identifier: GPL-2.0-or-later
22 * This is not a complete implementation. It doesn't handle the full version 3, more specifically,
23 * it handles only the commands of version 2, but any additional characteristics of the ver3 command are supported.
24 * It's also missing extensible search filters.
26 * There should probably be a lot more error checking, I simply assume that if we have a full packet, it will be a complete
29 * AFAIK, it will handle all messages used by the OpenLDAP 1.2.9 server and libraries which was my goal. I do plan to add
30 * the remaining commands as time permits but this is not a priority to me. Send me an email if you need it and I'll see what
34 * nazard@dragoninc.on.ca
38 * 11/11/2002 - Fixed problem when decoding LDAP with desegmentation enabled and the
39 * ASN.1 BER Universal Class Tag: "Sequence Of" header is encapsulated across 2
43 * ronald.henderson@cognicaseusa.com
47 * 20-JAN-2004 - added decoding of MS-CLDAP netlogon RPC
48 * using information from the SNIA 2003 conference paper :
49 * Active Directory Domain Controller Location Service
55 * 17-DEC-2004 - added basic decoding for LDAP Controls
56 * 20-DEC-2004 - added handling for GSS-API encrypted blobs
58 * Stefan Metzmacher <metze@samba.org>
60 * 15-NOV-2005 - Changed to use the asn2wrs compiler
61 * Anders Broman <anders.broman@ericsson.com>
65 * 3-AUG-2008 - Extended the cldap support to include all netlogon data types.
66 * Updated cldap_netlogon_flags to include Windows 2008 flags
67 * Expanded the ntver ldap option with bit field
69 * Gary Reynolds <gazzadownunder@yahoo.co.uk>
73 * 09-DEC-2009 - Added support for RFC4533
74 * Content Synchronization Operation (aka syncrepl)
75 * 11-DEC-2009 - Added support for IntermediateResponse (LDAP v3 from RFC 4511)
76 * Mathieu Parent <math.parent@gmail.com>
81 #include <epan/packet.h>
82 #include <epan/exceptions.h>
83 #include <epan/conversation.h>
84 #include <epan/prefs.h>
86 #include <epan/srt_table.h>
87 #include <epan/oids.h>
88 #include <epan/strutil.h>
89 #include <epan/show_exception.h>
90 #include <epan/asn1.h>
91 #include <epan/expert.h>
93 #include <wsutil/str_util.h>
94 #include "packet-frame.h"
95 #include "packet-tcp.h"
96 #include "packet-windows-common.h"
97 #include "packet-dcerpc.h"
99 #include "packet-ldap.h"
100 #include "packet-ntlmssp.h"
101 #include "packet-tls.h"
102 #include "packet-tls-utils.h"
103 #include "packet-gssapi.h"
104 #include "packet-acdr.h"
106 #include "packet-ber.h"
107 #include "packet-per.h"
108 #include "packet-dns.h"
110 #define PNAME "Lightweight Directory Access Protocol"
111 #define PSNAME "LDAP"
112 #define PFNAME "ldap"
114 void proto_register_ldap(void);
115 void proto_reg_handoff_ldap(void);
117 /* Initialize the protocol and registered fields */
118 static int ldap_tap
= -1;
119 static int proto_ldap
= -1;
120 static int proto_cldap
= -1;
122 static int hf_ldap_sasl_buffer_length
= -1;
123 static int hf_ldap_response_in
= -1;
124 static int hf_ldap_response_to
= -1;
125 static int hf_ldap_time
= -1;
126 static int hf_ldap_guid
= -1;
128 static int hf_mscldap_ntver_flags
= -1;
129 static int hf_mscldap_ntver_flags_v1
= -1;
130 static int hf_mscldap_ntver_flags_v5
= -1;
131 static int hf_mscldap_ntver_flags_v5ex
= -1;
132 static int hf_mscldap_ntver_flags_v5ep
= -1;
133 static int hf_mscldap_ntver_flags_vcs
= -1;
134 static int hf_mscldap_ntver_flags_vnt4
= -1;
135 static int hf_mscldap_ntver_flags_vpdc
= -1;
136 static int hf_mscldap_ntver_flags_vip
= -1;
137 static int hf_mscldap_ntver_flags_vl
= -1;
138 static int hf_mscldap_ntver_flags_vgc
= -1;
140 static int hf_mscldap_netlogon_ipaddress_family
= -1;
141 static int hf_mscldap_netlogon_ipaddress_port
= -1;
142 static int hf_mscldap_netlogon_ipaddress
= -1;
143 static int hf_mscldap_netlogon_ipaddress_ipv4
= -1;
144 static int hf_mscldap_netlogon_opcode
= -1;
145 static int hf_mscldap_netlogon_flags
= -1;
146 static int hf_mscldap_netlogon_flags_pdc
= -1;
147 static int hf_mscldap_netlogon_flags_gc
= -1;
148 static int hf_mscldap_netlogon_flags_ldap
= -1;
149 static int hf_mscldap_netlogon_flags_ds
= -1;
150 static int hf_mscldap_netlogon_flags_kdc
= -1;
151 static int hf_mscldap_netlogon_flags_timeserv
= -1;
152 static int hf_mscldap_netlogon_flags_closest
= -1;
153 static int hf_mscldap_netlogon_flags_writable
= -1;
154 static int hf_mscldap_netlogon_flags_good_timeserv
= -1;
155 static int hf_mscldap_netlogon_flags_ndnc
= -1;
156 static int hf_mscldap_netlogon_flags_fnc
= -1;
157 static int hf_mscldap_netlogon_flags_dnc
= -1;
158 static int hf_mscldap_netlogon_flags_dns
= -1;
159 static int hf_mscldap_netlogon_flags_wdc
= -1;
160 static int hf_mscldap_netlogon_flags_rodc
= -1;
161 static int hf_mscldap_domain_guid
= -1;
162 static int hf_mscldap_forest
= -1;
163 static int hf_mscldap_domain
= -1;
164 static int hf_mscldap_hostname
= -1;
165 static int hf_mscldap_nb_domain_z
= -1;
166 static int hf_mscldap_nb_domain
= -1;
167 static int hf_mscldap_nb_hostname_z
= -1;
168 static int hf_mscldap_nb_hostname
= -1;
169 static int hf_mscldap_username_z
= -1;
170 static int hf_mscldap_username
= -1;
171 static int hf_mscldap_sitename
= -1;
172 static int hf_mscldap_clientsitename
= -1;
173 static int hf_mscldap_netlogon_lm_token
= -1;
174 static int hf_mscldap_netlogon_nt_token
= -1;
175 static int hf_ldap_sid
= -1;
176 static int hf_ldap_AccessMask_ADS_CREATE_CHILD
= -1;
177 static int hf_ldap_AccessMask_ADS_DELETE_CHILD
= -1;
178 static int hf_ldap_AccessMask_ADS_LIST
= -1;
179 static int hf_ldap_AccessMask_ADS_SELF_WRITE
= -1;
180 static int hf_ldap_AccessMask_ADS_READ_PROP
= -1;
181 static int hf_ldap_AccessMask_ADS_WRITE_PROP
= -1;
182 static int hf_ldap_AccessMask_ADS_DELETE_TREE
= -1;
183 static int hf_ldap_AccessMask_ADS_LIST_OBJECT
= -1;
184 static int hf_ldap_AccessMask_ADS_CONTROL_ACCESS
= -1;
185 static int hf_ldap_LDAPMessage_PDU
= -1;
186 static int hf_ldap_object_security_flag
= -1;
187 static int hf_ldap_ancestor_first_flag
= -1;
188 static int hf_ldap_public_data_only_flag
= -1;
189 static int hf_ldap_incremental_value_flag
= -1;
190 static int hf_ldap_oid
= -1;
191 static int hf_ldap_gssapi_encrypted_payload
= -1;
194 /*--- Included file: packet-ldap-hf.c ---*/
195 #line 1 "./asn1/ldap/packet-ldap-hf.c"
196 static int hf_ldap_SearchControlValue_PDU
= -1; /* SearchControlValue */
197 static int hf_ldap_SortKeyList_PDU
= -1; /* SortKeyList */
198 static int hf_ldap_SortResult_PDU
= -1; /* SortResult */
199 static int hf_ldap_DirSyncControlValue_PDU
= -1; /* DirSyncControlValue */
200 static int hf_ldap_PasswdModifyRequestValue_PDU
= -1; /* PasswdModifyRequestValue */
201 static int hf_ldap_CancelRequestValue_PDU
= -1; /* CancelRequestValue */
202 static int hf_ldap_SyncRequestValue_PDU
= -1; /* SyncRequestValue */
203 static int hf_ldap_SyncStateValue_PDU
= -1; /* SyncStateValue */
204 static int hf_ldap_SyncDoneValue_PDU
= -1; /* SyncDoneValue */
205 static int hf_ldap_SyncInfoValue_PDU
= -1; /* SyncInfoValue */
206 static int hf_ldap_PasswordPolicyResponseValue_PDU
= -1; /* PasswordPolicyResponseValue */
207 static int hf_ldap_messageID
= -1; /* MessageID */
208 static int hf_ldap_protocolOp
= -1; /* ProtocolOp */
209 static int hf_ldap_controls
= -1; /* Controls */
210 static int hf_ldap_bindRequest
= -1; /* BindRequest */
211 static int hf_ldap_bindResponse
= -1; /* BindResponse */
212 static int hf_ldap_unbindRequest
= -1; /* UnbindRequest */
213 static int hf_ldap_searchRequest
= -1; /* SearchRequest */
214 static int hf_ldap_searchResEntry
= -1; /* SearchResultEntry */
215 static int hf_ldap_searchResDone
= -1; /* SearchResultDone */
216 static int hf_ldap_searchResRef
= -1; /* SearchResultReference */
217 static int hf_ldap_modifyRequest
= -1; /* ModifyRequest */
218 static int hf_ldap_modifyResponse
= -1; /* ModifyResponse */
219 static int hf_ldap_addRequest
= -1; /* AddRequest */
220 static int hf_ldap_addResponse
= -1; /* AddResponse */
221 static int hf_ldap_delRequest
= -1; /* DelRequest */
222 static int hf_ldap_delResponse
= -1; /* DelResponse */
223 static int hf_ldap_modDNRequest
= -1; /* ModifyDNRequest */
224 static int hf_ldap_modDNResponse
= -1; /* ModifyDNResponse */
225 static int hf_ldap_compareRequest
= -1; /* CompareRequest */
226 static int hf_ldap_compareResponse
= -1; /* CompareResponse */
227 static int hf_ldap_abandonRequest
= -1; /* AbandonRequest */
228 static int hf_ldap_extendedReq
= -1; /* ExtendedRequest */
229 static int hf_ldap_extendedResp
= -1; /* ExtendedResponse */
230 static int hf_ldap_intermediateResponse
= -1; /* IntermediateResponse */
231 static int hf_ldap_AttributeDescriptionList_item
= -1; /* AttributeDescription */
232 static int hf_ldap_attributeDesc
= -1; /* AttributeDescription */
233 static int hf_ldap_assertionValue
= -1; /* AssertionValue */
234 static int hf_ldap_type
= -1; /* AttributeDescription */
235 static int hf_ldap_vals
= -1; /* SET_OF_AttributeValue */
236 static int hf_ldap_vals_item
= -1; /* AttributeValue */
237 static int hf_ldap_resultCode
= -1; /* T_resultCode */
238 static int hf_ldap_matchedDN
= -1; /* LDAPDN */
239 static int hf_ldap_errorMessage
= -1; /* ErrorMessage */
240 static int hf_ldap_referral
= -1; /* Referral */
241 static int hf_ldap_Referral_item
= -1; /* LDAPURL */
242 static int hf_ldap_Controls_item
= -1; /* Control */
243 static int hf_ldap_controlType
= -1; /* ControlType */
244 static int hf_ldap_criticality
= -1; /* BOOLEAN */
245 static int hf_ldap_controlValue
= -1; /* T_controlValue */
246 static int hf_ldap_version
= -1; /* INTEGER_1_127 */
247 static int hf_ldap_name
= -1; /* LDAPDN */
248 static int hf_ldap_authentication
= -1; /* AuthenticationChoice */
249 static int hf_ldap_simple
= -1; /* Simple */
250 static int hf_ldap_sasl
= -1; /* SaslCredentials */
251 static int hf_ldap_ntlmsspNegotiate
= -1; /* T_ntlmsspNegotiate */
252 static int hf_ldap_ntlmsspAuth
= -1; /* T_ntlmsspAuth */
253 static int hf_ldap_mechanism
= -1; /* Mechanism */
254 static int hf_ldap_credentials
= -1; /* Credentials */
255 static int hf_ldap_bindResponse_resultCode
= -1; /* BindResponse_resultCode */
256 static int hf_ldap_bindResponse_matchedDN
= -1; /* T_bindResponse_matchedDN */
257 static int hf_ldap_serverSaslCreds
= -1; /* ServerSaslCreds */
258 static int hf_ldap_baseObject
= -1; /* LDAPDN */
259 static int hf_ldap_scope
= -1; /* T_scope */
260 static int hf_ldap_derefAliases
= -1; /* T_derefAliases */
261 static int hf_ldap_sizeLimit
= -1; /* INTEGER_0_maxInt */
262 static int hf_ldap_timeLimit
= -1; /* INTEGER_0_maxInt */
263 static int hf_ldap_typesOnly
= -1; /* BOOLEAN */
264 static int hf_ldap_filter
= -1; /* T_filter */
265 static int hf_ldap_searchRequest_attributes
= -1; /* AttributeDescriptionList */
266 static int hf_ldap_and
= -1; /* T_and */
267 static int hf_ldap_and_item
= -1; /* T_and_item */
268 static int hf_ldap_or
= -1; /* T_or */
269 static int hf_ldap_or_item
= -1; /* T_or_item */
270 static int hf_ldap_not
= -1; /* T_not */
271 static int hf_ldap_equalityMatch
= -1; /* T_equalityMatch */
272 static int hf_ldap_substrings
= -1; /* SubstringFilter */
273 static int hf_ldap_greaterOrEqual
= -1; /* T_greaterOrEqual */
274 static int hf_ldap_lessOrEqual
= -1; /* T_lessOrEqual */
275 static int hf_ldap_present
= -1; /* T_present */
276 static int hf_ldap_approxMatch
= -1; /* T_approxMatch */
277 static int hf_ldap_extensibleMatch
= -1; /* T_extensibleMatch */
278 static int hf_ldap_substringFilter_substrings
= -1; /* T_substringFilter_substrings */
279 static int hf_ldap_substringFilter_substrings_item
= -1; /* T_substringFilter_substrings_item */
280 static int hf_ldap_initial
= -1; /* LDAPString */
281 static int hf_ldap_any
= -1; /* LDAPString */
282 static int hf_ldap_final
= -1; /* LDAPString */
283 static int hf_ldap_matchingRule
= -1; /* MatchingRuleId */
284 static int hf_ldap_matchValue
= -1; /* AssertionValue */
285 static int hf_ldap_dnAttributes
= -1; /* T_dnAttributes */
286 static int hf_ldap_objectName
= -1; /* LDAPDN */
287 static int hf_ldap_searchResultEntry_attributes
= -1; /* PartialAttributeList */
288 static int hf_ldap_PartialAttributeList_item
= -1; /* PartialAttributeList_item */
289 static int hf_ldap__untag_item
= -1; /* LDAPURL */
290 static int hf_ldap_object
= -1; /* LDAPDN */
291 static int hf_ldap_modifyRequest_modification
= -1; /* ModifyRequest_modification */
292 static int hf_ldap_modifyRequest_modification_item
= -1; /* T_modifyRequest_modification_item */
293 static int hf_ldap_operation
= -1; /* T_operation */
294 static int hf_ldap_modification
= -1; /* AttributeTypeAndValues */
295 static int hf_ldap_entry
= -1; /* LDAPDN */
296 static int hf_ldap_attributes
= -1; /* AttributeList */
297 static int hf_ldap_AttributeList_item
= -1; /* AttributeList_item */
298 static int hf_ldap_newrdn
= -1; /* RelativeLDAPDN */
299 static int hf_ldap_deleteoldrdn
= -1; /* BOOLEAN */
300 static int hf_ldap_newSuperior
= -1; /* LDAPDN */
301 static int hf_ldap_ava
= -1; /* AttributeValueAssertion */
302 static int hf_ldap_requestName
= -1; /* LDAPOID */
303 static int hf_ldap_requestValue
= -1; /* T_requestValue */
304 static int hf_ldap_extendedResponse_resultCode
= -1; /* ExtendedResponse_resultCode */
305 static int hf_ldap_responseName
= -1; /* ResponseName */
306 static int hf_ldap_response
= -1; /* OCTET_STRING */
307 static int hf_ldap_intermediateResponse_responseValue
= -1; /* T_intermediateResponse_responseValue */
308 static int hf_ldap_size
= -1; /* INTEGER */
309 static int hf_ldap_cookie
= -1; /* OCTET_STRING */
310 static int hf_ldap_SortKeyList_item
= -1; /* SortKeyList_item */
311 static int hf_ldap_attributeType
= -1; /* AttributeDescription */
312 static int hf_ldap_orderingRule
= -1; /* MatchingRuleId */
313 static int hf_ldap_reverseOrder
= -1; /* BOOLEAN */
314 static int hf_ldap_sortResult
= -1; /* T_sortResult */
315 static int hf_ldap_flags
= -1; /* DirSyncFlags */
316 static int hf_ldap_maxBytes
= -1; /* INTEGER */
317 static int hf_ldap_userIdentity
= -1; /* OCTET_STRING */
318 static int hf_ldap_oldPasswd
= -1; /* OCTET_STRING */
319 static int hf_ldap_newPasswd
= -1; /* OCTET_STRING */
320 static int hf_ldap_cancelID
= -1; /* MessageID */
321 static int hf_ldap_mode
= -1; /* T_mode */
322 static int hf_ldap_reloadHint
= -1; /* BOOLEAN */
323 static int hf_ldap_state
= -1; /* T_state */
324 static int hf_ldap_entryUUID
= -1; /* SyncUUID */
325 static int hf_ldap_refreshDeletes
= -1; /* BOOLEAN */
326 static int hf_ldap_newcookie
= -1; /* OCTET_STRING */
327 static int hf_ldap_refreshDelete
= -1; /* T_refreshDelete */
328 static int hf_ldap_refreshDone
= -1; /* BOOLEAN */
329 static int hf_ldap_refreshPresent
= -1; /* T_refreshPresent */
330 static int hf_ldap_syncIdSet
= -1; /* T_syncIdSet */
331 static int hf_ldap_syncUUIDs
= -1; /* SET_OF_SyncUUID */
332 static int hf_ldap_syncUUIDs_item
= -1; /* SyncUUID */
333 static int hf_ldap_warning
= -1; /* T_warning */
334 static int hf_ldap_timeBeforeExpiration
= -1; /* INTEGER_0_maxInt */
335 static int hf_ldap_graceAuthNsRemaining
= -1; /* INTEGER_0_maxInt */
336 static int hf_ldap_error
= -1; /* T_error */
338 /*--- End of included file: packet-ldap-hf.c ---*/
339 #line 186 "./asn1/ldap/packet-ldap-template.c"
341 /* Initialize the subtree pointers */
342 static gint ett_ldap
= -1;
343 static gint ett_ldap_msg
= -1;
344 static gint ett_ldap_sasl_blob
= -1;
345 static gint ett_ldap_payload
= -1;
346 static gint ett_mscldap_netlogon_flags
= -1;
347 static gint ett_mscldap_ntver_flags
= -1;
348 static gint ett_mscldap_ipdetails
= -1;
349 static gint ett_ldap_DirSyncFlagsSubEntry
= -1;
352 /*--- Included file: packet-ldap-ett.c ---*/
353 #line 1 "./asn1/ldap/packet-ldap-ett.c"
354 static gint ett_ldap_LDAPMessage
= -1;
355 static gint ett_ldap_ProtocolOp
= -1;
356 static gint ett_ldap_AttributeDescriptionList
= -1;
357 static gint ett_ldap_AttributeValueAssertion
= -1;
358 static gint ett_ldap_Attribute
= -1;
359 static gint ett_ldap_SET_OF_AttributeValue
= -1;
360 static gint ett_ldap_LDAPResult
= -1;
361 static gint ett_ldap_Referral
= -1;
362 static gint ett_ldap_Controls
= -1;
363 static gint ett_ldap_Control
= -1;
364 static gint ett_ldap_BindRequest_U
= -1;
365 static gint ett_ldap_AuthenticationChoice
= -1;
366 static gint ett_ldap_SaslCredentials
= -1;
367 static gint ett_ldap_BindResponse_U
= -1;
368 static gint ett_ldap_SearchRequest_U
= -1;
369 static gint ett_ldap_Filter
= -1;
370 static gint ett_ldap_T_and
= -1;
371 static gint ett_ldap_T_or
= -1;
372 static gint ett_ldap_SubstringFilter
= -1;
373 static gint ett_ldap_T_substringFilter_substrings
= -1;
374 static gint ett_ldap_T_substringFilter_substrings_item
= -1;
375 static gint ett_ldap_MatchingRuleAssertion
= -1;
376 static gint ett_ldap_SearchResultEntry_U
= -1;
377 static gint ett_ldap_PartialAttributeList
= -1;
378 static gint ett_ldap_PartialAttributeList_item
= -1;
379 static gint ett_ldap_SEQUENCE_OF_LDAPURL
= -1;
380 static gint ett_ldap_ModifyRequest_U
= -1;
381 static gint ett_ldap_ModifyRequest_modification
= -1;
382 static gint ett_ldap_T_modifyRequest_modification_item
= -1;
383 static gint ett_ldap_AttributeTypeAndValues
= -1;
384 static gint ett_ldap_AddRequest_U
= -1;
385 static gint ett_ldap_AttributeList
= -1;
386 static gint ett_ldap_AttributeList_item
= -1;
387 static gint ett_ldap_ModifyDNRequest_U
= -1;
388 static gint ett_ldap_CompareRequest_U
= -1;
389 static gint ett_ldap_ExtendedRequest_U
= -1;
390 static gint ett_ldap_ExtendedResponse_U
= -1;
391 static gint ett_ldap_IntermediateResponse_U
= -1;
392 static gint ett_ldap_SearchControlValue
= -1;
393 static gint ett_ldap_SortKeyList
= -1;
394 static gint ett_ldap_SortKeyList_item
= -1;
395 static gint ett_ldap_SortResult
= -1;
396 static gint ett_ldap_DirSyncControlValue
= -1;
397 static gint ett_ldap_PasswdModifyRequestValue
= -1;
398 static gint ett_ldap_CancelRequestValue
= -1;
399 static gint ett_ldap_SyncRequestValue
= -1;
400 static gint ett_ldap_SyncStateValue
= -1;
401 static gint ett_ldap_SyncDoneValue
= -1;
402 static gint ett_ldap_SyncInfoValue
= -1;
403 static gint ett_ldap_T_refreshDelete
= -1;
404 static gint ett_ldap_T_refreshPresent
= -1;
405 static gint ett_ldap_T_syncIdSet
= -1;
406 static gint ett_ldap_SET_OF_SyncUUID
= -1;
407 static gint ett_ldap_PasswordPolicyResponseValue
= -1;
408 static gint ett_ldap_T_warning
= -1;
410 /*--- End of included file: packet-ldap-ett.c ---*/
411 #line 198 "./asn1/ldap/packet-ldap-template.c"
413 static expert_field ei_ldap_exceeded_filter_length
= EI_INIT
;
414 static expert_field ei_ldap_too_many_filter_elements
= EI_INIT
;
416 static dissector_table_t ldap_name_dissector_table
=NULL
;
417 static const char *object_identifier_id
= NULL
; /* LDAP OID */
419 static gboolean do_protocolop
= FALSE
;
420 static gchar
*attr_type
= NULL
;
421 static gboolean is_binary_attr_type
= FALSE
;
422 static gboolean ldap_found_in_frame
= FALSE
;
424 #define TCP_PORT_RANGE_LDAP "389,3268" /* 3268 is Windows 2000 Global Catalog */
425 #define TCP_PORT_LDAPS 636
426 #define UDP_PORT_CLDAP 389
428 /* desegmentation of LDAP */
429 static gboolean ldap_desegment
= TRUE
;
430 static guint global_ldaps_tcp_port
= TCP_PORT_LDAPS
;
431 static guint ssl_port
= 0;
433 static dissector_handle_t gssapi_handle
;
434 static dissector_handle_t gssapi_wrap_handle
;
435 static dissector_handle_t ntlmssp_handle
;
436 static dissector_handle_t spnego_handle
;
437 static dissector_handle_t tls_handle
;
438 static dissector_handle_t ldap_handle
;
440 static void prefs_register_ldap(void); /* forward declaration for use in preferences registration */
443 /* different types of rpc calls ontop of ms cldap */
444 #define MSCLDAP_RPC_NETLOGON 1
446 /* Message type Choice values */
447 static const value_string ldap_ProtocolOp_choice_vals
[] = {
448 { 0, "bindRequest" },
449 { 1, "bindResponse" },
450 { 2, "unbindRequest" },
451 { 3, "searchRequest" },
452 { 4, "searchResEntry" },
453 { 5, "searchResDone" },
454 { 6, "searchResRef" },
455 { 7, "modifyRequest" },
456 { 8, "modifyResponse" },
458 { 10, "addResponse" },
459 { 11, "delRequest" },
460 { 12, "delResponse" },
461 { 13, "modDNRequest" },
462 { 14, "modDNResponse" },
463 { 15, "compareRequest" },
464 { 16, "compareResponse" },
465 { 17, "abandonRequest" },
466 { 18, "extendedReq" },
467 { 19, "extendedResp" },
468 { 20, "intermediateResponse" },
472 /* Procedure names (used in Service Response Time */
473 const value_string ldap_procedure_names
[] = {
485 #define LOGON_PRIMARY_QUERY 7
486 #define LOGON_PRIMARY_RESPONSE 12
487 #define LOGON_SAM_LOGON_REQUEST 18
488 #define LOGON_SAM_LOGON_RESPONSE 19
489 #define LOGON_SAM_PAUSE_RESPONSE 20
490 #define LOGON_SAM_USER_UNKNOWN 21
491 #define LOGON_SAM_LOGON_RESPONSE_EX 23
492 #define LOGON_SAM_PAUSE_RESPONSE_EX 24
493 #define LOGON_SAM_USER_UNKNOWN_EX 25
495 static const value_string netlogon_opcode_vals
[] = {
496 { LOGON_PRIMARY_QUERY
, "LOGON_PRIMARY_QUERY" },
497 { LOGON_PRIMARY_RESPONSE
, "LOGON_PRIMARY_RESPONSE" },
498 { LOGON_SAM_LOGON_REQUEST
, "LOGON_SAM_LOGON_REQUEST" },
499 { LOGON_SAM_LOGON_RESPONSE
, "LOGON_SAM_LOGON_RESPONSE" },
500 { LOGON_SAM_PAUSE_RESPONSE
, "LOGON_SAM_PAUSE_RESPONSE" },
501 { LOGON_SAM_LOGON_RESPONSE_EX
, "LOGON_SAM_LOGON_RESPONSE_EX" },
502 { LOGON_SAM_PAUSE_RESPONSE_EX
, "LOGON_SAM_PAUSE_RESPONSE_EX" },
503 { LOGON_SAM_USER_UNKNOWN_EX
, "LOGON_SAM_USER_UNKNOWN_EX" },
507 #define LDAP_NUM_PROCEDURES 24
510 ldapstat_init(struct register_srt
* srt _U_
, GArray
* srt_array
)
512 srt_stat_table
*ldap_srt_table
;
515 ldap_srt_table
= init_srt_table("LDAP Commands", NULL
, srt_array
, LDAP_NUM_PROCEDURES
, NULL
, "ldap.protocolOp", NULL
);
516 for (i
= 0; i
< LDAP_NUM_PROCEDURES
; i
++)
518 init_srt_table_row(ldap_srt_table
, i
, val_to_str_const(i
, ldap_procedure_names
, "<unknown>"));
522 static tap_packet_status
523 ldapstat_packet(void *pldap
, packet_info
*pinfo
, epan_dissect_t
*edt _U_
, const void *psi
)
526 srt_stat_table
*ldap_srt_table
;
527 const ldap_call_response_t
*ldap
=(const ldap_call_response_t
*)psi
;
528 srt_data_t
*data
= (srt_data_t
*)pldap
;
530 /* we are only interested in reply packets */
531 if(ldap
->is_request
){
532 return TAP_PACKET_DONT_REDRAW
;
534 /* if we havnt seen the request, just ignore it */
535 if(!ldap
->req_frame
){
536 return TAP_PACKET_DONT_REDRAW
;
539 /* only use the commands we know how to handle */
540 switch(ldap
->protocolOpTag
){
542 case LDAP_REQ_SEARCH
:
543 case LDAP_REQ_MODIFY
:
545 case LDAP_REQ_DELETE
:
546 case LDAP_REQ_MODRDN
:
547 case LDAP_REQ_COMPARE
:
548 case LDAP_REQ_EXTENDED
:
551 return TAP_PACKET_DONT_REDRAW
;
554 ldap_srt_table
= g_array_index(data
->srt_array
, srt_stat_table
*, i
);
556 add_srt_table_data(ldap_srt_table
, ldap
->protocolOpTag
, &ldap
->req_time
, pinfo
);
557 return TAP_PACKET_REDRAW
;
561 * Data structure attached to a conversation, giving authentication
562 * information from a bind request.
564 typedef struct ldap_conv_info_t
{
565 guint auth_type
; /* authentication type */
566 char *auth_mech
; /* authentication mechanism */
567 guint32 first_auth_frame
; /* first frame that would use a security layer */
568 wmem_map_t
*unmatched
;
572 gboolean start_tls_pending
;
573 guint32 start_tls_frame
;
577 ldap_info_hash_matched(gconstpointer k
)
579 const ldap_call_response_t
*key
= (const ldap_call_response_t
*)k
;
581 return key
->messageId
;
585 ldap_info_equal_matched(gconstpointer k1
, gconstpointer k2
)
587 const ldap_call_response_t
*key1
= (const ldap_call_response_t
*)k1
;
588 const ldap_call_response_t
*key2
= (const ldap_call_response_t
*)k2
;
590 if( key1
->req_frame
&& key2
->req_frame
&& (key1
->req_frame
!=key2
->req_frame
) ){
593 /* a response may span multiple frames
594 if( key1->rep_frame && key2->rep_frame && (key1->rep_frame!=key2->rep_frame) ){
599 return key1
->messageId
==key2
->messageId
;
603 ldap_info_hash_unmatched(gconstpointer k
)
605 const ldap_call_response_t
*key
= (const ldap_call_response_t
*)k
;
607 return key
->messageId
;
611 ldap_info_equal_unmatched(gconstpointer k1
, gconstpointer k2
)
613 const ldap_call_response_t
*key1
= (const ldap_call_response_t
*)k1
;
614 const ldap_call_response_t
*key2
= (const ldap_call_response_t
*)k2
;
616 return key1
->messageId
==key2
->messageId
;
620 /* These are the NtVer flags from MS-ADTS section 6.3.1.1
621 * https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-adts
624 static const true_false_string tfs_ntver_v1
= {
625 "Client requested version 1 netlogon response",
626 "Version 1 netlogon response not requested"
629 static const true_false_string tfs_ntver_v5
= {
630 "Client requested version 5 netlogon response",
631 "Version 5 netlogon response not requested"
633 static const true_false_string tfs_ntver_v5ex
= {
634 "Client requested version 5 extended netlogon response",
635 "Version 5 extended response not requested"
637 static const true_false_string tfs_ntver_v5ep
= {
638 "Client has requested IP address of the server",
639 "IP address of server not requested"
641 static const true_false_string tfs_ntver_vcs
= {
642 "Client has asked for the closest site information",
643 "Closest site information not requested"
645 static const true_false_string tfs_ntver_vnt4
= {
646 "Client is requesting server to avoid NT4 emulation",
647 "Only full AD DS requested"
649 static const true_false_string tfs_ntver_vpdc
= {
650 "Client has requested the Primary Domain Controller",
651 "Primary Domain Controller not requested"
653 static const true_false_string tfs_ntver_vip
= {
654 "Client has requested IP details (obsolete)",
655 "IP details not requested (obsolete)"
657 static const true_false_string tfs_ntver_vl
= {
658 "Client indicated that it is the local machine",
659 "Client is not the local machine"
660 };static const true_false_string tfs_ntver_vgc
= {
661 "Client has requested a Global Catalog server",
662 "Global Catalog not requested"
665 /* Stuff for generation/handling of fields for custom AttributeValues */
666 typedef struct _attribute_type_t
{
667 gchar
* attribute_type
;
668 gchar
* attribute_desc
;
671 static attribute_type_t
* attribute_types
;
672 static guint num_attribute_types
;
674 static GHashTable
* attribute_types_hash
;
675 static hf_register_info
* dynamic_hf
;
676 static guint dynamic_hf_size
;
679 attribute_types_update_cb(void *r
, char **err
)
681 attribute_type_t
*rec
= (attribute_type_t
*)r
;
684 if (rec
->attribute_type
== NULL
) {
685 *err
= g_strdup("Attribute type can't be empty");
689 g_strstrip(rec
->attribute_type
);
690 if (rec
->attribute_type
[0] == 0) {
691 *err
= g_strdup("Attribute type can't be empty");
695 /* Check for invalid characters (to avoid asserting out when
696 * registering the field).
698 c
= proto_check_field_name(rec
->attribute_type
);
700 *err
= g_strdup_printf("Attribute type can't contain '%c'", c
);
709 attribute_types_copy_cb(void* n
, const void* o
, size_t siz _U_
)
711 attribute_type_t
* new_rec
= (attribute_type_t
*)n
;
712 const attribute_type_t
* old_rec
= (const attribute_type_t
*)o
;
714 new_rec
->attribute_type
= g_strdup(old_rec
->attribute_type
);
715 new_rec
->attribute_desc
= g_strdup(old_rec
->attribute_desc
);
721 attribute_types_free_cb(void*r
)
723 attribute_type_t
* rec
= (attribute_type_t
*)r
;
725 g_free(rec
->attribute_type
);
726 g_free(rec
->attribute_desc
);
729 UAT_CSTRING_CB_DEF(attribute_types
, attribute_type
, attribute_type_t
)
730 UAT_CSTRING_CB_DEF(attribute_types
, attribute_desc
, attribute_type_t
)
736 get_hf_for_header(char* attribute_type
)
740 if (attribute_types_hash
) {
741 hf_id
= (gint
*) g_hash_table_lookup(attribute_types_hash
, attribute_type
);
753 deregister_attribute_types(void)
756 /* Deregister all fields */
757 for (guint i
= 0; i
< dynamic_hf_size
; i
++) {
758 proto_deregister_field (proto_ldap
, *(dynamic_hf
[i
].p_id
));
759 g_free (dynamic_hf
[i
].p_id
);
762 proto_add_deregistered_data (dynamic_hf
);
767 if (attribute_types_hash
) {
768 g_hash_table_destroy (attribute_types_hash
);
769 attribute_types_hash
= NULL
;
774 attribute_types_post_update_cb(void)
777 gchar
* attribute_type
;
779 deregister_attribute_types();
781 if (num_attribute_types
) {
782 attribute_types_hash
= g_hash_table_new(g_str_hash
, g_str_equal
);
783 dynamic_hf
= g_new0(hf_register_info
,num_attribute_types
);
784 dynamic_hf_size
= num_attribute_types
;
786 for (guint i
= 0; i
< dynamic_hf_size
; i
++) {
787 hf_id
= g_new(gint
,1);
789 attribute_type
= g_strdup(attribute_types
[i
].attribute_type
);
791 dynamic_hf
[i
].p_id
= hf_id
;
792 dynamic_hf
[i
].hfinfo
.name
= attribute_type
;
793 dynamic_hf
[i
].hfinfo
.abbrev
= g_strdup_printf("ldap.AttributeValue.%s", attribute_type
);
794 dynamic_hf
[i
].hfinfo
.type
= FT_STRING
;
795 dynamic_hf
[i
].hfinfo
.display
= BASE_NONE
;
796 dynamic_hf
[i
].hfinfo
.strings
= NULL
;
797 dynamic_hf
[i
].hfinfo
.bitmask
= 0;
798 dynamic_hf
[i
].hfinfo
.blurb
= g_strdup(attribute_types
[i
].attribute_desc
);
799 HFILL_INIT(dynamic_hf
[i
]);
801 g_hash_table_insert(attribute_types_hash
, attribute_type
, hf_id
);
804 proto_register_field_array(proto_ldap
, dynamic_hf
, dynamic_hf_size
);
809 attribute_types_reset_cb(void)
811 deregister_attribute_types();
814 /* MS-ADTS specification, section 6.3.1.1, NETLOGON_NT_VERSION Options Bits */
815 static int dissect_mscldap_ntver_flags(proto_tree
*parent_tree
, tvbuff_t
*tvb
, int offset
)
817 static int * const flags
[] = {
818 &hf_mscldap_ntver_flags_v1
,
819 &hf_mscldap_ntver_flags_v5
,
820 &hf_mscldap_ntver_flags_v5ex
,
821 &hf_mscldap_ntver_flags_v5ep
,
822 &hf_mscldap_ntver_flags_vcs
,
823 &hf_mscldap_ntver_flags_vnt4
,
824 &hf_mscldap_ntver_flags_vpdc
,
825 &hf_mscldap_ntver_flags_vip
,
826 &hf_mscldap_ntver_flags_vl
,
827 &hf_mscldap_ntver_flags_vgc
,
831 proto_tree_add_bitmask_with_flags(parent_tree
, tvb
, offset
, hf_mscldap_ntver_flags
,
832 ett_mscldap_ntver_flags
, flags
, ENC_LITTLE_ENDIAN
, BMT_NO_FALSE
);
838 /* This string contains the last LDAPString that was decoded */
839 static const char *attributedesc_string
=NULL
;
841 /* This string contains the last AssertionValue that was decoded */
842 static char *ldapvalue_string
=NULL
;
844 /* if the octet string contain all printable ASCII characters, then
845 * display it as a string, othervise just display it in hex.
848 dissect_ldap_AssertionValue(gboolean implicit_tag
, tvbuff_t
*tvb
, int offset
, asn1_ctx_t
*actx _U_
, proto_tree
*tree
, int hf_index
)
851 gboolean pc
, ind
, is_ascii
;
856 offset
=get_ber_identifier(tvb
, offset
, &ber_class
, &pc
, &tag
);
857 offset
=get_ber_length(tvb
, offset
, &len
, &ind
);
859 len
=tvb_reported_length_remaining(tvb
,offset
);
868 * Some special/wellknown attributes in common LDAP (read AD)
869 * are neither ascii strings nor blobs of hex data.
870 * Special case these attributes and decode them more nicely.
872 * Add more special cases as required to prettify further
873 * (there can't be that many ones that are truly interesting)
875 if(attributedesc_string
&& !strncmp("DomainSid", attributedesc_string
, 9)){
879 /* this octet string contains an NT SID */
880 sid_tvb
=tvb_new_subset_length(tvb
, offset
, len
);
881 dissect_nt_sid(sid_tvb
, 0, tree
, "SID", &tmpstr
, hf_index
);
882 ldapvalue_string
=tmpstr
;
885 } else if ( (len
==16) /* GUIDs are always 16 bytes */
886 && (attributedesc_string
&& !strncmp("DomainGuid", attributedesc_string
, 10))) {
887 guint8 drep
[4] = { 0x10, 0x00, 0x00, 0x00}; /* fake DREP struct */
890 /* This octet string contained a GUID */
891 dissect_dcerpc_uuid_t(tvb
, offset
, actx
->pinfo
, tree
, drep
, hf_ldap_guid
, &uuid
);
893 ldapvalue_string
=(char*)wmem_alloc(wmem_packet_scope(), 1024);
894 g_snprintf(ldapvalue_string
, 1023, "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
895 uuid
.data1
, uuid
.data2
, uuid
.data3
, uuid
.data4
[0], uuid
.data4
[1],
896 uuid
.data4
[2], uuid
.data4
[3], uuid
.data4
[4], uuid
.data4
[5],
897 uuid
.data4
[6], uuid
.data4
[7]);
900 } else if (attributedesc_string
&& !strncmp("NtVer", attributedesc_string
, 5)){
904 /* get flag value to populate ldapvalue_string */
905 flags
=tvb_get_letohl(tvb
, offset
);
907 ldapvalue_string
=(char*)wmem_alloc(wmem_packet_scope(), 1024);
908 g_snprintf(ldapvalue_string
, 1023, "0x%08x",flags
);
910 /* populate bitmask subtree */
911 offset
= dissect_mscldap_ntver_flags(tree
, tvb
, offset
);
919 * It was not one of our "wellknown" attributes so make the best
920 * we can and just try to see if it is an ascii string or if it
923 * XXX - should we support reading RFC 2252-style schemas
924 * for LDAP, and using that to determine how to display
925 * attribute values and assertion values?
927 * -- I don't think there are full schemas available that describe the
928 * interesting cases i.e. AD -- ronnie
930 is_ascii
=tvb_ascii_isprint(tvb
, offset
, len
);
932 /* convert the string into a printable string */
934 ldapvalue_string
= tvb_get_string_enc(wmem_packet_scope(), tvb
, offset
, len
, ENC_UTF_8
|ENC_NA
);
936 ldapvalue_string
= tvb_bytes_to_str_punct(wmem_packet_scope(), tvb
, offset
, len
, ':');
939 proto_tree_add_string(tree
, hf_index
, tvb
, offset
, len
, ldapvalue_string
);
947 /* This string contains the last Filter item that was decoded */
948 static const char *Filter_string
=NULL
;
949 static const char *and_filter_string
=NULL
;
950 static const char *or_filter_string
=NULL
;
951 static const char *substring_value
=NULL
;
952 static const char *substring_item_init
=NULL
;
953 static const char *substring_item_any
=NULL
;
954 static const char *substring_item_final
=NULL
;
955 static const char *matching_rule_string
=NULL
;
956 static gboolean matching_rule_dnattr
=FALSE
;
958 #define MAX_FILTER_LEN 4096
959 static gint Filter_length
;
961 #define MAX_FILTER_ELEMENTS 200
962 static gint Filter_elements
;
964 /* Global variables */
965 static gint MessageID
=-1;
966 static gint ProtocolOp
= -1;
967 static gint result
= 0;
968 static proto_item
*ldm_tree
= NULL
; /* item to add text to */
970 static void ldap_do_protocolop(packet_info
*pinfo
)
976 valstr
= val_to_str(ProtocolOp
, ldap_ProtocolOp_choice_vals
, "Unknown (%%u)");
978 col_append_fstr(pinfo
->cinfo
, COL_INFO
, "%s(%u) ", valstr
, MessageID
);
981 proto_item_append_text(ldm_tree
, " %s(%d)", valstr
, MessageID
);
983 do_protocolop
= FALSE
;
988 static ldap_call_response_t
*
989 ldap_match_call_response(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*tree
, guint messageId
, guint protocolOpTag
, ldap_conv_info_t
*ldap_info
)
991 ldap_call_response_t lcr
, *lcrp
=NULL
;
993 /* first see if we have already matched this */
995 lcr
.messageId
=messageId
;
996 switch(protocolOpTag
){
998 case LDAP_REQ_SEARCH
:
999 case LDAP_REQ_MODIFY
:
1001 case LDAP_REQ_DELETE
:
1002 case LDAP_REQ_MODRDN
:
1003 case LDAP_REQ_COMPARE
:
1004 case LDAP_REQ_EXTENDED
:
1005 lcr
.is_request
=TRUE
;
1006 lcr
.req_frame
=pinfo
->num
;
1010 case LDAP_RES_SEARCH_ENTRY
:
1011 case LDAP_RES_SEARCH_REF
:
1012 case LDAP_RES_SEARCH_RESULT
:
1013 case LDAP_RES_MODIFY
:
1015 case LDAP_RES_DELETE
:
1016 case LDAP_RES_MODRDN
:
1017 case LDAP_RES_COMPARE
:
1018 case LDAP_RES_EXTENDED
:
1019 case LDAP_RES_INTERMEDIATE
:
1020 lcr
.is_request
=FALSE
;
1022 lcr
.rep_frame
=pinfo
->num
;
1027 lcrp
=(ldap_call_response_t
*)wmem_map_lookup(ldap_info
->matched
, &lcr
);
1031 lcrp
->is_request
=lcr
.is_request
;
1035 /* we haven't found a match - try and match it up */
1037 switch(protocolOpTag
){
1039 case LDAP_REQ_SEARCH
:
1040 case LDAP_REQ_MODIFY
:
1042 case LDAP_REQ_DELETE
:
1043 case LDAP_REQ_MODRDN
:
1044 case LDAP_REQ_COMPARE
:
1045 case LDAP_REQ_EXTENDED
:
1047 /* this a a request - add it to the unmatched list */
1049 /* check that we don't already have one of those in the
1050 unmatched list and if so remove it */
1052 lcr
.messageId
=messageId
;
1053 lcrp
=(ldap_call_response_t
*)wmem_map_lookup(ldap_info
->unmatched
, &lcr
);
1055 wmem_map_remove(ldap_info
->unmatched
, lcrp
);
1057 /* if we can't reuse the old one, grab a new chunk */
1059 lcrp
=wmem_new0(wmem_file_scope(), ldap_call_response_t
);
1061 lcrp
->messageId
=messageId
;
1062 lcrp
->req_frame
=pinfo
->num
;
1063 lcrp
->req_time
=pinfo
->abs_ts
;
1065 lcrp
->protocolOpTag
=protocolOpTag
;
1066 lcrp
->is_request
=TRUE
;
1067 wmem_map_insert(ldap_info
->unmatched
, lcrp
, lcrp
);
1071 case LDAP_RES_SEARCH_ENTRY
:
1072 case LDAP_RES_SEARCH_REF
:
1073 case LDAP_RES_SEARCH_RESULT
:
1074 case LDAP_RES_MODIFY
:
1076 case LDAP_RES_DELETE
:
1077 case LDAP_RES_MODRDN
:
1078 case LDAP_RES_COMPARE
:
1079 case LDAP_RES_EXTENDED
:
1080 case LDAP_RES_INTERMEDIATE
:
1082 /* this is a result - it should be in our unmatched list */
1084 lcr
.messageId
=messageId
;
1085 lcrp
=(ldap_call_response_t
*)wmem_map_lookup(ldap_info
->unmatched
, &lcr
);
1089 if(!lcrp
->rep_frame
){
1090 wmem_map_remove(ldap_info
->unmatched
, lcrp
);
1091 lcrp
->rep_frame
=pinfo
->num
;
1092 lcrp
->is_request
=FALSE
;
1093 wmem_map_insert(ldap_info
->matched
, lcrp
, lcrp
);
1101 /* we have found a match */
1106 if(lcrp
->is_request
){
1107 it
=proto_tree_add_uint(tree
, hf_ldap_response_in
, tvb
, 0, 0, lcrp
->rep_frame
);
1108 proto_item_set_generated(it
);
1111 it
=proto_tree_add_uint(tree
, hf_ldap_response_to
, tvb
, 0, 0, lcrp
->req_frame
);
1112 proto_item_set_generated(it
);
1113 nstime_delta(&ns
, &pinfo
->abs_ts
, &lcrp
->req_time
);
1114 it
=proto_tree_add_time(tree
, hf_ldap_time
, tvb
, 0, 0, &ns
);
1115 proto_item_set_generated(it
);
1123 /*--- Included file: packet-ldap-fn.c ---*/
1124 #line 1 "./asn1/ldap/packet-ldap-fn.c"
1125 /*--- Cyclic dependencies ---*/
1127 /* Filter -> Filter/and -> Filter/and/_item -> Filter */
1128 /* Filter -> Filter/or -> Filter/or/_item -> Filter */
1129 /* Filter -> Filter/not -> Filter */
1130 static int dissect_ldap_Filter(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
);
1136 dissect_ldap_MessageID(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
1137 #line 91 "./asn1/ldap/ldap.cnf"
1139 offset
= dissect_ber_integer(implicit_tag
, actx
, tree
, tvb
, offset
, hf_index
,
1153 dissect_ldap_INTEGER_1_127(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
1154 offset
= dissect_ber_integer(implicit_tag
, actx
, tree
, tvb
, offset
, hf_index
,
1163 dissect_ldap_LDAPString(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
1164 #line 301 "./asn1/ldap/ldap.cnf"
1165 tvbuff_t
*parameter_tvb
= NULL
;
1166 const char *ldapstring
= NULL
;
1167 gchar
*sc
= NULL
; /* semi-colon pointer */
1169 offset
= dissect_ber_octet_string_with_encoding(implicit_tag
, actx
, tree
, tvb
, offset
, hf_index
,
1170 ¶meter_tvb
, ENC_UTF_8
|ENC_NA
);
1172 if (parameter_tvb
|| (hf_index
== hf_ldap_baseObject
)) {
1174 ldap_do_protocolop(actx
->pinfo
);
1177 ldapstring
= tvb_get_string_enc(wmem_packet_scope(), parameter_tvb
, 0, tvb_reported_length_remaining(parameter_tvb
, 0), ENC_UTF_8
|ENC_NA
);
1179 if(hf_index
== hf_ldap_baseObject
) {
1180 /* this is search - put it on the scanline */
1181 if(!ldapstring
|| !*ldapstring
)
1182 ldapstring
= "<ROOT>";
1184 col_append_fstr(actx
->pinfo
->cinfo
, COL_INFO
, "\"%s\" ", format_text(wmem_packet_scope(), ldapstring
, strlen(ldapstring
)));
1187 proto_item_append_text(ldm_tree
, " \"%s\"", ldapstring
);
1190 if(!parameter_tvb
) {
1192 proto_item_append_text(actx
->created_item
, " (%s)", ldapstring
);
1195 } else if ((hf_index
== hf_ldap_errorMessage
) && ldapstring
&& *ldapstring
) { /* only show message if not success */
1196 col_append_fstr(actx
->pinfo
->cinfo
, COL_INFO
, "(%s) ", format_text(wmem_packet_scope(), ldapstring
, strlen(ldapstring
)));
1199 proto_item_append_text(ldm_tree
, " (%s)", ldapstring
);
1201 } else if ((hf_index
== hf_ldap_objectName
) ||
1202 (hf_index
== hf_ldap_name
) ||
1203 (hf_index
== hf_ldap_entry
) ||
1204 (hf_index
== hf_ldap_object
) ||
1205 (hf_index
== hf_ldap_delRequest
) ) {
1207 if(!ldapstring
|| !*ldapstring
)
1208 ldapstring
= "<ROOT>";
1210 col_append_fstr(actx
->pinfo
->cinfo
, COL_INFO
, "\"%s\" ", format_text(wmem_packet_scope(), ldapstring
, strlen(ldapstring
)));
1213 proto_item_append_text(ldm_tree
, " \"%s\"", ldapstring
);
1214 } else if (hf_index
== hf_ldap_attributeDesc
){
1215 /* remember the attribute description */
1216 attributedesc_string
=ldapstring
;
1217 } else if (hf_index
== hf_ldap_initial
){
1218 /* remember the substring item */
1219 substring_item_init
=ldapstring
;
1220 } else if (hf_index
== hf_ldap_any
){
1221 /* remember the substring item */
1222 substring_item_any
=ldapstring
;
1223 } else if (hf_index
== hf_ldap_final
){
1224 /* remember the substring item */
1225 substring_item_final
=ldapstring
;
1226 } else if (hf_index
== hf_ldap_matchingRule
){
1227 /* remember the matching rule */
1228 matching_rule_string
=ldapstring
;
1229 } else if (hf_index
== hf_ldap_present
){
1230 /* remember the present name */
1231 Filter_string
=ldapstring
;
1232 } else if (hf_index
== hf_ldap_type
) {
1233 /* remember attribute type name */
1234 attr_type
= wmem_strdup(wmem_packet_scope(), ldapstring
);
1236 /* append it to the parent entry */
1237 proto_item_append_text(tree
, " %s", attr_type
);
1239 /* remove the ";binary" component if present */
1240 if((sc
= strchr(attr_type
, ';')) != NULL
) {
1241 if(!strcmp(sc
, ";binary")) {
1242 *sc
= '\0'; /* terminate the string */
1243 is_binary_attr_type
= TRUE
;
1246 is_binary_attr_type
= FALSE
;
1260 dissect_ldap_LDAPDN(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
1261 offset
= dissect_ldap_LDAPString(implicit_tag
, tvb
, offset
, actx
, tree
, hf_index
);
1269 dissect_ldap_Simple(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
1270 #line 148 "./asn1/ldap/ldap.cnf"
1271 ldap_conv_info_t
*ldap_info
;
1273 offset
= dissect_ber_octet_string(implicit_tag
, actx
, tree
, tvb
, offset
, hf_index
,
1277 ldap_info
= (ldap_conv_info_t
*)actx
->private_data
;
1278 ldap_info
->auth_type
= LDAP_AUTH_SIMPLE
;
1288 dissect_ldap_Mechanism(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
1289 #line 156 "./asn1/ldap/ldap.cnf"
1291 ldap_conv_info_t
*ldap_info
;
1292 tvbuff_t
*parameter_tvb
;
1293 char *mechanism
= NULL
;
1294 offset
= dissect_ber_octet_string(implicit_tag
, actx
, tree
, tvb
, offset
, hf_index
,
1297 ldap_info
= (ldap_conv_info_t
*)actx
->private_data
;
1298 ldap_info
->auth_type
= LDAP_AUTH_SASL
;
1304 * We need to remember the authentication type and mechanism for this
1307 * XXX - actually, we might need to remember more than one
1308 * type and mechanism, if you can unbind and rebind with a
1309 * different type and/or mechanism.
1311 if(!actx
->pinfo
->fd
->visited
) {
1312 mechanism
= tvb_get_string_enc(wmem_file_scope(), parameter_tvb
, 0, tvb_reported_length_remaining(parameter_tvb
,0), ENC_UTF_8
|ENC_NA
);
1313 ldap_info
->first_auth_frame
= 0; /* not known until we see the bind reply */
1315 * If the mechanism in this request is an empty string (which is
1316 * returned as a null pointer), use the saved mechanism instead.
1317 * Otherwise, if the saved mechanism is an empty string (null),
1318 * save this mechanism.
1320 if (mechanism
!= NULL
) {
1321 wmem_free(wmem_file_scope(), ldap_info
->auth_mech
);
1322 ldap_info
->auth_mech
= mechanism
;
1333 dissect_ldap_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_
) {
1334 #line 190 "./asn1/ldap/ldap.cnf"
1336 tvbuff_t
*parameter_tvb
;
1337 ldap_conv_info_t
*ldap_info
;
1342 offset
= dissect_ber_octet_string(implicit_tag
, actx
, tree
, tvb
, offset
, hf_index
,
1349 ldap_info
= (ldap_conv_info_t
*)actx
->private_data
;
1350 get_ber_identifier(parameter_tvb
, 0, &ber_class
, &pc
, &tag
);
1352 /*if ((ldap_info->auth_mech != NULL) && (strcmp(ldap_info->auth_mech, "GSS-SPNEGO") == 0) && (ber_class==BER_CLASS_CON)) {*/
1353 if ((ldap_info
->auth_mech
!= NULL
) && (ber_class
==BER_CLASS_CON
)) {
1355 * This is a GSS-API token ancapsulated within GSS-SPNEGO.
1356 * We need to check the first byte to check whether the blob
1357 * contains SPNEGO or GSSAPI.
1358 * All SPNEGO PDUs are of class CONSTRUCTED while
1359 * GSS PDUs are class APPLICATION
1361 if (parameter_tvb
&& (tvb_reported_length(parameter_tvb
) > 0))
1362 call_dissector(spnego_handle
, parameter_tvb
, actx
->pinfo
, tree
);
1364 /*if ((ldap_info->auth_mech != NULL) && ((strcmp(ldap_info->auth_mech, "GSSAPI") == 0) || (ber_class==BER_CLASS_APP))) {*/
1365 if ((ldap_info
->auth_mech
!= NULL
) && (ber_class
==BER_CLASS_APP
)) {
1367 * This is a raw GSS-API token.
1369 if (parameter_tvb
&& (tvb_reported_length(parameter_tvb
) > 0)) {
1370 call_dissector(gssapi_handle
, parameter_tvb
, actx
->pinfo
, tree
);
1373 /* Restore private data */
1374 actx
->private_data
= ldap_info
;
1383 static const ber_sequence_t SaslCredentials_sequence
[] = {
1384 { &hf_ldap_mechanism
, BER_CLASS_UNI
, BER_UNI_TAG_OCTETSTRING
, BER_FLAGS_NOOWNTAG
, dissect_ldap_Mechanism
},
1385 { &hf_ldap_credentials
, BER_CLASS_UNI
, BER_UNI_TAG_OCTETSTRING
, BER_FLAGS_OPTIONAL
|BER_FLAGS_NOOWNTAG
, dissect_ldap_Credentials
},
1386 { NULL
, 0, 0, 0, NULL
}
1390 dissect_ldap_SaslCredentials(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
1391 offset
= dissect_ber_sequence(implicit_tag
, actx
, tree
, tvb
, offset
,
1392 SaslCredentials_sequence
, hf_index
, ett_ldap_SaslCredentials
);
1400 dissect_ldap_T_ntlmsspNegotiate(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
1401 #line 683 "./asn1/ldap/ldap.cnf"
1402 /* make sure the protocol op comes first */
1403 ldap_do_protocolop(actx
->pinfo
);
1405 call_dissector(ntlmssp_handle
, tvb
, actx
->pinfo
, tree
);
1406 offset
+=tvb_reported_length_remaining(tvb
, offset
);
1416 dissect_ldap_T_ntlmsspAuth(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
1417 #line 690 "./asn1/ldap/ldap.cnf"
1418 /* make sure the protocol op comes first */
1419 ldap_do_protocolop(actx
->pinfo
);
1421 call_dissector(ntlmssp_handle
, tvb
, actx
->pinfo
, tree
);
1422 offset
+=tvb_reported_length_remaining(tvb
, offset
);
1430 static const value_string ldap_AuthenticationChoice_vals
[] = {
1433 { 10, "ntlmsspNegotiate" },
1434 { 11, "ntlmsspAuth" },
1438 static const ber_choice_t AuthenticationChoice_choice
[] = {
1439 { 0, &hf_ldap_simple
, BER_CLASS_CON
, 0, BER_FLAGS_IMPLTAG
, dissect_ldap_Simple
},
1440 { 3, &hf_ldap_sasl
, BER_CLASS_CON
, 3, BER_FLAGS_IMPLTAG
, dissect_ldap_SaslCredentials
},
1441 { 10, &hf_ldap_ntlmsspNegotiate
, BER_CLASS_CON
, 10, BER_FLAGS_IMPLTAG
, dissect_ldap_T_ntlmsspNegotiate
},
1442 { 11, &hf_ldap_ntlmsspAuth
, BER_CLASS_CON
, 11, BER_FLAGS_IMPLTAG
, dissect_ldap_T_ntlmsspAuth
},
1443 { 0, NULL
, 0, 0, 0, NULL
}
1447 dissect_ldap_AuthenticationChoice(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
1448 #line 480 "./asn1/ldap/ldap.cnf"
1451 const gchar
*valstr
;
1453 offset
= dissect_ber_choice(actx
, tree
, tvb
, offset
,
1454 AuthenticationChoice_choice
, hf_index
, ett_ldap_AuthenticationChoice
,
1458 ldap_do_protocolop(actx
->pinfo
);
1460 if((branch
> -1) && (branch
< (gint
)(sizeof AuthenticationChoice_choice
/sizeof AuthenticationChoice_choice
[0])))
1461 auth
= AuthenticationChoice_choice
[branch
].value
;
1463 valstr
= val_to_str(auth
, ldap_AuthenticationChoice_vals
, "Unknown auth(%u)");
1465 /* If auth is NTLM (10 or 11) don't add to column as the NTLM dissection will do this */
1466 if ((auth
!= 10) && (auth
!= 11))
1467 col_append_fstr(actx
->pinfo
->cinfo
, COL_INFO
, "%s ", valstr
);
1470 proto_item_append_text(ldm_tree
, " %s", valstr
);
1479 static const ber_sequence_t BindRequest_U_sequence
[] = {
1480 { &hf_ldap_version
, BER_CLASS_UNI
, BER_UNI_TAG_INTEGER
, BER_FLAGS_NOOWNTAG
, dissect_ldap_INTEGER_1_127
},
1481 { &hf_ldap_name
, BER_CLASS_UNI
, BER_UNI_TAG_OCTETSTRING
, BER_FLAGS_NOOWNTAG
, dissect_ldap_LDAPDN
},
1482 { &hf_ldap_authentication
, BER_CLASS_ANY
/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG
|BER_FLAGS_NOTCHKTAG
, dissect_ldap_AuthenticationChoice
},
1483 { NULL
, 0, 0, 0, NULL
}
1487 dissect_ldap_BindRequest_U(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
1488 offset
= dissect_ber_sequence(implicit_tag
, actx
, tree
, tvb
, offset
,
1489 BindRequest_U_sequence
, hf_index
, ett_ldap_BindRequest_U
);
1497 dissect_ldap_BindRequest(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
1498 offset
= dissect_ber_tagged_type(implicit_tag
, actx
, tree
, tvb
, offset
,
1499 hf_index
, BER_CLASS_APP
, 0, TRUE
, dissect_ldap_BindRequest_U
);
1505 static const value_string ldap_BindResponse_resultCode_vals
[] = {
1507 { 1, "operationsError" },
1508 { 2, "protocolError" },
1509 { 3, "timeLimitExceeded" },
1510 { 4, "sizeLimitExceeded" },
1511 { 5, "compareFalse" },
1512 { 6, "compareTrue" },
1513 { 7, "authMethodNotSupported" },
1514 { 8, "strongAuthRequired" },
1516 { 11, "adminLimitExceeded" },
1517 { 12, "unavailableCriticalExtension" },
1518 { 13, "confidentialityRequired" },
1519 { 14, "saslBindInProgress" },
1520 { 16, "noSuchAttribute" },
1521 { 17, "undefinedAttributeType" },
1522 { 18, "inappropriateMatching" },
1523 { 19, "constraintViolation" },
1524 { 20, "attributeOrValueExists" },
1525 { 21, "invalidAttributeSyntax" },
1526 { 32, "noSuchObject" },
1527 { 33, "aliasProblem" },
1528 { 34, "invalidDNSyntax" },
1529 { 36, "aliasDereferencingProblem" },
1530 { 48, "inappropriateAuthentication" },
1531 { 49, "invalidCredentials" },
1532 { 50, "insufficientAccessRights" },
1534 { 52, "unavailable" },
1535 { 53, "unwillingToPerform" },
1536 { 54, "loopDetect" },
1537 { 64, "namingViolation" },
1538 { 65, "objectClassViolation" },
1539 { 66, "notAllowedOnNonLeaf" },
1540 { 67, "notAllowedOnRDN" },
1541 { 68, "entryAlreadyExists" },
1542 { 69, "objectClassModsProhibited" },
1543 { 71, "affectsMultipleDSAs" },
1545 { 118, "canceled" },
1546 { 119, "noSuchOperation" },
1548 { 121, "cannotCancel" },
1554 dissect_ldap_BindResponse_resultCode(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
1555 #line 421 "./asn1/ldap/ldap.cnf"
1557 const gchar
*valstr
;
1559 offset
= dissect_ber_integer(implicit_tag
, actx
, tree
, tvb
, offset
, hf_index
,
1563 ldap_do_protocolop(actx
->pinfo
);
1565 valstr
= val_to_str(result
, ldap_BindResponse_resultCode_vals
, "Unknown result(%u)");
1567 col_append_fstr(actx
->pinfo
->cinfo
, COL_INFO
, "%s ", valstr
);
1570 proto_item_append_text(ldm_tree
, " %s", valstr
);
1580 dissect_ldap_T_bindResponse_matchedDN(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
1581 #line 697 "./asn1/ldap/ldap.cnf"
1582 tvbuff_t
*new_tvb
=NULL
;
1584 offset
= dissect_ber_octet_string(FALSE
, actx
, tree
, tvb
, offset
, hf_ldap_matchedDN
, &new_tvb
);
1587 && (tvb_reported_length(new_tvb
)>=7)
1588 && (!tvb_memeql(new_tvb
, 0, "NTLMSSP", 7))){
1590 /* make sure the protocol op comes first */
1591 ldap_do_protocolop(actx
->pinfo
);
1593 call_dissector(ntlmssp_handle
, new_tvb
, actx
->pinfo
, tree
);
1604 dissect_ldap_ErrorMessage(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
1605 offset
= dissect_ldap_LDAPString(implicit_tag
, tvb
, offset
, actx
, tree
, hf_index
);
1613 dissect_ldap_LDAPURL(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
1614 offset
= dissect_ber_octet_string(implicit_tag
, actx
, tree
, tvb
, offset
, hf_index
,
1617 #line 54 "./asn1/ldap/ldap.cnf"
1618 proto_item_set_url(actx
->created_item
);
1625 static const ber_sequence_t Referral_sequence_of
[1] = {
1626 { &hf_ldap_Referral_item
, BER_CLASS_UNI
, BER_UNI_TAG_OCTETSTRING
, BER_FLAGS_NOOWNTAG
, dissect_ldap_LDAPURL
},
1630 dissect_ldap_Referral(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
1631 offset
= dissect_ber_sequence_of(implicit_tag
, actx
, tree
, tvb
, offset
,
1632 Referral_sequence_of
, hf_index
, ett_ldap_Referral
);
1640 dissect_ldap_ServerSaslCreds(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
1641 #line 231 "./asn1/ldap/ldap.cnf"
1643 tvbuff_t
*parameter_tvb
= NULL
;
1644 ldap_conv_info_t
*ldap_info
;
1646 offset
= dissect_ber_octet_string(implicit_tag
, actx
, tree
, tvb
, offset
, hf_index
,
1651 ldap_info
= (ldap_conv_info_t
*)actx
->private_data
;
1652 switch (ldap_info
->auth_type
) {
1654 /* For Kerberos V4, dissect it as a ticket. */
1655 /* XXX - what about LDAP_AUTH_SIMPLE? */
1657 case LDAP_AUTH_SASL
:
1659 * All frames after this are assumed to use a security layer.
1661 * XXX - won't work if there's another reply, with the security
1662 * layer, starting in the same TCP segment that ends this
1663 * reply, but as LDAP is a request/response protocol, and
1664 * as the client probably can't start using authentication until
1665 * it gets the bind reply and the server won't send a reply until
1666 * it gets a request, that probably won't happen.
1668 * XXX - that assumption is invalid; it's not clear where the
1669 * hell you find out whether there's any security layer. In
1670 * one capture, we have two GSS-SPNEGO negotiations, both of
1671 * which select MS KRB5, and the only differences in the tokens
1672 * is in the RC4-HMAC ciphertext. The various
1673 * draft-ietf--cat-sasl-gssapi-NN.txt drafts seem to imply
1674 * that the RFC 2222 spoo with the bitmask and maximum
1675 * output message size stuff is done - but where does that
1676 * stuff show up? Is it in the ciphertext, which means it's
1677 * presumably encrypted?
1679 * Grrr. We have to do a gross heuristic, checking whether the
1680 * putative LDAP message begins with 0x00 or not, making the
1681 * assumption that we won't have more than 2^24 bytes of
1682 * encapsulated stuff.
1684 ldap_info
->first_auth_frame
= actx
->pinfo
->num
+ 1;
1685 if (ldap_info
->auth_mech
!= NULL
&&
1686 strcmp(ldap_info
->auth_mech
, "GSS-SPNEGO") == 0) {
1687 /* It could be the second leg of GSS-SPNEGO wrapping NTLMSSP
1688 * which might not be wrapped in GSS-SPNEGO but be a raw
1691 if ( (tvb_reported_length(parameter_tvb
)>=7)
1692 && (!tvb_memeql(parameter_tvb
, 0, "NTLMSSP", 7))){
1693 call_dissector(ntlmssp_handle
, parameter_tvb
, actx
->pinfo
, tree
);
1697 * This is a GSS-API token.
1699 if(parameter_tvb
&& (tvb_reported_length(parameter_tvb
) > 0))
1700 call_dissector(spnego_handle
, parameter_tvb
, actx
->pinfo
, tree
);
1701 } else if (ldap_info
->auth_mech
!= NULL
&&
1702 strcmp(ldap_info
->auth_mech
, "GSSAPI") == 0) {
1704 * This is a GSS-API token.
1706 if(parameter_tvb
&& (tvb_reported_length(parameter_tvb
) > 0))
1707 call_dissector(gssapi_handle
, parameter_tvb
, actx
->pinfo
, tree
);
1711 actx
->private_data
= ldap_info
;
1719 static const ber_sequence_t BindResponse_U_sequence
[] = {
1720 { &hf_ldap_bindResponse_resultCode
, BER_CLASS_UNI
, BER_UNI_TAG_ENUMERATED
, BER_FLAGS_NOOWNTAG
, dissect_ldap_BindResponse_resultCode
},
1721 { &hf_ldap_bindResponse_matchedDN
, BER_CLASS_UNI
, BER_UNI_TAG_OCTETSTRING
, BER_FLAGS_NOOWNTAG
, dissect_ldap_T_bindResponse_matchedDN
},
1722 { &hf_ldap_errorMessage
, BER_CLASS_UNI
, BER_UNI_TAG_OCTETSTRING
, BER_FLAGS_NOOWNTAG
, dissect_ldap_ErrorMessage
},
1723 { &hf_ldap_referral
, BER_CLASS_CON
, 3, BER_FLAGS_OPTIONAL
|BER_FLAGS_IMPLTAG
, dissect_ldap_Referral
},
1724 { &hf_ldap_serverSaslCreds
, BER_CLASS_CON
, 7, BER_FLAGS_OPTIONAL
|BER_FLAGS_IMPLTAG
, dissect_ldap_ServerSaslCreds
},
1725 { NULL
, 0, 0, 0, NULL
}
1729 dissect_ldap_BindResponse_U(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
1730 offset
= dissect_ber_sequence(implicit_tag
, actx
, tree
, tvb
, offset
,
1731 BindResponse_U_sequence
, hf_index
, ett_ldap_BindResponse_U
);
1739 dissect_ldap_BindResponse(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
1740 offset
= dissect_ber_tagged_type(implicit_tag
, actx
, tree
, tvb
, offset
,
1741 hf_index
, BER_CLASS_APP
, 1, TRUE
, dissect_ldap_BindResponse_U
);
1749 dissect_ldap_NULL(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
1750 offset
= dissect_ber_null(implicit_tag
, actx
, tree
, tvb
, offset
, hf_index
);
1758 dissect_ldap_UnbindRequest(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
1759 #line 502 "./asn1/ldap/ldap.cnf"
1761 implicit_tag
= TRUE
; /* correct problem with asn2wrs */
1763 offset
= dissect_ber_tagged_type(implicit_tag
, actx
, tree
, tvb
, offset
,
1764 hf_index
, BER_CLASS_APP
, 2, TRUE
, dissect_ldap_NULL
);
1767 ldap_do_protocolop(actx
->pinfo
);
1779 static const value_string ldap_T_scope_vals
[] = {
1780 { 0, "baseObject" },
1781 { 1, "singleLevel" },
1782 { 2, "wholeSubtree" },
1788 dissect_ldap_T_scope(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
1789 #line 389 "./asn1/ldap/ldap.cnf"
1791 guint32 scope
= 0xffff;
1792 const gchar
*valstr
;
1794 offset
= dissect_ber_integer(implicit_tag
, actx
, tree
, tvb
, offset
, hf_index
,
1798 ldap_do_protocolop(actx
->pinfo
);
1800 valstr
= val_to_str(scope
, ldap_T_scope_vals
, "Unknown scope(%u)");
1802 col_append_fstr(actx
->pinfo
->cinfo
, COL_INFO
, "%s ", valstr
);
1805 proto_item_append_text(ldm_tree
, " %s", valstr
);
1813 static const value_string ldap_T_derefAliases_vals
[] = {
1814 { 0, "neverDerefAliases" },
1815 { 1, "derefInSearching" },
1816 { 2, "derefFindingBaseObj" },
1817 { 3, "derefAlways" },
1823 dissect_ldap_T_derefAliases(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
1824 offset
= dissect_ber_integer(implicit_tag
, actx
, tree
, tvb
, offset
, hf_index
,
1833 dissect_ldap_INTEGER_0_maxInt(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
1834 offset
= dissect_ber_integer(implicit_tag
, actx
, tree
, tvb
, offset
, hf_index
,
1843 dissect_ldap_BOOLEAN(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
1844 offset
= dissect_ber_boolean(implicit_tag
, actx
, tree
, tvb
, offset
, hf_index
, NULL
);
1852 dissect_ldap_T_and_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_
) {
1853 offset
= dissect_ldap_Filter(implicit_tag
, tvb
, offset
, actx
, tree
, hf_index
);
1855 #line 548 "./asn1/ldap/ldap.cnf"
1856 if(and_filter_string
){
1857 and_filter_string
=wmem_strdup_printf(wmem_packet_scope(), "(&%s%s)",and_filter_string
,Filter_string
);
1859 and_filter_string
=Filter_string
;
1867 static const ber_sequence_t T_and_set_of
[1] = {
1868 { &hf_ldap_and_item
, BER_CLASS_ANY
/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG
|BER_FLAGS_NOTCHKTAG
, dissect_ldap_T_and_item
},
1872 dissect_ldap_T_and(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
1873 #line 555 "./asn1/ldap/ldap.cnf"
1874 proto_tree
*tr
=NULL
;
1875 proto_item
*it
=NULL
;
1876 const char *old_and_filter_string
=and_filter_string
;
1878 and_filter_string
=NULL
;
1880 tr
=proto_tree_add_subtree(tree
, tvb
, offset
, -1, ett_ldap_T_and
, &it
, "and: ");
1883 offset
= dissect_ber_set_of(implicit_tag
, actx
, tree
, tvb
, offset
,
1884 T_and_set_of
, hf_index
, ett_ldap_T_and
);
1887 if(and_filter_string
) {
1888 proto_item_append_text(it
, "%s", and_filter_string
);
1889 Filter_string
=wmem_strdup(wmem_packet_scope(), and_filter_string
);
1891 and_filter_string
=old_and_filter_string
;
1901 dissect_ldap_T_or_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_
) {
1902 offset
= dissect_ldap_Filter(implicit_tag
, tvb
, offset
, actx
, tree
, hf_index
);
1904 #line 573 "./asn1/ldap/ldap.cnf"
1905 if(or_filter_string
){
1906 or_filter_string
=wmem_strdup_printf(wmem_packet_scope(), "(|%s%s)",or_filter_string
,Filter_string
);
1908 or_filter_string
=Filter_string
;
1917 static const ber_sequence_t T_or_set_of
[1] = {
1918 { &hf_ldap_or_item
, BER_CLASS_ANY
/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG
|BER_FLAGS_NOTCHKTAG
, dissect_ldap_T_or_item
},
1922 dissect_ldap_T_or(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
1923 #line 581 "./asn1/ldap/ldap.cnf"
1926 const char *old_or_filter_string
=or_filter_string
;
1928 or_filter_string
=NULL
;
1929 tr
=proto_tree_add_subtree(tree
, tvb
, offset
, -1, ett_ldap_T_or
, &it
, "or: ");
1932 offset
= dissect_ber_set_of(implicit_tag
, actx
, tree
, tvb
, offset
,
1933 T_or_set_of
, hf_index
, ett_ldap_T_or
);
1935 if(or_filter_string
) {
1936 proto_item_append_text(it
, "%s", or_filter_string
);
1937 Filter_string
=wmem_strdup(wmem_packet_scope(), or_filter_string
);
1939 or_filter_string
=old_or_filter_string
;
1949 dissect_ldap_T_not(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
1950 offset
= dissect_ldap_Filter(implicit_tag
, tvb
, offset
, actx
, tree
, hf_index
);
1952 #line 600 "./asn1/ldap/ldap.cnf"
1953 Filter_string
=wmem_strdup_printf(wmem_packet_scope(), "(!%s)",string_or_null(Filter_string
));
1962 dissect_ldap_AttributeDescription(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
1963 offset
= dissect_ldap_LDAPString(implicit_tag
, tvb
, offset
, actx
, tree
, hf_index
);
1970 static const ber_sequence_t AttributeValueAssertion_sequence
[] = {
1971 { &hf_ldap_attributeDesc
, BER_CLASS_UNI
, BER_UNI_TAG_OCTETSTRING
, BER_FLAGS_NOOWNTAG
, dissect_ldap_AttributeDescription
},
1972 { &hf_ldap_assertionValue
, BER_CLASS_UNI
, BER_UNI_TAG_OCTETSTRING
, BER_FLAGS_NOOWNTAG
, dissect_ldap_AssertionValue
},
1973 { NULL
, 0, 0, 0, NULL
}
1977 dissect_ldap_AttributeValueAssertion(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
1978 offset
= dissect_ber_sequence(implicit_tag
, actx
, tree
, tvb
, offset
,
1979 AttributeValueAssertion_sequence
, hf_index
, ett_ldap_AttributeValueAssertion
);
1987 dissect_ldap_T_equalityMatch(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
1988 offset
= dissect_ldap_AttributeValueAssertion(implicit_tag
, tvb
, offset
, actx
, tree
, hf_index
);
1990 #line 525 "./asn1/ldap/ldap.cnf"
1991 Filter_string
=wmem_strdup_printf(wmem_packet_scope(), "(%s=%s)",
1992 string_or_null(attributedesc_string
),
1993 string_or_null(ldapvalue_string
));
2001 static const value_string ldap_T_substringFilter_substrings_item_vals
[] = {
2008 static const ber_choice_t T_substringFilter_substrings_item_choice
[] = {
2009 { 0, &hf_ldap_initial
, BER_CLASS_CON
, 0, BER_FLAGS_IMPLTAG
, dissect_ldap_LDAPString
},
2010 { 1, &hf_ldap_any
, BER_CLASS_CON
, 1, BER_FLAGS_IMPLTAG
, dissect_ldap_LDAPString
},
2011 { 2, &hf_ldap_final
, BER_CLASS_CON
, 2, BER_FLAGS_IMPLTAG
, dissect_ldap_LDAPString
},
2012 { 0, NULL
, 0, 0, 0, NULL
}
2016 dissect_ldap_T_substringFilter_substrings_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_
) {
2017 offset
= dissect_ber_choice(actx
, tree
, tvb
, offset
,
2018 T_substringFilter_substrings_item_choice
, hf_index
, ett_ldap_T_substringFilter_substrings_item
,
2021 #line 626 "./asn1/ldap/ldap.cnf"
2022 if (substring_item_final
) {
2023 substring_value
=wmem_strdup_printf(wmem_packet_scope(), "%s%s",
2024 (substring_value
?substring_value
:"*"),
2025 substring_item_final
);
2026 } else if (substring_item_any
) {
2027 substring_value
=wmem_strdup_printf(wmem_packet_scope(), "%s%s*",
2028 (substring_value
?substring_value
:"*"),
2029 substring_item_any
);
2030 } else if (substring_item_init
) {
2031 substring_value
=wmem_strdup_printf(wmem_packet_scope(), "%s*",
2032 substring_item_init
);
2040 static const ber_sequence_t T_substringFilter_substrings_sequence_of
[1] = {
2041 { &hf_ldap_substringFilter_substrings_item
, BER_CLASS_ANY
/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG
|BER_FLAGS_NOTCHKTAG
, dissect_ldap_T_substringFilter_substrings_item
},
2045 dissect_ldap_T_substringFilter_substrings(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2046 offset
= dissect_ber_sequence_of(implicit_tag
, actx
, tree
, tvb
, offset
,
2047 T_substringFilter_substrings_sequence_of
, hf_index
, ett_ldap_T_substringFilter_substrings
);
2053 static const ber_sequence_t SubstringFilter_sequence
[] = {
2054 { &hf_ldap_type
, BER_CLASS_UNI
, BER_UNI_TAG_OCTETSTRING
, BER_FLAGS_NOOWNTAG
, dissect_ldap_AttributeDescription
},
2055 { &hf_ldap_substringFilter_substrings
, BER_CLASS_UNI
, BER_UNI_TAG_SEQUENCE
, BER_FLAGS_NOOWNTAG
, dissect_ldap_T_substringFilter_substrings
},
2056 { NULL
, 0, 0, 0, NULL
}
2060 dissect_ldap_SubstringFilter(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2061 #line 640 "./asn1/ldap/ldap.cnf"
2064 const char *old_substring_value
=substring_value
;
2067 substring_value
=NULL
;
2068 substring_item_init
=NULL
;
2069 substring_item_any
=NULL
;
2070 substring_item_final
=NULL
;
2072 tr
=proto_tree_add_subtree(tree
, tvb
, offset
, -1, ett_ldap_SubstringFilter
, &it
, "substring: ");
2075 offset
= dissect_ber_sequence(implicit_tag
, actx
, tree
, tvb
, offset
,
2076 SubstringFilter_sequence
, hf_index
, ett_ldap_SubstringFilter
);
2078 Filter_string
=wmem_strdup_printf(wmem_packet_scope(), "(%s=%s)",
2079 string_or_null(attr_type
),
2080 string_or_null(substring_value
));
2081 proto_item_append_text(it
, "%s", Filter_string
);
2082 substring_value
=old_substring_value
;
2092 dissect_ldap_T_greaterOrEqual(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2093 offset
= dissect_ldap_AttributeValueAssertion(implicit_tag
, tvb
, offset
, actx
, tree
, hf_index
);
2095 #line 531 "./asn1/ldap/ldap.cnf"
2096 Filter_string
=wmem_strdup_printf(wmem_packet_scope(), "(%s>=%s)",
2097 string_or_null(attributedesc_string
),
2098 string_or_null(ldapvalue_string
));
2108 dissect_ldap_T_lessOrEqual(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2109 offset
= dissect_ldap_AttributeValueAssertion(implicit_tag
, tvb
, offset
, actx
, tree
, hf_index
);
2111 #line 537 "./asn1/ldap/ldap.cnf"
2112 Filter_string
=wmem_strdup_printf(wmem_packet_scope(), "(%s<=%s)",
2113 string_or_null(attributedesc_string
),
2114 string_or_null(ldapvalue_string
));
2124 dissect_ldap_T_present(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2125 offset
= dissect_ldap_AttributeDescription(implicit_tag
, tvb
, offset
, actx
, tree
, hf_index
);
2127 #line 597 "./asn1/ldap/ldap.cnf"
2128 Filter_string
=wmem_strdup_printf(wmem_packet_scope(), "(%s=*)",string_or_null(Filter_string
));
2137 dissect_ldap_T_approxMatch(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2138 offset
= dissect_ldap_AttributeValueAssertion(implicit_tag
, tvb
, offset
, actx
, tree
, hf_index
);
2140 #line 543 "./asn1/ldap/ldap.cnf"
2141 Filter_string
=wmem_strdup_printf(wmem_packet_scope(), "(%s~=%s)",
2142 string_or_null(attributedesc_string
),
2143 string_or_null(ldapvalue_string
));
2152 dissect_ldap_MatchingRuleId(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2153 offset
= dissect_ldap_LDAPString(implicit_tag
, tvb
, offset
, actx
, tree
, hf_index
);
2161 dissect_ldap_T_dnAttributes(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2162 #line 603 "./asn1/ldap/ldap.cnf"
2165 offset
= dissect_ber_boolean(implicit_tag
, actx
, tree
, tvb
, offset
, hf_index
, &val
);
2168 matching_rule_dnattr
= val
;
2177 static const ber_sequence_t MatchingRuleAssertion_sequence
[] = {
2178 { &hf_ldap_matchingRule
, BER_CLASS_CON
, 1, BER_FLAGS_OPTIONAL
|BER_FLAGS_IMPLTAG
, dissect_ldap_MatchingRuleId
},
2179 { &hf_ldap_type
, BER_CLASS_CON
, 2, BER_FLAGS_OPTIONAL
|BER_FLAGS_IMPLTAG
, dissect_ldap_AttributeDescription
},
2180 { &hf_ldap_matchValue
, BER_CLASS_CON
, 3, BER_FLAGS_IMPLTAG
, dissect_ldap_AssertionValue
},
2181 { &hf_ldap_dnAttributes
, BER_CLASS_CON
, 4, BER_FLAGS_OPTIONAL
|BER_FLAGS_IMPLTAG
, dissect_ldap_T_dnAttributes
},
2182 { NULL
, 0, 0, 0, NULL
}
2186 dissect_ldap_MatchingRuleAssertion(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2187 offset
= dissect_ber_sequence(implicit_tag
, actx
, tree
, tvb
, offset
,
2188 MatchingRuleAssertion_sequence
, hf_index
, ett_ldap_MatchingRuleAssertion
);
2196 dissect_ldap_T_extensibleMatch(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2197 #line 612 "./asn1/ldap/ldap.cnf"
2199 matching_rule_string
=NULL
;
2200 ldapvalue_string
=NULL
;
2201 matching_rule_dnattr
=FALSE
;
2204 offset
= dissect_ldap_MatchingRuleAssertion(implicit_tag
, tvb
, offset
, actx
, tree
, hf_index
);
2206 #line 618 "./asn1/ldap/ldap.cnf"
2207 Filter_string
=wmem_strdup_printf(wmem_packet_scope(), "(%s:%s%s%s=%s)",
2208 (attr_type
?attr_type
:""),
2209 (matching_rule_dnattr
?"dn:":""),
2210 (matching_rule_string
?matching_rule_string
:""),
2211 (matching_rule_string
?":":""),
2212 string_or_null(ldapvalue_string
));
2219 static const value_string ldap_Filter_vals
[] = {
2223 { 3, "equalityMatch" },
2224 { 4, "substrings" },
2225 { 5, "greaterOrEqual" },
2226 { 6, "lessOrEqual" },
2228 { 8, "approxMatch" },
2229 { 9, "extensibleMatch" },
2233 static const ber_choice_t Filter_choice
[] = {
2234 { 0, &hf_ldap_and
, BER_CLASS_CON
, 0, BER_FLAGS_IMPLTAG
, dissect_ldap_T_and
},
2235 { 1, &hf_ldap_or
, BER_CLASS_CON
, 1, BER_FLAGS_IMPLTAG
, dissect_ldap_T_or
},
2236 { 2, &hf_ldap_not
, BER_CLASS_CON
, 2, BER_FLAGS_IMPLTAG
, dissect_ldap_T_not
},
2237 { 3, &hf_ldap_equalityMatch
, BER_CLASS_CON
, 3, BER_FLAGS_IMPLTAG
, dissect_ldap_T_equalityMatch
},
2238 { 4, &hf_ldap_substrings
, BER_CLASS_CON
, 4, BER_FLAGS_IMPLTAG
, dissect_ldap_SubstringFilter
},
2239 { 5, &hf_ldap_greaterOrEqual
, BER_CLASS_CON
, 5, BER_FLAGS_IMPLTAG
, dissect_ldap_T_greaterOrEqual
},
2240 { 6, &hf_ldap_lessOrEqual
, BER_CLASS_CON
, 6, BER_FLAGS_IMPLTAG
, dissect_ldap_T_lessOrEqual
},
2241 { 7, &hf_ldap_present
, BER_CLASS_CON
, 7, BER_FLAGS_IMPLTAG
, dissect_ldap_T_present
},
2242 { 8, &hf_ldap_approxMatch
, BER_CLASS_CON
, 8, BER_FLAGS_IMPLTAG
, dissect_ldap_T_approxMatch
},
2243 { 9, &hf_ldap_extensibleMatch
, BER_CLASS_CON
, 9, BER_FLAGS_IMPLTAG
, dissect_ldap_T_extensibleMatch
},
2244 { 0, NULL
, 0, 0, 0, NULL
}
2248 dissect_ldap_Filter(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2249 #line 661 "./asn1/ldap/ldap.cnf"
2252 attributedesc_string
=NULL
;
2254 if (Filter_length
++ > MAX_FILTER_LEN
) {
2255 expert_add_info_format(actx
->pinfo
, tree
, &ei_ldap_exceeded_filter_length
, "Filter length exceeds %u. Giving up.", MAX_FILTER_LEN
);
2256 THROW(ReportedBoundsError
);
2259 if (Filter_elements
++ > MAX_FILTER_ELEMENTS
) {
2260 expert_add_info_format(actx
->pinfo
, tree
, &ei_ldap_too_many_filter_elements
, "Found more than %u filter elements. Giving up.", MAX_FILTER_ELEMENTS
);
2261 THROW(ReportedBoundsError
);
2264 tr
=proto_tree_add_subtree(tree
, tvb
, offset
, -1, ett_ldap_Filter
, &it
, "Filter: ");
2267 offset
= dissect_ber_choice(actx
, tree
, tvb
, offset
,
2268 Filter_choice
, hf_index
, ett_ldap_Filter
,
2272 proto_item_append_text(it
, "%s", string_or_null(Filter_string
));
2282 dissect_ldap_T_filter(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2283 #line 514 "./asn1/ldap/ldap.cnf"
2285 Filter_elements
= 0;
2289 offset
= dissect_ldap_Filter(implicit_tag
, tvb
, offset
, actx
, tree
, hf_index
);
2291 #line 519 "./asn1/ldap/ldap.cnf"
2293 and_filter_string
=NULL
;
2294 Filter_elements
= 0;
2302 static const ber_sequence_t AttributeDescriptionList_sequence_of
[1] = {
2303 { &hf_ldap_AttributeDescriptionList_item
, BER_CLASS_UNI
, BER_UNI_TAG_OCTETSTRING
, BER_FLAGS_NOOWNTAG
, dissect_ldap_AttributeDescription
},
2307 dissect_ldap_AttributeDescriptionList(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2308 offset
= dissect_ber_sequence_of(implicit_tag
, actx
, tree
, tvb
, offset
,
2309 AttributeDescriptionList_sequence_of
, hf_index
, ett_ldap_AttributeDescriptionList
);
2315 static const ber_sequence_t SearchRequest_U_sequence
[] = {
2316 { &hf_ldap_baseObject
, BER_CLASS_UNI
, BER_UNI_TAG_OCTETSTRING
, BER_FLAGS_NOOWNTAG
, dissect_ldap_LDAPDN
},
2317 { &hf_ldap_scope
, BER_CLASS_UNI
, BER_UNI_TAG_ENUMERATED
, BER_FLAGS_NOOWNTAG
, dissect_ldap_T_scope
},
2318 { &hf_ldap_derefAliases
, BER_CLASS_UNI
, BER_UNI_TAG_ENUMERATED
, BER_FLAGS_NOOWNTAG
, dissect_ldap_T_derefAliases
},
2319 { &hf_ldap_sizeLimit
, BER_CLASS_UNI
, BER_UNI_TAG_INTEGER
, BER_FLAGS_NOOWNTAG
, dissect_ldap_INTEGER_0_maxInt
},
2320 { &hf_ldap_timeLimit
, BER_CLASS_UNI
, BER_UNI_TAG_INTEGER
, BER_FLAGS_NOOWNTAG
, dissect_ldap_INTEGER_0_maxInt
},
2321 { &hf_ldap_typesOnly
, BER_CLASS_UNI
, BER_UNI_TAG_BOOLEAN
, BER_FLAGS_NOOWNTAG
, dissect_ldap_BOOLEAN
},
2322 { &hf_ldap_filter
, BER_CLASS_ANY
/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG
|BER_FLAGS_NOTCHKTAG
, dissect_ldap_T_filter
},
2323 { &hf_ldap_searchRequest_attributes
, BER_CLASS_UNI
, BER_UNI_TAG_SEQUENCE
, BER_FLAGS_NOOWNTAG
, dissect_ldap_AttributeDescriptionList
},
2324 { NULL
, 0, 0, 0, NULL
}
2328 dissect_ldap_SearchRequest_U(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2329 offset
= dissect_ber_sequence(implicit_tag
, actx
, tree
, tvb
, offset
,
2330 SearchRequest_U_sequence
, hf_index
, ett_ldap_SearchRequest_U
);
2338 dissect_ldap_SearchRequest(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2339 offset
= dissect_ber_tagged_type(implicit_tag
, actx
, tree
, tvb
, offset
,
2340 hf_index
, BER_CLASS_APP
, 3, TRUE
, dissect_ldap_SearchRequest_U
);
2348 dissect_ldap_AttributeValue(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2349 #line 451 "./asn1/ldap/ldap.cnf"
2351 tvbuff_t
*next_tvb
= NULL
;
2353 int old_offset
= offset
;
2356 /* attr_type, should be set before calling this function */
2358 /* extract the value of the octetstring */
2359 offset
= dissect_ber_octet_string(FALSE
, actx
, NULL
, tvb
, offset
, hf_index
, &next_tvb
);
2361 /* first check if we have a custom attribute type configured */
2362 if ((hf_id
= get_hf_for_header (attr_type
)) != NULL
)
2363 proto_tree_add_item (tree
, *hf_id
, next_tvb
, 0, tvb_reported_length_remaining(next_tvb
, 0), ENC_UTF_8
|ENC_NA
);
2365 /* if we have an attribute type that isn't binary see if there is a better dissector */
2366 else if(!attr_type
|| !next_tvb
|| !dissector_try_string_new(ldap_name_dissector_table
, attr_type
, next_tvb
, actx
->pinfo
, tree
, FALSE
, NULL
)) {
2367 offset
= old_offset
;
2369 /* do the default thing */
2370 offset
= dissect_ber_octet_string(implicit_tag
, actx
, tree
, tvb
, offset
, hf_index
,
2374 if(tvb_ascii_isprint(next_tvb
, 0, tvb_reported_length(next_tvb
))) {
2375 string
= tvb_get_string_enc(wmem_packet_scope(), next_tvb
, 0, tvb_reported_length_remaining(next_tvb
, 0), ENC_UTF_8
|ENC_NA
);
2376 proto_item_set_text(actx
->created_item
, "AttributeValue: %s", string
);
2386 static const ber_sequence_t SET_OF_AttributeValue_set_of
[1] = {
2387 { &hf_ldap_vals_item
, BER_CLASS_UNI
, BER_UNI_TAG_OCTETSTRING
, BER_FLAGS_NOOWNTAG
, dissect_ldap_AttributeValue
},
2391 dissect_ldap_SET_OF_AttributeValue(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2392 offset
= dissect_ber_set_of(implicit_tag
, actx
, tree
, tvb
, offset
,
2393 SET_OF_AttributeValue_set_of
, hf_index
, ett_ldap_SET_OF_AttributeValue
);
2399 static const ber_sequence_t PartialAttributeList_item_sequence
[] = {
2400 { &hf_ldap_type
, BER_CLASS_UNI
, BER_UNI_TAG_OCTETSTRING
, BER_FLAGS_NOOWNTAG
, dissect_ldap_AttributeDescription
},
2401 { &hf_ldap_vals
, BER_CLASS_UNI
, BER_UNI_TAG_SET
, BER_FLAGS_NOOWNTAG
, dissect_ldap_SET_OF_AttributeValue
},
2402 { NULL
, 0, 0, 0, NULL
}
2406 dissect_ldap_PartialAttributeList_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_
) {
2407 offset
= dissect_ber_sequence(implicit_tag
, actx
, tree
, tvb
, offset
,
2408 PartialAttributeList_item_sequence
, hf_index
, ett_ldap_PartialAttributeList_item
);
2414 static const ber_sequence_t PartialAttributeList_sequence_of
[1] = {
2415 { &hf_ldap_PartialAttributeList_item
, BER_CLASS_UNI
, BER_UNI_TAG_SEQUENCE
, BER_FLAGS_NOOWNTAG
, dissect_ldap_PartialAttributeList_item
},
2419 dissect_ldap_PartialAttributeList(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2420 offset
= dissect_ber_sequence_of(implicit_tag
, actx
, tree
, tvb
, offset
,
2421 PartialAttributeList_sequence_of
, hf_index
, ett_ldap_PartialAttributeList
);
2427 static const ber_sequence_t SearchResultEntry_U_sequence
[] = {
2428 { &hf_ldap_objectName
, BER_CLASS_UNI
, BER_UNI_TAG_OCTETSTRING
, BER_FLAGS_NOOWNTAG
, dissect_ldap_LDAPDN
},
2429 { &hf_ldap_searchResultEntry_attributes
, BER_CLASS_UNI
, BER_UNI_TAG_SEQUENCE
, BER_FLAGS_NOOWNTAG
, dissect_ldap_PartialAttributeList
},
2430 { NULL
, 0, 0, 0, NULL
}
2434 dissect_ldap_SearchResultEntry_U(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2435 offset
= dissect_ber_sequence(implicit_tag
, actx
, tree
, tvb
, offset
,
2436 SearchResultEntry_U_sequence
, hf_index
, ett_ldap_SearchResultEntry_U
);
2444 dissect_ldap_SearchResultEntry(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2445 offset
= dissect_ber_tagged_type(implicit_tag
, actx
, tree
, tvb
, offset
,
2446 hf_index
, BER_CLASS_APP
, 4, TRUE
, dissect_ldap_SearchResultEntry_U
);
2452 static const value_string ldap_T_resultCode_vals
[] = {
2454 { 1, "operationsError" },
2455 { 2, "protocolError" },
2456 { 3, "timeLimitExceeded" },
2457 { 4, "sizeLimitExceeded" },
2458 { 5, "compareFalse" },
2459 { 6, "compareTrue" },
2460 { 7, "authMethodNotSupported" },
2461 { 8, "strongAuthRequired" },
2463 { 11, "adminLimitExceeded" },
2464 { 12, "unavailableCriticalExtension" },
2465 { 13, "confidentialityRequired" },
2466 { 14, "saslBindInProgress" },
2467 { 16, "noSuchAttribute" },
2468 { 17, "undefinedAttributeType" },
2469 { 18, "inappropriateMatching" },
2470 { 19, "constraintViolation" },
2471 { 20, "attributeOrValueExists" },
2472 { 21, "invalidAttributeSyntax" },
2473 { 32, "noSuchObject" },
2474 { 33, "aliasProblem" },
2475 { 34, "invalidDNSyntax" },
2476 { 36, "aliasDereferencingProblem" },
2477 { 48, "inappropriateAuthentication" },
2478 { 49, "invalidCredentials" },
2479 { 50, "insufficientAccessRights" },
2481 { 52, "unavailable" },
2482 { 53, "unwillingToPerform" },
2483 { 54, "loopDetect" },
2484 { 64, "namingViolation" },
2485 { 65, "objectClassViolation" },
2486 { 66, "notAllowedOnNonLeaf" },
2487 { 67, "notAllowedOnRDN" },
2488 { 68, "entryAlreadyExists" },
2489 { 69, "objectClassModsProhibited" },
2490 { 71, "affectsMultipleDSAs" },
2492 { 118, "canceled" },
2493 { 119, "noSuchOperation" },
2495 { 121, "cannotCancel" },
2501 dissect_ldap_T_resultCode(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2502 #line 405 "./asn1/ldap/ldap.cnf"
2504 const gchar
*valstr
;
2506 offset
= dissect_ber_integer(implicit_tag
, actx
, tree
, tvb
, offset
, hf_index
,
2510 ldap_do_protocolop(actx
->pinfo
);
2512 valstr
= val_to_str(result
, ldap_T_resultCode_vals
, "Unknown result(%u)");
2514 col_append_fstr(actx
->pinfo
->cinfo
, COL_INFO
, "%s ", valstr
);
2517 proto_item_append_text(ldm_tree
, " %s", valstr
);
2526 static const ber_sequence_t LDAPResult_sequence
[] = {
2527 { &hf_ldap_resultCode
, BER_CLASS_UNI
, BER_UNI_TAG_ENUMERATED
, BER_FLAGS_NOOWNTAG
, dissect_ldap_T_resultCode
},
2528 { &hf_ldap_matchedDN
, BER_CLASS_UNI
, BER_UNI_TAG_OCTETSTRING
, BER_FLAGS_NOOWNTAG
, dissect_ldap_LDAPDN
},
2529 { &hf_ldap_errorMessage
, BER_CLASS_UNI
, BER_UNI_TAG_OCTETSTRING
, BER_FLAGS_NOOWNTAG
, dissect_ldap_ErrorMessage
},
2530 { &hf_ldap_referral
, BER_CLASS_CON
, 3, BER_FLAGS_OPTIONAL
|BER_FLAGS_IMPLTAG
, dissect_ldap_Referral
},
2531 { NULL
, 0, 0, 0, NULL
}
2535 dissect_ldap_LDAPResult(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2536 offset
= dissect_ber_sequence(implicit_tag
, actx
, tree
, tvb
, offset
,
2537 LDAPResult_sequence
, hf_index
, ett_ldap_LDAPResult
);
2545 dissect_ldap_SearchResultDone(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2546 offset
= dissect_ber_tagged_type(implicit_tag
, actx
, tree
, tvb
, offset
,
2547 hf_index
, BER_CLASS_APP
, 5, TRUE
, dissect_ldap_LDAPResult
);
2553 static const ber_sequence_t SEQUENCE_OF_LDAPURL_sequence_of
[1] = {
2554 { &hf_ldap__untag_item
, BER_CLASS_UNI
, BER_UNI_TAG_OCTETSTRING
, BER_FLAGS_NOOWNTAG
, dissect_ldap_LDAPURL
},
2558 dissect_ldap_SEQUENCE_OF_LDAPURL(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2559 offset
= dissect_ber_sequence_of(implicit_tag
, actx
, tree
, tvb
, offset
,
2560 SEQUENCE_OF_LDAPURL_sequence_of
, hf_index
, ett_ldap_SEQUENCE_OF_LDAPURL
);
2568 dissect_ldap_SearchResultReference(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2569 #line 789 "./asn1/ldap/ldap.cnf"
2571 offset
= dissect_ber_tagged_type(implicit_tag
, actx
, tree
, tvb
, offset
,
2572 hf_index
, BER_CLASS_APP
, 19, TRUE
, dissect_ldap_SEQUENCE_OF_LDAPURL
);
2575 ldap_do_protocolop(actx
->pinfo
);
2584 static const value_string ldap_T_operation_vals
[] = {
2594 dissect_ldap_T_operation(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2595 offset
= dissect_ber_integer(implicit_tag
, actx
, tree
, tvb
, offset
, hf_index
,
2602 static const ber_sequence_t AttributeTypeAndValues_sequence
[] = {
2603 { &hf_ldap_type
, BER_CLASS_UNI
, BER_UNI_TAG_OCTETSTRING
, BER_FLAGS_NOOWNTAG
, dissect_ldap_AttributeDescription
},
2604 { &hf_ldap_vals
, BER_CLASS_UNI
, BER_UNI_TAG_SET
, BER_FLAGS_NOOWNTAG
, dissect_ldap_SET_OF_AttributeValue
},
2605 { NULL
, 0, 0, 0, NULL
}
2609 dissect_ldap_AttributeTypeAndValues(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2610 offset
= dissect_ber_sequence(implicit_tag
, actx
, tree
, tvb
, offset
,
2611 AttributeTypeAndValues_sequence
, hf_index
, ett_ldap_AttributeTypeAndValues
);
2617 static const ber_sequence_t T_modifyRequest_modification_item_sequence
[] = {
2618 { &hf_ldap_operation
, BER_CLASS_UNI
, BER_UNI_TAG_ENUMERATED
, BER_FLAGS_NOOWNTAG
, dissect_ldap_T_operation
},
2619 { &hf_ldap_modification
, BER_CLASS_UNI
, BER_UNI_TAG_SEQUENCE
, BER_FLAGS_NOOWNTAG
, dissect_ldap_AttributeTypeAndValues
},
2620 { NULL
, 0, 0, 0, NULL
}
2624 dissect_ldap_T_modifyRequest_modification_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_
) {
2625 offset
= dissect_ber_sequence(implicit_tag
, actx
, tree
, tvb
, offset
,
2626 T_modifyRequest_modification_item_sequence
, hf_index
, ett_ldap_T_modifyRequest_modification_item
);
2632 static const ber_sequence_t ModifyRequest_modification_sequence_of
[1] = {
2633 { &hf_ldap_modifyRequest_modification_item
, BER_CLASS_UNI
, BER_UNI_TAG_SEQUENCE
, BER_FLAGS_NOOWNTAG
, dissect_ldap_T_modifyRequest_modification_item
},
2637 dissect_ldap_ModifyRequest_modification(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2638 offset
= dissect_ber_sequence_of(implicit_tag
, actx
, tree
, tvb
, offset
,
2639 ModifyRequest_modification_sequence_of
, hf_index
, ett_ldap_ModifyRequest_modification
);
2645 static const ber_sequence_t ModifyRequest_U_sequence
[] = {
2646 { &hf_ldap_object
, BER_CLASS_UNI
, BER_UNI_TAG_OCTETSTRING
, BER_FLAGS_NOOWNTAG
, dissect_ldap_LDAPDN
},
2647 { &hf_ldap_modifyRequest_modification
, BER_CLASS_UNI
, BER_UNI_TAG_SEQUENCE
, BER_FLAGS_NOOWNTAG
, dissect_ldap_ModifyRequest_modification
},
2648 { NULL
, 0, 0, 0, NULL
}
2652 dissect_ldap_ModifyRequest_U(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2653 offset
= dissect_ber_sequence(implicit_tag
, actx
, tree
, tvb
, offset
,
2654 ModifyRequest_U_sequence
, hf_index
, ett_ldap_ModifyRequest_U
);
2662 dissect_ldap_ModifyRequest(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2663 offset
= dissect_ber_tagged_type(implicit_tag
, actx
, tree
, tvb
, offset
,
2664 hf_index
, BER_CLASS_APP
, 6, TRUE
, dissect_ldap_ModifyRequest_U
);
2672 dissect_ldap_ModifyResponse(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2673 offset
= dissect_ber_tagged_type(implicit_tag
, actx
, tree
, tvb
, offset
,
2674 hf_index
, BER_CLASS_APP
, 7, TRUE
, dissect_ldap_LDAPResult
);
2680 static const ber_sequence_t AttributeList_item_sequence
[] = {
2681 { &hf_ldap_type
, BER_CLASS_UNI
, BER_UNI_TAG_OCTETSTRING
, BER_FLAGS_NOOWNTAG
, dissect_ldap_AttributeDescription
},
2682 { &hf_ldap_vals
, BER_CLASS_UNI
, BER_UNI_TAG_SET
, BER_FLAGS_NOOWNTAG
, dissect_ldap_SET_OF_AttributeValue
},
2683 { NULL
, 0, 0, 0, NULL
}
2687 dissect_ldap_AttributeList_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_
) {
2688 offset
= dissect_ber_sequence(implicit_tag
, actx
, tree
, tvb
, offset
,
2689 AttributeList_item_sequence
, hf_index
, ett_ldap_AttributeList_item
);
2695 static const ber_sequence_t AttributeList_sequence_of
[1] = {
2696 { &hf_ldap_AttributeList_item
, BER_CLASS_UNI
, BER_UNI_TAG_SEQUENCE
, BER_FLAGS_NOOWNTAG
, dissect_ldap_AttributeList_item
},
2700 dissect_ldap_AttributeList(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2701 offset
= dissect_ber_sequence_of(implicit_tag
, actx
, tree
, tvb
, offset
,
2702 AttributeList_sequence_of
, hf_index
, ett_ldap_AttributeList
);
2708 static const ber_sequence_t AddRequest_U_sequence
[] = {
2709 { &hf_ldap_entry
, BER_CLASS_UNI
, BER_UNI_TAG_OCTETSTRING
, BER_FLAGS_NOOWNTAG
, dissect_ldap_LDAPDN
},
2710 { &hf_ldap_attributes
, BER_CLASS_UNI
, BER_UNI_TAG_SEQUENCE
, BER_FLAGS_NOOWNTAG
, dissect_ldap_AttributeList
},
2711 { NULL
, 0, 0, 0, NULL
}
2715 dissect_ldap_AddRequest_U(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2716 offset
= dissect_ber_sequence(implicit_tag
, actx
, tree
, tvb
, offset
,
2717 AddRequest_U_sequence
, hf_index
, ett_ldap_AddRequest_U
);
2725 dissect_ldap_AddRequest(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2726 offset
= dissect_ber_tagged_type(implicit_tag
, actx
, tree
, tvb
, offset
,
2727 hf_index
, BER_CLASS_APP
, 8, TRUE
, dissect_ldap_AddRequest_U
);
2735 dissect_ldap_AddResponse(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2736 offset
= dissect_ber_tagged_type(implicit_tag
, actx
, tree
, tvb
, offset
,
2737 hf_index
, BER_CLASS_APP
, 9, TRUE
, dissect_ldap_LDAPResult
);
2745 dissect_ldap_DelRequest(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2746 offset
= dissect_ber_tagged_type(implicit_tag
, actx
, tree
, tvb
, offset
,
2747 hf_index
, BER_CLASS_APP
, 10, TRUE
, dissect_ldap_LDAPDN
);
2755 dissect_ldap_DelResponse(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2756 offset
= dissect_ber_tagged_type(implicit_tag
, actx
, tree
, tvb
, offset
,
2757 hf_index
, BER_CLASS_APP
, 11, TRUE
, dissect_ldap_LDAPResult
);
2765 dissect_ldap_RelativeLDAPDN(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2766 offset
= dissect_ldap_LDAPString(implicit_tag
, tvb
, offset
, actx
, tree
, hf_index
);
2772 static const ber_sequence_t ModifyDNRequest_U_sequence
[] = {
2773 { &hf_ldap_entry
, BER_CLASS_UNI
, BER_UNI_TAG_OCTETSTRING
, BER_FLAGS_NOOWNTAG
, dissect_ldap_LDAPDN
},
2774 { &hf_ldap_newrdn
, BER_CLASS_UNI
, BER_UNI_TAG_OCTETSTRING
, BER_FLAGS_NOOWNTAG
, dissect_ldap_RelativeLDAPDN
},
2775 { &hf_ldap_deleteoldrdn
, BER_CLASS_UNI
, BER_UNI_TAG_BOOLEAN
, BER_FLAGS_NOOWNTAG
, dissect_ldap_BOOLEAN
},
2776 { &hf_ldap_newSuperior
, BER_CLASS_CON
, 0, BER_FLAGS_OPTIONAL
|BER_FLAGS_IMPLTAG
, dissect_ldap_LDAPDN
},
2777 { NULL
, 0, 0, 0, NULL
}
2781 dissect_ldap_ModifyDNRequest_U(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2782 offset
= dissect_ber_sequence(implicit_tag
, actx
, tree
, tvb
, offset
,
2783 ModifyDNRequest_U_sequence
, hf_index
, ett_ldap_ModifyDNRequest_U
);
2791 dissect_ldap_ModifyDNRequest(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2792 offset
= dissect_ber_tagged_type(implicit_tag
, actx
, tree
, tvb
, offset
,
2793 hf_index
, BER_CLASS_APP
, 12, TRUE
, dissect_ldap_ModifyDNRequest_U
);
2801 dissect_ldap_ModifyDNResponse(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2802 offset
= dissect_ber_tagged_type(implicit_tag
, actx
, tree
, tvb
, offset
,
2803 hf_index
, BER_CLASS_APP
, 13, TRUE
, dissect_ldap_LDAPResult
);
2809 static const ber_sequence_t CompareRequest_U_sequence
[] = {
2810 { &hf_ldap_entry
, BER_CLASS_UNI
, BER_UNI_TAG_OCTETSTRING
, BER_FLAGS_NOOWNTAG
, dissect_ldap_LDAPDN
},
2811 { &hf_ldap_ava
, BER_CLASS_UNI
, BER_UNI_TAG_SEQUENCE
, BER_FLAGS_NOOWNTAG
, dissect_ldap_AttributeValueAssertion
},
2812 { NULL
, 0, 0, 0, NULL
}
2816 dissect_ldap_CompareRequest_U(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2817 offset
= dissect_ber_sequence(implicit_tag
, actx
, tree
, tvb
, offset
,
2818 CompareRequest_U_sequence
, hf_index
, ett_ldap_CompareRequest_U
);
2826 dissect_ldap_CompareRequest(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2827 offset
= dissect_ber_tagged_type(implicit_tag
, actx
, tree
, tvb
, offset
,
2828 hf_index
, BER_CLASS_APP
, 14, TRUE
, dissect_ldap_CompareRequest_U
);
2836 dissect_ldap_CompareResponse(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2837 offset
= dissect_ber_tagged_type(implicit_tag
, actx
, tree
, tvb
, offset
,
2838 hf_index
, BER_CLASS_APP
, 15, TRUE
, dissect_ldap_LDAPResult
);
2846 dissect_ldap_AbandonRequest(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2847 #line 796 "./asn1/ldap/ldap.cnf"
2849 offset
= dissect_ber_tagged_type(implicit_tag
, actx
, tree
, tvb
, offset
,
2850 hf_index
, BER_CLASS_APP
, 16, TRUE
, dissect_ldap_MessageID
);
2853 ldap_do_protocolop(actx
->pinfo
);
2863 dissect_ldap_LDAPOID(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2864 #line 57 "./asn1/ldap/ldap.cnf"
2866 tvbuff_t
*parameter_tvb
;
2868 ldap_conv_info_t
*ldap_info
= (ldap_conv_info_t
*)actx
->private_data
;
2871 offset
= dissect_ber_octet_string(implicit_tag
, actx
, tree
, tvb
, offset
, hf_index
,
2874 #line 65 "./asn1/ldap/ldap.cnf"
2876 object_identifier_id
= NULL
;
2881 object_identifier_id
= tvb_get_string_enc(wmem_packet_scope(), parameter_tvb
, 0, tvb_reported_length_remaining(parameter_tvb
,0), ENC_UTF_8
|ENC_NA
);
2882 name
= oid_resolved_from_string(wmem_packet_scope(), object_identifier_id
);
2885 proto_item_append_text(actx
->created_item
, " (%s)", name
);
2887 if((hf_index
== hf_ldap_requestName
) || (hf_index
== hf_ldap_responseName
)) {
2888 ldap_do_protocolop(actx
->pinfo
);
2889 col_append_fstr(actx
->pinfo
->cinfo
, COL_INFO
, "%s ", name
);
2893 /* Has the client requested the Start TLS operation? */
2894 if (ldap_info
&& hf_index
== hf_ldap_requestName
&&
2895 !strcmp(object_identifier_id
, "1.3.6.1.4.1.1466.20037")) {
2896 /* remember we have asked to start_tls */
2897 ldap_info
->start_tls_pending
= TRUE
;
2907 dissect_ldap_T_requestValue(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2908 #line 731 "./asn1/ldap/ldap.cnf"
2910 if((object_identifier_id
!= NULL
) && oid_has_dissector(object_identifier_id
)) {
2911 offset
= call_ber_oid_callback(object_identifier_id
, tvb
, offset
, actx
->pinfo
, tree
, NULL
);
2913 offset
= dissect_ber_octet_string(implicit_tag
, actx
, tree
, tvb
, offset
, hf_index
,
2924 static const ber_sequence_t ExtendedRequest_U_sequence
[] = {
2925 { &hf_ldap_requestName
, BER_CLASS_CON
, 0, BER_FLAGS_IMPLTAG
, dissect_ldap_LDAPOID
},
2926 { &hf_ldap_requestValue
, BER_CLASS_CON
, 1, BER_FLAGS_OPTIONAL
|BER_FLAGS_IMPLTAG
, dissect_ldap_T_requestValue
},
2927 { NULL
, 0, 0, 0, NULL
}
2931 dissect_ldap_ExtendedRequest_U(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2932 offset
= dissect_ber_sequence(implicit_tag
, actx
, tree
, tvb
, offset
,
2933 ExtendedRequest_U_sequence
, hf_index
, ett_ldap_ExtendedRequest_U
);
2941 dissect_ldap_ExtendedRequest(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2942 offset
= dissect_ber_tagged_type(implicit_tag
, actx
, tree
, tvb
, offset
,
2943 hf_index
, BER_CLASS_APP
, 23, TRUE
, dissect_ldap_ExtendedRequest_U
);
2949 static const value_string ldap_ExtendedResponse_resultCode_vals
[] = {
2951 { 1, "operationsError" },
2952 { 2, "protocolError" },
2953 { 3, "timeLimitExceeded" },
2954 { 4, "sizeLimitExceeded" },
2955 { 5, "compareFalse" },
2956 { 6, "compareTrue" },
2957 { 7, "authMethodNotSupported" },
2958 { 8, "strongAuthRequired" },
2960 { 11, "adminLimitExceeded" },
2961 { 12, "unavailableCriticalExtension" },
2962 { 13, "confidentialityRequired" },
2963 { 14, "saslBindInProgress" },
2964 { 16, "noSuchAttribute" },
2965 { 17, "undefinedAttributeType" },
2966 { 18, "inappropriateMatching" },
2967 { 19, "constraintViolation" },
2968 { 20, "attributeOrValueExists" },
2969 { 21, "invalidAttributeSyntax" },
2970 { 32, "noSuchObject" },
2971 { 33, "aliasProblem" },
2972 { 34, "invalidDNSyntax" },
2973 { 36, "aliasDereferencingProblem" },
2974 { 48, "inappropriateAuthentication" },
2975 { 49, "invalidCredentials" },
2976 { 50, "insufficientAccessRights" },
2978 { 52, "unavailable" },
2979 { 53, "unwillingToPerform" },
2980 { 54, "loopDetect" },
2981 { 64, "namingViolation" },
2982 { 65, "objectClassViolation" },
2983 { 66, "notAllowedOnNonLeaf" },
2984 { 67, "notAllowedOnRDN" },
2985 { 68, "entryAlreadyExists" },
2986 { 69, "objectClassModsProhibited" },
2987 { 71, "affectsMultipleDSAs" },
2989 { 118, "canceled" },
2990 { 119, "noSuchOperation" },
2992 { 121, "cannotCancel" },
2998 dissect_ldap_ExtendedResponse_resultCode(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
2999 #line 436 "./asn1/ldap/ldap.cnf"
3001 ldap_conv_info_t
*ldap_info
= (ldap_conv_info_t
*)actx
->private_data
;
3003 offset
= dissect_ber_integer(implicit_tag
, actx
, tree
, tvb
, offset
, hf_index
,
3005 /* If Start TLS request was sent and resultCode is success... */
3006 if (ldap_info
&& ldap_info
->start_tls_pending
&&
3007 hf_index
== hf_ldap_extendedResponse_resultCode
&& resultCode
== 0) {
3008 /* The conversation will continue using SSL */
3009 ssl_starttls_ack(find_dissector("tls"), actx
->pinfo
, ldap_handle
);
3010 ldap_info
->start_tls_pending
= FALSE
;
3022 dissect_ldap_ResponseName(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
3023 offset
= dissect_ldap_LDAPOID(implicit_tag
, tvb
, offset
, actx
, tree
, hf_index
);
3031 dissect_ldap_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_
) {
3032 offset
= dissect_ber_octet_string(implicit_tag
, actx
, tree
, tvb
, offset
, hf_index
,
3039 static const ber_sequence_t ExtendedResponse_U_sequence
[] = {
3040 { &hf_ldap_extendedResponse_resultCode
, BER_CLASS_UNI
, BER_UNI_TAG_ENUMERATED
, BER_FLAGS_NOOWNTAG
, dissect_ldap_ExtendedResponse_resultCode
},
3041 { &hf_ldap_matchedDN
, BER_CLASS_UNI
, BER_UNI_TAG_OCTETSTRING
, BER_FLAGS_NOOWNTAG
, dissect_ldap_LDAPDN
},
3042 { &hf_ldap_errorMessage
, BER_CLASS_UNI
, BER_UNI_TAG_OCTETSTRING
, BER_FLAGS_NOOWNTAG
, dissect_ldap_ErrorMessage
},
3043 { &hf_ldap_referral
, BER_CLASS_CON
, 3, BER_FLAGS_OPTIONAL
|BER_FLAGS_IMPLTAG
, dissect_ldap_Referral
},
3044 { &hf_ldap_responseName
, BER_CLASS_CON
, 10, BER_FLAGS_OPTIONAL
|BER_FLAGS_IMPLTAG
, dissect_ldap_ResponseName
},
3045 { &hf_ldap_response
, BER_CLASS_CON
, 11, BER_FLAGS_OPTIONAL
|BER_FLAGS_IMPLTAG
, dissect_ldap_OCTET_STRING
},
3046 { NULL
, 0, 0, 0, NULL
}
3050 dissect_ldap_ExtendedResponse_U(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
3051 offset
= dissect_ber_sequence(implicit_tag
, actx
, tree
, tvb
, offset
,
3052 ExtendedResponse_U_sequence
, hf_index
, ett_ldap_ExtendedResponse_U
);
3060 dissect_ldap_ExtendedResponse(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
3061 offset
= dissect_ber_tagged_type(implicit_tag
, actx
, tree
, tvb
, offset
,
3062 hf_index
, BER_CLASS_APP
, 24, TRUE
, dissect_ldap_ExtendedResponse_U
);
3070 dissect_ldap_T_intermediateResponse_responseValue(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
3071 #line 739 "./asn1/ldap/ldap.cnf"
3076 #line 743 "./asn1/ldap/ldap.cnf"
3077 if(ldm_tree
&& object_identifier_id
) {
3078 proto_item_set_text(ldm_tree
, "%s %s", "IntermediateResponse", object_identifier_id
);
3079 name
= oid_resolved_from_string(wmem_packet_scope(), object_identifier_id
);
3081 proto_item_append_text(ldm_tree
, " (%s)", name
);
3083 if((object_identifier_id
!= NULL
) && oid_has_dissector(object_identifier_id
)) {
3084 offset
= call_ber_oid_callback(object_identifier_id
, tvb
, offset
, actx
->pinfo
, tree
, NULL
);
3086 offset
= dissect_ber_octet_string(implicit_tag
, actx
, tree
, tvb
, offset
, hf_index
,
3097 static const ber_sequence_t IntermediateResponse_U_sequence
[] = {
3098 { &hf_ldap_responseName
, BER_CLASS_CON
, 0, BER_FLAGS_OPTIONAL
|BER_FLAGS_IMPLTAG
, dissect_ldap_ResponseName
},
3099 { &hf_ldap_intermediateResponse_responseValue
, BER_CLASS_CON
, 1, BER_FLAGS_OPTIONAL
|BER_FLAGS_IMPLTAG
, dissect_ldap_T_intermediateResponse_responseValue
},
3100 { NULL
, 0, 0, 0, NULL
}
3104 dissect_ldap_IntermediateResponse_U(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
3105 offset
= dissect_ber_sequence(implicit_tag
, actx
, tree
, tvb
, offset
,
3106 IntermediateResponse_U_sequence
, hf_index
, ett_ldap_IntermediateResponse_U
);
3114 dissect_ldap_IntermediateResponse(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
3115 offset
= dissect_ber_tagged_type(implicit_tag
, actx
, tree
, tvb
, offset
,
3116 hf_index
, BER_CLASS_APP
, 25, TRUE
, dissect_ldap_IntermediateResponse_U
);
3122 static const value_string ldap_ProtocolOp_vals
[] = {
3123 { 0, "bindRequest" },
3124 { 1, "bindResponse" },
3125 { 2, "unbindRequest" },
3126 { 3, "searchRequest" },
3127 { 4, "searchResEntry" },
3128 { 5, "searchResDone" },
3129 { 19, "searchResRef" },
3130 { 6, "modifyRequest" },
3131 { 7, "modifyResponse" },
3132 { 8, "addRequest" },
3133 { 9, "addResponse" },
3134 { 10, "delRequest" },
3135 { 11, "delResponse" },
3136 { 12, "modDNRequest" },
3137 { 13, "modDNResponse" },
3138 { 14, "compareRequest" },
3139 { 15, "compareResponse" },
3140 { 16, "abandonRequest" },
3141 { 23, "extendedReq" },
3142 { 24, "extendedResp" },
3143 { 25, "intermediateResponse" },
3147 static const ber_choice_t ProtocolOp_choice
[] = {
3148 { 0, &hf_ldap_bindRequest
, BER_CLASS_APP
, 0, BER_FLAGS_NOOWNTAG
, dissect_ldap_BindRequest
},
3149 { 1, &hf_ldap_bindResponse
, BER_CLASS_APP
, 1, BER_FLAGS_NOOWNTAG
, dissect_ldap_BindResponse
},
3150 { 2, &hf_ldap_unbindRequest
, BER_CLASS_APP
, 2, BER_FLAGS_NOOWNTAG
, dissect_ldap_UnbindRequest
},
3151 { 3, &hf_ldap_searchRequest
, BER_CLASS_APP
, 3, BER_FLAGS_NOOWNTAG
, dissect_ldap_SearchRequest
},
3152 { 4, &hf_ldap_searchResEntry
, BER_CLASS_APP
, 4, BER_FLAGS_NOOWNTAG
, dissect_ldap_SearchResultEntry
},
3153 { 5, &hf_ldap_searchResDone
, BER_CLASS_APP
, 5, BER_FLAGS_NOOWNTAG
, dissect_ldap_SearchResultDone
},
3154 { 19, &hf_ldap_searchResRef
, BER_CLASS_APP
, 19, BER_FLAGS_NOOWNTAG
, dissect_ldap_SearchResultReference
},
3155 { 6, &hf_ldap_modifyRequest
, BER_CLASS_APP
, 6, BER_FLAGS_NOOWNTAG
, dissect_ldap_ModifyRequest
},
3156 { 7, &hf_ldap_modifyResponse
, BER_CLASS_APP
, 7, BER_FLAGS_NOOWNTAG
, dissect_ldap_ModifyResponse
},
3157 { 8, &hf_ldap_addRequest
, BER_CLASS_APP
, 8, BER_FLAGS_NOOWNTAG
, dissect_ldap_AddRequest
},
3158 { 9, &hf_ldap_addResponse
, BER_CLASS_APP
, 9, BER_FLAGS_NOOWNTAG
, dissect_ldap_AddResponse
},
3159 { 10, &hf_ldap_delRequest
, BER_CLASS_APP
, 10, BER_FLAGS_NOOWNTAG
, dissect_ldap_DelRequest
},
3160 { 11, &hf_ldap_delResponse
, BER_CLASS_APP
, 11, BER_FLAGS_NOOWNTAG
, dissect_ldap_DelResponse
},
3161 { 12, &hf_ldap_modDNRequest
, BER_CLASS_APP
, 12, BER_FLAGS_NOOWNTAG
, dissect_ldap_ModifyDNRequest
},
3162 { 13, &hf_ldap_modDNResponse
, BER_CLASS_APP
, 13, BER_FLAGS_NOOWNTAG
, dissect_ldap_ModifyDNResponse
},
3163 { 14, &hf_ldap_compareRequest
, BER_CLASS_APP
, 14, BER_FLAGS_NOOWNTAG
, dissect_ldap_CompareRequest
},
3164 { 15, &hf_ldap_compareResponse
, BER_CLASS_APP
, 15, BER_FLAGS_NOOWNTAG
, dissect_ldap_CompareResponse
},
3165 { 16, &hf_ldap_abandonRequest
, BER_CLASS_APP
, 16, BER_FLAGS_NOOWNTAG
, dissect_ldap_AbandonRequest
},
3166 { 23, &hf_ldap_extendedReq
, BER_CLASS_APP
, 23, BER_FLAGS_NOOWNTAG
, dissect_ldap_ExtendedRequest
},
3167 { 24, &hf_ldap_extendedResp
, BER_CLASS_APP
, 24, BER_FLAGS_NOOWNTAG
, dissect_ldap_ExtendedResponse
},
3168 { 25, &hf_ldap_intermediateResponse
, BER_CLASS_APP
, 25, BER_FLAGS_NOOWNTAG
, dissect_ldap_IntermediateResponse
},
3169 { 0, NULL
, 0, 0, 0, NULL
}
3173 dissect_ldap_ProtocolOp(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
3174 #line 99 "./asn1/ldap/ldap.cnf"
3176 ldap_call_response_t
*lcrp
;
3177 ldap_conv_info_t
*ldap_info
= (ldap_conv_info_t
*)actx
->private_data
;
3178 do_protocolop
= TRUE
;
3181 offset
= dissect_ber_choice(actx
, tree
, tvb
, offset
,
3182 ProtocolOp_choice
, hf_index
, ett_ldap_ProtocolOp
,
3185 #line 105 "./asn1/ldap/ldap.cnf"
3187 if (ProtocolOp
== -1) {
3191 /* ProtocolOp is the index, not the tag so convert it to the tag value */
3192 ProtocolOp
= ldap_ProtocolOp_vals
[ProtocolOp
].value
;
3194 lcrp
=ldap_match_call_response(tvb
, actx
->pinfo
, tree
, MessageID
, ProtocolOp
, ldap_info
);
3196 tap_queue_packet(ldap_tap
, actx
->pinfo
, lcrp
);
3199 /* XXX: the count will not work if the results span multiple TCP packets */
3201 if(ldap_info
) { /* only count once */
3202 switch(ProtocolOp
) {
3204 case LDAP_RES_SEARCH_ENTRY
:
3205 if (!actx
->pinfo
->fd
->visited
)
3206 ldap_info
->num_results
++;
3208 proto_item_append_text(tree
, " [%d result%s]",
3209 ldap_info
->num_results
, ldap_info
->num_results
== 1 ? "" : "s");
3213 case LDAP_RES_SEARCH_RESULT
:
3215 col_append_fstr(actx
->pinfo
->cinfo
, COL_INFO
, " [%d result%s]",
3216 ldap_info
->num_results
, ldap_info
->num_results
== 1 ? "" : "s");
3218 proto_item_append_text(tree
, " [%d result%s]",
3219 ldap_info
->num_results
, ldap_info
->num_results
== 1 ? "" : "s");
3235 dissect_ldap_ControlType(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
3236 offset
= dissect_ldap_LDAPOID(implicit_tag
, tvb
, offset
, actx
, tree
, hf_index
);
3244 dissect_ldap_T_controlValue(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
3245 #line 712 "./asn1/ldap/ldap.cnf"
3251 if((object_identifier_id
!= NULL
) && oid_has_dissector(object_identifier_id
)) {
3252 /* remove the OCTET STRING encoding */
3253 offset
=dissect_ber_identifier(actx
->pinfo
, NULL
, tvb
, offset
, &ber_class
, &pc
, &tag
);
3254 offset
=dissect_ber_length(actx
->pinfo
, NULL
, tvb
, offset
, &len
, &ind
);
3256 call_ber_oid_callback(object_identifier_id
, tvb
, offset
, actx
->pinfo
, tree
, NULL
);
3260 offset
= dissect_ber_octet_string(implicit_tag
, actx
, tree
, tvb
, offset
, hf_index
,
3272 static const ber_sequence_t Control_sequence
[] = {
3273 { &hf_ldap_controlType
, BER_CLASS_UNI
, BER_UNI_TAG_OCTETSTRING
, BER_FLAGS_NOOWNTAG
, dissect_ldap_ControlType
},
3274 { &hf_ldap_criticality
, BER_CLASS_UNI
, BER_UNI_TAG_BOOLEAN
, BER_FLAGS_OPTIONAL
|BER_FLAGS_NOOWNTAG
, dissect_ldap_BOOLEAN
},
3275 { &hf_ldap_controlValue
, BER_CLASS_UNI
, BER_UNI_TAG_OCTETSTRING
, BER_FLAGS_OPTIONAL
|BER_FLAGS_NOOWNTAG
, dissect_ldap_T_controlValue
},
3276 { NULL
, 0, 0, 0, NULL
}
3280 dissect_ldap_Control(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
3281 offset
= dissect_ber_sequence(implicit_tag
, actx
, tree
, tvb
, offset
,
3282 Control_sequence
, hf_index
, ett_ldap_Control
);
3288 static const ber_sequence_t Controls_sequence_of
[1] = {
3289 { &hf_ldap_Controls_item
, BER_CLASS_UNI
, BER_UNI_TAG_SEQUENCE
, BER_FLAGS_NOOWNTAG
, dissect_ldap_Control
},
3293 dissect_ldap_Controls(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
3294 offset
= dissect_ber_sequence_of(implicit_tag
, actx
, tree
, tvb
, offset
,
3295 Controls_sequence_of
, hf_index
, ett_ldap_Controls
);
3301 static const ber_sequence_t LDAPMessage_sequence
[] = {
3302 { &hf_ldap_messageID
, BER_CLASS_UNI
, BER_UNI_TAG_INTEGER
, BER_FLAGS_NOOWNTAG
, dissect_ldap_MessageID
},
3303 { &hf_ldap_protocolOp
, BER_CLASS_ANY
/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG
|BER_FLAGS_NOTCHKTAG
, dissect_ldap_ProtocolOp
},
3304 { &hf_ldap_controls
, BER_CLASS_CON
, 0, BER_FLAGS_OPTIONAL
|BER_FLAGS_IMPLTAG
, dissect_ldap_Controls
},
3305 { NULL
, 0, 0, 0, NULL
}
3309 dissect_ldap_LDAPMessage(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
3310 offset
= dissect_ber_sequence(implicit_tag
, actx
, tree
, tvb
, offset
,
3311 LDAPMessage_sequence
, hf_index
, ett_ldap_LDAPMessage
);
3321 dissect_ldap_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_
) {
3322 offset
= dissect_ber_integer(implicit_tag
, actx
, tree
, tvb
, offset
, hf_index
,
3329 static const ber_sequence_t SearchControlValue_sequence
[] = {
3330 { &hf_ldap_size
, BER_CLASS_UNI
, BER_UNI_TAG_INTEGER
, BER_FLAGS_NOOWNTAG
, dissect_ldap_INTEGER
},
3331 { &hf_ldap_cookie
, BER_CLASS_UNI
, BER_UNI_TAG_OCTETSTRING
, BER_FLAGS_NOOWNTAG
, dissect_ldap_OCTET_STRING
},
3332 { NULL
, 0, 0, 0, NULL
}
3336 dissect_ldap_SearchControlValue(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
3337 offset
= dissect_ber_sequence(implicit_tag
, actx
, tree
, tvb
, offset
,
3338 SearchControlValue_sequence
, hf_index
, ett_ldap_SearchControlValue
);
3344 static const ber_sequence_t SortKeyList_item_sequence
[] = {
3345 { &hf_ldap_attributeType
, BER_CLASS_UNI
, BER_UNI_TAG_OCTETSTRING
, BER_FLAGS_NOOWNTAG
, dissect_ldap_AttributeDescription
},
3346 { &hf_ldap_orderingRule
, BER_CLASS_CON
, 0, BER_FLAGS_OPTIONAL
|BER_FLAGS_IMPLTAG
, dissect_ldap_MatchingRuleId
},
3347 { &hf_ldap_reverseOrder
, BER_CLASS_CON
, 1, BER_FLAGS_OPTIONAL
|BER_FLAGS_IMPLTAG
, dissect_ldap_BOOLEAN
},
3348 { NULL
, 0, 0, 0, NULL
}
3352 dissect_ldap_SortKeyList_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_
) {
3353 offset
= dissect_ber_sequence(implicit_tag
, actx
, tree
, tvb
, offset
,
3354 SortKeyList_item_sequence
, hf_index
, ett_ldap_SortKeyList_item
);
3360 static const ber_sequence_t SortKeyList_sequence_of
[1] = {
3361 { &hf_ldap_SortKeyList_item
, BER_CLASS_UNI
, BER_UNI_TAG_SEQUENCE
, BER_FLAGS_NOOWNTAG
, dissect_ldap_SortKeyList_item
},
3365 dissect_ldap_SortKeyList(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
3366 offset
= dissect_ber_sequence_of(implicit_tag
, actx
, tree
, tvb
, offset
,
3367 SortKeyList_sequence_of
, hf_index
, ett_ldap_SortKeyList
);
3373 static const value_string ldap_T_sortResult_vals
[] = {
3375 { 1, "operationsError" },
3376 { 3, "timeLimitExceeded" },
3377 { 8, "strongAuthRequired" },
3378 { 11, "adminLimitExceeded" },
3379 { 16, "noSuchAttribute" },
3380 { 18, "inappropriateMatching" },
3381 { 50, "insufficientAccessRights" },
3383 { 53, "unwillingToPerform" },
3390 dissect_ldap_T_sortResult(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
3391 offset
= dissect_ber_integer(implicit_tag
, actx
, tree
, tvb
, offset
, hf_index
,
3398 static const ber_sequence_t SortResult_sequence
[] = {
3399 { &hf_ldap_sortResult
, BER_CLASS_UNI
, BER_UNI_TAG_ENUMERATED
, BER_FLAGS_NOOWNTAG
, dissect_ldap_T_sortResult
},
3400 { &hf_ldap_attributeType
, BER_CLASS_CON
, 0, BER_FLAGS_OPTIONAL
|BER_FLAGS_IMPLTAG
, dissect_ldap_AttributeDescription
},
3401 { NULL
, 0, 0, 0, NULL
}
3405 dissect_ldap_SortResult(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
3406 offset
= dissect_ber_sequence(implicit_tag
, actx
, tree
, tvb
, offset
,
3407 SortResult_sequence
, hf_index
, ett_ldap_SortResult
);
3415 dissect_ldap_DirSyncFlags(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
3416 #line 756 "./asn1/ldap/ldap.cnf"
3423 int otheroffset
= offset
;
3425 dissect_ber_identifier(actx
->pinfo
, tree
, tvb
, otheroffset
, &ber_class
, &pc
, &tag
);
3426 otheroffset
=dissect_ber_length(actx
->pinfo
, tree
, tvb
, offset
, &len
, NULL
);
3428 gint32 remaining
=tvb_reported_length_remaining(tvb
, offset
);
3429 len
=remaining
>0 ? remaining
: 0;
3432 offset
= dissect_ber_integer(implicit_tag
, actx
, tree
, tvb
, offset
, -1, &val
);
3435 static int * const flags
[] = {
3436 &hf_ldap_object_security_flag
,
3437 &hf_ldap_ancestor_first_flag
,
3438 &hf_ldap_public_data_only_flag
,
3439 &hf_ldap_incremental_value_flag
,
3443 proto_tree_add_bitmask_value_with_flags(tree
, tvb
, otheroffset
+1, hf_index
,
3444 ett_ldap_DirSyncFlagsSubEntry
, flags
, val
, BMT_NO_APPEND
);
3446 proto_tree_add_uint(tree
, hf_index
, tvb
, otheroffset
+len
, len
, 0);
3455 static const ber_sequence_t DirSyncControlValue_sequence
[] = {
3456 { &hf_ldap_flags
, BER_CLASS_UNI
, BER_UNI_TAG_INTEGER
, BER_FLAGS_NOOWNTAG
, dissect_ldap_DirSyncFlags
},
3457 { &hf_ldap_maxBytes
, BER_CLASS_UNI
, BER_UNI_TAG_INTEGER
, BER_FLAGS_NOOWNTAG
, dissect_ldap_INTEGER
},
3458 { &hf_ldap_cookie
, BER_CLASS_UNI
, BER_UNI_TAG_OCTETSTRING
, BER_FLAGS_NOOWNTAG
, dissect_ldap_OCTET_STRING
},
3459 { NULL
, 0, 0, 0, NULL
}
3463 dissect_ldap_DirSyncControlValue(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
3464 offset
= dissect_ber_sequence(implicit_tag
, actx
, tree
, tvb
, offset
,
3465 DirSyncControlValue_sequence
, hf_index
, ett_ldap_DirSyncControlValue
);
3471 static const ber_sequence_t PasswdModifyRequestValue_sequence
[] = {
3472 { &hf_ldap_userIdentity
, BER_CLASS_CON
, 0, BER_FLAGS_OPTIONAL
|BER_FLAGS_IMPLTAG
, dissect_ldap_OCTET_STRING
},
3473 { &hf_ldap_oldPasswd
, BER_CLASS_CON
, 1, BER_FLAGS_OPTIONAL
|BER_FLAGS_IMPLTAG
, dissect_ldap_OCTET_STRING
},
3474 { &hf_ldap_newPasswd
, BER_CLASS_CON
, 2, BER_FLAGS_OPTIONAL
|BER_FLAGS_IMPLTAG
, dissect_ldap_OCTET_STRING
},
3475 { NULL
, 0, 0, 0, NULL
}
3479 dissect_ldap_PasswdModifyRequestValue(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
3480 offset
= dissect_ber_sequence(implicit_tag
, actx
, tree
, tvb
, offset
,
3481 PasswdModifyRequestValue_sequence
, hf_index
, ett_ldap_PasswdModifyRequestValue
);
3487 static const ber_sequence_t CancelRequestValue_sequence
[] = {
3488 { &hf_ldap_cancelID
, BER_CLASS_UNI
, BER_UNI_TAG_INTEGER
, BER_FLAGS_NOOWNTAG
, dissect_ldap_MessageID
},
3489 { NULL
, 0, 0, 0, NULL
}
3493 dissect_ldap_CancelRequestValue(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
3494 offset
= dissect_ber_sequence(implicit_tag
, actx
, tree
, tvb
, offset
,
3495 CancelRequestValue_sequence
, hf_index
, ett_ldap_CancelRequestValue
);
3501 static const value_string ldap_T_mode_vals
[] = {
3502 { 1, "refreshOnly" },
3503 { 3, "refreshAndPersist" },
3509 dissect_ldap_T_mode(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
3510 offset
= dissect_ber_integer(implicit_tag
, actx
, tree
, tvb
, offset
, hf_index
,
3517 static const ber_sequence_t SyncRequestValue_sequence
[] = {
3518 { &hf_ldap_mode
, BER_CLASS_UNI
, BER_UNI_TAG_ENUMERATED
, BER_FLAGS_NOOWNTAG
, dissect_ldap_T_mode
},
3519 { &hf_ldap_cookie
, BER_CLASS_UNI
, BER_UNI_TAG_OCTETSTRING
, BER_FLAGS_OPTIONAL
|BER_FLAGS_NOOWNTAG
, dissect_ldap_OCTET_STRING
},
3520 { &hf_ldap_reloadHint
, BER_CLASS_UNI
, BER_UNI_TAG_BOOLEAN
, BER_FLAGS_OPTIONAL
|BER_FLAGS_NOOWNTAG
, dissect_ldap_BOOLEAN
},
3521 { NULL
, 0, 0, 0, NULL
}
3525 dissect_ldap_SyncRequestValue(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
3526 offset
= dissect_ber_sequence(implicit_tag
, actx
, tree
, tvb
, offset
,
3527 SyncRequestValue_sequence
, hf_index
, ett_ldap_SyncRequestValue
);
3533 static const value_string ldap_T_state_vals
[] = {
3543 dissect_ldap_T_state(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
3544 offset
= dissect_ber_integer(implicit_tag
, actx
, tree
, tvb
, offset
, hf_index
,
3553 dissect_ldap_SyncUUID(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
3554 offset
= dissect_ber_octet_string(implicit_tag
, actx
, tree
, tvb
, offset
, hf_index
,
3561 static const ber_sequence_t SyncStateValue_sequence
[] = {
3562 { &hf_ldap_state
, BER_CLASS_UNI
, BER_UNI_TAG_ENUMERATED
, BER_FLAGS_NOOWNTAG
, dissect_ldap_T_state
},
3563 { &hf_ldap_entryUUID
, BER_CLASS_UNI
, BER_UNI_TAG_OCTETSTRING
, BER_FLAGS_NOOWNTAG
, dissect_ldap_SyncUUID
},
3564 { &hf_ldap_cookie
, BER_CLASS_UNI
, BER_UNI_TAG_OCTETSTRING
, BER_FLAGS_OPTIONAL
|BER_FLAGS_NOOWNTAG
, dissect_ldap_OCTET_STRING
},
3565 { NULL
, 0, 0, 0, NULL
}
3569 dissect_ldap_SyncStateValue(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
3570 offset
= dissect_ber_sequence(implicit_tag
, actx
, tree
, tvb
, offset
,
3571 SyncStateValue_sequence
, hf_index
, ett_ldap_SyncStateValue
);
3577 static const ber_sequence_t SyncDoneValue_sequence
[] = {
3578 { &hf_ldap_cookie
, BER_CLASS_UNI
, BER_UNI_TAG_OCTETSTRING
, BER_FLAGS_OPTIONAL
|BER_FLAGS_NOOWNTAG
, dissect_ldap_OCTET_STRING
},
3579 { &hf_ldap_refreshDeletes
, BER_CLASS_UNI
, BER_UNI_TAG_BOOLEAN
, BER_FLAGS_OPTIONAL
|BER_FLAGS_NOOWNTAG
, dissect_ldap_BOOLEAN
},
3580 { NULL
, 0, 0, 0, NULL
}
3584 dissect_ldap_SyncDoneValue(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
3585 offset
= dissect_ber_sequence(implicit_tag
, actx
, tree
, tvb
, offset
,
3586 SyncDoneValue_sequence
, hf_index
, ett_ldap_SyncDoneValue
);
3592 static const ber_sequence_t T_refreshDelete_sequence
[] = {
3593 { &hf_ldap_cookie
, BER_CLASS_UNI
, BER_UNI_TAG_OCTETSTRING
, BER_FLAGS_OPTIONAL
|BER_FLAGS_NOOWNTAG
, dissect_ldap_OCTET_STRING
},
3594 { &hf_ldap_refreshDone
, BER_CLASS_UNI
, BER_UNI_TAG_BOOLEAN
, BER_FLAGS_OPTIONAL
|BER_FLAGS_NOOWNTAG
, dissect_ldap_BOOLEAN
},
3595 { NULL
, 0, 0, 0, NULL
}
3599 dissect_ldap_T_refreshDelete(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
3600 offset
= dissect_ber_sequence(implicit_tag
, actx
, tree
, tvb
, offset
,
3601 T_refreshDelete_sequence
, hf_index
, ett_ldap_T_refreshDelete
);
3607 static const ber_sequence_t T_refreshPresent_sequence
[] = {
3608 { &hf_ldap_cookie
, BER_CLASS_UNI
, BER_UNI_TAG_OCTETSTRING
, BER_FLAGS_OPTIONAL
|BER_FLAGS_NOOWNTAG
, dissect_ldap_OCTET_STRING
},
3609 { &hf_ldap_refreshDone
, BER_CLASS_UNI
, BER_UNI_TAG_BOOLEAN
, BER_FLAGS_OPTIONAL
|BER_FLAGS_NOOWNTAG
, dissect_ldap_BOOLEAN
},
3610 { NULL
, 0, 0, 0, NULL
}
3614 dissect_ldap_T_refreshPresent(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
3615 offset
= dissect_ber_sequence(implicit_tag
, actx
, tree
, tvb
, offset
,
3616 T_refreshPresent_sequence
, hf_index
, ett_ldap_T_refreshPresent
);
3622 static const ber_sequence_t SET_OF_SyncUUID_set_of
[1] = {
3623 { &hf_ldap_syncUUIDs_item
, BER_CLASS_UNI
, BER_UNI_TAG_OCTETSTRING
, BER_FLAGS_NOOWNTAG
, dissect_ldap_SyncUUID
},
3627 dissect_ldap_SET_OF_SyncUUID(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
3628 offset
= dissect_ber_set_of(implicit_tag
, actx
, tree
, tvb
, offset
,
3629 SET_OF_SyncUUID_set_of
, hf_index
, ett_ldap_SET_OF_SyncUUID
);
3635 static const ber_sequence_t T_syncIdSet_sequence
[] = {
3636 { &hf_ldap_cookie
, BER_CLASS_UNI
, BER_UNI_TAG_OCTETSTRING
, BER_FLAGS_OPTIONAL
|BER_FLAGS_NOOWNTAG
, dissect_ldap_OCTET_STRING
},
3637 { &hf_ldap_refreshDeletes
, BER_CLASS_UNI
, BER_UNI_TAG_BOOLEAN
, BER_FLAGS_OPTIONAL
|BER_FLAGS_NOOWNTAG
, dissect_ldap_BOOLEAN
},
3638 { &hf_ldap_syncUUIDs
, BER_CLASS_UNI
, BER_UNI_TAG_SET
, BER_FLAGS_NOOWNTAG
, dissect_ldap_SET_OF_SyncUUID
},
3639 { NULL
, 0, 0, 0, NULL
}
3643 dissect_ldap_T_syncIdSet(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
3644 offset
= dissect_ber_sequence(implicit_tag
, actx
, tree
, tvb
, offset
,
3645 T_syncIdSet_sequence
, hf_index
, ett_ldap_T_syncIdSet
);
3651 static const value_string ldap_SyncInfoValue_vals
[] = {
3653 { 1, "refreshDelete" },
3654 { 2, "refreshPresent" },
3659 static const ber_choice_t SyncInfoValue_choice
[] = {
3660 { 0, &hf_ldap_newcookie
, BER_CLASS_CON
, 0, BER_FLAGS_IMPLTAG
, dissect_ldap_OCTET_STRING
},
3661 { 1, &hf_ldap_refreshDelete
, BER_CLASS_CON
, 1, BER_FLAGS_IMPLTAG
, dissect_ldap_T_refreshDelete
},
3662 { 2, &hf_ldap_refreshPresent
, BER_CLASS_CON
, 2, BER_FLAGS_IMPLTAG
, dissect_ldap_T_refreshPresent
},
3663 { 3, &hf_ldap_syncIdSet
, BER_CLASS_CON
, 3, BER_FLAGS_IMPLTAG
, dissect_ldap_T_syncIdSet
},
3664 { 0, NULL
, 0, 0, 0, NULL
}
3668 dissect_ldap_SyncInfoValue(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
3669 offset
= dissect_ber_choice(actx
, tree
, tvb
, offset
,
3670 SyncInfoValue_choice
, hf_index
, ett_ldap_SyncInfoValue
,
3677 static const value_string ldap_T_warning_vals
[] = {
3678 { 0, "timeBeforeExpiration" },
3679 { 1, "graceAuthNsRemaining" },
3683 static const ber_choice_t T_warning_choice
[] = {
3684 { 0, &hf_ldap_timeBeforeExpiration
, BER_CLASS_CON
, 0, BER_FLAGS_IMPLTAG
, dissect_ldap_INTEGER_0_maxInt
},
3685 { 1, &hf_ldap_graceAuthNsRemaining
, BER_CLASS_CON
, 1, BER_FLAGS_IMPLTAG
, dissect_ldap_INTEGER_0_maxInt
},
3686 { 0, NULL
, 0, 0, 0, NULL
}
3690 dissect_ldap_T_warning(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
3691 offset
= dissect_ber_choice(actx
, tree
, tvb
, offset
,
3692 T_warning_choice
, hf_index
, ett_ldap_T_warning
,
3699 static const value_string ldap_T_error_vals
[] = {
3700 { 0, "passwordExpired" },
3701 { 1, "accountLocked" },
3702 { 2, "changeAfterReset" },
3703 { 3, "passwordModNotAllowed" },
3704 { 4, "mustSupplyOldPassword" },
3705 { 5, "insufficientPasswordQuality" },
3706 { 6, "passwordTooShort" },
3707 { 7, "passwordTooYoung" },
3708 { 8, "passwordInHistory" },
3714 dissect_ldap_T_error(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
3715 offset
= dissect_ber_integer(implicit_tag
, actx
, tree
, tvb
, offset
, hf_index
,
3722 static const ber_sequence_t PasswordPolicyResponseValue_sequence
[] = {
3723 { &hf_ldap_warning
, BER_CLASS_CON
, 0, BER_FLAGS_OPTIONAL
|BER_FLAGS_IMPLTAG
, dissect_ldap_T_warning
},
3724 { &hf_ldap_error
, BER_CLASS_CON
, 1, BER_FLAGS_OPTIONAL
|BER_FLAGS_IMPLTAG
, dissect_ldap_T_error
},
3725 { NULL
, 0, 0, 0, NULL
}
3729 dissect_ldap_PasswordPolicyResponseValue(gboolean implicit_tag _U_
, tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
3730 offset
= dissect_ber_sequence(implicit_tag
, actx
, tree
, tvb
, offset
,
3731 PasswordPolicyResponseValue_sequence
, hf_index
, ett_ldap_PasswordPolicyResponseValue
);
3738 static int dissect_SearchControlValue_PDU(tvbuff_t
*tvb _U_
, packet_info
*pinfo _U_
, proto_tree
*tree _U_
, void *data _U_
) {
3740 asn1_ctx_t asn1_ctx
;
3741 asn1_ctx_init(&asn1_ctx
, ASN1_ENC_BER
, TRUE
, pinfo
);
3742 offset
= dissect_ldap_SearchControlValue(FALSE
, tvb
, offset
, &asn1_ctx
, tree
, hf_ldap_SearchControlValue_PDU
);
3745 static int dissect_SortKeyList_PDU(tvbuff_t
*tvb _U_
, packet_info
*pinfo _U_
, proto_tree
*tree _U_
, void *data _U_
) {
3747 asn1_ctx_t asn1_ctx
;
3748 asn1_ctx_init(&asn1_ctx
, ASN1_ENC_BER
, TRUE
, pinfo
);
3749 offset
= dissect_ldap_SortKeyList(FALSE
, tvb
, offset
, &asn1_ctx
, tree
, hf_ldap_SortKeyList_PDU
);
3752 static int dissect_SortResult_PDU(tvbuff_t
*tvb _U_
, packet_info
*pinfo _U_
, proto_tree
*tree _U_
, void *data _U_
) {
3754 asn1_ctx_t asn1_ctx
;
3755 asn1_ctx_init(&asn1_ctx
, ASN1_ENC_BER
, TRUE
, pinfo
);
3756 offset
= dissect_ldap_SortResult(FALSE
, tvb
, offset
, &asn1_ctx
, tree
, hf_ldap_SortResult_PDU
);
3759 static int dissect_DirSyncControlValue_PDU(tvbuff_t
*tvb _U_
, packet_info
*pinfo _U_
, proto_tree
*tree _U_
, void *data _U_
) {
3761 asn1_ctx_t asn1_ctx
;
3762 asn1_ctx_init(&asn1_ctx
, ASN1_ENC_BER
, TRUE
, pinfo
);
3763 offset
= dissect_ldap_DirSyncControlValue(FALSE
, tvb
, offset
, &asn1_ctx
, tree
, hf_ldap_DirSyncControlValue_PDU
);
3766 static int dissect_PasswdModifyRequestValue_PDU(tvbuff_t
*tvb _U_
, packet_info
*pinfo _U_
, proto_tree
*tree _U_
, void *data _U_
) {
3768 asn1_ctx_t asn1_ctx
;
3769 asn1_ctx_init(&asn1_ctx
, ASN1_ENC_BER
, TRUE
, pinfo
);
3770 offset
= dissect_ldap_PasswdModifyRequestValue(FALSE
, tvb
, offset
, &asn1_ctx
, tree
, hf_ldap_PasswdModifyRequestValue_PDU
);
3773 static int dissect_CancelRequestValue_PDU(tvbuff_t
*tvb _U_
, packet_info
*pinfo _U_
, proto_tree
*tree _U_
, void *data _U_
) {
3775 asn1_ctx_t asn1_ctx
;
3776 asn1_ctx_init(&asn1_ctx
, ASN1_ENC_BER
, TRUE
, pinfo
);
3777 offset
= dissect_ldap_CancelRequestValue(FALSE
, tvb
, offset
, &asn1_ctx
, tree
, hf_ldap_CancelRequestValue_PDU
);
3780 static int dissect_SyncRequestValue_PDU(tvbuff_t
*tvb _U_
, packet_info
*pinfo _U_
, proto_tree
*tree _U_
, void *data _U_
) {
3782 asn1_ctx_t asn1_ctx
;
3783 asn1_ctx_init(&asn1_ctx
, ASN1_ENC_BER
, TRUE
, pinfo
);
3784 offset
= dissect_ldap_SyncRequestValue(FALSE
, tvb
, offset
, &asn1_ctx
, tree
, hf_ldap_SyncRequestValue_PDU
);
3787 static int dissect_SyncStateValue_PDU(tvbuff_t
*tvb _U_
, packet_info
*pinfo _U_
, proto_tree
*tree _U_
, void *data _U_
) {
3789 asn1_ctx_t asn1_ctx
;
3790 asn1_ctx_init(&asn1_ctx
, ASN1_ENC_BER
, TRUE
, pinfo
);
3791 offset
= dissect_ldap_SyncStateValue(FALSE
, tvb
, offset
, &asn1_ctx
, tree
, hf_ldap_SyncStateValue_PDU
);
3794 static int dissect_SyncDoneValue_PDU(tvbuff_t
*tvb _U_
, packet_info
*pinfo _U_
, proto_tree
*tree _U_
, void *data _U_
) {
3796 asn1_ctx_t asn1_ctx
;
3797 asn1_ctx_init(&asn1_ctx
, ASN1_ENC_BER
, TRUE
, pinfo
);
3798 offset
= dissect_ldap_SyncDoneValue(FALSE
, tvb
, offset
, &asn1_ctx
, tree
, hf_ldap_SyncDoneValue_PDU
);
3801 static int dissect_SyncInfoValue_PDU(tvbuff_t
*tvb _U_
, packet_info
*pinfo _U_
, proto_tree
*tree _U_
, void *data _U_
) {
3803 asn1_ctx_t asn1_ctx
;
3804 asn1_ctx_init(&asn1_ctx
, ASN1_ENC_BER
, TRUE
, pinfo
);
3805 offset
= dissect_ldap_SyncInfoValue(FALSE
, tvb
, offset
, &asn1_ctx
, tree
, hf_ldap_SyncInfoValue_PDU
);
3808 static int dissect_PasswordPolicyResponseValue_PDU(tvbuff_t
*tvb _U_
, packet_info
*pinfo _U_
, proto_tree
*tree _U_
, void *data _U_
) {
3810 asn1_ctx_t asn1_ctx
;
3811 asn1_ctx_init(&asn1_ctx
, ASN1_ENC_BER
, TRUE
, pinfo
);
3812 offset
= dissect_ldap_PasswordPolicyResponseValue(FALSE
, tvb
, offset
, &asn1_ctx
, tree
, hf_ldap_PasswordPolicyResponseValue_PDU
);
3817 /*--- End of included file: packet-ldap-fn.c ---*/
3818 #line 909 "./asn1/ldap/packet-ldap-template.c"
3819 static int dissect_LDAPMessage_PDU(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*tree
, ldap_conv_info_t
*ldap_info
) {
3822 asn1_ctx_t asn1_ctx
;
3823 asn1_ctx_init(&asn1_ctx
, ASN1_ENC_BER
, TRUE
, pinfo
);
3825 asn1_ctx
.private_data
= ldap_info
;
3826 offset
= dissect_ldap_LDAPMessage(FALSE
, tvb
, offset
, &asn1_ctx
, tree
, hf_ldap_LDAPMessage_PDU
);
3831 dissect_ldap_payload(tvbuff_t
*tvb
, packet_info
*pinfo
,
3832 proto_tree
*tree
, ldap_conv_info_t
*ldap_info
,
3833 gboolean is_mscldap
)
3836 guint length_remaining
;
3838 int messageOffset
= 0;
3839 guint headerLength
= 0;
3841 tvbuff_t
*msg_tvb
= NULL
;
3843 gboolean pc
, ind
= 0;
3846 attributedesc_string
=NULL
;
3851 length_remaining
= tvb_ensure_captured_length_remaining(tvb
, offset
);
3853 if (length_remaining
< 6) return;
3856 * OK, try to read the "Sequence Of" header; this gets the total
3857 * length of the LDAP message.
3859 messageOffset
= get_ber_identifier(tvb
, offset
, &ber_class
, &pc
, &ber_tag
);
3860 messageOffset
= get_ber_length(tvb
, messageOffset
, &msg_len
, &ind
);
3863 if((msg_len
<4) || (msg_len
>10000000)) return;
3865 if ( (ber_class
==BER_CLASS_UNI
) && (ber_tag
==BER_UNI_TAG_SEQUENCE
) ) {
3867 * Add the length of the "Sequence Of" header to the message
3870 headerLength
= messageOffset
- offset
;
3871 msg_len
+= headerLength
;
3872 if (msg_len
< headerLength
) {
3874 * The message length was probably so large that the total length
3877 * Report this as an error.
3879 show_reported_bounds_error(tvb
, pinfo
, tree
);
3884 * We couldn't parse the header; just make it the amount of data
3885 * remaining in the tvbuff, so we'll give up on this segment
3886 * after attempting to parse the message - there's nothing more
3887 * we can do. "dissect_ldap_message()" will display the error.
3889 msg_len
= length_remaining
;
3893 * Construct a tvbuff containing the amount of the payload we have
3894 * available. Make its reported length the amount of data in the
3897 * XXX - if reassembly isn't enabled. the subdissector will throw a
3898 * BoundsError exception, rather than a ReportedBoundsError exception.
3899 * We really want a tvbuff where the length is "length", the reported
3900 * length is "plen", and the "if the snapshot length were infinite"
3901 * length is the minimum of the reported length of the tvbuff handed
3902 * to us and "plen", with a new type of exception thrown if the offset
3903 * is within the reported length but beyond that third length, with
3904 * that exception getting the "Unreassembled Packet" error.
3906 length
= length_remaining
;
3907 if (length
> msg_len
) length
= msg_len
;
3908 msg_tvb
= tvb_new_subset_length_caplen(tvb
, offset
, length
, msg_len
);
3911 * Now dissect the LDAP message.
3913 ldap_info
->is_mscldap
= is_mscldap
;
3914 dissect_LDAPMessage_PDU(msg_tvb
, pinfo
, tree
, ldap_info
);
3918 /* If this was a sasl blob there might be another PDU following in the
3921 if(tvb_reported_length_remaining(tvb
, offset
)>=6){
3922 tvb
= tvb_new_subset_remaining(tvb
, offset
);
3931 ldap_frame_end(void)
3933 ldap_found_in_frame
= FALSE
;
3935 ldapvalue_string
= NULL
;
3937 attributedesc_string
= NULL
;
3938 Filter_string
= NULL
;
3939 and_filter_string
= NULL
;
3940 object_identifier_id
= NULL
;
3941 or_filter_string
= NULL
;
3943 substring_item_any
= NULL
;
3944 substring_item_final
= NULL
;
3945 substring_item_init
= NULL
;
3946 substring_value
= NULL
;
3950 Filter_elements
= 0;
3952 do_protocolop
= FALSE
;
3955 /* seems to be ok, but reset just in case */
3956 matching_rule_string
= NULL
;
3960 dissect_ldap_pdu(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*tree
, gboolean is_mscldap
)
3963 conversation_t
*conversation
;
3964 gboolean doing_sasl_security
= FALSE
;
3965 guint length_remaining
;
3966 ldap_conv_info_t
*ldap_info
= NULL
;
3967 proto_item
*ldap_item
= NULL
;
3968 proto_tree
*ldap_tree
= NULL
;
3972 conversation
= find_or_create_conversation(pinfo
);
3975 * Do we already have a type and mechanism?
3977 ldap_info
= (ldap_conv_info_t
*)conversation_get_proto_data(conversation
, proto_ldap
);
3978 if (ldap_info
== NULL
) {
3979 /* No. Attach that information to the conversation, and add
3980 * it to the list of information structures.
3982 ldap_info
= wmem_new0(wmem_file_scope(), ldap_conv_info_t
);
3983 ldap_info
->matched
=wmem_map_new(wmem_file_scope(), ldap_info_hash_matched
, ldap_info_equal_matched
);
3984 ldap_info
->unmatched
=wmem_map_new(wmem_file_scope(), ldap_info_hash_unmatched
, ldap_info_equal_unmatched
);
3986 conversation_add_proto_data(conversation
, proto_ldap
, ldap_info
);
3989 switch (ldap_info
->auth_type
) {
3990 case LDAP_AUTH_SASL
:
3992 * It's SASL; are we using a security layer?
3994 if (ldap_info
->first_auth_frame
!= 0 &&
3995 pinfo
->num
>= ldap_info
->first_auth_frame
) {
3996 doing_sasl_security
= TRUE
; /* yes */
4000 length_remaining
= tvb_ensure_captured_length_remaining(tvb
, offset
);
4002 /* It might still be a packet containing a SASL security layer
4003 * but it's just that we never saw the BIND packet.
4004 * check if it looks like it could be a SASL blob here
4005 * and in that case just assume it is GSS-SPNEGO
4007 if(!doing_sasl_security
&& (tvb_bytes_exist(tvb
, offset
, 5))
4008 &&(tvb_get_ntohl(tvb
, offset
)<=(guint
)(tvb_reported_length_remaining(tvb
, offset
)-4))
4009 &&(tvb_get_guint8(tvb
, offset
+4)==0x60) ){
4010 ldap_info
->auth_type
=LDAP_AUTH_SASL
;
4011 ldap_info
->first_auth_frame
=pinfo
->num
;
4012 ldap_info
->auth_mech
=wmem_strdup(wmem_file_scope(), "GSS-SPNEGO");
4013 doing_sasl_security
=TRUE
;
4017 * This is the first PDU, set the Protocol column and clear the
4020 col_set_str(pinfo
->cinfo
, COL_PROTOCOL
, pinfo
->current_proto
);
4022 if(ldap_found_in_frame
) {
4023 /* we have already dissected an ldap PDU in this frame - add a separator and set a fence */
4024 col_append_str(pinfo
->cinfo
, COL_INFO
, " | ");
4025 col_set_fence(pinfo
->cinfo
, COL_INFO
);
4027 col_clear(pinfo
->cinfo
, COL_INFO
);
4028 register_frame_end_routine (pinfo
, ldap_frame_end
);
4029 ldap_found_in_frame
= TRUE
;
4032 ldap_item
= proto_tree_add_item(tree
, is_mscldap
?proto_cldap
:proto_ldap
, tvb
, 0, -1, ENC_NA
);
4033 ldap_tree
= proto_item_add_subtree(ldap_item
, ett_ldap
);
4036 * Might we be doing a SASL security layer and, if so, *are* we doing
4039 * Just because we've seen a bind reply for SASL, that doesn't mean
4040 * that we're using a SASL security layer; I've seen captures in
4041 * which some SASL negotiations lead to a security layer being used
4042 * and other negotiations don't, and it's not obvious what's different
4043 * in the two negotiations. Therefore, we assume that if the first
4044 * byte is 0, it's a length for a SASL security layer (that way, we
4045 * never reassemble more than 16 megabytes, protecting us from
4046 * chewing up *too* much memory), and otherwise that it's an LDAP
4047 * message (actually, if it's an LDAP message it should begin with 0x30,
4048 * but we want to parse garbage as LDAP messages rather than really
4052 if (doing_sasl_security
&& tvb_get_guint8(tvb
, offset
) == 0) {
4053 proto_tree
*sasl_tree
;
4055 guint sasl_len
, sasl_msg_len
, length
;
4057 * Yes. The frame begins with a 4-byte big-endian length.
4058 * And we know we have at least 6 bytes
4062 * Get the SASL length, which is the length of data in the buffer
4063 * following the length (i.e., it's 4 less than the total length).
4065 * XXX - do we need to reassemble buffers? For now, we
4066 * assume that each LDAP message is entirely contained within
4069 sasl_len
= tvb_get_ntohl(tvb
, offset
);
4070 sasl_msg_len
= sasl_len
+ 4;
4071 if (sasl_msg_len
< 4) {
4073 * The message length was probably so large that the total length
4076 * Report this as an error.
4078 show_reported_bounds_error(tvb
, pinfo
, tree
);
4083 * Construct a tvbuff containing the amount of the payload we have
4084 * available. Make its reported length the amount of data in the PDU.
4086 * XXX - if reassembly isn't enabled. the subdissector will throw a
4087 * BoundsError exception, rather than a ReportedBoundsError exception.
4088 * We really want a tvbuff where the length is "length", the reported
4089 * length is "plen", and the "if the snapshot length were infinite"
4090 * length is the minimum of the reported length of the tvbuff handed
4091 * to us and "plen", with a new type of exception thrown if the offset
4092 * is within the reported length but beyond that third length, with
4093 * that exception getting the "Unreassembled Packet" error.
4095 length
= length_remaining
;
4096 if (length
> sasl_msg_len
) length
= sasl_msg_len
;
4097 sasl_tvb
= tvb_new_subset_length_caplen(tvb
, offset
, length
, sasl_msg_len
);
4099 proto_tree_add_uint(ldap_tree
, hf_ldap_sasl_buffer_length
, sasl_tvb
, 0, 4, sasl_len
);
4101 sasl_tree
= proto_tree_add_subtree(ldap_tree
, sasl_tvb
, 4, sasl_msg_len
- 4, ett_ldap_sasl_blob
, NULL
, "SASL Buffer");
4103 if (ldap_info
->auth_mech
!= NULL
&&
4104 ((strcmp(ldap_info
->auth_mech
, "GSS-SPNEGO") == 0) ||
4105 /* auth_mech may have been set from the bind */
4106 (strcmp(ldap_info
->auth_mech
, "GSSAPI") == 0))) {
4107 tvbuff_t
*gssapi_tvb
= NULL
;
4110 gssapi_encrypt_info_t gssapi_encrypt
;
4113 * This is GSS-API (using SPNEGO, but we should be done with
4114 * the negotiation by now).
4116 * Dissect the GSS_Wrap() token; it'll return the length of
4117 * the token, from which we compute the offset in the tvbuff at
4118 * which the plaintext data, i.e. the LDAP message, begins.
4120 tmp_length
= tvb_reported_length_remaining(sasl_tvb
, 4);
4121 if ((guint
)tmp_length
> sasl_len
)
4122 tmp_length
= sasl_len
;
4123 gssapi_tvb
= tvb_new_subset_length_caplen(sasl_tvb
, 4, tmp_length
, sasl_len
);
4125 /* Attempt decryption of the GSSAPI wrapped data if possible */
4126 memset(&gssapi_encrypt
, 0, sizeof(gssapi_encrypt
));
4127 gssapi_encrypt
.decrypt_gssapi_tvb
=DECRYPT_GSSAPI_NORMAL
;
4128 ver_len
= call_dissector_with_data(gssapi_wrap_handle
, gssapi_tvb
, pinfo
, sasl_tree
, &gssapi_encrypt
);
4130 * If ver_len is 0, it probably means that we got a PDU that is not
4131 * aligned to the start of the segment.
4136 if (gssapi_encrypt
.gssapi_decrypted_tvb
) {
4137 tvbuff_t
*decr_tvb
= gssapi_encrypt
.gssapi_decrypted_tvb
;
4138 proto_tree
*enc_tree
= NULL
;
4141 * The LDAP payload (blob) was encrypted and we were able to decrypt it.
4142 * The data was signed via a MIC token, sealed (encrypted), and "wrapped"
4143 * within the mechanism's "blob." Call dissect_ldap_payload to dissect
4144 * one or more LDAPMessages such as searchRequest messages within this
4147 col_set_str(pinfo
->cinfo
, COL_INFO
, "SASL GSS-API Privacy (decrypted): ");
4150 guint decr_len
= tvb_reported_length(decr_tvb
);
4152 enc_tree
= proto_tree_add_subtree_format(sasl_tree
, decr_tvb
, 0, -1,
4153 ett_ldap_payload
, NULL
, "GSS-API Encrypted payload (%d byte%s)",
4154 decr_len
, plurality(decr_len
, "", "s"));
4157 dissect_ldap_payload(decr_tvb
, pinfo
, enc_tree
, ldap_info
, is_mscldap
);
4159 else if (gssapi_encrypt
.gssapi_data_encrypted
) {
4161 * The LDAP message was encrypted but couldn't be decrypted so just display the
4162 * encrypted data all of which is found in Packet Bytes.
4164 col_add_fstr(pinfo
->cinfo
, COL_INFO
, "SASL GSS-API Privacy: payload (%d byte%s)",
4165 sasl_len
-ver_len
, plurality(sasl_len
-ver_len
, "", "s"));
4167 proto_tree_add_item(sasl_tree
, hf_ldap_gssapi_encrypted_payload
, gssapi_tvb
, ver_len
, -1, ENC_NA
);
4170 tvbuff_t
*plain_tvb
= tvb_new_subset_remaining(gssapi_tvb
, ver_len
);
4171 proto_tree
*plain_tree
= NULL
;
4174 * The payload was not encrypted (sealed) but was signed via a MIC token.
4175 * If krb5_tok_id == KRB_TOKEN_CFX_WRAP, the payload was wrapped within
4176 * the mechanism's blob. Call dissect_ldap_payload to dissect one or more
4177 * LDAPMessages within the payload.
4179 col_set_str(pinfo
->cinfo
, COL_INFO
, "SASL GSS-API Integrity: ");
4182 guint plain_len
= tvb_reported_length(plain_tvb
);
4184 plain_tree
= proto_tree_add_subtree_format(sasl_tree
, plain_tvb
, 0, -1,
4185 ett_ldap_payload
, NULL
, "GSS-API payload (%d byte%s)",
4186 plain_len
, plurality(plain_len
, "", "s"));
4189 dissect_ldap_payload(plain_tvb
, pinfo
, plain_tree
, ldap_info
, is_mscldap
);
4194 * The LDAP packet does not contain a SASL security layer. Such messages are typically sent
4195 * prior to the LDAP "bind" negotiation exchange which establishes the "context" of the session.
4196 * This means the data could neither be "signed" (no data origin auth or data integrity
4197 * check) nor "sealed" (encrypted).
4199 dissect_ldap_payload(tvb
, pinfo
, ldap_tree
, ldap_info
, is_mscldap
);
4204 * prepend_dot is no longer used, but is being left in place in order to
4205 * maintain ABI compatibility.
4207 int dissect_mscldap_string(tvbuff_t
*tvb
, int offset
, char *str
, int max_len
, gboolean prepend_dot _U_
)
4213 /* The name data MUST start at offset 0 of the tvb */
4214 compr_len
= get_dns_name(tvb
, offset
, max_len
, 0, &name
, &name_len
);
4215 g_strlcpy(str
, name
, max_len
);
4216 return offset
+ compr_len
;
4220 /* These are the cldap DC flags
4221 http://msdn.microsoft.com/en-us/library/cc201036.aspx
4223 static const true_false_string tfs_ads_pdc
= {
4227 static const true_false_string tfs_ads_gc
= {
4228 "This is a GLOBAL CATALOGUE of forest",
4229 "This is NOT a global catalog of forest"
4231 static const true_false_string tfs_ads_ldap
= {
4232 "This is an LDAP server",
4233 "This is NOT an ldap server"
4235 static const true_false_string tfs_ads_ds
= {
4236 "This dc supports DS",
4237 "This dc does NOT support ds"
4239 static const true_false_string tfs_ads_kdc
= {
4240 "This is a KDC (kerberos)",
4241 "This is NOT a kdc (kerberos)"
4243 static const true_false_string tfs_ads_timeserv
= {
4244 "This dc is running TIME SERVICES (ntp)",
4245 "This dc is NOT running time services (ntp)"
4247 static const true_false_string tfs_ads_closest
= {
4248 "This server is in the same site as the client",
4249 "This server is NOT in the same site as the client"
4251 static const true_false_string tfs_ads_writable
= {
4252 "This dc is WRITABLE",
4253 "This dc is NOT writable"
4255 static const true_false_string tfs_ads_good_timeserv
= {
4256 "This dc has a GOOD TIME SERVICE (i.e. hardware clock)",
4257 "This dc does NOT have a good time service (i.e. no hardware clock)"
4259 static const true_false_string tfs_ads_ndnc
= {
4260 "Domain is NON-DOMAIN NC serviced by ldap server",
4261 "Domain is NOT non-domain nc serviced by ldap server"
4263 static const true_false_string tfs_ads_rodc
= {
4264 "Domain controller is a Windows 2008 RODC",
4265 "Domain controller is not a Windows 2008 RODC"
4267 static const true_false_string tfs_ads_wdc
= {
4268 "Domain controller is a Windows 2008 writable NC",
4269 "Domain controller is not a Windows 2008 writable NC"
4271 static const true_false_string tfs_ads_dns
= {
4272 "Server name is in DNS format (Windows 2008)",
4273 "Server name is not in DNS format (Windows 2008)"
4275 static const true_false_string tfs_ads_dnc
= {
4276 "The NC is the default NC (Windows 2008)",
4277 "The NC is not the default NC (Windows 2008)"
4279 static const true_false_string tfs_ads_fnc
= {
4280 "The NC is the default forest NC(Windows 2008)",
4281 "The NC is not the default forest NC (Windows 2008)"
4283 static int dissect_mscldap_netlogon_flags(proto_tree
*parent_tree
, tvbuff_t
*tvb
, int offset
)
4285 static int * const flags
[] = {
4286 &hf_mscldap_netlogon_flags_fnc
,
4287 &hf_mscldap_netlogon_flags_dnc
,
4288 &hf_mscldap_netlogon_flags_dns
,
4289 &hf_mscldap_netlogon_flags_wdc
,
4290 &hf_mscldap_netlogon_flags_rodc
,
4291 &hf_mscldap_netlogon_flags_ndnc
,
4292 &hf_mscldap_netlogon_flags_good_timeserv
,
4293 &hf_mscldap_netlogon_flags_writable
,
4294 &hf_mscldap_netlogon_flags_closest
,
4295 &hf_mscldap_netlogon_flags_timeserv
,
4296 &hf_mscldap_netlogon_flags_kdc
,
4297 &hf_mscldap_netlogon_flags_ds
,
4298 &hf_mscldap_netlogon_flags_ldap
,
4299 &hf_mscldap_netlogon_flags_gc
,
4300 &hf_mscldap_netlogon_flags_pdc
,
4304 proto_tree_add_bitmask_with_flags(parent_tree
, tvb
, offset
, hf_mscldap_netlogon_flags
,
4305 ett_mscldap_netlogon_flags
, flags
, ENC_LITTLE_ENDIAN
, BMT_NO_FALSE
);
4311 static int dissect_NetLogon_PDU(tvbuff_t
*tvb
, packet_info
*pinfo _U_
, proto_tree
*tree
, void* data _U_
)
4313 int old_offset
, offset
=0;
4324 /* Get the length of the buffer */
4325 len
=tvb_reported_length_remaining(tvb
,offset
);
4327 /* check the len if it is to small return */
4329 return tvb_captured_length(tvb
);
4332 proto_tree_add_item(tree
, hf_mscldap_netlogon_opcode
, tvb
, offset
, 2, ENC_LITTLE_ENDIAN
);
4333 itype
= tvb_get_letohs(tvb
, offset
);
4338 case LOGON_SAM_LOGON_RESPONSE
:
4339 /* logon server name; must be aligned on a 2-byte boundary */
4340 if ((offset
& 1) != 0) {
4343 proto_tree_add_item_ret_length(tree
, hf_mscldap_nb_hostname_z
, tvb
,offset
, -1, ENC_UTF_16
|ENC_LITTLE_ENDIAN
, &fn_len
);
4346 /* username; must be aligned on a 2-byte boundary */
4347 if ((offset
& 1) != 0) {
4350 proto_tree_add_item_ret_length(tree
, hf_mscldap_username_z
, tvb
,offset
, -1, ENC_UTF_16
|ENC_LITTLE_ENDIAN
, &fn_len
);
4353 /* domain name; must be aligned on a 2-byte boundary */
4354 if ((offset
& 1) != 0) {
4357 proto_tree_add_item_ret_length(tree
, hf_mscldap_nb_domain_z
, tvb
,offset
, -1, ENC_UTF_16
|ENC_LITTLE_ENDIAN
, &fn_len
);
4360 /* get the version number from the end of the buffer, as the
4361 length is variable and the version determines what fields
4362 need to be decoded */
4363 version
= tvb_get_letohl(tvb
,len
-8);
4365 /* include the extra version 5 fields */
4366 if ((version
& NETLOGON_NT_VERSION_5
) == NETLOGON_NT_VERSION_5
){
4369 proto_tree_add_item(tree
, hf_mscldap_domain_guid
, tvb
, offset
, 16, ENC_LITTLE_ENDIAN
);
4372 /* domain guid part 2
4373 there is another 16 byte guid but this is alway zero, so we will skip it */
4378 offset
=dissect_mscldap_string(tvb
, offset
, str
, 255, FALSE
);
4379 proto_tree_add_string(tree
, hf_mscldap_forest
, tvb
, old_offset
, offset
-old_offset
, str
);
4383 offset
=dissect_mscldap_string(tvb
, offset
, str
, 255, FALSE
);
4384 proto_tree_add_string(tree
, hf_mscldap_domain
, tvb
, old_offset
, offset
-old_offset
, str
);
4388 offset
=dissect_mscldap_string(tvb
, offset
, str
, 255, FALSE
);
4389 proto_tree_add_string(tree
, hf_mscldap_hostname
, tvb
, old_offset
, offset
-old_offset
, str
);
4392 proto_tree_add_item(tree
, hf_mscldap_netlogon_ipaddress
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
4396 dissect_mscldap_netlogon_flags(tree
, tvb
, offset
);
4401 case LOGON_SAM_LOGON_RESPONSE_EX
:
4402 /* MS-ADTS 6.3.1.9 */
4403 offset
+= 2; /* Skip over "Sbz" field (MUST be set to 0) */
4406 offset
= dissect_mscldap_netlogon_flags(tree
, tvb
, offset
);
4409 proto_tree_add_item(tree
, hf_mscldap_domain_guid
, tvb
, offset
, 16, ENC_LITTLE_ENDIAN
);
4414 offset
=dissect_mscldap_string(tvb
, offset
, str
, 255, FALSE
);
4415 proto_tree_add_string(tree
, hf_mscldap_forest
, tvb
, old_offset
, offset
-old_offset
, str
);
4419 offset
=dissect_mscldap_string(tvb
, offset
, str
, 255, FALSE
);
4420 proto_tree_add_string(tree
, hf_mscldap_domain
, tvb
, old_offset
, offset
-old_offset
, str
);
4424 offset
=dissect_mscldap_string(tvb
, offset
, str
, 255, FALSE
);
4425 proto_tree_add_string(tree
, hf_mscldap_hostname
, tvb
, old_offset
, offset
-old_offset
, str
);
4427 /* NetBIOS Domain */
4429 offset
=dissect_mscldap_string(tvb
, offset
, str
, 255, FALSE
);
4430 proto_tree_add_string(tree
, hf_mscldap_nb_domain
, tvb
, old_offset
, offset
-old_offset
, str
);
4432 /* NetBIOS Hostname */
4434 offset
=dissect_mscldap_string(tvb
, offset
, str
, 255, FALSE
);
4435 proto_tree_add_string(tree
, hf_mscldap_nb_hostname
, tvb
, old_offset
, offset
-old_offset
, str
);
4439 offset
=dissect_mscldap_string(tvb
, offset
, str
, 255, FALSE
);
4440 proto_tree_add_string(tree
, hf_mscldap_username
, tvb
, old_offset
, offset
-old_offset
, str
);
4444 offset
=dissect_mscldap_string(tvb
, offset
, str
, 255, FALSE
);
4445 proto_tree_add_string(tree
, hf_mscldap_sitename
, tvb
, old_offset
, offset
-old_offset
, str
);
4449 offset
=dissect_mscldap_string(tvb
, offset
, str
, 255, FALSE
);
4450 proto_tree_add_string(tree
, hf_mscldap_clientsitename
, tvb
, old_offset
, offset
-old_offset
, str
);
4452 /* get the version number from the end of the buffer, as the
4453 length is variable and the version determines what fields
4454 need to be decoded */
4455 version
= tvb_get_letohl(tvb
,len
-8);
4457 /* include the extra fields for version 5 with IP s */
4458 if ((version
& NETLOGON_NT_VERSION_5EX_WITH_IP
) == NETLOGON_NT_VERSION_5EX_WITH_IP
){
4459 /* The ip address is returned as a sockaddr_in structure
4461 * This section may need to be updated if the base Windows APIs
4462 * are changed to support ipv6, which currently is not the case.
4464 * The desector assumes the length is based on ipv4 and
4465 * ignores the length
4468 /* skip the length of the sockaddr_in */
4472 /* add IP address and desect the sockaddr_in structure */
4474 old_offset
= offset
+ 4;
4475 item
= proto_tree_add_item(tree
, hf_mscldap_netlogon_ipaddress
, tvb
, old_offset
, 4, ENC_BIG_ENDIAN
);
4478 proto_tree
*subtree
;
4480 subtree
= proto_item_add_subtree(item
, ett_mscldap_ipdetails
);
4482 /* get sockaddr family */
4483 proto_tree_add_item(subtree
, hf_mscldap_netlogon_ipaddress_family
, tvb
, offset
, 2, ENC_LITTLE_ENDIAN
);
4486 /* get sockaddr port */
4487 proto_tree_add_item(subtree
, hf_mscldap_netlogon_ipaddress_port
, tvb
, offset
, 2, ENC_LITTLE_ENDIAN
);
4490 /* get IP address */
4491 proto_tree_add_item(subtree
, hf_mscldap_netlogon_ipaddress_ipv4
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
4500 /* complete the decode with the version and token details */
4504 /* NETLOGON_NT_VERISON Options (MS-ADTS 6.3.1.1) */
4505 offset
= dissect_mscldap_ntver_flags(tree
, tvb
, offset
);
4508 proto_tree_add_item(tree
, hf_mscldap_netlogon_lm_token
, tvb
, offset
, 2, ENC_LITTLE_ENDIAN
);
4512 proto_tree_add_item(tree
, hf_mscldap_netlogon_nt_token
, tvb
, offset
, 2, ENC_LITTLE_ENDIAN
);
4514 return tvb_captured_length(tvb
);
4519 get_sasl_ldap_pdu_len(packet_info
*pinfo _U_
, tvbuff_t
*tvb
,
4520 int offset
, void *data _U_
)
4522 /* sasl encapsulated ldap is 4 bytes plus the length in size */
4523 return tvb_get_ntohl(tvb
, offset
)+4;
4527 dissect_sasl_ldap_pdu(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*tree
, void* data _U_
)
4529 dissect_ldap_pdu(tvb
, pinfo
, tree
, FALSE
);
4530 return tvb_captured_length(tvb
);
4534 get_normal_ldap_pdu_len(packet_info
*pinfo _U_
, tvbuff_t
*tvb
,
4535 int offset
, void *data _U_
)
4541 /* normal ldap is tag+len bytes plus the length
4542 * offset is where the tag is
4543 * offset+1 is where length starts
4545 data_offset
=get_ber_length(tvb
, offset
+1, &len
, &ind
);
4546 return len
+data_offset
-offset
;
4550 dissect_normal_ldap_pdu(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*tree
, void* data _U_
)
4552 dissect_ldap_pdu(tvb
, pinfo
, tree
, FALSE
);
4553 return tvb_captured_length(tvb
);
4557 dissect_ldap_oid(tvbuff_t
*tvb
, packet_info
*pinfo _U_
, proto_tree
*tree
, void* data _U_
)
4560 const char *oidname
;
4562 /* tvb here contains an ascii string that is really an oid */
4563 /* XXX we should convert the string oid into a real oid so we can use
4564 * proto_tree_add_oid() instead.
4567 oid
=tvb_get_string_enc(wmem_packet_scope(), tvb
, 0, tvb_reported_length(tvb
), ENC_UTF_8
|ENC_NA
);
4569 return tvb_captured_length(tvb
);
4572 oidname
=oid_resolved_from_string(wmem_packet_scope(), oid
);
4575 proto_tree_add_string_format_value(tree
, hf_ldap_oid
, tvb
, 0, tvb_reported_length(tvb
), oid
, "%s (%s)",oid
,oidname
);
4577 proto_tree_add_string(tree
, hf_ldap_oid
, tvb
, 0, tvb_captured_length(tvb
), oid
);
4579 return tvb_captured_length(tvb
);
4582 #define LDAP_ACCESSMASK_ADS_CREATE_CHILD 0x00000001
4583 #define LDAP_ACCESSMASK_ADS_DELETE_CHILD 0x00000002
4584 #define LDAP_ACCESSMASK_ADS_LIST 0x00000004
4585 #define LDAP_ACCESSMASK_ADS_SELF_WRITE 0x00000008
4586 #define LDAP_ACCESSMASK_ADS_READ_PROP 0x00000010
4587 #define LDAP_ACCESSMASK_ADS_WRITE_PROP 0x00000020
4588 #define LDAP_ACCESSMASK_ADS_DELETE_TREE 0x00000040
4589 #define LDAP_ACCESSMASK_ADS_LIST_OBJECT 0x00000080
4590 #define LDAP_ACCESSMASK_ADS_CONTROL_ACCESS 0x00000100
4593 ldap_specific_rights(tvbuff_t
*tvb
, gint offset
, proto_tree
*tree
, guint32 access
)
4595 static int * const access_flags
[] = {
4596 &hf_ldap_AccessMask_ADS_CONTROL_ACCESS
,
4597 &hf_ldap_AccessMask_ADS_LIST_OBJECT
,
4598 &hf_ldap_AccessMask_ADS_DELETE_TREE
,
4599 &hf_ldap_AccessMask_ADS_WRITE_PROP
,
4600 &hf_ldap_AccessMask_ADS_READ_PROP
,
4601 &hf_ldap_AccessMask_ADS_SELF_WRITE
,
4602 &hf_ldap_AccessMask_ADS_LIST
,
4603 &hf_ldap_AccessMask_ADS_DELETE_CHILD
,
4604 &hf_ldap_AccessMask_ADS_CREATE_CHILD
,
4608 proto_tree_add_bitmask_list_value(tree
, tvb
, offset
, 4, access_flags
, access
);
4610 struct access_mask_info ldap_access_mask_info
= {
4611 "LDAP", /* Name of specific rights */
4612 ldap_specific_rights
, /* Dissection function */
4613 NULL
, /* Generic mapping table */
4614 NULL
/* Standard mapping table */
4618 dissect_ldap_nt_sec_desc(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*tree
, void* data _U_
)
4620 dissect_nt_sec_desc(tvb
, 0, pinfo
, tree
, NULL
, TRUE
, tvb_reported_length(tvb
), &ldap_access_mask_info
);
4621 return tvb_captured_length(tvb
);
4625 dissect_ldap_sid(tvbuff_t
*tvb
, packet_info
*pinfo _U_
, proto_tree
*tree
, void* data _U_
)
4629 /* this octet string contains an NT SID */
4630 dissect_nt_sid(tvb
, 0, tree
, "SID", &tmpstr
, hf_ldap_sid
);
4631 ldapvalue_string
=tmpstr
;
4632 return tvb_captured_length(tvb
);
4636 dissect_ldap_guid(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*tree
, void* data _U_
)
4638 guint8 drep
[4] = { 0x10, 0x00, 0x00, 0x00}; /* fake DREP struct */
4641 /* This octet string contained a GUID */
4642 dissect_dcerpc_uuid_t(tvb
, 0, pinfo
, tree
, drep
, hf_ldap_guid
, &uuid
);
4644 ldapvalue_string
=(char*)wmem_alloc(wmem_packet_scope(), 1024);
4645 g_snprintf(ldapvalue_string
, 1023, "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
4646 uuid
.data1
, uuid
.data2
, uuid
.data3
, uuid
.data4
[0], uuid
.data4
[1],
4647 uuid
.data4
[2], uuid
.data4
[3], uuid
.data4
[4], uuid
.data4
[5],
4648 uuid
.data4
[6], uuid
.data4
[7]);
4649 return tvb_captured_length(tvb
);
4653 dissect_ldap_tcp(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*tree
, void* data
)
4658 conversation_t
*conversation
;
4659 ldap_conv_info_t
*ldap_info
= NULL
;
4662 * Do we have a conversation for this connection?
4664 conversation
= find_conversation_pinfo(pinfo
, 0);
4666 ldap_info
= (ldap_conv_info_t
*)conversation_get_proto_data(conversation
, proto_ldap
);
4671 /* This is a bit tricky. We have to find out whether SASL is used
4672 * so that we know how big a header we are supposed to pass
4673 * to tcp_dissect_pdus()
4674 * We must also cope with the case when a client connects to LDAP
4675 * and performs a few unauthenticated searches of LDAP before
4676 * it performs the bind on the same tcp connection.
4678 /* check for a SASL header, i.e. assume it is SASL if
4679 * 1, first four bytes (SASL length) is an integer
4680 * with a value that must be <LDAP_SASL_MAX_BUF and >2
4681 * (>2 to fight false positives, 0x00000000 is a common
4682 * "random" tcp payload)
4683 * (SASL ldap PDUs might be >64k in size, which is why
4684 * LDAP_SASL_MAX_BUF is used - defined in packet-ldap.h)
4686 * 2, we must have a conversation and the auth type must
4689 sasl_len
=tvb_get_ntohl(tvb
, 0);
4692 goto this_was_not_sasl
;
4695 if( sasl_len
>LDAP_SASL_MAX_BUF
){
4696 goto this_was_not_sasl
;
4699 if((!ldap_info
) || (ldap_info
->auth_type
!=LDAP_AUTH_SASL
) ){
4700 goto this_was_not_sasl
;
4703 tcp_dissect_pdus(tvb
, pinfo
, tree
, ldap_desegment
, 4, get_sasl_ldap_pdu_len
, dissect_sasl_ldap_pdu
, data
);
4704 return tvb_captured_length(tvb
);
4707 /* check if it is a normal BER encoded LDAP packet
4708 * i.e. first byte is 0x30 followed by a length that is
4710 * (no ldap PDUs are ever >64kb? )
4712 if(tvb_get_guint8(tvb
, 0)!=0x30){
4713 goto this_was_not_normal_ldap
;
4716 /* check that length makes sense */
4717 get_ber_length(tvb
, 1, &ldap_len
, &ind
);
4719 /* don't check ind since indefinite length is never used for ldap (famous last words)*/
4721 goto this_was_not_normal_ldap
;
4725 * The minimum size of a LDAP pdu is 7 bytes
4727 * dumpasn1 -hh ldap-unbind-min.dat
4729 * <30 05 02 01 09 42 00>
4734 * 5 0: [APPLICATION 2]
4735 * : Error: Object has zero length.
4738 * dumpasn1 -hh ldap-unbind-windows.dat
4740 * <30 84 00 00 00 05 02 01 09 42 00>
4745 * 9 0: [APPLICATION 2]
4746 * : Error: Object has zero length.
4749 * 6 bytes would also be ok to get the full length of
4750 * the pdu, but as the smallest pdu can be 7 bytes
4753 tcp_dissect_pdus(tvb
, pinfo
, tree
, ldap_desegment
, 7, get_normal_ldap_pdu_len
, dissect_normal_ldap_pdu
, data
);
4757 this_was_not_normal_ldap
:
4759 /* Ok it might be a strange case of SASL still
4760 * It has been seen with Exchange setup to MS AD
4761 * when Exchange pretend that there is SASL but in fact data are still
4763 if ((sasl_len
+ 4) == (guint32
)tvb_reported_length_remaining(tvb
, 0))
4764 tcp_dissect_pdus(tvb
, pinfo
, tree
, ldap_desegment
, 4, get_sasl_ldap_pdu_len
, dissect_sasl_ldap_pdu
, data
);
4766 return tvb_captured_length(tvb
);
4770 dissect_mscldap(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*tree
, void* data _U_
)
4772 dissect_ldap_pdu(tvb
, pinfo
, tree
, TRUE
);
4773 return tvb_captured_length(tvb
);
4777 /*--- proto_register_ldap -------------------------------------------*/
4778 void proto_register_ldap(void) {
4780 /* List of fields */
4782 static hf_register_info hf
[] = {
4784 { &hf_ldap_sasl_buffer_length
,
4785 { "SASL Buffer Length", "ldap.sasl_buffer_length",
4786 FT_UINT32
, BASE_DEC
, NULL
, 0x0,
4788 { &hf_ldap_response_in
,
4789 { "Response In", "ldap.response_in",
4790 FT_FRAMENUM
, BASE_NONE
, NULL
, 0x0,
4791 "The response to this LDAP request is in this frame", HFILL
}},
4792 { &hf_ldap_response_to
,
4793 { "Response To", "ldap.response_to",
4794 FT_FRAMENUM
, BASE_NONE
, NULL
, 0x0,
4795 "This is a response to the LDAP request in this frame", HFILL
}},
4797 { "Time", "ldap.time",
4798 FT_RELATIVE_TIME
, BASE_NONE
, NULL
, 0x0,
4799 "The time between the Call and the Reply", HFILL
}},
4801 { &hf_mscldap_netlogon_opcode
,
4802 { "Operation code", "mscldap.netlogon.opcode",
4803 FT_UINT16
, BASE_DEC
, VALS(netlogon_opcode_vals
), 0x0,
4804 "LDAP ping operation code", HFILL
}},
4806 { &hf_mscldap_netlogon_ipaddress_family
,
4807 { "Family", "mscldap.netlogon.ipaddress.family",
4808 FT_UINT16
, BASE_DEC
, NULL
, 0x0,
4811 { &hf_mscldap_netlogon_ipaddress_ipv4
,
4812 { "IPv4", "mscldap.netlogon.ipaddress.ipv4",
4813 FT_IPv4
, BASE_NONE
, NULL
, 0x0,
4814 "IP Address", HFILL
}},
4816 { &hf_mscldap_netlogon_ipaddress_port
,
4817 { "Port", "mscldap.netlogon.ipaddress.port",
4818 FT_UINT16
, BASE_DEC
, NULL
, 0x0,
4821 { &hf_mscldap_netlogon_ipaddress
,
4822 { "IP Address","mscldap.netlogon.ipaddress",
4823 FT_IPv4
, BASE_NONE
, NULL
, 0x0,
4824 "Domain Controller IP Address", HFILL
}},
4826 { &hf_mscldap_netlogon_lm_token
,
4827 { "LM Token", "mscldap.netlogon.lm_token",
4828 FT_UINT16
, BASE_HEX
, NULL
, 0x0,
4829 "MUST be set to 0xFFFF", HFILL
}},
4831 { &hf_mscldap_netlogon_nt_token
,
4832 { "NT Token", "mscldap.netlogon.nt_token",
4833 FT_UINT16
, BASE_HEX
, NULL
, 0x0,
4834 "MUST be set to 0xFFFF", HFILL
}},
4836 { &hf_mscldap_netlogon_flags
,
4837 { "Flags", "mscldap.netlogon.flags",
4838 FT_UINT32
, BASE_HEX
, NULL
, 0x0,
4839 "Netlogon flags describing the DC properties", HFILL
}},
4841 { &hf_mscldap_ntver_flags
,
4842 { "Version Flags", "mscldap.ntver.flags",
4843 FT_UINT32
, BASE_HEX
, NULL
, 0x0,
4844 "NETLOGON_NT_VERSION Options Bits", HFILL
}},
4846 { &hf_mscldap_domain_guid
,
4847 { "Domain GUID", "mscldap.domain.guid",
4848 FT_GUID
, BASE_NONE
, NULL
, 0x0,
4849 "Value of the NC's GUID attribute", HFILL
}},
4851 { &hf_mscldap_forest
,
4852 { "Forest", "mscldap.forest",
4853 FT_STRING
, BASE_NONE
, NULL
, 0x0,
4854 "DNS name of the forest", HFILL
}},
4856 { &hf_mscldap_domain
,
4857 { "Domain", "mscldap.domain",
4858 FT_STRING
, BASE_NONE
, NULL
, 0x0,
4859 "DNS name of the NC", HFILL
}},
4861 { &hf_mscldap_hostname
,
4862 { "Hostname", "mscldap.hostname",
4863 FT_STRING
, BASE_NONE
, NULL
, 0x0,
4864 "DNS name of server", HFILL
}},
4866 { &hf_mscldap_nb_domain_z
,
4867 { "NetBIOS Domain", "mscldap.nb_domain",
4868 FT_STRINGZ
, BASE_NONE
, NULL
, 0x0,
4869 "NetBIOS name of the NC", HFILL
}},
4871 { &hf_mscldap_nb_domain
,
4872 { "NetBIOS Domain", "mscldap.nb_domain",
4873 FT_STRING
, BASE_NONE
, NULL
, 0x0,
4874 "NetBIOS name of the NC", HFILL
}},
4876 { &hf_mscldap_nb_hostname_z
,
4877 { "NetBIOS Hostname", "mscldap.nb_hostname",
4878 FT_STRINGZ
, BASE_NONE
, NULL
, 0x0,
4879 "NetBIOS name of the server", HFILL
}},
4881 { &hf_mscldap_nb_hostname
,
4882 { "NetBIOS Hostname", "mscldap.nb_hostname",
4883 FT_STRING
, BASE_NONE
, NULL
, 0x0,
4884 "NetBIOS name of the server", HFILL
}},
4886 { &hf_mscldap_username_z
,
4887 { "Username", "mscldap.username",
4888 FT_STRINGZ
, BASE_NONE
, NULL
, 0x0,
4889 "User specified in client's request", HFILL
}},
4891 { &hf_mscldap_username
,
4892 { "Username", "mscldap.username",
4893 FT_STRING
, BASE_NONE
, NULL
, 0x0,
4894 "User specified in client's request", HFILL
}},
4896 { &hf_mscldap_sitename
,
4897 { "Server Site", "mscldap.sitename",
4898 FT_STRING
, BASE_NONE
, NULL
, 0x0,
4899 "Site name of the server", HFILL
}},
4901 { &hf_mscldap_clientsitename
,
4902 { "Client Site", "mscldap.clientsitename",
4903 FT_STRING
, BASE_NONE
, NULL
, 0x0,
4904 "Site name of the client", HFILL
}},
4907 { "Sid", "ldap.sid",
4908 FT_STRING
, BASE_NONE
, NULL
, 0x0,
4911 { &hf_mscldap_ntver_flags_v1
,
4912 { "V1", "mscldap.ntver.searchflags.v1", FT_BOOLEAN
, 32,
4913 TFS(&tfs_ntver_v1
), 0x00000001, "See section 6.3.1.1 of MS-ADTS specification", HFILL
}},
4915 { &hf_mscldap_ntver_flags_v5
,
4916 { "V5", "mscldap.ntver.searchflags.v5", FT_BOOLEAN
, 32,
4917 TFS(&tfs_ntver_v5
), 0x00000002, "See section 6.3.1.1 of MS-ADTS specification", HFILL
}},
4919 { &hf_mscldap_ntver_flags_v5ex
,
4920 { "V5EX", "mscldap.ntver.searchflags.v5ex", FT_BOOLEAN
, 32,
4921 TFS(&tfs_ntver_v5ex
), 0x00000004, "See section 6.3.1.1 of MS-ADTS specification", HFILL
}},
4923 { &hf_mscldap_ntver_flags_v5ep
,
4924 { "V5EP", "mscldap.ntver.searchflags.v5ep", FT_BOOLEAN
, 32,
4925 TFS(&tfs_ntver_v5ep
), 0x00000008, "See section 6.3.1.1 of MS-ADTS specification", HFILL
}},
4927 { &hf_mscldap_ntver_flags_vcs
,
4928 { "VCS", "mscldap.ntver.searchflags.vcs", FT_BOOLEAN
, 32,
4929 TFS(&tfs_ntver_vcs
), 0x00000010, "See section 6.3.1.1 of MS-ADTS specification", HFILL
}},
4931 { &hf_mscldap_ntver_flags_vnt4
,
4932 { "VNT4", "mscldap.ntver.searchflags.vnt4", FT_BOOLEAN
, 32,
4933 TFS(&tfs_ntver_vnt4
), 0x01000000, "See section 6.3.1.1 of MS-ADTS specification", HFILL
}},
4935 { &hf_mscldap_ntver_flags_vpdc
,
4936 { "VPDC", "mscldap.ntver.searchflags.vpdc", FT_BOOLEAN
, 32,
4937 TFS(&tfs_ntver_vpdc
), 0x10000000, "See section 6.3.1.1 of MS-ADTS specification", HFILL
}},
4939 { &hf_mscldap_ntver_flags_vip
,
4940 { "VIP", "mscldap.ntver.searchflags.vip", FT_BOOLEAN
, 32,
4941 TFS(&tfs_ntver_vip
), 0x20000000, "See section 6.3.1.1 of MS-ADTS specification", HFILL
}},
4943 { &hf_mscldap_ntver_flags_vl
,
4944 { "VL", "mscldap.ntver.searchflags.vl", FT_BOOLEAN
, 32,
4945 TFS(&tfs_ntver_vl
), 0x40000000, "See section 6.3.1.1 of MS-ADTS specification", HFILL
}},
4947 { &hf_mscldap_ntver_flags_vgc
,
4948 { "VGC", "mscldap.ntver.searchflags.vgc", FT_BOOLEAN
, 32,
4949 TFS(&tfs_ntver_vgc
), 0x80000000, "See section 6.3.1.1 of MS-ADTS specification", HFILL
}},
4952 { &hf_mscldap_netlogon_flags_pdc
,
4953 { "PDC", "mscldap.netlogon.flags.pdc", FT_BOOLEAN
, 32,
4954 TFS(&tfs_ads_pdc
), 0x00000001, "Is this DC a PDC or not?", HFILL
}},
4956 { &hf_mscldap_netlogon_flags_gc
,
4957 { "GC", "mscldap.netlogon.flags.gc", FT_BOOLEAN
, 32,
4958 TFS(&tfs_ads_gc
), 0x00000004, "Does this dc service as a GLOBAL CATALOGUE?", HFILL
}},
4960 { &hf_mscldap_netlogon_flags_ldap
,
4961 { "LDAP", "mscldap.netlogon.flags.ldap", FT_BOOLEAN
, 32,
4962 TFS(&tfs_ads_ldap
), 0x00000008, "Does this DC act as an LDAP server?", HFILL
}},
4964 { &hf_mscldap_netlogon_flags_ds
,
4965 { "DS", "mscldap.netlogon.flags.ds", FT_BOOLEAN
, 32,
4966 TFS(&tfs_ads_ds
), 0x00000010, "Does this dc provide DS services?", HFILL
}},
4968 { &hf_mscldap_netlogon_flags_kdc
,
4969 { "KDC", "mscldap.netlogon.flags.kdc", FT_BOOLEAN
, 32,
4970 TFS(&tfs_ads_kdc
), 0x00000020, "Does this dc act as a KDC?", HFILL
}},
4972 { &hf_mscldap_netlogon_flags_timeserv
,
4973 { "Time Serv", "mscldap.netlogon.flags.timeserv", FT_BOOLEAN
, 32,
4974 TFS(&tfs_ads_timeserv
), 0x00000040, "Does this dc provide time services (ntp) ?", HFILL
}},
4976 { &hf_mscldap_netlogon_flags_closest
,
4977 { "Closest", "mscldap.netlogon.flags.closest", FT_BOOLEAN
, 32,
4978 TFS(&tfs_ads_closest
), 0x00000080, "Is this the closest dc?", HFILL
}},
4980 { &hf_mscldap_netlogon_flags_writable
,
4981 { "Writable", "mscldap.netlogon.flags.writable", FT_BOOLEAN
, 32,
4982 TFS(&tfs_ads_writable
), 0x00000100, "Is this dc writable?", HFILL
}},
4984 { &hf_mscldap_netlogon_flags_good_timeserv
,
4985 { "Good Time Serv", "mscldap.netlogon.flags.good_timeserv", FT_BOOLEAN
, 32,
4986 TFS(&tfs_ads_good_timeserv
), 0x00000200, "Is this a Good Time Server? (i.e. does it have a hardware clock)", HFILL
}},
4988 { &hf_mscldap_netlogon_flags_ndnc
,
4989 { "NDNC", "mscldap.netlogon.flags.ndnc", FT_BOOLEAN
, 32,
4990 TFS(&tfs_ads_ndnc
), 0x00000400, "Is this an NDNC dc?", HFILL
}},
4992 { &hf_mscldap_netlogon_flags_rodc
,
4993 { "RODC", "mscldap.netlogon.flags.rodc", FT_BOOLEAN
, 32,
4994 TFS(&tfs_ads_rodc
), 0x00000800, "Is this an read only dc?", HFILL
}},
4996 { &hf_mscldap_netlogon_flags_wdc
,
4997 { "WDC", "mscldap.netlogon.flags.writabledc", FT_BOOLEAN
, 32,
4998 TFS(&tfs_ads_wdc
), 0x00001000, "Is this an writable dc (Windows 2008)?", HFILL
}},
5000 { &hf_mscldap_netlogon_flags_dns
,
5001 { "DNS", "mscldap.netlogon.flags.dnsname", FT_BOOLEAN
, 32,
5002 TFS(&tfs_ads_dns
), 0x20000000, "Does the server have a dns name (Windows 2008)?", HFILL
}},
5004 { &hf_mscldap_netlogon_flags_dnc
,
5005 { "DNC", "mscldap.netlogon.flags.defaultnc", FT_BOOLEAN
, 32,
5006 TFS(&tfs_ads_dnc
), 0x40000000, "Is this the default NC (Windows 2008)?", HFILL
}},
5008 { &hf_mscldap_netlogon_flags_fnc
,
5009 { "FDC", "mscldap.netlogon.flags.forestnc", FT_BOOLEAN
, 32,
5010 TFS(&tfs_ads_fnc
), 0x80000000, "Is the the NC the default forest root(Windows 2008)?", HFILL
}},
5013 { "GUID", "ldap.guid", FT_GUID
, BASE_NONE
,
5014 NULL
, 0, NULL
, HFILL
}},
5016 { &hf_ldap_AccessMask_ADS_CREATE_CHILD
,
5017 { "Ads Create Child", "ldap.AccessMask.ADS_CREATE_CHILD", FT_BOOLEAN
, 32, TFS(&tfs_set_notset
), LDAP_ACCESSMASK_ADS_CREATE_CHILD
, NULL
, HFILL
}},
5019 { &hf_ldap_AccessMask_ADS_DELETE_CHILD
,
5020 { "Ads Delete Child", "ldap.AccessMask.ADS_DELETE_CHILD", FT_BOOLEAN
, 32, TFS(&tfs_set_notset
), LDAP_ACCESSMASK_ADS_DELETE_CHILD
, NULL
, HFILL
}},
5022 { &hf_ldap_AccessMask_ADS_LIST
,
5023 { "Ads List", "ldap.AccessMask.ADS_LIST", FT_BOOLEAN
, 32, TFS(&tfs_set_notset
), LDAP_ACCESSMASK_ADS_LIST
, NULL
, HFILL
}},
5025 { &hf_ldap_AccessMask_ADS_SELF_WRITE
,
5026 { "Ads Self Write", "ldap.AccessMask.ADS_SELF_WRITE", FT_BOOLEAN
, 32, TFS(&tfs_set_notset
), LDAP_ACCESSMASK_ADS_SELF_WRITE
, NULL
, HFILL
}},
5028 { &hf_ldap_AccessMask_ADS_READ_PROP
,
5029 { "Ads Read Prop", "ldap.AccessMask.ADS_READ_PROP", FT_BOOLEAN
, 32, TFS(&tfs_set_notset
), LDAP_ACCESSMASK_ADS_READ_PROP
, NULL
, HFILL
}},
5031 { &hf_ldap_AccessMask_ADS_WRITE_PROP
,
5032 { "Ads Write Prop", "ldap.AccessMask.ADS_WRITE_PROP", FT_BOOLEAN
, 32, TFS(&tfs_set_notset
), LDAP_ACCESSMASK_ADS_WRITE_PROP
, NULL
, HFILL
}},
5034 { &hf_ldap_AccessMask_ADS_DELETE_TREE
,
5035 { "Ads Delete Tree", "ldap.AccessMask.ADS_DELETE_TREE", FT_BOOLEAN
, 32, TFS(&tfs_set_notset
), LDAP_ACCESSMASK_ADS_DELETE_TREE
, NULL
, HFILL
}},
5037 { &hf_ldap_AccessMask_ADS_LIST_OBJECT
,
5038 { "Ads List Object", "ldap.AccessMask.ADS_LIST_OBJECT", FT_BOOLEAN
, 32, TFS(&tfs_set_notset
), LDAP_ACCESSMASK_ADS_LIST_OBJECT
, NULL
, HFILL
}},
5040 { &hf_ldap_AccessMask_ADS_CONTROL_ACCESS
,
5041 { "Ads Control Access", "ldap.AccessMask.ADS_CONTROL_ACCESS", FT_BOOLEAN
, 32, TFS(&tfs_set_notset
), LDAP_ACCESSMASK_ADS_CONTROL_ACCESS
, NULL
, HFILL
}},
5043 { &hf_ldap_LDAPMessage_PDU
,
5044 { "LDAPMessage", "ldap.LDAPMessage_element", FT_NONE
, BASE_NONE
, NULL
, 0, NULL
, HFILL
}},
5046 { &hf_ldap_object_security_flag
,
5047 { "Flag Object_Security", "ldap.object_security_flag", FT_BOOLEAN
, 32, NULL
, 0x00000001, NULL
, HFILL
}},
5049 { &hf_ldap_ancestor_first_flag
,
5050 { "Flag Ancestor_First", "ldap.ancestor_first_flag", FT_BOOLEAN
, 32, NULL
, 0x00000800, NULL
, HFILL
}},
5052 { &hf_ldap_public_data_only_flag
,
5053 { "Flag Public_Data_Only", "ldap.public_data_only_flag", FT_BOOLEAN
, 32, NULL
, 0x00002000, NULL
, HFILL
}},
5055 { &hf_ldap_incremental_value_flag
,
5056 { "Flag Incremental_Value", "ldap.incremental_value_flag", FT_BOOLEAN
, 32, NULL
, 0x80000000, NULL
, HFILL
}},
5059 { "OID", "ldap.oid", FT_STRING
, BASE_NONE
,
5060 NULL
, 0, NULL
, HFILL
}},
5062 { &hf_ldap_gssapi_encrypted_payload
,
5063 { "GSS-API Encrypted payload", "ldap.gssapi_encrypted_payload", FT_BYTES
, BASE_NONE
,
5064 NULL
, 0, NULL
, HFILL
}},
5067 /*--- Included file: packet-ldap-hfarr.c ---*/
5068 #line 1 "./asn1/ldap/packet-ldap-hfarr.c"
5069 { &hf_ldap_SearchControlValue_PDU
,
5070 { "SearchControlValue", "ldap.SearchControlValue_element",
5071 FT_NONE
, BASE_NONE
, NULL
, 0,
5073 { &hf_ldap_SortKeyList_PDU
,
5074 { "SortKeyList", "ldap.SortKeyList",
5075 FT_UINT32
, BASE_DEC
, NULL
, 0,
5077 { &hf_ldap_SortResult_PDU
,
5078 { "SortResult", "ldap.SortResult_element",
5079 FT_NONE
, BASE_NONE
, NULL
, 0,
5081 { &hf_ldap_DirSyncControlValue_PDU
,
5082 { "DirSyncControlValue", "ldap.DirSyncControlValue_element",
5083 FT_NONE
, BASE_NONE
, NULL
, 0,
5085 { &hf_ldap_PasswdModifyRequestValue_PDU
,
5086 { "PasswdModifyRequestValue", "ldap.PasswdModifyRequestValue_element",
5087 FT_NONE
, BASE_NONE
, NULL
, 0,
5089 { &hf_ldap_CancelRequestValue_PDU
,
5090 { "CancelRequestValue", "ldap.CancelRequestValue_element",
5091 FT_NONE
, BASE_NONE
, NULL
, 0,
5093 { &hf_ldap_SyncRequestValue_PDU
,
5094 { "SyncRequestValue", "ldap.SyncRequestValue_element",
5095 FT_NONE
, BASE_NONE
, NULL
, 0,
5097 { &hf_ldap_SyncStateValue_PDU
,
5098 { "SyncStateValue", "ldap.SyncStateValue_element",
5099 FT_NONE
, BASE_NONE
, NULL
, 0,
5101 { &hf_ldap_SyncDoneValue_PDU
,
5102 { "SyncDoneValue", "ldap.SyncDoneValue_element",
5103 FT_NONE
, BASE_NONE
, NULL
, 0,
5105 { &hf_ldap_SyncInfoValue_PDU
,
5106 { "SyncInfoValue", "ldap.SyncInfoValue",
5107 FT_UINT32
, BASE_DEC
, VALS(ldap_SyncInfoValue_vals
), 0,
5109 { &hf_ldap_PasswordPolicyResponseValue_PDU
,
5110 { "PasswordPolicyResponseValue", "ldap.PasswordPolicyResponseValue_element",
5111 FT_NONE
, BASE_NONE
, NULL
, 0,
5113 { &hf_ldap_messageID
,
5114 { "messageID", "ldap.messageID",
5115 FT_UINT32
, BASE_DEC
, NULL
, 0,
5117 { &hf_ldap_protocolOp
,
5118 { "protocolOp", "ldap.protocolOp",
5119 FT_UINT32
, BASE_DEC
, VALS(ldap_ProtocolOp_vals
), 0,
5121 { &hf_ldap_controls
,
5122 { "controls", "ldap.controls",
5123 FT_UINT32
, BASE_DEC
, NULL
, 0,
5125 { &hf_ldap_bindRequest
,
5126 { "bindRequest", "ldap.bindRequest_element",
5127 FT_NONE
, BASE_NONE
, NULL
, 0,
5129 { &hf_ldap_bindResponse
,
5130 { "bindResponse", "ldap.bindResponse_element",
5131 FT_NONE
, BASE_NONE
, NULL
, 0,
5133 { &hf_ldap_unbindRequest
,
5134 { "unbindRequest", "ldap.unbindRequest_element",
5135 FT_NONE
, BASE_NONE
, NULL
, 0,
5137 { &hf_ldap_searchRequest
,
5138 { "searchRequest", "ldap.searchRequest_element",
5139 FT_NONE
, BASE_NONE
, NULL
, 0,
5141 { &hf_ldap_searchResEntry
,
5142 { "searchResEntry", "ldap.searchResEntry_element",
5143 FT_NONE
, BASE_NONE
, NULL
, 0,
5144 "SearchResultEntry", HFILL
}},
5145 { &hf_ldap_searchResDone
,
5146 { "searchResDone", "ldap.searchResDone_element",
5147 FT_NONE
, BASE_NONE
, NULL
, 0,
5148 "SearchResultDone", HFILL
}},
5149 { &hf_ldap_searchResRef
,
5150 { "searchResRef", "ldap.searchResRef",
5151 FT_UINT32
, BASE_DEC
, NULL
, 0,
5152 "SearchResultReference", HFILL
}},
5153 { &hf_ldap_modifyRequest
,
5154 { "modifyRequest", "ldap.modifyRequest_element",
5155 FT_NONE
, BASE_NONE
, NULL
, 0,
5157 { &hf_ldap_modifyResponse
,
5158 { "modifyResponse", "ldap.modifyResponse_element",
5159 FT_NONE
, BASE_NONE
, NULL
, 0,
5161 { &hf_ldap_addRequest
,
5162 { "addRequest", "ldap.addRequest_element",
5163 FT_NONE
, BASE_NONE
, NULL
, 0,
5165 { &hf_ldap_addResponse
,
5166 { "addResponse", "ldap.addResponse_element",
5167 FT_NONE
, BASE_NONE
, NULL
, 0,
5169 { &hf_ldap_delRequest
,
5170 { "delRequest", "ldap.delRequest",
5171 FT_STRING
, STR_UNICODE
, NULL
, 0,
5173 { &hf_ldap_delResponse
,
5174 { "delResponse", "ldap.delResponse_element",
5175 FT_NONE
, BASE_NONE
, NULL
, 0,
5177 { &hf_ldap_modDNRequest
,
5178 { "modDNRequest", "ldap.modDNRequest_element",
5179 FT_NONE
, BASE_NONE
, NULL
, 0,
5180 "ModifyDNRequest", HFILL
}},
5181 { &hf_ldap_modDNResponse
,
5182 { "modDNResponse", "ldap.modDNResponse_element",
5183 FT_NONE
, BASE_NONE
, NULL
, 0,
5184 "ModifyDNResponse", HFILL
}},
5185 { &hf_ldap_compareRequest
,
5186 { "compareRequest", "ldap.compareRequest_element",
5187 FT_NONE
, BASE_NONE
, NULL
, 0,
5189 { &hf_ldap_compareResponse
,
5190 { "compareResponse", "ldap.compareResponse_element",
5191 FT_NONE
, BASE_NONE
, NULL
, 0,
5193 { &hf_ldap_abandonRequest
,
5194 { "abandonRequest", "ldap.abandonRequest",
5195 FT_UINT32
, BASE_DEC
, NULL
, 0,
5197 { &hf_ldap_extendedReq
,
5198 { "extendedReq", "ldap.extendedReq_element",
5199 FT_NONE
, BASE_NONE
, NULL
, 0,
5200 "ExtendedRequest", HFILL
}},
5201 { &hf_ldap_extendedResp
,
5202 { "extendedResp", "ldap.extendedResp_element",
5203 FT_NONE
, BASE_NONE
, NULL
, 0,
5204 "ExtendedResponse", HFILL
}},
5205 { &hf_ldap_intermediateResponse
,
5206 { "intermediateResponse", "ldap.intermediateResponse_element",
5207 FT_NONE
, BASE_NONE
, NULL
, 0,
5209 { &hf_ldap_AttributeDescriptionList_item
,
5210 { "AttributeDescription", "ldap.AttributeDescription",
5211 FT_STRING
, STR_UNICODE
, NULL
, 0,
5213 { &hf_ldap_attributeDesc
,
5214 { "attributeDesc", "ldap.attributeDesc",
5215 FT_STRING
, STR_UNICODE
, NULL
, 0,
5216 "AttributeDescription", HFILL
}},
5217 { &hf_ldap_assertionValue
,
5218 { "assertionValue", "ldap.assertionValue",
5219 FT_STRING
, BASE_NONE
, NULL
, 0,
5222 { "type", "ldap.type",
5223 FT_STRING
, STR_UNICODE
, NULL
, 0,
5224 "AttributeDescription", HFILL
}},
5226 { "vals", "ldap.vals",
5227 FT_UINT32
, BASE_DEC
, NULL
, 0,
5228 "SET_OF_AttributeValue", HFILL
}},
5229 { &hf_ldap_vals_item
,
5230 { "AttributeValue", "ldap.AttributeValue",
5231 FT_BYTES
, BASE_NONE
, NULL
, 0,
5233 { &hf_ldap_resultCode
,
5234 { "resultCode", "ldap.resultCode",
5235 FT_UINT32
, BASE_DEC
, VALS(ldap_T_resultCode_vals
), 0,
5237 { &hf_ldap_matchedDN
,
5238 { "matchedDN", "ldap.matchedDN",
5239 FT_STRING
, STR_UNICODE
, NULL
, 0,
5241 { &hf_ldap_errorMessage
,
5242 { "errorMessage", "ldap.errorMessage",
5243 FT_STRING
, STR_UNICODE
, NULL
, 0,
5245 { &hf_ldap_referral
,
5246 { "referral", "ldap.referral",
5247 FT_UINT32
, BASE_DEC
, NULL
, 0,
5249 { &hf_ldap_Referral_item
,
5250 { "LDAPURL", "ldap.LDAPURL",
5251 FT_STRING
, BASE_NONE
, NULL
, 0,
5253 { &hf_ldap_Controls_item
,
5254 { "Control", "ldap.Control_element",
5255 FT_NONE
, BASE_NONE
, NULL
, 0,
5257 { &hf_ldap_controlType
,
5258 { "controlType", "ldap.controlType",
5259 FT_STRING
, BASE_NONE
, NULL
, 0,
5261 { &hf_ldap_criticality
,
5262 { "criticality", "ldap.criticality",
5263 FT_BOOLEAN
, BASE_NONE
, NULL
, 0,
5264 "BOOLEAN", HFILL
}},
5265 { &hf_ldap_controlValue
,
5266 { "controlValue", "ldap.controlValue",
5267 FT_BYTES
, BASE_NONE
, NULL
, 0,
5270 { "version", "ldap.version",
5271 FT_UINT32
, BASE_DEC
, NULL
, 0,
5272 "INTEGER_1_127", HFILL
}},
5274 { "name", "ldap.name",
5275 FT_STRING
, STR_UNICODE
, NULL
, 0,
5277 { &hf_ldap_authentication
,
5278 { "authentication", "ldap.authentication",
5279 FT_UINT32
, BASE_DEC
, VALS(ldap_AuthenticationChoice_vals
), 0,
5280 "AuthenticationChoice", HFILL
}},
5282 { "simple", "ldap.simple",
5283 FT_STRING
, BASE_NONE
, NULL
, 0,
5286 { "sasl", "ldap.sasl_element",
5287 FT_NONE
, BASE_NONE
, NULL
, 0,
5288 "SaslCredentials", HFILL
}},
5289 { &hf_ldap_ntlmsspNegotiate
,
5290 { "ntlmsspNegotiate", "ldap.ntlmsspNegotiate",
5291 FT_BYTES
, BASE_NONE
, NULL
, 0,
5293 { &hf_ldap_ntlmsspAuth
,
5294 { "ntlmsspAuth", "ldap.ntlmsspAuth",
5295 FT_BYTES
, BASE_NONE
, NULL
, 0,
5297 { &hf_ldap_mechanism
,
5298 { "mechanism", "ldap.mechanism",
5299 FT_STRING
, BASE_NONE
, NULL
, 0,
5301 { &hf_ldap_credentials
,
5302 { "credentials", "ldap.credentials",
5303 FT_BYTES
, BASE_NONE
, NULL
, 0,
5305 { &hf_ldap_bindResponse_resultCode
,
5306 { "resultCode", "ldap.resultCode",
5307 FT_UINT32
, BASE_DEC
, VALS(ldap_BindResponse_resultCode_vals
), 0,
5308 "BindResponse_resultCode", HFILL
}},
5309 { &hf_ldap_bindResponse_matchedDN
,
5310 { "matchedDN", "ldap.matchedDN",
5311 FT_STRING
, STR_UNICODE
, NULL
, 0,
5312 "T_bindResponse_matchedDN", HFILL
}},
5313 { &hf_ldap_serverSaslCreds
,
5314 { "serverSaslCreds", "ldap.serverSaslCreds",
5315 FT_BYTES
, BASE_NONE
, NULL
, 0,
5317 { &hf_ldap_baseObject
,
5318 { "baseObject", "ldap.baseObject",
5319 FT_STRING
, STR_UNICODE
, NULL
, 0,
5322 { "scope", "ldap.scope",
5323 FT_UINT32
, BASE_DEC
, VALS(ldap_T_scope_vals
), 0,
5325 { &hf_ldap_derefAliases
,
5326 { "derefAliases", "ldap.derefAliases",
5327 FT_UINT32
, BASE_DEC
, VALS(ldap_T_derefAliases_vals
), 0,
5329 { &hf_ldap_sizeLimit
,
5330 { "sizeLimit", "ldap.sizeLimit",
5331 FT_UINT32
, BASE_DEC
, NULL
, 0,
5332 "INTEGER_0_maxInt", HFILL
}},
5333 { &hf_ldap_timeLimit
,
5334 { "timeLimit", "ldap.timeLimit",
5335 FT_UINT32
, BASE_DEC
, NULL
, 0,
5336 "INTEGER_0_maxInt", HFILL
}},
5337 { &hf_ldap_typesOnly
,
5338 { "typesOnly", "ldap.typesOnly",
5339 FT_BOOLEAN
, BASE_NONE
, NULL
, 0,
5340 "BOOLEAN", HFILL
}},
5342 { "filter", "ldap.filter",
5343 FT_UINT32
, BASE_DEC
, VALS(ldap_Filter_vals
), 0,
5345 { &hf_ldap_searchRequest_attributes
,
5346 { "attributes", "ldap.attributes",
5347 FT_UINT32
, BASE_DEC
, NULL
, 0,
5348 "AttributeDescriptionList", HFILL
}},
5350 { "and", "ldap.and",
5351 FT_UINT32
, BASE_DEC
, NULL
, 0,
5353 { &hf_ldap_and_item
,
5354 { "and item", "ldap.and_item",
5355 FT_UINT32
, BASE_DEC
, VALS(ldap_Filter_vals
), 0,
5359 FT_UINT32
, BASE_DEC
, NULL
, 0,
5362 { "or item", "ldap.or_item",
5363 FT_UINT32
, BASE_DEC
, VALS(ldap_Filter_vals
), 0,
5366 { "not", "ldap.not",
5367 FT_UINT32
, BASE_DEC
, VALS(ldap_Filter_vals
), 0,
5369 { &hf_ldap_equalityMatch
,
5370 { "equalityMatch", "ldap.equalityMatch_element",
5371 FT_NONE
, BASE_NONE
, NULL
, 0,
5373 { &hf_ldap_substrings
,
5374 { "substrings", "ldap.substrings_element",
5375 FT_NONE
, BASE_NONE
, NULL
, 0,
5376 "SubstringFilter", HFILL
}},
5377 { &hf_ldap_greaterOrEqual
,
5378 { "greaterOrEqual", "ldap.greaterOrEqual_element",
5379 FT_NONE
, BASE_NONE
, NULL
, 0,
5381 { &hf_ldap_lessOrEqual
,
5382 { "lessOrEqual", "ldap.lessOrEqual_element",
5383 FT_NONE
, BASE_NONE
, NULL
, 0,
5386 { "present", "ldap.present",
5387 FT_STRING
, STR_UNICODE
, NULL
, 0,
5389 { &hf_ldap_approxMatch
,
5390 { "approxMatch", "ldap.approxMatch_element",
5391 FT_NONE
, BASE_NONE
, NULL
, 0,
5393 { &hf_ldap_extensibleMatch
,
5394 { "extensibleMatch", "ldap.extensibleMatch_element",
5395 FT_NONE
, BASE_NONE
, NULL
, 0,
5397 { &hf_ldap_substringFilter_substrings
,
5398 { "substrings", "ldap.substrings",
5399 FT_UINT32
, BASE_DEC
, NULL
, 0,
5400 "T_substringFilter_substrings", HFILL
}},
5401 { &hf_ldap_substringFilter_substrings_item
,
5402 { "substrings item", "ldap.substrings_item",
5403 FT_UINT32
, BASE_DEC
, VALS(ldap_T_substringFilter_substrings_item_vals
), 0,
5404 "T_substringFilter_substrings_item", HFILL
}},
5406 { "initial", "ldap.initial",
5407 FT_STRING
, STR_UNICODE
, NULL
, 0,
5408 "LDAPString", HFILL
}},
5410 { "any", "ldap.any",
5411 FT_STRING
, STR_UNICODE
, NULL
, 0,
5412 "LDAPString", HFILL
}},
5414 { "final", "ldap.final",
5415 FT_STRING
, STR_UNICODE
, NULL
, 0,
5416 "LDAPString", HFILL
}},
5417 { &hf_ldap_matchingRule
,
5418 { "matchingRule", "ldap.matchingRule",
5419 FT_STRING
, STR_UNICODE
, NULL
, 0,
5420 "MatchingRuleId", HFILL
}},
5421 { &hf_ldap_matchValue
,
5422 { "matchValue", "ldap.matchValue",
5423 FT_STRING
, BASE_NONE
, NULL
, 0,
5424 "AssertionValue", HFILL
}},
5425 { &hf_ldap_dnAttributes
,
5426 { "dnAttributes", "ldap.dnAttributes",
5427 FT_BOOLEAN
, BASE_NONE
, NULL
, 0,
5429 { &hf_ldap_objectName
,
5430 { "objectName", "ldap.objectName",
5431 FT_STRING
, STR_UNICODE
, NULL
, 0,
5433 { &hf_ldap_searchResultEntry_attributes
,
5434 { "attributes", "ldap.attributes",
5435 FT_UINT32
, BASE_DEC
, NULL
, 0,
5436 "PartialAttributeList", HFILL
}},
5437 { &hf_ldap_PartialAttributeList_item
,
5438 { "PartialAttributeList item", "ldap.PartialAttributeList_item_element",
5439 FT_NONE
, BASE_NONE
, NULL
, 0,
5441 { &hf_ldap__untag_item
,
5442 { "LDAPURL", "ldap.LDAPURL",
5443 FT_STRING
, BASE_NONE
, NULL
, 0,
5446 { "object", "ldap.object",
5447 FT_STRING
, STR_UNICODE
, NULL
, 0,
5449 { &hf_ldap_modifyRequest_modification
,
5450 { "modification", "ldap.modification",
5451 FT_UINT32
, BASE_DEC
, NULL
, 0,
5452 "ModifyRequest_modification", HFILL
}},
5453 { &hf_ldap_modifyRequest_modification_item
,
5454 { "modification item", "ldap.modification_item_element",
5455 FT_NONE
, BASE_NONE
, NULL
, 0,
5456 "T_modifyRequest_modification_item", HFILL
}},
5457 { &hf_ldap_operation
,
5458 { "operation", "ldap.operation",
5459 FT_UINT32
, BASE_DEC
, VALS(ldap_T_operation_vals
), 0,
5461 { &hf_ldap_modification
,
5462 { "modification", "ldap.modification_element",
5463 FT_NONE
, BASE_NONE
, NULL
, 0,
5464 "AttributeTypeAndValues", HFILL
}},
5466 { "entry", "ldap.entry",
5467 FT_STRING
, STR_UNICODE
, NULL
, 0,
5469 { &hf_ldap_attributes
,
5470 { "attributes", "ldap.attributes",
5471 FT_UINT32
, BASE_DEC
, NULL
, 0,
5472 "AttributeList", HFILL
}},
5473 { &hf_ldap_AttributeList_item
,
5474 { "AttributeList item", "ldap.AttributeList_item_element",
5475 FT_NONE
, BASE_NONE
, NULL
, 0,
5478 { "newrdn", "ldap.newrdn",
5479 FT_STRING
, STR_UNICODE
, NULL
, 0,
5480 "RelativeLDAPDN", HFILL
}},
5481 { &hf_ldap_deleteoldrdn
,
5482 { "deleteoldrdn", "ldap.deleteoldrdn",
5483 FT_BOOLEAN
, BASE_NONE
, NULL
, 0,
5484 "BOOLEAN", HFILL
}},
5485 { &hf_ldap_newSuperior
,
5486 { "newSuperior", "ldap.newSuperior",
5487 FT_STRING
, STR_UNICODE
, NULL
, 0,
5490 { "ava", "ldap.ava_element",
5491 FT_NONE
, BASE_NONE
, NULL
, 0,
5492 "AttributeValueAssertion", HFILL
}},
5493 { &hf_ldap_requestName
,
5494 { "requestName", "ldap.requestName",
5495 FT_STRING
, BASE_NONE
, NULL
, 0,
5496 "LDAPOID", HFILL
}},
5497 { &hf_ldap_requestValue
,
5498 { "requestValue", "ldap.requestValue",
5499 FT_BYTES
, BASE_NONE
, NULL
, 0,
5501 { &hf_ldap_extendedResponse_resultCode
,
5502 { "resultCode", "ldap.resultCode",
5503 FT_UINT32
, BASE_DEC
, VALS(ldap_ExtendedResponse_resultCode_vals
), 0,
5504 "ExtendedResponse_resultCode", HFILL
}},
5505 { &hf_ldap_responseName
,
5506 { "responseName", "ldap.responseName",
5507 FT_STRING
, BASE_NONE
, NULL
, 0,
5509 { &hf_ldap_response
,
5510 { "response", "ldap.response",
5511 FT_BYTES
, BASE_NONE
, NULL
, 0,
5512 "OCTET_STRING", HFILL
}},
5513 { &hf_ldap_intermediateResponse_responseValue
,
5514 { "responseValue", "ldap.responseValue",
5515 FT_BYTES
, BASE_NONE
, NULL
, 0,
5516 "T_intermediateResponse_responseValue", HFILL
}},
5518 { "size", "ldap.size",
5519 FT_INT32
, BASE_DEC
, NULL
, 0,
5520 "INTEGER", HFILL
}},
5522 { "cookie", "ldap.cookie",
5523 FT_BYTES
, BASE_NONE
, NULL
, 0,
5524 "OCTET_STRING", HFILL
}},
5525 { &hf_ldap_SortKeyList_item
,
5526 { "SortKeyList item", "ldap.SortKeyList_item_element",
5527 FT_NONE
, BASE_NONE
, NULL
, 0,
5529 { &hf_ldap_attributeType
,
5530 { "attributeType", "ldap.attributeType",
5531 FT_STRING
, STR_UNICODE
, NULL
, 0,
5532 "AttributeDescription", HFILL
}},
5533 { &hf_ldap_orderingRule
,
5534 { "orderingRule", "ldap.orderingRule",
5535 FT_STRING
, STR_UNICODE
, NULL
, 0,
5536 "MatchingRuleId", HFILL
}},
5537 { &hf_ldap_reverseOrder
,
5538 { "reverseOrder", "ldap.reverseOrder",
5539 FT_BOOLEAN
, BASE_NONE
, NULL
, 0,
5540 "BOOLEAN", HFILL
}},
5541 { &hf_ldap_sortResult
,
5542 { "sortResult", "ldap.sortResult",
5543 FT_UINT32
, BASE_DEC
, VALS(ldap_T_sortResult_vals
), 0,
5546 { "flags", "ldap.flags",
5547 FT_UINT32
, BASE_HEX
, NULL
, 0,
5548 "DirSyncFlags", HFILL
}},
5549 { &hf_ldap_maxBytes
,
5550 { "maxBytes", "ldap.maxBytes",
5551 FT_INT32
, BASE_DEC
, NULL
, 0,
5552 "INTEGER", HFILL
}},
5553 { &hf_ldap_userIdentity
,
5554 { "userIdentity", "ldap.userIdentity",
5555 FT_BYTES
, BASE_NONE
, NULL
, 0,
5556 "OCTET_STRING", HFILL
}},
5557 { &hf_ldap_oldPasswd
,
5558 { "oldPasswd", "ldap.oldPasswd",
5559 FT_BYTES
, BASE_NONE
, NULL
, 0,
5560 "OCTET_STRING", HFILL
}},
5561 { &hf_ldap_newPasswd
,
5562 { "newPasswd", "ldap.newPasswd",
5563 FT_BYTES
, BASE_NONE
, NULL
, 0,
5564 "OCTET_STRING", HFILL
}},
5565 { &hf_ldap_cancelID
,
5566 { "cancelID", "ldap.cancelID",
5567 FT_UINT32
, BASE_DEC
, NULL
, 0,
5568 "MessageID", HFILL
}},
5570 { "mode", "ldap.mode",
5571 FT_UINT32
, BASE_DEC
, VALS(ldap_T_mode_vals
), 0,
5573 { &hf_ldap_reloadHint
,
5574 { "reloadHint", "ldap.reloadHint",
5575 FT_BOOLEAN
, BASE_NONE
, NULL
, 0,
5576 "BOOLEAN", HFILL
}},
5578 { "state", "ldap.state",
5579 FT_UINT32
, BASE_DEC
, VALS(ldap_T_state_vals
), 0,
5581 { &hf_ldap_entryUUID
,
5582 { "entryUUID", "ldap.entryUUID",
5583 FT_BYTES
, BASE_NONE
, NULL
, 0,
5584 "SyncUUID", HFILL
}},
5585 { &hf_ldap_refreshDeletes
,
5586 { "refreshDeletes", "ldap.refreshDeletes",
5587 FT_BOOLEAN
, BASE_NONE
, NULL
, 0,
5588 "BOOLEAN", HFILL
}},
5589 { &hf_ldap_newcookie
,
5590 { "newcookie", "ldap.newcookie",
5591 FT_BYTES
, BASE_NONE
, NULL
, 0,
5592 "OCTET_STRING", HFILL
}},
5593 { &hf_ldap_refreshDelete
,
5594 { "refreshDelete", "ldap.refreshDelete_element",
5595 FT_NONE
, BASE_NONE
, NULL
, 0,
5597 { &hf_ldap_refreshDone
,
5598 { "refreshDone", "ldap.refreshDone",
5599 FT_BOOLEAN
, BASE_NONE
, NULL
, 0,
5600 "BOOLEAN", HFILL
}},
5601 { &hf_ldap_refreshPresent
,
5602 { "refreshPresent", "ldap.refreshPresent_element",
5603 FT_NONE
, BASE_NONE
, NULL
, 0,
5605 { &hf_ldap_syncIdSet
,
5606 { "syncIdSet", "ldap.syncIdSet_element",
5607 FT_NONE
, BASE_NONE
, NULL
, 0,
5609 { &hf_ldap_syncUUIDs
,
5610 { "syncUUIDs", "ldap.syncUUIDs",
5611 FT_UINT32
, BASE_DEC
, NULL
, 0,
5612 "SET_OF_SyncUUID", HFILL
}},
5613 { &hf_ldap_syncUUIDs_item
,
5614 { "SyncUUID", "ldap.SyncUUID",
5615 FT_BYTES
, BASE_NONE
, NULL
, 0,
5618 { "warning", "ldap.warning",
5619 FT_UINT32
, BASE_DEC
, VALS(ldap_T_warning_vals
), 0,
5621 { &hf_ldap_timeBeforeExpiration
,
5622 { "timeBeforeExpiration", "ldap.timeBeforeExpiration",
5623 FT_UINT32
, BASE_DEC
, NULL
, 0,
5624 "INTEGER_0_maxInt", HFILL
}},
5625 { &hf_ldap_graceAuthNsRemaining
,
5626 { "graceAuthNsRemaining", "ldap.graceAuthNsRemaining",
5627 FT_UINT32
, BASE_DEC
, NULL
, 0,
5628 "INTEGER_0_maxInt", HFILL
}},
5630 { "error", "ldap.error",
5631 FT_UINT32
, BASE_DEC
, VALS(ldap_T_error_vals
), 0,
5634 /*--- End of included file: packet-ldap-hfarr.c ---*/
5635 #line 2157 "./asn1/ldap/packet-ldap-template.c"
5638 /* List of subtrees */
5639 static gint
*ett
[] = {
5642 &ett_ldap_sasl_blob
,
5644 &ett_mscldap_netlogon_flags
,
5645 &ett_mscldap_ntver_flags
,
5646 &ett_mscldap_ipdetails
,
5647 &ett_ldap_DirSyncFlagsSubEntry
,
5650 /*--- Included file: packet-ldap-ettarr.c ---*/
5651 #line 1 "./asn1/ldap/packet-ldap-ettarr.c"
5652 &ett_ldap_LDAPMessage
,
5653 &ett_ldap_ProtocolOp
,
5654 &ett_ldap_AttributeDescriptionList
,
5655 &ett_ldap_AttributeValueAssertion
,
5656 &ett_ldap_Attribute
,
5657 &ett_ldap_SET_OF_AttributeValue
,
5658 &ett_ldap_LDAPResult
,
5662 &ett_ldap_BindRequest_U
,
5663 &ett_ldap_AuthenticationChoice
,
5664 &ett_ldap_SaslCredentials
,
5665 &ett_ldap_BindResponse_U
,
5666 &ett_ldap_SearchRequest_U
,
5670 &ett_ldap_SubstringFilter
,
5671 &ett_ldap_T_substringFilter_substrings
,
5672 &ett_ldap_T_substringFilter_substrings_item
,
5673 &ett_ldap_MatchingRuleAssertion
,
5674 &ett_ldap_SearchResultEntry_U
,
5675 &ett_ldap_PartialAttributeList
,
5676 &ett_ldap_PartialAttributeList_item
,
5677 &ett_ldap_SEQUENCE_OF_LDAPURL
,
5678 &ett_ldap_ModifyRequest_U
,
5679 &ett_ldap_ModifyRequest_modification
,
5680 &ett_ldap_T_modifyRequest_modification_item
,
5681 &ett_ldap_AttributeTypeAndValues
,
5682 &ett_ldap_AddRequest_U
,
5683 &ett_ldap_AttributeList
,
5684 &ett_ldap_AttributeList_item
,
5685 &ett_ldap_ModifyDNRequest_U
,
5686 &ett_ldap_CompareRequest_U
,
5687 &ett_ldap_ExtendedRequest_U
,
5688 &ett_ldap_ExtendedResponse_U
,
5689 &ett_ldap_IntermediateResponse_U
,
5690 &ett_ldap_SearchControlValue
,
5691 &ett_ldap_SortKeyList
,
5692 &ett_ldap_SortKeyList_item
,
5693 &ett_ldap_SortResult
,
5694 &ett_ldap_DirSyncControlValue
,
5695 &ett_ldap_PasswdModifyRequestValue
,
5696 &ett_ldap_CancelRequestValue
,
5697 &ett_ldap_SyncRequestValue
,
5698 &ett_ldap_SyncStateValue
,
5699 &ett_ldap_SyncDoneValue
,
5700 &ett_ldap_SyncInfoValue
,
5701 &ett_ldap_T_refreshDelete
,
5702 &ett_ldap_T_refreshPresent
,
5703 &ett_ldap_T_syncIdSet
,
5704 &ett_ldap_SET_OF_SyncUUID
,
5705 &ett_ldap_PasswordPolicyResponseValue
,
5706 &ett_ldap_T_warning
,
5708 /*--- End of included file: packet-ldap-ettarr.c ---*/
5709 #line 2171 "./asn1/ldap/packet-ldap-template.c"
5711 /* UAT for header fields */
5712 static uat_field_t custom_attribute_types_uat_fields
[] = {
5713 UAT_FLD_CSTRING(attribute_types
, attribute_type
, "Attribute type", "Attribute type"),
5714 UAT_FLD_CSTRING(attribute_types
, attribute_desc
, "Description", "Description of the value matching type"),
5718 static ei_register_info ei
[] = {
5719 { &ei_ldap_exceeded_filter_length
, { "ldap.exceeded_filter_length", PI_UNDECODED
, PI_ERROR
, "Filter length exceeds number. Giving up", EXPFILL
}},
5720 { &ei_ldap_too_many_filter_elements
, { "ldap.too_many_filter_elements", PI_UNDECODED
, PI_ERROR
, "Found more than %%u filter elements. Giving up.", EXPFILL
}},
5723 expert_module_t
* expert_ldap
;
5724 module_t
*ldap_module
;
5725 uat_t
*attributes_uat
;
5727 /* Register protocol */
5728 proto_ldap
= proto_register_protocol(PNAME
, PSNAME
, PFNAME
);
5729 /* Register fields and subtrees */
5730 proto_register_field_array(proto_ldap
, hf
, array_length(hf
));
5731 proto_register_subtree_array(ett
, array_length(ett
));
5732 expert_ldap
= expert_register_protocol(proto_ldap
);
5733 expert_register_field_array(expert_ldap
, ei
, array_length(ei
));
5735 ldap_handle
= register_dissector("ldap", dissect_ldap_tcp
, proto_ldap
);
5737 ldap_module
= prefs_register_protocol(proto_ldap
, prefs_register_ldap
);
5738 prefs_register_bool_preference(ldap_module
, "desegment_ldap_messages",
5739 "Reassemble LDAP messages spanning multiple TCP segments",
5740 "Whether the LDAP dissector should reassemble messages spanning multiple TCP segments."
5741 " To use this option, you must also enable \"Allow subdissectors to reassemble TCP streams\" in the TCP protocol settings.",
5744 prefs_register_uint_preference(ldap_module
, "tls.port", "LDAPS TCP Port",
5745 "Set the port for LDAP operations over TLS",
5746 10, &global_ldaps_tcp_port
);
5747 prefs_register_obsolete_preference(ldap_module
, "ssl.port");
5749 attributes_uat
= uat_new("Custom LDAP AttributeValue types",
5750 sizeof(attribute_type_t
),
5751 "custom_ldap_attribute_types",
5754 &num_attribute_types
,
5755 /* specifies named fields, so affects dissection
5756 and the set of named fields */
5757 UAT_AFFECTS_DISSECTION
|UAT_AFFECTS_FIELDS
,
5759 attribute_types_copy_cb
,
5760 attribute_types_update_cb
,
5761 attribute_types_free_cb
,
5762 attribute_types_post_update_cb
,
5763 attribute_types_reset_cb
,
5764 custom_attribute_types_uat_fields
);
5766 prefs_register_uat_preference(ldap_module
, "custom_ldap_attribute_types",
5767 "Custom AttributeValue types",
5768 "A table to define custom LDAP attribute type values for which fields can be setup and used for filtering/data extraction etc.",
5771 prefs_register_obsolete_preference(ldap_module
, "max_pdu");
5773 proto_cldap
= proto_register_protocol(
5774 "Connectionless Lightweight Directory Access Protocol",
5777 ldap_tap
=register_tap("ldap");
5779 ldap_name_dissector_table
= register_dissector_table("ldap.name", "LDAP Attribute Type Dissectors", proto_cldap
, FT_STRING
, BASE_NONE
);
5781 register_srt_table(proto_ldap
, NULL
, 1, ldapstat_packet
, ldapstat_init
, NULL
);
5785 /*--- proto_reg_handoff_ldap ---------------------------------------*/
5787 proto_reg_handoff_ldap(void)
5789 dissector_handle_t cldap_handle
;
5791 cldap_handle
= create_dissector_handle(dissect_mscldap
, proto_cldap
);
5792 dissector_add_uint_with_preference("udp.port", UDP_PORT_CLDAP
, cldap_handle
);
5794 gssapi_handle
= find_dissector_add_dependency("gssapi", proto_ldap
);
5795 gssapi_wrap_handle
= find_dissector_add_dependency("gssapi_verf", proto_ldap
);
5796 spnego_handle
= find_dissector_add_dependency("spnego", proto_ldap
);
5798 ntlmssp_handle
= find_dissector_add_dependency("ntlmssp", proto_ldap
);
5800 tls_handle
= find_dissector_add_dependency("tls", proto_ldap
);
5802 prefs_register_ldap();
5804 oid_add_from_string("ISO assigned OIDs, USA", "1.2.840");
5806 /* http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dsml/dsml/ldap_controls_and_session_support.asp */
5807 oid_add_from_string("LDAP_PAGED_RESULT_OID_STRING","1.2.840.113556.1.4.319");
5808 oid_add_from_string("LDAP_SERVER_SHOW_DELETED_OID","1.2.840.113556.1.4.417");
5809 oid_add_from_string("LDAP_SERVER_SORT_OID","1.2.840.113556.1.4.473");
5810 oid_add_from_string("LDAP_CONTROL_SORT_RESP_OID","1.2.840.113556.1.4.474");
5811 oid_add_from_string("LDAP_SERVER_CROSSDOM_MOVE_TARGET_OID","1.2.840.113556.1.4.521");
5812 oid_add_from_string("LDAP_SERVER_NOTIFICATION_OID","1.2.840.113556.1.4.528");
5813 oid_add_from_string("LDAP_SERVER_EXTENDED_DN_OID","1.2.840.113556.1.4.529");
5814 oid_add_from_string("meetingAdvertiseScope","1.2.840.113556.1.4.582");
5815 oid_add_from_string("LDAP_SERVER_LAZY_COMMIT_OID","1.2.840.113556.1.4.619");
5816 oid_add_from_string("mhsORAddress","1.2.840.113556.1.4.650");
5817 oid_add_from_string("managedObjects","1.2.840.113556.1.4.654");
5818 oid_add_from_string("LDAP_CAP_ACTIVE_DIRECTORY_OID","1.2.840.113556.1.4.800");
5819 oid_add_from_string("LDAP_SERVER_SD_FLAGS_OID","1.2.840.113556.1.4.801");
5820 oid_add_from_string("LDAP_OID_COMPARATOR_OR","1.2.840.113556.1.4.804");
5821 oid_add_from_string("LDAP_SERVER_TREE_DELETE_OID","1.2.840.113556.1.4.805");
5822 oid_add_from_string("LDAP_SERVER_DIRSYNC_OID","1.2.840.113556.1.4.841");
5823 oid_add_from_string("None","1.2.840.113556.1.4.970");
5824 oid_add_from_string("LDAP_SERVER_VERIFY_NAME_OID","1.2.840.113556.1.4.1338");
5825 oid_add_from_string("LDAP_SERVER_DOMAIN_SCOPE_OID","1.2.840.113556.1.4.1339");
5826 oid_add_from_string("LDAP_SERVER_SEARCH_OPTIONS_OID","1.2.840.113556.1.4.1340");
5827 oid_add_from_string("LDAP_SERVER_PERMISSIVE_MODIFY_OID","1.2.840.113556.1.4.1413");
5828 oid_add_from_string("LDAP_SERVER_ASQ_OID","1.2.840.113556.1.4.1504");
5829 oid_add_from_string("LDAP_CAP_ACTIVE_DIRECTORY_V51_OID","1.2.840.113556.1.4.1670");
5830 oid_add_from_string("LDAP_SERVER_FAST_BIND_OID","1.2.840.113556.1.4.1781");
5831 oid_add_from_string("LDAP_CAP_ACTIVE_DIRECTORY_LDAP_INTEG_OID","1.2.840.113556.1.4.1791");
5832 oid_add_from_string("msDS-ObjectReference","1.2.840.113556.1.4.1840");
5833 oid_add_from_string("msDS-QuotaEffective","1.2.840.113556.1.4.1848");
5834 oid_add_from_string("LDAP_CAP_ACTIVE_DIRECTORY_ADAM_OID","1.2.840.113556.1.4.1851");
5835 oid_add_from_string("msDS-PortSSL","1.2.840.113556.1.4.1860");
5836 oid_add_from_string("msDS-isRODC","1.2.840.113556.1.4.1960");
5837 oid_add_from_string("msDS-SDReferenceDomain","1.2.840.113556.1.4.1711");
5838 oid_add_from_string("msDS-AdditionalDnsHostName","1.2.840.113556.1.4.1717");
5839 oid_add_from_string("None","1.3.6.1.4.1.1466.101.119.1");
5840 oid_add_from_string("LDAP_START_TLS_OID","1.3.6.1.4.1.1466.20037");
5842 oid_add_from_string("inetOrgPerson", "2.16.840.1.113730.3.2.2");
5844 oid_add_from_string("US company arc", "2.16.840.1");
5846 /* http://www.alvestrand.no/objectid/2.16.840.1.113730.3.4.html */
5847 oid_add_from_string("Manage DSA IT LDAPv3 control", "2.16.840.1.113730.3.4.2");
5848 oid_add_from_string("Persistent Search LDAPv3 control", "2.16.840.1.113730.3.4.3");
5849 oid_add_from_string("Netscape Password Expired LDAPv3 control", "2.16.840.1.113730.3.4.4");
5850 oid_add_from_string("Netscape Password Expiring LDAPv3 control", "2.16.840.1.113730.3.4.5");
5851 oid_add_from_string("Netscape NT Synchronization Client LDAPv3 control", "2.16.840.1.113730.3.4.6");
5852 oid_add_from_string("Entry Change Notification LDAPv3 control", "2.16.840.1.113730.3.4.7");
5853 oid_add_from_string("Transaction ID Request Control", "2.16.840.1.113730.3.4.8");
5854 oid_add_from_string("VLV Request LDAPv3 control", "2.16.840.1.113730.3.4.9");
5855 oid_add_from_string("VLV Response LDAPv3 control", "2.16.840.1.113730.3.4.10");
5856 oid_add_from_string("Transaction ID Response Control", "2.16.840.1.113730.3.4.11");
5857 oid_add_from_string("Proxied Authorization (version 1) control", "2.16.840.1.113730.3.4.12");
5858 oid_add_from_string("iPlanet Directory Server Replication Update Information Control", "2.16.840.1.113730.3.4.13");
5859 oid_add_from_string("iPlanet Directory Server search on specific backend control", "2.16.840.1.113730.3.4.14");
5860 oid_add_from_string("Authentication Response Control", "2.16.840.1.113730.3.4.15");
5861 oid_add_from_string("Authentication Request Control", "2.16.840.1.113730.3.4.16");
5862 oid_add_from_string("Real Attributes Only Request Control", "2.16.840.1.113730.3.4.17");
5863 oid_add_from_string("Proxied Authorization (version 2) Control", "2.16.840.1.113730.3.4.18");
5864 oid_add_from_string("Chaining loop detection", "2.16.840.1.113730.3.4.19");
5865 oid_add_from_string("iPlanet Replication Modrdn Extra Mods Control", "2.16.840.1.113730.3.4.999");
5868 oid_add_from_string("LDAP_SERVER_QUOTA_CONTROL_OID", "1.2.840.113556.1.4.1852");
5869 oid_add_from_string("LDAP_SERVER_RANGE_OPTION_OID", "1.2.840.113556.1.4.802");
5870 oid_add_from_string("LDAP_SERVER_SHUTDOWN_NOTIFY_OID", "1.2.840.113556.1.4.1907");
5871 oid_add_from_string("LDAP_SERVER_RANGE_RETRIEVAL_NOERR_OID", "1.2.840.113556.1.4.1948");
5874 dissector_add_string("ldap.name", "netlogon", create_dissector_handle(dissect_NetLogon_PDU
, proto_cldap
));
5875 dissector_add_string("ldap.name", "objectGUID", create_dissector_handle(dissect_ldap_guid
, proto_ldap
));
5876 dissector_add_string("ldap.name", "supportedControl", create_dissector_handle(dissect_ldap_oid
, proto_ldap
));
5877 dissector_add_string("ldap.name", "supportedCapabilities", create_dissector_handle(dissect_ldap_oid
, proto_ldap
));
5878 dissector_add_string("ldap.name", "objectSid", create_dissector_handle(dissect_ldap_sid
, proto_ldap
));
5879 dissector_add_string("ldap.name", "nTSecurityDescriptor", create_dissector_handle(dissect_ldap_nt_sec_desc
, proto_ldap
));
5882 /*--- Included file: packet-ldap-dis-tab.c ---*/
5883 #line 1 "./asn1/ldap/packet-ldap-dis-tab.c"
5884 register_ber_oid_dissector("1.2.840.113556.1.4.319", dissect_SearchControlValue_PDU
, proto_ldap
, "pagedResultsControl");
5885 register_ber_oid_dissector("1.2.840.113556.1.4.473", dissect_SortKeyList_PDU
, proto_ldap
, "sortKeyList");
5886 register_ber_oid_dissector("1.2.840.113556.1.4.474", dissect_SortResult_PDU
, proto_ldap
, "sortResult");
5887 register_ber_oid_dissector("1.2.840.113556.1.4.841", dissect_DirSyncControlValue_PDU
, proto_ldap
, "dirsync");
5888 register_ber_oid_dissector("1.3.6.1.4.1.4203.1.11.1", dissect_PasswdModifyRequestValue_PDU
, proto_ldap
, "passwdModifyOID");
5889 register_ber_oid_dissector("1.3.6.1.1.8", dissect_CancelRequestValue_PDU
, proto_ldap
, "cancelRequestOID");
5890 register_ber_oid_dissector("1.3.6.1.4.1.4203.1.9.1.1", dissect_SyncRequestValue_PDU
, proto_ldap
, "syncRequestOID");
5891 register_ber_oid_dissector("1.3.6.1.4.1.4203.1.9.1.2", dissect_SyncStateValue_PDU
, proto_ldap
, "syncStateOID");
5892 register_ber_oid_dissector("1.3.6.1.4.1.4203.1.9.1.3", dissect_SyncDoneValue_PDU
, proto_ldap
, "syncDoneOID");
5893 register_ber_oid_dissector("1.3.6.1.4.1.4203.1.9.1.4", dissect_SyncInfoValue_PDU
, proto_ldap
, "syncInfoOID");
5894 register_ber_oid_dissector("1.3.6.1.4.1.42.2.27.8.5.1", dissect_PasswordPolicyResponseValue_PDU
, proto_ldap
, "passwordPolicy");
5897 /*--- End of included file: packet-ldap-dis-tab.c ---*/
5898 #line 2343 "./asn1/ldap/packet-ldap-template.c"
5900 dissector_add_uint_range_with_preference("tcp.port", TCP_PORT_RANGE_LDAP
, ldap_handle
);
5902 dissector_add_uint("acdr.tls_application_port", 636, ldap_handle
);
5903 dissector_add_uint("acdr.tls_application", TLS_APP_LDAP
, ldap_handle
);
5907 prefs_register_ldap(void)
5909 if(ssl_port
!= global_ldaps_tcp_port
) {
5911 ssl_dissector_delete(ssl_port
, ldap_handle
);
5913 /* Set our port number for future use */
5914 ssl_port
= global_ldaps_tcp_port
;
5917 ssl_dissector_add(ssl_port
, ldap_handle
);
5923 * Editor modelines - https://www.wireshark.org/tools/modelines.html
5928 * indent-tabs-mode: nil
5931 * vi: set shiftwidth=2 tabstop=8 expandtab:
5932 * :indentSize=2:tabSize=8:noTabs=true: