11#include <stdio.h>
22#include <stdlib.h>
33#include <string.h>
4+ #include <errno.h>
45#include "aes.h"
56
67#define SALT_LEN 16
78
89static const char * PASSWORD_STR = ENCRYPTION_PASSWORD ;
9- static const uint8_t salt [] = { ENCRYPTION_SALT };
10+ static const uint8_t salt [16 ] = {ENCRYPTION_SALT };
1011
1112void derive_key (uint8_t * key_out ) {
1213 for (int i = 0 ; i < 32 ; i ++ ) {
1314 key_out [i ] = (uint8_t )(PASSWORD_STR [i % strlen (PASSWORD_STR )] ^ salt [i % SALT_LEN ]);
1415 }
1516}
1617
17- void decrypt_file (const char * input , const char * output ) {
18+ static int decrypt_file (const char * input , const char * output ) {
1819 FILE * fin = fopen (input , "rb" );
19- if (!fin ) return ;
20+ if (!fin ) {
21+ fprintf (stderr , "Error al abrir archivo de entrada '%s': %s\n" , input , strerror (errno ));
22+ return 1 ;
23+ }
2024 fseek (fin , 0 , SEEK_END );
2125 long len = ftell (fin );
2226 rewind (fin );
2327
28+ if (len <= 0 ) {
29+ fprintf (stderr , "Archivo de entrada vacío o inválido\n" );
30+ fclose (fin );
31+ return 1 ;
32+ }
33+
34+ // Ajustar para múltiplos de 16 para AES ECB
35+ if (len % 16 != 0 ) {
36+ fprintf (stderr , "El archivo no es múltiplo de 16 bytes, AES ECB requiere múltiplos de 16\n" );
37+ fclose (fin );
38+ return 1 ;
39+ }
40+
2441 uint8_t * buffer = malloc (len );
25- fread (buffer , 1 , len , fin );
42+ if (!buffer ) {
43+ fprintf (stderr , "Error asignando memoria\n" );
44+ fclose (fin );
45+ return 1 ;
46+ }
47+
48+ size_t read_bytes = fread (buffer , 1 , len , fin );
2649 fclose (fin );
50+ if (read_bytes != len ) {
51+ fprintf (stderr , "Error leyendo archivo de entrada\n" );
52+ free (buffer );
53+ return 1 ;
54+ }
2755
2856 struct AES_ctx ctx ;
2957 uint8_t key [32 ];
@@ -34,19 +62,67 @@ void decrypt_file(const char *input, const char *output) {
3462 AES_ECB_decrypt (& ctx , buffer + i );
3563 }
3664
65+ // Obtener valor de padding (último byte)
66+ uint8_t pad_val = buffer [len - 1 ];
67+ if (pad_val == 0 || pad_val > 16 ) {
68+ fprintf (stderr , "Error: padding inválido\n" );
69+ free (buffer );
70+ return 1 ;
71+ }
72+
73+ // Validar padding PKCS#7
74+ for (long i = len - pad_val ; i < len ; i ++ ) {
75+ if (buffer [i ] != pad_val ) {
76+ fprintf (stderr , "Error: padding corrupto\n" );
77+ free (buffer );
78+ return 1 ;
79+ }
80+ }
81+
82+ long output_len = len - pad_val ;
83+
3784 FILE * fout = fopen (output , "wb" );
38- fwrite (buffer , 1 , len , fout );
85+ if (!fout ) {
86+ fprintf (stderr , "Error al abrir archivo de salida '%s': %s\n" , output , strerror (errno ));
87+ free (buffer );
88+ return 1 ;
89+ }
90+ fwrite (buffer , 1 , output_len , fout );
3991 fclose (fout );
4092 free (buffer );
93+ printf ("Archivo desencriptado creado correctamente: %s\n" , output );
94+ return 0 ;
95+ }
96+
97+ int launch_blenderplayer (const char * blend_file ) {
98+ char cmd [512 ];
99+
100+ #if defined(_WIN32 )
101+ snprintf (cmd , sizeof (cmd ), "blenderplayer\\blenderplayer.exe \"%s\"" , blend_file );
102+ #else
103+ snprintf (cmd , sizeof (cmd ), "./blenderplayer/blenderplayer \"%s\"" , blend_file );
104+ #endif
105+
106+ printf ("Ejecutando: %s\n" , cmd );
107+ int ret = system (cmd );
108+ if (ret != 0 ) {
109+ fprintf (stderr , "Error ejecutando blenderplayer (code %d)\n" , ret );
110+ }
111+ return ret ;
41112}
42113
43114int main (void ) {
44115 const char * encrypted = "game_encrypted.block" ;
45116 const char * decrypted = "game_decrypted.blend" ;
46117
47- decrypt_file (encrypted , decrypted );
118+ if (decrypt_file (encrypted , decrypted )) {
119+ fprintf (stderr , "Error encriptando el archivo. No se lanza el blenderplayer: %s\n" , strerror (errno ));
120+ return 1 ;
121+ }
122+
123+ printf ("Ejecutando blenderplayer con archivo %s\n" , decrypted );
124+ return launch_blenderplayer (decrypted );
48125
49- //execlp("blenderplayer", "blenderplayer", decrypted, NULL);
50126 return 0 ;
51127}
52128
0 commit comments