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 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