From 79a90e585bdf726ab5b8e6d78a8cb3721e92d37e Mon Sep 17 00:00:00 2001 From: Mentalflow <312902918@qq.com> Date: Sat, 13 Jan 2024 04:41:18 +0800 Subject: [PATCH] Update workflow. --- .github/workflows/macos-shared.yml | 16 +- .github/workflows/macos-static.yml | 16 +- .github/workflows/ubuntu-shared.yml | 14 +- .github/workflows/ubuntu-static.yml | 16 +- .github/workflows/windows-mingw-shared.yml | 10 +- .github/workflows/windows-mingw-static.yml | 10 +- 3rdparty/RibbonUI | 2 +- app_source/CMakeLists.txt | 5 +- dlln3x/DLLN3X.cpp | 336 - dlln3x/DLLN3X.h | 62 - dlln3x/zigbeeframe.h | 247 - include/config.h | 29 - include/crypto.h | 34 - include/dlln3x_handler.h | 31 - include/eventsbus.h | 39 - include/protocol.h | 40 - include/protocol_data.h | 334 - include/serialportmanager.h | 65 - include/zigbeeparser.h | 53 - languages/en_US.ts | 23367 ------------------- languages/zh_CN.ts | 23367 ------------------- qml/Main.qml | 74 - qml/components/CenterView.qml | 83 - qml/components/DeviceList.qml | 238 - qml/components/EventsHistoryList.qml | 96 - qml/components/KeysList.qml | 137 - qml/components/ListTable.qml | 141 - qml/components/RibbonMessage.qml | 54 - qml/components/RibbonMessageListView.qml | 33 - qml/components/RibbonWindow.qml | 83 - qml/components/SerialPortAssistant.qml | 210 - qml/components/TabBar.qml | 432 - qml/components/ZigBeeDataView.qml | 189 - qml/components/ZigBeeFrame.qml | 366 - qml/components/ZigBeeMessage.qml | 74 - resources/icon.rc | 42 - resources/imgs/.DS_Store | Bin 6148 -> 0 bytes resources/imgs/AppIcon.icns | Bin 265721 -> 0 bytes resources/imgs/heart.png | Bin 33221 -> 0 bytes resources/imgs/icon.ico | Bin 39952 -> 0 bytes resources/imgs/icon.png | Bin 77629 -> 0 bytes resources/imgs/search.png | Bin 129100 -> 0 bytes sm_crypto/CMakeLists.txt | 26 - sm_crypto/include/big.h | 97 - sm_crypto/include/debug.h | 19 - sm_crypto/include/ecc.h | 74 - sm_crypto/include/inet.h | 36 - sm_crypto/include/random.h | 24 - sm_crypto/include/sm2.h | 43 - sm_crypto/include/sm3.h | 56 - sm_crypto/include/sm4.h | 25 - sm_crypto/include/typedef.h | 174 - sm_crypto/src/big.c | 989 - sm_crypto/src/debug.c | 57 - sm_crypto/src/ecc.c | 323 - sm_crypto/src/inet.c | 220 - sm_crypto/src/random.c | 89 - sm_crypto/src/sm2.c | 664 - sm_crypto/src/sm3.c | 403 - sm_crypto/src/sm4.c | 304 - source/config.cpp | 77 - source/crypto.cpp | 259 - source/dlln3x_handler.cpp | 56 - source/eventsbus.cpp | 44 - source/main.cpp | 43 - source/protocol.cpp | 227 - source/serialportmanager.cpp | 241 - source/zigbeeparser.cpp | 294 - 68 files changed, 26 insertions(+), 55183 deletions(-) delete mode 100644 dlln3x/DLLN3X.cpp delete mode 100644 dlln3x/DLLN3X.h delete mode 100644 dlln3x/zigbeeframe.h delete mode 100644 include/config.h delete mode 100644 include/crypto.h delete mode 100644 include/dlln3x_handler.h delete mode 100644 include/eventsbus.h delete mode 100644 include/protocol.h delete mode 100644 include/protocol_data.h delete mode 100644 include/serialportmanager.h delete mode 100644 include/zigbeeparser.h delete mode 100644 languages/en_US.ts delete mode 100644 languages/zh_CN.ts delete mode 100644 qml/Main.qml delete mode 100644 qml/components/CenterView.qml delete mode 100644 qml/components/DeviceList.qml delete mode 100644 qml/components/EventsHistoryList.qml delete mode 100644 qml/components/KeysList.qml delete mode 100644 qml/components/ListTable.qml delete mode 100644 qml/components/RibbonMessage.qml delete mode 100644 qml/components/RibbonMessageListView.qml delete mode 100644 qml/components/RibbonWindow.qml delete mode 100644 qml/components/SerialPortAssistant.qml delete mode 100644 qml/components/TabBar.qml delete mode 100644 qml/components/ZigBeeDataView.qml delete mode 100644 qml/components/ZigBeeFrame.qml delete mode 100644 qml/components/ZigBeeMessage.qml delete mode 100644 resources/icon.rc delete mode 100644 resources/imgs/.DS_Store delete mode 100644 resources/imgs/AppIcon.icns delete mode 100644 resources/imgs/heart.png delete mode 100644 resources/imgs/icon.ico delete mode 100644 resources/imgs/icon.png delete mode 100644 resources/imgs/search.png delete mode 100644 sm_crypto/CMakeLists.txt delete mode 100644 sm_crypto/include/big.h delete mode 100644 sm_crypto/include/debug.h delete mode 100644 sm_crypto/include/ecc.h delete mode 100644 sm_crypto/include/inet.h delete mode 100644 sm_crypto/include/random.h delete mode 100644 sm_crypto/include/sm2.h delete mode 100644 sm_crypto/include/sm3.h delete mode 100644 sm_crypto/include/sm4.h delete mode 100644 sm_crypto/include/typedef.h delete mode 100644 sm_crypto/src/big.c delete mode 100644 sm_crypto/src/debug.c delete mode 100644 sm_crypto/src/ecc.c delete mode 100644 sm_crypto/src/inet.c delete mode 100644 sm_crypto/src/random.c delete mode 100644 sm_crypto/src/sm2.c delete mode 100644 sm_crypto/src/sm3.c delete mode 100644 sm_crypto/src/sm4.c delete mode 100644 source/config.cpp delete mode 100644 source/crypto.cpp delete mode 100644 source/dlln3x_handler.cpp delete mode 100644 source/eventsbus.cpp delete mode 100644 source/main.cpp delete mode 100644 source/protocol.cpp delete mode 100644 source/serialportmanager.cpp delete mode 100644 source/zigbeeparser.cpp diff --git a/.github/workflows/macos-shared.yml b/.github/workflows/macos-shared.yml index 7b32174..2b20aaf 100644 --- a/.github/workflows/macos-shared.yml +++ b/.github/workflows/macos-shared.yml @@ -3,19 +3,13 @@ on: push: paths: - '*.txt' - - '*.qml' - - '*.cpp' - - '*.h' - - '*.hpp' + - 'app_source/**' - 'scripts/**' - '.github/workflows/macos-shared.yml' pull_request: paths: - '*.txt' - - '*.qml' - - '*.cpp' - - '*.h' - - '*.hpp' + - 'app_source/**' - 'scripts/**' - '.github/workflows/macos-shared.yml' @@ -59,19 +53,19 @@ jobs: - name: package run: | # 拷贝依赖 - macdeployqt /Users/runner/work/ProtocolParser/ProtocolParser/build/${targetName}.app -qmldir=. -verbose=1 -dmg + macdeployqt /Users/runner/work/ProtocolParser/ProtocolParser/build/app_source/${targetName}.app -qmldir=. -verbose=1 -dmg - uses: actions/upload-artifact@v2 with: name: ${{ env.targetName }}_${{ matrix.os }}_${{matrix.qt_ver}}_shared.zip - path: /Users/runner/work/ProtocolParser/ProtocolParser/build/${{ env.targetName }}.dmg + path: /Users/runner/work/ProtocolParser/ProtocolParser/build/app_source/${{ env.targetName }}.dmg - name: uploadRelease if: startsWith(github.event.ref, 'refs/tags/') uses: svenstaro/upload-release-action@v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} - file: /Users/runner/work/ProtocolParser/ProtocolParser/build/${{ env.targetName }}.dmg + file: /Users/runner/work/ProtocolParser/ProtocolParser/build/app_source/${{ env.targetName }}.dmg asset_name: ${{ env.targetName }}_${{ github.ref_name }}_${{ matrix.os }}_Qt${{ matrix.qt_ver }}_shared.dmg tag: ${{ github.ref }} overwrite: true diff --git a/.github/workflows/macos-static.yml b/.github/workflows/macos-static.yml index 8be351c..4e387e4 100644 --- a/.github/workflows/macos-static.yml +++ b/.github/workflows/macos-static.yml @@ -3,19 +3,13 @@ on: push: paths: - '*.txt' - - '*.qml' - - '*.cpp' - - '*.h' - - '*.hpp' + - 'app_source/**' - 'scripts/**' - '.github/workflows/macos-static.yml' pull_request: paths: - '*.txt' - - '*.qml' - - '*.cpp' - - '*.h' - - '*.hpp' + - 'app_source/**' - 'scripts/**' - '.github/workflows/macos-static.yml' @@ -59,19 +53,19 @@ jobs: - name: package run: | # 拷贝依赖 - macdeployqt /Users/runner/work/ProtocolParser/ProtocolParser/build/${targetName}.app -qmldir=. -verbose=1 -dmg + macdeployqt /Users/runner/work/ProtocolParser/ProtocolParser/build/app_source/${targetName}.app -qmldir=. -verbose=1 -dmg - uses: actions/upload-artifact@v2 with: name: ${{ env.targetName }}_${{ matrix.os }}_${{matrix.qt_ver}}_static.zip - path: /Users/runner/work/ProtocolParser/ProtocolParser/build/${{ env.targetName }}.dmg + path: /Users/runner/work/ProtocolParser/ProtocolParser/build/app_source/${{ env.targetName }}.dmg - name: uploadRelease if: startsWith(github.event.ref, 'refs/tags/') uses: svenstaro/upload-release-action@v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} - file: /Users/runner/work/ProtocolParser/ProtocolParser/build/${{ env.targetName }}.dmg + file: /Users/runner/work/ProtocolParser/ProtocolParser/build/app_source/${{ env.targetName }}.dmg asset_name: ${{ env.targetName }}_${{ github.ref_name }}_${{ matrix.os }}_Qt${{ matrix.qt_ver }}_static.dmg tag: ${{ github.ref }} overwrite: true diff --git a/.github/workflows/ubuntu-shared.yml b/.github/workflows/ubuntu-shared.yml index 8181251..4b6437c 100644 --- a/.github/workflows/ubuntu-shared.yml +++ b/.github/workflows/ubuntu-shared.yml @@ -4,19 +4,13 @@ on: push: paths: - '*.txt' - - '*.qml' - - '*.cpp' - - '*.h' - - '*.hpp' + - 'app_source/**' - 'scripts/**' - '.github/workflows/ubuntu-shared.yml' pull_request: paths: - '*.txt' - - '*.qml' - - '*.cpp' - - '*.h' - - '*.hpp' + - 'app_source/**' - 'scripts/**' - '.github/workflows/ubuntu-shared.yml' @@ -30,7 +24,7 @@ jobs: qt_ver: [6.2.4] qt_arch: [gcc_64] env: - targetName: ProtocolParser + targetName: Protocol-Parser steps: - name: Check out repository uses: actions/checkout@v3 @@ -74,7 +68,7 @@ jobs: # make sure Qt plugin finds QML sources so it can deploy the imported files export QML_SOURCES_PATHS=./ # 拷贝依赖 - linuxdeploy-x86_64.AppImage --plugin=qt --output=appimage --create-desktop-file --icon-file=${targetName}.svg --executable=/home/runner/work/ProtocolParser/ProtocolParser/build/${targetName} --appdir /home/runner/work/ProtocolParser/ProtocolParser/build/ + linuxdeploy-x86_64.AppImage --plugin=qt --output=appimage --create-desktop-file --icon-file=${targetName}.svg --executable=/home/runner/work/ProtocolParser/ProtocolParser/build/app_source/${targetName} --appdir /home/runner/work/ProtocolParser/ProtocolParser/build/app_source/ mv ${{ env.targetName }}-*.AppImage ${{ env.targetName }}_${{ matrix.os }}_${{matrix.qt_ver}}_shared.AppImage - uses: actions/upload-artifact@v2 diff --git a/.github/workflows/ubuntu-static.yml b/.github/workflows/ubuntu-static.yml index 1b4b531..9f7c303 100644 --- a/.github/workflows/ubuntu-static.yml +++ b/.github/workflows/ubuntu-static.yml @@ -4,21 +4,13 @@ on: push: paths: - '*.txt' - - 'lib_source/**' - - '*.qml' - - '*.cpp' - - '*.h' - - '*.hpp' + - 'app_source/**' - 'scripts/**' - '.github/workflows/ubuntu-static.yml' pull_request: paths: - '*.txt' - - 'lib_source/**' - - '*.qml' - - '*.cpp' - - '*.h' - - '*.hpp' + - 'app_source/**' - 'scripts/**' - '.github/workflows/ubuntu-static.yml' @@ -32,7 +24,7 @@ jobs: qt_ver: [6.2.4] qt_arch: [gcc_64] env: - targetName: ProtocolParser + targetName: Protocol-Parser steps: - name: Check out repository uses: actions/checkout@v3 @@ -76,7 +68,7 @@ jobs: # make sure Qt plugin finds QML sources so it can deploy the imported files export QML_SOURCES_PATHS=./ # 拷贝依赖 - linuxdeploy-x86_64.AppImage --plugin=qt --output=appimage --create-desktop-file --icon-file=${targetName}.svg --executable=/home/runner/work/ProtocolParser/ProtocolParser/build/${targetName} --appdir /home/runner/work/ProtocolParser/ProtocolParser/build/ + linuxdeploy-x86_64.AppImage --plugin=qt --output=appimage --create-desktop-file --icon-file=${targetName}.svg --executable=/home/runner/work/ProtocolParser/ProtocolParser/build/app_source/${targetName} --appdir /home/runner/work/ProtocolParser/ProtocolParser/build/app_source/ mv ${{ env.targetName }}-*.AppImage ${{ env.targetName }}_${{ matrix.os }}_Qt${{ matrix.qt_ver }}_static.AppImage - uses: actions/upload-artifact@v2 diff --git a/.github/workflows/windows-mingw-shared.yml b/.github/workflows/windows-mingw-shared.yml index 213d2a9..e1c8a55 100644 --- a/.github/workflows/windows-mingw-shared.yml +++ b/.github/workflows/windows-mingw-shared.yml @@ -3,19 +3,13 @@ on: push: paths: - '*.txt' - - '*.qml' - - '*.cpp' - - '*.h' - - '*.hpp' + - 'app_source/**' - 'scripts/**' - '.github/workflows/windows-mingw-shared.yml' pull_request: paths: - '*.txt' - - '*.qml' - - '*.cpp' - - '*.h' - - '*.hpp' + - 'app_source/**' - 'scripts/**' - '.github/workflows/windows-mingw-shared.yml' diff --git a/.github/workflows/windows-mingw-static.yml b/.github/workflows/windows-mingw-static.yml index 8fda670..b6dee6a 100644 --- a/.github/workflows/windows-mingw-static.yml +++ b/.github/workflows/windows-mingw-static.yml @@ -3,19 +3,13 @@ on: push: paths: - '*.txt' - - '*.qml' - - '*.cpp' - - '*.h' - - '*.hpp' + - 'app_source/**' - 'scripts/**' - '.github/workflows/windows-mingw-static.yml' pull_request: paths: - '*.txt' - - '*.qml' - - '*.cpp' - - '*.h' - - '*.hpp' + - 'app_source/**' - 'scripts/**' - '.github/workflows/windows-mingw-static.yml' diff --git a/3rdparty/RibbonUI b/3rdparty/RibbonUI index 4f733a3..1d25452 160000 --- a/3rdparty/RibbonUI +++ b/3rdparty/RibbonUI @@ -1 +1 @@ -Subproject commit 4f733a3316af9cd2e9bea0f448d4b010b8222c0f +Subproject commit 1d25452a4b715a95caef554c1178d26261693367 diff --git a/app_source/CMakeLists.txt b/app_source/CMakeLists.txt index c6aec88..4f5a545 100644 --- a/app_source/CMakeLists.txt +++ b/app_source/CMakeLists.txt @@ -39,9 +39,9 @@ if (WIN32) ) file(TO_CMAKE_PATH "/" PATH_SEPARATOR) if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") - set(DLLPATH 3rdparty/msvc/*.dll) + set(DLLPATH ../3rdparty/msvc/*.dll) else() - set(DLLPATH 3rdparty/mingw/*.dll) + set(DLLPATH ../3rdparty/mingw/*.dll) endif() string(REPLACE "/" ${PATH_SEPARATOR} DLLPATH "${DLLPATH}") file(GLOB DLL_FILES ${DLLPATH}) @@ -59,6 +59,7 @@ elseif(APPLE) ${App_ICON} ) else () + set(PROJECT_BUNDLE_NAME Protocol-Parser) qt_add_executable(${PROJECT_NAME} ${sources_files} ) diff --git a/dlln3x/DLLN3X.cpp b/dlln3x/DLLN3X.cpp deleted file mode 100644 index b019a52..0000000 --- a/dlln3x/DLLN3X.cpp +++ /dev/null @@ -1,336 +0,0 @@ -#include "DLLN3X.h" -#include -#include - -using namespace zigbee_protocol; - -DLLN3X::DLLN3X(QObject *parent) - : QObject{parent} -{ - -} - -DLLN3X* DLLN3X::instance(){ - static DLLN3X instance; - return &instance; -} - -void DLLN3X::init(QSerialPort* DSerial, uint32_t baudrate) -{ - _DSerial = DSerial; - uint8_t i = 0; - for (; i < 7; i++) - if (baudrate == _baud_rate_list[i]) - { - i = 20; - break; - } - if (i != 20) - return; - _DSerial->setBaudRate(baudrate); - _DSerial->setDataBits(QSerialPort::Data8); - _DSerial->setParity(QSerialPort::NoParity); - _DSerial->setStopBits(QSerialPort::OneStop); - if (!_DSerial->isOpen()) - { - if (!_DSerial->open(QIODevice::ReadWrite)) - return; - } - rled_blink(); - read_addr(); - read_baudrate(); - read_channel(); - read_network_id(); -} - -ZigbeeFrame DLLN3X::recv(bool non_blocked) -{ - uint8_t buf[66] = "", length = 0; - ZigbeeFrame zf; - if (non_blocked) { - if (_DSerial->bytesAvailable() < 6) - return zf; - } - _recv_lock = true; - length = readBytesUntil(0xFF, buf, 65); - _recv_lock = false; - zf.load_package(buf, length); - return zf; -} - -bool DLLN3X::send(ZigbeeFrame zf) -{ - bool status = false; - if (zf.getSrcPort() < 0x80) - return false; - status = _DSerial->write((char *)zf.data(),zf.size()); - return status; -} - -bool DLLN3X::send_cmd(uint8_t des_port, uint8_t arg, uint8_t* data, uint8_t data_length) -{ - ZigbeeFrame zf(0x80, des_port, 0x0000); - if (data_length - 4 > 63 - 1) - return false; - zf.append(arg); - zf.addData(data, data_length); - return send(zf); -} - -void DLLN3X::rled_blink(uint8_t time) -{ - uint8_t gap = 5; - // for (int i = 0; i < time; i += gap) { - // if (i % 2 != 0) - // send_cmd(0x20, gap); - // else - // _sleep(gap * 250); - // } - send_cmd(0x20, gap); -} - -uint16_t DLLN3X::read_addr() -{ - if (_self_addr != 0) - return _self_addr; - _self_addr = rw_config(CONFIG::ADDR); - return _self_addr; -} - -uint8_t DLLN3X::set_addr(uint16_t addr) -{ - uint8_t resp = rw_config(CONFIG::ADDR, addr, CONFIG_RW_MASK::WRITE); - if (resp == CONFIG_RESPONSE::DONE) - { - _self_addr = addr; - soft_reboot(); - } - return resp; -} - -uint32_t DLLN3X::read_baudrate() -{ - if (_self_baud_rate != 0) - return _self_baud_rate; - uint8_t arg = rw_config(CONFIG::BAUDRATE); - _self_baud_rate = _baud_rate_list[arg]; - return _self_baud_rate; -} - -uint8_t DLLN3X::set_baudrate(uint32_t baud_rate) -{ - uint8_t arg = 0; - uint8_t i = 0; - for (; i < 13; i++) - { - if (baud_rate == _baud_rate_list[i]) - { - arg = i; - break; - } - } - if (arg != i) - return CONFIG_RESPONSE::CMD_ERROR; - uint8_t resp = rw_config(CONFIG::BAUDRATE, arg, CONFIG_RW_MASK::WRITE); - if (resp == CONFIG_RESPONSE::DONE) - { - _self_baud_rate = baud_rate; - soft_reboot(); - } - return resp; -} - -uint8_t DLLN3X::read_network_id() -{ - if (_self_network_id != 0) - return _self_network_id; - _self_network_id = rw_config(CONFIG::NETWORKID); - return _self_network_id; -} - -uint8_t DLLN3X::set_network_id(uint16_t network_id) -{ - uint8_t resp = rw_config(CONFIG::NETWORKID, network_id, CONFIG_RW_MASK::WRITE); - if (resp == CONFIG_RESPONSE::DONE) - { - _self_network_id = network_id; - soft_reboot(); - } - return resp; -} - -uint8_t DLLN3X::read_channel() -{ - if (_self_channel != 0) - return _self_channel; - _self_channel = rw_config(CONFIG::CHANNEL); - return _self_channel; -} - -uint8_t DLLN3X::set_channel(uint8_t channel) -{ - uint8_t resp = rw_config(CONFIG::CHANNEL, channel, CONFIG_RW_MASK::WRITE); - if (resp == CONFIG_RESPONSE::DONE) - { - _self_channel = channel; - soft_reboot(); - } - return resp; -} - -uint16_t DLLN3X::rw_config(CONFIG arg, uint16_t data, CONFIG_RW_MASK mask) -{ - uint8_t cmd_arg = arg|mask; - if (mask == CONFIG_RW_MASK::WRITE) - { - if (arg == CONFIG::ADDR || arg == CONFIG::NETWORKID) - { - send_cmd(0x21, cmd_arg, (uint8_t *)&data, 2); - } - else - send_cmd(0x21, cmd_arg, (uint8_t *)&data, 1); - } - else - send_cmd(0x21, cmd_arg); - ZigbeeFrame zf = recv(false); - if (zf.getSrcPort() != 0x21 || zf.getDesPort() != 0x80 || zf.getRemoteAddr() != 0x0000) - return 0; - switch (arg) { - case CONFIG::ADDR: { - if (zf.getData()[0] != 0x21) { - if (zf.getData()[0] != CONFIG_RESPONSE::DONE) - { - printf("DLLN3X write config error: 0x"); - printf("%X\n", zf.getData()[0]); - } - return zf.getData()[0]; - } else - return (zf.getData()[2] << 8) | zf.getData()[1]; - } - case CONFIG::NETWORKID: { - if (zf.getData()[0] != 0x22) { - if (zf.getData()[0] != CONFIG_RESPONSE::DONE) - { - printf("DLLN3X write config error: 0x"); - printf("%X\n", zf.getData()[0]); - } - return zf.getData()[0]; - } else - return (zf.getData()[2] << 8) | zf.getData()[1]; - } - case CONFIG::CHANNEL: { - if (zf.getData()[0] != 0x23) { - if (zf.getData()[0] != CONFIG_RESPONSE::DONE) - { - printf("DLLN3X write config error: 0x"); - printf("%X\n", zf.getData()[0]); - } - return zf.getData()[0]; - } else - return zf.getData()[1]; - } - case CONFIG::BAUDRATE: { - if (zf.getData()[0] != 0x24) { - if (zf.getData()[0] != CONFIG_RESPONSE::DONE) - { - printf("DLLN3X write config error: 0x"); - printf("%X\n", zf.getData()[0]); - } - return zf.getData()[0]; - } else - return zf.getData()[1]; - } - default: - return CONFIG_RESPONSE::CMD_ERROR; - } -} - -void DLLN3X::soft_reboot() -{ - send_cmd(0x21, CONFIG::SOFT_REBOOT); - _self_addr = 0; - _self_baud_rate = 0; - _self_channel = 0; - _self_network_id = 0; -} - -uint8_t DLLN3X::get_link_quality(uint16_t des_addr, uint16_t src_addr) -{ - if (des_addr == 0x0000 || des_addr == 0xFFFF) - return CONFIG_RESPONSE::CMD_ERROR; - ZigbeeFrame zf(0x80, 0x23, src_addr), r_zf; - zf.addData((uint8_t *)&des_addr, 2); - r_zf = recv(false); - uint16_t pkg_des_addr = (r_zf.getData()[1] << 8) | r_zf.getData()[0]; - if (pkg_des_addr != des_addr) - return CONFIG_RESPONSE::PKG_DATA_ERROR; - else - return r_zf.getData()[2]; -} - -enum DLLN3X::PIN_CONTROL DLLN3X::pin_control(PIN pin, PIN_CONTROL cmd) -{ - send_cmd(pin, cmd); - if (cmd == PIN_CONTROL::READ_PIN) - { - ZigbeeFrame zf = recv(false); - return PIN_CONTROL(zf.getData()[0] ^ 0x10); - } - return cmd; -} - -void DLLN3X::loop() -{ - if (_DSerial->bytesAvailable() > 7 && !_recv_lock) { - ZigbeeFrame zf = recv(); - printf("Message: "); - for (int i = 0; i < zf.size(); i++) { - printf("%02X ", zf[i]); - } - printf("at port %02X from %04X:%02X.\n", zf.getDesPort(), zf.getRemoteAddr(), zf.getSrcPort()); - if (zf.getSrcPort() == 0x22) - { - printf("DLLN3X send msg error: 0x"); - printf("%X",zf.getData()[0]); - printf(", Send data to incorrect port: 0x"); - printf("%X\n",zf.getData()[1]); - } - emit recved(zf); - } -} - -int DLLN3X::readBytesUntil(uint8_t delimiter, uint8_t* buffer, qint64 maxSize) -{ - QByteArray data; - qint64 bytesRead = 0; - - while (bytesRead < maxSize) - { - if (_DSerial->bytesAvailable()) - { - qint64 bytesReadNow = _DSerial->read((char *)(buffer) + bytesRead, 1); - bytesRead += bytesReadNow; - - data.append((char *)(buffer) + bytesRead - bytesReadNow, bytesReadNow); - - if (data.contains(delimiter)) - { - break; - } - } - else - { - break; - } - } - return bytesRead; -} - -void DLLN3X::_sleep(int msec) -{ - QTime dieTime = QTime::currentTime().addMSecs(msec); - while( QTime::currentTime() < dieTime ) - QCoreApplication::processEvents(QEventLoop::AllEvents, 100); -} - -void DLLN3X::setcallback(void (*callback)(ZigbeeFrame& zf)) { _callback = callback; } diff --git a/dlln3x/DLLN3X.h b/dlln3x/DLLN3X.h deleted file mode 100644 index 1b87288..0000000 --- a/dlln3x/DLLN3X.h +++ /dev/null @@ -1,62 +0,0 @@ -#ifndef _DLLN3X_H_ -#define _DLLN3X_H_ - -#include -#include -#include "zigbeeframe.h" - -namespace zigbee_protocol { -class DLLN3X : public QObject { - Q_OBJECT - -private: - bool _online = false, _recv_lock = false; - uint8_t _self_channel = 0; - uint16_t _self_addr = 0x0000, _self_network_id = 0x0000; - uint32_t _self_baud_rate = 0; - const QSerialPort::BaudRate _baud_rate_list[7] = {QSerialPort::Baud2400, QSerialPort::Baud4800, QSerialPort::Baud9600, - QSerialPort::Baud19200, QSerialPort::Baud38400, QSerialPort::Baud57600, QSerialPort::Baud115200}; - QSerialPort* _DSerial; - void (*_callback)(ZigbeeFrame& zf) = nullptr; - int readBytesUntil(uint8_t delimiter, uint8_t* buf, qint64 maxSize); - void _sleep(int msec); - -public: - enum CONFIG_RW_MASK {READ = 0x00, WRITE = 0x10}; - enum CONFIG { ADDR = 0x01, NETWORKID = 0x02, CHANNEL = 0x03, BAUDRATE = 0x04 , SOFT_REBOOT = 0x10}; - enum CONFIG_RESPONSE { - DONE = 0x00, - PORT_REMOTE_ACCESS_DENIED = 0xF0, - CMD_ERROR = 0xF8, - PKG_LENGTH_ERROR = 0xF9, - PKG_DATA_ERROR = 0xFA - }; - enum PIN_CONTROL{ OUT_HIGH = 0x11, OUT_LOW = 0x10, READ_PIN = 0x12}; - enum PIN{ DLLN3X_PIN4 = 0x44, DLLN3X_PIN5 = 0x45}; - explicit DLLN3X(QObject *parent = nullptr); - static DLLN3X* instance(); - void init(QSerialPort* DSerial, uint32_t baudrate = 115200); - ZigbeeFrame recv(bool non_blocked = true); - bool send(ZigbeeFrame zf); - bool send_cmd(uint8_t des_port, uint8_t arg, uint8_t* data = nullptr, uint8_t data_length = 0); - void rled_blink(uint8_t time = 50); - void loop(); - void setcallback(void (*callback)(ZigbeeFrame& zf)); - uint16_t rw_config(CONFIG arg, uint16_t data = 0, CONFIG_RW_MASK mask = CONFIG_RW_MASK::READ); - uint8_t read_network_id(); - uint8_t set_network_id(uint16_t network_id); - uint8_t read_channel(); - uint8_t set_channel(uint8_t channel); - uint16_t read_addr(); - uint8_t set_addr(uint16_t addr); - uint32_t read_baudrate(); - uint8_t set_baudrate(uint32_t baud_rate); - void soft_reboot(); - uint8_t get_link_quality(uint16_t des_addr, uint16_t src_addr = 0x0000); - enum PIN_CONTROL pin_control(PIN pin, PIN_CONTROL cmd); - -signals: - void recved(ZigbeeFrame zf); -}; -} -#endif diff --git a/dlln3x/zigbeeframe.h b/dlln3x/zigbeeframe.h deleted file mode 100644 index 95a2dcd..0000000 --- a/dlln3x/zigbeeframe.h +++ /dev/null @@ -1,247 +0,0 @@ -#ifndef _ZIGBEEFRAME_H_ -#define _ZIGBEEFRAME_H_ -#include -#include - -namespace zigbee_protocol { -class ZigbeeFrame { -private: - const uint8_t head = 0xFE, tail = 0xFF; - uint8_t _length = 0, _src_port = 0, _des_port = 0; - uint8_t _pack_len = 0; - uint16_t _remote_addr = 0; - QList _data, _packed_data, _package; - -public: - ZigbeeFrame(char* data) { setData((uint8_t*)data, strlen(data)); }; - ZigbeeFrame(char* data, uint8_t length) { setData((uint8_t*)data, length); }; - ZigbeeFrame(uint8_t* data, uint8_t length) { setData(data, length); }; - ZigbeeFrame(uint8_t src_port, uint8_t des_port, uint16_t remote_addr, uint8_t* data, uint8_t data_length) - { - _length = data_length + 4; - _src_port = src_port; - _des_port = des_port; - _remote_addr = remote_addr; - setData(data, data_length); - }; - ZigbeeFrame(uint8_t src_port, uint8_t des_port, uint16_t remote_addr, char* data, uint8_t data_length) - { - _length = data_length + 4; - _src_port = src_port; - _des_port = des_port; - _remote_addr = remote_addr; - setData((uint8_t*)data, data_length); - }; - ZigbeeFrame(uint8_t src_port, uint8_t des_port, uint16_t remote_addr) - { - _src_port = src_port; - _des_port = des_port; - _remote_addr = remote_addr; - }; - ZigbeeFrame(const ZigbeeFrame& zf) - { - _length = zf._length; - _src_port = zf._src_port; - _des_port = zf._des_port; - _pack_len = zf._pack_len; - _remote_addr = zf._remote_addr; - _data = zf._data; - _packed_data = zf._packed_data; - _package = zf._package; - }; - ZigbeeFrame(const ZigbeeFrame* zf) - { - _length = zf->_length; - _src_port = zf->_src_port; - _des_port = zf->_des_port; - _pack_len = zf->_pack_len; - _remote_addr = zf->_remote_addr; - _data = zf->_data; - _packed_data = zf->_packed_data; - _package = zf->_package; - }; - ZigbeeFrame() {}; - void setDesPort(uint8_t des_port) { _des_port = des_port; }; - void setSrcPort(uint8_t src_port) { _src_port = src_port; }; - void setRemoteAddr(uint16_t remote_addr) { _remote_addr = remote_addr; }; - uint8_t getDesPort() { return _des_port; }; - uint8_t getSrcPort() { return _src_port; }; - uint16_t getRemoteAddr() { return _remote_addr; }; - uint8_t getLength() { return _data.size() + 4; }; - uint8_t getDataLength() { return _data.size(); }; - QList& getData() { return _data; }; - void setData(uint8_t* data, uint8_t length) - { - _data.clear(); - addData(data, length); - }; - void setData(char* data) { setData((uint8_t*)data, strlen(data)); }; - void setData(char* data, uint8_t length) { setData((uint8_t*)data, length); }; - void setData(QList data) { _data = data; }; - void addData(char* data) { addData(data, strlen(data)); }; - void addData(uint8_t* data, uint8_t length) - { - for (uint8_t i = 0; i < length; i++) { - _data.append(data[i]); - } - }; - void addData(char* data, uint8_t length) { addData((uint8_t*)data, length); }; - void addData(QList data) { _data.append(data); }; - void clear() - { - _package.clear(); - _packed_data.clear(); - _data.clear(); - }; - const uint8_t* data() - { - get_package(); - return _package.constData(); - }; - uint8_t data_size() { return _data.size(); }; - uint8_t size() - { - get_package(); - return _package.size(); - }; - void append(uint8_t byte) - { - _data.append(byte); - _length = _data.size() + 4; - }; - void pack() { pack(_data, _packed_data); }; - void pack(QList data, QList& pack_data) - { - pack_data.clear(); - for (int i = 0; i < data.size(); i++) { - if (data[i] == 0xFE) { - pack_data.append(data[i]); - pack_data.append(0xFC); - } else if (data[i] == 0xFF) { - pack_data.append(0xFE); - pack_data.append(0xFD); - } else { - pack_data.append(data[i]); - } - } - }; - void depack() { depack(_data, _packed_data); }; - void depack(QList& data, QList pack_data) - { - data.clear(); - for (int i = 0; i < pack_data.size(); i++) { - if (pack_data[i] != 0xFE) { - data.append(pack_data[i]); - } else if (pack_data[i + 1] == 0xFD) { - data.append(0xFF); - i++; - } else if (pack_data[i + 1] == 0xFC) { - data.append(0xFE); - i++; - } - } - }; - void make_package(uint8_t src_port, uint8_t des_port, uint16_t remote_addr, QList& package, - QList data, QList& pack_data) - { - pack(data, pack_data); - package.clear(); - package.append(head); - package.append(data.size() + 4); - package.append(src_port); - package.append(des_port); - package.append(remote_addr & 0xFF); - package.append((remote_addr >> 8) & 0xFF); - package.append(pack_data); - package.append(tail); - }; - QList get_package() - { - make_package(_src_port, _des_port, _remote_addr, _package, _data, _packed_data); - return _package; - }; - void load_package(QList& buf) { load_package(buf.constData(), buf.size()); }; - void load_package(const uint8_t* buf, uint8_t length) - { - _packed_data.clear(); - for (uint8_t i = 0; i < length; i++) { - _package.append(buf[i]); - if (i > 5 && i < length - 1) - _packed_data.append(buf[i]); - } - _length = _package[1]; - _src_port = _package[2]; - _des_port = _package[3]; - _remote_addr = _package[4] | (_package[5] << 8); - depack(_data, _packed_data); - }; - void print() - { - get_package(); - printf("src_port:"); - printf("%X\n", _src_port); - printf("des_port:"); - printf("%X\n",_des_port); - printf("remote_addr:"); - printf("%X\n",_remote_addr); - printf("data:"); - for (uint8_t i = 0; i < _data.size(); i++) { - printf("%02X ", _data[i]); - } - printf("\n"); - printf("packed_data:"); - for (uint8_t i = 0; i < _packed_data.size(); i++) { - printf("%02X ", _packed_data[i]); - } - printf("\n"); - printf("package:"); - for (uint8_t i = 0; i < _package.size(); i++) { - printf("%02X ", _package[i]); - } - printf("\n"); - } - ZigbeeFrame operator+(const ZigbeeFrame& zf) - { - ZigbeeFrame temp(this); - temp.addData(zf._data); - temp.get_package(); - return temp; - }; - void operator+=(const ZigbeeFrame& zf) - { - addData(zf._data); - get_package(); - }; - ZigbeeFrame& operator=(const ZigbeeFrame& zf) - { - if (this != &zf) { - _length = zf._length; - _src_port = zf._src_port; - _des_port = zf._des_port; - _pack_len = zf._pack_len; - _remote_addr = zf._remote_addr; - _data = zf._data; - _packed_data = zf._packed_data; - _package = zf._package; - } - return *this; - } - ZigbeeFrame operator+(char* data) - { - ZigbeeFrame temp(this); - temp.addData(data); - return temp; - }; - uint8_t& operator[](uint8_t i) - { - get_package(); - return _package[i]; - }; - void operator+=(char* data) - { - addData(data, (uint8_t)strlen(data)); - get_package(); - }; -}; -} -#endif diff --git a/include/config.h b/include/config.h deleted file mode 100644 index 618ac77..0000000 --- a/include/config.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef CONFIG_H -#define CONFIG_H - -#include -#include -#include - -class Config : public QObject -{ - Q_OBJECT - QML_ELEMENT - QML_NAMED_ELEMENT(Config) -public: - static Config* instance(); - static Config* create(QQmlEngine *qmlEngine, QJSEngine *jsEngine){return instance();} - Q_INVOKABLE void Set(QString qstrnodename,QString qstrkeyname,QVariant qvarvalue); - Q_INVOKABLE void SetArray(QString qstrnodename,QString qstrkeyname,QVariant qvarvalue); - Q_INVOKABLE QVariant Get(QString qstrnodename,QString qstrkeyname); - Q_INVOKABLE QVariant GetArray(QString qstrnodename,QString qstrkeyname); - void Clear(); -private: - Config(QString qstrfilename = ""); - ~Config(void); - QString m_qstrFileName; - QSettings *m_psetting=nullptr; -}; - -#endif // CONFIG_H - diff --git a/include/crypto.h b/include/crypto.h deleted file mode 100644 index 1b85353..0000000 --- a/include/crypto.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef CRYPTO_H -#define CRYPTO_H - -#include -#include -#include -#include -#include -#include -#include "protocol_data.h" - -class Crypto -{ -public: - static Crypto* getInstance(); - static int hex2bytearray(char s[], unsigned char bits[], u32 len); - static int hex2bytearray(char s[], unsigned char *bits); - static void bytearray2hex(u8 in_s[], char out_b[], u32 len = 32); - static void bytearray2hex(ecc_point in_s, char out_b[]); - static void pubhex2point(char *in_b, ecc_point *out_s); - static void sm2_key_gen(SM2_key *sm2_keypair,bool buffed=true); - static void SM2_encrypt(u8 *pub, u8 *M, u32 Mlen, u8 *C, u32 *Clen, s32 mode = 0); - static void SM2_decrypt(u8 *pri, u8 *C, u32 Clen, u8 *M, u32 *Mlen, s32 mode = 0); - static void SM2_sign(u8 *pri, u8 *data, u32 datalen, u8 *out); - static bool SM2_verify(u8 *pub, u8 *data, u32 data_len, u8 *sig); - static void SM3_HMAC(u8 *key, int keylen,u8 *input, int ilen,u8 output[32] ); - static bool SM4_encrypt(u8 *key_origin, u32 key_len, u8 *in_origin, u32 in_len, u8 *out, u32 *out_len); - static bool SM4_decrypt(u8 *key_origin, u32 key_len, u8 *in, u32 in_len, u8 *out, u32 *out_len); - static uint8_t get_rand(); -private: - Crypto(); -}; - -#endif // CRYPTO_H diff --git a/include/dlln3x_handler.h b/include/dlln3x_handler.h deleted file mode 100644 index 5507370..0000000 --- a/include/dlln3x_handler.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef DLLN3X_HANDLER_H -#define DLLN3X_HANDLER_H - -#include -#include -#include -#include "DLLN3X.h" -#include "3rdparty/RibbonUI/lib_source/definitions.h" - -class DLLN3X_Handler : public QObject -{ - Q_OBJECT - QML_ELEMENT - QML_SINGLETON - QML_NAMED_ELEMENT(DLLN3XHandler) - Q_PROPERTY_RW(bool, handle_serial); - Q_PROPERTY_RW(QSerialPort*, serial); -public: - explicit DLLN3X_Handler(QObject *parent = nullptr); - Q_INVOKABLE bool send(QString data); - -signals: - void zigbee_recved(QByteArray data, QByteArray sender); - -private: - zigbee_protocol::DLLN3X* _zigbee=nullptr; - void zigbee_callback(zigbee_protocol::ZigbeeFrame zframe); - void close(); -}; - -#endif // DLLN3X_HANDLER_H diff --git a/include/eventsbus.h b/include/eventsbus.h deleted file mode 100644 index 1b70dec..0000000 --- a/include/eventsbus.h +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef EVENTSBUS_H -#define EVENTSBUS_H - -#include -#include -#include -#include "3rdparty/RibbonUI/lib_source/definitions.h" - -class Event : public QObject -{ - Q_OBJECT - QML_ELEMENT - QML_NAMED_ELEMENT(Event) - Q_PROPERTY_RW(QByteArray,type) -public: - explicit Event(QObject *parent = nullptr){}; -signals: - void triggered(QJsonObject data); -}; - -class EventsBus : public QObject -{ - Q_OBJECT - QML_ELEMENT - QML_SINGLETON - QML_NAMED_ELEMENT(EventsBus) - Q_PROPERTY_RW(QList, event_history) -public: - static EventsBus* instance(); - static EventsBus* create(QQmlEngine *qmlEngine, QJSEngine *jsEngine){return instance();} - Q_INVOKABLE void push_data(QString type, QJsonObject data); - Q_INVOKABLE void reg_event(Event* event); - Q_INVOKABLE void unreg_event(Event* event); -private: - explicit EventsBus(QObject *parent = nullptr); - QList _events; -}; - -#endif // EVENTSBUS_H diff --git a/include/protocol.h b/include/protocol.h deleted file mode 100644 index 9ea81dc..0000000 --- a/include/protocol.h +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef _M_PROTOCOL_H_ -#define _M_PROTOCOL_H_ -#include "protocol_data.h" -#include "zigbeeframe.h" -#include "config.h" - -#define SELF_ADDR 0xEEEE //按照实际修改 - -namespace zigbee_protocol { -class Protocol -{ -public: - static Protocol* getInstance(); - void protocal_wrapper(data_frame *frame, u8 type, u16 length, u8 *data, bool use_crc); - void base_frame_maker(void *in_frame, base_frame *out_frame, u16 dest_addr,device *dev,u16 node_addr=0); - bool base_frame_parser(base_frame *in_frame, void **out_frame, device *dev); - uint16_t crc16_xmodem(const uint8_t *buffer, uint32_t buffer_length); - bool bytecmp(u8 *a, u8 *b, u16 length); - bool data_frame_verify(data_frame *frame); - void load_internal_keypair(int (*hex2bytearray)(char s[], unsigned char bits[], u32 len)); - void HMAC_identify(device *self, device *node, hmac_frame *hframe, - void (*sendToserver)(ZigbeeFrame &data), - void (*SM3_HMAC)(u8 *key, int keylen,u8 *input, int ilen,u8 output[32] )); - void HMAC_changeVerifykey(u8 key[16], device* self, device *node, void (*sendTonode)(ZigbeeFrame &data), - bool (* SM4_encrypt)(u8 *key_origin, u32 key_len, u8 *in_origin, u32 in_len, u8 *out, u32 *out_len)); - void zigbee_data_encrypt(data_frame *data, crypto_zdata_frame *zdata, - bool (* SM4_encrypt)(u8 *key_origin, u32 key_len, u8 *in_origin, u32 in_len, u8 *out, u32 *out_len), - QString en_key = ""); - bool zigbee_data_dectypt(data_frame *data, crypto_zdata_frame *zdata, - bool (* SM4_decrypt)(u8 *key_origin, u32 key_len, u8 *in, u32 in_len, u8 *out, u32 *out_len), - QString en_key = ""); - QString hmac_verify_key = "11223344556677888877665544332211"; - QStringList pre_hmac_verify_key; -private: - Protocol(); - ~Protocol(); - Config* _config = nullptr; -}; -} -#endif diff --git a/include/protocol_data.h b/include/protocol_data.h deleted file mode 100644 index f68a53d..0000000 --- a/include/protocol_data.h +++ /dev/null @@ -1,334 +0,0 @@ -#ifndef PROTOCOL_DATA_H -#define PROTOCOL_DATA_H -#include -#include "typedef.h" - -typedef struct SM2_KEY -{ - uint8_t pub_key[129]={0}; - uint8_t pri_key[65]={0}; -} SM2_key; - -typedef struct SM2_KEY_EXCHANGE -{ - uint8_t session_key[17]={0}; - uint8_t peer_pub_key[65]={0}; -} SM2_keyexc; - -typedef struct data_frame -{ - u16 head; - u8 type; - u8 use_crc; - u16 data_length; - u16 crc; - u8 data[1024]; -} data_frame; - -#define DATA_FRAME_PREFIX_LEN (sizeof(u16)*3+sizeof(u8)*2) -#define DATA_FRAME_HEAD 0xAAAA -#define new_data_frame(num) \ - struct \ -{ \ - u16 head; \ - u8 type; \ - u8 use_crc; \ - u16 data_length; \ - u16 crc; \ - u8 data[num]; \ - } - -typedef struct digi_env -{ - u16 head; - u16 length; - u8 crypted_session_key[112]; - u8 crypted_data[1024]; -} digi_env; - -#define SM4_PADDING_LEN sizeof(u8)*16 -#define DIGI_ENV_PREFIX_LEN sizeof(u16)*2 -#define DIGI_ENV_SESSION_KEY_LEN sizeof(u8)*112 -#define DIGI_ENV_HEAD 0xAAAB -#define new_digi_env(num) \ - struct \ -{ \ - u16 head; \ - u16 length; \ - u8 crypted_session_key[112]; \ - u8 crypted_data[num]; \ - } - -typedef struct ssl_frame -{ - u16 head; - u16 length; - u8 data[1024]; -} ssl_frame; - -#define SSL_FRAME_PREFIX_LEN sizeof(u16)*2 -#define SSL_FRAME_HEAD 0xAAAC -#define new_ssl_frame(num) \ - struct \ -{ \ - u16 head; \ - u16 length; \ - u8 data[num]; \ - } - -typedef struct base_frame -{ - u16 head; - u16 ori_addr; - u16 des_addr; - u16 node_addr; - u16 id; - u16 length; - u8 reset_num; - u8 rand_num; - u8 data[2048]; -} base_frame; - -#define BASE_FRAME_PREFIX_LEN (sizeof(u8)*2+sizeof(u16)*6) -#define BASE_FRAME_HEAD 0xAAAD -#define BASE_FRAME_RESET_NUM 10000 -#define new_base_frame(num) \ - struct \ -{ \ - u16 head; \ - u16 ori_addr; \ - u16 des_addr; \ - u16 node_addr; \ - u16 id; \ - u16 length; \ - u8 reset_num; \ - u8 rand_num; \ - u8 data[num]; \ - } - -#define HMAC_FRAME_PREFIX_LEN (sizeof(u16)*2+sizeof(u8)) -#define HMAC_FRAME_HEAD 0xAAAE -typedef struct hmac_frame -{ - u16 head; - u16 length; - u8 value; - u8 hmac[33]; -} hmac_frame; - -#define CRYPTO_ZDATA_FRAME_HEAD 0xAAAF -typedef struct crypto_zdata_frame -{ - u16 head; - u16 length; - u8 data[100]; -}crypto_zdata_frame; - -#define CRYPTO_ZDATA_FRAME_PREFIX_LEN sizeof(u16)*2 -#define new_crypto_zdata_frame(num) \ - struct \ -{ \ - u16 head; \ - u16 length; \ - u8 data[num]; \ - } - -#define RAND_DATA_PACK_PREFIX_LEN sizeof(u16) -typedef struct rand_data_pack -{ - u16 rand_num; - u8 *data; -}rand_data_pack; - -typedef struct device -{ - u16 addr; - u16 id; - u8 rand_num; - u8 verified; - u8 online; - u8 logined; - u8 stage; - u8 chlg_buf[8]; - u8 ip[30]; - u16 port; - SM2_keyexc key_pair; - bool operator == (const device &e){ - return this->addr == e.addr; - } -} device; - -#define MQTT_CLIENT_OFFLINE_DATA_TYPE 0 -#define MQTT_CLIENT_OFFLINE_DATA_LENGTH sizeof(u16) -typedef struct mqtt_client_offline_data -{ - u16 addr; -}mqtt_client_offline_data; - -#define LOGIN_DATA_TYPE 0 -#define LOGIN_DATA_LENGTH (sizeof(int)+sizeof(u8)*32) -typedef struct login_data -{ - int user_id; - unsigned char passwd_sm3[32]; -}login_data; - -#define LOGIN_RESP_LENGTH (sizeof(int)*3+sizeof(u8)*20) -typedef struct login_resp -{ - int user_id; - int gate_addr; - int identity; - unsigned char user_name[20]; -}login_resp; - -#define SENSOR_DATA_TYPE 1 -#define SENSOR_DATA_LENGTN sizeof(double)*4 -typedef struct sensor_data -{ - double ppm; - double temp; - double humi; - double flare; -}sensor_data; - -#define THRESHOLD_DATA_TYPE 2 -typedef struct threshold_data -{ - int air[2]; - int temp[2]; - int humi[2]; - int flare[2]; -}threshold_data; - -typedef struct thumb_member -{ - int id; - int identity; - char name[20]; - bool lock; - time_t time; -}thumb_member; - -#define THUMB_MEMBERS_DATA_TYPE 3 -#define THUMB_MEMBERS_DATA_PREFIX sizeof(int)*2 -typedef struct thumb_members_data -{ - int count; - thumb_member members[100]; -}thumb_members_data; - -typedef struct face_member -{ - int id; - int identity; - char name[20]; - time_t signin_time; - time_t signout_time; -}face_member; - -#define FACE_MEMBERS_DATA_TYPE 4 -#define FACE_MEMBERS_DATA_PREFIX sizeof(int)*2 -typedef struct face_members_data -{ - int count; - int online; - face_member members[100]; -}face_members_data; - -#define WARN_IMAGE_FIRE_TYPE 1 -#define WARN_IMAGE_PEOPLE_TYPE 2 - -#define WARN_DATA_TYPE 5 -typedef struct warn_data -{ - time_t time; - int gate; - int alert_id; - struct alert - { - unsigned char type; - double threshold_data; - double now_data; - bool is_predict; - }alert; -}warn_data; - -#define CLIENT_PHOTO_DATA_TYPE 7 -#define CLIENT_PHOTO_DATA_PREFIX (sizeof(int)*3+sizeof(char)*30+sizeof(u8)) -typedef struct client_photo_data -{ - int data_length; - int gate; - int image_id; - char name[30]; - u8 type; - u8 data[51200]; -}client_photo_data; - -#define new_client_photo_data(num) \ - struct client_photo_data \ -{ \ - int gate; \ - int image_id; \ - int data_length; \ - char name[30]; \ - u8 type; \ - u8 data[num]; \ - } - -#define ORI_FACE_MEMBER_DATA_TYPE 50 -#define ORI_FACE_MEMBER_DATA_PREFIX 2 -typedef struct ori_face_members_data -{ - u8 count; - bool is_offline; - u8 members[256]; -} ori_face_members_data; - -#define new_ori_face_members_data(num) \ - struct \ -{ \ - u8 count; \ - bool is_offline; \ - u8 members[num]; \ - } - -#define ORI_THUMB_MEMBER_DATA_TYPE 51 -typedef struct ori_thumb_member_data -{ - u8 id; - bool is_open; -}ori_thumb_member_data; - -#define PHOTO_DATA_TYPE 52 -#define PHOTO_DATA_PREFIX (sizeof(int)+sizeof(char)*30+sizeof(u8)) -typedef struct photo_data -{ - int data_length; - char name[30]; - u8 type; - u8 data[51200]; -}photo_data; - -#define new_photo_data(num) \ - struct photo_data \ -{ \ - int data_length; \ - char name[30]; \ - u8 type; \ - u8 data[num]; \ - } - -#define FUNC_DATA_TYPE 99 -typedef struct func_data -{ - bool sensor; - bool threshold; - bool warns; - bool face_member; - bool thumb_member; -}func_data; - - -#endif // PROTOCOL_DATA_H diff --git a/include/serialportmanager.h b/include/serialportmanager.h deleted file mode 100644 index 439b361..0000000 --- a/include/serialportmanager.h +++ /dev/null @@ -1,65 +0,0 @@ -#ifndef SERIALPORTMANAGER_H -#define SERIALPORTMANAGER_H - -#include -#include -#include -#include -#include "DLLN3X.h" -#include "3rdparty/RibbonUI/lib_source/definitions.h" -#include "zigbeeparser.h" -#include "eventsbus.h" - -class SerialPortManager : public QObject -{ - - Q_OBJECT - QML_ELEMENT - QML_SINGLETON - QML_NAMED_ELEMENT(SerialPortManager) - Q_PROPERTY(QList available_ports READ available_ports() NOTIFY available_portsChanged FINAL) - -public: - enum class SendType{ - Blank=0, - WithCarriageEnter=1, - WithLineFeed=2, - WithCarriageEnterAndLineFeed=3 - }; - Q_ENUM(SendType) - - Q_PROPERTY_RW(int, available_ports_count) - Q_PROPERTY_RW(bool, opened) - Q_PROPERTY_RW(bool, closed) - Q_PROPERTY_RW(bool, readyRead) - Q_PROPERTY_RW(bool, handledBymanager) - Q_PROPERTY_RW(bool, recv_hex) - Q_PROPERTY_RW(bool, send_hex) - Q_PROPERTY_RW(SendType, send_type) - -public: - static SerialPortManager* instance(); - static SerialPortManager* create(QQmlEngine *qmlEngine, QJSEngine *jsEngine){return instance();} - QList available_ports(); - Q_INVOKABLE bool open(QString port_name, QString baudrate, QString databits, - QString parity, QString stopbits); - Q_INVOKABLE void close(); - Q_INVOKABLE QByteArray read(); - Q_INVOKABLE bool write(QString data); - Q_INVOKABLE QSerialPort* get_serial(); - -signals: - void available_portsChanged(QList ports); -private: - explicit SerialPortManager(QObject *parent = nullptr); - ~SerialPortManager(); - QTimer _serial_port_scanner; - QSerialPort _serial_port; - zigbee_protocol::DLLN3X* _zigbee=nullptr; - void _ready_for_read(); - void zigbee_callback(zigbee_protocol::ZigbeeFrame zframe); - Event _event; - EventsBus* _bus = nullptr; -}; - -#endif // SERIALPORTMANAGER_H diff --git a/include/zigbeeparser.h b/include/zigbeeparser.h deleted file mode 100644 index cfd7f0d..0000000 --- a/include/zigbeeparser.h +++ /dev/null @@ -1,53 +0,0 @@ -#ifndef ZIGBEEPARSER_H -#define ZIGBEEPARSER_H - -#include -#include -#include -#include -#include -#include -#include "3rdparty/RibbonUI/lib_source/definitions.h" -#include "protocol.h" -#include "eventsbus.h" -#include "config.h" - -class ZigBeeParser : public QObject -{ - Q_OBJECT - QML_ELEMENT - QML_SINGLETON - QML_NAMED_ELEMENT(ZigBeeParser) - Q_PROPERTY_RW(QList, allow_list) - Q_PROPERTY_RW(QList, deny_list) - Q_PROPERTY_RW(QList, wait_queue) - Q_PROPERTY(QString self_addr READ self_addr FINAL) - Q_PROPERTY(QString hmac_verify_key READ hmac_verify_key WRITE setHmac_verify_key NOTIFY hmac_verify_keyChanged FINAL) - Q_PROPERTY(QStringList pre_hmac_verify_key READ pre_hmac_verify_key WRITE setPre_hmac_verify_key NOTIFY pre_hmac_verify_keyChanged FINAL) -public: - Q_INVOKABLE QString self_addr(){ return _self_addr;}; - QString hmac_verify_key(){ return _protocol->hmac_verify_key;}; - void setHmac_verify_key(QString key){ _config->Set("Protocol","hmac_verify_key",key); _protocol->hmac_verify_key = key;emit hmac_verify_keyChanged();}; - QStringList pre_hmac_verify_key(){ return _protocol->pre_hmac_verify_key;}; - void setPre_hmac_verify_key(QStringList keys){ _config->SetArray("Protocol","pre_hmac_verify_key",keys); _protocol->pre_hmac_verify_key = keys;emit pre_hmac_verify_keyChanged();}; - void data_parser(zigbee_protocol::ZigbeeFrame &zframe, bool is_demo = false); - void message_parser(QJsonObject message); - static ZigBeeParser* instance(); - static ZigBeeParser* create(QQmlEngine *qmlEngine, QJSEngine *jsEngine){return instance();} -signals: - void hmac_verify_keyChanged(); - void pre_hmac_verify_keyChanged(); -private: - explicit ZigBeeParser(QObject *parent = nullptr); - ~ZigBeeParser(); - void src_port_parser(zigbee_protocol::ZigbeeFrame &zframe, bool is_demo = false); - void des_port_parser(zigbee_protocol::ZigbeeFrame &zframe, bool is_demo = false); - void remote_addr_parser(zigbee_protocol::ZigbeeFrame &zframe, bool is_demo = false); - QMap> nodes; - Event _event; - EventsBus *_bus = nullptr; - zigbee_protocol::Protocol* _protocol = nullptr; - QString _self_addr = QString::number(SELF_ADDR,16).toUpper(); - Config* _config = nullptr; -}; -#endif // ZIGBEEPARSER_H diff --git a/languages/en_US.ts b/languages/en_US.ts deleted file mode 100644 index 33edbfd..0000000 --- a/languages/en_US.ts +++ /dev/null @@ -1,23367 +0,0 @@ - - - - - DeviceList - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 加入黑名单 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 通过验证 - - - - - - - - - - - - - - - - - - - - - - - 移出已认证列表 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 移出黑名单列表 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 移出认证列表 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 加入认证列表 - - - - - EventsHistoryList - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 清空历史 - - - - - KeysList - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 删除 - - - - - Main - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Protocol Parser - Protocol Parser - - - - - 串口设置 - SerialPort Settings - - - - - ZigBee协议 - ZigBee Protocol Settings - - - - - 设备列表 - Devices Lists - - - - - 调试选项 - Debug Settings - - - - - 其他 - Others - - - - - 主题 - Theme - - - - - - 参数配置 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Error loading component: - - - - - RibbonLineEdit - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Please input: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Clear - - - - - RibbonSwitchButton - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Open - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Close - - - - - RibbonTabBar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Show - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Hide - - - - - RibbonTextBoxMenu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Cut - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Copy - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Paste - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Select All - - - - - RibbonTitleBar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Close - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Minimize - Minimize - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Restore - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Maximize - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Style - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Modern - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Classic - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Dark Mode - - - - - RibbonWindow - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Quit - Quit - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Minimize - Minimize - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Cancel - Cancel - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Do you want to quit the APP? - Do you want to quit the APP? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Please note - Please note - - - - SerialPortAssistant - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 显示信息发送栏 - Show Message Send Bar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 隐藏信息发送栏 - Hide Message Send Bar - - - - TabBar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 串口设置 - SerialPort Settings - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 参数配置 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ZigBee协议 - ZigBee Protocol Settings - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 设备列表 - Devices Lists - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 调试选项 - Debug Settings - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 其他 - Others - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 主题 - Theme - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 端 口: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 波特率: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 数据位: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 位 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 校验码: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NONE - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - EVEN - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ODD - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 停止位: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 打开串口 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 关闭串口 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 串口消息设置 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 显示消息解析 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 自动定位最新消息 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 清除旧消息 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 串口助手设置 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 十六进制接收 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 十六进制发送 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 串口数据流向 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 传输至: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ZigBee - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 串口助手 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 等待列表 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 已认证列表 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 黑名单列表 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 生成接收数据 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 在接收数据流中生成一条测试接收数据 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 生成验证通过数据 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 在验证信息流中生成一组测试验证通过数据 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 生成验证等待数据 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 在验证信息流中生成一组测试验证等待数据 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 生成验证阻止数据 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 在验证信息流中生成一组测试验证阻止数据 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 生成验证失败数据 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 在验证信息流中生成一组测试验证失败数据 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 生成更换密钥数据 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 在验证信息流中生成一组测试更换密钥数据 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 历史信息 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 查看所有历史信息(包含调试信息) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 清空历史信息 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 清空所有历史信息(包含调试信息) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 浅色 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 深色 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 跟随系统 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 密钥管理 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 修改密钥: - - - - - 请输入密钥 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 保存 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 历史密钥列表 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 请输入16字节密钥 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 生成验证数据 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 在验证信息流中生成一组测试验证数据 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 事件历史信息 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 查看所有事件历史信息(包含调试信息) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 清空事件历史信息 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 清空所有事件历史信息(包含调试信息) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 等待队列 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 认证列表 - - - - - - - 请以16进制输入16字节密钥 - - - - - 请以HEX输入16字节密钥 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - HEX形式16字节密钥 - - - - - - - - - - - - - - - - - - - - - - - 在验证信息流中生成一组测试更换密钥数据,需要有至少一条过期密钥 - - - - diff --git a/languages/zh_CN.ts b/languages/zh_CN.ts deleted file mode 100644 index c89d4fa..0000000 --- a/languages/zh_CN.ts +++ /dev/null @@ -1,23367 +0,0 @@ - - - - - DeviceList - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 加入黑名单 - 加入黑名单 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 通过验证 - 通过验证 - - - - - - - - - - - - - - - - - - - - - - 移出已认证列表 - 移出已认证列表 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 移出黑名单列表 - 移出黑名单列表 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 移出认证列表 - 移出认证列表 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 加入认证列表 - - - - - EventsHistoryList - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 清空历史 - - - - - KeysList - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 删除 - - - - - Main - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Protocol Parser - 协议解析器 - - - - - 串口设置 - 串口设置 - - - - - - 参数配置 - 参数配置 - - - - - ZigBee协议 - 紫蜂协议 - - - - - 设备列表 - 设备列表 - - - - - 调试选项 - 调试选项 - - - - - 其他 - 其他选项 - - - - - 主题 - 主题设置 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Error loading component: - 加载组件出错: - - - - RibbonLineEdit - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Please input: - 请输入: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Clear - 清除 - - - - RibbonSwitchButton - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Open - 打开 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Close - 关闭 - - - - RibbonTabBar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Show - 显示 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Hide - 隐藏 - - - - RibbonTextBoxMenu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Cut - 剪切 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Copy - 拷贝 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Paste - 粘贴 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Select All - 全选 - - - - RibbonTitleBar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Close - 关闭 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Minimize - 最小化 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Restore - 还原 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Maximize - 最大化 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Style - 风格 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Modern - 现代 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Classic - 经典 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Dark Mode - 暗黑模式 - - - - RibbonWindow - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Quit - 退出 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Minimize - 最小化 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Cancel - 取消 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Do you want to quit the APP? - 确认退出程序吗? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Please note - 请注意 - - - - SerialPortAssistant - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 显示信息发送栏 - 显示信息发送栏 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 隐藏信息发送栏 - 隐藏信息发送栏 - - - - TabBar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 串口设置 - 串口设置 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 参数配置 - 参数配置 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ZigBee协议 - 紫蜂协议 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 设备列表 - 设备列表 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 调试选项 - 调试选项 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 其他 - 其他 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 主题 - 主题 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 端 口: - 端 口: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 波特率: - 波特率: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 数据位: - 数据位: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 位 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 校验码: - 校验码: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NONE - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - EVEN - 偶校验 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ODD - 奇校验 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 停止位: - 停止位: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 打开串口 - 打开串口 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 关闭串口 - 关闭串口 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 串口消息设置 - 串口消息设置 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 显示消息解析 - 显示消息解析 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 自动定位最新消息 - 自动定位最新消息 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 清除旧消息 - 清除旧消息 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 串口助手设置 - 串口助手设置 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 十六进制接收 - 十六进制接收 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 十六进制发送 - 十六进制发送 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 串口数据流向 - 串口数据流向 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 传输至: - 传输至: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ZigBee - 紫蜂 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 串口助手 - 串口助手 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 等待列表 - 等待列表 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 已认证列表 - 已认证列表 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 黑名单列表 - 黑名单列表 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 生成接收数据 - 生成接收数据 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 在接收数据流中生成一条测试接收数据 - 在接收数据流中生成一条测试接收数据 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 生成验证通过数据 - 生成验证通过数据 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 在验证信息流中生成一组测试验证通过数据 - 在验证信息流中生成一组测试验证通过数据 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 生成验证等待数据 - 生成验证等待数据 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 在验证信息流中生成一组测试验证等待数据 - 在验证信息流中生成一组测试验证等待数据 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 生成验证阻止数据 - 生成验证阻止数据 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 在验证信息流中生成一组测试验证阻止数据 - 在验证信息流中生成一组测试验证阻止数据 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 生成验证失败数据 - 生成验证失败数据 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 在验证信息流中生成一组测试验证失败数据 - 在验证信息流中生成一组测试验证失败数据 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 生成更换密钥数据 - 生成更换密钥数据 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 在验证信息流中生成一组测试更换密钥数据 - 在验证信息流中生成一组测试更换密钥数据 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 历史信息 - 历史信息 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 查看所有历史信息(包含调试信息) - 查看所有历史信息(包含调试信息) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 清空历史信息 - 清空历史信息 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 清空所有历史信息(包含调试信息) - 清空所有历史信息(包含调试信息) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 浅色 - 浅色 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 深色 - 深色 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 跟随系统 - 跟随系统 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 密钥管理 - 密钥管理 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 修改密钥: - 修改密钥: - - - - 请输入密钥 - 请输入密钥 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 保存 - 保存 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 历史密钥列表 - 历史密钥列表 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 请输入16字节密钥 - 请输入16字节密钥 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 生成验证数据 - 生成验证数据 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 在验证信息流中生成一组测试验证数据 - 在验证信息流中生成一组测试验证数据 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 事件历史信息 - 事件历史信息 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 查看所有事件历史信息(包含调试信息) - 查看所有事件历史信息(包含调试信息) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 清空事件历史信息 - 清空事件历史信息 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 清空所有事件历史信息(包含调试信息) - 清空所有事件历史信息(包含调试信息) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 等待队列 - 等待队列 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 认证列表 - 认证列表 - - - - - - 请以16进制输入16字节密钥 - - - - - 请以HEX输入16字节密钥 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - HEX形式16字节密钥 - - - - - - - - - - - - - - - - - - - - - - - 在验证信息流中生成一组测试更换密钥数据,需要有至少一条过期密钥 - - - - diff --git a/qml/Main.qml b/qml/Main.qml deleted file mode 100644 index 1ed10da..0000000 --- a/qml/Main.qml +++ /dev/null @@ -1,74 +0,0 @@ -import QtQuick -import QtQuick.Layouts -import QtQuick.Controls -import QtQuick.Window -import RibbonUI -import ProtocolParser -import org.wangwenx190.FramelessHelper -import "components" - -RibbonWindow { - id:root - width: 1200 - height: 800 - title: qsTr("Protocol Parser") - - TabBar{ - id: tab_bar - center_view: center_view - } - - CenterView{ - id: center_view - z:-2 - anchors{ - top: parent.top - bottom: parent.bottom - } - width:parent.width - tab_bar: tab_bar - bottom_bar: bottom_bar - } - - RibbonBottomBar{ - id: bottom_bar - anchors{ - left: parent.left - right: parent.right - bottom: parent.bottom - } - } - - Component.onCompleted: { - RibbonTheme.modern_style=true - } - - RibbonPopup{ - id:window_popup - onClosed: window_popup.contentItem.destroy() - } - - function show_popup(content_url, argument) - { - let component = Qt.createComponent(content_url,window_popup) - - if (component.status === Component.Error) { - console.log(qsTr("Error loading component:"), component.errorString()); - return - } - else - { - if (typeof(argument)!='undefined') - window_popup.contentItem = component.createObject(window_popup,argument) - else - window_popup.contentItem = component.createObject(window_popup) - } - window_popup.open() - } - - function close_popup() - { - window_popup.close() - window_popup.contentItem.destroy() - } -} diff --git a/qml/components/CenterView.qml b/qml/components/CenterView.qml deleted file mode 100644 index 2922368..0000000 --- a/qml/components/CenterView.qml +++ /dev/null @@ -1,83 +0,0 @@ -import QtQuick -import QtQuick.Layouts -import QtQuick.Controls -import RibbonUI -import ProtocolParser - -SwipeView{ - id: swipeview - currentIndex: 0 - property var tab_bar - property var bottom_bar - property alias zigbee_dataview: zigbee_dataview - property alias serial_assistant: serial_assistant - - ZigBeeDataView{ - id: zigbee_dataview - show_tooltip: tab_bar.show_tooltip - auto_scroll_to_bottom: tab_bar.auto_scroll_to_bottom - top_padding: tab_bar.height - bottom_padding: bottom_bar.height - handle_serial: swipeview.currentIndex === 0 - Rectangle{ - color: "transparent" - anchors{ - right: parent.right - verticalCenter: parent.verticalCenter - } - width: 30 - height: parent.height - HoverHandler{ - id: right_chevron_area_hh - } - RibbonButton{ - anchors{ - right: parent.right - verticalCenter: parent.verticalCenter - } - show_bg: false - ribbon_icon.icon_size: 20 - tip_text: "前往串口助手" - width: parent.width - height: parent.height * 0.1 - icon_source: RibbonIcons.ChevronCircleRight - visible: right_chevron_area_hh.hovered || hovered - onClicked: swipeview.incrementCurrentIndex() - } - } - } - SerialPortAssistant{ - id: serial_assistant - show_tooltip: tab_bar.show_tooltip - auto_scroll_to_bottom: tab_bar.auto_scroll_to_bottom - top_padding: tab_bar.height - bottom_padding: bottom_bar.height - handle_serial: swipeview.currentIndex === 1 - Rectangle{ - color: "transparent" - anchors{ - left: parent.left - verticalCenter: parent.verticalCenter - } - width: 30 - height: parent.height - HoverHandler{ - id: left_chevron_area_hh - } - RibbonButton{ - anchors{ - left: parent.left - verticalCenter: parent.verticalCenter - } - show_bg: false - ribbon_icon.icon_size: 20 - tip_text: "前往ZigBee数据流" - width: parent.width - height: parent.height * 0.1 - icon_source: RibbonIcons.ChevronCircleLeft - visible: left_chevron_area_hh.hovered || hovered - onClicked: swipeview.decrementCurrentIndex() - } - } - } -} diff --git a/qml/components/DeviceList.qml b/qml/components/DeviceList.qml deleted file mode 100644 index d6b3dd5..0000000 --- a/qml/components/DeviceList.qml +++ /dev/null @@ -1,238 +0,0 @@ -import QtQuick -import QtQuick.Layouts -import QtQuick.Controls -import RibbonUI -import ProtocolParser - -Item{ - id: obj - property string title: list_type === 0 ? "等待列表" : list_type === 1 ? "认证列表" : "黑名单列表" - property var header_items: ["序号","地址"] - property var header_items_width: [100,200] - property var data_source: [] - property int list_type: 0 - implicitHeight: list_layout.height - implicitWidth: list_layout.width - - onData_sourceChanged: { - list.data_model.clear() - list.data_model.append(data_source) - } - - Component.onCompleted: { - var data = [] - switch(list_type){ - case 0: - { - for (var i = 0; i < ZigBeeParser.wait_queue.length; i++) - { - data.push({"序号":i+1,"地址":'0x'+ZigBeeParser.wait_queue[i].toString(16).toUpperCase()}) - } - break - } - case 1: - { - for (let i = 0; i < ZigBeeParser.allow_list.length; i++) - { - data.push({"序号":i+1,"地址":'0x'+ZigBeeParser.allow_list[i].toString(16).toUpperCase()}) - } - break - } - case 2: - { - for (let i = 0; i < ZigBeeParser.deny_list.length; i++) - { - data.push({"序号":i+1,"地址":'0x'+ZigBeeParser.deny_list[i].toString(16).toUpperCase()}) - } - break - } - } - data_source = data - } - - Connections{ - target: ZigBeeParser - function onWait_queueChanged(){ - if (list_type !== 0) - return - let data = [] - for (let i = 0; i < ZigBeeParser.wait_queue.length; i++) - { - data.push({"序号":i+1,"地址":'0x'+ZigBeeParser.wait_queue[i].toString(16).toUpperCase()}) - } - data_source = data - } - - function onAllow_listChanged(){ - if (list_type !== 1) - return - let data = [] - for (let i = 0; i < ZigBeeParser.allow_list.length; i++) - { - data.push({"序号":i+1,"地址":'0x'+ZigBeeParser.allow_list[i].toString(16).toUpperCase()}) - } - data_source = data - } - - function onDeny_listChanged(){ - if (list_type !== 2) - return - let data = [] - for (let i = 0; i < ZigBeeParser.deny_list.length; i++) - { - data.push({"序号":i+1,"地址":'0x'+ZigBeeParser.deny_list[i].toString(16).toUpperCase()}) - } - data_source = data - } - } - - RibbonButton{ - anchors{ - top:parent.top - margins: 4 - right:parent.right - } - show_bg: false - show_hovered_bg: false - icon_source: RibbonIcons.Dismiss - onClicked: window_popup.close() - } - - ColumnLayout{ - id:list_layout - anchors{ - bottom: parent.bottom - horizontalCenter: parent.horizontalCenter - } - - RibbonText{ - id: title_text - Layout.topMargin: 30 - Layout.alignment: Qt.AlignHCenter - text: title - view_only: true - font.pixelSize: 15 - } - - ListTable { - id: list - header_items: obj.header_items - header_items_width: obj.header_items_width - margins: 0 - Layout.topMargin: 10 - Layout.leftMargin: 30 - Layout.rightMargin: Layout.leftMargin - Layout.bottomMargin: Layout.leftMargin - Layout.preferredHeight: implicitHeight > 250 ? 250 : implicitHeight - } - - RowLayout{ - spacing: 30 - Layout.alignment: Qt.AlignHCenter - Layout.bottomMargin: 30 - RibbonButton{ - show_tooltip: false - icon_source: RibbonIcons.Add - text: list_type !== 2 ? qsTr("加入黑名单") : qsTr("加入认证列表") - enabled: list.has_selected - onClicked: { - let deny = ZigBeeParser.deny_list - var data = [] - switch(list_type){ - case 0: - { - deny.push(ZigBeeParser.wait_queue[list.current_index]) - ZigBeeParser.deny_list = deny - for (var i = 0; i < ZigBeeParser.wait_queue.length; i++) - { - if (i === list.current_index) - continue - data.push(ZigBeeParser.wait_queue[i]) - } - ZigBeeParser.wait_queue = data - break - } - case 1: - { - deny.push(ZigBeeParser.allow_list[list.current_index]) - ZigBeeParser.deny_list = deny - for (let i = 0; i < ZigBeeParser.allow_list.length; i++) - { - if (i === list.current_index) - continue - data.push(ZigBeeParser.allow_list[i]) - } - ZigBeeParser.allow_list = data - break - } - case 2: - { - let allow = ZigBeeParser.allow_list - allow.push(ZigBeeParser.deny_list[list.current_index]) - ZigBeeParser.allow_list = allow - let data = [] - for (let i = 0; i < ZigBeeParser.deny_list.length; i++) - { - if (i === list.current_index) - continue - data.push(ZigBeeParser.deny_list[i]) - } - ZigBeeParser.deny_list = data - break - } - } - } - } - RibbonButton{ - show_tooltip: false - icon_source: list_type === 0 ? RibbonIcons.Add : RibbonIcons.Delete - text: list_type === 0 ? qsTr("加入认证列表") : list_type === 1 ? - qsTr("移出认证列表") : qsTr("移出黑名单列表") - enabled: list.has_selected - onClicked: { - switch(list_type){ - case 0: - { - let allow = ZigBeeParser.allow_list - allow.push(ZigBeeParser.wait_queue[list.current_index]) - ZigBeeParser.allow_list = allow - var data = [] - for (var i = 0; i < ZigBeeParser.wait_queue.length; i++) - { - if (i === list.current_index) - continue - data.push(ZigBeeParser.wait_queue[i]) - } - ZigBeeParser.wait_queue = data - break - } - case 1: - { - let data = [] - for (let i = 0; i < ZigBeeParser.allow_list.length; i++) - { - if (i === list.current_index) - continue - data.push(ZigBeeParser.allow_list[i]) - } - ZigBeeParser.allow_list = data - break - } - case 2: - { - let data = [] - for (let i = 0; i < ZigBeeParser.deny_list.length; i++) - { - if (i === list.current_index) - continue - data.push(ZigBeeParser.deny_list[i]) - } - ZigBeeParser.deny_list = data - break - } - } - } - } - } - } -} diff --git a/qml/components/EventsHistoryList.qml b/qml/components/EventsHistoryList.qml deleted file mode 100644 index 514c4cb..0000000 --- a/qml/components/EventsHistoryList.qml +++ /dev/null @@ -1,96 +0,0 @@ -import QtQuick -import QtQuick.Layouts -import QtQuick.Controls -import RibbonUI -import ProtocolParser - -Item { - id:obj - property var header_items: ["序号","事件"] - property var header_items_width: [100,400] - property var data_source: [] - implicitHeight: list_layout.height - implicitWidth: list_layout.width - - onData_sourceChanged: { - list.data_model.clear() - list.data_model.append(data_source) - } - - Component.onCompleted: { - var data = [] - for (var i = 0; i < EventsBus.event_history.length; i++) - { - data.push({"序号":i+1,"事件":JSON.stringify(EventsBus.event_history)}) - } - data_source = data - } - - Connections{ - target: EventsBus - function onEvent_historyChanged(){ - var data = [] - for (var i = 0; i < EventsBus.event_history.length; i++) - { - data.push({"序号":i+1,"事件":JSON.stringify(EventsBus.event_history)}) - } - data_source = data - } - } - - RibbonButton{ - anchors{ - top:parent.top - margins: 4 - right:parent.right - } - show_bg: false - show_hovered_bg: false - icon_source: RibbonIcons.Dismiss - onClicked: window_popup.close() - } - - ColumnLayout{ - id:list_layout - anchors{ - bottom: parent.bottom - horizontalCenter: parent.horizontalCenter - } - - RibbonText{ - id: title_text - Layout.topMargin: 30 - Layout.alignment: Qt.AlignHCenter - text: "事件列表" - view_only: true - font.pixelSize: 15 - } - - ListTable { - id: list - header_items: obj.header_items - header_items_width: obj.header_items_width - margins: 0 - Layout.topMargin: 10 - Layout.leftMargin: 30 - Layout.rightMargin: Layout.leftMargin - Layout.bottomMargin: Layout.leftMargin - Layout.preferredHeight: implicitHeight > 250 ? 250 : implicitHeight - } - - RowLayout{ - spacing: 30 - Layout.alignment: Qt.AlignHCenter - Layout.bottomMargin: 30 - RibbonButton{ - show_tooltip: false - icon_source: RibbonIcons.HistoryDismiss - text: qsTr("清空历史") - enabled: EventsBus.event_history.length - onClicked: { - EventsBus.event_history = [] - } - } - } - } -} diff --git a/qml/components/KeysList.qml b/qml/components/KeysList.qml deleted file mode 100644 index 4361315..0000000 --- a/qml/components/KeysList.qml +++ /dev/null @@ -1,137 +0,0 @@ -import QtQuick -import QtQuick.Layouts -import QtQuick.Controls -import RibbonUI -import ProtocolParser - -Item { - id:obj - property var header_items: ["序号","密钥"] - property var header_items_width: [100,300] - property var data_source: [] - implicitHeight: list_layout.height - implicitWidth: list_layout.width - - onData_sourceChanged: { - list.data_model.clear() - list.data_model.append(data_source) - } - - Component.onCompleted: { - var data = [] - for (var i = 0; i < ZigBeeParser.pre_hmac_verify_key.length; i++) - { - data.push({"序号":i+1,"密钥":key_format(ZigBeeParser.pre_hmac_verify_key[i])}) - } - data_source = data - } - - Connections{ - target: ZigBeeParser - function onPre_hmac_verify_keyChanged(){ - var data = [] - for (var i = 0; i < ZigBeeParser.pre_hmac_verify_key.length; i++) - { - data.push({"序号":i+1,"密钥":key_format(ZigBeeParser.pre_hmac_verify_key[i])}) - } - data_source = data - } - } - - RibbonButton{ - anchors{ - top:parent.top - margins: 4 - right:parent.right - } - show_bg: false - show_hovered_bg: false - icon_source: RibbonIcons.Dismiss - onClicked: window_popup.close() - } - - ColumnLayout{ - id:list_layout - anchors{ - bottom: parent.bottom - horizontalCenter: parent.horizontalCenter - } - - RibbonText{ - id: title_text - Layout.topMargin: 30 - Layout.alignment: Qt.AlignHCenter - text: "密钥列表" - view_only: true - font.pixelSize: 15 - } - - RowLayout{ - Layout.preferredWidth: list.implicitWidth - Layout.leftMargin: 30 - Layout.topMargin: 15 - RibbonText{ - id: c_key_text - text: "当前密钥:" - view_only: true - } - RibbonText{ - Layout.preferredWidth: implicitWidth > (parent.width - c_key_text.width) ? parent.width - c_key_text.width : implicitWidth - text: key_format(ZigBeeParser.hmac_verify_key) - font.bold: true - wrapMode: RibbonText.WordWrap - } - } - - RibbonText{ - text: `历史密钥(共${ZigBeeParser.pre_hmac_verify_key.length}个)` - Layout.leftMargin: 30 - view_only: true - } - - ListTable { - id: list - header_items: obj.header_items - header_items_width: obj.header_items_width - margins: 0 - Layout.topMargin: 10 - Layout.leftMargin: 30 - Layout.rightMargin: Layout.leftMargin - Layout.bottomMargin: Layout.leftMargin - Layout.preferredHeight: implicitHeight > 250 ? 250 : implicitHeight - } - - RowLayout{ - spacing: 30 - Layout.alignment: Qt.AlignHCenter - Layout.bottomMargin: 30 - RibbonButton{ - show_tooltip: false - icon_source: RibbonIcons.Delete - text: qsTr("删除") - enabled: list.has_selected - onClicked: { - let data = [] - for (let i = 0; i < ZigBeeParser.pre_hmac_verify_key.length; i++) - { - if (i === list.current_index) - continue - data.push(ZigBeeParser.pre_hmac_verify_key[i]) - } - ZigBeeParser.pre_hmac_verify_key = data - } - } - } - } - function key_format(key) - { - let str = '0x' - for (let i = 0; i < key.length; i++) - { - str += key[i] - if ((i + 1) % 2 === 0 && (i + 1) !== key.length) - str += ' 0x' - } - return str - } -} diff --git a/qml/components/ListTable.qml b/qml/components/ListTable.qml deleted file mode 100644 index e34857d..0000000 --- a/qml/components/ListTable.qml +++ /dev/null @@ -1,141 +0,0 @@ -import QtQuick -import QtQuick.Layouts -import QtQuick.Controls -import RibbonUI - -Item { - clip: true - property var header_items:[] - property var header_items_width:[] - property int row_spacing: 1 - property double margins: 30 - property int has_selected: 0 - property alias data_model: list_model - property alias current_index: list_table.currentIndex - property double max_height: 250 - ListModel{ - id: list_model - } - - implicitHeight: (list_table.implicitHeight + list_table.anchors.margins * 2) > implicitWidth ? - implicitWidth : (list_table.implicitHeight + list_table.anchors.margins * 2) - implicitWidth: getWidth() - - ListView{ - id: list_table - anchors{ - top:parent.top - horizontalCenter: parent.horizontalCenter - margins: margins - } - implicitHeight: contentHeight > max_height ? max_height : contentHeight - implicitWidth: parent.width - anchors.margins * 2 - clip: true - model: list_model - header: Item{ - implicitHeight: header_row.implicitHeight + 6 - implicitWidth: header_row.implicitWidth - RowLayout{ - id:header_row - spacing: row_spacing - Repeater{ - model: header_items - RibbonRectangle{ - implicitHeight: head.implicitHeight + 10 - implicitWidth: header_items_width[index] - topLeftRadius: index == 0 ? 5 : 0 - bottomLeftRadius: index == 0 ? 5 : 0 - topRightRadius: index == (header_items.length - 1) ? 5 : 0 - bottomRightRadius: index == (header_items.length - 1) ? 5 : 0 - color: RibbonTheme.dark_mode ? "#5E5C5B" : "#CBCAC9" - RibbonText{ - id:head - anchors.centerIn: parent - width: implicitWidth > parent.width - 10 ? parent.width - 10 : implicitWidth - text: modelData - wrapMode: RibbonText.WordWrap - view_only: true - } - } - } - } - } - - delegate: Item{ - implicitHeight: row_bg.implicitHeight + 6 - implicitWidth: row_bg.implicitWidth - Rectangle{ - id: row_bg - implicitHeight: row.implicitHeight - implicitWidth: row.implicitWidth - radius: 5 - color: mouse.containsMouse || row_bg.selected ? "#506BBD" : "transparent" - property bool selected: false - property bool is_focused: list_table.currentIndex === index - onIs_focusedChanged: { - if (!is_focused && selected) - row_bg.selected = !row_bg.selected - } - onSelectedChanged: has_selected += row_bg.selected ? 1 : -1 - RowLayout{ - id: row - spacing: row_spacing - Repeater{ - model: getRowValues(index) - RibbonRectangle{ - implicitHeight: text.implicitHeight + 10 - implicitWidth: modelData.width - color: "transparent" - RibbonText{ - id:text - anchors.centerIn: parent - width: implicitWidth > parent.width - 10 ? parent.width - 10 : implicitWidth - view_only: true - text: modelData.data - wrapMode: RibbonText.WordWrap - color: RibbonTheme.dark_mode ? mouse.containsMouse ? 'black' : 'white' : mouse.containsMouse ? 'white':'black' - } - } - } - } - MouseArea{ - id: mouse - anchors.fill: parent - hoverEnabled: true - onClicked: - { - list_table.currentIndex = index - row_bg.selected = !row_bg.selected - } - } - } - } - - add: Transition { - NumberAnimation { properties: "x,y"; from: list_table.height; duration: 1000 } - } - } - - function getRowValues(index) { - var obj = list_model.get(index) - if(!obj) - return - var data = [] - - for(let i=0;i - -IDI_ICON1 ICON "imgs/icon.ico" - -#define STR(x) #x -#define VER_JOIN(a,b,c,d) STR(a.b.c.d) -#define VER_JOIN_(x) VER_JOIN x -#define VER_STR VER_JOIN_((PROTOCOLPARSER_VERSION)) - -VS_VERSION_INFO VERSIONINFO -FILEVERSION PROTOCOLPARSER_VERSION -PRODUCTVERSION PROTOCOLPARSER_VERSION -FILEFLAGSMASK 0x3fL -#ifdef _DEBUG -FILEFLAGS VS_FF_DEBUG -#else -FILEFLAGS 0x0L -#endif -FILEOS VOS_NT_WINDOWS32 -FILETYPE VFT_APP -FILESUBTYPE VFT2_UNKNOWN -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904b0" - BEGIN - VALUE "Comments", "Made by Mentalflow." - VALUE "CompanyName", "Mentalflow" - VALUE "FileDescription", "Protocol Parser" - VALUE "FileVersion", VER_STR - VALUE "InternalName", "" - VALUE "LegalCopyright", "Copyright (C) 2023" - VALUE "OriginalFilename", "" - VALUE "ProductName", "Protocol Parser" - VALUE "ProductVersion", VER_STR - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1200 - END -END \ No newline at end of file diff --git a/resources/imgs/.DS_Store b/resources/imgs/.DS_Store deleted file mode 100644 index b553698a2d1f283fb49488185df67e2d8fee3dff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKJ5EDE3>-s>pfo8d_XJ4XU=<|=H5Y&Yf+8X)g8o%BTnce97=MI_9yCZaXe`;Y z>-D_No8mbJV2h{gQ(z8YN_WJwhq3v&`^XL|V?;Wi@rV;V;2yVUn^E=m3FjW+4mY^O z?kj(Lwcc#kJoTUULVtTN<60&Kq<|EV0#ZN<{8j<)y|n2pQBev=0V(jQfPWtv-LV%A ziSg-Rh!KD|VLFWKm?enK6U1IPBr-#@q!N>AHDXxOnQv9s3x~v{!{TN>r*5{IP%Lg| zzC}5#Cn`z-DX_1=VQ%N%|5x-M=KpUh_(K q<2on|(T<7Hj=Ax6d>lnt*L=^=H6!kx7BSR^S637#=kM diff --git a/resources/imgs/AppIcon.icns b/resources/imgs/AppIcon.icns deleted file mode 100644 index cded08bf3d5e60523cf1ec2a2e1e4a5dcf56d9a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 265721 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

