Changeset 291423 in webkit


Ignore:
Timestamp:
Mar 17, 2022 11:28:13 AM (4 months ago)
Author:
J Pascoe
Message:

[WebAuthn] Support makeCredential for virtual HID authenticators
https://bugs.webkit.org/show_bug.cgi?id=237984
rdar://problem/90393676

Reviewed by Brent Fulgham.

Virtual authenticators for WebAuthn supports different transports: nfc,usb,internal,ble.
Currently, we support the internal transport, but the default transport used in web platform
tests is usb. This patch implements makeCredential for hid-based virtual authenticators. Virtual
credential information is stored in the VirtualCredential struct as suggested by the spec.

Source/WebCore:

  • Modules/webauthn/WebAuthenticationUtils.cpp:

(WebCore::buildAttestationMap):
(WebCore::buildAttestationObject):

  • Modules/webauthn/WebAuthenticationUtils.h:
  • Modules/webauthn/fido/FidoConstants.h:

Source/WebKit:

Tested manually via creating virtual authenticator and performing create and via wpt tests.

  • UIProcess/WebAuthentication/Mock/MockHidConnection.cpp:

(WebKit::MockHidConnection::parseRequest):
(WebKit::MockHidConnection::feedReports):

  • UIProcess/WebAuthentication/Virtual/VirtualAuthenticatorManager.cpp:

(WebKit::VirtualAuthenticatorManager::createAuthenticator):
(WebKit::VirtualAuthenticatorManager::addCredential):
(WebKit::VirtualAuthenticatorManager::createService const):

  • UIProcess/WebAuthentication/Virtual/VirtualAuthenticatorManager.h:
  • UIProcess/WebAuthentication/Virtual/VirtualAuthenticatorUtils.h: Copied from Source/WebKit/UIProcess/WebAuthentication/Virtual/VirtualService.h.
  • UIProcess/WebAuthentication/Virtual/VirtualAuthenticatorUtils.mm: Added.

(WebKit::flagsForConfig):
(WebKit::createPrivateKey):
(WebKit::credentialIdAndCosePubKeyForPrivateKey):
(WebKit::base64PrivateKey):

  • UIProcess/WebAuthentication/Virtual/VirtualCredential.h: Copied from Source/WebKit/UIProcess/WebAuthentication/Virtual/VirtualService.h.
  • UIProcess/WebAuthentication/Virtual/VirtualHidConnection.cpp: Added.

(WebKit::VirtualHidConnection::VirtualHidConnection):
(WebKit::VirtualHidConnection::initialize):
(WebKit::VirtualHidConnection::terminate):
(WebKit::VirtualHidConnection::sendSync):
(WebKit::VirtualHidConnection::send):
(WebKit::VirtualHidConnection::assembleRequest):
(WebKit::VirtualHidConnection::receiveHidMessage):
(WebKit::VirtualHidConnection::recieveResponseCode):
(WebKit::VirtualHidConnection::parseRequest):

  • UIProcess/WebAuthentication/Virtual/VirtualHidConnection.h: Copied from Source/WebKit/UIProcess/WebAuthentication/Virtual/VirtualAuthenticatorManager.h.
  • UIProcess/WebAuthentication/Virtual/VirtualService.h:
  • UIProcess/WebAuthentication/Virtual/VirtualService.mm:

(WebKit::VirtualService::VirtualService):
(WebKit::VirtualService::createVirtual):
(WebKit::authenticatorInfoForConfig):
(WebKit::VirtualService::startDiscoveryInternal):

  • WebKit.xcodeproj/project.pbxproj:
Location:
trunk/Source
Files:
2 added
13 edited
3 copied

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r291421 r291423  
     12022-03-17  J Pascoe  <j_pascoe@apple.com>
     2
     3        [WebAuthn] Support makeCredential for virtual HID authenticators
     4        https://bugs.webkit.org/show_bug.cgi?id=237984
     5        rdar://problem/90393676
     6
     7        Reviewed by Brent Fulgham.
     8
     9        Virtual authenticators for WebAuthn supports different transports: nfc,usb,internal,ble.
     10        Currently, we support the internal transport, but the default transport used in web platform
     11        tests is usb. This patch implements makeCredential for hid-based virtual authenticators. Virtual
     12        credential information is stored in the VirtualCredential struct as suggested by the spec.
     13
     14        * Modules/webauthn/WebAuthenticationUtils.cpp:
     15        (WebCore::buildAttestationMap):
     16        (WebCore::buildAttestationObject):
     17        * Modules/webauthn/WebAuthenticationUtils.h:
     18        * Modules/webauthn/fido/FidoConstants.h:
     19
    1202022-03-17  Youenn Fablet  <youenn@apple.com>
    221
  • trunk/Source/WebCore/Modules/webauthn/WebAuthenticationConstants.h

    r290515 r291423  
    101101};
    102102
     103// https://www.w3.org/TR/webauthn-2/#authenticator-data
     104constexpr uint8_t userPresenceFlag = 0b00000001;
     105constexpr uint8_t userVerifiedFlag = 0b00000100;
     106constexpr uint8_t attestedCredentialDataIncludedFlag = 0b01000000;
     107
    103108} // namespace WebAuthn
  • trunk/Source/WebCore/Modules/webauthn/WebAuthenticationUtils.cpp

    r287116 r291423  
    111111}
    112112
    113 Vector<uint8_t> buildAttestationObject(Vector<uint8_t>&& authData, String&& format, cbor::CBORValue::MapValue&& statementMap, const AttestationConveyancePreference& attestation)
     113cbor::CBORValue::MapValue buildAttestationMap(Vector<uint8_t>&& authData, String&& format, cbor::CBORValue::MapValue&& statementMap, const AttestationConveyancePreference& attestation)
    114114{
    115115    cbor::CBORValue::MapValue attestationObjectMap;
     
    128128    attestationObjectMap[cbor::CBORValue("fmt")] = cbor::CBORValue(WTFMove(format));
    129129    attestationObjectMap[cbor::CBORValue("attStmt")] = cbor::CBORValue(WTFMove(statementMap));
     130    return attestationObjectMap;
     131}
     132
     133Vector<uint8_t> buildAttestationObject(Vector<uint8_t>&& authData, String&& format, cbor::CBORValue::MapValue&& statementMap, const AttestationConveyancePreference& attestation)
     134{
     135    cbor::CBORValue::MapValue attestationObjectMap = buildAttestationMap(WTFMove(authData), WTFMove(format), WTFMove(statementMap), attestation);
    130136
    131137    auto attestationObject = cbor::CBORWriter::write(cbor::CBORValue(WTFMove(attestationObjectMap)));
  • trunk/Source/WebCore/Modules/webauthn/WebAuthenticationUtils.h

    r287116 r291423  
    5050WEBCORE_EXPORT Vector<uint8_t> buildAuthData(const String& rpId, const uint8_t flags, const uint32_t counter, const Vector<uint8_t>& optionalAttestedCredentialData);
    5151
     52WEBCORE_EXPORT cbor::CBORValue::MapValue buildAttestationMap(Vector<uint8_t>&&, String&&, cbor::CBORValue::MapValue&&, const AttestationConveyancePreference&);
     53
    5254// https://www.w3.org/TR/webauthn/#attestation-object
    5355WEBCORE_EXPORT Vector<uint8_t> buildAttestationObject(Vector<uint8_t>&& authData, String&& format, cbor::CBORValue::MapValue&& statementMap, const AttestationConveyancePreference&);
  • trunk/Source/WebCore/Modules/webauthn/fido/FidoConstants.h

    r254079 r291423  
    256256const uint8_t kCtapNfcApduIns = 0x10;
    257257
     258// https://fidoalliance.org/specs/fido-v2.0-ps-20170927/fido-client-to-authenticator-protocol-v2.0-ps-20170927.html#mandatory-commands
     259const size_t kCtapChannelIdSize = 4;
     260const uint8_t kCtapKeepAliveStatusProcessing = 1;
     261// https://fidoalliance.org/specs/fido-v2.0-ps-20170927/fido-client-to-authenticator-protocol-v2.0-ps-20170927.html#commands
     262const int64_t kCtapMakeCredentialClientDataHashKey = 1;
     263const int64_t kCtapMakeCredentialRpKey = 2;
     264const int64_t kCtapMakeCredentialUserKey = 3;
     265const int64_t kCtapMakeCredentialPubKeyCredParamsKey = 4;
     266const int64_t kCtapMakeCredentialExcludeListKey = 5;
     267const int64_t kCtapMakeCredentialExtensionsKey = 6;
     268const int64_t kCtapMakeCredentialRequestOptionsKey = 7;
     269const int64_t kCtapGetAssertionRequestOptionsKey = 5;
     270
    258271} // namespace fido
    259272
  • trunk/Source/WebKit/ChangeLog

    r291421 r291423  
     12022-03-17  J Pascoe  <j_pascoe@apple.com>
     2
     3        [WebAuthn] Support makeCredential for virtual HID authenticators
     4        https://bugs.webkit.org/show_bug.cgi?id=237984
     5        rdar://problem/90393676
     6
     7        Reviewed by Brent Fulgham.
     8
     9        Virtual authenticators for WebAuthn supports different transports: nfc,usb,internal,ble.
     10        Currently, we support the internal transport, but the default transport used in web platform
     11        tests is usb. This patch implements makeCredential for hid-based virtual authenticators. Virtual
     12        credential information is stored in the VirtualCredential struct as suggested by the spec.
     13
     14        Tested manually via creating virtual authenticator and performing create and via wpt tests.
     15
     16        * UIProcess/WebAuthentication/Mock/MockHidConnection.cpp:
     17        (WebKit::MockHidConnection::parseRequest):
     18        (WebKit::MockHidConnection::feedReports):
     19        * UIProcess/WebAuthentication/Virtual/VirtualAuthenticatorManager.cpp:
     20        (WebKit::VirtualAuthenticatorManager::createAuthenticator):
     21        (WebKit::VirtualAuthenticatorManager::addCredential):
     22        (WebKit::VirtualAuthenticatorManager::createService const):
     23        * UIProcess/WebAuthentication/Virtual/VirtualAuthenticatorManager.h:
     24        * UIProcess/WebAuthentication/Virtual/VirtualAuthenticatorUtils.h: Copied from Source/WebKit/UIProcess/WebAuthentication/Virtual/VirtualService.h.
     25        * UIProcess/WebAuthentication/Virtual/VirtualAuthenticatorUtils.mm: Added.
     26        (WebKit::flagsForConfig):
     27        (WebKit::createPrivateKey):
     28        (WebKit::credentialIdAndCosePubKeyForPrivateKey):
     29        (WebKit::base64PrivateKey):
     30        * UIProcess/WebAuthentication/Virtual/VirtualCredential.h: Copied from Source/WebKit/UIProcess/WebAuthentication/Virtual/VirtualService.h.
     31        * UIProcess/WebAuthentication/Virtual/VirtualHidConnection.cpp: Added.
     32        (WebKit::VirtualHidConnection::VirtualHidConnection):
     33        (WebKit::VirtualHidConnection::initialize):
     34        (WebKit::VirtualHidConnection::terminate):
     35        (WebKit::VirtualHidConnection::sendSync):
     36        (WebKit::VirtualHidConnection::send):
     37        (WebKit::VirtualHidConnection::assembleRequest):
     38        (WebKit::VirtualHidConnection::receiveHidMessage):
     39        (WebKit::VirtualHidConnection::recieveResponseCode):
     40        (WebKit::VirtualHidConnection::parseRequest):
     41        * UIProcess/WebAuthentication/Virtual/VirtualHidConnection.h: Copied from Source/WebKit/UIProcess/WebAuthentication/Virtual/VirtualAuthenticatorManager.h.
     42        * UIProcess/WebAuthentication/Virtual/VirtualService.h:
     43        * UIProcess/WebAuthentication/Virtual/VirtualService.mm:
     44        (WebKit::VirtualService::VirtualService):
     45        (WebKit::VirtualService::createVirtual):
     46        (WebKit::authenticatorInfoForConfig):
     47        (WebKit::VirtualService::startDiscoveryInternal):
     48        * WebKit.xcodeproj/project.pbxproj:
     49
    1502022-03-17  Youenn Fablet  <youenn@apple.com>
    251
  • trunk/Source/WebKit/UIProcess/WebAuthentication/Cocoa/LocalAuthenticator.mm

    r290840 r291423  
    6666using namespace fido;
    6767using namespace WebCore;
     68using namespace WebAuthn;
    6869using CBOR = cbor::CBORValue;
    6970
     
    7172
    7273// See https://www.w3.org/TR/webauthn/#flags.
    73 const uint8_t makeCredentialFlags = 0b01000101; // UP, UV and AT are set.
    74 const uint8_t otherMakeCredentialFlags = 0b01000001; // UP and AT are set.
    75 const uint8_t getAssertionFlags = 0b00000101; // UP and UV are set.
    76 const uint8_t otherGetAssertionFlags = 0b00000001; // UP is set.
     74const uint8_t makeCredentialFlags = userPresenceFlag | userVerifiedFlag | attestedCredentialDataIncludedFlag; // UP, UV and AT are set.
     75const uint8_t otherMakeCredentialFlags = userPresenceFlag | attestedCredentialDataIncludedFlag; // UP and AT are set.
     76const uint8_t getAssertionFlags = userPresenceFlag | userVerifiedFlag; // UP and UV are set.
     77const uint8_t otherGetAssertionFlags = userPresenceFlag; // UP is set.
    7778// Credential ID is currently SHA-1 of the corresponding public key.
    7879const uint16_t credentialIdLength = 20;
  • trunk/Source/WebKit/UIProcess/WebAuthentication/Mock/MockHidConnection.cpp

    r284009 r291423  
    4545using namespace fido;
    4646
    47 namespace MockHidConnectionInternal {
    48 // https://fidoalliance.org/specs/fido-v2.0-ps-20170927/fido-client-to-authenticator-protocol-v2.0-ps-20170927.html#mandatory-commands
    49 const size_t CtapChannelIdSize = 4;
    50 const uint8_t CtapKeepAliveStatusProcessing = 1;
    51 // https://fidoalliance.org/specs/fido-v2.0-ps-20170927/fido-client-to-authenticator-protocol-v2.0-ps-20170927.html#commands
    52 const int64_t CtapMakeCredentialRequestOptionsKey = 7;
    53 const int64_t CtapGetAssertionRequestOptionsKey = 5;
    54 }
    55 
    5647MockHidConnection::MockHidConnection(IOHIDDeviceRef device, const MockWebAuthenticationConfiguration& configuration)
    5748    : HidConnection(device)
     
    131122void MockHidConnection::parseRequest()
    132123{
    133     using namespace MockHidConnectionInternal;
    134 
    135124    ASSERT(m_requestMessage);
    136125    // Set stages.
     
    163152
    164153            if (cmd == CtapRequestCommand::kAuthenticatorMakeCredential) {
    165                 auto it = requestMap->getMap().find(CBORValue(CtapMakeCredentialRequestOptionsKey)); // Find options.
     154                auto it = requestMap->getMap().find(CBORValue(kCtapMakeCredentialRequestOptionsKey)); // Find options.
    166155                if (it != requestMap->getMap().end()) {
    167156                    auto& optionMap = it->second.getMap();
     
    178167
    179168            if (cmd == CtapRequestCommand::kAuthenticatorGetAssertion) {
    180                 auto it = requestMap->getMap().find(CBORValue(CtapGetAssertionRequestOptionsKey)); // Find options.
     169                auto it = requestMap->getMap().find(CBORValue(kCtapGetAssertionRequestOptionsKey)); // Find options.
    181170                if (it != requestMap->getMap().end()) {
    182171                    auto& optionMap = it->second.getMap();
     
    203192void MockHidConnection::feedReports()
    204193{
    205     using namespace MockHidConnectionInternal;
    206 
    207194    if (m_subStage == Mock::HidSubStage::Init) {
    208195        Vector<uint8_t> payload;
     
    213200            payload[0]--;
    214201        payload.grow(kHidInitResponseSize);
    215         cryptographicallyRandomValues(payload.data() + writePosition, CtapChannelIdSize);
     202        cryptographicallyRandomValues(payload.data() + writePosition, kCtapChannelIdSize);
    216203        auto channel = kHidBroadcastChannel;
    217204        if (stagesMatch() && m_configuration.hid->error == Mock::HidError::WrongChannelId)
     
    257244        if (m_configuration.hid->keepAlive) {
    258245            m_configuration.hid->keepAlive = false;
    259             FidoHidInitPacket initPacket(m_currentChannel, FidoHidDeviceCommand::kKeepAlive, { CtapKeepAliveStatusProcessing }, 1);
     246            FidoHidInitPacket initPacket(m_currentChannel, FidoHidDeviceCommand::kKeepAlive, { kCtapKeepAliveStatusProcessing }, 1);
    260247            receiveReport(initPacket.getSerializedData());
    261248            continueFeedReports();
  • trunk/Source/WebKit/UIProcess/WebAuthentication/Virtual/VirtualAuthenticatorManager.cpp

    r291321 r291423  
    3434namespace WebKit {
    3535
     36struct VirtualCredential;
     37
    3638VirtualAuthenticatorManager::VirtualAuthenticatorManager()
    3739    : AuthenticatorManager()
     
    4143String VirtualAuthenticatorManager::createAuthenticator(const VirtualAuthenticatorConfiguration& config)
    4244{
    43     if (config.transport != WebCore::AuthenticatorTransport::Internal)
     45    if (config.transport != WebCore::AuthenticatorTransport::Internal && config.transport != WebCore::AuthenticatorTransport::Usb)
    4446        UNIMPLEMENTED();
    4547    auto id = createVersion4UUIDString();
    4648    m_virtualAuthenticators.set(id, makeUniqueRef<VirtualAuthenticatorConfiguration>(config));
     49    Vector<VirtualCredential> credentials;
     50    m_credentialsByAuthenticator.set(id, WTFMove(credentials));
    4751
    4852    return id;
     
    5458}
    5559
     60void VirtualAuthenticatorManager::addCredential(const String& authenticatorId, const VirtualCredential& credential)
     61{
     62    m_credentialsByAuthenticator.get(authenticatorId).append(credential);
     63}
     64
    5665UniqueRef<AuthenticatorTransportService> VirtualAuthenticatorManager::createService(WebCore::AuthenticatorTransport transport, AuthenticatorTransportService::Observer& observer) const
    5766{
    58     Vector<VirtualAuthenticatorConfiguration> configs;
    59     for (auto& config : m_virtualAuthenticators.values()) {
    60         if (config.get().transport == transport)
    61             configs.append(config.get());
     67    Vector<std::pair<String, VirtualAuthenticatorConfiguration>> configs;
     68    for (auto& id : m_virtualAuthenticators.keys()) {
     69        auto config = m_virtualAuthenticators.get(id);
     70        if (config->transport == transport)
     71            configs.append(std::pair { id, *config });
    6272    }
    6373    return VirtualService::createVirtual(transport, observer, configs);
  • trunk/Source/WebKit/UIProcess/WebAuthentication/Virtual/VirtualAuthenticatorManager.h

    r291321 r291423  
    3030#include "AuthenticatorManager.h"
    3131#include "VirtualAuthenticatorConfiguration.h"
     32#include "VirtualCredential.h"
     33#include <wtf/WeakPtr.h>
    3234
    3335namespace WebKit {
     36struct VirtualCredential;
    3437
    3538class VirtualAuthenticatorManager final : public AuthenticatorManager {
     
    4144
    4245    bool isVirtual() const final { return true; }
    43     void runPanel();
    44     void selectAssertionResponse(Vector<Ref<WebCore::AuthenticatorAssertionResponse>>&&, WebAuthenticationSource, CompletionHandler<void(WebCore::AuthenticatorAssertionResponse*)>&&);
    45     void decidePolicyForLocalAuthenticator(CompletionHandler<void(LocalAuthenticatorPolicy)>&&);
    4646
     47    void addCredential(const String&, const VirtualCredential&);
     48
     49protected:
     50    void decidePolicyForLocalAuthenticator(CompletionHandler<void(LocalAuthenticatorPolicy)>&&) override;
     51    void selectAssertionResponse(Vector<Ref<WebCore::AuthenticatorAssertionResponse>>&&, WebAuthenticationSource, CompletionHandler<void(WebCore::AuthenticatorAssertionResponse*)>&&) override;
     52   
     53   
    4754private:
    4855    UniqueRef<AuthenticatorTransportService> createService(WebCore::AuthenticatorTransport, AuthenticatorTransportService::Observer&) const final;
     56    void runPanel() override;
    4957
    5058    HashMap<String, UniqueRef<VirtualAuthenticatorConfiguration>> m_virtualAuthenticators;
     59    HashMap<String, Vector<VirtualCredential>> m_credentialsByAuthenticator;
    5160};
    5261
  • trunk/Source/WebKit/UIProcess/WebAuthentication/Virtual/VirtualAuthenticatorUtils.h

    r291422 r291423  
    11/*
    2  * Copyright (C) 2021 Apple Inc. All rights reserved.
     2 * Copyright (C) 2022 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    2828#if ENABLE(WEB_AUTHN)
    2929
    30 #include "AuthenticatorTransportService.h"
    3130#include "VirtualAuthenticatorConfiguration.h"
    3231
    3332namespace WebKit {
    3433
    35 class VirtualService : public AuthenticatorTransportService {
    36 public:
    37     explicit VirtualService(Observer&, const Vector<VirtualAuthenticatorConfiguration>&);
    38 
    39     static UniqueRef<AuthenticatorTransportService> createVirtual(WebCore::AuthenticatorTransport, Observer&, const Vector<VirtualAuthenticatorConfiguration>& configs);
    40 private:
    41     void startDiscoveryInternal() final;
    42 
    43     Vector<VirtualAuthenticatorConfiguration> m_configurations;
    44 };
     34uint8_t flagsForConfig(const VirtualAuthenticatorConfiguration&);
     35RetainPtr<SecKeyRef> createPrivateKey();
     36std::pair<Vector<uint8_t>, Vector<uint8_t>> credentialIdAndCosePubKeyForPrivateKey(RetainPtr<SecKeyRef> privateKey);
     37String base64PrivateKey(RetainPtr<SecKeyRef> privateKey);
    4538
    4639} // namespace WebKit
  • trunk/Source/WebKit/UIProcess/WebAuthentication/Virtual/VirtualCredential.h

    r291422 r291423  
    11/*
    2  * Copyright (C) 2021 Apple Inc. All rights reserved.
     2 * Copyright (C) 2022 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    2828#if ENABLE(WEB_AUTHN)
    2929
    30 #include "AuthenticatorTransportService.h"
    31 #include "VirtualAuthenticatorConfiguration.h"
     30#include <WebCore/AuthenticatorTransport.h>
     31#include <wtf/text/WTFString.h>
    3232
    3333namespace WebKit {
    3434
    35 class VirtualService : public AuthenticatorTransportService {
    36 public:
    37     explicit VirtualService(Observer&, const Vector<VirtualAuthenticatorConfiguration>&);
    38 
    39     static UniqueRef<AuthenticatorTransportService> createVirtual(WebCore::AuthenticatorTransport, Observer&, const Vector<VirtualAuthenticatorConfiguration>& configs);
    40 private:
    41     void startDiscoveryInternal() final;
    42 
    43     Vector<VirtualAuthenticatorConfiguration> m_configurations;
     35struct VirtualCredential {
     36    WTF_MAKE_STRUCT_FAST_ALLOCATED;
     37    Vector<uint8_t> credentialId;
     38    String rpId;
     39    String privateKey;
     40    std::optional<Vector<uint8_t>> userHandle;
     41    uint64_t signCount;
     42    bool isResidentCredential;
     43    bool isVerificationRequired;
    4444};
    4545
  • trunk/Source/WebKit/UIProcess/WebAuthentication/Virtual/VirtualHidConnection.h

    r291422 r291423  
    11/*
    2  * Copyright (C) 2021 Apple Inc. All rights reserved.
     2 * Copyright (C) 2022 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    2828#if ENABLE(WEB_AUTHN)
    2929
    30 #include "AuthenticatorTransportService.h"
     30#include "HidConnection.h"
    3131#include "VirtualAuthenticatorConfiguration.h"
     32#include <WebCore/FidoHidMessage.h>
     33#include <wtf/WeakPtr.h>
    3234
    3335namespace WebKit {
     36struct VirtualAuthenticatorConfiguration;
     37class VirtualAuthenticatorManager;
    3438
    35 class VirtualService : public AuthenticatorTransportService {
     39class VirtualHidConnection final : public CanMakeWeakPtr<VirtualHidConnection>, public HidConnection {
    3640public:
    37     explicit VirtualService(Observer&, const Vector<VirtualAuthenticatorConfiguration>&);
     41    explicit VirtualHidConnection(const String& authenticatorId, const VirtualAuthenticatorConfiguration&, const WeakPtr<VirtualAuthenticatorManager>&);
    3842
    39     static UniqueRef<AuthenticatorTransportService> createVirtual(WebCore::AuthenticatorTransport, Observer&, const Vector<VirtualAuthenticatorConfiguration>& configs);
    4043private:
    41     void startDiscoveryInternal() final;
     44    void initialize() final;
     45    void terminate() final;
     46    DataSent sendSync(const Vector<uint8_t>& data) final;
     47    void send(Vector<uint8_t>&& data, DataSentCallback&&) final;
     48    void assembleRequest(Vector<uint8_t>&&);
     49    void parseRequest();
    4250
    43     Vector<VirtualAuthenticatorConfiguration> m_configurations;
     51    void receiveHidMessage(fido::FidoHidMessage&&);
     52    void recieveResponseCode(fido::CtapDeviceResponseCode);
     53
     54    WeakPtr<VirtualAuthenticatorManager> m_manager;
     55    VirtualAuthenticatorConfiguration m_configuration;
     56    std::optional<fido::FidoHidMessage> m_requestMessage;
     57    Vector<uint8_t> m_nonce;
     58    uint32_t m_currentChannel { fido::kHidBroadcastChannel };
     59    String m_authenticatorId;
    4460};
    45 
    4661} // namespace WebKit
    47 
    48 #endif // ENABLE(WEB_AUTHN)
     62#endif
  • trunk/Source/WebKit/UIProcess/WebAuthentication/Virtual/VirtualService.h

    r285267 r291423  
    3030#include "AuthenticatorTransportService.h"
    3131#include "VirtualAuthenticatorConfiguration.h"
     32#include "VirtualCredential.h"
     33#include <wtf/WeakPtr.h>
    3234
    3335namespace WebKit {
    3436
     37class VirtualAuthenticatorManager;
     38
    3539class VirtualService : public AuthenticatorTransportService {
    3640public:
    37     explicit VirtualService(Observer&, const Vector<VirtualAuthenticatorConfiguration>&);
     41    explicit VirtualService(Observer&, Vector<std::pair<String, VirtualAuthenticatorConfiguration>>&);
    3842
    39     static UniqueRef<AuthenticatorTransportService> createVirtual(WebCore::AuthenticatorTransport, Observer&, const Vector<VirtualAuthenticatorConfiguration>& configs);
     43    static UniqueRef<AuthenticatorTransportService> createVirtual(WebCore::AuthenticatorTransport, Observer&, Vector<std::pair<String, VirtualAuthenticatorConfiguration>>&);
    4044private:
    4145    void startDiscoveryInternal() final;
    4246
    43     Vector<VirtualAuthenticatorConfiguration> m_configurations;
     47    Vector<std::pair<String, VirtualAuthenticatorConfiguration>> m_authenticators;
    4448};
    4549
  • trunk/Source/WebKit/UIProcess/WebAuthentication/Virtual/VirtualService.mm

    r285267 r291423  
    2929#if ENABLE(WEB_AUTHN)
    3030
     31#import "CtapAuthenticator.h"
     32#import "CtapHidDriver.h"
    3133#import "LocalAuthenticator.h"
     34#import "VirtualAuthenticatorManager.h"
     35#import "VirtualHidConnection.h"
    3236#import "VirtualLocalConnection.h"
     37#import <WebCore/FidoConstants.h>
     38#import <WebCore/WebAuthenticationConstants.h>
     39#import <wtf/UniqueRef.h>
    3340#import <wtf/text/WTFString.h>
    3441
    3542namespace WebKit {
     43using namespace fido;
     44using namespace WebCore;
    3645
    37 VirtualService::VirtualService(Observer& observer, const Vector<VirtualAuthenticatorConfiguration>& configurations)
    38     : AuthenticatorTransportService(observer), m_configurations(configurations)
     46VirtualService::VirtualService(Observer& observer, Vector<std::pair<String, VirtualAuthenticatorConfiguration>>& authenticators)
     47    : AuthenticatorTransportService(observer), m_authenticators(authenticators)
    3948{
    4049}
    4150
    42 UniqueRef<AuthenticatorTransportService> VirtualService::createVirtual(WebCore::AuthenticatorTransport transport, Observer& observer,  const Vector<VirtualAuthenticatorConfiguration>& configs)
     51UniqueRef<AuthenticatorTransportService> VirtualService::createVirtual(WebCore::AuthenticatorTransport transport, Observer& observer, Vector<std::pair<String, VirtualAuthenticatorConfiguration>>& authenticators)
    4352{
    44     return makeUniqueRef<VirtualService>(observer, configs);
     53    return makeUniqueRef<VirtualService>(observer, authenticators);
     54}
     55
     56static AuthenticatorGetInfoResponse authenticatorInfoForConfig(const VirtualAuthenticatorConfiguration& config)
     57{
     58    AuthenticatorGetInfoResponse infoResponse({ ProtocolVersion::kCtap }, Vector<uint8_t>(aaguidLength, 0u));
     59    AuthenticatorSupportedOptions options;
     60    infoResponse.setOptions(WTFMove(options));
     61    return infoResponse;
    4562}
    4663
     
    4865{
    4966
    50     for (auto& config : m_configurations) {
     67    for (auto& authenticator : m_authenticators) {
    5168        if (!observer())
    5269            return;
     70        auto config = authenticator.second;
     71        auto authenticatorId = authenticator.first;
    5372        switch (config.transport) {
     73        case WebCore::AuthenticatorTransport::Usb:
     74            observer()->authenticatorAdded(CtapAuthenticator::create(WTF::makeUnique<CtapHidDriver>(makeUniqueRef<VirtualHidConnection>(authenticatorId, config, WeakPtr { static_cast<VirtualAuthenticatorManager *>(observer()) })), authenticatorInfoForConfig(config)));
     75            break;
    5476        case WebCore::AuthenticatorTransport::Internal:
    5577            observer()->authenticatorAdded(LocalAuthenticator::create(makeUniqueRef<VirtualLocalConnection>(config)));
    56                 break;
     78            break;
    5779        default:
    5880            UNIMPLEMENTED();
  • trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj

    r291243 r291423  
    10821082                51FAEC3B1B0657680009C4E7 /* AuxiliaryProcessMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51FAEC361B0657310009C4E7 /* AuxiliaryProcessMessageReceiver.cpp */; };
    10831083                51FD18B61651FBAD00DBE1CE /* NetworkResourceLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = 51FD18B41651FBAD00DBE1CE /* NetworkResourceLoader.h */; };
     1084                5252A51927E048740094BEB9 /* VirtualHidConnection.h in Headers */ = {isa = PBXBuildFile; fileRef = 5252A51727E048740094BEB9 /* VirtualHidConnection.h */; };
     1085                5252A51A27E048740094BEB9 /* VirtualHidConnection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5252A51827E048740094BEB9 /* VirtualHidConnection.cpp */; };
    10841086                52688AB427D7CE40003577A2 /* _WKResidentKeyRequirement.h in Headers */ = {isa = PBXBuildFile; fileRef = 52688AB327D7CE40003577A2 /* _WKResidentKeyRequirement.h */; settings = {ATTRIBUTES = (Private, ); }; };
    10851087                5272D4C91E735F0900EB4290 /* WKProtectionSpaceNS.h in Headers */ = {isa = PBXBuildFile; fileRef = 5272D4C71E735F0900EB4290 /* WKProtectionSpaceNS.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    10941096                52D5A1B01C57495A00DE34A3 /* VideoFullscreenManagerProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 52D5A1AA1C57494E00DE34A3 /* VideoFullscreenManagerProxy.h */; };
    10951097                52F060E11654318500F3281B /* NetworkContentRuleListManagerMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 52F060DD1654317500F3281B /* NetworkContentRuleListManagerMessageReceiver.cpp */; };
     1098                52F4B46927E1197700FFD129 /* VirtualAuthenticatorUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 52F4B46727E1197700FFD129 /* VirtualAuthenticatorUtils.h */; };
     1099                52F4B46A27E1197700FFD129 /* VirtualAuthenticatorUtils.mm in Sources */ = {isa = PBXBuildFile; fileRef = 52F4B46827E1197700FFD129 /* VirtualAuthenticatorUtils.mm */; };
     1100                52F4B46D27E125A800FFD129 /* VirtualCredential.h in Headers */ = {isa = PBXBuildFile; fileRef = 52F4B46B27E125A800FFD129 /* VirtualCredential.h */; };
    10961101                532159551DBAE7290054AA3C /* NetworkSessionCocoa.h in Headers */ = {isa = PBXBuildFile; fileRef = 532159501DBAE6D70054AA3C /* NetworkSessionCocoa.h */; };
    10971102                532159561DBAE72D0054AA3C /* NetworkDataTaskCocoa.h in Headers */ = {isa = PBXBuildFile; fileRef = 5321594F1DBAE6D70054AA3C /* NetworkDataTaskCocoa.h */; };
     
    46454650                51FD18B31651FBAD00DBE1CE /* NetworkResourceLoader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NetworkResourceLoader.cpp; sourceTree = "<group>"; };
    46464651                51FD18B41651FBAD00DBE1CE /* NetworkResourceLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkResourceLoader.h; sourceTree = "<group>"; };
     4652                5252A51727E048740094BEB9 /* VirtualHidConnection.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VirtualHidConnection.h; sourceTree = "<group>"; };
     4653                5252A51827E048740094BEB9 /* VirtualHidConnection.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = VirtualHidConnection.cpp; sourceTree = "<group>"; };
    46474654                52688AB327D7CE40003577A2 /* _WKResidentKeyRequirement.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = _WKResidentKeyRequirement.h; path = UIProcess/API/Cocoa/_WKResidentKeyRequirement.h; sourceTree = "<group>"; };
    46484655                5272D4C71E735F0900EB4290 /* WKProtectionSpaceNS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WKProtectionSpaceNS.h; path = mac/WKProtectionSpaceNS.h; sourceTree = "<group>"; };
     
    46644671                52EB68CC279E2145005C98D9 /* ARKitSoftLink.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = ARKitSoftLink.mm; sourceTree = "<group>"; };
    46654672                52F060DD1654317500F3281B /* NetworkContentRuleListManagerMessageReceiver.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = NetworkContentRuleListManagerMessageReceiver.cpp; path = DerivedSources/WebKit/NetworkContentRuleListManagerMessageReceiver.cpp; sourceTree = BUILT_PRODUCTS_DIR; };
     4673                52F4B46727E1197700FFD129 /* VirtualAuthenticatorUtils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VirtualAuthenticatorUtils.h; sourceTree = "<group>"; };
     4674                52F4B46827E1197700FFD129 /* VirtualAuthenticatorUtils.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = VirtualAuthenticatorUtils.mm; sourceTree = "<group>"; };
     4675                52F4B46B27E125A800FFD129 /* VirtualCredential.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VirtualCredential.h; sourceTree = "<group>"; };
    46664676                5315876B2076B713004BF9F3 /* NetworkActivityTrackerCocoa.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = NetworkActivityTrackerCocoa.mm; sourceTree = "<group>"; };
    46674677                5321594F1DBAE6D70054AA3C /* NetworkDataTaskCocoa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkDataTaskCocoa.h; sourceTree = "<group>"; };
     
    98599869                                52CDC5BF2731DA0C00A3E3EB /* VirtualAuthenticatorManager.cpp */,
    98609870                                52CDC5C32731DA0C00A3E3EB /* VirtualAuthenticatorManager.h */,
     9871                                52F4B46727E1197700FFD129 /* VirtualAuthenticatorUtils.h */,
     9872                                52F4B46827E1197700FFD129 /* VirtualAuthenticatorUtils.mm */,
     9873                                52F4B46B27E125A800FFD129 /* VirtualCredential.h */,
     9874                                5252A51827E048740094BEB9 /* VirtualHidConnection.cpp */,
     9875                                5252A51727E048740094BEB9 /* VirtualHidConnection.h */,
    98619876                                52CDC5C02731DA0C00A3E3EB /* VirtualLocalConnection.h */,
    98629877                                52CDC5C22731DA0C00A3E3EB /* VirtualLocalConnection.mm */,
     
    1365713672                                52CDC5C42731DA0D00A3E3EB /* VirtualAuthenticatorConfiguration.h in Headers */,
    1365813673                                52CDC5CA2731DA0D00A3E3EB /* VirtualAuthenticatorManager.h in Headers */,
     13674                                52F4B46927E1197700FFD129 /* VirtualAuthenticatorUtils.h in Headers */,
     13675                                52F4B46D27E125A800FFD129 /* VirtualCredential.h in Headers */,
     13676                                5252A51927E048740094BEB9 /* VirtualHidConnection.h in Headers */,
    1365913677                                52CDC5C72731DA0D00A3E3EB /* VirtualLocalConnection.h in Headers */,
    1366013678                                52CDC5C82731DA0D00A3E3EB /* VirtualService.h in Headers */,
     
    1615316171                                2684055218B86ED60022C38B /* ViewUpdateDispatcherMessageReceiver.cpp in Sources */,
    1615416172                                52CDC5C62731DA0D00A3E3EB /* VirtualAuthenticatorManager.cpp in Sources */,
     16173                                52F4B46A27E1197700FFD129 /* VirtualAuthenticatorUtils.mm in Sources */,
     16174                                5252A51A27E048740094BEB9 /* VirtualHidConnection.cpp in Sources */,
    1615516175                                52CDC5C92731DA0D00A3E3EB /* VirtualLocalConnection.mm in Sources */,
    1615616176                                52CDC5C52731DA0D00A3E3EB /* VirtualService.mm in Sources */,
Note: See TracChangeset for help on using the changeset viewer.