o
    l>jԝ                     @  s`  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BeCZDG dd deEZFeFfddZGG dd deFZHdd ZIG dd dZJG dd dejKZLG dd  d ZMG d!d" d"ejKZNG d#d$ d$eNZOd%d& ZPG d'd( d(ejKZQG d)d* d*eQZRG d+d, d,eJZSed:d1d2ZTed;d4d2ZTd5d2 ZTG d6d7 d7eQZUG d8d9 d9eLZVdS )<    )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                   @  s6   e Zd ZdZeG dd deZd	ddZdd ZdS )
ClientErrorzBase error raised by clients.c                   @  s.   e Zd ZdZdZdZdZdZdZd
dd	Z	dS )zClientError.ERRzError codes for ClientError.   r            Nc                 C  s
   t | |S N)r3   )selfcause r;   J/home/thesage/.local/lib/python3.10/site-packages/fido2/client/__init__.py__call__Y   s   
zClientError.ERR.__call__r8   )
__name__
__module____qualname____doc__OTHER_ERRORBAD_REQUESTCONFIGURATION_UNSUPPORTEDDEVICE_INELIGIBLETIMEOUTr=   r;   r;   r;   r<   ERRO   s    rG   Nc                 C  s   t || _|| _d S r8   )r3   rG   coder:   r9   rH   r:   r;   r;   r<   __init__\   s   
zClientError.__init__c                 C  s(   d | j}| jr|d| j d7 }|S )NzClient error: {0} - {0.name}z	 (cause: ))formatrH   r:   )r9   rr;   r;   r<   __repr__`   s   zClientError.__repr__r8   )	r>   r?   r@   rA   r   r   rG   rJ   rN   r;   r;   r;   r<   r3   L   s    
r3   c                 C  s   | j tjjtjjfv rtjj}na| j tjjtjjtjj	fv r#tjj
}nN| j tjjtjjtjjfv r6t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 rmtjj}ntjj}||| S r8   ) rH   r   rG   CREDENTIAL_EXCLUDEDNO_CREDENTIALSr3   rE   KEEPALIVE_CANCELACTION_TIMEOUTUSER_ACTION_TIMEOUTrF   UNSUPPORTED_ALGORITHMUNSUPPORTED_OPTIONKEY_STORE_FULLrD   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_DENIEDrC   rB   )eerr_clscer;   r;   r<   _ctap2client_errg   sD   




ri   c                      s*   e Zd ZdZejjdf fdd	Z  ZS )PinRequiredErrorz=Raised when a call cannot be completed without providing PIN.zPIN required but not providedc                   s   t  || d S r8   )superrJ   rI   	__class__r;   r<   rJ      s   zPinRequiredError.__init__)	r>   r?   r@   rA   r3   rG   rC   rJ   __classcell__r;   r;   rl   r<   rj      s    rj   c              
   O  s   |pt  }| sRz||i |W S  ty> } z!|jtjkr.|r(|tj d }||  nt	j
|W Y d }~nd }~w tyM } zt|d }~ww | r	t	j
 r8   )r   is_setr   rH   r   USE_NOT_SATISFIEDr   UPNEEDEDwaitr3   rG   rB   r   ri   rF   )
poll_delayeventon_keepalivefuncargskwargsrf   r;   r;   r<   _call_polling   s&   


ry   c                   @  s<   e Zd ZdZi fddd	ZdddZdddZd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                 C  s   || _ || _|| _d S r8   )_client_data_assertions_extension_results)r9   r{   r|   r~   r;   r;   r<   rJ      s   
zAssertionSelection.__init__returnc                 C     | j S )zIGet the raw AssertionResponses available to inspect before selecting one.)r   r9   r;   r;   r<   get_assertions      z!AssertionSelection.get_assertions	assertionr   c                 C  r   r8   )r   )r9   r   r;   r;   r<   _get_extension_results   s   z)AssertionSelection._get_extension_resultsindexintr%   c                 C  sR   | j | }t|jd t| j|j|j|jr|jd nddtj	t
| |tjd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)r9   r   r   r;   r;   r<   get_response   s   
zAssertionSelection.get_responseN)r{   r*   r|   r}   r~   r   )r   r}   )r   r   r   r   )r   r   r   r%   )r>   r?   r@   rA   rJ   r   r   r   r;   r;   r;   r<   rz      s    



