U
    ÈZjI�  ã                	   @   sð   d dl Z d dlmZmZmZ d dlmZmZ dddddd	d
ddg	Zddd„Z	G dd„ de
ƒZG dd„ de
ƒZG dd„ deƒZG dd„ deƒZG dd	„ d	eƒZG dd„ deƒZG dd„ deƒZG dd
„ d
eƒZG dd„ deƒZG dd„ deƒZdS )é    N)Úbyte_stringÚbchrÚbord)Úlong_to_bytesÚbytes_to_longÚ	DerObjectÚ
DerIntegerÚ
DerBooleanÚDerOctetStringÚDerNullÚDerSequenceÚDerObjectIdÚDerBitStringÚDerSetOfFc                 C   s6   d}z| | }W n t k
r&   Y dS X | p4| dkS )Nr   F)Ú	TypeError)ÚxÚonly_non_negativeÚtest© r   úS/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/Crypto/Util/asn1.pyÚ
_is_number(   s    r   c                   @   s@   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dS )ÚBytesIO_EOFzeThis class differs from BytesIO in that a ValueError exception is
    raised whenever EOF is reached.c                 C   s   || _ d| _d | _d S ©Nr   )Ú_bufferÚ_indexÚ	_bookmark)ÚselfZinitial_bytesr   r   r   Ú__init__5   s    zBytesIO_EOF.__init__c                 C   s   | j | _d S ©N)r   r   ©r   r   r   r   Úset_bookmark:   s    zBytesIO_EOF.set_bookmarkc                 C   s    | j d k	st‚| j| j | j… S r   )r   ÚAssertionErrorr   r   r   r   r   r   Údata_since_bookmark=   s    zBytesIO_EOF.data_since_bookmarkc                 C   s   t | jƒ| j S r   )Úlenr   r   r   r   r   r   Úremaining_dataA   s    zBytesIO_EOF.remaining_datac                 C   sH   | j | }|t| jƒkr.td|t| jƒf ƒ‚| j| j |… }|| _ |S )Nz@Not enough data for DER decoding: expected %d bytes and found %d)r   r#   r   Ú
