
    <[jԝ                    ,   d dl mZ d dlZd dlZd dlmZ d dlmZmZ d dl	m
Z
mZ d dlmZmZ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mZ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&m'Z'm(Z( ddl)m*Z* ddl+m,Z, ddl-m.Z. ddl/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZA  ejB        eC          ZD G d deE          ZFeFfdZG G d deF          ZHd ZI G d d          ZJ G d dejK                  ZL G d d          ZM G d d ejK                  ZN G d! d"eN          ZOd# ZP G d$ d%ejK                  ZQ G d& d'eQ          ZR G d( d)eJ          ZSed6d.            ZTed7d0            ZTd1 ZT G d2 d3eQ          ZU G d4 d5eL          ZVdS )8    )annotationsN)replace)IntEnumunique)EventTimer)AnyCallableMappingSequenceoverload)urlparse   )ES256)
CtapDevice	CtapError)APDU	ApduErrorCtap1)AssertionResponseCtap2Info)_DEFAULT_EXTENSIONS AuthenticationExtensionProcessorCtap2ExtensionRegistrationExtensionProcessor)	ClientPinPinProtocol)STATUS)verify_rp_id)sha256)AaguidAttestationConveyancePreferenceAttestationObject%AuthenticationExtensionsClientOutputsAuthenticationResponseAuthenticatorAssertionResponseAuthenticatorAttachment AuthenticatorAttestationResponseAuthenticatorSelectionCriteriaCollectedClientData"PublicKeyCredentialCreationOptionsPublicKeyCredentialDescriptor!PublicKeyCredentialRequestOptionsPublicKeyCredentialTypeRegistrationResponseResidentKeyRequirementUserVerificationRequirement_as_cborc                  L    e Zd ZdZe G d de                      ZddZd ZdS )ClientErrorzBase error raised by clients.c                  .    e Zd ZdZdZdZdZdZdZd	dZ	dS )
ClientError.ERRzError codes for ClientError.   r            Nc                "    t          | |          S N)r5   )selfcauses     ]/home/thesage/.hermes/hermes-agent/venv/lib/python3.11/site-packages/fido2/client/__init__.py__call__zClientError.ERR.__call__Y   s    tU+++    r=   )
__name__
__module____qualname____doc__OTHER_ERRORBAD_REQUESTCONFIGURATION_UNSUPPORTEDDEVICE_INELIGIBLETIMEOUTrA    rB   r@   ERRr7   O   sI        **$%!	, 	, 	, 	, 	, 	,rB   rM   Nc                R    t                               |          | _        || _        d S r=   )r5   rM   coder?   )r>   rO   r?   s      r@   __init__zClientError.__init__\   s     OOD))	


