in pkg/provider/googleapps/u2f.go [72:116]
func (d *U2FClient) ChallengeU2F() (string, error) {
if d.Device == nil {
return "", errors.New("No Device Found")
}
request := &u2fhost.AuthenticateRequest{
Challenge: b64Safe(d.ChallengeNonce),
Facet: d.Facet,
AppId: d.AppID,
KeyHandle: b64Safe(d.KeyHandle),
}
// do the change
prompted := false
timeout := time.After(time.Second * 25)
interval := time.NewTicker(time.Millisecond * 250)
defer d.Device.Close()
defer interval.Stop()
for {
select {
case <-timeout:
return "", errors.New("Failed to get authentication response after 25 seconds")
case <-interval.C:
response, err := d.Device.Authenticate(request)
if err == nil {
responseJSON, err := json.Marshal(response)
if err != nil {
return "", err
}
fmt.Printf(" ==> Touch accepted. Proceeding with authentication\n")
return string(responseJSON), nil
}
switch err.(type) {
case *u2fhost.TestOfUserPresenceRequiredError:
if !prompted {
fmt.Printf("\nTouch the flashing U2F device to authenticate...\n")
prompted = true
}
default:
return "", err
}
}
}
}