
    h                        d Z g dZddlZddlZddlZddlZddl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mZmZ ddlmZmZmZmZ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( n# e)$ r e%Z(Y nw xY wn# e)$ r  e)d          w xY we(j*        Z+efde,de,de,de-dede,fdZ. G d dej/                  Z0 G d dej/                  Z1 G d de2          Z3d Z4d Z5d Z6d Z7d Z8 e9g d          Z:g d Z; G d! d"ej<                  Z= G d# d$e>          Z? G d% d&e=          Z@ G d' d(e?          ZA G d) d*e?          ZB G d+ d,e@          ZC G d- d.eC          ZD G d/ d0eC          ZE G d1 d2e@          ZF G d3 d4eA          ZG G d5 d6e@ej<                  ZH G d7 d8eH          ZI G d9 d:eH          ZJ G d; d<eA          ZK G d= d>eA          ZL G d? d@e?          ZM G dA dBe=          ZN G dC dDeN          ZO G dE dFeHej<                  ZP G dG dHeP          ZQ G dI dJeP          ZR G dK dLeA          ZS G dM dNeA          ZTe0jU        eDe0jV        eEe0jW        eFe0jX        eIe0jY        eJe0jZ        eQe0j[        eRe0j\        eNe0j]        eOi	Z^e1j_        eBe1j`        eGe1ja        eKe1jb        eLe1jc        eSe1jd        eTe1je        eMdOeMiZf G dP dQe>          ZgdR ZhdS )Sa  
Implementation of cryptographic functions for Kerberos 5

- RFC 3961: Encryption and Checksum Specifications for Kerberos 5
- RFC 3962: Advanced Encryption Standard (AES) Encryption for Kerberos 5
- RFC 4757: The RC4-HMAC Kerberos Encryption Types Used by Microsoft Windows
- RFC 6113: A Generalized Framework for Kerberos Pre-Authentication
- RFC 8009: AES Encryption with HMAC-SHA2 for Kerberos 5
)EncryptionTypeChecksumTypeKeyInvalidChecksum_rfc1964pad    N)orbchb	int_bytes	bytes_int	plain_str)AnyCallableListOptionalTypeUnion)_GenericHashHash_MD4Hash_MD5Hash_SHAHash_SHA256Hash_SHA384)HmacHmac_MD5Hmac_SHA)hashes)
PBKDF2HMAC)Cipher
algorithmsmodes)r   z?To use kerberos cryptography, you need to install cryptography.K_ILabelContextLhashmodreturnc                    t          | |          j        |j        }t          j        |z            }|dk    rt          d          d                    fdt          d|dz             D                       }|ddz           S )z
    KDF in Counter Mode as section 5.1 of [SP800-108]

    This assumes r=32, and defaults to SHA256 ([MS-SMB2] default).
    l    z"Invalid n value in SP800108_KDFCTR    c              3      K   | ]A} t          j        d |          z   dz   z   t          j        d           z             V  BdS )z>I    Nstructpack).0ir#   r$   r"   PRFs     V/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/libs/rfc3961.py	<genexpr>z"SP800108_KDFCTR.<locals>.<genexpr>y   sn         	FKa  5(72W<v{4QR?S?SSTT     r(      N   )r   digesthash_lenmathceil
ValueErrorjoinrange)	r!   r"   r#   r$   r%   hnresultr0   s	    ```    @r1   SP800108_KDFCTRr?   g   s     sG


#CA	!a%AJ=>>>XX       q!a%    F (AF(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 )r   r3                              N)__name__
__module____qualname__DES_CBC_CRCDES_CBC_MD4DES_CBC_MD5DES3_CBC_SHA1_KDAES128_CTS_HMAC_SHA1_96AES256_CTS_HMAC_SHA1_96AES128_CTS_HMAC_SHA256_128AES256_CTS_HMAC_SHA384_192RC4_HMACRC4_HMAC_EXP r(   r1   r   r      sE        KKK  !#!#HLLLr(   r   c                   2    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
S )r   r3   rB   r4         rC   rF   rG   ivN)rJ   rK   rL   CRC32RSA_MD4_DESRSA_MD5_DESHMAC_SHA1_DES3_KDHMAC_SHA1_96_AES128HMAC_SHA1_96_AES256HMAC_SHA256_128_AES128HMAC_SHA384_192_AES256HMAC_MD5rW   r(   r1   r   r      sF        EKK    HHHr(   r   c                       e Zd ZdS )r   N)rJ   rK   rL   rW   r(   r1   r   r      s        Dr(   r   c                 d   d }d }t          |           }|t          j        ||          z  |z  }t                      }t	          ||z            D ]}|| z  } || |          } t          d|z            }t	          d||          D ]}	 ||||	|	|z            |          }t          |          S )z
    n-fold is an algorithm that takes m input bits and "stretches" them
    to form n output bits with equal contribution from each input bit to
    the output (quote from RFC 3961 sect 3.1).
    c                     t          |           }d|dz  z  dz
  }|dk    r| S |dk    r"t          |dz	  ||dz  dz
  z  z  |z  |          S t          |dz	  ||dz  dz
  z  z  |z  |          S )Nr3   r4   r         )r   r
   )ynbxmods       r1   rot13z_n_fold.<locals>.rot13   s    aLLR!V}!77H1WWqAv!Q
