v2_discovery.h 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. // Copyright 2020 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #ifndef DEVICE_FIDO_CABLE_V2_DISCOVERY_H_
  5. #define DEVICE_FIDO_CABLE_V2_DISCOVERY_H_
  6. #include <array>
  7. #include <memory>
  8. #include <vector>
  9. #include "base/callback.h"
  10. #include "base/component_export.h"
  11. #include "base/containers/flat_set.h"
  12. #include "base/containers/span.h"
  13. #include "base/memory/raw_ptr.h"
  14. #include "base/memory/weak_ptr.h"
  15. #include "device/fido/cable/cable_discovery_data.h"
  16. #include "device/fido/cable/v2_constants.h"
  17. #include "device/fido/fido_constants.h"
  18. #include "device/fido/fido_device_discovery.h"
  19. #include "services/network/public/mojom/network_context.mojom-forward.h"
  20. #include "third_party/abseil-cpp/absl/types/optional.h"
  21. namespace device {
  22. namespace cablev2 {
  23. struct Pairing;
  24. class FidoTunnelDevice;
  25. // Discovery creates caBLEv2 devices, either based on |pairings|, or when a BLE
  26. // advert is seen that matches |qr_generator_key|. It does not actively scan for
  27. // BLE adverts itself. Rather it depends on |OnBLEAdvertSeen| getting called.
  28. class COMPONENT_EXPORT(DEVICE_FIDO) Discovery : public FidoDeviceDiscovery {
  29. public:
  30. using AdvertEventStream = EventStream<base::span<const uint8_t, kAdvertSize>>;
  31. Discovery(
  32. FidoRequestType request_type,
  33. network::mojom::NetworkContext* network_context,
  34. absl::optional<base::span<const uint8_t, kQRKeySize>> qr_generator_key,
  35. std::unique_ptr<AdvertEventStream> advert_stream,
  36. std::vector<std::unique_ptr<Pairing>> pairings,
  37. // contact_device_stream contains a series of indexes into |pairings|
  38. // indicating that the given device should be contacted. The indexes
  39. // may be duplicated. It may be nullptr if |pairings| is empty.
  40. std::unique_ptr<EventStream<size_t>> contact_device_stream,
  41. const std::vector<CableDiscoveryData>& extension_contents,
  42. // pairing_callback will be called when a QR-initiated connection
  43. // receives pairing information from the peer.
  44. absl::optional<base::RepeatingCallback<void(std::unique_ptr<Pairing>)>>
  45. pairing_callback,
  46. // invalidated_pairing_callback will be called when a pairing is reported
  47. // to be invalid by the tunnel server.
  48. absl::optional<base::RepeatingCallback<void(size_t)>>
  49. invalidated_pairing_callback);
  50. ~Discovery() override;
  51. Discovery(const Discovery&) = delete;
  52. Discovery& operator=(const Discovery&) = delete;
  53. // FidoDeviceDiscovery:
  54. void StartInternal() override;
  55. private:
  56. // UnpairedKeys are keys that are conveyed by QR code or that come from the
  57. // server, i.e. keys that enable interactions with unpaired phones.
  58. struct UnpairedKeys {
  59. std::array<uint8_t, kQRSeedSize> local_identity_seed;
  60. std::array<uint8_t, kQRSecretSize> qr_secret;
  61. std::array<uint8_t, kEIDKeySize> eid_key;
  62. };
  63. void OnBLEAdvertSeen(base::span<const uint8_t, kAdvertSize> advert);
  64. void OnContactDevice(size_t pairing_index);
  65. void PairingIsInvalid(size_t pairing_index);
  66. static absl::optional<UnpairedKeys> KeysFromQRGeneratorKey(
  67. absl::optional<base::span<const uint8_t, kQRKeySize>> qr_generator_key);
  68. static std::vector<UnpairedKeys> KeysFromExtension(
  69. const std::vector<CableDiscoveryData>& extension_contents);
  70. const FidoRequestType request_type_;
  71. const raw_ptr<network::mojom::NetworkContext> network_context_;
  72. const absl::optional<UnpairedKeys> qr_keys_;
  73. const std::vector<UnpairedKeys> extension_keys_;
  74. std::unique_ptr<AdvertEventStream> advert_stream_;
  75. std::vector<std::unique_ptr<Pairing>> pairings_;
  76. std::unique_ptr<EventStream<size_t>> contact_device_stream_;
  77. const absl::optional<base::RepeatingCallback<void(std::unique_ptr<Pairing>)>>
  78. pairing_callback_;
  79. const absl::optional<base::RepeatingCallback<void(size_t)>>
  80. invalidated_pairing_callback_;
  81. std::vector<std::unique_ptr<FidoTunnelDevice>> tunnels_pending_advert_;
  82. base::flat_set<std::array<uint8_t, kAdvertSize>> observed_adverts_;
  83. bool started_ = false;
  84. std::vector<std::array<uint8_t, kAdvertSize>> pending_adverts_;
  85. base::WeakPtrFactory<Discovery> weak_factory_{this};
  86. };
  87. } // namespace cablev2
  88. } // namespace device
  89. #endif // DEVICE_FIDO_CABLE_V2_DISCOVERY_H_