3
K^)\                 @   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@iZRejGe,ejIe(ejKe*ejSeejTeejUeejMe>iZVejWe,ejXe ejYe!iZZe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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-vvkwn1hz/cryptography/hazmat/backends/openssl/encode_asn1.py_encode_asn1_int   s
    
r   c             C   s    t | |}| jj|| jj}|S )N)r   r   r   r   ZASN1_INTEGER_free)r   r   r   r   r   r   _encode_asn1_int_gc+   s    
r   c             C   s0   | j j }| j j||t|}| j|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_str1   s    
r   c             C   s<   | j j }| j j||jdt|jd}| j|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j}|S )N)r   r   r   r   ZASN1_OCTET_STRING_free)r   r   r   r   r   r   _encode_asn1_str_gcI   s    
r%   c             C   s   t | |jS )N)r   Z
skip_certs)r   Zinhibit_any_policyr   r   r   _encode_inhibit_any_policyO   s    r&   c             C   sp   | j j }x`|jD ]V}d}xL|D ]D}t| |}| jj|| j j}| j j||d|}| j|dk d}q W qW |S )zP
    The X509_NAME created will not be gc'd. Use _encode_name_gc if needed.
    r   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_nameS   s    


r-   c             C   s    t | |}| jj|| jj}|S )N)r-   r   r   r   ZX509_NAME_free)r   
attributesr*   r   r   r   _encode_name_gcg   s    
r/   c             C   sB   | j j }x2|D ]*}t| |}| j j||}| j|dk qW |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   r.   stackr+   r,   r   r   r   r   _encode_sk_name_entrym   s    


r1   c             C   sr   |j tjkr|jjd}n&|j tjkr4|jjd}n|jjd}t| |j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+   r5   objr,   r   r   r   r(   y   s    r(   c             C   s   t | |jS )N)r   Z
crl_number)r   extr   r   r   &_encode_crl_number_delta_crl_indicator   s    r;   c             C   s   | j j }| j|| jjk | jj|| j j}|jr8dnd|_|j	rHdnd|_
|jrXdnd|_|jrhdnd|_|jrt| |j|_|jrt| |j|_|jrt| |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    
rC   c             C   sT   | j j }| j|| jjk | jj|| j j}| j j|t|j	 }| 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    
rE   c             C   sF   | j j| jjtj|jj }| j|| jjk | jj	|| j j
}|S )N)r   ZASN1_GENERALIZEDTIME_setr   r   calendartimegminvalidity_date	timetupler   r   ZASN1_GENERALIZEDTIME_free)r   rH   timer   r   r   _encode_invalidity_date   s    
rK   c             C   s  | j j }| j|| jjk | jj|| j j}xh|D ]^}| j j }| j|| jjk | j j||}| j|dk t	| |j
j}||_|jr6| j j }| j|| jjk x|jD ]}| j j }	| j|	| jjk | j j||	}| j|dk t|tjr"t	| tjj|	_t| |jd|	j_qt|tjs4tt	| tjj|	_| j j }
| j|
| jjk |
|	j_|j r~t!| |j |
_"t#| |j$|
_%qW ||_&q6W |S )Nr   ascii)'r   Zsk_POLICYINFO_new_nullr   r   r   r   Zsk_POLICYINFO_freeZPOLICYINFO_newZsk_POLICYINFO_push_txt2objZpolicy_identifierr8   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   r7   ZpqisZ	qualifierZpqiZunr   r   r   _encode_certificate_policies   sJ    





rV   c             C   s   |d kr| j jS | jj }| j|| j jk t| |j|_| jj }||_x4|j	D ]*}t
| |}| jj||}| j|dk qRW |S d S )Nr   )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   rS      s    


rS   c             C   s.   |j d}| jj|d}| j|| jjk |S )z_
    Converts a Python string with an ASN.1 object ID in dotted form to a
    ASN1_OBJECT.
    rL   r   )r"   r   OBJ_txt2objr   r   r   )r   r)   r9   r   r   r   rM      s    
rM   c             C   s    t | |}| jj|| jj}|S )N)rM   r   r   r   ZASN1_OBJECT_free)r   r)   r9   r   r   r   r6   
  s    
r6   c             C   s
   | j j S )N)r   ZASN1_NULL_new)r   r:   r   r   r   _encode_ocsp_nocheck  s    r\   c             C   sb  | j j}| j j }| jj|| j j}||d|j}| j|dk ||d|j}| j|dk ||d|j	}| j|dk ||d|j
}| j|dk ||d|j}| j|dk ||d|j}| j|dk ||d|j}| j|dk |jr*||d|j}| j|dk ||d	|j}| j|dk n4||dd}| j|dk ||d	d}| j|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    
rf   c             C   sz   | j j }| j|| jjk | jj|| j j}|jd k	rFt| |j|_	|j
d k	r^t| |j
|_|jd k	rvt| |j|_|S )N)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_identifier5  s    




ri   c             C   sN   | j j }| jj|| j j}|jr&dnd|_|jrJ|jd k	rJt| |j|_|S )Nr<   r   )	r   ZBASIC_CONSTRAINTS_newr   r   ZBASIC_CONSTRAINTS_freecaZpath_lengthr   pathlen)r   Zbasic_constraintsconstraintsr   r   r   _encode_basic_constraintsL  s    
rm   c                s    j j } j| jjk  jj| fdd}xV|D ]N} j j }t |jj	}t
 |j|j ||_ j j||} j|dk q8W |S )Nc                s    j j|  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>_  s   z6_encode_authority_information_access.<locals>.<lambda>r   )r   Zsk_ACCESS_DESCRIPTION_new_nullr   r   r   r   ZACCESS_DESCRIPTION_newrM   Zaccess_methodr8   !_encode_general_name_preallocatedZaccess_locationlocationmethodZsk_ACCESS_DESCRIPTION_push)r   Zauthority_info_accessZaiaZaccess_descriptionadrr   r   r   )r   r   $_encode_authority_information_accessZ  s    


rt   c             C   sT   | j j }| j|| jjk x2|D ]*}t| |}| j j||}| j|dk q"W |S )Nr   )r   ZGENERAL_NAMES_newr   r   r   _encode_general_nameZsk_GENERAL_NAME_push)r   namesgeneral_namesr)   gnr   r   r   r   rg   t  s    


rg   c             C   s    t | |}| jj|| jj}|S )N)rg   r   r   r   ZGENERAL_NAMES_free)r   sanrw   r   r   r   _encode_alt_name  s    
rz   c             C   s   t | |jS )N)r%   digest)r   Zskir   r   r   _encode_subject_key_identifier  s    r|   c             C   s   | j j }t| || |S )N)r   ZGENERAL_NAME_newrp   )r   r)   rx   r   r   r   ru     s    
ru   c             C   sR  t |tjr~| j|| jjk | jj|_| jj	 }| j|| jjk |j
jd}| jj||t|}| j|dk ||j_nt |tjr| j|| jjk | jj|_| jj|j
jjdd}| j|| jjk ||j_nrt |tjr| j|| jjk t| |j
}| jj|_||j_n0t |tjr| j|| jjk t |j
tjrn|j
jjtjd|j
j  d }n<t |j
tj!r|j
jjtjdd> |j
j  d }n|j
j}t"| |}	| jj#|_|	|j_$nt |tj%r| j|| jjk | jj& }
| j|
| jjk | jj|j'jjdd}| j|| jjk | jj(d|j
}| jj(d	}||d
< | jj)| jj|t|j
}|| jjkr| j*  t+d||
_'||
_
| jj,|_|
|j_-nt |tj.r| j|| jjk |j
jd}t"| |}| jj/|_||j_0nXt |tj1r@| j|| jjk |j
jd}t"| |}| jj2|_||j_3nt+dj4|d S )Nr    r   rL       r_         zunsigned char[]zunsigned char **r   zInvalid ASN.1 dataz!{} is an unknown GeneralName typel        )5rN   r   ZDNSNamer   r   r   r   ZGEN_DNStypeZASN1_IA5STRING_newr5   r"   r!   r   rQ   ZdNSNameZRegisteredIDZGEN_RIDr[   r8   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)   rx   Zia5r5   r   r9   Zdir_namer   ipaddrZ
other_namer   r   Zdata_ptr_ptrZasn1_strr   r   r   rp     s    














rp   c             C   sV   | j j }| jj|| j j}x4|D ],}t| |j}| j j||}| j|dk q"W |S )Nr   )	r   Zsk_ASN1_OBJECT_new_nullr   r   Zsk_ASN1_OBJECT_freerM   r8   Zsk_ASN1_OBJECT_pushr   )r   Zextended_key_usageZekur7   r9   r   r   r   r   _encode_extended_key_usage  s    

r   r   r]   r^   r_   r`   ra   rb   rc   c             C   sP   | j j }| j|| jjk x.|D ]&}| j j|t| d}| j|dk q"W |S )Nr   )r   re   r   r   r   rd   _CRLREASONFLAGS)r   reasonsZbitmaskrD   r   r   r   r   r=      s    

