
    uZh                     ^    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y)    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y)
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                  j                  | j                        | _        t        |t        j                   t        j"                  f      r|| _        y t        |t&              r| j)                  |      | _        y t        |t*              r|j-                  d      }t        |t.              r(	 t        j"                  j1                  |      }|| _        y t        d|z        # t        j2                  j4                  $ r) t        j                   j1                  |      }Y || _        y t6        $ r}t        |      d }~ww xY w)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       w/var/www/html/wine-match-dev/backend/winematch-backend/venv/lib/python3.12/site-packages/jose/backends/ecdsa_backend.py__init__zECDSAECKey.__init__$   s|   JMM)G)STT dkkdkkdkk
 #i.	 	
 $^^''6
cE,,e.@.@AB #Dc4  $ 1 1# 6Dc3**W%Cc5!"((11#6 !$D>DEE 99** 5&&//4 !$D	  "qk!"s   E6 6<G;GGGc                 :   j                  d      dk(  st        dj                  d      z        t        fddD              st        d      dv rNt        j                  d            }t        j
                  j                  j                  || j                        S t        j                  d            }t        j                  d	            }t        j                  j                  | j                  j                  ||      st        d
| d| d      t        j                  j                  | j                  j                  ||| j                  j                        }t        j
                  j                  j                  || j                        S )Nktyr   z0Incorrect key type. Expected: 'EC', Received: %sc              3   &   K   | ]  }|v  
 y wN ).0kjwk_dicts     r)   	<genexpr>z*ECDSAECKey._process_jwk.<locals>.<genexpr>P   s     <Q1=<s   )xycrvz Mandatory parameters are missingdr4   r5   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   r7   r4   r5   points    `    r)   r   zECDSAECKey._process_jwkL   s<   ||E"d*MPXP\P\]bPccdd<*;<<=>>(? x||C01A::((==aLLx||C01Ax||C01A;;--djj.B.BAqI2aS0EFGG''--djj.>.>1djjFVFVWE::**<<UDJJOO    c                     | j                   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   s8      %%$--5::3N3N_d & 
 	
rB   c                     	 | j                   j                  ||| j                  t        j                  j
                  d      S # t        $ r Y yw xY w)NF)rD   	sigdecoderF   )r   verifyr   r   rH   sigdecode_stringr$   )r%   rJ   sigs      r)   rM   zECDSAECKey.verifyg   sS    	$$++S4==EJJ<W<Whm ,    		s   AA 	AAc                 J    t        | j                  t        j                        S r.   )r   r   r   r   r%   s    r)   	is_publiczECDSAECKey.is_publico   s    $++U-?-?@@rB   c                     | j                         r| S | j                  | j                  j                         | j                        S r.   )rR   	__class__r   get_verifying_keyr   rQ   s    r)   
public_keyzECDSAECKey.public_keyr   s5    >>K~~d//AACT__UUrB   c                 6    | j                   j                         S r.   )r   to_pemrQ   s    r)   rX   zECDSAECKey.to_pemw   s      ''))rB   c                    | j                         s| j                  j                         }n| j                  }d }| j                  D ]!  \  }}|| j                  j                  k(  s |}# |s"t        d| j                  j                         | j                  j                  j                  }| j                  d|t        |j                  j                  j                         |      j                  d      t        |j                  j                  j                         |      j                  d      d}| j                         s=t        | j                  j                  j                  |      j                  d      |d<   |S )NzCan't match r   )sizeASCII)algr,   r6   r4   r5   r7   )rR   r   rU   CURVE_NAMESr   KeyErrorbaselenr   r   pubkeyrA   r4   decoder5   privkeysecret_multiplier)r%   rV   r6   r&   valuekey_sizedatas          r)   to_dictzECDSAECKey.to_dictz   sK   ~~**<<>J**J** 	JCd''---	 \$*;*;*A*A)BCDD
 $$**22 ??
 1 1 7 7 9 9 ;(KRRSZ[
 1 1 7 7 9 9 ;(KRRSZ[
 ~~&t'8'8'@'@'R'RYabiijqrDIrB   N)__name__
__module____qualname____doc__hashlibsha256r   sha384r   sha512r   r   curvesNIST256pNIST384pNIST521pr   r]   r*   r   rG   rM   rR   rV   rX   rg   r/   rB   r)   r	   r	      s     ^^F^^F^^F 	%%%%%%I 
		(			(			(K&FPP,

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