1// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef NET_QUIC_CRYPTO_CRYPTO_SERVER_CONFIG_PROTOBUF_H_
6#define NET_QUIC_CRYPTO_CRYPTO_SERVER_CONFIG_PROTOBUF_H_
7
8#include <string>
9#include <vector>
10
11#include "base/logging.h"
12#include "base/stl_util.h"
13#include "base/strings/string_piece.h"
14#include "net/base/net_export.h"
15#include "net/quic/crypto/crypto_protocol.h"
16
17namespace net {
18
19// QuicServerConfigProtobuf contains QUIC server config block and the private
20// keys needed to prove ownership.
21// TODO(rch): sync with server more rationally.
22class NET_EXPORT_PRIVATE QuicServerConfigProtobuf {
23 public:
24  // PrivateKey contains a QUIC tag of a key exchange algorithm and a
25  // serialised private key for that algorithm. The format of the serialised
26  // private key is specific to the algorithm in question.
27  class NET_EXPORT_PRIVATE PrivateKey {
28   public:
29    QuicTag tag() const {
30      return tag_;
31    }
32    void set_tag(QuicTag tag) {
33      tag_ = tag;
34    }
35    std::string private_key() const {
36      return private_key_;
37    }
38    void set_private_key(std::string key) {
39      private_key_ = key;
40    }
41
42   private:
43    QuicTag tag_;
44    std::string private_key_;
45  };
46
47  QuicServerConfigProtobuf();
48  ~QuicServerConfigProtobuf();
49
50  size_t key_size() const {
51    return keys_.size();
52  }
53
54  const PrivateKey& key(size_t i) const {
55    DCHECK_GT(keys_.size(), i);
56    return *keys_[i];
57  }
58
59  std::string config() const {
60    return config_;
61  }
62
63  void set_config(base::StringPiece config) {
64    config_ = config.as_string();
65  }
66
67  QuicServerConfigProtobuf::PrivateKey* add_key() {
68    keys_.push_back(new PrivateKey);
69    return keys_.back();
70  }
71
72  void clear_key() {
73    STLDeleteElements(&keys_);
74  }
75
76  bool has_primary_time() const {
77    return primary_time_ > 0;
78  }
79
80  int64 primary_time() const {
81    return primary_time_;
82  }
83
84  void set_primary_time(int64 primary_time) {
85    primary_time_ = primary_time;
86  }
87
88 private:
89  std::vector<PrivateKey*> keys_;
90
91  // config_ is a serialised config in QUIC wire format.
92  std::string config_;
93
94  // primary_time_ contains a UNIX epoch seconds value that indicates when this
95  // config should become primary.
96  int64 primary_time_;
97};
98
99}  // namespace net
100
101#endif  // NET_QUIC_CRYPTO_CRYPTO_SERVER_CONFIG_PROTOBUF_H_
102