
    h%=                        d Z ddlZddlmZ ddlmZmZ ddlmZm	Z	m
Z
 ddlmZ ddlmZ ddlmZmZmZ dd	lmZ dd
lmZmZmZmZ ddlmZ ddlmZmZmZm Z   G d de	          Z! G d de          Z" G d de          Z# G d de          Z$i Z%i Z& G d de          Z' G d de          Z( G d de          Z)dZ*dZ+dZ,dZ-de+z  Z.de+z  Z/de+z  Z0de,z  Z1de,z  Z2de,z  Z3d e,z  Z4d!e,z  Z5d"e,z  Z6e6Z7d#e,z  Z8d$e,z  Z9d%e,z  Z:d&e,z  Z;d'e,z  Z<d(e,z  Z=d)e,z  Z>d*e,z  Z?d+e,z  Z@de,z  ZAd,e,z  ZBd-e,z  ZCde-dz   z  ZDde-dz   z  ZEde-dz   z  ZFde-dz   z  ZGde-d z   z  ZHi dd.dd/dd0dd1d d2d!d3d"d4d#d5d$d6d%d7d&d8d'd9d(d:d)d;d*d<d+d=dd>d?d@dAdBdCdDZI G dE dFe          ZJ G dG dHe          ZK G dI dJe          ZL G dK dL          ZMdS )Ma  
Generic Security Services (GSS) API

Implements parts of:

    - GSSAPI: RFC4121 / RFC2743
    - GSSAPI C bindings: RFC2744

This is implemented in the following SSPs:

    - :class:`~scapy.layers.ntlm.NTLMSSP`
    - :class:`~scapy.layers.kerberos.KerberosSSP`
    - :class:`~scapy.layers.spnego.SPNEGOSSP`
    - :class:`~scapy.layers.msrpce.msnrpc.NetlogonSSP`

.. note::
    You will find more complete documentation for this layer over at
    `GSSAPI <https://scapy.readthedocs.io/en/latest/layers/gssapi.html>`_
    N)	dataclass)IntEnumIntFlag)ASN1_SEQUENCEASN1_Class_UNIVERSALASN1_Codecs)BERcodec_SEQUENCE)conf)	ASN1F_OIDASN1F_PACKETASN1F_SEQUENCE)ASN1_Packet)FieldLenFieldLEIntEnumFieldPacketFieldStrLenField)Packet)AnyListOptionalTuplec                       e Zd ZdZdZdS )ASN1_Class_GSSAPIGSSAPI`   N)__name__
__module____qualname__nameAPPLICATION     W/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/layers/gssapi.pyr   r   ?   s        DKKKr"   r   c                       e Zd Zej        ZdS )ASN1_GSSAPI_APPLICATIONNr   r   r   r   r    tagr!   r"   r#   r%   r%   D           

'CCCr"   r%   c                       e Zd Zej        ZdS )BERcodec_GSSAPI_APPLICATIONNr&   r!   r"   r#   r*   r*   H   r(   r"   r*   c                       e Zd Zej        ZdS )ASN1F_GSSAPI_APPLICATIONN)r   r   r   r   r    ASN1_tagr!   r"   r#   r,   r,   L   s         ,HHHr"   r,   c            	       |    e Zd Zej        Z e edd           edddd                     Z	e
dd            ZdS )	GSSAPI_BLOBMechType1.3.6.1.5.5.2
innerTokenNc                 `    t                               | j        j        t          j                  S N)_GSSAPI_OIDSgetr0   valr
   	raw_layerpkts    r#   <lambda>zGSSAPI_BLOB.<lambda>b   s    L$4$4S\5Et~$V$V r"   next_cls_cbc                     |r\t          |          dk    rIt          |d d                   dz  dk    rddlm} |S |d d         dk    rddlm}  |j        |d|i|S | S )	N      r   )SPNEGO_negToken   s   NTLMSSP)NTLM_Header_pkt)lenordscapy.layers.spnegorA   scapy.layers.ntlmrC   dispatch_hook)clsrD   argskargsrA   rC   s         r#   rI   zGSSAPI_BLOB.dispatch_hookf   s     	LCIINN48}}t#t++??????
 '&BQBx:%%999999 1{0TKdKUKKK
