87 lines
2.5 KiB
C
87 lines
2.5 KiB
C
#include "crypt.h"
|
|
|
|
int openssl_encrypt(unsigned char *plaintext, int plaintext_len, unsigned char *key,
|
|
unsigned char *iv, unsigned char *ciphertext, int *ciphertext_len)
|
|
{
|
|
EVP_CIPHER_CTX *ctx;
|
|
|
|
int len;
|
|
|
|
/* Create and initialise the context */
|
|
if (!(ctx = EVP_CIPHER_CTX_new()))
|
|
return 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))
|
|
return 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))
|
|
return 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))
|
|
return 0;
|
|
*ciphertext_len += len;
|
|
|
|
/* Clean up */
|
|
EVP_CIPHER_CTX_free(ctx);
|
|
|
|
return 1;
|
|
}
|
|
|
|
int openssl_decrypt(unsigned char *ciphertext, int ciphertext_len, unsigned char *key,
|
|
unsigned char *iv, unsigned char *plaintext, int *plaintext_len)
|
|
{
|
|
EVP_CIPHER_CTX *ctx;
|
|
|
|
int len;
|
|
|
|
/* Create and initialise the context */
|
|
if (!(ctx = EVP_CIPHER_CTX_new()))
|
|
return 0;
|
|
|
|
/*
|
|
* Initialise the decryption 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_DecryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv))
|
|
return 0;
|
|
|
|
/*
|
|
* Provide the message to be decrypted, and obtain the plaintext output.
|
|
* EVP_DecryptUpdate can be called multiple times if necessary.
|
|
*/
|
|
if (1 != EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, ciphertext_len))
|
|
return 0;
|
|
*plaintext_len = len;
|
|
|
|
/*
|
|
* Finalise the decryption. Further plaintext bytes may be written at
|
|
* this stage.
|
|
*/
|
|
if (1 != EVP_DecryptFinal_ex(ctx, plaintext + len, &len))
|
|
return 0;
|
|
*plaintext_len += len;
|
|
|
|
/* Clean up */
|
|
EVP_CIPHER_CTX_free(ctx);
|
|
|
|
return 1;
|
|
} |