1
0

add namespace

This commit is contained in:
2025-11-21 15:42:03 +08:00
parent 33ac4f1250
commit 16c1e1a782
8 changed files with 58 additions and 13 deletions

View File

@@ -4,6 +4,7 @@
"name": "MinGW64", "name": "MinGW64",
"includePath": [ "includePath": [
"${workspaceFolder}/include", "${workspaceFolder}/include",
"${workspaceFolder}/qrcodegen",
"${workspaceFolder}", "${workspaceFolder}",
"C:\\MinGW64\\include", "C:\\MinGW64\\include",
"C:\\MinGW64\\x86_64-w64-mingw32\\include" "C:\\MinGW64\\x86_64-w64-mingw32\\include"

View File

@@ -1,12 +1,39 @@
cmake_minimum_required(VERSION 3.15) cmake_minimum_required(VERSION 3.15)
set(CMAKE_BUILD_TYPE Release) set(CMAKE_BUILD_TYPE Release)
option(USE_SYSTEM_CURL "use system installed libcurl" ON)
find_package(mbedtls REQUIRED) find_package(mbedtls REQUIRED)
find_package(CURL REQUIRED)
if (USE_SYSTEM_CURL)
find_package(CURL REQUIRED)
else ()
include(FetchContent)
FetchContent_Declare(curl
URL https://curl.se/download/curl-8.16.0.tar.xz
DOWNLOAD_EXTRACT_TIMESTAMP TRUE
)
set(ZLIB_USE_STATIC_LIBS ON)
set(CURL_USE_MBEDTLS ON)
set(HTTP_ONLY ON)
set(BUILD_CURL_EXE OFF)
set(BUILD_TESTING OFF)
set(BUILD_EXAMPLES OFF)
set(BUILD_LIBCURL_DOCS OFF)
set(BUILD_MISC_DOCS OFF)
set(ENABLE_CURL_MANUAL OFF)
set(USE_NGHTTP2 OFF)
set(USE_LIBIDN2 OFF)
set(CURL_BROTLI OFF)
set(CURL_ZSTD OFF)
set(CURL_USE_LIBSSH2 OFF)
set(CURL_USE_LIBPSL OFF)
set(CURL_DISABLE_PROGRESS_METER ON)
FetchContent_MakeAvailable(curl)
endif ()
project(clist) project(clist)
file(GLOB_RECURSE MAIN_SRC "${CMAKE_SOURCE_DIR}/src/*.cpp") file(GLOB_RECURSE MAIN_SRC "${CMAKE_SOURCE_DIR}/src/*.cpp" "qrcodegen/qrcodegen.c")
add_executable(${PROJECT_NAME} ${MAIN_SRC}) add_executable(${PROJECT_NAME} ${MAIN_SRC})
target_include_directories(${PROJECT_NAME} PRIVATE include qrcodegen) target_include_directories(${PROJECT_NAME} PRIVATE include qrcodegen)
target_link_libraries(${PROJECT_NAME} PRIVATE mbedtls CURL::libcurl) target_link_libraries(${PROJECT_NAME} PRIVATE fmt mbedcrypto CURL::libcurl bcrypt)

View File

@@ -4,6 +4,8 @@
#include <vector> #include <vector>
#include <memory> #include <memory>
namespace drive {
enum drive_type { enum drive_type {
dt_alipan, dt_alipan,
dt_filebrowser, dt_filebrowser,
@@ -35,3 +37,5 @@ drive::ref new_drive(drive_type type);
std::string hex_encode(const unsigned char* data, size_t len); std::string hex_encode(const unsigned char* data, size_t len);
std::string device_name(); std::string device_name();
}

View File

@@ -10,6 +10,8 @@
#include <mbedtls/base64.h> #include <mbedtls/base64.h>
#include <fmt/format.h> #include <fmt/format.h>
namespace drive {
using json = nlohmann::json; using json = nlohmann::json;
namespace fs = std::filesystem; namespace fs = std::filesystem;
@@ -116,7 +118,7 @@ bool alipan::qrLogin(fnQrcode printQr) {
this->refresh_token = login.at("refreshToken"); this->refresh_token = login.at("refreshToken");
// 计算设备ID // 计算设备ID
unsigned char digest[32]; unsigned char digest[32];
mbedtls_sha256_ret((uint8_t*)this->user_id.c_str(), this->user_id.size(), digest, 0); mbedtls_sha256((uint8_t*)this->user_id.c_str(), this->user_id.size(), digest, 0);
this->device_id = hex_encode(digest, sizeof(digest)); this->device_id = hex_encode(digest, sizeof(digest));
fmt::print("login user_id({}) drive_id({})\n", this->user_id, this->drive_id); fmt::print("login user_id({}) drive_id({})\n", this->user_id, this->drive_id);
@@ -307,18 +309,19 @@ bool alipan::createSession() {
size_t pub_len = 0; size_t pub_len = 0;
std::vector<uint8_t> pub(MBEDTLS_ECP_MAX_BYTES, 0); std::vector<uint8_t> pub(MBEDTLS_ECP_MAX_BYTES, 0);
mbedtls_ecp_point_write_binary( mbedtls_ecp_point_write_binary(
&ctx_sign.grp, &ctx_sign.Q, MBEDTLS_ECP_PF_UNCOMPRESSED, &pub_len, pub.data(), pub.size()); &ctx_sign.private_grp, &ctx_sign.private_Q, MBEDTLS_ECP_PF_UNCOMPRESSED, &pub_len, pub.data(), pub.size());
pub_key = hex_encode(pub.data(), pub_len); pub_key = hex_encode(pub.data(), pub_len);
// sign message // sign message
unsigned char msg_hash[32]; unsigned char msg_hash[32];
mbedtls_sha256_ret((uint8_t*)msg.c_str(), msg.size(), msg_hash, 0); mbedtls_sha256((uint8_t*)msg.c_str(), msg.size(), msg_hash, 0);
mbedtls_mpi r, s; mbedtls_mpi r, s;
std::vector<uint8_t> sigdata(MBEDTLS_ECDSA_MAX_LEN, 0); std::vector<uint8_t> sigdata(MBEDTLS_ECDSA_MAX_LEN, 0);
mbedtls_mpi_init(&r); mbedtls_mpi_init(&r);
mbedtls_mpi_init(&s); mbedtls_mpi_init(&s);
mbedtls_ecdsa_sign(&ctx_sign.grp, &r, &s, &ctx_sign.d, msg_hash, sizeof(msg_hash), mbd_rand, nullptr); mbedtls_ecdsa_sign(
&ctx_sign.private_grp, &r, &s, &ctx_sign.private_d, msg_hash, sizeof(msg_hash), mbd_rand, nullptr);
size_t plen = mbedtls_mpi_size(&r); size_t plen = mbedtls_mpi_size(&r);
mbedtls_mpi_write_binary(&r, sigdata.data(), plen); mbedtls_mpi_write_binary(&r, sigdata.data(), plen);
@@ -344,3 +347,5 @@ bool alipan::createSession() {
}); });
return j.at("success").get<bool>(); return j.at("success").get<bool>();
} }
} // namespace drive

View File

@@ -4,6 +4,8 @@
#include "http.h" #include "http.h"
#include "drive.h" #include "drive.h"
namespace drive {
class alipan : public drive { class alipan : public drive {
public: public:
bool qrLogin(fnQrcode printQr) override; bool qrLogin(fnQrcode printQr) override;
@@ -29,3 +31,5 @@ private:
std::string drive_id; std::string drive_id;
std::string user_id; std::string user_id;
}; };
}

View File

@@ -1,5 +1,7 @@
#include "alipan.h" #include "alipan.h"
namespace drive {
static std::map<drive_type, drive::ref> m; static std::map<drive_type, drive::ref> m;
drive::ref new_drive(drive_type type) { drive::ref new_drive(drive_type type) {
@@ -16,3 +18,5 @@ drive::ref new_drive(drive_type type) {
} }
return it->second; return it->second;
} }
}

