abbadon@nuchat.UUCP (David Neal) (02/07/90)
From: abbadon@nuchat
Subject: DES on a Sun
I have two programs d1 and d2. They encrypt and decyrpt
DES encoded text. The work together, but des(1) encrypted
data on a Sun cannot be decypted by the included program, d2.
What the fuck? The only thing I can figure is Sun uses
a different ivec that what the man page suggests.
#include <stdio.h>
#include <des_crypt.h>
main()
{
FILE *fp;
char key[8], ivec[8];
char data[8192];
int des, i;
unsigned datsize, mode;
mode = DES_DECRYPT;
key[0] = 'g'; key[1] = 'a'; key[2] = 'd';
key[3] = 'f'; key[4] = 'l'; key[5] = 'y';
key[6] = '\0'; key[7] = '\0';
for ( i = 0; i < 8; i++ ) ivec[i] = 0;
des_setparity(key);
if ( (fp = fopen("foo.o", "r")) == (FILE *) NULL )
{
printf("can't open plain file.\n");
exit(0);
}
if ( (datsize = fread(data, sizeof(char), 8190, fp)) == 0)
{
printf("couldn't read file.\n");
fclose(fp);
exit(0);
}
printf("%d bytes read.\n", datsize);
if ( datsize % 8 != 0 )
{
int c;
int pad = 8 - (datsize % 8);
printf("Adding %d pad bytes.\n", pad);
for ( c = 0; c < pad; c++ )
data[datsize+c] = '0';
data[datsize+pad] = pad+'0';
datsize += pad;
printf("Datsize now %d or %d %% 8.\n", datsize, datsize % 8);
}
des = cbc_crypt(key, data, datsize, mode, ivec);
printf("des = %d\n", des);
printf("padbytes = %d\n", data[datsize+1]);
switch (des) {
case DESERR_NOHWDEVICE: printf("No hardwire des device.\n");
case DESERR_NONE: printf("All ok\n");
wdata(data, datsize);
break;
case DESERR_HWERROR: printf("Des hardware error.\n");
break;
case DESERR_BADPARAM: printf("Bad parameter passed.\n");
break;
}
fclose(fp);
exit(0);
}
wdata(data, datlen)
char *data;
unsigned datlen;
{
FILE *ofp;
int ret;
if ( (ofp = fopen("foo.d", "w")) == (FILE *) NULL )
{
perror("des: open: ");
exit(0);
}
if ( (ret = fwrite(data, sizeof(char), datlen, ofp)) == 0)
{
perror("des: write: ");
exit(0);
}
fclose(ofp);
}
abbadon@nuchat.UUCP