Ë
    R>{i\?  ã                  ót  — d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlmZmZmZmZmZmZmZmZmZmZ  ej.                  dej0                  «      Zdd„Z	 	 	 	 dd„Zdd	„Zdd
„Zd d„Z	 d!	 	 	 	 	 d"d„Zd#d„Z d$d„Z!d$d„Z"d%d„Z#	 	 	 	 	 	 d&d„Z$d'd„Z%ddddddœZ&d(d„Z' G d„ d«      Z(y))a¦  
Low-level helpers for the SecureTransport bindings.

These are Python functions that are not directly related to the high-level APIs
but are necessary to get them to work. They include a whole bunch of low-level
CoreFoundation messing about and memory management. The concerns in this module
are almost entirely about trying to avoid memory leaks and providing
appropriate and useful assistance to the higher-level code.
é    )ÚannotationsNé   )
ÚCFArrayÚCFConstÚCFDataÚCFDictionaryÚCFMutableArrayÚCFStringÚ	CFTypeRefÚCoreFoundationÚSecKeychainRefÚSecuritys;   -----BEGIN CERTIFICATE-----
(.*?)
-----END CERTIFICATE-----c                ó^   — t        j                  t         j                  | t        | «      «      S )zv
    Given a bytestring, create a CFData object from it. This CFData object must
    be CFReleased by the caller.
    )r   ÚCFDataCreateÚkCFAllocatorDefaultÚlen)Ú
bytestrings    úh/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/urllib3/contrib/_securetransport/low_level.pyÚ_cf_data_from_bytesr   )   s(   € ô
 ×&Ñ&Ü×*Ñ*¨J¼¸J»óð ó    c                ó  — t        | «      }d„ | D «       }d„ | D «       }t        j                  |z  |Ž }t        j                  |z  |Ž }t        j                  t        j                  |||t        j
                  t        j                  «      S )zK
    Given a list of Python tuples, create an associated CFDictionary.
    c              3  ó&   K  — | ]	  }|d    –— Œ y­w)r   N© ©Ú.0Úts     r   ú	<genexpr>z-_cf_dictionary_from_tuples.<locals>.<genexpr><   s   è ø€ Ò!�QˆAˆa�DÑ!ùó   ‚c              3  ó&   K  — | ]	  }|d    –— Œ y­w)r   Nr   r   s     r   r   z-_cf_dictionary_from_tuples.<locals>.<genexpr>=   s   è ø€ Ò#�qˆa��dÑ#ùr   )r   r   r   ÚCFDictionaryCreater   ÚkCFTypeDictionaryKeyCallBacksÚkCFTypeDictionaryValueCallBacks)ÚtuplesÚdictionary_sizeÚkeysÚvaluesÚcf_keysÚ	cf_valuess         r   Ú_cf_dictionary_from_tuplesr)   3   s„   € ô ˜&“k€Oñ "˜&Ô!€DÙ#˜FÔ#€FÜ×'Ñ'¨/Ñ9¸DÐA€GÜ×)Ñ)¨OÑ;¸fÐE€Iä×,Ñ,Ü×*Ñ*ØØØÜ×4Ñ4Ü×6Ñ6óð r   c                ó–   — t        j                  | «      }t        j                  t        j                  |t
        j                  «      }|S )zi
    Given a Python binary data, create a CFString.
    The string must be CFReleased by the caller.
    )ÚctypesÚc_char_pr   ÚCFStringCreateWithCStringr   r   ÚkCFStringEncodingUTF8)Úpy_bstrÚc_strÚcf_strs      r   Ú_cfstrr2   K   s>   € ô
 �O‰O˜GÓ$€EÜ×5Ñ5Ü×*Ñ*ØÜ×%Ñ%ó€Fð
 €Mr   c                ó   — d}	 t        j                  t         j                  dt        j                  t         j
                  «      «      }|st        d«      ‚| D ]F  }t        |«      }|st        d«      ‚	 t        j                  ||«       t        j                  |«       ŒH 	 |S # t        j                  |«       w xY w# t        $ r5}|rt        j                  |«       t        j                  d|› �«      d‚d}~ww xY w)zª
    Given a list of Python binary data, create an associated CFMutableArray.
    The array must be CFReleased by the caller.

    Raises an ssl.SSLError on failure.
    Nr   úUnable to allocate memory!zUnable to allocate array: )r   ÚCFArrayCreateMutabler   r+   ÚbyrefÚkCFTypeArrayCallBacksÚMemoryErrorr2   ÚCFArrayAppendValueÚ	CFReleaseÚBaseExceptionÚsslÚSSLError)ÚlstÚcf_arrÚitemr1   Úes        r   Ú_create_cfstring_arrayrB   Y   sì   € ð €FðGÜ×4Ñ4Ü×.Ñ.ØÜ�L‰Lœ×=Ñ=Ó>ó
