a
    !f                     @   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rj|||dd   | _nDt|| j d kr|| _||d d }nt	d| j | j d f | | _
| _|j||jf| j| j  d  | j d d|| _d S )NF       )IVZsegment_size   z4Length of IV must be %d or %d bytes for MODE_OPENPGP)
block_size_done_first_blocknewZMODE_CFBr   lenencrypt_encrypted_IVdecrypt
ValueErrorivr   _cipher)selffactorykeyr   Zcipher_paramsZ	IV_cipher r   \/var/www/html/python-backend/venv/lib/python3.9/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   Z	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   Z
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rH|durLtdn|}z| d}W n4 ty } ztdt| W Y d}~n
d}~0 0 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__ZCrypto.Util.py3compatr   ZCrypto.Randomr   objectr   r%   r   r   r   r   <module>   s    