U
    •uÄc)  ã                   @   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zDd 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k
r    dZY nX 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 )é    )Úpublic)ÚIPayloadCodec)ÚEncodedPayload)Ú_dumps)Ú_loadsÚHAS_CRYPTOBOXr   )ÚBase64EncoderÚ
RawEncoderÚ
HexEncoder)Ú
PrivateKeyÚ	PublicKeyÚBox)Úrandom)Ú
StringTrieFTÚKeyÚKeyRingc                   @   s   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rB| jj| _|d ksP|| jksPt‚nt|td�| _|rdt |td�| _nd | _| jr’| jj| _|d ks || jks t‚nt|td�| _| jr¾| jr¾t	| j| jƒ| _
nd | _
| jrâ| jrât	| j| jƒ| _nd | _| j
sü| jsütdƒ‚d S )N©ÚencoderzDinsufficient keys provided for at least originator or responder role)r   r   Úoriginator_privÚ
public_keyÚoriginator_pubÚAssertionErrorr   Úresponder_privÚresponder_pubr   Úoriginator_boxÚresponder_boxÚ	Exception)Úselfr   r   r   r   © r   úV/var/www/html/Manju/school/venv/lib/python3.8/site-packages/autobahn/wamp/cryptobox.pyÚ__init__>   s,    

zKey.__init__)NNNN©Ú__name__Ú
__module__Ú__qualname__Ú__doc__r    r   r   r   r   r   6   s   c                   @   s   e Zd ZdZddd„ZdS )ÚSymKeyz3
        Holds a symmetric key for an URI.
        Nc                 C   s   d S ©Nr   )r   Úrawr   r   r   r    s   s    zSymKey.__init__)Nr!   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ks"t |tƒs"t|tkƒs"t‚tƒ | _t|ƒtkrBt||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   r   Ú_uri_to_keyÚ_default_key)r   Zdefault_keyr   r   r   r    ~   s
    "zKeyRing.__init__c                 C   s6   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   Úascii)r   ÚgenerateÚencoder   r   Údecode©r   ÚkeyZpriv_keyZpub_keyr   r   r   Úgenerate_keyŠ   s    zKeyRing.generate_keyc                 C   s6   t  ¡ }|jtd�}|jjtd�}| d¡| d¡fS )z�
            Generate a new private key and return a pair with the hex encodings
            of (priv_key, pub_key).
            r   r/   )r   r0   r1   r
   r   r2   r3   r   r   r   Úgenerate_key_hex•   s    zKeyRing.generate_key_hexc                 C   s„   t |ƒtkst‚|dks2t|tƒs2t |ƒtks2t‚t |ƒtkrJt||d�}|dkrZ|| _n&|dkrv|| jkr€| j|= n
|| j|< dS )z8
            Add a key set for a given URI.
            Nr)   Ú )r+   r,   r   r*   r   r.   r-   )r   Úurir4   r   r   r   Úset_key    s    "

zKeyRing.set_keyc                 C   s<   t |ƒtkst‚|| jkr*| j|  ¡  n| j|  ¡  d S r'   )r+   r,   r   r-   Úrotate)r   r8   r   r   r   Ú
rotate_key²   s    
zKeyRing.rotate_keyFc                 C   s^   z |r| j | }n| j  |¡}W n( tk
rH   | jr>| j}nY d S Y nX |rT|jS |jS d S r'   )r-   Zlongest_prefix_valueÚKeyErrorr.   r   r   )r   Úis_originatingr8   Zmatch_exactr4   r   r   r   Ú_get_boxº   s    zKeyRing._get_boxc                 C   s¸   t |ƒtkst‚t |ƒtks t‚|dks<t |ƒttfks<t‚|dksTt |ƒtksTt‚|  ||¡}|shd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)r8   ÚargsÚkwargsÚutf8r   Ú	cryptoboxÚjson)Zenc_key)r+   Úboolr   r,   ÚlistÚtupleÚdictr>   r   r   Z
NONCE_SIZEÚ_json_dumpsr1   Zencryptr	   Úbytesr   )r   r=   r8   r?   r@   ÚboxÚpayloadZnonceÚpayload_serZpayload_encrZpayload_bytesZpayload_keyr   r   r   r1   Ë   s"    ý
zKeyRing.encodec           	      C   sª   t |ƒtkst‚t|tƒst‚|jdks,t‚|  ||¡}|sDtdƒ‚|j|j	t
d�}|jdkrnt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)``.
            rB   z/received encrypted payload, but can't find key!r   rC   zIreceived encrypted payload, but don't know how to process serializer '{}'rA   r8   Nr?   r@   )r+   r,   r   r*   r   Zenc_algor>   r   ZdecryptrK   r	   Zenc_serializerÚformatÚ_json_loadsr2   Úget)	r   r=   r8   Zencoded_payloadrJ   rL   rK   r?   r@   r   r   r   r2   ï   s    
zKeyRing.decode)N)F)NN)r"   r#   r$   r%   r   r    r5   r6   r9   r;   r>   r1   r2   r   r   r   r   r   v   s    






#N) Zautobahn.utilr   Zautobahn.wamp.interfacesr   Zautobahn.wamp.typesr   Zautobahn.wamp.serializerr   rH   r   rN   Ú__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>   s2   þ
7 