
    Dj|C                    8   d dl mZ d dlmZmZmZmZ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mZmZ ddlmZ ddlmZmZ erd d	lmZ  e
            Z eed
          oe                                Z G d de          Z  ede           Z! G d de           Z" G d de           Z# G d de#          Z$ G d de           Z% G d de%          Z& G d de           Z' G d de'          Z( G d de           Z) G d d e           Z* G d! d"e           Z+ G d# d$e+          Z, G d% d&e           Z- G d' d(e           Z. G d) d*e           Z/d<d0Z0d1Z1 G d2 d3e           Z2er2d d4lm3Z3  G d5 d6e           Z4 G d7 d8e           Z5 G d9 d:e           Z6d;S d;S )=    )annotations)TYPE_CHECKINGAnyMappingSequenceTupleTypeVar)default_backend)hashesserialization)eced448ed25519paddingrsa   )arkg)	bytes2int	int2bytes)PublicKeyTypesmldsa_supportedc                      e Zd ZU dZdZded<   dd
Zedd            Ze	dd            Z
e	dd            Ze	d d            Ze	d!d            ZdS )"CoseKeyzxA COSE formatted public key.

    :param _: The COSE key paramters.
    :cvar ALGORITHM: COSE algorithm identifier.
    Nint	ALGORITHMmessagebytes	signaturereturnNonec                     t          d          )zValidates a digital signature over a given message.

        :param message: The message which was signed.
        :param signature: The signature to check.
        z%Signature verification not supported.NotImplementedErrorselfr   r   s      E/home/thesage/.hermes/venv/lib/python3.11/site-packages/fido2/cose.pyverifyzCoseKey.verify9   s     ""IJJJ    clstype[T_CoseKey]
public_keyr   	T_CoseKeyc                     t          d          )zConverts a PublicKey object from Cryptography into a COSE key.

        :param public_key: Either an EC or RSA public key.
        :return: A CoseKey.
        z)Creation from cryptography not supported.r"   r)   r+   s     r&   from_cryptography_keyzCoseKey.from_cryptography_keyA   s     ""MNNNr(   algtype[CoseKey]c                B     d fd t                     pt          S )Get a subclass of CoseKey corresponding to an algorithm identifier.

        :param alg: The COSE identifier of the algorithm.
        :return: A CoseKey.
        base_clsr1   r   type[CoseKey] | Nonec                v    |                                  D ]"}|j        k    r|c S  |          }|r|c S #d S N)__subclasses__r   )r4   r)   	subresultr0   find_subclasss      r&   r:   z&CoseKey.for_alg.<locals>.find_subclassT   sa    ..00 % %=C''JJJ)M#..	 %$$$$%4r(   r4   r1   r   r5   r   UnsupportedKey)r0   r:   s   `@r&   for_algzCoseKey.for_algL   >    	 	 	 	 	 	 	 }W%%77r(   namestrc                B     d fd t                     pt          S )r3   r4   r1   r   r5   c                v    |                                  D ]"}|j        k    r|c S  |          }|r|c S #d S r7   )r8   __name__)r4   r)   r9   r:   r@   s      r&   r:   z'CoseKey.for_name.<locals>.find_subclassg   sa    ..00 % %<4''JJJ)M#..	 %$$$$%4r(   r;   r<   )r@   r:   s   `@r&   for_namezCoseKey.for_name_   r?   r(   coseMapping[int, Any]c                    |                      d          }|st          d          t                              |          |           S )zCreate a CoseKey from a dict   z%COSE alg identifier must be provided.)get
ValueErrorr   r>   )rF   r0   s     r&   parsezCoseKey.parser   sE     hhqkk 	FDEEEs##D)))r(   Sequence[int]c                     t           t          t          t          t          t
          t          g} t          r'|                     t          t          t          g           d | D             S )z1Get a list of all supported algorithm identifiersc                    g | ]	}|j         
