
    Fc:3                       d dl Z d dlZe j                            d d           dej        d<   d dlmZm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Zd dlmZ d d	lmZ d d
lmZ d dlmZmZmZmZ d dlmZmZmZmZmZmZ d dl m!Z!m"Z" d dl#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0 d dl1m2Z2m3Z3m4Z4 d dl5m6Z6 d dl7m8Z8m9Z9 d dlm:Z: d dl;m<Z<m=Z= ej>        Z?ej@        ZAd dlBmCZC d dlDmEc mFc mGZG d dlHmIZImJZJmKZK d dlLmEc mFc mMZN d dlOmPZPmQZQmRZRmSZSmTZTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z]m^Z^m_Z_m`Z`maZa dZbdZc G d deK          ZddS )    Nz
bin/python1PYTHONUNBUFFERED)datetimetimezone)Enum)
namedtuple)
SCOPE_BASE)generate_random_password)system_session)Credentials	SPECIFIEDDONT_USE_KERBEROSMUST_USE_KERBEROS)drsblobsdrsuapimisckrb5pac
krb5ccachesecurity)drs_Replicatedrsuapi_connect)DSDB_SYNTAX_BINARY_DNDS_DOMAIN_FUNCTION_2000DS_DOMAIN_FUNCTION_2008DS_GUID_COMPUTERS_CONTAINER$DS_GUID_DOMAIN_CONTROLLERS_CONTAINERDS_GUID_USERS_CONTAINERUF_WORKSTATION_TRUST_ACCOUNTUF_NO_AUTH_DATA_REQUIREDUF_NORMAL_ACCOUNTUF_NOT_DELEGATEDUF_PARTIAL_SECRETS_ACCOUNTUF_SERVER_TRUST_ACCOUNT)UF_TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION)SEC_CHAN_NULLSEC_CHAN_WKSTASEC_CHAN_BDC)DCJoinContext)ndr_pack
ndr_unpack)net)SamDBdsdb_Dn)delete_force)KerberosCredentialsKerberosTicketCredsRawKerberosTest)AD_IF_RELEVANTAD_WIN2K_PACAES256_CTS_HMAC_SHA1_96ARCFOUR_HMAC_MD5KDC_ERR_PREAUTH_REQUIREDKDC_ERR_TGT_REVOKED
KRB_AS_REPKRB_TGS_REP	KRB_ERRORKU_AS_REP_ENC_PARTKU_ENC_CHALLENGE_CLIENTKU_PA_ENC_TIMESTAMP	KU_TICKETNT_PRINCIPALNT_SRV_INSTPADATA_ENCRYPTED_CHALLENGEPADATA_ENC_TIMESTAMPPADATA_ETYPE_INFO2Fc                       e Zd ZdZ G d de          Ze fd            Ze fd            Z fdZ	d Z
d Zd	 Zd
 Zd Zd Zd ZdFdZej        ddddddddf	dZd Zd Zd Zd ZdGdZd ZdFdZd Z	 	 dHdZ	 	 	 dIdZdGdZd Zddd d!Z d" Z!d# Z"	 	 dJd$Z#	 	 dJd%Z$	 	 dJd&Z%	 	 dKd'Z&	 	 dKd(Z'	 	 dKd)Z(	 	 dKd*Z)	 	 dKd+Z*dLd,Z+d- Z,dMd.Z-dMd/Z.dMd0Z/d1 Z0d2 Z1d3 Z2d4 Z3d5 Z4d6 Z5	 	 	 dNd7Z6	 	 	 	 	 dOd9Z7ddde8dddddddddddddddfd:Z9de8ddddddddf
d;Z: e;d<d=          Z<d> Z=d? Z>d@ Z?dA Z@dB ZAdC ZBdD ZC	 dPdEZD xZES )QKDCBaseTestz Base class for KDC tests.
    c                   ^    e Zd Z e            Z e            Z e            Z e            ZdS )KDCBaseTest.AccountTypeN)__name__
__module____qualname__objectUSERCOMPUTERSERVERRODC     @/usr/lib/python3/dist-packages/samba/tests/krb5/kdc_base_test.pyAccountTyperG   n   s:        vxx688vxxrQ   rS   c                    t                                                       d | _        d | _        d | _        d | _        t          j        d           d| _        d| _	        g | _
        i | _        i | _        d | _        g | _        d S )N   _r   )super
setUpClass_lp_ldb	_rodc_ldb_functional_levelsecrets	token_hexaccount_base
account_idaccountsaccount_cache	tkt_cache	_rodc_ctxldb_cleanups)cls	__class__s    rR   rX   zKDCBaseTest.setUpClasst   s     $
 &/22555 rQ   c                    | j         st          | j                  D ]2}	 | j                             |           # t          j        $ r Y /w xY wt          | j                  D ]}t          | j         |           | j        | j        	                    d           t                                                       d S )NT)force)rZ   reversedre   modifyldbLdbErrorra   r.   rd   cleanup_old_joinrW   tearDownClass)rf   cleanupdnrg   s      rR   ro   zKDCBaseTest.tearDownClass   s    
 8#C$455  HOOG,,,,|   D s|,, + +SXr****=$M***666s   ;AAc                 x    t                                                       t          | _        t          | _        d S N)rW   setUpglobal_asn1_printdo_asn1_printglobal_hexdump
do_hexdump)selfrg   s    rR   rt   zKDCBaseTest.setUp   s'    .(rQ   c                 j    | j         &|                                 t          |           _         | j         S rs   )rY   get_loadparmtypery   s    rR   get_lpzKDCBaseTest.get_lp   s*    8!..00DJJNxrQ   c                     | j         c|                                 }|                                 }t                      }t	          d| j        z  |||          t          |           _         | j         S )N	ldap://%surlsession_infocredentialslp)rZ   get_admin_credsr~   r   r,   dc_hostr|   ry   credsr   sessions       rR   	get_samdbzKDCBaseTest.get_samdb   sk    9((**EB$&&G#dl(B1805')+ + +DJJO
 yrQ   c                     | j         d|                                 }|                                 }t                      }t	          d| j        z  |||d          t          |           _         | j         S )Nr   T)r   r   r   r   am_rodc)r[   r   r~   r   r,   hostr|   r   s       rR   get_rodc_samdbzKDCBaseTest.get_rodc_samdb   so    >!((**EB$&&G#([49-D6=5:,.15	$7 $7 $7DJJ  ~rQ   c                     |                                 }|                    |t          j        dg          }t          j        ||d         d         d                             d                    }|S )NserverReferencebasescopeattrsr   utf8)get_serverNamesearchrl   r	   Dndecode)ry   samdbserverresrq   s        rR   get_server_dnzKDCBaseTest.get_server_dn   sm    %%''ll!$"3!4  6 6 VE3q6"34Q7>>vFFGG	rQ   c           	      "   | j         |                                 }|                                 }|                                 }d}t	          | j        ||||d d           }|                     |           |t          |           _         | j         S )NzDefault-First-Site-Name)r   r   r   sitenetbios_name	targetdirdomain)rd   r   r~   get_new_usernamer(   r   create_rodcr|   )ry   admin_credsr   	rodc_name	site_namerodc_ctxs         rR   get_mock_rodc_ctxzKDCBaseTest.get_mock_rodc_ctx   s    >!..00KB--//I1I$DL+6(**32;/3,02 2 2H X&&&#+DJJ ~rQ   c                     | j         g |j        dt          dg          }	 t          |d         d         d                   }n# t          $ r
 t
          }Y nw xY w|t          |           _         | j         S )N domainFunctionalityr   r   )r\   r   r	   intKeyErrorr   r|   )ry   rl   r   functional_levels       rR   get_domain_functional_levelz'KDCBaseTest.get_domain_functional_level   s    !)#*"#-$9#:< < <C;#&s1v.C'DQ'G#H#H   ; ; ;#:   ; ,<DJJ(%%s   !A AAc                 "   |                                  }|                     |          }t          j        j        h}|t
          k    rH|                    t          j        j                   |                    t          j        j                   |S rs   )	r   r   kcryptoEnctypeRC4r   addAES256AES128)ry   r   r   default_enctypess       rR   get_default_enctypesz KDCBaseTest.get_default_enctypes   sy      ;;EBB $O/0666  !7888  !7888rQ   Nc                     |-|                     |                                t                    }d| d| }t          ||           | j                            |           |dd}|                    |           |S )NCN=,group)rq   objectClass)get_wellknown_dnget_default_basednr   r.   ra   appendr   )ry   r   nameourq   detailss         rR   create_groupzKDCBaseTest.create_group  s    :''(@(@(B(B(?A AB 4" 	UB 	R    "
 
 			'	rQ   r   TFc                 	   |[|| j         j        u rt          }n|| j         j        u rt          }nt
          }|                    |                                |          }d|d|}t          ||           |t          }|| j         j
        u rd}|t          z  }n]d}|	rdz  || j         j        u r|t          z  }t          }n4|| j         j        u r|t          z  }t          }n|                                  t#          dd          }d|z                      d	          }||t'          |          |d
}||                              }|Lt+          |t&                    r|                              }nt-          fd|D                       }||d<   |||d<   |
rd|d<   ||                    |           | j                            |           |                    |           d}|r|                                 }|                                 }t;          j        ||| j                  }|                                 !                                }t#          dd          }d|z                      d	          }	 |"                    ||d           |dz  }n,# tF          $ r}|                     |           Y d}~nd}~ww xY wtI                      }|%                    |                                            |&                    |'                                !                                           |(                    |                                 !                                           |"                    |           |)                               || j         j
        u r|*                    d           n|*                    |           |+                    |           |,                    t[          j.        ||                     |/                    |           |0                    |           | 1                    |           |2                    |tZ          j3        dg          }|d         4                    dd          }|#| 5                    tm          |          |           |7                    |           ||fS )zCreate an account for testing.
           The dn of the created account is added to self.accounts,
           which is used by tearDownClass to clean up the created accounts.
        Nr   r   usercomputer$    z"%s"z	utf-16-le)rq   objectclasssAMAccountNameuserAccountControl
