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