github.com/bgentry/go@v0.0.0-20150121062915-6cf5a733d54d/src/crypto/rc4/rc4_arm.s (about) 1 // Copyright 2013 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // +build !nacl 6 7 #include "textflag.h" 8 9 // Registers 10 dst = 0 11 src = 1 12 n = 2 13 state = 3 14 pi = 4 15 pj = 5 16 i = 6 17 j = 7 18 k = 8 19 t = 11 20 t2 = 12 21 22 // func xorKeyStream(dst, src *byte, n int, state *[256]byte, i, j *uint8) 23 TEXT ·xorKeyStream(SB),NOSPLIT,$0 24 MOVW 0(FP), R(dst) 25 MOVW 4(FP), R(src) 26 MOVW 8(FP), R(n) 27 MOVW 12(FP), R(state) 28 MOVW 16(FP), R(pi) 29 MOVW 20(FP), R(pj) 30 MOVBU (R(pi)), R(i) 31 MOVBU (R(pj)), R(j) 32 MOVW $0, R(k) 33 34 loop: 35 // i += 1; j += state[i] 36 ADD $1, R(i) 37 AND $0xff, R(i) 38 MOVBU R(i)<<2(R(state)), R(t) 39 ADD R(t), R(j) 40 AND $0xff, R(j) 41 42 // swap state[i] <-> state[j] 43 MOVBU R(j)<<2(R(state)), R(t2) 44 MOVB R(t2), R(i)<<2(R(state)) 45 MOVB R(t), R(j)<<2(R(state)) 46 47 // dst[k] = src[k] ^ state[state[i] + state[j]] 48 ADD R(t2), R(t) 49 AND $0xff, R(t) 50 MOVBU R(t)<<2(R(state)), R(t) 51 MOVBU R(k)<<0(R(src)), R(t2) 52 EOR R(t), R(t2) 53 MOVB R(t2), R(k)<<0(R(dst)) 54 55 ADD $1, R(k) 56 CMP R(k), R(n) 57 BNE loop 58 59 done: 60 MOVB R(i), (R(pi)) 61 MOVB R(j), (R(pj)) 62 RET