
    kKjN                     6   d dl Zd dlZddlmZmZmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZ ddlmZmZmZmZ dd	lmZ g d
Zej.                  ee
eef   Z G d d      Z ej4                  ddee   i      Z G d d      Zdee   dedej<                  e   fdZy)    N   )AnyKeyKeyParametersDictKey)OctKey)RSAKey)ECKey)OKPKey)MissingKeyErrorInvalidKeyIdErrorInvalidKeyTypeErrorMissingKeyTypeError)to_bytes)r   r   r	   r
   KeyKeySetJWKRegistryKeySetSerializationc                      e Zd ZU dZej
                  eej
                  eej
                  eej
                  eiZ	e
eee   f   ed<   eddededz  dedz  defd       Ze	 	 	 	 dded	eez  dz  dedz  d
ededefd       Zy)r   a  A registry for JWK to record ``joserfc`` supported key types.
    Normally, you would use explicit key types like ``OctKey``, ``RSAKey``;
    This registry provides a way to dynamically import and generate keys.
    For instance:

    .. code-block:: python

        from joserfc.jwk import JWKRegistry

        # instead of choosing which key type to use yourself,
        # JWKRegistry can import it automatically
        data = {"kty": "oct", "k": "..."}
        key = JWKRegistry.import_key(data)
    	key_typesNdatakey_type
parametersreturnc                 2   t        |t              r/|-d|v rt        j                  t        |d         }nt        d      || j                  vrt        d| d      t        |t              rt        |      }| j                  |   }|j                  ||      S )a  A class method for importing a key from bytes, string, and dict.
        When ``value`` is a dict, this method can tell the key type automatically,
        otherwise, developers SHOULD pass the ``key_type`` themselves.

        :param data: the key data in bytes, string, or dict.
        :param key_type: an optional key type in string.
        :param parameters: extra key parameters
        :return: OctKey, RSAKey, ECKey, or OKPKey
        ktyzMissing key typeInvalid key type: '')

isinstancedicttcaststrr   r   r   r   
import_key)clsr   r   r   key_clss        ^/Users/ahmed/devFolder/Ultron/claude-voice/.venv/lib/python3.12/site-packages/joserfc/_keys.pyr#   zJWKRegistry.import_key5   s     dD!h&6}66#tE{3)*<==3==(%(;H:Q&GHHdC D>D--)!!$
33    crv_or_sizeprivateauto_kidc                     || j                   vrt        d| d      | j                   |   }|j                  ||||      S )a  A class method for generating key according to the given key type.
        When ``key_type`` is "oct" and "RSA", the second parameter SHOULD be
        a key size in bits. When ``key_type`` is "EC" and "OKP", the second
        parameter SHOULD be a "crv" string.

        .. code-block:: python

            JWKRegistry.generate_key("RSA", 2048)
            JWKRegistry.generate_key("EC", "P-256")
        r   r   )r   r   generate_key)r$   r   r(   r   r)   r*   r%   s          r&   r,   zJWKRegistry.generate_keyO   sJ    & 3==(%(;H:Q&GHH--)##KWhOOr'   NN)NNTF)__name__
__module____qualname____doc__r   r   r   r	   r
   r   r   r"   typer   __annotations__classmethodr   r   r#   intboolr,    r'   r&   r   r      s      		'ItCcN#  4f 4d
 4}_cOc 4or 4 42  )-+/PP 3Y%P "D(	P
 P P 
