예제 #1
0
        /// <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));
        }
예제 #2
0
        /// <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);
        }
예제 #3
0
 /// <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));
 }