VUSB-Firmware for Attiny85 implementing HMAC one time password authentication
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
hmac-otp/debug.py

90 lines
2.6 KiB

#!/usr/bin/python3
class SHA1 (object):
_h0, _h1, _h2, _h3, _h4, = (
0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0)
def __init__(self, message):
length = bin(len(message) * 8)[2:].rjust(64, "0")
while len(message) > 64:
self._handle(''.join(bin(i)[2:].rjust(8, "0")
for i in message[:64]))
message = message[64:]
message = ''.join(bin(i)[2:].rjust(8, "0") for i in message) + "1"
message += "0" * ((448 - len(message) % 512) % 512) + length
for i in range(len(message) // 512):
self._handle(message[i * 512:i * 512 + 512])
def _handle(self, chunk):
lrot = lambda x, n: (x << n) | (x >> (32 - n))
w = []
for j in range(len(chunk) // 32):
w.append(int(chunk[j * 32:j * 32 + 32], 2))
for i in range(16, 80):
w.append(lrot(w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16], 1)
& 0xffffffff)
for i in w:
tmp=hex(i)[2:]
print("0"*(8-len(tmp)),end="")
print(tmp,end=" ")
a = self._h0
b = self._h1
c = self._h2
d = self._h3
e = self._h4
for i in range(80):
if i <= i <= 19:
f, k = d ^ (b & (c ^ d)), 0x5a827999
elif 20 <= i <= 39:
f, k = b ^ c ^ d, 0x6ed9eba1
elif 40 <= i <= 59:
f, k = (b & c) | (d & (b | c)), 0x8f1bbcdc
elif 60 <= i <= 79:
f, k = b ^ c ^ d, 0xca62c1d6
temp = lrot(a, 5) + f + e + k + w[i] & 0xffffffff
a, b, c, d, e = temp, a, lrot(b, 30), c, d
self._h0 = (self._h0 + a) & 0xffffffff
self._h1 = (self._h1 + b) & 0xffffffff
self._h2 = (self._h2 + c) & 0xffffffff
self._h3 = (self._h3 + d) & 0xffffffff
self._h4 = (self._h4 + e) & 0xffffffff
def _digest(self):
return (self._h0, self._h1, self._h2, self._h3, self._h4)
def hexdigest(self):
return ''.join(hex(i)[2:].rjust(8, "0")
for i in self._digest())
def digest(self):
hexdigest = self.hexdigest()
return bytes(int(hexdigest[i * 2:i * 2 + 2], 16)
for i in range(len(hexdigest) // 2))
#H(K XOR opad, H(K XOR ipad, text))
k = b"\x0b"*20 + b"\x00"*(64-20)
text = b"Hi There"
ipad=b""
opad=b""
for i in range(64):
ipad+=bytes(chr(k[i] ^ 0x36),"ASCII")
opad+=bytes(chr(k[i] ^ 0x5C),"ASCII")
inner = SHA1( ipad+text ).digest()
outer = SHA1( opad+inner ).hexdigest()
print("inner:",SHA1( ipad+text ).hexdigest() )
print("result:",outer)
lrot = lambda x, n: (x << n) | (x >> (32 - n))