o
    DfU                     @   sT   d dl mZ d dlmZmZmZmZmZ ddlm	Z	 ddl
mZ G dd deZdS )	    )to_bytes)EncodingPrivateFormatPublicFormatBestAvailableEncryptionNoEncryption   )load_pem_key)Keyc                       s   e Zd ZdZg Zg ZeZeZdZ	d- fdd	Z
edd Zdd	 Zd
d Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd.ddZd.ddZd/dd Zd0d!d"Zd0d#d$Zed1d%d&Zed1d'd(Zed)d* Zed2d+d,Z  Z S )3AsymmetricKeyz*This is the base class for a JSON Web Key.    Nc                    s   t  | || _|| _d S N)super__init__private_key
public_key)selfr   r   options	__class__ \/home/ubuntu/webapp/venv/lib/python3.10/site-packages/authlib/jose/rfc7517/asymmetric_key.pyr      s   
zAsymmetricKey.__init__c                 C   s   | j rdS d| jv rdS dS )NFdT)r   tokensr   r   r   r   public_only   s
   
zAsymmetricKey.public_onlyc                 C   s$   |  | || jv r|  S |  S )zGet the raw key for the given key_op. This method will also
        check if the given key_op is supported by this key.

        :param operation: key operation value, such as "sign", "encrypt".
        :return: raw key
        )check_key_opPUBLIC_KEY_OPSget_public_keyget_private_key)r   	operationr   r   r   
get_op_key   s   

zAsymmetricKey.get_op_keyc                 C   s&   | j r| j S |  }|r|  S | j S r   )r   r   )r   r   r   r   r   r   +   s   zAsymmetricKey.get_public_keyc                 C   s    | j r| j S | jr|   | j S r   )r   r   load_raw_keyr   r   r   r   r   5   s
   zAsymmetricKey.get_private_keyc                 C   s&   d| j v r|  | _d S |  | _d S )Nr   )r   load_private_keyr   load_public_keyr   r   r   r   r   r"   =   s   
zAsymmetricKey.load_raw_keyc                 C   s.   | j r| j|   d S | j|   d S r   )r   
_dict_dataupdatedumps_private_keydumps_public_keyr   r   r   r   load_dict_keyC   s   zAsymmetricKey.load_dict_keyc                 C      t  r   NotImplementedErrorr   r   r   r   r'   I      zAsymmetricKey.dumps_private_keyc                 C   r*   r   r+   r   r   r   r   r(   L   r-   zAsymmetricKey.dumps_public_keyc                 C   r*   r   r+   r   r   r   r   r#   O   r-   zAsymmetricKey.load_private_keyc                 C   r*   r   r+   r   r   r   r   r$   R   r-   zAsymmetricKey.load_public_keyFc                    sx    j |rdvrtdd}dv r-|s- fddD  jd< |r-|d< |s5  d< | S )z1Represent this key as a dict of the JSON Web Key.r   This is a public keykidc                    s    i | ]}| j v r|| qS r   )PUBLIC_KEY_FIELDS).0kr   r   r   r   
<dictcomp>^   s     z)AsymmetricKey.as_dict.<locals>.<dictcomp>kty)r   
ValueErrorgetr5   
thumbprintr&   )r   
is_privateparamsr/   r   r3   r   as_dictU   s   


zAsymmetricKey.as_dictc                 C   s   |r|   S |  S )zRepresent this key as raw key.)r   r   )r   r9   r   r   r   as_keyi   s   zAsymmetricKey.as_keyc                 C   s   |du s|dkrt j}n|dkrt j}ntd|| |}|r?|s(td|du r0t }ntt|}|j|t	j
|dS |j|tjdS )zExport key into PEM/DER format bytes.

        :param encoding: "PEM" or "DER"
        :param is_private: export private key or public key
        :param password: encrypt private key with password
        :return: bytes
        NPEMDERzInvalid encoding: r.   )encodingformatencryption_algorithm)r?   r@   )r   r=   r>   r6   r<   r   r   r   private_bytesr   PKCS8public_bytesr   SubjectPublicKeyInfo)r   r?   r9   passwordraw_keyrA   r   r   r   as_byteso   s*   	
zAsymmetricKey.as_bytesc                 C   s   | j ||dS )N)r9   rF   rH   r   r9   rF   r   r   r   as_pem   s   zAsymmetricKey.as_pemc                 C   s   | j d||dS )Nr>   )r?   r9   rF   rI   rJ   r   r   r   as_der   s   zAsymmetricKey.as_derc                 C   s   |  | | |d}||_|S )N)r   )check_required_fieldsr%   )clsrawr   keyr   r   r   import_dict_key   s   

zAsymmetricKey.import_dict_keyc                 C   s   t || r|d ur|j| |S t || jr| ||d}|S t || jr-| ||d}|S t |tr:| ||}|S |d urE|dd }nd }t|| j	|d}t || jr]| ||d}|S t || jrk| ||d}|S t
d)N)r   r   )r   r   rF   )rF   zInvalid data for importing key)
isinstancer   r&   PUBLIC_KEY_CLSPRIVATE_KEY_CLSdictrQ   popr	   SSH_PUBLIC_PREFIXr6   )rN   rO   r   rP   rF   rG   r   r   r   
import_key   s0   

zAsymmetricKey.import_keyc                 C   s   t || jpt || jS r   )rR   rS   rT   )rN   rP   r   r   r   validate_raw_key   s   zAsymmetricKey.validate_raw_keyc                 C   r*   r   r+   )rN   crv_or_sizer   r9   r   r   r   generate_key   s   zAsymmetricKey.generate_key)NNN)F)NFN)FNr   )NF)!__name__
__module____qualname____doc__r0   PRIVATE_KEY_FIELDSbytesrT   rS   rW   r   propertyr   r!   r   r   r"   r)   r'   r(   r#   r$   r;   r<   rH   rK   rL   classmethodrQ   rX   rY   r[   __classcell__r   r   r   r   r   
   s@    





"

r   N)authlib.common.encodingr   ,cryptography.hazmat.primitives.serializationr   r   r   r   r   _cryptography_keyr	   base_keyr
   r   r   r   r   r   <module>   s
    