o
    Õl>j   ã                   @  s    d dl mZ d dlZd dlZd dlZd dlmZ dZdZeG dd„ dƒƒZ	G dd	„ d	ej
ƒZG d
d„ deƒZdZe ZdZdZdZdZdZdZdZddd„ZdS )é    )ÚannotationsN)Ú	dataclassiÐñ  é   c                   @  sF   e Zd ZU ded< ded< ded< ded< ded< ded	< ded
< dS )ÚHidDescriptorzstr | bytesÚpathÚintÚvidÚpidÚreport_size_inÚreport_size_outz
str | NoneÚproduct_nameÚserial_numberN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__© r   r   úC/home/thesage/.local/lib/python3.10/site-packages/fido2/hid/base.pyr   '   s   
 r   c                   @  s<   e Zd Zejddd„ƒZejddd„ƒZejdd	d
„ƒZdS )ÚCtapHidConnectionÚreturnÚbytesc                 C  ó   dS )zReads a CTAP HID packetNr   ©Úselfr   r   r   Úread_packet3   ó    zCtapHidConnection.read_packetÚdataÚNonec                 C  r   )zWrites a CTAP HID packetNr   ©r   r   r   r   r   Úwrite_packet7   r   zCtapHidConnection.write_packetc                 C  r   )zCloses the connectionNr   r   r   r   r   Úclose;   r   zCtapHidConnection.closeN)r   r   )r   r   r   r   )r   r   )r   r   r   ÚabcÚabstractmethodr   r   r    r   r   r   r   r   2   s    r   c                   @  s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚFileCtapHidConnectionzMBasic CtapHidConnection implementation which uses a path to a file descriptorc                 C  s   t  |jt j¡| _|| _d S ©N)ÚosÚopenr   ÚO_RDWRÚhandleÚ
descriptor)r   r)   r   r   r   Ú__init__C   s   
zFileCtapHidConnection.__init__c                 C  s   t  | j¡ d S r$   )r%   r    r(   r   r   r   r   r    G   s   zFileCtapHidConnection.closec                 C  s"   t  | j|¡t|ƒkrtdƒ‚d S )Nzfailed to write entire packet)r%   Úwriter(   ÚlenÚOSErrorr   r   r   r   r   J   s   ÿz"FileCtapHidConnection.write_packetc                 C  s   t  | j| jj¡S r$   )r%   Úreadr(   r)   r
   r   r   r   r   r   N   s   z!FileCtapHidConnection.read_packetN)r   r   r   Ú__doc__r*   r    r   r   r   r   r   r   r#   @   s    r#   éü   é   é€   é    é”   ét   é   é   r   r   r   útuple[int, int]c                 C  sl  d\}}d\}}d\}}d}| r¤|r¤t  d| ¡d | dd … }} t|@ t|@ }	}
t  d| d |
…  dd¡¡d }| |
d … } |d uru|d uru|	tkr_|d u r^|| d }d\}}|d8 }n|	tkru|d u ru|| d }d\}}|d8 }|	tkr‚|s|}|d8 }n|	tkr|sŽ|}|d8 }n|	t	kr˜|s—|}n|	t
kr |s |}| r¤|s|s²|tkr²|tkr²||fS td	ƒ‚)
N)NNr6   z>Br   r   z<Ió    r7   zNot a FIDO device)ÚstructÚunpack_fromÚREPORT_DESCRIPTOR_KEY_MASKÚ	SIZE_MASKÚljustÚ
INPUT_ITEMÚOUTPUT_ITEMÚ
USAGE_PAGEÚUSAGEÚREPORT_COUNTÚREPORT_SIZEÚFIDO_USAGE_PAGEÚ
FIDO_USAGEÚ
ValueError)r   ÚusageÚ
usage_pageÚmax_input_sizeÚmax_output_sizeÚreport_countÚreport_sizeÚ	remainingÚheadÚkeyÚsizeÚvaluer   r   r   Úparse_report_descriptor]   sT    €€€€â rS   )r   r   r   r8   )Ú
__future__r   r!   r%   r:   Údataclassesr   rE   rF   r   ÚABCr   r#   r<   r=   r@   r?   ÚCOLLECTION_ITEMrC   rD   rA   rB   rS   r   r   r   r   Ú<module>   s*   
