
    Fc                    R   d dl Z d dlZd dlZd dl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
 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 d d	lmZ d d
l m!Z!m"Z" d dl#m$Z$m%Z% d dl&Z'd dl&m(Z( d dl)m*c m+c m,Z- d dl.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z]m^Z^m_Z_m`Z`maZambZbmcZcmdZdmeZemfZf d dlgm*c m+c mhZh d Zieie_j        ddZke-jl        jm        e-jn        _o        e-jl        jm        e-jn        _m        eke-jn        _p        e-jq        jm        e-jr        _o        e-jq        jm        e-jr        _m        eke-jr        _p        e-js        jm        e-jt        _o        e-js        jm        e-jt        _m        eke-jt        _p        e-ju        jm        e-jv        _o        e-ju        jm        e-jv        _m        eke-jv        _p        ddZwe-jx        jm        e-jy        _o        ewe-jy        _p        e-jz        jm        e-j{        _o        ewe-j{        _p        e-j|        jm        e-j}        _o        ewe-j}        _p        e-j~        jm        e-j        _o        ewe-j        _p        e-j        jm        e-j        _o        ewe-j        _p        e-j        jm        e-j        _o        ewe-j        _p         G d d          Z G d de          Z G d de          Z G d de          Z G d de          Z G d d          Z G d de(          ZdS )     N)Enum)decode)encode)BitStringEncoder)PyAsn1Error)Credentials)krb5pacsecurity)FEATURE_SEAL)ndr_pack
ndr_unpack)SEC_CHAN_WKSTASEC_CHAN_BDC)TestCaseInTempDir)8AD_IF_RELEVANTAD_WIN2K_PACFX_FAST_ARMOR_AP_REQUESTKDC_ERR_CLIENT_REVOKEDKDC_ERR_GENERICKDC_ERR_POLICYKDC_ERR_PREAUTH_FAILEDKDC_ERR_SKEW%KDC_ERR_UNKNOWN_CRITICAL_FAST_OPTIONSKERB_ERR_TYPE_EXTENDED
KRB_AP_REP
KRB_AP_REQ
KRB_AS_REP
KRB_AS_REQ	KRB_ERRORKRB_PRIVKRB_TGS_REPKRB_TGS_REQKU_AP_REQ_AUTHKU_AS_REP_ENC_PARTKU_AP_REQ_ENC_PART	KU_AS_REQKU_ENC_CHALLENGE_KDCKU_FAST_ENCKU_FAST_FINISHEDKU_FAST_REPKU_FAST_REQ_CHKSUMKU_KRB_PRIVKU_NON_KERB_CKSUM_SALTKU_TGS_REP_ENC_PART_SESSIONKU_TGS_REP_ENC_PART_SUB_KEYKU_TGS_REQ_AUTHKU_TGS_REQ_AUTH_CKSUMKU_TGS_REQ_AUTH_DAT_SESSIONKU_TGS_REQ_AUTH_DAT_SUBKEY	KU_TICKETNT_PRINCIPALNT_SRV_INSTNT_WELLKNOWNPADATA_ENCRYPTED_CHALLENGEPADATA_ENC_TIMESTAMPPADATA_ETYPE_INFOPADATA_ETYPE_INFO2PADATA_FOR_USERPADATA_FX_COOKIEPADATA_FX_ERRORPADATA_FX_FAST
PADATA_GSSPADATA_KDC_REQPADATA_PAC_OPTIONSPADATA_PAC_REQUESTPADATA_PKINIT_KXPADATA_PK_AS_REQPADATA_PK_AS_REP_19PADATA_SUPPORTED_ETYPESPADATA_REQ_ENC_PA_REPc                     ||                     |          }t          |          }|dz  r|d|dz  z
  z  }n|}|                                }t          |          }|dk     rd|z
  }	nd}	d|z   d|	z  z   }
|
ddfS )N      r       FT)clonelenasOctets)selfvalueasn1Spec	encodeFunoptionsvalueLengthalignedValue	substratelengthpaddingrets              ?/usr/lib/python3/dist-packages/samba/tests/krb5/raw_testcase.pyBitStringEncoder_encodeValue32r\   r   s     u%%e**KQ [1_!45%%''I^^Fzzf*
I
7!2
3Ct    c                    d|                                  z  }g }d}|                                 D ]+}dD ]&}d|z  }||z  rd}nd}|                    |           ',t          |          |k     r5t	          t          |          |          D ]}	|                    d           d|z  }
d|
z  }t	          |          D ]B}	|	| j        v r| j        |	         }n||	         dk    rd|	z  }n,|d	||||	         fz  z  }d
|
z  }C|d|
z  z  }|S )N%s    )         rK            r   rf   r    z: (
%s zunknown-bit-%uz%s%s:%uz,
%s z
%s))asBinary	asNumbersappendrN   rangeprettyPrintNamedValues)rP   scoperZ   bitshighest_bitbytebitmaskvalbitPositionindentdelimnames                r[   !BitString_NamedValues_prettyPrintrx      se   

 CDK    + 	 	C8Dd{ KK	 4yy; TK88 	 	KKKNNNN5[FE[)) " "$555.{;DD+!###k1DDyE4k):;;;6!7VCJr]   c                 f    t          |           }|| j        v r| j        |         }nd}d|||fz  }|S )Nz<__unknown__>z%d (0x%x) %s)intrl   )rP   rm   intvalrw   rZ   s        r[   Integer_NamedValues_prettyPrintr|      sE    YYF,,,*62
FFD1
1CJr]   c                   B    e Zd Zd Zd Zd Zd Zd
dZd
dZd Z	d	 Z
dS )Krb5EncryptionKeyc                 "   t           j        j        t           j        j        t           j        j        t           j        j        t           j        j        t           j        j        i}|| _	        |j
        | _        || j                 | _        || _        d S N)kcryptoEnctypeAES256	CksumtypeSHA1_AES256AES128SHA1_AES128RC4HMAC_MD5keyenctypeetypectypekvno)rP   r   r   EncTypeChecksums       r[   __init__zKrb5EncryptionKey.__init__   sd    O"G$5$AO"G$5$AO!2!;

 [
$TZ0
			r]   c                 <    d| j         | j        | j        | j        fz  S )Nz etype=%d ctype=%d kvno=%d key=%s)r   r   r   r   rP   s    r[   __str__zKrb5EncryptionKey.__str__   s%    1
DJ	485= = 	=r]   c                 <    t          j        | j        ||          }|S r   )r   encryptr   )rP   usage	plaintext
ciphertexts       r[   r   zKrb5EncryptionKey.encrypt   s    _TXui@@
r]   c                 <    t          j        | j        ||          }|S r   )r   decryptr   )rP   r   r   r   s       r[   r   zKrb5EncryptionKey.decrypt   s    ODHeZ@@	r]   Nc                 Z    || j         }t          j        |          }t          |          S r   )r   r   checksum_lenbytes)rP   r   r   s      r[   make_zeroed_checksumz&Krb5EncryptionKey.make_zeroed_checksum  s,    =JE+E22\"""r]   c                 P    || j         }t          j        || j        ||          }|S r   )r   r   make_checksumr   rP   r   r   r   cksums        r[   r   zKrb5EncryptionKey.make_checksum  s+    =JE%eTXuiHHr]   c                     | j         |k    rt          d| j          d| d          t          j        || j        |||           d S )Nzkey checksum type (z) != checksum type ())r   AssertionErrorr   verify_checksumr   r   s        r[   r   z!Krb5EncryptionKey.verify_checksum  sw    :  "<tz "< "<38"< "< "< = = = 	 $ % ) %		' 	' 	' 	' 	'r]   c                 .    | j         | j        j        d}|S )N)keytypekeyvalue)r   r   contentsrP   EncryptionKey_objs     r[   
export_objzKrb5EncryptionKey.export_obj  s$    z)
 
 ! r]   r   )__name__
__module____qualname__r   r   r   r   r   r   r   r    r]   r[   r~   r~      s        	 	 	= = =    # # # #   	' 	' 	'! ! ! ! !r]   r~   c                   B     e Zd Zd fd	Zd fd	Zd fd	Z fdZ xZS )RodcPacEncryptionKeyNc                     t                                          ||           || j        }|
|dz  }|dz  }|pd }||                    dd          | _        d S d| _        d S )N     re   little	byteorderr]   )superr   r   to_bytesrodc_id)rP   r   r   r   	__class__s       r[   r   zRodcPacEncryptionKey.__init__%  sz    d###?9D%ldG"++A+BBDLLLDLLLr]   c                     t                                          |          }|t          t          | j                            z   S r   )r   r   r   rN   r   )rP   r   checksumr   s      r[   make_rodc_zeroed_checksumz.RodcPacEncryptionKey.make_rodc_zeroed_checksum5  s7    77//66%DL 1 12222r]   c                 ^    t                                          |||          }|| j        z   S r   )r   r   r   rP   r   r   r   r   r   s        r[   make_rodc_checksumz'RodcPacEncryptionKey.make_rodc_checksum9  s+    77((	5AA$,&&r]   c                    | j         r\|d d         |dd          }}| j         |k    r=t          | j                                          d|                                           t                                          ||||           d S )Nz != )r   r   hexr   r   )rP   r   r   r   r   cksum_rodc_idr   s         r[   verify_rodc_checksumz)RodcPacEncryptionKey.verify_rodc_checksum=  s    < 	?#(":uRSSz=E|},,$(8(8(:(: &> &>(5(9(9(;(;&> &> ? ? ? 	 ) % %	' 	' 	' 	' 	'r]   r   )r   r   r   r   r   r   r   __classcell__r   s   @r[   r   r   $  s              3 3 3 3 3 3' ' ' ' ' '' ' ' ' ' ' ' ' 'r]   r   c                       e Zd ZddZddZdS )ZeroedChecksumKeyNc                 ,    |                      |          S r   )r   rP   r   r   r   s       r[   r   zZeroedChecksumKey.make_checksumL  s    ((///r]   c                 ,    |                      |          S r   )r   r   s       r[   r   z$ZeroedChecksumKey.make_rodc_checksumO  s    --e444r]   r   )r   r   r   r   r   r   r]   r[   r   r   K  s<        0 0 0 05 5 5 5 5 5r]   r   c                   \     e Zd Z fdZed             ZddZd fd	ZddZd fd	Z	 xZ
S )	WrongLengthChecksumKeyc                 Z    t                                          ||           || _        d S r   )r   r   _length)rP   r   r   rX   r   s       r[   r   zWrongLengthChecksumKey.__init__T  s(    d###r]   c                 |    |t          |          z
  }|dk    r|t          |          z  }n|dk     r
|d |         }|S Nr   )rN   r   )clsr   rX   diffs       r[   _adjust_to_lengthz(WrongLengthChecksumKey._adjust_to_lengthY  sI    H%!88d#HHAXX(Hr]   Nc                 *    t          | j                  S r   r   r   rP   r   s     r[   r   z+WrongLengthChecksumKey.make_zeroed_checksumc      T\"""r]   c                     t                                          |||          }|                     || j                  S r   )r   r   r   r   r   s        r[   r   z$WrongLengthChecksumKey.make_checksumf  s6    77((	5AA%%h===r]   c                 *    t          | j                  S r   r   r   s     r[   r   z0WrongLengthChecksumKey.make_rodc_zeroed_checksumj  r   r]   c                     t                                          |||          }|                     || j                  S r   )r   r   r   r   r   s        r[   r   z)WrongLengthChecksumKey.make_rodc_checksumm  s6    77--eYFF%%h===r]   r   )r   r   r   r   classmethodr   r   r   r   r   r   r   s   @r[   r   r   S  s            
   [# # # #> > > > > ># # # #> > > > > > > > > >r]   r   c                       e Zd Zej        ej        z  ej        z  Zeej        z  ej	        z  Z
 fdZd Zd Zd Z ej        ej        j        ej        fej        j        ej        fej        j        ej        fej        j        ej        fej        j        ej        fg          Zed             Ze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 Z1 xZ2S )KerberosCredentialsc                 2   t          t          |                                            d}|t          j        z  }|t          j        z  }|t          j        z  }|| _        || _        || _	        d | _
        i | _        d | _        d | _        d | _        d | _        d S r   )r   r   r   r
   KERB_ENCTYPE_RC4_HMAC_MD5$KERB_ENCTYPE_AES128_CTS_HMAC_SHA1_96$KERB_ENCTYPE_AES256_CTS_HMAC_SHA1_96as_supported_enctypestgs_supported_enctypesap_supported_enctypesr   forced_keysforced_saltdnupnspn)rP   all_enc_typesr   s     r[   r   zKerberosCredentials.__init__|  s    !4((11333;;FFFF%2"&3#%2"	r]   c                 .    t          |          | _        d S r   )rz   r   rP   rQ   s     r[   set_as_supported_enctypesz-KerberosCredentials.set_as_supported_enctypes      %(ZZ"""r]   c                 .    t          |          | _        d S r   )rz   r   r   s     r[   set_tgs_supported_enctypesz.KerberosCredentials.set_tgs_supported_enctypes  s    &)%jj###r]   c                 .    t          |          | _        d S r   )rz   r   r   s     r[   set_ap_supported_enctypesz-KerberosCredentials.set_ap_supported_enctypes  r   r]   c                 f    d}|D ]+}| j         |         }||z  rt          d|           ||z  },|S )Nr   zGot duplicate etype: )	etype_map