r"   r4   r   r   r   r   BER
ASN1_codecr,   r   r   	ASN1_rootclassmethodrI   r!   r"   r#   r/   r/   Z   s        J((	*o..VV		
 	
 	
 I    [  r"   r/   c            	       |    e Zd Zej        Z e edd           edddd                     Z	e
dd            ZdS )	GSSAPI_BLOB_SIGNATUREr0   r1   r2   Nc                 `    t                               | j        j        t          j                  S r4   )_GSSAPI_SIGNATURE_OIDSr6   r0   r7   r
   r8   r9   s    r#   r;   zGSSAPI_BLOB_SIGNATURE.<lambda>   s#    $:$>$> $.% % r"   r<   c                     |rPt          |          dk    r=|d d         dv rddlm} |S t          |          dk    r|d d         dk    rddlm} |S | S )N   )s   s   r   )KRB_InnerToken   s      )NTLMSSP_MESSAGE_SIGNATURE)rE   scapy.layers.kerberosrX   rH   rZ   )rJ   rD   rK   rL   rX   rZ   s         r#   rI   z#GSSAPI_BLOB_SIGNATURE.dispatch_hook   s     
	1CIINN BQBx555@@@@@@%%TaD!H0C$C$CGGGGGG00
r"   r4   rM   r!   r"   r#   rS   rS   |   s        J((	*o.. 		
 	
 	

 
I    [  r"   rS   c                   2     e Zd ZdZdgZ fdZ fdZ xZS )_GSSAPI_Fieldzt
    PacketField that contains a GSSAPI_BLOB_SIGNATURE, but one that can
    have a payload when not encrypted.
    pay_clsc                 f    || _         t                                          |d t                     d S r4   )r^   super__init__rS   )selfr   r^   	__class__s      r#   ra   z_GSSAPI_Field.__init__   s9    !	
 	
 	
 	
 	
r"   c                     t                                          ||          \  }}|r |r|                     |          |_        d|fS ||fS )Nr"   )r`   getfieldr^   payload)rb   r:   sremainr7   rc   s        r#   re   z_GSSAPI_Field.getfield   sU    gg&&sA.. 	c 	,,v..CK8Os{r"   )r   r   r   __doc__	__slots__ra   re   __classcell__)rc   s   @r#   r]   r]      sd          I
 
 
 
 
        r"   r]         r?   rW      rY         rB      	   
                        GSS_C_AF_UNSPECGSS_C_AF_LOCALGSS_C_AF_INETGSS_C_AF_IMPLINKGSS_C_AF_PUPGSS_C_AF_CHAOSGSS_C_AF_NSGSS_C_AF_NBSGSS_C_AF_ECMAGSS_C_AF_DATAKITGSS_C_AF_CCITTGSS_C_AF_SNAGSS_C_AF_DECnetGSS_C_AF_DLIGSS_C_AF_LATGSS_C_AF_HYLINKGSS_C_AF_APPLETALKGSS_C_AF_BSCGSS_C_AF_DSSGSS_C_AF_OSIGSS_C_AF_X25GSS_C_AF_NULLADDR)ry   rz            c                   T    e Zd ZdZ edddd           eddd 	          gZd
 ZdS )GssBufferDescgss_buffer_desclengthNvaluez<I)	length_offmt c                     | j         S r4   )r   r9   s    r#   r;   zGssBufferDesc.<lambda>  s     r"   )length_fromc                     t           j        S r4   )r
   padding_layer)rb   rf   s     r#   default_payload_classz#GssBufferDesc.default_payload_class
  s    !!r"   )r   r   r   r   r   r   fields_descr   r!   r"   r#   r   r     s]        DhTBBBGR-C-CDDDK
