OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef CHROME_BROWSER_CHROMEOS_PLATFORM_KEYS_PLATFORM_KEYS_SERVICE_H_ | 5 #ifndef CHROME_BROWSER_CHROMEOS_PLATFORM_KEYS_PLATFORM_KEYS_SERVICE_H_ |
6 #define CHROME_BROWSER_CHROMEOS_PLATFORM_KEYS_PLATFORM_KEYS_SERVICE_H_ | 6 #define CHROME_BROWSER_CHROMEOS_PLATFORM_KEYS_PLATFORM_KEYS_SERVICE_H_ |
7 | 7 |
8 #include <queue> | 8 #include <queue> |
9 #include <string> | 9 #include <string> |
10 #include <vector> | 10 #include <vector> |
(...skipping 21 matching lines...) Expand all Loading... | |
32 | 32 |
33 namespace net { | 33 namespace net { |
34 class X509Certificate; | 34 class X509Certificate; |
35 typedef std::vector<scoped_refptr<X509Certificate>> CertificateList; | 35 typedef std::vector<scoped_refptr<X509Certificate>> CertificateList; |
36 } | 36 } |
37 | 37 |
38 namespace chromeos { | 38 namespace chromeos { |
39 | 39 |
40 class PlatformKeysService : public KeyedService { | 40 class PlatformKeysService : public KeyedService { |
41 public: | 41 public: |
42 struct KeyEntry; | |
43 using KeyEntries = std::vector<KeyEntry>; | |
44 | |
45 class SelectDelegate { | |
Andrew T Wilson (Slow)
2015/02/18 19:53:35
Would be nice if we had some class-level documenta
pneubeck (no reviews)
2015/02/19 11:08:40
Done.
| |
46 public: | |
47 // TODO(pneubeck): Handle if the selection was aborted, e.g. by the user. | |
48 using Callback = | |
Andrew T Wilson (Slow)
2015/02/18 19:53:35
nit: I'm not a huge fan of overloading names (Sele
pneubeck (no reviews)
2015/02/19 11:08:40
Done.
| |
49 base::Callback<void(scoped_refptr<net::X509Certificate> selection)>; | |
50 | |
51 SelectDelegate(); | |
52 virtual ~SelectDelegate(); | |
53 | |
54 // Called on an interactive SelectClientCertificates call with the list of | |
55 // matching certificates, |certs|. Must eventually call |callback| or be | |
56 // destructed. |callback| will not be called after this delegate is | |
Andrew T Wilson (Slow)
2015/02/18 19:53:35
What do you mean |callback| will not be called aft
pneubeck (no reviews)
2015/02/19 11:08:40
Yes, that's the point. This is part of the contrac
Andrew T Wilson (Slow)
2015/02/19 11:16:44
OK, then you should word this prescriptively, not
| |
57 // destructed. | |
58 // The certificate passed to |callback| will be forwarded to the | |
59 // calling extension and the extension will get unlimited sign permission | |
60 // for this cert. By passing null to |callback|, no cert will be selected. | |
61 virtual void Select(const std::string& extension_id, | |
62 const net::CertificateList& certs, | |
63 const Callback& callback) = 0; | |
64 | |
65 private: | |
Andrew T Wilson (Slow)
2015/02/18 19:53:35
This class has no data members - why are you restr
pneubeck (no reviews)
2015/02/19 11:08:40
the assignment operator is not virtual. calling it
| |
66 DISALLOW_ASSIGN(SelectDelegate); | |
67 }; | |
68 | |
42 // Stores registration information in |state_store|, i.e. for each extension | 69 // Stores registration information in |state_store|, i.e. for each extension |
43 // the list of public keys that are valid to be used for signing. Each key can | 70 // the list of public keys that are valid to be used for signing. Each key can |
44 // be used for signing at most once. | 71 // be used for signing at most once. |
45 // The format written to |state_store| is: | 72 // The format written to |state_store| is: |
46 // kStateStorePlatformKeys maps to a list of strings. | 73 // kStateStorePlatformKeys maps to a list of strings. |
47 // Each string is the base64 encoding of the DER representation of a public | 74 // Each string is the base64 encoding of the DER representation of a public |
48 // key's SPKI. | 75 // key's SPKI. |
49 explicit PlatformKeysService(content::BrowserContext* browser_context, | 76 explicit PlatformKeysService(content::BrowserContext* browser_context, |
50 extensions::StateStore* state_store); | 77 extensions::StateStore* state_store); |
51 ~PlatformKeysService() override; | 78 ~PlatformKeysService() override; |
52 | 79 |
53 // Disables the checks whether an extension is allowed to read client | 80 // Sets the delegate which will be used for interactive |
54 // certificates or allowed to use the signing function of a key. | 81 // SelectClientCertificates calls. |
55 // TODO(pneubeck): Remove this once a permissions are implemented. | 82 void SetSelectDelegate(scoped_ptr<SelectDelegate> delegate); |
56 void DisablePermissionCheckForTesting(); | 83 |
84 // Grants unlimited sign permission for |cert| to the extension with the ID | |
85 // |extension_id|. | |
86 void GrantUnlimitedSignPermission(const std::string& extension_id, | |
87 scoped_refptr<net::X509Certificate> cert); | |
57 | 88 |
58 // If the generation was successful, |public_key_spki_der| will contain the | 89 // If the generation was successful, |public_key_spki_der| will contain the |
59 // DER encoding of the SubjectPublicKeyInfo of the generated key and | 90 // DER encoding of the SubjectPublicKeyInfo of the generated key and |
60 // |error_message| will be empty. If it failed, |public_key_spki_der| will be | 91 // |error_message| will be empty. If it failed, |public_key_spki_der| will be |
61 // empty and |error_message| contain an error message. | 92 // empty and |error_message| contain an error message. |
62 typedef base::Callback<void(const std::string& public_key_spki_der, | 93 using GenerateKeyCallback = |
63 const std::string& error_message)> | 94 base::Callback<void(const std::string& public_key_spki_der, |
64 GenerateKeyCallback; | 95 const std::string& error_message)>; |
65 | 96 |
66 // Generates an RSA key pair with |modulus_length_bits| and registers the key | 97 // Generates an RSA key pair with |modulus_length_bits| and registers the key |
67 // to allow a single sign operation by the given extension. |token_id| is | 98 // to allow a single sign operation by the given extension. |token_id| is |
68 // currently ignored, instead the user token associated with |browser_context| | 99 // currently ignored, instead the user token associated with |browser_context| |
69 // is always used. |callback| will be invoked with the resulting public key or | 100 // is always used. |callback| will be invoked with the resulting public key or |
70 // an error. | 101 // an error. |
71 // Will only call back during the lifetime of this object. | 102 // Will only call back during the lifetime of this object. |
72 void GenerateRSAKey(const std::string& token_id, | 103 void GenerateRSAKey(const std::string& token_id, |
73 unsigned int modulus_length_bits, | 104 unsigned int modulus_length_bits, |
74 const std::string& extension_id, | 105 const std::string& extension_id, |
75 const GenerateKeyCallback& callback); | 106 const GenerateKeyCallback& callback); |
76 | 107 |
77 // If signing was successful, |signature| will be contain the signature and | 108 // If signing was successful, |signature| will be contain the signature and |
78 // |error_message| will be empty. If it failed, |signature| will be empty and | 109 // |error_message| will be empty. If it failed, |signature| will be empty and |
79 // |error_message| contain an error message. | 110 // |error_message| contain an error message. |
80 typedef base::Callback<void(const std::string& signature, | 111 using SignCallback = base::Callback<void(const std::string& signature, |
81 const std::string& error_message)> SignCallback; | 112 const std::string& error_message)>; |
82 | 113 |
83 // Digests |data|, applies PKCS1 padding and afterwards signs the data with | 114 // Digests |data|, applies PKCS1 padding and afterwards signs the data with |
84 // the private key matching |params.public_key|. If a non empty token id is | 115 // the private key matching |params.public_key|. If a non empty token id is |
85 // provided and the key is not found in that token, the operation aborts. | 116 // provided and the key is not found in that token, the operation aborts. |
86 // If the extension does not have permissions for signing with this key, the | 117 // If the extension does not have permissions for signing with this key, the |
87 // operation aborts. In case of a one time permission (granted after | 118 // operation aborts. In case of a one time permission (granted after |
88 // generating the key), this function also removes the permission to prevent | 119 // generating the key), this function also removes the permission to prevent |
89 // future signing attempts. | 120 // future signing attempts. |
90 // |callback| will be invoked with the signature or an error message. | 121 // |callback| will be invoked with the signature or an error message. |
91 // Will only call back during the lifetime of this object. | 122 // Will only call back during the lifetime of this object. |
(...skipping 19 matching lines...) Expand all Loading... | |
111 void SignRSAPKCS1Raw(const std::string& token_id, | 142 void SignRSAPKCS1Raw(const std::string& token_id, |
112 const std::string& data, | 143 const std::string& data, |
113 const std::string& public_key, | 144 const std::string& public_key, |
114 const std::string& extension_id, | 145 const std::string& extension_id, |
115 const SignCallback& callback); | 146 const SignCallback& callback); |
116 | 147 |
117 // If the certificate request could be processed successfully, |matches| will | 148 // If the certificate request could be processed successfully, |matches| will |
118 // contain the list of matching certificates (maybe empty) and |error_message| | 149 // contain the list of matching certificates (maybe empty) and |error_message| |
119 // will be empty. If an error occurred, |matches| will be null and | 150 // will be empty. If an error occurred, |matches| will be null and |
120 // |error_message| contain an error message. | 151 // |error_message| contain an error message. |
121 typedef base::Callback<void(scoped_ptr<net::CertificateList> matches, | 152 using SelectCertificatesCallback = |
122 const std::string& error_message)> | 153 base::Callback<void(scoped_ptr<net::CertificateList> matches, |
123 SelectCertificatesCallback; | 154 const std::string& error_message)>; |
124 | 155 |
125 // Returns the list of all certificates that match |request|. |callback| will | 156 // Returns the list of all certificates that match |request|. If |interactive| |
126 // be invoked with these matches or an error message. | 157 // is true will select from these matches using the currently set |
158 // SelectDelegate. Afterwards filters only the certificates that the extension | |
Andrew T Wilson (Slow)
2015/02/18 19:53:35
I couldn't quite understand what "Afterwards filte
pneubeck (no reviews)
2015/02/19 11:08:40
I made a bit more verbose.
| |
159 // has unlimited sign permission for. |callback| will be invoked with these | |
160 // certificates or an error message. | |
127 // Will only call back during the lifetime of this object. | 161 // Will only call back during the lifetime of this object. |
128 // TODO(pneubeck): Add the interactive option and integrate the select | |
129 // certificate dialog. | |
130 void SelectClientCertificates( | 162 void SelectClientCertificates( |
131 const platform_keys::ClientCertificateRequest& request, | 163 const platform_keys::ClientCertificateRequest& request, |
164 bool interactive, | |
132 const std::string& extension_id, | 165 const std::string& extension_id, |
133 const SelectCertificatesCallback& callback); | 166 const SelectCertificatesCallback& callback); |
134 | 167 |
135 private: | 168 private: |
136 using GetPlatformKeysCallback = | 169 using GetPlatformKeysCallback = |
137 base::Callback<void(scoped_ptr<base::ListValue> platform_keys)>; | 170 base::Callback<void(scoped_ptr<KeyEntries> platform_keys)>; |
171 | |
172 enum SignPermission { ONCE, UNLIMITED }; | |
138 | 173 |
139 class Task; | 174 class Task; |
175 class SelectTask; | |
Andrew T Wilson (Slow)
2015/02/18 19:53:35
Should these classes be ordered somehow?
pneubeck (no reviews)
2015/02/19 11:08:40
Done.
| |
140 class SignTask; | 176 class SignTask; |
141 class PermissionUpdateTask; | 177 class PermissionUpdateTask; |
142 | 178 |
143 // Starts |task| eventually. To ensure that at most one |Task| is running at a | 179 // Starts |task| eventually. To ensure that at most one |Task| is running at a |
144 // time, it queues |task| for later execution if necessary. | 180 // time, it queues |task| for later execution if necessary. |
145 void StartOrQueueTask(scoped_ptr<Task> task); | 181 void StartOrQueueTask(scoped_ptr<Task> task); |
146 | 182 |
147 // Must be called after |task| is done. |task| will be invalid after this | 183 // Must be called after |task| is done. |task| will be invalid after this |
148 // call. This must not be called for any but the task that ran last. If any | 184 // call. This must not be called for any but the task that ran last. If any |
149 // other tasks are queued (see StartOrQueueTask()), it will start the next | 185 // other tasks are queued (see StartOrQueueTask()), it will start the next |
150 // one. | 186 // one. |
151 void TaskFinished(Task* task); | 187 void TaskFinished(Task* task); |
152 | 188 |
153 // Reads the list of public keys currently registered for |extension_id| from | 189 // Reads the list of public keys currently registered for |extension_id| from |
154 // StateStore. Calls |callback| with the read list, or a new empty list if | 190 // StateStore. Calls |callback| with the read list, or a new empty list if |
155 // none existed. If an error occurred, calls |callback| with NULL. | 191 // none existed. If an error occurred, calls |callback| with NULL. |
156 void GetPlatformKeysOfExtension(const std::string& extension_id, | 192 void GetPlatformKeysOfExtension(const std::string& extension_id, |
157 const GetPlatformKeysCallback& callback); | 193 const GetPlatformKeysCallback& callback); |
158 | 194 |
159 // Writes |platform_keys| to the state store of the extension with id | 195 // Writes |platform_keys| to the state store of the extension with id |
160 // |extension_id|. | 196 // |extension_id|. |
161 void SetPlatformKeysOfExtension(const std::string& extension_id, | 197 void SetPlatformKeysOfExtension(const std::string& extension_id, |
162 scoped_ptr<base::ListValue> platform_keys); | 198 const KeyEntries& platform_keys); |
163 | 199 |
164 // Callback used by |GenerateRSAKey|. | 200 // Callback used by |GenerateRSAKey|. |
165 // If the key generation was successful, registers the generated public key | 201 // If the key generation was successful, registers the generated public key |
166 // for the given extension. If any error occurs during key generation or | 202 // for the given extension. If any error occurs during key generation or |
167 // registration, calls |callback| with an error. Otherwise, on success, calls | 203 // registration, calls |callback| with an error. Otherwise, on success, calls |
168 // |callback| with the public key. | 204 // |callback| with the public key. |
169 void GeneratedKey(const std::string& extension_id, | 205 void GeneratedKey(const std::string& extension_id, |
170 const GenerateKeyCallback& callback, | 206 const GenerateKeyCallback& callback, |
171 const std::string& public_key_spki_der, | 207 const std::string& public_key_spki_der, |
172 const std::string& error_message); | 208 const std::string& error_message); |
173 | 209 |
174 // Callback used by |GeneratedKey|. | 210 // Callback used by |GeneratedKey|. |
175 // |public_key_spki_der| will contain the X.509 Subject Public Key Info of | 211 // |public_key_spki_der| will contain the X.509 Subject Public Key Info of |
176 // the generated key in DER encoding. |task| points to the finished |Task| | 212 // the generated key in DER encoding. |task| points to the finished |Task| |
177 // object. | 213 // object. |
178 void RegisteredGeneratedKey(const GenerateKeyCallback& callback, | 214 void RegisteredGeneratedKey(const GenerateKeyCallback& callback, |
179 const std::string& public_key_spki_der, | 215 const std::string& public_key_spki_der, |
180 Task* task); | 216 Task* task); |
181 | 217 |
182 // Calback used by |SelectClientCertificates|. | |
183 // If the certificate request could be processed successfully, |matches| will | |
184 // contain the list of matching certificates (maybe empty) and |error_message| | |
185 // will be empty. If an error occurred, |matches| will be null and | |
186 // |error_message| contain an error message. | |
187 void SelectClientCertificatesCallback( | |
188 const std::string& extension_id, | |
189 const SelectCertificatesCallback& callback, | |
190 scoped_ptr<net::CertificateList> matches, | |
191 const std::string& error_message); | |
192 | |
193 // Callback used by |GetPlatformKeysOfExtension|. | 218 // Callback used by |GetPlatformKeysOfExtension|. |
194 // Is called with |value| set to the PlatformKeys value read from the | 219 // Is called with |value| set to the PlatformKeys value read from the |
195 // StateStore, which it forwards to |callback|. On error, calls |callback| | 220 // StateStore, which it forwards to |callback|. On error, calls |callback| |
196 // with NULL; if no value existed, with an empty list. | 221 // with NULL; if no value existed, with an empty list. |
197 void GotPlatformKeysOfExtension(const std::string& extension_id, | 222 void GotPlatformKeysOfExtension(const std::string& extension_id, |
198 const GetPlatformKeysCallback& callback, | 223 const GetPlatformKeysCallback& callback, |
199 scoped_ptr<base::Value> value); | 224 scoped_ptr<base::Value> value); |
200 | 225 |
201 content::BrowserContext* browser_context_; | 226 content::BrowserContext* browser_context_; |
202 extensions::StateStore* state_store_; | 227 extensions::StateStore* state_store_; |
203 bool permission_check_enabled_ = true; | 228 scoped_ptr<SelectDelegate> select_delegate_; |
204 std::queue<linked_ptr<Task>> tasks_; | 229 std::queue<linked_ptr<Task>> tasks_; |
205 base::WeakPtrFactory<PlatformKeysService> weak_factory_; | 230 base::WeakPtrFactory<PlatformKeysService> weak_factory_; |
206 | 231 |
207 DISALLOW_COPY_AND_ASSIGN(PlatformKeysService); | 232 DISALLOW_COPY_AND_ASSIGN(PlatformKeysService); |
208 }; | 233 }; |
209 | 234 |
210 } // namespace chromeos | 235 } // namespace chromeos |
211 | 236 |
212 #endif // CHROME_BROWSER_CHROMEOS_PLATFORM_KEYS_PLATFORM_KEYS_SERVICE_H_ | 237 #endif // CHROME_BROWSER_CHROMEOS_PLATFORM_KEYS_PLATFORM_KEYS_SERVICE_H_ |
OLD | NEW |