ValueError)r   etypesrn   r   rq   s        r[   etypes_to_bitsz"KerberosCredentials.etypes_to_bits  sV     	 	E-&Ccz B !@!@!@AAACKDDr]   c                     d}| j                                         D ]\  }}||z  r|| z  }||fz  }|| j         z  }|dk    rt          d|           |S )Nr   r   zUnsupported etype bits: )r   itemsnon_etype_bitsr   )r   rn   r   r   rq   s        r[   bits_to_etypesz"KerberosCredentials.bits_to_etypes  s    ---// 	# 	#JE3Tz #5("###199>>>???r]   c                 6    |                      | j                  S r   )r   r   r   s    r[   get_as_krb5_etypesz&KerberosCredentials.get_as_krb5_etypes      ""4#=>>>r]   c                 6    |                      | j                  S r   )r   r   r   s    r[   get_tgs_krb5_etypesz'KerberosCredentials.get_tgs_krb5_etypes  s    ""4#>???r]   c                 6    |                      | j                  S r   )r   r   r   s    r[   get_ap_krb5_etypesz&KerberosCredentials.get_ap_krb5_etypes  r  r]   c                 (    |dz  r|dz  }|| _         d S )N           r   )rP   r   s     r[   set_kvnozKerberosCredentials.set_kvno  s#    '> 	HD			r]   c                     | j         S r   r  r   s    r[   get_kvnozKerberosCredentials.get_kvno  s
    yr]   c                     t          |          }t          j        |          }t          j        ||          }t          || j                  | j        |<   d S r   )rz   binasciia2b_hexr   Keyr   r   r   )rP   r   hexkeyr   r   s        r[   set_forced_keyz"KerberosCredentials.set_forced_key  sM    E

#F++k%**"6sDI"F"Fr]   c                 T    t          |          }| j                            |          S r   )rz   r   get)rP   r   s     r[   get_forced_keyz"KerberosCredentials.get_forced_key  s$    E

##E***r]   c                 .    t          |          | _        d S r   )r   r   )rP   salts     r[   set_forced_saltz#KerberosCredentials.set_forced_salt  s     ;;r]   c                     | j         S r   )r   r   s    r[   get_forced_saltz#KerberosCredentials.get_forced_salt  s    r]   c                    | j         | j         S |                                 }|1|                    dd          d                             dd          }n|                                 }|                                 }|t          t          fv r|                                                                 }|d         dk    r
|d d         }| 	                                
                                d|d	| 	                                                                }n)| 	                                
                                |z   }|                    d
          S )N@rf   r   / $host.utf-8)r   get_upnrsplitreplaceget_usernameget_secure_channel_typer   r   lower	get_realmupperr   )rP   r   	salt_namesecure_schannel_typesalt_strings        r[   get_saltzKerberosCredentials.get_salt  s=   '##llnn?

3**1-55c2>>II))++I#;;==N<#@@@))++1133I}##%crcN	  &&((((		  &&(((*KK
 ..**0022Y>K!!'***r]   c                     || _         d S r   r   )rP   r   s     r[   set_dnzKerberosCredentials.set_dn  s    r]   c                     | j         S r   r3  r   s    r[   get_dnzKerberosCredentials.get_dn  s	    wr]   c                     || _         d S r   r   )rP   r   s     r[   set_spnzKerberosCredentials.set_spn      r]   c                     | j         S r   r8  r   s    r[   get_spnzKerberosCredentials.get_spn  	    xr]   c                     || _         d S r   r   )rP   r   s     r[   set_upnzKerberosCredentials.set_upn  r:  r]   c                     | j         S r   r?  r   s    r[   r&  zKerberosCredentials.get_upn  r=  r]   c                     |                      |           |                     |                                 dz              d S Nrf   )set_passwordr  r  )rP   passwords     r[   update_passwordz#KerberosCredentials.update_password  s;    (###dmmoo)*****r]   )3r   r   r   r
   KERB_ENCTYPE_FAST_SUPPORTED(KERB_ENCTYPE_COMPOUND_IDENTITY_SUPPORTEDKERB_ENCTYPE_CLAIMS_SUPPORTEDfast_supported_bits.KERB_ENCTYPE_RESOURCE_SID_COMPRESSION_DISABLED'KERB_ENCTYPE_AES256_CTS_HMAC_SHA1_96_SKr   r   r   r   r   collectionsOrderedDictr   r   r   r   r   r   r   r   DES_MD5KERB_ENCTYPE_DES_CBC_MD5DES_CRCKERB_ENCTYPE_DES_CBC_CRCr   r   r   r   r  r  r  r  r  r  r  r  r  r1  r4  r6  r9  r<  r@  r&  rF  r   r   s   @r[   r   r   r  sY       #?#LM#AB )?A8:N    (0 0 01 1 10 0 0 ('		9	;		9	;		.	0		 -	/		 -	/)  I   [   [? ? ?@ @ @? ? ?    G G G+ + +' ' '     + + +0            + + + + + + +r]   r   c                   &    e Zd Z	 	 	 	 	 ddZd ZdS )KerberosTicketCredsNc
                     || _         || _        || _        || _        || _        || _        || _        || _        |	| _        d S r   )	ticketsession_keycrealmcnamesrealmsnamedecryption_keyticket_privateencpart_private)
rP   rV  rW  rX  rY  rZ  r[  r\  r]  r^  s
             r[   r   zKerberosTicketCreds.__init__  sM     &

,,.r]   c                 (    || j         d<   || _        d S Nr[  )rV  r[  )rP   r[  s     r[   	set_snamezKerberosTicketCreds.set_sname!  s    $G


r]   )NNNNNNN)r   r   r   r   ra  r   r]   r[   rT  rT    sF        $($( $ $!%/ / / /     r]   rT  c            5       6    e Zd ZdZ G d de          Zej        ej        ej	        ej
        hZdddej        j        ddej        j        ddej        j        d	dfZ e            Zd
Zed             Zed             Zd Ze fd            Z fdZ fdZd ZddZddZ	 	 ddZ	 	 	 	 ddZ 	 	 	 	 	 ddZ!	 	 ddZ"	 	 ddZ#	 	 ddZ$	 	 ddZ%	 	 ddZ&	 	 ddZ'	 	 ddZ(d  Z)dd!Z*dd"Z+	 	 	 	 dd#Z,	 	 	 	 dd$Z-dd%Z.dd&Z/dd(Z0dd)Z1dd*Z2dd+Z3d, Z4d- Z5	 	 	 	 dd.Z6d/ Z7d0 Z8d1 Z9d2 Z:dd3Z;d4 Z<d5 Z=d6 Z>d7 Z?d8 Z@d9 ZAddd:d;ZBdd<ZCdd=ZDd> ZEd? ZFd@ ZGddAZH	 	 ddBZIddCZJdD ZKddEZLddFZMdG ZNdH ZOdI ZPddJZQedK             ZRdL ZSdM ZTdN ZUdO ZVdP ZWdQ ZXdR ZYdS ZZddTZ[dU Z\	 	 ddVZ]	 	 	 ddWZ^	 	 	 ddXZ_dY Z`dZ Za	 	 	 	 	 dd[Zbdd\Zc	 	 dd]Zd	 	 	 	 dd^Zed_ Zfd` Zg	 	 	 	 ddaZh	 	 	 	 	 	 	 	 	 	 	 	 ddbZiddd
ddddddddddddddddejddddddcddddddddddddddddddddddddddd
f4deZkddd
ddddddddddddddddejdddddcddddddddddddddddddddddddddddd
f5dfZldg Zm	 	 ddhZndi Zodj Zp	 ddkZqdl Zrdm Zs	 ddnZt	 	 ddoZudp Zvdq Zwdr Zxds Zydt Zzdu Z{dv Z|	 	 	 ddwZ}dddd
d
ddddxdyZ~	 ddzZ	 	 dd{Zdd|Zdd}Zd~ Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ xZS )RawKerberosTestzA raw Kerberos Test case.c                   6    e Zd Z e            Z e            ZdS )RawKerberosTest.KpasswdModeN)r   r   r   objectSETCHANGEr   r]   r[   KpasswdModere  )  s$        fhhr]   ri  idummy)rQ   rw   aes128aes256rc4Fc                    | j         rd S g }t          | j                  }g }t          d|dz             D ]Z}t	          t          j        t          |          |                    }|D ]&}t	          |          }|                    |           '[|D ]\}d }	d}
|D ]9}| j        |         d         }|	|}	n|	d|z  z  }	|
| j        |         d         fz  }
:|	|
d}|                    |           ]|| _        d| _         d S )Nrf   r   rw   z_%srQ   )rw   r   T)	"setup_etype_test_permutations_donerN   etypes_to_testrk   list	itertoolspermutationsrj   etype_test_permutations)r   resnum_idxsrs  numchunkeelprw   r   idxnrs                 r[   setup_etype_test_permutationsz-RawKerberosTest.setup_etype_test_permutations=  sE   1 	Fs)**HqL)) 	( 	(C/hEEFFE ( (!WW##B''''(  	 	ADF > >&s+F3<DDEAI%D3-c27;==22AJJqMMMM&)#15...r]   c                     |                                   g }d}| j        D ]&}|d         |f}|dz  }|                    |           '|S )Nr   rw   rf   )r  rt  rj   )r   ru  r|  ry  r~  s        r[   etype_test_permutation_name_idxz/RawKerberosTest.etype_test_permutation_name_idx]  s]    ))+++, 	 	A6C A1HCJJqMMMM
r]   c                 <    | j         |         }|d         |d         fS )Nrw   r   )rt  )rP   r|  ry  s      r[   etype_test_permutation_by_idxz-RawKerberosTest.etype_test_permutation_by_idxh  s"    (-&	1X;''r]   c                    t                                                       t          j                            d          | _        t          j                            d          | _        i | _        t          j                            dd          }|d}t          t          |                    | _
        t          j                            dd          }|d}t          t          |                    | _        t          j                            dd          }|d}t          t          |                    | _        t          j                            d	d          }|d}t          t          |                    | _        t          j                            d
d          }|d}t          t          |                    | _        t          j                            dd          }|d}t          t          |                    | _        t          j                            dd          }|d}t          t          |                    | _        t          j                            dd          }|d}t          t          |                    | _        t          j                            dd          }	|	d}	t          t          |	                    | _        t          j                            dd          }
|
d}
t          t          |
                    | _        t          j                            dd          }|d}t          t          |                    | _        t          j                            dd          }|t          |          }|| _        t          j                            dd          }|d}t          t          |                    | _        d S )NSERVER	DC_SERVERFAST_SUPPORTTallow_missing0CLAIMS_SUPPORTCOMPOUND_ID_SUPPORTTKT_SIG_SUPPORTFULL_SIG_SUPPORTGNUTLS_PBKDF2_SUPPORT1
EXPECT_PACEXPECT_EXTRA_PAC_BUFFERSCHECK_CNAMECHECK_PADATAKADMIN_IS_TGSDEFAULT_ETYPES
FORCED_RC4)r   
setUpClasssambatestsenv_get_var_valuer#  dc_host
creds_dictboolrz   kdc_fast_supportkdc_claims_supportkdc_compound_id_supporttkt_sig_supportfull_sig_supportgnutls_pbkdf2_support
expect_pacexpect_extra_pac_bufferscname_checkingpadata_checkingkadmin_is_tgsdefault_etypes
forced_rc4)r   r  r  r  r  r  r  r  r  r  r  r  r  r  r   s                 r[   r  zRawKerberosTest.setUpClassl  s   ;00::k33K@@  ;88GK 9 M M#"#C(8$9$9::"[::;KIM ; O O%!$!%c*<&=&=!>!>"'+"?"?! #@ #  #  #*&)#&*3/F+G+G&H&H#+778IFJ 8 L L"!O"3#7#788 ;889KGK 9 M M#"#C(8$9$9:: % = =# !> !  !  !($'!$(-B)C)C$D$D![22<AE 3 G G
Jc*oo..#(;#@#@& $A $  $   $+'*$'+C0H,I,I'J'J$66}EI 7 K K! N!#n"5"566+77FJ 8 L L"!O"3#7#78855oDH 6 J J M ]!3!344667GEI 7 K K% 00N+[22<AE 3 G G
Jc*oo..r]   c                 $   t                                                       d| _        d| _        t          j                            dd          }|d}t          t          |                    | _	        d | _
        t                      | _        d S )NFSTRICT_CHECKINGTr  r  )r   setUpdo_asn1_print
do_hexdumpr  r  r  r  rz   strict_checkingsrf  unspecified_kvno)rP   r  r   s     r[   r  zRawKerberosTest.setUp  s    "+778IFJ 8 L L"!O#C$8$899 &r]   c                 r    |                      d           t                                                       d S )NtearDown)_disconnectr   r  )rP   r   s    r[   r  zRawKerberosTest.tearDown  s3    $$$r]   c                     | j         d S | j                                          d | _         | j        r$t          j                            d|z             d S d S )Nzdisconnect[%s]
)r  closer  sysstderrwrite)rP   reasons     r[   r  zRawKerberosTest._disconnect  sZ    6>F? 	:J/&899999	: 	:r]   Nc                 N   |d}	 t          j        ||t           j        t           j        t           j        d          | _        t          j         | j        d         d         | j        d         d         | j        d         d                   | _        | j                            d           | j                            | j        d         d                    d S # t           j	        $ r | j        
                                  t          $ r | j        
                                  w xY w)NX   r   rf   re   
   rK   )socketgetaddrinfo	AF_UNSPECSOCK_STREAMSOL_TCPar  
