From 4e7811927f082a0fdfab095bb0e54abcb69d8a7f Mon Sep 17 00:00:00 2001 From: "kaie%kuix.de" Date: Wed, 8 Nov 2006 18:14:21 +0000 Subject: [PATCH] Bug 356109, Improve KU_NON_REPUDIATION indication in client auth prompt r=rrelyea git-svn-id: svn://10.0.0.236/trunk@214969 18797224-902f-48f8-a5cc-f745e15eee43 --- .../manager/ssl/src/nsNSSCertificate.cpp | 93 +++++++++++++++++++ .../security/manager/ssl/src/nsNSSIOLayer.cpp | 3 - 2 files changed, 93 insertions(+), 3 deletions(-) diff --git a/mozilla/security/manager/ssl/src/nsNSSCertificate.cpp b/mozilla/security/manager/ssl/src/nsNSSCertificate.cpp index 2f886b6f7b8..7a402b8e595 100644 --- a/mozilla/security/manager/ssl/src/nsNSSCertificate.cpp +++ b/mozilla/security/manager/ssl/src/nsNSSCertificate.cpp @@ -205,6 +205,89 @@ nsNSSCertificate::MarkForPermDeletion() return NS_OK; } +nsresult +GetKeyUsagesString(CERTCertificate *cert, nsINSSComponent *nssComponent, + nsString &text) +{ + text.Truncate(); + + SECItem keyUsageItem; + keyUsageItem.data = NULL; + + SECStatus srv; + + /* There is no extension, v1 or v2 certificate */ + if (!cert->extensions) + return NS_OK; + + + srv = CERT_FindKeyUsageExtension(cert, &keyUsageItem); + if (srv == SECFailure) { + if (PORT_GetError () == SEC_ERROR_EXTENSION_NOT_FOUND) + return NS_OK; + else + return NS_ERROR_FAILURE; + } + + unsigned char keyUsage = keyUsageItem.data[0]; + nsAutoString local; + nsresult rv; + const PRUnichar *comma = NS_LITERAL_STRING(",").get(); + + if (keyUsage & KU_DIGITAL_SIGNATURE) { + rv = nssComponent->GetPIPNSSBundleString("CertDumpKUSign", local); + if (NS_SUCCEEDED(rv)) { + if (!text.IsEmpty()) text.Append(comma); + text.Append(local.get()); + } + } + if (keyUsage & KU_NON_REPUDIATION) { + rv = nssComponent->GetPIPNSSBundleString("CertDumpKUNonRep", local); + if (NS_SUCCEEDED(rv)) { + if (!text.IsEmpty()) text.Append(comma); + text.Append(local.get()); + } + } + if (keyUsage & KU_KEY_ENCIPHERMENT) { + rv = nssComponent->GetPIPNSSBundleString("CertDumpKUEnc", local); + if (NS_SUCCEEDED(rv)) { + if (!text.IsEmpty()) text.Append(comma); + text.Append(local.get()); + } + } + if (keyUsage & KU_DATA_ENCIPHERMENT) { + rv = nssComponent->GetPIPNSSBundleString("CertDumpKUDEnc", local); + if (NS_SUCCEEDED(rv)) { + if (!text.IsEmpty()) text.Append(comma); + text.Append(local.get()); + } + } + if (keyUsage & KU_KEY_AGREEMENT) { + rv = nssComponent->GetPIPNSSBundleString("CertDumpKUKA", local); + if (NS_SUCCEEDED(rv)) { + if (!text.IsEmpty()) text.Append(comma); + text.Append(local.get()); + } + } + if (keyUsage & KU_KEY_CERT_SIGN) { + rv = nssComponent->GetPIPNSSBundleString("CertDumpKUCertSign", local); + if (NS_SUCCEEDED(rv)) { + if (!text.IsEmpty()) text.Append(comma); + text.Append(local.get()); + } + } + if (keyUsage & KU_CRL_SIGN) { + rv = nssComponent->GetPIPNSSBundleString("CertDumpKUCRLSign", local); + if (NS_SUCCEEDED(rv)) { + if (!text.IsEmpty()) text.Append(comma); + text.Append(local.get()); + } + } + + PORT_Free (keyUsageItem.data); + return NS_OK; +} + nsresult nsNSSCertificate::FormatUIStrings(const nsAutoString &nickname, nsAutoString &nickWithSerial, nsAutoString &details) { @@ -310,6 +393,16 @@ nsNSSCertificate::FormatUIStrings(const nsAutoString &nickname, nsAutoString &ni details.Append(PRUnichar('\n')); } + if (NS_SUCCEEDED(GetKeyUsagesString(mCert, nssComponent, temp1)) && !temp1.IsEmpty()) { + details.AppendLiteral(" "); + if (NS_SUCCEEDED(nssComponent->GetPIPNSSBundleString("CertDumpKeyUsage", info))) { + details.Append(info); + details.AppendLiteral(": "); + } + details.Append(temp1); + details.Append(PRUnichar('\n')); + } + if (NS_SUCCEEDED(nssComponent->GetPIPNSSBundleString("CertInfoIssuedBy", info))) { details.Append(info); details.Append(PRUnichar(' ')); diff --git a/mozilla/security/manager/ssl/src/nsNSSIOLayer.cpp b/mozilla/security/manager/ssl/src/nsNSSIOLayer.cpp index decb482b5ed..e4c871d2f28 100644 --- a/mozilla/security/manager/ssl/src/nsNSSIOLayer.cpp +++ b/mozilla/security/manager/ssl/src/nsNSSIOLayer.cpp @@ -2372,9 +2372,6 @@ SECStatus nsNSS_SSLGetClientAuthData(void* arg, PRFileDesc* socket, if (NS_FAILED(tempCert->FormatUIStrings(i_nickname, nickWithSerial, details))) continue; - if (hasExplicitKeyUsageNonRepudiation(node->cert)) - nickWithSerial.Append(NS_LITERAL_STRING(" [NR]")); - certNicknameList[CertsToUse] = ToNewUnicode(nickWithSerial); if (!certNicknameList[CertsToUse]) continue;