3 void RC4Init(TRC4Context* rc4, const uint8_t* key, uint32_t keyLen) {
7 int S; // Changed from uint8_t to int to prevent infinite loop
12 // First loop: Initialize state
13 for (S = 0; S < 256; S++)
14 rc4->D[S] = (uint8_t)S;
19 // Second loop: Key scheduling
20 for (S = 0; S < 256; S++) {
21 if (L > 0) K = key[U]; // Added check for safety
27 R = (uint8_t)(R + rc4->D[S] + K);
29 rc4->D[S] = rc4->D[R];
34 void rc4Decrypt(const void* InData, void* OutData, uint32_t Size, TRC4Context* ctx) {
35 uint32_t i = 0, j = 0, t, k;
36 const uint8_t* in = (const uint8_t*)InData;
37 uint8_t* out = (uint8_t*)OutData;
39 for (k = 0; k < Size; k++) {
43 ctx->D[i] = ctx->D[j];
44 ctx->D[j] = (uint8_t)t;
45 t = (t + ctx->D[i]) & 0xFF;
46 out[k] = in[k] ^ ctx->D[t];