rz   c                   @  s8   e Zd ZdZej	ddd	d
Zej	ddddZdS )WebAuthnClientzMBase class for a WebAuthn client, supporting registration and authentication.Noptionsr+   rt   Event | Noner   r/   c                 C     t  )Creates a credential.

        :param options: PublicKeyCredentialCreationOptions data.
        :param threading.Event event: (optional) Signal to abort the operation.
        NotImplementedErrorr9   r   rt   r;   r;   r<   make_credential      zWebAuthnClient.make_credentialr-   rz   c                 C  r   )Get an assertion.

        :param options: PublicKeyCredentialRequestOptions data.
        :param threading.Event event: (optional) Signal to abort the operation.
        r   r   r;   r;   r<   get_assertion   r   zWebAuthnClient.get_assertionr8   r   r+   rt   r   r   r/   r   r-   rt   r   r   rz   )r>   r?   r@   rA   abcabstractmethodr   r   r;   r;   r;   r<   r      s    r   c                   @  s.   e Zd ZdZdddZdd
dZd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                 C     t d dS )z@Called when the authenticator is awaiting a user presence check.zUser Presence check required.Nloggerinfor   r;   r;   r<   	prompt_up   s   zUserInteraction.prompt_uppermissionsClientPin.PERMISSIONrp_id
str | Nonec                 C  r   )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   r9   r   r   r;   r;   r<   request_pin   s   
zUserInteraction.request_pinboolc                 C  r   )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   r;   r;   r<   
request_uv  s   
zUserInteraction.request_uvN)r   r   )r   r   r   r   r   r   )r   r   r   r   r   r   )r>   r?   r@   rA   r   r   r   r;   r;   r;   r<   r      s
    

	r   c                   @  s    e Zd ZdZejd	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                 C  s   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.
        Nr;   r9   r   r;   r;   r<   collect_client_data  s    z'ClientDataCollector.collect_client_dataN)r   r   r   r   )r>   r?   r@   rA   r   r   r   r;   r;   r;   r<   r     s    r   c                   @  sD   e Zd ZdZefdddZdddZdddZdddZd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                 C  s   || _ || _d S r8   )_origin_verify)r9   r   r   r;   r;   r<   rJ   (  s   
z#DefaultClientDataCollector.__init__r   r   r   c                 C  sd   t |tr
|jj}nt |tr|j}ntd|du r0t|}|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netlocr3   rG   rC   )r9   r   r   r   urlr;   r;   r<   	get_rp_id,  s   


z$DefaultClientDataCollector.get_rp_idr   r   c                 C  s4   z|  ||r
W dS W n	 ty   Y nw tj )z&Verify the RP ID for the given origin.N)r   	Exceptionr3   rG   rC   )r9   r   r   r;   r;   r<   r   C  s   
z'DefaultClientDataCollector.verify_rp_idc                 C  s,   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   r;   r;   r<   get_request_typeL  s
   

z+DefaultClientDataCollector.get_request_typec                 C  s:   |  || j}| || j tj| || j|jd|fS )N)r   r   	challenge)r   r   r   r*   creater   r   )r9   r   r   r;   r;   r<   r   U  s   z.DefaultClientDataCollector.collect_client_dataN)r   r   r   r   )r   r   r   r   r   r   )r   r   r   r   r   r   )r   r   )	r>   r?   r@   rA   r   rJ   r   r   r   r;   r;   r;   r<   r   !  s    


		r   c                   s    fdd}|S )Nc                   s   | t jkr   d S d S r8   )r   rq   r   )statususer_interactionr;   r<   ru   g  s   
