/****************************************************************************/ /** **/ /** Hardlock RUS Demo Program **/ /** **/ /** This demo program is based on the Hardlock application interface, **/ /** called API, to access a Hardlock via a local or a remote port. **/ /** To access the Hardlock remote, HL-Server must be installed first. **/ /** **/ /** Aladdin Knowledge Systems, Germany **/ /** **/ /** Note **/ /** ---- **/ /** The following demo program is not meant to represent a real good **/ /** implementation of software protection into your application. It **/ /** demonstrates the basic use of the Hardlock API functions and is **/ /** thus as short and simple as possible. Please read the manual **/ /** carefully to get an insight in the strategy of the implementation. **/ /** Please keep in mind that there is no general solution for a good **/ /** protection. We provide you with the necessary functions, the **/ /** implementation itself is up to you and your imagination. **/ /** **/ /** Revision history **/ /** ---------------- *** $Log: not supported by cvs2svn $ *** Revision 1.3 2000/02/03 16:42:13 chris *** adapted to new error message routine (HL_ERRMSG) *** *** *** Revision 1.2 1999/10/13 16:28:54 chris *** fixed printf argument *** *** Revision 1.1 1999/10/13 16:14:30 chris *** Initial revision **/ /****************************************************************************/ #include #include #include "hlapi_c.h" #include "demo.h" /* ------------------------------------------------------------------------ */ /* Module address of Hardlock test device and RefKey/VerKey. We generated */ /* the VerifyKey with Latteccino. The API use the keys to identify the */ /* Hardlock with the correct encoding. */ /* The keys defined here are only valid for the demo module. */ /* You have to change module address AND VerKey for your specific Hardlock! */ /* ------------------------------------------------------------------------ */ #define MODAD 29809 Byte RefKey[8] = {'H','A','R','D','L','O','C','K'}; Byte VerKey[8] = {0x18,0x4C,0x97,0xF0,0xC0,0x7A,0x08,0x88}; /****************************************************************************/ /****************************************************************************/ /****************************************************************************/ int main(void) { Word res; /* Return value from subroutines */ Long SlotCnt = 0; Long MaxUser = 0; Long CurrentUser = 0; Long MaxCounter = 0; Long CurrentCounter = 0; Long ID = 0; Word Year, Month, Day; printf("\n+-------------------------+"); printf("\n| Hardlock RUS Query Test |"); printf("\n+-------------------------+\n"); /* ------------------------------------- */ /* First we need to initialize the API : */ /* ------------------------------------- */ res = HLM_LOGIN(MODAD, DONT_CARE, RefKey, VerKey, svk, 0, 0); if(res != STATUS_OK) { printf(" Login: %s\n", HL_ERRMSG(res, 0, NULL, NULL)); return (res); } printf("\n RUS Hardlock with Module address: %d\n", MODAD); res = HL_ACCINF(); switch (res) { case LOCAL_DEVICE: printf(" The Hardlock access is\t\t : Local\n"); break; case NET_DEVICE: printf(" The Hardlock access is\t\t : Remote\n"); break; default: printf(" The Hardlock access is\t\t : No access\n"); break; } /* Check for a RUS Hardlock and display the RUS ID: */ /* ------------------------------------------------ */ printf("\n"); printf(" Checking global data\n"); printf(" ====================\n"); res = HLM_ISRUSHL(&ID); if (res == STATUS_OK) printf(" RUS ID : %lu (0x%lx)\n", ID, ID); else printf(" RUS ID : %s\n", HL_ERRMSG(res, 0, NULL, NULL)); /* Now read the global expiration date: */ /* ------------------------------------ */ res = HLM_CHECKEXPDATE(0, &Year, &Month, &Day); if (res == STATUS_OK || res == RUS_DATE_EXPIRED) { printf(" ExpDate : Day:%d Month:%d Year:%d", Day, Month, Year); if (res == RUS_DATE_EXPIRED) printf(" (Expired)\n"); else printf("\n"); } else printf(" ExpDate : %s\n", HL_ERRMSG(res, 0, NULL, NULL)); /* Check the counter but don't increment it: */ /* ----------------------------------------- */ res = HLM_CHECKCOUNTER(0, &MaxCounter, &CurrentCounter); if (res == STATUS_OK) { printf(" MaxCounter : %ld\n", MaxCounter); printf(" CurCounter : %ld\n", CurrentCounter); } else printf(" Counter : %s\n", HL_ERRMSG(res, 0, NULL, NULL)); /* Retrieve the slot data and try a ocuppy and free: */ /* ------------------------------------------------- */ printf("\n Now Checking slot 1 to 4:\n"); for (SlotCnt = 1; SlotCnt < 5; SlotCnt++) { printf("\n"); printf(" Checking slot #%ld\n", SlotCnt); printf(" =================\n"); res = HLM_OCCUPYSLOT(SlotCnt); if (res == STATUS_OK) printf(" Occupy : OK\n"); else printf(" Occupy : %s\n", HL_ERRMSG(res, 0, NULL, NULL)); res = HLM_CHECKSLOT(SlotCnt, &MaxUser, &CurrentUser); if (res == STATUS_OK) { printf(" MaxUser : %ld\n", MaxUser); printf(" CurUser : %ld\n", CurrentUser); } else printf(" User Count : %s\n", HL_ERRMSG(res, 0, NULL, NULL)); res = HLM_CHECKEXPDATE(SlotCnt, &Year, &Month, &Day); if (res == STATUS_OK || res == RUS_DATE_EXPIRED) { printf(" ExpDate : Day:%d Month:%d Year:%d", Day, Month, Year); if (res == RUS_DATE_EXPIRED) printf(" (Expired)\n"); else printf("\n"); } else printf(" ExpDate : %s\n", HL_ERRMSG(res, 0, NULL, NULL)); res = HLM_FREESLOT(SlotCnt); if (res == STATUS_OK) printf(" Free : OK\n"); else printf(" Free : %s\n", HL_ERRMSG(res, 0, NULL, NULL)); } /* ---------------------------------------------- */ /* At last we have to release the API structure. */ /* ---------------------------------------------- */ return (HL_LOGOUT()); }