o
     `L~                     @   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 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+d0d1 Z,d2d3 Z-d4d5 Z.d6d7 Z/d8d9 Z0d:d; Z1d Z2d<Z3d=d> Z4ej5j6ej5j7ej5j8ej5j9ej5j:ej5j;ej5j<ej5j=d?Z>d@dA Z?dBdC Z@dDdE ZAdFdG ZBdHdI ZCdJdK ZDdLdM ZEdNdO ZFej5jGej5j6ej5j7ej5j8ej5j9ej5j:ej5j;ej5jHej5j<ej5j=dP
ZIej5jGd ej5j6d<ej5j7dQej5j8dRej5j9dSej5j:dTej5j;dUej5jHdVej5j<dWej5j=dXi
ZJdYdZ ZKd[d\ ZLd]d^ ZMd_d` ZNdadb ZOdcdd ZPdedf ZQdgdh ZRdidj ZSdkdl ZTdmdn ZUdodp ZVi ejWe#ejXe$ejYe)ejZe+ej[e1ej\e%ej]e'ej^e(ej_e!ej`eAejaeBejbeejceCejde,ejee-ejfe0ZgejheEiZiejjeKejkeLejleMiZmejneejoeej\e%ejde,ej]e'ejpe/ejaeBiZqejreViZsejreViZtejueFiZvdS )q    )absolute_importdivisionprint_functionN)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r,|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objZbuf_lenbufres r   home/ych/rk3568/buildroot/output/rockchip_rk3568/host/lib/python3.10/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_entry0   s   


r'   c           	      C   s   | j |}g }d}t|D ](}| j ||}t| |}| j |}||kr-||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>K   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_name<   s   
r5   c                 C   sR   | j |}g }t|D ]}| 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_namesN   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rDt| |jj}tt|S |j | jjkrt| |jj}t|}|dks^|dkrt|d |d  }t||d d  }tt|dd  }|d}|dkrt|}d||d  v rt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 )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	ipaddressZ
ip_addressbinintfind
ValueErrorZ
ip_networkZexplodedformatZ	IPAddressZGEN_DIRNAMEZDirectoryNamer5   ZdirectoryNameZ	GEN_EMAILZ
rfc822NameZ
RFC822NameZGEN_OTHERNAMEZ	otherNametype_id_asn1_to_derr%   Z	OtherNameZUnsupportedGeneralNameTypeZ_GENERAL_NAMESget)r   r;   r$   r&   Zdata_lenbaseZnetmaskbitsprefixiprL   r%   r   r   r   r6   Y   sZ   