rB   c                d    d                     | j                  }| j        r|d| j         dz  }|S )NzClient error: {0} - {0.name}z	 (cause: ))formatrO   r?   )r>   rs     r@   __repr__zClientError.__repr__`   s>    *11$)<<: 	+*TZ****ArB   r=   )	rC   rD   rE   rF   r   r   rM   rP   rU   rL   rB   r@   r5   r5   L   sq        ''
, 
, 
, 
, 
,g 
, 
, V
,       rB   r5   c                   | j         t          j        j        t          j        j        fv rt
          j        j        }n| j         t          j        j        t          j        j        t          j        j	        fv rt
          j        j
        }nh| j         t          j        j        t          j        j        t          j        j        fv rt
          j        j        }n| j         t          j        j        t          j        j        t          j        j        t          j        j        t          j        j        t          j        j        t          j        j        t          j        j        t          j        j        t          j        j        t          j        j        t          j        j        t          j        j        t          j        j        t          j        j        fv rt
          j        j        }nt
          j        j        } |||           S r=   ) rO   r   rM   CREDENTIAL_EXCLUDEDNO_CREDENTIALSr5   rJ   KEEPALIVE_CANCELACTION_TIMEOUTUSER_ACTION_TIMEOUTrK   UNSUPPORTED_ALGORITHMUNSUPPORTED_OPTIONKEY_STORE_FULLrI   INVALID_COMMANDCBOR_UNEXPECTED_TYPEINVALID_CBORMISSING_PARAMETERINVALID_OPTIONPUAT_REQUIREDPIN_INVALIDPIN_BLOCKEDPIN_NOT_SETPIN_POLICY_VIOLATIONPIN_TOKEN_EXPIREDPIN_AUTH_INVALIDPIN_AUTH_BLOCKEDREQUEST_TOO_LARGEOPERATION_DENIEDrH   rG   )eerr_clsces      r@   _ctap2client_errrq   g   sR   v)-3Y]5QRRR_.	
&$) 
 

 _$	
+($ 
 

 _6	
%*"'$#!!!*'&&'& 
 
" _(_(72q>>rB   c                  <     e Zd ZdZej        j        df fd	Z xZS )PinRequiredErrorz=Raised when a call cannot be completed without providing PIN.zPIN required but not providedc                L    t                                          ||           d S r=   )superrP   )r>   rO   r?   	__class__s      r@   rP   zPinRequiredError.__init__   s%     	u%%%%%rB   )	rC   rD   rE   rF   r5   rM   rH   rP   __classcell__rv   s   @r@   rs   rs      sP        GG ?.6U& & & & & & & & & &rB   rs   c                   |pt                      }|                                s	  ||i |S # t          $ rm}|j        t          j        k    r/|r |t          j                   d }|                    |            nt          j
                            |          Y d }~n$d }~wt          $ r}t          |          d }~ww xY w|                                t          j
                                        r=   )r   is_setr   rO   r   USE_NOT_SATISFIEDr   UPNEEDEDwaitr5   rM   rG   r   rq   rK   )
poll_delayeventon_keepalivefuncargskwargsrn   s          r@   _call_pollingr      s   UWWEllnn &	&4(((( 	5 	5 	5v/// ( L111#'L

:&&&&!o11!444 '&&&&  	& 	& 	&"1%%%	& llnn & /
!
!
#
##s!   . 
CA#B  C-B<<Cc                  6    e Zd ZdZi fddZdd
ZddZddZdS )AssertionSelectionzGetAssertion result holding one or more assertions.

    Since multiple assertions may be retured by Fido2Client.get_assertion, this result
    is returned which can be used to select a specific response to get.
    client_datar+   
assertionsSequence[AssertionResponse]extension_resultsMapping[str, Any]c                0    || _         || _        || _        d S r=   )_client_data_assertions_extension_results)r>   r   r   r   s       r@   rP   zAssertionSelection.__init__   s"     (%"3rB   returnc                    | j         S )zIGet the raw AssertionResponses available to inspect before selecting one.)r   r>   s    r@   get_assertionsz!AssertionSelection.get_assertions   s    rB   	assertionr   c                    | j         S r=   )r   )r>   r   s     r@   _get_extension_resultsz)AssertionSelection._get_extension_results   s    &&rB   indexintr&   c           
     *   | j         |         }t          |j        d         t          | j        |j        |j        |j        r|j        d         nd          t          j	        t          |                     |                    t          j                  S )zGet a single response.idN)r   authenticator_data	signatureuser_handleraw_idresponseauthenticator_attachmentclient_extension_resultstype)r   r&   
credentialr'   r   	auth_datar   userr(   CROSS_PLATFORMr%   r   r/   
PUBLIC_KEY)r>   r   r   s      r@   get_responsezAssertionSelection.get_response   s    $U+	%'-3 -#,#6#-4=NLIN400	   &=%K%J++I66& & )3
 
 
 	
rB   N)r   r+   r   r   r   r   )r   r   )r   r   r   r   )r   r   r   r&   )rC   rD   rE   rF   rP   r   r   r   rL   rB   r@   r   r      sx          02	4 4 4 4 4       ' ' ' '
 
 
 
 
 
rB   r   c                  ^    e Zd ZdZej        	 ddd	            Zej        	 ddd            ZdS )WebAuthnClientzMBase class for a WebAuthn client, supporting registration and authentication.Noptionsr,   r   Event | Noner   r0   c                    t                      )Creates a credential.

        :param options: PublicKeyCredentialCreationOptions data.
        :param threading.Event event: (optional) Signal to abort the operation.
        NotImplementedErrorr>   r   r   s      r@   make_credentialzWebAuthnClient.make_credential        "###rB   r.   r   c                    t                      )Get an assertion.

        :param options: PublicKeyCredentialRequestOptions data.
        :param threading.Event event: (optional) Signal to abort the operation.
        r   r   s      r@   get_assertionzWebAuthnClient.get_assertion   r   rB   r=   r   r,   r   r   r   r0   r   r.   r   r   r   r   )rC   rD   rE   rF   abcabstractmethodr   r   rL   rB   r@   r   r      st        WW #
$ 
$ 
$ 
$ 
$ 	 #
$ 
$ 
$ 
$ 
$ 
$ 
$rB   r   c                  *    e Zd ZdZddZdd	ZddZdS )UserInteractionzProvides user interaction to the Client.

    Users of Fido2Client should subclass this to implement asking the user to perform
    specific actions, such as entering a PIN or touching theirr   Nonec                :    t                               d           dS )z@Called when the authenticator is awaiting a user presence check.zUser Presence check required.Nloggerinfor   s    r@   	prompt_upzUserInteraction.prompt_up   s    344444rB   permissionsClientPin.PERMISSIONrp_id
str | Nonec                :    t                               d           dS )zkCalled when the client requires a PIN from the user.

        Should return a PIN, or None/Empty to cancel.z7PIN requested, but UserInteraction does not support it.Nr   r>   r   r   s      r@   request_pinzUserInteraction.request_pin   s     	MNNNtrB   boolc                :    t                               d           dS )zxCalled when the client is about to request UV from the user.

        Should return True if allowed, or False to cancel.zUser Verification requested.Tr   r   s      r@   
request_uvzUserInteraction.request_uv  s     	2333trB   N)r   r   )r   r   r   r   r   r   )r   r   r   r   r   r   )rC   rD   rE   rF   r   r   r   rL   rB   r@   r   r      s\        B B
5 5 5 5        rB   r   c                  4    e Zd ZdZej        dd            ZdS )	ClientDataCollectorzProvides client data and logic to the Client.

    Users should subclass this to implement custom behavior for determining the origin,
    validating the RP ID, and providing client data for a request.
    r   FPublicKeyCredentialCreationOptions | PublicKeyCredentialRequestOptionsr   tuple[CollectedClientData, str]c                    dS )zCalled when the client is preparing a request.

        Should return a CollectedClientData object with the client data for the request,
        as well as the RP ID of the credential.
        NrL   r>   r   s     r@   collect_client_dataz'ClientDataCollector.collect_client_data  s      rB   N)r   r   r   r   )rC   rD   rE   rF   r   r   r   rL   rB   r@   r   r     sB          	     rB   r   c                  <    e Zd ZdZefddZdd
ZddZddZd ZdS )DefaultClientDataCollectorzDefault implementation of ClientDataProvider.

    This implementation uses a fixed origin, it can be subclassed to customize specific
    behavior.
    originstrverifyCallable[[str, str], bool]c                "    || _         || _        d S r=   )_origin_verify)r>   r   r   s      r@   rP   z#DefaultClientDataCollector.__init__(  s    rB   r   r   r   c                4   t          |t                    r|j        j        }n,t          |t                    r|j        }nt          d          |Gt          |          }|j        dk    s|j	        st          j                            d          |j	        S |S )z/Get the RP ID for the given options and origin.Invalid options type.Nhttpsz$RP ID required for non-https origin.)
isinstancer,   rpr   r.   r   
ValueErrorr   schemenetlocr5   rM   rH   )r>   r   r   r   urls        r@   	get_rp_idz$DefaultClientDataCollector.get_rp_id,  s     gABB 	6JMEE!BCC 	6MEE4555=6""CzW$$CJ$!o11:   :LrB   r   r   c                    	 |                      ||          rdS n# t          $ r Y nw xY wt          j                                        )z&Verify the RP ID for the given origin.N)r   	Exceptionr5   rM   rH   )r>   r   r   s      r@   r    z'DefaultClientDataCollector.verify_rp_idC  s[    	||E6**  	 	 	D	o))+++s    
((c                    t          |t                    rt          j        j        S t          |t
                    rt          j        j        S t          d          )z+Get the request type for the given options.r   )r   r,   r+   TYPECREATEr.   GETr   r   s     r@   get_request_typez+DefaultClientDataCollector.get_request_typeL  sO    gABB 	6&+22!BCC 	6&+//4555rB   c                    |                      || j                  }|                     || j                   t          j        |                     |          | j        |j                  |fS )N)r   r   	challenge)r   r   r    r+   creater   r   )r>   r   r   s      r@   r   z.DefaultClientDataCollector.collect_client_dataU  sq    w55%...  &**733|!+  
 
 	
rB   N)r   r   r   r   )r   r   r   r   r   r   )r   r   r   r   r   r   )r   r   )	rC   rD   rE   rF   r    rP   r   r   r   rL   rB   r@   r   r   !  s          JV        ., , , ,6 6 6 6
 
 
 
 
rB   r   c                      fd}|S )Nc                T    | t           j        k    r                                 d S d S r=   )r   r|   r   )statususer_interactions    r@   r   z%_user_keepalive.<locals>.on_keepaliveg  s0    V_$$&&((((( %$rB   rL   )r   r   s   ` r@   _user_keepaliver   f  s$    ) ) ) ) ) rB   c                      e Zd ZU ded<   ej        dd            Zej        dd            Zej        dd            ZdS )_ClientBackendr   r   r   r   r   r   c                    t                      r=   r   r>   r   s     r@   	selectionz_ClientBackend.selectionq  s    !###rB   r   r,   r   r+   r   r   enterprise_rpid_listSequence[str] | Noner   r0   c                    t                      r=   r   )r>   r   r   r   r   r   s         r@   do_make_credentialz!_ClientBackend.do_make_credentialu  s     "###rB   r.   r   c                    t                      r=   r   )r>   r   r   r   r   s        r@   do_get_assertionz_ClientBackend.do_get_assertion  s     "###rB   Nr   r   r   r   )r   r,   r   r+   r   r   r   r   r   r   r   r0   )
r   r.   r   r+   r   r   r   r   r   r   )	rC   rD   rE   __annotations__r   r   r   r   r  rL   rB   r@   r   r   n  s         JJJ$ $ $ $ 	$ $ $ $ 	$ $ $ $ $ $rB   r   c                  (    e Zd Zd
dZd Zd Zd Zd	S )_Ctap1ClientBackenddevicer   r   r   c                    t          |          | _        t          dgg t          j                  | _        d| _        t          |          | _        d S )NU2F_V2)versions
extensionsaaguidg      ?)	r   ctap1r   r"   NONEr   _poll_delayr   _on_keepalive)r>   r  r   s      r@   rP   z_Ctap1ClientBackend.__init__  sH    6]]
8*FKPPP	,-=>>rB   c                L    t          | j        |d | j        j        dd           d S )N                                    )r   r  r  registerr   s     r@   r   z_Ctap1ClientBackend.selection  s8    J	
 	
 	
 	
 	
rB   c                   |j         }|j        }|j        pt                      }|j        }	|j        }
|	s=|
t          j        k    s-t          j	        d |D             vs|j
        t          j        k    rt          t          j        j                  t!          |                                          }d}|pg D ]}|j        }	 | j                            |||d           t*          j                                        # t.          $ re}|j        t2          j        k    rFt7          | j        || j        | j        j        ||           t*          j                                        Y d }~d }~ww xY wtA          j!        |t7          | j        || j        | j        j        |j"        |                    }|j#        j$        }|J tK          |j&        tO          ||          tP          j)        tU          i           tV          j,                  S )Nc                    g | ]	}|j         
