o
    l>j                     @  st  U d Z ddlmZ ddlZddlmZ ddlmZmZm	Z	m
Z
mZ eeB eB eB e
e B e	eef B Zded< eeB eB Zded< d?d@ddZdAddZdBddZdd ZdCddZdDddZdEddZeefeefeefeefe	efe
efgZd ed!< dFd$d%ZdFd&d'ZdGd)d*ZdHd,d-Z dId/d0Z!dJd2d3Z"dKd5d6Z#eee e!e"e#ed7Z$dLd8d9Z%dMd;d<Z&dNd=d>Z'dS )Oz
Minimal CBOR implementation supporting a subset of functionality and types
required for FIDO 2 CTAP.

Use the :func:`encode`, :func:`decode` and :func:`decode_from` functions to encode
and decode objects to/from CBOR.
    )annotationsN)	UnionType)AnyCallableMappingSequence	TypeAliasr   CborTypeBufferdataintmtreturnbytesc                 C  s   | dk r
d}d|  } |d> }| dkrd|| B f}}n3| dkr)d|d	B | f}}n%| d
kr7d|dB | f}}n| dkrEd|dB | f}}n	d|dB | f}}t j|g|R  S )Nr            z>B   z>BB   i  z>BH   l    z>BI   z>BQ   )structpack)r   r   fmtargs r   ?/home/thesage/.local/lib/python3.10/site-packages/fido2/cbor.py	_dump_int1   s   r   boolc                 C  s   | rdS dS )N      r   r   r   r   r   
_dump_boolF      r$   Sequence[CborType]c                 C  s$   t t| ddddd | D  S )N   r       c                 S  s   g | ]}t |qS r   encode).0xr   r   r   
<listcomp>K   s    z_dump_list.<locals>.<listcomp>)r   lenjoinr#   r   r   r   
_dump_listJ   s   $r1   c                 C  s   | d }|d t ||fS )Nr   )r/   )entrykeyr   r   r   
_sort_keysN   s   r4   Mapping[CborType, CborType]c                 C  sB   dd |   D }|jtd tt|ddddd |D  S )Nc                 S  s    g | ]\}}t |t |fqS r   r*   r,   kvr   r   r   r.   T   s     z_dump_dict.<locals>.<listcomp>)r3   r   r(   r)   c                 S  s   g | ]\}}|| qS r   r   r6   r   r   r   r.   V   s    )itemssortr4   r   r/   r0   )r   r9   r   r   r   
_dump_dictS   s   $r;   c                 C  s   t t| dd|  S )N   r(   )r   r/   r#   r   r   r   _dump_bytesY   s   r=   strc                 C  s   |  d}tt|dd| S )Nutf8   r(   )r+   r   r/   )r   
data_bytesr   r   r   
_dump_text]   s   
rB   z9Sequence[tuple[type | UnionType, Callable[[Any], bytes]]]_SERIALIZERSaituple[int, bytes]c                 C  s   | dk r| |fS | dkr|d |dd  fS | dkr(t d|d |dd  fS | dkr:t d|d |d	d  fS | d
krLt d|d |dd  fS td)Nr   r   r   r   z>Hr<   r   z>Ir'   r   z>Q   zInvalid additional information)r   unpack_from
ValueErrorrD   r   r   r   r   	_load_intl   s   rJ   c                 C  s   t | |\}}d| |fS )Nr   rJ   )rD   r   valrestr   r   r   
_load_nintz   s   rN   tuple[bool, bytes]c                 C  s   | dk|fS )N   r   rI   r   r   r   
_load_bool   r%   rQ   tuple[bytes, bytes]c                 C  s&   t | |\}}|d | ||d  fS NrK   )rD   r   lnr   r   r   _load_bytes   s   rU   tuple[str, bytes]c                 C  s   t | |\}}|d|fS )Nr?   )rU   decode)rD   r   encrM   r   r   r   
_load_text   s   rY    tuple[Sequence[CborType], bytes]c                 C  s>   t | |\}}g }t|D ]}t|\}}|| q||fS rS   )rJ   rangedecode_fromappend)rD   r   rT   valuesirL   r   r   r   _load_array   s   r`   )tuple[Mapping[CborType, CborType], bytes]c                 C  sH   t | |\}}i }t|D ]}t|\}}t|\}}|||< q||fS rS   )rJ   r[   r\   )rD   r   rT   r^   r_   r7   r8   r   r   r   	_load_map   s   
rb   )r   r   r<   r@   r'   r      c                 C  s2   t D ]\}}t| |r||   S qtd| )z#Encodes data to a CBOR byte string.zUnsupported value: )rC   
isinstancerH   )r   r7   r8   r   r   r   r+      s
   
r+   tuple[Any, bytes]c                 C  s&   | d }t |d?  |d@ | dd S )zDecodes a CBOR-encoded value from the start of a byte string.

    Additional data after a valid CBOR object is returned as well.

    :return: The decoded object, and any remaining data.r   r      r   N)_DESERIALIZERS)r   fbr   r   r   r\      s   r\   c                 C  s    t | \}}|dkrtd|S )zuDecodes data from a CBOR-encoded byte string.

    Also validates that no extra data follows the encoded object.
    r)   zExtraneous data)r\   rH   )r   valuerM   r   r   r   rW      s   rW   )r   )r   r   r   r   r   r   )r   r    r   r   )r   r&   r   r   )r   r5   r   r   )r   r   r   r   )r   r>   r   r   )rD   r   r   r   r   rE   )rD   r   r   r   r   rO   )rD   r   r   r   r   rR   )rD   r   r   r   r   rV   )rD   r   r   r   r   rZ   )rD   r   r   r   r   ra   )r   r	   r   r   )r   r   r   re   )r   r	   )(__doc__
__future__r   r   typesr   typingr   r   r   r   r   r   r    r>   r   r	   __annotations__	bytearray
memoryviewr
   r   r$   r1   r4   r;   r=   rB   rC   rJ   rN   rQ   rU   rY   r`   rb   rg   r+   r\   rW   r   r   r   r   <module>   sN   ,












	