r6   c                 C   s   t  S r    )r   ZOCSPNoCheckr   extr   r   r   _decode_ocsp_no_check   s   rU   c                 C   0   | j d|}| j || jj}tt| |S NzASN1_INTEGER *)r   castgcr   ASN1_INTEGER_freer   Z	CRLNumber_asn1_integer_to_intr   rT   asn1_intr   r   r   _decode_crl_number      r^   c                 C   rV   rW   )r   rX   rY   r   rZ   r   ZDeltaCRLIndicatorr[   r\   r   r   r   _decode_delta_crl_indicator   r_   r`   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   rb   rc   rd   r   r   r   __init__   s   
z_X509ExtensionParser.__init__c                 C   sb  g }t  }t| |D ]}| ||}| j|| jjjk | jj	|}|dk}t
t| j| jj|}||v rFt
d|||tjkr| jj|}	t| j|	}
t|
t}g }| ss||t  | ret
dd |D }|t
||| || q|tjkr| jj|}	tt| j|	}|t   |t
||t
!  || qz| j"| }W n9 t#y   | jj|}	| j|	| jjjk | jj$|	j%|	j&d d  }t
'||}|t
||| Y n,w | jj(|}|| jjjkr| j)  t*d||| j|}|t
||| || qt
+|S )Nr   zDuplicate {} extension foundc                 S   s   g | ]}t | qS r   r
   )r*   r2   r   r   r   
<listcomp>   s    z._X509ExtensionParser.parse.<locals>.<listcomp>z/The {} extension is invalid and can't be parsed),setr,   rb   rc   re   r   r   r   r   ZX509_EXTENSION_get_criticalr   r#   r   ZX509_EXTENSION_get_objectZDuplicateExtensionrK   r   ZTLS_FEATUREZX509_EXTENSION_get_datarC   r   Zread_single_elementr	   Zis_emptyr-   Zread_elementr   Z
as_integerZ
TLSFeature	Extensionr.   ZPRECERT_POISONZcheck_emptyZPrecertPoisonrd   KeyErrorr   r$   lengthZUnrecognizedExtensionZX509V3_EXT_d2iZ_consume_errorsrJ   Z
Extensions)rf   Zx509_obj
extensionsZ	seen_oidsr:   rT   Zcritcriticalr&   r$   Z
data_bytesfeaturesparsedr%   readerhandlerZderZunrecognizedZext_datar   r   r   parse   sx   






z_X509ExtensionParser.parseN)__name__
__module____qualname__rg   rs   r   r   r   r   ra      s    ra   c                 C   s2  | j d|}| j || jj}| j|}g }t|D ]w}d }| j||}t	t
| |j}|j| j jkr| j|j}g }t|D ]E}	| j|j|	}
t	t
| |
j}|tjkrv| j |
jjj|
jjjd d  d}|| qD|tjks}J t| |
jj}|| qD|t|| qt|S )Nz"Cryptography_STACK_OF_POLICYINFO *ascii)r   rX   rY   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   rD   cpsurir$   rl   r   r-   ZCPS_USER_NOTICE_decode_user_noticeZ
usernoticeZPolicyInformationZCertificatePolicies)r   cpr8   Zcertificate_policiesr:   rx   pir&   ZqnumjZpqiry   rz   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rIt| |jj}| j|jj}g }t	|D ]}| j
|jj|}t| |}	||	 q-t||}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   ZunZexplicit_textZnotice_referencer   r8   Znotice_numbersr:   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   rX   rY   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_constraintsA  s   
r   c                 C   s@   | j d|}| j || jj}t| j |j|j	d d  S NzASN1_OCTET_STRING *)
r   rX   rY   r   ASN1_OCTET_STRING_freer   ZSubjectKeyIdentifierr   r$   rl   r   asn1_stringr   r   r   _decode_subject_key_identifierQ  s   r   c                 C   s   | j d|}| j || jj}d }d }|j| j jkr*| j |jj|jj	d d  }|j
| j jkr7t| |j
}t| |j}t|||S )NzAUTHORITY_KEYID *)r   rX   rY   r   ZAUTHORITY_KEYID_freeZkeyidr   r   r$   rl   Zissuerr<   r   serialr   ZAuthorityKeyIdentifier)r   ZakidZkey_identifierZauthority_cert_issuerZauthority_cert_serial_numberr   r   r    _decode_authority_key_identifier[  s$   r   c                    s    j d|} j | fdd} j|}g }t|D ]5} 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   	addressofZ_original_lib)r2   r   r   r   <lambda>v  s    z,_decode_information_access.<locals>.<lambda>)r   rX   rY   r   Zsk_ACCESS_DESCRIPTION_numr,   Zsk_ACCESS_DESCRIPTION_valuer   methodr   r   r#   r   locationr6   r-   ZAccessDescription)r   iar8   access_descriptionsr:   adr&   r;   r   r   r   _decode_information_accessr  s   
	r   c                 C      t | |}t|S r    )r   r   ZAuthorityInformationAccessr   Zaiar   r   r   r   $_decode_authority_information_access     

r   c                 C   r   r    )r   r   ZSubjectInformationAccessr   r   r   r   "_decode_subject_information_access  r   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   rX   rY   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   rX   rY   r   GENERAL_NAMES_freer<   r   r7   Zgeneral_namesr   r   r   _decode_general_names_extension  s   
r   c                 C      t t| |S r    )r   ZSubjectAlternativeNamer   rS   r   r   r   _decode_subject_alt_name     r   c                 C   r   r    )r   ZIssuerAlternativeNamer   rS   r   r   r   _decode_issuer_alt_name  r   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   rX   rY   r   ZNAME_CONSTRAINTS_free_decode_general_subtreesZpermittedSubtreesZexcludedSubtreesr   ZNameConstraints)r   ZncZ	permittedZ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   r6   rO   r-   )r   Zstack_subtreesr8   Zsubtreesr:   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rFt| |j}nd }t|||||||S )NzISSUING_DIST_POINT *r   )r   rX   rY   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   rX   rY   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| |}|| qt
|S )Nz#Cryptography_STACK_OF_ASN1_OBJECT *)r   rX   rY   r   Zsk_ASN1_OBJECT_freeZsk_ASN1_OBJECT_numr,   Zsk_ASN1_OBJECT_valuer   r   r   r#   r   r-   ZExtendedKeyUsage)r   skr8   Zekusr:   r   r&   r   r   r   _decode_extended_key_usage  s   
r   r   c           
   	   C   s   | j d|}| j || jj}| j|}g }t|D ]E}d }d }d }d }| j||}	|	j| j j	kr:t
| |	j}|	j| j j	krGt| |	j}|	j| j j	krVt| |	j\}}|t|||| q|S )Nz"Cryptography_STACK_OF_DIST_POINT *)r   rX   rY   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   cdpsr8   dist_pointsr:   r   r   Z
crl_issuerr   Zcdpr   r   r   _decode_dist_points  s0   r   )r   r@   r   r   r   r   r   r>   c                 C   s8   g }t tD ]\}}| j||r|| qt|S r    )sixZ	iteritems_REASON_BIT_MAPPINGr   r   r-   	frozenset)r   r   Zenum_reasonsZbit_positionreasonr   r   r   r   S  s   
r   c           	      C   s   |j tkrt| |jj}|d fS |jj}| j|}t }t	|D ]}| j
||}| || jjk |t| | q!t|}d |fS r    )r"   _DISTPOINT_TYPE_FULLNAMEr<   r   fullnameZrelativenamer   Zsk_X509_NAME_ENTRY_numri   r,   Zsk_X509_NAME_ENTRY_valuer   r   r   r.   r'   r   r)   )	r   r   r   ZrnsZrnumr1   r:   Zrnr   r   r   r   r   ]  s   
	
r   c                 C   r   r    )r   r   ZCRLDistributionPointsr   r   r   r   r   r   _decode_crl_distribution_pointsv  r   r   c                 C   r   r    )r   r   ZFreshestCRLr   r   r   r   _decode_freshest_crl{  r   r   c                 C   4   | j d|}| j || jj}t| |}t|S rW   )r   rX   rY   r   rZ   r[   r   ZInhibitAnyPolicy)r   r]   Z
skip_certsr   r   r   _decode_inhibit_any_policy     

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   rX   rY   r   ZSCT_LIST_freer,   Z
sk_SCT_numZsk_SCT_valuer-   )r   	asn1_sctsr   Zsctsr:   Zsctr   r   r   _decode_scts  s   r   c                 C   r   r    )r   Z)PrecertificateSignedCertificateTimestampsr   r   r   r   r   r   -_decode_precert_signed_certificate_timestamps  r   r   c                 C   r   r    )r   ZSignedCertificateTimestampsr   r   r   r   r   %_decode_signed_certificate_timestamps     r   )
r   r   r@   r   r   r   r   r>   	   
   r@   r   r   r   r   r>   r   r   c                 C   sZ   | j d|}| j || jj}| j|}ztt| W S  t	y,   t
d|w )NzASN1_ENUMERATED *zUnsupported reason code: {})r   rX   rY   r   ZASN1_ENUMERATED_freeZASN1_ENUMERATED_getr   Z	CRLReason_CRL_ENTRY_REASON_CODE_TO_ENUMrk   rJ   rK   )r   enumcoder   r   r   _decode_crl_reason  s   r   c                 C   rV   )NzASN1_GENERALIZEDTIME *)r   rX   rY   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   r   r   )r   rX   rY   r   r   r<   r   ZCertificateIssuerr   r   r   r   _decode_cert_issuer  r   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                        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   rY   r   )r   Z	asn1_typer   r   r   r   r   rM     s   rM   c                 C   s@   | j || jj}| || jjk | j|| j j}| |S r    )r   ZASN1_INTEGER_to_BNr   r   r   rY   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 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$   rl   r   r   r   r   rC     s   rC   c                 C   s   t | |dS )Nrw   )rC   r   r   r   r   r   _asn1_string_to_ascii  r   r   c                    s~    j d} j||}|dkrt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                    r   r   r   r   r   r   r   r     r   z&_asn1_string_to_utf8.<locals>.<lambda>r=   )r   r   r   ZASN1_STRING_to_UTF8rJ   rK   r"   r   r   rY   r   r   )r   r   r   r   r   r   r   r!     s   
 r!   c                 C   s`   |  || jjk | j|| jj}|| jjkr"tdt| || j|| jj	}t
| |S )Nz1Couldn't parse ASN.1 time as generalizedtime {!r})r   r   r   r   ZASN1_TIME_to_generalizedtimerJ   rK   rC   rY   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   rX   datetimestrptime)r   r   timer   r   r   r   '  s   r   c                 C   s0   | j d|}| j || jj}tt| |S r   )r   rX   rY   r   r   r   Z	OCSPNoncerC   )r   Znoncer   r   r   _decode_nonce.  r_   r   )w
__future__r   r   r   r   rF   r   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'   r5   r<   r6   rU   r^   r`   objectra   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   rM   r[   r   rC   r   r!   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>   s&  NQ!

-