View File

@@ -15,7 +15,7 @@
#include <unistd.h> #include <unistd.h>
#endif #endif
std::string hex_encode(const unsigned char* data, size_t len) { std::string drive::hex_encode(const unsigned char* data, size_t len) {
std::stringstream ss; std::stringstream ss;
for (size_t i = 0; i < len; i++) ss << std::hex << std::setw(2) << std::setfill('0') << (int)data[i]; for (size_t i = 0; i < len; i++) ss << std::hex << std::setw(2) << std::setfill('0') << (int)data[i];
return ss.str(); return ss.str();
@@ -36,7 +36,7 @@ std::string ansi_to_utf8(const char* locale, std::string const& str_gbk) {
return cutf8.to_bytes(std::wstring(buff.data(), to_next)); return cutf8.to_bytes(std::wstring(buff.data(), to_next));
} }
std::string device_name() { std::string drive::device_name() {
#ifdef __SWITCH__ #ifdef __SWITCH__
SetSysDeviceNickName nick; SetSysDeviceNickName nick;
if (R_SUCCEEDED(setsysGetDeviceNickname(&nick))) { if (R_SUCCEEDED(setsysGetDeviceNickname(&nick))) {

View File

@@ -1,6 +1,6 @@
#include "http.h" #include "http.h"
#include "drive.h" #include "drive.h"
#include <qrcodegen/qrcodegen.h> #include <qrcodegen.h>
#include <fmt/format.h> #include <fmt/format.h>
void printQr(const std::string& text) { void printQr(const std::string& text) {
@@ -23,7 +23,7 @@ void printQr(const std::string& text) {
int main(int argc, char* argv[]) { int main(int argc, char* argv[]) {
curl_global_init(CURL_GLOBAL_ALL); curl_global_init(CURL_GLOBAL_ALL);
drive::ref c = new_drive(dt_alipan); auto c = drive::new_drive(drive::dt_alipan);
if (!c->qrLogin(printQr)) return 1; if (!c->qrLogin(printQr)) return 1;
uint32_t choice = 0; uint32_t choice = 0;