o
    Df                     @   sJ   d dl Z d dlmZ d dlmZmZmZmZ ddlm	Z	 G dd dZ
dS )    N)OrderedDict)
json_dumpsto_bytes
to_unicodeurlsafe_b64encode   )InvalidUseErrorc                   @   s   e Zd ZdZdZg dZg dZg dZg Zd$ddZ	e
d	d
 Ze
dd Zdd Zdd Ze
dd Zdd Zdd Zdd Zd%ddZd%ddZdd Zed d! Zed"d# ZdS )&Keyz*This is the base class for a JSON Web Key._)usekey_opsalgkidx5ux5cx5tzx5t#S256)signdecrypt	unwrapKey)verifyencryptwrapKeyNc                 C   s   |pi | _ i | _d S N)options
_dict_data)selfr    r   V/home/ubuntu/webapp/venv/lib/python3.10/site-packages/authlib/jose/rfc7517/base_key.py__init__   s   

zKey.__init__c                 C   sR   | j s|   t| j }| j|d< | jD ]}||vr&|| jv r&| j| ||< q|S )Nkty)r   load_dict_keydictr   ALLOWED_PARAMSr   )r   rvkr   r   r   tokens"   s   


z
Key.tokensc                 C   s   | j dS )Nr   )r%   getr   r   r   r   r   .   s   zKey.kidc                 C   s
   | j  S r   )r%   keysr'   r   r   r   r(   2      
zKey.keysc                 C   s
   | j | S r   )r%   )r   itemr   r   r   __getitem__5   r)   zKey.__getitem__c                 C      t  r   NotImplementedErrorr'   r   r   r   public_only8      zKey.public_onlyc                 C   r,   r   r-   r'   r   r   r   load_raw_key<      zKey.load_raw_keyc                 C   r,   r   r-   r'   r   r   r   r    ?   r2   zKey.load_dict_keyc                 C   s   | j d}|dur||vrtd| d|| jv r&| jr&td| d| j d}|rF|dv r;|d	kr9t dS |d
v rH|dkrJt dS dS dS )zCheck if the given key_op is supported by this key.

        :param operation: key operation value, such as "sign", "encrypt".
        :raise: ValueError
        r   NzUnsupported key_op ""zInvalid key_op "z" for public keyr   )r   r   sig)r   r   r   r   enc)r%   r&   
ValueErrorPRIVATE_KEY_OPSr/   r   )r   	operationr   r   r   r   r   check_key_opB   s"   zKey.check_key_opFc                 K   r,   r   r-   )r   
is_privateparamsr   r   r   as_dictX   r2   zKey.as_dictc                 K   s   | j |fi |}t|S )z$Represent this key as a JSON string.)r<   r   )r   r:   r;   objr   r   r   as_json[   s   zKey.as_jsonc                 C   s`   t | j}|d |  t }|D ]	}| j| ||< qt|}tt	|
 }tt|S )z8Implementation of RFC7638 JSON Web Key (JWK) Thumbprint.r   )listREQUIRED_JSON_FIELDSappendsortr   r%   r   hashlibsha256r   digestr   r   )r   fieldsdatar$   	json_datadigest_datar   r   r   
thumbprint`   s   

zKey.thumbprintc                 C   s(   | j D ]}||vrtd| dqd S )NzMissing required field: "r3   )r@   r6   )clsrG   r$   r   r   r   check_required_fieldsn   s
   
zKey.check_required_fieldsc                 C   r,   r   r-   )rK   keyr   r   r   validate_raw_keyt   r0   zKey.validate_raw_keyr   )F)__name__
__module____qualname____doc__r   r"   r7   PUBLIC_KEY_OPSr@   r   propertyr%   r   r(   r+   r/   r1   r    r9   r<   r>   rJ   classmethodrL   rN   r   r   r   r   r	      s4    






r	   )rC   collectionsr   authlib.common.encodingr   r   r   r   errorsr   r	   r   r   r   r   <module>   s
    