U
    •uÄcÁ  ã                   @   sº   d dl mZmZ d dlmZmZ dgZerzz(d dlmZ d dl	m
Z
 d dlmZ W n ek
rj   dZY nX dZe d	¡ er¶d d
lZd dlmZ d dl mZmZmZ G dd	„ d	eƒZd
S )é    )ÚHAS_CRYPTOSIGNÚCryptosignKey)ÚinlineCallbacksÚreturnValueÚHAS_CRYPTOSIGN_SSHAGENT)ÚFactory)ÚUNIXClientEndpoint)ÚSSHAgentClientFTÚSSHAgentCryptosignKeyN)Úsigning)Ú_read_ssh_ed25519_pubkeyÚ_unpackÚ_packc                   @   s0   e Zd ZdZd	dd„Zed
dd„ƒZdd„ ZdS )r
   aA  
        A WAMP-cryptosign signing key that is a proxy to a private Ed25510 key
        actually held in SSH agent.

        An instance of this class must be create via the class method new().
        The instance only holds the public key part, whereas the private key
        counterpart is held in SSH agent.
        Nc                 C   s(   t  | ||¡ |sddlm} || _d S )Nr   ©Úreactor)r   Ú__init__Útwisted.internetr   Ú_reactor)ÚselfÚkeyÚcommentr   © r   ú^/var/www/html/VPFITNESS/school/venv/lib/python3.8/site-packages/autobahn/twisted/cryptosign.pyr   C   s    zSSHAgentCryptosignKey.__init__c                    s„   t stdƒ‚tˆƒ\‰}ˆs(ddlm‰ dtjkr:tdƒ‚tƒ }d|_t	|_
tˆtjd ƒ}| |¡}t‡ ‡‡fdd„ƒ}| |¡S )	zµ
            Create a proxy for a key held in SSH agent.

            :param pubkey: A string with a public Ed25519 key in SSH format.
            :type pubkey: unicode
            z7SSH agent integration is not supported on this platformr   r   ÚSSH_AUTH_SOCKúno ssh-agent is running!Fc           
      3   s–   |   ¡ V }d }d }|D ]H\}}t|ƒ}|d  d¡}|dkr|\}}|ˆkr|}| d¡} q`q| j ¡  |rŠt |¡}	tˆ |	|ˆƒƒ ntdƒ‚d S )Nr   Úutf8ússh-ed25519z!Ed25519 key not held in ssh-agent)	ZrequestIdentitiesr   ÚdecodeÚ	transportÚloseConnectionr   Z	VerifyKeyr   Ú	Exception)
ÚagentÚkeysZkey_dataZkey_commentÚblobr   ÚrawÚalgoZ_pubkeyr   ©ÚclsÚpubkeyr   r   r   Ú
on_connectb   s"    



z-SSHAgentCryptosignKey.new.<locals>.on_connect)r   r    r   r   r   ÚosÚenvironr   Únoisyr	   Úprotocolr   Úconnectr   ÚaddCallback)r'   r(   r   Ú_ÚfactoryÚendpointÚdr)   r   r&   r   ÚnewI   s    

zSSHAgentCryptosignKey.newc                    s\   dt jkrtdƒ‚tƒ }d|_t|_tˆjt jd ƒ}| 	|¡}t
‡ ‡fdd„ƒ}| |¡S )Nr   r   Fc                 3   sH   t d ¡ ˆjdd�gƒ}|  |ˆ ¡V }t|ƒ\}}| j ¡  t|ƒ d S )Nr   T)Úbinary)r   ÚencodeZ
public_keyZsignDatar   r   r   r   )r!   r#   Zsignature_blobr%   Ú	signature©Ú	challenger   r   r   r)   ‰   s
    
z.SSHAgentCryptosignKey.sign.<locals>.on_connect)r*   r+   r    r   r,   r	   r-   r   r   r.   r   r/   )r   r9   r1   r2   r3   r)   r   r8   r   Úsign   s    

zSSHAgentCryptosignKey.sign)NN)NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úclassmethodr4   r:   r   r   r   r   r
   9   s
   	
5)Zautobahn.wamp.cryptosignr   r   Ztwisted.internet.deferr   r   Ú__all__Ztwisted.internet.protocolr   Ztwisted.internet.endpointsr   Ztwisted.conch.ssh.agentr	   ÚImportErrorr   Úappendr*   Znaclr   r   r   r   r
   r   r   r   r   Ú<module>   s"   ÿ

