o
    ¼Çh  ã                   @   sx   d Z ddlmZmZmZ dd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
edkr:ddlZddlZe e ¡ j¡ dS dS )a`  
PostScript Type 1 fonts make use of two types of encryption: charstring
encryption and ``eexec`` encryption. Charstring encryption is used for
the charstrings themselves, while ``eexec`` is used to encrypt larger
sections of the font program, such as the ``Private`` and ``CharStrings``
dictionaries. Despite the different names, the algorithm is the same,
although ``eexec`` encryption uses a fixed initial key R=55665.

The algorithm uses cipher feedback, meaning that the ciphertext is used
to modify the key. Because of this, the routines in this module return
the new key at the end of the operation.

é    )ÚbytechrÚ	bytesjoinÚbyteordc                 C   s8   t | ƒ} | |d? A d@ }| | d d d@ }t|ƒ|fS ©Né   éÿ   imÎ  i¿X  iÿÿ  ©r   r   )ÚcipherÚRÚplain© r   úh/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/fontTools/misc/eexec.pyÚ_decryptChar   ó   r   c                 C   s8   t | ƒ} | |d? A d@ }|| d d d@ }t|ƒ|fS r   r   )r   r
   r	   r   r   r   Ú_encryptChar   r   r   c                 C   ó:   g }| D ]}t ||ƒ\}}| |¡ qt|ƒ}|t|ƒfS )a  
    Decrypts a string using the Type 1 encryption algorithm.

    Args:
            cipherstring: String of ciphertext.
            R: Initial key.

    Returns:
            decryptedStr: Plaintext string.
            R: Output key for subsequent decryptions.

    Examples::

            >>> testStr = b"\0\0asdadads asds\265"
            >>> decryptedStr, R = decrypt(testStr, 12321)
            >>> decryptedStr == b'0d\nh\x15\xe8\xc4\xb2\x15\x1d\x108\x1a<6\xa1'
            True
            >>> R == 36142
            True
    )r   Úappendr   Úint)Úcipherstringr
   Ú	plainListr	   r   Úplainstringr   r   r   Údecrypt    s   r   c                 C   r   )aé  
    Encrypts a string using the Type 1 encryption algorithm.

    Note that the algorithm as described in the Type 1 specification requires the
    plaintext to be prefixed with a number of random bytes. (For ``eexec`` the
    number of random bytes is set to 4.) This routine does *not* add the random
    prefix to its input.

    Args:
            plainstring: String of plaintext.
            R: Initial key.

    Returns:
            cipherstring: Ciphertext string.
            R: Output key for subsequent encryptions.

    Examples::

            >>> testStr = b"\0\0asdadads asds\265"
            >>> decryptedStr, R = decrypt(testStr, 12321)
            >>> decryptedStr == b'0d\nh\x15\xe8\xc4\xb2\x15\x1d\x108\x1a<6\xa1'
            True
            >>> R == 36142
            True

    >>> testStr = b'0d\nh\x15\xe8\xc4\xb2\x15\x1d\x108\x1a<6\xa1'
    >>> encryptedStr, R = encrypt(testStr, 12321)
    >>> encryptedStr == b"\0\0asdadads asds\265"
    True
    >>> R == 36142
    True
    )r   r   r   r   )r   r
   Ú
cipherListr   r	   r   r   r   r   Úencrypt=   s   !r   c                 C   s   dd l }| | ¡S ©Nr   )ÚbinasciiÚhexlify)Úsr   r   r   r   Ú	hexStringf   s   
r   c                 C   s   dd l }t|  ¡ ƒ} | | ¡S r   )r   r   ÚsplitÚ	unhexlify)Úhr   r   r   r   ÚdeHexStringl   s   
r"   Ú__main__N)Ú__doc__ÚfontTools.misc.textToolsr   r   r   r   r   r   r   r   r"   Ú__name__ÚsysÚdoctestÚexitÚtestmodÚfailedr   r   r   r   Ú<module>   s    )ü