Соединение Android с пользовательским USB-адаптером Bluetooth - PullRequest
0 голосов
/ 31 августа 2018

Можно ли принудительно установить устаревший фиксированный ввод при подключении андроида к пользовательскому адаптеру USB, такому как DKBT111. Если посмотреть на SSP и пару «Просто работает», то это не соответствует требованиям безопасности, с которыми я работаю.

Я хотел бы гарантировать, что никто не сможет попытаться выполнить сопряжение с устройством USB, пока его можно обнаружить без фиксированного, предварительно заданного PIN-кода. У меня возникли проблемы при настройке контроллера с использованием bluetoothctl и Bluez. Лучшее, что я могу получить - это сравнение 6-значного пароля, но у меня не будет отображения кода на коробке, к которой будет подключен usb.

Какие настройки мне нужно изменить, чтобы можно было установить ПИН-код для сервера, и любой телефон должен вводить его для сопряжения?

Я использую Bluez на tinycore.

1 Ответ

0 голосов
/ 01 сентября 2018

Для реализации такого сценария вам может потребоваться реализовать пользовательский агент. Поскольку у вас нет дисплея, вы должны выбрать одну из возможностей вашего устройства из опции .

Bluez всегда ожидает не менее 6-значного PIN-кода, если вы хотите ограничить себя 4-значным PIN-кодом, тогда вам следует набирать «0», как указано здесь .

Для вашего пользовательского агента вам нужно реализовать метод " DisplayPinCode " или " DisplayPasskey ", возвращающий фиксированный PIN-код и регистрирующий его с помощью " RegisterAgent ".

Для ограничения только вашего Android-устройства вы можете сравнить MAC-адрес вашего устройства в DisplayPinCode / DisplayPasskey, который получает MAC-адрес устройства, запрашивающего сопряжение, как «Первый аргумент объект устройства ».

Обратите внимание, что "объектное устройство" - это MAC-адрес в виде пути к объекту, т.е. формат i / e / org / bluez / hciX / dev_AA_BB_CC_XX_YY_ZZ.

#include <glib.h>
#include <gio/gio.h>
#include "agent.h"

#define AGENT_PATH  "/org/bluez/AutoPinAgent"

static void bluez_agent_method_call(GDBusConnection *conn,
                    const gchar *sender,
                    const gchar *path,
                    const gchar *interface,
                    const gchar *method,
                    GVariant *params,
                    GDBusMethodInvocation *invocation,
                    void *userdata)
{
    g_print("Agent method call: %s.%s()", interface, method);
}

static const GDBusInterfaceVTable agent_method_table = {
    .method_call = bluez_agent_method_call,
};

int bluez_register_agent(GDBusConnection *con)
{
    GError *error = NULL;
    guint id = 0;
    GDBusNodeInfo *info = NULL;

    static const gchar bluez_agent_introspection_xml[] =
        "<node name='/org/bluez/SampleAgent'>"
        "   <interface name='org.bluez.Agent1'>"
        "       <method name='Release'>"
        "       </method>"
        "       <method name='RequestPinCode'>"
        "           <arg type='o' name='device' direction='in' />"
        "           <arg type='s' name='pincode' direction='out' />"
        "       </method>"
        "       <method name='DisplayPinCode'>"
        "           <arg type='o' name='device' direction='in' />"
        "           <arg type='s' name='pincode' direction='in' />"
        "       </method>"
        "       <method name='RequestPasskey'>"
        "           <arg type='o' name='device' direction='in' />"
        "           <arg type='u' name='passkey' direction='out' />"
        "       </method>"
        "       <method name='DisplayPasskey'>"
        "           <arg type='o' name='device' direction='in' />"
        "           <arg type='u' name='passkey' direction='in' />"
        "           <arg type='q' name='entered' direction='in' />"
        "       </method>"
        "       <method name='RequestConfirmation'>"
        "           <arg type='o' name='device' direction='in' />"
        "           <arg type='u' name='passkey' direction='in' />"
        "       </method>"
        "       <method name='RequestAuthorization'>"
        "           <arg type='o' name='device' direction='in' />"
        "       </method>"
        "       <method name='AuthorizeService'>"
        "           <arg type='o' name='device' direction='in' />"
        "           <arg type='s' name='uuid' direction='in' />"
        "       </method>"
        "       <method name='Cancel'>"
        "       </method>"
        "   </interface>"
        "</node>";

    info = g_dbus_node_info_new_for_xml(bluez_agent_introspection_xml, &error);
    if(error) {
        g_printerr("Unable to create node: %s\n", error->message);
        g_clear_error(&error);
        return 0;
    }

    id = g_dbus_connection_register_object(con, 
            AGENT_PATH,
            info->interfaces[0],
            &agent_method_table,
            NULL, NULL, &error);
    g_dbus_node_info_unref(info);
    //g_dbus_connection_unregister_object(con, id);
    return id;
}

Приведенный выше пример является неполным шаблоном без каких-либо специальных методов. Вам необходимо реализовать «DisplayPinCode / DisplayPasskey» внутри «bluez_agent_method_call» на основе имени «метода», которое приходит в качестве аргумента.

РЕДАКТИРОВАТЬ: Тот же пример для фиксированного ПИН-кода с более подробным ответом на этот вопрос . Добавление его для дальнейшего использования и полноты.

...