settimeoutconnecterrorr  IOErrorrP   r#  ports      r[   _connect_tcpzRawKerberosTest._connect_tcp  s    <D	'dF4D(.(:FN()+ +DF ]46!9Q<1tvay|LLDFFb!!!FNN46!9Q<(((((| 	 	 	FLLNNN 	 	 	FLLNNN	s   CC AD$c                     |                                   |                     ||           | j        r$t          j                            d|z             d S d S )Nzconnected[%s]
)assertNotConnectedr  r  r  r  r  r  s      r[   r  zRawKerberosTest.connect  s`    !!!$%%%? 	7J.566666	7 	7r]   Tc                     d }|+|p|}t           j                            |d||          }nd}|#|r!t           j                            ||          }|S )N_r  T)r  r  r  )rP   varnameprefixfallback_defaultr  rs   allow_missing_prefixs          r[   env_get_varzRawKerberosTest.env_get_var  s     #0#D4D +//!6677+2 0 4 4CC  $;+;+//>K 0 M MC
r]   c                 6   t                      }|                                 |                     d|          }|                     d|          }|d u}	|                     d|d|	          }
|
|}
|                     d|d|          }|                    |           |                    |           |                    |
           ||                    |           |                     d|d	          }||                    |           |                     d
|d	          }||                    |           |                     d|d	          }||	                    |           |r
d}|d}nd}n|}|}|                     d|d|          }|"|
                    t          |                     |                     d|d|          }|%|                    t          j        j        |           |                     d|dd          }|%|                    t          j        j        |           |                     d|dd          }|%|                    t          j        j        |           |s|                     |j        d|z             |S )NDOMAINREALMUSERNAMEF)r  r  PASSWORDAS_SUPPORTED_ENCTYPESTr  TGS_SUPPORTED_ENCTYPESAP_SUPPORTED_ENCTYPESKVNOAES256_KEY_HEXAES128_KEY_HEXRC4_KEY_HEXz/Please supply %s encryption keys in environment)r   guessr  
set_domain	set_realmset_usernamerD  r   r   r   r  rz   r  r   r   r   r   r   
assertTruer   )rP   r  default_usernameallow_missing_passwordallow_missing_keysrequire_strongest_keycdomainrealmallow_missing_usernameusernamerE  r   r   r   kvno_allow_missingaes256_allow_missingr   
aes256_key
aes128_keyrc4_keys                        r[   _get_krb5_creds_from_envz(RawKerberosTest._get_krb5_creds_from_env
  s@   
  !!				!!(F33  &11!1!=##J5:2H $ J J 'H##J5:2H $ J J 	
V	E	x   NN8$$$ $ 0 01H17t !1 !M !M ,''(=>>>!%!1!12J28 "2 "N "N!-(()?@@@ $ 0 01H17t !1 !M !M ,''(=>>>  	6!&',$$'+$$!3#5 16.@   B B JJs4yy!!!%%&67<4H & J J
 !W_3Z@@@%%&67<48 & : :
 !W_3Z@@@""=&49 # O OW_0':::! 	7OOAM-/567 7 7 r]   c                    || j         v r| j         |         S d }d }	 |                     |||||          }|                     |           || j         |<   |S # t          $ r}	|	}Y d }	~	nd }	~	ww xY w|y	  |            }|                     |           || j         |<   |S # t          $ r@}	t	          d|z             t	          d|z             t	          d|	z             Y d }	~	nd }	~	ww xY w|)N)r  r  r  r  zERROR FROM ENV: %rzFALLBACK-FN: %szFALLBACK-ERROR: %r)r  r  assertIsNotNone	Exceptionprint)
rP   r  r  r  r  r  fallback_creds_fncredsenv_errerrs
             r[   _get_krb5_credszRawKerberosTest._get_krb5_credsS  se    T_$$?6** 	11!1'=#5&; 2 = =E   '''&+DOF#L  	 	 	GGGGGG	 ())++ $$U+++*/'  4 4 4*g6777'+<=>>>*c2333333334 s/   A 
A-!A((A-3
B 
C((6C##C(c                 6    |                      d ||          }|S )Nr  r  r  r  rP   r  r  r  s       r[   get_user_credszRawKerberosTest.get_user_creds  s/       8N4F ! H H r]   c                 6    |                      d||          }|S )NSERVICEr   r  r  s       r[   get_service_credsz!RawKerberosTest.get_service_creds  s/       	8N4F ! H H r]   c                 6    |                      d||          }|S )NCLIENTr   r  r  s       r[   get_client_credsz RawKerberosTest.get_client_creds  /       8N4F ! H H r]   c                 6    |                      d||          }|S )Nr  r   r  r  s       r[   get_server_credsz RawKerberosTest.get_server_creds  r
  r]   c                     |                      d||          }|                    |                                t          z             |                    d           |S )NADMINr   r   )r  set_gensec_featuresget_gensec_featuresr   set_workstationr  s       r[   get_admin_credszRawKerberosTest.get_admin_creds  sh       8N4F ! H H 	
a3355DEEE	"r]   c                 h    |r|                      |           |                     dd| |          }|S )NRODC_KRBTGTT)r  r  r  r  r  r  rP   require_keysr  r  s       r[   get_rodc_krbtgt_credsz%RawKerberosTest.get_rodc_krbtgt_creds  sO     ! 	*OOL)))  8<8D4D7L ! N N r]   c                 j    |r|                      |           |                     ddd| |          }|S )NKRBTGTkrbtgtT)r  r  r  r  r  r  r  s       r[   get_krbtgt_credsz RawKerberosTest.get_krbtgt_creds  sR     ! 	*OOL)))  2:8<8D4D7L	 ! N N
 r]   c                 J    t                      }|                                 |S r   )r   set_anonymous)rP   r  s     r[   get_anon_credszRawKerberosTest.get_anon_creds  s     MM	r]   c                     || j         }|rL|&t          j                            |d|           d S t          j                            d|z             d S d S )Nz:
r_   )r  r  r  r  )rP   rw   obj
asn1_prints       r[   	asn1_dumpzRawKerberosTest.asn1_dump  so    +J 	/
  dddCC!899999
  .....		/ 	/r]   c                     || j         }|rGt          j                            d|t	          |          |                     |          fz             d S d S )Nz	%s: %d
%s)r  r  r  r  rN   hexdump)rP   rw   blobr%  s       r[   hex_dumpzRawKerberosTest.hex_dump  sm    ?oG 	FJc$iid1C1CDDF F F F F	F 	Fr]   c                    |.t          |          j                            d          d         }nd}|                     |||           t	          ||          \  }}|                     d ||           |rt          |          }|S )N:r   z<None-asn1Spec>r%  rR   r"  )typer   splitr'  pyasn1_der_decoder#  pyasn1_native_encode)	rP   r&  rR   native_encoder"  r%  
class_namer!  r  s	            r[   
der_decodezRawKerberosTest.der_decode  s     h066s;;A>JJ*Jj$888"4(;;;QtSZ888 	,&s++C
r]   c                    |rt          ||          }t          |          j                            d          d         }||                     d ||           t          |          }||                     |||           |S )Nr+  r)  r   r,  r*  )pyasn1_native_decoder-  r   r.  r#  pyasn1_der_encoder'  )rP   r!  rR   native_decoder"  r%  r2  r&  s           r[   
der_encodezRawKerberosTest.der_encode  s      	?&sX>>>C#YY'--c2215
!NN4N<<< %%!MM*dGM<<<r]   c                 f    |                      |d|d          }|                     ||           d S )NF)r7  r"  r%  r*  )r8  send_msg)rP   reqr"  r%  k5_pdus        r[   send_pduzRawKerberosTest.send_pdu  sA    uU ! L Lfg.....r]   c                    t          j        dt          |                    }|}||z  }|                     d||           |                     d||           	 	 | j                            |d          }|t          |          k    rd S ||d          };# t          j        $ r}|                     d|z              d }~wt          $ r}|                     d|z              d }~ww xY w)N>Ir:  r*  Tr   zsend_msg: %s)
structpackrN   r'  r  sendr  r  r  r  )rP   msgr%  headerreq_pdusentry  s          r[   r:  zRawKerberosTest.send_msg  s   T3s88,,3j&':::j#w777	)v{{7A..3w<<''F!$%%.	)
 | 	 	 	^a/000 	 	 	^a/000	s*   /B B C*&B??C*C%%C*r   c                 r   d }	 || j                             |           | j                             |d          }| j                             d           t          |          dk    r|                     d           d S |                     d||           n# t          j        $ r< | j                             d           t          j	        
                    d           Y nUt          j        $ r}|                     d|z              d }~wt          $ r}|                     d|z              d }~ww xY w|S )Nr   r  zrecv_raw: EOFrecv_rawr*  zrecv_raw: TIMEOUT
zrecv_raw: %s)r  r  recvrN   r  r'  r  timeoutr  r  r  r  r  )rP   num_recvr%  rJ  rep_pdury  s         r[   rH  zRawKerberosTest.recv_raw  sU   	"!!'***fkk(A..GFb!!!7||q    111tMM*gwM????~ 	4 	4 	4Fb!!!J233333| 	 	 	^a/000 	 	 	^a/000	 s1   A9B ?B AD4"D40D		D4D//D4c                 \   |                      d||          }|d S t          j        d|dd                   }|d         }|dk    rdS |}d}|dk    rX|                      |||          }|                     t	          |          d           ||z  }|t	          |          z
  }|dk    X|S )NrK   )rK  r%  rJ  r?  r   r   r]   rf   )rH  r@  unpackassertGreaterEqualrN   )	rP   r"  r%  rJ  raw_pdurD  k5_lenmissingrL  s	            r[   recv_pdu_rawzRawKerberosTest.recv_pdu_raw+  s    --   : :?4tWQqS\22Q;;2kkmm '7 $ D DG##CLL!444wGs7||+G kk r]   c                     |                      |||          }|sd |fS |                     |d ddd          }|d         }|                     |d           |d         }|                     |t          t
          t          g           |t          k    rt          j                    }n=|t
          k    rt          j	                    }n|t          k    rt          j                    }|                     |||d          }	|	|fS )Nr"  r%  rJ  F)rR   r1  r"  r%  zfield-0rc   zfield-1rR   r"  r%  )
rS  r3  assertEqualassertInr   r!   r   	krb5_asn1AS_REPTGS_REP)
rP   r"  r%  rJ  rL  k5_rawpvnomsg_typerR   reps
             r[   
recv_replyzRawKerberosTest.recv_reply>  s"   ##z,3,3 $ 5 5  	!=  !   i q!!!)$h[) DEEEz!! '))HH$$ (**HH"" *,,Hoog)3U  D DW~r]   c                 <    |                      |||          \  }}|S )NrU  )r`  )rP   r"  r%  rJ  r_  rL  s         r[   recv_pduzRawKerberosTest.recv_pduX  s-    J1818 ) : :g 
r]   c                 >    |                      | j        d           d S )NzNot connectedrC  )r  r  r   s    r[   assertIsConnectedz!RawKerberosTest.assertIsConnected^  s#    TV99999r]   c                 >    |                      | j        d           d S )NzIs connectedrd  )assertIsNoner  r   s    r[   r  z"RawKerberosTest.assertNotConnecteda  s#    $&n55555r]   c                 &   |r| j         n| j        }|                     |           	 |                     |||           |                     |||          }n$# t
          $ r |                     d            w xY w|                     d           |S )N)r"  r%  rU  ztransaction failedtransaction done)r#  r  r  r=  rb  r  r  )rP   r;  r"  r%  rJ  to_rodcr#  r_  s           r[   send_recv_transactionz%RawKerberosTest.send_recv_transactiond  s     $5tyyT	MM#*gMFFF--%w   I ICC 	 	 	1222	 	+,,,
s   0A !A9c                 :    |                      |j                   d S r   )r  	isNoValuer   s     r[   assertNoValuezRawKerberosTest.assertNoValuew  s    (((((r]   c                 0    |                      |           d S r   )r  r   s     r[   assertHasValuezRawKerberosTest.assertHasValuez  s    U#####r]   c                 ,    |                     |          S r   )r  )rP   r!  elems      r[   getElementValuezRawKerberosTest.getElementValue}  s    wwt}}r]   c                 \    |                      ||          }|                     |           d S r   )rs  rg  )rP   r!  rr  vs       r[   assertElementMissingz$RawKerberosTest.assertElementMissing  s1      d++!r]   c                 D   |                      ||          }|                     |           | j        rkt          |t          j        j                  rN|r%|                     dt          |                     d S | 	                    dt          |                     d S d S d S r   )
rs  r  r  
isinstancerM  abc	ContainerrW  rN   assertNotEqual)rP   r!  rr  expect_emptyru  s        r[   assertElementPresentz$RawKerberosTest.assertElementPresent  s      d++Q 	3![_677 3 3$$QA/////''3q6622222	3 	33 3r]   c                     |                      ||          }|                     |           |                     ||           d S r   )rs  r  rW  rP   r!  rr  rQ   ru  s        r[   assertElementEqualz"RawKerberosTest.assertElementEqual  sG      d++QE"""""r]   c                     |                      ||          }|                     |           |                     |t          |d                     d S )Nutf8)rs  r  rW  r   r  s        r[   assertElementEqualUTF8z&RawKerberosTest.assertElementEqualUTF8  sQ      d++QE%0011111r]   c           	         |                      |d         |d                    |                      t          |d                   t          |d                   d|d|           t          t          |d                             D ]8}|                      |d         |         |d         |         d|d|           9d S )N	name-typename-stringzprinc1=z != princ2=rd  )rW  rN   rk   )rP   princ1princ2r|  s       r[   assertPrincipalEqualz$RawKerberosTest.assertPrincipalEqual  s    ,f[.ABBB}%&&}%&&&,2FFFF; 	 	= 	= 	= VM23344 	A 	AC}%c*}%c**06?  A A A A	A 	Ar]   c                     |                      ||          }|                     |           t          |t          j                              }|                     ||           d S Nr+  )rs  r  r5  rY  PrincipalNamer  r  s        r[   assertElementEqualPrincipalz+RawKerberosTest.assertElementEqualPrincipal  sb      d++Q Y-D-F-FGGG!!!U+++++r]   c                 V   |                      ||          }|dk    r|}|s|                     |           |                     |d           || j        ur=t	          |          }|                     |d           |                     ||           d S d S |                     |           d S )N
autodetectr   )rs  r  r{  r  rz   rW  rg  r  s        r[   assertElementKVNOz!RawKerberosTest.assertElementKVNO  s      d++L  E  ###1%%% D111E

##E1---  E***** 21
 a     r]   c           	         |                      ||          }|                     |           |i|                     |t          j                   t          |          D ]9\  }}|dk    r.|                     d||         d|j        |          d|            :|i|                     |t          j                   t          |          D ];\  }}|dk    r.|                     d||         d|j        |          d|            :d S d S )Nrf   r  'z' expected in r  z' unexpected in )rs  r  assertIsInstancerY  TicketFlags	enumeraterW  namedValues)rP   r!  rr  expected