ValueError)r   ÚlengthZ	new_indexÚresultr   r   r   ÚreadD   s    
zBytesIO_EOF.readc                 C   s   t |  d¡d ƒS )Né   r   )r   r(   r   r   r   r   Ú	read_byteM   s    zBytesIO_EOF.read_byteN)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r    r"   r$   r(   r*   r   r   r   r   r   1   s   	r   c                   @   sP   e Zd ZdZddd„Zdd„ Zed	d
„ ƒZdd„ Zdd„ Z	ddd„Z
dd„ ZdS )r   zpBase class for defining a single DER object.

        This class should never be directly instantiated.
        Nó    Fc                 C   s’   |dkrd| _ dS |  |¡}|| _|r*dnd}d||fkrBtdƒ‚|dk	r`d|B |  |¡B | _ n.|dk	r„d|  |¡B | _ ||B | _n
||B | _ dS )aù  Initialize the DER object according to a specific ASN.1 type.

                :Parameters:
                  asn1Id : integer or byte
                    The universal DER tag number for this object
                    (e.g. 0x10 for a SEQUENCE).
                    If None, the tag is not known yet.

                  payload : byte string
                    The initial payload of the object (that it,
                    the content octets).
                    If not specified, the payload is empty.

                  implicit : integer or byte
                    The IMPLICIT tag number (< 0x1F) to use for the encoded object.
                    It overrides the universal tag *asn1Id*.
                    It cannot be combined with the ``explicit`` parameter.
                    By default, there is no IMPLICIT tag.

                  constructed : bool
                    True when the ASN.1 type is *constructed*.
                    False when it is *primitive* (default).

                  explicit : integer or byte
                    The EXPLICIT tag number (< 0x1F) to use for the encoded object.
                    It cannot be combined with the ``implicit`` parameter.
                    By default, there is no EXPLICIT tag.
                Né    r   z1Explicit and implicit tags are mutually exclusiveé€   é    )Ú
_tag_octetÚ_convertTagÚpayloadr%   Ú_inner_tag_octet)r   Zasn1Idr5   ÚimplicitZconstructedÚexplicitZconstructed_bitr   r   r   r   W   s    
zDerObject.__init__c                 C   sJ   t |ƒs t|ƒdkr t|d ƒ}t |ƒr>d|  kr<dk sFn tdƒ‚|S )zCheck if *tag* is a real DER tag (5 bits).
                Convert it from a character to number if necessary.
                r)   r   é   zWrong DER tag)r   r#   r   r%   )r   Útagr   r   r   r4   �   s    zDerObject._convertTagc                 C   s,   | dkr$t | ƒ}tt|ƒd ƒ| S t| ƒS )zXBuild length octets according to BER/DER
                definite form.
                é   r1   )r   r   r#   )r&   Úencodingr   r   r   Ú_definite_form©   s    zDerObject._definite_formc                 C   sL   | j }t| dƒr0t| jƒ|  t| j ƒ¡ | j  }t| jƒ|  t|ƒ¡ | S )z?Return this DER element, fully encoded as a binary byte string.r6   )r5   Úhasattrr   r6   r=   r#   r3   )r   Zoutput_payloadr   r   r   Úencode³   s    
ÿþÿþzDerObject.encodec                 C   sR   |  ¡ }|dkrN| |d@ ¡}t|d ƒdkr6tdƒ‚t|ƒ}|dkrNtdƒ‚|S )z%Decode DER length octets from a file.r;   r   z$Invalid DER: length has leading zeroz5Invalid DER: length in long form but smaller than 128)r*   r(   r   r%   r   )r   Úsr&   Zencoded_lengthr   r   r   Ú
_decodeLenÆ   s    zDerObject._decodeLenc                 C   s<   t |ƒstdƒ‚t|ƒ}|  ||¡ | ¡ dkr8tdƒ‚| S )a  Decode a complete DER element, and re-initializes this
                object with it.

                Args:
                  der_encoded (byte string): A complete DER element.

                Raises:
                  ValueError: in case of parsing errors.
                zInput is not a byte stringr   ú-Unexpected extra data after the DER structure)r   r%   r   Ú_decodeFromStreamr$   )r   Úder_encodedÚstrictr@   r   r   r   ÚdecodeÕ   s    zDerObject.decodec                 C   sž   |  ¡ }| jdk	r&|| jkr,tdƒ‚n|| _|  |¡}| |¡| _t| dƒršt| jƒ}|  ¡ }|| jkrptdƒ‚|  |¡}| |¡| _| 	¡ dkrštdƒ‚dS )z*Decode a complete DER element from a file.NzUnexpected DER tagr6   zUnexpected internal DER tagr   rB   )
r*   r3   r%   rA   r(   r5   r>   r   r6   r$   )r   r@   rE   ZidOctetr&   ÚpZinner_octetr   r   r   rC   ì   s     







zDerObject._decodeFromStream)Nr/   NFN)F)r+   r,   r-   r.   r   r4   Ústaticmethodr=   r?   rA   rF   rC   r   r   r   r   r   Q   s       ÿ
F
	
c                   @   s4   e Zd ZdZddd„Zdd„ Zdd	d
„Zdd„ ZdS )r   aÈ  Class to model a DER INTEGER.

        An example of encoding is::

          >>> from Crypto.Util.asn1 import DerInteger
          >>> from binascii import hexlify, unhexlify
          >>> int_der = DerInteger(9)
          >>> print hexlify(int_der.encode())

        which will show ``020109``, the DER encoding of 9.

        And for decoding::

          >>> s = unhexlify(b'020109')
          >>> try:
          >>>   int_der = DerInteger()
          >>>   int_der.decode(s)
          >>>   print int_der.value
          >>> except ValueError:
          >>>   print "Not a valid DER INTEGER"

        the output will be ``9``.

        :ivar value: The integer value
        :vartype value: integer
        r   Nc                 C   s   t  | dd|d|¡ || _dS )aU  Initialize the DER object as an INTEGER.

                :Parameters:
                  value : integer
                    The value of the integer.

                  implicit : integer
                    The IMPLICIT tag to use for the encoded object.
                    It overrides the universal tag for INTEGER (2).
                é   r/   FN©r   r   Úvalue©r   rK   r7   r8   r   r   r   r   #  s
     ÿzDerInteger.__init__c                 C   sz   | j }d| _tt|d@ ƒƒ| j | _d|  kr8dkrLn ntdƒ| j | _d|  kr`dkrfqp nqp|dL }qt | ¡S )zIReturn the DER INTEGER, fully encoded as a
                binary string.r/   éÿ   r1   r   i€ÿÿÿé   )rK   r5   r   Úintr   r?   )r   Únumberr   r   r   r?   3  s    
