3 l�_\� @s�ddlmZmZmZddlZddlZddlZddlmZm Z ddl m Z m Z m Z ddlmZddlmZmZmZdd�Zd d �Zd d �Zd d�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd �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 j1j9dHiZ:dIdJ�Z;dKdL�ZdQdR�Z?dSdT�Z@dUdV�ZAdWdX�ZBejCe)ejDe-ejEe'ejFe,ejGe,ejHe0ejIe(ejJe"ejKe*ejLe*ejMe>ejNe>ejOeejPe&ejQe?ejRe@iZSejGe,ejIe(ejKe*ejTeejUeejVeejNe>iZWejXe,ejYe ejZe!iZ[ej\eBiZ]ej\eBiZ^dS)Y�)�absolute_import�division�print_functionN)�utils�x509)�_CRL_ENTRY_REASON_ENUM_TO_CODE�_DISTPOINT_TYPE_FULLNAME�_DISTPOINT_TYPE_RELATIVENAME)� _ASN1Type)�CRLEntryExtensionOID� ExtensionOID�OCSPExtensionOIDcCsD|j|�}|jj||jj�}|jj||jj�}|j||jjk�|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�_libZBN_freeZBN_to_ASN1_INTEGER�NULL�openssl_assert)�backend�x�i�r�#/usr/lib64/python3.6/encode_asn1.py�_encode_asn1_ints rcCs t||�}|jj||jj�}|S)N)rrrrZASN1_INTEGER_free)rrrrrr�_encode_asn1_int_gc.s rcCs0|jj�}|jj||t|��}|j|dk�|S)z@ Create an ASN1_OCTET_STRING from a Python byte string. �)rZASN1_OCTET_STRING_newZASN1_OCTET_STRING_set�lenr)r�data�s�resrrr�_encode_asn1_str4s rcCs<|jj�}|jj||jd�t|jd���}|j|dk�|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)rZASN1_UTF8STRING_new�ASN1_STRING_set�encoderr)r�stringrrrrr�_encode_asn1_utf8_str>s  r$cCs t||�}|jj||jj�}|S)N)rrrrZASN1_OCTET_STRING_free)rrrrrr�_encode_asn1_str_gcLs r%cCs t||j�S)N)rZ skip_certs)rZinhibit_any_policyrrr�_encode_inhibit_any_policyRsr&cCsp|jj�}x`|jD]V}d}xL|D]D}t||�}|jj||jj�}|jj||d|�}|j|dk�d}q WqW|S)zP The X509_NAME created will not be gc'd. Use _encode_name_gc if needed. rr�����r') rZ X509_NAME_newZrdns�_encode_name_entryrrZX509_NAME_ENTRY_freeZX509_NAME_add_entryr)r�name�subjectZrdnZset_flag� attribute� name_entryrrrr� _encode_nameVs       r-cCs t||�}|jj||jj�}|S)N)r-rrrZX509_NAME_free)r� attributesr*rrr�_encode_name_gcks r/cCsB|jj�}x2|D]*}t||�}|jj||�}|j|dk�qW|S)z: The sk_X509_NAME_ENTRY created will not be gc'd. r)rZsk_X509_NAME_ENTRY_new_nullr(Zsk_X509_NAME_ENTRY_pushr)rr.�stackr+r,rrrr�_encode_sk_name_entryqs    r1cCsr|jtjkr|jjd�}n&|jtjkr4|jjd�}n |jjd�}t||jj�}|j j |j j ||jj|t |��}|S)N� utf_16_be� utf_32_ber )Z_typer Z BMPString�valuer"ZUniversalString� _txt2obj_gc�oid� dotted_stringrZX509_NAME_ENTRY_create_by_OBJrrr)rr+r4�objr,rrrr(}s   r(cCs t||j�S)N)rZ crl_number)r�extrrr�&_encode_crl_number_delta_crl_indicator�sr:cCs�|jj�}|j||jjk�|jj||jj�}|jr8dnd|_|j rHdnd|_ |j rXdnd|_ |j rhdnd|_|jr�t||j�|_|jr�t||j�|_|jr�t||j�|_|S)N��r)rZISSUING_DIST_POINT_newrrrrZISSUING_DIST_POINT_freeZonly_contains_user_certsZonlyuserZonly_contains_ca_certsZonlyCAZ indirect_crlZ indirectCRLZonly_contains_attribute_certsZonlyattrZonly_some_reasons�_encode_reasonflagsZonlysomereasons� full_name�_encode_full_name� distpoint� relative_name�_encode_relative_name)rr9Zidprrr�_encode_issuing_dist_point�s  rBcCsT|jj�}|j||jjk�|jj||jj�}|jj|t|j �}|j|dk�|S)Nr) rZASN1_ENUMERATED_newrrrrZASN1_ENUMERATED_freeZASN1_ENUMERATED_setr�reason)rZ crl_reasonZasn1enumrrrr�_encode_crl_reason�s rDcCsF|jj|jjtj|jj���}|j||jjk�|jj ||jj �}|S)N) rZASN1_GENERALIZEDTIME_setrr�calendarZtimegm�invalidity_dateZ timetuplerrZASN1_GENERALIZEDTIME_free)rrFZtimerrr�_encode_invalidity_date�s rGc Cs�|jj�}|j||jjk�|jj||jj�}�xh|D�]^}|jj�}|j||jjk�|jj||�}|j|dk�t ||j j �}||_ |j r6|jj�}|j||jjk�x�|j D]�}|jj�} |j| |jjk�|jj|| �}|j|dk�t|tj��r"t |tjj �| _t||jd��| j_q�t|tj��s4t�t |tjj �| _|jj�} |j| |jjk�| | j_|j �r~t!||j �| _"t#||j$�| _%q�W||_&q6W|S)Nr�ascii)'rZsk_POLICYINFO_new_nullrrrrZsk_POLICYINFO_freeZPOLICYINFO_newZsk_POLICYINFO_push�_txt2objZpolicy_identifierr7ZpolicyidZpolicy_qualifiersZsk_POLICYQUALINFO_new_nullZPOLICYQUALINFO_newZsk_POLICYQUALINFO_push� isinstance�sixZ text_typerZOID_CPS_QUALIFIERZpqualidrr"�dZcpsuriZ UserNotice�AssertionErrorZOID_CPS_USER_NOTICEZUSERNOTICE_newZ usernoticeZ explicit_textr$Zexptext�_encode_notice_referenceZnotice_referenceZ noticerefZ qualifiers) rZcertificate_policiesZcpZ policy_infoZpirr6ZpqisZ qualifierZpqiZunrrr�_encode_certificate_policies�sJ        rOcCs�|dkr|jjS|jj�}|j||jjk�t||j�|_|jj�}||_x4|j D]*}t ||�}|jj ||�}|j|dk�qRW|SdS)Nr) rrrZ NOTICEREF_newrr$Z organizationZsk_ASN1_INTEGER_new_nullZ noticenosZnotice_numbersrZsk_ASN1_INTEGER_push)rZnoticeZnrZ notice_stackZnumberZnumrrrrrN�s    rNcCs.|jd�}|jj|d�}|j||jjk�|S)z_ Converts a Python string with an ASN.1 object ID in dotted form to a ASN1_OBJECT. rHr)r"r� OBJ_txt2objrrr)rr)r8rrrrIs rIcCs t||�}|jj||jj�}|S)N)rIrrrZASN1_OBJECT_free)rr)r8rrrr5 s r5cCs |jj�S)N)rZ ASN1_NULL_new)rr9rrr�_encode_ocsp_nochecksrQcCsb|jj}|jj�}|jj||jj�}||d|j�}|j|dk�||d|j�}|j|dk�||d|j �}|j|dk�||d|j �}|j|dk�||d|j �}|j|dk�||d|j �}|j|dk�||d|j �}|j|dk�|j �r*||d|j�}|j|dk�||d |j�}|j|dk�n4||dd�}|j|dk�||d d�}|j|dk�|S) Nrr�������)r�ASN1_BIT_STRING_set_bit�ASN1_BIT_STRING_newrrZASN1_BIT_STRING_freeZdigital_signaturerZcontent_commitmentZkey_enciphermentZdata_enciphermentZ key_agreementZ key_cert_signZcrl_signZ encipher_onlyZ decipher_only)rZ key_usageZset_bitZkurrrr�_encode_key_usages6   r[cCsz|jj�}|j||jjk�|jj||jj�}|jdk rFt||j�|_ |j dk r^t ||j �|_ |j dk rvt||j �|_|S)N)rZAUTHORITY_KEYID_newrrrrZAUTHORITY_KEYID_freeZkey_identifierrZkeyidZauthority_cert_issuer�_encode_general_namesZissuerZauthority_cert_serial_numberr�serial)rZauthority_keyidZakidrrr� _encode_authority_key_identifier8s       r^cCsN|jj�}|jj||jj�}|jr&dnd|_|jrJ|jdk rJt||j�|_|S)Nr;r) rZBASIC_CONSTRAINTS_newrrZBASIC_CONSTRAINTS_freeZcaZ path_lengthrZpathlen)rZbasic_constraintsZ constraintsrrr�_encode_basic_constraintsOs   r_cs��jj�}�j|�jjk��jj|�fdd��}xV|D]N}�jj�}t�|jj �}t �|j |j �||_ �jj||�}�j|dk�q8W|S)Ncs�jj|�jj�jjd��S)NZACCESS_DESCRIPTION_free)rZsk_ACCESS_DESCRIPTION_pop_freerZ addressofZ _original_lib)r)rrr�bsz,_encode_information_access..r)rZsk_ACCESS_DESCRIPTION_new_nullrrrrZACCESS_DESCRIPTION_newrIZ access_methodr7�!_encode_general_name_preallocatedZaccess_location�location�methodZsk_ACCESS_DESCRIPTION_push)rZ info_accessZaiaZaccess_descriptionZadrcrr)rr�_encode_information_access]s    rdcCsT|jj�}|j||jjk�x2|D]*}t||�}|jj||�}|j|dk�q"W|S)Nr)rZGENERAL_NAMES_newrrr�_encode_general_nameZsk_GENERAL_NAME_push)r�names� general_namesr)�gnrrrrr\xs   r\cCs t||�}|jj||jj�}|S)N)r\rrrZGENERAL_NAMES_free)rZsanrgrrr�_encode_alt_name�s  ricCs t||j�S)N)r%Zdigest)rZskirrr�_encode_subject_key_identifier�srjcCs|jj�}t|||�|S)N)rZGENERAL_NAME_newra)rr)rhrrrre�s  recCsRt|tj�r~|j||jjk�|jj|_|jj �}|j||jjk�|j j d�}|jj ||t |��}|j|dk�||j_�n�t|tj�r�|j||jjk�|jj|_|jj|j jj d�d�}|j||jjk�||j_�nrt|tj��r|j||jjk�t||j �}|jj|_||j_�n0t|tj��r�|j||jjk�t|j tj��rn|j jjtjd |j j d�}n|j j d�}n|j j}t"||�} |jj#|_| |j_$�n�t|tj%��r�|j||jjk�|jj&�} |j| |jjk�|jj|j'jj d�d�} |j| |jjk�|jj(d|j �} |jj(d �} | | d <|jj)|jj| t |j ��}||jjk�r�|j*�t+d ��| | _'|| _ |jj,|_| |j_-n�t|tj.��r�|j||jjk�|j j d�} t"|| �}|jj/|_||j_0nXt|tj1��r@|j||jjk�|j j d�} t"|| �}|jj2|_||j_3nt+d j4|���dS)Nr rrH� rT��zunsigned char[]zunsigned char **rzInvalid ASN.1 dataz!{} is an unknown GeneralName typel)5rJrZDNSNamerrrrZGEN_DNS�typeZASN1_IA5STRING_newr4r"r!rrLZdNSNameZ RegisteredIDZGEN_RIDrPr7Z registeredIDZ DirectoryNamer-Z GEN_DIRNAMEZ directoryNameZ IPAddress� ipaddressZ IPv4NetworkZnetwork_address�packedrZ int_to_bytesZ num_addressesZ IPv6NetworkrZ GEN_IPADDZ iPAddressZ OtherNameZ OTHERNAME_new�type_id�newZ d2i_ASN1_TYPEZ_consume_errors� ValueErrorZ GEN_OTHERNAMEZ otherNameZ RFC822NameZ GEN_EMAILZ rfc822NameZUniformResourceIdentifierZGEN_URIZuniformResourceIdentifier�format)rr)rhZia5r4rr8Zdir_namerpZipaddrZ other_namerqrZ data_ptr_ptrZasn1_strrrrra�s�                            racCsV|jj�}|jj||jj�}x4|D],}t||j�}|jj||�}|j|dk�q"W|S)Nr) rZsk_ASN1_OBJECT_new_nullrrZsk_ASN1_OBJECT_freerIr7Zsk_ASN1_OBJECT_pushr)rZextended_key_usageZekur6r8rrrr�_encode_extended_key_usage�s   rurrRrSrTrUrVrWrXcCsP|jj�}|j||jjk�x.|D]&}|jj|t|d�}|j|dk�q"W|S)Nr)rrZrrrrY�_CRLREASONFLAGS)r�reasonsZbitmaskrCrrrrr<s  r<cCs4|jj�}|j||jjk�t|_t||�|j_ |S)N) r�DIST_POINT_NAME_newrrrrrnr\r)�fullname)rr=�dpnrrrr> s  r>cCs4|jj�}|j||jjk�t|_t||�|j_ |S)N) rrxrrrr rnr1r)Z relativename)rr@rzrrrrAs  rAcCs�|jj�}|jj||jj�}x�|D]�}|jj�}|j||jjk�|jrVt ||j�|_|j rjt ||j �|_ |j r~t||j �|_ |jr�t||j�|_|jj||�}|j|dk�q"W|S)Nr)rZsk_DIST_POINT_new_nullrrZsk_DIST_POINT_freeZDIST_POINT_newrrrwr<r=r>r?r@rAZ crl_issuerr\Z CRLissuerZsk_DIST_POINT_push)rZcdpsZcdpZpointZdprrrr�_encode_cdps_freshest_crls    r{cCsV|jj�}|j||jjk�|jj||jj�}t||j�}||_ t||j �}||_ |S)N) rZNAME_CONSTRAINTS_newrrrrZNAME_CONSTRAINTS_free�_encode_general_subtreeZpermitted_subtreesZpermittedSubtreesZexcluded_subtreesZexcludedSubtrees)rZname_constraintsZncZ permittedZexcludedrrr�_encode_name_constraints5s   r}cCsb|jj�}|j||jjk�|jj||jj�}|jdk rFt||j�|_ |j dk r^t||j �|_ |S)N) rZPOLICY_CONSTRAINTS_newrrrrZPOLICY_CONSTRAINTS_freeZrequire_explicit_policyrZrequireExplicitPolicyZinhibit_policy_mappingZinhibitPolicyMapping)rZpolicy_constraintsZpcrrr�_encode_policy_constraintsEs     r~cCs`|dkr|jjS|jj�}x<|D]4}|jj�}t||�|_|jj||�}|dks t�q W|SdS)Nr) rrrZsk_GENERAL_SUBTREE_new_nullZGENERAL_SUBTREE_newre�baseZsk_GENERAL_SUBTREE_pushrM)rZsubtreesZgeneral_subtreesr)Zgsrrrrr|Vs    r|cCs t||j�S)N)r%�nonce)rr�rrr� _encode_noncedsr�)_Z __future__rrrrErorKZ cryptographyrrZ0cryptography.hazmat.backends.openssl.decode_asn1rrr Zcryptography.x509.namer Zcryptography.x509.oidr r r rrrr$r%r&r-r/r1r(r:rBrDrGrOrNrIr5rQr[r^r_rdr\rirjreraruZ ReasonFlagsZkey_compromiseZ ca_compromiseZaffiliation_changedZ supersededZcessation_of_operationZcertificate_holdZprivilege_withdrawnZ aa_compromiservr<r>rAr{r}r~r|r�ZBASIC_CONSTRAINTSZSUBJECT_KEY_IDENTIFIERZ KEY_USAGEZSUBJECT_ALTERNATIVE_NAMEZISSUER_ALTERNATIVE_NAMEZEXTENDED_KEY_USAGEZAUTHORITY_KEY_IDENTIFIERZCERTIFICATE_POLICIESZAUTHORITY_INFORMATION_ACCESSZSUBJECT_INFORMATION_ACCESSZCRL_DISTRIBUTION_POINTSZ FRESHEST_CRLZINHIBIT_ANY_POLICYZ OCSP_NO_CHECKZNAME_CONSTRAINTSZPOLICY_CONSTRAINTSZ_EXTENSION_ENCODE_HANDLERSZ CRL_NUMBERZDELTA_CRL_INDICATORZISSUING_DISTRIBUTION_POINTZ_CRL_EXTENSION_ENCODE_HANDLERSZCERTIFICATE_ISSUERZ CRL_REASONZINVALIDITY_DATEZ$_CRL_ENTRY_EXTENSION_ENCODE_HANDLERSZNONCEZ'_OCSP_REQUEST_EXTENSION_ENCODE_HANDLERSZ)_OCSP_BASICRESP_EXTENSION_ENCODE_HANDLERSrrrr�s�     1   T