mirror of
https://github.com/vanhoefm/fragattacks.git
synced 2025-01-30 16:54:04 -05:00
Android: Fix keystore-backed keys with BoringSSL
The switch to BoringSSL broke keystore-backed keys because wpa_supplicant was using the dynamic ENGINE loading to load the keystore module. The ENGINE-like functionality in BoringSSL is much simpler and this change should enable it. Signed-off-by: Dmitry Shmidt <dimitrysh@google.com>
This commit is contained in:
parent
dd9a42efbc
commit
aeeb0bca71
@ -97,7 +97,7 @@ struct tls_connection {
|
|||||||
SSL_CTX *ssl_ctx;
|
SSL_CTX *ssl_ctx;
|
||||||
SSL *ssl;
|
SSL *ssl;
|
||||||
BIO *ssl_in, *ssl_out;
|
BIO *ssl_in, *ssl_out;
|
||||||
#ifndef OPENSSL_NO_ENGINE
|
#if defined(ANDROID) || !defined(OPENSSL_NO_ENGINE)
|
||||||
ENGINE *engine; /* functional reference to the engine */
|
ENGINE *engine; /* functional reference to the engine */
|
||||||
EVP_PKEY *private_key; /* the private key if using engine */
|
EVP_PKEY *private_key; /* the private key if using engine */
|
||||||
#endif /* OPENSSL_NO_ENGINE */
|
#endif /* OPENSSL_NO_ENGINE */
|
||||||
@ -967,10 +967,32 @@ static int tls_is_pin_error(unsigned int err)
|
|||||||
#endif /* OPENSSL_NO_ENGINE */
|
#endif /* OPENSSL_NO_ENGINE */
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef ANDROID
|
||||||
|
/* EVP_PKEY_from_keystore comes from system/security/keystore-engine. */
|
||||||
|
EVP_PKEY * EVP_PKEY_from_keystore(const char *key_id);
|
||||||
|
#endif /* ANDROID */
|
||||||
|
|
||||||
static int tls_engine_init(struct tls_connection *conn, const char *engine_id,
|
static int tls_engine_init(struct tls_connection *conn, const char *engine_id,
|
||||||
const char *pin, const char *key_id,
|
const char *pin, const char *key_id,
|
||||||
const char *cert_id, const char *ca_cert_id)
|
const char *cert_id, const char *ca_cert_id)
|
||||||
{
|
{
|
||||||
|
#if defined(ANDROID) && defined(OPENSSL_IS_BORINGSSL)
|
||||||
|
#if !defined(OPENSSL_NO_ENGINE)
|
||||||
|
#error "This code depends on OPENSSL_NO_ENGINE being defined by BoringSSL."
|
||||||
|
#endif
|
||||||
|
if (!key_id)
|
||||||
|
return TLS_SET_PARAMS_ENGINE_PRV_INIT_FAILED;
|
||||||
|
conn->engine = NULL;
|
||||||
|
conn->private_key = EVP_PKEY_from_keystore(key_id);
|
||||||
|
if (!conn->private_key) {
|
||||||
|
wpa_printf(MSG_ERROR,
|
||||||
|
"ENGINE: cannot load private key with id '%s' [%s]",
|
||||||
|
key_id,
|
||||||
|
ERR_error_string(ERR_get_error(), NULL));
|
||||||
|
return TLS_SET_PARAMS_ENGINE_PRV_INIT_FAILED;
|
||||||
|
}
|
||||||
|
#endif /* ANDROID && OPENSSL_IS_BORINGSSL */
|
||||||
|
|
||||||
#ifndef OPENSSL_NO_ENGINE
|
#ifndef OPENSSL_NO_ENGINE
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
if (engine_id == NULL) {
|
if (engine_id == NULL) {
|
||||||
@ -1068,17 +1090,19 @@ err:
|
|||||||
|
|
||||||
static void tls_engine_deinit(struct tls_connection *conn)
|
static void tls_engine_deinit(struct tls_connection *conn)
|
||||||
{
|
{
|
||||||
#ifndef OPENSSL_NO_ENGINE
|
#if defined(ANDROID) || !defined(OPENSSL_NO_ENGINE)
|
||||||
wpa_printf(MSG_DEBUG, "ENGINE: engine deinit");
|
wpa_printf(MSG_DEBUG, "ENGINE: engine deinit");
|
||||||
if (conn->private_key) {
|
if (conn->private_key) {
|
||||||
EVP_PKEY_free(conn->private_key);
|
EVP_PKEY_free(conn->private_key);
|
||||||
conn->private_key = NULL;
|
conn->private_key = NULL;
|
||||||
}
|
}
|
||||||
if (conn->engine) {
|
if (conn->engine) {
|
||||||
|
#if !defined(OPENSSL_IS_BORINGSSL)
|
||||||
ENGINE_finish(conn->engine);
|
ENGINE_finish(conn->engine);
|
||||||
|
#endif /* !OPENSSL_IS_BORINGSSL */
|
||||||
conn->engine = NULL;
|
conn->engine = NULL;
|
||||||
}
|
}
|
||||||
#endif /* OPENSSL_NO_ENGINE */
|
#endif /* ANDROID || !OPENSSL_NO_ENGINE */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -2463,7 +2487,7 @@ static int tls_connection_engine_ca_cert(struct tls_data *data,
|
|||||||
|
|
||||||
static int tls_connection_engine_private_key(struct tls_connection *conn)
|
static int tls_connection_engine_private_key(struct tls_connection *conn)
|
||||||
{
|
{
|
||||||
#ifndef OPENSSL_NO_ENGINE
|
#if defined(ANDROID) || !defined(OPENSSL_NO_ENGINE)
|
||||||
if (SSL_use_PrivateKey(conn->ssl, conn->private_key) != 1) {
|
if (SSL_use_PrivateKey(conn->ssl, conn->private_key) != 1) {
|
||||||
tls_show_errors(MSG_ERROR, __func__,
|
tls_show_errors(MSG_ERROR, __func__,
|
||||||
"ENGINE: cannot use private key for TLS");
|
"ENGINE: cannot use private key for TLS");
|
||||||
|
@ -1608,6 +1608,13 @@ endif
|
|||||||
ifeq ($(CONFIG_TLS), openssl)
|
ifeq ($(CONFIG_TLS), openssl)
|
||||||
LOCAL_SHARED_LIBRARIES += libcrypto libssl libkeystore_binder
|
LOCAL_SHARED_LIBRARIES += libcrypto libssl libkeystore_binder
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
# With BoringSSL we need libkeystore-engine in order to provide access to
|
||||||
|
# keystore keys.
|
||||||
|
ifneq (,$(wildcard external/boringssl/flavor.mk))
|
||||||
|
LOCAL_SHARED_LIBRARIES += libkeystore-engine
|
||||||
|
endif
|
||||||
|
|
||||||
ifdef CONFIG_DRIVER_NL80211
|
ifdef CONFIG_DRIVER_NL80211
|
||||||
ifneq ($(wildcard external/libnl),)
|
ifneq ($(wildcard external/libnl),)
|
||||||
LOCAL_SHARED_LIBRARIES += libnl
|
LOCAL_SHARED_LIBRARIES += libnl
|
||||||
|
Loading…
Reference in New Issue
Block a user