o
    vhX                     @   s\  d dl Z d dlmZ d dlmZ d dlmZmZmZ d dlm	Z	m
Z
mZ d dlmZ d dlmZ d dlmZ d d	l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mZmZm Z  d dl!m"Z" d dl#m$Z$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/ d dl0m1Z1 d dl2m3Z3m4Z4m5Z5 dZ6dej7dede"fddZ8dej7dedede"def
ddZ9dej7fddZ:eG d d! d!e,Z;d"eej7e	j<f ded#e.d$e;d%e=f
d&d'Z>d#e.d(e(d$e;d%eej7 fd)d*Z?dej7ded+e=d%ee= fd,d-Z@dej7ded.e"d#e.ded+e=d$e;ded%e=fd/d0ZAd#e.ded1ee d%e=fd2d3ZBd4ed#e.d$e;d%e=fd5d6ZCd"eej7e	j<f ded#e.d(e(d$e;d%eej7 fd7d8ZDd"eej7e	j<f ded9e"d#e.ded$e;ded%e=fd:d;ZE	dGd"eej7e	j<f d9e"dedee fd<d=ZFed>d?G d@dA dAZGed>d?G dBdC dCZH	dGd"eej7e	j<f d9e"dDe1d1edee d%eHfdEdFZIdS )H    N)	dataclass)datetime)ListOptionalUnion)cmscrlx509)	CRLReason)PublicKeyInfo)InvalidSignature)ValProcState)	AuthorityAuthorityWithCertTrustAnchor)ValidationContext)OCSPNoMatchesErrorOCSPValidationError OCSPValidationIndeterminateErrorPathValidationErrorPSSParameterMismatchRevokedError)ValidationPath)CertRevTrustPolicyRevocationCheckingPolicyRevocationCheckingRule)CertificateCollectionLayeredCertificateStoreSimpleCertificateStore)Errors)OCSPContainerRevinfoUsabilityRating)RevinfoManager)ConsListextract_ac_issuer_dir_namevalidate_sigzXUnable to verify OCSP response since response signing certificate could not be validatedresponder_certissueree_pathc                 C   s2   t |tr||j| }|S tt|g | d}|S )Ntrust_anchorintermleaf)
isinstancer   truncate_to_and_appendcertificater   r   )r&   r'   r(   responder_chain r1   i/var/www/html/hyperkenya/venv/lib/python3.10/site-packages/pyhanko_certvalidator/revinfo/validate_ocsp.py_delegated_ocsp_response_path6   s   

r3   validation_context
proc_statec              
      sX  | | rtd| jj |ddlm} |jddd }| jd ur}t	t
tjtjdd}tt|gd	||j|j|jd
}tt|g | d}	t|j|	|d}
z|||	|
dI d H  W n tyn } ztt|d }~ww t| ||}|| | d S t| ||}t|j||d}z||||dI d H  W d S  ty } ztt|d }~ww )NzVRecursion detected in OCSP responder authorisation check for responder certificate %s.r   )intl_validate_pathT)	never_defz OCSP responder)ee_certificate_ruleintermediate_ca_cert_rule)revocation_checking_policyF)trust_rootsallow_fetchingrevinfo_policymomentalgorithm_usage_policytime_tolerancer)   )cert_path_stackee_name_override)pathr5   )check_path_verif_recursionr   
from_statesubjecthuman_friendlypyhanko_certvalidator.validater6   describe_certocsp_no_check_valuer   r   r   NO_CHECKr   r   r>   algorithm_policyr@   r   r   rA   consr   OCSP_PROVENANCE_ERRr3   record_validation)r&   r'   r4   r(   r5   r6   ocsp_ee_name_overrider=   vcocsp_trunc_pathocsp_trunc_proc_stateer0   ocsp_proc_stater1   r1   r2   #_validate_delegated_ocsp_provenanceD   s|   

	




rV   c                 C   s   | j }|d uod|jv S )Nocsp_signing)extended_key_usage_valuenative)r&   extended_key_usager1   r1   r2   _ocsp_allowed   s   r[   c                   @   s   e Zd ZU dZeed< dS )	_OCSPErrsr   mismatch_failuresN)__name__
__module____qualname__r]   int__annotations__r1   r1   r1   r2   r\      s   
 r\   certocsp_responseerrsreturnc                 C   s  |  }|d u r| jd7  _dS |d }|d d j}t| tj}|r.t| j|}| j}	nt	| }
