
    9i                     B    S r S/rSSKJr  SSKJr   " S S\5      rS rg)z
OpenPGP mode.
OpenPgpMode    )_copy_bytes)get_random_bytesc                   *    \ rS rSrSrS rS rS rSrg)r   (   aJ  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                    UR                   U l         SU l        UR                  " UUR                  4SU R                   -  U R                   S-  S.UD6n[	        S S U5      n[        U5      U R                   :X  a  UR                  X3SS  -   5      U l        O^[        U5      U R                   S-   :X  a  X0l        UR                  U5      S S nO'[        SU R                   U R                   S-   4-  5      eU=U l
        U l        UR                  " UUR                  4U R                  U R                   * S  U R                   S-  S.UD6U l        g )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_ciphers         [/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/Crypto/Cipher/_mode_openpgp.py__init__OpenPgpMode.__init__=   sa    ",,!& KK(() #T__4%)__q%8	)
 ()	 tR( r7doo%!*!2!2223<!@DW!++!# ""2&s+B 1 $11DEF G G $' {{#,,-  $114??2B2CD)-1)<	-
 ,-    c                     U R                   R                  U5      nU R                  (       d  U R                  U-   nSU l        U$ )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ress      r   r   OpenPgpMode.encryptg   s>    > ll""9-%%$$s*C%)D"
r"   c                 8    U R                   R                  U5      $ )aa  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   
ciphertexts     r   r   OpenPgpMode.decrypt   s    6 ||##J//r"   )r   r   r   r   r   r   N)	__name__
__module____qualname____firstlineno____doc__r    r   r   __static_attributes__ r"   r   r   r   (   s    ((-T#J0r"   c                 8   UR                  SS5      nUR                  SS5      nSX#4:X  a  [        U R                  5      nUb  Ub  [        S5      eOUn UR                  S5      n[        XX!5      $ ! [         a  n[        S[        U5      -   5      eSnAff = f)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   es         r   _create_openpgp_cipherr8      s    ( 
D$	B	D$	Bxg001	~>HII  8jj wR00  8-A6778s   A3 3
B=BBN)	r.   __all__Crypto.Util.py3compatr   Crypto.Randomr   objectr   r8   r0   r"   r   <module>r=      s-   > / - *0& 0D$1r"   