Cbh(NW(0a^YDQ<)t*7uy@u=e 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 z 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%0Dgz~EU!XT)(k8}9Zy9|OEP;jzPW_jZdaaWAiX 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μr5%^0G$CPuA^=0~A@C?0?G%a{K~dHp8onYb^y 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 z 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%0AIY)8f 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 P0Cfc~rC*0Xp9}v3__uDE diff --git a/resources/imgs/heart.png b/resources/imgs/heart.png deleted file mode 100644 index 41735f470b2b8df1a0c21b00d5174178d4c51151..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33221 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 diff --git a/resources/imgs/icon.png b/resources/imgs/icon.png deleted file mode 100644 index dbcfcbf15b05a7dc24868e5c02558fcbb85b8347..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77629 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

4#vzYdML9jn}~JYEgkj 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. */ -void vli_mod_mult_fast(u64 *result, u64 *left, u64 *right, u64 *mod, u8 ndigits); - -/* Computes result = left^2 % curve->p. */ -void vli_mod_square_fast(u64 *result, u64 *left, u64 *mod, u8 ndigits); - -/* Computes result = in >> c, returning carry. Can modify in place - * (if result == in). 0 < shift < 64. - */ -u64 vli_rshift(u64 *result, u64 *in, u32 shift, u8 ndigits); - -/* Computes result = left + right, returning carry. Can modify in place. */ -u64 vli_add(u64 *result, u64 *left, u64 *right, u8 ndigits); - -/* Computes result = left - right, returning borrow. Can modify in place. */ -u64 vli_sub(u64 *result, u64 *left, u64 *right, u8 ndigits); - -/* Computes result = left * right. */ -void vli_mult(u64 *result, u64 *left, u64 *right, u8 ndigits); - -/* Computes result = left^2. */ -void vli_square(u64 *result, u64 *left, u8 ndigits); - -/* Computes result = (left + right) % mod. - Assumes that left < mod and right < mod, result != mod. */ -void vli_mod_add(u64 *result, u64 *left, u64 *right, u64 *mod, u8 ndigits); - -/* Computes result = (left - right) % mod. - Assumes that left < mod and right < mod, result != mod. */ -void vli_mod_sub(u64 *result, u64 *left, u64 *right, u64 *mod, u8 ndigits); - -/* Computes result = (left * right) % mod. */ -void vli_mod_mult(u64 *result, u64 *left, u64 *right, u64 *mod, u8 ndigits); - -/* Computes result = left^2 % mod. */ -void vli_mod_square(u64 *result, u64 *left, u64 *mod, u8 ndigits); - -/* Computes result = left^p % mod. */ -void vli_mod_exp(u64 *result, u64 *left, u64 *p, u64 *mod, u8 ndigits); - -/* Computes result = (product) % mod. */ -void vli_mod(u64 *result, u64 *product, u64 *mod, u8 ndigits); - -/* Computes result = (1 / input) % mod. All VLIs are the same size. - * See "From Euclid's GCD to Montgomery Multiplication to the Great Divide" - * https://labs.oracle.com/techrep/2001/smli_tr-2001-95.pdf - */ -void vli_mod_inv(u64 *result, u64 *input, u64 *mod, u8 ndigits); - -/* Computes result = (left / right). - * remainder = (left % right). - */ -void vli_div(u64 *result, u64 *remainder, u64 *left, u64 cdigits, u64 *right, u8 ddigits); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/sm_crypto/include/debug.h b/sm_crypto/include/debug.h deleted file mode 100644 index 1cc8b86..0000000 --- a/sm_crypto/include/debug.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef __DEBUG_H_ -#define __DEBUG_H_ - - -#ifdef __cplusplus -extern "C" { -#endif - -#define DEBUG 0 -#define ALG_DEBUG 0 - -void printHex(unsigned char *name, unsigned char *c, int n); -void speed_test( char *name, int len); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/sm_crypto/include/ecc.h b/sm_crypto/include/ecc.h deleted file mode 100644 index d249827..0000000 --- a/sm_crypto/include/ecc.h +++ /dev/null @@ -1,74 +0,0 @@ -#ifndef _ECC_H_ -#define _ECC_H_ - -#include "typedef.h" - - -#ifdef __cplusplus -extern "C" { -#endif - -#define ECC_WORDSIZE 8 -#define ECC_NUMBITS 256 -#define ECC_NUMWORD (ECC_NUMBITS/ECC_WORDSIZE) /*32*/ - -#define ECC_MAX_DIGITS 4 - -#define SWAP(a,b) { u32 t = a; a = b; b = t;} - -/* -#define digit2str16(x, y) { \ - (y)[0] = (u64)((x >> 8 ) & 0x000000FF); \ - (y)[1] = (u64)((x >> 0 ) & 0x000000FF); \ -} - -#define str2digit16(y, x) { \ - x = ((((u16)(y)[0]) & 0x000000FF) << 8) | \ - ((((u16)(y)[1]) & 0x000000FF) << 0 ); \ -} - -#define digit2str32(x, y) { \ - (y)[0] = (u64)((x >> 24) & 0x000000FF); \ - (y)[1] = (u64)((x >> 16) & 0x000000FF); \ - (y)[2] = (u64)((x >> 8 ) & 0x000000FF); \ - (y)[3] = (u64)((x >> 0 ) & 0x000000FF); \ -} - -#define str2digit32(y, x) { \ - x = ((((u32)(y)[0]) & 0x000000FF) << 24) | \ - ((((u32)(y)[1]) & 0x000000FF) << 16) | \ - ((((u32)(y)[2]) & 0x000000FF) << 8 ) | \ - ((((u32)(y)[3]) & 0x000000FF) << 0 ); \ -} -*/ - -typedef struct ecc_point -{ - u64 x[ECC_MAX_DIGITS]; - u64 y[ECC_MAX_DIGITS]; -} ecc_point; - -struct ecc_curve { - u8 ndigits; - struct ecc_point g; - u64 p[ECC_MAX_DIGITS]; - u64 n[ECC_MAX_DIGITS]; - u64 h[ECC_MAX_DIGITS]; - u64 a[ECC_MAX_DIGITS]; - u64 b[ECC_MAX_DIGITS]; -}; - -void ecc_bytes2native(u64 *native, void *bytes, u8 ndigits); -void ecc_native2bytes(void *bytes, u64 *native, u8 ndigits); - -void ecc_point_add(struct ecc_curve *curve, ecc_point *result, ecc_point *x, ecc_point *y); -void ecc_point_mult(struct ecc_curve *curve, ecc_point *result, ecc_point *point, u64 *scalar, u64 *initialZ); -void ecc_point_mult2(struct ecc_curve *curve, ecc_point *result, ecc_point *g, ecc_point *p, u64 *s, u64 *t); -int ecc_point_is_zero(struct ecc_curve *curve, ecc_point *point); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/sm_crypto/include/inet.h b/sm_crypto/include/inet.h deleted file mode 100644 index ec8bd51..0000000 --- a/sm_crypto/include/inet.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef __GMALG_INET_H__ -#define __GMALG_INET_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -u16 _htons(u16 hs); -u32 _htonl(u32 hl); - -u32 _htonl64(u64 hl); -u16 _ntohs(u16 ns); - -u64 _ntohl(u32 nl); -u64 _ntohl64(u64 nl); - -u16 le16_to_cpu(u16 data); -u32 le32_to_cpu(u32 data); - -u64 le64_to_cpu(u64 data); -u16 cpu_to_le16(u16 data); -u32 cpu_to_le32(u32 data); -u64 cpu_to_le64(u64 data); -u16 be16_to_cpu(u16 data); -u32 be32_to_cpu(u32 data); -u16 cpu_to_be16(u16 data); -u32 cpu_to_be32(u32 data); -u64 be64_to_cpu(u64 data); -u64 cpu_to_be64(u64 data); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/sm_crypto/include/random.h b/sm_crypto/include/random.h deleted file mode 100644 index d66a9d5..0000000 --- a/sm_crypto/include/random.h +++ /dev/null @@ -1,24 +0,0 @@ - -#ifndef _RANDOM_H_ -#define _RANDOM_H_ - -#include "typedef.h" - -#ifdef __cplusplus -extern "C" { -#endif - -void vli_set_random_mode(u32 mode); - -int vli_get_random_mode(void); - -void vli_set_random_fixed(u8 *data, u32 len); - -int vli_get_random(u8 *p_data, u32 len); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/sm_crypto/include/sm2.h b/sm_crypto/include/sm2.h deleted file mode 100644 index d1da95a..0000000 --- a/sm_crypto/include/sm2.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef _SM2_H_ -#define _SM2_H_ - -#include "typedef.h" -#include "ecc.h" - -#ifdef __cplusplus -extern "C" { -#endif - -int sm2_make_prikey(u8 *prikey); -int sm2_make_pubkey(u8 *prikey, ecc_point *pubkey); -int sm2_make_keypair(u8 *prikey, ecc_point *pubkey); -int sm2_sign(u8 *r, u8 *s, u8 *pri, u8 *hash); -int sm2_verify(ecc_point *pubkey, u8 *hash, u8 *r, u8 *s); - -int sm2_encrypt(ecc_point *pubKey, u8 *M, u32 Mlen, u8 *C, u32 *Clen); -int sm2_decrypt(u8 *prikey, u8 *C, u32 Clen, u8 *M, u32 *Mlen); - -void sm3_z(u8 *id, u32 idlen, ecc_point *pub, u8 *hash); -int sm2_shared_point(u8* selfPriKey, u8* selfTempPriKey, ecc_point* selfTempPubKey, - ecc_point *otherPubKey, ecc_point* otherTempPubKey, ecc_point *key); -void sm2_shared_key(ecc_point *point, u8 *ZA, u8 *ZB, u32 keyLen, u8 *key); -int sm2_point_mult(ecc_point *G, u8 *k, ecc_point *P); - -int sm2_C1C2C3ConvertToC1C3C2(u8 *pOut, u8 *pIn, s32 len, s32 mode); - -int ECC_KeyEx_Init_I(u8 *pri, ecc_point *pub); - -int ECC_KeyEx_Re_I(u8 *rb, u8 *dB, ecc_point *RA, ecc_point *PA, - u8* ZA, u8 *ZB, u8 *K, u32 klen, ecc_point *RB, - ecc_point *V, u8* hash); - -int ECC_KeyEx_Init_II(u8* ra, u8* dA, ecc_point* RA, ecc_point* RB, ecc_point* PB, u8 - ZA[],u8 ZB[],u8 SB[],u8 K[], u32 klen,u8 SA[]); - -int ECC_KeyEx_Re_II(ecc_point *V,ecc_point *RA,ecc_point *RB,u8 ZA[],u8 ZB[],u8 SA[]); - -#ifdef __cplusplus -} -#endif - -#endif /* _SM2_H_ */ diff --git a/sm_crypto/include/sm3.h b/sm_crypto/include/sm3.h deleted file mode 100644 index 732b997..0000000 --- a/sm_crypto/include/sm3.h +++ /dev/null @@ -1,56 +0,0 @@ -#ifndef _SM3_H_ -#define _SM3_H_ - - - -#include -#include "typedef.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define SM3_DATA_LEN 32 - -struct sm3_ctx { - u32 total[2]; /*!< number of bytes processed */ - u32 state[8]; /*!< intermediate digest state */ - u8 buffer[64]; /*!< data block being processed */ - u8 ipad[64]; /*!< HMAC: inner padding */ - u8 opad[64]; /*!< HMAC: outer padding */ -}; - -int sm3_init(struct sm3_ctx *ctx); -int sm3_update(struct sm3_ctx *ctx, const u8 *input, u32 ilen); -int sm3_final(struct sm3_ctx *ctx, u8 *output); - -int sm3_finup(struct sm3_ctx *ctx, const u8 *data, - u32 len, u8 *out); - - -void sm3_hmac_starts(struct sm3_ctx *ctx, unsigned char *key, int keylen ); - -/* - * SM3 HMAC process buffer - */ -void sm3_hmac_update(struct sm3_ctx *ctx, unsigned char *input, int ilen ); - -/* - * SM3 HMAC final digest - */ -void sm3_hmac_finish(struct sm3_ctx *ctx, unsigned char output[32] ); - - -/* - * output = HMAC-SM#( hmac key, input buffer ) - */ -void sm3_hmac( unsigned char *key, int keylen, - unsigned char *input, int ilen, - unsigned char output[32] ); - - -#ifdef __cplusplus -} -#endif - -#endif /* _SM3_H_ */ diff --git a/sm_crypto/include/sm4.h b/sm_crypto/include/sm4.h deleted file mode 100644 index f800a61..0000000 --- a/sm_crypto/include/sm4.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef _SM4_H_ -#define _SM4_H_ - -#include "typedef.h" - -#ifdef __cplusplus -extern "C" { -#endif - -struct sm4_ctx{ - u32 sk_enc[32]; - u32 sk_dec[32]; - u32 iv[16]; -}; - -void sm4_ecb_encrypt(struct sm4_ctx *ctx, u8 *key, u8 *in, u32 len, u8 *out); -void sm4_ecb_decrypt(struct sm4_ctx *ctx, u8 *key, u8 *in, u32 len, u8 *out); -void sm4_cbc_encrypt(struct sm4_ctx *ctx, u8 *key, u8 *iv, u8 *in, u32 len, u8 *out); -void sm4_cbc_decrypt(struct sm4_ctx *ctx, u8 *key, u8 *iv, u8 *in, u32 len, u8 *out); - -#ifdef __cplusplus -} -#endif - -#endif /* _SM4_H_ */ diff --git a/sm_crypto/include/typedef.h b/sm_crypto/include/typedef.h deleted file mode 100644 index 60c493c..0000000 --- a/sm_crypto/include/typedef.h +++ /dev/null @@ -1,174 +0,0 @@ -#ifndef __TYPEDEF_H__ -#define __TYPEDEF_H__ - - -#ifdef __cplusplus -extern "C" { -#endif - - -/****************************Start***************************/ - - -/*#define __BULID_LINUX__*/ -#define __BUILD_NO_OS__ - - -/*#define __LITTLE_ENDIAN__*/ -#define __BIG_ENDIAN__ - - -/*#define RANDOM_SOFTWARE*/ - - -/*Big Numer MAX BIT*/ -#define RSA_MAX_MODULUS_BITS 2048 -#define RSA_MAX_DIGITS (RSA_MAX_MODULUS_BITS/VLI_DIGIT_BITS) -#define BIGNUM_MAX_DIGITS RSA_MAX_DIGITS - - -/*For C Language Standards */ -#if defined(__STDC__) -#define PREDEF_STANDARD_C_1989 /*C89 , C90*/ - -#if defined(__STDC_VERSION__) -#if (__STDC_VERSION__ >= 199901L) -#define PREDEF_STANDARD_C_1999 /*C99*/ -#undef PREDEF_STANDARD_C_1989 -#endif -#endif - -#endif - - -#ifdef PREDEF_STANDARD_C_1989 /*C89 , C90*/ -#define inline __inline -#endif - -/****************************End***************************/ - -#ifdef __BULID_LINUX__ - -#include -#include - -typedef unsigned int uint; - -typedef __u8 u8; -typedef __u16 u16; -typedef __u32 u32; -typedef __u64 u64; - -typedef __s8 s8; -typedef __s16 s16; -typedef __s32 s32; -typedef __s64 s64; - - -#define le16_to_cpu __le16_to_cpu -#define le32_to_cpu __le32_to_cpu -#define le64_to_cpu __le64_to_cpu - -#define cpu_to_le16 __cpu_to_le16 -#define cpu_to_le32 __cpu_to_le32 -#define cpu_to_le64 __cpu_to_le64 - -#define be16_to_cpu __be16_to_cpu -#define be32_to_cpu __be32_to_cpu -#define be64_to_cpu __be64_to_cpu - -#define cpu_to_be16 __cpu_to_be16 -#define cpu_to_be32 __cpu_to_be32 -#define cpu_to_be64 __cpu_to_be64 - - -#else - - -#ifdef __BUILD_NO_OS__ - -#define RANDOM_SOFTWARE - -typedef unsigned char u8; -typedef unsigned short u16; -typedef unsigned int u32; -typedef unsigned long long u64; - -typedef char s8; -typedef short s16; -typedef int s32; -typedef long s64; - -typedef unsigned int uint; - -#define __swap16(A) ((((u16)(A) & 0xff00) >> 8) | (((u16)(A) & 0x00ff) << 8)) - -#define __swap32(A) ((((u32)(A) & 0xff000000) >> 24) | \ - (((u32)(A) & 0x00ff0000) >> 8) | \ - (((u32)(A) & 0x0000ff00) << 8) | \ - (((u32)(A) & 0x000000ff) << 24)) - -#define __swap64(A) ((u64)( \ - (((u64)(A) & (u64)0x00000000000000ffULL) << 56) | \ - (((u64)(A) & (u64)0x000000000000ff00ULL) << 40) | \ - (((u64)(A) & (u64)0x0000000000ff0000ULL) << 24) | \ - (((u64)(A) & (u64)0x00000000ff000000ULL) << 8) | \ - (((u64)(A) & (u64)0x000000ff00000000ULL) >> 8) | \ - (((u64)(A) & (u64)0x0000ff0000000000ULL) >> 24)| \ - (((u64)(A) & (u64)0x00ff000000000000ULL) >> 40) |\ - (((u64)(A) & (u64)0xff00000000000000ULL) >> 56))) - -/*To Test Little Endian or Big Endian*/ -static union { - char c[4]; - unsigned long mylong; -} endian_test = {{ 'l', '?', '?', 'b' } }; - - -#define ENDIANNESS ((char)endian_test.mylong) - -#include "inet.h" - -#endif /*__BUILD_NO_OS__*/ - -#endif/*__BULID_LINUX__*/ - - - - - - - -u16 __get_unaligned_le16(const u8 *p); -u32 __get_unaligned_le32(const u8 *p); -u64 __get_unaligned_le64(const u8 *p); -void __put_unaligned_le16(u16 val, u8 *p); -void __put_unaligned_le32(u32 val, u8 *p); -void __put_unaligned_le64(u64 val, u8 *p); -u16 get_unaligned_le16(const void *p); -u32 get_unaligned_le32(const void *p); -u64 get_unaligned_le64(const void *p); -void put_unaligned_le16(u16 val, void *p); -void put_unaligned_le32(u32 val, void *p); -void put_unaligned_le64(u64 val, void *p); -u16 __get_unaligned_be16(const u8 *p); -u32 __get_unaligned_be32(const u8 *p); -u64 __get_unaligned_be64(const u8 *p); -void __put_unaligned_be16(u16 val, u8 *p); -void __put_unaligned_be32(u32 val, u8 *p); -void __put_unaligned_be64(u64 val, u8 *p); -u16 get_unaligned_be16(const void *p); -u32 get_unaligned_be32(const void *p); -u64 get_unaligned_be64(const void *p); -void put_unaligned_be16(u16 val, void *p); -void put_unaligned_be32(u32 val, void *p); -void put_unaligned_be64(u64 val, void *p); - - - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/sm_crypto/src/big.c b/sm_crypto/src/big.c deleted file mode 100644 index af30817..0000000 --- a/sm_crypto/src/big.c +++ /dev/null @@ -1,989 +0,0 @@ -#include -#include -#include - -#include "big.h" - -typedef struct -{ - u64 m_low; - u64 m_high; -} uint128_t; - -void vli_clear(u64 *vli, u8 ndigits) -{ - int i; - - for (i = 0; i < ndigits; ++i) { - vli[i] = 0; - } -} - -/* Returns true if vli == 0, false otherwise. */ -int vli_is_zero(u64 *vli, u8 ndigits) -{ - int i; - - for (i = 0; i < ndigits; ++i) { - if (vli[i]) - return 0; - } - - return 1; -} - -/* Returns nonzero if bit bit of vli is set. */ -u64 vli_test_bit(u64 *vli, u8 bit, u8 ndigits) -{ - return (vli[bit/64] & ((u64)1 << (bit % 64))); -} - -/* Counts the number of 64-bit "digits" in vli. */ -u32 vli_num_digits(u64 *vli, u8 ndigits) -{ - int i; - /* Search from the end until we find a non-zero digit. - * We do it in reverse because we expect that most digits will - * be nonzero. - */ - for (i = ndigits - 1; i >= 0 && vli[i] == 0; --i); - - return (i + 1); -} - -/* Counts the number of bits required for vli. */ -u32 vli_num_bits(u64 *vli, u8 ndigits) -{ - u32 i, num_digits; - u64 digit; - - num_digits = vli_num_digits(vli, ndigits); - if (num_digits == 0) - return 0; - - digit = vli[num_digits - 1]; - for (i = 0; digit; ++i) - digit >>= 1; - - return ((num_digits - 1) * 64 + i); -} - -/* Sets dest = src. */ -void vli_set(u64 *dest, u64 *src, u8 ndigits) -{ - u32 i; - - for (i = 0; i < ndigits; ++i) - dest[i] = src[i]; -} - -/* Returns sign of left - right. */ -int vli_cmp(u64 *left, u64 *right, u8 ndigits) -{ - int i; - - for (i = ndigits - 1; i >= 0; --i) { - if (left[i] > right[i]) - return 1; - else if (left[i] < right[i]) - return -1; - } - return 0; -} - -/* Computes result = in << c, returning carry. Can modify in place - * (if result == in). 0 < shift < 64. - */ -u64 vli_lshift(u64 *result, u64 *in, u32 shift, u8 ndigits) -{ - u64 carry = 0; - int i; - - for (i = 0; i < ndigits; ++i) { - u64 temp = in[i]; - result[i] = (temp << shift) | carry; - carry = shift ? temp >> (64 - shift) : 0; - } - - return carry; -} - -/* Computes result = in >> c, returning carry. Can modify in place - * (if result == in). 0 < shift < 64. - */ -u64 vli_rshift(u64 *result, u64 *in, u32 shift, u8 ndigits) -{ - u64 carry = 0; - int i; - - for (i = ndigits -1; i >= 0; --i) { - u64 temp = in[i]; - result[i] = (temp >> shift) | carry; - carry = shift ? temp << (64 - shift) : 0; - } - - return carry; -} - -/* Computes result = left + right, returning carry. Can modify in place. */ -u64 vli_add(u64 *result, u64 *left, u64 *right, u8 ndigits) -{ - u64 carry = 0; - u32 i; - - for (i = 0; i < ndigits; ++i) { - u64 sum; - - sum = left[i] + right[i] + carry; - if (sum != left[i]) { - carry = (sum < left[i]); - } - result[i] = sum; - } - - return carry; -} - -/* Computes result = left - right, returning borrow. Can modify in place. */ -u64 vli_sub(u64 *result, u64 *left, u64 *right, u8 ndigits) -{ - u64 borrow = 0; - int i; - - for (i = 0; i < ndigits; ++i) { - u64 diff; - - diff = left[i] - right[i] - borrow; - if (diff != left[i]) - borrow = (diff > left[i]); - - result[i] = diff; - } - - return borrow; -} - -static uint128_t mul_64_64(u64 left, u64 right) -{ - u64 a0 = left & 0xffffffffull; - u64 a1 = left >> 32; - u64 b0 = right & 0xffffffffull; - u64 b1 = right >> 32; - u64 m0 = a0 * b0; - u64 m1 = a0 * b1; - u64 m2 = a1 * b0; - u64 m3 = a1 * b1; - uint128_t result; - - m2 += (m0 >> 32); - m2 += m1; - - /* Overflow */ - if (m2 < m1) - m3 += 0x100000000ull; - - result.m_low = (m0 & 0xffffffffull) | (m2 << 32); - result.m_high = m3 + (m2 >> 32); - - return result; -} - -static uint128_t add_128_128(uint128_t a, uint128_t b) -{ - uint128_t result; - - result.m_low = a.m_low + b.m_low; - result.m_high = a.m_high + b.m_high + (result.m_low < a.m_low); - - return result; -} - -static u64 vli_add_digit_mul(u64 *result, u64 *b, u64 c, u64 *d, u8 digits) -{ - uint128_t mul; - u64 carry, rh, rl; - u32 i; - - if (c == 0) - return 0; - - carry = 0; - for (i = 0; i < digits; i++) { - mul = mul_64_64(c, d[i]); - if ((result[i] = b[i] + carry) < carry) { - carry = 1; - } else { - carry = 0; - } - if ((result[i] += mul.m_low) < mul.m_low) { - carry++; - } - carry += mul.m_high; - } - - return carry; -} - -void bn_mult(u64 *result, u64 *left, u64 *right, u8 ndigits) -{ - u32 bdigits, cdigits, i; -#ifdef PREDEF_STANDARD_C_1989 - u64 *t = (u64*) malloc(2 * ndigits * sizeof(u64)); - if(t == NULL) - { - return; - } -#else - u64 t[2*ndigits]; -#endif - - vli_clear(t, 2*ndigits); - - bdigits = vli_num_digits(left, ndigits); - cdigits = vli_num_digits(right, ndigits); - - for(i=0; i> BN_DIGIT_BITS) & BN_MAX_DIGIT; - if((a[i] = b[i] - borrow) > (BN_MAX_DIGIT - borrow)) { - borrow = 1; - } else { - borrow = 0; - } - if((a[i] -= rl) > (BN_MAX_DIGIT - rl)) { - borrow++; - } - borrow += rh; - } - - return borrow; -} - -static u32 bn_digit_bits(u32 a) -{ - u32 i; - - for(i = 0; i< sizeof(a) * 8; i++) { - if(a == 0) break; - a >>= 1; - } - - return i; -} - -void bn_div(u32 *a, u32 *b, u32 *c, u32 cdigits, u32 *d, u32 ddigits) -{ - - u32 dddigits, shift; - u64 tmp; - int i; - -#ifdef PREDEF_STANDARD_C_1989 - u32 ai, t; - - u32 *cc; - u32 *dd; - - cc = (u32*) malloc((cdigits+1) * sizeof(u32)); - if(cc == NULL) - return; - - dd = (u32*) malloc((cdigits/2) * sizeof(u32)); - if(dd == NULL) - { - free(cc); - return; - } -#else - u32 ai, t, cc[cdigits+1], dd[cdigits/2]; -#endif - - dddigits = ddigits; - - shift = BN_DIGIT_BITS - bn_digit_bits(d[dddigits-1]); - vli_clear((u64*)cc, dddigits/2); - cc[cdigits] = vli_lshift((u64*)cc, (u64*)c, shift, cdigits/2); - vli_lshift((u64*)dd, (u64*)d, shift, dddigits/2); - t = dd[dddigits-1]; - - vli_clear((u64*)a, cdigits/2); - i = cdigits - dddigits; - for(; i>=0; i--) { - if(t == BN_MAX_DIGIT) { - ai = cc[i+dddigits]; - } else { - tmp = cc[i+dddigits-1]; - tmp += (u64)cc[i+dddigits] << BN_DIGIT_BITS; - ai = tmp / (t + 1); - } - - cc[i+dddigits] -= vli_sub_digit_mult(&cc[i], &cc[i], ai, dd, dddigits); - while(cc[i+dddigits] || (vli_cmp((u64*)&cc[i], (u64*)dd, dddigits/2) >= 0)) { - ai++; - cc[i+dddigits] -= vli_sub((u64*)&cc[i], (u64*)&cc[i], (u64*)dd, dddigits/2); - } - a[i] = ai; - } - - vli_rshift((u64*)b, (u64*)cc, shift, dddigits/2); - -#ifdef PREDEF_STANDARD_C_1989 - free(cc); - free(dd); -#endif -} - -void vli_div(u64 *result, u64 *remainder, u64 *left, u64 cdigits, u64 *right, u8 ddigits) -{ - bn_div((u32*)result, (u32*)remainder, (u32*)left, cdigits*2, (u32*)right, ddigits*2); -} - -void bn_mod(u64 *result, u64 *left, u64 *right, u8 ndigits) -{ -#ifdef PREDEF_STANDARD_C_1989 - u64 *t = (u64*) malloc(2 * ndigits * sizeof(u64)); - if(t == NULL) - return; -#else - u64 t[2*ndigits]; -#endif - - vli_div(t, result, left, ndigits*2, right, ndigits); - -#ifdef PREDEF_STANDARD_C_1989 - free(t); -#endif -} - -void _vli_mult(u64 *result, u64 *left, u64 *right, u8 ndigits) -{ - uint128_t r01 = { 0, 0 }; - u64 r2 = 0; - unsigned int i, k; - - /* Compute each digit of result in sequence, maintaining the - * carries. - */ - for (k = 0; k < ndigits * 2 - 1; k++) { - unsigned int min; - - if (k < ndigits) - min = 0; - else - min = (k + 1) - ndigits; - - for (i = min; i <= k && i < ndigits; i++) { - uint128_t product; - - product = mul_64_64(left[i], right[k - i]); - - r01 = add_128_128(r01, product); - r2 += (r01.m_high < product.m_high); - } - - result[k] = r01.m_low; - r01.m_low = r01.m_high; - r01.m_high = r2; - r2 = 0; - } - - result[ndigits * 2 - 1] = r01.m_low; -} - -void vli_mult(u64 *result, u64 *left, u64 *right, u8 ndigits) -{ -#if 1 - bn_mult(result, left, right, ndigits); -#else - _vli_mult(result, left, right, ndigits); -#endif -} - -void vli_square(u64 *result, u64 *left, u8 ndigits) -{ - uint128_t r01 = { 0, 0 }; - u64 r2 = 0; - int i, k; - - for (k = 0; k < ndigits * 2 - 1; k++) { - unsigned int min; - - if (k < ndigits) - min = 0; - else - min = (k + 1) - ndigits; - - for (i = min; i <= k && i <= k - i; i++) { - uint128_t product; - - product = mul_64_64(left[i], left[k - i]); - - if (i < k - i) { - r2 += product.m_high >> 63; - product.m_high = (product.m_high << 1) | - (product.m_low >> 63); - product.m_low <<= 1; - } - - r01 = add_128_128(r01, product); - r2 += (r01.m_high < product.m_high); - } - - result[k] = r01.m_low; - r01.m_low = r01.m_high; - r01.m_high = r2; - r2 = 0; - } - - result[ndigits * 2 - 1] = r01.m_low; -} - -/* Computes result = (left + right) % mod. - Assumes that left < mod and right < mod, result != mod. */ -void vli_mod_add(u64 *result, u64 *left, u64 *right, u64 *mod, u8 ndigits) -{ - u64 carry; - - carry = vli_add(result, left, right, ndigits); - /* result > mod (result = mod + remainder), so subtract mod to - * get remainder. - */ - - if(carry || vli_cmp(result, mod, ndigits) >= 0) { - /* result > mod (result = mod + remainder), so subtract mod to get remainder. */ - vli_sub(result, result, mod, ndigits); - } -} - -/* Computes result = (left - right) % mod. - * Assumes that left < mod and right < mod, result != mod. - */ -void vli_mod_sub(u64 *result, u64 *left, u64 *right, u64 *mod, u8 ndigits) -{ - u64 borrow; - - borrow = vli_sub(result, left, right, ndigits); - /* In this case, result == -diff == (max int) - diff. - * Since -x % d == d - x, we can get the correct result from - * result + mod (with overflow). - */ - if(borrow) - vli_add(result, result, mod, ndigits); -} - -/* Computes result = product % curve_prime - * from http://www.nsa.gov/ia/_files/nist-routines.pdf - */ -void vli_mmod_fast_nist_256(u64 *result, u64 *product, u64 *curve_prime, u8 ndigits) -{ - int carry; - -#ifdef PREDEF_STANDARD_C_1989 - u64 *tmp = (u64*) malloc(2 * ndigits * sizeof(u64)); - if(tmp == NULL) - return; -#else - u64 tmp[2 * ndigits]; -#endif - - /* t */ - vli_set(result, product, ndigits); - - /* s1 */ - tmp[0] = 0; - tmp[1] = product[5] & 0xffffffff00000000ull; - tmp[2] = product[6]; - tmp[3] = product[7]; - carry = vli_lshift(tmp, tmp, 1, ndigits); - carry += vli_add(result, result, tmp, ndigits); - - /* s2 */ - tmp[1] = product[6] << 32; - tmp[2] = (product[6] >> 32) | (product[7] << 32); - tmp[3] = product[7] >> 32; - carry += vli_lshift(tmp, tmp, 1, ndigits); - carry += vli_add(result, result, tmp, ndigits); - - /* s3 */ - tmp[0] = product[4]; - tmp[1] = product[5] & 0xffffffff; - tmp[2] = 0; - tmp[3] = product[7]; - carry += vli_add(result, result, tmp, ndigits); - - /* s4 */ - tmp[0] = (product[4] >> 32) | (product[5] << 32); - tmp[1] = (product[5] >> 32) | (product[6] & 0xffffffff00000000ull); - tmp[2] = product[7]; - tmp[3] = (product[6] >> 32) | (product[4] << 32); - carry += vli_add(result, result, tmp, ndigits); - - /* d1 */ - tmp[0] = (product[5] >> 32) | (product[6] << 32); - tmp[1] = (product[6] >> 32); - tmp[2] = 0; - tmp[3] = (product[4] & 0xffffffff) | (product[5] << 32); - carry -= vli_sub(result, result, tmp, ndigits); - - /* d2 */ - tmp[0] = product[6]; - tmp[1] = product[7]; - tmp[2] = 0; - tmp[3] = (product[4] >> 32) | (product[5] & 0xffffffff00000000ull); - carry -= vli_sub(result, result, tmp, ndigits); - - /* d3 */ - tmp[0] = (product[6] >> 32) | (product[7] << 32); - tmp[1] = (product[7] >> 32) | (product[4] << 32); - tmp[2] = (product[4] >> 32) | (product[5] << 32); - tmp[3] = (product[6] << 32); - carry -= vli_sub(result, result, tmp, ndigits); - - /* d4 */ - tmp[0] = product[7]; - tmp[1] = product[4] & 0xffffffff00000000ull; - tmp[2] = product[5]; - tmp[3] = product[6] & 0xffffffff00000000ull; - carry -= vli_sub(result, result, tmp, ndigits); - - if (carry < 0) { - do { - carry += vli_add(result, result, curve_prime, ndigits); - } while (carry < 0); - } else { - while (carry || vli_cmp(curve_prime, result, ndigits) != 1){ - carry -= vli_sub(result, result, curve_prime, ndigits); - } - } - -#ifdef PREDEF_STANDARD_C_1989 - free(tmp); -#endif -} - -void vli_mmod_fast_sm2_256(u64 *result, u64 *_product, u64 *mod, u8 ndigits) -{ - u32 tmp1[8]; - u32 tmp2[8]; - u32 tmp3[8]; - u32 *product = (u32 *)_product; - int carry = 0; - - vli_set(result, (u64 *)product, ndigits); - vli_clear((u64 *)tmp1, ndigits); - vli_clear((u64 *)tmp2, ndigits); - vli_clear((u64 *)tmp3, ndigits); - - /* Y0 */ - tmp1[0] = tmp1[3] = tmp1[7] = product[8]; - tmp2[2] = product[8]; - carry += vli_add(result, result, (u64 *)tmp1, ndigits); - carry -= vli_sub(result, result, (u64 *)tmp2, ndigits); - - /* Y1 */ - tmp1[0] = tmp1[1] = tmp1[4] = tmp1[7] = product[9]; - tmp1[3] = 0; - tmp2[2] = product[9]; - carry += vli_add(result, result, (u64 *)tmp1, ndigits); - carry -= vli_sub(result, result, (u64 *)tmp2, ndigits); - - /* Y2 */ - tmp1[0] = tmp1[1] = tmp1[5] = tmp1[7] = product[10]; - tmp1[4] = 0; - carry += vli_add(result, result, (u64 *)tmp1, ndigits); - - /* Y3 */ - tmp1[0] = tmp1[1] = tmp1[3] = tmp1[6] = tmp1[7] = product[11]; - tmp1[5] = 0; - carry += vli_add(result, result, (u64 *)tmp1, ndigits); - - /* Y4 */ - tmp1[0] = tmp1[1] = tmp1[3] = tmp1[4] = tmp1[7] = tmp3[7] = product[12]; - tmp1[6] = 0; - carry += vli_add(result, result, (u64 *)tmp1, ndigits); - carry += vli_add(result, result, (u64 *)tmp3, ndigits); - - /* Y5 */ - tmp1[0] = tmp1[1] = tmp1[3] = tmp1[4] = tmp1[5] = tmp1[7] = product[13]; - tmp2[2] = product[13]; - tmp3[0] = tmp3[3] = tmp3[7] = product[13]; - carry += vli_add(result, result, (u64 *)tmp1, ndigits); - carry += vli_add(result, result, (u64 *)tmp3, ndigits); - carry -= vli_sub(result, result, (u64 *)tmp2, ndigits); - - /* Y6 */ - tmp1[0] = tmp1[1] = tmp1[3] = tmp1[4] = tmp1[5] = tmp1[6] = tmp1[7] = product[14]; - tmp2[2] = product[14]; - tmp3[0] = tmp3[1] = tmp3[4] = tmp3[7] = product[14]; - tmp3[3] = 0; - carry += vli_add(result, result, (u64 *)tmp1, ndigits); - carry += vli_add(result, result, (u64 *)tmp3, ndigits); - carry -= vli_sub(result, result, (u64 *)tmp2, ndigits); - - /* Y7 */ - tmp1[0] = tmp1[1] = tmp1[3] = tmp1[4] = tmp1[5] = tmp1[6] = tmp1[7] = product[15]; - tmp3[0] = tmp3[1] = tmp3[5] = product[15]; - tmp3[4] = 0; - tmp3[7] = 0; - tmp2[7] = product[15]; - tmp2[2] = 0; - carry += vli_lshift((u64 *)tmp2, (u64 *)tmp2, 1, ndigits); - carry += vli_add(result, result, (u64 *)tmp1, ndigits); - carry += vli_add(result, result, (u64 *)tmp3, ndigits); - carry += vli_add(result, result, (u64 *)tmp2, ndigits); - if (carry < 0) { - do { - carry += vli_add(result, result, mod, ndigits); - } while(carry < 0); - } else { - while (carry || vli_cmp(mod, result, ndigits) != 1) - { - carry -= vli_sub(result, result, mod, ndigits); - } - } -} - -/* Computes result = (product) % mod. */ -void _vli_mod(u64 *result, u64 *product, u64 *mod, u8 ndigits) -{ - uint digitShift, bitShift; - uint productBits; - uint modBits = vli_num_bits(mod, ndigits); - - u64 carry; - -#ifdef PREDEF_STANDARD_C_1989 - u64 *modMultiple = (u64*) malloc(2 * ndigits * sizeof(u64)); - if(modMultiple == NULL) - return; -#else - u64 modMultiple[2 * ndigits]; -#endif - - productBits = vli_num_bits(product + ndigits, ndigits); - if (productBits) { - productBits += ndigits * 64; - } else { - productBits = vli_num_bits(product, ndigits); - } - - if (productBits < modBits) { - /* product < mod. */ - vli_set(result, product, ndigits); - return; - } - - /* Shift mod by (leftBits - modBits). This multiplies mod by the largest - power of two possible while still resulting in a number less than left. */ - vli_clear(modMultiple, ndigits); - vli_clear(modMultiple + ndigits, ndigits); - digitShift = (productBits - modBits) / 64; - bitShift = (productBits - modBits) % 64; - if (bitShift) { - modMultiple[digitShift + ndigits] = vli_lshift(modMultiple + digitShift, mod, bitShift, ndigits); - } else { - vli_set(modMultiple + digitShift, mod, ndigits); - } - - /* Subtract all multiples of mod to get the remainder. */ - vli_clear(result, ndigits); - result[0] = 1; /* Use result as a temp var to store 1 (for subtraction) */ - while (productBits > ndigits * 64 || vli_cmp(modMultiple, mod, ndigits) >= 0) - { - int cmp = vli_cmp(modMultiple + ndigits, product + ndigits, ndigits); - if (cmp < 0 || (cmp == 0 && vli_cmp(modMultiple, product, ndigits) <= 0)) { - if (vli_sub(product, product, modMultiple, ndigits)) - { - /* borrow */ - vli_sub(product + ndigits, product + ndigits, result, ndigits); - } - vli_sub(product + ndigits, product + ndigits, modMultiple + ndigits, ndigits); - } - - carry = (modMultiple[ndigits] & 0x01) << 63; - vli_rshift(modMultiple + ndigits, modMultiple + ndigits, 1, ndigits); - vli_rshift(modMultiple, modMultiple, 1, ndigits); - modMultiple[ndigits-1] |= carry; - - --productBits; - } - vli_set(result, product, ndigits); - -#ifdef PREDEF_STANDARD_C_1989 - free(modMultiple); -#endif - -} - -/* Computes result = (product) % mod. */ -void vli_mod(u64 *result, u64 *product, u64 *mod, u8 ndigits) -{ -#if 1 - bn_mod(result, product, mod, ndigits); -#else - _vli_mod(result, product, mod, ndigits); -#endif -} - -/* Computes result = (left * right) % curve->p. */ -void vli_mod_mult_fast(u64 *result, u64 *left, u64 *right, u64 *mod, u8 ndigits) -{ -#ifdef PREDEF_STANDARD_C_1989 - u64 *product = (u64*) malloc(2 * ndigits * sizeof(u64)); -#else - u64 product[2 * ndigits]; -#endif - - vli_mult(product, left, right, ndigits); -#if 1 - vli_mod(result, product, mod, ndigits); -#else - if ( mod[1] == 0xFFFFFFFF00000000ull) - vli_mmod_fast_sm2_256(result, product, mod, ndigits); - else - vli_mmod_fast_nist_256(result, product, mod, ndigits); -#endif - -#ifdef PREDEF_STANDARD_C_1989 - free(product); -#endif -} - -/* Computes result = left^2 % curve->p. */ -void vli_mod_square_fast(u64 *result, u64 *left, u64 *mod, u8 ndigits) -{ -#ifdef PREDEF_STANDARD_C_1989 - u64 *product = (u64*) malloc(2 * ndigits * sizeof(u64)); -#else - u64 product[2 * ndigits]; -#endif - - vli_square(product, left, ndigits); -#if 1 - vli_mod(result, product, mod, ndigits); - -#else - if ( mod[1] == 0xFFFFFFFF00000000ull) - vli_mmod_fast_sm2_256(result, product, mod, ndigits); - else - vli_mmod_fast_nist_256(result, product, mod, ndigits); -#endif - -#ifdef PREDEF_STANDARD_C_1989 - free(product); -#endif -} - -/* Computes result = (left * right) % mod. */ -void vli_mod_mult(u64 *result, u64 *left, u64 *right, u64 *mod, u8 ndigits) -{ -#ifdef PREDEF_STANDARD_C_1989 - u64 *product = (u64*) malloc(2 * ndigits * sizeof(u64)); -#else - u64 product[2 * ndigits]; -#endif - - vli_mult(product, left, right, ndigits); - vli_mod(result, product, mod, ndigits); - -#ifdef PREDEF_STANDARD_C_1989 - free(product); -#endif -} - -/* Computes result = left^2 % mod. */ -void vli_mod_square(u64 *result, u64 *left, u64 *mod, u8 ndigits) -{ -#ifdef PREDEF_STANDARD_C_1989 - u64 *product = (u64*) malloc(2 * ndigits * sizeof(u64)); -#else - u64 product[2 * ndigits]; -#endif - - vli_square(product, left, ndigits); - vli_mod(result, product, mod, ndigits); - -#ifdef PREDEF_STANDARD_C_1989 - free(product); -#endif -} - -#define DIGIT_2MSB(x) (u64)(((x) >> (VLI_DIGIT_BITS - 2)) & 0x03) -/* Computes result = left^p % mod. */ -void vli_mod_exp(u64 *result, u64 *left, u64 *p, u64 *mod, u8 ndigits) -{ - u64 ci_bits, ci; - u32 j, s; - u32 digits; - int i; - -#ifdef PREDEF_STANDARD_C_1989 - u64 *bpower[3]= {NULL, NULL, NULL}; - u64 *t = calloc(1, ndigits * VLI_DIGIT_BYTES); - - bpower[0] = calloc(1, ndigits* VLI_DIGIT_BYTES); - bpower[1] = calloc(1, ndigits* VLI_DIGIT_BYTES); - bpower[2] = calloc(1, ndigits* VLI_DIGIT_BYTES); -#else - u64 bpower[3][ndigits], t[ndigits]; -#endif - - - vli_set(bpower[0], left, ndigits); - vli_mod_mult(bpower[1], bpower[0], left, mod, ndigits); - vli_mod_mult(bpower[2], bpower[1], left, mod, ndigits); - vli_clear(t, ndigits); - t[0] = 1; - - digits = vli_num_digits(p , ndigits); - - i = digits - 1; - for ( ; i >= 0; i--) { - ci = p[i]; - ci_bits = VLI_DIGIT_BITS; - - if (i == (digits - 1)) { - while (!DIGIT_2MSB(ci)) { - ci <<= 2; - ci_bits -= 2; - } - } - - for( j = 0; j < ci_bits; j += 2) { - vli_mod_mult(t, t, t, mod, ndigits); - vli_mod_mult(t, t, t, mod, ndigits); - if ((s = DIGIT_2MSB(ci)) != 0) { - vli_mod_mult(t, t, bpower[s-1], mod, ndigits); - } - ci <<= 2; - } - } - - vli_set(result, t, ndigits); - -#ifdef PREDEF_STANDARD_C_1989 - free(bpower[0]); - free(bpower[1]); - free(bpower[2]); - - free(t); -#endif -} - -#define EVEN(vli) (!(vli[0] & 1)) -/* Computes result = (1 / p_input) % mod. All VLIs are the same size. - * See "From Euclid's GCD to Montgomery Multiplication to the Great Divide" - * https://labs.oracle.com/techrep/2001/smli_tr-2001-95.pdf - */ -void vli_mod_inv(u64 *result, u64 *input, u64 *mod, u8 ndigits) -{ - u64 carry; - int cmp_result; - -#ifdef PREDEF_STANDARD_C_1989 - u64 *a = (u64*) malloc(ndigits * sizeof(u64)); - u64 *b = (u64*) malloc(ndigits * sizeof(u64)); - - u64 *u = (u64*) malloc(ndigits * sizeof(u64)); - u64 *v = (u64*) malloc(ndigits * sizeof(u64)); -#else - u64 a[ndigits], b[ndigits]; - u64 u[ndigits], v[ndigits]; -#endif - - if (vli_is_zero(input, ndigits)) { - vli_clear(result, ndigits); - return; - } - - vli_set(a, input, ndigits); - vli_set(b, mod, ndigits); - vli_clear(u, ndigits); - u[0] = 1; - vli_clear(v, ndigits); - - while ((cmp_result = vli_cmp(a, b, ndigits)) != 0) { - carry = 0; - - if (EVEN(a)) { - vli_rshift(a, a, 1, ndigits); - - if (!EVEN(u)) - carry = vli_add(u, u, mod, ndigits); - - vli_rshift(u, u, 1, ndigits); - if (carry) - u[ndigits - 1] |= 0x8000000000000000ull; - } else if (EVEN(b)) { - vli_rshift(b, b, 1, ndigits); - - if (!EVEN(v)) - carry = vli_add(v, v, mod, ndigits); - - vli_rshift(v, v, 1, ndigits); - if (carry) - v[ndigits - 1] |= 0x8000000000000000ull; - } else if (cmp_result > 0) { - vli_sub(a, a, b, ndigits); - vli_rshift(a, a, 1, ndigits); - - if (vli_cmp(u, v, ndigits) < 0) - vli_add(u, u, mod, ndigits); - - vli_sub(u, u, v, ndigits); - if (!EVEN(u)) - carry = vli_add(u, u, mod, ndigits); - - vli_rshift(u, u, 1, ndigits); - if (carry) - u[ndigits - 1] |= 0x8000000000000000ull; - } else { - vli_sub(b, b, a, ndigits); - vli_rshift(b, b, 1, ndigits); - - if (vli_cmp(v, u, ndigits) < 0) - vli_add(v, v, mod, ndigits); - - vli_sub(v, v, u, ndigits); - if (!EVEN(v)) - carry = vli_add(v, v, mod, ndigits); - - vli_rshift(v, v, 1, ndigits); - if (carry) - v[ndigits - 1] |= 0x8000000000000000ull; - } - } - - vli_set(result, u, ndigits); - -#ifdef PREDEF_STANDARD_C_1989 - free(a); - free(b); - free(u); - free(v); -#endif -} diff --git a/sm_crypto/src/debug.c b/sm_crypto/src/debug.c deleted file mode 100644 index a6bb67b..0000000 --- a/sm_crypto/src/debug.c +++ /dev/null @@ -1,57 +0,0 @@ -#include -#include -#include -#include - -void printHex(unsigned char *name, unsigned char *c, int n) -{ - int i; - - #define _print printf - _print ("\n---------------------[%s ,len = %d, start ]----------------------\n",name,n); - for (i = 0; i < n; i++) { - _print("0x%02X, ", c[i]); - if ((i%4) == 3) - _print(" "); - - if ((i%16) == 15) - _print("\n"); - } - if ((i%16) != 0) - _print("\n"); - _print("----------------------[%s end ]----------------------\n",name); -} - -void speed_test( char *name, int len) -{ - static volatile unsigned long long byte = 0; - static volatile unsigned long long count = 0; - static time_t t1, t2; - static int flag = 0; - - if (!flag) { - flag = 3; - time(&t1); - } - - byte += len; - count++; - - time(&t2); - if ((t2-t1) >= flag) { - - unsigned long long byte_temp = byte; - unsigned long long count_temp = count; - - if (byte_temp) - byte_temp = byte_temp*8/flag/1024/1024; - - if (count_temp) - count_temp = count_temp/flag; - - printf(" %s speed = %lld Mb, %lld Hz \n", name, byte_temp, count_temp); - t1 = t2; - byte = 0; - count = 0; - } -} diff --git a/sm_crypto/src/ecc.c b/sm_crypto/src/ecc.c deleted file mode 100644 index 56b6c7a..0000000 --- a/sm_crypto/src/ecc.c +++ /dev/null @@ -1,323 +0,0 @@ -#include -#include -#include - -#include "ecc.h" -#include "big.h" - -/* Returns 1 if point is the point at infinity, 0 otherwise. */ -int ecc_point_is_zero(struct ecc_curve *curve, ecc_point *point) -{ - return (vli_is_zero(point->x, curve->ndigits) - && vli_is_zero(point->y, curve->ndigits)); -} - -/* Double in place */ -void ecc_point_double_jacobian(struct ecc_curve *curve, u64 *X1, u64 *Y1, u64 *Z1) -{ - /* t1 = X, t2 = Y, t3 = Z */ - u64 t4[ECC_MAX_DIGITS]; - u64 t5[ECC_MAX_DIGITS]; - - if(vli_is_zero(Z1, curve->ndigits)) - return; - - vli_mod_square_fast(t4, Y1, curve->p, curve->ndigits); /* t4 = y1^2 */ - vli_mod_mult_fast(t5, X1, t4, curve->p, curve->ndigits); /* t5 = x1*y1^2 = A */ - vli_mod_square_fast(t4, t4, curve->p, curve->ndigits); /* t4 = y1^4 */ - vli_mod_mult_fast(Y1, Y1, Z1, curve->p, curve->ndigits); /* t2 = y1*z1 = z3 */ - vli_mod_square_fast(Z1, Z1, curve->p, curve->ndigits); /* t3 = z1^2 */ - - vli_mod_add(X1, X1, Z1, curve->p, curve->ndigits); /* t1 = x1 + z1^2 */ - vli_mod_add(Z1, Z1, Z1, curve->p, curve->ndigits); /* t3 = 2*z1^2 */ - vli_mod_sub(Z1, X1, Z1, curve->p, curve->ndigits); /* t3 = x1 - z1^2 */ - vli_mod_mult_fast(X1, X1, Z1, curve->p, curve->ndigits); /* t1 = x1^2 - z1^4 */ - - vli_mod_add(Z1, X1, X1, curve->p, curve->ndigits); /* t3 = 2*(x1^2 - z1^4) */ - vli_mod_add(X1, X1, Z1, curve->p, curve->ndigits); /* t1 = 3*(x1^2 - z1^4) */ - if (vli_test_bit(X1, 0, curve->ndigits)) { - u64 carry = vli_add(X1, X1, curve->p, curve->ndigits); - vli_rshift(X1, X1, 1, curve->ndigits); - X1[ECC_MAX_DIGITS-1] |= carry << 63; - } else { - vli_rshift(X1, X1, 1, curve->ndigits); - } - - /* t1 = 3/2*(x1^2 - z1^4) = B */ - vli_mod_square_fast(Z1, X1, curve->p, curve->ndigits); /* t3 = B^2 */ - vli_mod_sub(Z1, Z1, t5, curve->p, curve->ndigits); /* t3 = B^2 - A */ - vli_mod_sub(Z1, Z1, t5, curve->p, curve->ndigits); /* t3 = B^2 - 2A = x3 */ - vli_mod_sub(t5, t5, Z1, curve->p, curve->ndigits); /* t5 = A - x3 */ - vli_mod_mult_fast(X1, X1, t5, curve->p, curve->ndigits); /* t1 = B * (A - x3) */ - vli_mod_sub(t4, X1, t4, curve->p, curve->ndigits); /* t4 = B * (A - x3) - y1^4 = y3 */ - - vli_set(X1, Z1, curve->ndigits); - vli_set(Z1, Y1, curve->ndigits); - vli_set(Y1, t4, curve->ndigits); -} - -/* Modify (x1, y1) => (x1 * z^2, y1 * z^3) */ -void apply_z(struct ecc_curve *curve, u64 *X1, u64 *Y1, u64 *Z) -{ - u64 t1[ECC_MAX_DIGITS]; - - vli_mod_square_fast(t1, Z, curve->p, curve->ndigits); /* z^2 */ - vli_mod_mult_fast(X1, X1, t1, curve->p, curve->ndigits); /* x1 * z^2 */ - vli_mod_mult_fast(t1, t1, Z, curve->p, curve->ndigits); /* z^3 */ - vli_mod_mult_fast(Y1, Y1, t1, curve->p, curve->ndigits); /* y1 * z^3 */ -} - -/* P = (x1, y1) => 2P, (x2, y2) => P' */ -void XYcZ_initial_double(struct ecc_curve *curve, u64 *X1, u64 *Y1, u64 *X2, u64 *Y2, u64 *initialZ) -{ - u64 z[ECC_MAX_DIGITS]; - - vli_set(X2, X1, curve->ndigits); - vli_set(Y2, Y1, curve->ndigits); - - if (initialZ) { - vli_set(z, initialZ, curve->ndigits); - } else { - vli_clear(z, curve->ndigits); - z[0] = 1; - } - apply_z(curve, X1, Y1, z); - - ecc_point_double_jacobian(curve, X1, Y1, z); - - apply_z(curve, X2, Y2, z); -} - -/* Input P = (x1, y1, Z), Q = (x2, y2, Z) - Output P' = (x1', y1', Z3), P + Q = (x3, y3, Z3) - or P => P', Q => P + Q - */ -void XYcZ_add(struct ecc_curve *curve, u64 *X1, u64 *Y1, u64 *X2, u64 *Y2) -{ - /* t1 = X1, t2 = Y1, t3 = X2, t4 = Y2 */ - u64 t5[ECC_MAX_DIGITS]; - - vli_mod_sub(t5, X2, X1, curve->p, curve->ndigits); /* t5 = x2 - x1 */ - vli_mod_square_fast(t5, t5, curve->p, curve->ndigits); /* t5 = (x2 - x1)^2 = A */ - vli_mod_mult_fast(X1, X1, t5, curve->p, curve->ndigits); /* t1 = x1*A = B */ - vli_mod_mult_fast(X2, X2, t5, curve->p, curve->ndigits); /* t3 = x2*A = C */ - vli_mod_sub(Y2, Y2, Y1, curve->p, curve->ndigits); /* t4 = y2 - y1 */ - vli_mod_square_fast(t5, Y2, curve->p, curve->ndigits); /* t5 = (y2 - y1)^2 = D */ - - vli_mod_sub(t5, t5, X1, curve->p, curve->ndigits); /* t5 = D - B */ - vli_mod_sub(t5, t5, X2, curve->p, curve->ndigits); /* t5 = D - B - C = x3 */ - vli_mod_sub(X2, X2, X1, curve->p, curve->ndigits); /* t3 = C - B */ - vli_mod_mult_fast(Y1, Y1, X2, curve->p, curve->ndigits); /* t2 = y1*(C - B) */ - vli_mod_sub(X2, X1, t5, curve->p, curve->ndigits); /* t3 = B - x3 */ - vli_mod_mult_fast(Y2, Y2, X2, curve->p, curve->ndigits); /* t4 = (y2 - y1)*(B - x3) */ - vli_mod_sub(Y2, Y2, Y1, curve->p, curve->ndigits); /* t4 = y3 */ - - vli_set(X2, t5, curve->ndigits); -} - -/* Input P = (x1, y1, Z), Q = (x2, y2, Z) - * Output P + Q = (x3, y3, Z3), P - Q = (x3', y3', Z3) - * or P => P - Q, Q => P + Q - */ -void XYcZ_addC(struct ecc_curve *curve, u64 *X1, u64 *Y1, u64 *X2, u64 *Y2) -{ - /* t1 = X1, t2 = Y1, t3 = X2, t4 = Y2 */ - u64 t5[ECC_MAX_DIGITS]; - u64 t6[ECC_MAX_DIGITS]; - u64 t7[ECC_MAX_DIGITS]; - - vli_mod_sub(t5, X2, X1, curve->p, curve->ndigits); /* t5 = x2 - x1 */ - vli_mod_square_fast(t5, t5, curve->p, curve->ndigits); /* t5 = (x2 - x1)^2 = A */ - vli_mod_mult_fast(X1, X1, t5, curve->p, curve->ndigits); /* t1 = x1*A = B */ - vli_mod_mult_fast(X2, X2, t5, curve->p, curve->ndigits); /* t3 = x2*A = C */ - vli_mod_add(t5, Y2, Y1, curve->p, curve->ndigits); /* t4 = y2 + y1 */ - vli_mod_sub(Y2, Y2, Y1, curve->p, curve->ndigits); /* t4 = y2 - y1 */ - - vli_mod_sub(t6, X2, X1, curve->p, curve->ndigits); /* t6 = C - B */ - vli_mod_mult_fast(Y1, Y1, t6, curve->p, curve->ndigits); /* t2 = y1 * (C - B) */ - vli_mod_add(t6, X1, X2, curve->p, curve->ndigits); /* t6 = B + C */ - vli_mod_square_fast(X2, Y2, curve->p, curve->ndigits); /* t3 = (y2 - y1)^2 */ - vli_mod_sub(X2, X2, t6, curve->p, curve->ndigits); /* t3 = x3 */ - - vli_mod_sub(t7, X1, X2, curve->p, curve->ndigits); /* t7 = B - x3 */ - vli_mod_mult_fast(Y2, Y2, t7, curve->p, curve->ndigits); /* t4 = (y2 - y1)*(B - x3) */ - vli_mod_sub(Y2, Y2, Y1, curve->p, curve->ndigits); /* t4 = y3 */ - - vli_mod_square_fast(t7, t5, curve->p, curve->ndigits); /* t7 = (y2 + y1)^2 = F */ - vli_mod_sub(t7, t7, t6, curve->p, curve->ndigits); /* t7 = x3' */ - vli_mod_sub(t6, t7, X1, curve->p, curve->ndigits); /* t6 = x3' - B */ - vli_mod_mult_fast(t6, t6, t5, curve->p, curve->ndigits); /* t6 = (y2 + y1)*(x3' - B) */ - vli_mod_sub(Y1, t6, Y1, curve->p, curve->ndigits); /* t2 = y3' */ - - vli_set(X1, t7, curve->ndigits); -} - -void ecc_point_mult(struct ecc_curve *curve, ecc_point *result, ecc_point *point, u64 *scalar, u64 *initialZ) -{ - /* R0 and R1 */ - u64 Rx[2][ECC_MAX_DIGITS]; - u64 Ry[2][ECC_MAX_DIGITS]; - u64 z[ECC_MAX_DIGITS]; - int i, nb; - - vli_set(Rx[1], point->x, curve->ndigits); - vli_set(Ry[1], point->y, curve->ndigits); - - XYcZ_initial_double(curve, Rx[1], Ry[1], Rx[0], Ry[0], initialZ); - - for (i = vli_num_bits(scalar, curve->ndigits) - 2; i > 0; --i) { - nb = !vli_test_bit(scalar, i, curve->ndigits); - XYcZ_addC(curve, Rx[1-nb], Ry[1-nb], Rx[nb], Ry[nb]); - XYcZ_add(curve, Rx[nb], Ry[nb], Rx[1-nb], Ry[1-nb]); - } - - nb = !vli_test_bit(scalar, 0, curve->ndigits); - XYcZ_addC(curve, Rx[1-nb], Ry[1-nb], Rx[nb], Ry[nb]); - - /* Find final 1/Z value. */ - vli_mod_sub(z, Rx[1], Rx[0], curve->p, curve->ndigits); /* X1 - X0 */ - vli_mod_mult_fast(z, z, Ry[1-nb], curve->p, curve->ndigits); /* Yb * (X1 - X0) */ - vli_mod_mult_fast(z, z, point->x, curve->p, curve->ndigits); /* xP * Yb * (X1 - X0) */ - vli_mod_inv(z, z, curve->p, curve->ndigits); /* 1 / (xP * Yb * (X1 - X0)) */ - vli_mod_mult_fast(z, z, point->y, curve->p, curve->ndigits); /* yP / (xP * Yb * (X1 - X0)) */ - vli_mod_mult_fast(z, z, Rx[1-nb], curve->p, curve->ndigits); /* Xb * yP / (xP * Yb * (X1 - X0)) */ - /* End 1/Z calculation */ - - XYcZ_add(curve, Rx[nb], Ry[nb], Rx[1-nb], Ry[1-nb]); - - apply_z(curve, Rx[0], Ry[0], z); - - vli_set(result->x, Rx[0], curve->ndigits); - vli_set(result->y, Ry[0], curve->ndigits); -} - -static u32 max(u32 a, u32 b) -{ - return (a > b ? a : b); -} - -void ecc_point_mult2(struct ecc_curve *curve, ecc_point *result, ecc_point *g, ecc_point *p, u64 *s, u64 *t) -{ - u64 tx[ECC_MAX_DIGITS]; - u64 ty[ECC_MAX_DIGITS]; - u64 tz[ECC_MAX_DIGITS]; - u64 z[ECC_MAX_DIGITS]; - ecc_point sum; - u64 *rx; - u64 *ry; - int i; - - /*For C89*/ - u32 numBits; - ecc_point *points[4]; - int index; - ecc_point *point; - - rx = result->x; - ry = result->y; - - /* Calculate sum = G + Q. */ - vli_set(sum.x, p->x, curve->ndigits); - vli_set(sum.y, p->y, curve->ndigits); - vli_set(tx, g->x, curve->ndigits); - vli_set(ty, g->y, curve->ndigits); - - vli_mod_sub(z, sum.x, tx, curve->p, curve->ndigits); /* Z = x2 - x1 */ - XYcZ_add(curve, tx, ty, sum.x, sum.y); - vli_mod_inv(z, z, curve->p, curve->ndigits); /* Z = 1/Z */ - apply_z(curve, sum.x, sum.y, z); - - /*For C89*/ - points[0] = NULL; - points[1] = g; - points[2] = p; - points[3] = ∑ - - /* Use Shamir's trick to calculate u1*G + u2*Q */ - - numBits = max(vli_num_bits(s, curve->ndigits), vli_num_bits(t, curve->ndigits)); - - point = points[(!!vli_test_bit(s, numBits-1, curve->ndigits)) - | ((!!vli_test_bit(t, numBits-1, curve->ndigits)) << 1)]; - vli_set(rx, point->x, curve->ndigits); - vli_set(ry, point->y, curve->ndigits); - vli_clear(z, curve->ndigits); - z[0] = 1; - - for (i = numBits - 2; i >= 0; --i) { - ecc_point_double_jacobian(curve, rx, ry, z); - - index = (!!vli_test_bit(s, i, curve->ndigits)) | ((!!vli_test_bit(t, i, curve->ndigits)) << 1); - point = points[index]; - if(point) { - vli_set(tx, point->x, curve->ndigits); - vli_set(ty, point->y, curve->ndigits); - apply_z(curve, tx, ty, z); - vli_mod_sub(tz, rx, tx, curve->p, curve->ndigits); /* Z = x2 - x1 */ - XYcZ_add(curve, tx, ty, rx, ry); - vli_mod_mult_fast(z, z, tz, curve->p, curve->ndigits); - } - } - - vli_mod_inv(z, z, curve->p, curve->ndigits); /* Z = 1/Z */ - apply_z(curve, rx, ry, z); -} - -void ecc_point_add(struct ecc_curve *curve, ecc_point *result, ecc_point *left, ecc_point *right) -{ - u64 x1[ECC_MAX_DIGITS]; - u64 y1[ECC_MAX_DIGITS]; - u64 x2[ECC_MAX_DIGITS]; - u64 y2[ECC_MAX_DIGITS]; - u64 z[ECC_MAX_DIGITS]; - - vli_set(x1, left->x, curve->ndigits); - vli_set(y1, left->y, curve->ndigits); - vli_set(x2, right->x, curve->ndigits); - vli_set(y2, right->y, curve->ndigits); - - vli_mod_sub(z, x2, x1, curve->p, curve->ndigits); /* Z = x2 - x1 */ - - XYcZ_add(curve, x1, y1, x2, y2); - vli_mod_inv(z, z, curve->p, curve->ndigits); /* Z = 1/Z */ - apply_z(curve, x2,y2, z); - - vli_set(result->x, x2, curve->ndigits); - vli_set(result->y, y2, curve->ndigits); -} - -void ecc_bytes2native(u64 *native, void *bytes, u8 ndigits) -{ - u64 *_bytes = (u64*)bytes; - unsigned int i; - - for (i = 0; i < ndigits/2; ++i) { - if (native == _bytes) { - u64 temp; - temp = be64_to_cpu(native[i]); - native[i] = be64_to_cpu(_bytes[ndigits - i - 1]); - _bytes[ndigits - i - 1] = temp; - }else { - native[i] = be64_to_cpu(_bytes[ndigits - i - 1]); - native[ndigits - i - 1] = be64_to_cpu(_bytes[i]); - } - } -} - -void ecc_native2bytes(void *bytes, u64 *native, u8 ndigits) -{ - u64 *_bytes = (u64*)bytes; - unsigned int i; - - for (i = 0; i < ndigits/2; ++i) { - if (_bytes == native) { - u64 temp; - temp = cpu_to_be64(_bytes[ndigits - i - 1]); - _bytes[ndigits - i - 1] = cpu_to_be64(native[i]); - native[i] = temp; - } else { - _bytes[i] = cpu_to_be64(native[ndigits - i - 1]); - _bytes[ndigits - i - 1] = cpu_to_be64(native[i]); - } - } -} diff --git a/sm_crypto/src/inet.c b/sm_crypto/src/inet.c deleted file mode 100644 index 75fc14d..0000000 --- a/sm_crypto/src/inet.c +++ /dev/null @@ -1,220 +0,0 @@ -#include "typedef.h" - -#ifdef __BUILD_NO_OS__ - -inline u16 _htons(u16 hs) -{ - return (ENDIANNESS=='l') ? __swap16(hs): hs; -} - -inline u32 _htonl(u32 hl) -{ - return (ENDIANNESS=='l') ? __swap32(hl): hl; -} - -inline u32 _htonl64(u64 hl) -{ - return (ENDIANNESS=='l') ? __swap64(hl): hl; -} - -inline u16 _ntohs(u16 ns) -{ - return (ENDIANNESS=='l') ? __swap16(ns): ns; -} - -inline u64 _ntohl(u32 nl) -{ - return (ENDIANNESS=='l') ? __swap32(nl): nl; -} - -inline u64 _ntohl64(u64 nl) -{ - return (ENDIANNESS=='l') ? __swap64(nl): nl; -} - -inline u16 le16_to_cpu(u16 data) -{ - return (ENDIANNESS=='b') ? __swap16(data):data; -} -inline u32 le32_to_cpu(u32 data) -{ - return (ENDIANNESS=='b') ? __swap32(data):data; -} -inline u64 le64_to_cpu(u64 data) -{ - return (ENDIANNESS=='b') ? __swap64(data):data; -} -inline u16 cpu_to_le16(u16 data) -{ - return (ENDIANNESS=='b') ? __swap16(data):data; -} -inline u32 cpu_to_le32(u32 data) -{ - return (ENDIANNESS=='b') ? __swap32(data):data; -} -inline u64 cpu_to_le64(u64 data) -{ - return (ENDIANNESS=='b') ? __swap64(data):data; -} - -inline u16 be16_to_cpu(u16 data) -{ - return _ntohs(data); -} - -inline u32 be32_to_cpu(u32 data) -{ - return _ntohl(data); -} - -inline u16 cpu_to_be16(u16 data) -{ - return _ntohs(data); -} - -inline u32 cpu_to_be32(u32 data) -{ - return _ntohl(data); -} - -inline u64 be64_to_cpu(u64 data) -{ - return _ntohl64(data); -} - -inline u64 cpu_to_be64(u64 data) -{ - return _ntohl64(data); -} - -#endif - - -inline u16 __get_unaligned_le16(const u8 *p) -{ - return p[0] | p[1] << 8; -} - -inline u32 __get_unaligned_le32(const u8 *p) -{ - return p[0] | p[1] << 8 | p[2] << 16 | p[3] << 24; -} - -inline u64 __get_unaligned_le64(const u8 *p) -{ - return (u64)__get_unaligned_le32(p + 4) << 32 | - __get_unaligned_le32(p); -} - -inline void __put_unaligned_le16(u16 val, u8 *p) -{ - *p++ = val; - *p++ = val >> 8; -} - -inline void __put_unaligned_le32(u32 val, u8 *p) -{ - __put_unaligned_le16(val >> 16, p + 2); - __put_unaligned_le16(val, p); -} - -inline void __put_unaligned_le64(u64 val, u8 *p) -{ - __put_unaligned_le32(val >> 32, p + 4); - __put_unaligned_le32(val, p); -} - -inline u16 get_unaligned_le16(const void *p) -{ - return __get_unaligned_le16((const u8 *)p); -} - -inline u32 get_unaligned_le32(const void *p) -{ - return __get_unaligned_le32((const u8 *)p); -} - -inline u64 get_unaligned_le64(const void *p) -{ - return __get_unaligned_le64((const u8 *)p); -} - -inline void put_unaligned_le16(u16 val, void *p) -{ - __put_unaligned_le16(val, (u8*)p); -} - -inline void put_unaligned_le32(u32 val, void *p) -{ - __put_unaligned_le32(val, (u8*)p); -} - -inline void put_unaligned_le64(u64 val, void *p) -{ - __put_unaligned_le64(val, (u8*)p); -} - -inline u16 __get_unaligned_be16(const u8 *p) -{ - return p[0] << 8 | p[1]; -} - -inline u32 __get_unaligned_be32(const u8 *p) -{ - return p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3]; -} - -inline u64 __get_unaligned_be64(const u8 *p) -{ - return (u64)__get_unaligned_be32(p) << 32 | - __get_unaligned_be32(p + 4); -} - -inline void __put_unaligned_be16(u16 val, u8 *p) -{ - *p++ = val >> 8; - *p++ = val; -} - -inline void __put_unaligned_be32(u32 val, u8 *p) -{ - __put_unaligned_be16(val >> 16, p); - __put_unaligned_be16(val, p + 2); -} - -inline void __put_unaligned_be64(u64 val, u8 *p) -{ - __put_unaligned_be32(val >> 32, p); - __put_unaligned_be32(val, p + 4); -} - -inline u16 get_unaligned_be16(const void *p) -{ - return __get_unaligned_be16((const u8 *)p); -} - -inline u32 get_unaligned_be32(const void *p) -{ - return __get_unaligned_be32((const u8 *)p); -} - -inline u64 get_unaligned_be64(const void *p) -{ - return __get_unaligned_be64((const u8 *)p); -} - -inline void put_unaligned_be16(u16 val, void *p) -{ - __put_unaligned_be16(val, (u8*)p); -} - -inline void put_unaligned_be32(u32 val, void *p) -{ - __put_unaligned_be32(val, (u8*)p); -} - -inline void put_unaligned_be64(u64 val, void *p) -{ - __put_unaligned_be64(val, (u8*)p); -} - diff --git a/sm_crypto/src/random.c b/sm_crypto/src/random.c deleted file mode 100644 index 75f50a3..0000000 --- a/sm_crypto/src/random.c +++ /dev/null @@ -1,89 +0,0 @@ - -#include -#include -#include - -#ifndef RANDOM_SOFTWARE -#include -#include -#include -#endif - -#include "random.h" - - -static int gRadomFixedFlag; - -/*SM2 Standard Random*/ -static u8 gRandomFixed[32]= {0x21,0xBC,0xC1,0xEA,0x0D,0xB8,0x54,0x6D,0xCE,0xE4,0xDB,0x3C,0xFA,0xC1,0x3C,0xEF, - 0xCC,0x2D,0xC0,0xD9,0x3A,0x0F,0x68,0x16,0x1A,0x86,0x06,0xD5,0x27,0x6E,0x27,0x59 - }; - - -void vli_set_random_mode(u32 mode) -{ - gRadomFixedFlag = mode; -} - -int vli_get_random_mode(void) -{ - return gRadomFixedFlag; -} - -void vli_set_random_fixed(u8 *data, u32 len) -{ - vli_set_random_mode(1); - - if(len == sizeof(gRandomFixed)) - { - memcpy(gRandomFixed, data, len); - } -} - - -int vli_get_random(u8 *data, u32 len) -{ - -#ifdef RANDOM_SOFTWARE - int i; - int j; - static int counter; - - if((!gRadomFixedFlag) - ||(len != sizeof(gRandomFixed))) - { - srand(counter++); - counter +=j ; - - for(i = 0; i < len; i++) - { - data[i]= rand(); - } - - return len; - } - else - { - memcpy(data, gRandomFixed, len); - } - -#else - - int fd = open("/dev/urandom", O_RDONLY); - int ret = -1; - - if (fd > 0) { - ret = read(fd, data, len); - close(fd); - - } - - /* - memset(data, 0x33, len); - */ - - return ret; - -#endif - return 0; -} diff --git a/sm_crypto/src/sm2.c b/sm_crypto/src/sm2.c deleted file mode 100644 index 0716dfd..0000000 --- a/sm_crypto/src/sm2.c +++ /dev/null @@ -1,664 +0,0 @@ -#include -#include -#include - -#include "random.h" -#include "big.h" -#include "ecc.h" -#include "sm2.h" -#include "sm3.h" - - -/*For C89*/ -#ifdef PREDEF_STANDARD_C_1989 - -struct ecc_curve sm2_curve = { - ECC_MAX_DIGITS, - { - { - 0x715A4589334C74C7ull, 0x8FE30BBFF2660BE1ull, - 0x5F9904466A39C994ull, 0x32C4AE2C1F198119ull - }, - { - 0x02DF32E52139F0A0ull, 0xD0A9877CC62A4740ull, - 0x59BDCEE36B692153ull, 0xBC3736A2F4F6779Cull - }, - }, - { - 0xFFFFFFFFFFFFFFFFull, 0xFFFFFFFF00000000ull, - 0xFFFFFFFFFFFFFFFFull, 0xFFFFFFFEFFFFFFFFull - }, - { - 0x53BBF40939D54123ull, 0x7203DF6B21C6052Bull, - 0xFFFFFFFFFFFFFFFFull, 0xFFFFFFFEFFFFFFFFull - }, - { - 0x0000000000000001ull, 0x0000000000000000ull, - 0x0000000000000000ull, 0x0000000000000000ull, - }, - { - 0xFFFFFFFFFFFFFFFCull, 0xFFFFFFFF00000000ull, - 0xFFFFFFFFFFFFFFFFull, 0xFFFFFFFEFFFFFFFFull - }, - { - 0xDDBCBD414D940E93ull, 0xF39789F515AB8F92ull, - 0x4D5A9E4BCF6509A7ull, 0x28E9FA9E9D9F5E34ull - }, -}; - -#else - -struct ecc_curve sm2_curve = { - .ndigits = ECC_MAX_DIGITS, - .g = { - .x = { - 0x715A4589334C74C7ull, 0x8FE30BBFF2660BE1ull, - 0x5F9904466A39C994ull, 0x32C4AE2C1F198119ull - }, - .y = { - 0x02DF32E52139F0A0ull, 0xD0A9877CC62A4740ull, - 0x59BDCEE36B692153ull, 0xBC3736A2F4F6779Cull - }, - }, - .p = { - 0xFFFFFFFFFFFFFFFFull, 0xFFFFFFFF00000000ull, - 0xFFFFFFFFFFFFFFFFull, 0xFFFFFFFEFFFFFFFFull - }, - .n = { - 0x53BBF40939D54123ull, 0x7203DF6B21C6052Bull, - 0xFFFFFFFFFFFFFFFFull, 0xFFFFFFFEFFFFFFFFull - }, - .h = { - 0x0000000000000001ull, 0x0000000000000000ull, - 0x0000000000000000ull, 0x0000000000000000ull, - }, - .a = { - 0xFFFFFFFFFFFFFFFCull, 0xFFFFFFFF00000000ull, - 0xFFFFFFFFFFFFFFFFull, 0xFFFFFFFEFFFFFFFFull - }, - .b = { - 0xDDBCBD414D940E93ull, 0xF39789F515AB8F92ull, - 0x4D5A9E4BCF6509A7ull, 0x28E9FA9E9D9F5E34ull - }, -}; - -#endif - -/*x¯2 = 2w + (x2&(2w − 1))*/ -void sm2_w(u64 *result, u64 *x) -{ - result[0] = x[0]; - result[1] = x[1]; - result[1] |= 0x80; - result[2] = 0; - result[3] = 0; -} - -void sm3_kdf(u8 *Z ,u32 zlen, u8 *K, u32 klen) -{ - u32 ct = 0x00000001; - u8 ct_char[32]; - u8 *hash = K ; - u32 i, t; - struct sm3_ctx md[1]; - - t = klen/ECC_NUMWORD; - - /* - //s4: K=Ha1||Ha2||... - */ - - for (i = 0; i < t; i++) { - - /* - //s2: Hai=Hv(Z||ct) - */ - - sm3_init(md); - sm3_update(md, Z, zlen); - put_unaligned_be32(ct, ct_char); - sm3_update(md, ct_char, 4); - sm3_final(md, hash); - hash += 32; - ct++; - } - - t = klen%ECC_NUMWORD; - if (t) { - sm3_init(md); - sm3_update(md, Z, zlen); - put_unaligned_be32(ct, ct_char); - sm3_update(md, ct_char, 4); - sm3_final(md, ct_char); - memcpy(hash, ct_char, t); - } -} - -void sm3_z(u8 *id, u32 idlen, ecc_point *pub, u8 *hash) -{ - u8 a[ECC_NUMWORD]; - u8 b[ECC_NUMWORD]; - u8 x[ECC_NUMWORD]; - u8 y[ECC_NUMWORD]; - u8 idlen_char[2]; - struct sm3_ctx md[1]; - - put_unaligned_be16(idlen<<3, idlen_char); - - ecc_bytes2native((u64*)a, sm2_curve.a, sm2_curve.ndigits); - ecc_bytes2native((u64*)b, sm2_curve.b, sm2_curve.ndigits); - ecc_bytes2native((u64*)x, sm2_curve.g.x, sm2_curve.ndigits); - ecc_bytes2native((u64*)y, sm2_curve.g.y, sm2_curve.ndigits); - - sm3_init(md); - sm3_update(md, idlen_char, 2); - sm3_update(md, id, idlen); - sm3_update(md, a, ECC_NUMWORD); - sm3_update(md, b, ECC_NUMWORD); - sm3_update(md, x, ECC_NUMWORD); - sm3_update(md, y, ECC_NUMWORD); - sm3_update(md, (u8*)pub->x, ECC_NUMWORD); - sm3_update(md, (u8*)pub->y, ECC_NUMWORD); - sm3_final(md, hash); - - return; -} - -int sm2_valid_public_key(ecc_point *publicKey) -{ - u64 na[ECC_MAX_DIGITS] = {3}; /* a mod p = (-3) mod p */ - u64 tmp1[ECC_MAX_DIGITS]; - u64 tmp2[ECC_MAX_DIGITS]; - - if (ecc_point_is_zero(&sm2_curve, publicKey)) - return 1; - - if (vli_cmp(sm2_curve.p, publicKey->x, sm2_curve.ndigits) != 1 - || vli_cmp(sm2_curve.p, publicKey->y, sm2_curve.ndigits) != 1) - return 1; - - /* tmp1 = y^2 */ - vli_mod_square_fast(tmp1, publicKey->y, sm2_curve.p, sm2_curve.ndigits); - /* tmp2 = x^2 */ - vli_mod_square_fast(tmp2, publicKey->x, sm2_curve.p, sm2_curve.ndigits); - /* tmp2 = x^2 + a = x^2 - 3 */ - vli_mod_sub(tmp2, tmp2, na, sm2_curve.p, sm2_curve.ndigits); - /* tmp2 = x^3 + ax */ - vli_mod_mult_fast(tmp2, tmp2, publicKey->x, sm2_curve.p, sm2_curve.ndigits); - /* tmp2 = x^3 + ax + b */ - vli_mod_add(tmp2, tmp2, sm2_curve.b, sm2_curve.p, sm2_curve.ndigits); - - /* Make sure that y^2 == x^3 + ax + b */ - if (vli_cmp(tmp1, tmp2, sm2_curve.ndigits) != 0) - return 1; - - return 0; -} - -int sm2_make_prikey(u8 *prikey) -{ - ecc_point pub[1]; - u64 pri[ECC_MAX_DIGITS]; - int i = 10; - - do { - vli_get_random((u8*)pri, ECC_NUMWORD); - if(vli_cmp(sm2_curve.n, pri, sm2_curve.ndigits) != 1) { - vli_sub(pri, pri, sm2_curve.n, sm2_curve.ndigits); - } - - /* The private key cannot be 0 (mod p). */ - if(!vli_is_zero(pri, sm2_curve.ndigits)) { - ecc_native2bytes(prikey, pri, sm2_curve.ndigits); - return 0; - } - } while(i--); - - return -1; -} - -int sm2_make_pubkey(u8 *prikey, ecc_point *pubkey) -{ - ecc_point pub[1]; - u64 pri[ECC_MAX_DIGITS]; - - ecc_bytes2native(pri, prikey, sm2_curve.ndigits); - ecc_point_mult(&sm2_curve, pub, &sm2_curve.g, pri, NULL); - ecc_native2bytes(pubkey->x, pub->x, sm2_curve.ndigits); - ecc_native2bytes(pubkey->y, pub->y, sm2_curve.ndigits); - - return 0; -} - -int sm2_make_keypair(u8 *prikey, ecc_point *pubkey) -{ - sm2_make_prikey(prikey); - sm2_make_pubkey(prikey, pubkey); - return 0; -} - -int sm2_point_mult(ecc_point *G, u8 *k, ecc_point *P) -{ - int rc = 0; - - ecc_point G_[1]; - ecc_point P_[1]; - u64 k_[ECC_MAX_DIGITS]; - - ecc_bytes2native(k_, k, sm2_curve.ndigits); - ecc_bytes2native(G_->x, G->x, sm2_curve.ndigits); - ecc_bytes2native(G_->y, G->y, sm2_curve.ndigits); - - ecc_point_mult(&sm2_curve, P_, G_, k_, NULL); - - ecc_native2bytes(P->x, P_->x, sm2_curve.ndigits); - ecc_native2bytes(P->y, P_->y, sm2_curve.ndigits); - - return rc; -} - -int sm2_sign(u8 *r_, u8 *s_, u8 *prikey, u8 *hash_) -{ - u64 k[ECC_MAX_DIGITS]; - u64 one[ECC_MAX_DIGITS] = {1}; - u64 random[ECC_MAX_DIGITS]; - u64 pri[ECC_MAX_DIGITS]; - u64 hash[ECC_MAX_DIGITS]; - u64 r[ECC_MAX_DIGITS]; - u64 s[ECC_MAX_DIGITS]; - - ecc_point p; - - ecc_bytes2native(pri, prikey, sm2_curve.ndigits); - ecc_bytes2native(hash, hash_, sm2_curve.ndigits); - - vli_get_random((u8*)random, ECC_NUMWORD); - if (vli_is_zero(random, sm2_curve.ndigits)) { - /* The random number must not be 0. */ - return 0; - } - - vli_set(k, random, sm2_curve.ndigits); - if (vli_cmp(sm2_curve.n, k, sm2_curve.ndigits) != 1) { - vli_sub(k, k, sm2_curve.n, sm2_curve.ndigits); - } - - /* tmp = k * G */ - ecc_point_mult(&sm2_curve, &p, &sm2_curve.g, k, NULL); - - /* r = x1 + e (mod n) */ - vli_mod_add(r, p.x, hash, sm2_curve.n, sm2_curve.ndigits); - if (vli_cmp(sm2_curve.n, r, sm2_curve.ndigits) != 1) { - vli_sub(r, r, sm2_curve.n, sm2_curve.ndigits); - } - - if (vli_is_zero(r, sm2_curve.ndigits)) { - /* If r == 0, fail (need a different random number). */ - return 0; - } - - /* s = r*d */ - vli_mod_mult(s, r, pri, sm2_curve.n, sm2_curve.ndigits); - /* k-r*d */ - vli_mod_sub(s, k, s, sm2_curve.n, sm2_curve.ndigits); - /* 1+d */ - vli_mod_add(pri, pri, one, sm2_curve.n, sm2_curve.ndigits); - /* (1+d)' */ - vli_mod_inv(pri, pri, sm2_curve.n, sm2_curve.ndigits); - /* (1+d)'*(k-r*d) */ - vli_mod_mult(s, pri, s, sm2_curve.n, sm2_curve.ndigits); - - ecc_native2bytes(r_, r, sm2_curve.ndigits); - ecc_native2bytes(s_, s, sm2_curve.ndigits); - - return 1; -} - -int sm2_verify(ecc_point *pubkey, u8 *hash_, u8 *r_, u8 *s_) -{ - ecc_point result; - ecc_point pub[1]; - u64 t[ECC_MAX_DIGITS]; - u64 r[ECC_MAX_DIGITS]; - u64 s[ECC_MAX_DIGITS]; - u64 hash[ECC_MAX_DIGITS]; - - ecc_bytes2native(pub->x, pubkey->x, sm2_curve.ndigits); - ecc_bytes2native(pub->y, pubkey->y, sm2_curve.ndigits); - ecc_bytes2native(r, r_, sm2_curve.ndigits); - ecc_bytes2native(s, s_, sm2_curve.ndigits); - ecc_bytes2native(hash, hash_, sm2_curve.ndigits); - - if (vli_is_zero(r, sm2_curve.ndigits) || vli_is_zero(s, sm2_curve.ndigits)) { - /* r, s must not be 0. */ - return -1; - } - - if (vli_cmp(sm2_curve.n, r, sm2_curve.ndigits) != 1 - || vli_cmp(sm2_curve.n, s, sm2_curve.ndigits) != 1) { - /* r, s must be < n. */ - return -1; - } - - vli_mod_add(t, r, s, sm2_curve.n, sm2_curve.ndigits); /* r + s */ - if (t == 0) - return -1; - - ecc_point_mult2(&sm2_curve, &result, &sm2_curve.g, pub, s, t); - - /* v = x1 + e (mod n) */ - vli_mod_add(result.x, result.x, hash, sm2_curve.n, sm2_curve.ndigits); - - if(vli_cmp(sm2_curve.n, result.x, sm2_curve.ndigits) != 1) { - vli_sub(result.x, result.x, sm2_curve.n, sm2_curve.ndigits); - } - - /* Accept only if v == r. */ - return vli_cmp(result.x, r, sm2_curve.ndigits); -} - - -/*Output C1|C2|C3*/ -int sm2_encrypt(ecc_point *pubKey, u8 *M, u32 Mlen, u8 *C, u32 *Clen) -{ - u64 k[ECC_MAX_DIGITS]; - ecc_point pub[1]; - ecc_point *C1 = (ecc_point *)C; - u8 *C2 = C + ECC_NUMWORD*2; - u8 *C3 = C + ECC_NUMWORD*2 + Mlen; - - ecc_point kP; - u8 *x2 = (u8*)kP.x; - u8 *y2 = (u8*)kP.y; - u8 *x2y2 = (u8*)kP.x; - struct sm3_ctx md[1]; - int i=0; - ecc_point S; - - ecc_bytes2native(pub->x, pubKey->x, sm2_curve.ndigits); - ecc_bytes2native(pub->y, pubKey->y, sm2_curve.ndigits); - - vli_get_random((u8*)k, ECC_NUMWORD); - - /* C1 = k * G */ - ecc_point_mult(&sm2_curve, C1, &sm2_curve.g, k, NULL); - ecc_native2bytes(C1->x, C1->x, sm2_curve.ndigits); - ecc_native2bytes(C1->y, C1->y, sm2_curve.ndigits); - - /* S = h * Pb */ - - ecc_point_mult(&sm2_curve, &S, pub, sm2_curve.h, NULL); - if (sm2_valid_public_key(&S) != 0) - return -1; - - /* kP = k * Pb */ - ecc_point_mult(&sm2_curve, &kP, pub, k, NULL); - if (vli_is_zero(kP.x, sm2_curve.ndigits) - | vli_is_zero(kP.y, sm2_curve.ndigits)) { - return 0; - } - ecc_native2bytes(kP.x, kP.x, sm2_curve.ndigits); - ecc_native2bytes(kP.y, kP.y, sm2_curve.ndigits); - - /* t=KDF(x2 ∥ y2, klen) */ - sm3_kdf(x2y2, ECC_NUMWORD*2, C2, Mlen); - - /* C2 = M ⊕ t;*/ - for (i = 0; i < Mlen; i++) { - C2[i] = M[i]^C2[+i]; - } - - /*C3 = Hash(x2 ∥ M ∥ y2)*/ - sm3_init(md); - sm3_update(md, x2, ECC_NUMWORD); - sm3_update(md, M, Mlen); - sm3_update(md, y2, ECC_NUMWORD); - sm3_final(md, C3); - - if (Clen) - *Clen = Mlen + ECC_NUMWORD*2 + SM3_DATA_LEN; - - return 0; -} - -/*Input C1|C2|C3*/ -int sm2_decrypt(u8 *prikey, u8 *C, u32 Clen, u8 *M, u32 *Mlen) -{ - u8 hash[SM3_DATA_LEN]; - u64 pri[ECC_MAX_DIGITS]; - ecc_point *C1 = (ecc_point *)C; - u8 *C2 = C + ECC_NUMWORD*2; - u8 *C3 = C + Clen - SM3_DATA_LEN; - ecc_point dB; - u64 *x2 = dB.x; - u64 *y2 = dB.y; - u64 *x2y2 = x2; - struct sm3_ctx md[1]; - int outlen = Clen - ECC_NUMWORD*2 - SM3_DATA_LEN; - int i=0; - ecc_point S; - - ecc_bytes2native(pri, prikey, sm2_curve.ndigits); - ecc_bytes2native(C1->x, C1->x, sm2_curve.ndigits); - ecc_bytes2native(C1->y, C1->y, sm2_curve.ndigits); - - if (sm2_valid_public_key(C1) != 0) - return -1; - - - ecc_point_mult(&sm2_curve, &S, C1, sm2_curve.h, NULL); - if (sm2_valid_public_key(&S) != 0) - return -1; - - ecc_point_mult(&sm2_curve, &dB, C1, pri, NULL); - ecc_native2bytes(x2, x2, sm2_curve.ndigits); - ecc_native2bytes(y2, y2, sm2_curve.ndigits); - - sm3_kdf((u8*)x2y2, ECC_NUMWORD*2, M, outlen); - if (vli_is_zero(x2, sm2_curve.ndigits) - | vli_is_zero(y2, sm2_curve.ndigits)) { - return 0; - } - - for (i = 0; i < outlen; i++) - M[i]=M[i]^C2[i]; - - sm3_init(md); - sm3_update(md, (u8*)x2, ECC_NUMWORD); - sm3_update(md, M, outlen); - sm3_update(md, (u8*)y2, ECC_NUMWORD); - sm3_final(md, hash); - - *Mlen = outlen; - if (memcmp(hash , C3, SM3_DATA_LEN) != 0) - return -1; - else - return 0; -} - -int sm2_shared_point(u8* selfPriKey, u8* selfTempPriKey, ecc_point* selfTempPubKey, - ecc_point *otherPubKey, ecc_point* otherTempPubKey, ecc_point *key) -{ - ecc_point selfTempPub; - ecc_point otherTempPub; - ecc_point otherPub; - ecc_point U[1]; - - u64 selfTempPri[ECC_MAX_DIGITS]; - u64 selfPri[ECC_MAX_DIGITS]; - u64 temp1[ECC_MAX_DIGITS]; - u64 temp2[ECC_MAX_DIGITS]; - u64 tA[ECC_MAX_DIGITS]; - - ecc_bytes2native(selfTempPri, selfTempPriKey, sm2_curve.ndigits); - ecc_bytes2native(selfPri, selfPriKey, sm2_curve.ndigits); - ecc_bytes2native(selfTempPub.x, selfTempPubKey->x, sm2_curve.ndigits); - ecc_bytes2native(selfTempPub.y, selfTempPubKey->y, sm2_curve.ndigits); - ecc_bytes2native(otherTempPub.x, otherTempPubKey->x, sm2_curve.ndigits); - ecc_bytes2native(otherTempPub.y, otherTempPubKey->y, sm2_curve.ndigits); - ecc_bytes2native(otherPub.x, otherPubKey->x, sm2_curve.ndigits); - ecc_bytes2native(otherPub.y, otherPubKey->y, sm2_curve.ndigits); - - /***********x1_=2^w+x2 & (2^w-1)*************/ - sm2_w(temp1, selfTempPub.x); - /***********tA=(dA+x1_*rA)mod n *************/ - vli_mod_mult(temp1, selfTempPri, temp1, sm2_curve.n, sm2_curve.ndigits); - vli_mod_add(tA, selfPri, temp1, sm2_curve.n, sm2_curve.ndigits); - /***********x2_=2^w+x2 & (2^w-1)*************/ - if(sm2_valid_public_key(&otherTempPub) != 0) - return -1; - sm2_w(temp2, otherTempPub.x); - /**************U=[h*tA](PB+[x2_]RB)**********/ - /* U=[x2_]RB */ - ecc_point_mult(&sm2_curve, U, &otherTempPub, temp2, NULL); - /*U=PB+U*/ - ecc_point_add(&sm2_curve, U, &otherPub, U); - /*tA=tA*h */ - vli_mod_mult(tA, tA, sm2_curve.h, sm2_curve.n, sm2_curve.ndigits); - ecc_point_mult(&sm2_curve, U, U,tA, NULL); - - ecc_native2bytes(key->x, U->x, sm2_curve.ndigits); - ecc_native2bytes(key->y, U->y, sm2_curve.ndigits); - return 1; -} - -void sm2_shared_key(ecc_point *point, u8 *ZA, u8 *ZB, u32 keyLen, u8 *key) -{ - u8 Z[ECC_NUMWORD*4]; - memcpy(Z, point->x, ECC_NUMWORD); - memcpy(Z + ECC_NUMWORD, point->y, ECC_NUMWORD); - memcpy(Z + ECC_NUMWORD*2, ZA, ECC_NUMWORD); - memcpy(Z + ECC_NUMWORD*3, ZB, ECC_NUMWORD); - sm3_kdf(Z, ECC_NUMWORD*4, key, keyLen); -} - -int sm2_C1C2C3ConvertToC1C3C2(u8 *pOut, u8 *pIn, s32 len, s32 mode) -{ - int dataLen = len-64-32; - - if(len < 64 + 32) - return -1; - - memcpy(pOut, pIn, 64);/*C1*/ - - if(!mode) /*To C1|C3|C2*/ - { - memcpy( pOut + 64,pIn + 64 + dataLen, 32); /*C3*/ - memcpy( pOut + 96,pIn + 64, dataLen); /*C2*/ - } - else /*To C1|C2|C3*/ - { - memcpy(pOut + 64, pIn + 96, dataLen); /*C2*/ - memcpy(pOut + 64 + dataLen, pIn + 64, 32); /*C3*/ - } - - return 0; -} - - -/****hash = Hash(Ux||ZA||ZB||x1||y1||x2||y2)****/ -int ECC_Key_ex_hash1(u8* x, ecc_point *RA, ecc_point* RB, u8 ZA[],u8 ZB[],u8 *hash) -{ - struct sm3_ctx md[1]; - - sm3_init(md); - sm3_update(md, x, ECC_NUMWORD); - sm3_update(md, ZA, ECC_NUMWORD); - sm3_update(md, ZB, ECC_NUMWORD); - sm3_update(md, (u8*)RA->x, ECC_NUMWORD); - sm3_update(md, (u8*)RA->y, ECC_NUMWORD); - sm3_update(md, (u8*)RB->x, ECC_NUMWORD); - sm3_update(md, (u8*)RB->y, ECC_NUMWORD); - sm3_final(md, (u8*)hash); - - return 0; -} - -/****SA = Hash(temp||Uy||Hash)****/ -int ECC_Key_ex_hash2(u8 temp, u8* y,u8 *hash, u8* SA) -{ - struct sm3_ctx md[1]; - - sm3_init(md); - sm3_update(md, &temp,1); - sm3_update(md, y,ECC_NUMWORD); - sm3_update(md, hash,ECC_NUMWORD); - sm3_final(md, SA); - - return 0; -} - -int ECC_KeyEx_Init_I(u8 *pri, ecc_point *pub) -{ - return sm2_make_pubkey(pri, pub); -} - -int ECC_KeyEx_Re_I(u8 *rb, u8 *dB, ecc_point *RA, ecc_point *PA, u8* ZA, u8 *ZB, u8 *K, u32 klen, ecc_point *RB, ecc_point *V, u8* SB) -{ - struct sm3_ctx md[1]; - u8 Z[ECC_NUMWORD*2 + ECC_NUMBITS/4]={0}; - u8 hash[ECC_NUMWORD],S1[ECC_NUMWORD]; - u8 temp=0x02; - - /*--------B2: RB=[rb]G=(x2,y2)--------*/ - sm2_make_pubkey(rb, RB); - /********************************************/ - sm2_shared_point(dB, rb, RB, PA, RA, V); - /*------------B7:KB=KDF(VX,VY,ZA,ZB,KLEN)----------*/ - memcpy(Z, V->x, ECC_NUMWORD); - memcpy(Z+ECC_NUMWORD, (u8*)V->y, ECC_NUMWORD); - memcpy(Z+ECC_NUMWORD*2, ZA,ECC_NUMWORD); - memcpy(Z+ECC_NUMWORD*3, ZB,ECC_NUMWORD); - sm3_kdf(Z,ECC_NUMWORD*4, K, klen); - /*---------------B8:(optional) SB=hash(0x02||Vy||HASH(Vx||ZA||ZB||x1||y1||x2||y2)-------------*/ - ECC_Key_ex_hash1((u8*)V->x, RA, RB, ZA, ZB, hash); - ECC_Key_ex_hash2(temp, (u8*)V->y, hash, SB); - - return 0; -} - -int ECC_KeyEx_Init_II(u8* ra, u8* dA, ecc_point* RA, ecc_point* RB, ecc_point* PB, u8 - ZA[],u8 ZB[],u8 SB[],u8 K[], u32 klen,u8 SA[]) -{ - struct sm3_ctx md[1]; - u8 Z[ECC_NUMWORD*2 + ECC_NUMWORD*2]={0}; - u8 hash[ECC_NUMWORD],S1[ECC_NUMWORD]; - u8 temp[2]={0x02,0x03}; - ecc_point U[1]; - - /********************************************/ - sm2_shared_point(dA, ra, RA, PB, RB, U); - /************KA=KDF(UX,UY,ZA,ZB,KLEN)**********/ - memcpy(Z, U->x,ECC_NUMWORD); - memcpy(Z+ECC_NUMWORD, U->y,ECC_NUMWORD); - memcpy(Z+ECC_NUMWORD*2,ZA,ECC_NUMWORD); - memcpy(Z+ECC_NUMWORD*2 +ECC_NUMWORD ,ZB,ECC_NUMWORD); - sm3_kdf(Z,ECC_NUMWORD*2+ECC_NUMWORD*2, K, klen); - /****S1 = Hash(0x02||Uy||Hash(Ux||ZA||ZB||x1||y1||x2||y2))****/ - ECC_Key_ex_hash1((u8*)U->x, RA, RB, ZA, ZB, hash); - ECC_Key_ex_hash2(temp[0], (u8*)U->y, hash, S1); - /*test S1=SB?*/ - if( memcmp(S1,SB,ECC_NUMWORD)!=0) - return -1; - /*SA = Hash(0x03||yU||Hash(xU||ZA||ZB||x1||y1||x2||y2)) */ - ECC_Key_ex_hash2(temp[1], (u8*)U->y, hash, SA); - - return 0; -} - -int ECC_KeyEx_Re_II(ecc_point *V, ecc_point *RA, ecc_point *RB, u8 ZA[], u8 ZB[], u8 SA[]) -{ - u8 hash[ECC_NUMWORD]; - u8 S2[ECC_NUMWORD]; - u8 temp=0x03; - struct sm3_ctx md[1]; - - /*S2 = Hash(0x03||Vy||Hash(Vx||ZA||ZB||x1||y1||x2||y2))*/ - ECC_Key_ex_hash1((u8*)V->x, RA, RB, ZA, ZB, hash); - ECC_Key_ex_hash2(temp, (u8*)V->y, hash, S2); - - if( memcmp(S2,SA,ECC_NUMWORD)!=0) - return -1; - - return 0; -} diff --git a/sm_crypto/src/sm3.c b/sm_crypto/src/sm3.c deleted file mode 100644 index 8b055b9..0000000 --- a/sm_crypto/src/sm3.c +++ /dev/null @@ -1,403 +0,0 @@ -#include -#include -#include - -#include "debug.h" -#include "sm3.h" - -/* - * 32-bit integer manipulation macros (big endian) - */ -#ifndef GET_ULONG_BE -#define GET_ULONG_BE(n,b,i) \ -{ \ - (n) = ( (u32) (b)[(i) ] << 24 ) \ - | ( (u32) (b)[(i) + 1] << 16 ) \ - | ( (u32) (b)[(i) + 2] << 8 ) \ - | ( (u32) (b)[(i) + 3] ); \ -} -#endif - -#ifndef PUT_ULONG_BE -#define PUT_ULONG_BE(n,b,i) \ -{ \ - (b)[(i) ] = (u8) ( (n) >> 24 ); \ - (b)[(i) + 1] = (u8) ( (n) >> 16 ); \ - (b)[(i) + 2] = (u8) ( (n) >> 8 ); \ - (b)[(i) + 3] = (u8) ( (n) ); \ -} -#endif - -/* - * SM3 context setup - */ -int sm3_init(struct sm3_ctx *ctx) -{ - ctx->total[0] = 0; - ctx->total[1] = 0; - - ctx->state[0] = 0x7380166F; - ctx->state[1] = 0x4914B2B9; - ctx->state[2] = 0x172442D7; - ctx->state[3] = 0xDA8A0600; - ctx->state[4] = 0xA96F30BC; - ctx->state[5] = 0x163138AA; - ctx->state[6] = 0xE38DEE4D; - ctx->state[7] = 0xB0FB0E4E; - -#if DEBUG - printf(" function: %s , line= %d \n", __FUNCTION__, __LINE__); -#endif - return 0; -} - -static void sm3_process(struct sm3_ctx *ctx, u8 data[64]) -{ - u32 SS1, SS2, TT1, TT2, W[68],W1[64]; - u32 A, B, C, D, E, F, G, H; - u32 T[64]; - u32 Temp1,Temp2,Temp3,Temp4,Temp5; - int j; -#if ALG_DEBUG - int i; -#endif - -/* - //for(j=0; j < 68; j++) - // W[j] = 0; - //for(j=0; j < 64; j++) - // W1[j] = 0; -*/ - - for(j = 0; j < 16; j++) - T[j] = 0x79CC4519; - for(j =16; j < 64; j++) - T[j] = 0x7A879D8A; - - GET_ULONG_BE( W[ 0], data, 0 ); - GET_ULONG_BE( W[ 1], data, 4 ); - GET_ULONG_BE( W[ 2], data, 8 ); - GET_ULONG_BE( W[ 3], data, 12 ); - GET_ULONG_BE( W[ 4], data, 16 ); - GET_ULONG_BE( W[ 5], data, 20 ); - GET_ULONG_BE( W[ 6], data, 24 ); - GET_ULONG_BE( W[ 7], data, 28 ); - GET_ULONG_BE( W[ 8], data, 32 ); - GET_ULONG_BE( W[ 9], data, 36 ); - GET_ULONG_BE( W[10], data, 40 ); - GET_ULONG_BE( W[11], data, 44 ); - GET_ULONG_BE( W[12], data, 48 ); - GET_ULONG_BE( W[13], data, 52 ); - GET_ULONG_BE( W[14], data, 56 ); - GET_ULONG_BE( W[15], data, 60 ); - -#if ALG_DEBUG - printf("Message with padding:\n"); - for(i=0; i< 8; i++) - printf("%08x ",W[i]); - printf("\n"); - for(i=8; i< 16; i++) - printf("%08x ",W[i]); - printf("\n"); -#endif - -#define FF0(x,y,z) ( (x) ^ (y) ^ (z)) -#define FF1(x,y,z) (((x) & (y)) | ( (x) & (z)) | ( (y) & (z))) - -#define GG0(x,y,z) ( (x) ^ (y) ^ (z)) -#define GG1(x,y,z) (((x) & (y)) | ( (~(x)) & (z)) ) - - -#define SHL(x,n) (((x) & 0xFFFFFFFF) << n) -#define ROTL(x,n) (SHL((x),n) | ((x) >> (32 - n))) -/* -#define ROTL(x,n) (SHL((x),n) | ((x) >> (32 - n%32))) -*/ - -#define P0(x) ((x) ^ ROTL((x),9) ^ ROTL((x),17)) -#define P1(x) ((x) ^ ROTL((x),15) ^ ROTL((x),23)) - - for(j = 16; j < 68; j++ ) - { - /* - //W[j] = P1( W[j-16] ^ W[j-9] ^ ROTL(W[j-3],15)) ^ ROTL(W[j - 13],7 ) ^ W[j-6]; - //Why thd release's result is different with the debug's ? - //Below is okay. Interesting, Perhaps VC6 has a bug of Optimizaiton. - */ - - Temp1 = W[j-16] ^ W[j-9]; - Temp2 = ROTL(W[j-3],15); - Temp3 = Temp1 ^ Temp2; - Temp4 = P1(Temp3); - Temp5 = ROTL(W[j - 13],7 ) ^ W[j-6]; - W[j] = Temp4 ^ Temp5; - } - -#if ALG_DEBUG - printf("Expanding message W0-67:\n"); - for(i=0; i<68; i++) - { - printf("%08x ",W[i]); - if(((i+1) % 8) == 0) printf("\n"); - } - printf("\n"); -#endif - - for(j = 0; j < 64; j++) - { - W1[j] = W[j] ^ W[j+4]; - } - -#if ALG_DEBUG - printf("Expanding message W'0-63:\n"); - for(i=0; i<64; i++) - { - printf("%08x ",W1[i]); - if(((i+1) % 8) == 0) printf("\n"); - } - printf("\n"); -#endif - - A = ctx->state[0]; - B = ctx->state[1]; - C = ctx->state[2]; - D = ctx->state[3]; - E = ctx->state[4]; - F = ctx->state[5]; - G = ctx->state[6]; - H = ctx->state[7]; -#if ALG_DEBUG - printf("j A B C D E F G H\n"); - printf(" %08x %08x %08x %08x %08x %08x %08x %08x\n",A,B,C,D,E,F,G,H); -#endif - - for(j =0; j < 16; j++) - { - SS1 = ROTL((ROTL(A,12) + E + ROTL(T[j],j)), 7); - SS2 = SS1 ^ ROTL(A,12); - TT1 = FF0(A,B,C) + D + SS2 + W1[j]; - TT2 = GG0(E,F,G) + H + SS1 + W[j]; - D = C; - C = ROTL(B,9); - B = A; - A = TT1; - H = G; - G = ROTL(F,19); - F = E; - E = P0(TT2); -#if ALG_DEBUG - printf("%02d %08x %08x %08x %08x %08x %08x %08x %08x\n",j,A,B,C,D,E,F,G,H); -#endif - } - - for(j =16; j < 64; j++) - { - SS1 = ROTL((ROTL(A,12) + E + ROTL(T[j],j)), 7); - SS2 = SS1 ^ ROTL(A,12); - TT1 = FF1(A,B,C) + D + SS2 + W1[j]; - TT2 = GG1(E,F,G) + H + SS1 + W[j]; - D = C; - C = ROTL(B,9); - B = A; - A = TT1; - H = G; - G = ROTL(F,19); - F = E; - E = P0(TT2); -#if ALG_DEBUG - printf("%02d %08x %08x %08x %08x %08x %08x %08x %08x\n",j,A,B,C,D,E,F,G,H); - printf("%02d %08x %08x %08x %08x %08x %08x %08x %08x\n",j,A,B,C,D,E,F,G,H); -#endif - } - - ctx->state[0] ^= A; - ctx->state[1] ^= B; - ctx->state[2] ^= C; - ctx->state[3] ^= D; - ctx->state[4] ^= E; - ctx->state[5] ^= F; - ctx->state[6] ^= G; - ctx->state[7] ^= H; -#if ALG_DEBUG - printf(" %08x %08x %08x %08x %08x %08x %08x %08x\n",ctx->state[0],ctx->state[1],ctx->state[2], - ctx->state[3],ctx->state[4],ctx->state[5],ctx->state[6],ctx->state[7]); -#endif -} - -/* - * SM3 process buffer - */ -int sm3_update(struct sm3_ctx *ctx, const u8 *input, u32 ilen) -{ - u32 left; - int fill; - -#if DEBUG - printf(" function: %s , line= %d \n", __FUNCTION__, __LINE__); -#endif - if( ilen <= 0 ) - return -1; - - left = ctx->total[0] & 0x3F; - fill = 64 - left; - - ctx->total[0] += ilen; - ctx->total[0] &= 0xFFFFFFFF; - - if( ctx->total[0] < (u32) ilen ) - ctx->total[1]++; - - if( left && ilen >= fill ) - { - memcpy( (void *) (ctx->buffer + left), - (void *) input, fill ); - sm3_process( ctx, ctx->buffer ); - input += fill; - ilen -= fill; - left = 0; - } - - while( ilen >= 64 ) - { - sm3_process( ctx, (u8*)input ); - input += 64; - ilen -= 64; - } - - if( ilen > 0 ) - { - memcpy( (void *) (ctx->buffer + left), - (void *) input, ilen ); - } - return 0; -} - -static u8 sm3_padding[64] = -{ - 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; - -/* - * SM3 final digest - */ -int sm3_final(struct sm3_ctx *ctx, u8 *output) -{ - u32 last, padn; - u32 high, low; - u8 msglen[8]; - - high = ( ctx->total[0] >> 29 ) - | ( ctx->total[1] << 3 ); - low = ( ctx->total[0] << 3 ); - - PUT_ULONG_BE( high, msglen, 0 ); - PUT_ULONG_BE( low, msglen, 4 ); - - last = ctx->total[0] & 0x3F; - padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last ); - - sm3_update(ctx, (const u8 *)sm3_padding, padn ); - sm3_update(ctx, msglen, 8 ); - - PUT_ULONG_BE( ctx->state[0], output, 0 ); - PUT_ULONG_BE( ctx->state[1], output, 4 ); - PUT_ULONG_BE( ctx->state[2], output, 8 ); - PUT_ULONG_BE( ctx->state[3], output, 12 ); - PUT_ULONG_BE( ctx->state[4], output, 16 ); - PUT_ULONG_BE( ctx->state[5], output, 20 ); - PUT_ULONG_BE( ctx->state[6], output, 24 ); - PUT_ULONG_BE( ctx->state[7], output, 28 ); - -#if DEBUG - printf(" function: %s , line= %d \n", __FUNCTION__, __LINE__); -#endif - return 0; -} - -int sm3_finup(struct sm3_ctx *ctx, const u8 *data, - u32 len, u8 *out) -{ -#if DEBUG - printf(" function: %s , line= %d \n", __FUNCTION__, __LINE__); -#endif - - sm3_init(ctx); - sm3_update(ctx, data, len); - return sm3_final(ctx, out); -} - - -/* - * SM3 HMAC context setup - */ -void sm3_hmac_starts(struct sm3_ctx *ctx, unsigned char *key, int keylen ) -{ - int i; - unsigned char sum[32]; - - struct sm3_ctx ctxTemp; - - if( keylen > 64 ) - { - sm3_finup(&ctxTemp, key, keylen, sum ); - - keylen = 32; - /*keylen = ( is224 ) ? 28 : 32;*/ - key = sum; - } - - memset( ctx->ipad, 0x36, 64 ); - memset( ctx->opad, 0x5C, 64 ); - - for( i = 0; i < keylen; i++ ) - { - ctx->ipad[i] = (unsigned char)( ctx->ipad[i] ^ key[i] ); - ctx->opad[i] = (unsigned char)( ctx->opad[i] ^ key[i] ); - } - - sm3_init( ctx); - sm3_update( ctx, ctx->ipad, 64 ); -} - -/* - * SM3 HMAC process buffer - */ -void sm3_hmac_update(struct sm3_ctx *ctx, unsigned char *input, int ilen ) -{ - sm3_update( ctx, input, ilen ); -} - -/* - * SM3 HMAC final digest - */ -void sm3_hmac_finish(struct sm3_ctx *ctx, unsigned char output[32] ) -{ - int hlen; - unsigned char tmpbuf[32]; - - /*is224 = ctx->is224;*/ - hlen = 32; - - sm3_final( ctx, tmpbuf ); - sm3_init( ctx ); - sm3_update( ctx, ctx->opad, 64 ); - sm3_update( ctx, tmpbuf, hlen ); - sm3_final( ctx, output ); -} - -/* - * output = HMAC-SM#( hmac key, input buffer ) - */ -void sm3_hmac( unsigned char *key, int keylen, - unsigned char *input, int ilen, - unsigned char output[32] ) -{ - struct sm3_ctx ctx; - - sm3_hmac_starts( &ctx, key, keylen); - sm3_hmac_update( &ctx, input, ilen ); - sm3_hmac_finish( &ctx, output ); -} diff --git a/sm_crypto/src/sm4.c b/sm_crypto/src/sm4.c deleted file mode 100644 index e331acf..0000000 --- a/sm_crypto/src/sm4.c +++ /dev/null @@ -1,304 +0,0 @@ -#include -#include -#include - -#include "debug.h" -#include "sm4.h" - -/* - * 32-bit integer manipulation macros (big endian) - */ -#ifndef GET_ULONG_BE -#define GET_ULONG_BE(n,b,i) \ -{ \ - (n) = ( (u32) (b)[(i) ] << 24 ) \ - | ( (u32) (b)[(i) + 1] << 16 ) \ - | ( (u32) (b)[(i) + 2] << 8 ) \ - | ( (u32) (b)[(i) + 3] ); \ -} -#endif - -#ifndef PUT_ULONG_BE -#define PUT_ULONG_BE(n,b,i) \ -{ \ - (b)[(i) ] = (u8) ( (n) >> 24 ); \ - (b)[(i) + 1] = (u8) ( (n) >> 16 ); \ - (b)[(i) + 2] = (u8) ( (n) >> 8 ); \ - (b)[(i) + 3] = (u8) ( (n) ); \ -} -#endif - -/* - *rotate shift left marco definition - * - */ -#define SHL(x,n) (((x) & 0xFFFFFFFF) << n) -#define ROTL(x,n) (SHL((x),n) | ((x) >> (32 - n))) - -#define SWAP(a,b) { u32 t = a; a = b; b = t;} - -/* - * Expanded SM4 S-boxes - * Sbox table: 8bits input convert to 8 bits output*/ - -static const u8 SboxTable[16][16] = -{ - {0xd6,0x90,0xe9,0xfe,0xcc,0xe1,0x3d,0xb7,0x16,0xb6,0x14,0xc2,0x28,0xfb,0x2c,0x05}, - {0x2b,0x67,0x9a,0x76,0x2a,0xbe,0x04,0xc3,0xaa,0x44,0x13,0x26,0x49,0x86,0x06,0x99}, - {0x9c,0x42,0x50,0xf4,0x91,0xef,0x98,0x7a,0x33,0x54,0x0b,0x43,0xed,0xcf,0xac,0x62}, - {0xe4,0xb3,0x1c,0xa9,0xc9,0x08,0xe8,0x95,0x80,0xdf,0x94,0xfa,0x75,0x8f,0x3f,0xa6}, - {0x47,0x07,0xa7,0xfc,0xf3,0x73,0x17,0xba,0x83,0x59,0x3c,0x19,0xe6,0x85,0x4f,0xa8}, - {0x68,0x6b,0x81,0xb2,0x71,0x64,0xda,0x8b,0xf8,0xeb,0x0f,0x4b,0x70,0x56,0x9d,0x35}, - {0x1e,0x24,0x0e,0x5e,0x63,0x58,0xd1,0xa2,0x25,0x22,0x7c,0x3b,0x01,0x21,0x78,0x87}, - {0xd4,0x00,0x46,0x57,0x9f,0xd3,0x27,0x52,0x4c,0x36,0x02,0xe7,0xa0,0xc4,0xc8,0x9e}, - {0xea,0xbf,0x8a,0xd2,0x40,0xc7,0x38,0xb5,0xa3,0xf7,0xf2,0xce,0xf9,0x61,0x15,0xa1}, - {0xe0,0xae,0x5d,0xa4,0x9b,0x34,0x1a,0x55,0xad,0x93,0x32,0x30,0xf5,0x8c,0xb1,0xe3}, - {0x1d,0xf6,0xe2,0x2e,0x82,0x66,0xca,0x60,0xc0,0x29,0x23,0xab,0x0d,0x53,0x4e,0x6f}, - {0xd5,0xdb,0x37,0x45,0xde,0xfd,0x8e,0x2f,0x03,0xff,0x6a,0x72,0x6d,0x6c,0x5b,0x51}, - {0x8d,0x1b,0xaf,0x92,0xbb,0xdd,0xbc,0x7f,0x11,0xd9,0x5c,0x41,0x1f,0x10,0x5a,0xd8}, - {0x0a,0xc1,0x31,0x88,0xa5,0xcd,0x7b,0xbd,0x2d,0x74,0xd0,0x12,0xb8,0xe5,0xb4,0xb0}, - {0x89,0x69,0x97,0x4a,0x0c,0x96,0x77,0x7e,0x65,0xb9,0xf1,0x09,0xc5,0x6e,0xc6,0x84}, - {0x18,0xf0,0x7d,0xec,0x3a,0xdc,0x4d,0x20,0x79,0xee,0x5f,0x3e,0xd7,0xcb,0x39,0x48} -}; - -/* System parameter */ -static const u32 FK[4] = {0xa3b1bac6,0x56aa3350,0x677d9197,0xb27022dc}; - -/* fixed parameter */ -static const u32 CK[32] = -{ - 0x00070e15,0x1c232a31,0x383f464d,0x545b6269, - 0x70777e85,0x8c939aa1,0xa8afb6bd,0xc4cbd2d9, - 0xe0e7eef5,0xfc030a11,0x181f262d,0x343b4249, - 0x50575e65,0x6c737a81,0x888f969d,0xa4abb2b9, - 0xc0c7ced5,0xdce3eaf1,0xf8ff060d,0x141b2229, - 0x30373e45,0x4c535a61,0x686f767d,0x848b9299, - 0xa0a7aeb5,0xbcc3cad1,0xd8dfe6ed,0xf4fb0209, - 0x10171e25,0x2c333a41,0x484f565d,0x646b7279 -}; - -/* - * private function: - * look up in SboxTable and get the related value. - * args: [in] inch: 0x00~0xFF (8 bits unsigned value). - */ -static u8 sm4Sbox(u8 inch) -{ - u8 *pTable = (u8 *)SboxTable; - u8 retVal = (u8)(pTable[inch]); - return retVal; -} - -/* - * private F(Lt) function: - * "T algorithm" == "L algorithm" + "t algorithm". - * args: [in] a: a is a 32 bits unsigned value; - * return: c: c is calculated with line algorithm "L" and nonline algorithm "t" - */ -static u32 sm4Lt(u32 ka) -{ - u32 bb = 0; - u32 c = 0; - u8 a[4]; - u8 b[4]; - - PUT_ULONG_BE(ka,a,0); - b[0] = sm4Sbox(a[0]); - b[1] = sm4Sbox(a[1]); - b[2] = sm4Sbox(a[2]); - b[3] = sm4Sbox(a[3]); - GET_ULONG_BE(bb,b,0); - c =bb^(ROTL(bb, 2))^(ROTL(bb, 10))^(ROTL(bb, 18))^(ROTL(bb, 24)); - return c; -} - -/* - * private F function: - * Calculating and getting encryption/decryption contents. - * args: [in] x0: original contents; - * args: [in] x1: original contents; - * args: [in] x2: original contents; - * args: [in] x3: original contents; - * args: [in] rk: encryption/decryption key; - * return the contents of encryption/decryption contents. - */ -static u32 sm4F(u32 x0, u32 x1, u32 x2, u32 x3, u32 rk) -{ - return (x0^sm4Lt(x1^x2^x3^rk)); -} - - -/* private function: - * Calculating round encryption key. - * args: [in] a: a is a 32 bits unsigned value; - * return: sk[i]: i{0,1,2,3,...31}. - */ -static u32 sm4CalciRK(u32 ka) -{ - u32 bb = 0; - u32 rk = 0; - u8 a[4]; - u8 b[4]; - PUT_ULONG_BE(ka,a,0); - b[0] = sm4Sbox(a[0]); - b[1] = sm4Sbox(a[1]); - b[2] = sm4Sbox(a[2]); - b[3] = sm4Sbox(a[3]); - GET_ULONG_BE(bb,b,0); - rk = bb^(ROTL(bb, 13))^(ROTL(bb, 23)); - return rk; -} - -static void sm4_setkey( u32 SK[32], u8 key[16] ) -{ - u32 MK[4]; - u32 k[36]; - u32 i = 0; - - GET_ULONG_BE( MK[0], key, 0 ); - GET_ULONG_BE( MK[1], key, 4 ); - GET_ULONG_BE( MK[2], key, 8 ); - GET_ULONG_BE( MK[3], key, 12 ); - k[0] = MK[0]^FK[0]; - k[1] = MK[1]^FK[1]; - k[2] = MK[2]^FK[2]; - k[3] = MK[3]^FK[3]; - for(; i<32; i++) - { - k[i+4] = k[i] ^ (sm4CalciRK(k[i+1]^k[i+2]^k[i+3]^CK[i])); - SK[i] = k[i+4]; - } -} - -/* - * SM4 standard one round processing - * - */ -static void sm4_one_round( u32 sk[32], - u8 input[16], - u8 output[16] ) -{ - u32 i = 0; - u32 ulbuf[36]; - - memset(ulbuf, 0, sizeof(ulbuf)); - GET_ULONG_BE( ulbuf[0], input, 0 ); - GET_ULONG_BE( ulbuf[1], input, 4 ); - GET_ULONG_BE( ulbuf[2], input, 8 ); - GET_ULONG_BE( ulbuf[3], input, 12 ); - while(i<32) { - ulbuf[i+4] = sm4F(ulbuf[i], ulbuf[i+1], ulbuf[i+2], ulbuf[i+3], sk[i]); - #if ALG_DEBUG - printf("rk(%02d) = 0x%08x, X(%02d) = 0x%08x \n",i,sk[i], i, ulbuf[i+4] ); - #endif - i++; - } - PUT_ULONG_BE(ulbuf[35],output,0); - PUT_ULONG_BE(ulbuf[34],output,4); - PUT_ULONG_BE(ulbuf[33],output,8); - PUT_ULONG_BE(ulbuf[32],output,12); -} - -int sm4_set_key(struct sm4_ctx *ctx, u8 *key, u32 len) -{ - int i; - -#if DEBUG - printf(" function: %s , line= %d \n", __FUNCTION__, __LINE__); -#endif - if( len != 16) { - printf(" sm4 set key leng errr \n"); - return -1; - } - - sm4_setkey(ctx->sk_enc, key); - - memcpy(ctx->sk_dec, ctx->sk_enc, 32*4); - for(i = 0; i < 16; i ++) { - SWAP(ctx->sk_dec[i], ctx->sk_dec[31-i]); - } - - return 0; -} - -void sm4_ecb_encrypt(struct sm4_ctx *ctx, u8 *key, u8 *in, u32 len, u8 *out) -{ -#if DEBUG - printf(" function: %s , line= %d \n", __FUNCTION__, __LINE__); -#endif - sm4_set_key(ctx, key, 16); - - while(len > 0) { - sm4_one_round(ctx->sk_enc, in, out); - in += 16; - out += 16; - len -= 16; - } -} - -void sm4_ecb_decrypt(struct sm4_ctx *ctx, u8 *key, u8 *in, u32 len, u8 *out) -{ -#if DEBUG - printf(" function: %s , line= %d \n", __FUNCTION__, __LINE__); -#endif - - sm4_set_key(ctx, key, 16); - - while( len > 0 ) { - sm4_one_round( ctx->sk_dec, in, out); - in += 16; - out += 16; - len -= 16; - } -} - -void sm4_cbc_encrypt(struct sm4_ctx *ctx, u8 *key, u8 *iv, u8 *in, u32 len, u8 *out) -{ - u8 temp[16]; - int i; - -#if DEBUG - printf(" function: %s , line= %d \n", __FUNCTION__, __LINE__); -#endif - - sm4_set_key(ctx, key, 16); - memcpy(temp, iv, 16 ); - while(len > 0) - { - for(i = 0; i < 16; i++) - out[i] = (u8)(in[i] ^ temp[i]); - sm4_one_round(ctx->sk_enc, out, out); - memcpy(temp, out, 16); - in += 16; - out += 16; - len -= 16; - } -} - -void sm4_cbc_decrypt(struct sm4_ctx *ctx, u8 *key, u8 *iv, u8 *in, u32 len, u8 *out) -{ - u8 temp[16]; - u8 dataIV[16]; - int i; - -#if DEBUG - printf(" function: %s , line= %d \n", __FUNCTION__, __LINE__); -#endif - - sm4_set_key(ctx, key, 16); - memcpy(temp, iv, 16 ); - while(len > 0) - { - memcpy(dataIV,in,16); - - sm4_one_round(ctx->sk_dec, in, out); - for(i = 0; i < 16; i++) - out[i] = (u8)(out[i] ^ temp[i] ); - - memcpy(temp, dataIV, 16); - - in += 16; - out += 16; - len -= 16; - } -} diff --git a/source/config.cpp b/source/config.cpp deleted file mode 100644 index 5a3184a..0000000 --- a/source/config.cpp +++ /dev/null @@ -1,77 +0,0 @@ -#include "config.h" -#include -#include - -Config::Config(QString qstrfilename) - : QObject(nullptr) -{ - if (qstrfilename.isEmpty()) - { - m_qstrFileName = QCoreApplication::applicationDirPath() + "/config.ini"; - } - else - { - m_qstrFileName = qstrfilename; - } - - m_psetting = new QSettings(m_qstrFileName, QSettings::IniFormat); -} - -Config::~Config() -{ - delete m_psetting; - m_psetting = nullptr; -} - -Config* Config::instance() -{ - static QMutex mutex; - QMutexLocker locker(&mutex); - - static Config *singleton = nullptr; - if (!singleton) { - singleton = new Config(); - } - return singleton; -} - -void Config::Set(QString qstrnodename,QString qstrkeyname,QVariant qvarvalue) -{ - m_psetting->setValue(QString("/%1/%2").arg(qstrnodename).arg(qstrkeyname), qvarvalue); -} - -void Config::SetArray(QString qstrnodename,QString qstrkeyname,QVariant qvarvalue) -{ - m_psetting->beginWriteArray(QString("/%1/%2").arg(qstrnodename).arg(qstrkeyname)); - QList list = qvarvalue.toList(); - for (int i = 0; i< list.length(); i++) - { - m_psetting->setArrayIndex(i); - m_psetting->setValue(qstrkeyname, list.at(i)); - } - m_psetting->endArray(); -} - -QVariant Config::Get(QString qstrnodename,QString qstrkeyname) -{ - QVariant qvar = m_psetting->value(QString("/%1/%2").arg(qstrnodename).arg(qstrkeyname)); - return qvar; -} - -QVariant Config::GetArray(QString qstrnodename,QString qstrkeyname) -{ - QList list; - int size = m_psetting->beginReadArray(QString("/%1/%2").arg(qstrnodename).arg(qstrkeyname)); - for (int i = 0; i< size; i++) - { - m_psetting->setArrayIndex(i); - list.append(m_psetting->value(qstrkeyname)); - } - m_psetting->endArray(); - return list; -} - -void Config::Clear() -{ - m_psetting->clear(); -} diff --git a/source/crypto.cpp b/source/crypto.cpp deleted file mode 100644 index e4d6801..0000000 --- a/source/crypto.cpp +++ /dev/null @@ -1,259 +0,0 @@ -#include "crypto.h" -#include - -Crypto::Crypto() -{ - -} - -Crypto* Crypto::getInstance() -{ - static Crypto crypto_instance; - return &crypto_instance; -} - -int Crypto::hex2bytearray(char s[], unsigned char bits[], u32 len) -{ - u32 i, n = 0; - for (i = 0; i < len; i += 2) { - if (s[i] >= 'a' && s[i] <= 'f') bits[n] = s[i] - 'a' + 10; - else if (s[i] >= 'A' && s[i] <= 'F') bits[n] = s[i] - 'A' + 10; - else bits[n] = s[i] - '0'; - if (s[i + 1] >= 'a' && s[i + 1] <= 'f') bits[n] = (bits[n] << 4) | (s[i + 1] - 'a' + 10); - else if (s[i + 1] >= 'A' && s[i + 1] <= 'F') bits[n] = (bits[n] << 4) | (s[i + 1] - 'A' + 10); - else bits[n] = (bits[n] << 4) | (s[i + 1] - '0'); - ++n; - } - bits[n] = 0; - return n; -} - -int Crypto::hex2bytearray(char s[], unsigned char *bits) -{ - int i=0, n = 0; - if (s[i] >= 'a' && s[i] <= 'f') *bits = s[i] - 'a' + 10; - else if (s[i] >= 'A' && s[i] <= 'F') *bits = s[i] - 'A' + 10; - else *bits = s[i] - '0'; - if (s[i + 1] >= 'a' && s[i + 1] <= 'f') *bits = (*bits << 4) | (s[i + 1] - 'a' + 10); - else if (s[i + 1] >= 'A' && s[i + 1] <= 'F') *bits = (*bits << 4) | (s[i + 1] - 'A' + 10); - else *bits = (*bits << 4) | (s[i + 1] - '0'); - ++n; - return n; -} - -void Crypto::bytearray2hex(u8 in_s[], char out_b[], u32 len) -{ - u32 i; - for (i = 0; i < len; i++) { - snprintf(out_b + i * 2, 2, "%02X", in_s[i]); - } - out_b[len * 2] = 0; -} - -void Crypto::bytearray2hex(ecc_point in_s, char out_b[]) -{ - int i; - for (i = 0; i < 4; i++) { - for (int j = 0; j < 8; j++) { - snprintf(out_b + i * 8 * 2 + j * 2, 2, "%02X", (u8)(in_s.x[i] >> (j * 8))); - } - } - for (i = 0; i < 4; i++) { - for (int j = 0; j < 8; j++) { - snprintf(out_b + i * 8 * 2 + j * 2 + 64, 2, "%02X", (u8)(in_s.y[i] >> (j * 8))); - } - } - out_b[128] = 0; -} - -void Crypto::pubhex2point(char *in_b, ecc_point *out_s) -{ - u64 temp = 0; - for (int i = 0; i < 4; i++) { - out_s->x[i] = 0; - for (int j = 0; j < 8; j++) { - sscanf(in_b + i * 8 * 2 + j * 2, "%2llX", &temp); - out_s->x[i] += temp << (j * 8); - } - } - for (int i = 0; i < 4; i++) { - out_s->y[i] = 0; - for (int j = 0; j < 8; j++) { - sscanf(in_b + i * 8 * 2 + j * 2 + 64, "%2llX", &temp); - out_s->y[i] += temp << (j * 8); - } - } -} - -void Crypto::sm2_key_gen(SM2_key *sm2_keypair,bool buffed) -{ - SM2_key temp_keypair; - ecc_point temp_pub_p; - u8 temp_pub[129]={0},temp_pri[65]={0}; - sm2_make_keypair(temp_pri,&temp_pub_p); - bytearray2hex(temp_pub_p, (char *)temp_pub); - hex2bytearray((char *)temp_pub,temp_keypair.pub_key,128); - strncpy((char *)temp_keypair.pri_key,(char *)temp_pri, 32); - strncpy((char *)sm2_keypair->pri_key,(char *)temp_keypair.pri_key, 32); - strncpy((char *)sm2_keypair->pub_key,(char *)temp_keypair.pub_key, 64); - if (buffed) - { - u8 pri_buf[65]; - bytearray2hex(sm2_keypair->pri_key, (char *)pri_buf); - strncpy((char *)sm2_keypair->pri_key,(char *)pri_buf, 64); - strncpy((char *)sm2_keypair->pub_key,(char *)temp_pub, 128); - } -} - -void Crypto::SM2_encrypt(u8 *pub, u8 *M, u32 Mlen, u8 *C, u32 *Clen, s32 mode) -{ - ecc_point pub_point; - memcpy(pub_point.x, pub, 32); - memcpy(pub_point.y, pub+32, 32); - sm2_encrypt(&pub_point, (u8 *)M, Mlen, (u8 *)C, Clen); - if (!mode) { - u8 *temp_C = (u8 *)malloc(sizeof(u8) * (*Clen)); - memset(temp_C, 0, sizeof(u8) * (*Clen)); - sm2_C1C2C3ConvertToC1C3C2(temp_C, (u8 *)C, *Clen, mode); - memset(C, 0, sizeof(u8) * (*Clen)); - memcpy(C, temp_C, sizeof(u8) * (*Clen)); - free(temp_C); - } -} - -// Default Input C1|C3|C2 -void Crypto::SM2_decrypt(u8 *pri, u8 *C, u32 Clen, u8 *M, u32 *Mlen, s32 mode) -{ - u8 *temp_C = (u8 *)malloc(sizeof(u8) * Clen); - if (!mode) { - sm2_C1C2C3ConvertToC1C3C2(temp_C, C, Clen, !mode); - } - sm2_decrypt(pri, temp_C, Clen, (u8 *)M, Mlen); - free(temp_C); -} - -// Output r | s -void Crypto::SM2_sign(u8 *pri, u8 *data, u32 datalen, u8 *out) -{ - struct sm3_ctx h; - u8 hash[33] = { 0 }; - u8 r[33] = { 0 }, s[33] = { 0 }; - sm3_finup(&h, data, datalen, hash); - sm2_sign(r, s, pri, hash); - memcpy(out, r, 32); - memcpy(out+32, s, 32); -} - -bool Crypto::SM2_verify(u8 *pub, u8 *data,u32 data_len, u8 *sig) -{ - struct sm3_ctx h; - u8 hash[33] = { 0 }; - u8 r[33] = { 0 }, s[33] = { 0 }; - ecc_point pub_point; - memcpy(pub_point.x, pub, 32); - memcpy(pub_point.y, pub+32, 32); - sm3_finup(&h, data, data_len, hash); - memcpy(r, sig, 32); - memcpy(s, sig+32, 32); - return (sm2_verify(&pub_point, hash, r, s) == 0 ? true : false); -} - -void Crypto::SM3_HMAC(u8 *key, int keylen, u8 *input, int ilen, u8 *output) -{ - sm3_hmac(key, keylen, input, ilen, output); -} - -bool Crypto::SM4_encrypt(u8 *key_origin, u32 key_len, u8 *in_origin, u32 in_len, u8 *out, u32 *out_len) -{ - struct sm4_ctx a; - u32 max_len; - u8 key[17] = { 0 }, *in = (u8 *)malloc(sizeof(u8) * (in_len + 16 * 2 + 1)); // 为保证C兼容性,不使用智能指针 两个16分别是为首末尾填充留足留足空间,1是冗余量 - u8 iv[17] = { - 0x21, 0xBC, 0xC1, 0xEA, 0x0D, 0xB8, 0x54, 0x6D, 0xCE, 0xE4, 0xDB, 0x3C, 0xFA, 0xC1, 0x3C, 0xEF }, fix_len; // 此处为省时才用固定IV,实际上此处IV必须是随机的才可真正保证SM4 CBC模式下加解密的强度 - for (int i = 0; i < 16; i++) - { - iv[i] = Crypto::getInstance()->get_rand(); // 使用随机数IV,如果想节省时间可以注释 - } - if (key_len > 16) { - free(in); - return false; - } - fix_len = 16 - key_len; - memcpy(key, key_origin, key_len); - for (int i = 0; i < 16; i++) - { - in[i] = Crypto::getInstance()->get_rand(); // 首填充 - } - memcpy(in + 16, in_origin, in_len); - if (key_len < 16) { - for (int i = key_len; i < 16; i++) { - key[i] = fix_len; - } - } - if (in_len % 16 != 0) { - max_len = ceil(in_len / 16.0)* 16 + 16; - fix_len = max_len - 16 - in_len; - for (u32 i = in_len + 16; i < max_len; i++) { - in[i] = fix_len; - } - in_len = max_len; - } else { - for (u32 i = in_len + 16; i < in_len + 16 * 2; i++) { - in[i] = 16; - } - in_len += 16 * 2; - } - *out_len = in_len; - sm4_cbc_encrypt(&a, key, iv, in, in_len, out); - free(in); - return true; -} - -bool Crypto::SM4_decrypt(u8 *key_origin, u32 key_len, u8 *in, u32 in_len, u8 *out, u32 *out_len) -{ - struct sm4_ctx b; - u32 fix_len; - u8 key[17] = { 0 }; - u8 iv[17] = { - 0x21, 0xBC, 0xC1, 0xEA, 0x0D, 0xB8, 0x54, 0x6D, 0xCE, 0xE4, 0xDB, 0x3C, 0xFA, 0xC1, 0x3C, 0xEF }; // 此处为省时才用固定IV,实际上此处IV必须是随机的才可真正保证SM4 CBC模式下加解密的强度 - u8* out_buf = (u8* )malloc(in_len * sizeof(u8)); // 为保证C兼容性,不使用智能指针 - for (int i = 0; i < 16; i++) - { - iv[i] = Crypto::getInstance()->get_rand(); // 使用随机数IV,如果想节省时间可以注释 - } - if (key_len > 16) { - free(out_buf); - return false; - } - fix_len = 16 - key_len; - memcpy(key, key_origin, key_len); - if (in_len % 16 != 0) { - free(out_buf); - return false; - } - if (key_len < 16) { - for (int i = key_len; i < 16; i++) { - key[i] = fix_len; - } - } - sm4_cbc_decrypt(&b, key, iv, in, in_len, out_buf); - fix_len = out_buf[in_len - 1]; - if (fix_len>in_len) - { - free(out_buf); - return false; - } - *out_len = in_len - fix_len - 16; - memcpy(out, out_buf + 16, *out_len); - free(out_buf); - return true; -} - -uint8_t Crypto::get_rand() -{ - uint8_t num = 0; - static time_t seed = 0; - srand(time(nullptr) + seed); - seed = rand(); - return rand() % 256; -} diff --git a/source/dlln3x_handler.cpp b/source/dlln3x_handler.cpp deleted file mode 100644 index 8ebdb2c..0000000 --- a/source/dlln3x_handler.cpp +++ /dev/null @@ -1,56 +0,0 @@ -#include "dlln3x_handler.h" - -DLLN3X_Handler::DLLN3X_Handler(QObject *parent) - : QObject{parent} -{ - _zigbee = zigbee_protocol::DLLN3X::instance(); - handle_serial(false); - serial(nullptr); - connect(this, &DLLN3X_Handler::handle_serialChanged, this, [=](){ - if (_handle_serial&&_serial!=nullptr) - { - _zigbee->init(_serial, _serial->baudRate()); - connect(_zigbee, &zigbee_protocol::DLLN3X::recved, this, &DLLN3X_Handler::zigbee_callback); - connect(_serial, &QSerialPort::readyRead, _zigbee, &zigbee_protocol::DLLN3X::loop); - connect(_serial, &QSerialPort::aboutToClose, this, &DLLN3X_Handler::close); - } - else - { - close(); - } - }); -} - -void DLLN3X_Handler::zigbee_callback(zigbee_protocol::ZigbeeFrame zframe) -{ - QByteArray zf = QByteArray((char *)zframe.data(),zframe.size()); - QByteArray hex = zf.toHex(' '); - QByteArray data = hex.toUpper(); - QByteArray num = QByteArray::number(zframe.getRemoteAddr(),16); - QByteArray sender = num.toUpper(); - emit zigbee_recved(data, sender); -} - -void DLLN3X_Handler::close() -{ - disconnect(_zigbee, &zigbee_protocol::DLLN3X::recved, this, &DLLN3X_Handler::zigbee_callback); - disconnect(_serial, &QSerialPort::readyRead, _zigbee, &zigbee_protocol::DLLN3X::loop); - disconnect(_serial, &QSerialPort::aboutToClose, this, &DLLN3X_Handler::close); -} - -bool DLLN3X_Handler::send(QString data) -{ - if (_handle_serial) - { - QByteArray bdata; - QStringList td = data.split(' '); - for (auto item : td) - bdata += QByteArray::fromHex(item.toLatin1()); - - zigbee_protocol::ZigbeeFrame zf(bdata.data(),bdata.length()); - - return _zigbee->send(zf); - } - else - return false; -} diff --git a/source/eventsbus.cpp b/source/eventsbus.cpp deleted file mode 100644 index 8eb647c..0000000 --- a/source/eventsbus.cpp +++ /dev/null @@ -1,44 +0,0 @@ -#include "eventsbus.h" -#include - -EventsBus::EventsBus(QObject *parent) - : QObject{parent} -{ - -} - -EventsBus* EventsBus::instance() -{ - static QMutex mutex; - QMutexLocker locker(&mutex); - - static EventsBus *singleton = nullptr; - if (!singleton) { - singleton = new EventsBus(); - } - return singleton; -} - -void EventsBus::reg_event(Event* event) -{ - _events.append(event); -} - -void EventsBus::unreg_event(Event* event) -{ - _events.removeOne(event); -} - -void EventsBus::push_data(QString type, QJsonObject data) -{ - - if (_event_history.count() >= 100) - _event_history.pop_front(); - if (data["time"].toString()=="") - data.insert("time",QJsonValue(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"))); - _event_history.append(data); - for (auto event : _events) { - if (event->type() == type) - emit event->triggered(data); - } -} diff --git a/source/main.cpp b/source/main.cpp deleted file mode 100644 index 81929b1..0000000 --- a/source/main.cpp +++ /dev/null @@ -1,43 +0,0 @@ -#include -#include -#include -#include -#include -#include - -FRAMELESSHELPER_USE_NAMESPACE -#ifdef RIBBONUI_BUILD_STATIC_LIB -Q_IMPORT_QML_PLUGIN(RibbonUIPlugin) -#endif -int main(int argc, char *argv[]) -{ - qputenv("QT_QUICK_CONTROLS_STYLE","Basic"); - FramelessHelper::Quick::initialize(); - QGuiApplication app(argc, argv); - -#ifdef Q_OS_WIN - FramelessConfig::instance()->set(Global::Option::ForceHideWindowFrameBorder); - FramelessConfig::instance()->set(Global::Option::ForceNonNativeBackgroundBlur); -#endif - FramelessConfig::instance()->set(Global::Option::CenterWindowBeforeShow); - FramelessConfig::instance()->set(Global::Option::EnableBlurBehindWindow); - - QTranslator translator; - bool result = translator.load(QLocale::system(), u""_qs, u""_qs, u":/translations"_qs); - if (result) - app.installTranslator(&translator); - QQmlApplicationEngine engine; - FramelessHelper::Quick::registerTypes(&engine); -#ifdef RIBBONUI_BUILD_STATIC_LIB - engine.addImportPath("qrc:/"); -#endif - const QUrl url(u"qrc:/ProtocolParser/qml/Main.qml"_qs); - QObject::connect(&engine, &QQmlApplicationEngine::objectCreated, - &app, [url](QObject *obj, const QUrl &objUrl) { - if (!obj && url == objUrl) - QCoreApplication::exit(-1); - }, Qt::QueuedConnection); - engine.load(url); - - return app.exec(); -} diff --git a/source/protocol.cpp b/source/protocol.cpp deleted file mode 100644 index 44a9a2a..0000000 --- a/source/protocol.cpp +++ /dev/null @@ -1,227 +0,0 @@ -#include "protocol.h" - - -using namespace zigbee_protocol; - -Protocol::Protocol(){ - _config = Config::instance(); - if (_config->Get("Protocol","hmac_verify_key").toString().isEmpty()) - _config->Set("Protocol","hmac_verify_key",hmac_verify_key); - else - hmac_verify_key = _config->Get("Protocol","hmac_verify_key").toString(); - if (_config->GetArray("Protocol","pre_hmac_verify_key").toStringList().isEmpty()) - _config->SetArray("Protocol","pre_hmac_verify_key",pre_hmac_verify_key); - else - pre_hmac_verify_key = _config->GetArray("Protocol","pre_hmac_verify_key").toStringList(); -} - -Protocol::~Protocol() -{ - _config->Set("Protocol","hmac_verify_key",hmac_verify_key); - _config->SetArray("Protocol","pre_hmac_verify_key",pre_hmac_verify_key); -} - -Protocol* Protocol::getInstance() -{ - static Protocol protocol_instance; - return &protocol_instance; -} - -void Protocol::protocal_wrapper(data_frame *frame, u8 type, u16 length, u8 *data, bool use_crc) -{ - frame->head=DATA_FRAME_HEAD; - frame->type=type; - frame->data_length = length; - if (use_crc) - { - frame->use_crc=0xDD; - u16 crc = crc16_xmodem(data, length); - frame->crc = crc; - } - else - { - frame->use_crc=0xFF; - frame->crc = 0xFFFF; - } - memcpy(frame->data,data,length); -} - -void Protocol::base_frame_maker(void *in_frame, base_frame *out_frame, u16 dest_addr,device *dev,u16 node_addr) -{ - out_frame->head = BASE_FRAME_HEAD; - out_frame->ori_addr= dev->addr; - out_frame->des_addr = dest_addr; - out_frame->node_addr = node_addr; - if (dev->id < BASE_FRAME_RESET_NUM) - { - if (dev->id == 0) - { - out_frame->reset_num = 0xFF; - do{ - srand(static_cast(time(nullptr))); - out_frame->rand_num = rand() & 0xFF; - }while(out_frame->rand_num==0); - dev->rand_num = out_frame->rand_num; - out_frame->reset_num = 0xDD; - } - else - { - out_frame->rand_num = dev->rand_num; - out_frame->reset_num = 0xFF; - } - out_frame->id = ++(dev->id); - } - else - { - out_frame->id = dev->id = 0; - out_frame->reset_num = 0xDD; - do{ - srand(static_cast(time(nullptr))); - out_frame->rand_num = rand() & 0xFF; - }while(out_frame->rand_num==0); - } - switch (*(u16 *)in_frame) - { - case 0xAAAB: - { - out_frame->length = ((digi_env *)in_frame)->length + BASE_FRAME_PREFIX_LEN; - break; - } - case 0xAAAC: - { - out_frame->length = ((ssl_frame *)in_frame)->length + BASE_FRAME_PREFIX_LEN; - break; - } - case 0xAAAA: - { - out_frame->length = ((data_frame *)in_frame)->data_length + DATA_FRAME_PREFIX_LEN + BASE_FRAME_PREFIX_LEN; - break; - } - case 0xAAAE: - { - out_frame->length = ((hmac_frame *)in_frame)->length + BASE_FRAME_PREFIX_LEN; - break; - } - case 0xAAAF: - { - out_frame->length = ((crypto_zdata_frame *)in_frame)->length + BASE_FRAME_PREFIX_LEN; - break; - } - } - memcpy(out_frame->data, in_frame ,out_frame->length - BASE_FRAME_PREFIX_LEN); -} - -bool Protocol::base_frame_parser(base_frame *in_frame, void **out_frame , device *dev) -{ - if (in_frame->des_addr == SELF_ADDR && (dev->id == 0||in_frame->reset_num==0xDD||((in_frame->id > dev->id && in_frame->id<=BASE_FRAME_RESET_NUM)))) - { - dev->addr = in_frame->ori_addr; - dev->id = in_frame->id; - dev->rand_num = in_frame->rand_num; - *out_frame = (void *)in_frame->data; - return true; - } - else - return false; -} - -uint16_t Protocol::crc16_xmodem(const uint8_t *buffer, uint32_t buffer_length) -{ - uint8_t c, treat, bcrc; - uint16_t wcrc = 0; - - for(uint32_t i = 0; i < buffer_length; i++) - { - c = buffer[i]; - for(uint8_t j = 0; j < 8; j++) - { - treat = c & 0x80; - c <<= 1; - bcrc = (wcrc >> 8) & 0x80; - wcrc <<= 1; - if(treat != bcrc) - wcrc ^= 0x1021; - } - } - return wcrc; -} - -bool Protocol::bytecmp(u8 *a, u8 *b, u16 length) -{ - return memcmp(a,b,length)==0; -} - -bool Protocol::data_frame_verify(data_frame *frame) -{ - if(frame->use_crc!=0xFF) - return !(frame->crc-crc16_xmodem(frame->data,frame->data_length)); - else - return true; -} - -void Protocol::zigbee_data_encrypt(data_frame *data, crypto_zdata_frame *zdata, - bool (* SM4_encrypt)(u8 *key_origin, u32 key_len, u8 *in_origin, u32 in_len, u8 *out, u32 *out_len), - QString en_key) -{ - u32 len; - zdata->head=CRYPTO_ZDATA_FRAME_HEAD; - QByteArray key = QByteArray::fromHex(en_key == "" ? hmac_verify_key.toLatin1() : en_key.toLatin1()); - SM4_encrypt((u8 *)key.data(), 16, (u8 *)data, data->data_length + DATA_FRAME_PREFIX_LEN, zdata->data,&len); - zdata->length = len + CRYPTO_ZDATA_FRAME_PREFIX_LEN; -} - -bool Protocol::zigbee_data_dectypt(data_frame *data, crypto_zdata_frame *zdata, - bool (* SM4_decrypt)(u8 *key_origin, u32 key_len, u8 *in, u32 in_len, u8 *out, u32 *out_len), - QString en_key) -{ - int total_len = zdata->length; - if (total_len - CRYPTO_ZDATA_FRAME_PREFIX_LEN<=0) - return false; - u32 len, msglen = total_len - CRYPTO_ZDATA_FRAME_PREFIX_LEN; - QByteArray key = QByteArray::fromHex(en_key == "" ? hmac_verify_key.toLatin1() : en_key.toLatin1()); - SM4_decrypt((u8 *)key.data(), 16, zdata->data, msglen, (u8 *)data, &len); - return true; -} - -void Protocol::HMAC_identify(device *self, device *node, hmac_frame *hframe, - void (*sendTonode)(ZigbeeFrame &data), - void (*SM3_HMAC)(u8 *key, int keylen,u8 *input, int ilen,u8 output[32] )) -{ - if (hframe==NULL) - return; - u8 hmac[33]=""; - ZigbeeFrame zf(0x81,0x81,node->addr); - QByteArray key = QByteArray::fromHex(hmac_verify_key.toLatin1()); - SM3_HMAC((u8 *)key.data(),16,&hframe->value,1,hmac); - if (bytecmp(hframe->hmac,hmac,32)) - { - new_data_frame(15) data; - memset(&data, 0, sizeof(data)); - protocal_wrapper((data_frame *)&data, 0, 10, (u8 *)"Identified", 0); - node->verified = 1; - new_base_frame(15 + BASE_FRAME_PREFIX_LEN) bframe; - memset(&bframe, 0, sizeof(bframe)); - base_frame_maker(&data, (base_frame *)&bframe, node->addr, self); - zf.setData((u8 *)&bframe, bframe.length); - sendTonode(zf); - printf("Node %X had passed HMAC identification.", node->addr); - } -} - -void Protocol::HMAC_changeVerifykey(u8 key[16], device* self, device *node, void (*sendTonode)(ZigbeeFrame &data), - bool (* SM4_encrypt)(u8 *key_origin, u32 key_len, u8 *in_origin, u32 in_len, u8 *out, u32 *out_len)) -{ - ZigbeeFrame zf(0x82,0x82,node->addr); - new_data_frame(16) data; - memset(&data, 0, sizeof(data)); - protocal_wrapper((data_frame *)&data, 0, 16, key, 0); - new_crypto_zdata_frame(48) zdata; - memset(&zdata, 0, sizeof(zdata)); - zigbee_data_encrypt((data_frame *)&data, (crypto_zdata_frame *)&zdata, SM4_encrypt); - new_base_frame(48 + BASE_FRAME_PREFIX_LEN) bframe; - memset(&bframe, 0, sizeof(bframe)); - base_frame_maker(&zdata, (base_frame *)&bframe, node->addr, self); - zf.setData((u8 *)&bframe, bframe.length); - sendTonode(zf); - printf("Node %X's verify key has changed.", node->addr); -} diff --git a/source/serialportmanager.cpp b/source/serialportmanager.cpp deleted file mode 100644 index 0dc49b1..0000000 --- a/source/serialportmanager.cpp +++ /dev/null @@ -1,241 +0,0 @@ -#include "serialportmanager.h" -#include -#include - -SerialPortManager::SerialPortManager(QObject *parent) - : QObject{parent} -{ - _zigbee = zigbee_protocol::DLLN3X::instance(); - _bus = EventsBus::instance(); - ZigBeeParser::instance(); // 让ZigBeeParser在QML引擎中实例化 - _event.type("serial_port"); - _bus->reg_event(&_event); - closed(true); - opened(false); - handledBymanager(true); - recv_hex(false); - send_hex(false); - send_type(SendType::Blank); - - _serial_port_scanner.setInterval(1000); - _serial_port_scanner.start(); - connect(&_serial_port_scanner, &QTimer::timeout, this, [=](){ - available_ports(); - }); - connect(this, &SerialPortManager::handledBymanagerChanged, this, [=](){ - if (!_handledBymanager && _serial_port.isOpen()) - { - _zigbee->init(&_serial_port, _serial_port.baudRate()); - connect(_zigbee, &zigbee_protocol::DLLN3X::recved, this, &SerialPortManager::zigbee_callback); - } - else - { - disconnect(_zigbee, &zigbee_protocol::DLLN3X::recved, this, &SerialPortManager::zigbee_callback); - } - }); - connect(&_event, &Event::triggered, this, [=](QJsonObject data){ - write(data["text"].toString()); - }); -} - -SerialPortManager::~SerialPortManager() -{ - close(); - _bus->unreg_event(&_event); -} - -SerialPortManager* SerialPortManager::instance(){ - static QMutex mutex; - QMutexLocker locker(&mutex); - - static SerialPortManager *singleton = nullptr; - if (!singleton) { - singleton = new SerialPortManager(); - } - return singleton; -} - -QList SerialPortManager::available_ports(){ - QList newPortStringList; - foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) - newPortStringList += info.portName(); - if (_available_ports_count != newPortStringList.count()) - { - available_ports_count(newPortStringList.count()); - emit available_portsChanged(newPortStringList); - } - return newPortStringList; -} - -bool SerialPortManager::open(QString port_name, QString baudrate, QString databits, - QString parity, QString stopbits) -{ - _serial_port.setPortName(port_name); - if (_serial_port.isOpen()) - { - close(); - return false; - } - else - { - if (_serial_port.open(QIODevice::ReadWrite)) - { - _serial_port.setBaudRate(baudrate.toInt()); - switch (databits.toInt()) - { - case 5: - _serial_port.setDataBits( QSerialPort::Data5 ); // 设置数据位(数据位为5位) - break; - case 6: - _serial_port.setDataBits( QSerialPort::Data6 ); // 设置数据位(数据位为6位) - break; - case 7: - _serial_port.setDataBits( QSerialPort::Data7 ); // 设置数据位(数据位为7位) - break; - case 8: - _serial_port.setDataBits( QSerialPort::Data8 ); // 设置数据位(数据位为8位) - break; - default: - return false; - } - if (parity=="NONE") - { - _serial_port.setParity( QSerialPort::NoParity ); // 设置校验位(无校验位) - } - else if (parity=="EVEN") - { - _serial_port.setParity( QSerialPort::EvenParity ); // 设置校验位(奇校验位) - } - else - { - _serial_port.setParity( QSerialPort::OddParity ); // 设置校验位(偶校验位) - } - if (stopbits=="1") - { - _serial_port.setStopBits( QSerialPort::OneStop ); // 设置停止位(停止位为1) - } - else if (stopbits=="1.5") - { - _serial_port.setStopBits( QSerialPort::OneAndHalfStop ); // 设置停止位(停止位为1.5) - } - else - { - _serial_port.setStopBits( QSerialPort::TwoStop ); // 设置停止位(停止位为2) - } - _serial_port.setFlowControl( QSerialPort::HardwareControl ); // 设置流控制(硬件数据流控制) - // 当下位机中有数据发送过来时就会响应这个槽函数 - connect(&_serial_port,&QSerialPort::readyRead,this,&SerialPortManager::_ready_for_read); - connect(&_serial_port,&QSerialPort::aboutToClose,this,&SerialPortManager::close); - opened(true); - closed(false); - return true; - } - else - return false; - } -} - -void SerialPortManager::close() -{ - disconnect(&_serial_port,&QSerialPort::aboutToClose,this,&SerialPortManager::close); - disconnect(&_serial_port,&QSerialPort::readyRead,this,&SerialPortManager::_ready_for_read); - disconnect(_zigbee, &zigbee_protocol::DLLN3X::recved, this, &SerialPortManager::zigbee_callback); - if(_opened) - { - _serial_port.clear(); - _serial_port.close(); - } - readyRead(false); - closed(true); - opened(false); -} - -QByteArray SerialPortManager::read() -{ - QByteArray bdata; - if (_opened && _handledBymanager) - { - readyRead(false); - bdata = _serial_port.readAll(); - if (_recv_hex) - { - return bdata.toHex(' ').toUpper(); - } - else - return bdata; - } - else - return bdata; -} - -void SerialPortManager::_ready_for_read() -{ - if (_handledBymanager) - readyRead(true); - if (!_handledBymanager) - _zigbee->loop(); -} - -bool SerialPortManager::write(QString data) -{ - if (_closed) - return false; - - if ( !_handledBymanager) - { - QByteArray bdata; - QStringList td = data.split(' '); - for (auto item : td) - bdata += QByteArray::fromHex(item.toLatin1()); - - zigbee_protocol::ZigbeeFrame zf(bdata[2],bdata[3],(uint16_t)bdata[4] | bdata[5]<<8, bdata.data()+6,bdata.length()-7); - - return _zigbee->send(zf); - } - - QByteArray bdata; - if(_send_hex) - { - QStringList td = data.split(' '); - for (auto item : td) - bdata += QByteArray::fromHex(item.toLatin1()); - } - else - bdata = data.toUtf8(); - switch(_send_type) - { - case SendType::WithCarriageEnter: - bdata += "\n"; - break; - case SendType::WithLineFeed: - bdata += "\r"; - break; - case SendType::WithCarriageEnterAndLineFeed: - bdata += "\r\n"; - break; - case SendType::Blank: - default: - break; - } - return _serial_port.write(bdata); -} - -void SerialPortManager::zigbee_callback(zigbee_protocol::ZigbeeFrame zframe) -{ - QJsonObject object; - QByteArray zf = QByteArray((char *)zframe.data(),zframe.size()); - QByteArray hex = zf.toHex(' '); - QByteArray data = hex.toUpper(); - readyRead(false); - object.insert("data_hex", QJsonValue(QString(data))); - object.insert("type","zigbee_raw_data"); - _bus->push_data("zigbee_parser", object); -} - -QSerialPort* SerialPortManager::get_serial() -{ - if (!_handledBymanager) - return &_serial_port; - else - return nullptr; -} diff --git a/source/zigbeeparser.cpp b/source/zigbeeparser.cpp deleted file mode 100644 index 9880c47..0000000 --- a/source/zigbeeparser.cpp +++ /dev/null @@ -1,294 +0,0 @@ -#include "zigbeeparser.h" -#include "crypto.h" -#include -#include - -ZigBeeParser::ZigBeeParser(QObject *parent) - : QObject{parent} -{ - _config = Config::instance(); - _protocol = zigbee_protocol::Protocol::getInstance(); - _bus = EventsBus::instance(); - _event.type("zigbee_parser"); - _bus->reg_event(&_event); - connect(&_event,&Event::triggered,this,&ZigBeeParser::message_parser); -} - -ZigBeeParser::~ZigBeeParser() -{ - _bus->unreg_event(&_event); - disconnect(&_event,&Event::triggered,this,&ZigBeeParser::message_parser); -} - -ZigBeeParser* ZigBeeParser::instance() -{ - static QMutex mutex; - QMutexLocker locker(&mutex); - - static ZigBeeParser *singleton = nullptr; - if (!singleton) { - singleton = new ZigBeeParser(); - } - return singleton; -} - -void ZigBeeParser::data_parser(zigbee_protocol::ZigbeeFrame &zframe, bool is_demo) -{ - src_port_parser(zframe,is_demo); - des_port_parser(zframe, is_demo); - remote_addr_parser(zframe, is_demo); -} - -void ZigBeeParser::src_port_parser(zigbee_protocol::ZigbeeFrame &zframe, bool is_demo) -{ - switch (zframe.getSrcPort()) { - case 0x81: - - break; - default: - break; - } -} - -void ZigBeeParser::des_port_parser(zigbee_protocol::ZigbeeFrame &zframe, bool is_demo) -{ - void *frame = nullptr; - base_frame *bframe=nullptr; - hmac_frame *hframe=nullptr; - crypto_zdata_frame *czdata = nullptr; - data_frame *ddata = nullptr; - QByteArray zdata((char *)zframe.data(), zframe.size()); - QString sender = QString::number(((base_frame *)zframe.getData().data())->ori_addr,16).toUpper(); - device temp,self; - QPair* node = nullptr; - memset(&temp,0,sizeof(temp)); - memset(&temp,0,sizeof(self)); - self.addr = SELF_ADDR; - if (!nodes.contains(((base_frame *)zframe.getData().data())->ori_addr)) - { - temp.addr=((base_frame *)zframe.getData().data())->ori_addr; - temp.id = 0; - temp.online = 1; - temp.rand_num = 0; - temp.verified = 0; - nodes.insert(temp.addr,qMakePair(temp,self)); - } - node = &nodes[((base_frame *)zframe.getData().data())->ori_addr]; - bframe = (base_frame*)zframe.getData().data(); - if (is_demo || bframe->des_addr == SELF_ADDR && (node->first.id == 0||bframe->reset_num==0xDD||((bframe->id > node->first.id && bframe->id<=BASE_FRAME_RESET_NUM)))) - { - node->first.addr = bframe->ori_addr; - node->first.id = bframe->id; - node->first.rand_num = bframe->rand_num; - frame = (void*)bframe->data; - } - else - { - QJsonObject object; - object.insert("text",QJsonValue(QString(zdata.toHex(' ').toUpper()))); - object.insert("note_text",QJsonValue("请注意,节点0x"+QString::number(node->first.addr,16).toUpper()+"发送的该数据包损坏")); - object.insert("recieved", true); - object.insert("sender", sender); - object.insert("type","zigbee_identify_data"); - _bus->push_data("zigbee_identify_data_view",object); - return; - } - switch (zframe.getDesPort()) { - case 0x81: - { - hframe = (hmac_frame*)frame; - QJsonObject object; - object.insert("text",QJsonValue(QString(zdata.toHex(' ').toUpper()))); - object.insert("sender", sender); - object.insert("note_text",QJsonValue("收到节点0x"+ sender +"发送的验证信息")); - object.insert("recieved", true); - object.insert("type","zigbee_identify_data"); - _bus->push_data("zigbee_identify_data_view",object); - if (_allow_list.contains(node->first.addr)) - { - u8 hmac[33]=""; - QByteArray key = QByteArray::fromHex(_protocol->hmac_verify_key.toLatin1()); - Crypto::getInstance()->SM3_HMAC((u8 *)key.data(),16,&hframe->value,1,hmac); - if (_protocol->bytecmp(hframe->hmac,hmac,32)) - { - new_data_frame(15) data; - memset(&data, 0, sizeof(data)); - _protocol->protocal_wrapper((data_frame *)&data, 0, 10, (u8 *)"Identified", 0); - node->first.verified = 1; - new_base_frame(15 + BASE_FRAME_PREFIX_LEN) bframe; - memset(&bframe, 0, sizeof(bframe)); - _protocol->base_frame_maker(&data, (base_frame *)&bframe, node->first.addr,&node->second); - zigbee_protocol::ZigbeeFrame zf(zframe.getSrcPort(),zframe.getDesPort(),zframe.getRemoteAddr(),(uint8_t *)&bframe,bframe.length); - QByteArray bdata((char *)&bframe, bframe.length); - QByteArray zdata((char *)zf.data(), zf.size()); - QJsonObject object; - object.insert("baseframe_data",QJsonValue(QString(bdata.toHex(' ').toUpper()))); - object.insert("text",QJsonValue(QString(zdata.toHex(' ').toUpper()))); - object.insert("note_text",QJsonValue("向0x"+QString::number(node->first.addr,16).toUpper()+"节点发送验证通过回复信息")); - object.insert("recieved", false); - object.insert("sender", QString::number(SELF_ADDR,16).toUpper()); - object.insert("type","zigbee_identify_data"); - _bus->push_data("zigbee_identify_data_view",object); - if(!is_demo) - _bus->push_data("serial_port",object); - } - else - { - u8 hmac[33]=""; - QJsonObject object; - QByteArray latest_key = QByteArray::fromHex(_protocol->hmac_verify_key.toLatin1()); - for (auto key_str : _protocol->pre_hmac_verify_key) - { - QByteArray key = QByteArray::fromHex(key_str.toLatin1()); - Crypto::getInstance()->SM3_HMAC((u8 *)key.data(),16,&hframe->value,1,hmac); - if (_protocol->bytecmp(hframe->hmac,hmac,32)) - { - zigbee_protocol::ZigbeeFrame zf(0x82,0x82,node->first.addr); - new_data_frame(16) data; - memset(&data, 0, sizeof(data)); - _protocol->protocal_wrapper((data_frame *)&data, 0, 16, (u8*)latest_key.data(), 0); - new_crypto_zdata_frame(48) zdata; - memset(&zdata, 0, sizeof(zdata)); - _protocol->zigbee_data_encrypt((data_frame *)&data, (crypto_zdata_frame *)&zdata, Crypto::SM4_encrypt, key_str); - new_base_frame(48 + BASE_FRAME_PREFIX_LEN) bframe; - memset(&bframe, 0, sizeof(bframe)); - _protocol->base_frame_maker(&zdata, (base_frame *)&bframe, node->first.addr, &node->second); - zf.setData((u8 *)&bframe, bframe.length); - QByteArray bdata((char *)&bframe, bframe.length); - QByteArray zfdata((char *)zf.data(), zf.size()); - object.insert("baseframe_data",QJsonValue(QString(bdata.toHex(' ').toUpper()))); - object.insert("text",QJsonValue(QString(zfdata.toHex(' ').toUpper()))); - object.insert("note_text",QJsonValue("节点0x"+QString::number(node->first.addr,16).toUpper()+"正在使用旧密钥,发送密钥更新指令")); - object.insert("recieved", false); - object.insert("sender", QString::number(SELF_ADDR,16).toUpper()); - object.insert("type","zigbee_identify_data"); - _bus->push_data("zigbee_identify_data_view",object); - if(!is_demo) - _bus->push_data("serial_port",object); - return; - } - } - object.insert("note_text",QJsonValue("节点0x"+QString::number(node->first.addr,16).toUpper()+"验证不通过,请考虑移出认证列表")); - object.insert("recieved", true); - object.insert("sender", sender); - object.insert("type","zigbee_identify_data"); - _bus->push_data("zigbee_identify_data_view",object); - } - } - else if(_deny_list.contains(node->first.addr)) - { - object.insert("sender", sender); - object.insert("text",""); - object.insert("note_text",QJsonValue("节点0x"+QString::number(((base_frame *)zframe.getData().data())->ori_addr,16).toUpper()+"被禁止接入")); - object.insert("recieved", true); - object.insert("type","zigbee_identify_data"); - _bus->push_data("zigbee_identify_data_view",object); - } - else { - if (!_wait_queue.contains(node->first.addr)) - { - _wait_queue.append(node->first.addr); - object.insert("sender", sender); - object.insert("text",""); - object.insert("note_text",QJsonValue("节点0x"+QString::number(((base_frame *)zframe.getData().data())->ori_addr,16).toUpper()+"进入等待队列")); - object.insert("recieved", true); - object.insert("type","zigbee_identify_data"); - _bus->push_data("zigbee_identify_data_view",object); - } - else - { - object.insert("sender", sender); - object.insert("text",""); - object.insert("note_text",QJsonValue("节点0x"+QString::number(((base_frame *)zframe.getData().data())->ori_addr,16).toUpper()+"已在等待队列")); - object.insert("recieved", true); - object.insert("type","zigbee_identify_data"); - _bus->push_data("zigbee_identify_data_view",object); - } - } - break; - } - case 0x82: - { - - } - case 0x83: - { - zigbee_protocol::ZigbeeFrame dzf = zframe; - new_data_frame(72) ndata; - QJsonObject object; - if (*(u16 *)frame == CRYPTO_ZDATA_FRAME_HEAD) - { - czdata = (crypto_zdata_frame*)frame; - _protocol->zigbee_data_dectypt((data_frame*)&ndata, czdata, Crypto::SM4_encrypt); - dzf.setData((char*)&ndata,ndata.data_length + DATA_FRAME_PREFIX_LEN); - zdata = QByteArray((char *)dzf.data(), dzf.size()); - object.insert("decrypted_text", QJsonValue(QString(zdata.toHex(' ').toUpper()))); - } - object.insert("sender", sender); - object.insert("text",QJsonValue(QString(zdata.toHex(' ').toUpper()))); - object.insert("note_text",QJsonValue("收到节点0x"+sender+"发送的数据")); - object.insert("recieved", true); - object.insert("type","zigbee_recv_data"); - if (QRandomGenerator::global()->bounded(2) && is_demo) - object.insert("decrypted_text", QJsonValue(QString(zdata.toHex(' ').toUpper()))); - _bus->push_data("zigbee_recv_data_view",object); - } - default: - break; - } -} - -void ZigBeeParser::remote_addr_parser(zigbee_protocol::ZigbeeFrame &zframe, bool is_demo) -{ - switch (zframe.getRemoteAddr()) { - case 0xAAAA: - - break; - default: - break; - } -} - -void ZigBeeParser::message_parser(QJsonObject message) -{ - if (message["type"] == "demo_verify_request" || message["type"] == "zigbee_verify_request") - { - hmac_frame frame; - frame.value = QRandomGenerator::global()->bounded(256); - frame.head = HMAC_FRAME_HEAD; - frame.length = 32 + HMAC_FRAME_PREFIX_LEN; - QByteArray key = QByteArray::fromHex(_protocol->hmac_verify_key.toLatin1()); - Crypto::getInstance()->SM3_HMAC((u8 *)key.data(), 16, &frame.value, 1, frame.hmac); - new_base_frame(50 + BASE_FRAME_PREFIX_LEN) bframe; - device test; - test.addr = 0x5656; - _protocol->base_frame_maker(&frame, (base_frame *)&bframe, 0x5656, &test); - zigbee_protocol::ZigbeeFrame zf(0x81,0x81,0x5656,(char*)&bframe,bframe.length); - data_parser(zf, message["type"] == "demo_verify_request"); - } - if (message["type"] == "demo_verify_key_update" || message["type"] == "zigbee_verify_key_update") - { - hmac_frame frame; - frame.value = QRandomGenerator::global()->bounded(256); - frame.head = HMAC_FRAME_HEAD; - frame.length = 32 + HMAC_FRAME_PREFIX_LEN; - QByteArray key = QByteArray::fromHex(_protocol->pre_hmac_verify_key[QRandomGenerator::global()->bounded(_protocol->pre_hmac_verify_key.length())].toLatin1()); - Crypto::getInstance()->SM3_HMAC((u8 *)key.data(), 16, &frame.value, 1, frame.hmac); - new_base_frame(50 + BASE_FRAME_PREFIX_LEN) bframe; - device test; - test.addr = 0x5656; - _protocol->base_frame_maker(&frame, (base_frame *)&bframe, 0x5656, &test); - zigbee_protocol::ZigbeeFrame zf(0x81,0x81,0x5656,(char*)&bframe,bframe.length); - data_parser(zf, message["type"] == "demo_verify_key_update"); - } - if (message["type"] == "demo_recv_data" || message["type"] == "zigbee_raw_data") - { - QString data = message["data_hex"].toString(); - QByteArray bdata; - QStringList td = data.split(' '); - for (auto item : td) - bdata += QByteArray::fromHex(item.toLatin1()); - zigbee_protocol::ZigbeeFrame zf(bdata[2],bdata[3],(uint16_t)bdata[4] | bdata[5]<<8, bdata.data()+6,bdata.length()-7); - data_parser(zf, message["type"] == "demo_recv_data"); - } -}