o
    �)%a´]  ã                   @   s°  d dl Z d dlZd dlmZmZ d dlmZmZmZ d dl	m
Z
 d dlmZmZmZ dd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Z d*d+„ Z!d,d-„ Z"d.d/„ Z#d0d1„ Z$d2d3„ Z%d4d5„ Z&d6d7„ Z'd8d9„ Z(d:d;„ Z)d<d=„ Z*d>d?„ Z+ej,j-d@ej,j.dAej,j/dBej,j0dCej,j1dDej,j2dEej,j3dFej,j4dGiZ5dHdI„ Z6dJdK„ Z7dLdM„ Z8dNdO„ Z9dPdQ„ Z:dRdS„ Z;dTdU„ Z<dVdW„ Z=dXdY„ Z>i ej?e$“ej@e(“ejAe"“ejBe'“ejCe'“ejDe+“ejEe#“ejFe“ejGe%“ejHe%“ejIe9“ejJe9“ejKe“ejLe!“ejMe:“ejNe;“ejOe=“ZPejCe'ejEe#ejGe%ejQeejReejSeejJe9iZTejUe'ejVeejWeiZXejYe>iZZejYe>iZ[dS )Zé    N)ÚutilsÚx509)Ú_CRL_ENTRY_REASON_ENUM_TO_CODEÚ_DISTPOINT_TYPE_FULLNAMEÚ_DISTPOINT_TYPE_RELATIVENAME)Ú	_ASN1Type)ÚCRLEntryExtensionOIDÚExtensionOIDÚOCSPExtensionOIDc                 C   sD   |   |¡}| j || jj¡}| j || jj¡}|  || jjk¡ |S )a  
    Converts a python integer to an ASN1_INTEGER. The returned ASN1_INTEGER
    will not be garbage collected (to support adding them to structs that take
    ownership of the object). Be sure to register it for GC if it will be
    discarded after use.

    )Ú
_int_to_bnÚ_ffiÚgcÚ_libÚBN_freeÚBN_to_ASN1_INTEGERÚNULLÚopenssl_assert©ÚbackendÚxÚi© r   úR/usr/lib/python3/dist-packages/cryptography/hazmat/backends/openssl/encode_asn1.pyÚ_encode_asn1_int   s
   
r   c                 C   ó    t | |ƒ}| j || jj¡}|S ©N)r   r   r   r   ÚASN1_INTEGER_freer   r   r   r   Ú_encode_asn1_int_gc+   ó   
r   c                 C   s0   | j  ¡ }| j  ||t|ƒ¡}|  |dk¡ |S )z@
    Create an ASN1_OCTET_STRING from a Python byte string.
    é   )r   ÚASN1_OCTET_STRING_newÚASN1_OCTET_STRING_setÚlenr   )r   ÚdataÚsÚresr   r   r   Ú_encode_asn1_str1   s   
r&   c                 C   s<   | j  ¡ }| j  || d¡t| d¡ƒ¡}|  |dk¡ |S )z³
    Create an ASN1_UTF8STRING from a Python unicode string.
    This object will be an ASN1_STRING with UTF8 type in OpenSSL and
    can be decoded with ASN1_STRING_to_UTF8.
    Úutf8r   )r   ÚASN1_UTF8STRING_newÚASN1_STRING_setÚencoder"   r   )r   Ústringr$   r%   r   r   r   Ú_encode_asn1_utf8_str;   s   
ÿr,   c                 C   r   r   )r&   r   r   r   ÚASN1_OCTET_STRING_free)r   r#   r$   r   r   r   Ú_encode_asn1_str_gcI   r   r.   c                 C   ó   t | |jƒS r   )r   Ú
skip_certs)r   Úinhibit_any_policyr   r   r   Ú_encode_inhibit_any_policyO   ó   r2   c                 C   sh   | j  ¡ }|jD ])}d}|D ]"}t| |ƒ}| j || j j¡}| j  ||d|¡}|  |dk¡ d}qq|S )zP
    The X509_NAME created will not be gc'd. Use _encode_name_gc if needed.
    r   éÿÿÿÿr   )	r   ÚX509_NAME_newÚrdnsÚ_encode_name_entryr   r   ÚX509_NAME_ENTRY_freeÚX509_NAME_add_entryr   )r   ÚnameÚsubjectÚrdnÚset_flagÚ	attributeÚ