unexpectedru  iflags           r[   assertElementFlagsz"RawKerberosTest.assertElementFlags  sS     d++Q!!(I,ABBB$X.. 9 94199$$S!A$&8)=a)@ &8 &845&8 &89 9 9 !!!*i.CDDD$Z00 ; ;4199$$S!A$&:)?)B &: &:67&: &:; ; ;	 "!; ;r]   )require_strictrequire_orderedc                    | j         r|r|                     ||           d S d| d| }| j         s'%|d dz  }fd|D             }fd|D             }|                     |||           d S )Nz
expected: z got: z (ignoring: r   c              3   $   K   | ]
}|v|V  d S r   r   .0xr  s     r[   	<genexpr>z>RawKerberosTest.assertSequenceElementsEqual.<locals>.<genexpr>  s-      KK!1N3J3JA3J3J3J3JKKr]   c              3   $   K   | ]
}|v|V  d S r   r   r  s     r[   r  z>RawKerberosTest.assertSequenceElementsEqual.<locals>.<genexpr>  s-      AAQ.)@)@q)@)@)@)@AAr]   )r  rW  assertCountEqual)rP   r  gotr  r  fail_msgs      `  r[   assertSequenceElementsEqualz+RawKerberosTest.assertSequenceElementsEqual  s      
	;O 
	;Xs+++++9H99C99H' BN,F<><<<<KKKKxKKKAAAA#AAA!!(C:::::r]   c                     |t          j                     }||t          |          z   }t          j                            |t          j        j                  }|                    d          |j        fS )N)tz%Y%m%d%H%M%SZ)timerz   datetimefromtimestamptimezoneutcstrftimemicrosecond)rP   epochoffsetdts       r[   get_KerberosTimeWithUsecz(RawKerberosTest.get_KerberosTimeWithUsec  sb    =IKKECKK'E,,Ux7H7L,MMO,,bn==r]   c                 :    |                      ||          \  }}|S )N)r  r  )r  )rP   r  r  r  r  s        r[   get_KerberosTimez RawKerberosTest.get_KerberosTime  s#    ..U6.JJAr]   c                 $   t          |t                    r|                                }t          j                            |d          }|                    t          j        j                  }t          |	                                          }|S )Nr  )tzinfo)
rx  r   r   r  strptimer(  r  r  rz   	timestamp)rP   kerberos_timer  s      r[   get_EpochFromKerberosTimez)RawKerberosTest.get_EpochFromKerberosTime  sw    mU++ 	3)0022M!**=+:< <X%6%:;;EOO%%&&r]   c                 8    d}d}t          j        ||          }|S )Ni   i)randomrandint)rP   	nonce_min	nonce_maxru  s       r[   	get_NoncezRawKerberosTest.get_Nonce  s"    		N9i00r]   c                 j    i }|.|D ]+}|d         }||v rt          d|           |d         ||<   ,|S )Npadata-typezDuplicate type padata-value)RuntimeError)rP   pa_datapa_dictpapa_types        r[   get_pa_dictzRawKerberosTest.get_pa_dict  s_     6 6]+g%%&'B'B'BCCC#%n#5  r]   c                 L    t          j        ||          }t          ||          S r   )r   r  r   )rP   r   r   r   r   s        r[   SessionKey_createz!RawKerberosTest.SessionKey_create  s#    k%**#C...r]   c                     |                      |           |                      |           t          j        ||||          }t          ||          S )N)params)r  r   string_to_keyr   )rP   r   pwdr  r   r  r   s          r[   PasswordKey_createz"RawKerberosTest.PasswordKey_create	  sS    S!!!T"""#E3VDDD#C...r]   c                     |d         }|                     d          }|                     d          }|                     |||||          S )Nr   r  	s2kparams)r   r  r  )r  PasswordKey_from_etype)rP   r  etype_info2r   ry  r  r  s          r[   PasswordKey_from_etype_info2z,RawKerberosTest.PasswordKey_from_etype_info2  sX     v&&--**5!040428 + : : 	:r]   c                     |                                 }|                                }|                     ||||          S )N)r   r  )r  r1  r  )rP   r  r   r   r  s        r[   PasswordKey_from_credsz&RawKerberosTest.PasswordKey_from_creds  sG    ~~~~**5%0404 + 6 6 	6r]   c                    |t           j        j        k    r,|                                }|                     |||          S |                                                    d          }|                     ||||          S )Nr   r   r   r%  r   r  r  r   )r   r   r   get_nt_hashr  get_passwordr   r  )rP   r  r   r   r  r  nthashrE  s           r[   r  z&RawKerberosTest.PasswordKey_from_etype   s    GO'''&&((F))T)RRR%%''..w77&&XDt ' = = 	=r]   c                    |Z|                                 }|r3|d         t          j        j        t          j        j        fvr	|d         }nt          j        j        }|                    |          }||S |                                }|                                d|d|d}|t          j        j        k    rC|	                                }| 
                    ||           |                     |||          S |                                }| 
                    ||           |                                }	|                     |||	|          S )Nr   z has no fixed key for etype[z] kvno[z] nor a password specified, rd  r  r  )r  r   r   rQ  rO  r   r  r  r)  r  r  r  r  r1  r  )
rP   r  r   r   
forced_keyr   r  r  rE  r  s
             r[   TicketDecryptionKey_from_credsz.RawKerberosTest.TicketDecryptionKey_from_creds)  sx   =..00F ,&)GO,C,3O,C,E E Eq	+))%00
!~~ **,,,,eeeTTT; GO'''&&((F  X 666))39/3 * 5 5 5 %%''X8444~~&&U+3,0,0 ' 2 2 	2r]   c                     t          j        |          }t          j        |j                  }|                     ||          S )N)r   r   )r   _get_enctype_profiler  generate_random_byteskeysizer  )rP   r   ry  r   s       r[   	RandomKeyzRawKerberosTest.RandomKeyL  s=    (//.qy99%%EH%EEEr]   c                 F    |                      |d         |d                   S )Nr   r   )r  r   s     r[   EncryptionKey_importz$RawKerberosTest.EncryptionKey_importQ  s-    %%&7	&B&7
&CE E 	Er]   c                 h    |                     ||          }|j        |d}|j        
|j        |d<   |S )N)r   cipherr   )r   r   r   )rP   r   r   r   r   EncryptedData_objs         r[   EncryptedData_createz$RawKerberosTest.EncryptedData_createU  sI     [[	22
Y 
 
 8(+f%  r]   c                 R    ||j         }|                    |||          }||d}|S )Nr   )	cksumtyper   )r   r   )rP   r   r   r   r   r   Checksum_objs          r[   Checksum_createzRawKerberosTest.Checksum_created  sD    
 =IE$$UIU$CC 
 
 r]   c                     ||d}|S )N)r  r  r   )r   	name_typenamesPrincipalName_objs       r[   PrincipalName_createz$RawKerberosTest.PrincipalName_creater  s     # 
 
 ! r]   c                     ||d}|S )N)ad-typead-datar   )rP   ad_typead_dataAUTH_DATA_objs       r[   AuthorizationData_createz(RawKerberosTest.AuthorizationData_create~  s     
 
 r]   c                     ||d}|S )N)r  r  r   )rP   padata_typepadata_valuePA_DATA_objs       r[   PA_DATA_createzRawKerberosTest.PA_DATA_create  s     '(
 
 r]   c                     ||d}|S )N)patimestamppausecr   )rP   tsusecPA_ENC_TS_ENC_objs       r[   PA_ENC_TS_ENC_createz$RawKerberosTest.PA_ENC_TS_ENC_create  s     
 
 ! r]   c                     d|i}|S )NrT   r   )rP   rT   PA_PAC_OPTIONS_objs      r[   PA_PAC_OPTIONS_createz%RawKerberosTest.PA_PAC_OPTIONS_create  s    
 w
 "!r]   c                     ||d}|S )N)z
armor-typezarmor-valuer   )rP   
armor_typearmor_valueKRB_FAST_ARMOR_objs       r[   KRB_FAST_ARMOR_createz%RawKerberosTest.KRB_FAST_ARMOR_create  s     %&
 
 "!r]   c                     |||d}|S )N)zfast-optionspadatareq-bodyr   )rP   fast_optionsr  req_bodyKRB_FAST_REQ_objs        r[   KRB_FAST_REQ_createz#RawKerberosTest.KRB_FAST_REQ_create  s"     ) 
 

  r]   c                     ||d}|||d<   |S )N)zreq-checksumzenc-fast-reqarmorr   )rP   r  req_checksumenc_fast_reqKRB_FAST_ARMORED_REQ_objs        r[   KRB_FAST_ARMORED_REQ_createz+RawKerberosTest.KRB_FAST_ARMORED_REQ_create  s0     )($
 $
  05$W-''r]   c                     d|i}|S )Narmored-datar   )rP   armored_dataPA_FX_FAST_REQUEST_objs      r[   PA_FX_FAST_REQUEST_createz)RawKerberosTest.PA_FX_FAST_REQUEST_create  s     L"
 &%r]   c                     d|i}|s|S |                      |t          j                              }|                     t          |          }|S )Nzinclude-pacr+  )r8  rY  KERB_PA_PAC_REQUESTr  rC   )rP   include_pacpa_data_createKERB_PA_PAC_REQUEST_objpa_pacr  s         r[   KERB_PA_PAC_REQUEST_createz*RawKerberosTest.KERB_PA_PAC_REQUEST_create  se     ;#
  	+**!8*3*G*I*I ! K K%%&8&AAr]   c                     |                      |          }|                     |t          j                              }|                     t
          |          }|S r  )r  r8  rY  PA_PAC_OPTIONSr  rB   )rP   rT   pac_optionss      r[   get_pa_pac_optionsz"RawKerberosTest.get_pa_pac_options  sY    0099ook/8/G/I/I & K K))*<kJJr]   c                    |B|                      |t          j                    ||          }|                     |||          }nd }|||||	d}|||d<   |||d<   |||d<   |||d<   |
|
|d<   |||d<   |||d	<   |S )
NrV  )zkdc-optionsr  tillnoncer   rY  r[  fromrtime	addresseszenc-authorization-datazadditional-tickets)r8  rY  AuthorizationDatar  )rP   kdc_optionsrY  r  r[  	from_time	till_time
renew_timer4  r   r7  additional_ticketsEncAuthorizationDataEncAuthorizationData_keyEncAuthorizationData_usager"  r%  enc_ad_plainenc_adKDC_REQ_BODY_objs                       r[   KDC_REQ_BODY_createz#RawKerberosTest.KDC_REQ_BODY_create  s    L  +??$"466%	 + ! !L
 ../G/I/;= =FF F&
 
 (-W%(-W% '0V$!(2W% ,5[)9?56)5G12r]   c                 P    d||d}|||d<   |t          ||          }nd }||fS )Nrc   )r]  msg-typer  r  r+  )r5  )	rP   r^  r  r  rR   r"  r%  KDC_REQ_objKDC_REQ_decodeds	            r[   KDC_REQ_createzRawKerberosTest.KDC_REQ_create<  s^    "   
 

 $*K!2h0 0 0OO #OO++r]   c                     |                      ||||||||	|
||d d d ||          }|                     t          ||t          j                    ||          \  }}|r|S ||fS )N)r>  r?  r@  r"  r%  r^  r  r  rR   r"  r%  )rD  rI  r   rY  AS_REQ)rP   r  r9  rY  r  r[  r:  r;  r<  r4  r   r7  r=  native_decoded_onlyr"  r%  rC  r!  decodeds                      r[   AS_REQ_createzRawKerberosTest.AS_REQ_createZ  s    \  33!%%)'+!! 4  " **%%''! +  W  	N|r]   c                      dt           |||d}|S )Nrc   )r]  rF  z
ap-optionsrV  authenticator)r   )rP   
ap_optionsrV  rQ  
AP_REQ_objs        r[   AP_REQ_createzRawKerberosTest.AP_REQ_create  s'     "$*
 

 r]   c	                 N    d||||d}	|||	d<   |||	d<   |||	d<   |||	d<   |	S )Nrc   )zauthenticator-vnorX  rY  cusecctimer   subkey
seq-numberauthorization-datar   )
rP   rX  rY  r   rV  rW  rX  
seq_numberauthorization_dataAuthenticator_objs
             r[   Authenticator_createz$RawKerberosTest.Authenticator_create  sm      "#
 
 ).g&*0h'!.8l+)6H23  r]   c                    |t           }nt          }|                     |d |||	|
||||||||          }|                     |t	          j                    ||          }|                     |t          ||          }d }||                                }t          j
        dd          }|                     |||||||d           }|                     |t	          j                    ||          }|                     |t          |          }t	          j        d          }|                     t#          |          ||          } |                     | t	          j                    ||          } |                     t(          |           }!||                    |!           n|!g}|                     t.          ||t	          j                    ||	          \  }"}#|r|#S |#|"fS )
Nr9  rY  r  r[  r:  r;  r<  r4  r   r7  r=  r>  r?  r@  rV  r  r       rX  rY  r   rV  rW  rX  r[  r\  r  rR  rV  rQ  rK  )r3   r2   rD  r8  rY  KDC_REQ_BODYr  r1   r   r  r  r^  Authenticatorr  r0   	APOptionsrT  strAP_REQr  rA   rj   rI  r"   TGS_REQ)$rP   r  rV  rW  rV  r9  rY  r  r[  r:  r;  r<  r4  r   r7  r>  r?  r=  ticket_session_keyauthenticator_subkeybody_checksum_typerM  r"  r%  r@  r  req_body_blobreq_body_checksum
subkey_objr[  rQ  rR  ap_req
pa_tgs_reqr!  rN  s$                                       r[   TGS_REQ_createzRawKerberosTest.TGS_REQ_create  s]   n  +)C&&)D&++#!1!5%='A , C C 1:1G1I1I3=w ( P P !001C1F1>7I 1 K K
 
+-88::J^Az22
11#!# 2 % % ,..!	 (   11@ @ (--
##s:+12? $ A A )2B2D2D,6 ! I I((@@
MM*%%%% \F** &((! +  W  	N|r]   c                    |d                              dd          }|d         D ]}||                                z  }||                                z  }|d                                z  }|                     |t          ||          }|||dd}|                     |t          j                              }	|                     t          |	          S )	Nr  rK   r   r   r  Kerberos)rw   r  r   authr+  )	r   r   r  r-   r8  rY  PA_S4U2Selfr  r<   )
rP   rw   r  tgt_session_keyr   
cksum_datar}  r   PA_S4U2Self_objpa_s4u2selfs
             r[   PA_S4U2Self_createz"RawKerberosTest.PA_S4U2Self_createV  s     +&//X/FF
m$ 	% 	%A!((**$JJellnn$
j'')))
$$_%;%/%*, , 	
 
 ooi&;&=&= & ? ?""?K@@@r]   c                 z    d|i}|||d<   |||d<   |                      |t          j                              }|S )N	newpasswdtargname	targrealmr+  )r8  rY  ChangePasswdDataMS)rP   new_passwordtarget_princtarget_realmChangePasswdDataMS_objchange_password_datas         r[   ChangePasswdDataMS_createz)RawKerberosTest.ChangePasswdDataMS_createq  sf    
 "
 #1=":.#2>";/#"Y-I-K-K  /  M  M $#r]   c                 6   ||d}|||d<   |||d<   |||d<   |||d<   |                      |t          j                              }	|                     |t          |	          }
dt
          |
d}|                      |t          j                              }|S )	N)	user-dataz	s-addressr  r
  rY  z	r-addressr+  rc   )r]  rF  enc-part)r8  rY  EncKrbPrivPartr  r,   r    )rP   rX  	user_data	s_addressr  r
  r[  	r_addressEncKrbPrivPart_objenc_krb_priv_partenc_dataKRB_PRIV_objkrb_privs                r[   KRB_PRIV_createzRawKerberosTest.KRB_PRIV_create  s     #"
 
  .7{+)-v&!/9|, .7{+ OO)A)C)C , E E ,,V-8->@ @
   
 
 ??9#5#7#7 # 9 9 r]   c           	         |                      | j        d           |                                 \  }}	|                     |||||	||          }
dt	          |          z   t	          |
          z   }|                     |d           t                      }|                    |dz	             |                    |dz             |                    |dz	             |                    |dz             |                    t	          |          dz	             |                    t	          |          dz             |                    |           |                    |
           |S )Nzcall self.connect() first)r  r  r
  r[  r  rb   i   rJ      )	r  r  r  r  rN   
assertLess	bytearrayrj   extend)rP   rX  r  versionr[  rp  local_addressremote_addressr  r
  r  sizerC  s                r[   kpasswd_createzRawKerberosTest.kpasswd_create  sX    	TV%@AAA7799	4''(12?2;-13=2@ ( B B 3v;;X.g&&&kk

419

4$;

7a<   

7T>"""

3v;;!#$$$

3v;;%&&& 	

6

8
r]   c                     |                      |dd           |d         }|                      |d|j                   |                     |d|j                   |                    ||d                   }|S )Nr]  rc   r  r   r   r  )r  r   r  r   r   )rP   r!  r   r   enc_parts        r[   get_enc_partzRawKerberosTest.get_enc_part  st    VQ///z?'39===x:::;;uhx&899r]   c
           	      z  ./ || j         j        u rd}
|                     |||          }nj|| j         j        u rD|                     |d           |                     |d           d}
|                    d          }n|                     d|            |                     t          j	        j
                  }|d}t          t          j        |                    }||d |d}|	rt          j        d	d
          }nd }|                     |d d dt"          |          }|                     | j        d           |                     | j                   | j        j        //t.          j        k    rd.n+/t.          j        k    rd.n|                     d/            ./fd}| j                                        d	         } ||          }d }|                     |||
||||          }|                     |           |                                 }|                     d           |                     |           |d d         }|dd          }|d	         dz  |d         z  }|d         dz  |d         z  }|d         dz  |d         z  }|                     |tA          |                     |                     d|           | !                    ||           | "                    d|d                    | "                    d|d                    |r|d |         }||d          }|j#        }| $                    |t          j%                              }| &                    |dtN                     | (                    ||tR                    }| $                    |t          j*                              }| +                    |d           | +                    |d           	 | $                    |t          j,                              }n$# tZ          $ r |                                  Y nw xY w| &                    |dtX                     | (                    ||t\                    }| $                    |t          j/                              }| 0                    |d           | 0                    |d            |d!         } n| $                    |t          j1                              }!| 2                    tf          d"d#g$          }"| 4                                5                                6                                }#| &                    |!d%d           | &                    |!dtb                     | 0                    |!d           | 0                    |!d            | +                    |!d&           | +                    |!d'           |!d(         }$to          |tp                    r|                     |$|           n| 9                    |$|           | 0                    |!d)           | 0                    |!d*           | &                    |!d+|#                    d                     | :                    |!d,|"           | 0                    |!d-           |!d.         } | d d         }%| dd          }&|%d	         dz  |%d         z  }'to          |tp                    r|                     |'|           n| 9                    |'|           |&s|                     d	|'d/           d S |&d	         rEto          |tv                    r|                     |&|           d S | 9                    |&|           d S |                     d0tA          |&                     ty          j=        d1|&          \  }(})}*}+},}-d S )2Ni  z"target_princ only valid for pw setz"target_realm only valid for pw setrf   r%  zinvalid mode r  )tgtrk  	auth_datarR  r   ra  F)r  r  r   r[  i  )r  re      zunknown family c                 4    t          j        |           dS )N)z	addr-typeaddress)r  	inet_pton)ip	addr_typefamilys    r[   create_addressz8RawKerberosTest.kpasswd_exchange.<locals>.create_address  s%    &!+FB77  r]   ri  rb   rJ   rd   rK   rc   ~   ^   r+  rF  rW  rV  r  r
  r  kadminchangepwr  r  r]  stimesusec
error-coderX  rY  r  r[  e-texte-dataz#got an error result, but no message   z>HIIIQQ)>ri  rg  r  rh  rg  r   failr  r   r   r   rg  rY  rf  r  r  generate_ap_reqr#   r  r#  r  r  r  r  AF_INETAF_INET6getsocknamer  r:  rS  r  rW  rN   r  r{  rW  r3  AP_REPr  r   r  r%   EncAPRepPartr}  r    r   r,   r  rv  r   r  r5   r  r,  r-  rx  rz   rX  r  r   r@  rN  )0rP   rV  r  expected_codeexpected_msgmoder  r  rR  send_seq_numberr  r  rX  kdc_exchange_dictr[  rp  r  local_ipr  r  rC  rL  rD  reply	reply_lenreply_version
ap_rep_lenap_repr  r   r  priv_enc_partresult_data	krb_errorr[  r  
error_codestatusmessagestatus_codeempty_bytes
min_lengthhistory_length
propertiesexpire_timemin_ager  r  s0                                                 @@r[   kpasswd_exchangez RawKerberosTest.kpasswd_exchange  s=    4#'''G66|7C7CE EII T%,,,lBD D DlBD D D G$++G44IIII,d,,--- 677J,Z8899
 $*$	
 
  	:66JJJ%%&7&*/3,1,:1; & = = 	TYS)))TV$$$V^##IIv&&IIII000111	 	 	 	 	 	 6%%''*&x00 !!&"+")","("/"02 2 	c##%%+,,,W%%%!AY!^vay0	a6!94Qi1nq	1
CLL111M***
I...D'!*---D'!*--- @	. ;J;'FZ[[)H$C__Vi6F6H6H_IIF##FJ
CCC((6HIIH9#9#;#; ' = =H %%h888%%h888??8i>P>R>R?SS   		 ##Hj(CCC --hLLM OO	(@(B(B , D DM %%m[AAA%%mV<<<
 (4KK 	8K8M8MNNI--&, . . .E ))++5577==??E##Ivq999##Iz9EEE%%i999%%i888%%i999%%i999"<0J--- 9  ];;;;j-888%%i:::%%i999##IwW8M8MNNN,,YGGG%%i:::#H-KRaRabb/ayA~2mS)) 	6[-8888MM+}555 	QBD D DF 1: 	:,.. 5  ,77777g|44444 RW... i99[WWs   )(P P32P3c                 
   |d         }|d         }|d         }|d         }|d         }|d         }|d         }|d         }|d	         }|d
         }|d         }|d         }|d         }|d         }|d         }|d         }||                      d          }d|v r	|d         }n|                                 }||d<   |                     ||||||||||	|
|||          }t          |          } |%|                                D ]\  }!}"|"|"| |!<   | |!= |%|                                D ]\  }!}"|"|"||!<   ||!= g }#|*|                     |          }$|#                    |$           |*|                     |          }%|#                    |%           |t          k    rd }&d }'nO| 	                    t          |           |                     |||d          }&|                     t          |&          }'|&|                     |            ||||          \  }(}ng }(|C|                     |            |||d d          })|d         }*|                     |*|)          }+nd }+|L ||||          \  },}|                     |,           |                     t          d |,D             d           nd },||d         }-|                     |-           |t          k    r)|                     |t%          j                              }.n| 	                    t          |           |&}.|                     |-t*          |.          }/|(|#z  }( |||| |(|+|/          }0nd }0g }1|'|1                    |'           |0|1                    |0           |,|1|,z  }1|0|1|#z  }1|1sd }1|1|d<   |(|d<   | |d<   |                     ||1| |                       \  }2}3|2|d!<   |d"         }4|                     |3|4#          }5|                     |5           |                     |5d$          }6|                     |6           d }7|Ut2          }7|                     |           |                     d%t9          |                     |                     d%|           |:|}7|                     |           | 	                    d%t9          |                     |                     |7           |6t2          k    r|                     |5d&          }8d'|8 }9nd(| }9| 	                    |6|7|9           |6t2          k    r ||||5          S  ||||5          S ))Ncheck_error_fncheck_rep_fngenerate_fast_fngenerate_fast_armor_fngenerate_fast_padata_fngenerate_padata_fncallback_dictreq_msg_typereq_asn1Specrep_msg_typeexpected_error_moder9  pac_requestr0  	inner_req	outer_reqi  )r  r4  r`  Fr  Tfast_armor_typec                     g | ]
}|d          S )r  r   r  r  s     r[   
<listcomp>z9RawKerberosTest._generic_kdc_exchange.<locals>.<listcomp>&	  s    GGGBb/GGGr]   zDon't create TGS-REQ manually	armor_keyr+  
req_padatafast_padatar  )r^  r  r  rR   req_objrj  )rj  rF  r   r  zGot unexpected error: zExpected to fail with error: )r  r  rD  dictr   r-  rj   r1  r   rW  r"   r  r  rA   r  r  assertNotInr8  rY  rd  r  r+   rI  rk  rs  r   rg  r{  rN   ):rP   r  rY  r  r[  r:  r;  r<  r   r7  r=  r>  r?  r@  r  r  r  r  r  r  r  r  r  r  r  r9  r  r0  r  r  r4  r  inner_req_bodyr   rQ   additional_padatapa_pac_requestpa_pac_optionstgs_reqtgs_req_padatar  fast_ap_reqr  
fast_armorouter_padatar  checksum_blobr   fastr  r  req_decodedrj  r_  r^  expected_msg_typer  r  s:                                                             r[   _generic_kdc_exchangez%RawKerberosTest._generic_kdc_exchange  s    ++;<(8,-?@!23K!L"34M"N./CD)/:(8(8(8/0EF'6'6'6 &k2	 &k2	--U-;;I'''%g.EENN$$E).g&++#!1!5%='A , C C  h 'oo// , ,
U$*/N3''&s++ 'oo// & &
U$$)HSMM "!<<[IIN$$^444"!44[AAN$$^444:%%G!NN[,777**+<+8+316 + 8 8G "00IIN".  !1222$;$;<M<I<D%F %F!K K!-  !1222001B1>157;= = =K
 00ABO33O4?A AJJ J)%7%78I8E8@&B &B"L(   ...^GG,GGG=? ? ? ?  L')+6I  +++z)) $&355 !0 !7 !7   l;;; '++I,>,9; ;H ,,K##$5$1$2$/$.$,. .DD D%MM.)))MM$#l"F<''F 	F*0,'+6-((6*%#22L:@<D<HLNN  3  L  L
 (/)$#I.((g(FFS!!!''Z88X&&& % )l+++3':#;#;<<<Q 3444# ,n---Q$7 8 8999.///y  --c<@@J<
<<HHL7JLLH#4h???y  !>"3"/"%' ' ' |-}cBBBr]   r   r   c5                    |dk    rd}n"t          |t          j        j                  s|f}i dt          dt
          j        dt          dt
          j        dt
          j	        d|d	|d
|d|d|d|d|d|d|	d|
d|d|i d|d|d|d|d|d|d|d|d|d|d|d|d |d!|d"|d#|d$|i d%|d&|d'| d(|!d)|"d*|#d+|$d,|%d-|&d.|'d/|(d0|)d1|*d2|+d3|,d4|-d5|.|/|0|1|2|3|4d6}5|i }|5S )7Nr   r   r  r  r  rep_asn1Specrep_encpart_asn1Specexpected_crealmexpected_cnameexpected_anonexpected_srealmexpected_snameexpected_account_nameexpected_groupsunexpected_groupsexpected_upn_nameexpected_sidexpected_supported_etypesexpected_flagsunexpected_flagsticket_decryption_keyexpect_ticket_checksumexpect_full_checksumr  r  r  r  r  r  r  check_kdc_private_fnr  r  expected_statusclient_as_etypesexpected_saltrk  preauth_keyr  	armor_tgtarmor_subkeyr  r9  r  r  r  r0  rR  fast_ap_optionsstrict_edata_checkingexpect_edatar  expect_claims)expect_upn_dns_info_exexpect_pac_attrsexpect_pac_attrs_pac_requestexpect_requester_sidrc4_supportrj  )
rx  rM  ry  rz  r   rY  rL  r   rZ  EncASRepPart)6rP   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  rk  r  r  r  r  r  r9  r  r  r  r0  rR  r  r  r  r  r  r  r  r  r   r!  rj  r  s6                                                         r[   as_exchange_dictz RawKerberosTest.as_exchange_dict	  s1   j !##"$/1JKK 	9#6"8:
J:
I,:
 J:
 I,	:

 #I$::
 :
 n:
 ]:
 :
 n:
 $%::
 :
  !2:
  !2:
 L:
  ()B!:
" n#:
 :
$  0%:
& $%:':
( %&<):
* #$8+:
,  0-:
. %&</:
0 &'>1:
2 3:
4 !"45:
6 n7:
8 L9:
: #$8;:
< ]=:
> "#6?:
@ A:
B  0C:
D ]E:
 :
 :