ˆñ
 ÜÐ:Ó;Ð;Øò 	1ˆDÜ˜D“\ˆFÙÜ!Ð">Ó?Ð?ð1Ü×1Ñ1°&¸&ÔAä×(Ñ(¨Õ0ñ	1ð €Møô ×(Ñ(¨Õ0ûÜò GÙÜ×$Ñ$ VÔ,Ü�l‰lÐ7¸°sÐ;Ó<À$ÐFûðGús0   „A0B? Á5B%ÂB? Â%B<Â<B? Â?	C=Ã0C8Ã8C=c                óŽ  — t        j                  | t        j                  t         j                  «      «      }t	        j
                  |t        j                  «      }|€Tt        j                  d«      }t	        j                  ||dt        j                  «      }|st        d«      ‚|j                  }|�|j                  d«      }|S )z¨
    Creates a Unicode string from a CFString object. Used entirely for error
    reporting.

    Yes, it annoys me quite a lot that this function is this complex.
    i   z'Error copying C string from CFStringRefúutf-8)r+   ÚcastÚPOINTERÚc_void_pr   ÚCFStringGetCStringPtrr   r.   Úcreate_string_bufferÚCFStringGetCStringÚOSErrorÚvalueÚdecode)rL   Úvalue_as_void_pÚstringÚbufferÚresults        r   Ú_cf_string_to_unicoderR   x   s¥   € ô —k‘k %¬¯©¼¿¹Ó)HÓI€Oä×1Ñ1Øœ×6Ñ6ó€Fð €~Ü×,Ñ,¨TÓ2ˆÜ×2Ñ2Ø˜V T¬7×+HÑ+Hó
ˆñ ÜÐCÓDÐDØ—‘ˆØÐØ—‘˜wÓ'ˆØ€Mr   c                óÆ   — | dk(  ryt        j                  | d«      }t        |«      }t        j                  |«       |�|dk(  rd| › �}|€t
        j                  } ||«      ‚)z[
    Checks the return code and throws an exception if there is an error to
    report
    r   NÚ z	OSStatus )r   ÚSecCopyErrorMessageStringrR   r   r:   r<   r=   )ÚerrorÚexception_classÚcf_error_stringÚoutputs       r   Ú_assert_no_errorrZ   ‘   si   € ð �‚zØä×8Ñ8¸ÀÓE€OÜ" ?Ó3€FÜ×Ñ˜_Ô-à€~˜ 2šØ˜U˜GÐ$ˆàÐÜŸ,™,ˆá
˜&Ó
!Ð!r   c                ó6  — | j                  dd«      } t        j                  | «      D �cg c]&  }t        j                  |j                  d«      «      ‘Œ( }}|st        j                  d«      ‚t        j                  t        j                  dt        j                  t        j                  «      «      }|st        j                  d«      ‚	 |D ]Ÿ  }t        |«      }|st        j                  d«      ‚t        j                   t        j                  |«      }t        j"                  |«       |st        j                  d«      ‚t        j$                  ||«       t        j"                  |«       Œ¡ 	 |S c c}w # t&        $ r t        j"                  |«       ‚ w xY w)z‚
    Given a bundle of certs in PEM format, turns them into a CFArray of certs
    that can be used to validate a cert chain.
    s   
