xref: /openbmc/u-boot/lib/rc4.c (revision e8f80a5a)
1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
21acab96dSSimon Glass /*
31acab96dSSimon Glass  * (C) Copyright 2015 Google, Inc
41acab96dSSimon Glass  *
51acab96dSSimon Glass  * (C) Copyright 2008-2014 Rockchip Electronics
61acab96dSSimon Glass  *
71acab96dSSimon Glass  * Rivest Cipher 4 (RC4) implementation
81acab96dSSimon Glass  */
91acab96dSSimon Glass 
101acab96dSSimon Glass #ifndef USE_HOSTCC
111acab96dSSimon Glass #include <common.h>
121acab96dSSimon Glass #endif
131acab96dSSimon Glass #include <rc4.h>
141acab96dSSimon Glass 
rc4_encode(unsigned char * buf,unsigned int len,unsigned char key[16])151acab96dSSimon Glass void rc4_encode(unsigned char *buf, unsigned int len, unsigned char key[16])
161acab96dSSimon Glass {
171acab96dSSimon Glass 	unsigned char s[256], k[256], temp;
181acab96dSSimon Glass 	unsigned short i, j, t;
191acab96dSSimon Glass 	int ptr;
201acab96dSSimon Glass 
211acab96dSSimon Glass 	j = 0;
221acab96dSSimon Glass 	for (i = 0; i < 256; i++) {
231acab96dSSimon Glass 		s[i] = (unsigned char)i;
241acab96dSSimon Glass 		j &= 0x0f;
251acab96dSSimon Glass 		k[i] = key[j];
261acab96dSSimon Glass 		j++;
271acab96dSSimon Glass 	}
281acab96dSSimon Glass 
291acab96dSSimon Glass 	j = 0;
301acab96dSSimon Glass 	for (i = 0; i < 256; i++) {
311acab96dSSimon Glass 		j = (j + s[i] + k[i]) % 256;
321acab96dSSimon Glass 		temp = s[i];
331acab96dSSimon Glass 		s[i] = s[j];
341acab96dSSimon Glass 		s[j] = temp;
351acab96dSSimon Glass 	}
361acab96dSSimon Glass 
371acab96dSSimon Glass 	i = 0;
381acab96dSSimon Glass 	j = 0;
391acab96dSSimon Glass 	for (ptr = 0; ptr < len; ptr++) {
401acab96dSSimon Glass 		i = (i + 1) % 256;
411acab96dSSimon Glass 		j = (j + s[i]) % 256;
421acab96dSSimon Glass 		temp = s[i];
431acab96dSSimon Glass 		s[i] = s[j];
441acab96dSSimon Glass 		s[j] = temp;
451acab96dSSimon Glass 		t = (s[i] + (s[j] % 256)) % 256;
461acab96dSSimon Glass 		buf[ptr] = buf[ptr] ^ s[t];
471acab96dSSimon Glass 	}
481acab96dSSimon Glass }
49