S rL   )alg).0ps     r@   
<listcomp>z:_Ctap1ClientBackend.do_make_credential.<locals>.<listcomp>  s    &A&A&Aqu&A&A&ArB   r  Tr   attestation_objectr   )-pub_key_cred_paramsexclude_credentialsauthenticator_selectionr*   require_resident_keyuser_verificationr2   REQUIREDr   	ALGORITHMattestationr#   
ENTERPRISEr   rM   r]   r!   encoder   r  authenticater5   rG   r   rO   r   r{   r   r  r  r  rJ   r$   
from_ctap1hashr   credential_datar0   credential_idr)   r(   r   r%   r/   r   )r>   r   r   r   r   r   
key_paramsexclude_listr   rkr  	app_paramdummy_paramcred
key_handlern   att_objr   s                     r@   r   z&_Ctap1ClientBackend.do_make_credential  s,    0
23W7U7W7W	+%7 	> $?$HHH&A&Aj&A&A&AAA"&E&PPPIM<===5<<>>**	  &B 	> 	>DJ>
''Y
DQQQ!o11333 
> 
> 
>6T333!(*
+##   &/;;=== 43333
> $. "
#  

 

 &6
%%%#+5'G   &=%K%J2%N%N(3
 
 
 	
s    ;C;;
E*AE%%E*c           
     @   |j         }|j        }|t          j        k    s|st	          t          j        j                  t          |                                          }|j	        }|D ]}		 t          | j        || j        | j        j        |||	j                  }
