
    b                        d dl Z d dlZe j                            d d           dej        d<   d dlmZ d dlmZ d dl	m
Z
m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 d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dl m!Z" d dl#m$Z$m%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 Z/d Z0d  Z1 G d! d"e&          Z2 G d# d$e2          Z3 G d% d&e3          Z4 G d' d(e3          Z5 G d) d*e5          Z6 G d+ d,e5          Z7 G d- d.e2          Z8 G d/ d0e&          Z9 G d1 d2e9          Z: G d3 d4e:          Z; G d5 d6e:          Z< G d7 d8e:          Z= G d9 d:e9          Z> G d; d<e9          Z? G d= d>e9          Z@ G d? d@e9          ZAe'jB        e4e'jC        e6e'jD        e7e'jE        e8iZFe(jG        e=e(jH        e;e(jI        e<e(jJ        e>e(jK        e?e(jL        e@e(jM        eAiZNdA ZOdB ZP G dC dDe&          ZQdE ZRdF ZSdTdGZTdTdHZUdI ZVdJ ZWdK ZXdL ZYdM ZZdN Z[dTdOZ\dP Z] G dQ dRe          Z^e_dSk    rd dl`Z` e`ja                     dS dS )U    Nz
bin/python1PYTHONUNBUFFERED)gcd)reduce)packunpack)crc32b2a_hex)hashes)hmac)
algorithms)modes)Cipher)default_backend)
PBKDF2HMAC)TestCase)Credentials)generate_random_bytes)
get_string	get_bytesc                   *    e Zd ZdZdZdZdZdZdZdZ	dS )	Enctype                     N)
__name__
__module____qualname__DES_CRCDES_MD4DES_MD5DES3AES128AES256RC4     :/usr/lib/python3/dist-packages/samba/tests/krb5/kcrypto.pyr   r   D   s1        GGGDFF
CCCr+   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 )	Cksumtyper   r   r                  r   ivN)r    r!   r"   CRC32MD4MD4_DESMD5MD5_DES	SHA1_DES3SHA1SHA1_AES128SHA1_AES256HMAC_MD5r*   r+   r,   r.   r.   N   s@        E
CG
CGIDKKHHHr+   r.   c                       e Zd ZdS )InvalidChecksumN)r    r!   r"   r*   r+   r,   r?   r?   [   s        Dr+   r?   c                 V    |t          |           |z  z
  |z  }| t          |          z   S N)lenbytes)spadsizepadlens      r,   _zeropadrG   _   s-    Q')*g5FuV}}r+   c                     t          |           t          |          k    sJ t          d t          | |          D                       S )Nc                     g | ]
