o
    5h                     @   s>   d Z dgZddlmZ ddlmZ G dd deZdd ZdS )	z
OpenPGP mode.
OpenPgpMode    )_copy_bytes)get_random_bytesc                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	r   az  OpenPGP mode.

    This mode is a variant of CFB, and it is only used in PGP and
    OpenPGP_ applications. If in doubt, use another mode.

    An Initialization Vector (*IV*) is required.

    Unlike CFB, the *encrypted* IV (not the IV itself) is
    transmitted to the receiver.

    The IV is a random data block. For legacy reasons, two of its bytes are
    duplicated to act as a checksum for the correctness of the key, which is now
    known to be insecure and is ignored. The encrypted IV is therefore 2 bytes
    longer than the clean IV.

    .. _OpenPGP: http://tools.ietf.org/html/rfc4880

    :undocumented: __init__
    c                 C   s   |j | _ d| _|j||jfd| j  | j d d|}td d |}t|| j kr5|||dd   | _n"t|| j d krK|| _||d d }nt	d| j | j d f | | _
| _|j||jf| j| j  d  | j d d|| _d S )NF       )IVsegment_size   z4Length of IV must be %d or %d bytes for MODE_OPENPGP)
block_size_done_first_blocknewMODE_CFBr   lenencrypt_encrypted_IVdecrypt
ValueErrorivr   _cipher)selffactorykeyr   cipher_params	IV_cipher r   o/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/Crypto/Cipher/_mode_openpgp.py__init__=   s<   zOpenPgpMode.__init__c                 C   s&   | j |}| js| j| }d| _|S )a  Encrypt data with the key and the parameters set at initialization.

        A cipher object is stateful: once you have encrypted a message
        you cannot encrypt (or decrypt) another message using the same
        object.

        The data to encrypt can be broken up in two or
        more pieces and `encrypt` can be called multiple times.

        That is, the statement:

            >>> c.encrypt(a) + c.encrypt(b)

        is equivalent to:

             >>> c.encrypt(a+b)

        This function does not add any padding to the plaintext.

        :Parameters:
          plaintext : bytes/bytearray/memoryview
            The piece of data to encrypt.

        :Return:
            the encrypted data, as a byte string.
            It is as long as *plaintext* with one exception:
            when encrypting the first message chunk,
            the encypted IV is prepended to the returned ciphertext.
        T)r   r   r   r   )r   	plaintextresr   r   r   r   g   s
   
zOpenPgpMode.encryptc                 C   s   | j |S )a  Decrypt data with the key and the parameters set at initialization.

        A cipher object is stateful: once you have decrypted a message
        you cannot decrypt (or encrypt) another message with the same
        object.

        The data to decrypt can be broken up in two or
        more pieces and `decrypt` can be called multiple times.

        That is, the statement:

            >>> c.decrypt(a) + c.decrypt(b)

        is equivalent to:

             >>> c.decrypt(a+b)

        This function does not remove any padding from the plaintext.

        :Parameters:
          ciphertext : bytes/bytearray/memoryview
            The piece of data to decrypt.

        :Return: the decrypted data (byte string).
        )r   r   )r   
ciphertextr   r   r   r      s   zOpenPgpMode.decryptN)__name__
__module____qualname____doc__r   r   r   r   r   r   r   r   (   s
    *%c              
   K   s   | dd}| dd}d||fkrt| j}|dur$|dur#tdn|}z| d}W n tyA } ztdt| d}~ww t| |||S )a#  Create a new block cipher, configured in OpenPGP mode.

    :Parameters:
      factory : module
        The module.

    :Keywords:
      key : bytes/bytearray/memoryview
        The secret key to use in the symmetric cipher.

      IV : bytes/bytearray/memoryview
        The initialization vector to use for encryption or decryption.

        For encryption, the IV must be as long as the cipher block size.

        For decryption, it must be 2 bytes longer (it is actually the
        *encrypted* IV which was prefixed to the ciphertext).
    r   Nr   )NNz*You must either use 'iv' or 'IV', not bothr   zMissing component: )popr   r   	TypeErrorKeyErrorstrr   )r   kwargsr   r   r   er   r   r   _create_openpgp_cipher   s    
r+   N)	r$   __all__Crypto.Util.py3compatr   Crypto.Randomr   objectr   r+   r   r   r   r   <module>   s    