name_entryr%   r   r   r   Ú_encode_nameS   s   


ÿÿör@   c                 C   r   r   )r@   r   r   r   ÚX509_NAME_free)r   Ú
attributesr;   r   r   r   Ú_encode_name_gch   r   rC   c                 C   s>   | j  ¡ }|D ]}t| |ƒ}| j  ||¡}|  |dk¡ q|S )z:
    The sk_X509_NAME_ENTRY created will not be gc'd.
    r   )r   Úsk_X509_NAME_ENTRY_new_nullr7   Úsk_X509_NAME_ENTRY_pushr   )r   rB   Ústackr>   r?   r%   r   r   r   Ú_encode_sk_name_entryn   s   

rG   c                 C   sr   |j tju r|j d¡}n|j tju r|j d¡}n|j d¡}t| |jjƒ}| j	 
| jj||j j|t|ƒ¡}|S )NÚ	utf_16_beÚ	utf_32_ber'   )Ú_typer   Ú	BMPStringÚvaluer*   ÚUniversalStringÚ_txt2obj_gcÚoidÚdotted_stringr   ÚX509_NAME_ENTRY_create_by_OBJr   r   r"   )r   r>   rL   Úobjr?   r   r   r   r7   z   s   ÿr7   c                 C   r/   r   )r   Ú
crl_number©r   Úextr   r   r   Ú&_encode_crl_number_delta_crl_indicatorŠ   r3   rV   c                 C   s®   | j  ¡ }|  || jjk¡ | j || j j¡}|jrdnd|_|j	r$dnd|_
|jr,dnd|_|jr4dnd|_|jrAt| |jƒ|_|jrKt| |jƒ|_|jrUt| |jƒ|_|S ©Néÿ   r   )r   ÚISSUING_DIST_POINT_newr   r   r   r   ÚISSUING_DIST_POINT_freeÚonly_contains_user_certsÚonlyuserÚonly_contains_ca_certsÚonlyCAÚindirect_crlÚindirectCRLÚonly_contains_attribute_certsÚonlyattrÚonly_some_reasonsÚ_encode_reasonflagsÚonlysomereasonsÚ	full_nameÚ_encode_full_nameÚ	distpointÚrelative_nameÚ_encode_relative_name)r   rU   Úidpr   r   r   Ú_encode_issuing_dist_pointŽ   s    
ÿrl   c                 C   sT   | j  ¡ }|  || jjk¡ | j || j j¡}| j  |t|j	 ¡}|  |dk¡ |S ©Nr   )
r   ÚASN1_ENUMERATED_newr   r   r   r   ÚASN1_ENUMERATED_freeÚASN1_ENUMERATED_setr   Úreason)r   Ú
crl_reasonÚasn1enumr%   r   r   r   Ú_encode_crl_reason¤   s   

