(2022-10-14 12:05:08 отредактировано kortovea)

Необходимость передачи Private Read кода для процедуры check в SLK

Здравствуйте, пытаюсь защитить приложение на java через SLK и Guardant Licensing API 3.3.0 (в 3.5.0 кажется такое же поведение)
Пока проверяю с программным демо ключом.

Как я понимаю стандартный сценарий проверки лицензий - feature.login -> feature.check -> feature.logout.

При вызове метода Check на объекте grdlic.Feature я вижу ошибку "Error code: 2. Запрошенный компонент (Feature) не найден", если при login я передаю GrdVendorCodes содержания (1368487351,0,0) (publicCode, privateReadCode, privateWriteCode).

Если я передам при login (1368487351, 1368487493,0), то check отработает успешно.

Хочется узнать, для check действительно нужен privateReadCode или я делаю что-то не так? Просто кажется странным, что для стандартного сценария проверки лицензии нужно обязательно в приложении указывать privateReadCode, который должен храниться в тайне от третьих лиц. И такое же поведение ожидается для аппаратных ключей?

Если же privateReadCode не нужен, я не смогу указать null, т.к в объекте GrdVendorCodes поля - примитивы и я обязан передать значение, тот же "0".

(2022-11-09 17:02:51 отредактировано Тимофей Ершов)

Re: Необходимость передачи Private Read кода для процедуры check в SLK

Добрый день.
Для feature.check действительно нужен privateReadCode, как и для большинства функций, использующихся после Login. Однако, read код не является секретной информацией, не критично, если он попадает в руки третьих лиц.
Если вы планируете пользоваться элементами памяти, то они поддерживают работу с уникальными паролями, так что и в этом случае код на чтение роли в безопасности защищенного приложения не играет.

Re: Необходимость передачи Private Read кода для процедуры check в SLK

Тимофей, ваш ответ понятен, спасибо, просто смущает, что у вас на самой странице по кодам доступа https://dev.guardant.ru/pages/viewpage. … d=71476493 указано "Все боевые коды доступа, кроме Public, должны храниться в тайне от третьих лиц." , собственно в том числе и из-за этой строки задал в этой теме вопрос.

Re: Необходимость передачи Private Read кода для процедуры check в SLK

kortovea пишет:

Тимофей, ваш ответ понятен, спасибо, просто смущает, что у вас на самой странице по кодам доступа https://dev.guardant.ru/pages/viewpage. … d=71476493 указано "Все боевые коды доступа, кроме Public, должны храниться в тайне от третьих лиц." , собственно в том числе и из-за этой строки задал в этой теме вопрос.

Добрый день.
Действительно, лишний раз коды доступа афишировать не следует. Однако, механизмы защиты, используемые в наших инструментах, не базируются только на кодах доступа.

Re: Необходимость передачи Private Read кода для процедуры check в SLK

Скопировал библиотеку в домашний каталог, пробую запустить пример:

gcc demo.c -o demo -I~/Guardant/SDK7/Include -L~/Guardant/SDK7/Lib/linux/x86_64 -lgrdapi -lpthread
demo.c:15:20: fatal error: grdapi.h: Нет такого файла или каталога

                    ^
compilation terminated.

В итоге ошибка компиляции. В файле примера пробовал изменять в строке include угловые скобочки на кавычки (там где объявлен файл grdapi.h), но результат тотже

Re: Необходимость передачи Private Read кода для процедуры check в SLK

Как правильно нужно устанавливать библиотеку под Linux для ведения разработки? Или для сборки примера?

(2025-02-03 10:27:57 отредактировано zuykov)

Re: Необходимость передачи Private Read кода для процедуры check в SLK

Проблема компиляции решилась, нужно указывать полный путь.

В итоге смог скомпилировать. Библиотека лежит в домашнем каталоге, папка Guardant

gcc demo.c -o demo -I/home/user_name/Guardant/SDK7/Include/ -L/home/user_name/Guardant/SDK7/Lib/linux/x86_64 -lgrdapi -lpthread

Но при запуске бинарника возникает ошибка:

$ ./demo
./demo: error while loading shared libraries: libgrdapi.so: cannot open shared object file: No such file or directory

Вопрос о том как правильно устанавливать в Linux библиотеку Guardant актуален

(2025-02-03 11:00:54 отредактировано zuykov)

Re: Необходимость передачи Private Read кода для процедуры check в SLK

Добавил в файл "~/.bashrc"  указание расположения библиотеки в переменную

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/user_name/Guardant/SDK7/Lib/linux/x86_64

В итоге  пример заработал на виртуалке и нашел ключ. Буду пробовать пример на C++

Re: Необходимость передачи Private Read кода для процедуры check в SLK

При попытке запуска примера на C++ возникают ошибки:

src$ g++ demo.cpp -o demo -I/home/user_name/Guardant/SDK7/Include/ -L/home/user_name/Guardant/SDK7/Lib/linux/x86_64 -lgrdapi -lpthread
/tmp/ccUnxSBT.o: In function `CGrdDongle::DoStartup() const':
demo.cpp:(.text._ZNK10CGrdDongle9DoStartupEv[_ZNK10CGrdDongle9DoStartupEv]+0x15): undefined reference to `CGrdMutex::CGrdMutex()'
demo.cpp:(.text._ZNK10CGrdDongle9DoStartupEv[_ZNK10CGrdDongle9DoStartupEv]+0x1c): undefined reference to `CGrdDongle::m_bGrdDongleStartup'
demo.cpp:(.text._ZNK10CGrdDongle9DoStartupEv[_ZNK10CGrdDongle9DoStartupEv]+0x6c): undefined reference to `CGrdDongle::m_bGrdDongleStartup'
demo.cpp:(.text._ZNK10CGrdDongle9DoStartupEv[_ZNK10CGrdDongle9DoStartupEv]+0x7e): undefined reference to `CGrdMutex::~CGrdMutex()'
demo.cpp:(.text._ZNK10CGrdDongle9DoStartupEv[_ZNK10CGrdDongle9DoStartupEv]+0x91): undefined reference to `CGrdMutex::~CGrdMutex()'
/tmp/ccUnxSBT.o: In function `CGrdDongle::DoCleanup() const':
demo.cpp:(.text._ZNK10CGrdDongle9DoCleanupEv[_ZNK10CGrdDongle9DoCleanupEv]+0x15): undefined reference to `CGrdMutex::CGrdMutex()'
demo.cpp:(.text._ZNK10CGrdDongle9DoCleanupEv[_ZNK10CGrdDongle9DoCleanupEv]+0x1b): undefined reference to `CGrdDongle::m_lGrdDongleClassCounter'
demo.cpp:(.text._ZNK10CGrdDongle9DoCleanupEv[_ZNK10CGrdDongle9DoCleanupEv]+0x24): undefined reference to `CGrdDongle::m_lGrdDongleClassCounter'
demo.cpp:(.text._ZNK10CGrdDongle9DoCleanupEv[_ZNK10CGrdDongle9DoCleanupEv]+0x2a): undefined reference to `CGrdDongle::m_lGrdDongleClassCounter'
demo.cpp:(.text._ZNK10CGrdDongle9DoCleanupEv[_ZNK10CGrdDongle9DoCleanupEv]+0x35): undefined reference to `CGrdDongle::m_bGrdDongleStartup'
demo.cpp:(.text._ZNK10CGrdDongle9DoCleanupEv[_ZNK10CGrdDongle9DoCleanupEv]+0x54): undefined reference to `CGrdDongle::m_bGrdDongleStartup'
demo.cpp:(.text._ZNK10CGrdDongle9DoCleanupEv[_ZNK10CGrdDongle9DoCleanupEv]+0x61): undefined reference to `CGrdMutex::~CGrdMutex()'
demo.cpp:(.text._ZNK10CGrdDongle9DoCleanupEv[_ZNK10CGrdDongle9DoCleanupEv]+0x72): undefined reference to `CGrdMutex::~CGrdMutex()'
/tmp/ccUnxSBT.o: In function `CGrdDongle::CGrdDongle(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool)':
demo.cpp:(.text._ZN10CGrdDongleC2EjjjjjjjjjjjRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb[_ZN10CGrdDongleC5EjjjjjjjjjjjRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb]+0x10e): undefined reference to `CGrdMutex::CGrdMutex()'
demo.cpp:(.text._ZN10CGrdDongleC2EjjjjjjjjjjjRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb[_ZN10CGrdDongleC5EjjjjjjjjjjjRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb]+0x114): undefined reference to `CGrdDongle::m_lGrdDongleClassCounter'
demo.cpp:(.text._ZN10CGrdDongleC2EjjjjjjjjjjjRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb[_ZN10CGrdDongleC5EjjjjjjjjjjjRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb]+0x11d): undefined reference to `CGrdDongle::m_lGrdDongleClassCounter'
demo.cpp:(.text._ZN10CGrdDongleC2EjjjjjjjjjjjRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb[_ZN10CGrdDongleC5EjjjjjjjjjjjRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb]+0x129): undefined reference to `CGrdMutex::~CGrdMutex()'
collect2: error: ld returned 1 exit status

Вопрос, должен ли выполняться пример для c++ под Linux? Что еще нужно сделать?

Re: Необходимость передачи Private Read кода для процедуры check в SLK

Добрый день, zuykov.
Для простоты компиляции можно скопировать файлы библиотеки, заголовочного файла и исходного кода в одну папку, тогда при компиляции не будет проблем с поиском путей к нужным файлам. Это не единственное решение. Ваш способ так же походит для решения этой проблемы.
Для решения проблемы при запуске также можно добавить файл библиотеки (или ссылку на нее) в директории /usr/lib и /usr/lib64.

zuykov пишет:

Вопрос, должен ли выполняться пример для c++ под Linux? Что еще нужно сделать?

Да, пример должен корректно работать в Lilnux.

Для компиляции кроме кода с примером потребуется еще и  grddongle.cpp

g++ demo.cpp grddongle.cpp -o demo -I./ -L./ -lgrdapi -lpthread

В некоторых случаях могут потребоваться дополнительные аргументы  -ldl -lrt