
    Dj(                       d Z ddlm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 ddlmZmZmZmZmZmZmZmZmZ er#ddlZej        d	k    rdd
lmZ n edd          ZddlmZ ddlmZmZ g dZ dZ!d(dZ"d)dZ#d*dZ$d+d,dZ%d-dZ&d.d!Z' G d" d#e          Z( ed$e          Z) G d% dee)ef                   Z* G d& d'e*e+                   Z,dS )/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)bound)default_backend)hasheshmac)websafe_encodewebsafe_decodesha256hmac_sha256	bytes2int	int2bytes   databytesreturnc                    t          j        t          j                    t                                }|                    |            |                                S )ztProduces a SHA256 hash of the input.

    :param data: The input data to hash.
    :return: The resulting hash.
    )r   HashSHA256r   updatefinalize)r"   hs     F/home/thesage/.hermes/venv/lib/python3.11/site-packages/fido2/utils.pyr   r   M   s>     	FMOO_%6%677AHHTNNN::<<    keyc                    t          j        | t          j                    t	                                }|                    |           |                                S )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   HMACr   r'   r   r(   r)   )r-   r"   r*   s      r+   r   r   X   s@     		#v}(9(9::AHHTNNN::<<r,   valueintc                8    t                               | d          S )zParses an arbitrarily sized integer from a byte string.

    :param value: A byte string encoding a big endian unsigned integer.
    :return: The parsed int.
    big)r1   
from_bytes)r0   s    r+   r   r   d   s     >>%'''r,   minlenc                   g }| dk    r#|                     d| z             | dz  } | dk    #|                     |            |                    dg|t          |          z
  z             t          t	          |                    S )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.
          r   )appendextendlenr#   reversed)r0   r6   bas      r+   r    r    m   s     
B
$,,
		$,! $,, IIeIIqcVc"gg%&'''"r,   str | bytesc                    t          | t                    r|                     d          }nt          |           }|dt	          |           dz  z  z  }t          |          S )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strencoder#   r<   r   )r"   data_bs     r+   r   r   }   s^     $ W%%t
ds6{{lQ&''FV$$$r,   rE   c                n    t          |                               dd                              d          S )zEncodes a byte string into websafe-base64 encoding.

    :param data: The input to encode.
    :return: The encoded string.
    rB   r,   rA   )r   replacedecode)r"   s    r+   r   r      s0     T""**455<<WEEEr,   c                  .     e Zd ZdZddZdd fd
Z xZS )
ByteBufferz6BytesIO-like object with the ability to unpack values.fmtrE   c                    t          j        |          }|                    |                     |j                            d         S )zReads and unpacks a value from the buffer.

        :param fmt: A struct format string yielding a single value.
        :return: The unpacked value.
        r   )structStructunpackreadsize)selfrM   ss      r+   rQ   zByteBuffer.unpack   s8     M#xx		!&))**1--r,   r5   rS   
int | Noner$   r#   c                    t                                          |          }|:|dk    r4t          |          |k    r!t          d|t          |          fz            |S )zLike BytesIO.read(), but checks the number of bytes read and raises an error
        if fewer bytes were read than expected.
        Nr   z,Not enough data to read (need: %d, had: %d).)superrR   r<   
ValueError)rT   rS   r"   	__class__s      r+   rR   zByteBuffer.read   sd     ww||D!!qSYY$->->>$D		ARR   r,   )rM   rE   r5   )rS   rV   r$   r#   )__name__
__module____qualname____doc__rQ   rR   __classcell__rZ   s   @r+   rL   rL      s\        @@. . . .	 	 	 	 	 	 	 	 	 	 	r,   rL   _Tc                     e Zd ZU dZded<   d Zeedd	                        Zd
 Z	d Z
