
    <[j$                       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mZm	Z	 d dl
mZ d dlmZmZ ddlmZmZmZ ddlmZ d	d
lmZmZ  ej        e          Zej        dk    rd	dlmZ nej        dk    rd	dlmZ nej        dk    rd	dlm Z nnej        !                    d          rd	dlm"Z nMej        !                    d          rd	dlm#Z n,ej        !                    d          rd	dlm$Z n e%d          ej&        Z&ej'        Z'ej(        Z( G d de%          Z)e	 G d de                      Z*e	 G d de                      Z+dZ, G d d e          Z-d%d#Z.d&d$Z/dS )'    )annotationsN)IntEnumIntFlagunique)Event)CallableIterator   )STATUS
CtapDevice	CtapError)LOG_LEVEL_TRAFFIC   )CtapHidConnectionHidDescriptorlinux)r   win32)windowsdarwin)macosfreebsd)r   netbsd)r   openbsd)r   zUnsupported platformc                      e Zd ZdZdS )ConnectionFailurez;The CTAP connection failed or returned an invalid response.N)__name__
__module____qualname____doc__     Z/home/thesage/.hermes/hermes-agent/venv/lib/python3.11/site-packages/fido2/hid/__init__.pyr   r   C   s        EEEEr!   r   c                  6    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdS )CTAPHIDr                     ?   ;   @   N)r   r   r   PINGMSGLOCKINITWINKCBORCANCELERROR	KEEPALIVEVENDOR_FIRSTr    r!   r"   r$   r$   G   s@        D
CDDDDFEILLLr!   r$   c                  &    e Zd ZdZdZdZdZd
dZd	S )
CAPABILITYr   r
   r&   r(   flagsreturnboolc                &    t          || z            S N)r<   )selfr:   s     r"   	supportedzCAPABILITY.supported^   s    EDL!!!r!   N)r:   r9   r;   r<   )r   r   r   r2   r0   r3   NMSGr@   r    r!   r"   r9   r9   W   s<        DDDD" " " " " "r!   r9      c                      e Zd ZdZd(dZd Zed)d
            Zed*d            Zed)d            Z	ed+d            Z
ed+d            Zd Z	 	 	 d,d-dZd Zd.dZd/d0d!Zd1d2d$Zd.d%Zed3d'            ZdS )4CtapHidDevicezf
    CtapDevice implementation using the HID transport.

    :cvar descriptor: Device descriptor.
    
descriptorr   
connectionr   c                l   || _         |j        | _        || _        t	          j        d          }d| _        |                     t          j	        |          }|d d         |dd          }}||k    rt          d          t          j        d|          \  | _        | _        }}}| _        |||f| _        d S )Nr(   l    zWrong noncez>IBBBBB)rE   report_size_out_packet_size_connectionosurandom_channel_idcallr$   r1   r   structunpack_from_u2fhid_version_capabilities_device_version)	r?   rE   rF   nonceresponser_noncev1v2v3s	            r"   __init__zCtapHidDevice.__init__l   s    $&6%
1%99W\511$RaRL(122,e#M222 y(33	
  "B|r!   c                "    d| j         j        dS )NzCtapHidDevice())rE   pathr?   s    r"   __repr__zCtapHidDevice.__repr__   s    9 49999r!   r;   intc                    | j         S )zCTAP HID protocol version.)rQ   r^   s    r"   versionzCtapHidDevice.version        ##r!   tuple[int, int, int]c                    | j         S )zDevice version number.)rS   r^   s    r"   device_versionzCtapHidDevice.device_version   rc   r!   c                    | j         S )z%Capabilities supported by the device.)rR   r^   s    r"   capabilitieszCtapHidDevice.capabilities   s     !!r!   
str | Nonec                    | j         j        S )zProduct name of device.)rE   product_namer^   s    r"   rk   zCtapHidDevice.product_name   s     ++r!   c                    | j         j        S )zSerial number of device.)rE   serial_numberr^   s    r"   rm   zCtapHidDevice.serial_number   s     ,,r!   c                ,   t          j        d| j        t          t          j        z                                | j        d          }t          	                    t          d|                                           | j                            |           d S )N>IB    SEND: %s)rO   packrM   	TYPE_INITr$   r4   ljustrI   loggerlogr   hexrJ   write_packet)r?   packets     r"   _send_cancelzCtapHidDevice._send_cancel   su    UD$4i'.6PQQWWu
 
 	

$j&**,,???%%f-----r!   r!   NcmddatabyteseventEvent | Noneon_keepaliveCallable[[STATUS], None] | Nonec                   |pt                      }	 	 |                     ||||          S # t          $ rT}|j        t          j        j        k    r4|                    d          st                              d           Y d }~r d }~ww xY w)NTg?z"CTAP channel busy, trying again...)	r   _do_callr   codeERRCHANNEL_BUSYwaitru   warning)r?   r{   r|   r~   r   es         r"   rN   zCtapHidDevice.call   s      	}}S$|DDD   6Y]777 ::c?? !'KLLL s   + 
B	A	BBB	c                x   |}d}t          j        d| j        t          |z  t	          |                    }|s|dk    rt          t	          |          | j        t	          |          z
            }|d |         ||d          }}	||	z   }