P Pr'   r   r   keysc                      e Zd ZU ee   ed<   eZee   ed<   i Z	e
j                  eeee   f      ed<   dee   fdZde
j                  e   fdZdefdZde
j&                  defd	Zdd
ede
j&                  defdZddedz  dedz  defdZddedz  dedz  dedz  fdZeddededz  dd fd       Ze	 	 	 ddedeez  dedz  d
ededd fd       Zy)r   r8   registry_clsalgorithm_keysc                 @    |D ]  }|j                           || _        y N)
ensure_kidr8   )selfr8   keys      r&   __init__zKeySet.__init__s   s    CNN 	r'   r   c                 ,    t        | j                        S r=   )iterr8   r?   s    r&   __iter__zKeySet.__iter__x       DIIr'   c                 ,    t        | j                        S r=   )r6   r8   rD   s    r&   __bool__zKeySet.__bool__{   rF   r'   otherc                 X    t        |t              sJ | j                  |j                  k(  S r=   )r   r   r8   )r?   rI   s     r&   __eq__zKeySet.__eq__~   s%    %(((yyEJJ&&r'   r)   paramsc                     g }| j                   D ]5  }|j                          |j                   |j                  dd|i|       7 d|iS )Nr)   r8   r7   )r8   r>   appendas_dict)r?   r)   rL   r8   r@   s        r&   rO   zKeySet.as_dict   sJ     99CNNKK>G>v>?  ~r'   Nkidr   c                 
   |'t        | j                        dk(  r| j                  d   S | j                  D cg c]  }|j                  |k(  s| }}|rt        t	        ||            }|r|d   S t        d| d      c c}w )Nr   r   zNo key for kid: 'r   )lenr8   rP   list_filter_keys_by_parametersr   )r?   rP   r   r@   r8   s        r&   
get_by_kidzKeySet.get_by_kid   s    ;3tyy>Q.99Q<#yy;yCGGsNy;24DED7N"3C5 :;; <s   B B 	algorithmc                    |r| j                   j                  |      nd }|r)| j                  D cg c]  }|j                  |v s| }}n| j                  }|rt	        t        ||            }|rt        j                  |      S y c c}w r=   )r;   getr8   r   rS   rT   randomchoice)r?   rV   r   r   kr8   s         r&   pick_random_keyzKeySet.pick_random_key   s{    :CD''++I6	#yyDy!AJJ),CAyDD99D24DED==&& Es   BBvaluec                     g }|d   D ].  }|j                  | j                  j                  ||             0 |st        d       | |      S )Nr8   )r   zNo keys to import)rN   r:   r#   r   )r$   r]   r   r8   r   s        r&   import_key_setzKeySet.import_key_set   sR    &MDKK((33DZ3PQ " !"5664yr'   r   r(   countc                     g }t        |      D ]1  }| j                  j                  ||||      }|j                  |       3  | |      S r=   )ranger:   r,   rN   )	r$   r   r(   r   r)   r`   r8   _r@   s	            r&   generate_key_setzKeySet.generate_key_set   sL     uA""//+zSZ[CKK  4yr'   )Fr-   r=   )NT   )r.   r/   r0   rS   r   r3   r   r:   r2   r;   r    ClassVarr   r"   rA   IteratorrE   r6   rH   AnyrK   r   rO   r   rU   r\   r4   r_   r5   rd   r7   r'   r&   r   r   l   s   
s)O&1L${#179NAJJtCcN349T#Y 
!**S/ $ 'AEE 'd 't quu AT 
<cDj 
<]T=Q 
<]` 
<t X\H\ hknrhr  	#6 	MTXDX 	dl 	 	 
 ,0 3Y "D(	
   
 r'   r   r   r   c              #      K   |j                  d      }|j                  d      }| D ]<  }|j                  d      }|r|r||k7  r|j                  d      }|r|r||k7  r9| > y w)Nusealg)rX   )r8   r   _use_algr@   designed_usedesigned_algs          r&   rT   rT      si     >>% D>>% Dwwu~D\T%9wwu~D\T%9	 s   A%A') typingr    rY   _rfc7517.typesr   r   r   _rfc7518.oct_keyr   _rfc7518.rsa_keyr   _rfc7518.ec_keyr	   _rfc8037.okp_keyr
   errorsr   r   r   r   utilr   __all__Unionr   r   	TypedDictrS   r   r   rg   rT   r7   r'   r&   <module>r{      s      : : $ $ " $  	 ggffeV+,HP HPV "akk"7&$w-9PQ S SlT#Y M ajjY\o r'   