*;<CRHHHqBw1a"+=>#ErJJJr(   c                    d t          | |          D             t          d D                       r5fdt                    D             t          d D                       5t          d D                       S )Nc                     g | ]
\  }}||z   S rW   rW   )r.   abs      r1   
<listcomp>z*_n_fold.<locals>.ocadd.<locals>.<listcomp>   s     )))tq!QU)))r(   c              3       K   | ]	}|d z  V  
dS )i NrW   r.   rk   s     r1   r2   z)_n_fold.<locals>.ocadd.<locals>.<genexpr>   s&      ''!e)''''''r(   c                 J    g | ]}|z
  d z            dz	  |         dz  z    S )r3   r4      rW   )r.   r/   rj   vs     r1   rr   z*_n_fold.<locals>.ocadd.<locals>.<listcomp>   s7    III!!AFQJ-1$15IIIr(   c              3      K   | ]}|V  d S NrW   rt   s     r1   r2   z)_n_fold.<locals>.ocadd.<locals>.<genexpr>   s      qr(   )zipanyr;   	bytearray)rk   ri   rj   rw   s     `@r1   ocaddz_n_fold.<locals>.ocadd   s    ))s1ayy)))''Q''''' 	JIIIIIuRyyIIIA ''Q''''' 	JA&&&r(   r*   r   )lenr7   gcdr|   r;   bytes)
sr=   rm   r}   mlcmbuf_outr/   s
             r1   _n_foldr      s    	K 	K 	K' ' ' 	AA
tx1~~

!C
++C3!8__  qE!QKK
GaK
 
 C1c1 , ,eCQQY++::r(   c                 4    | dt          |            |z  z  z   S )z@
    Return s padded with 0 bytes to a multiple of padsize.
    r*   )r~   )r   padsizes     r1   _zeropadr      s!    
 w3q66'G+,,,r(   c                 ^    t          |            dz  }| |t          j        d|          z  z   S )z-
    Return s padded as RFC1964 mandates
    r4   z!B)r~   r,   r-   )r   pads     r1   r   r      s1    
 FF7a-CsV[s+++++r(   c                     t          |           t          |          k    sJ t          d t          | |          D                       S )zB
    xor two strings together and return the resulting string
    c              3   &   K   | ]\  }}||z  V  d S ry   rW   r.   rk   ri   s      r1   r2   z_xorbytes.<locals>.<genexpr>   s*      55Aa!e555555r(   )r~   r|   rz   )b1b2s     r1   	_xorbytesr      sF    
 r77c"gg55R555555r(   c                 P    t          d t          | |          D                       S )Nc              3   (   K   | ]\  }}||k    V  d S ry   rW   r   s      r1   r2   z_mac_equal.<locals>.<genexpr>   s*      22$!QqAv222222r(   )allrz   )mac1mac2s     r1   
_mac_equalr      s)     22#dD//222222r(   )s   s   s   s   s   s   s   s   s   s   s   s   s   s   s   s   (   r   i0wl   ,a\ l   Q2 imijpl   5%R l   < i2iyl   iA l   Y/ i+L	i|~l   -pO l   ~! idi jl   Hqrg l   A|	 i}iml   Q5i l    iVlikdl   zyz l   I iO\ilcl   c=t l    i n;i^iLl   A* l   rqD i<iGKl   $ l   k5J i5ilBl   Iw7 l   @yyY il2iu\El   9 l   Y=W i0&i: Ql   Q l   a i!i#ĳVl   u l   %{q i(i_l   Y l   $ib i|o/iLhXl    l   =-l iAviql    1 l   *_ iqil   d? l   3TqQ ixi4 l   (, l   B iji-=ml   l" l   \L iQkkiball   0
 l   N d ili{l   t l   WDj iٰeiPl   8} l   |sy ibiI-l   | l   eLw iXaMiQ:l   t xG l   0v) iAJiו=l   mDI l   t' ijiCin4l   FZ l   84 is-Di3l   _LT l   |: i<qPiA'l   | l     i%hWio l   	Tr l   d i^i)l   "a l   ( i=Yi.l   ;\zo l   lt l    q[ l   35 iiұtl   9GU l   w; i&isl   F l   ;( i>jmiZjzl   OH l   & i' 
i}l   D` l   # ihiil   ]Wn l   g  iq6liknl   v} l   + iZziJgl   o_ss l   o} iCiՎ`l   #- l   ~C i8iROl   gv# l   gWxM i?iK6Hl   +0 l   L^ iJ6i`zAl   o> l   U_P in1iyiFl   3 l   x io%i6hRl   w l   Gv i"i/&Ul   ;t l   (ze iZ+ij\l    l   1Ok i,i[l   B6 l   &rX ijui
ml   8 l   ?6V igriW l   J~+ l   zpE i+{i8l   % l   >K i|i!l   R l   Bbc ihinl   | l   [&rm iwoiwGl   Z l   pj~ i;fi\l    l   i.p ikaiEll   xb@ l   R. iTNi³9l   a&N l     iMGiIiwn>l   Jj] l   Z3 if@i;7l   S.yS l   w= iϲGi0l   r{{ l   Bu i0Si$l   6u l    i)WTig#l   .zf l   J ih]i+o*l   7>h l    iZi-c                   (   e Zd ZdZdZdZdZdZee	j
        d                         Zee	j
        d                         Zee	j
        d                         Zee	j
        d                         Zee	j
        d                         Zed             ZdS )	_EncryptionAlgorithmProfilea  
    Base class for etype profiles.

    Usable etype classes must define:
    :attr etype: etype number
    :attr keysize: protocol size of key in bytes
    :attr seedsize: random_to_key input size in bytes
    :attr reqcksum: 'required checksum mechanism' per RFC3961.
                    this is the default checksum used for this algorithm.
    :attr random_to_key: (if the keyspace is not dense)
    :attr string_to_key:
    :attr encrypt:
    :attr decrypt:
    :attr prf:
    Nc                     d S ry   rW   )clskeyconstants      r1   derivez"_EncryptionAlgorithmProfile.derive  	     	r(   c                     d S ry   rW   )r   r   keyusage	plaintext
