
    Wwg"              	           d dl Z d dlmZ d dlmZ d dlmZ d dlmZ dZ	d Z
deeef   d	efd
Zd Zd Zd ZdefdZ	 ddededed	efdZy)    N)md5)Union)generic)rc4_encrypts    (N^NuAd NV.. h>/dSizc                    | t         z   dd } t        |       }|j                  |       t        j                  d|j                               }|j                  |       |j                  |       |dk\  r|s|j                  d       |j                         }|dk\  r,t        d      D ]  }	t        |d|       j                         }  |d| S )z{
    Implementation of algorithm 3.2 of the PDF standard security handler,
    section 3.5.2 of the PDF 1.6 reference.
    N    z<I   s      2   )_encryption_paddingr   updatestructpack	as_uint32digestrange)
passwordrevkeylenowner_entryp_entry	id1_entryencrypt_metadatammd5_hashis
             V/var/www/horilla/myenv/lib/python3.12/site-packages/pyhanko/pdf_utils/crypt/_legacy.pyderive_legacy_file_keyr      s     ..4H 	HA HH[ kk$ 1 1 34GHHW HHY ax(	$%xxzH axr 	7A8GV,-446H	7 GV    r   returnc                 \    t        | t              rt        j                  | d d       S | d d S )Nr   )
isinstancestrr   encode_pdfdocencoding)r   s    r   legacy_normalise_pwr%   @   s/    (C ,,Xcr];;}r   c                     t        | ||      }|t        z   dd }t        ||      }|dk\  r1t        dd      D ]"  t	        fd|D              }t        ||      }$ |S )z{
    Implementation of algorithm 3.3 of the PDF standard security handler,
    section 3.5.2 of the PDF 1.6 reference.
    Nr   r
         c              3   (   K   | ]	  }|z    y wN .0br   s     r   	<genexpr>z)compute_o_value_legacy.<locals>.<genexpr>]   s     /aAE/   )compute_o_value_legacy_prepr   r   r   bytes)	owner_pwduser_pwdr   r   keyvalnew_keyr   s          @r   compute_o_value_legacyr8   G   sv     &if
=C ..4H c8
$C axq" 	,A/3//Ggs+C	,
 Jr   c                     | t         z   dd } t        |       }|j                         }|dk\  r)t        d      D ]  }t        |      j                         } |d| }|S )z$
    Steps 1-4 of algorithm 3.3
    Nr   r
   r   )r   r   r   r   )r   r   r   r   r   r   r5   s          r   r1   r1   d   sm     ..4H 	HA xxzH
axr 	.A8}++-H	. 7F
CJr   c           	      N    t        | dd|||d      }t        |t              }||fS ){
    Implementation of algorithm 3.4 of the PDF standard security handler,
    section 3.5.2 of the PDF 1.6 reference.
          Tr   )r   r   r   )r   r   r   r   r5   us         r   compute_u_value_r2r@   ~   s7     !!QWi$C 	C,-A c6Mr   r   c           	      0   t        | ||||||      }t               }|j                  t               |j                  |       |j	                         }	t        ||	      }
t        dd      D ]"  t        fd|D              }t        ||
      }
$ |
dz   |fS )r;   r>   r'   r(   c              3   (   K   | ]	  }|z    y wr*   r+   r,   s     r   r/   z&compute_u_value_r34.<locals>.<genexpr>   s     +!A+r0   s                   )r   r   r   r   r   r   r   r2   )r   r   r   r   r   r   r   r5   r   r   r6   r7   r   s               @r   compute_u_value_r34rC      s      !)C 	AHH !
 HHYxxzH c8
$C 1b\ (+s++'3'( ,$$r   
shared_keyidnum
generationc                 $   t        j                  d|      dd }t        j                  d|      dd }| |z   |z   }t        |      t        |       dz   k(  sJ |r|dz  }t        |      j	                         }|dt        dt        |       dz          S )a  
    Function that does the key derivation for PDF's legacy security handlers.

    :param shared_key:
        Global file encryption key.
    :param idnum:
        ID of the object being written.
    :param generation:
        Generation number of the object being written.
    :param use_aes:
        Boolean indicating whether the security handler uses RC4 or AES(-128).
    :return:
    z<iNr
   r<   r=   s   sAlT   )r   r   lenr   r   min)rD   rE   rF   use_aespack1pack2r5   r   s           r   legacy_derive_object_keyrN      s      KKe$Ra(EKKj)"1-E
u
u
$Cs8J!+,,,w3x H2c"c*o1233r   )F)r   hashlibr   typingr   pyhanko.pdf_utilsr   pyhanko.pdf_utils.crypt._utilr   r   r   r#   r2   r%   r8   r1   r@   boolrC   intrN   r+   r   r   <module>rU      s       % 5  .b%U
"3  :4&5% 5%r =B44!4/24
4r   