def padKey(self, key_bytes): '''Pads the used key with zeroes on the right until it meets the expected hash input length. Doesn't return the padded key, just changes it in-place.''' paddedKey = MyBitArray() paddedKey.FromBytes(key_bytes) if len(paddedKey) < BrownThomasHMAC.expectedBlockLength: padding = [0] * (len(paddedKey) - BrownThomasHMAC.expectedBlockLength) padding.extend(paddedKey.bits) paddedKey.FromBits(padding) elif len(paddedKey) > BrownThomasHMAC.expectedBlockLength: paddedKey.bits = paddedKey.bits[:BrownThomasHMAC.expectedBlockLength] return paddedKey
def ProcessPermutation(self, bit_array, permutation_box, is_reversed = False): # Make resulting bit array result = MyBitArray() # Process the permutation if is_reversed == False: for x in permutation_box: result.append(bit_array[x - 1]) else: # Reverse the permutation result.bits = [0] * len(bit_array) for i in range(len(permutation_box)): result[permutation_box[i] - 1] = bit_array[i] return result
def CreateInitializationVector(self): bitLength = 0 initializationVector = bytearray() while bitLength < self.expectedBlockLength: appendage = randint(0, 255) initializationVector.append(appendage) bitLength += appendage.bit_length() if bitLength >= self.expectedBlockLength: break resultBitArray = MyBitArray() resultBitArray.FromBytes(initializationVector) # Truncate result to expectedBlockLength # of bits resultBitArray.bits = resultBitArray.bits[:self.expectedBlockLength] return resultBitArray