diff options
| author | Kévin Le Gouguec <kevin.legouguec@airbus.com> | 2019-03-14 16:11:26 +0100 |
|---|---|---|
| committer | Kévin Le Gouguec <kevin.legouguec@airbus.com> | 2019-03-21 14:49:15 +0100 |
| commit | 52c8c1a2b72e11f8814215034139e8991f1aeb63 (patch) | |
| tree | acf189f2658bb3194d1898b98f4a2a8ade5137d4 /python/helpers.py | |
| parent | c55465fc5cbe004bdca1cbd6990fed3c798d5f1b (diff) | |
| download | lilliput-ae-implem-52c8c1a2b72e11f8814215034139e8991f1aeb63.tar.xz | |
[implem-python] Extraction de fonctions communes aux deux modes
Diffstat (limited to 'python/helpers.py')
| -rw-r--r-- | python/helpers.py | 66 |
1 files changed, 65 insertions, 1 deletions
diff --git a/python/helpers.py b/python/helpers.py index 34949a4..3d741b0 100644 --- a/python/helpers.py +++ b/python/helpers.py @@ -1,4 +1,5 @@ -from constants import BLOCK_BYTES +from constants import BLOCK_BITS, BLOCK_BYTES +from lilliput_tbc import LilliputTBCEnc def ArrayToBlockbytesMatrix(array) : @@ -23,3 +24,66 @@ def ArrayToBlockbytesMatrix(array) : def BlockbytesMatrixToBytes(matrix): return bytes(byte for block in matrix for byte in block) + +def XorState(state1, state2): + return list( + s1^s2 for (s1, s2) in zip(state1, state2) + ) + + +def Padding10LSB(array, number_bits): + shifted = 0 + for byte in range(0, len(array)): + shifted |= (array[byte] << (8 * byte)) + shifted = (shifted << (BLOCK_BITS - number_bits)) & 0xffffffffffffffffffffffffffffffff + + padded = shifted | (0x1 << (BLOCK_BITS - number_bits - 1)) + + array_padded = [0 for byte in range(0, BLOCK_BYTES)] + for byte in range(0, BLOCK_BYTES): + array_padded[byte] = (padded & (0xff << (8 * byte))) >> (8 * byte) + + return array_padded + + +def _tweakAssociatedData(t, i, padded): + t_bytes = t//8 + tweak = [0]*(t_bytes) + + mask = 0xff + for byte in range(t_bytes-1): + tweak[byte] = (i & mask) >> (byte * 8) + mask = mask << 8 + + mask = (0xf << (8 * t_bytes-1)) + tweak[-1] = (i & mask) >> ((t_bytes-1)*8) + if not padded: + tweak[-1] |= 0x20 + else: + tweak[-1] |= 0x60 + + return tweak + + +def BuildAuth(t, A, key): + Auth = [0 for byte in range(0, BLOCK_BYTES)] + l_a = len(A)//BLOCK_BYTES + + padding_bytes = len(A)%BLOCK_BYTES + + A = ArrayToBlockbytesMatrix(A) + + for i in range(0, l_a): + tweak = _tweakAssociatedData(t, i, padded=False) + enc = LilliputTBCEnc(tweak, key, A[i]) + Auth = XorState(Auth, enc) + + if padding_bytes == 0: + return Auth + + tweak = _tweakAssociatedData(t, l_a, padded=True) + ad_padded = Padding10LSB(A[l_a], padding_bytes*8) + enc = LilliputTBCEnc(tweak, key, ad_padded) + Auth = XorState(Auth, enc) + + return Auth |