zDerInteger.encodeFc                 C   s   t j| ||d�S )a  Decode a DER-encoded INTEGER, and re-initializes this
                object with it.

                Args:
                  der_encoded (byte string): A complete INTEGER DER element.

                Raises:
                  ValueError: in case of parsing errors.
                ©rE   ©r   rF   ©r   rD   rE   r   r   r   rF   B  s    zDerInteger.decodec                 C   sÄ   t  | ||¡ |r\t| jƒdkr(tdƒ‚t| jƒdkr\t d| jdd… ¡d dk r\tdƒ‚d| _d}| jD ],}|  jd	9  _|  jt|ƒ7  _|d
K }ql| jrÀt| jd ƒd@ rÀ|  j|8  _dS )z*Decode a complete DER INTEGER from a file.r   z/Invalid encoding for DER INTEGER: empty payloadrI   z>HNr1   z.Invalid encoding for DER INTEGER: leading zeror)   é   rN   )	r   rC   r#   r5   r%   ÚstructÚunpackrK   r   )r   r@   rE   ÚbitsÚir   r   r   rC   O  s    ,

zDerInteger._decodeFromStream)r   NN)F©r+   r,   r-   r.   r   r?   rF   rC   r   r   r   r   r     s
   

c                   @   s4   e Zd ZdZddd„Zdd„ Zddd	„Zd
d„ ZdS )r	   aR  Class to model a DER-encoded BOOLEAN.

    An example of encoding is::

    >>> from Crypto.Util.asn1 import DerBoolean
    >>> bool_der = DerBoolean(True)
    >>> print(bool_der.encode().hex())

    which will show ``0101ff``, the DER encoding of True.

    And for decoding::

    >>> s = bytes.fromhex('0101ff')
    >>> try:
    >>>   bool_der = DerBoolean()
    >>>   bool_der.decode(s)
    >>>   print(bool_der.value)
    >>> except ValueError:
    >>>   print "Not a valid DER BOOLEAN"

    the output will be ``True``.

    :ivar value: The boolean value
    :vartype value: boolean
    FNc                 C   s   t  | dd|d|¡ || _dS )až  Initialize the DER object as a BOOLEAN.

        Args:
          value (boolean):
            The value of the boolean. Default is False.

          implicit (integer or byte):
            The IMPLICIT tag number (< 0x1F) to use for the encoded object.
            It overrides the universal tag for BOOLEAN (1).
            It cannot be combined with the ``explicit`` parameter.
            By default, there is no IMPLICIT tag.

          explicit (integer or byte):
            The EXPLICIT tag number (< 0x1F) to use for the encoded object.
            It cannot be combined with the ``implicit`` parameter.
            By default, there is no EXPLICIT tag.
        r)   r/   FNrJ   rL   r   r   r   r   €  s    zDerBoolean.__init__c                 C   s   | j r
dnd| _t | ¡S )z9Return the DER BOOLEAN, fully encoded as a binary string.ó   ÿó    ©rK   r5   r   r?   r   r   r   r   r?   –  s    zDerBoolean.encodec                 C   s   t  | ||¡S )zßDecode a DER-encoded BOOLEAN, and re-initializes this object with it.

        Args:
            der_encoded (byte string): A DER-encoded BOOLEAN.

        Raises:
            ValueError: in case of parsing errors.
        rR   rS   r   r   r   rF   œ  s    
