1d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby/*
2d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby * Copyright (C) 2012 The Android Open Source Project
3d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby *
4d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby * Licensed under the Apache License, Version 2.0 (the "License");
5d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby * you may not use this file except in compliance with the License.
6d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby * You may obtain a copy of the License at
7d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby *
8d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby *      http://www.apache.org/licenses/LICENSE-2.0
9d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby *
10d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby * Unless required by applicable law or agreed to in writing, software
11d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby * distributed under the License is distributed on an "AS IS" BASIS,
12d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby * See the License for the specific language governing permissions and
14d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby * limitations under the License.
15d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby */
16d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby
17aed3c61c4437ebb05eadfb3bf85d6962c30b9935Yabin Cui#define TRACE_TAG AUTH
183313426fad9eaaf53017cdbde889ebcec91358ecDan Albert
193313426fad9eaaf53017cdbde889ebcec91358ecDan Albert#include "sysdeps.h"
203313426fad9eaaf53017cdbde889ebcec91358ecDan Albert#include "adb_auth.h"
213313426fad9eaaf53017cdbde889ebcec91358ecDan Albert
227664901a355b959f312e9acff5a0fd31b7139623Dan Albert#include <resolv.h>
23d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby#include <stdio.h>
24d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby#include <string.h>
25d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby
267664901a355b959f312e9acff5a0fd31b7139623Dan Albert#include "cutils/list.h"
277664901a355b959f312e9acff5a0fd31b7139623Dan Albert#include "cutils/sockets.h"
28d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby#include "mincrypt/rsa.h"
29515e1639ef0ab5e3149fafeffce826cf654d616fDoug Zongker#include "mincrypt/sha.h"
30d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby
313313426fad9eaaf53017cdbde889ebcec91358ecDan Albert#include "adb.h"
323313426fad9eaaf53017cdbde889ebcec91358ecDan Albert#include "fdevent.h"
333313426fad9eaaf53017cdbde889ebcec91358ecDan Albert#include "transport.h"
34d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby
35d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Gobystruct adb_public_key {
36d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    struct listnode node;
37d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    RSAPublicKey key;
38d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby};
39d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby
40bac3474a8256cb32a29e8d46f78cad95a5502692Dan Albertstatic const char *key_paths[] = {
41d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    "/adb_keys",
42d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    "/data/misc/adb/adb_keys",
43d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    NULL
44d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby};
45d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby
46d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Gobystatic fdevent listener_fde;
472eaa41a6dfb97ad1015e456692318af8de13af5cJosh Gaostatic fdevent framework_fde;
48d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Gobystatic int framework_fd = -1;
49d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby
50045a4a9c3a317e60ab1078f5a689bf302ee2ab19Benoit Gobystatic void usb_disconnected(void* unused, atransport* t);
51b329824e6c5373ae303269dca285d835ce57e514Yabin Cuistatic struct adisconnect usb_disconnect = { usb_disconnected, nullptr};
52045a4a9c3a317e60ab1078f5a689bf302ee2ab19Benoit Gobystatic atransport* usb_transport;
53045a4a9c3a317e60ab1078f5a689bf302ee2ab19Benoit Gobystatic bool needs_retry = false;
54d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby
55d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Gobystatic void read_keys(const char *file, struct listnode *list)
56d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby{
57d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    FILE *f;
583d2904cdf2371e26c0465184436bd063979a5d97Tamas Berghammer    char buf[MAX_PAYLOAD_V1];
59d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    char *sep;
60d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    int ret;
61d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby
62fe8d7f4f2e775d46d61f7c2d29a4e852434984daNick Kralevich    f = fopen(file, "re");
63d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    if (!f) {
647a3f8d6691b3fbd8014a98de8455dbcfcc9629e4Yabin Cui        D("Can't open '%s'", file);
65d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby        return;
66d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    }
67d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby
68d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    while (fgets(buf, sizeof(buf), f)) {
69d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby        /* Allocate 4 extra bytes to decode the base64 data in-place */
70bac3474a8256cb32a29e8d46f78cad95a5502692Dan Albert        auto key = reinterpret_cast<adb_public_key*>(
71bac3474a8256cb32a29e8d46f78cad95a5502692Dan Albert            calloc(1, sizeof(adb_public_key) + 4));
72bac3474a8256cb32a29e8d46f78cad95a5502692Dan Albert        if (key == nullptr) {
737a3f8d6691b3fbd8014a98de8455dbcfcc9629e4Yabin Cui            D("Can't malloc key");
74d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby            break;
75d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby        }
76d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby
77d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby        sep = strpbrk(buf, " \t");
78d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby        if (sep)
79d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby            *sep = '\0';
80d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby
81d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby        ret = __b64_pton(buf, (u_char *)&key->key, sizeof(key->key) + 4);
82d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby        if (ret != sizeof(key->key)) {
837a3f8d6691b3fbd8014a98de8455dbcfcc9629e4Yabin Cui            D("%s: Invalid base64 data ret=%d", file, ret);
84d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby            free(key);
85d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby            continue;
86d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby        }
87d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby
88d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby        if (key->key.len != RSANUMWORDS) {
897a3f8d6691b3fbd8014a98de8455dbcfcc9629e4Yabin Cui            D("%s: Invalid key len %d", file, key->key.len);
90d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby            free(key);
91d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby            continue;
92d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby        }
93d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby
94d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby        list_add_tail(list, &key->node);
95d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    }
96d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby
97d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    fclose(f);
98d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby}
99d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby
100d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Gobystatic void free_keys(struct listnode *list)
101d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby{
102d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    struct listnode *item;
103d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby
104d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    while (!list_empty(list)) {
105d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby        item = list_head(list);
106d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby        list_remove(item);
107d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby        free(node_to_item(item, struct adb_public_key, node));
108d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    }
109d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby}
110d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby
111345cb066d2e0c774c877a85d3035f298df1daf16Benoit Gobystatic void load_keys(struct listnode *list)
112d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby{
113bac3474a8256cb32a29e8d46f78cad95a5502692Dan Albert    const char* path;
114bac3474a8256cb32a29e8d46f78cad95a5502692Dan Albert    const char** paths = key_paths;
115d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    struct stat buf;
116d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby
117345cb066d2e0c774c877a85d3035f298df1daf16Benoit Goby    list_init(list);
118d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby
119d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    while ((path = *paths++)) {
120d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby        if (!stat(path, &buf)) {
1217a3f8d6691b3fbd8014a98de8455dbcfcc9629e4Yabin Cui            D("Loading keys from '%s'", path);
122345cb066d2e0c774c877a85d3035f298df1daf16Benoit Goby            read_keys(path, list);
123d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby        }
124d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    }
125d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby}
126d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby
127d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Gobyint adb_auth_generate_token(void *token, size_t token_size)
128d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby{
129d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    FILE *f;
130d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    int ret;
131d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby
132fe8d7f4f2e775d46d61f7c2d29a4e852434984daNick Kralevich    f = fopen("/dev/urandom", "re");
133d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    if (!f)
134d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby        return 0;
135d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby
136d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    ret = fread(token, token_size, 1, f);
137d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby
138d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    fclose(f);
139d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    return ret * token_size;
140d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby}
141d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby
142bac3474a8256cb32a29e8d46f78cad95a5502692Dan Albertint adb_auth_verify(uint8_t* token, uint8_t* sig, int siglen)
143d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby{
144d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    struct listnode *item;
145345cb066d2e0c774c877a85d3035f298df1daf16Benoit Goby    struct listnode key_list;
146345cb066d2e0c774c877a85d3035f298df1daf16Benoit Goby    int ret = 0;
147d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby
148d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    if (siglen != RSANUMBYTES)
149d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby        return 0;
150d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby
151345cb066d2e0c774c877a85d3035f298df1daf16Benoit Goby    load_keys(&key_list);
152345cb066d2e0c774c877a85d3035f298df1daf16Benoit Goby
153d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    list_for_each(item, &key_list) {
154bac3474a8256cb32a29e8d46f78cad95a5502692Dan Albert        adb_public_key* key = node_to_item(item, struct adb_public_key, node);
155515e1639ef0ab5e3149fafeffce826cf654d616fDoug Zongker        ret = RSA_verify(&key->key, sig, siglen, token, SHA_DIGEST_SIZE);
156d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby        if (ret)
157345cb066d2e0c774c877a85d3035f298df1daf16Benoit Goby            break;
158d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    }
159d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby
160345cb066d2e0c774c877a85d3035f298df1daf16Benoit Goby    free_keys(&key_list);
161345cb066d2e0c774c877a85d3035f298df1daf16Benoit Goby
162345cb066d2e0c774c877a85d3035f298df1daf16Benoit Goby    return ret;
163d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby}
164d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby
1652eaa41a6dfb97ad1015e456692318af8de13af5cJosh Gaostatic void usb_disconnected(void* unused, atransport* t) {
1667a3f8d6691b3fbd8014a98de8455dbcfcc9629e4Yabin Cui    D("USB disconnect");
167045a4a9c3a317e60ab1078f5a689bf302ee2ab19Benoit Goby    usb_transport = NULL;
168045a4a9c3a317e60ab1078f5a689bf302ee2ab19Benoit Goby    needs_retry = false;
169045a4a9c3a317e60ab1078f5a689bf302ee2ab19Benoit Goby}
170045a4a9c3a317e60ab1078f5a689bf302ee2ab19Benoit Goby
1712eaa41a6dfb97ad1015e456692318af8de13af5cJosh Gaostatic void framework_disconnected() {
1722eaa41a6dfb97ad1015e456692318af8de13af5cJosh Gao    D("Framework disconnect");
1732eaa41a6dfb97ad1015e456692318af8de13af5cJosh Gao    fdevent_remove(&framework_fde);
1742eaa41a6dfb97ad1015e456692318af8de13af5cJosh Gao    framework_fd = -1;
1752eaa41a6dfb97ad1015e456692318af8de13af5cJosh Gao}
1762eaa41a6dfb97ad1015e456692318af8de13af5cJosh Gao
1772eaa41a6dfb97ad1015e456692318af8de13af5cJosh Gaostatic void adb_auth_event(int fd, unsigned events, void*) {
178d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    char response[2];
179d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    int ret;
180d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby
181d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    if (events & FDE_READ) {
182d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby        ret = unix_read(fd, response, sizeof(response));
183af436b1e10bed3b89880b3bd4f3031ea14057defVince Harron        if (ret <= 0) {
1842eaa41a6dfb97ad1015e456692318af8de13af5cJosh Gao            framework_disconnected();
1852eaa41a6dfb97ad1015e456692318af8de13af5cJosh Gao        } else if (ret == 2 && response[0] == 'O' && response[1] == 'K') {
1862eaa41a6dfb97ad1015e456692318af8de13af5cJosh Gao            if (usb_transport) {
187045a4a9c3a317e60ab1078f5a689bf302ee2ab19Benoit Goby                adb_auth_verified(usb_transport);
1882eaa41a6dfb97ad1015e456692318af8de13af5cJosh Gao            }
189d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby        }
190d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    }
191d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby}
192d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby
193d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Gobyvoid adb_auth_confirm_key(unsigned char *key, size_t len, atransport *t)
194d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby{
1953d2904cdf2371e26c0465184436bd063979a5d97Tamas Berghammer    char msg[MAX_PAYLOAD_V1];
196d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    int ret;
197d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby
198b66356cab6cd47ecbe26513f36614dda1052eb11Benoit Goby    if (!usb_transport) {
199b66356cab6cd47ecbe26513f36614dda1052eb11Benoit Goby        usb_transport = t;
200b329824e6c5373ae303269dca285d835ce57e514Yabin Cui        t->AddDisconnect(&usb_disconnect);
201b66356cab6cd47ecbe26513f36614dda1052eb11Benoit Goby    }
202045a4a9c3a317e60ab1078f5a689bf302ee2ab19Benoit Goby
203d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    if (framework_fd < 0) {
2047a3f8d6691b3fbd8014a98de8455dbcfcc9629e4Yabin Cui        D("Client not connected");
205045a4a9c3a317e60ab1078f5a689bf302ee2ab19Benoit Goby        needs_retry = true;
206d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby        return;
207d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    }
208d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby
209d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    if (key[len - 1] != '\0') {
2107a3f8d6691b3fbd8014a98de8455dbcfcc9629e4Yabin Cui        D("Key must be a null-terminated string");
211d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby        return;
212d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    }
213d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby
214d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    ret = snprintf(msg, sizeof(msg), "PK%s", key);
215d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    if (ret >= (signed)sizeof(msg)) {
2167a3f8d6691b3fbd8014a98de8455dbcfcc9629e4Yabin Cui        D("Key too long. ret=%d", ret);
217d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby        return;
218d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    }
2197a3f8d6691b3fbd8014a98de8455dbcfcc9629e4Yabin Cui    D("Sending '%s'", msg);
220d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby
221d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    ret = unix_write(framework_fd, msg, ret);
222d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    if (ret < 0) {
2237a3f8d6691b3fbd8014a98de8455dbcfcc9629e4Yabin Cui        D("Failed to write PK, errno=%d", errno);
224d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby        return;
225d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    }
226d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby}
227d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby
2282eaa41a6dfb97ad1015e456692318af8de13af5cJosh Gaostatic void adb_auth_listener(int fd, unsigned events, void* data) {
2297e16cc15b5e16ec35f4c9f0516a6cacf90326856Erik Kline    sockaddr_storage addr;
230d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    socklen_t alen;
231d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    int s;
232d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby
233d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    alen = sizeof(addr);
234d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby
2357e16cc15b5e16ec35f4c9f0516a6cacf90326856Erik Kline    s = adb_socket_accept(fd, reinterpret_cast<sockaddr*>(&addr), &alen);
236d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    if (s < 0) {
2377a3f8d6691b3fbd8014a98de8455dbcfcc9629e4Yabin Cui        D("Failed to accept: errno=%d", errno);
238d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby        return;
239d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    }
240d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby
2412eaa41a6dfb97ad1015e456692318af8de13af5cJosh Gao    if (framework_fd >= 0) {
242d382d2bb5176a21bf1265ff2f80fbeaf9bfdce63Josh Gao        LOG(WARNING) << "adb received framework auth socket connection again";
2432eaa41a6dfb97ad1015e456692318af8de13af5cJosh Gao        framework_disconnected();
2442eaa41a6dfb97ad1015e456692318af8de13af5cJosh Gao    }
2452eaa41a6dfb97ad1015e456692318af8de13af5cJosh Gao
246d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    framework_fd = s;
2472eaa41a6dfb97ad1015e456692318af8de13af5cJosh Gao    fdevent_install(&framework_fde, framework_fd, adb_auth_event, nullptr);
2482eaa41a6dfb97ad1015e456692318af8de13af5cJosh Gao    fdevent_add(&framework_fde, FDE_READ);
249045a4a9c3a317e60ab1078f5a689bf302ee2ab19Benoit Goby
250045a4a9c3a317e60ab1078f5a689bf302ee2ab19Benoit Goby    if (needs_retry) {
251045a4a9c3a317e60ab1078f5a689bf302ee2ab19Benoit Goby        needs_retry = false;
252045a4a9c3a317e60ab1078f5a689bf302ee2ab19Benoit Goby        send_auth_request(usb_transport);
253045a4a9c3a317e60ab1078f5a689bf302ee2ab19Benoit Goby    }
254d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby}
255d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby
25664d9adcea807aa1d31574b5b3bb5aad4b9025134Pavel Labathvoid adbd_cloexec_auth_socket() {
25764d9adcea807aa1d31574b5b3bb5aad4b9025134Pavel Labath    int fd = android_get_control_socket("adbd");
25864d9adcea807aa1d31574b5b3bb5aad4b9025134Pavel Labath    if (fd == -1) {
2597a3f8d6691b3fbd8014a98de8455dbcfcc9629e4Yabin Cui        D("Failed to get adbd socket");
260d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby        return;
261d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    }
262fe8d7f4f2e775d46d61f7c2d29a4e852434984daNick Kralevich    fcntl(fd, F_SETFD, FD_CLOEXEC);
26364d9adcea807aa1d31574b5b3bb5aad4b9025134Pavel Labath}
264d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby
26564d9adcea807aa1d31574b5b3bb5aad4b9025134Pavel Labathvoid adbd_auth_init(void) {
26664d9adcea807aa1d31574b5b3bb5aad4b9025134Pavel Labath    int fd = android_get_control_socket("adbd");
26764d9adcea807aa1d31574b5b3bb5aad4b9025134Pavel Labath    if (fd == -1) {
2687a3f8d6691b3fbd8014a98de8455dbcfcc9629e4Yabin Cui        D("Failed to get adbd socket");
26964d9adcea807aa1d31574b5b3bb5aad4b9025134Pavel Labath        return;
27064d9adcea807aa1d31574b5b3bb5aad4b9025134Pavel Labath    }
27164d9adcea807aa1d31574b5b3bb5aad4b9025134Pavel Labath
27264d9adcea807aa1d31574b5b3bb5aad4b9025134Pavel Labath    if (listen(fd, 4) == -1) {
2737a3f8d6691b3fbd8014a98de8455dbcfcc9629e4Yabin Cui        D("Failed to listen on '%d'", fd);
274d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby        return;
275d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    }
276d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby
277d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    fdevent_install(&listener_fde, fd, adb_auth_listener, NULL);
278d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby    fdevent_add(&listener_fde, FDE_READ);
279d5fcafaf41f8ec90986c813f75ec78402096af2dBenoit Goby}
280