unicodePwdaccountc              3   D   K   | ]}|                                V  dS )r   N)format).0saccount_names     rR   	<genexpr>z-KDCBaseTest.create_account.<locals>.<genexpr>P  s1      HHqAHH\H::HHHHHHrQ   servicePrincipalNameuserPrincipalName0
pwdLastSet   )r   T)newpasswordr   domain_nameforce_samr_18r   msDS-KeyVersionNumberr   r   idx)8rS   rM   r   rN   r   r   r   r   r.   r%   rL   r    r   r&   r#   r'   failr
   encodestrr   
isinstancetupleupdatera   r   r   r   r~   r+   Netr   domain_netbios_nameupperset_password	Exceptionr/   guess	set_realmdomain_dns_name
set_domainset_usernameset_workstationset_secure_channel_typeset_dnrl   r   set_upnset_spncreds_set_enctypesr   r	   getassertEqualr   set_kvno)ry   r   r   account_typespnupnadditional_detailsr   account_control
add_dollarexpired_passwordforce_nt4_hashguidrq   secure_schannel_typeobject_classpasswordutf16pwr   expected_kvnor   r   net_ctxr   er   r   kvnor   s                               @rR   create_accountzKDCBaseTest.create_account  s    :t/8882!1!888;.''(@(@(B(BDIIB44$ 	UB,4+000!L00OO%L $#t/888#??'5$$!1!888#::'3$$		+B33H$,,[99 '*"%o"6"6!# # ?**\*22C?#s## Ijjj66HHHHCHHHHH.1G*+?+.G'( 	($'GL!)NN-...R   		' 	..00KBgk2dlCCCG..006688F/B77H(00==G$$2>1737 % 9 9 9 "   		! $%%DKKMM"""--//55778882244::<<===8$$$<(((4+000!!"%%%%!!$'''%%&:;;;SVE2&&'''cc&&&ll!$"9!:  < < 1vzz1qz99SYY666}%%%r{s   J% %
K/K		Kc                    |                                  }|                     ||          }t          j        t          j                  }t          j                    }t          j        |_        t          j        |          |_        t          j	                    }t          j
        |_        |g|_        d|_        t          j                    }|xj        t          j        z  c_        ||_        ||_        t'          |          S Nr   )r   get_objectSidr   dom_sidSID_BUILTIN_ADMINISTRATORSaceSEC_ADS_CONTROL_ACCESSaccess_masktrusteeaclSECURITY_ACL_REVISION_ADSrevisionacesnum_aces
descriptorr|   SEC_DESC_DACL_PRESENT	owner_siddaclr)   )ry   rq   r   sidr  r  r  security_descs           rR   get_security_descriptorz#KDCBaseTest.get_security_descriptor  s        ++$X%HII	lnn"9&s++|~~ :E	 +--h<<"+!&&&rQ   c                    |j         |j        |j        g|_        |j         |j        |j        g|_        d|j         d|j          |_        d|j         dt          j	         ddt          j
         ddt          j         ddt          j         ddt          j         dg|_        d|j         dt          j         d|_        |                                }d| d}||_        t&          t(          z  t*          z  |_        d|j         |_        t2          j        |_        d|_        t:          j        t:          j        z  t:          j         z  t:          j!        z  t:          j"        z  |_#        |j#        t:          j$        z  |_%        |&                                 |'                                 	 |(                                 d S # tR          $ r* |*                                 |'                                  w xY w)Nz
CN=krbtgt_z
,CN=Users,z<SID=->zCN=RODC Connection (FRS),T)+base_dn	config_dn	schema_dnnc_listfull_nc_listmyname	krbtgt_dndomsidr   DOMAIN_RID_RODC_DENYr  SID_BUILTIN_SERVER_OPERATORSSID_BUILTIN_BACKUP_OPERATORSSID_BUILTIN_ACCOUNT_OPERATORSnever_reveal_sidDOMAIN_RID_RODC_ALLOW
reveal_sid	get_mysid	managedbyr   r$   r"   r   ntds_dnconnection_dnr   SEC_CHAN_RODCsecure_channel_typerO   r   DRSUAPI_DRS_INIT_SYNCDRSUAPI_DRS_PER_SYNCDRSUAPI_DRS_GET_ANCDRSUAPI_DRS_NEVER_SYNCED%DRSUAPI_DRS_SPECIAL_SECRET_PROCESSINGreplica_flagsDRSUAPI_DRS_CRITICAL_ONLYdomain_replica_flagsbuild_nc_listsrn   join_add_objectsr   refresh_ldb_connection)ry   ctxmysidadmin_dns       rR   r   zKDCBaseTest.create_rodc  s   {CM3=AKFHSZHH3;HH U
 U UX5R U U U N(K N N N P(M P P P P(M P P P Q(N Q Q Q	 S
 POOh.LOOO#5### ">"K#L"<#= FEE"&"4$:$9:$89 %=> %J	K
 $'#4w7X#X 	  """"" 	 	 	 &&(((  """	s   ,G 4G6c                    |                                  }|                                 }|                                 d| d}t          j                    }t          j        |d          |_        t          j        |t          j        d          |d<   	 |	                    |           d S # t          j
        $ r5}|j        \  }}|                     |t          j                   |                     d|           |                                 }	t!                      }
|
                    |	           |
                    |	           t'          d t)                      |
|	          }t+          j        |                                          }t1          d| j         d|	|
||          }t+          j        |j                  }|                    |||t8          j        d	
           Y d }~d S d }~ww xY w)N:z:SECRETS_ONLYr   replicateSingleObjectz,rootdse_modify: unknown attribute to change!r   zncacn_ip_tcp:z[seal]T)exoprodc)r   r   get_dsServiceNamerl   Messager   rq   MessageElementFLAG_MOD_REPLACErk   rm   argsr   ERR_UNWILLING_TO_PERFORMassertInr~   r   r   set_machine_accountr,   r   r   GUIDget_ntds_GUIDr   r   invocation_id	replicater   DRSUAPI_EXOP_REPL_SECRET)ry   rq   r   
