105186eeee
(Including all changes for FreeBSD - importing the original eBones distribution would be too complex at this stage, since I don't have access to Piero's CVS.) (If you want to include eBones in your system, don't forget to include MAKE_EBONES in /etc/make.conf.) (This stuff is now also suppable from braae.ru.ac.za.) Bones originally from MIT SIPB. Original port to FreeBSD 1.x by Piero Serini. Moved to FreeBSD 2.0 by Doug Rabson and Geoff Rehmet. Nice bug fixes from Doug Rabson.
124 lines
2.5 KiB
C
124 lines
2.5 KiB
C
/* ecb_enc.c */
|
|
/* Copyright (C) 1993 Eric Young - see README for more details */
|
|
|
|
/*-
|
|
* $Id: ecb_enc.c,v 1.2 1994/07/19 19:21:53 g89r4222 Exp $
|
|
*/
|
|
|
|
#include "des_locl.h"
|
|
#include "spr.h"
|
|
|
|
int des_ecb_encrypt(input,output,ks,encrypt)
|
|
des_cblock *input;
|
|
des_cblock *output;
|
|
des_key_schedule ks;
|
|
int encrypt;
|
|
{
|
|
register unsigned long l0,l1;
|
|
register unsigned char *in,*out;
|
|
unsigned long ll[2];
|
|
|
|
in=(unsigned char *)input;
|
|
out=(unsigned char *)output;
|
|
c2l(in,l0);
|
|
c2l(in,l1);
|
|
ll[0]=l0;
|
|
ll[1]=l1;
|
|
des_encrypt(ll,ll,ks,encrypt);
|
|
l0=ll[0];
|
|
l1=ll[1];
|
|
l2c(l0,out);
|
|
l2c(l1,out);
|
|
l0=l1=ll[0]=ll[1]=0;
|
|
return(0);
|
|
}
|
|
|
|
int des_encrypt(input,output,ks,encrypt)
|
|
unsigned long *input;
|
|
unsigned long *output;
|
|
des_key_schedule ks;
|
|
int encrypt;
|
|
{
|
|
register unsigned long l,r,t,u;
|
|
#ifdef ALT_ECB
|
|
register unsigned char *des_SP=(unsigned char *)des_SPtrans;
|
|
#endif
|
|
#ifdef MSDOS
|
|
union fudge {
|
|
unsigned long l;
|
|
unsigned short s[2];
|
|
unsigned char c[4];
|
|
} U,T;
|
|
#endif
|
|
register int i;
|
|
register unsigned long *s;
|
|
|
|
l=input[0];
|
|
r=input[1];
|
|
|
|
/* do IP */
|
|
PERM_OP(r,l,t, 4,0x0f0f0f0f);
|
|
PERM_OP(l,r,t,16,0x0000ffff);
|
|
PERM_OP(r,l,t, 2,0x33333333);
|
|
PERM_OP(l,r,t, 8,0x00ff00ff);
|
|
PERM_OP(r,l,t, 1,0x55555555);
|
|
/* r and l are reversed - remember that :-) - fix
|
|
* it in the next step */
|
|
|
|
/* Things have been modified so that the initial rotate is
|
|
* done outside the loop. This required the
|
|
* des_SPtrans values in sp.h to be rotated 1 bit to the right.
|
|
* One perl script later and things have a 5% speed up on a sparc2.
|
|
* Thanks to Richard Outerbridge <71755.204@CompuServe.COM>
|
|
* for pointing this out. */
|
|
t=(r<<1)|(r>>31);
|
|
r=(l<<1)|(l>>31);
|
|
l=t;
|
|
|
|
/* clear the top bits on machines with 8byte longs */
|
|
l&=0xffffffff;
|
|
r&=0xffffffff;
|
|
|
|
s=(unsigned long *)ks;
|
|
/* I don't know if it is worth the effort of loop unrolling the
|
|
* inner loop */
|
|
if (encrypt)
|
|
{
|
|
for (i=0; i<32; i+=4)
|
|
{
|
|
D_ENCRYPT(l,r,i+0); /* 1 */
|
|
D_ENCRYPT(r,l,i+2); /* 2 */
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (i=30; i>0; i-=4)
|
|
{
|
|
D_ENCRYPT(l,r,i-0); /* 16 */
|
|
D_ENCRYPT(r,l,i-2); /* 15 */
|
|
}
|
|
}
|
|
l=(l>>1)|(l<<31);
|
|
r=(r>>1)|(r<<31);
|
|
/* clear the top bits on machines with 8byte longs */
|
|
l&=0xffffffff;
|
|
r&=0xffffffff;
|
|
|
|
/* swap l and r
|
|
* we will not do the swap so just remember they are
|
|
* reversed for the rest of the subroutine
|
|
* luckily FP fixes this problem :-) */
|
|
|
|
PERM_OP(r,l,t, 1,0x55555555);
|
|
PERM_OP(l,r,t, 8,0x00ff00ff);
|
|
PERM_OP(r,l,t, 2,0x33333333);
|
|
PERM_OP(l,r,t,16,0x0000ffff);
|
|
PERM_OP(r,l,t, 4,0x0f0f0f0f);
|
|
|
|
output[0]=l;
|
|
output[1]=r;
|
|
l=r=t=u=0;
|
|
return(0);
|
|
}
|
|
|