network_library.cc revision 5c02ac1a9c1b504631c0a3d2b6e737b5d738bae1
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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)#include "net/android/network_library.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/android/jni_android.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/android/jni_array.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/android/jni_string.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/android/scoped_java_ref.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jni/AndroidNetworkLibrary_jni.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::AttachCurrentThread;
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::ConvertJavaStringToUTF8;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::ConvertUTF8ToJavaString;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::GetApplicationContext;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::ScopedJavaLocalRef;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::ToJavaArrayOfByteArray;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::ToJavaByteArray;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace android {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void VerifyX509CertChain(const std::vector<std::string>& cert_chain,
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                         const std::string& auth_type,
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                         const std::string& host,
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                         CertVerifyStatusAndroid* status,
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                         bool* is_issued_by_known_root,
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                         std::vector<std::string>* verified_chain) {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jobjectArray> chain_byte_array =
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ToJavaArrayOfByteArray(env, cert_chain);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!chain_byte_array.is_null());
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jstring> auth_string =
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ConvertUTF8ToJavaString(env, auth_type);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!auth_string.is_null());
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ScopedJavaLocalRef<jstring> host_string =
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ConvertUTF8ToJavaString(env, host);
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(!host_string.is_null());
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ScopedJavaLocalRef<jobject> result =
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Java_AndroidNetworkLibrary_verifyServerCertificates(
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          env, chain_byte_array.obj(), auth_string.obj(), host_string.obj());
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ExtractCertVerifyResult(result.obj(),
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          status, is_issued_by_known_root, verified_chain);
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AddTestRootCertificate(const uint8* cert, size_t len) {
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jbyteArray> cert_array = ToJavaByteArray(env, cert, len);
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!cert_array.is_null());
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Java_AndroidNetworkLibrary_addTestRootCertificate(env, cert_array.obj());
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ClearTestRootCertificates() {
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Java_AndroidNetworkLibrary_clearTestRootCertificates(env);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool StoreKeyPair(const uint8* public_key,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  size_t public_len,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  const uint8* private_key,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  size_t private_len) {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jbyteArray> public_array =
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ToJavaByteArray(env, public_key, public_len);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jbyteArray> private_array =
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ToJavaByteArray(env, private_key, private_len);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jboolean ret = Java_AndroidNetworkLibrary_storeKeyPair(env,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetApplicationContext(), public_array.obj(), private_array.obj());
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LOG_IF(WARNING, !ret) <<
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Call to Java_AndroidNetworkLibrary_storeKeyPair failed";
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ret;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void StoreCertificate(net::CertificateMimeType cert_type,
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      const void* data,
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      size_t data_len) {
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jbyteArray> data_array =
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ToJavaByteArray(env, reinterpret_cast<const uint8*>(data), data_len);
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  jboolean ret = Java_AndroidNetworkLibrary_storeCertificate(env,
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetApplicationContext(), cert_type, data_array.obj());
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LOG_IF(WARNING, !ret) <<
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "Call to Java_AndroidNetworkLibrary_storeCertificate"
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      " failed";
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Intentionally do not return 'ret', there is little the caller can
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // do in case of failure (the CertInstaller itself will deal with
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // incorrect data and display the appropriate toast).
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HaveOnlyLoopbackAddresses() {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Java_AndroidNetworkLibrary_haveOnlyLoopbackAddresses(env);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GetNetworkList() {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jstring> ret =
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Java_AndroidNetworkLibrary_getNetworkList(env);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ConvertJavaStringToUTF8(ret);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GetMimeTypeFromExtension(const std::string& extension,
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              std::string* result) {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jstring> extension_string =
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ConvertUTF8ToJavaString(env, extension);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jstring> ret =
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Java_AndroidNetworkLibrary_getMimeTypeFromExtension(
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          env, extension_string.obj());
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ret.obj())
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *result = ConvertJavaStringToUTF8(ret);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustd::string GetTelephonyNetworkCountryIso() {
1265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return base::android::ConvertJavaStringToUTF8(
1275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      Java_AndroidNetworkLibrary_getNetworkCountryIso(
1285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          base::android::AttachCurrentThread(),
1295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          base::android::GetApplicationContext()));
1305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
1315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustd::string GetTelephonyNetworkOperator() {
1335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return base::android::ConvertJavaStringToUTF8(
1345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      Java_AndroidNetworkLibrary_getNetworkOperator(
1355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          base::android::AttachCurrentThread(),
1365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          base::android::GetApplicationContext()));
1375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
1385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RegisterNetworkLibrary(JNIEnv* env) {
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return RegisterNativesImpl(env);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace android
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
145