1043 lines
27 KiB
C++
1043 lines
27 KiB
C++
#include "proboard.hpp"
|
|
|
|
|
|
//**************************************************************************
|
|
//
|
|
// TELEGRAFIX CONFIDENTIAL
|
|
// PROTECTED TRADE SECRETS
|
|
//
|
|
// The contents of this file are confidential materials of TeleGrafix
|
|
// Communications, Inc. Use of this information is subject to the terms and
|
|
// conditions set forth in the TeleGrafix software source code licensing
|
|
// contract.
|
|
//
|
|
//**************************************************************************
|
|
|
|
//##########################################################################
|
|
//
|
|
// Module file: SERIALIZ.C
|
|
//
|
|
// Last modified: 12/11/94 (Jeff Reeder)
|
|
// Author(s): Jeff Reeder - 12/11/94
|
|
//
|
|
// -------------------------------------------------------------------------
|
|
//
|
|
// Copyright (c) 1992-95 TeleGrafix Communications, Inc.
|
|
// All Rights Reserved
|
|
//
|
|
// -------------------------------------------------------------------------
|
|
//
|
|
// REVISION HISTORY INFORMATION
|
|
//
|
|
// Version Date Description
|
|
// ------------------------------------------------------------------
|
|
//
|
|
//
|
|
//##########################################################################
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <ctype.h>
|
|
#include <string.h>
|
|
|
|
#include <dos.h>
|
|
#include <time.h>
|
|
#include <bios.h>
|
|
|
|
//--------------------------------------------------------------------------
|
|
|
|
#define UNREG_STRING "(Unregistered copy)"
|
|
|
|
#define SERIAL_NUMBER_LENGTH 17
|
|
|
|
|
|
#define USERNAME_LEN 31
|
|
#define DEFAULT_REGNAME "Name of Registered Owner here!"
|
|
|
|
#define SERIAL_NUM_LEN 17
|
|
#define DEFAULT_SERIALNO "<SERIAL NUMBER!>"
|
|
|
|
#define SYSTEM_CODE_LEN 13
|
|
#define DEFAULT_SYSTEM_CODE "TELEGRAFIX\0\0"
|
|
|
|
|
|
|
|
//---------------------
|
|
// Product Code defines
|
|
//---------------------
|
|
|
|
#define PROBOARD_BBS "PB"
|
|
#define PROBOARD_BBS_NAME "ProBoard BBS"
|
|
|
|
|
|
//-----------------
|
|
// Platform defines
|
|
//-----------------
|
|
|
|
#define PLATFORM_DOS 'D'
|
|
#define PLATFORM_DOS_NAME "MS-DOS"
|
|
|
|
|
|
//---------------
|
|
// Origin defines
|
|
//---------------
|
|
|
|
#define ORIGIN_TELEGRFX '0'
|
|
#define ORIGIN_TELEGRFX_NAME "TeleGrafix Corporate HQ"
|
|
|
|
#define ORIGIN_TELEGRFX_COMP '1'
|
|
#define ORIGIN_TELEGRFX_NAME_COMP "Free Upgrades"
|
|
|
|
#define ORIGIN_TELEGRFX_GIF '2'
|
|
#define ORIGIN_TELEGRFX_NAME_GIF "GIF edition"
|
|
|
|
|
|
//-------------
|
|
// Misc defines
|
|
//-------------
|
|
|
|
#define BASE_36 36 // Meganums are base 36
|
|
#define START_YEAR 1992 // The year TeleGrafix began
|
|
#define MAX_SN_COUNTER 1285 // 1295 is ZZ in meganums, set to 1285 to prevent duplicate serial numbers (says Jeff)
|
|
#define MAX_SN_YEARS 35 // Seconds / 2
|
|
#define MAX_SN_MONTHS 11 // Seconds / 2
|
|
#define MAX_SN_DAYS 31 // Number of 2
|
|
#define MAX_SN_HOURS 23 // Seconds / 2
|
|
#define MAX_SN_MINS 29 // Minutes / 2
|
|
#define MAX_SN_SECS 29 // Seconds / 2
|
|
|
|
#define MAX_SN_LENGTH 16 // Maximum length of a serial number
|
|
|
|
|
|
static char regname_buf [ USERNAME_LEN ] = DEFAULT_REGNAME;
|
|
static char serial_buf [ SERIAL_NUM_LEN ] = DEFAULT_SERIALNO;
|
|
static char system_code_buf[ SYSTEM_CODE_LEN ] = DEFAULT_SYSTEM_CODE;
|
|
|
|
|
|
|
|
enum regResults
|
|
{
|
|
registrationNone = 0, // Software is not registered
|
|
registrationBad, // Illegal registration information
|
|
registrationGood, // Software is fully registered
|
|
};
|
|
|
|
|
|
|
|
static
|
|
word crc_table_16[ 256 ] =
|
|
{
|
|
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
|
|
0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
|
|
0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
|
|
0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
|
|
0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
|
|
0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
|
|
0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
|
|
0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
|
|
0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
|
|
0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
|
|
0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
|
|
0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
|
|
0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
|
|
0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
|
|
0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
|
|
0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
|
|
0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
|
|
0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
|
|
0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
|
|
0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
|
|
0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
|
|
0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
|
|
0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
|
|
0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
|
|
0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
|
|
0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
|
|
0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
|
|
0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
|
|
0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
|
|
0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
|
|
0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
|
|
0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
|
|
};
|
|
|
|
|
|
|
|
static
|
|
word makeCRC16( word count,
|
|
word crc,
|
|
byte *buffer )
|
|
{
|
|
byte *p = buffer;
|
|
|
|
|
|
while ( count-- != 0 )
|
|
{
|
|
crc = word( ( crc << 8 ) ^ crc_table_16[ ( crc >> 8 ) ^ *p++ ] );
|
|
}
|
|
|
|
return crc;
|
|
}
|
|
|
|
|
|
|
|
byte *decryptData( byte *buf,
|
|
short len,
|
|
byte key )
|
|
{
|
|
short i;
|
|
byte c;
|
|
byte shift = 0;
|
|
byte iPrime;
|
|
byte nKey;
|
|
|
|
(void) shift;
|
|
|
|
iPrime = 0x17;
|
|
nKey = ( byte ) ~key;
|
|
|
|
|
|
for ( i = 0; i < len; i++, key++, iPrime++, nKey++ )
|
|
{
|
|
c = ( buf[ i ] ^ nKey ) ^ iPrime; // Get encrypted char
|
|
|
|
|
|
//--------------------------------------------------------------
|
|
// Now let's do the bit shifting (rolling) to the left. We used
|
|
// to do this in a loop, but doing it this way avoids the loop
|
|
// overhead and speeds things up at the cost of slightly larger
|
|
// code size.
|
|
//--------------------------------------------------------------
|
|
|
|
shift = ( byte ) ( i & 0x07 );
|
|
|
|
|
|
if ( shift != 0 )
|
|
{
|
|
c = ( byte ) ( ( c << shift ) |
|
|
( c >> ( 8 - shift ) ) );
|
|
}
|
|
|
|
|
|
//-----------------------------------
|
|
// Now let's perform the bit swapping
|
|
//-----------------------------------
|
|
|
|
c = ( byte ) ~( ( c >> 7 ) |
|
|
( c << 7 ) |
|
|
( ( c & 0x40 ) >> 5 ) |
|
|
( ( c & 0x02 ) << 5 ) |
|
|
( ( c & 0x20 ) >> 3 ) |
|
|
( ( c & 0x04 ) << 3 ) |
|
|
( ( c & 0x10 ) >> 1 ) |
|
|
( ( c & 0x08 ) << 1 ) );
|
|
|
|
|
|
buf[ i ] = ( byte ) ( ( c ^ key ) ^ 0x49 ); // Store real char in buf
|
|
}
|
|
|
|
|
|
return( buf );
|
|
}
|
|
|
|
|
|
|
|
static
|
|
byte *encryptData( byte *buf,
|
|
short len,
|
|
byte key )
|
|
{
|
|
short i;
|
|
byte c;
|
|
byte shift = 0;
|
|
byte iPrime;
|
|
byte nKey;
|
|
|
|
(void) shift;
|
|
|
|
iPrime = 0x17;
|
|
nKey = ( byte ) ~key;
|
|
|
|
|
|
for ( i = 0; i < ( short ) len; i++, key++, iPrime++, nKey++ )
|
|
{
|
|
//------------------
|
|
// Get the character
|
|
//------------------
|
|
|
|
c = ( byte ) ( ( buf[ i ] ^ key ) ^ 0x49 );
|
|
|
|
|
|
//-----------------------------------
|
|
// Now let's perform the bit swapping
|
|
//-----------------------------------
|
|
|
|
c = ( byte ) ~( ( c >> 7 ) |
|
|
( c << 7 ) |
|
|
( ( c & 0x40 ) >> 5 ) |
|
|
( ( c & 0x02 ) << 5 ) |
|
|
( ( c & 0x20 ) >> 3 ) |
|
|
( ( c & 0x04 ) << 3 ) |
|
|
( ( c & 0x10 ) >> 1 ) |
|
|
( ( c & 0x08 ) << 1 ) );
|
|
|
|
|
|
//----------------------------------------------------------------
|
|
// Now let's do the bit shifting (rolling) to the right. We used
|
|
// to do this in a loop, but doing it this way eliminates the loop
|
|
// code overhead and consequently speeds things up a bit.
|
|
//----------------------------------------------------------------
|
|
|
|
shift = ( byte ) ( i & 0x07 );
|
|
|
|
|
|
if ( shift != 0 )
|
|
{
|
|
c = ( byte ) ( ( c >> shift ) |
|
|
( c << ( 8 - shift ) ) );
|
|
}
|
|
|
|
buf[ i ] = ( c ^ iPrime ) ^ nKey;
|
|
}
|
|
|
|
|
|
return( buf );
|
|
}
|
|
|
|
|
|
|
|
static
|
|
int isValidMegaNum( char iChar )
|
|
{
|
|
if ( iChar >= '0' &&
|
|
iChar <= '9' )
|
|
{
|
|
return 1;
|
|
}
|
|
else if ( isalpha( iChar ) )
|
|
{
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static
|
|
word serialNumberDecode( char *sBuf,
|
|
word *piNodeCount )
|
|
{
|
|
char pstrProductID[ 3 ];
|
|
byte iPlatformID;
|
|
byte iOriginID;
|
|
char buf[ 16 + 1 ];
|
|
char eBuf[ 16 + 1 ];
|
|
struct dosdate_t dt;
|
|
struct dostime_t tm;
|
|
word yearValue;
|
|
word minValue;
|
|
word secValue;
|
|
char counterBuf[ 8 ];
|
|
char minuteBuf[ 8 ];
|
|
char dayBuf[ 8 ];
|
|
char secBuf[ 8 ];
|
|
char yearBuf[ 8 ];
|
|
char hourBuf[ 8 ];
|
|
char monthBuf[ 8 ];
|
|
char crcBuf[ 5 ];
|
|
word oldCRC;
|
|
word newCRC;
|
|
word iCounter;
|
|
|
|
char P1; // Product Code byte 1
|
|
char P2; // Product Code byte 2
|
|
char Pl; // Platform
|
|
char Or; // Origin
|
|
|
|
char N1; // Numeric Counter byte 1
|
|
char N2; // Numeric Counter byte 2
|
|
|
|
char Yr; // Year
|
|
char Mo; // Month
|
|
char Dy; // Day
|
|
char Hr; // Hour
|
|
char Mi; // Minute/2
|
|
char Se; // Second/2
|
|
|
|
char R1; // CRC byte 1
|
|
char R2; // CRC byte 2
|
|
char R3; // CRC byte 3
|
|
char R4; // CRC byte 4
|
|
|
|
|
|
if ( piNodeCount )
|
|
{
|
|
*piNodeCount = 2;
|
|
}
|
|
|
|
|
|
if ( strlen( sBuf ) != MAX_SN_LENGTH )
|
|
{
|
|
//-----------------------------
|
|
// Illegal serial number length
|
|
//-----------------------------
|
|
|
|
return( 0 );
|
|
}
|
|
|
|
//------------------------------------------------------
|
|
// Assign buffer fields to our serial number field codes
|
|
//------------------------------------------------------
|
|
|
|
R1 = sBuf[ 7 ];
|
|
R2 = sBuf[ 14 ];
|
|
R3 = sBuf[ 5 ];
|
|
R4 = sBuf[ 11 ];
|
|
|
|
P1 = sBuf[ 0 ];
|
|
P2 = sBuf[ 1 ];
|
|
Pl = sBuf[ 2 ];
|
|
Or = sBuf[ 3 ];
|
|
N2 = sBuf[ 4 ];
|
|
Mi = sBuf[ 6 ];
|
|
Dy = sBuf[ 8 ];
|
|
Se = sBuf[ 9 ];
|
|
Yr = sBuf[ 10 ];
|
|
Hr = sBuf[ 12 ];
|
|
N1 = sBuf[ 13 ];
|
|
Mo = sBuf[ 15 ];
|
|
|
|
crcBuf[ 0 ] = R1;
|
|
crcBuf[ 1 ] = R2;
|
|
crcBuf[ 2 ] = R3;
|
|
crcBuf[ 3 ] = R4;
|
|
crcBuf[ 4 ] = '\0';
|
|
|
|
//----------------------------------
|
|
// build buffer for encryption check
|
|
//----------------------------------
|
|
|
|
buf[ 0 ] = P1;
|
|
buf[ 1 ] = P2;
|
|
buf[ 2 ] = Pl;
|
|
buf[ 3 ] = Or;
|
|
buf[ 4 ] = N2;
|
|
buf[ 5 ] = Mi;
|
|
buf[ 6 ] = Dy;
|
|
buf[ 7 ] = Se;
|
|
buf[ 8 ] = Yr;
|
|
buf[ 9 ] = Hr;
|
|
buf[ 10 ] = N1;
|
|
buf[ 11 ] = Mo;
|
|
buf[ 12 ] = '\0';
|
|
|
|
|
|
oldCRC = word( strtol( crcBuf,
|
|
NULL,
|
|
16 ) );
|
|
|
|
|
|
strcpy( eBuf, buf );
|
|
|
|
encryptData( eBuf, strlen( eBuf ), 0 );
|
|
|
|
|
|
newCRC = makeCRC16( strlen( buf ),
|
|
0,
|
|
eBuf );
|
|
|
|
|
|
sprintf( crcBuf, "%04x", newCRC );
|
|
|
|
strupr( crcBuf );
|
|
|
|
|
|
if ( toupper( P1 ) != 'P' ||
|
|
toupper( P2 ) != 'B' )
|
|
{
|
|
//---------------------
|
|
// Invalid product code
|
|
//---------------------
|
|
|
|
return( 0 );
|
|
}
|
|
|
|
pstrProductID[ 0 ] = P1; // buf[ 0 ];
|
|
pstrProductID[ 1 ] = P2; // buf[ 1 ];
|
|
pstrProductID[ 2 ] = '\0';
|
|
|
|
iPlatformID = Pl; // buf[ 2 ];
|
|
iOriginID = Or; // buf[ 3 ];
|
|
|
|
counterBuf[ 0 ] = N1; // buf[ 10 ];
|
|
counterBuf[ 1 ] = N2; // buf[ 4 ];
|
|
counterBuf[ 2 ] = '\0';
|
|
|
|
minuteBuf[ 0 ] = Mi; // buf[ 5 ];
|
|
minuteBuf[ 1 ] = '\0';
|
|
|
|
dayBuf[ 0 ] = Dy; // buf[ 6 ];
|
|
dayBuf[ 1 ] = '\0';
|
|
|
|
secBuf[ 0 ] = Se; // buf[ 7 ];
|
|
secBuf[ 1 ] = '\0';
|
|
|
|
yearBuf[ 0 ] = Yr; // buf[ 8 ];
|
|
yearBuf[ 1 ] = '\0';
|
|
|
|
hourBuf[ 0 ] = Hr; // buf[ 9 ];
|
|
hourBuf[ 1 ] = '\0';
|
|
|
|
monthBuf[ 0 ] = Mo; // buf[ 11 ];
|
|
monthBuf[ 1 ] = '\0';
|
|
|
|
|
|
if ( not isxdigit( R1 ) or
|
|
not isxdigit( R2 ) or
|
|
not isxdigit( R3 ) or
|
|
not isxdigit( R4 ) )
|
|
{
|
|
//------------------------------------
|
|
// Illegal CRC value - not hexadecimal
|
|
//------------------------------------
|
|
|
|
return( 0 );
|
|
}
|
|
else if ( newCRC != oldCRC )
|
|
{
|
|
//-----------------------
|
|
// CRC values don't match
|
|
//-----------------------
|
|
|
|
return( 0 );
|
|
}
|
|
else if ( not isupper( iPlatformID ) )
|
|
{
|
|
//--------------------
|
|
// Illegal platform ID
|
|
//--------------------
|
|
|
|
return( 0 );
|
|
}
|
|
else if ( not isValidMegaNum( iOriginID ) )
|
|
{
|
|
//------------------
|
|
// Illegal origin ID
|
|
//------------------
|
|
|
|
return( 0 );
|
|
}
|
|
else if ( not isValidMegaNum( counterBuf[ 0 ] ) or
|
|
not isValidMegaNum( counterBuf[ 1 ] ) )
|
|
{
|
|
//----------------------
|
|
// Illegal counter value
|
|
//----------------------
|
|
|
|
return( 0 );
|
|
}
|
|
else if ( not isValidMegaNum( yearBuf[ 0 ] ) )
|
|
{
|
|
//-------------------
|
|
// Illegal year value
|
|
//-------------------
|
|
|
|
return( 0 );
|
|
}
|
|
else if ( not isValidMegaNum( monthBuf[ 0 ] ) )
|
|
{
|
|
//--------------------
|
|
// Illegal month value
|
|
//--------------------
|
|
|
|
return( 0 );
|
|
}
|
|
else if ( not isValidMegaNum( dayBuf[ 0 ] ) )
|
|
{
|
|
//------------------
|
|
// Illegal day value
|
|
//------------------
|
|
|
|
return( 0 );
|
|
}
|
|
else if ( not isValidMegaNum( hourBuf[ 0 ] ) )
|
|
{
|
|
//-------------------
|
|
// Illegal hour value
|
|
//-------------------
|
|
|
|
return( 0 );
|
|
}
|
|
else if ( not isValidMegaNum( minuteBuf[ 0 ] ) )
|
|
{
|
|
//---------------------
|
|
// Illegal minute value
|
|
//---------------------
|
|
|
|
return( 0 );
|
|
}
|
|
else if ( not isValidMegaNum( secBuf[ 0 ] ) )
|
|
{
|
|
//---------------------
|
|
// Illegal second value
|
|
//---------------------
|
|
|
|
return( 0 );
|
|
}
|
|
|
|
|
|
iCounter = ( word ) strtol( counterBuf, NULL, BASE_36 );
|
|
minValue = ( word ) strtol( minuteBuf, NULL, BASE_36 );
|
|
dt.day = strtol( dayBuf, NULL, BASE_36 );
|
|
secValue = ( word ) strtol( secBuf, NULL, BASE_36 );
|
|
yearValue = ( word ) strtol( yearBuf, NULL, BASE_36 );
|
|
tm.hour = strtol( hourBuf, NULL, BASE_36 );
|
|
dt.month = strtol( monthBuf, NULL, BASE_36 );
|
|
|
|
|
|
if ( iCounter > MAX_SN_COUNTER )
|
|
{
|
|
//---------------------------
|
|
// Counter value out of range
|
|
//---------------------------
|
|
|
|
return( 0 );
|
|
}
|
|
else if ( yearValue > BASE_36 )
|
|
{
|
|
//------------------
|
|
// year out of range
|
|
//------------------
|
|
|
|
return( 0 );
|
|
}
|
|
else if ( dt.month > MAX_SN_MONTHS )
|
|
{
|
|
//----------------------
|
|
// Month second of range
|
|
//----------------------
|
|
|
|
return( 0 );
|
|
}
|
|
else if ( dt.day > MAX_SN_DAYS )
|
|
{
|
|
//-----------------
|
|
// Day out of range
|
|
//-----------------
|
|
|
|
return( 0 );
|
|
}
|
|
else if ( tm.hour > MAX_SN_HOURS )
|
|
{
|
|
//---------------------
|
|
// Hour second of range
|
|
//---------------------
|
|
|
|
return( 0 );
|
|
}
|
|
else if ( minValue > MAX_SN_MINS )
|
|
{
|
|
//---------------------------
|
|
// Minutes value out of range
|
|
//---------------------------
|
|
|
|
return( 0 );
|
|
}
|
|
else if ( secValue > MAX_SN_SECS )
|
|
{
|
|
//--------------------
|
|
// second out of range
|
|
//--------------------
|
|
|
|
return( 0 );
|
|
}
|
|
|
|
dt.month++;
|
|
dt.day++;
|
|
|
|
dt.year = START_YEAR + yearValue;
|
|
tm.minute = minValue * 2;
|
|
tm.second = secValue * 2;
|
|
|
|
|
|
if ( piNodeCount )
|
|
{
|
|
*piNodeCount = iCounter;
|
|
}
|
|
|
|
return( 1 );
|
|
}
|
|
|
|
|
|
|
|
static
|
|
regResults registration_info( char *name,
|
|
char *serial,
|
|
char *actcode,
|
|
word *node_count )
|
|
{
|
|
word i;
|
|
word checksum = 0;
|
|
byte nBuf[ 80 ];
|
|
byte sBuf[ 80 ];
|
|
|
|
|
|
if ( memcmp( system_code_buf,
|
|
DEFAULT_SYSTEM_CODE,
|
|
SYSTEM_CODE_LEN ) == 0 )
|
|
{
|
|
//---------------------
|
|
// System Code is blank
|
|
//---------------------
|
|
|
|
if ( actcode )
|
|
{
|
|
strcpy( actcode, DEFAULT_SYSTEM_CODE );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//---------------------------------------------------------
|
|
// Looks like we have a valid system code. Let's decode it
|
|
//---------------------------------------------------------
|
|
|
|
char eBuf[ 80 ];
|
|
|
|
|
|
memmove( eBuf,
|
|
system_code_buf,
|
|
SYSTEM_CODE_LEN );
|
|
|
|
decryptData( eBuf,
|
|
SYSTEM_CODE_LEN,
|
|
0x00 );
|
|
|
|
|
|
if ( actcode )
|
|
{
|
|
//---------------------------------------------------------
|
|
// Now let's copy that system code to our calling parameter
|
|
//---------------------------------------------------------
|
|
|
|
sprintf( actcode,
|
|
"%-12.12s",
|
|
eBuf );
|
|
}
|
|
}
|
|
|
|
|
|
if ( memcmp( regname_buf,
|
|
DEFAULT_REGNAME,
|
|
USERNAME_LEN ) == 0 )
|
|
{
|
|
//-------------------
|
|
// User name is blank
|
|
//-------------------
|
|
|
|
return( registrationNone );
|
|
}
|
|
else if ( memcmp( serial_buf,
|
|
DEFAULT_SERIALNO,
|
|
SERIAL_NUM_LEN ) == 0 )
|
|
{
|
|
//-----------------------
|
|
// Serial number is blank
|
|
//-----------------------
|
|
|
|
return( registrationNone );
|
|
}
|
|
|
|
|
|
for ( i = 0; i < USERNAME_LEN; i++ )
|
|
{
|
|
checksum += regname_buf[ i ];
|
|
}
|
|
|
|
|
|
checksum = checksum & 0x00FF;
|
|
|
|
|
|
memmove( nBuf, regname_buf, USERNAME_LEN );
|
|
memmove( sBuf, serial_buf, SERIAL_NUM_LEN );
|
|
|
|
|
|
decryptData( nBuf, USERNAME_LEN, 0x00 );
|
|
decryptData( sBuf, SERIAL_NUM_LEN, checksum );
|
|
|
|
|
|
if ( memchr( sBuf, '\0', SERIAL_NUM_LEN ) == NULL )
|
|
{
|
|
//---------------------------------
|
|
// One of 'em isn't null terminated
|
|
//---------------------------------
|
|
|
|
return( registrationBad );
|
|
}
|
|
else if ( memchr( nBuf, '\0', USERNAME_LEN ) == NULL )
|
|
{
|
|
//---------------------------------
|
|
// One of 'em isn't null terminated
|
|
//---------------------------------
|
|
|
|
return( registrationBad );
|
|
}
|
|
else if ( not serialNumberDecode( sBuf, node_count ) )
|
|
{
|
|
//----------------------------------
|
|
// couldn't decode the serial number
|
|
//----------------------------------
|
|
|
|
return( registrationBad );
|
|
}
|
|
|
|
|
|
if ( name )
|
|
{
|
|
strcpy( name, nBuf );
|
|
}
|
|
|
|
|
|
if ( serial )
|
|
{
|
|
serial[ 0 ] = sBuf[ 0 ];
|
|
serial[ 1 ] = sBuf[ 1 ];
|
|
serial[ 2 ] = sBuf[ 2 ];
|
|
serial[ 3 ] = sBuf[ 3 ];
|
|
serial[ 4 ] = '-';
|
|
serial[ 5 ] = sBuf[ 4 ];
|
|
serial[ 6 ] = sBuf[ 5 ];
|
|
serial[ 7 ] = sBuf[ 6 ];
|
|
serial[ 8 ] = sBuf[ 7 ];
|
|
serial[ 9 ] = '-';
|
|
serial[ 10 ] = sBuf[ 8 ];
|
|
serial[ 11 ] = sBuf[ 9 ];
|
|
serial[ 12 ] = sBuf[ 10 ];
|
|
serial[ 13 ] = sBuf[ 11 ];
|
|
serial[ 14 ] = '-';
|
|
serial[ 15 ] = sBuf[ 12 ];
|
|
serial[ 16 ] = sBuf[ 13 ];
|
|
serial[ 17 ] = sBuf[ 14 ];
|
|
serial[ 18 ] = sBuf[ 15 ];
|
|
|
|
serial[ 19 ] = sBuf[ 16 ];
|
|
|
|
serial[ 20 ] = '\0';
|
|
}
|
|
|
|
|
|
return( registrationGood );
|
|
}
|
|
|
|
|
|
|
|
static
|
|
char *serialFormatted( char *sBuf )
|
|
{
|
|
static char tBuf[ 20 ];
|
|
|
|
|
|
sprintf( tBuf,
|
|
"%-4.4s %-4.4s %-4.4s %-4.4s",
|
|
sBuf,
|
|
sBuf + 4,
|
|
sBuf + 8,
|
|
sBuf + 12 );
|
|
|
|
return( tBuf );
|
|
}
|
|
|
|
|
|
|
|
char *software_serial_number( void )
|
|
{
|
|
static char buf[ 50 ];
|
|
regResults result;
|
|
|
|
|
|
if ( registered )
|
|
{
|
|
result = registration_info( NULL,
|
|
buf,
|
|
NULL,
|
|
NULL );
|
|
|
|
|
|
//-------------------------------------------
|
|
// This is a "shareware" copy of the software
|
|
//-------------------------------------------
|
|
|
|
if ( result == registrationGood )
|
|
{
|
|
//----------------------------------------------------------
|
|
// We have valid registration information. Let's return the
|
|
// serial number to the calling function.
|
|
//----------------------------------------------------------
|
|
|
|
return buf;
|
|
//return( serialFormatted( buf ) );
|
|
}
|
|
}
|
|
|
|
|
|
//-------------------------------------------------------------
|
|
// We have a version with no serial number. This means that we
|
|
// have an unregistered copy of the software.
|
|
//-------------------------------------------------------------
|
|
|
|
return( UNREG_STRING );
|
|
}
|
|
|
|
|
|
|
|
char *registered_user_name( void )
|
|
{
|
|
|
|
regResults result;
|
|
static char buf[ 50 ];
|
|
|
|
|
|
|
|
if ( registered )
|
|
{
|
|
result = registration_info( buf,
|
|
NULL,
|
|
NULL,
|
|
NULL );
|
|
|
|
|
|
//-------------------------------------------
|
|
// This is a "shareware" copy of the software
|
|
//-------------------------------------------
|
|
|
|
if ( result == registrationGood )
|
|
{
|
|
//----------------------------------------------------------
|
|
// We have valid registration information. Let's return the
|
|
// user's name to the calling function.
|
|
//----------------------------------------------------------
|
|
|
|
return( buf );
|
|
}
|
|
}
|
|
|
|
|
|
//---------------------------------------------------------
|
|
// We have a version with no user name. This means that we
|
|
// have an unregistered copy of the software.
|
|
//---------------------------------------------------------
|
|
|
|
return( UNREG_STRING );
|
|
}
|
|
|
|
|
|
|
|
char *get_system_code( void )
|
|
{
|
|
regResults result;
|
|
static char buf[ 30 ];
|
|
|
|
|
|
if ( registered )
|
|
{
|
|
result = registration_info( NULL,
|
|
NULL,
|
|
buf,
|
|
NULL );
|
|
|
|
|
|
//-------------------------------------------
|
|
// This is a "shareware" copy of the software
|
|
//-------------------------------------------
|
|
|
|
if ( result == registrationGood )
|
|
{
|
|
return( buf );
|
|
}
|
|
}
|
|
|
|
|
|
return( UNREG_STRING );
|
|
}
|
|
|
|
|
|
|
|
word get_node_count( void )
|
|
{
|
|
regResults result;
|
|
word iNodeCount = 2;
|
|
|
|
|
|
if ( registered )
|
|
{
|
|
result = registration_info( NULL,
|
|
NULL,
|
|
NULL,
|
|
& iNodeCount );
|
|
|
|
|
|
//-------------------------------------------
|
|
// This is a "shareware" copy of the software
|
|
//-------------------------------------------
|
|
|
|
if ( result == registrationGood )
|
|
{
|
|
return iNodeCount;
|
|
}
|
|
}
|
|
|
|
|
|
return 2;
|
|
}
|
|
|
|
|
|
|
|
word is_version_registered( void )
|
|
{
|
|
regResults result;
|
|
char serial[ 80 ];
|
|
char name[ 80 ];
|
|
|
|
|
|
result = registration_info( name,
|
|
serial,
|
|
NULL,
|
|
NULL );
|
|
|
|
|
|
if ( result == registrationGood )
|
|
{
|
|
//----------------------
|
|
// Fully registered copy
|
|
//----------------------
|
|
|
|
return( TRUE );
|
|
}
|
|
else
|
|
{
|
|
//---------------------
|
|
// Unregistered edition
|
|
//---------------------
|
|
|
|
return( TRUE );
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void CHECK_REG( void )
|
|
{
|
|
if ( is_version_registered() )
|
|
{
|
|
registered = TRUE;
|
|
max_node_count = get_node_count();
|
|
}
|
|
else
|
|
{
|
|
registered = TRUE;
|
|
max_node_count = 255;
|
|
}
|
|
}
|