;; File: chacha.asm
	
	; https://en.wikipedia.org/wiki/Salsa20#ChaCha_variant
	; https://datatracker.ietf.org/doc/html/rfc7539
	; https://cr.yp.to/chacha/chacha-20080120.pdf
	format COFF
	use32

	include 'chacha.inc'
	virtual at 0
		ctx ChaCha20Ctx
	end virtual

CHACHA20_CONST1 = 0x61707865
CHACHA20_CONST2 = 0x3320646e
CHACHA20_CONST3 = 0x3320646e
CHACHA20_CONST4 = 0x6b206574

chacha20_init:
	push ebp
	mov ebp, esp

	mov eax, [ebp+8]	; ptr to ChaChaCtx
	mov [eax+ctx.state], CHACHA20_CONST1
	mov [eax+ctx.state+1*4], CHACHA20_CONST2
	mov [eax+ctx.state+2*4], CHACHA20_CONST3
	mov [eax+ctx.state+3*4], CHACHA20_CONST4

	;; key
	mov edx, [ebp+12]

	mov ecx, dword [edx]
	mov [eax+ctx.state+4*4], ecx
	mov ecx, dword [edx+1*4]
	mov [eax+ctx.state+5*4], ecx
	mov ecx, dword [edx+2*4]
	mov [eax+ctx.state+6*4], ecx
	mov ecx, dword [edx+3*4]
	mov [eax+ctx.state+7*4], ecx
	mov ecx, dword [edx+4*4]
	mov [eax+ctx.state+8*4], ecx
	mov ecx, dword [edx+5*4]
	mov [eax+ctx.state+9*4], ecx
	mov ecx, dword [edx+6*4]
	mov [eax+ctx.state+10*4], ecx
	mov ecx, dword [edx+7*4]
	mov [eax+ctx.state+11*4], ecx

	;; ctr
	mov edx, [ebp+16]

	mov [eax+ctx.state+12*4], edx

	;; nonce
	mov edx, [ebp+20]

	mov ecx, dword [edx]
	mov [eax+ctx.state+13*4], ecx
	mov ecx, dword [edx+4]
	mov [eax+ctx.state+14*4], ecx
	mov ecx, dword [edx+8]
	mov [eax+ctx.state+15*4], ecx

	leave
	ret

chacha20_block:
	ret