d Zed             Zeedd                        Zeedd                        Zeedd                        Zed             Zedd            ZdS )r   z7A data class with members also accessible as a Mapping.zClassVar[dict[str, Field[Any]]]__dataclass_fields__c                   t          t          |                     }|  t                              | di            t	          |           D ]}|| j        |                     |          <   t          | |j                  }|	 | 	                    ||j                 |          }t                              | |j        |           z# t          t          t          f$ r% t          d|j         d| j        j                   w xY wd S )N_field_keyszError parsing field  for )r   typeobject__setattr__r   rf   _get_field_keygetattrname_parse_value	TypeErrorKeyErrorrY   rZ   r\   )rT   hintsfr0   s       r+   __post_init__z_DataClassMapping.__post_init__   s   tDzz**.4333 
	 
	A78DT00334D!&))E  --eAFmUCCE&&tQVU;;;;!8Z8   $UqvUUDN<SUU  	 !
	 
	s   AC<D fieldr   r$   rb   c                    t                      N)NotImplementedError)clsrt   s     r+   rk   z _DataClassMapping._get_field_key   s     "###r,   c                N      fd j                                         D             S )Nc              3  L   K   | ]\  }}t          |j                  |V  d S rv   )rl   rm   ).0krr   rT   s      r+   	<genexpr>z-_DataClassMapping.__iter__.<locals>.<genexpr>   sA       
 
!QgdAF6K6K6WA6W6W6W6W
 
