U
    •uÄcá™  ã                   @   s²  d dl Z d dlZd dlmZmZ d dlZd dlmZmZmZm	Z	m
Z
 d dlZd dlmZ d dlmZmZ d dlmZ d dlmZ d dlmZ d	gZz$d d
lmZmZmZ d dlmZ W n ek
rÎ   dZY nX dZe  d¡ dd„ Z!dd„ Z"dd„ Z#G dd„ dƒZ$e%e&dœdd„Z'dd„ Z(dd„ Z)dd„ Z*d0d!d"„Z+d#d$„ Z,e�r®eee& ee- e&d%œd&d'„Z.e&ee&d(œd)d*„Z/G d+d„ de0ƒZ1e 2e1¡ G d,d-„ d-e0ƒZ3e 4dd.d/d-g¡ dS )1é    N)Úa2b_hexÚb2a_hex)ÚCallableÚOptionalÚUnionÚDictÚAny)Úutil)ÚISecurityModuleÚICryptosignKey)Ú	Challenge)Ú_URI_PAT_REALM_NAME_ETH)Úparse_keyfileÚHAS_CRYPTOSIGN)ÚencodingÚsigningÚbindings)ÚSignedMessageFTÚCryptosignKeyc                 C   sR   g }| rNt  d| dd… ¡d }| d|d … | d| d…  }} | |¡ q|S )z}
    Unpack a SSH agent key blob into parts.

    See: http://blog.oddbit.com/2011/05/08/converting-openssh-public-keys/
    ú>INé   r   )ÚstructÚunpackÚappend)ÚkeydataÚpartsZdlenÚdata© r   úW/var/www/html/VBACK/school/venv/lib/python3.8/site-packages/autobahn/wamp/cryptosign.pyÚ_unpack8   s    "r   c                 C   s8   g }| D ]$}|  t dt|ƒ¡¡ |  |¡ qd |¡S )z)
    Pack parts into a SSH key blob.
    r   ó    )r   r   ÚpackÚlenÚjoin)Zkeypartsr   Úpartr   r   r   Ú_packI   s
    r%   c              
   C   sÐ   t | ƒtkrtd t | ƒ¡ƒ‚|  ¡  ¡ }t|ƒdkr>tdƒ‚|\}} }|dkr^td |¡ƒ‚t | ¡}zt	|ƒd }W n0 tk
r¨ } ztd |¡ƒ‚W 5 d}~X Y nX t|ƒd	krÈtd
 t|ƒ¡ƒ‚||fS )a€  
    Parse an OpenSSH Ed25519 public key from a string into a raw public key.

    Example input:

        ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJukDU5fqXv/yVhSirsDWsUFyOodZyCSLxyitPPzWJW9 oberstet@office-corei7

    :param keydata: The OpenSSH Ed25519 public key data to parse.
    :type keydata: str

    :returns: pair of raw public key (32 bytes) and comment
    :rtype: tuple
    zinvalid type {} for keydataé   zinvalid SSH Ed25519 public keyzssh-ed25519z%not a Ed25519 SSH public key (but {})é   zcould not parse key ({})Né    z9invalid length {} for embedded raw key (must be 32 bytes))
ÚtypeÚstrÚ	ExceptionÚformatÚstripÚsplitr"   ÚbinasciiÚ
a2b_base64r   )r   r   ZalgoÚcommentÚblobÚkeyÚer   r   r   Ú_read_ssh_ed25519_pubkeyT   s     

 r5   c                   @   s8   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )Ú_SSHPacketReaderzD
    Read OpenSSH packet format which is used for key material.
    c                 C   s   || _ d| _t|ƒ| _d S ©Nr   )Ú_packetÚ_idxr"   Ú_len)ÚselfÚpacketr   r   r   Ú__init__   s    z_SSHPacketReader.__init__c                 C   s   | j | jd … S ©N)r8   r9   ©r;   r   r   r   Úget_remaining_payload„   s    z&_SSHPacketReader.get_remaining_payloadc                 C   s@   | j | | jkrtdƒ‚| j| j | j | … }|  j |7  _ |S )Nzincomplete packet)r9   r:   r+   r8   )r;   ÚsizeÚvaluer   r   r   Ú	get_bytes‡   s
    z_SSHPacketReader.get_bytesc                 C   s   t  d|  d¡¡d S )Nr   r   r   )r   r   rC   r?   r   r   r   Ú
