crittografare il firmware
#includere
#includere
#includere
#includere
// Crittografa il contenuto del file di input "arg1" e scrive il contenuto crittografato nel file di output "arg2".
// La crittografia viene eseguita utilizzando AES-256-CBC con una chiave salata derivata dalla passphrase `arg3`.
// Restituisce 1 in caso di successo e 0 in caso di fallimento.
int32_t saltedEncrypt(char* arg1, char* arg2, char* arg3) {
FILE *inputFile = fopen(arg1, "rb");
if (fileinput == NULL) {
puts("Impossibile aprire il file di input");
0 ritorno;
}
FILE *outputFile = fopen(arg2, "wb");
if (Fileoutput == NULL) {
puts("Impossibile creare il file di output");
fclose(fileinput);
0 ritorno;
}
const EVP_CIPHER *cipherType = EVP_aes_256_cbc();
sale di char senza segno[8];
if (RAND_bytes(salt, sizeof(salt)) != 1) { // Genera un salt casuale.
puts("Impossibile generare salt");
fclose(fileinput);
fclose(fileoutput);
0 ritorno;
}
// Scrive la stringa magica "Salted__" e il sale nel file di output.
fwrite("Salted__", 1, 8, outputFile);
fwrite(salt, 1, sizeof(salt), outputFile);
chiave carattere senza segno[EVP_MAX_KEY_LENGTH], iv[EVP_MAX_IV_LENGTH];
// Deriva la chiave e IV dalla passphrase e sale utilizzando SHA-256.
if (!EVP_BytesToKey(cipherType, EVP_sha256(), salt, (carattere senza segno*)arg3, strlen(arg3), 1, chiave, iv)) {
puts("Impossibile generare la chiave");
fclose(fileinput);
fclose(fileoutput);
0 ritorno;
}
EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
if (ctx == NULL || EVP_EncryptInit_ex(ctx, cipherType, NULL, chiave, iv) != 1) {
puts("Inizializzazione della crittografia fallita");
EVP_CIPHER_CTX_libero(ctx);
fclose(fileinput);
fclose(fileoutput);
0 ritorno;
}
carattere senza segno inBuf[1024], outBuf[1024 + EVP_MAX_BLOCK_LENGTH];
int inLen, outLen;
while ((inLen = fread(inBuf, 1, sizeof(inBuf), inputFile)) > 0) {
if (EVP_EncryptUpdate(ctx, outBuf, &outLen, inBuf, inLen) != 1) {
handleErrors(); // Definisce la funzione di gestione degli errori.
// Esce o pulisce le risorse.
}
fwrite(outBuf, 1, outLen, outputFile);
}
if (EVP_EncryptFinal_ex(ctx, outBuf, &outLen) != 1) {
handleErrors(); // Gestire gli errori in modo appropriato.
// Esce o pulisce le risorse.
}
fwrite(outBuf, 1, outLen, outputFile);
EVP_CIPHER_CTX_libero(ctx);
fclose(fileinput);
fclose(fileoutput);
ritorno 1; // Successo.
}
#includere
#includere
#includere
// Crittografa il contenuto del file di input "arg1" e scrive il contenuto crittografato nel file di output "arg2".
// La crittografia viene eseguita utilizzando AES-256-CBC con una chiave salata derivata dalla passphrase `arg3`.
// Restituisce 1 in caso di successo e 0 in caso di fallimento.
int32_t saltedEncrypt(char* arg1, char* arg2, char* arg3) {
FILE *inputFile = fopen(arg1, "rb");
if (fileinput == NULL) {
puts("Impossibile aprire il file di input");
0 ritorno;
}
FILE *outputFile = fopen(arg2, "wb");
if (Fileoutput == NULL) {
puts("Impossibile creare il file di output");
fclose(fileinput);
0 ritorno;
}
const EVP_CIPHER *cipherType = EVP_aes_256_cbc();
sale di char senza segno[8];
if (RAND_bytes(salt, sizeof(salt)) != 1) { // Genera un salt casuale.
puts("Impossibile generare salt");
fclose(fileinput);
fclose(fileoutput);
0 ritorno;
}
// Scrive la stringa magica "Salted__" e il sale nel file di output.
fwrite("Salted__", 1, 8, outputFile);
fwrite(salt, 1, sizeof(salt), outputFile);
chiave carattere senza segno[EVP_MAX_KEY_LENGTH], iv[EVP_MAX_IV_LENGTH];
// Deriva la chiave e IV dalla passphrase e sale utilizzando SHA-256.
if (!EVP_BytesToKey(cipherType, EVP_sha256(), salt, (carattere senza segno*)arg3, strlen(arg3), 1, chiave, iv)) {
puts("Impossibile generare la chiave");
fclose(fileinput);
fclose(fileoutput);
0 ritorno;
}
EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
if (ctx == NULL || EVP_EncryptInit_ex(ctx, cipherType, NULL, chiave, iv) != 1) {
puts("Inizializzazione della crittografia fallita");
EVP_CIPHER_CTX_libero(ctx);
fclose(fileinput);
fclose(fileoutput);
0 ritorno;
}
carattere senza segno inBuf[1024], outBuf[1024 + EVP_MAX_BLOCK_LENGTH];
int inLen, outLen;
while ((inLen = fread(inBuf, 1, sizeof(inBuf), inputFile)) > 0) {
if (EVP_EncryptUpdate(ctx, outBuf, &outLen, inBuf, inLen) != 1) {
handleErrors(); // Definisce la funzione di gestione degli errori.
// Esce o pulisce le risorse.
}
fwrite(outBuf, 1, outLen, outputFile);
}
if (EVP_EncryptFinal_ex(ctx, outBuf, &outLen) != 1) {
handleErrors(); // Gestire gli errori in modo appropriato.
// Esce o pulisce le risorse.
}
fwrite(outBuf, 1, outLen, outputFile);
EVP_CIPHER_CTX_libero(ctx);
fclose(fileinput);
fclose(fileoutput);
ritorno 1; // Successo.
}