t!          j        |t%          |	          |
          g}t'          ||          c S # t(          $ r%}|j        t(          j        j        k    r Y d }~d }~ww xY wt(          j                                        r=   )allow_credentialsr  r2   r   r   rM   r]   r!   r$  r'  r   r  r  r  r%  r   r   r&  r3   r   r5   rO   rK   rJ   )r>   r   r   r   r   
allow_listr  r-  client_paramr/  	auth_respr   rn   s                r@   r  z$_Ctap1ClientBackend.do_get_assertion  s2    .
#5 ; DDDJDIM<===5<<>>**	"' 	 	D)$&J+ G 	 &0HTNNIVV
 *+zBBBBB   6[_444 54444 o//111s   ,A!C
C?C::C?N)r  r   r   r   )rC   rD   rE   rP   r   r   r  rL   rB   r@   r  r    sY        ? ? ? ?
 
 
@
 @
 @
D!2 !2 !2 !2 !2rB   r  c                  &     e Zd Zd fd	Zd
 Z xZS )_Ctap2ClientAssertionSelectionr   r+   r   r   r
  *Sequence[AuthenticationExtensionProcessor]	pin_tokenbytes | Nonec                h    t                                          ||           || _        || _        d S r=   )ru   rP   _extensions
_pin_token)r>   r   r   r
  r:  rv   s        r@   rP   z'_Ctap2ClientAssertionSelection.__init__  s2     	j111%#rB   c                    i }	 | j         D ]4}|                    || j                  }|r|                    |           5n1# t          $ r$}t
          j                            |          d }~ww xY w|S r=   )r=  prepare_outputsr>  updater   r5   rM   rI   )r>   r   extension_outputsextoutputrn   s         r@   r   z5_Ctap2ClientAssertionSelection._get_extension_results  s    	?' 5 5,,YHH 5%,,V4445  	? 	? 	?/;;A>>>	?  s   <A 
