From 6c53f88cf3deb380be299bcfa0ca3f88890c624b Mon Sep 17 00:00:00 2001 From: Just Date: Wed, 12 Jan 2000 19:15:12 +0000 Subject: [PATCH] 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 --- Lib/fontTools/misc/eexec.py | 70 +++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 Lib/fontTools/misc/eexec.py diff --git a/Lib/fontTools/misc/eexec.py b/Lib/fontTools/misc/eexec.py new file mode 100644 index 000000000..d611765d8 --- /dev/null +++ b/Lib/fontTools/misc/eexec.py @@ -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 +