blob: 9335b8bcf4c2488c3cde34a914fe6353e5c7fac5 [file] [log] [blame]
// Copyright (c) 2010 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.
#ifndef LOGIN_MANAGER_OWNER_KEY_H_
#define LOGIN_MANAGER_OWNER_KEY_H_
#include <vector>
#include <base/basictypes.h>
#include <base/file_path.h>
#include <base/scoped_ptr.h>
namespace base {
class RSAPrivateKey;
class SignatureVerifier;
} // namespace base
namespace login_manager {
class ChildJobInterface;
class SystemUtils;
// This class holds the device owner's public key.
//
// If there is an owner key on disk, we will load that key, and deny
// attempts to set a new key programmatically. If there is no key
// present, we will allow the owner's key to be set programmatically,
// and will persist it to disk upon request. Attempts to set the key
// before on-disk storage has been checked will be denied.
class OwnerKey {
public:
OwnerKey(const FilePath& key_file);
virtual ~OwnerKey();
virtual bool HaveCheckedDisk();
virtual bool IsPopulated();
// If |key_file_| exists, populate the object with the contents of the file.
// If the file isn't there, that's ok.
// Will return false if the file exists and there are errors reading it.
// If this returns true, call IsPopulated() to tell whether or not data was
// loaded off of disk.
virtual bool PopulateFromDiskIfPossible();
// Load key material from |public_key_der|.
// We will _deny_ such an attempt if we have not yet checked disk for a key,
// or if we have already successfully loaded a key from disk.
virtual bool PopulateFromBuffer(const std::vector<uint8>& public_key_der);
// Load key material from |pair|.
// We will _deny_ such an attempt if we have not yet checked disk for a key,
// or if we have already successfully loaded a key from disk.
virtual bool PopulateFromKeypair(base::RSAPrivateKey* pair);
// Persist |key_| to disk, at |key_file_|.
// Calling this method before checking for a key on disk is an error.
// Returns false if |key_file_| already exists, or if there's an error while
// writing data.
virtual bool Persist();
// Verify that |signature| is a valid sha1 w/ RSA signature over the data in
// |data| with |key_|.
// Returns false if the sig is invalid, or there's an error.
virtual bool Verify(const char* data,
uint32 data_len,
const char* signature,
uint32 sig_len);
// Generate |OUT_signature|, a valid sha1 w/ RSA signature over the data in
// |data| that can be verified with |key_|.
// Returns false if the sig is invalid, or there's an error.
virtual bool Sign(const char* data,
uint32 data_len,
std::vector<uint8>* OUT_signature);
// Runs |generator| in a child process. Returns pid of the child.
virtual int StartGeneration(ChildJobInterface* generator);
// Returned reference will be empty if we haven't populated |key_| yet.
const std::vector<uint8>& public_key_der() const {
return key_;
}
private:
static const uint8 kAlgorithm[];
const FilePath key_file_;
bool have_checked_disk_;
std::vector<uint8> key_;
scoped_ptr<SystemUtils> utils_;
DISALLOW_COPY_AND_ASSIGN(OwnerKey);
};
} // namespace login_manager
#endif // LOGIN_MANAGER_OWNER_KEY_H_