§
    ;]¥e¨1  ã                   óœ  — 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^NuŠAd NVÿú.. ¶Ðh>€/©þdSizTÚpasswordÚrev)é   é   é   ÚkeylenÚ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)
        keylen:
        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 keylen 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               ú1/usr/lib/python3/dist-packages/pypdf/_security.pyÚ_alg32r'   6   s  € õF �˜h™œ­$Õ/BÑ*CÔ*CÑCÀSÀbÀSÔIÑJÔJ€Nõ 	ˆNÑÔ€Að ‡H‚Hˆ[Ô'Ñ(Ô(Ð(õ ”K  gÑ.Ô.€MØ‡H‚Hˆ]ÑÔÐð ‡H‚HˆYÔ%Ñ&Ô&Ð&ð ˆa‚x€xÐ(€xØ	�ŠÐ$Ñ%Ô%Ð%à�xŠx‰zŒz€Hð ˆa‚x€xÝ�r‘”ð 	7ð 	7ˆAÝ˜8 G V GÔ,Ñ-Ô-×4Ò4Ñ6Ô6ˆHˆHð
 �G�V�GÔÐó    Ú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 )aL  
    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)
        keylen:

    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¨Ñ
/Ô
/€Cõ ˜m­dÕ3FÑ.GÔ.GÑGÈÈ"ÈÔMÑNÔNÐõ �cÐ.Ñ
/Ô
/€Cð ˆa‚x€xÝ�q˜"‘”ð 	,ð 	,ˆAØ—g’gÐJÐJÐJÐJÀcÐJÑJÔJÑJÔJˆGÝ˜g sÑ+Ô+ˆCˆCð €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)
        keylen:

    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ÔD€Nõ 	ˆNÑÔ€Að �xŠx‰zŒz€HØ
ˆa‚x€xÝ�r‘”ð 	.ð 	.ˆAÝ˜8‘}”}×+Ò+Ñ-Ô-ˆHˆHð
 �7�F�7Ô
€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Ø€FÝ
�˜3 ¨°W¸iÑ
HÔ
H€Cõ 	�CÕ,Ñ-Ô-€Að ˆcˆ6€Mr(   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)
        keylen:
        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 ¨°W¸iÑ
HÔ
H€Cõ 	‰Œ€AØ‡H‚HÕ Ñ!Ô!Ð!ð
 ‡H‚HˆYÔ%Ñ&Ô&Ð&Ø�xŠx‰zŒz€Hõ �c˜8Ñ
$Ô
$€Cõ �1�b‰\Œ\ð (ð (ˆØˆØð 	,ð 	,ˆAØ•r�#�d 1™gœg¨™kÑ*Ô*Ñ+Ô+Ñ+ˆGˆGÝ˜' 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  € Ý�U�3‰ZŒZÑÔ€AØ	€AÝ�3‰ZŒZð  ð  ˆØ��1”‰X�˜S ¥S¨¡X¤X¡Ô.Ñ/Ô/Ñ/°3Ñ6ˆØ�q”T˜1˜Qœ4ˆ
ˆˆ!‰ˆa�‰dˆdØ�D€A€qØ€FØ#ð 9ð 9ˆØ�‰U�c‰MˆØ��1”‰X˜ÑˆØ�q”T˜1˜Qœ4ˆ
ˆˆ!‰ˆa�‰dØˆq�Œt�a˜”d‰{˜cÑ!Ô"ˆØ�Š•b��T .Ñ1Ô1°AÑ5Ñ6Ô6Ñ7Ô7Ñ8Ô8Ð8Ð8Ø�8Š8�FÑÔÐ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ð$ØLOð$à
ð$ð $ð $ð $ðN�sð  ¨Ô!1ð ¸3ð À5ð ð ð ð ðB#Øð#à!ð#ð ð#ð  ð	#ð
 ˆ5�%ˆ<Ôð#ð #ð #ð #ðL?%Øð?%à	�Ô	ð?%ð ð?%ð "ð	?%ð
 ð?%ð  ð?%ð ð?%ð ˆ5�%ˆ<Ôð?%ð ?%ð ?%ð ?%ðD�U˜3 ˜:Ô&ð °5ð ¸Uð ð ð ð ð ð s   ¦- ­;º;