
    kKjb,                        U d dl Zd dlmZ d dlmZ d dlmZmZ d dl	m
Z
mZ d dlmZmZ d dlmZmZ d dlmZmZmZmZ d d	lmZ d d
lmZ ddlmZ ddlmZmZ ddl m!Z! ddl"m#Z#m$Z$ ddl%m&Z&m'Z'm(Z( ddl)m*Z* ejV                  d   Z,ejZ                  ee
eef   Z.ejZ                  eeeef   Z/ ej`                  de,e1e1dd      Z2ee
eedZ3e4e1e5e.   f   e6d<   eeeedZ7e4e1e5e/   f   e6d<   dddddZ8e4e,e9f   e6d<   eeeefZ: G d de!      Z; G d d ee/e.f         Z<d!ejZ                  e.e/f   d"e,fd#Z=	 d*d$e5e<   d%e/d&e>d'e>d(edz  d"e<fd)Z?y)+    N)cached_property)hashes)Ed25519PublicKeyEd25519PrivateKey)Ed448PublicKeyEd448PrivateKey)X25519PublicKeyX25519PrivateKey)X448PublicKeyX448PrivateKey)EncodingPublicFormatPrivateFormatNoEncryption)HKDF)
PBKDF2HMAC   )CurveKey)KeyParametersAnyKey)CryptographyBinding)InvalidExchangeKeyErrorInvalidKeyCurveError)to_bytesurlsafe_b64decodeurlsafe_b64encode)KeyParameter)Ed25519Ed448X25519X448
OKPDictKeycrvxdF)totalPUBLIC_KEYS_MAPPRIVATE_KEYS_MAP    9   8   OKP_SEED_SIZESc                       e Zd ZdZdZeeeee	e
eefZededefd       Zedededefd       Zedededefd       Zed	edefd
       Zed	edefd       Zededeeef   fd       Zededeeef   fd       Zy)
OKPBindingOKPs   ssh-ed25519r$   returnc                 b    | t         vrt        d|  d      t         |    }|j                         S )NzInvalid curve value: '')r)   r   generate)r$   crv_keys     i/Users/ahmed/devFolder/Ultron/claude-voice/.venv/lib/python3.12/site-packages/joserfc/_rfc8037/okp_key.pygenerate_private_keyzOKPBinding.generate_private_keyG   s9    &&&)?uA'FGG'7'<!!    datac                 6    t         |    }|j                  |      S N)r)   from_private_bytesr$   r9   r5   s      r6   r<   zOKPBinding.from_private_bytesN   s    '7'<))$//r8   c                 6    t         |    }|j                  |      S r;   )r(   from_public_bytesr=   s      r6   r?   zOKPBinding.from_public_bytesS   s    &5c&:((..r8   objc                 Z    t        t        |d               }| j                  |d   |      S )Nr&   r$   )r   r   r<   )clsr@   r&   s      r6   import_private_keyzOKPBinding.import_private_keyX   s,    hs3x01%%c%j!44r8   c                 Z    t        t        |d               }| j                  |d   |      S )Nr%   r$   )r   r   r?   )rB   r@   r%   s      r6   import_public_keyzOKPBinding.import_public_key]   s,    hs3x01$$SZ33r8   keyc                     | j                  |j                               }|j                  t        j                  t
        j                  t                     }t        |      j                  d      |d<   |S )Nutf-8r&   )	export_public_key
public_keyprivate_bytesr   Rawr   r   r   decode)rB   rF   r@   d_bytess       r6   export_private_keyzOKPBinding.export_private_keyb   sW    ##CNN$45##HLL-2C2C\^T$W-44W=C
r8   c                     |j                  t        j                  t        j                        }t	        |      t        |      j                  d      dS )NrH   )r$   r%   )public_bytesr   rL   r   get_key_curver   rM   )rB   rF   x_bytess      r6   rI   zOKPBinding.export_public_keyi   sC    ""8<<1A1AB %"7+227;
 	
r8   N)__name__
__module____qualname__key_typessh_typer   r   r   r   r	   r
   r   r   _cryptography_key_typesstaticmethodLiteralCurvesPrivateOKPKeyr7   bytesr<   PublicOKPKeyr?   classmethodr"   rC   rE   dictstrrO   rI    r8   r6   r/   r/   9   s8   HH	 "- "M " " 0 0U 0} 0 0 /} /E /l / / 5Z 5M 5 5 4J 4< 4 4 ] tCH~   
L 
T#s(^ 
 
r8   r/   c                       e Zd ZdZdZ edddd       edddd       ed	ddd      d
ZeZdd de	fdZ
edefd       Zedefd       Zededz  fd       Zedefd       Ze	 	 d!dej.                  deez  ez  dedz  dej.                  dd f
 fd       Ze	 	 	 	 d"ded    dedz  dedz  dededd fd       Ze	 	 	 	 	 	 d#ded    de	ez  dededz  dededej<                  d   deeej.                  f   dz  dd fd        Z  xZ!S )$OKPKeyz"Key class of the ``OKP`` key type.r0   Curvera   FT)privaterequiredzX CoordinatezOKP Private Keyr#   rF   r1   c                    t        j                  t         j                  t        t        f   |j                  d            }t        | j                  t              r+t        |t              r| j                  j                  |      S t        | j                  t              r+t        |t              r| j                  j                  |      S t               )N	deriveKey)tcastUnionr	   r   
get_op_key
isinstanceprivate_keyr
   exchanger   r   )selfrF   pubkeys      r6   exchange_derive_keyzOKPKey.exchange_derive_key   s     >?P[A\] d&&(89jQ`>a##,,V44((.9jQ^>_##,,V44%''r8   c                 6    t        | j                  t              S r;   rn   	raw_valuePrivateKeyTypesrq   s    r6   
