o
    jD                     @   s  d dl Z d dlZd dlZd dlmZ d dlZd dlZd dlmZm	Z	 d dl
mZ d dlmZ d dlmZ d dlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z# d dl$m%Z%m&Z&m'Z'm(Z(m)Z) d d	l*m+Z+m,Z,m-Z-m.Z. zd dl/Z/d d
l/m0Z0m1Z1 W n	   e2d  g dZ3dZ4dZ5de4e5f Z6dZ7de6e7f Z8dZ9de6 Z:e ;dZ<e ;de8 e j=Z>e ;de8e9e:f e j=Z?e ;de9e:f e j=Z@d ZAdZBdZCdZDG dd dZEG dd deFZGG dd  d eHZIG d!d" d"eHZJG d#d$ d$eJZKdS )%    N)	unhexlify)encoderdecoder)SubstrateUnderrunError)noValue)LOG)FilterControlSimplePagedResultsControl
ResultCodeScopeDerefAliases	OperationKNOWN_CONTROLSCONTROL_PAGEDRESULTSNOTIFICATION_DISCONNECTKNOWN_NOTIFICATIONSBindRequestSearchRequestSearchResultDoneLDAPMessage
AddRequestModifyRequestModifyDNRequest
DelRequest)getNTLMSSPType1getNTLMSSPType3VERSIONhmac_md5NTLMAuthChallenge)SPNEGO_NegTokenInitSPNEGO_NegTokenRespSPNEGOCipher	TypesMech)SSLcryptoz*pyOpenSSL is not installed, can't continue)LDAPConnectionLDAPFilterSyntaxErrorLDAPFilterInvalidExceptionLDAPSessionErrorLDAPSearchErrorr	   r
   r   r   r   r   r   r   r   r   z(?:[a-z][a-z0-9\-]*)z)(?:(?:\d|[1-9]\d+)(?:\.(?:\d|[1-9]\d+))*)z	(?:%s|%s)z(?:(?:;[a-z0-9\-]+)*)z(%s%s)z(:dn)z	(?::(%s))z
([:<>~]?=)z^%s$z
^%s%s?%s?$z^(){0}%s?%s$         c                   @   s   e Zd Zd4ddZ		d5ddZd6d	d
Zdd Zdd Z		d7ddZdd Z	d8ddZ
d9ddZd:ddZd9ddZdd Zd9d d!Zd"d# Zd$d% Zd9d&d'Zd(d) Zd*d+ Zd,d- Zed.d/ Zed0d1 Zed2d3 ZdS );r&    NTc              
   C   sv  d| _ d| _d| _d| _|| _|| _|| _|dr(d| _d| _ |dd | _n3|dr>d| _d	| _ d| _|d
d | _n|drTd| _d| _ d| _|dd | _ntd| dd| _	d| _
d| _d| _d| _d| _d| _| jdury| j}n| j}td|| j| j | jf  zt|| jdtjd \}}}}	}
t|||| _W n tjy } ztd|| jf |d}~ww | j du r| j|
 dS ttj}|dd d}|| t|| j| _| j|
 | j  ddlm } | j! "d# }t$%|&dd}d}d}d}d| }t'|j(dddd}|}||7 }||7 }||7 }||7 }||" | _
dS )z
        LDAPConnection class

        :param string url:
        :param string baseDN:
        :param string dstIp:

        :return: a LDAP instance, if not raises a LDAPSessionError exception
        Fr   Nzldap://i     zldaps://i|  T   zgc://i     zUnknown URL prefix: '%s'errorStringz-Connecting to %s, port %d, SSL %s, signing %szConnection error (%s:%d)zALL:@SECLEVEL=0zutf-8i   )md5sha256:r.       s           s   tls-server-end-point:   little	byteordersigned))_SSL_dstPort_dstHost_socket_baseDN_dstIp_LDAPConnection__signing