F #$8G:
H ;I:
J K:
L M:
N LO:
P Q:
R ;S:
T U:
V W:
X ;Y:
Z ;[:
\ *]:
^ _:
` $%:a:
b Lc:
d *e:
f ]g:
 :
h '= 0,H$8&s:
 :
 :
v  M  r]   c6           	         |dk    rd}n"t          |t          j        j                  s|f}i dt          dt
          j        dt          dt
          j        dt
          j	        d|d	|d
|d|d|d|d|d|d|	d|
d|d|i d|d|d|d|d|d|d|d|d|d|d|d|d |d!|d"|d#|d$|"i d%|d&|d'|d(|!d)| d*|#d+|$d,|%d-|&d.|'d/|(d0|)d1|*d2|+d3|,d4|-d5|.|/|0|1|2|3|4|5d6}6|i }|6S )7Nr   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  rl  r  r  r  r  rk  r9  r  r  r  r0  rR  r  r  r  r  r  r  )r  r  r   expected_proxy_targetexpected_transited_servicesr!  rj  )
rx  rM  ry  rz  r"   rY  ri  r!   r[  EncTGSRepPart)7rP   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  rk  r  rl  r9  r  r  r  r0  rR  r  r  r  r  r  r  r  r  r   r%  r&  r!  rj  r  s7                                                          r[   tgs_exchange_dictz!RawKerberosTest.tgs_exchange_dict	  s5   l !##"$/1JKK 	9#6"8;
K;
I-;
 K;
 I-	;

 #I$;;
 ;
 n;
 ];
 ;
 n;
 $%:;
 ;
  !2;
  !2;
 L;
  ()B!;
" n#;
 ;
$  0%;
& $%:';
( %&<);
* #$8+;
,  0-;
. %&</;
0 &'>1;
2 3;
4 !"45;
6 n7;
8 L9;
: #$8;;
< ]=;
> "#6?;
@ A;
B 3C;
D !"4E;
 ;
 ;
F G;
H I;
J LK;
L M;
N #$8O;
P ;Q;
R S;
T U;
V ;W;
X ;Y;
Z *[;
\ ];
^ $%:_;
` La;
b *c;
d ]e;
f %&<g;
 ;
h !1,H$8%:+F&u;
 ;
 ;
x  M  r]   c                 
   |d         }|d         }|d         }|d         }|d         }|d         }	|d         }
|d         }|d	         }|                      |d
|           |                     |d          }| j        r|                     |d|           | j        r@|r|                     t          ddg          }n|d         }|                     |d|           |                     |d           |                     |d          }d }d }| 	                    |           |W|                      |dd           |                     |d|           |                     |d|           |                     |d           |                     |d          }| 	                    |           ||                     |d           |d         }t          t          t          j        d                              dz
  }|t          |          k    p||         dk    }|r|                     |d| j                   n|                     |d           |                     |d           |                     |d          }|                     |d           |                     |d          }d }| 	                    |           |Y|                     |d           |                     |dd           |                     |d           |                     |d          }| j        r|                     ||||           d }|                     |          \  }}||                     |          }t*          |v r|t*                   }|                     |||d !          }d"|v r1|                     |d"                   }|                     ||          }|                    d#          }||d$         }|                     |||d         d%&           d }|{|                      |d|j                   |                     |d|j                   |                    t<          |          } |                     | t          j                     '          }d }!| 	                    |           ||                      |d|j                   | j        r|                     |d|j                   |                    ||          }"	 |                     |" |
            '          }!n8# tB          $ r+ |                     |"t          j"                    '          }!Y nw xY w||d(<   | 	                    |	           |	 |	|||||!|           |S ))Nr  r  r  r  r  r  r  r  r  rF  r  rX  	WELLKNOWN	ANONYMOUSr  r  rY  rV  ztkt-vnorc   r  r[  r  r   r9  zenc-tkt-in-skeyrf   r  r   r  r  T)finishedstrengthen-keyr,  zticket-checksumr   )r  r+  	reply_key)#r  rs  r  r  r  r  r7   r  r}  r  rN   tuplerY  
KDCOptionsr  r  rv  r  check_reply_padataget_preauth_keyr  r?   check_fx_fast_datar  generate_strengthen_reply_keyr  check_rep_padatar   r   r   r4   r3  EncTicketPartr  r'  )#rP   r  r  r_  r  r  r  r  r  r  r  r^  r  r  r  rV  ticket_encpartticket_cipherr9  posexpect_kvnoencpartencpart_cipherticket_checksumencpart_decryption_keyencpart_decryption_usager  fx_fast_datafast_responsestrengthen_keyfast_finishedr]  ticket_decpartr^  rep_decparts#                                      r[   generic_check_kdc_repz%RawKerberosTest.generic_check_kdc_repx
  s   
 ,,=>)/:+,=>*+;< 12I J01GH01GH$^4%k2	Z:::%%c844 	H''XGGG 	K E!%!:!:*&4 "; "6 "6 "33C!D,,S'>JJJ!!#x000%%c844V$$$##FIq999''III,,VWnMMM%%fj999!11&*EEN  000))).'BBB/>%	 45F G GHHIIAM"c+&6&66  :"-c"2c"9  F**>6+/+@B B B B --nfEEE)).(CCC $ 4 4^X N N!!#z222&&sJ77W%%%%%gw777"">6<HHH%%gx888!11'8DDN 	,##$5$1$+$*, , ,
    !233 	9 8  &&v..G((&~6 $ 7 78I8D8AAE !8 !G !G
 $}44%)%>%>%&67&9 &9N ::*24 4 +
 !. 1 1* = = ,&34E&FO%%&7&3&3H&=12 & 4 4 4
  ,##NG$9$?A A A"">6#8#=? ? ?2::9;HJ JN!__"022 - 4 4N 3444!-##GW$:$@B B B# D&&w'='BD D D088(   K
8"&//1133 #2 #5 #5  8 8 8"&//&466 #2 #8 #88
 *@+&1222+  !2M!$no!02 2 2 
s   8T 2UUc                    |                      |t          j                              }|d         d         }|                     |d         |j                   |                    t          |d                   }|                      |t          j                              }|r| j        r| 	                    d|           |r| 	                    d|           |d         }	|                     |	|d                    |S )	Nr+  r#  zenc-fast-repr   r  r-  r,  r4  )
r3  rY  PA_FX_FAST_REPLYrW  r   r   r*   KrbFastResponser  rX  )
rP   r  r@  r  r,  expect_strengthen_keyenc_fast_repfast_reprA  r4  s
             r[   r3  z"RawKerberosTest.check_fx_fast_data  s    |090J0L0L ' N N $N3NCg.	@@@$$[,x2HII1:1J1L1L ( N N ! 	;T%9 	;MM*M::: 	5MM*m444 "'*g 6777r]   c                 $   |d         }t          t          t          j        d                              dz
  }|t          |          k     o||         dk    }	t          t          t          j        d                              dz
  }