" " " " "r"   r   c            	           e Zd ZdZ edde           ed e            e           edde           ed e            e           edde          gZdS )	GssChannelBindingsgss_channel_bindings_structinitiator_addrtyper   initiator_addressacceptor_addrtypeacceptor_addressapplication_dataN)	r   r   r   r   r   _GSS_ADDRTYPEr   r   r   r!   r"   r#   r   r     s        (D+Q>>'-HH*A}==&GG&m<<KKKr"   r   c                   6    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdS )GSS_C_FLAGSz3
    Authenticator Flags per RFC2744 req_flags
    r?   rW   rY   rq   rm       i   i    i @  N)r   r   r   ri   GSS_C_DELEG_FLAGGSS_C_MUTUAL_FLAGGSS_C_REPLAY_FLAGGSS_C_SEQUENCE_FLAGGSS_C_CONF_FLAGGSS_C_INTEG_FLAGGSS_C_DCE_STYLEGSS_C_IDENTIFY_FLAGGSS_C_EXTENDED_ERROR_FLAGr!   r"   r#   r   r     sP          OO  &r"   r   c                      e Zd ZdZdZd Zd Z G d d          Z G d de          Z	e
j        	 d)d
edee         fd            Ze
j        d*d
efd            Ze
j        d*d
efd            Zd+d
efdZe G d d                      Ze
j        	 d,d
edee         dedeee         ef         fd            Ze
j        d
edee         dee         fd            Ze G d d                      Ze
j        	 d,d
edee         dedefd            Ze
j        d
edee         dd	fd            Ze
j        d
efd            Zd,d
ededefdZd
edefdZ 	 d,d
ed ed!e!defd"Z"d
efd#Z#d$ Z$d
efd%Z%d& Z&d' Z'd
efd(Z(d	S )-SSPz
    The general SSP class
    r   c                 n    |r2t          dd                    t          |                    z             d S )NzUnknown SSP parameters: ,)
ValueErrorjoinlist)rb   kwargss     r#   ra   zSSP.__init__4  s=     	R7#((4<<:P:PPQQQ	R 	Rr"   c                      d| j         j        z  S )Nz<%s>)rc   r   rb   s    r#   __repr__zSSP.__repr__8  s    ///r"   c                   v    e Zd ZdZg dZd
dee         fdZd Ze	d             Z
e
j        d             Z
d	 ZdS )SSP.CONTEXTzO
        A Security context i.e. the 'state' of the secure negotiation
        )state_flagspassiveN	req_flagsc                 X    |t           j        t           j        z  }|| _        d| _        d S )NF)r   r   r   flagsr   )rb   r   s     r#   ra   zSSP.CONTEXT.__init__B  s4       9!34  #DJ DLLLr"   c                     d S r4   r!   r   s    r#   
clifailurezSSP.CONTEXT.clifailureL  s    Dr"   c                     | j         S r4   )r   r   s    r#   r   zSSP.CONTEXT.flagsR  s
    ;r"   c                 H    t          t          |                    | _        d S r4   )r   intr   )rb   xs     r#   r   zSSP.CONTEXT.flagsV  s    %c!ff--DKKKr"   c                     dS )Nz[Default SSP]r!   r   s    r#   r   zSSP.CONTEXT.__repr__Z  s    "?r"   r4   )r   r   r   ri   rj   r   r   ra   r   propertyr   setterr   r!   r"   r#   CONTEXTr   ;  s        	 	 322		! 	!h{&; 	! 	! 	! 	!	 	 	 
	 	 
	 
	. 	. 
	.	# 	# 	# 	# 	#r"   r   c                       e Zd ZdZdS )	SSP.STATEz<
        An Enum that contains the states of an SSP
        N)r   r   r   ri   r!   r"   r#   STATEr   ]  s        	 	 	 	r"   r   NContextr   c                     t           )zD
        GSS_Init_sec_context: client-side call for the SSP
        NotImplementedError)rb   r   r7   r   s       r#   GSS_Init_sec_contextzSSP.GSS_Init_sec_contextb  s
     "!r"   c                     t           )zF
        GSS_Accept_sec_context: server-side call for the SSP
        r   rb   r   r7   s      r#   GSS_Accept_sec_contextzSSP.GSS_Accept_sec_contextk  
    
 "!r"   c                     t           )zM
        GSS_Passive: client/server call for the SSP in passive mode
        r   r   s      r#   GSS_PassivezSSP.GSS_Passivet  r   r"   Fc                     dS )zW
        GSS_Passive_set_Direction: used to swap the direction in passive mode
        Nr!   )rb   r   
