
    ~h@                     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 d dlmZ ddlm	Z	 dd	l
mZ  G d
 de      Zy)    )BestAvailableEncryption)Encoding)NoEncryption)PrivateFormat)PublicFormat)to_bytes   )load_pem_key)Keyc                        e Zd ZdZg Zg ZeZeZdZ	d fd	Z
ed        Zd Zd Zd Zd Zd	 Zd
 Zd Zd Zd ZddZddZddZddZddZedd       Zedd       Zed        Zedd       Z xZ S )AsymmetricKeyz*This is the base class for a JSON Web Key.    c                 @    t         |   |       || _        || _        y N)super__init__private_key
public_key)selfr   r   options	__class__s       _/opt/mcp/mcp-sentiment/venv/lib/python3.12/site-packages/authlib/jose/rfc7517/asymmetric_key.pyr   zAsymmetricKey.__init__   s    !&$r   c                 <    | j                   ryd| j                  v ryy)NFdT)r   tokensr   s    r   public_onlyzAsymmetricKey.public_only   s     $++r   c                     | j                  |       || j                  v r| j                         S | j                         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   	operations     r   
get_op_keyzAsymmetricKey.get_op_key#   s>     	)$+++&&((##%%r   c                     | j                   r| j                   S | j                         }|r|j                         S | j                   S r   )r   r"   )r   r   s     r   r!   zAsymmetricKey.get_public_key/   s=    ????"**,))++r   c                     | j                   r| j                   S | j                  r| j                          | j                   S r   )r   r   load_raw_keyr   s    r   r"   zAsymmetricKey.get_private_key9   s6    ###;;r   c                 v    d| j                   v r| j                         | _        y | j                         | _        y )Nr   )r   load_private_keyr   load_public_keyr   r   s    r   r'   zAsymmetricKey.load_raw_keyA   s/    $++#446D"224DOr   c                     | j                   r*| j                  j                  | j                                y | j                  j                  | j	                                y r   )r   
_dict_dataupdatedumps_private_keydumps_public_keyr   s    r   load_dict_keyzAsymmetricKey.load_dict_keyG   sA    OO""4#9#9#;<OO""4#8#8#:;r   c                     t               r   NotImplementedErrorr   s    r   r.   zAsymmetricKey.dumps_private_keyM       !##r   c                     t               r   r2   r   s    r   r/   zAsymmetricKey.dumps_public_keyP   r4   r   c                     t               r   r2   r   s    r   r)   zAsymmetricKey.load_private_keyS   r4   r   c                     t               r   r2   r   s    r   r*   zAsymmetricKey.load_public_keyV   r4   r   c                 4   | j                   }|rd|vrt        d      |j                  d      }d|v r:|s8|D ci c]  }|| j                  v s|||    }}| j                  |d<   |r||d<   |s| j                         |d<   |j                  |       |S c c}w )z1Represent this key as a dict of the JSON Web Key.r   This is a public keykidkty)r   
ValueErrorgetPUBLIC_KEY_FIELDSr;   
thumbprintr-   )r   
is_privateparamsr   r:   ks         r   as_dictzAsymmetricKey.as_dictY   s    #V+344jj&=,2Rqa4;Q;Q6QalRFR HHF5M #u OO-F5Mf Ss   BBc                 F    |r| j                         S | j                         S )zRepresent this key as raw key.)r"   r!   )r   r@   s     r   as_keyzAsymmetricKey.as_keym   s#    ''))""$$r   c                    ||dk(  rt         j                  }n$|dk(  rt         j                  }nt        d|      | j	                  |      }|rP|st        d      |t               }nt        t        |            }|j                  |t        j                  |      S |j                  |t        j                        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
        PEMDERzInvalid encoding: r9   )encodingformatencryption_algorithm)rI   rJ   )r   rG   rH   r<   rE   r   r   r   private_bytesr   PKCS8public_bytesr   SubjectPublicKeyInfo)r   rI   r@   passwordraw_keyrK   s         r   as_byteszAsymmetricKey.as_bytess   s     x50||H||H1(>??++j) !788'3~$'>x?Q'R$((!$**%9 )  
 ##44 $ 
 	
r   c                 (    | j                  ||      S )N)r@   rP   rR   r   r@   rP   s      r   as_pemzAsymmetricKey.as_pem   s    }}
X}FFr   c                 *    | j                  d||      S )NrH   )rI   r@   rP   rT   rU   s      r   as_derzAsymmetricKey.as_der   s    }}e
X}VVr   c                 H    | j                  |        | |      }||_        |S )N)r   )check_required_fieldsr,   )clsrawr   keys       r   import_dict_keyzAsymmetricKey.import_dict_key   s&    !!#&'"
r   c                 $   t        ||       r||j                  j                  |       |S t        || j                        r | ||      }|S t        || j                        r | ||      }|S t        |t
              r| j                  ||      }|S ||j                  dd       }nd }t        || j                  |      }t        || j                        r | ||      }|S t        || j                        r | ||      }|S t        d      )N)r   r   )r   r   rP   )rP   zInvalid data for importing key)
isinstancer   r-   PUBLIC_KEY_CLSPRIVATE_KEY_CLSdictr^   popr
   SSH_PUBLIC_PREFIXr<   )r[   r\   r   r]   rP   rQ   s         r   
import_keyzAsymmetricKey.import_key   s   c3"""7+Jc3--.g6C" 
! S001#w7C 
 T"%%c73C 
 "";;z48"3(=(=QG'3#5#56Wg>
 
	 GS%8%89gw? 
 !!ABBr   c                 ^    t        || j                        xs t        || j                        S r   )r`   ra   rb   )r[   r]   s     r   validate_raw_keyzAsymmetricKey.validate_raw_key   s.    #s112 
j$$7
 	
r   c                     t               r   r2   )r[   crv_or_sizer   r@   s       r   generate_keyzAsymmetricKey.generate_key   s    !##r   )NNN)F)NFN)FNr   )NF)!__name__
__module____qualname____doc__r>   PRIVATE_KEY_FIELDSbytesrb   ra   re   r   propertyr   r$   r!   r"   r'   r0   r.   r/   r)   r*   rC   rE   rR   rV   rX   classmethodr^   rf   rh   rk   __classcell__)r   s   @r   r   r      s    4ON%
  
& 5<$$$$(%
BGW    4 
 

 $ $r   r   N),cryptography.hazmat.primitives.serializationr   r   r   r   r   authlib.common.encodingr   _cryptography_keyr
   base_keyr   r    r   r   <module>rz      s+    P A E F E , + w$C w$r   