rodc_samdbrepl_valmsgerrenumestrr   
rodc_credslocal_samdbdestination_dsa_guidreplsource_dsa_invocation_ids                  rR   replicate_account_to_rodcz%KDCBaseTest.replicate_account_to_rodc  s     ((**
--//CC"CCCkmm
B'''*'9 #(% (%#$
"	& c"""""| 	& 	& 	&JD$T3#?@@@MMH      B$JR   **2...D~7G7G,62? ? ?K $(9[-F-F-H-H#I#I  !E!E!E!E!#Z!,.BD DD (,y1D'E'E$NN23/ ' @ $	  & & & & & & & & &5	&s   B+ +G0;D*G++G0c                     |                                  }|                                 }|                     |||j        t	          j        |j                             d S )Nrc  re  )r   r   get_secrets	ntds_guidr   rV  rX  )ry   rq   r   r   s       rR   reveal_account_to_mock_rodcz'KDCBaseTest.reveal_account_to_mock_rodc  sj      ))++!)!3%)Yu/B%C%C	 	 	E 	E 	E 	E 	ErQ   c                    |                                                      |t          j        dg          }|d                             d          }||                     |           d S t          fd|D                       }|r%|                     t          |          |           d S | 	                    t          |          |           d S )NzmsDS-RevealedUsersr   r   c           	   3      K   | ]:}t          t          t          |          t                     j                  V  ;dS ))
syntax_oidN)r   r-   r   rq   )r   r   r   s     rR   r   z-KDCBaseTest.check_revealed.<locals>.<genexpr>  sg       7 7# wuc$ii2G I  I  IIKM M 7 7 7 7 7 7rQ   )
r   r   rl   r	   r   assertFalsesetrT  r   assertNotIn)ry   rq   rodc_dnrevealedr   revealed_usersrevealed_dnsr   s          @rR   check_revealedzKDCBaseTest.check_revealed	  s      ll!$"6!7  9 9 Q$899!X&&&F 7 7 7 7'57 7 7 7 7  	4MM#b''<00000SWWl33333rQ   c                    |                                  }|                                }t          ||                                 || j                  \  }}}	t          j                    }
||
_        ||
_        t          j	                    }||_
        ||
_        t          j                    }d|_        d|_        d|_        ||
_        d |
_        d|
_        d|
_        d|
_        t
          j        |
_        t
          j        t
          j        t
          j        g}t          j                    }d|_        ||_        t;          |          |_        ||
_        d |
_         d|
j!        _"        d |
j!        _#        |$                    |d|
          \  }	}| %                    d|j&                   |j'        j(        j)        }|j'        j(        j*        j+        }| %                    ||j
                   |||fS )N)ipr   r   i"    ),r   host_dns_namer   r~   r   r   DsGetNCChangesRequest8rc  re  DsReplicaObjectIdentifierrq   naming_contextDsReplicaHighWaterMarktmp_highest_usnreserved_usnhighest_usnhighwatermarkuptodateness_vectorr@  max_object_countmax_ndr_sizerZ  extended_op%DRSUAPI_ATTID_supplementalCredentialsDRSUAPI_ATTID_unicodePwdDRSUAPI_ATTID_ntPwdHistoryDsPartialAttributeSetversionattidslen
num_attidspartial_attribute_setpartial_attribute_set_exmapping_ctrnum_mappingsmappingsDsGetNCChangesr   object_countfirst_objectrK   
identifierattribute_ctr
attributes)ry   r   rq   rc  re  r   dns_hostnamebindhandlerV   reqr}  hwmr  r  ctrr  r  s                     rR   ri  zKDCBaseTest.get_secrets  s    **,,**,,+L,0KKMM,7/3|= = =vq
 ,..#7 '?$ :<<+,.."& !!:?246 !( = ? ?()%'-$+.v;;($9!'+$'($#' $$VQ443C,---%,7
%,:E
Z]+++Z++rQ   c                    |                                  }|                     |t          |          t          j        |                                          t          j                              \  }}}|j                                        d         }t          j	        |          }	i }
|D ]}|j
        t          j        k    r|	                    |||           |j        j        dk    r@|j        j        d         j        }t%          t&          j        |          }|j        j        D ]}|j        dk    rt1          j        |j                  }t%          t&          j        |          }|j        j        D ]I}|j        }|t>          j         j!        t>          j         j"        fv r|j#        $                                |
|<   J|j
        t          j%        k    rd|	                    |||           |j        j        dk    r=|j        j        d         j        }|$                                |
t>          j         j&        <   || '                                }| (                    ||
           |
S )Nrh  r   r   zPrimary:Kerberos-Newer-Keys))r   ri  r   r   rV  rW  r   splitr+   r   attidr   r  replicate_decrypt	value_ctr
num_valuesvaluesblobr*   r   supplementalCredentialsBlobsubpackagesr   binasciia2b_hexdatapackage_PrimaryKerberosBlobr  keyskeytyper   r   r   r   valuehexr  r   r   assertCountEqual)ry   r   rq   expected_etypesr   r  r  r  ridr
  r  attrattr_valsplpkgkrb5_new_keys_rawkrb5_new_keyskeyr  pwds                       rR   get_keyszKDCBaseTest.get_keys[  sG   **,,'+'7'7GG!%5+>+>+@+@!A!A%)Y[[	 (8 (2 (2$j* n""$$Q''+&& 	: 	:DzWJJJ))$c:::>,11>038 !E!)+ +7+ 
@ 
@Cx#@@@,4,<SX,F,F)(2$@-)/ )/ $1#4#9 @ @C&)kG&7?+A+2?+A+C  C  C03	W
@ w???))$c:::>,q00./27C03		D,-""7799Oot444rQ   c                 n    |0|                                 D ]\  }}|                    ||           d S d S rs   )itemsset_forced_key)ry   r   r  enctyper  s        rR   creds_set_keyszKDCBaseTest.creds_set_keys  sN     $

 3 3$$Wc2222 3 3rQ   c                    |                                  }|                    |                                t          j        dg          }|d                             dd          }|| j        }|>|                                 }|                    d          }|dk    rt          t          z  }t          |          }|||z  }||| z  }|                    |           |                    |           |                    |           d S )NmsDS-SupportedEncryptionTypesr   r   r   r   z%kdc default domain supported enctypes)r   r   get_dnrl   r	   r   default_etypesr~   rc4_bitaes256_sk_bitr   set_as_supported_enctypesset_tgs_supported_enctypesset_ap_supported_enctypes)ry   r   
extra_bitsremove_bitsr   r   supported_enctypesr   s           rR   r   zKDCBaseTest.creds_set_enctypes  s$      ll5<<>>!$"A!B  D D !VZZ(GQZOO%!%!4%B!#(O!P!P!Q&&%,}%<" !344!*," ;,.''(:;;;(();<<<''(:;;;;;rQ   c                 :   |                                  }t          j        |          }|r|t          j        z  }|r|t          j        z  }|r|t          j        z  }|                    |           |                    |           |	                    |           d S rs   )
r   r/   etypes_to_bitsr   KERB_ENCTYPE_FAST_SUPPORTEDKERB_ENCTYPE_CLAIMS_SUPPORTED(KERB_ENCTYPE_COMPOUND_IDENTITY_SUPPORTEDr  r  r  )ry   r   fast_supportclaims_supportcompound_id_supportr   r  s          rR   creds_set_default_enctypesz&KDCBaseTest.creds_set_default_enctypes  s      44660?   	G("FF 	I("HH 	CAC 	''(:;;;(();<<<''(:;;;;;rQ   c                    |                                  }	 |                    |t          j        |g          }nL# t          j        $ r:}|j        \  }}	|t          j        k    r |                     |           Y d }~nd }~ww xY w|d         }
|
                    |          }|r| 	                    |           n|d}t          |          }|                    |           t          j                    }||_        t          j        |t          j        |          ||<   |                    ||
          }| j                            |           |                    |           |S )Nr   r   rP   )r   r   rl   r	   rm   rR  ERR_NO_SUCH_OBJECTr   r   assertIsNotNonelistr   rO  rq   rP  rQ  msg_diffre   rk   )ry   
account_dngroup_dn
group_attrexpect_attrr   r   r^  numrV   orig_msgmembersr]  rp   s                 rR   add_to_groupzKDCBaseTest.add_to_group  sl     		,,H%(^&0\  3 3CC | 	 	 	XFCc,,,IIcNNNNNNNN	 q6,,z** 	  ))))_Gw--z"""kmm,W-0-A-79 9J ..h//  )))Ss   #: B	0A>>Bc                 x   |                                  }|                    |t          j        dg          }|d         }|                     d|           t          |d                   }t          |                              d          }|                     ||           |                    |           t          j	                    }||_
        t          j        |t          j        d          |d<   |                    ||          }| j                            |           |                    |           |S )Nmemberr   r   zutf-8)r   r   rl   r	   rT  r  r   r   removerO  rq   rP  rQ  r  re   r   rk   )	ry   r  r  r   r   r  r  r]  rp   s	            rR   remove_from_groupzKDCBaseTest.remove_from_group  s     ll!$"*  - - q6h)))x)**__++G44
j'***z"""kmm*7+.+?+35 5H ..h//  )))SrQ   )opts	use_cachec          
      l   |i }i dd dd dddd dd dd dd	d
d	dd	dd	dd	dd	dd	dd	dd dd	dd d d	d	d dd d d	d}d|i||}t          t          |                                                    }|r| j                            |          }||S  | j        di |}|r
|| j        |<   |S )Nname_prefixname_suffixr  Tr   r   r   allowed_replicationFallowed_replication_mockdenied_replicationdenied_replication_mockrevealed_to_rodcrevealed_to_mock_rodcno_auth_data_requiredr  r  not_delegateddelegation_to_spn)delegation_from_dntrusted_to_auth_for_delegationr  	member_ofkerberos_enabledr:  idr  r   rP   )r   sortedr  rb   r   create_account_opts)ry   r   r  r  opts_defaultaccount_opts	cache_keyr   s           rR   get_cached_credszKDCBaseTest.get_cached_creds  s    <D
4
4
 $
 4	

 4
 !$
 "5
 '
 !%
 &u
 
 $U
 $U
 
 !$
  U!
"  #
$ #'.3! $#'#3
 
 
: L

 
 &!3!3!5!56677	 	&**955E ((88<88 	2,1Dy)rQ   c                   || j         j        u rU|                     |           |                     |           |                     |           |                     |           n|                     |           |                                 }|                                 }|||z   }|||z  }d}|r
|t          z  }|r
|t          z  }|r
|t          z  }|rd |D             }ni }|}|r|pd}|t          j
        z  }|t          |          |d<   |r||d<   |r|                     |          } | |d<   ||| j         j        urd|z   }|                     ||||||||||
  
        \  }!}"d }#|rt          j        j        h}#|                     ||"|#          }$|                     |!|$           |s|r|                                 }%|                     |%          }&|                     |"|&d	          }'|r|                     |"           |s|                    |'           |                     |"|&|
           |
r@|                                 }%|                     |%          }&|                     |"|&d           |	s|r|                                 }(t5          j        ||(j                  })|                     |"|)d	          }*|r|                     |"           |	s|                    |*           |                     |"|)|
           |rE|                                 }(t5          j        ||(j                  })|                     |"|)d           |1|D ].}+|                     |"t5          j        ||+          dd           /|r|!                    t>                     n|!                    t@                     ||!!                    |           |!S )Nr   c                     i | ]\  }}||	S rP   rP   )r   kvs      rR   
<dictcomp>z3KDCBaseTest.create_account_opts.<locals>.<dictcomp>k  s    ;;;1q!;;;rQ   r  zmsDS-AllowedToDelegateToz(msDS-AllowedToActOnBehalfOfOtherIdentityzhost/)r   r   r   r   r   r  r  r  )r  zmsDS-RevealOnDemandGroup)rs  zmsDS-NeverRevealGroupr  F)r  )"rS   rL   assertIsNonero  r   r   r$   r!   r   r/   fast_supported_bitsr   r"  r  r   r   r   r  r  r   r   r  rf  rk   rv  r   rl   r   acct_dnrk  set_kerberos_stater   r   r   ),ry   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   	user_nameuser_account_controlr   enctypessecurity_descriptorr   rq   r  r  r[  rr  allowed_cleanupr   mock_rodc_dnallowed_mock_cleanupr  s,                                               rR   r  zKDCBaseTest.create_account_opts7  s   6 4+000c"""/0000111;<<<<]+++  ))++	"#i/I"$I ) 	N $MM  	5 $44   	= $<<  	;;(:;;;GGG% 	@}1H+??H7:8}}G34 	D2CG./ 	%"&">">"#$ #$ $ >? ;<t/?/DDDI%C''y5A,/,/;B8L3=7E9I ( K K	r  	4&23O}}UB}HHE4(((  	;"2 	;,,..J((44G #//G*, ,O   3..r222& . _--- ')9   ; ; ;  	D,,..J((44G b'+BCCC $ 	@'< 	@ --//H6%)9::L#'#4#4L*$, $,  % 5 00444+ 3 1222 ,)>   @ @ @ # 	I--//H6%)9::Lb,0GHHH % 5 5!!"cfUH&=&=x.3 " 5 5 5 5  	8$$%67777$$%6777*))*=>>>rQ   c                 x    | j         t          | j                  z   }t          |           xj        dz  c_        |S r  )r_   r   r`   r|   )ry   r  s     rR   r   zKDCBaseTest.get_new_username  s9    %DO(<(<<	T

"rQ   c                 D      fd}                      d|||          }|S )Nc                  D                           j        j                  S )N)r   )r  rS   rL   r}   s   rR   create_client_accountz;KDCBaseTest.get_client_creds.<locals>.create_client_account  s     ((d6F6K(LLLrQ   CLIENTprefixallow_missing_passwordallow_missing_keysfallback_creds_fn_get_krb5_creds)ry   r  r  r  cs   `    rR   get_client_credszKDCBaseTest.get_client_creds  sQ    	M 	M 	M 	M 	M   8N4F3H ! J J rQ   c                 D      fd}                      d|||          }|S )Nc                  z                           j        j        dt          j        t          j        z  d          S )NT)r  r  r   r  r  rS   rM   r   KERB_ENCTYPE_RC4_HMAC_MD5'KERB_ENCTYPE_AES256_CTS_HMAC_SHA1_96_SKr}   s   rR   create_mach_accountz7KDCBaseTest.get_mach_creds.<locals>.create_mach_account  sH    ((!-6$( : HI  )   rQ   MACr  r  )ry   r  r  r(  r   s   `    rR   get_mach_credszKDCBaseTest.get_mach_creds  sL    		 		 		 		 		   8N4F3F ! H H rQ   c                 D      fd}                      d|||          }|S )Nc                  |                           j        j        ddt          j        t          j        z  d          S )NT)r  r  r  r$  r%  r}   s   rR   create_service_accountz=KDCBaseTest.get_service_creds.<locals>.create_service_account  sK    ((!-66:$( : HI	  ) 	 	 	rQ   SERVICEr  r  )ry   r  r  r-  r   s   `    rR   get_service_credszKDCBaseTest.get_service_creds
  sL    
	 
	 
	 
	 
	   	8N4F3I ! K K rQ   c                 v     |r                      |            fd}                     dd| ||          }|S )Nc                                                      }                                 }                    |          }|                     |t          j        dg          }|d         d         d         }|                     |t          j        g d          }|d         j        }t          |d         d                   }t                      }|	                    
                    dd                     |                    
                    dd                     |                    |           t          |d         d	         d                   }t          |d         d
         d                   }|dz  |z  }	|                    |	           |                    |                               | |          }
                    ||
                               |j        j        j                   |S )NzmsDS-KrbTgtLinkr  r   )r   r   msDS-SecondaryKrbTgtNumberr   DOMAINRODC_KRBTGTREALMr   r2     r  r  r  )r   r   r   r   rl   r	   rq   r   r/   r   env_get_varr   r   r   r   r   r  r  r  kdc_fast_supportkdc_claims_supportkdc_compound_id_support)r   r[  rr  r   r,  usernamer   r  krbtgt_number	rodc_kvnor  ry   s              rR   download_rodc_krbtgt_credszEKDCBaseTest.get_rodc_krbtgt_creds.<locals>.download_rodc_krbtgt_creds%  s   NN$$E,,..J((44G,,w%(^&7%8  : :C A01!4I,,y%(^&D &D &D  E EC
 A	I3q6"2344H'))ET--hFFGGGOOD,,WmDDEEEx(((s1v56q9::DA'C DQ GHHM%+d2INN9%%%LL###==	22Dt,,,
 ++!2#6$($@	 , B B B LrQ   r4  Tr  r  r  require_strongest_keyr  
assertTruer  )ry   require_keysrA  r?  r   s   `    rR   get_rodc_krbtgt_credsz!KDCBaseTest.get_rodc_krbtgt_creds  so     ! 	*OOL)))+	 +	 +	 +	 +	Z   8<8D4D7L3M	 ! O O
 rQ   c                 v     |r                      |            fd}                     dd| ||          }|S )Nc                                                      }                                 }|j        }|                     t	          j        | |          t          j        ddg          }|d         j        }t          |j	                  }t                      }|                                        dd                     |                                        dd                     |                    |           t          |d         d         d                   }t          |d         d         d                   }|dz  |z  }	|                    |	           |                    |                               | |          }
                    ||
           t(          j        t(          j        z  }t(          j        t(          j        z  }                    |||	           |S )
Nr   r2  r   r   r3  r4  r5  r6  r  r  )r   r   new_krbtgt_dnr   rl   r   r	   rq   r   krbtgt_namer/   r   r8  r   r   r   r   r   r  r  r   $KERB_ENCTYPE_AES128_CTS_HMAC_SHA1_96$KERB_ENCTYPE_AES256_CTS_HMAC_SHA1_96r'  r&  r   )r   r   r,  r   rq   r<  r   r  r=  r>  r  r  r  ry   s                rR   create_rodc_krbtgt_accountzJKDCBaseTest.get_mock_rodc_krbtgt_creds.<locals>.create_rodc_krbtgt_account_  s   NN$$E--//H .I,,CF5)$<$<%(^&=&B&D  E EC QB8/00H'))ET--hFFGGGOOD,,WmDDEEEx(((s1v56q9::DA'C DQ GHHM%+d2INN9%%%LL==++Dt,,,"G"GHJ#K#=>K##E/90; $ = = = LrQ   MOCK_RODC_KRBTGTTr@  rB  )ry   rD  rA  rM  r   s   `    rR   get_mock_rodc_krbtgt_credsz&KDCBaseTest.get_mock_rodc_krbtgt_credsY  sp     ! 	*OOL)))%	 %	 %	 %	 %	N   (:8<8D4D7L3M	 ! O O
 rQ   c                 x     |r                      |            fd}                     ddd| ||          }|S )Nc                  @   	                                 } t          j        }d|                                 |fz  }|                     d|z  t
          j        ddg          }|d         j        }t          |d         d                   }t                      }|
                    	                    dd                     |                    	                    d	d                     |                    |           t          |d         d         d                   }|                    |           |                    |           	                    | |          }	                    ||           	                    |	j        	j        	j        
           |S )N%s-%d<SID=%s>r   r   r   r   r3  KRBTGTr5  r7  )r   r   DOMAIN_RID_KRBTGTget_domain_sidr   rl   r	   rq   r   r/   r   r8  r   r   r   r   r   r  r  r  r9  r:  r;  )
r   
krbtgt_rid
krbtgt_sidr   rq   r<  r   r  r  ry   s
            rR   download_krbtgt_credsz;KDCBaseTest.get_krbtgt_creds.<locals>.download_krbtgt_creds  s   NN$$E!3J E$8$8$:$:J#GGJ,,J$;%(^&6&=&?  @ @C QB3q6"2344H'))ET--hAABBBOOD,,Wh??@@@x(((s1v56q9::DNN4   LL==++Dt,,,
 ++!2#6$($@	 , B B B LrQ   rT  krbtgtT)r  default_usernamer  r  rA  r  rB  )ry   rD  rA  rY  r   s   `    rR   get_krbtgt_credszKDCBaseTest.get_krbtgt_creds  sr     ! 	*OOL)))"	 "	 "	 "	 "	H   2:8<8D4D7L3H ! J J rQ   c                 v     |r                      |            fd}                     dd| ||          }|S )Nc                                                      } d}d|                                 |fz  }|                     d|z  t          j        ddg          }|d         j        }t          |d         d                   }t                      }|                    	                    dd	                     |
                    	                    d
d	                     |                    |           t          |d         d         d                   }|                    |           |                    |d d                    |                    |                               | |          }                    ||           t$          j        t$          j        z  }	t$          j        }
                    ||	|
           |S )Ni  rR  rS  r   r   r   r   r3  DCr5  rH  )r   rV  r   rl   r	   rq   r   r/   r   r8  r   r   r   r   r   r   r  r  r   rK  rL  r'  r   )r   dc_riddc_sidr   rq   r<  r   r  r  r  r  ry   s              rR   download_dc_credsz3KDCBaseTest.get_dc_creds.<locals>.download_dc_creds  s   NN$$EF 4 4 6 6??F,,J$7%(^&6&=&?  @ @C QB3q6"2344H'))ET--h==>>>OOD,,Wd;;<<<x(((s1v56q9::DNN4   !!(3B3-000LL==++Dt,,,"G"GHJ"JK##E/90; $ = = = LrQ   r_  Tr@  rB  )ry   rD  rA  rc  r   s   `    rR   get_dc_credszKDCBaseTest.get_dc_creds  so     ! 	*OOL)))!	 !	 !	 !	 !	F   8<8D4D7L3D	 ! F F
 rQ   c                 v     |r                      |            fd}                     dd| ||          }|S )Nc                     	                                 } |                     |                                 d	j         d	j         dt          j        ddg          }	                    dt          |                     |d         j        }t          |d         d                   }t                      }|                    	                    d	d
                     |                    	                    dd
                     |                    |           t          |d         d         d                   }|                    |           |                    |           	                    | |          }	                    ||           t(          j        t(          j        z  }t(          j        }	                    |||           |S )Nz(|(sAMAccountName=z*)(dNSHostName=z))r   r   )r   
expressionr   r   r   r   r3  rN   r5  rH  )r   r   r   r   rl   SCOPE_SUBTREEr   r  rq   r   r/   r   r8  r   r   r   r   r   r  r  r   rK  rL  r'  r   )
r   r   rq   r<  r   r  r  r  r  ry   s
            rR   download_server_credsz;KDCBaseTest.get_server_creds.<locals>.download_server_creds  s   NN$$E,,E$<$<$>$>,I	 ,I ,I;?9,I ,I ,I%(%6&6&=&?	  @ @C QC)))QB3q6"2344H'))ET--hAABBBOOD,,Wh??@@@x(((s1v56q9::DNN4   LL==++Dt,,,"G"GHJ"JK##E/90; $ = = = LrQ   rN   Tr@  rB  )ry   rD  rA  ri  r   s   `    rR   get_server_credszKDCBaseTest.get_server_creds  so     ! 	*OOL))) 	  	  	  	  	D   8<8D4D7L3H	 ! J J
 rQ   c                     |                      d          }|                     |t          |          |||d|dd|dd          }|                     |          }	|	S )z?Send a Kerberos AS_REQ, returns the undecoded response
        頌  offsetNi)padatakdc_optionscnamerealmsname	from_time	till_time
renew_timenonceetypes	addressesadditional_tickets)get_KerberosTimeAS_REQ_creater   send_recv_transaction)
ry   rq  rs  rr  rx  ro  rp  tillr  reps
             rR   as_reqzKDCBaseTest.as_req  sy     $$E$22  -0-=-=',',',+/+/,0'1(.+/48 ! : : ((--
rQ   c                 z   |                      |d         t          j                              }|D ]}|d         t          k    r
|d         } n|                     d           |                      |t          j                              }|                     ||d         |                                          }|S )z/Extract the session key from an AS-REP
        ze-dataasn1Speczpadata-typezpadata-valuezexpected to find ETYPE-INFO2r   )
der_decode	krb5_asn1METHOD_DATArC   r   ETYPE_INFO2PasswordKey_from_etype_info2get_kvno)ry   r   r  
rep_padatapapadata_valueetype_info2r  s           rR   get_as_rep_keyzKDCBaseTest.get_as_rep_key3  s     __M*,, % . .
  	6 	6B- $666!.1 7 II4555oo9#8#:#: & < < //{1~050@0@B B
rQ   c                 \    |                      ||          }|                     ||          S )z8generate the pa_data data element for an AS-REQ
        )skew)r  "get_enc_timestamp_pa_data_from_key)ry   r   r  r  r  s        rR   get_enc_timestamp_pa_dataz%KDCBaseTest.get_enc_timestamp_pa_dataH  s2     !!%--66s6FFFrQ   c                 r   |                      |          \  }}|                     ||          }|                     |t          j                              }|                     |t          |          }|                     |t          j                              }|                     t          |          }|S Nrm  r  )
get_KerberosTimeWithUsecPA_ENC_TS_ENC_create
der_encoder  PA_ENC_TS_ENCEncryptedData_creater=   EncryptedDataPA_DATA_createrB   )ry   r  r  patimepausecro  s         rR   r  z.KDCBaseTest.get_enc_timestamp_pa_data_from_keyP  s    888EE**66::)2I2K2KLL**30CVLL)2I2K2KLL$$%96BBrQ   c                 r   |                      |          \  }}|                     ||          }|                     |t          j                              }|                     |t          |          }|                     |t          j                              }|                     t          |          }|S r  )
r  r  r  r  r  r  r<   r  r  rA   )ry   client_challenge_keyr  r  r  ro  s         rR   get_challenge_pa_dataz!KDCBaseTest.get_challenge_pa_data\  s    66d6CC**66::*3*A*C*C ! E E **+?+B+13 3 *3*A*C*C ! E E $$%?%+- - rQ   c                    |                     t          |d         d                   }	 |                     |t          j                              }n8# t
          $ r+ |                     |t          j                              }Y nw xY w|S )z< Decrypt and Decode the encrypted data in an AS-REP
        enc-partcipherr  )decryptr;   r  r  EncASRepPartr   EncTGSRepPart)ry   r  r  enc_parts       rR   get_as_rep_enc_datazKDCBaseTest.get_as_rep_enc_datam  s     ;;13z?83LMM	>9#9#;#; ' = =HH 	> 	> 	>9#:#<#< ' > >HHH	> s   (A 2BBc                 <    |                      |t                     dS )zE Check that the kdc response was pre-authentication required
        N)check_error_repr6   ry   r  s     rR   check_pre_authenticationz$KDCBaseTest.check_pre_authentication|  s!     	S":;;;;;rQ   c                 >    |                      |t                     dS )z Check that the kdc response is an AS-REP and that the
            values for:
                msg-type
                pvno
                tkt-pvno
                kvno
            match the expected values
        msg_typeN)check_replyr8   r  s     rR   check_as_replyzKDCBaseTest.check_as_reply  s#     	z22222rQ   c                 >    |                      |t                     dS )z Check that the kdc response is an TGS-REP and that the
            values for:
                msg-type
                pvno
                tkt-pvno
                kvno
            match the expected values
        r  N)r  r9   r  s     rR   check_tgs_replyzKDCBaseTest.check_tgs_reply  s#     	{33333rQ   c                    |                      |           |                     |d         |d|z             t          |d                   }|                     d|d|z             t          |d         d                   }|                     d|d|z             d|d         v r:t          |d         d                   }|                     d	|d
z  d|z             d S d S )Nmsg-type
rep = {%s}pvno   ticketztkt-vnor  r  r   l      )r  r   r   )ry   r  r  r  tkt_vnor  s         rR   r  zKDCBaseTest.check_reply  s     	S!!!Z(L34FGGG 3v;D,"4555 c(mI.//G\C%7888
 S_$$s:v.//DQz 1<#3EFFFFF %$rQ   c                 <   |                      |           |                     |d         t          d|z             t          |t          j        j                  r"|                     |d         |d|z             dS |                     |d         |d|z             dS )zg Check that the reply is an error message, with the expected
            error-code specified.
        r  r  z
error-codeN)r  r   r:   r   collectionsabc	ContainerrT  )ry   r  expecteds      rR   r  zKDCBaseTest.check_error_rep  s     	S!!!Z)\C5GHHHh 9:: 	NMM#l+X|c7IJJJJJS.,:LMMMMMrQ   c                    |                      |j                  }|                                 \  }}t          ||||          }||                     |          }|j        }nd}d}|s
d}| j        }n	| j        }d}fd}|                     ||||||||||| j	        ||nd||t          |	          |||
          }|                     |d|||          }|rd}n|d         }|j        }||fS )z_Send a TGS-REQ, returns the response and the decrypted and
           decoded enc-part
        )crealmrq  Nc                     |fS rs   rP   )_kdc_exchange_dict_callback_dictreq_bodyro  s      rR   generate_padataz,KDCBaseTest.tgs_req.<locals>.generate_padata  s     8##rQ   )expected_crealmexpected_cnameexpected_srealmexpected_snameexpected_error_modeexpected_flagsunexpected_flagsexpected_supported_etypescheck_error_fncheck_rep_fncheck_kdc_private_fnticket_decryption_keygenerate_padata_fntgtauthenticator_subkeyrp  expect_edata
expect_pacto_rodcrq  rr  rs  rx  rep_ticket_creds)	RandomKeyetyper  r0   TicketDecryptionKey_from_credstgs_supported_enctypesgeneric_check_kdc_repgeneric_check_kdc_errortgs_exchange_dictgeneric_check_kdc_privater   _generic_kdc_exchangeencpart_private)ry   rq  rs  rr  r  r  rx  r  ro  rp  r  service_credsr  r  r  r  subkeyctimecusecr  decryption_keyr  r  r  r  kdc_exchange_dictr  r  ticket_credss           `                    rR   tgs_reqzKDCBaseTest.tgs_req  s    	**6688!&"%).(-/ / /
 $!@@ N(5(L%%!N(,%" 	 !N5LL!9NL	$ 	$ 	$ 	$ 	$ !22! !  3)-&?)%!%!?"0282D$!'K((%!' 3  * (():/3/4/406	 ) 8 8  	4HH,-?@L#3HH}rQ   r   c                 f   |j         d         d         }|j        }||                                d d         }||||||t          |	          t          |
          ||t          |          |f}|s| j                            |          }||S t          t          f}|d}t          t          j	        |                    }| 
                    t          ||g          }|                                }|                     t          j        j                  }|                     |          }|                     |j        |j         |||j        |	|
|| j        | j        |||||||          }|                     |d ||||          }|                     |           |d         }|r|                                 }n|                                 }|                     |          }|                     |          }| j        o| }| j        o| }|                     ||d	|||
           || j        |<   |S )Nname-stringr   r`  r   	name_typenames)r  r  r  r  r  r  r  r  r  r  r  r  rp  pac_requestr  rc4_supportr  )rq  rr  rs  ru  rx  r  T)service_ticketr  expect_ticket_checksumexpect_full_checksum)rq  rs  get_usernamer   rc   r   r4   r5   r  
KDCOptionsPrincipalName_creater?   	get_realmr  r   r   r   r  r  r  r  r  r  r  r  rE  r\  is_tgs_principaltkt_sig_supportfull_sig_supportverify_ticket)ry   r  target_credsservicetarget_namer~  r  r  rp  r  r  r  r  freshr  ticket_snamer  r  r  rs  srealmr  r  r  r  service_ticket_credskrbtgt_creds
krbtgt_keyis_tgs_princr  r  s                                  rR   get_service_ticketzKDCBaseTest.get_service_ticket  s   
 Im,Q/	y&3355crc:KWg{ #n"5"5s;K7L7L;&&	!	  	^''	22F!(*:;K).{;;<<))L18+0F * H H''))#~~go.DEE<<\JJ 22J9" &2&I)-"03!%!?!5##!## 3  & (():/3/5/43705 ) 7 7 	S!!!01CD 	35577LL0022L88FF
,,U33"&"6 #7*6&6 	 $ 5 !5(4$4 	/*.:2H0D 	 	F 	F 	F
 %9y!##rQ   c                 j   ||}n|                                 }|||||t          |          t          |          ||	|t          |          t          |          t          |
          |||||f}|s| j                            |          }||S ||                                }|                                }t          t          f}|                     ||	                    d                    }|O|                     t          d|g          }|                     t          d|                                g          }n|}|
|}
|                     d          }|r|                                 }n|                                 }|                     |          }|j        }|d}t#          j        |          }d}  | j        d)i d|d	|d
|d|d|dt(          d|d|
d|d|d|d|	d|d|d|d|d|d|dd d|dd d|d|d| d |d!|d"|d#|d$|d%|\  }!}"|                     |!           |"d&         }#|                     ||#d'         |                                          }$|                     |$          }%|%g}&|                                }' | j        d)i d|d	|d
|d|d|dd'd|'d|
d|'d|d|d|	d|d|d|d|d|d|d|&d|d|$d|d|d| d |d!|d"|d#|d$|d%|\  }!}"|                     |!           |"d(         }(|(| j        |<   |(S )*N/r  rZ  rl  rm  z/forwardable,renewable,canonicalize,renewable-okr   rq  rr  rs  r~  client_as_etypesr  r  r  r  r  expected_account_nameexpected_upn_nameexpected_sidexpected_saltr  r  r  rx  ro  rp  preauth_keyr  r  pac_optionsr  expect_pac_attrsexpect_pac_attrs_pac_requestexpect_requester_sidr  r  preauth_etype_info2r   r  rP   )r  r   rc   r   r  get_saltr4   r5   r  r  r@   r   r{  rE  r\  r  r  r  r  _test_as_exchanger6   r  r  r  r  r  ))ry   r   r  rp  client_accountclient_name_typer  r  r  r  r  r  rs  rr  r  r  r  r  r  r  r  r  r  r  saltr  rq  r  r~  r  r  r  r  r  r  r  r  ts_enc_padataro  expected_realmr  s)                                            rR   get_tgtzKDCBaseTest.get_tgtU  s    %&II**,,Ik%((#.>*?*?*,=|ZZU(( !113GI	  	.$$Y//C
=OO%%E~~(*:;))4D090D0D * F F=--5=u4E . G GE!66%h-F 7 H HNN #N!"N$$E$22 	35577LL0022L//== 	 '=*K  *;77!7!7 " " "%"%" %" 	"
 #U" !9 8" "E" *>" "E" !5" #8"7" 0/" &" $" *>"  .-!"" '6o#"$ 5%"& 4'"( $)"* +", #8"7-". $/"0 $1"2 "z3"4 .-5"6 *F)E7"8 "6!59": $;"< G="> 	%%c***'(=>778CA8=8H8HJ J ??LL!7!7 " " "%"%" %" 	"
 #U" !"" +N" *>" +N" *>" #8"7" 0/" &" $" *>"  .-!"" '6o#"$ 5%"& 6'"( $)"* $+", #8"7-". $/"0 $1"2 "z3"4 .-5"6 *F)E7"8 "6!59": $;"< G="> 	C   ();<$0y!rQ   c                 V   ||                                 }|                     ||                    d                    }|                                 }|                     t          |g          }|                                }|}|
|}
|}|}|j        }t          t          f}|d}t          t          j
        |                    }|                     |          }|                     t          j        j                  }|	r|	}|du rt           }| j        }d }nd}d }| j        }|                     ||
|||||||||| j        ||||||d          }|                     |||||          }|	r|                     ||           d S |                     |t0                     |d	         S )
Nr  r  canonicalizeTr   F)r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rp  r  r  r  r  r  )r  r  r  r?   r  r  r4   r5   r   r  r  r  r  r   r   r   r7   r  r  r  r  r  r  r  r9   )ry   client_credsr  r  r  r  rp  r  r  expect_errorr  r  r  r  rq  service_accountrs  rr  r  r  r  r  rx  target_decryption_keyr  r  r  r  r  r  s                                 rR   _make_tgs_requestzKDCBaseTest._make_tgs_request  s#    !)6688N))4D0>0D0DS0I0I * K K (4466))L1@0A * C C ''))!"N$1$H!)+;<(K).{;;<< $ C C! !  $~~go.DEE 		6"."d**&9#!9NLL"#!N5L 22+)+)"7/%&?"7)%!%!? 3!5##!' 3    * (():/4/4/406	 ) 8 8
  	9  &9:::4S+...$%788rQ   PacDataz3account_name account_sid logon_name upn domain_namec                    d}d}d}d}d}d |D             }|D ]@}|                      |d         t          j                              }	d |	D             D ]}
t          t          j        |
d                   }|j        D ]}|j        t          j        k    rp|j	        j	        j
        j        j        }t          |j	        j	        j
        j        j                  dz   t          |j	        j	        j
        j        j                  z   }|j        t          j        k    r|j	        j        }|j        t          j        k    r|j	        j        }|j	        j        }אB|                     |||||          S )zKDecode the PAC element contained in the authorization-data element
        Nc              3   <   K   | ]}|d          t           k    |V  dS zad-typeN)r2   r   xs     rR   r   z+KDCBaseTest.get_pac_data.<locals>.<genexpr>V  s=       #M #MQy\^-K-KA-K-K-K-K#M #MrQ   zad-datar  c              3   <   K   | ]}|d          t           k    |V  dS r)  )r3   r*  s     rR   r   z+KDCBaseTest.get_pac_data.<locals>.<genexpr>\  s0      FFQ9)E)Eq)E)E)E)EFFrQ   r$  )r  r  r2   r*   r   PAC_DATAbuffersr|   PAC_TYPE_LOGON_INFOinfoinfo3r   r   r   
domain_sidr  PAC_TYPE_LOGON_NAMEPAC_TYPE_UPN_DNS_INFOupn_namedns_domain_namer&  )ry   authorization_datar   user_sid
logon_namer   r   ad_if_relevant_elementsdtbufadpbpacs                rR   get_pac_datazKDCBaseTest.get_pac_dataL  s    
#M #M)#M #M #M) 	? 	?B//9	(@(B(B " D DC GF#FFF ? ? 0"Y-@@: ? ?Cx7#>>>HM/4A %   3 8 CDD!"$'(;(@(D$E$EF ! W%@@@%(X%:

W%BBB!h/&)h&>?? ||  	rQ   c                    |                                 }|                    d          r
|dd         }|                                }|d|                                d|                                }|                     |d         d         |                                ||d         d                   }|                    t          |d         d	                   }| 	                    |t          j                    
          }|S )z,Decrypt and decode a service ticket
        r   Nr`  .@r  r  r  r  r  )r  endswithr  lowerr   PasswordKey_createget_passwordr  r>   r  r  EncTicketPart)	ry   r   r  r   rr  r  r  r  enc_ticket_parts	            rR   decode_service_ticketz!KDCBaseTest.decode_service_ticketr  s     !!##== 	9D!!!TT5;;====%++---@%%:w'  :v&	( ( ;;y&*<X*FGG//y688 * : :rQ   c                 l   |                      |t                     t          j        |          }t	          t          |                    dz
  }|d         }|                     |t	          |                     |d |         t          t          |                    z   ||dz   d          z   }||d<   |S )Nr   flags)	assertIsInstanceboolr  TicketFlagsr  r   assertLessEqualr   r   )ry   r  flagr  posrL  	new_flagss          rR   modify_ticket_flagzKDCBaseTest.modify_ticket_flag  s    eT***$T**%++"!S#e**---$3$K#c%jj//1E#'((OC	%rQ   c                    |                     |t          dg          }|                     t          |          dk    d|z             |                    d|d         d         d                   }|                    d          S )zM Get the objectSID for a DN
            Note: performs an Ldb query.
        	objectSIDr  r   zdid not get objectSid for %sr   r   )r   r	   rC  r  schema_format_valuer   )ry   r   rq   r   r   s        rR   r  zKDCBaseTest.get_objectSid  sv     ll2Z}lEECA'E'JKKK''SVK5H5KLLzz&!!!rQ   c                    t          |t                    r|}n|g}t          j        }t          j        ||          }t          j        |          }t          j        |||          ||<   |                    |           d S rs   )r   r  rl   FLAG_MOD_ADDr   rO  rP  rk   	ry   r   dn_strr   r  r  rQ  rq   r]  s	            rR   add_attributezKDCBaseTest.add_attribute  sx    eT"" 	FFWFVE6""k"oo&vtT::D	SrQ   c                    t          |t                    r|}n|g}t          j        }t          j        ||          }t          j        |          }t          j        |||          ||<   |                    |           d S rs   )r   r  rl   rQ  r   rO  rP  rk   rZ  s	            rR   modify_attributezKDCBaseTest.modify_attribute  sx    eT"" 	FFWF#VE6""k"oo&vtT::D	SrQ   c                    t          j                    }d|_        d|_        t          j                    }d|_        ||_        t          j                    }||_        d|_        t          j	                    }||_
        |d         }t          j                    }	|d         |	_        t          |          |	_        |d         |	_        ||	_        |d         }
|
d         }t          j                    }|
d         |_        t          |          |_        |d         |_        ||_        |                     |d                   }|                                }t          j                    }|d	         |_        |d
         |_        t          j                    }d|_        g |_        t          j                    }d|_        g |_        |                     |t5          j                              }|d         }|                    d|          }|d         }t          j                    }|	|_        ||_        ||_         | !                    |          |_"        | !                    |          |_#        | !                    |          |_$        | %                    |j"        dz
  tM          j'        tP          j)                  *                                d           | %                    |j#        dz
  tM          j'        tP          j)                  *                                d           | +                    |j$        dz
  tM          j'        tP          j)                  *                                d           |j$        |_,        d|_-        t]          |d         d          |_/        ||_0        ||_1        ||_2        d|_3        t          j4                    }d|_5        d|_6        ||_7        |	|_8        ||_9        tu          |          }tw          j<        | j=        d          }|>                    |           |?                                 |S )zi Lay out a version 4 on-disk credentials cache, to be read using the
            FILE: protocol.
        r   r   rQ   r  z	name-typerr  rs  r  r  keyvaluer  authtime	starttimeendtimei,  z1Ticket not yet valid - clocks may be out of sync.i  zCTicket already expired/about to expire - clocks may be out of sync.rL     r  rU   F)dirdelete)@r   DELTATIME_TAGkdc_sec_offsetkdc_usec_offsetV4TAGtagfieldV4TAGSfurther_tagsV4HEADERv4tags	PRINCIPALr  r  component_countrr  
componentsEncryptionKey_import
export_objKEYBLOCKr  r  	ADDRESSEScountAUTHDATAr  r  Ticketr   
CREDENTIALclientr   keyblockget_EpochFromKerberosTimera  rb  rc  
assertLessr   nowr   utc	timestampassertGreater
renew_tillis_skeyr   ticket_flagsry  authdatar  second_ticketCCACHEr  r  optional_header	principalcredr)   tempfileNamedTemporaryFiletempdirwriteclose)ry   rq  r  r  rl  v4tagrp  r  cname_string
cprincipalrs  sname_string
sprincipalr  key_datar}  ry  r  ticket_datara  rb  rc  r  ccacheresult	cachefiles                             rR   create_ccachezKDCBaseTest.create_ccache  s   
 (**  ! ""	"$$
!$-//!']+)++
$[1
%(%6%6
"!'?
 ,
w]+)++
$[1
%(%6%6
"!'?
 ,
''88>>##&((#I. ,(**			&(( oofy7G7I7IoJJJ'LLh77	9%$&&   66x@@77	BB55g>> 	. X\22<<>>K	M 	M 	M 	/ X\22<<>>K	M 	M 	M 	4<'1#<55??AA8	9 	9 	9
 , 1155" ! "$$!0% &!! /DLOOO	rQ   c                 z   |                                 }|                                }|                     t          |g          }|                     |          }	|                     |	|||          }
|s|                     |
d          }
|                     ||
j        |
j	                  }t                      }|                    t                     |                    |t                     |                    |           |                    |j        t          |                                            ||fS )Nr  )r   r  T)exclude_pac)r  r  r  r?   r  r	  modified_ticketr  r  r  r   r  r   r   r   r   set_named_ccacher   r~   )ry   user_credentialsmach_credentialsr   r  r?  r  rr  rq  r  r  r  r   s                rR   create_ccache_with_userz#KDCBaseTest.create_ccache_with_user  sA   
 %1133	 **,,))L1: * = = ll+,, ((.>185@ ) B B  	D))&d)CCF &&ufm'-'=? ?	   !23339i000y~y$++--HHH y!!rQ   rs   )T)NN)FFF)FT)TF)Nr   )r   )	r   Nr   FNTNNN)r   NNTFNNNTTF)r   NT)FrH   rI   rJ   __doc__r   rS   classmethodrX   ro   rt   r~   r   r   r   r   r   r   r   rL   r  r"  r   rf  rk  rv  ri  r  r  r   r  r  r  r  r  r   r!  r*  r/  rE  rO  r\  rd  rj  r  r  r  r  r  r  r  r  r  r  r  r  r	  r?   r  r%  r   r&  r@  rJ  rT  r  r\  r^  r  r  __classcell__)rg   s   @rR   rE   rE   j   s            d        [2         [ &) ) ) ) )
          *& & &        , 8C7GTdd(-eq q q qf' ' '0) ) )V/& /& /&bE E E4 4 4 4*;, ;, ;,z. . . .`3 3 3 '+'+< < < <@ 16277<< < < <(" " " "H  8 ##'4 4 4 4 4lk k kZ   16,0
 
 
 
 /4*.   * 27-1   , ,0498 8 8 8v 159>2 2 2 2j '+/40 0 0 0f #'+0. . . .b #'+0- - - -^   *  *G G G G
 
 
 
   "  < < <
	3 	3 	3	4 	4 	4G G G,	N 	N 	N AB>BIMG G G GR =CDH6:AEDI	R$ R$ R$ R$h &+#l#d&*d#!$ T!%D%) Z Z Z Zz *.+7&*&*t',)-04,0'+T9 T9 T9 T9n j=? ?G$ $ $L  *  " " "
 
 

 
 
f f fR GK"" "" "" "" "" "" "" ""rQ   rE   )esysospathinsertenvironr   r   r  r  r  r]   r_  r   r   rl   r	   sambar
   
samba.authr   samba.credentialsr   r   r   r   samba.dcerpcr   r   r   r   r   r   samba.drs_utilsr   r   
samba.dsdbr   r   r   r   r   r   r   r   r    r!   r"   r#   r$   samba.dcerpc.miscr%   r&   r'   
samba.joinr(   	samba.ndrr)   r*   r+   samba.samdbr,   r-   r&  r  r'  r  samba.testsr.   samba.tests.krb5.kcryptotestskrb5r   samba.tests.krb5.raw_testcaser/   r0   r1   samba.tests.krb5.rfc4120_pyasn1rfc4120_pyasn1r  "samba.tests.krb5.rfc4120_constantsr2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   ru   rw   rE   rP   rQ   rR   <module>r     s4  & 


 				 <      !$
  ' ' ' ' ' ' ' '              " " " " " " 



       * * * * * * % % % % % %            P O O O O O O O O O O O O O O O : : : : : : : :                                      
 % $ $ $ $ $ * * * * * * * *       & & & & & & & &

,@ $ $ $ $ $ $ * * * * * * * * * * * *         
 4 3 3 3 3 3 3 3 3 3 3 3                                       *  V" V" V" V" V"/ V" V" V" V" V"rQ   