confounders        r1   encryptz#_EncryptionAlgorithmProfile.encrypt  r   r(   c                     d S ry   rW   )r   r   r   
ciphertexts       r1   decryptz#_EncryptionAlgorithmProfile.decrypt  r   r(   c                     d S ry   rW   r   r   strings      r1   prfz_EncryptionAlgorithmProfile.prf  r   r(   c                     d S ry   rW   )r   r   saltparamss       r1   string_to_keyz)_EncryptionAlgorithmProfile.string_to_key  r   r(   c                 |    t          |          | j        k    rt          d          t          | j        |          S )NWrong seed lengthr   )r~   seedsizer9   r   etype)r   seeds     r1   random_to_keyz)_EncryptionAlgorithmProfile.random_to_key  s;     t99$$011139$''''r(   )rJ   rK   rL   __doc__r   keysizer   reqcksumclassmethodabcabstractmethodr   r   r   r   r   r   rW   r(   r1   r   r   k  s          EGHH   [    [    [    [    [ ( ( [( ( (r(   r   c                   \    e Zd ZdZdZeej        d                         Zed             Z	dS )_ChecksumProfilez
    Base class for checksum profiles.

    Usable checksum classes must define:
    :func checksum:
    :attr macsize: Size of checksum in bytes
    :func verify: (if verification is not just checksum-and-compare)
    Nc                     d S ry   rW   )r   r   r   texts       r1   checksumz_ChecksumProfile.checksum  r   r(   c                 r    |                      |||          }t          ||          st          d          d S )Nzchecksum verification failure)r   r   r   )r   r   r   r   cksumexpecteds         r1   verifyz_ChecksumProfile.verify  sG     <<Xt44%** 	C!"ABBB	C 	Cr(   )
rJ   rK   rL   r   macsizer   r   r   r   r   rW   r(   r1   r   r     sl          G   [ C C [C C Cr(   r   c                       e Zd ZdZdZdZdZdZdZe	e
j        d                         Ze	e
j        d                         Ze	d             Ze	d
d            Ze	d
d            Ze	d	             ZdS )_SimplifiedEncryptionProfilea  
    Base class for etypes using the RFC 3961 simplified profile.
    Defines the encrypt, decrypt, and prf methods.

    Subclasses must define:

    :param blocksize: Underlying cipher block size in bytes
    :param padsize: Underlying cipher padding multiple (1 or blocksize)
    :param macsize: Size of integrity MAC in bytes
    :param hashmod: underlying hash function
    :param basic_encrypt, basic_decrypt: Underlying CBC/CTS cipher
    NFc                     d S ry   rW   )r   r   r   s      r1   basic_encryptz*_SimplifiedEncryptionProfile.basic_encrypt  r   r(   c                     d S ry   rW   )r   r   r   s      r1   basic_decryptz*_SimplifiedEncryptionProfile.basic_decrypt  r   r(   c                 "   t          || j                  }d}t          |          | j        k     r:|                     |j        |          }||z  }|}t          |          | j        k     :|                     |d| j                           j        S )z0
        Also known as "DK" in RFC3961.
        r(   r   )r   	blocksizer~   r   r   r   r   )r   r   r   r   rndseedr   s         r1   r   z#_SimplifiedEncryptionProfile.derive  s     Hcm44	'llS\))**37I>>Jz!G"I 'llS\))
   S\)9!:;;??r(   c                 D   | j         sU|                     |t          j        d|d                    }|                     |t          j        d|d                    }nf|                     |t          j        d|d          | j        dz            }|                     |t          j        d|d          | j        dz            }|t          j        | j                  }|t          || j
                  z   }||}| j         sNt          || j                                      |          }	|                     ||          |	d| j                 z   S |                     ||          }
t          || j                                      d|
z             }	|
|	d| j                 z   S )a  
        Encryption function.

        :param key: the key
        :param keyusage: the keyusage
        :param plaintext: the text to encrypt
        :param confounder: (optional) the confounder. If none, will be random
        :param signtext: (optional) make the checksum include different data than what
                         is encrypted. Useful for kerberos GSS_WrapEx. If none, same as
                         plaintext.
        >IBU      r4   N                   )rfc8009r   r,   r-   r   r   osurandomr   r   r   r   r%   r5   r   )r   r   r   r   r   signtextkikebasic_plaintexthmacCs              r1   r   z$_SimplifiedEncryptionProfile.encrypt  s~    { 	VCUHd!C!CDDBCUHd!C!CDDBBCUHd!C!CS[ST_UUBCUHd!C!CS[ST_UUBCM22J$x	3;'G'GG&H{ 	+CK((//99D$$R99D3;<OOO !!"o66ACK((//
Q??DtMckM***r(   c                 *   | j         sU|                     |t          j        d|d                    }|                     |t          j        d|d                    }nf|                     |t          j        d|d          | j        dz            }|                     |t          j        d|d          | j        dz            }t          |          | j        | j        z   k     rt          d          |d| j                  || j         d         }}t          |          | j	        z  dk    rt          d          | j         s| 
                    ||          }	|	}
|r& ||	d| j                 |	| j        d                   }
t          || j                                      |
          }|d| j                 }t          ||          st          d	          nd