S  r   ).0r)   s     r&   
<listcomp>z0CoseKey.supported_algorithms.<locals>.<listcomp>   s    ...#...r(   )ES256EdDSAES384ES512PS256RS256ES256K_mldsaextendMLDSA44MLDSA65MLDSA87)algss    r&   supported_algorithmszCoseKey.supported_algorithmsz   sW     %
  	5KK'73444......r(   )r   r   r   r   r   r    )r)   r*   r+   r   r   r,   )r0   r   r   r1   )r@   rA   r   r1   )rF   rG   r   r   )r   rM   )rD   
__module____qualname____doc__r   __annotations__r'   classmethodr/   staticmethodr>   rE   rL   ra   rP   r(   r&   r   r   0   s           IK K K K O O O [O 8 8 8 \8$ 8 8 8 \8$ * * * \* / / / \/ / /r(   r   r,   )boundc                      e Zd ZdZdS )r=   z)A COSE key with an unsupported algorithm.N)rD   rb   rc   rd   rP   r(   r&   r=   r=      s        3333r(   r=   c                  b    e Zd ZdZ ej                    Zd Zed             Z	ed             Z
dS )rT   ic                ^   | d         dk    rt          d          t          j        t          | d                   t          | d                   t          j                                                  t                                        ||t          j        | j	                             d S )Nr   Unsupported elliptic curve)
rK   r   EllipticCurvePublicNumbersr   	SECP256R1r+   _backendr'   ECDSA	_HASH_ALGr$   s      r&   r'   zES256.verify       8q==9:::
%d2h48!4!4blnn	
 	

*X

vvi"(4>:R:RSSSSSr(   c           
         t          |t          j                  sJ |                                } | d| j        dt          |j        d          t          |j        d          d          S )N   r       r   rI   rl   rn   ro   
isinstancer   EllipticCurvePublicKeypublic_numbersr   r   xyr)   r+   pns      r&   r/   zES256.from_cryptography_key   s    *b&?@@@@@&&((s=bdB''bdB'' 
 
 	
r(   c           	     N     | d| j         d|dd         |dd         d          S )zCreates an ES256 key from a CTAP1 formatted public key byte string.

        :param data: A 65 byte SECP256R1 public key.
        :return: A ES256 key.
        rw   r   !   A   ry   rQ   )r)   datas     r&   
from_ctap1zES256.from_ctap1   s4     sqS]tAbDztBrE{SSTTTr(   N)rD   rb   rc   r   r   SHA256rt   r'   rf   r/   r   rP   r(   r&   rT   rT      ss        IIT T T 
 
 [
 U U [U U Ur(   rT   c                      e Zd ZdZdS )ESP256iNrD   rb   rc   r   rP   r(   r&   r   r      s        IIIr(   r   c                  L    e Zd ZdZ ej                    Zd Zed             Z	dS )rV   ic                ^   | d         dk    rt          d          t          j        t          | d                   t          | d                   t          j                                                  t                                        ||t          j        | j	                             d S )Nrl   rw   rm   rn   ro   )
rK   r   rp   r   	SECP384R1r+   rr   r'   rs   rt   r$   s      r&   r'   zES384.verify   ru   r(   c           
         t          |t          j                  sJ |                                } | d| j        dt          |j        d          t          |j        d          d          S )Nrw   0   ry   rz   r   s      r&   r/   zES384.from_cryptography_key   r   r(   N)
rD   rb   rc   r   r   SHA384rt   r'   rf   r/   rP   r(   r&   rV   rV      S        IIT T T 
 
 [
 
 
r(   rV   c                      e Zd ZdZdS )ESP384iNr   rP   r(   r&   r   r              IIIr(   r   c                  L    e Zd ZdZ ej                    Zd Zed             Z	dS )rW   ic                ^   | d         dk    rt          d          t          j        t          | d                   t          | d                   t          j                                                  t                                        ||t          j        | j	                             d S )Nrl   rI   rm   rn   ro   )
rK   r   rp   r   	SECP521R1r+   rr   r'   rs   rt   r$   s      r&   r'   zES512.verify   ru   r(   c           
         t          |t          j                  sJ |                                } | d| j        dt          |j        d          t          |j        d          d          S )Nrw   rI   B   ry   rz   r   s      r&   r/   zES512.from_cryptography_key   r   r(   N)
