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 <[email protected]>:
> 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 [email protected]
Automated List Manager [email protected]