|z   }
|r, ||dd| j        z            |d| j        z   d                   }
t          || j                                      |
          }|d| j                 }t          ||          st          d	          | 
                    ||          }	t          |	| j        d                   S )z%
        decryption function
        r   r   r   r4   zCiphertext too shortNr   z,ciphertext does not meet padding requirementciphertext integrity failurer   rC   )r   r   r,   r-   r   r   r~   r   r9   r   r   r   r%   r5   r   r   )r   r   r   r   presignfuncr   r   basic_ctextmacr   r   r   expmacs                r1   r   z$_SimplifiedEncryptionProfile.decrypt!  s    { 	VCUHd!C!CDDBCUHd!C!CDDBBCUHd!C!CS[ST_UUBCUHd!C!CS[ST_UUBz??S]S[8883444%nn5z3;,..7QS{ck)Q..KLLL{ 	A!//K@@O&H  ';#OcmO4#CMOO4  CK((//99D-CK-(Fc6** A !?@@@A "K/H  ';R#-%7 78S] 2 4 45  CK((//99D-CK-(Fc6** A !?@@@!//K@@O_S]__5666r(   c                    |                                                      |          }t          |          | j        z  r |dt          |          | j        z            }|                     |d          }|                     ||          S )z(
        pseudo-random function
        N   prf)r%   r5   r~   r   r   r   )r   r   r   hashvalkps        r1   r   z _SimplifiedEncryptionProfile.prfS  s~     ++--&&v..w<<#-' 	A?#g,,"> ??@GZZV$$  W---r(   ry   )rJ   rK   rL   r   r   r   r   r%   r   r   r   r   r   r   r   r   r   r   rW   r(   r1   r   r     s         IGGG G   [    [ @ @ [@&  +  +  + [ +D /7 /7 /7 [/7b . . [. . .r(   r   c                   P     e Zd ZdZdZdZed             Ze fd            Z xZ	S )_SimplifiedChecksumz
    Base class for checksums using the RFC 3961 simplified profile.
    Defines the checksum and verify methods.

    Subclasses must define:
    :attr enc: Profile of associated etype
    NFc                 X   | j         s0| j                            |t          j        d|d                    }n8| j                            |t          j        d|d          | j        dz            }t          || j        j                                      |          }|d | j                 S )Nr      r4   )	r   encr   r,   r-   r   r   r%   r5   )r   r   r   r   kcr   s         r1   r   z_SimplifiedChecksum.checksumu  s     { 	V[$%G%GHHBB V[$77q B B((//55MckM""r(   c                     |j         | j        j         k    rt          d          t          t          |                               ||||           d S NzWrong key type for checksum)r   r   r9   superr   r   r   r   r   r   r   	__class__s        r1   r   z_SimplifiedChecksum.verify  sP     9%%:;;;!3''..sHdEJJJJJr(   )
rJ   rK   rL   r   r   r   r   r   r   __classcell__r   s   @r1   r   r   f  s~          C G# # [# K K K K [K K K K Kr(   r   c                   (    e Zd ZdZed             ZdS )_CRC32   c                     d}t          t          |                    D ]'}||         |z  }|dz  }|dz  }|t          |         z  }(|                    dd          S )Nr   rv   r4   r   little)r;   r~   CRC32_TABLEto_bytes)r   r   r   r   cr/   idxs          r1   r   z_CRC32.checksum  sj     s4yy!! 	" 	"Aq'A+C4KC!GAS!!AAzz!X&&&r(   N)rJ   rK   rL   r   r   r   rW   r(   r1   r   r     s4        G
 ' ' [' ' 'r(   r   c                       e Zd ZdZdZdZdZdZeZ	e
d
d            Ze
d
d            Ze
d             Ze
d             Ze
d             Ze
d	             ZdS )_DESCBCr4   rC   Nc                    |t          j        | j                  }|d| j        z  z   t	          || j                  z   }|                                                     |          }|d t          |                   |z   |t          |          t          |          z   d          z   }| 	                    |j
        |          S )Nr*   )r   r   r   r   r   r   r%   r5   r~   r   r   )r   r   r   r   r   r   r   r   s           r1   r   z_DESCBC.encrypt  s     CM22J3;..)S[1Q1QQ 	 ;;==''88-c*oo-.c*ooH=??@A 	
   /:::r(   c                    t          |          | j        | j        z   k     rt          d          |                     |j        |          }|d | j                 }|| j        | j        | j        z            }|| j        | j        z   d          }|                                                     |d| j        z  z   |z             }	t          ||	          st          d          t          |          S )Nciphertext too shortr*   r   )r~   r   r   r9   r   r   r   r%   r5   r   r   r   )
r   r   r   r   r   complex_plaintext	cofounderr   messager   s
             r1   r   z_DESCBC.decrypt  s     z??S]S[8883444--cgzBB%mm4	ckCK.G GH#CK#+$=$?$?@%%i'CK2G&G'&QRR#v&& 	B!"@AAAW~~r(   c                    d }d }d }d}g d}t          ||z   | j                  fdt          dt                    d          D             D ]}t	                      }	|D ]'}
|	                    t          |
          d	z             (|d
u rd|	D ]B}
t          |
          dd                              dd          	                                z  Cd d d         t	                      }	fdt          dt                    d          D             D ]%}|	                    t          |d                     &| } |||	          }t          d                    d  ||          D                                 }t          |          t          v r|d         dz  |d<   t          |          }t          t!          |          t#          j        |                                                    }|                              dd          }t           ||                    }t          |          t          v r|d         dz  |d<   t+          | j        t          |                    S )Nc           	         d}t          t          |                     D ]}t          t          | |                             dd                              dd          }|d d                             d          dz  dk    r,|t          t          |d d         dz   d                    z  }|t          t          |d d         dz   d                    z  }|S )Nr(   rA   r4   0   1r   )r;   r~   binr   rjustcountr	   int)deskeytempr/   ts       r1   	fixparityz0_DESCBC.mit_des_string_to_key.<locals>.fixparity  s    D3v;;'' 5 5VAY((,33As;;RaR5;;s##a'1,,CAbqbECK 3 3444DDCAbqbECK 3 3444DDKr(   c                     t                      }| D ]Q}t          |                              d          dz  dk    r	|dz  dz  }n|dz  dz  }|                    |           R|S )Nr  rA   r   r3      )listr  r  append)l1r  bytes      r1   	addparityz0_DESCBC.mit_des_string_to_key.<locals>.addparity  st    66D " "IIOOC((1,22 AI3DD AI3DD!!!!Kr(   c                     t                      }t          | |          D ] \  }}|                    ||z  dz             !|S )N   )r  rz   r  )r  l2r  r   r   s        r1   XORz*_DESCBC.mit_des_string_to_key.<locals>.XOR  sI    66Db"++ 4 4BR"W
23333Kr(   T)r   r   r   r   r   r   r   r   c                 *    g | ]}||d z            S )r4   rW   )r.   r/   r   s     r1   rr   z1_DESCBC.mit_des_string_to_key.<locals>.<listcomp>  s%    @@@qaAE	l@@@r(   r   r4   r  Fr(   rA   r
  r	  c                 *    g | ]}||d z            S )r
  rW   )r.   r/   bintemps     r1   rr   z1_DESCBC.mit_des_string_to_key.<locals>.<listcomp>  s&    TTTQga!a%i0TTTr(   c              3   4   K   | ]}t          |          V  d S ry   )r	   )r.   r  s     r1   r2   z0_DESCBC.mit_des_string_to_key.<locals>.<genexpr>  s(      $Q$Q4SYY$Q$Q$Q$Q$Q$Qr(      ir   )r   r   r;   r~   r  r  r   r  r  encoder  r|   r:   r   WEAK_DES_KEYSr   DESr    CBC	encryptorupdater   r   )r   r   r   r  r  r  odd
