
    Dj1                       d dl mZ d dlZd dlZd dlmZ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 d	dlmZ  ej        e          Z G d d          Z G d de          Z G d d          Z G d de          ZdS )    )annotationsN)IntEnumunique)Event)AnyCallableMapping   )cbor)	CtapError   )Ctap2Info)PinProtocolc                      e Zd Ze G d de                      Ze G d de                      Ze G d de                      Zedd            Z	ddZ
ddZdS )BioEnrollmentc                  .    e Zd ZdZdZdZdZdZdZdZ	dZ
d	S )
BioEnrollment.RESULTr   r
                     N)__name__
__module____qualname__MODALITYFINGERPRINT_KINDMAX_SAMPLES_REQUIREDTEMPLATE_IDLAST_SAMPLE_STATUSREMAINING_SAMPLESTEMPLATE_INFOSMAX_TEMPLATE_FRIENDLY_NAME     J/home/thesage/.hermes/venv/lib/python3.11/site-packages/fido2/ctap2/bio.pyRESULTr   -   s=        #! %)"""r'   r)   c                      e Zd ZdZdZdS )BioEnrollment.TEMPLATE_INFOr   r
   N)r   r   r   IDNAMEr&   r'   r(   TEMPLATE_INFOr+   8   s        r'   r.   c                      e Zd ZdZdS )BioEnrollment.MODALITYr   N)r   r   r   FINGERPRINTr&   r'   r(   r   r0   =   s        r'   r   infor   returnboolc                D    d| j         v rdS d| j        v rd| j         v rdS dS )N	bioEnrollTFIDO_2_1_PREuserVerificationMgmtPreviewF)optionsversions)r2   s    r(   is_supportedzBioEnrollment.is_supportedA   s:    $,&&4 dm++-==4ur'   ctapr   modalityc                    |                      |j                  st          d          || _        |                                 | _        || j        k    rt          d|d          d S )Nz(Authenticator does not support BioEnrollzDevice does not support s)r;   r2   
ValueErrorr<   get_modalityr=   )selfr<   r=   s      r(   __init__zBioEnrollment.__init__M   ss      ++ 	IGHHH	))++t}$$DDDDEEE %$r'   intc                b    | j                             d          t          j        j                 S )zaGet bio modality.

        :return: The type of modality supported by the authenticator.
        T)rA   )r<   bio_enrollmentr   r)   r   rB   s    r(   rA   zBioEnrollment.get_modalityV   s-    
 y''T':: )
 	
r'   N)r2   r   r3   r4   )r<   r   r=   r   )r3   rD   )r   r   r   r   r   r)   r.   r   staticmethodr;   rC   rA   r&   r'   r(   r   r   ,   s        * * * * * * * V*        V     7   V 	 	 	 \	F F F F
 
 
 
 
 
r'   r   c                        e Zd Zd fdZ xZS )CaptureErrorcoderD   c                ^    || _         t                                          d|            d S )NzFingerprint capture error: )rK   superrC   )rB   rK   	__class__s     r(   rC   zCaptureError.__init__a   s1    	=t==>>>>>r'   )rK   rD   )r   r   r   rC   __classcell__rN   s   @r(   rJ   rJ   `   s=        ? ? ? ? ? ? ? ? ? ?r'   rJ   c                  2    e Zd ZdZdddZ	 	 dddZddZdS )FPEnrollmentContextaj  Helper object to perform fingerprint enrollment.

    :param bio: An instance of FPBioEnrollment.
    :param timeout: Optional timeout for fingerprint captures (ms).
    :ivar remaining: The number of (estimated) remaining samples needed.
    :ivar template_id: The ID of the new template (only available after the initial
        sample has been captured).
    Nbio'FPBioEnrollment'timeout
int | Nonec                >    || _         || _        d | _        d | _        d S N)_biorU   template_id	remaining)rB   rS   rU   s      r(   rC   zFPEnrollmentContext.__init__p   s#    	)-%)r'   eventEvent | Noneon_keepaliveCallable[[int], None] | Noner3   bytes | Nonec                >   | j         0| j                            | j        ||          \  | _         }| _        n/| j                            | j         | j        ||          \  }| _        |t          j        j        k    rt          |          | j        dk    r| j         S dS )aT  Capture a fingerprint sample.

        This call will block for up to timeout milliseconds (or indefinitely, if
        timeout not specified) waiting for the user to scan their fingerprint to
        collect one sample.

        :return: None, if more samples are needed, or the template ID if enrollment is
            completed.
        Nr   )
rZ   rY   enroll_beginrU   r[   enroll_capture_nextFPBioEnrollmentFEEDBACKFP_GOODrJ   )rB   r\   r^   statuss       r(   capturezFPEnrollmentContext.capturev   s     #7;y7M7Me\8 84Dfdnn &*Y%B%B $,|& &"FDN _-555v&&&>Q##tr'   Nonec                F    | j                                          d| _        dS )zCancels ongoing enrollment.N)rY   enroll_cancelrZ   rG   s    r(   cancelzFPEnrollmentContext.cancel   s$    	!!!r'   rX   )rS   rT   rU   rV   )NN)r\   r]   r^   r_   r3   r`   r3   ri   )r   r   r   __doc__rC   rh   rl   r&   r'   r(   rR   rR   f   sl         * * * * * #59    8           r'   rR   c                      e Zd ZdZe G d de                      Ze G d de                      Ze G d de                      Zd* fdZ	d+dZ
d,dZ	 	 	 d-d.dZ	 	 	 d-d/dZd0d!Zd1d2d#Zd3d%Zd4d(Zd5d)Z xZS )6rd   a  Implementation of the bio enrollment API.

    NOTE: The get_fingerprint_sensor_info method does not require authentication, and
    can be used by setting pin_uv_protocol and pin_uv_token to None.

    :param ctap: An instance of a CTAP2 object.
    :param pin_uv_protocol: The PIN/UV protocol version used.
    :param pin_uv_token: A valid PIN/UV Auth Token for the current CTAP session.
    c                  *    e Zd ZdZdZdZdZdZdZdZ	dS )	FPBioEnrollment.CMDr   r
   r   r   r   r   r   N)
