o
    g                      @   s   d dl mZ 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 G dd deZG d	d
 d
ejeZG dd dejeZdS )    )OptionalN)encoding)
exceptions)
PrivateKey	PublicKey)StringFixerrandomc                	   @   sd   e Zd ZU dZeed< eed< ededededd fdd	Zedefd
dZ	edefddZ
dS )SignedMessagezc
    A bytes subclass that holds a messaged that has been signed by a
    :class:`SigningKey`.
    
_signature_message	signaturemessagecombinedreturnc                 C   s   | |}||_ ||_|S N)r
   r   )clsr   r   r   obj r   F/var/www/html/api-tag/env/lib/python3.10/site-packages/nacl/signing.py_from_parts#   s   zSignedMessage._from_partsc                 C      | j S )zL
        The signature contained within the :class:`SignedMessage`.
        )r
   selfr   r   r   r   ,      zSignedMessage.signaturec                 C   r   )zJ
        The message contained within the :class:`SignedMessage`.
        )r   r   r   r   r   r   3   r   zSignedMessage.messageN)__name__
__module____qualname____doc__bytes__annotations__classmethodr   propertyr   r   r   r   r   r   r	      s$   
 r	   c                	   @   s   e Zd ZdZejfdedejfddZdefddZ	de
fd	d
ZdedefddZdedefddZdejfdedee dejdefddZdefddZdS )	VerifyKeyz
    The public key counterpart to an Ed25519 SigningKey for producing digital
    signatures.

    :param key: [:class:`bytes`] Serialized Ed25519 public key
    :param encoder: A class that is able to decode the `key`
    keyencoderc                 C   sJ   | |}t|tstdt|tjjkr t	dtjj || _
d S )Nz'VerifyKey must be created from 32 bytesz%The key must be exactly %s bytes long)decode
isinstancer   exc	TypeErrorlennaclbindingscrypto_sign_PUBLICKEYBYTES
ValueError_key)r   r#   r$   r   r   r   __init__D   s   



zVerifyKey.__init__r   c                 C   r   r   )r.   r   r   r   r   	__bytes__T      zVerifyKey.__bytes__c                 C      t t| S r   hashr   r   r   r   r   __hash__W      zVerifyKey.__hash__otherc                 C   &   t || jsdS tjt| t|S NFr&   	__class__r*   r+   sodium_memcmpr   r   r7   r   r   r   __eq__Z      zVerifyKey.__eq__c                 C   
   | |k S r   r   r=   r   r   r   __ne___      
zVerifyKey.__ne__Nsmessager   c                 C   sp   |dur+t |tstdtjj t|tjjkr#tdtjj ||	| }n|	|}tj
|| jS )aS  
        Verifies the signature of a signed message, returning the message
        if it has not been tampered with else raising
        :class:`~nacl.signing.BadSignatureError`.

        :param smessage: [:class:`bytes`] Either the original messaged or a
            signature and message concated together.
        :param signature: [:class:`bytes`] If an unsigned message is given for
            smessage then the detached signature must be provided.
        :param encoder: A class that is able to decode the secret message and
            signature.
        :rtype: :class:`bytes`
        Nz4Verification signature must be created from %d bytesz+The signature must be exactly %d bytes long)r&   r   r'   r(   r*   r+   crypto_sign_BYTESr)   r-   r%   crypto_sign_openr.   )r   rC   r   r$   r   r   r   verifyb   s    

zVerifyKey.verifyc                 C   s   t j| j}t|S )z
        Converts a :class:`~nacl.signing.VerifyKey` to a
        :class:`~nacl.public.PublicKey`

        :rtype: :class:`~nacl.public.PublicKey`
        )r*   r+   $crypto_sign_ed25519_pk_to_curve25519r.   _Curve25519_PublicKey)r   raw_pkr   r   r   to_curve25519_public_key   s   z"VerifyKey.to_curve25519_public_key)r   r   r   r   r   
RawEncoderr   Encoderr/   r0   intr5   objectboolr>   rA   r   rF   rH   rJ   r   r   r   r   r"   ;   s0    	

)r"   c                   @   s   e Zd ZdZejfdedejfddZdefddZ	de
fd	d
ZdedefddZdedefddZedddZejfdedejdefddZdefddZdS )
SigningKeya  
    Private key for producing digital signatures using the Ed25519 algorithm.

    Signing keys are produced from a 32-byte (256-bit) random seed value. This
    value can be passed into the :class:`~nacl.signing.SigningKey` as a
    :func:`bytes` whose length is 32.

    .. warning:: This **must** be protected and remain secret. Anyone who knows
        the value of your :class:`~nacl.signing.SigningKey` or it's seed can
        masquerade as you.

    :param seed: [:class:`bytes`] Random 32-byte value (i.e. private key)
    :param encoder: A class that is able to decode the seed

    :ivar: verify_key: [:class:`~nacl.signing.VerifyKey`] The verify
        (i.e. public) key that corresponds with this signing key.
    seedr$   c                 C   sj   | |}t|tstdt|tjjkr t	dtjj tj
|\}}|| _|| _t|| _d S )Nz.SigningKey must be created from a 32 byte seedz&The seed must be exactly %d bytes long)r%   r&   r   r'   r(   r)   r*   r+   crypto_sign_SEEDBYTESr-   crypto_sign_seed_keypair_seed_signing_keyr"   
verify_key)r   rQ   r$   
public_key
secret_keyr   r   r   r/      s   

zSigningKey.__init__r   c                 C   r   r   )rT   r   r   r   r   r0      r1   zSigningKey.__bytes__c                 C   r2   r   r3   r   r   r   r   r5      r6   zSigningKey.__hash__r7   c                 C   r8   r9   r:   r=   r   r   r   r>      r?   zSigningKey.__eq__c                 C   r@   r   r   r=   r   r   r   rA      rB   zSigningKey.__ne__c                 C   s   | t tjjtjdS )z
        Generates a random :class:`~nacl.signing.SigningKey` object.

        :rtype: :class:`~nacl.signing.SigningKey`
        )r$   )r   r*   r+   rR   r   rK   )r   r   r   r   generate   s   
zSigningKey.generater   c                 C   sT   t j|| j}t jj}||d| }|||d }||}t|||S )z
        Sign a message using this key.

        :param message: [:class:`bytes`] The data to be signed.
        :param encoder: A class that is used to encode the signed message.
        :rtype: :class:`~nacl.signing.SignedMessage`
        N)r*   r+   crypto_signrU   rD   encoder	   r   )r   r   r$   
raw_signedrD   r   signedr   r   r   sign   s   
zSigningKey.signc                 C   s   | j }tj|}t|S )z
        Converts a :class:`~nacl.signing.SigningKey` to a
        :class:`~nacl.public.PrivateKey`

        :rtype: :class:`~nacl.public.PrivateKey`
        )rU   r*   r+   $crypto_sign_ed25519_sk_to_curve25519_Curve25519_PrivateKey)r   skraw_privater   r   r   to_curve25519_private_key   s   z$SigningKey.to_curve25519_private_keyN)r   rP   )r   r   r   r   r   rK   r   rL   r/   r0   rM   r5   rN   rO   r>   rA   r    rY   r	   r^   r`   rc   r   r   r   r   rP      s.    

rP   )typingr   nacl.bindingsr*   r   r   r'   nacl.publicr   r`   r   rH   
nacl.utilsr   r   r   r	   	Encodabler"   rP   r   r   r   r   <module>   s   ![