o
    Þý°jÐ0  ã                   @   sr   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
mZmZ dd„ Zdd„ ZG d	d
„ d
eƒZddd„ZdS )é    )ÚInteger)ÚSHA512ÚSHAKE256)ÚbchrÚis_bytes)ÚEccKeyÚ	constructÚ_import_ed25519_public_keyÚ_import_ed448_public_keyc                 C   sZ   t | ƒdkrt| ƒ\}}d}nt | ƒdkrt| ƒ\}}d}ntdt | ƒ ƒ‚t|||d�S )a±  Create a new Ed25519 or Ed448 public key object,
    starting from the key encoded as raw ``bytes``,
    in the format described in RFC8032.

    Args:
      encoded (bytes):
        The EdDSA public key to import.
        It must be 32 bytes for Ed25519, and 57 bytes for Ed448.

    Returns:
      :class:`Cryptodome.PublicKey.EccKey` : a new ECC key object.

    Raises:
      ValueError: when the given key cannot be parsed.
    é    ÚEd25519é9   ÚEd448zNot an EdDSA key (%d bytes))ÚcurveÚpoint_xÚpoint_y)Úlenr	   r
   Ú
ValueErrorr   )ÚencodedÚxÚyÚ
curve_name© r   ú�/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/Cryptodome/Signature/eddsa.pyÚimport_public_key)   s   r   c                 C   s8   t | ƒdkr	d}nt | ƒdkrd}ntdƒ‚t| |d�S )a³  Create a new Ed25519 or Ed448 private key object,
    starting from the key encoded as raw ``bytes``,
    in the format described in RFC8032.

    Args:
      encoded (bytes):
        The EdDSA private key to import.
        It must be 32 bytes for Ed25519, and 57 bytes for Ed448.

    Returns:
      :class:`Cryptodome.PublicKey.EccKey` : a new ECC key object.

    Raises:
      ValueError: when the given key cannot be parsed.
    r   Úed25519r   Úed448z8Incorrect length. Only EdDSA private keys are supported.)Úseedr   )r   r   r   )r   r   r   r   r   Úimport_private_keyE   s   r   c                   @   sP   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ ZdS )ÚEdDSASigSchemezpAn EdDSA signature object.
    Do not instantiate directly.
    Use :func:`Cryptodome.Signature.eddsa.new`.
    c                 C   s$   || _ || _| ¡ | _|jj| _dS )z‰Create a new EdDSA object.

        Do not instantiate this object directly,
        use `Cryptodome.Signature.DSS.new` instead.
        N)Ú_keyÚ_contextÚ_export_eddsa_publicÚ_AÚ_curveÚorderÚ_order)ÚselfÚkeyÚcontextr   r   r   Ú__init__i   s   
zEdDSASigScheme.__init__c                 C   s
   | j  ¡ S )zRReturn ``True`` if this signature object can be used
        for signing messages.)r    Úhas_private)r'   r   r   r   Úcan_signu   s   
zEdDSASigScheme.can_signc                 C   sŒ   | j  ¡ s	tdƒ‚| j jdkr#t|tjƒ}|st|ƒstdƒ‚| j}n| j jdkr=t|t	j
ƒ}|s9t|ƒs9tdƒ‚| j}ntdƒ‚|||ƒS )aR  Compute the EdDSA signature of a message.

        Args:
          msg_or_hash (bytes or a hash object):
            The message to sign (``bytes``, in case of *PureEdDSA*) or
            the hash that was carried out over the message (hash object, for *HashEdDSA*).

            The hash object must be :class:`Cryptodome.Hash.SHA512` for Ed25519,
            and :class:`Cryptodome.Hash.SHAKE256` object for Ed448.

        :return: The signature as ``bytes``. It is always 64 bytes for Ed25519, and 114 bytes for Ed448.
        :raise TypeError: if the EdDSA key has no private half
        zPrivate key is needed to signr   ú-'msg_or_hash' must be bytes of a SHA-512 hashr   ú.'msg_or_hash' must be bytes of a SHAKE256 hashúIncorrect curve for EdDSA)r    r+   Ú	TypeErrorr   Ú
isinstancer   Ú
SHA512Hashr   Ú_sign_ed25519r   ÚSHAKE256_XOFÚ_sign_ed448r   )r'   Úmsg_or_hashÚphÚeddsa_sign_methodr   r   r   Úsign{   s   

zEdDSASigScheme.signc                 C   sà   | j s|rt|ƒ}dt|ƒ tt| j ƒƒ | j  }nd}|r"| ¡ n|}t || jj | ¡ ¡ }t	 
|d¡| j }t|| jjj d� ¡ }t || | j | ¡ ¡ }	t	 
|	d¡| j }
||
| jj  | j }|| dd¡ S )Nó    SigEd25519 no Ed25519 collisionsó    Úlittle©Úpointr   )r!   Úintr   r   Údigestr   Únewr    Ú_prefixr   Ú
from_bytesr&   r   r$   ÚGr"   r#   ÚdÚto_bytes)r'   r6   r7   ÚflagÚdom2ÚPHMÚr_hashÚrÚR_pkÚk_hashÚkÚsr   r   r   r3   ž   s    

