- break;
- }
-#else
- goto fail;
-#endif /*HAVE_LIBCRYPTO*/
-
- case DES3CBC:
-#if defined(HAVE_LIBCRYPTO)
- {
-#if OPENSSL_VERSION_NUMBER >= 0x00907000L
- DES_key_schedule s1, s2, s3;
-
- if (espsecret_keylen != 24)
- goto fail;
- DES_set_odd_parity((DES_cblock *)secret);
- DES_set_odd_parity((DES_cblock *)(secret + 8));
- DES_set_odd_parity((DES_cblock *)(secret + 16));
-#if OPENSSL_VERSION_NUMBER >= 0x00908000L
- if (DES_set_key_checked((const_DES_cblock *)secret, &s1) != 0)
- printf("failed to schedule key 1\n");
- if (DES_set_key_checked((const_DES_cblock *)(secret + 8), &s2) != 0)
- printf("failed to schedule key 2\n");
- if (DES_set_key_checked((const_DES_cblock *)(secret + 16), &s3) != 0)
- printf("failed to schedule key 3\n");
-#else
- if (DES_set_key_checked((DES_cblock *)secret, s1) != 0)
- printf("failed to schedule key 1\n");
- if (DES_set_key_checked((DES_cblock *)(secret + 8), s2) != 0)
- printf("failed to schedule key 2\n");
- if (DES_set_key_checked((DES_cblock *)(secret + 16), s3) != 0)
- printf("failed to schedule key 3\n");
-#endif
-
- p = ivoff + ivlen;
- DES_ede3_cbc_encrypt((const unsigned char *)p, p,
- (long)(ep - p), &s1, &s2, &s3, (DES_cblock *)ivoff,
- DES_DECRYPT);
-#else
- des_key_schedule s1, s2, s3;
-
- if (espsecret_keylen != 24)
- goto fail;
- des_check_key = 1;
- des_set_odd_parity((void *)secret);
- des_set_odd_parity((void *)(secret + 8));
- des_set_odd_parity((void *)(secret + 16));
- if (des_set_key((void *)secret, s1) != 0)
- printf("failed to schedule key 1\n");
- if (des_set_key((void *)(secret + 8), s2) != 0)
- printf("failed to schedule key 2\n");
- if (des_set_key((void *)(secret + 16), s3) != 0)
- printf("failed to schedule key 3\n");
-
- p = ivoff + ivlen;
- des_ede3_cbc_encrypt((void *)p, (void *)p,
- (long)(ep - p), s1, s2, s3, (void *)ivoff, DES_DECRYPT);
-#endif
- advance = ivoff - (u_char *)esp + ivlen;
- break;
- }
-#else
- goto fail;
-#endif /*HAVE_LIBCRYPTO*/
-
- case NONE:
- default:
- advance = sizeof(struct newesp) + sa->xform->replaysize;
- break;
- }