*	Crypt !
*	© by Juergen Ehnes (V0.6026ß/1993) optimized
*	(w) by Juergen Ehnes `90-`93 + Christian Anders `90
*	letzte Aenderung am 25.07.93

_SysBase		equ	4
_LVOOldOpenLibrary	equ 	-408
_LVOCloseLibrary 	equ    	-414
_LVOOutput		equ 	-60
_LVOWrite 		equ	-48
_LVORead		equ	-42
_LVOOpen		equ	-30
_LVOClose		equ	-36
_LVOLock		equ	-84
_LVOExamine		equ	-102
_LVOUnlock		equ	-90
_LVOFreeMem		equ	-210
_LVOAllocMem		equ	-198
space			equ	$20
shift_space		equ	$a0
cr			equ	$0a
*		macros
show	macro
	move.l	_output(pc),d1
	move.l	\1,d2
	moveq	\2,d3
	move.l	_dosbase(pc),a6
	jsr	_LVOWrite(a6)
	endm

*	programmtext

	movem.l	a0/d0,-(sp)		;Parameterliste retten
	
	lea	dosname(pc),a1			
	move.l	(_SysBase).w,a6
	jsr	_LVOOldOpenLibrary(a6)	;DOS.Lib oeffnen
	move.l	d0,_dosbase
	beq	fini
	
	move.l	_dosbase(pc),a6
	jsr	_LVOOutput(a6)		;Output-Handler holen
	move.l	d0,_output		;(verbleibt in _output)

	bsr	showheader

	movem.l	(sp)+,a0/d0		;Parameterliste holen
	lea	buffer1(pc),a1		;Auf Quelle vorbereiten 
	moveq	#0,d0
loop001
	move.b	(a0)+,d1		;1.Byte holen
	cmp.b	#space,d1		;war es ein space, dann weitersuchen
	beq.s	loop001
	cmp.b	#shift_space,d1		;oder shiftspace ?
	beq.s	loop001
	cmp.b	#cr,d1			; wenn cr dann fertig
	beq	argready

	move.b	d1,(a1)+		;1.Zeichen des Names uebernehmen
	addq.w	#1,d0			;Laenge des Namens +1
loop002
	
	move.b	(a0)+,d1
	cmp.b	#space,d1
	beq.s	loop003
	cmp.b	#shift_space,d1
	beq.s	loop003			;s.o.
	cmp.b	#cr,d1
	beq.s	loop003
	move.b	d1,(a1)+		;s.o.

	addq.w	#1,d0
	cmp.w	#80,d0			;maximal 80 Zeichen
	beq	nametolong	

	bra.s	loop002
loop003
	move.b	#0,(a1)
	lea	buffer2,a1
	moveq	#0,d0
loop004
	move.b	(a0)+,d1
	cmp.b	#space,d1
	beq.s	loop004			;selbiges fuer den Zielnamen
	cmp.b	#shift_space,d1
	beq.s	loop004
	cmp.b	#cr,d1
	beq.s	argready

	move.b	d1,(a1)+
	addq.w	#1,d0
loop005
	move.b	(a0)+,d1
	cmp.b	#space,d1
	beq.s	loop006
	cmp.b	#shift_space,d1
	beq.s	loop006			;s.o.
	cmp.b	#cr,d1
	beq.s	loop006
	move.b	d1,(a1)+

	addq.w	#1,d0			;s.o.
	cmp.w	#80,d0
	beq	nametolong

	bra.s	loop005
loop006
	move.b	#0,(a1)
	moveq	#0,d0
	lea	buffer3,a1
loop007
	move.b	(a0)+,d1
	cmp.b	#space,d1
	beq.s	loop007
	cmp.b	#shift_space,d1		;selbiges fuer das Passwort
	beq.s	loop007
	cmp.b	#cr,d1
	beq.s	argready

	move.b	d1,(a1)+
	addq.w	#1,d0
loop008
	move.b	(a0)+,d1
	cmp.b	#space,d1
	beq.s	argready
	cmp.b	#shift_space,d1
	beq.s	argready		;s.o.
	cmp.b	#cr,d1
	beq.s	argready
	move.b	d1,(a1)+

	addq.w	#1,d0
	cmp.w	#10,d0			;hier maximal 9 Zeichen
	bge	pwtolong

	bra.s	loop008
argready
	move.b	#0,(a1)

*	Passwort auf 9 Zeichen mit ? ergänzen
loop
	cmp.b	#9,d0
	bge.s	weiter2
	lea	buffer3(pc),a0
	add.l	d0,a0
	move.b	#'?',(a0)
	addq.b	#1,d0
	bra.s	loop

* Normal weiter


weiter2 move.l	#buffer1,d1		
	move.l	#1005,d2
	move.l	_dosbase(pc),a6
	jsr	_LVOOpen(a6)		;Quelle oeffnen
	move.l	d0,_source
	bne.s	ok1	
	move.l	_output,d1			;Quell-Fehler:
	move.l	#error1,d2
	move.l	#e1size,d3
	move.l	_dosbase(pc),a6
	jsr	_LVOWrite(a6)
	bra	closel			

ok1	bsr	filesize		;Dateigroesse feststellen
	bsr 	amem			;Speicher reservieren
	
	move.l	#buffer2,d1
	move.l	#1006,d2
	move.l	_dosbase(pc),a6
	jsr	_LVOOpen(a6)		;Ziel oeffnen
	move.l	d0,_target		;Ziel-Struktur
	bne.s	ok2
	move.l	_output(pc),d1
	move.l	#error2,d2		;Ziel nicht geoeffnet
	move.l	#e2size,d3
	move.l	_dosbase(pc),a6
	jsr	_LVOWrite(a6)		;Ziel-Fehler
	bra.s	closes

ok2	move.l	_source(pc),d1		;Strukturen bereitstellen
	move.l	memory(pc),d2
	move.l	fsize(pc),d3
	move.l	_dosbase(pc),a6
	jsr	_LVORead(a6)		;Quelle lesen
	cmp.l	fsize(pc),d0		;Vollstaendig gelesen?
	bne	wrong4			
	move.l	fsize(pc),d7	
	move.l	memory(pc),a0

	bsr	crypt_it

	move.l	_target(pc),d1
	move.l	memory(pc),d2
	move.l	fsize(pc),d3
	move.l	_dosbase(pc),a6
	jsr	_LVOWrite(a6)		;Daten an Ziel-Datei schreiben
	cmp.l	fsize(pc),d0
	bne	wrong5			;Konnten alle Daten geschrieben
					;werden?
close	move.l	_target(pc),d1
	move.l	_dosbase(pc),a6
	jsr	_LVOClose(a6)		;Ziel-Datei schliessen
closes	move.l	_source(pc),d1
	move.l	_dosbase(pc),a6
	jsr	_LVOClose(a6)		;Quell-Datei schliessen
closem	jsr	fmem			;Speicher freigeben
closel	move.l	_dosbase(pc),a1
	move.l	(_SysBase).w,a6
	jsr	_LVOCloseLibrary(a6)	;DOS.Lib schliessen
fini	rts

argerror				;Argument-Fehler	
	show #error6,#e6size
	bra.s	closel

filesize				;Datei-Groesse bestimmen
	lea	buffer1(pc),a0
	move.l	laenge1(pc),d0
	add.l	d0,a0
	move.b	#0,-1(a0)
	move.l	#buffer1,d1
	moveq	#-2,d2
	move.l	_dosbase(pc),a6
	jsr	_LVOLock(a6)		;Datei-LOCK holen
	move.l	d0,lock
	beq.s	wrong1
	move.l	lock,d1
	move.l	#fib,d2
	move.l	_dosbase(pc),a6
	jsr	_LVOExamine(a6)		;Datei-Info-Block holen
	tst.l	d0
	beq.s	wrong2
	lea	fib(pc),a0
	move.l	$7c(a0),d2		;Datei-Laenge holen
	move.l	d2,fsize
	move.l	lock(pc),d1
	move.l	_dosbase(pc),a6
	jsr	_LVOUnlock(a6)		;Datei-LOCK freigeben
	rts
	
wrong2	move.l	lock(pc),d1
	move.l	_dosbase(pc),a6
	jsr	_LVOUnlock(a6)		;Datei-LOCK freigeben
	
wrong1	show	#error7,#e7size
	bra	closel	

amem	move.l	fsize(pc),d0		;Speicher reservieren
	move.l	#$10001,d1		;Jeder Speicherbereich erlaubt
	move.l	(_SysBase).w,a6
	jsr	_LVOAllocMem(a6)
	move.l	d0,memory		;Zeiger uebergeben
	beq.s	wrong3
	rts
	
wrong3	move.l	(sp)+,d2		;ruecksprung vom stapel holen
	show 	#error8,#e8size
	bra	closel

fmem	move.l	memory(pc),a1		;Speicher freigeben
	move.l	fsize(pc),d0
	move.l	(_SysBase).w,a6
	jsr	_LVOFreeMem(a6)
	rts
	
wrong4	show	#error9,#e9size
	bra	close
	
wrong5	show	#error10,#e10size
	bra	close

nametolong
	show	#error11,#e11size
	bra	close
pwtolong
	show	#error12,#e12size
	bra	close
showheader
	move.l	_output,d1			;Fehler
	move.l	#header,d2
	moveq	#headersize,d3
	move.l	_dosbase(pc),a6
	jmp	_LVOWrite(a6)			;jmp, dann springt die routine automatisch
						;zurueck

*	Beginn der Verschluesselung

crypt_it
	move.b	(a0),d0			
	lea	buffer3(pc),a1		;Quell-Byte holen
	move.b	(a1)+,d1		;XOR jedes Bytes der Quelle
	eor.b	d1,d0			;mit jedem Byte des Passworts
	move.b	(a1)+,d1
	eor.b	d1,d0
	move.b  (a1)+,d1
	eor.b	d1,d0	
	move.b	(a1)+,d1
	eor.b	d1,d0
	move.b	(a1)+,d1
	eor.b	d1,d0
	move.b	(a1)+,d1
	eor.b	d1,d0
	move.b	(a1)+,d1
	eor.b	d1,d0
	move.b	(a1)+,d1
	eor.b	d1,d0
	move.b	(a1)+,d1
	eor.b	d1,d0
	move.b	d0,(a0)+		;In Speicher zurueckschreiben

*	Manipulation des Passwortes 	(Zyklus 111MB)

	lea	buffer3(pc),a1		
	move.b	(a1),d1
	addq.b	#3,d1
	bcc.s 	lp1
	addq.b	#1,d1
lp1	move.b	d1,(a1)+
	move.b	(a1),d1
	addq.b	#5,d1
	bcc.s	lp2
	addq.b	#1,d1
lp2	move.b	d1,(a1)+
	move.b   (a1),d1
	addq.b	#7,d1
	bcc.s	lp3
	addq.b	#1,d1	
lp3	move.b	d1,(a1)+
	move.b	(a1),d1
	add.b	#11,d1
	bcc.s	lp4
	addq.b	#1,d1	
lp4	move.b	d1,(a1)+
	move.b	(a1),d1
	add.b	#13,d1
	bcc.s 	lp5
	addq.b	#1,d1	
lp5	move.b	d1,(a1)+	
	move.b	(a1),d1
	add.b	#17,d1
	bcc.s	lp6
	addq.b	#1,d1	
lp6	move.b	d1,(a1)+
	move.b	(a1),d1
	add.b	#19,d1
	bcc.s	lp7
	addq.b	#1,d1	
lp7	move.b	d1,(a1)+
	move.b	(a1),d1
	add.b	#23,d1
	bcc.s 	lp8
	addq.b	#1,d1	
lp8	move.b	d1,(a1)+
	move.b	(a1),d1
	add.b	#29,d1
	bcc.s 	lp9
	addq.b	#1,d1	
lp9	move.b	d1,(a1)+

	subq.l	#1,d7
	bne	crypt_it	;etc.fuer alle Quell-Bytes
	rts
*	Ende der Verschluesselung

*	 Daten
dosname	dc.b	'dos.library',0
	cnop	0,2
_dosbase	dc.l	0
_output		dc.l	0
_source		dc.l	0
_target		dc.l	0
fsize		dc.l	0
memory		dc.l	0
lock		dc.l	0

buffer1	ds.b	82
	cnop	0,2
laenge1	dc.l	0
buffer2	ds.b	82
	cnop	0,2
laenge2	dc.l	0
buffer3	ds.b	10
	cnop	0,2

	cnop 	0,4
fib	ds.b	$104
	cnop	0,4

header	dc.b	'Crypt V0.6026ß © by Juergen Ehnes 1990-1993',10
;	dc.b	'(w) by J. Ehnes (`90-`93) & C. Anders (`90)',10
headersize	equ	*-header
	cnop	0,2