A/A**A/)r   r+   r   r   r
  r9  r:  r;  )rC   rD   rE   rP   r   rw   rx   s   @r@   r8  r8    sL        	$ 	$ 	$ 	$ 	$ 	$
! 
! 
! 
! 
! 
! 
!rB   r8  valuesr   r   listc                    d S r=   rL   rE  s    r@   
_cbor_listrI    s    *-#rB   r   c                    d S r=   rL   rH  s    r@   rI  rI    s    &)crB   c                "    | sd S d | D             S )Nc                ,    g | ]}t          |          S rL   )r3   )r  vs     r@   r  z_cbor_list.<locals>.<listcomp>&  s    (((AHQKK(((rB   rL   rH  s    r@   rI  rI  #  s#     t((((((rB   c                  @    e Zd ZddZd Zd	 Zd
 Zd Zd Zd Z	d Z
dS )_Ctap2ClientBackendr  r   r   r   r
  Sequence[Ctap2Extension]c                l    t          |          | _        | j        j        | _        || _        || _        d S r=   )r   ctap2r   r=  r   )r>   r  r   r
  s       r@   rP   z_Ctap2ClientBackend.__init__*  s2     6]]
JO	% 0rB   c                l   | j                                         }|j        rfd|D             }d}|r|                    ||          }	|j        }
nd }	d }
|j        pd}|r|d |         }	 | j                             ||t          |          d ddi|	|
||	  	        }t          |          dk    r|d         S t          di |d         j
        S # t          $ rS}|j        xt          j        j        k    r|dk    r |dz  }n!t          j        j        k    r||d          }n	  Y d }~nd }~ww xY w|d S )	Nc                D    g | ]}t          |j                  k    |S rL   )lenr   )r  cmax_lens     r@   r  z5_Ctap2ClientBackend._filter_creds.<locals>.<listcomp>>  s+    FFFqQTg1E1E1E1E1ErB   r  r8   upFr   r   r   rL   )rR  get_infomax_cred_id_lengthr%  VERSIONmax_creds_in_listr   rI  rU  r-   r   r   rO   rM   rl   rX   )r>   r   	cred_listpin_protocolr:  r   r   r   client_data_hashpin_authversion	max_credschunkr   rn   rW  s                  @r@   _filter_credsz!_Ctap2ClientBackend._filter_creds5  s    z""$$ ) 	GFFFFIFFFI% 	#00<LMMH"*GGHG*/a	 	jyj)E!Z66$u%%5M!- 7 
 

 u::?? 8O8TT:a=;STTT 	 	 	f8888IMMM!Q		"555$-ijj$9			'  	> ts    .AC ;C 
D/A	D**D/c                `   d| j         j        j        v r| j                             |           d S 	 | j                             ddddddddd	d
gd|           d S # t
          $ rE}|j        t
          j        j        t
          j        j	        t
          j        j
        fv rY d }~d S  d }~ww xY w)NFIDO_2_1)r   r  zexample.com)r   names   dummydummyz
public-keyi)r   r  rB   )pin_uv_paramr   )rR  r   r	  r   r   r   rO   rM   rg   re   rj   r>   r   rn   s      r@   r   z_Ctap2ClientBackend.selectionj  s    111J  u -----
**(-@@#W55*2667!$ +         6M-M-M2  
 FFFFFs   *A 
B-(9B('B((B-c                   t          fddD                       }t          fddD                       }t          j        j        |z  dk    }|t          j        j        t          j        j        z   z  }|t
          j        k    s,|t
          j        d fv r|sj        	                    d          r#|st          j                            d          dS |r|rj        	                    d          sdS |r|rdS d	S )
Nc              3  *   K   | ]}|j         v V  d S r=   )r   r  kr   s     r@   	<genexpr>z5_Ctap2ClientBackend._should_use_uv.<locals>.<genexpr>  s*      WW1,WWWWWWrB   )uv	clientPin	bioEnrollc              3  L   K   | ]}j                             |          V  d S r=   )r   getrn  s     r@   rp  z5_Ctap2ClientBackend._should_use_uv.<locals>.<genexpr>  sD       
 
$%DLQ
 
 
 
 
 
rB   r   alwaysUvz*User verification not configured/supportedTmakeCredUvNotRqdF)anyr   
PERMISSIONMAKE_CREDENTIALGET_ASSERTIONr2   r   	PREFERREDr   ru  r5   rM   rI   )r>   r   r  r   uv_supporteduv_configuredmcadditional_permss    `      r@   _should_use_uvz"_Ctap2ClientBackend._should_use_uv  sS   WWWW6VWWWWW 
 
 
 
)I
 
 
 
 
 !1K?1D& 093G3UU*
 

 !<!EEE!&A&KT%RRR  S |
