Ë
    êU.j»,  ã                   ó
  — d dl Z d dlZd dlZd dlmZmZ d dlZd dlZd dlm	Z	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZmZ d dlmZ d d	lmZ d d
lmZmZ d dlmZmZ d dlmZ d dlm Z m!Z! d„ Z"dd„Z#d„ Z$d„ Z%dd„Z& G d„ d«      Z'y)é    N)ÚurljoinÚurlparse)ÚhazmatÚx509)ÚInvalidSignature)Úbackends)ÚDSAPublicKey)ÚECDSAÚEllipticCurvePublicKey)ÚPKCS1v15)ÚRSAPublicKey)ÚSHA1ÚHash)ÚEncodingÚPublicFormat)Úocsp)ÚAuthorizationErrorÚConnectionErrorc                 óR  — | j                  «       }	 t        |t        «      r;|j                  |j                  |j
                  t        «       |j                  «       y t        |t        «      r2|j                  |j                  |j
                  |j                  «       y t        |t        «      r;|j                  |j                  |j
                  t        |j                  «      «       y |j                  |j                  |j
                  «       y # t        $ r t        d«      ‚w xY w)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      úLC:\xampp\htdocs\tradingbinance\backend\.venv\Lib\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Ø�M‰MØ×'Ñ'Ø×0Ñ0Ü�m×<Ñ<Ó=õð �M‰M˜-×1Ñ1°=×3SÑ3SÕTøÜò ?ÜÐ=Ó>Ð>ð?ús    ’A
D ÁAD ÂA
D Ã*&D ÄD&c                 óv  — t        j                  |«      }|j                  t         j                  j                  k(  rt        d«      ‚|j                  t         j                  j                  k(  r[|j                  t         j                  j                  k7  r?t        dt        |j                  «      j                  d«      d   › d�«      ‚t        d«      ‚|j                  t        j                  j                  «       k\  rt        d«      ‚|j                   r6|j                   t        j                  j                  «       k  rt        d«      ‚|j"                  }|j$                  }|j&                  }| }|�|| j(                  k(  s||k(  r| }nˆ|j*                  }t-        || ||«      }		 |	d	   }
|
j0                  j3                  t4        j6                  «      }|�0t4        j8                  j:                  j<                  |j>                  vrt        d«      ‚|
}|rtA        ||«       y# t.        $ r t        d
«      ‚w xY w)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*ð *óð ô
 ØNó
ð 	
ð × Ñ ¤H×$5Ñ$5×$9Ñ$9Ó$;Ò;ÜÐIÓJÐJð 	×!Ò!Ø×%Ñ%¬×(9Ñ(9×(=Ñ(=Ó(?Ò?äÐQÓRÐRà"×1Ñ1€NØ×/Ñ/€KØ"×5Ñ5€Nà"ÐàÐ"Ø˜k×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   Æ'H# È#H8c                 óü   — |€8| D �cg c]+  }t        |«      |k(  r|j                  |j                  k(  r|‘Œ- }}|S | D �cg c],  }|j                  |k(  r|j                  |j                  k(  r|‘Œ. }}|S c c}w c c}w ©N)Ú_get_pubkey_hashÚissuerr5   )rE   r   r2   rC   Úcr6   s         r   r7   r7   l   s¡   € ØÐñ ó
á�Ü Ó" nÒ4¸¿¹À[×EXÑEXÒ9Xò Øð 	ð 
ð Ðñ	 ó
á�Ø�y‰y˜NÒ*¨q¯x©x¸;×;NÑ;NÒ/Nò Øð 	ð 
ð Ðùò
ùò
s
   ‡0A4¿1A9c                 ó
  — | j                  «       }t        |t        «      r/|j                  t        j
                  t        j                  «      }nmt        |t        «      r/|j                  t        j                  t        j                  «      }n.|j                  t        j
                  t        j                  «      }t        t        «       t        j                  «       ¬«      }|j!                  |«       |j#                  «       S )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Ø×Ñ¤§¡¬|×/MÑ/MÓN‰à×Ñ¤§¡¬l×.OÑ.OÓPˆä”“¤× 8Ñ 8Ó :Ô;€DØ‡K�K�„NØ�=‰=‹?Ðó    c                 ód  — |dv rt        d«      ‚d}| j                  «       j                  «       }| j                  «       D ]/  }|j                  «       }|j                  |j
                  k(  sŒ-|} n |€t        d«      ‚|�%t        j                  |«      }||k7  rt        d«      ‚t        ||«      S )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                   óB   — e Zd ZdZdd„Zd„ Zd„ Zd„ Zd„ Zd„ Z	d	„ Z