ó   
r   zNo root certificates specifiedr   r4   zUnable to build cert object!)ÚreplaceÚ_PEM_CERTS_REÚfinditerÚbase64Ú	b64decodeÚgroupr<   r=   r   r5   r   r+   r6   r7   r   r   ÚSecCertificateCreateWithDatar:   r9   Ú	Exception)Ú
pem_bundleÚmatchÚ	der_certsÚ
cert_arrayÚ	der_bytesÚcertdataÚcerts          r   Ú_cert_array_from_pemrl   ¨   sh  € ð ×#Ñ# G¨UÓ3€Jô 7D×6LÑ6LÈZÓ6XöØ-2Œ×Ñ˜Ÿ™ Q›Õ(ð€Ið ñ Ü�l‰lÐ;Ó<Ð<ä×4Ñ4Ü×*Ñ*Ø	Ü�‰”^×9Ñ9Ó:ó€Jñ
 Ü�l‰lÐ7Ó8Ð8ðØ"ò 	+ˆIÜ*¨9Ó5ˆHÙÜ—l‘lÐ#?Ó@Ð@Ü×8Ñ8Ü×2Ñ2°HóˆDô ×$Ñ$ XÔ.ÙÜ—l‘lÐ#AÓBÐBä×-Ñ-¨j¸$Ô?Ü×$Ñ$ TÕ*ñ	+ð( ÐùòGøô8 ò ô 	× Ñ  Ô,Øðús   ª+E3ÃB$E8 Å8 Fc                óZ   — t        j                  «       }t        j                  | «      |k(  S )z=
    Returns True if a given CFTypeRef is a certificate.
    )r   ÚSecCertificateGetTypeIDr   ÚCFGetTypeID©r@   Úexpecteds     r   Ú_is_certrr   Ö   s(   € ô ×/Ñ/Ó1€HÜ×%Ñ% dÓ+¨xÑ7Ð7r   c                óZ   — t        j                  «       }t        j                  | «      |k(  S )z;
    Returns True if a given CFTypeRef is an identity.
    )r   ÚSecIdentityGetTypeIDr   ro   rp   s     r   Ú_is_identityru   Þ   s(   € ô ×,Ñ,Ó.€HÜ×%Ñ% dÓ+¨xÑ7Ð7r   c            
     óâ  — t        j                  d«      } t        j                  | dd «      j	                  d«      }t        j                  | dd «      }t        j                  «       }t         j                  j                  ||«      j                  d«      }t        j                  «       }t        j                  |t        |«      |ddt        j                  |«      «      }t!        |«       ||fS )a³  
    This function creates a temporary Mac keychain that we can use to work with
    credentials. This keychain uses a one-time password and a temporary file to
    store the data. We expect to have one keychain per socket. The returned
    SecKeychainRef must be freed by the caller, including calling
    SecKeychainDelete.

    Returns a tuple of the SecKeychainRef and the path to the temporary
    directory that contains it.
    é(   Né   rD   F)ÚosÚurandomr`   Ú	b16encoderM   ÚtempfileÚmkdtempÚpathÚjoinÚencoder   r   ÚSecKeychainCreater   r+   r6   rZ   )Úrandom_bytesÚfilenameÚpasswordÚtempdirectoryÚkeychain_pathÚkeychainÚstatuss          r   Ú_temporary_keychainr‰   æ   sÈ   € ô" —:‘:˜b“>€LÜ×Ñ ¨R¨aÐ 0Ó1×8Ñ8¸ÓA€HÜ×Ñ ¨Q¨RÐ 0Ó1€HÜ×$Ñ$Ó&€Mä—G‘G—L‘L °Ó9×@Ñ@ÀÓI€Mô ×&Ñ&Ó(€HÜ×'Ñ'Ø”s˜8“} h°°t¼V¿\¹\È(Ó=Só€Fô �VÔð �]Ð"Ð"r   c                ó¶  — g }g }d}t        |d«      5 }|j                  «       }ddd«       	 t        j                  t        j                  t        |«      «      }t        j                  «       }t        j                  |ddddd| t        j                  |«      «      }t        |«       t        j                  |«      }	t        |	«      D ]   }
t        j                  ||
«      }t        j                  |t        j                   «      }t#        |«      r't        j$                  |«       |j'                  |«       Œot)        |«      sŒ{t        j$                  |«       |j'                  |«       Œ¢ 	 |rt        j*                  |«       t        j*                  |«       ||fS # 1 sw Y   �Œ{xY w# |rt        j*                  |«       t        j*                  «       w xY w)zÊ
    Given a single file, loads all the trust objects from it into arrays and
    the keychain.
    Returns a tuple of lists: the first list is a list of identities, the
    second a list of certs.
    NÚrbr   )ÚopenÚreadr   r   r   r   Ú
CFArrayRefr   ÚSecItemImportr+   r6   rZ   ÚCFArrayGetCountÚrangeÚCFArrayGetValueAtIndexrE   r   rr   ÚCFRetainÚappendru   r:   )r‡   r~   ÚcertificatesÚ
identitiesÚresult_arrayÚfÚraw_filedataÚfiledatarQ   Úresult_countÚindexr@   s               r   Ú_load_items_from_filer�   	  s–  € ð €LØ€JØ€Lä	ˆd�DÓ	ð  ˜QØ—v‘v“xˆ÷ ð$+Ü!×.Ñ.Ü×.Ñ.°¼cÀ,Ó>Oó
ˆô &×0Ñ0Ó2ˆÜ×'Ñ'ØØØØØØØÜ�L‰L˜Ó&ó	
ˆô 	˜Ô ô &×5Ñ5°lÓCˆÜ˜<Ó(ò 		(ˆEÜ!×8Ñ8¸ÀuÓMˆDÜ—;‘;˜t¤^×%=Ñ%=Ó>ˆDä˜Œ~Ü×'Ñ'¨Ô-Ø×#Ñ# DÕ)Ü˜dÕ#Ü×'Ñ'¨Ô-Ø×!Ñ! $Õ'ñ		(ñ Ü×$Ñ$ \Ô2ä× Ñ  Ô*à˜Ð%Ð%÷S ñ  ûñH Ü×$Ñ$ \Ô2ä× Ñ  Õ*ús   “F­DF* Å(F* ÆF'Æ*.Gc                óP  — g }g }d„ |D «       }	 |D ]3  }t        | |«      \  }}|j                  |«       |j                  |«       Œ5 |s�t        j                  «       }t        j                  | |d   t        j                  |«      «      }	t        |	«       |j                  |«       t        j                  |j                  d«      «       t        j                  t        j                  dt        j                  t        j                  «      «      }
t        j                   ||«      D ]  }t        j"                  |
|«       Œ |
t        j                   ||«      D ]  }t        j                  |«       Œ S # t        j                   ||«      D ]  }t        j                  |«       Œ w xY w)zü
    Load certificates and maybe keys from a number of files. Has the end goal
    of returning a CFArray containing one SecIdentityRef, and then zero or more
    SecCertificateRef objects, suitable for use as a client certificate trust
    chain.
    c              3  ó&   K  — | ]	  }|sŒ|–— Œ y ­w©Nr   )r   r~   s     r   r   z*_load_client_cert_chain.<locals>.<genexpr>f  s   è ø€ Ò5˜t²”dÑ5ùs   ‚Šr   )r�   Úextendr   ÚSecIdentityRefÚ SecIdentityCreateWithCertificater+   r6   rZ   r”   r   r:   Úpopr5   r   r7   Ú	itertoolsÚchainr9   )r‡   Úpathsr•   r–   Úfiltered_pathsÚ	file_pathÚnew_identitiesÚ	new_certsÚnew_identityrˆ   Útrust_chainr@   Úobjs                r   Ú_load_client_cert_chainr¯   B  s|  € ð@ €LØ€Jñ 6 uÔ5€Nð"*Ø'ò 	+ˆIÜ(=¸hÈ	Ó(RÑ%ˆN˜IØ×Ñ˜nÔ-Ø×Ñ 	Õ*ð	+ñ Ü#×2Ñ2Ó4ˆLÜ×>Ñ>Ø˜, q™/¬6¯<©<¸Ó+EóˆFô ˜VÔ$Ø×Ñ˜lÔ+ô ×$Ñ$ \×%5Ñ%5°aÓ%8Ô9ô %×9Ñ9Ü×.Ñ.ØÜ�L‰Lœ×=Ñ=Ó>ó
ˆô
 —O‘O J°Ó=ò 	AˆDô ×-Ñ-¨k¸4Õ@ð	Að
 ä—?‘? :¨|Ó<ò 	*ˆCÜ×$Ñ$ SÕ)ñ	*ø”9—?‘? :¨|Ó<ò 	*ˆCÜ×$Ñ$ SÕ)ñ	*ús   �D3E3 Å32F%)r   é   )é   r   )r±   r   )r±   r°   )r±   r±   )ÚSSLv2ÚSSLv3ÚTLSv1zTLSv1.1zTLSv1.2c                ó¦   — t         |    \  }}d}d}t        j                  d||«      }t        |«      }d}t        j                  d||||«      |z   }|S )z6
    Builds a TLS alert record for an unknown CA.
    r°   é0   z>BBé   z>BBBH)ÚTLS_PROTOCOL_VERSIONSÚstructÚpackr   )	ÚversionÚver_majÚver_minÚseverity_fatalÚdescription_unknown_caÚmsgÚmsg_lenÚrecord_type_alertÚrecords	            r   Ú_build_tls_unknown_ca_alertrÄ   –  sb   € ô -¨WÑ5Ñ€GˆWØ€NØ!ÐÜ
�+‰+�e˜^Ð-CÓ
D€CÜ�#‹h€GØÐÜ�[‰[˜Ð"3°W¸gÀwÓOÐRUÑU€FØ€Mr   c                  ó°   — e Zd ZdZdZdZdZdZdZdZ	dZ
d	ZdZdZdZdZdZd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(d Z)d!Z*d"Z+y#)$ÚSecurityConstzU
    A class object that acts as essentially a namespace for Security constants.
    r   r   r°   é   é   rx   é
   iç  r±   é   é   i¸ÙÿÿiµÙÿÿi³Ùÿÿi¨Ùÿÿi²Ùÿÿi±Ùÿÿi¯Ùÿÿi®ÙÿÿiªÙÿÿi©Ùÿÿi¬Ùÿÿi«Ùÿÿi�Ùÿÿi Ùÿÿi‘Ùÿÿi†Ùÿÿi�Ùÿÿi‰Ùÿÿi ÷þÿiQ�ÿÿi,�ÿÿiR�ÿÿN),Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú"kSSLSessionOptionBreakOnServerAuthÚkSSLProtocol2ÚkSSLProtocol3ÚkTLSProtocol1ÚkTLSProtocol11ÚkTLSProtocol12ÚkTLSProtocol13ÚkTLSProtocolMaxSupportedÚkSSLClientSideÚkSSLStreamTypeÚkSecFormatPEMSequenceÚkSecTrustResultInvalidÚkSecTrustResultProceedÚkSecTrustResultDenyÚkSecTrustResultUnspecifiedÚ&kSecTrustResultRecoverableTrustFailureÚ kSecTrustResultFatalTrustFailureÚkSecTrustResultOtherErrorÚerrSSLProtocolÚerrSSLWouldBlockÚerrSSLClosedGracefulÚerrSSLClosedNoNotifyÚerrSSLClosedAbortÚerrSSLXCertChainInvalidÚerrSSLCryptoÚerrSSLInternalÚerrSSLCertExpiredÚerrSSLCertNotYetValidÚerrSSLUnknownRootCertÚerrSSLNoRootCertÚerrSSLHostNameMismatchÚerrSSLPeerHandshakeFailÚerrSSLPeerUserCancelledÚerrSSLWeakPeerEphemeralDHKeyÚerrSSLServerAuthCompletedÚerrSSLRecordOverflowÚerrSecVerifyFailedÚerrSecNoTrustSettingsÚerrSecItemNotFoundÚerrSecInvalidTrustSettingsr   r   r   rÆ   rÆ   ¤  sð   „ ñð *+Ð&à€MØ€MØ€MØ€NØ€Nà€NØ"Ðà€NØ€NàÐàÐØÐð ÐØ!"ÐØ-.Ð*Ø'(Ð$Ø !Ðà€NØÐØ ÐØ ÐØÐà#ÐØ€LØ€NØÐØ!ÐØ!ÐØÐØ"ÐØ#ÐØ#ÐØ#(Ð Ø %ÐØ ÐàÐØ"ÐØÐØ!'Ñr   rÆ   )r   ÚbytesÚreturnr   )r#   z#list[tuple[typing.Any, typing.Any]]rù   r   )r/   rø   rù   r
   )r>   zlist[bytes]rù   r	   )rL   r
   rù   ú
str | Noner    )rV   ÚintrW   ztype[BaseException] | Nonerù   ÚNone)re   rø   rù   r   )r@   r   rù   Úbool)rù   ztuple[SecKeychainRef, str])r‡   r   r~   Ústrrù   z'tuple[list[CFTypeRef], list[CFTypeRef]])r‡   r   r§   rú   rù   r   )r»   rþ   rù   rø   ))rÏ   Ú
__future__r   r`   r+   r¥   ry   Úrer<   r¹   r|   ÚtypingÚbindingsr   r   r   r   r	   r
   r   r   r   r   ÚcompileÚDOTALLr^   r   r)   r2   rB   rR   rZ   rl   rr   ru   r‰   r�   r¯   r¸   rÄ   rÆ   r   r   r   ú<module>r     s  ðñõ #ã Û Û Û 	Û 	Û 
Û Û Û ÷÷ ÷ ð �—
‘
ØDÀbÇiÁió€ó
ðØ/ðàóó0óó>ð4 ?Cð"Øð"Ø!;ð"à	ó"ó.+ó\8ó8ó #ðF6&Øð6&Ø$'ð6&à,ó6&órH*ðX ØØØØñÐ ó÷6(ò 6(r   