Home | History | Annotate | Download | only in misc
      1 """fontTools.misc.eexec.py -- Module implementing the eexec and 
      2 charstring encryption algorithm as used by PostScript Type 1 fonts.
      3 """
      4 
      5 from __future__ import print_function, division, absolute_import
      6 from fontTools.misc.py23 import *
      7 
      8 def _decryptChar(cipher, R):
      9 	cipher = byteord(cipher)
     10 	plain = ( (cipher ^ (R>>8)) ) & 0xFF
     11 	R = ( (cipher + R) * 52845 + 22719 ) & 0xFFFF
     12 	return bytechr(plain), R
     13 
     14 def _encryptChar(plain, R):
     15 	plain = byteord(plain)
     16 	cipher = ( (plain ^ (R>>8)) ) & 0xFF
     17 	R = ( (cipher + R) * 52845 + 22719 ) & 0xFFFF
     18 	return bytechr(cipher), R
     19 
     20 
     21 def decrypt(cipherstring, R):
     22 	plainList = []
     23 	for cipher in cipherstring:
     24 		plain, R = _decryptChar(cipher, R)
     25 		plainList.append(plain)
     26 	plainstring = strjoin(plainList)
     27 	return plainstring, int(R)
     28 
     29 def encrypt(plainstring, R):
     30 	cipherList = []
     31 	for plain in plainstring:
     32 		cipher, R = _encryptChar(plain, R)
     33 		cipherList.append(cipher)
     34 	cipherstring = strjoin(cipherList)
     35 	return cipherstring, int(R)
     36 
     37 
     38 def hexString(s):
     39 	import binascii
     40 	return binascii.hexlify(s)
     41 
     42 def deHexString(h):
     43 	import binascii
     44 	h = strjoin(h.split())
     45 	return binascii.unhexlify(h)
     46 
     47 
     48 def _test():
     49 	testStr = "\0\0asdadads asds\265"
     50 	print(decrypt, decrypt(testStr, 12321))
     51 	print(encrypt, encrypt(testStr, 12321))
     52 
     53 
     54 if __name__ == "__main__":
     55 	_test()
     56