t                              t          d|

                                           | j                            |
                    | j        d                     t          j        d| j        d|z            }|dz  }||dk    	 d}d}d}d }	 |                                r.t                              d
           |                                  | j                                        }t                              t          d|
                                           t          j        d|          d         }|dd          }|| j        k    rt'          d          |s$t          j        d|          \  }}|dd          }|t          |z  k    rn4|t          t(          j        z  k    r|	 t-          t          j        d|          d                   }t                              d|d           n# t.          $ r t'          d          w xY w|r||k    r|} ||           |t          t(          j        z  k    r(t3          t          j        d|          d                   t3          t2          j        j                  t          j        d|          d         }|dd          }||dz  k    rt'          d          |dz  }||z  }t	          |          |k    rnQ|d |         S # t8          $ r0 t                              d           |                                   w xY w)Nr   z>IBHrq   rp   ro      r   r!   TzSending cancel...zRECV: %sz>Ir&   zWrong channelz>BHr%   >BzGot keepalive status: 02xzInvalid keepalive statuszWrong sequence numberz!Keyboard interrupt, cancelling...)rO   rr   rM   rs   lenminrI   ru   rv   r   rw   rJ   rx   rt   is_setdebugrz   read_packetrP   r   r$   r6   r   
ValueErrorr5   r   r   INVALID_COMMANDKeyboardInterrupt)r?   r{   r|   r~   r   	remainingseqheadersizebodyry   r_lenrU   last_karecv	r_channelr_cmd	ka_statusr_seqs                      r"   r   zCtapHidDevice._do_call   s   	 VT%5y3IWW 	3!88s9~~t'83v;;'FGGD'.	$%%0@)Dd]FJJ(*fjjllCCC))&,,t7H%*P*PQQQ[(8$*EEF1HC  	3!887	CEHG*<<>> (LL!4555%%''''3355

,j$((**EEE".tT::1=	ABBx 000+O<<< #)#5eT#B#BLE58D	C//)g.?"???P(.v/A$/M/Ma/P(Q(QI"LL)Q))Q)Q)QRRRR) P P P"34N"O"OOP' 4I,@,@&/G(L333 )gm";;;'(:4(F(Fq(IJJJ'	(EFFF".tT::1=E8Dd
**/0GHHH1HCD x==E))U*X FUF##  	 	 	LL<===		s'   D#M? ?AJ M? J  CM? ?:N9Nonec                D    |                      t          j                   dS )z"Causes the authenticator to blink.N)rN   r$   r2   r^   s    r"   winkzCtapHidDevice.wink   s    		',r!   
   Hello FIDOmsgc                B    |                      t          j        |          S )zSends data to the authenticator, which echoes it back.

        :param msg: The data to send.
        :return: The response from the authenticator.
        )rN   r$   r.   )r?   r   s     r"   pingzCtapHidDevice.ping  s     yys+++r!   
   	lock_timec                l    |                      t          j        t          j        d|                     dS )zLocks the channel.r   N)rN   r$   r0   rO   rr   )r?   r   s     r"   lockzCtapHidDevice.lock  s*    		',D) < <=====r!   c                8    | j                                          d S r>   )rJ   closer^   s    r"   r   zCtapHidDevice.close  s         r!   Iterator[CtapHidDevice]c              #  b   K   t                      D ]} | |t          |                    V  d S r>   )list_descriptorsopen_connection)clsds     r"   list_deviceszCtapHidDevice.list_devices  sH      !## 	- 	-A#a++,,,,,,	- 	-r!   )rE   r   rF   r   )r;   r`   )r;   rd   )r;   ri   )r!   NN)
r{   r`   r|   r}   r~   r   r   r   r;   r}   )r;   r   )r   )r   r}   r;   r}   )r   )r   r`   r;   r   r;   r   )r   r   r   r   rZ   r_   propertyrb   rf   rh   rk   rm   rz   rN   r   r   r   r   r   classmethodr   r    r!   r"   rD   rD   e   s        , , , ,*: : : $ $ $ X$ $ $ $ X$ " " " X" , , , X, - - - X-. . . "8<    &F F FP       , , , , ,> > > > >! ! ! ! - - - [- - -r!   rD   r;   r   c                 4    t                                           S r>   )rD   r   r    r!   r"   r   r     s    %%'''r!   c                Z    t          |           }t          |t          |                    S r>   )get_descriptorrD   r   )r]   rE   s     r"   open_devicer     s'    %%J_Z%@%@AAAr!   r   )r;   rD   )0
__future__r   loggingrK   rO   sysenumr   r   r   	threadingr   typingr   r	   ctapr   r   r   utilsr   baser   r   	getLoggerr   ru   platform r   backendr   r   
startswithr   r   r   	Exceptionr   r   r   r   r$   r9   rs   rD   r   r   r    r!   r"   <module>r      s
  8 # " " " " "  				  



 ) ) ) ) ) ) ) ) ) )       % % % % % % % % 0 0 0 0 0 0 0 0 0 0 % % % % % % 2 2 2 2 2 2 2 2		8	$	$ <7"""""""\W$$$$$$$\X"""""""\Y'' ,$$$$$$$\X&& ,#######\Y'' ,$$$$$$$
)*
+
++ + ')F F F F F	 F F F     g    " " " " " " " " 	p- p- p- p- p-J p- p- p-f( ( ( (B B B B B Br!   