IsAcceptors      r#   GSS_Passive_set_DirectionzSSP.GSS_Passive_set_Direction{  s	     	r"   c                   .    e Zd ZU eed<   eed<   eed<   dS )SSP.WRAP_MSGconf_req_flagsigndataNr   r   r   bool__annotations__bytesr!   r"   r#   WRAP_MSGr     s.         


r"   r   msgsqop_reqreturnc                     t           )z
        GSS_WrapEx

        :param Context: the SSP context
        :param qop_req: int (0 specifies default QOP)
        :param msgs: list of WRAP_MSG

        :returns: (data, signature)
        r   rb   r   r   r   s       r#   
GSS_WrapExzSSP.GSS_WrapEx  
     "!r"   c                     t           )z
        :param Context: the SSP context
        :param msgs: list of WRAP_MSG
        :param signature: the signature

        :raises ValueError: if MIC failure.
        :returns: data
        r   rb   r   r   	signatures       r#   GSS_UnwrapExzSSP.GSS_UnwrapEx  s
     "!r"   c                   $    e Zd ZU eed<   eed<   dS )SSP.MIC_MSGr   r   Nr   r!   r"   r#   MIC_MSGr     s"         


r"   r   c                     t           )z
        GSS_GetMICEx

        :param Context: the SSP context
        :param qop_req: int (0 specifies default QOP)
        :param msgs: list of VERIF_MSG

        :returns: signature
        r   r   s       r#   GSS_GetMICExzSSP.GSS_GetMICEx  r   r"   c                     t           )z
        :param Context: the SSP context
        :param msgs: list of VERIF_MSG
        :param signature: the signature

        :raises ValueError: if MIC failure.
        r   r   s       r#   GSS_VerifyMICExzSSP.GSS_VerifyMICEx  s
     "!r"   c                     t           )z
        Returns the Maximum Signature length.

        This will be used in auth_len in DceRpc5, and is necessary for
        PFC_SUPPORT_HEADER_SIGN to work properly.
        r   rb   r   s     r#   MaximumSignatureLengthzSSP.MaximumSignatureLength  s
     "!r"   messagec                 ^    |                      ||                     d|          g|          S )NTr   r   r   )r   r   )rb   r   r  r   s       r#   
GSS_GetMICzSSP.GSS_GetMIC  sH            ! 	
 	
 		
r"   c                 `    |                      ||                     d|          g|           d S )NTr  )r   r   )rb   r   r  r   s       r#   GSS_VerifyMICzSSP.GSS_VerifyMIC  sM         		
 		
 		
 		
 		
r"   input_messager   c                     |                      ||                     |d|          g|          \  }}|d         j        r||d         j        z  }|S )NTr   r   r   r  r   )r   r   r   )rb   r   r  r   r   _msgsr   s          r#   GSS_WrapzSSP.GSS_Wrap  ss      ??"/&     + 

 

