1 // Copyright 2013 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_UI_CRYPTO_MODULE_DELEGATE_NSS_H_ 6 #define CHROME_BROWSER_UI_CRYPTO_MODULE_DELEGATE_NSS_H_ 7 8 #include <string> 9 10 #include "base/compiler_specific.h" 11 #include "base/synchronization/waitable_event.h" 12 #include "chrome/browser/ui/crypto_module_password_dialog.h" 13 #include "crypto/nss_crypto_module_delegate.h" 14 #include "net/base/host_port_pair.h" 15 16 namespace content { 17 class ResourceContext; 18 } 19 20 // Delegate to handle unlocking a slot or indicating which slot to store a key 21 // in. When passing to NSS functions which take a wincx argument, use the value 22 // returned from the wincx() method. 23 class ChromeNSSCryptoModuleDelegate 24 : public crypto::NSSCryptoModuleDelegate { 25 public: 26 // Create a ChromeNSSCryptoModuleDelegate. |reason| is used to select what 27 // string to show the user, |server| is displayed to indicate which connection 28 // is causing the dialog to appear. 29 ChromeNSSCryptoModuleDelegate(chrome::CryptoModulePasswordReason reason, 30 const net::HostPortPair& server); 31 32 virtual ~ChromeNSSCryptoModuleDelegate(); 33 34 // Must be called on IO thread. Returns true if the delegate is ready for use. 35 // Otherwise, if |initialization_complete_callback| is non-null, the 36 // initialization will proceed asynchronously and the callback will be run 37 // once the delegate is ready to use. In that case, the caller must ensure the 38 // delegate remains alive until the callback is run. 39 bool InitializeSlot(content::ResourceContext* context, 40 const base::Closure& initialization_complete_callback) 41 WARN_UNUSED_RESULT; 42 43 // crypto::NSSCryptoModuleDelegate implementation. 44 virtual crypto::ScopedPK11Slot RequestSlot() OVERRIDE; 45 46 // crypto::CryptoModuleBlockingPasswordDelegate implementation. 47 virtual std::string RequestPassword(const std::string& slot_name, 48 bool retry, 49 bool* cancelled) OVERRIDE; 50 51 private: 52 void ShowDialog(const std::string& slot_name, bool retry); 53 54 void GotPassword(const std::string& password); 55 56 void DidGetSlot(const base::Closure& callback, crypto::ScopedPK11Slot slot); 57 58 // Parameters displayed in the dialog. 59 const chrome::CryptoModulePasswordReason reason_; 60 net::HostPortPair server_; 61 62 // Event to block worker thread while waiting for dialog on UI thread. 63 base::WaitableEvent event_; 64 65 // Stores the results from the dialog for access on worker thread. 66 std::string password_; 67 bool cancelled_; 68 69 // The slot which will be returned by RequestSlot. 70 crypto::ScopedPK11Slot slot_; 71 72 DISALLOW_COPY_AND_ASSIGN(ChromeNSSCryptoModuleDelegate); 73 }; 74 75 // Create a delegate which only handles unlocking slots. 76 crypto::CryptoModuleBlockingPasswordDelegate* 77 CreateCryptoModuleBlockingPasswordDelegate( 78 chrome::CryptoModulePasswordReason reason, 79 const net::HostPortPair& server); 80 81 #endif // CHROME_BROWSER_UI_CRYPTO_MODULE_DELEGATE_NSS_H_ 82