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_CURVE25519_KEY_EXCHANGE_H_
6#define NET_QUIC_CRYPTO_CURVE25519_KEY_EXCHANGE_H_
7
8#include <string>
9
10#include "base/compiler_specific.h"
11#include "base/strings/string_piece.h"
12#include "net/base/net_export.h"
13#include "net/quic/crypto/key_exchange.h"
14
15namespace net {
16
17class QuicRandom;
18
19// Curve25519KeyExchange implements a KeyExchange using elliptic-curve
20// Diffie-Hellman on curve25519. See http://cr.yp.to/ecdh.html
21class NET_EXPORT_PRIVATE Curve25519KeyExchange : public KeyExchange {
22 public:
23  virtual ~Curve25519KeyExchange();
24
25  // New creates a new object from a private key. If the private key is
26  // invalid, NULL is returned.
27  static Curve25519KeyExchange* New(const base::StringPiece& private_key);
28
29  // NewPrivateKey returns a private key, generated from |rand|, suitable for
30  // passing to |New|.
31  static std::string NewPrivateKey(QuicRandom* rand);
32
33  // KeyExchange interface.
34  virtual KeyExchange* NewKeyPair(QuicRandom* rand) const OVERRIDE;
35  virtual bool CalculateSharedKey(const base::StringPiece& peer_public_value,
36                                  std::string* shared_key) const OVERRIDE;
37  virtual base::StringPiece public_value() const OVERRIDE;
38  virtual QuicTag tag() const OVERRIDE;
39
40 private:
41  Curve25519KeyExchange();
42
43  uint8 private_key_[32];
44  uint8 public_key_[32];
45};
46
47}  // namespace net
48
49#endif  // NET_QUIC_CRYPTO_CURVE25519_KEY_EXCHANGE_H_
50