| // Copyright 2014 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #ifndef NET_ANDROID_LEGACY_OPENSSL_H | 
 | #define NET_ANDROID_LEGACY_OPENSSL_H | 
 |  | 
 | // This file contains a replica of the Android system OpenSSL ABI shipped in | 
 | // Android 4.1.x (API level 16). The ABI may not necessarily be compatible with | 
 | // the copy of OpenSSL shipped in Chromium. This is used to implement | 
 | // RSA_private_encrypt in one of the legacy client auth codepaths. | 
 | // | 
 | // See https://android.googlesource.com/platform/external/openssl/+/android-4.1.2_r2.1 | 
 |  | 
 | namespace net { | 
 | namespace android { | 
 |  | 
 | enum { | 
 |   ANDROID_EVP_PKEY_RSA = 6, | 
 | }; | 
 |  | 
 | enum { | 
 |   ANDROID_RSA_PKCS1_PADDING = 1, | 
 |   ANDROID_RSA_SSLV23_PADDING = 2, | 
 |   ANDROID_RSA_NO_PADDING = 3, | 
 |   ANDROID_RSA_PKCS1_OAEP_PADDING = 4, | 
 |   ANDROID_X931_PADDING = 5, | 
 |   ANDROID_PKCS1_PSS_PADDING = 6, | 
 | }; | 
 |  | 
 | struct AndroidEVP_PKEY_ASN1_METHOD; | 
 | struct AndroidRSA_METHOD; | 
 | struct AndroidSTACK; | 
 |  | 
 | struct AndroidCRYPTO_EX_DATA { | 
 |   AndroidSTACK* sk; | 
 |   int dummy; | 
 | }; | 
 |  | 
 | struct AndroidENGINE { | 
 |   const char* id; | 
 |   // Remaining fields intentionally omitted. | 
 | }; | 
 |  | 
 | struct AndroidRSA { | 
 |   int pad; | 
 |   long version; | 
 |   const AndroidRSA_METHOD* meth; | 
 |   AndroidENGINE* engine; | 
 |   // Remaining fields intentionally omitted. | 
 | }; | 
 |  | 
 | struct AndroidRSA_METHOD { | 
 |   const char* name; | 
 |   int (*rsa_pub_enc)(int flen, | 
 |                      const unsigned char* from, | 
 |                      unsigned char* to, | 
 |                      AndroidRSA* rsa, | 
 |                      int padding); | 
 |   int (*rsa_pub_dec)(int flen, | 
 |                      const unsigned char* from, | 
 |                      unsigned char* to, | 
 |                      AndroidRSA* rsa, | 
 |                      int padding); | 
 |   int (*rsa_priv_enc)(int flen, | 
 |                       const unsigned char* from, | 
 |                       unsigned char* to, | 
 |                       AndroidRSA* rsa, | 
 |                       int padding); | 
 |   int (*rsa_priv_dec)(int flen, | 
 |                       const unsigned char* from, | 
 |                       unsigned char* to, | 
 |                       AndroidRSA* rsa, | 
 |                       int padding); | 
 |   // Remaining fields intentionally omitted. | 
 | }; | 
 |  | 
 | struct AndroidEVP_PKEY { | 
 |   int type; | 
 |   int save_type; | 
 |   // Note: this value must NOT be modified using Chromium's CRYPTO_add | 
 |   // function. That may not necessarily use the same locking implementation as | 
 |   // system OpenSSL. | 
 |   int references; | 
 |   const AndroidEVP_PKEY_ASN1_METHOD* ameth; | 
 |   AndroidENGINE* engine; | 
 |   union { | 
 |     char* ptr; | 
 |     AndroidRSA* rsa; | 
 |   } pkey; | 
 |   int save_parameters; | 
 |   AndroidSTACK* attributes; | 
 | }; | 
 |  | 
 | }  // namespace android | 
 | }  // namespace net | 
 |  | 
 | #endif  // NET_ANDROID_LEGACY_OPENSSL_H |