U
    *”}f\  ã                    @   sœ  d dl mZmZmZ d dlZ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/d0„ Z(d1d2„ Z)d3d4„ Z*d5d6„ Z+d7d8„ Z,d9d:„ Z-d;d<„ Z.d=d>„ Z/d?d@„ Z0e	j1j2dAe	j1j3dBe	j1j4dCe	j1j5dDe	j1j6dEe	j1j7dFe	j1j8dGe	j1j9dHiZ:dIdJ„ Z;dKdL„ Z<dMdN„ Z=dOdP„ Z>dQdR„ Z?dSdT„ Z@dUdV„ ZAdWdX„ ZBejCe)ejDe-ejEe'ejFe,ejGe,ejHe0ejIe(ejJe"ejKe*ejLe*ejMe>ejNe>ejOeejPe&ejQe?ejRe@iZSejGe,ejIe(ejKe*ejTeejUeejVeejNe>iZWejXe,ejYe ejZe!iZ[ej\eBiZ]ej\eBiZ^dS )Yé    )Úabsolute_importÚdivisionÚprint_functionN)Ú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.

    )Z
_int_to_bnÚ_ffiÚgcÚ_libZBN_freeZBN_to_ASN1_INTEGERÚNULLÚopenssl_assert©ÚbackendÚxÚi© r   úT/tmp/pip-unpacked-wheel-x36vw73o/cryptography/hazmat/backends/openssl/encode_asn1.pyÚ_encode_asn1_int   s
    
r   c                 C   s    t | |ƒ}| j || jj¡}|S ©N)r   r   r   r   ZASN1_INTEGER_freer   r   r   r   Ú_encode_asn1_int_gc.   s    
r   c                 C   s0   | j  ¡ }| j  ||t|ƒ¡}|  |dk¡ |S )z@
    Create an ASN1_OCTET_STRING from a Python byte string.
    é   )r   ZASN1_OCTET_STRING_newZASN1_OCTET_STRING_setÚlenr   )r   ÚdataÚsÚresr   r   r   Ú_encode_asn1_str4   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   ZASN1_UTF8STRING_newÚASN1_STRING_setÚencoder   r   )r   Ústringr   r    r   r   r   Ú_encode_asn1_utf8_str>   s    
  ÿr&   c                 C   s    t | |ƒ}| j || jj¡}|S r   )r!   r   r   r   ZASN1_OCTET_STRING_free)r   r   r   r   r   r   Ú_encode_asn1_str_gcL   s    
r'   c                 C   s   t | |jƒS r   )r   Z
skip_certs)r   Zinhibit_any_policyr   r   r   Ú_encode_inhibit_any_policyR   s    r(   c                 C   sh   | j  ¡ }|jD ]R}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   ZX509_NAME_newZrdnsÚ_encode_name_entryr   r   ZX509_NAME_ENTRY_freeZX509_NAME_add_entryr   )r   ÚnameÚsubjectZrdnZset_flagÚ	attributeÚ
name_entryr    r   r   r   Ú_encode_nameV   s$    


 ÿ   ÿr/   c                 C   s    t | |ƒ}| j || jj¡}|S r   )r/   r   r   r   ZX509_NAME_free)r   Ú
attributesr,   r   r   r   Ú_encode_name_gck   s    
r1   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   Zsk_X509_NAME_ENTRY_new_nullr*   Zsk_X509_NAME_ENTRY_pushr   )r   r0   Ústackr-   r.   r    r   r   r   Ú_encode_sk_name_entryq   s    

r3   c                 C   sr   |j tjkr|j d¡}n&|j tjkr4|j d¡}n|j d¡}t| |jjƒ}| j	 
| jj||j j|t|ƒ¡}|S )NÚ	utf_16_beÚ	utf_32_ber"   )Ú_typer
   Z	BMPStringÚvaluer$   ZUniversalStringÚ_txt2obj_gcÚoidÚdotted_stringr   ZX509_NAME_ENTRY_create_by_OBJr   r   r   )r   r-   r7   Úobjr.   r   r   r   r*   }   s        ÿr*   c                 C   s   t | |jƒS r   )r   Z
