OLD | NEW |
1 /* This Source Code Form is subject to the terms of the Mozilla Public | 1 /* This Source Code Form is subject to the terms of the Mozilla Public |
2 * License, v. 2.0. If a copy of the MPL was not distributed with this | 2 * License, v. 2.0. If a copy of the MPL was not distributed with this |
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ | 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
4 #include "nspr.h" | 4 #include "nspr.h" |
5 #include "secerr.h" | 5 #include "secerr.h" |
6 #include "secport.h" | 6 #include "secport.h" |
7 #include "seccomon.h" | 7 #include "seccomon.h" |
8 #include "secoid.h" | 8 #include "secoid.h" |
9 #include "sslerr.h" | 9 #include "sslerr.h" |
10 #include "genname.h" | 10 #include "genname.h" |
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
364 int pathLengthLimit = CERT_UNLIMITED_PATH_CONSTRAINT; | 364 int pathLengthLimit = CERT_UNLIMITED_PATH_CONSTRAINT; |
365 unsigned int caCertType; | 365 unsigned int caCertType; |
366 unsigned int requiredCAKeyUsage; | 366 unsigned int requiredCAKeyUsage; |
367 unsigned int requiredFlags; | 367 unsigned int requiredFlags; |
368 PRArenaPool *arena = NULL; | 368 PRArenaPool *arena = NULL; |
369 CERTGeneralName *namesList = NULL; | 369 CERTGeneralName *namesList = NULL; |
370 CERTCertificate **certsList = NULL; | 370 CERTCertificate **certsList = NULL; |
371 int certsListLen = 16; | 371 int certsListLen = 16; |
372 int namesCount = 0; | 372 int namesCount = 0; |
373 PRBool subjectCertIsSelfIssued; | 373 PRBool subjectCertIsSelfIssued; |
| 374 CERTCertTrust issuerTrust; |
374 | 375 |
375 if (revoked) { | 376 if (revoked) { |
376 *revoked = PR_FALSE; | 377 *revoked = PR_FALSE; |
377 } | 378 } |
378 | 379 |
379 if (CERT_KeyUsageAndTypeForCertUsage(certUsage, PR_TRUE, | 380 if (CERT_KeyUsageAndTypeForCertUsage(certUsage, PR_TRUE, |
380 &requiredCAKeyUsage, | 381 &requiredCAKeyUsage, |
381 &caCertType) | 382 &caCertType) |
382 != SECSuccess ) { | 383 != SECSuccess ) { |
383 PORT_Assert(0); | 384 PORT_Assert(0); |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
564 * error to the user, but the user may wish to continue | 565 * error to the user, but the user may wish to continue |
565 * processing, in which case we better make sure nothing | 566 * processing, in which case we better make sure nothing |
566 * worse has happened... so keep cranking the loop */ | 567 * worse has happened... so keep cranking the loop */ |
567 rvFinal = SECFailure; | 568 rvFinal = SECFailure; |
568 if (revoked) { | 569 if (revoked) { |
569 *revoked = PR_TRUE; | 570 *revoked = PR_TRUE; |
570 } | 571 } |
571 LOG_ERROR(log,subjectCert,count,0); | 572 LOG_ERROR(log,subjectCert,count,0); |
572 } | 573 } |
573 | 574 |
574 » if ( issuerCert->trust ) { | 575 » if ( CERT_GetCertTrust(issuerCert, &issuerTrust) == SECSuccess) { |
575 /* we have some trust info, but this does NOT imply that this | 576 /* we have some trust info, but this does NOT imply that this |
576 * cert is actually trusted for any purpose. The cert may be | 577 * cert is actually trusted for any purpose. The cert may be |
577 * explicitly UNtrusted. We won't know until we examine the | 578 * explicitly UNtrusted. We won't know until we examine the |
578 * trust bits. | 579 * trust bits. |
579 */ | 580 */ |
580 unsigned int flags; | 581 unsigned int flags; |
581 | 582 |
582 if (certUsage != certUsageAnyCA && | 583 if (certUsage != certUsageAnyCA && |
583 certUsage != certUsageStatusResponder) { | 584 certUsage != certUsageStatusResponder) { |
584 | 585 |
585 /* | 586 /* |
586 * XXX This choice of trustType seems arbitrary. | 587 * XXX This choice of trustType seems arbitrary. |
587 */ | 588 */ |
588 if ( certUsage == certUsageVerifyCA ) { | 589 if ( certUsage == certUsageVerifyCA ) { |
589 if ( subjectCert->nsCertType & NS_CERT_TYPE_EMAIL_CA ) { | 590 if ( subjectCert->nsCertType & NS_CERT_TYPE_EMAIL_CA ) { |
590 trustType = trustEmail; | 591 trustType = trustEmail; |
591 } else if ( subjectCert->nsCertType & NS_CERT_TYPE_SSL_CA )
{ | 592 } else if ( subjectCert->nsCertType & NS_CERT_TYPE_SSL_CA )
{ |
592 trustType = trustSSL; | 593 trustType = trustSSL; |
593 } else { | 594 } else { |
594 trustType = trustObjectSigning; | 595 trustType = trustObjectSigning; |
595 } | 596 } |
596 } | 597 } |
597 | 598 |
598 » flags = SEC_GET_TRUST_FLAGS(issuerCert->trust, trustType); | 599 » flags = SEC_GET_TRUST_FLAGS(&issuerTrust, trustType); |
599 if (( flags & requiredFlags ) == requiredFlags) { | 600 if (( flags & requiredFlags ) == requiredFlags) { |
600 /* we found a trusted one, so return */ | 601 /* we found a trusted one, so return */ |
601 rv = rvFinal; | 602 rv = rvFinal; |
602 goto done; | 603 goto done; |
603 } | 604 } |
604 if (flags & CERTDB_VALID_CA) { | 605 if (flags & CERTDB_VALID_CA) { |
605 validCAOverride = PR_TRUE; | 606 validCAOverride = PR_TRUE; |
606 } | 607 } |
607 /* is it explicitly distrusted? */ | 608 /* is it explicitly distrusted? */ |
608 if ((flags & CERTDB_TERMINAL_RECORD) && | 609 if ((flags & CERTDB_TERMINAL_RECORD) && |
609 ((flags & (CERTDB_TRUSTED|CERTDB_TRUSTED_CA)) == 0)) { | 610 ((flags & (CERTDB_TRUSTED|CERTDB_TRUSTED_CA)) == 0)) { |
610 /* untrusted -- the cert is explicitly untrusted, not | 611 /* untrusted -- the cert is explicitly untrusted, not |
611 * just that it doesn't chain to a trusted cert */ | 612 * just that it doesn't chain to a trusted cert */ |
612 PORT_SetError(SEC_ERROR_UNTRUSTED_ISSUER); | 613 PORT_SetError(SEC_ERROR_UNTRUSTED_ISSUER); |
613 LOG_ERROR_OR_EXIT(log,issuerCert,count+1,flags); | 614 LOG_ERROR_OR_EXIT(log,issuerCert,count+1,flags); |
614 } | 615 } |
615 } else { | 616 } else { |
616 /* Check if we have any valid trust when cheching for | 617 /* Check if we have any valid trust when cheching for |
617 * certUsageAnyCA or certUsageStatusResponder. */ | 618 * certUsageAnyCA or certUsageStatusResponder. */ |
618 for (trustType = trustSSL; trustType < trustTypeNone; | 619 for (trustType = trustSSL; trustType < trustTypeNone; |
619 trustType++) { | 620 trustType++) { |
620 flags = SEC_GET_TRUST_FLAGS(issuerCert->trust, trustType); | 621 flags = SEC_GET_TRUST_FLAGS(&issuerTrust, trustType); |
621 if ((flags & requiredFlags) == requiredFlags) { | 622 if ((flags & requiredFlags) == requiredFlags) { |
622 rv = rvFinal; | 623 rv = rvFinal; |
623 goto done; | 624 goto done; |
624 } | 625 } |
625 if (flags & CERTDB_VALID_CA) | 626 if (flags & CERTDB_VALID_CA) |
626 validCAOverride = PR_TRUE; | 627 validCAOverride = PR_TRUE; |
627 } | 628 } |
628 /* We have 2 separate loops because we want any single trust | 629 /* We have 2 separate loops because we want any single trust |
629 * bit to allow this usage to return trusted. Only if none of | 630 * bit to allow this usage to return trusted. Only if none of |
630 * the trust bits are on do we check to see if the cert is | 631 * the trust bits are on do we check to see if the cert is |
631 * untrusted */ | 632 * untrusted */ |
632 for (trustType = trustSSL; trustType < trustTypeNone; | 633 for (trustType = trustSSL; trustType < trustTypeNone; |
633 trustType++) { | 634 trustType++) { |
634 flags = SEC_GET_TRUST_FLAGS(issuerCert->trust, trustType); | 635 flags = SEC_GET_TRUST_FLAGS(&issuerTrust, trustType); |
635 /* is it explicitly distrusted? */ | 636 /* is it explicitly distrusted? */ |
636 if ((flags & CERTDB_TERMINAL_RECORD) && | 637 if ((flags & CERTDB_TERMINAL_RECORD) && |
637 ((flags & (CERTDB_TRUSTED|CERTDB_TRUSTED_CA)) == 0)) { | 638 ((flags & (CERTDB_TRUSTED|CERTDB_TRUSTED_CA)) == 0)) { |
638 /* untrusted -- the cert is explicitly untrusted, not | 639 /* untrusted -- the cert is explicitly untrusted, not |
639 * just that it doesn't chain to a trusted cert */ | 640 * just that it doesn't chain to a trusted cert */ |
640 PORT_SetError(SEC_ERROR_UNTRUSTED_ISSUER); | 641 PORT_SetError(SEC_ERROR_UNTRUSTED_ISSUER); |
641 LOG_ERROR_OR_EXIT(log,issuerCert,count+1,flags); | 642 LOG_ERROR_OR_EXIT(log,issuerCert,count+1,flags); |
642 } | 643 } |
643 } | 644 } |
644 } | 645 } |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
765 CERTBasicConstraints basicConstraint; | 766 CERTBasicConstraints basicConstraint; |
766 PRBool isca; | 767 PRBool isca; |
767 PRBool validCAOverride = PR_FALSE; | 768 PRBool validCAOverride = PR_FALSE; |
768 SECStatus rv; | 769 SECStatus rv; |
769 SECStatus rvFinal = SECSuccess; | 770 SECStatus rvFinal = SECSuccess; |
770 unsigned int flags; | 771 unsigned int flags; |
771 unsigned int caCertType; | 772 unsigned int caCertType; |
772 unsigned int requiredCAKeyUsage; | 773 unsigned int requiredCAKeyUsage; |
773 unsigned int requiredFlags; | 774 unsigned int requiredFlags; |
774 CERTCertificate *issuerCert; | 775 CERTCertificate *issuerCert; |
| 776 CERTCertTrust certTrust; |
775 | 777 |
776 | 778 |
777 if (CERT_KeyUsageAndTypeForCertUsage(certUsage, PR_TRUE, | 779 if (CERT_KeyUsageAndTypeForCertUsage(certUsage, PR_TRUE, |
778 &requiredCAKeyUsage, | 780 &requiredCAKeyUsage, |
779 &caCertType) != SECSuccess ) { | 781 &caCertType) != SECSuccess ) { |
780 PORT_Assert(0); | 782 PORT_Assert(0); |
781 EXIT_IF_NOT_LOGGING(log); | 783 EXIT_IF_NOT_LOGGING(log); |
782 requiredCAKeyUsage = 0; | 784 requiredCAKeyUsage = 0; |
783 caCertType = 0; | 785 caCertType = 0; |
784 } | 786 } |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
830 } else { | 832 } else { |
831 if ( basicConstraint.isCA == PR_FALSE ) { | 833 if ( basicConstraint.isCA == PR_FALSE ) { |
832 PORT_SetError (SEC_ERROR_CA_CERT_INVALID); | 834 PORT_SetError (SEC_ERROR_CA_CERT_INVALID); |
833 LOG_ERROR_OR_EXIT(log,cert,0,0); | 835 LOG_ERROR_OR_EXIT(log,cert,0,0); |
834 } | 836 } |
835 | 837 |
836 /* can't check path length if we don't know the previous path */ | 838 /* can't check path length if we don't know the previous path */ |
837 isca = PR_TRUE; | 839 isca = PR_TRUE; |
838 } | 840 } |
839 | 841 |
840 if ( cert->trust ) { | 842 if ( CERT_GetCertTrust(cert, &certTrust) == SECSuccess ) { |
841 /* we have some trust info, but this does NOT imply that this | 843 /* we have some trust info, but this does NOT imply that this |
842 * cert is actually trusted for any purpose. The cert may be | 844 * cert is actually trusted for any purpose. The cert may be |
843 * explicitly UNtrusted. We won't know until we examine the | 845 * explicitly UNtrusted. We won't know until we examine the |
844 * trust bits. | 846 * trust bits. |
845 */ | 847 */ |
846 if (certUsage == certUsageStatusResponder) { | 848 if (certUsage == certUsageStatusResponder) { |
847 /* Check the special case of certUsageStatusResponder */ | 849 /* Check the special case of certUsageStatusResponder */ |
848 issuerCert = CERT_FindCertIssuer(cert, t, certUsage); | 850 issuerCert = CERT_FindCertIssuer(cert, t, certUsage); |
849 if (issuerCert) { | 851 if (issuerCert) { |
850 if (SEC_CheckCRL(handle, cert, issuerCert, t, wincx) | 852 if (SEC_CheckCRL(handle, cert, issuerCert, t, wincx) |
851 != SECSuccess) { | 853 != SECSuccess) { |
852 PORT_SetError(SEC_ERROR_REVOKED_CERTIFICATE); | 854 PORT_SetError(SEC_ERROR_REVOKED_CERTIFICATE); |
853 CERT_DestroyCertificate(issuerCert); | 855 CERT_DestroyCertificate(issuerCert); |
854 goto loser; | 856 goto loser; |
855 } | 857 } |
856 CERT_DestroyCertificate(issuerCert); | 858 CERT_DestroyCertificate(issuerCert); |
857 } | 859 } |
858 /* XXX We have NOT determined that this cert is trusted. | 860 /* XXX We have NOT determined that this cert is trusted. |
859 * For years, NSS has treated this as trusted, | 861 * For years, NSS has treated this as trusted, |
860 * but it seems incorrect. | 862 * but it seems incorrect. |
861 */ | 863 */ |
862 rv = rvFinal; | 864 rv = rvFinal; |
863 goto done; | 865 goto done; |
864 } | 866 } |
865 | 867 |
866 /* | 868 /* |
867 * check the trust params of the issuer | 869 * check the trust params of the issuer |
868 */ | 870 */ |
869 » flags = SEC_GET_TRUST_FLAGS(cert->trust, trustType); | 871 » flags = SEC_GET_TRUST_FLAGS(&certTrust, trustType); |
870 if ( ( flags & requiredFlags ) == requiredFlags) { | 872 if ( ( flags & requiredFlags ) == requiredFlags) { |
871 /* we found a trusted one, so return */ | 873 /* we found a trusted one, so return */ |
872 rv = rvFinal; | 874 rv = rvFinal; |
873 goto done; | 875 goto done; |
874 } | 876 } |
875 if (flags & CERTDB_VALID_CA) { | 877 if (flags & CERTDB_VALID_CA) { |
876 validCAOverride = PR_TRUE; | 878 validCAOverride = PR_TRUE; |
877 } | 879 } |
878 /* is it explicitly distrusted? */ | 880 /* is it explicitly distrusted? */ |
879 if ((flags & CERTDB_TERMINAL_RECORD) && | 881 if ((flags & CERTDB_TERMINAL_RECORD) && |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
951 * returns success if the cert is not distrusted. If the cert is | 953 * returns success if the cert is not distrusted. If the cert is |
952 * trusted, then the trusted bool will be true. | 954 * trusted, then the trusted bool will be true. |
953 * returns failure if the cert is distrusted. If failure, flags | 955 * returns failure if the cert is distrusted. If failure, flags |
954 * will return the flag bits that indicated distrust. | 956 * will return the flag bits that indicated distrust. |
955 */ | 957 */ |
956 SECStatus | 958 SECStatus |
957 cert_CheckLeafTrust(CERTCertificate *cert, SECCertUsage certUsage, | 959 cert_CheckLeafTrust(CERTCertificate *cert, SECCertUsage certUsage, |
958 unsigned int *failedFlags, PRBool *trusted) | 960 unsigned int *failedFlags, PRBool *trusted) |
959 { | 961 { |
960 unsigned int flags; | 962 unsigned int flags; |
| 963 CERTCertTrust trust; |
961 | 964 |
962 *failedFlags = 0; | 965 *failedFlags = 0; |
963 *trusted = PR_FALSE; | 966 *trusted = PR_FALSE; |
964 | 967 |
965 /* check trust flags to see if this cert is directly trusted */ | 968 /* check trust flags to see if this cert is directly trusted */ |
966 if ( cert->trust ) { | 969 if ( CERT_GetCertTrust(cert, &trust) == SECSuccess ) { |
967 switch ( certUsage ) { | 970 switch ( certUsage ) { |
968 case certUsageSSLClient: | 971 case certUsageSSLClient: |
969 case certUsageSSLServer: | 972 case certUsageSSLServer: |
970 » flags = cert->trust->sslFlags; | 973 » flags = trust.sslFlags; |
971 | 974 |
972 /* is the cert directly trusted or not trusted ? */ | 975 /* is the cert directly trusted or not trusted ? */ |
973 if ( flags & CERTDB_TERMINAL_RECORD) { /* the trust record is | 976 if ( flags & CERTDB_TERMINAL_RECORD) { /* the trust record is |
974 * authoritative */ | 977 * authoritative */ |
975 if ( flags & CERTDB_TRUSTED ) { /* trust this cert */ | 978 if ( flags & CERTDB_TRUSTED ) { /* trust this cert */ |
976 *trusted = PR_TRUE; | 979 *trusted = PR_TRUE; |
977 return SECSuccess; | 980 return SECSuccess; |
978 } else { /* don't trust this cert */ | 981 } else { /* don't trust this cert */ |
979 *failedFlags = flags; | 982 *failedFlags = flags; |
980 return SECFailure; | 983 return SECFailure; |
981 } | 984 } |
982 } | 985 } |
983 break; | 986 break; |
984 case certUsageSSLServerWithStepUp: | 987 case certUsageSSLServerWithStepUp: |
985 /* XXX - step up certs can't be directly trusted, only distrust */ | 988 /* XXX - step up certs can't be directly trusted, only distrust */ |
986 » flags = cert->trust->sslFlags; | 989 » flags = trust.sslFlags; |
987 if ( flags & CERTDB_TERMINAL_RECORD) { /* the trust record is | 990 if ( flags & CERTDB_TERMINAL_RECORD) { /* the trust record is |
988 * authoritative */ | 991 * authoritative */ |
989 if (( flags & CERTDB_TRUSTED ) == 0) { | 992 if (( flags & CERTDB_TRUSTED ) == 0) { |
990 /* don't trust this cert */ | 993 /* don't trust this cert */ |
991 *failedFlags = flags; | 994 *failedFlags = flags; |
992 return SECFailure; | 995 return SECFailure; |
993 } | 996 } |
994 } | 997 } |
995 break; | 998 break; |
996 case certUsageSSLCA: | 999 case certUsageSSLCA: |
997 » flags = cert->trust->sslFlags; | 1000 » flags = trust.sslFlags; |
998 if ( flags & CERTDB_TERMINAL_RECORD) { /* the trust record is | 1001 if ( flags & CERTDB_TERMINAL_RECORD) { /* the trust record is |
999 * authoritative */ | 1002 * authoritative */ |
1000 if (( flags & (CERTDB_TRUSTED|CERTDB_TRUSTED_CA) ) == 0) { | 1003 if (( flags & (CERTDB_TRUSTED|CERTDB_TRUSTED_CA) ) == 0) { |
1001 /* don't trust this cert */ | 1004 /* don't trust this cert */ |
1002 *failedFlags = flags; | 1005 *failedFlags = flags; |
1003 return SECFailure; | 1006 return SECFailure; |
1004 } | 1007 } |
1005 } | 1008 } |
1006 break; | 1009 break; |
1007 case certUsageEmailSigner: | 1010 case certUsageEmailSigner: |
1008 case certUsageEmailRecipient: | 1011 case certUsageEmailRecipient: |
1009 » flags = cert->trust->emailFlags; | 1012 » flags = trust.emailFlags; |
1010 if ( flags & CERTDB_TERMINAL_RECORD) { /* the trust record is | 1013 if ( flags & CERTDB_TERMINAL_RECORD) { /* the trust record is |
1011 * authoritative */ | 1014 * authoritative */ |
1012 if ( flags & CERTDB_TRUSTED ) { /* trust this cert */ | 1015 if ( flags & CERTDB_TRUSTED ) { /* trust this cert */ |
1013 *trusted = PR_TRUE; | 1016 *trusted = PR_TRUE; |
1014 return SECSuccess; | 1017 return SECSuccess; |
1015 } | 1018 } |
1016 else { /* don't trust this cert */ | 1019 else { /* don't trust this cert */ |
1017 *failedFlags = flags; | 1020 *failedFlags = flags; |
1018 return SECFailure; | 1021 return SECFailure; |
1019 } | 1022 } |
1020 } | 1023 } |
1021 | 1024 |
1022 break; | 1025 break; |
1023 case certUsageObjectSigner: | 1026 case certUsageObjectSigner: |
1024 » flags = cert->trust->objectSigningFlags; | 1027 » flags = trust.objectSigningFlags; |
1025 | 1028 |
1026 if ( flags & CERTDB_TERMINAL_RECORD) { /* the trust record is | 1029 if ( flags & CERTDB_TERMINAL_RECORD) { /* the trust record is |
1027 * authoritative */ | 1030 * authoritative */ |
1028 if ( flags & CERTDB_TRUSTED ) { /* trust this cert */ | 1031 if ( flags & CERTDB_TRUSTED ) { /* trust this cert */ |
1029 *trusted = PR_TRUE; | 1032 *trusted = PR_TRUE; |
1030 return SECSuccess; | 1033 return SECSuccess; |
1031 } else { /* don't trust this cert */ | 1034 } else { /* don't trust this cert */ |
1032 *failedFlags = flags; | 1035 *failedFlags = flags; |
1033 return SECFailure; | 1036 return SECFailure; |
1034 } | 1037 } |
1035 } | 1038 } |
1036 break; | 1039 break; |
1037 case certUsageVerifyCA: | 1040 case certUsageVerifyCA: |
1038 case certUsageStatusResponder: | 1041 case certUsageStatusResponder: |
1039 » flags = cert->trust->sslFlags; | 1042 » flags = trust.sslFlags; |
1040 /* is the cert directly trusted or not trusted ? */ | 1043 /* is the cert directly trusted or not trusted ? */ |
1041 if ( ( flags & ( CERTDB_VALID_CA | CERTDB_TRUSTED_CA ) ) == | 1044 if ( ( flags & ( CERTDB_VALID_CA | CERTDB_TRUSTED_CA ) ) == |
1042 ( CERTDB_VALID_CA | CERTDB_TRUSTED_CA ) ) { | 1045 ( CERTDB_VALID_CA | CERTDB_TRUSTED_CA ) ) { |
1043 *trusted = PR_TRUE; | 1046 *trusted = PR_TRUE; |
1044 return SECSuccess; | 1047 return SECSuccess; |
1045 } | 1048 } |
1046 » flags = cert->trust->emailFlags; | 1049 » flags = trust.emailFlags; |
1047 /* is the cert directly trusted or not trusted ? */ | 1050 /* is the cert directly trusted or not trusted ? */ |
1048 if ( ( flags & ( CERTDB_VALID_CA | CERTDB_TRUSTED_CA ) ) == | 1051 if ( ( flags & ( CERTDB_VALID_CA | CERTDB_TRUSTED_CA ) ) == |
1049 ( CERTDB_VALID_CA | CERTDB_TRUSTED_CA ) ) { | 1052 ( CERTDB_VALID_CA | CERTDB_TRUSTED_CA ) ) { |
1050 *trusted = PR_TRUE; | 1053 *trusted = PR_TRUE; |
1051 return SECSuccess; | 1054 return SECSuccess; |
1052 } | 1055 } |
1053 » flags = cert->trust->objectSigningFlags; | 1056 » flags = trust.objectSigningFlags; |
1054 /* is the cert directly trusted or not trusted ? */ | 1057 /* is the cert directly trusted or not trusted ? */ |
1055 if ( ( flags & ( CERTDB_VALID_CA | CERTDB_TRUSTED_CA ) ) == | 1058 if ( ( flags & ( CERTDB_VALID_CA | CERTDB_TRUSTED_CA ) ) == |
1056 ( CERTDB_VALID_CA | CERTDB_TRUSTED_CA ) ) { | 1059 ( CERTDB_VALID_CA | CERTDB_TRUSTED_CA ) ) { |
1057 *trusted = PR_TRUE; | 1060 *trusted = PR_TRUE; |
1058 return SECSuccess; | 1061 return SECSuccess; |
1059 } | 1062 } |
1060 /* fall through to test distrust */ | 1063 /* fall through to test distrust */ |
1061 case certUsageAnyCA: | 1064 case certUsageAnyCA: |
1062 case certUsageUserCertImport: | 1065 case certUsageUserCertImport: |
1063 /* do we distrust these certs explicitly */ | 1066 /* do we distrust these certs explicitly */ |
1064 » flags = cert->trust->sslFlags; | 1067 » flags = trust.sslFlags; |
1065 if ( flags & CERTDB_TERMINAL_RECORD) { /* the trust record is | 1068 if ( flags & CERTDB_TERMINAL_RECORD) { /* the trust record is |
1066 * authoritative */ | 1069 * authoritative */ |
1067 if ((flags & (CERTDB_TRUSTED|CERTDB_TRUSTED_CA)) == 0) { | 1070 if ((flags & (CERTDB_TRUSTED|CERTDB_TRUSTED_CA)) == 0) { |
1068 *failedFlags = flags; | 1071 *failedFlags = flags; |
1069 return SECFailure; | 1072 return SECFailure; |
1070 } | 1073 } |
1071 } | 1074 } |
1072 » flags = cert->trust->emailFlags; | 1075 » flags = trust.emailFlags; |
1073 if ( flags & CERTDB_TERMINAL_RECORD) { /* the trust record is | 1076 if ( flags & CERTDB_TERMINAL_RECORD) { /* the trust record is |
1074 * authoritative */ | 1077 * authoritative */ |
1075 if ((flags & (CERTDB_TRUSTED|CERTDB_TRUSTED_CA)) == 0) { | 1078 if ((flags & (CERTDB_TRUSTED|CERTDB_TRUSTED_CA)) == 0) { |
1076 *failedFlags = flags; | 1079 *failedFlags = flags; |
1077 return SECFailure; | 1080 return SECFailure; |
1078 } | 1081 } |
1079 } | 1082 } |
1080 /* fall through */ | 1083 /* fall through */ |
1081 case certUsageProtectedObjectSigner: | 1084 case certUsageProtectedObjectSigner: |
1082 » flags = cert->trust->objectSigningFlags; | 1085 » flags = trust.objectSigningFlags; |
1083 if ( flags & CERTDB_TERMINAL_RECORD) { /* the trust record is | 1086 if ( flags & CERTDB_TERMINAL_RECORD) { /* the trust record is |
1084 * authoritative */ | 1087 * authoritative */ |
1085 if ((flags & (CERTDB_TRUSTED|CERTDB_TRUSTED_CA)) == 0) { | 1088 if ((flags & (CERTDB_TRUSTED|CERTDB_TRUSTED_CA)) == 0) { |
1086 *failedFlags = flags; | 1089 *failedFlags = flags; |
1087 return SECFailure; | 1090 return SECFailure; |
1088 } | 1091 } |
1089 } | 1092 } |
1090 break; | 1093 break; |
1091 } | 1094 } |
1092 } | 1095 } |
(...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1423 * certUsageObjectSigner | 1426 * certUsageObjectSigner |
1424 */ | 1427 */ |
1425 | 1428 |
1426 CERTCertificate * | 1429 CERTCertificate * |
1427 CERT_FindMatchingCert(CERTCertDBHandle *handle, SECItem *derName, | 1430 CERT_FindMatchingCert(CERTCertDBHandle *handle, SECItem *derName, |
1428 CERTCertOwner owner, SECCertUsage usage, | 1431 CERTCertOwner owner, SECCertUsage usage, |
1429 PRBool preferTrusted, int64 validTime, PRBool validOnly) | 1432 PRBool preferTrusted, int64 validTime, PRBool validOnly) |
1430 { | 1433 { |
1431 CERTCertList *certList = NULL; | 1434 CERTCertList *certList = NULL; |
1432 CERTCertificate *cert = NULL; | 1435 CERTCertificate *cert = NULL; |
| 1436 CERTCertTrust certTrust; |
1433 unsigned int requiredTrustFlags; | 1437 unsigned int requiredTrustFlags; |
1434 SECTrustType requiredTrustType; | 1438 SECTrustType requiredTrustType; |
1435 unsigned int flags; | 1439 unsigned int flags; |
1436 | 1440 |
1437 PRBool lookingForCA = PR_FALSE; | 1441 PRBool lookingForCA = PR_FALSE; |
1438 SECStatus rv; | 1442 SECStatus rv; |
1439 CERTCertListNode *node; | 1443 CERTCertListNode *node; |
1440 CERTCertificate *saveUntrustedCA = NULL; | 1444 CERTCertificate *saveUntrustedCA = NULL; |
1441 | 1445 |
1442 /* if preferTrusted is set, must be a CA cert */ | 1446 /* if preferTrusted is set, must be a CA cert */ |
(...skipping 21 matching lines...) Expand all Loading... |
1464 | 1468 |
1465 node = CERT_LIST_HEAD(certList); | 1469 node = CERT_LIST_HEAD(certList); |
1466 | 1470 |
1467 while ( !CERT_LIST_END(node, certList) ) { | 1471 while ( !CERT_LIST_END(node, certList) ) { |
1468 cert = node->cert; | 1472 cert = node->cert; |
1469 | 1473 |
1470 /* looking for a trusted CA cert */ | 1474 /* looking for a trusted CA cert */ |
1471 if ( ( owner == certOwnerCA ) && preferTrusted && | 1475 if ( ( owner == certOwnerCA ) && preferTrusted && |
1472 ( requiredTrustType != trustTypeNone ) ) { | 1476 ( requiredTrustType != trustTypeNone ) ) { |
1473 | 1477 |
1474 » » if ( cert->trust == NULL ) { | 1478 » » if ( CERT_GetCertTrust(cert, &certTrust) != SECSuccess ) { |
1475 flags = 0; | 1479 flags = 0; |
1476 } else { | 1480 } else { |
1477 » » flags = SEC_GET_TRUST_FLAGS(cert->trust, requiredTrustType); | 1481 » » flags = SEC_GET_TRUST_FLAGS(&certTrust, requiredTrustType); |
1478 } | 1482 } |
1479 | 1483 |
1480 if ( ( flags & requiredTrustFlags ) != requiredTrustFlags ) { | 1484 if ( ( flags & requiredTrustFlags ) != requiredTrustFlags ) { |
1481 /* cert is not trusted */ | 1485 /* cert is not trusted */ |
1482 /* if this is the first cert to get this far, then save | 1486 /* if this is the first cert to get this far, then save |
1483 * it, so we can use it if we can't find a trusted one | 1487 * it, so we can use it if we can't find a trusted one |
1484 */ | 1488 */ |
1485 if ( saveUntrustedCA == NULL ) { | 1489 if ( saveUntrustedCA == NULL ) { |
1486 saveUntrustedCA = cert; | 1490 saveUntrustedCA = cert; |
1487 } | 1491 } |
(...skipping 371 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1859 return chain; | 1863 return chain; |
1860 } | 1864 } |
1861 | 1865 |
1862 cert = CERT_FindCertIssuer(cert, time, usage); | 1866 cert = CERT_FindCertIssuer(cert, time, usage); |
1863 } | 1867 } |
1864 | 1868 |
1865 /* return partial chain */ | 1869 /* return partial chain */ |
1866 PORT_SetError(SEC_ERROR_UNKNOWN_ISSUER); | 1870 PORT_SetError(SEC_ERROR_UNKNOWN_ISSUER); |
1867 return chain; | 1871 return chain; |
1868 } | 1872 } |
OLD | NEW |