4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Hocheol Seo <hocheol.seo@samsung.com>
7 * Girishashok Joshi <girish.joshi@samsung.com>
8 * Chanyeol Park <chanyeol.park@samsung.com>
10 * Licensed under the Apache License, Version 2.0 (the "License");
11 * you may not use this file except in compliance with the License.
12 * You may obtain a copy of the License at
14 * http://www.apache.org/licenses/LICENSE-2.0
16 * Unless required by applicable law or agreed to in writing, software
17 * distributed under the License is distributed on an "AS IS" BASIS,
18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19 * See the License for the specific language governing permissions and
20 * limitations under the License.
29 #include "bluetooth-api.h"
30 #include "bt-service-common.h"
31 #include "bt-service-oob.h"
32 #include "bt-service-event.h"
34 static int __get_oob_data_from_variant(GVariant *variant,
35 unsigned char *buf, int size)
40 i = g_variant_get_size(variant);
41 v = (unsigned char *)g_variant_get_data(variant);
43 i = i > size ? size : i;
50 int _bt_oob_read_local_data(bt_oob_data_t *local_oob_data)
56 GDBusConnection *conn;
57 GVariant *hash192 = NULL;
58 GVariant *randomizer192 = NULL;
59 GVariant *hash256 = NULL;
60 GVariant *randomizer256 = NULL;
62 BT_CHECK_PARAMETER(local_oob_data, return);
64 conn = _bt_gdbus_get_system_gconn();
65 retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
67 adapter_path = _bt_get_adapter_path();
68 retv_if(adapter_path == NULL, BLUETOOTH_ERROR_INTERNAL);
70 proxy = g_dbus_proxy_new_sync(conn,
71 G_DBUS_PROXY_FLAGS_NONE, NULL,
72 BT_BLUEZ_NAME, adapter_path,
73 BT_OOB_INTERFACE, NULL, &err);
76 BT_ERR("Unable to create proxy");
78 BT_ERR("Error: %s", err->message);
81 return BLUETOOTH_ERROR_INTERNAL;
84 reply = g_dbus_proxy_call_sync(proxy, "ReadLocalData",
86 G_DBUS_CALL_FLAGS_NONE, -1,
88 g_object_unref(proxy);
91 BT_ERR("ReadLocalData dBUS-RPC is failed");
93 BT_ERR("D-Bus API failure: errCode[%x], message[%s]",
94 err->code, err->message);
97 return BLUETOOTH_ERROR_INTERNAL;
100 g_variant_get(reply, "(@ay@ay@ay@ay)", &hash192, &randomizer192,
101 &hash256, &randomizer256);
102 g_variant_unref(reply);
105 local_oob_data->hash_len = __get_oob_data_from_variant(hash192,
106 local_oob_data->hash,
107 sizeof(local_oob_data->hash));
108 g_variant_unref(hash192);
112 local_oob_data->randomizer_len = __get_oob_data_from_variant(randomizer192,
113 local_oob_data->randomizer,
114 sizeof(local_oob_data->randomizer));
115 g_variant_unref(randomizer192);
119 local_oob_data->hash256_len = __get_oob_data_from_variant(hash256,
120 local_oob_data->hash256,
121 sizeof(local_oob_data->hash256));
122 g_variant_unref(hash256);
126 local_oob_data->randomizer256_len = __get_oob_data_from_variant(randomizer256,
127 local_oob_data->randomizer256,
128 sizeof(local_oob_data->randomizer256));
129 g_variant_unref(randomizer256);
132 return BLUETOOTH_ERROR_NONE;
135 int _bt_oob_add_remote_data(
136 bluetooth_device_address_t *remote_device_address,
137 bt_oob_data_t *remote_oob_data)
145 char address[BT_ADDRESS_STRING_SIZE] = { 0 };
146 unsigned char *remote_hash;
147 unsigned char *remote_randomizer;
148 GDBusConnection *conn;
149 GVariantBuilder *builder;
150 GVariantBuilder *builder2;
152 GVariant *randomizer192;
154 GVariant *randomizer256;
156 BT_CHECK_PARAMETER(remote_device_address, return);
157 BT_CHECK_PARAMETER(remote_oob_data, return);
159 conn = _bt_gdbus_get_system_gconn();
160 retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
162 adapter_path = _bt_get_adapter_path();
163 retv_if(adapter_path == NULL, BLUETOOTH_ERROR_INTERNAL);
165 _bt_convert_addr_type_to_string(address, remote_device_address->addr);
167 proxy = g_dbus_proxy_new_sync(conn,
168 G_DBUS_PROXY_FLAGS_NONE, NULL,
169 BT_BLUEZ_NAME, adapter_path,
170 BT_OOB_INTERFACE, NULL, &err);
171 g_free(adapter_path);
173 BT_ERR("Unable to create proxy");
175 BT_ERR("Error: %s", err->message);
178 return BLUETOOTH_ERROR_INTERNAL;
182 dev_addr = g_strdup(address);
185 remote_hash = remote_oob_data->hash;
186 remote_randomizer = remote_oob_data->randomizer;
188 builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
189 builder2 = g_variant_builder_new(G_VARIANT_TYPE("ay"));
191 for (i = 0; i < remote_oob_data->hash_len; i++)
192 g_variant_builder_add(builder, "y", remote_hash[i]);
194 for (i = 0; i < remote_oob_data->randomizer_len; i++)
195 g_variant_builder_add(builder2, "y", remote_randomizer[i]);
197 hash192 = g_variant_new("ay", builder);
198 randomizer192 = g_variant_new("ay", builder2);
200 g_variant_builder_unref(builder2);
201 g_variant_builder_unref(builder);
204 remote_hash = remote_oob_data->hash256;
205 remote_randomizer = remote_oob_data->randomizer256;
207 builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
208 builder2 = g_variant_builder_new(G_VARIANT_TYPE("ay"));
210 for (i = 0; i < remote_oob_data->hash256_len; i++)
211 g_variant_builder_add(builder, "y", remote_hash[i]);
213 for (i = 0; i < remote_oob_data->randomizer256_len; i++)
214 g_variant_builder_add(builder2, "y", remote_randomizer[i]);
216 hash256 = g_variant_new("ay", builder);
217 randomizer256 = g_variant_new("ay", builder2);
219 g_variant_builder_unref(builder2);
220 g_variant_builder_unref(builder);
222 /* Call AddRemoteData Method */
223 reply = g_dbus_proxy_call_sync(proxy, "AddRemoteData",
224 g_variant_new("(s@ay@ay@ay@ay)", dev_addr,
225 hash192, randomizer192, hash256, randomizer256),
226 G_DBUS_CALL_FLAGS_NONE, -1,
228 g_object_unref(proxy);
231 /* Check the reply */
233 BT_ERR("AddRemoteData dBUS-RPC is failed");
235 BT_ERR("D-Bus API failure: errCode[%x], message[%s]",
236 err->code, err->message);
239 return BLUETOOTH_ERROR_INTERNAL;
241 g_variant_unref(reply);
243 return BLUETOOTH_ERROR_NONE;
246 int _bt_oob_remove_remote_data(
247 bluetooth_device_address_t *remote_device_address)
254 char address[BT_ADDRESS_STRING_SIZE] = { 0 };
255 GDBusConnection *conn;
257 BT_CHECK_PARAMETER(remote_device_address, return);
259 conn = _bt_gdbus_get_system_gconn();
260 retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
262 adapter_path = _bt_get_adapter_path();
263 retv_if(adapter_path == NULL, BLUETOOTH_ERROR_INTERNAL);
265 _bt_convert_addr_type_to_string(address,
266 remote_device_address->addr);
268 proxy = g_dbus_proxy_new_sync(conn,
269 G_DBUS_PROXY_FLAGS_NONE, NULL,
270 BT_BLUEZ_NAME, adapter_path,
271 BT_OOB_INTERFACE, NULL, &err);
272 g_free(adapter_path);
274 BT_ERR("Unable to create proxy");
276 BT_ERR("Error: %s", err->message);
279 return BLUETOOTH_ERROR_INTERNAL;
282 dev_addr = g_strdup(address);
284 /* Call RemoveRemoteData Method*/
285 reply = g_dbus_proxy_call_sync(proxy, "RemoveRemoteData",
286 g_variant_new("(s)", dev_addr),
287 G_DBUS_CALL_FLAGS_NONE, -1,
289 g_object_unref(proxy);
294 BT_ERR("RemoveRemoteData dBUS-RPC is failed");
296 BT_ERR("D-Bus API failure: errCode[%x], message[%s]",
297 err->code, err->message);
300 return BLUETOOTH_ERROR_INTERNAL;
303 g_variant_unref(reply);
304 return BLUETOOTH_ERROR_NONE;