startswithr)   _LDAPConnection__bindedchannel_binding_valuesequenceNumber_LDAPConnection__auth_type_LDAPConnection__gss_LDAPConnection__sessionKey#_LDAPConnection__spnego_cipher_blobr   debugsocketgetaddrinfoSOCK_STREAMerrorconnectr$   Context
TLS_METHODset_cipher_listencodeset_options
Connectiondo_handshakehashlibr4   get_peer_certificatedigestdecodebytesfromhexreplacelento_bytes)selfurlbaseDNdstIpsigning
targetHostafsocktypeproto_saectx(SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATIONr4   peer_cert_digest_strpeer_cert_digest_byteschannel_binding_structinitiator_addressacceptor_addressapplication_data_rawlen_application_dataapplication_data rx   /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/impacket/ldap/ldap.py__init__N   s~   




"


zLDAPConnection.__init__c           0      C   s  |dks|dkr0t |d rd| }t |d rd| }z
t|}t|}W n	 ty/   Y nw ddlm} ddlm}m}m}m	}m
} ddlm}m}m}m} ddlm}m}m} dd	lm} dd
lm}m}m} ddl}|dusv|	durxd}
d| j }|
r||||\}}}}	|||jjjd}|du r|	du r||||||||\}} }!}"n|d }|d } |d }"|	du r|||jj jd}#||#|||| |"\}$} }!}"n|	d }$|	d } |	d }"t! }%t"d g|%d< t#j$|$| dd }$| }&|&%|$d  | }'d|'d< t&|j'jj|'d< g }(|(|(|'d< ||'d|&j) | })d|)d< ||)d< ||)d|j* |j+|j,j-}*|*j.|)d< |)|*|)d< t/|)d< d |)d d!< | }+d"|+d#< ||B |+d$< | j0rg| j1durg| j1|+d%< | j2r{|+d$  |O  < |+d$  |O  < |+3 |)d d&< d|)d'< t45|)},| 6|"d(|,d}-t/|'d)< | j7|'d) d*< |-|'d) d< t45|'|%d+< t8 }.d,|.d-< d.|.d/< d0|.d1 d2 d3< |%3 |.d1 d2 d4< | 9|.d d5 }/|/d6 d7 t:d8krt;d9|/d6 d7 < |/d6 d: f d;d<| _=d=| _>| j2r|"| _?|| | _@d=S )>a6  
        logins into the target system explicitly using Kerberos. Hashes are used if RC4_HMAC is supported.

        :param string user: username
        :param string password: password for the user
        :param string domain: domain where the account is valid for (required)
        :param string lmhash: LMHASH used to authenticate using hashes (password is not used)
        :param string nthash: NTHASH used to authenticate using hashes (password is not used)
        :param string aesKey: aes256-cts-hmac-sha1-96 or aes128-cts-hmac-sha1-96 used for Kerberos authentication
        :param string kdcHost: hostname or IP Address for the KDC. If None, the domain will be used (it needs to resolve tho)
        :param struct TGT: If there's a TGT available, send the structure here and it will be used
        :param struct TGS: same for TGS. See smb3.py for the format
        :param bool useCache: whether or not we should use the ccache for credentials lookup. If TGT or TGS are specified this is False

        :return: True, raises a LDAPSessionError if error.
        r.   r,   0r   )CCache)GSSAPIGSS_C_CONF_FLAGGSS_C_INTEG_FLAGGSS_C_SEQUENCE_FLAGGSS_C_REPLAY_FLAG)AP_REQAuthenticatorTGS_REPseq_set)getKerberosTGTgetKerberosTGSCheckSumField)	constants)	PrincipalKerberosTimeTicketNFzldap/%s)typeKDC_REPcipher