zDerBoolean.decodec                 C   sd   t  | ||¡ t| jƒdkr$tdƒ‚t| jd ƒdkr>d| _n"t| jd ƒdkrXd| _ntdƒ‚dS )	z)Decode a DER-encoded BOOLEAN from a file.r)   z7Invalid encoding for DER BOOLEAN: payload is not 1 byter   FrM   TzInvalid payload for DER BOOLEANN)r   rC   r#   r5   r%   r   rK   ©r   r@   rE   r   r   r   rC   ¨  s    zDerBoolean._decodeFromStream)FNN)FrY   r   r   r   r   r	   f  s
   

c                   @   s˜   e Zd ZdZd%dd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zd&dd„Zd'dd„Zdd„ Zd(d!d"„Zd#d$„ ZdS ))r   aÏ  Class to model a DER SEQUENCE.

        This object behaves like a dynamic Python sequence.

        Sub-elements that are INTEGERs behave like Python integers.

        Any other sub-element is a binary string encoded as a complete DER
        sub-element (TLV).

        An example of encoding is:

          >>> from Crypto.Util.asn1 import DerSequence, DerInteger
          >>> from binascii import hexlify, unhexlify
          >>> obj_der = unhexlify('070102')
          >>> seq_der = DerSequence([4])
          >>> seq_der.append(9)
          >>> seq_der.append(obj_der.encode())
          >>> print hexlify(seq_der.encode())

        which will show ``3009020104020109070102``, the DER encoding of the
        sequence containing ``4``, ``9``, and the object with payload ``02``.

        For decoding:

          >>> s = unhexlify(b'3009020104020109070102')
          >>> try:
          >>>   seq_der = DerSequence()
          >>>   seq_der.decode(s)
          >>>   print len(seq_der)
          >>>   print seq_der[0]
          >>>   print seq_der[:]
          >>> except ValueError:
          >>>   print "Not a valid DER SEQUENCE"

        the output will be::

          3
          4
          [4, 9, b'']

        Nc                 C   s.   t  | dd|d|¡ |dkr$g | _n|| _dS )aC  Initialize the DER object as a SEQUENCE.

                :Parameters:
                  startSeq : Python sequence
                    A sequence whose element are either integers or
                    other DER objects.

                  implicit : integer or byte
                    The IMPLICIT tag number (< 0x1F) to use for the encoded object.
                    It overrides the universal tag for SEQUENCE (16).
                    It cannot be combined with the ``explicit`` parameter.
                    By default, there is no IMPLICIT tag.

                  explicit : integer or byte
                    The EXPLICIT tag number (< 0x1F) to use for the encoded object.
                    It cannot be combined with the ``implicit`` parameter.
                    By default, there is no EXPLICIT tag.
                é   r/   TN)r   r   Ú_seq)r   ZstartSeqr7   r8   r   r   r   r   ä  s    zDerSequence.__init__c                 C   s   | j |= d S r   ©r_   ©r   Únr   r   r   Ú__delitem__   s    zDerSequence.__delitem__c                 C   s
   | j | S r   r`   ra   r   r   r   Ú__getitem__  s    zDerSequence.__getitem__c                 C   s   || j |< d S r   r`   )r   ÚkeyrK   r   r   r   Ú__setitem__  s    zDerSequence.__setitem__c                 C   s   || j ||…< d S r   r`   )r   rX   ÚjÚsequencer   r   r   Ú__setslice__	  s    zDerSequence.__setslice__c                 C   s   | j ||…= d S r   r`   ©r   rX   rg   r   r   r   Ú__delslice__  s    zDerSequence.__delslice__c                 C   s   | j td|ƒtd|ƒ… S r   )r_   Úmaxrj   r   r   r   Ú__getslice__  s    zDerSequence.__getslice__c                 C   s
   t | jƒS r   ©r#   r_   r   r   r   r   Ú__len__  s    zDerSequence.__len__c                 C   s   | j  |¡ | S r   ©r_   Úappend©r   Úitemr   r   r   Ú__iadd__  s    zDerSequence.__iadd__c                 C   s   | j  |¡ | S r   rp   rr   r   r   r   rq     s    zDerSequence.appendc                 C   s   | j  ||¡ | S r   )r_   Úinsert)r   Úindexrs   r   r   r   ru     s    zDerSequence.insertTc                    s   ‡ fdd„| j D ƒ}t|ƒS )zìReturn the number of items in this sequence that are
                integers.

                Args:
                  only_non_negative (boolean):
                    If ``True``, negative integers are not counted in.
                c                    s   g | ]}t |ˆ ƒr|‘qS r   )r   ©Ú.0r   ©r   r   r   Ú
