| OLD | NEW |
| 1 /* ***** BEGIN LICENSE BLOCK ***** | 1 /* ***** BEGIN LICENSE BLOCK ***** |
| 2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | 2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 |
| 3 * | 3 * |
| 4 * The contents of this file are subject to the Mozilla Public License Version | 4 * The contents of this file are subject to the Mozilla Public License Version |
| 5 * 1.1 (the "License"); you may not use this file except in compliance with | 5 * 1.1 (the "License"); you may not use this file except in compliance with |
| 6 * the License. You may obtain a copy of the License at | 6 * the License. You may obtain a copy of the License at |
| 7 * http://www.mozilla.org/MPL/ | 7 * http://www.mozilla.org/MPL/ |
| 8 * | 8 * |
| 9 * Software distributed under the License is distributed on an "AS IS" basis, | 9 * Software distributed under the License is distributed on an "AS IS" basis, |
| 10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License | 10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License |
| (...skipping 670 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 681 CHECK(arena.get()); | 681 CHECK(arena.get()); |
| 682 | 682 |
| 683 if (SEC_ASN1DecodeItem(arena.get(), &item, | 683 if (SEC_ASN1DecodeItem(arena.get(), &item, |
| 684 SEC_ASN1_GET(SEC_BMPStringTemplate), extension_data) == | 684 SEC_ASN1_GET(SEC_BMPStringTemplate), extension_data) == |
| 685 SECSuccess) | 685 SECSuccess) |
| 686 rv = BMPtoUTF8(arena.get(), item.data, item.len); | 686 rv = BMPtoUTF8(arena.get(), item.data, item.len); |
| 687 return rv; | 687 return rv; |
| 688 } | 688 } |
| 689 | 689 |
| 690 struct MaskIdPair { | 690 struct MaskIdPair { |
| 691 unsigned char mask; | 691 unsigned int mask; |
| 692 int string_id; | 692 int string_id; |
| 693 }; | 693 }; |
| 694 | 694 |
| 695 static std::string ProcessBitField(SECItem* bitfield, |
| 696 const MaskIdPair* string_map, |
| 697 size_t len, |
| 698 char separator) { |
| 699 unsigned int bits = 0; |
| 700 std::string rv; |
| 701 // NSS bit flags like KU_DIGITAL_SIGNATURE, etc. are defined with the |
| 702 // assumption that the bitfields have at most 8 bits. |
| 703 if (bitfield->len) |
| 704 bits = bitfield->data[0]; |
| 705 for (size_t i = 0; i < len; ++i) { |
| 706 if (bits & string_map[i].mask) { |
| 707 if (!rv.empty()) |
| 708 rv += separator; |
| 709 rv += l10n_util::GetStringUTF8(string_map[i].string_id); |
| 710 } |
| 711 } |
| 712 return rv; |
| 713 } |
| 714 |
| 695 static std::string ProcessBitStringExtension(SECItem* extension_data, | 715 static std::string ProcessBitStringExtension(SECItem* extension_data, |
| 696 const MaskIdPair* string_map, | 716 const MaskIdPair* string_map, |
| 697 size_t len) { | 717 size_t len, |
| 718 char separator) { |
| 698 SECItem decoded; | 719 SECItem decoded; |
| 699 decoded.type = siBuffer; | 720 decoded.type = siBuffer; |
| 700 decoded.data = NULL; | 721 decoded.data = NULL; |
| 701 decoded.len = 0; | 722 decoded.len = 0; |
| 702 if (SEC_ASN1DecodeItem(NULL, &decoded, SEC_ASN1_GET(SEC_BitStringTemplate), | 723 if (SEC_ASN1DecodeItem(NULL, &decoded, SEC_ASN1_GET(SEC_BitStringTemplate), |
| 703 extension_data) != SECSuccess) | 724 extension_data) != SECSuccess) |
| 704 return l10n_util::GetStringUTF8(IDS_CERT_EXTENSION_DUMP_ERROR); | 725 return l10n_util::GetStringUTF8(IDS_CERT_EXTENSION_DUMP_ERROR); |
| 705 | 726 std::string rv = ProcessBitField(&decoded, string_map, len, separator); |
| 706 std::string rv; | |
| 707 for (size_t i = 0; i < len; ++i) { | |
| 708 if (decoded.data[0] & string_map[i].mask) { | |
| 709 rv += l10n_util::GetStringUTF8(string_map[i].string_id) + '\n'; | |
| 710 } | |
| 711 } | |
| 712 PORT_Free(decoded.data); | 727 PORT_Free(decoded.data); |
| 713 return rv; | 728 return rv; |
| 714 } | 729 } |
| 715 | 730 |
| 716 std::string ProcessNSCertTypeExtension(SECItem* extension_data) { | 731 std::string ProcessNSCertTypeExtension(SECItem* extension_data) { |
| 717 MaskIdPair usage_string_map[] = { | 732 static const MaskIdPair usage_string_map[] = { |
| 718 {NS_CERT_TYPE_SSL_CLIENT, IDS_CERT_USAGE_SSL_CLIENT}, | 733 {NS_CERT_TYPE_SSL_CLIENT, IDS_CERT_USAGE_SSL_CLIENT}, |
| 719 {NS_CERT_TYPE_SSL_SERVER, IDS_CERT_USAGE_SSL_SERVER}, | 734 {NS_CERT_TYPE_SSL_SERVER, IDS_CERT_USAGE_SSL_SERVER}, |
| 720 {NS_CERT_TYPE_EMAIL, IDS_CERT_EXT_NS_CERT_TYPE_EMAIL}, | 735 {NS_CERT_TYPE_EMAIL, IDS_CERT_EXT_NS_CERT_TYPE_EMAIL}, |
| 721 {NS_CERT_TYPE_OBJECT_SIGNING, IDS_CERT_USAGE_OBJECT_SIGNER}, | 736 {NS_CERT_TYPE_OBJECT_SIGNING, IDS_CERT_USAGE_OBJECT_SIGNER}, |
| 722 {NS_CERT_TYPE_SSL_CA, IDS_CERT_USAGE_SSL_CA}, | 737 {NS_CERT_TYPE_SSL_CA, IDS_CERT_USAGE_SSL_CA}, |
| 723 {NS_CERT_TYPE_EMAIL_CA, IDS_CERT_EXT_NS_CERT_TYPE_EMAIL_CA}, | 738 {NS_CERT_TYPE_EMAIL_CA, IDS_CERT_EXT_NS_CERT_TYPE_EMAIL_CA}, |
| 724 {NS_CERT_TYPE_OBJECT_SIGNING_CA, IDS_CERT_USAGE_OBJECT_SIGNER}, | 739 {NS_CERT_TYPE_OBJECT_SIGNING_CA, IDS_CERT_USAGE_OBJECT_SIGNER}, |
| 725 }; | 740 }; |
| 726 return ProcessBitStringExtension(extension_data, usage_string_map, | 741 return ProcessBitStringExtension(extension_data, usage_string_map, |
| 727 ARRAYSIZE_UNSAFE(usage_string_map)); | 742 ARRAYSIZE_UNSAFE(usage_string_map), '\n'); |
| 743 } |
| 744 |
| 745 static const MaskIdPair key_usage_string_map[] = { |
| 746 {KU_DIGITAL_SIGNATURE, IDS_CERT_X509_KEY_USAGE_SIGNING}, |
| 747 {KU_NON_REPUDIATION, IDS_CERT_X509_KEY_USAGE_NONREP}, |
| 748 {KU_KEY_ENCIPHERMENT, IDS_CERT_X509_KEY_USAGE_ENCIPHERMENT}, |
| 749 {KU_DATA_ENCIPHERMENT, IDS_CERT_X509_KEY_USAGE_DATA_ENCIPHERMENT}, |
| 750 {KU_KEY_AGREEMENT, IDS_CERT_X509_KEY_USAGE_KEY_AGREEMENT}, |
| 751 {KU_KEY_CERT_SIGN, IDS_CERT_X509_KEY_USAGE_CERT_SIGNER}, |
| 752 {KU_CRL_SIGN, IDS_CERT_X509_KEY_USAGE_CRL_SIGNER}, |
| 753 {KU_ENCIPHER_ONLY, IDS_CERT_X509_KEY_USAGE_ENCIPHER_ONLY}, |
| 754 // NSS is missing a flag for dechiperOnly, see: |
| 755 // https://bugzilla.mozilla.org/show_bug.cgi?id=549952 |
| 756 }; |
| 757 |
| 758 std::string ProcessKeyUsageBitString(SECItem* bitstring, char sep) { |
| 759 return ProcessBitField(bitstring, key_usage_string_map, |
| 760 arraysize(key_usage_string_map), sep); |
| 728 } | 761 } |
| 729 | 762 |
| 730 std::string ProcessKeyUsageExtension(SECItem* extension_data) { | 763 std::string ProcessKeyUsageExtension(SECItem* extension_data) { |
| 731 MaskIdPair usage_string_map[] = { | 764 return ProcessBitStringExtension(extension_data, key_usage_string_map, |
| 732 {KU_DIGITAL_SIGNATURE, IDS_CERT_X509_KEY_USAGE_SIGNING}, | 765 arraysize(key_usage_string_map), '\n'); |
| 733 {KU_NON_REPUDIATION, IDS_CERT_X509_KEY_USAGE_NONREP}, | |
| 734 {KU_KEY_ENCIPHERMENT, IDS_CERT_X509_KEY_USAGE_ENCIPHERMENT}, | |
| 735 {KU_DATA_ENCIPHERMENT, IDS_CERT_X509_KEY_USAGE_DATA_ENCIPHERMENT}, | |
| 736 {KU_KEY_AGREEMENT, IDS_CERT_X509_KEY_USAGE_KEY_AGREEMENT}, | |
| 737 {KU_KEY_CERT_SIGN, IDS_CERT_X509_KEY_USAGE_CERT_SIGNER}, | |
| 738 {KU_CRL_SIGN, IDS_CERT_X509_KEY_USAGE_CRL_SIGNER}, | |
| 739 }; | |
| 740 return ProcessBitStringExtension(extension_data, usage_string_map, | |
| 741 ARRAYSIZE_UNSAFE(usage_string_map)); | |
| 742 } | 766 } |
| 743 | 767 |
| 744 std::string ProcessExtKeyUsage(SECItem* extension_data) { | 768 std::string ProcessExtKeyUsage(SECItem* extension_data) { |
| 745 std::string rv; | 769 std::string rv; |
| 746 CERTOidSequence* extension_key_usage = NULL; | 770 CERTOidSequence* extension_key_usage = NULL; |
| 747 extension_key_usage = CERT_DecodeOidSequence(extension_data); | 771 extension_key_usage = CERT_DecodeOidSequence(extension_data); |
| 748 if (extension_key_usage == NULL) | 772 if (extension_key_usage == NULL) |
| 749 return l10n_util::GetStringUTF8(IDS_CERT_EXTENSION_DUMP_ERROR); | 773 return l10n_util::GetStringUTF8(IDS_CERT_EXTENSION_DUMP_ERROR); |
| 750 | 774 |
| 751 SECItem** oids; | 775 SECItem** oids; |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 802 case SEC_OID_NS_CERT_EXT_LOST_PASSWORD_URL: | 826 case SEC_OID_NS_CERT_EXT_LOST_PASSWORD_URL: |
| 803 return ProcessIA5String(extension_data); | 827 return ProcessIA5String(extension_data); |
| 804 default: | 828 default: |
| 805 if (oid_tag == ms_cert_ext_certtype) | 829 if (oid_tag == ms_cert_ext_certtype) |
| 806 return ProcessBMPString(extension_data); | 830 return ProcessBMPString(extension_data); |
| 807 return ProcessRawBytes(extension_data); | 831 return ProcessRawBytes(extension_data); |
| 808 } | 832 } |
| 809 } | 833 } |
| 810 | 834 |
| 811 } // namespace mozilla_security_manager | 835 } // namespace mozilla_security_manager |
| OLD | NEW |