tempstringblocktemp56r  bits7tempkeytempkeybdeschekcsumkeyr"  r   s                   @@r1   mit_des_string_to_keyz_DESCBC.mit_des_string_to_key  s   		 		 				 		 			 	 	 ---
Vd]CK00@@@@E!SVVQ,?,?@@@ 	1 	1EVVF 6 6c$ii*45555 e||" D DDs4yy}221c::AACCCGG!$$B$-TTTT%3w<<QR:S:STTT 1 1EMM#eQ--0000'CZ00JJCHH$Q$Q99Z;P;P$Q$Q$QQQRR>>]** d*GAJ>>S]]EIh$7$788BBDDjjmmBCC(		+ 6 677..(^d2KN39%"4"45555r(   c                     t          |          dz  dk    sJ t          t          |          t          j        d                                                    }|                    t          |                    S Nr4   r   s           )r~   r   r'  r    r(  r)  r*  r   )r   r   r   r2  s       r1   r   z_DESCBC.basic_encrypt  se     9~~!Q&&&&SXXuy3344>>@@zz%	**+++r(   c                     t          |          dz  dk    sJ t          t          |          t          j        d                                                    }|                    t          |                    S r6  )r~   r   r'  r    r(  	decryptorr*  r   )r   r   r   r2  s       r1   r   z_DESCBC.basic_decrypt  se     :"a''''SXXuy3344>>@@zz%
++,,,r(   c                 `    ||dk    rt          d          |                     ||          }|S )Nr(   z$Invalid DES string-to-key parameters)r9   r4  )r   r   r   r   r   s        r1   r   z_DESCBC.string_to_key  s;     &C--CDDD''55
r(   ry   )rJ   rK   rL   r   r   r   r   r   r   r%   r   r   r   r4  r   r   r   rW   r(   r1   r   r     s        GHIGGG; ; ; [;    [ C6 C6 [C6J , , [, - - [-   [  r(   r   c                   .    e Zd Zej        ZeZej	        Z
dS )_DESMD5N)rJ   rK   rL   r   rO   r   r   r%   r   r]   r   rW   r(   r1   r;  r;  +  #        &EG'HHHr(   r;  c                   .    e Zd Zej        ZeZej	        Z
dS )_DESMD4N)rJ   rK   rL   r   rN   r   r   r%   r   r\   r   rW   r(   r1   r>  r>  4  r<  r(   r>  c                       e Zd Zej        ZdZdZdZdZ	dZ
eZej        Zed             Zed             Zed             Zed             Zd	S )
_DES3CBCrI      r4   rG   c                     d }t          |          dk    rt          d           ||d d                    ||dd                    ||dd                    }}}t          | j        ||z   |z             S )Nc                 @    d t                     dk    sJ fd D             } t           fdt          d          D                                 }t          ||gz             }t	          |          t
          v r|d         dz  |d<   t	          |          S )Nc                 j    | dz  } t          | dz                                d          dz  r| n| dz  S )Nr  rA   r3   )r  r  )rq   s    r1   parityz6_DES3CBC.random_to_key.<locals>.expand.<locals>.parityO  s=     RBKK--c22Q6AqqAEAr(   r
  c                 ,    g | ]} |d z            S )rE  rW   )r.   rq   rF  s     r1   rr   z:_DES3CBC.random_to_key.<locals>.expand.<locals>.<listcomp>V  s%    777Q&&R..777r(   c              3   :   K   | ]}|         d z  |d z   z  V  dS )r3   NrW   )r.   r/   r   s     r1   r2   z9_DES3CBC.random_to_key.<locals>.expand.<locals>.<genexpr>W  s4      !K!KQ47Q;1q5"8!K!K!K!K!K!Kr(   r$  )r~   sumr;   r|   r   r&  )r   
firstbyteslastbytekeybytesrF  s   `   @r1   expandz&_DES3CBC.random_to_key.<locals>.expandM  s    B B B t99>>>>7777$777Jvc!K!K!K!K%((!K!K!KKKLLH xj!899HX-//&qkD0??"r(   rA  r   r
     r   )r~   r9   r   r   )r   r   rM  k1k2k3s         r1   r   z_DES3CBC.random_to_keyG  s    	# 	# 	#  t99??0111VD!H%%vvd1R4j'9'966$rss);L;LB39"r'B,////r(   c                     ||dk    rt          d          |                     t          ||z   d                    }t          | j        |                     |d                    S )Nr(   z%Invalid DES3 string-to-key parametersrA     kerberosr   )r9   r   r   r   r   r   )r   r   r   r   ks        r1   r   z_DES3CBC.string_to_keyb  so     &C--DEEEgftmR8899I

1k**
 
 
 	
r(   c                    t          |          dz  dk    sJ t          t          j        |          t	          j        d                                                    }|                    t          |                    S r6  )	r~   r   decrepit_algorithms	TripleDESr    r(  r)  r*  r   )r   r   r   des3s       r1   r   z_DES3CBC.basic_encryptm  sq     9~~!Q&&&&)#..	)0D0D
 

)++ 	 {{5++,,,r(   c                    t          |          dz  dk    sJ t          t          j        |          t	          j        d                                                    }|                    t          |                    S r6  )	r~   r   rV  rW  r    r(  r8  r*  r   )r   r   r   rX  s       r1   r   z_DES3CBC.basic_decryptv  sq     :"a'''')#..	)0D0D
 

)++ 	 {{5,,---r(   N)rJ   rK   rL   r   rP   r   r   r   r   r   r   r   r%   r   r^   r   r   r   r   r   r   rW   r(   r1   r@  r@  =  s        +EGHIGGG-H0 0 [04 
 
 [
 - - [- . . [. . .r(   r@  c                       e Zd ZdZeZdS )	_SHA1DES3rG   N)rJ   rK   rL   r   r@  r   rW   r(   r1   r[  r[    s        G
CCCr(   r[  c                   `    e Zd ZdZdZdZeZed             Z	ed             Z
ed             ZdS )_AESEncryptionType_SHA1_96rC   r3   rY   c                 2   t          j        d|pd          d         }t          t          j                    | j        ||          }|                     |                    |                    }t          | j	        |                     |d                    S )N>Ls      r   	algorithmlengthr   
iterationsrS  r   )
r,   unpackr   r   SHA1r   r   r   r   r   )r   r   r   r   rc  kdftkeys          r1   r   z(_AESEncryptionType_SHA1_96.string_to_key  s     ]4)F3FGGJ
kmm<!	
 
 
   F!3!344I

4--
 
 
 	
r(   c                    t          |          dk    sJ t          t          j        |          t	          j        d                                                    }|                    t          t          |          d                    }t          |          dk    r<t          |          dz  pd}|d d         |dd          z   |dd         d |         z   }|S )NrC   r   ii)
r~   r   r   AESr    r(  r)  r*  r   r   )r   r   r   aesctextlastlens         r1   r   z(_AESEncryptionType_SHA1_96.basic_encrypt  s     9~~####Z^C((%)J*?*?@@JJLL

8E)$4$4b99::y>>B )nnr)/RG$3$K%+-c#gxx0HHEr(   c                    t                    dk    sJ t          t          j        |          t	          j                                                              }t                    dk    r|                              S fdt          dt                    d          D             }t          |d                   }t          d          }d}|d d         D ]D}|t          t          |                    t          |                              |          z  }|}Et          |                    t          |d                                       }t          |d |         |d                   }	||d          }
|t          t          |                    t          |d                   t          |
          z                       |          z  }||	z   S )NrC   c                 D    g | ]}t          ||d z                      S )rC   )r|   )r.   pr   s     r1   rr   z<_AESEncryptionType_SHA1_96.basic_decrypt.<locals>.<listcomp>  s;     
 
 
23IjQV,--
 
 
r(   r   r   r(   rE  )r~   r   r   ri  r    ECBr8  r*  r;   r|   r   r   )r   r   r   rj  cblocksrl  prev_cblockr   bblastplaintextomitteds     `        r1   r   z(_AESEncryptionType_SHA1_96.basic_decrypt  s    :"$$$$Z^C((%)++66@@BBz??b  ::j)))
 
 
 
7<QJQS7T7T
 
 
 gbk""mm	#2#, 	 	B9SZZb		-B-B#C#C[QQQIKK szz%"4"45566!"XgX,<<WXX, 	Ycjjwr{!3!3eGnn!DEEFF
 
 	
	 =((r(   N)rJ   rK   rL   r   r   r   r   r%   r   r   r   r   rW   r(   r1   r]  r]    sw        IGGG
 
 [
" 
 
 [
 ) ) [) ) )r(   r]  c                   2    e Zd Zej        ZdZdZej	        Z
dS )_AES128CTS_SHA1_96rC   N)rJ   rK   rL   r   rQ   r   r   r   r   r_   r   rW   r(   r1   rw  rw    (        2EGH/HHHr(   rw  c                   2    e Zd Zej        ZdZdZej	        Z
dS )_AES256CTS_SHA1_96    N)rJ   rK   rL   r   rR   r   r   r   r   r`   r   rW   r(   r1   rz  rz    rx  r(   rz  c                       e Zd ZdZeZdS )_SHA1_96_AES128rY   N)rJ   rK   rL   r   rw  r   rW   r(   r1   r}  r}            G
CCCr(   r}  c                       e Zd ZdZeZdS )_SHA1_96_AES256rY   N)rJ   rK   rL   r   rz  r   rW   r(   r1   r  r    r~  r(   r  c                   H     e Zd ZdZed             Ze fd            Z xZS )_HMACMD5rC   c                    t          |j                                      d          }t                                          t                              |          |z             }t          |                              |          S )Ns   signaturekey )r   r   r5   r   _RC4	usage_str)r   r   r   r   ksignmd5hashs         r1   r   z_HMACMD5.checksum  sd     !!(():;;**##DNN8$<$<t$CDD%%g...r(   c                     |j         t          j        t          j        fvrt	          d          t          t          |                               ||||           d S r   )r   r   rU   rV   r9   r   r  r   r   s        r1   r   z_HMACMD5.verify   sV     9^4n6QRRR:;;;h##C4?????r(   )rJ   rK   rL   r   r   r   r   r   r   s   @r1   r  r    sk        G/ / [/ @ @ @ @ [@ @ @ @ @r(   r  c                       e Zd Zej        ZdZdZej	        Z
dZed             Zed             Zed             Zed             Zed             ZdS )	r  rC   Fc                 R    ddd}| |v r||          n| }t          j        d|          S )Nr4   rh   )rB   rH   <Ir+   )r   tablemsusages      r1   r  z_RC4.usage_str  s8    
 2%-%6%6%//H{4)))r(   c                     ||dk    rt          d          t          |                              d          }t          | j        t                                          |                    S )Nr(   z$Invalid RC4 string-to-key parameterszUTF-16LEr   )r9   r   r%  r   r   r   r5   )r   r   r   r   utf16strings        r1   r   z_RC4.string_to_key  sc     &C--CDDD''..z::39(**"3"3K"@"@AAAAr(   c                    |t          j        d          }| j        r>t          |j                                      d|                     |          z             }n:t          |j                                      |                     |                    }t          |                              ||z             }| j        r|d d         dz   }t          |                              |          }t          t          j	        |          d           
                                }||                    t          ||z                       z   S )Nr4   
   fortybits r
  	   mode)r   r   exportr   r   r5   r  r   r   ARC4r)  r*  r   )	r   r   r   r   r   r   r   r   rc4s	            r1   r   z_RC4.encrypt#  s    AJ: 	C#'""))*:S]]8=T=T*TUUBB#'""))#--*A*ABBB##J$:;;: 	&BQB+%Bb\\  ''Z_R((t444>>@@szz%
Y(>"?"?@@@@r(   c                 (   t          |          dk     rt          d          |d d         |dd          }}| j        r>t          |j                                      d|                     |          z             }n:t          |j                                      |                     |                    }| j        r|d d         dz   }n|}t          |                              |          }t          t          j	        |          d           
                                }	|	                    t          |                    }
t          |                              |
          }t          ||          }|sr|dk    rlt          |j                                      t          j        d	d
                    }t          |                              |
          }t          ||          }|st!          d          t          |
d
d                    S )NrI   r  rC   r  r
  r  r  	   r  r4   r   )r~   r9   r  r   r   r5   r  r   rV  r  r8  r*  r   r   r,   r-   r   )r   r   r   r   r   r   r   kier   r  r   	exp_cksumoks                r1   r   z_RC4.decrypt3  s    z??R3444'_jo{: 	C#'""))*:S]]8=T=T*TUUBB#'""))#--*A*ABBB: 	RaR&;&CCCc]]!!%(((-b11===GGII**U;%7%788RLL''88	y)) 	.h!mm#'""))&+dA*>*>??B ++O<<IE9--B 	B!"@AAA_QRR()))r(   c                 P    t          |j                                      |          S ry   )r   r   r5   r   s      r1   r   z_RC4.prfP  s"       ''///r(   N)rJ   rK   rL   r   rU   r   r   r   r   rc   r   r  staticmethodr  r   r   r   r   r   rW   r(   r1   r  r    s        #EGH$HF* * \* B B [B A A [A * * [*8 0 0 [0 0 0r(   r  c                        e Zd Zej        ZdZdS )_RC4_EXPORTTN)rJ   rK   rL   r   rV   r   r  rW   r(   r1   r  r  V  s        'EFFFr(   r  c                       e Zd ZU dZdZeed<   dZej	        ed<   dZ
ed	d            Zed             Zed             ZdS )
 _AESEncryptionType_SHA256_SHA384Nr%   _hashmodTr(   c                 >    t          |j        |||| j                  S )z;
        Also known as "KDF-HMAC-SHA2" in RFC8009.
        )r!   r"   r#   r$   r%   )r?   r   r%   )r   r   labelrT  contexts        r1   r   z'_AESEncryptionType_SHA256_SHA384.deriveh  s.     K
 
 
 	
r(   c           	      `   t          j        d|pd          d         }| j        dz   |z   }t          |                                 | j        ||          }|                     |                    |                    }t          | j	        |                     |d| j
        dz                      S )	Nr_  s      r   r*   r`  rS  r4   r   )r,   rd  enctypenamer   r  r   r   r   r   r   r   )r   r   r   r   rc  saltprf  rg  s           r1   r   z._AESEncryptionType_SHA256_SHA384.string_to_keyw  s     ]4)F3FGGJ
')D0llnn<!	
 
 
   F!3!344I

4ckAo>>
 
 
 	
r(   c                 L    |                      |d| j        j        dz  |          S )Nr   r4   )r   r%   r6   r   s      r1   r   z$_AESEncryptionType_SHA256_SHA384.prf  s&     zz#vs{';a'?HHHr(   )r(   )rJ   rK   rL   r  r%   r   __annotations__r  r   HashAlgorithmr   r   r   r   r   rW   r(   r1   r  r  `  s         K G\   %)Hf"))) G
 
 
 [
 
 
 [
" I I [I I Ir(   r  c                   L    e Zd Zej        ZdZdZdZe	j
        ZdZeZej        ZdS )_AES128CTS_SHA256_128rC   s   aes128-cts-hmac-sha256-128N)rJ   rK   rL   r   rS   r   r   r   r   r   ra   r   r  r   r%   r   SHA256r  rW   r(   r1   r  r    >        5EGHG2H/KG}HHHr(   r  c                   L    e Zd Zej        ZdZdZdZe	j
        ZdZeZej        ZdS )_AES256CTS_SHA384_192r{  rI   s   aes256-cts-hmac-sha384-192N)rJ   rK   rL   r   rT   r   r   r   r   r   rb   r   r  r   r%   r   SHA384r  rW   r(   r1   r  r    r  r(   r  c                       e Zd ZdZeZdZdS )_SHA256_128_AES128rC   TN)rJ   rK   rL   r   r  r   r   rW   r(   r1   r  r            G
CGGGr(   r  c                       e Zd ZdZeZdZdS )_SHA384_182_AES256rI   TN)rJ   rK   rL   r   r  r   r   rW   r(   r1   r  r    r  r(   r  l   v c            
           e Zd Z	 	 	 ddeeedf         dedeeedf         ddfdZd Z	dd	Z
d
 Zd ZddZddZed             Zedd            ZdS )r   Nr(   r   r   	cksumtyper&   c                    |s|s
J d            |s
J d            t          |t                    rt          |          }t          |t                    rt          |          }|| _        |	 t
          |         | _        n # t          $ r t          d|z            w xY wt          |          | j        j	        k    r,t          dt          |          d| j        j	                  || j        j
        t          v r| j        j
        }|| _        |k	 t          |         | _        n # t          $ r t          d|z            w xY w| j        0t          | j        t                    r| j        j        j        | _        || _        dS )z
        Kerberos Key object.

        :param etype: the EncryptionType
        :param cksumtype: the ChecksumType
        :param key: the bytes containing the key bytes for this Key.
        z!Provide an etype or a cksumtype !zProvide a key !Nz UNKNOWN/UNIMPLEMENTED etype '%s'zWrong key length. Got z. Expected z$UNKNOWN/UNIMPLEMENTED cksumtype '%s')
isinstancer  r   r   r   	_enctypesepr9   r~   r   r   
_checksumsr  cp
issubclassr   r   r   )selfr   r   r  s       r1   __init__zKey.__init__  s    F	FF#FFFF%%%%%%eS!! 	*"5))Ei%% 	0$Y//I
M#E* M M M !Ce!KLLLM3xx47?** j3xxxx2    TW%5%C%C G,	" U$Y/ U U U !G)!STTTUz!j:M&N&N!!W[.
s   -B   BD' 'Ec                     | j         r| j         j        }n| j        r| j        j        }ndS d|dt          | j                  z  dS )Nz<Key UNKNOWN>z<Key z (%s octets)>)r   namer  r~   r   )r  r  s     r1   __repr__zKey.__repr__  sX    : 	#:?DD^ 	#>&DD"?DS]]***
 	
