+
     hB(  c                  s   R t ^ RIHt ^ RIt^ RIHt ^ RIHtHt ^ RI	H
t
Ht ^ RIHt ^ RIHtHtHtHtHtHtHtHtHt ]'       d'   ^ RIt]P2                  R 8  d   ^ RIHt M
]! R	R
R7      t^ RIHt ^ RIHtHt . R!Ot ^t!R R lt"R R lt#R R lt$R"R R llt%R R lt&R R lt' ! R R]4      t(]! R]R7      t) ! R R
]])]3,          4      t* ! R R]*]+,          4      t,R# )#zlVarious utility functions.

This module contains various functions used throughout the rest of the project.
)annotationsN)abstractmethod)urlsafe_b64decodeurlsafe_b64encode)Fieldfields)BytesIO)	TYPE_CHECKINGAnyClassVarHashableMappingSequenceTypeVarget_type_hintsoverload)Selfr   _DataClassMapping)Zbound)default_backend)hasheshmacc               s     V ^8  d   QhRRRR/# )   databytesreturn Zformat   "0/usr/lib/python3.14/site-packages/fido2/utils.py__annotate__r   M   s       5     c                s    \         P                  ! \         P                  ! 4       \        4       4      pVP	                  V 4       VP                  4       # )zhProduces a SHA256 hash of the input.

:param data: The input data to hash.
:return: The resulting hash.
)r   ZHashSHA256r   updatefinalize)r   h   & r   sha256r$   M   s4     	FMMO_%67AHHTN::<r   c               s$    V ^8  d   QhRRRRRR/# )r   keyr   r   r   r   r   r   r   r   r   X   s!     	 	U 	% 	E 	r   c                s    \         P                  ! V \        P                  ! 4       \	        4       4      pVP                  V4       VP                  4       # )zPerforms an HMAC-SHA256 operation on the given data, using the given key.

:param key: The key to use.
:param data: The input data to hash.
:return: The resulting hash.
)r   ZHMACr   r   r   r    r!   )r%   r   r"      && r   hmac_sha256r'   X   s6     			#v}}(9:AHHTN::<r   c                    V ^8  d   QhRRRR/# )r   valuer   r   intr   r   r   r   r   r   d   s     ( (U (s (r   c                s.    \         P                  V R4      # )zParses an arbitrarily sized integer from a byte string.

:param value: A byte string encoding a big endian unsigned integer.
:return: The parsed int.
Zbig)r*   Z
from_bytes)r)      &r   	bytes2intr,   d   s     >>%''r   c               s$    V ^8  d   QhRRRRRR/# )r   r)   r*   minlenr   r   r   r   r   r   r   r   m   s!      S # u r   c                s    . pV ^8  d$   VP                  ^V ,          4       V ^,          p K*  VP                  V 4       VP                  ^ .V\        V4      ,
          ,          4       \        \	        V4      4      # )zEncodes an int as a byte string.

