o
    ç÷¡gQ  ã                   @   s¶   d Z ddlZddlZddlZddlZddlmZ ddlm	Z	 ddl
ZddlmZ dZdZd	Zd
d„ Zdd„ Ze ¡ d dkrBejZnejZG dd„ dejƒZdd„ ZG dd„ dƒZdS )zP
Functions for communicating with Pageant, the basic windows ssh agent program.
é    N)Ú	zero_byte)Úbé   )Ú_winapil   ºPœ  i    éJ   c                   C   s   t jj dd¡S )Ns   Pageant)ÚctypesÚwindllÚuser32ÚFindWindowA© r   r   ú?/usr/local/lib/python3.10/dist-packages/paramiko/win_pageant.pyÚ_get_pageant_window_object+   s   r   c                   C   s
   t tƒ ƒS )zÂ
    Check to see if there is a "Pageant" agent we can talk to.

    This checks both if we have the required libraries (win32all or ctypes)
    and if there is a Pageant currently running.
    )Úboolr   r   r   r   r   Úcan_talk_to_agent/   s   
r   Ú64bitc                   @   s,   e Zd ZdZdefdejjfdejfgZ	dS )ÚCOPYDATASTRUCTzy
    ctypes implementation of
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms649010%28v=vs.85%29.aspx
    Únum_dataÚ	data_sizeÚdata_locN)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	ULONG_PTRr   ÚwintypesÚDWORDÚc_void_pÚ_fields_r   r   r   r   r   ?   s    
ýr   c              	   C   sú   t ƒ }|sdS dt ¡ d›�}t |tt ¡ ¡}|�Y | | ¡ t dt	|ƒt
 ¡}| ¡ \}}tt||ƒ}tjj |tt |¡t |¡¡}|dkrj| d¡ | d¡}	t d|	¡d }
|	| |
¡ W  d  ƒ S 	 W d  ƒ dS 1 svw   Y  dS )za
    Communication with the Pageant process is done through a shared
    memory-mapped file.
    NÚPageantRequestÚ08xr   r   é   z>I)r   ÚthreadÚ	get_identr   Ú	MemoryMapÚ_AGENT_MAX_MSGLENÚ get_security_attributes_for_userÚwriteÚarrayr   r   Úbuffer_infor   Ú_AGENT_COPYDATA_IDr   r   r	   ÚSendMessageAÚwin32con_WM_COPYDATAÚsizeofÚbyrefÚseekÚreadÚstructÚunpack)ÚmsgÚhwndÚmap_nameÚpymapÚchar_bufferÚchar_buffer_addressÚchar_buffer_sizeÚcdsÚresponseÚdatalenÚretlenr   r   r   Ú_query_pageantL   s2   
ÿ
ÿÿ

î$ír=   c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚPageantConnectiona  
    Mock "connection" to an agent which roughly approximates the behavior of
    a unix local-domain socket (as used by Agent).  Requests are sent to the
    pageant daemon via special Windows magick, and responses are buffered back
    for subsequent reads.
    c                 C   s
   d | _ d S ©N©Ú	_response©Úselfr   r   r   Ú__init__z   s   
zPageantConnection.__init__c                 C   s   t |ƒ| _d S r?   )r=   rA   )rC   Údatar   r   r   Úsend}   s   zPageantConnection.sendc                 C   s@   | j d u rdS | j d |… }| j |d … | _ | j dkrd | _ |S )NÚ r@   )rC   ÚnÚretr   r   r   Úrecv€   s   

zPageantConnection.recvc                 C   s   d S r?   r   rB   r   r   r   Úclose‰   s   zPageantConnection.closeN)r   r   r   r   rD   rF   rJ   rK   r   r   r   r   r>   r   s    	r>   )r   r'   Úctypes.wintypesr   Úplatformr0   Úparamiko.commonr   Úparamiko.utilr   Ú_threadr!   rG   r   r)   r$   r+   r   r   ÚarchitectureÚc_uint64r   Úc_uint32Ú	Structurer   r=   r>   r   r   r   r   Ú<module>   s(   
&