Hello All,
I have problem with pairing on a Bluetooth Device using SSP (Secure Simple Pairing) Just Works (NoInputNoOutput) and no MITM protection.
From a c++ program I have to discover and pair the bluetooth device.
I can discover the device and I do the pair.
But if I research the device the attribute fAuthenticated on the BLUETOOTH_DEVICE_INFO_STRUCT is FALSE.
This is my code:
BOOL CALLBACK auth_callback_ex_ssp(LPVOID pvParam, PBLUETOOTH_AUTHENTICATION_CALLBACK_PARAMS authParams)
{
BLUETOOTH_AUTHENTICATE_RESPONSE response = { sizeof(BLUETOOTH_AUTHENTICATE_RESPONSE) };
response.authMethod = authParams->authenticationMethod; // BLUETOOTH_AUTHENTICATION_METHOD_NUMERIC_COMPARISON
response.bthAddressRemote = authParams->deviceInfo.Address;
response.negativeResponse = FALSE;
// Respond with numerical value for Just Works pairing
response.numericCompInfo.NumericValue = 1;
DWORD retVal = BluetoothSendAuthenticationResponseEx(0, &response);
if (ERROR_SUCCESS != retVal)
{
TRACE(_T("BluetoothSendAuthenticationResponseEx() failed! %s"), MsBt7_ErrorDisp(retVal));
return (FALSE);
}
return (TRUE);
}
HBLUETOOTH_AUTHENTICATION_REGISTRATION authCallbackHandleSSP = NULL;
BOOL MsBt7_ExecAuthenticateDeviceEx(PBYTE address)
{
DWORD dwRes;
BLUETOOTH_DEVICE_INFO_STRUCT deviceInfo = { sizeof(BLUETOOTH_DEVICE_INFO_STRUCT) };
HBLUETOOTH_RADIO_FIND hFind;
HANDLE hRadio;
hFind = BluetoothFindFirstRadio(&btfrp, &hRadio);
if (NULL == hFind)
{
return (FALSE);
}
BLUETOOTH_RADIO_INFO radioInfo = { sizeof(BLUETOOTH_RADIO_INFO) };
if (ERROR_SUCCESS != BluetoothGetRadioInfo(hRadio, &radioInfo))
{
return FALSE;
}
CopyMemory(&deviceInfo.Address.rgBytes, address, sizeof(deviceInfo.Address.rgBytes));
dwRes = BluetoothRegisterForAuthenticationEx(&deviceInfo, &authCallbackHandleSSP, (PFN_AUTHENTICATION_CALLBACK_EX)auth_callback_ex_ssp, hRadio);
if (ERROR_SUCCESS != dwRes)
{
CloseHandle(hRadio);
BluetoothFindRadioClose(hFind);
return FALSE;
}
deviceInfo.fAuthenticated = 0;
dwRes = BluetoothAuthenticateDeviceEx(NULL, hRadio, &deviceInfo, NULL, MITMProtectionNotRequired);
if (ERROR_SUCCESS != dwRes)
{
CloseHandle(hRadio);
BluetoothFindRadioClose(hFind);
return (FALSE);
}
GUID pServiceGuid = SerialPortServiceClass_UUID;
dwRes = BluetoothSetServiceState(hRadio, &deviceInfo, &pServiceGuid, BLUETOOTH_SERVICE_ENABLE);
if (ERROR_SUCCESS != dwRes)
{
CloseHandle(hRadio);
BluetoothFindRadioClose(hFind);
return (FALSE);
}
// ... some code to get the com port
CloseHandle(hRadio);
BluetoothFindRadioClose(hFind);
return TRUE;
}The BluetoothAuthenticatedDeviceEx result is ERROR_SUCCESS and after that the fAuthenticated is TRUE.
I can also get the com port.
But if i try another search the fAuthenticated is FALSE again.
Instead if I do the pairing from the Windows user interface (add bluetooth device ...), I get fAuthenticated = TRUE.
Can someone help me?