r   r   r   ENROLL_BEGINENROLL_CAPTURE_NEXTENROLL_CANCELENUMERATE_ENROLLMENTSSET_NAMEREMOVE_ENROLLMENTGET_SENSOR_INFOr&   r'   r(   CMDrq      s4        " $ r'   ry   c                      e Zd ZdZdZdZdS )FPBioEnrollment.PARAMr   r
   r   N)r   r   r   r!   TEMPLATE_NAME
TIMEOUT_MSr&   r'   r(   PARAMr{      s        


r'   r~   c                  P    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ZdZdZdZdZd ZdS )FPBioEnrollment.FEEDBACKr   r   r
   r   r   r   r   r   r   	   
               c                (    d| j         dd| j         S )N0x02Xz - )valuenamerG   s    r(   __str__z FPBioEnrollment.FEEDBACK.__str__   s    6
66649666r'   N)r   r   r   rf   FP_TOO_HIGH
FP_TOO_LOWFP_TOO_LEFTFP_TOO_RIGHTFP_TOO_FASTFP_TOO_SLOWFP_POOR_QUALITYFP_TOO_SKEWEDFP_TOO_SHORTFP_MERGE_FAILURE	FP_EXISTSFP_DATABASE_FULLNO_USER_ACTIVITYNO_UP_TRANSITIONr   r&   r'   r(   re   r      sr        
		7 	7 	7 	7 	7r'   re   r<   r   pin_uv_protocolr   pin_uv_tokenbytesc                    t                                          |t          j        j                   || _        || _        d S rX   )rM   rC   r   r   r1   r   r   )rB   r<   r   r   rN   s       r(   rC   zFPBioEnrollment.__init__   s9    }5ABBB.(r'   NTc                   | j         ||||d}|rft          j        d| j         |          }||t          j        |          z  }| j        j        |d<   | j                            | j        |          |d<    | j	        j
        di |S )N)r=   sub_cmdsub_cmd_paramsr\   r^   z>BBr   pin_uv_paramr&   )r=   structpackr   encoder   VERSIONauthenticater   r<   rF   )rB   r   paramsauthr\   r^   kwargsmsgs           r(   _callzFPBioEnrollment._call   s    $("
 "
  	+eT]G<<C!t{6***(,(<(DF$%%)%9%F%F!3& &F>" (ty'11&111r'   r3   Mapping[int, Any]c                N    |                      t          j        j        d          S )ztGet fingerprint sensor info.

        :return: A dict containing FINGERPRINT_KIND and MAX_SAMPLES_REQUIRES.
        Fr   )r   rd   ry   rx   rG   s    r(   get_fingerprint_sensor_infoz+FPBioEnrollment.get_fingerprint_sensor_info   s     
 zz/-=EzJJJr'   rU   rV   r\   r]   r^   r_   +tuple[bytes, FPBioEnrollment.FEEDBACK, int]c                   t                               d| d           |                     t          j        j        |t          j        j        |ind||          }t                               d|            |t          j	        j
                 t                              |t          j	        j                           |t          j	        j                 fS )a  Start fingerprint enrollment.

        Starts the process of enrolling a new fingerprint, and will wait for the user
        to scan their fingerprint once to provide an initial sample.

        :param timeout: Optional timeout in milliseconds.
        :return: A tuple containing the new template ID, the sample status, and the
            number of samples remaining to complete the enrollment.
        z)Starting fingerprint enrollment (timeout=)Nr\   r^   Sample capture result: )loggerdebugr   rd   ry   rr   r~   r}   r   r)   r!   re   r"   r#   )rB   rU   r\   r^   results        r(   rb   zFPBioEnrollment.enroll_begin   s     	KKKKLLL, & !&17;;%  	
 	
 	7v77888='34$$VM,@,S%TUU='9:
 	
