o
    l>j$                     @  s  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eZejdkrWd	dlmZ nCejdkrcd	dlmZ n7ejdkrod	dlm Z n+ej!dr|d	dlm"Z nej!drd	dlm#Z nej!drd	dlm$Z ne%dej&Z&ej'Z'ej(Z(G dd de%Z)e	G dd deZ*e	G dd deZ+dZ,G dd  d eZ-d'd#d$Z.d(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                   @  s   e Zd ZdZdS )ConnectionFailurez;The CTAP connection failed or returned an invalid response.N)__name__
__module____qualname____doc__ r   r   G/home/thesage/.local/lib/python3.10/site-packages/fido2/hid/__init__.pyr   C   s    r   c                   @  s4   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    r    c                   @  s&   e Zd ZdZdZdZdZddd	Zd
S )
CAPABILITYr   r	   r"   r$   flagsreturnboolc                 C  s   t || @ S N)r7   )selfr5   r   r   r   	supported^   s   zCAPABILITY.supportedN)r5   r4   r6   r7   )r   r   r   r.   r,   r/   NMSGr:   r   r   r   r   r4   W   s    r4      c                   @  s   e Zd ZdZd7ddZdd	 Zed8ddZed9ddZed8ddZ	ed:ddZ
ed:ddZdd Z			d;d<d#d$Zd%d& Zd=d(d)Zd>d?d,d-Zd@dAd0d1Zd=d2d3ZedBd5d6ZdS )CCtapHidDevicezf
    CtapDevice implementation using the HID transport.

    :cvar descriptor: Device descriptor.
    
descriptorr   
connectionr   c           	      C  s   || _ |j| _|| _td}d| _| tj	|}|d d |dd  }}||kr.t
dtd|\| _| _}}}| _|||f| _d S )Nr$   l    zWrong noncez>IBBBBB)r>   report_size_out_packet_size_connectionosurandom_channel_idcallr    r-   r   structunpack_from_u2fhid_version_capabilities_device_version)	r9   r>   r?   nonceresponser_noncev1v2v3r   r   r   __init__l   s$   

zCtapHidDevice.__init__c                 C  s   d| j jdS )NzCtapHidDevice())r>   pathr9   r   r   r   __repr__   s   zCtapHidDevice.__repr__r6   intc                 C     | j S )zCTAP HID protocol version.)rI   rU   r   r   r   version      zCtapHidDevice.versiontuple[int, int, int]c                 C  rX   )zDevice version number.)rK   rU   r   r   r   device_version   rZ   zCtapHidDevice.device_versionc                 C  rX   )z%Capabilities supported by the device.)rJ   rU   r   r   r   capabilities   rZ   zCtapHidDevice.capabilities
str | Nonec                 C     | j jS )zProduct name of device.)r>   product_namerU   r   r   r   r`         zCtapHidDevice.product_namec                 C  r_   )zSerial number of device.)r>   serial_numberrU   r   r   r   rb      ra   zCtapHidDevice.serial_numberc                 C  sB   t d| jttjB | jd}t	t
d|  | j| d S )N>IB    SEND: %s)rG   packrE   	TYPE_INITr    r0   ljustrA   loggerlogr   hexrB   write_packet)r9   packetr   r   r   _send_cancel   s
   zCtapHidDevice._send_cancel    NcmddatabyteseventEvent | Noneon_keepaliveCallable[[STATUS], None] | Nonec              
   C  sh   |pt  }	 z	| ||||W S  ty3 } z|jtjjkr.|ds.td W Y d }~q d }~ww )NTg?z"CTAP channel busy, trying again...)	r   _do_callr   codeERRCHANNEL_BUSYwaitri   warning)r9   rp   rq   rs   ru   er   r   r   rF      s   


zCtapHidDevice.callc                 C  sx  |}d}t d| jt|B t|}|s|dkr\tt|| jt| }|d | ||d  }	}||	 }
tt	d|

  | j|
| jd t d| jd|@ }|d7 }|s|dkszd}d}d}d }	 | rstd
 |   | j }tt	d|
  t d|d }|dd  }|| jkrtd|st d|\}}|dd  }|t|B krng|ttjB krztt d|d }td|d W n ty   tdw |r||kr|}|| qe|ttjB krtt d|d ttjjt d|d }|dd  }||krtd|d7 }||7 }t||kr"nqf|d | W S  ty;   td |    w )Nr   z>IBHre   rd   rc      r   ro   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...)rG   rf   rE   rg   lenminrA   ri   rj   r   rk   rB   rl   rh   is_setdebugrn   read_packetrH   r   r    r2   r
   
ValueErrorr1   r   ry   INVALID_COMMANDKeyboardInterrupt)r9   rp   rq   rs   ru   	remainingseqheadersizebodyrm   r_lenrM   last_karecv	r_channelr_cmd	ka_statusr_seqr   r   r   rw      sz   	



,
zCtapHidDevice._do_callNonec                 C  s   |  tj dS )z"Causes the authenticator to blink.N)rF   r    r.   rU   r   r   r   wink   s   zCtapHidDevice.wink
   Hello FIDOmsgc                 C  s   |  tj|S )zSends data to the authenticator, which echoes it back.

        :param msg: The data to send.
        :return: The response from the authenticator.
        )rF   r    r*   )r9   r   r   r   r   ping  s   zCtapHidDevice.ping
   	lock_timec                 C  s   |  tjtd| dS )zLocks the channel.r   N)rF   r    r,   rG   rf   )r9   r   r   r   r   lock  s   zCtapHidDevice.lockc                 C  s   | j   d S r8   )rB   closerU   r   r   r   r     s   zCtapHidDevice.closeIterator[CtapHidDevice]c                 c  s"    t  D ]
}| |t|V  qd S r8   )list_descriptorsopen_connection)clsdr   r   r   list_devices  s   
zCtapHidDevice.list_devices)r>   r   r?   r   )r6   rW   )r6   r[   )r6   r^   )ro   NN)
rp   rW   rq   rr   rs   rt   ru   rv   r6   rr   )r6   r   )r   )r   rr   r6   rr   )r   )r   rW   r6   r   r6   r   )r   r   r   r   rR   rV   propertyrY   r\   r]   r`   rb   rn   rF   rw   r   r   r   r   classmethodr   r   r   r   r   r=   e   s4    


H
r=   r6   r   c                   C  s   t  S r8   )r=   r   r   r   r   r   r     s   r   c                 C  s   t | }t|t|S r8   )get_descriptorr=   r   )rT   r>   r   r   r   open_device  s   r   r   )r6   r=   )0
__future__r   loggingrC   rG   sysenumr   r   r   	threadingr   typingr   r   ctapr
   r   r   utilsr   baser   r   	getLoggerr   ri   platform r   backendr   r   
startswithr   r   r   	Exceptionr   r   r   r   r    r4   rg   r=   r   r   r   r   r   r   <module>   sL   




 
4