NRF 51822ブルートゥースサービス(7):静的パスワードペア

5356 ワード

前言
接続時に鍵の検証を行い、接続の安全を保障することを望む場合があります.低消費電力のBluetoothのほとんどのセキュリティ機能を保証するには、2つの作業を完了する必要があります.まず、設備は互いにペアリングしなければならない.次に、デバイスは、プライバシーを暗号化し、保障し、メッセージを検証するための鍵を割り当てなければならない.ここでは、静的パスワードを使用してBluetoothペアリングを完了しようとします.
じっけんぶんせき
ここでは,従来のシリアルポート実験ルーチンを用いた.
ペアリング接続プロセス:
  • 携帯電話が接続されると、すぐにセキュリティ要求API(sd_ble_gap_authenticate)が呼び出され、携帯電話が受信するとペアリング要求が送信されます.
  • 携帯電話のペアリング要求に返信し、バインドしないように設定します.このように、携帯電話は、デバイスのセキュリティ要求を受信するたびに、ペアリング要求を送信し、ペアリングを開始します.
  • 以降のペアリングプロセスは自動的に行われます.受け取ったBLEに基づいてGAP_EVT_AUTH_STATUSイベントは,その状態が成功したか否かを判断し,ペアリングが成功したか否かを決定し,接続を切断することを決定する.

  • まず、静的パスワードを定義します.
    #define STATIC_PASSKEY "654321"

    注意:ペアリングパスワードは6桁のASCII文字列しか使用できません
    #define BLE_GAP_AUTH_KEY_TYPE_PASSKEY     0x01   /**< 6-digit Passkey. */
    
    /**@brief Event structure for @ref BLE_GAP_EVT_PASSKEY_DISPLAY. */
    typedef struct
    {
      uint8_t passkey[BLE_GAP_PASSKEY_LEN];         /**< 6-digit passkey in ASCII ('0'-'9' digits only). */
    } ble_gap_evt_passkey_display_t;

    次に、パスワード操作構造体を定義します.
    static ble_opt_t m_static_pin_option;

    以上の操作が完了したら、静的パスワードを設定する必要があります.設定した操作はプロトコルスタックの初期化後にする必要があります.そのため、設定したパスワード操作をgap_に置きます.params_Init()関数の最後:
    {
        uint32_t                err_code;
        ble_gap_conn_params_t   gap_conn_params;
        ble_gap_conn_sec_mode_t sec_mode;
    
        BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
        
        err_code = sd_ble_gap_device_name_set(&sec_mode,
                                              (const uint8_t *) DEVICE_NAME,
                                              strlen(DEVICE_NAME));
        APP_ERROR_CHECK(err_code);
    
        memset(&gap_conn_params, 0, sizeof(gap_conn_params));
    
        gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL;
        gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL;
        gap_conn_params.slave_latency     = SLAVE_LATENCY;
        gap_conn_params.conn_sup_timeout  = CONN_SUP_TIMEOUT;
    
        err_code = sd_ble_gap_ppcp_set(&gap_conn_params);
        APP_ERROR_CHECK(err_code);
    
        uint8_t passkey[] = STATIC_PASSKEY; 
        m_static_pin_option.gap_opt.passkey.p_passkey = passkey;
    							
        err_code=sd_ble_opt_set(BLE_GAP_OPT_PASSKEY,&m_static_pin_option);
        APP_ERROR_CHECK(err_code);
    }

    次に、ペアリングを設定するときに交換する情報です.
    次に、交換する必要がある情報のマクロ、すなわちセキュリティパラメータに関連するマクロを定義します.
    //     
    #define SEC_PARAM_BOND     0
    //       ,    MITM    ,      MITM
    #define SEC_PARAM_MITM     1
    

    これらを完了した後.携帯電話はペアリング要求を送信し、その後、デバイスは返信する必要があるので、ペアリング返信関数を実現する必要があります.
    #define SEC_PARAM_MIN_KEY_SIZE 7
    #define SEC_PARAM_MAX_KEY_SIZE 16
    ble_gap_sec_params_t sec_params;
    
    static void resp_pair_request()
    {
        uint32_t err_code;	
    
        sec_params.bond = SEC_PARAM_BOND;
        sec_params.mitm = SEC_PARAM_MITM;
        sec_params.io_caps = SEC_PARAM_IO_CAPABILITIES;
        sec_params.oob = SEC_PARAM_OOB;
        sec_params.min_key_size = SEC_PARAM_MIN_KEY_SIZE;
        sec_params.max_key_size = SEC_PARAM_MAX_KEY_SIZE;
    	
    	err_code= sd_ble_gap_sec_params_reply(m_conn_handle,
        BLE_GAP_SEC_STATUS_SUCCESS,&sec_params,NULL);
        APP_ERROR_CHECK(err_code);
    }

    最後に、上記の3番目のステップのコードを追加します.
    static void on_ble_evt(ble_evt_t * p_ble_evt)
    {
        uint32_t                         err_code;
        
        switch (p_ble_evt->header.evt_id)
        {
            case BLE_GAP_EVT_CONNECTED:
                err_code = bsp_indication_set(BSP_INDICATE_CONNECTED);
                APP_ERROR_CHECK(err_code);
                m_conn_handle = p_ble_evt->evt.gap_evt.conn_handle;
    			//            ,              
    			ble_gap_sec_params_t params;
    			params.bond = SEC_PARAM_BOND;
    			params.mitm = SEC_PARAM_MITM;
    			sd_ble_gap_authenticate(m_conn_handle, &params);
    			//
                break;
                
            case BLE_GAP_EVT_DISCONNECTED:
                err_code = bsp_indication_set(BSP_INDICATE_IDLE);
                APP_ERROR_CHECK(err_code);
                m_conn_handle = BLE_CONN_HANDLE_INVALID;
                break;
    
            case BLE_GAP_EVT_SEC_PARAMS_REQUEST:
            
    				   resp_pair_request();
    			
                break;
    		
    		case BLE_GAP_EVT_PASSKEY_DISPLAY:
    	
    			break;
    		
    		//        ,          ,          
    		case BLE_GAP_EVT_AUTH_STATUS:
    			if(p_ble_evt->evt.gap_evt.params.auth_status.auth_status == BLE_GAP_SEC_STATUS_SUCCESS)
    			{
    				printf("Success!");
    			}
    			else
    			{
    				sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
    			}
    			break;
    		//
    
            case BLE_GATTS_EVT_SYS_ATTR_MISSING:
                // No system attributes have been stored.
                err_code = sd_ble_gatts_sys_attr_set(m_conn_handle, NULL, 0, 0);
                APP_ERROR_CHECK(err_code);
                break;
    
            default:
                // No implementation needed.
                break;
        }
    }

    ここまで来ると、すべての操作が完了します.
    最後に、携帯電話がデバイスに接続されると、デバイスはすぐにセキュリティ要求を送信します.携帯電話とデバイスがバインドされていないため、携帯電話はデバイスから送信されたセキュリティ要求を受信すると、ペア要求をデバイスに送信します.デバイスは、ペアリング要求を返信し、バインドしない.デバイスの後続のペアリングプロセスは、プロトコルスタックによって自動的に完了し、最終的に上位ペアリング完了イベントに戻る.ペアリングが成功したかどうかを判断し、失敗したら接続を切断し、他人が勝手にデバイスに接続することを阻止する.
    結果検証
  • 携帯電話はBluetoothに接続して、私達はポップアップパスワードの入力ウィンドウ
  • を発見することができます
  • Bluetoothペアリング
  • を完了するには、「654321」と入力します.
  • Bluetoothの再接続を解除すると、パスワード
  • を再入力する必要があることがわかりました.
    まとめ
    この実験により,静的パスワードを用いてBluetoothに接続する方法を学んだ.