
    af)                        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	 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 dZe                    ddg           n# e$ r dZY nw xY werTe G d de                      Ze G d de                      Ze G d de                      Z ej        e           dS dS )    )public)IPayloadCodec)EncodedPayload)_dumps)_loadsHAS_CRYPTOBOXr   )Base64Encoder
RawEncoder
HexEncoder)
PrivateKey	PublicKeyBox)random)
StringTrieTKeyKeyRingFc                       e Zd ZdZ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                    |rt          |t                    | _        nd | _        | j        r!| j        j        | _        ||| j        k    sJ nt          |t                    | _        |rt          |t                    | _        nd | _        | j        r!| j        j        | _        ||| j        k    sJ nt          |t                    | _        | 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 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   s        I/var/www/html/env/lib/python3.11/site-packages/autobahn/wamp/cryptobox.py__init__zKey.__init__>   s    ,'1/='Y'Y'Y$$'+$# W&*&:&E#%-4CV1V1V1VV&/&V&V&V#  +&0&W&W&W##&*#" U%)%8%C"$,AS0S0S0SS%.}m%T%T%T" # +(: +&)$*>@R&S&S##&*# " *t': *%()<d>Q%R%R""%)"' h4+= h fgggh h h h    )NNNN__name__
__module____qualname____doc__r!    r"   r    r   r   6   s8        	 	.	h .	h .	h .	h .	h .	hr"   c                       e Zd ZdZddZdS )SymKeyz3
        Holds a symmetric key for an URI.
        Nc                     d S Nr(   )r   raws     r    r!   zSymKey.__init__s   s    Dr"   r,   r#   r(   r"   r    r*   r*   n   s2        	 		 	 	 	 	 	r"   r*   c                       e Zd ZdZedd            Zed             Zed             Zed             Zed             Z	dd	Z
edd
            Ze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                     |/t          |t                    st          |t          k              sJ t	                      | _        t          |          t          k    rt          ||          }|| _        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   default_keys     r    r!   zKeyRing.__init__~   sq     &*[#*F*F&${^aOaJbJb&&b)||DK  C''!+kZZZ +Dr"   c                     t          j                    }|                    t                    }|j                            t                    }|                    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   keypriv_keypub_keys       r    generate_keyzKeyRing.generate_key   s`     %''Czz-z88Hn++M+BBG??7++W^^G-D-DDDr"   c                     t          j                    }|                    t                    }|j                            t                    }|                    d          |                    d          fS )z
            Generate a new private key and return a pair with the hex encodings
            of (priv_key, pub_key).
            r   r8   )r   r9   r:   r   r   r;   r<   s       r    generate_key_hexzKeyRing.generate_key_hex   s`     %''Czz*z55Hn++J+??G??7++W^^G-D-DDDr"   c                 N   t          |          t          k    sJ |/t          |t                    st          |          t          k    sJ t          |          t          k    rt          ||          }|dk    r	|| _        dS ||| j        v r
| j        |= dS dS || j        |<   dS )z8
            Add a key set for a given URI.
            Nr0    )r2   r3   r1   r   r5   r4   )r   urir=   s      r    set_keyzKeyRing.set_key   s    
 99####;*S#"6"6;$s))s:J:J:JJCyyC#cBBBbyy$'!!!;d... ,S111 /. -0D$S)))r"   c                     t          |          t          k    sJ || j        v r!| j        |                                          d S | j        |                                          d S r,   )r2   r3   r4   rotate)r   rE   s     r    
rotate_keyzKeyRing.rotate_key   sg    99####d&&& %,,..... %,,.....r"   Fc                     	 |r| j         |         }n| j                             |          }n"# t          $ r | j        r| j        }nY d S Y nw xY w|r|j        S |j        S r,   )r4   longest_prefix_valueKeyErrorr5   r   r   )r   is_originatingrE   match_exactr=   s        r    _get_boxzKeyRing._get_box   s    	  E*3/CC*??DDC      $  +CC44 C   )))((s   *- AAc                    t          |          t          k    sJ t          |          t          k    sJ |t          |          t          t          fv sJ |t          |          t
          k    sJ |                     ||          }|sdS |||d}t          t          j	                  }t          |                              d          }|                    ||t                    }	t          |	          }
d}t          |
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)rE   argskwargsutf8r   	cryptoboxjson)enc_key)r2   boolr3   listtupledictrO   r   r   
NONCE_SIZE_json_dumpsr:   encryptr
   bytesr   )r   rM   rE   rQ   rR   boxpayloadnoncepayload_serpayload_encrpayload_bytespayload_keys               r    r:   zKeyRing.encode   s    ''4////99####<4::$#>#>#>>>T&\\T%9%9%99--44C  t   G
 3>**E%g..55f==K;;{E:;NNL
 ",//MK!-fkZZZZr"   c                 D   t          |          t          k    sJ t          |t                    sJ |j        dk    sJ |                     ||          }|st          d          |                    |j        t                    }|j
        dk    r't          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)``.
            rT   z/received encrypted payload, but can't find key!r   rU   zIreceived encrypted payload, but don't know how to process serializer '{}'rS   rE   NrQ   rR   )r2   r3   r1   r   enc_algorO   r   decryptr`   r
   enc_serializerformat_json_loadsr;   get)	r   rM   rE   encoded_payloadr_   rb   r`   rQ   rR   s	            r    r;   zKeyRing.decode   s/   
 99####o~>>??>"+{::::--44C S QRRR++o&=z+RRK-77 k r r  tC  tR  !S  !S  T  T  T!+"4"4V"<"<==G++eT**C;;vt,,D[[400Ff$$r"   r,   )F)NN)r$   r%   r&   r'   r   r!   r@   rB   rF   rI   rO   r:   r;   r(   r"   r    r   r   v   s       	 	 
		, 		, 		, 
		, 
	E 	E 
	E 
	E 	E 
	E 
	0 	0 
	0" 
	/ 	/ 
	/	) 	) 	) 	)" 
!	[ !	[ !	[ 
!	[F 
	% 	% 
	% 	% 	%r"   N) autobahn.utilr   autobahn.wamp.interfacesr   autobahn.wamp.typesr   autobahn.wamp.serializerr   r\   r   rk   __all__nacl.encodingr	   r
   r   nacl.publicr   r   r   
nacl.utilsr   pytrier   r   extendImportErrorobjectr   r*   r   registerr(   r"   r    <module>r{      s  8 !           2 2 2 2 2 2 . . . . . . : : : : : : : : : : : : 

'CCCCCCCCCC6666666666!!!!!!!!!!!! MNNE9%&&&&	    MMM  X$5h 5h 5h 5h 5hf 5h 5h V5hn        V Q% Q% Q% Q% Q%& Q% Q% VQ%j M7#####qX$ X$s    A A('A(