Index: crypto/nss_util.cc |
=================================================================== |
--- crypto/nss_util.cc (revision 99773) |
+++ crypto/nss_util.cc (working copy) |
@@ -31,6 +31,10 @@ |
#include "base/threading/thread_restrictions.h" |
#include "crypto/scoped_nss_types.h" |
+#if defined(OS_CHROMEOS) |
+#include "crypto/symmetric_key.h" |
+#endif |
+ |
// USE_NSS means we use NSS for everything crypto-related. If USE_NSS is not |
// defined, such as on Mac and Windows, we use NSS for SSL only -- we don't |
// use NSS for crypto or certificate verification, and we don't use the NSS |
@@ -83,6 +87,15 @@ |
return dir; |
} |
+#if defined(OS_CHROMEOS) |
+// Supplemental user key id. |
+unsigned char kSupplementalUserKeyId[] = { |
+ 0xCC, 0x13, 0x19, 0xDE, 0x75, 0x5E, 0xFE, 0xFA, |
+ 0x5E, 0x71, 0xD4, 0xA6, 0xFB, 0x00, 0x00, 0xCC |
+}; |
+#endif // defined(OS_CHROMEOS) |
+ |
+ |
// On non-chromeos platforms, return the default config directory. |
// On chromeos, return a read-only directory with fake root CA certs for testing |
// (which will not exist on non-testing images). These root CA certs are used |
@@ -288,6 +301,40 @@ |
return FindSlotWithTokenName(token_name); |
} |
+ SymmetricKey* GetSupplementalUserKey() { |
+ DCHECK(chromeos_user_logged_in_); |
+ |
+ PK11SlotInfo* slot = NULL; |
+ PK11SymKey* key = NULL; |
+ SECItem keyID; |
+ CK_MECHANISM_TYPE type = CKM_AES_ECB; |
+ |
+ slot = GetPublicNSSKeySlot(); |
+ if (!slot) |
+ goto done; |
+ |
+ if (PK11_Authenticate(slot, PR_TRUE, NULL) != SECSuccess) |
+ goto done; |
+ |
+ keyID.type = siBuffer; |
+ keyID.data = kSupplementalUserKeyId; |
+ keyID.len = static_cast<int>(sizeof(kSupplementalUserKeyId)); |
+ |
+ // Find/generate AES key. |
+ key = PK11_FindFixedKey(slot, type, &keyID, NULL); |
+ if (!key) { |
+ const int kKeySizeInBytes = 32; |
+ key = PK11_TokenKeyGen(slot, type, NULL, |
+ kKeySizeInBytes, |
+ &keyID, PR_TRUE, NULL); |
+ } |
+ |
+ done: |
+ if (slot) |
+ PK11_FreeSlot(slot); |
+ |
+ return key ? SymmetricKey::CreateFromKey(key) : NULL; |
+ } |
#endif // defined(OS_CHROMEOS) |
@@ -702,6 +749,9 @@ |
return g_nss_singleton.Get().EnsureTPMTokenReady(); |
} |
+SymmetricKey* GetSupplementalUserKey() { |
+ return g_nss_singleton.Get().GetSupplementalUserKey(); |
+} |
#endif // defined(OS_CHROMEOS) |
// TODO(port): Implement this more simply. We can convert by subtracting an |