summaryrefslogtreecommitdiff
path: root/src/pkg/crypto/rc4/rc4_amd64.s
blob: ffe9ada85bb3b5c473d79c2366809e7121683201 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
// Copyright 2013 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// func xorKeyStream(dst, src *byte, n int, state *[256]byte, i, j *uint8)
TEXT ·xorKeyStream(SB),7,$0
	MOVQ dst+0(FP), DI
	MOVQ src+8(FP), SI
	MOVQ n+16(FP), CX
	MOVQ state+24(FP), R8

	MOVQ xPtr+32(FP), AX
	MOVBQZX (AX), AX
	MOVQ yPtr+40(FP), BX
	MOVBQZX (BX), BX

loop:
	CMPQ CX, $0
	JE done

	// c.i += 1
	INCB AX

	// c.j += c.s[c.i]
	MOVB (R8)(AX*1), R9
	ADDB R9, BX

	MOVBQZX (R8)(BX*1), R10

	MOVB R10, (R8)(AX*1)
	MOVB R9, (R8)(BX*1)

	// R11 = c.s[c.i]+c.s[c.j]
	MOVQ R10, R11
	ADDB R9, R11

	MOVB (R8)(R11*1), R11
	MOVB (SI), R12
	XORB R11, R12
	MOVB R12, (DI)

	INCQ SI
	INCQ DI
	DECQ CX

	JMP loop
done:
	MOVQ xPtr+32(FP), R8
	MOVB AX, (R8)
	MOVQ yPtr+40(FP), R8
	MOVB BX, (R8)

	RET