U
    [e}                      @   s  d dl Z d dlZd dlmZ d dlmZmZmZ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 Zd	d
 Zdd Zdd Zdd Zdd Zdd Zdd ZG dd de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 Z-d;Z.d<d= Z/ej0j1ej0j2ej0j3ej0j4ej0j5ej0j6ej0j7ej0j8d>Z9d?d@ Z:dAdB Z;dCdD Z<dEdF Z=dGdH Z>dIdJ Z?dKdL Z@dMdN ZAej0jBej0j1ej0j2ej0j3ej0j4ej0j5ej0j6ej0jCej0j7ej0j8dO
ZDej0jBd ej0j1d;ej0j2dPej0j3dQej0j4dRej0j5dSej0j6dTej0jCdUej0j7dVej0j8dWi
ZEdXdY ZFdZd[ ZGd\d] ZHd^d_ ZId`da ZJdbdc ZKddde ZLdfdg ZMeNdhdidjZOdkdl ZPdmdn ZQdodp ZRejSeejTeejUe$ejVe&ejWe,ejXe ejYe"ejZe#ej[eej\e<ej]e=ej^eej_e>ej`e'ejae(ejbe+iZcejde@iZeejfeFejgeGejheHiZiejjeejkeejXe ej`e'ejYe"ejle*ej]e=iZmejneRiZoejneRiZpejqeAiZrdS )q    N)x509)	DERReaderINTEGERNULLSEQUENCE_TLS_FEATURE_TYPE_TO_ENUM)_ASN1_TYPE_TO_ENUM)CRLEntryExtensionOIDCertificatePoliciesOIDExtensionOIDOCSPExtensionOIDc                 C   s   d}| j d|}| j|||d}||d krX|d }| j d|}| j|||d}| |dk | j ||d d   S )NP   zchar[]   r   )_ffinew_libZOBJ_obj2txtopenssl_assertbufferdecode)backendobjbuf_lenbufres r   r/var/www/html/services/stratfitenv/lib/python3.8/site-packages/cryptography/hazmat/backends/openssl/decode_asn1.py_obj2txt   s    	r   c                 C   sn   | j |}| || jjk | j |}| || jjk t| |}t| |}t|j	 }t
t
|||S N)r   ZX509_NAME_ENTRY_get_objectr   r   r   ZX509_NAME_ENTRY_get_data_asn1_string_to_utf8r   r	   typer   ZNameAttributeObjectIdentifier)r   Zx509_name_entryr   datavalueoidr    r   r   r   _decode_x509_name_entry-   s    


r%   c           	      C   s   | j |}g }d}t|D ]P}| j ||}t| |}| j |}||krZ||h n|d | |}qt	dd |D S )Nc                 s   s   | ]}t |V  qd S r   )r   RelativeDistinguishedName).0Zrdnr   r   r   	<genexpr>H   s     z$_decode_x509_name.<locals>.<genexpr>)
r   ZX509_NAME_entry_countrangeZX509_NAME_get_entryr%   ZX509_NAME_ENTRY_setappendaddr   Name)	r   Z	x509_namecount
attributesZprev_set_idxentry	attributeZset_idr   r   r   _decode_x509_name9   s    
r3   c                 C   sR   | j |}g }t|D ]4}| j ||}| || jjk |t| | q|S r   )	r   Zsk_GENERAL_NAME_numr*   Zsk_GENERAL_NAME_valuer   r   r   r+   _decode_general_name)r   gnsnumnamesignr   r   r   _decode_general_namesK   s    r:   c                 C   s  |j | jjkr.t| |jjd}tj	|S |j | jj
kr\t| |jjd}tj	|S |j | jjkrt| |jj}tt|S |j | jjkrbt| |jj}t|}|dks|dkrNt|d |d  }t||d d  }tt|dd  }|d}|dkrt|}d||d  kr6tdt|jd	| }	n
t|}	t|	S |j | jjkrt t!| |jj"S |j | jj#krt| |jj$d}tj%	|S |j | jj&krt| |jj'j(}
t)| |jj'j*}t+t|
|S t,d
tj-.|j |j |j d S )Nutf8          0r&   1zInvalid netmaskz/{}z{} is not a supported type)/r    r   ZGEN_DNS_asn1_string_to_bytesdZdNSNamer   r   ZDNSNameZ_init_without_validationZGEN_URIZuniformResourceIdentifierZUniformResourceIdentifierZGEN_RIDr   ZregisteredIDZRegisteredIDr!   Z	GEN_IPADDZ	iPAddresslen	ipaddress
ip_addressbinintfind
ValueError
ip_networkexplodedformatZ	IPAddressZGEN_DIRNAMEZDirectoryNamer3   ZdirectoryNameZ	GEN_EMAILZ
rfc822NameZ
RFC822NameZGEN_OTHERNAMEZ	otherNametype_id_asn1_to_derr#   Z	OtherNameZUnsupportedGeneralNameTypeZ_GENERAL_NAMESget)r   r9   r"   r$   data_lenbasenetmaskbitsprefixiprM   r#   r   r   r   r4   V   s\     



