15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2010 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NET_BASE_OPENSSL_PRIVATE_KEY_STORE_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NET_BASE_OPENSSL_PRIVATE_KEY_STORE_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Avoid including <openssl/evp.h>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct evp_pkey_st EVP_PKEY;
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/net_export.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GURL;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class X509Certificate;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// OpenSSLPrivateKeyStore provides an interface for storing
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// public/private key pairs to system storage on platforms where
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// OpenSSL is used.
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This class shall only be used from the network thread.
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NET_EXPORT OpenSSLPrivateKeyStore {
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called to permanently store a private/public key pair, generated
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // via <keygen> while visiting |url|, to an appropriate system
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // location. Increments |pkey|'s reference count, so the caller is still
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // responsible for calling EVP_PKEY_free on it.
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |url| is the corresponding server URL.
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |pkey| is the key pair handle.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns false if an error occurred whilst attempting to store the key.
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static bool StoreKeyPair(const GURL& url, EVP_PKEY* pkey);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Checks that the private key for a given public key is installed.
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |pub_key| a public key.
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns true if there is a private key that was previously
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // recorded through StoreKeyPair().
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // NOTE: Intentionally not implemented on Android because there is no
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // platform API that can perform this operation silently.
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static bool HasPrivateKey(EVP_PKEY* pub_key);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OpenSSLPrivateKeyStore();  // not implemented.
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ~OpenSSLPrivateKeyStore();  // not implemented.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(OpenSSLPrivateKeyStore);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // NET_BASE_OPENSSL_PRIVATE_KEY_STORE_H_
54