No, it doesn't work on Linux either, if I link my test program using
OpenSSL 1.0.0e.

The test program works on Linux if I link it differently.

$ ldd blowfish
        libcrypto.so.1 => /usr/lib/libcrypto.so.1 (0x40022000)
        libc.so.6 => /lib/i686/libc.so.6 (0x400de000)
        libdl.so.2 => /lib/libdl.so.2 (0x4020e000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)


 /usr/lib/libcrypto.so -> libcrypto.so.0.9.6

Is this a bug?

Jussi

2011/11/24 Jussi Peltonen <pelt...@gmail.com>:
> Hello,
>
> newbie question regarding the Blowfish algorithm: why do my
> encrypt/decypt functions fail on Windows XP SP3 with OpenSSL 1.0.0e?
> The same functions work on my Linux workstation.
>
> Windows output:
> ============
> Encrypt:
> encrypting 7680 bytes
> EVP_DecryptUpdate 1024 bytes
> EVP_DecryptFinal 8 bytes
> EVP_DecryptUpdate 1024 bytes
> EVP_DecryptFinal 8 bytes
> EVP_DecryptUpdate 1024 bytes
> EVP_DecryptFinal 8 bytes
> EVP_DecryptUpdate 1024 bytes
> EVP_DecryptFinal 8 bytes
> EVP_DecryptUpdate 1024 bytes
> EVP_DecryptFinal 8 bytes
> EVP_DecryptUpdate 1024 bytes
> EVP_DecryptFinal 8 bytes
> EVP_DecryptUpdate 1024 bytes
> EVP_DecryptFinal 8 bytes
> EVP_DecryptUpdate 512 bytes
> EVP_DecryptFinal 8 bytes
> encrypted 7744 bytes
>
> Decrypt:
> decrypting 7744 bytes
> EVP_DecryptUpdate 1024 bytes
> EVP_DecryptFinal 0 bytes
> EVP_DecryptUpdate 1032 bytes        <= why 1032 instead of 1024?
> EVP_DecryptFinal 0 bytes
> EVP_DecryptUpdate 1032 bytes
> EVP_DecryptFinal 0 bytes
> EVP_DecryptUpdate 1032 bytes
> EVP_DecryptFinal 0 bytes
> EVP_DecryptUpdate 1032 bytes
> EVP_DecryptFinal 0 bytes
> EVP_DecryptUpdate 1032 bytes
> EVP_DecryptFinal 0 bytes
> EVP_DecryptUpdate 1032 bytes
> EVP_DecryptFinal 0 bytes
> EVP_DecryptUpdate 520 bytes
> EVP_DecryptFinal 0 bytes
> decrypted 7736 bytes
>
> Linux output:
> ==========
> encrypting 7680 bytes
> EVP_DecryptUpdate 1024 bytes
> EVP_DecryptFinal 8 bytes
> EVP_DecryptUpdate 1024 bytes
> EVP_DecryptFinal 8 bytes
> EVP_DecryptUpdate 1024 bytes
> EVP_DecryptFinal 8 bytes
> EVP_DecryptUpdate 1024 bytes
> EVP_DecryptFinal 8 bytes
> EVP_DecryptUpdate 1024 bytes
> EVP_DecryptFinal 8 bytes
> EVP_DecryptUpdate 1024 bytes
> EVP_DecryptFinal 8 bytes
> EVP_DecryptUpdate 1024 bytes
> EVP_DecryptFinal 8 bytes
> EVP_DecryptUpdate 512 bytes
> EVP_DecryptFinal 8 bytes
> encrypted 7744 bytes
>
> decrypting 7744 bytes
> EVP_DecryptUpdate 1024 bytes
> EVP_DecryptFinal 0 bytes
> EVP_DecryptUpdate 1024 bytes
> EVP_DecryptFinal 0 bytes
> EVP_DecryptUpdate 1024 bytes
> EVP_DecryptFinal 0 bytes
> EVP_DecryptUpdate 1024 bytes
> EVP_DecryptFinal 0 bytes
> EVP_DecryptUpdate 1024 bytes
> EVP_DecryptFinal 0 bytes
> EVP_DecryptUpdate 1024 bytes
> EVP_DecryptFinal 0 bytes
> EVP_DecryptUpdate 1024 bytes
> EVP_DecryptFinal 0 bytes
> EVP_DecryptUpdate 512 bytes
> EVP_DecryptFinal 0 bytes
> decrypted 7680 bytes
>
>
> Source code:
>
> static int
> decrypt (unsigned char *inbuf, int size, unsigned char *outbuf,
>                 int *outsz)
> {
>        int olen, tlen, n, left;
>        unsigned char *inp = inbuf;
>        unsigned char *outp = outbuf;
>        EVP_CIPHER_CTX ctx;
>
>        printf("decrypting %d bytes\n", size);
>
>        EVP_CIPHER_CTX_init (&ctx);
>        EVP_DecryptInit (&ctx, EVP_bf_cbc (), key, iv);
>
>        left = size;
>        *outsz = 0;
>
>        while (left > 0)
>        {
>                n = (left > OP_SIZE ? OP_SIZE : left);
>                olen = 0;
>                memset((void *)outp, 0, IP_SIZE);
>                if (EVP_DecryptUpdate (&ctx, outp, &olen, inp, n) != 1)
>                {
>                        return -1;
>                }
>                printf("EVP_DecryptUpdate %d bytes\n", olen);
>
>                if (EVP_DecryptFinal (&ctx, outp + olen, &tlen) != 1)
>                {
>                        return -1;
>                }
>                printf("EVP_DecryptFinal %d bytes\n", tlen);
>
>                *outsz = ((*outsz) + olen + tlen);
>                inp += n;
>                left -= n;
>                outp += (olen + tlen);
>        }
>
>        printf("decrypted %d bytes\n", *outsz);
>
>        EVP_CIPHER_CTX_cleanup (&ctx);
>        return 0;
> }
>
> static int
> encrypt (unsigned char *inbuf, int size, unsigned char *outbuf, int *outsz)
> {
>        int olen, tlen, n, left;
>        unsigned char *inp = inbuf;
>        unsigned char *outp = outbuf;
>        EVP_CIPHER_CTX ctx;
>
>        printf("encrypting %d bytes\n", size);
>
>        EVP_CIPHER_CTX_init (&ctx);
>        EVP_EncryptInit (&ctx, EVP_bf_cbc (), key, iv);
>
>
>        left = size;
>        *outsz = 0;
>
>        while (left > 0)
>        {
>                n = (left > IP_SIZE ? IP_SIZE : left);
>                olen = 0;
>                if (EVP_EncryptUpdate (&ctx, outp, &olen, inp, n) != 1)
>                {
>                        return -1;
>                }
>                printf("EVP_DecryptUpdate %d bytes\n", olen);
>
>                if (EVP_EncryptFinal (&ctx, outp + olen, &tlen) != 1)
>                {
>                        return -1;
>                }
>                printf("EVP_DecryptFinal %d bytes\n", tlen);
>
>                *outsz = ((*outsz) + olen + tlen);
>                inp += n;
>                left -= n;
>                outp += (olen + tlen);
>        }
>
>        printf("encrypted %d bytes\n", *outsz);
>
>        EVP_CIPHER_CTX_cleanup (&ctx);
>        return 0;
> }
>
> Cheers,
> Jussi
>
______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
User Support Mailing List                    openssl-users@openssl.org
Automated List Manager                           majord...@openssl.org

Reply via email to