|
t          |          k     o||
         dk    }t          t          t          j        d                              dz
  }|t          |          k     o||         dk    }|p|}|d         }|d         }|d	         }|d
         }|d         }|d         }|                    d          }|                    d          }|                     |d          }||d         }|                     |||           |d         }|r|                                 }n|                                 }| 	                    |          }|g}| j
        s;| 	                    |t          j        j                  }|                    |           | j        r|                     |          rd}n|d         }d }||                     |d||           |                     |d           |                     |d          } |                     |            | A|                     | d           |                     | d           |                     |           }|                     |d|           | j        r|                     |d|           |                     |d           |                     |d           | j
        r|                     |d           |                     |d           | j
        r/|r|                     |d           n|                     |d           | j
        r|                     |d            |L|r|                     |d!| "           n0|                     |d!          }!|!|                     |d!d"           d }"||                     |d           |                     |d          }#|                     |#           |#A|                     |#d           |                     |#d           |                     |#          }"|                     |d#           |                     |d$|d$                    |t4          k    r| j
        r|                     |d%           n|                     |d%           |                     |d||           |                     |d           | j
        r|                     |d           |                     |d           | j
        r/|r|                     |d           n|                     |d           |                     |d&|           |                     |d'|           | j
        r|                     |d            |                     |          }$|                     |          }%|                     |d(          }&|	sd|$v s|t4          k    rf|%rc| j
        r|                     |&           |&C|                     |&          }'| j
        rt|	r|                     t>          |'           n|                      t>          |'           d|$v r|                     tB          |'           n|                      tB          |'           |t4          k    r|%r|                     tD          |'           n|                      tD          |'           t>          |'v rq|d)         }(tG          j$        d*|'t>                             \  })tJ          j&        tJ          j'        z  }*| (                    |)|* z  |(|* z  d+|) d,|)d-d.|( d,|(d-d/	           tB          |'v rJ| )                    |'tB                   t          j*                    0          }+|                     |+d1|$           tD          |'v r|'tD                   },| )                    |,t          j+                    0          },|d2         }-|d3         }.|d4         }/| ,                    |. |/            0          }.|,d5         }0|,d6         }1|--                    t\          |.|1|0           n|&| (                    |&g            |L|"J| (                    |j/        |"j/                   | (                    |j0        j1        |"j0        j1                   |"|"}2n|}2te          ||2|||||||7	  	        }3|b| 3                    |3|8          }4|du r|                     |4           n|d9u r| 4                    |4           |4| 5                    |4|           |d:         }5|d;         }6|5s|6r|                     |           |J|tl          k    o| 7                    |           }7| 8                    |3||7||5p| j9        |6p| j:        <           |3|d=<   d S )>Nr9  canonicalizerf   r  	renewablerenewr  r  r  r  r  r  r  r  rV  r  rj  )r   Tr  flagsr   r   r   rX  rY  	transitedauthtime	starttimeendtimez
renew-tillcaddrrZ  )r|  zlast-reqr4  zkey-expirationrZ  r[  zencrypted-pa-datar  z<LzPADATA_SUPPORTED_ETYPES: got: z (0xXz), expected: r   r+  rT   r.  r  r  r   r  )rX  rY  rZ  r[  r\  r]  r^  r  Fr  r  )service_ticketr  r  r  rep_ticket_creds);rN   r/  rY  r0  r  rs  verify_ticket_checksumr  r  r  r  r   r   r   rj   r  is_tgsr  r}  r  r  r  r  r  rv  r  r   get_sent_pac_optionssent_enc_pa_repr  rX  rG   r  rB   rH   r@  rN  r
   rR  rP  rW  r3  r/  Checksumr8  r   r&   r   r   r   rT  get_ticket_pacrg  check_pac_buffersr!   is_tgs_principalverify_ticketr  r  )8rP   r  r  r_  r]  r^  r=  r9  	canon_posrN  renewable_posrO  	renew_posrP  expect_renew_tillr  r  r  r  r  r  r  r  rV  r  rj  krbtgt_creds
krbtgt_keykrbtgt_keyskrbtgt_key_rc4r  rj  
ticket_keyru  encpart_session_keyencpart_keysent_pac_optionsr^  
enc_padataenc_pa_dictr  supported_etypesignore_bitsr0  
enc_pa_repr.  r  r  r   r   rW  ticket_credspac_datar  r  rY  s8                                                           r[   generic_check_kdc_privatez)RawKerberosTest.generic_check_kdc_private+  sM    (6i2>BBCCDDqH	!C$4$44 :'	2c9 	E)"6{"C"CDDEEI"S%5%55 ;$]3s: 	i27;;<<==A	S--- 3 +s2 	%.+,=>*+;<+,=>*+;< 12I J(8*../?@@,001CDD%%c844&)+6I''KKK#I. 	35577LL0022L88FF
!l# 	/!@@o) A + +N ~...? 	9t{{>:: 	9JJ*<8J!%##NG$2$46 6 6 %%ne<<<--neDDJ  ,,,%))*i@@@))*jAAA%)%>%>z%J%J"''(79 9 9" A001?A A A%%nkBBB%%njAAA# G)).+FFF%%ni@@@# L$ L--nlKKKK--nlKKK# C)).'BBB% E--n.B?I> . K K K K ,,^-AC CA}11.2F?C 2 E E E #&%%ou===..FFK  ---&))+yAAA))+zBBB&*&?&?&L&L#%%ozBBB##OW$5g$>@ @ @z))' @--o.>@ @ @ ))/*:< < <##OW$2$46 6 6 %%ozBBB# H))/;GGG%%oyAAA# M$ M--o|LLLL--o|LLL''(79 9 9,,_g-;= = =# D))/7CCC#889JKK"223DEEO--o.AC CJ H5'7 7 7 J..?.' 5((444)"&"2"2:">">K+ 
N' : MM*A;OOOO ,,-D-8: : : "222 MM*<kJJJJ ,,-?MMM#z11o1&;[IIII(()>LLL.+==4E7591 /5m '(?@/B /B+) (0'H'/'H(I ((,|;5Dg=M g gScj g g)Bg gHafg g gh h h *[88&*oo'(:;%.%=%?%? '6 'A 'A //Y0@B B B -;;%01F%G
%)__&%.%7%9%9 &5 &; &;
 %6k$B	"3I">'8'H"&//';G<>> #2 #K #K $.j#9 *; 7!11)29272:< < <
 )$$Z444).A.M/5068 8 8/3<04=? ? ?*-KK,K*" " 0)+	- 	- 	- %**<J*OOHT!!$$X....u$$!!(+++#&&x1BCCC!23K!L01GH! 	8%9 	8  !6777 ,*k9 L&*&;&;N&K&K"K |[.<*46L 77"&"64H 58"&"7  9 9 9 1=,---r]   c                 N   t          t          j        |          }|d         }|d         }|d         }|d         }t          j        t          j        t          j        t          j        t          j        g}|d         }	t          t          t          j        d                              dz
  }
|
t          |	          k     o|	|
         dk    }|r|                    t          j                   | j        rl|r|                    t          j                   |t           k    r@|>|                    t          j                   |                    t          j                   |t           k    rS|                     |          s>|                    t          j                   |                    t          j                   t          j        t          j        t          j        h}| j        s|                    t          j                   | j        s|                    t          j                   |                     |          }|d	         }|r	|d
         }n3|d         }|)| j        r|}n|                    t          j                   |r|                    t          j                   |d         }|)| j        r|}n|                    t          j                   |r|                    t          j                   d |j        D             }|                     ||d|           |d         }|d         }|d         }|d         }|d         }|||d}|j        D ]E}|j        t          j        k    r|d         }|d         }|j         j         }| !                    |tE          |j#                             tI          tK          tD          |j&                            }| !                    ||           |j        t          j        k    rD|d         }d'                    |d                   }| !                    ||j         j(                   |j        t          j        k    r|j         j         j)        }|j*        }|(| !                    |tE          |j(                             |DtW          |,                    dd          d                   } | !                    | |j-                   || .                    |j/                   d |j/        D             }!| !                    |j0        t          |!          d           d}"|D ])}#|j/        D ]}$|#tE          |$j1                  k    r|"dz  }" *| !                    |"t          |                     |^d}"|D ]C}#| .                    |j/                   |j/        D ]}$|#tE          |$j1                  k    r|"dz  }" D| !                    |"d           |j        t          j        k    r|j         }%|%j2        }&|d         }'| !                    |'|%j3                   |d          }(|(| !                    |(|%j4                   |r| .                    |&           |&G|| !                    ||&j5                   |(| !                    |tE          |&j6                             g|j        t          j        k    r|r|j         })| !                    d!|)j7                   |)j8        }*ts          |*dz            }+ts          |*d!z            },| !                    |du |+           | !                    |d u |,           |j        t          j        k    r3|r1|j         j1        }-|#| !                    |tE          |-                     Gd S )"Nr  r  r  r  r9  zcname-in-addl-tktrf   r  r  r  r  r   c                     g | ]	}|j         
S r   )r-  )r  
pac_buffers     r[   r  z5RawKerberosTest.check_pac_buffers.<locals>.<listcomp>  s*     7 7 7& # 7 7 7r]   F)r  r  r  r  r	  r  r  Tr%  r&  r  r  r  -c                 6    h | ]}t          |j                  S r   )rg  sid)r  sid_attrs     r[   	<setcomp>z4RawKerberosTest.check_pac_buffers.<locals>.<setcomp>  s"    MMMhHL 1 1MMMr]   zFound duplicate SIDsr   r  r
  re   ):r   r	   PAC_DATAPAC_TYPE_LOGON_INFOPAC_TYPE_SRV_CHECKSUMPAC_TYPE_KDC_CHECKSUMPAC_TYPE_LOGON_NAMEPAC_TYPE_UPN_DNS_INFOrN   r/  rY  r0  rj   PAC_TYPE_CONSTRAINED_DELEGATIONr  PAC_TYPE_CLIENT_CLAIMS_INFOr!   PAC_TYPE_DEVICE_INFOPAC_TYPE_DEVICE_CLAIMS_INFOrb  PAC_TYPE_TICKET_CHECKSUMPAC_TYPE_FULL_CHECKSUMr  addr  r\  r  PAC_TYPE_ATTRIBUTES_INFOPAC_TYPE_REQUESTER_SIDbuffersr  r-  inforW  rg  proxy_targetrq  maptransited_servicesjoinaccount_nameinfo3baserz   r'  ridr  sidssidcountr}  exdns_domain_nameupn_namesamaccountname	objectsidflags_lengthrQ  r  ).rP   rv  r  pacr  r  r  r  expected_typesr9  r9  constrained_delegationr  r  r  r  r   buffer_typesr  r  r	  r  r  rz  r%  r&  delegation_infor  r  r  r  
logon_infoexpected_ridgot_sidsmatch_countgr~  upn_dns_infoupn_dns_info_exexpected_realmr
  	attr_inforQ  requested_pac	given_pacrequester_sids.                                                 r[   ra  z!RawKerberosTest.check_pac_buffers6  s~   )844(8%k2	*+;<)/:!5!7!7!5!7	9 (6%	,-@AABBCCaG"%K(8(8"8 #>&1#&6#&= 	! 	K!!'"IJJJ  	K K%%g&IJJJ++!-%%g&BCCC%%g&IJJJ;&&((88 F%%g&FGGG%%g&DEEE!=!6!=? # 	Aw?@@@$ 	?w=>>>#';;~#>#> ,-?@ 	I+<.,0(( ,=,(  '0 I'?$$"&&w'GHHH 	D!!'"BCCC01GH', C'?$$""7#ABBB 	B!!'"@AAA7 7*-+7 7 7((L!) 	) 	+ 	+ 	+
 !22I J+,=>-.AB(8!23K!L!)%1+%)"+ i	G i	GJ'"III(9+)-%.?1/3+ #-/"6  !6!$_%A!B!BD D D &*#;+= += &> &>"  !<!35 5 5 5 G$???!23C!D"xx}(EFF  z/KLLLLG$???",2"Z
(4$$%:%()@%A%AC C C  +#&|':':3'B'B1'E#F#FL$$\:>BBB".((444MM%*MMMH$$U^%(]]%;= = = #$K, 1 1(-
 1 1H C$5$555 +q 01 $$[#o2F2FGGG$0"#K. 1 1,,UZ888(-
 1 1H C$5$555 +q 01 $$[!444G$AAA)"./!23D!E  !-!=? ? ? %66I$J!$0$$%6%1%:< < < * :((999".,8(()>)8)GI I I $/((),_-F)G)GI I I /W%EEE* F&O	  I$:;;;! $UQY OO	  !=!E!.0 0 0  !=!E!*, , , , /W%CCC. D * 3+$$\3}3E3EFFFSi	G i	Gr]   c                    |d         }|d         }|d         }|d         }|d         }	|                      |          }
|d         }|                     |dd           |                     |d	t                     |                     |d
          }|                     ||	           | j        r,|                     |d           |                     |d           |                     |d           |                     |d           |r8|s6|                     t          ddg          }| 
                    |d|           n| j        r|                     |d           | j        rZ|                     |d           |                     |d|           | 
                    |d|           |                     |d           |d         }|d         }| |t          k    o|
 p|d u p
|t          k    o| }|r|| j        u rd}|s4|                     |           | j        r|                     |d           |S |                     |d          }| j        r|                     |           ||t"          k    r|
s|                     |t'          j                              }|                     t,          |d                    |d         }|                     dt/          |                     t0                              |d d         d           }t0                              |d!d          d           }|                     ||           |                     d"|           n|                     |           |                     |t'          j                              }|                     t/          |          d#           |
r|                     d$t/          |                     |                     |          }|                     t:          |           |d%         }|                     |           |                     ||t:                   |d&          }|d'         }|                     ||||          }||d(<   |S ))Nr  r  r  r  r  r  r]  rc   rF  r  rW  rV  r  r  r*  r+  r  rY  rX  r  r[  r  r  r  Fr  r+  z	data-typez
data-value   rK   r   rJ   rd   r   rf   r  )rJ  r  preauth_etype_info2) 	sent_fastr  r   rs  rX  r  rv  r}  r  r7   r  r  r   r   expect_padata_outerrg  r  r!   r3  rY  KERB_ERROR_DATArW  r   rN   rz   
from_bytesMETHOD_DATAassertGreaterr  r?   r3  r5  )rP   r  r  r_  innerr  r  r  r  r  r  r  r  r  r  r  edata
error_dataextended_errorr  rQ  
rep_padatarep_pa_dictr  rA  r  s                             r[   generic_check_kdc_errorz'RawKerberosTest.generic_check_kdc_error  s    )8)/:+,=>*+;</0EFNN#455	+,=>VQ///Z;;;))#|<<
j"5666 	4%%c7333%%c7333!!#w///!!#w/// 	4 	4!66&"K0 7 2 2N ,,S'>JJJJ! 	4%%c7333 	5%%c8444''WoFFF,,S'>JJJ%%c8444+,=>(8&*OO *%. "P/T2I "P$37O$O* %*	   	!\T%=== L 	o...# 9))#x888J$$S(33 	(  '''{**9*!__&688 - : :
   !7!+K!8: : : ",L!9  S%8%8999rr(:HEE~abb'98DD  &999  E****!!/222!__U6?6K6M6M - O O
""3z??A666 9$$QJ888"&"2"2:">">KMM.+>>> 1+ >I((333$($;$;)#N3!.3	 %< %5 %5M "/x!8J"334E4A4>4>@ @
 <G!"78
r]   c                    d}|                      |          }|d         }|r|t          fz  }n|t          k    r|                     |d          }|                     |           |t
          j        j        t
          j        j        hv r|t          fz  }|d         }	|	j
        t
          j        j        k    r|d}n|t          k    r
