| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium OS 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 #include <dlfcn.h> | 5 #include <dlfcn.h> |
| 6 #include <glib-object.h> | 6 #include <glib-object.h> |
| 7 #include <stdlib.h> | 7 #include <stdlib.h> |
| 8 | 8 |
| 9 #include <iostream> // NOLINT | 9 #include <iostream> // NOLINT |
| 10 #include <vector> | 10 #include <vector> |
| 11 | 11 |
| 12 #include <base/at_exit.h> | 12 #include <base/at_exit.h> |
| 13 #include <base/crypto/rsa_private_key.h> | 13 #include <base/crypto/rsa_private_key.h> |
| 14 #include <base/crypto/signature_creator.h> | 14 #include <base/crypto/signature_creator.h> |
| 15 #include <base/crypto/signature_verifier.h> | 15 #include <base/crypto/signature_verifier.h> |
| 16 #include <base/command_line.h> | 16 #include <base/command_line.h> |
| 17 #include <base/logging.h> | 17 #include <base/logging.h> |
| 18 #include <base/file_path.h> | 18 #include <base/file_path.h> |
| 19 #include <base/file_util.h> | 19 #include <base/file_util.h> |
| 20 #include <base/nss_util.h> | 20 #include <base/nss_util.h> |
| 21 #include <base/scoped_temp_dir.h> | 21 #include <base/scoped_temp_dir.h> |
| 22 #include <base/string_util.h> |
| 22 #include <base/stringprintf.h> | 23 #include <base/stringprintf.h> |
| 23 | 24 |
| 24 #include "chromeos_cros_api.h" // NOLINT | 25 #include "chromeos_cros_api.h" // NOLINT |
| 25 #include "chromeos_login.h" | 26 #include "chromeos_login.h" |
| 26 #include "monitor_utils.h" //NOLINT | 27 #include "monitor_utils.h" //NOLINT |
| 27 | 28 |
| 28 namespace { | 29 namespace { |
| 29 static const char kEmit[] = "emit-login-prompt-ready"; | 30 static const char kEmit[] = "emit-login-prompt-ready"; |
| 30 static const char kStartSession[] = "start-session"; | 31 static const char kStartSession[] = "start-session"; |
| 31 static const char kStopSession[] = "stop-session"; | 32 static const char kStopSession[] = "stop-session"; |
| 32 static const char kSetOwnerKey[] = "set-owner-key"; | 33 static const char kSetOwnerKey[] = "set-owner-key"; |
| 33 static const char kWhitelist[] = "whitelist"; | 34 static const char kWhitelist[] = "whitelist"; |
| 34 static const char kUnwhitelist[] = "unwhitelist"; | 35 static const char kUnwhitelist[] = "unwhitelist"; |
| 35 static const char kCheckWhitelist[] = "check-whitelist"; | 36 static const char kCheckWhitelist[] = "check-whitelist"; |
| 36 static const char kEnumerate[] = "enumerate-whitelisted"; | 37 static const char kEnumerate[] = "enumerate-whitelisted"; |
| 38 static const char kStoreProperty[] = "store-property"; |
| 39 static const char kRetrieveProperty[] = "retrieve-property"; |
| 37 | 40 |
| 38 class ClientLoop { | 41 class ClientLoop { |
| 39 public: | 42 public: |
| 40 ClientLoop() | 43 ClientLoop() |
| 41 : loop_(NULL), | 44 : loop_(NULL), |
| 42 connection_(NULL) { } | 45 connection_(NULL) { } |
| 43 | 46 |
| 44 virtual ~ClientLoop() { | 47 virtual ~ClientLoop() { |
| 45 if (connection_) { | 48 if (connection_) { |
| 46 chromeos::DisconnectSession(connection_); | 49 chromeos::DisconnectSession(connection_); |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 202 LOG(FATAL) << "Starting session failed."; | 205 LOG(FATAL) << "Starting session failed."; |
| 203 } | 206 } |
| 204 | 207 |
| 205 // Really have to do this after clearing owner key, starting BWSI session. | 208 // Really have to do this after clearing owner key, starting BWSI session. |
| 206 // Note that Chrome will get the signal that this has been done and CHECK. | 209 // Note that Chrome will get the signal that this has been done and CHECK. |
| 207 if (cl->HasSwitch(kSetOwnerKey)) { | 210 if (cl->HasSwitch(kSetOwnerKey)) { |
| 208 std::vector<uint8> pubkey; | 211 std::vector<uint8> pubkey; |
| 209 if (!GenerateOwnerKey(&pubkey)) | 212 if (!GenerateOwnerKey(&pubkey)) |
| 210 LOG(FATAL) << "Couldn't generate fakey owner key"; | 213 LOG(FATAL) << "Couldn't generate fakey owner key"; |
| 211 | 214 |
| 215 chromeos::CryptoBlob* blob = chromeos::CreateCryptoBlob(&pubkey[0], |
| 216 pubkey.size()); |
| 217 |
| 212 ClientLoop client_loop; | 218 ClientLoop client_loop; |
| 213 client_loop.Initialize(); | 219 client_loop.Initialize(); |
| 214 | 220 |
| 215 if (!chromeos::SetOwnerKey(pubkey)) { | 221 if (!chromeos::SetOwnerKeySafe(blob)) { |
| 216 LOG(FATAL) << "Could not send SetOwnerKey?"; | 222 LOG(FATAL) << "Could not send SetOwnerKey?"; |
| 217 } | 223 } |
| 218 client_loop.Run(); | 224 client_loop.Run(); |
| 219 LOG(INFO) << (client_loop.what_happened() == chromeos::SetKeySuccess ? | 225 LOG(INFO) << (client_loop.what_happened() == chromeos::SetKeySuccess ? |
| 220 "Successfully set owner key" : "Didn't set owner key"); | 226 "Successfully set owner key" : "Didn't set owner key"); |
| 221 exit(0); | 227 chromeos::FreeCryptoBlob(blob); |
| 222 } | 228 } |
| 223 if (cl->HasSwitch(kWhitelist)) { | 229 if (cl->HasSwitch(kWhitelist)) { |
| 224 scoped_ptr<base::RSAPrivateKey> private_key( | 230 scoped_ptr<base::RSAPrivateKey> private_key( |
| 225 GetPrivateKey(FilePath(chromeos::kOwnerKeyFile))); | 231 GetPrivateKey(FilePath(chromeos::kOwnerKeyFile))); |
| 226 | 232 |
| 227 std::string name = cl->GetSwitchValueASCII(kWhitelist); | 233 std::string name = cl->GetSwitchValueASCII(kWhitelist); |
| 228 std::vector<uint8> sig; | 234 std::vector<uint8> sig; |
| 229 if (!Sign(name, private_key.get(), &sig)) | 235 if (!Sign(name, private_key.get(), &sig)) |
| 230 LOG(FATAL) << "Can't sign " << name; | 236 LOG(FATAL) << "Can't sign " << name; |
| 231 else | 237 else |
| 232 LOG(INFO) << "Signature is " << sig.size(); | 238 LOG(INFO) << "Signature is " << sig.size(); |
| 233 | 239 |
| 234 ClientLoop client_loop; | 240 ClientLoop client_loop; |
| 235 client_loop.Initialize(); | 241 client_loop.Initialize(); |
| 236 | 242 |
| 237 if (!chromeos::Whitelist(name.c_str(), sig)) | 243 chromeos::CryptoBlob* blob = chromeos::CreateCryptoBlob(&sig[0], |
| 244 sig.size()); |
| 245 |
| 246 if (!chromeos::WhitelistSafe(name.c_str(), blob)) |
| 238 LOG(FATAL) << "Could not send SetOwnerKey?"; | 247 LOG(FATAL) << "Could not send SetOwnerKey?"; |
| 239 | 248 |
| 240 client_loop.Run(); | 249 client_loop.Run(); |
| 241 LOG(INFO) << (client_loop.what_happened() == chromeos::WhitelistOpSuccess ? | 250 LOG(INFO) << (client_loop.what_happened() == chromeos::WhitelistOpSuccess ? |
| 242 "Whitelisted " : "Failed to whitelist ") << name; | 251 "Whitelisted " : "Failed to whitelist ") << name; |
| 243 exit(0); | 252 chromeos::FreeCryptoBlob(blob); |
| 244 } | 253 } |
| 245 if (cl->HasSwitch(kUnwhitelist)) { | 254 if (cl->HasSwitch(kUnwhitelist)) { |
| 246 scoped_ptr<base::RSAPrivateKey> private_key( | 255 scoped_ptr<base::RSAPrivateKey> private_key( |
| 247 GetPrivateKey(FilePath(chromeos::kOwnerKeyFile))); | 256 GetPrivateKey(FilePath(chromeos::kOwnerKeyFile))); |
| 248 | 257 |
| 249 std::string name = cl->GetSwitchValueASCII(kUnwhitelist); | 258 std::string name = cl->GetSwitchValueASCII(kUnwhitelist); |
| 250 std::vector<uint8> sig; | 259 std::vector<uint8> sig; |
| 251 if (!Sign(name, private_key.get(), &sig)) | 260 if (!Sign(name, private_key.get(), &sig)) |
| 252 LOG(FATAL) << "Can't sign " << name; | 261 LOG(FATAL) << "Can't sign " << name; |
| 253 | 262 |
| 254 ClientLoop client_loop; | 263 ClientLoop client_loop; |
| 255 client_loop.Initialize(); | 264 client_loop.Initialize(); |
| 256 | 265 |
| 257 if (!chromeos::Unwhitelist(name.c_str(), sig)) | 266 chromeos::CryptoBlob* blob = chromeos::CreateCryptoBlob(&sig[0], |
| 258 LOG(FATAL) << "Could not send SetOwnerKey?"; | 267 sig.size()); |
| 268 |
| 269 if (!chromeos::UnwhitelistSafe(name.c_str(), blob)) |
| 270 LOG(FATAL) << "Could not send UnwhitelistSafe?"; |
| 259 | 271 |
| 260 client_loop.Run(); | 272 client_loop.Run(); |
| 261 LOG(INFO) << (client_loop.what_happened() == chromeos::WhitelistOpSuccess ? | 273 LOG(INFO) << (client_loop.what_happened() == chromeos::WhitelistOpSuccess ? |
| 262 "Whitelisted " : "Failed to whitelist ") << name; | 274 "Whitelisted " : "Failed to whitelist ") << name; |
| 263 exit(0); | 275 chromeos::FreeCryptoBlob(blob); |
| 264 } | 276 } |
| 265 if (cl->HasSwitch(kEnumerate)) { | 277 if (cl->HasSwitch(kEnumerate)) { |
| 266 std::vector<std::string> whitelisted; | 278 chromeos::UserList* whitelisted = NULL; |
| 267 if (!chromeos::EnumerateWhitelisted(&whitelisted)) { | 279 if (!chromeos::EnumerateWhitelistedSafe(&whitelisted)) { |
| 268 LOG(FATAL) << "Could not enumerate the whitelisted"; | 280 LOG(FATAL) << "Could not enumerate the whitelisted"; |
| 269 } | 281 } |
| 270 std::vector<std::string>::iterator it; | |
| 271 | 282 |
| 272 for (it = whitelisted.begin(); it < whitelisted.end(); ++it) | 283 for (int i = 0; i < whitelisted->num_users; i++) |
| 273 LOG(INFO) << *it << " is whitelisted"; | 284 LOG(INFO) << whitelisted->users[i] << " is whitelisted"; |
| 274 | 285 |
| 275 exit(0); | 286 chromeos::FreeUserList(whitelisted); |
| 276 } | 287 } |
| 277 if (cl->HasSwitch(kCheckWhitelist)) { | 288 if (cl->HasSwitch(kCheckWhitelist)) { |
| 278 std::string name = cl->GetSwitchValueASCII(kCheckWhitelist); | 289 std::string name = cl->GetSwitchValueASCII(kCheckWhitelist); |
| 290 chromeos::CryptoBlob* sig; |
| 291 |
| 292 if (!chromeos::CheckWhitelistSafe(name.c_str(), &sig)) |
| 293 LOG(WARNING) << name << " not on whitelist."; |
| 294 else { |
| 295 LOG(INFO) << name << " is on the whitelist."; |
| 296 chromeos::FreeCryptoBlob(sig); |
| 297 } |
| 298 } |
| 299 if (cl->HasSwitch(kStoreProperty)) { |
| 300 scoped_ptr<base::RSAPrivateKey> private_key( |
| 301 GetPrivateKey(FilePath(chromeos::kOwnerKeyFile))); |
| 302 |
| 303 std::string keyval = cl->GetSwitchValueASCII(kStoreProperty); |
| 279 std::vector<uint8> sig; | 304 std::vector<uint8> sig; |
| 305 if (!Sign(keyval, private_key.get(), &sig)) |
| 306 LOG(FATAL) << "Can't sign " << keyval; |
| 307 else |
| 308 LOG(INFO) << "Signature is " << sig.size(); |
| 280 | 309 |
| 281 if (!chromeos::CheckWhitelist(name.c_str(), &sig)) | 310 ClientLoop client_loop; |
| 282 LOG(WARNING) << name << " not on whitelist."; | 311 client_loop.Initialize(); |
| 283 else | |
| 284 LOG(INFO) << name << " is on the whitelist."; | |
| 285 | 312 |
| 286 exit(0); | 313 std::vector<std::string> pair; |
| 314 SplitString(keyval, '=', &pair); |
| 315 chromeos::Property* prop = chromeos::CreateProperty(pair[0].c_str(), |
| 316 pair[1].c_str(), |
| 317 &sig[0], |
| 318 sig.size()); |
| 319 if (!chromeos::StorePropertySafe(prop)) |
| 320 LOG(FATAL) << "Could not send StorePropertySafe?"; |
| 321 |
| 322 client_loop.Run(); |
| 323 LOG(INFO) << (client_loop.what_happened() == chromeos::PropertyOpSuccess ? |
| 324 "Stored " : "Failed to store ") << keyval; |
| 325 chromeos::FreeProperty(prop); |
| 326 } |
| 327 if (cl->HasSwitch(kRetrieveProperty)) { |
| 328 std::string name = cl->GetSwitchValueASCII(kRetrieveProperty); |
| 329 chromeos::Property* prop; |
| 330 |
| 331 if (!chromeos::RetrievePropertySafe(name.c_str(), &prop)) |
| 332 LOG(WARNING) << name << " not stored."; |
| 333 else { |
| 334 LOG(INFO) << prop->name << "=" << prop->value; |
| 335 chromeos::FreeProperty(prop); |
| 336 } |
| 287 } | 337 } |
| 288 | 338 |
| 289 return 0; | 339 return 0; |
| 290 } | 340 } |
| OLD | NEW |