Commit df113380 authored by Pavel Kalinnikov's avatar Pavel Kalinnikov Committed by Commit Bot

[u2f] Factor out command type enum.

This is necessary to share the enum with U2F over BLE implementation.

Bug: 763303
Change-Id: Id31326c6cd42e0027de7e6c788c7e24b3795faa9
Reviewed-on: https://chromium-review.googlesource.com/659817
Commit-Queue: Pavel Kalinnikov <pkalinnikov@chromium.org>
Reviewed-by: default avatarReilly Grant <reillyg@chromium.org>
Cr-Commit-Position: refs/heads/master@{#501307}
parent a23a4a8e
...@@ -11,6 +11,7 @@ source_set("u2f") { ...@@ -11,6 +11,7 @@ source_set("u2f") {
"u2f_apdu_command.h", "u2f_apdu_command.h",
"u2f_apdu_response.cc", "u2f_apdu_response.cc",
"u2f_apdu_response.h", "u2f_apdu_response.h",
"u2f_command_type.h",
"u2f_device.cc", "u2f_device.cc",
"u2f_device.h", "u2f_device.h",
"u2f_hid_device.cc", "u2f_hid_device.cc",
......
// Copyright 2017 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.
#ifndef DEVICE_U2F_U2F_COMMAND_TYPE_H_
#define DEVICE_U2F_U2F_COMMAND_TYPE_H_
#include <stdint.h>
namespace device {
// The type of a command that can be sent either to or from a U2F authenticator,
// i.e. a request or a response.
//
// Each request sent to a device results in a response of *the same* type sent
// back, unless there was an error in which case a CMD_ERROR is returned.
//
// TODO(pkalinnikov): Merge BLE-specific commands to this type.
enum class U2fCommandType : uint8_t {
// Sends arbitrary data to the device which echoes the same data back.
CMD_PING = 0x81,
// Encapsulates a U2F protocol raw message.
CMD_MSG = 0x83,
// Requests a unique channel from a USB/HID device.
CMD_INIT = 0x86,
// Instructs a USB/HID authenticator to show the user that it is active.
CMD_WINK = 0x88,
// Used as a response in case an error occurs during a request.
CMD_ERROR = 0xBF,
};
} // namespace device
#endif // DEVICE_U2F_U2F_COMMAND_TYPE_H_
...@@ -11,8 +11,9 @@ ...@@ -11,8 +11,9 @@
#include "crypto/random.h" #include "crypto/random.h"
#include "device/base/device_client.h" #include "device/base/device_client.h"
#include "device/hid/hid_connection.h" #include "device/hid/hid_connection.h"
#include "u2f_apdu_command.h" #include "device/u2f/u2f_apdu_command.h"
#include "u2f_message.h" #include "device/u2f/u2f_command_type.h"
#include "device/u2f/u2f_message.h"
namespace device { namespace device {
...@@ -54,7 +55,7 @@ void U2fHidDevice::Transition(std::unique_ptr<U2fApduCommand> command, ...@@ -54,7 +55,7 @@ void U2fHidDevice::Transition(std::unique_ptr<U2fApduCommand> command,
case State::IDLE: { case State::IDLE: {
state_ = State::BUSY; state_ = State::BUSY;
std::unique_ptr<U2fMessage> msg = U2fMessage::Create( std::unique_ptr<U2fMessage> msg = U2fMessage::Create(
channel_id_, U2fMessage::Type::CMD_MSG, command->GetEncodedCommand()); channel_id_, U2fCommandType::CMD_MSG, command->GetEncodedCommand());
ArmTimeout(callback); ArmTimeout(callback);
// Write message to the device // Write message to the device
...@@ -109,7 +110,7 @@ void U2fHidDevice::AllocateChannel(std::unique_ptr<U2fApduCommand> command, ...@@ -109,7 +110,7 @@ void U2fHidDevice::AllocateChannel(std::unique_ptr<U2fApduCommand> command,
std::vector<uint8_t> nonce(8); std::vector<uint8_t> nonce(8);
crypto::RandBytes(nonce.data(), nonce.size()); crypto::RandBytes(nonce.data(), nonce.size());
std::unique_ptr<U2fMessage> message = std::unique_ptr<U2fMessage> message =
U2fMessage::Create(channel_id_, U2fMessage::Type::CMD_INIT, nonce); U2fMessage::Create(channel_id_, U2fCommandType::CMD_INIT, nonce);
WriteMessage( WriteMessage(
std::move(message), true, std::move(message), true,
...@@ -302,7 +303,7 @@ void U2fHidDevice::TryWink(const WinkCallback& callback) { ...@@ -302,7 +303,7 @@ void U2fHidDevice::TryWink(const WinkCallback& callback) {
} }
std::unique_ptr<U2fMessage> wink_message = U2fMessage::Create( std::unique_ptr<U2fMessage> wink_message = U2fMessage::Create(
channel_id_, U2fMessage::Type::CMD_WINK, std::vector<uint8_t>()); channel_id_, U2fCommandType::CMD_WINK, std::vector<uint8_t>());
WriteMessage( WriteMessage(
std::move(wink_message), true, std::move(wink_message), true,
base::Bind(&U2fHidDevice::OnWink, weak_factory_.GetWeakPtr(), callback)); base::Bind(&U2fHidDevice::OnWink, weak_factory_.GetWeakPtr(), callback));
......
...@@ -13,7 +13,7 @@ namespace device { ...@@ -13,7 +13,7 @@ namespace device {
// static // static
std::unique_ptr<U2fMessage> U2fMessage::Create( std::unique_ptr<U2fMessage> U2fMessage::Create(
uint32_t channel_id, uint32_t channel_id,
Type type, U2fCommandType type,
const std::vector<uint8_t>& data) { const std::vector<uint8_t>& data) {
if (data.size() > kMaxMessageSize) if (data.size() > kMaxMessageSize)
return nullptr; return nullptr;
...@@ -44,7 +44,7 @@ U2fMessage::U2fMessage(std::unique_ptr<U2fInitPacket> init_packet, ...@@ -44,7 +44,7 @@ U2fMessage::U2fMessage(std::unique_ptr<U2fInitPacket> init_packet,
} }
U2fMessage::U2fMessage(uint32_t channel_id, U2fMessage::U2fMessage(uint32_t channel_id,
Type type, U2fCommandType type,
const std::vector<uint8_t>& data) const std::vector<uint8_t>& data)
: packets_(), remaining_size_(), channel_id_(channel_id) { : packets_(), remaining_size_(), channel_id_(channel_id) {
size_t remaining_bytes = data.size(); size_t remaining_bytes = data.size();
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include <vector> #include <vector>
#include "base/gtest_prod_util.h" #include "base/gtest_prod_util.h"
#include "device/u2f/u2f_command_type.h"
#include "device/u2f/u2f_packet.h" #include "device/u2f/u2f_packet.h"
namespace net { namespace net {
...@@ -23,20 +24,14 @@ namespace device { ...@@ -23,20 +24,14 @@ namespace device {
// about the message are available through class methods. // about the message are available through class methods.
class U2fMessage { class U2fMessage {
public: public:
enum class Type : uint8_t { U2fMessage(uint32_t channel_id,
CMD_PING = 0x81, U2fCommandType type,
CMD_MSG = 0x83, const std::vector<uint8_t>& data);
CMD_INIT = 0x86,
CMD_WINK = 0x88,
CMD_ERROR = 0xbf,
};
U2fMessage(uint32_t channel_id, Type type, const std::vector<uint8_t>& data);
U2fMessage(std::unique_ptr<U2fInitPacket> init_packet, size_t remaining_size); U2fMessage(std::unique_ptr<U2fInitPacket> init_packet, size_t remaining_size);
~U2fMessage(); ~U2fMessage();
static std::unique_ptr<U2fMessage> Create(uint32_t channel_id, static std::unique_ptr<U2fMessage> Create(uint32_t channel_id,
Type type, U2fCommandType type,
const std::vector<uint8_t>& data); const std::vector<uint8_t>& data);
// Reconstruct a message from serialized message data // Reconstruct a message from serialized message data
static std::unique_ptr<U2fMessage> CreateFromSerializedData( static std::unique_ptr<U2fMessage> CreateFromSerializedData(
......
...@@ -39,7 +39,7 @@ TEST_F(U2fMessageTest, TestPacketSize) { ...@@ -39,7 +39,7 @@ TEST_F(U2fMessageTest, TestPacketSize) {
TEST_F(U2fMessageTest, TestPacketData) { TEST_F(U2fMessageTest, TestPacketData) {
uint32_t channel_id = 0xF5060708; uint32_t channel_id = 0xF5060708;
std::vector<uint8_t> data{10, 11}; std::vector<uint8_t> data{10, 11};
uint8_t cmd = static_cast<uint8_t>(U2fMessage::Type::CMD_WINK); uint8_t cmd = static_cast<uint8_t>(U2fCommandType::CMD_WINK);
auto init_packet = auto init_packet =
std::make_unique<U2fInitPacket>(channel_id, cmd, data, data.size()); std::make_unique<U2fInitPacket>(channel_id, cmd, data, data.size());
int index = 0; int index = 0;
...@@ -70,7 +70,7 @@ TEST_F(U2fMessageTest, TestPacketData) { ...@@ -70,7 +70,7 @@ TEST_F(U2fMessageTest, TestPacketData) {
TEST_F(U2fMessageTest, TestPacketConstructors) { TEST_F(U2fMessageTest, TestPacketConstructors) {
uint32_t channel_id = 0x05060708; uint32_t channel_id = 0x05060708;
std::vector<uint8_t> data{10, 11}; std::vector<uint8_t> data{10, 11};
uint8_t cmd = static_cast<uint8_t>(U2fMessage::Type::CMD_WINK); uint8_t cmd = static_cast<uint8_t>(U2fCommandType::CMD_WINK);
auto orig_packet = auto orig_packet =
std::make_unique<U2fInitPacket>(channel_id, cmd, data, data.size()); std::make_unique<U2fInitPacket>(channel_id, cmd, data, data.size());
...@@ -105,7 +105,7 @@ TEST_F(U2fMessageTest, TestMaxLengthPacketConstructors) { ...@@ -105,7 +105,7 @@ TEST_F(U2fMessageTest, TestMaxLengthPacketConstructors) {
for (size_t i = 0; i < U2fMessage::kMaxMessageSize; ++i) for (size_t i = 0; i < U2fMessage::kMaxMessageSize; ++i)
data.push_back(static_cast<uint8_t>(i % 0xff)); data.push_back(static_cast<uint8_t>(i % 0xff));
U2fMessage::Type cmd = U2fMessage::Type::CMD_MSG; U2fCommandType cmd = U2fCommandType::CMD_MSG;
std::unique_ptr<U2fMessage> orig_msg = std::unique_ptr<U2fMessage> orig_msg =
U2fMessage::Create(channel_id, cmd, data); U2fMessage::Create(channel_id, cmd, data);
auto it = orig_msg->begin(); auto it = orig_msg->begin();
...@@ -147,18 +147,18 @@ TEST_F(U2fMessageTest, TestMessagePartitoning) { ...@@ -147,18 +147,18 @@ TEST_F(U2fMessageTest, TestMessagePartitoning) {
uint32_t channel_id = 0x01010203; uint32_t channel_id = 0x01010203;
std::vector<uint8_t> data(U2fMessage::kInitPacketDataSize + 1); std::vector<uint8_t> data(U2fMessage::kInitPacketDataSize + 1);
std::unique_ptr<U2fMessage> two_packet_message = std::unique_ptr<U2fMessage> two_packet_message =
U2fMessage::Create(channel_id, U2fMessage::Type::CMD_PING, data); U2fMessage::Create(channel_id, U2fCommandType::CMD_PING, data);
EXPECT_EQ(2U, two_packet_message->NumPackets()); EXPECT_EQ(2U, two_packet_message->NumPackets());
data.resize(U2fMessage::kInitPacketDataSize); data.resize(U2fMessage::kInitPacketDataSize);
std::unique_ptr<U2fMessage> one_packet_message = std::unique_ptr<U2fMessage> one_packet_message =
U2fMessage::Create(channel_id, U2fMessage::Type::CMD_PING, data); U2fMessage::Create(channel_id, U2fCommandType::CMD_PING, data);
EXPECT_EQ(1U, one_packet_message->NumPackets()); EXPECT_EQ(1U, one_packet_message->NumPackets());
data.resize(U2fMessage::kInitPacketDataSize + data.resize(U2fMessage::kInitPacketDataSize +
U2fMessage::kContinuationPacketDataSize + 1); U2fMessage::kContinuationPacketDataSize + 1);
std::unique_ptr<U2fMessage> three_packet_message = std::unique_ptr<U2fMessage> three_packet_message =
U2fMessage::Create(channel_id, U2fMessage::Type::CMD_PING, data); U2fMessage::Create(channel_id, U2fCommandType::CMD_PING, data);
EXPECT_EQ(3U, three_packet_message->NumPackets()); EXPECT_EQ(3U, three_packet_message->NumPackets());
} }
...@@ -166,7 +166,7 @@ TEST_F(U2fMessageTest, TestMaxSize) { ...@@ -166,7 +166,7 @@ TEST_F(U2fMessageTest, TestMaxSize) {
uint32_t channel_id = 0x00010203; uint32_t channel_id = 0x00010203;
std::vector<uint8_t> data(U2fMessage::kMaxMessageSize + 1); std::vector<uint8_t> data(U2fMessage::kMaxMessageSize + 1);
std::unique_ptr<U2fMessage> oversize_message = std::unique_ptr<U2fMessage> oversize_message =
U2fMessage::Create(channel_id, U2fMessage::Type::CMD_PING, data); U2fMessage::Create(channel_id, U2fCommandType::CMD_PING, data);
EXPECT_EQ(nullptr, oversize_message); EXPECT_EQ(nullptr, oversize_message);
} }
...@@ -174,7 +174,7 @@ TEST_F(U2fMessageTest, TestDeconstruct) { ...@@ -174,7 +174,7 @@ TEST_F(U2fMessageTest, TestDeconstruct) {
uint32_t channel_id = 0x0A0B0C0D; uint32_t channel_id = 0x0A0B0C0D;
std::vector<uint8_t> data(U2fMessage::kMaxMessageSize, 0x7F); std::vector<uint8_t> data(U2fMessage::kMaxMessageSize, 0x7F);
std::unique_ptr<U2fMessage> filled_message = std::unique_ptr<U2fMessage> filled_message =
U2fMessage::Create(channel_id, U2fMessage::Type::CMD_PING, data); U2fMessage::Create(channel_id, U2fCommandType::CMD_PING, data);
EXPECT_THAT(data, testing::ContainerEq(filled_message->GetMessagePayload())); EXPECT_THAT(data, testing::ContainerEq(filled_message->GetMessagePayload()));
} }
...@@ -184,7 +184,7 @@ TEST_F(U2fMessageTest, TestDeserialize) { ...@@ -184,7 +184,7 @@ TEST_F(U2fMessageTest, TestDeserialize) {
std::vector<uint8_t> data(U2fMessage::kMaxMessageSize); std::vector<uint8_t> data(U2fMessage::kMaxMessageSize);
std::unique_ptr<U2fMessage> orig_message = std::unique_ptr<U2fMessage> orig_message =
U2fMessage::Create(channel_id, U2fMessage::Type::CMD_PING, data); U2fMessage::Create(channel_id, U2fCommandType::CMD_PING, data);
std::list<scoped_refptr<net::IOBufferWithSize>> orig_list; std::list<scoped_refptr<net::IOBufferWithSize>> orig_list;
scoped_refptr<net::IOBufferWithSize> buf = orig_message->PopNextPacket(); scoped_refptr<net::IOBufferWithSize> buf = orig_message->PopNextPacket();
orig_list.push_back(buf); orig_list.push_back(buf);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment