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