crl_number©r   Úextr   r   r   Ú&_encode_crl_number_delta_crl_indicator   s    r>   c                 C   s®   | j  ¡ }|  || jjk¡ | j || j j¡}|jr8dnd|_|j	rHdnd|_
|jrXdnd|_|jrhdnd|_|jr‚t| |jƒ|_|jr–t| |jƒ|_|jrªt| |jƒ|_|S ©Néÿ   r   )r   ZISSUING_DIST_POINT_newr   r   r   r   ZISSUING_DIST_POINT_freeZonly_contains_user_certsZonlyuserZonly_contains_ca_certsZonlyCAZindirect_crlZindirectCRLZonly_contains_attribute_certsZonlyattrZonly_some_reasonsÚ_encode_reasonflagsZonlysomereasonsÚ	full_nameÚ_encode_full_nameÚ	distpointÚrelative_nameÚ_encode_relative_name)r   r=   Zidpr   r   r   Ú_encode_issuing_dist_point‘   s"    
 ÿrG   c                 C   sT   | j  ¡ }|  || jjk¡ | j || j j¡}| j  |t|j	 ¡}|  |dk¡ |S ©Nr   )
r   ZASN1_ENUMERATED_newr   r   r   r   ZASN1_ENUMERATED_freeZASN1_ENUMERATED_setr   Úreason)r   Z
crl_reasonZasn1enumr    r   r   r   Ú_encode_crl_reason§   s    
 ÿrJ   c                 C   sF   | j  | jjt |j ¡ ¡¡}|  || jjk¡ | j 	|| j j
¡}|S r   )r   ZASN1_GENERALIZEDTIME_setr   r   ÚcalendarÚtimegmÚinvalidity_dateÚ	timetupler   r   ZASN1_GENERALIZEDTIME_free)r   rM   Útimer   r   r   Ú_encode_invalidity_date³   s    þrP   c                 C   s”  | j  ¡ }|  || jjk¡ | j || j j¡}|D ]Z}| j  ¡ }|  || jjk¡ | j  ||¡}|  |dk¡ t	| |j
jƒ}||_|jr2| j  ¡ }|  || jjk¡ |jD ]Ú}| j  ¡ }	|  |	| jjk¡ | j  ||	¡}|  |dk¡ t|tjƒrt	| tjjƒ|	_t| | d¡ƒ|	j_q¬t|tjƒs.t‚t	| tjjƒ|	_| j  ¡ }
|  |
| jjk¡ |
|	j_|j rxt!| |j ƒ|
_"t#| |j$ƒ|
_%q¬||_&q2|S )Nr   Úascii)'r   Zsk_POLICYINFO_new_nullr   r   r   r   Zsk_POLICYINFO_freeZPOLICYINFO_newZsk_POLICYINFO_pushÚ_txt2objZpolicy_identifierr:   ZpolicyidZpolicy_qualifiersZsk_POLICYQUALINFO_new_nullZPOLICYQUALINFO_newZsk_POLICYQUALINFO_pushÚ
isinstanceÚsixÚ	text_typer   ZOID_CPS_QUALIFIERZpqualidr!   r$   ÚdZcpsuriZ
UserNoticeÚAssertionErrorZOID_CPS_USER_NOTICEZUSERNOTICE_newZ
usernoticeZexplicit_textr&   ZexptextÚ_encode_notice_referenceZnotice_referenceZ	noticerefZ
qualifiers)r   Zcertificate_policiesÚcpZpolicy_infoÚpir    r9   ZpqisZ	qualifierZpqiZunr   r   r   Ú_encode_certificate_policies¾   s\    





 ÿþ
 ÿ
 ÿ ÿr[   c                 C   s„   |d kr| j jS | j ¡ }|  || j jk¡ t| |jƒ|_| j ¡ }||_|j	D ]*}t
| |ƒ}| j ||¡}|  |dk¡ qP|S d S rH   )r   r   r   ZNOTICEREF_newr   r&   ZorganizationZsk_ASN1_INTEGER_new_nullZ	noticenosZnotice_numbersr   Zsk_ASN1_INTEGER_push)r   ÚnoticeÚnrZnotice_stackÚnumberÚnumr    r   r   r   rX   ï   s    



