U
    cc                     @   sX   d dl mZmZ d dlmZmZmZmZ d dlm	Z	 G dd de
ZG dd deZdS )    )max_byte	zero_byte)bbyte_ordbyte_chrlongNc                   @   s   e Zd ZdS )BERExceptionN)__name__
__module____qualname__ r   r   0/tmp/pip-unpacked-wheel-rglolp_m/paramiko/ber.pyr      s   r   c                   @   sn   e Zd ZdZe fddZdd Zdd Zdd	 Zd
d Z	dd Z
edd Zdd Zdd Zedd ZdS )BERz7
    Robey's tiny little attempt at a BER decoder.
    c                 C   s   t || _d| _d S )Nr   )r   contentidx)selfr   r   r   r   __init__!   s    
zBER.__init__c                 C   s   | j S N)r   r   r   r   r   asbytes%   s    zBER.asbytesc                 C   s   |   S r   )r   r   r   r   r   __str__(   s    zBER.__str__c                 C   s   dt | j d S )NzBER('z'))reprr   r   r   r   r   __repr__+   s    zBER.__repr__c                 C   s   |   S r   )decode_nextr   r   r   r   decode.   s    z
BER.decodec                 C   s  | j t| jkrd S t| j| j  }|  j d7  _ |d@ dkrd}| j t| jk rt| j| j  }|  j d7  _ |d> |d@ B }|d@ sBqqB| j t| jkrd S t| j| j  }|  j d7  _ |d@ r|d@ }| j | t| jkrd S t| j| j | j |  d}|  j |7  _ | j | t| jkr.d S | j| j | j |  }|  j |7  _ |dkrf| |S |d	krzt|S d
}t||d S )N      r            T0      z.Unknown ber encoding type {:d} (robey is lazy))	r   lenr   r   utilZinflate_longdecode_sequencer   format)r   identtsizedatamsgr   r   r   r   1   sF    
 



zBER.decode_nextc                 C   s.   g }t | }| }|d krq*|| q|S r   )r   r   append)r)   outberxr   r   r   r$   _   s    zBER.decode_sequencec                 C   st   |  j t|7  _ t|dkrLtt|}|  j tdt| | 7  _ n|  j tt|7  _ |  j |7  _ d S )Nr   r   )r   r   r"   r#   deflate_long)r   r&   valZlenstrr   r   r   
encode_tlvj   s     zBER.encode_tlvc                 C   s   t |tkr,|r| dt q| dt nt |tksDt |tkrX| dt| nXt |t	krr| d| n>t |t
kst |tkr| d| | ntdt |d S )Nr   r!      r    zUnknown type for encoding: {!r})typeboolr1   r   r   intr   r#   r/   strlisttupleencode_sequencer   r%   )r   r.   r   r   r   encodet   s    z
BER.encodec                 C   s"   t  }| D ]}|| q
| S r   )r   r:   r   )r)   r-   itemr   r   r   r9      s    zBER.encode_sequenceN)r	   r
   r   __doc__bytesr   r   r   r   r   r   staticmethodr$   r1   r:   r9   r   r   r   r   r      s   .


r   )Zparamiko.commonr   r   Zparamiko.py3compatr   r   r   r   Zparamiko.utilr#   	Exceptionr   objectr   r   r   r   r   <module>   s   