z%_user_keepalive.<locals>.on_keepaliver;   )r   ru   r;   r   r<   _user_keepalivef  s   r   c                   @  sF   e Zd ZU ded< ejdddZejdddZejdddZdS )_ClientBackendr   r   rt   r   r   r   c                 C  r   r8   r   r9   rt   r;   r;   r<   	selectionq  r   z_ClientBackend.selectionr   r+   r{   r*   r   r   enterprise_rpid_listSequence[str] | Noner   r/   c                 C  r   r8   r   )r9   r   r{   r   r   rt   r;   r;   r<   do_make_credentialu  s   	z!_ClientBackend.do_make_credentialr-   rz   c                 C  r   r8   r   )r9   r   r{   r   rt   r;   r;   r<   do_get_assertion  s   z_ClientBackend.do_get_assertionNrt   r   r   r   )r   r+   r{   r*   r   r   r   r   rt   r   r   r/   )
r   r-   r{   r*   r   r   rt   r   r   rz   )	r>   r?   r@   __annotations__r   r   r   r   r   r;   r;   r;   r<   r   n  s   
 
r   c                   @  s.   e Zd ZdddZdd Zd	d
 Zdd ZdS )_Ctap1ClientBackenddevicer   r   r   c                 C  s2   t || _tdgg tjd| _d| _t|| _d S )NU2F_V2)versions
extensionsaaguidg      ?)	r   ctap1r   r!   NONEr   _poll_delayr   _on_keepalive)r9   r   r   r;   r;   r<   rJ     s   
z_Ctap1ClientBackend.__init__c                 C  s   t | j|d | jjdd d S )N                                    )ry   r   r   registerr   r;   r;   r<   r     s   z_Ctap1ClientBackend.selectionc                 C  sN  |j }|j}|jpt }|j}	|j}
|	s)|
tjks)tj	dd |D vs)|j
tjkr/ttjjt| }d}|p:g D ]=}|j}z| j|||d tj  tyx } z|jtjkrnt| j|| j| jj|| tj W Y d }~q;d }~ww t !|t| j|| j| jj|j"|}|j#j$}|d usJ t%|j&t'||dt(j)t*i t+j,dS )Nc                 S  s   g | ]}|j qS r;   )alg).0pr;   r;   r<   
<listcomp>  s    z:_Ctap1ClientBackend.do_make_credential.<locals>.<listcomp>r   Tr{   attestation_objectr   )-pub_key_cred_paramsexclude_credentialsauthenticator_selectionr)   require_resident_keyuser_verificationr1   REQUIREDr   	ALGORITHMattestationr"   
ENTERPRISEr   rG   rU   r    encoder   r   authenticater3   rB   r   rH   r   rp   ry   r   r   r   rE   r#   
from_ctap1hashr   credential_datar/   credential_idr(   r'   r   r$   r.   r   )r9   r   r{   r   r   rt   
key_paramsexclude_listr   rkr   	app_paramdummy_paramcred
key_handlerf   att_objr   r;   r;   r<   r     sl   


z&_Ctap1ClientBackend.do_make_credentialc                 C  s   |j }|j}|tjks|sttjjt| }|j	}|D ]=}	z!t
| j|| j| jj|||	j}
t|t|	|
g}t||W   S  ty[ } z|jtjjkrQ W Y d }~qd }~ww tj r8   )allow_credentialsr   r1   r   r   rG   rU   r    r   r  ry   r   r   r   r   r   r   r  r2   rz   r3   rH   rF   rE   )r9   r   r{   r   rt   
allow_listr   r  client_paramr
  	auth_respr|   rf   r;   r;   r<   r     s6   

z$_Ctap1ClientBackend.do_get_assertionN)r   r   r   r   )r>   r?   r@   rJ   r   r   r   r;   r;   r;   r<   r     s
    

