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