ÿrt   c                 C   sF   | j  | jjt |j ¡ ¡¡}|  || jjk¡ | j 	|| j j
¡}|S r   )r   ÚASN1_GENERALIZEDTIME_setr   r   ÚcalendarÚtimegmÚinvalidity_dateÚ	timetupler   r   ÚASN1_GENERALIZEDTIME_free)r   rx   Útimer   r   r   Ú_encode_invalidity_date°   s   þr|   c                 C   sŠ  | j  ¡ }|  || jjk¡ | j || j j¡}|D ]©}| j  ¡ }|  || jjk¡ | j  ||¡}|  |dk¡ t	| |j
jƒ}||_|jrÂ| j  ¡ }|  || jjk¡ |jD ]i}| j  ¡ }	|  |	| jjk¡ | j  ||	¡}|  |dk¡ t|tƒr‹t	| tjjƒ|	_t| | d¡ƒ|	j_qUt|tjƒs“J ‚t	| tjjƒ|	_| j  ¡ }
|  |
| jjk¡ |
|	j_|jr·t| |jƒ|
_ t!| |j"ƒ|
_#qU||_$q|S )Nr   Úascii)%r   Úsk_POLICYINFO_new_nullr   r   r   r   Úsk_POLICYINFO_freeÚPOLICYINFO_newÚsk_POLICYINFO_pushÚ_txt2objÚpolicy_identifierrP   ÚpolicyidÚpolicy_qualifiersÚsk_POLICYQUALINFO_new_nullÚPOLICYQUALINFO_newÚsk_POLICYQUALINFO_pushÚ
isinstanceÚstrr   ÚOID_CPS_QUALIFIERÚpqualidr&   r*   ÚdÚcpsuriÚ
UserNoticeÚOID_CPS_USER_NOTICEÚUSERNOTICE_newÚ
usernoticeÚexplicit_textr,   ÚexptextÚ_encode_notice_referenceÚnotice_referenceÚ	noticerefÚ
qualifiers)r   Úcertificate_policiesÚcpÚpolicy_infoÚpir%   rO   ÚpqisÚ	qualifierÚpqiÚunr   r   r   Ú_encode_certificate_policies»   sV   





ÿ
þÿ
ÿÿ€r¡   c                 C   s€   |d u r| j jS | j ¡ }|  || j jk¡ t| |jƒ|_| j ¡ }||_|j	D ]}t
| |ƒ}| j ||¡}|  |dk¡ q(|S rm   )r   r   r   ÚNOTICEREF_newr   r,   ÚorganizationÚsk_ASN1_INTEGER_new_nullÚ	noticenosÚnotice_numbersr   Úsk_ASN1_INTEGER_push)r   ÚnoticeÚnrÚnotice_stackÚnumberÚnumr%   r   r   r   r•   ì   s   



r•   c                 C   s.   |  d¡}| j |d¡}|  || jjk¡ |S )z_
    Converts a Python string with an ASN.1 object ID in dotted form to a
    ASN1_OBJECT.
    r}   r   )r*   r   ÚOBJ_txt2objr   r   r   ©r   r:   rR   r   r   r   r‚   ÿ   s   
r‚   c                 C   r   r   )r‚   r   r   r   ÚASN1_OBJECT_freer®   r   r   r   rN   
  r   rN   c                 C   s
   | j  ¡ S r   )r   ÚASN1_NULL_newrT   r   r   r   Ú_encode_ocsp_nocheck  s   
r±   c                 C   sb  | j j}| j  ¡ }| j || j j¡}||d|jƒ}|  |dk¡ ||d|jƒ}|  |dk¡ ||d|j	ƒ}|  |dk¡ ||d|j
ƒ}|  |dk¡ ||d|jƒ}|  |dk¡ ||d|jƒ}|  |dk¡ ||d|jƒ}|  |dk¡ |jr•||d|jƒ}|  |dk¡ ||d	|jƒ}|  |dk¡ |S ||ddƒ}|  |dk¡ ||d	dƒ}|  |dk¡ |S )
Nr   r   é   é   é   é   é   é   é   )r   ÚASN1_BIT_STRING_set_bitÚASN1_BIT_STRING_newr   r   ÚASN1_BIT_STRING_freeÚdigital_signaturer   Úcontent_commitmentÚkey_enciphermentÚdata_enciphermentÚkey_agreementÚkey_cert_signÚcrl_signÚencipher_onlyÚdecipher_only)r   Ú	key_usageÚset_bitÚkur%   r   r   r   Ú_encode_key_usage  s8   
ûrÈ   c                 C   sz   | j  ¡ }|  || jjk¡ | j || j j¡}|jd ur#t| |jƒ|_	|j
d ur/t| |j
ƒ|_|jd ur;t| |jƒ|_|S r   )r   ÚAUTHORITY_KEYID_newr   r   r   r   ÚAUTHORITY_KEYID_freeÚkey_identifierr&   ÚkeyidÚauthority_cert_issuerÚ_encode_general_namesÚissuerÚauthority_cert_serial_numberr   Úserial)r   Úauthority_keyidÚakidr   r   r   Ú _encode_authority_key_identifier5  s"   

