1*1acab96dSSimon Glass /* 2*1acab96dSSimon Glass * (C) Copyright 2015 Google, Inc 3*1acab96dSSimon Glass * 4*1acab96dSSimon Glass * (C) Copyright 2008-2014 Rockchip Electronics 5*1acab96dSSimon Glass * 6*1acab96dSSimon Glass * Rivest Cipher 4 (RC4) implementation 7*1acab96dSSimon Glass * 8*1acab96dSSimon Glass * SPDX-License-Identifier: GPL-2.0+ 9*1acab96dSSimon Glass */ 10*1acab96dSSimon Glass 11*1acab96dSSimon Glass #ifndef USE_HOSTCC 12*1acab96dSSimon Glass #include <common.h> 13*1acab96dSSimon Glass #endif 14*1acab96dSSimon Glass #include <rc4.h> 15*1acab96dSSimon Glass 16*1acab96dSSimon Glass void rc4_encode(unsigned char *buf, unsigned int len, unsigned char key[16]) 17*1acab96dSSimon Glass { 18*1acab96dSSimon Glass unsigned char s[256], k[256], temp; 19*1acab96dSSimon Glass unsigned short i, j, t; 20*1acab96dSSimon Glass int ptr; 21*1acab96dSSimon Glass 22*1acab96dSSimon Glass j = 0; 23*1acab96dSSimon Glass for (i = 0; i < 256; i++) { 24*1acab96dSSimon Glass s[i] = (unsigned char)i; 25*1acab96dSSimon Glass j &= 0x0f; 26*1acab96dSSimon Glass k[i] = key[j]; 27*1acab96dSSimon Glass j++; 28*1acab96dSSimon Glass } 29*1acab96dSSimon Glass 30*1acab96dSSimon Glass j = 0; 31*1acab96dSSimon Glass for (i = 0; i < 256; i++) { 32*1acab96dSSimon Glass j = (j + s[i] + k[i]) % 256; 33*1acab96dSSimon Glass temp = s[i]; 34*1acab96dSSimon Glass s[i] = s[j]; 35*1acab96dSSimon Glass s[j] = temp; 36*1acab96dSSimon Glass } 37*1acab96dSSimon Glass 38*1acab96dSSimon Glass i = 0; 39*1acab96dSSimon Glass j = 0; 40*1acab96dSSimon Glass for (ptr = 0; ptr < len; ptr++) { 41*1acab96dSSimon Glass i = (i + 1) % 256; 42*1acab96dSSimon Glass j = (j + s[i]) % 256; 43*1acab96dSSimon Glass temp = s[i]; 44*1acab96dSSimon Glass s[i] = s[j]; 45*1acab96dSSimon Glass s[j] = temp; 46*1acab96dSSimon Glass t = (s[i] + (s[j] % 256)) % 256; 47*1acab96dSSimon Glass buf[ptr] = buf[ptr] ^ s[t]; 48*1acab96dSSimon Glass } 49*1acab96dSSimon Glass } 50