0

I am trying to make a MMORPG for PSP and I will be encrypting al data sent over the network in some form. I have chosen AES for this.

I have this code:

int encrypt(unsigned char *plaintext, int plaintext_len, unsigned char *key, unsigned char *iv, unsigned char *ciphertext){

int len;

int ciphertext_len;

/* Create and initialise the context */
EVP_CIPHER_CTX_init(&ctx);
appendLog("CTX Init", LOG_CRYPTO);
/* Initialise the encryption operation. IMPORTANT - ensure you use a key
* and IV size appropriate for your cipher
* In this example we are using 256 bit AES (i.e. a 256 bit key). The
* IV size for *most* modes is the same as the block size. For AES this
* is 128 bits */
if(1 != EVP_EncryptInit_ex(&ctx, EVP_aes_256_cbc(), NULL, key, iv))
    printLastError("2");
appendLog("Encrypt started", LOG_CRYPTO);
/* Provide the message to be encrypted, and obtain the encrypted output.
* EVP_EncryptUpdate can be called multiple times if necessary
*/
if(1 != EVP_EncryptUpdate(&ctx, ciphertext, &len, plaintext, plaintext_len))
    printLastError("3");
ciphertext_len = len;
appendLog("Mid encrypt", LOG_CRYPTO);
/* Finalise the encryption. Further ciphertext bytes may be written at
* this stage.
*/
if(1 != EVP_EncryptFinal_ex(&ctx, ciphertext + len, &len)) printLastError("4");
ciphertext_len += len;
appendLog("Encrypt final", LOG_CRYPTO);
/* Clean up */
EVP_CIPHER_CTX_cleanup(&ctx);
appendLog("CTX Cleanup", LOG_CRYPTO);
return ciphertext_len;
}

It freezes my PSP after writing "Mid encrypt" to the logs. I was wondering if there is anything noticeably wrong with this code. I am using openSSL v0.9.7j for PSP.

The original AES encrypt code:

int encrypt(unsigned char *plaintext, int plaintext_len, unsigned char *key, unsigned char *iv, unsigned char *ciphertext){
EVP_CIPHER_CTX *ctx;

int len;

int ciphertext_len;

/* Create and initialise the context */
if(!(ctx = EVP_CIPHER_CTX_new())) exit(0);

/* Initialise the encryption operation. IMPORTANT - ensure you use a key
* and IV size appropriate for your cipher
* In this example we are using 256 bit AES (i.e. a 256 bit key). The
* IV size for *most* modes is the same as the block size. For AES this
* is 128 bits */
if(1 != EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv))
exit(0);

/* Provide the message to be encrypted, and obtain the encrypted output.
* EVP_EncryptUpdate can be called multiple times if necessary
*/
if(1 != EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintext_len))
exit(0);
ciphertext_len = len;

/* Finalise the encryption. Further ciphertext bytes may be written at
* this stage.
*/
if(1 != EVP_EncryptFinal_ex(ctx, ciphertext + len, &len)) exit(0);
ciphertext_len += len;

/* Clean up */
EVP_CIPHER_CTX_free(ctx);
return ciphertext_len;
}

The PSPSDK openSSL does not have functions EVP_CIPHER_CTX_new() or EVP_CIPHER_CTX_free() and my EVP_CIPHER_CTX is declared globally and not in the function anymore.

My function call:

char *newS;
char AESKey[32];
char IV[16];
sprintf(AESKey, "12345678901234567890123456789012");
sprintf(IV, "1234567890123456");
encrypted_length = encrypt("HelloFromPSP", strlen("HelloFromPSP"), AESKey, IV, newS);

Can anyone help me figure out why the EVP_EncryptFinal_ex is frezing?

EDIT: Somehow managed to fix by going back to my old code(which was also freezing, odd)

char encrypted[4098]; //Could be smaller but is this size because it holds RSA data at some points in the code
char AESKey[32]; //Recieved from server, no sprintf filling this
char IV[16]; //Recieved from server, no sprintf filling this
encrypted_length = encrypt("HelloFromPSP", strlen("HelloFromPSP"), AESKey, IV, encrypted);
chris9606
  • 1
  • 1
  • 1
    `newS` is an indeterminate pointer and you're sending it as an out-parameter value to a function with the silly notion it expects to find a valid, writable region of appropriately sized memory a the address *you* gave it. Bonus: both the sprintf calls exceed their target buffer sizes by one extra `char`, also invoking undefined behavior. – WhozCraig Oct 14 '14 at 04:21
  • The sprintf calls are there solely for demonstration. How I have it originally coded is that the server picks the Key and IV RSA encrypts it and sends it to the client(and this process works and the keys are of valid length and work, tested with PC client). I somehow have managed to get this too work by doing what seems to be... nothing. I just reverted my code back to the original and it AES encrypted fine and sent the message to the server which it decrypted just fine. Odd. But I will go ahead and update my post with the fix. – chris9606 Oct 14 '14 at 06:50

0 Answers0