sessionKeyzMS KRB5 - Microsoft Kerberos 5	MechTypesasn1Specticketr1   pvnozmsg-typez
ap-optionszauthenticator-vnocrealmcnamecusecctimecksumi  	cksumtype   LgthFlagsBndchecksumz
seq-number   authenticatoretype	MechTokenr-   versionusername
GSS-SPNEGOauthenticationsasl	mechanismcredentials
protocolOpbindResponse
resultCodesuccessError in bindRequest -> %s: %sdiagnosticMessager2   KRB5T)Ar`   r   	TypeErrorimpacket.krb5.ccacher|   impacket.krb5.gssapir}   r~   r   r   r   impacket.krb5.asn1r   r   r   r   impacket.krb5.kerberosv5r   r   r   impacket.krb5r   impacket.krb5.typesr   r   r   datetimer?   	parseFilePrincipalNameTypeNT_PRINCIPALvalueNT_SRV_INSTr    r#   r   r\   	from_asn1intApplicationTagNumbersencodeFlagsto_asn1components_to_asn1nowtimezoneutcmicrosecondr   r=   rF   rC   getDatar   rU   encryptenctyper   sendReceiver   r)   prettyPrintrH   rE   rJ   rI   )0rb   r   passworddomainlmhashnthashaesKeykdcHostTGTTGSuseCacher|   r}   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   
targetNameuserNametgtr   oldSessionKeyr   
serverNametgsblobr   apReqoptsr   r   chkFieldencodedAuthenticatorencryptedEncodedAuthenticatorbindRequestresponserx   rx   ry   kerberosLogin   s   





zLDAPConnection.kerberosLoginr   c                 C   s  t  }d|d< |dkr8d|v r|d | |d< n|r#|d | |d< n||d< ||d d< | |d	 d
 }n|dkrQ||d< d|d d< | |d	 d
 }n|dkr|dks]|dkrt|d rgd| }t|d rqd| }z
t|}t|}W n	 ty   Y nw ||d< td|}	|	 |d d< | |d	 d
 }|d d tdkrtd|d d 	 |d d f d|d d }
d}| j
r| jdur| j}t|	t|
||||||d\}}| |d d< | |d	 d
 }n0|dkr|dks|dkr,t|d rd| }t|d rd| }z
t|}t|}W n
 ty+   Y nw d|d< t | _d\| jd< | jd< | jd< td|| jd | jd!}	t }td" g|d#< |	 |d$< d%|d d d&< | |d d d'< | |d	 d
 }|d d td(krtd|d d 	 |d d f d|d d) }t| }|d* }
d}| j
r| jdur| j}t|	|
|||||d+| jd |d,\}}t||	 t|
  |  }||d-< t }| |d*< | jrt|	d. |d/| _| jjd0d	d d1 |d2< d%|d d d&< | |d d d'< | |d	 d
 }ntd3| d|d d tdkr@td4|d d 	 |d d f dd5| | _d | _d S )6a)  
        logins into the target system

        :param string user: username
        :param string password: password for the user
        :param string domain: domain where the account is valid for
        :param string lmhash: LMHASH used to authenticate using hashes (password is not used)
        :param string nthash: NTHASH used to authenticate using hashes (password is not used)
        :param string authenticationChoice: type of authentication protocol to use (default NTLM)

        :return: True, raises a LDAPSessionError if error.
        r-   r   simple.@r   \r   r   r   sicilyPackageDiscoveryr.   sicilyNegotiater,   r{   r   r   r   zCError in bindRequest during the NTLMAuthNegotiate request -> %s: %sr   r2   	matchedDNr7   N)rF   sicilyResponser   )
   r   iaJ  ProductMajorVersionProductMinorVersionProductBuildT)signingRequired
use_ntlmv2r   z2NTLMSSP - Microsoft NTLM Security Support Providerr   r   r   r   r   saslBindInProgressserverSaslCredsResponseTokenldap)servicer   r   rF   MICflags)r   randomSessionKeys   0
+7
)reset_ciphermechListMICz"Unknown authenticationChoice: '%s'r   zNTLM-)r   r   r`   r   r   r   r   r   r)   r   r=   rF   r   r]   r   r   rC   r    r#   r!   asOctetsr   r   r"   rK   signrH   rE   )rb   r   r   r   r   r   authenticationChoicer   r   	negotiatetype2rF   type3exportedSessionKeyr   r   spnegoTokenRespnewmicrx   rx   ry   loginB  s   

 

