o
    èó·i)  ã                   @   s  d dl mZ d dlmZ d dlmZ d dlmZ d dlm	Z
 ddgZz"d dlmZmZmZ d d	lmZmZmZ d d
lmZ d dlmZ W n eyO   dZY n
w dZe ddg¡ er€eG dd„ deƒƒZeG dd„ deƒƒZeG dd„ deƒƒZe e¡ dS dS )é    )Úpublic)ÚIPayloadCodec)ÚEncodedPayload)Ú_dumps)Ú_loadsÚHAS_CRYPTOBOXr   )ÚBase64EncoderÚ
RawEncoderÚ
HexEncoder)Ú
PrivateKeyÚ	PublicKeyÚBox)Úrandom)Ú
StringTrieFTÚKeyÚKeyRingc                   @   ó   e Zd ZdZddd„ZdS )r   z¬
        Holds originator and responder keys for an URI.

        The originator is either a caller or a publisher. The responder is either a callee or subscriber.
        Nc                 C   s  |r
t |td�| _nd | _| jr!| jj| _|d u s || jks J ‚nt|td�| _|r2t |td�| _nd | _| jrI| jj| _|d u sH|| jksHJ ‚nt|td�| _| jr_| jr_t| j| jƒ| _	nd | _	| jrq| jrqt| j| jƒ| _
nd | _
| j	s~| j
s€tdƒ‚d S d S )N©ÚencoderzDinsufficient keys provided for at least originator or responder role)r   r   Úoriginator_privÚ
public_keyÚoriginator_pubr   Úresponder_privÚresponder_pubr   Úoriginator_boxÚresponder_boxÚ	Exception)Úselfr   r   r   r   © r   ú]C:\Users\psant\Downloads\PAF backend\school\venv\Lib\site-packages\autobahn/wamp/cryptobox.pyÚ__init__>   s2   
€
€ÿzKey.__init__)NNNN©Ú__name__Ú
__module__Ú__qualname__Ú__doc__r    r   r   r   r   r   6   s    c                   @   r   )ÚSymKeyz3
        Holds a symmetric key for an URI.
        Nc                 C   s   d S ©Nr   )r   Úrawr   r   r   r    s   s   zSymKey.__init__r'   r!   r   r   r   r   r&   n   s    r&   c                   @   sr   e Zd ZdZeddd„ƒZedd„ ƒZedd„ ƒZed	d
„ ƒZedd„ ƒZ	ddd„Z
eddd„ƒZedd„ ƒZdS )r   a	  
        A keyring holds (cryptobox) public-private key pairs for use with WAMP-cryptobox payload
        encryption. The keyring can be set on a WAMP session and then transparently will get used
        for encrypting and decrypting WAMP message payloads.
        Nc                 C   sL   |du st |tƒst|tkƒsJ ‚tƒ | _t|ƒtkr!t||d�}|| _dS )zj

            Create a new key ring to hold public and private keys mapped from an URI space.
            N©r   r   )Ú
isinstancer   ÚtypeÚstrr   Ú_uri_to_keyÚ_default_key)r   Zdefault_keyr   r   r   r    ~   s
   "
zKeyRing.__init__c                 C   ó6   t  ¡ }|jtd�}|jjtd�}| d¡| d¡fS )z„
            Generate a new private key and return a pair with the base64 encodings
            of (priv_key, pub_key).
            r   ÚasciiN)r   ÚgenerateÚencoder   r   Údecode©r   ÚkeyZpriv_keyZpub_keyr   r   r   Úgenerate_keyŠ   ó   zKeyRing.generate_keyc                 C   r/   )z�
            Generate a new private key and return a pair with the hex encodings
            of (priv_key, pub_key).
            r   r0   N)r   r1   r2   r
   r   r3   r4   r   r   r   Úgenerate_key_hex•   r7   zKeyRing.generate_key_hexc                 C   sŒ   t |ƒtksJ ‚|du st|tƒst |ƒtksJ ‚t |ƒtkr%t||d�}|dkr.|| _dS |du r?|| jv r=| j|= dS dS || j|< dS )z8
            Add a key set for a given URI.
            Nr)   Ú )r+   r,   r*   r   r.   r-   )r   Úurir5   r   r   r   Úset_key    s   "

ÿzKeyRing.set_keyc                 C   s>   t |ƒtksJ ‚|| jv r| j|  ¡  d S | j|  ¡  d S r'   )r+   r,   r-   Úrotate)r   r:   r   r   r   Ú
rotate_key²   s   
zKeyRing.rotate_keyFc                 C   sX   z|r	| j | }n| j  |¡}W n ty#   | jr| j}nY d S Y nw |r)|jS |jS r'   )r-   Zlongest_prefix_valueÚKeyErrorr.   r   r   )r   Úis_originatingr:   Zmatch_exactr5   r   r   r   Ú_get_boxº   s   €þþzKeyRing._get_boxc                 C   s¸   t |ƒtksJ ‚t |ƒtksJ ‚|du st |ƒttfv sJ ‚|du s*t |ƒtks*J ‚|  ||¡}|s4dS |||dœ}ttj	ƒ}t
|ƒ d¡}|j||td�}	t|	ƒ}
d}t|
dd|d�S )zž
            Encrypt the given WAMP URI, args and kwargs into an EncodedPayload instance, or None
            if the URI should not be encrypted.
            N)r:   ÚargsÚkwargsÚutf8r   Ú	cryptoboxÚjson)Zenc_key)r+   Úboolr,   ÚlistÚtupleÚdictr@   r   r   Z
NONCE_SIZEÚ_json_dumpsr2   Zencryptr	   Úbytesr   )r   r?   r:   rA   rB   ÚboxÚpayloadÚnonceÚpayload_serZpayload_encrZpayload_bytesZpayload_keyr   r   r   r2   Ë   s"   ý
zKeyRing.encodec           	      C   sª   t |ƒtksJ ‚t|tƒsJ ‚|jdksJ ‚|  ||¡}|s"tdƒ‚|j|jt	d�}|j
dkr7td |j
¡ƒ‚t| d¡ƒ}| dd¡}| d	d¡}| d
d¡}|||fS )zm
            Decrypt the given WAMP URI and EncodedPayload into a tuple ``(uri, args, kwargs)``.
            rD   z/received encrypted payload, but can't find key!r   rE   zIreceived encrypted payload, but don't know how to process serializer '{}'rC   r:   NrA   rB   )r+   r,   r*   r   Zenc_algor@   r   ZdecryptrM   r	   Zenc_serializerÚformatÚ_json_loadsr3   Úget)	r   r?   r:   Zencoded_payloadrL   rO   rM   rA   rB   r   r   r   r3   ï   s   

zKeyRing.decoder'   )F)NN)r"   r#   r$   r%   r   r    r6   r8   r;   r=   r@   r2   r3   r   r   r   r   r   v   s"    






#N) Zautobahn.utilr   Zautobahn.wamp.interfacesr   Zautobahn.wamp.typesr   Zautobahn.wamp.serializerr   rJ   r   rQ   Ú__all__Znacl.encodingr   r	   r
   Znacl.publicr   r   r   Z
nacl.utilsr   Zpytrier   ÚImportErrorr   ÚextendÚobjectr   r&   r   Úregisterr   r   r   r   Ú<module>   s:   þÿ7  �§