rD   rb   rc   r   r   SHA512rt   r'   rf   r/   rP   r(   r&   rW   rW      r   r(   rW   c                      e Zd ZdZdS )ESP512iNr   rP   r(   r&   r   r      r   r(   r   c                  L    e Zd ZdZ ej                    Zd Zed             Z	dS )rY   ic                   t          j        t          | d                   t          | d                                                 t                                        ||t          j                    | j                   d S Nrn   rl   	r   RSAPublicNumbersr   r+   rr   r'   r   PKCS1v15rt   r$   s      r&   r'   zRS256.verify   d    YtBx00)DH2E2EFFQQ	
 	

&GW%5%7%7
H
H
H
H
Hr(   c                    t          |t          j                  sJ |                                } | d| j        t          |j                  t          |j                  d          S NrI   r   rI   rl   rn   r{   r   RSAPublicKeyr}   r   r   ner   s      r&   r/   zRS256.from_cryptography_key  Z    *c&677777&&((sqS]	"$Yrt__UUVVVr(   N
rD   rb   rc   r   r   r   rt   r'   rf   r/   rP   r(   r&   rY   rY      sX        III I I
 W W [W W Wr(   rY   c                  L    e Zd ZdZ ej                    Zd Zed             Z	dS )rX   ic           	     V   t          j        t          | d                   t          | d                                                 t                                        ||t          j        t          j        | j	                  t          j        j
                  | j	                   d S )Nrn   rl   )mgfsalt_length)r   r   r   r+   rr   r'   r   PSSMGF1rt   
MAX_LENGTHr$   s      r&   r'   zPS256.verify  s    YtBx00)DH2E2EFFQQ	
 	

