home *** CD-ROM | disk | FTP | other *** search
- (*
- ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
- ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
- ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
- ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
- ▓▓▓▓▓▓▓▓·── ──·▓▓▓▓▓▓▓▓▓▓▓
- ▓▓▓▓▓▓▓▓│ │░░▓▓▓▓▓▓▓▓▓
- ▓▓▓▓▓▓▓▓ ECO_REG was Conceived, Designed and Written ░░▓▓▓▓▓▓▓▓▓
- ▓▓▓▓▓▓▓▓ by Floor A.C. Naaijkens for ░░▓▓▓▓▓▓▓▓▓
- ▓▓▓▓▓▓▓▓ UltiHouse Software / The ECO Group. ░░▓▓▓▓▓▓▓▓▓
- ▓▓▓▓▓▓▓▓ ░░▓▓▓▓▓▓▓▓▓
- ▓▓▓▓▓▓▓▓ (C) MCMXCII by EUROCON PANATIONAL CORPORATION. ░░▓▓▓▓▓▓▓▓▓
- ▓▓▓▓▓▓▓▓ All Rights Reserved for The ECO Group. ░░▓▓▓▓▓▓▓▓▓
- ▓▓▓▓▓▓▓▓ ░░▓▓▓▓▓▓▓▓▓
- ▓▓▓▓▓▓▓▓ ECO_REG is the ultimate registration-kit for ░░▓▓▓▓▓▓▓▓▓
- ▓▓▓▓▓▓▓▓ TurboPascal programmers. ░░▓▓▓▓▓▓▓▓▓
- ▓▓▓▓▓▓▓▓│ │░░▓▓▓▓▓▓▓▓▓
- ▓▓▓▓▓▓▓▓·── ──·░░▓▓▓▓▓▓▓▓▓
- ▓▓▓▓▓▓▓▓▓▓░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓▓▓▓▓
- ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
- ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
- ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
- *)
-
-
-
- {$A-,B-,D-,E-,F-,I-,L-,N-,O-,R-,S-,V-}
- {$M 65520, 0, 655360}
- unit eco_reg;
-
- interface
- uses
- eco_lib, dos
-
- ;
-
-
-
- type
- keyerrortype = (
- errornokey, errorkeycopyright, errorkeyposession,
- errorkeydate, errorkeyunknown, errorinternal,
- errorprogrammer, errorversion, errorbadcrc
- );
- keyoptions = (
- keypermanent, key30day, key30runs, keynday, keynruns, keyexpiration,
- keyreserved1, keyreserved2
- );
-
-
-
- const
- keytypes : array[keyoptions] of string[19] = (
- 'Key is permanent.',
- 'Key runs 30 days.',
- 'Key allows 30 runs.',
- 'Key runs N days.' ,
- 'Key allows N runs.',
- 'Key expires on ',
- 'Key overusurped.',
- 'Key is reserved2'
- );
- keyerrors : array[keyerrortype] of string[49] = (
- 'KEY does not exist!',
- 'KEY Copyright Information Violation Error.',
- 'KEY Posession Violation Error.',
- 'KEY Date/Time Violation Error.',
- 'KEY Error UNKNOWN, sorry can''t allow, to be sure.',
- 'Internal Copyright Information Violation Error.',
- 'KEY used for other program.',
- 'KEY used for different version',
- 'KEY not generated: bad CRC given.'
- );
-
-
-
- type
- regkey = record
- keyfilename : string[12]; { key filename to be set by user }
- programkey : string[20]; { keyname as to show in keyfile }
- programmer : string[20]; { the programmers/companies' code }
- upgradecode : string[10]; { code, same in all upgradable progs }
- registered : string[40]; { naam of registered person }
- expiredate : longint; { key expiration date and time }
- creation : longint; { key creation date and time }
- expireamount: word; { if type of key correct, amount }
- keylevel : word; { level of key (default: 0) }
- invokes : longint; { number of key accesses }
- typeofkey : keyoptions; { bit pattern }
- keycreator : string[8]; { HEX-CRC/32 to be entered to generate key }
- end;
-
-
- var
- validuser : regkey;
- keyerror : set of keyerrortype;
-
-
-
- procedure createkey(prog: regkey);
- function checkkey(var prog: regkey): boolean;
- function checkcreator(prog: regkey): boolean;
- procedure getcreator(var prog: regkey);
- procedure clearerrors;
- function __diff(create, dead: longint): longint;
- { difference in days dead-create }
-
-
-
-
- implementation
-
-
-
-
-
-
- const
- copylen = 73;
- ljunk0 = 213;
- ljunk1 = 182;
- ljunk2 = 045;
- ljunk3 = 125;
- ljunk4 = 214;
- ljunk5 = 039;
- ljunk6 = 155;
- ljunk7 = 236;
- ljunk8 = 114;
- ljunk9 = 231;
- ljunk10 = 142;
-
-
- type
- cryptor = record { junk-aligned data record for extra encryption safety }
- keycopyright : array[1..3,1..copylen] of char; { UltiHouse Software Copyright }
- keyintro : array[1..12] of char; { 'Keyfile for ' - sentence }
- keyname : array[1..20] of char; { name the key yourself }
- keyend : char; { always <esc> char 26 }
- junk0 : array[1..ljunk0] of byte;
- reallength : byte; { actual length of name }
- junk1 : array[1..ljunk1] of byte;
- name : string[40]; { encrypted name }
- company : string[20]; { programmers/companies' code }
- upgrade : string[10]; { code,same 4 all upgradables }
- junk2 : array[1..ljunk2] of byte;
- level : word; { level of key }
- junk3 : array[1..ljunk3] of byte;
- crc : longint; { crc of name }
- junk4 : array[1..ljunk4] of byte;
- crc2 : longint; { crc of string of crc of name }
- junk5 : array[1..ljunk5] of byte;
- createdate : longint; { key creation date and time }
- junk6 : array[1..ljunk6] of byte;
- expiration : longint; { key expiration date and time }
- junk7 : array[1..ljunk7] of byte;
- usages : longint; { number of key accesses }
- junk8 : array[1..ljunk8] of byte;
- amount : word; { e.g. 51 days / runs }
- junk9 : array[1..ljunk9] of byte;
- seed : byte; { random seed for encryption }
- junk10 : array[1..ljunk10] of byte;
- keytype : keyoptions; { bit pattern }
- end;
-
-
-
- const
- keycopyrights : array[1..3] of string[copylen] = (
- 'The ECO Library II Registration Unit was Conceived, Designed and '#10#13,
- 'Written by Floor A.C. Naaijkens for UltiHouse Software / The ECO Group.'#10#13,
- '(C) MCMXCIII by EUROCON PANATIONAL CORPORATION, All Rights Reserved. '#10#13
- );
- keycopycrc = -742070740;
- keyfileformsg : string[12] = 'Keyfile for ';
-
-
- var
- i, j : byte;
- st : string;
- testcrc32,
- crc32 : longint;
- key : cryptor;
- keyfile : file of cryptor;
-
-
-
- function encrypch(b: char; p: byte): char;
- var bb: byte; { encryption dependent of position }
- begin
- bb := byte(b);
- if bb mod 2 = 0 then dec(bb) else inc(bb, 3);
- if p mod 2 = 0 then dec(p) else inc(p, 3);
- encrypch := char(bb + (p * (p+5) * (p+7) * (p + 13)))
- end;
-
-
-
- function decrypch(b: char; p: byte): char;
- var bb: byte; { encryption dependent of position }
- begin
- bb := byte(b);
- if bb mod 2 = 0 then dec(bb, 3) else inc(bb);
- if p mod 2 = 0 then dec(p) else inc(p, 3);
- decrypch := char(bb - (p * (p+5) * (p+7) * (p + 13)))
- end;
-
-
-
- procedure checkinternals;
- begin
- crc32 := $ffffffff;
- for j := 1 to 3 do for i := 1 to copylen do
- crc32 := __crc32(byte(keycopyrights[j, i]), crc32);
- if crc32 <> keycopycrc then begin
- writeln(crc32, ':', keyerrors[errorinternal]); halt;
- end;
- end;
-
-
-
- procedure filljunkwithjunk;
- var i : word;
- begin
- randomize;
- with key do begin
- for i := 1 to ljunk0 do junk0[i] := random(255);
- for i := 1 to ljunk1 do junk1[i] := random(255);
- for i := 1 to ljunk2 do junk2[i] := random(255);
- for i := 1 to ljunk3 do junk3[i] := random(255);
- for i := 1 to ljunk4 do junk4[i] := random(255);
- for i := 1 to ljunk5 do junk5[i] := random(255);
- for i := 1 to ljunk6 do junk6[i] := random(255);
- for i := 1 to ljunk7 do junk7[i] := random(255);
- for i := 1 to ljunk8 do junk8[i] := random(255);
- for i := 1 to ljunk9 do junk9[i] := random(255);
- for i := 1 to ljunk10 do junk10[i] := random(255);
- end;
- end;
-
-
-
- procedure createkey(prog: regkey);
- var
- i : word;
- j : byte;
- tmp : string;
-
- begin
- with key, prog do begin
- filljunkwithjunk;
-
- for j := 1 to 3 do for i := 1 to copylen do
- keycopyright[j, i] := keycopyrights[j, i];
- for i := 1 to 12 do keyintro[i] := keyfileformsg[i];
- tmp := programkey;
- for i := 1 to length(tmp) do keyname[i] := tmp[i];
- for i := length(tmp)+1 to 20 do keyname[i] := ' ';
- for i := 1 to 19 do junk0[i] := 13;
- keyend := #26;
-
- name := 'ß≥|÷ûñ°M≥ ╨ûτêB2·÷╩░M≥ ╨⌐B╥╜O╗╩░z.:╥╛r';
- name := registered;
- for i := 1 to length(name) do name[i] := encrypch(name[i], i);
- crc32 := $ffffffff; { calculate 32-bit crc values. }
- for i := 1 to length(name) do crc32 := __crc32(byte(name[i]), crc32);
- crc := crc32;
-
- keytype := typeofkey; seed := random(3); createdate := creation;
- expiration := expiredate; level := keylevel;
- usages := 0; level := 0; invokes := 0; amount := expireamount;
-
- tmp := '';
- for i := 1 to length(programmer) do
- tmp := tmp + encrypch(programmer[i], i);
- company := tmp;
-
- tmp := '';
- for i := 1 to length(upgradecode) do
- tmp := tmp + encrypch(upgradecode[i], i);
- upgrade := tmp;
-
- assign(keyfile, keyfilename); rewrite(keyfile);
- write(keyfile, key); close(keyfile);
- end;
- end;
-
-
-
- function checkkey(var prog: regkey) : boolean;
- var
- st1, st2 : string;
- (*
- function __existfil(pathname: string): boolean;
- var fileinfo : searchrec;
- begin
- findfirst(pathname, anyfile, fileinfo);
- __existfil := (doserror = 0)
- end;
- *)
- begin
- if (
- not __existfil(prog.keyfilename)
- ) then keyerror := keyerror + [errornokey] else begin
- with key, prog do begin
- assign(keyfile, keyfilename); reset(keyfile);
- read(keyfile, key); close(keyfile);
- inc(usages); rewrite(keyfile); write(keyfile, key); close(keyfile);
-
- testcrc32 := $ffffffff;
- for i := 1 to length(name) do
- testcrc32 := __crc32(byte(name[i]), testcrc32);
- if crc <> testcrc32 then keyerror := keyerror + [errorkeyposession];
- for i := 1 to length(name) do name[i] := decrypch(name[i], i);
-
- crc32 := $ffffffff;
- for j := 1 to 3 do for i := 1 to copylen do
- crc32 := __crc32(byte(keycopyright[j, i]), crc32);
- if crc32 <> keycopycrc then keyerror := keyerror + [errorkeycopyright];
-
- st1 := ''; st2 := '';
- for i := 1 to length(programmer) do st1 := st1 + programmer[i];
- for i := 1 to length(company) do
- st2 := st2 + decrypch(company[i], i);
- if (st1 <> st2) then keyerror := keyerror + [errorprogrammer];
-
- st1 := ''; st2 := '';
- for i := 1 to length(upgradecode) do st1 := st1 + upgradecode[i];
- for i := 1 to length(upgrade) do st2 := st2 + decrypch(upgrade[i], i);
- if st1 <> st2 then keyerror := keyerror + [errorversion];
-
- registered := name;
- expiredate := expiration;
- expireamount := amount;
- creation := createdate;
- keylevel := level;
- typeofkey := keytype;
- invokes := usages;
- end;
- end;
- checkkey := (prog.typeofkey = keypermanent);
- end;
-
-
-
- procedure clearerrors;
- begin
- keyerror := [];
- end;
-
-
-
- function __diff(create, dead: longint): longint;
- var _creation, _dead : datetime;
-
-
- function __dt2jlutl(year, month, day : word) : longint;
- const days : array[1..12] of word = (31,29,31,30,31,30,31,31,30,31,30,31);
- begin
- __dt2jlutl := -1;
- if ((year < 1900) and (year > 99)) then exit;
- if (year < 100) then inc(year,1900);
- if ((month < 1) or (month > 12)) then exit;
- if (((month = 2) and (day = 29)) and ((year mod 4) <> 0)) then exit;
- if ((day = 0) or (day > days[month])) then exit;
- if ((year = 1900) and (month < 3)) then exit;
- dec(year,1900);
- if (month > 2) then dec(month,3) else begin inc(month,9); dec(year) end;
- __dt2jlutl := ((longint(1461) * longint(year)) div 4) +
- ((153 * month + 2) div 5) + day - 1;
- end;
-
- function __daysutl(
- year1, month1, day1: word; year2, month2, day2 : word
- ): longint;
- var temp1, temp2 : longint;
- begin
- temp1 := __dt2jlutl(year1,month1,day1);
- temp2 := __dt2jlutl(year2,month2,day2);
- if (temp1 < 0) or (temp2 < 0) then __daysutl := -1 else
- __daysutl := temp2 - temp1;
- end;
-
- begin
- unpacktime(create, _creation); unpacktime(dead, _dead);
- __diff := __daysutl(
- _creation.year, _creation.month, _creation.day,
- _dead.year, _dead.month, _dead.day
- )
- end;
-
-
-
-
- function __dechexstr(intvalue: longint; size: word): string;
- const hexcheck : array[0..15] of char = '0123456789ABCDEF';
- var
- i : integer;
- tempstr : string[8];
-
- begin
- if ((size <> 1) and (size <> 2) and (size <> 4)) then begin
- __dechexstr := ''; exit
- end;
-
- tempstr[0] := chr(8);
- for i := 0 to 7 do begin
- tempstr[8 - i] := hexcheck[intvalue and $000f];
- intvalue := intvalue shr 4
- end;
- i := 2 * size;
- __dechexstr := copy(tempstr,8 - i + 1,i)
- end;
-
-
-
- procedure getcreator(var prog: regkey);
- var
- crc : longint;
- i : byte;
- tmp : string[8];
- name : string;
-
- begin
- with prog do begin
- crc := $ffffffff;
- name := registered + programkey + upgradecode + chr(keylevel);
- for i := 1 to length(name) do name[i] := encrypch(name[i], i);
- for i := 1 to length(name) do crc := __crc32(byte(name[i]), crc);
- keycreator := __dechexstr(crc, 4);
- end;
- end;
-
-
-
- function checkcreator(prog: regkey): boolean;
- var
- crc : longint;
- i : byte;
- name : string;
- tmp : string[8];
-
- begin { checks encrypname against CRC }
- {
- 1. encrypt name
- 2. calculate CRC/32 of encrypted name
- 3. create HEX of CRC
- 4. compare keycreator against HEX-CRC/32
- }
- with prog do begin
- name := registered + programkey + upgradecode + chr(keylevel);
- for i := 1 to length(name) do name[i] := encrypch(name[i], i);
- crc := $ffffffff;
- for i := 1 to length(name) do crc := __crc32(byte(name[i]), crc);
- tmp := __dechexstr(crc, 4);
- checkcreator := (tmp = keycreator);
- end;
- end;
-
-
-
- begin
- checkinternals; clearerrors; randomize;
- fillchar(validuser, sizeof(validuser), #0);
- end. { unit }
-