error1	dc.b	27,'[1mError: Source-Error',27,'[22m',10
e1size		equ	*-error1
	cnop	0,2
error2	dc.b	27,'[1mError: Target-Error',27,'[22m',10
e2size		equ	*-error2
	cnop	0,2
error6	dc.b	27,'[1mArgument Error',27,'[22m',10,'Usage:',10,'CRYPT source target [password]',10
e6size		equ	*-error6
	cnop	0,2
error7	dc.b	27,'[1mError: Lock(Filename) not found',27,'[22m',10
e7size		equ	*-error7
	cnop	0,2

error8	dc.b	27,'[1mError: Not enough memory',27,'[22m',10
e8size	equ	*-error8
	cnop	0,2
error9	dc.b	27,'[1mError: Read-Error',27,'[22m',10
e9size	equ	*-error9
	cnop	0,2
error10	dc.b	27,'[1mError: Write-Error',27,'[22m',10
e10size	equ	*-error10
	cnop	0,2
error11	dc.b	27,'[1mError: Name to Long',27,'[22m',10
e11size		equ	*-error11
	cnop	0,2
error12	dc.b	27,'[1mError: Password to Long',27,'[22m',10
e12size		equ	*-error12
	cnop	0,2
version	dc.b	'$VER: Crypt V0.6026ß © by Juergen Ehnes 25.07.1993  ',0
	even
