U
    *}fU                     @   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-x36vw73o/cryptography/hazmat/_der.py__init__$   s    zDERReader.__init__c                 C   s   | S r   r   r   r   r   r   	__enter__'   s    zDERReader.__enter__c                 C   s   |d kr|    d S r   )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$   
ValueErrorr   r   r   r   r   1   s    zDERReader.check_emptyc                 C   s8   t | jdk rtdt| jd}| jdd  | _|S )N   $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 )Nr'   )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|}n^|dM }|dkrNtdd}t|D ](}|dK }||   O }|dkrZtdqZ|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_elementC   s2    
zDERReader.read_any_elementc                 C   s    |   \}}||krtd|S )Nz!Invalid DER input: unexpected tag)r6   r%   )r   expected_tagr2   r5   r   r   r   read_elementg   s    zDERReader.read_elementc              
   C   s&   |  |  |W  5 Q R  S Q R X d S r   )r8   r   r7   r   r   r   read_single_elementm   s    zDERReader.read_single_elementc                 C   s.   t | jdkr*t| jd|kr*| |S d S r"   )r#   r   r(   r)   r8   r9   r   r   r   read_optional_elementq   s     
zDERReader.read_optional_elementc                 C   s|   t | jdkrtdt| jd}|d@ dkr8tdt | jdkrpt| 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-   r6   r8   r:   r;   r?   r   r   r   r   r   #   s   $r   c                 C   s>   t | tjstd| dk r$td|  d d }t| |S )NzValue must be an integerr   z#Negative integers are not supportedr0   r&   )
isinstancer(   integer_typesr%   
bit_lengthr   )xr,   r   r   r   encode_der_integer   s    rG   c                 G   s~   d}|D ]}|t |7 }qt| g}|dk r@|t| n*t|}|tdt |B  || || d|S )Nr   r       )r#   r(   int2byteappendr   extendjoin)r2   childrenr3   childchunksZlength_bytesr   r   r   
encode_der   s    

rP   )
__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   rG   rP   r   r   r   r   <module>   s"   d	