++ S
 ! !o??@   4 	M 	$,*:*:;M*N*N 	4 	/ 	4urB   c	                   |r|j                             d          rgt          j        |          r4| j                            ||          r|                    ||||          S n|r| j                            ||          rd S |j                             d          rB| j                            ||          }	|	r|                    |	||          S t                      t          j                            d          )Nrq  rr  z User verification not configured)r   ru  r   is_token_supportedr   r   get_uv_tokenr   get_pin_tokenrs   r5   rM   rI   )
r>   r   
client_pinr   r   r   r   allow_internal_uvallow_uvpins
             r@   
_get_tokenz_Ctap2ClientBackend._get_token  s     	 ((.. 	 +D11  (33KGG %22#UE<   #  (33KGG  4 <K(( 	%'33KGGC I!//[%HHH"$$$ o77.
 
 	
rB   c           
     2   | j                                         }d }	d}
|                     |||          r`t          | j         |          }|t          j        j        t          j        j        z   z  dk    }|                     ||||||||          }	|	sd}
|	|
fS )NFr   T)rR  rZ  r  r   ry  rz  r{  r  )r>   r_  r   r  r   r  r   r   r   r:  internal_uvr  r  s                r@   _get_auth_paramsz$_Ctap2ClientBackend._get_auth_params  s     z""$$	t%6DD 	#"4:|<<J(8*89
   !	 	I  #"+%%rB   c                l    j         j        j        j        pt	                      j        t           j                   j        	                                d j
        t          j        k    r%j                            d          r||v rdndt          j        D ]}|j        j        v r |             nd g d fd} j        j        }d}		 	  |            \  }
}n# t(          $ r}|j        t(          j        j        k    r!t0          j        k    rt0          j        Y d }~U|j        t(          j        j        k    r	rdY d }~xt9          |dd           }|j        t(          j        j        k    r)|r'|	s%|                                  |             d}	Y d }~̂ d }~ww xY wi }	 D ]/}|                    |
|          }||                     |           0n1# tB          $ r$}tD          j        #                    |          d }~ww xY wtI          j%        |
j&        |
j'        |
j(                  }|j'        j)        }|J tU          |j+        tY          |          tZ          j.        t_          |          t`          j1        	          S )
Nepr   r8   Tc            	        t           j        j        } r| t           j        j        z  }                                  j        D ]?}|                    j                  }|r                    |           | |j	        z  } @
                    |           \  }}r                    |          }nd }i }	 D ].}|                    |          }|r|                    |           /n1# t          $ r$}t          j                            |          d }~ww xY wj                            d          }j        t*          j        k    pj        t*          j        k    o|}	|	s|sd }
