o
    l>jE;                     @  s  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rHd d	lmZ G d
d deZededZG dd deZG dd deZG dd deZ G dd deZ!G dd de!Z"G dd deZ#G dd de#Z$G dd deZ%G dd deZ&G d d! d!eZ'G d"d# d#e'Z(G d$d% d%eZ)G d&d' d'eZ*G d(d) d)eZ+d5d/d0Z,d1Z-G d2d3 d3eZ.d4S )6    )annotations)TYPE_CHECKINGAnyMappingSequenceTupleTypeVar)default_backend)hashesserialization)eced448ed25519paddingrsa   )arkg)	bytes2int	int2bytes)PublicKeyTypesc                   @  sn   e Zd ZU dZdZded< d"d
dZed#ddZe	d$ddZ
e	d%ddZe	d&ddZe	d'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                 C     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    r#   ?/home/thesage/.local/lib/python3.10/site-packages/fido2/cose.pyverify5   s   zCoseKey.verifyclstype[T_CoseKey]
public_keyr   	T_CoseKeyc                 C  r   )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(   r#   r#   r$   from_cryptography_key=   s   	zCoseKey.from_cryptography_keyalgtype[CoseKey]c                   s   d fd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_clsr-   r   type[CoseKey] | Nonec                   s8   |   D ]}|j kr|  S |}|r|  S qd S N)__subclasses__r   r/   r&   	subresultr,   find_subclassr#   r$   r6   P      
z&CoseKey.for_alg.<locals>.find_subclassNr/   r-   r   r0   r   UnsupportedKey)r,   r#   r5   r$   for_algH      	zCoseKey.for_algnamestrc                   s   d fdd  t ptS )	r.   r/   r-   r   r0   c                   s8   |   D ]}|jkr|  S  |}|r|  S qd S r1   )r2   __name__r3   r6   r=   r#   r$   r6   c   r7   z'CoseKey.for_name.<locals>.find_subclassNr8   r9   )r=   r#   r@   r$   for_name[   r<   zCoseKey.for_namecoseMapping[int, Any]c                 C  s$   |  d}|stdt|| S )zCreate a CoseKey from a dict   z%COSE alg identifier must be provided.)get
ValueErrorr   r;   )rB   r,   r#   r#   r$   parsen   s   
zCoseKey.parseSequence[int]c                  C  s    t ttttttg} dd | D S )z1Get a list of all supported algorithm identifiersc                 S  s   g | ]}|j qS r#   r   ).0r&   r#   r#   r$   
<listcomp>   s    z0CoseKey.supported_algorithms.<locals>.<listcomp>)ES256EdDSAES384ES512PS256RS256ES256K)algsr#   r#   r$   supported_algorithmsv   s   	zCoseKey.supported_algorithms)r   r   r   r   r   r   )r&   r'   r(   r   r   r)   )r,   r   r   r-   )r=   r>   r   r-   )rB   rC   r   r   )r   rH   )r?   
__module____qualname____doc__r   __annotations__r%   classmethodr+   staticmethodr;   rA   rG   rT   r#   r#   r#   r$   r   ,   s   
 

r   r)   )boundc                   @     e Zd ZdZdS )r:   z)A COSE key with an unsupported algorithm.N)r?   rU   rV   rW   r#   r#   r#   r$   r:      s    r:   c                   @  s8   e Zd ZdZe Zdd Zedd Z	edd Z
dS )	rL   ic                 C  T   | d dkr
t dtt| d t| d t t ||t| j	 d S )Nr   Unsupported elliptic curve)
rF   r   EllipticCurvePublicNumbersr   	SECP256R1r(   r	   r%   ECDSA	_HASH_ALGr!   r#   r#   r$   r%         
zES256.verifyc                 C  >   t |tjsJ | }| d| jdt|jdt|jddS )N   r       r   rD   r^   r`   ra   
isinstancer   EllipticCurvePublicKeypublic_numbersr   r   xyr&   r(   pnr#   r#   r$   r+         

zES256.from_cryptography_keyc                 C  s&   | 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.
        rh   r   !   A   rj   rI   )r&   datar#   r#   r$   
from_ctap1   s   &zES256.from_ctap1N)r?   rU   rV   r   r
   SHA256re   r%   rY   r+   rw   r#   r#   r#   r$   rL      s    	
rL   c                   @  r\   )ESP256iNr?   rU   rV   r   r#   r#   r#   r$   ry          ry   c                   @  ,   e Zd ZdZe Zdd Zedd Z	dS )rN   ic                 C  r]   )Nr^   rh   r_   r`   ra   )
rF   r   rb   r   	SECP384R1r(   r	   r%   rd   re   r!   r#   r#   r$   r%      rf   zES384.verifyc                 C  s>   t |tjsJ | }| d| jdt|jdt|jddS )Nrh   0   rj   rk   rq   r#   r#   r$   r+      rs   zES384.from_cryptography_keyN)
r?   rU   rV   r   r
   SHA384re   r%   rY   r+   r#   r#   r#   r$   rN          	rN   c                   @  r\   )ESP384iNrz   r#   r#   r#   r$   r      r{   r   c                   @  r|   )rO   ic                 C  r]   )Nr^   rD   r_   r`   ra   )
rF   r   rb   r   	SECP521R1r(   r	   r%   rd   re   r!   r#   r#   r$   r%      rf   zES512.verifyc                 C  rg   )Nrh   rD   B   rj   rk   rq   r#   r#   r$   r+      rs   zES512.from_cryptography_keyN)
r?   rU   rV   r   r
   SHA512re   r%   rY   r+   r#   r#   r#   r$   rO      r   rO   c                   @  r\   )ESP512iNrz   r#   r#   r#   r$   r      r{   r   c                   @  r|   )rQ   ic                 C  :   t t| d t| d t ||t | j d S Nr`   r^   	r   RSAPublicNumbersr   r(   r	   r%   r   PKCS1v15re   r!   r#   r#   r$   r%         zRS256.verifyc                 C  8   t |tjsJ | }| d| jt|jt|jdS NrD   r   rD   r^   r`   rl   r   RSAPublicKeyrn   r   r   nerq   r#   r#   r$   r+         zRS256.from_cryptography_keyN
r?   rU   rV   r   r
   rx   re   r%   rY   r+   r#   r#   r#   r$   rQ          rQ   c                   @  r|   )rP   ic                 C  sL   t t| d t| d t ||tjt| j	tjj
d| j	 d S )Nr`   r^   )mgfsalt_length)r   r   r   r(   r	   r%   r   PSSMGF1re   
MAX_LENGTHr!   r#   r#   r$   r%     s   zPS256.verifyc                 C  r   r   r   rq   r#   r#   r$   r+     r   zPS256.from_cryptography_keyNr   r#   r#   r#   r$   rP     s    rP   c                   @  $   e Zd ZdZdd Zedd ZdS )rM   ic                 C  0   | d dkr
t dtj| d || d S )Nr^      r_   r`   )rF   r   Ed25519PublicKeyfrom_public_bytesr%   r!   r#   r#   r$   r%   "     zEdDSA.verifyc                 C  4   t |tjsJ | d| jd|tjjtjjdS )Nr   r   r   )	rl   r   r   r   public_bytesr   EncodingRawPublicFormatr*   r#   r#   r$   r+   '     zEdDSA.from_cryptography_keyNr?   rU   rV   r   r%   rY   r+   r#   r#   r#   r$   rM     s
    rM   c                   @  r\   )Ed25519iNrz   r#   r#   r#   r$   r   6  r{   r   c                   @  r   )Ed448ic                 C  r   )Nr^      r_   r`   )rF   r   Ed448PublicKeyr   r%   r!   r#   r#   r$   r%   ?  r   zEd448.verifyc                 C  r   )Nr   r   r   )	rl   r   r   r   r   r   r   r   r   r*   r#   r#   r$   r+   D  r   zEd448.from_cryptography_keyNr   r#   r#   r#   r$   r   ;  s
    r   c                   @  r|   )RS1i c                 C  r   r   r   r!   r#   r#   r$   r%   W  r   z
RS1.verifyc                 C  r   r   r   rq   r#   r#   r$   r+   \  r   zRS1.from_cryptography_keyN)
r?   rU   rV   r   r
   SHA1re   r%   rY   r+   r#   r#   r#   r$   r   S  r   r   c                   @  r|   )rR   ic                 C  r]   )Nr^      r_   r`   ra   )
rF   r   rb   r   	SECP256K1r(   r	   r%   rd   re   r!   r#   r#   r$   r%   g  rf   zES256K.verifyc                 C  rg   )Nrh   r   ri   rj   rk   rq   r#   r#   r$   r+   p  rs   zES256K.from_cryptography_keyNr   r#   r#   r#   r$   rR   c  r   rR   rB   curveec.EllipticCurver   ec.EllipticCurvePublicKeyc                 C  s"   t t| d t| d | S )Nr`   ra   )r   rb   r   r(   )rB   r   r#   r#   r$   	_cose2key  s
   r   ic                   @  sp   e Zd ZdZdZe Zej	ej
ee ddejee dddZ	edd	d
ZedddZd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                 C     t | d S )Nr^   r   rG   r"   r#   r#   r$   pk_bl     zARKG_P256_PLACEHOLDER.pk_blc                 C  r   )Nr`   r   r   r#   r#   r$   pk_kem  r   zARKG_P256_PLACEHOLDER.pk_kemikmr   ctxTuple[CoseKey, Mapping]c           	      C  s   | j t| j| jt| j| j||\}}|tjj	tj
j}t|d d }td| d d|d|d  |d| d  d}t||d}||fS )Nr   rh   ra   rj   )rD   r^   r`   )_ARKGderive_public_keyr   r   _CRVr   r   r   r   X962r   UncompressedPointlenry   ESP256_SPLIT_ARKG_PLACEHOLDER)	r"   r   r   pkkh	point_enclnpk_coseargsr#   r#   r$   r     s.   z'ARKG_P256_PLACEHOLDER.derive_public_keyN)r   r   )r   r   r   r   r   r   )r?   rU   rV   rW   r   r   rc   r   r   r   _BLr
   rx   _KEMpropertyr   r   r   r#   r#   r#   r$   r     s    r   N)rB   r   r   r   r   r   )/
__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   dictr   r)   r:   rL   ry   rN   r   rO   r   rQ   rP   rM   r   r   r   rR   r   r   r   r#   r#   r#   r$   <module>   s8    Y%
