o
    èó·iá™  ã                   @   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yf   dZY nw dZe  d¡ dd„ Z!dd„ Z"dd„ Z#G dd„ dƒZ$de%de&fdd„Z'dd„ Z(dd„ Z)dd „ Z*d3d"d#„Z+d$d%„ Z,erÛd&ed'ee& d(ee- de&fd)d*„Z.d+e&d,ede&fd-d.„Z/G d/d„ de0ƒZ1e 2e1¡ G d0d1„ d1e0ƒZ3e 4g d2¢¡ dS dS )4é    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   sT   g }| r(t  d| dd… ¡d }| d|d … | d| d… }} | |¡ | s|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ÚpartsÚdlenÚdata© r   ú^C:\Users\psant\Downloads\PAF backend\school\venv\Lib\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   ó    N)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 n tyO } ztd |¡ƒ‚d}~ww 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   ÚalgoÚcommentÚblobÚkeyÚer   r   r   Ú_read_ssh_ed25519_pubkeyT   s$   

€ÿr7   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)r:   r;   ©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)r;   r<   r,   r:   )r=   ÚsizeÚvaluer   r   r   Ú	get_bytes‡   s
   z_SSHPacketReader.get_bytesc                 C   s   t  d|  d¡¡d S )Nr   r   r   )r   r   rE   rA   r   r   r   Ú
get_uint32�   s   z_SSHPacketReader.get_uint32c                 C   s   |   |  ¡ ¡S r@   )rE   rF   rA   r   r   r   Ú
get_string’   s   z_SSHPacketReader.get_stringN)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r?   rB   rE   rF   rG   r   r   r   r   r8   z   s    r8   rC   Úreturnc                 C   s:   d|   krdk sJ ‚ J ‚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(   )r$   Úrange)rC   r   r   r   Ú_makepad–   s   rV   c                 C   sä  d}d}d}|   |¡r|  |¡stdƒ‚|  |¡}| t|ƒ|… } d dd„ |  ¡ D ƒ¡} t | ¡}|t|ƒd… }t	|ƒ}| 
¡ }| 
¡ }| 
¡  | ¡ }	| 
¡  | 
¡ }
| ¡ }d	}|d
krdtdƒ‚|d
krltdƒ‚|	dkrwtd |	¡ƒ‚|r}tdƒ‚t	|
ƒ}| ¡  | ¡  | 
¡ }|dkr›td | d¡¡ƒ‚| 
¡ }| 
¡ }t|ƒtjkr®tdƒ‚t|ƒtjkr¹t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.   rQ   r   r   r   rT   Â   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/   r0   r1   r8   rG   rF   rB   r-   Údecoder   Zcrypto_sign_PUBLICKEYBYTESZcrypto_sign_SECRETKEYBYTESrV   Zcrypto_sign_SEEDBYTES)r   Ú	SSH_BEGINZSSH_ENDZOPENSSH_KEY_V1Zssh_endr4   r>   Zcipher_nameZkdfZnkeysÚkey_dataÚmacÚ
block_sizeÚalgZvkÚskr3   ÚpadÚseedr   r   r   Ú_read_ssh_ed25519_privkey›   s\   

$
rg   c                 C   ól   t | ƒ�(}t | ¡  ¡ d ¡dd… }t|ƒdkr#td t|ƒ¡ƒ‚|W  d  ƒ S 1 s/w   Y  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©Úopenr0   r1   ÚreadÚ
splitlinesr#   r,   r-   )Úsignature_fileÚfÚsigr   r   r   Ú_read_signify_ed25519_signatureÿ   ó   
$ûrr   c                 C   rh   )zŒ
    Read a public key from a Ed25519 key pair created with OpenBSD signify.

    http://man.openbsd.org/OpenBSD-current/man1/signify.1
    r(   ri   Nr)   z@bogus Ed25519 public key: raw key length was {}, but expected 32rk   )Úpubkey_filerp   Úpubkeyr   r   r   Ú_read_signify_ed25519_pubkey  rs   rv   Útextc           	   	   C   s
  |dv sJ ‚ddl }t| ƒ�m}| ¡  ¡ d }|jd|jd�}| |¡ |dkrSddl}| ¡ �}|j	|dd	� | 
