3
K^U                 @   s   d dl mZmZmZ d dlZd dlmZ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dd Zdd ZdS )    )absolute_importdivisionprint_functionN)int_from_bytesint_to_bytes                                     c               @   sl   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd ZdS )	DERReaderc             C   s   t || _d S )N)
memoryviewdata)selfr    r   </tmp/pip-unpacked-wheel-vvkwn1hz/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| j   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   | j  stdd S )Nz Invalid DER input: trailing data)r!   
ValueError)r   r   r   r   r   1   s    zDERReader.check_emptyc             C   s8   t | jdk rtdtj| jd}| jdd  | _|S )N   z$Invalid DER input: insufficient datar   )r    r   r"   six
indexbytes)r   retr   r   r   	read_byte5   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   | j  }|d@ dkrtd| j  }|d@ dkr6|}nb|dM }|dkrNtdd}x4t|D ](}|dK }|| j  O }|dkr\tdq\W |dk rtd| j|}|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_elementC   s,    

zDERReader.read_any_elementc             C   s    | j  \}}||krtd|S )Nz!Invalid DER input: unexpected tag)r2   r"   )r   expected_tagr.   r1   r   r   r   read_elementg   s    zDERReader.read_elementc          	   C   s   |  | j |S Q R X d S )N)r4   )r   r3   r   r   r   read_single_elementm   s    zDERReader.read_single_elementc             C   s.   t | jdkr*tj| jd|kr*| j|S d S )Nr   )r    r   r$   r%   r4   )r   r3   r   r   r   read_optional_elementq   s     
zDERReader.read_optional_elementc             C   s|   t | jdkrtdtj| jd}|d@ dkr8tdt | jdkrptj| jd}|dkrp|d@ dkrpt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"   r$   r%   r   )r   firstsecondr   r   r   
as_integerv   s    zDERReader.as_integerN)__name__
__module____qualname__r   r   r   r!   r   r'   r)   r2   r4   r5   r6   r:   r   r   r   r   r   #   s   $r   c             C   s>   t | tjstd| dk r$td| j d d }t| |S )NzValue must be an integerr   z#Negative integers are not supportedr,   r#   )
isinstancer$   integer_typesr"   
bit_lengthr   )xr(   r   r   r   encode_der_integer   s    rB   c             G   s   d}x|D ]}|t |7 }q
W tj| g}|dk rD|jtj| n*t|}|jtjdt |B  |j| |j| dj|S )Nr   r       )r    r$   int2byteappendr   extendjoin)r.   childrenr/   childchunksZlength_bytesr   r   r   
encode_der   s    


rK   )
__future__r   r   r   r$   Zcryptography.utilsr   r   ZCONSTRUCTEDZCONTEXT_SPECIFICZINTEGERZ
BIT_STRINGZOCTET_STRINGZNULLZOBJECT_IDENTIFIERZSEQUENCEZSETZPRINTABLE_STRINGZUTC_TIMEZGENERALIZED_TIMEobjectr   rB   rK   r   r   r   r   <module>   s"   d	