ÿÿzEdDSASigScheme._sign_ed25519c                 C   sÚ   t |ƒ}dt|ƒ tt| jƒƒ | j }|r| ¡  d¡n|}t || jj	 | ¡ d¡}t
 |d¡| j }t|| jjj d� ¡ }t || | j | ¡ d¡}	t
 |	d¡| j }
||
| jj  | j }|| dd¡ S )Nó   SigEd448é@   ér   r<   r=   r   )r?   r   r   r!   ÚcopyÚreadr   rA   r    rB   r   rC   r&   r   r$   rD   r"   r#   rE   rF   )r'   r6   r7   rG   Údom4rI   rJ   rK   rL   rM   rN   rO   r   r   r   r5   ¹   s   
ÿÿzEdDSASigScheme._sign_ed448c                 C   s|   | j jdkrt|tjƒ}|st|ƒstdƒ‚| j}n| j jdkr4t|tj	ƒ}|s0t|ƒs0tdƒ‚| j
}ntdƒ‚||||ƒS )a‡  Check if an EdDSA signature is authentic.

        Args:
          msg_or_hash (bytes or a hash object):
            The message to verify (``bytes``, in case of *PureEdDSA*) or
            the hash that was carried out over the message (hash object, for *HashEdDSA*).

            The hash object must be :class:`Cryptodome.Hash.SHA512` object for Ed25519,
            and :class:`Cryptodome.Hash.SHAKE256` for Ed448.

          signature (``bytes``):
            The signature that needs to be validated.
            It must be 64 bytes for Ed25519, and 114 bytes for Ed448.

        :raise ValueError: if the signature is not authentic
        r   r-   r   r.   r/   )r    r   r1   r   r2   r   r0   Ú_verify_ed25519r   r4   Ú_verify_ed448r   )r'   r6   Ú	signaturer7   Úeddsa_verify_methodr   r   r   ÚverifyÑ   s   zEdDSASigScheme.verifyc                 C   s$  t |ƒdkr
tdƒ‚| js|r$t|ƒ}dt|ƒ tt | jƒƒ | j }nd}|r,| ¡ n|}zt|d d… ƒj}W n tyD   tdƒ‚w t 	|dd … d¡}|| j
krXtdƒ‚t ||d d…  | j | ¡ ¡ }	t 	|	d¡| j
 }
|d	 | jjj }d	| |
d	 | jj  }||kr�td
ƒ‚d S )NrQ   ú'The signature is not authentic (length)r:   r;   r   ú"The signature is not authentic (R)r<   ú"The signature is not authentic (S)é   úThe signature is not authentic)r   r   r!   r?   r   r@   r   ÚpointQr   rC   r&   r   rA   r#   r    r$   rD   )r'   r6   rX   r7   rG   rH   rI   ÚRrO   rM   rN   Úpoint1Úpoint2r   r   r   rV   ô   s4   

ÿÿÿ
$ÿzEdDSASigScheme._verify_ed25519c                 C   s  t |ƒdkr
tdƒ‚t|ƒ}dt|ƒ tt | jƒƒ | j }|r'| ¡  d¡n|}zt|d d… ƒj}W n ty?   tdƒ‚w t	 
|dd … d¡}|| jkrStdƒ‚t ||d d…  | j | ¡ d¡}	t	 
|	d¡| j }
|d	 | jjj }d	| |
d	 | jj  }||krŒtd
ƒ‚d S )NrR   r[   rP   rQ   r   r\   r<   r]   r^   r_   )r   r   r?   r   r!   rS   rT   r   r`   r   rC   r&   r   rA   r#   r    r$   rD   )r'   r6   rX   r7   rG   rU   rI   ra   rO   rM   rN   rb   rc   r   r   r   rW     s0   
ÿÿÿ
&ÿzEdDSASigScheme._verify_ed448N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r*   r,   r9   r3   r5   rZ   rV   rW   r   r   r   r   r   c   s    ###r   Nc                 C   sX   t | tƒr
| jdvrtdƒ‚|dkrtdƒ‚|du rd}n
t|ƒdkr'tdƒ‚t| |ƒS )	a©  Create a signature object :class:`EdDSASigScheme` that
    can perform or verify an EdDSA signature.

    Args:
        key (:class:`Cryptodome.PublicKey.ECC` object):
            The key to use for computing the signature (*private* keys only)
            or for verifying one.
            The key must be on the curve ``Ed25519`` or ``Ed448``.

        mode (string):
            This parameter must be ``'rfc8032'``.

        context (bytes):
            Up to 255 bytes of `context <https://datatracker.ietf.org/doc/html/rfc8032#page-41>`_,
            which is a constant byte string to segregate different protocols or
            different applications of the same key.
    )r   r   z&EdDSA can only be used with EdDSA keysÚrfc8032zMode must be 'rfc8032'Nr;   éÿ   z3Context for EdDSA must not be longer than 255 bytes)r1   r   r   r   r   r   )r(   Úmoder)   r   r   r   rA   9  s   
rA   )N)ÚCryptodome.Math.Numbersr   ÚCryptodome.Hashr   r   ÚCryptodome.Util.py3compatr   r   ÚCryptodome.PublicKey.ECCr   r   r	   r
   r   r   Úobjectr   rA   r   r   r   r   Ú<module>   s    W