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