þ
ÿ
ÿrÔ   c                 C   sN   | j  ¡ }| j || j j¡}|jrdnd|_|jr%|jd ur%t| |jƒ|_|S rW   )	r   ÚBASIC_CONSTRAINTS_newr   r   ÚBASIC_CONSTRAINTS_freeÚcaÚpath_lengthr   Úpathlen)r   Úbasic_constraintsÚconstraintsr   r   r   Ú_encode_basic_constraintsL  s   
ÿÿrÜ   c                    sŠ   ˆ j  ¡ }ˆ  |ˆ jjk¡ ˆ j |‡ fdd„¡}|D ]'}ˆ j  ¡ }tˆ |jj	ƒ}t
ˆ |j|jƒ ||_ˆ j  ||¡}ˆ  |dk¡ q|S )Nc                    s   ˆ j  | ˆ j ˆ j jd¡¡S )NÚACCESS_DESCRIPTION_free)r   Úsk_ACCESS_DESCRIPTION_pop_freer   Ú	addressofÚ_original_lib)r   ©r   r   r   Ú<lambda>_  s    ÿþz,_encode_information_access.<locals>.<lambda>r   )r   Úsk_ACCESS_DESCRIPTION_new_nullr   r   r   r   ÚACCESS_DESCRIPTION_newr‚   Úaccess_methodrP   Ú!_encode_general_name_preallocatedÚaccess_locationÚlocationÚmethodÚsk_ACCESS_DESCRIPTION_push)r   Úinfo_accessÚaiaÚaccess_descriptionÚadré   r%   r   rá   r   Ú_encode_information_accessZ  s$   

þ	
ÿ
ÿrï   c                 C   sP   | j  ¡ }|  || jjk¡ |D ]}t| |ƒ}| j  ||¡}|  |dk¡ q|S )Nr   )r   ÚGENERAL_NAMES_newr   r   r   Ú_encode_general_nameÚsk_GENERAL_NAME_push)r   ÚnamesÚgeneral_namesr:   Úgnr%   r   r   r   rÎ   u  s   

rÎ   c                 C   r   r   )rÎ   r   r   r   ÚGENERAL_NAMES_free)r   Úsanrô   r   r   r   Ú_encode_alt_name€  s
   
ÿrø   c                 C   r/   r   )r.   Údigest)r   Úskir   r   r   Ú_encode_subject_key_identifierˆ  r3   rû   c                 C   s   | j  ¡ }t| ||ƒ |S r   )r   ÚGENERAL_NAME_newræ   )r   r:   rõ   r   r   r   rñ   Œ  s   
rñ   c                 C   sL  t |tjƒr?|  || jjk¡ | jj|_| j 	¡ }|  || jjk¡ |j
 d¡}| j ||t|ƒ¡}|  |dk¡ ||j_d S t |tjƒrn|  || jjk¡ | jj|_| j |j
