| // 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. |
| |
| #include "content/browser/webauth/attestation_data.h" |
| |
| #include <utility> |
| |
| #include "base/numerics/safe_math.h" |
| #include "content/browser/webauth/authenticator_utils.h" |
| |
| namespace content { |
| |
| // static |
| std::unique_ptr<AttestationData> AttestationData::CreateFromU2fRegisterResponse( |
| const std::vector<uint8_t>& u2f_data, |
| std::vector<uint8_t> aaguid, |
| std::unique_ptr<PublicKey> public_key) { |
| // Extract the length of the credential (i.e. of the U2FResponse key |
| // handle). Length is big endian. |
| std::vector<uint8_t> credential_id_length(2, 0); |
| std::vector<uint8_t> extracted_length = authenticator_utils::Extract( |
| u2f_data, authenticator_utils::kU2fResponseLengthPos, 1); |
| |
| // Note that U2F responses only use one byte for length. |
| credential_id_length[1] = extracted_length[0]; |
| |
| // Extract the credential id (i.e. key handle). |
| std::vector<uint8_t> credential_id = authenticator_utils::Extract( |
| u2f_data, authenticator_utils::kU2fResponseKeyHandleStartPos, |
| base::strict_cast<size_t>(credential_id_length[1])); |
| |
| return std::make_unique<AttestationData>( |
| std::move(aaguid), std::move(credential_id_length), |
| std::move(credential_id), std::move(public_key)); |
| } |
| |
| AttestationData::AttestationData(std::vector<uint8_t> aaguid, |
| std::vector<uint8_t> length, |
| std::vector<uint8_t> credential_id, |
| std::unique_ptr<PublicKey> public_key) |
| : aaguid_(std::move(aaguid)), |
| credential_id_length_(std::move(length)), |
| credential_id_(std::move(credential_id)), |
| public_key_(std::move(public_key)) {} |
| |
| std::vector<uint8_t> AttestationData::SerializeAsBytes() { |
| std::vector<uint8_t> attestation_data; |
| std::vector<uint8_t> cbor_encoded_key = public_key_->EncodeAsCBOR(); |
| authenticator_utils::Append(&attestation_data, aaguid_); |
| authenticator_utils::Append(&attestation_data, credential_id_length_); |
| authenticator_utils::Append(&attestation_data, credential_id_); |
| authenticator_utils::Append(&attestation_data, cbor_encoded_key); |
| return attestation_data; |
| } |
| |
| AttestationData::~AttestationData() {} |
| |
| } // namespace content |