r(   c                 H     | j         j        | |t          |          |fi |S )z
        Encrypt data using the current Key.

        :param keyusage: the key usage
        :param plaintext: the plain text to encrypt
        :param confounder: (optional) choose the confounder. Otherwise random.
        )r  r   r   )r  r   r   r   kwargss        r1   r   zKey.encrypt  s.     twtXuY/?/?VVvVVVr(   c                 ,     | j         j        | ||fi |S )z
        Decrypt data using the current Key.

        :param keyusage: the key usage
        :param ciphertext: the encrypted text to decrypt
        )r  r   )r  r   r   r  s       r1   r   zKey.decrypt  s$     twtXzDDVDDDr(   c                 8    | j                             | |          S ry   )r  r   )r  r   s     r1   r   zKey.prf+  s    w{{4(((r(   c                     |/|| j         k    r$ t          || j                  j        d||d|S | j         t	          d           | j        j        | ||fi |S )z
        Create a checksum using the current Key.

        :param keyusage: the key usage
        :param text: the text to create a checksum from
        :param cksumtype: (optional) override the checksum type
        Nr  r   )r   r   cksumtype not specified !rW   )r  r   r   make_checksumr9   r  r   )r  r   r   r  r  s        r1   r  zKey.make_checksum/  s      Y$.%@%@3#H   D &.DD D =CD D D >!8999twh?????r(   c                     |7|| j         k    r,t          || j                                      |||          S | j         t	          d          | j                            | |||           dS )z
        Verify a checksum using the current Key.

        :param keyusage: the key usage
        :param text: the text to verify
        :param cksum: the expected checksum
        :param cksumtype: (optional) override the checksum type
        Nr  )r   r   r   r  )r  r   r   verify_checksumr9   r  r   )r  r   r   r   r  s        r1   r  zKey.verify_checksumB  s      Y$.%@%@#H   oxd%oHHI >!8999tXtU33333r(   c                     	 t           |         }n # t          $ r t          d|z            w xY wt          |          |j        k    rt          d          |                    |          S )ze
        random-to-key per RFC3961

        This is used to create a random Key from a seed.
        Unknown etype '%s'zWrong crypto seed length)r  r9   r~   r   r   )r   r   r   r  s       r1   r   zKey.random_to_keyY  sx    	;5!BB 	; 	; 	;1E9:::	;t99##7888%%%    -c                     	 t           |         }n # t          $ r t          d|z            w xY w|                    |||          S )zy
        string-to-key per RFC3961

        This is typically used to create a Key object from a password + salt
        r  )r  r9   r   )r   r   r   r   r   r  s         r1   r   zKey.string_to_keyi  sZ    	;5!BB 	; 	; 	;1E9:::	;f555r  )Nr(   Nry   )rJ   rK   rL   r   r   r  r   r   r  r  r   r   r   r  r  r   r   r   rW   r(   r1   r   r     s&        3748	( (^S$./( ( sD01	(
 
( ( ( (T
 
 
	W 	W 	W 	W
E 
E 
E) ) )@ @ @ @&4 4 4 4. & & [& 6 6 6 [6 6 6r(   r   c                     d }t          | j        t          t          t	           || |                    t	           |||                                                  S )z
    KRB-FX-CF2 RFC6113
    c                     d}d}t          |          | j        j        k     rJ||                     t	          |          |z             z  }|dz  }t          |          | j        j        k     J|d | j        j                 S )Nr(   r3   )r~   r  r   r   r	   )r   pepperr   r  s       r1   prfpluszKRB_FX_CF2.<locals>.prfplus  s{     #hh((3773u::.///CQJE #hh(( $SV_$%%r(   r   )r   r   r   r   r|   )key1key2pepper1pepper2r  s        r1   
KRB_FX_CF2r  }  sv    & & & 
''$00119WWT7=S=S3T3T 
 
   r(   )ir   __all__r   enumr7   r   r,   scapy.compatr   r	   r
   r   r   typingr   r   r   r   r   r   scapy.layers.tls.crypto.hashr   r   r   r   r   r   scapy.layers.tls.crypto.h_macr   r   r   cryptography.hazmat.primitivesr   )cryptography.hazmat.primitives.kdf.pbkdf2r   &cryptography.hazmat.primitives.ciphersr   r   r    $cryptography.hazmat.decrepit.ciphersrV  ImportErrorrW  r'  r   r  r?   IntEnumr   r   r9   r   r   r   r   r   r   setr&  r   ABCMetar   objectr   r   r   r   r   r;  r>  r@  r[  r]  rw  rz  r}  r  r  r  r  r  r  r  r  r  rO   rN   rP   rQ   rR   rS   rT   rU   rV   r  r[   r^   r_   r`   ra   rb   rc   r  r   r  rW   r(   r1   <module>r     s      


   				                                                     Y555555DDDDDDPPPPPPPPPP)	
 	
 	
 	
 	
 	
 	
  ) ) )() Y Y Y
+W
X
XXY
 # ( 	  	
     8    T\   &    4<   (	 	 	 	 	j 	 	 	# # #L- - -, , ,6 6 63 3 3    @A A AX9( 9( 9( 9( 9(#+ 9( 9( 9(~C C C C Cv C C C:Y. Y. Y. Y. Y.#> Y. Y. Y.~"K "K "K "K "K* "K "K "KP' ' ' ' ' ' ' '*B B B B B* B B BP( ( ( ( (g ( ( (( ( ( ( (g ( ( (@. @. @. @. @.+ @. @. @.F    #   D) D) D) D) D)!=s{ D) D) D)T0 0 0 0 03 0 0 00 0 0 0 03 0 0 0    )   
    )   @ @ @ @ @ @ @ @*H0 H0 H0 H0 H0& H0 H0 H0V    $   ,I ,I ,I ,I ,I'A3; ,I ,I ,I^	 	 	 	 	< 	 	 		 	 	 	 	< 	 	 	    ,       ,    #X*,>*,>-/D-/D T	$  "I$o$o ');');8!
(Y6 Y6 Y6 Y6 Y6& Y6 Y6 Y6B    s0   B  +A2 1B  2A<9B  ;A<<B   B