c++ - 为什么我无法通过外围设备进行身份验证?

标签 c++ .net networking tcp network-protocols

语言版本:Microsoft Visual C++ 2013 Redistributable (x85) – 12.0.30501

平台版本:4.0

操作系统:Microsoft Windows 8.1 6.3.9600 Build 9600

任何其他相关软件:

  1. 带有更新 4 的 Visual Studio 2013 社区
  2. 光环配置控制面板
  3. 光环中心

我想做什么

我正在尝试与使用 OSDP 协议(protocol)的外围设备通信。

实际发生了什么

我从 visual studio 的输出面板中得到以下内容。

  1. 收到326字节的有效数据包
  2. 收到来自 OSDP Hub 的身份验证响应
  3. session key > E856417D8B0364313A4B8F0D89524273F0F70AB1DFF8E950FE96905FECAC9F2F
  4. 3 毫秒后收到数据包
  5. 收到4个字节的有效数据包
  6. 收到来自 OSDP 中心的身份验证拒绝
  7. 0 毫秒后收到数据包
  8. 在 0 台设备上执行搜索

粗略复制

'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\Work\velox\admins-velox-project\proprietary\rtos\apps\chibios\utilities\osdp_client\Debug_msvc\osdp_client_mswud_vc11.exe'. Symbols loaded.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\Windows\SysWOW64\ntdll.dll'. Symbols loaded.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 

'C:\Windows\SysWOW64\kernel32.dll'. Symbols loaded.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 

