| """fontTools.misc.eexec.py -- Module implementing the eexec and |
| charstring encryption algorithm as used by PostScript Type 1 fonts. |
| """ |
| |
| from __future__ import print_function, division, absolute_import |
| from fontTools.misc.py23 import * |
| |
| def _decryptChar(cipher, R): |
| cipher = byteord(cipher) |
| plain = ( (cipher ^ (R>>8)) ) & 0xFF |
| R = ( (cipher + R) * 52845 + 22719 ) & 0xFFFF |
| return bytechr(plain), R |
| |
| def _encryptChar(plain, R): |
| plain = byteord(plain) |
| cipher = ( (plain ^ (R>>8)) ) & 0xFF |
| R = ( (cipher + R) * 52845 + 22719 ) & 0xFFFF |
| return bytechr(cipher), R |
| |
| |
| def decrypt(cipherstring, R): |
| plainList = [] |
| for cipher in cipherstring: |
| plain, R = _decryptChar(cipher, R) |
| plainList.append(plain) |
| plainstring = strjoin(plainList) |
| return plainstring, int(R) |
| |
| def encrypt(plainstring, R): |
| cipherList = [] |
| for plain in plainstring: |
| cipher, R = _encryptChar(plain, R) |
| cipherList.append(cipher) |
| cipherstring = strjoin(cipherList) |
| return cipherstring, int(R) |
| |
| |
| def hexString(s): |
| import binascii |
| return binascii.hexlify(s) |
| |
| def deHexString(h): |
| import binascii |
| h = strjoin(h.split()) |
| return binascii.unhexlify(h) |
| |
| |
| def _test(): |
| testStr = "\0\0asdadads asds\265" |
| print(decrypt, decrypt(testStr, 12321)) |
| print(encrypt, encrypt(testStr, 12321)) |
| |
| |
| if __name__ == "__main__": |
| _test() |