| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| library fuchsia.identity.transfer; |
| |
| using fuchsia.identity.account; |
| using fuchsia.kms; |
| |
| /// The control protocol used by two AccountManager components on different |
| /// devices to exchange information. |
| /// |
| /// Note: this is a sensitive interface and connections should only be created |
| /// between AccountManagers on remotely attested devices. No components on |
| /// the same device should connect over this protocol. |
| [Discoverable] |
| protocol AccountManagerPeer { |
| /// Requests an account transfer. |
| /// `lifetime` The lifetime that the transferred account should have |
| /// on the target device. |
| /// `account_transfer` The server end of an `AccountTransfer` channel. |
| ReceiveAccount(fuchsia.identity.account.Lifetime lifetime, |
| request<AccountTransfer> account_transfer); |
| }; |
| |
| /// The control channel through which AccountManager components on different |
| /// devices communicate to execute an account transfer. |
| /// |
| /// When an account needs to be transferred, the source device should request |
| /// an `AccountTransfer` connection using the `ReceiveAccount` method on the |
| /// `AccountManagerPeer` exposed by the target device. |
| /// Once the target device is ready, it sends an `OnTransferReady` containing |
| /// a `target_key`. |
| /// The source device should then encrypt the account using the `target_key` |
| /// and complete the transfer with `CompleteAccountTransfer`. |
| /// Once the account transfer is complete, the channel is closed. |
| protocol AccountTransfer { |
| |
| /// This event is sent once by the target device when it has completed |
| /// preparing to receive an account. The event contains a `target_key` |
| /// which should be used to encrypt the account data sent through |
| /// `CompleteAccountTransfer`. |
| -> OnTransferReady(fuchsia.kms.PublicKey target_key); |
| |
| /// Completes the account transfer by sending the transfered data. |
| /// The data is opaque to the AccountManager binary, and should be |
| /// supplied and encrypted by the account handler on the source device |
| /// using the `target_key` received through `OnTransferReady`. |
| /// |
| /// If the account is already present on the target device this fails |
| /// with UNSUPPORTED_OPERATION. |
| CompleteAccountTransfer(bytes encrypted_account_data) |
| -> () error fuchsia.identity.account.Error; |
| }; |