blob: a906e863c7a389505bfec9c7540d98fcff18495c [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/scrypt_password_verifier.h>
#include <brillo/secure_blob.h>
#include "cryptohome/cryptolib.h"
namespace cryptohome {
namespace {
constexpr int kScryptNFactor = 1 << 12; // 2^12
constexpr int kScryptRFactor = 8;
constexpr int kScryptPFactor = 1;
constexpr int kScryptSaltSize = 256 / CHAR_BIT;
constexpr int kScryptOutputSize = 256 / CHAR_BIT;
} // namespace
bool ScryptPasswordVerifier::Set(const brillo::SecureBlob& secret) {
verifier_.clear();
verifier_.resize(kScryptOutputSize, 0);
scrypt_salt_ = CryptoLib::CreateSecureRandomBlob(kScryptSaltSize);
return CryptoLib::Scrypt(secret, scrypt_salt_, kScryptNFactor, kScryptRFactor,
kScryptPFactor, &verifier_);
}
bool ScryptPasswordVerifier::Verify(const brillo::SecureBlob& secret) {
brillo::SecureBlob hashed_secret(kScryptOutputSize, 0);
if (!CryptoLib::Scrypt(secret, scrypt_salt_, kScryptNFactor, kScryptRFactor,
kScryptPFactor, &hashed_secret)) {
LOG(ERROR) << "Scrypt failed.";
return false;
}
if (verifier_.size() != hashed_secret.size()) {
return false;
}
return (brillo::SecureMemcmp(hashed_secret.data(), verifier_.data(),
verifier_.size()) == 0);
}
} // namespace cryptohome