"""
A reference implementation of aeshash

Optimized for minimizing likelihood of implementation error - 
could be made much much faster

to use, pass aeshash.aeshash() the string to be hashed and 
it will return the hash value
"""

# by Bram Cohen
# this file is public domain

from rijndael import rijndael
from xor import xor
import string

def aeshash(s):
    bits = len(s) * 8
    bs = []
    while bits > 0:
        bs.append(chr(bits & 0xFF))
        bits >>= 8
    bs.reverse()
    bs = string.join(bs, '')
    bs = (chr(0) * (16 - len(bs))) + bs
    s += chr(0) * (-len(s) % 16)
    if len(s) % 32 == 0:
        s += chr(0) * 16
    s += bs
    s += dmhash(s)
    return dmhash(s)

def dmhash(s):
    assert len(s) % 32 == 0
    h = chr(0xFF) * 32
    for i in xrange(0, len(s), 32):
        r = rijndael(s[i:i + 32], 32)
        h = xor(h, r.encrypt(h))
    return h




