network_library.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
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::ClearException;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::ConvertJavaStringToUTF8;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::ConvertUTF8ToJavaString;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::GetApplicationContext;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::ScopedJavaLocalRef;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::ToJavaArrayOfByteArray;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::ToJavaByteArray;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace android {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CertVerifyResultAndroid VerifyX509CertChain(
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::vector<std::string>& cert_chain,
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& auth_type) {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jobjectArray> chain_byte_array =
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ToJavaArrayOfByteArray(env, cert_chain);
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!chain_byte_array.is_null());
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jstring> auth_string =
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ConvertUTF8ToJavaString(env, auth_type);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!auth_string.is_null());
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  jint result = Java_AndroidNetworkLibrary_verifyServerCertificates(
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      env, chain_byte_array.obj(), auth_string.obj());
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return static_cast<CertVerifyResultAndroid>(result);
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AddTestRootCertificate(const uint8* cert, size_t len) {
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jbyteArray> cert_array = ToJavaByteArray(env, cert, len);
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!cert_array.is_null());
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Java_AndroidNetworkLibrary_addTestRootCertificate(env, cert_array.obj());
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ClearTestRootCertificates() {
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Java_AndroidNetworkLibrary_clearTestRootCertificates(env);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool StoreKeyPair(const uint8* public_key,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  size_t public_len,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  const uint8* private_key,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  size_t private_len) {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jbyteArray> public_array =
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ToJavaByteArray(env, public_key, public_len);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jbyteArray> private_array =
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ToJavaByteArray(env, private_key, private_len);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jboolean ret = Java_AndroidNetworkLibrary_storeKeyPair(env,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetApplicationContext(), public_array.obj(), private_array.obj());
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LOG_IF(WARNING, !ret) <<
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Call to Java_AndroidNetworkLibrary_storeKeyPair failed";
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ret;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void StoreCertificate(net::CertificateMimeType cert_type,
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      const void* data,
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      size_t data_len) {
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jbyteArray> data_array =
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ToJavaByteArray(env, reinterpret_cast<const uint8*>(data), data_len);
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  jboolean ret = Java_AndroidNetworkLibrary_storeCertificate(env,
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetApplicationContext(), cert_type, data_array.obj());
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LOG_IF(WARNING, !ret) <<
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "Call to Java_AndroidNetworkLibrary_storeCertificate"
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      " failed";
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Intentionally do not return 'ret', there is little the caller can
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // do in case of failure (the CertInstaller itself will deal with
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // incorrect data and display the appropriate toast).
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HaveOnlyLoopbackAddresses() {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Java_AndroidNetworkLibrary_haveOnlyLoopbackAddresses(env);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GetNetworkList() {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jstring> ret =
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Java_AndroidNetworkLibrary_getNetworkList(env);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ConvertJavaStringToUTF8(ret);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GetMimeTypeFromExtension(const std::string& extension,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              std::string* result) {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jstring> extension_string =
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ConvertUTF8ToJavaString(env, extension);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jstring> ret =
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Java_AndroidNetworkLibrary_getMimeTypeFromExtension(
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          env, extension_string.obj());
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ret.obj())
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *result = ConvertJavaStringToUTF8(ret);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RegisterNetworkLibrary(JNIEnv* env) {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return RegisterNativesImpl(env);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace android
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
123