¡ W  d  ƒ W  d  ƒ S 1 sMw   Y  n |d
kroddl}|j|jjjd�}| ¡ W  d  ƒ S tdƒ‚W d  ƒ dS 1 s~w   Y  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
    )rw   Úsvgr   Nr(   r'   )Zbox_sizeZerror_correctionrw   T)ÚoutÚinvertrx   )Zimage_factoryzlogic error)Úqrcoderl   rm   rn   ZQRCodeZERROR_CORRECT_LZadd_dataÚioÚStringIOZprint_asciiÚgetvalueZqrcode.image.svgZ
make_imageÚimagerx   ZSvgImageZ	to_stringr,   )	rt   Úmoder{   rp   ru   Zqrr|   Zdata_bufferr   r   r   r   Ú#_qrcode_from_signify_ed25519_pubkey  s0   
ÿ

þö
ï÷"ö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)rv   r   Ú	VerifyKeyrr   Úverify)rt   ro   Úmessageru   Ú
verify_keyrq   r   r   r   Ú!_verify_signify_ed25519_signatureF  s   
r†   Ú	challengeÚchannel_id_rawÚchannel_id_typec                 C   sÒ   t | tƒstd t| ƒ¡ƒ‚d| jvrtdƒ‚| jd }t|ƒtkr+td t|ƒ¡ƒ‚t|ƒdkr:td t|ƒ¡ƒ‚t 	|¡}|dkrZt|ƒdksRJ d	 t|ƒ¡ƒ‚t
 ||¡}|S |d
u rb|}|S J d |¡ƒ‚)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)rj   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#   r0   r   r	   Úxor)r‡   rˆ   r‰   Zchallenge_hexZchallenge_rawr   r   r   r   Ú_format_challengen  s8   
	ÿ


ÿÿÿÿúþrŽ   r   Úsigner_funcc                    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 )NrZ   )r0   r   r^   ÚtxaioÚresolve)Zsignature_rawZsignature_hexZdata_hexrq   ©Zd2r   r   r   Úprocessª  s   z _sign_challenge.<locals>.processN)r�   Úcreate_futureZadd_callbacks)r   r�   Zd1r“   r   r’   r   Ú_sign_challengeš  s
   

r•   c                   @   sº  e Zd ZdZ		d7dedee dee dee ddf
dd	„Z	e
ded
 fdd„ƒZe
dee fdd„ƒZe
dee fdd„ƒZe
defdd„ƒZe
defdd„ƒZdedefdd„Z		d8dedee dee defdd„Zd9dedeeef fdd „Zed:d!edee dd fd"d#„ƒZed:d$edee dd fd%d&„ƒZed:d'edee dd fd(d)„ƒZed'edd fd*d+„ƒZed,edd fd-d.„ƒZed;d0ed1edd fd2d3„ƒZed4edd fd5d6„ƒZdS )<r   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_nor3   rL   c                 C   sp   t |tjƒst |tjƒstd t|ƒ¡ƒ‚|rt |tjƒs'|s%t |tjƒs'J ‚|| _|| _|| _	|| _
|| _d S )Nzinvalid type {} for key)r‹   r   r‚   Ú
SigningKeyr,   r-   r*   Ú_keyÚ	_can_signÚ_security_moduleÚ_key_noÚ_comment)r=   r5   r–   r—   r˜   r3   r   r   r   r?   ¾  s   $
zCryptosignKey.__init__r
   c                 C   ó   | j S )z[
            Implements :meth:`autobahn.wamp.interfaces.IKey.security_module`.
            N)rœ   rA   r   r   r   r—   Ê  ó   zCryptosignKey.security_modulec                 C   rŸ   )zR
            Implements :meth:`autobahn.wamp.interfaces.IKey.key_no`.
            N)r�   rA   r   r   r   r˜   Ñ  r    zCryptosignKey.key_noc                 C   rŸ   )zS
            Implements :meth:`autobahn.wamp.interfaces.IKey.comment`.
            N)rž   rA   r   r   r   r3   Ø  r    zCryptosignKey.commentc                 C   s   dS )zT
            Implements :meth:`autobahn.wamp.interfaces.IKey.key_type`.
            Ú
cryptosignNr   rA   r   r   r   Úkey_typeß  s   zCryptosignKey.key_typec                 C   rŸ   )zT
            Implements :meth:`autobahn.wamp.interfaces.IKey.can_sign`.
            N)r›   rA   r   r   r   r–   æ  r    zCryptosignKey.can_signr   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 binaryN)	r›   r,   r*   Úbytesrš   Úsignr�   Zcreate_future_successÚ	signature)r=   r   rq   r   r   r   r¤   í  s   zCryptosignKey.signr‡   Ú
