1/*
2 * Copyright (C) 2019 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23 * THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#pragma once
27
28#if ENABLE(WEB_AUTHN) && PLATFORM(MAC)
29
30#include "Authenticator.h"
31#include <wtf/RunLoop.h>
32
33namespace apdu {
34class ApduResponse;
35}
36
37namespace WebKit {
38
39class CtapHidDriver;
40
41class U2fHidAuthenticator final : public Authenticator {
42public:
43 static Ref<U2fHidAuthenticator> create(std::unique_ptr<CtapHidDriver>&& driver)
44 {
45 return adoptRef(*new U2fHidAuthenticator(WTFMove(driver)));
46 }
47
48private:
49 explicit U2fHidAuthenticator(std::unique_ptr<CtapHidDriver>&&);
50
51 void makeCredential() final;
52 void checkExcludeList(size_t index);
53 void issueRegisterCommand();
54 void getAssertion() final;
55 void issueSignCommand(size_t index);
56
57 enum class CommandType : uint8_t {
58 RegisterCommand,
59 CheckOnlyCommand,
60 BogusCommand,
61 SignCommand
62 };
63 void issueNewCommand(Vector<uint8_t>&& command, CommandType);
64 void retryLastCommand() { issueCommand(m_lastCommand, m_lastCommandType); }
65 void issueCommand(const Vector<uint8_t>& command, CommandType);
66 void responseReceived(Vector<uint8_t>&& response, CommandType);
67 void continueRegisterCommandAfterResponseReceived(apdu::ApduResponse&&);
68 void continueCheckOnlyCommandAfterResponseReceived(apdu::ApduResponse&&);
69 void continueBogusCommandAfterResponseReceived(apdu::ApduResponse&&);
70 void continueSignCommandAfterResponseReceived(apdu::ApduResponse&&);
71
72 std::unique_ptr<CtapHidDriver> m_driver;
73 RunLoop::Timer<U2fHidAuthenticator> m_retryTimer;
74 Vector<uint8_t> m_lastCommand;
75 CommandType m_lastCommandType;
76 size_t m_nextListIndex { 0 };
77 bool m_isAppId { false };
78};
79
80} // namespace WebKit
81
82#endif // ENABLE(WEB_AUTHN) && PLATFORM(MAC)
83