[Mac M2 Pro 12CPU, Sonoma 14.5, wxWidgets 3.2.5]
エアコンを操作するAPIリクエストのところでつまづきました。
Pythonでは100%成功していましたが、C++では成功率50%以下になりました。色々調べた結果、HMAC_CTXによる署名生成に問題があることが判明し、これを使わずに署名生成して解決しました。
Pythonではシンプルに正常なコードになる場合でも、C++に移植するのは容易ではないことがたまにあります。
#include "signGenerate.h"
#include <openssl/hmac.h>
#include <openssl/sha.h>
#include <openssl/buffer.h>
#include <uuid/uuid.h>
std::string generate_uuid() {
uuid_t uuid;
uuid_generate_random(uuid);
char uuid_str[37];
uuid_unparse(uuid, uuid_str);
return std::string(uuid_str);
}
std::string base64_encode(const unsigned char* input, int length) {
BIO *bmem, *b64;
BUF_MEM *bptr;
b64 = BIO_new(BIO_f_base64());
bmem = BIO_new(BIO_s_mem());
b64 = BIO_push(b64, bmem);
BIO_write(b64, input, length);
BIO_flush(b64);
BIO_get_mem_ptr(b64, &bptr);
std::string output(bptr->data, bptr->length - 1);
BIO_free_all(b64);
return output;
}
std::string hmac_sha256(const std::string& key, const std::string& data) {
unsigned char* digest;
digest = HMAC(EVP_sha256(), key.c_str(), key.length(), (unsigned char*)data.c_str(), data.length(), NULL, NULL);
return std::string((char*)digest, SHA256_DIGEST_LENGTH);
}