github.com/roboticscm/goman@v0.0.0-20210203095141-87c07b4a0a55/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