Index: chrome/browser/chromeos/platform_keys/platform_keys_service.h |
diff --git a/chrome/browser/chromeos/platform_keys/platform_keys_service.h b/chrome/browser/chromeos/platform_keys/platform_keys_service.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e5b12595a310ceba620df2a68b1798fb7d440033 |
--- /dev/null |
+++ b/chrome/browser/chromeos/platform_keys/platform_keys_service.h |
@@ -0,0 +1,153 @@ |
+// Copyright 2014 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. |
+ |
+#ifndef CHROME_BROWSER_CHROMEOS_PLATFORM_KEYS_PLATFORM_KEYS_SERVICE_H_ |
+#define CHROME_BROWSER_CHROMEOS_PLATFORM_KEYS_PLATFORM_KEYS_SERVICE_H_ |
+ |
+#include <string> |
+ |
+#include "base/callback_forward.h" |
+#include "base/macros.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "base/memory/weak_ptr.h" |
+#include "components/keyed_service/core/keyed_service.h" |
+ |
+namespace content { |
+class BrowserContext; |
+} |
+ |
+namespace base { |
+class ListValue; |
+class Value; |
+} |
+ |
+namespace extensions { |
+class StateStore; |
+} |
+ |
+namespace chromeos { |
+ |
+class PlatformKeysService : public KeyedService { |
+ public: |
+ // Stores registration information in |state_store|, i.e. for each extension |
+ // the list of public keys that are valid to be used for signing. Each key can |
+ // be used for signing at most once. |
+ // The format written to |state_store| is: |
+ // kStateStorePlatformKeys maps to a list of strings. |
+ // Each string is the base64 encoding of the DER representation of a public |
+ // key's SPKI. |
+ explicit PlatformKeysService(content::BrowserContext* browser_context, |
+ extensions::StateStore* state_store); |
+ virtual ~PlatformKeysService(); |
+ |
+ // If the generation was successful, |public_key_spki_der| will contain the |
+ // DER encoding of the SubjectPublicKeyInfo of the generated key and |
+ // |error_message| will be empty. If it failed, |public_key_spki_der| will be |
+ // empty and |error_message| contain an error message. |
+ typedef base::Callback<void(const std::string& public_key_spki_der, |
+ const std::string& error_message)> |
+ GenerateKeyCallback; |
+ |
+ // Generates a RSA key pair with |modulus_length_bits| and registers the key |
+ // to allow a single sign operation by the given extension. |token_id| is |
+ // currently ignored, instead the user token associated with |browser_context| |
+ // is always used. |callback| will be invoked with the resulting public key or |
+ // an error. |
+ // Will only call back during the lifetime of this object. |
+ void GenerateRSAKey(const std::string& token_id, |
+ unsigned int modulus_length_bits, |
+ const std::string& extension_id, |
+ const GenerateKeyCallback& callback); |
+ |
+ // If signing was successful, |signature| will be contain the signature and |
+ // |error_message| will be empty. If it failed, |signature| will be empty and |
+ // |error_message| contain an error message. |
+ typedef base::Callback<void(const std::string& signature, |
+ const std::string& error_message)> SignCallback; |
+ |
+ // Signs |data| with the private key matching |public_key_spki_der|, if that |
+ // key is stored in the given token and wasn't used for signing before. |
+ // Unregisters the key so that every future attempt to sign data with this key |
+ // is rejected. |token_id| is currently ignored, instead the user token |
+ // associated with |browser_context| is always used. |public_key_spki_der| |
+ // must be the DER encoding of a SubjectPublicKeyInfo. |callback| will be |
+ // invoked with the signature or an error message. Currently supports RSA keys |
+ // only. |
+ // Will only call back during the lifetime of this object. |
+ void Sign(const std::string& token_id, |
+ const std::string& public_key_spki_der, |
+ const std::string& data, |
+ const std::string& extension_id, |
+ const SignCallback& callback); |
+ |
+ private: |
+ typedef base::Callback<void(scoped_ptr<base::ListValue> platform_keys)> |
+ GetPlatformKeysCallback; |
+ |
+ // Registers the given public key as newly generated key, which is allowed to |
+ // be used for signing for a single time. Afterwards, calls |callback|. If |
+ // registration was successful, passes |true| otherwise |false| to the |
+ // callback. |
+ void RegisterPublicKey(const std::string& extension_id, |
+ const std::string& public_key_spki_der, |
+ const base::Callback<void(bool)>& callback); |
+ |
+ // Gets the current validity of the given public key by reading StateStore. |
+ // Invalidates the key if it was found to be valid. Finally, calls |callback| |
+ // with the old validity. |
+ void ReadValidityAndInvalidateKey(const std::string& extension_id, |
+ const std::string& public_key_spki_der, |
+ const base::Callback<void(bool)>& callback); |
+ |
+ // Reads the list of public keys currently registered for |extension_id| from |
+ // StateStore. Calls |callback| with the read list, or a new empty list if |
+ // none existed. If an error occurred, calls |callback| with NULL. |
+ void GetPlatformKeysOfExtension(const std::string& extension_id, |
+ const GetPlatformKeysCallback& callback); |
+ |
+ // Callback used by |GenerateRSAKey|. |
+ // If the key generation was successful, registers the generated public key |
+ // for the given extension. If any error occurs during key generation or |
+ // registration, calls |callback| with an error. Otherwise, on success, calls |
+ // |callback| with the public key. |
+ void GenerateRSAKeyCallback(const std::string& extension_id, |
+ const GenerateKeyCallback& callback, |
+ const std::string& public_key_spki_der, |
+ const std::string& error_message); |
+ |
+ // Callback used by |RegisterPublicKey|. |
+ // Updates the old |platform_keys| read from the StateStore and writes the |
+ // updated value back to the StateStore. |
+ void RegisterPublicKeyGotPlatformKeys( |
+ const std::string& extension_id, |
+ const std::string& public_key_spki_der, |
+ const base::Callback<void(bool)>& callback, |
+ scoped_ptr<base::ListValue> platform_keys); |
+ |
+ // Callback used by |ReadValidityAndInvalidateKey|. |
+ // Invalidates the given public key so that future signing is prohibited and |
+ // calls |callback| with the old validity. |
+ void InvalidateKey(const std::string& extension_id, |
+ const std::string& public_key_spki_der, |
+ const base::Callback<void(bool)>& callback, |
+ scoped_ptr<base::ListValue> platform_keys); |
+ |
+ // Callback used by |GetPlatformKeysOfExtension|. |
+ // Is called with |value| set to the PlatformKeys value read from the |
+ // StateStore, which it forwards to |callback|. On error, calls |callback| |
+ // with NULL; if no value existed, with an empty list. |
+ void GotPlatformKeysOfExtension(const std::string& extension_id, |
+ const GetPlatformKeysCallback& callback, |
+ scoped_ptr<base::Value> value); |
+ |
+ content::BrowserContext* browser_context_; |
+ extensions::StateStore* state_store_; |
+ base::WeakPtrFactory<PlatformKeysService> weak_factory_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(PlatformKeysService); |
+}; |
+ |
+} // namespace chromeos |
+ |
+#endif // CHROME_BROWSER_CHROMEOS_PLATFORM_KEYS_PLATFORM_KEYS_SERVICE_H_ |