#c #oauth #openssl #hmacsha1
Вопрос:
Я пытаюсь реализовать проверку oauth 1.0 в C в рамках интеграции LTI. Я пытаюсь проверить свою реализацию на основе примера, приведенного в спецификации. Мой код создает правильную базовую строку подписи (находится в нижней части этого раздела).:
POSTamp;http://example.com/requestamp;a2=r%20b&a3=2%20q&a3=a&b5=%3D%253D&c%40=&c2=&oauth_consumer_key=9djdj82h48djs9d2&oauth_nonce=7d8f3e4a&oauth_signature_method=HMAC-SHA1&oauth_timestamp=137131201&oauth_token=kkk9d7dh3k39sjv7
Пока все идет хорошо. «Самое сложное сделано», — подумал я, но оказалось, что я действовал слишком быстро. Насколько я могу судить, проблемной частью является вычисление hmac_sha1. В разделе 3.1 спецификации секрет клиента и секрет токена считаются j49sk3j29djd
и dh893hdasih9
, соответственно. В разделе 3.4.2 хэш вычисляется по указанной выше базовой строке подписи с использованием ключа, состоящего из секрета клиента с кодировкой в процентах, символа амперсанда amp;
и секрета токена с кодировкой в процентах , все они объединены. Поскольку секреты не содержат специальных символов, я заключаю, что hmac_sha1
они должны вызываться с помощью ключа j49sk3j29djdamp;dh893hdasih9
. Я использую следующую однострочную строку (на основе openssl) для вычисления контрольной суммы:
string hmac_sha1(string constamp; text, string constamp; secret) {
return string((char*)HMAC(EVP_sha1(), (unsigned char const*)secret.c_str(), secret.size(), (unsigned char const*)text.c_str(), text.size(), nullptr, nullptr), 20);
}
Эту функцию я проверил с помощью тестовых примеров отсюда. Зовущий
hmac_sha1(base, "j49sk3j29djdamp;dh893hdasih9")
результаты в
r6/TJjbCOr97/ UU0NsvSne7s5g= (base64 encoded)
в то время как спецификация говорит, что это должно быть
bYT5CMsGcbgUdFHObYMEfcx6bsw= (base64 encoded)
Поскольку hmac_sha1
и базовая строка подписи проверены, кажется, что ключ должен быть неправильным — или моя логика. Но как? Я упираюсь в стену, пытаясь отладить эту простую вещь. Любая помощь будет высоко оценена!