r'   rZ   $tuple[FPBioEnrollment.FEEDBACK, int]c                   t                               d| d           t          j        j        |i}|||t          j        j        <   |                     t          j        j        |||          }t                               d|            t          	                    |t          j        j                           |t          j        j                 fS )a  Continue fingerprint enrollment.

        Continues enrolling a new fingerprint and will wait for the user to scan their
        fingerpring once to provide a new sample.
        Once the number of samples remaining is 0, the enrollment is completed.

        :param template_id: The template ID returned by a call to `enroll_begin`.
        :param timeout: Optional timeout in milliseconds.
        :return: A tuple containing the sample status, and the number of samples
            remaining to complete the enrollment.
        z$Capturing next sample with (timeout=r   Nr   r   )r   r   rd   r~   r!   r}   r   ry   rs   re   r   r)   r"   r#   )rB   rZ   rU   r\   r^   r   r   s          r(   rc   z#FPBioEnrollment.enroll_capture_next  s    $ 	FGFFFGGG"1"7"C[!Q7>F?(343%	  
 
 	7v77888$$VM,@,S%TUU='9:
 	
r'   ri   c                    t                               d           |                     t          j        j        d           dS )z*Cancel any ongoing fingerprint enrollment.z"Cancelling fingerprint enrollment.Fr   N)r   r   r   rd   ry   rt   rG   s    r(   rk   zFPBioEnrollment.enroll_cancel)  s7    9:::

?&45
AAAAAr'   rR   c                "    t          | |          S )zConvenience wrapper for doing fingerprint enrollment.

        See FPEnrollmentContext for details.
        :return: An initialized FPEnrollmentContext.
        )rR   )rB   rU   s     r(   enrollzFPBioEnrollment.enroll.  s     #4111r'   Mapping[bytes, str | None]c                    	 d |                      t          j        j                  t          j        j                 D             S # t          $ r'}|j        t          j	        j
        k    ri cY d}~S  d}~ww xY w)zGet a dict of enrolled fingerprint templates which maps template ID's to
        their friendly names.

        :return: A dict of enrolled template_id -> name pairs.
        c                h    i | ]/}|t           j        j                 |t           j        j                 0S r&   )r   r.   r,   r-   ).0ts     r(   
<dictcomp>z9FPBioEnrollment.enumerate_enrollments.<locals>.<dictcomp>=  s@        --011]5P5U3V  r'   N)r   rd   ry   ru   r   r)   r$   r   rK   ERRINVALID_OPTION)rB   es     r(   enumerate_enrollmentsz%FPBioEnrollment.enumerate_enrollments6  s    
	 O$7$MNN!(7     	 	 	v555							s$   AA 
A6A1*A60A11A6r   strc                ,   t                               d|                                 d|            |                     t          j        j        t          j        j	        |t          j        j
        |i           t                               d           dS )zSet/Change the friendly name of a previously enrolled fingerprint template.

        :param template_id: The ID of the template to change.
        :param name: A friendly name to give the template.
        zChanging name of template: z to zFingerprint template renamedN)r   r   hexr   rd   ry   rv   r   r.   r,   r-   r2   )rB   rZ   r   s      r(   set_namezFPBioEnrollment.set_nameH  s     	P;??3D3DPP$PPQQQ

(+.+0$	
 	
 	
 	233333r'   c                   t                               d|                                            |                     t          j        j        t          j        j	        |i           t           
                    d           dS )zzRemove a previously enrolled fingerprint template.

        :param template_id: The Id of the template to remove.
        zDeleting template: zFingerprint template deletedN)r   r   r   r   rd   ry   rw   r   r.   r,   r2   )rB   rZ   s     r(   remove_enrollmentz!FPBioEnrollment.remove_enrollmentX  sq    
 	>;??+<+<>>???

1(+[9	
 	
 	
 	233333r'   )r<   r   r   r   r   r   )NTNN)r3   r   )NNN)rU   rV   r\   r]   r^   r_   r3   r   )
rZ   r   rU   rV   r\   r]   r^   r_   r3   r   rm   rX   )rU   rV   r3   rR   )r3   r   )rZ   r   r   r   r3   ri   )rZ   r   r3   ri   )r   r   r   rn   r   r   ry   r~   re   rC   r   r   rb   rc   rk   r   r   r   r   rO   rP   s   @r(   rd   rd      s             g   V        V
 7 7 7 7 77 7 7 V7() ) ) ) ) )
2 2 2 2$K K K K #"59	
 
 
 
 
H #"59 
  
  
  
  
DB B B B
2 2 2 2 2   $4 4 4 4 
4 
4 
4 
4 
4 
4 
4 
4r'   rd   )
__future__r   loggingr   enumr   r   	threadingr   typingr   r   r	    r   r<   r   baser   r   pinr   	getLoggerr   r   r   	ExceptionrJ   rR   rd   r&   r'   r(   <module>r      s  8 # " " " " "                         ) ) ) ) ) ) ) ) ) )                          		8	$	$1
 1
 1
 1
 1
 1
 1
 1
h? ? ? ? ?9 ? ? ?/  /  /  /  /  /  /  / dJ4 J4 J4 J4 J4m J4 J4 J4 J4 J4r'   