Hi,
After a bit of web research I came up with the program below to try to get a bowfish function working. The examples online all seem to be for file stream input rather than for simple char buffers. The program fails when I try to decrypt an encrypted buffer and fails on the EVP_CipherFinal_ex() call.
Anyone able to help me get this working ?
Regards,
Emyr

#include <string.h>

#include <openssl/evp.h>
#include <openssl/buffer.h>

int do_crypt(unsigned char *inbuf, int inlen, unsigned char *outbuf, int *outlen, int do_encrypt) {
    printf("do encrypt=%d\n",do_encrypt);
    printf("inlen=%d\n",inlen);
    printf("outlen=%d\n",inlen+EVP_MAX_BLOCK_LENGTH);
    outbuf=(unsigned char*) malloc(inlen+EVP_MAX_BLOCK_LENGTH);
    int tmplen=0;
    unsigned char key[] = "0123456789";
    unsigned char iv[] = "12345678";
    EVP_CIPHER_CTX ctx;
    EVP_CIPHER_CTX_init(&ctx);
    EVP_CipherInit_ex(&ctx, EVP_bf_cbc(), NULL, NULL, NULL, do_encrypt);
    EVP_CIPHER_CTX_set_key_length(&ctx, 10);
    EVP_CipherInit_ex(&ctx, NULL, NULL, key, iv, do_encrypt);
    if(!EVP_CipherUpdate(&ctx, outbuf, outlen, inbuf, inlen)) {
        /* Error */
        printf("* update failed *\n");
        EVP_CIPHER_CTX_cleanup(&ctx);
        return 0;
    }
    int db=*outlen;
    printf("db=%d\n",db);
    if(!EVP_CipherFinal_ex(&ctx, outbuf+db, &tmplen)) {
        /* Error */
        printf("* finalise failed *\n");
        EVP_CIPHER_CTX_cleanup(&ctx);
        return 0;
    }
    printf("tmplen=%d\n",tmplen);
    (*outlen)=db+tmplen;
    EVP_CIPHER_CTX_cleanup(&ctx);
    return 1;
}

int main(int argc, char **argv) {
    char *plain="the quick brown fox jumps over the lazy dog";
    int plain_len=strlen(plain);
    printf("plain_len=%d\n",plain_len);
    unsigned char *cipher;
    int cipher_len;
    printf("***** ENCRYPT *****\n");
if (!do_crypt((unsigned char*) plain, strlen(plain), cipher, &cipher_len, 1)) {
        printf("failed to encrypt\n");
        return 1;
    }
    printf("cipher_len=%d\n",cipher_len);
    char *decrypt;
    int decrypt_len;
    printf("***** DECRYPT *****\n");
    if(!do_crypt(cipher, cipher_len, decrypt, &decrypt_len, 0)) {
        printf("failed to decrypt\n");
        return 1;
    }
    printf("decrypt=\"%s\"\n",decrypt);
    printf("decrypt_len=%d\n",decrypt_len);
    return 0;
}
______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
User Support Mailing List                    openssl-users@openssl.org
Automated List Manager                           majord...@openssl.org

Reply via email to