
     h1                        d Z ddlZddlmZ ddlmZmZ ddlmZm	Z	m
Z
 ddlmZ 	 ddlmZ n# e$ r	 ddlmZ Y nw xY wd	Z	 ddeded         dedededededefdZdededed         dedef
dZdeded         dedefdZdededededeeef         f
dZdeded         dedededededeeef         fdZdeeef         dedefdZdS )z,Anything related to encryption / decryption.    N)md5)TupleUnion   )b_ord_str_)ByteStringObject)Literals    (N^NuAd NV.. h>/dSizTpasswordrev)         
key_lengthowner_entryp_entry	id1_entrymetadata_encryptreturnc                 F   t          t          |           t          t                    z   dd                   }t          |          }|                    |j                   t          j        d|          }	|                    |	           |                    |j                   |dk    r|s|                    d           |                                }
|dk    r;t          d          D ]+}t          |
d|                                                   }
,|
d|         S )a  
    Implementation of algorithm 3.2 of the PDF standard security handler.

    See section 3.5.2 of the PDF 1.6 reference.

    Args:
        password: The encryption secret as a bytes-string
        rev: The encryption revision (see PDF standard)
        key_length:
        owner_entry:
        p_entry: A set of flags specifying which operations shall be permitted
            when the document is opened with user access. If bit 2 is set to 1, all other
            bits are ignored and all operations are permitted. If bit 2 is set to 0,
            permission for operations are based on the values of the remaining flags
            defined in Table 24.
        id1_entry:
        metadata_encrypt:  (Default value = True)

    Returns:
        An MD5 hash of key_length characters.
    N    z<ir   s   2   )
r   r	   _encryption_paddingr   updateoriginal_bytesstructpackdigestrange)r   r   r   r   r   r   r   password_bytesmp_entry_bytesmd5_hash_s               K/var/www/html/Sam_Eipo/venv/lib/python3.11/site-packages/pypdf/_security.py_alg32r'   6   s   F h$/B*C*CCSbSIJJN 	NA HH['((( Kg..MHH] HHY%&&& axx(x	$%%%xxzzH axxr 	; 	;A8KZK01188::HH
 KZK      owner_passworduser_passwordc                 6   t          | ||          }t          |t          t                    z   dd                   }t	          ||          }|dk    rDt          dd          D ]3d                    fd|D                       }t	          ||          }4|S )aP  
    Implementation of algorithm 3.3 of the PDF standard security handler,
    section 3.5.2 of the PDF 1.6 reference.

    Args:
        owner_password:
        user_password:
        rev: The encryption revision (see PDF standard)
        key_length:

    Returns:
        A transformed version of the owner and the user password
    Nr   r   r       c              3   V   K   | ]#}t          t          |          z            V  $d S )N)chrr   ).0key_charis     r&   	<genexpr>z_alg33.<locals>.<genexpr>   s6      JJ(c$x..1"455JJJJJJr(   )_alg33_1r   r	   r   RC4_encryptr    join)	r)   r*   r   r   keyuser_password_bytesvalnew_keyr2   s	           @r&   _alg33r;   |   s    " >3

3
3C md3F.G.GG"MNN c.
/
/C axxq" 	, 	,AggJJJJcJJJJJGgs++CC Jr(   c                 *   t          | t          t                    z   dd                   }t          |          }|                                }|dk    r3t          d          D ]#}t          |                                          }$|d|         }|S )z
    Steps 1-4 of algorithm 3.3.

    Args:
        password:
        rev: The encryption revision (see PDF standard)
        key_length:

    Returns:
        A transformed version of the password
    Nr   r   r   )r   r	   r   r   r   r    )r   r   r   r!   r"   r$   r%   r7   s           r&   r4   r4      s     D)<$=$==ssCDDN 	NA xxzzH
axxr 	. 	.A8}}++--HH
 ;J;
CJr(   c                 d    d}d}t          | |||||          }t          |t                    }||fS )af  
    Implementation of algorithm 3.4 of the PDF standard security handler.

    See section 3.5.2 of the PDF 1.6 reference.

    Args:
        password:
        owner_entry:
        p_entry: A set of flags specifying which operations shall be permitted
            when the document is opened with user access. If bit 2 is set to 1, all other
            bits are ignored and all operations are permitted. If bit 2 is set to 0,
            permission for operations are based on the values of the remaining flags
            defined in Table 24.
        id1_entry:

    Returns:
        A Tuple (u-value, key)
    r      )r'   r5   r   )r   r   r   r   r   r   r7   Us           r&   _alg34r@      sB    4 CJ
3
K)
L
LC 	C,--A c6Mr(   c           
         t          | |||||          }t                      }|                    t                     |                    |j                   |                                }	t          ||	          }
t          dd          D ]H}d}|D ]1}|t          t          t          |          |z                      z  }2t          ||
          }
I|
dz   |fS )a  
    Implementation of algorithm 3.4 of the PDF standard security handler.

    See section 3.5.2 of the PDF 1.6 reference.

    Args:
        password:
        rev: The encryption revision (see PDF standard)
        key_length:
        owner_entry:
        p_entry: A set of flags specifying which operations shall be permitted
            when the document is opened with user access. If bit 2 is set to 1, all other
            bits are ignored and all operations are permitted. If bit 2 is set to 0,
            permission for operations are based on the values of the remaining flags
            defined in Table 24.
        id1_entry:
        metadata_encrypt: A boolean

    Returns:
        A tuple (value, key)
    r   r,   r(   s                   )r'   r   r   r   r   r   r5   r    r   r/   r   )r   r   r   r   r   r   r   r7   r"   r$   r9   r2   r:   ks                 r&   _alg35rC      s    @ 3
K)
L
LC 	AHH !!!
 HHY%&&&xxzzH c8
$
$C 1b\\ ( ( 	, 	,Ar#d1ggk**+++GG'3'' ,$$r(   r7   	plaintextc           
      F   t          t          d                    }d}t          d          D ]M}|||         z   t          | |t          |           z                     z   dz  }||         ||         c||<   ||<   Nd\  }}g }|D ]}|dz   dz  }|||         z   dz  }||         ||         c||<   ||<   |||         ||         z   dz           }|                    t          t          t          |          |z                                 d                    |          S )N   r   )r   r   r   r(   )listr    r   lenappendr   r/   r6   )r7   rD   Sjr2   retvalplaintext_charts           r&   r5   r5   ,  s0   U3ZZA	A3ZZ    1XSSXX.///36qT1Q4
!addDAqF# 9 9UcM1XqT1Q4
!adqtad{c!"bT.11A56677888888Fr(   )T)__doc__r   hashlibr   typingr   r   _utilsr   r   r	   genericr
   r   ImportErrortyping_extensionsr   strintboolbytesr'   r;   r4   r@   rC   r5    r(   r&   <module>r[      s  < 3 2                " " " " " " " " " " % % % % % %* * * * *)))))))*   "C! C!C!		C! C! "	C!
 C!  C! C! C! C! C! C!L$$(+$29'2B$PS$
$ $ $ $Ns !1 s u    B##!# #  	#
 5%<# # # #L?%?%		?% ?% "	?%
 ?%  ?% ?% 5%<?% ?% ?% ?%DU3:& 5 U      s   - ;;