<listcomp>*  s     
 z'DerSequence.hasInts.<locals>.<listcomp>)r_   r#   )r   r   Úitemsr   ry   r   ÚhasInts!  s    	zDerSequence.hasIntsc                 C   s   | j o|  |¡t| j ƒkS )a©  Return ``True`` if all items in this sequence are integers
                or non-negative integers.

                This function returns False is the sequence is empty,
                or at least one member is not an integer.

                Args:
                  only_non_negative (boolean):
                    If ``True``, the presence of negative integers
                    causes the method to return ``False``.)r_   r|   r#   )r   r   r   r   r   ÚhasOnlyInts-  s    zDerSequence.hasOnlyIntsc                 C   sf   d| _ | jD ]N}t|ƒr(|  j |7  _ qt|ƒrH|  j t|ƒ ¡ 7  _ q|  j | ¡ 7  _ qt | ¡S )zùReturn this DER SEQUENCE, fully encoded as a
                binary string.

                Raises:
                  ValueError: if some elements in the sequence are neither integers
                              nor byte strings.
                r/   )r5   r_   r   r   r   r?   r   rr   r   r   r   r?   :  s    
zDerSequence.encodeFc                 C   s.   || _ tj| ||d�}|r*|  ¡ s*tdƒ‚|S )a9  Decode a complete DER SEQUENCE, and re-initializes this
                object with it.

                Args:
                  der_encoded (byte string):
                    A complete SEQUENCE DER element.
                  nr_elements (None or integer or list of integers):
                    The number of members the SEQUENCE can have
                  only_ints_expected (boolean):
                    Whether the SEQUENCE is expected to contain only integers.
                  strict (boolean):
                    Whether decoding must check for strict DER compliancy.

                Raises:
                  ValueError: in case of parsing errors.

                DER INTEGERs are decoded into Python integers. Any other DER
                element is not decoded. Its validity is not checked.
                rQ   zSome members are not INTEGERs)Ú_nr_elementsr   rF   r}   r%   )r   rD   rE   Znr_elementsZonly_ints_expectedr'   r   r   r   rF   L  s
    zDerSequence.decodec                 C   sî   g | _ t | ||¡ t| jƒ}| ¡ dkrŒ| ¡  tƒ }| ||¡ |jdkr`| j  | 	¡ ¡ qt
ƒ }| 	¡ }|j||d� | j  |j¡ qd}| jdk	rÔzt| j ƒ| jk}W n$ tk
rÒ   t| j ƒ| jk}Y nX |sêtdt| j ƒ ƒ‚dS )z+Decode a complete DER SEQUENCE from a file.r   rI   rQ   TNz1Unexpected number of members (%d) in the sequence)r_   r   rC   r   r5   r$   r    r3   rq   r"   r   rF   rK   r~   r#   r   r%   )r   r@   rE   rG   ÚderÚderIntÚdataÚokr   r   r   rC   i  s.    


ÿzDerSequence._decodeFromStream)NNN)T)T)FNF)r+   r,   r-   r.   r   rc   rd   rf   ri   rk   rm   ro   rt   rq   ru   r|   r}   r?   rF   rC   r   r   r   r   r   ¹  s"   *



c                   @   s   e Zd ZdZddd„ZdS )r
   aâ  Class to model a DER OCTET STRING.

    An example of encoding is:

    >>> from Crypto.Util.asn1 import DerOctetString
    >>> from binascii import hexlify, unhexlify
    >>> os_der = DerOctetString(b'\xaa')
    >>> os_der.payload += b'\xbb'
    >>> print hexlify(os_der.encode())

    which will show ``0402aabb``, the DER encoding for the byte string
    ``b'\xAA\xBB'``.

    For decoding:

    >>> s = unhexlify(b'0402aabb')
    >>> try:
    >>>   os_der = DerOctetString()
    >>>   os_der.decode(s)
    >>>   print hexlify(os_der.payload)
    >>> except ValueError:
    >>>   print "Not a valid DER OCTET STRING"

    the output will be ``aabb``.

    :ivar payload: The content of the string
    :vartype payload: byte string
    r/   Nc                 C   s   t  | d||d¡ dS )ah  Initialize the DER object as an OCTET STRING.

        :Parameters:
          value : byte string
            The initial payload of the object.
            If not specified, the payload is empty.

          implicit : integer
            The IMPLICIT tag to use for the encoded object.
            It overrides the universal tag for OCTET STRING (4).
        é   FN©r   r   )r   rK   r7   r   r   r   r   ¬  s    zDerOctetString.__init__)r/   N©r+   r,   r-   r.   r   r   r   r   r   r
   Ž  s   c                   @   s   e Zd ZdZdd„ ZdS )r   z"Class to model a DER NULL element.c                 C   s   t  | dddd¡ dS )z$Initialize the DER object as a NULL.é   r/   NFr„   r   r   r   r   r   ¾  s    zDerNull.__init__Nr…   r   r   r   r   r   »  s   c                   @   s4   e Zd ZdZddd„Zdd„ Zdd	d
„Zdd„ ZdS )r   a(  Class to model a DER OBJECT ID.

    An example of encoding is:

    >>> from Crypto.Util.asn1 import DerObjectId
    >>> from binascii import hexlify, unhexlify
    >>> oid_der = DerObjectId("1.2")
    >>> oid_der.value += ".840.113549.1.1.1"
    >>> print hexlify(oid_der.encode())

    which will show ``06092a864886f70d010101``, the DER encoding for the
    RSA Object Identifier ``1.2.840.113549.1.1.1``.

    For decoding:

    >>> s = unhexlify(b'06092a864886f70d010101')
    >>> try:
    >>>   oid_der = DerObjectId()
    >>>   oid_der.decode(s)
    >>>   print oid_der.value
    >>> except ValueError:
    >>>   print "Not a valid DER OBJECT ID"

    the output will be ``1.2.840.113549.1.1.1``.

    :ivar value: The Object ID (OID), a dot separated list of integers
    :vartype value: string
    Ú Nc                 C   s   t  | dd|d|¡ || _dS )a’  Initialize the DER object as an OBJECT ID.

        :Parameters:
          value : string
            The initial Object Identifier (e.g. "1.2.0.0.6.2").
          implicit : integer
            The IMPLICIT tag to use for the encoded object.
            It overrides the universal tag for OBJECT ID (6).
          explicit : integer
            The EXPLICIT tag to use for the encoded object.
        é   r/   FNrJ   rL   r   r   r   r   â  s    zDerObjectId.__init__c                 C   sì   dd„ | j  d¡D ƒ}t|ƒdk r*tdƒ‚|d dkr>tdƒ‚|d dk r^|d d	kr^td
ƒ‚d|d  |d  g|dd…  }g }t|ƒD ]:}| |d@ ¡ |dL }|rŒ| |d@ dB ¡ |dL }q¦qŒd dd„ t|ƒD ƒ¡| _t 	| ¡S )zCReturn the DER OBJECT ID, fully encoded as a
        binary string.c                 S   s   g | ]}t |ƒ‘qS r   )rO   rw   r   r   r   rz   õ  s     z&DerObjectId.encode.<locals>.<listcomp>Ú.rI   z$Not a valid Object Identifier stringr   z!First component must be 0, 1 or 2r)   é'   z#Second component must be 39 at mosté(   Nr;   é   r1   r/   c                 S   s   g | ]}t |ƒ‘qS r   )r   rw   r   r   r   rz     s     )
rK   Úsplitr#   r%   Úreversedrq   Újoinr5   r   r?   )r   ÚcompsÚsubcompsr<   Úvr   r   r   r?   ñ  s"    "zDerObjectId.encodeFc                 C   s   t  | ||¡S )ab  Decode a complete DER OBJECT ID, and re-initializes this
        object with it.

        Args:
            der_encoded (byte string):
                A complete DER OBJECT ID.
            strict (boolean):
                Whether decoding must check for strict DER compliancy.

        Raises:
            ValueError: in case of parsing errors.
        rR   rS   r   r   r   rF     s    zDerObjectId.decodec                 C   sæ   t  | ||¡ t| jƒ}g }d}| ¡ rX| ¡ }|d> |d@  }|d@ s | |¡ d}q t|ƒdkrltdƒ‚|d dk rŽd|d g|dd…< n>|d d	k r´d|d d g|dd…< nd
|d d	 g|dd…< d 	dd„ |D ƒ¡| _
dS )z,Decode a complete DER OBJECT ID from a file.r   rŒ   r;   r1   zEmpty payloadr‹   Nr)   éP   rI   r‰   c                 S   s   g | ]}t |ƒ‘qS r   )Ústrrw   r   r   r   rz   7  s     z1DerObjectId._decodeFromStream.<locals>.<listcomp>)r   rC   r   r5   r$   r*   rq   r#   r%   r�   rK   )r   r@   rE   rG   r‘   r’   Úcr   r   r   rC     s$    

zDerObjectId._decodeFromStream)r‡   NN)FrY   r   r   r   r   r   Ä  s
   

c                   @   s4   e Zd ZdZddd„Zdd„ Zdd	d
„Zdd„ ZdS )r   a¢  Class to model a DER BIT STRING.

    An example of encoding is:

    >>> from Crypto.Util.asn1 import DerBitString
    >>> bs_der = DerBitString(b'\xAA')
    >>> bs_der.value += b'\xBB'
    >>> print(bs_der.encode().hex())

    which will show ``030300aabb``, the DER encoding for the bit string
    ``b'\xAA\xBB'``.

    For decoding:

    >>> s = bytes.fromhex('030300aabb')
    >>> try:
    >>>   bs_der = DerBitString()
    >>>   bs_der.decode(s)
    >>>   print(bs_der.value.hex())
    >>> except ValueError:
    >>>   print "Not a valid DER BIT STRING"

    the output will be ``aabb``.

    :ivar value: The content of the string
    :vartype value: byte string
    r/   Nc                 C   s4   t  | dd|d|¡ t|t ƒr*| ¡ | _n|| _dS )aÉ  Initialize the DER object as a BIT STRING.

        :Parameters:
          value : byte string or DER object
            The initial, packed bit string.
            If not specified, the bit string is empty.
          implicit : integer
            The IMPLICIT tag to use for the encoded object.
            It overrides the universal tag for BIT STRING (3).
          explicit : integer
            The EXPLICIT tag to use for the encoded object.
        é   r/   FN)r   r   Ú
isinstancer?   rK   rL   r   r   r   r   W  s    
zDerBitString.__init__c                 C   s   d| j  | _t | ¡S )zBReturn the DER BIT STRING, fully encoded as a
        byte string.r[   r\   r   r   r   r   r?   l  s    zDerBitString.encodeFc                 C   s   t  | ||¡S )aT  Decode a complete DER BIT STRING, and re-initializes this
        object with it.

        Args:
            der_encoded (byte string): a complete DER BIT STRING.
            strict (boolean):
                Whether decoding must check for strict DER compliancy.

        Raises:
            ValueError: in case of parsing errors.
        rR   rS   r   r   r   rF   t  s    zDerBitString.decodec                 C   sN   t  | ||¡ | jr.t| jd ƒdkr.tdƒ‚d| _| jrJ| jdd… | _dS )z1Decode a complete DER BIT STRING DER from a file.r   zNot a valid BIT STRINGr/   r)   N)r   rC   r5   r   r%   rK   r]   r   r   r   rC   ƒ  s    zDerBitString._decodeFromStream)r/   NN)FrY   r   r   r   r   r   :  s
   

c                   @   sT   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zddd„Z	dd„ Z
dd„ ZdS )r   a…  Class to model a DER SET OF.

    An example of encoding is:

    >>> from Crypto.Util.asn1 import DerBitString
    >>> from binascii import hexlify, unhexlify
    >>> so_der = DerSetOf([4,5])
    >>> so_der.add(6)
    >>> print hexlify(so_der.encode())

    which will show ``3109020104020105020106``, the DER encoding
    of a SET OF with items 4,5, and 6.

    For decoding:

    >>> s = unhexlify(b'3109020104020105020106')
    >>> try:
    >>>   so_der = DerSetOf()
    >>>   so_der.decode(s)
    >>>   print [x for x in so_der]
    >>> except ValueError:
    >>>   print "Not a valid DER SET OF"

    the output will be ``[4, 5, 6]``.
    Nc                 C   s:   t  | dd|d¡ g | _d| _|r6|D ]}|  |¡ q&dS )a9  Initialize the DER object as a SET OF.

        :Parameters:
          startSet : container
            The initial set of integers or DER encoded objects.
          implicit : integer
            The IMPLICIT tag to use for the encoded object.
            It overrides the universal tag for SET OF (17).
        é   r/   TN)r   r   r_   Ú
_elemOctetÚadd)r   ZstartSetr7   Úer   r   r   r   ®  s    
zDerSetOf.__init__c                 C   s
   | j | S r   r`   ra   r   r   r   rd   Ã  s    zDerSetOf.__getitem__c                 C   s
   t | jƒS r   )Úiterr_   r   r   r   r   Ú__iter__Æ  s    zDerSetOf.__iter__c                 C   s
   t | jƒS r   rn   r   r   r   r   ro   É  s    zDerSetOf.__len__c                 C   sh   t |ƒrd}nt|tƒr | j}nt|d ƒ}| j|krN| jdk	rHtdƒ‚|| _|| jkrd| j |¡ dS )zâAdd an element to the set.

        Args:
            elem (byte string or integer):
              An element of the same type of objects already in the set.
              It can be an integer or a DER encoded object.
        rI   r   Nz&New element does not belong to the set)	r   r—   r   r3   r   r™   r%   r_   rq   )r   ÚelemÚeor   r   r   rš   Ì  s    	



