Index: net/base/x509_certificate_nss.cc |
diff --git a/net/base/x509_certificate_nss.cc b/net/base/x509_certificate_nss.cc |
index bbb5cef4b656bb88cfcb4bab30323010296f5545..af7172c69940e1857940253a6f9227c2b109452c 100644 |
--- a/net/base/x509_certificate_nss.cc |
+++ b/net/base/x509_certificate_nss.cc |
@@ -6,6 +6,7 @@ |
#include <cert.h> |
#include <cryptohi.h> |
+#include <keyhi.h> |
#include <nss.h> |
#include <pk11pub.h> |
#include <prerror.h> |
@@ -685,6 +686,90 @@ void X509Certificate::Initialize() { |
} |
// static |
+X509Certificate* X509Certificate::CreateFromBytesWithNickname( |
+ const char* data, |
+ int length, |
+ const char* nickname) { |
+ OSCertHandle cert_handle = CreateOSCertHandleFromBytesWithNickname(data, |
+ length, |
+ nickname); |
+ if (!cert_handle) |
+ return NULL; |
+ |
+ X509Certificate* cert = CreateFromHandle(cert_handle, OSCertHandles()); |
+ FreeOSCertHandle(cert_handle); |
+ |
+ if (nickname) |
+ cert->default_nickname_ = nickname; |
+ |
+ return cert; |
+} |
+ |
+std::string X509Certificate::GetDefaultNickname(CertType type) const { |
+ if (!default_nickname_.empty()) |
+ return default_nickname_; |
+ |
+ std::string result; |
+ if (type == USER_CERT) { |
+ // Find the private key for this certificate and see if it has a |
+ // nickname. If there is a private key, and it has a nickname, then |
+ // we return that nickname. |
+ SECKEYPrivateKey* private_key = PK11_FindPrivateKeyFromCert( |
+ cert_handle_->slot, |
+ cert_handle_, |
+ NULL); // wincx |
+ if (private_key) { |
+ char* private_key_nickname = PK11_GetPrivateKeyNickname(private_key); |
+ if (private_key_nickname) { |
+ result = private_key_nickname; |
+ PORT_Free(private_key_nickname); |
+ SECKEY_DestroyPrivateKey(private_key); |
+ return result; |
+ } |
+ SECKEY_DestroyPrivateKey(private_key); |
+ } |
+ } |
+ |
+ switch (type) { |
+ case CA_CERT: { |
+ char* nickname = CERT_MakeCANickname(cert_handle_); |
+ result = nickname; |
+ PORT_Free(nickname); |
+ break; |
+ } |
+ case USER_CERT: { |
+ // Create a nickname for a user certificate. |
+ // We use the scheme used by Firefox: |
+ // --> <subject's common name>'s <issuer's common name> ID. |
+ // TODO(gspencer): internationalize this: it's wrong to |
+ // hard code English. |
+ |
+ std::string username, ca_name; |
+ char* temp_username = CERT_GetCommonName( |
+ &cert_handle_->subject); |
+ char* temp_ca_name = CERT_GetCommonName(&cert_handle_->issuer); |
+ if (temp_username) { |
+ username = temp_username; |
+ PORT_Free(temp_username); |
+ } |
+ if (temp_ca_name) { |
+ ca_name = temp_ca_name; |
+ PORT_Free(temp_ca_name); |
+ } |
+ result = username + "'s " + ca_name + " ID"; |
+ break; |
+ } |
+ case SERVER_CERT: |
+ result = subject_.GetDisplayName(); |
+ break; |
+ case UNKNOWN_CERT: |
+ default: |
+ break; |
+ } |
+ return result; |
+} |
+ |
+// static |
X509Certificate* X509Certificate::CreateSelfSigned( |
crypto::RSAPrivateKey* key, |
const std::string& subject, |
@@ -922,6 +1007,15 @@ bool X509Certificate::IsSameOSCert(X509Certificate::OSCertHandle a, |
// static |
X509Certificate::OSCertHandle X509Certificate::CreateOSCertHandleFromBytes( |
const char* data, int length) { |
+ return CreateOSCertHandleFromBytesWithNickname(data, length, NULL); |
+} |
+ |
+// static |
+X509Certificate::OSCertHandle |
+X509Certificate::CreateOSCertHandleFromBytesWithNickname( |
+ const char* data, |
+ int length, |
+ const char* nickname) { |
if (length < 0) |
return NULL; |
@@ -936,13 +1030,16 @@ X509Certificate::OSCertHandle X509Certificate::CreateOSCertHandleFromBytes( |
der_cert.type = siDERCertBuffer; |
// Parse into a certificate structure. |
- return CERT_NewTempCertificate(CERT_GetDefaultCertDB(), &der_cert, NULL, |
+ return CERT_NewTempCertificate(CERT_GetDefaultCertDB(), &der_cert, |
+ const_cast<char*>(nickname), |
PR_FALSE, PR_TRUE); |
} |
// static |
X509Certificate::OSCertHandles X509Certificate::CreateOSCertHandlesFromBytes( |
- const char* data, int length, Format format) { |
+ const char* data, |
+ int length, |
+ Format format) { |
OSCertHandles results; |
if (length < 0) |
return results; |