Anatoliy
Что с этим делать непойму - lauxlib.h, lua.h, lualib.h в include есть, определение функции luaL_openlib в lauxlib.h есть, но компилятор лупит ошибку,
ставил и
#include <lauxlib.h>
#include <lua.h>
#include <lualib.h>
#include <luaconf.h>
не в extern "C" а просто вместе с остальными include, сразу после
#define LUA_LIB
#define LUA_BUILD_AS_DLL
Все равно таже ошибка, почему же у меня ошибка и вроде все написано правильно и у других (по их заверениям) так все компилится?
Anatoliy
Компилю в MS Visual Studio 2017
Snusmumriken
Давай по умному, содержимое luaopen_Hm512 замени на
{
lua_newtable(L);
lua_pushstring(L, "Hm512");
lua_pushcfunction(L, forLua_Hmacsha512);
lua_rawset(L, -3);
return 1;
}
Тогда оно будет нормально возвращать табличку с функциями, а не засорять глобалспейс.
Snusmumriken
А openlib — менялся в lua5.2, поэтому его там может не быть.
Anatoliy
Да возможно что автор делал с исходниками от луа 5.1 а я взял исходники от луа 5.3
Anatoliy
Snusmumriken
Ошибка линкера ))
Snusmumriken
Проверь настройки проекта
Snusmumriken
Я юзаю 5.1х86, поэтому у меня вот такие вот.
Snusmumriken
Для сборки нужны заголовки и соответствующая lib-а. Ещё время от времени ошибки сыпятся просто так (из-за инкрементальной сборки), поэтому приходится делать ребилд.
Anatoliy
Lua lib'у где взять? Вот тут есть например - https://sourceforge.net/projects/luabinaries/files/5.1.4/Windows%20Libraries/
Только они там почти во всех ссылках разных размеров, значит я так понимаю и сами либы разные, даже если только 32 бит, странно почему так? Какую тогда будет правильно взять?
Snusmumriken
Мм, так тебе 5.1 или 5.3? Потому что для 5.1 я могу подогнать.
Snusmumriken
Это луажыт, если что (5.1.4)
Anatoliy
Snusmumriken
Залинкуй с тем что выдал. Должно быть совместимо.
Anatoliy
lua5.1.lib что отсюда https://sourceforge.net/projects/luabinaries/files/5.1.4/Windows%20Libraries/lua-5.1.4_Win32_dll12_lib.zip/download что отсюда https://sourceforge.net/projects/luabinaries/files/5.1.4/Windows%20Libraries/lua-5.1.4_Win32_vc12_lib.zip/download брал - все равно теже ошибки линковки
Snusmumriken
Ребилд пробовал?
Anatoliy
Ну да, только у меня студия на русском, там "пересобрать"
Anatoliy
Щас все скрины с настройками запостю, может чтото и выяснится
Anatoliy
Snusmumriken
Компоновщик -> ввод — пиши сюда путь до lib'ы.
Snusmumriken
А в C/C++ -> Дополнительные каталоги включаемых файлов — убери. Во-первых, lib-а это не каталог, во-вторых — тут должен быть путь до папки с инклюдами, не lib-ы.
Anatoliy
Anatoliy
Snusmumriken
Anatoliy
Что то у меня поздозрение на хедер hmac.h, внем все эти функции, я его из openssl взял
Snusmumriken
Нет, это опять ошибка линкера. Линкер не смог связать имя функции и какой-то участок бинарного кода из lib-ы.
Anatoliy
Snusmumriken
Карочи, .h-файлы — это разметка бинарных функций внутри lib-ы. Связь через "символы", то есть имена функций.
Snusmumriken
Ты в курсе что тебе нужен ещё или сурц, или lib-а этого hmac?
Snusmumriken
Когда я связывал луа со стимом, я использовал steam_api.lib, предоставленный вальвом, и их же хедеры, чтобы мочь собрать ))
Snusmumriken
Хедеры это только разметка для .lib или .c/.cpp, ничего больше. Сам код — вне их.
Anatoliy
Snusmumriken
Вот именно.
Anatoliy
Вот именно.
Ну сорс в исходниках опенссл есть, либы нету
Snusmumriken
Тогда подгреби сорс.
Anatoliy
Сорс надо просто в проект добавить в проект?
Snusmumriken
Ага, примерно так
Snusmumriken
Хмм, нашёл бы ты в гугле сорц отдельной реализации этой фигни, в одном .h и одном .c файлах.
Snusmumriken
А я хз ))
Anatoliy
Snusmumriken
Можно но вредно, да.
Snusmumriken
Я тут в стимовой либе вообще монстрячу, дописываю методы класса вне файлов этого класса. Но тут это обосновано тем, что класс наполнен колбеками разных категорий, и хотелось бы их поместить поблизости от основных функций тех же категорий.
usernameak
Igor
А ясно - надо поискать hmac.lb от опенссл и тоже прописать его в настройках студии
Уже поздно, наверное, отвечать, ну да ладно, лучше поздно, чем никогда:
У OpenSSL все крипто-функции находятся в libcrypto, так что тебе не hmac.lib нужен, а libcrypto-[версия].lib или что-то подобное. Если тебе влом компилить самому OpenSSL есть прекрасный сайт libs4win.com, я оттуда openssl и zlib тяну при необходимости, довольно удобно. В одном архиве там сразу имеются дебаг-символы, инклуды, статика и всё, что сердце пожелает.
Anatoliy
Уже поздно, наверное, отвечать, ну да ладно, лучше поздно, чем никогда:
У OpenSSL все крипто-функции находятся в libcrypto, так что тебе не hmac.lib нужен, а libcrypto-[версия].lib или что-то подобное. Если тебе влом компилить самому OpenSSL есть прекрасный сайт libs4win.com, я оттуда openssl и zlib тяну при необходимости, довольно удобно. В одном архиве там сразу имеются дебаг-символы, инклуды, статика и всё, что сердце пожелает.
Непоздно, но мне нужно скомпилить именно hmac.c
Igor
Непоздно, но мне нужно скомпилить именно hmac.c
HMAC функции находятся внутри libcrypto, это такая огромная свалка всяких криптографических функций, которая годами набиралась, если тебе нужны только функции HMAC и никакие больше, идёшь в репозиторий openssl, клонируешь его и собираешь из исходников указав скрипту-конфигуратору параметры no-md2, no-md4, no-m5 и все остальные модули, перечисленые в документации по сборке openssl, которые тебе не нужны. Когда конфигуратор завершит работу, запускай компил, далее уже в студии, как Снус написал прописываешь пути до папок ...\openssl\include и ...\openssl\lib, в строку с перечисленными библиотеками добавляешь libcrypto.lib, чтобы ошибок линкера не было (можно в принципе и в коде проекта указать через прагму путь до статической библиотеки, но это вообще нежелательная фигня) и уже компилишь свой проект. И да, не забудь динамическую библиотеку libcrypto-[версия].dll в свой собранный проект скопировть, иначе он не будет знать, откуда тянуть символы и при запуске ошибку выплюнет.
Igor
В принципе можно и не отключать ненужные модули криптографии, но тогда у тебя динамика libcrypto-[версия].dll будет весить порядка 4 мегов
Anatoliy
HMAC функции находятся внутри libcrypto, это такая огромная свалка всяких криптографических функций, которая годами набиралась, если тебе нужны только функции HMAC и никакие больше, идёшь в репозиторий openssl, клонируешь его и собираешь из исходников указав скрипту-конфигуратору параметры no-md2, no-md4, no-m5 и все остальные модули, перечисленые в документации по сборке openssl, которые тебе не нужны. Когда конфигуратор завершит работу, запускай компил, далее уже в студии, как Снус написал прописываешь пути до папок ...\openssl\include и ...\openssl\lib, в строку с перечисленными библиотеками добавляешь libcrypto.lib, чтобы ошибок линкера не было (можно в принципе и в коде проекта указать через прагму путь до статической библиотеки, но это вообще нежелательная фигня) и уже компилишь свой проект. И да, не забудь динамическую библиотеку libcrypto-[версия].dll в свой собранный проект скопировть, иначе он не будет знать, откуда тянуть символы и при запуске ошибку выплюнет.
По той ссылке что ты дал я качнул опенссл вот этот - https://libs4win.com/libopenssl/openssl-1.1.2-dev-msvc2017-x86-debug.zip
там как раз есть сконфигурированный opensslconf.h под винду которого мне нехватало и либы про которые ты говоришь - libcrypto.lib - прописал её в свойствах проекта - теперь ошибок осталось совсем мало, все равно как будто нехватает чего то
Anatoliy
Igor
Подключи инклуд evp
Igor
Он нужен для hmac
Igor
#include <openssl/evp.h>
Igor
Так, стоп, тебе нужно не копировать код модулей openssl себе в проект, а именно подключать его
Igor
Удали из своего проекта файлы hmac.c и hmac.h
Igor
Тебе нужно только инклуды из openssl подключать
Igor
#include <openssl/evp.h>
#include <openssl/hmac.h>
Anatoliy
Подключи инклуд evp
Подключил инклуд evp - непомогло, он в hmac.c непредусмотрен разрабами потому что он уже в другом хедере подключается hmac.c - я же не сам писал, короче раз у тебя есть желание помочь то давай начнем с самого начала, сама по себе компиляция hmac.c непосредственно мне не нужна, я создал код либы dll подключаемой в луа скрипт по образцу - https://quik2dde.ru/viewtopic.php?id=18
Anatoliy
Сам код могу сюда выложить
Igor
Исходники openssl не рассчитаны вообще на то, чтобы находиться вне этого самого openssl
Igor
Тебе внутри проекта твоего hmac.c и hmac.h не нужны
Igor
Они должны быть только в самом openssl
Дмитрий
Anatoliy
Но в итоге нужны потому что одно тянет за собой другое
Igor
У тебя получится 2 динамики на выходе
Дмитрий
кто в школе ща
Igor
libcrypto, и твоя библиотека на Lua, у которой этот самый libcrypto будет в зависимостях
Anatoliy
Вот код:
// Hm512.cpp: определяет экспортированные функции для приложения DLL.
//
#include "stdafx.h"
#include <windows.h>
#include <process.h>
#include <iostream>
#include "hmac_sha512.hpp"
#include <ctime>
#include <cassert>
#include <string>
#include <map>
#define LUA_LIB
#define LUA_BUILD_AS_DLL
extern "C" {
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
#include <luaconf.h>
//#include <compat-5.3.h>
}
//
// Пример простой библиотеки на C++ для вызова ее из LUA
// http://quik2dde.ru/viewtopic.php?id=18
//
// в случае вызова функций из LUA-кода во внешней DLL
// необходимо определить эти константы до подключения заголовочных файлов LUA
BOOL APIENTRY Hm512(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
static int forLua_Hmacsha512(lua_State *L) {
const std::size_t l = 0;
std::string secret = luaL_checklstring(L, 1, l);
std::string params = luaL_checklstring(L, 2, l);
HMAC_SHA512 hmac_sha512(secret, params);
std::string d = hmac_sha512.hex_digest();
lua_pushstring(L, d.c_str());
return(1);
}
static struct luaL_reg ls_lib[] = { { "Hm512", forLua_Hmacsha512 }, { NULL, NULL }};
extern "C" LUALIB_API int luaopen_Hm512(lua_State *L) {
luaL_openlib(L, "Hm512", ls_lib, 0);
return 0;
}
Anatoliy
Эта библиотека принимает в качестве аргумента любую строку и возвращает мне её хэш по алгоритмам Hmac - Sha512
Anatoliy
hmac_sha512.hpp :
#ifndef HMAC_SHA512_HPP
#define HMAC_SHA512_HPP
#include <openssl/hmac.h>
#include <string>
#include <vector>
class HMAC_SHA512 {
public:
HMAC_SHA512(const std::string& key, const std::string& msg) {
HMAC_CTX ctx;
HMAC_CTX_init(&ctx);
// Set HMAC key.
HMAC_Init_ex(&ctx, reinterpret_cast<const unsigned char*>(key.c_str()), key.size(), EVP_sha512(), NULL);
// May be called repeatedly to insert all your data.
HMAC_Update(&ctx, reinterpret_cast<const unsigned char*>(msg.c_str()), msg.size());
// Finish HMAC computation and fetch result.
unsigned char* result = new unsigned char[129];
unsigned int result_len = 129;
HMAC_Final(&ctx, result, &result_len);
for (unsigned int i = 0; i < result_len; i++) {
digest_.push_back(int(result[i]));
}
HMAC_CTX_cleanup(&ctx);
}
std::string hex_digest() {
std::string str;
const char hex_chars[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
for (auto i : digest_) {
const char byte = i;
str.push_back(hex_chars[(byte & 0xF0) >> 4]);
str.push_back(hex_chars[(byte & 0x0F) >> 0]);
}
return str;
}
private:
std::vector<unsigned char> digest_;
};
#endif // HMAC_SHA512_HPP
Hmac_sha512.hpp подключает за собой hmac.h и дальше пошло поехало
Anatoliy
Вообщем я бы мог тебе файлики эти кинуть может у тебя и получится что, а то у меня уже от Сишки крыша поехала, мне проще на луа с нуля все это написать ))))))))
Anatoliy
Anatoliy
Igor
Карочи
Igor
Кинь сразу проект весь