j d¡d¡}|  || jjk¡ ||j_d S t |tjƒrŽ|  || jjk¡ t| |j
ƒ}| jj|_||j_d S t |tjƒrá|  || jjk¡ t |j
tjƒr´|j
jjt d|j
j  d¡ }nt |j
tj!ƒrÍ|j
jjt dd> |j
j  d¡ }n|j
j}t"| |ƒ}	| jj#|_|	|j_$d S t |tj%ƒ�rS|  || jjk¡ | j &¡ }
|  |
| jjk¡ | j |j'j d¡d¡}|  || jjk¡ | j (d|j
¡}| j (d	¡}||d
< | j )| jj|t|j
ƒ¡}|| jjk�rB|  *¡  t+dƒ‚||
_'||
_
| jj,|_|
|j_-d S t |tj.ƒ�ry|  || jjk¡ |j
 d¡}t"| |ƒ}| jj/|_||j_0d S t |tj1ƒ�rŸ|  || jjk¡ |j
 d¡}t"| |ƒ}| jj2|_||j_3d S t+d 4|¡ƒ‚)Nr'   r   r}   l        r´   é€   é   zunsigned char[]zunsigned char **r   zInvalid ASN.1 dataz!{} is an unknown GeneralName type)5r‰   r   ÚDNSNamer   r   r   r   ÚGEN_DNSÚtypeÚASN1_IA5STRING_newrL   r*   r)   r"   r�   ÚdNSNameÚRegisteredIDÚGEN_RIDr­   rP   ÚregisteredIDÚDirectoryNamer@   ÚGEN_DIRNAMEÚdirectoryNameÚ	IPAddressÚ	ipaddressÚIPv4NetworkÚnetwork_addressÚpackedr   Úint_to_bytesÚnum_addressesÚIPv6Networkr&   Ú	GEN_IPADDÚ	iPAddressÚ	OtherNameÚOTHERNAME_newÚtype_idÚnewÚd2i_ASN1_TYPEÚ_consume_errorsÚ
ValueErrorÚGEN_OTHERNAMEÚ	otherNameÚ
RFC822NameÚ	GEN_EMAILÚ
rfc822NameÚUniformResourceIdentifierÚGEN_URIÚuniformResourceIdentifierÚformat)r   r:   rõ   Úia5rL   r%   rR   Údir_namer  ÚipaddrÚ
other_namer  r#   Údata_ptr_ptrÚasn1_strr   r   r   ræ   ’  sŒ   


ÿ
ÿÿ


ÿÿ




ræ   c                 C   sR   | j  ¡ }| j || j j¡}|D ]}t| |jƒ}| j  ||¡}|  |dk¡ q|S rm   )	r   Úsk_ASN1_OBJECT_new_nullr   r   Úsk_ASN1_OBJECT_freer‚   rP   Úsk_ASN1_OBJECT_pushr   )r   Úextended_key_usageÚekurO   rR   r%   r   r   r   Ú_encode_extended_key_usageæ  s   
r/  r   r²   r³   r´   rµ   r¶   r·   r¸   c                 C   sL   | j  ¡ }|  || jjk¡ |D ]}| j  |t| d¡}|  |dk¡ q|S rm   )r   rº   r   r   r   r¹   Ú_CRLREASONFLAGS)r   ÚreasonsÚbitmaskrq   r%   r   r   r   rd   ý  s   

ÿrd   c                 C   ó4   | j  ¡ }|  || jjk¡ t|_t| |ƒ|j_	|S r   )
r   ÚDIST_POINT_NAME_newr   r   r   r   r  rÎ   r:   Úfullname)r   rf   Údpnr   r   r   rg   	  ó
   
rg   c                 C   r3  r   )
r   r4  r   r   r   r   r  rG   r:   Úrelativename)r   ri   r6  r   r   r   rj     r7  rj   c                 C   s²   | j  ¡ }| j || j j¡}|D ]F}| j  ¡ }|  || jjk¡ |jr*t	| |jƒ|_|j
r4t| |j
ƒ|_|jr>t| |jƒ|_|jrHt| |jƒ|_| j  ||¡}|  |dk¡ q|S rm   )r   Úsk_DIST_POINT_new_nullr   r   Úsk_DIST_POINT_freeÚDIST_POINT_newr   r   r1  rd   rf   rg   rh   ri   rj   Ú
crl_issuerrÎ   Ú	CRLissuerÚsk_DIST_POINT_push)r   ÚcdpsÚcdpÚpointÚdpr%   r   r   r   Ú_encode_cdps_freshest_crl  s    

