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	