
    Eh%                         d Z ddlZej                  d   dk(  rej                  d   dk(  rddl ddl ddlmZ ddlZ ed       ed      dddddfd	Z	dd
Z
y)a  Fast counter functions for CTR cipher modes.

CTR is a chaining mode for symmetric block encryption or decryption.
Messages are divideded into blocks, and the cipher operation takes
place on each block using the secret key and a unique *counter block*.

The most straightforward way to fulfil the uniqueness property is
to start with an initial, random *counter block* value, and increment it as
the next block is processed.

The block ciphers from `Crypto.Cipher` (when configured in *MODE_CTR* mode)
invoke a callable object (the *counter* parameter) to get the next *counter block*.
Unfortunately, the Python calling protocol leads to major performance degradations.

The counter functions instantiated by this module will be invoked directly
by the ciphers in `Crypto.Cipher`. The fact that the Python layer is bypassed
lead to more efficient (and faster) execution of CTR cipher modes.

An example of usage is the following:

    >>> from Crypto.Cipher import AES
    >>> from Crypto.Util import Counter
    >>>
    >>> pt = b' '*1000000
    >>> ctr = Counter.new(128)
    >>> cipher = AES.new(b' '*16, AES.MODE_CTR, counter=ctr)
    >>> ct = cipher.encrypt(pt)

:undocumented: __package__
    N      )*)_counter Fc                 V   t        | d      \  }}	|	dk7  rt        d| fz        |dk  rt        d      |dkD  rt        d      t        |||      }
|r,t        j                  t        |      t        |      |
||      S t        j                  t        |      t        |      |
||      S )	ac  Create a stateful counter block function suitable for CTR encryption modes.

    Each call to the function returns the next counter block.
    Each counter block is made up by three parts::
 
      prefix || counter value || postfix

    The counter value is incremented by one at each call.

    :Parameters:
      nbits : integer
        Length of the desired counter, in bits. It must be a multiple of 8.
      prefix : byte string
        The constant prefix of the counter block. By default, no prefix is
        used.
      suffix : byte string
        The constant postfix of the counter block. By default, no suffix is
        used.
      initial_value : integer
        The initial value of the counter. Default value is 1.
      little_endian : boolean
        If True, the counter number will be encoded in little endian format.
        If False (default), in big endian format.
      allow_wraparound : boolean
        If True, the function will raise an *OverflowError* exception as soon
        as the counter wraps around. If False (default), the counter will
        simply restart from zero.
      disable_shortcut : boolean
        If True, do not make ciphers from `Crypto.Cipher` bypass the Python
        layer when invoking the counter block function.
        If False (default), bypass the Python layer.
    :Returns:
      The counter block function.
       r   z%nbits must be a multiple of 8; got %dr   znbits too smalli  znbits too large)allow_wraparounddisable_shortcut)divmod
ValueError_encoder   _newLEbstr_newBE)nbitsprefixsuffixinitial_valueoverflowlittle_endianr
   r   nbytes	remainderinitvals              T/var/www/html/bid_assistant/venv/lib/python3.12/site-packages/Crypto/Util/Counter.pynewr   ?   s    J !*VYA~@E8KLLz*++	&*++mV];GtF|T&\7Ue  yI  J  	JtF|T&\7Ue  yI  J  	J    c                     g }t        |       } t        |      D ]E  }|r|j                  t        | dz               n|j	                  dt        | dz               | dz  } G t        d      j                  |      S )N   r   r	   r   )longrangeappendbchrinsertbjoin)nr   r   retvalis        r   r   r   t   sn    FQA6] MM$q4x.)MM!T!d(^,	a R5::fr   )F)__doc__sysversion_infoCrypto.Util.py21compatCrypto.Util.py3compatCrypto.Utilr   structr%   r   r    r   r   <module>r2      sl   0< A! 0 0 3q 8( #    eAbEQV[ns  GL 3Jj	r   