rX   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.
    rQ   r   )r$   r   ÚOBJ_txt2objr   r   r   ©r   r+   r;   r   r   r   rR     s    
rR   c                 C   s    t | |ƒ}| j || jj¡}|S r   )rR   r   r   r   ZASN1_OBJECT_freera   r   r   r   r8     s    
r8   c                 C   s
   | j  ¡ S r   )r   ZASN1_NULL_newr<   r   r   r   Ú_encode_ocsp_nocheck  s    rb   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¡ n4||ddƒ}|  |dk¡ ||d	dƒ}|  |dk¡ |S )
Nr   r   é   é   é   é   é   é   é   )r   ÚASN1_BIT_STRING_set_bitÚASN1_BIT_STRING_newr   r   ZASN1_BIT_STRING_freeZdigital_signaturer   Zcontent_commitmentZkey_enciphermentZdata_enciphermentZkey_agreementZkey_cert_signZcrl_signZencipher_onlyZdecipher_only)r   Z	key_usageZset_bitZkur    r   r   r   Ú_encode_key_usage  s6    
rl   c                 C   sz   | j  ¡ }|  || jjk¡ | j || j j¡}|jd k	rFt| |jƒ|_	|j
d k	r^t| |j
ƒ|_|jd k	rvt| |jƒ|_|S r   )r   ZAUTHORITY_KEYID_newr   r   r   r   ZAUTHORITY_KEYID_freeZkey_identifierr!   ZkeyidZauthority_cert_issuerÚ_encode_general_namesZissuerZauthority_cert_serial_numberr   Úserial)r   Zauthority_keyidZakidr   r   r   Ú _encode_authority_key_identifier8  s&    

þ
 ÿ
 ÿro   c                 C   sN   | j  ¡ }| j || j j¡}|jr&dnd|_|jrJ|jd k	rJt| |jƒ|_|S r?   )	r   ZBASIC_CONSTRAINTS_newr   r   ZBASIC_CONSTRAINTS_freeÚcaZpath_lengthr   Úpathlen)r   Zbasic_constraintsÚconstraintsr   r   r   Ú_encode_basic_constraintsO  s    
 ÿ ÿrs   c                    sŠ   ˆ j  ¡ }ˆ  |ˆ jjk¡ ˆ j |‡ fdd„¡}|D ]N}ˆ j  ¡ }tˆ |jj	ƒ}t
ˆ |j|jƒ ||_ˆ j  ||¡}ˆ  |dk¡ q6|S )Nc                    s   ˆ j  | ˆ j ˆ j jd¡¡S )NZACCESS_DESCRIPTION_free)r   Zsk_ACCESS_DESCRIPTION_pop_freer   Ú	addressofZ_original_lib)r   ©r   r   r   Ú<lambda>b  s    ÿþz,_encode_information_access.<locals>.<lambda>r   )r   Zsk_ACCESS_DESCRIPTION_new_nullr   r   r   r   ZACCESS_DESCRIPTION_newrR   Zaccess_methodr:   Ú!_encode_general_name_preallocatedZaccess_locationÚlocationÚmethodZsk_ACCESS_DESCRIPTION_push)r   Zinfo_accessZaiaZaccess_descriptionÚadry   r    r   ru   r   Ú_encode_information_access]  s*    

þ	
 ÿ  ÿr{   c                 C   sP   | j  ¡ }|  || jjk¡ |D ]*}t| |ƒ}| j  ||¡}|  |dk¡ q |S )Nr   )r   ZGENERAL_NAMES_newr   r   r   Ú_encode_general_nameZsk_GENERAL_NAME_push)r   ÚnamesÚgeneral_namesr+   Úgnr    r   r   r   rm   x  s    

rm   c                 C   s    t | |ƒ}| j || jj¡}|S r   )rm   r   r   r   ZGENERAL_NAMES_free)r   Úsanr~   r   r   r   Ú_encode_alt_nameƒ  s    
 ÿr   c                 C   s   t | |jƒS r   )r'   Údigest)r   Zskir   r   r   Ú_encode_subject_key_identifier‹  s    rƒ   c                 C   s   | j  ¡ }t| ||ƒ |S r   )r   ZGENERAL_NAME_newrw   )r   r+   r   r   r   r   r|     s    
