2015-04-26 02:01:01 -04:00
|
|
|
"""fontTools.misc.eexec.py -- Module implementing the eexec and
|
2000-01-12 19:15:12 +00:00
|
|
|
charstring encryption algorithm as used by PostScript Type 1 fonts.
|
|
|
|
"""
|
|
|
|
|
2014-01-14 15:07:50 +08:00
|
|
|
from __future__ import print_function, division, absolute_import
|
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
|
|
|
def _decryptChar(cipher, R):
|
2013-11-27 18:13:48 -05:00
|
|
|
cipher = byteord(cipher)
|
2000-01-12 19:15:12 +00:00
|
|
|
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):
|
2013-11-27 18:13:48 -05:00
|
|
|
plain = byteord(plain)
|
2000-01-12 19:15:12 +00:00
|
|
|
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):
|
2015-10-21 11:41:57 +01:00
|
|
|
r"""
|
|
|
|
>>> 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
|
|
|
|
"""
|
2000-01-12 19:15:12 +00:00
|
|
|
plainList = []
|
|
|
|
for cipher in cipherstring:
|
|
|
|
plain, R = _decryptChar(cipher, R)
|
|
|
|
plainList.append(plain)
|
2015-10-21 11:41:57 +01:00
|
|
|
plainstring = bytesjoin(plainList)
|
2000-01-12 19:15:12 +00:00
|
|
|
return plainstring, int(R)
|
|
|
|
|
|
|
|
def encrypt(plainstring, R):
|
2015-10-21 11:41:57 +01:00
|
|
|
r"""
|
|
|
|
>>> 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
|
|
|
|
"""
|
2000-01-12 19:15:12 +00:00
|
|
|
cipherList = []
|
|
|
|
for plain in plainstring:
|
|
|
|
cipher, R = _encryptChar(plain, R)
|
|
|
|
cipherList.append(cipher)
|
2015-10-21 11:41:57 +01:00
|
|
|
cipherstring = bytesjoin(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
|
2015-10-21 11:41:57 +01:00
|
|
|
h = bytesjoin(h.split())
|
2002-07-23 09:26:19 +00:00
|
|
|
return binascii.unhexlify(h)
|
2000-01-12 19:15:12 +00:00
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
2015-10-21 11:41:57 +01:00
|
|
|
import sys
|
|
|
|
import doctest
|
|
|
|
sys.exit(doctest.testmod().failed)
|