get_uint32�   s    z_SSHPacketReader.get_uint32c                 C   s   |   |  ¡ ¡S r>   )rC   rD   r?   r   r   r   Ú
get_string’   s    z_SSHPacketReader.get_stringN)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r=   r@   rC   rD   rE   r   r   r   r   r6   z   s   r6   )rA   Úreturnc                 C   s8   d|   krdk sn t ‚d dd„ td| d ƒD ƒ¡S )Nr   éÿ   r    c                 s   s   | ]}|j d dd�V  qdS )r'   Úbig)Ú	byteorderN)Úto_bytes©Ú.0Úxr   r   r   Ú	<genexpr>˜   s     z_makepad.<locals>.<genexpr>r'   )ÚAssertionErrorr#   Úrange)rA   r   r   r   Ú_makepad–   s    rU   c                 C   sð  d}d}d}|   |¡r |  |¡s(tdƒ‚|  |¡}| t|ƒ|… } d dd„ |  ¡ D ƒ¡} t | ¡}|t|ƒd… }t	|ƒ}| 
¡ }| 
¡ }| 
¡  | ¡ }	| 
¡  | 
¡ }
| ¡ }d	}|d
krÈtdƒ‚|d
krØtdƒ‚|	dkrîtd |	¡ƒ‚|rútdƒ‚t	|
ƒ}| ¡  | ¡  | 
¡ }|dk�r8td | d¡¡ƒ‚| 
¡ }| 
¡ }t|ƒtjk�r`tdƒ‚t|ƒtjk�rxtdƒ‚| 
¡ }| ¡ }t|ƒ�rÐt|ƒ|k�s²|tt|ƒƒk�rÐtd t|ƒ|tt|ƒƒ¡ƒ‚|dtj… }| d¡}||fS )að  
    Parse an OpenSSH Ed25519 private key from a string into a raw private key.

    Example input:

        -----BEGIN OPENSSH PRIVATE KEY-----
        b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
        QyNTUxOQAAACCbpA1OX6l7/8lYUoq7A1rFBcjqHWcgki8corTz81iVvQAAAKDWjZ0Y1o2d
        GAAAAAtzc2gtZWQyNTUxOQAAACCbpA1OX6l7/8lYUoq7A1rFBcjqHWcgki8corTz81iVvQ
        AAAEArodzIMjH9MOBz0X+HDvL06rEJOMYFhzGQ5zXPM7b7fZukDU5fqXv/yVhSirsDWsUF
        yOodZyCSLxyitPPzWJW9AAAAFm9iZXJzdGV0QG9mZmljZS1jb3JlaTcBAgMEBQYH
        -----END OPENSSH PRIVATE KEY-----


    :param keydata: The OpenSSH Ed25519 private key data to parse.
    :type keydata: str

    :returns: pair of raw private key (32 bytes) and comment
    :rtype: tuple
    ú#-----BEGIN OPENSSH PRIVATE KEY-----z!-----END OPENSSH PRIVATE KEY-----s   openssh-key-v1 zFinvalid OpenSSH private key (does not start/end with OPENSSH preamble)Ú c                 s   s   | ]}|  ¡ V  qd S r>   )r-   rO   r   r   r   rR   Â   s     z,_read_ssh_ed25519_privkey.<locals>.<genexpr>Né   s   nonezjencrypted private keys not supported (please remove the passphrase from your private key or use SSH agent)z/passphrase encrypted private keys not supportedr'   zAmultiple private keys in a key file not supported (found {} keys)z=invalid OpenSSH private key (found remaining payload for mac)s   ssh-ed25519z6invalid key type: we only support Ed25519 (found "{}")Úasciizinvalid public key lengthzGinvalid OpenSSH private key (padlen={}, actual_pad={}, expected_pad={}))Ú
startswithÚendswithr+   Úfindr"   r#   r.   r/   r0   r6   rE   rD   r@   r,   Údecoder   Zcrypto_sign_PUBLICKEYBYTESZcrypto_sign_SECRETKEYBYTESrU   Zcrypto_sign_SEEDBYTES)r   Ú	SSH_BEGINZSSH_ENDZOPENSSH_KEY_V1Zssh_endr2   r<   Zcipher_nameZkdfÚnkeysÚkey_dataZmacÚ
block_sizeZalgZvkÚskr1   ÚpadÚseedr   r   r   Ú_read_ssh_ed25519_privkey›   s\    


*
re   c              
   C   s`   t | ƒ�N}t | ¡  ¡ d ¡dd… }t|ƒdkrFtd t|ƒ¡ƒ‚|W  5 Q R £ S Q R X dS )z€
    Read a Ed25519 signature file created with OpenBSD signify.

    http://man.openbsd.org/OpenBSD-current/man1/signify.1
    r'   é
   Né@   zEbogus Ed25519 signature: raw signature length was {}, but expected 64©Úopenr/   r0   ÚreadÚ
