ó
    ùÞ j»,  ã                   ó  • S SK r S SKrS SKrS SKJrJr  S SKrS SKrS SKJ	r	J
r
  S SKJr  S SKJr  S SKJr  S SKJrJr  S SKJr  S S	KJr  S S
KJrJr  S SKJrJr  S SKJr  S SKJ r J!r!  S r"SS jr#S r$S r%SS jr& " S S5      r'g)é    N)ÚurljoinÚurlparse)ÚhazmatÚx509)ÚInvalidSignature)Úbackends)ÚDSAPublicKey)ÚECDSAÚEllipticCurvePublicKey)ÚPKCS1v15)ÚRSAPublicKey)ÚSHA1ÚHash)ÚEncodingÚPublicFormat)Úocsp)ÚAuthorizationErrorÚConnectionErrorc                 ór  • U R                  5       n [        U[        5      (       a;  UR                  UR                  UR
                  [        5       UR                  5        g [        U[        5      (       a2  UR                  UR                  UR
                  UR                  5        g [        U[        5      (       a;  UR                  UR                  UR
                  [        UR                  5      5        g UR                  UR                  UR
                  5        g ! [         a    [        S5      ef = f)Nzfailed to valid ocsp response)Ú
public_keyÚ
isinstancer   ÚverifyÚ	signatureÚtbs_response_bytesr   Úsignature_hash_algorithmr	   r   r
   r   r   )Úissuer_certÚocsp_responseÚpubkeys      ÚD/var/www/html/gaurav/venv/lib/python3.13/site-packages/redis/ocsp.pyÚ_verify_responser       s÷   € Ø×#Ñ#Ó%€Fð?Ü�fœl×+Ñ+Ø�M‰MØ×'Ñ'Ø×0Ñ0Ü“
Ø×6Ñ6õ	ô ˜¤×-Ñ-Ø�M‰MØ×'Ñ'Ø×0Ñ0Ø×6Ñ6õô
 ˜Ô 6×7Ñ7Ø�M‰MØ×'Ñ'Ø×0Ñ0Ü�m×<Ñ<Ó=õð �M‰M˜-×1Ñ1°=×3SÑ3SÕTøÜó ?ÜÐ=Ó>Ð>ð?ús    ’AD  Á"AD  Â)AD  Ã9&D  Ä D6c                 óœ  • [         R                  " U5      nUR                  [         R                  R                  :X  a  [        S5      eUR                  [         R                  R                  :X  a]  UR                  [         R                  R                  :w  a4  [        S[        UR                  5      R                  S5      S    S35      eO[        S5      eUR                  [        R                  R                  5       :¼  a  [        S5      eUR                   (       a7  UR                   [        R                  R                  5       :  a  [        S5      eUR"                  nUR$                  nUR&                  nU nUb  X@R(                  :X  d  Xe:X  a  U nO‰UR*                  n[-        X€XF5      n	 U	S	   n
U
R0                  R3                  [4        R6                  5      nUb2  [4        R8                  R:                  R<                  UR>                  ;  a  [        S5      eU
nU(       a  [A        Xs5        g! [.         a    [        S
5      ef = f)z=A wrapper the return the validity of a known ocsp certificatez4you are not authorized to view this ocsp certificatezReceived an Ú.é   z ocsp certificate statusz@failed to retrieve a successful response from the ocsp responderz)ocsp certificate was issued in the futurez1ocsp certificate has invalid update - in the pastr   z'no certificates found for the responderz'delegate not autorized for ocsp signingT)!r   Úload_der_ocsp_responseÚresponse_statusÚOCSPResponseStatusÚUNAUTHORIZEDr   Ú
SUCCESSFULÚcertificate_statusÚOCSPCertStatusÚGOODr   ÚstrÚsplitÚthis_updateÚdatetimeÚnowÚnext_updateÚresponder_nameÚissuer_key_hashÚresponder_key_hashÚsubjectÚcertificatesÚ_get_certificatesÚ
IndexErrorÚ
extensionsÚget_extension_for_classr   ÚExtendedKeyUsageÚoidÚExtendedKeyUsageOIDÚOCSP_SIGNINGÚvaluer    )r   Ú
ocsp_bytesÚvalidater   r2   Úissuer_hashÚresponder_hashÚcert_to_validateÚcertsÚresponder_certsÚresponder_certÚexts               r   Ú_check_certificaterI   1   s  € ô ×/Ò/°
Ó;€Mà×$Ñ$¬×(?Ñ(?×(LÑ(LÓLÜ Ð!WÓXÐXØ×$Ñ$¬×(?Ñ(?×(JÑ(JÓJØ×+Ñ+¬t×/BÑ/B×/GÑ/GÓGÜ!Øœs =×#CÑ#CÓD×JÑJÈ3ÓOÐPQÑRÐSð T*ð *óð ð Hô ØNó
ð 	
ð × Ñ ¤H×$5Ñ$5×$9Ñ$9Ó$;Ó;ÜÐIÓJÐJð 	×!×!Ø×%Ñ%¬×(9Ñ(9×(=Ñ(=Ó(?Ó?äÐQÓRÐRà"×1Ñ1€NØ×/Ñ/€KØ"×5Ñ5€Nà"ÐàÑ"Ø×1Ñ1Ó1ØÓ(à&Ñà×*Ñ*ˆÜ+Ø ó
ˆð	MØ,¨QÑ/ˆNð ×'Ñ'×?Ñ?Ä×@UÑ@UÓVˆØ‰;œ$Ÿ(™(×6Ñ6×CÑCÈ3Ï9É9ÓTÜ!Ð"KÓLÐLØ)ÐæÜÐ)Ô9Øøô ó 	MÜ!Ð"KÓLÐLð	Mús   Æ2H5 È5Ic                 ó  • Uc@  U  Vs/ sH2  n[        U5      U:X  d  M  UR                  UR                  :X  d  M0  UPM4     nnU$ U  Vs/ sH3  nUR                  U:X  d  M  UR                  UR                  :X  d  M1  UPM5     nnU$ s  snf s  snf ©N)Ú_get_pubkey_hashÚissuerr5   )rE   r   r2   rC   Úcr6   s         r   r7   r7   l   s­   € ØÑñ ó
á�Ü Ó" nÑ4ó à9:¿¹À[×EXÑEXÑ9X÷ Ùð 	ð 
ð Ðñ	 ó
á�Ø�y‰y˜NÑ*ó à/0¯x©x¸;×;NÑ;NÑ/N÷ Ùð 	ð 
ð Ðùò
ùò
s!   ˆBžBºBÁB
ÁB
Á;B
c                 ó  • U R                  5       n[        U[        5      (       a/  UR                  [        R
                  [        R                  5      nOr[        U[        5      (       a/  UR                  [        R                  [        R                  5      nO.UR                  [        R
                  [        R                  5      n[        [        5       [        R                  " 5       S9nUR!                  U5        UR#                  5       $ )N)Úbackend)r   r   r   Úpublic_bytesr   ÚDERr   ÚPKCS1r   ÚX962ÚUncompressedPointÚSubjectPublicKeyInfor   r   r   Údefault_backendÚupdateÚfinalize)Úcertificater   ÚhÚsha1s       r   rL   rL   }   s¯   € Ø×#Ñ#Ó%€Fô �&œ,×'Ñ'Ø×Ñ¤§¡¬l×.@Ñ.@ÓA‰Ü	�FÔ2×	3Ñ	3Ø×Ñ¤§¡¬|×/MÑ/MÓN‰à×Ñ¤§¡¬l×.OÑ.OÓPˆä”“¤× 8Ò 8Ó :Ñ;€DØ‡K�K�„NØ�=‰=‹?Ðó    c                 ór  • US;   a  [        S5      eSnU R                  5       R                  5       nU R                  5        H1  nUR                  5       nUR                  UR
                  :X  d  M/  Un  O   Uc  [        S5      eUb&  [        R                  " U5      nXG:w  a  [        S5      e[        X15      $ )zÀAn implementation of a function for set_ocsp_client_callback in PyOpenSSL.

This function validates that the provide ocsp_bytes response is valid,
and matches the expected, stapled responses.
)r]   Nzno ocsp response presentNz2no matching issuer cert found in certificate chainz/received and expected certificates do not match)	r   Úget_peer_certificateÚto_cryptographyÚget_peer_cert_chainr5   rM   r   Úload_pem_x509_certificaterI   )Úconr@   Úexpectedr   Ú	peer_certrN   ÚcertÚes           r   Úocsp_staple_verifierrh   �   sµ   € ð �[Ó ÜÐ8Ó9Ð9à€KØ×(Ñ(Ó*×:Ñ:Ó<€IØ×$Ñ$Ö&ˆØ× Ñ Ó"ˆØ�<‰<˜9×+Ñ+Õ+ØˆKÙñ	 'ð ÑÜÐRÓSÐSàÑÜ×*Ò*¨8Ó4ˆØ‹>Ü!Ð"SÓTÐTä˜kÓ6Ð6r]   c                   óL   • \ rS rSrSrSS jrS rS rS rS r	S	 r
S
 rS rSrg)ÚOCSPVerifieré©   z÷A class to verify ssl sockets for RFC6960/RFC6961. This can be used
when using direct validation of OCSP responses and certificate revocations.

@see https://datatracker.ietf.org/doc/html/rfc6960
@see https://datatracker.ietf.org/doc/html/rfc6961
Nc                 ó4   • Xl         X l        X0l        X@l        g rK   )ÚSOCKÚHOSTÚPORTÚCA_CERTS)ÚselfÚsockÚhostÚportÚca_certss        r   Ú__init__ÚOCSPVerifier.__init__±   s   € ØŒ	ØŒ	ØŒ	Ø �r]   c                 ó¢   • [         R                  " U5      n[        R                  " UR	                  5       [
        R                  " 5       5      nU$ )z?Convert SSL certificates in a binary (DER) format to ASCII PEM.)ÚsslÚDER_cert_to_PEM_certr   rb   Úencoder   rW   )rq   ÚderÚpemrf   s       r   Ú
_bin2asciiÚOCSPVerifier._bin2ascii·   s:   € ô ×&Ò& sÓ+ˆÜ×-Ò-¨c¯j©j«l¼H×<TÒ<TÓ<VÓWˆØˆr]   c                 óœ   • U R                   R                  S5      nUSL a  [        S5      eU R                  U5      nU R	                  U5      $ )zƒThis function returns the certificate, primary issuer, and primary ocsp
server in the chain for a socket already wrapped with ssl.
TFz!no certificate found for ssl peer)rm   Úgetpeercertr   r~   Ú_certificate_components)rq   r|   rf   s      r   Úcomponents_from_socketÚ#OCSPVerifier.components_from_socket¾   sJ   € ð �i‰i×#Ñ# DÓ)ˆØ�%Š<Ü!Ð"EÓFÐFØ�‰˜sÓ#ˆØ×+Ñ+¨DÓ1Ð1r]   c                 óî  •  UR                   R                  [        R                  R                  R
                  5      R                  nU Vs/ sH9  nUR                  [        R                  R                  R                  :X  d  M7  UPM;     nn US   R                  R                  nU Vs/ sH9  nUR                  [        R                  R                  R                  :X  d  M7  UPM;     nn US   R                  R                  nXU4$ ! [        R                  R                   R                   a    [        S5      ef = fs  snf ! [         a    Sn N­f = fs  snf ! [         a    [        S5      ef = f)z¬Given an SSL certificate, retract the useful components for
validating the certificate status with an OCSP server.

Args:
    cert ([bytes]): A PEM encoded ssl certificate
z-No AIA information present in ssl certificater   Nzno ocsp servers in certificate)r9   Úget_extension_for_oidr   r<   ÚExtensionOIDÚAUTHORITY_INFORMATION_ACCESSr?   ÚcryptographyÚExtensionNotFoundr   Úaccess_methodÚAuthorityInformationAccessOIDÚ
CA_ISSUERSÚaccess_locationr8   ÚOCSP)rq   rf   ÚaiaÚiÚissuersrM   Úocspsr   s           r   r‚   Ú$OCSPVerifier._certificate_componentsÊ   sc  € ð	SØ—/‘/×7Ñ7Ü—‘×%Ñ%×BÑBóç‰eð ñ ó
á�Ø�‰¤$§(¡(×"HÑ"H×"SÑ"SÑS÷ Ùð 	ð 
ð
	Ø˜Q‘Z×/Ñ/×5Ñ5ˆFñ ó
á�Ø�‰¤$§(¡(×"HÑ"H×"MÑ"MÑM÷ Ùð 	ð 
ð	DØ˜‘8×+Ñ+×1Ñ1ˆDð ˜TÐ!Ð!øô5 × Ñ ×+Ñ+×=Ñ=ó 	SÜ!Ð"QÓRÐRð	Süò
øô ó 	ØŠFð	üò
øô ó 	DÜ!Ð"BÓCÐCð	DúsB   ‚AD Á5EÂEÂE Â,5EÃ%EÃ.E Ä4D?ÅEÅEÅE4c                 óþ   • [         R                  " U R                  U R                  4U R                  S9n[
        R                  " UR                  5       [        R                  " 5       5      nU R                  U5      $ )z¶Return the certificate, primary issuer, and primary ocsp server
from the host defined by the socket. This is useful in cases where
different certificates are occasionally presented.
)ru   )ry   Úget_server_certificatern   ro   rp   r   rb   r{   r   rW   r‚   )rq   r}   rf   s      r   Ú!components_from_direct_connectionÚ.OCSPVerifier.components_from_direct_connectionò   sY   € ô ×(Ò(¨$¯)©)°T·Y±YÐ)?È$Ï-É-ÑXˆÜ×-Ò-¨c¯j©j«l¼H×<TÒ<TÓ<VÓWˆØ×+Ñ+¨DÓ1Ð1r]   c                 óª  • [         R                  " 5       nUR                  X#[        R                  R
                  R                  R                  5       5      nUR                  5       n[        R                  " UR                  [        R
                  R                  R                  R                  5      5      n[        XR!                  S5      5      nU$ )z#Return the complete url to the ocspÚascii)r   ÚOCSPRequestBuilderÚadd_certificater‰   r   Ú
primitivesÚhashesÚSHA256ÚbuildÚbase64Ú	b64encoderQ   Úserializationr   rR   r   Údecode)rq   Úserverrf   r   ÚorbÚrequestÚpathÚurls           r   Úbuild_certificate_urlÚ"OCSPVerifier.build_certificate_urlü   sŸ   € ä×%Ò%Ó'ˆð ×!Ñ!Øœ|×2Ñ2×=Ñ=×DÑD×KÑKÓMó
ˆð —)‘)“+ˆä×ÒØ× Ñ ¤×!2Ñ!2×!@Ñ!@×!IÑ!I×!MÑ!MÓNó
ˆô �fŸk™k¨'Ó2Ó3ˆØˆ
r]   c                 ó€  • [         R                  " U5      nUR                  (       d  [        S5      eUR                  nU R                  U5      nU R                  XU5      n[        U5      R                  SS.n[         R                  " XxS9nUR                  (       d  [        S5      e[        XdR                  S5      $ )z3Checks the validity of an ocsp server for an issuerz"failed to fetch issuer certificatezapplication/ocsp-request)ÚHostzContent-Type)Úheadersz failed to fetch ocsp certificateT)
ÚrequestsÚgetÚokr   Úcontentr~   rª   r   ÚnetlocrI   )	rq   r¥   rf   Ú
issuer_urlÚrr|   r   Úocsp_urlÚheaders	            r   Úcheck_certificateÚOCSPVerifier.check_certificate  sœ   € ô �LŠL˜Ó$ˆØ�t�tÜ!Ð"FÓGÐGØ�i‰iˆØ—o‘o cÓ*ˆà×-Ñ-¨f¸KÓHˆô ˜XÓ&×-Ñ-Ø6ñ
ˆô �LŠL˜Ñ2ˆØ�t�tÜ!Ð"DÓEÐEÜ! +¯y©y¸$Ó?Ð?r]   c                 óð   •  U R                  5       u  pnUc  [        S5      eU R                  X1U5      $ ! [         a6    U R	                  5       u  pnUc  [        S5      eU R                  X1U5      s $ f = f)a  Returns the validity of the certificate wrapping our socket.
This first retrieves for validate the certificate, issuer_url,
and ocsp_server for certificate validate. Then retrieves the
issuer certificate from the issuer_url, and finally checks
the validity of OCSP revocation status.
z%no issuers found in certificate chain)rƒ   r   r¸   r   r—   )rq   rf   r´   Úocsp_servers       r   Úis_validÚOCSPVerifier.is_valid!  s‰   € ð		IØ,0×,GÑ,GÓ,IÑ)ˆD˜kØÑ!Ü%Ð&MÓNÐNØ×)Ñ)¨+¸ZÓHÐHøÜ!ó 	IØ,0×,RÑ,RÓ,TÑ)ˆD˜kØÑ!Ü%Ð&MÓNÐNØ×)Ñ)¨+¸ZÓHÒHð		Iús   ‚25 µ=A5Á4A5)rp   rn   ro   rm   rK   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rv   r~   rƒ   r‚   r—   rª   r¸   r¼   Ú__static_attributes__© r]   r   rj   rj   ©   s2   † ñô!òò
2ò&"òP2òò @õ*Ir]   rj   )TrK   )(r¡   r/   ry   Úurllib.parser   r   Ú%cryptography.hazmat.primitives.hashesr‰   r¯   r   r   Úcryptography.exceptionsr   Úcryptography.hazmatr   Ú-cryptography.hazmat.primitives.asymmetric.dsar	   Ú,cryptography.hazmat.primitives.asymmetric.ecr
   r   Ú1cryptography.hazmat.primitives.asymmetric.paddingr   Ú-cryptography.hazmat.primitives.asymmetric.rsar   r   r   Ú,cryptography.hazmat.primitives.serializationr   r   Úcryptography.x509r   Úredis.exceptionsr   r   r    rI   r7   rL   rh   rj   rÄ   r]   r   Ú<module>rÐ      s`   ðÛ Û Û 
ß *ã ,Û ß %Ý 4Ý (Ý Fß VÝ FÝ Fß <ß OÝ "ß @ò?ô88òvò"ô 7÷8JIò JIr]   