|dk    r|d}| j        s|d}|                     |           t          d |D                       }
|                     ||
           t!          |          dk    rd S |                     |          }|                    t                    }||                     |t)          j                              }|                     t!          |          d           |d         }|                     |d          }|                     ||           |                     |d	          }|                     |           |d
         }||                     ||           |                     |d          }| j        r|                     |           d S d S d S )Nr   r  r   r  c              3   &   K   | ]}|d          V  dS r  Nr   r  s     r[   r  z5RawKerberosTest.check_reply_padata.<locals>.<genexpr>  '      CC"B}-CCCCCCr]   r   r+  rf   r  r  r  )r  r?   r   rs  r  r   r   r   r   r;   r   r   r!   r  r/  r  rN   r  r  r3  rY  ETYPE_INFO2rW  rg  )rP   r  r  r;  r  expected_patypesr  r  chosen_etyper  got_patypesr  r  rr  ry  r  r  r  s                     r[   r1  z"RawKerberosTest.check_reply_padatae  s   
 NN#455	(8 	  11Z''//AAL  ... 6 ' 6 8 8 8 %7$99 +M:K GO$777J<N
[((2%%**<
# 	
(:JZ(((CC
CCCCC(()9;GGG  A%%4"":..kk"455"//+3<3H3J3J * L LKS--q111q>D$$T733AQ---''f55D  &&&-o>M(  }555,,T;??I# -!!),,,,, #"- -r]   c                    |d         }|d         }|d         }|                     dg           }|                     |          }	|                     |          }
|t          k    r|                     |	           |d         }d}d}d}d}t
          j        j        |v rd	}|D ]Y}||vr|t
          j        j        t
          j        j	        fv r
d}||k    r|}|t
          j        j        fv r|dk    r
||k    r|r|}Z|dk    r||fz  }|dk    r||fz  }d}|	r|dk    r|t          fz  }|t          fz  }|t          k    r0|                     |          }d
|v r|dt          fvr|t          fz  }n|t          k    r|r0|r#|                     t!          |          d           |t"          fz  }t!          |          dk    r|t$          fz  }|t&          t(          t*          t,          fvr1|	r|t.          fz  }n|t0          fz  }|
s|t2          fz  }|t4          fz  }| j        r|	s|
s|t8          fz  }|t          fz  }t          t8          t          t4          t2          t:          t<          h}|d         }|s4|                    t$                     |                    t.                     tA          d |D                       }| !                    |||           |sd S | "                    |          }|                     t0                    }|#| #                    t!          |          d           |                     t2                    }|#| #                    t!          |          d           |                     t4                    }|#| #                    t!          |          d           |                     t8                    }|#| #                    t!          |          d           |                     t                    }|||d<   |                     t                    }|A| $                    |tK          j&                              }| '                    |||d	           |                     t                    }|?| $                    |tK          j(                              }| )                    |d|           |                     t.                    }||
s%| #                    t!          |          d           n|d         }| *                    |           | +                    |          \  } }!| ,                    ||           }"| j-        r#| .                    t!          |          d           t!          |          dk    r
| $                    |tK          j/                              }#| #                    |#d         |"j0                   |"1                    td          |#d                   }$| $                    |$tK          j3                              }$|$d         }%| 4                    d|$           | 5                    |%          }&tm          j6                    }'| 7                    |'dz
  |&           | 7                    |&|'dz              |                     t$                    }(|(| $                    |(tK          j8                              }(| 9                    t!          |(          d           | j-        r0| #                    t!          |(          t!          |                     tu          dt!          |(                    D ]})| ;                    |(|)         d          }*| j-        r| #                    |*||)                    | ;                    |(|)         d          }+|*t
          j        j        k    r| j-        r| <                    |+           n5| *                    |+           |d         },|,| #                    |+|,           | ;                    |(|)         d          }-| j-        r| <                    |-           |                     t"                    }.|.| $                    |.tK          j=                              }.| #                    t!          |.          d           | ;                    |.d         d          }*| #                    |*t
          j        j                   |r| #                    |*|d                    | ;                    |.d         d          }+| j-        r8| *                    |+           | #                    t!          |+          d           |(S )Nr  r  r   r  r!  r   Fr   Tr  r  c              3   &   K   | ]}|d          V  dS r  r   r  s     r[   r  z3RawKerberosTest.check_rep_padata.<locals>.<genexpr>  r  r]   )r  fast_cookier+  )r  rT   r  r  r  r  i,  rf   r  r  r  )>r  r  sent_enc_challenger!   r  r   r   r   r   r   r>   r=   r]  r   rB   r  rN   r:   r;   r   r   r   r   r8   r9   rE   rF   r  r?   rD   r@   r  r/  r  r  rW  r3  rY  r   r  r/  r  r  r2  generate_kdc_challenge_keyr  r{  EncryptedDatar   r   r'   PA_ENC_TS_ENCrX  r  r  r  r  rO  rk   rs  rg  
ETYPE_INFO)/rP   r  r  r  r  r  r  proposed_etypesr  r  r  r!  expect_etype_info2expect_etype_infoexpected_aes_typeexpected_rc4_typer   r  ro  r  r  r  r  enc_timestamp	pk_as_reqpk_as_rep19fx_fastr  
fast_errorr0  enc_challenger  r  r  kdc_challenge_keyencrypted_challenge	challenge
rep_patimerep_timecurrent_timer  r  ry  r  r  r  
etype_infos/                                                  r[   r5  z RawKerberosTest.check_rep_padata  s
   
 )8$Z0"7+,001CRHHNN#455	!445FGG;&&OOI&&&'6!?/11 $$ 		. 		.E,,,/1GHHH$)!,,,(-%,...:??,,,,(-%!!#4"66!!#4"66 	4q 22!1 33;&&#889JKK'''"1o*>>> %7$99 ?**  9 C&&s+='>'>BBB %6$88 %&&!++ %7$99 "8,"02H"J J J @$)C(EE$$$)=(??$) ?$)9(;;$$)<(>>$% 8%8.8 !^$55  %5$77 *(,-**$& !22I J$ 	;12229:::CC
CCCCC(()9;8F 	) 	H 	H 	H   	4"":..$899$S//333KK 011	 S^^Q///kk"566"S--q111++n--S\\1---kk"233"/:m,[[11
!2;2E2G2G ) I IJ(():)6)3/3 ) 5 5 5
 kk"455"//"133 * 5 5K ##K<LMMM$>??$% 'B  ]!3!3Q7777-k:	$$Y///!%!5!56G!H!HQ$($C$C{%, %,!
 ' ?''M(:(:A>>>}%%***.//%!*!8!:!: +: +< +<' $$%8%A%6%<> > > !2 9 9,+H5!7 !7I !%!!*!8!:!: !0 !< !<I
 "+=!9JMM(I666  $==jIIH#'9;;LOOL3$6AAAOOHlS.@AAAkk"455"//+3<3H3J3J * L LK##C$4$4a888# L  [!1!137I3J3JKKK1c+..// 1 1((QAA' ?$$Q(:1(=>>>++KNFCC++++ 0))$///((...$5o$FM$0((}=== 00QMM	' 1%%i000[[!233
!2;2F2H2H ) J JJS__a000$$Z]G<<AQ 3444 ;  $6q$9:::''
1v>>D# /$$T***  TA...r]   c                    |d         }|                      |||          }	|                     |	t          j                              }	|                     |t
          |	          }	|                     |||	          }
|                     |
          }|                     |t          j                              }| 	                    t          |          }|S )Nr  r+  )r  r8  rY  
KrbFastReqr  r(   r!  r&  PA_FX_FAST_REQUESTr  r?   )rP   r  _callback_dictr  r  r  r   r  r  fast_reqfast_armored_reqfx_fast_requests               r[   generate_simple_fastz$RawKerberosTest.generate_simple_fastv  s     &k2	++L,7,46 6 ??8,5,@,B,B # D D,,Y-8-57 7  ;;J<D<DF F 889IJJ//133 * 5 5 )).*9; ; r]   c           
         d }|r&|                      |           |d         }|d         }	ne|d         }|d         }	|S|d         }
|                     |t          j                              }|                     |j        t          ||
          }|d         }d }|	|	                                }|t          j	        d	d
          }| 
                                \  }}|                     |j        |j        ||||||          }|                     |t          j                              }||rt          nt           }|                     |j        ||          }|r	|d         }n|d         }|!t%          t          j        d                    }|                     ||j        |          }|                     |t          j                              }|S )Nr  r  r  rk  rl  r+  r  r  r   ra  rb  r  rR  r  rc  )rg  r8  rY  rd  r  rW  r1   r   r  r  r  r^  rX  rY  re  r#   r0   r  rg  rf  rT  rV  rh  )rP   r  r  r  r  r   r[  rn  r  rk  rl  rm  r  ro  rW  rV  authenticator_objauthenticator_blobrQ  rR  
