# eexec: PostScript charstring encryption and decryption routines

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.

fontTools.misc.eexec.deHexString(h)

fontTools.misc.eexec.decrypt(cipherstring, R)

  Decrypts a string using the Type 1 encryption algorithm.

  Parameters

    - cipherstring – String of ciphertext.

    - R – Initial key.

  Returns

    Plaintext string. R: Output key for subsequent decryptions.

  Return type

    decryptedStr

  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

fontTools.misc.eexec.encrypt(plainstring, R)

  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.

  Parameters

    - plainstring – String of plaintext.

    - R – Initial key.

  Returns

    Ciphertext string. R: Output key for subsequent encryptions.

  Return type

    cipherstring

  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

fontTools.misc.eexec.hexString(s)