| // Copyright 2016 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "base/android/jni_android.h" |
| #include "base/android/jni_array.h" |
| #include "base/android/jni_string.h" |
| #include "content/public/browser/browser_context.h" |
| #include "content/public/browser/navigation_controller.h" |
| #include "content/public/browser/navigation_entry.h" |
| #include "content/public/browser/ssl_status.h" |
| #include "content/public/browser/web_contents.h" |
| #include "net/cert/x509_certificate.h" |
| #include "net/cert/x509_util.h" |
| |
| // Must come after all headers that specialize FromJniType() / ToJniType(). |
| #include "components/page_info/android/jni_headers/CertificateChainHelper_jni.h" |
| |
| using base::android::JavaParamRef; |
| using base::android::ScopedJavaLocalRef; |
| using content::WebContents; |
| |
| static ScopedJavaLocalRef<jobjectArray> |
| JNI_CertificateChainHelper_GetCertificateChain( |
| JNIEnv* env, |
| const JavaParamRef<jobject>& java_web_contents) { |
| content::WebContents* web_contents = |
| content::WebContents::FromJavaWebContents(java_web_contents); |
| if (!web_contents) |
| return ScopedJavaLocalRef<jobjectArray>(); |
| |
| scoped_refptr<net::X509Certificate> cert = |
| web_contents->GetController().GetVisibleEntry()->GetSSL().certificate; |
| if (!cert) |
| return ScopedJavaLocalRef<jobjectArray>(); |
| |
| std::vector<std::string> cert_chain; |
| cert_chain.reserve(cert->cert_buffers().size()); |
| for (const auto& handle : cert->cert_buffers()) { |
| cert_chain.emplace_back( |
| net::x509_util::CryptoBufferAsStringPiece(handle.get())); |
| } |
| |
| return base::android::ToJavaArrayOfByteArray(env, cert_chain); |
| } |