0,0 → 1,38 |
""" prf_dot11.py |
|
The PRF function is used in a number of places in 802.11i |
to create psuedo random octet strings. |
|
The parameter 'prefix' is a string that shall be a unique label for each |
different purpose of the PRF. |
""" |
|
import hmac, sha # available in any Python 2.x |
|
def PRF( key, prefix, data, number_of_bits): |
""" Key, prefix and data are arbitrary strings . |
number_of_bits must be a multiple of 8 |
HMAC_SHA1 generates 20 byte blocks. Enough are generated to get the |
requested number of octets and the reslut is truncated to the requested size. |
""" |
number_of_octets, remainder = divmod(number_of_bits,8) |
if remainder != 0: |
raise ValueError, 'requested bits not multiple of 8' |
R = '' |
i = 0 |
while len(R) <= number_of_octets : |
hmac_sha_1= hmac.new( key, prefix + chr(0x00) + data + chr(i), sha ) |
i = i + 1 |
R = R + hmac_sha_1.digest() # concatenate latest hash to result string |
return R[:number_of_octets] # return R truncated to 'number_of_octets' |
|
def PRF_128(key,A,B): return PRF(key,A,B,128) |
def PRF_192(key,A,B): return PRF(key,A,B,192) |
def PRF_256(key,A,B): return PRF(key,A,B,256) |
def PRF_384(key,A,B): return PRF(key,A,B,384) |
def PRF_512(key,A,B): return PRF(key,A,B,512) |
def PRF_768(key,A,B): return PRF(key,A,B,768) |
|
|
|
|