1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_CHROMEOS_LOGIN_OWNER_KEY_UTILS_H_ 6 #define CHROME_BROWSER_CHROMEOS_LOGIN_OWNER_KEY_UTILS_H_ 7 #pragma once 8 9 #include <vector> 10 11 #include "base/basictypes.h" 12 #include "base/gtest_prod_util.h" 13 #include "base/memory/ref_counted.h" 14 #include "chrome/browser/chromeos/cros/login_library.h" 15 16 class FilePath; 17 18 namespace crypto { 19 class RSAPrivateKey; 20 } 21 22 namespace chromeos { 23 24 class OwnerKeyUtilsTest; 25 26 class OwnerKeyUtils : public base::RefCounted<OwnerKeyUtils> { 27 public: 28 class Factory { 29 public: 30 virtual OwnerKeyUtils* CreateOwnerKeyUtils() = 0; 31 }; 32 33 OwnerKeyUtils(); 34 35 // Sets the factory used by the static method Create to create an 36 // OwnerKeyUtils. OwnerKeyUtils does not take ownership of 37 // |factory|. A value of NULL results in an OwnerKeyUtils being 38 // created directly. 39 #if defined(UNIT_TEST) set_factory(Factory * factory)40 static void set_factory(Factory* factory) { factory_ = factory; } 41 #endif 42 43 // Creates an OwnerKeyUtils, ownership returns to the caller. If there is no 44 // Factory (the default) this creates and returns a new OwnerKeyUtils. 45 static OwnerKeyUtils* Create(); 46 47 // Assumes that the file at |key_file| exists. 48 // Upon success, returns true and populates |output|. False on failure. 49 virtual bool ImportPublicKey(const FilePath& key_file, 50 std::vector<uint8>* output) = 0; 51 52 // Verfiy that |signature| is a Sha1-with-RSA signature over |data| with 53 // |public_key| 54 // Returns true if so, false on bad signature or other error. 55 virtual bool Verify(const std::string& data, 56 const std::vector<uint8> signature, 57 const std::vector<uint8> public_key) = 0; 58 59 // Sign |data| with |key| using Sha1 with RSA. If successful, return true 60 // and populate |OUT_signature|. 61 virtual bool Sign(const std::string& data, 62 std::vector<uint8>* OUT_signature, 63 crypto::RSAPrivateKey* key) = 0; 64 65 // Looks for the private key associated with |key| in the default slot, 66 // and returns it if it can be found. Returns NULL otherwise. 67 // Caller takes ownership. 68 virtual crypto::RSAPrivateKey* FindPrivateKey( 69 const std::vector<uint8>& key) = 0; 70 71 virtual FilePath GetOwnerKeyFilePath() = 0; 72 73 protected: 74 virtual ~OwnerKeyUtils(); 75 76 // DER encodes public half of |pair| and writes it out to |key_file|. 77 // The blob on disk is a DER-encoded X509 SubjectPublicKeyInfo object. 78 // Returns false on error. 79 virtual bool ExportPublicKeyToFile(crypto::RSAPrivateKey* pair, 80 const FilePath& key_file) = 0; 81 82 private: 83 friend class base::RefCounted<OwnerKeyUtils>; 84 static Factory* factory_; 85 86 FRIEND_TEST_ALL_PREFIXES(OwnerKeyUtilsTest, ExportImportPublicKey); 87 }; 88 89 } // namespace chromeos 90 91 #endif // CHROME_BROWSER_CHROMEOS_LOGIN_OWNER_KEY_UTILS_H_ 92