&KL00gk>T   N
 
 
 
 
r(   c                    t          |t          j                  sJ |                                } | d| j        t          |j                  t          |j                  d          S r   r   r   s      r&   r/   zPS256.from_cryptography_key  r   r(   Nr   rP   r(   r&   rX   rX   	  sU        II

 

 

 W W [W W Wr(   rX   c                  .    e Zd ZdZd Zed             ZdS )rU   ic                    | d         dk    rt          d          t          j                            | d                                       ||           d S )Nrl      rm   rn   )rK   r   Ed25519PublicKeyfrom_public_bytesr'   r$   s      r&   r'   zEdDSA.verify#  sO    8q==9::: 2248<<CCIwWWWWWr(   c           	         t          |t          j                  sJ  | d| j        d|                    t
          j        j        t
          j        j                  d          S )Nr   r   r   )	r{   r   r   r   public_bytesr   EncodingRawPublicFormatr.   s     r&   r/   zEdDSA.from_cryptography_key(  sh    *g&>?????s=++!*.0J0N 	 	
 	
 		
r(   NrD   rb   rc   r   r'   rf   r/   rP   r(   r&   rU   rU      sF        IX X X
 
 
 [
 
 
r(   rU   c                      e Zd ZdZdS )Ed25519iNr   rP   r(   r&   r   r   7  r   r(   r   c                  .    e Zd ZdZd Zed             ZdS )Ed448ic                    | d         dk    rt          d          t          j                            | d                                       ||           d S )Nrl      rm   rn   )rK   r   Ed448PublicKeyr   r'   r$   s      r&   r'   zEd448.verify@  sO    8q==9:::..tBx88??	7SSSSSr(   c           	         t          |t          j                  sJ  | d| j        d|                    t
          j        j        t
          j        j                  d          S )Nr   r   r   )	r{   r   r   r   r   r   r   r   r   r.   s     r&   r/   zEd448.from_cryptography_keyE  sh    *e&:;;;;;s=++!*.0J0N 	 	
 	
 		
r(   Nr   rP   r(   r&   r   r   <  sF        IT T T
 
 
 [
 
 
r(   r   c                  L    e Zd ZdZ ej                    Zd Zed             Z	dS )RS1i c                   t          j        t          | d                   t          | d                                                 t                                        ||t          j                    | j                   d S r   r   r$   s      r&   r'   z
RS1.verifyX  r   r(   c                    t          |t          j                  sJ |                                } | d| j        t          |j                  t          |j                  d          S r   r   r   s      r&   r/   zRS1.from_cryptography_key]  r   r(   N)
rD   rb   rc   r   r   SHA1rt   r'   rf   r/   rP   r(   r&   r   r   T  sX        III I I
 W W [W W Wr(   r   c                  L    e Zd ZdZ ej                    Zd Zed             Z	dS )rZ   ic                ^   | d         dk    rt          d          t          j        t          | d                   t          | d                   t          j                                                  t                                        ||t          j        | j	                             d S )Nrl      rm   rn   ro   )
rK   r   rp   r   	SECP256K1r+   rr   r'   rs   rt   r$   s      r&   r'   zES256K.verifyh  ru   r(   c           
         t          |t          j                  sJ |                                } | d| j        dt          |j        d          t          |j        d          d          S )Nrw   r   rx   ry   rz   r   s      r&   r/   zES256K.from_cryptography_keyo  r   r(   Nr   rP   r(   r&   rZ   rZ   d  r   r(   rZ   rF   curveec.EllipticCurver   ec.EllipticCurvePublicKeyc                    t          j        t          | d                   t          | d                   |                                          S )Nrn   ro   )r   rp   r   r+   )rF   r   s     r&   	_cose2keyr   ~  s?    ($r(YtBx00% jllr(   ic                     e Zd ZdZdZ ej                    Z ej	         ej
        e ej                    d           ej        e ej                    d                    Z	edd	            Zedd
            ZddZdS )ARKG_P256_PLACEHOLDERa  
    https://www.ietf.org/archive/id/draft-bradleylundberg-cfrg-arkg-10.html#ARKG-P256

    The identifier ARKG-P256 represents the following ARKG instance:

        BL: Elliptic curve addition as described in Section 3.1 with the parameters:

            crv: The NIST curve secp256r1 [SEC2].

            hash-to-crv-suite: P256_XMD:SHA-256_SSWU_RO_ [RFC9380].

            DST_ext: 'ARKG-P256'.

        KEM: ECDH as described in Section 3.3 with the parameters:

            crv: The NIST curve secp256r1 [SEC2].

            Hash: SHA-256 [FIPS 180-4].

            hash-to-crv-suite: P256_XMD:SHA-256_SSWU_RO_ [RFC9380].

            DST_ext: 'ARKG-P256'.
    i\s	   ARKG-P256)crvHashDST_exts   ARKG-ECDH.ARKG-P256)blkemr   r   c                B    t                               | d                   S )Nrl   r   rL   r%   s    r&   pk_blzARKG_P256_PLACEHOLDER.pk_bl      }}T"X&&&r(   c                B    t                               | d                   S )Nrn   r   r   s    r&   pk_kemzARKG_P256_PLACEHOLDER.pk_kem  r   r(   ikmr   ctxTuple[CoseKey, Mapping]c           	        | j                             t          | j        | j                  t          | j        | j                  ||          \  }}|                    t          j        j	        t          j
        j                  }t          |          dz
  dz  }t          d| d         d|d|dz            |d|z   d          d          }t          ||d}||fS )Nr   rw   ro   ry   )rI   rl   rn   )_ARKGderive_public_keyr   r   _CRVr   r   r   r   X962r   UncompressedPointlenr   ESP256_SPLIT_ARKG_PLACEHOLDER)	r%   r   r   pkkh	point_enclnpk_coseargss	            r&   r   z'ARKG_P256_PLACEHOLDER.derive_public_key  s    --dj$),,dk49--	
 
