// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef NET_BASE_OPENSSL_PRIVATE_KEY_STORE_H_
#define NET_BASE_OPENSSL_PRIVATE_KEY_STORE_H_

#include <vector>

// Avoid including <openssl/evp.h>
typedef struct evp_pkey_st EVP_PKEY;

#include "base/basictypes.h"
#include "net/base/net_export.h"

class GURL;

namespace net {

class X509Certificate;

// OpenSSLPrivateKeyStore provides an interface for storing
// public/private key pairs to system storage on platforms where
// OpenSSL is used.
// This class shall only be used from the network thread.
class NET_EXPORT OpenSSLPrivateKeyStore {
 public:
  // Called to permanently store a private/public key pair, generated
  // via <keygen> while visiting |url|, to an appropriate system
  // location. Increments |pkey|'s reference count, so the caller is still
  // responsible for calling EVP_PKEY_free on it.
  // |url| is the corresponding server URL.
  // |pkey| is the key pair handle.
  // Returns false if an error occurred whilst attempting to store the key.
  static bool StoreKeyPair(const GURL& url, EVP_PKEY* pkey);

  // Checks that the private key for a given public key is installed.
  // |pub_key| a public key.
  // Returns true if there is a private key that was previously
  // recorded through StoreKeyPair().
  // NOTE: Intentionally not implemented on Android because there is no
  // platform API that can perform this operation silently.
  static bool HasPrivateKey(EVP_PKEY* pub_key);

 private:
  OpenSSLPrivateKeyStore();  // not implemented.
  ~OpenSSLPrivateKeyStore();  // not implemented.
  DISALLOW_COPY_AND_ASSIGN(OpenSSLPrivateKeyStore);
};

} // namespace net

#endif  // NET_BASE_OPENSSL_PRIVATE_KEY_STORE_H_
