
    ]f                     f    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e          ZdS )    N)Key)
ALGORITHMS)JWKError)base64_to_longlong_to_base64c                   
   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 Zd Zd Zd Zd	 Zd
 Zd Z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                    |t           j        vrt          d|z            t           j        | j        t           j        | j        t           j        | j        i	                    |          | _
        || _        | j        	                    | j
                  | _        t          |t          j        t          j        f          r	|| _        d S t          |t&                    r|                     |          | _        d S t          |t*                    r|                    d          }t          |t.                    r	 t          j                            |          }nU# t          j        j        $ r" t          j                            |          }Y n t6          $ r}t          |          d }~ww xY w|| _        d S t          d|z            )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es       M/var/www/html/env/lib/python3.11/site-packages/jose/backends/ecdsa_backend.py__init__zECDSAECKey.__init__$   s   JM))G)STTT dkdkdk
 #i..	 	
 $^''66
cE,e.@ABB 	 #DFc4   	 $ 1 1# 6 6DFc3 	&**W%%Cc5!! 	"(11#669* 5 5 5&//44 " " "qkk!" !$DF>DEEEs   9E 3F+	F+F&&F+c                 >                        d          dk    s%t          d                     d          z            t          fddD                       st          d          dv rLt                               d                    }t          j        j                            || j                  S t                               d                    }t                               d	                    }t          j        	                    | j        j
        ||          st          d
| d| d          t          j                            | j        j        ||| j        j                  }t          j        j                            || j                  S )Nktyr   z0Incorrect key type. Expected: 'EC', Received: %sc              3       K   | ]}|v V  	d S N ).0kjwk_dicts     r)   	<genexpr>z*ECDSAECKey._process_jwk.<locals>.<genexpr>P   s'      <<Q1=<<<<<<    )xycrvz Mandatory parameters are missingdr5   r6   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%   r2   r8   r5   r6   points    `    r)   r   zECDSAECKey._process_jwkL   sm   ||E""d**MPXP\P\]bPcPccddd<<<<*;<<<<< 	?=>>>(?? x||C0011A:(==aLLLx||C0011Ax||C0011A;--dj.BAqII HFFFaFFFGGG'--dj.>1djFVWWE:*<<UDJOOOr4   c                 f    | j                             || j        t          j        j        d          S )NF)hashfunc	sigencodeallow_truncate)r   signr   r   utilsigencode_string)r%   msgs     r)   rG   zECDSAECKey.signb   s3     %%$-5:3N_d & 
 
 	
r4   c                     	 | j                             ||| j        t          j        j        d          S # t          $ r Y dS w xY w)NF)rD   	sigdecoderF   )r   verifyr   r   rH   sigdecode_stringr$   )r%   rJ   sigs      r)   rM   zECDSAECKey.verifyg   s^    	$++S4=EJ<Whm ,     	 	 	55	s   25 
AAc                 @    t          | j        t          j                  S r.   )r   r   r   r   r%   s    r)   	is_publiczECDSAECKey.is_publico   s    $+U-?@@@r4   c                     |                                  r| S |                     | j                                        | j                  S r.   )rR   	__class__r   get_verifying_keyr   rQ   s    r)   
public_keyzECDSAECKey.public_keyr   s>    >> 	K~~d/AACCT_UUUr4   c                 4    | j                                         S r.   )r   to_pemrQ   s    r)   rX   zECDSAECKey.to_pemw   s     '')))r4   c                    |                                  s| j                                        }n| j        }d }| j        D ]\  }}|| j        j        k    r|}|st          d| j        j                   | j        j        j        }| j        d|t          |j	        j
                                        |                              d          t          |j	        j
                                        |                              d          d}|                                  s6t          | j        j        j        |                              d          |d<   |S )NzCan't match r   )sizeASCII)algr,   r7   r5   r6   r8   )rR   r   rU   CURVE_NAMESr   KeyErrorbaselenr   r   pubkeyrB   r5   decoder6   privkeysecret_multiplier)r%   rV   r7   r&   valuekey_sizedatas          r)   to_dictzECDSAECKey.to_dictz   s^   ~~ 	+*<<>>JJ*J* 	 	JCd'--- 	EC$*;*ACCDDD
 $*2 ?
 1 7 9 9 ; ;(KKKRRSZ[[
 1 7 9 9 ; ;(KKKRRSZ[[
 
 ~~ 	s&t'8'@'RYabbbiijqrrDIr4   N)__name__
__module____qualname____doc__hashlibsha256r   sha384r   sha512r   r   curvesNIST256pNIST384pNIST521pr   r]   r*   r   rG   rM   rR   rV   rX   rg   r/   r4   r)   r	   r	      s         ^F^F^F 	%%%I 
	(		(		(K&F &F &FPP P P,
 
 

  A A AV V V
* * *    r4   r	   )rl   r   jose.backends.baser   jose.constantsr   jose.exceptionsr   
jose.utilsr   r   r	   r/   r4   r)   <module>rx      s      " " " " " " % % % % % % $ $ $ $ $ $ 5 5 5 5 5 5 5 5K K K K K K K K K Kr4   