Проблема с портированием части кода на C ++ (CHAP)

У меня есть следующий, на первый взгляд простой кусок кода PHP, который является частью реализации CHAP, который мне нужно включить в проект C ++:

$response = md5("\0" . hash('sha256', $password) . pack('H32', $challenge);

Это то, что я до сих пор:

// should do what hash('sha256', $password) does
string shaString(const string str)
{
unsigned char hash[SHA256_DIGEST_LENGTH];
SHA256_CTX sha256;
SHA256_Init(&sha256);
SHA256_Update(&sha256, str.c_str(), str.size());
SHA256_Final(hash, &sha256);
stringstream ss;
for (int i = 0; i < SHA256_DIGEST_LENGTH; i++)
{
ss << hex << setw(2) << setfill('0') << (int)hash[i];
}
return ss.str();
}

// should do the rest
string md5String(const string password, const string challenge)
{
int clen = challenge.length() / 2; // should be half length of hex values
int plen = password.length() + 1;  // add one for null terminating string
int tlen = clen + plen + 1;
unsigned char *buffer = (unsigned char *) malloc(tlen);
unsigned short buf;
const char *pstr = password.c_str();
unsigned char digest[MD5_DIGEST_LENGTH];
MD5_CTX md5;

memset(buffer, 0, tlen);

// skip the first byte as we need to start with \0,
// copy password starting at second byte
memcpy(buffer + 1, pstr, plen);
int start = plen + 1;

// should be equivalent to pack('H32', $challenge)
for (int j = 0; j < clen; j++) {
if (scanf((challenge.substr(j * 2, 2)).c_str(), "%hx", &buf) < 1)
break;
buffer[start + j] = (unsigned char) buf;
}

MD5_Init(&md5);    // md5 what we got so far
MD5_Update(&md5, buffer, tlen);
MD5_Final(digest, &md5);
stringstream ss;
for (int i = 0; i < MD5_DIGEST_LENGTH; i++)
{
ss << hex << setw(2) << setfill('0') << (int)digest[i];
}

free(buffer);

return ss.str();
}

string response = md5String(shaString(password.c_str()), challenge.c_str());

Код запускается и генерирует строку, но значение является неправильным, я не смог определить, почему именно, поскольку это криптографический хэш, трудно сравнивать результаты.

Я думаю, что где-то делаю глупости, боролся с этим часами. Любые предложения будут ценны. Моя цель просто сделать то, что уже было сделано в PHP, без запуска exec на PHP, конечно.

Я подозреваю, что я делаю что-то не так со строками.

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]