$"
zLDAPConnection.loginc                 C   s   | j dkr#| j| j|| j\}}|| }t|jdddd| }|S | j dkrD| j|\}}|	 | }t|jdddd| }|S d| j  d)	Nr   r8   bigFr:   	NTLM-saslzEncryption not implemented for 	 protocol)
rH   rI   GSS_Wrap_LDAPrJ   rG   r`   ra   rK   r   r   )rb   data	signaturerx   rx   ry   r     s   

zLDAPConnection.encryptc                 C   sl   | j dkr|dd  }| jj| j|ddd\}}|S | j dkr/|dd  }| j|\}}|S d| j  d)	Nr   r8   r   init)	directionr  zDecryption not implemented for r  )rH   rI   GSS_Unwrap_LDAPrJ   rK   decrypt)rb   r  rk   r  rx   rx   ry   r    s   

zLDAPConnection.decryptr   F(objectClass=*)c                 C   sX  t |tjstdtjt|f |d u r| j}|d u r td}|d u r(td}|d u r.g }t }||d< ||d< ||d< ||d< ||d< ||d	< | 	||d
< |d j
|  d}g }|s| ||	}|D ]B}|d  }|t r|d tdkr| |	|d }qett|d d|d  |d f |d|
d u r|| qe|
| qe|r]|S )NzsearchFilter must be %s, got %swholeSubtreeneverDerefAliases
baseObjectscopederefAliases	sizeLimit	timeLimit	typesOnlyfilter
attributesFr   r   r   controlsz Error in searchRequest -> %s: %sr   )rP   r3   answers)
isinstancesix	text_typer(   r   rA   r   r   r   _parseFiltersetComponentsr   getComponentisSameTypeWithr   r   _handleControlsr*   r   r   append)rb   
searchBaser  r  r  r  r  searchFilterr  searchControlsperRecordCallbacksearchRequestdoner   r   messagesearchResultrx   rx   ry   search  sP   

zLDAPConnection.searchc                 C   s   d}|d urK|D ]B}|d urJ|D ]9}t |d tkrHt |d tkrGt|ddur8tjt|tt  dd }| r>d}|	|   nq	 qq|S )NTcontrolType	getCookier   r   F)
strr   hasattrr   r\   r   rU   r   r4  	setCookie)rb   requestControlsresponseControlsr/  requestControlresponseControlrx   rx   ry   r(    s*   
zLDAPConnection._handleControlsc           
      C   s  t  }||d< d|d d d< |d d d j|  d}| D ]:\}}||d | d< t|trB|d | d jdd	 |D   n|d | d t|trSt|n| |d7 }q | ||d d
 }	|	d d tdkrt	t|	d d d|	d d 
  d|	d d  ddS )a  
        Add an entry to the LDAP directory.

        :param dn: Distinguished Name of the entry to add
        :param objectClass: Tuple or list of object classes for the entry
        :param attributes: Dictionary of attributes for the entry
        :param controls: LDAP controls to include in the request
        :return: True if the entry was added successfully, else raises LDAPSessionError
        entryobjectClassr  r   r   valsr+   c                 s   s&    | ]}t |trt|n|V  qd S Nr!  r   r5  .0valrx   rx   ry   	<genexpr>=  s   $ z%LDAPConnection.add.<locals>.<genexpr>r   addResponser   r   zError in addRequest -> : r   rP   r3   T)r   r%  itemsr!  listr   r5  r   r   r)   r   )
rb   dnr=  r  r  
addRequestindexkeyr   r   rx   rx   ry   add*  s$   

"(
"zLDAPConnection.addc                 C   s`  t  }||d< d}| D ]p\}}|D ]i}|d ttttfvr-td|d  d| dd|d |d | d< ||d | d	 d
< g }	t|d trW|		dd |d D  n|	
t|d trft|d n|d  |d | d	 d j|	  |d7 }qq| ||d d }
|
d d tdkrtt|
d d d|
d d   d|
d d  ddS )a  
        Modify an entry in the LDAP directory.
        RFC 4511 Section 4.6

        :param dn: Distinguished Name of the entry to modify
        :param modifications: Dictionary of modifications of form {attribute: [(operation, values), ...]}.
                Operation: 0 - add, 1 - delete, 2 - replace, 3 - increment.
                Values: single value or list of values.
        :param controls: LDAP controls to include in the request
        :return: True if the entry was modified successfully, else raises LDAPSessionError
        objectr   z Invalid modification operation 'z' for attribute ''r2   changes	operationmodificationr   r+   c                 S   s"   g | ]}t |trt|n|qS rx   r@  rA  rx   rx   ry   
<listcomp>f  s   " z)LDAPConnection.modify.<locals>.<listcomp>r>  r   modifyResponser   r   zError in modifyRequest -> rF  r   rG  T)r   rH  
MODIFY_ADDMODIFY_DELETEMODIFY_REPLACEMODIFY_INCREMENTr)   r!  rI  extendr)  r   r5  r%  r   r   r   )rb   rJ  modificationsr  modifyRequestidxattropsopr>  r   rx   rx   ry   modifyJ  s.   (
"zLDAPConnection.modifyc                 C   s   t  }||d< ||d< ||d< |dur||d< | ||d d }|d d	 td
krGtt|d d	 d|d d	   d|d d  ddS )a,  
        Modify the Distinguished Name of an entry in the LDAP directory.
        RFC 4511 Section 4.9

        :param dn: Current Distinguished Name of the entry
        :param newrdn: New Relative Distinguished Name for the entry
        :param deleteoldrdn: Whether to delete the old RDN from the entry
        :param newSuperior: New superior DN if moving the entry to a different container
        :param controls: LDAP controls to include in the request
        :return: True if the DN was modified successfully, else raises LDAPSessionError
        r<  newrdndeleteoldrdnNnewSuperiorr   r   modDNResponser   r   zError in modifyDNRequest -> rF  r   rG  T)r   r   r   r)   r   r   )rb   rJ  rb  rc  rd  r  modifyDNRequestr   rx   rx   ry   	modify_dnt  s   "zLDAPConnection.modify_dnc                 C   sl   t |}| ||d d }|d d tdkr4tt|d d d|d d   d|d d  d	d
