
;*-------------------------------------------------------------------------------------------------------
;* CoolNESs-KeyEncryptAlgorythm
;* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;* Copyright (C) 1998 by Sunbeam\dc!
;*
;* Date       : 9.3.98
;* Program    : CoolNESs
;* Version    : 0.59beta
;* Spirit     : 1.1+
;* Note       : This keymaker don't works with newer versions of CoolNESs!
;*-------------------------------------------------------------------------------------------------------

		INCLUDE	"misc/spirit.i"

KEY_LENGTH	EQU	196

;*-------------------------------------------------------------------------------------------------------
;* KeyModule Tags
;*-------------------------------------------------------------------------------------------------------

		KEYHEAD	KeyModTags

		dc.b	"$VER: CoolNESs KeyMod 1.0 (9.3.98)",13,10,0
		cnop	0,2

KeyModTags	dc.l	SPT_Name,Name
		dc.l	SPT_Version,Version
		dc.l	SPT_Cracker,Cracker
		dc.l	SPT_Group,Group
		dc.l	SPT_Date,Date
		dc.l	SPT_KeyLength,KEY_LENGTH
		dc.l	SPT_KeyName,KeyName
		dc.l	SPT_KeyPath,KeyPath
		dc.l	SPT_Encrypt,MakeKey
		dc.l	SPT_Flags,FLGF_CHECKEMPTY
		dc.l	SPT_NameLen,20
		dc.l	SPT_TempBuff,KEY_LENGTH
		dc.l	SPT_EncryptLen,CodeLength
		dc.l	TAG_DONE

Name		dc.b	"CoolNESs",0
Version		dc.b	"0.59beta",0
Cracker		dc.b	"Sunbeam",0
Group		dc.b	"Shelter",0
Date		dc.b	"14.2.98",0
KeyName		dc.b	"CoolNESs.key",0
KeyPath		dc.b	"PROGDIR:",0
		cnop	0,2

;*-------------------------------------------------------------------------------------------------------
;* Encrypt Routine
;*-------------------------------------------------------------------------------------------------------

MakeKey		move.l	kb_TempBuffer(a5),a1
		move.l	a1,a0
		move.l	#$466C7542,161(a1)
		move.l	#$436F6F6C,128(a1)
		move.l	#$5465736C,155(a1)
		move.l	kb_Name(a5),a2
CopyName	move.b	(a2)+,(a1)+
		bne.s	CopyName

		move.w	#KEY_LENGTH-4,d6
		moveq	#0,d7
		moveq	#0,d0
		moveq	#0,d1
BuildSum	move.b	(a0,d0.w),d1
		add.l	d1,d7
		addq.w	#1,d0
		cmp.w	d6,d0
		bne.s	BuildSum

		move.l	kb_KeyBuffer(a5),a5

		move.l	d7,d0
		eor.l	#$00158B6D,d0
		move.l	d0,(a5)	;set chksum
		moveq	#0,d5

Build		move.l	d7,d0
		move.l	d0,d1
		lsl.l	#4,d1
		sub.l	d0,d1
		move.l	d1,d2
		lsl.l	#2,d2
		add.l	d1,d2
		lsl.l	#5,d2
		add.l	d0,d2
		move.l	d2,d1
		lsl.l	#3,d1
		sub.l	d2,d1
		divu.l	#$7FFFFFFE,d1:d2
		move.l	d2,d7
		divs.l	#$100,d2:d0
		move.b	(a0,d5.w),d1
		eor.b	d0,d1
		move.b	d1,4(a5,d5.w)
		addq.w	#1,d5
CheckBuildDone	cmp.w	d6,d5
		bne.s	Build
		moveq	#RETURN_NOERR,d0
		move.l	#KEY_LENGTH,d1
		rts
CodeLength	EQU	*-MakeKey
		END