2
\$\begingroup\$

Using my previous function as a base I've come up the following:

create function dbo.Totp (
    @key varbinary(8000)
  , @timeStep int = 90
)
returns table
with schemabinding as
return (
    select [Pin].s as Pin
    from dbo.GetUnixTime() UnixEpoch
    cross apply dbo.Hmac(@key, Cast(Floor(1. * UnixEpoch.n / @timeStep) as bigint)) [Hash]
    cross apply (values(Cast(Substring([Hash].Bytes, DataLength([Hash].Bytes), 1) as int) & 0xF)) Offset (n)         
    cross apply (values(
        ((Cast(Substring([Hash].Bytes, Offset.n + 1, 1) as int) & 0x7F) * Power(2, 24))
      + ((Cast(Substring([Hash].Bytes, Offset.n + 2, 1) as int) & 0xFF) * Power(2, 16))
      + ((Cast(Substring([Hash].Bytes, Offset.n + 3, 1) as int) & 0xFF) * Power(2, 8))
      + (Cast(Substring([Hash].Bytes, Offset.n + 4, 1) as int) & 0xFF)
    )) [Binary] (n)
    cross apply (values([Binary].n % 100000000)) [Password] (n)
    cross apply dbo.PadLeft([Password].n, 0, 8) [Pin]
);
\$\endgroup\$
1
  • \$\begingroup\$ Hey mate could you provide the other functions referenced for full context? \$\endgroup\$
    – Sami.C
    Commented Dec 22, 2021 at 3:55

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Browse other questions tagged or ask your own question.