d
„ Zy)ÚOCSPVerifiera  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                 ó<   — || _         || _        || _        || _        y rK   )ÚSOCKÚHOSTÚPORTÚCA_CERTS)ÚselfÚsockÚhostÚportÚca_certss        r   Ú__init__zOCSPVerifier.__init__±   s   € ØˆŒ	ØˆŒ	ØˆŒ	Ø ˆ�r]   c                 óœ   — t        j                  |«      }t        j                  |j	                  «       t        j                  «       «      }|S )z?Convert SSL certificates in a binary (DER) format to ASCII PEM.)ÚsslÚDER_cert_to_PEM_certr   rb   Úencoder   rW   )rp   ÚderÚpemrf   s       r   Ú
_bin2asciizOCSPVerifier._bin2ascii·   s:   € ô ×&Ñ& sÓ+ˆÜ×-Ñ-¨c¯j©j«l¼H×<TÑ<TÓ<VÓWˆØˆr]   c                 óš   — | j                   j                  d«      }|du rt        d«      ‚| j                  |«      }| j	                  |«      S )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)rl   Úgetpeercertr   r|   Ú_certificate_components)rp   rz   rf   s      r   Úcomponents_from_socketz#OCSPVerifier.components_from_socket¾   sJ   € ð �i‰i×#Ñ# DÓ)ˆØ�%‰<Ü!Ð"EÓFÐFØ�‰˜sÓ#ˆØ×+Ñ+¨DÓ1Ð1r]   c                 óÖ  — 	 |j                   j                  t        j                  j                  j
                  «      j                  }|D �cg c]5  }|j                  t        j                  j                  j                  k(  r|‘Œ7 }}	 |d   j                  j                  }|D �cg c]5  }|j                  t        j                  j                  j                  k(  r|‘Œ7 }}	 |d   j                  j                  }|||fS # t        j                  j                   j                  $ r t        d«      ‚w xY wc c}w # t        $ r d}Y Œ§w xY wc c}w # t        $ r t        d«      ‚w xY w)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)rp   rf   ÚaiaÚiÚissuersrM   Úocspsr   s           r   r   z$OCSPVerifier._certificate_componentsÊ   se  € ð	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ð �V˜TÐ!Ð!øô5 × Ñ ×+Ñ+×=Ñ=ò 	SÜ!Ð"QÓRÐRð	Süò
øô ò 	ØŠFð	üò
øô ò 	DÜ!Ð"BÓCÐCð	Dús6   ‚AD Á:D8Â
D= Â':EÃ$E Ä3D5Ä=EÅ
EÅE(c                 óþ   — t        j                  | j                  | j                  f| j                  ¬«      }t        j                  |j                  «       t        j                  «       «      }| j                  |«      S )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.
        )rt   )rw   Úget_server_certificaterm   rn   ro   r   rb   ry   r   rW   r   )rp   r{   rf   s      r   Ú!components_from_direct_connectionz.OCSPVerifier.components_from_direct_connectionò   sY   € ô ×(Ñ(¨$¯)©)°T·Y±YÐ)?È$Ï-É-ÔXˆÜ×-Ñ-¨c¯j©j«l¼H×<TÑ<TÓ<VÓWˆØ×+Ñ+¨DÓ1Ð1r]   c                 óª  — t        j                  «       }|j                  ||t        j                  j
                  j                  j                  «       «      }|j                  «       }t        j                  |j                  t        j
                  j                  j                  j                  «      «      }t        ||j!                  d«      «      }|S )z#Return the complete url to the ocspÚascii)r   ÚOCSPRequestBuilderÚadd_certificater…   r   Ú
primitivesÚhashesÚSHA256ÚbuildÚbase64Ú	b64encoderQ   Úserializationr   rR   r   Údecode)rp   Úserverrf   r   ÚorbÚrequestÚpathÚurls           r   Úbuild_certificate_urlz"OCSPVerifier.build_certificate_urlü   s£   € ä×%Ñ%Ó'ˆð ×!Ñ!Ø�+œ|×2Ñ2×=Ñ=×DÑD×KÑKÓMó
ˆð —)‘)“+ˆä×ÑØ× Ñ ¤×!2Ñ!2×!@Ñ!@×!IÑ!I×!MÑ!MÓNó
ˆô �f˜dŸk™k¨'Ó2Ó3ˆØˆ
r]   c                 ót  — t        j                  |«      }|j                  st        d«      ‚|j                  }| j                  |«      }| j                  |||«      }t        |«      j                  ddœ}t        j                  ||¬«      }|j                  st        d«      ‚t        ||j                  d«      S )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   )	rp   rŸ   rf   Ú
issuer_urlÚrrz   r   Úocsp_urlÚheaders	            r   Úcheck_certificatezOCSPVerifier.check_certificate  s¢   € ô �L‰L˜Ó$ˆØ�tŠtÜ!Ð"FÓGÐGØ�i‰iˆØ—o‘o cÓ*ˆà×-Ñ-¨f°d¸KÓHˆô ˜XÓ&×-Ñ-Ø6ñ
ˆô �L‰L˜¨6Ô2ˆØ�tŠtÜ!Ð"DÓEÐEÜ! +¨q¯y©y¸$Ó?Ð?r]   c                 óò   — 	 | j                  «       \  }}}|€t        d«      ‚| j                  |||«      S # t        $ r7 | j	                  «       \  }}}|€t        d«      ‚| j                  |||«      cY S w xY w)aD  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’   )rp   rf   r­   Úocsp_servers       r   Úis_validzOCSPVerifier.is_valid!  s‘   € ð		IØ,0×,GÑ,GÓ,IÑ)ˆD�*˜kØÐ!Ü%Ð&MÓNÐNØ×)Ñ)¨+°t¸ZÓHÐHøÜ!ò 	IØ,0×,RÑ,RÓ,TÑ)ˆD�*˜kØÐ!Ü%Ð&MÓNÐNØ×)Ñ)¨+°t¸ZÓHÒHð		Iús   ‚36 ¶=A6Á5A6rK   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ru   r|   r€   r   r’   r¤   r±   r´   © r]   r   rj   rj   ©   s2   „ ñó!òò
2ò&"òP2òò @ó*Ir]   rj   )TrK   )(r›   r/   rw   Ú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]   