Создание дайджеста аутентификации ONVIF с использованием Crypto ++?

ONVIF Раздел 6.1.1.3 спецификации аутентификации содержит то, что выглядит как прямое описание того, как генерировать дайджест. Однако при использовании Crypto ++ для операций Base64 и SHA1 я не могу сгенерировать тот же хэш, что и в спецификации. Я должен делать что-то не так, но не могу понять, что

std::string nonce = "LKqI6G/AikKCQrN0zqZFlg==";
std::string dt = "2010-09-16T07:50:45Z";
std::string pwd = "userpassword";

{
// result should be tuOSpGlFlIXsozq4HFNeeGeFLEI=
// as per spec. This approach is also used here:
// https://github.com/agsh/onvif/blob/master/lib/cam.js

CryptoPP::Base64Decoder decoder;
decoder.Put((byte*)nonce.data(), nonce.size());
std::vector<uint8_t> bytes(decoder.MaxRetrievable(),0);
decoder.Get(&bytes[0],bytes.size());

//
CryptoPP::SHA1 hash;
byte digest[CryptoPP::SHA1::DIGESTSIZE];
hash.Update(bytes.data(), bytes.size());
hash.Update((const byte*)dt.c_str(), dt.size());
hash.Update((const byte*)pwd.c_str(), pwd.size());
hash.Final(digest);

CryptoPP::Base64Encoder encoder;
encoder.Put(digest, CryptoPP::SHA1::DIGESTSIZE);
std::string hash64(encoder.MaxRetrievable(), 0);
encoder.Get((byte*)hash64.data(), hash64.size());
// generates woEIuU+ryXxcwkTZ9ktbKGeQ
std::cout << hash64 << std::endl;
}

Любые мысли по этому поводу очень ценятся.

[edit: удалить ссылки на C #]

1

Решение

CryptoPP::Base64Decoder decoder;
decoder.Put((byte*)nonce.data(), nonce.size());
std::vector<uint8_t> bytes(decoder.MaxRetrievable(),0);
decoder.Get(&bytes[0],bytes.size());

Вызов MessageEnd:

Base64Decoder decoder;
decoder.Put((byte*)nonce.data(), nonce.size());
decoder.MessageEnd();

vector<uint8_t> bytes(decoder.MaxRetrievable(),0);
decoder.Get(&bytes[0],bytes.size());

То же самое:

Base64Encoder encoder;
encoder.Put(digest, 20);
encoder.MessageEnd();

string hash64(encoder.MaxRetrievable(), 0);
encoder.Get((byte*)hash64.data(), hash64.size());

Также см Base64Encoder | Отсутствующие данные а также Base64Decoder | Отсутствующие данные на Crypto ++ вики.


И действительно, я не могу дублировать результат, используя любые другие подходы, например, полный тестовый стенд C # с использованием всех крипто-ресурсов .NET.

Я не знаю C #, как и Crypto ++, поэтому я не могу помочь с примером C #, который работает, как и ожидалось, с аутентификацией ONVIF.


Вот результат, который я получаю:

$ g++ test.cxx -I. ./libcryptopp.a -o test.exe
$ ./test.exe
tuOSpGlFlIXsozq4HFNeeGeFLEI=

И cat test.cxx:

#include <iostream>
#include <string>
#include <vector>

#include "base64.h"#include "sha.h"
std::string nonce = "LKqI6G/AikKCQrN0zqZFlg==";
std::string dt = "2010-09-16T07:50:45Z";
std::string pwd = "userpassword";

int main(int argc, char* argv[])
{
CryptoPP::Base64Decoder decoder;
decoder.Put((byte*)nonce.data(), nonce.size());
decoder.MessageEnd();
std::vector<uint8_t> bytes(decoder.MaxRetrievable(),0);
decoder.Get(&bytes[0],bytes.size());

CryptoPP::SHA1 hash;
byte digest[CryptoPP::SHA1::DIGESTSIZE];
hash.Update(bytes.data(), bytes.size());
hash.Update((const byte*)dt.c_str(), dt.size());
hash.Update((const byte*)pwd.c_str(), pwd.size());
hash.Final(digest);

CryptoPP::Base64Encoder encoder;
encoder.Put(digest, 20);
encoder.MessageEnd();
std::string hash64(encoder.MaxRetrievable(), 0);
encoder.Get((byte*)hash64.data(), hash64.size());

std::cout << hash64 << std::endl;

return 0;
}
0

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

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

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