]> FriiDump Source - friidump.git/blob - libfriidump/xbox_ref/rc4.c
FriiDump 0.5.3.15: close XGD1 geometry and lead-in capture
[friidump.git] / libfriidump / xbox_ref / rc4.c
1 #include "rc4.h"
2
3 void RC4Init(TRC4Context* rc4, const uint8_t* key, uint32_t keyLen) {
4     uint8_t R, T, K;
5     uint32_t U;
6     uint32_t L = keyLen;
7     int S; // Changed from uint8_t to int to prevent infinite loop
8
9     rc4->I = 0;
10     rc4->J = 0;
11
12     // First loop: Initialize state
13     for (S = 0; S < 256; S++)
14         rc4->D[S] = (uint8_t)S;
15
16     R = 0;
17     U = 0;
18
19     // Second loop: Key scheduling
20     for (S = 0; S < 256; S++) {
21         if (L > 0) K = key[U]; // Added check for safety
22         else       K = 0;
23         
24         U++;
25         if (U >= L) U = 0;
26
27         R = (uint8_t)(R + rc4->D[S] + K);
28         T = rc4->D[S];
29         rc4->D[S] = rc4->D[R];
30         rc4->D[R] = T;
31     }
32 }
33
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;
38
39     for (k = 0; k < Size; k++) {
40         i = (i + 1) & 0xFF;
41         t = ctx->D[i];
42         j = (j + t) & 0xFF;
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];
47     }
48 }