o
    q¨Êh½#  ã                   @   s†   d Z ddlmZmZmZmZ ddlZddlmZm	Z	m
Z
 ddlmZmZ ejdkZdZd	d
„ Zddd„Zdd„ Zddd„Zdd„ ZdS )zÈ
Functions for parsing and dumping using the ASN.1 DER encoding. Exports the
following items:

 - emit()
 - parse()
 - peek()

Other type classes are defined that help compose the types listed above.
é    )Úunicode_literalsÚdivisionÚabsolute_importÚprint_functionNé   )Úbyte_clsÚchr_clsÚ	type_name)Úint_from_bytesÚint_to_bytes)é   z<Insufficient data - %s bytes requested but only %s availablec                 C   sÆ   t | tƒstdt| ƒ ƒ‚| dk s| dkrtd|  ƒ‚t |tƒs(tdt|ƒ ƒ‚|dk s0|dkr6td| ƒ‚t |tƒsCtdt|ƒ ƒ‚|dk rMtd	| ƒ‚t |tƒsZtd
t|ƒ ƒ‚t| |||ƒ| S )a™  
    Constructs a byte string of an ASN.1 DER-encoded value

    This is typically not useful. Instead, use one of the standard classes from
    asn1crypto.core, or construct a new class with specific fields, and call the
    .dump() method.

    :param class_:
        An integer ASN.1 class value: 0 (universal), 1 (application),
        2 (context), 3 (private)

    :param method:
        An integer ASN.1 method value: 0 (primitive), 1 (constructed)

    :param tag:
        An integer ASN.1 tag value

    :param contents:
        A byte string of the encoded byte contents

    :return:
        A byte string of the ASN.1 DER value (header and contents)
    z!class_ must be an integer, not %sr   r   z*class_ must be one of 0, 1, 2 or 3, not %sz!method must be an integer, not %sr   zmethod must be 0 or 1, not %sztag must be an integer, not %sz%tag must be greater than zero, not %sú&contents must be a byte string, not %s)Ú
isinstanceÚintÚ	TypeErrorr	   Ú
ValueErrorr   Ú_dump_header)Úclass_ÚmethodÚtagÚcontents© r   úC/var/www/html/env/lib/python3.10/site-packages/asn1crypto/parser.pyÚemit   s   



r   Fc                 C   sP   t | tƒstdt| ƒ ƒ‚t| ƒ}t| |ƒ\}}|r&||kr&td||  ƒ‚|S )al  
    Parses a byte string of ASN.1 BER/DER-encoded data.

    This is typically not useful. Instead, use one of the standard classes from
    asn1crypto.core, or construct a new class with specific fields, and call the
    .load() class method.

    :param contents:
        A byte string of BER/DER-encoded data

    :param strict:
        A boolean indicating if trailing data should be forbidden - if so, a
        ValueError will be raised when trailing data exists

    :raises:
        ValueError - when the contents do not contain an ASN.1 header or are truncated in some way
        TypeError - when contents is not a byte string

    :return:
        A 6-element tuple:
         - 0: integer class (0 to 3)
         - 1: integer method
         - 2: integer tag
         - 3: byte string header
         - 4: byte string content
         - 5: byte string trailer
    r   z4Extra data - %d bytes of trailing data were provided)r   r   r   r	   ÚlenÚ_parser   )r   ÚstrictÚcontents_lenÚinfoÚconsumedr   r   r   ÚparseJ   s   
r    c                 C   s0   t | tƒstdt| ƒ ƒ‚t| t| ƒƒ\}}|S )aW  
    Parses a byte string of ASN.1 BER/DER-encoded data to find the length

    This is typically used to look into an encoded value to see how long the
    next chunk of ASN.1-encoded data is. Primarily it is useful when a
    value is a concatenation of multiple values.

    :param contents:
        A byte string of BER/DER-encoded data

    :raises:
        ValueError - when the contents do not contain an ASN.1 header or are truncated in some way
        TypeError - when contents is not a byte string

    :return:
        An integer with the number of bytes occupied by the ASN.1 value
    r   )r   r   r   r	   r   r   )r   r   r   r   r   r   Úpeekq   s   
r!   c                 C   s   ||d k rt td|| f ƒ‚|}trt| | ƒn| | }|d7 }|d@ }|dkrOd}	 tr5t| | ƒn| | }|d7 }|d9 }||d@ 7 }|d? dkrNnq-trWt| | ƒn| | }|d7 }|d? dkrv|ro|||d@  fS ||d@  }	nv|d@ }
|
r•||
7 }|t| ||
 |… d	d
� }	|r”||	fS nW|}	|dkrŸ|	d7 }	|	|k rÀt| ||	dd�\}}	|	|kr¼| |	d |	… dkr¼n|	|k s£|rÆ||	fS |	|krÒt t|	|f ƒ‚|d? |d? d@ || ||… | ||	d … df|	fS |	|krøt t|	|f ƒ‚|d? |d? d@ || ||… | ||	… df|	fS )a�  
    Parses a byte string into component parts

    :param encoded_data:
        A byte string that contains BER-encoded data

    :param data_len:
        The integer length of the encoded data

    :param pointer:
        The index in the byte string to parse from

    :param lengths_only:
        A boolean to cause the call to return a 2-element tuple of the integer
        number of bytes in the header and the integer number of bytes in the
        contents. Internal use only.

    :return:
        A 2-element tuple:
         - 0: A tuple of (class_, method, tag, header, content, trailer)
         - 1: An integer indicating how many bytes were consumed
    é   r   é   r   Té€   é   é   F)Úsignedr   )Úlengths_onlys     é   é   ó    )r   Ú_INSUFFICIENT_DATA_MESSAGEÚ_PY2Úordr
   r   )Úencoded_dataÚdata_lenÚpointerr(   ÚstartÚfirst_octetr   ÚnumÚlength_octetÚcontents_endÚlength_octetsÚsub_header_endr   r   r   r   ‹   sz   úÿý

ú÷


ú÷r   c           	      C   sÎ   d}d}|| d> O }||d> O }|dkr;|t |dB ƒ7 }|dkr:|dkr&dnd}|t ||d@ B ƒ7 }|d? }|dks n|t ||B ƒ7 }t|ƒ}|dkrS|t |ƒ7 }|S t|ƒ}|t dt|ƒB ƒ7 }||7 }|S )	aÇ  
    Constructs the header bytes for an ASN.1 object

    :param class_:
        An integer ASN.1 class value: 0 (universal), 1 (application),
        2 (context), 3 (private)

    :param method:
        An integer ASN.1 method value: 0 (primitive), 1 (constructed)

    :param tag:
        An integer ASN.1 tag value

    :param contents:
        A byte string of the encoded byte contents

    :return:
        A byte string of the ASN.1 DER header
    r+   r   r)   r*   r#   r%   r$   r&   )r   r   r   )	r   r   r   r   ÚheaderÚid_numÚcontinuation_bitÚlengthÚlength_bytesr   r   r   r   õ   s*   ý€ür   )F)r   F)Ú__doc__Ú
__future__r   r   r   r   ÚsysÚ_typesr   r   r	   Úutilr
   r   Úversion_infor-   r,   r   r    r!   r   r   r   r   r   r   Ú<module>   s   

1'
j