| Index: chrome/third_party/mozilla_security_manager/nsNSSCertHelper.cpp
|
| diff --git a/chrome/third_party/mozilla_security_manager/nsNSSCertHelper.cpp b/chrome/third_party/mozilla_security_manager/nsNSSCertHelper.cpp
|
| index 6f6d9f2f660193021e04ee28b09203bd81af2da6..3c16cf05e9ee2a51ce4420efb4a481d3a7fd4043 100644
|
| --- a/chrome/third_party/mozilla_security_manager/nsNSSCertHelper.cpp
|
| +++ b/chrome/third_party/mozilla_security_manager/nsNSSCertHelper.cpp
|
| @@ -688,13 +688,34 @@ std::string ProcessBMPString(SECItem* extension_data) {
|
| }
|
|
|
| struct MaskIdPair {
|
| - unsigned char mask;
|
| + unsigned int mask;
|
| int string_id;
|
| };
|
|
|
| +static std::string ProcessBitField(SECItem* bitfield,
|
| + const MaskIdPair* string_map,
|
| + size_t len,
|
| + char separator) {
|
| + unsigned int bits = 0;
|
| + std::string rv;
|
| + // NSS bit flags like KU_DIGITAL_SIGNATURE, etc. are defined with the
|
| + // assumption that the bitfields have at most 8 bits.
|
| + if (bitfield->len)
|
| + bits = bitfield->data[0];
|
| + for (size_t i = 0; i < len; ++i) {
|
| + if (bits & string_map[i].mask) {
|
| + if (!rv.empty())
|
| + rv += separator;
|
| + rv += l10n_util::GetStringUTF8(string_map[i].string_id);
|
| + }
|
| + }
|
| + return rv;
|
| +}
|
| +
|
| static std::string ProcessBitStringExtension(SECItem* extension_data,
|
| const MaskIdPair* string_map,
|
| - size_t len) {
|
| + size_t len,
|
| + char separator) {
|
| SECItem decoded;
|
| decoded.type = siBuffer;
|
| decoded.data = NULL;
|
| @@ -702,19 +723,13 @@ static std::string ProcessBitStringExtension(SECItem* extension_data,
|
| if (SEC_ASN1DecodeItem(NULL, &decoded, SEC_ASN1_GET(SEC_BitStringTemplate),
|
| extension_data) != SECSuccess)
|
| return l10n_util::GetStringUTF8(IDS_CERT_EXTENSION_DUMP_ERROR);
|
| -
|
| - std::string rv;
|
| - for (size_t i = 0; i < len; ++i) {
|
| - if (decoded.data[0] & string_map[i].mask) {
|
| - rv += l10n_util::GetStringUTF8(string_map[i].string_id) + '\n';
|
| - }
|
| - }
|
| + std::string rv = ProcessBitField(&decoded, string_map, len, separator);
|
| PORT_Free(decoded.data);
|
| return rv;
|
| }
|
|
|
| std::string ProcessNSCertTypeExtension(SECItem* extension_data) {
|
| - MaskIdPair usage_string_map[] = {
|
| + static const MaskIdPair usage_string_map[] = {
|
| {NS_CERT_TYPE_SSL_CLIENT, IDS_CERT_USAGE_SSL_CLIENT},
|
| {NS_CERT_TYPE_SSL_SERVER, IDS_CERT_USAGE_SSL_SERVER},
|
| {NS_CERT_TYPE_EMAIL, IDS_CERT_EXT_NS_CERT_TYPE_EMAIL},
|
| @@ -724,21 +739,30 @@ std::string ProcessNSCertTypeExtension(SECItem* extension_data) {
|
| {NS_CERT_TYPE_OBJECT_SIGNING_CA, IDS_CERT_USAGE_OBJECT_SIGNER},
|
| };
|
| return ProcessBitStringExtension(extension_data, usage_string_map,
|
| - ARRAYSIZE_UNSAFE(usage_string_map));
|
| + ARRAYSIZE_UNSAFE(usage_string_map), '\n');
|
| +}
|
| +
|
| +static const MaskIdPair key_usage_string_map[] = {
|
| + {KU_DIGITAL_SIGNATURE, IDS_CERT_X509_KEY_USAGE_SIGNING},
|
| + {KU_NON_REPUDIATION, IDS_CERT_X509_KEY_USAGE_NONREP},
|
| + {KU_KEY_ENCIPHERMENT, IDS_CERT_X509_KEY_USAGE_ENCIPHERMENT},
|
| + {KU_DATA_ENCIPHERMENT, IDS_CERT_X509_KEY_USAGE_DATA_ENCIPHERMENT},
|
| + {KU_KEY_AGREEMENT, IDS_CERT_X509_KEY_USAGE_KEY_AGREEMENT},
|
| + {KU_KEY_CERT_SIGN, IDS_CERT_X509_KEY_USAGE_CERT_SIGNER},
|
| + {KU_CRL_SIGN, IDS_CERT_X509_KEY_USAGE_CRL_SIGNER},
|
| + {KU_ENCIPHER_ONLY, IDS_CERT_X509_KEY_USAGE_ENCIPHER_ONLY},
|
| + // NSS is missing a flag for dechiperOnly, see:
|
| + // https://bugzilla.mozilla.org/show_bug.cgi?id=549952
|
| +};
|
| +
|
| +std::string ProcessKeyUsageBitString(SECItem* bitstring, char sep) {
|
| + return ProcessBitField(bitstring, key_usage_string_map,
|
| + arraysize(key_usage_string_map), sep);
|
| }
|
|
|
| std::string ProcessKeyUsageExtension(SECItem* extension_data) {
|
| - MaskIdPair usage_string_map[] = {
|
| - {KU_DIGITAL_SIGNATURE, IDS_CERT_X509_KEY_USAGE_SIGNING},
|
| - {KU_NON_REPUDIATION, IDS_CERT_X509_KEY_USAGE_NONREP},
|
| - {KU_KEY_ENCIPHERMENT, IDS_CERT_X509_KEY_USAGE_ENCIPHERMENT},
|
| - {KU_DATA_ENCIPHERMENT, IDS_CERT_X509_KEY_USAGE_DATA_ENCIPHERMENT},
|
| - {KU_KEY_AGREEMENT, IDS_CERT_X509_KEY_USAGE_KEY_AGREEMENT},
|
| - {KU_KEY_CERT_SIGN, IDS_CERT_X509_KEY_USAGE_CERT_SIGNER},
|
| - {KU_CRL_SIGN, IDS_CERT_X509_KEY_USAGE_CRL_SIGNER},
|
| - };
|
| - return ProcessBitStringExtension(extension_data, usage_string_map,
|
| - ARRAYSIZE_UNSAFE(usage_string_map));
|
| + return ProcessBitStringExtension(extension_data, key_usage_string_map,
|
| + arraysize(key_usage_string_map), '\n');
|
| }
|
|
|
| std::string ProcessExtKeyUsage(SECItem* extension_data) {
|
|
|