o
    l>j                     @   s  U 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	m
Z
mZmZmZmZmZmZ ddlmZ ejdks@J ddlmZ eeZd	Zd
ZdZed ZG dd de
ZG dd de
ZdZdZ dZ!e" Z#e"e$ e%d< dd Z&dd Z'dd Z(G dd dej)Z*dS )z'Implements raw HID interface on NetBSD.    )absolute_importN)	Structurec_charc_intc_ubytec_uint8c_uint16c_uint32   )basewin32)ioctl            c                   @   s    e Zd Zdefded fgZdS )usb_ctl_report_desc	ucrd_size	ucrd_datai   N)__name__
__module____qualname__r   r   _fields_ r   r   E/home/thesage/.local/lib/python3.10/site-packages/fido2/hid/netbsd.pyr   3   s    
r   c                   @   s   e Zd Zdefdefded fdefdee fdee fded	 fd
ee fdefdefdefdefdefdefdefdefdefdefdefdee	 e
 fded fgZdS )usb_device_infoudi_busudi_addrudi_pad0   
udi_cookieudi_product
udi_vendorudi_release   
udi_serialudi_productNoudi_vendorNoudi_releaseNo	udi_classudi_subclassudi_protocol
udi_config	udi_speedudi_pad1	udi_power
udi_nportsudi_devnames	udi_portsr   N)r   r   r   r   r	   r   USB_MAX_ENCODED_STRING_LENr   r   USB_MAX_DEVNAMESUSB_MAX_DEVNAMELENr   r   r   r   r   r   :   s.    





r   ipUDiUDl   h  _failed_cachec                  C   s   t t} g }tdD ]a}d|f }| | zt|}W nI tyL } z$|jtjkr1W Y d }~ n;|tvrBtj	d|dd t
| W Y d }~q
d }~w tye   |tvrctj	d|dd t
| Y q
w || q
t|  |S )Nd   z/dev/uhid%dzFailed opening FIDO device %sT)exc_info)setr6   rangediscardget_descriptorOSErrorerrnoENOENTloggerdebugadd	Exceptionappenddifference_update)staledescriptorsipathdescer   r   r   list_descriptors^   s0   




rL   c              	   C   s   d }zqt | t jt jB }t }t|t| t }t|t| t	|j
d |j }t|\}}|j}|j}z|jd}	W n tyI   d }	Y nw z|jd}
W n ty]   d }
Y nw t| |||||	|
W |d urst | S S |d ur~t | w w )Nzutf-8)osopenO_RDONLY	O_CLOEXECr   r   USB_GET_DEVICE_INFOr   USB_GET_REPORT_DESCbytesr   r   r   parse_report_descriptorr'   r&   r!   decodeUnicodeDecodeErrorr%   HidDescriptorclose)rI   fddevinfoucrdreport_descmaxinmaxoutvidpidnameserialr   r   r   r<   y   s6   
r<   c                 C   s   t | S )N)NetBSDCtapHidConnection)
descriptorr   r   r   open_connection   s   re   c                       s   e Zd Z fddZ  ZS )rc   c                    s   t  | zDt| jttdd td}tg d|dd< tdD ]"}| 	t
| t }|| jtj |drF|    W d S q$td	 tyV   |    w )
Nz@ir
   @   )   rg   rg   rg      r   r
   r      
   r7   zu2f ping timeout)super__init__r   handleUSB_HID_SET_RAWstructpack	bytearrayr:   write_packetrS   selectpollregisterPOLLINread_packetrC   rX   )selfrd   pingrH   rt   	__class__r   r   rl      s$   
z NetBSDCtapHidConnection.__init__)r   r   r   rl   __classcell__r   r   rz   r   rc      s    rc   )+__doc__
__future__r   r>   loggingrM   rs   ro   sysctypesr   r   r   r   r   r   r	    r   platformfcntlr   	getLoggerr   r@   r5   r4   USB_MAX_STRING_LENr3   r   r   rQ   rR   rn   r9   r6   str__annotations__rL   r<   re   FileCtapHidConnectionrc   r   r   r   r   <module>   s6   $