channel_idr‰   c                 C   s2   |j dv sJ d |j ¡ƒ‚t|||ƒ}t|| jƒS )zd
            Implements :meth:`autobahn.wamp.interfaces.ICryptosignKey.sign_challenge`.
            )r¡   zcryptosign-proxyz0unexpected cryptosign challenge with method "{}"N)Úmethodr-   rŽ   r•   r¤   )r=   r‡   r¦   r‰   r   r   r   r   Úsign_challengeÿ  s
   
ÿzCryptosignKey.sign_challengeFÚbinaryc                 C   s>   t | jtjƒr| jj}n| j}|r| ¡ S |jtjd� 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
            ©ÚencoderrZ   N)	r‹   rš   r   r™   r…   Úencoder   Z
HexEncoderr^   )r=   r©   r5   r   r   r   Ú
public_key  s   
zCryptosignKey.public_keyru   c                 C   óv   |d u st |ƒtkstd t |ƒ¡ƒ‚t |ƒtkr"td t |ƒ¡ƒ‚t|ƒdkr1td t|ƒ¡ƒ‚| t |¡d|d�S )Núinvalid type {} for commentú%invalid key type {} (expected binary)r)   ú#invalid key length {} (expected 32)F©r5   r–   r3   )r*   r+   Ú
ValueErrorr-   r£   r#   r   r‚   )Úclsru   r3   r   r   r   Úfrom_pubkey  ó   zCryptosignKey.from_pubkeyr5   c                 C   r®   )Nr¯   r°   r)   r±   Tr²   )r*   r+   r³   r-   r£   r#   r   r™   )r´   r5   r3   r   r   r   Ú
from_bytes)  r¶   zCryptosignKey.from_bytesÚfilenamec                 C   s€   |du st |ƒtkstd t |ƒ¡ƒ‚t |ƒtkr td |¡ƒ‚t|dƒ�}| ¡ }W d  ƒ n1 s4w   Y  | 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)r3   )r*   r+   r,   r-   rl   rm   r·   )r´   r¸   r3   rp   r`   r   r   r   Ú	from_file6  s   
ÿzCryptosignKey.from_filec                 C   sF   t |dƒ�}| ¡  d¡ ¡ }W d  ƒ n1 sw   Y  |  |¡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-8N)rl   rm   r^   r.   Úfrom_ssh_bytes)r´   r¸   rp   r`   r   r   r   Úfrom_ssh_fileP  s   ÿ
zCryptosignKey.from_ssh_filer`   c                 C   sX   d}|  |¡rt|ƒ\}}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.
            rW   rª   TFr²   N)r[   rg   r   r™   r   Z
RawEncoderr7   r‚   )r´   r`   r_   r3   r5   r–   r   r   r   r»   \  s   

zCryptosignKey.from_ssh_bytesr   Ú
seedphraseÚindexc              
   C   sz   zddl m} W n ty } ztd |¡ƒ‚d}~ww d |¡}|||ƒ}t|ƒtks.J ‚t|ƒdks6J ‚|  |¡}|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£   r#   r·   )r´   r½   r¾   r¿   r6   Zderivation_pathZkey_rawr5   r   r   r   Úfrom_seedphraseq  s   
€ÿ


zCryptosignKey.from_seedphraseÚkeyfilec                 C   s„   t j |¡rt j |¡std |¡ƒ‚t|ƒ}| dd¡}|du r:| dd¡}|du r2td |¡ƒ‚t 	t
 |¡¡S t t
 |¡¡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µ   r0   r   r·   )r´   rÃ   r   Zprivkey_ed25519_hexZpubkey_ed25519_hexr   r   r   Úfrom_keyfileŽ  s   zCryptosignKey.from_keyfile)NNN)NN)Fr@   )r   )rH   rI   rJ   rK   Úboolr   r
   Úintr+   r?   Úpropertyr—   r˜   r3   r¢   r–   r£   r¤   r   r¨   r   r­   Úclassmethodrµ   r·   rº   r¼   r»   rÂ   rÉ   r   r   r   r   r   ¸  sX    ÿÿÿ
