o
    .j)                     @  st  d dl mZ d dlZd dlZd dlmZmZmZmZmZ ej	dddZ
ej	dddZe ZeZeZeZeZeZeZdZd	Zd
ZdZd
ZdZe
jZeejejge_ee_e
j Z!eeeeeeeege!_ee!_e
j"Z#eege#_ee#_e
j$Z%ege%_ee%_e
j&Z'eege'_ee'_e
j(Z)ege)_ee)_e
j*Z+ege+_eej,e+_e
j-Z.eeege._ej/e._e
j0Z1ege1_de1_ej2Z3eeege3_ee3_ej4Z5ege5_ee5_ej6Z7eeege7_ee7_ej8Z9eeeege9_ee9_e:e
dZ;e:e
dZ<e:e
dZ=e:edZ>e:edZ?e:edZ@e:edZAe:edZBe:edZCeddeZDd,ddZEd-d!d"ZFd.d'd(ZGd/d*d+ZHdS )0    )annotationsN)POINTERbyrefc_int32c_longc_void_pzB/System/Library/Frameworks/CoreFoundation.framework/CoreFoundationT)	use_errnoz6/System/Library/Frameworks/Security.framework/Security            i  kCFTypeDictionaryKeyCallBackskCFTypeDictionaryValueCallBackskCFBooleanTrue	kSecClasskSecClassCertificatekSecMatchLimitkSecMatchLimitAllkSecMatchTrustedOnlykSecReturnRefs   kSecTrustSettingsResultkeyslist[c_void_p]valuesreturnCFDictionaryRefc                 C  s2   t | }t| |  }t| | }td|||ttS )z)Build a CFDictionary for SecItem queries.N)lenr   _CFDictionaryCreate_kCFTypeDictKeyCallBacks_kCFTypeDictValueCallBacks)r   r   countkey_arrval_arr r"   G/home/thesage/.local/lib/python3.10/site-packages/wassima/_os/_macos.py_make_queryu   s   r$   data_refr   bytesc                 C  s6   zt | }t| }tt||W t|  S t|  w )z=Convert a CFDataRef to Python bytes, releasing the CFDataRef.)_CFDataGetLength_CFDataGetBytePtrr&   ctypes	string_at
_CFRelease)r%   lengthptrr"   r"   r#   _data_to_bytes   s
   r.   cert_refdomainintboolc           	      C  s   t  }t| |t|}|dkrdS zZt|}|dkr!W t| dS t|D ]?}t||}t|t}|du r= W t| dS t	 }t
|tt|rd|jtkrU W t| dS |jttfv rd W t| dS q%W t| dS t| w )ak  Check whether a certificate's trust settings indicate it should be trusted.

    Calls SecTrustSettingsCopyTrustSettings to retrieve per-certificate trust
    settings for the given domain, then inspects the kSecTrustSettingsResult
    value in each trust settings dictionary entry.

    Returns True if the certificate should be included in the trust store.
    r   TNF)
CFArrayRef"_SecTrustSettingsCopyTrustSettingsr   _CFArrayGetCountr+   range_CFArrayGetValueAtIndex_CFDictionaryGetValue_kSecTrustSettingsResultr   _CFNumberGetValue_kCFNumberSInt32Typevalue_kSecTrustSettingsResultDeny!_kSecTrustSettingsResultTrustRoot#_kSecTrustSettingsResultTrustAsRoot)	r/   r0   trust_settingsstatussettings_countisettings_dict
result_refresult_valuer"   r"   r#   _is_cert_trusted   s:   	


	rG   list[bytes]c               	   C  s  t  tkrg S g } t }dD ]F}t }t|t|}|dkr qz0t|}t|D ]!}t	||}t
||s6q)tt|}||vrJ|| | | q)W t| qt| w tttttgttttgd}	zXz@t }
t|	t|
}|dkrz*t|
}t|D ]}t	|
|}tt|}||vr|| | | q}W t|
 nt|
 w W n	 ty   Y nw W t|	 | S W t|	 | S t|	 w )a  Return a list of DER-encoded certificates trusted for TLS server auth,
    covering system roots, admin/user trust settings, and personal CAs.

    Certificates explicitly denied via trust settings are excluded.
    Duplicates across domains and queries are removed.
    )r   r	   r
   r   )r   r   )osgetpid	_INIT_PIDsetr3   !_SecTrustSettingsCopyCertificatesr   r5   r6   r7   rG   r.   _SecCertificateCopyDataaddappendr+   r$   
_kSecClass_kSecMatchLimit_kSecMatchTrustedOnly_kSecReturnRef_kSecClassCertificate_kSecMatchLimitAll_kCFBooleanTrue	CFTypeRef_SecItemCopyMatchingOSError)certificatesseenr0   
cert_arrayrA   r   rC   r/   der_dataqueryresultr"   r"   r#   root_der_certificates   sh   



	





ra   )r   r   r   r   r   r   )r%   r   r   r&   )r/   r   r0   r1   r   r2   )r   rH   )I
__future__r   r)   rI   r   r   r   r   r   CDLL_core_secrJ   rK   rX   r3   	CFDataRefr   CFIndexOSStatusr>   r?   r=   #_kSecTrustSettingsResultUnspecifiedr;   _kCFStringEncodingUTF8CFStringCreateWithCString_CFStringCreateWithCStringc_char_pc_uint32argtypesrestypeCFDictionaryCreater   CFDictionaryGetValuer8   CFArrayGetCountr5   CFArrayGetValueAtIndexr7   CFDataGetLengthr'   CFDataGetBytePtrr(   c_ubyteCFNumberGetValuer:   c_bool	CFReleaser+   SecItemCopyMatchingrY   SecCertificateCopyDatarN    SecTrustSettingsCopyCertificatesrM   !SecTrustSettingsCopyTrustSettingsr4   in_dllr   r   rW   rQ   rU   rR   rV   rS   rT   r9   r$   r.   rG   ra   r"   r"   r"   r#   <module>   s    





7