S )a0  
        Delete an entry from the LDAP directory.
        RFC 4511 Section 4.8

        :param dn: Distinguished Name of the entry to delete
        :param controls: LDAP controls to include in the request
        :return: True if the entry was deleted successfully, else raises LDAPSessionError
        r   r   delResponser   r   zError in deleteRequest -> rF  r   rG  T)r   r   r   r)   r   r   )rb   rJ  r  deleteRequestr   rx   rx   ry   delete  s   	"zLDAPConnection.deletec                 C   s   | j d ur| j   d S d S r?  )r@   closerb   rx   rx   ry   rk    s   
zLDAPConnection.closec                 C   sz   t  }tdd|d< |d | | |d ur |d j|  t|}| jr7| j	r7| 
|}|  jd7  _| j|S )Nr+   i	messageIDr   r  )r   random	randrangesetComponentByType	getTagSetr%  r   rU   rE   rC   r   rG   r@   sendall)rb   requestr  r0  r  rx   rx   ry   send  s   

zLDAPConnection.sendc                 C   s   d}d}d}|s| j |}t||k rd}||7 }|r| jr[| jr[td|d d d }|t|d krVd}|sN| j |}t||k rHd}||7 }|r:|t|d ks6| |}|S )Ni    r7   FTz!Ir8   r   )r@   recvr`   rE   rC   structunpackr  )rb   REQUEST_SIZEr  r/  recvDatamessage_lengthrx   rx   ry   recv_raw  s,   
zLDAPConnection.recv_rawc                 C   s   g }|   }t|dkrxztj|t d\}}W n ty'   ||    }Y nIw |d dkrk|d d d p9|d }t|d| }|tkrJ| 	  t
t|d d d d	||d d d  |d d d
 f d|| |}t|dks|S )Nr   r   rm  r   extendedRespresponseNamezUnsolicited Notification '%s'r   z%s -> %s: %sr   rG  )r{  r`   r   r\   r   r   r   getr   rk  r)   r   r   r)  )rb   r   r  r0  	remainingr   notificationrx   rx   ry   ru    s0   
zLDAPConnection.recvc                 C   s   |  || |  S r?  )rt  ru  )rb   rs  r  rx   rx   ry   r     s   zLDAPConnection.sendReceivec                 C   s.   t t|}| |}|rtd|d  |S )Nunexpected token: '%s')rI  reversed_consumeCompositeFilterr'   )rb   	filterStr
filterListr+  rx   rx   ry   r$    s
   
zLDAPConnection._parseFilterc                 C   s  z|  }W n ty   tdw |dkr!|| td| z|  }W n ty2   tdw |dvrC|||g | |S g }	 z
|| | W n	 tyY   Y nw qFz|  }W n tyl   tdw |dkr||| td| | ||S )NEOL while parsing search filter(r  )!&|T))pop
IndexErrorr'   r)  rZ  _consumeSimpleFilterr  _compileCompositeFilter)rb   r  coperatorfiltersrx   rx   ry   r    sB   


z&LDAPConnection._consumeCompositeFilterc                 C   s   z|  }W n ty   tdw |dkr!|| td| g }	 z|  }W n ty5   tdw |dkr;n|dkrH|| td|| q$d|}zt|d\}}}W n tyk   td	| w | 	|||S )
Nr  r  r  Tr  zunexpected token: '('r.   r+   zinvalid filter: '(%s)')
r  r  r'   r)  joinRE_OPERATORsplit
ValueErrorr(   _compileSimpleFilter)rb   r  r  r  r  	attributer  r   rx   rx   ry   r    s:   



