интеграция и примеры на golang

Подскажите, есть интеграция API под golang ?

Re: интеграция и примеры на golang

Добрый день. Наши инструменты не исследовались на совместимость с golang.
С помощью API можно защищать приложения, написанные на нативных языках, а так же DotNet (С/С++/С#, delphi, java). Для защиты необходимо подключить соответствующую библиотеку, в которой описаны функции API.
Расскажите чуть подробнее о golang, умеет ли он работать с подключаемыми библиотеками?

Re: интеграция и примеры на golang

Gogland - компилируемый многопоточный язык программирования, разработанный Google в 2007

Сейчас набирает популярность, как удобный язык для создания в т.ч. сервисов

Загружать библиотеки умеет

syscall.LoadLibrary("kernel32.dll")

синтаксис между С и Delphi

Re: интеграция и примеры на golang

Добрый день. Если вы уже используете наши ключи и набор инструментов Guardant SDK, то рекомендуем попробовать защиту с помощью API из состава Guardant SDK. Все необходимые файлы можно найти в директории установки SDK (%GUARDANT_SDK%\Lib, %GUARDANT_SDK%\Include).
Если ранее вы не пользовались нашими ключами, то у вас есть возможность ознакомиться с новой системой лицензирования - Guardant Station. Продукт Guardant Station включает в себя систему управления лицензиями и набор инструментов для защиты - Guardant SLK, в составе которого вы также найдете файлы для защиты с помощью API (%GUARDANT_SDK%\api).

Re: интеграция и примеры на golang

Добрый день, попробовали реализовать работу с API на языке Go, операции выполняются с результатом 0, но при выполнении GrdFind в pdwID вместо номера ключа тоже 0 и в pFindInfo все значения 0, кроме dwPublicCode, в нём почему-то как раз id ключа, хотя в Delphi он dwID. Можете помочь?

package main

import (
    "log"
    "syscall"
    "unsafe"

    "golang.org/x/sys/windows"
)

type (
    HANDLE        uintptr
    DWORD         uint32
    HWND          HANDLE
    HWINEVENTHOOK HANDLE
    LONG          int32
)

type GrdFindInfo struct {
    dwPublicCode DWORD // Public code }
    byHrwVersion byte  // Dongle hardware version }
    byMaxNetRes  byte  // Maximum Guardant Net license limit }
    wType        DWORD // Dongle type flags }
    dwID         DWORD // Dongle's ID (unique) }
    //{ Following fields are available from UAM mode }
    byNProg     byte  //{ Program number }
    byVer       byte  //{ Version }
    wSN         DWORD //{ Serial number }
    wMask       DWORD //{ Bit mask }
    wGP         DWORD //{ Executions GP counter/ License time counter }
    wRealNetRes DWORD //{ Current Guardant Net license limit, must be <= byMaxNetRes }
    dwIndex     DWORD //{ Index for remote programming }
    //{ Only Stealth III info }
    //abyReservedISEE    array[1..$1C] of BYTE;                      //{ Reserved for future }
    abyReservedISEE []byte //{ Reserved for future }
    wWriteProtectS3 DWORD  //{ Stealth III write protect address }
    wReadProtectS3  DWORD  //{ Stealth III read protect address }
    wGlobalFlags    DWORD  //{ Global Stealth III flags. Reserved. }
    dwDongleState   DWORD  //{ Dongle State. See GrdDSF_XXX definition }
    /*{ Available since: }
      { 1. Stealth Sign.(Firmware number >= 0x01000011h or 01.00.00.11) }
      { 2. Guardant Code. }*/
    dwOldMPNum DWORD

    abyReservedH []byte //{ Reserved. For align to 0x100 [0x100 - 0x1A - 0x1C - 0x0A] }
    /*{ Reserved info from gsA }
      { Driver info }*/
    dwGrDrv_Platform DWORD //{ Driver platform (Win32/Win64) }
    dwGrDrv_Vers     DWORD //{ Driver version (0x04801234=4.80.12.34 }
    dwGrDrv_Build    DWORD //{ Driver build }
    dwGrDrv_Reserved DWORD //{ Reserved }
    //{ dongle info }
    dwRkmUserAddr   DWORD // { wkmUserAddr }
    dwRkmAlgoAddrW  DWORD //{ wkmAlgoAddr }
    dwPrnPort       DWORD //{ Printer port address or 0 if it USB }
    dwClientVersion DWORD //{ Dongle client version }
    //{ SAP start }
    dwRFlags           DWORD //{ Type of MCU }
    dwRProgVer         DWORD //{ Program version (in MCU) }
    dwRcn_rc           DWORD //{ curr_num & answer code }
    dwNcmps            DWORD //{ Number of compare conditions }
    dwNSKClientVersion DWORD //{ Client version (low byte - minor, hi - major) }
    dwModel            DWORD //{ Dongle Model }
    dwMcuType          DWORD //{ Dongle MCU Type }
    dwMemoryType       DWORD //{ Dongle Memory Type }
    //{ Reserved for future }
    abyReserved []byte //{ Reserved. For align to 0x200  [0x200 - 0x100 - 0x34] }
}

func main() {

    new_windows()
}

func new_windows() {
    grd, err := windows.LoadDLL("с:/Guardant/Lib/GrdAPI64.dll")
    if err != nil {
        log.Fatalf("Ошибка загрузки библиотеки GrdAPI64 (%s)", err.Error())
    }

    //**********************************************

    GrdStartup := grd.MustFindProc("GrdStartup")

    r, _, _ := GrdStartup.Call(1, 0, 0)

    log.Println(r)

    //**********************************************

    GrdCreateHandle := grd.MustFindProc("GrdCreateHandle")

    Hend, _, _ := GrdCreateHandle.Call(0, 0, 0)

    //**********************************************

    GrdSetAccessCodes := grd.MustFindProc("GrdSetAccessCodes")

    r, _, _ = GrdSetAccessCodes.Call(Hend, 123456789, 987654321)

    log.Println(r)

    //**********************************************

    GrdSetFindMode := grd.MustFindProc("GrdSetFindMode")
    r, _, _ = GrdSetFindMode.Call(Hend, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)

    log.Println(r)

    //**********************************************

    GrdFind := grd.MustFindProc("GrdFind")
    r, _, _ = GrdFind.Call(Hend, uintptr(unsafe.Pointer(&key)), uintptr(unsafe.Pointer(&st)))

    log.Println(r)
    log.Println(st)
    log.Println(key)

    //******************************************

    GrdLogin := grd.MustFindProc("GrdLogin")

    r, _, _ = GrdLogin.Call(Hend, 0, 0)

    log.Println(r)

    //**********************************************

    log.Println(key)
}

Re: интеграция и примеры на golang

Может, у вас уже имеется обертка на go для работы с ключами?

Re: интеграция и примеры на golang

Добрый день.
Обертки нет, язык Go - нативный. В теории API поддерживает работу с Go, но на практике совместимость не тестировали.
Если API возвращает код 0 и Public код в буфере, это говорит о том, что API сработало корректно. Попробуйте найти значение ID ключа в буфере. Возможно, так удастся понять, что куда сместилось.
Также наши разработчики обратили внимание на некоторые неточности в структуре.

wType        DWORD // Dongle type flags }

должно быть WORD

abyReserved []byte

поле не имеет размера, это может вызывать ошибки.

Просьба еще раз проверить всю структуру.