zDerSetOf.addFc                 C   s   t  | ||¡S )aÞ  Decode a complete SET OF DER element, and re-initializes this
        object with it.

        DER INTEGERs are decoded into Python integers. Any other DER
        element is left undecoded; its validity is not checked.

        Args:
            der_encoded (byte string): a complete DER BIT SET OF.
            strict (boolean):
                Whether decoding must check for strict DER compliancy.

        Raises:
            ValueError: in case of parsing errors.
        rR   rS   r   r   r   rF   ä  s    zDerSetOf.decodec                 C   s®   g | _ t | ||¡ t| jƒ}d}| ¡ dkrª| ¡  tƒ }| ||¡ |dk rX|j}n||jkrjtdƒ‚|dkr„| j  	| 
¡ ¡ q"tƒ }| | 
¡ |¡ | j  	|j¡ q"dS )z)Decode a complete DER SET OF from a file.éÿÿÿÿr   z)Not all elements are of the same DER typerI   N)r_   r   rC   r   r5   r$   r    r3   r%   rq   r"   r   rF   rK   )r   r@   rE   rG   Z
setIdOctetr   r€   r   r   r   rC   ö  s"    

zDerSetOf._decodeFromStreamc                 C   sf   g }| j D ]<}t|ƒr$t|ƒ ¡ }nt|tƒr8| ¡ }n|}| |¡ q
| ¡  d |¡| _	t | ¡S )zRReturn this SET OF DER element, fully encoded as a
        binary string.
        r/   )
r_   r   r   r?   r—   r   rq   Úsortr�   r5   )r   Úorderedrs   Zbysr   r   r   r?     s    


zDerSetOf.encode)NN)F)r+   r,   r-   r.   r   rd   r�   ro   rš   rF   rC   r?   r   r   r   r   r   “  s   

!)F)rU   ZCrypto.Util.py3compatr   r   r   ZCrypto.Util.numberr   r   Ú__all__r   Úobjectr   r   r   r	   r   r
   r   r   r   r   r   r   r   r   Ú<module>   s,       ÿ
	  7_S V-	vY