o
    l>j)1                     @  s  U d dl mZ d dlZd dlZd dlZd dlZd dlmZ ddlm	Z	m
Z
mZmZ ejdks0J d dlmZmZ eeZdZejd	ed
Zejded
Zejded
ZG dd dejZe d  dkrhdZne d  dkrsdZnede d   G dd dejZG dd dejZG dd dejZG dd dejZej Z!ej Z"ej Z#dde$ej  > d Z%dZ&dZ'dZ(ej)Z*dZ+dZ,dZ-d Z.dZ/dej0_1e2egej0_3ej4ej5_1e"e2egej5_3ej4ej6_1e"e2e#gej6_3ej4ej7_1e#gej7_3ej4ej8_1e"ej ej9gej8_3ej4ej:_1e"ej ej9gej:_3e*ej;_1e#e2egej;_3ej<ej=_1e"ej ej9gej=_3ej<ej>_1e"ej ej9gej>_3e2eej?ej@ejAgejB_3e!ejB_1ej<ejC_1e!ej e2eejAe2egejC_3ej<ejD_1e!e2ee2eejAe2ejAej gejD_3ej<ejE_1e!gejE_3e"ejF_1ej?ejAejAej ejAejAe"gejF_3ej<ejG_1e"gejG_3G d!d" d"eZHd#d$ ZId%d& ZJd'd( ZKd)d* ZLd+d, ZMeeeN ZOi ZPd-eQd.< d/d0 ZRdS )1    )annotationsN)cast   )
FIDO_USAGEFIDO_USAGE_PAGECtapHidConnectionHidDescriptorwin32)WinErrorwintypesi   hid)winmodesetupapikernel32c                   @  s4   e Zd Zdejfdejfdejfdejd fgZdS )GUIDData1Data2Data3Data4   N)__name__
__module____qualname__ctypesc_ulongc_ushortc_ubyte_fields_ r   r   F/home/thesage/.local/lib/python3.10/site-packages/fido2/hid/windows.pyr   +   s    r   64bitr   32bitzUnknown architecture: c                   @  s8   e Zd ZdejfdefdejfdeejfgZ	e
ZdS )DeviceInterfaceDatacbSizeInterfaceClassGuidFlagsReservedN)r   r   r   r   DWORDr   r   POINTERr   r   SETUPAPI_PACK_pack_r   r   r   r   r"   A   s    r"   c                   @  s(   e Zd Zdejfdejd fgZeZ	dS )DeviceInterfaceDetailDatar#   
DevicePathr   N)
r   r   r   r   r'   r   c_byter   r)   r*   r   r   r   r   r+   K   s    r+   c                   @  s0   e Zd ZdejfdejfdejfdejfgZdS )HidAttributesSizeVendorID	ProductIDVersionNumberN)r   r   r   r   r   r   r   r   r   r   r   r.   P   s    r.   c                	   @  sP   e Zd Zdejfdejfdejfdejfdejfdejd fdejd	 fgZd
S )HidCapabilitiesUsage	UsagePageInputReportByteLengthOutputReportByteLengthFeatureReportByteLengthr&      NotUsed
   N)r   r   r   r   r   r   r   r   r   r   r3   Y   s    r3         i   i   @l           c                   @  s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
WinCtapHidConnectionc              	   C  s<   || _ t|jttB ttB d tdd | _	| j	t
krt d S )Nr   )
descriptorr   CreateFileApathGENERIC_WRITEGENERIC_READFILE_SHARE_READFILE_SHARE_WRITEOPEN_EXISTINGhandleINVALID_HANDLE_VALUEr
   )selfr@   r   r   r   __init__   s   
	zWinCtapHidConnection.__init__c                 C  s   t | j d S N)r   CloseHandlerH   )rJ   r   r   r   close   s   zWinCtapHidConnection.closec                 C  sd   d| }t  }t| j|t|t|d }|st |j	t|kr0t
ddt||j	f  d S )N    z"Failed to write complete packet.  zExpected %d, but got %d)r   r'   r   	WriteFilerH   lenr   byrefr
   valueOSError)rJ   dataoutnum_writtenretr   r   r   write_packet   s   z!WinCtapHidConnection.write_packetc                 C  sj   t | jjd }t }t| j|t	|t 
