1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file. 4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/quic/crypto/channel_id_chromium.h" 6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <string> 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/stl_util.h" 10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/strings/string_util.h" 11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "crypto/ec_private_key.h" 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "crypto/ec_signature_creator.h" 13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/base/net_errors.h" 14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/cert/asn1_util.h" 155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "net/ssl/channel_id_service.h" 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace net { 18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 19116680a4aac90f2aa7413d9095a592090648e557Ben MurdochChannelIDKeyChromium::ChannelIDKeyChromium( 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch crypto::ECPrivateKey* ec_private_key) 21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : ec_private_key_(ec_private_key) {} 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 23116680a4aac90f2aa7413d9095a592090648e557Ben MurdochChannelIDKeyChromium::~ChannelIDKeyChromium() {} 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 25116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool ChannelIDKeyChromium::Sign(base::StringPiece signed_data, 26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::string* out_signature) const { 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<crypto::ECSignatureCreator> sig_creator( 28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch crypto::ECSignatureCreator::Create(ec_private_key_.get())); 29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!sig_creator) { 30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return false; 31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const size_t len1 = strlen(ChannelIDVerifier::kContextStr) + 1; 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const size_t len2 = strlen(ChannelIDVerifier::kClientToServerStr) + 1; 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::vector<uint8> data(len1 + len2 + signed_data.size()); 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch memcpy(&data[0], ChannelIDVerifier::kContextStr, len1); 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch memcpy(&data[len1], ChannelIDVerifier::kClientToServerStr, len2); 37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch memcpy(&data[len1 + len2], signed_data.data(), signed_data.size()); 38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::vector<uint8> der_signature; 39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!sig_creator->Sign(&data[0], data.size(), &der_signature)) { 40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return false; 41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::vector<uint8> raw_signature; 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!sig_creator->DecodeSignature(der_signature, &raw_signature)) { 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return false; 45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch memcpy(WriteInto(out_signature, raw_signature.size() + 1), 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch &raw_signature[0], raw_signature.size()); 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return true; 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdochstd::string ChannelIDKeyChromium::SerializeKey() const { 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::string out_key; 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!ec_private_key_->ExportRawPublicKey(&out_key)) { 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return std::string(); 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return out_key; 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// A Job handles the lookup of a single channel ID. It is owned by the 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// ChannelIDSource. If the operation can not complete synchronously, it will 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// notify the ChannelIDSource upon completion. 62116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass ChannelIDSourceChromium::Job { 63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public: 64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Job(ChannelIDSourceChromium* channel_id_source, 655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ChannelIDService* channel_id_service); 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Starts the channel ID lookup. If |QUIC_PENDING| is returned, then 68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // |callback| will be invoked asynchronously when the operation completes. 69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch QuicAsyncStatus GetChannelIDKey(const std::string& hostname, 70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<ChannelIDKey>* channel_id_key, 71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ChannelIDSourceCallback* callback); 72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private: 74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch enum State { 75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch STATE_NONE, 76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch STATE_GET_CHANNEL_ID_KEY, 77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch STATE_GET_CHANNEL_ID_KEY_COMPLETE, 78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch }; 79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int DoLoop(int last_io_result); 81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void OnIOComplete(int result); 82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int DoGetChannelIDKey(int result); 83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int DoGetChannelIDKeyComplete(int result); 84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Channel ID source to notify when this jobs completes. 86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ChannelIDSourceChromium* const channel_id_source_; 87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ChannelIDService* const channel_id_service_; 89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::string channel_id_private_key_; 91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::string channel_id_cert_; 925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ChannelIDService::RequestHandle channel_id_request_handle_; 93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // |hostname| specifies the hostname for which we need a channel ID. 95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::string hostname_; 96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<ChannelIDSourceCallback> callback_; 98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<ChannelIDKey> channel_id_key_; 100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch State next_state_; 102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DISALLOW_COPY_AND_ASSIGN(Job); 104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}; 105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 106116680a4aac90f2aa7413d9095a592090648e557Ben MurdochChannelIDSourceChromium::Job::Job( 107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ChannelIDSourceChromium* channel_id_source, 1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ChannelIDService* channel_id_service) 109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : channel_id_source_(channel_id_source), 1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) channel_id_service_(channel_id_service), 111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch next_state_(STATE_NONE) { 112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 114116680a4aac90f2aa7413d9095a592090648e557Ben MurdochQuicAsyncStatus ChannelIDSourceChromium::Job::GetChannelIDKey( 115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& hostname, 116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<ChannelIDKey>* channel_id_key, 117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ChannelIDSourceCallback* callback) { 118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(channel_id_key); 119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(callback); 120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (STATE_NONE != next_state_) { 122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DLOG(DFATAL) << "GetChannelIDKey has begun"; 123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return QUIC_FAILURE; 124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch channel_id_key_.reset(); 127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch hostname_ = hostname; 129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch next_state_ = STATE_GET_CHANNEL_ID_KEY; 131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch switch (DoLoop(OK)) { 132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case OK: 133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch channel_id_key->reset(channel_id_key_.release()); 134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return QUIC_SUCCESS; 135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ERR_IO_PENDING: 136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch callback_.reset(callback); 137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return QUIC_PENDING; 138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch default: 139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch channel_id_key->reset(); 140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return QUIC_FAILURE; 141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 144116680a4aac90f2aa7413d9095a592090648e557Ben Murdochint ChannelIDSourceChromium::Job::DoLoop(int last_result) { 145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int rv = last_result; 146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch do { 147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch State state = next_state_; 148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch next_state_ = STATE_NONE; 149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch switch (state) { 150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case STATE_GET_CHANNEL_ID_KEY: 151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(rv == OK); 152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch rv = DoGetChannelIDKey(rv); 153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case STATE_GET_CHANNEL_ID_KEY_COMPLETE: 155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch rv = DoGetChannelIDKeyComplete(rv); 156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case STATE_NONE: 158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch default: 159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch rv = ERR_UNEXPECTED; 160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch LOG(DFATAL) << "unexpected state " << state; 161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } while (rv != ERR_IO_PENDING && next_state_ != STATE_NONE); 164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return rv; 165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 167116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ChannelIDSourceChromium::Job::OnIOComplete(int result) { 168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int rv = DoLoop(result); 169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (rv != ERR_IO_PENDING) { 170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<ChannelIDSourceCallback> callback(callback_.release()); 171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch callback->Run(&channel_id_key_); 172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Will delete |this|. 173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch channel_id_source_->OnJobComplete(this); 174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 177116680a4aac90f2aa7413d9095a592090648e557Ben Murdochint ChannelIDSourceChromium::Job::DoGetChannelIDKey(int result) { 178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch next_state_ = STATE_GET_CHANNEL_ID_KEY_COMPLETE; 179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return channel_id_service_->GetOrCreateChannelID( 181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch hostname_, 182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch &channel_id_private_key_, 183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch &channel_id_cert_, 184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(&ChannelIDSourceChromium::Job::OnIOComplete, 185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Unretained(this)), 186116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch &channel_id_request_handle_); 187116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 188116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 189116680a4aac90f2aa7413d9095a592090648e557Ben Murdochint ChannelIDSourceChromium::Job::DoGetChannelIDKeyComplete(int result) { 190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK_EQ(STATE_NONE, next_state_); 191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (result != OK) { 192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DLOG(WARNING) << "Failed to look up channel ID: " << ErrorToString(result); 193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return result; 194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 195116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 196116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::vector<uint8> encrypted_private_key_info( 197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch channel_id_private_key_.size()); 198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch memcpy(&encrypted_private_key_info[0], channel_id_private_key_.data(), 199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch channel_id_private_key_.size()); 200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::StringPiece spki_piece; 202116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!asn1::ExtractSPKIFromDERCert(channel_id_cert_, &spki_piece)) { 203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return ERR_UNEXPECTED; 204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::vector<uint8> subject_public_key_info(spki_piece.size()); 206116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch memcpy(&subject_public_key_info[0], spki_piece.data(), spki_piece.size()); 207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch crypto::ECPrivateKey* ec_private_key = 209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch crypto::ECPrivateKey::CreateFromEncryptedPrivateKeyInfo( 2105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ChannelIDService::kEPKIPassword, encrypted_private_key_info, 211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch subject_public_key_info); 212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!ec_private_key) { 213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(wtc): use the new error code ERR_CHANNEL_ID_IMPORT_FAILED to be 214116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // added in https://codereview.chromium.org/338093012/. 215116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return ERR_UNEXPECTED; 216116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch channel_id_key_.reset(new ChannelIDKeyChromium(ec_private_key)); 218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return result; 220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 221116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 222116680a4aac90f2aa7413d9095a592090648e557Ben MurdochChannelIDSourceChromium::ChannelIDSourceChromium( 2235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ChannelIDService* channel_id_service) 2245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) : channel_id_service_(channel_id_service) { 225116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 226116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 227116680a4aac90f2aa7413d9095a592090648e557Ben MurdochChannelIDSourceChromium::~ChannelIDSourceChromium() { 228116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch STLDeleteElements(&active_jobs_); 229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 231116680a4aac90f2aa7413d9095a592090648e557Ben MurdochQuicAsyncStatus ChannelIDSourceChromium::GetChannelIDKey( 232116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& hostname, 233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<ChannelIDKey>* channel_id_key, 234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ChannelIDSourceCallback* callback) { 2355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<Job> job(new Job(this, channel_id_service_)); 236116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch QuicAsyncStatus status = job->GetChannelIDKey(hostname, channel_id_key, 237116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch callback); 238116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (status == QUIC_PENDING) { 239116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch active_jobs_.insert(job.release()); 240116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 241116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return status; 242116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 243116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 244116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ChannelIDSourceChromium::OnJobComplete(Job* job) { 245116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch active_jobs_.erase(job); 246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch delete job; 247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 249116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace net 250