- 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*/
-
- case CAST128:
-#if defined(HAVE_LIBCRYPTO) && defined(HAVE_CAST_H) && !defined(HAVE_BUGGY_CAST128)
- {
- CAST_KEY schedule;
-
- if (espsecret_keylen < 5 || espsecret_keylen > 16)
- goto fail;
- CAST_set_key(&schedule, espsecret_keylen, secret);
-
- p = ivoff + ivlen;
- CAST_cbc_encrypt(p, p, (long)(ep - p), &schedule, ivoff,
- CAST_DECRYPT);
- advance = ivoff - (u_char *)esp + ivlen;
- 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(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");
- }
-
- 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) + espsecret_xform->replaysize;
- break;
- }
-
- ep = ep - espsecret_xform->authlen;