'C:\Windows\SysWOW64\KernelBase.dll'. Symbols loaded.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\Windows\SysWOW64\user32.dll'. Symbols loaded.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\Windows\SysWOW64\gdi32.dll'. Symbols loaded.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\Windows\SysWOW64\comdlg32.dll'. Symbols loaded.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\Windows\SysWOW64\winspool.drv'. Symbols loaded.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\Windows\SysWOW64\winmm.dll'. Symbols loaded.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\Windows\SysWOW64\shell32.dll'. Cannot find or open the PDB file.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\Windows\WinSxS\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.9600.18006_none_a9ec6aab013aafee\comctl32.dll'. Symbols loaded.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\Windows\SysWOW64\ole32.dll'. Symbols loaded.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\Windows\SysWOW64\oleaut32.dll'. Symbols loaded.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\Windows\SysWOW64\rpcrt4.dll'. Cannot find or open the PDB file.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\Windows\SysWOW64\advapi32.dll'. Symbols loaded.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\Windows\SysWOW64\wsock32.dll'. Symbols loaded.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\Windows\SysWOW64\ws2_32.dll'. Cannot find or open the PDB file.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\Windows\SysWOW64\msvcp120d.dll'. Symbols loaded.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\Windows\SysWOW64\msvcr120d.dll'. Symbols loaded.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\Windows\SysWOW64\msvcrt.dll'. Symbols loaded.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\Windows\SysWOW64\shlwapi.dll'. Symbols loaded.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\Windows\SysWOW64\winmmbase.dll'. Symbols loaded.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\Windows\SysWOW64\combase.dll'. Cannot find or open the PDB file.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\Windows\SysWOW64\sechost.dll'. Symbols loaded.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\Windows\SysWOW64\sspicli.dll'. Symbols loaded.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\Windows\SysWOW64\nsi.dll'. Symbols loaded.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\Windows\SysWOW64\cfgmgr32.dll'. Symbols loaded.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\Windows\SysWOW64\devobj.dll'. Symbols loaded.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\Windows\SysWOW64\cryptbase.dll'. Symbols loaded.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\Windows\SysWOW64\SHCore.dll'. Cannot find or open the PDB file.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\Windows\SysWOW64\bcryptprimitives.dll'. Symbols loaded.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\Windows\SysWOW64\imm32.dll'. Symbols loaded.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\Windows\SysWOW64\msctf.dll'. Symbols loaded.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\Windows\SysWOW64\kernel.appcore.dll'. Symbols loaded.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\Windows\SysWOW64\uxtheme.dll'. Symbols loaded.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\ProgramData\Internet Helper Anti-phishing\internetHelper_antiphishing.dll'. Module was built without symbols.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\Windows\SysWOW64\version.dll'. Symbols loaded.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\Windows\SysWOW64\dwmapi.dll'. Symbols loaded.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\Windows\SysWOW64\IconCodecService.dll'. Symbols loaded.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\Windows\SysWOW64\WindowsCodecs.dll'. Symbols loaded.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\Windows\WinSxS\x86_microsoft.windows.gdiplus_6595b64144ccf1df_1.1.9600.18696_none_dae05f525bc50fb1\GdiPlus.dll'. Cannot find or open the PDB file.
Password = 1234
Private key = 03ac674216f3e15c761ee1a5e255f067
Added 0 items
'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\Windows\SysWOW64\mswsock.dll'. Cannot find or open the PDB file.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\Windows\SysWOW64\dnsapi.dll'. Symbols loaded.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\Windows\SysWOW64\FWPUCLNT.DLL'. Cannot find or open the PDB file.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\Windows\SysWOW64\rasadhlp.dll'. Symbols loaded.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\Windows\SysWOW64\cryptsp.dll'. Symbols loaded.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\Windows\SysWOW64\rsaenh.dll'. Cannot find or open the PDB file.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\Windows\SysWOW64\bcrypt.dll'. Symbols loaded.
..\..\src\common\strvararg.cpp(658): assert "n <= parser.nargs" failed in `anonymous-namespace'::DoGetArgumentType(): more arguments than format string specifiers? [in thread cb4]
First-chance exception at 0x76165608 (KernelBase.dll) in osdp_client_mswud_vc11.exe: 0x00001976.
'osdp_client_mswud_vc11.exe' (Win32): Loaded 'C:\Windows\SysWOW64\dbghelp.dll'. Symbols loaded.
DBGHELP: Symbol Search Path: .
DBGHELP: .\wkernelbase.pdb - file not found
DBGHELP: .\dll\wkernelbase.pdb - file not found
DBGHELP: .\symbols\dll\wkernelbase.pdb - file not found
DBGHELP: wkernelbase.pdb - file not found
DBGHELP: KERNELBASE - export symbols
DBGHELP: .\osdp_client_mswud_vc11.pdb - file not found
DBGHELP: .\exe\osdp_client_mswud_vc11.pdb - file not found
DBGHELP: .\symbols\exe\osdp_client_mswud_vc11.pdb - file not found
Received valid packet of 326 bytes
Received authentication response from OSDP Hub
Session Key > 63B2D0C583090EFD994B5AFE12A417A07F406CEE1F64DCB1613703B45428E32E
Received packet after 3 ms
Received valid packet of 4 bytes
Received authentication denial from OSDP Hub
Received packet after 2 ms
DBGHELP: osdp_client_mswud_vc11 - private symbols & lines 
        C:\Work\velox\admins-velox-project\proprietary\rtos\apps\chibios\utilities\osdp_client\Debug_msvc\osdp_client_mswud_vc11.pdb
DBGHELP: .\msvcr120d.i386.pdb - file not found
DBGHELP: .\dll\msvcr120d.i386.pdb - file not found
DBGHELP: .\symbols\dll\msvcr120d.i386.pdb - file not found
DBGHELP: msvcr120d.i386.pdb - file not found
DBGHELP: MSVCR120D - export symbols
DBGHELP: .\wntdll.pdb - file not found
DBGHELP: .\dll\wntdll.pdb - file not found
DBGHELP: .\symbols\dll\wntdll.pdb - file not found
DBGHELP: wntdll.pdb - file not found
DBGHELP: ntdll - export symbols
DBGHELP: .\wkernel32.pdb - file not found
DBGHELP: .\DLL\wkernel32.pdb - file not found
DBGHELP: .\symbols\DLL\wkernel32.pdb - file not found
DBGHELP: wkernel32.pdb - file not found
DBGHELP: KERNEL32 - export symbols

这是实际的代码;

case OSDP_HUB:
{
    bool ipv4;
    uint8_t ip_addr[16];

    osdp_hub_messages* hub = (osdp_hub_messages*)m_packets.get_data( OSDP_HUB );

    // goes from here to decode method ondown
    hub->decode( (uint8_t*)buffer, m_packets.get_header()->m_data.length );

    if ( hub->get_msg_type() == OSDP_HUB_TCP_IND )
    {
        hub->get_ip_addr( &ipv4, ip_addr );

        if ( hub->get_enable() )
        {
                        // Device has connected...
            wxLogDebug( wxT("Device connected on IP address %d.%d.%d.%d : %u"),
                ip_addr[0], ip_addr[1], ip_addr[2], ip_addr[3], hub->get_tcp_port() );

            m_tcp_device_connected = true;

                        // Assign an address
                        /// @todo Create an address generation function
            std::vector<uint8_t> ip_addr_vec;
            ip_addr_vec.resize( ipv4? 4 : 16 );
            memcpy( &ip_addr_vec[0], ip_addr, ipv4? 4 : 16 );
            m_tcp_map[0] = ip_addr_vec;

            MyCustomEvent customEvent( MyCustomCommandEvent, ID_EVENT_TCP_ADD );
            customEvent.SetText( _T( "SocketThread::Entry() ID_EVENT_TCP_ADD" ) );
            wxPostEvent( m_parent, customEvent );
        }
        else
        {
                        // Device has disconnected...
            wxLogDebug( wxT("Device disconnected on IP address %d.%d.%d.%d"),
                ip_addr[0], ip_addr[1], ip_addr[2], ip_addr[3] );

                        // Change the UI to display the nearest device on the list
            MyCustomEvent customEvent( MyCustomCommandEvent, ID_EVENT_TCP_REMOVE );
            customEvent.SetText( _T( "SocketThread::Entry() ID_EVENT_TCP_REMOVE" ) );
            wxPostEvent( m_parent, customEvent );
        }
    }
    else if ( hub->get_msg_type() == OSDP_HUB_AUTH_1 )
    {
        wxLogDebug( wxT("Received authentication response from OSDP Hub") );

        m_auth1_received = true;

        std::string salt = hub->get_salt();
        std::string key = hub->get_publickey();
        m_srp_auth->gen_client_session_key( salt, key );
        wxLogDebug( wxT("Session Key > %s"), m_srp_auth->get_session_key() );
        m_srp_auth->gen_client_cryptogram();
    }
    else if ( hub->get_msg_type() == OSDP_HUB_AUTH_3 ) // skips here
    {
        wxLogDebug( wxT("Received authentication accept from OSDP Hub") );

        m_auth3_received = true;
    }
    else if ( hub->get_msg_type() == OSDP_HUB_AUTH_4 ) // enters in here
    {
        wxLogDebug( wxT("Received authentication denial from OSDP Hub") );

        m_auth4_received = true;
    }
    else if ( hub->get_msg_type() == OSDP_HUB_PONG )
    {
        wxLogDebug( wxT("Received PONG from OSDP Hub") );

        m_pong_received = true;

        int32_t length;
        hub->encode( (uint8_t*)msg, &length );
        m_clientSocket->Write( (char*)msg, length );
    }
} break;


//comes in here
int32_t osdp_hub_messages::decode( uint8_t* buffer, int32_t len )
{
    return osdp_hub_messages_decode( &m_osdp_hub_messages, buffer, len );

} // decode()


// then comes in here
int32_t osdp_hub_messages_decode( osdp_hub_messages_t* data, uint8_t* buffer, int32_t len )
{
    //goes from OSDP_HUB_AUTH_2 t0 OSDP_HUB_AUTH_4
    //never hits OSDP_HUB_START or OSDP_HUB_TCP_IND
    data->hub_msg = (osdp_hub_e)buffer[0];


    switch ( data->hub_msg )
    {
        case OSDP_HUB_START: return decode_start( data, buffer+1, len ); break;
        case OSDP_HUB_TCP_IND: return decode_tcp_ind( data, buffer+1, len ); break;
        case OSDP_HUB_AUTH_0: return decode_auth_0( data, buffer+1, len ); break;
        case OSDP_HUB_AUTH_1: return decode_auth_1( data, buffer+1, len ); break;
        case OSDP_HUB_AUTH_2: return decode_auth_2( data, buffer+1, len ); break;
        case OSDP_HUB_AUTH_3: return decode_auth_2( data, buffer+1, len ); break;
        case OSDP_HUB_AUTH_4: return decode_auth_4( data, buffer+1, len ); break;
        case OSDP_HUB_PING: return decode_ping( data, buffer+1, len ); break;
        case OSDP_HUB_PONG: return decode_pong( data, buffer+1, len ); break;
        case OSDP_HUB_GET_AUTH_1: return decode_get_auth_1( data, buffer+1, len ); break;
        case OSDP_HUB_GET_AUTH_3: return decode_get_auth_3( data, buffer+1, len ); break;

        default:
        {
            return 0;
        } break;
    }

} // osdp_hub_messages_decode()

//additional code


/// @file osdp_halo_alarm_base.h
/// @brief A C implementation of the proprietary Halo alarm packet.
///
/// @author neil

#pragma once

#include "osdp_header.h"


#ifdef _cplusplus
extern "C" {
#endif

/// The ID used to define a HALO HUB packet
#define OSDP_HUB    0x00

typedef enum
{
    OSDP_HUB_START = 0,
    OSDP_HUB_TCP_IND,
    OSDP_HUB_AUTH_0,
    OSDP_HUB_AUTH_1,
    OSDP_HUB_AUTH_2,
    OSDP_HUB_AUTH_3,
    OSDP_HUB_AUTH_4,
    OSDP_HUB_PING,
    OSDP_HUB_PONG,
    OSDP_HUB_GET_AUTH_1,
    OSDP_HUB_GET_AUTH_3,
} osdp_hub_e;

struct _osdp_hub_messages_t
{
    osdp_hub_e     hub_msg;
    bool           enable;
    uint8_t        max_tcp;
    uint8_t        ip_addr[16];
    bool           ipv4;
    uint32_t       port;
    bool           success;
    uint8_t        username[17];
    uint8_t        publickey[321];
    uint8_t        salt[65];
    uint8_t        cryptogram[65];
    osdp_header_t* header;
};
typedef struct _osdp_hub_messages_t osdp_hub_messages_t;


/// @brief Translate the data structure to a packet for transmission
/// @param buffer An input data buffer used to store the packet
/// @param len The length of the output packet
void osdp_hub_messages_encode( osdp_hub_messages_t* data, uint8_t* buffer, int32_t* len );

/// @brief Translate a received packet into a data structure
/// @param data A struct containing the decoded output parameters
/// @param buffer An input data buffer used to store the packet
/// @param len The length of the input packet
/// @return The number of decoded bytes
int32_t osdp_hub_messages_decode( osdp_hub_messages_t* data, uint8_t* buffer, int32_t len );


#ifdef _cplusplus
}
#endif

//
// end of file
//

需要任何信息,我一定会添加的。感谢您的帮助!

最佳答案

您发布的代码看起来不像 SIA OSDP。 (根据 Sensurity 的网站,他们指的是 OSDP。)也许这是该机制的其他部分?当前 SIA OSDP 工作组关于 IP 网络上的 OSDP 的事件是围绕 TCP 上的 OSDP(使用现有的“安全通道”机制)或 TLS 上的 OSDP。

关于c++ - 为什么我无法通过外围设备进行身份验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45997669/

相关文章:

c++ - 在没有着色器的情况下在 OpenGL 中渲染深度缓冲区

c++ - coverity8 不支持 clang(不是 clangcc)

c++ - stringstream buffer的地址是怎么变化的

.net - 可空类型是否需要 DBNull.Value 作为 SqlCommand Parameter.Value

python - 是否可以使用 Python 将数据包注入(inject)现有的 tcp 连接?

C++ 变换和 lambda - 替换 for 循环

.net - 从 ToolStripPanel 中取消停靠 ToolStrip

c# - 使用 ZipOutputStream 归档多个文件给我一个空的归档文件

linux - 在 _interactive_ docker 启动之前,docker 容器似乎有失败的/etc/hosts

c++ - 数据包在 libnetfilter_queue 中永远循环