:param value: The integer value to encode.
:param minlen: An optional minimum length for the resulting byte string.
:return: The value encoded as a big endian byte string.
)ZappendZextendlenr   Zreversed)r)   r-   Zbar&   r   	int2bytesr/   m   s`     
B
$,
		$,!IIeIIqcVc"g%&'"r   c               r(   )r   r   zstr | bytesr   r   r   r   r   r   r   r   }   s     % % % %r   c                s    \        V \        4      '       d   V P                  R4      pM\        V 4      pVR\	        V4      ) ^,          ,          ,          p\        V4      # )zDecodes a websafe-base64 encoded string.
See: "Base 64 Encoding with URL and Filename Safe Alphabet" from Section 5
in RFC4648 without padding.

:param data: The input to decode.
:return: The decoded bytes.
ascii   =)
isinstancestrZencoder   r.   r   )r   Zdata_br#   r   websafe_decoder4   }   sM     $W%t
ds6{lQ&''FV$$r   c               r(   )r   r   r   r   r3   r   r   r   r   r   r      s     F F F3 Fr   c                sV    \        V 4      P                  RR4      P                  R4      # )ztEncodes a byte string into websafe-base64 encoding.

:param data: The input to encode.
:return: The encoded string.
r1   r   r0   )r   ZreplaceZdecode)r   r+   r   websafe_encoder5      s'     T"**45<<WEEr   c                  sB   a  ] tR t^tRtR R ltRR V 3R llltRtV ;t# )
ByteBufferz6BytesIO-like object with the ability to unpack values.c               s    V ^8  d   QhRR/# )r   fmtr3   r   r   r   r   r   ByteBuffer.__annotate__   s     . .# .r   c                s    \         P                  ! V4      pVP                  V P                  VP                  4      4      ^ ,          # )zReads and unpacks a value from the buffer.

:param fmt: A struct format string yielding a single value.
:return: The unpacked value.
)structZStructunpackreadsize)selfr7   Zsr&   r   r:   ZByteBuffer.unpack   s3     MM#xx		!&&)*1--r   c               r(   )r   r<   z
int | Noner   r   r   r   r   r   r   r8      s     	 	 	U 	r   c                s   < \         SV `  V4      pVe5   V^ 8  d.   \        V4      V8w  d   \        RV\        V4      3,          4      hV# )zuLike BytesIO.read(), but checks the number of bytes read and raises an error
if fewer bytes were read than expected.
z,Not enough data to read (need: %d, had: %d).)superr;   r.   
ValueError)r=   r<   r   	__class__   && r   r;   ZByteBuffer.read   sO     w|D!qSY$->>$D	ARR  r   r   i)	__name__
__module____qualname____firstlineno____doc__r:   r;   __static_attributes____classcell__r@      @r   r6   r6      s    @.	 	 	r   r6   _Tc                  s    ] tR t^t$ RtR]R&   R t]]R R l4       4       t	R t
R tR	 t]R
 4       t]]R R l4       4       t]]R R l4       4       t]]R R l4       4       t]R 4       tRtR# )r   z7A data class with members also accessible as a Mapping.zClassVar[dict[str, Field[Any]]]Z__dataclass_fields__c                	s   \        \        V 4      4      pV  \        P                  V R / 4       \	        V 4       F~  pW P
                  V P                  V4      &   \        WP                  4      pVf   K;   V P                  WP                  ,          V4      p\        P                  WP                  V4       K  	  R#   \        \        \        3 d1    \        RTP                   RT P                  P                   24      hi ; i)_field_keysNzError parsing field  for )r   typeobjectZ__setattr__r   rM   _get_field_keygetattrname_parse_value	TypeErrorKeyErrorr?   r@   rC   )r=   hintsfr)   s   &   r   __post_init__Z_DataClassMapping.__post_init__   s    tDz*43A78T0034D&&)E  --eFFmUCE&&tVVU;  "8Z8 $.qvvheDNN<S<S;TU s   5AB==ADc               r(   )r   fieldr   r   rL   r   r   r   r   r   _DataClassMapping.__annotate__   s     $ $5 $R $r   c                	s    \        4       hN)ZNotImplementedError)clsrZ      &&r   rQ   Z _DataClassMapping._get_field_key   s     "##r   c                	sL   a  V 3R  lS P                   P                  4        4       # )c              3  s`   <"   T F#  w  r\        SVP                  4      f   K  Vx  K%  	  R # 5ir\   )rR   rS   ).0krX   r=   s   &  r   	<genexpr>Z-_DataClassMapping.__iter__.<locals>.<genexpr>   s&      
2$!gdAFF6KAA2s   .
.)rM   itemsr=   s   fr   __iter__Z_DataClassMapping.__iter__   s$    
**002
 	