ÿÿÿ
ÿc                   @   sø  e Zd ZdZg d¢Z												d=dee dee dee dee dee d	ee d
ee dee dee dee dee dee fdd„Z	e
dee fdd„ƒZejdee fdd„ƒZe
dee fdd„ƒZejdee fdd„ƒZe
dee fdd„ƒZejdee fdd„ƒZe
dee fdd„ƒZejdee fdd„ƒZe
dee fd d!„ƒZejdee fd"d!„ƒZe
dee fd#d$„ƒZejdee fd%d$„ƒZe
dee fd&d'„ƒZejdee fd(d'„ƒZe
dee fd)d*„ƒZejdee fd+d*„ƒZe
dee fd,d-„ƒZejdee fd.d-„ƒZe
dee fd/d0„ƒZejdee fd1d0„ƒZe
dee fd2d3„ƒZejdee fd4d3„ƒZe
dee fd5d6„ƒZejdee fd7d6„ƒZed8eeef dd fd9d:„ƒZdeeef f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Ú
_signatureNru   r‡   Úchannel_bindingr¦   Ú	trustrootÚrealmÚchain_idÚblock_noÚdelegateÚseederÚ	bandwidthr¥   c                 C   sü   |r
t |ƒdks
J ‚|rt |ƒdksJ ‚|rt |ƒdksJ ‚|r&|dv s&J ‚|r0t |ƒdks0J ‚|r:t |ƒdks:J ‚|	rDt |	ƒdksDJ ‚|
rNt |
ƒdksNJ ‚|rXt |ƒdksXJ ‚|| _|| _|| _|| _|| _|| _|| _|| _|	| _	|
| _
|| _|| _d S )Nr)   é   ©rŠ   éA   )r#   rÏ   rÐ   rÑ   rÒ   rÓ   rÔ   rÕ   rÖ   r×   rØ   rÙ   rÚ   )r=   ru   r‡   rÛ   r¦   rÜ   rÝ   rÞ   rß   rà   rá   râ   r¥   r   r   r   r?   Ò  s<   
zCryptosignAuthextra.__init__rL   c                 C   rŸ   r@   )rÏ   rA   r   r   r   ru     ó   zCryptosignAuthextra.pubkeyrD   c                 C   ó"   |d u st |ƒdksJ ‚|| _d S ©Nrã   )r#   rÏ   ©r=   rD   r   r   r   ru   
  ó   
