static int des_ede_ofb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, unsigned int inl) { DES_ede3_ofb64_encrypt(in, out, (long)inl, &data(ctx)->ks1, &data(ctx)->ks2, &data(ctx)->ks3, (DES_cblock *)ctx->iv, &ctx->num); return 1; }
void _ossl_old_des_ede3_ofb64_encrypt(unsigned char *in, unsigned char *out, long length, des_key_schedule ks1, des_key_schedule ks2, des_key_schedule ks3, _ossl_old_des_cblock *ivec, int *num) { DES_ede3_ofb64_encrypt(in, out, length, (DES_key_schedule *)ks1, (DES_key_schedule *)ks2, (DES_key_schedule *)ks3, ivec, num); }
int main(int argc, char *argv[]) { int j, err = 0; unsigned int i; DES_cblock in, out, outin, iv3; DES_key_schedule ks, ks2, ks3; unsigned char cbc_in[40]; unsigned char cbc_out[40]; DES_LONG cs; unsigned char cret[8]; DES_LONG lqret[4]; int num; char *str; printf("Doing ecb\n"); for (i = 0; i < NUM_TESTS; i++) { DES_set_key_unchecked(&key_data[i], &ks); memcpy(in, plain_data[i], 8); memset(out, 0, 8); memset(outin, 0, 8); DES_ecb_encrypt(&in, &out, &ks, DES_ENCRYPT); DES_ecb_encrypt(&out, &outin, &ks, DES_DECRYPT); if (memcmp(out, cipher_data[i], 8) != 0) { printf("Encryption error %2d\nk=%s p=%s o=%s act=%s\n", i + 1, pt(key_data[i]), pt(in), pt(cipher_data[i]), pt(out)); err = 1; } if (memcmp(in, outin, 8) != 0) { printf("Decryption error %2d\nk=%s p=%s o=%s act=%s\n", i + 1, pt(key_data[i]), pt(out), pt(in), pt(outin)); err = 1; } } # ifndef LIBDES_LIT printf("Doing ede ecb\n"); for (i = 0; i < (NUM_TESTS - 2); i++) { DES_set_key_unchecked(&key_data[i], &ks); DES_set_key_unchecked(&key_data[i + 1], &ks2); DES_set_key_unchecked(&key_data[i + 2], &ks3); memcpy(in, plain_data[i], 8); memset(out, 0, 8); memset(outin, 0, 8); DES_ecb3_encrypt(&in,&out,&ks,&ks2,&ks,DES_ENCRYPT); DES_ecb3_encrypt(&out,&outin,&ks,&ks2,&ks,DES_DECRYPT); if (memcmp(out, cipher_ecb2[i], 8) != 0) { printf("Encryption error %2d\nk=%s p=%s o=%s act=%s\n", i + 1, pt(key_data[i]), pt(in), pt(cipher_ecb2[i]), pt(out)); err = 1; } if (memcmp(in, outin, 8) != 0) { printf("Decryption error %2d\nk=%s p=%s o=%s act=%s\n", i + 1, pt(key_data[i]), pt(out), pt(in), pt(outin)); err = 1; } } # endif printf("Doing cbc\n"); if ((j = DES_set_key_checked(&cbc_key, &ks)) != 0) { printf("Key error %d\n", j); err = 1; } memset(cbc_out, 0, 40); memset(cbc_in, 0, 40); memcpy(iv3, cbc_iv, sizeof(cbc_iv)); DES_ncbc_encrypt(cbc_data, cbc_out, strlen((char *)cbc_data) + 1, &ks, &iv3, DES_ENCRYPT); if (memcmp(cbc_out, cbc_ok, 32) != 0) { printf("cbc_encrypt encrypt error\n"); err = 1; } memcpy(iv3, cbc_iv, sizeof(cbc_iv)); DES_ncbc_encrypt(cbc_out, cbc_in, strlen((char *)cbc_data) + 1, &ks, &iv3, DES_DECRYPT); if (memcmp(cbc_in, cbc_data, strlen((char *)cbc_data)) != 0) { printf("cbc_encrypt decrypt error\n"); err = 1; } # ifndef LIBDES_LIT printf("Doing desx cbc\n"); if ((j = DES_set_key_checked(&cbc_key, &ks)) != 0) { printf("Key error %d\n", j); err = 1; } memset(cbc_out, 0, 40); memset(cbc_in, 0, 40); memcpy(iv3, cbc_iv, sizeof(cbc_iv)); DES_xcbc_encrypt(cbc_data, cbc_out, strlen((char *)cbc_data) + 1, &ks, &iv3, &cbc2_key, &cbc3_key, DES_ENCRYPT); if (memcmp(cbc_out, xcbc_ok, 32) != 0) { printf("des_xcbc_encrypt encrypt error\n"); err = 1; } memcpy(iv3, cbc_iv, sizeof(cbc_iv)); DES_xcbc_encrypt(cbc_out, cbc_in, strlen((char *)cbc_data) + 1, &ks, &iv3, &cbc2_key, &cbc3_key, DES_DECRYPT); if (memcmp(cbc_in, cbc_data, strlen((char *)cbc_data) + 1) != 0) { printf("des_xcbc_encrypt decrypt error\n"); err = 1; } # endif printf("Doing ede cbc\n"); if ((j = DES_set_key_checked(&cbc_key, &ks)) != 0) { printf("Key error %d\n", j); err = 1; } if ((j = DES_set_key_checked(&cbc2_key, &ks2)) != 0) { printf("Key error %d\n", j); err = 1; } if ((j = DES_set_key_checked(&cbc3_key, &ks3)) != 0) { printf("Key error %d\n", j); err = 1; } memset(cbc_out, 0, 40); memset(cbc_in, 0, 40); i = strlen((char *)cbc_data) + 1; /* i=((i+7)/8)*8; */ memcpy(iv3, cbc_iv, sizeof(cbc_iv)); DES_ede3_cbc_encrypt(cbc_data, cbc_out, 16L, &ks, &ks2, &ks3, &iv3, DES_ENCRYPT); DES_ede3_cbc_encrypt(&(cbc_data[16]), &(cbc_out[16]), i - 16, &ks, &ks2, &ks3, &iv3, DES_ENCRYPT); if (memcmp (cbc_out, cbc3_ok, (unsigned int)(strlen((char *)cbc_data) + 1 + 7) / 8 * 8) != 0) { unsigned int n; printf("des_ede3_cbc_encrypt encrypt error\n"); for (n = 0; n < i; ++n) printf(" %02x", cbc_out[n]); printf("\n"); for (n = 0; n < i; ++n) printf(" %02x", cbc3_ok[n]); printf("\n"); err = 1; } memcpy(iv3, cbc_iv, sizeof(cbc_iv)); DES_ede3_cbc_encrypt(cbc_out, cbc_in, i, &ks, &ks2, &ks3, &iv3, DES_DECRYPT); if (memcmp(cbc_in, cbc_data, strlen((char *)cbc_data) + 1) != 0) { unsigned int n; printf("DES_ede3_cbc_encrypt decrypt error\n"); for (n = 0; n < i; ++n) printf(" %02x", cbc_data[n]); printf("\n"); for (n = 0; n < i; ++n) printf(" %02x", cbc_in[n]); printf("\n"); err = 1; } # ifndef LIBDES_LIT printf("Doing pcbc\n"); if ((j = DES_set_key_checked(&cbc_key, &ks)) != 0) { printf("Key error %d\n", j); err = 1; } memset(cbc_out, 0, 40); memset(cbc_in, 0, 40); DES_pcbc_encrypt(cbc_data, cbc_out, strlen((char *)cbc_data) + 1, &ks, &cbc_iv, DES_ENCRYPT); if (memcmp(cbc_out, pcbc_ok, 32) != 0) { printf("pcbc_encrypt encrypt error\n"); err = 1; } DES_pcbc_encrypt(cbc_out, cbc_in, strlen((char *)cbc_data) + 1, &ks, &cbc_iv, DES_DECRYPT); if (memcmp(cbc_in, cbc_data, strlen((char *)cbc_data) + 1) != 0) { printf("pcbc_encrypt decrypt error\n"); err = 1; } printf("Doing "); printf("cfb8 "); err += cfb_test(8, cfb_cipher8); printf("cfb16 "); err += cfb_test(16, cfb_cipher16); printf("cfb32 "); err += cfb_test(32, cfb_cipher32); printf("cfb48 "); err += cfb_test(48, cfb_cipher48); printf("cfb64 "); err += cfb_test(64, cfb_cipher64); printf("cfb64() "); err += cfb64_test(cfb_cipher64); memcpy(cfb_tmp, cfb_iv, sizeof(cfb_iv)); for (i = 0; i < sizeof(plain); i++) DES_cfb_encrypt(&(plain[i]), &(cfb_buf1[i]), 8, 1, &ks, &cfb_tmp, DES_ENCRYPT); if (memcmp(cfb_cipher8, cfb_buf1, sizeof(plain)) != 0) { printf("cfb_encrypt small encrypt error\n"); err = 1; } memcpy(cfb_tmp, cfb_iv, sizeof(cfb_iv)); for (i = 0; i < sizeof(plain); i++) DES_cfb_encrypt(&(cfb_buf1[i]), &(cfb_buf2[i]), 8, 1, &ks, &cfb_tmp, DES_DECRYPT); if (memcmp(plain, cfb_buf2, sizeof(plain)) != 0) { printf("cfb_encrypt small decrypt error\n"); err = 1; } printf("ede_cfb64() "); err += ede_cfb64_test(cfb_cipher64); printf("done\n"); printf("Doing ofb\n"); DES_set_key_checked(&ofb_key, &ks); memcpy(ofb_tmp, ofb_iv, sizeof(ofb_iv)); DES_ofb_encrypt(plain, ofb_buf1, 64, sizeof(plain) / 8, &ks, &ofb_tmp); if (memcmp(ofb_cipher, ofb_buf1, sizeof(ofb_buf1)) != 0) { printf("ofb_encrypt encrypt error\n"); printf("%02X %02X %02X %02X %02X %02X %02X %02X\n", ofb_buf1[8 + 0], ofb_buf1[8 + 1], ofb_buf1[8 + 2], ofb_buf1[8 + 3], ofb_buf1[8 + 4], ofb_buf1[8 + 5], ofb_buf1[8 + 6], ofb_buf1[8 + 7]); printf("%02X %02X %02X %02X %02X %02X %02X %02X\n", ofb_buf1[8 + 0], ofb_cipher[8 + 1], ofb_cipher[8 + 2], ofb_cipher[8 + 3], ofb_buf1[8 + 4], ofb_cipher[8 + 5], ofb_cipher[8 + 6], ofb_cipher[8 + 7]); err = 1; } memcpy(ofb_tmp, ofb_iv, sizeof(ofb_iv)); DES_ofb_encrypt(ofb_buf1, ofb_buf2, 64, sizeof(ofb_buf1) / 8, &ks, &ofb_tmp); if (memcmp(plain, ofb_buf2, sizeof(ofb_buf2)) != 0) { printf("ofb_encrypt decrypt error\n"); printf("%02X %02X %02X %02X %02X %02X %02X %02X\n", ofb_buf2[8 + 0], ofb_buf2[8 + 1], ofb_buf2[8 + 2], ofb_buf2[8 + 3], ofb_buf2[8 + 4], ofb_buf2[8 + 5], ofb_buf2[8 + 6], ofb_buf2[8 + 7]); printf("%02X %02X %02X %02X %02X %02X %02X %02X\n", plain[8 + 0], plain[8 + 1], plain[8 + 2], plain[8 + 3], plain[8 + 4], plain[8 + 5], plain[8 + 6], plain[8 + 7]); err = 1; } printf("Doing ofb64\n"); DES_set_key_checked(&ofb_key, &ks); memcpy(ofb_tmp, ofb_iv, sizeof(ofb_iv)); memset(ofb_buf1, 0, sizeof(ofb_buf1)); memset(ofb_buf2, 0, sizeof(ofb_buf1)); num = 0; for (i = 0; i < sizeof(plain); i++) { DES_ofb64_encrypt(&(plain[i]), &(ofb_buf1[i]), 1, &ks, &ofb_tmp, &num); } if (memcmp(ofb_cipher, ofb_buf1, sizeof(ofb_buf1)) != 0) { printf("ofb64_encrypt encrypt error\n"); err = 1; } memcpy(ofb_tmp, ofb_iv, sizeof(ofb_iv)); num = 0; DES_ofb64_encrypt(ofb_buf1, ofb_buf2, sizeof(ofb_buf1), &ks, &ofb_tmp, &num); if (memcmp(plain, ofb_buf2, sizeof(ofb_buf2)) != 0) { printf("ofb64_encrypt decrypt error\n"); err = 1; } printf("Doing ede_ofb64\n"); DES_set_key_checked(&ofb_key, &ks); memcpy(ofb_tmp, ofb_iv, sizeof(ofb_iv)); memset(ofb_buf1, 0, sizeof(ofb_buf1)); memset(ofb_buf2, 0, sizeof(ofb_buf1)); num = 0; for (i = 0; i < sizeof(plain); i++) { DES_ede3_ofb64_encrypt(&(plain[i]), &(ofb_buf1[i]), 1, &ks, &ks, &ks, &ofb_tmp, &num); } if (memcmp(ofb_cipher, ofb_buf1, sizeof(ofb_buf1)) != 0) { printf("ede_ofb64_encrypt encrypt error\n"); err = 1; } memcpy(ofb_tmp, ofb_iv, sizeof(ofb_iv)); num = 0; DES_ede3_ofb64_encrypt(ofb_buf1, ofb_buf2, sizeof(ofb_buf1), &ks, &ks, &ks, &ofb_tmp, &num); if (memcmp(plain, ofb_buf2, sizeof(ofb_buf2)) != 0) { printf("ede_ofb64_encrypt decrypt error\n"); err = 1; } printf("Doing cbc_cksum\n"); DES_set_key_checked(&cbc_key, &ks); cs = DES_cbc_cksum(cbc_data, &cret, strlen((char *)cbc_data), &ks, &cbc_iv); if (cs != cbc_cksum_ret) { printf("bad return value (%08lX), should be %08lX\n", (unsigned long)cs, (unsigned long)cbc_cksum_ret); err = 1; } if (memcmp(cret, cbc_cksum_data, 8) != 0) { printf("bad cbc_cksum block returned\n"); err = 1; } printf("Doing quad_cksum\n"); cs = DES_quad_cksum(cbc_data, (DES_cblock *)lqret, (long)strlen((char *)cbc_data), 2, (DES_cblock *)cbc_iv); if (cs != 0x70d7a63aL) { printf("quad_cksum error, ret %08lx should be 70d7a63a\n", (unsigned long)cs); err = 1; } if (lqret[0] != 0x327eba8dL) { printf("quad_cksum error, out[0] %08lx is not %08lx\n", (unsigned long)lqret[0], 0x327eba8dUL); err = 1; } if (lqret[1] != 0x201a49ccL) { printf("quad_cksum error, out[1] %08lx is not %08lx\n", (unsigned long)lqret[1], 0x201a49ccUL); err = 1; } if (lqret[2] != 0x70d7a63aL) { printf("quad_cksum error, out[2] %08lx is not %08lx\n", (unsigned long)lqret[2], 0x70d7a63aUL); err = 1; } if (lqret[3] != 0x501c2c26L) { printf("quad_cksum error, out[3] %08lx is not %08lx\n", (unsigned long)lqret[3], 0x501c2c26UL); err = 1; } # endif printf("input word alignment test"); for (i = 0; i < 4; i++) { printf(" %d", i); DES_ncbc_encrypt(&(cbc_out[i]), cbc_in, strlen((char *)cbc_data) + 1, &ks, &cbc_iv, DES_ENCRYPT); } printf("\noutput word alignment test"); for (i = 0; i < 4; i++) { printf(" %d", i); DES_ncbc_encrypt(cbc_out, &(cbc_in[i]), strlen((char *)cbc_data) + 1, &ks, &cbc_iv, DES_ENCRYPT); } printf("\n"); printf("fast crypt test "); str = crypt("testing", "ef"); if (strcmp("efGnQx2725bI2", str) != 0) { printf("fast crypt error, %s should be efGnQx2725bI2\n", str); err = 1; } str = crypt("bca76;23", "yA"); if (strcmp("yA1Rp/1hZXIJk", str) != 0) { printf("fast crypt error, %s should be yA1Rp/1hZXIJk\n", str); err = 1; } printf("\n"); return (err); }
/* v0=ti[0]; v1=ti[1];*/ iv = &(*ivec)[0]; l2c(v0,iv); l2c(v1,iv); } v0=v1=ti[0]=ti[1]=0; *num=n; } #ifdef undef /* MACRO */ void DES_ede2_ofb64_encrypt(register unsigned char *in, register unsigned char *out, long length, DES_key_schedule k1, DES_key_schedule k2, DES_cblock (*ivec), int *num) { DES_ede3_ofb64_encrypt(in, out, length, k1,k2,k1, ivec, num); }