Files correlati : Ricompilazione Demo : [ ] Commento : Progetti e altra roba per Linux git-svn-id: svn://10.65.10.50/trunk@11293 c028cbd2-c16b-5b4b-a496-9718f37d4682
296 lines
12 KiB
C
Executable File
296 lines
12 KiB
C
Executable File
/****************************************************************************/
|
|
/** **/
|
|
/** Hardlock 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. **/
|
|
/** **/
|
|
/** ///FAST Software Security - Group Aladdin **/
|
|
/** **/
|
|
/** Computer: IBM PC or compatible **/
|
|
/** OS : MS-PC/DOS 2.0 or higher, OS/2, Windows NT **/
|
|
/** Language: 16/32 bit C (TURBO C, MSC, WATCOM) **/
|
|
/** **/
|
|
/** 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.4 1999/12/15 09:52:54 chris
|
|
*** don't print control chars
|
|
***
|
|
***
|
|
*** Revision 1.3 1998/07/13 16:27:57 chris
|
|
*** Added HL_READID call
|
|
***
|
|
*** Revision 1.2 1997/02/14 11:14:28 chris
|
|
*** added LM error messages
|
|
***
|
|
*** Revision 1.1 1996/11/13 20:08:09 chris
|
|
*** Initial revision
|
|
**/
|
|
/****************************************************************************/
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include "hlapi_c.h"
|
|
|
|
/* ------------------------------------------------------------------------ */
|
|
/* Module address of Hardlock test device and RefKey/VerKey. We generated */
|
|
/* the VerifyKey with TESTAPI.EXE. 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};
|
|
|
|
/* ----------------------------------------- */
|
|
/* CryptStr contains the encrypted message : */
|
|
/* "The Answer to the Great Question" */
|
|
/* (only valid for the demo module). */
|
|
/* ----------------------------------------- */
|
|
Byte CryptStr[33] =
|
|
{0x2D, 0xD4, 0x16, 0xA3, 0x19, 0x5C, 0xC2, 0x18,
|
|
0xAB, 0xA3, 0x8C, 0xDC, 0x8E, 0x66, 0xD4, 0xAB,
|
|
0x8F, 0xC0, 0x2F, 0x19, 0x39, 0xBA, 0x76, 0x5C,
|
|
0xE2, 0x06, 0x7C, 0x98, 0xC8, 0xA3, 0x55, 0x24,
|
|
0x00};
|
|
|
|
/****************************************************************************/
|
|
/****************************************************************************/
|
|
/****************************************************************************/
|
|
int main(void)
|
|
{
|
|
char Text[33]; /* Temp. Var. */
|
|
Word n, Reg, Val; /* Counter, Register & Value */
|
|
Word TestOK; /* Return value from subroutines */
|
|
Byte Memory[128]; /* Save old Hardlock RAM & ROM */
|
|
Byte OldMem[128]; /* " " */
|
|
Byte NewRAM[33]; /* New Hardlock RAM */
|
|
Long SerialID = 0; /* Module internal serial ID */
|
|
|
|
printf("\n+---------------+");
|
|
printf("\n| Hardlock Demo |");
|
|
printf("\n+---------------+\n\n");
|
|
|
|
/* ------------------------------------- */
|
|
/* First we need to initialize the API : */
|
|
/* ------------------------------------- */
|
|
TestOK = HL_LOGIN(MODAD, DONT_CARE, RefKey, VerKey);
|
|
if(TestOK != STATUS_OK)
|
|
{
|
|
switch (TestOK)
|
|
{
|
|
case NETWORK_ERROR:
|
|
printf(" Sorry, a network error occured, maybe protocol (IPX/Netbios) not loaded!!\n\n");
|
|
break;
|
|
case NO_DONGLE:
|
|
printf(" Sorry, no Hardlock with this ID found!!\n\n");
|
|
break;
|
|
case VERSION_MISMATCH:
|
|
printf(" Sorry, version mismatch between API and HL-Server or device driver!!\n\n");
|
|
break;
|
|
case TOO_MANY_USERS:
|
|
printf(" Sorry, too many logins to HL-Server. Login table full!!\n\n");
|
|
break;
|
|
case CANNOT_OPEN_DRIVER:
|
|
printf(" Sorry, cannot open driver, maybe Hardlock driver not installed!!\n\n");
|
|
break;
|
|
case INVALID_ENV:
|
|
printf(" Sorry, invalid environment search string!! (HL_SEARCH)\n\n");
|
|
break;
|
|
case INVALID_LIC:
|
|
printf(" Sorry, no valid licence memory image found!! (LM)\n\n");
|
|
break;
|
|
case NO_LICENSE:
|
|
printf(" Sorry, no licence information for the requested slot!! (LM)\n\n");
|
|
break;
|
|
default:
|
|
printf(" Sorry, an unexpected error occured!! ERROR: %d\n\n", TestOK);
|
|
break;
|
|
}
|
|
return (TestOK);
|
|
}
|
|
printf("\n Hardlock with Module address\t\t: %d\n", MODAD);
|
|
|
|
/* ---------------------------- */
|
|
/* Get the API version number : */
|
|
/* ---------------------------- */
|
|
printf(" The API version is\t\t\t: %d\n",HL_VERSION());
|
|
|
|
/* ----------------------------------------------------- */
|
|
/* Looking for the Hardlock with the expected coding. */
|
|
/* ----------------------------------------------------- */
|
|
if(HL_AVAIL() == STATUS_OK)
|
|
printf(" The connected Hardlock is\t\t: Test device\n");
|
|
else
|
|
printf(" The connected Hardlock is\t\t: Not the test device\n");
|
|
|
|
/* ------------------------------------------------------------ */
|
|
/* Now we can get some informations about the connected module. */
|
|
/* ------------------------------------------------------------ */
|
|
TestOK = HL_ACCINF();
|
|
switch (TestOK)
|
|
{
|
|
case LOCAL_DEVICE:
|
|
printf(" The Hardlock access is\t\t\t: Local\n");
|
|
printf(" Connected to the local port address\t: 0x%03X\n", HL_PORTINF());
|
|
break;
|
|
case NET_DEVICE:
|
|
printf(" The Hardlock access is\t\t\t: Remote\n");
|
|
printf(" The HL-Server version is\t\t: %d\n", HL_HLSVERS());
|
|
printf(" Connected to the remote port address\t: 0x%03X\n", HL_PORTINF());
|
|
printf(" Number of users logged in HL-Server is\t: %d\n", HL_USERINF());
|
|
printf(" The max. number of HL-Server logins is\t: %d\n", HL_MAXUSER());
|
|
break;
|
|
default:
|
|
printf(" The Hardlock access is\t\t: No access\n");
|
|
break;
|
|
}
|
|
|
|
/* ------------------------------------------------------ */
|
|
/* Read the internal serial number of Hardlock USB Module */
|
|
/* ------------------------------------------------------ */
|
|
TestOK = HL_READID((Word *)&SerialID, ((Word *)&SerialID)+1);
|
|
switch (TestOK)
|
|
{
|
|
case STATUS_OK:
|
|
printf(" The serial number ID is\t\t: %lu (0x%08lX)\n", SerialID, SerialID);
|
|
break;
|
|
case NO_SERIALID:
|
|
printf(" The serial number ID is\t\t: not available for this Key\n");
|
|
break;
|
|
default:
|
|
printf(" Cannot determine serial ID, API error:\t: %i\n", TestOK);
|
|
}
|
|
|
|
/* ------------------------------------------------------ */
|
|
/* Now we decrypt the message from CryptStr. Maybe we use */
|
|
/* the message in our application. */
|
|
/* ------------------------------------------------------ */
|
|
printf("\n The encrypted message is\t\t: ");
|
|
for (n = 0; n < 32; n++)
|
|
printf("%c",(CryptStr[n] < 32 || CryptStr[n] > 126) ? '.' : CryptStr[n]);
|
|
|
|
TestOK = HL_AVAIL();
|
|
|
|
if (TestOK == STATUS_OK)
|
|
TestOK = HL_CODE(CryptStr, 4);
|
|
if(TestOK == STATUS_OK)
|
|
{
|
|
/* ------------------------------------------------- */
|
|
/* HL_CODE returned 0, CryptStr should be decrypted. */
|
|
/* ------------------------------------------------- */
|
|
printf("\n The decrypted message is\t\t: ");
|
|
for (n = 0; n < 32; n++)
|
|
printf("%c",(CryptStr[n] < 32 || CryptStr[n] > 126) ? '.' : CryptStr[n]);
|
|
|
|
HL_CODE(CryptStr, 4);
|
|
printf("\n Encrypted again\t\t\t: ");
|
|
for (n = 0; n < 32; n++)
|
|
printf("%c",(CryptStr[n] < 32 || CryptStr[n] > 126) ? '.' : CryptStr[n]);
|
|
}
|
|
else
|
|
/* ----------------------------------------------------------------------*/
|
|
/* HL_CODE returned an other value, maybe someone removed the Hardlock ? */
|
|
/* ----------------------------------------------------------------------*/
|
|
printf("\n Sorry, the decryption has failed!");
|
|
|
|
/* ---------------------------------------------------- */
|
|
/* We're looking for the memory option of the Hardlock. */
|
|
/* ---------------------------------------------------- */
|
|
TestOK = HL_MEMINF();
|
|
if(TestOK == STATUS_OK)
|
|
{
|
|
printf("\n\n Hardlock with memory\t\t\t: Yes\n");
|
|
|
|
/* ------------------------------------------------------- */
|
|
/* Now we can work with the memory. Let's read the string */
|
|
/* written in register 48 to 63. */
|
|
/* ------------------------------------------------------- */
|
|
for(n = 0, Reg = 48; Reg < 64; Reg++)
|
|
{
|
|
/* -------------------------------------------------------- */
|
|
/* The memory is organized as 16 bit registers, so we have */
|
|
/* to perform a typecasting. */
|
|
/* -------------------------------------------------------- */
|
|
HL_READ(Reg, &Val);
|
|
Text[n++] = (char) (Val >> 8);
|
|
Text[n++] = (char) (Val & 255);
|
|
}
|
|
/* ---------------------------------- */
|
|
/* We terminate the string with 0 ... */
|
|
/* ---------------------------------- */
|
|
Text[n] = '\0';
|
|
|
|
/* ----------------- */
|
|
/* ... and print it. */
|
|
/* ----------------- */
|
|
printf(" Read all registers of RAM area (Intel)\t: [");
|
|
for (n = 0; n < 32; n++)
|
|
printf("%c", ((unsigned char) Text[n] < 32 || (unsigned char) Text[n] > 126) ? '.' : Text[n]);
|
|
printf("]\n\n");
|
|
|
|
/* ------------------------------------*/
|
|
/* Read RAM & ROM memory in one block. */
|
|
/* ------------------------------------*/
|
|
TestOK = HL_READBL(Memory);
|
|
if (TestOK == STATUS_OK)
|
|
{
|
|
printf(" Read whole memory in one block\t\t: [");
|
|
for (n = 0; n < 4; n++)
|
|
{
|
|
if (n > 0)
|
|
printf(" \t\t\t\t\t [");
|
|
for (Reg = 32 * n; Reg < (32 + 32 * n); Reg++)
|
|
printf("%c",(Memory[Reg] < 32 || Memory[Reg] > 126) ? '.' : Memory[Reg]);
|
|
if (n < 3)
|
|
printf("]ROM\n");
|
|
else
|
|
printf("]RAM\n");
|
|
}
|
|
}
|
|
else
|
|
printf(" Read whole memory in one block\t\t: Failed\n");
|
|
|
|
/* ---------------------------------------- */
|
|
/* Write new RAM area (no error handling) : */
|
|
/* ---------------------------------------- */
|
|
strncpy((char *) NewRAM,"This is the new RAM contents !!!",32);
|
|
printf(" Write new Hardlock RAM data (save old) : ");
|
|
for (n = 0; n < 32; n++)
|
|
printf("%c", (NewRAM[n] < 32 || NewRAM[n] > 128) ? '.' : NewRAM[n] );
|
|
printf("\n");
|
|
HL_READBL(OldMem);
|
|
HL_WRITEBL(NewRAM);
|
|
printf(" Read contents of RAM area \t\t: [");
|
|
HL_READBL(Memory);
|
|
for (n = 0; n <= 32; n++)
|
|
NewRAM[n] = Memory[96 + n];
|
|
for (n = 0; n < 32; n++)
|
|
printf("%c", (NewRAM[n] < 32 || NewRAM[n] > 128) ? '.' : NewRAM[n] );
|
|
printf("]\n\n");
|
|
for (n = 0; n <= 32; n++)
|
|
NewRAM[n] = OldMem[96 + n];
|
|
HL_WRITEBL(NewRAM);
|
|
}
|
|
else
|
|
printf("\n\n Hardlock with memory\t\t: No\n\n");
|
|
|
|
/* ---------------------------------------------- */
|
|
/* At last we have to release the API structure. */
|
|
/* ---------------------------------------------- */
|
|
return (HL_LOGOUT());
|
|
}
|