o
    sh$                     @  s  d dl mZ ddlmZ ddlmZmZmZ ddlm	Z	 d dl
mZ d dlmZmZmZ d d	lmZmZmZmZ d d
lZd d
lZd d
lZd d
lZeeZejdrZddlmZ  nEejdrgddlm!Z  n8ejdrtddlm"Z  n+ejdrd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&Z0d
S ))    )annotations   )HidDescriptor   )
CtapDevice	CtapErrorSTATUS)LOG_LEVEL_TRAFFIC)Event)IntEnumIntFlagunique)TupleOptionalCallableIteratorN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   M/var/www/html/env_mimamsha/lib/python3.10/site-packages/fido2/hid/__init__.pyr   A   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!   E   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)r8   )selfr6   r   r   r    	supported\   s   zCAPABILITY.supportedN)r6   r5   r7   r8   )r   r   r   r/   r-   r0   NMSGr;   r   r   r   r    r5   U   s    r5      c                   @  s   e Zd ZdZd5ddZdd Zed6d
dZed7ddZed6ddZ	ed8ddZ
ed8ddZdd Z			d9d:d!d"Zd#d$ Zd;d&d'Zd<d=d*d+Zd>d?d.d/Zd;d0d1Zed@d3d4ZdS )ACtapHidDevicezf
    CtapDevice implementation using the HID transport.

    :cvar descriptor: Device descriptor.
    
descriptorr   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)	r:   r?   
connectionnonceresponser_noncev1v2v3r   r   r    __init__j   s$   

zCtapHidDevice.__init__c                 C  s   d| j jdS )NzCtapHidDevice())r?   pathr:   r   r   r    __repr__   s   zCtapHidDevice.__repr__r7   intc                 C     | j S )zCTAP HID protocol version.)rI   rV   r   r   r    version      zCtapHidDevice.versionTuple[int, int, int]c                 C  rY   )zDevice version number.)rK   rV   r   r   r    device_version   r[   zCtapHidDevice.device_versionc                 C  rY   )z%Capabilities supported by the device.)rJ   rV   r   r   r    capabilities   r[   zCtapHidDevice.capabilitiesOptional[str]c                 C     | j jS )zProduct name of device.)r?   product_namerV   r   r   r    ra         zCtapHidDevice.product_namec                 C  r`   )zSerial number of device.)r?   serial_numberrV   r   r   r    rc      rb   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!   r1   ljustrA   loggerlogr	   hexrB   write_packet)r:   packetr   r   r    _send_cancel   s
   zCtapHidDevice._send_cancel    NcmddatabyteseventOptional[Event]on_keepalive"Optional[Callable[[STATUS], None]]c              
   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waitrj   warning)r:   rq   rr   rt   rv   er   r   r    rF      s   


zCtapHidDevice.callc                 C  st  |}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 }	 | rqt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|}|| qc|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qd|d | W S  ty9   td |    w )Nr   z>IBHrf   re   rd      r   rp   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   rg   rE   rh   lenminrA   rj   rk   r	   rl   rB   rm   ri   is_setdebugro   read_packetrH   r   r!   r3   r   
ValueErrorr2   r   rz   INVALID_COMMANDKeyboardInterrupt)r:   rq   rr   rt   rv   	remainingseqheadersizebodyrn   rN   last_karecv	r_channelr_cmdr_len	ka_statusr_seqr   r   r    rx      sx   	



,
zCtapHidDevice._do_callNonec                 C  s   |  tj dS )z"Causes the authenticator to blink.N)rF   r!   r/   rV   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+   )r:   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   rg   )r:   r   r   r   r    lock  s   zCtapHidDevice.lockc                 C  s   | j r| j   d | _ d S d S r9   )rB   closerV   r   r   r    r     s   

zCtapHidDevice.closeIterator[CtapHidDevice]c                 c  s"    t  D ]
}| |t|V  qd S r9   )list_descriptorsopen_connection)clsdr   r   r    list_devices  s   
zCtapHidDevice.list_devices)r?   r   )r7   rX   )r7   r\   )r7   r_   )rp   NN)
rq   rX   rr   rs   rt   ru   rv   rw   r7   rs   )r7   r   )r   )r   rs   r7   rs   )r   )r   rX   r7   r   r7   r   )r   r   r   r   rS   rW   propertyrZ   r]   r^   ra   rc   ro   rF   rx   r   r   r   r   classmethodr   r   r   r   r    r>   c   s4    


G
r>   r7   r   c                   C  s   t  S r9   )r>   r   r   r   r   r    r     s   r   c                 C  s   t | }t|t|S r9   )get_descriptorr>   r   )rU   r?   r   r   r    open_device  s   r   r   )r7   r>   )1
__future__r   baser   ctapr   r   r   utilsr	   	threadingr
   enumr   r   r   typingr   r   r   r   rG   sysrC   logging	getLoggerr   rj   platform
startswith r   backendr   r   r   r   r   	Exceptionr   r   r   r   r!   r5   rh   r>   r   r   r   r   r   r    <module>   sL   

 
5