| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/ssl/ssl_platform_key_android.h" | 5 #include "net/ssl/ssl_platform_key_android.h" |
| 6 | 6 |
| 7 #include <openssl/ecdsa.h> | 7 #include <openssl/ecdsa.h> |
| 8 #include <openssl/mem.h> | 8 #include <openssl/mem.h> |
| 9 #include <openssl/nid.h> | 9 #include <openssl/nid.h> |
| 10 #include <openssl/rsa.h> | 10 #include <openssl/rsa.h> |
| 11 #include <strings.h> | 11 #include <strings.h> |
| 12 | 12 |
| 13 #include <memory> | 13 #include <memory> |
| 14 #include <utility> | 14 #include <utility> |
| 15 #include <vector> | 15 #include <vector> |
| 16 | 16 |
| 17 #include "base/android/build_info.h" | 17 #include "base/android/build_info.h" |
| 18 #include "base/android/scoped_java_ref.h" | 18 #include "base/android/scoped_java_ref.h" |
| 19 #include "base/lazy_instance.h" | 19 #include "base/lazy_instance.h" |
| 20 #include "base/logging.h" | 20 #include "base/logging.h" |
| 21 #include "base/macros.h" | 21 #include "base/macros.h" |
| 22 #include "base/memory/ptr_util.h" | 22 #include "base/memory/ptr_util.h" |
| 23 #include "net/android/keystore.h" | 23 #include "net/android/keystore.h" |
| 24 #include "net/android/legacy_openssl.h" | 24 #include "net/android/legacy_openssl.h" |
| 25 #include "net/base/net_errors.h" | 25 #include "net/base/net_errors.h" |
| 26 #include "net/ssl/openssl_client_key_store.h" | 26 #include "net/ssl/openssl_client_key_store.h" |
| 27 #include "net/ssl/ssl_platform_key.h" | 27 #include "net/ssl/ssl_platform_key.h" |
| 28 #include "net/ssl/ssl_platform_key_task_runner.h" | 28 #include "net/ssl/ssl_platform_key_util.h" |
| 29 #include "net/ssl/threaded_ssl_private_key.h" | 29 #include "net/ssl/threaded_ssl_private_key.h" |
| 30 | 30 |
| 31 using base::android::JavaRef; | 31 using base::android::JavaRef; |
| 32 using base::android::ScopedJavaGlobalRef; | 32 using base::android::ScopedJavaGlobalRef; |
| 33 using base::android::ScopedJavaLocalRef; | 33 using base::android::ScopedJavaLocalRef; |
| 34 | 34 |
| 35 namespace net { | 35 namespace net { |
| 36 | 36 |
| 37 namespace { | 37 namespace { |
| 38 | 38 |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 169 | 169 |
| 170 private: | 170 private: |
| 171 SSLPrivateKey::Type type_; | 171 SSLPrivateKey::Type type_; |
| 172 ScopedJavaGlobalRef<jobject> key_; | 172 ScopedJavaGlobalRef<jobject> key_; |
| 173 size_t max_length_; | 173 size_t max_length_; |
| 174 android::AndroidRSA* legacy_rsa_; | 174 android::AndroidRSA* legacy_rsa_; |
| 175 | 175 |
| 176 DISALLOW_COPY_AND_ASSIGN(SSLPlatformKeyAndroid); | 176 DISALLOW_COPY_AND_ASSIGN(SSLPlatformKeyAndroid); |
| 177 }; | 177 }; |
| 178 | 178 |
| 179 // VectorBignumSize returns the number of bytes needed to represent the bignum | 179 } // namespace |
| 180 // given in |v|, i.e. the length of |v| less any leading zero bytes. | |
| 181 size_t VectorBignumSize(const std::vector<uint8_t>& v) { | |
| 182 size_t size = v.size(); | |
| 183 // Ignore any leading zero bytes. | |
| 184 for (size_t i = 0; i < v.size() && v[i] == 0; i++) { | |
| 185 size--; | |
| 186 } | |
| 187 return size; | |
| 188 } | |
| 189 | 180 |
| 190 std::unique_ptr<SSLPlatformKeyAndroid> CreateRsaKey( | 181 scoped_refptr<SSLPrivateKey> WrapJavaPrivateKey( |
| 182 const X509Certificate* certificate, |
| 191 const JavaRef<jobject>& key) { | 183 const JavaRef<jobject>& key) { |
| 184 SSLPrivateKey::Type type; |
| 185 size_t max_length; |
| 186 if (!GetClientCertInfo(certificate, &type, &max_length)) |
| 187 return nullptr; |
| 188 |
| 192 android::AndroidRSA* sys_rsa = nullptr; | 189 android::AndroidRSA* sys_rsa = nullptr; |
| 193 const int kAndroid42ApiLevel = 17; | 190 if (type == SSLPrivateKey::Type::RSA) { |
| 194 if (base::android::BuildInfo::GetInstance()->sdk_int() < kAndroid42ApiLevel) { | 191 const int kAndroid42ApiLevel = 17; |
| 195 // Route around platform limitations: if Android < 4.2, then | 192 if (base::android::BuildInfo::GetInstance()->sdk_int() < |
| 196 // base::android::RawSignDigestWithPrivateKey() cannot work, so try to get | 193 kAndroid42ApiLevel) { |
| 197 // the system OpenSSL's EVP_PKEY backing this PrivateKey object. | 194 // Route around platform limitations: if Android < 4.2, then |
| 198 android::AndroidEVP_PKEY* sys_pkey = | 195 // base::android::RawSignDigestWithPrivateKey() cannot work, so try to get |
| 199 android::GetOpenSSLSystemHandleForPrivateKey(key); | 196 // the system OpenSSL's EVP_PKEY backing this PrivateKey object. |
| 200 if (!sys_pkey) | 197 android::AndroidEVP_PKEY* sys_pkey = |
| 201 return nullptr; | 198 android::GetOpenSSLSystemHandleForPrivateKey(key); |
| 199 if (!sys_pkey) |
| 200 return nullptr; |
| 202 | 201 |
| 203 if (sys_pkey->type != android::ANDROID_EVP_PKEY_RSA) { | 202 if (sys_pkey->type != android::ANDROID_EVP_PKEY_RSA) { |
| 204 LOG(ERROR) << "Private key has wrong type!"; | 203 LOG(ERROR) << "Private key has wrong type!"; |
| 205 return nullptr; | 204 return nullptr; |
| 206 } | 205 } |
| 207 | 206 |
| 208 sys_rsa = sys_pkey->pkey.rsa; | 207 sys_rsa = sys_pkey->pkey.rsa; |
| 209 if (sys_rsa->engine) { | 208 if (sys_rsa->engine) { |
| 210 // |private_key| may not have an engine if the PrivateKey did not come | 209 // |private_key| may not have an engine if the PrivateKey did not come |
| 211 // from the key store, such as in unit tests. | 210 // from the key store, such as in unit tests. |
| 212 if (strcmp(sys_rsa->engine->id, "keystore") == 0) { | 211 if (strcmp(sys_rsa->engine->id, "keystore") == 0) { |
| 213 LeakEngine(key); | 212 LeakEngine(key); |
| 214 } else { | 213 } else { |
| 215 NOTREACHED(); | 214 NOTREACHED(); |
| 215 } |
| 216 } | 216 } |
| 217 } | 217 } |
| 218 } | 218 } |
| 219 | 219 |
| 220 std::vector<uint8_t> modulus; | |
| 221 if (!android::GetRSAKeyModulus(key, &modulus)) { | |
| 222 LOG(ERROR) << "Failed to get private key modulus"; | |
| 223 return nullptr; | |
| 224 } | |
| 225 | |
| 226 return base::MakeUnique<SSLPlatformKeyAndroid>( | |
| 227 SSLPrivateKey::Type::RSA, key, VectorBignumSize(modulus), sys_rsa); | |
| 228 } | |
| 229 | |
| 230 std::unique_ptr<SSLPlatformKeyAndroid> CreateEcdsaKey( | |
| 231 const JavaRef<jobject>& key) { | |
| 232 std::vector<uint8_t> order; | |
| 233 if (!android::GetECKeyOrder(key, &order)) { | |
| 234 LOG(ERROR) << "Can't extract order parameter from EC private key"; | |
| 235 return nullptr; | |
| 236 } | |
| 237 | |
| 238 return base::MakeUnique<SSLPlatformKeyAndroid>( | |
| 239 SSLPrivateKey::Type::ECDSA, key, | |
| 240 ECDSA_SIG_max_len(VectorBignumSize(order)), nullptr); | |
| 241 } | |
| 242 | |
| 243 } // namespace | |
| 244 | |
| 245 scoped_refptr<SSLPrivateKey> WrapJavaPrivateKey(const JavaRef<jobject>& key) { | |
| 246 std::unique_ptr<SSLPlatformKeyAndroid> delegate; | |
| 247 switch (android::GetPrivateKeyType(key)) { | |
| 248 case android::PRIVATE_KEY_TYPE_RSA: | |
| 249 delegate = CreateRsaKey(key); | |
| 250 break; | |
| 251 case android::PRIVATE_KEY_TYPE_ECDSA: | |
| 252 delegate = CreateEcdsaKey(key); | |
| 253 break; | |
| 254 default: | |
| 255 LOG(WARNING) << "GetPrivateKeyType() returned invalid type"; | |
| 256 return nullptr; | |
| 257 } | |
| 258 | |
| 259 return make_scoped_refptr(new ThreadedSSLPrivateKey( | 220 return make_scoped_refptr(new ThreadedSSLPrivateKey( |
| 260 std::move(delegate), GetSSLPlatformKeyTaskRunner())); | 221 base::MakeUnique<SSLPlatformKeyAndroid>(type, key, max_length, sys_rsa), |
| 222 GetSSLPlatformKeyTaskRunner())); |
| 261 } | 223 } |
| 262 | 224 |
| 263 scoped_refptr<SSLPrivateKey> FetchClientCertPrivateKey( | 225 scoped_refptr<SSLPrivateKey> FetchClientCertPrivateKey( |
| 264 X509Certificate* certificate) { | 226 X509Certificate* certificate) { |
| 265 return OpenSSLClientKeyStore::GetInstance()->FetchClientCertPrivateKey( | 227 return OpenSSLClientKeyStore::GetInstance()->FetchClientCertPrivateKey( |
| 266 certificate); | 228 certificate); |
| 267 } | 229 } |
| 268 | 230 |
| 269 } // namespace net | 231 } // namespace net |
| OLD | NEW |