AES/CFB8 with OpenSSL

Viewed 38

I recently started a small side-project to recreate the Minecraft Server in C++ but I stumbled on a problem. I need to use the AES/CFB8 Cipher according to this link with continuous updating (not finished and restarted every packet).

I surfed trough the internet to try to find a proper solution but could not figure out one that was actually working or it was using the command line interface. Any help is welcomed !

Cipher.h

class Cipher {
public:
    enum CipherType {
        ENCRYPT,
        DECRYPT
    };

private:
    EVP_CIPHER_CTX* ctx;
    CipherType type;
    bool hasFinished;

public:
    Cipher(const char* key, const char* iv, CipherType type);
    ~Cipher();

    int update(char* in, int inl, char* out);
    int final(char* out);

    int getMinimumBufLength(int size);
};

Cipher.cpp

Cipher::Cipher(const char* key, const char* iv, CipherType type) : type(type), hasFinished(false)
{
    ctx = EVP_CIPHER_CTX_new();
    EVP_CIPHER_CTX_init(ctx);

    if(type == CipherType::ENCRYPT)
        EVP_EncryptInit_ex(ctx, EVP_aes_256_cfb8(), nullptr, (unsigned char*)key, (unsigned char*)iv);
    else
        EVP_DecryptInit_ex(ctx, EVP_aes_256_cfb8(), nullptr, (unsigned char*)key, (unsigned char*)iv);
    
}

Cipher::~Cipher()
{
    EVP_CIPHER_CTX_free(ctx);
}

int Cipher::getMinimumBufLength(int size)
{
    return type == CipherType::DECRYPT ? size : size + AES_BLOCK_SIZE * 2;
}

int Cipher::update(char* in, int inl, char* out)
{
    int len;
    EVP_CipherUpdate(ctx, (unsigned char*)out, &len, (unsigned char*)in, inl);

    return len;
}

int Cipher::final(char* out)
{
    int len;
    EVP_EncryptFinal_ex(ctx, (unsigned char*)out, &len);

    return len;
}

Cipher-test.cpp

TEST_CASE("Cipher AES/CFB8") 
{
    char* key = "AAAAAAAAAZEFRGUINJFKDFIVJ";
    char* iv = "AUJVFEUB";
    Cipher encryptionCipher(key, iv, Cipher::CipherType::ENCRYPT);
    Cipher decryptionCipher(key, iv, Cipher::CipherType::DECRYPT);

    std::string data = "Hello World ! This is some soon to be encrypted string !";
    char encData[encryptionCipher.getMinimumBufLength(data.size() + 1)];
    int outLen = encryptionCipher.update(data.data(), data.size() + 1, encData);
    int fLen = encryptionCipher.final(encData + outLen);
    
    CHECK(data != std::string(encData));

    char decData[decryptionCipher.getMinimumBufLength(outLen + fLen)];
    outLen = decryptionCipher.update(encData, outLen + fLen, decData);
    decryptionCipher.final(decData + outLen);

    CHECK(data == std::string(decData));
}

Thanks in advance

EDIT: I am just wondering if there was a need for supplementary code because of the "continuous" aspect of the Cipher.

0 Answers
Related