public static async Task <AuthenticateResponse> AuthenticateAsync(U2FHidDevice u2fHidDevice, StartedAuthentication request, string facet, bool checkOnly) { ValidateRequest(request, facet); var sha256 = new SHA256Managed(); var appParam = sha256.ComputeHash(Encoding.ASCII.GetBytes(request.AppId)); var clientDataString = GetAuthenticationClientData(request.Challenge, facet); var clientParam = sha256.ComputeHash(Encoding.ASCII.GetBytes(clientDataString)); var keyHandleDecoded = Utils.Base64StringToByteArray(request.KeyHandle); var byteArrayBuilder = new ByteArrayBuilder(); byteArrayBuilder.Append(clientParam); byteArrayBuilder.Append(appParam); byteArrayBuilder.Append((byte)keyHandleDecoded.Length); byteArrayBuilder.Append(keyHandleDecoded); var data = byteArrayBuilder.GetBytes(); var p1 = (byte)(checkOnly ? 0x07 : 0x03); var p2 = (byte)0x00; var response = await u2fHidDevice.SendApduAsync(Constants.INS_SIGN, p1, p2, data); var responseBase64 = Utils.ByteArrayToBase64String(response); var clientDataBase64 = Utils.ByteArrayToBase64String(Encoding.ASCII.GetBytes(clientDataString)); var authenticateResponse = new AuthenticateResponse(clientDataBase64, responseBase64, request.KeyHandle); return(authenticateResponse); }
public static async Task <RegisterResponse> RegisterAsync(U2FHidDevice u2fHidDevice, StartedRegistration request, string facet) { ValidateRequest(request, facet); var appParam = GetApplicationParameter(request.AppId); var clientData = GetRegistrationClientData(request.Challenge, facet); var challengeParam = GetChallengeParameter(clientData); var data = challengeParam.Concat(appParam).ToArray(); var p1 = (byte)0x03; var p2 = (byte)0x00; var response = await u2fHidDevice.SendApduAsync(Constants.INS_ENROLL, p1, p2, data); var registrationDataBase64 = Utils.ByteArrayToBase64String(response); var clientDataBase64 = Utils.ByteArrayToBase64String(Encoding.ASCII.GetBytes(clientData)); var registerResponse = new RegisterResponse(registrationDataBase64, clientDataBase64); return(registerResponse); }