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.decrypt(cipherstring, R)[source]
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)[source]
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