rC  c                 C   sV   | j  ¡ }|  || jjk¡ | j || j j¡}t| |jƒ}||_	t| |j
ƒ}||_|S r   )r   ÚNAME_CONSTRAINTS_newr   r   r   r   ÚNAME_CONSTRAINTS_freeÚ_encode_general_subtreeÚpermitted_subtreesÚpermittedSubtreesÚexcluded_subtreesÚexcludedSubtrees)r   Úname_constraintsÚncÚ	permittedÚexcludedr   r   r   Ú_encode_name_constraints2  s   
ÿÿrO  c                 C   sb   | j  ¡ }|  || jjk¡ | j || j j¡}|jd ur#t| |jƒ|_	|j
d ur/t| |j
ƒ|_|S r   )r   ÚPOLICY_CONSTRAINTS_newr   r   r   r   ÚPOLICY_CONSTRAINTS_freeÚrequire_explicit_policyr   ÚrequireExplicitPolicyÚinhibit_policy_mappingÚinhibitPolicyMapping)r   Úpolicy_constraintsÚpcr   r   r   Ú_encode_policy_constraintsB  s   

ÿ
ÿrX  c                 C   sZ   |d u r| j jS | j ¡ }|D ]}| j ¡ }t| |ƒ|_| j ||¡}|  |dk¡ q|S rm   )	r   r   r   Úsk_GENERAL_SUBTREE_new_nullÚGENERAL_SUBTREE_newrñ   ÚbaseÚsk_GENERAL_SUBTREE_pushr   )r   ÚsubtreesÚgeneral_subtreesr:   Úgsr%   r   r   r   rF  S  s   

rF  c                 C   sZ   | j  ¡ }|  || jjk¡ | j || j j¡}|D ]}| j  ||j¡}|  |dk¡ q|S rm   )	r   Úsk_SCT_new_nullr   r   r   r   Úsk_SCT_freeÚsk_SCT_pushÚ_sct)r   ÚsctsÚ	sct_stackÚsctr%   r   r   r   Ú-_encode_precert_signed_certificate_timestampsa  s   
rg  c                 C   r/   r   )r.   Únonce)r   rh  r   r   r   Ú_encode_noncek  r3   ri  )\rv   r  Úcryptographyr   r   Ú0cryptography.hazmat.backends.openssl.decode_asn1r   r   r   Úcryptography.x509.namer   Úcryptography.x509.oidr   r	   r
   r   r   r&   r,   r.   r2   r@   rC   rG   r7   rV   rl   rt   r|   r¡   r•   r‚   rN   r±   rÈ   rÔ   rÜ   rï   rÎ   rø   rû   rñ   ræ   r/  ÚReasonFlagsÚkey_compromiseÚca_compromiseÚaffiliation_changedÚ
supersededÚcessation_of_operationÚcertificate_holdÚprivilege_withdrawnÚaa_compromiser0  rd   rg   rj   rC  rO  rX  rF  rg  ri  ÚBASIC_CONSTRAINTSÚSUBJECT_KEY_IDENTIFIERÚ	KEY_USAGEÚSUBJECT_ALTERNATIVE_NAMEÚISSUER_ALTERNATIVE_NAMEÚEXTENDED_KEY_USAGEÚAUTHORITY_KEY_IDENTIFIERÚCERTIFICATE_POLICIESÚAUTHORITY_INFORMATION_ACCESSÚSUBJECT_INFORMATION_ACCESSÚCRL_DISTRIBUTION_POINTSÚFRESHEST_CRLÚINHIBIT_ANY_POLICYÚOCSP_NO_CHECKÚNAME_CONSTRAINTSÚPOLICY_CONSTRAINTSÚ%PRECERT_SIGNED_CERTIFICATE_TIMESTAMPSÚ_EXTENSION_ENCODE_HANDLERSÚ
CRL_NUMBERÚDELTA_CRL_INDICATORÚISSUING_DISTRIBUTION_POINTÚ_CRL_EXTENSION_ENCODE_HANDLERSÚCERTIFICATE_ISSUERÚ
CRL_REASONÚINVALIDITY_DATEÚ$_CRL_ENTRY_EXTENSION_ENCODE_HANDLERSÚNONCEÚ'_OCSP_REQUEST_EXTENSION_ENCODE_HANDLERSÚ)_OCSP_BASICRESP_EXTENSION_ENCODE_HANDLERSr   r   r   r   Ú<module>   sÒ   
1 Tø
ÿþýüûúùø	÷
öõôóòñðîùýÿÿ