From 740ac5567f62b6a3690d1d8d30855d1c218aa3dd Mon Sep 17 00:00:00 2001 From: Ziyuan Xu Date: Thu, 4 Jun 2020 17:52:40 +0800 Subject: [PATCH] support rsa key authentication The auth key is /etc/adbkey.pub as default that should match with ~/.android/adbkey.pub on PC. Signed-off-by: Ziyuan Xu --- core/adbd/adb.c | 6 ++++-- core/adbd/adb_auth.h | 2 +- core/adbd/adb_auth_client.c | 43 ++++++++++++++----------------------- 3 files changed, 21 insertions(+), 30 deletions(-) diff --git a/core/adbd/adb.c b/core/adbd/adb.c index c4c00d7..27d48f7 100644 --- a/core/adbd/adb.c +++ b/core/adbd/adb.c @@ -559,7 +559,9 @@ void handle_packet(apacket *p, atransport *t) send_auth_request(t); } } else if (p->msg.arg0 == ADB_AUTH_RSAPUBLICKEY) { - adb_auth_confirm_key(p->data, p->msg.data_length, t); + if (adb_auth_confirm_key(p->data)) { + adb_auth_verified(t); + } } break; @@ -1231,7 +1233,7 @@ int adb_main(int is_daemon, int server_port) } #else //property_get("ro.adb.secure", value, "0"); - auth_enabled = 0;//!strcmp(value, "1"); + auth_enabled = getenv("ADBD_RSA_AUTH_ENABLE")? 1: 0; if (auth_enabled) adb_auth_init(); diff --git a/core/adbd/adb_auth.h b/core/adbd/adb_auth.h index 1fffa49..c788838 100644 --- a/core/adbd/adb_auth.h +++ b/core/adbd/adb_auth.h @@ -46,7 +46,7 @@ static inline int adb_auth_get_userkey(unsigned char *data, size_t len) { return int adb_auth_generate_token(void *token, size_t token_size); int adb_auth_verify(void *token, void *sig, int siglen); -void adb_auth_confirm_key(unsigned char *data, size_t len, atransport *t); +bool adb_auth_confirm_key(unsigned char *data); void adb_auth_reload_keys(void); #endif // ADB_HOST diff --git a/core/adbd/adb_auth_client.c b/core/adbd/adb_auth_client.c index 068d837..34a19dc 100644 --- a/core/adbd/adb_auth_client.c +++ b/core/adbd/adb_auth_client.c @@ -172,36 +172,25 @@ static void adb_auth_event(int fd, unsigned events, void *data) } } -void adb_auth_confirm_key(unsigned char *key, size_t len, atransport *t) +bool adb_auth_confirm_key(unsigned char *key) { - char msg[MAX_PAYLOAD]; - int ret; - - if (framework_fd < 0) { - D("Client not connected\n"); - return; + char *auth_key_file = getenv("ADBD_RSA_KEY_FILE") ? getenv("ADBD_RSA_KEY_FILE"): "/etc/adbkey.pub"; + char msg[MAX_PAYLOAD] = {0}; + if(-1 == snprintf(msg,sizeof(msg),"%s",key)){ + D("Could not read pc pub msg"); + return false; } - - if (key[len - 1] != '\0') { - D("Key must be a null-terminated string\n"); - return; + char buff[MAX_PAYLOAD] = {0}; + FILE *fp = NULL; + fp = fopen(auth_key_file, "r"); + if (NULL == fp) { + D("Could not read pub\n"); + fclose(fp); + return false; } - - ret = snprintf(msg, sizeof(msg), "PK%s", key); - if (ret >= (signed)sizeof(msg)) { - D("Key too long. ret=%d", ret); - return; - } - D("Sending '%s'\n", msg); - - ret = unix_write(framework_fd, msg, ret); - if (ret < 0) { - D("Failed to write PK, errno=%d\n", errno); - return; - } - - fdevent_install(&t->auth_fde, framework_fd, adb_auth_event, t); - fdevent_add(&t->auth_fde, FDE_READ); + fgets(buff,MAX_PAYLOAD,fp); + fclose(fp); + return strcmp(msg,buff) ? false : true; } static void adb_auth_listener(int fd, unsigned events, void *data) -- 2.26.1