o
    6h                     @   sX   d dl Z d dlZd dlmZ d dlmZ d dlmZ d dlm	Z	m
Z
 G dd deZdS )    N)Key)
ALGORITHMS)JWKError)base64_to_longlong_to_base64c                   @   s   e Zd ZdZejZejZej	Z
eejjeejje
ejjiZejjdfejjdfejjdff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S )
ECDSAECKeyz
    Performs signing and verification operations using
    ECDSA and the specified hash function

    This class requires the ecdsa package to be installed.

    This is based off of the implementation in PyJWT 0.3.2
    zP-256zP-384zP-521c              
   C   s  |t jvrtd| t j| jt j| jt j| ji	|| _
|| _| j	| j
| _t|tjtjfr6|| _d S t|trC| || _d S t|trM|d}t|trztj|}W n  tjjyk   tj|}Y n tyz } zt|d }~ww || _d S td| )Nz*hash_alg: %s is not a valid hash algorithmzutf-8z%Unable to parse an ECKey from key: %s)r   ECr   ES256SHA256ES384SHA384ES512SHA512gethash_alg
_algorithm	CURVE_MAPcurve
isinstanceecdsa
SigningKeyVerifyingKeyprepared_keydict_process_jwkstrencodebytesfrom_pemderUnexpectedDER	Exception)selfkey	algorithme r&   o/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/jose/backends/ecdsa_backend.py__init__$   s<   




zECDSAECKey.__init__c                    s     ddkstd  d t fdddD stdd v r3t  d}tjj|| jS t  d	}t  d
}tj	| jj
||sVtd| d| dtj| jj||| jj}tjj|| jS )Nktyr   z0Incorrect key type. Expected: 'EC', Received: %sc                 3   s    | ]}| v V  qd S Nr&   ).0kjwk_dictr&   r'   	<genexpr>P   s    z*ECDSAECKey._process_jwk.<locals>.<genexpr>)xycrvz Mandatory parameters are missingdr0   r1   zPoint: z, z is not a valid point)r   r   allr   r   keysr   from_secret_exponentr   point_is_valid	generatorellipticcurvePointorderr   from_public_point)r"   r.   r3   r0   r1   pointr&   r-   r'   r   L   s   zECDSAECKey._process_jwkc                 C   s   | j j|| jtjjddS )NF)hashfunc	sigencodeallow_truncate)r   signr   r   utilsigencode_string)r"   msgr&   r&   r'   rA   b   s   zECDSAECKey.signc                 C   s4   z| j j||| jtjjddW S  ty   Y dS w )NF)r>   	sigdecoder@   )r   verifyr   r   rB   sigdecode_stringr!   )r"   rD   sigr&   r&   r'   rF   g   s   zECDSAECKey.verifyc                 C   s   t | jtjS r*   )r   r   r   r   r"   r&   r&   r'   	is_publico   s   zECDSAECKey.is_publicc                 C   s    |   r| S | | j | jS r*   )rJ   	__class__r   get_verifying_keyr   rI   r&   r&   r'   
public_keyr   s   zECDSAECKey.public_keyc                 C   s
   | j  S r*   )r   to_pemrI   r&   r&   r'   rN   w   s   
zECDSAECKey.to_pemc                 C   s   |   s
| j }n| j}d }| jD ]\}}|| jjkr|}q|s*td| jj | jjj}| jd|t|j	j
 |ddt|j	j
 |ddd}|   s`t| jjj|dd|d< |S )NzCan't match r   )sizeASCII)algr)   r2   r0   r1   r3   )rJ   r   rL   CURVE_NAMESr   KeyErrorbaselenr   r   pubkeyr=   r0   decoder1   privkeysecret_multiplier)r"   rM   r2   r#   valuekey_sizedatar&   r&   r'   to_dictz   s(   
zECDSAECKey.to_dictN)__name__
__module____qualname____doc__hashlibsha256r
   sha384r   sha512r   r   curvesNIST256pNIST384pNIST521pr   rR   r(   r   rA   rF   rJ   rM   rN   r\   r&   r&   r&   r'   r      s*    	


(r   )ra   r   jose.backends.baser   jose.constantsr   jose.exceptionsr   
jose.utilsr   r   r   r&   r&   r&   r'   <module>   s    