


;*--------------------T-------------T------------------------------------T------T-------T-------T-------T
;* CoolNESs-KeyEncryptAlgorythm
;* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;* Copyright (C) 1998 by Sunbeam/Shelter!
;*
;* 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