- ivoff = (u_char *)(esp + 1) + espsecret_xform->replaysize;
- ivlen = espsecret_xform->ivlen;
- secret = espsecret_key;
-
- switch (espsecret_xform->algo) {
- case DESCBC:
-#ifdef HAVE_LIBCRYPTO
- {
- u_char iv[8];
-#if OPENSSL_VERSION_NUMBER >= 0x00907000L
- DES_key_schedule schedule;
-#else
- des_key_schedule schedule;
-#endif
-
- switch (ivlen) {
- case 4:
- memcpy(iv, ivoff, 4);
- memcpy(&iv[4], ivoff, 4);
- p = &iv[4];
- *p++ ^= 0xff;
- *p++ ^= 0xff;
- *p++ ^= 0xff;
- *p++ ^= 0xff;
- break;
- case 8:
- memcpy(iv, ivoff, 8);
- break;
- default:
- goto fail;
- }
- p = ivoff + ivlen;
-
- if (espsecret_keylen != 8)
- goto fail;
-#if OPENSSL_VERSION_NUMBER >= 0x00907000L
- DES_set_key_unchecked((DES_cblock *)secret, schedule);
-
- DES_cbc_encrypt((const unsigned char *)p, p,
- (long)(ep - p), schedule, (DES_cblock *)iv,
- DES_DECRYPT);
-#else
- des_check_key = 0;
- des_set_key((void *)secret, schedule);
-
- des_cbc_encrypt((void *)p, (void *)p,
- (long)(ep - p), schedule, (void *)iv,
- DES_DECRYPT);
-#endif
- advance = ivoff - (u_char *)esp + ivlen;
- break;
- }
-#else
- goto fail;
-#endif /*HAVE_LIBCRYPTO*/
-
- case BLOWFISH:
-#ifdef HAVE_LIBCRYPTO
- {
- BF_KEY schedule;
-
- if (espsecret_keylen < 5 || espsecret_keylen > 56)
- goto fail;
- BF_set_key(&schedule, espsecret_keylen, secret);
-
- p = ivoff + ivlen;
- BF_cbc_encrypt(p, p, (long)(ep - p), &schedule, ivoff,
- BF_DECRYPT);
- advance = ivoff - (u_char *)esp + ivlen;
- break;
- }
-#else
- goto fail;
-#endif /*HAVE_LIBCRYPTO*/
-
- case RC5:
-#if defined(HAVE_LIBCRYPTO) && defined(HAVE_RC5_H)
- {
- RC5_32_KEY schedule;
-
- if (espsecret_keylen < 5 || espsecret_keylen > 255)
- goto fail;
- RC5_32_set_key(&schedule, espsecret_keylen, secret,
- RC5_16_ROUNDS);
-
- p = ivoff + ivlen;
- RC5_32_cbc_encrypt(p, p, (long)(ep - p), &schedule, ivoff,
- RC5_DECRYPT);
- advance = ivoff - (u_char *)esp + ivlen;
- break;
- }
-#else
- goto fail;
-#endif /*HAVE_LIBCRYPTO*/