12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef NET_QUIC_CRYPTO_KEY_EXCHANGE_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define NET_QUIC_CRYPTO_KEY_EXCHANGE_H_
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_piece.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/net_export.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/crypto/crypto_protocol.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace net {
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)class QuicRandom;
17b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// KeyExchange is an abstract class that provides an interface to a
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// key-exchange primitive.
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NET_EXPORT_PRIVATE KeyExchange {
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
22b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual ~KeyExchange() {}
23b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
24b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // NewKeyPair generates a new public, private key pair. The caller takes
25b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // ownership of the return value. (This is intended for servers that need to
26b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // generate forward-secure keys.)
27b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual KeyExchange* NewKeyPair(QuicRandom* rand) const = 0;
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // CalculateSharedKey computes the shared key between the local private key
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // (which is implicitly known by a KeyExchange object) and a public value
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // from the peer.
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool CalculateSharedKey(const base::StringPiece& peer_public_value,
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  std::string* shared_key) const = 0;
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // public_value returns the local public key which can be sent to a peer in
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // order to complete a key exchange. The returned StringPiece is a reference
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // to a member of the KeyExchange and is only valid for as long as the
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // KeyExchange exists.
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual base::StringPiece public_value() const = 0;
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // tag returns the tag value that identifies this key exchange function.
42b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual QuicTag tag() const = 0;
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace net
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // NET_QUIC_CRYPTO_KEY_EXCHANGE_H_
48