| // 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. |
| |
| // +build !nacl |
| |
| #include "textflag.h" |
| |
| // Registers |
| dst = 0 |
| src = 1 |
| n = 2 |
| state = 3 |
| pi = 4 |
| pj = 5 |
| i = 6 |
| j = 7 |
| k = 8 |
| t = 11 |
| t2 = 12 |
| |
| // func xorKeyStream(dst, src *byte, n int, state *[256]byte, i, j *uint8) |
| TEXT ·xorKeyStream(SB),NOSPLIT,$0 |
| MOVW 0(FP), R(dst) |
| MOVW 4(FP), R(src) |
| MOVW 8(FP), R(n) |
| MOVW 12(FP), R(state) |
| MOVW 16(FP), R(pi) |
| MOVW 20(FP), R(pj) |
| MOVBU (R(pi)), R(i) |
| MOVBU (R(pj)), R(j) |
| MOVW $0, R(k) |
| |
| loop: |
| // i += 1; j += state[i] |
| ADD $1, R(i) |
| AND $0xff, R(i) |
| MOVBU R(i)<<2(R(state)), R(t) |
| ADD R(t), R(j) |
| AND $0xff, R(j) |
| |
| // swap state[i] <-> state[j] |
| MOVBU R(j)<<2(R(state)), R(t2) |
| MOVB R(t2), R(i)<<2(R(state)) |
| MOVB R(t), R(j)<<2(R(state)) |
| |
| // dst[k] = src[k] ^ state[state[i] + state[j]] |
| ADD R(t2), R(t) |
| AND $0xff, R(t) |
| MOVBU R(t)<<2(R(state)), R(t) |
| MOVBU R(k)<<0(R(src)), R(t2) |
| EOR R(t), R(t2) |
| MOVB R(t2), R(k)<<0(R(dst)) |
| |
| ADD $1, R(k) |
| CMP R(k), R(n) |
| BNE loop |
| |
| done: |
| MOVB R(i), (R(pi)) |
| MOVB R(j), (R(pj)) |
| RET |