Br   c                      s&   e Zd Zd fd	d
Zdd Z  ZS )_Ctap2ClientAssertionSelectionr{   r*   r|   r}   r   *Sequence[AuthenticationExtensionProcessor]	pin_tokenbytes | Nonec                   s   t  || || _|| _d S r8   )rk   rJ   _extensions
_pin_token)r9   r{   r|   r   r  rl   r;   r<   rJ     s   
z'_Ctap2ClientAssertionSelection.__init__c              
   C  sX   i }z| j D ]}||| j}|r|| qW |S  ty+ } ztj|d }~ww r8   )r  prepare_outputsr  updater   r3   rG   rD   )r9   r   extension_outputsextoutputrf   r;   r;   r<   r     s   

z5_Ctap2ClientAssertionSelection._get_extension_results)r{   r*   r|   r}   r   r  r  r  )r>   r?   r@   rJ   r   rn   r;   r;   rl   r<   r    s    r  valuesr   r   listc                 C     d S r8   r;   r  r;   r;   r<   
_cbor_list     r   r   c                 C  r  r8   r;   r  r;   r;   r<   r     r!  c                 C  s   | sd S dd | D S )Nc                 S  s   g | ]}t |qS r;   )r2   )r   vr;   r;   r<   r   &  s    z_cbor_list.<locals>.<listcomp>r;   r  r;   r;   r<   r   #  s   c                   @  sN   e Zd ZdddZd	d
 Zdd Zdd Zdd Zdd Zdd Z	dd Z
dS )_Ctap2ClientBackendr   r   r   r   r   Sequence[Ctap2Extension]c                 C  s$   t || _| jj| _|| _|| _d S r8   )r   ctap2r   r  r   )r9   r   r   r   r;   r;   r<   rJ   *  s   


z_Ctap2ClientBackend.__init__c                   s$  | j  }|j  r fdd|D }d}|r!|||}	|j}
nd }	d }
|jp)d}|r|d | }z)| j j||t|d ddi|	|
||d	}t|dkrQ|d W S t	d	i |d j
W S  ty } z&|j tjjkru|dkru |d8 }ntjjkr||d  }n	  W Y d }~nd }~ww |s,d S )
Nc                   s   g | ]}t |j kr|qS r;   )lenr   )r   cmax_lenr;   r<   r   >  s    z5_Ctap2ClientBackend._filter_creds.<locals>.<listcomp>r   r4   upFrt   ru   r   r;   )r%  get_infomax_cred_id_lengthr   VERSIONmax_creds_in_listr   r   r&  r,   r   r   rH   rG   rd   rP   )r9   r   	cred_listpin_protocolr  rt   ru   r   client_data_hashpin_authversion	max_credschunkr|   rf   r;   r(  r<   _filter_creds5  sP   




z!_Ctap2ClientBackend._filter_credsc              
   C  s   d| j jjv r| j j|d d S z| j jddddddddd	d
gd|d W d S  tyK } z|jtjjtjj	tjj
fv rFW Y d }~d S  d }~ww )NFIDO_2_1)rt   r   zexample.com)r   names   dummydummyz
public-keyi)r   r       )pin_uv_paramrt   )r%  r   r   r   r   r   rH   rG   r_   r]   rb   r9   rt   rf   r;   r;   r<   r   j  s*   
z_Ctap2ClientBackend.selectionc                   s   t  fdddD }t  fdddD }tjj|@ dk}|tjjtjjB  @ }|tjks=|tjd fv r7|s= j	drG|sEt
jddS |rS|rS j	d	sSdS |rY|rYdS d
S )Nc                 3  s    | ]}| j v V  qd S r8   )r   r   kr   r;   r<   	<genexpr>  s    z5_Ctap2ClientBackend._should_use_uv.<locals>.<genexpr>)uv	clientPin	bioEnrollc                 3  s    | ]	} j |V  qd S r8   )r   getr>  r@  r;   r<   rA    s    
r   alwaysUvz*User verification not configured/supportedTmakeCredUvNotRqdF)anyr   
PERMISSIONMAKE_CREDENTIALGET_ASSERTIONr1   r   	PREFERREDr   rE  r3   rG   rD   )r9   r   r   r   uv_supporteduv_configuredmcadditional_permsr;   r@  r<   _should_use_uv  s0   