\  }}||z  S r*   r*   ).0xys      r,   
<listcomp>z_xorbytes.<locals>.<listcomp>h   s     000DAq!a%000r+   )rB   rC   zip)b1b2s     r,   	_xorbytesrQ   e   sD    r77c"gg00CBKK000111r+   c                     t          |           t          |          k    sJ d}t          | |          D ]\  }}|||z  z  }|dk    S )Nr   )rB   rN   )mac1mac2resrK   rL   s        r,   
_mac_equalrV   k   sY     t99D		!!!!
CD$  1q1u!8Or+   c                     t          j         |            t                                }|                    |            |                                S rA   )r   Hashr   updatefinalize)stringalgo_clshash_ctxs      r,   SIMPLE_HASHr^   u   sC    {88::'8'899HOOFr+   c                     t          j        |  |            t                                }|                    |           |                                S rA   )r   HMACr   rY   rZ   )keyr[   r\   hmac_ctxs       r,   	HMAC_HASHrc   {   sE    yhhjj/*;*;<<HOOFr+   c                      d d }t                     }|z  t          |          z  }d                     fdt          ||z            D                       fdt          d|          D             }t	          ||          S )Nc                      |dz  t                     z  |dz  ct           fdt          t                               D                       S )Nr0   c                 \    g | ](}|z
           z	  |z
  d z
           dz
  z  dz  z  )S r   r0      r*   )rJ   inbytesremainstrs     r,   rM   z0_nfold.<locals>.rotate_right.<locals>.<listcomp>   s[     & & &  V_&1v:>"q6z2T9;& & &r+   )rB   rC   range)rl   nbitsrj   rk   s   ` @@r,   rotate_rightz_nfold.<locals>.rotate_right   ss    1*C0%!) & & & & & & 3s88__& & & ' ' 	'r+   c                 &   t          |           d t          | |          D             t          d D                       r5fdt                    D             t          d D                       5t	          d D                       S )Nc                     g | ]
\  }}||z   S r*   r*   )rJ   abs      r,   rM   z7_nfold.<locals>.add_ones_complement.<locals>.<listcomp>   s     ///tq!QU///r+   c              3       K   | ]	}|d z  V  
dS )i Nr*   rJ   rK   s     r,   	<genexpr>z6_nfold.<locals>.add_ones_complement.<locals>.<genexpr>   s&      ''!e)''''''r+   c                 J    g | ]}|z
  d z            dz	  |         dz  z    S rg   r*   )rJ   ri   nvs     r,   rM   z7_nfold.<locals>.add_ones_complement.<locals>.<listcomp>   s7    GGG!AEAI,!#!t4GGGr+   c                     g | ]}|S r*   r*   ru   s     r,   rM   z7_nfold.<locals>.add_ones_complement.<locals>.<listcomp>   s    ^^^Aa^^^r+   )rB   rN   anyrm   rC   )str1str2rx   ry   s     @@r,   add_ones_complementz#_nfold.<locals>.add_ones_complement   s    II//s4///''Q''''' 	HGGGGGeAhhGGGA ''Q''''' 	H^^^^^$$$r+   r+   c              3   6   K   | ]} d |z            V  dS )   Nr*   )rJ   ri   ro   rl   s     r,   rv   z_nfold.<locals>.<genexpr>   s3      MMQ||Ca00MMMMMMr+   c              3   2   K   | ]}||z            V  d S rA   r*   )rJ   pbigstrrj   s     r,   rv   z_nfold.<locals>.<genexpr>   s0      BBqfQq6z\"BBBBBBr+   r   )rB   r   joinrm   r   )rl   rj   r~   slenlcmslicesr   ro   s   ``    @@r,   _nfoldr      s    
' ' '% % % s88D
4-3vt,,
,CXXMMMMM%t:L:LMMMNNFBBBBBE!S&,A,ABBBF%v...r+   c                 
    | dv S )N)s   s   s   s   s   s   s   s   s   s   s   s   s   s   s   s   r*   )keybytess    r,   _is_weak_des_keyr      s     = = =r+   c                   $    e Zd Zed             ZdS )_EnctypeProfilec                 z    t          |          | j        k    rt          d          t          | j        |          S )NWrong seed length)rB   seedsize
ValueErrorKeyenctype)clsseeds     r,   random_to_keyz_EnctypeProfile.random_to_key   s6    t99$$01113;%%%r+   N)r    r!   r"   classmethodr   r*   r+   r,   r   r      s/         & & [& & &r+   r   c                   f    e Zd Zed             Zed             Zed             Zed             ZdS )_SimplifiedEnctypec                    t          || j                  }d}t          |          | j        k     r5|                     ||          }||z  }|}t          |          | j        k     5|                     |d| j                           S )Nr+   r   )r   	blocksizerB   r   basic_encryptr   )r   ra   constant	plaintextrndseed
ciphertexts         r,   derivez_SimplifiedEnctype.derive   s     8S]33	'llS\))**3	::Jz!G"I 'llS\))   3<!8999r+   c                 t   |                      |t          d|d                    }|                      |t          d|d                    }|t          | j                  }|t	          || j                  z   }t          |j        || j                  }| 	                    ||          |d | j
                 z   S )N>iBU      )r   r   get_random_bytesr   rG   rE   rc   contentshashalgor   macsize)	r   ra   keyusager   
confounderkikebasic_plaintextr   s	            r,   encryptz_SimplifiedEnctype.encrypt   s    ZZT%48899ZZT%48899)#-88J$x	3;'G'GGos|DD  _55\ck\8JJJr+   c                 d   |                      |t          d|d                    }|                      |t          d|d                    }t          |          | j        | j        z   k     rt          d          |d | j                  || j         d          }}t          |          | j        z  dk    rt          d          |                     ||          }t          |j	        || j
                  }	|	d | j                 }
t          ||
          st          d          || j        d          S )Nr   r   r   ciphertext too shortr   z,ciphertext does not meet padding requirementciphertext integrity failure)r   r   rB   r   r   r   rE   basic_decryptrc   r   r   rV   r?   )r   ra   r   r   r   r   basic_ctextmacr   r   expmacs              r,   decryptz_SimplifiedEnctype.decrypt   s"   ZZT%48899ZZT%48899z??S]S[8883444%m|m4j#+6OS{ck)Q..KLLL++B<<os|DDls{l##v&& 	B!"@AAAs}~~..r+   c                     t          || j                  }|d t          |          | j        z            }|                     |d          }|                     ||          S )Ns   prf)r^   r   rB   r   r   r   )r   ra   r[   hashval	truncatedkps         r,   prfz_SimplifiedEnctype.prf   s^     fcl33<s7||cm;<<=	ZZV$$  Y///r+   N)r    r!   r"   r   r   r   r   r   r*   r+   r,   r   r      s         : : [: K K [K / / [/  0 0 [0 0 0r+   r   c                       e Zd Zej        ZdZdZdZdZ	dZ
ej        Zed             Zed             Zed             Zed             Zd	S )
_DES3CBC      r0      c                     d }t          |          dk    rt          d           ||d d                    ||dd                    ||dd                    }}}t          | j        ||z   |z             S )Nc                 H    d t                     dk    sJ fd D             } t           fdt          d          D                                 }t          d ||gz   D                       }t	          |          rt          |d         dz  g          |d<   |S )Nc                 j    | dz  } t          | dz                                d          dz  r| n| dz  S )Nr   r   r   )bincount)rs   s    r,   parityz6_DES3CBC.random_to_key.<locals>.expand.<locals>.parity  s;    RBKK--c22Q6AqqAEAr+   r/   c                 ,    g | ]} |d z            S )r   r*   )rJ   rs   r   s     r,   rM   z:_DES3CBC.random_to_key.<locals>.expand.<locals>.<listcomp>  s%    777Q&&R..777r+   c              3   :   K   | ]}|         d z  |d z   z  V  dS )r   Nr*   )rJ   ri   r   s     r,   rv   z9_DES3CBC.random_to_key.<locals>.expand.<locals>.<genexpr>  s4      !K!KQ47Q;1q5"8!K!K!K!K!K!Kr+   c                     g | ]}|S r*   r*   )rJ   rs   s     r,   rM   z:_DES3CBC.random_to_key.<locals>.expand.<locals>.<listcomp>  s    AAAAaAAAr+      )rB   sumrm   rC   r   )r   
firstbyteslastbyter   r   s   `   @r,   expandz&_DES3CBC.random_to_key.<locals>.expand  s    B B B t99>>>>7777$777Jvc!K!K!K!K%((!K!K!KKKLLHAAxj)@AAABBH)) :#Xa[4%7$899Or+   r   r   r/   r2   )rB   r   r   r   )r   r   r   k1k2k3s         r,   r   z_DES3CBC.random_to_key  s    
	 	 	 t99??0111VD!H%%vvd1R4j'9'966$rss);L;LB3;R"---r+   c                     ||dk    rt          d          |                     t          ||z   d                    }|                     |d          S )Nr+   z%Invalid DES3 string-to-key parametersr      kerberos)r   r   r   r   )r   r[   saltparamsks        r,   string_to_keyz_DES3CBC.string_to_key&  sT    &C--DEEEfVd]B7788zz![)))r+   c                 2   t          |          dz  dk    sJ t          j        |j                  }t	          j        t          d                    }t          ||t                                	                                }|
                    |          }|S Nr0   r   )rB   ciphers	TripleDESr   r   CBCrC   r   r   	encryptorrY   )r   ra   r   algocbcr   r   s          r,   r   z_DES3CBC.basic_encrypt-  s    9~~!Q&&&& ..ia!!4o&7&788BBDD	%%i00
r+   c                 2   t          |          dz  dk    sJ t          j        |j                  }t	          j        t          d                    }t          ||t                                	                                }|
                    |          }|S r   )rB   r   r   r   r   r   rC   r   r   	decryptorrY   )r   ra   r   r   r   r   r   s          r,   r   z_DES3CBC.basic_decrypt6  s    :"a'''' ..ia!!4o&7&788BBDD	$$Z00	r+   N)r    r!   r"   r   r&   r   keysizer   r   rE   r   r   r:   r   r   r   r   r   r   r*   r+   r,   r   r     s        lGGHIGG{H. . [., * * [*   [   [  r+   r   c                   j    e Zd ZdZdZdZej        Ze	d             Z
e	d             Ze	d             ZdS )_AESEnctyper   r   r1   c                 4   t          d|pd          \  }t          |          }t          t          j                    | j        ||t                                }|                    |          }|                     |          }|                     |d          S )Nz>Ls      )	algorithmlengthr   
iterationsbackendr   )	r   r   r   r   r:   r   r   r   r   )	r   r[   r   r   r   pwbyteskdfr   tkeys	            r,   r   z_AESEnctype.string_to_keyG  s    tV%B/BCCF##6;== #"$.!0!2!2	4 4 4
 zz'""  &&zz$,,,r+   c                    t          |          dk    sJ t          j        |j                  }t	          j        t          d                    }t          ||t                                fd} |t          |d                    }t          |          dk    r<t          |          dz  pd}|d d         |dd          z   |dd         d |         z   }|S )Nr   c                 Z                                     }|                    |           }|S rA   )r   rY   )r   r   r   aes_ctxs      r,   aes_encryptz._AESEnctype.basic_encrypt.<locals>.aes_encrypt\  s-    ))++I")))44Jr+   ii)
rB   r   AESr   r   r   rC   r   r   rG   )	r   ra   r   r   r   r   ctextlastlenr   s	           @r,   r   z_AESEnctype.basic_encryptT  s    9~~####{3<((ib		""sO$5$566	 	 	 	 	
 HY3344y>>B )nnr)/RG$3$K%+-c#gxx0HHEr+   c                    t                    dk    sJ t          j        |j                  }t	          j        t          d                    }t          ||t                                fd}t                    dk    r |          S fdt          dt                    d          D             }t          |d                   }t          d          }d}	|d d         D ] }
|	t           ||
          |          z  }	|
}! ||d                   }
t          |
d |         |d                   }|
|d          }|	t           ||d         |z             |          z  }	|	|z   S )Nr   c                 Z                                     }|                    |           }|S rA   )r   rY   )r   r   r   r   s      r,   aes_decryptz._AESEnctype.basic_decrypt.<locals>.aes_decryptq  s-    ))++I!((44Ir+   c                 *    g | ]}||d z            S )r   r*   )rJ   r   r   s     r,   rM   z-_AESEnctype.basic_decrypt.<locals>.<listcomp>y  s&    OOOA:aBh'OOOr+   r   r+   r   )rB   r   r   r   r   r   rC   r   r   rm   rQ   )r   ra   r   r   r   r   cblocksr   prev_cblockr   rs   lastplaintextomittedr   s     `          @r,   r   z_AESEnctype.basic_decrypti  s   :"$$$${3<((ib		""sO$5$566	 	 	 	 	
 z??b  ;z***OOOOq#j//21N1NOOOgbk""Bii	" 	 	A;;q>>;???IKK K$$!!HWH+wr{;;GHH+ 	Y{{72;+@AA;OOO	=((r+   N)r    r!   r"   r   rE   r   r   r:   r   r   r   r   r   r*   r+   r,   r   r   @  sy        IGG{H
- 
- [
-   [( ") ") [") ") ")r+   r   c                   $    e Zd Zej        ZdZdZdS )
_AES128CTSr   N)r    r!   r"   r   r'   r   r   r   r*   r+   r,   r   r             nGGHHHr+   r   c                   $    e Zd Zej        ZdZdZdS )
_AES256CTS    N)r    r!   r"   r   r(   r   r   r   r*   r+   r,   r  r    r  r+   r  c                       e Zd Zej        ZdZdZed             Z	e
d             Ze
d             Ze
d             Ze
d             ZdS )_RC4r   c                 H    ddd}| |v r||          n| }t          d|          S )Nr0   r   )r   r   <i)r   )r   tablemsusages      r,   	usage_strz_RC4.usage_str  s6     2%-%6%6%//HD'"""r+   c                     t          |          }t                      }|                                 |                    |           |                                }t          | j        |          S rA   )r   r   set_anonymousset_passwordget_nt_hashr   r   )r   r[   r   r   
utf8stringtmpnthashs          r,   r   z_RC4.string_to_key  s_    ''
mm$$$""3;'''r+   c                    |t          d          }t          |j        |                     |          t          j                  }t          |||z   t          j                  }t          ||t          j                  }t          t          j        |          d t                                
                                }|                    ||z             }	||	z   S )Nr0   )r   rc   r   r  r   r7   r   r   ARC4r   r   rY   )
r   ra   r   r   r   r   cksumr   r   r   s
             r,   r   z_RC4.encrypt  s    )!,,Js|S]]8%<%<fjII"j94fjAAr5&*--LdO$5$57 77@y{{ 	  i!788u}r+   c                    t          |          dk     rt          d          |d d         |dd          }}t          |j        |                     |          t
          j                  }t          ||t
          j                  }t          t          j	        |          d t                                                                }|                    |          }	t          ||	t
          j                  }
t          ||
          }|s_|dk    rYt          |j        t          dd          t
          j                  }t          ||	t
          j                  }
t          ||
          }|st          d          |	dd          S )Nr   r   r   	   r  r0   r   )rB   r   rc   r   r  r   r7   r   r   r  r   r   rY   rV   r   r?   )r   ra   r   r   r  r   r   r   r   r   	exp_cksumoks               r,   r   z_RC4.decrypt  sL   z??R3444'_jo{s|S]]8%<%<fjIIr5&*--LdO$5$57 77@y{{ 	#**;77b/6:>>	y)) 	.h!mm3<dA
CCB!"ovzBBIE9--B 	B!"@AAAqrr""r+   c                 B    t          |j        |t          j                  S rA   )rc   r   r   r:   )r   ra   r[   s      r,   r   z_RC4.prf  s    vv{;;;r+   N)r    r!   r"   r   r)   r   r   r   staticmethodr  r   r   r   r   r   r*   r+   r,   r  r    s        kGGH# # \# ( ( [(   [ # # [#. < < [< < <r+   r  c                   $    e Zd Zed             ZdS )_ChecksumProfilec                 r    |                      |||          }t          ||          st          d          d S )Nzchecksum verification failure)checksumrV   r?   )r   ra   r   textr  expecteds         r,   verifyz_ChecksumProfile.verify  sE    <<Xt44%** 	C!"ABBB	C 	Cr+   N)r    r!   r"   r   r"  r*   r+   r,   r  r    s4         C C [C C Cr+   r  c                   Z     e Zd Zed             Ze fd            Zed             Z xZS )_SimplifiedChecksumc                     | j                             |t          d|d                    }t          |j        || j         j                  }|d | j                 S )Nr      )encr   r   rc   r   r   r   )r   ra   r   r   kcr   s         r,   r  z_SimplifiedChecksum.checksum  sL    W^^CeXt!<!<==dCG,<==LS[L!!r+   c                     |j         | j        j         k    rt          d          t          t          |                               ||||           d S NzWrong key type for checksum)r   r'  r   superr$  r"  r   ra   r   r   r  	__class__s        r,   r"  z_SimplifiedChecksum.verify  sN    ;#'/)):;;;!3''..sHdEJJJJJr+   c                     | j         S rA   )r   r   s    r,   checksum_lenz _SimplifiedChecksum.checksum_len  s
    {r+   r    r!   r"   r   r  r"  r0  __classcell__r-  s   @r,   r$  r$    s         " " ["
 K K K K [K
   [    r+   r$  c                       e Zd ZdZeZdS )_SHA1AES128r1   N)r    r!   r"   r   r   r'  r*   r+   r,   r5  r5            G
CCCr+   r5  c                       e Zd ZdZeZdS )_SHA1AES256r1   N)r    r!   r"   r   r  r'  r*   r+   r,   r8  r8    r6  r+   r8  c                       e Zd ZdZeZdS )	_SHA1DES3r   N)r    r!   r"   r   r   r'  r*   r+   r,   r:  r:    s        G
CCCr+   r:  c                   Z     e Zd Zed             Ze fd            Zed             Z xZS )_HMACMD5c                     t          |j        dt          j                  }t	          t
                              |          |z   t          j                  }t          ||t          j                  S )Ns   signaturekey )rc   r   r   r7   r^   r  r  )r   ra   r   r   ksignmd5hashs         r,   r  z_HMACMD5.checksum  sN    #,(96:FFdnnX66=vzJJ444r+   c                     |j         t          j        k    rt          d          t	          t
          |                               ||||           d S r*  )r   r   r)   r   r+  r<  r"  r,  s        r,   r"  z_HMACMD5.verify  sK    ;'+%%:;;;h##C4?????r+   c                 $    t           j        j        S rA   r   r7   digest_sizer/  s    r,   r0  z_HMACMD5.checksum_len      z%%r+   r1  r3  s   @r,   r<  r<    s}        5 5 [5
 @ @ @ @ [@
 & & [& & & & &r+   r<  c                   :    e Zd Zed             Zed             ZdS )_MD5c                 6    t          |t          j                  S rA   )r^   r   r7   r   ra   r   r   s       r,   r  z_MD5.checksum#  s     4,,,r+   c                 $    t           j        j        S rA   rB  r/  s    r,   r0  z_MD5.checksum_len(  rD  r+   Nr    r!   r"   r   r  r0  r*   r+   r,   rF  rF  "  sH        - - [- & & [& & &r+   rF  c                   :    e Zd Zed             Zed             ZdS )_SHA1c                 6    t          |t          j                  S rA   )r^   r   r:   rH  s       r,   r  z_SHA1.checksum.  s     4---r+   c                 $    t           j        j        S rA   )r   r:   rC  r/  s    r,   r0  z_SHA1.checksum_len3  s    {&&r+   NrJ  r*   r+   r,   rL  rL  -  sH        . . [. ' ' [' ' 'r+   rL  c                   :    e Zd Zed             Zed             ZdS )_CRC32c                 J    t          |d           dz  }t          d|          S )Nl    z<I)r	   r   )r   ra   r   r   r  s        r,   r  z_CRC32.checksum9  s+     j)))Z7D%   r+   c                     dS )N   r*   r/  s    r,   r0  z_CRC32.checksum_len?  s    qr+   NrJ  r*   r+   r,   rP  rP  8  sH        ! ! [!
   [  r+   rP  c                 R    | t           vrt          d| z            t           |          S )NzInvalid enctype %d)_enctype_tabler   )r   s    r,   _get_enctype_profilerV  W  s,    n$$-7888'""r+   c                 R    | t           vrt          d| z            t           |          S )NzInvalid cksumtype %d)_checksum_tabler   )	cksumtypes    r,   _get_checksum_profilerZ  ]  s,    ''/);<<<9%%r+   c                       e Zd Zd Zd ZdS )r   c                     t          |          }t          |          |j        k    rt          d          || _        || _        d S )NzWrong key length)rV  rB   r   r   r   r   )selfr   r   es       r,   __init__zKey.__init__d  sC     ))x==AI%%/000 r+   c                 d    d| j         t          | j                                      d          fz  S )Nzenctype=%d contents=%sascii)r   r
   r   decoder]  s    r,   __str__zKey.__str__k  s3    '4<&&--g66+8 8 	8r+   N)r    r!   r"   r_  rd  r*   r+   r,   r   r   c  s2        ! ! !8 8 8 8 8r+   r   c                 .    t          |           }|j        S rA   )rV  r   )r   r^  s     r,   r   r   o  s    W%%A:r+   c                     t          |           }t          |          |j        k    rt          d          |                    |          S )NzWrong crypto seed length)rV  rB   r   r   r   )r   r   r^  s      r,   r   r   t  sC    W%%A
4yyAJ3444??4   r+   c                 N    t          |           }|                    |||          S rA   )rV  r   )r   r[   r   r   r^  s        r,   r   r   {  s%    W%%A??64000r+   c                 Z    t          | j                  }|                    | |||          S rA   )rV  r   r   )ra   r   r   r   r^  s        r,   r   r     s)    S[))A99S(Iz:::r+   c                 X    t          | j                  }|                    | ||          S rA   )rV  r   r   )ra   r   r   r^  s       r,   r   r     s)     	S[))A99S(J///r+   c                 V    t          | j                  }|                    | |          S rA   )rV  r   r   )ra   r[   r^  s      r,   r   r     s%    S[))A55fr+   c                 N    t          |           }|                    |||          S rA   )rZ  r  )rY  ra   r   r   cs        r,   make_checksumrm    s%    i((A::c8T***r+   c                 T    t          |           }|                    ||||           d S rA   )rZ  r"  )rY  ra   r   r   r  rl  s         r,   verify_checksumro    s/     	i((AHHS(D%(((((r+   c                 H    t          |           }|                                S rA   )rZ  r0  )rY  rl  s     r,   r0  r0    s    i((A>>r+   c                     d}d}t          |          |k     r<|t          | t          |g          |z             z  }|dz  }t          |          |k     <|d |         S )Nr+   r   )rB   r   rC   )ra   pepperlnoutr   s        r,   prfplusru    se    
CE
c((R--s3ug/000
 c((R-- ss8Or+   c           
          || j         }t          |          }|                    t          t	          | ||j                  t	          |||j                                      S rA   )r   rV  r   rQ   ru  r   )key1key2pepper1pepper2r   r^  s         r,   cf2r{    se     ,W%%A??9WT7AJ%G%G%,T7AJ%G%GI I J J Jr+   c                 6    t                               |           S rA   )rC   fromhex)hexstrs    r,   hr    s    ==   r+   c                       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 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d  Z"d! Z#d" Z$d# Z%d$ Z&d% Z'd& Z(d' Z)d( Z*d) Z+d* Z,d+ Z-d, Z.d- Z/d. Z0d/S )0
KcrytoTestzkcrypto Test case.c                 2   t          d          }t          d          }d}d}t          d          }t          t          j        |          }|                     t          ||||          |           |                     t          |||          |           d S )N 9062430C8CDA3388922E6D6A509F5B7A 94B491F481485B9A0678CD3C4EA386ADr   s	   9 bytesssJ68FB9679601F45C78857B2BF820FD6E53ECA8D42FD4B1D7024A09205ABB7CD2EC26C355D2F)r  r   r   r'   assertEqualr   r   r]  kbconfr   plainctxtr   s          r,   test_aes128_cryprzKcrytoTest.test_aes128_crypr  s    122344 " # ###HeT::DAAAHd33U;;;;;r+   c                 2   t          d          }t          d          }d}d}t          d          }t          t          j        |          }|                     t          ||||          |           |                     t          |||          |           d S )N@F1C795E9248A09338D82C3F8D5B567040B0110736845041347235B1404231398 E45CA518B42E266AD98E165E706FFB60rS     30 bytes bytes bytes bytes byttD1137A4D634CFECE924DBC3BF6790648BD5CFF7DE0E7B99460211D0DAEF3D79A295C688858F3B34B9CBD6EEBAE81DAF6B734D4D498B6714F1C1D)r  r   r   r(   r  r   r   r  s          r,   test_aes256_cryptzKcrytoTest.test_aes256_crypt  s       3441 L M M##HeT::DAAAHd33U;;;;;r+   c                     t          d          }d}d}t          d          }t          t          j        |          }t	          t
          j        ||||           d S )Nr  r   s%   eight nine ten eleven twelve thirteen01A4B088D45628F6946614E3)r  r   r   r'   ro  r.   r;   r]  r  r   r  r  r   s         r,   test_aes128_checksumzKcrytoTest.test_aes128_checksum  sX    1228,--##	-q(E5IIIIIr+   c                     t          d          }d}d}t          d          }t          t          j        |          }t	          t
          j        ||||           d S )N@B1AE4CD8462AFF1677053CC9279AAC30B796FB81CE21474DD3DDBCFEA4EC76D7rS  s   fourteenE08739E3279E2903EC8E3836)r  r   r   r(   ro  r.   r<   r  s         r,   test_aes256_checksumzKcrytoTest.test_aes256_checksum  s^       ,--##	-q(E5IIIIIr+   c                     d}d}t          d          }t          d          }t          t          j        |||          }|                     |j        |           d S )N   password   ATHENA.MIT.EDUraeburn00000002 C651BF29E2300AC27FA469D693BDDA13)r  r   r   r'   r  r   r]  r[   r   r   r  r   s         r,   test_aes128_string_to_keyz$KcrytoTest.test_aes128_string_to_key  sX    ':122'.&$??R(((((r+   c                     d}d}t          d          }t          d          }t          t          j        |||          }|                     |j        |           d S )Ns@   XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXs   pass phrase equals block size000004B0@89ADEE3608DB8BC71F1BFBFE459486B05618B70CBAE22092534E56C553BA4B34)r  r   r   r(   r  r   r  s         r,   test_aes256_string_to_keyz$KcrytoTest.test_aes256_string_to_key  s^    /:   '.&$??R(((((r+   c                     t          d          }t          t          j        dd          }|                     t          |d          |           d S )N 77B39A37A868920F2A51F9DD150C5717   key1s   a)r  r   r   r'   r  r   r]  r  r   s      r,   test_aes128_prfzKcrytoTest.test_aes128_prf  I    122'.'7;;Q,,b11111r+   c                     t          d          }t          t          j        dd          }|                     t          |d          |           d S )N 0D674DD0F9A6806525A4D92E828BD15A   key2s   b)r  r   r   r(   r  r   r  s      r,   test_aes256_prfzKcrytoTest.test_aes256_prf  r  r+   c                     t          d          }t          t          j        dd          }t          t          j        dd          }t	          ||dd          }|                     |j        |           d S )N 97DF97E4B798B29EB31ED7280287A92Ar  r     a   b)r  r   r   r'   r{  r  r   r]  r  r   r   r   s        r,   test_aes128_cf2zKcrytoTest.test_aes128_cf2	  sg    1227>7G<<7>7G<<Bd##R(((((r+   c                     t          d          }t          t          j        dd          }t          t          j        dd          }t	          ||dd          }|                     |j        |           d S )N@4D6CA4E629785C1F01BAF55E2E548566B9617AE3A96868C337CB93B5E72B1C7Br  r  r  r  )r  r   r   r(   r{  r  r   r  s        r,   test_aes256_cf2zKcrytoTest.test_aes256_cf2  sm       7>7G<<7>7G<<Bd##R(((((r+   c                 N   t          d          }t          d          }d}d}t          d          }t          t          j        |          }|                     t          ||||          |           |                     t          |||          t          |d                     d S )N00DD52094E0F41CECCB5BE510A764B35176E3981332F1E59894690A17B2DA3C9Br   s   13 bytes byteX839A17081ECBAFBCDC91B88C6955DD3C4514023CF177B77BF0D0177A16F705E849CB7781D76A316B193F8D30r0   )r  r   r   r&   r  r   r   rG   r  s          r,   test_des3_cryptzKcrytoTest.test_des3_crypt  s    ABB#$$  0 1 1b!!HeT::DAAAHd33XeQ5G5GHHHHHr+   c                     d}d}t          d          }t          t          j        ||          }|                     |j        |           d S )Nr  r  0850BB51358548CD05E86768C313E3BFEF7511937DCF72C3E)r  r   r   r&   r  r   )r]  r[   r   r  r   s        r,   test_des3_string_to_keyz"KcrytoTest.test_des3_string_to_key&  sK    'ABB',55R(((((r+   c                     t          d          }d}d}t          d          }t          t          j        |          }t	          t
          j        ||||           d S )N07A25DF8992296DCEDA0E135BC4046E2375B3C14C98FBC162r   s	   six seven(0EEFC9C3E049AABC1BA5C401677D9AB699082BB4)r  r   r   r&   ro  r.   r9   r  s         r,   test_des3_checksumzKcrytoTest.test_des3_checksum.  sX    ABB<==b!!	+Q%GGGGGr+   c                     t          d          }t          t          j        dd          }t          t          j        dd          }t	          ||dd          }|                     |j        |           d S )N0E58F9EB643862C13AD38E529313462A7F73E62834FE54A01r  r  r  r  )r  r   r   r&   r{  r  r   r  s        r,   test_des3_cf2zKcrytoTest.test_des3_cf27  sg    ABB7<'::7<'::Bd##R(((((r+   c                 2   t          d          }t          d          }d}d}t          d          }t          t          j        |          }|                     t          ||||          |           |                     t          |||          |           d S )N 68F263DB3FCE15D031C9EAB02D67107A37245E73A45FBF72rS  r  l95F9047C3AD75891C2E9B04B16566DC8B6EB9CE4231AFB2542EF87A7B5A0F260A99F0460508DE0CECC632D07C354124E46C5D2234EB8)r  r   r   r)   r  r   r   r  s          r,   test_rc4_cryptzKcrytoTest.test_rc4_crypt?  s    122#$$1 D E ER  HeT::DAAAHd33U;;;;;r+   c                     d}t          d          }t          t          j        |d           }|                     |j        |           d S )Ns   foo AC8E657F83DF82BEEA5D43BDAF7800CC)r  r   r   r)   r  r   )r]  r[   r  r   s       r,   test_rc4_string_to_keyz!KcrytoTest.test_rc4_string_to_keyK  sF    122'+vt44R(((((r+   c                     t          d          }d}d}t          d          }t          t          j        |          }t	          t
          j        ||||           d S )N F7D3A155AF5E238A0B7A871A96BA2AB2   "   seventeen eighteen nineteen twenty EB38CC97E2230F59DA4117DC5859D7EC)r  r   r   r)   ro  r.   r=   r  s         r,   test_rc4_checksumzKcrytoTest.test_rc4_checksumR  sX    1225455R  	*AxFFFFFr+   c                     t          d          }t          t          j        dd          }t          t          j        dd          }t	          ||dd          }|                     |j        |           d S )N 24D7F6B6BAE4E5C00D2082C5EBAB3672r  r  r  r  )r  r   r   r)   r{  r  r   r  s        r,   test_rc4_cf2zKcrytoTest.test_rc4_cf2[  sg    1227;997;99Bd##R(((((r+   c                     d}d}t          |||          }d}t          d          }t          t          j        ||||           d S )Ns   pwds   bytesr   9d9588cdef3a8cefc9d2c208d978f60c)r   r  ro  r.   r7   r]  etypeusagepwr   ra   r  r  s           r,   _test_md5_unkeyed_checksumz%KcrytoTest._test_md5_unkeyed_checksumc  sN    E2t,,5455	sE5%@@@@@r+   c                 B    |                      t          j        d          S N(   r  r   r&   rc  s    r,   'test_md5_unkeyed_checksum_des3_usage_40z2KcrytoTest.test_md5_unkeyed_checksum_des3_usage_40l      ..w|R@@@r+   c                 B    |                      t          j        d          S N2   r  rc  s    r,   'test_md5_unkeyed_checksum_des3_usage_50z2KcrytoTest.test_md5_unkeyed_checksum_des3_usage_50o  r  r+   c                 B    |                      t          j        d          S r  r  r   r)   rc  s    r,   &test_md5_unkeyed_checksum_rc4_usage_40z1KcrytoTest.test_md5_unkeyed_checksum_rc4_usage_40r      ..w{B???r+   c                 B    |                      t          j        d          S r  r  rc  s    r,   &test_md5_unkeyed_checksum_rc4_usage_50z1KcrytoTest.test_md5_unkeyed_checksum_rc4_usage_50u  r  r+   c                 B    |                      t          j        d          S r  r  r   r'   rc  s    r,   )test_md5_unkeyed_checksum_aes128_usage_40z4KcrytoTest.test_md5_unkeyed_checksum_aes128_usage_40x      ..w~rBBBr+   c                 B    |                      t          j        d          S r  r  rc  s    r,   )test_md5_unkeyed_checksum_aes128_usage_50z4KcrytoTest.test_md5_unkeyed_checksum_aes128_usage_50{  r  r+   c                 B    |                      t          j        d          S r  r  r   r(   rc  s    r,   )test_md5_unkeyed_checksum_aes256_usage_40z4KcrytoTest.test_md5_unkeyed_checksum_aes256_usage_40~  r  r+   c                 B    |                      t          j        d          S r  r  rc  s    r,   )test_md5_unkeyed_checksum_aes256_usage_50z4KcrytoTest.test_md5_unkeyed_checksum_aes256_usage_50  r  r+   c                     d}d}t          |||          }d}t          d          }t          t          j        ||||           d S )Nr     salts"   twenty nineteen eighteen seventeen(381c870d8875d1913555de19af5c885fd27b7da9)r   r  ro  r.   r:   r  s           r,   _test_sha1_unkeyed_checksumz&KcrytoTest._test_sha1_unkeyed_checksum  sN    E2t,,5<==	UE5AAAAAr+   c                 B    |                      t          j        d          S r  r  r   r&   rc  s    r,   (test_sha1_unkeyed_checksum_des3_usage_40z3KcrytoTest.test_sha1_unkeyed_checksum_des3_usage_40      //bAAAr+   c                 B    |                      t          j        d          S r  r   rc  s    r,   (test_sha1_unkeyed_checksum_des3_usage_50z3KcrytoTest.test_sha1_unkeyed_checksum_des3_usage_50  r  r+   c                 B    |                      t          j        d          S r  r  r   r)   rc  s    r,   'test_sha1_unkeyed_checksum_rc4_usage_40z2KcrytoTest.test_sha1_unkeyed_checksum_rc4_usage_40      //R@@@r+   c                 B    |                      t          j        d          S r  r  rc  s    r,   'test_sha1_unkeyed_checksum_rc4_usage_50z2KcrytoTest.test_sha1_unkeyed_checksum_rc4_usage_50  r  r+   c                 B    |                      t          j        d          S r  r  r   r'   rc  s    r,   *test_sha1_unkeyed_checksum_aes128_usage_40z5KcrytoTest.test_sha1_unkeyed_checksum_aes128_usage_40      //CCCr+   c                 B    |                      t          j        d          S r  r  rc  s    r,   *test_sha1_unkeyed_checksum_aes128_usage_50z5KcrytoTest.test_sha1_unkeyed_checksum_aes128_usage_50  r  r+   c                 B    |                      t          j        d          S r  r  r   r(   rc  s    r,   *test_sha1_unkeyed_checksum_aes256_usage_40z5KcrytoTest.test_sha1_unkeyed_checksum_aes256_usage_40  r  r+   c                 B    |                      t          j        d          S r  r  rc  s    r,   *test_sha1_unkeyed_checksum_aes256_usage_50z5KcrytoTest.test_sha1_unkeyed_checksum_aes256_usage_50  r  r+   c                     d}d}t          |||          }d}t          d          }t          t          j        ||||           d S )Nr  r  s$   africa america asia australia europece595a53)r   r  ro  r.   r4   r  s           r,   _test_crc32_unkeyed_checksumz'KcrytoTest._test_crc32_unkeyed_checksum  sK    E2t,,7*	eUEBBBBBr+   c                 B    |                      t          j        d          S r  r  r   r&   rc  s    r,   )test_crc32_unkeyed_checksum_des3_usage_40z4KcrytoTest.test_crc32_unkeyed_checksum_des3_usage_40      00rBBBr+   c                 B    |                      t          j        d          S r  r  rc  s    r,   )test_crc32_unkeyed_checksum_des3_usage_50z4KcrytoTest.test_crc32_unkeyed_checksum_des3_usage_50  r  r+   c                 B    |                      t          j        d          S r  r  r   r)   rc  s    r,   (test_crc32_unkeyed_checksum_rc4_usage_40z3KcrytoTest.test_crc32_unkeyed_checksum_rc4_usage_40      00bAAAr+   c                 B    |                      t          j        d          S r  r   rc  s    r,   (test_crc32_unkeyed_checksum_rc4_usage_50z3KcrytoTest.test_crc32_unkeyed_checksum_rc4_usage_50  r"  r+   c                 B    |                      t          j        d          S r  r  r   r'   rc  s    r,   +test_crc32_unkeyed_checksum_aes128_usage_40z6KcrytoTest.test_crc32_unkeyed_checksum_aes128_usage_40      00DDDr+   c                 B    |                      t          j        d          S r  r&  rc  s    r,   +test_crc32_unkeyed_checksum_aes128_usage_50z6KcrytoTest.test_crc32_unkeyed_checksum_aes128_usage_50  r(  r+   c                 B    |                      t          j        d          S r  r  r   r(   rc  s    r,   +test_crc32_unkeyed_checksum_aes256_usage_40z6KcrytoTest.test_crc32_unkeyed_checksum_aes256_usage_40  r(  r+   c                 B    |                      t          j        d          S r  r,  rc  s    r,   +test_crc32_unkeyed_checksum_aes256_usage_50z6KcrytoTest.test_crc32_unkeyed_checksum_aes256_usage_50  r(  r+   N)1r    r!   r"   __doc__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  r  r  r  r  r  r  r!  r$  r'  r*  r-  r/  r*   r+   r,   r  r    s       
< 
< 
<< < <J J JJ J J) ) )) ) )2 2 22 2 2) ) )) ) )
I 
I 
I) ) )H H H) ) )
< 
< 
<) ) )G G G) ) )A A AA A AA A A@ @ @@ @ @C C CC C CC C CC C CB B BB B BB B BA A AA A AD D DD D DD D DD D DC C CC C CC C CB B BB B BE E EE E EE E EE E E E Er+   r  __main__rA   )bsysospathinsertenvironmathr   	functoolsr   structr   r   binasciir	   r
   cryptography.hazmat.primitivesr   r   &cryptography.hazmat.primitives.ciphersr   r   r   +cryptography.hazmat.primitives.ciphers.baser   cryptography.hazmat.backendsr   )cryptography.hazmat.primitives.kdf.pbkdf2r   samba.testsr   samba.credentialsr   sambar   r   samba.commonr   r   objectr   r.   r   r?   rG   rQ   rV   r^   rc   r   r   r   r   r   r   r   r  r  r  r$  r5  r8  r:  r<  rF  rL  rP  r&   r'   r(   r)   rU  r9   r;   r<   r=   r7   r:   r4   rX  rV  rZ  r   r   r   r   r   r   r   rm  ro  r0  ru  r{  r  r  r    unittestmainr*   r+   r,   <module>rG     s  Z 


 				 <      !$
                      # # # # # # # # 1 1 1 1 1 1 / / / / / / H H H H H H 8 8 8 8 8 8 > > > > > > 8 8 8 8 8 8 @ @ @ @ @ @             ) ) ) ) ) ) ; ; ; ; ; ; . . . . . . . .    f   
 
 
 
 
 
 
 
	 	 	 	 	j 	 	 	  2 2 2      / / /B= = =&& & & & &f & & &$<0 <0 <0 <0 <0 <0 <0 <0~7 7 7 7 7! 7 7 7tL) L) L) L) L)$ L) L) L)^              >< >< >< >< ><? >< >< ><B
C 
C 
C 
C 
Cv 
C 
C 
C    *   0    %   
    %   
    #   
& & & & & & & &$& & & & & & & &' ' ' ' ' ' ' '	 	 	 	 	 	 	 	 L(NJNJK	 ;;M4NEOV# # #& & &
8 
8 
8 
8 
8& 
8 
8 
8  
! ! !1 1 1 1
; ; ; ;
0 0 0  
+ + +
) ) )  
  J J J J! ! !IE IE IE IE IE IE IE IEX zOOOHMOOOOO r+   