y 8= 	'q&Ir"   c                 0   d}|j         rU|j         j        r|j         j        }nt          |j                   }|                                }|                                 |                     ||                     dd|          g|          d         j        S )Nr"   Tr  r   )rf   originalr   copyremove_payloadr   r   r   )rb   r   r   r   s       r#   
GSS_UnwrapzSSP.GSS_Unwrap  s     	'  ) 0 (1Y.//!((I$$&&&  "&    

 

 
 
	r"   c                     dS )zF
        Server-Initiation
        See [MS-SPNG] sect 3.2.5.2
        NNr!   r   s    r#   NegTokenInit2zSSP.NegTokenInit2   s	    
 zr"   c                     dS )zD
        Returns whether or not mechListMIC can be computed
        Fr!   r  s     r#   canMechListMICzSSP.canMechListMIC'  s	     ur"   c                 H    t          |                     ||                    S )z%
        Compute mechListMIC
        )r   r  )rb   r   inputs      r#   getMechListMICzSSP.getMechListMIC-  s      T__We44555r"   c                 0    |                      |||          S )z$
        Verify mechListMIC
        )r
  )rb   r   otherMICr  s       r#   verifyMechListMICzSSP.verifyMechListMIC3  s     !!'5(;;;r"   c                     dS )z
        Returns the amount of 'legs' (how MS calls it) of the SSP.

        i.e. 2 for Kerberos, 3 for NTLM and Netlogon
        rW   r!   r  s     r#   
LegsAmountzSSP.LegsAmount9  s	     qr"   r  r4   )F)r   ))r   r   r   ri   	auth_typera   r   r   r   r   abcabstractmethodr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r  r
  r   r  r  r  r  r  r  r!  r!   r"   r#   r   r   -  s/         IR R R0 0 0 #  #  #  #  #  #  #  #D       
 	MQ" ""5=k5J" " " " 	" "g " " " " 	" "7 " " " "             Y
 	EF" ""&*8n"?B"	tH~s"	#" " " " 	""&*8n"	h" " " "        Y 	DE" ""&*7m">A"	" " " " 	"w "d7m "SW " " " " 	"g " " " "

 

' 

E 

C 

 

 

 



W 

u 

 

 

 

&    	
    0'    2  g    6 6 6< < <'      r"   r   )Nri   r#  dataclassesr   enumr   r   scapy.asn1.asn1r   r   r   scapy.asn1.berr	   scapy.asn1.mibr
   scapy.asn1fieldsr   r   r   scapy.asn1packetr   scapy.fieldsr   r   r   r   scapy.packetr   typingr   r   r   r   r   r%   r*   r,   r5   rU   r/   rS   r]   GSS_S_COMPLETEGSS_C_CALLING_ERROR_OFFSETGSS_C_ROUTINE_ERROR_OFFSETGSS_C_SUPPLEMENTARY_OFFSETGSS_S_CALL_INACCESSIBLE_READGSS_S_CALL_INACCESSIBLE_WRITEGSS_S_CALL_BAD_STRUCTUREGSS_S_BAD_MECHGSS_S_BAD_NAMEGSS_S_BAD_NAMETYPEGSS_S_BAD_BINDINGSGSS_S_BAD_STATUSGSS_S_BAD_SIGGSS_S_BAD_MICGSS_S_NO_CREDGSS_S_NO_CONTEXTGSS_S_DEFECTIVE_TOKENGSS_S_DEFECTIVE_CREDENTIALGSS_S_CREDENTIALS_EXPIREDGSS_S_CONTEXT_EXPIREDGSS_S_FAILUREGSS_S_BAD_QOPGSS_S_UNAUTHORIZEDGSS_S_UNAVAILABLEGSS_S_DUPLICATE_ELEMENTGSS_S_NAME_NOT_MNGSS_S_CONTINUE_NEEDEDGSS_S_DUPLICATE_TOKENGSS_S_OLD_TOKENGSS_S_UNSEQ_TOKENGSS_S_GAP_TOKENr   r   r   r   r   r!   r"   r#   <module>rN     s   ( 


 ! ! ! ! ! ! ! ! ! ! ! ! ! !         
 - , , , , ,               
 ) ( ( ( ( (                                 ,   
( ( ( ( (m ( ( (( ( ( ( ("3 ( ( (- - - - -~ - - -  
    +   D    K   <    K   2        !$>>  !%? ?  ::  000044 44 22 ////22 77 #== "<< 88 000055 44  :: 44  81<= 81<= 2Q674q89 2Q67  	
 ~  } ~         !" #$ 		-  :" " " " "F " " "       ' ' ' ' '' ' ' '"R R R R R R R R R Rr"   