Advertisement
Guest User

Untitled

a guest
Apr 6th, 2022
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.92 KB | None | 0 0
  1. from struct import pack, unpack
  2. import ucryptolib
  3.  
  4. MODE_ECB = 1
  5.  
  6.  
  7. class AES_CMAC:
  8.     def gen_subkey(self, K):
  9.         AES_128 = ucryptolib.aes(bytearray(K), MODE_ECB)
  10.  
  11.         L = AES_128.encrypt(('\x00' * 16).encode())
  12.  
  13.         LHigh = unpack('>Q', L[:8])[0]
  14.         LLow = unpack('>Q', L[8:])[0]
  15.  
  16.         K1High = ((LHigh << 1) | (LLow >> 63)) & 0xFFFFFFFFFFFFFFFF
  17.         K1Low = (LLow << 1) & 0xFFFFFFFFFFFFFFFF
  18.  
  19.         if (LHigh >> 63):
  20.             K1Low ^= 0x87
  21.  
  22.         K2High = ((K1High << 1) | (K1Low >> 63)) & 0xFFFFFFFFFFFFFFFF
  23.         K2Low = ((K1Low << 1)) & 0xFFFFFFFFFFFFFFFF
  24.  
  25.         if (K1High >> 63):
  26.             K2Low ^= 0x87
  27.  
  28.         K1 = pack('>QQ', K1High, K1Low)
  29.         K2 = pack('>QQ', K2High, K2Low)
  30.  
  31.         return K1, K2
  32.  
  33.     def xor_128(self, N1, N2):
  34.         J = b''
  35.         for i in range(len(N1)):
  36.             J += bytes([N1[i] ^ N2[i]])
  37.         return J
  38.  
  39.     def pad(self, N):
  40.         const_Bsize = 16
  41.         padLen = 16 - len(N)
  42.         return N + b'\x80' + b'\x00' * (padLen - 1)
  43.  
  44.     def encode(self, K, M):
  45.         const_Bsize = 16
  46.         const_Zero = b'\x00' * 16
  47.  
  48.         AES_128 = ucryptolib.aes(bytearray(K), MODE_ECB)
  49.  
  50.         K1, K2 = self.gen_subkey(K)
  51.         n = int(len(M) / const_Bsize)
  52.  
  53.         if n == 0:
  54.             n = 1
  55.             flag = False
  56.         else:
  57.             if (len(M) % const_Bsize) == 0:
  58.                 flag = True
  59.             else:
  60.                 n += 1
  61.                 flag = False
  62.  
  63.         M_n = M[(n - 1) * const_Bsize:]
  64.         if flag is True:
  65.             M_last = self.xor_128(M_n, K1)
  66.         else:
  67.             M_last = self.xor_128(self.pad(M_n), K2)
  68.  
  69.         X = const_Zero
  70.         for i in range(n - 1):
  71.             M_i = M[(i) * const_Bsize:][:16]
  72.             Y = self.xor_128(X, M_i)
  73.             X = AES_128.encrypt(Y)
  74.         Y = self.xor_128(M_last, X)
  75.         T = AES_128.encrypt(Y)
  76.         return T
  77.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement