summaryrefslogtreecommitdiff
path: root/python/lilliput/multiplications.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/lilliput/multiplications.py')
-rw-r--r--python/lilliput/multiplications.py186
1 files changed, 186 insertions, 0 deletions
diff --git a/python/lilliput/multiplications.py b/python/lilliput/multiplications.py
new file mode 100644
index 0000000..c5f1e44
--- /dev/null
+++ b/python/lilliput/multiplications.py
@@ -0,0 +1,186 @@
+
+# Multiply by matrix M
+def _multiplyM(lane):
+ multiplied_lane = [lane[(byte-1) % 8] for byte in range(0, 8)]
+
+ multiplied_lane[2] ^= ((lane[6] << 2) & 0xff)
+ multiplied_lane[4] ^= ((lane[4] >> 3) & 0xff)
+ multiplied_lane[5] ^= ((lane[5] << 3) & 0xff)
+
+ return multiplied_lane
+
+def _multiplyM2(lane):
+ multiplied_lane = [lane[(byte-2) % 8] for byte in range(0, 8)]
+
+ multiplied_lane[2] ^= ((lane[5] << 2) & 0xff)
+ multiplied_lane[3] ^= ((lane[6] << 2) & 0xff)
+ multiplied_lane[4] ^= ((lane[3] >> 3) & 0xff) ^ ((lane[4] >> 6) & 0xff)
+ multiplied_lane[5] ^= ((lane[5] << 6) & 0xff)
+ multiplied_lane[6] ^= ((lane[5] << 3) & 0xff)
+
+ # binary matrix M1
+ multi_mat_l4_m1 = 0
+ l4 = lane[4]
+ multi_mat_l4_m1 ^= ((l4 & 0x8) >> 3)
+ multi_mat_l4_m1 ^= ((l4 & 0x10) >> 3)
+ multi_mat_l4_m1 ^= ((l4 & 0x20) >> 3)
+ multi_mat_l4_m1 ^= ((l4 & 0x40) >> 3) ^ ((l4 & 0x1) << 3)
+ multi_mat_l4_m1 ^= ((l4 & 0x80) >> 3) ^ ((l4 & 0x2) << 3)
+ multi_mat_l4_m1 ^= ((l4 & 0x04) << 3)
+ multi_mat_l4_m1 ^= ((l4 & 0x08) << 3)
+ multi_mat_l4_m1 ^= ((l4 & 0x10) << 3)
+
+ multiplied_lane[5] ^= multi_mat_l4_m1
+
+ return multiplied_lane
+
+
+def _multiplyM3(lane):
+ multiplied_lane = [lane[(byte-3) % 8] for byte in range(0, 8)]
+
+ multiplied_lane[2] ^= ((lane[4] << 2) & 0xff) ^ ((lane[5] << 5) & 0xff)
+ multiplied_lane[3] ^= ((lane[5] << 2) & 0xff)
+ multiplied_lane[4] ^= ((lane[2] >> 3) & 0xff) ^ ((lane[3] >> 6) & 0xff) ^ ((lane[6] << 2) & 0xff)
+ multiplied_lane[6] ^= ((lane[5] << 6) & 0xff)
+ multiplied_lane[7] ^= ((lane[5] << 3) & 0xff)
+
+ # binary matrix M1
+ multi_mat_l3_m1 = 0
+ l3 = lane[3]
+ multi_mat_l3_m1 ^= ((l3 & 0x8) >> 3)
+ multi_mat_l3_m1 ^= ((l3 & 0x10) >> 3)
+ multi_mat_l3_m1 ^= ((l3 & 0x20) >> 3)
+ multi_mat_l3_m1 ^= ((l3 & 0x40) >> 3) ^ ((l3 & 0x1) << 3)
+ multi_mat_l3_m1 ^= ((l3 & 0x80) >> 3) ^ ((l3 & 0x2) << 3)
+ multi_mat_l3_m1 ^= ((l3 & 0x04) << 3)
+ multi_mat_l3_m1 ^= ((l3 & 0x08) << 3)
+ multi_mat_l3_m1 ^= ((l3 & 0x10) << 3)
+
+ # binary matrix M1
+ multi_mat_l4_m1 = 0
+ l4 = lane[4]
+ multi_mat_l4_m1 ^= ((l4 & 0x8) >> 3)
+ multi_mat_l4_m1 ^= ((l4 & 0x10) >> 3)
+ multi_mat_l4_m1 ^= ((l4 & 0x20) >> 3)
+ multi_mat_l4_m1 ^= ((l4 & 0x40) >> 3) ^ ((l4 & 0x1) << 3)
+ multi_mat_l4_m1 ^= ((l4 & 0x80) >> 3) ^ ((l4 & 0x2) << 3)
+ multi_mat_l4_m1 ^= ((l4 & 0x04) << 3)
+ multi_mat_l4_m1 ^= ((l4 & 0x08) << 3)
+ multi_mat_l4_m1 ^= ((l4 & 0x10) << 3)
+
+ # binary matrix M2
+ multi_mat_l4_m2 = 0
+ l4 = lane[4]
+ multi_mat_l4_m2 ^= ((l4 & 0x40) >> 6)
+ multi_mat_l4_m2 ^= ((l4 & 0x80) >> 6)
+ multi_mat_l4_m2 ^= (l4 & 0x08)
+ multi_mat_l4_m2 ^= (l4 & 0x10)
+ multi_mat_l4_m2 ^= (l4 & 0x20)
+ multi_mat_l4_m2 ^= (l4 & 0x40) ^ ((l4 & 0x1) << 6)
+ multi_mat_l4_m2 ^= (l4 & 0x80) ^ ((l4 & 0x2) << 6)
+
+
+ multiplied_lane[5] ^= multi_mat_l3_m1 ^ multi_mat_l4_m2
+ multiplied_lane[6] ^= multi_mat_l4_m1
+
+ return multiplied_lane
+
+
+def _multiplyMR(lane):
+ multiplied_lane = [lane[(byte+1) % 8] for byte in range(0, 8)]
+
+ multiplied_lane[2] ^= ((lane[4] >> 3) & 0xff)
+ multiplied_lane[4] ^= ((lane[6] << 3) & 0xff)
+ multiplied_lane[5] ^= ((lane[3] << 2) & 0xff)
+
+ return multiplied_lane
+
+
+def _multiplyMR2(lane):
+ multiplied_lane = [lane[(byte+2) % 8] for byte in range(0, 8)]
+
+ multiplied_lane[1] ^= ((lane[4] >> 3) & 0xff)
+ multiplied_lane[2] ^= ((lane[5] >> 3) & 0xff)
+ multiplied_lane[3] ^= ((lane[6] << 3) & 0xff)
+ multiplied_lane[4] ^= ((lane[3] << 2) & 0xff) ^ ((lane[7] << 3) & 0xff)
+ multiplied_lane[5] ^= ((lane[4] << 2) & 0xff)
+
+
+ # binary matrix m3
+ multi_mat_l6_m3 = 0
+ l6 = lane[6]
+ multi_mat_l6_m3 ^= (l6 & 0x1)
+ multi_mat_l6_m3 ^= (l6 & 0x2)
+ multi_mat_l6_m3 ^= (l6 & 0x4)
+ multi_mat_l6_m3 ^= (l6 & 0x8)
+ multi_mat_l6_m3 ^= (l6 & 0x10)
+
+
+ multiplied_lane[2] ^= multi_mat_l6_m3
+
+ return multiplied_lane
+
+def _multiplyMR3(lane):
+ multiplied_lane = [lane[(byte+3) % 8] for byte in range(0, 8)]
+
+ multiplied_lane[0] ^= ((lane[4] >> 3) & 0xff)
+ multiplied_lane[1] ^= ((lane[5] >> 3) & 0xff)
+ multiplied_lane[3] ^= ((lane[3] << 2) & 0xff) ^ ((lane[7] << 3) & 0xff)
+ multiplied_lane[4] ^= ((lane[0] << 3) & 0xff) ^ ((lane[4] << 2) & 0xff)
+ multiplied_lane[5] ^= ((lane[5] << 2) & 0xff) ^ ((lane[6] << 5) & 0xff)
+
+ # binary matrix m3
+ multi_mat_l6_m3 = 0
+ l6 = lane[6]
+ multi_mat_l6_m3 ^= (l6 & 0x1)
+ multi_mat_l6_m3 ^= (l6 & 0x2)
+ multi_mat_l6_m3 ^= (l6 & 0x4)
+ multi_mat_l6_m3 ^= (l6 & 0x8)
+ multi_mat_l6_m3 ^= (l6 & 0x10)
+
+ # binary matrix m3
+ multi_mat_l7_m3 = 0
+ l7 = lane[7]
+ multi_mat_l7_m3 ^= (l7 & 0x1)
+ multi_mat_l7_m3 ^= (l7 & 0x2)
+ multi_mat_l7_m3 ^= (l7 & 0x4)
+ multi_mat_l7_m3 ^= (l7 & 0x8)
+ multi_mat_l7_m3 ^= (l7 & 0x10)
+
+ # binary matrix m4
+ multi_mat_l3_m4 = 0
+ l3 = lane[3]
+ multi_mat_l3_m4 ^= ((l3 & 0x2) >> 1)
+ multi_mat_l3_m4 ^= ((l3 & 0x4) >> 1)
+ multi_mat_l3_m4 ^= ((l3 & 0x8) >> 1)
+ multi_mat_l3_m4 ^= ((l3 & 0x10) >> 1)
+ multi_mat_l3_m4 ^= ((l3 & 0x20) >> 1)
+
+ # binary matrix m1 for MR
+ multi_mat_l6_m1 = 0
+ l6 = lane[6]
+ multi_mat_l6_m1 ^= ((l6 & 0x8) >> 3)
+ multi_mat_l6_m1 ^= ((l6 & 0x10) >> 3)
+ multi_mat_l6_m1 ^= ((l6 & 0x20) >> 3)
+ multi_mat_l6_m1 ^= ((l6 & 0x40) >> 3) ^ ((l6 & 0x1) << 3)
+ multi_mat_l6_m1 ^= ((l6 & 0x80) >> 3) ^ ((l6 & 0x2) << 3)
+ multi_mat_l6_m1 ^= ((l6 & 0x4) << 3)
+ multi_mat_l6_m1 ^= ((l6 & 0x8) << 3)
+ multi_mat_l6_m1 ^= ((l6 & 0x10) << 3)
+
+
+ multiplied_lane[1] ^= multi_mat_l6_m3
+ multiplied_lane[2] ^= multi_mat_l3_m4 ^ multi_mat_l6_m1 ^ multi_mat_l7_m3
+
+ return multiplied_lane
+
+
+ALPHAS = (
+ list, # Identity.
+ _multiplyM,
+ _multiplyM2,
+ _multiplyM3,
+ _multiplyMR,
+ _multiplyMR2,
+ _multiplyMR3
+)