| // Copyright (c) 2013 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_ANDROID_KEYSTORE_H_ | 
 | #define NET_ANDROID_KEYSTORE_H_ | 
 |  | 
 | #include <jni.h> | 
 |  | 
 | #include <string> | 
 | #include <vector> | 
 |  | 
 | #include "base/android/scoped_java_ref.h" | 
 | #include "base/containers/span.h" | 
 | #include "base/strings/string_piece.h" | 
 | #include "net/ssl/ssl_client_cert_type.h" | 
 | #include "starboard/types.h" | 
 |  | 
 | // Misc functions to access the Android platform KeyStore. | 
 |  | 
 | namespace net { | 
 | namespace android { | 
 |  | 
 | struct AndroidEVP_PKEY; | 
 |  | 
 | // Define a list of constants describing private key types. The | 
 | // values are shared with Java through org.chromium.net.PrivateKeyType. | 
 | // Example: PRIVATE_KEY_TYPE_RSA. | 
 | // | 
 | // A Java counterpart will be generated for this enum. | 
 | // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.net | 
 | enum PrivateKeyType { | 
 |   PRIVATE_KEY_TYPE_RSA = 0, | 
 |   // Obsolete: PRIVATE_KEY_TYPE_DSA = 1, | 
 |   PRIVATE_KEY_TYPE_ECDSA = 2, | 
 |   PRIVATE_KEY_TYPE_INVALID = 255, | 
 | }; | 
 |  | 
 | // Compute the signature of a given input using a private key. For more | 
 | // details, please read the comments for the signWithPrivateKey method in | 
 | // AndroidKeyStore.java. | 
 | // | 
 | // |private_key| is a JNI reference for the private key. | 
 | // |algorithm| is the name of the algorithm to sign. | 
 | // |input| is the input to sign. | 
 | // |signature| will receive the signature on success. | 
 | // Returns true on success, false on failure. | 
 | bool SignWithPrivateKey(const base::android::JavaRef<jobject>& private_key, | 
 |                         base::StringPiece algorithm, | 
 |                         base::span<const uint8_t> input, | 
 |                         std::vector<uint8_t>* signature); | 
 |  | 
 | // Returns a handle to the system AndroidEVP_PKEY object used to back a given | 
 | // private_key object. This must *only* be used for RSA private keys on Android | 
 | // < 4.2. Technically, this is only guaranteed to work if the system image | 
 | // contains a vanilla implementation of the Java API frameworks based on Harmony | 
 | // + OpenSSL. | 
 | // | 
 | // |private_key| is a JNI reference for the private key. | 
 | // Returns an AndroidEVP_PKEY* handle, or NULL in case of error. | 
 | // | 
 | // Note: Despite its name and return type, this function doesn't know | 
 | //       anything about OpenSSL, it just type-casts a system pointer that | 
 | //       is passed as an int through JNI. As such, it never increments | 
 | //       the returned key's reference count. | 
 | AndroidEVP_PKEY* GetOpenSSLSystemHandleForPrivateKey( | 
 |     const base::android::JavaRef<jobject>& private_key); | 
 |  | 
 | // Returns a JNI reference to the OpenSSLEngine object which is used to back a | 
 | // given private_key object. This must *only* be used for RSA private keys on | 
 | // Android < 4.2. Technically, this is only guaranteed to work if the system | 
 | // image contains a vanilla implementation of the Java API frameworks based on | 
 | // Harmony + OpenSSL. | 
 | base::android::ScopedJavaLocalRef<jobject> GetOpenSSLEngineForPrivateKey( | 
 |     const base::android::JavaRef<jobject>& private_key); | 
 |  | 
 | }  // namespace android | 
 | }  // namespace net | 
 |  | 
 | #endif  // NET_ANDROID_KEYSTORE_H_ |