z"_Ctap2ClientBackend._should_use_uvc	           
      C  s   |r(|j dr(t|r| j||r|||||S n|r(| j||r(d S |j drA| j||}	|	r>||	||S t	 t
jd)NrB  rC  z User verification not configured)r   rE  r   is_token_supportedr   r   get_uv_tokenr   get_pin_tokenrj   r3   rG   rD   )
r9   r   
client_pinr   r   rt   ru   allow_internal_uvallow_uvpinr;   r;   r<   
_get_token  s$   
z_Ctap2ClientBackend._get_tokenc              
   C  sn   | j  }d }	d}
| |||r3t| j |}|tjjtjjB  @ dk}| ||||||||}	|	s3d}
|	|
fS )NFr   T)r%  r,  rQ  r   rI  rJ  rK  rY  )r9   r1  r   r   r   rW  rt   ru   r   r  internal_uvrU  rV  r;   r;   r<   _get_auth_params  s6   


z$_Ctap2ClientBackend._get_auth_paramsc                   s.  j jjjpt jtjj	 d j
tjkr7jdr7|d ur5
|v r4dndtjD ]}|jjv rG| 	 nq:d 	g d  	
fdd}jj}d}		 z| \}
}W nS ty } zG|jtjjkrtjkrtjW Y d }~qi|jtjjkr rd W Y d }~qit|dd }|jtjjkr|r|	s|  |  d}	W Y d }~qi d }~ww i }zD ]}||
|}|d ur| | qW n t!y } zt"j#|d }~ww t$%|
j&|
j'|
j(}|j'j)}|d usJ t*|j+t,|d	t-j.t/|t0j1d
S )Nepr   r4   Tc               
     s  t jj} r| t jjO }   jD ]}|j	}|r)| | |j	O } q
	
|  \}}rD
	|}nd }i }zD ]}||}|rY|| qKW n tym } ztj|d }~ww jd}jtjkpjtjko|}	|	s|sd }
ni }
|	r|stjdd|
d< |rd|
d< j}	r|r	||	jf}nd}jj|ttj
dtt|rt|gnd |pd |
g|R d|fS )Nr  zResident key not supportedTrB  NN)r   r+  )r   rI  rJ  rK  clearr  r   r%  appendr   r[  r7  prepare_inputsr  r   r3   rG   rD   r   rE  resident_keyr0   r   rL  r  r   r.  r2   r   r   r   )r   rf   r  r  rZ  exclude_credextension_inputs
auth_inputcan_rkr  optsr2  r3  rW  r{   enterprise_attestationrt   r  r   r  ru   r   r1  r   r   r9   used_extensionsr   r   r;   r<   _do_make  s   






	
z8_Ctap2ClientBackend.do_make_credential.<locals>._do_makeFconnectr   r   )2r   r   r   r   r)   r   r   r   r%  r,  r   r"   r   r   rE  r   	PROTOCOLSr.  pin_uv_protocolsr   r   rH   rG   r\   r1   DISCOURAGEDr   
UV_BLOCKEDgetattrrc   closer  r  r   r3   rD   r#   r   fmtr   att_stmtr  r/   r  r(   r'   r   r$   r.   r   )r9   r   r{   r   r   rt   protorj  devreconnectedatt_respr  rf   rk  r  r  r  r  r   r;   rg  r<   r     s   


*\


