private IRawConvertible HandleAuthenticationRequest(byte[] rawData, BackgroundTask.IO_CTL_XFER_MESSAGE request) { var req = new AuthenticationRequest(rawData); var reg = U2FRegistration.Find(keyHandle: req.KeyHandle, applicationParameter: req.ApplicationParameter); if (reg == null) { return(CreateError(ProtocolErrorCode.WrongData)); } if (req.Control == Control.CheckOnly) { return(CreateError(ProtocolErrorCode.ConditionNoSatisfied)); } var facet = KnownFacets.GetKnownFacet(req.ApplicationParameter); if (!UserPresence.Present) { UserPresence.AskAsync(UserPresence.PresenceType.Authentication, facet); return(CreateError(ProtocolErrorCode.ConditionNoSatisfied)); } UserPresence.Take(); ApplicationData appData; using (var db = new AppDbContext()) { appData = db.ApplicationDatum.First(); if (appData == null) { return(CreateError(ProtocolErrorCode.OtherError)); } appData.Counter += 1; db.SaveChanges(); } var payloadSize = req.ApplicationParameter.Length + 1 + Marshal.SizeOf <UInt32>() + req.ApplicationParameter.Length; var sigPayload = new List <byte>(capacity: payloadSize); sigPayload.AddRange(req.ApplicationParameter); sigPayload.Add(0x01); // user present var counterBytes = BitConverter.GetBytes(appData.Counter); if (BitConverter.IsLittleEndian) { Array.Reverse(counterBytes); } sigPayload.AddRange(counterBytes); sigPayload.AddRange(req.ChallengeParameter); try { var sig = Signature.SignData(sigPayload.ToArray(), reg.KeyPair.PrivateKey); return(new AuthenticationResponse(userPresence: 0x01, counter: appData.Counter, sig)); } catch { return(CreateError(ProtocolErrorCode.OtherError)); } }