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