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