
     h#                         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	Zd
 ZddZd ZddZ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 available
   c                 t   t          | t                    st          dt          |           z            | dk     s| dk    rt	          d| z            t          |t                    st          dt          |          z            |dk     s|dk    rt	          d|z            t          |t                    st          dt          |          z            |dk     rt	          d	|z            t          |t
                    st          d
t          |          z            t          | |||          |z   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contentss       M/var/www/html/Sam_Eipo/venv/lib/python3.11/site-packages/asn1crypto/parser.pyemitr      s>   2 fc"" Q;i>O>OOPPPzzVaZZENOOOfc"" Q;i>O>OOPPPzzVaZZ86ABBBc3 K89S>>IJJJ
Qww@3FGGGh)) X@9XCVCVVWWWX66AA    Fc                     t          | t                    st          dt          |           z            t	          |           }t          | |          \  }}|r||k    rt          d||z
  z            |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consumeds        r   parser$   K   s    : h)) X@9XCVCVVWWWx==LHl33ND( m(l**OS_bjSjklllKr   c                     t          | t                    st          dt          |           z            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#   s      r   peekr&   r   sQ    & h)) X@9XCVCVVWWWHc(mm44ND(Or   c           
         |t           k    rt          d          |}||dz   k     rt          t          d||z
  fz            t          rt	          | |                   n| |         }|dz  }|dz  }|dz	  dz  }|dk    rd}	 ||dz   k     rt          t          d||z
  fz            t          rt	          | |                   n| |         }	|dz  }|	dk    r|dk    rt          d          |dz  }||	d	z  z  }|	d
z	  dk    rn|dk     rt          d          ||dz   k     rt          t          d||z
  fz            t          rt	          | |                   n| |         }
|dz  }d}|
d
z	  dk    r	||
d	z  z   }n|
d	z  }|rJ|||z   k     rt          t          |||z
  fz            ||z  }|t          | ||z
  |         d          z   }nh|st          d          |}||dz   k     s| ||dz            dk    r4t          | ||d|dz             \  }}||dz   k     #| ||dz            dk    4|dz  }d}||k    rt          t          ||z
  ||z
  fz            |r||fS |dz	  ||| ||         | ||t          |          z
           |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.

    :param depth:
        The recursion depth when evaluating indefinite-length encoding.

    :return:
        A 2-element tuple:
         - 0: A tuple of (class_, method, tag, header, content, trailer)
         - 1: An integer indicating how many bytes were consumed
    z*Indefinite-length recursion limit exceededr         r   T   zNon-minimal tag encoding      r   F)signedz-Indefinite-length element must be constructed   s     )lengths_onlydepth   )
_MAX_DEPTHr   _INSUFFICIENT_DATA_MESSAGE_PY2ordr   r   r   )encoded_datadata_lenpointerr/   r0   startfirst_octetr   constructednumlength_octettrailercontents_endlength_octets_s                  r   r   r      s   6 zEFFFE'A+3q(W:L6MMNNN04O#l7+,,,,w:OKqLG

C!#q(K
byy
	'A+%% !;q(WBT>U!UVVV04O#l7+,,,,w:OCqLGd{{saxx !;<<<3JC39Cax1}}
	 887888'A+3q(W:L6MMNNN15P3|G,---<;PLqLGGqA,"45 %s* 	"'M111 !;}hY`N`>a!abbb}$G"^L=AXY`A`4ajo%p%p%ppLL  R !PQQQ"L\A---l<XY>>Y1Z^i1i1i"(x\`hmnoho"p"p"p< \A---l<XY>>Y1Z^i1i1iAL!Gh3|g7MxZaOa6bbccc '&& 1w'c'll!::;	
 	
 
r   c                    d}d}|| dz  z  }||dz  z  }|dk    rEd}|dk    r't          ||dz  z            |z   }|sd}|dz	  }|dk    't          |dz            |z   }n|t          ||z            z  }t          |          }|dk    r|t          |          z  }n6t          |          }|t          dt          |          z            z  }||z  }|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   r1   r)   r(   r+   r*   r,   )r	   r   r   )	r   r   r   r   headerid_numcont_bitlengthlength_bytess	            r   r   r      s   * FF
fkF
fkF
byyAggXt455>F  (C	 Agg
 "%%.'&3,''']]F}}'&//!#F++'$\!2!22333,Mr   )F)r   Fr   )__doc__
__future__r   r   r   r   sys_typesr   r	   r
   utilr   r   version_infor4   r3   r2   r   r$   r&   r   r    r   r   <module>rO      s   	 	 S R R R R R R R R R R R 



 0 0 0 0 0 0 0 0 0 0 . . . . . . . .
4[ 
.B .B .Bb$ $ $ $N  4g g g gT. . . . .r   