OTP implementation
This patch was authored by @Craz1k0ek and released by @MrLotU.
Adds HOTP & TOTP support. (#2499)
The HOTP can be created as an object, or it can be statically generated once:
let key = SymmetricKey(size: .bits128)
let code = HOTP(key: key, digest: .sha1, digits: .six).generate(counter: 15)
HOTP.generate(key: key, digest: .sha1, digits: .six, counter: 15)
The TOTP can be created as an object, or it can be statically generated once:
let key = SymmetricKey(size: .bits128)
let code = TOTP(key: key, digest: .sha1, digits: .six, interval: 30).generate(time: Date())
TOTP.generate(key: key, digest: .sha1, digits: .six, interval: 30, time: Date())