splitlinesr"   r+   r,   )Úsignature_fileÚfÚsigr   r   r   Ú_read_signify_ed25519_signatureÿ   s
    
ro   c              
   C   s`   t | ƒ�N}t | ¡  ¡ d ¡dd… }t|ƒdkrFtd t|ƒ¡ƒ‚|W  5 Q R £ S Q R X dS )zŒ
    Read a public key from a Ed25519 key pair created with OpenBSD signify.

    http://man.openbsd.org/OpenBSD-current/man1/signify.1
    r'   rf   Nr(   z@bogus Ed25519 public key: raw key length was {}, but expected 32rh   )Úpubkey_filerm   Úpubkeyr   r   r   Ú_read_signify_ed25519_pubkey  s
    
rr   Útextc           	      C   sä   |dkst ‚ddl}t| ƒ�¾}| ¡  ¡ d }|jd|jd�}| |¡ |dkr˜ddl}| 	¡ �0}|j
|dd	� | ¡ W  5 Q R £ W  5 Q R £ S Q R X n>|d
krÎddl}|j|jjjd�}| ¡ W  5 Q R £ S tdƒ‚W 5 Q R X dS )a�  

    Usage:

    1. Get the OpenBSD 5.7 release public key from here

        http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/etc/signify/Attic/openbsd-57-base.pub?rev=1.1

    2. Generate QR Code and print to terminal

        print(cryptosign._qrcode_from_signify_ed25519_pubkey('openbsd-57-base.pub'))

    3. Compare to (scroll down) QR code here

        https://www.openbsd.org/papers/bsdcan-signify.html
    )rs   Úsvgr   Nr'   r&   )Zbox_sizeZerror_correctionrs   T)ÚoutÚinvertrt   )Zimage_factoryzlogic error)rS   Úqrcoderi   rj   rk   ZQRCodeZERROR_CORRECT_LZadd_dataÚioÚStringIOZprint_asciiÚgetvalueZqrcode.image.svgZ
make_imageÚimagert   ZSvgImageZ	to_stringr+   )	rp   Úmoderw   rm   rq   Zqrrx   Zdata_bufferr{   r   r   r   Ú#_qrcode_from_signify_ed25519_pubkey  s$    
ÿ

(r}   c                 C   s*   t | ƒ}t |¡}t|ƒ}| ||¡ dS )a‡  
    Verify a Ed25519 signature created with OpenBSD signify.

    This will raise a `nacl.exceptions.BadSignatureError` if the signature is bad
    and return silently when the signature is good.

    Usage:

    1. Create a signature:

        signify-openbsd -S -s ~/.signify/crossbario-trustroot.sec -m .profile

    2. Verify the signature

        from autobahn.wamp import cryptosign

        with open('.profile', 'rb') as f:
            message = f.read()
            cryptosign._verify_signify_ed25519_signature('.signify/crossbario-trustroot.pub', '.profile.sig', message)

    http://man.openbsd.org/OpenBSD-current/man1/signify.1
    N)rr   r   Ú	VerifyKeyro   Úverify)rp   rl   Úmessagerq   Ú
verify_keyrn   r   r   r   Ú!_verify_signify_ed25519_signatureF  s    
r‚   )Ú	challengeÚchannel_id_rawÚchannel_id_typerJ   c                 C   sÖ   t | tƒstd t| ƒ¡ƒ‚d| jkr.tdƒ‚| jd }t|ƒtkrVtd t|ƒ¡ƒ‚t|ƒdkrttd t|ƒ¡ƒ‚t 	|¡}|dkr²t|ƒdks¤t
d	 t|ƒ¡ƒ‚t ||¡}n |d
krÀ|}ndsÒt
d |¡ƒ‚|S )a  
        Format the challenge based on provided parameters

        :param challenge: The WAMP-cryptosign challenge object for which a signature should be computed.
        :param channel_id_raw: The channel ID when channel_id_type is 'tls-unique'.
        :param channel_id_type: The type of the channel id, currently handles 'tls-unique' and
            ignores otherwise.
        zCchallenge must be instance of autobahn.wamp.types.Challenge, not {}rƒ   z*missing challenge value in challenge.extraz5invalid type {} for challenge (expected a hex string)rg   z:unexpected challenge (hex) length: was {}, but expected 64ú
tls-uniquer(   zDunexpected TLS transport channel ID length (was {}, but expected 32)NFzinvalid channel_id_type "{}")Ú
isinstancer   r+   r,   r)   Úextrar*   r"   r/   r   rS   r	   Úxor)rƒ   r„   r…   Zchallenge_hexZchallenge_rawr   r   r   r   Ú_format_challengen  s6    	
ÿ


ÿÿÿÿrŠ   )r   Úsigner_funcrJ   c                    s0   |ˆƒ}t  ¡ ‰ ‡ ‡fdd„}t  ||d¡ ˆ S )a  
        Sign the provided data using the provided signer.

        :param data: challenge to sign
        :param signer_func: The callable function to use for signing
        :returns: A Deferred/Future that resolves to the computed signature.
        :rtype: str
        c                    s8   t  | ¡ d¡}t  ˆ¡ d¡}|| }t ˆ |¡ d S )NrY   )r/   r   r]   ÚtxaioÚresolve)Zsignature_rawZsignature_hexZdata_hexrn   ©Úd2r   r   r   Úprocessª  s    z _sign_challenge.<locals>.processN)rŒ   Úcreate_futureZadd_callbacks)r   r‹   Úd1r�   r   rŽ   r   Ú_sign_challengeš  s
    

r“   c                   @   sŠ  e Zd ZdZd2eee ee ee ddœdd„Z	e
ed dœdd	„ƒZe
ee dœd
d„ƒZe
ee dœdd„ƒZe
edœdd„ƒZe
edœdd„ƒZeedœdd„Zd3eee ee edœdd„Zd4eeeef dœdd„Zed5eee d dœdd„ƒZed6eee d dœd d!„ƒZed7eee d d"œd#d$„ƒZeed d%œd&d'„ƒZeed d(œd)d*„ƒZed8eed d,œd-d.„ƒZeed d/œd0d1„ƒZdS )9r   z¬
        A cryptosign private key for signing, and hence usable for authentication or a
        public key usable for verification (but can't be used for signing).
        N)Úcan_signÚsecurity_moduleÚkey_nor1   rJ   c                 C   sp   t |tjƒs*t |tjƒs*td t|ƒ¡ƒ‚|r:t |tjƒsN|sJt |tjƒsNt‚|| _|| _	|| _
|| _|| _d S )Nzinvalid type {} for key)r‡   r   r~   Ú
SigningKeyr+   r,   r)   rS   Ú_keyÚ	_can_signÚ_security_moduleÚ_key_noÚ_comment)r;   r3   r”   r•   r–   r1   r   r   r   r=   ¾  s    $zCryptosignKey.__init__r
   ©rJ   c                 C   s   | j S )z[
            Implements :meth:`autobahn.wamp.interfaces.IKey.security_module`.
            )rš   r?   r   r   r   r•   Ê  s    zCryptosignKey.security_modulec                 C   s   | j S )zR
            Implements :meth:`autobahn.wamp.interfaces.IKey.key_no`.
            )r›   r?   r   r   r   r–   Ñ  s    zCryptosignKey.key_noc                 C   s   | j S )zS
            Implements :meth:`autobahn.wamp.interfaces.IKey.comment`.
            )rœ   r?   r   r   r   r1   Ø  s    zCryptosignKey.commentc                 C   s   dS )zT
            Implements :meth:`autobahn.wamp.interfaces.IKey.key_type`.
            Ú
cryptosignr   r?   r   r   r   Úkey_typeß  s    zCryptosignKey.key_typec                 C   s   | j S )zT
            Implements :meth:`autobahn.wamp.interfaces.IKey.can_sign`.
            )r™   r?   r   r   r   r”   æ  s    zCryptosignKey.can_sign©r   rJ   c                 C   s:   | j stdƒ‚t|ƒtkr"tdƒ‚| j |¡}t |j¡S )zP
            Implements :meth:`autobahn.wamp.interfaces.IKey.sign`.
            za signing key required to signz data to be signed must be binary)	r™   r+   r)   Úbytesr˜   ÚsignrŒ   Zcreate_future_successÚ	signature)r;   r   rn   r   r   r   r¢   í  s    zCryptosignKey.sign)rƒ   Ú
channel_idr…   rJ   c                 C   s2   |j dkstd |j ¡ƒ‚t|||ƒ}t|| jƒS )zd
            Implements :meth:`autobahn.wamp.interfaces.ICryptosignKey.sign_challenge`.
            )rž   zcryptosign-proxyz0unexpected cryptosign challenge with method "{}")ÚmethodrS   r,   rŠ   r“   r¢   )r;   rƒ   r¤   r…   r   r   r   r   Úsign_challengeÿ  s
    
ÿzCryptosignKey.sign_challengeF)ÚbinaryrJ   c                 C   sB   t | jtjƒr| jj}n| j}|r*| ¡ S |jtjd� d¡S dS )z¿
            Returns the public key part of a signing key or the (public) verification key.

            :returns: The public key in Hex encoding.
            :rtype: str or None
            ©ÚencoderrY   N)	r‡   r˜   r   r—   r�   Úencoder   Z
HexEncoderr]   )r;   r§   r3   r   r   r   Ú
public_key  s    
zCryptosignKey.public_key)rq   r1   rJ   c                 C   sv   |d ks&t |ƒtks&td t |ƒ¡ƒ‚t |ƒtkrDtd t |ƒ¡ƒ‚t|ƒdkrbtd t|ƒ¡ƒ‚| t |¡d|d�S )Núinvalid type {} for commentú%invalid key type {} (expected binary)r(   ú#invalid key length {} (expected 32)F©r3   r”   r1   )r)   r*   Ú
ValueErrorr,   r¡   r"   r   r~   )Úclsrq   r1   r   r   r   Úfrom_pubkey  s    zCryptosignKey.from_pubkey)r3   r1   rJ   c                 C   sv   |d ks&t |ƒtks&td t |ƒ¡ƒ‚t |ƒtkrDtd t |ƒ¡ƒ‚t|ƒdkrbtd t|ƒ¡ƒ‚| t |¡d|d�S )Nr¬   r­   r(   r®   Tr¯   )r)   r*   r°   r,   r¡   r"   r   r—   )r±   r3   r1   r   r   r   Ú
from_bytes)  s    zCryptosignKey.from_bytes)Úfilenamer1   rJ   c              	   C   sl   |dks&t |ƒtks&td t |ƒ¡ƒ‚t |ƒtkr@td |¡ƒ‚t|dƒ�}| ¡ }W 5 Q R X | j||d�S )aÉ  
            Load an Ed25519 (private) signing key (actually, the seed for the key) from a raw file of 32 bytes length.
            This can be any random byte sequence, such as generated from Python code like

                os.urandom(32)

            or from the shell

                dd if=/dev/urandom of=client02.key bs=1 count=32

            :param filename: Filename of the key.
            :param comment: Comment for key (optional).
           Nr¬   zinvalid type {} for filenameÚrb)r1   )r)   r*   r+   r,   ri   rj   r³   )r±   r´   r1   rm   r`   r   r   r   Ú	from_file6  s    zCryptosignKey.from_file)r´   rJ   c              	   C   s2   t |dƒ�}| ¡  d¡ ¡ }W 5 Q R X |  |¡S )a  
            Load an Ed25519 key from a SSH key file. The key file can be a (private) signing
            key (from a SSH private key file) or a (public) verification key (from a SSH
            public key file). A private key file must be passphrase-less.
            rµ   zutf-8)ri   rj   r]   r-   Úfrom_ssh_bytes)r±   r´   rm   r`   r   r   r   Úfrom_ssh_fileP  s    zCryptosignKey.from_ssh_file)r`   rJ   c                 C   sX   d}|  |¡r0t|ƒ\}}tj|tjd�}d}nt|ƒ\}}t |¡}d}| |||d�S )a  
            Load an Ed25519 key from SSH key file. The key file can be a (private) signing
            key (from a SSH private key file) or a (public) verification key (from a SSH
            public key file). A private key file must be passphrase-less.
            rV   r¨   TFr¯   )rZ   re   r   r—   r   Z