ap_req_objrp  s                         r[   r  zRawKerberosTest.generate_ap_req  s.    ! 	.h'''#K0C#4^#D  #E*C#45K#L #%67K%L" $y'='?'? !0 !A !A %)$8$8O)!,	 %9 %. %.! &k2	
+-88::J:66J6688 55:)#!( 6 * * "__,.. - 0 0 =&+@NNE11#/272DF F  	9*+<=JJ*<8JY05566J'':/2z6C ( E E
 i6F6H6HIIr]   c                 x    |                      |||d          }|                     t          |          }|g}||fS )NFr  )r  r  rA   )rP   r  r  r  rp  rq  r  s          r[   generate_simple_tgs_padataz*RawKerberosTest.generate_simple_tgs_padata  sS     %%&7&3&.,1 & 3 3 ((@@
xr]   c                     |d         }|t           k    r|d         }t          }n*|d         }|
|}t          }n|d         }|j        }t          }|                     |           ||fS )Nr  r  rk  r  )r   r$   r/   rW  r.   r  )rP   r  r^  r   r   rk  r  s          r[   r2  zRawKerberosTest.get_preauth_key  sz    $^4z!!#M2C&EE#45K#L #/*3'.o3S!!!Ezr]   c                 h    t          j        |j        |j        dd          }t          |d           }|S )Ns   subkeyarmors   ticketarmorr   cf2r   r~   )rP   rX  rW  r  s       r[   generate_armor_keyz"RawKerberosTest.generate_armor_key  s9    K
 + . .0 0	 &i66	r]   c                 r    t          j        |j        |j        dd          }t          ||j                  }|S )Ns   strengthenkeys   replykey)r   r  r   r~   r   )rP   rB  r.  strengthen_reply_keys       r[   r4  z-RawKerberosTest.generate_strengthen_reply_key  sH    &{>+=+4=+;+6 8  8  11E1: A  A $#r]   c                 h    t          j        |j        |j        dd          }t          |d           }|S )Ns   clientchallengearmor   challengelongtermr  )rP   r  longterm_keyclient_challenge_keys       r[   generate_client_challenge_keyz-RawKerberosTest.generate_client_challenge_key  s?    &{9=+7+;+B+? A  A  11EtLL##r]   c                 h    t          j        |j        |j        dd          }t          |d           }|S )Ns   kdcchallengearmorr  r  )rP   r  r  r  s       r[   r  z*RawKerberosTest.generate_kdc_challenge_key  s=    #K	(4(8(<(<> > ..?FF  r]   c                     |d         }|                      |j        |           |                     |t          j                              }|                     |t          |          }|                      ||           d S )Nr  r+  )rW  r   r8  rY  Ticketr  r)   )rP   rV  expected_checksumr  expected_typeticket_blobr   s          r[   r[  z&RawKerberosTest.verify_ticket_checksum#  s    )+6-888oof/8/?/A/A & C C''	(8(35 5 	*H55555r]   c                 b	   |j         }|j        d         }|                     |d|j                   |                     |d|j                   |                    t          |d                   }|                     |t          j
                              }|                    d          }	|r|                     |	           n|	d S |                                 }
|                     |	|
|          \  }	}|sd S t          t           j        |          }t          t           j        |          }i }d }t'          |j        |j                  D ]\  }}|j        }|| j        v r|                     ||d|            |j        j        }|j        j        }|d	z  r|d
z  }||f||<   |t           j        k    r|}k|t           j        k    r^t          t           j        |j        j                  }t=          t?          |                    |_        tA          |          |j        _        tA          |          }|mt          t           j        |j        j                  }t=          t?          |                    |_        tA          |          |j        _        tA          |          }|t           j!                 \  }}|"                    tF          |||           |t           j$                 \  }tK          |tL          j'        j(                  r,| j)        r	|d         }ntU          fd|D                       }n|}|+                    tF          ||           |sB|                     t           j        |           |                     t           j        |           d S |                    t           j        d          \  }}|r|                     |           n|du r| ,                    |           |J|	|d<   | -                    |t          j
                              }|+                    tF          |||           |                    t           j        d          \  }}|r|                     |           n|du r| ,                    |           ||+                    tF          |||           d S d S )Nr  r   r   r  r+  rZ  rX  Duplicate checksum type r	  r
  r   c              3   2   K   | ]}|j         k    |V  d S r   r  )r  r   	kdc_ctypes     r[   r  z0RawKerberosTest.verify_ticket.<locals>.<genexpr>  s;       "= "=#%(Y)%;%; #&%;%;%;%;"= "=r]   NNF).r\  rV  r  r   r  r   r   r4   r3  rY  r6  r  r  get_empty_pacreplace_pacr   r	   r  PAC_DATA_RAWzipr  r-  pac_checksum_typesr  r  	signaturer  r  PAC_SIGNATURE_DATA	remainingr   rN   r   r  r   r-   r  rx  rM  ry  rz  r  nextr   rg  r8  ) rP   rV  rj  rY  r  r  r  r   r  r  	empty_pacrv  r  raw_pac	checksumsfull_checksum_bufferrz  raw_pac_bufferbuffer_typer   r   r  full_pac_dataserver_checksumserver_ctypekdc_checksumri  r=  ticket_ctypefull_checksum
full_ctyper  s                                   @r[   rc  zRawKerberosTest.verify_ticket.  s[    #=,'39===x:::;;y(8*<==??y688 # : : LL!566	 	  ++++F &&((	"..y/8:D / F F	8  	F )!# #W1%' ' 	#*-ck7?*K*K 	# 	#&J$/Kd555  i!IK!I!IK K K &?4",7? &X%E)15	+&'"@@@+9(( G$DDD !+2&+5!7 !7I +0H*>*>I'4<!5# 5#N'1 G$$+"*$)35 5I #(H"6"6I2:3 3 %/ %W--M )2))+%2$(+	- 	- 	-
 #,)#+i k;?#<== 	%# =(^

! "= "= "= "= "= "= "= = =

 %J''(>(7(1(4	6 	6 	6
   	?W=yIIIW;YGGGGG,5MM0- -)O\ & 3$$_5555'500!!/222*1:-.??84=4K4M4M + O O //0F080<0?A A A
 )2.) )%M: $ 1$$]3333%..!!-000(//0F0=0:0=? ? ? ? ? )(r]   )new_ticket_key	modify_fnmodify_pac_fnexclude_pacallow_empty_authdataupdate_pac_checksumschecksum_keysinclude_checksumsc                l   |i }|	i }	|                      |                                | j                   |                      |	                                | j                   |r|                     |           d}|s*|                     |           |                     |	           |d u}
|j        }||}t          j        |vr||t          j        <   t          j        |vr0|	                    t          j
                  }|||t          j        <   t          j        |vr0|	                    t          j
                  }|||t          j        <   |j        d         }|                     |d|j                   |                     |d|j                   |                    t$          |d                   }|                     |t)          j                              }| ||          }|	                    d          }|
r|                     |           |d }|s|                                 }|                     |||
          \  }}|t3          t          j        |          }| ||          }|rY|                                }||d<   |                     |t)          j                              }|                     |||	|           t=          |          }|                     t@          |          }|                     |||
|	          \  }}||d<   |                     |t)          j                              }| !                    |t$          |          }|j                                        }||d<   tE          ||j#        |j$        |j%        |j&        |j'        |||j(        
	  	        }|S )NFr  r   r   r  r+  rZ  rX  )r  r#  )rW  rX  rY  rZ  r[  r\  r]  r^  ))assertLessEqualkeysr  rg  assertFalser\  r	   r  r  r  r  r  rV  r  r   r  r   r   r4   r3  rY  r6  r  r	  r
  r   r  copyr8  r$  r   r   r   r  rT  rW  rX  rY  rZ  r[  r^  )rP   rV  r  r   r!  r"  r#  r$  r%  r&  r  r   kdc_checksum_keyr  r  new_pacr  empty_pac_auth_datarv  r  enc_part_to_signr  enc_part_new
new_ticketnew_ticket_credss                            r[   modified_ticketzRawKerberosTest.modified_ticket  sC      M$
 !# 	]//1143JKKK.3355t7NOOO 	)m,,,#( # 	0]+++.///"$.
#! N(== <JM'78+=@@  -001NOO+$ g>? )>>  -001NOO+$ g<=
 =,'39===x:::;;y(8*<==??y688 # : :   y**HLL!566	 	,  +++ G "F !..00	040@0@) 1A 1+ 1+-#X
 '$W%5x@@C %0+mC00+ D ,4==??(/ ))=>+/??,%.%<%>%> ,; ,@ ,@( 11#2?2C2BD D D  (}}H";;L<DF FG
  ++7%%9 , ; ;LIq .7H)* x090G0I0I ' K K001:1=? ?
 ]''))
!-
:.*=,=,)#"2	4 	4 	4  r]   c                 0   |j         }i }|D ]1}|j        }|| j        v r|                     ||d|            |||<   2| j        D ]}||v rR|                    |          du r:|                    |          }	|xj        dz  c_        |                    |	           X|                    |          du r^t          j	                    }
t          j
                    }	||	_        |
|	_        |                    |	           |xj        dz  c_        |	||<   |                                D ]\  }}	||         }|j        dz  }|t          j        k    r1|                     |           |                    t$          |          }n9|t          j        k    r|                                }n|                                }||	j        _        ||	j        _        ||_         |                    t          j                  }|H|t          j                 }t1          |          }|                    t$          |          }||j        _        |                    t          j                  }|H|t          j                 }t1          |          }|                    t$          |          }||j        _        |                    t          j                  }|K|t7                      }|t          j                 }|                    t$          |          }||j        _        d S d S )Nr  Frf   Tl    )r  r-  r  r  r  popnum_buffersremover	   r  
PAC_BUFFERr  rj   r   r   r  r  r   r-   r  r   r   r  r  r   r   r  r   )rP   r  r%  r&  r  pac_bufferschecksum_buffersrz  r  checksum_bufferr  checksum_keyr   r  r  full_checksum_keyrv  r  server_checksum_bufferserver_checksum_keyr  kdc_checksum_bufferr,  r  s                           r[   r$  z$RawKerberosTest.update_pac_checksums^  sn   
 k & 	; 	;J$/Kd555  .>!IK!I!IK K K 1; -
  2 	@ 	@K...$((55>>&6&:&:;&G&GOOOq(OO&&777"&&{33t;;133")"4"6"6'2$'+$""?3331$0? - -=,B,B,D,D 	. 	.(K(5L &-8Eg>>>$$X...(;;* 		  ===(==??		 )BBDD	-6O *(-O %% "  033* ,  ,+ -g.L M}}H-;;& M 3@ %/ "2!5!5)"+ "+!-"/0M"N}}H1??& O 5D"'1.22)+ +*%- #('',W-JK+>>&! !L 2>$... +*r]   c                    |2|                      |dt                     |                     |d           g }d }d }|D ] }|d         t          k    r|                     |d         t          j                              }g }	|D ]^}
|
d         t          k    r6|                     |d           |
d         }||	                    |           I|	                    |
           _|r|                     |d           |	s|rD| 	                    |	t          j                              }| 
                    t          |          }nd }||r|                    |           "|r|                     |d           ||fS )Nr  r  r+  zMultiple PACs detectedzExpected PACzExpected AD-RELEVANT)r  r   r}  r   r3  rY  rg  rj   r  r8  r   )rP   r  r-  r  r#  new_auth_dataad_relevantold_pacauthdata_elemrelevant_elemsrelevant_elems              r[   r
  zRawKerberosTest.replace_pac  s   ##GYEEE%%gy999& 	4 	4MY'>99"oo!),&577 . 9 9 "$%0 = =M$Y/<??))'3KLLL"/	":".*11':::&--m<<<< B((.AAA! 	)%9 	)"&//&!*!9!;!; #2 #= #=K %)$A$A&#%% %%MM %)M(,@($$]333 	F  .DEEEg%%r]   c                 :    |                      |d |          \  }}|S r   )r
  )rP   r  r  r  r  s        r[   get_paczRawKerberosTest.get_pac  s"    !!)T:>>3
r]   c                     |j                             d          }|r|                     |           n|d S |                     ||          S )NrZ  rX  )r]  r  r  rI  )rP   rV  r  r  s       r[   r`  zRawKerberosTest.get_ticket_pac  sY    )--.BCC	 	  ++++4||I*|===r]   c                 p    |                                  }|                     |          }t          j        |iS r   )r  r  r	   r  )rP   rh  ri  s      r[   get_krbtgt_checksum_keyz'RawKerberosTest.get_krbtgt_checksum_key  s:    ,,..88FF
 ):
 	
r]   c                 p    |                      |          rdS | j        r|                     |          rdS dS )NTF)r\  r  	is_kadmin)rP   	principals     r[   rb  z RawKerberosTest.is_tgs_principal  sC    ;;y!! 	4 	$..";"; 	4ur]   c                 &    |d         d         }|dv S )Nr  r   )r  s   kadminr   rP   rO  rw   s      r[   rN  zRawKerberosTest.is_kadmin      '*,,,r]   c                 &    |d         d         }|dv S )Nr  r   )r  s   krbtgtr   rQ  s      r[   r\  zRawKerberosTest.is_tgs  rR  r]   c                 F    |j         d         }|                     |          S r`  )rV  r\  )rP   rV  r[  s      r[   is_tgtzRawKerberosTest.is_tgt   s     g&{{5!!!r]   c                 R    |                      t          t          d                    S rC  )r   r   r   r   s    r[   r	  zRawKerberosTest.get_empty_pac$  s    ,,\588DDDr]   c                 8    |                      |d                   S )Nr  )r  )rP   r  s     r[   get_outer_pa_dictz!RawKerberosTest.get_outer_pa_dict'  s     1, ?@@@r]   c                 j    |                      |d                   }|r|S |                     |          S )Nr  )r  rX  )rP   r  req_pa_dicts      r[   get_fast_pa_dictz RawKerberosTest.get_fast_pa_dict*  s>    &&'8'GHH 	%%&7888r]   c                 >    |                      |          }t          |v S r   )rX  r?   )rP   r  outer_pa_dicts      r[   r  zRawKerberosTest.sent_fast2  s!    ../@AA..r]   c                 >    |                      |          }t          |v S r   )r[  r8   rP   r  fast_pa_dicts      r[   r  z"RawKerberosTest.sent_enc_challenge7  s!    ,,->??)\99r]   c                 >    |                      |          }t          |v S r   )r[  rH   r_  s      r[   r^  zRawKerberosTest.sent_enc_pa_rep<  s!    ,,->??$44r]   c                    |                      |          }t          |vrdS |                     |t                   t          j                              }|d         }|d d         |dd          }}|dt          |          z  z  }|S )Nr   r+  rT   rK   r  )r[  rB   r3  rY  r/  rN   )rP   r  r`  r0  r  s        r[   r]  z$RawKerberosTest.get_sent_pac_optionsA  s    ,,->??\112ool3E&F/8/G/I/I & K K!), "-RaR+abb/YsS^^++r]   c                     |                                  }|                                }|                                }|                     t          ||g          }|S )Nr  )r  r)  r,  r  r6   )rP   rh  krbtgt_usernamekrbtgt_realmkrbtgt_snames        r[   get_krbtgt_snamez RawKerberosTest.get_krbtgt_snameQ  sc    ,,..&3355#--//00!/<)H 1 J J r]   c#           	      z   fd}#|s
d }$| j         }%n	| j        }$d }%|#}&nd }& | j        d"i d|d|d|	d|
d|d|d|d	|d
|d|d|d|&d|$d|%d| j        d|d|d|d|d|d|dt	          |          d|d|d|d|d|d|d| d|!d |"}'|                     |'||||||!          }(|(|'fS )#Nc                     |fS r   r   )_kdc_exchange_dictr  r  r  s      r[   _generate_padata_copyz@RawKerberosTest._test_as_exchange.<locals>._generate_padata_copy~  s     8##r]   r  r  r  r  r  r  r	  r
  r  r  r  r  r  r  r  r  r  r  r  r  r  r9  r  r0  r  r  r  r   r  r!  rj  )rY  r  r[  r;  r<  r   r   )rF  r  r#  rw  rg  r  ))rP   rY  r  r[  r3  r  r  r  r  r  r  r  r   r  r9  r<  r  r  r	  r
  r  r  r  r  r  r  r  r0  r  r  r  r   r  r!  rj  rk  r  r  r  r  r_  s)                `                           r[   _test_as_exchangez!RawKerberosTest._test_as_exchangeZ  s=   H	$ 	$ 	$ 	$ 	$
 # 	 !N5LL!9NL!6!%1D1   +O)> ,O *>	
 #8"7 ,O 0/ 0/ & '@&? #8"7  21 *> & "&!?!?  !4 3!" .-#$ (-%& *>'( .-)* $+, K(((-. $/0 $12 "z34 .-56 *F)E78 "6!59: &;< $=> G?B (():/4/4/4374>06 ) 8 8 %%%r]   r   )TF)NFTF)NFTFN)FT)NTNNr  )r   NN)NNN)NNNF)F)NNNNN)T)TNN)NNTNN)NNNN)NNNT)NNNNNNNNNNNN)r   )TTN)NNNNNNNNNNNNNTNNNNTF)r   r   r   __doc__r   ri  r	   r  r  r  r  r  r   r   r   r   r   rp  rf  r  ro  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r	  r  r  r  r  r  r#  r'  r3  r8  r=  r:  rH  rS  r`  rb  re  r  rk  rn  rp  rs  rv  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-  r1  rD  rI  rO  rT  r^  rr  r{  r  r  r  r  r  r  r   r#  r(  rF  r3  rw  ra  r  r1  r5  r  r  r  r2  r  r4  r  r  r[  rc  r3  r$  r
  rI  r`  rL  rb  rN  r\  rU  r	  rX  r[  r  r  r^  r]  rg  rl  r   r   s   @r[   rc  rc  &  s       ##    d    "7!7!:!8: ++/((==/((==/%u77	N !&(().&6 6 [6>   [( ( ( Y/ Y/ Y/ Y/ [Y/v) ) ) ) )    : : :   "7 7 7 7 &*"'   " 378=487<	G G G GV *./4+/.3*.. . . .b /4*.    27-1    16,0    16,0    05+/    ,049	 	 	 	 '+/4
 
 
 
  
/ / / /F F F F    *    "/ / / /
   (   ,   &   4   : : :6 6 6    &) ) )$ $ $    3 3 3 3# # #
2 2 2

A 
A 
A, , ,! ! !"; ; ;& 4848; ; ; ; ;> > > >   	 	 	  
 
 
/ / / / HL"&/ / / /: : : :6 6 6= = = =!2 !2 !2 !2FF F F
E E E! ! !    	! 	! [	!	 	 	
 
 
	! 	! 	!" " "
" 
" 
"     ( ( (& & &   "  . (,$(!F  F  F  F X !%"&#, , , ,V +/!%"H H H HT  "! ! !f -1*.+/"&#/   BA A A A: 04/3$ $ $ $* #'!#'"&% % % %N# # #J	 	 	" '+&*$()-M: M: M: M:b %)$($((,(,)-%)(,15377;9=XC XC XC XCv *.(,',)-(,/3)-+/+/&*37(,*./304.2*.0415)A,0(,&*.2'+-.)-*.'+.2%)#'#'&*#'%'#'#'%)%)$()-/3&*$('+04*.6:.2%)!&ix! x! x! x!v +/)-(-*.)-04*.,0,0'+48)-+/0415/3+/1526*B-1)-'+/3./*.(,"$($('+/3$(-1&($($(&*&*%)*.04'+%)(,15+/7;/3046:&*"'kz! z! z! z!xS S Sr %*15   <I= I= I=VDG DG DGT ',	g g g gR7- 7- 7-rV V V~ +-   L ##'D D D DL       (  $ $ $$ $ $! ! !	6 	6 	6 "&-1+/U? U? U? U?r (,"&&*$)-2-1&**.W  W  W  W  W z '+	i> i> i> i>V :>)./& /& /& /&b   > > > >
 
 
  - - -- - -" " "E E EA A A9 9 9/ / /
: : :
5 5 5
     0 &*04*.,0,0'+)-+/48&*04&*&*%)+/7;/3'+&*"'E^& ^& ^& ^& ^& ^& ^& ^&r]   rc  )r   )r  r  r@  r  r  r  r  rr  rM  enumr   pyasn1.codec.der.decoderr   r/  pyasn1.codec.der.encoderr   r6  pyasn1.codec.native.decoderr5  pyasn1.codec.native.encoderr0  pyasn1.codec.ber.encoderr   pyasn1.errorr   samba.credentialsr   samba.dcerpcr	   r
   samba.gensecr   	samba.ndrr   r   samba.dcerpc.miscr   r   samba.testsr  r   samba.tests.krb5.rfc4120_pyasn1r  krb5rfc4120_pyasn1rY  "samba.tests.krb5.rfc4120_constantsr   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/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   samba.tests.krb5.kcryptor   r\   encodeValuerx   TicketFlagsValuesr  r  rl   prettyPrintKDCOptionsValuesr0  APOptionsValuesrf  PACOptionFlagsValuesPACOptionFlagsr|   NameTypeValuesNameTypeAuthDataTypeValuesAuthDataTypePADataTypeValues
PADataTypeEncryptionTypeValuesEncryptionTypeChecksumTypeValuesChecksumTypeKerbErrorDataTypeValuesKerbErrorDataTyper~   r   r   r   r   rT  rc  r   r]   r[   <module>r     sb  & 


                     @ @ @ @ @ @ @ @ @ @ @ @ F F F F F F F F F F F F 5 5 5 5 5 5 $ $ $ $ $ $ ) ) ) ) ) ) * * * * * * * * % % % % % % * * * * * * * *       
     ) ) ) ) ) ) 3 3 3 3 3 3 3 3 3 3 3 39 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9t + * * * * * * * * * * *  6  >     > + 
  , + 
  ! & 
  ! * 
  + * 
    & 
    ) 
  * ) 
   & 
   ". 
  / ". 
  $ & 
  $    ( 
  ) $ 
    , 
  - $ 
  " * 
  + $ 
    ". 
  / $ 
  $  , 
  - $ 
  " %1 
  2 $ 
  '5! 5! 5! 5! 5! 5! 5! 5!p$' $' $' $' $', $' $' $'N5 5 5 5 5, 5 5 5> > > > >1 > > >>[+ [+ [+ [+ [++ [+ [+ [+|       ,R>& R>& R>& R>& R>&' R>& R>& R>& R>& R>&r]   