r4   c                 C   s   t  S r   )r   ZOCSPNoCheckr   extr   r   r   _decode_ocsp_no_check   s    rX   c                 C   s0   | j d|}| j || jj}tt| |S NzASN1_INTEGER *)r   castgcr   ASN1_INTEGER_freer   Z	CRLNumber_asn1_integer_to_intr   rW   asn1_intr   r   r   _decode_crl_number   s    r`   c                 C   s0   | j d|}| j || jj}tt| |S rY   )r   rZ   r[   r   r\   r   ZDeltaCRLIndicatorr]   r^   r   r   r   _decode_delta_crl_indicator   s    ra   c                   @   s   e Zd Zdd Zdd ZdS )_X509ExtensionParserc                 C   s   || _ || _|| _|| _d S r   )	ext_countget_exthandlers_backend)selfr   rc   rd   re   r   r   r   __init__   s    z_X509ExtensionParser.__init__c                 C   sf  g }t  }t| |D ]@}| ||}| j|| jjjk | jj	|}|dk}t
t| j| jj|}||krt
d|||tjkr| jj|}	t| j|	}
t|
t}g }| s||t  qt
dd |D }|t
||| || qn\|tjkrt| jj|}	tt| j|	}|t   |t
||t
!  || qz| j"| }W nv t#k
r   | jj|}	| j|	| jjjk | jj$|	j%|	j&d d  }t
'||}|t
||| Y nXX | jj(|}|| jjjkr0| j)  t*d||| j|}|t
||| || qt
+|S )Nr   zDuplicate {} extension foundc                 S   s   g | ]}t | qS r   r   )r(   r0   r   r   r   
<listcomp>   s     z._X509ExtensionParser.parse.<locals>.<listcomp>z/The {} extension is invalid and can't be parsed),setr*   rc   rd   rf   r   r   r   r   ZX509_EXTENSION_get_criticalr   r!   r   ZX509_EXTENSION_get_objectZDuplicateExtensionrL   r   ZTLS_FEATUREZX509_EXTENSION_get_datarA   r   Zread_single_elementr   Zis_emptyr+   Zread_elementr   Z
as_integerZ
TLSFeature	Extensionr,   ZPRECERT_POISONZcheck_emptyZPrecertPoisonre   KeyErrorr   r"   lengthZUnrecognizedExtensionZX509V3_EXT_d2iZ_consume_errorsrI   Z
Extensions)rg   Zx509_obj
extensionsZ	seen_oidsr8   rW   critcriticalr$   r"   Z
data_bytesfeaturesparsedr#   readerhandlerZderZunrecognizedZext_datar   r   r   parse   sx     


z_X509ExtensionParser.parseN)__name__
__module____qualname__rh   ru   r   r   r   r   rb      s   rb   c                 C   s4  | j d|}| j || jj}| j|}g }t|D ]}d }| j||}t	t
| |j}|j| j jkr| j|j}g }t|D ]}	| j|j|	}
t	t
| |
j}|tjkr| j |
jjj|
jjjd d  d}|| q|tjkstt| |
jj}|| q|t|| q8t|S )Nz"Cryptography_STACK_OF_POLICYINFO *ascii) r   rZ   r[   r   ZCERTIFICATEPOLICIES_freeZsk_POLICYINFO_numr*   Zsk_POLICYINFO_valuer   r!   r   Zpolicyid
qualifiersr   Zsk_POLICYQUALINFO_numZsk_POLICYQUALINFO_valuepqualidr   ZCPS_QUALIFIERr   rB   cpsurir"   rm   r   r+   ZCPS_USER_NOTICEAssertionError_decode_user_noticeZ
usernoticeZPolicyInformationZCertificatePolicies)r   cpr6   Zcertificate_policiesr8   rz   pir$   ZqnumjZpqir{   r|   Zuser_noticer   r   r   _decode_certificate_policies  s<    
  r   c           
      C   s   d }d }|j | jjkr"t| |j }|j| jjkrt| |jj}| j|jj}g }t	|D ]*}| j
|jj|}t| |}	||	 qZt||}t||S r   )Zexptextr   r   r   Z	noticereforganizationr   Zsk_ASN1_INTEGER_numZ	noticenosr*   Zsk_ASN1_INTEGER_valuer]   r+   r   ZNoticeReferenceZ
UserNotice)
r   unZexplicit_textZnotice_referencer   r6   Znotice_numbersr8   r_   Z
notice_numr   r   r   r~   &  s"     
r~   c                 C   sB   | j d|}| j || jj}|jdk}t| |j}t	||S )NzBASIC_CONSTRAINTS *   )
r   rZ   r[   r   ZBASIC_CONSTRAINTS_freeca_asn1_integer_to_int_or_nonepathlenr   ZBasicConstraints)r   Zbc_stZbasic_constraintsr   Zpath_lengthr   r   r   _decode_basic_constraints>  s     
 r   c                 C   s@   | j d|}| j || jj}t| j |j|j	d d  S NzASN1_OCTET_STRING *)
r   rZ   r[   r   ASN1_OCTET_STRING_freer   ZSubjectKeyIdentifierr   r"   rm   r   asn1_stringr   r   r   _decode_subject_key_identifierN  s     r   c                 C   s   | j d|}| j || jj}d }d }|j| j jkrT| j |jj|jj	d d  }|j
| j jkrnt| |j
}t| |j}t|||S )NzAUTHORITY_KEYID *)r   rZ   r[   r   ZAUTHORITY_KEYID_freeZkeyidr   r   r"   rm   Zissuerr:   r   serialr   ZAuthorityKeyIdentifier)r   ZakidZkey_identifierZauthority_cert_issuerZauthority_cert_serial_numberr   r   r    _decode_authority_key_identifierX  s(        r   c                    s    j d|} j | fdd} j|}g }t|D ]j} j||} |j j j	k t
t |j} |j j j	k t |j}|t
|| q<|S )Nz*Cryptography_STACK_OF_ACCESS_DESCRIPTION *c                    s    j |  j j jdS )NZACCESS_DESCRIPTION_free)r   Zsk_ACCESS_DESCRIPTION_pop_freer   Z	addressofZ_original_lib)r0   r   r   r   <lambda>s  s    z,_decode_information_access.<locals>.<lambda>)r   rZ   r[   r   Zsk_ACCESS_DESCRIPTION_numr*   Zsk_ACCESS_DESCRIPTION_valuer   methodr   r   r!   r   locationr4   r+   ZAccessDescription)r   iar6   access_descriptionsr8   adr$   r9   r   r   r   _decode_information_accesso  s    
	r   c                 C   s   t | |}t|S r   )r   r   ZAuthorityInformationAccessr   Zaiar   r   r   r   $_decode_authority_information_access  s    
r   c                 C   s   t | |}t|S r   )r   r   ZSubjectInformationAccessr   r   r   r   "_decode_subject_information_access  s    
r   c                 C   s   | j d|}| j || jj}| jj}||ddk}||ddk}||ddk}||ddk}||ddk}||ddk}||ddk}	||d	dk}
||d
dk}t|||||||	|
|	S )NzASN1_BIT_STRING *r   r   r>                  r<   )r   rZ   r[   r   ZASN1_BIT_STRING_freeASN1_BIT_STRING_get_bitr   ZKeyUsage)r   Z
bit_stringZget_bitZdigital_signatureZcontent_commitmentZkey_enciphermentZdata_enciphermentZkey_agreementZkey_cert_signZcrl_signZencipher_onlyZdecipher_onlyr   r   r   _decode_key_usage  s.    r   c                 C   s.   | j d|}| j || jj}t| |}|S NzGENERAL_NAMES *)r   rZ   r[   r   GENERAL_NAMES_freer:   r   r5   Zgeneral_namesr   r   r   _decode_general_names_extension  s    
r   c                 C   s   t t| |S r   )r   ZSubjectAlternativeNamer   rV   r   r   r   _decode_subject_alt_name  s    r   c                 C   s   t t| |S r   )r   ZIssuerAlternativeNamer   rV   r   r   r   _decode_issuer_alt_name  s    r   c                 C   sF   | j d|}| j || jj}t| |j}t| |j}tj	||dS )NzNAME_CONSTRAINTS *)Zpermitted_subtreesZexcluded_subtrees)
r   rZ   r[   r   ZNAME_CONSTRAINTS_free_decode_general_subtreesZpermittedSubtreesZexcludedSubtreesr   ZNameConstraints)r   ncZ	permittedexcludedr   r   r   _decode_name_constraints  s     r   c                 C   sh   || j jkrd S | j|}g }t|D ]:}| j||}| || j jk t| |j}|	| q(|S r   )
r   r   r   Zsk_GENERAL_SUBTREE_numr*   Zsk_GENERAL_SUBTREE_valuer   r4   rQ   r+   )r   Zstack_subtreesr6   Zsubtreesr8   r   namer   r   r   r     s    r   c           	   	   C   s   | j d|}| j || jj}|j| j jkr@t| |j\}}nd }d }|jdk}|j	dk}|j
dk}|jdk}|j| j jkrt| |j}nd }t|||||||S )NzISSUING_DIST_POINT *r   )r   rZ   r[   r   ZISSUING_DIST_POINT_free	distpointr   _decode_distpointZonlyuserZonlyCAZindirectCRLZonlyattrZonlysomereasons_decode_reasonsr   ZIssuingDistributionPoint)	r   Zidp	full_namerelative_nameZ	only_userZonly_caZindirect_crlZ	only_attrZonly_some_reasonsr   r   r   _decode_issuing_dist_point  s,    



r   c                 C   sD   | j d|}| j || jj}t| |j}t| |j}t	||S )NzPOLICY_CONSTRAINTS *)
r   rZ   r[   r   ZPOLICY_CONSTRAINTS_freer   ZrequireExplicitPolicyZinhibitPolicyMappingr   ZPolicyConstraints)r   ZpcZrequire_explicit_policyZinhibit_policy_mappingr   r   r   _decode_policy_constraints  s       r   c                 C   s   | j d|}| j || jj}| j|}g }t|D ]>}| j||}| || j j	k t
t| |}|| q8t
|S )Nz#Cryptography_STACK_OF_ASN1_OBJECT *)r   rZ   r[   r   Zsk_ASN1_OBJECT_freeZsk_ASN1_OBJECT_numr*   Zsk_ASN1_OBJECT_valuer   r   r   r!   r   r+   ZExtendedKeyUsage)r   skr6   Zekusr8   r   r$   r   r   r   _decode_extended_key_usage  s    r   r   c           
   	   C   s   | j d|}| j || jj}| j|}g }t|D ]}d }d }d }d }| j||}	|	j| j j	krtt
| |	j}|	j| j j	krt| |	j}|	j| j j	krt| |	j\}}|t|||| q8|S )Nz"Cryptography_STACK_OF_DIST_POINT *)r   rZ   r[   r   ZCRL_DIST_POINTS_freeZsk_DIST_POINT_numr*   Zsk_DIST_POINT_valuereasonsr   r   Z	CRLissuerr:   r   r   r+   r   ZDistributionPoint)
r   cdpsr6   dist_pointsr8   r   r   Z
crl_issuerr   Zcdpr   r   r   _decode_dist_points  s8        r   )r   r>   r   r   r   r   r   r<   c                 C   s6   g }t  D ] \}}| j||r|| qt|S r   )_REASON_BIT_MAPPINGitemsr   r   r+   	frozenset)r   r   Zenum_reasonsZbit_positionreasonr   r   r   r   P  s
    r   c           	      C   s   |j tkr t| |jj}|d fS |jj}| j|}t }t	|D ]4}| j
||}| || jjk |t| | qBt|}d |fS r   )r    _DISTPOINT_TYPE_FULLNAMEr:   r   fullnameZrelativenamer   Zsk_X509_NAME_ENTRY_numrj   r*   Zsk_X509_NAME_ENTRY_valuer   r   r   r,   r%   r   r'   )	r   r   r   ZrnsZrnumr/   r8   Zrnr   r   r   r   r   Z  s    
	
r   c                 C   s   t | |}t|S r   )r   r   ZCRLDistributionPointsr   r   r   r   r   r   _decode_crl_distribution_pointss  s    
r   c                 C   s   t | |}t|S r   )r   r   ZFreshestCRLr   r   r   r   _decode_freshest_crlx  s    
r   c                 C   s4   | j d|}| j || jj}t| |}t|S rY   )r   rZ   r[   r   r\   r]   r   ZInhibitAnyPolicy)r   r_   Z
skip_certsr   r   r   _decode_inhibit_any_policy}  s    
r   c                 C   sj   ddl m} | jd|}| j|| jj}g }t| j|D ]$}| j	||}|
|| || q@|S )Nr   )_SignedCertificateTimestampzCryptography_STACK_OF_SCT *)Z)cryptography.hazmat.backends.openssl.x509r   r   rZ   r[   r   ZSCT_LIST_freer*   Z
sk_SCT_numZsk_SCT_valuer+   )r   	asn1_sctsr   Zsctsr8   Zsctr   r   r   _decode_scts  s    r   c                 C   s   t t| |S r   )r   Z)PrecertificateSignedCertificateTimestampsr   r   r   r   r   r   -_decode_precert_signed_certificate_timestamps  s    r   c                 C   s   t t| |S r   )r   ZSignedCertificateTimestampsr   r   r   r   r   %_decode_signed_certificate_timestamps  s    r   )
r   r   r>   r   r   r   r   r<   	   
   r>   r   r   r   r   r<   r   r   c                 C   sd   | j d|}| j || jj}| j|}ztt| W S  t	k
r^   t
d|Y nX d S )NzASN1_ENUMERATED *zUnsupported reason code: {})r   rZ   r[   r   ZASN1_ENUMERATED_freeZASN1_ENUMERATED_getr   Z	CRLReason_CRL_ENTRY_REASON_CODE_TO_ENUMrl   rI   rL   )r   enumcoder   r   r   _decode_crl_reason  s    r   c                 C   s0   | j d|}| j || jj}tt| |S )NzASN1_GENERALIZEDTIME *)r   rZ   r[   r   ASN1_GENERALIZEDTIME_freer   ZInvalidityDate_parse_asn1_generalized_time)r   Zinv_dategeneralized_timer   r   r   _decode_invalidity_date  s     r   c                 C   s4   | j d|}| j || jj}t| |}t|S r   )r   rZ   r[   r   r   r:   r   ZCertificateIssuerr   r   r   r   _decode_cert_issuer  s    
r   c                    sn    j d} j||} |dk  |d  j jk  j | fdd} j |d |d d  S )Nunsigned char **r   c                    s    j | d S Nr   r   ZOPENSSL_freer   r   r   r   r         z_asn1_to_der.<locals>.<lambda>)r   r   r   Zi2d_ASN1_TYPEr   r   r[   r   )r   Z	asn1_typer   r   r   r   r   rN     s     
rN   c                 C   s@   | j || jj}| || jjk | j|| j j}| |S r   )r   ZASN1_INTEGER_to_BNr   r   r   r[   ZBN_freeZ
_bn_to_int)r   r_   Zbnr   r   r   r]     s    r]   c                 C   s   || j jkrd S t| |S d S r   )r   r   r]   )r   r_   r   r   r   r     s    r   c                 C   s   | j |j|jd d  S r   )r   r   r"   rm   r   r   r   r   rA     s    rA   c                 C   s   t | |dS )Nry   )rA   r   r   r   r   r   _asn1_string_to_ascii  s    r   )returnc                    s~    j d} j||}|dkr2td|j |d  j jk  j 	| fdd} j 
|d |d d  dS )Nr   r&   z&Unsupported ASN1 string type. Type: {}r   c                    s    j | d S r   r   r   r   r   r   r     r   z&_asn1_string_to_utf8.<locals>.<lambda>r;   )r   r   r   ZASN1_STRING_to_UTF8rI   rL   r    r   r   r[   r   r   )r   r   r   r   r   r   r   r     s    
 
r   c                 C   s`   |  || jjk | j|| jj}|| jjkrDtdt| || j|| jj	}t
| |S )Nz1Couldn't parse ASN.1 time as generalizedtime {!r})r   r   r   r   ZASN1_TIME_to_generalizedtimerI   rL   rA   r[   r   r   )r   Z	asn1_timer   r   r   r   _parse_asn1_time  s       r   c                 C   s"   t | | jd|}tj|dS )NzASN1_STRING *z%Y%m%d%H%M%SZ)r   r   rZ   datetimestrptime)r   r   timer   r   r   r   $  s
     r   c                 C   s0   | j d|}| j || jj}tt| |S r   )r   rZ   r[   r   r   r   Z	OCSPNoncerA   )r   noncer   r   r   _decode_nonce+  s    r   )sr   rD   Zcryptographyr   Zcryptography.hazmat._derr   r   r   r   Zcryptography.x509.extensionsr   Zcryptography.x509.namer	   Zcryptography.x509.oidr
   r   r   r   r   r%   r3   r:   r4   rX   r`   ra   objectrb   r   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Z_DISTPOINT_TYPE_RELATIVENAMEr   ZReasonFlagsZkey_compromiseZca_compromiseZaffiliation_changedZ
supersededZcessation_of_operationZcertificate_holdZprivilege_withdrawnZaa_compromiser   r   r   r   r   r   r   r   r   unspecifiedZremove_from_crlr   Z_CRL_ENTRY_REASON_ENUM_TO_CODEr   r   r   rN   r]   r   rA   r   strr   r   r   r   ZBASIC_CONSTRAINTSZSUBJECT_KEY_IDENTIFIERZ	KEY_USAGEZSUBJECT_ALTERNATIVE_NAMEZEXTENDED_KEY_USAGEZAUTHORITY_KEY_IDENTIFIERZAUTHORITY_INFORMATION_ACCESSZSUBJECT_INFORMATION_ACCESSZCERTIFICATE_POLICIESZCRL_DISTRIBUTION_POINTSZFRESHEST_CRLZOCSP_NO_CHECKZINHIBIT_ANY_POLICYZISSUER_ALTERNATIVE_NAMEZNAME_CONSTRAINTSZPOLICY_CONSTRAINTSZ_EXTENSION_HANDLERS_BASEZ%PRECERT_SIGNED_CERTIFICATE_TIMESTAMPSZ_EXTENSION_HANDLERS_SCTZ
CRL_REASONZINVALIDITY_DATEZCERTIFICATE_ISSUERZ_REVOKED_EXTENSION_HANDLERSZ
CRL_NUMBERZDELTA_CRL_INDICATORZISSUING_DISTRIBUTION_POINTZ_CRL_EXTENSION_HANDLERSZNONCEZ_OCSP_REQ_EXTENSION_HANDLERSZ"_OCSP_BASICRESP_EXTENSION_HANDLERSZSIGNED_CERTIFICATE_TIMESTAMPSZ'_OCSP_SINGLERESP_EXTENSION_HANDLERS_SCTr   r   r   r   <module>   sF  NQ!

-
          
                         