Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(296)

Side by Side Diff: chrome/third_party/mozilla_security_manager/nsNSSCertHelper.cpp

Issue 661241: Linux: implement Client SSL Certificate selection UI (Closed)
Patch Set: fix views and chromeos builds hopefully Created 10 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698