Chromium Code Reviews| Index: net/base/origin_bound_cert_service.cc |
| diff --git a/net/base/origin_bound_cert_service.cc b/net/base/origin_bound_cert_service.cc |
| index f86d82ce1537e8e5fb0e0e9dd4d858ebeedd4bad..27fb7fa15ddf21a73821b44759f295785cbeaa9d 100644 |
| --- a/net/base/origin_bound_cert_service.cc |
| +++ b/net/base/origin_bound_cert_service.cc |
| @@ -99,9 +99,11 @@ class OriginBoundCertServiceWorker { |
| OriginBoundCertServiceWorker( |
| const std::string& origin, |
| SSLClientCertType type, |
| + base::Time not_valid_after, |
| OriginBoundCertService* origin_bound_cert_service) |
| : origin_(origin), |
| type_(type), |
| + not_valid_after_(not_valid_after), |
| serial_number_(base::RandInt(0, std::numeric_limits<int>::max())), |
| origin_loop_(MessageLoop::current()), |
| origin_bound_cert_service_(origin_bound_cert_service), |
| @@ -132,6 +134,7 @@ class OriginBoundCertServiceWorker { |
| error_ = OriginBoundCertService::GenerateCert(origin_, |
| type_, |
| serial_number_, |
| + not_valid_after_, |
| &private_key_, |
| &cert_); |
| #if defined(USE_NSS) |
| @@ -157,8 +160,8 @@ class OriginBoundCertServiceWorker { |
| // memory leaks or worse errors. |
| base::AutoLock locked(lock_); |
| if (!canceled_) { |
| - origin_bound_cert_service_->HandleResult(origin_, error_, type_, |
| - private_key_, cert_); |
| + origin_bound_cert_service_->HandleResult( |
| + origin_, error_, type_, not_valid_after_, private_key_, cert_); |
| } |
| } |
| delete this; |
| @@ -191,6 +194,7 @@ class OriginBoundCertServiceWorker { |
| const std::string origin_; |
| const SSLClientCertType type_; |
| + const base::Time not_valid_after_; |
| // Note that serial_number_ must be initialized on a non-worker thread |
| // (see documentation for OriginBoundCertService::GenerateCert). |
| uint32 serial_number_; |
| @@ -320,20 +324,26 @@ int OriginBoundCertService::GetOriginBoundCert( |
| requests_++; |
| // Check if an origin bound cert of an acceptable type already exists for this |
| - // origin. |
| + // origin, and that it has not expired. |
| + base::Time now = base::Time::Now(); |
|
wtc
2011/12/14 02:03:39
For unit tests, we may want to provide a way to ov
|
| + base::Time not_valid_after; |
| if (origin_bound_cert_store_->GetOriginBoundCert(origin, |
| type, |
| + ¬_valid_after, |
| private_key, |
| cert)) { |
| - if (IsSupportedCertType(*type) && |
| - std::find(requested_types.begin(), requested_types.end(), *type) != |
| - requested_types.end()) { |
| + if (not_valid_after < now) { |
| + DVLOG(1) << "Cert store had expired cert for " << origin; |
| + } else if (!IsSupportedCertType(*type) || |
| + std::find(requested_types.begin(), requested_types.end(), |
| + *type) == requested_types.end()) { |
| + DVLOG(1) << "Cert store had cert of wrong type " << *type << " for " |
| + << origin; |
| + } else { |
| cert_store_hits_++; |
| *out_req = NULL; |
| return OK; |
| } |
| - DVLOG(1) << "Cert store had cert of wrong type " << *type << " for " |
| - << origin; |
| } |
| // |origin_bound_cert_store_| has no cert for this origin. See if an |
| @@ -361,8 +371,11 @@ int OriginBoundCertService::GetOriginBoundCert( |
| inflight_joins_++; |
| } else { |
| // Need to make a new request. |
| - OriginBoundCertServiceWorker* worker = |
| - new OriginBoundCertServiceWorker(origin, preferred_type, this); |
| + OriginBoundCertServiceWorker* worker = new OriginBoundCertServiceWorker( |
| + origin, |
| + preferred_type, |
| + now + base::TimeDelta::FromDays(kValidityPeriodInDays), |
|
wtc
2011/12/15 03:18:51
It doesn't seem necessary to pass not_valid_after
mattm
2011/12/20 00:28:38
Done.
|
| + this); |
| job = new OriginBoundCertServiceJob(worker, preferred_type); |
| if (!worker->Start()) { |
| delete job; |
| @@ -386,6 +399,7 @@ int OriginBoundCertService::GetOriginBoundCert( |
| int OriginBoundCertService::GenerateCert(const std::string& origin, |
| SSLClientCertType type, |
| uint32 serial_number, |
| + base::Time not_valid_after, |
| std::string* private_key, |
| std::string* cert) { |
| std::string der_cert; |
| @@ -402,7 +416,7 @@ int OriginBoundCertService::GenerateCert(const std::string& origin, |
| key.get(), |
| origin, |
| serial_number, |
| - base::TimeDelta::FromDays(kValidityPeriodInDays), |
| + not_valid_after, |
|
wtc
2011/12/15 03:18:51
It seems that the GenerateCert method doesn't need
mattm
2011/12/20 00:28:38
Done.
|
| &der_cert)) { |
| DLOG(ERROR) << "Unable to create x509 cert for client"; |
| return ERR_ORIGIN_BOUND_CERT_GENERATION_FAILED; |
| @@ -424,7 +438,7 @@ int OriginBoundCertService::GenerateCert(const std::string& origin, |
| key.get(), |
| origin, |
| serial_number, |
| - base::TimeDelta::FromDays(kValidityPeriodInDays), |
| + not_valid_after, |
| &der_cert)) { |
| DLOG(ERROR) << "Unable to create x509 cert for client"; |
| return ERR_ORIGIN_BOUND_CERT_GENERATION_FAILED; |
| @@ -463,11 +477,13 @@ void OriginBoundCertService::CancelRequest(RequestHandle req) { |
| void OriginBoundCertService::HandleResult(const std::string& origin, |
| int error, |
| SSLClientCertType type, |
| + base::Time not_valid_after, |
| const std::string& private_key, |
| const std::string& cert) { |
| DCHECK(CalledOnValidThread()); |
| - origin_bound_cert_store_->SetOriginBoundCert(origin, type, private_key, cert); |
| + origin_bound_cert_store_->SetOriginBoundCert( |
| + origin, type, not_valid_after, private_key, cert); |
| std::map<std::string, OriginBoundCertServiceJob*>::iterator j; |
| j = inflight_.find(origin); |