t|
|}| d d j}	t|j
|}|d j|k}|d	 j|k}|d j|	k}|s]|rh|rh| jd7  _dS |rr|d
| dS |r||d| dS |r|d| dS dS )N   Fcert_idhash_algorithm	algorithmac_infoserial_numberissuer_key_hashissuer_name_hashz-OCSP response issuer name hash does not matchz6OCSP response certificate serial number does not matchz,OCSP response issuer key hash does not matchT)extract_single_responser]   rY   r-   r	   Certificategetattrr'   rl   r$   
public_keyappend)rc   r'   rd   re   cert_responseresponse_cert_idissuer_hash_algois_pkccert_issuer_name_hashcert_serial_numberiss_namecert_issuer_key_hashkey_hash_mismatchname_mismatchserial_mismatchr1   r1   r2   _match_ocsp_certid   sP   
r   
cert_storec                 C   s   |   }|d us
J |d rtt|d |g}|d }|d jdkr/|d j}||}n||d j}|r=|d nd }|sG|	d|  |S )Ncertstbs_response_dataresponder_idby_keyr   zVUnable to verify OCSP response since response signing certificate could not be located)
extract_basic_ocsp_responser   r   
from_certsnamerY   retrieve_by_key_identifierretrieve_by_namechosenrs   )rd   r   re   responsetbs_responsekey_identifierr&   candidate_responder_certsr1   r1   r2   _identify_responder_cert   s*   	
r   rw   c                 C   sR   t |tr|jj| jkr|j}t|d }t| d }||kS t| r%|s'dS dS )z
    This function checks OCSP conditions that don't require path validation
    to pass. If ``None`` is returned, path validation is necessary to proceed.
    signature_valueFN)r-   r   r/   issuer_serialbytesr[   )r&   r'   rw   issuer_cert
issuer_sigresponder_sigr1   r1   r2   _precheck_ocsp_responder_auth  s   r   	cert_pathc              
      s   t | ||}|d ur|}	n.zt| ||||dI d H  d}	W n ty; }
 z||
jd | d}	W Y d }
~
nd }
~
ww |	sD|d| |	S )N)r&   r'   r4   r(   r5   Tr   FzWUnable to verify OCSP response since response was signed by an unauthorized certificate)r   rV   r   rs   args)r&   r'   r   rd   r4   rw   re   r5   simple_checkauth_okrT   r1   r1   r2   _check_ocsp_authorisation/  s0   
r   control_timec                 C   s   |   }|d u r
dS |d j}|dkrdS |dkrB|d j}|d }|jd u r,td}|d j}|d u s9||krBtj||d	|d
dS )NFcert_statusgoodTrevokedrevocation_reasonunspecifiedrevocation_timezOCSP response)reasonrevocation_dtrevinfo_typer5   )ro   r   r   rY   r   r
   r   format)rd   r5   r   rt   statusrevocation_infor   r   r1   r1   r2   _check_ocsp_statusT  s(   




r   responder_keyc                 C   s   |  }|d u r
dS |d }zt|d j| |d | |d d d W dS  ty5   |d| Y dS  tyD   |d	| Y dS w )
NFr   	signaturesignature_algorithm
parameters)r   signed_datasigned_digest_algorithmpublic_key_infor   Tz\The signature parameters on the OCSP response do not match the constraints on the public keyz(Unable to verify OCSP response signature)r   r%   rY   dumpr   rs   r   )r   rd   re   r   r   r1   r1   r2   _verify_ocsp_signatures  s.   
r   c                 C   sJ   t | |||d}|sd S t|||d}|sd S t|j||d}|s#d S |S )N)r'   rd   re   )r   re   )r   rd   re   )r   r   r   rr   )rc   r'   rd   r   re   matchedr&   signature_okr1   r1   r2   _assess_ocsp_relevance  s$   r   rC   c              
      s   t | |||j|d}|d u rdS |j|j|jd}|j}	|	tjkrD|	tjkr0d}
|	|j
 n
|	tjkr8d}
nd}
|j|
|dd dS t|||||t| tj||d	I d H }|s[dS |j}|jrd|jnd }t|||S )
Nrc   r'   rd   r   re   F)policytiming_paramsz"OCSP response is not recent enoughzOCSP response is too recentz0OCSP response freshness could not be establishedT)is_freshness_failure)r'   r   rd   r4   rw   re   r5   )r   certificate_registry	usable_atr=   r   ratingr!   OKSTALEupdate_stalelast_usable_atTOO_NEWrs   r   r-   r	   rp   point_in_time_validationvalidation_timer   )rc   r'   rC   rd   r4   re   r5   r&   freshness_resultr   msg
authorisedtimingr   r1   r1   r2   _handle_single_ocsp_resp  sP   	




r   c                    s"  |p
t t|d}| }z|| }W n ty$   td| w t }|j	| |I dH }|D ]9}zt
| ||||||dI dH }	|	rKW  dS W q4 tym }
 zd}tj||
