opt D- ; Assembly settings should be executable. Change D- to D+ for debugging ; and use M+ to expand MACROs into listing during debugging ; compiled DEVPAC software (works on all versions). ;****************************************************************** ;* * ;* Data Encryption program by Steve Meredith 1991. The program * ;* prevents unauthorised reading or use of a file. Encryption * ;* does not support FASTMEM (ie. Extra memory). * ;* Assembled with DEVPAC 1 or 2. * ;* * ;* Letters, questions and general stuff to me at : * ;* 74 Pemberton Road, Winstanley, Wigan, WN3 6DA, UK * ;* or 28 Seaton Street, Middlesbrough, Cleveland, TS1 3NQ, UK * ;****************************************************************** ;----- DOS calls -------------------- _LVOOpen EQU -30 _LVOClose EQU -36 _LVORead EQU -42 _LVOWrite EQU -48 _LVOOutput EQU -60 _LVOLock EQU -84 _LVOUnLock EQU -90 _LVOExamine EQU -102 _LVOInfo EQU -114 ;----- EXEC calls ------------------- _LVOAllocMem EQU -198 _LVOFreeMem EQU -210 _LVOOpenLibrary EQU -552 _LVOCloseLibrary EQU -414 ;----- MISC Equates ----------------- _SysBase EQU 4 MEMF_CHIP EQU 1<<1 MEMF_CLEAR EQU 1<<16 MODE_OLDFILE EQU 1005 MODE_NEWFILE EQU 1006 ;----- PRINT Macro equates ---------- Free EQU 2 Exit EQU 1 Comeback EQU 0 ;----- CALL EXEC MACRO -------------- CALLEXEC MACRO move.l (_SysBase).w,a6 jsr _LVO\1(a6) ENDM ;----- CALL DOS MACRO --------------- CALLDOS MACRO move.l _DOSBase,a6 jsr _LVO\1(a6) ENDM ;----- PRINT TEXT MACRO ------------- PRINT MACRO CALLDOS Output move.l #\1,d2 move.l #53,d3 CALLDOS Write move.b #\2,d0 cmp.b #Exit,d0 beq clib cmp.b #Free,d0 beq FreeMemory ENDM ;----- MAIN PROGRAM BEGINS HERE ----- Open_Dos_Lib move.l a0,a4 move.l d0,a0 move.l #dosname,a1 CALLEXEC OpenLibrary ; Open library tst.l d0 beq Quit ; Whoops, error. move.l d0,_DOSBase ; Ok. Keep DOSBase move.l a4,a0 Check_Input move.b (a0),d0 ; Check if user just presses cmp.b #$0a,d0 ; [RETURN] bne.s Split_Args PRINT UsageTxt,Comeback PRINT UsageTxt2,Exit ; Print usage and quit Split_Args PRINT Working,Comeback move.l a4,a0 bsr StringSplit ; Get password move.l d1,PassWORD lea.l 2(a0),a0 bsr StringSplit ; Get passcode move.l d1,PassCODE lea.l 2(a0),a0 move.l a0,FileName ; Get filename FindSpc lea.l 1(a0),a0 ; NULL terminate filename cmp.b #$0A,(a0) bne FindSpc move.b #0,(a0) Get_Lock move.l FileName,d1 ; Check if file exists move.l #-2,d2 CALLDOS Lock move.l d0,MyLock Alloc_InfoMem move.l #256,d0 move.l #MEMF_CHIP!MEMF_CLEAR,d1 ; I want CHIP memory CALLEXEC AllocMem ; tst.l d0 ; bne.s Get_DiskInfo ; Successful PRINT NoMemory,Exit Get_DiskInfo ; Check WRITEPROTECT ENABLED move.l d0,TOP move.l d0,d2 move.l MyLock,d1 CALLDOS Info move.l TOP,a1 move.l 8(a1),a1 move.l a1,d0 cmp.b #$52,d0 ; Check ENABLED beq.s Get_FileInfo move.l TOP,a1 move.l #256,d0 ; Size of memory allocated moveq #0,d1 CALLEXEC FreeMem move.l MyLock,d1 CALLDOS UnLock PRINT DiskErr,Exit ; WRITE PROTECTED exit Get_FileInfo ; Get information on file move.l TOP,a5 move.l MyLock,d1 move.l a5,d2 CALLDOS Examine Free_Lock move.l MyLock,d1 CALLDOS UnLock Get_Size move.l 124(a5),a5 move.l a5,FileSize ; Get filesize Free_InfoMem move.l TOP,a1 move.l #256,d0 ; Size of memory allocated moveq #0,d1 CALLEXEC FreeMem Allocate_Memory move.l FileSize,d0 add.b #$10,d0 move.l d0,TotalSize move.l #MEMF_CHIP!MEMF_CLEAR,d1 ; I want CHIP memory CALLEXEC AllocMem ; tst.l d0 ; bne MemOK ; Successful PRINT NoMemory,Exit MemOK move.l d0,TOP ; Set save block addresses add #16,d0 ; move.l d0,MIDDLE ; add #16,d0 ; move.l d0,BOTTOM ; ; ***** OPEN DATAFILE ***** move.l #0,d0 move.l FileName,d1 ; Filename address to d1 move.l #MODE_OLDFILE,d2 ; CALLDOS Open ; tst.l d0 bne Readfle PRINT Error1,Free ; Couldn't get file handle ; ***** READ DATAFILE INTO ALLOCATED MEMORY (at MIDDLE address) ***** Readfle move.l d0,FHandle move.l MIDDLE,d2 ; Allocated-memory space to d2 move.l FileSize,d3 ; File size to d3 CALLDOS Read ; Read data move.l d0,FileSize move.l MIDDLE,a1 ; Old or New file? cmp.l #'Cryp',(a1) beq CheckPass ; old file, check pass PrepNew PRINT NewTxt,Comeback move.l TOP,a1 move.l #'Cryp',(a1)+ move.l #'t-2 ',(a1)+ move.l #'(c) ',(a1)+ lea.l PassWORD,a2 ; Create diskcode move.l (a2),d1 lea.l PassCODE,a2 move.l (a2),d2 EOR.l d1,d2 not.l d2 move.l d2,(a1) move.l MIDDLE,CryptAddress move.l TOP,FileAddress move.b #$10,ExtraBytes bra Cr_DeCrypt CheckPass lea.l 12(a1),a1 move.l (a1),d0 lea.l PassCODE,a1 move.l (a1),d1 EOR.l d1,d0 not.l d0 lea.l PassWORD,a1 move.l (a1),d1 cmp.l d1,d0 beq PassOK move.l FHandle,d1 ; FILEHANDLE to d1 CALLDOS Close ; Close file PRINT UnAuth,Free ; Wrong code! exit. PassOK PRINT OldTxt,Comeback add.l #-$10,FileSize move.l BOTTOM,CryptAddress move.l BOTTOM,FileAddress Cr_DeCrypt lea.l PassWORD,a1 move.l (a1),d2 not.l d2 move.l CryptAddress,a1 move.l FileSize,d0 Crypt ; Crypt/DeCrypt datafile eor.l d2,(a1) ; Xor password with data add.l #4,a1 ; Encrypt every longword sub.l #4,d0 ; Decrement file-size counter tst.l d0 bgt.s Crypt eor.l d2,(a1) Save move.l FHandle,d1 CALLDOS Close move.l FileName,d1 ; Filename address to a1 move.l #MODE_NEWFILE,d2 ; CALLDOS Open ; move.l d0,FHandle ; Store file handle. move.l FHandle,d1 move.l FileAddress,d2 move.l FileSize,d3 add.b ExtraBytes,d3 CALLDOS Write move.l FHandle,d1 ; FILEHANDLE to d1 CALLDOS Close ; Close file PRINT Finished,Comeback FreeMemory move.l TOP,a1 move.l TotalSize,d0 ; Size of memory allocated moveq #0,d1 CALLEXEC FreeMem clib move.l _DOSBase,a1 ; Close DOS library CALLEXEC CloseLibrary Quit rts ;********************************************************************* ;* * ;* Sub-routine to split users CODE and PASS words and to extend the * ;* CODE or PASS to 4 characters if need be. * ;* * ;********************************************************************* StringSplit clr.l d2 clr.l d1 move.b (a0),-(sp) moveq #3,d0 Push lea.l 1(a0),a0 cmp.b #$20,(a0) beq Extend move.b (a0),-(sp) subq #1,d0 tst.b d0 bne Push Zoom lea.l 1(a0),a0 cmp.b #$20,(a0) bne Zoom lea.l -1(a0),a0 bra Pullstk Extend lea.l -1(a0),a0 ; pad last letter to 4 character word Again move.b (a0),-(sp) subq #1,d0 tst.b d0 bne Again Pullstk move.l #0,d1 ; Pull characters from stack move.b (sp)+,d1 mulu.w #$100,d1 move.b (sp)+,d1 swap.w d1 move.b (sp)+,d2 mulu.w #$100,d2 move.b (sp)+,d2 add.l d2,d1 ; 4 characters into d1 rts ;************************* STORAGE ********************************* dosname dc.b 'dos.library',0 _DOSBase dc.l 0 ; DOSbase address PassWORD dc.l 0 ; PassCODE dc.l 0 ; FileName dc.l 0 ; CryptAddress dc.l 0 ; FileAddress dc.l 0 ; FileSize dc.l 0 ; FHandle dc.l 0 ; MIDDLE dc.l 0 ; TOP dc.l 0 ; BOTTOM dc.l 0 ; TotalSize dc.l 0 ; ExtraBytes dc.b 0 ; MyLock dc.l 0 ; DiskErr dc.b 'Disk Error : Please Write-Enable?. ',10 NoMemory dc.b 'Cant Allocate Memory - Kill External Sources/ReBoot ',10 Error1 dc.b 'Unable to open file/incorrect parameters. ',10 UnAuth dc.b 'Operation Aborted - Incorrect keys. ',10 Finished dc.b 'Operation complete. ',10 UsageTxt2 dc.b 'PassCode : MAX 4 chars in length. No FASTMEM support',10 UsageTxt dc.b ' Usage : Crypt [PassWord] [PassCode] [filename] ',10 OldTxt dc.b '->De-Crypting file. ',10 NewTxt dc.b '->Crypting ',27,'[3mnewfile.',27,'[0m',' ',10 Working dc.b 27,'[7m',10,'Encryption by S.Meredith.',10,27,'[0m','->Checking File ',10 even