r   c                	s<    \        \        \        V 4      4      4      # r\   )r.   ZlistZiterrc   r+   r   __len__Z_DataClassMapping.__len__   s    4T
#$$r   c                	sH   V P                   V,          p\        WP                  4      pVf   \        V4      hVP                  P                  R4      pV'       d	   V! V4      # \        V\        4      '       d"   \        V\        4      '       g   \        V4      # \        V\        4      '       dn   \        ;QJ d    R V 4       F  '       d   K   RM	  RM! R V 4       4      '       d4   V Uu. uF&  p\        V\        4      '       d   TM
\        V4      NK(  	  up# V# u upi )N	serializec              3  sB   "   T F  p\        V\        4      x  K  	  R # 5ir\   )r2   r   )r_   vr#   r   ra   Z0_DataClassMapping.__getitem__.<locals>.<genexpr>   s     .Uu!z!W/E/Eus   FT)rM   rR   rS   rV   metadatagetr2   r   Zdictr   Zall)r=   r%   rX   r)   rf   rg   s   &&    r   __getitem__Z_DataClassMapping.__getitem__   s    S!ff%=3-JJNN;/	U##eW%%j.E.E;eX&&33.Uu.U333.Uu.U+U+UCHI5aAt,,A$q'95II Js   .,Dc           	     	s,   VR ,          V8X  d   VP                   ^ ,          p V\        J g   \        W!4      '       d   V#  \	        \        VR\        4      \        4      '       d4   \        VR4      ^ ,          pV Uu. uF  q0P                  W4      NK  	  up# \	        \        VR\        4      \        4      '       dh   \        V\        4      '       dR   \        VR4      w  rEVP                  4        UUu/ uF&  w  rcV P                  WF4      V P                  WS4      bK(  	  upp# \        VRR 4      pV'       d	   V! V4      # \        VRR 4      pV'       d	   V! V4      # \        R\        V4       RV 24      h  \         d     ELFi ; iu upi u uppi )NZ
__origin____args__	from_dictZ__call__zUnparseable value of type rN   )rk   r   r2   rU   
issubclassrR   rP   r   rT   r   rb   r?   rO   )	r]   tr)   rg   Zt_kZt_vr`   rl   Zwraps	   &&&      r   rT   Z_DataClassMapping._parse_value   sv   H?

1A	Cx:e// 0 gav6AA:&q)A49:Eq$$Q*E:: <8'BBz7H
 H
 q*-HC "KKM)DA   (#*:*:3*BB)  A{D1	U## q*d+;5d5k]%sKLL9  		 ;s   E9 =F5,F9FFc               $    V ^8  d   QhRRRRRR/# )r   r]   
type[Self]r   ZNoner   r   r   r   r   r   r[         ;;z;;$;r   c                	    R # r\   r   r]   r   r^   r   rl   _DataClassMapping.from_dict
      8;r   c               ro   )r   r]   rp   r   r   r   r   r   r   r   r   r[     rq   r   c                	rr   r\   r   rs   r^   r   rl   rt     ru   r   c               s$    V ^8  d   QhRRRRRR/# )r   r]   rp   r   zMapping[_T, Any]r   r   r   r   r   r   r   r[     s    GGzG)9GdGr   c                	rr   r\   r   rs   r^   r   rl   rt     s    DGr   c                	s   Vf   R # \        W4      '       d   V# \        V\        4      '       g$   \        V P                   R\	        V4       24      h/ p\        V 4      p\        V 4       F  pV P                  V4      pVP                  V4      pVf   K+  VP                  P                  R4      pV'       d
   V! V4      pM#W4P                  ,          pV P                  W4      pWbVP                  &   K  	  V ! R/ VB # )Nz/.from_dict called with non-Mapping data of typedeserializer   )r2   r   rU   rC   rO   r   r   rQ   ri   rh   rS   rT   )	r]   r   ZkwargsrW   rX   r%   r)   rv   rn   s	   &&       r   rl   rt     s    <d  K$((<<. O:,  
 s#A$$Q'CHHSME}**..7K#E*&&M((2"166N  }V}r   r   N)rC   rD   rE   rF   rG   Z__annotations__rY   classmethodr   rQ   rd   re   rj   rT   r   rl   rH   r   r   r   r   r      s    A99" $  $

% $M $ML ;  ;;  ;G  G r   c                  sX   a  ] tR tRtRt]R R l4       tV 3R lt]V 3R l4       tRt	V ;t
# )_JsonDataObjecti4  zIA data class with members also accessible as a JSON-serializable Mapping.c               r(   )r   rZ   r   r   r3   r   r   r   r   r   Z_JsonDataObject.__annotate__8  s     @ @5 @S @r   c                	s    VP                   P                  R 4      pV'       d   V# VP                  P                  R4      pV^ ,          RP	                  R VR,           4       4      ,           # )rS   Z_Z c              3  s@   "   T F  qP                  4       x  K  	  R # 5ir\   )Ztitle)r_   Zpr#   r   ra   Z1_JsonDataObject._get_field_key.<locals>.<genexpr>=  s     !?Y''))Ys   :i   NN)rh   ri   rS   ZsplitZjoin)r]   rZ   rS   Zpartss   &&  r   rQ   Z_JsonDataObject._get_field_key7  sT    ~~!!&)K

  %Qx"''!?U2Y!????r   c                	sh   < \         SV `  V4      p\        V\        4      '       d   \	        V4      # V# r\   )r>   rj   r2   r   r5   )r=   r%   r)   r@   rA   r   rj   Z_JsonDataObject.__getitem__?  s/    #C(eU##!%((r   c                	s  < VR ,          V8X  d   VP                   ^ ,          pMTp\        V\        4      '       d8   \        V\        4      '       d"   \        V\
        4      '       d   \        V4      # \        SV `!  W4      # r\   )	rk   r2   rO   rm   r   r3   r4   r>   rT   )r]   rn   r)   Zt2r@   s   &&& r   rT   Z_JsonDataObject._parse_valueE  sa    H?ABBb$Jr5$9$9jPS>T>T!%((w#A--r   r   )rC   rD   rE   rF   rG   rw   rQ   rj   rT   rH   rI   rJ   rK   r   rx   rx   4  s3    S@ @ 	. 	.r   rx   )i   i   )r5   r4   r$   r'   r,   r/   rB   )-rG   Z
__future__r    r9   Zabcr   Zbase64r   r   Zdataclassesr   r   Zior   Ztypingr   r   r	   r
   r   r   r   r   r   ZsysZversion_infor   Zcryptography.hazmat.backendsr   Zcryptography.hazmat.primitivesr   r   Z__all__ZLOG_LEVEL_TRAFFICr$   r'   r,   r/   r4   r5   r6   rL   r   r3   rx   r   r   r   <module>ry      s   8
 #   7 % 
 
 
 
7" v%89 8 7  	( %"F 0 T"C( D.', .r   