1*4882a593SmuzhiyunFrom d0409619b496f4f864ecd6471264ad2173caa5a7 Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: Ziyuan Xu <xzy.xu@rock-chips.com> 3*4882a593SmuzhiyunDate: Thu, 4 Jun 2020 17:52:40 +0800 4*4882a593SmuzhiyunSubject: [PATCH 19/20] adbd: Support rsa key authentication 5*4882a593Smuzhiyun 6*4882a593SmuzhiyunThe auth key is /etc/adbkey.pub as default that should match with 7*4882a593Smuzhiyun~/.android/adbkey.pub on PC. 8*4882a593Smuzhiyun 9*4882a593SmuzhiyunSigned-off-by: Ziyuan Xu <xzy.xu@rock-chips.com> 10*4882a593SmuzhiyunSigned-off-by: Jeffy Chen <jeffy.chen@rock-chips.com> 11*4882a593Smuzhiyun--- 12*4882a593Smuzhiyun core/adbd/adb.c | 6 ++++-- 13*4882a593Smuzhiyun core/adbd/adb_auth.h | 2 +- 14*4882a593Smuzhiyun core/adbd/adb_auth_client.c | 43 ++++++++++++++----------------------- 15*4882a593Smuzhiyun 3 files changed, 21 insertions(+), 30 deletions(-) 16*4882a593Smuzhiyun 17*4882a593Smuzhiyundiff --git a/core/adbd/adb.c b/core/adbd/adb.c 18*4882a593Smuzhiyunindex 32173f2..37d230c 100644 19*4882a593Smuzhiyun--- a/core/adbd/adb.c 20*4882a593Smuzhiyun+++ b/core/adbd/adb.c 21*4882a593Smuzhiyun@@ -559,7 +559,9 @@ void handle_packet(apacket *p, atransport *t) 22*4882a593Smuzhiyun send_auth_request(t); 23*4882a593Smuzhiyun } 24*4882a593Smuzhiyun } else if (p->msg.arg0 == ADB_AUTH_RSAPUBLICKEY) { 25*4882a593Smuzhiyun- adb_auth_confirm_key(p->data, p->msg.data_length, t); 26*4882a593Smuzhiyun+ if (adb_auth_confirm_key(p->data)) { 27*4882a593Smuzhiyun+ adb_auth_verified(t); 28*4882a593Smuzhiyun+ } 29*4882a593Smuzhiyun } 30*4882a593Smuzhiyun break; 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun@@ -1231,7 +1233,7 @@ int adb_main(int is_daemon, int server_port) 33*4882a593Smuzhiyun } 34*4882a593Smuzhiyun #else 35*4882a593Smuzhiyun //property_get("ro.adb.secure", value, "0"); 36*4882a593Smuzhiyun- auth_enabled = 0;//!strcmp(value, "1"); 37*4882a593Smuzhiyun+ auth_enabled = !!getenv("ADBD_RSA_KEY_FILE"); 38*4882a593Smuzhiyun if (auth_enabled) 39*4882a593Smuzhiyun adb_auth_init(); 40*4882a593Smuzhiyun 41*4882a593Smuzhiyundiff --git a/core/adbd/adb_auth.h b/core/adbd/adb_auth.h 42*4882a593Smuzhiyunindex 1fffa49..c788838 100644 43*4882a593Smuzhiyun--- a/core/adbd/adb_auth.h 44*4882a593Smuzhiyun+++ b/core/adbd/adb_auth.h 45*4882a593Smuzhiyun@@ -46,7 +46,7 @@ static inline int adb_auth_get_userkey(unsigned char *data, size_t len) { return 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun int adb_auth_generate_token(void *token, size_t token_size); 48*4882a593Smuzhiyun int adb_auth_verify(void *token, void *sig, int siglen); 49*4882a593Smuzhiyun-void adb_auth_confirm_key(unsigned char *data, size_t len, atransport *t); 50*4882a593Smuzhiyun+bool adb_auth_confirm_key(unsigned char *data); 51*4882a593Smuzhiyun void adb_auth_reload_keys(void); 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun #endif // ADB_HOST 54*4882a593Smuzhiyundiff --git a/core/adbd/adb_auth_client.c b/core/adbd/adb_auth_client.c 55*4882a593Smuzhiyunindex 068d837..34a19dc 100644 56*4882a593Smuzhiyun--- a/core/adbd/adb_auth_client.c 57*4882a593Smuzhiyun+++ b/core/adbd/adb_auth_client.c 58*4882a593Smuzhiyun@@ -172,36 +172,25 @@ static void adb_auth_event(int fd, unsigned events, void *data) 59*4882a593Smuzhiyun } 60*4882a593Smuzhiyun } 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun-void adb_auth_confirm_key(unsigned char *key, size_t len, atransport *t) 63*4882a593Smuzhiyun+bool adb_auth_confirm_key(unsigned char *key) 64*4882a593Smuzhiyun { 65*4882a593Smuzhiyun- char msg[MAX_PAYLOAD]; 66*4882a593Smuzhiyun- int ret; 67*4882a593Smuzhiyun- 68*4882a593Smuzhiyun- if (framework_fd < 0) { 69*4882a593Smuzhiyun- D("Client not connected\n"); 70*4882a593Smuzhiyun- return; 71*4882a593Smuzhiyun+ char *auth_key_file = getenv("ADBD_RSA_KEY_FILE") ?: "/etc/adbkey.pub"; 72*4882a593Smuzhiyun+ char msg[MAX_PAYLOAD] = {0}; 73*4882a593Smuzhiyun+ if(-1 == snprintf(msg,sizeof(msg),"%s",key)){ 74*4882a593Smuzhiyun+ D("Could not read pc pub msg"); 75*4882a593Smuzhiyun+ return false; 76*4882a593Smuzhiyun } 77*4882a593Smuzhiyun- 78*4882a593Smuzhiyun- if (key[len - 1] != '\0') { 79*4882a593Smuzhiyun- D("Key must be a null-terminated string\n"); 80*4882a593Smuzhiyun- return; 81*4882a593Smuzhiyun+ char buff[MAX_PAYLOAD] = {0}; 82*4882a593Smuzhiyun+ FILE *fp = NULL; 83*4882a593Smuzhiyun+ fp = fopen(auth_key_file, "r"); 84*4882a593Smuzhiyun+ if (NULL == fp) { 85*4882a593Smuzhiyun+ D("Could not read pub\n"); 86*4882a593Smuzhiyun+ fclose(fp); 87*4882a593Smuzhiyun+ return false; 88*4882a593Smuzhiyun } 89*4882a593Smuzhiyun- 90*4882a593Smuzhiyun- ret = snprintf(msg, sizeof(msg), "PK%s", key); 91*4882a593Smuzhiyun- if (ret >= (signed)sizeof(msg)) { 92*4882a593Smuzhiyun- D("Key too long. ret=%d", ret); 93*4882a593Smuzhiyun- return; 94*4882a593Smuzhiyun- } 95*4882a593Smuzhiyun- D("Sending '%s'\n", msg); 96*4882a593Smuzhiyun- 97*4882a593Smuzhiyun- ret = unix_write(framework_fd, msg, ret); 98*4882a593Smuzhiyun- if (ret < 0) { 99*4882a593Smuzhiyun- D("Failed to write PK, errno=%d\n", errno); 100*4882a593Smuzhiyun- return; 101*4882a593Smuzhiyun- } 102*4882a593Smuzhiyun- 103*4882a593Smuzhiyun- fdevent_install(&t->auth_fde, framework_fd, adb_auth_event, t); 104*4882a593Smuzhiyun- fdevent_add(&t->auth_fde, FDE_READ); 105*4882a593Smuzhiyun+ fgets(buff,MAX_PAYLOAD,fp); 106*4882a593Smuzhiyun+ fclose(fp); 107*4882a593Smuzhiyun+ return strcmp(msg,buff) ? false : true; 108*4882a593Smuzhiyun } 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun static void adb_auth_listener(int fd, unsigned events, void *data) 111*4882a593Smuzhiyun-- 112*4882a593Smuzhiyun2.20.1 113*4882a593Smuzhiyun 114