| Index: device/u2f/u2f_device.cc
|
| diff --git a/device/u2f/u2f_device.cc b/device/u2f/u2f_device.cc
|
| index f065c69d8b1707de136b6bc48446f14c7e299fae..21ee7b9fce62d28b95454a4537ad25c4c4d34c54 100644
|
| --- a/device/u2f/u2f_device.cc
|
| +++ b/device/u2f/u2f_device.cc
|
| @@ -2,9 +2,11 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| +#include "u2f_device.h"
|
| +
|
| #include "base/bind.h"
|
| #include "u2f_apdu_command.h"
|
| -#include "u2f_device.h"
|
| +#include "u2f_apdu_response.h"
|
|
|
| namespace device {
|
|
|
| @@ -13,7 +15,6 @@ U2fDevice::U2fDevice() : weak_factory_(this) {}
|
| U2fDevice::~U2fDevice() {}
|
|
|
| void U2fDevice::Register(const std::vector<uint8_t>& app_param,
|
| - U2fDevice::ProtocolVersion version,
|
| const std::vector<uint8_t>& challenge_param,
|
| const MessageCallback& callback) {
|
| scoped_refptr<U2fApduCommand> register_cmd =
|
| @@ -57,13 +58,49 @@ void U2fDevice::OnRegisterComplete(
|
| const MessageCallback& callback,
|
| bool success,
|
| scoped_refptr<U2fApduResponse> register_response) {
|
| - NOTIMPLEMENTED();
|
| + if (!success || !register_response) {
|
| + callback.Run(ReturnCode::FAILURE, std::vector<uint8_t>());
|
| + return;
|
| + }
|
| + switch (register_response->status()) {
|
| + case U2fApduResponse::Status::SW_CONDITIONS_NOT_SATISFIED:
|
| + callback.Run(ReturnCode::CONDITIONS_NOT_SATISFIED,
|
| + std::vector<uint8_t>());
|
| + break;
|
| + case U2fApduResponse::Status::SW_NO_ERROR:
|
| + callback.Run(ReturnCode::SUCCESS, register_response->data());
|
| + break;
|
| + case U2fApduResponse::Status::SW_WRONG_DATA:
|
| + callback.Run(ReturnCode::INVALID_PARAMS, std::vector<uint8_t>());
|
| + break;
|
| + default:
|
| + callback.Run(ReturnCode::FAILURE, std::vector<uint8_t>());
|
| + break;
|
| + }
|
| }
|
|
|
| void U2fDevice::OnSignComplete(const MessageCallback& callback,
|
| bool success,
|
| scoped_refptr<U2fApduResponse> sign_response) {
|
| - NOTIMPLEMENTED();
|
| + if (!success || !sign_response) {
|
| + callback.Run(ReturnCode::FAILURE, std::vector<uint8_t>());
|
| + return;
|
| + }
|
| + switch (sign_response->status()) {
|
| + case U2fApduResponse::Status::SW_CONDITIONS_NOT_SATISFIED:
|
| + callback.Run(ReturnCode::CONDITIONS_NOT_SATISFIED,
|
| + std::vector<uint8_t>());
|
| + break;
|
| + case U2fApduResponse::Status::SW_NO_ERROR:
|
| + callback.Run(ReturnCode::SUCCESS, sign_response->data());
|
| + break;
|
| + case U2fApduResponse::Status::SW_WRONG_DATA:
|
| + callback.Run(ReturnCode::INVALID_PARAMS, std::vector<uint8_t>());
|
| + break;
|
| + default:
|
| + callback.Run(ReturnCode::FAILURE, std::vector<uint8_t>());
|
| + break;
|
| + }
|
| }
|
|
|
| void U2fDevice::OnVersionComplete(
|
| @@ -84,7 +121,15 @@ void U2fDevice::OnLegacyVersionComplete(
|
| const VersionCallback& callback,
|
| bool success,
|
| scoped_refptr<U2fApduResponse> legacy_version_response) {
|
| - NOTIMPLEMENTED();
|
| + if (success && legacy_version_response &&
|
| + legacy_version_response->status() ==
|
| + U2fApduResponse::Status::SW_NO_ERROR &&
|
| + legacy_version_response->data() ==
|
| + std::vector<uint8_t>({'U', '2', 'F', '_', 'V', '2'})) {
|
| + callback.Run(success, ProtocolVersion::U2F_V2);
|
| + return;
|
| + }
|
| + callback.Run(success, ProtocolVersion::UNKNOWN);
|
| }
|
|
|
| } // namespace device
|
|
|