o
    sh9(                     @  s   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mZmZ d dlmZmZmZmZ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!dS )    )annotations   )	bytes2int	int2bytes)default_backend)hashesserialization)ecrsapaddinged25519types)SequenceTypeMappingAnyTypeVarc                   @  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    E/var/www/html/env_mimamsha/lib/python3.10/site-packages/fido2/cose.pyverify.   s   zCoseKey.verifyclsType[T_CoseKey]
public_keytypes.PublicKeyTypes	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_key6   s   	zCoseKey.from_cryptography_keyalgType[CoseKey]c                 C  $   t  D ]}|j| kr|  S qtS zGet a subclass of CoseKey corresponding to an algorithm identifier.

        :param alg: The COSE identifier of the algorithm.
        :return: A CoseKey.
        )r   __subclasses__r   UnsupportedKey)r*   r#   r    r    r!   for_algA   
   
zCoseKey.for_algnamestrc                 C  r,   r-   )r   r.   __name__r/   )r2   r#   r    r    r!   for_nameM   r1   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   r0   )r6   r*   r    r    r!   parseY   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>m   s    z0CoseKey.supported_algorithms.<locals>.<listcomp>)ES256EdDSAES384ES512PS256RS256ES256K)algsr    r    r!   supported_algorithmsa   s   	zCoseKey.supported_algorithms)r   r   r   r   r   r   )r#   r$   r%   r&   r   r'   )r*   r   r   r+   )r2   r3   r   r+   )r6   r7   r   r   )r   r<   )r4   
__module____qualname____doc__r   __annotations__r"   classmethodr)   staticmethodr0   r5   r;   rH   r    r    r    r!   r   %   s   
 

r   r'   )boundc                   @  s   e Zd ZdZdS )r/   z)A COSE key with an unsupported algorithm.N)r4   rI   rJ   rK   r    r    r    r!   r/   s   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 )	r@   ic                 C  T   | d dkr
t dtt| d t| d t t ||t| j	 d S )Nr   Unsupported elliptic curve)
r:   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   r8   rQ   rS   rT   
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.
        r[   r   !   A   r]   r=   )r#   datar    r    r!   
from_ctap1   s   &zES256.from_ctap1N)r4   rI   rJ   r   r   SHA256rX   r"   rM   r)   rj   r    r    r    r!   r@   w   s    	
r@   c                   @  ,   e Zd ZdZe Zdd Zedd Z	dS )rB   ic                 C  rP   )NrQ   r[   rR   rS   rT   )
r:   r	   rU   r   	SECP384R1r%   r   r"   rW   rX   r   r    r    r!   r"      rY   zES384.verifyc                 C  s>   t |tjsJ | }| d| jdt|jdt|jddS )Nr[   0   r]   r^   rd   r    r    r!   r)      rf   zES384.from_cryptography_keyN)
r4   rI   rJ   r   r   SHA384rX   r"   rM   r)   r    r    r    r!   rB          	rB   c                   @  rl   )rC   ic                 C  rP   )NrQ   r8   rR   rS   rT   )
r:   r	   rU   r   	SECP521R1r%   r   r"   rW   rX   r   r    r    r!   r"      rY   zES512.verifyc                 C  rZ   )Nr[   r8   B   r]   r^   rd   r    r    r!   r)      rf   zES512.from_cryptography_keyN)
r4   rI   rJ   r   r   SHA512rX   r"   rM   r)   r    r    r    r!   rC      rp   rC   c                   @  rl   )rE   ic                 C  :   t t| d t| d t ||t | j d S NrS   rQ   	r
   RSAPublicNumbersr   r%   r   r"   r   PKCS1v15rX   r   r    r    r!   r"         zRS256.verifyc                 C  8   t |tjsJ | }| d| jt|jt|jdS Nr8   r   r8   rQ   rS   r_   r
   RSAPublicKeyra   r   r   nerd   r    r    r!   r)          zRS256.from_cryptography_keyN
r4   rI   rJ   r   r   rk   rX   r"   rM   r)   r    r    r    r!   rE          rE   c                   @  rl   )rD   ic                 C  sL   t t| d t| d t ||tjt| j	tjj
d| j	 d S )NrS   rQ   )mgfsalt_length)r
   rw   r   r%   r   r"   r   PSSMGF1rX   
MAX_LENGTHr   r    r    r!   r"      s   zPS256.verifyc                 C  rz   r{   r}   rd   r    r    r!   r)      r   zPS256.from_cryptography_keyNr   r    r    r    r!   rD      s    rD   c                   @  s$   e Zd ZdZdd Zedd ZdS )rA   ic                 C  s0   | d dkr
t dtj| d || d S )NrQ      rR   rS   )r:   r   Ed25519PublicKeyfrom_public_bytesr"   r   r    r    r!   r"      s   zEdDSA.verifyc                 C  s4   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(   r    r    r!   r)     s   zEdDSA.from_cryptography_keyN)r4   rI   rJ   r   r"   rM   r)   r    r    r    r!   rA      s
    rA   c                   @  rl   )RS1i c                 C  rt   ru   rv   r   r    r    r!   r"     ry   z
RS1.verifyc                 C  rz   r{   r}   rd   r    r    r!   r)     r   zRS1.from_cryptography_keyN)
r4   rI   rJ   r   r   SHA1rX   r"   rM   r)   r    r    r    r!   r     r   r   c                   @  rl   )rF   ic                 C  rP   )NrQ      rR   rS   rT   )
r:   r	   rU   r   	SECP256K1r%   r   r"   rW   rX   r   r    r    r!   r"   &  rY   zES256K.verifyc                 C  rZ   )Nr[   r   r\   r]   r^   rd   r    r    r!   r)   /  rf   zES256K.from_cryptography_keyNr   r    r    r    r!   rF   "  rp   rF   N)"
__future__r   utilsr   r   cryptography.hazmat.backendsr   cryptography.hazmat.primitivesr   r   )cryptography.hazmat.primitives.asymmetricr	   r
   r   r   r   typingr   r   r   r   r   dictr   r'   r/   r@   rB   rC   rE   rD   rA   r   rF   r    r    r    r!   <module>   s"   K%