""" crypto.keyedHash.michael A reference implementation of the Michael Message Integrety Chek (MIC) that is defined in IEEE 802.11 Task Group 'i' Michael is a 64-bit MIC, with a design strength of 20 bits. Copyright (c) 2002 by Paul A. Lambert Read LICENSE.txt for license information. """ from struct import pack, unpack from binascii_plus import * class Michael: """ The Michael keyed hash as defined in IEEE 802.11i D2.0 """ def __init__(self, key = None): self.name = 'Michael' self.blocksize = 1 # single octets can be hashed by padding to raw block size self.raw_block_size = 4 # operates on 32 bits or 4 byte blocks self.digest_size = 8 # MIC size of 64 bits or 8 bytes self.keySize = 8 # key size is 8 octets self.strength = 20 if key != None: self.setKey(key) def __del__(self): self.setKey(8*chr(0)) # feable attempt to clear keys on exit def setKey(self,key): """ setKey(key) ... key is binary string """ assert( len(key)== self.keySize), 'Key must be 8 octets' self._key = unpack('>15) & 0x1ffffL)) # r = r ^ (l <<< 17) l = (l+r) & 0xffffffffL # l = (l+r) mod 2**32 r ^= ((l & 0xff00ff00L)>>8)|((l & 0x00ff00ffL)<<8) # r = r ^ XSWAP(l) l = (l+r) & 0xffffffffL # l = (l+r) mod 2**32 r ^= (((l<<3) & 0xffffffffL) | ((l>>29)& 0x7)) # r = r ^ (l <<< 3) l = (l+r) & 0xffffffffL # l = (l+r) mod 2**32 r ^= (((l<<30L) & 0xffffffffL)|((l>>2) & 0x3fffffff)) # r = r ^ (l >>> 2) l = (l+r) & 0xffffffffL # l = (l+r) mod 2**32 return (l,r)