c                 C   rŸ   r@   )rÐ   rA   r   r   r   rÜ     ræ   zCryptosignAuthextra.trustrootc                 C   rç   rè   )r#   rÐ   ré   r   r   r   rÜ     rê   c                 C   rŸ   r@   )rÑ   rA   r   r   r   r‡     ræ   zCryptosignAuthextra.challengec                 C   rç   ©Nr)   )r#   rÑ   ré   r   r   r   r‡     rê   c                 C   rŸ   r@   ©rÒ   rA   r   r   r   rÛ   !  ræ   z#CryptosignAuthextra.channel_bindingc                 C   s   |d u s
|dv s
J ‚|| _ d S )Nrä   rì   ré   r   r   r   rÛ   %  ó   
c                 C   rŸ   r@   )rÓ   rA   r   r   r   r¦   *  ræ   zCryptosignAuthextra.channel_idc                 C   rç   rë   )r#   rÓ   ré   r   r   r   r¦   .  rê   c                 C   rŸ   r@   )rÔ   rA   r   r   r   rÝ   3  ræ   zCryptosignAuthextra.realmc                 C   rç   rè   )r#   rÔ   ré   r   r   r   rÝ   7  rê   c                 C   rŸ   r@   ©rÕ   rA   r   r   r   rÞ   <  ræ   zCryptosignAuthextra.chain_idc                 C   ó   |d u s
|dks
J ‚|| _ d S r9   rî   ré   r   r   r   rÞ   @  rí   c                 C   rŸ   r@   ©rÖ   rA   r   r   r   rß   E  ræ   zCryptosignAuthextra.block_noc                 C   rï   r9   rð   ré   r   r   r   rß   I  rí   c                 C   rŸ   r@   )r×   rA   r   r   r   rà   N  ræ   zCryptosignAuthextra.delegatec                 C   rç   rè   )r#   r×   ré   r   r   r   rà   R  rê   c                 C   rŸ   r@   )rØ   rA   r   r   r   rá   W  ræ   zCryptosignAuthextra.seederc                 C   rç   rè   )r#   rØ   ré   r   r   r   rá   [  rê   c                 C   rŸ   r@   ©rÙ   rA   r   r   r   râ   `  ræ   zCryptosignAuthextra.bandwidthc                 C   rï   r9   rñ   ré   r   r   r   râ   d  rí   c                 C   rŸ   r@   )rÚ   rA   r   r   r   r¥   i  ræ   zCryptosignAuthextra.signaturec                 C   rç   )Nrå   )r#   rÚ   ré   r   r   r   r¥   m  rê   r   c                 C   s@  t ƒ }|  dd ¡}|d ur0t|ƒtkrtd t|ƒ¡ƒ‚t|ƒdkr+td t|ƒ¡ƒ‚t|ƒ|_|  dd ¡}|d ur]t|ƒtkrItd t|ƒ¡ƒ‚t|ƒdkrXtd t|ƒ¡ƒ‚t|ƒ|_	|  dd ¡}|d ur„t|ƒtkrvtd	 t|ƒ¡ƒ‚|d
vr�td |¡ƒ‚||_
|  dd ¡}|d ur±t|ƒtkr�td t|ƒ¡ƒ‚t|ƒdkr¬td t|ƒ¡ƒ‚t|ƒ|_|  dd ¡}|d urát|ƒtkrÊtd t|ƒ¡ƒ‚t |¡sØtd t|ƒ¡ƒ‚t|dd … ƒ|_|  dd ¡}|d u�rît|ƒtkrûtd t|ƒ¡ƒ‚| dd ¡}|d u�rt|ƒtk�rtd t|ƒ¡ƒ‚||_| dd ¡}	|	d u�r7t|	ƒtk�r4td t|	ƒ¡ƒ‚|	|_| dd ¡}
|
d u�rjt|
ƒtk�rRtd t|
ƒ¡ƒ‚t |
¡�satd t|
ƒ¡ƒ‚t|
dd … ƒ|_| dd ¡}|d u�r�t|ƒtk�r…td t|ƒ¡ƒ‚t |¡�s”td t|ƒ¡ƒ‚t|dd … ƒ|_| dd ¡}|d u�rÐt|ƒtk�r¸td  t|ƒ¡ƒ‚t |¡�sÇtd! t|ƒ¡ƒ‚t|dd … ƒ|_| d"d ¡}|d u�rît|ƒtk�rëtd# t|ƒ¡ƒ‚||_|  d$d ¡}|d u�rt|ƒtk�r	td% t|ƒ¡ƒ‚t|ƒd&k�rtd' t|ƒ¡ƒ‚t|ƒ|_|S )(Nru   zinvalid type {} for pubkeyrj   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   Úobjru   r‡   rÛ   r¦   rÜ   ró   rÞ   rß   rÝ   rà   rá   râ   r¥   r   r   r   Úparser  s¨   












zCryptosignAuthextra.parsec                 C   sX  i }| j d urt| j ƒ ¡ |d< | jd urt| jƒ ¡ |d< | jd ur(| j|d< | jd ur6t| jƒ ¡ |d< | jd urFdt| jƒ ¡  |d< i }| jd urR| j|d< | jd ur\| j|d< | j	d urldt| j	ƒ ¡  |d	< | j
d ur|dt| j
ƒ ¡  |d
< | jd urŒdt| jƒ ¡  |d< | jd ur–| j|d< |rœ||d< | jd urªt| jƒ ¡ |d< |S )Nru   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)rH   rI   rJ   rK   Ú	__slots__r   r£   r+   rË   r?   rÌ   ru   ÚsetterrÜ   r‡   rÛ   r¦   rÝ   rÞ   rß   rà   rá   râ   r¥   Ústaticmethodr   r   rø   rû   r   r   r   r   rÎ   ¿  s¶    íÿþýüùôóòñðï
í4drÎ   )r   Zformat_challenger¨   rÎ   )rw   )5rÄ   r0   r   r   r   Útypingr   r   r   r   r   r�   Z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&   r7   r8   rË   r£   rV   rg   rr   rv   r�   r†   r+   rŽ   r•   Úobjectr   ÚregisterrÎ   Úextendr   r   r   r   Ú<module>   s`   ÿÿ
&d
+&",  
  A � � � � �é