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 |