n1i }
|	r&|st          j                            d          d|
d<   |rd|
d<   j        }r |r                    ||          j        f}nd} j        j        |t7          t9          j                            t7                    t=                    |rt7          |          gnd |pd |
g|R d|fS )Nr,  zResident key not supportedTrq  NN)r   rY  )r   ry  rz  r{  clearr=  r   rR  appendr   r  re  prepare_inputsrA  r   r5   rM   rI   r   ru  resident_keyr1   r   r|  r'  r%  r\  r3   r   r   rI  )r   rn   rC  r:  r  exclude_credextension_inputs
auth_inputcan_rkr,  optsr`  ra  r  r   enterprise_attestationr   r+  r   r*  r   r   r_  r   r   r>   used_extensionsr   r  s                r@   _do_makez8_Ctap2ClientBackend.do_make_credential.<locals>._do_make  s   #.>K By3AA !!###% 3 3''
G\JJ 3#**3///3?2K &*%:%:!& &"I{  $#11<y%     $  "C* < <C!$!3!3I!>!>J! <(//
;;;<  C C C!o??BBBC \%%d++F'+A+JJ &*@*JJUv   &+ & &! )oGG8   "&DJ &!%DJ  +/ (	 ( --i9IJJ (=
 ( +
*$WWZE:::;;TNNz**0<FXl++,,$$,  +   !-    s   1C6 6
D$ DD$Fconnectr  r   )2r   r  r  r  r*   r  r   r   rR  rZ  r"  r#   r#  r   ru  r   	PROTOCOLSr\  pin_uv_protocolsr  r   rO   rM   rd   r2   DISCOURAGEDr   
UV_BLOCKEDgetattrrk   closer@  rA  r   r5   rI   r$   r   fmtr   att_stmtr(  r0   r)  r)   r(   r   r%   r/   r   )r>   r   r   r   r   r   protor  devreconnectedatt_respr:  rn   r  rB  rC  rD  r1  r   r  r  r+  r   r*  r   r_  r   r  r   r  s   ```` `             @@@@@@@@@@@r@   r   z&_Ctap2ClientBackend.do_make_credential  s    |0
23W7U7W7W	%7&t'<==z""$$ "&"A"LLL|%% /'3 44412. ./* ( 	  	 E} 55538577 6  L@BZ	 Z	 Z	 Z	 Z	 Z	 Z	 Z	 Z	 Z	 Z	 Z	 Z	 Z	 Z	 Z	 Z	 Z	 Z	 Z	x j	&.hjj#)    Fim999)-H-TTT(C(L%HHHH6Y]555(5$HHHHH!#y$77Fim<<< =' = IIKKKGIII"&KHHHH/4 	?& 5 5,,XyAA%%,,V4445  	? 	? 	?/;;A>>>	? $*L(,h.?
 
 &6
%%%#+5'G   &=%K%J!& & )3

 

 

 
	
sC   >D 
G6G	G	4AG	G		G2H 
H5H00H5c           
         j         j        j        t           j                  t
          j        D ]!}|j         j        j	        v r |             n"d d f
d} j
        j        }d}	 	  |            S # t          $ r}	|	j        t          j        j        k    r!t           j        k    rt           j        Y d }	~	Q|	j        t          j        j        k    r	rdY d }	~	tt)          |dd           }
|	j        t          j        j        k    r)|
r'|s%|                                  |
             d}Y d }	~	Ȃ d }	~	ww xY w)NTc            	     (  
 t           j        j        } g }j        D ]?}|                    j                  }|r|                    |           | |j        z  } @                    |           \  }}r	                    |          }nd }i }	 |D ]/}|
                    ||          }|r|                    |           0n1# t          $ r$}t          j                            |          d }~ww xY w|rddind }	j        }
r |r                    ||
          j        f}nd}r|st'          d         j        d          } j        j        |
|rt-          |          gnd |pd |	g|R d}t/          |||          S )Nrq  Tr  r       )r   r   rY  )r   ry  r{  r=  r   rR  r  r   r  re  r  rA  r   r5   rM   rI   r'  r%  r\  r-   r   r   r3   r8  )r   r  rn   rC  r:  r  selected_credr  inputsr  r`  ra  r   r4  r  r   r   r   r   r_  r   r>   r  s                r@   _do_authz6_Ctap2ClientBackend.do_get_assertion.<locals>._do_auth  sd   #.<K !O% 3 3oodj'<HH 3#**3///3?2K &*%:%:!& &"I{  % $ 2 2:|Y|! ! !%  "C* 8 8C //yIIF 8(//7778  C C C!o??BBBC $/8D$<<DD  +/ (	 ( --i9IJJ (=
 ( -  !>#A+! ! !
 32 -:D-(()) (D	 	 	 )	 	 	J 2Z)  s   2C 
C=C88C=Fr  )r   r3  r  r   r   r   r  r\  r   r  rR  r  r   rO   rM   rd   r2   r  r   r  r  rk   r  )r>   r   r   r   r   r  r  r  r  rn   r  r4  r  r   r_  r  s   `````      @@@@@r@   r  z$_Ctap2ClientBackend.do_get_assertion  s    .
#5&t'<== ( 	  	 E}	 :::38577 ;  LL	 L	 L	 L	 L	 L	 L	 L	 L	 L	 L	 L	 L	 L	\ j	xzz!    Fim999)-H-TTT(C(L%HHHH6Y]555(5$HHHHH!#y$77Fim<<< =' = IIKKKGIII"&KHHHH/s+   	B 
E6EE6AE
EEN)r  r   r   r   r
  rP  )rC   rD   rE   rP   re  r   r  r  r  r   r  rL   rB   r@   rO  rO  )  s        	1 	1 	1 	13 3 3j  .  : 
  
  
D$& $& $&L~
 ~
 ~
@A A A A ArB   rO  c                  j    e Zd ZdZ e            efdd
Zedd            ZdddZ		 dddZ
	 dddZdS ) Fido2Clienta>  WebAuthn-like client implementation.

    The client allows registration and authentication of WebAuthn credentials against
    an Authenticator using CTAP (1 or 2).

    :param device: CtapDevice to use.
    :param str origin: The origin to use.
    :param verify: Function to verify an RP ID for a given origin.
    r  r   client_data_collectorr   r   r   r
  rP  c                    || _         d | _        	 t          |||          | _        d S # t          t
          f$ r t          ||          | _        Y d S w xY wr=   )_client_data_collector_enterprise_rpid_listrO  _backendr   r   r  )r>   r  r  r   r
  s        r@   rP   zFido2Client.__init__5  sx     '<# <@"	J,?(*- -DMMM I& 	J 	J 	J/8HIIDMMMM	Js   ( &AAr   r   c                    | j         j        S r=   )r  r   r   s    r@   r   zFido2Client.infoH  s    }!!rB   Nr   r   r   c                ~    	 | j                             |           d S # t          $ r}t          |          d }~ww xY wr=   )r  r   r   rq   rk  s      r@   r   zFido2Client.selectionL  sP    	&M##E***** 	& 	& 	&"1%%%	&s    
<7<r   r,   r0   c                2   t          j        |          }|pt                      }|j        r9t	          |j        dz  |j                  }d|_        |                                 nd}| j        	                    |          \  }}t                              d|            	 | j                            |||| j        |          |r|                                 S S # t           $ r}t#          |          d}~ww xY w# |r|                                 w w xY w)r     TNz%Register a new credential for RP ID: )r,   	from_dictr   timeoutr   setdaemonstartr  r   r   debugr  r   r  cancelr   rq   r>   r   r   timerr   r   rn   s          r@   r   zFido2Client.make_credentialR  s2    5>wGG ? 	'/D0%)<<EELKKMMMME "8LLWUUUDUDDEEE	=33*     	& 	& 	&"1%%%	&  s$   ""C 
C:&C55C::C= =Dr.   r   c                &   t          j        |          }|pt                      }|j        r9t	          |j        dz  |j                  }d|_        |                                 nd}| j        	                    |          \  }}t                              d|            	 | j                            ||||          |r|                                 S S # t          $ r}t!          |          d}~ww xY w# |r|                                 w w xY w)r   r  TNzAssert a credential for RP ID: )r.   r  r   r  r   r  r  r  r  r   r   r  r  r  r  r   rq   r  s          r@   r   zFido2Client.get_assertionx  s,    4=gFF ? 	'/D0%)<<EELKKMMMME "8LLWUUU>u>>???	=11	     	& 	& 	&"1%%%	&  s$   "C 
C4 C//C44C7 7D)r  r   r  r   r   r   r
  rP  )r   r   r=   r  r   r   )rC   rD   rE   rF   r   r   rP   propertyr   r   r   r   rL   rB   r@   r  r  *  s          -<O,=,=/BJ J J J J& " " " X"& & & & & #$ $ $ $ $R ## # # # # # #rB   r  )rE  r   r   rF  )rE  r   r   r   )W
__future__r   r   loggingdataclassesr   enumr   r   	threadingr   r   typingr	   r
   r   r   r   urllib.parser   coser   ctapr   r   r  r   r   r   rR  r   r   r   ctap2.extensionsr   r   r   r   	ctap2.pinr   r   hidr   rpidr    utilsr!   webauthnr"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   	getLoggerrC   r   r   r5   rq   rs   r   r   ABCr   r   r   r   r   r   r  r8  rI  rO  r  rL   rB   r@   <module>r     s  8 # " " " " " 



                        " " " " " " " " = = = = = = = = = = = = = = ! ! ! ! ! !       ( ( ( ( ( ( ( ( * * * * * * * * * * 2 2 2 2 2 2 2 2 2 2            / . . . . . . .                                                         * 
	8	$	$    )   6 !, $ $ $ $N& & & & &{ & & &$ $ $$)
 )
 )
 )
 )
 )
 )
 )
X$ $ $ $ $SW $ $ $<       6    #'   &B
 B
 B
 B
 B
!4 B
 B
 B
J  $ $ $ $ $SW $ $ $:t2 t2 t2 t2 t2. t2 t2 t2n! ! ! ! !%7 ! ! !2 
 - - - 
 - 
 ) ) ) 
 )) ) )~ ~ ~ ~ ~. ~ ~ ~Bq q q q q. q q q q qrB   