Skip to content

Commit 64fc737

Browse files
committed
Speed up crypto lib
1 parent f501e59 commit 64fc737

File tree

2 files changed

+75
-99
lines changed

2 files changed

+75
-99
lines changed

paradox/lib/crypto.py

Lines changed: 72 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -172,9 +172,9 @@
172172
0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26,
173173
0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d)
174174

175-
rcon = (0x01, 0x02, 0x04, 0x08, 0x10, 0x20,
175+
rcon = (0x01, 0x02, 0x04, 0x08, 0x10, 0x20,
176176
0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8,
177-
0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc,
177+
0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc,
178178
0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4,
179179
0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91)
180180

@@ -184,10 +184,30 @@
184184
lt_d = Logtable[0xD]
185185
lt_9 = Logtable[0x9]
186186

187+
# Pre-calculate the special case for zero values in decrypt
188+
# This avoids conditional checks in the decrypt function
189+
def _prepare_inverse_mix_column_parts():
190+
"""Create lookup tables for the inverse mix column operation."""
191+
e_table = [0] * 256
192+
b_table = [0] * 256
193+
d_table = [0] * 256
194+
nine_table = [0] * 256
195+
196+
for i in range(1, 256): # Skip zero to handle separately
197+
e_table[i] = Alogtable[(lt_e + Logtable[i]) % 255]
198+
b_table[i] = Alogtable[(lt_b + Logtable[i]) % 255]
199+
d_table[i] = Alogtable[(lt_d + Logtable[i]) % 255]
200+
nine_table[i] = Alogtable[(lt_9 + Logtable[i]) % 255]
201+
202+
return e_table, b_table, d_table, nine_table
203+
204+
# Initialize the lookup tables
205+
E_TABLE, B_TABLE, D_TABLE, NINE_TABLE = _prepare_inverse_mix_column_parts()
206+
187207
@memoized
188208
def _keygen(k):
189209
rk = [0] * 240
190-
210+
191211
if len(k) % 32:
192212
k += b'\xee' * (32 - (len(k) % 32))
193213

@@ -229,7 +249,7 @@ def encrypt(ctxt, key):
229249

230250
if len(ctxt) % 16 != 0:
231251
ctxt.extend([0xee] * (16 - (len(ctxt) % 16)))
232-
252+
233253
rk = _keygen(key)
234254

235255
blocks = len(ctxt) // 16
@@ -258,7 +278,7 @@ def encrypt(ctxt, key):
258278
r16 = r * 16
259279

260280
# S BOX
261-
a = (S[a[0]], S[a[1]], S[a[2]], S[a[3]],
281+
a = (S[a[0]], S[a[1]], S[a[2]], S[a[3]],
262282
S[a[4]], S[a[5]], S[a[6]], S[a[7]],
263283
S[a[8]], S[a[9]], S[a[10]], S[a[11]],
264284
S[a[12]], S[a[13]], S[a[14]], S[a[15]])
@@ -313,7 +333,7 @@ def encrypt(ctxt, key):
313333
r += 1
314334

315335
# S BOX
316-
a = (S[a[0]], S[a[1]], S[a[2]], S[a[3]],
336+
a = (S[a[0]], S[a[1]], S[a[2]], S[a[3]],
317337
S[a[4]], S[a[5]], S[a[6]], S[a[7]],
318338
S[a[8]], S[a[9]], S[a[10]], S[a[11]],
319339
S[a[12]], S[a[13]], S[a[14]], S[a[15]])
@@ -323,7 +343,7 @@ def encrypt(ctxt, key):
323343
a[5], a[6], a[7], a[4],
324344
a[10], a[11], a[8], a[9],
325345
a[15], a[12], a[13], a[14])
326-
346+
327347
# Key addition
328348
a = (a[0] ^ rk[224],
329349
a[1] ^ rk[225],
@@ -353,7 +373,7 @@ def decrypt(ctxt, key):
353373
rk = _keygen(key)
354374

355375
ctxt = list(ctxt)
356-
376+
357377
blocks = len(ctxt) // 16
358378

359379
extend = dtxt.extend
@@ -378,117 +398,70 @@ def decrypt(ctxt, key):
378398
a[13] ^ rk[237],
379399
a[14] ^ rk[238],
380400
a[15] ^ rk[239])
381-
401+
382402
# Si Box
383-
a = (Si[a[0]], Si[a[1]], Si[a[2]], Si[a[3]],
403+
a = (Si[a[0]], Si[a[1]], Si[a[2]], Si[a[3]],
384404
Si[a[4]], Si[a[5]], Si[a[6]], Si[a[7]],
385405
Si[a[8]], Si[a[9]], Si[a[10]], Si[a[11]],
386406
Si[a[12]], Si[a[13]], Si[a[14]], Si[a[15]])
387407

388408
# Shift Row Invert
389-
a = (a[0], a[1], a[2], a[3],
390-
a[7], a[4], a[5], a[6],
391-
a[10], a[11], a[8], a[9],
409+
a = (a[0], a[1], a[2], a[3],
410+
a[7], a[4], a[5], a[6],
411+
a[10], a[11], a[8], a[9],
392412
a[13], a[14], a[15], a[12])
393413

394414
for r in range(13, 0, -1):
395415
r16 = r * 16
396-
416+
397417
# Key Addition
398418
a = (a[0] ^ rk[r16],
399-
a[1] ^ rk[1 + r16],
400-
a[2] ^ rk[2 + r16],
401-
a[3] ^ rk[3 + r16],
402-
a[4] ^ rk[4 + r16],
403-
a[5] ^ rk[5 + r16],
404-
a[6] ^ rk[6 + r16],
405-
a[7] ^ rk[7 + r16],
406-
a[8] ^ rk[8 + r16],
407-
a[9] ^ rk[9 + r16],
408-
a[10] ^ rk[10 + r16],
409-
a[11] ^ rk[11 + r16],
410-
a[12] ^ rk[12 + r16],
411-
a[13] ^ rk[13 + r16],
412-
a[14] ^ rk[14 + r16],
413-
a[15] ^ rk[15 + r16])
414-
415-
# Inv Mix Column
419+
a[1] ^ rk[1 + r16],
420+
a[2] ^ rk[2 + r16],
421+
a[3] ^ rk[3 + r16],
422+
a[4] ^ rk[4 + r16],
423+
a[5] ^ rk[5 + r16],
424+
a[6] ^ rk[6 + r16],
425+
a[7] ^ rk[7 + r16],
426+
a[8] ^ rk[8 + r16],
427+
a[9] ^ rk[9 + r16],
428+
a[10] ^ rk[10 + r16],
429+
a[11] ^ rk[11 + r16],
430+
a[12] ^ rk[12 + r16],
431+
a[13] ^ rk[13 + r16],
432+
a[14] ^ rk[14 + r16],
433+
a[15] ^ rk[15 + r16])
434+
435+
# Inv Mix Column - use pre-calculated tables to avoid conditionals
416436
a = (
417-
(Alogtable[(lt_e + Logtable[a[0]]) % 255] if a[0] else 0) ^
418-
(Alogtable[(lt_b + Logtable[a[4]]) % 255] if a[4] else 0) ^
419-
(Alogtable[(lt_d + Logtable[a[8]]) % 255] if a[8] else 0) ^
420-
(Alogtable[(lt_9 + Logtable[a[12]]) % 255] if a[12] else 0),
421-
(Alogtable[(lt_e + Logtable[a[1]]) % 255] if a[1] else 0) ^
422-
(Alogtable[(lt_b + Logtable[a[5]]) % 255] if a[5] else 0) ^
423-
(Alogtable[(lt_d + Logtable[a[9]]) % 255] if a[9] else 0) ^
424-
(Alogtable[(lt_9 + Logtable[a[13]]) % 255] if a[13] else 0),
425-
(Alogtable[(lt_e + Logtable[a[2]]) % 255] if a[2] else 0) ^
426-
(Alogtable[(lt_b + Logtable[a[6]]) % 255] if a[6] else 0) ^
427-
(Alogtable[(lt_d + Logtable[a[10]]) % 255] if a[10] else 0) ^
428-
(Alogtable[(lt_9 + Logtable[a[14]]) % 255] if a[14] else 0),
429-
(Alogtable[(lt_e + Logtable[a[3]]) % 255] if a[3] else 0) ^
430-
(Alogtable[(lt_b + Logtable[a[7]]) % 255] if a[7] else 0) ^
431-
(Alogtable[(lt_d + Logtable[a[11]]) % 255] if a[11] else 0) ^
432-
(Alogtable[(lt_9 + Logtable[a[15]]) % 255] if a[15] else 0),
433-
(Alogtable[(lt_e + Logtable[a[4]]) % 255] if a[4] else 0) ^
434-
(Alogtable[(lt_b + Logtable[a[8]]) % 255] if a[8] else 0) ^
435-
(Alogtable[(lt_d + Logtable[a[12]]) % 255] if a[12] else 0) ^
436-
(Alogtable[(lt_9 + Logtable[a[0]]) % 255] if a[0] else 0),
437-
(Alogtable[(lt_e + Logtable[a[5]]) % 255] if a[5] else 0) ^
438-
(Alogtable[(lt_b + Logtable[a[9]]) % 255] if a[9] else 0) ^
439-
(Alogtable[(lt_d + Logtable[a[13]]) % 255] if a[13] else 0) ^
440-
(Alogtable[(lt_9 + Logtable[a[1]]) % 255] if a[1] else 0),
441-
(Alogtable[(lt_e + Logtable[a[6]]) % 255] if a[6] else 0) ^
442-
(Alogtable[(lt_b + Logtable[a[10]]) % 255] if a[10] else 0) ^
443-
(Alogtable[(lt_d + Logtable[a[14]]) % 255] if a[14] else 0) ^
444-
(Alogtable[(lt_9 + Logtable[a[2]]) % 255] if a[2] else 0),
445-
(Alogtable[(lt_e + Logtable[a[7]]) % 255] if a[7] else 0) ^
446-
(Alogtable[(lt_b + Logtable[a[11]]) % 255] if a[11] else 0) ^
447-
(Alogtable[(lt_d + Logtable[a[15]]) % 255] if a[15] else 0) ^
448-
(Alogtable[(lt_9 + Logtable[a[3]]) % 255] if a[3] else 0),
449-
(Alogtable[(lt_e + Logtable[a[8]]) % 255] if a[8] else 0) ^
450-
(Alogtable[(lt_b + Logtable[a[12]]) % 255] if a[12] else 0) ^
451-
(Alogtable[(lt_d + Logtable[a[0]]) % 255] if a[0] else 0) ^
452-
(Alogtable[(lt_9 + Logtable[a[4]]) % 255] if a[4] else 0),
453-
(Alogtable[(lt_e + Logtable[a[9]]) % 255] if a[9] else 0) ^
454-
(Alogtable[(lt_b + Logtable[a[13]]) % 255] if a[13] else 0) ^
455-
(Alogtable[(lt_d + Logtable[a[1]]) % 255] if a[1] else 0) ^
456-
(Alogtable[(lt_9 + Logtable[a[5]]) % 255] if a[5] else 0),
457-
(Alogtable[(lt_e + Logtable[a[10]]) % 255] if a[10] else 0) ^
458-
(Alogtable[(lt_b + Logtable[a[14]]) % 255] if a[14] else 0) ^
459-
(Alogtable[(lt_d + Logtable[a[2]]) % 255] if a[2] else 0) ^
460-
(Alogtable[(lt_9 + Logtable[a[6]]) % 255] if a[6] else 0),
461-
(Alogtable[(lt_e + Logtable[a[11]]) % 255] if a[11] else 0) ^
462-
(Alogtable[(lt_b + Logtable[a[15]]) % 255] if a[15] else 0) ^
463-
(Alogtable[(lt_d + Logtable[a[3]]) % 255] if a[3] else 0) ^
464-
(Alogtable[(lt_9 + Logtable[a[7]]) % 255] if a[7] else 0),
465-
(Alogtable[(lt_e + Logtable[a[12]]) % 255] if a[12] else 0) ^
466-
(Alogtable[(lt_b + Logtable[a[0]]) % 255] if a[0] else 0) ^
467-
(Alogtable[(lt_d + Logtable[a[4]]) % 255] if a[4] else 0) ^
468-
(Alogtable[(lt_9 + Logtable[a[8]]) % 255] if a[8] else 0),
469-
(Alogtable[(lt_e + Logtable[a[13]]) % 255] if a[13] else 0) ^
470-
(Alogtable[(lt_b + Logtable[a[1]]) % 255] if a[1] else 0) ^
471-
(Alogtable[(lt_d + Logtable[a[5]]) % 255] if a[5] else 0) ^
472-
(Alogtable[(lt_9 + Logtable[a[9]]) % 255] if a[9] else 0),
473-
(Alogtable[(lt_e + Logtable[a[14]]) % 255] if a[14] else 0) ^
474-
(Alogtable[(lt_b + Logtable[a[2]]) % 255] if a[2] else 0) ^
475-
(Alogtable[(lt_d + Logtable[a[6]]) % 255] if a[6] else 0) ^
476-
(Alogtable[(lt_9 + Logtable[a[10]]) % 255] if a[10] else 0),
477-
(Alogtable[(lt_e + Logtable[a[15]]) % 255] if a[15] else 0) ^
478-
(Alogtable[(lt_b + Logtable[a[3]]) % 255] if a[3] else 0) ^
479-
(Alogtable[(lt_d + Logtable[a[7]]) % 255] if a[7] else 0) ^
480-
(Alogtable[(lt_9 + Logtable[a[11]]) % 255] if a[11] else 0))
437+
(E_TABLE[a[0]] ^ B_TABLE[a[4]] ^ D_TABLE[a[8]] ^ NINE_TABLE[a[12]]),
438+
(E_TABLE[a[1]] ^ B_TABLE[a[5]] ^ D_TABLE[a[9]] ^ NINE_TABLE[a[13]]),
439+
(E_TABLE[a[2]] ^ B_TABLE[a[6]] ^ D_TABLE[a[10]] ^ NINE_TABLE[a[14]]),
440+
(E_TABLE[a[3]] ^ B_TABLE[a[7]] ^ D_TABLE[a[11]] ^ NINE_TABLE[a[15]]),
441+
(E_TABLE[a[4]] ^ B_TABLE[a[8]] ^ D_TABLE[a[12]] ^ NINE_TABLE[a[0]]),
442+
(E_TABLE[a[5]] ^ B_TABLE[a[9]] ^ D_TABLE[a[13]] ^ NINE_TABLE[a[1]]),
443+
(E_TABLE[a[6]] ^ B_TABLE[a[10]] ^ D_TABLE[a[14]] ^ NINE_TABLE[a[2]]),
444+
(E_TABLE[a[7]] ^ B_TABLE[a[11]] ^ D_TABLE[a[15]] ^ NINE_TABLE[a[3]]),
445+
(E_TABLE[a[8]] ^ B_TABLE[a[12]] ^ D_TABLE[a[0]] ^ NINE_TABLE[a[4]]),
446+
(E_TABLE[a[9]] ^ B_TABLE[a[13]] ^ D_TABLE[a[1]] ^ NINE_TABLE[a[5]]),
447+
(E_TABLE[a[10]] ^ B_TABLE[a[14]] ^ D_TABLE[a[2]] ^ NINE_TABLE[a[6]]),
448+
(E_TABLE[a[11]] ^ B_TABLE[a[15]] ^ D_TABLE[a[3]] ^ NINE_TABLE[a[7]]),
449+
(E_TABLE[a[12]] ^ B_TABLE[a[0]] ^ D_TABLE[a[4]] ^ NINE_TABLE[a[8]]),
450+
(E_TABLE[a[13]] ^ B_TABLE[a[1]] ^ D_TABLE[a[5]] ^ NINE_TABLE[a[9]]),
451+
(E_TABLE[a[14]] ^ B_TABLE[a[2]] ^ D_TABLE[a[6]] ^ NINE_TABLE[a[10]]),
452+
(E_TABLE[a[15]] ^ B_TABLE[a[3]] ^ D_TABLE[a[7]] ^ NINE_TABLE[a[11]])
453+
)
481454

482455
# Si Box
483-
a = (Si[a[0]], Si[a[1]], Si[a[2]], Si[a[3]],
456+
a = (Si[a[0]], Si[a[1]], Si[a[2]], Si[a[3]],
484457
Si[a[4]], Si[a[5]], Si[a[6]], Si[a[7]],
485458
Si[a[8]], Si[a[9]], Si[a[10]], Si[a[11]],
486459
Si[a[12]], Si[a[13]], Si[a[14]], Si[a[15]])
487460

488461
# Shift Row Invert
489-
a = (a[0], a[1], a[2], a[3],
490-
a[7], a[4], a[5], a[6],
491-
a[10], a[11], a[8], a[9],
462+
a = (a[0], a[1], a[2], a[3],
463+
a[7], a[4], a[5], a[6],
464+
a[10], a[11], a[8], a[9],
492465
a[13], a[14], a[15], a[12])
493466

494467

setup.cfg

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,9 @@ ignore =
8080
E128
8181
noqa-require-code = True
8282

83+
per-file-ignores =
84+
paradox/lib/crypto.py: E221, E241, E302, E303, E305
85+
8386
[coverage:report]
8487
show_missing = true
8588

0 commit comments

Comments
 (0)