z#LDAPConnection._consumeSimpleFilterc                 C   s   t  }| dkrt|dkrtd|d j|  |S | dkr1t|dkr(td|d j|  |S | d	krFt|dkr?td
|d j|  |S )Nr  r+   z*'not' filter must have exactly one elementnotr  r   z+'and' filter must have at least one elementandr  z*'or' filter must have at least one elementor)r   r`   r(   r%  )r  r  r+  rx   rx   ry   r  5  s    
z&LDAPConnection._compileCompositeFilterc                 C   s  t  }|dkrEt| pt| }|std|  | \} }}| r(| |d d< |r2t||d d< |r:||d d< t||d d< |S t	| sPtd|  |dkr^|d	kr^| |d
< |S d|v r|d	krdd |
dD }|d d  }g }	|d r|	| d|d  |dd D ]}
|	| d|
 q|d r|	| d|d  | |d d< |d d j|	  |S d|vrt|}|d	kr|d | | |S |dkr|d | | |S |dkr|d | | |S |dkr|d | | |S td| ||f )Nz:=zinvalid filter attribute: '%s'extensibleMatchr   dnAttributesmatchingRule
matchValue*=presentc                 S   s   g | ]}t |qS rx   )r&   _processLdapString)rB  	assertionrx   rx   ry   rT  \  s    z7LDAPConnection._compileSimpleFilter.<locals>.<listcomp>
substringsr   initialr+   r  anyfinalequalityMatchz~=approxMatchz>=greaterOrEqualz<=lessOrEqualzinvalid filter '(%s%s%s)')r   RE_EX_ATTRIBUTE_1matchRE_EX_ATTRIBUTE_2r(   groupsboolr&   r  RE_ATTRIBUTEr  getComponentTyper)  clonesetComponentByNamer%  )r  r  r   r+  r  rJ  r  
assertionschoicer  r  rx   rx   ry   r  G  s^   




z#LDAPConnection._compileSimpleFilterc                 C   s    dd }t d}t |||S )Nc                 S   s   t t| ddS )Nr+   r   )chrr   group)r  rx   rx   ry   replace_escaped_charsy  s   z@LDAPConnection._processLdapString.<locals>.replace_escaped_charsz\\([0-9a-fA-F]{2}))recompilesub)clsldapstrr  escaped_charsrx   rx   ry   r  w  s   
z!LDAPConnection._processLdapString)r.   NT)r.   r.   r.   r.   NNNT)r.   r.   r.   r.   r.   r   )
NNNr   r   Fr  NNN)NNr?  )TNN)__name__
__module____qualname__rz   r   r	  r   r  r2  r(  rN  ra  rg  rj  rk  rt  r{  ru  r   r$  r  r  staticmethodr  r  classmethodr  rx   rx   rx   ry   r&   M   s@    
^
 
 

2

 
*


" 

/r&   c                   @      e Zd ZdS )r'   Nr  r  r  rx   rx   rx   ry   r'         r'   c                   @   r  )r(   Nr  rx   rx   rx   ry   r(     r  r(   c                   @   s:   e Zd ZdZdddZdd Zdd	 Zd
d Zdd ZdS )r)   z9
    This is the exception every client should catch
    r   r.   c                 C   s    t |  || _|| _|| _d S r?  )	Exceptionrz   rP   packetr3   )rb   rP   r  r3   rx   rx   ry   rz     s   

zLDAPSessionError.__init__c                 C      | j S r?  )rP   rl  rx   rx   ry   getErrorCode     zLDAPSessionError.getErrorCodec                 C   r  r?  )r  rl  rx   rx   ry   getErrorPacket  r  zLDAPSessionError.getErrorPacketc                 C   r  r?  r2   rl  rx   rx   ry   getErrorString  r  zLDAPSessionError.getErrorStringc                 C   r  r?  r2   rl  rx   rx   ry   __str__  r  zLDAPSessionError.__str__N)r   r   r.   )	r  r  r  __doc__rz   r  r  r  r  rx   rx   rx   ry   r)     s    
r)   c                   @   s   e Zd ZdddZdd ZdS )	r*   r   r.   Nc                 C   s&   t | ||| |d u rg }|| _d S r?  )r)   rz   r   )rb   rP   r  r3   r   rx   rx   ry   rz     s   
zLDAPSearchError.__init__c                 C   r  r?  )r   rl  rx   rx   ry   
getAnswers  r  zLDAPSearchError.getAnswers)r   r   r.   N)r  r  r  rz   r  rx   rx   rx   ry   r*     s    
r*   )Lr  rv  rM   binasciir   rn  r"  pyasn1.codec.berr   r   pyasn1.errorr   pyasn1.type.univr   impacketr   impacket.ldap.ldapasn1r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   impacket.ntlmr   r   r   r   r   impacket.spnegor    r!   r"   r#   OpenSSLr$   r%   critical__all__DESCRIPTIONNUMERIC_OIDOIDOPTIONS	ATTRIBUTEDNMATCHING_RULEr  r  Ir  r  r  rV  rW  rX  rY  r&   SyntaxErrorr'   r  r(   r)   r*   rx   rx   rx   ry   <module>   s\   T

      9