blob: 8df2e0445239f706bc7537d309689c1ddd48d612 [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
module chromeos.secure_channel.mojom;
import "chromeos/components/multidevice/mojom/multidevice_types.mojom";
enum ConnectionAttemptFailureReason {
// The local device could not authenticate with the remote device. This likely
// means that one (or both) devices have not synced their keys recently.
AUTHENTICATION_ERROR,
// An advertisement could not be generated for this connection. This likely
// means that one (or both) devices have not synced ntheir BeaconSeeds
// recently.
COULD_NOT_GENERATE_ADVERTISEMENT,
// GATT connections were attempted, but they failed. This could be caused by
// errors creating GATT connections, dropped GATT connections, or an issue
// relating to GATT services being unavailable.
GATT_CONNECTION_ERROR,
// The provided local device does not have a public key set.
LOCAL_DEVICE_INVALID_PUBLIC_KEY,
// The provided local device does not have a persistent symmetric key set.
LOCAL_DEVICE_INVALID_PSK,
// The provided remote device does not have a public key set.
REMOTE_DEVICE_INVALID_PUBLIC_KEY,
// The provided remote device does not have a persistent symmetric key set.
REMOTE_DEVICE_INVALID_PSK,
// Timeouts occurred trying to contact the remote device.
TIMEOUT_FINDING_DEVICE,
// The local Bluetooth adapter is disabled (turned off).
ADAPTER_DISABLED,
// The local Bluetooth adapter is not present.
ADAPTER_NOT_PRESENT
};
enum ConnectionCreationDetail {
REMOTE_DEVICE_USED_BACKGROUND_BLE_ADVERTISING,
REMOTE_DEVICE_USED_FOREGROUND_BLE_ADVERTISING
};
// Determines the order in which connections are attempted when system resources
// must be shared. For example, a device can only register a limited number of
// BLE advertisements at a given time due to hardware constraints; in this
// situation, a connection attempt with a higher priority will be allowed to
// register an advertisement before an attempt with a lower priority.
//
// For connection mediums which do not require use of limited system resources,
// ConnectionPriority is ignored.
enum ConnectionPriority {
// Should be used for connection attempts which do not have latency
// requirements (e.g., background scans for nearby devices).
LOW,
// Should be used when the connection attempt should complete in a reasonable
// amount of time but is not urgent (e.g., heartbeat/keep-alive messages).
MEDIUM,
// Should be used when the user is directly waiting on the result of the
// connection (e.g., the user clicks a button and sees a spinner in the UI
// until the connection succeeds).
HIGH
};
struct BluetoothConnectionMetadata {
// RSSI at the exact time that this metadata was requested. Note that RSSI
// may change drastically in a short period; this is only a snapshot.
int32 current_rssi;
};
struct ConnectionMetadata {
// Details which describe how the connection was created. If no
// ConnectionCreationDetails apply to this connection, the array is empty.
array<ConnectionCreationDetail> creation_details;
// Only available for connections over Bluetooth.
BluetoothConnectionMetadata? bluetooth_connection_metadata;
// The responder auth message returned by the other device during the
// cryptographic handshake that established the channel. These are serialized
// bytes of a proto which contains an encrypted message, returned by the
// remote device in the last step of a 3-step cryptographic handshake. These
// bytes were publicly visible over BLE when the connection with the remote
// device was being established. It is used by some clients for further
// cryptographic communication.
// Defined by //chromeos/services/device_sync/proto/securemessage.proto.
string channel_binding_data;
};
interface Channel {
// If the connection is dropped (e.g., by the remote device or due to
// connection instability), this reason is supplied to the
// connection_error_with_reason_handler.
const int32 kConnectionDroppedReason = 1;
// Sends an encrypted message over the connection. The message is sent
// along with metadata indicating the feature used to create this
// connection. The callback is invoked when the message has been sent
// successfully. If the message fails to be sent, the entire Channel is
// disconnected with reason |kConnectionDroppedReason|, and the SendMessage()
// callback is never invoked.
SendMessage(string message) => ();
GetConnectionMetadata() => (ConnectionMetadata metadata);
};
interface MessageReceiver {
// Invoked when a message is received over the connection. Only messages
// corresponding to the feature used when creating the connection are
// passed to this callback.
OnMessageReceived(string message);
};
// Delegate interface used to handle connection attempt successes/failures. Note
// that this interface is intended to be implemented by clients of the
// DeviceSync service.
interface ConnectionDelegate {
// Invoked when a connection attempt failed (i.e., the failure occurred before
// a connection could be established).
OnConnectionAttemptFailure(ConnectionAttemptFailureReason reason);
// Invoked when a connection is established. The channel is authenticated
// with account credentials, and all messages sent over the channel are
// encrypted. Client should set a connection_error_with_reason_handler on
// |channel| to be notified when it has been invalidated due to a dropped
// connection. Note that clients are expected to hold the reference to
// |channel| until they are done using the connection.
OnConnection(Channel channel, MessageReceiver& message_receiver);
};
// Brokers connections between the current Chromebook and remote devices,
// allowing the sending/receiving of messages. All channels created via this API
// are authenticated and all messages sent are encrypted via account-specific
// keys.
//
// If multiple connections are requested to the same device, this service
// creates only one connection and shares it among all clients; likewise, if
// multiple clients are sharing a single connection and one client drops its
// reference to the connection, the connection will stay active until each
// client has invalidated its reference to the channel.
//
// All connections require metadata about the local device (i.e., the device on
// which this code is running) in order to perform a cryptographic handshake
// which ensures that both devices are owned by the same underlying account.
// Note that each logged-in user on Chrome OS has its own set of keys; thus, the
// provided local device is not the same each time the call is made. For
// instance, at the sign-in (i.e., account-choosing) screen, EasyUnlock tries to
// establish connections to phones belonging to each account on the device, so
// each of these connection attempts uses a different local device.
//
// Note: Each API function results in either one connection (success case)
// or zero connections (failure case). Clients wishing to initiate another
// connection after the first one has completed should invoke the API again.
interface SecureChannel {
// Starts listening for an incoming connection attempt from |device|.
// This function listens indefinitely until a connection is formed, at
// which time |delegate|'s OnConnection() is invoked. |delegate|'s
// OnConnectionFailure() is only invoked if the connection could not be
// attempted at all (e.g., if |device| did not contain valid metadata). To
// cancel a connection attempt (i.e., to stop listening for incoming
// connections), disconnect |delegate|.
ListenForConnectionFromDevice(
chromeos.multidevice.mojom.RemoteDevice device_to_connect,
chromeos.multidevice.mojom.RemoteDevice local_device,
string feature,
ConnectionPriority connection_priority,
ConnectionDelegate delegate);
// Initiates a connection to |device|, which is presumed to be listening
// for incoming connections. This function attempts to create a connection
// until it has succeeded or until it has failed several attempts.
// |delegate|'s OnConnection() is called in the success case, and
// OnConnectionFailure() is called if a connection could not be attempted or
// if a connection was attempted and failed several retry attempts. To cancel
// the connection attempt, disconnect |delegate|.
InitiateConnectionToDevice(
chromeos.multidevice.mojom.RemoteDevice device_to_connect,
chromeos.multidevice.mojom.RemoteDevice local_device,
string feature,
ConnectionPriority connection_priority,
ConnectionDelegate delegate);
};