Sub GetOTP (key() As Byte) As String 'key/pw as bytes
BC.LittleEndian=False
Dim unixtimestamp As Int = Floor(DateUtils.TicksToUnixTime(DateTime.Now)/30)
Dim utshex As String=Bit.ToHexString(unixtimestamp)
Do While utshex.Length<16
utshex="0" & utshex
Loop
Dim m As Mac
Dim k As KeyGenerator
k.Initialize("HMACSHA1")
k.KeyFromBytes(key)
m.Initialise("HMACSHA1", k.Key)
BC.LittleEndian=True
m.Update(BC.HexToBytes(utshex))
Dim b() As Byte
b = m.Sign
Dim BC As ByteConverter
Dim Offs As Int= Bit.And(b(19),15)
Dim OTP,p1,p2,p3,p4,pt As Int
p1=Bit.ShiftLeft(Bit.And(b(Offs+0),127),24)
p2=Bit.ShiftLeft(Bit.And(b(Offs+1),255),16)
p3=Bit.ShiftLeft(Bit.And(b(Offs+2),255),8)
p4=Bit.And(b(Offs+3),255)
pt=Bit.Or(p1,p2)
pt=Bit.Or(pt,p3)
OTP=Bit.Or(pt,p4) Mod Power(10,6)
Return NumberFormat2(OTP,6,0,0,False)
End Sub