d ||| W Y d}
~
q4d}
~
ww |jt|kr}td| dtd	| d
|j|jr|jddd)aa  
    Verifies an OCSP response, checking to make sure the certificate has not
    been revoked. Fulfills the requirements of
    https://tools.ietf.org/html/rfc6960#section-3.2.

    :param cert:
        An asn1cyrpto.x509.Certificate object or
        an asn1crypto.cms.AttributeCertificateV2 object to verify the OCSP
        response for

    :param path:
        A pyhanko_certvalidator.path.ValidationPath object of the cert's
        validation path, or in the case of an AC, the AA's validation path.

    :param validation_context:
        A pyhanko_certvalidator.context.ValidationContext object to use for
        caching validation information

    :param proc_state:
        Internal state for error reporting and policy application decisions.

    :raises:
        pyhanko_certvalidator.errors.OCSPNoMatchesError - when none of the OCSP responses match the certificate
        pyhanko_certvalidator.errors.OCSPValidationIndeterminateError - when the OCSP response could not be verified
        pyhanko_certvalidator.errors.RevokedError - when the OCSP response indicates the certificate has been revoked
    rA   z6Could not determine issuer certificate for %s in path.N)rc   r'   rC   rd   r4   re   r5   8Generic processing error while validating OCSP response.exc_infoz"No OCSP responses were issued for .zUnable to determine if z@ is revoked due to insufficient information from OCSP responses.)failuressuspect_stale)r   r#   singrI   find_issuing_authorityLookupErrorr   r\   revinfo_managerasync_retrieve_ocspsr   
ValueErrorloggingdebugrs   r]   lenr   r   freshness_failures_onlystale_last_usable_at)rc   rC   r4   r5   cert_descriptioncert_issuerre   ocsp_responsesrd   	ocsp_goodrT   r   r1   r1   r2   verify_ocsp_response  s^   !	


r   T)frozenc                   @   s   e Zd ZU eed< eed< dS )OCSPResponseOfInterestrd   	prov_pathN)r^   r_   r`   r    rb   r   r1   r1   r1   r2   r   :  s   
 r   c                   @   s,   e Zd ZU dZee ed< 	 ee ed< dS )OCSPCollectionResultzd
    The result of an OCSP collection operation for AdES point-in-time
    validation purposes.
    	responsesfailure_msgsN)r^   r_   r`   __doc__r   r   rb   strr1   r1   r1   r2   r   @  s   
 r   r   c                    s:  |p
t t|d}z|| }W n ty#   td|  dw g }|| |I dH }|j}t	 }	|D ]Y}
|
j
}|du sJ||ksJ||
 |krKq7z$t| ||
|j|	d}|du r\W q7t|||d}t|
|d}|| W q7 ty } zd}tj||d	 |	||
 W Y d}~q7d}~ww t|d
d |	jD dS )a5  
    Collect potentially relevant OCSP responses with the associated validation
    paths. Will not perform actual path validation.

    :param cert:
        The certificate under scrutiny.
    :param path:
        The path currently being evaluated.
    :param revinfo_manager:
        The revocation info manager.
    :param control_time:
        The control time before which the validation info should have been
        issued.
    :param proc_state:
        The state of any prior validation process.
    :return:
        A :class:`.OCSPCollectionResult`.
    r   z+Could not determine issuer certificate for z	 in path.Nr   )r(   )rd   r   r   r   c                 S   s   g | ]}|d  qS )r   r1   ).0fr1   r1   r2   
<listcomp>  s    z9collect_relevant_responses_with_paths.<locals>.<listcomp>)r   r   )r   r#   r   r   r   r   rI   r   poe_managerr\   issuance_dater   r   r3   r   rs   r   r   r   r   r   )rc   rC   r   r   r5   cert_issuer_authrelevantr   r   re   ocsp_response_contissuedr&   resultrT   r   r1   r1   r2   %collect_relevant_responses_with_pathsR  sd   
r   )N)Jr   dataclassesr   r   typingr   r   r   
asn1cryptor   r   r	   asn1crypto.crlr
   asn1crypto.keysr   cryptography.exceptionsr   pyhanko_certvalidator._stater   pyhanko_certvalidator.authorityr   r   r   pyhanko_certvalidator.contextr   pyhanko_certvalidator.errorsr   r   r   r   r   r   pyhanko_certvalidator.pathr   !pyhanko_certvalidator.policy_declr   r   r   pyhanko_certvalidator.registryr   r   r   )pyhanko_certvalidator.revinfo._err_gatherr   &pyhanko_certvalidator.revinfo.archivalr    r!   %pyhanko_certvalidator.revinfo.managerr"   pyhanko_certvalidator.utilr#   r$   r%   rN   rp   r3   rV   r[   r\   AttributeCertificateV2boolr   r   r   r   r   r   r   r   r   r   r   r   r1   r1   r1   r2   <module>   sL    

X
=
%
$	
%



<
U