5 #include <bluetooth/bluetooth.h>
6 #include <bluetooth/rfcomm.h>
7 #include <bluetooth/sdp.h>
8 #include <bluetooth/sdp_lib.h>
11 #include <sys/select.h>
12 #include <sys/socket.h>
15 #include <sys/types.h>
26 #define SERVICE_NAME "Proxy Auth"
27 #define SERVICE_DESC "Continuous Authentication via Bluetooth"
28 #define SERVICE_PROV "ProxyAuth"
29 #define minThroughput 100
38 sdp_session_t *
sdp_connect(
const bdaddr_t *src,
const bdaddr_t *dst, uint32_t flags );
65 void set_service(uuid_t *svc_uuid, uuid_t *svc_class_uuid, sdp_list_t **svc_class_list, sdp_record_t *record, uint32_t *svc_uuid_int) {
70 sdp_uuid128_create(svc_uuid, svc_uuid_int);
71 sdp_set_service_id(record, *svc_uuid);
74 sdp_uuid2strn(svc_uuid, str, 256);
75 printf(
"Registering UUID %s\n", str);
78 sdp_uuid16_create(svc_class_uuid, SERIAL_PORT_SVCLASS_ID);
79 *svc_class_list = sdp_list_append(0, svc_class_uuid);
80 sdp_set_service_classes(record, *svc_class_list);
88 sdp_uuid16_create(&(profile->uuid), SERIAL_PORT_PROFILE_ID);
89 profile->version = 0x0100;
90 *profile_list = sdp_list_append(0, profile);
91 sdp_set_profile_descs(record, *profile_list);
97 void set_browsable(sdp_list_t **root_list, sdp_record_t *record, uuid_t *root_uuid) {
98 sdp_uuid16_create(root_uuid, PUBLIC_BROWSE_GROUP);
99 *root_list = sdp_list_append(0, root_uuid);
100 sdp_set_browse_groups(record, *root_list);
106 void set_l2cap_info(sdp_list_t **l2cap_list, sdp_list_t **proto_list, uuid_t *l2cap_uuid) {
107 sdp_uuid16_create(l2cap_uuid, L2CAP_UUID);
108 *l2cap_list = sdp_list_append(0, l2cap_uuid);
109 *proto_list = sdp_list_append(0, *l2cap_list);
116 sdp_data_t **channel,
117 sdp_record_t *record,
118 sdp_list_t **rfcomm_list,
119 sdp_list_t **proto_list,
120 sdp_list_t **access_proto_list,
122 uint8_t *rfcomm_channel
125 sdp_uuid16_create(rfcomm_uuid, RFCOMM_UUID);
126 *channel = sdp_data_alloc(SDP_UINT8, rfcomm_channel);
127 *rfcomm_list = sdp_list_append(0, rfcomm_uuid);
128 sdp_list_append(*rfcomm_list, *channel);
129 sdp_list_append(*proto_list, *rfcomm_list);
131 *access_proto_list = sdp_list_append(0, *proto_list);
132 sdp_set_access_protos(record, *access_proto_list);
151 uint32_t svc_uuid_int[] = { 0x01110000, 0x00100000, 0x80000080, 0xFB349B5F };
157 uuid_t svc_class_uuid;
160 sdp_list_t *l2cap_list = 0,
164 *access_proto_list = 0,
167 sdp_data_t *channel = 0;
168 sdp_profile_desc_t profile;
169 sdp_record_t *record = sdp_record_alloc();
170 sdp_session_t *session = 0;
176 set_service(&svc_uuid, &svc_class_uuid, &svc_class_list, record, svc_uuid_int);
184 register_rfcomm_sock(&channel, record, &rfcomm_list, &proto_list, &access_proto_list, &rfcomm_uuid, &rfcomm_channel);
187 sdp_set_info_attr(record, service_name, service_prov, svc_dsc);
195 session =
sdp_connect(BDADDR_ANY, BDADDR_LOCAL, SDP_RETRY_IF_BUSY);
199 sdp_data_free(channel);
200 sdp_list_free(l2cap_list, 0);
201 sdp_list_free(rfcomm_list, 0);
202 sdp_list_free(root_list, 0);
203 sdp_list_free(proto_list, 0);
204 sdp_list_free(access_proto_list, 0);
205 sdp_list_free(svc_class_list, 0);
206 sdp_list_free(profile_list, 0);
207 sdp_record_free(record);
216 int init_server(
struct sockaddr_rc *loc_addr, sdp_session_t **session) {
218 int s = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
222 loc_addr->rc_family = AF_BLUETOOTH;
223 loc_addr->rc_bdaddr = *BDADDR_ANY;
224 loc_addr->rc_channel = (uint8_t) 1;
227 bind(s, (
struct sockaddr *)loc_addr,
sizeof(*loc_addr));
244 system(
"dbus-send --type=method_call --dest=org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.Lock");
260 fprintf(stderr,
"usage: %s bt_addr\n", argv[0]);
265 fprintf(stderr,
"%s: %s is not a valid bluetooth address\n", argv[0], argv[1]);
280 int num_of_paired, num_of_devices;
281 char *username = getlogin();
284 char **trusted_devices;
287 goto is_trusted_terminate;
291 if (!(
is_dev_trusted(NULL, bt_addr, paired_devices, num_of_paired))) {
292 goto is_trusted_terminate;
296 if (!
is_dev_trusted(NULL, bt_addr, trusted_devices, num_of_devices)) {
297 goto is_trusted_terminate;
302 is_trusted_terminate:
303 if (trusted_devices) {
307 if (paired_devices) {
324 int connect_client(
int s,
struct sockaddr_rc *rem_addr, socklen_t *opt,
char *authorized_dev,
struct dbus_obj *data_obj) {
326 char buf[1024] = { 0 };
327 int client = accept(s, (
struct sockaddr *)rem_addr, opt);
328 fcntl(client, F_SETFL, O_NONBLOCK);
331 ba2str(&(rem_addr->rc_bdaddr), buf);
333 fprintf(stderr,
"accepted connection from %s\n", buf);
336 printf(
"%s is not trusted or not authorized to deauthenticate the system\n", buf);
343 int main (
int argc,
char **argv)
345 struct sockaddr_rc loc_addr = { 0 }, rem_addr = { 0 };
346 int server = -1, client = -1, bytes_read, num_bytes_read = 0;
347 socklen_t opt =
sizeof(rem_addr);
348 sdp_session_t *session = NULL;
380 memset(buf, 0,
sizeof(buf));
383 bytes_read = read(
client, buf,
sizeof(buf));
385 if(bytes_read > 0 && num_bytes_read < INT_MAX){
386 num_bytes_read += bytes_read;
390 if ((stop-start) > 5){
391 double throughput = num_bytes_read/(stop-start);
396 printf(
"Failed minimum throughput of %d. Received: %f\n",
minThroughput, throughput);
404 if (bytes_read > 0 && write(
client, buf, strlen(buf) < 0)) {
405 perror(
"Error writing to client");
408 write(
client, msg, strlen(msg));
sdp_session_t * sdp_connect(const bdaddr_t *src, const bdaddr_t *dst, uint32_t flags)
void set_l2cap_info(sdp_list_t **l2cap_list, sdp_list_t **proto_list, uuid_t *l2cap_uuid)
void lock(struct dbus_obj *data_obj)
void terminate_server(int server, int client, sdp_session_t *session)
int main(int argc, char **argv)
void set_browsable(sdp_list_t **root_list, sdp_record_t *record, uuid_t *root_uuid)
int connect_client(int s, struct sockaddr_rc *rem_addr, socklen_t *opt, char *authorized_dev, struct dbus_obj *data_obj)
int init_server(struct sockaddr_rc *loc_addr, sdp_session_t **session)
void set_bluetooth_service_info(sdp_profile_desc_t *profile, sdp_list_t **profile_list, sdp_record_t *record)
int sdp_close(sdp_session_t *session)
int check_arg(int argc, char **argv)
int is_trusted_client(char *bt_addr, const char *trusted_dir_path)
int sdp_record_register(sdp_session_t *sess, sdp_record_t *rec, uint8_t flags)
void set_service(uuid_t *svc_uuid, uuid_t *svc_class_uuid, sdp_list_t **svc_class_list, sdp_record_t *record, uint32_t *svc_uuid_int)
sdp_session_t * register_service(uint8_t rfcomm_channel)
void register_rfcomm_sock(sdp_data_t **channel, sdp_record_t *record, sdp_list_t **rfcomm_list, sdp_list_t **proto_list, sdp_list_t **access_proto_list, uuid_t *rfcomm_uuid, uint8_t *rfcomm_channel)
int verify_bt_addr(char *address, FILE *log_fp)
void free_device_list(char **device_list, int num_of_devices)
const char * trusted_dir_path
int is_dev_trusted(FILE *log_fp, char *dev, char **trusted_devices, int num_of_devices)
char ** get_paired_devices(int *num_of_paired)
char ** find_trusted_devices(FILE *log_fp, const char *trusted_dir_path, const char *username, int *num_of_devices)
struct dbus_obj * set_lock_listener(struct server_data_t *server)
void check_lock_status(GMainContext *context)
void terminate(struct dbus_obj *data_obj)