r|   c                 C   sR  t |tjƒr~|  || jjk¡ | jj|_| j 	¡ }|  || jjk¡ |j
 d¡}| j ||t|ƒ¡}|  |dk¡ ||j_nÐt |tjƒrÜ|  || jjk¡ | jj|_| j |j
j d¡d¡}|  || jjk¡ ||j_nrt |tjƒr|  || jjk¡ t| |j
ƒ}| jj|_||j_n0t |tjƒrÊ|  || jjk¡ t |j
tjƒrn|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_$n„t |tj%ƒr¬|  || 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rŒ|  *¡  t+dƒ‚||
_'||
_
| jj,|_|
|j_-n¢t |tj.ƒrö|  || jjk¡ |j
 d¡}t"| |ƒ}| jj/|_||j_0nXt |tj1ƒr@|  || jjk¡ |j
 d¡}t"| |ƒ}| jj2|_||j_3nt+d 4|¡ƒ‚d S )Nr"   r   rQ   l        re   é€   é   zunsigned char[]zunsigned char **r   zInvalid ASN.1 dataz!{} is an unknown GeneralName type)5rS   r   ZDNSNamer   r   r   r   ZGEN_DNSÚtypeZASN1_IA5STRING_newr7   r$   r#   r   rV   ZdNSNameZRegisteredIDZGEN_RIDr`   r:   ZregisteredIDZDirectoryNamer/   ZGEN_DIRNAMEZdirectoryNameZ	IPAddressÚ	ipaddressÚIPv4NetworkÚnetwork_addressÚpackedr   Zint_to_bytesÚnum_addressesÚIPv6Networkr!   Z	GEN_IPADDZ	iPAddressZ	OtherNameZOTHERNAME_newÚtype_idÚnewZd2i_ASN1_TYPEZ_consume_errorsÚ
ValueErrorZGEN_OTHERNAMEZ	otherNameZ
RFC822NameZ	GEN_EMAILZ
rfc822NameZUniformResourceIdentifierZGEN_URIZuniformResourceIdentifierÚformat)r   r+   r   Zia5r7   r    r;   Zdir_namerŠ   ÚipaddrZ
other_namer   r   Zdata_ptr_ptrZasn1_strr   r   r   rw   •  s˜    


 ÿ

 ÿ ÿ


 ÿ  ÿ







rw   c                 C   sR   | j  ¡ }| j || j j¡}|D ],}t| |jƒ}| j  ||¡}|  |dk¡ q |S rH   )	r   Zsk_ASN1_OBJECT_new_nullr   r   Zsk_ASN1_OBJECT_freerR   r:   Zsk_ASN1_OBJECT_pushr   )r   Zextended_key_usageZekur9   r;   r    r   r   r   Ú_encode_extended_key_usageé  s    
r’   r   rc   rd   re   rf   rg   rh   ri   c                 C   sL   | j  ¡ }|  || jjk¡ |D ]&}| j  |t| d¡}|  |dk¡ q |S rH   )r   rk   r   r   r   rj   Ú_CRLREASONFLAGS)r   ÚreasonsZbitmaskrI   r    r   r   r   rA      s    
  ÿrA   c                 C   s4   | j  ¡ }|  || jjk¡ t|_t| |ƒ|j_	|S r   )
r   ÚDIST_POINT_NAME_newr   r   r   r   r†   rm   r+   Úfullname)r   rB   Údpnr   r   r   rC     s
    
rC   c                 C   s4   | j  ¡ }|  || jjk¡ t|_t| |ƒ|j_	|S r   )
r   r•   r   r   r   r	   r†   r3   r+   Zrelativename)r   rE   r—   r   r   r   rF     s
    
rF   c                 C   s²   | j  ¡ }| j || j j¡}|D ]Œ}| j  ¡ }|  || jjk¡ |jrTt	| |jƒ|_|j
rht| |j
ƒ|_|jr|t| |jƒ|_|jrt| |jƒ|_| j  ||¡}|  |dk¡ q |S rH   )r   Zsk_DIST_POINT_new_nullr   r   Zsk_DIST_POINT_freeZDIST_POINT_newr   r   r”   rA   rB   rC   rD   rE   rF   Z
crl_issuerrm   Z	CRLissuerZsk_DIST_POINT_push)r   ZcdpsZcdpZpointZdpr    r   r   r   Ú_encode_cdps_freshest_crl  s     

