
ÿ<¸X½#  ã               @   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 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 rM t d |  ƒ ‚ t  | t ƒ sr t d t | ƒ ƒ ‚ | d k  sŠ | d k rš t d | ƒ ‚ t  | t ƒ s¿ t d t | ƒ ƒ ‚ | d k  rÛ t d	 | ƒ ‚ t  | t ƒ s t 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 %sz&contents must be a byte string, not %s)Ú
isinstanceÚintÚ	TypeErrorr	   Ú
ValueErrorr   Ú_dump_header)Úclass_ÚmethodÚtagÚcontents© r   ú3/usr/lib/python3/dist-packages/asn1crypto/parser.pyÚemit   s    r   Fc             C   sp   t  |  t ƒ s% t d t |  ƒ ƒ ‚ t |  ƒ } t |  | ƒ \ } } | rl | | k rl 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
    z&contents must be a byte string, not %sz4Extra data - %d bytes of trailing data were provided)r   r   r   r	   ÚlenÚ_parser   )r   ÚstrictZcontents_lenÚinfoÚconsumedr   r   r   ÚparseJ   s    r   c             C   sD   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
    z&contents must be a byte string, not %s)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 rF t |  | ƒ n |  | } | d 7} | d @} | d k rÐ d } xW t r t |  | ƒ n |  | } | d 7} | d 9} | | d @7} | d ?d k ry Pqy Wt ræ t |  | ƒ n |  | } | d 7} | d ?d k r3| r"| | | d @f S| | d @}	 n7| d @}
 |
 r„| |
 7} | t |  | |
 | … d d	 ƒ}	 | rj| |	 f Snæ | }	 | d
 k r |	 d 7}	 xU |	 | k  r÷t |  | |	 d d ƒ\ } }	 |	 | k r£|  |	 d |	 … d k r£Pq£W| 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   é€   é   é   ZsignedFr   Úlengths_onlyTs     é   é   ó    )r   Ú_INSUFFICIENT_DATA_MESSAGEÚ_PY2Úordr
   r   )Zencoded_dataZdata_lenZpointerr%   ÚstartZfirst_octetr   ZnumZlength_octetZcontents_endZlength_octetsZsub_header_endr   r   r   r   ‹   sl     

 

 


$
&
r   c       	      C   s  d } d } | |  d >O} | | d >O} | d k r˜ | t  | d Bƒ 7} xa | d k r” | d k ri d n d } | t  | | d @Bƒ 7} | d ?} qK Wn | t  | | Bƒ 7} t | ƒ } | d k r× | t  | ƒ 7} n0 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   ÚheaderZid_numZcontinuation_bitZlengthZlength_bytesr   r   r   r   õ   s$    
r   )r   )Ú__doc__Z
__future__r   r   r   r   ÚsysZ_typesr   r   r	   Úutilr
   r   Úversion_infor*   r)   r   r   r   r   r   r   r   r   r   Ú<module>   s   "1'j