| 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 30 matching lines...) Expand all Loading... |
| 41 #include <cert.h> | 41 #include <cert.h> |
| 42 #include <certdb.h> | 42 #include <certdb.h> |
| 43 #include <pk11pub.h> | 43 #include <pk11pub.h> |
| 44 #include <secerr.h> | 44 #include <secerr.h> |
| 45 | 45 |
| 46 #include "base/logging.h" | 46 #include "base/logging.h" |
| 47 #include "crypto/nss_util_internal.h" | 47 #include "crypto/nss_util_internal.h" |
| 48 #include "crypto/scoped_nss_types.h" | 48 #include "crypto/scoped_nss_types.h" |
| 49 #include "net/base/net_errors.h" | 49 #include "net/base/net_errors.h" |
| 50 #include "net/cert/x509_certificate.h" | 50 #include "net/cert/x509_certificate.h" |
| 51 #include "net/cert/x509_util_nss.h" |
| 51 | 52 |
| 52 #if !defined(CERTDB_TERMINAL_RECORD) | 53 #if !defined(CERTDB_TERMINAL_RECORD) |
| 53 /* NSS 3.13 renames CERTDB_VALID_PEER to CERTDB_TERMINAL_RECORD | 54 /* NSS 3.13 renames CERTDB_VALID_PEER to CERTDB_TERMINAL_RECORD |
| 54 * and marks CERTDB_VALID_PEER as deprecated. | 55 * and marks CERTDB_VALID_PEER as deprecated. |
| 55 * If we're using an older version, rename it ourselves. | 56 * If we're using an older version, rename it ourselves. |
| 56 */ | 57 */ |
| 57 #define CERTDB_TERMINAL_RECORD CERTDB_VALID_PEER | 58 #define CERTDB_TERMINAL_RECORD CERTDB_VALID_PEER |
| 58 #endif | 59 #endif |
| 59 | 60 |
| 60 namespace mozilla_security_manager { | 61 namespace mozilla_security_manager { |
| (...skipping 27 matching lines...) Expand all Loading... |
| 88 not_imported->push_back(net::NSSCertDatabase::ImportCertFailure( | 89 not_imported->push_back(net::NSSCertDatabase::ImportCertFailure( |
| 89 root, net::ERR_IMPORT_CERT_ALREADY_EXISTS)); | 90 root, net::ERR_IMPORT_CERT_ALREADY_EXISTS)); |
| 90 } else { | 91 } else { |
| 91 // Mozilla uses CERT_AddTempCertToPerm, however it is privately exported, | 92 // Mozilla uses CERT_AddTempCertToPerm, however it is privately exported, |
| 92 // and it doesn't take the slot as an argument either. Instead, we use | 93 // and it doesn't take the slot as an argument either. Instead, we use |
| 93 // PK11_ImportCert and CERT_ChangeCertTrust. | 94 // PK11_ImportCert and CERT_ChangeCertTrust. |
| 94 SECStatus srv = PK11_ImportCert( | 95 SECStatus srv = PK11_ImportCert( |
| 95 slot.get(), | 96 slot.get(), |
| 96 root->os_cert_handle(), | 97 root->os_cert_handle(), |
| 97 CK_INVALID_HANDLE, | 98 CK_INVALID_HANDLE, |
| 98 root->GetDefaultNickname(net::CA_CERT).c_str(), | 99 net::x509_util::GetUniqueNicknameForSlot( |
| 100 root->GetDefaultNickname(net::CA_CERT), |
| 101 &root->os_cert_handle()->derSubject, |
| 102 slot.get()).c_str(), |
| 99 PR_FALSE /* includeTrust (unused) */); | 103 PR_FALSE /* includeTrust (unused) */); |
| 100 if (srv != SECSuccess) { | 104 if (srv != SECSuccess) { |
| 101 LOG(ERROR) << "PK11_ImportCert failed with error " << PORT_GetError(); | 105 LOG(ERROR) << "PK11_ImportCert failed with error " << PORT_GetError(); |
| 102 return false; | 106 return false; |
| 103 } | 107 } |
| 104 if (!SetCertTrust(root, net::CA_CERT, trustBits)) | 108 if (!SetCertTrust(root, net::CA_CERT, trustBits)) |
| 105 return false; | 109 return false; |
| 106 } | 110 } |
| 107 | 111 |
| 108 PRTime now = PR_Now(); | 112 PRTime now = PR_Now(); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 145 VLOG(1) << "skipping cert (verify) " << PORT_GetError(); | 149 VLOG(1) << "skipping cert (verify) " << PORT_GetError(); |
| 146 continue; | 150 continue; |
| 147 } | 151 } |
| 148 | 152 |
| 149 // Mozilla uses CERT_ImportCerts, which doesn't take a slot arg. We use | 153 // Mozilla uses CERT_ImportCerts, which doesn't take a slot arg. We use |
| 150 // PK11_ImportCert instead. | 154 // PK11_ImportCert instead. |
| 151 SECStatus srv = PK11_ImportCert( | 155 SECStatus srv = PK11_ImportCert( |
| 152 slot.get(), | 156 slot.get(), |
| 153 cert->os_cert_handle(), | 157 cert->os_cert_handle(), |
| 154 CK_INVALID_HANDLE, | 158 CK_INVALID_HANDLE, |
| 155 cert->GetDefaultNickname(net::CA_CERT).c_str(), | 159 net::x509_util::GetUniqueNicknameForSlot( |
| 160 cert->GetDefaultNickname(net::CA_CERT), |
| 161 &cert->os_cert_handle()->derSubject, |
| 162 slot.get()).c_str(), |
| 156 PR_FALSE /* includeTrust (unused) */); | 163 PR_FALSE /* includeTrust (unused) */); |
| 157 if (srv != SECSuccess) { | 164 if (srv != SECSuccess) { |
| 158 LOG(ERROR) << "PK11_ImportCert failed with error " << PORT_GetError(); | 165 LOG(ERROR) << "PK11_ImportCert failed with error " << PORT_GetError(); |
| 159 // TODO(mattm): Should we bail or continue on error here? Mozilla doesn't | 166 // TODO(mattm): Should we bail or continue on error here? Mozilla doesn't |
| 160 // check error code at all. | 167 // check error code at all. |
| 161 not_imported->push_back(net::NSSCertDatabase::ImportCertFailure( | 168 not_imported->push_back(net::NSSCertDatabase::ImportCertFailure( |
| 162 cert, net::ERR_IMPORT_CA_CERT_FAILED)); | 169 cert, net::ERR_IMPORT_CA_CERT_FAILED)); |
| 163 } | 170 } |
| 164 } | 171 } |
| 165 | 172 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 183 | 190 |
| 184 for (size_t i = 0; i < certificates.size(); ++i) { | 191 for (size_t i = 0; i < certificates.size(); ++i) { |
| 185 const scoped_refptr<net::X509Certificate>& cert = certificates[i]; | 192 const scoped_refptr<net::X509Certificate>& cert = certificates[i]; |
| 186 | 193 |
| 187 // Mozilla uses CERT_ImportCerts, which doesn't take a slot arg. We use | 194 // Mozilla uses CERT_ImportCerts, which doesn't take a slot arg. We use |
| 188 // PK11_ImportCert instead. | 195 // PK11_ImportCert instead. |
| 189 SECStatus srv = PK11_ImportCert( | 196 SECStatus srv = PK11_ImportCert( |
| 190 slot.get(), | 197 slot.get(), |
| 191 cert->os_cert_handle(), | 198 cert->os_cert_handle(), |
| 192 CK_INVALID_HANDLE, | 199 CK_INVALID_HANDLE, |
| 193 cert->GetDefaultNickname(net::SERVER_CERT).c_str(), | 200 net::x509_util::GetUniqueNicknameForSlot( |
| 201 cert->GetDefaultNickname(net::SERVER_CERT), |
| 202 &cert->os_cert_handle()->derSubject, |
| 203 slot.get()).c_str(), |
| 194 PR_FALSE /* includeTrust (unused) */); | 204 PR_FALSE /* includeTrust (unused) */); |
| 195 if (srv != SECSuccess) { | 205 if (srv != SECSuccess) { |
| 196 LOG(ERROR) << "PK11_ImportCert failed with error " << PORT_GetError(); | 206 LOG(ERROR) << "PK11_ImportCert failed with error " << PORT_GetError(); |
| 197 not_imported->push_back(net::NSSCertDatabase::ImportCertFailure( | 207 not_imported->push_back(net::NSSCertDatabase::ImportCertFailure( |
| 198 cert, net::ERR_IMPORT_SERVER_CERT_FAILED)); | 208 cert, net::ERR_IMPORT_SERVER_CERT_FAILED)); |
| 199 continue; | 209 continue; |
| 200 } | 210 } |
| 201 } | 211 } |
| 202 | 212 |
| 203 SetCertTrust(certificates[0].get(), net::SERVER_CERT, trustBits); | 213 SetCertTrust(certificates[0].get(), net::SERVER_CERT, trustBits); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 268 } else { | 278 } else { |
| 269 // ignore user and email/unknown certs | 279 // ignore user and email/unknown certs |
| 270 return true; | 280 return true; |
| 271 } | 281 } |
| 272 if (srv != SECSuccess) | 282 if (srv != SECSuccess) |
| 273 LOG(ERROR) << "SetCertTrust failed with error " << PORT_GetError(); | 283 LOG(ERROR) << "SetCertTrust failed with error " << PORT_GetError(); |
| 274 return srv == SECSuccess; | 284 return srv == SECSuccess; |
| 275 } | 285 } |
| 276 | 286 |
| 277 } // namespace mozilla_security_manager | 287 } // namespace mozilla_security_manager |
| OLD | NEW |