r˜   c                 C   sV   | j  ¡ }|  || jjk¡ | j || j j¡}t| |jƒ}||_	t| |j
ƒ}||_|S r   )r   ZNAME_CONSTRAINTS_newr   r   r   r   ZNAME_CONSTRAINTS_freeÚ_encode_general_subtreeZpermitted_subtreesZpermittedSubtreesZexcluded_subtreesZexcludedSubtrees)r   Zname_constraintsZncZ	permittedZexcludedr   r   r   Ú_encode_name_constraints5  s    
 ÿ ÿrš   c                 C   sb   | j  ¡ }|  || jjk¡ | j || j j¡}|jd k	rFt| |jƒ|_	|j
d k	r^t| |j
ƒ|_|S r   )r   ZPOLICY_CONSTRAINTS_newr   r   r   r   ZPOLICY_CONSTRAINTS_freeZrequire_explicit_policyr   ZrequireExplicitPolicyZinhibit_policy_mappingZinhibitPolicyMapping)r   Zpolicy_constraintsZpcr   r   r   Ú_encode_policy_constraintsE  s    

 ÿ
 ÿr›   c                 C   s\   |d kr| j jS | j ¡ }|D ]4}| j ¡ }t| |ƒ|_| j ||¡}|dkst‚q|S d S rH   )	r   r   r   Zsk_GENERAL_SUBTREE_new_nullZGENERAL_SUBTREE_newr|   ÚbaseZsk_GENERAL_SUBTREE_pushrW   )r   ZsubtreesZgeneral_subtreesr+   Zgsr    r   r   r   r™   V  s    

r™   c                 C   s   t | |jƒS r   )r'   Únonce)r   r   r   r   r   Ú_encode_nonced  s    rž   )_Ú
__future__r   r   r   rK   r‡   rT   Zcryptographyr   r   Z0cryptography.hazmat.backends.openssl.decode_asn1r   r   r	   Zcryptography.x509.namer
   Zcryptography.x509.oidr   r   r   r   r   r!   r&   r'   r(   r/   r1   r3   r*   r>   rG   rJ   rP   r[   rX   rR   r8   rb   rl   ro   rs   r{   rm   r   rƒ   r|   rw   r’   ZReasonFlagsZkey_compromiseZca_compromiseZaffiliation_changedZ
supersededZcessation_of_operationZcertificate_holdZprivilege_withdrawnZaa_compromiser“   rA   rC   rF   r˜   rš   r›   r™   rž   ZBASIC_CONSTRAINTSZSUBJECT_KEY_IDENTIFIERZ	KEY_USAGEZSUBJECT_ALTERNATIVE_NAMEZISSUER_ALTERNATIVE_NAMEZEXTENDED_KEY_USAGEZAUTHORITY_KEY_IDENTIFIERZCERTIFICATE_POLICIESZAUTHORITY_INFORMATION_ACCESSZSUBJECT_INFORMATION_ACCESSZCRL_DISTRIBUTION_POINTSZFRESHEST_CRLZINHIBIT_ANY_POLICYZOCSP_NO_CHECKZNAME_CONSTRAINTSZPOLICY_CONSTRAINTSZ_EXTENSION_ENCODE_HANDLERSZ
CRL_NUMBERZDELTA_CRL_INDICATORZISSUING_DISTRIBUTION_POINTZ_CRL_EXTENSION_ENCODE_HANDLERSZCERTIFICATE_ISSUERZ
CRL_REASONZINVALIDITY_DATEZ$_CRL_ENTRY_EXTENSION_ENCODE_HANDLERSZNONCEZ'_OCSP_REQUEST_EXTENSION_ENCODE_HANDLERSZ)_OCSP_BASICRESP_EXTENSION_ENCODE_HANDLERSr   r   r   r   Ú<module>   sô   
1 T        ø                ð       ù   ý ÿ ÿ