summaryrefslogtreecommitdiffstats
path: root/eBones/des/3cbc_enc.c
blob: 1f64502e995418bb2d4bcce2672668d13556caf3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
/* 3cbc_enc.c */
/* Copyright (C) 1993 Eric Young - see README for more details */

/*-
 *	$Id: 3cbc_enc.c,v 1.1.1.1 1994/09/30 14:49:50 csgr Exp $
 */

#include "des_locl.h"

void
xp(a)
unsigned char *a;
{ int i; for(i=0; i<8; i++) printf("%02X",a[i]);printf("\n");}

int des_3cbc_encrypt(input,output,length,ks1,ks2,iv1,iv2,encrypt)
des_cblock *input;
des_cblock *output;
long length;
des_key_schedule ks1,ks2;
des_cblock *iv1,*iv2;
int encrypt;
	{
	int off=length/8-1;
	des_cblock niv1,niv2;

printf("3cbc\n");
xp(iv1);
xp(iv1);
xp(iv2);
xp(input);
	if (encrypt == DES_ENCRYPT)
		{
		des_cbc_encrypt(input,output,length,ks1,iv1,encrypt);
		if (length >= sizeof(des_cblock))
			bcopy(output[off],niv1,sizeof(des_cblock));
		des_cbc_encrypt(output,output,length,ks2,iv1,!encrypt);
		des_cbc_encrypt(output,output,length,ks1,iv2, encrypt);
		if (length >= sizeof(des_cblock))
			bcopy(output[off],niv2,sizeof(des_cblock));
		bcopy(niv1,*iv1,sizeof(des_cblock));
		}
	else
		{
		if (length >= sizeof(des_cblock))
			bcopy(input[off],niv1,sizeof(des_cblock));
		des_cbc_encrypt(input,output,length,ks1,iv1,encrypt);
		des_cbc_encrypt(output,output,length,ks2,iv2,!encrypt);
		if (length >= sizeof(des_cblock))
			bcopy(output[off],niv2,sizeof(des_cblock));
		des_cbc_encrypt(output,output,length,ks1,iv2, encrypt);
		}
	bcopy(niv1,iv1,sizeof(des_cblock));
	bcopy(niv2,iv2,sizeof(des_cblock));
xp(iv1);
xp(iv1);
xp(iv2);
xp(output);
	return(0);
	}

OpenPOWER on IntegriCloud