/// <summary> /// Takes a time step and computes a TOTP code /// </summary> /// <param name="counter">time step</param> /// <param name="mode">The hash mode to use</param> /// <returns>TOTP calculated code</returns> protected override string Compute(long counter, OtpHashMode mode) { var data = KeyUtilities.GetBigEndianBytes(counter); var otp = CalculateOtp(data, mode); return(Digits(otp, _totpSize)); }
/// <summary> /// Uses the key to get an HMAC using the specified algorithm and data /// </summary> /// <param name="mode">The HMAC algorithm to use</param> /// <param name="data">The data used to compute the HMAC</param> /// <returns>HMAC of the key and data</returns> public byte[] ComputeHmac(OtpHashMode mode, byte[] data) { byte[] hashedValue; using (HMAC hmac = CreateHmacHash(mode)) { byte[] key = GetCopyOfKey(); try { hmac.Key = key; hashedValue = hmac.ComputeHash(data); } finally { KeyUtilities.Destroy(key); } } return(hashedValue); }
/// <summary> /// Uses the procedure defined in RFC 4226 section 7.5 to derive a key from the master key /// </summary> /// <param name="masterKey">The master key from which to derive a device specific key</param> /// <param name="serialNumber">A serial number that is unique to the authenticating device</param> /// <param name="mode">The hash mode to use. This will determine the resulting key lenght. The default is sha-1 (as per the RFC) which is 20 bytes</param> /// <returns>Derived key</returns> public static byte[] DeriveKeyFromMaster(IKeyProvider masterKey, int serialNumber, OtpHashMode mode = OtpHashMode.Sha1) { return(DeriveKeyFromMaster(masterKey, KeyUtilities.GetBigEndianBytes(serialNumber), mode)); }