2000-01-12 19:15:12 +00:00
|
|
|
"""fontTools.misc.eexec.py -- Module implementing the eexec and
|
|
|
|
charstring encryption algorithm as used by PostScript Type 1 fonts.
|
|
|
|
"""
|
|
|
|
|
2013-11-27 17:46:17 -05:00
|
|
|
from __future__ import print_function, division
|
2013-11-27 17:27:45 -05:00
|
|
|
from fontTools.misc.py23 import *
|
2013-11-27 15:16:28 -05:00
|
|
|
|
2000-01-12 19:15:12 +00:00
|
|
|
# Warning: Although a Python implementation is provided here,
|
|
|
|
# all four public functions get overridden by the *much* faster
|
|
|
|
# C extension module eexecOp, if available.
|
|
|
|
|
|
|
|
error = "eexec.error"
|
|
|
|
|
|
|
|
|
|
|
|
def _decryptChar(cipher, R):
|
|
|
|
cipher = ord(cipher)
|
|
|
|
plain = ( (cipher ^ (R>>8)) ) & 0xFF
|
2013-11-27 03:37:29 -05:00
|
|
|
R = ( (cipher + R) * 52845 + 22719 ) & 0xFFFF
|
2013-11-27 15:19:40 -05:00
|
|
|
return bytechr(plain), R
|
2000-01-12 19:15:12 +00:00
|
|
|
|
|
|
|
def _encryptChar(plain, R):
|
|
|
|
plain = ord(plain)
|
|
|
|
cipher = ( (plain ^ (R>>8)) ) & 0xFF
|
2013-11-27 03:37:29 -05:00
|
|
|
R = ( (cipher + R) * 52845 + 22719 ) & 0xFFFF
|
2013-11-27 15:19:40 -05:00
|
|
|
return bytechr(cipher), R
|
2000-01-12 19:15:12 +00:00
|
|
|
|
|
|
|
|
|
|
|
def decrypt(cipherstring, R):
|
|
|
|
# I could probably speed this up by inlining _decryptChar,
|
|
|
|
# but... we've got eexecOp, so who cares ;-)
|
|
|
|
plainList = []
|
|
|
|
for cipher in cipherstring:
|
|
|
|
plain, R = _decryptChar(cipher, R)
|
|
|
|
plainList.append(plain)
|
2013-11-27 05:47:34 -05:00
|
|
|
plainstring = ''.join(plainList)
|
2000-01-12 19:15:12 +00:00
|
|
|
return plainstring, int(R)
|
|
|
|
|
|
|
|
def encrypt(plainstring, R):
|
|
|
|
cipherList = []
|
|
|
|
for plain in plainstring:
|
|
|
|
cipher, R = _encryptChar(plain, R)
|
|
|
|
cipherList.append(cipher)
|
2013-11-27 05:47:34 -05:00
|
|
|
cipherstring = ''.join(cipherList)
|
2000-01-12 19:15:12 +00:00
|
|
|
return cipherstring, int(R)
|
|
|
|
|
|
|
|
|
|
|
|
def hexString(s):
|
2002-07-23 09:26:19 +00:00
|
|
|
import binascii
|
|
|
|
return binascii.hexlify(s)
|
2000-01-12 19:15:12 +00:00
|
|
|
|
|
|
|
def deHexString(h):
|
2002-07-23 09:26:19 +00:00
|
|
|
import binascii
|
|
|
|
h = "".join(h.split())
|
|
|
|
return binascii.unhexlify(h)
|
2000-01-12 19:15:12 +00:00
|
|
|
|
|
|
|
|
|
|
|
def _test():
|
2009-11-08 15:57:07 +00:00
|
|
|
import fontTools.misc.eexecOp as eexecOp
|
2001-04-20 18:39:21 +00:00
|
|
|
testStr = "\0\0asdadads asds\265"
|
2013-11-27 04:57:33 -05:00
|
|
|
print(decrypt, decrypt(testStr, 12321))
|
|
|
|
print(eexecOp.decrypt, eexecOp.decrypt(testStr, 12321))
|
|
|
|
print(encrypt, encrypt(testStr, 12321))
|
|
|
|
print(eexecOp.encrypt, eexecOp.encrypt(testStr, 12321))
|
2000-01-12 19:15:12 +00:00
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
_test()
|
|
|
|
|
|
|
|
|
|
|
|
try:
|
2009-11-08 15:57:07 +00:00
|
|
|
from fontTools.misc.eexecOp import *
|
2000-01-12 19:15:12 +00:00
|
|
|
except ImportError:
|
|
|
|
pass # Use the slow Python versions
|
|
|
|
|