z&_Ctap2ClientBackend.do_make_credentialc              
     s$  j j j	tjtjD ]}|jjj	v r|  nqd d 	f
dd}j
j}d}	 z| W S  ty }	 zG|	jtjjkr[	tjkr[tj	W Y d }	~	q9|	jtjjkrlrldW Y d }	~	q9t|dd }
|	jtjjkr|
r|s|  |
  d}W Y d }	~	q9 d }	~	ww )NTc               
     s^  t jj} g }jD ]}|j}|r|| | |jO } q		| \}} r:	 |}nd }i }z|D ]}|
||}|rP|| qAW n tyd } ztj|d }~ww |rkddind }	j}
r~|r~||
jf}nd} r|st d jdd}jj|
|rt|gnd |pd |	g|R d}t|||S )NrB  Tr]  r       )r   r   r+  )r   rI  rK  r  r   r%  r_  r   r[  r7  r`  r  r   r3   rG   rD   r  r   r.  r,   r   r   r2   r  )r   ri  rf   r  r  rZ  selected_credrc  inputsrf  r2  r3  r|   
r  rW  r{   rt   ru   r   r1  r   r9   r   r;   r<   _do_auth  sx   






z6_Ctap2ClientBackend.do_get_assertion.<locals>._do_authFrk  )r   r  r   r   r   r   rl  r.  r   rm  r%  r   r   rH   rG   r\   r1   rn  r   ro  rp  rc   rq  )r9   r   r{   r   rt   rt  r|  ru  rv  rf   rk  r;   r{  r<   r     sL   

N
z$_Ctap2ClientBackend.do_get_assertionN)r   r   r   r   r   r$  )r>   r?   r@   rJ   r7  r   rQ  rY  r[  r   r   r;   r;   r;   r<   r#  )  s    
5"& Ar#  c                   @  sX   e Zd ZdZe efdd
dZed ddZd!d"ddZ		d!d#ddZ
	d!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   r$  c              	   C  sF   || _ d | _z
t|||| _W d S  ttfy"   t||| _Y d S w r8   )_client_data_collector_enterprise_rpid_listr#  _backendr   r   r   )r9   r   r~  r   r   r;   r;   r<   rJ   5  s   zFido2Client.__init__r   r   c                 C  s   | j jS r8   )r  r   r   r;   r;   r<   r   H  s   zFido2Client.infoNrt   r   r   c              
   C  s4   z	| j | W d S  ty } zt|d }~ww r8   )r  r   r   ri   r=  r;   r;   r<   r   L  s   zFido2Client.selectionr   r+   r/   c              
   C  s   t |}|p	t }|jrt|jd |j}d|_|  nd}| j	|\}}t
d|  z%z| j|||| j|W W |rE|  S S  tyU } zt|d}~ww |r]|  w w )r     TNz%Register a new credential for RP ID: )r+   	from_dictr   timeoutr   setdaemonstartr  r   r   debugr  r   r  cancelr   ri   r9   r   rt   timerr{   r   rf   r;   r;   r<   r   R  s6   





zFido2Client.make_credentialr-   rz   c              
   C  s   t |}|p	t }|jrt|jd |j}d|_|  nd}| j	|\}}t
d|  z#z| j||||W W |rC|  S S  tyS } zt|d}~ww |r[|  w 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   ri   r  r;   r;   r<   r   x  s4   


	

zFido2Client.get_assertion)r   r   r~  r   r   r   r   r$  )r   r   r8   r   r   r   )r>   r?   r@   rA   r   r   rJ   propertyr   r   r   r   r;   r;   r;   r<   r}  *  s    	)r}  )r  r   r   r  )r  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   r%  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.   r/   r0   r1   r2   	getLoggerr>   r   r   r3   ri   rj   ry   rz   ABCr   r   r   r   r   r   r   r  r   r#  r}  r;   r;   r;   r<   <module>   sV   P
'	,Ew    