B
    `e                 @   s   d dl Z d dlmZ dZdZdZdZdZdZd	Z	d
eB Z
deB ZdZdZdZG dd deZeedddZeeedddZdS )    N)int_to_bytes                                     c               @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZedddZ	e
dddZejed f dddZed dddZed dddZeejd  dddZedddZdS )	DERReaderc             C   s   t || _d S )N)
memoryviewdata)selfr    r   G/home/dcms/DCMS/lib/python3.7/site-packages/cryptography/hazmat/_der.py__init__"   s    zDERReader.__init__c             C   s   | S )Nr   )r   r   r   r   	__enter__%   s    zDERReader.__enter__c             C   s   |d kr|    d S )N)check_empty)r   exc_type	exc_valuetbr   r   r   __exit__(   s    zDERReader.__exit__c             C   s   t | jdkS )Nr   )lenr   )r   r   r   r   is_empty,   s    zDERReader.is_emptyc             C   s   |   stdd S )Nz Invalid DER input: trailing data)r   
ValueError)r   r   r   r   r   /   s    zDERReader.check_empty)returnc             C   s4   t | jdk rtd| jd }| jdd  | _|S )N   z$Invalid DER input: insufficient datar   )r   r   r   )r   retr   r   r   	read_byte3   s
    
zDERReader.read_bytec             C   s8   t | j|k rtd| jd | }| j|d  | _|S )Nz$Invalid DER input: insufficient data)r   r   r   )r   nr!   r   r   r   
read_bytes:   s
    zDERReader.read_bytesc             C   s   |   }|d@ dkrtd|   }|d@ dkr6|}nb|dM }|dkrNtdd}x4t|D ](}|dK }||   O }|dkr\tdq\W |dk rtd| |}|t|fS )	N   z-Invalid DER input: unexpected high tag numberr   r      z?Invalid DER input: indefinite length form is not allowed in DER   z3Invalid DER input: length was not minimally-encoded)r"   r   ranger$   r   )r   tagZlength_bytelengthibodyr   r   r   read_any_elementA   s,    

zDERReader.read_any_element)expected_tagr   c             C   s    |   \}}||krtd|S )Nz!Invalid DER input: unexpected tag)r-   r   )r   r.   r)   r,   r   r   r   read_elemente   s    zDERReader.read_elementc          	   C   s   |  |  |S Q R X d S )N)r/   )r   r.   r   r   r   read_single_elementk   s    zDERReader.read_single_elementc             C   s*   t | jdkr&| jd |kr&| |S d S )Nr   )r   r   r/   )r   r.   r   r   r   read_optional_elemento   s    
zDERReader.read_optional_elementc             C   sv   t | jdkrtd| jd }|d@ dkr4tdt | jdkrh| jd }|dkrh|d@ dkrhtdt| jdS )Nr   z)Invalid DER input: empty integer contentsr   z'Negative DER integers are not supportedr    z0Invalid DER input: integer not minimally-encodedbig)r   r   r   int
from_bytes)r   firstsecondr   r   r   
as_integerv   s    

zDERReader.as_integerN)__name__
__module____qualname__r   r   r   r   r   r3   r"   r   r$   typingTupler-   r/   r0   Optionalr1   r7   r   r   r   r   r   !   s   $r   )xr   c             C   s<   t | tstd| dk r"td|  d d }t| |S )NzValue must be an integerr   z#Negative integers are not supportedr'   r    )
isinstancer3   r   
bit_lengthr   )r>   r#   r   r   r   encode_der_integer   s    
rA   )r)   childrenr   c             G   s   d}x|D ]}|t |7 }q
W t| gg}|dk rD|t|g n*t|}|tdt |B g || || d|S )Nr   r       )r   bytesappendr   extendjoin)r)   rB   r*   childchunksZlength_bytesr   r   r   
encode_der   s    


rJ   )r;   Zcryptography.utilsr   ZCONSTRUCTEDZCONTEXT_SPECIFICZINTEGERZ
BIT_STRINGZOCTET_STRINGZNULLZOBJECT_IDENTIFIERZSEQUENCEZSETZPRINTABLE_STRINGZUTC_TIMEZGENERALIZED_TIMEobjectr   r3   rD   rA   rJ   r   r   r   r   <module>   s    f	