r=   c             C   s4   | j j }| j|| jjk t|_t| ||j_	|S )N)
r   DIST_POINT_NAME_newr   r   r   r   r   rg   r)   fullname)r   r>   dpnr   r   r   r?     s
    
r?   c             C   s4   | j j }| j|| jjk t|_t| ||j_	|S )N)
r   r   r   r   r   r	   r   r1   r)   Zrelativename)r   rA   r   r   r   r   rB     s
    
rB   c             C   s   | j j }| jj|| j j}x|D ]}| j j }| j|| jjk |jrVt	| |j|_|j
rjt| |j
|_|jr~t| |j|_|jrt| |j|_| j j||}| j|dk q"W |S )Nr   )r   Zsk_DIST_POINT_new_nullr   r   Zsk_DIST_POINT_freeZDIST_POINT_newr   r   r   r=   r>   r?   r@   rA   rB   Z
crl_issuerrg   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|| jjk | jj|| j j}t| |j}||_	t| |j
}||_|S )N)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|| jjk | jj|| j j}|jd k	rFt| |j|_	|j
d k	r^t| |j
|_|S )N)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j }x<|D ]4}| jj }t| ||_| jj||}|dks tq W |S d S )Nr   )	r   r   r   Zsk_GENERAL_SUBTREE_new_nullZGENERAL_SUBTREE_newru   baseZsk_GENERAL_SUBTREE_pushrR   )r   ZsubtreesZgeneral_subtreesr)   Zgsr   r   r   r   r   V  s    


r   c             C   s   t | |jS )N)r%   nonce)r   r   r   r   r   _encode_nonced  s    r   )^
__future__r   r   r   rF   r   rO   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-   r/   r1   r(   r;   rC   rE   rK   rV   rS   rM   r6   r\   rf   ri   rm   rt   rg   rz   r|   ru   rp   r   ZReasonFlagsZkey_compromiseZca_compromiseZaffiliation_changedZ
supersededZcessation_of_operationZcertificate_holdZprivilege_withdrawnZaa_compromiser   r=   r?   rB   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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 X