B OO"')C)U
 
	 )nnq Q&8a"q&j)a"fhh' 
 
 -
 
 }r(   N)r   r   )r   r   r   r   r   r   )rD   rb   rc   rd   r   r   rq   r   r   r   _BLr   r   _KEMpropertyr   r   r   rP   r(   r&   r   r     s         0 I2<>>DDJ48=6=??LIIIDI$]V]__>TUUU  E
 ' ' ' X' ' ' ' X'     r(   r   )mldsac                  .    e Zd ZdZd Zed             ZdS )r]   ic                    | d         dk    rt          d          t          j                            | d                   }|                    ||           d S Nr   r   zInvalid key typerl   )rK   r   MLDSA44PublicKeyr   r'   r%   r   r   r   s       r&   r'   zMLDSA44.verify  R    Aw!|| !3444'99$r(CCBIIi)))))r(   c                    t          |t          j                  sJ  | d| j        |                                d          S Nr   )r   rI   rl   )r{   r   r   r   public_bytes_rawr.   s     r&   r/   zMLDSA44.from_cryptography_key  P    j%*@AAAAA3}"3355   r(   Nr   rP   r(   r&   r]   r]     C        		* 	* 	* 
	 	 
	 	 	r(   r]   c                  .    e Zd ZdZd Zed             ZdS )r^   ic                    | d         dk    rt          d          t          j                            | d                   }|                    ||           d S r   )rK   r   MLDSA65PublicKeyr   r'   r   s       r&   r'   zMLDSA65.verify  r   r(   c                    t          |t          j                  sJ  | d| j        |                                d          S r  )r{   r   r  r   r  r.   s     r&   r/   zMLDSA65.from_cryptography_key  r  r(   Nr   rP   r(   r&   r^   r^     r  r(   r^   c                  .    e Zd ZdZd Zed             ZdS )r_   ic                    | d         dk    rt          d          t          j                            | d                   }|                    ||           d S r   )rK   r   MLDSA87PublicKeyr   r'   r   s       r&   r'   zMLDSA87.verify  r   r(   c                    t          |t          j                  sJ  | d| j        |                                d          S r  )r{   r   r  r   r  r.   s     r&   r/   zMLDSA87.from_cryptography_key  r  r(   Nr   rP   r(   r&   r_   r_     r  r(   r_   N)rF   r   r   r   r   r   )7
__future__r   typingr   r   r   r   r   r	   cryptography.hazmat.backendsr
   cryptography.hazmat.primitivesr   r   )cryptography.hazmat.primitives.asymmetricr   r   r   r   r    r   utilsr   r   /cryptography.hazmat.primitives.asymmetric.typesr   rr   hasattrr   r[   dictr   r,   r=   rT   r   rV   r   rW   r   rY   rX   rU   r   r   r   rZ   r   r   r   r   r]   r^   r_   rP   r(   r&   <module>r     s  8 # " " " " " H H H H H H H H H H H H H H H H 8 8 8 8 8 8 @ @ @ @ @ @ @ @ V V V V V V V V V V V V V V       ' ' ' ' ' ' ' ' ONNNNNN ?	,	-	-	L(2J2J2L2LY/ Y/ Y/ Y/ Y/d Y/ Y/ Y/x GKw///	4 4 4 4 4W 4 4 4 U  U  U  U  UG  U  U  UF    U   

 
 
 
 
G 
 
 
4    U   

 
 
 
 
G 
 
 
4    U   
W W W W WG W W W W W W W WG W W W.
 
 
 
 
G 
 
 
.    e   

 
 
 
 
G 
 
 
0W W W W W' W W W 
 
 
 
 
W 
 
 
4    !' F F F F FG F F FT 
 =??????    '   (    '   (    '     W= =r(   