|d }|s!t |j| jjd kr.td|jdd  S )Nr   z.Failed to read full length report from device.)r   create_string_bufferr@   report_size_inr   r'   r   ReadFilerH   rQ   rR   r
   rS   rT   raw)rJ   bufnum_readrX   r   r   r   read_packet   s   z WinCtapHidConnection.read_packetN)r   r   r   rK   rN   rY   r`   r   r   r   r   r?      s
    r?   c                 C  s.   t  }t| t|}|st |j|jfS rL   )r.   r   HidD_GetAttributesr   rR   r
   r0   r1   )device
attributesresultr   r   r   get_vid_pid   s
   re   c              	   C  2   t d}t| |t t |}|sd S |jS N   )r   create_unicode_bufferr   HidD_GetProductStringr   sizeofrS   rb   r^   rd   r   r   r   get_product_name   s
   
rm   c              	   C  rf   rg   )r   ri   r   HidD_GetSerialNumberStringr   rk   rS   rl   r   r   r   
get_serial   s   
ro   c              	   C  s  t | dttB d tdd }|tkrt zhtd}t	|t
|}|s't zOt }t|t
|}|tkr;t |jtkrs|jtkrst|\}}t|}t|}|jd }	|jd }
t| |||	|
||W t| W t | S tdt| w t | w )Nr   r   zNot a CTAP device)r   rA   rE   rF   rG   rI   r
   PHIDP_PREPARSED_DATAr   HidD_GetPreparsedDatar   rR   r3   HidP_GetCapsHIDP_STATUS_SUCCESSr5   r   r4   r   re   rm   ro   r6   r7   r   HidD_FreePreparsedDatarM   
ValueError)rB   rb   preparsed_datarX   capsvidpidproduct_nameserialsize_insize_outr   r   r   get_descriptor  sF   	

r~   c                 C  s   t | S rL   )r?   )r@   r   r   r   open_connection6  s   r   zdict[bytes, HidDescriptor]_descriptor_cachec               	   C  s  t t} g }t }tt| tt|d d t	t
B }zd}t }tt|_	 t|dt||t|}|d7 }|sAnt }t|t|d dt|d }|rZt |j}|dkrbq*t|}	t|	}
tt|
_t|t|t|
|d d }|st t|
j}| | t|}|r|tur|| q*zt|}|t|< || W q* ty   Y n ty   t j!d|dd Y nw tt|< q+W t"| nt"| w | D ]}t|= q|S )Nr   Tr   z$Failed reading HID descriptor for %s)exc_info)#setr   r   r   HidD_GetHidGuidr   rR   r   SetupDiGetClassDevsADIGCF_DEVICEINTERFACEDIGCF_PRESENTr"   rk   r#   SetupDiEnumDeviceInterfacesr   r'    SetupDiGetDeviceInterfaceDetailAr
   rS   rZ   r+   from_buffer	string_atr,   discardget_SKIPappendr~   ru   	ExceptionloggerdebugSetupDiDestroyDeviceInfoList)staledescriptorshid_guid
collectionindexinterface_inford   dw_detail_len
detail_lenr^   interface_detailrB   descr@   r   r   r   list_descriptors>  s   







9r   )S
__future__r   r   loggingplatformsystypingr   baser   r   r   r   r
   r   	getLoggerr   r   LOAD_LIBRARY_SEARCH_SYSTEM32WinDLLr   r   r   	Structurer   architecturer)   rT   r"   r+   r.   r3   c_void_pHDEVINFOHANDLErp   rk   rI   rE   rF   rG   c_longNTSTATUSrs   rC   rD   r   r   r   restyper(   argtypesBOOLEANra   rq   rt   rj   r   rn   rr   BOOLHidD_GetFeatureHidD_SetFeaturec_char_pHWNDr'   r   r   r   r   rA   rM   r?   re   rm   ro   r~   r   objectr   r   __annotations__r   r   r   r   r   <module>   s   

	












	
/	
+