By printing out some debug info I've find out that's problem is uncompressing on server-side.
I'm trying to do the following using Qt-built-in zlib (
highlighted version):
char json[] = "{\"version\":1,\"user\":\"test\"}";
std::auto_ptr message(new Bytef[ // allocate memory for:
sizeof(ubbp_header) // + ubbp_header
+ sizeof(uLongf) // + uncompressed length
+ strlen(json) // + message
+ SHA256_DIGEST_LENGTH // + sha256
+ 64]); // + reserve (if compressed size > uncompressed size)
uLongf unc_len = strlen(json);
uLongf comp_len = unc_len + 64;
Bytef* pHeader = message.get(); // header
Bytef* pLen = pHeader + sizeof(ubbp_header); // length of uncompressed data
Bytef* pCompDat = pLen + sizeof(uLongf); // compressed data
Bytef* pSha256; // digest
if (Z_OK != compress2(pCompDat, &comp_len, (Bytef*)json, unc_len, 9))
{
qDebug("Compression failed");
return false;
}
/* calculating message digest */
char pass[] = "test";
uchar md[SHA256_DIGEST_LENGTH];
SHA256_CTX ctx;
SHA256_Init(&ctx);
SHA256_Update(&ctx, pLen, comp_len + sizeof(uLongf));
SHA256_Update(&ctx, pass, strlen(pass));
SHA256_Final(md, &ctx);
/* building message */
uLongf msg_len = sizeof(ubbp_header) + sizeof(uLongf) + comp_len + SHA256_DIGEST_LENGTH;
header.op_size = UBBP_OP_SIZE(BC_OP_LOGIN, msg_len - sizeof(ubbp_header));
pSha256 = pCompDat + comp_len;
memcpy(pHeader, &header, sizeof(ubbp_header));
memcpy(pLen, &unc_len, sizeof(uLongf));
memcpy(pSha256, &md, SHA256_DIGEST_LENGTH);
/* sending message */
socket.write((char*)message.get(), msg_len);
socket.waitForBytesWritten();
And still server-side
uncompress() (located in
cjson_decode()) doesn't returns
Z_OK.
Where's mistake?