o
    )%ae                     @   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dedefddZdededef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defddZ	de
fddZdejed f fddZdedd fddZdedd fddZdedejd  fddZdefddZdS )	DERReaderc                 C   s   t || _d S N)
memoryviewdata)selfr    r   :/usr/lib/python3/dist-packages/cryptography/hazmat/_der.py__init__"      zDERReader.__init__c                 C   s   | S r   r   r   r   r   r   	__enter__%   s   zDERReader.__enter__c                 C   s   |d u r
|    d S 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,   r   zDERReader.is_emptyc                 C   s   |   stdd S )Nz Invalid DER input: trailing data)r!   
ValueErrorr   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   $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 )Nr%   r&   )r   nr'   r   r   r   
read_bytes:   s
   zDERReader.read_bytesc                 C   s   |   }|d@ dkrtd|   }|d@ dkr|}n/|dM }|dkr'tdd}t|D ]}|dK }||   O }|dkrAtdq-|dk rJt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   taglength_bytelengthibodyr   r   r   read_any_elementA   s4   
zDERReader.read_any_elementexpected_tagc                 C   s    |   \}}||krtd|S )Nz!Invalid DER input: unexpected tag)r4   r"   )r   r5   r/   r3   r   r   r   read_elemente   s   zDERReader.read_elementc                 C   s2   |  |  |W  d    S 1 sw   Y  d S r   )r6   r   r5   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 r   )r    r   r6   r7   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rtdt | jdkr4| jd }|dkr4|d@ dkr4t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   r;   r(   r   r*   typingTupler4   r6   r8   Optionalr9   r?   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$   )
isinstancer;   r"   
bit_lengthr   )rF   r)   r   r   r   encode_der_integer   s   

rI   r/   childrenc                 G   s~   d}|D ]}|t |7 }qt| gg}|dk r |t|g nt|}|tdt |B g || || d|S )Nr   r       )r    bytesappendr   extendjoin)r/   rJ   r1   childchunkslength_bytesr   r   r   
encode_der   s   


rS   )rC   cryptography.utilsr   CONSTRUCTEDCONTEXT_SPECIFICINTEGER
BIT_STRINGOCTET_STRINGNULLOBJECT_IDENTIFIERSEQUENCESETPRINTABLE_STRINGUTC_TIMEGENERALIZED_TIMEobjectr   r;   rL   rI   rS   r   r   r   r   <module>   s"   f	