network_library.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "net/android/network_library.h"
6
7#include "base/android/jni_android.h"
8#include "base/android/jni_array.h"
9#include "base/android/jni_string.h"
10#include "base/android/scoped_java_ref.h"
11#include "base/logging.h"
12#include "jni/AndroidNetworkLibrary_jni.h"
13
14using base::android::AttachCurrentThread;
15using base::android::ClearException;
16using base::android::ConvertJavaStringToUTF8;
17using base::android::ConvertUTF8ToJavaString;
18using base::android::GetApplicationContext;
19using base::android::ScopedJavaLocalRef;
20using base::android::ToJavaArrayOfByteArray;
21using base::android::ToJavaByteArray;
22
23namespace net {
24namespace android {
25
26CertVerifyResultAndroid VerifyX509CertChain(
27    const std::vector<std::string>& cert_chain,
28    const std::string& auth_type) {
29  JNIEnv* env = AttachCurrentThread();
30
31  ScopedJavaLocalRef<jobjectArray> chain_byte_array =
32      ToJavaArrayOfByteArray(env, cert_chain);
33  DCHECK(!chain_byte_array.is_null());
34
35  ScopedJavaLocalRef<jstring> auth_string =
36      ConvertUTF8ToJavaString(env, auth_type);
37  DCHECK(!auth_string.is_null());
38
39  jint result = Java_AndroidNetworkLibrary_verifyServerCertificates(
40      env, chain_byte_array.obj(), auth_string.obj());
41
42  return static_cast<CertVerifyResultAndroid>(result);
43}
44
45void AddTestRootCertificate(const uint8* cert, size_t len) {
46  JNIEnv* env = AttachCurrentThread();
47  ScopedJavaLocalRef<jbyteArray> cert_array = ToJavaByteArray(env, cert, len);
48  DCHECK(!cert_array.is_null());
49  Java_AndroidNetworkLibrary_addTestRootCertificate(env, cert_array.obj());
50}
51
52void ClearTestRootCertificates() {
53  JNIEnv* env = AttachCurrentThread();
54  Java_AndroidNetworkLibrary_clearTestRootCertificates(env);
55}
56
57bool StoreKeyPair(const uint8* public_key,
58                  size_t public_len,
59                  const uint8* private_key,
60                  size_t private_len) {
61  JNIEnv* env = AttachCurrentThread();
62  ScopedJavaLocalRef<jbyteArray> public_array =
63      ToJavaByteArray(env, public_key, public_len);
64  ScopedJavaLocalRef<jbyteArray> private_array =
65      ToJavaByteArray(env, private_key, private_len);
66  jboolean ret = Java_AndroidNetworkLibrary_storeKeyPair(env,
67      GetApplicationContext(), public_array.obj(), private_array.obj());
68  LOG_IF(WARNING, !ret) <<
69      "Call to Java_AndroidNetworkLibrary_storeKeyPair failed";
70  return ret;
71}
72
73void StoreCertificate(net::CertificateMimeType cert_type,
74                      const void* data,
75                      size_t data_len) {
76  JNIEnv* env = AttachCurrentThread();
77  ScopedJavaLocalRef<jbyteArray> data_array =
78      ToJavaByteArray(env, reinterpret_cast<const uint8*>(data), data_len);
79  jboolean ret = Java_AndroidNetworkLibrary_storeCertificate(env,
80      GetApplicationContext(), cert_type, data_array.obj());
81  LOG_IF(WARNING, !ret) <<
82      "Call to Java_AndroidNetworkLibrary_storeCertificate"
83      " failed";
84  // Intentionally do not return 'ret', there is little the caller can
85  // do in case of failure (the CertInstaller itself will deal with
86  // incorrect data and display the appropriate toast).
87}
88
89bool HaveOnlyLoopbackAddresses() {
90  JNIEnv* env = AttachCurrentThread();
91  return Java_AndroidNetworkLibrary_haveOnlyLoopbackAddresses(env);
92}
93
94std::string GetNetworkList() {
95  JNIEnv* env = AttachCurrentThread();
96  ScopedJavaLocalRef<jstring> ret =
97      Java_AndroidNetworkLibrary_getNetworkList(env);
98  return ConvertJavaStringToUTF8(ret);
99}
100
101bool GetMimeTypeFromExtension(const std::string& extension,
102                              std::string* result) {
103  JNIEnv* env = AttachCurrentThread();
104
105  ScopedJavaLocalRef<jstring> extension_string =
106      ConvertUTF8ToJavaString(env, extension);
107  ScopedJavaLocalRef<jstring> ret =
108      Java_AndroidNetworkLibrary_getMimeTypeFromExtension(
109          env, extension_string.obj());
110
111  if (!ret.obj())
112    return false;
113  *result = ConvertJavaStringToUTF8(ret);
114  return true;
115}
116
117bool RegisterNetworkLibrary(JNIEnv* env) {
118  return RegisterNativesImpl(env);
119}
120
121}  // namespace android
122}  // namespace net
123