added fontTools.misc.eexec and a MacOS/PPC shared lib (eexecOp) that provides the C implementation.
git-svn-id: svn://svn.code.sf.net/p/fonttools/code/trunk@56 4cde692c-a291-49d1-8350-778aa11640f8
This commit is contained in:
parent
41ca640f09
commit
6c53f88cf3
70
Lib/fontTools/misc/eexec.py
Normal file
70
Lib/fontTools/misc/eexec.py
Normal file
@ -0,0 +1,70 @@
|
||||
"""fontTools.misc.eexec.py -- Module implementing the eexec and
|
||||
charstring encryption algorithm as used by PostScript Type 1 fonts.
|
||||
"""
|
||||
|
||||
# Warning: Although a Python implementation is provided here,
|
||||
# all four public functions get overridden by the *much* faster
|
||||
# C extension module eexecOp, if available.
|
||||
|
||||
import string
|
||||
|
||||
error = "eexec.error"
|
||||
|
||||
|
||||
def _decryptChar(cipher, R):
|
||||
cipher = ord(cipher)
|
||||
plain = ( (cipher ^ (R>>8)) ) & 0xFF
|
||||
R = ( (cipher + R) * 52845L + 22719L ) & 0xFFFF
|
||||
return chr(plain), R
|
||||
|
||||
def _encryptChar(plain, R):
|
||||
plain = ord(plain)
|
||||
cipher = ( (plain ^ (R>>8)) ) & 0xFF
|
||||
R = ( (cipher + R) * 52845L + 22719L ) & 0xFFFF
|
||||
return chr(cipher), R
|
||||
|
||||
|
||||
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)
|
||||
plainstring = string.join(plainList, '')
|
||||
return plainstring, int(R)
|
||||
|
||||
def encrypt(plainstring, R):
|
||||
cipherList = []
|
||||
for plain in plainstring:
|
||||
cipher, R = _encryptChar(plain, R)
|
||||
cipherList.append(cipher)
|
||||
cipherstring = string.join(cipherList, '')
|
||||
return cipherstring, int(R)
|
||||
|
||||
|
||||
def hexString(s):
|
||||
xxx
|
||||
|
||||
def deHexString(h):
|
||||
xxx
|
||||
|
||||
|
||||
def _test():
|
||||
import eexecOp
|
||||
testStr = "\0\0asdadads asds"
|
||||
print decrypt, decrypt(testStr, 12321)
|
||||
print eexecOp.decrypt, eexecOp.decrypt(testStr, 12321)
|
||||
print encrypt, encrypt(testStr, 12321)
|
||||
print eexecOp.encrypt, eexecOp.encrypt(testStr, 12321)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
_test()
|
||||
|
||||
|
||||
try:
|
||||
from eexecOp import *
|
||||
except ImportError:
|
||||
pass # Use the slow Python versions
|
||||
|
Loading…
x
Reference in New Issue
Block a user