xref: /aosp_15_r20/external/cronet/net/android/keystore.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2013 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "net/android/keystore.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <string_view>
8*6777b538SAndroid Build Coastguard Worker #include <vector>
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #include "base/android/jni_android.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/android/jni_array.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/android/jni_string.h"
13*6777b538SAndroid Build Coastguard Worker #include "base/check.h"
14*6777b538SAndroid Build Coastguard Worker #include "net/net_jni_headers/AndroidKeyStore_jni.h"
15*6777b538SAndroid Build Coastguard Worker 
16*6777b538SAndroid Build Coastguard Worker using base::android::AttachCurrentThread;
17*6777b538SAndroid Build Coastguard Worker using base::android::ConvertJavaStringToUTF8;
18*6777b538SAndroid Build Coastguard Worker using base::android::ConvertUTF8ToJavaString;
19*6777b538SAndroid Build Coastguard Worker using base::android::HasException;
20*6777b538SAndroid Build Coastguard Worker using base::android::JavaByteArrayToByteVector;
21*6777b538SAndroid Build Coastguard Worker using base::android::JavaRef;
22*6777b538SAndroid Build Coastguard Worker using base::android::ScopedJavaLocalRef;
23*6777b538SAndroid Build Coastguard Worker using base::android::ToJavaByteArray;
24*6777b538SAndroid Build Coastguard Worker 
25*6777b538SAndroid Build Coastguard Worker namespace net::android {
26*6777b538SAndroid Build Coastguard Worker 
GetPrivateKeyClassName(const JavaRef<jobject> & key)27*6777b538SAndroid Build Coastguard Worker std::string GetPrivateKeyClassName(const JavaRef<jobject>& key) {
28*6777b538SAndroid Build Coastguard Worker   JNIEnv* env = AttachCurrentThread();
29*6777b538SAndroid Build Coastguard Worker   ScopedJavaLocalRef<jstring> name =
30*6777b538SAndroid Build Coastguard Worker       Java_AndroidKeyStore_getPrivateKeyClassName(env, key);
31*6777b538SAndroid Build Coastguard Worker   return ConvertJavaStringToUTF8(env, name);
32*6777b538SAndroid Build Coastguard Worker }
33*6777b538SAndroid Build Coastguard Worker 
PrivateKeySupportsSignature(const base::android::JavaRef<jobject> & key,std::string_view algorithm)34*6777b538SAndroid Build Coastguard Worker bool PrivateKeySupportsSignature(const base::android::JavaRef<jobject>& key,
35*6777b538SAndroid Build Coastguard Worker                                  std::string_view algorithm) {
36*6777b538SAndroid Build Coastguard Worker   JNIEnv* env = AttachCurrentThread();
37*6777b538SAndroid Build Coastguard Worker 
38*6777b538SAndroid Build Coastguard Worker   ScopedJavaLocalRef<jstring> algorithm_ref =
39*6777b538SAndroid Build Coastguard Worker       ConvertUTF8ToJavaString(env, algorithm);
40*6777b538SAndroid Build Coastguard Worker   DCHECK(!algorithm_ref.is_null());
41*6777b538SAndroid Build Coastguard Worker 
42*6777b538SAndroid Build Coastguard Worker   jboolean result =
43*6777b538SAndroid Build Coastguard Worker       Java_AndroidKeyStore_privateKeySupportsSignature(env, key, algorithm_ref);
44*6777b538SAndroid Build Coastguard Worker   return !HasException(env) && result;
45*6777b538SAndroid Build Coastguard Worker }
46*6777b538SAndroid Build Coastguard Worker 
PrivateKeySupportsCipher(const base::android::JavaRef<jobject> & key,std::string_view algorithm)47*6777b538SAndroid Build Coastguard Worker bool PrivateKeySupportsCipher(const base::android::JavaRef<jobject>& key,
48*6777b538SAndroid Build Coastguard Worker                               std::string_view algorithm) {
49*6777b538SAndroid Build Coastguard Worker   JNIEnv* env = AttachCurrentThread();
50*6777b538SAndroid Build Coastguard Worker 
51*6777b538SAndroid Build Coastguard Worker   ScopedJavaLocalRef<jstring> algorithm_ref =
52*6777b538SAndroid Build Coastguard Worker       ConvertUTF8ToJavaString(env, algorithm);
53*6777b538SAndroid Build Coastguard Worker   DCHECK(!algorithm_ref.is_null());
54*6777b538SAndroid Build Coastguard Worker 
55*6777b538SAndroid Build Coastguard Worker   jboolean result =
56*6777b538SAndroid Build Coastguard Worker       Java_AndroidKeyStore_privateKeySupportsCipher(env, key, algorithm_ref);
57*6777b538SAndroid Build Coastguard Worker   return !HasException(env) && result;
58*6777b538SAndroid Build Coastguard Worker }
59*6777b538SAndroid Build Coastguard Worker 
SignWithPrivateKey(const JavaRef<jobject> & private_key_ref,std::string_view algorithm,base::span<const uint8_t> input,std::vector<uint8_t> * signature)60*6777b538SAndroid Build Coastguard Worker bool SignWithPrivateKey(const JavaRef<jobject>& private_key_ref,
61*6777b538SAndroid Build Coastguard Worker                         std::string_view algorithm,
62*6777b538SAndroid Build Coastguard Worker                         base::span<const uint8_t> input,
63*6777b538SAndroid Build Coastguard Worker                         std::vector<uint8_t>* signature) {
64*6777b538SAndroid Build Coastguard Worker   JNIEnv* env = AttachCurrentThread();
65*6777b538SAndroid Build Coastguard Worker 
66*6777b538SAndroid Build Coastguard Worker   ScopedJavaLocalRef<jstring> algorithm_ref =
67*6777b538SAndroid Build Coastguard Worker       ConvertUTF8ToJavaString(env, algorithm);
68*6777b538SAndroid Build Coastguard Worker   DCHECK(!algorithm_ref.is_null());
69*6777b538SAndroid Build Coastguard Worker 
70*6777b538SAndroid Build Coastguard Worker   // Convert message to byte[] array.
71*6777b538SAndroid Build Coastguard Worker   ScopedJavaLocalRef<jbyteArray> input_ref = ToJavaByteArray(env, input);
72*6777b538SAndroid Build Coastguard Worker   DCHECK(!input_ref.is_null());
73*6777b538SAndroid Build Coastguard Worker 
74*6777b538SAndroid Build Coastguard Worker   // Invoke platform API
75*6777b538SAndroid Build Coastguard Worker   ScopedJavaLocalRef<jbyteArray> signature_ref =
76*6777b538SAndroid Build Coastguard Worker       Java_AndroidKeyStore_signWithPrivateKey(env, private_key_ref,
77*6777b538SAndroid Build Coastguard Worker                                               algorithm_ref, input_ref);
78*6777b538SAndroid Build Coastguard Worker   if (HasException(env) || signature_ref.is_null())
79*6777b538SAndroid Build Coastguard Worker     return false;
80*6777b538SAndroid Build Coastguard Worker 
81*6777b538SAndroid Build Coastguard Worker   // Write signature to string.
82*6777b538SAndroid Build Coastguard Worker   JavaByteArrayToByteVector(env, signature_ref, signature);
83*6777b538SAndroid Build Coastguard Worker   return true;
84*6777b538SAndroid Build Coastguard Worker }
85*6777b538SAndroid Build Coastguard Worker 
EncryptWithPrivateKey(const JavaRef<jobject> & private_key_ref,std::string_view algorithm,base::span<const uint8_t> input,std::vector<uint8_t> * ciphertext)86*6777b538SAndroid Build Coastguard Worker bool EncryptWithPrivateKey(const JavaRef<jobject>& private_key_ref,
87*6777b538SAndroid Build Coastguard Worker                            std::string_view algorithm,
88*6777b538SAndroid Build Coastguard Worker                            base::span<const uint8_t> input,
89*6777b538SAndroid Build Coastguard Worker                            std::vector<uint8_t>* ciphertext) {
90*6777b538SAndroid Build Coastguard Worker   JNIEnv* env = AttachCurrentThread();
91*6777b538SAndroid Build Coastguard Worker 
92*6777b538SAndroid Build Coastguard Worker   ScopedJavaLocalRef<jstring> algorithm_ref =
93*6777b538SAndroid Build Coastguard Worker       ConvertUTF8ToJavaString(env, algorithm);
94*6777b538SAndroid Build Coastguard Worker   DCHECK(!algorithm_ref.is_null());
95*6777b538SAndroid Build Coastguard Worker 
96*6777b538SAndroid Build Coastguard Worker   // Convert message to byte[] array.
97*6777b538SAndroid Build Coastguard Worker   ScopedJavaLocalRef<jbyteArray> input_ref = ToJavaByteArray(env, input);
98*6777b538SAndroid Build Coastguard Worker   DCHECK(!input_ref.is_null());
99*6777b538SAndroid Build Coastguard Worker 
100*6777b538SAndroid Build Coastguard Worker   // Invoke platform API
101*6777b538SAndroid Build Coastguard Worker   ScopedJavaLocalRef<jbyteArray> ciphertext_ref =
102*6777b538SAndroid Build Coastguard Worker       Java_AndroidKeyStore_encryptWithPrivateKey(env, private_key_ref,
103*6777b538SAndroid Build Coastguard Worker                                                  algorithm_ref, input_ref);
104*6777b538SAndroid Build Coastguard Worker   if (HasException(env) || ciphertext_ref.is_null())
105*6777b538SAndroid Build Coastguard Worker     return false;
106*6777b538SAndroid Build Coastguard Worker 
107*6777b538SAndroid Build Coastguard Worker   // Write ciphertext to string.
108*6777b538SAndroid Build Coastguard Worker   JavaByteArrayToByteVector(env, ciphertext_ref, ciphertext);
109*6777b538SAndroid Build Coastguard Worker   return true;
110*6777b538SAndroid Build Coastguard Worker }
111*6777b538SAndroid Build Coastguard Worker 
112*6777b538SAndroid Build Coastguard Worker }  // namespace net::android
113