o
    l>j!                     @  sd  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Zd dlZd dlZd dl	Z	d dl
m
Z
 d dlmZ d dlmZ ddlmZmZmZ e	jdksJJ eeZd	Zed
ZedZedZeedZdZdZdZ dZ!dZ"dZ#G dd dej$Z%G dd deZ&dd Z'dd Z(dd Z)eG dd dZ*d d! Z+d"d# Z,d$d% Z-e. Z/d&e0d'< d(d) Z1dS )*    )annotationsN)array)find_library)	dataclass   )FileCtapHidConnectionHidDescriptorparse_report_descriptorwin32z/dev/zvendor=(0x[0-9a-fA-F]+)zproduct=(0x[0-9a-fA-F]+)zsernum="([^"]+)cl   U@  i U@iU  iU@i!U@i%U@@c                   @  st   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f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gZdS )usb_gen_descriptorugd_dataugd_lang_id
ugd_maxlen
ugd_actlen
ugd_offsetugd_config_indexugd_string_indexugd_iface_indexugd_altif_indexugd_endpt_indexugd_report_typereserved   N)__name__
__module____qualname__ctypesc_void_pc_uint16c_uint8_fields_ r"   r"   F/home/thesage/.local/lib/python3.10/site-packages/fido2/hid/freebsd.pyr   H   s     r   c                      s   e Zd Z fddZ  ZS )HidrawCtapHidConnectionc                   s   t  d|  d S )N    )superwrite_packet)selfdata	__class__r"   r#   r'   ]   s   z$HidrawCtapHidConnection.write_packet)r   r   r   r'   __classcell__r"   r"   r*   r#   r$   \   s    r$   c                 C  s$   | j td dkrt| S t| S )Nhidrawr   )pathfinddevdirr$   r   )
descriptorr"   r"   r#   open_connectionb   s   r2   c                 C  sX   t d}tt |t ||d}t| tt |}|dkr$t	d|j
d |j S )Ni   )r   r   r   r   zioctl failed)r   create_string_bufferr   	addressofsizeoflibcioctlUSB_GET_REPORT_DESCbyref
ValueErrorrawr   )fdreport_typer)   descretr"   r"   r#   _get_report_datai   s   
r@   c           	      C  sB   t |t j}t|d}t | t|\}}t|| |||||S )N   )osopenO_RDONLYr@   closer	   r   )	vidpidnameserialr.   r<   r)   max_in_sizemax_out_sizer"   r"   r#   _read_descriptorv   s
   

rL   c                   @  sN   e Zd ZU ded< ded< dZded< dZded< dZded	< dZded
< dS )_UhidDevicestrrH   r.   Nz
int | None	vendor_id
product_idz
str | Noneserial_numberproduct_desc)r   r   r   __annotations__rO   rP   rQ   rR   r"   r"   r"   r#   rM   ~   s   
 rM   c                  c  s   t  td D ]} | tttd d  }| sqd| d  }d| d  }td}tt|}t	|}t
||t|d d }|dkrNq| ttd  }| }	|jd |j  }
t|
}|rqt|dd	nd }t|
}|rt|dd	nd }t|
}|r|dnd }t	|}t
||t|d d }|dkr|jd |j  pd }nd }t||	||||V  qd S )
Nzuhid?*uhidz	dev.uhid.z	.%pnpinfoz.%desci   r   r      )globr0   lenisdigitencoder   r3   c_size_tr5   c_char_pr6   sysctlbynamer9   valuedecode	vendor_researchintgroup
product_re	sernum_rerM   )rT   indexpnpinfor>   ovalueolenkeyretvaldev_namedev_pathr]   mdev_vendor_iddev_product_iddev_serial_numberdev_product_descr"   r"   r#   
_enumerate   sH   





rr   c              	   C  s  t | d}tddgd }t|t|d td|\}}}tddgd }t|t|d |dd }|dkrGt	|d |d  
d	nd }z,tddgd
 }t|t|d |dd }|dkrrt	|d |d  
d	nd }W n ty   d }Y nw tddgd }t|t|d td|d }	|tddg|	 7 }t|t|d W d    n1 sw   Y  t|dd  }
t|
\}}t| ||||||S )NrbBr   r   Tz<IHH   r   zutf-8A      z<I)rC   r   fcntlr7   HIDIOCGRAWINFOstructunpackHIDIOCGRAWNAME_128re   	bytearrayr^   HIDIOCGRAWUNIQ_64OSErrorHIDIOCGRDESCSIZEHIDIOCGRDESCbytesr	   r   )r.   fbuf_rF   rG   lengthrH   rI   sizer)   rJ   rK   r"   r"   r#   get_hidraw_descriptor   s4   &$!r   c                 C  sV   |  td dkrt| S t D ]}|j| kr&t|j|j|j|j	|j  S qt
d)Nr-   r   zDevice not found)r/   r0   r   rr   r.   rL   rO   rP   rH   rQ   r:   )r.   devr"   r"   r#   get_descriptor   s   

r   zset[str]_failed_cachec               	   C  s  t t} g }ttd D ]2}| | z	|t| W q ty&   Y q ty?   |tvr=t	j
d|dd t| Y qw |st D ]?}| |j z|t|j|j|j|j|j W qE tyh   Y qE ty   |jtvrt	j
d|jdd t|j Y qEw t|  |S )Nzhidraw?*zFailed opening device %sT)exc_infozFailed opening HID device %s)setr   rV   r0   discardappendr   r:   	Exceptionloggerdebugaddrr   r.   rL   rO   rP   rH   rQ   difference_update)staledescriptorsr-   r   r"   r"   r#   list_descriptors   sN   


	

r   )2
__future__r   r   rx   rV   loggingrB   rerz   sysr   ctypes.utilr   dataclassesr   baser   r   r	   platform	getLoggerr   r   r0   compiler_   rc   rd   CDLLr6   r8   ry   r   r   r|   r~   	Structurer   r$   r2   r@   rL   rM   rr   r   r   r   r   rS   r   r"   r"   r"   r#   <module>   sL   



	.'