r,   )rf   itemsrT   s   `r+   __iter__z_DataClassMapping.__iter__   s=    
 
 
 
*0022
 
 
 	
r,   c                T    t          t          t          |                               S rv   )r<   listiterr   s    r+   __len__z_DataClassMapping.__len__   s    4T

##$$$r,   c                   | j         |         }t          | |j                  }|t          |          |j                            d          }|r ||          S t          |t                    r$t          |t                    st          |          S t          |t                    r%t          d |D                       rd |D             S |S )N	serializec              3  @   K   | ]}t          |t                    V  d S rv   )rD   r   r{   vs     r+   r}   z0_DataClassMapping.__getitem__.<locals>.<genexpr>   s,      .U.U!z!W/E/E.U.U.U.U.U.Ur,   c                Z    g | ](}t          |t                    r|nt          |          )S  )rD   dictr   s     r+   
<listcomp>z1_DataClassMapping.__getitem__.<locals>.<listcomp>   s1    IIIaAt,,9AA$q''IIIr,   )rf   rl   rm   rp   metadatagetrD   r   r   r   all)rT   r-   rr   r0   r   s        r+   __getitem__z_DataClassMapping.__getitem__   s    S!af%%=3--JNN;//	 	$9U###eW%% 	j.E.E 	;;eX&& 	J3.U.Uu.U.U.U+U+U 	JII5IIIIr,   c                    d z  k    rj         d         	 t          u st          |          r|S n# t          $ r Y nw xY wt	          t          dt                    t                    r%t          d          d          fd|D             S t	          t          dt                    t                    rJt          |t                    r5t          d          \   fd|	                                D             S t          dd           }|r ||          S t          dd           }|r ||          S t          dt          |           d	           )
Nr   
__origin____args__c                <    g | ]}                     |          S r   rn   )r{   r   rx   ts     r+   r   z2_DataClassMapping._parse_value.<locals>.<listcomp>   s)    :::qC$$Q**:::r,   c                l    i | ]0\  }}                     |                               |          1S r   r   )r{   r|   r   rx   t_kt_vs      r+   
<dictcomp>z2_DataClassMapping._parse_value.<locals>.<dictcomp>   sO       Aq   a((#*:*:3*B*B  r,   	from_dict__call__zUnparseable value of type rg   )r   r   rD   ro   
issubclassrl   ri   r   r   r~   rY   rh   )rx   r   r0   r   wrapr   r   s   ``   @@r+   rn   z_DataClassMapping._parse_value   s   H??
1A	Cxx:eQ//x  	 	 	D	 gav66AA 	:&&q)A:::::E:::: <88'BB 	z7H
 H
 	 q*--HC     !KKMM    A{D11	 	$9U### q*d++ 	4;;Kd5kkKKKKLLLs   8 
AArx   
type[Self]r"   Nonec                    d S rv   r   rx   r"   s     r+   r   z_DataClassMapping.from_dict
      8;r,   r   c                    d S rv   r   r   s     r+   r   z_DataClassMapping.from_dict  r   r,   Mapping[_T, Any]c                    d S rv   r   r   s     r+   r   z_DataClassMapping.from_dict  s    DGCr,   c                    |d S t          ||           r|S t          |t                    s&t          | j         dt	          |                     |                     |          S )Nz/.from_dict called with non-Mapping data of type)rD   r   ro   r\   rh   _parse_from_dictr   s     r+   r   z_DataClassMapping.from_dict  s    <4dC   	K$(( 	<    ::      ##D)))r,   c                \   i }t          |           }t          |           D ]}|                     |          }|                    |          }|/|j                            d          }|r ||          }n#||j                 }|                     ||          }|||j        <    | di |S )Ndeserializer   )r   r   rk   r   r   rm   rn   )	rx   r"   kwargsrq   rr   r-   r0   r   r   s	            r+   r   z"_DataClassMapping._parse_from_dict#  s    s## 	# 	#A$$Q''CHHSMME}*..77K 3#E**!&M((E22"F16NNs}}V}}r,   N)rt   r   r$   rb   )rx   r   r"   r   r$   r   )rx   r   r"   r   r$   r   )rx   r   r"   r   r$   r   )r\   r]   r^   r_   __annotations__rs   classmethodr   rk   r   r   r   rn   r   r   r   r   r,   r+   r   r      sH        AA9999  " $ $ $ ^ [$
 
 

% % %   $M $M [$ML ;;; [ X;;;; [ X;GGG [ XG
* 
* [
*    [  r,   c                  T     e Zd ZdZed	d            Z fdZe fd            Z xZS )
_JsonDataObjectzIA data class with members also accessible as a JSON-serializable Mapping.rt   r   r$   rE   c                    |j                             d          }|r|S |j                            d          }|d         d                    d |dd          D                       z   S )Nrm   _r    c              3  >   K   | ]}|                                 V  d S rv   )title)r{   ps     r+   r}   z1_JsonDataObject._get_field_key.<locals>.<genexpr>@  s*      !?!?!''))!?!?!?!?!?!?r,      )r   r   rm   splitjoin)rx   rt   rm   partss       r+   rk   z_JsonDataObject._get_field_key:  sk    ~!!&)) 	K
  %%Qx"''!?!?U122Y!?!?!?????r,   c                    t                                          |          }t          |t                    rt	          |          S |S rv   )rX   r   rD   r#   r   )rT   r-   r0   rZ   s      r+   r   z_JsonDataObject.__getitem__B  s?    ##C((eU## 	)!%(((r,   c                   |d z  |k    r|j         d         }n|}t          |t                    r9t          |t                    r$t          |t
                    rt          |          S t                                          ||          S )Nr   )	r   rD   rh   r   r#   rE   r   rX   rn   )rx   r   r0   t2rZ   s       r+   rn   z_JsonDataObject._parse_valueH  s    H??ABBBb$ 	)Jr5$9$9 	)jPS>T>T 	)!%(((ww##Au---r,   )rt   r   r$   rE   )	r\   r]   r^   r_   r   rk   r   rn   r`   ra   s   @r+   r   r   7  s        SS@ @ @ [@     	. 	. 	. 	. [	. 	. 	. 	. 	.r,   r   )r"   r#   r$   r#   )r-   r#   r"   r#   r$   r#   )r0   r#   r$   r1   r[   )r0   r1   r6   r1   r$   r#   )r"   r?   r$   r#   )r"   r#   r$   rE   )-r_   
__future__r   rO   abcr   base64r   r   dataclassesr   r   ior	   typingr
   r   r   r   r   r   r   r   r   sysversion_infor   cryptography.hazmat.backendsr   cryptography.hazmat.primitivesr   r   __all__LOG_LEVEL_TRAFFICr   r   r   r    r   r   rL   rb   r   rE   r   r   r,   r+   <module>r      s  8 
 # " " " " "        7 7 7 7 7 7 7 7 % % % % % % % %      
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  :JJJ
7"" wv%8999 8 8 8 8 8 8 7 7 7 7 7 7 7 7       	 	 	 	( ( ( (     % % % %"F F F F       0 WT"""B B B B BC( B B BJ. . . . .', . . . . .r,   