I think it makes more sense to move this error handling code outside of the function. So we just have something a bit more like

    type AuthError struct {
        message string
        original error
    }
    func (ae AuthError) Error() string {
        return "Authentication error: " + ae.message + ae.original.Error()
    }
    [...]
    if err != nil {
        return nil, AuthError{message: "Reading auth response: ", original: err}
    }
    [...]
    authResponse, err := authenticate()
    if err != nil {
        log.Println("User authentication error: ", err)
        // TODO: Send MsgHandshakeReject
        return
    }