blob: 76263f9dc68e1f6558db1f49bdf08998777f2e2c [file] [log] [blame]
// Copyright 2021 The Chromium OS 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 "cryptohome/auth_factor/auth_factor.h"
#include <memory>
#include <utility>
#include <base/logging.h>
#include <cryptohome/proto_bindings/UserDataAuth.pb.h>
#include "cryptohome/auth_blocks/auth_block_utility.h"
#include "cryptohome/auth_blocks/tpm_bound_to_pcr_auth_block.h"
#include "cryptohome/crypto_error.h"
#include "cryptohome/error/converter.h"
#include "cryptohome/error/location_utils.h"
#include "cryptohome/key_objects.h"
#include "cryptohome/scrypt_verifier.h"
using cryptohome::error::CryptohomeCryptoError;
using cryptohome::error::CryptohomeError;
using cryptohome::error::ErrorAction;
using cryptohome::error::ErrorActionSet;
using hwsec_foundation::status::MakeStatus;
using hwsec_foundation::status::OkStatus;
using hwsec_foundation::status::StatusChain;
namespace cryptohome {
// static
CryptohomeStatusOr<std::unique_ptr<AuthFactor>> AuthFactor::CreateNew(
AuthFactorType type,
const std::string& label,
const AuthFactorMetadata& metadata,
const AuthInput& auth_input,
AuthBlockUtility* auth_block_utility,
KeyBlobs& out_key_blobs) {
AuthBlockState auth_block_state;
CryptoStatus error = auth_block_utility->CreateKeyBlobsWithAuthFactorType(
type, auth_input, auth_block_state, out_key_blobs);
if (!error.ok()) {
LOG(ERROR) << "Auth block creation failed for new auth factor";
return MakeStatus<CryptohomeError>(
CRYPTOHOME_ERR_LOC(kLocAuthFactorCreateKeyBlobsFailedInCreate))
.Wrap(std::move(error));
}
return std::make_unique<AuthFactor>(type, label, metadata, auth_block_state);
}
AuthFactor::AuthFactor(AuthFactorType type,
const std::string& label,
const AuthFactorMetadata& metadata,
const AuthBlockState& auth_block_state)
: type_(type),
label_(label),
metadata_(metadata),
auth_block_state_(auth_block_state) {}
CryptoStatus AuthFactor::Authenticate(const AuthInput& auth_input,
AuthBlockUtility* auth_block_utility,
KeyBlobs& out_key_blobs) {
CryptoStatus crypto_error = auth_block_utility->DeriveKeyBlobs(
auth_input, auth_block_state_, out_key_blobs);
if (!crypto_error.ok()) {
LOG(ERROR) << "Auth factor authentication failed: error " << crypto_error;
return MakeStatus<CryptohomeCryptoError>(
CRYPTOHOME_ERR_LOC(kLocAuthFactorDeriveFailedInAuth))
.Wrap(std::move(crypto_error));
}
return OkStatus<CryptohomeCryptoError>();
}
} // namespace cryptohome