RawEncoderr5   r~   )r±   r`   r^   r1   r3   r”   r   r   r   r·   \  s    

zCryptosignKey.from_ssh_bytesr   )Ú
seedphraseÚindexrJ   c              
   C   s„   zddl m} W n0 tk
r@ } ztd |¡ƒ‚W 5 d}~X Y nX d |¡}|||ƒ}t|ƒtksft‚t|ƒdksvt‚|  	|¡}|S )aœ  
            Create a private key from the given BIP-39 mnemonic seed phrase and index,
            which can be used to sign and create signatures.

            :param seedphrase: The BIP-39 seedphrase ("Mnemonic") from which to derive the account.
            :param index: The account index in account hierarchy defined by the seedphrase.
            :return: New instance of :class:`EthereumKey`
            r   )Úmnemonic_to_private_keyz*package autobahn[xbr] not installed ("{}")Nzm/44'/655'/0'/0/{}r(   )
Zautobahn.xbr._mnemonicr»   ÚImportErrorÚRuntimeErrorr,   r)   r¡   rS   r"   r³   )r±   r¹   rº   r»   r4   Zderivation_pathZkey_rawr3   r   r   r   Úfrom_seedphraseq  s    
 


zCryptosignKey.from_seedphrase)ÚkeyfilerJ   c                 C   sŒ   t j |¡rt j |¡s&td |¡ƒ‚t|ƒ}| dd¡}|dkrx| dd¡}|dkrftd |¡ƒ‚qˆt 	t
 |¡¡S nt t
 |¡¡S dS )aY  
            Create a public or private key from reading the given public or private key file.

            Here is an example key file that includes an CryptosignKey private key ``private-key-ed25519``, which
            is loaded in this function, and other fields, which are ignored by this function:

            .. code-block::

                This is a comment (all lines until the first empty line are comments indeed).

                creator: oberstet@intel-nuci7
                created-at: 2022-07-05T12:29:48.832Z
                user-id: oberstet@intel-nuci7
                public-key-ed25519: 7326d9dc0307681cc6940fde0e60eb31a6e4d642a81e55c434462ce31f95deed
                public-adr-eth: 0x10848feBdf7f200Ba989CDf7E3eEB3EC03ae7768
                private-key-ed25519: f750f42b0430e28a2e272c3cedcae4dcc4a1cf33bc345c35099d3322626ab666
                private-key-eth: 4d787714dcb0ae52e1c5d2144648c255d660b9a55eac9deeb80d9f506f501025

            :param keyfile: Path (relative or absolute) to a public or private keys file.
            :return: New instance of :class:`CryptosignKey`
            zkeyfile "{}" is not a filezprivate-key-ed25519Nzpublic-key-ed25519zJneither "private-key-ed25519" nor "public-key-ed25519" found in keyfile {})ÚosÚpathÚexistsÚisfiler½   r,   r   Úgetr   r²   r/   r   r³   )r±   r¿   r   Zprivkey_ed25519_hexZpubkey_ed25519_hexr   r   r   Úfrom_keyfileŽ  s    zCryptosignKey.from_keyfile)NNN)NN)F)N)N)N)r   )rF   rG   rH   rI   Úboolr   r
   Úintr*   r=   Úpropertyr•   r–   r1   rŸ   r”   r¡   r¢   r   r¦   r   r«   Úclassmethodr²   r³   r¶   r¸   r·   r¾   rÅ   r   r   r   r   r   ¸  sR       ÿ
  ÿ  ÿ
 ÿc                   @   sÜ  e Zd ZdZdddddddd	d
dddgZd=ee ee ee ee ee ee ee ee ee ee ee ee dœdd„Z	e
ee dœdd„ƒZejee dœdd„ƒZe
ee dœdd„ƒZejee dœdd„ƒZe
ee dœdd„ƒZejee dœdd„ƒZe
ee dœdd„ƒZejee dœdd„ƒZe
ee dœd d!„ƒZejee dœd"d!„ƒZe
ee dœd#d$„ƒZejee dœd%d$„ƒZe
ee dœd&d'„ƒZejee dœd(d'„ƒZe
ee dœd)d*„ƒZejee dœd+d*„ƒZe
ee dœd,d-„ƒZejee dœd.d-„ƒZe
ee dœd/d0„ƒZejee dœd1d0„ƒZe
ee dœd2d3„ƒZejee dœd4d3„ƒZe
ee dœd5d6„ƒZejee dœd7d6„ƒZeeeef d d8œd9d:„ƒZeeef dœd;d<„ZdS )>ÚCryptosignAuthextraz3
        WAMP-Cryptosign authextra object.
        Ú_pubkeyÚ
_trustrootÚ
_challengeÚ_channel_bindingÚ_channel_idÚ_realmÚ	_chain_idÚ	_block_noÚ	_delegateÚ_seederÚ
_bandwidthÚ
_signatureN)rq   rƒ   Úchannel_bindingr¤   Ú	trustrootÚrealmÚchain_idÚblock_noÚdelegateÚseederÚ	bandwidthr£   c                 C   sü   |rt |ƒdkst‚|r(t |ƒdks(t‚|r<t |ƒdks<t‚|rL|dksLt‚|r`t |ƒdks`t‚|rtt |ƒdkstt‚|	rˆt |	ƒdksˆt‚|
rœt |
ƒdksœt‚|r°t |ƒdks°t‚|| _|| _|| _|| _|| _|| _|| _|| _	|	| _
|
| _|| _|| _d S )Nr(   é   ©r†   éA   )r"   rS   rË   rÌ   rÍ   rÎ   rÏ   rÐ   rÑ   rÒ   rÓ   rÔ   rÕ   rÖ   )r;   rq   rƒ   r×   r¤   rØ   rÙ   rÚ   rÛ   rÜ   rÝ   rÞ   r£   r   r   r   r=   Ò  s<    zCryptosignAuthextra.__init__r�   c                 C   s   | j S r>   )rË   r?   r   r   r   rq     s    zCryptosignAuthextra.pubkey)rB   c                 C   s"   |d kst |ƒdkst‚|| _d S ©Nrß   )r"   rS   rË   ©r;   rB   r   r   r   rq   
  s    c                 C   s   | j S r>   )rÌ   r?   r   r   r   rØ     s    zCryptosignAuthextra.trustrootc                 C   s"   |d kst |ƒdkst‚|| _d S râ   )r"   rS   rÌ   rã   r   r   r   rØ     s    c                 C   s   | j S r>   )rÍ   r?   r   r   r   rƒ     s    zCryptosignAuthextra.challengec                 C   s"   |d kst |ƒdkst‚|| _d S ©Nr(   )r"   rS   rÍ   rã   r   r   r   rƒ     s    c                 C   s   | j S r>   )rÎ   r?   r   r   r   r×   !  s    z#CryptosignAuthextra.channel_bindingc                 C   s   |d ks|dkst ‚|| _d S )Nrà   )rS   rÎ   rã   r   r   r   r×   %  s    c                 C   s   | j S r>   )rÏ   r?   r   r   r   r¤   *  s    zCryptosignAuthextra.channel_idc                 C   s"   |d kst |ƒdkst‚|| _d S rä   )r"   rS   rÏ   rã   r   r   r   r¤   .  s    c                 C   s   | j S r>   )rÐ   r?   r   r   r   rÙ   3  s    zCryptosignAuthextra.realmc                 C   s"   |d kst |ƒdkst‚|| _d S râ   )r"   rS   rÐ   rã   r   r   r   rÙ   7  s    c                 C   s   | j S r>   )rÑ   r?   r   r   r   rÚ   <  s    zCryptosignAuthextra.chain_idc                 C   s   |d ks|dkst ‚|| _d S r7   )rS   rÑ   rã   r   r   r   rÚ   @  s    c                 C   s   | j S r>   )rÒ   r?   r   r   r   rÛ   E  s    zCryptosignAuthextra.block_noc                 C   s   |d ks|dkst ‚|| _d S r7   )rS   rÒ   rã   r   r   r   rÛ   I  s    c                 C   s   | j S r>   )rÓ   r?   r   r   r   rÜ   N  s    zCryptosignAuthextra.delegatec                 C   s"   |d kst |ƒdkst‚|| _d S râ   )r"   rS   rÓ   rã   r   r   r   rÜ   R  s    c                 C   s   | j S r>   )rÔ   r?   r   r   r   rÝ   W  s    zCryptosignAuthextra.seederc                 C   s"   |d kst |ƒdkst‚|| _d S râ   )r"   rS   rÔ   rã   r   r   r   rÝ   [  s    c                 C   s   | j S r>   )rÕ   r?   r   r   r   rÞ   `  s    zCryptosignAuthextra.bandwidthc                 C   s   |d ks|dkst ‚|| _d S r7   )rS   rÕ   rã   r   r   r   rÞ   d  s    c                 C   s   | j S r>   )rÖ   r?   r   r   r   r£   i  s    zCryptosignAuthextra.signaturec                 C   s"   |d kst |ƒdkst‚|| _d S )Nrá   )r"   rS   rÖ   rã   r   r   r   r£   m  s    r    c                 C   sR  t ƒ }|  dd ¡}|d k	r`t|ƒtkr8td t|ƒ¡ƒ‚t|ƒdkrVtd t|ƒ¡ƒ‚t|ƒ|_|  dd ¡}|d k	rºt|ƒtkr’td t|ƒ¡ƒ‚t|ƒdkr°td t|ƒ¡ƒ‚t|ƒ|_	|  dd ¡}|d k	�rt|ƒtkrîtd	 t|ƒ¡ƒ‚|d
k�rtd |¡ƒ‚||_
|  dd ¡}|d k	�rlt|ƒtk�rBtd t|ƒ¡ƒ‚t|ƒdk�rbtd t|ƒ¡ƒ‚t|ƒ|_|  dd ¡}|d k	�rÒt|ƒtk�r¢td t|ƒ¡ƒ‚t |¡�sÀtd t|ƒ¡ƒ‚t|dd … ƒ|_|  dd ¡}|d k	�rît|ƒtk�rtd t|ƒ¡ƒ‚| dd ¡}|d k	�rDt|ƒtk�r>td t|ƒ¡ƒ‚||_| dd ¡}	|	d k	�r€t|	ƒtk�rztd t|	ƒ¡ƒ‚|	|_| dd ¡}
|
d k	�ræt|
ƒtk�r¶td t|
ƒ¡ƒ‚t |
¡�sÔtd t|
ƒ¡ƒ‚t|
dd … ƒ|_| dd ¡}|d k	�rLt|ƒtk�rtd t|ƒ¡ƒ‚t |¡�s:td t|ƒ¡ƒ‚t|dd … ƒ|_| dd ¡}|d k	�r²t|ƒtk�r‚td  t|ƒ¡ƒ‚t |¡�s td! t|ƒ¡ƒ‚t|dd … ƒ|_| d"d ¡}|d k	�rît|ƒtk�rètd# t|ƒ¡ƒ‚||_|  d$d ¡}|d k	�rNt|ƒtk�r$td% t|ƒ¡ƒ‚t|ƒd&k�rDtd' t|ƒ¡ƒ‚t|ƒ|_|S )(Nrq   zinvalid type {} for pubkeyrg   zinvalid length {} of pubkeyrƒ   zinvalid type {} for challengezinvalid length {} of challenger×   z#invalid type {} for channel_bindingrà   z&invalid value "{}" for channel_bindingr¤   zinvalid type {} for channel_idzinvalid length {} of channel_idrØ   z1invalid type {} for trustroot - expected a stringz?invalid value "{}" for trustroot - expected an Ethereum addressé   Úreservationzinvalid type {} for reservationrÚ   z>invalid type {} for reservation.chain_id - expected an integerrÛ   z>invalid type {} for reservation.block_no - expected an integerrÙ   z9invalid type {} for reservation.realm - expected a stringzGinvalid value "{}" for reservation.realm - expected an Ethereum addressrÜ   z<invalid type {} for reservation.delegate - expected a stringzJinvalid value "{}" for reservation.delegate - expected an Ethereum addressrÝ   z:invalid type {} for reservation.seeder - expected a stringzHinvalid value "{}" for reservation.seeder - expected an Ethereum addressrÞ   z?invalid type {} for reservation.bandwidth - expected an integerr£   zinvalid type {} for signatureé‚   zinvalid length {} of signature)rÊ   rÄ   r)   r*   r°   r,   r"   r   rË   rÍ   rÎ   rÏ   r   ÚmatchrÌ   ÚdictrÇ   rÑ   rÒ   rÐ   rÓ   rÔ   rÕ   rÖ   )r   Úobjrq   rƒ   r×   r¤   rØ   ræ   rÚ   rÛ   rÙ   rÜ   rÝ   rÞ   r£   r   r   r   Úparser  s¨    















zCryptosignAuthextra.parsec                 C   s`  i }| j d k	r t| j ƒ ¡ |d< | jd k	r<t| jƒ ¡ |d< | jd k	rP| j|d< | jd k	rlt| jƒ ¡ |d< | jd k	rŒdt| jƒ ¡  |d< i }| jd k	r¤| j|d< | jd k	r¸| j|d< | j	d k	rØdt| j	ƒ ¡  |d	< | j
d k	rødt| j
ƒ ¡  |d
< | jd k	�rdt| jƒ ¡  |d< | jd k	�r0| j|d< |�r>||d< | jd k	�r\t| jƒ ¡ |d< |S )Nrq   rƒ   r×   r¤   Ú0xrØ   rÚ   rÛ   rÙ   rÜ   rÝ   rÞ   ræ   r£   )rË   r   r]   rÍ   rÎ   rÏ   rÌ   rÑ   rÒ   rÐ   rÓ   rÔ   rÕ   rÖ   )r;   Úresræ   r   r   r   Úmarshal×  s:    












zCryptosignAuthextra.marshal)NNNNNNNNNNNN)rF   rG   rH   rI   Ú	__slots__r   r¡   r*   rÇ   r=   rÈ   rq   ÚsetterrØ   rƒ   r×   r¤   rÙ   rÚ   rÛ   rÜ   rÝ   rÞ   r£   Ústaticmethodr   r   rë   rî   r   r   r   r   rÊ   ¿  s¶   ô            íí4drÊ   Zformat_challenger¦   )rs   )5rÀ   r/   r   r   r   Útypingr   r   r   r   r   rŒ   Úautobahnr	   Zautobahn.wamp.interfacesr
   r   Zautobahn.wamp.typesr   Zautobahn.wamp.messager   Zautobahn.utilr   Ú__all__Znaclr   r   r   Znacl.signingr   r¼   r   r   r   r%   r5   r6   rÇ   r¡   rU   re   ro   rr   r}   r‚   r*   rŠ   r“   Úobjectr   ÚregisterrÊ   Úextendr   r   r   r   Ú<module>   sP   ÿ

&d
+&,  
  A