is_privatezOKPKey.is_private   s    $../::r8   c                     t        | j                  t              r| j                  j                         S | j                  S r;   )rn   rv   rw   rJ   rx   s    r6   rJ   zOKPKey.public_key   s-    dnno6>>,,..~~r8   Nc                 P    t        | j                  t              r| j                  S y r;   ru   rx   s    r6   ro   zOKPKey.private_key   s    dnno6>>!r8   c                 ,    t        | j                        S r;   )rR   rv   rx   s    r6   
curve_namezOKPKey.curve_name   s    T^^,,r8   rB   value
parameterspasswordc                     t        |t        t        t        t        t
        t        t        t        f      r | |||      }|S t        t        | /  |||      }|S r;   )rn   r   r   r
   r   r   r   r	   r   superrd   
import_key)rB   r~   r   r   rF   	__class__s        r6   r   zOKPKey.import_key   s`     !  	
 eUJ/C 
 /z8LC
r8   r$   rf   auto_kidc                     || j                   j                  d      }n| j                   j                  |      }t        | ||||      S )a  Generate a ``OKPKey`` with the given "crv" value.

        :param crv: OKPKey curve name
        :param parameters: extra parameter in JWK
        :param private: generate a private key or public key
        :param auto_kid: add ``kid`` automatically
        r   )bindingr7   	_wrap_key)rB   r$   r   rf   r   raw_keys         r6   generate_keyzOKPKey.generate_key   sD     ;kk66yAGkk66s;Ggw*EEr8   secretkdf_name)r   PBKDF2kdf_optionsc           	      ,   |i }|j                  dd      }|t        j                         }|j                  dt	        d| d|              |dk(  rB|j                  dd       t        d|t        |   d	|}	|	j                  t	        |            }
nV|d
k(  rB|j                  dd       t        d|t        |   d	|}|j                  t	        |            }
nt        d| d      | j                  j                  ||
      }t        | ||||      S )am  
        Derives a key from a given input secret using a specified key derivation function
        (KDF) and elliptic curve algorithm.

        To derive a key using **HKDF**, the ``kdf_options`` may contain the ``algorithm``,
        ``salt`` and ``info`` values:

        .. code-block:: python

            from cryptography.hazmat.primitives import hashes
            from joserfc.jwk import OKPKey

            # default kdf_name is HKDF, algorithm is SHA256
            OKPKey.derive_key("secret")
            # equivalent to
            OKPKey.derive_key(
                "secret", "Ed25519",
                kdf_name="HKDF",
                kdf_options={
                    "algorithm": hashes.SHA256(),
                    "salt": b"joserfc:OKP:HKDF:Ed25519",
                    "info": b"",
                }
            )

        To derive a key using **PBKDF2**, the ``kdf_options`` may contain the ``algorithm``,
        ``salt`` and ``iterations`` values:

        .. code-block:: python

            from cryptography.hazmat.primitives import hashes
            from joserfc.jwk import OKPKey

            OKPKey.derive_key("secret", kdf_name="PBKDF2")
            # equivalent to
            OKPKey.derive_key(
                "secret", "Ed25519",
                kdf_name="PBKDF2",
                kdf_options={
                    "algorithm": hashes.SHA256(),
                    "salt": b"joserfc:OKP:PBKDF2:Ed25519",
                    "iterations": 100000,
                }
            )

        :param secret: The input secret used for key derivation
        :param crv: OKPKey curve name
        :param parameters: extra parameter in JWK
        :param private: generate a private key or public key
        :param auto_kid: add ``kid`` automatically
        :param kdf_name: Key derivation function name
        :param kdf_options: Additional options for the KDF
        N	algorithmsaltzjoserfc:OKP::r   infor8   )r   lengthr   
iterationsi zInvalid kdf value: 'r3   rb   )popr   SHA256
setdefaultr   r   r-   deriver   
ValueErrorr   r<   r   )rB   r   r$   r   rf   r   r   r   r   hkdfseedpbkdf2r   s                r6   
derive_keyzOKPKey.derive_key   s3   @ KOOK6	Ivx,xj#0O'PQv""63/ #%c* D
 ;;x/0D!""<8 #%c* F
 ==&!12D3H:Q?@@++00d;gw*EEr8   )NN)r   NTF)r   NTFr   N)"rT   rU   rV   __doc__rW   r   value_registryr/   r   r]   rs   propertyboolry   r   r^   rJ   r\   ro   r[   r}   r_   rj   Anyr   r   r   typer   ra   Literalr`   r   __classcell__)r   s   @r6   rd   rd   r   sX   ,H GUEDI.%N+UD5QN
 G	(x 	(E 	( ;D ; ; L  
 ]T1  
 -M - -  ,0	UU%4 "D( %%	
 
 2  %.+/F(^FT!F "D(F 	F
 F 
F F(  '+/06/3[F(^[F[F [F "D(	[F
 [F [F )),-[F #quu*%,[F 
[F [Fr8   rd   rF   r1   c                     t        | t        t        f      ryt        | t        t        f      ryt        | t
        t        f      ryt        | t        t        f      ryt        d      )Nr   r   r    r!   zInvalid key)
rn   r   r   r   r   r	   r
   r   r   r   )rF   s    r6   rR   rR   ,  sX    #(*;<=	C./:	;	C/+;<	=	C-8	9
]
##r8   rB   r   rf   r   r   c                 x    |r | |||      }n|j                         } | |||      }|r|j                          |S r;   )rJ   
ensure_kid)rB   r   rf   r   r   rF   pub_keys          r6   r   r   8  sC     '7J/$$&'7J/Jr8   r;   )@typingrj   	functoolsr   cryptography.hazmat.primitivesr   1cryptography.hazmat.primitives.asymmetric.ed25519r   r   /cryptography.hazmat.primitives.asymmetric.ed448r   r   0cryptography.hazmat.primitives.asymmetric.x25519r	   r
   .cryptography.hazmat.primitives.asymmetric.x448r   r   ,cryptography.hazmat.primitives.serializationr   r   r   r   'cryptography.hazmat.primitives.kdf.hkdfr   )cryptography.hazmat.primitives.kdf.pbkdf2r   _rfc7517.modelsr   _rfc7517.typesr   r   _rfc7517.pemr   errorsr   r   utilr   r   r   registryr   r   r[   rl   r^   r\   	TypedDictra   r"   r(   r`   r   __annotations__r)   r-   intrw   r/   rd   rR   r   r   rb   r8   r6   <module>r      s    % 1 a [ ^ X  9 @ & 2 . B A A # 		>?ww'-WX)?<Ln\]Q[[
 
  	2c4--.  !	4 $sD//0  	,]C'(  %o7GX6
$ 6
rwFXm\12 wFt	$qww|]:; 	$ 	$" (,	f  	
 $ r8   