hotp.go
func (otp *HOTP) Scan(code string, window int) bool {
	var valid bool
	codeBytes := []byte(code)
	counter := otp.Counter()

	for i := 0; i < window; i++ {
		genCode := []byte(otp.OTP())
		if subtle.ConstantTimeCompare(codeBytes, genCode) == 1 {
			valid = true
			break
		}
	}
	if !valid {
		otp.setCounter(counter)
	}
	return valid
}
func (otp *HOTP) Scan(code string, window int) bool {
	var valid bool
	codeBytes := []byte(code)
	counter := otp.Counter()

	for i := 0; i < window; i++ {
		genCode := []byte(otp.OTP())
		if subtle.ConstantTimeCompare(codeBytes, genCode) == 1 {
			valid = true
			break
		}
	}
	if !valid {
		otp.setCounter(counter)
	}
	return valid
}
func ( otp * HOTP ) Scan ( code string , window int ) bool { var valid bool codeBytes := [ ] byte ( code ) counter := otp . Counter ( ) for i := 0 ; i < window ; i ++ { genCode := [ ] byte ( otp . OTP ( ) ) if subtle . ConstantTimeCompare ( codeBytes , genCode ) == 1 { valid = true break } } if ! valid { otp . setCounter ( counter ) } return valid }
// Scan takes a code input (i.e. from the user), and scans ahead
// within a certain window of counter values. This can be used in the
// case where the server's counter and the user's counter have fallen
// out of sync.
Scan takes a code input ( i . e . from the user ) and scans ahead within a certain window of counter values . This can be used in the case where the server s counter and the user s counter have fallen out of sync .