Re: Making KLIPS 1 asynchronous to support H/W crypto

Richard Guy Briggs <[email protected]> Tue, 4 Mar 2003 14:19:20 -0500
Newsgroups gmane.network.freeswan.devel
Message-ID <[email protected]>
On Mon, Mar 03, 2003 at 03:44:06PM +0100, Arthur van Leeuwen wrote:
> Hello,

Hi Arthur,

> in the search for the elusive hardware encryption for FreeS/WAN I have
> been trying to redo the Colubris hardware encryption patch for
> FreeS/WAN 1.91 with FreeS/WAN 2.00(-rc1).

Cool.

> I decided to try and do it `the right way'. This involved basically
> making KLIPS 1 support asynchronous encryption operations, and then
> making the minimal changes necessary to offload the actual encryption
> to Martin Gadbois' cryptolib.
> 
> The idea of making KLIPS 1 support asynchronous encryption is that of
> breaking up loops and basic blocks in which encryption can take place
> and allow re-entry from a callback.
> 
> This is accomplished by keeping the decrypting function's state not on
> the stack but on the heap and passing pointers to it around.
> 
> Fortunately, for ipsec_rcv in linux/net/ipsec/ipsec_rcv.c this is
> already partially done by encapsulating almost all necessary state in
> an ipsec_rcv_state struct. All that needs to be done is break the
> function at the correct place so that a callback can re-enter the
> decryption from an interrupt handler for a crypto-board and allocate
> the ipsec_rcv_state struct on the heap.

Similar work has recently been done on ipsec_tunnel.c.

> Note that it isn't quite as easy, as the code *does* take locks, and
> these need to be released at appropriate times.
> 
> For ipsec_start_xmit the situation is not that easy. It has not been
> refactored yet.

It is in the process of being factored in the HEAD of the CVS tree.
1.9x is a branch and so it 2.x, so this work is happenning in stuff that
will become 3.0x.

> The ipsec_start_xmit code is one huge function of some 1600 lines. The
> first 343 lines of these, up to the comment /* start encapsulation
> loop here XXX */ are not directly involved with encrypting. The next
> 1094 lines *are*.  The last 132 lines are involved with actually
> sending the packet and cleaning up.
> 
> Now, the 1094 lines that are directly involved with encrypting form 1
> single loop. In this loop there is code that sets up the encryption
> steps and a loop that then does the actual encryption.

ipsec_tunnel_start_xmit() has been refactored into 9 new functions.
There are now functions for packet and device sanity checking, hard
header stripping and restoration, SA lookup, recursive SA bundle
application, SA bundle processing, SA application, skb forwarding, skb
cleanup.

These divisions may not be quite perfect for what you need, but
functions should now be no larger than 300-500 lines.  There is further
refactoring planned to clean up the crypto and hash algorithm code.  We
will look to JuanJo for input there.

> This loop ought to be split off, so that entry into the loop can be
> done asynchronously. This means that every loop nesting level from the
> outer loop down to the actual encryption call needs to be factored out
> into a seperate function. The trouble is in a few issues:

Agreed.

> - what state does the loop keep, and what state should therefore be
>   carried over the asynchronous call?

We need to get rid of most of the locks and use SA refcounts insead,
which will survive asynchrony much better.

> - what locks does the loop hold and what locks can and can not be
>   released over the asynchronous call?

This is much more obvious now by reading the refactored code.  As above,
hopefully we won't need any long locks except while refcounts or other
references are updated or checked.

> Accompanied are my patch to FreeS/WAN 2.00-rc1 (afaik it should also patch
> cleanly to 2.00-rc2, but I haven't tested that), and my version of the
> cryptolib that applies cleanly to a RedHat 2.4.18-24 kernel.

As MCR pointed out, he's looking at it and seems optimistic.  Things
will need to be migrated to the HEAD branch if useful.

> (Took me a bit to figure out: Martin's cryptolib actually also
> supports synchronous encryption, so I first tried that, but most
> hardware doesn't, so it didn't actually work :), and KLIPS 1 is
> *monstrous* to say the very least. I think I can pinpoint at least 1
> bug just by reading the code... I still need to verify that though.)

I have already found several in refactoring...  More eyes certainly help
and anything you can illuminate would be helpful.

> Now, what I want to know: am I completely off the rocker on my
> assessment?

Not at all.

> Is this approach reasonable? Are there obvious pitfalls? I am
> concerned about possible information leaks due to for instance
> releasing the tdb_lock when asynchronously encrypting a transmit
> request: the ipsec_sa table may get modified in the meantime.
> Fortunately releasing the lock when encrypting upon receive seems to
> merely result in a spurious drop, and I don't feel the need to deal
> with those, higher level protocols as TCP can do that. IP doesn't
> guarantee reception of data anyway.

Your description above sounds quite reasonable, but I would have to
examine your patch to have a better idea.  The information leaks should
be addressed by the SA refcounts.

Wait...  upon reading your code... there are several places in
pfkey_v2_parser.c where you comment out the key-nulling code since you
still need the data.  Is it properly sanitised elsewhere?

> Comments?

Thanks for your effort!

> Doei, Arthur.
> 
> -- 
> +- Arthur van Leeuwen, Systems Consultant, [email protected] -+
> |  X/OS Experts in Open Systems BV                          |
> |  Kruislaan 419                     Phone: +31 20 6938364  |
> |  1098 VA  Amsterdam                Fax:   +31 20 6948204  |

Content-Description: freeswan-2.00-rc1-cryptolib patch
> diff -Naur --exclude '*.swp' freeswan-2.00-rc1/linux/include/freeswan/ipsec_sa.h freeswan-2.00-rc1-cryptolib/linux/include/freeswan/ipsec_sa.h
> --- freeswan-2.00-rc1/linux/include/freeswan/ipsec_sa.h	Thu Jan 30 03:31:52 2003
> +++ freeswan-2.00-rc1-cryptolib/linux/include/freeswan/ipsec_sa.h	Fri Feb 28 11:28:16 2003
> @@ -177,6 +177,18 @@
>  	caddr_t		ips_key_e;		/* encryption key */
>  	caddr_t	        ips_iv;			/* Initialisation Vector */
>  
> +	/*** AVL XXX random and key data for cryptolib ***/
> +#if 1
> +#define IPSEC_SA_RANDOM_STRING_LEN 64
> +	__u8		*ips_random_str;	/* random numbers for iv */
> +	__u8		ips_random_ctr;		/* where we are in random string */
> +
> +	void		*ips_key_raw_a;		/* raw authentication key */
> +	void		*ips_key_raw_e;		/* raw encryption key */
> +	__u16		ips_key_raw_a_size;
> +	__u16		ips_key_raw_e_size;
> +#endif
> +
>  	struct ident	ips_ident_s;		/* identity src */
>  	struct ident	ips_ident_d;		/* identity dst */
>  
> diff -Naur --exclude '*.swp' freeswan-2.00-rc1/linux/net/ipsec/ipsec_rcv.c freeswan-2.00-rc1-cryptolib/linux/net/ipsec/ipsec_rcv.c
> --- freeswan-2.00-rc1/linux/net/ipsec/ipsec_rcv.c	Fri Dec 13 21:58:03 2002
> +++ freeswan-2.00-rc1-cryptolib/linux/net/ipsec/ipsec_rcv.c	Fri Feb 28 11:22:18 2003
> @@ -54,6 +54,8 @@
>  #include <asm/checksum.h>
>  #include <net/ip.h>
>  
> +#include <linux/if_crypto.h>	/* cryptolib crypto offloading */
> +
>  #include "freeswan/radij.h"
>  #include "freeswan/ipsec_encap.h"
>  #include "freeswan/ipsec_sa.h"
> @@ -220,6 +222,8 @@
>  #endif /* CONFIG_IPSEC_AUTH_HMAC_MD5 */
>  
>  enum ipsec_rcv_value {
> +	IPSEC_RCV_PENDING=3,
> +	IPSEC_RCV_CONTINUE=2,
>  	IPSEC_RCV_LASTPROTO=1,
>  	IPSEC_RCV_OK=0,
>  	IPSEC_RCV_BADPROTO=-1,
> @@ -262,6 +266,9 @@
>  	__u8 *ictx;
>  	int ictx_len;
>  	int octx_len;
> +	unsigned char * authenticator;
> +	int replay;
> +	struct crypto_request *cryptreq;
>  	union {
>  		struct {
>  			struct esp *espp;
> @@ -330,6 +337,48 @@
>  }
>  
>  enum ipsec_rcv_value
> +ipsec_rcv_esp_decrypt_bh(struct ipsec_rcv_state *irs);
> +
> +enum ipsec_rcv_value
> +ipsec_rcv_decap_once_bh(struct ipsec_rcv_state *irs, enum ipsec_rcv_value bh_stat);
> +
> +int ipsec_rcv_bh(struct ipsec_rcv_state * irs, enum ipsec_rcv_value bh_stat);
> +
> +void ipsec_rcv_esp_decrypt_done(struct crypto_request *cryptreq) {
> +	struct ipsec_rcv_state *irs = (struct ipsec_rcv_state *)cryptreq->priv;
> +	struct crypto_operation *op;
> +	enum ipsec_rcv_value retval;
> +	int i;
> +	
> +	for (op = &req->op; op != NULL; op=op->next) {
> +		if (op->cmd & (CRYPT_MD5 | CRYPT_SHA)) {
> +			for (i=0;i<(op->u.hash.reslen<AH_AMAX?op->u.hash.reslen:AH_AMAX);i++) {
> +				irs->hash[i] = op->u.hash.result[i];
> +			}
> +			break;
> +		}
> +	}
> +
> +	/* We don't need the crypto request itself anymore, free it */
> +	op = &req->op.next;
> +	while (op!=NULL) {
> +		struct crypto_operation *del;
> +		del=op;
> +		op=op->next;
> +		kfree(del);
> +	}
> +	crypto_free_request(cryptreq);
> +	irs->cryptreq=NULL;
> +
> +	/* Re-acquire the lock before going into bottom halves */
> +	spin_lock(&tdb_lock);
> +
> +	retval = ipsec_rcv_esp_decrypt_bh(irs);
> +	retval = ipsec_rcv_decap_once_bh(irs,retval);
> +	ipsec_rcv_bh(irs,retval);
> +}
> +
> +enum ipsec_rcv_value
>  ipsec_rcv_esp_decrypt_setup(struct ipsec_rcv_state *irs,
>  			    struct sk_buff *skb,
>  			    __u32          *replay,
> @@ -365,24 +414,50 @@
>  		SHA1_CTX	sha1;
>  	} tctx;
>  
> -	aa = irs->authfuncs;
> +	switch (irs->ipsp->ips_authalg) {
> +#ifdef CONFIG_IPSEC_AUTH_HMAC_MD5
> +	case AH_MD5:
> +		irs->cryptreq = crypto_alloc_request(GFP_ATOMIC);
>  
> -	/* copy the initialized keying material */
> -	memcpy(&tctx, irs->ictx, irs->ictx_len);
> +		irs->cryptreq->inbuf = skb->data + irs->iphlen;
> +		irs->cryptreq->inlen = skb->len - irs->iphlen;
> +		irs->cryptreq->outbuf = irs->cryptreq->inbuf;
> +		irs->cryptreq->outlen = irs->cryptreq->inlen;
> +		irs->cryptreq->flags = CRYPT_DATA;
> +		irs->cryptreq->priv = irs;
> +		irs->cryptreq->callback = ipsec_rcv_esp_decrypt_done;
> +
> +		irs->cryptreq->op->cmd = CRYPT_DECODE | CRYPT_MD5 | CRYPT_HMAC | CRYPT_96;
> +		irs->cryptreq->op->offset = 0;
> +		irs->cryptreq->op->len = skb->len - irs->iphlen - irs->authlen;
> +		memcpy(irs->cryptreq->u.hash.hmac_key,irs->ipsp->ips_key_raw_a,irs->ipsp->ips_key_raw_a_size);
> +		irs->cryptreq->op->u.hash.hmac_key_len=irs->ipsp->ips_key_raw_a_size;
> +		break;
> +#endif /* CONFIG_IPSEC_AUTH_HMAC_MD5 */
> +#ifdef CONFIG_IPSEC_AUTH_HMAC_MD5
> +	case AH_SHA:
> +		aa = irs->authfuncs;
>  
> -	(*aa->update)((void *)&tctx, (caddr_t)espp, irs->ilen);
> +		/* copy the initialized keying material */
> +		memcpy(&tctx, irs->ictx, irs->ictx_len);
>  
> -	(*aa->final)(irs->hash, (void *)&tctx);
> +		(*aa->update)((void *)&tctx, (caddr_t)espp, irs->ilen);
>  
> -	memcpy(&tctx, irs->octx, irs->octx_len);
> +		(*aa->final)(irs->hash, (void *)&tctx);
>  
> -	(*aa->update)((void *)&tctx, irs->hash, AHMD596_ALEN);
> -	(*aa->final)(irs->hash, (void *)&tctx);
> +		memcpy(&tctx, irs->octx, irs->octx_len);
> +
> +		(*aa->update)((void *)&tctx, irs->hash, AHMD596_ALEN);
> +		(*aa->final)(irs->hash, (void *)&tctx);
> +		break;
> +#endif /* CONFIG_IPSEC_AUTH_HMAC_MD5 */
> +	case AH_NONE:
> +		break;
> +	}
>  
>  	return IPSEC_RCV_OK;
>  }
>  
> -
>  enum ipsec_rcv_value
>  ipsec_rcv_esp_decrypt(struct ipsec_rcv_state *irs)
>  {
> @@ -393,8 +468,9 @@
>  	__u32 iv[2];
>  	int pad = 0, padlen;
>  	int badpad = 0;
> -	int i;
> +	int i, err;
>  	struct sk_buff *skb;
> +	struct crypto_operation *op;
>  
>  	skb=irs->skb;
>  
> @@ -430,6 +506,36 @@
>  			}
>  			return IPSEC_RCV_3DES_BADBLOCKING;
>  		}
> +		if (irs->cryptreq == NULL) {
> +			irs->cryptreq = crypto_alloc_request(GFP_ATOMIC);
> +
> +			irs->cryptreq->inbuf = skb->data + irs->iphlen;
> +			irs->cryptreq->inlen = skb->len - irs->iphlen;
> +			irs->cryptreq->outbuf = irs->cryptreq->inbuf;
> +			irs->cryptreq->outlen = irs->cryptreq->inlen;
> +			irs->cryptreq->flags = CRYPT_DATA;
> +			irs->cryptreq->priv = irs;
> +			irs->cryptreq->callback = ipsec_rcv_esp_decrypt_done;
> +			op = &(irs->cryptreq->op);
> +		} else {
> +			irs->cryptreq->op->next = kmalloc(sizeof *op,GFP_ATOMIC);
> +			op = irs->cryptreq->op->next;
> +			if (op == NULL) {
> +				KLIPS_PRINT(debug_rcv,
> +					    "klips_debug:ipsec_rcv: "
> +					    "memory allocation error (crypto op)\n");
> +				return IPSEC_RCV_ESP_DECAPFAIL;
> +			}
> +		}
> +
> +		op->cmd = CRYPT_DECODE | CRYPT_3DES | CRYPT_CBC;
> +		op->offset = esphlen;
> +		op->len = skb->len - irs->iphlen - irs->authlen - esphlen;
> +		memcpy(op->u.des.key, irs->ipsp->ips_key_raw_e,3*sizeof(des_cblock));
> +		op->u.des.ivec=(des_cblock *)espp->esp_iv;
> +		op->next = NULL;
> +
> +#if 0
>  		des_ede3_cbc_encrypt((des_cblock *)idat,
>  				     (des_cblock *)idat,
>  				     irs->ilen,
> @@ -437,9 +543,38 @@
>  				     ((struct des_eks *)(ipsp->ips_key_e))[1].ks,
>  				     ((struct des_eks *)(ipsp->ips_key_e))[2].ks,
>  				     (des_cblock *)iv, 0);
> +#endif
> +		err = crypto_execute(irs->cryptreq);
> +		if (err == CRYPT_OK || err == CRYPT_READY) {
> +			spin_unlock(&tdb_lock);
> +			return (IPSEC_RCV_PENDING);
> +		} else {
> +			return (IPSEC_RCV_ESP_DECAPFAIL);
> +		}
> +
>  		break;
>  	}
>  
> +	return ipsec_rcv_esp_decrypt_bh(irs);
> +}
> +
> +enum ipsec_rcv_value
> +ipsec_rcv_esp_decrypt_bh(struct ipsec_rcv_state *irs)
> +{
> +	struct ipsec_sa *ipsp = irs->ipsp;
> +	struct esp *espp = irs->protostuff.espstuff.espp;
> +	int esphlen = sizeof(struct esp);
> +	__u8 *idat;	/* pointer to content to be decrypted/authenticated */
> +	__u32 iv[2];
> +	int pad = 0, padlen;
> +	int badpad = 0;
> +	int i;
> +	struct sk_buff *skb;
> +
> +	skb=irs->skb;
> +
> +	idat = skb->data + irs->iphlen + esphlen;
> +
>  	rcv_dmp("postdecrypt", skb->data, skb->len);
>  
>  	irs->next_header = idat[irs->ilen - 1];
> @@ -851,7 +986,6 @@
>  	__u8 proto;
>  	struct in_addr ipsaddr;
>  	struct in_addr ipdaddr;
> -	int replay = 0;	/* replay value in AH or ESP packet */
>  	struct ipsec_sa* ipsnext = NULL;	/* next SA towards inside of packet */
>  #ifdef INBOUND_POLICY_CHECK_eroute
>  	struct sockaddr_encap matcher;	/* eroute search key */
> @@ -865,6 +999,8 @@
>  	struct iphdr *ipp;
>  	struct sk_buff *skb;
>  
> +	irs->replay = 0;	/* replay value in AH or ESP packet */
> +	irs->authenticator = NULL;
>  	skb = irs->skb;
>  	irs->len = skb->len;
>  	dat = skb->data;
> @@ -1092,7 +1228,6 @@
>  	}
>  
>  	if(irs->authfuncs) {
> -		unsigned char *authenticator = NULL;
>  
>  		irs->ilen = irs->len - iphlen - irs->authlen;
>  		if(irs->ilen <= 0) {
> @@ -1109,14 +1244,14 @@
>  		if(proto_funcs->setup_auth) {
>  			enum ipsec_rcv_value retval
>  			    = (*proto_funcs->setup_auth)(irs, skb,
> -							 &replay,
> -							 &authenticator);
> +							 &(irs->replay),
> +							 &(irs->authenticator));
>  			if(retval < 0) {
>  				return retval;
>  			}
>  		}
>  
> -		if(!authenticator) {
> +		if(!(irs->authenticator)) {
>  			irs->ipsp->ips_errs.ips_auth_errs += 1;
>  			if(irs->stats) {
>  				irs->stats->rx_dropped++;
> @@ -1124,7 +1259,7 @@
>  			return IPSEC_RCV_BADAUTH;
>  		}
>  
> -		if(!ipsec_checkreplaywindow(irs->ipsp, replay)) {
> +		if(!ipsec_checkreplaywindow(irs->ipsp, irs->replay)) {
>  			irs->ipsp->ips_errs.ips_replaywin_errs += 1;
>  			KLIPS_PRINT(debug_rcv & DB_RX_REPLAY,
>  				    "klips_debug:ipsec_rcv: "
> @@ -1152,7 +1287,35 @@
>  		}
>  		(*proto_funcs->calc_auth)(irs, skb);
>  
> -		if (memcmp(irs->hash, authenticator, irs->authlen)) {
> +	}
> +
> +	if(proto_funcs->decrypt) {
> +		enum ipsec_rcv_value retval =
> +		  (*proto_funcs->decrypt)(irs);
> +
> +		if(retval != IPSEC_RCV_OK) {
> +			return retval;
> +		}
> +	}
> +
> +	return ipsec_rcv_decap_once_bh(irs);
> +}
> +
> +enum ipsec_rcv_value
> +ipsec_rcv_decap_once_bh(struct ipsec_rcv_state *irs, enum ipsec_rcv_value bh_stat)
> +{
> +	struct in_addr ipsaddr;
> +	struct in_addr ipdaddr;
> +	struct ipsec_sa *ipsnext = NULL:
> +	struct iphdr *ipp;
> +	struct sk_buff *skb;
> +
> +	if(bh_stat != IPSEC_RCV_OK) {
> +		return bh_stat;
> +	}
> +
> +	if(irs->authfuncs) {
> +		if (memcmp(irs->hash, irs->authenticator, irs->authlen)) {
>  			irs->ipsp->ips_errs.ips_auth_errs += 1;
>  			KLIPS_PRINT(debug_rcv & DB_RX_INAU,
>  				    "klips_debug:ipsec_rcv: "
> @@ -1161,9 +1324,9 @@
>  				    ntohl(*(__u32*)&irs->hash[0]),
>  				    ntohl(*(__u32*)&irs->hash[4]),
>  				    ntohl(*(__u32*)&irs->hash[8]),
> -				    ntohl(*(__u32*)authenticator),
> -				    ntohl(*((__u32*)authenticator + 1)),
> -				    ntohl(*((__u32*)authenticator + 2)));
> +				    ntohl(*(__u32*)irs->authenticator),
> +				    ntohl(*((__u32*)irs->authenticator + 1)),
> +				    ntohl(*((__u32*)irs->authenticator + 2)));
>  			if(irs->stats) {
>  				irs->stats->rx_dropped++;
>  			}
> @@ -1180,7 +1343,7 @@
>  		memset(irs->hash, 0, irs->authlen);
>  
>  		/* If the sequence number == 0, expire SA, it had rolled */
> -		if(irs->ipsp->ips_replaywin && !replay /* !irs->ipsp->ips_replaywin_lastseq */) {
> +		if(irs->ipsp->ips_replaywin && !(irs->replay) /* !irs->ipsp->ips_replaywin_lastseq */) {
>  			ipsec_sa_delchain(irs->ipsp);
>  			KLIPS_PRINT(debug_rcv,
>  				    "klips_debug:ipsec_rcv: "
> @@ -1192,7 +1355,7 @@
>  		}
>  
>  		/* now update the replay counter */
> -		if (!ipsec_updatereplaywindow(irs->ipsp, replay)) {
> +		if (!ipsec_updatereplaywindow(irs->ipsp, irs->replay)) {
>  			irs->ipsp->ips_errs.ips_replaywin_errs += 1;
>  			KLIPS_PRINT(debug_rcv & DB_RX_REPLAY,
>  				    "klips_debug:ipsec_rcv: "
> @@ -1204,16 +1367,6 @@
>  			return IPSEC_RCV_REPLAYROLLED;
>  		}
>  	}
> -
> -	if(proto_funcs->decrypt) {
> -		enum ipsec_rcv_value retval =
> -		  (*proto_funcs->decrypt)(irs);
> -
> -		if(retval != IPSEC_RCV_OK) {
> -			return retval;
> -		}
> -	}
> -
>  	/*
>  	 *	Adjust pointers
>  	 */
> @@ -1244,7 +1397,7 @@
>  	ipp->protocol = irs->next_header;
>  
>  	ipp->check = 0;	/* NOTE: this will be included in checksum */
> -	ipp->check = ip_fast_csum((unsigned char *)dat, iphlen >> 2);
> +	ipp->check = ip_fast_csum((unsigned char *)dat, (irs->iphlen) >> 2);
>  
>  	KLIPS_PRINT(debug_rcv & DB_RX_PKTRX,
>  		    "klips_debug:ipsec_rcv: "
> @@ -1310,13 +1463,13 @@
>  	irs->ipsp->ips_life.ipl_packets.ipl_count += 1;
>  
>  #ifdef CONFIG_NETFILTER
> -	if(proto == IPPROTO_ESP || proto == IPPROTO_AH) {
> +	if(irs->said.proto == IPPROTO_ESP || irs->said.proto == IPPROTO_AH) {
>  		skb->nfmark = (skb->nfmark & (~(IPsecSAref2NFmark(IPSEC_SA_REF_MASK))))
>  			| IPsecSAref2NFmark(IPsecSA2SAref(irs->ipsp));
>  		KLIPS_PRINT(debug_rcv & DB_RX_PKTRX,
>  			    "klips_debug:ipsec_rcv: "
>  			    "%s SA sets skb->nfmark=0x%x.\n",
> -			    proto == IPPROTO_ESP ? "ESP" : "AH",
> +			    irs->said.proto == IPPROTO_ESP ? "ESP" : "AH",
>  			    (unsigned)skb->nfmark);
>  	}
>  #endif /* CONFIG_NETFILTER */
> @@ -1324,7 +1477,6 @@
>  	return IPSEC_RCV_OK;
>  }
>  
> -
>  int
>  #ifdef PROTO_HANDLER_SINGLE_PARM
>  ipsec_rcv(struct sk_buff *skb)
> @@ -1365,12 +1517,18 @@
>  	struct sockaddr_encap policy_eaddr;
>  	struct sockaddr_encap policy_emask;
>  #endif /* INBOUND_POLICY_CHECK_eroute */
> -	struct ipsec_rcv_state irs;
> +	struct ipsec_rcv_state * irs;
>  
>  	/* Don't unlink in the middle of a turnaround */
>  	MOD_INC_USE_COUNT;
>  
> -	memset(&irs, 0, sizeof(struct ipsec_rcv_state));
> +	if ((irs = kmalloc(sizeof(struct ipsec_rcv_state,GFP_ATOMIC)))==NULL) {
> +		KLIPS_PRINT(debug_rcv,
> +			   "klips_debug:ipsec_rcv: "
> +			   "memory allocation error, dropping packet\n");
> +		goto rcvleave;
> +	}
> +	memset(irs, 0, sizeof(struct ipsec_rcv_state));
>  
>  	if (skb == NULL) {
>  		KLIPS_PRINT(debug_rcv,
> @@ -1395,9 +1553,9 @@
>  #endif /* IPH_is_SKB_PULLED */
>  
>  	/* dev->hard_header_len is unreliable and should not be used */
> -	irs.hard_header_len = skb->mac.raw ? (skb->data - skb->mac.raw) : 0;
> -	if((irs.hard_header_len < 0) || (irs.hard_header_len > skb_headroom(skb)))
> -		irs.hard_header_len = 0;
> +	irs->hard_header_len = skb->mac.raw ? (skb->data - skb->mac.raw) : 0;
> +	if((irs->hard_header_len < 0) || (irs->hard_header_len > skb_headroom(skb)))
> +		irs->hard_header_len = 0;
>  
>  #ifdef NET_21
>  	/* if skb was cloned (most likely due to a packet sniffer such as
> @@ -1405,14 +1563,14 @@
>  	   a copy of our own to modify */
>  	if(skb_cloned(skb)) {
>  		/* include any mac header while copying.. */
> -		if(skb_headroom(skb) < irs.hard_header_len) {
> +		if(skb_headroom(skb) < irs->hard_header_len) {
>  			printk(KERN_WARNING "klips_error:ipsec_rcv: "
>  			       "tried to skb_push hhlen=%d, %d available.  This should never happen, please report.\n",
> -			       irs.hard_header_len,
> +			       irs->hard_header_len,
>  			       skb_headroom(skb));
>  			goto rcvleave;
>  		}
> -		skb_push(skb, irs.hard_header_len);
> +		skb_push(skb, irs->hard_header_len);
>  		if
>  #ifdef SKB_COW_NEW
>  		  (skb_cow(skb, skb_headroom(skb)) != 0)
> @@ -1422,14 +1580,14 @@
>  		{
>  			goto rcvleave;
>  		}
> -		if(skb->len < irs.hard_header_len) {
> +		if(skb->len < irs->hard_header_len) {
>  			printk(KERN_WARNING "klips_error:ipsec_rcv: "
>  			       "tried to skb_pull hhlen=%d, %d available.  This should never happen, please report.\n",
> -			       irs.hard_header_len,
> +			       irs->hard_header_len,
>  			       skb->len);
>  			goto rcvleave;
>  		}
> -		skb_pull(skb, irs.hard_header_len);
> +		skb_pull(skb, irs->hard_header_len);
>  	}
>  
>  #endif /* NET_21 */
> @@ -1448,10 +1606,10 @@
>  
>  	ipp = skb->nh.iph;
>  	ipsaddr.s_addr = ipp->saddr;
> -	addrtoa(ipsaddr, 0, irs.ipsaddr_txt, sizeof(irs.ipsaddr_txt));
> +	addrtoa(ipsaddr, 0, irs->ipsaddr_txt, sizeof(irs->ipsaddr_txt));
>  	ipdaddr.s_addr = ipp->daddr;
> -	addrtoa(ipdaddr, 0, irs.ipdaddr_txt, sizeof(irs.ipdaddr_txt));
> -	irs.iphlen = ipp->ihl << 2;
> +	addrtoa(ipdaddr, 0, irs->ipdaddr_txt, sizeof(irs->ipdaddr_txt));
> +	irs->iphlen = ipp->ihl << 2;
>  
>  	KLIPS_PRINT(debug_rcv,
>  		    "klips_debug:ipsec_rcv: "
> @@ -1549,8 +1707,6 @@
>  
>  	KLIPS_IP_PRINT(debug_rcv, ipp);
>  
> -	/* begin decapsulating loop here */
> -
>  	/*
>  	  The spinlock is to prevent any other process from
>  	  accessing or deleting the ipsec_sa hash table or any of the
> @@ -1563,21 +1719,81 @@
>  	  in KLIPS1 unless a volunteer contributes it, but will be
>  	  designed into KLIPS2.
>  	*/
> +
>  	spin_lock(&tdb_lock);
>  
>  	/* set up for decap loop */
> -	irs.stats= stats;
> -	irs.ipp  = ipp;
> -	irs.ipsp = NULL;
> -	irs.ilen = 0;
> -	irs.authlen=0;
> -	irs.authfuncs=NULL;
> -	irs.skb = skb;
> +	irs->stats= stats;
> +	irs->ipp  = ipp;
> +	irs->ipsp = NULL;
> +	irs->ilen = 0;
> +	irs->authlen=0;
> +	irs->authfuncs=NULL;
> +	irs->skb = skb;
> +
> +	return ipsec_rcv_bh(irs,IPSEC_RCV_CONTINUE);
> +
> + rcvleave:
> +	if(skb) {
> +#ifdef NET_21
> +		kfree_skb(skb);
> +#else /* NET_21 */
> +		kfree_skb(skb, FREE_WRITE);
> +#endif /* NET_21 */
> +	}
> +
> +	kfree(irs);
> +
> +	MOD_DEC_USE_COUNT;
> +	return(0);
> +}
> +
> +int
> +ipsec_rcv_bh(struct ipsec_rcv_state * irs, enum ipsec_rcv_value bh_stat)
> +{
> +	struct sk_buf *skb = irs->skb
> +	struct iphdr *ipp;
> +	struct ipsec_sa *ipsp = NULL;
> +	struct ipsec_sa *ipsnext = NULL;
> +	struct net_device_stats *stats = irs->stats;
> +	struct in_addr ipsaddr;
> +	struct in_addr ipdaddr;
> +#ifdef INBOUND_POLICY_CHECK_eroute
> +	struct sockaddr_encap matcher;	/* eroute search key */
> +	struct eroute *er;
> +	struct sa_id policy_said;
> +	struct sockaddr_encap policy_eaddr;
> +	struct sockaddr_encap policy_emask;
> +#endif /* INBOUND_POLICY_CHECK_eroute */
> +
> +
> +	/* begin decapsulating loop here */
> +
> +	if (bh_stat != IPSEC_RCV_OK && bh_stat != IPSEC_RCV_CONTINUE) {
> +		spin_unlock(&tdb_lock);
> +		KLIPS_PRINT(debug_rcv,
> +			    "klips_debug:ipsec_rcv: decap_once (async) failed: %d\n",
> +			    bh_stat);
> +		goto rcvleave;
> +	}
> +
> +	if(   (irs->ipp->protocol != IPPROTO_ESP )
> +	   && (irs->ipp->protocol != IPPROTO_AH  )
> +#ifdef CONFIG_IPSEC_IPCOMP
> +	   && (irs->ipp->protocol != IPPROTO_COMP)
> +#endif /* CONFIG_IPSEC_IPCOMP */
> +	  ) {
> +		goto decapdone;
> +	}
>  
>  	do {
>  	        int decap_stat;
>  
> -	        decap_stat = ipsec_rcv_decap_once(&irs);
> +	        decap_stat = ipsec_rcv_decap_once(irs);
> +
> +		if(decap_stat == IPSEC_RCV_PENDING) {
> +			return(0);
> +		}
>  
>  		if(decap_stat != IPSEC_RCV_OK) {
>  			spin_unlock(&tdb_lock);
> @@ -1588,18 +1804,20 @@
>  			goto rcvleave;
>  		}
>  	/* end decapsulation loop here */
> -	} while(   (irs.ipp->protocol == IPPROTO_ESP )
> -		|| (irs.ipp->protocol == IPPROTO_AH  )
> +	} while(   (irs->ipp->protocol == IPPROTO_ESP )
> +		|| (irs->ipp->protocol == IPPROTO_AH  )
>  #ifdef CONFIG_IPSEC_IPCOMP
> -		|| (irs.ipp->protocol == IPPROTO_COMP)
> +		|| (irs->ipp->protocol == IPPROTO_COMP)
>  #endif /* CONFIG_IPSEC_IPCOMP */
>  		);
>  
> + decapdone:
> +
>  	/* set up for decap loop */
> -	ipp  =irs.ipp;
> -	ipsp =irs.ipsp;
> +	ipp  =irs->ipp;
> +	ipsp =irs->ipsp;
>  	ipsnext = ipsp->ips_inext;
> -	skb = irs.skb;
> +	skb = irs->skb;
>  
>  	/* if there is an IPCOMP, but we don't have an IPPROTO_COMP,
>  	 * then we can just skip it
> @@ -1618,13 +1836,13 @@
>  	 */
>  	if(ipsnext) {
>  		ipsp = ipsnext;
> -		irs.sa_len = satoa(irs.said, 0, irs.sa, SATOA_BUF);
> +		irs->sa_len = satoa(irs->said, 0, irs->sa, SATOA_BUF);
>  		if(ipp->protocol != IPPROTO_IPIP) {
>  			spin_unlock(&tdb_lock);
>  			KLIPS_PRINT(debug_rcv,
>  				    "klips_debug:ipsec_rcv: "
>  				    "SA:%s, Hey!  How did this get through?  Dropped.\n",
> -				    irs.sa_len ? irs.sa : " (error)");
> +				    irs->sa_len ? irs->sa : " (error)");
>  			if(stats) {
>  				stats->rx_dropped++;
>  			}
> @@ -1640,7 +1858,7 @@
>  					    "klips_debug:ipsec_rcv: "
>  					    "unexpected SA:%s after IPIP SA:%s\n",
>  					    sa_len2 ? sa2 : " (error)",
> -					    irs.sa_len ? irs.sa : " (error)");
> +					    irs->sa_len ? irs->sa : " (error)");
>  				if(stats) {
>  					stats->rx_dropped++;
>  				}
> @@ -1651,8 +1869,8 @@
>  				KLIPS_PRINT(debug_rcv,
>  					    "klips_debug:ipsec_rcv: "
>  					    "SA:%s, src=%s of pkt does not agree with expected SA source address policy.\n",
> -					    irs.sa_len ? irs.sa : " (error)",
> -					    irs.ipsaddr_txt);
> +					    irs->sa_len ? irs->sa : " (error)",
> +					    irs->ipsaddr_txt);
>  				if(stats) {
>  					stats->rx_dropped++;
>  				}
> @@ -1674,16 +1892,16 @@
>  		ipsp->ips_life.ipl_usetime.ipl_last = jiffies / HZ;
>  		ipsp->ips_life.ipl_packets.ipl_count += 1;
>  
> -		if(skb->len < irs.iphlen) {
> +		if(skb->len < irs->iphlen) {
>  			spin_unlock(&tdb_lock);
>  			printk(KERN_WARNING "klips_debug:ipsec_rcv: "
>  			       "tried to skb_pull iphlen=%d, %d available.  This should never happen, please report.\n",
> -			       irs.iphlen,
> +			       irs->iphlen,
>  			       (int)(skb->len));
>  
>  			goto rcvleave;
>  		}
> -		skb_pull(skb, irs.iphlen);
> +		skb_pull(skb, irs->iphlen);
>  
>  #ifdef NET_21
>  		ipp = (struct iphdr *)skb->nh.raw = skb->data;
> @@ -1696,9 +1914,9 @@
>  		memset(skb->proto_priv, 0, sizeof(struct options));
>  #endif /* NET_21 */
>  		ipsaddr.s_addr = ipp->saddr;
> -		addrtoa(ipsaddr, 0, irs.ipsaddr_txt, sizeof(irs.ipsaddr_txt));
> +		addrtoa(ipsaddr, 0, irs->ipsaddr_txt, sizeof(irs->ipsaddr_txt));
>  		ipdaddr.s_addr = ipp->daddr;
> -		addrtoa(ipdaddr, 0, irs.ipdaddr_txt, sizeof(irs.ipdaddr_txt));
> +		addrtoa(ipdaddr, 0, irs->ipdaddr_txt, sizeof(irs->ipdaddr_txt));
>  
>  		skb->protocol = htons(ETH_P_IP);
>  		skb->ip_summed = 0;
> @@ -1732,11 +1950,11 @@
>  			KLIPS_PRINT(debug_rcv,
>  				    "klips_debug:ipsec_rcv: "
>  				    "SA:%s, inner tunnel policy [%s -> %s] does not agree with pkt contents [%s -> %s].\n",
> -				    irs.sa_len ? irs.sa : " (error)",
> +				    irs->sa_len ? irs->sa : " (error)",
>  				    sflow_txt,
>  				    dflow_txt,
> -				    irs.ipsaddr_txt,
> -				    irs.ipdaddr_txt);
> +				    irs->ipsaddr_txt,
> +				    irs->ipdaddr_txt);
>  			if(stats) {
>  				stats->rx_dropped++;
>  			}
> @@ -1854,12 +2072,12 @@
>  		skb->dst = NULL;
>  	}
>  	skb->pkt_type = PACKET_HOST;
> -	if(irs.hard_header_len &&
> -	   (skb->mac.raw != (skb->data - irs.hard_header_len)) &&
> -	   (irs.hard_header_len <= skb_headroom(skb))) {
> +	if(irs->hard_header_len &&
> +	   (skb->mac.raw != (skb->data - irs->hard_header_len)) &&
> +	   (irs->hard_header_len <= skb_headroom(skb))) {
>  		/* copy back original MAC header */
> -		memmove(skb->data - irs.hard_header_len, skb->mac.raw, irs.hard_header_len);
> -		skb->mac.raw = skb->data - irs.hard_header_len;
> +		memmove(skb->data - irs->hard_header_len, skb->mac.raw, irs->hard_header_len);
> +		skb->mac.raw = skb->data - irs->hard_header_len;
>  	}
>  #endif /* NET_21 */
>  
> @@ -1906,6 +2124,8 @@
>  		    "netif_rx() called.\n");
>  	netif_rx(skb);
>  
> +	kfree(irs);
> +
>  	MOD_DEC_USE_COUNT;
>  	return(0);
>  
> @@ -1918,6 +2138,8 @@
>  #endif /* NET_21 */
>  	}
>  
> +	kfree(irs);
> +
>  	MOD_DEC_USE_COUNT;
>  	return(0);
>  }
> diff -Naur --exclude '*.swp' freeswan-2.00-rc1/linux/net/ipsec/ipsec_sa.c freeswan-2.00-rc1-cryptolib/linux/net/ipsec/ipsec_sa.c
> --- freeswan-2.00-rc1/linux/net/ipsec/ipsec_sa.c	Thu Jan 30 03:32:22 2003
> +++ freeswan-2.00-rc1-cryptolib/linux/net/ipsec/ipsec_sa.c	Fri Feb 28 11:55:12 2003
> @@ -999,6 +999,31 @@
>  		kfree(ips->ips_ident_d.data);
>          }
>  	ips->ips_ident_d.data = NULL;
> +
> +	/*** AVL FIXME hw crypto ***/
> +#if 1
> +	if(ips->ips_random_str != NULL) {
> +		memset((caddr_t)(ips->ips_random_str),
> +			0,
> +			IPSEC_SA_RANDOM_STRING_LEN);
> +		kfree(ips->ips_random_str);
> +	}
> +	ips->ips_random_str = NULL;
> +
> +	if(ips->ips_key_raw_a != NULL) {
> +		memset((caddr_t)(ips->ips_key_raw_a),
> +			0,
> +			ips->ips_key_raw_a_size);
> +		kfree(ips->ips_key_raw_a);
> +	}
> +
> +	if(ips->ips_key_raw_e != NULL) {
> +		memset((caddr_t)(ips->ips_key_raw_e),
> +			0,
> +			ips->ips_key_raw_e_size);
> +		kfree(ips->ips_key_raw_e);
> +	}
> +#endif
>  	
>  	memset((caddr_t)ips, 0, sizeof(*ips));
>  	kfree(ips);
> diff -Naur --exclude '*.swp' freeswan-2.00-rc1/linux/net/ipsec/ipsec_tunnel.c freeswan-2.00-rc1-cryptolib/linux/net/ipsec/ipsec_tunnel.c
> --- freeswan-2.00-rc1/linux/net/ipsec/ipsec_tunnel.c	Fri Dec  6 03:24:02 2002
> +++ freeswan-2.00-rc1-cryptolib/linux/net/ipsec/ipsec_tunnel.c	Fri Feb 28 16:44:37 2003
> @@ -684,6 +684,8 @@
>  	 * the eroute while we are using and updating it.
>  	 */
>  	spin_lock(&eroute_lock);
> +
> +	/*** AVL XXX allcation of crypt req here? ***/
>  	
>  	er = ipsec_findroute(&matcher);
>  
> @@ -1570,6 +1572,8 @@
>  #ifdef CONFIG_IPSEC_ENC_3DES
>  				case ESP_3DES:
>  #endif /* CONFIG_IPSEC_ENC_3DES */
> +					/* AVL XXX will possibly work 
> +					 * async now: see below */
>  					iv[0] = *((__u32*)&(espp->esp_iv)    ) =
>  						((__u32*)(ipsp->ips_iv))[0];
>  					iv[1] = *((__u32*)&(espp->esp_iv) + 1) =
> @@ -1599,6 +1603,7 @@
>  				switch(ipsp->ips_encalg) {
>  #ifdef CONFIG_IPSEC_ENC_3DES
>  				case ESP_3DES:
> +					/* AVL XXX BUILD ASYNC Crypto call */
>  					des_ede3_cbc_encrypt((des_cblock *)idat,
>  							     (des_cblock *)idat,
>  							     ilen,
> @@ -1620,6 +1625,7 @@
>  				case ESP_3DES:
>  #endif /* CONFIG_IPSEC_ENC_3DES */
>  					/* XXX update IV with the last 8 octets of the encryption */
> +					/* AVL XXX This should be in BH */
>  #if KLIPS_IMPAIRMENT_ESPIV_CBC_ATTACK
>                                         ((__u32*)(ipsp->ips_iv))[0] =
>                                                 ((__u32 *)(idat))[(ilen >> 2) - 2];
> @@ -1639,6 +1645,7 @@
>  				switch(ipsp->ips_authalg) {
>  #ifdef CONFIG_IPSEC_AUTH_HMAC_MD5
>  				case AH_MD5:
> +					/* AVL XXX Expand ASYNC Crypto call */
>  					dmp("espp", (char*)espp, len - iphlen - authlen);
>  					tctx.md5 = ((struct md5_ctx*)(ipsp->ips_key_a))->ictx;
>  					dmp("ictx", (char*)&tctx.md5, sizeof(tctx.md5));
> diff -Naur --exclude '*.swp' freeswan-2.00-rc1/linux/net/ipsec/pfkey_v2_parser.c freeswan-2.00-rc1-cryptolib/linux/net/ipsec/pfkey_v2_parser.c
> --- freeswan-2.00-rc1/linux/net/ipsec/pfkey_v2_parser.c	Thu Jan 30 03:32:44 2003
> +++ freeswan-2.00-rc1-cryptolib/linux/net/ipsec/pfkey_v2_parser.c	Fri Feb 28 11:43:03 2003
> @@ -376,6 +376,14 @@
>  			}
>  			prng_bytes(&ipsec_prng, (char *)ipsp->ips_iv, EMT_ESPDES_IV_SZ);
>  			ipsp->ips_iv_bits = ipsp->ips_iv_size * 8;
> +			/*** AVL XXX tdb_random_str (ipsp->ips_random_str) ***/
> +# if 1
> +			if((ipsp->ips_random_str=(caddr_t) kmalloc(IPSEC_SA_RANDOM_STRING_LEN,GFP_ATOMIC)) == NULL) {
> +				SENDERR(ENOMEM);
> +			}
> +			get_random_bytes((void *)ipsp->ips_random_str, IPSEC_SA_RANDOM_STRING_LEN);
> +			ipsp->ips_random_ctr = 0;
> +#endif
>  			break;
>  # endif /* defined(CONFIG_IPSEC_ENC_3DES) */
>  		case ESP_NONE:
> @@ -402,6 +410,12 @@
>  			/* save encryption key pointer */
>  			ekp = ipsp->ips_key_e;
>  			eks = ipsp->ips_key_e_size;
> +			/*** AVL XXX ips_key_raw_e ***/
> +#if 1
> +			/* Remember raw key, before S/W processing */
> +			ipsp->ips_key_raw_e = ekp;
> +			ipsp->ips_key_raw_e_size = eks;
> +#endif
>  			
>  			KLIPS_PRINT(debug_pfkey && sysctl_ipsec_debug_verbose,
>  			            "klips_debug:pfkey_ipsec_sa_init: "
> @@ -443,9 +457,9 @@
>  				}
>  			}
>  
> -			/* paranoid */
> -			memset(ekp, 0, eks);
> -			kfree(ekp);
> +			/* paranoid */  /*** AVL XXX we still need the data */
> +/*			memset(ekp, 0, eks);
> +			kfree(ekp); */
>  			break;
>  # endif /* CONFIG_IPSEC_ENC_3DES */
>  		case ESP_NONE:
> @@ -487,6 +501,11 @@
>  			/* save the pointer to the key material */
>  			akp = ipsp->ips_key_a;
>  			aks = ipsp->ips_key_a_size;
> +			/*** AVL XXX key_raw_a ***/
> +#if 1
> +			ipsp->ips_key_raw_a = akp;
> +			ipsp->ips_key_raw_a_size = aks;
> +#endif
>  			
>  			KLIPS_PRINT(debug_pfkey && sysctl_ipsec_debug_verbose,
>  			            "klips_debug:pfkey_ipsec_sa_init: "
> @@ -531,9 +550,9 @@
>  				    ((__u32*)octx)[2],
>  				    ((__u32*)octx)[3] );
>  #  endif /* KLIPS_DIVULGE_HMAC_KEY */
> -			/* paranoid */
> -			memset(akp, 0, aks);
> -			kfree(akp);
> +			/* paranoid */ /*** AVL XXX but we need this data! */
> +/*			memset(akp, 0, aks);
> +			kfree(akp); */
>  			break;
>  		}
>  # endif /* CONFIG_IPSEC_AUTH_HMAC_MD5 */
> @@ -565,6 +584,11 @@
>  			/* save the pointer to the key material */
>  			akp = ipsp->ips_key_a;
>  			aks = ipsp->ips_key_a_size;
> +			/*** AVL XXX key_raw ***/
> +#if 0
> +			ipsp->ips_key_raw_a = akp;
> +			ipsp->ips_key_raw_a_size = aks;
> +#endif
>  
>  			KLIPS_PRINT(debug_pfkey && sysctl_ipsec_debug_verbose,
>  			            "klips_debug:pfkey_ipsec_sa_init: "
> @@ -609,8 +633,10 @@
>  				    ((__u32*)octx)[2],
>  				    ((__u32*)octx)[3] );
>  #  endif /* KLIPS_DIVULGE_HMAC_KEY */
> -			memset(akp, 0, aks);
> +#if 0
> +			memset(akp, 0, aks); /*** AVL XXX we still need this */
>  			kfree(akp);
> +#endif
>  			break;
>  		}
>  # endif /* CONFIG_IPSEC_AUTH_HMAC_SHA1 */

Content-Description: linux-2.4.18-cryptolib patch
> diff -Naur linux/Makefile linux-crypto/Makefile
> --- linux/Makefile	Tue Aug 27 11:26:08 2002
> +++ linux-crypto/Makefile	Tue Aug 27 11:20:57 2002
> @@ -132,12 +132,12 @@
>  
>  #export RAMDISK = -DRAMDISK=512
>  
> -CORE_FILES	=kernel/kernel.o mm/mm.o fs/fs.o ipc/ipc.o
> +CORE_FILES	=kernel/kernel.o mm/mm.o fs/fs.o ipc/ipc.o cryptolib/crypto.o
>  NETWORKS	=net/network.o
>  ABI		=abi/abi.o
>  CRYPTO		=crypto/crypto.o
>  LIBS		=$(TOPDIR)/lib/lib.a
> -SUBDIRS		=kernel drivers mm fs net ipc lib abi crypto
> +SUBDIRS		=kernel drivers mm fs net ipc lib abi crypto cryptolib
>  
>  DRIVERS-n :=
>  DRIVERS-y :=
> @@ -391,7 +391,7 @@
>  init/do_mounts.o: init/do_mounts.c tmp_include_depends
>  	$(CC) $(CFLAGS) $(CFLAGS_KERNEL) $(PROFILING) -DKBUILD_BASENAME=$(subst $(comma),_,$(subst -,_,$(*F))) -c -o $*.o $<
>  
> -fs lib mm ipc kernel drivers net: dummy
> +fs lib mm ipc kernel drivers net cryptolib: dummy
>  	$(MAKE) CFLAGS="$(CFLAGS) $(CFLAGS_KERNEL)" $(subst $@, _dir_$@, $@)
>  
>  TAGS: dummy
> diff -Naur linux/cryptolib/Makefile linux-crypto/cryptolib/Makefile
> --- linux/cryptolib/Makefile	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/cryptolib/Makefile	Tue Aug 27 11:20:55 2002
> @@ -0,0 +1,35 @@
> +#
> +# Makefile for the linux crypto routines.
> +#
> +# Note! Dependencies are done automagically by 'make dep', which also
> +# removes any old dependencies. DON'T put your own dependencies here
> +# unless it's something special (ie not a .c file).
> +#
> +# Note 2! The CFLAGS definitions are now in the main makefile...
> +
> +arch :=  `echo $(ARCH) | sed 's/^i[3456]/x/'`
> +
> +ifeq ($(ARCH),i386)
> +DES_ENC:=libdes/asm/dx86-elf.o libdes/asm/yx86-elf.o  # elf format x86
> +else
> +DES_ENC:=libdes/des_enc.o                # normal C version
> +endif
> +
> +DES_OBJS :=  libdes/set_key.o libdes/ecb_enc.o libdes/cbc_enc.o $(DES_ENC)
> +#RC4_OBJS := rc4_enc.o rc4_skey.o
> +
> +O_TARGET := crypto.o
> +obj-y    := md5.o sha1.o $(DES_OBJS) $(RC4_OBJS) cryptolib.o
> +
> +export-objs = crypto_ksyms.o
> +obj-$(CONFIG_MODULES) += crypto_ksyms.o
> +
> +
> +include $(TOPDIR)/Rules.make
> +
> +$(DES_OBJS):
> +	( cd libdes && \
> +	if test " `echo $(ARCH) | sed 's/^i[3456]/x/'`" = " x86" ; \
> +	then $(MAKE) CC='$(CC)' CFLAG='$(CFLAGS)' TESTING='' x86-elf ; \
> +	else $(MAKE) CC='$(CC)' CFLAG='$(CFLAGS)' libdes.a ; \
> +	fi )
> diff -Naur linux/cryptolib/crypto_ksyms.c linux-crypto/cryptolib/crypto_ksyms.c
> --- linux/cryptolib/crypto_ksyms.c	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/cryptolib/crypto_ksyms.c	Tue Aug 27 11:20:55 2002
> @@ -0,0 +1,38 @@
> +/*
> + * Herein lies all the functions/variables that are "exported" for linkage
> + * with dynamically loaded kernel modules.
> + */
> +
> +#include <linux/config.h>
> +#include <linux/module.h>
> +#include <asm/byteorder.h>
> +#include <linux/string.h>
> +#include <linux/md5.h>
> +#include <linux/sha1.h>
> +#include <linux/des_locl.h>
> +#include <linux/if_crypto.h>
> +
> +/* Cryptolib.c */
> +EXPORT_SYMBOL(crypto_execute);
> +EXPORT_SYMBOL(crypto_alloc_request);
> +EXPORT_SYMBOL(crypto_register_engine);
> +EXPORT_SYMBOL(crypto_unregister_engine);
> +EXPORT_SYMBOL(crypto_query);
> +EXPORT_SYMBOL(crypto_open_engine);
> +EXPORT_SYMBOL(crypto_close_engine);
> +
> +/* MD5 */
> +EXPORT_SYMBOL(MD5Init);
> +EXPORT_SYMBOL(MD5Update);
> +EXPORT_SYMBOL(MD5Final);
> +
> +/* SHA1 */
> +EXPORT_SYMBOL(SHA1Init);
> +EXPORT_SYMBOL(SHA1Update);
> +EXPORT_SYMBOL(SHA1Final);
> +
> +/* DES */
> +EXPORT_SYMBOL(des_set_key);
> +EXPORT_SYMBOL(des_ede3_cbc_encrypt);
> +EXPORT_SYMBOL(des_set_odd_parity);
> +EXPORT_SYMBOL(des_check_key);
> diff -Naur linux/cryptolib/cryptolib.c linux-crypto/cryptolib/cryptolib.c
> --- linux/cryptolib/cryptolib.c	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/cryptolib/cryptolib.c	Tue Aug 27 11:22:31 2002
> @@ -0,0 +1,519 @@
> +/************************************************
> + Cryptolib.c
> + Cryptographic front end. 
> +*************************************************/
> +
> +#include <linux/kernel.h>
> +#include <linux/module.h>
> +#include <linux/if_crypto.h>
> +#include <linux/slab.h>
> +#include <linux/errno.h>
> +#include <linux/random.h>
> +#include <linux/init.h>
> +
> +/* S/W crypto includes */
> +#ifdef USE_RC4
> +#include <openssl/rc4.h>
> +#endif /* USE_RC4 */
> +#include <linux/des.h>
> +#include <linux/md5.h>
> +#include <linux/sha1.h>
> +
> +#define ENGINE_MAX	5
> +
> +#ifndef TRUE
> +#define TRUE 	(1==1)
> +#define FALSE	!TRUE
> +#endif
> +
> +static	
> +struct crypto_engine_def *engine_db[ENGINE_MAX];
> +
> +struct crypto_request *crypto_alloc_request(int flags)
> +{
> +	struct crypto_request *req;
> +	req = kmalloc(sizeof(struct crypto_request),flags);
> +	if(req == NULL)
> +		return NULL;
> +	memset(req,0,sizeof(struct crypto_request));
> +	return req;
> +}
> +
> +struct crypto_engine_def *crypto_open_engine(crypto_cmd_t cap,unsigned int attrib)
> +{
> +	struct crypto_engine_def *eng;
> +	int t;
> +
> +	for(t=0;t<ENGINE_MAX;t++)
> +	{
> +		eng = engine_db[t];
> +		if(eng == NULL)
> +			continue;
> +		if((cap & eng->capability) == cap
> +			&& (attrib & eng->attributes) == attrib)
> +		{
> +			if(eng->open != NULL)
> +				eng->open();
> +			return eng;
> +		}
> +	}
> +	return NULL;
> +}
> +
> +void crypto_close_engine(struct crypto_engine_def *eng)
> +{
> +	if(eng != NULL && eng->close != NULL)
> +		eng->close();
> +}
> +
> +#ifdef USE_RC4
> +#define BASIC_CMDS	(CRYPT_RC4|CRYPT_DES|CRYPT_3DES|CRYPT_MD5|CRYPT_SHA|CRYPT_RANDOM)
> +#else
> +#define BASIC_CMDS	(CRYPT_DES|CRYPT_3DES|CRYPT_MD5|CRYPT_SHA|CRYPT_RANDOM)
> +#endif /* USE_RC4 */
> +int crypto_execute(struct crypto_request *req)
> +{
> +	struct crypto_engine_def *eng;
> +	int t,ret;
> +
> +	if(req != NULL)
> +	{
> +		if(req->engine == NULL)
> +		{
> +			for(t=0;t<ENGINE_MAX;t++)
> +			{
> +				eng = engine_db[t];
> +				if(eng == NULL)
> +					continue;
> +			/* Engines are sorted in performance order, take first one that matches */
> +				if((req->op.cmd & eng->capability) == (req->op.cmd & BASIC_CMDS))
> +					break;
> +			}
> +		}
> +		else 
> +			eng = req->engine;
> +
> +		if(eng != NULL && eng->request_handler != NULL)
> +		{
> +			ret = eng->request_handler(req);
> +			if(ret == CRYPT_READY && req->callback != NULL)
> +				req->callback(req);
> +
> +			return ret;
> +		}
> +	}
> +	return CRYPT_ERROR;
> +}
> +
> +int crypto_query(crypto_cmd_t cap,unsigned int attrib)
> +{
> +	struct crypto_engine_def *eng;
> +	int t;
> +
> +	for(t=0;t<ENGINE_MAX;t++)
> +	{
> +		eng = engine_db[t];
> +		if(eng == NULL)
> +			continue;
> +		if((cap & eng->capability) == cap
> +			&& (attrib & eng->attributes) == attrib)
> +			return TRUE;
> +	}
> +	return FALSE;
> +}
> +
> +
> +
> +int crypto_register_engine(struct crypto_engine_def *eng)
> +{
> +	int t,r;
> +	struct crypto_engine_def **slot = NULL;
> +
> +	if(eng == NULL || eng->name == NULL)
> +		return -EINVAL;
> +
> +	eng->capability &= BASIC_CMDS;
> +	for(t=0;t<ENGINE_MAX;t++)
> +	{
> +		/* Put S/W last, H/W first */
> +		if(eng->attributes & IS_HARDWARE)
> +			r = (ENGINE_MAX-1) - t;
> +		else
> +			r = t;
> +		if(engine_db[r] == NULL)
> +		{
> +			slot = &engine_db[r];
> +		}
> +		else
> +		{
> +			if(strcmp(eng->name,engine_db[r]->name) == 0)
> +				return -EEXIST;
> +		}
> +	}
> +	if(slot == NULL)
> +		return -EMFILE;
> +
> +	*slot = eng;
> +	printk(KERN_INFO "Crypto engine %s registered\n",eng->name);
> +	return 0;
> +}
> +
> +int crypto_unregister_engine(char *name)
> +{
> +	int t;
> +
> +	for(t=0;t<ENGINE_MAX;t++)
> +	{
> +		if(engine_db[t] != NULL && strcmp(engine_db[t]->name,name) == 0)
> +		{
> +			printk(KERN_INFO "Crypto engine %s unregistered\n",engine_db[t]->name);
> +			engine_db[t] = NULL;
> +			return 0;
> +		}
> +	}
> +	return -ENOENT;
> +}
> +
> +/***************************************************
> +* S/W crypto engine
> +****************************************************/
> +static inline
> +int do_hmac(struct crypto_request *req,struct crypto_operation *op)
> +{
> +	unsigned char digest[20];
> +	int hash_len,i;
> +	MD5_CTX md5_ctx;
> +	SHA1_CTX	sha1_ctx;
> +	unsigned char k_ipad[65];    /* inner padding -
> +                                      * key XORd with ipad
> +                                      */
> +	unsigned char k_opad[65];    /* outer padding -
> +                                      * key XORd with opad
> +                                      */
> +	       /* start out by storing key in pads */
> +	memset(k_ipad, 0, sizeof k_ipad);
> +	memset(k_opad, 0, sizeof k_opad);
> +	memcpy(k_ipad, op->u.hash.hmac_key,op->u.hash.hmac_key_len);
> +	memcpy(k_opad, op->u.hash.hmac_key,op->u.hash.hmac_key_len);
> +
> +        /* XOR key with ipad and opad values */
> +	for (i=0; i<64; i++) {
> +		k_ipad[i] ^= 0x36;
> +		k_opad[i] ^= 0x5c;
> +	}
> +	if(op->cmd & CRYPT_MD5)
> +	{
> +        /*
> +         * perform inner MD5
> +         */
> +		hash_len = 16;
> +		MD5Init(&md5_ctx);                   /* init md5_ctx for 1st
> +                                              * pass */
> +		MD5Update(&md5_ctx, k_ipad, 64);      /* start with inner pad */
> +		MD5Update(&md5_ctx, &req->outbuf[op->offset], op->len); /* then text of datagram */
> +		MD5Final(digest, &md5_ctx);          /* finish up 1st pass */
> +        /*
> +         * perform outer MD5
> +         */
> +		MD5Init(&md5_ctx);                   /* init md5_ctx for 2nd
> +                                              * pass */
> +		MD5Update(&md5_ctx, k_opad, 64);     /* start with outer pad */
> +		MD5Update(&md5_ctx, digest, 16);     /* then results of 1st
> +                                              * hash */
> +		MD5Final(digest, &md5_ctx);          /* finish up 2nd pass */
> +	}
> +	else if(op->cmd & CRYPT_SHA)
> +	{
> +		hash_len = 20;
> +		SHA1Init(&sha1_ctx);                   /* init sha1_ctx for 1st
> +                                              * pass */
> +		SHA1Update(&sha1_ctx, k_ipad, 64);      /* start with inner pad */
> +		SHA1Update(&sha1_ctx, &req->outbuf[op->offset], op->len); /* then text of datagram */
> +		SHA1Final(digest, &sha1_ctx);          /* finish up 1st pass */
> +        /*
> +         * perform outer 
> +         */
> +		SHA1Init(&sha1_ctx);                   /* init sha1_ctx for 2nd
> +                                              * pass */
> +		SHA1Update(&sha1_ctx, k_opad, 64);     /* start with outer pad */
> +		SHA1Update(&sha1_ctx, digest, 20);     /* then results of 1st
> +                                              * hash */
> +		SHA1Final(digest, &sha1_ctx);          /* finish up 2nd pass */
> +	}
> +	if(op->cmd & CRYPT_96)
> +	{
> +		hash_len = 96/8;	/* Truncate digest */
> +	}
> +
> +	if(op->cmd & CRYPT_APPEND)
> +	{
> +		if(req->outlen < (req->inlen + hash_len))
> +			return CRYPT_ERROR;
> +		memcpy(req->outbuf + req->inlen, digest, hash_len);
> +		req->outlen = req->inlen + hash_len;
> +	}
> +	if(req->outlen < hash_len)
> +		return CRYPT_ERROR;
> +	memcpy(op->u.hash.result, digest, hash_len);
> +	op->u.hash.reslen= hash_len;
> +	return CRYPT_READY;
> +}
> +
> +static inline
> +int do_regular_hash(struct crypto_request *req,struct crypto_operation *op)
> +{
> +	unsigned char digest[20];
> +	int hash_len;
> +	MD5_CTX md5_ctx;
> +	SHA1_CTX	sha1_ctx;
> +
> +	if(op->cmd & CRYPT_MD5)
> +	{
> +		hash_len = 16;
> +		MD5Init(&md5_ctx);                  
> +		MD5Update(&md5_ctx, &req->outbuf[op->offset], op->len);
> +		MD5Final(digest, &md5_ctx);          
> +	}
> +	else if(op->cmd & CRYPT_SHA)
> +	{
> +		hash_len = 20;
> +		SHA1Init(&sha1_ctx);                  
> +		SHA1Update(&sha1_ctx, &req->outbuf[op->offset], op->len); /* then text of datagram */
> +		SHA1Final(digest, &sha1_ctx);          /* finish up 1st pass */
> +	}
> +	if(op->cmd & CRYPT_96)
> +	{
> +		hash_len = 96/8;	/* Truncate digest */
> +	}
> +
> +	if(op->cmd & CRYPT_APPEND)
> +	{
> +		if(req->outlen < (req->inlen + hash_len))
> +			return CRYPT_ERROR;
> +		memcpy(req->outbuf + req->inlen, digest, hash_len);
> +		req->outlen = req->inlen + hash_len;
> +	}
> +
> +	memcpy(op->u.hash.result, digest, hash_len);
> +	op->u.hash.reslen= hash_len;
> +	return CRYPT_READY;
> +}
> +
> +static
> +int sw_request_handler(struct crypto_request *req)
> +{
> +	unsigned char *in, *out;
> +	int t,ret,maxout,reslen=0;
> +	struct crypto_operation *op;
> +
> +	maxout = req->outlen;
> +	if(req->outlen  < req->inlen)
> +		return CRYPT_ERROR;
> +
> +	if(req->inbuf != NULL && req->inbuf != req->outbuf)
> +		memcpy(req->outbuf,req->inbuf,req->inlen);
> +
> +	for(op = &req->op;op != NULL;op=op->next)
> +	{
> +		in = &req->outbuf[op->offset];
> +		out = &req->outbuf[op->offset];
> +
> +		if(op->cmd & CRYPT_RANDOM)
> +		{
> +			get_random_bytes(req->outbuf,req->outlen);
> +			reslen = req->outlen;
> +			break; /* Should be the only real operation... */
> +		}
> +
> +#ifdef USE_RC4
> +		if(op->cmd & CRYPT_RC4)
> +		{
> +			RC4_KEY key;
> +
> +			if(maxout < req->inlen || req->op.u.rc4.key == NULL)
> +				return CRYPT_ERROR;
> +
> +			RC4_set_key(&key,op->u.rc4.key->len,op->u.rc4.key->raw);
> +			RC4(&key,op->len,in,out);
> +			req->outlen = req->inlen;
> +		}
> +#endif /* USE_RC4 */
> +
> +		if(op->cmd & CRYPT_DES)
> +		{
> +			/* To do */
> +			return CRYPT_ERROR;
> +		}
> +		if(op->cmd & CRYPT_3DES)
> +		{
> +			if(maxout < req->inlen)
> +				return CRYPT_ERROR;
> +
> +			if(op->cmd & CRYPT_CBC)
> +			{
> +				des_key_schedule sched[3];
> +				des_cblock ivec;
> +
> +				memcpy(&ivec, op->u.des.ivec, 8);
> +
> +				for(t=0;t<3;t++)
> +					des_set_key(&(op->u.des.key[t]),sched[t]);
> +				des_ede3_cbc_encrypt((des_cblock*)in,(des_cblock*)out,op->len,sched[0],sched[1],sched[2]
> +					,&ivec,(op->cmd & CRYPT_DECODE)?0:1);
> +				req->outlen = req->inlen;
> +			}
> +			if(op->cmd & CRYPT_ECB)
> +			{
> +				/* Todo */
> +				return CRYPT_ERROR;
> +			}
> +		}
> +		if(op->cmd & (CRYPT_MD5|CRYPT_SHA))
> +		{
> +			if(op->cmd & CRYPT_HMAC)
> +			{
> +				ret = do_hmac(req,op);
> +				if(ret != CRYPT_READY)
> +					return ret;
> +			}
> +			else
> +			{
> +				ret = do_regular_hash(req,op);
> +				if(ret != CRYPT_READY)
> +					return ret;
> +			}
> +		}
> +		reslen = req->outlen > reslen? req->outlen: reslen;
> +		req->outlen = maxout;
> +	}
> +
> +	req->outlen = reslen;
> +	req->flags |= CRYPT_SOFTWARE;
> +	return CRYPT_READY;
> +}
> +
> +/****** RANDOM NUMBERS HANDLING HERE ********/
> +static wait_queue_t *crypto_random_read_wait;
> +
> +struct random_priv
> +{
> +	ssize_t	nbytes,count;
> +	char 		*buf;
> +};
> +
> +static
> +void crypto_random_callback(struct crypto_request *req)
> +{
> +	struct random_priv 	*rp = (struct random_priv *) req->priv;
> +
> +	rp->count += req->outlen;
> +	rp->buf += req->outlen;
> +	rp->nbytes -= req->outlen;
> +	crypto_free_request(req);
> +	wake_up_interruptible(&crypto_random_read_wait);
> +}	
> +
> +static ssize_t
> +crypto_random_read(struct file * file, char * buf, size_t nbytes, loff_t *ppos)
> +{
> +	wait_queue_t       wait = { current, NULL };
> +	ssize_t                 n, retval = 0;
> +	struct crypto_request *req;
> +	struct random_priv	rpriv;
> +
> +	if (nbytes == 0)
> +		return 0;
> +
> +	rpriv.nbytes = nbytes;
> +	rpriv.count = 0;
> +	rpriv.buf = buf;
> +
> +	add_wait_queue(&crypto_random_read_wait, &wait);
> +	current->state = TASK_INTERRUPTIBLE;
> +
> +	n = rpriv.nbytes;
> +	if (file->f_flags & O_NONBLOCK) {
> +		return -EAGAIN;
> +	}
> +	if (signal_pending(current)) {
> +		return -ERESTARTSYS;
> +	}
> +		/* Go and get random data */
> +	req = crypto_alloc_request(GFP_KERNEL);
> +	req->op.cmd = CRYPT_RANDOM;
> +	req->op.offset = 0;
> +	req->op.len = n;
> +	req->inbuf = NULL;
> +	req->inlen = 0;
> +	req->outlen = n;
> +	req->outbuf = rpriv.buf;
> +	req->flags = 0;
> +	req->callback = crypto_random_callback;
> +	req->priv = (void*) &rpriv;
> +	crypto_execute(req);
> +
> +	schedule();
> +
> +	current->state = TASK_RUNNING;
> +	remove_wait_queue(&crypto_random_read_wait, &wait);
> +
> +
> +        /*
> +         * If we gave the user some bytes, update the access time.
> +         */
> +	if (rpriv.count != 0) {
> +		UPDATE_ATIME(file->f_dentry->d_inode);
> +	}
> +
> +	return (rpriv.count ? rpriv.count : retval);
> +}
> +
> +static struct file_operations crypto_random_fops = {
> +#if LINUX_VERSION_CODE >= 0x20300	/* Someone knows when these made their debut? */
> +	owner:		THIS_MODULE,
> +#endif
> +	read:		crypto_random_read	/* read */
> +};
> +
> +static
> +void __init crypto_random_init(void)
> +{
> +	if (register_chrdev(121, "crypto_random", &crypto_random_fops))
> +	{
> +		printk(KERN_NOTICE "Can't allocate major number 121 for random.\n");
> +	}
> +}
> +
> +
> +static
> +struct crypto_engine_def sw_def = 
> +{
> +	name : "S/W",
> +#ifdef USE_RC4
> +	capability: (CRYPT_RC4|CRYPT_DES|CRYPT_3DES|CRYPT_MD5|CRYPT_SHA),
> +#else
> +	capability: (CRYPT_DES|CRYPT_3DES|CRYPT_MD5|CRYPT_SHA),
> +#endif /* USE_RC4 */
> +	attributes: IS_SOFTWARE | IS_SYNC,
> +	request_handler: sw_request_handler
> +};
> +
> +int  __init crypto_init(void)
> +{
> +	crypto_register_engine(&sw_def);
> +	crypto_random_init();
> +	return 0;
> +}
> +
> +#ifdef MODULE
> +mod_exit_t crypto_cleanup (void)
> +{
> +	crypto_unregister_engine(sw.def.name);
> +}
> +
> +module_exit(crypto_cleanup);
> +#endif
> +
> +//#if LINUX_VERSION_CODE > 0x20300
> +module_init(crypto_init);
> +//#endif
> diff -Naur linux/cryptolib/libdes/COPYRIGHT linux-crypto/cryptolib/libdes/COPYRIGHT
> --- linux/cryptolib/libdes/COPYRIGHT	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/cryptolib/libdes/COPYRIGHT	Tue Aug 27 11:20:55 2002
> @@ -0,0 +1,50 @@
> +Copyright (C) 1995-1997 Eric Young ([email protected])
> +All rights reserved.
> +
> +This package is an DES implementation written by Eric Young ([email protected]).
> +The implementation was written so as to conform with MIT's libdes.
> +
> +This library is free for commercial and non-commercial use as long as
> +the following conditions are aheared to.  The following conditions
> +apply to all code found in this distribution.
> +
> +Copyright remains Eric Young's, and as such any Copyright notices in
> +the code are not to be removed.
> +If this package is used in a product, Eric Young should be given attribution
> +as the author of that the SSL library.  This can be in the form of a textual
> +message at program startup or in documentation (online or textual) provided
> +with the package.
> +
> +Redistribution and use in source and binary forms, with or without
> +modification, are permitted provided that the following conditions
> +are met:
> +1. Redistributions of source code must retain the copyright
> +   notice, this list of conditions and the following disclaimer.
> +2. Redistributions in binary form must reproduce the above copyright
> +   notice, this list of conditions and the following disclaimer in the
> +   documentation and/or other materials provided with the distribution.
> +3. All advertising materials mentioning features or use of this software
> +   must display the following acknowledgement:
> +   This product includes software developed by Eric Young ([email protected])
> +
> +THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
> +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> +ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> +SUCH DAMAGE.
> +
> +The license and distribution terms for any publically available version or
> +derivative of this code cannot be changed.  i.e. this code cannot simply be
> +copied and put under another distrubution license
> +[including the GNU Public License.]
> +
> +The reason behind this being stated in this direct manner is past
> +experience in code simply being copied and the attribution removed
> +from it and then being distributed as part of other packages. This
> +implementation was a non-trivial and unpaid effort.
> diff -Naur linux/cryptolib/libdes/INSTALL linux-crypto/cryptolib/libdes/INSTALL
> --- linux/cryptolib/libdes/INSTALL	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/cryptolib/libdes/INSTALL	Tue Aug 27 11:20:55 2002
> @@ -0,0 +1,69 @@
> +Check the CC and CFLAGS lines in the makefile
> +
> +If your C library does not support the times(3) function, change the
> +#define TIMES to
> +#undef TIMES in speed.c
> +If it does, check the HZ value for the times(3) function.
> +If your system does not define CLK_TCK it will be assumed to
> +be 100.0.
> +
> +If possible use gcc v 2.7.?
> +Turn on the maximum optimising (normally '-O3 -fomit-frame-pointer' for gcc)
> +In recent times, some system compilers give better performace.
> +
> +type 'make'
> +
> +run './destest' to check things are ok.
> +run './rpw' to check the tty code for reading passwords works.
> +run './speed' to see how fast those optimisations make the library run :-)
> +run './des_opts' to determin the best compile time options.
> +
> +The output from des_opts should be put in the makefile options and des_enc.c
> +should be rebuilt.  For 64 bit computers, do not use the DES_PTR option.
> +For the DEC Alpha, edit des.h and change DES_LONG to 'unsigned int'
> +and then you can use the 'DES_PTR' option.
> +
> +The file options.txt has the options listed for best speed on quite a
> +few systems.  Look and the options (UNROLL, PTR, RISC2 etc) and then
> +turn on the relevent option in the Makefile
> +
> +There are some special Makefile targets that make life easier.
> +make cc		- standard cc build
> +make gcc	- standard gcc build
> +make x86-elf	- x86 assembler (elf), linux-elf.
> +make x86-out	- x86 assembler (a.out), FreeBSD
> +make x86-solaris- x86 assembler
> +make x86-bsdi	- x86 assembler (a.out with primative assembler).
> +
> +If at all possible use the assembler (for Windows NT/95, use
> +asm/win32.obj to link with).  The x86 assembler is very very fast.
> +
> +A make install will by default install
> +libdes.a      in /usr/local/lib/libdes.a
> +des           in /usr/local/bin/des
> +des_crypt.man in /usr/local/man/man3/des_crypt.3
> +des.man       in /usr/local/man/man1/des.1
> +des.h         in /usr/include/des.h
> +
> +des(1) should be compatible with sunOS's but I have been unable to
> +test it.
> +
> +These routines should compile on MSDOS, most 32bit and 64bit version
> +of Unix (BSD and SYSV) and VMS, without modification.
> +The only problems should be #include files that are in the wrong places.
> +
> +These routines can be compiled under MSDOS.
> +I have successfully encrypted files using des(1) under MSDOS and then
> +decrypted the files on a SparcStation.
> +I have been able to compile and test the routines with
> +Microsoft C v 5.1 and Turbo C v 2.0.
> +The code in this library is in no way optimised for the 16bit
> +operation of MSDOS.
> +
> +When building for glibc, ignore all of the above and just unpack into
> +glibc-1.??/des and then gmake as per normal.
> +
> +As a final note on performace.  Certain CPUs like sparcs and Alpha often give
> +a %10 speed difference depending on the link order.  It is rather anoying
> +when one program reports 'x' DES encrypts a second and another reports
> +'x*0.9' the speed.
> diff -Naur linux/cryptolib/libdes/Makefile linux-crypto/cryptolib/libdes/Makefile
> --- linux/cryptolib/libdes/Makefile	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/cryptolib/libdes/Makefile	Tue Aug 27 11:20:55 2002
> @@ -0,0 +1,250 @@
> +# You must select the correct terminal control system to be used to
> +# turn character echo off when reading passwords.  There a 5 systems
> +# SGTTY   - the old BSD system
> +# TERMIO  - most system V boxes
> +# TERMIOS - SGI (ala IRIX).
> +# VMS     - the DEC operating system
> +# MSDOS   - we all know what it is :-)
> +# read_pwd.c makes a reasonable guess at what is correct.
> +
> +# Targets
> +# make          - twidle the options yourself :-)
> +# make cc       - standard cc options
> +# make gcc      - standard gcc options
> +# make x86-elf  - linux-elf etc
> +# make x86-out  - linux-a.out, FreeBSD etc
> +# make x86-solaris
> +# make x86-bdsi
> +
> +# If you are on a DEC Alpha, edit des.h and change the DES_LONG
> +# define to 'unsigned int'.  I have seen this give a %20 speedup.
> +
> +OPTS0= -DLIBDES_LIT -DRAND -DTERMIO #-DNOCONST
> +
> +# Version 1.94 has changed the strings_to_key function so that it is
> +# now compatible with MITs when the string is longer than 8 characters.
> +# If you wish to keep the old version, uncomment the following line.
> +# This will affect the -E/-D options on des(1).
> +#OPTS1= -DOLD_STR_TO_KEY
> +
> +# There are 4 possible performance options
> +# -DDES_PTR
> +# -DDES_RISC1
> +# -DDES_RISC2 (only one of DES_RISC1 and DES_RISC2)
> +# -DDES_UNROLL
> +# after the initial build, run 'des_opts' to see which options are best
> +# for your platform.  There are some listed in options.txt
> +#OPTS2= -DDES_PTR 
> +#OPTS3= -DDES_RISC1 # or DES_RISC2
> +#OPTS4= -DDES_UNROLL
> +
> +OPTS= $(OPTS0) $(OPTS1) $(OPTS2) $(OPTS3) $(OPTS4)
> +
> +MAKE=make -f Makefile
> +#CC=cc
> +#CFLAG= -O
> +
> +#CC=gcc
> +#CFLAG= -O4 -funroll-loops -fomit-frame-pointer
> +CFLAG= -O3 -fomit-frame-pointer
> +
> +CFLAGS=$(OPTS) $(CFLAG)
> +CPP=$(CC) -E
> +AS=as
> +
> +# Assember version of des_encrypt*().
> +DES_ENC=des_enc.o 		# normal C version
> +#DES_ENC=asm/dx86-elf.o	asm/yx86-elf.o	# elf format x86
> +#DES_ENC=asm/dx86-out.o	asm/yx86-out.o	# a.out format x86
> +#DES_ENC=asm/dx86-sol.o	asm/yx86-sol.o	# solaris format x86 
> +#DES_ENC=asm/dx86bsdi.o	asm/yx86basi.o	# bsdi format x86 
> +
> +LIBDIR=/usr/local/lib
> +BINDIR=/usr/local/bin
> +INCDIR=/usr/local/include
> +MANDIR=/usr/local/man
> +MAN1=1
> +MAN3=3
> +SHELL=/bin/sh
> +OBJ_LIT=cbc_enc.o ecb_enc.o $(DES_ENC) set_key.o
> +OBJ_FULL=cbc_cksm.o $(OBJ_LIT) pcbc_enc.o \
> +	xcbc_enc.o qud_cksm.o \
> +	cfb64ede.o cfb64enc.o cfb_enc.o ecb3_enc.o \
> +	enc_read.o enc_writ.o ofb64ede.o ofb64enc.o ofb_enc.o  \
> +	rand_key.o read_pwd.o read2pwd.o rpc_enc.o  str2key.o supp.o
> +
> +GENERAL_LIT=COPYRIGHT INSTALL README VERSION Makefile des_crypt.man \
> +	des.doc options.txt asm
> +GENERAL_FULL=$(GENERAL_LIT) FILES Imakefile times vms.com KERBEROS MODES.DES \
> +	des.man DES.pm DES.pod DES.xs Makefile.PL dess.cpp des3s.cpp \
> +	Makefile.uni typemap t Makefile.ssl makefile.bc Makefile.lit \
> +	des.org des_locl.org
> +TESTING_LIT=	destest speed des_opts
> +TESTING_FULL=	rpw $(TESTING_LIT)
> +TESTING_SRC_LIT=destest.c speed.c des_opts.c
> +TESTING_SRC_FULL=rpw.c $(TESTING_SRC_LIT)
> +HEADERS_LIT=des_ver.h des.h des_locl.h podd.h sk.h spr.h
> +HEADERS_FULL= $(HEADERS_LIT) rpc_des.h
> +LIBDES_LIT=cbc_enc.c ecb_enc.c set_key.c des_enc.c
> +LIBDES_FULL= cbc_cksm.c pcbc_enc.c qud_cksm.c \
> +	cfb64ede.c cfb64enc.c cfb_enc.c ecb3_enc.c \
> +	enc_read.c enc_writ.c ofb64ede.c ofb64enc.c ofb_enc.c  \
> +	rand_key.c rpc_enc.c  str2key.c  supp.c \
> +	xcbc_enc.c $(LIBDES_LIT) read_pwd.c read2pwd.c
> +
> +PERL=	des.pl testdes.pl doIP doPC1 doPC2 PC1 PC2 shifts.pl
> +
> +OBJ=	$(OBJ_LIT)
> +GENERAL=$(GENERAL_LIT)
> +TESTING=$(TESTING_LIT)
> +TESTING_SRC=$(TESTING_SRC_LIT)
> +HEADERS=$(HEADERS_LIT)
> +LIBDES=	$(LIBDES_LIT)
> +
> +ALL=	$(GENERAL) $(TESTING_SRC) $(LIBDES) $(PERL) $(HEADERS)
> +
> +DLIB=	libdes.a
> +
> +all: $(DLIB) $(TESTING)
> +
> +cc:
> +	$(MAKE) CC=cc CFLAGS="-O $(OPTS) $(CFLAG)" all
> +
> +gcc:
> +	$(MAKE) CC=gcc CFLAGS="-O3 -fomit-frame-pointer $(OPTS) $(CFLAG)" all
> +
> +x86-elf:
> +	$(MAKE) DES_ENC='asm/dx86-elf.o asm/yx86-elf.o' CC='$(CC)' CFLAGS="-DELF $(OPTS) $(CFLAG)" all
> +
> +x86-out:
> +	$(MAKE) DES_ENC='asm/dx86-out.o asm/yx86-out.o' CC='$(CC)' CFLAGS="-DOUT $(OPTS) $(CFLAG)" all
> +
> +x86-solaris:
> +	$(MAKE) DES_ENC='asm/dx86-sol.o asm/yx86-sol.o' CC='$(CC)' CFLAGS="-DSOL $(OPTS) $(CFLAG)" all
> +
> +x86-bsdi:
> +	$(MAKE) DES_ENC='asm/dx86bsdi.o asm/yx86bsdi.o' CC='$(CC)' CFLAGS="-DBSDI $(OPTS) $(CFLAG)" all
> +
> +# elf
> +asm/dx86-elf.o: asm/dx86unix.cpp
> +	$(CPP) -DELF asm/dx86unix.cpp | $(AS) -o asm/dx86-elf.o
> +
> +asm/yx86-elf.o: asm/yx86unix.cpp
> +	$(CPP) -DELF asm/yx86unix.cpp | $(AS) -o asm/yx86-elf.o
> +
> +# solaris
> +asm/dx86-sol.o: asm/dx86unix.cpp
> +	$(CC) -E -DSOL asm/dx86unix.cpp | sed 's/^#.*//' > asm/dx86-sol.s
> +	as -o asm/dx86-sol.o asm/dx86-sol.s
> +	rm -f asm/dx86-sol.s
> +
> +asm/yx86-sol.o: asm/yx86unix.cpp
> +	$(CC) -E -DSOL asm/yx86unix.cpp | sed 's/^#.*//' > asm/yx86-sol.s
> +	as -o asm/yx86-sol.o asm/yx86-sol.s
> +	rm -f asm/yx86-sol.s
> +
> +# a.out
> +asm/dx86-out.o: asm/dx86unix.cpp
> +	$(CPP) -DOUT asm/dx86unix.cpp | $(AS) -o asm/dx86-out.o
> +
> +asm/yx86-out.o: asm/yx86unix.cpp
> +	$(CPP) -DOUT asm/yx86unix.cpp | $(AS) -o asm/yx86-out.o
> +
> +# bsdi
> +asm/dx86bsdi.o: asm/dx86unix.cpp
> +	$(CPP) -DBSDI asm/dx86unix.cpp | $(AS) -o asm/dx86bsdi.o
> +
> +asm/yx86bsdi.o: asm/yx86unix.cpp
> +	$(CPP) -DBSDI asm/yx86unix.cpp | $(AS) -o asm/yx86bsdi.o
> +
> +asm/dx86unix.cpp:
> +	(cd asm; perl des-586.pl cpp >dx86unix.cpp)
> +
> +asm/yx86unix.cpp:
> +	(cd asm; perl crypt586.pl cpp >yx86unix.cpp)
> +
> +test:	all
> +	./destest
> +
> +$(DLIB): $(OBJ)
> +	/bin/rm -f $(DLIB)
> +	ar cr $(DLIB) $(OBJ)
> +	-if test -s /bin/ranlib; then /bin/ranlib $(DLIB); \
> +	else if test -s /usr/bin/ranlib; then /usr/bin/ranlib $(DLIB); \
> +	else exit 0; fi; fi
> +
> +des_opts: des_opts.o $(DLIB)
> +	$(CC) $(CFLAGS) -o des_opts des_opts.o $(DLIB)
> +
> +destest: destest.o $(DLIB)
> +	$(CC) $(CFLAGS) -o destest destest.o $(DLIB)
> +
> +rpw: rpw.o $(DLIB)
> +	$(CC) $(CFLAGS) -o rpw rpw.o $(DLIB)
> +
> +speed: speed.o $(DLIB)
> +	$(CC) $(CFLAGS) -o speed speed.o $(DLIB)
> +
> +des: des.o $(DLIB)
> +	$(CC) $(CFLAGS) -o des des.o $(DLIB)
> +
> +tags:
> +	ctags $(TESTING_SRC) $(LIBDES)
> +
> +tar_lit:
> +	/bin/mv Makefile Makefile.tmp
> +	/bin/cp Makefile.lit Makefile
> +	tar chf libdes-l.tar $(LIBDES_LIT) $(HEADERS_LIT) \
> +		$(GENERAL_LIT) $(TESTING_SRC_LIT)
> +	/bin/rm -f Makefile
> +	/bin/mv Makefile.tmp Makefile
> +
> +tar:
> +	tar chf libdes.tar $(ALL)
> +
> +shar:
> +	shar $(ALL) >libdes.shar
> +
> +depend:
> +	makedepend $(LIBDES) $(TESTING_SRC)
> +
> +clean:
> +	/bin/rm -f *.o tags core $(TESTING) $(DLIB) .nfs* *.old *.bak asm/*.o 
> +
> +dclean:
> +	sed -e '/^# DO NOT DELETE THIS LINE/ q' Makefile >Makefile.new
> +	mv -f Makefile.new Makefile
> +
> +# Eric is probably going to choke when he next looks at this --tjh
> +install:
> +	if test $(INSTALLTOP); then \
> +	    echo SSL style install; \
> +	    cp $(DLIB) $(INSTALLTOP)/lib; \
> +	    if test -s /bin/ranlib; then \
> +	        /bin/ranlib $(INSTALLTOP)/lib/$(DLIB); \
> +	    else \
> +		if test -s /usr/bin/ranlib; then \
> +		/usr/bin/ranlib $(INSTALLTOP)/lib/$(DLIB); \
> +	    fi; fi; \
> +	    chmod 644 $(INSTALLTOP)/lib/$(DLIB); \
> +	    cp des.h $(INSTALLTOP)/include; \
> +	    chmod 644 $(INSTALLTOP)/include/des.h; \
> +	else \
> +	    echo Standalone install; \
> +	    cp $(DLIB) $(LIBDIR)/$(DLIB); \
> +	    if test -s /bin/ranlib; then \
> +	      /bin/ranlib $(LIBDIR)/$(DLIB); \
> +	    else \
> +	      if test -s /usr/bin/ranlib; then \
> +		/usr/bin/ranlib $(LIBDIR)/$(DLIB); \
> +	      fi; \
> +	    fi; \
> +	    chmod 644 $(LIBDIR)/$(DLIB); \
> +	    cp des_crypt.man $(MANDIR)/man$(MAN3)/des_crypt.$(MAN3); \
> +	    chmod 644 $(MANDIR)/man$(MAN3)/des_crypt.$(MAN3); \
> +	    cp des.man $(MANDIR)/man$(MAN1)/des.$(MAN1); \
> +	    chmod 644 $(MANDIR)/man$(MAN1)/des.$(MAN1); \
> +	    cp des.h $(INCDIR)/des.h; \
> +	    chmod 644 $(INCDIR)/des.h; \
> +	fi
> +# DO NOT DELETE THIS LINE -- make depend depends on it.
> diff -Naur linux/cryptolib/libdes/README linux-crypto/cryptolib/libdes/README
> --- linux/cryptolib/libdes/README	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/cryptolib/libdes/README	Tue Aug 27 11:20:55 2002
> @@ -0,0 +1,54 @@
> +
> +		libdes, Version 4.01 10-Jan-97
> +
> +		Copyright (c) 1997, Eric Young
> +			  All rights reserved.
> +
> +    This program is free software; you can redistribute it and/or modify
> +    it under the terms specified in COPYRIGHT.
> +    
> +--
> +The primary ftp site for this library is
> +ftp://ftp.psy.uq.oz.au/pub/Crypto/DES/libdes-x.xx.tar.gz
> +libdes is now also shipped with SSLeay.  Primary ftp site of
> +ftp://ftp.psy.uq.oz.au/pub/Crypto/SSL/SSLeay-x.x.x.tar.gz
> +
> +The best way to build this library is to build it as part of SSLeay.
> +
> +This kit builds a DES encryption library and a DES encryption program.
> +It supports ecb, cbc, ofb, cfb, triple ecb, triple cbc, triple ofb,
> +triple cfb, desx, and MIT's pcbc encryption modes and also has a fast
> +implementation of crypt(3).
> +It contains support routines to read keys from a terminal,
> +generate a random key, generate a key from an arbitrary length string,
> +read/write encrypted data from/to a file descriptor.
> +
> +The implementation was written so as to conform with the manual entry
> +for the des_crypt(3) library routines from MIT's project Athena.
> +
> +destest should be run after compilation to test the des routines.
> +rpw should be run after compilation to test the read password routines.
> +The des program is a replacement for the sun des command.  I believe it
> +conforms to the sun version.
> +
> +The Imakefile is setup for use in the kerberos distribution.
> +
> +These routines are best compiled with gcc or any other good
> +optimising compiler.
> +Just turn you optimiser up to the highest settings and run destest
> +after the build to make sure everything works.
> +
> +I believe these routines are close to the fastest and most portable DES
> +routines that use small lookup tables (4.5k) that are publicly available.
> +The fcrypt routine is faster than ufc's fcrypt (when compiling with
> +gcc2 -O2) on the sparc 2 (1410 vs 1270) but is not so good on other machines
> +(on a sun3/260 168 vs 336).  It is a function of CPU on chip cache size.
> +[ 10-Jan-97 and a function of an incorrect speed testing program in
> +  ufc which gave much better test figures that reality ].
> +
> +It is worth noting that on sparc and Alpha CPUs, performance of the DES
> +library can vary by upto %10 due to the positioning of files after application
> +linkage.
> +
> +Eric Young ([email protected])
> +
> diff -Naur linux/cryptolib/libdes/README.freeswan linux-crypto/cryptolib/libdes/README.freeswan
> --- linux/cryptolib/libdes/README.freeswan	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/cryptolib/libdes/README.freeswan	Tue Aug 27 11:20:55 2002
> @@ -0,0 +1,29 @@
> +The only changes the FreeS/WAN project has made to libdes-lite 4.04b are:
> +
> +We #ifdef-ed the declaration of DES_LONG in des.h, so it's more efficient
> +on the Alpha, instead of just noting the issue in a comment. 
> +
> +We #ifdef-ed out the des_options() function in ecb_enc.c, because we don't
> +use it, and its call to sprintf() can cause subtle difficulties when KLIPS
> +is built as a module (depending on details of Linux configuration options).
> +
> +We changed some instances of CC=$(CC) in the Makefile to CC='$(CC)' to make
> +it cope better with Linux kernel Makefile stupidities, and took out an
> +explicit CC=gcc (unwise on systems with strange compilers).
> +
> +We deleted some references to <stdio.h> and <stdlib.h>, and a declaration
> +of one function found only in the full libdes (not in libdes-lite), to
> +avoid dragging in bits of stdio/stdlib unnecessarily.  (Our thanks to Hans
> +Schultz for spotting this and pointing out the fixes.)
> +
> +We deleted a couple of .obj files in the asm subdirectory, which appear to
> +have been included in the original library by accident. 
> +
> +
> +
> +Note that Eric Young is no longer at the email address listed in these
> +files, and is (alas) no longer working on free crypto software. 
> +
> +
> +
> +This file is RCSID $Id: README.freeswan,v 1.9 2000/11/05 17:51:55 henry Exp $
> diff -Naur linux/cryptolib/libdes/VERSION linux-crypto/cryptolib/libdes/VERSION
> --- linux/cryptolib/libdes/VERSION	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/cryptolib/libdes/VERSION	Tue Aug 27 11:20:55 2002
> @@ -0,0 +1,406 @@
> +Version 4.04
> +	Fixed a few tests in destest.  Also added x86 assember for
> +	des_ncbc_encrypt() which is the standard cbc mode function.
> +	This makes a very very large performace difference.
> +	Ariel Glenn [email protected] reports that the terminal
> +	'turn echo off' can return (errno == EINVAL) under solaris
> +	when redirection is used.  So I now catch that as well as ENOTTY.
> +
> +
> +Version 4.03
> +	Left a static out of enc_write.c, which caused to buffer to be
> +	continiously malloc()ed.  Does anyone use these functions?  I keep
> +	on feeling like removing them since I only had these in there
> +	for a version of kerberised login.  Anyway, this was pointed out
> +	by Theo de Raadt <[email protected]>
> +	The 'n' bit ofb code was wrong, it was not shifting the shift
> +	register. It worked correctly for n == 64.  Thanks to
> +	Gigi Ankeny <[email protected]> for pointing this one out.
> +
> +Version 4.02
> +	I was doing 'if (memcmp(weak_keys[i],key,sizeof(key)) == 0)'
> +	when checking for weak keys which is wrong :-(, pointed out by
> +	Markus F.X.J. Oberhumer <[email protected]>.
> +
> +Version 4.01
> +	Even faster inner loop in the DES assembler for x86 and a modification
> +	for IP/FP which is faster on x86.  Both of these changes are
> +	from Svend Olaf Mikkelsen <[email protected]>.  His
> +	changes make the assembler run %40 faster on a pentium.  This is just
> +	a case of getting the instruction sequence 'just right'.
> +	All credit to 'Svend' :-)
> +	Quite a few special x86 'make' targets.
> +	A libdes-l (lite) distribution.
> +
> +Version 4.00
> +	After a bit of a pause, I'll up the major version number since this
> +	is mostly a performace release.  I've added x86 assembler and
> +	added more options for performance.  A %28 speedup for gcc 
> +	on a pentium and the assembler is a %50 speedup.
> +	MIPS CPU's, sparc and Alpha are the main CPU's with speedups.
> +	Run des_opts to work out which options should be used.
> +	DES_RISC1/DES_RISC2 use alternative inner loops which use
> +	more registers but should give speedups on any CPU that does
> +	dual issue (pentium).  DES_UNROLL unrolls the inner loop,
> +	which costs in code size.
> +
> +Version 3.26
> +	I've finally removed one of the shifts in D_ENCRYPT.  This
> +	meant I've changed the des_SPtrans table (spr.h), the set_key()
> +	function and some things in des_enc.c.  This has definitly
> +	made things faster :-).  I've known about this one for some
> +	time but I've been too lazy to follow it up :-).
> +	Noticed that in the D_ENCRYPT() macro, we can just do L^=(..)^(..)^..
> +	instead of L^=((..)|(..)|(..)..  This should save a register at
> +	least.
> +	Assember for x86.  The file to replace is des_enc.c, which is replaced
> +	by one of the assembler files found in asm.  Look at des/asm/readme
> +	for more info.
> +
> +	/* Modification to fcrypt so it can be compiled to support
> +	HPUX 10.x's long password format, define -DLONGCRYPT to use this.
> +	Thanks to Jens Kupferschmidt <[email protected]>. */
> +
> +	SIGWINCH case put in des_read_passwd() so the function does not
> +	'exit' if this function is recieved.
> +
> +Version 3.25 17/07/96
> +	Modified read_pwd.c so that stdin can be read if not a tty.
> +	Thanks to Jeff Barber <[email protected]> for the patches.
> +	des_init_random_number_generator() shortened due to VMS linker
> +	limits.
> +	Added RSA's DESX cbc mode.  It is a form of cbc encryption, with 2
> +	8 byte quantites xored before and after encryption.
> +	des_xcbc_encryption() - the name is funny to preserve the des_
> +	prefix on all functions.
> +
> +Version 3.24 20/04/96
> +	The DES_PTR macro option checked and used by SSLeay configuration
> +
> +Version 3.23 11/04/96
> +	Added DES_LONG.  If defined to 'unsigned int' on the DEC Alpha,
> +	it gives a %20 speedup :-)
> +	Fixed the problem with des.pl under perl5.  The patches were
> +	sent by Ed Kubaitis ([email protected]).
> +	if fcrypt.c, changed values to handle illegal salt values the way
> +	normal crypt() implementations do.  Some programs apparently use
> +	them :-(. The patch was sent by Bjorn Gronvall <[email protected]>
> +
> +Version 3.22 29/11/95
> +	Bug in des(1), an error with the uuencoding stuff when the
> +	'data' is small, thanks to Geoff Keating <[email protected]>
> +	for the patch.
> +
> +Version 3.21 22/11/95
> +	After some emailing back and forth with 
> +	Colin Plumb <[email protected]>, I've tweaked a few things
> +	and in a future version I will probably put in some of the
> +	optimisation he suggested for use with the DES_USE_PTR option.
> +	Extra routines from Mark Murray <[email protected]> for use in
> +	freeBSD.  They mostly involve random number generation for use
> +	with kerberos.  They involve evil machine specific system calls
> +	etc so I would normally suggest pushing this stuff into the
> +	application and/or using RAND_seed()/RAND_bytes() if you are
> +	using this DES library as part of SSLeay.
> +	Redone the read_pw() function so that it is cleaner and
> +	supports termios, thanks to Sameer Parekh <[email protected]>
> +	for the initial patches for this.
> +	Renamed 3ecb_encrypt() to ecb3_encrypt().  This has been
> +	 done just to make things more consistent.
> +	I have also now added triple DES versions of cfb and ofb.
> +
> +Version 3.20
> +	Damn, Damn, Damn, as pointed out by [email protected],
> +	my des_random_seed() function was only copying 4 bytes of the
> +	passed seed into the init structure.  It is now fixed to copy 8.
> +	My own suggestion is to used something like MD5 :-)
> +
> +Version 3.19 
> +	While looking at my code one day, I though, why do I keep on
> +	calling des_encrypt(in,out,ks,enc) when every function that
> +	calls it has in and out the same.  So I dropped the 'out'
> +	parameter, people should not be using this function.
> +
> +Version 3.18 30/08/95
> +	Fixed a few bit with the distribution and the filenames.
> +	3.17 had been munged via a move to DOS and back again.
> +	NO CODE CHANGES
> +
> +Version 3.17 14/07/95
> +	Fixed ede3 cbc which I had broken in 3.16.  I have also
> +	removed some unneeded variables in 7-8 of the routines.
> +
> +Version 3.16 26/06/95
> +	Added des_encrypt2() which does not use IP/FP, used by triple
> +	des routines.  Tweaked things a bit elsewhere. %13 speedup on
> +	sparc and %6 on a R4400 for ede3 cbc mode.
> +
> +Version 3.15 06/06/95
> +	Added des_ncbc_encrypt(), it is des_cbc mode except that it is
> +	'normal' and copies the new iv value back over the top of the
> +	passed parameter.
> +	CHANGED des_ede3_cbc_encrypt() so that it too now overwrites
> +	the iv.  THIS WILL BREAK EXISTING CODE, but since this function
> +	only new, I feel I can change it, not so with des_cbc_encrypt :-(.
> +	I need to update the documentation.
> +
> +Version 3.14 31/05/95
> +	New release upon the world, as part of my SSL implementation.
> +	New copyright and usage stuff.  Basically free for all to use
> +	as long as you say it came from me :-)
> +
> +Version 3.13 31/05/95
> +	A fix in speed.c, if HZ is not defined, I set it to 100.0
> +	which is reasonable for most unixes except SunOS 4.x.
> +	I now have a #ifdef sun but timing for SunOS 4.x looked very
> +	good :-(.  At my last job where I used SunOS 4.x, it was
> +	defined to be 60.0 (look at the old INSTALL documentation), at
> +	the last release had it changed to 100.0 since I now work with
> +	Solaris2 and SVR4 boxes.
> +	Thanks to  Rory Chisholm <[email protected]> for pointing this
> +	one out.
> +
> +Version 3.12 08/05/95
> +	As pointed out by The Crypt Keeper <[email protected]>,
> +	my D_ENCRYPT macro in crypt() had an un-necessary variable.
> +	It has been removed.
> +
> +Version 3.11 03/05/95
> +	Added des_ede3_cbc_encrypt() which is cbc mode des with 3 keys
> +	and one iv.  It is a standard and I needed it for my SSL code.
> +	It makes more sense to use this for triple DES than
> +	3cbc_encrypt().  I have also added (or should I say tested :-)
> +	cfb64_encrypt() which is cfb64 but it will encrypt a partial
> +	number of bytes - 3 bytes in 3 bytes out.  Again this is for
> +	my SSL library, as a form of encryption to use with SSL
> +	telnet.
> +
> +Version 3.10 22/03/95
> +	Fixed a bug in 3cbc_encrypt() :-(.  When making repeated calls
> +	to cbc3_encrypt, the 2 iv values that were being returned to
> +	be used in the next call were reversed :-(.
> +	Many thanks to Bill Wade <[email protected]> for pointing out
> +	this error.
> +
> +Version 3.09 01/02/95
> +	Fixed des_random_key to far more random, it was rather feeble
> +	with regards to picking the initial seed.  The problem was
> +	pointed out by Olaf Kirch <[email protected]>.
> +
> +Version 3.08 14/12/94
> +	Added Makefile.PL so libdes can be built into perl5.
> +	Changed des_locl.h so RAND is always defined.
> +
> +Version 3.07 05/12/94
> +	Added GNUmake and stuff so the library can be build with
> +	glibc.
> +
> +Version 3.06 30/08/94
> +	Added rpc_enc.c which contains _des_crypt.  This is for use in
> +	secure_rpc v 4.0
> +	Finally fixed the cfb_enc problems.
> +	Fixed a few parameter parsing bugs in des (-3 and -b), thanks
> +	to Rob McMillan <[email protected]>
> +
> +Version 3.05 21/04/94
> +	for unsigned long l; gcc does not produce ((l>>34) == 0)
> +	This causes bugs in cfb_enc.
> +	Thanks to Hadmut Danisch <[email protected]>
> +
> +Version 3.04 20/04/94
> +	Added a version number to des.c and libdes.a
> +
> +Version 3.03 12/01/94
> +	Fixed a bug in non zero iv in 3cbc_enc.
> +
> +Version 3.02 29/10/93
> +	I now work in a place where there are 6+ architectures and 14+
> +	OS versions :-).
> +	Fixed TERMIO definition so the most sys V boxes will work :-)
> +
> +Release upon comp.sources.misc
> +Version 3.01 08/10/93
> +	Added des_3cbc_encrypt()
> +
> +Version 3.00 07/10/93
> +	Fixed up documentation.
> +	quad_cksum definitely compatible with MIT's now.
> +
> +Version 2.30 24/08/93
> +	Triple DES now defaults to triple cbc but can do triple ecb
> +	 with the -b flag.
> +	Fixed some MSDOS uuen/uudecoding problems, thanks to
> +	Added prototypes.
> +	
> +Version 2.22 29/06/93
> +	Fixed a bug in des_is_weak_key() which stopped it working :-(
> +	thanks to [email protected].
> +
> +Version 2.21 03/06/93
> +	des(1) with no arguments gives quite a bit of help.
> +	Added -c (generate ckecksum) flag to des(1).
> +	Added -3 (triple DES) flag to des(1).
> +	Added cfb and ofb routines to the library.
> +
> +Version 2.20 11/03/93
> +	Added -u (uuencode) flag to des(1).
> +	I have been playing with byte order in quad_cksum to make it
> +	 compatible with MIT's version.  All I can say is avid this
> +	 function if possible since MIT's output is endian dependent.
> +
> +Version 2.12 14/10/92
> +	Added MSDOS specific macro in ecb_encrypt which gives a %70
> +	 speed up when the code is compiled with turbo C.
> +
> +Version 2.11 12/10/92
> +	Speedup in set_key (recoding of PC-1)
> +	 I now do it in 47 simple operations, down from 60.
> +	 Thanks to John Fletcher ([email protected])
> +	 for motivating me to look for a faster system :-)
> +	 The speedup is probably less that 1% but it is still 13
> +	 instructions less :-).
> +
> +Version 2.10 06/10/92
> +	The code now works on the 64bit ETA10 and CRAY without modifications or
> +	 #defines.  I believe the code should work on any machine that
> +	 defines long, int or short to be 8 bytes long.
> +	Thanks to Shabbir J. Safdar ([email protected])
> +	 for helping me fix the code to run on 64bit machines (he had
> +	 access to an ETA10).
> +	Thanks also to John Fletcher <[email protected]>
> +	 for testing the routines on a CRAY.
> +	read_password.c has been renamed to read_passwd.c
> +	string_to_key.c has been renamed to string2key.c
> +
> +Version 2.00 14/09/92
> +	Made mods so that the library should work on 64bit CPU's.
> +	Removed all my uchar and ulong defs.  To many different
> +	 versions of unix define them in their header files in too many
> +	 different combinations :-)
> +	IRIX - Sillicon Graphics mods (mostly in read_password.c).
> +	 Thanks to Andrew Daviel ([email protected])
> +
> +Version 1.99 26/08/92
> +	Fixed a bug or 2 in enc_read.c
> +	Fixed a bug in enc_write.c
> +	Fixed a pseudo bug in fcrypt.c (very obscure).
> +
> +Version 1.98 31/07/92
> +	Support for the ETA10.  This is a strange machine that defines
> +	longs and ints as 8 bytes and shorts as 4 bytes.
> +	Since I do evil things with long * that assume that they are 4
> +	bytes.  Look in the Makefile for the option to compile for
> +	this machine.  quad_cksum appears to have problems but I
> +	will don't have the time to fix it right now, and this is not
> +	a function that uses DES and so will not effect the main uses
> +	of the library.
> +
> +Version 1.97 20/05/92 eay
> +	Fixed the Imakefile and made some changes to des.h to fix some
> +	problems when building this package with Kerberos v 4.
> +
> +Version 1.96 18/05/92 eay
> +	Fixed a small bug in string_to_key() where problems could
> +	occur if des_check_key was set to true and the string
> +	generated a weak key.
> +
> +Patch2 posted to comp.sources.misc
> +Version 1.95 13/05/92 eay
> +	Added an alternative version of the D_ENCRYPT macro in
> +	ecb_encrypt and fcrypt.  Depending on the compiler, one version or the
> +	other will be faster.  This was inspired by 
> +	Dana How <[email protected]>, and her pointers about doing the
> +	*(ulong *)((uchar *)ptr+(value&0xfc))
> +	vs
> +	ptr[value&0x3f]
> +	to stop the C compiler doing a <<2 to convert the long array index.
> +
> +Version 1.94 05/05/92 eay
> +	Fixed an incompatibility between my string_to_key and the MIT
> +	 version.  When the key is longer than 8 chars, I was wrapping
> +	 with a different method.  To use the old version, define
> +	 OLD_STR_TO_KEY in the makefile.  Thanks to
> +	 [email protected] (Viktor Dukhovni).
> +
> +Version 1.93 28/04/92 eay
> +	Fixed the VMS mods so that echo is now turned off in
> +	 read_password.  Thanks again to [email protected].
> +	MSDOS support added.  The routines can be compiled with
> +	 Turbo C (v2.0) and MSC (v5.1).  Make sure MSDOS is defined.
> +
> +Patch1 posted to comp.sources.misc
> +Version 1.92 13/04/92 eay
> +	Changed D_ENCRYPT so that the rotation of R occurs outside of
> +	 the loop.  This required rotating all the longs in sp.h (now
> +	 called spr.h). Thanks to Richard Outerbridge <[email protected]>
> +	speed.c has been changed so it will work without SIGALRM.  If
> +	 times(3) is not present it will try to use ftime() instead.
> +
> +Version 1.91 08/04/92 eay
> +	Added -E/-D options to des(1) so it can use string_to_key.
> +	Added SVR4 mods suggested by [email protected]
> +	Added VMS mods suggested by [email protected].  If
> +	anyone knows how to turn of tty echo in VMS please tell me or
> +	implement it yourself :-).
> +	Changed FILE *IN/*OUT to *DES_IN/*DES_OUT since it appears VMS
> +	does not like IN/OUT being used.
> +
> +Libdes posted to comp.sources.misc
> +Version 1.9 24/03/92 eay
> +	Now contains a fast small crypt replacement.
> +	Added des(1) command.
> +	Added des_rw_mode so people can use cbc encryption with
> +	enc_read and enc_write.
> +
> +Version 1.8 15/10/91 eay
> +	Bug in cbc_cksum.
> +	Many thanks to Keith Reynolds ([email protected]) for pointing this
> +	one out.
> +
> +Version 1.7 24/09/91 eay
> +	Fixed set_key :-)
> +	set_key is 4 times faster and takes less space.
> +	There are a few minor changes that could be made.
> +
> +Version 1.6 19/09/1991 eay
> +	Finally go IP and FP finished.
> +	Now I need to fix set_key.
> +	This version is quite a bit faster that 1.51
> +
> +Version 1.52 15/06/1991 eay
> +	20% speedup in ecb_encrypt by changing the E bit selection
> +	to use 2 32bit words.  This also required modification of the
> +	sp table.  There is still a way to speedup the IP and IP-1
> +	(hints from [email protected]) still working on this one :-(.
> +
> +Version 1.51 07/06/1991 eay
> +	Faster des_encrypt by loop unrolling
> +	Fixed bug in quad_cksum.c (thanks to [email protected])
> +
> +Version 1.50 28/05/1991 eay
> +	Optimised the code a bit more for the sparc.  I have improved the
> +	speed of the inner des_encrypt by speeding up the initial and
> +	final permutations.
> +
> +Version 1.40 23/10/1990 eay
> +	Fixed des_random_key, it did not produce a random key :-(
> +
> +Version 1.30  2/10/1990 eay
> +	Have made des_quad_cksum the same as MIT's, the full package
> +	should be compatible with MIT's
> +	Have tested on a DECstation 3100
> +	Still need to fix des_set_key (make it faster).
> +	Does des_cbc_encrypts at 70.5k/sec on a 3100.
> +
> +Version 1.20 18/09/1990 eay
> +	Fixed byte order dependencies.
> +	Fixed (I hope) all the word alignment problems.
> +	Speedup in des_ecb_encrypt.
> +
> +Version 1.10 11/09/1990 eay
> +	Added des_enc_read and des_enc_write.
> +	Still need to fix des_quad_cksum.
> +	Still need to document des_enc_read and des_enc_write.
> +
> +Version 1.00 27/08/1990 eay
> +
> diff -Naur linux/cryptolib/libdes/asm/crypt586.pl linux-crypto/cryptolib/libdes/asm/crypt586.pl
> --- linux/cryptolib/libdes/asm/crypt586.pl	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/cryptolib/libdes/asm/crypt586.pl	Tue Aug 27 11:20:55 2002
> @@ -0,0 +1,204 @@
> +#!/usr/local/bin/perl
> +#
> +# The inner loop instruction sequence and the IP/FP modifications are from
> +# Svend Olaf Mikkelsen <[email protected]>
> +# I've added the stuff needed for crypt() but I've not worried about making
> +# things perfect.
> +#
> +
> +push(@INC,"perlasm","../../perlasm");
> +require "x86asm.pl";
> +
> +&asm_init($ARGV[0],"crypt586.pl");
> +
> +$L="edi";
> +$R="esi";
> +
> +&external_label("des_SPtrans");
> +&fcrypt_body("fcrypt_body");
> +&asm_finish();
> +
> +sub fcrypt_body
> +	{
> +	local($name,$do_ip)=@_;
> +
> +	&function_begin($name,"EXTRN   _des_SPtrans:DWORD");
> +
> +	&comment("");
> +	&comment("Load the 2 words");
> +	$ks="ebp";
> +
> +	&xor(	$L,	$L);
> +	&xor(	$R,	$R);
> +	&mov($ks,&wparam(1));
> +
> +	&push(25); # add a variable
> +
> +	&set_label("start");
> +	for ($i=0; $i<16; $i+=2)
> +		{
> +		&comment("");
> +		&comment("Round $i");
> +		&D_ENCRYPT($i,$L,$R,$i*2,$ks,"des_SPtrans","eax","ebx","ecx","edx");
> +
> +		&comment("");
> +		&comment("Round ".sprintf("%d",$i+1));
> +		&D_ENCRYPT($i+1,$R,$L,($i+1)*2,$ks,"des_SPtrans","eax","ebx","ecx","edx");
> +		}
> +	 &mov("ebx",	&swtmp(0));
> +	&mov("eax",	$L);
> +	 &dec("ebx");
> +	&mov($L,	$R);
> +	 &mov($R,	"eax");
> +	&mov(&swtmp(0),	"ebx");
> +	 &jnz(&label("start"));
> +
> +	&comment("");
> +	&comment("FP");
> +	&mov("edx",&wparam(0));
> +
> +	&FP_new($R,$L,"eax",3);
> +	&mov(&DWP(0,"edx","",0),"eax");
> +	&mov(&DWP(4,"edx","",0),$L);
> +
> +	&pop("ecx");	# remove variable
> +
> +	&function_end($name);
> +	}
> +
> +sub D_ENCRYPT
> +	{
> +	local($r,$L,$R,$S,$ks,$desSP,$u,$tmp1,$tmp2,$t)=@_;
> +
> +	&mov(	$u,		&wparam(2));			# 2
> +	&mov(	$t,		$R);
> +	&shr(	$t,		16);				# 1
> +	&mov(	$tmp2,		&wparam(3));			# 2
> +	&xor(	$t,		$R);				# 1
> +
> +	&and(	$u,		$t);				# 2
> +	&and(	$t,		$tmp2);				# 2
> +
> +	&mov(	$tmp1,		$u);
> +	&shl(	$tmp1,		16); 				# 1
> +	&mov(	$tmp2,		$t);
> +	&shl(	$tmp2,		16); 				# 1
> +	&xor(	$u,		$tmp1);				# 2
> +	&xor(	$t,		$tmp2);				# 2
> +	&mov(	$tmp1,		&DWP(&n2a($S*4),$ks,"",0));	# 2
> +	&xor(	$u,		$tmp1);
> +	&mov(	$tmp2,		&DWP(&n2a(($S+1)*4),$ks,"",0));	# 2
> +	&xor(	$u,		$R);
> +	&xor(	$t,		$R);
> +	&xor(	$t,		$tmp2);
> +
> +	&and(	$u,		"0xfcfcfcfc"	);		# 2
> +	&xor(	$tmp1,		$tmp1);				# 1
> +	&and(	$t,		"0xcfcfcfcf"	);		# 2
> +	&xor(	$tmp2,		$tmp2);	
> +	&movb(	&LB($tmp1),	&LB($u)	);
> +	&movb(	&LB($tmp2),	&HB($u)	);
> +	&rotr(	$t,		4		);
> +	&mov(	$ks,		&DWP("      $desSP",$tmp1,"",0));
> +	&movb(	&LB($tmp1),	&LB($t)	);
> +	&xor(	$L,		$ks);
> +	&mov(	$ks,		&DWP("0x200+$desSP",$tmp2,"",0));
> +	&xor(	$L,		$ks);
> +	&movb(	&LB($tmp2),	&HB($t)	);
> +	&shr(	$u,		16);
> +	&mov(	$ks,		&DWP("0x100+$desSP",$tmp1,"",0));
> +	&xor(	$L,		$ks); 
> +	&movb(	&LB($tmp1),	&HB($u)	);
> +	&shr(	$t,		16);
> +	&mov(	$ks,		&DWP("0x300+$desSP",$tmp2,"",0));
> +	&xor(	$L,		$ks);
> +	&mov(	$ks,		&wparam(1));
> +	&movb(	&LB($tmp2),	&HB($t)	);
> +	&and(	$u,		"0xff"	);
> +	&and(	$t,		"0xff"	);
> +	&mov(	$tmp1,		&DWP("0x600+$desSP",$tmp1,"",0));
> +	&xor(	$L,		$tmp1);
> +	&mov(	$tmp1,		&DWP("0x700+$desSP",$tmp2,"",0));
> +	&xor(	$L,		$tmp1);
> +	&mov(	$tmp1,		&DWP("0x400+$desSP",$u,"",0));
> +	&xor(	$L,		$tmp1);
> +	&mov(	$tmp1,		&DWP("0x500+$desSP",$t,"",0));
> +	&xor(	$L,		$tmp1);
> +	}
> +
> +sub n2a
> +	{
> +	sprintf("%d",$_[0]);
> +	}
> +
> +# now has a side affect of rotating $a by $shift
> +sub R_PERM_OP
> +	{
> +	local($a,$b,$tt,$shift,$mask,$last)=@_;
> +
> +	&rotl(	$a,		$shift		) if ($shift != 0);
> +	&mov(	$tt,		$a		);
> +	&xor(	$a,		$b		);
> +	&and(	$a,		$mask		);
> +	if ($notlast eq $b)
> +		{
> +		&xor(	$b,		$a		);
> +		&xor(	$tt,		$a		);
> +		}
> +	else
> +		{
> +		&xor(	$tt,		$a		);
> +		&xor(	$b,		$a		);
> +		}
> +	&comment("");
> +	}
> +
> +sub IP_new
> +	{
> +	local($l,$r,$tt,$lr)=@_;
> +
> +	&R_PERM_OP($l,$r,$tt, 4,"0xf0f0f0f0",$l);
> +	&R_PERM_OP($r,$tt,$l,20,"0xfff0000f",$l);
> +	&R_PERM_OP($l,$tt,$r,14,"0x33333333",$r);
> +	&R_PERM_OP($tt,$r,$l,22,"0x03fc03fc",$r);
> +	&R_PERM_OP($l,$r,$tt, 9,"0xaaaaaaaa",$r);
> +	
> +	if ($lr != 3)
> +		{
> +		if (($lr-3) < 0)
> +			{ &rotr($tt,	3-$lr); }
> +		else	{ &rotl($tt,	$lr-3); }
> +		}
> +	if ($lr != 2)
> +		{
> +		if (($lr-2) < 0)
> +			{ &rotr($r,	2-$lr); }
> +		else	{ &rotl($r,	$lr-2); }
> +		}
> +	}
> +
> +sub FP_new
> +	{
> +	local($l,$r,$tt,$lr)=@_;
> +
> +	if ($lr != 2)
> +		{
> +		if (($lr-2) < 0)
> +			{ &rotl($r,	2-$lr); }
> +		else	{ &rotr($r,	$lr-2); }
> +		}
> +	if ($lr != 3)
> +		{
> +		if (($lr-3) < 0)
> +			{ &rotl($l,	3-$lr); }
> +		else	{ &rotr($l,	$lr-3); }
> +		}
> +
> +	&R_PERM_OP($l,$r,$tt, 0,"0xaaaaaaaa",$r);
> +	&R_PERM_OP($tt,$r,$l,23,"0x03fc03fc",$r);
> +	&R_PERM_OP($l,$r,$tt,10,"0x33333333",$l);
> +	&R_PERM_OP($r,$tt,$l,18,"0xfff0000f",$l);
> +	&R_PERM_OP($l,$tt,$r,12,"0xf0f0f0f0",$r);
> +	&rotr($tt	, 4);
> +	}
> +
> diff -Naur linux/cryptolib/libdes/asm/d-win32.asm linux-crypto/cryptolib/libdes/asm/d-win32.asm
> --- linux/cryptolib/libdes/asm/d-win32.asm	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/cryptolib/libdes/asm/d-win32.asm	Tue Aug 27 11:20:55 2002
> @@ -0,0 +1,3132 @@
> +	; Don't even think of reading this code
> +	; It was automatically generated by des-586.pl
> +	; Which is a perl program used to generate the x86 assember for
> +	; any of elf, a.out, BSDI,Win32, or Solaris
> +	; eric <[email protected]>
> +	; 
> +	TITLE	des-586.asm
> +        .386
> +.model FLAT
> +_TEXT	SEGMENT
> +PUBLIC	_des_encrypt
> +EXTRN   _des_SPtrans:DWORD
> +_des_encrypt PROC NEAR
> +	push	esi
> +	push	edi
> +	; 
> +	; Load the 2 words
> +	mov	esi,		DWORD PTR 12[esp]
> +	xor	ecx,		ecx
> +	push	ebx
> +	push	ebp
> +	mov	eax,		DWORD PTR [esi]
> +	mov	ebx,		DWORD PTR 28[esp]
> +	mov	edi,		DWORD PTR 4[esi]
> +	; 
> +	; IP
> +	rol	eax,		4
> +	mov	esi,		eax
> +	xor	eax,		edi
> +	and	eax,		0f0f0f0f0h
> +	xor	esi,		eax
> +	xor	edi,		eax
> +	; 
> +	rol	edi,		20
> +	mov	eax,		edi
> +	xor	edi,		esi
> +	and	edi,		0fff0000fh
> +	xor	eax,		edi
> +	xor	esi,		edi
> +	; 
> +	rol	eax,		14
> +	mov	edi,		eax
> +	xor	eax,		esi
> +	and	eax,		033333333h
> +	xor	edi,		eax
> +	xor	esi,		eax
> +	; 
> +	rol	esi,		22
> +	mov	eax,		esi
> +	xor	esi,		edi
> +	and	esi,		003fc03fch
> +	xor	eax,		esi
> +	xor	edi,		esi
> +	; 
> +	rol	eax,		9
> +	mov	esi,		eax
> +	xor	eax,		edi
> +	and	eax,		0aaaaaaaah
> +	xor	esi,		eax
> +	xor	edi,		eax
> +	; 
> +	rol	edi,		1
> +	mov	ebp,		DWORD PTR 24[esp]
> +	cmp	ebx,		0
> +	je	$L000start_decrypt
> +	; 
> +	; Round 0
> +	mov	eax,		DWORD PTR [ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 4[ebp]
> +	xor	eax,		esi
> +	xor	edx,		esi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	edi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	edi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	edi,		ebx
> +	; 
> +	; Round 1
> +	mov	eax,		DWORD PTR 8[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 12[ebp]
> +	xor	eax,		edi
> +	xor	edx,		edi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	esi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	esi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	esi,		ebx
> +	; 
> +	; Round 2
> +	mov	eax,		DWORD PTR 16[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 20[ebp]
> +	xor	eax,		esi
> +	xor	edx,		esi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	edi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	edi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	edi,		ebx
> +	; 
> +	; Round 3
> +	mov	eax,		DWORD PTR 24[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 28[ebp]
> +	xor	eax,		edi
> +	xor	edx,		edi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	esi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	esi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	esi,		ebx
> +	; 
> +	; Round 4
> +	mov	eax,		DWORD PTR 32[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 36[ebp]
> +	xor	eax,		esi
> +	xor	edx,		esi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	edi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	edi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	edi,		ebx
> +	; 
> +	; Round 5
> +	mov	eax,		DWORD PTR 40[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 44[ebp]
> +	xor	eax,		edi
> +	xor	edx,		edi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	esi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	esi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	esi,		ebx
> +	; 
> +	; Round 6
> +	mov	eax,		DWORD PTR 48[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 52[ebp]
> +	xor	eax,		esi
> +	xor	edx,		esi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	edi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	edi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	edi,		ebx
> +	; 
> +	; Round 7
> +	mov	eax,		DWORD PTR 56[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 60[ebp]
> +	xor	eax,		edi
> +	xor	edx,		edi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	esi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	esi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	esi,		ebx
> +	; 
> +	; Round 8
> +	mov	eax,		DWORD PTR 64[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 68[ebp]
> +	xor	eax,		esi
> +	xor	edx,		esi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	edi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	edi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	edi,		ebx
> +	; 
> +	; Round 9
> +	mov	eax,		DWORD PTR 72[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 76[ebp]
> +	xor	eax,		edi
> +	xor	edx,		edi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	esi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	esi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	esi,		ebx
> +	; 
> +	; Round 10
> +	mov	eax,		DWORD PTR 80[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 84[ebp]
> +	xor	eax,		esi
> +	xor	edx,		esi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	edi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	edi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	edi,		ebx
> +	; 
> +	; Round 11
> +	mov	eax,		DWORD PTR 88[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 92[ebp]
> +	xor	eax,		edi
> +	xor	edx,		edi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	esi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	esi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	esi,		ebx
> +	; 
> +	; Round 12
> +	mov	eax,		DWORD PTR 96[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 100[ebp]
> +	xor	eax,		esi
> +	xor	edx,		esi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	edi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	edi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	edi,		ebx
> +	; 
> +	; Round 13
> +	mov	eax,		DWORD PTR 104[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 108[ebp]
> +	xor	eax,		edi
> +	xor	edx,		edi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	esi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	esi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	esi,		ebx
> +	; 
> +	; Round 14
> +	mov	eax,		DWORD PTR 112[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 116[ebp]
> +	xor	eax,		esi
> +	xor	edx,		esi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	edi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	edi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	edi,		ebx
> +	; 
> +	; Round 15
> +	mov	eax,		DWORD PTR 120[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 124[ebp]
> +	xor	eax,		edi
> +	xor	edx,		edi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	esi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	esi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	esi,		ebx
> +	jmp	$L001end
> +$L000start_decrypt:
> +	; 
> +	; Round 15
> +	mov	eax,		DWORD PTR 120[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 124[ebp]
> +	xor	eax,		esi
> +	xor	edx,		esi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	edi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	edi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	edi,		ebx
> +	; 
> +	; Round 14
> +	mov	eax,		DWORD PTR 112[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 116[ebp]
> +	xor	eax,		edi
> +	xor	edx,		edi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	esi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	esi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	esi,		ebx
> +	; 
> +	; Round 13
> +	mov	eax,		DWORD PTR 104[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 108[ebp]
> +	xor	eax,		esi
> +	xor	edx,		esi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	edi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	edi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	edi,		ebx
> +	; 
> +	; Round 12
> +	mov	eax,		DWORD PTR 96[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 100[ebp]
> +	xor	eax,		edi
> +	xor	edx,		edi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	esi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	esi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	esi,		ebx
> +	; 
> +	; Round 11
> +	mov	eax,		DWORD PTR 88[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 92[ebp]
> +	xor	eax,		esi
> +	xor	edx,		esi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	edi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	edi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	edi,		ebx
> +	; 
> +	; Round 10
> +	mov	eax,		DWORD PTR 80[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 84[ebp]
> +	xor	eax,		edi
> +	xor	edx,		edi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	esi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	esi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	esi,		ebx
> +	; 
> +	; Round 9
> +	mov	eax,		DWORD PTR 72[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 76[ebp]
> +	xor	eax,		esi
> +	xor	edx,		esi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	edi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	edi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	edi,		ebx
> +	; 
> +	; Round 8
> +	mov	eax,		DWORD PTR 64[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 68[ebp]
> +	xor	eax,		edi
> +	xor	edx,		edi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	esi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	esi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	esi,		ebx
> +	; 
> +	; Round 7
> +	mov	eax,		DWORD PTR 56[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 60[ebp]
> +	xor	eax,		esi
> +	xor	edx,		esi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	edi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	edi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	edi,		ebx
> +	; 
> +	; Round 6
> +	mov	eax,		DWORD PTR 48[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 52[ebp]
> +	xor	eax,		edi
> +	xor	edx,		edi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	esi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	esi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	esi,		ebx
> +	; 
> +	; Round 5
> +	mov	eax,		DWORD PTR 40[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 44[ebp]
> +	xor	eax,		esi
> +	xor	edx,		esi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	edi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	edi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	edi,		ebx
> +	; 
> +	; Round 4
> +	mov	eax,		DWORD PTR 32[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 36[ebp]
> +	xor	eax,		edi
> +	xor	edx,		edi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	esi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	esi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	esi,		ebx
> +	; 
> +	; Round 3
> +	mov	eax,		DWORD PTR 24[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 28[ebp]
> +	xor	eax,		esi
> +	xor	edx,		esi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	edi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	edi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	edi,		ebx
> +	; 
> +	; Round 2
> +	mov	eax,		DWORD PTR 16[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 20[ebp]
> +	xor	eax,		edi
> +	xor	edx,		edi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	esi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	esi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	esi,		ebx
> +	; 
> +	; Round 1
> +	mov	eax,		DWORD PTR 8[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 12[ebp]
> +	xor	eax,		esi
> +	xor	edx,		esi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	edi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	edi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	edi,		ebx
> +	; 
> +	; Round 0
> +	mov	eax,		DWORD PTR [ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 4[ebp]
> +	xor	eax,		edi
> +	xor	edx,		edi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	esi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	esi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	esi,		ebx
> +$L001end:
> +	; 
> +	; FP
> +	mov	edx,		DWORD PTR 20[esp]
> +	ror	esi,		1
> +	mov	eax,		edi
> +	xor	edi,		esi
> +	and	edi,		0aaaaaaaah
> +	xor	eax,		edi
> +	xor	esi,		edi
> +	; 
> +	rol	eax,		23
> +	mov	edi,		eax
> +	xor	eax,		esi
> +	and	eax,		003fc03fch
> +	xor	edi,		eax
> +	xor	esi,		eax
> +	; 
> +	rol	edi,		10
> +	mov	eax,		edi
> +	xor	edi,		esi
> +	and	edi,		033333333h
> +	xor	eax,		edi
> +	xor	esi,		edi
> +	; 
> +	rol	esi,		18
> +	mov	edi,		esi
> +	xor	esi,		eax
> +	and	esi,		0fff0000fh
> +	xor	edi,		esi
> +	xor	eax,		esi
> +	; 
> +	rol	edi,		12
> +	mov	esi,		edi
> +	xor	edi,		eax
> +	and	edi,		0f0f0f0f0h
> +	xor	esi,		edi
> +	xor	eax,		edi
> +	; 
> +	ror	eax,		4
> +	mov	DWORD PTR [edx],eax
> +	mov	DWORD PTR 4[edx],esi
> +	pop	ebp
> +	pop	ebx
> +	pop	edi
> +	pop	esi
> +	ret
> +_des_encrypt ENDP
> +_TEXT	ENDS
> +_TEXT	SEGMENT
> +PUBLIC	_des_encrypt2
> +EXTRN   _des_SPtrans:DWORD
> +_des_encrypt2 PROC NEAR
> +	push	esi
> +	push	edi
> +	; 
> +	; Load the 2 words
> +	mov	eax,		DWORD PTR 12[esp]
> +	xor	ecx,		ecx
> +	push	ebx
> +	push	ebp
> +	mov	esi,		DWORD PTR [eax]
> +	mov	ebx,		DWORD PTR 28[esp]
> +	rol	esi,		3
> +	mov	edi,		DWORD PTR 4[eax]
> +	rol	edi,		3
> +	mov	ebp,		DWORD PTR 24[esp]
> +	cmp	ebx,		0
> +	je	$L002start_decrypt
> +	; 
> +	; Round 0
> +	mov	eax,		DWORD PTR [ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 4[ebp]
> +	xor	eax,		esi
> +	xor	edx,		esi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	edi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	edi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	edi,		ebx
> +	; 
> +	; Round 1
> +	mov	eax,		DWORD PTR 8[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 12[ebp]
> +	xor	eax,		edi
> +	xor	edx,		edi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	esi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	esi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	esi,		ebx
> +	; 
> +	; Round 2
> +	mov	eax,		DWORD PTR 16[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 20[ebp]
> +	xor	eax,		esi
> +	xor	edx,		esi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	edi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	edi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	edi,		ebx
> +	; 
> +	; Round 3
> +	mov	eax,		DWORD PTR 24[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 28[ebp]
> +	xor	eax,		edi
> +	xor	edx,		edi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	esi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	esi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	esi,		ebx
> +	; 
> +	; Round 4
> +	mov	eax,		DWORD PTR 32[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 36[ebp]
> +	xor	eax,		esi
> +	xor	edx,		esi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	edi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	edi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	edi,		ebx
> +	; 
> +	; Round 5
> +	mov	eax,		DWORD PTR 40[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 44[ebp]
> +	xor	eax,		edi
> +	xor	edx,		edi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	esi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	esi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	esi,		ebx
> +	; 
> +	; Round 6
> +	mov	eax,		DWORD PTR 48[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 52[ebp]
> +	xor	eax,		esi
> +	xor	edx,		esi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	edi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	edi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	edi,		ebx
> +	; 
> +	; Round 7
> +	mov	eax,		DWORD PTR 56[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 60[ebp]
> +	xor	eax,		edi
> +	xor	edx,		edi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	esi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	esi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	esi,		ebx
> +	; 
> +	; Round 8
> +	mov	eax,		DWORD PTR 64[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 68[ebp]
> +	xor	eax,		esi
> +	xor	edx,		esi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	edi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	edi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	edi,		ebx
> +	; 
> +	; Round 9
> +	mov	eax,		DWORD PTR 72[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 76[ebp]
> +	xor	eax,		edi
> +	xor	edx,		edi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	esi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	esi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	esi,		ebx
> +	; 
> +	; Round 10
> +	mov	eax,		DWORD PTR 80[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 84[ebp]
> +	xor	eax,		esi
> +	xor	edx,		esi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	edi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	edi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	edi,		ebx
> +	; 
> +	; Round 11
> +	mov	eax,		DWORD PTR 88[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 92[ebp]
> +	xor	eax,		edi
> +	xor	edx,		edi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	esi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	esi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	esi,		ebx
> +	; 
> +	; Round 12
> +	mov	eax,		DWORD PTR 96[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 100[ebp]
> +	xor	eax,		esi
> +	xor	edx,		esi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	edi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	edi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	edi,		ebx
> +	; 
> +	; Round 13
> +	mov	eax,		DWORD PTR 104[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 108[ebp]
> +	xor	eax,		edi
> +	xor	edx,		edi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	esi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	esi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	esi,		ebx
> +	; 
> +	; Round 14
> +	mov	eax,		DWORD PTR 112[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 116[ebp]
> +	xor	eax,		esi
> +	xor	edx,		esi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	edi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	edi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	edi,		ebx
> +	; 
> +	; Round 15
> +	mov	eax,		DWORD PTR 120[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 124[ebp]
> +	xor	eax,		edi
> +	xor	edx,		edi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	esi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	esi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	esi,		ebx
> +	jmp	$L003end
> +$L002start_decrypt:
> +	; 
> +	; Round 15
> +	mov	eax,		DWORD PTR 120[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 124[ebp]
> +	xor	eax,		esi
> +	xor	edx,		esi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	edi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	edi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	edi,		ebx
> +	; 
> +	; Round 14
> +	mov	eax,		DWORD PTR 112[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 116[ebp]
> +	xor	eax,		edi
> +	xor	edx,		edi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	esi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	esi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	esi,		ebx
> +	; 
> +	; Round 13
> +	mov	eax,		DWORD PTR 104[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 108[ebp]
> +	xor	eax,		esi
> +	xor	edx,		esi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	edi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	edi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	edi,		ebx
> +	; 
> +	; Round 12
> +	mov	eax,		DWORD PTR 96[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 100[ebp]
> +	xor	eax,		edi
> +	xor	edx,		edi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	esi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	esi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	esi,		ebx
> +	; 
> +	; Round 11
> +	mov	eax,		DWORD PTR 88[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 92[ebp]
> +	xor	eax,		esi
> +	xor	edx,		esi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	edi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	edi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	edi,		ebx
> +	; 
> +	; Round 10
> +	mov	eax,		DWORD PTR 80[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 84[ebp]
> +	xor	eax,		edi
> +	xor	edx,		edi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	esi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	esi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	esi,		ebx
> +	; 
> +	; Round 9
> +	mov	eax,		DWORD PTR 72[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 76[ebp]
> +	xor	eax,		esi
> +	xor	edx,		esi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	edi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	edi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	edi,		ebx
> +	; 
> +	; Round 8
> +	mov	eax,		DWORD PTR 64[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 68[ebp]
> +	xor	eax,		edi
> +	xor	edx,		edi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	esi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	esi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	esi,		ebx
> +	; 
> +	; Round 7
> +	mov	eax,		DWORD PTR 56[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 60[ebp]
> +	xor	eax,		esi
> +	xor	edx,		esi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	edi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	edi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	edi,		ebx
> +	; 
> +	; Round 6
> +	mov	eax,		DWORD PTR 48[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 52[ebp]
> +	xor	eax,		edi
> +	xor	edx,		edi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	esi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	esi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	esi,		ebx
> +	; 
> +	; Round 5
> +	mov	eax,		DWORD PTR 40[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 44[ebp]
> +	xor	eax,		esi
> +	xor	edx,		esi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	edi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	edi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	edi,		ebx
> +	; 
> +	; Round 4
> +	mov	eax,		DWORD PTR 32[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 36[ebp]
> +	xor	eax,		edi
> +	xor	edx,		edi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	esi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	esi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	esi,		ebx
> +	; 
> +	; Round 3
> +	mov	eax,		DWORD PTR 24[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 28[ebp]
> +	xor	eax,		esi
> +	xor	edx,		esi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	edi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	edi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	edi,		ebx
> +	; 
> +	; Round 2
> +	mov	eax,		DWORD PTR 16[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 20[ebp]
> +	xor	eax,		edi
> +	xor	edx,		edi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	esi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	esi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	esi,		ebx
> +	; 
> +	; Round 1
> +	mov	eax,		DWORD PTR 8[ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 12[ebp]
> +	xor	eax,		esi
> +	xor	edx,		esi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	edi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	edi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	edi,		ebx
> +	; 
> +	; Round 0
> +	mov	eax,		DWORD PTR [ebp]
> +	xor	ebx,		ebx
> +	mov	edx,		DWORD PTR 4[ebp]
> +	xor	eax,		edi
> +	xor	edx,		edi
> +	and	eax,		0fcfcfcfch
> +	and	edx,		0cfcfcfcfh
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	esi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	esi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR 24[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	esi,		ebx
> +$L003end:
> +	; 
> +	; Fixup
> +	ror	edi,		3
> +	mov	eax,		DWORD PTR 20[esp]
> +	ror	esi,		3
> +	mov	DWORD PTR [eax],edi
> +	mov	DWORD PTR 4[eax],esi
> +	pop	ebp
> +	pop	ebx
> +	pop	edi
> +	pop	esi
> +	ret
> +_des_encrypt2 ENDP
> +_TEXT	ENDS
> +_TEXT	SEGMENT
> +PUBLIC	_des_encrypt3
> +
> +_des_encrypt3 PROC NEAR
> +	push	ebx
> +	mov	ebx,		DWORD PTR 8[esp]
> +	push	ebp
> +	push	esi
> +	push	edi
> +	; 
> +	; Load the data words
> +	mov	edi,		DWORD PTR [ebx]
> +	mov	esi,		DWORD PTR 4[ebx]
> +	sub	esp,		12
> +	; 
> +	; IP
> +	rol	edi,		4
> +	mov	edx,		edi
> +	xor	edi,		esi
> +	and	edi,		0f0f0f0f0h
> +	xor	edx,		edi
> +	xor	esi,		edi
> +	; 
> +	rol	esi,		20
> +	mov	edi,		esi
> +	xor	esi,		edx
> +	and	esi,		0fff0000fh
> +	xor	edi,		esi
> +	xor	edx,		esi
> +	; 
> +	rol	edi,		14
> +	mov	esi,		edi
> +	xor	edi,		edx
> +	and	edi,		033333333h
> +	xor	esi,		edi
> +	xor	edx,		edi
> +	; 
> +	rol	edx,		22
> +	mov	edi,		edx
> +	xor	edx,		esi
> +	and	edx,		003fc03fch
> +	xor	edi,		edx
> +	xor	esi,		edx
> +	; 
> +	rol	edi,		9
> +	mov	edx,		edi
> +	xor	edi,		esi
> +	and	edi,		0aaaaaaaah
> +	xor	edx,		edi
> +	xor	esi,		edi
> +	; 
> +	ror	edx,		3
> +	ror	esi,		2
> +	mov	DWORD PTR 4[ebx],esi
> +	mov	eax,		DWORD PTR 36[esp]
> +	mov	DWORD PTR [ebx],edx
> +	mov	edi,		DWORD PTR 40[esp]
> +	mov	esi,		DWORD PTR 44[esp]
> +	mov	DWORD PTR 8[esp],1
> +	mov	DWORD PTR 4[esp],eax
> +	mov	DWORD PTR [esp],ebx
> +	call	_des_encrypt2
> +	mov	DWORD PTR 8[esp],0
> +	mov	DWORD PTR 4[esp],edi
> +	mov	DWORD PTR [esp],ebx
> +	call	_des_encrypt2
> +	mov	DWORD PTR 8[esp],1
> +	mov	DWORD PTR 4[esp],esi
> +	mov	DWORD PTR [esp],ebx
> +	call	_des_encrypt2
> +	add	esp,		12
> +	mov	edi,		DWORD PTR [ebx]
> +	mov	esi,		DWORD PTR 4[ebx]
> +	; 
> +	; FP
> +	rol	esi,		2
> +	rol	edi,		3
> +	mov	eax,		edi
> +	xor	edi,		esi
> +	and	edi,		0aaaaaaaah
> +	xor	eax,		edi
> +	xor	esi,		edi
> +	; 
> +	rol	eax,		23
> +	mov	edi,		eax
> +	xor	eax,		esi
> +	and	eax,		003fc03fch
> +	xor	edi,		eax
> +	xor	esi,		eax
> +	; 
> +	rol	edi,		10
> +	mov	eax,		edi
> +	xor	edi,		esi
> +	and	edi,		033333333h
> +	xor	eax,		edi
> +	xor	esi,		edi
> +	; 
> +	rol	esi,		18
> +	mov	edi,		esi
> +	xor	esi,		eax
> +	and	esi,		0fff0000fh
> +	xor	edi,		esi
> +	xor	eax,		esi
> +	; 
> +	rol	edi,		12
> +	mov	esi,		edi
> +	xor	edi,		eax
> +	and	edi,		0f0f0f0f0h
> +	xor	esi,		edi
> +	xor	eax,		edi
> +	; 
> +	ror	eax,		4
> +	mov	DWORD PTR [ebx],eax
> +	mov	DWORD PTR 4[ebx],esi
> +	pop	edi
> +	pop	esi
> +	pop	ebp
> +	pop	ebx
> +	ret
> +_des_encrypt3 ENDP
> +_TEXT	ENDS
> +_TEXT	SEGMENT
> +PUBLIC	_des_decrypt3
> +
> +_des_decrypt3 PROC NEAR
> +	push	ebx
> +	mov	ebx,		DWORD PTR 8[esp]
> +	push	ebp
> +	push	esi
> +	push	edi
> +	; 
> +	; Load the data words
> +	mov	edi,		DWORD PTR [ebx]
> +	mov	esi,		DWORD PTR 4[ebx]
> +	sub	esp,		12
> +	; 
> +	; IP
> +	rol	edi,		4
> +	mov	edx,		edi
> +	xor	edi,		esi
> +	and	edi,		0f0f0f0f0h
> +	xor	edx,		edi
> +	xor	esi,		edi
> +	; 
> +	rol	esi,		20
> +	mov	edi,		esi
> +	xor	esi,		edx
> +	and	esi,		0fff0000fh
> +	xor	edi,		esi
> +	xor	edx,		esi
> +	; 
> +	rol	edi,		14
> +	mov	esi,		edi
> +	xor	edi,		edx
> +	and	edi,		033333333h
> +	xor	esi,		edi
> +	xor	edx,		edi
> +	; 
> +	rol	edx,		22
> +	mov	edi,		edx
> +	xor	edx,		esi
> +	and	edx,		003fc03fch
> +	xor	edi,		edx
> +	xor	esi,		edx
> +	; 
> +	rol	edi,		9
> +	mov	edx,		edi
> +	xor	edi,		esi
> +	and	edi,		0aaaaaaaah
> +	xor	edx,		edi
> +	xor	esi,		edi
> +	; 
> +	ror	edx,		3
> +	ror	esi,		2
> +	mov	DWORD PTR 4[ebx],esi
> +	mov	esi,		DWORD PTR 36[esp]
> +	mov	DWORD PTR [ebx],edx
> +	mov	edi,		DWORD PTR 40[esp]
> +	mov	eax,		DWORD PTR 44[esp]
> +	mov	DWORD PTR 8[esp],0
> +	mov	DWORD PTR 4[esp],eax
> +	mov	DWORD PTR [esp],ebx
> +	call	_des_encrypt2
> +	mov	DWORD PTR 8[esp],1
> +	mov	DWORD PTR 4[esp],edi
> +	mov	DWORD PTR [esp],ebx
> +	call	_des_encrypt2
> +	mov	DWORD PTR 8[esp],0
> +	mov	DWORD PTR 4[esp],esi
> +	mov	DWORD PTR [esp],ebx
> +	call	_des_encrypt2
> +	add	esp,		12
> +	mov	edi,		DWORD PTR [ebx]
> +	mov	esi,		DWORD PTR 4[ebx]
> +	; 
> +	; FP
> +	rol	esi,		2
> +	rol	edi,		3
> +	mov	eax,		edi
> +	xor	edi,		esi
> +	and	edi,		0aaaaaaaah
> +	xor	eax,		edi
> +	xor	esi,		edi
> +	; 
> +	rol	eax,		23
> +	mov	edi,		eax
> +	xor	eax,		esi
> +	and	eax,		003fc03fch
> +	xor	edi,		eax
> +	xor	esi,		eax
> +	; 
> +	rol	edi,		10
> +	mov	eax,		edi
> +	xor	edi,		esi
> +	and	edi,		033333333h
> +	xor	eax,		edi
> +	xor	esi,		edi
> +	; 
> +	rol	esi,		18
> +	mov	edi,		esi
> +	xor	esi,		eax
> +	and	esi,		0fff0000fh
> +	xor	edi,		esi
> +	xor	eax,		esi
> +	; 
> +	rol	edi,		12
> +	mov	esi,		edi
> +	xor	edi,		eax
> +	and	edi,		0f0f0f0f0h
> +	xor	esi,		edi
> +	xor	eax,		edi
> +	; 
> +	ror	eax,		4
> +	mov	DWORD PTR [ebx],eax
> +	mov	DWORD PTR 4[ebx],esi
> +	pop	edi
> +	pop	esi
> +	pop	ebp
> +	pop	ebx
> +	ret
> +_des_decrypt3 ENDP
> +_TEXT	ENDS
> +_TEXT	SEGMENT
> +PUBLIC	_des_ncbc_encrypt
> +
> +_des_ncbc_encrypt PROC NEAR
> +	; 
> +	push	ebp
> +	push	ebx
> +	push	esi
> +	push	edi
> +	mov	ebp,		DWORD PTR 28[esp]
> +	; getting iv ptr from parameter 4
> +	mov	ebx,		DWORD PTR 36[esp]
> +	mov	esi,		DWORD PTR [ebx]
> +	mov	edi,		DWORD PTR 4[ebx]
> +	push	edi
> +	push	esi
> +	push	edi
> +	push	esi
> +	mov	ebx,		esp
> +	mov	esi,		DWORD PTR 36[esp]
> +	mov	edi,		DWORD PTR 40[esp]
> +	; getting encrypt flag from parameter 5
> +	mov	ecx,		DWORD PTR 56[esp]
> +	; get and push parameter 5
> +	push	ecx
> +	; get and push parameter 3
> +	mov	eax,		DWORD PTR 52[esp]
> +	push	eax
> +	push	ebx
> +	cmp	ecx,		0
> +	jz	$L004decrypt
> +	and	ebp,		4294967288
> +	mov	eax,		DWORD PTR 12[esp]
> +	mov	ebx,		DWORD PTR 16[esp]
> +	jz	$L005encrypt_finish
> +L006encrypt_loop:
> +	mov	ecx,		DWORD PTR [esi]
> +	mov	edx,		DWORD PTR 4[esi]
> +	xor	eax,		ecx
> +	xor	ebx,		edx
> +	mov	DWORD PTR 12[esp],eax
> +	mov	DWORD PTR 16[esp],ebx
> +	call	_des_encrypt
> +	mov	eax,		DWORD PTR 12[esp]
> +	mov	ebx,		DWORD PTR 16[esp]
> +	mov	DWORD PTR [edi],eax
> +	mov	DWORD PTR 4[edi],ebx
> +	add	esi,		8
> +	add	edi,		8
> +	sub	ebp,		8
> +	jnz	L006encrypt_loop
> +$L005encrypt_finish:
> +	mov	ebp,		DWORD PTR 56[esp]
> +	and	ebp,		7
> +	jz	$L007finish
> +	xor	ecx,		ecx
> +	xor	edx,		edx
> +	mov	ebp,		DWORD PTR $L008cbc_enc_jmp_table[ebp*4]
> +	jmp	 ebp
> +L009ej7:
> +	mov	dh,		BYTE PTR 6[esi]
> +	shl	edx,		8
> +L010ej6:
> +	mov	dh,		BYTE PTR 5[esi]
> +L011ej5:
> +	mov	dl,		BYTE PTR 4[esi]
> +L012ej4:
> +	mov	ecx,		DWORD PTR [esi]
> +	jmp	$L013ejend
> +L014ej3:
> +	mov	ch,		BYTE PTR 2[esi]
> +	shl	ecx,		8
> +L015ej2:
> +	mov	ch,		BYTE PTR 1[esi]
> +L016ej1:
> +	mov	cl,		BYTE PTR [esi]
> +$L013ejend:
> +	xor	eax,		ecx
> +	xor	ebx,		edx
> +	mov	DWORD PTR 12[esp],eax
> +	mov	DWORD PTR 16[esp],ebx
> +	call	_des_encrypt
> +	mov	eax,		DWORD PTR 12[esp]
> +	mov	ebx,		DWORD PTR 16[esp]
> +	mov	DWORD PTR [edi],eax
> +	mov	DWORD PTR 4[edi],ebx
> +	jmp	$L007finish
> +$L004decrypt:
> +	and	ebp,		4294967288
> +	mov	eax,		DWORD PTR 20[esp]
> +	mov	ebx,		DWORD PTR 24[esp]
> +	jz	$L017decrypt_finish
> +L018decrypt_loop:
> +	mov	eax,		DWORD PTR [esi]
> +	mov	ebx,		DWORD PTR 4[esi]
> +	mov	DWORD PTR 12[esp],eax
> +	mov	DWORD PTR 16[esp],ebx
> +	call	_des_encrypt
> +	mov	eax,		DWORD PTR 12[esp]
> +	mov	ebx,		DWORD PTR 16[esp]
> +	mov	ecx,		DWORD PTR 20[esp]
> +	mov	edx,		DWORD PTR 24[esp]
> +	xor	ecx,		eax
> +	xor	edx,		ebx
> +	mov	eax,		DWORD PTR [esi]
> +	mov	ebx,		DWORD PTR 4[esi]
> +	mov	DWORD PTR [edi],ecx
> +	mov	DWORD PTR 4[edi],edx
> +	mov	DWORD PTR 20[esp],eax
> +	mov	DWORD PTR 24[esp],ebx
> +	add	esi,		8
> +	add	edi,		8
> +	sub	ebp,		8
> +	jnz	L018decrypt_loop
> +$L017decrypt_finish:
> +	mov	ebp,		DWORD PTR 56[esp]
> +	and	ebp,		7
> +	jz	$L007finish
> +	mov	eax,		DWORD PTR [esi]
> +	mov	ebx,		DWORD PTR 4[esi]
> +	mov	DWORD PTR 12[esp],eax
> +	mov	DWORD PTR 16[esp],ebx
> +	call	_des_encrypt
> +	mov	eax,		DWORD PTR 12[esp]
> +	mov	ebx,		DWORD PTR 16[esp]
> +	mov	ecx,		DWORD PTR 20[esp]
> +	mov	edx,		DWORD PTR 24[esp]
> +	xor	ecx,		eax
> +	xor	edx,		ebx
> +	mov	eax,		DWORD PTR [esi]
> +	mov	ebx,		DWORD PTR 4[esi]
> +L019dj7:
> +	ror	edx,		16
> +	mov	BYTE PTR 6[edi],dl
> +	shr	edx,		16
> +L020dj6:
> +	mov	BYTE PTR 5[edi],dh
> +L021dj5:
> +	mov	BYTE PTR 4[edi],dl
> +L022dj4:
> +	mov	DWORD PTR [edi],ecx
> +	jmp	$L023djend
> +L024dj3:
> +	ror	ecx,		16
> +	mov	BYTE PTR 2[edi],cl
> +	shl	ecx,		16
> +L025dj2:
> +	mov	BYTE PTR 1[esi],ch
> +L026dj1:
> +	mov	BYTE PTR [esi],	cl
> +$L023djend:
> +	jmp	$L007finish
> +$L007finish:
> +	mov	ecx,		DWORD PTR 64[esp]
> +	add	esp,		28
> +	mov	DWORD PTR [ecx],eax
> +	mov	DWORD PTR 4[ecx],ebx
> +	pop	edi
> +	pop	esi
> +	pop	ebx
> +	pop	ebp
> +	ret
> +$L008cbc_enc_jmp_table:
> +	DD	0
> +	DD	L016ej1
> +	DD	L015ej2
> +	DD	L014ej3
> +	DD	L012ej4
> +	DD	L011ej5
> +	DD	L010ej6
> +	DD	L009ej7
> +L027cbc_dec_jmp_table:
> +	DD	0
> +	DD	L026dj1
> +	DD	L025dj2
> +	DD	L024dj3
> +	DD	L022dj4
> +	DD	L021dj5
> +	DD	L020dj6
> +	DD	L019dj7
> +_des_ncbc_encrypt ENDP
> +_TEXT	ENDS
> +_TEXT	SEGMENT
> +PUBLIC	_des_ede3_cbc_encrypt
> +
> +_des_ede3_cbc_encrypt PROC NEAR
> +	; 
> +	push	ebp
> +	push	ebx
> +	push	esi
> +	push	edi
> +	mov	ebp,		DWORD PTR 28[esp]
> +	; getting iv ptr from parameter 6
> +	mov	ebx,		DWORD PTR 44[esp]
> +	mov	esi,		DWORD PTR [ebx]
> +	mov	edi,		DWORD PTR 4[ebx]
> +	push	edi
> +	push	esi
> +	push	edi
> +	push	esi
> +	mov	ebx,		esp
> +	mov	esi,		DWORD PTR 36[esp]
> +	mov	edi,		DWORD PTR 40[esp]
> +	; getting encrypt flag from parameter 7
> +	mov	ecx,		DWORD PTR 64[esp]
> +	; get and push parameter 5
> +	mov	eax,		DWORD PTR 56[esp]
> +	push	eax
> +	; get and push parameter 4
> +	mov	eax,		DWORD PTR 56[esp]
> +	push	eax
> +	; get and push parameter 3
> +	mov	eax,		DWORD PTR 56[esp]
> +	push	eax
> +	push	ebx
> +	cmp	ecx,		0
> +	jz	$L028decrypt
> +	and	ebp,		4294967288
> +	mov	eax,		DWORD PTR 16[esp]
> +	mov	ebx,		DWORD PTR 20[esp]
> +	jz	$L029encrypt_finish
> +L030encrypt_loop:
> +	mov	ecx,		DWORD PTR [esi]
> +	mov	edx,		DWORD PTR 4[esi]
> +	xor	eax,		ecx
> +	xor	ebx,		edx
> +	mov	DWORD PTR 16[esp],eax
> +	mov	DWORD PTR 20[esp],ebx
> +	call	_des_encrypt3
> +	mov	eax,		DWORD PTR 16[esp]
> +	mov	ebx,		DWORD PTR 20[esp]
> +	mov	DWORD PTR [edi],eax
> +	mov	DWORD PTR 4[edi],ebx
> +	add	esi,		8
> +	add	edi,		8
> +	sub	ebp,		8
> +	jnz	L030encrypt_loop
> +$L029encrypt_finish:
> +	mov	ebp,		DWORD PTR 60[esp]
> +	and	ebp,		7
> +	jz	$L031finish
> +	xor	ecx,		ecx
> +	xor	edx,		edx
> +	mov	ebp,		DWORD PTR $L032cbc_enc_jmp_table[ebp*4]
> +	jmp	 ebp
> +L033ej7:
> +	mov	dh,		BYTE PTR 6[esi]
> +	shl	edx,		8
> +L034ej6:
> +	mov	dh,		BYTE PTR 5[esi]
> +L035ej5:
> +	mov	dl,		BYTE PTR 4[esi]
> +L036ej4:
> +	mov	ecx,		DWORD PTR [esi]
> +	jmp	$L037ejend
> +L038ej3:
> +	mov	ch,		BYTE PTR 2[esi]
> +	shl	ecx,		8
> +L039ej2:
> +	mov	ch,		BYTE PTR 1[esi]
> +L040ej1:
> +	mov	cl,		BYTE PTR [esi]
> +$L037ejend:
> +	xor	eax,		ecx
> +	xor	ebx,		edx
> +	mov	DWORD PTR 16[esp],eax
> +	mov	DWORD PTR 20[esp],ebx
> +	call	_des_encrypt3
> +	mov	eax,		DWORD PTR 16[esp]
> +	mov	ebx,		DWORD PTR 20[esp]
> +	mov	DWORD PTR [edi],eax
> +	mov	DWORD PTR 4[edi],ebx
> +	jmp	$L031finish
> +$L028decrypt:
> +	and	ebp,		4294967288
> +	mov	eax,		DWORD PTR 24[esp]
> +	mov	ebx,		DWORD PTR 28[esp]
> +	jz	$L041decrypt_finish
> +L042decrypt_loop:
> +	mov	eax,		DWORD PTR [esi]
> +	mov	ebx,		DWORD PTR 4[esi]
> +	mov	DWORD PTR 16[esp],eax
> +	mov	DWORD PTR 20[esp],ebx
> +	call	_des_decrypt3
> +	mov	eax,		DWORD PTR 16[esp]
> +	mov	ebx,		DWORD PTR 20[esp]
> +	mov	ecx,		DWORD PTR 24[esp]
> +	mov	edx,		DWORD PTR 28[esp]
> +	xor	ecx,		eax
> +	xor	edx,		ebx
> +	mov	eax,		DWORD PTR [esi]
> +	mov	ebx,		DWORD PTR 4[esi]
> +	mov	DWORD PTR [edi],ecx
> +	mov	DWORD PTR 4[edi],edx
> +	mov	DWORD PTR 24[esp],eax
> +	mov	DWORD PTR 28[esp],ebx
> +	add	esi,		8
> +	add	edi,		8
> +	sub	ebp,		8
> +	jnz	L042decrypt_loop
> +$L041decrypt_finish:
> +	mov	ebp,		DWORD PTR 60[esp]
> +	and	ebp,		7
> +	jz	$L031finish
> +	mov	eax,		DWORD PTR [esi]
> +	mov	ebx,		DWORD PTR 4[esi]
> +	mov	DWORD PTR 16[esp],eax
> +	mov	DWORD PTR 20[esp],ebx
> +	call	_des_decrypt3
> +	mov	eax,		DWORD PTR 16[esp]
> +	mov	ebx,		DWORD PTR 20[esp]
> +	mov	ecx,		DWORD PTR 24[esp]
> +	mov	edx,		DWORD PTR 28[esp]
> +	xor	ecx,		eax
> +	xor	edx,		ebx
> +	mov	eax,		DWORD PTR [esi]
> +	mov	ebx,		DWORD PTR 4[esi]
> +L043dj7:
> +	ror	edx,		16
> +	mov	BYTE PTR 6[edi],dl
> +	shr	edx,		16
> +L044dj6:
> +	mov	BYTE PTR 5[edi],dh
> +L045dj5:
> +	mov	BYTE PTR 4[edi],dl
> +L046dj4:
> +	mov	DWORD PTR [edi],ecx
> +	jmp	$L047djend
> +L048dj3:
> +	ror	ecx,		16
> +	mov	BYTE PTR 2[edi],cl
> +	shl	ecx,		16
> +L049dj2:
> +	mov	BYTE PTR 1[esi],ch
> +L050dj1:
> +	mov	BYTE PTR [esi],	cl
> +$L047djend:
> +	jmp	$L031finish
> +$L031finish:
> +	mov	ecx,		DWORD PTR 76[esp]
> +	add	esp,		32
> +	mov	DWORD PTR [ecx],eax
> +	mov	DWORD PTR 4[ecx],ebx
> +	pop	edi
> +	pop	esi
> +	pop	ebx
> +	pop	ebp
> +	ret
> +$L032cbc_enc_jmp_table:
> +	DD	0
> +	DD	L040ej1
> +	DD	L039ej2
> +	DD	L038ej3
> +	DD	L036ej4
> +	DD	L035ej5
> +	DD	L034ej6
> +	DD	L033ej7
> +L051cbc_dec_jmp_table:
> +	DD	0
> +	DD	L050dj1
> +	DD	L049dj2
> +	DD	L048dj3
> +	DD	L046dj4
> +	DD	L045dj5
> +	DD	L044dj6
> +	DD	L043dj7
> +_des_ede3_cbc_encrypt ENDP
> +_TEXT	ENDS
> +END
> diff -Naur linux/cryptolib/libdes/asm/des-586.pl linux-crypto/cryptolib/libdes/asm/des-586.pl
> --- linux/cryptolib/libdes/asm/des-586.pl	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/cryptolib/libdes/asm/des-586.pl	Tue Aug 27 11:20:55 2002
> @@ -0,0 +1,251 @@
> +#!/usr/local/bin/perl
> +#
> +# The inner loop instruction sequence and the IP/FP modifications are from
> +# Svend Olaf Mikkelsen <[email protected]>
> +#
> +
> +push(@INC,"perlasm","../../perlasm");
> +require "x86asm.pl";
> +require "cbc.pl";
> +require "desboth.pl";
> +
> +# base code is in microsft
> +# op dest, source
> +# format.
> +#
> +
> +&asm_init($ARGV[0],"des-586.pl");
> +
> +$L="edi";
> +$R="esi";
> +
> +&external_label("des_SPtrans");
> +&des_encrypt("des_encrypt",1);
> +&des_encrypt("des_encrypt2",0);
> +&des_encrypt3("des_encrypt3",1);
> +&des_encrypt3("des_decrypt3",0);
> +&cbc("des_ncbc_encrypt","des_encrypt","des_encrypt",0,4,5,3,5,-1);
> +&cbc("des_ede3_cbc_encrypt","des_encrypt3","des_decrypt3",0,6,7,3,4,5);
> +
> +&asm_finish();
> +
> +sub des_encrypt
> +	{
> +	local($name,$do_ip)=@_;
> +
> +	&function_begin_B($name,"EXTRN   _des_SPtrans:DWORD");
> +
> +	&push("esi");
> +	&push("edi");
> +
> +	&comment("");
> +	&comment("Load the 2 words");
> +	$ks="ebp";
> +
> +	if ($do_ip)
> +		{
> +		&mov($R,&wparam(0));
> +		 &xor(	"ecx",		"ecx"		);
> +
> +		&push("ebx");
> +		&push("ebp");
> +
> +		&mov("eax",&DWP(0,$R,"",0));
> +		 &mov("ebx",&wparam(2));	# get encrypt flag
> +		&mov($L,&DWP(4,$R,"",0));
> +		&comment("");
> +		&comment("IP");
> +		&IP_new("eax",$L,$R,3);
> +		}
> +	else
> +		{
> +		&mov("eax",&wparam(0));
> +		 &xor(	"ecx",		"ecx"		);
> +
> +		&push("ebx");
> +		&push("ebp");
> +
> +		&mov($R,&DWP(0,"eax","",0));
> +		 &mov("ebx",&wparam(2));	# get encrypt flag
> +		&rotl($R,3);
> +		&mov($L,&DWP(4,"eax","",0));
> +		&rotl($L,3);
> +		}
> +
> +	&mov(	$ks,		&wparam(1)	);
> +	&cmp("ebx","0");
> +	&je(&label("start_decrypt"));
> +
> +	for ($i=0; $i<16; $i+=2)
> +		{
> +		&comment("");
> +		&comment("Round $i");
> +		&D_ENCRYPT($i,$L,$R,$i*2,$ks,"des_SPtrans","eax","ebx","ecx","edx");
> +
> +		&comment("");
> +		&comment("Round ".sprintf("%d",$i+1));
> +		&D_ENCRYPT($i+1,$R,$L,($i+1)*2,$ks,"des_SPtrans","eax","ebx","ecx","edx");
> +		}
> +	&jmp(&label("end"));
> +
> +	&set_label("start_decrypt");
> +
> +	for ($i=15; $i>0; $i-=2)
> +		{
> +		&comment("");
> +		&comment("Round $i");
> +		&D_ENCRYPT(15-$i,$L,$R,$i*2,$ks,"des_SPtrans","eax","ebx","ecx","edx");
> +		&comment("");
> +		&comment("Round ".sprintf("%d",$i-1));
> +		&D_ENCRYPT(15-$i+1,$R,$L,($i-1)*2,$ks,"des_SPtrans","eax","ebx","ecx","edx");
> +		}
> +
> +	&set_label("end");
> +
> +	if ($do_ip)
> +		{
> +		&comment("");
> +		&comment("FP");
> +		&mov("edx",&wparam(0));
> +		&FP_new($L,$R,"eax",3);
> +
> +		&mov(&DWP(0,"edx","",0),"eax");
> +		&mov(&DWP(4,"edx","",0),$R);
> +		}
> +	else
> +		{
> +		&comment("");
> +		&comment("Fixup");
> +		&rotr($L,3);		# r
> +		 &mov("eax",&wparam(0));
> +		&rotr($R,3);		# l
> +		 &mov(&DWP(0,"eax","",0),$L);
> +		 &mov(&DWP(4,"eax","",0),$R);
> +		}
> +
> +	&pop("ebp");
> +	&pop("ebx");
> +	&pop("edi");
> +	&pop("esi");
> +	&ret();
> +
> +	&function_end_B($name);
> +	}
> +
> +sub D_ENCRYPT
> +	{
> +	local($r,$L,$R,$S,$ks,$desSP,$u,$tmp1,$tmp2,$t)=@_;
> +
> +	 &mov(	$u,		&DWP(&n2a($S*4),$ks,"",0));
> +	&xor(	$tmp1,		$tmp1);
> +	 &mov(	$t,		&DWP(&n2a(($S+1)*4),$ks,"",0));
> +	&xor(	$u,		$R);
> +	 &xor(	$t,		$R);
> +	&and(	$u,		"0xfcfcfcfc"	);
> +	 &and(	$t,		"0xcfcfcfcf"	);
> +	&movb(	&LB($tmp1),	&LB($u)	);
> +	 &movb(	&LB($tmp2),	&HB($u)	);
> +	&rotr(	$t,		4		);
> +	&mov(	$ks,		&DWP("      $desSP",$tmp1,"",0));
> +	 &movb(	&LB($tmp1),	&LB($t)	);
> +	&xor(	$L,		$ks);
> +	 &mov(	$ks,		&DWP("0x200+$desSP",$tmp2,"",0));
> +	&xor(	$L,		$ks); ######
> +	 &movb(	&LB($tmp2),	&HB($t)	);
> +	&shr(	$u,		16);
> +	 &mov(	$ks,		&DWP("0x100+$desSP",$tmp1,"",0));
> +	&xor(	$L,		$ks); ######
> +	 &movb(	&LB($tmp1),	&HB($u)	);
> +	&shr(	$t,		16);
> +	 &mov(	$ks,		&DWP("0x300+$desSP",$tmp2,"",0));
> +	&xor(	$L,		$ks);
> +	 &mov(	$ks,		&wparam(1)	);
> +	&movb(	&LB($tmp2),	&HB($t)	);
> +	 &and(	$u,		"0xff"	);
> +	&and(	$t,		"0xff"	);
> +	 &mov(	$tmp1,		&DWP("0x600+$desSP",$tmp1,"",0));
> +	&xor(	$L,		$tmp1);
> +	 &mov(	$tmp1,		&DWP("0x700+$desSP",$tmp2,"",0));
> +	&xor(	$L,		$tmp1);
> +	 &mov(	$tmp1,		&DWP("0x400+$desSP",$u,"",0));
> +	&xor(	$L,		$tmp1);
> +	 &mov(	$tmp1,		&DWP("0x500+$desSP",$t,"",0));
> +	&xor(	$L,		$tmp1);
> +	}
> +
> +sub n2a
> +	{
> +	sprintf("%d",$_[0]);
> +	}
> +
> +# now has a side affect of rotating $a by $shift
> +sub R_PERM_OP
> +	{
> +	local($a,$b,$tt,$shift,$mask,$last)=@_;
> +
> +	&rotl(	$a,		$shift		) if ($shift != 0);
> +	&mov(	$tt,		$a		);
> +	&xor(	$a,		$b		);
> +	&and(	$a,		$mask		);
> +	if (!$last eq $b)
> +		{
> +		&xor(	$b,		$a		);
> +		&xor(	$tt,		$a		);
> +		}
> +	else
> +		{
> +		&xor(	$tt,		$a		);
> +		&xor(	$b,		$a		);
> +		}
> +	&comment("");
> +	}
> +
> +sub IP_new
> +	{
> +	local($l,$r,$tt,$lr)=@_;
> +
> +	&R_PERM_OP($l,$r,$tt, 4,"0xf0f0f0f0",$l);
> +	&R_PERM_OP($r,$tt,$l,20,"0xfff0000f",$l);
> +	&R_PERM_OP($l,$tt,$r,14,"0x33333333",$r);
> +	&R_PERM_OP($tt,$r,$l,22,"0x03fc03fc",$r);
> +	&R_PERM_OP($l,$r,$tt, 9,"0xaaaaaaaa",$r);
> +	
> +	if ($lr != 3)
> +		{
> +		if (($lr-3) < 0)
> +			{ &rotr($tt,	3-$lr); }
> +		else	{ &rotl($tt,	$lr-3); }
> +		}
> +	if ($lr != 2)
> +		{
> +		if (($lr-2) < 0)
> +			{ &rotr($r,	2-$lr); }
> +		else	{ &rotl($r,	$lr-2); }
> +		}
> +	}
> +
> +sub FP_new
> +	{
> +	local($l,$r,$tt,$lr)=@_;
> +
> +	if ($lr != 2)
> +		{
> +		if (($lr-2) < 0)
> +			{ &rotl($r,	2-$lr); }
> +		else	{ &rotr($r,	$lr-2); }
> +		}
> +	if ($lr != 3)
> +		{
> +		if (($lr-3) < 0)
> +			{ &rotl($l,	3-$lr); }
> +		else	{ &rotr($l,	$lr-3); }
> +		}
> +
> +	&R_PERM_OP($l,$r,$tt, 0,"0xaaaaaaaa",$r);
> +	&R_PERM_OP($tt,$r,$l,23,"0x03fc03fc",$r);
> +	&R_PERM_OP($l,$r,$tt,10,"0x33333333",$l);
> +	&R_PERM_OP($r,$tt,$l,18,"0xfff0000f",$l);
> +	&R_PERM_OP($l,$tt,$r,12,"0xf0f0f0f0",$r);
> +	&rotr($tt	, 4);
> +	}
> +
> diff -Naur linux/cryptolib/libdes/asm/des686.pl linux-crypto/cryptolib/libdes/asm/des686.pl
> --- linux/cryptolib/libdes/asm/des686.pl	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/cryptolib/libdes/asm/des686.pl	Tue Aug 27 11:20:55 2002
> @@ -0,0 +1,230 @@
> +#!/usr/local/bin/perl
> +
> +$prog="des686.pl";
> +
> +# base code is in microsft
> +# op dest, source
> +# format.
> +#
> +
> +# WILL NOT WORK ANYMORE WITH desboth.pl
> +require "desboth.pl";
> +
> +if (	($ARGV[0] eq "elf"))
> +	{ require "x86unix.pl"; }
> +elsif (	($ARGV[0] eq "a.out"))
> +	{ $aout=1; require "x86unix.pl"; }
> +elsif (	($ARGV[0] eq "sol"))
> +	{ $sol=1; require "x86unix.pl"; }
> +elsif ( ($ARGV[0] eq "cpp"))
> +	{ $cpp=1; require "x86unix.pl"; }
> +elsif (	($ARGV[0] eq "win32"))
> +	{ require "x86ms.pl"; }
> +else
> +	{
> +	print STDERR <<"EOF";
> +Pick one target type from
> +	elf	- linux, FreeBSD etc
> +	a.out	- old linux
> +	sol	- x86 solaris
> +	cpp	- format so x86unix.cpp can be used
> +	win32	- Windows 95/Windows NT
> +EOF
> +	exit(1);
> +	}
> +
> +&comment("Don't even think of reading this code");
> +&comment("It was automatically generated by $prog");
> +&comment("Which is a perl program used to generate the x86 assember for");
> +&comment("any of elf, a.out, Win32, or Solaris");
> +&comment("It can be found in SSLeay 0.6.5+ or in libdes 3.26+");
> +&comment("eric <eay\@cryptsoft.com>");
> +&comment("");
> +
> +&file("dx86xxxx");
> +
> +$L="edi";
> +$R="esi";
> +
> +&des_encrypt("des_encrypt",1);
> +&des_encrypt("des_encrypt2",0);
> +
> +&des_encrypt3("des_encrypt3",1);
> +&des_encrypt3("des_decrypt3",0);
> +
> +&file_end();
> +
> +sub des_encrypt
> +	{
> +	local($name,$do_ip)=@_;
> +
> +	&function_begin($name,"EXTRN   _des_SPtrans:DWORD");
> +
> +	&comment("");
> +	&comment("Load the 2 words");
> +	&mov("eax",&wparam(0));
> +	&mov($L,&DWP(0,"eax","",0));
> +	&mov($R,&DWP(4,"eax","",0));
> +
> +	$ksp=&wparam(1);
> +
> +	if ($do_ip)
> +		{
> +		&comment("");
> +		&comment("IP");
> +		&IP_new($L,$R,"eax");
> +		}
> +
> +	&comment("");
> +	&comment("fixup rotate");
> +	&rotl($R,3);
> +	&rotl($L,3);
> +	&exch($L,$R);
> +
> +	&comment("");
> +	&comment("load counter, key_schedule and enc flag");
> +	&mov("eax",&wparam(2));	# get encrypt flag
> +	&mov("ebp",&wparam(1));	# get ks
> +	&cmp("eax","0");
> +	&je(&label("start_decrypt"));
> +
> +	# encrypting part
> +
> +	for ($i=0; $i<16; $i+=2)
> +		{
> +		&comment("");
> +		&comment("Round $i");
> +		&D_ENCRYPT($L,$R,$i*2,"ebp","des_SPtrans","ecx","edx","eax","ebx");
> +
> +		&comment("");
> +		&comment("Round ".sprintf("%d",$i+1));
> +		&D_ENCRYPT($R,$L,($i+1)*2,"ebp","des_SPtrans","ecx","edx","eax","ebx");
> +		}
> +	&jmp(&label("end"));
> +
> +	&set_label("start_decrypt");
> +
> +	for ($i=15; $i>0; $i-=2)
> +		{
> +		&comment("");
> +		&comment("Round $i");
> +		&D_ENCRYPT($L,$R,$i*2,"ebp","des_SPtrans","ecx","edx","eax","ebx");
> +		&comment("");
> +		&comment("Round ".sprintf("%d",$i-1));
> +		&D_ENCRYPT($R,$L,($i-1)*2,"ebp","des_SPtrans","ecx","edx","eax","ebx");
> +		}
> +
> +	&set_label("end");
> +
> +	&comment("");
> +	&comment("Fixup");
> +	&rotr($L,3);		# r
> +	&rotr($R,3);		# l
> +
> +	if ($do_ip)
> +		{
> +		&comment("");
> +		&comment("FP");
> +		&FP_new($R,$L,"eax");
> +		}
> +
> +	&mov("eax",&wparam(0));
> +	&mov(&DWP(0,"eax","",0),$L);
> +	&mov(&DWP(4,"eax","",0),$R);
> +
> +	&function_end($name);
> +	}
> +
> +
> +# The logic is to load R into 2 registers and operate on both at the same time.
> +# We also load the 2 R's into 2 more registers so we can do the 'move word down a byte'
> +# while also masking the other copy and doing a lookup.  We then also accumulate the
> +# L value in 2 registers then combine them at the end.
> +sub D_ENCRYPT
> +	{
> +	local($L,$R,$S,$ks,$desSP,$u,$t,$tmp1,$tmp2,$tmp3)=@_;
> +
> +	&mov(	$u,		&DWP(&n2a($S*4),$ks,"",0));
> +	&mov(	$t,		&DWP(&n2a(($S+1)*4),$ks,"",0));
> +	&xor(	$u,		$R		);
> +	&xor(	$t,		$R		);
> +	&rotr(	$t,		4		);
> +
> +	# the numbers at the end of the line are origional instruction order
> +	&mov(	$tmp2,		$u		);			# 1 2
> +	&mov(	$tmp1,		$t		);			# 1 1
> +	&and(	$tmp2,		"0xfc"		);			# 1 4
> +	&and(	$tmp1,		"0xfc"		);			# 1 3
> +	&shr(	$t,		8		);			# 1 5
> +	&xor(	$L,		&DWP("0x100+$desSP",$tmp1,"",0));	# 1 7
> +	&shr(	$u,		8		);			# 1 6
> +	&mov(	$tmp1,		&DWP("      $desSP",$tmp2,"",0));	# 1 8
> +
> +	&mov(	$tmp2,		$u		);			# 2 2
> +	&xor(	$L,		$tmp1		);			# 1 9
> +	&and(	$tmp2,		"0xfc"		);			# 2 4
> +	&mov(	$tmp1,		$t		);			# 2 1
> +	&and(	$tmp1,		"0xfc"		);			# 2 3
> +	&shr(	$t,		8		);			# 2 5
> +	&xor(	$L,		&DWP("0x300+$desSP",$tmp1,"",0));	# 2 7
> +	&shr(	$u,		8		);			# 2 6
> +	&mov(	$tmp1,		&DWP("0x200+$desSP",$tmp2,"",0));	# 2 8
> +	&mov(	$tmp2,		$u		);			# 3 2
> +
> +	&xor(	$L,		$tmp1		);			# 2 9
> +	&and(	$tmp2,		"0xfc"		);			# 3 4
> +
> +	&mov(	$tmp1,		$t		);			# 3 1 
> +	&shr(	$u,		8		);			# 3 6
> +	&and(	$tmp1,		"0xfc"		);			# 3 3
> +	&shr(	$t,		8		);			# 3 5
> +	&xor(	$L,		&DWP("0x500+$desSP",$tmp1,"",0));	# 3 7
> +	&mov(	$tmp1,		&DWP("0x400+$desSP",$tmp2,"",0));	# 3 8
> +
> +	&and(	$t,		"0xfc"		);			# 4 1
> +	&xor(	$L,		$tmp1		);			# 3 9
> +
> +	&and(	$u,		"0xfc"		);			# 4 2
> +	&xor(	$L,		&DWP("0x700+$desSP",$t,"",0));		# 4 3
> +	&xor(	$L,		&DWP("0x600+$desSP",$u,"",0));		# 4 4
> +	}
> +
> +sub PERM_OP
> +	{
> +	local($a,$b,$tt,$shift,$mask)=@_;
> +
> +	&mov(	$tt,		$a		);
> +	&shr(	$tt,		$shift		);
> +	&xor(	$tt,		$b		);
> +	&and(	$tt,		$mask		);
> +	&xor(	$b,		$tt		);
> +	&shl(	$tt,		$shift		);
> +	&xor(	$a,		$tt		);
> +	}
> +
> +sub IP_new
> +	{
> +	local($l,$r,$tt)=@_;
> +
> +	&PERM_OP($r,$l,$tt, 4,"0x0f0f0f0f");
> +	&PERM_OP($l,$r,$tt,16,"0x0000ffff");
> +	&PERM_OP($r,$l,$tt, 2,"0x33333333");
> +	&PERM_OP($l,$r,$tt, 8,"0x00ff00ff");
> +	&PERM_OP($r,$l,$tt, 1,"0x55555555");
> +	}
> +
> +sub FP_new
> +	{
> +	local($l,$r,$tt)=@_;
> +
> +	&PERM_OP($l,$r,$tt, 1,"0x55555555");
> +        &PERM_OP($r,$l,$tt, 8,"0x00ff00ff");
> +        &PERM_OP($l,$r,$tt, 2,"0x33333333");
> +        &PERM_OP($r,$l,$tt,16,"0x0000ffff");
> +        &PERM_OP($l,$r,$tt, 4,"0x0f0f0f0f");
> +	}
> +
> +sub n2a
> +	{
> +	sprintf("%d",$_[0]);
> +	}
> diff -Naur linux/cryptolib/libdes/asm/desboth.pl linux-crypto/cryptolib/libdes/asm/desboth.pl
> --- linux/cryptolib/libdes/asm/desboth.pl	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/cryptolib/libdes/asm/desboth.pl	Tue Aug 27 11:20:55 2002
> @@ -0,0 +1,79 @@
> +#!/usr/local/bin/perl
> +
> +$L="edi";
> +$R="esi";
> +
> +sub des_encrypt3
> +	{
> +	local($name,$enc)=@_;
> +
> +	&function_begin_B($name,"");
> +	&push("ebx");
> +	&mov("ebx",&wparam(0));
> +
> +	&push("ebp");
> +	&push("esi");
> +
> +	&push("edi");
> +
> +	&comment("");
> +	&comment("Load the data words");
> +	&mov($L,&DWP(0,"ebx","",0));
> +	&mov($R,&DWP(4,"ebx","",0));
> +	&stack_push(3);
> +
> +	&comment("");
> +	&comment("IP");
> +	&IP_new($L,$R,"edx",0);
> +
> +	# put them back
> +	
> +	if ($enc)
> +		{
> +		&mov(&DWP(4,"ebx","",0),$R);
> +		 &mov("eax",&wparam(1));
> +		&mov(&DWP(0,"ebx","",0),"edx");
> +		 &mov("edi",&wparam(2));
> +		 &mov("esi",&wparam(3));
> +		}
> +	else
> +		{
> +		&mov(&DWP(4,"ebx","",0),$R);
> +		 &mov("esi",&wparam(1));
> +		&mov(&DWP(0,"ebx","",0),"edx");
> +		 &mov("edi",&wparam(2));
> +		 &mov("eax",&wparam(3));
> +		}
> +	&mov(&swtmp(2),	(($enc)?"1":"0"));
> +	&mov(&swtmp(1),	"eax");
> +	&mov(&swtmp(0),	"ebx");
> +	&call("des_encrypt2");
> +	&mov(&swtmp(2),	(($enc)?"0":"1"));
> +	&mov(&swtmp(1),	"edi");
> +	&mov(&swtmp(0),	"ebx");
> +	&call("des_encrypt2");
> +	&mov(&swtmp(2),	(($enc)?"1":"0"));
> +	&mov(&swtmp(1),	"esi");
> +	&mov(&swtmp(0),	"ebx");
> +	&call("des_encrypt2");
> +
> +	&stack_pop(3);
> +	&mov($L,&DWP(0,"ebx","",0));
> +	&mov($R,&DWP(4,"ebx","",0));
> +
> +	&comment("");
> +	&comment("FP");
> +	&FP_new($L,$R,"eax",0);
> +
> +	&mov(&DWP(0,"ebx","",0),"eax");
> +	&mov(&DWP(4,"ebx","",0),$R);
> +
> +	&pop("edi");
> +	&pop("esi");
> +	&pop("ebp");
> +	&pop("ebx");
> +	&ret();
> +	&function_end_B($name);
> +	}
> +
> +
> diff -Naur linux/cryptolib/libdes/asm/dx86unix.cpp linux-crypto/cryptolib/libdes/asm/dx86unix.cpp
> --- linux/cryptolib/libdes/asm/dx86unix.cpp	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/cryptolib/libdes/asm/dx86unix.cpp	Tue Aug 27 11:20:55 2002
> @@ -0,0 +1,3194 @@
> +/* Run the C pre-processor over this file with one of the following defined
> + * ELF - elf object files,
> + * OUT - a.out object files,
> + * BSDI - BSDI style a.out object files
> + * SOL - Solaris style elf
> + */
> +
> +#define TYPE(a,b)       .type   a,b
> +#define SIZE(a,b)       .size   a,b
> +
> +#if defined(OUT) || defined(BSDI)
> +#define des_SPtrans _des_SPtrans
> +
> +#endif
> +
> +#ifdef OUT
> +#define OK	1
> +#define ALIGN	4
> +#endif
> +
> +#ifdef BSDI
> +#define OK              1
> +#define ALIGN           4
> +#undef SIZE
> +#undef TYPE
> +#endif
> +
> +#if defined(ELF) || defined(SOL)
> +#define OK              1
> +#define ALIGN           16
> +#endif
> +
> +#ifndef OK
> +You need to define one of
> +ELF - elf systems - linux-elf, NetBSD and DG-UX
> +OUT - a.out systems - linux-a.out and FreeBSD
> +SOL - solaris systems, which are elf with strange comment lines
> +BSDI - a.out with a very primative version of as.
> +#endif
> +
> +/* Let the Assembler begin :-) */
> +	/* Don't even think of reading this code */
> +	/* It was automatically generated by des-586.pl */
> +	/* Which is a perl program used to generate the x86 assember for */
> +	/* any of elf, a.out, BSDI,Win32, or Solaris */
> +	/* eric <[email protected]> */
> +
> +	.file	"des-586.s"
> +	.version	"01.01"
> +gcc2_compiled.:
> +.text
> +	.align ALIGN
> +.globl des_encrypt
> +	TYPE(des_encrypt,@function)
> +des_encrypt:
> +	pushl	%esi
> +	pushl	%edi
> +
> +	/* Load the 2 words */
> +	movl	12(%esp),	%esi
> +	xorl	%ecx,		%ecx
> +	pushl	%ebx
> +	pushl	%ebp
> +	movl	(%esi),		%eax
> +	movl	28(%esp),	%ebx
> +	movl	4(%esi),	%edi
> +
> +	/* IP */
> +	roll	$4,		%eax
> +	movl	%eax,		%esi
> +	xorl	%edi,		%eax
> +	andl	$0xf0f0f0f0,	%eax
> +	xorl	%eax,		%esi
> +	xorl	%eax,		%edi
> +
> +	roll	$20,		%edi
> +	movl	%edi,		%eax
> +	xorl	%esi,		%edi
> +	andl	$0xfff0000f,	%edi
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%esi
> +
> +	roll	$14,		%eax
> +	movl	%eax,		%edi
> +	xorl	%esi,		%eax
> +	andl	$0x33333333,	%eax
> +	xorl	%eax,		%edi
> +	xorl	%eax,		%esi
> +
> +	roll	$22,		%esi
> +	movl	%esi,		%eax
> +	xorl	%edi,		%esi
> +	andl	$0x03fc03fc,	%esi
> +	xorl	%esi,		%eax
> +	xorl	%esi,		%edi
> +
> +	roll	$9,		%eax
> +	movl	%eax,		%esi
> +	xorl	%edi,		%eax
> +	andl	$0xaaaaaaaa,	%eax
> +	xorl	%eax,		%esi
> +	xorl	%eax,		%edi
> +
> +.byte 209
> +.byte 199		/* roll $1 %edi */
> +	movl	24(%esp),	%ebp
> +	cmpl	$0,		%ebx
> +	je	.L000start_decrypt
> +
> +	/* Round 0 */
> +	movl	(%ebp),		%eax
> +	xorl	%ebx,		%ebx
> +	movl	4(%ebp),	%edx
> +	xorl	%esi,		%eax
> +	xorl	%esi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%edi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%edi
> +
> +	/* Round 1 */
> +	movl	8(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	12(%ebp),	%edx
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%esi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%esi
> +
> +	/* Round 2 */
> +	movl	16(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	20(%ebp),	%edx
> +	xorl	%esi,		%eax
> +	xorl	%esi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%edi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%edi
> +
> +	/* Round 3 */
> +	movl	24(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	28(%ebp),	%edx
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%esi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%esi
> +
> +	/* Round 4 */
> +	movl	32(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	36(%ebp),	%edx
> +	xorl	%esi,		%eax
> +	xorl	%esi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%edi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%edi
> +
> +	/* Round 5 */
> +	movl	40(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	44(%ebp),	%edx
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%esi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%esi
> +
> +	/* Round 6 */
> +	movl	48(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	52(%ebp),	%edx
> +	xorl	%esi,		%eax
> +	xorl	%esi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%edi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%edi
> +
> +	/* Round 7 */
> +	movl	56(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	60(%ebp),	%edx
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%esi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%esi
> +
> +	/* Round 8 */
> +	movl	64(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	68(%ebp),	%edx
> +	xorl	%esi,		%eax
> +	xorl	%esi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%edi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%edi
> +
> +	/* Round 9 */
> +	movl	72(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	76(%ebp),	%edx
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%esi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%esi
> +
> +	/* Round 10 */
> +	movl	80(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	84(%ebp),	%edx
> +	xorl	%esi,		%eax
> +	xorl	%esi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%edi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%edi
> +
> +	/* Round 11 */
> +	movl	88(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	92(%ebp),	%edx
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%esi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%esi
> +
> +	/* Round 12 */
> +	movl	96(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	100(%ebp),	%edx
> +	xorl	%esi,		%eax
> +	xorl	%esi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%edi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%edi
> +
> +	/* Round 13 */
> +	movl	104(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	108(%ebp),	%edx
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%esi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%esi
> +
> +	/* Round 14 */
> +	movl	112(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	116(%ebp),	%edx
> +	xorl	%esi,		%eax
> +	xorl	%esi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%edi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%edi
> +
> +	/* Round 15 */
> +	movl	120(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	124(%ebp),	%edx
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%esi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%esi
> +	jmp	.L001end
> +.L000start_decrypt:
> +
> +	/* Round 15 */
> +	movl	120(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	124(%ebp),	%edx
> +	xorl	%esi,		%eax
> +	xorl	%esi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%edi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%edi
> +
> +	/* Round 14 */
> +	movl	112(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	116(%ebp),	%edx
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%esi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%esi
> +
> +	/* Round 13 */
> +	movl	104(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	108(%ebp),	%edx
> +	xorl	%esi,		%eax
> +	xorl	%esi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%edi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%edi
> +
> +	/* Round 12 */
> +	movl	96(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	100(%ebp),	%edx
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%esi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%esi
> +
> +	/* Round 11 */
> +	movl	88(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	92(%ebp),	%edx
> +	xorl	%esi,		%eax
> +	xorl	%esi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%edi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%edi
> +
> +	/* Round 10 */
> +	movl	80(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	84(%ebp),	%edx
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%esi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%esi
> +
> +	/* Round 9 */
> +	movl	72(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	76(%ebp),	%edx
> +	xorl	%esi,		%eax
> +	xorl	%esi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%edi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%edi
> +
> +	/* Round 8 */
> +	movl	64(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	68(%ebp),	%edx
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%esi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%esi
> +
> +	/* Round 7 */
> +	movl	56(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	60(%ebp),	%edx
> +	xorl	%esi,		%eax
> +	xorl	%esi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%edi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%edi
> +
> +	/* Round 6 */
> +	movl	48(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	52(%ebp),	%edx
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%esi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%esi
> +
> +	/* Round 5 */
> +	movl	40(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	44(%ebp),	%edx
> +	xorl	%esi,		%eax
> +	xorl	%esi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%edi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%edi
> +
> +	/* Round 4 */
> +	movl	32(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	36(%ebp),	%edx
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%esi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%esi
> +
> +	/* Round 3 */
> +	movl	24(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	28(%ebp),	%edx
> +	xorl	%esi,		%eax
> +	xorl	%esi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%edi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%edi
> +
> +	/* Round 2 */
> +	movl	16(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	20(%ebp),	%edx
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%esi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%esi
> +
> +	/* Round 1 */
> +	movl	8(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	12(%ebp),	%edx
> +	xorl	%esi,		%eax
> +	xorl	%esi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%edi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%edi
> +
> +	/* Round 0 */
> +	movl	(%ebp),		%eax
> +	xorl	%ebx,		%ebx
> +	movl	4(%ebp),	%edx
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%esi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%esi
> +.L001end:
> +
> +	/* FP */
> +	movl	20(%esp),	%edx
> +.byte 209
> +.byte 206		/* rorl $1 %esi */
> +	movl	%edi,		%eax
> +	xorl	%esi,		%edi
> +	andl	$0xaaaaaaaa,	%edi
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%esi
> +
> +	roll	$23,		%eax
> +	movl	%eax,		%edi
> +	xorl	%esi,		%eax
> +	andl	$0x03fc03fc,	%eax
> +	xorl	%eax,		%edi
> +	xorl	%eax,		%esi
> +
> +	roll	$10,		%edi
> +	movl	%edi,		%eax
> +	xorl	%esi,		%edi
> +	andl	$0x33333333,	%edi
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%esi
> +
> +	roll	$18,		%esi
> +	movl	%esi,		%edi
> +	xorl	%eax,		%esi
> +	andl	$0xfff0000f,	%esi
> +	xorl	%esi,		%edi
> +	xorl	%esi,		%eax
> +
> +	roll	$12,		%edi
> +	movl	%edi,		%esi
> +	xorl	%eax,		%edi
> +	andl	$0xf0f0f0f0,	%edi
> +	xorl	%edi,		%esi
> +	xorl	%edi,		%eax
> +
> +	rorl	$4,		%eax
> +	movl	%eax,		(%edx)
> +	movl	%esi,		4(%edx)
> +	popl	%ebp
> +	popl	%ebx
> +	popl	%edi
> +	popl	%esi
> +	ret
> +.des_encrypt_end:
> +	SIZE(des_encrypt,.des_encrypt_end-des_encrypt)
> +.ident	"desasm.pl"
> +.text
> +	.align ALIGN
> +.globl des_encrypt2
> +	TYPE(des_encrypt2,@function)
> +des_encrypt2:
> +	pushl	%esi
> +	pushl	%edi
> +
> +	/* Load the 2 words */
> +	movl	12(%esp),	%eax
> +	xorl	%ecx,		%ecx
> +	pushl	%ebx
> +	pushl	%ebp
> +	movl	(%eax),		%esi
> +	movl	28(%esp),	%ebx
> +	roll	$3,		%esi
> +	movl	4(%eax),	%edi
> +	roll	$3,		%edi
> +	movl	24(%esp),	%ebp
> +	cmpl	$0,		%ebx
> +	je	.L002start_decrypt
> +
> +	/* Round 0 */
> +	movl	(%ebp),		%eax
> +	xorl	%ebx,		%ebx
> +	movl	4(%ebp),	%edx
> +	xorl	%esi,		%eax
> +	xorl	%esi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%edi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%edi
> +
> +	/* Round 1 */
> +	movl	8(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	12(%ebp),	%edx
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%esi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%esi
> +
> +	/* Round 2 */
> +	movl	16(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	20(%ebp),	%edx
> +	xorl	%esi,		%eax
> +	xorl	%esi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%edi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%edi
> +
> +	/* Round 3 */
> +	movl	24(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	28(%ebp),	%edx
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%esi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%esi
> +
> +	/* Round 4 */
> +	movl	32(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	36(%ebp),	%edx
> +	xorl	%esi,		%eax
> +	xorl	%esi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%edi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%edi
> +
> +	/* Round 5 */
> +	movl	40(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	44(%ebp),	%edx
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%esi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%esi
> +
> +	/* Round 6 */
> +	movl	48(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	52(%ebp),	%edx
> +	xorl	%esi,		%eax
> +	xorl	%esi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%edi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%edi
> +
> +	/* Round 7 */
> +	movl	56(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	60(%ebp),	%edx
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%esi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%esi
> +
> +	/* Round 8 */
> +	movl	64(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	68(%ebp),	%edx
> +	xorl	%esi,		%eax
> +	xorl	%esi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%edi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%edi
> +
> +	/* Round 9 */
> +	movl	72(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	76(%ebp),	%edx
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%esi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%esi
> +
> +	/* Round 10 */
> +	movl	80(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	84(%ebp),	%edx
> +	xorl	%esi,		%eax
> +	xorl	%esi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%edi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%edi
> +
> +	/* Round 11 */
> +	movl	88(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	92(%ebp),	%edx
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%esi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%esi
> +
> +	/* Round 12 */
> +	movl	96(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	100(%ebp),	%edx
> +	xorl	%esi,		%eax
> +	xorl	%esi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%edi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%edi
> +
> +	/* Round 13 */
> +	movl	104(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	108(%ebp),	%edx
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%esi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%esi
> +
> +	/* Round 14 */
> +	movl	112(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	116(%ebp),	%edx
> +	xorl	%esi,		%eax
> +	xorl	%esi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%edi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%edi
> +
> +	/* Round 15 */
> +	movl	120(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	124(%ebp),	%edx
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%esi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%esi
> +	jmp	.L003end
> +.L002start_decrypt:
> +
> +	/* Round 15 */
> +	movl	120(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	124(%ebp),	%edx
> +	xorl	%esi,		%eax
> +	xorl	%esi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%edi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%edi
> +
> +	/* Round 14 */
> +	movl	112(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	116(%ebp),	%edx
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%esi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%esi
> +
> +	/* Round 13 */
> +	movl	104(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	108(%ebp),	%edx
> +	xorl	%esi,		%eax
> +	xorl	%esi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%edi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%edi
> +
> +	/* Round 12 */
> +	movl	96(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	100(%ebp),	%edx
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%esi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%esi
> +
> +	/* Round 11 */
> +	movl	88(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	92(%ebp),	%edx
> +	xorl	%esi,		%eax
> +	xorl	%esi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%edi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%edi
> +
> +	/* Round 10 */
> +	movl	80(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	84(%ebp),	%edx
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%esi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%esi
> +
> +	/* Round 9 */
> +	movl	72(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	76(%ebp),	%edx
> +	xorl	%esi,		%eax
> +	xorl	%esi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%edi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%edi
> +
> +	/* Round 8 */
> +	movl	64(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	68(%ebp),	%edx
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%esi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%esi
> +
> +	/* Round 7 */
> +	movl	56(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	60(%ebp),	%edx
> +	xorl	%esi,		%eax
> +	xorl	%esi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%edi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%edi
> +
> +	/* Round 6 */
> +	movl	48(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	52(%ebp),	%edx
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%esi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%esi
> +
> +	/* Round 5 */
> +	movl	40(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	44(%ebp),	%edx
> +	xorl	%esi,		%eax
> +	xorl	%esi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%edi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%edi
> +
> +	/* Round 4 */
> +	movl	32(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	36(%ebp),	%edx
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%esi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%esi
> +
> +	/* Round 3 */
> +	movl	24(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	28(%ebp),	%edx
> +	xorl	%esi,		%eax
> +	xorl	%esi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%edi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%edi
> +
> +	/* Round 2 */
> +	movl	16(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	20(%ebp),	%edx
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%esi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%esi
> +
> +	/* Round 1 */
> +	movl	8(%ebp),	%eax
> +	xorl	%ebx,		%ebx
> +	movl	12(%ebp),	%edx
> +	xorl	%esi,		%eax
> +	xorl	%esi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%edi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%edi
> +
> +	/* Round 0 */
> +	movl	(%ebp),		%eax
> +	xorl	%ebx,		%ebx
> +	movl	4(%ebp),	%edx
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	andl	$0xcfcfcfcf,	%edx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%esi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movl	24(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%esi
> +.L003end:
> +
> +	/* Fixup */
> +	rorl	$3,		%edi
> +	movl	20(%esp),	%eax
> +	rorl	$3,		%esi
> +	movl	%edi,		(%eax)
> +	movl	%esi,		4(%eax)
> +	popl	%ebp
> +	popl	%ebx
> +	popl	%edi
> +	popl	%esi
> +	ret
> +.des_encrypt2_end:
> +	SIZE(des_encrypt2,.des_encrypt2_end-des_encrypt2)
> +.ident	"desasm.pl"
> +.text
> +	.align ALIGN
> +.globl des_encrypt3
> +	TYPE(des_encrypt3,@function)
> +des_encrypt3:
> +	pushl	%ebx
> +	movl	8(%esp),	%ebx
> +	pushl	%ebp
> +	pushl	%esi
> +	pushl	%edi
> +
> +	/* Load the data words */
> +	movl	(%ebx),		%edi
> +	movl	4(%ebx),	%esi
> +	subl	$12,		%esp
> +
> +	/* IP */
> +	roll	$4,		%edi
> +	movl	%edi,		%edx
> +	xorl	%esi,		%edi
> +	andl	$0xf0f0f0f0,	%edi
> +	xorl	%edi,		%edx
> +	xorl	%edi,		%esi
> +
> +	roll	$20,		%esi
> +	movl	%esi,		%edi
> +	xorl	%edx,		%esi
> +	andl	$0xfff0000f,	%esi
> +	xorl	%esi,		%edi
> +	xorl	%esi,		%edx
> +
> +	roll	$14,		%edi
> +	movl	%edi,		%esi
> +	xorl	%edx,		%edi
> +	andl	$0x33333333,	%edi
> +	xorl	%edi,		%esi
> +	xorl	%edi,		%edx
> +
> +	roll	$22,		%edx
> +	movl	%edx,		%edi
> +	xorl	%esi,		%edx
> +	andl	$0x03fc03fc,	%edx
> +	xorl	%edx,		%edi
> +	xorl	%edx,		%esi
> +
> +	roll	$9,		%edi
> +	movl	%edi,		%edx
> +	xorl	%esi,		%edi
> +	andl	$0xaaaaaaaa,	%edi
> +	xorl	%edi,		%edx
> +	xorl	%edi,		%esi
> +
> +	rorl	$3,		%edx
> +	rorl	$2,		%esi
> +	movl	%esi,		4(%ebx)
> +	movl	36(%esp),	%eax
> +	movl	%edx,		(%ebx)
> +	movl	40(%esp),	%edi
> +	movl	44(%esp),	%esi
> +	movl	$1,		8(%esp)
> +	movl	%eax,		4(%esp)
> +	movl	%ebx,		(%esp)
> +	call	des_encrypt2
> +	movl	$0,		8(%esp)
> +	movl	%edi,		4(%esp)
> +	movl	%ebx,		(%esp)
> +	call	des_encrypt2
> +	movl	$1,		8(%esp)
> +	movl	%esi,		4(%esp)
> +	movl	%ebx,		(%esp)
> +	call	des_encrypt2
> +	addl	$12,		%esp
> +	movl	(%ebx),		%edi
> +	movl	4(%ebx),	%esi
> +
> +	/* FP */
> +	roll	$2,		%esi
> +	roll	$3,		%edi
> +	movl	%edi,		%eax
> +	xorl	%esi,		%edi
> +	andl	$0xaaaaaaaa,	%edi
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%esi
> +
> +	roll	$23,		%eax
> +	movl	%eax,		%edi
> +	xorl	%esi,		%eax
> +	andl	$0x03fc03fc,	%eax
> +	xorl	%eax,		%edi
> +	xorl	%eax,		%esi
> +
> +	roll	$10,		%edi
> +	movl	%edi,		%eax
> +	xorl	%esi,		%edi
> +	andl	$0x33333333,	%edi
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%esi
> +
> +	roll	$18,		%esi
> +	movl	%esi,		%edi
> +	xorl	%eax,		%esi
> +	andl	$0xfff0000f,	%esi
> +	xorl	%esi,		%edi
> +	xorl	%esi,		%eax
> +
> +	roll	$12,		%edi
> +	movl	%edi,		%esi
> +	xorl	%eax,		%edi
> +	andl	$0xf0f0f0f0,	%edi
> +	xorl	%edi,		%esi
> +	xorl	%edi,		%eax
> +
> +	rorl	$4,		%eax
> +	movl	%eax,		(%ebx)
> +	movl	%esi,		4(%ebx)
> +	popl	%edi
> +	popl	%esi
> +	popl	%ebp
> +	popl	%ebx
> +	ret
> +.des_encrypt3_end:
> +	SIZE(des_encrypt3,.des_encrypt3_end-des_encrypt3)
> +.ident	"desasm.pl"
> +.text
> +	.align ALIGN
> +.globl des_decrypt3
> +	TYPE(des_decrypt3,@function)
> +des_decrypt3:
> +	pushl	%ebx
> +	movl	8(%esp),	%ebx
> +	pushl	%ebp
> +	pushl	%esi
> +	pushl	%edi
> +
> +	/* Load the data words */
> +	movl	(%ebx),		%edi
> +	movl	4(%ebx),	%esi
> +	subl	$12,		%esp
> +
> +	/* IP */
> +	roll	$4,		%edi
> +	movl	%edi,		%edx
> +	xorl	%esi,		%edi
> +	andl	$0xf0f0f0f0,	%edi
> +	xorl	%edi,		%edx
> +	xorl	%edi,		%esi
> +
> +	roll	$20,		%esi
> +	movl	%esi,		%edi
> +	xorl	%edx,		%esi
> +	andl	$0xfff0000f,	%esi
> +	xorl	%esi,		%edi
> +	xorl	%esi,		%edx
> +
> +	roll	$14,		%edi
> +	movl	%edi,		%esi
> +	xorl	%edx,		%edi
> +	andl	$0x33333333,	%edi
> +	xorl	%edi,		%esi
> +	xorl	%edi,		%edx
> +
> +	roll	$22,		%edx
> +	movl	%edx,		%edi
> +	xorl	%esi,		%edx
> +	andl	$0x03fc03fc,	%edx
> +	xorl	%edx,		%edi
> +	xorl	%edx,		%esi
> +
> +	roll	$9,		%edi
> +	movl	%edi,		%edx
> +	xorl	%esi,		%edi
> +	andl	$0xaaaaaaaa,	%edi
> +	xorl	%edi,		%edx
> +	xorl	%edi,		%esi
> +
> +	rorl	$3,		%edx
> +	rorl	$2,		%esi
> +	movl	%esi,		4(%ebx)
> +	movl	36(%esp),	%esi
> +	movl	%edx,		(%ebx)
> +	movl	40(%esp),	%edi
> +	movl	44(%esp),	%eax
> +	movl	$0,		8(%esp)
> +	movl	%eax,		4(%esp)
> +	movl	%ebx,		(%esp)
> +	call	des_encrypt2
> +	movl	$1,		8(%esp)
> +	movl	%edi,		4(%esp)
> +	movl	%ebx,		(%esp)
> +	call	des_encrypt2
> +	movl	$0,		8(%esp)
> +	movl	%esi,		4(%esp)
> +	movl	%ebx,		(%esp)
> +	call	des_encrypt2
> +	addl	$12,		%esp
> +	movl	(%ebx),		%edi
> +	movl	4(%ebx),	%esi
> +
> +	/* FP */
> +	roll	$2,		%esi
> +	roll	$3,		%edi
> +	movl	%edi,		%eax
> +	xorl	%esi,		%edi
> +	andl	$0xaaaaaaaa,	%edi
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%esi
> +
> +	roll	$23,		%eax
> +	movl	%eax,		%edi
> +	xorl	%esi,		%eax
> +	andl	$0x03fc03fc,	%eax
> +	xorl	%eax,		%edi
> +	xorl	%eax,		%esi
> +
> +	roll	$10,		%edi
> +	movl	%edi,		%eax
> +	xorl	%esi,		%edi
> +	andl	$0x33333333,	%edi
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%esi
> +
> +	roll	$18,		%esi
> +	movl	%esi,		%edi
> +	xorl	%eax,		%esi
> +	andl	$0xfff0000f,	%esi
> +	xorl	%esi,		%edi
> +	xorl	%esi,		%eax
> +
> +	roll	$12,		%edi
> +	movl	%edi,		%esi
> +	xorl	%eax,		%edi
> +	andl	$0xf0f0f0f0,	%edi
> +	xorl	%edi,		%esi
> +	xorl	%edi,		%eax
> +
> +	rorl	$4,		%eax
> +	movl	%eax,		(%ebx)
> +	movl	%esi,		4(%ebx)
> +	popl	%edi
> +	popl	%esi
> +	popl	%ebp
> +	popl	%ebx
> +	ret
> +.des_decrypt3_end:
> +	SIZE(des_decrypt3,.des_decrypt3_end-des_decrypt3)
> +.ident	"desasm.pl"
> +.text
> +	.align ALIGN
> +.globl des_ncbc_encrypt
> +	TYPE(des_ncbc_encrypt,@function)
> +des_ncbc_encrypt:
> +
> +	pushl	%ebp
> +	pushl	%ebx
> +	pushl	%esi
> +	pushl	%edi
> +	movl	28(%esp),	%ebp
> +	/* getting iv ptr from parameter 4 */
> +	movl	36(%esp),	%ebx
> +	movl	(%ebx),		%esi
> +	movl	4(%ebx),	%edi
> +	pushl	%edi
> +	pushl	%esi
> +	pushl	%edi
> +	pushl	%esi
> +	movl	%esp,		%ebx
> +	movl	36(%esp),	%esi
> +	movl	40(%esp),	%edi
> +	/* getting encrypt flag from parameter 5 */
> +	movl	56(%esp),	%ecx
> +	/* get and push parameter 5 */
> +	pushl	%ecx
> +	/* get and push parameter 3 */
> +	movl	52(%esp),	%eax
> +	pushl	%eax
> +	pushl	%ebx
> +	cmpl	$0,		%ecx
> +	jz	.L004decrypt
> +	andl	$4294967288,	%ebp
> +	movl	12(%esp),	%eax
> +	movl	16(%esp),	%ebx
> +	jz	.L005encrypt_finish
> +.L006encrypt_loop:
> +	movl	(%esi),		%ecx
> +	movl	4(%esi),	%edx
> +	xorl	%ecx,		%eax
> +	xorl	%edx,		%ebx
> +	movl	%eax,		12(%esp)
> +	movl	%ebx,		16(%esp)
> +	call	des_encrypt
> +	movl	12(%esp),	%eax
> +	movl	16(%esp),	%ebx
> +	movl	%eax,		(%edi)
> +	movl	%ebx,		4(%edi)
> +	addl	$8,		%esi
> +	addl	$8,		%edi
> +	subl	$8,		%ebp
> +	jnz	.L006encrypt_loop
> +.L005encrypt_finish:
> +	movl	56(%esp),	%ebp
> +	andl	$7,		%ebp
> +	jz	.L007finish
> +	xorl	%ecx,		%ecx
> +	xorl	%edx,		%edx
> +	movl	.L008cbc_enc_jmp_table(,%ebp,4),%ebp
> +	jmp	*%ebp
> +.L009ej7:
> +	movb	6(%esi),	%dh
> +	sall	$8,		%edx
> +.L010ej6:
> +	movb	5(%esi),	%dh
> +.L011ej5:
> +	movb	4(%esi),	%dl
> +.L012ej4:
> +	movl	(%esi),		%ecx
> +	jmp	.L013ejend
> +.L014ej3:
> +	movb	2(%esi),	%ch
> +	sall	$8,		%ecx
> +.L015ej2:
> +	movb	1(%esi),	%ch
> +.L016ej1:
> +	movb	(%esi),		%cl
> +.L013ejend:
> +	xorl	%ecx,		%eax
> +	xorl	%edx,		%ebx
> +	movl	%eax,		12(%esp)
> +	movl	%ebx,		16(%esp)
> +	call	des_encrypt
> +	movl	12(%esp),	%eax
> +	movl	16(%esp),	%ebx
> +	movl	%eax,		(%edi)
> +	movl	%ebx,		4(%edi)
> +	jmp	.L007finish
> +.align ALIGN
> +.L004decrypt:
> +	andl	$4294967288,	%ebp
> +	movl	20(%esp),	%eax
> +	movl	24(%esp),	%ebx
> +	jz	.L017decrypt_finish
> +.L018decrypt_loop:
> +	movl	(%esi),		%eax
> +	movl	4(%esi),	%ebx
> +	movl	%eax,		12(%esp)
> +	movl	%ebx,		16(%esp)
> +	call	des_encrypt
> +	movl	12(%esp),	%eax
> +	movl	16(%esp),	%ebx
> +	movl	20(%esp),	%ecx
> +	movl	24(%esp),	%edx
> +	xorl	%eax,		%ecx
> +	xorl	%ebx,		%edx
> +	movl	(%esi),		%eax
> +	movl	4(%esi),	%ebx
> +	movl	%ecx,		(%edi)
> +	movl	%edx,		4(%edi)
> +	movl	%eax,		20(%esp)
> +	movl	%ebx,		24(%esp)
> +	addl	$8,		%esi
> +	addl	$8,		%edi
> +	subl	$8,		%ebp
> +	jnz	.L018decrypt_loop
> +.L017decrypt_finish:
> +	movl	56(%esp),	%ebp
> +	andl	$7,		%ebp
> +	jz	.L007finish
> +	movl	(%esi),		%eax
> +	movl	4(%esi),	%ebx
> +	movl	%eax,		12(%esp)
> +	movl	%ebx,		16(%esp)
> +	call	des_encrypt
> +	movl	12(%esp),	%eax
> +	movl	16(%esp),	%ebx
> +	movl	20(%esp),	%ecx
> +	movl	24(%esp),	%edx
> +	xorl	%eax,		%ecx
> +	xorl	%ebx,		%edx
> +	movl	(%esi),		%eax
> +	movl	4(%esi),	%ebx
> +.L019dj7:
> +	rorl	$16,		%edx
> +	movb	%dl,		6(%edi)
> +	shrl	$16,		%edx
> +.L020dj6:
> +	movb	%dh,		5(%edi)
> +.L021dj5:
> +	movb	%dl,		4(%edi)
> +.L022dj4:
> +	movl	%ecx,		(%edi)
> +	jmp	.L023djend
> +.L024dj3:
> +	rorl	$16,		%ecx
> +	movb	%cl,		2(%edi)
> +	sall	$16,		%ecx
> +.L025dj2:
> +	movb	%ch,		1(%esi)
> +.L026dj1:
> +	movb	%cl,		(%esi)
> +.L023djend:
> +	jmp	.L007finish
> +.align ALIGN
> +.L007finish:
> +	movl	64(%esp),	%ecx
> +	addl	$28,		%esp
> +	movl	%eax,		(%ecx)
> +	movl	%ebx,		4(%ecx)
> +	popl	%edi
> +	popl	%esi
> +	popl	%ebx
> +	popl	%ebp
> +	ret
> +.align ALIGN
> +.L008cbc_enc_jmp_table:
> +	.long 0
> +	.long .L016ej1
> +	.long .L015ej2
> +	.long .L014ej3
> +	.long .L012ej4
> +	.long .L011ej5
> +	.long .L010ej6
> +	.long .L009ej7
> +.align ALIGN
> +.L027cbc_dec_jmp_table:
> +	.long 0
> +	.long .L026dj1
> +	.long .L025dj2
> +	.long .L024dj3
> +	.long .L022dj4
> +	.long .L021dj5
> +	.long .L020dj6
> +	.long .L019dj7
> +.des_ncbc_encrypt_end:
> +	SIZE(des_ncbc_encrypt,.des_ncbc_encrypt_end-des_ncbc_encrypt)
> +.ident	"desasm.pl"
> +.text
> +	.align ALIGN
> +.globl des_ede3_cbc_encrypt
> +	TYPE(des_ede3_cbc_encrypt,@function)
> +des_ede3_cbc_encrypt:
> +
> +	pushl	%ebp
> +	pushl	%ebx
> +	pushl	%esi
> +	pushl	%edi
> +	movl	28(%esp),	%ebp
> +	/* getting iv ptr from parameter 6 */
> +	movl	44(%esp),	%ebx
> +	movl	(%ebx),		%esi
> +	movl	4(%ebx),	%edi
> +	pushl	%edi
> +	pushl	%esi
> +	pushl	%edi
> +	pushl	%esi
> +	movl	%esp,		%ebx
> +	movl	36(%esp),	%esi
> +	movl	40(%esp),	%edi
> +	/* getting encrypt flag from parameter 7 */
> +	movl	64(%esp),	%ecx
> +	/* get and push parameter 5 */
> +	movl	56(%esp),	%eax
> +	pushl	%eax
> +	/* get and push parameter 4 */
> +	movl	56(%esp),	%eax
> +	pushl	%eax
> +	/* get and push parameter 3 */
> +	movl	56(%esp),	%eax
> +	pushl	%eax
> +	pushl	%ebx
> +	cmpl	$0,		%ecx
> +	jz	.L028decrypt
> +	andl	$4294967288,	%ebp
> +	movl	16(%esp),	%eax
> +	movl	20(%esp),	%ebx
> +	jz	.L029encrypt_finish
> +.L030encrypt_loop:
> +	movl	(%esi),		%ecx
> +	movl	4(%esi),	%edx
> +	xorl	%ecx,		%eax
> +	xorl	%edx,		%ebx
> +	movl	%eax,		16(%esp)
> +	movl	%ebx,		20(%esp)
> +	call	des_encrypt3
> +	movl	16(%esp),	%eax
> +	movl	20(%esp),	%ebx
> +	movl	%eax,		(%edi)
> +	movl	%ebx,		4(%edi)
> +	addl	$8,		%esi
> +	addl	$8,		%edi
> +	subl	$8,		%ebp
> +	jnz	.L030encrypt_loop
> +.L029encrypt_finish:
> +	movl	60(%esp),	%ebp
> +	andl	$7,		%ebp
> +	jz	.L031finish
> +	xorl	%ecx,		%ecx
> +	xorl	%edx,		%edx
> +	movl	.L032cbc_enc_jmp_table(,%ebp,4),%ebp
> +	jmp	*%ebp
> +.L033ej7:
> +	movb	6(%esi),	%dh
> +	sall	$8,		%edx
> +.L034ej6:
> +	movb	5(%esi),	%dh
> +.L035ej5:
> +	movb	4(%esi),	%dl
> +.L036ej4:
> +	movl	(%esi),		%ecx
> +	jmp	.L037ejend
> +.L038ej3:
> +	movb	2(%esi),	%ch
> +	sall	$8,		%ecx
> +.L039ej2:
> +	movb	1(%esi),	%ch
> +.L040ej1:
> +	movb	(%esi),		%cl
> +.L037ejend:
> +	xorl	%ecx,		%eax
> +	xorl	%edx,		%ebx
> +	movl	%eax,		16(%esp)
> +	movl	%ebx,		20(%esp)
> +	call	des_encrypt3
> +	movl	16(%esp),	%eax
> +	movl	20(%esp),	%ebx
> +	movl	%eax,		(%edi)
> +	movl	%ebx,		4(%edi)
> +	jmp	.L031finish
> +.align ALIGN
> +.L028decrypt:
> +	andl	$4294967288,	%ebp
> +	movl	24(%esp),	%eax
> +	movl	28(%esp),	%ebx
> +	jz	.L041decrypt_finish
> +.L042decrypt_loop:
> +	movl	(%esi),		%eax
> +	movl	4(%esi),	%ebx
> +	movl	%eax,		16(%esp)
> +	movl	%ebx,		20(%esp)
> +	call	des_decrypt3
> +	movl	16(%esp),	%eax
> +	movl	20(%esp),	%ebx
> +	movl	24(%esp),	%ecx
> +	movl	28(%esp),	%edx
> +	xorl	%eax,		%ecx
> +	xorl	%ebx,		%edx
> +	movl	(%esi),		%eax
> +	movl	4(%esi),	%ebx
> +	movl	%ecx,		(%edi)
> +	movl	%edx,		4(%edi)
> +	movl	%eax,		24(%esp)
> +	movl	%ebx,		28(%esp)
> +	addl	$8,		%esi
> +	addl	$8,		%edi
> +	subl	$8,		%ebp
> +	jnz	.L042decrypt_loop
> +.L041decrypt_finish:
> +	movl	60(%esp),	%ebp
> +	andl	$7,		%ebp
> +	jz	.L031finish
> +	movl	(%esi),		%eax
> +	movl	4(%esi),	%ebx
> +	movl	%eax,		16(%esp)
> +	movl	%ebx,		20(%esp)
> +	call	des_decrypt3
> +	movl	16(%esp),	%eax
> +	movl	20(%esp),	%ebx
> +	movl	24(%esp),	%ecx
> +	movl	28(%esp),	%edx
> +	xorl	%eax,		%ecx
> +	xorl	%ebx,		%edx
> +	movl	(%esi),		%eax
> +	movl	4(%esi),	%ebx
> +.L043dj7:
> +	rorl	$16,		%edx
> +	movb	%dl,		6(%edi)
> +	shrl	$16,		%edx
> +.L044dj6:
> +	movb	%dh,		5(%edi)
> +.L045dj5:
> +	movb	%dl,		4(%edi)
> +.L046dj4:
> +	movl	%ecx,		(%edi)
> +	jmp	.L047djend
> +.L048dj3:
> +	rorl	$16,		%ecx
> +	movb	%cl,		2(%edi)
> +	sall	$16,		%ecx
> +.L049dj2:
> +	movb	%ch,		1(%esi)
> +.L050dj1:
> +	movb	%cl,		(%esi)
> +.L047djend:
> +	jmp	.L031finish
> +.align ALIGN
> +.L031finish:
> +	movl	76(%esp),	%ecx
> +	addl	$32,		%esp
> +	movl	%eax,		(%ecx)
> +	movl	%ebx,		4(%ecx)
> +	popl	%edi
> +	popl	%esi
> +	popl	%ebx
> +	popl	%ebp
> +	ret
> +.align ALIGN
> +.L032cbc_enc_jmp_table:
> +	.long 0
> +	.long .L040ej1
> +	.long .L039ej2
> +	.long .L038ej3
> +	.long .L036ej4
> +	.long .L035ej5
> +	.long .L034ej6
> +	.long .L033ej7
> +.align ALIGN
> +.L051cbc_dec_jmp_table:
> +	.long 0
> +	.long .L050dj1
> +	.long .L049dj2
> +	.long .L048dj3
> +	.long .L046dj4
> +	.long .L045dj5
> +	.long .L044dj6
> +	.long .L043dj7
> +.des_ede3_cbc_encrypt_end:
> +	SIZE(des_ede3_cbc_encrypt,.des_ede3_cbc_encrypt_end-des_ede3_cbc_encrypt)
> +.ident	"desasm.pl"
> diff -Naur linux/cryptolib/libdes/asm/perlasm/cbc.pl linux-crypto/cryptolib/libdes/asm/perlasm/cbc.pl
> --- linux/cryptolib/libdes/asm/perlasm/cbc.pl	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/cryptolib/libdes/asm/perlasm/cbc.pl	Tue Aug 27 11:20:55 2002
> @@ -0,0 +1,342 @@
> +#!/usr/local/bin/perl
> +
> +# void des_ncbc_encrypt(input, output, length, schedule, ivec, enc)
> +# des_cblock (*input);
> +# des_cblock (*output);
> +# long length;
> +# des_key_schedule schedule;
> +# des_cblock (*ivec);
> +# int enc;
> +#
> +# calls 
> +# des_encrypt((DES_LONG *)tin,schedule,DES_ENCRYPT);
> +#
> +
> +#&cbc("des_ncbc_encrypt","des_encrypt",0);
> +#&cbc("BF_cbc_encrypt","BF_encrypt","BF_encrypt",
> +#	1,4,5,3,5,-1);
> +#&cbc("des_ncbc_encrypt","des_encrypt","des_encrypt",
> +#	0,4,5,3,5,-1);
> +#&cbc("des_ede3_cbc_encrypt","des_encrypt3","des_decrypt3",
> +#	0,6,7,3,4,5);
> +#
> +# When doing a cipher that needs bigendian order,
> +# for encrypt, the iv is kept in bigendian form,
> +# while for decrypt, it is kept in little endian.
> +sub cbc
> +	{
> +	local($name,$enc_func,$dec_func,$swap,$iv_off,$enc_off,$p1,$p2,$p3)=@_;
> +	# name is the function name
> +	# enc_func and dec_func and the functions to call for encrypt/decrypt
> +	# swap is true if byte order needs to be reversed
> +	# iv_off is parameter number for the iv 
> +	# enc_off is parameter number for the encrypt/decrypt flag
> +	# p1,p2,p3 are the offsets for parameters to be passed to the
> +	# underlying calls.
> +
> +	&function_begin_B($name,"");
> +	&comment("");
> +
> +	$in="esi";
> +	$out="edi";
> +	$count="ebp";
> +
> +	&push("ebp");
> +	&push("ebx");
> +	&push("esi");
> +	&push("edi");
> +
> +	$data_off=4;
> +	$data_off+=4 if ($p1 > 0);
> +	$data_off+=4 if ($p2 > 0);
> +	$data_off+=4 if ($p3 > 0);
> +
> +	&mov($count,	&wparam(2));	# length
> +
> +	&comment("getting iv ptr from parameter $iv_off");
> +	&mov("ebx",	&wparam($iv_off));	# Get iv ptr
> +
> +	&mov($in,	&DWP(0,"ebx","",0));#	iv[0]
> +	&mov($out,	&DWP(4,"ebx","",0));#	iv[1]
> +
> +	&push($out);
> +	&push($in);
> +	&push($out);	# used in decrypt for iv[1]
> +	&push($in);	# used in decrypt for iv[0]
> +
> +	&mov("ebx",	"esp");		# This is the address of tin[2]
> +
> +	&mov($in,	&wparam(0));	# in
> +	&mov($out,	&wparam(1));	# out
> +
> +	# We have loaded them all, how lets push things
> +	&comment("getting encrypt flag from parameter $enc_off");
> +	&mov("ecx",	&wparam($enc_off));	# Get enc flag
> +	if ($p3 > 0)
> +		{
> +		&comment("get and push parameter $p3");
> +		if ($enc_off != $p3)
> +			{ &mov("eax",	&wparam($p3)); &push("eax"); }
> +		else	{ &push("ecx"); }
> +		}
> +	if ($p2 > 0)
> +		{
> +		&comment("get and push parameter $p2");
> +		if ($enc_off != $p2)
> +			{ &mov("eax",	&wparam($p2)); &push("eax"); }
> +		else	{ &push("ecx"); }
> +		}
> +	if ($p1 > 0)
> +		{
> +		&comment("get and push parameter $p1");
> +		if ($enc_off != $p1)
> +			{ &mov("eax",	&wparam($p1)); &push("eax"); }
> +		else	{ &push("ecx"); }
> +		}
> +	&push("ebx");		# push data/iv
> +
> +	&cmp("ecx",0);
> +	&jz(&label("decrypt"));
> +
> +	&and($count,0xfffffff8);
> +	&mov("eax",	&DWP($data_off,"esp","",0));	# load iv[0]
> +	&mov("ebx",	&DWP($data_off+4,"esp","",0));	# load iv[1]
> +
> +	&jz(&label("encrypt_finish"));
> +
> +	#############################################################
> +
> +	&set_label("encrypt_loop");
> +	# encrypt start 
> +	# "eax" and "ebx" hold iv (or the last cipher text)
> +
> +	&mov("ecx",	&DWP(0,$in,"",0));	# load first 4 bytes
> +	&mov("edx",	&DWP(4,$in,"",0));	# second 4 bytes
> +
> +	&xor("eax",	"ecx");
> +	&xor("ebx",	"edx");
> +
> +	&bswap("eax")	if $swap;
> +	&bswap("ebx")	if $swap;
> +
> +	&mov(&DWP($data_off,"esp","",0),	"eax");	# put in array for call
> +	&mov(&DWP($data_off+4,"esp","",0),	"ebx");	#
> +
> +	&call($enc_func);
> +
> +	&mov("eax",	&DWP($data_off,"esp","",0));
> +	&mov("ebx",	&DWP($data_off+4,"esp","",0));
> +
> +	&bswap("eax")	if $swap;
> +	&bswap("ebx")	if $swap;
> +
> +	&mov(&DWP(0,$out,"",0),"eax");
> +	&mov(&DWP(4,$out,"",0),"ebx");
> +
> +	# eax and ebx are the next iv.
> +
> +	&add($in,	8);
> +	&add($out,	8);
> +
> +	&sub($count,	8);
> +	&jnz(&label("encrypt_loop"));
> +
> +###################################################################3
> +	&set_label("encrypt_finish");
> +	&mov($count,	&wparam(2));	# length
> +	&and($count,	7);
> +	&jz(&label("finish"));
> +	&xor("ecx","ecx");
> +	&xor("edx","edx");
> +	&mov($count,&DWP(&label("cbc_enc_jmp_table"),"",$count,4));
> +	&jmp_ptr($count);
> +
> +&set_label("ej7");
> +	&xor("edx",		"edx") if $ppro; # ppro friendly
> +	&movb(&HB("edx"),	&BP(6,$in,"",0));
> +	&shl("edx",8);
> +&set_label("ej6");
> +	&movb(&HB("edx"),	&BP(5,$in,"",0));
> +&set_label("ej5");
> +	&movb(&LB("edx"),	&BP(4,$in,"",0));
> +&set_label("ej4");
> +	&mov("ecx",		&DWP(0,$in,"",0));
> +	&jmp(&label("ejend"));
> +&set_label("ej3");
> +	&movb(&HB("ecx"),	&BP(2,$in,"",0));
> +	&xor("ecx",		"ecx") if $ppro; # ppro friendly
> +	&shl("ecx",8);
> +&set_label("ej2");
> +	&movb(&HB("ecx"),	&BP(1,$in,"",0));
> +&set_label("ej1");
> +	&movb(&LB("ecx"),	&BP(0,$in,"",0));
> +&set_label("ejend");
> +
> +	&xor("eax",	"ecx");
> +	&xor("ebx",	"edx");
> +
> +	&bswap("eax")	if $swap;
> +	&bswap("ebx")	if $swap;
> +
> +	&mov(&DWP($data_off,"esp","",0),	"eax");	# put in array for call
> +	&mov(&DWP($data_off+4,"esp","",0),	"ebx");	#
> +
> +	&call($enc_func);
> +
> +	&mov("eax",	&DWP($data_off,"esp","",0));
> +	&mov("ebx",	&DWP($data_off+4,"esp","",0));
> +
> +	&bswap("eax")	if $swap;
> +	&bswap("ebx")	if $swap;
> +
> +	&mov(&DWP(0,$out,"",0),"eax");
> +	&mov(&DWP(4,$out,"",0),"ebx");
> +
> +	&jmp(&label("finish"));
> +
> +	#############################################################
> +	#############################################################
> +	&set_label("decrypt",1);
> +	# decrypt start 
> +	&and($count,0xfffffff8);
> +	# The next 2 instructions are only for if the jz is taken
> +	&mov("eax",	&DWP($data_off+8,"esp","",0));	# get iv[0]
> +	&mov("ebx",	&DWP($data_off+12,"esp","",0));	# get iv[1]
> +	&jz(&label("decrypt_finish"));
> +
> +	&set_label("decrypt_loop");
> +	&mov("eax",	&DWP(0,$in,"",0));	# load first 4 bytes
> +	&mov("ebx",	&DWP(4,$in,"",0));	# second 4 bytes
> +
> +	&bswap("eax")	if $swap;
> +	&bswap("ebx")	if $swap;
> +
> +	&mov(&DWP($data_off,"esp","",0),	"eax");	# put back
> +	&mov(&DWP($data_off+4,"esp","",0),	"ebx");	#
> +
> +	&call($dec_func);
> +
> +	&mov("eax",	&DWP($data_off,"esp","",0));	# get return
> +	&mov("ebx",	&DWP($data_off+4,"esp","",0));	#
> +
> +	&bswap("eax")	if $swap;
> +	&bswap("ebx")	if $swap;
> +
> +	&mov("ecx",	&DWP($data_off+8,"esp","",0));	# get iv[0]
> +	&mov("edx",	&DWP($data_off+12,"esp","",0));	# get iv[1]
> +
> +	&xor("ecx",	"eax");
> +	&xor("edx",	"ebx");
> +
> +	&mov("eax",	&DWP(0,$in,"",0));	# get old cipher text,
> +	&mov("ebx",	&DWP(4,$in,"",0));	# next iv actually
> +
> +	&mov(&DWP(0,$out,"",0),"ecx");
> +	&mov(&DWP(4,$out,"",0),"edx");
> +
> +	&mov(&DWP($data_off+8,"esp","",0),	"eax");	# save iv
> +	&mov(&DWP($data_off+12,"esp","",0),	"ebx");	#
> +
> +	&add($in,	8);
> +	&add($out,	8);
> +
> +	&sub($count,	8);
> +	&jnz(&label("decrypt_loop"));
> +############################ ENDIT #######################3
> +	&set_label("decrypt_finish");
> +	&mov($count,	&wparam(2));	# length
> +	&and($count,	7);
> +	&jz(&label("finish"));
> +
> +	&mov("eax",	&DWP(0,$in,"",0));	# load first 4 bytes
> +	&mov("ebx",	&DWP(4,$in,"",0));	# second 4 bytes
> +
> +	&bswap("eax")	if $swap;
> +	&bswap("ebx")	if $swap;
> +
> +	&mov(&DWP($data_off,"esp","",0),	"eax");	# put back
> +	&mov(&DWP($data_off+4,"esp","",0),	"ebx");	#
> +
> +	&call($dec_func);
> +
> +	&mov("eax",	&DWP($data_off,"esp","",0));	# get return
> +	&mov("ebx",	&DWP($data_off+4,"esp","",0));	#
> +
> +	&bswap("eax")	if $swap;
> +	&bswap("ebx")	if $swap;
> +
> +	&mov("ecx",	&DWP($data_off+8,"esp","",0));	# get iv[0]
> +	&mov("edx",	&DWP($data_off+12,"esp","",0));	# get iv[1]
> +
> +	&xor("ecx",	"eax");
> +	&xor("edx",	"ebx");
> +
> +	# this is for when we exit
> +	&mov("eax",	&DWP(0,$in,"",0));	# get old cipher text,
> +	&mov("ebx",	&DWP(4,$in,"",0));	# next iv actually
> +
> +&set_label("dj7");
> +	&rotr("edx",	16);
> +	&movb(&BP(6,$out,"",0),	&LB("edx"));
> +	&shr("edx",16);
> +&set_label("dj6");
> +	&movb(&BP(5,$out,"",0),	&HB("edx"));
> +&set_label("dj5");
> +	&movb(&BP(4,$out,"",0),	&LB("edx"));
> +&set_label("dj4");
> +	&mov(&DWP(0,$out,"",0),	"ecx");
> +	&jmp(&label("djend"));
> +&set_label("dj3");
> +	&rotr("ecx",	16);
> +	&movb(&BP(2,$out,"",0),	&LB("ecx"));
> +	&shl("ecx",16);
> +&set_label("dj2");
> +	&movb(&BP(1,$in,"",0),	&HB("ecx"));
> +&set_label("dj1");
> +	&movb(&BP(0,$in,"",0),	&LB("ecx"));
> +&set_label("djend");
> +
> +	# final iv is still in eax:ebx
> +	&jmp(&label("finish"));
> +
> +
> +############################ FINISH #######################3
> +	&set_label("finish",1);
> +	&mov("ecx",	&wparam($iv_off));	# Get iv ptr
> +
> +	#################################################
> +	$total=16+4;
> +	$total+=4 if ($p1 > 0);
> +	$total+=4 if ($p2 > 0);
> +	$total+=4 if ($p3 > 0);
> +	&add("esp",$total);
> +
> +	&mov(&DWP(0,"ecx","",0),	"eax");	# save iv
> +	&mov(&DWP(4,"ecx","",0),	"ebx");	# save iv
> +
> +	&function_end_A($name);
> +
> +	&set_label("cbc_enc_jmp_table",1);
> +	&data_word("0");
> +	&data_word(&label("ej1"));
> +	&data_word(&label("ej2"));
> +	&data_word(&label("ej3"));
> +	&data_word(&label("ej4"));
> +	&data_word(&label("ej5"));
> +	&data_word(&label("ej6"));
> +	&data_word(&label("ej7"));
> +	&set_label("cbc_dec_jmp_table",1);
> +	&data_word("0");
> +	&data_word(&label("dj1"));
> +	&data_word(&label("dj2"));
> +	&data_word(&label("dj3"));
> +	&data_word(&label("dj4"));
> +	&data_word(&label("dj5"));
> +	&data_word(&label("dj6"));
> +	&data_word(&label("dj7"));
> +
> +	&function_end_B($name);
> +	
> +	}
> +
> +1;
> diff -Naur linux/cryptolib/libdes/asm/perlasm/readme linux-crypto/cryptolib/libdes/asm/perlasm/readme
> --- linux/cryptolib/libdes/asm/perlasm/readme	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/cryptolib/libdes/asm/perlasm/readme	Tue Aug 27 11:20:55 2002
> @@ -0,0 +1,124 @@
> +The perl scripts in this directory are my 'hack' to generate
> +multiple different assembler formats via the one origional script.
> +
> +The way to use this library is to start with adding the path to this directory
> +and then include it.
> +
> +push(@INC,"perlasm","../../perlasm");
> +require "x86asm.pl";
> +
> +The first thing we do is setup the file and type of assember
> +
> +&asm_init($ARGV[0],$0);
> +
> +The first argument is the 'type'.  Currently
> +'cpp', 'sol', 'a.out', 'elf' or 'win32'.
> +Argument 2 is the file name.
> +
> +The reciprocal function is
> +&asm_finish() which should be called at the end.
> +
> +There are 2 main 'packages'. x86ms.pl, which is the microsoft assembler,
> +and x86unix.pl which is the unix (gas) version.
> +
> +Functions of interest are:
> +&external_label("des_SPtrans");	declare and external variable
> +&LB(reg);			Low byte for a register
> +&HB(reg);			High byte for a register
> +&BP(off,base,index,scale)	Byte pointer addressing
> +&DWP(off,base,index,scale)	Word pointer addressing
> +&stack_push(num)		Basically a 'sub esp, num*4' with extra
> +&stack_pop(num)			inverse of stack_push
> +&function_begin(name,extra)	Start a function with pushing of
> +				edi, esi, ebx and ebp.  extra is extra win32
> +				external info that may be required.
> +&function_begin_B(name,extra)	Same as norma function_begin but no pushing.
> +&function_end(name)		Call at end of function.
> +&function_end_A(name)		Standard pop and ret, for use inside functions
> +&function_end_B(name)		Call at end but with poping or 'ret'.
> +&swtmp(num)			Address on stack temp word.
> +&wparam(num)			Parameter number num, that was push
> +				in C convention.  This all works over pushes
> +				and pops.
> +&comment("hello there")		Put in a comment.
> +&label("loop")			Refer to a label, normally a jmp target.
> +&set_label("loop")		Set a label at this point.
> +&data_word(word)		Put in a word of data.
> +
> +So how does this all hold together?  Given
> +
> +int calc(int len, int *data)
> +	{
> +	int i,j=0;
> +
> +	for (i=0; i<len; i++)
> +		{
> +		j+=other(data[i]);
> +		}
> +	}
> +
> +So a very simple version of this function could be coded as
> +
> +	push(@INC,"perlasm","../../perlasm");
> +	require "x86asm.pl";
> +	
> +	&asm_init($ARGV[0],"cacl.pl");
> +
> +	&external_label("other");
> +
> +	$tmp1=	"eax";
> +	$j=	"edi";
> +	$data=	"esi";
> +	$i=	"ebp";
> +
> +	&comment("a simple function");
> +	&function_begin("calc");
> +	&mov(	$data,		&wparam(1)); # data
> +	&xor(	$j,		$j);
> +	&xor(	$i,		$i);
> +
> +	&set_label("loop");
> +	&cmp(	$i,		&wparam(0));
> +	&jge(	&label("end"));
> +
> +	&mov(	$tmp1,		&DWP(0,$data,$i,4));
> +	&push(	$tmp1);
> +	&call(	"other");
> +	&add(	$j,		"eax");
> +	&pop(	$tmp1);
> +	&inc(	$i);
> +	&jmp(	&label("loop"));
> +
> +	&set_label("end");
> +	&mov(	"eax",		$j);
> +
> +	&function_end("calc");
> +
> +	&asm_finish();
> +
> +The above example is very very unoptimised but gives an idea of how
> +things work.
> +
> +There is also a cbc mode function generator in cbc.pl
> +
> +&cbc(	$name,
> +	$encrypt_function_name,
> +	$decrypt_function_name,
> +	$true_if_byte_swap_needed,
> +	$parameter_number_for_iv,
> +	$parameter_number_for_encrypt_flag,
> +	$first_parameter_to_pass,
> +	$second_parameter_to_pass,
> +	$third_parameter_to_pass);
> +
> +So for example, given
> +void BF_encrypt(BF_LONG *data,BF_KEY *key);
> +void BF_decrypt(BF_LONG *data,BF_KEY *key);
> +void BF_cbc_encrypt(unsigned char *in, unsigned char *out, long length,
> +        BF_KEY *ks, unsigned char *iv, int enc);
> +
> +&cbc("BF_cbc_encrypt","BF_encrypt","BF_encrypt",1,4,5,3,-1,-1);
> +
> +&cbc("des_ncbc_encrypt","des_encrypt","des_encrypt",0,4,5,3,5,-1);
> +&cbc("des_ede3_cbc_encrypt","des_encrypt3","des_decrypt3",0,6,7,3,4,5);
> +
> diff -Naur linux/cryptolib/libdes/asm/perlasm/x86asm.pl linux-crypto/cryptolib/libdes/asm/perlasm/x86asm.pl
> --- linux/cryptolib/libdes/asm/perlasm/x86asm.pl	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/cryptolib/libdes/asm/perlasm/x86asm.pl	Tue Aug 27 11:20:55 2002
> @@ -0,0 +1,111 @@
> +#!/usr/local/bin/perl
> +
> +# require 'x86asm.pl';
> +# &asm_init("cpp","des-586.pl");
> +# XXX
> +# XXX
> +# main'asm_finish
> +
> +sub main'asm_finish
> +	{
> +	&file_end();
> +	&asm_finish_cpp() if $cpp;
> +	print &asm_get_output();
> +	}
> +
> +sub main'asm_init
> +	{
> +	($type,$fn)=@_;
> +	$filename=$fn;
> +
> +	$cpp=$sol=$aout=$win32=0;
> +	if (	($type eq "elf"))
> +		{ require "x86unix.pl"; }
> +	elsif (	($type eq "a.out"))
> +		{ $aout=1; require "x86unix.pl"; }
> +	elsif (	($type eq "sol"))
> +		{ $sol=1; require "x86unix.pl"; }
> +	elsif (	($type eq "cpp"))
> +		{ $cpp=1; require "x86unix.pl"; }
> +	elsif (	($type eq "win32"))
> +		{ $win32=1; require "x86ms.pl"; }
> +	else
> +		{
> +		print STDERR <<"EOF";
> +Pick one target type from
> +	elf	- linux, FreeBSD etc
> +	a.out	- old linux
> +	sol	- x86 solaris
> +	cpp	- format so x86unix.cpp can be used
> +	win32	- Windows 95/Windows NT
> +EOF
> +		exit(1);
> +		}
> +
> +	&asm_init_output();
> +
> +&comment("Don't even think of reading this code");
> +&comment("It was automatically generated by $filename");
> +&comment("Which is a perl program used to generate the x86 assember for");
> +&comment("any of elf, a.out, BSDI,Win32, or Solaris");
> +&comment("eric <eay\@cryptsoft.com>");
> +&comment("");
> +
> +	$filename =~ s/\.pl$//;
> +	&file($filename);
> +	}
> +
> +sub asm_finish_cpp
> +	{
> +	return unless $cpp;
> +
> +	local($tmp,$i);
> +	foreach $i (&get_labels())
> +		{
> +		$tmp.="#define $i _$i\n";
> +		}
> +	print <<"EOF";
> +/* Run the C pre-processor over this file with one of the following defined
> + * ELF - elf object files,
> + * OUT - a.out object files,
> + * BSDI - BSDI style a.out object files
> + * SOL - Solaris style elf
> + */
> +
> +#define TYPE(a,b)       .type   a,b
> +#define SIZE(a,b)       .size   a,b
> +
> +#if defined(OUT) || defined(BSDI)
> +$tmp
> +#endif
> +
> +#ifdef OUT
> +#define OK	1
> +#define ALIGN	4
> +#endif
> +
> +#ifdef BSDI
> +#define OK              1
> +#define ALIGN           4
> +#undef SIZE
> +#undef TYPE
> +#endif
> +
> +#if defined(ELF) || defined(SOL)
> +#define OK              1
> +#define ALIGN           16
> +#endif
> +
> +#ifndef OK
> +You need to define one of
> +ELF - elf systems - linux-elf, NetBSD and DG-UX
> +OUT - a.out systems - linux-a.out and FreeBSD
> +SOL - solaris systems, which are elf with strange comment lines
> +BSDI - a.out with a very primative version of as.
> +#endif
> +
> +/* Let the Assembler begin :-) */
> +EOF
> +	}
> +
> +1;
> diff -Naur linux/cryptolib/libdes/asm/perlasm/x86ms.pl linux-crypto/cryptolib/libdes/asm/perlasm/x86ms.pl
> --- linux/cryptolib/libdes/asm/perlasm/x86ms.pl	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/cryptolib/libdes/asm/perlasm/x86ms.pl	Tue Aug 27 11:20:55 2002
> @@ -0,0 +1,345 @@
> +#!/usr/local/bin/perl
> +
> +package x86ms;
> +
> +$label="L000";
> +
> +%lb=(	'eax',	'al',
> +	'ebx',	'bl',
> +	'ecx',	'cl',
> +	'edx',	'dl',
> +	'ax',	'al',
> +	'bx',	'bl',
> +	'cx',	'cl',
> +	'dx',	'dl',
> +	);
> +
> +%hb=(	'eax',	'ah',
> +	'ebx',	'bh',
> +	'ecx',	'ch',
> +	'edx',	'dh',
> +	'ax',	'ah',
> +	'bx',	'bh',
> +	'cx',	'ch',
> +	'dx',	'dh',
> +	);
> +
> +sub main'asm_init_output { @out=(); }
> +sub main'asm_get_output { return(@out); }
> +sub main'get_labels { return(@labels); }
> +sub main'external_label { push(@labels,@_); }
> +
> +sub main'LB
> +	{
> +	(defined($lb{$_[0]})) || die "$_[0] does not have a 'low byte'\n";
> +	return($lb{$_[0]});
> +	}
> +
> +sub main'HB
> +	{
> +	(defined($hb{$_[0]})) || die "$_[0] does not have a 'high byte'\n";
> +	return($hb{$_[0]});
> +	}
> +
> +sub main'BP
> +	{
> +	&get_mem("BYTE",@_);
> +	}
> +
> +sub main'DWP
> +	{
> +	&get_mem("DWORD",@_);
> +	}
> +
> +sub main'stack_push
> +	{
> +	local($num)=@_;
> +	$stack+=$num*4;
> +	&main'sub("esp",$num*4);
> +	}
> +
> +sub main'stack_pop
> +	{
> +	local($num)=@_;
> +	$stack-=$num*4;
> +	&main'add("esp",$num*4);
> +	}
> +
> +sub get_mem
> +	{
> +	local($size,$addr,$reg1,$reg2,$idx)=@_;
> +	local($t,$post);
> +	local($ret)="$size PTR ";
> +
> +	$addr =~ s/^\s+//;
> +	if ($addr =~ /^(.+)\+(.+)$/)
> +		{
> +		$reg2=&conv($1);
> +		$addr="_$2";
> +		}
> +	elsif ($addr =~ /^[_a-zA-Z]/)
> +		{
> +		$addr="_$addr";
> +		}
> +
> +	$reg1="$regs{$reg1}" if defined($regs{$reg1});
> +	$reg2="$regs{$reg2}" if defined($regs{$reg2});
> +	if (($addr ne "") && ($addr ne 0))
> +		{
> +		if ($addr !~ /^-/)
> +			{ $ret.=$addr; }
> +		else	{ $post=$addr; }
> +		}
> +	if ($reg2 ne "")
> +		{
> +		$t="";
> +		$t="*$idx" if ($idx != 0);
> +		$reg1="+".$reg1 if ("$reg1$post" ne "");
> +		$ret.="[$reg2$t$reg1$post]";
> +		}
> +	else
> +		{
> +		$ret.="[$reg1$post]"
> +		}
> +	return($ret);
> +	}
> +
> +sub main'mov	{ &out2("mov",@_); }
> +sub main'movb	{ &out2("mov",@_); }
> +sub main'and	{ &out2("and",@_); }
> +sub main'or	{ &out2("or",@_); }
> +sub main'shl	{ &out2("shl",@_); }
> +sub main'shr	{ &out2("shr",@_); }
> +sub main'xor	{ &out2("xor",@_); }
> +sub main'xorb	{ &out2("xor",@_); }
> +sub main'add	{ &out2("add",@_); }
> +sub main'adc	{ &out2("adc",@_); }
> +sub main'sub	{ &out2("sub",@_); }
> +sub main'rotl	{ &out2("rol",@_); }
> +sub main'rotr	{ &out2("ror",@_); }
> +sub main'exch	{ &out2("xchg",@_); }
> +sub main'cmp	{ &out2("cmp",@_); }
> +sub main'lea	{ &out2("lea",@_); }
> +sub main'mul	{ &out1("mul",@_); }
> +sub main'div	{ &out1("div",@_); }
> +sub main'dec	{ &out1("dec",@_); }
> +sub main'inc	{ &out1("inc",@_); }
> +sub main'jmp	{ &out1("jmp",@_); }
> +sub main'jmp_ptr { &out1p("jmp",@_); }
> +sub main'je	{ &out1("je",@_); }
> +sub main'jle	{ &out1("jle",@_); }
> +sub main'jz	{ &out1("jz",@_); }
> +sub main'jge	{ &out1("jge",@_); }
> +sub main'jl	{ &out1("jl",@_); }
> +sub main'jb	{ &out1("jb",@_); }
> +sub main'jnz	{ &out1("jnz",@_); }
> +sub main'jne	{ &out1("jne",@_); }
> +sub main'push	{ &out1("push",@_); $stack+=4; }
> +sub main'pop	{ &out1("pop",@_); $stack-=4; }
> +sub main'bswap	{ &out1("bswap",@_); &using486(); }
> +sub main'not	{ &out1("not",@_); }
> +sub main'call	{ &out1("call",'_'.$_[0]); }
> +sub main'ret	{ &out0("ret"); }
> +sub main'nop	{ &out0("nop"); }
> +
> +sub out2
> +	{
> +	local($name,$p1,$p2)=@_;
> +	local($l,$t);
> +
> +	push(@out,"\t$name\t");
> +	$t=&conv($p1).",";
> +	$l=length($t);
> +	push(@out,$t);
> +	$l=4-($l+9)/8;
> +	push(@out,"\t" x $l);
> +	push(@out,&conv($p2));
> +	push(@out,"\n");
> +	}
> +
> +sub out0
> +	{
> +	local($name)=@_;
> +
> +	push(@out,"\t$name\n");
> +	}
> +
> +sub out1
> +	{
> +	local($name,$p1)=@_;
> +	local($l,$t);
> +
> +	push(@out,"\t$name\t".&conv($p1)."\n");
> +	}
> +
> +sub conv
> +	{
> +	local($p)=@_;
> +
> +	$p =~ s/0x([0-9A-Fa-f]+)/0$1h/;
> +	return $p;
> +	}
> +
> +sub using486
> +	{
> +	return if $using486;
> +	$using486++;
> +	grep(s/\.386/\.486/,@out);
> +	}
> +
> +sub main'file
> +	{
> +	local($file)=@_;
> +
> +	local($tmp)=<<"EOF";
> +	TITLE	$file.asm
> +        .386
> +.model FLAT
> +EOF
> +	push(@out,$tmp);
> +	}
> +
> +sub main'function_begin
> +	{
> +	local($func,$extra)=@_;
> +
> +	push(@labels,$func);
> +
> +	local($tmp)=<<"EOF";
> +_TEXT	SEGMENT
> +PUBLIC	_$func
> +$extra
> +_$func PROC NEAR
> +	push	ebp
> +	push	ebx
> +	push	esi
> +	push	edi
> +EOF
> +	push(@out,$tmp);
> +	$stack=20;
> +	}
> +
> +sub main'function_begin_B
> +	{
> +	local($func,$extra)=@_;
> +
> +	local($tmp)=<<"EOF";
> +_TEXT	SEGMENT
> +PUBLIC	_$func
> +$extra
> +_$func PROC NEAR
> +EOF
> +	push(@out,$tmp);
> +	$stack=4;
> +	}
> +
> +sub main'function_end
> +	{
> +	local($func)=@_;
> +
> +	local($tmp)=<<"EOF";
> +	pop	edi
> +	pop	esi
> +	pop	ebx
> +	pop	ebp
> +	ret
> +_$func ENDP
> +_TEXT	ENDS
> +EOF
> +	push(@out,$tmp);
> +	$stack=0;
> +	%label=();
> +	}
> +
> +sub main'function_end_B
> +	{
> +	local($func)=@_;
> +
> +	local($tmp)=<<"EOF";
> +_$func ENDP
> +_TEXT	ENDS
> +EOF
> +	push(@out,$tmp);
> +	$stack=0;
> +	%label=();
> +	}
> +
> +sub main'function_end_A
> +	{
> +	local($func)=@_;
> +
> +	local($tmp)=<<"EOF";
> +	pop	edi
> +	pop	esi
> +	pop	ebx
> +	pop	ebp
> +	ret
> +EOF
> +	push(@out,$tmp);
> +	}
> +
> +sub main'file_end
> +	{
> +	push(@out,"END\n");
> +	}
> +
> +sub main'wparam
> +	{
> +	local($num)=@_;
> +
> +	return(&main'DWP($stack+$num*4,"esp","",0));
> +	}
> +
> +sub main'swtmp
> +	{
> +	return(&main'DWP($_[0]*4,"esp","",0));
> +	}
> +
> +# Should use swtmp, which is above esp.  Linix can trash the stack above esp
> +#sub main'wtmp
> +#	{
> +#	local($num)=@_;
> +#
> +#	return(&main'DWP(-(($num+1)*4),"esp","",0));
> +#	}
> +
> +sub main'comment
> +	{
> +	foreach (@_)
> +		{
> +		push(@out,"\t; $_\n");
> +		}
> +	}
> +
> +sub main'label
> +	{
> +	if (!defined($label{$_[0]}))
> +		{
> +		$label{$_[0]}="\$${label}${_[0]}";
> +		$label++;
> +		}
> +	return($label{$_[0]});
> +	}
> +
> +sub main'set_label
> +	{
> +	if (!defined($label{$_[0]}))
> +		{
> +		$label{$_[0]}="${label}${_[0]}";
> +		$label++;
> +		}
> +	push(@out,"$label{$_[0]}:\n");
> +	}
> +
> +sub main'data_word
> +	{
> +	push(@out,"\tDD\t$_[0]\n");
> +	}
> +
> +sub out1p
> +	{
> +	local($name,$p1)=@_;
> +	local($l,$t);
> +
> +	push(@out,"\t$name\t ".&conv($p1)."\n");
> +	}
> diff -Naur linux/cryptolib/libdes/asm/perlasm/x86unix.pl linux-crypto/cryptolib/libdes/asm/perlasm/x86unix.pl
> --- linux/cryptolib/libdes/asm/perlasm/x86unix.pl	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/cryptolib/libdes/asm/perlasm/x86unix.pl	Tue Aug 27 11:20:55 2002
> @@ -0,0 +1,403 @@
> +#!/usr/local/bin/perl
> +
> +package x86unix;
> +
> +$label="L000";
> +
> +$align=($main'aout)?"4":"16";
> +$under=($main'aout)?"_":"";
> +$com_start=($main'sol)?"/":"#";
> +
> +sub main'asm_init_output { @out=(); }
> +sub main'asm_get_output { return(@out); }
> +sub main'get_labels { return(@labels); }
> +sub main'external_label { push(@labels,@_); }
> +
> +if ($main'cpp)
> +	{
> +	$align="ALIGN";
> +	$under="";
> +	$com_start='/*';
> +	$com_end='*/';
> +	}
> +
> +%lb=(	'eax',	'%al',
> +	'ebx',	'%bl',
> +	'ecx',	'%cl',
> +	'edx',	'%dl',
> +	'ax',	'%al',
> +	'bx',	'%bl',
> +	'cx',	'%cl',
> +	'dx',	'%dl',
> +	);
> +
> +%hb=(	'eax',	'%ah',
> +	'ebx',	'%bh',
> +	'ecx',	'%ch',
> +	'edx',	'%dh',
> +	'ax',	'%ah',
> +	'bx',	'%bh',
> +	'cx',	'%ch',
> +	'dx',	'%dh',
> +	);
> +
> +%regs=(	'eax',	'%eax',
> +	'ebx',	'%ebx',
> +	'ecx',	'%ecx',
> +	'edx',	'%edx',
> +	'esi',	'%esi',
> +	'edi',	'%edi',
> +	'ebp',	'%ebp',
> +	'esp',	'%esp',
> +	);
> +
> +%reg_val=(
> +	'eax',	0x00,
> +	'ebx',	0x03,
> +	'ecx',	0x01,
> +	'edx',	0x02,
> +	'esi',	0x06,
> +	'edi',	0x07,
> +	'ebp',	0x05,
> +	'esp',	0x04,
> +	);
> +
> +sub main'LB
> +	{
> +	(defined($lb{$_[0]})) || die "$_[0] does not have a 'low byte'\n";
> +	return($lb{$_[0]});
> +	}
> +
> +sub main'HB
> +	{
> +	(defined($hb{$_[0]})) || die "$_[0] does not have a 'high byte'\n";
> +	return($hb{$_[0]});
> +	}
> +
> +sub main'DWP
> +	{
> +	local($addr,$reg1,$reg2,$idx)=@_;
> +
> +	$ret="";
> +	$addr =~ s/(^|[+ \t])([A-Za-z_]+)($|[+ \t])/$1$under$2$3/;
> +	$reg1="$regs{$reg1}" if defined($regs{$reg1});
> +	$reg2="$regs{$reg2}" if defined($regs{$reg2});
> +	$ret.=$addr if ($addr ne "") && ($addr ne 0);
> +	if ($reg2 ne "")
> +		{ $ret.="($reg1,$reg2,$idx)"; }
> +	else
> +		{ $ret.="($reg1)" }
> +	return($ret);
> +	}
> +
> +sub main'BP
> +	{
> +	return(&main'DWP(@_));
> +	}
> +
> +#sub main'BP
> +#	{
> +#	local($addr,$reg1,$reg2,$idx)=@_;
> +#
> +#	$ret="";
> +#
> +#	$addr =~ s/(^|[+ \t])([A-Za-z_]+)($|[+ \t])/$1$under$2$3/;
> +#	$reg1="$regs{$reg1}" if defined($regs{$reg1});
> +#	$reg2="$regs{$reg2}" if defined($regs{$reg2});
> +#	$ret.=$addr if ($addr ne "") && ($addr ne 0);
> +#	if ($reg2 ne "")
> +#		{ $ret.="($reg1,$reg2,$idx)"; }
> +#	else
> +#		{ $ret.="($reg1)" }
> +#	return($ret);
> +#	}
> +
> +sub main'mov	{ &out2("movl",@_); }
> +sub main'movb	{ &out2("movb",@_); }
> +sub main'and	{ &out2("andl",@_); }
> +sub main'or	{ &out2("orl",@_); }
> +sub main'shl	{ &out2("sall",@_); }
> +sub main'shr	{ &out2("shrl",@_); }
> +sub main'xor	{ &out2("xorl",@_); }
> +sub main'xorb	{ &out2("xorb",@_); }
> +sub main'add	{ &out2("addl",@_); }
> +sub main'adc	{ &out2("adcl",@_); }
> +sub main'sub	{ &out2("subl",@_); }
> +sub main'rotl	{ &out2("roll",@_); }
> +sub main'rotr	{ &out2("rorl",@_); }
> +sub main'exch	{ &out2("xchg",@_); }
> +sub main'cmp	{ &out2("cmpl",@_); }
> +sub main'lea	{ &out2("leal",@_); }
> +sub main'mul	{ &out1("mull",@_); }
> +sub main'div	{ &out1("divl",@_); }
> +sub main'jmp	{ &out1("jmp",@_); }
> +sub main'jmp_ptr { &out1p("jmp",@_); }
> +sub main'je	{ &out1("je",@_); }
> +sub main'jle	{ &out1("jle",@_); }
> +sub main'jne	{ &out1("jne",@_); }
> +sub main'jnz	{ &out1("jnz",@_); }
> +sub main'jz	{ &out1("jz",@_); }
> +sub main'jge	{ &out1("jge",@_); }
> +sub main'jl	{ &out1("jl",@_); }
> +sub main'jb	{ &out1("jb",@_); }
> +sub main'dec	{ &out1("decl",@_); }
> +sub main'inc	{ &out1("incl",@_); }
> +sub main'push	{ &out1("pushl",@_); $stack+=4; }
> +sub main'pop	{ &out1("popl",@_); $stack-=4; }
> +sub main'bswap	{ &out1("bswapl",@_); }
> +sub main'not	{ &out1("notl",@_); }
> +sub main'call	{ &out1("call",$under.$_[0]); }
> +sub main'ret	{ &out0("ret"); }
> +sub main'nop	{ &out0("nop"); }
> +
> +sub out2
> +	{
> +	local($name,$p1,$p2)=@_;
> +	local($l,$ll,$t);
> +	local(%special)=(	"roll",0xD1C0,"rorl",0xD1C8,
> +				"rcll",0xD1D0,"rcrl",0xD1D8,
> +				"shll",0xD1E0,"shrl",0xD1E8,
> +				"sarl",0xD1F8);
> +	
> +	if ((defined($special{$name})) && defined($regs{$p1}) && ($p2 == 1))
> +		{
> +		$op=$special{$name}|$reg_val{$p1};
> +		$tmp1=sprintf ".byte %d\n",($op>>8)&0xff;
> +		$tmp2=sprintf ".byte %d\t",$op     &0xff;
> +		push(@out,$tmp1);
> +		push(@out,$tmp2);
> +
> +		$p2=&conv($p2);
> +		$p1=&conv($p1);
> +		&main'comment("$name $p2 $p1");
> +		return;
> +		}
> +
> +	push(@out,"\t$name\t");
> +	$t=&conv($p2).",";
> +	$l=length($t);
> +	push(@out,$t);
> +	$ll=4-($l+9)/8;
> +	$tmp1=sprintf "\t" x $ll;
> +	push(@out,$tmp1);
> +	push(@out,&conv($p1)."\n");
> +	}
> +
> +sub out1
> +	{
> +	local($name,$p1)=@_;
> +	local($l,$t);
> +
> +	push(@out,"\t$name\t".&conv($p1)."\n");
> +	}
> +
> +sub out1p
> +	{
> +	local($name,$p1)=@_;
> +	local($l,$t);
> +
> +	push(@out,"\t$name\t*".&conv($p1)."\n");
> +	}
> +
> +sub out0
> +	{
> +	push(@out,"\t$_[0]\n");
> +	}
> +
> +sub conv
> +	{
> +	local($p)=@_;
> +
> +#	$p =~ s/0x([0-9A-Fa-f]+)/0$1h/;
> +
> +	$p=$regs{$p} if (defined($regs{$p}));
> +
> +	$p =~ s/^(-{0,1}[0-9A-Fa-f]+)$/\$$1/;
> +	$p =~ s/^(0x[0-9A-Fa-f]+)$/\$$1/;
> +	return $p;
> +	}
> +
> +sub main'file
> +	{
> +	local($file)=@_;
> +
> +	local($tmp)=<<"EOF";
> +	.file	"$file.s"
> +	.version	"01.01"
> +gcc2_compiled.:
> +EOF
> +	push(@out,$tmp);
> +	}
> +
> +sub main'function_begin
> +	{
> +	local($func)=@_;
> +
> +	$func=$under.$func;
> +
> +	local($tmp)=<<"EOF";
> +.text
> +	.align $align
> +.globl $func
> +EOF
> +	push(@out,$tmp);
> +	if ($main'cpp)
> +		{ $tmp=push(@out,"\tTYPE($func,\@function)\n"); }
> +	else	{ $tmp=push(@out,"\t.type\t$func,\@function\n"); }
> +	push(@out,"$func:\n");
> +	$tmp=<<"EOF";
> +	pushl	%ebp
> +	pushl	%ebx
> +	pushl	%esi
> +	pushl	%edi
> +
> +EOF
> +	push(@out,$tmp);
> +	$stack=20;
> +	}
> +
> +sub main'function_begin_B
> +	{
> +	local($func,$extra)=@_;
> +
> +	$func=$under.$func;
> +
> +	local($tmp)=<<"EOF";
> +.text
> +	.align $align
> +.globl $func
> +EOF
> +	push(@out,$tmp);
> +	if ($main'cpp)
> +		{ push(@out,"\tTYPE($func,\@function)\n"); }
> +	else	{ push(@out,"\t.type	$func,\@function\n"); }
> +	push(@out,"$func:\n");
> +	$stack=4;
> +	}
> +
> +sub main'function_end
> +	{
> +	local($func)=@_;
> +
> +	$func=$under.$func;
> +
> +	local($tmp)=<<"EOF";
> +	popl	%edi
> +	popl	%esi
> +	popl	%ebx
> +	popl	%ebp
> +	ret
> +.${func}_end:
> +EOF
> +	push(@out,$tmp);
> +	if ($main'cpp)
> +		{ push(@out,"\tSIZE($func,.${func}_end-$func)\n"); }
> +	else	{ push(@out,"\t.size\t$func,.${func}_end-$func\n"); }
> +	push(@out,".ident	\"$func\"\n");
> +	$stack=0;
> +	%label=();
> +	}
> +
> +sub main'function_end_A
> +	{
> +	local($func)=@_;
> +
> +	local($tmp)=<<"EOF";
> +	popl	%edi
> +	popl	%esi
> +	popl	%ebx
> +	popl	%ebp
> +	ret
> +EOF
> +	push(@out,$tmp);
> +	}
> +
> +sub main'function_end_B
> +	{
> +	local($func)=@_;
> +
> +	$func=$under.$func;
> +
> +	push(@out,".${func}_end:\n");
> +	if ($main'cpp)
> +		{ push(@out,"\tSIZE($func,.${func}_end-$func)\n"); }
> +	else	{ push(@out,"\t.size\t$func,.${func}_end-$func\n"); }
> +	push(@out,".ident	\"desasm.pl\"\n");
> +	$stack=0;
> +	%label=();
> +	}
> +
> +sub main'wparam
> +	{
> +	local($num)=@_;
> +
> +	return(&main'DWP($stack+$num*4,"esp","",0));
> +	}
> +
> +sub main'stack_push
> +	{
> +	local($num)=@_;
> +	$stack+=$num*4;
> +	&main'sub("esp",$num*4);
> +	}
> +
> +sub main'stack_pop
> +	{
> +	local($num)=@_;
> +	$stack-=$num*4;
> +	&main'add("esp",$num*4);
> +	}
> +
> +sub main'swtmp
> +	{
> +	return(&main'DWP($_[0]*4,"esp","",0));
> +	}
> +
> +# Should use swtmp, which is above esp.  Linix can trash the stack above esp
> +#sub main'wtmp
> +#	{
> +#	local($num)=@_;
> +#
> +#	return(&main'DWP(-($num+1)*4,"esp","",0));
> +#	}
> +
> +sub main'comment
> +	{
> +	foreach (@_)
> +		{
> +		if (/^\s*$/)
> +			{ push(@out,"\n"); }
> +		else
> +			{ push(@out,"\t$com_start $_ $com_end\n"); }
> +		}
> +	}
> +
> +sub main'label
> +	{
> +	if (!defined($label{$_[0]}))
> +		{
> +		$label{$_[0]}=".${label}${_[0]}";
> +		$label++;
> +		}
> +	return($label{$_[0]});
> +	}
> +
> +sub main'set_label
> +	{
> +	if (!defined($label{$_[0]}))
> +		{
> +		$label{$_[0]}=".${label}${_[0]}";
> +		$label++;
> +		}
> +	push(@out,".align $align\n") if ($_[1] != 0);
> +	push(@out,"$label{$_[0]}:\n");
> +	}
> +
> +sub main'file_end
> +	{
> +	}
> +
> +sub main'data_word
> +	{
> +	push(@out,"\t.long $_[0]\n");
> +	}
> diff -Naur linux/cryptolib/libdes/asm/readme linux-crypto/cryptolib/libdes/asm/readme
> --- linux/cryptolib/libdes/asm/readme	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/cryptolib/libdes/asm/readme	Tue Aug 27 11:20:55 2002
> @@ -0,0 +1,131 @@
> +First up, let me say I don't like writing in assembler.  It is not portable,
> +dependant on the particular CPU architecture release and is generally a pig
> +to debug and get right.  Having said that, the x86 architecture is probably
> +the most important for speed due to number of boxes and since
> +it appears to be the worst architecture to to get
> +good C compilers for.  So due to this, I have lowered myself to do
> +assembler for the inner DES routines in libdes :-).
> +
> +The file to implement in assembler is des_enc.c.  Replace the following
> +4 functions
> +des_encrypt(DES_LONG data[2],des_key_schedule ks, int encrypt);
> +des_encrypt2(DES_LONG data[2],des_key_schedule ks, int encrypt);
> +des_encrypt3(DES_LONG data[2],des_key_schedule ks1,ks2,ks3);
> +des_decrypt3(DES_LONG data[2],des_key_schedule ks1,ks2,ks3);
> +
> +They encrypt/decrypt the 64 bits held in 'data' using
> +the 'ks' key schedules.   The only difference between the 4 functions is that
> +des_encrypt2() does not perform IP() or FP() on the data (this is an
> +optimization for when doing triple DES and des_encrypt3() and des_decrypt3()
> +perform triple des.  The triple DES routines are in here because it does
> +make a big difference to have them located near the des_encrypt2 function
> +at link time..
> +
> +Now as we all know, there are lots of different operating systems running on
> +x86 boxes, and unfortunately they normally try to make sure their assembler
> +formating is not the same as the other peoples.
> +The 4 main formats I know of are
> +Microsoft	Windows 95/Windows NT
> +Elf		Includes Linux and FreeBSD(?).
> +a.out		The older Linux.
> +Solaris		Same as Elf but different comments :-(.
> +
> +Now I was not overly keen to write 4 different copies of the same code,
> +so I wrote a few perl routines to output the correct assembler, given
> +a target assembler type.  This code is ugly and is just a hack.
> +The libraries are x86unix.pl and x86ms.pl.
> +des586.pl, des686.pl and des-som[23].pl are the programs to actually
> +generate the assembler.
> +
> +So to generate elf assembler
> +perl des-som3.pl elf >dx86-elf.s
> +For Windows 95/NT
> +perl des-som2.pl win32 >win32.asm
> +
> +[ update 4 Jan 1996 ]
> +I have added another way to do things.
> +perl des-som3.pl cpp >dx86-cpp.s
> +generates a file that will be included by dx86unix.cpp when it is compiled.
> +To build for elf, a.out, solaris, bsdi etc,
> +cc -E -DELF asm/dx86unix.cpp | as -o asm/dx86-elf.o
> +cc -E -DSOL asm/dx86unix.cpp | as -o asm/dx86-sol.o
> +cc -E -DOUT asm/dx86unix.cpp | as -o asm/dx86-out.o
> +cc -E -DBSDI asm/dx86unix.cpp | as -o asm/dx86bsdi.o
> +This was done to cut down the number of files in the distribution.
> +
> +Now the ugly part.  I acquired my copy of Intels
> +"Optimization's For Intel's 32-Bit Processors" and found a few interesting
> +things.  First, the aim of the exersize is to 'extract' one byte at a time
> +from a word and do an array lookup.  This involves getting the byte from
> +the 4 locations in the word and moving it to a new word and doing the lookup.
> +The most obvious way to do this is
> +xor	eax,	eax				# clear word
> +movb	al,	cl				# get low byte
> +xor	edi	DWORD PTR 0x100+des_SP[eax] 	# xor in word
> +movb	al,	ch				# get next byte
> +xor	edi	DWORD PTR 0x300+des_SP[eax] 	# xor in word
> +shr	ecx	16
> +which seems ok.  For the pentium, this system appears to be the best.
> +One has to do instruction interleaving to keep both functional units
> +operating, but it is basically very efficient.
> +
> +Now the crunch.  When a full register is used after a partial write, eg.
> +mov	al,	cl
> +xor	edi,	DWORD PTR 0x100+des_SP[eax]
> +386	- 1 cycle stall
> +486	- 1 cycle stall
> +586	- 0 cycle stall
> +686	- at least 7 cycle stall (page 22 of the above mentioned document).
> +
> +So the technique that produces the best results on a pentium, according to
> +the documentation, will produce hideous results on a pentium pro.
> +
> +To get around this, des686.pl will generate code that is not as fast on
> +a pentium, should be very good on a pentium pro.
> +mov	eax,	ecx				# copy word 
> +shr	ecx,	8				# line up next byte
> +and	eax,	0fch				# mask byte
> +xor	edi	DWORD PTR 0x100+des_SP[eax] 	# xor in array lookup
> +mov	eax,	ecx				# get word
> +shr	ecx	8				# line up next byte
> +and	eax,	0fch				# mask byte
> +xor	edi	DWORD PTR 0x300+des_SP[eax] 	# xor in array lookup
> +
> +Due to the execution units in the pentium, this actually works quite well.
> +For a pentium pro it should be very good.  This is the type of output
> +Visual C++ generates.
> +
> +There is a third option.  instead of using
> +mov	al,	ch
> +which is bad on the pentium pro, one may be able to use
> +movzx	eax,	ch
> +which may not incur the partial write penalty.  On the pentium,
> +this instruction takes 4 cycles so is not worth using but on the
> +pentium pro it appears it may be worth while.  I need access to one to
> +experiment :-).
> +
> +eric (20 Oct 1996)
> +
> +22 Nov 1996 - I have asked people to run the 2 different version on pentium
> +pros and it appears that the intel documentation is wrong.  The
> +mov al,bh is still faster on a pentium pro, so just use the des586.pl
> +install des686.pl
> +
> +3 Dec 1996 - I added des_encrypt3/des_decrypt3 because I have moved these
> +functions into des_enc.c because it does make a massive performance
> +difference on some boxes to have the functions code located close to
> +the des_encrypt2() function.
> +
> +9 Jan 1997 - des-som2.pl is now the correct perl script to use for
> +pentiums.  It contains an inner loop from
> +Svend Olaf Mikkelsen <[email protected]> which does raw ecb DES calls at
> +273,000 per second.  He had a previous version at 250,000 and the best
> +I was able to get was 203,000.  The content has not changed, this is all
> +due to instruction sequencing (and actual instructions choice) which is able
> +to keep both functional units of the pentium going.
> +We may have lost the ugly register usage restrictions when x86 went 32 bit
> +but for the pentium it has been replaced by evil instruction ordering tricks.
> +
> +13 Jan 1997 - des-som3.pl, more optimizations from Svend Olaf.
> +raw DES at 281,000 per second on a pentium 100.
> +
> diff -Naur linux/cryptolib/libdes/asm/y-win32.asm linux-crypto/cryptolib/libdes/asm/y-win32.asm
> --- linux/cryptolib/libdes/asm/y-win32.asm	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/cryptolib/libdes/asm/y-win32.asm	Tue Aug 27 11:20:55 2002
> @@ -0,0 +1,929 @@
> +	; Don't even think of reading this code
> +	; It was automatically generated by crypt586.pl
> +	; Which is a perl program used to generate the x86 assember for
> +	; any of elf, a.out, BSDI,Win32, or Solaris
> +	; eric <[email protected]>
> +	; 
> +	TITLE	crypt586.asm
> +        .386
> +.model FLAT
> +_TEXT	SEGMENT
> +PUBLIC	_fcrypt_body
> +EXTRN   _des_SPtrans:DWORD
> +_fcrypt_body PROC NEAR
> +	push	ebp
> +	push	ebx
> +	push	esi
> +	push	edi
> +	; 
> +	; Load the 2 words
> +	xor	edi,		edi
> +	xor	esi,		esi
> +	mov	ebp,		DWORD PTR 24[esp]
> +	push	25
> +L000start:
> +	; 
> +	; Round 0
> +	mov	eax,		DWORD PTR 32[esp]
> +	mov	edx,		esi
> +	shr	edx,		16
> +	mov	ecx,		DWORD PTR 36[esp]
> +	xor	edx,		esi
> +	and	eax,		edx
> +	and	edx,		ecx
> +	mov	ebx,		eax
> +	shl	ebx,		16
> +	mov	ecx,		edx
> +	shl	ecx,		16
> +	xor	eax,		ebx
> +	xor	edx,		ecx
> +	mov	ebx,		DWORD PTR [ebp]
> +	xor	eax,		ebx
> +	mov	ecx,		DWORD PTR 4[ebp]
> +	xor	eax,		esi
> +	xor	edx,		esi
> +	xor	edx,		ecx
> +	and	eax,		0fcfcfcfch
> +	xor	ebx,		ebx
> +	and	edx,		0cfcfcfcfh
> +	xor	ecx,		ecx
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	edi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	edi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR 28[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	edi,		ebx
> +	; 
> +	; Round 1
> +	mov	eax,		DWORD PTR 32[esp]
> +	mov	edx,		edi
> +	shr	edx,		16
> +	mov	ecx,		DWORD PTR 36[esp]
> +	xor	edx,		edi
> +	and	eax,		edx
> +	and	edx,		ecx
> +	mov	ebx,		eax
> +	shl	ebx,		16
> +	mov	ecx,		edx
> +	shl	ecx,		16
> +	xor	eax,		ebx
> +	xor	edx,		ecx
> +	mov	ebx,		DWORD PTR 8[ebp]
> +	xor	eax,		ebx
> +	mov	ecx,		DWORD PTR 12[ebp]
> +	xor	eax,		edi
> +	xor	edx,		edi
> +	xor	edx,		ecx
> +	and	eax,		0fcfcfcfch
> +	xor	ebx,		ebx
> +	and	edx,		0cfcfcfcfh
> +	xor	ecx,		ecx
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	esi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	esi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR 28[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	esi,		ebx
> +	; 
> +	; Round 2
> +	mov	eax,		DWORD PTR 32[esp]
> +	mov	edx,		esi
> +	shr	edx,		16
> +	mov	ecx,		DWORD PTR 36[esp]
> +	xor	edx,		esi
> +	and	eax,		edx
> +	and	edx,		ecx
> +	mov	ebx,		eax
> +	shl	ebx,		16
> +	mov	ecx,		edx
> +	shl	ecx,		16
> +	xor	eax,		ebx
> +	xor	edx,		ecx
> +	mov	ebx,		DWORD PTR 16[ebp]
> +	xor	eax,		ebx
> +	mov	ecx,		DWORD PTR 20[ebp]
> +	xor	eax,		esi
> +	xor	edx,		esi
> +	xor	edx,		ecx
> +	and	eax,		0fcfcfcfch
> +	xor	ebx,		ebx
> +	and	edx,		0cfcfcfcfh
> +	xor	ecx,		ecx
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	edi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	edi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR 28[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	edi,		ebx
> +	; 
> +	; Round 3
> +	mov	eax,		DWORD PTR 32[esp]
> +	mov	edx,		edi
> +	shr	edx,		16
> +	mov	ecx,		DWORD PTR 36[esp]
> +	xor	edx,		edi
> +	and	eax,		edx
> +	and	edx,		ecx
> +	mov	ebx,		eax
> +	shl	ebx,		16
> +	mov	ecx,		edx
> +	shl	ecx,		16
> +	xor	eax,		ebx
> +	xor	edx,		ecx
> +	mov	ebx,		DWORD PTR 24[ebp]
> +	xor	eax,		ebx
> +	mov	ecx,		DWORD PTR 28[ebp]
> +	xor	eax,		edi
> +	xor	edx,		edi
> +	xor	edx,		ecx
> +	and	eax,		0fcfcfcfch
> +	xor	ebx,		ebx
> +	and	edx,		0cfcfcfcfh
> +	xor	ecx,		ecx
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	esi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	esi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR 28[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	esi,		ebx
> +	; 
> +	; Round 4
> +	mov	eax,		DWORD PTR 32[esp]
> +	mov	edx,		esi
> +	shr	edx,		16
> +	mov	ecx,		DWORD PTR 36[esp]
> +	xor	edx,		esi
> +	and	eax,		edx
> +	and	edx,		ecx
> +	mov	ebx,		eax
> +	shl	ebx,		16
> +	mov	ecx,		edx
> +	shl	ecx,		16
> +	xor	eax,		ebx
> +	xor	edx,		ecx
> +	mov	ebx,		DWORD PTR 32[ebp]
> +	xor	eax,		ebx
> +	mov	ecx,		DWORD PTR 36[ebp]
> +	xor	eax,		esi
> +	xor	edx,		esi
> +	xor	edx,		ecx
> +	and	eax,		0fcfcfcfch
> +	xor	ebx,		ebx
> +	and	edx,		0cfcfcfcfh
> +	xor	ecx,		ecx
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	edi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	edi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR 28[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	edi,		ebx
> +	; 
> +	; Round 5
> +	mov	eax,		DWORD PTR 32[esp]
> +	mov	edx,		edi
> +	shr	edx,		16
> +	mov	ecx,		DWORD PTR 36[esp]
> +	xor	edx,		edi
> +	and	eax,		edx
> +	and	edx,		ecx
> +	mov	ebx,		eax
> +	shl	ebx,		16
> +	mov	ecx,		edx
> +	shl	ecx,		16
> +	xor	eax,		ebx
> +	xor	edx,		ecx
> +	mov	ebx,		DWORD PTR 40[ebp]
> +	xor	eax,		ebx
> +	mov	ecx,		DWORD PTR 44[ebp]
> +	xor	eax,		edi
> +	xor	edx,		edi
> +	xor	edx,		ecx
> +	and	eax,		0fcfcfcfch
> +	xor	ebx,		ebx
> +	and	edx,		0cfcfcfcfh
> +	xor	ecx,		ecx
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	esi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	esi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR 28[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	esi,		ebx
> +	; 
> +	; Round 6
> +	mov	eax,		DWORD PTR 32[esp]
> +	mov	edx,		esi
> +	shr	edx,		16
> +	mov	ecx,		DWORD PTR 36[esp]
> +	xor	edx,		esi
> +	and	eax,		edx
> +	and	edx,		ecx
> +	mov	ebx,		eax
> +	shl	ebx,		16
> +	mov	ecx,		edx
> +	shl	ecx,		16
> +	xor	eax,		ebx
> +	xor	edx,		ecx
> +	mov	ebx,		DWORD PTR 48[ebp]
> +	xor	eax,		ebx
> +	mov	ecx,		DWORD PTR 52[ebp]
> +	xor	eax,		esi
> +	xor	edx,		esi
> +	xor	edx,		ecx
> +	and	eax,		0fcfcfcfch
> +	xor	ebx,		ebx
> +	and	edx,		0cfcfcfcfh
> +	xor	ecx,		ecx
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	edi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	edi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR 28[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	edi,		ebx
> +	; 
> +	; Round 7
> +	mov	eax,		DWORD PTR 32[esp]
> +	mov	edx,		edi
> +	shr	edx,		16
> +	mov	ecx,		DWORD PTR 36[esp]
> +	xor	edx,		edi
> +	and	eax,		edx
> +	and	edx,		ecx
> +	mov	ebx,		eax
> +	shl	ebx,		16
> +	mov	ecx,		edx
> +	shl	ecx,		16
> +	xor	eax,		ebx
> +	xor	edx,		ecx
> +	mov	ebx,		DWORD PTR 56[ebp]
> +	xor	eax,		ebx
> +	mov	ecx,		DWORD PTR 60[ebp]
> +	xor	eax,		edi
> +	xor	edx,		edi
> +	xor	edx,		ecx
> +	and	eax,		0fcfcfcfch
> +	xor	ebx,		ebx
> +	and	edx,		0cfcfcfcfh
> +	xor	ecx,		ecx
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	esi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	esi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR 28[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	esi,		ebx
> +	; 
> +	; Round 8
> +	mov	eax,		DWORD PTR 32[esp]
> +	mov	edx,		esi
> +	shr	edx,		16
> +	mov	ecx,		DWORD PTR 36[esp]
> +	xor	edx,		esi
> +	and	eax,		edx
> +	and	edx,		ecx
> +	mov	ebx,		eax
> +	shl	ebx,		16
> +	mov	ecx,		edx
> +	shl	ecx,		16
> +	xor	eax,		ebx
> +	xor	edx,		ecx
> +	mov	ebx,		DWORD PTR 64[ebp]
> +	xor	eax,		ebx
> +	mov	ecx,		DWORD PTR 68[ebp]
> +	xor	eax,		esi
> +	xor	edx,		esi
> +	xor	edx,		ecx
> +	and	eax,		0fcfcfcfch
> +	xor	ebx,		ebx
> +	and	edx,		0cfcfcfcfh
> +	xor	ecx,		ecx
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	edi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	edi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR 28[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	edi,		ebx
> +	; 
> +	; Round 9
> +	mov	eax,		DWORD PTR 32[esp]
> +	mov	edx,		edi
> +	shr	edx,		16
> +	mov	ecx,		DWORD PTR 36[esp]
> +	xor	edx,		edi
> +	and	eax,		edx
> +	and	edx,		ecx
> +	mov	ebx,		eax
> +	shl	ebx,		16
> +	mov	ecx,		edx
> +	shl	ecx,		16
> +	xor	eax,		ebx
> +	xor	edx,		ecx
> +	mov	ebx,		DWORD PTR 72[ebp]
> +	xor	eax,		ebx
> +	mov	ecx,		DWORD PTR 76[ebp]
> +	xor	eax,		edi
> +	xor	edx,		edi
> +	xor	edx,		ecx
> +	and	eax,		0fcfcfcfch
> +	xor	ebx,		ebx
> +	and	edx,		0cfcfcfcfh
> +	xor	ecx,		ecx
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	esi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	esi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR 28[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	esi,		ebx
> +	; 
> +	; Round 10
> +	mov	eax,		DWORD PTR 32[esp]
> +	mov	edx,		esi
> +	shr	edx,		16
> +	mov	ecx,		DWORD PTR 36[esp]
> +	xor	edx,		esi
> +	and	eax,		edx
> +	and	edx,		ecx
> +	mov	ebx,		eax
> +	shl	ebx,		16
> +	mov	ecx,		edx
> +	shl	ecx,		16
> +	xor	eax,		ebx
> +	xor	edx,		ecx
> +	mov	ebx,		DWORD PTR 80[ebp]
> +	xor	eax,		ebx
> +	mov	ecx,		DWORD PTR 84[ebp]
> +	xor	eax,		esi
> +	xor	edx,		esi
> +	xor	edx,		ecx
> +	and	eax,		0fcfcfcfch
> +	xor	ebx,		ebx
> +	and	edx,		0cfcfcfcfh
> +	xor	ecx,		ecx
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	edi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	edi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR 28[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	edi,		ebx
> +	; 
> +	; Round 11
> +	mov	eax,		DWORD PTR 32[esp]
> +	mov	edx,		edi
> +	shr	edx,		16
> +	mov	ecx,		DWORD PTR 36[esp]
> +	xor	edx,		edi
> +	and	eax,		edx
> +	and	edx,		ecx
> +	mov	ebx,		eax
> +	shl	ebx,		16
> +	mov	ecx,		edx
> +	shl	ecx,		16
> +	xor	eax,		ebx
> +	xor	edx,		ecx
> +	mov	ebx,		DWORD PTR 88[ebp]
> +	xor	eax,		ebx
> +	mov	ecx,		DWORD PTR 92[ebp]
> +	xor	eax,		edi
> +	xor	edx,		edi
> +	xor	edx,		ecx
> +	and	eax,		0fcfcfcfch
> +	xor	ebx,		ebx
> +	and	edx,		0cfcfcfcfh
> +	xor	ecx,		ecx
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	esi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	esi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR 28[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	esi,		ebx
> +	; 
> +	; Round 12
> +	mov	eax,		DWORD PTR 32[esp]
> +	mov	edx,		esi
> +	shr	edx,		16
> +	mov	ecx,		DWORD PTR 36[esp]
> +	xor	edx,		esi
> +	and	eax,		edx
> +	and	edx,		ecx
> +	mov	ebx,		eax
> +	shl	ebx,		16
> +	mov	ecx,		edx
> +	shl	ecx,		16
> +	xor	eax,		ebx
> +	xor	edx,		ecx
> +	mov	ebx,		DWORD PTR 96[ebp]
> +	xor	eax,		ebx
> +	mov	ecx,		DWORD PTR 100[ebp]
> +	xor	eax,		esi
> +	xor	edx,		esi
> +	xor	edx,		ecx
> +	and	eax,		0fcfcfcfch
> +	xor	ebx,		ebx
> +	and	edx,		0cfcfcfcfh
> +	xor	ecx,		ecx
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	edi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	edi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR 28[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	edi,		ebx
> +	; 
> +	; Round 13
> +	mov	eax,		DWORD PTR 32[esp]
> +	mov	edx,		edi
> +	shr	edx,		16
> +	mov	ecx,		DWORD PTR 36[esp]
> +	xor	edx,		edi
> +	and	eax,		edx
> +	and	edx,		ecx
> +	mov	ebx,		eax
> +	shl	ebx,		16
> +	mov	ecx,		edx
> +	shl	ecx,		16
> +	xor	eax,		ebx
> +	xor	edx,		ecx
> +	mov	ebx,		DWORD PTR 104[ebp]
> +	xor	eax,		ebx
> +	mov	ecx,		DWORD PTR 108[ebp]
> +	xor	eax,		edi
> +	xor	edx,		edi
> +	xor	edx,		ecx
> +	and	eax,		0fcfcfcfch
> +	xor	ebx,		ebx
> +	and	edx,		0cfcfcfcfh
> +	xor	ecx,		ecx
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	esi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	esi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR 28[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	esi,		ebx
> +	; 
> +	; Round 14
> +	mov	eax,		DWORD PTR 32[esp]
> +	mov	edx,		esi
> +	shr	edx,		16
> +	mov	ecx,		DWORD PTR 36[esp]
> +	xor	edx,		esi
> +	and	eax,		edx
> +	and	edx,		ecx
> +	mov	ebx,		eax
> +	shl	ebx,		16
> +	mov	ecx,		edx
> +	shl	ecx,		16
> +	xor	eax,		ebx
> +	xor	edx,		ecx
> +	mov	ebx,		DWORD PTR 112[ebp]
> +	xor	eax,		ebx
> +	mov	ecx,		DWORD PTR 116[ebp]
> +	xor	eax,		esi
> +	xor	edx,		esi
> +	xor	edx,		ecx
> +	and	eax,		0fcfcfcfch
> +	xor	ebx,		ebx
> +	and	edx,		0cfcfcfcfh
> +	xor	ecx,		ecx
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	edi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	edi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	edi,		ebp
> +	mov	ebp,		DWORD PTR 28[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	edi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	edi,		ebx
> +	; 
> +	; Round 15
> +	mov	eax,		DWORD PTR 32[esp]
> +	mov	edx,		edi
> +	shr	edx,		16
> +	mov	ecx,		DWORD PTR 36[esp]
> +	xor	edx,		edi
> +	and	eax,		edx
> +	and	edx,		ecx
> +	mov	ebx,		eax
> +	shl	ebx,		16
> +	mov	ecx,		edx
> +	shl	ecx,		16
> +	xor	eax,		ebx
> +	xor	edx,		ecx
> +	mov	ebx,		DWORD PTR 120[ebp]
> +	xor	eax,		ebx
> +	mov	ecx,		DWORD PTR 124[ebp]
> +	xor	eax,		edi
> +	xor	edx,		edi
> +	xor	edx,		ecx
> +	and	eax,		0fcfcfcfch
> +	xor	ebx,		ebx
> +	and	edx,		0cfcfcfcfh
> +	xor	ecx,		ecx
> +	mov	bl,		al
> +	mov	cl,		ah
> +	ror	edx,		4
> +	mov	ebp,		DWORD PTR _des_SPtrans[ebx]
> +	mov	bl,		dl
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR _des_SPtrans[0200h+ecx]
> +	xor	esi,		ebp
> +	mov	cl,		dh
> +	shr	eax,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0100h+ebx]
> +	xor	esi,		ebp
> +	mov	bl,		ah
> +	shr	edx,		16
> +	mov	ebp,		DWORD PTR _des_SPtrans[0300h+ecx]
> +	xor	esi,		ebp
> +	mov	ebp,		DWORD PTR 28[esp]
> +	mov	cl,		dh
> +	and	eax,		0ffh
> +	and	edx,		0ffh
> +	mov	ebx,		DWORD PTR _des_SPtrans[0600h+ebx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0700h+ecx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0400h+eax]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR _des_SPtrans[0500h+edx]
> +	xor	esi,		ebx
> +	mov	ebx,		DWORD PTR [esp]
> +	mov	eax,		edi
> +	dec	ebx
> +	mov	edi,		esi
> +	mov	esi,		eax
> +	mov	DWORD PTR [esp],ebx
> +	jnz	L000start
> +	; 
> +	; FP
> +	mov	edx,		DWORD PTR 24[esp]
> +	ror	edi,		1
> +	mov	eax,		esi
> +	xor	esi,		edi
> +	and	esi,		0aaaaaaaah
> +	xor	eax,		esi
> +	xor	edi,		esi
> +	; 
> +	rol	eax,		23
> +	mov	esi,		eax
> +	xor	eax,		edi
> +	and	eax,		003fc03fch
> +	xor	esi,		eax
> +	xor	edi,		eax
> +	; 
> +	rol	esi,		10
> +	mov	eax,		esi
> +	xor	esi,		edi
> +	and	esi,		033333333h
> +	xor	eax,		esi
> +	xor	edi,		esi
> +	; 
> +	rol	edi,		18
> +	mov	esi,		edi
> +	xor	edi,		eax
> +	and	edi,		0fff0000fh
> +	xor	esi,		edi
> +	xor	eax,		edi
> +	; 
> +	rol	esi,		12
> +	mov	edi,		esi
> +	xor	esi,		eax
> +	and	esi,		0f0f0f0f0h
> +	xor	edi,		esi
> +	xor	eax,		esi
> +	; 
> +	ror	eax,		4
> +	mov	DWORD PTR [edx],eax
> +	mov	DWORD PTR 4[edx],edi
> +	pop	ecx
> +	pop	edi
> +	pop	esi
> +	pop	ebx
> +	pop	ebp
> +	ret
> +_fcrypt_body ENDP
> +_TEXT	ENDS
> +END
> diff -Naur linux/cryptolib/libdes/asm/yx86unix.cpp linux-crypto/cryptolib/libdes/asm/yx86unix.cpp
> --- linux/cryptolib/libdes/asm/yx86unix.cpp	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/cryptolib/libdes/asm/yx86unix.cpp	Tue Aug 27 11:20:55 2002
> @@ -0,0 +1,973 @@
> +/* Run the C pre-processor over this file with one of the following defined
> + * ELF - elf object files,
> + * OUT - a.out object files,
> + * BSDI - BSDI style a.out object files
> + * SOL - Solaris style elf
> + */
> +
> +#define TYPE(a,b)       .type   a,b
> +#define SIZE(a,b)       .size   a,b
> +
> +#if defined(OUT) || defined(BSDI)
> +#define des_SPtrans _des_SPtrans
> +
> +#endif
> +
> +#ifdef OUT
> +#define OK	1
> +#define ALIGN	4
> +#endif
> +
> +#ifdef BSDI
> +#define OK              1
> +#define ALIGN           4
> +#undef SIZE
> +#undef TYPE
> +#endif
> +
> +#if defined(ELF) || defined(SOL)
> +#define OK              1
> +#define ALIGN           16
> +#endif
> +
> +#ifndef OK
> +You need to define one of
> +ELF - elf systems - linux-elf, NetBSD and DG-UX
> +OUT - a.out systems - linux-a.out and FreeBSD
> +SOL - solaris systems, which are elf with strange comment lines
> +BSDI - a.out with a very primative version of as.
> +#endif
> +
> +/* Let the Assembler begin :-) */
> +	/* Don't even think of reading this code */
> +	/* It was automatically generated by crypt586.pl */
> +	/* Which is a perl program used to generate the x86 assember for */
> +	/* any of elf, a.out, BSDI,Win32, or Solaris */
> +	/* eric <[email protected]> */
> +
> +	.file	"crypt586.s"
> +	.version	"01.01"
> +gcc2_compiled.:
> +.text
> +	.align ALIGN
> +.globl fcrypt_body
> +	TYPE(fcrypt_body,@function)
> +fcrypt_body:
> +	pushl	%ebp
> +	pushl	%ebx
> +	pushl	%esi
> +	pushl	%edi
> +
> +
> +	/* Load the 2 words */
> +	xorl	%edi,		%edi
> +	xorl	%esi,		%esi
> +	movl	24(%esp),	%ebp
> +	pushl	$25
> +.L000start:
> +
> +	/* Round 0 */
> +	movl	32(%esp),	%eax
> +	movl	%esi,		%edx
> +	shrl	$16,		%edx
> +	movl	36(%esp),	%ecx
> +	xorl	%esi,		%edx
> +	andl	%edx,		%eax
> +	andl	%ecx,		%edx
> +	movl	%eax,		%ebx
> +	sall	$16,		%ebx
> +	movl	%edx,		%ecx
> +	sall	$16,		%ecx
> +	xorl	%ebx,		%eax
> +	xorl	%ecx,		%edx
> +	movl	(%ebp),		%ebx
> +	xorl	%ebx,		%eax
> +	movl	4(%ebp),	%ecx
> +	xorl	%esi,		%eax
> +	xorl	%esi,		%edx
> +	xorl	%ecx,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	xorl	%ebx,		%ebx
> +	andl	$0xcfcfcfcf,	%edx
> +	xorl	%ecx,		%ecx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%edi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movl	28(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%edi
> +
> +	/* Round 1 */
> +	movl	32(%esp),	%eax
> +	movl	%edi,		%edx
> +	shrl	$16,		%edx
> +	movl	36(%esp),	%ecx
> +	xorl	%edi,		%edx
> +	andl	%edx,		%eax
> +	andl	%ecx,		%edx
> +	movl	%eax,		%ebx
> +	sall	$16,		%ebx
> +	movl	%edx,		%ecx
> +	sall	$16,		%ecx
> +	xorl	%ebx,		%eax
> +	xorl	%ecx,		%edx
> +	movl	8(%ebp),	%ebx
> +	xorl	%ebx,		%eax
> +	movl	12(%ebp),	%ecx
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%edx
> +	xorl	%ecx,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	xorl	%ebx,		%ebx
> +	andl	$0xcfcfcfcf,	%edx
> +	xorl	%ecx,		%ecx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%esi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movl	28(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%esi
> +
> +	/* Round 2 */
> +	movl	32(%esp),	%eax
> +	movl	%esi,		%edx
> +	shrl	$16,		%edx
> +	movl	36(%esp),	%ecx
> +	xorl	%esi,		%edx
> +	andl	%edx,		%eax
> +	andl	%ecx,		%edx
> +	movl	%eax,		%ebx
> +	sall	$16,		%ebx
> +	movl	%edx,		%ecx
> +	sall	$16,		%ecx
> +	xorl	%ebx,		%eax
> +	xorl	%ecx,		%edx
> +	movl	16(%ebp),	%ebx
> +	xorl	%ebx,		%eax
> +	movl	20(%ebp),	%ecx
> +	xorl	%esi,		%eax
> +	xorl	%esi,		%edx
> +	xorl	%ecx,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	xorl	%ebx,		%ebx
> +	andl	$0xcfcfcfcf,	%edx
> +	xorl	%ecx,		%ecx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%edi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movl	28(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%edi
> +
> +	/* Round 3 */
> +	movl	32(%esp),	%eax
> +	movl	%edi,		%edx
> +	shrl	$16,		%edx
> +	movl	36(%esp),	%ecx
> +	xorl	%edi,		%edx
> +	andl	%edx,		%eax
> +	andl	%ecx,		%edx
> +	movl	%eax,		%ebx
> +	sall	$16,		%ebx
> +	movl	%edx,		%ecx
> +	sall	$16,		%ecx
> +	xorl	%ebx,		%eax
> +	xorl	%ecx,		%edx
> +	movl	24(%ebp),	%ebx
> +	xorl	%ebx,		%eax
> +	movl	28(%ebp),	%ecx
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%edx
> +	xorl	%ecx,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	xorl	%ebx,		%ebx
> +	andl	$0xcfcfcfcf,	%edx
> +	xorl	%ecx,		%ecx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%esi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movl	28(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%esi
> +
> +	/* Round 4 */
> +	movl	32(%esp),	%eax
> +	movl	%esi,		%edx
> +	shrl	$16,		%edx
> +	movl	36(%esp),	%ecx
> +	xorl	%esi,		%edx
> +	andl	%edx,		%eax
> +	andl	%ecx,		%edx
> +	movl	%eax,		%ebx
> +	sall	$16,		%ebx
> +	movl	%edx,		%ecx
> +	sall	$16,		%ecx
> +	xorl	%ebx,		%eax
> +	xorl	%ecx,		%edx
> +	movl	32(%ebp),	%ebx
> +	xorl	%ebx,		%eax
> +	movl	36(%ebp),	%ecx
> +	xorl	%esi,		%eax
> +	xorl	%esi,		%edx
> +	xorl	%ecx,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	xorl	%ebx,		%ebx
> +	andl	$0xcfcfcfcf,	%edx
> +	xorl	%ecx,		%ecx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%edi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movl	28(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%edi
> +
> +	/* Round 5 */
> +	movl	32(%esp),	%eax
> +	movl	%edi,		%edx
> +	shrl	$16,		%edx
> +	movl	36(%esp),	%ecx
> +	xorl	%edi,		%edx
> +	andl	%edx,		%eax
> +	andl	%ecx,		%edx
> +	movl	%eax,		%ebx
> +	sall	$16,		%ebx
> +	movl	%edx,		%ecx
> +	sall	$16,		%ecx
> +	xorl	%ebx,		%eax
> +	xorl	%ecx,		%edx
> +	movl	40(%ebp),	%ebx
> +	xorl	%ebx,		%eax
> +	movl	44(%ebp),	%ecx
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%edx
> +	xorl	%ecx,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	xorl	%ebx,		%ebx
> +	andl	$0xcfcfcfcf,	%edx
> +	xorl	%ecx,		%ecx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%esi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movl	28(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%esi
> +
> +	/* Round 6 */
> +	movl	32(%esp),	%eax
> +	movl	%esi,		%edx
> +	shrl	$16,		%edx
> +	movl	36(%esp),	%ecx
> +	xorl	%esi,		%edx
> +	andl	%edx,		%eax
> +	andl	%ecx,		%edx
> +	movl	%eax,		%ebx
> +	sall	$16,		%ebx
> +	movl	%edx,		%ecx
> +	sall	$16,		%ecx
> +	xorl	%ebx,		%eax
> +	xorl	%ecx,		%edx
> +	movl	48(%ebp),	%ebx
> +	xorl	%ebx,		%eax
> +	movl	52(%ebp),	%ecx
> +	xorl	%esi,		%eax
> +	xorl	%esi,		%edx
> +	xorl	%ecx,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	xorl	%ebx,		%ebx
> +	andl	$0xcfcfcfcf,	%edx
> +	xorl	%ecx,		%ecx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%edi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movl	28(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%edi
> +
> +	/* Round 7 */
> +	movl	32(%esp),	%eax
> +	movl	%edi,		%edx
> +	shrl	$16,		%edx
> +	movl	36(%esp),	%ecx
> +	xorl	%edi,		%edx
> +	andl	%edx,		%eax
> +	andl	%ecx,		%edx
> +	movl	%eax,		%ebx
> +	sall	$16,		%ebx
> +	movl	%edx,		%ecx
> +	sall	$16,		%ecx
> +	xorl	%ebx,		%eax
> +	xorl	%ecx,		%edx
> +	movl	56(%ebp),	%ebx
> +	xorl	%ebx,		%eax
> +	movl	60(%ebp),	%ecx
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%edx
> +	xorl	%ecx,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	xorl	%ebx,		%ebx
> +	andl	$0xcfcfcfcf,	%edx
> +	xorl	%ecx,		%ecx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%esi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movl	28(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%esi
> +
> +	/* Round 8 */
> +	movl	32(%esp),	%eax
> +	movl	%esi,		%edx
> +	shrl	$16,		%edx
> +	movl	36(%esp),	%ecx
> +	xorl	%esi,		%edx
> +	andl	%edx,		%eax
> +	andl	%ecx,		%edx
> +	movl	%eax,		%ebx
> +	sall	$16,		%ebx
> +	movl	%edx,		%ecx
> +	sall	$16,		%ecx
> +	xorl	%ebx,		%eax
> +	xorl	%ecx,		%edx
> +	movl	64(%ebp),	%ebx
> +	xorl	%ebx,		%eax
> +	movl	68(%ebp),	%ecx
> +	xorl	%esi,		%eax
> +	xorl	%esi,		%edx
> +	xorl	%ecx,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	xorl	%ebx,		%ebx
> +	andl	$0xcfcfcfcf,	%edx
> +	xorl	%ecx,		%ecx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%edi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movl	28(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%edi
> +
> +	/* Round 9 */
> +	movl	32(%esp),	%eax
> +	movl	%edi,		%edx
> +	shrl	$16,		%edx
> +	movl	36(%esp),	%ecx
> +	xorl	%edi,		%edx
> +	andl	%edx,		%eax
> +	andl	%ecx,		%edx
> +	movl	%eax,		%ebx
> +	sall	$16,		%ebx
> +	movl	%edx,		%ecx
> +	sall	$16,		%ecx
> +	xorl	%ebx,		%eax
> +	xorl	%ecx,		%edx
> +	movl	72(%ebp),	%ebx
> +	xorl	%ebx,		%eax
> +	movl	76(%ebp),	%ecx
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%edx
> +	xorl	%ecx,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	xorl	%ebx,		%ebx
> +	andl	$0xcfcfcfcf,	%edx
> +	xorl	%ecx,		%ecx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%esi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movl	28(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%esi
> +
> +	/* Round 10 */
> +	movl	32(%esp),	%eax
> +	movl	%esi,		%edx
> +	shrl	$16,		%edx
> +	movl	36(%esp),	%ecx
> +	xorl	%esi,		%edx
> +	andl	%edx,		%eax
> +	andl	%ecx,		%edx
> +	movl	%eax,		%ebx
> +	sall	$16,		%ebx
> +	movl	%edx,		%ecx
> +	sall	$16,		%ecx
> +	xorl	%ebx,		%eax
> +	xorl	%ecx,		%edx
> +	movl	80(%ebp),	%ebx
> +	xorl	%ebx,		%eax
> +	movl	84(%ebp),	%ecx
> +	xorl	%esi,		%eax
> +	xorl	%esi,		%edx
> +	xorl	%ecx,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	xorl	%ebx,		%ebx
> +	andl	$0xcfcfcfcf,	%edx
> +	xorl	%ecx,		%ecx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%edi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movl	28(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%edi
> +
> +	/* Round 11 */
> +	movl	32(%esp),	%eax
> +	movl	%edi,		%edx
> +	shrl	$16,		%edx
> +	movl	36(%esp),	%ecx
> +	xorl	%edi,		%edx
> +	andl	%edx,		%eax
> +	andl	%ecx,		%edx
> +	movl	%eax,		%ebx
> +	sall	$16,		%ebx
> +	movl	%edx,		%ecx
> +	sall	$16,		%ecx
> +	xorl	%ebx,		%eax
> +	xorl	%ecx,		%edx
> +	movl	88(%ebp),	%ebx
> +	xorl	%ebx,		%eax
> +	movl	92(%ebp),	%ecx
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%edx
> +	xorl	%ecx,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	xorl	%ebx,		%ebx
> +	andl	$0xcfcfcfcf,	%edx
> +	xorl	%ecx,		%ecx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%esi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movl	28(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%esi
> +
> +	/* Round 12 */
> +	movl	32(%esp),	%eax
> +	movl	%esi,		%edx
> +	shrl	$16,		%edx
> +	movl	36(%esp),	%ecx
> +	xorl	%esi,		%edx
> +	andl	%edx,		%eax
> +	andl	%ecx,		%edx
> +	movl	%eax,		%ebx
> +	sall	$16,		%ebx
> +	movl	%edx,		%ecx
> +	sall	$16,		%ecx
> +	xorl	%ebx,		%eax
> +	xorl	%ecx,		%edx
> +	movl	96(%ebp),	%ebx
> +	xorl	%ebx,		%eax
> +	movl	100(%ebp),	%ecx
> +	xorl	%esi,		%eax
> +	xorl	%esi,		%edx
> +	xorl	%ecx,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	xorl	%ebx,		%ebx
> +	andl	$0xcfcfcfcf,	%edx
> +	xorl	%ecx,		%ecx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%edi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movl	28(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%edi
> +
> +	/* Round 13 */
> +	movl	32(%esp),	%eax
> +	movl	%edi,		%edx
> +	shrl	$16,		%edx
> +	movl	36(%esp),	%ecx
> +	xorl	%edi,		%edx
> +	andl	%edx,		%eax
> +	andl	%ecx,		%edx
> +	movl	%eax,		%ebx
> +	sall	$16,		%ebx
> +	movl	%edx,		%ecx
> +	sall	$16,		%ecx
> +	xorl	%ebx,		%eax
> +	xorl	%ecx,		%edx
> +	movl	104(%ebp),	%ebx
> +	xorl	%ebx,		%eax
> +	movl	108(%ebp),	%ecx
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%edx
> +	xorl	%ecx,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	xorl	%ebx,		%ebx
> +	andl	$0xcfcfcfcf,	%edx
> +	xorl	%ecx,		%ecx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%esi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movl	28(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%esi
> +
> +	/* Round 14 */
> +	movl	32(%esp),	%eax
> +	movl	%esi,		%edx
> +	shrl	$16,		%edx
> +	movl	36(%esp),	%ecx
> +	xorl	%esi,		%edx
> +	andl	%edx,		%eax
> +	andl	%ecx,		%edx
> +	movl	%eax,		%ebx
> +	sall	$16,		%ebx
> +	movl	%edx,		%ecx
> +	sall	$16,		%ecx
> +	xorl	%ebx,		%eax
> +	xorl	%ecx,		%edx
> +	movl	112(%ebp),	%ebx
> +	xorl	%ebx,		%eax
> +	movl	116(%ebp),	%ecx
> +	xorl	%esi,		%eax
> +	xorl	%esi,		%edx
> +	xorl	%ecx,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	xorl	%ebx,		%ebx
> +	andl	$0xcfcfcfcf,	%edx
> +	xorl	%ecx,		%ecx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%edi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%edi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%edi
> +	movl	28(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%edi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%edi
> +
> +	/* Round 15 */
> +	movl	32(%esp),	%eax
> +	movl	%edi,		%edx
> +	shrl	$16,		%edx
> +	movl	36(%esp),	%ecx
> +	xorl	%edi,		%edx
> +	andl	%edx,		%eax
> +	andl	%ecx,		%edx
> +	movl	%eax,		%ebx
> +	sall	$16,		%ebx
> +	movl	%edx,		%ecx
> +	sall	$16,		%ecx
> +	xorl	%ebx,		%eax
> +	xorl	%ecx,		%edx
> +	movl	120(%ebp),	%ebx
> +	xorl	%ebx,		%eax
> +	movl	124(%ebp),	%ecx
> +	xorl	%edi,		%eax
> +	xorl	%edi,		%edx
> +	xorl	%ecx,		%edx
> +	andl	$0xfcfcfcfc,	%eax
> +	xorl	%ebx,		%ebx
> +	andl	$0xcfcfcfcf,	%edx
> +	xorl	%ecx,		%ecx
> +	movb	%al,		%bl
> +	movb	%ah,		%cl
> +	rorl	$4,		%edx
> +	movl	      des_SPtrans(%ebx),%ebp
> +	movb	%dl,		%bl
> +	xorl	%ebp,		%esi
> +	movl	0x200+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%dh,		%cl
> +	shrl	$16,		%eax
> +	movl	0x100+des_SPtrans(%ebx),%ebp
> +	xorl	%ebp,		%esi
> +	movb	%ah,		%bl
> +	shrl	$16,		%edx
> +	movl	0x300+des_SPtrans(%ecx),%ebp
> +	xorl	%ebp,		%esi
> +	movl	28(%esp),	%ebp
> +	movb	%dh,		%cl
> +	andl	$0xff,		%eax
> +	andl	$0xff,		%edx
> +	movl	0x600+des_SPtrans(%ebx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x700+des_SPtrans(%ecx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x400+des_SPtrans(%eax),%ebx
> +	xorl	%ebx,		%esi
> +	movl	0x500+des_SPtrans(%edx),%ebx
> +	xorl	%ebx,		%esi
> +	movl	(%esp),		%ebx
> +	movl	%edi,		%eax
> +	decl	%ebx
> +	movl	%esi,		%edi
> +	movl	%eax,		%esi
> +	movl	%ebx,		(%esp)
> +	jnz	.L000start
> +
> +	/* FP */
> +	movl	24(%esp),	%edx
> +.byte 209
> +.byte 207		/* rorl $1 %edi */
> +	movl	%esi,		%eax
> +	xorl	%edi,		%esi
> +	andl	$0xaaaaaaaa,	%esi
> +	xorl	%esi,		%eax
> +	xorl	%esi,		%edi
> +
> +	roll	$23,		%eax
> +	movl	%eax,		%esi
> +	xorl	%edi,		%eax
> +	andl	$0x03fc03fc,	%eax
> +	xorl	%eax,		%esi
> +	xorl	%eax,		%edi
> +
> +	roll	$10,		%esi
> +	movl	%esi,		%eax
> +	xorl	%edi,		%esi
> +	andl	$0x33333333,	%esi
> +	xorl	%esi,		%eax
> +	xorl	%esi,		%edi
> +
> +	roll	$18,		%edi
> +	movl	%edi,		%esi
> +	xorl	%eax,		%edi
> +	andl	$0xfff0000f,	%edi
> +	xorl	%edi,		%esi
> +	xorl	%edi,		%eax
> +
> +	roll	$12,		%esi
> +	movl	%esi,		%edi
> +	xorl	%eax,		%esi
> +	andl	$0xf0f0f0f0,	%esi
> +	xorl	%esi,		%edi
> +	xorl	%esi,		%eax
> +
> +	rorl	$4,		%eax
> +	movl	%eax,		(%edx)
> +	movl	%edi,		4(%edx)
> +	popl	%ecx
> +	popl	%edi
> +	popl	%esi
> +	popl	%ebx
> +	popl	%ebp
> +	ret
> +.fcrypt_body_end:
> +	SIZE(fcrypt_body,.fcrypt_body_end-fcrypt_body)
> +.ident	"fcrypt_body"
> diff -Naur linux/cryptolib/libdes/cbc_enc.c linux-crypto/cryptolib/libdes/cbc_enc.c
> --- linux/cryptolib/libdes/cbc_enc.c	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/cryptolib/libdes/cbc_enc.c	Tue Aug 27 11:20:55 2002
> @@ -0,0 +1,135 @@
> +/* crypto/des/cbc_enc.c */
> +/* Copyright (C) 1995-1997 Eric Young ([email protected])
> + * All rights reserved.
> + *
> + * This package is an SSL implementation written
> + * by Eric Young ([email protected]).
> + * The implementation was written so as to conform with Netscapes SSL.
> + * 
> + * This library is free for commercial and non-commercial use as long as
> + * the following conditions are aheared to.  The following conditions
> + * apply to all code found in this distribution, be it the RC4, RSA,
> + * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
> + * included with this distribution is covered by the same copyright terms
> + * except that the holder is Tim Hudson ([email protected]).
> + * 
> + * Copyright remains Eric Young's, and as such any Copyright notices in
> + * the code are not to be removed.
> + * If this package is used in a product, Eric Young should be given attribution
> + * as the author of the parts of the library used.
> + * This can be in the form of a textual message at program startup or
> + * in documentation (online or textual) provided with the package.
> + * 
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the copyright
> + *    notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + *    notice, this list of conditions and the following disclaimer in the
> + *    documentation and/or other materials provided with the distribution.
> + * 3. All advertising materials mentioning features or use of this software
> + *    must display the following acknowledgement:
> + *    "This product includes cryptographic software written by
> + *     Eric Young ([email protected])"
> + *    The word 'cryptographic' can be left out if the rouines from the library
> + *    being used are not cryptographic related :-).
> + * 4. If you include any Windows specific code (or a derivative thereof) from 
> + *    the apps directory (application code) you must include an acknowledgement:
> + *    "This product includes software written by Tim Hudson ([email protected])"
> + * 
> + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + * 
> + * The licence and distribution terms for any publically available version or
> + * derivative of this code cannot be changed.  i.e. this code cannot simply be
> + * copied and put under another distribution licence
> + * [including the GNU Public Licence.]
> + */
> +
> +#include <linux/des_locl.h>
> +
> +void des_cbc_encrypt(input, output, length, schedule, ivec, enc)
> +des_cblock (*input);
> +des_cblock (*output);
> +long length;
> +des_key_schedule schedule;
> +des_cblock (*ivec);
> +int enc;
> +	{
> +	register DES_LONG tin0,tin1;
> +	register DES_LONG tout0,tout1,xor0,xor1;
> +	register unsigned char *in,*out;
> +	register long l=length;
> +	DES_LONG tin[2];
> +	unsigned char *iv;
> +
> +	in=(unsigned char *)input;
> +	out=(unsigned char *)output;
> +	iv=(unsigned char *)ivec;
> +
> +	if (enc)
> +		{
> +		c2l(iv,tout0);
> +		c2l(iv,tout1);
> +		for (l-=8; l>=0; l-=8)
> +			{
> +			c2l(in,tin0);
> +			c2l(in,tin1);
> +			tin0^=tout0; tin[0]=tin0;
> +			tin1^=tout1; tin[1]=tin1;
> +			des_encrypt((DES_LONG *)tin,schedule,DES_ENCRYPT);
> +			tout0=tin[0]; l2c(tout0,out);
> +			tout1=tin[1]; l2c(tout1,out);
> +			}
> +		if (l != -8)
> +			{
> +			c2ln(in,tin0,tin1,l+8);
> +			tin0^=tout0; tin[0]=tin0;
> +			tin1^=tout1; tin[1]=tin1;
> +			des_encrypt((DES_LONG *)tin,schedule,DES_ENCRYPT);
> +			tout0=tin[0]; l2c(tout0,out);
> +			tout1=tin[1]; l2c(tout1,out);
> +			}
> +		}
> +	else
> +		{
> +		c2l(iv,xor0);
> +		c2l(iv,xor1);
> +		for (l-=8; l>=0; l-=8)
> +			{
> +			c2l(in,tin0); tin[0]=tin0;
> +			c2l(in,tin1); tin[1]=tin1;
> +			des_encrypt((DES_LONG *)tin,schedule,DES_DECRYPT);
> +			tout0=tin[0]^xor0;
> +			tout1=tin[1]^xor1;
> +			l2c(tout0,out);
> +			l2c(tout1,out);
> +			xor0=tin0;
> +			xor1=tin1;
> +			}
> +		if (l != -8)
> +			{
> +			c2l(in,tin0); tin[0]=tin0;
> +			c2l(in,tin1); tin[1]=tin1;
> +			des_encrypt((DES_LONG *)tin,schedule,DES_DECRYPT);
> +			tout0=tin[0]^xor0;
> +			tout1=tin[1]^xor1;
> +			l2cn(tout0,tout1,out,l+8);
> +		/*	xor0=tin0;
> +			xor1=tin1; */
> +			}
> +		}
> +	tin0=tin1=tout0=tout1=xor0=xor1=0;
> +	tin[0]=tin[1]=0;
> +	}
> +
> diff -Naur linux/cryptolib/libdes/des.doc linux-crypto/cryptolib/libdes/des.doc
> --- linux/cryptolib/libdes/des.doc	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/cryptolib/libdes/des.doc	Tue Aug 27 11:20:55 2002
> @@ -0,0 +1,505 @@
> +The DES library.
> +
> +Please note that this library was originally written to operate with
> +eBones, a version of Kerberos that had had encryption removed when it left
> +the USA and then put back in.  As such there are some routines that I will
> +advise not using but they are still in the library for historical reasons.
> +For all calls that have an 'input' and 'output' variables, they can be the
> +same.
> +
> +This library requires the inclusion of 'des.h'.
> +
> +All of the encryption functions take what is called a des_key_schedule as an 
> +argument.  A des_key_schedule is an expanded form of the des key.
> +A des_key is 8 bytes of odd parity, the type used to hold the key is a
> +des_cblock.  A des_cblock is an array of 8 bytes, often in this library
> +description I will refer to input bytes when the function specifies
> +des_cblock's as input or output, this just means that the variable should
> +be a multiple of 8 bytes.
> +
> +The define DES_ENCRYPT is passed to specify encryption, DES_DECRYPT to
> +specify decryption.  The functions and global variable are as follows:
> +
> +int des_check_key;
> +	DES keys are supposed to be odd parity.  If this variable is set to
> +	a non-zero value, des_set_key() will check that the key has odd
> +	parity and is not one of the known weak DES keys.  By default this
> +	variable is turned off;
> +	
> +void des_set_odd_parity(
> +des_cblock *key );
> +	This function takes a DES key (8 bytes) and sets the parity to odd.
> +	
> +int des_is_weak_key(
> +des_cblock *key );
> +	This function returns a non-zero value if the DES key passed is a
> +	weak, DES key.  If it is a weak key, don't use it, try a different
> +	one.  If you are using 'random' keys, the chances of hitting a weak
> +	key are 1/2^52 so it is probably not worth checking for them.
> +	
> +int des_set_key(
> +des_cblock *key,
> +des_key_schedule schedule);
> +	Des_set_key converts an 8 byte DES key into a des_key_schedule.
> +	A des_key_schedule is an expanded form of the key which is used to
> +	perform actual encryption.  It can be regenerated from the DES key
> +	so it only needs to be kept when encryption or decryption is about
> +	to occur.  Don't save or pass around des_key_schedule's since they
> +	are CPU architecture dependent, DES keys are not.  If des_check_key
> +	is non zero, zero is returned if the key has the wrong parity or
> +	the key is a weak key, else 1 is returned.
> +	
> +int des_key_sched(
> +des_cblock *key,
> +des_key_schedule schedule);
> +	An alternative name for des_set_key().
> +
> +int des_rw_mode;		/* defaults to DES_PCBC_MODE */
> +	This flag holds either DES_CBC_MODE or DES_PCBC_MODE (default).
> +	This specifies the function to use in the enc_read() and enc_write()
> +	functions.
> +
> +void des_encrypt(
> +unsigned long *data,
> +des_key_schedule ks,
> +int enc);
> +	This is the DES encryption function that gets called by just about
> +	every other DES routine in the library.  You should not use this
> +	function except to implement 'modes' of DES.  I say this because the
> +	functions that call this routine do the conversion from 'char *' to
> +	long, and this needs to be done to make sure 'non-aligned' memory
> +	access do not occur.  The characters are loaded 'little endian',
> +	have a look at my source code for more details on how I use this
> +	function.
> +	Data is a pointer to 2 unsigned long's and ks is the
> +	des_key_schedule to use.  enc, is non zero specifies encryption,
> +	zero if decryption.
> +
> +void des_encrypt2(
> +unsigned long *data,
> +des_key_schedule ks,
> +int enc);
> +	This functions is the same as des_encrypt() except that the DES
> +	initial permutation (IP) and final permutation (FP) have been left
> +	out.  As for des_encrypt(), you should not use this function.
> +	It is used by the routines in my library that implement triple DES.
> +	IP() des_encrypt2() des_encrypt2() des_encrypt2() FP() is the same
> +	as des_encrypt() des_encrypt() des_encrypt() except faster :-).
> +
> +void des_ecb_encrypt(
> +des_cblock *input,
> +des_cblock *output,
> +des_key_schedule ks,
> +int enc);
> +	This is the basic Electronic Code Book form of DES, the most basic
> +	form.  Input is encrypted into output using the key represented by
> +	ks.  If enc is non zero (DES_ENCRYPT), encryption occurs, otherwise
> +	decryption occurs.  Input is 8 bytes long and output is 8 bytes.
> +	(the des_cblock structure is 8 chars).
> +	
> +void des_ecb3_encrypt(
> +des_cblock *input,
> +des_cblock *output,
> +des_key_schedule ks1,
> +des_key_schedule ks2,
> +des_key_schedule ks3,
> +int enc);
> +	This is the 3 key EDE mode of ECB DES.  What this means is that 
> +	the 8 bytes of input is encrypted with ks1, decrypted with ks2 and
> +	then encrypted again with ks3, before being put into output;
> +	C=E(ks3,D(ks2,E(ks1,M))).  There is a macro, des_ecb2_encrypt()
> +	that only takes 2 des_key_schedules that implements,
> +	C=E(ks1,D(ks2,E(ks1,M))) in that the final encrypt is done with ks1.
> +	
> +void des_cbc_encrypt(
> +des_cblock *input,
> +des_cblock *output,
> +long length,
> +des_key_schedule ks,
> +des_cblock *ivec,
> +int enc);
> +	This routine implements DES in Cipher Block Chaining mode.
> +	Input, which should be a multiple of 8 bytes is encrypted
> +	(or decrypted) to output which will also be a multiple of 8 bytes.
> +	The number of bytes is in length (and from what I've said above,
> +	should be a multiple of 8).  If length is not a multiple of 8, I'm
> +	not being held responsible :-).  ivec is the initialisation vector.
> +	This function does not modify this variable.  To correctly implement
> +	cbc mode, you need to do one of 2 things; copy the last 8 bytes of
> +	cipher text for use as the next ivec in your application,
> +	or use des_ncbc_encrypt(). 
> +	Only this routine has this problem with updating the ivec, all
> +	other routines that are implementing cbc mode update ivec.
> +	
> +void des_ncbc_encrypt(
> +des_cblock *input,
> +des_cblock *output,
> +long length,
> +des_key_schedule sk,
> +des_cblock *ivec,
> +int enc);
> +	For historical reasons, des_cbc_encrypt() did not update the
> +	ivec with the value requires so that subsequent calls to
> +	des_cbc_encrypt() would 'chain'.  This was needed so that the same
> +	'length' values would not need to be used when decrypting.
> +	des_ncbc_encrypt() does the right thing.  It is the same as
> +	des_cbc_encrypt accept that ivec is updates with the correct value
> +	to pass in subsequent calls to des_ncbc_encrypt().  I advise using
> +	des_ncbc_encrypt() instead of des_cbc_encrypt();
> +
> +void des_xcbc_encrypt(
> +des_cblock *input,
> +des_cblock *output,
> +long length,
> +des_key_schedule sk,
> +des_cblock *ivec,
> +des_cblock *inw,
> +des_cblock *outw,
> +int enc);
> +	This is RSA's DESX mode of DES.  It uses inw and outw to
> +	'whiten' the encryption.  inw and outw are secret (unlike the iv)
> +	and are as such, part of the key.  So the key is sort of 24 bytes.
> +	This is much better than cbc des.
> +	
> +void des_3cbc_encrypt(
> +des_cblock *input,
> +des_cblock *output,
> +long length,
> +des_key_schedule sk1,
> +des_key_schedule sk2,
> +des_cblock *ivec1,
> +des_cblock *ivec2,
> +int enc);
> +	This function is flawed, do not use it.  I have left it in the
> +	library because it is used in my des(1) program and will function
> +	correctly when used by des(1).  If I removed the function, people
> +	could end up unable to decrypt files.
> +	This routine implements outer triple cbc encryption using 2 ks and
> +	2 ivec's.  Use des_ede2_cbc_encrypt() instead.
> +	
> +void des_ede3_cbc_encrypt(
> +des_cblock *input,
> +des_cblock *output, 
> +long length,
> +des_key_schedule ks1,
> +des_key_schedule ks2, 
> +des_key_schedule ks3, 
> +des_cblock *ivec,
> +int enc);
> +	This function implements inner triple CBC DES encryption with 3
> +	keys.  What this means is that each 'DES' operation
> +	inside the cbc mode is really an C=E(ks3,D(ks2,E(ks1,M))).
> +	Again, this is cbc mode so an ivec is requires.
> +	This mode is used by SSL.
> +	There is also a des_ede2_cbc_encrypt() that only uses 2
> +	des_key_schedule's, the first being reused for the final
> +	encryption.  C=E(ks1,D(ks2,E(ks1,M))).  This form of triple DES
> +	is used by the RSAref library.
> +	
> +void des_pcbc_encrypt(
> +des_cblock *input,
> +des_cblock *output,
> +long length,
> +des_key_schedule ks,
> +des_cblock *ivec,
> +int enc);
> +	This is Propagating Cipher Block Chaining mode of DES.  It is used
> +	by Kerberos v4.  It's parameters are the same as des_ncbc_encrypt().
> +	
> +void des_cfb_encrypt(
> +unsigned char *in,
> +unsigned char *out,
> +int numbits,
> +long length,
> +des_key_schedule ks,
> +des_cblock *ivec,
> +int enc);
> +	Cipher Feedback Back mode of DES.  This implementation 'feeds back'
> +	in numbit blocks.  The input (and output) is in multiples of numbits
> +	bits.  numbits should to be a multiple of 8 bits.  Length is the
> +	number of bytes input.  If numbits is not a multiple of 8 bits,
> +	the extra bits in the bytes will be considered padding.  So if
> +	numbits is 12, for each 2 input bytes, the 4 high bits of the
> +	second byte will be ignored.  So to encode 72 bits when using
> +	a numbits of 12 take 12 bytes.  To encode 72 bits when using
> +	numbits of 9 will take 16 bytes.  To encode 80 bits when using
> +	numbits of 16 will take 10 bytes. etc, etc.  This padding will
> +	apply to both input and output.
> +
> +	
> +void des_cfb64_encrypt(
> +unsigned char *in,
> +unsigned char *out,
> +long length,
> +des_key_schedule ks,
> +des_cblock *ivec,
> +int *num,
> +int enc);
> +	This is one of the more useful functions in this DES library, it
> +	implements CFB mode of DES with 64bit feedback.  Why is this
> +	useful you ask?  Because this routine will allow you to encrypt an
> +	arbitrary number of bytes, no 8 byte padding.  Each call to this
> +	routine will encrypt the input bytes to output and then update ivec
> +	and num.  num contains 'how far' we are though ivec.  If this does
> +	not make much sense, read more about cfb mode of DES :-).
> +	
> +void des_ede3_cfb64_encrypt(
> +unsigned char *in,
> +unsigned char *out,
> +long length,
> +des_key_schedule ks1,
> +des_key_schedule ks2,
> +des_key_schedule ks3,
> +des_cblock *ivec,
> +int *num,
> +int enc);
> +	Same as des_cfb64_encrypt() accept that the DES operation is
> +	triple DES.  As usual, there is a macro for
> +	des_ede2_cfb64_encrypt() which reuses ks1.
> +
> +void des_ofb_encrypt(
> +unsigned char *in,
> +unsigned char *out,
> +int numbits,
> +long length,
> +des_key_schedule ks,
> +des_cblock *ivec);
> +	This is a implementation of Output Feed Back mode of DES.  It is
> +	the same as des_cfb_encrypt() in that numbits is the size of the
> +	units dealt with during input and output (in bits).
> +	
> +void des_ofb64_encrypt(
> +unsigned char *in,
> +unsigned char *out,
> +long length,
> +des_key_schedule ks,
> +des_cblock *ivec,
> +int *num);
> +	The same as des_cfb64_encrypt() except that it is Output Feed Back
> +	mode.
> +
> +void des_ede3_ofb64_encrypt(
> +unsigned char *in,
> +unsigned char *out,
> +long length,
> +des_key_schedule ks1,
> +des_key_schedule ks2,
> +des_key_schedule ks3,
> +des_cblock *ivec,
> +int *num);
> +	Same as des_ofb64_encrypt() accept that the DES operation is
> +	triple DES.  As usual, there is a macro for
> +	des_ede2_ofb64_encrypt() which reuses ks1.
> +
> +int des_read_pw_string(
> +char *buf,
> +int length,
> +char *prompt,
> +int verify);
> +	This routine is used to get a password from the terminal with echo
> +	turned off.  Buf is where the string will end up and length is the
> +	size of buf.  Prompt is a string presented to the 'user' and if
> +	verify is set, the key is asked for twice and unless the 2 copies
> +	match, an error is returned.  A return code of -1 indicates a
> +	system error, 1 failure due to use interaction, and 0 is success.
> +
> +unsigned long des_cbc_cksum(
> +des_cblock *input,
> +des_cblock *output,
> +long length,
> +des_key_schedule ks,
> +des_cblock *ivec);
> +	This function produces an 8 byte checksum from input that it puts in
> +	output and returns the last 4 bytes as a long.  The checksum is
> +	generated via cbc mode of DES in which only the last 8 byes are
> +	kept.  I would recommend not using this function but instead using
> +	the EVP_Digest routines, or at least using MD5 or SHA.  This
> +	function is used by Kerberos v4 so that is why it stays in the
> +	library.
> +	
> +char *des_fcrypt(
> +const char *buf,
> +const char *salt
> +char *ret);
> +	This is my fast version of the unix crypt(3) function.  This version
> +	takes only a small amount of space relative to other fast
> +	crypt() implementations.  This is different to the normal crypt
> +	in that the third parameter is the buffer that the return value
> +	is written into.  It needs to be at least 14 bytes long.  This
> +	function is thread safe, unlike the normal crypt.
> +
> +char *crypt(
> +const char *buf,
> +const char *salt);
> +	This function calls des_fcrypt() with a static array passed as the
> +	third parameter.  This emulates the normal non-thread safe semantics
> +	of crypt(3).
> +
> +void des_string_to_key(
> +char *str,
> +des_cblock *key);
> +	This function takes str and converts it into a DES key.  I would
> +	recommend using MD5 instead and use the first 8 bytes of output.
> +	When I wrote the first version of these routines back in 1990, MD5
> +	did not exist but I feel these routines are still sound.  This
> +	routines is compatible with the one in MIT's libdes.
> +	
> +void des_string_to_2keys(
> +char *str,
> +des_cblock *key1,
> +des_cblock *key2);
> +	This function takes str and converts it into 2 DES keys.
> +	I would recommend using MD5 and using the 16 bytes as the 2 keys.
> +	I have nothing against these 2 'string_to_key' routines, it's just
> +	that if you say that your encryption key is generated by using the
> +	16 bytes of an MD5 hash, every-one knows how you generated your
> +	keys.
> +
> +int des_read_password(
> +des_cblock *key,
> +char *prompt,
> +int verify);
> +	This routine combines des_read_pw_string() with des_string_to_key().
> +
> +int des_read_2passwords(
> +des_cblock *key1,
> +des_cblock *key2,
> +char *prompt,
> +int verify);
> +	This routine combines des_read_pw_string() with des_string_to_2key().
> +
> +void des_random_seed(
> +des_cblock key);
> +	This routine sets a starting point for des_random_key().
> +	
> +void des_random_key(
> +des_cblock ret);
> +	This function return a random key.  Make sure to 'seed' the random
> +	number generator (with des_random_seed()) before using this function.
> +	I personally now use a MD5 based random number system.
> +
> +int des_enc_read(
> +int fd,
> +char *buf,
> +int len,
> +des_key_schedule ks,
> +des_cblock *iv);
> +	This function will write to a file descriptor the encrypted data
> +	from buf.  This data will be preceded by a 4 byte 'byte count' and
> +	will be padded out to 8 bytes.  The encryption is either CBC of
> +	PCBC depending on the value of des_rw_mode.  If it is DES_PCBC_MODE,
> +	pcbc is used, if DES_CBC_MODE, cbc is used.  The default is to use
> +	DES_PCBC_MODE.
> +
> +int des_enc_write(
> +int fd,
> +char *buf,
> +int len,
> +des_key_schedule ks,
> +des_cblock *iv);
> +	This routines read stuff written by des_enc_read() and decrypts it.
> +	I have used these routines quite a lot but I don't believe they are
> +	suitable for non-blocking io.  If you are after a full
> +	authentication/encryption over networks, have a look at SSL instead.
> +
> +unsigned long des_quad_cksum(
> +des_cblock *input,
> +des_cblock *output,
> +long length,
> +int out_count,
> +des_cblock *seed);
> +	This is a function from Kerberos v4 that is not anything to do with
> +	DES but was needed.  It is a cksum that is quicker to generate than
> +	des_cbc_cksum();  I personally would use MD5 routines now.
> +=====
> +Modes of DES
> +Quite a bit of the following information has been taken from
> +	AS 2805.5.2
> +	Australian Standard
> +	Electronic funds transfer - Requirements for interfaces,
> +	Part 5.2: Modes of operation for an n-bit block cipher algorithm
> +	Appendix A
> +
> +There are several different modes in which DES can be used, they are
> +as follows.
> +
> +Electronic Codebook Mode (ECB) (des_ecb_encrypt())
> +- 64 bits are enciphered at a time.
> +- The order of the blocks can be rearranged without detection.
> +- The same plaintext block always produces the same ciphertext block
> +  (for the same key) making it vulnerable to a 'dictionary attack'.
> +- An error will only affect one ciphertext block.
> +
> +Cipher Block Chaining Mode (CBC) (des_cbc_encrypt())
> +- a multiple of 64 bits are enciphered at a time.
> +- The CBC mode produces the same ciphertext whenever the same
> +  plaintext is encrypted using the same key and starting variable.
> +- The chaining operation makes the ciphertext blocks dependent on the
> +  current and all preceding plaintext blocks and therefore blocks can not
> +  be rearranged.
> +- The use of different starting variables prevents the same plaintext
> +  enciphering to the same ciphertext.
> +- An error will affect the current and the following ciphertext blocks.
> +
> +Cipher Feedback Mode (CFB) (des_cfb_encrypt())
> +- a number of bits (j) <= 64 are enciphered at a time.
> +- The CFB mode produces the same ciphertext whenever the same
> +  plaintext is encrypted using the same key and starting variable.
> +- The chaining operation makes the ciphertext variables dependent on the
> +  current and all preceding variables and therefore j-bit variables are
> +  chained together and can not be rearranged.
> +- The use of different starting variables prevents the same plaintext
> +  enciphering to the same ciphertext.
> +- The strength of the CFB mode depends on the size of k (maximal if
> +  j == k).  In my implementation this is always the case.
> +- Selection of a small value for j will require more cycles through
> +  the encipherment algorithm per unit of plaintext and thus cause
> +  greater processing overheads.
> +- Only multiples of j bits can be enciphered.
> +- An error will affect the current and the following ciphertext variables.
> +
> +Output Feedback Mode (OFB) (des_ofb_encrypt())
> +- a number of bits (j) <= 64 are enciphered at a time.
> +- The OFB mode produces the same ciphertext whenever the same
> +  plaintext enciphered using the same key and starting variable.  More
> +  over, in the OFB mode the same key stream is produced when the same
> +  key and start variable are used.  Consequently, for security reasons
> +  a specific start variable should be used only once for a given key.
> +- The absence of chaining makes the OFB more vulnerable to specific attacks.
> +- The use of different start variables values prevents the same
> +  plaintext enciphering to the same ciphertext, by producing different
> +  key streams.
> +- Selection of a small value for j will require more cycles through
> +  the encipherment algorithm per unit of plaintext and thus cause
> +  greater processing overheads.
> +- Only multiples of j bits can be enciphered.
> +- OFB mode of operation does not extend ciphertext errors in the
> +  resultant plaintext output.  Every bit error in the ciphertext causes
> +  only one bit to be in error in the deciphered plaintext.
> +- OFB mode is not self-synchronising.  If the two operation of
> +  encipherment and decipherment get out of synchronism, the system needs
> +  to be re-initialised.
> +- Each re-initialisation should use a value of the start variable
> + different from the start variable values used before with the same
> + key.  The reason for this is that an identical bit stream would be
> + produced each time from the same parameters.  This would be
> + susceptible to a ' known plaintext' attack.
> +
> +Triple ECB Mode (des_ecb3_encrypt())
> +- Encrypt with key1, decrypt with key2 and encrypt with key3 again.
> +- As for ECB encryption but increases the key length to 168 bits.
> +  There are theoretic attacks that can be used that make the effective
> +  key length 112 bits, but this attack also requires 2^56 blocks of
> +  memory, not very likely, even for the NSA.
> +- If both keys are the same it is equivalent to encrypting once with
> +  just one key.
> +- If the first and last key are the same, the key length is 112 bits.
> +  There are attacks that could reduce the key space to 55 bit's but it
> +  requires 2^56 blocks of memory.
> +- If all 3 keys are the same, this is effectively the same as normal
> +  ecb mode.
> +
> +Triple CBC Mode (des_ede3_cbc_encrypt())
> +- Encrypt with key1, decrypt with key2 and then encrypt with key3.
> +- As for CBC encryption but increases the key length to 168 bits with
> +  the same restrictions as for triple ecb mode.
> diff -Naur linux/cryptolib/libdes/des_crypt.man linux-crypto/cryptolib/libdes/des_crypt.man
> --- linux/cryptolib/libdes/des_crypt.man	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/cryptolib/libdes/des_crypt.man	Tue Aug 27 11:20:55 2002
> @@ -0,0 +1,508 @@
> +.TH DES_CRYPT 3 
> +.SH NAME
> +des_read_password, des_read_2password,
> +des_string_to_key, des_string_to_2key, des_read_pw_string,
> +des_random_key, des_set_key,
> +des_key_sched, des_ecb_encrypt, des_ecb3_encrypt, des_cbc_encrypt,
> +des_3cbc_encrypt,
> +des_pcbc_encrypt, des_cfb_encrypt, des_ofb_encrypt,
> +des_cbc_cksum, des_quad_cksum,
> +des_enc_read, des_enc_write, des_set_odd_parity,
> +des_is_weak_key, crypt \- (non USA) DES encryption
> +.SH SYNOPSIS
> +.nf
> +.nj
> +.ft B
> +#include <des.h>
> +.PP
> +.B int des_read_password(key,prompt,verify)
> +des_cblock *key;
> +char *prompt;
> +int verify;
> +.PP
> +.B int des_read_2password(key1,key2,prompt,verify)
> +des_cblock *key1,*key2;
> +char *prompt;
> +int verify;
> +.PP
> +.B int des_string_to_key(str,key)
> +char *str;
> +des_cblock *key;
> +.PP
> +.B int des_string_to_2keys(str,key1,key2)
> +char *str;
> +des_cblock *key1,*key2;
> +.PP
> +.B int des_read_pw_string(buf,length,prompt,verify)
> +char *buf;
> +int length;
> +char *prompt;
> +int verify;
> +.PP
> +.B int des_random_key(key)
> +des_cblock *key;
> +.PP
> +.B int des_set_key(key,schedule)
> +des_cblock *key;
> +des_key_schedule schedule;
> +.PP
> +.B int des_key_sched(key,schedule)
> +des_cblock *key;
> +des_key_schedule schedule;
> +.PP
> +.B int des_ecb_encrypt(input,output,schedule,encrypt)
> +des_cblock *input;
> +des_cblock *output;
> +des_key_schedule schedule;
> +int encrypt;
> +.PP
> +.B int des_ecb3_encrypt(input,output,ks1,ks2,encrypt)
> +des_cblock *input;
> +des_cblock *output;
> +des_key_schedule ks1,ks2;
> +int encrypt;
> +.PP
> +.B int des_cbc_encrypt(input,output,length,schedule,ivec,encrypt)
> +des_cblock *input;
> +des_cblock *output;
> +long length;
> +des_key_schedule schedule;
> +des_cblock *ivec;
> +int encrypt;
> +.PP
> +.B int des_3cbc_encrypt(input,output,length,sk1,sk2,ivec1,ivec2,encrypt)
> +des_cblock *input;
> +des_cblock *output;
> +long length;
> +des_key_schedule sk1;
> +des_key_schedule sk2;
> +des_cblock *ivec1;
> +des_cblock *ivec2;
> +int encrypt;
> +.PP
> +.B int des_pcbc_encrypt(input,output,length,schedule,ivec,encrypt)
> +des_cblock *input;
> +des_cblock *output;
> +long length;
> +des_key_schedule schedule;
> +des_cblock *ivec;
> +int encrypt;
> +.PP
> +.B int des_cfb_encrypt(input,output,numbits,length,schedule,ivec,encrypt)
> +unsigned char *input;
> +unsigned char *output;
> +int numbits;
> +long length;
> +des_key_schedule schedule;
> +des_cblock *ivec;
> +int encrypt;
> +.PP
> +.B int des_ofb_encrypt(input,output,numbits,length,schedule,ivec)
> +unsigned char *input,*output;
> +int numbits;
> +long length;
> +des_key_schedule schedule;
> +des_cblock *ivec;
> +.PP
> +.B unsigned long des_cbc_cksum(input,output,length,schedule,ivec)
> +des_cblock *input;
> +des_cblock *output;
> +long length;
> +des_key_schedule schedule;
> +des_cblock *ivec;
> +.PP
> +.B unsigned long des_quad_cksum(input,output,length,out_count,seed)
> +des_cblock *input;
> +des_cblock *output;
> +long length;
> +int out_count;
> +des_cblock *seed;
> +.PP
> +.B int des_check_key;
> +.PP
> +.B int des_enc_read(fd,buf,len,sched,iv)
> +int fd;
> +char *buf;
> +int len;
> +des_key_schedule sched;
> +des_cblock *iv;
> +.PP
> +.B int des_enc_write(fd,buf,len,sched,iv)
> +int fd;
> +char *buf;
> +int len;
> +des_key_schedule sched;
> +des_cblock *iv;
> +.PP
> +.B extern int des_rw_mode;
> +.PP
> +.B void des_set_odd_parity(key)
> +des_cblock *key;
> +.PP
> +.B int des_is_weak_key(key)
> +des_cblock *key;
> +.PP
> +.B char *crypt(passwd,salt)
> +char *passwd;
> +char *salt;
> +.PP
> +.fi
> +.SH DESCRIPTION
> +This library contains a fast implementation of the DES encryption
> +algorithm.
> +.PP
> +There are two phases to the use of DES encryption.
> +The first is the generation of a
> +.I des_key_schedule
> +from a key,
> +the second is the actual encryption.
> +A des key is of type
> +.I des_cblock.
> +This type is made from 8 characters with odd parity.
> +The least significant bit in the character is the parity bit.
> +The key schedule is an expanded form of the key; it is used to speed the
> +encryption process.
> +.PP
> +.I des_read_password
> +writes the string specified by prompt to the standard output,
> +turns off echo and reads an input string from standard input
> +until terminated with a newline.
> +If verify is non-zero, it prompts and reads the input again and verifies
> +that both entered passwords are the same.
> +The entered string is converted into a des key by using the
> +.I des_string_to_key
> +routine.
> +The new key is placed in the
> +.I des_cblock
> +that was passed (by reference) to the routine.
> +If there were no errors,
> +.I des_read_password
> +returns 0,
> +-1 is returned if there was a terminal error and 1 is returned for
> +any other error.
> +.PP
> +.I des_read_2password
> +operates in the same way as
> +.I des_read_password
> +except that it generates 2 keys by using the
> +.I des_string_to_2key
> +function.
> +.PP
> +.I des_read_pw_string
> +is called by
> +.I des_read_password
> +to read and verify a string from a terminal device.
> +The string is returned in
> +.I buf.
> +The size of
> +.I buf
> +is passed to the routine via the
> +.I length
> +parameter.
> +.PP
> +.I des_string_to_key
> +converts a string into a valid des key.
> +.PP
> +.I des_string_to_2key
> +converts a string into 2 valid des keys.
> +This routine is best suited for used to generate keys for use with
> +.I des_ecb3_encrypt.
> +.PP
> +.I des_random_key
> +returns a random key that is made of a combination of process id,
> +time and an increasing counter.
> +.PP
> +Before a des key can be used it is converted into a
> +.I des_key_schedule
> +via the
> +.I des_set_key
> +routine.
> +If the
> +.I des_check_key
> +flag is non-zero,
> +.I des_set_key
> +will check that the key passed is of odd parity and is not a week or
> +semi-weak key.
> +If the parity is wrong,
> +then -1 is returned.
> +If the key is a weak key,
> +then -2 is returned.
> +If an error is returned,
> +the key schedule is not generated.
> +.PP
> +.I des_key_sched
> +is another name for the
> +.I des_set_key
> +function.
> +.PP
> +The following routines mostly operate on an input and output stream of
> +.I des_cblock's.
> +.PP
> +.I des_ecb_encrypt
> +is the basic DES encryption routine that encrypts or decrypts a single 8-byte
> +.I des_cblock
> +in
> +.I electronic code book
> +mode.
> +It always transforms the input data, pointed to by
> +.I input,
> +into the output data,
> +pointed to by the
> +.I output
> +argument.
> +If the
> +.I encrypt
> +argument is non-zero (DES_ENCRYPT),
> +the
> +.I input
> +(cleartext) is encrypted in to the
> +.I output
> +(ciphertext) using the key_schedule specified by the
> +.I schedule
> +argument,
> +previously set via
> +.I des_set_key.
> +If
> +.I encrypt
> +is zero (DES_DECRYPT),
> +the
> +.I input
> +(now ciphertext)
> +is decrypted into the
> +.I output
> +(now cleartext).
> +Input and output may overlap.
> +No meaningful value is returned.
> +.PP
> +.I des_ecb3_encrypt
> +encrypts/decrypts the
> +.I input
> +block by using triple ecb DES encryption.
> +This involves encrypting the input with 
> +.I ks1,
> +decryption with the key schedule
> +.I ks2,
> +and then encryption with the first again.
> +This routine greatly reduces the chances of brute force breaking of
> +DES and has the advantage of if
> +.I ks1
> +and
> +.I ks2
> +are the same, it is equivalent to just encryption using ecb mode and
> +.I ks1
> +as the key.
> +.PP
> +.I des_cbc_encrypt
> +encrypts/decrypts using the
> +.I cipher-block-chaining
> +mode of DES.
> +If the
> +.I encrypt
> +argument is non-zero,
> +the routine cipher-block-chain encrypts the cleartext data pointed to by the
> +.I input
> +argument into the ciphertext pointed to by the
> +.I output
> +argument,
> +using the key schedule provided by the
> +.I schedule
> +argument,
> +and initialisation vector provided by the
> +.I ivec
> +argument.
> +If the
> +.I length
> +argument is not an integral multiple of eight bytes, 
> +the last block is copied to a temporary area and zero filled.
> +The output is always
> +an integral multiple of eight bytes.
> +To make multiple cbc encrypt calls on a large amount of data appear to
> +be one 
> +.I des_cbc_encrypt
> +call, the
> +.I ivec
> +of subsequent calls should be the last 8 bytes of the output.
> +.PP
> +.I des_3cbc_encrypt
> +encrypts/decrypts the
> +.I input
> +block by using triple cbc DES encryption.
> +This involves encrypting the input with key schedule
> +.I ks1,
> +decryption with the key schedule
> +.I ks2,
> +and then encryption with the first again.
> +2 initialisation vectors are required,
> +.I ivec1
> +and
> +.I ivec2.
> +Unlike
> +.I des_cbc_encrypt,
> +these initialisation vectors are modified by the subroutine.
> +This routine greatly reduces the chances of brute force breaking of
> +DES and has the advantage of if
> +.I ks1
> +and
> +.I ks2
> +are the same, it is equivalent to just encryption using cbc mode and
> +.I ks1
> +as the key.
> +.PP
> +.I des_pcbc_encrypt
> +encrypt/decrypts using a modified block chaining mode.
> +It provides better error propagation characteristics than cbc
> +encryption.
> +.PP
> +.I des_cfb_encrypt
> +encrypt/decrypts using cipher feedback mode.  This method takes an
> +array of characters as input and outputs and array of characters.  It
> +does not require any padding to 8 character groups.  Note: the ivec
> +variable is changed and the new changed value needs to be passed to
> +the next call to this function.  Since this function runs a complete
> +DES ecb encryption per numbits, this function is only suggested for
> +use when sending small numbers of characters.
> +.PP
> +.I des_ofb_encrypt
> +encrypt using output feedback mode.  This method takes an
> +array of characters as input and outputs and array of characters.  It
> +does not require any padding to 8 character groups.  Note: the ivec
> +variable is changed and the new changed value needs to be passed to
> +the next call to this function.  Since this function runs a complete
> +DES ecb encryption per numbits, this function is only suggested for
> +use when sending small numbers of characters.
> +.PP
> +.I des_cbc_cksum
> +produces an 8 byte checksum based on the input stream (via cbc encryption).
> +The last 4 bytes of the checksum is returned and the complete 8 bytes is
> +placed in
> +.I output.
> +.PP
> +.I des_quad_cksum
> +returns a 4 byte checksum from the input bytes.
> +The algorithm can be iterated over the input,
> +depending on
> +.I out_count,
> +1, 2, 3 or 4 times.
> +If
> +.I output
> +is non-NULL,
> +the 8 bytes generated by each pass are written into
> +.I output.
> +.PP
> +.I des_enc_write
> +is used to write
> +.I len
> +bytes
> +to file descriptor
> +.I fd
> +from buffer
> +.I buf.
> +The data is encrypted via
> +.I pcbc_encrypt
> +(default) using
> +.I sched
> +for the key and
> +.I iv
> +as a starting vector.
> +The actual data send down
> +.I fd
> +consists of 4 bytes (in network byte order) containing the length of the
> +following encrypted data.  The encrypted data then follows, padded with random
> +data out to a multiple of 8 bytes.
> +.PP
> +.I des_enc_read
> +is used to read
> +.I len
> +bytes
> +from file descriptor
> +.I fd
> +into buffer
> +.I buf.
> +The data being read from
> +.I fd
> +is assumed to have come from
> +.I des_enc_write
> +and is decrypted using
> +.I sched
> +for the key schedule and
> +.I iv
> +for the initial vector.
> +The
> +.I des_enc_read/des_enc_write
> +pair can be used to read/write to files, pipes and sockets.
> +I have used them in implementing a version of rlogin in which all
> +data is encrypted.
> +.PP
> +.I des_rw_mode
> +is used to specify the encryption mode to use with 
> +.I des_enc_read
> +and 
> +.I des_end_write.
> +If set to
> +.I DES_PCBC_MODE
> +(the default), des_pcbc_encrypt is used.
> +If set to
> +.I DES_CBC_MODE
> +des_cbc_encrypt is used.
> +These two routines and the variable are not part of the normal MIT library.
> +.PP
> +.I des_set_odd_parity
> +sets the parity of the passed
> +.I key
> +to odd.  This routine is not part of the standard MIT library.
> +.PP
> +.I des_is_weak_key
> +returns 1 is the passed key is a weak key (pick again :-),
> +0 if it is ok.
> +This routine is not part of the standard MIT library.
> +.PP
> +.I crypt
> +is a replacement for the normal system crypt.
> +It is much faster than the system crypt.
> +.PP
> +.SH FILES
> +/usr/include/des.h
> +.br
> +/usr/lib/libdes.a
> +.PP
> +The encryption routines have been tested on 16bit, 32bit and 64bit
> +machines of various endian and even works under VMS.
> +.PP
> +.SH BUGS
> +.PP
> +If you think this manual is sparse,
> +read the des_crypt(3) manual from the MIT kerberos (or bones outside
> +of the USA) distribution.
> +.PP
> +.I des_cfb_encrypt
> +and
> +.I des_ofb_encrypt
> +operates on input of 8 bits.  What this means is that if you set
> +numbits to 12, and length to 2, the first 12 bits will come from the 1st
> +input byte and the low half of the second input byte.  The second 12
> +bits will have the low 8 bits taken from the 3rd input byte and the
> +top 4 bits taken from the 4th input byte.  The same holds for output.
> +This function has been implemented this way because most people will
> +be using a multiple of 8 and because once you get into pulling bytes input
> +bytes apart things get ugly!
> +.PP
> +.I des_read_pw_string
> +is the most machine/OS dependent function and normally generates the
> +most problems when porting this code.
> +.PP
> +.I des_string_to_key
> +is probably different from the MIT version since there are lots
> +of fun ways to implement one-way encryption of a text string.
> +.PP
> +The routines are optimised for 32 bit machines and so are not efficient
> +on IBM PCs.
> +.PP
> +NOTE: extensive work has been done on this library since this document
> +was origionally written.  Please try to read des.doc from the libdes
> +distribution since it is far more upto date and documents more of the
> +functions.  Libdes is now also being shipped as part of SSLeay, a
> +general cryptographic library that amonst other things implements
> +netscapes SSL protocoll.  The most recent version can be found in
> +SSLeay distributions.
> +.SH AUTHOR
> +Eric Young ([email protected])
> diff -Naur linux/cryptolib/libdes/des_enc.c linux-crypto/cryptolib/libdes/des_enc.c
> --- linux/cryptolib/libdes/des_enc.c	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/cryptolib/libdes/des_enc.c	Tue Aug 27 11:20:55 2002
> @@ -0,0 +1,502 @@
> +/* crypto/des/des_enc.c */
> +/* Copyright (C) 1995-1997 Eric Young ([email protected])
> + * All rights reserved.
> + *
> + * This package is an SSL implementation written
> + * by Eric Young ([email protected]).
> + * The implementation was written so as to conform with Netscapes SSL.
> + * 
> + * This library is free for commercial and non-commercial use as long as
> + * the following conditions are aheared to.  The following conditions
> + * apply to all code found in this distribution, be it the RC4, RSA,
> + * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
> + * included with this distribution is covered by the same copyright terms
> + * except that the holder is Tim Hudson ([email protected]).
> + * 
> + * Copyright remains Eric Young's, and as such any Copyright notices in
> + * the code are not to be removed.
> + * If this package is used in a product, Eric Young should be given attribution
> + * as the author of the parts of the library used.
> + * This can be in the form of a textual message at program startup or
> + * in documentation (online or textual) provided with the package.
> + * 
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the copyright
> + *    notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + *    notice, this list of conditions and the following disclaimer in the
> + *    documentation and/or other materials provided with the distribution.
> + * 3. All advertising materials mentioning features or use of this software
> + *    must display the following acknowledgement:
> + *    "This product includes cryptographic software written by
> + *     Eric Young ([email protected])"
> + *    The word 'cryptographic' can be left out if the rouines from the library
> + *    being used are not cryptographic related :-).
> + * 4. If you include any Windows specific code (or a derivative thereof) from 
> + *    the apps directory (application code) you must include an acknowledgement:
> + *    "This product includes software written by Tim Hudson ([email protected])"
> + * 
> + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + * 
> + * The licence and distribution terms for any publically available version or
> + * derivative of this code cannot be changed.  i.e. this code cannot simply be
> + * copied and put under another distribution licence
> + * [including the GNU Public Licence.]
> + */
> +
> +#include <linux/des_locl.h>
> +
> +void des_encrypt(data, ks, enc)
> +DES_LONG *data;
> +des_key_schedule ks;
> +int enc;
> +	{
> +	register DES_LONG l,r,t,u;
> +#ifdef DES_PTR
> +	register unsigned char *des_SP=(unsigned char *)des_SPtrans;
> +#endif
> +#ifndef DES_UNROLL
> +	register int i;
> +#endif
> +	register DES_LONG *s;
> +
> +	r=data[0];
> +	l=data[1];
> +
> +	IP(r,l);
> +	/* 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 <[email protected]>
> +	 * for pointing this out. */
> +	/* clear the top bits on machines with 8byte longs */
> +	/* shift left by 2 */
> +	r=ROTATE(r,29)&0xffffffffL;
> +	l=ROTATE(l,29)&0xffffffffL;
> +
> +	s=(DES_LONG *)ks;
> +	/* I don't know if it is worth the effort of loop unrolling the
> +	 * inner loop */
> +	if (enc)
> +		{
> +#ifdef DES_UNROLL
> +		D_ENCRYPT(l,r, 0); /*  1 */
> +		D_ENCRYPT(r,l, 2); /*  2 */
> +		D_ENCRYPT(l,r, 4); /*  3 */
> +		D_ENCRYPT(r,l, 6); /*  4 */
> +		D_ENCRYPT(l,r, 8); /*  5 */
> +		D_ENCRYPT(r,l,10); /*  6 */
> +		D_ENCRYPT(l,r,12); /*  7 */
> +		D_ENCRYPT(r,l,14); /*  8 */
> +		D_ENCRYPT(l,r,16); /*  9 */
> +		D_ENCRYPT(r,l,18); /*  10 */
> +		D_ENCRYPT(l,r,20); /*  11 */
> +		D_ENCRYPT(r,l,22); /*  12 */
> +		D_ENCRYPT(l,r,24); /*  13 */
> +		D_ENCRYPT(r,l,26); /*  14 */
> +		D_ENCRYPT(l,r,28); /*  15 */
> +		D_ENCRYPT(r,l,30); /*  16 */
> +#else
> +		for (i=0; i<32; i+=8)
> +			{
> +			D_ENCRYPT(l,r,i+0); /*  1 */
> +			D_ENCRYPT(r,l,i+2); /*  2 */
> +			D_ENCRYPT(l,r,i+4); /*  3 */
> +			D_ENCRYPT(r,l,i+6); /*  4 */
> +			}
> +#endif
> +		}
> +	else
> +		{
> +#ifdef DES_UNROLL
> +		D_ENCRYPT(l,r,30); /* 16 */
> +		D_ENCRYPT(r,l,28); /* 15 */
> +		D_ENCRYPT(l,r,26); /* 14 */
> +		D_ENCRYPT(r,l,24); /* 13 */
> +		D_ENCRYPT(l,r,22); /* 12 */
> +		D_ENCRYPT(r,l,20); /* 11 */
> +		D_ENCRYPT(l,r,18); /* 10 */
> +		D_ENCRYPT(r,l,16); /*  9 */
> +		D_ENCRYPT(l,r,14); /*  8 */
> +		D_ENCRYPT(r,l,12); /*  7 */
> +		D_ENCRYPT(l,r,10); /*  6 */
> +		D_ENCRYPT(r,l, 8); /*  5 */
> +		D_ENCRYPT(l,r, 6); /*  4 */
> +		D_ENCRYPT(r,l, 4); /*  3 */
> +		D_ENCRYPT(l,r, 2); /*  2 */
> +		D_ENCRYPT(r,l, 0); /*  1 */
> +#else
> +		for (i=30; i>0; i-=8)
> +			{
> +			D_ENCRYPT(l,r,i-0); /* 16 */
> +			D_ENCRYPT(r,l,i-2); /* 15 */
> +			D_ENCRYPT(l,r,i-4); /* 14 */
> +			D_ENCRYPT(r,l,i-6); /* 13 */
> +			}
> +#endif
> +		}
> +
> +	/* rotate and clear the top bits on machines with 8byte longs */
> +	l=ROTATE(l,3)&0xffffffffL;
> +	r=ROTATE(r,3)&0xffffffffL;
> +
> +	FP(r,l);
> +	data[0]=l;
> +	data[1]=r;
> +	l=r=t=u=0;
> +	}
> +
> +void des_encrypt2(data, ks, enc)
> +DES_LONG *data;
> +des_key_schedule ks;
> +int enc;
> +	{
> +	register DES_LONG l,r,t,u;
> +#ifdef DES_PTR
> +	register unsigned char *des_SP=(unsigned char *)des_SPtrans;
> +#endif
> +#ifndef DES_UNROLL
> +	register int i;
> +#endif
> +	register DES_LONG *s;
> +
> +	r=data[0];
> +	l=data[1];
> +
> +	/* 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 <[email protected]>
> +	 * for pointing this out. */
> +	/* clear the top bits on machines with 8byte longs */
> +	r=ROTATE(r,29)&0xffffffffL;
> +	l=ROTATE(l,29)&0xffffffffL;
> +
> +	s=(DES_LONG *)ks;
> +	/* I don't know if it is worth the effort of loop unrolling the
> +	 * inner loop */
> +	if (enc)
> +		{
> +#ifdef DES_UNROLL
> +		D_ENCRYPT(l,r, 0); /*  1 */
> +		D_ENCRYPT(r,l, 2); /*  2 */
> +		D_ENCRYPT(l,r, 4); /*  3 */
> +		D_ENCRYPT(r,l, 6); /*  4 */
> +		D_ENCRYPT(l,r, 8); /*  5 */
> +		D_ENCRYPT(r,l,10); /*  6 */
> +		D_ENCRYPT(l,r,12); /*  7 */
> +		D_ENCRYPT(r,l,14); /*  8 */
> +		D_ENCRYPT(l,r,16); /*  9 */
> +		D_ENCRYPT(r,l,18); /*  10 */
> +		D_ENCRYPT(l,r,20); /*  11 */
> +		D_ENCRYPT(r,l,22); /*  12 */
> +		D_ENCRYPT(l,r,24); /*  13 */
> +		D_ENCRYPT(r,l,26); /*  14 */
> +		D_ENCRYPT(l,r,28); /*  15 */
> +		D_ENCRYPT(r,l,30); /*  16 */
> +#else
> +		for (i=0; i<32; i+=8)
> +			{
> +			D_ENCRYPT(l,r,i+0); /*  1 */
> +			D_ENCRYPT(r,l,i+2); /*  2 */
> +			D_ENCRYPT(l,r,i+4); /*  3 */
> +			D_ENCRYPT(r,l,i+6); /*  4 */
> +			}
> +#endif
> +		}
> +	else
> +		{
> +#ifdef DES_UNROLL
> +		D_ENCRYPT(l,r,30); /* 16 */
> +		D_ENCRYPT(r,l,28); /* 15 */
> +		D_ENCRYPT(l,r,26); /* 14 */
> +		D_ENCRYPT(r,l,24); /* 13 */
> +		D_ENCRYPT(l,r,22); /* 12 */
> +		D_ENCRYPT(r,l,20); /* 11 */
> +		D_ENCRYPT(l,r,18); /* 10 */
> +		D_ENCRYPT(r,l,16); /*  9 */
> +		D_ENCRYPT(l,r,14); /*  8 */
> +		D_ENCRYPT(r,l,12); /*  7 */
> +		D_ENCRYPT(l,r,10); /*  6 */
> +		D_ENCRYPT(r,l, 8); /*  5 */
> +		D_ENCRYPT(l,r, 6); /*  4 */
> +		D_ENCRYPT(r,l, 4); /*  3 */
> +		D_ENCRYPT(l,r, 2); /*  2 */
> +		D_ENCRYPT(r,l, 0); /*  1 */
> +#else
> +		for (i=30; i>0; i-=8)
> +			{
> +			D_ENCRYPT(l,r,i-0); /* 16 */
> +			D_ENCRYPT(r,l,i-2); /* 15 */
> +			D_ENCRYPT(l,r,i-4); /* 14 */
> +			D_ENCRYPT(r,l,i-6); /* 13 */
> +			}
> +#endif
> +		}
> +	/* rotate and clear the top bits on machines with 8byte longs */
> +	data[0]=ROTATE(l,3)&0xffffffffL;
> +	data[1]=ROTATE(r,3)&0xffffffffL;
> +	l=r=t=u=0;
> +	}
> +
> +void des_encrypt3(data,ks1,ks2,ks3)
> +DES_LONG *data;
> +des_key_schedule ks1;
> +des_key_schedule ks2;
> +des_key_schedule ks3;
> +	{
> +	register DES_LONG l,r;
> +
> +	l=data[0];
> +	r=data[1];
> +	IP(l,r);
> +	data[0]=l;
> +	data[1]=r;
> +	des_encrypt2((DES_LONG *)data,ks1,DES_ENCRYPT);
> +	des_encrypt2((DES_LONG *)data,ks2,DES_DECRYPT);
> +	des_encrypt2((DES_LONG *)data,ks3,DES_ENCRYPT);
> +	l=data[0];
> +	r=data[1];
> +	FP(r,l);
> +	data[0]=l;
> +	data[1]=r;
> +	}
> +
> +void des_decrypt3(data,ks1,ks2,ks3)
> +DES_LONG *data;
> +des_key_schedule ks1;
> +des_key_schedule ks2;
> +des_key_schedule ks3;
> +	{
> +	register DES_LONG l,r;
> +
> +	l=data[0];
> +	r=data[1];
> +	IP(l,r);
> +	data[0]=l;
> +	data[1]=r;
> +	des_encrypt2((DES_LONG *)data,ks3,DES_DECRYPT);
> +	des_encrypt2((DES_LONG *)data,ks2,DES_ENCRYPT);
> +	des_encrypt2((DES_LONG *)data,ks1,DES_DECRYPT);
> +	l=data[0];
> +	r=data[1];
> +	FP(r,l);
> +	data[0]=l;
> +	data[1]=r;
> +	}
> +
> +#ifndef DES_DEFAULT_OPTIONS
> +
> +void des_ncbc_encrypt(input, output, length, schedule, ivec, enc)
> +des_cblock (*input);
> +des_cblock (*output);
> +long length;
> +des_key_schedule schedule;
> +des_cblock (*ivec);
> +int enc;
> +	{
> +	register DES_LONG tin0,tin1;
> +	register DES_LONG tout0,tout1,xor0,xor1;
> +	register unsigned char *in,*out;
> +	register long l=length;
> +	DES_LONG tin[2];
> +	unsigned char *iv;
> +
> +	in=(unsigned char *)input;
> +	out=(unsigned char *)output;
> +	iv=(unsigned char *)ivec;
> +
> +	if (enc)
> +		{
> +		c2l(iv,tout0);
> +		c2l(iv,tout1);
> +		for (l-=8; l>=0; l-=8)
> +			{
> +			c2l(in,tin0);
> +			c2l(in,tin1);
> +			tin0^=tout0; tin[0]=tin0;
> +			tin1^=tout1; tin[1]=tin1;
> +			des_encrypt((DES_LONG *)tin,schedule,DES_ENCRYPT);
> +			tout0=tin[0]; l2c(tout0,out);
> +			tout1=tin[1]; l2c(tout1,out);
> +			}
> +		if (l != -8)
> +			{
> +			c2ln(in,tin0,tin1,l+8);
> +			tin0^=tout0; tin[0]=tin0;
> +			tin1^=tout1; tin[1]=tin1;
> +			des_encrypt((DES_LONG *)tin,schedule,DES_ENCRYPT);
> +			tout0=tin[0]; l2c(tout0,out);
> +			tout1=tin[1]; l2c(tout1,out);
> +			}
> +		iv=(unsigned char *)ivec;
> +		l2c(tout0,iv);
> +		l2c(tout1,iv);
> +		}
> +	else
> +		{
> +		c2l(iv,xor0);
> +		c2l(iv,xor1);
> +		for (l-=8; l>=0; l-=8)
> +			{
> +			c2l(in,tin0); tin[0]=tin0;
> +			c2l(in,tin1); tin[1]=tin1;
> +			des_encrypt((DES_LONG *)tin,schedule,DES_DECRYPT);
> +			tout0=tin[0]^xor0;
> +			tout1=tin[1]^xor1;
> +			l2c(tout0,out);
> +			l2c(tout1,out);
> +			xor0=tin0;
> +			xor1=tin1;
> +			}
> +		if (l != -8)
> +			{
> +			c2l(in,tin0); tin[0]=tin0;
> +			c2l(in,tin1); tin[1]=tin1;
> +			des_encrypt((DES_LONG *)tin,schedule,DES_DECRYPT);
> +			tout0=tin[0]^xor0;
> +			tout1=tin[1]^xor1;
> +			l2cn(tout0,tout1,out,l+8);
> +			xor0=tin0;
> +			xor1=tin1;
> +			}
> +
> +		iv=(unsigned char *)ivec;
> +		l2c(xor0,iv);
> +		l2c(xor1,iv);
> +		}
> +	tin0=tin1=tout0=tout1=xor0=xor1=0;
> +	tin[0]=tin[1]=0;
> +	}
> +
> +void des_ede3_cbc_encrypt(input, output, length, ks1, ks2, ks3, ivec, enc)
> +des_cblock (*input);
> +des_cblock (*output);
> +long length;
> +des_key_schedule ks1;
> +des_key_schedule ks2;
> +des_key_schedule ks3;
> +des_cblock (*ivec);
> +int enc;
> +	{
> +	register DES_LONG tin0,tin1;
> +	register DES_LONG tout0,tout1,xor0,xor1;
> +	register unsigned char *in,*out;
> +	register long l=length;
> +	DES_LONG tin[2];
> +	unsigned char *iv;
> +
> +	in=(unsigned char *)input;
> +	out=(unsigned char *)output;
> +	iv=(unsigned char *)ivec;
> +
> +	if (enc)
> +		{
> +		c2l(iv,tout0);
> +		c2l(iv,tout1);
> +		for (l-=8; l>=0; l-=8)
> +			{
> +			c2l(in,tin0);
> +			c2l(in,tin1);
> +			tin0^=tout0;
> +			tin1^=tout1;
> +
> +			tin[0]=tin0;
> +			tin[1]=tin1;
> +			des_encrypt3((DES_LONG *)tin,ks1,ks2,ks3);
> +			tout0=tin[0];
> +			tout1=tin[1];
> +
> +			l2c(tout0,out);
> +			l2c(tout1,out);
> +			}
> +		if (l != -8)
> +			{
> +			c2ln(in,tin0,tin1,l+8);
> +			tin0^=tout0;
> +			tin1^=tout1;
> +
> +			tin[0]=tin0;
> +			tin[1]=tin1;
> +			des_encrypt3((DES_LONG *)tin,ks1,ks2,ks3);
> +			tout0=tin[0];
> +			tout1=tin[1];
> +
> +			l2c(tout0,out);
> +			l2c(tout1,out);
> +			}
> +		iv=(unsigned char *)ivec;
> +		l2c(tout0,iv);
> +		l2c(tout1,iv);
> +		}
> +	else
> +		{
> +		register DES_LONG t0,t1;
> +
> +		c2l(iv,xor0);
> +		c2l(iv,xor1);
> +		for (l-=8; l>=0; l-=8)
> +			{
> +			c2l(in,tin0);
> +			c2l(in,tin1);
> +
> +			t0=tin0;
> +			t1=tin1;
> +
> +			tin[0]=tin0;
> +			tin[1]=tin1;
> +			des_decrypt3((DES_LONG *)tin,ks1,ks2,ks3);
> +			tout0=tin[0];
> +			tout1=tin[1];
> +
> +			tout0^=xor0;
> +			tout1^=xor1;
> +			l2c(tout0,out);
> +			l2c(tout1,out);
> +			xor0=t0;
> +			xor1=t1;
> +			}
> +		if (l != -8)
> +			{
> +			c2l(in,tin0);
> +			c2l(in,tin1);
> +			
> +			t0=tin0;
> +			t1=tin1;
> +
> +			tin[0]=tin0;
> +			tin[1]=tin1;
> +			des_decrypt3((DES_LONG *)tin,ks1,ks2,ks3);
> +			tout0=tin[0];
> +			tout1=tin[1];
> +		
> +			tout0^=xor0;
> +			tout1^=xor1;
> +			l2cn(tout0,tout1,out,l+8);
> +			xor0=t0;
> +			xor1=t1;
> +			}
> +
> +		iv=(unsigned char *)ivec;
> +		l2c(xor0,iv);
> +		l2c(xor1,iv);
> +		}
> +	tin0=tin1=tout0=tout1=xor0=xor1=0;
> +	tin[0]=tin[1]=0;
> +	}
> +
> +#endif /* DES_DEFAULT_OPTIONS */
> diff -Naur linux/cryptolib/libdes/des_opts.c linux-crypto/cryptolib/libdes/des_opts.c
> --- linux/cryptolib/libdes/des_opts.c	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/cryptolib/libdes/des_opts.c	Tue Aug 27 11:20:55 2002
> @@ -0,0 +1,620 @@
> +/* crypto/des/des_opts.c */
> +/* Copyright (C) 1995-1997 Eric Young ([email protected])
> + * All rights reserved.
> + *
> + * This package is an SSL implementation written
> + * by Eric Young ([email protected]).
> + * The implementation was written so as to conform with Netscapes SSL.
> + * 
> + * This library is free for commercial and non-commercial use as long as
> + * the following conditions are aheared to.  The following conditions
> + * apply to all code found in this distribution, be it the RC4, RSA,
> + * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
> + * included with this distribution is covered by the same copyright terms
> + * except that the holder is Tim Hudson ([email protected]).
> + * 
> + * Copyright remains Eric Young's, and as such any Copyright notices in
> + * the code are not to be removed.
> + * If this package is used in a product, Eric Young should be given attribution
> + * as the author of the parts of the library used.
> + * This can be in the form of a textual message at program startup or
> + * in documentation (online or textual) provided with the package.
> + * 
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the copyright
> + *    notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + *    notice, this list of conditions and the following disclaimer in the
> + *    documentation and/or other materials provided with the distribution.
> + * 3. All advertising materials mentioning features or use of this software
> + *    must display the following acknowledgement:
> + *    "This product includes cryptographic software written by
> + *     Eric Young ([email protected])"
> + *    The word 'cryptographic' can be left out if the rouines from the library
> + *    being used are not cryptographic related :-).
> + * 4. If you include any Windows specific code (or a derivative thereof) from 
> + *    the apps directory (application code) you must include an acknowledgement:
> + *    "This product includes software written by Tim Hudson ([email protected])"
> + * 
> + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + * 
> + * The licence and distribution terms for any publically available version or
> + * derivative of this code cannot be changed.  i.e. this code cannot simply be
> + * copied and put under another distribution licence
> + * [including the GNU Public Licence.]
> + */
> +
> +/* define PART1, PART2, PART3 or PART4 to build only with a few of the options.
> + * This is for machines with 64k code segment size restrictions. */
> +
> +#ifndef MSDOS
> +#define TIMES
> +#endif
> +
> +#include <stdio.h>
> +#ifndef MSDOS
> +#include <unistd.h>
> +#else
> +#include <io.h>
> +extern void exit();
> +#endif
> +#include <signal.h>
> +#ifndef VMS
> +#ifndef _IRIX
> +#include <time.h>
> +#endif
> +#ifdef TIMES
> +#include <sys/types.h>
> +#include <sys/times.h>
> +#endif
> +#else /* VMS */
> +#include <types.h>
> +struct tms {
> +	time_t tms_utime;
> +	time_t tms_stime;
> +	time_t tms_uchild;	/* I dunno...  */
> +	time_t tms_uchildsys;	/* so these names are a guess :-) */
> +	}
> +#endif
> +#ifndef TIMES
> +#include <sys/timeb.h>
> +#endif
> +
> +#ifdef sun
> +#include <limits.h>
> +#include <sys/param.h>
> +#endif
> +
> +#include "des.h"
> +#include "spr.h"
> +
> +#define DES_DEFAULT_OPTIONS
> +
> +#if !defined(PART1) && !defined(PART2) && !defined(PART3) && !defined(PART4)
> +#define PART1
> +#define PART2
> +#define PART3
> +#define PART4
> +#endif
> +
> +#ifdef PART1
> +
> +#undef DES_UNROLL
> +#undef DES_RISC1
> +#undef DES_RISC2
> +#undef DES_PTR
> +#undef D_ENCRYPT
> +#define des_encrypt  des_encrypt_u4_cisc_idx
> +#define des_encrypt2 des_encrypt2_u4_cisc_idx
> +#define des_encrypt3 des_encrypt3_u4_cisc_idx
> +#define des_decrypt3 des_decrypt3_u4_cisc_idx
> +#undef HEADER_DES_LOCL_H
> +#include "des_enc.c"
> +
> +#define DES_UNROLL
> +#undef DES_RISC1
> +#undef DES_RISC2
> +#undef DES_PTR
> +#undef D_ENCRYPT
> +#undef des_encrypt
> +#undef des_encrypt2
> +#undef des_encrypt3
> +#undef des_decrypt3
> +#define des_encrypt  des_encrypt_u16_cisc_idx
> +#define des_encrypt2 des_encrypt2_u16_cisc_idx
> +#define des_encrypt3 des_encrypt3_u16_cisc_idx
> +#define des_decrypt3 des_decrypt3_u16_cisc_idx
> +#undef HEADER_DES_LOCL_H
> +#include "des_enc.c"
> +
> +#undef DES_UNROLL
> +#define DES_RISC1
> +#undef DES_RISC2
> +#undef DES_PTR
> +#undef D_ENCRYPT
> +#undef des_encrypt
> +#undef des_encrypt2
> +#undef des_encrypt3
> +#undef des_decrypt3
> +#define des_encrypt  des_encrypt_u4_risc1_idx
> +#define des_encrypt2 des_encrypt2_u4_risc1_idx
> +#define des_encrypt3 des_encrypt3_u4_risc1_idx
> +#define des_decrypt3 des_decrypt3_u4_risc1_idx
> +#undef HEADER_DES_LOCL_H
> +#include "des_enc.c"
> +
> +#endif
> +
> +#ifdef PART2
> +
> +#undef DES_UNROLL
> +#undef DES_RISC1
> +#define DES_RISC2
> +#undef DES_PTR
> +#undef D_ENCRYPT
> +#undef des_encrypt
> +#undef des_encrypt2
> +#undef des_encrypt3
> +#undef des_decrypt3
> +#define des_encrypt  des_encrypt_u4_risc2_idx
> +#define des_encrypt2 des_encrypt2_u4_risc2_idx
> +#define des_encrypt3 des_encrypt3_u4_risc2_idx
> +#define des_decrypt3 des_decrypt3_u4_risc2_idx
> +#undef HEADER_DES_LOCL_H
> +#include "des_enc.c"
> +
> +#define DES_UNROLL
> +#define DES_RISC1
> +#undef DES_RISC2
> +#undef DES_PTR
> +#undef D_ENCRYPT
> +#undef des_encrypt
> +#undef des_encrypt2
> +#undef des_encrypt3
> +#undef des_decrypt3
> +#define des_encrypt  des_encrypt_u16_risc1_idx
> +#define des_encrypt2 des_encrypt2_u16_risc1_idx
> +#define des_encrypt3 des_encrypt3_u16_risc1_idx
> +#define des_decrypt3 des_decrypt3_u16_risc1_idx
> +#undef HEADER_DES_LOCL_H
> +#include "des_enc.c"
> +
> +#define DES_UNROLL
> +#undef DES_RISC1
> +#define DES_RISC2
> +#undef DES_PTR
> +#undef D_ENCRYPT
> +#undef des_encrypt
> +#undef des_encrypt2
> +#undef des_encrypt3
> +#undef des_decrypt3
> +#define des_encrypt  des_encrypt_u16_risc2_idx
> +#define des_encrypt2 des_encrypt2_u16_risc2_idx
> +#define des_encrypt3 des_encrypt3_u16_risc2_idx
> +#define des_decrypt3 des_decrypt3_u16_risc2_idx
> +#undef HEADER_DES_LOCL_H
> +#include "des_enc.c"
> +
> +#endif
> +
> +#ifdef PART3
> +
> +#undef DES_UNROLL
> +#undef DES_RISC1
> +#undef DES_RISC2
> +#define DES_PTR
> +#undef D_ENCRYPT
> +#undef des_encrypt
> +#undef des_encrypt2
> +#undef des_encrypt3
> +#undef des_decrypt3
> +#define des_encrypt  des_encrypt_u4_cisc_ptr
> +#define des_encrypt2 des_encrypt2_u4_cisc_ptr
> +#define des_encrypt3 des_encrypt3_u4_cisc_ptr
> +#define des_decrypt3 des_decrypt3_u4_cisc_ptr
> +#undef HEADER_DES_LOCL_H
> +#include "des_enc.c"
> +
> +#define DES_UNROLL
> +#undef DES_RISC1
> +#undef DES_RISC2
> +#define DES_PTR
> +#undef D_ENCRYPT
> +#undef des_encrypt
> +#undef des_encrypt2
> +#undef des_encrypt3
> +#undef des_decrypt3
> +#define des_encrypt  des_encrypt_u16_cisc_ptr
> +#define des_encrypt2 des_encrypt2_u16_cisc_ptr
> +#define des_encrypt3 des_encrypt3_u16_cisc_ptr
> +#define des_decrypt3 des_decrypt3_u16_cisc_ptr
> +#undef HEADER_DES_LOCL_H
> +#include "des_enc.c"
> +
> +#undef DES_UNROLL
> +#define DES_RISC1
> +#undef DES_RISC2
> +#define DES_PTR
> +#undef D_ENCRYPT
> +#undef des_encrypt
> +#undef des_encrypt2
> +#undef des_encrypt3
> +#undef des_decrypt3
> +#define des_encrypt  des_encrypt_u4_risc1_ptr
> +#define des_encrypt2 des_encrypt2_u4_risc1_ptr
> +#define des_encrypt3 des_encrypt3_u4_risc1_ptr
> +#define des_decrypt3 des_decrypt3_u4_risc1_ptr
> +#undef HEADER_DES_LOCL_H
> +#include "des_enc.c"
> +
> +#endif
> +
> +#ifdef PART4
> +
> +#undef DES_UNROLL
> +#undef DES_RISC1
> +#define DES_RISC2
> +#define DES_PTR
> +#undef D_ENCRYPT
> +#undef des_encrypt
> +#undef des_encrypt2
> +#undef des_encrypt3
> +#undef des_decrypt3
> +#define des_encrypt  des_encrypt_u4_risc2_ptr
> +#define des_encrypt2 des_encrypt2_u4_risc2_ptr
> +#define des_encrypt3 des_encrypt3_u4_risc2_ptr
> +#define des_decrypt3 des_decrypt3_u4_risc2_ptr
> +#undef HEADER_DES_LOCL_H
> +#include "des_enc.c"
> +
> +#define DES_UNROLL
> +#define DES_RISC1
> +#undef DES_RISC2
> +#define DES_PTR
> +#undef D_ENCRYPT
> +#undef des_encrypt
> +#undef des_encrypt2
> +#undef des_encrypt3
> +#undef des_decrypt3
> +#define des_encrypt  des_encrypt_u16_risc1_ptr
> +#define des_encrypt2 des_encrypt2_u16_risc1_ptr
> +#define des_encrypt3 des_encrypt3_u16_risc1_ptr
> +#define des_decrypt3 des_decrypt3_u16_risc1_ptr
> +#undef HEADER_DES_LOCL_H
> +#include "des_enc.c"
> +
> +#define DES_UNROLL
> +#undef DES_RISC1
> +#define DES_RISC2
> +#define DES_PTR
> +#undef D_ENCRYPT
> +#undef des_encrypt
> +#undef des_encrypt2
> +#undef des_encrypt3
> +#undef des_decrypt3
> +#define des_encrypt  des_encrypt_u16_risc2_ptr
> +#define des_encrypt2 des_encrypt2_u16_risc2_ptr
> +#define des_encrypt3 des_encrypt3_u16_risc2_ptr
> +#define des_decrypt3 des_decrypt3_u16_risc2_ptr
> +#undef HEADER_DES_LOCL_H
> +#include "des_enc.c"
> +
> +#endif
> +
> +/* The following if from times(3) man page.  It may need to be changed */
> +#ifndef HZ
> +# ifndef CLK_TCK
> +#  ifndef _BSD_CLK_TCK_ /* FreeBSD fix */
> +#   ifndef VMS
> +#    define HZ	100.0
> +#   else /* VMS */
> +#    define HZ	100.0
> +#   endif
> +#  else /* _BSD_CLK_TCK_ */
> +#   define HZ ((double)_BSD_CLK_TCK_)
> +#  endif
> +# else /* CLK_TCK */
> +#  define HZ ((double)CLK_TCK)
> +# endif
> +#endif
> +
> +#define BUFSIZE	((long)1024)
> +long run=0;
> +
> +#ifndef NOPROTO
> +double Time_F(int s);
> +#else
> +double Time_F();
> +#endif
> +
> +#ifdef SIGALRM
> +#if defined(__STDC__) || defined(sgi)
> +#define SIGRETTYPE void
> +#else
> +#define SIGRETTYPE int
> +#endif
> +
> +#ifndef NOPROTO
> +SIGRETTYPE sig_done(int sig);
> +#else
> +SIGRETTYPE sig_done();
> +#endif
> +
> +SIGRETTYPE sig_done(sig)
> +int sig;
> +	{
> +	signal(SIGALRM,sig_done);
> +	run=0;
> +#ifdef LINT
> +	sig=sig;
> +#endif
> +	}
> +#endif
> +
> +#define START	0
> +#define STOP	1
> +
> +double Time_F(s)
> +int s;
> +	{
> +	double ret;
> +#ifdef TIMES
> +	static struct tms tstart,tend;
> +
> +	if (s == START)
> +		{
> +		times(&tstart);
> +		return(0);
> +		}
> +	else
> +		{
> +		times(&tend);
> +		ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ;
> +		return((ret == 0.0)?1e-6:ret);
> +		}
> +#else /* !times() */
> +	static struct timeb tstart,tend;
> +	long i;
> +
> +	if (s == START)
> +		{
> +		ftime(&tstart);
> +		return(0);
> +		}
> +	else
> +		{
> +		ftime(&tend);
> +		i=(long)tend.millitm-(long)tstart.millitm;
> +		ret=((double)(tend.time-tstart.time))+((double)i)/1000.0;
> +		return((ret == 0.0)?1e-6:ret);
> +		}
> +#endif
> +	}
> +
> +#ifdef SIGALRM
> +#define print_name(name) fprintf(stderr,"Doing %s's for 10 seconds\n",name); alarm(10);
> +#else
> +#define print_name(name) fprintf(stderr,"Doing %s %ld times\n",name,cb);
> +#endif
> +	
> +#define time_it(func,name,index) \
> +	print_name(name); \
> +	Time_F(START); \
> +	for (count=0,run=1; COND(cb); count++) \
> +		{ \
> +		unsigned long d[2]; \
> +		func(d,&(sch[0]),DES_ENCRYPT); \
> +		} \
> +	tm[index]=Time_F(STOP); \
> +	fprintf(stderr,"%ld %s's in %.2f second\n",count,name,tm[index]); \
> +	tm[index]=((double)COUNT(cb))/tm[index];
> +
> +#define print_it(name,index) \
> +	fprintf(stderr,"%s bytes per sec = %12.2f (%5.1fuS)\n",name, \
> +		tm[index]*8,1.0e6/tm[index]);
> +
> +int main(argc,argv)
> +int argc;
> +char **argv;
> +	{
> +	long count;
> +	static unsigned char buf[BUFSIZE];
> +	static des_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
> +	static des_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
> +	static des_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
> +	des_key_schedule sch,sch2,sch3;
> +	double d,tm[16],max=0;
> +	int rank[16];
> +	char *str[16];
> +	int max_idx=0,i,num=0,j;
> +#ifndef SIGALARM
> +	long ca,cb,cc,cd,ce;
> +#endif
> +
> +	for (i=0; i<12; i++)
> +		{
> +		tm[i]=0.0;
> +		rank[i]=0;
> +		}
> +
> +#ifndef TIMES
> +	fprintf(stderr,"To get the most acurate results, try to run this\n");
> +	fprintf(stderr,"program when this computer is idle.\n");
> +#endif
> +
> +	des_set_key((C_Block *)key,sch);
> +	des_set_key((C_Block *)key2,sch2);
> +	des_set_key((C_Block *)key3,sch3);
> +
> +#ifndef SIGALRM
> +	fprintf(stderr,"First we calculate the approximate speed ...\n");
> +	des_set_key((C_Block *)key,sch);
> +	count=10;
> +	do	{
> +		long i;
> +		unsigned long data[2];
> +
> +		count*=2;
> +		Time_F(START);
> +		for (i=count; i; i--)
> +			des_encrypt(data,&(sch[0]),DES_ENCRYPT);
> +		d=Time_F(STOP);
> +		} while (d < 3.0);
> +	ca=count;
> +	cb=count*3;
> +	cc=count*3*8/BUFSIZE+1;
> +	cd=count*8/BUFSIZE+1;
> +
> +	ce=count/20+1;
> +#define COND(d) (count != (d))
> +#define COUNT(d) (d)
> +#else
> +#define COND(c) (run)
> +#define COUNT(d) (count)
> +        signal(SIGALRM,sig_done);
> +        alarm(10);
> +#endif
> +
> +#ifdef PART1
> +	time_it(des_encrypt_u4_cisc_idx,  "des_encrypt_u4_cisc_idx  ", 0);
> +	time_it(des_encrypt_u16_cisc_idx, "des_encrypt_u16_cisc_idx ", 1);
> +	time_it(des_encrypt_u4_risc1_idx, "des_encrypt_u4_risc1_idx ", 2);
> +	num+=3;
> +#endif
> +#ifdef PART2
> +	time_it(des_encrypt_u16_risc1_idx,"des_encrypt_u16_risc1_idx", 3);
> +	time_it(des_encrypt_u4_risc2_idx, "des_encrypt_u4_risc2_idx ", 4);
> +	time_it(des_encrypt_u16_risc2_idx,"des_encrypt_u16_risc2_idx", 5);
> +	num+=3;
> +#endif
> +#ifdef PART3
> +	time_it(des_encrypt_u4_cisc_ptr,  "des_encrypt_u4_cisc_ptr  ", 6);
> +	time_it(des_encrypt_u16_cisc_ptr, "des_encrypt_u16_cisc_ptr ", 7);
> +	time_it(des_encrypt_u4_risc1_ptr, "des_encrypt_u4_risc1_ptr ", 8);
> +	num+=3;
> +#endif
> +#ifdef PART4
> +	time_it(des_encrypt_u16_risc1_ptr,"des_encrypt_u16_risc1_ptr", 9);
> +	time_it(des_encrypt_u4_risc2_ptr, "des_encrypt_u4_risc2_ptr ",10);
> +	time_it(des_encrypt_u16_risc2_ptr,"des_encrypt_u16_risc2_ptr",11);
> +	num+=3;
> +#endif
> +
> +#ifdef PART1
> +	str[0]=" 4  c i";
> +	print_it("des_encrypt_u4_cisc_idx  ",0);
> +	max=tm[0];
> +	max_idx=0;
> +	str[1]="16  c i";
> +	print_it("des_encrypt_u16_cisc_idx ",1);
> +	if (max < tm[1]) { max=tm[1]; max_idx=1; }
> +	str[2]=" 4 r1 i";
> +	print_it("des_encrypt_u4_risc1_idx ",2);
> +	if (max < tm[2]) { max=tm[2]; max_idx=2; }
> +#endif
> +#ifdef PART2
> +	str[3]="16 r1 i";
> +	print_it("des_encrypt_u16_risc1_idx",3);
> +	if (max < tm[3]) { max=tm[3]; max_idx=3; }
> +	str[4]=" 4 r2 i";
> +	print_it("des_encrypt_u4_risc2_idx ",4);
> +	if (max < tm[4]) { max=tm[4]; max_idx=4; }
> +	str[5]="16 r2 i";
> +	print_it("des_encrypt_u16_risc2_idx",5);
> +	if (max < tm[5]) { max=tm[5]; max_idx=5; }
> +#endif
> +#ifdef PART3
> +	str[6]=" 4  c p";
> +	print_it("des_encrypt_u4_cisc_ptr  ",6);
> +	if (max < tm[6]) { max=tm[6]; max_idx=6; }
> +	str[7]="16  c p";
> +	print_it("des_encrypt_u16_cisc_ptr ",7);
> +	if (max < tm[7]) { max=tm[7]; max_idx=7; }
> +	str[8]=" 4 r1 p";
> +	print_it("des_encrypt_u4_risc1_ptr ",8);
> +	if (max < tm[8]) { max=tm[8]; max_idx=8; }
> +#endif
> +#ifdef PART4
> +	str[9]="16 r1 p";
> +	print_it("des_encrypt_u16_risc1_ptr",9);
> +	if (max < tm[9]) { max=tm[9]; max_idx=9; }
> +	str[10]=" 4 r2 p";
> +	print_it("des_encrypt_u4_risc2_ptr ",10);
> +	if (max < tm[10]) { max=tm[10]; max_idx=10; }
> +	str[11]="16 r2 p";
> +	print_it("des_encrypt_u16_risc2_ptr",11);
> +	if (max < tm[11]) { max=tm[11]; max_idx=11; }
> +#endif
> +	printf("options    des ecb/s\n");
> +	printf("%s %12.2f 100.0%%\n",str[max_idx],tm[max_idx]);
> +	d=tm[max_idx];
> +	tm[max_idx]= -2.0;
> +	max= -1.0;
> +	for (;;)
> +		{
> +		for (i=0; i<12; i++)
> +			{
> +			if (max < tm[i]) { max=tm[i]; j=i; }
> +			}
> +		if (max < 0.0) break;
> +		printf("%s %12.2f  %4.1f%%\n",str[j],tm[j],tm[j]/d*100.0);
> +		tm[j]= -2.0;
> +		max= -1.0;
> +		}
> +
> +	switch (max_idx)
> +		{
> +	case 0:
> +		printf("-DDES_DEFAULT_OPTIONS\n");
> +		break;
> +	case 1:
> +		printf("-DDES_UNROLL\n");
> +		break;
> +	case 2:
> +		printf("-DDES_RISC1\n");
> +		break;
> +	case 3:
> +		printf("-DDES_UNROLL -DDES_RISC1\n");
> +		break;
> +	case 4:
> +		printf("-DDES_RISC2\n");
> +		break;
> +	case 5:
> +		printf("-DDES_UNROLL -DDES_RISC2\n");
> +		break;
> +	case 6:
> +		printf("-DDES_PTR\n");
> +		break;
> +	case 7:
> +		printf("-DDES_UNROLL -DDES_PTR\n");
> +		break;
> +	case 8:
> +		printf("-DDES_RISC1 -DDES_PTR\n");
> +		break;
> +	case 9:
> +		printf("-DDES_UNROLL -DDES_RISC1 -DDES_PTR\n");
> +		break;
> +	case 10:
> +		printf("-DDES_RISC2 -DDES_PTR\n");
> +		break;
> +	case 11:
> +		printf("-DDES_UNROLL -DDES_RISC2 -DDES_PTR\n");
> +		break;
> +		}
> +	exit(0);
> +#if defined(LINT) || defined(MSDOS)
> +	return(0);
> +#endif
> +	}
> diff -Naur linux/cryptolib/libdes/des_ver.h linux-crypto/cryptolib/libdes/des_ver.h
> --- linux/cryptolib/libdes/des_ver.h	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/cryptolib/libdes/des_ver.h	Tue Aug 27 11:20:55 2002
> @@ -0,0 +1,60 @@
> +/* crypto/des/des_ver.h */
> +/* Copyright (C) 1995-1997 Eric Young ([email protected])
> + * All rights reserved.
> + *
> + * This package is an SSL implementation written
> + * by Eric Young ([email protected]).
> + * The implementation was written so as to conform with Netscapes SSL.
> + * 
> + * This library is free for commercial and non-commercial use as long as
> + * the following conditions are aheared to.  The following conditions
> + * apply to all code found in this distribution, be it the RC4, RSA,
> + * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
> + * included with this distribution is covered by the same copyright terms
> + * except that the holder is Tim Hudson ([email protected]).
> + * 
> + * Copyright remains Eric Young's, and as such any Copyright notices in
> + * the code are not to be removed.
> + * If this package is used in a product, Eric Young should be given attribution
> + * as the author of the parts of the library used.
> + * This can be in the form of a textual message at program startup or
> + * in documentation (online or textual) provided with the package.
> + * 
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the copyright
> + *    notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + *    notice, this list of conditions and the following disclaimer in the
> + *    documentation and/or other materials provided with the distribution.
> + * 3. All advertising materials mentioning features or use of this software
> + *    must display the following acknowledgement:
> + *    "This product includes cryptographic software written by
> + *     Eric Young ([email protected])"
> + *    The word 'cryptographic' can be left out if the rouines from the library
> + *    being used are not cryptographic related :-).
> + * 4. If you include any Windows specific code (or a derivative thereof) from 
> + *    the apps directory (application code) you must include an acknowledgement:
> + *    "This product includes software written by Tim Hudson ([email protected])"
> + * 
> + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + * 
> + * The licence and distribution terms for any publically available version or
> + * derivative of this code cannot be changed.  i.e. this code cannot simply be
> + * copied and put under another distribution licence
> + * [including the GNU Public Licence.]
> + */
> +
> +extern char *DES_version;	/* SSLeay version string */
> +extern char *libdes_version;	/* old libdes version string */
> diff -Naur linux/cryptolib/libdes/destest.c linux-crypto/cryptolib/libdes/destest.c
> --- linux/cryptolib/libdes/destest.c	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/cryptolib/libdes/destest.c	Tue Aug 27 11:20:55 2002
> @@ -0,0 +1,871 @@
> +/* crypto/des/destest.c */
> +/* Copyright (C) 1995-1997 Eric Young ([email protected])
> + * All rights reserved.
> + *
> + * This package is an SSL implementation written
> + * by Eric Young ([email protected]).
> + * The implementation was written so as to conform with Netscapes SSL.
> + * 
> + * This library is free for commercial and non-commercial use as long as
> + * the following conditions are aheared to.  The following conditions
> + * apply to all code found in this distribution, be it the RC4, RSA,
> + * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
> + * included with this distribution is covered by the same copyright terms
> + * except that the holder is Tim Hudson ([email protected]).
> + * 
> + * Copyright remains Eric Young's, and as such any Copyright notices in
> + * the code are not to be removed.
> + * If this package is used in a product, Eric Young should be given attribution
> + * as the author of the parts of the library used.
> + * This can be in the form of a textual message at program startup or
> + * in documentation (online or textual) provided with the package.
> + * 
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the copyright
> + *    notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + *    notice, this list of conditions and the following disclaimer in the
> + *    documentation and/or other materials provided with the distribution.
> + * 3. All advertising materials mentioning features or use of this software
> + *    must display the following acknowledgement:
> + *    "This product includes cryptographic software written by
> + *     Eric Young ([email protected])"
> + *    The word 'cryptographic' can be left out if the rouines from the library
> + *    being used are not cryptographic related :-).
> + * 4. If you include any Windows specific code (or a derivative thereof) from 
> + *    the apps directory (application code) you must include an acknowledgement:
> + *    "This product includes software written by Tim Hudson ([email protected])"
> + * 
> + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + * 
> + * The licence and distribution terms for any publically available version or
> + * derivative of this code cannot be changed.  i.e. this code cannot simply be
> + * copied and put under another distribution licence
> + * [including the GNU Public Licence.]
> + */
> +
> +#if defined(WIN32) || defined(WIN16) || defined(WINDOWS)
> +#ifndef MSDOS
> +#define MSDOS
> +#endif
> +#endif
> +
> +#include <stdio.h>
> +#include <stdlib.h>
> +#ifndef MSDOS
> +#include <unistd.h>
> +#else
> +#include <io.h>
> +#endif
> +#include <string.h>
> +#include "des.h"
> +
> +/* tisk tisk - the test keys don't all have odd parity :-( */
> +/* test data */
> +#define NUM_TESTS 34
> +static unsigned char key_data[NUM_TESTS][8]={
> +	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
> +	{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},
> +	{0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
> +	{0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11},
> +	{0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF},
> +	{0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11},
> +	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
> +	{0xFE,0xDC,0xBA,0x98,0x76,0x54,0x32,0x10},
> +	{0x7C,0xA1,0x10,0x45,0x4A,0x1A,0x6E,0x57},
> +	{0x01,0x31,0xD9,0x61,0x9D,0xC1,0x37,0x6E},
> +	{0x07,0xA1,0x13,0x3E,0x4A,0x0B,0x26,0x86},
> +	{0x38,0x49,0x67,0x4C,0x26,0x02,0x31,0x9E},
> +	{0x04,0xB9,0x15,0xBA,0x43,0xFE,0xB5,0xB6},
> +	{0x01,0x13,0xB9,0x70,0xFD,0x34,0xF2,0xCE},
> +	{0x01,0x70,0xF1,0x75,0x46,0x8F,0xB5,0xE6},
> +	{0x43,0x29,0x7F,0xAD,0x38,0xE3,0x73,0xFE},
> +	{0x07,0xA7,0x13,0x70,0x45,0xDA,0x2A,0x16},
> +	{0x04,0x68,0x91,0x04,0xC2,0xFD,0x3B,0x2F},
> +	{0x37,0xD0,0x6B,0xB5,0x16,0xCB,0x75,0x46},
> +	{0x1F,0x08,0x26,0x0D,0x1A,0xC2,0x46,0x5E},
> +	{0x58,0x40,0x23,0x64,0x1A,0xBA,0x61,0x76},
> +	{0x02,0x58,0x16,0x16,0x46,0x29,0xB0,0x07},
> +	{0x49,0x79,0x3E,0xBC,0x79,0xB3,0x25,0x8F},
> +	{0x4F,0xB0,0x5E,0x15,0x15,0xAB,0x73,0xA7},
> +	{0x49,0xE9,0x5D,0x6D,0x4C,0xA2,0x29,0xBF},
> +	{0x01,0x83,0x10,0xDC,0x40,0x9B,0x26,0xD6},
> +	{0x1C,0x58,0x7F,0x1C,0x13,0x92,0x4F,0xEF},
> +	{0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01},
> +	{0x1F,0x1F,0x1F,0x1F,0x0E,0x0E,0x0E,0x0E},
> +	{0xE0,0xFE,0xE0,0xFE,0xF1,0xFE,0xF1,0xFE},
> +	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
> +	{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},
> +	{0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF},
> +	{0xFE,0xDC,0xBA,0x98,0x76,0x54,0x32,0x10}};
> +
> +static unsigned char plain_data[NUM_TESTS][8]={
> +	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
> +	{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},
> +	{0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x01},
> +	{0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11},
> +	{0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11},
> +	{0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF},
> +	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
> +	{0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF},
> +	{0x01,0xA1,0xD6,0xD0,0x39,0x77,0x67,0x42},
> +	{0x5C,0xD5,0x4C,0xA8,0x3D,0xEF,0x57,0xDA},
> +	{0x02,0x48,0xD4,0x38,0x06,0xF6,0x71,0x72},
> +	{0x51,0x45,0x4B,0x58,0x2D,0xDF,0x44,0x0A},
> +	{0x42,0xFD,0x44,0x30,0x59,0x57,0x7F,0xA2},
> +	{0x05,0x9B,0x5E,0x08,0x51,0xCF,0x14,0x3A},
> +	{0x07,0x56,0xD8,0xE0,0x77,0x47,0x61,0xD2},
> +	{0x76,0x25,0x14,0xB8,0x29,0xBF,0x48,0x6A},
> +	{0x3B,0xDD,0x11,0x90,0x49,0x37,0x28,0x02},
> +	{0x26,0x95,0x5F,0x68,0x35,0xAF,0x60,0x9A},
> +	{0x16,0x4D,0x5E,0x40,0x4F,0x27,0x52,0x32},
> +	{0x6B,0x05,0x6E,0x18,0x75,0x9F,0x5C,0xCA},
> +	{0x00,0x4B,0xD6,0xEF,0x09,0x17,0x60,0x62},
> +	{0x48,0x0D,0x39,0x00,0x6E,0xE7,0x62,0xF2},
> +	{0x43,0x75,0x40,0xC8,0x69,0x8F,0x3C,0xFA},
> +	{0x07,0x2D,0x43,0xA0,0x77,0x07,0x52,0x92},
> +	{0x02,0xFE,0x55,0x77,0x81,0x17,0xF1,0x2A},
> +	{0x1D,0x9D,0x5C,0x50,0x18,0xF7,0x28,0xC2},
> +	{0x30,0x55,0x32,0x28,0x6D,0x6F,0x29,0x5A},
> +	{0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF},
> +	{0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF},
> +	{0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF},
> +	{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},
> +	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
> +	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
> +	{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}};
> +
> +static unsigned char cipher_data[NUM_TESTS][8]={
> +	{0x8C,0xA6,0x4D,0xE9,0xC1,0xB1,0x23,0xA7},
> +	{0x73,0x59,0xB2,0x16,0x3E,0x4E,0xDC,0x58},
> +	{0x95,0x8E,0x6E,0x62,0x7A,0x05,0x55,0x7B},
> +	{0xF4,0x03,0x79,0xAB,0x9E,0x0E,0xC5,0x33},
> +	{0x17,0x66,0x8D,0xFC,0x72,0x92,0x53,0x2D},
> +	{0x8A,0x5A,0xE1,0xF8,0x1A,0xB8,0xF2,0xDD},
> +	{0x8C,0xA6,0x4D,0xE9,0xC1,0xB1,0x23,0xA7},
> +	{0xED,0x39,0xD9,0x50,0xFA,0x74,0xBC,0xC4},
> +	{0x69,0x0F,0x5B,0x0D,0x9A,0x26,0x93,0x9B},
> +	{0x7A,0x38,0x9D,0x10,0x35,0x4B,0xD2,0x71},
> +	{0x86,0x8E,0xBB,0x51,0xCA,0xB4,0x59,0x9A},
> +	{0x71,0x78,0x87,0x6E,0x01,0xF1,0x9B,0x2A},
> +	{0xAF,0x37,0xFB,0x42,0x1F,0x8C,0x40,0x95},
> +	{0x86,0xA5,0x60,0xF1,0x0E,0xC6,0xD8,0x5B},
> +	{0x0C,0xD3,0xDA,0x02,0x00,0x21,0xDC,0x09},
> +	{0xEA,0x67,0x6B,0x2C,0xB7,0xDB,0x2B,0x7A},
> +	{0xDF,0xD6,0x4A,0x81,0x5C,0xAF,0x1A,0x0F},
> +	{0x5C,0x51,0x3C,0x9C,0x48,0x86,0xC0,0x88},
> +	{0x0A,0x2A,0xEE,0xAE,0x3F,0xF4,0xAB,0x77},
> +	{0xEF,0x1B,0xF0,0x3E,0x5D,0xFA,0x57,0x5A},
> +	{0x88,0xBF,0x0D,0xB6,0xD7,0x0D,0xEE,0x56},
> +	{0xA1,0xF9,0x91,0x55,0x41,0x02,0x0B,0x56},
> +	{0x6F,0xBF,0x1C,0xAF,0xCF,0xFD,0x05,0x56},
> +	{0x2F,0x22,0xE4,0x9B,0xAB,0x7C,0xA1,0xAC},
> +	{0x5A,0x6B,0x61,0x2C,0xC2,0x6C,0xCE,0x4A},
> +	{0x5F,0x4C,0x03,0x8E,0xD1,0x2B,0x2E,0x41},
> +	{0x63,0xFA,0xC0,0xD0,0x34,0xD9,0xF7,0x93},
> +	{0x61,0x7B,0x3A,0x0C,0xE8,0xF0,0x71,0x00},
> +	{0xDB,0x95,0x86,0x05,0xF8,0xC8,0xC6,0x06},
> +	{0xED,0xBF,0xD1,0xC6,0x6C,0x29,0xCC,0xC7},
> +	{0x35,0x55,0x50,0xB2,0x15,0x0E,0x24,0x51},
> +	{0xCA,0xAA,0xAF,0x4D,0xEA,0xF1,0xDB,0xAE},
> +	{0xD5,0xD4,0x4F,0xF7,0x20,0x68,0x3D,0x0D},
> +	{0x2A,0x2B,0xB0,0x08,0xDF,0x97,0xC2,0xF2}};
> +
> +static unsigned char cipher_ecb2[NUM_TESTS-1][8]={
> +	{0x92,0x95,0xB5,0x9B,0xB3,0x84,0x73,0x6E},
> +	{0x19,0x9E,0x9D,0x6D,0xF3,0x9A,0xA8,0x16},
> +	{0x2A,0x4B,0x4D,0x24,0x52,0x43,0x84,0x27},
> +	{0x35,0x84,0x3C,0x01,0x9D,0x18,0xC5,0xB6},
> +	{0x4A,0x5B,0x2F,0x42,0xAA,0x77,0x19,0x25},
> +	{0xA0,0x6B,0xA9,0xB8,0xCA,0x5B,0x17,0x8A},
> +	{0xAB,0x9D,0xB7,0xFB,0xED,0x95,0xF2,0x74},
> +	{0x3D,0x25,0x6C,0x23,0xA7,0x25,0x2F,0xD6},
> +	{0xB7,0x6F,0xAB,0x4F,0xBD,0xBD,0xB7,0x67},
> +	{0x8F,0x68,0x27,0xD6,0x9C,0xF4,0x1A,0x10},
> +	{0x82,0x57,0xA1,0xD6,0x50,0x5E,0x81,0x85},
> +	{0xA2,0x0F,0x0A,0xCD,0x80,0x89,0x7D,0xFA},
> +	{0xCD,0x2A,0x53,0x3A,0xDB,0x0D,0x7E,0xF3},
> +	{0xD2,0xC2,0xBE,0x27,0xE8,0x1B,0x68,0xE3},
> +	{0xE9,0x24,0xCF,0x4F,0x89,0x3C,0x5B,0x0A},
> +	{0xA7,0x18,0xC3,0x9F,0xFA,0x9F,0xD7,0x69},
> +	{0x77,0x2C,0x79,0xB1,0xD2,0x31,0x7E,0xB1},
> +	{0x49,0xAB,0x92,0x7F,0xD0,0x22,0x00,0xB7},
> +	{0xCE,0x1C,0x6C,0x7D,0x85,0xE3,0x4A,0x6F},
> +	{0xBE,0x91,0xD6,0xE1,0x27,0xB2,0xE9,0x87},
> +	{0x70,0x28,0xAE,0x8F,0xD1,0xF5,0x74,0x1A},
> +	{0xAA,0x37,0x80,0xBB,0xF3,0x22,0x1D,0xDE},
> +	{0xA6,0xC4,0xD2,0x5E,0x28,0x93,0xAC,0xB3},
> +	{0x22,0x07,0x81,0x5A,0xE4,0xB7,0x1A,0xAD},
> +	{0xDC,0xCE,0x05,0xE7,0x07,0xBD,0xF5,0x84},
> +	{0x26,0x1D,0x39,0x2C,0xB3,0xBA,0xA5,0x85},
> +	{0xB4,0xF7,0x0F,0x72,0xFB,0x04,0xF0,0xDC},
> +	{0x95,0xBA,0xA9,0x4E,0x87,0x36,0xF2,0x89},
> +	{0xD4,0x07,0x3A,0xF1,0x5A,0x17,0x82,0x0E},
> +	{0xEF,0x6F,0xAF,0xA7,0x66,0x1A,0x7E,0x89},
> +	{0xC1,0x97,0xF5,0x58,0x74,0x8A,0x20,0xE7},
> +	{0x43,0x34,0xCF,0xDA,0x22,0xC4,0x86,0xC8},
> +	{0x08,0xD7,0xB4,0xFB,0x62,0x9D,0x08,0x85}};
> +
> +static unsigned char cbc_key [8]={0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef};
> +static unsigned char cbc2_key[8]={0xf0,0xe1,0xd2,0xc3,0xb4,0xa5,0x96,0x87};
> +static unsigned char cbc3_key[8]={0xfe,0xdc,0xba,0x98,0x76,0x54,0x32,0x10};
> +static unsigned char cbc_iv  [8]={0xfe,0xdc,0xba,0x98,0x76,0x54,0x32,0x10};
> +static char cbc_data[40]="7654321 Now is the time for \0001";
> +
> +static unsigned char cbc_ok[32]={
> +	0xcc,0xd1,0x73,0xff,0xab,0x20,0x39,0xf4,
> +	0xac,0xd8,0xae,0xfd,0xdf,0xd8,0xa1,0xeb,
> +	0x46,0x8e,0x91,0x15,0x78,0x88,0xba,0x68,
> +	0x1d,0x26,0x93,0x97,0xf7,0xfe,0x62,0xb4};
> +
> +static unsigned char xcbc_ok[32]={
> +	0x86,0x74,0x81,0x0D,0x61,0xA4,0xA5,0x48,
> +	0xB9,0x93,0x03,0xE1,0xB8,0xBB,0xBD,0xBD,
> +	0x64,0x30,0x0B,0xB9,0x06,0x65,0x81,0x76,
> +	0x04,0x1D,0x77,0x62,0x17,0xCA,0x2B,0xD2,
> +	};
> +
> +static unsigned char cbc3_ok[32]={
> +	0x3F,0xE3,0x01,0xC9,0x62,0xAC,0x01,0xD0,
> +	0x22,0x13,0x76,0x3C,0x1C,0xBD,0x4C,0xDC,
> +	0x79,0x96,0x57,0xC0,0x64,0xEC,0xF5,0xD4,
> +	0x1C,0x67,0x38,0x12,0xCF,0xDE,0x96,0x75};
> +
> +static unsigned char pcbc_ok[32]={
> +	0xcc,0xd1,0x73,0xff,0xab,0x20,0x39,0xf4,
> +	0x6d,0xec,0xb4,0x70,0xa0,0xe5,0x6b,0x15,
> +	0xae,0xa6,0xbf,0x61,0xed,0x7d,0x9c,0x9f,
> +	0xf7,0x17,0x46,0x3b,0x8a,0xb3,0xcc,0x88};
> +
> +static unsigned char cfb_key[8]={0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef};
> +static unsigned char cfb_iv[8]={0x12,0x34,0x56,0x78,0x90,0xab,0xcd,0xef};
> +static unsigned char cfb_buf1[40],cfb_buf2[40],cfb_tmp[8];
> +static unsigned char plain[24]=
> +	{
> +	0x4e,0x6f,0x77,0x20,0x69,0x73,
> +	0x20,0x74,0x68,0x65,0x20,0x74,
> +	0x69,0x6d,0x65,0x20,0x66,0x6f,
> +	0x72,0x20,0x61,0x6c,0x6c,0x20
> +	};
> +static unsigned char cfb_cipher8[24]= {
> +	0xf3,0x1f,0xda,0x07,0x01,0x14, 0x62,0xee,0x18,0x7f,0x43,0xd8,
> +	0x0a,0x7c,0xd9,0xb5,0xb0,0xd2, 0x90,0xda,0x6e,0x5b,0x9a,0x87 };
> +static unsigned char cfb_cipher16[24]={
> +	0xF3,0x09,0x87,0x87,0x7F,0x57, 0xF7,0x3C,0x36,0xB6,0xDB,0x70,
> +	0xD8,0xD5,0x34,0x19,0xD3,0x86, 0xB2,0x23,0xB7,0xB2,0xAD,0x1B };
> +static unsigned char cfb_cipher32[24]={
> +	0xF3,0x09,0x62,0x49,0xA4,0xDF, 0xA4,0x9F,0x33,0xDC,0x7B,0xAD,
> +	0x4C,0xC8,0x9F,0x64,0xE4,0x53, 0xE5,0xEC,0x67,0x20,0xDA,0xB6 };
> +static unsigned char cfb_cipher48[24]={
> +	0xF3,0x09,0x62,0x49,0xC7,0xF4, 0x30,0xB5,0x15,0xEC,0xBB,0x85,
> +	0x97,0x5A,0x13,0x8C,0x68,0x60, 0xE2,0x38,0x34,0x3C,0xDC,0x1F };
> +static unsigned char cfb_cipher64[24]={
> +	0xF3,0x09,0x62,0x49,0xC7,0xF4, 0x6E,0x51,0xA6,0x9E,0x83,0x9B,
> +	0x1A,0x92,0xF7,0x84,0x03,0x46, 0x71,0x33,0x89,0x8E,0xA6,0x22 };
> +
> +static unsigned char ofb_key[8]={0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef};
> +static unsigned char ofb_iv[8]={0x12,0x34,0x56,0x78,0x90,0xab,0xcd,0xef};
> +static unsigned char ofb_buf1[24],ofb_buf2[24],ofb_tmp[8];
> +static unsigned char ofb_cipher[24]=
> +	{
> +	0xf3,0x09,0x62,0x49,0xc7,0xf4,0x6e,0x51,
> +	0x35,0xf2,0x4a,0x24,0x2e,0xeb,0x3d,0x3f,
> +	0x3d,0x6d,0x5b,0xe3,0x25,0x5a,0xf8,0xc3
> +	};
> +
> +DES_LONG cbc_cksum_ret=0xB462FEF7L;
> +unsigned char cbc_cksum_data[8]={0x1D,0x26,0x93,0x97,0xf7,0xfe,0x62,0xb4};
> +
> +#ifndef NOPROTO
> +static char *pt(unsigned char *p);
> +static int cfb_test(int bits, unsigned char *cfb_cipher);
> +static int cfb64_test(unsigned char *cfb_cipher);
> +static int ede_cfb64_test(unsigned char *cfb_cipher);
> +#else
> +static char *pt();
> +static int cfb_test();
> +static int cfb64_test();
> +static int ede_cfb64_test();
> +#endif
> +
> +int main(argc,argv)
> +int argc;
> +char *argv[];
> +	{
> +	int i,j,err=0;
> +	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 qret[4][4],cret[8];
> +	DES_LONG lqret[4];
> +	int num;
> +	char *str;
> +
> +	printf("Doing ecb\n");
> +	for (i=0; i<NUM_TESTS; i++)
> +		{
> +		if ((j=des_key_sched((C_Block *)(key_data[i]),ks)) != 0)
> +			{
> +			printf("Key error %2d:%d\n",i+1,j);
> +			err=1;
> +			}
> +		memcpy(in,plain_data[i],8);
> +		memset(out,0,8);
> +		memset(outin,0,8);
> +		des_ecb_encrypt((C_Block *)in,(C_Block *)out,ks,DES_ENCRYPT);
> +		des_ecb_encrypt((C_Block *)out,(C_Block *)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-1); i++)
> +		{
> +		if ((j=des_key_sched((C_Block *)(key_data[i]),ks)) != 0)
> +			{
> +			err=1;
> +			printf("Key error %2d:%d\n",i+1,j);
> +			}
> +		if ((j=des_key_sched((C_Block *)(key_data[i+1]),ks2)) != 0)
> +			{
> +			printf("Key error %2d:%d\n",i+2,j);
> +			err=1;
> +			}
> +		if ((j=des_key_sched((C_Block *)(key_data[i+2]),ks3)) != 0)
> +			{
> +			printf("Key error %2d:%d\n",i+3,j);
> +			err=1;
> +			}
> +		memcpy(in,plain_data[i],8);
> +		memset(out,0,8);
> +		memset(outin,0,8);
> +		des_ecb2_encrypt((C_Block *)in,(C_Block *)out,ks,ks2,
> +			DES_ENCRYPT);
> +		des_ecb2_encrypt((C_Block *)out,(C_Block *)outin,ks,ks2,
> +			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_key_sched((C_Block *)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((C_Block *)cbc_data,(C_Block *)cbc_out,
> +		(long)strlen((char *)cbc_data)+1,ks,
> +		(C_Block *)iv3,DES_ENCRYPT);
> +	if (memcmp(cbc_out,cbc_ok,32) != 0)
> +		printf("cbc_encrypt encrypt error\n");
> +
> +	memcpy(iv3,cbc_iv,sizeof(cbc_iv));
> +	des_ncbc_encrypt((C_Block *)cbc_out,(C_Block *)cbc_in,
> +		(long)strlen((char *)cbc_data)+1,ks,
> +		(C_Block *)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_key_sched((C_Block *)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((C_Block *)cbc_data,(C_Block *)cbc_out,
> +		(long)strlen((char *)cbc_data)+1,ks,
> +		(C_Block *)iv3,
> +		(C_Block *)cbc2_key, (C_Block *)cbc3_key, DES_ENCRYPT);
> +	if (memcmp(cbc_out,xcbc_ok,32) != 0)
> +		{
> +		printf("des_xcbc_encrypt encrypt error\n");
> +		}
> +	memcpy(iv3,cbc_iv,sizeof(cbc_iv));
> +	des_xcbc_encrypt((C_Block *)cbc_out,(C_Block *)cbc_in,
> +		(long)strlen((char *)cbc_data)+1,ks,
> +		(C_Block *)iv3,
> +		(C_Block *)cbc2_key, (C_Block *)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_key_sched((C_Block *)cbc_key,ks)) != 0)
> +		{
> +		printf("Key error %d\n",j);
> +		err=1;
> +		}
> +	if ((j=des_key_sched((C_Block *)cbc2_key,ks2)) != 0)
> +		{
> +		printf("Key error %d\n",j);
> +		err=1;
> +		}
> +	if ((j=des_key_sched((C_Block *)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((C_Block *)cbc_data,(C_Block *)cbc_out,
> +		16L,ks,ks2,ks3,(C_Block *)iv3,DES_ENCRYPT);
> +	des_ede3_cbc_encrypt((C_Block *)&(cbc_data[16]),
> +		(C_Block *)&(cbc_out[16]),
> +		(long)i-16,ks,ks2,ks3,(C_Block *)iv3,DES_ENCRYPT);
> +	if (memcmp(cbc_out,cbc3_ok,
> +		(unsigned int)(strlen((char *)cbc_data)+1+7)/8*8) != 0)
> +		{
> +		printf("des_ede3_cbc_encrypt encrypt error\n");
> +		err=1;
> +		}
> +
> +	memcpy(iv3,cbc_iv,sizeof(cbc_iv));
> +	des_ede3_cbc_encrypt((C_Block *)cbc_out,(C_Block *)cbc_in,
> +		(long)i,ks,ks2,ks3,(C_Block *)iv3,DES_DECRYPT);
> +	if (memcmp(cbc_in,cbc_data,strlen(cbc_data)+1) != 0)
> +		{
> +		printf("des_ede3_cbc_encrypt decrypt error\n");
> +		err=1;
> +		}
> +
> +#ifndef LIBDES_LIT
> +	printf("Doing pcbc\n");
> +	if ((j=des_key_sched((C_Block *)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((C_Block *)cbc_data,(C_Block *)cbc_out,
> +		(long)strlen(cbc_data)+1,ks,(C_Block *)cbc_iv,DES_ENCRYPT);
> +	if (memcmp(cbc_out,pcbc_ok,32) != 0)
> +		{
> +		printf("pcbc_encrypt encrypt error\n");
> +		err=1;
> +		}
> +	des_pcbc_encrypt((C_Block *)cbc_out,(C_Block *)cbc_in,
> +		(long)strlen(cbc_data)+1,ks,(C_Block *)cbc_iv,DES_DECRYPT);
> +	if (memcmp(cbc_in,cbc_data,strlen(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,(long)1,ks,(C_Block *)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,(long)1,ks,(C_Block *)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_key_sched((C_Block *)ofb_key,ks);
> +	memcpy(ofb_tmp,ofb_iv,sizeof(ofb_iv));
> +	des_ofb_encrypt(plain,ofb_buf1,64,(long)sizeof(plain)/8,ks,
> +		(C_Block *)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,(long)sizeof(ofb_buf1)/8,ks,
> +		(C_Block *)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_key_sched((C_Block *)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,
> +			(C_Block *)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,(long)sizeof(ofb_buf1),ks,
> +		(C_Block *)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_key_sched((C_Block *)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,
> +			(C_Block *)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,(long)sizeof(ofb_buf1),ks,
> +		ks,ks,(C_Block *)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_key_sched((C_Block *)cbc_key,ks);
> +	cs=des_cbc_cksum((C_Block *)cbc_data,(C_Block *)cret,
> +		(long)strlen(cbc_data),ks,(C_Block *)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=quad_cksum((C_Block *)cbc_data,(C_Block *)qret,
> +		(long)strlen(cbc_data),2,(C_Block *)cbc_iv);
> +	for (i=0; i<4; i++)
> +		{
> +		lqret[i]=0;
> +		memcpy(&(lqret[i]),&(qret[i][0]),4);
> +		}
> +	{ /* Big-endian fix */
> +	static DES_LONG l=1;
> +	static unsigned char *c=(unsigned char *)&l;
> +	DES_LONG ll;
> +
> +	if (!c[0])
> +		{
> +		ll=lqret[0]^lqret[3];
> +		lqret[0]^=ll;
> +		lqret[3]^=ll;
> +		ll=lqret[1]^lqret[2];
> +		lqret[1]^=ll;
> +		lqret[2]^=ll;
> +		}
> +	}
> +	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],0x327eba8dL);
> +		err=1;
> +		}
> +	if (lqret[1] != 0x201a49ccL)
> +		{
> +		printf("quad_cksum error, out[1] %08lx is not %08lx\n",
> +			(unsigned long)lqret[1],0x201a49ccL);
> +		err=1;
> +		}
> +	if (lqret[2] != 0x70d7a63aL)
> +		{
> +		printf("quad_cksum error, out[2] %08lx is not %08lx\n",
> +			(unsigned long)lqret[2],0x70d7a63aL);
> +		err=1;
> +		}
> +	if (lqret[3] != 0x501c2c26L)
> +		{
> +		printf("quad_cksum error, out[3] %08lx is not %08lx\n",
> +			(unsigned long)lqret[3],0x501c2c26L);
> +		err=1;
> +		}
> +#endif
> +
> +	printf("input word alignment test");
> +	for (i=0; i<4; i++)
> +		{
> +		printf(" %d",i);
> +		des_ncbc_encrypt((C_Block *)&(cbc_out[i]),(C_Block *)cbc_in,
> +			(long)strlen(cbc_data)+1,ks,(C_Block *)cbc_iv,
> +			DES_ENCRYPT);
> +		}
> +	printf("\noutput word alignment test");
> +	for (i=0; i<4; i++)
> +		{
> +		printf(" %d",i);
> +		des_ncbc_encrypt((C_Block *)cbc_out,(C_Block *)&(cbc_in[i]),
> +			(long)strlen(cbc_data)+1,ks,(C_Block *)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");
> +	exit(err);
> +	return(0);
> +	}
> +
> +static char *pt(p)
> +unsigned char *p;
> +	{
> +	static char bufs[10][20];
> +	static int bnum=0;
> +	char *ret;
> +	int i;
> +	static char *f="0123456789ABCDEF";
> +
> +	ret= &(bufs[bnum++][0]);
> +	bnum%=10;
> +	for (i=0; i<8; i++)
> +		{
> +		ret[i*2]=f[(p[i]>>4)&0xf];
> +		ret[i*2+1]=f[p[i]&0xf];
> +		}
> +	ret[16]='\0';
> +	return(ret);
> +	}
> +
> +#ifndef LIBDES_LIT
> +
> +static int cfb_test(bits, cfb_cipher)
> +int bits;
> +unsigned char *cfb_cipher;
> +	{
> +	des_key_schedule ks;
> +	int i,err=0;
> +
> +	des_key_sched((C_Block *)cfb_key,ks);
> +	memcpy(cfb_tmp,cfb_iv,sizeof(cfb_iv));
> +	des_cfb_encrypt(plain,cfb_buf1,bits,(long)sizeof(plain),ks,
> +		(C_Block *)cfb_tmp,DES_ENCRYPT);
> +	if (memcmp(cfb_cipher,cfb_buf1,sizeof(plain)) != 0)
> +		{
> +		err=1;
> +		printf("cfb_encrypt encrypt error\n");
> +		for (i=0; i<24; i+=8)
> +			printf("%s\n",pt(&(cfb_buf1[i])));
> +		}
> +	memcpy(cfb_tmp,cfb_iv,sizeof(cfb_iv));
> +	des_cfb_encrypt(cfb_buf1,cfb_buf2,bits,(long)sizeof(plain),ks,
> +		(C_Block *)cfb_tmp,DES_DECRYPT);
> +	if (memcmp(plain,cfb_buf2,sizeof(plain)) != 0)
> +		{
> +		err=1;
> +		printf("cfb_encrypt decrypt error\n");
> +		for (i=0; i<24; i+=8)
> +			printf("%s\n",pt(&(cfb_buf1[i])));
> +		}
> +	return(err);
> +	}
> +
> +static int cfb64_test(cfb_cipher)
> +unsigned char *cfb_cipher;
> +	{
> +	des_key_schedule ks;
> +	int err=0,i,n;
> +
> +	des_key_sched((C_Block *)cfb_key,ks);
> +	memcpy(cfb_tmp,cfb_iv,sizeof(cfb_iv));
> +	n=0;
> +	des_cfb64_encrypt(plain,cfb_buf1,(long)12,ks,
> +		(C_Block *)cfb_tmp,&n,DES_ENCRYPT);
> +	des_cfb64_encrypt(&(plain[12]),&(cfb_buf1[12]),
> +		(long)sizeof(plain)-12,ks,
> +		(C_Block *)cfb_tmp,&n,DES_ENCRYPT);
> +	if (memcmp(cfb_cipher,cfb_buf1,sizeof(plain)) != 0)
> +		{
> +		err=1;
> +		printf("cfb_encrypt encrypt error\n");
> +		for (i=0; i<24; i+=8)
> +			printf("%s\n",pt(&(cfb_buf1[i])));
> +		}
> +	memcpy(cfb_tmp,cfb_iv,sizeof(cfb_iv));
> +	n=0;
> +	des_cfb64_encrypt(cfb_buf1,cfb_buf2,(long)17,ks,
> +		(C_Block *)cfb_tmp,&n,DES_DECRYPT);
> +	des_cfb64_encrypt(&(cfb_buf1[17]),&(cfb_buf2[17]),
> +		(long)sizeof(plain)-17,ks,
> +		(C_Block *)cfb_tmp,&n,DES_DECRYPT);
> +	if (memcmp(plain,cfb_buf2,sizeof(plain)) != 0)
> +		{
> +		err=1;
> +		printf("cfb_encrypt decrypt error\n");
> +		for (i=0; i<24; i+=8)
> +			printf("%s\n",pt(&(cfb_buf2[i])));
> +		}
> +	return(err);
> +	}
> +
> +static int ede_cfb64_test(cfb_cipher)
> +unsigned char *cfb_cipher;
> +	{
> +	des_key_schedule ks;
> +	int err=0,i,n;
> +
> +	des_key_sched((C_Block *)cfb_key,ks);
> +	memcpy(cfb_tmp,cfb_iv,sizeof(cfb_iv));
> +	n=0;
> +	des_ede3_cfb64_encrypt(plain,cfb_buf1,(long)12,ks,ks,ks,
> +		(C_Block *)cfb_tmp,&n,DES_ENCRYPT);
> +	des_ede3_cfb64_encrypt(&(plain[12]),&(cfb_buf1[12]),
> +		(long)sizeof(plain)-12,ks,ks,ks,
> +		(C_Block *)cfb_tmp,&n,DES_ENCRYPT);
> +	if (memcmp(cfb_cipher,cfb_buf1,sizeof(plain)) != 0)
> +		{
> +		err=1;
> +		printf("ede_cfb_encrypt encrypt error\n");
> +		for (i=0; i<24; i+=8)
> +			printf("%s\n",pt(&(cfb_buf1[i])));
> +		}
> +	memcpy(cfb_tmp,cfb_iv,sizeof(cfb_iv));
> +	n=0;
> +	des_ede3_cfb64_encrypt(cfb_buf1,cfb_buf2,(long)17,ks,ks,ks,
> +		(C_Block *)cfb_tmp,&n,DES_DECRYPT);
> +	des_ede3_cfb64_encrypt(&(cfb_buf1[17]),&(cfb_buf2[17]),
> +		(long)sizeof(plain)-17,ks,ks,ks,
> +		(C_Block *)cfb_tmp,&n,DES_DECRYPT);
> +	if (memcmp(plain,cfb_buf2,sizeof(plain)) != 0)
> +		{
> +		err=1;
> +		printf("ede_cfb_encrypt decrypt error\n");
> +		for (i=0; i<24; i+=8)
> +			printf("%s\n",pt(&(cfb_buf2[i])));
> +		}
> +	return(err);
> +	}
> +
> +#endif
> +
> diff -Naur linux/cryptolib/libdes/ecb_enc.c linux-crypto/cryptolib/libdes/ecb_enc.c
> --- linux/cryptolib/libdes/ecb_enc.c	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/cryptolib/libdes/ecb_enc.c	Tue Aug 27 11:20:55 2002
> @@ -0,0 +1,128 @@
> +/* crypto/des/ecb_enc.c */
> +/* Copyright (C) 1995-1997 Eric Young ([email protected])
> + * All rights reserved.
> + *
> + * This package is an SSL implementation written
> + * by Eric Young ([email protected]).
> + * The implementation was written so as to conform with Netscapes SSL.
> + * 
> + * This library is free for commercial and non-commercial use as long as
> + * the following conditions are aheared to.  The following conditions
> + * apply to all code found in this distribution, be it the RC4, RSA,
> + * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
> + * included with this distribution is covered by the same copyright terms
> + * except that the holder is Tim Hudson ([email protected]).
> + * 
> + * Copyright remains Eric Young's, and as such any Copyright notices in
> + * the code are not to be removed.
> + * If this package is used in a product, Eric Young should be given attribution
> + * as the author of the parts of the library used.
> + * This can be in the form of a textual message at program startup or
> + * in documentation (online or textual) provided with the package.
> + * 
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the copyright
> + *    notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + *    notice, this list of conditions and the following disclaimer in the
> + *    documentation and/or other materials provided with the distribution.
> + * 3. All advertising materials mentioning features or use of this software
> + *    must display the following acknowledgement:
> + *    "This product includes cryptographic software written by
> + *     Eric Young ([email protected])"
> + *    The word 'cryptographic' can be left out if the rouines from the library
> + *    being used are not cryptographic related :-).
> + * 4. If you include any Windows specific code (or a derivative thereof) from 
> + *    the apps directory (application code) you must include an acknowledgement:
> + *    "This product includes software written by Tim Hudson ([email protected])"
> + * 
> + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + * 
> + * The licence and distribution terms for any publically available version or
> + * derivative of this code cannot be changed.  i.e. this code cannot simply be
> + * copied and put under another distribution licence
> + * [including the GNU Public Licence.]
> + */
> +
> +#include <linux/des_locl.h>
> +#include "spr.h"
> +
> +char *libdes_version="libdes v 3.24 - 20-Apr-1996 - eay";
> +char *DES_version="DES part of SSLeay 0.8.2b 08-Jan-1998";
> +
> +/* RCSID $Id: ecb_enc.c,v 1.5 1999/04/05 22:02:01 henry Exp $ */
> +/* This function ifdef'ed out for FreeS/WAN project. */
> +#ifdef notdef
> +char *des_options()
> +	{
> +	static int init=1;
> +	static char buf[32];
> +
> +	if (init)
> +		{
> +		char *ptr,*unroll,*risc,*size;
> +
> +		init=0;
> +#ifdef DES_PTR
> +		ptr="ptr";
> +#else
> +		ptr="idx";
> +#endif
> +#if defined(DES_RISC1) || defined(DES_RISC2)
> +#ifdef DES_RISC1
> +		risc="risc1";
> +#endif
> +#ifdef DES_RISC2
> +		risc="risc2";
> +#endif
> +#else
> +		risc="cisc";
> +#endif
> +#ifdef DES_UNROLL
> +		unroll="16";
> +#else
> +		unroll="4";
> +#endif
> +		if (sizeof(DES_LONG) != sizeof(long))
> +			size="int";
> +		else
> +			size="long";
> +		sprintf(buf,"des(%s,%s,%s,%s)",ptr,risc,unroll,size);
> +		}
> +	return(buf);
> +	}
> +#endif
> +		
> +
> +void des_ecb_encrypt(input, output, ks, enc)
> +des_cblock (*input);
> +des_cblock (*output);
> +des_key_schedule ks;
> +int enc;
> +	{
> +	register DES_LONG l;
> +	register unsigned char *in,*out;
> +	DES_LONG ll[2];
> +
> +	in=(unsigned char *)input;
> +	out=(unsigned char *)output;
> +	c2l(in,l); ll[0]=l;
> +	c2l(in,l); ll[1]=l;
> +	des_encrypt(ll,ks,enc);
> +	l=ll[0]; l2c(l,out);
> +	l=ll[1]; l2c(l,out);
> +	l=ll[0]=ll[1]=0;
> +	}
> +
> diff -Naur linux/cryptolib/libdes/fcrypt.c linux-crypto/cryptolib/libdes/fcrypt.c
> --- linux/cryptolib/libdes/fcrypt.c	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/cryptolib/libdes/fcrypt.c	Tue Aug 27 11:20:55 2002
> @@ -0,0 +1,152 @@
> +/* NOCW */
> +
> +/* This version of crypt has been developed from my MIT compatable
> + * DES library.
> + * The library is available at pub/Crypto/DES at ftp.psy.uq.oz.au
> + * Eric Young ([email protected])
> + */
> +
> +/* Modification by Jens Kupferschmidt (Cu)
> + * I have included directive PARA for shared memory computers.
> + * I have included a directive LONGCRYPT to using this routine to cipher
> + * passwords with more then 8 bytes like HP-UX 10.x it used. The MAXPLEN
> + * definition is the maximum of lenght of password and can changed. I have
> + * defined 24.
> + */
> +
> +#include "des_locl.h"
> +
> +/* Added more values to handle illegal salt values the way normal
> + * crypt() implementations do.  The patch was sent by 
> + * Bjorn Gronvall <[email protected]>
> + */
> +static unsigned const char con_salt[128]={
> +0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,
> +0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0,0xE1,
> +0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,
> +0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,
> +0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,
> +0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,0x00,0x01,
> +0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
> +0x0A,0x0B,0x05,0x06,0x07,0x08,0x09,0x0A,
> +0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,
> +0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,
> +0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,
> +0x23,0x24,0x25,0x20,0x21,0x22,0x23,0x24,
> +0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,
> +0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,
> +0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,
> +0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,
> +};
> +
> +static unsigned const char cov_2char[64]={
> +0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,
> +0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,
> +0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,
> +0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,
> +0x55,0x56,0x57,0x58,0x59,0x5A,0x61,0x62,
> +0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,
> +0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,
> +0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A
> +};
> +
> +#ifndef NOPROTO
> +void fcrypt_body(DES_LONG *out,des_key_schedule ks,
> +	DES_LONG Eswap0, DES_LONG Eswap1);
> +
> +#ifdef PERL5
> +char *des_crypt(const char *buf,const char *salt);
> +#else
> +char *crypt(const char *buf,const char *salt);
> +#endif
> +#else
> +void fcrypt_body();
> +#ifdef PERL5
> +char *des_crypt();
> +#else
> +char *crypt();
> +#endif
> +#endif
> +
> +#ifdef PERL5
> +char *des_crypt(buf,salt)
> +#else
> +char *crypt(buf,salt)
> +#endif
> +const char *buf;
> +const char *salt;
> +	{
> +	static char buff[14];
> +
> +	return(des_fcrypt(buf,salt,buff));
> +	}
> +
> +
> +char *des_fcrypt(buf,salt,ret)
> +const char *buf;
> +const char *salt;
> +char *ret;
> +	{
> +	unsigned int i,j,x,y;
> +	DES_LONG Eswap0,Eswap1;
> +	DES_LONG out[2],ll;
> +	des_cblock key;
> +	des_key_schedule ks;
> +	unsigned char bb[9];
> +	unsigned char *b=bb;
> +	unsigned char c,u;
> +
> +	/* eay 25/08/92
> +	 * If you call crypt("pwd","*") as often happens when you
> +	 * have * as the pwd field in /etc/passwd, the function
> +	 * returns *\0XXXXXXXXX
> +	 * The \0 makes the string look like * so the pwd "*" would
> +	 * crypt to "*".  This was found when replacing the crypt in
> +	 * our shared libraries.  People found that the disbled
> +	 * accounts effectivly had no passwd :-(. */
> +	x=ret[0]=((salt[0] == '\0')?'A':salt[0]);
> +	Eswap0=con_salt[x]<<2;
> +	x=ret[1]=((salt[1] == '\0')?'A':salt[1]);
> +	Eswap1=con_salt[x]<<6;
> +
> +/* EAY
> +r=strlen(buf);
> +r=(r+7)/8;
> +*/
> +	for (i=0; i<8; i++)
> +		{
> +		c= *(buf++);
> +		if (!c) break;
> +		key[i]=(c<<1);
> +		}
> +	for (; i<8; i++)
> +		key[i]=0;
> +
> +	des_set_key((des_cblock *)(key),ks);
> +	fcrypt_body(&(out[0]),ks,Eswap0,Eswap1);
> +
> +	ll=out[0]; l2c(ll,b);
> +	ll=out[1]; l2c(ll,b);
> +	y=0;
> +	u=0x80;
> +	bb[8]=0;
> +	for (i=2; i<13; i++)
> +		{
> +		c=0;
> +		for (j=0; j<6; j++)
> +			{
> +			c<<=1;
> +			if (bb[y] & u) c|=1;
> +			u>>=1;
> +			if (!u)
> +				{
> +				y++;
> +				u=0x80;
> +				}
> +			}
> +		ret[i]=cov_2char[c];
> +		}
> +	ret[13]='\0';
> +	return(ret);
> +	}
> +
> diff -Naur linux/cryptolib/libdes/fcrypt_b.c linux-crypto/cryptolib/libdes/fcrypt_b.c
> --- linux/cryptolib/libdes/fcrypt_b.c	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/cryptolib/libdes/fcrypt_b.c	Tue Aug 27 11:20:55 2002
> @@ -0,0 +1,150 @@
> +/* crypto/des/fcrypt_b.c */
> +/* Copyright (C) 1995-1997 Eric Young ([email protected])
> + * All rights reserved.
> + *
> + * This package is an SSL implementation written
> + * by Eric Young ([email protected]).
> + * The implementation was written so as to conform with Netscapes SSL.
> + * 
> + * This library is free for commercial and non-commercial use as long as
> + * the following conditions are aheared to.  The following conditions
> + * apply to all code found in this distribution, be it the RC4, RSA,
> + * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
> + * included with this distribution is covered by the same copyright terms
> + * except that the holder is Tim Hudson ([email protected]).
> + * 
> + * Copyright remains Eric Young's, and as such any Copyright notices in
> + * the code are not to be removed.
> + * If this package is used in a product, Eric Young should be given attribution
> + * as the author of the parts of the library used.
> + * This can be in the form of a textual message at program startup or
> + * in documentation (online or textual) provided with the package.
> + * 
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the copyright
> + *    notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + *    notice, this list of conditions and the following disclaimer in the
> + *    documentation and/or other materials provided with the distribution.
> + * 3. All advertising materials mentioning features or use of this software
> + *    must display the following acknowledgement:
> + *    "This product includes cryptographic software written by
> + *     Eric Young ([email protected])"
> + *    The word 'cryptographic' can be left out if the rouines from the library
> + *    being used are not cryptographic related :-).
> + * 4. If you include any Windows specific code (or a derivative thereof) from 
> + *    the apps directory (application code) you must include an acknowledgement:
> + *    "This product includes software written by Tim Hudson ([email protected])"
> + * 
> + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + * 
> + * The licence and distribution terms for any publically available version or
> + * derivative of this code cannot be changed.  i.e. this code cannot simply be
> + * copied and put under another distribution licence
> + * [including the GNU Public Licence.]
> + */
> +
> +#ifndef __KERNEL__
> +#include <stdio.h>
> +#endif
> +
> +/* This version of crypt has been developed from my MIT compatable
> + * DES library.
> + * The library is available at pub/Crypto/DES at ftp.psy.uq.oz.au
> + * Eric Young ([email protected])
> + */
> +
> +#define DES_FCRYPT
> +#include "des_locl.h"
> +#undef DES_FCRYPT
> +
> +#undef PERM_OP
> +#define PERM_OP(a,b,t,n,m) ((t)=((((a)>>(n))^(b))&(m)),\
> +	(b)^=(t),\
> +	(a)^=((t)<<(n)))
> +
> +#undef HPERM_OP
> +#define HPERM_OP(a,t,n,m) ((t)=((((a)<<(16-(n)))^(a))&(m)),\
> +	(a)=(a)^(t)^(t>>(16-(n))))\
> +
> +void fcrypt_body(out, ks, Eswap0, Eswap1)
> +DES_LONG *out;
> +des_key_schedule ks;
> +DES_LONG Eswap0;
> +DES_LONG Eswap1;
> +	{
> +	register DES_LONG l,r,t,u;
> +#ifdef DES_PTR
> +	register unsigned char *des_SP=(unsigned char *)des_SPtrans;
> +#endif
> +	register DES_LONG *s;
> +	register int j;
> +	register DES_LONG E0,E1;
> +
> +	l=0;
> +	r=0;
> +
> +	s=(DES_LONG *)ks;
> +	E0=Eswap0;
> +	E1=Eswap1;
> +
> +	for (j=0; j<25; j++)
> +		{
> +#ifdef DES_UNROLL
> +		register int i;
> +
> +		for (i=0; i<32; i+=8)
> +			{
> +			D_ENCRYPT(l,r,i+0); /*  1 */
> +			D_ENCRYPT(r,l,i+2); /*  2 */
> +			D_ENCRYPT(l,r,i+4); /*  1 */
> +			D_ENCRYPT(r,l,i+6); /*  2 */
> +			}
> +#else
> +		D_ENCRYPT(l,r, 0); /*  1 */
> +		D_ENCRYPT(r,l, 2); /*  2 */
> +		D_ENCRYPT(l,r, 4); /*  3 */
> +		D_ENCRYPT(r,l, 6); /*  4 */
> +		D_ENCRYPT(l,r, 8); /*  5 */
> +		D_ENCRYPT(r,l,10); /*  6 */
> +		D_ENCRYPT(l,r,12); /*  7 */
> +		D_ENCRYPT(r,l,14); /*  8 */
> +		D_ENCRYPT(l,r,16); /*  9 */
> +		D_ENCRYPT(r,l,18); /*  10 */
> +		D_ENCRYPT(l,r,20); /*  11 */
> +		D_ENCRYPT(r,l,22); /*  12 */
> +		D_ENCRYPT(l,r,24); /*  13 */
> +		D_ENCRYPT(r,l,26); /*  14 */
> +		D_ENCRYPT(l,r,28); /*  15 */
> +		D_ENCRYPT(r,l,30); /*  16 */
> +#endif
> +
> +		t=l;
> +		l=r;
> +		r=t;
> +		}
> +	l=ROTATE(l,3)&0xffffffffL;
> +	r=ROTATE(r,3)&0xffffffffL;
> +
> +	PERM_OP(l,r,t, 1,0x55555555L);
> +	PERM_OP(r,l,t, 8,0x00ff00ffL);
> +	PERM_OP(l,r,t, 2,0x33333333L);
> +	PERM_OP(r,l,t,16,0x0000ffffL);
> +	PERM_OP(l,r,t, 4,0x0f0f0f0fL);
> +
> +	out[0]=r;
> +	out[1]=l;
> +	}
> +
> diff -Naur linux/cryptolib/libdes/options.txt linux-crypto/cryptolib/libdes/options.txt
> --- linux/cryptolib/libdes/options.txt	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/cryptolib/libdes/options.txt	Tue Aug 27 11:20:55 2002
> @@ -0,0 +1,39 @@
> +Note that the UNROLL option makes the 'inner' des loop unroll all 16 rounds
> +instead of the default 4.
> +RISC1 and RISC2 are 2 alternatives for the inner loop and
> +PTR means to use pointers arithmatic instead of arrays.
> +
> +FreeBSD - Pentium Pro 200mhz - gcc 2.7.2.2 - assembler		577,000 4620k/s
> +IRIX 6.2 - R10000 195mhz - cc (-O3 -n32) - UNROLL RISC2 PTR	496,000 3968k/s
> +solaris 2.5.1 usparc 167mhz?? - SC4.0 - UNROLL RISC1 PTR [1]	459,400 3672k/s
> +FreeBSD - Pentium Pro 200mhz - gcc 2.7.2.2 - UNROLL RISC1	433,000 3468k/s
> +solaris 2.5.1 usparc 167mhz?? - gcc 2.7.2 - UNROLL 		380,000 3041k/s
> +linux - pentium 100mhz - gcc 2.7.0 - assembler			281,000 2250k/s
> +NT 4.0 - pentium 100mhz - VC 4.2 - assembler			281,000 2250k/s
> +AIX 4.1? - PPC604 100mhz - cc - UNROLL 				275,000 2200k/s
> +IRIX 5.3 - R4400 200mhz - gcc 2.6.3 - UNROLL RISC2 PTR		235,300 1882k/s
> +IRIX 5.3 - R4400 200mhz - cc - UNROLL RISC2 PTR			233,700 1869k/s
> +NT 4.0 - pentium 100mhz - VC 4.2 - UNROLL RISC1 PTR		191,000 1528k/s
> +DEC Alpha 165mhz??  - cc - RISC2 PTR [2]			181,000 1448k/s
> +linux - pentium 100mhz - gcc 2.7.0 - UNROLL RISC1 PTR		158,500 1268k/s
> +HPUX 10 - 9000/887 - cc - UNROLL [3]	 			148,000	1190k/s
> +solaris 2.5.1 - sparc 10 50mhz - gcc 2.7.2 - UNROLL		123,600  989k/s
> +IRIX 5.3 - R4000 100mhz - cc - UNROLL RISC2 PTR			101,000  808k/s
> +DGUX - 88100 50mhz(?) - gcc 2.6.3 - UNROLL			 81,000  648k/s
> +solaris 2.4 486 50mhz - gcc 2.6.3 - assembler			 65,000  522k/s
> +HPUX 10 - 9000/887 - k&r cc (default compiler) - UNROLL PTR	 76,000	 608k/s
> +solaris 2.4 486 50mhz - gcc 2.6.3 - UNROLL RISC2		 43,500  344k/s
> +AIX - old slow one :-) - cc -					 39,000  312k/s
> +
> +Notes.
> +[1] For the ultra sparc, SunC 4.0 
> +    cc -xtarget=ultra -xarch=v8plus -Xa -xO5, running 'des_opts'
> +    gives a speed of 344,000 des/s while 'speed' gives 459,000 des/s.
> +    I'll record the higher since it is coming from the library but it
> +    is all rather weird.
> +[2] Similar to the ultra sparc ([1]), 181,000 for 'des_opts' vs 175,000.
> +[3] I was unable to get access to this machine when it was not heavily loaded.
> +    As such, my timing program was never able to get more that %30 of the CPU.
> +    This would cause the program to give much lower speed numbers because
> +    it would be 'fighting' to stay in the cache with the other CPU burning
> +    processes.
> diff -Naur linux/cryptolib/libdes/podd.h linux-crypto/cryptolib/libdes/podd.h
> --- linux/cryptolib/libdes/podd.h	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/cryptolib/libdes/podd.h	Tue Aug 27 11:20:55 2002
> @@ -0,0 +1,75 @@
> +/* crypto/des/podd.h */
> +/* Copyright (C) 1995-1997 Eric Young ([email protected])
> + * All rights reserved.
> + *
> + * This package is an SSL implementation written
> + * by Eric Young ([email protected]).
> + * The implementation was written so as to conform with Netscapes SSL.
> + * 
> + * This library is free for commercial and non-commercial use as long as
> + * the following conditions are aheared to.  The following conditions
> + * apply to all code found in this distribution, be it the RC4, RSA,
> + * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
> + * included with this distribution is covered by the same copyright terms
> + * except that the holder is Tim Hudson ([email protected]).
> + * 
> + * Copyright remains Eric Young's, and as such any Copyright notices in
> + * the code are not to be removed.
> + * If this package is used in a product, Eric Young should be given attribution
> + * as the author of the parts of the library used.
> + * This can be in the form of a textual message at program startup or
> + * in documentation (online or textual) provided with the package.
> + * 
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the copyright
> + *    notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + *    notice, this list of conditions and the following disclaimer in the
> + *    documentation and/or other materials provided with the distribution.
> + * 3. All advertising materials mentioning features or use of this software
> + *    must display the following acknowledgement:
> + *    "This product includes cryptographic software written by
> + *     Eric Young ([email protected])"
> + *    The word 'cryptographic' can be left out if the rouines from the library
> + *    being used are not cryptographic related :-).
> + * 4. If you include any Windows specific code (or a derivative thereof) from 
> + *    the apps directory (application code) you must include an acknowledgement:
> + *    "This product includes software written by Tim Hudson ([email protected])"
> + * 
> + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + * 
> + * The licence and distribution terms for any publically available version or
> + * derivative of this code cannot be changed.  i.e. this code cannot simply be
> + * copied and put under another distribution licence
> + * [including the GNU Public Licence.]
> + */
> +
> +static const unsigned char odd_parity[256]={
> +  1,  1,  2,  2,  4,  4,  7,  7,  8,  8, 11, 11, 13, 13, 14, 14,
> + 16, 16, 19, 19, 21, 21, 22, 22, 25, 25, 26, 26, 28, 28, 31, 31,
> + 32, 32, 35, 35, 37, 37, 38, 38, 41, 41, 42, 42, 44, 44, 47, 47,
> + 49, 49, 50, 50, 52, 52, 55, 55, 56, 56, 59, 59, 61, 61, 62, 62,
> + 64, 64, 67, 67, 69, 69, 70, 70, 73, 73, 74, 74, 76, 76, 79, 79,
> + 81, 81, 82, 82, 84, 84, 87, 87, 88, 88, 91, 91, 93, 93, 94, 94,
> + 97, 97, 98, 98,100,100,103,103,104,104,107,107,109,109,110,110,
> +112,112,115,115,117,117,118,118,121,121,122,122,124,124,127,127,
> +128,128,131,131,133,133,134,134,137,137,138,138,140,140,143,143,
> +145,145,146,146,148,148,151,151,152,152,155,155,157,157,158,158,
> +161,161,162,162,164,164,167,167,168,168,171,171,173,173,174,174,
> +176,176,179,179,181,181,182,182,185,185,186,186,188,188,191,191,
> +193,193,194,194,196,196,199,199,200,200,203,203,205,205,206,206,
> +208,208,211,211,213,213,214,214,217,217,218,218,220,220,223,223,
> +224,224,227,227,229,229,230,230,233,233,234,234,236,236,239,239,
> +241,241,242,242,244,244,247,247,248,248,251,251,253,253,254,254};
> diff -Naur linux/cryptolib/libdes/set_key.c linux-crypto/cryptolib/libdes/set_key.c
> --- linux/cryptolib/libdes/set_key.c	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/cryptolib/libdes/set_key.c	Tue Aug 27 11:20:55 2002
> @@ -0,0 +1,246 @@
> +/* crypto/des/set_key.c */
> +/* Copyright (C) 1995-1997 Eric Young ([email protected])
> + * All rights reserved.
> + *
> + * This package is an SSL implementation written
> + * by Eric Young ([email protected]).
> + * The implementation was written so as to conform with Netscapes SSL.
> + * 
> + * This library is free for commercial and non-commercial use as long as
> + * the following conditions are aheared to.  The following conditions
> + * apply to all code found in this distribution, be it the RC4, RSA,
> + * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
> + * included with this distribution is covered by the same copyright terms
> + * except that the holder is Tim Hudson ([email protected]).
> + * 
> + * Copyright remains Eric Young's, and as such any Copyright notices in
> + * the code are not to be removed.
> + * If this package is used in a product, Eric Young should be given attribution
> + * as the author of the parts of the library used.
> + * This can be in the form of a textual message at program startup or
> + * in documentation (online or textual) provided with the package.
> + * 
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the copyright
> + *    notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + *    notice, this list of conditions and the following disclaimer in the
> + *    documentation and/or other materials provided with the distribution.
> + * 3. All advertising materials mentioning features or use of this software
> + *    must display the following acknowledgement:
> + *    "This product includes cryptographic software written by
> + *     Eric Young ([email protected])"
> + *    The word 'cryptographic' can be left out if the rouines from the library
> + *    being used are not cryptographic related :-).
> + * 4. If you include any Windows specific code (or a derivative thereof) from 
> + *    the apps directory (application code) you must include an acknowledgement:
> + *    "This product includes software written by Tim Hudson ([email protected])"
> + * 
> + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + * 
> + * The licence and distribution terms for any publically available version or
> + * derivative of this code cannot be changed.  i.e. this code cannot simply be
> + * copied and put under another distribution licence
> + * [including the GNU Public Licence.]
> + */
> +
> +/* set_key.c v 1.4 eay 24/9/91
> + * 1.4 Speed up by 400% :-)
> + * 1.3 added register declarations.
> + * 1.2 unrolled make_key_sched a bit more
> + * 1.1 added norm_expand_bits
> + * 1.0 First working version
> + */
> +#include <linux/des_locl.h>
> +#include "podd.h"
> +#include "sk.h"
> +
> +#ifndef NOPROTO
> +static int check_parity(des_cblock (*key));
> +#else
> +static int check_parity();
> +#endif
> +
> +int des_check_key=0;
> +
> +void des_set_odd_parity(key)
> +des_cblock (*key);
> +	{
> +	int i;
> +
> +	for (i=0; i<DES_KEY_SZ; i++)
> +		(*key)[i]=odd_parity[(*key)[i]];
> +	}
> +
> +static int check_parity(key)
> +des_cblock (*key);
> +	{
> +	int i;
> +
> +	for (i=0; i<DES_KEY_SZ; i++)
> +		{
> +		if ((*key)[i] != odd_parity[(*key)[i]])
> +			return(0);
> +		}
> +	return(1);
> +	}
> +
> +/* Weak and semi week keys as take from
> + * %A D.W. Davies
> + * %A W.L. Price
> + * %T Security for Computer Networks
> + * %I John Wiley & Sons
> + * %D 1984
> + * Many thanks to [email protected] (Steven Bellovin) for the reference
> + * (and actual cblock values).
> + */
> +#define NUM_WEAK_KEY	16
> +static des_cblock weak_keys[NUM_WEAK_KEY]={
> +	/* weak keys */
> +	{0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01},
> +	{0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE},
> +	{0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F},
> +	{0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0},
> +	/* semi-weak keys */
> +	{0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE},
> +	{0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01},
> +	{0x1F,0xE0,0x1F,0xE0,0x0E,0xF1,0x0E,0xF1},
> +	{0xE0,0x1F,0xE0,0x1F,0xF1,0x0E,0xF1,0x0E},
> +	{0x01,0xE0,0x01,0xE0,0x01,0xF1,0x01,0xF1},
> +	{0xE0,0x01,0xE0,0x01,0xF1,0x01,0xF1,0x01},
> +	{0x1F,0xFE,0x1F,0xFE,0x0E,0xFE,0x0E,0xFE},
> +	{0xFE,0x1F,0xFE,0x1F,0xFE,0x0E,0xFE,0x0E},
> +	{0x01,0x1F,0x01,0x1F,0x01,0x0E,0x01,0x0E},
> +	{0x1F,0x01,0x1F,0x01,0x0E,0x01,0x0E,0x01},
> +	{0xE0,0xFE,0xE0,0xFE,0xF1,0xFE,0xF1,0xFE},
> +	{0xFE,0xE0,0xFE,0xE0,0xFE,0xF1,0xFE,0xF1}};
> +
> +int des_is_weak_key(key)
> +des_cblock (*key);
> +	{
> +	int i;
> +
> +	for (i=0; i<NUM_WEAK_KEY; i++)
> +		/* Added == 0 to comparision, I obviously don't run
> +		 * this section very often :-(, thanks to
> +		 * [email protected] for the fix
> +		 * eay 93/06/29
> +		 * Another problem, I was comparing only the first 4
> +		 * bytes, 97/03/18 */
> +		if (memcmp(weak_keys[i],key,sizeof(des_cblock)) == 0) return(1);
> +	return(0);
> +	}
> +
> +/* NOW DEFINED IN des_local.h
> + * See ecb_encrypt.c for a pseudo description of these macros. 
> + * #define PERM_OP(a,b,t,n,m) ((t)=((((a)>>(n))^(b))&(m)),\
> + * 	(b)^=(t),\
> + * 	(a)=((a)^((t)<<(n))))
> + */
> +
> +#define HPERM_OP(a,t,n,m) ((t)=((((a)<<(16-(n)))^(a))&(m)),\
> +	(a)=(a)^(t)^(t>>(16-(n))))
> +
> +/* return 0 if key parity is odd (correct),
> + * return -1 if key parity error,
> + * return -2 if illegal weak key.
> + */
> +int des_set_key(key, schedule)
> +des_cblock (*key);
> +des_key_schedule schedule;
> +	{
> +	static int shifts2[16]={0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0};
> +	register DES_LONG c,d,t,s,t2;
> +	register unsigned char *in;
> +	register DES_LONG *k;
> +	register int i;
> +
> +	if (des_check_key)
> +		{
> +		if (!check_parity(key))
> +			return(-1);
> +
> +		if (des_is_weak_key(key))
> +			return(-2);
> +		}
> +
> +	k=(DES_LONG *)schedule;
> +	in=(unsigned char *)key;
> +
> +	c2l(in,c);
> +	c2l(in,d);
> +
> +	/* do PC1 in 60 simple operations */ 
> +/*	PERM_OP(d,c,t,4,0x0f0f0f0fL);
> +	HPERM_OP(c,t,-2, 0xcccc0000L);
> +	HPERM_OP(c,t,-1, 0xaaaa0000L);
> +	HPERM_OP(c,t, 8, 0x00ff0000L);
> +	HPERM_OP(c,t,-1, 0xaaaa0000L);
> +	HPERM_OP(d,t,-8, 0xff000000L);
> +	HPERM_OP(d,t, 8, 0x00ff0000L);
> +	HPERM_OP(d,t, 2, 0x33330000L);
> +	d=((d&0x00aa00aaL)<<7L)|((d&0x55005500L)>>7L)|(d&0xaa55aa55L);
> +	d=(d>>8)|((c&0xf0000000L)>>4);
> +	c&=0x0fffffffL; */
> +
> +	/* I now do it in 47 simple operations :-)
> +	 * Thanks to John Fletcher ([email protected])
> +	 * for the inspiration. :-) */
> +	PERM_OP (d,c,t,4,0x0f0f0f0fL);
> +	HPERM_OP(c,t,-2,0xcccc0000L);
> +	HPERM_OP(d,t,-2,0xcccc0000L);
> +	PERM_OP (d,c,t,1,0x55555555L);
> +	PERM_OP (c,d,t,8,0x00ff00ffL);
> +	PERM_OP (d,c,t,1,0x55555555L);
> +	d=	(((d&0x000000ffL)<<16L)| (d&0x0000ff00L)     |
> +		 ((d&0x00ff0000L)>>16L)|((c&0xf0000000L)>>4L));
> +	c&=0x0fffffffL;
> +
> +	for (i=0; i<ITERATIONS; i++)
> +		{
> +		if (shifts2[i])
> +			{ c=((c>>2L)|(c<<26L)); d=((d>>2L)|(d<<26L)); }
> +		else
> +			{ c=((c>>1L)|(c<<27L)); d=((d>>1L)|(d<<27L)); }
> +		c&=0x0fffffffL;
> +		d&=0x0fffffffL;
> +		/* could be a few less shifts but I am to lazy at this
> +		 * point in time to investigate */
> +		s=	des_skb[0][ (c    )&0x3f                ]|
> +			des_skb[1][((c>> 6)&0x03)|((c>> 7L)&0x3c)]|
> +			des_skb[2][((c>>13)&0x0f)|((c>>14L)&0x30)]|
> +			des_skb[3][((c>>20)&0x01)|((c>>21L)&0x06) |
> +						  ((c>>22L)&0x38)];
> +		t=	des_skb[4][ (d    )&0x3f                ]|
> +			des_skb[5][((d>> 7L)&0x03)|((d>> 8L)&0x3c)]|
> +			des_skb[6][ (d>>15L)&0x3f                ]|
> +			des_skb[7][((d>>21L)&0x0f)|((d>>22L)&0x30)];
> +
> +		/* table contained 0213 4657 */
> +		t2=((t<<16L)|(s&0x0000ffffL))&0xffffffffL;
> +		*(k++)=ROTATE(t2,30)&0xffffffffL;
> +
> +		t2=((s>>16L)|(t&0xffff0000L));
> +		*(k++)=ROTATE(t2,26)&0xffffffffL;
> +		}
> +	return(0);
> +	}
> +
> +int des_key_sched(key, schedule)
> +des_cblock (*key);
> +des_key_schedule schedule;
> +	{
> +	return(des_set_key(key,schedule));
> +	}
> diff -Naur linux/cryptolib/libdes/sk.h linux-crypto/cryptolib/libdes/sk.h
> --- linux/cryptolib/libdes/sk.h	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/cryptolib/libdes/sk.h	Tue Aug 27 11:20:55 2002
> @@ -0,0 +1,204 @@
> +/* crypto/des/sk.h */
> +/* Copyright (C) 1995-1997 Eric Young ([email protected])
> + * All rights reserved.
> + *
> + * This package is an SSL implementation written
> + * by Eric Young ([email protected]).
> + * The implementation was written so as to conform with Netscapes SSL.
> + * 
> + * This library is free for commercial and non-commercial use as long as
> + * the following conditions are aheared to.  The following conditions
> + * apply to all code found in this distribution, be it the RC4, RSA,
> + * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
> + * included with this distribution is covered by the same copyright terms
> + * except that the holder is Tim Hudson ([email protected]).
> + * 
> + * Copyright remains Eric Young's, and as such any Copyright notices in
> + * the code are not to be removed.
> + * If this package is used in a product, Eric Young should be given attribution
> + * as the author of the parts of the library used.
> + * This can be in the form of a textual message at program startup or
> + * in documentation (online or textual) provided with the package.
> + * 
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the copyright
> + *    notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + *    notice, this list of conditions and the following disclaimer in the
> + *    documentation and/or other materials provided with the distribution.
> + * 3. All advertising materials mentioning features or use of this software
> + *    must display the following acknowledgement:
> + *    "This product includes cryptographic software written by
> + *     Eric Young ([email protected])"
> + *    The word 'cryptographic' can be left out if the rouines from the library
> + *    being used are not cryptographic related :-).
> + * 4. If you include any Windows specific code (or a derivative thereof) from 
> + *    the apps directory (application code) you must include an acknowledgement:
> + *    "This product includes software written by Tim Hudson ([email protected])"
> + * 
> + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + * 
> + * The licence and distribution terms for any publically available version or
> + * derivative of this code cannot be changed.  i.e. this code cannot simply be
> + * copied and put under another distribution licence
> + * [including the GNU Public Licence.]
> + */
> +
> +static const DES_LONG des_skb[8][64]={
> +{
> +/* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
> +0x00000000L,0x00000010L,0x20000000L,0x20000010L,
> +0x00010000L,0x00010010L,0x20010000L,0x20010010L,
> +0x00000800L,0x00000810L,0x20000800L,0x20000810L,
> +0x00010800L,0x00010810L,0x20010800L,0x20010810L,
> +0x00000020L,0x00000030L,0x20000020L,0x20000030L,
> +0x00010020L,0x00010030L,0x20010020L,0x20010030L,
> +0x00000820L,0x00000830L,0x20000820L,0x20000830L,
> +0x00010820L,0x00010830L,0x20010820L,0x20010830L,
> +0x00080000L,0x00080010L,0x20080000L,0x20080010L,
> +0x00090000L,0x00090010L,0x20090000L,0x20090010L,
> +0x00080800L,0x00080810L,0x20080800L,0x20080810L,
> +0x00090800L,0x00090810L,0x20090800L,0x20090810L,
> +0x00080020L,0x00080030L,0x20080020L,0x20080030L,
> +0x00090020L,0x00090030L,0x20090020L,0x20090030L,
> +0x00080820L,0x00080830L,0x20080820L,0x20080830L,
> +0x00090820L,0x00090830L,0x20090820L,0x20090830L,
> +},{
> +/* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */
> +0x00000000L,0x02000000L,0x00002000L,0x02002000L,
> +0x00200000L,0x02200000L,0x00202000L,0x02202000L,
> +0x00000004L,0x02000004L,0x00002004L,0x02002004L,
> +0x00200004L,0x02200004L,0x00202004L,0x02202004L,
> +0x00000400L,0x02000400L,0x00002400L,0x02002400L,
> +0x00200400L,0x02200400L,0x00202400L,0x02202400L,
> +0x00000404L,0x02000404L,0x00002404L,0x02002404L,
> +0x00200404L,0x02200404L,0x00202404L,0x02202404L,
> +0x10000000L,0x12000000L,0x10002000L,0x12002000L,
> +0x10200000L,0x12200000L,0x10202000L,0x12202000L,
> +0x10000004L,0x12000004L,0x10002004L,0x12002004L,
> +0x10200004L,0x12200004L,0x10202004L,0x12202004L,
> +0x10000400L,0x12000400L,0x10002400L,0x12002400L,
> +0x10200400L,0x12200400L,0x10202400L,0x12202400L,
> +0x10000404L,0x12000404L,0x10002404L,0x12002404L,
> +0x10200404L,0x12200404L,0x10202404L,0x12202404L,
> +},{
> +/* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */
> +0x00000000L,0x00000001L,0x00040000L,0x00040001L,
> +0x01000000L,0x01000001L,0x01040000L,0x01040001L,
> +0x00000002L,0x00000003L,0x00040002L,0x00040003L,
> +0x01000002L,0x01000003L,0x01040002L,0x01040003L,
> +0x00000200L,0x00000201L,0x00040200L,0x00040201L,
> +0x01000200L,0x01000201L,0x01040200L,0x01040201L,
> +0x00000202L,0x00000203L,0x00040202L,0x00040203L,
> +0x01000202L,0x01000203L,0x01040202L,0x01040203L,
> +0x08000000L,0x08000001L,0x08040000L,0x08040001L,
> +0x09000000L,0x09000001L,0x09040000L,0x09040001L,
> +0x08000002L,0x08000003L,0x08040002L,0x08040003L,
> +0x09000002L,0x09000003L,0x09040002L,0x09040003L,
> +0x08000200L,0x08000201L,0x08040200L,0x08040201L,
> +0x09000200L,0x09000201L,0x09040200L,0x09040201L,
> +0x08000202L,0x08000203L,0x08040202L,0x08040203L,
> +0x09000202L,0x09000203L,0x09040202L,0x09040203L,
> +},{
> +/* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */
> +0x00000000L,0x00100000L,0x00000100L,0x00100100L,
> +0x00000008L,0x00100008L,0x00000108L,0x00100108L,
> +0x00001000L,0x00101000L,0x00001100L,0x00101100L,
> +0x00001008L,0x00101008L,0x00001108L,0x00101108L,
> +0x04000000L,0x04100000L,0x04000100L,0x04100100L,
> +0x04000008L,0x04100008L,0x04000108L,0x04100108L,
> +0x04001000L,0x04101000L,0x04001100L,0x04101100L,
> +0x04001008L,0x04101008L,0x04001108L,0x04101108L,
> +0x00020000L,0x00120000L,0x00020100L,0x00120100L,
> +0x00020008L,0x00120008L,0x00020108L,0x00120108L,
> +0x00021000L,0x00121000L,0x00021100L,0x00121100L,
> +0x00021008L,0x00121008L,0x00021108L,0x00121108L,
> +0x04020000L,0x04120000L,0x04020100L,0x04120100L,
> +0x04020008L,0x04120008L,0x04020108L,0x04120108L,
> +0x04021000L,0x04121000L,0x04021100L,0x04121100L,
> +0x04021008L,0x04121008L,0x04021108L,0x04121108L,
> +},{
> +/* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
> +0x00000000L,0x10000000L,0x00010000L,0x10010000L,
> +0x00000004L,0x10000004L,0x00010004L,0x10010004L,
> +0x20000000L,0x30000000L,0x20010000L,0x30010000L,
> +0x20000004L,0x30000004L,0x20010004L,0x30010004L,
> +0x00100000L,0x10100000L,0x00110000L,0x10110000L,
> +0x00100004L,0x10100004L,0x00110004L,0x10110004L,
> +0x20100000L,0x30100000L,0x20110000L,0x30110000L,
> +0x20100004L,0x30100004L,0x20110004L,0x30110004L,
> +0x00001000L,0x10001000L,0x00011000L,0x10011000L,
> +0x00001004L,0x10001004L,0x00011004L,0x10011004L,
> +0x20001000L,0x30001000L,0x20011000L,0x30011000L,
> +0x20001004L,0x30001004L,0x20011004L,0x30011004L,
> +0x00101000L,0x10101000L,0x00111000L,0x10111000L,
> +0x00101004L,0x10101004L,0x00111004L,0x10111004L,
> +0x20101000L,0x30101000L,0x20111000L,0x30111000L,
> +0x20101004L,0x30101004L,0x20111004L,0x30111004L,
> +},{
> +/* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */
> +0x00000000L,0x08000000L,0x00000008L,0x08000008L,
> +0x00000400L,0x08000400L,0x00000408L,0x08000408L,
> +0x00020000L,0x08020000L,0x00020008L,0x08020008L,
> +0x00020400L,0x08020400L,0x00020408L,0x08020408L,
> +0x00000001L,0x08000001L,0x00000009L,0x08000009L,
> +0x00000401L,0x08000401L,0x00000409L,0x08000409L,
> +0x00020001L,0x08020001L,0x00020009L,0x08020009L,
> +0x00020401L,0x08020401L,0x00020409L,0x08020409L,
> +0x02000000L,0x0A000000L,0x02000008L,0x0A000008L,
> +0x02000400L,0x0A000400L,0x02000408L,0x0A000408L,
> +0x02020000L,0x0A020000L,0x02020008L,0x0A020008L,
> +0x02020400L,0x0A020400L,0x02020408L,0x0A020408L,
> +0x02000001L,0x0A000001L,0x02000009L,0x0A000009L,
> +0x02000401L,0x0A000401L,0x02000409L,0x0A000409L,
> +0x02020001L,0x0A020001L,0x02020009L,0x0A020009L,
> +0x02020401L,0x0A020401L,0x02020409L,0x0A020409L,
> +},{
> +/* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */
> +0x00000000L,0x00000100L,0x00080000L,0x00080100L,
> +0x01000000L,0x01000100L,0x01080000L,0x01080100L,
> +0x00000010L,0x00000110L,0x00080010L,0x00080110L,
> +0x01000010L,0x01000110L,0x01080010L,0x01080110L,
> +0x00200000L,0x00200100L,0x00280000L,0x00280100L,
> +0x01200000L,0x01200100L,0x01280000L,0x01280100L,
> +0x00200010L,0x00200110L,0x00280010L,0x00280110L,
> +0x01200010L,0x01200110L,0x01280010L,0x01280110L,
> +0x00000200L,0x00000300L,0x00080200L,0x00080300L,
> +0x01000200L,0x01000300L,0x01080200L,0x01080300L,
> +0x00000210L,0x00000310L,0x00080210L,0x00080310L,
> +0x01000210L,0x01000310L,0x01080210L,0x01080310L,
> +0x00200200L,0x00200300L,0x00280200L,0x00280300L,
> +0x01200200L,0x01200300L,0x01280200L,0x01280300L,
> +0x00200210L,0x00200310L,0x00280210L,0x00280310L,
> +0x01200210L,0x01200310L,0x01280210L,0x01280310L,
> +},{
> +/* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */
> +0x00000000L,0x04000000L,0x00040000L,0x04040000L,
> +0x00000002L,0x04000002L,0x00040002L,0x04040002L,
> +0x00002000L,0x04002000L,0x00042000L,0x04042000L,
> +0x00002002L,0x04002002L,0x00042002L,0x04042002L,
> +0x00000020L,0x04000020L,0x00040020L,0x04040020L,
> +0x00000022L,0x04000022L,0x00040022L,0x04040022L,
> +0x00002020L,0x04002020L,0x00042020L,0x04042020L,
> +0x00002022L,0x04002022L,0x00042022L,0x04042022L,
> +0x00000800L,0x04000800L,0x00040800L,0x04040800L,
> +0x00000802L,0x04000802L,0x00040802L,0x04040802L,
> +0x00002800L,0x04002800L,0x00042800L,0x04042800L,
> +0x00002802L,0x04002802L,0x00042802L,0x04042802L,
> +0x00000820L,0x04000820L,0x00040820L,0x04040820L,
> +0x00000822L,0x04000822L,0x00040822L,0x04040822L,
> +0x00002820L,0x04002820L,0x00042820L,0x04042820L,
> +0x00002822L,0x04002822L,0x00042822L,0x04042822L,
> +}};
> diff -Naur linux/cryptolib/libdes/speed.c linux-crypto/cryptolib/libdes/speed.c
> --- linux/cryptolib/libdes/speed.c	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/cryptolib/libdes/speed.c	Tue Aug 27 11:20:55 2002
> @@ -0,0 +1,329 @@
> +/* crypto/des/speed.c */
> +/* Copyright (C) 1995-1997 Eric Young ([email protected])
> + * All rights reserved.
> + *
> + * This package is an SSL implementation written
> + * by Eric Young ([email protected]).
> + * The implementation was written so as to conform with Netscapes SSL.
> + * 
> + * This library is free for commercial and non-commercial use as long as
> + * the following conditions are aheared to.  The following conditions
> + * apply to all code found in this distribution, be it the RC4, RSA,
> + * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
> + * included with this distribution is covered by the same copyright terms
> + * except that the holder is Tim Hudson ([email protected]).
> + * 
> + * Copyright remains Eric Young's, and as such any Copyright notices in
> + * the code are not to be removed.
> + * If this package is used in a product, Eric Young should be given attribution
> + * as the author of the parts of the library used.
> + * This can be in the form of a textual message at program startup or
> + * in documentation (online or textual) provided with the package.
> + * 
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the copyright
> + *    notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + *    notice, this list of conditions and the following disclaimer in the
> + *    documentation and/or other materials provided with the distribution.
> + * 3. All advertising materials mentioning features or use of this software
> + *    must display the following acknowledgement:
> + *    "This product includes cryptographic software written by
> + *     Eric Young ([email protected])"
> + *    The word 'cryptographic' can be left out if the rouines from the library
> + *    being used are not cryptographic related :-).
> + * 4. If you include any Windows specific code (or a derivative thereof) from 
> + *    the apps directory (application code) you must include an acknowledgement:
> + *    "This product includes software written by Tim Hudson ([email protected])"
> + * 
> + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + * 
> + * The licence and distribution terms for any publically available version or
> + * derivative of this code cannot be changed.  i.e. this code cannot simply be
> + * copied and put under another distribution licence
> + * [including the GNU Public Licence.]
> + */
> +
> +/* 11-Sep-92 Andrew Daviel   Support for Silicon Graphics IRIX added */
> +/* 06-Apr-92 Luke Brennan    Support for VMS and add extra signal calls */
> +
> +#ifndef MSDOS
> +#define TIMES
> +#endif
> +
> +#include <stdio.h>
> +#ifndef MSDOS
> +#include <unistd.h>
> +#else
> +#include <io.h>
> +extern int exit();
> +#endif
> +#include <signal.h>
> +#ifndef VMS
> +#ifndef _IRIX
> +#include <time.h>
> +#endif
> +#ifdef TIMES
> +#include <sys/types.h>
> +#include <sys/times.h>
> +#endif
> +#else /* VMS */
> +#include <types.h>
> +struct tms {
> +	time_t tms_utime;
> +	time_t tms_stime;
> +	time_t tms_uchild;	/* I dunno...  */
> +	time_t tms_uchildsys;	/* so these names are a guess :-) */
> +	}
> +#endif
> +#ifndef TIMES
> +#include <sys/timeb.h>
> +#endif
> +
> +#ifdef sun
> +#include <limits.h>
> +#include <sys/param.h>
> +#endif
> +
> +#include "des.h"
> +
> +/* The following if from times(3) man page.  It may need to be changed */
> +#ifndef HZ
> +# ifndef CLK_TCK
> +#  ifndef _BSD_CLK_TCK_ /* FreeBSD fix */
> +#   ifndef VMS
> +#    define HZ	100.0
> +#   else /* VMS */
> +#    define HZ	100.0
> +#   endif
> +#  else /* _BSD_CLK_TCK_ */
> +#   define HZ ((double)_BSD_CLK_TCK_)
> +#  endif
> +# else /* CLK_TCK */
> +#  define HZ ((double)CLK_TCK)
> +# endif
> +#endif
> +
> +#define BUFSIZE	((long)1024)
> +long run=0;
> +
> +#ifndef NOPROTO
> +double Time_F(int s);
> +#else
> +double Time_F();
> +#endif
> +
> +#ifdef SIGALRM
> +#if defined(__STDC__) || defined(sgi) || defined(_AIX)
> +#define SIGRETTYPE void
> +#else
> +#define SIGRETTYPE int
> +#endif
> +
> +#ifndef NOPROTO
> +SIGRETTYPE sig_done(int sig);
> +#else
> +SIGRETTYPE sig_done();
> +#endif
> +
> +SIGRETTYPE sig_done(sig)
> +int sig;
> +	{
> +	signal(SIGALRM,sig_done);
> +	run=0;
> +#ifdef LINT
> +	sig=sig;
> +#endif
> +	}
> +#endif
> +
> +#define START	0
> +#define STOP	1
> +
> +double Time_F(s)
> +int s;
> +	{
> +	double ret;
> +#ifdef TIMES
> +	static struct tms tstart,tend;
> +
> +	if (s == START)
> +		{
> +		times(&tstart);
> +		return(0);
> +		}
> +	else
> +		{
> +		times(&tend);
> +		ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ;
> +		return((ret == 0.0)?1e-6:ret);
> +		}
> +#else /* !times() */
> +	static struct timeb tstart,tend;
> +	long i;
> +
> +	if (s == START)
> +		{
> +		ftime(&tstart);
> +		return(0);
> +		}
> +	else
> +		{
> +		ftime(&tend);
> +		i=(long)tend.millitm-(long)tstart.millitm;
> +		ret=((double)(tend.time-tstart.time))+((double)i)/1e3;
> +		return((ret == 0.0)?1e-6:ret);
> +		}
> +#endif
> +	}
> +
> +int main(argc,argv)
> +int argc;
> +char **argv;
> +	{
> +	long count;
> +	static unsigned char buf[BUFSIZE];
> +	static des_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
> +	static des_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
> +	static des_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
> +	des_key_schedule sch,sch2,sch3;
> +	double a,b,c,d,e;
> +#ifndef SIGALRM
> +	long ca,cb,cc,cd,ce;
> +#endif
> +
> +#ifndef TIMES
> +	printf("To get the most acurate results, try to run this\n");
> +	printf("program when this computer is idle.\n");
> +#endif
> +
> +	des_set_key((C_Block *)key2,sch2);
> +	des_set_key((C_Block *)key3,sch3);
> +
> +#ifndef SIGALRM
> +	printf("First we calculate the approximate speed ...\n");
> +	des_set_key((C_Block *)key,sch);
> +	count=10;
> +	do	{
> +		long i;
> +		DES_LONG data[2];
> +
> +		count*=2;
> +		Time_F(START);
> +		for (i=count; i; i--)
> +			des_encrypt(data,&(sch[0]),DES_ENCRYPT);
> +		d=Time_F(STOP);
> +		} while (d < 3.0);
> +	ca=count;
> +	cb=count*3;
> +	cc=count*3*8/BUFSIZE+1;
> +	cd=count*8/BUFSIZE+1;
> +	ce=count/20+1;
> +	printf("Doing set_key %ld times\n",ca);
> +#define COND(d)	(count != (d))
> +#define COUNT(d) (d)
> +#else
> +#define COND(c)	(run)
> +#define COUNT(d) (count)
> +	signal(SIGALRM,sig_done);
> +	printf("Doing set_key for 10 seconds\n");
> +	alarm(10);
> +#endif
> +
> +	Time_F(START);
> +	for (count=0,run=1; COND(ca); count++)
> +		des_set_key((C_Block *)key,sch);
> +	d=Time_F(STOP);
> +	printf("%ld set_key's in %.2f seconds\n",count,d);
> +	a=((double)COUNT(ca))/d;
> +
> +#ifdef SIGALRM
> +	printf("Doing des_encrypt's for 10 seconds\n");
> +	alarm(10);
> +#else
> +	printf("Doing des_encrypt %ld times\n",cb);
> +#endif
> +	Time_F(START);
> +	for (count=0,run=1; COND(cb); count++)
> +		{
> +		DES_LONG data[2];
> +
> +		des_encrypt(data,&(sch[0]),DES_ENCRYPT);
> +		}
> +	d=Time_F(STOP);
> +	printf("%ld des_encrypt's in %.2f second\n",count,d);
> +	b=((double)COUNT(cb)*8)/d;
> +
> +#ifdef SIGALRM
> +	printf("Doing des_cbc_encrypt on %ld byte blocks for 10 seconds\n",
> +		BUFSIZE);
> +	alarm(10);
> +#else
> +	printf("Doing des_cbc_encrypt %ld times on %ld byte blocks\n",cc,
> +		BUFSIZE);
> +#endif
> +	Time_F(START);
> +	for (count=0,run=1; COND(cc); count++)
> +		des_ncbc_encrypt((C_Block *)buf,(C_Block *)buf,BUFSIZE,&(sch[0]),
> +			(C_Block *)&(key[0]),DES_ENCRYPT);
> +	d=Time_F(STOP);
> +	printf("%ld des_cbc_encrypt's of %ld byte blocks in %.2f second\n",
> +		count,BUFSIZE,d);
> +	c=((double)COUNT(cc)*BUFSIZE)/d;
> +
> +#ifdef SIGALRM
> +	printf("Doing des_ede_cbc_encrypt on %ld byte blocks for 10 seconds\n",
> +		BUFSIZE);
> +	alarm(10);
> +#else
> +	printf("Doing des_ede_cbc_encrypt %ld times on %ld byte blocks\n",cd,
> +		BUFSIZE);
> +#endif
> +	Time_F(START);
> +	for (count=0,run=1; COND(cd); count++)
> +		des_ede3_cbc_encrypt((C_Block *)buf,(C_Block *)buf,BUFSIZE,
> +			&(sch[0]),
> +			&(sch2[0]),
> +			&(sch3[0]),
> +			(C_Block *)&(key[0]),
> +			DES_ENCRYPT);
> +	d=Time_F(STOP);
> +	printf("%ld des_ede_cbc_encrypt's of %ld byte blocks in %.2f second\n",
> +		count,BUFSIZE,d);
> +	d=((double)COUNT(cd)*BUFSIZE)/d;
> +
> +#ifdef SIGALRM
> +	printf("Doing crypt for 10 seconds\n");
> +	alarm(10);
> +#else
> +	printf("Doing crypt %ld times\n",ce);
> +#endif
> +	Time_F(START);
> +	for (count=0,run=1; COND(ce); count++)
> +		crypt("testing1","ef");
> +	e=Time_F(STOP);
> +	printf("%ld crypts in %.2f second\n",count,e);
> +	e=((double)COUNT(ce))/e;
> +
> +	printf("set_key            per sec = %12.2f (%9.3fuS)\n",a,1.0e6/a);
> +	printf("DES raw ecb bytes  per sec = %12.2f (%9.3fuS)\n",b,8.0e6/b);
> +	printf("DES cbc bytes      per sec = %12.2f (%9.3fuS)\n",c,8.0e6/c);
> +	printf("DES ede cbc bytes  per sec = %12.2f (%9.3fuS)\n",d,8.0e6/d);
> +	printf("crypt              per sec = %12.2f (%9.3fuS)\n",e,1.0e6/e);
> +	exit(0);
> +#if defined(LINT) || defined(MSDOS)
> +	return(0);
> +#endif
> +	}
> diff -Naur linux/cryptolib/libdes/spr.h linux-crypto/cryptolib/libdes/spr.h
> --- linux/cryptolib/libdes/spr.h	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/cryptolib/libdes/spr.h	Tue Aug 27 11:20:55 2002
> @@ -0,0 +1,204 @@
> +/* crypto/des/spr.h */
> +/* Copyright (C) 1995-1997 Eric Young ([email protected])
> + * All rights reserved.
> + *
> + * This package is an SSL implementation written
> + * by Eric Young ([email protected]).
> + * The implementation was written so as to conform with Netscapes SSL.
> + * 
> + * This library is free for commercial and non-commercial use as long as
> + * the following conditions are aheared to.  The following conditions
> + * apply to all code found in this distribution, be it the RC4, RSA,
> + * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
> + * included with this distribution is covered by the same copyright terms
> + * except that the holder is Tim Hudson ([email protected]).
> + * 
> + * Copyright remains Eric Young's, and as such any Copyright notices in
> + * the code are not to be removed.
> + * If this package is used in a product, Eric Young should be given attribution
> + * as the author of the parts of the library used.
> + * This can be in the form of a textual message at program startup or
> + * in documentation (online or textual) provided with the package.
> + * 
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the copyright
> + *    notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + *    notice, this list of conditions and the following disclaimer in the
> + *    documentation and/or other materials provided with the distribution.
> + * 3. All advertising materials mentioning features or use of this software
> + *    must display the following acknowledgement:
> + *    "This product includes cryptographic software written by
> + *     Eric Young ([email protected])"
> + *    The word 'cryptographic' can be left out if the rouines from the library
> + *    being used are not cryptographic related :-).
> + * 4. If you include any Windows specific code (or a derivative thereof) from 
> + *    the apps directory (application code) you must include an acknowledgement:
> + *    "This product includes software written by Tim Hudson ([email protected])"
> + * 
> + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + * 
> + * The licence and distribution terms for any publically available version or
> + * derivative of this code cannot be changed.  i.e. this code cannot simply be
> + * copied and put under another distribution licence
> + * [including the GNU Public Licence.]
> + */
> +
> +const DES_LONG des_SPtrans[8][64]={
> +{
> +/* nibble 0 */
> +0x02080800L, 0x00080000L, 0x02000002L, 0x02080802L,
> +0x02000000L, 0x00080802L, 0x00080002L, 0x02000002L,
> +0x00080802L, 0x02080800L, 0x02080000L, 0x00000802L,
> +0x02000802L, 0x02000000L, 0x00000000L, 0x00080002L,
> +0x00080000L, 0x00000002L, 0x02000800L, 0x00080800L,
> +0x02080802L, 0x02080000L, 0x00000802L, 0x02000800L,
> +0x00000002L, 0x00000800L, 0x00080800L, 0x02080002L,
> +0x00000800L, 0x02000802L, 0x02080002L, 0x00000000L,
> +0x00000000L, 0x02080802L, 0x02000800L, 0x00080002L,
> +0x02080800L, 0x00080000L, 0x00000802L, 0x02000800L,
> +0x02080002L, 0x00000800L, 0x00080800L, 0x02000002L,
> +0x00080802L, 0x00000002L, 0x02000002L, 0x02080000L,
> +0x02080802L, 0x00080800L, 0x02080000L, 0x02000802L,
> +0x02000000L, 0x00000802L, 0x00080002L, 0x00000000L,
> +0x00080000L, 0x02000000L, 0x02000802L, 0x02080800L,
> +0x00000002L, 0x02080002L, 0x00000800L, 0x00080802L,
> +},{
> +/* nibble 1 */
> +0x40108010L, 0x00000000L, 0x00108000L, 0x40100000L,
> +0x40000010L, 0x00008010L, 0x40008000L, 0x00108000L,
> +0x00008000L, 0x40100010L, 0x00000010L, 0x40008000L,
> +0x00100010L, 0x40108000L, 0x40100000L, 0x00000010L,
> +0x00100000L, 0x40008010L, 0x40100010L, 0x00008000L,
> +0x00108010L, 0x40000000L, 0x00000000L, 0x00100010L,
> +0x40008010L, 0x00108010L, 0x40108000L, 0x40000010L,
> +0x40000000L, 0x00100000L, 0x00008010L, 0x40108010L,
> +0x00100010L, 0x40108000L, 0x40008000L, 0x00108010L,
> +0x40108010L, 0x00100010L, 0x40000010L, 0x00000000L,
> +0x40000000L, 0x00008010L, 0x00100000L, 0x40100010L,
> +0x00008000L, 0x40000000L, 0x00108010L, 0x40008010L,
> +0x40108000L, 0x00008000L, 0x00000000L, 0x40000010L,
> +0x00000010L, 0x40108010L, 0x00108000L, 0x40100000L,
> +0x40100010L, 0x00100000L, 0x00008010L, 0x40008000L,
> +0x40008010L, 0x00000010L, 0x40100000L, 0x00108000L,
> +},{
> +/* nibble 2 */
> +0x04000001L, 0x04040100L, 0x00000100L, 0x04000101L,
> +0x00040001L, 0x04000000L, 0x04000101L, 0x00040100L,
> +0x04000100L, 0x00040000L, 0x04040000L, 0x00000001L,
> +0x04040101L, 0x00000101L, 0x00000001L, 0x04040001L,
> +0x00000000L, 0x00040001L, 0x04040100L, 0x00000100L,
> +0x00000101L, 0x04040101L, 0x00040000L, 0x04000001L,
> +0x04040001L, 0x04000100L, 0x00040101L, 0x04040000L,
> +0x00040100L, 0x00000000L, 0x04000000L, 0x00040101L,
> +0x04040100L, 0x00000100L, 0x00000001L, 0x00040000L,
> +0x00000101L, 0x00040001L, 0x04040000L, 0x04000101L,
> +0x00000000L, 0x04040100L, 0x00040100L, 0x04040001L,
> +0x00040001L, 0x04000000L, 0x04040101L, 0x00000001L,
> +0x00040101L, 0x04000001L, 0x04000000L, 0x04040101L,
> +0x00040000L, 0x04000100L, 0x04000101L, 0x00040100L,
> +0x04000100L, 0x00000000L, 0x04040001L, 0x00000101L,
> +0x04000001L, 0x00040101L, 0x00000100L, 0x04040000L,
> +},{
> +/* nibble 3 */
> +0x00401008L, 0x10001000L, 0x00000008L, 0x10401008L,
> +0x00000000L, 0x10400000L, 0x10001008L, 0x00400008L,
> +0x10401000L, 0x10000008L, 0x10000000L, 0x00001008L,
> +0x10000008L, 0x00401008L, 0x00400000L, 0x10000000L,
> +0x10400008L, 0x00401000L, 0x00001000L, 0x00000008L,
> +0x00401000L, 0x10001008L, 0x10400000L, 0x00001000L,
> +0x00001008L, 0x00000000L, 0x00400008L, 0x10401000L,
> +0x10001000L, 0x10400008L, 0x10401008L, 0x00400000L,
> +0x10400008L, 0x00001008L, 0x00400000L, 0x10000008L,
> +0x00401000L, 0x10001000L, 0x00000008L, 0x10400000L,
> +0x10001008L, 0x00000000L, 0x00001000L, 0x00400008L,
> +0x00000000L, 0x10400008L, 0x10401000L, 0x00001000L,
> +0x10000000L, 0x10401008L, 0x00401008L, 0x00400000L,
> +0x10401008L, 0x00000008L, 0x10001000L, 0x00401008L,
> +0x00400008L, 0x00401000L, 0x10400000L, 0x10001008L,
> +0x00001008L, 0x10000000L, 0x10000008L, 0x10401000L,
> +},{
> +/* nibble 4 */
> +0x08000000L, 0x00010000L, 0x00000400L, 0x08010420L,
> +0x08010020L, 0x08000400L, 0x00010420L, 0x08010000L,
> +0x00010000L, 0x00000020L, 0x08000020L, 0x00010400L,
> +0x08000420L, 0x08010020L, 0x08010400L, 0x00000000L,
> +0x00010400L, 0x08000000L, 0x00010020L, 0x00000420L,
> +0x08000400L, 0x00010420L, 0x00000000L, 0x08000020L,
> +0x00000020L, 0x08000420L, 0x08010420L, 0x00010020L,
> +0x08010000L, 0x00000400L, 0x00000420L, 0x08010400L,
> +0x08010400L, 0x08000420L, 0x00010020L, 0x08010000L,
> +0x00010000L, 0x00000020L, 0x08000020L, 0x08000400L,
> +0x08000000L, 0x00010400L, 0x08010420L, 0x00000000L,
> +0x00010420L, 0x08000000L, 0x00000400L, 0x00010020L,
> +0x08000420L, 0x00000400L, 0x00000000L, 0x08010420L,
> +0x08010020L, 0x08010400L, 0x00000420L, 0x00010000L,
> +0x00010400L, 0x08010020L, 0x08000400L, 0x00000420L,
> +0x00000020L, 0x00010420L, 0x08010000L, 0x08000020L,
> +},{
> +/* nibble 5 */
> +0x80000040L, 0x00200040L, 0x00000000L, 0x80202000L,
> +0x00200040L, 0x00002000L, 0x80002040L, 0x00200000L,
> +0x00002040L, 0x80202040L, 0x00202000L, 0x80000000L,
> +0x80002000L, 0x80000040L, 0x80200000L, 0x00202040L,
> +0x00200000L, 0x80002040L, 0x80200040L, 0x00000000L,
> +0x00002000L, 0x00000040L, 0x80202000L, 0x80200040L,
> +0x80202040L, 0x80200000L, 0x80000000L, 0x00002040L,
> +0x00000040L, 0x00202000L, 0x00202040L, 0x80002000L,
> +0x00002040L, 0x80000000L, 0x80002000L, 0x00202040L,
> +0x80202000L, 0x00200040L, 0x00000000L, 0x80002000L,
> +0x80000000L, 0x00002000L, 0x80200040L, 0x00200000L,
> +0x00200040L, 0x80202040L, 0x00202000L, 0x00000040L,
> +0x80202040L, 0x00202000L, 0x00200000L, 0x80002040L,
> +0x80000040L, 0x80200000L, 0x00202040L, 0x00000000L,
> +0x00002000L, 0x80000040L, 0x80002040L, 0x80202000L,
> +0x80200000L, 0x00002040L, 0x00000040L, 0x80200040L,
> +},{
> +/* nibble 6 */
> +0x00004000L, 0x00000200L, 0x01000200L, 0x01000004L,
> +0x01004204L, 0x00004004L, 0x00004200L, 0x00000000L,
> +0x01000000L, 0x01000204L, 0x00000204L, 0x01004000L,
> +0x00000004L, 0x01004200L, 0x01004000L, 0x00000204L,
> +0x01000204L, 0x00004000L, 0x00004004L, 0x01004204L,
> +0x00000000L, 0x01000200L, 0x01000004L, 0x00004200L,
> +0x01004004L, 0x00004204L, 0x01004200L, 0x00000004L,
> +0x00004204L, 0x01004004L, 0x00000200L, 0x01000000L,
> +0x00004204L, 0x01004000L, 0x01004004L, 0x00000204L,
> +0x00004000L, 0x00000200L, 0x01000000L, 0x01004004L,
> +0x01000204L, 0x00004204L, 0x00004200L, 0x00000000L,
> +0x00000200L, 0x01000004L, 0x00000004L, 0x01000200L,
> +0x00000000L, 0x01000204L, 0x01000200L, 0x00004200L,
> +0x00000204L, 0x00004000L, 0x01004204L, 0x01000000L,
> +0x01004200L, 0x00000004L, 0x00004004L, 0x01004204L,
> +0x01000004L, 0x01004200L, 0x01004000L, 0x00004004L,
> +},{
> +/* nibble 7 */
> +0x20800080L, 0x20820000L, 0x00020080L, 0x00000000L,
> +0x20020000L, 0x00800080L, 0x20800000L, 0x20820080L,
> +0x00000080L, 0x20000000L, 0x00820000L, 0x00020080L,
> +0x00820080L, 0x20020080L, 0x20000080L, 0x20800000L,
> +0x00020000L, 0x00820080L, 0x00800080L, 0x20020000L,
> +0x20820080L, 0x20000080L, 0x00000000L, 0x00820000L,
> +0x20000000L, 0x00800000L, 0x20020080L, 0x20800080L,
> +0x00800000L, 0x00020000L, 0x20820000L, 0x00000080L,
> +0x00800000L, 0x00020000L, 0x20000080L, 0x20820080L,
> +0x00020080L, 0x20000000L, 0x00000000L, 0x00820000L,
> +0x20800080L, 0x20020080L, 0x20020000L, 0x00800080L,
> +0x20820000L, 0x00000080L, 0x00800080L, 0x20020000L,
> +0x20820080L, 0x00800000L, 0x20800000L, 0x20000080L,
> +0x00820000L, 0x00020080L, 0x20020080L, 0x20800000L,
> +0x00000080L, 0x20820000L, 0x00820080L, 0x00000000L,
> +0x20000000L, 0x20800080L, 0x00020000L, 0x00820080L,
> +}};
> diff -Naur linux/cryptolib/md5.c linux-crypto/cryptolib/md5.c
> --- linux/cryptolib/md5.c	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/cryptolib/md5.c	Tue Aug 27 11:20:55 2002
> @@ -0,0 +1,430 @@
> +/*
> + * RCSID $Id: ipsec_md5c.c,v 1.4 1999/12/13 13:59:12 rgb Exp $
> + */
> +
> +/*
> + * The rest of the code is derived from MD5C.C by RSADSI. Minor cosmetic
> + * changes to accomodate it in the kernel by ji.
> + */
> +
> +#include <asm/byteorder.h>
> +#include <linux/string.h>
> +
> +#include <linux/md5.h>
> +
> +/* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm
> + */
> +
> +/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
> +rights reserved.
> +
> +License to copy and use this software is granted provided that it
> +is identified as the "RSA Data Security, Inc. MD5 Message-Digest
> +Algorithm" in all material mentioning or referencing this software
> +or this function.
> +
> +License is also granted to make and use derivative works provided
> +that such works are identified as "derived from the RSA Data
> +Security, Inc. MD5 Message-Digest Algorithm" in all material
> +mentioning or referencing the derived work.
> +
> +RSA Data Security, Inc. makes no representations concerning either
> +the merchantability of this software or the suitability of this
> +software for any particular purpose. It is provided "as is"
> +without express or implied warranty of any kind.
> +
> +These notices must be retained in any copies of any part of this
> +documentation and/or software.
> + */
> +
> +/*
> + * Additions by JI
> + * 
> + * HAVEMEMCOPY is defined if mem* routines are available
> + *
> + * HAVEHTON is defined if htons() and htonl() can be used
> + * for big/little endian conversions
> + *
> + */
> +
> +#define HAVEMEMCOPY
> +#ifdef __LITTLE_ENDIAN
> +#define LITTLENDIAN
> +#endif
> +#ifdef __BIG_ENDIAN
> +#define BIGENDIAN
> +#endif
> +
> +/* Constants for MD5Transform routine.
> + */
> +
> +#define S11 7
> +#define S12 12
> +#define S13 17
> +#define S14 22
> +#define S21 5
> +#define S22 9
> +#define S23 14
> +#define S24 20
> +#define S31 4
> +#define S32 11
> +#define S33 16
> +#define S34 23
> +#define S41 6
> +#define S42 10
> +#define S43 15
> +#define S44 21
> +
> +static void MD5Transform PROTO_LIST ((UINT4 [4], unsigned char [64]));
> +
> +#ifdef LITTLEENDIAN
> +#define Encode MD5_memcpy
> +#define Decode MD5_memcpy
> +#else
> +static void Encode PROTO_LIST
> +  ((unsigned char *, UINT4 *, unsigned int));
> +static void Decode PROTO_LIST
> +  ((UINT4 *, unsigned char *, unsigned int));
> +#endif
> +
> +#ifdef HAVEMEMCOPY
> +/* no need to include <memory.h> here; <linux/string.h> defines these */
> +#define MD5_memcpy	memcpy
> +#define MD5_memset	memset
> +#else
> +#ifdef HAVEBCOPY
> +#define MD5_memcpy(_a,_b,_c) bcopy((_b),(_a),(_c))
> +#define MD5_memset(_a,_b,_c) bzero((_a),(_c))
> +#else
> +static void MD5_memcpy PROTO_LIST ((POINTER, POINTER, unsigned int));
> +static void MD5_memset PROTO_LIST ((POINTER, int, unsigned int));
> +#endif
> +#endif
> +static unsigned char PADDING[64] = {
> +  0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
> +  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
> +  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
> +};
> +
> +/* F, G, H and I are basic MD5 functions.
> + */
> +#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
> +#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
> +#define H(x, y, z) ((x) ^ (y) ^ (z))
> +#define I(x, y, z) ((y) ^ ((x) | (~z)))
> +
> +/* ROTATE_LEFT rotates x left n bits.
> + */
> +#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
> +
> +/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
> +Rotation is separate from addition to prevent recomputation.
> + */
> +#define FF(a, b, c, d, x, s, ac) { \
> + (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
> + (a) = ROTATE_LEFT ((a), (s)); \
> + (a) += (b); \
> +  }
> +#define GG(a, b, c, d, x, s, ac) { \
> + (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \
> + (a) = ROTATE_LEFT ((a), (s)); \
> + (a) += (b); \
> +  }
> +#define HH(a, b, c, d, x, s, ac) { \
> + (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \
> + (a) = ROTATE_LEFT ((a), (s)); \
> + (a) += (b); \
> +  }
> +#define II(a, b, c, d, x, s, ac) { \
> + (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \
> + (a) = ROTATE_LEFT ((a), (s)); \
> + (a) += (b); \
> +  }
> +
> +/* MD5 initialization. Begins an MD5 operation, writing a new context.
> + */
> +void MD5Init (context)
> +MD5_CTX *context;                                        /* context */
> +{
> +  context->count[0] = context->count[1] = 0;
> +  /* Load magic initialization constants.
> +*/
> +  context->state[0] = 0x67452301;
> +  context->state[1] = 0xefcdab89;
> +  context->state[2] = 0x98badcfe;
> +  context->state[3] = 0x10325476;
> +}
> +
> +/* MD5 block update operation. Continues an MD5 message-digest
> +  operation, processing another message block, and updating the
> +  context.
> + */
> +void MD5Update (context, input, inputLen)
> +MD5_CTX *context;                                        /* context */
> +unsigned char *input;                                /* input block */
> +__u32 inputLen;                     /* length of input block */
> +{
> +  __u32 i;
> +  unsigned int index, partLen;
> +
> +  /* Compute number of bytes mod 64 */
> +  index = (unsigned int)((context->count[0] >> 3) & 0x3F);
> +
> +  /* Update number of bits */
> +  if ((context->count[0] += ((UINT4)inputLen << 3))
> +   < ((UINT4)inputLen << 3))
> + context->count[1]++;
> +  context->count[1] += ((UINT4)inputLen >> 29);
> +
> +  partLen = 64 - index;
> +
> +  /* Transform as many times as possible.
> +*/
> +  if (inputLen >= partLen) {
> + MD5_memcpy
> +   ((POINTER)&context->buffer[index], (POINTER)input, partLen);
> + MD5Transform (context->state, context->buffer);
> +
> + for (i = partLen; i + 63 < inputLen; i += 64)
> +   MD5Transform (context->state, &input[i]);
> +
> + index = 0;
> +  }
> +  else
> + i = 0;
> +
> +  /* Buffer remaining input */
> +  MD5_memcpy
> + ((POINTER)&context->buffer[index], (POINTER)&input[i],
> +  inputLen-i);
> +}
> +
> +/* MD5 finalization. Ends an MD5 message-digest operation, writing the
> +  the message digest and zeroizing the context.
> + */
> +void MD5Final (digest, context)
> +unsigned char digest[16];                         /* message digest */
> +MD5_CTX *context;                                       /* context */
> +{
> +  unsigned char bits[8];
> +  unsigned int index, padLen;
> +
> +  /* Save number of bits */
> +  Encode (bits, context->count, 8);
> +
> +  /* Pad out to 56 mod 64.
> +*/
> +  index = (unsigned int)((context->count[0] >> 3) & 0x3f);
> +  padLen = (index < 56) ? (56 - index) : (120 - index);
> +  MD5Update (context, PADDING, padLen);
> +
> +  /* Append length (before padding) */
> +  MD5Update (context, bits, 8);
> +
> +  if (digest != NULL)			/* Bill Simpson's padding */
> +  {
> +	  /* store state in digest */
> +	  Encode (digest, context->state, 16);
> +
> +	  /* Zeroize sensitive information.
> +	   */
> +	  MD5_memset ((POINTER)context, 0, sizeof (*context));
> +  }
> +}
> +
> +/* MD5 basic transformation. Transforms state based on block.
> + */
> +static void MD5Transform (state, block)
> +UINT4 state[4];
> +unsigned char block[64];
> +{
> +  UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16];
> +
> +  Decode (x, block, 64);
> +
> +  /* Round 1 */
> +  FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */
> +  FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */
> +  FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */
> +  FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */
> +  FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */
> +  FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */
> +  FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */
> +  FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */
> +  FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */
> +  FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */
> +  FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
> +  FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
> +  FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
> +  FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
> +  FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
> +  FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
> +
> + /* Round 2 */
> +  GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */
> +  GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */
> +  GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
> +  GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */
> +  GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */
> +  GG (d, a, b, c, x[10], S22,  0x2441453); /* 22 */
> +  GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
> +  GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */
> +  GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */
> +  GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
> +  GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */
> +  GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */
> +  GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
> +  GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */
> +  GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */
> +  GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
> +
> +  /* Round 3 */
> +  HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */
> +  HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */
> +  HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
> +  HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
> +  HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */
> +  HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */
> +  HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */
> +  HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
> +  HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
> +  HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */
> +  HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */
> +  HH (b, c, d, a, x[ 6], S34,  0x4881d05); /* 44 */
> +  HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */
> +  HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
> +  HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
> +  HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */
> +
> +  /* Round 4 */
> +  II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */
> +  II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */
> +  II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
> +  II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */
> +  II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
> +  II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */
> +  II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
> +  II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */
> +  II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */
> +  II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
> +  II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */
> +  II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
> +  II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */
> +  II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
> +  II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */
> +  II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */
> +
> +  state[0] += a;
> +  state[1] += b;
> +  state[2] += c;
> +  state[3] += d;
> +
> +  /* Zeroize sensitive information.
> +*/
> +  MD5_memset ((POINTER)x, 0, sizeof (x));
> +}
> +
> +#ifndef LITTLEENDIAN
> +
> +/* Encodes input (UINT4) into output (unsigned char). Assumes len is
> +  a multiple of 4.
> + */
> +static void Encode (output, input, len)
> +unsigned char *output;
> +UINT4 *input;
> +unsigned int len;
> +{
> +  unsigned int i, j;
> +
> +  for (i = 0, j = 0; j < len; i++, j += 4) {
> + output[j] = (unsigned char)(input[i] & 0xff);
> + output[j+1] = (unsigned char)((input[i] >> 8) & 0xff);
> + output[j+2] = (unsigned char)((input[i] >> 16) & 0xff);
> + output[j+3] = (unsigned char)((input[i] >> 24) & 0xff);
> +  }
> +}
> +
> +/* Decodes input (unsigned char) into output (UINT4). Assumes len is
> +  a multiple of 4.
> + */
> +static void Decode (output, input, len)
> +UINT4 *output;
> +unsigned char *input;
> +unsigned int len;
> +{
> +  unsigned int i, j;
> +
> +  for (i = 0, j = 0; j < len; i++, j += 4)
> + output[i] = ((UINT4)input[j]) | (((UINT4)input[j+1]) << 8) |
> +   (((UINT4)input[j+2]) << 16) | (((UINT4)input[j+3]) << 24);
> +}
> +
> +#endif
> +
> +#ifndef HAVEMEMCOPY
> +#ifndef HAVEBCOPY
> +/* Note: Replace "for loop" with standard memcpy if possible.
> + */
> +
> +static void MD5_memcpy (output, input, len)
> +POINTER output;
> +POINTER input;
> +unsigned int len;
> +{
> +  unsigned int i;
> +
> +  for (i = 0; i < len; i++)
> +
> + output[i] = input[i];
> +}
> +
> +/* Note: Replace "for loop" with standard memset if possible.
> + */
> +
> +static void MD5_memset (output, value, len)
> +POINTER output;
> +int value;
> +unsigned int len;
> +{
> +  unsigned int i;
> +
> +  for (i = 0; i < len; i++)
> + ((char *)output)[i] = (char)value;
> +}
> +#endif
> +#endif
> +
> +/*
> + * $Log: ipsec_md5c.c,v $
> + * Revision 1.4  1999/12/13 13:59:12  rgb
> + * Quick fix to argument size to Update bugs.
> + *
> + * Revision 1.3  1999/05/21 18:09:28  henry
> + * unnecessary <memory.h> include causes trouble in 2.2
> + *
> + * Revision 1.2  1999/04/06 04:54:26  rgb
> + * Fix/Add RCSID Id: and Log: bits to make PHMDs happy.  This includes
> + * patch shell fixes.
> + *
> + * Revision 1.1  1998/06/18 21:27:48  henry
> + * move sources from klips/src to klips/net/ipsec, to keep stupid
> + * kernel-build scripts happier in the presence of symlinks
> + *
> + * Revision 1.2  1998/04/23 20:54:02  rgb
> + * Fixed md5 and sha1 include file nesting issues, to be cleaned up when
> + * verified.
> + *
> + * Revision 1.1  1998/04/09 03:06:08  henry
> + * sources moved up from linux/net/ipsec
> + *
> + * Revision 1.1.1.1  1998/04/08 05:35:04  henry
> + * RGB's ipsec-0.8pre2.tar.gz ipsec-0.8
> + *
> + * Revision 0.3  1996/11/20 14:48:53  ji
> + * Release update only.
> + *
> + * Revision 0.2  1996/11/02 00:18:33  ji
> + * First limited release.
> + *
> + *
> + */
> diff -Naur linux/cryptolib/rc4.revealed linux-crypto/cryptolib/rc4.revealed
> --- linux/cryptolib/rc4.revealed	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/cryptolib/rc4.revealed	Tue Aug 27 11:20:55 2002
> @@ -0,0 +1,278 @@
> +Newsgroups: sci.crypt,alt.security,comp.security.misc,alt.privacy
> +Path: ghost.dsi.unimi.it!univ-lyon1.fr!jussieu.fr!zaphod.crihan.fr!warwick!clyde.open.ac.uk!strath-cs!bnr.co.uk!bt!pipex!howland.reston.ans.net!europa.eng.gtefsd.com!MathWorks.Com!yeshua.marcam.com!charnel.ecst.csuchico.edu!csusac!csus.edu!netcom.com!sterndark
> +From: [email protected] (David Sterndark)
> +Subject: RC4 Algorithm revealed.
> +Message-ID: <[email protected]>
> +Sender: [email protected] 
> +Organization: NETCOM On-line Communication Services (408 261-4700 guest)
> +X-Newsreader: TIN [version 1.2 PL1]
> +Date: Wed, 14 Sep 1994 06:35:31 GMT
> +Lines: 263
> +Xref: ghost.dsi.unimi.it sci.crypt:27332 alt.security:14732 comp.security.misc:11701 alt.privacy:16026
> +
> +I am shocked,  shocked, I tell you,  shocked, to discover
> +that the cypherpunks have illegaly and criminally revealed
> +a crucial RSA trade secret and harmed the security of
> +America by reverse engineering the RC4 algorithm and
> +publishing it to the world.
> + 
> +On Saturday morning an anonymous cypherpunk wrote:
> + 
> + 
> +   SUBJECT:  RC4 Source Code
> + 
> + 
> +   I've tested this.  It is compatible with the RC4 object module
> +   that comes in the various RSA toolkits.  
> + 
> +   /* rc4.h */
> +   typedef struct rc4_key
> +   {      
> +        unsigned char state[256];       
> +        unsigned char x;        
> +        unsigned char y;
> +   } rc4_key;
> +   void prepare_key(unsigned char *key_data_ptr,int key_data_len,
> +   rc4_key *key);
> +   void rc4(unsigned char *buffer_ptr,int buffer_len,rc4_key * key);
> +   
> +   
> +   /*rc4.c */
> +   #include "rc4.h"
> +   static void swap_byte(unsigned char *a, unsigned char *b);
> +   void prepare_key(unsigned char *key_data_ptr, int key_data_len,
> +   rc4_key *key)
> +   {
> +        unsigned char swapByte;
> +        unsigned char index1;
> +        unsigned char index2;
> +        unsigned char* state;
> +        short counter;     
> +        
> +        state = &key->state[0];         
> +        for(counter = 0; counter < 256; counter++)              
> +        state[counter] = counter;               
> +        key->x = 0;     
> +        key->y = 0;     
> +        index1 = 0;     
> +        index2 = 0;             
> +        for(counter = 0; counter < 256; counter++)      
> +        {               
> +             index2 = (key_data_ptr[index1] + state[counter] +
> +                index2) % 256;                
> +             swap_byte(&state[counter], &state[index2]);            
> +   
> +             index1 = (index1 + 1) % key_data_len;  
> +        }       
> +    }
> +    
> +    void rc4(unsigned char *buffer_ptr, int buffer_len, rc4_key *key)
> +    { 
> +        unsigned char x;
> +        unsigned char y;
> +        unsigned char* state;
> +        unsigned char xorIndex;
> +        short counter;              
> +        
> +        x = key->x;     
> +        y = key->y;     
> +        
> +        state = &key->state[0];         
> +        for(counter = 0; counter < buffer_len; counter ++)      
> +        {               
> +             x = (x + 1) % 256;                      
> +             y = (state[x] + y) % 256;               
> +             swap_byte(&state[x], &state[y]);                        
> +                  
> +             xorIndex = (state[x] + state[y]) % 256;                 
> +                  
> +             buffer_ptr[counter] ^= state[xorIndex];         
> +         }               
> +         key->x = x;     
> +         key->y = y;
> +    }
> +    
> +    static void swap_byte(unsigned char *a, unsigned char *b)
> +    {
> +        unsigned char swapByte; 
> +        
> +        swapByte = *a; 
> +        *a = *b;      
> +        *b = swapByte;
> +    }
> + 
> + 
> + 
> +Another cypherpunk, this one not anonymous, tested the
> +output from this algorithm against the output from
> +official RC4 object code
> + 
> + 
> +   Date: Tue, 13 Sep 94 18:37:56 PDT
> +   From: [email protected] (Eric Rescorla)
> +   Message-Id: <[email protected]>
> +   Subject: RC4 compatibility testing
> +   Cc: [email protected]
> +   
> +   One data point:
> +   
> +   I can't say anything about the internals of RC4 versus the
> +   algorithm that Bill Sommerfeld is rightly calling 'Alleged RC4',
> +   since I don't know anything about RC4's internals. 
> +   
> +   However, I do have a (legitimately acquired) copy of BSAFE2 and
> +   so I'm able to compare the output of this algorithm to the output
> +   of genuine RC4 as found in BSAFE. I chose a set of test vectors
> +   and ran them through both algorithms. The algorithms appear to
> +   give identical results, at least with these key/plaintext pairs.
> +   
> +   I note that this is the algorithm _without_ Hal Finney's
> +   proposed modification
> +   
> +   (see <[email protected]>).
> +   
> +   The vectors I used (together with the ciphertext they produce)
> +   follow at the end of this message.
> +   
> +   -Ekr
> +   
> +   Disclaimer: This posting does not reflect the opinions of EIT.
> +   
> +   --------------------results follow--------------
> +   Test vector 0
> +   Key: 0x01 0x23 0x45 0x67 0x89 0xab 0xcd 0xef 
> +   Input: 0x01 0x23 0x45 0x67 0x89 0xab 0xcd 0xef 
> +   0 Output: 0x75 0xb7 0x87 0x80 0x99 0xe0 0xc5 0x96 
> +   
> +   Test vector 1
> +   Key: 0x01 0x23 0x45 0x67 0x89 0xab 0xcd 0xef 
> +   Input: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 
> +   0 Output: 0x74 0x94 0xc2 0xe7 0x10 0x4b 0x08 0x79 
> +   
> +   Test vector 2
> +   Key: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 
> +   Input: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 
> +   0 Output: 0xde 0x18 0x89 0x41 0xa3 0x37 0x5d 0x3a 
> +   
> +   Test vector 3
> +   Key: 0xef 0x01 0x23 0x45 
> +   Input: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 
> +   0 Output: 0xd6 0xa1 0x41 0xa7 0xec 0x3c 0x38 0xdf 0xbd 0x61 
> +   
> +   Test vector 4
> +   Key: 0x01 0x23 0x45 0x67 0x89 0xab 0xcd 0xef 
> +   Input: 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 
> +   0x01 
> +   0 Output: 0x75 0x95 0xc3 0xe6 0x11 0x4a 0x09 0x78 0x0c 0x4a 0xd4 
> +   0x52 0x33 0x8e 0x1f 0xfd 0x9a 0x1b 0xe9 0x49 0x8f 
> +   0x81 0x3d 0x76 0x53 0x34 0x49 0xb6 0x77 0x8d 0xca 
> +   0xd8 0xc7 0x8a 0x8d 0x2b 0xa9 0xac 0x66 0x08 0x5d 
> +   0x0e 0x53 0xd5 0x9c 0x26 0xc2 0xd1 0xc4 0x90 0xc1 
> +   0xeb 0xbe 0x0c 0xe6 0x6d 0x1b 0x6b 0x1b 0x13 0xb6 
> +   0xb9 0x19 0xb8 0x47 0xc2 0x5a 0x91 0x44 0x7a 0x95 
> +   0xe7 0x5e 0x4e 0xf1 0x67 0x79 0xcd 0xe8 0xbf 0x0a 
> +   0x95 0x85 0x0e 0x32 0xaf 0x96 0x89 0x44 0x4f 0xd3 
> +   0x77 0x10 0x8f 0x98 0xfd 0xcb 0xd4 0xe7 0x26 0x56 
> +   0x75 0x00 0x99 0x0b 0xcc 0x7e 0x0c 0xa3 0xc4 0xaa 
> +   0xa3 0x04 0xa3 0x87 0xd2 0x0f 0x3b 0x8f 0xbb 0xcd 
> +   0x42 0xa1 0xbd 0x31 0x1d 0x7a 0x43 0x03 0xdd 0xa5 
> +   0xab 0x07 0x88 0x96 0xae 0x80 0xc1 0x8b 0x0a 0xf6 
> +   0x6d 0xff 0x31 0x96 0x16 0xeb 0x78 0x4e 0x49 0x5a 
> +   0xd2 0xce 0x90 0xd7 0xf7 0x72 0xa8 0x17 0x47 0xb6 
> +   0x5f 0x62 0x09 0x3b 0x1e 0x0d 0xb9 0xe5 0xba 0x53 
> +   0x2f 0xaf 0xec 0x47 0x50 0x83 0x23 0xe6 0x71 0x32 
> +   0x7d 0xf9 0x44 0x44 0x32 0xcb 0x73 0x67 0xce 0xc8 
> +   0x2f 0x5d 0x44 0xc0 0xd0 0x0b 0x67 0xd6 0x50 0xa0 
> +   0x75 0xcd 0x4b 0x70 0xde 0xdd 0x77 0xeb 0x9b 0x10 
> +   0x23 0x1b 0x6b 0x5b 0x74 0x13 0x47 0x39 0x6d 0x62 
> +   0x89 0x74 0x21 0xd4 0x3d 0xf9 0xb4 0x2e 0x44 0x6e 
> +   0x35 0x8e 0x9c 0x11 0xa9 0xb2 0x18 0x4e 0xcb 0xef 
> +   0x0c 0xd8 0xe7 0xa8 0x77 0xef 0x96 0x8f 0x13 0x90 
> +   0xec 0x9b 0x3d 0x35 0xa5 0x58 0x5c 0xb0 0x09 0x29 
> +   0x0e 0x2f 0xcd 0xe7 0xb5 0xec 0x66 0xd9 0x08 0x4b 
> +   0xe4 0x40 0x55 0xa6 0x19 0xd9 0xdd 0x7f 0xc3 0x16 
> +   0x6f 0x94 0x87 0xf7 0xcb 0x27 0x29 0x12 0x42 0x64 
> +   0x45 0x99 0x85 0x14 0xc1 0x5d 0x53 0xa1 0x8c 0x86 
> +   0x4c 0xe3 0xa2 0xb7 0x55 0x57 0x93 0x98 0x81 0x26 
> +   0x52 0x0e 0xac 0xf2 0xe3 0x06 0x6e 0x23 0x0c 0x91 
> +   0xbe 0xe4 0xdd 0x53 0x04 0xf5 0xfd 0x04 0x05 0xb3 
> +   0x5b 0xd9 0x9c 0x73 0x13 0x5d 0x3d 0x9b 0xc3 0x35 
> +   0xee 0x04 0x9e 0xf6 0x9b 0x38 0x67 0xbf 0x2d 0x7b 
> +   0xd1 0xea 0xa5 0x95 0xd8 0xbf 0xc0 0x06 0x6f 0xf8 
> +   0xd3 0x15 0x09 0xeb 0x0c 0x6c 0xaa 0x00 0x6c 0x80 
> +   0x7a 0x62 0x3e 0xf8 0x4c 0x3d 0x33 0xc1 0x95 0xd2 
> +   0x3e 0xe3 0x20 0xc4 0x0d 0xe0 0x55 0x81 0x57 0xc8 
> +   0x22 0xd4 0xb8 0xc5 0x69 0xd8 0x49 0xae 0xd5 0x9d 
> +   0x4e 0x0f 0xd7 0xf3 0x79 0x58 0x6b 0x4b 0x7f 0xf6 
> +   0x84 0xed 0x6a 0x18 0x9f 0x74 0x86 0xd4 0x9b 0x9c 
> +   0x4b 0xad 0x9b 0xa2 0x4b 0x96 0xab 0xf9 0x24 0x37 
> +   0x2c 0x8a 0x8f 0xff 0xb1 0x0d 0x55 0x35 0x49 0x00 
> +   0xa7 0x7a 0x3d 0xb5 0xf2 0x05 0xe1 0xb9 0x9f 0xcd 
> +   0x86 0x60 0x86 0x3a 0x15 0x9a 0xd4 0xab 0xe4 0x0f 
> +   0xa4 0x89 0x34 0x16 0x3d 0xdd 0xe5 0x42 0xa6 0x58 
> +   0x55 0x40 0xfd 0x68 0x3c 0xbf 0xd8 0xc0 0x0f 0x12 
> +   0x12 0x9a 0x28 0x4d 0xea 0xcc 0x4c 0xde 0xfe 0x58 
> +   0xbe 0x71 0x37 0x54 0x1c 0x04 0x71 0x26 0xc8 0xd4 
> +   0x9e 0x27 0x55 0xab 0x18 0x1a 0xb7 0xe9 0x40 0xb0 
> +   0xc0 
> +   
> +
> +
> +-- 
> + ---------------------------------------------------------------------
> +We have the right to defend ourselves and our
> +property, because of the kind of animals that we              James A. Donald
> +are.  True law derives from this right, not from
> +the arbitrary power of the omnipotent state.                [email protected]
> +
> +
> diff -Naur linux/cryptolib/sha1.c linux-crypto/cryptolib/sha1.c
> --- linux/cryptolib/sha1.c	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/cryptolib/sha1.c	Tue Aug 27 11:20:55 2002
> @@ -0,0 +1,201 @@
> +/*
> + * RCSID $Id: ipsec_sha1.c,v 1.5 1999/12/13 13:59:13 rgb Exp $
> + */
> +
> +/*
> + * The rest of the code is derived from sha1.c by Steve Reid, which is
> + * public domain.
> + * Minor cosmetic changes to accomodate it in the Linux kernel by ji.
> + */
> +
> +#include <asm/byteorder.h>
> +#include <linux/string.h>
> +
> +#include <linux/sha1.h>
> +
> +#if defined(rol)
> +#undef rol
> +#endif
> +
> +#define SHA1HANDSOFF
> +
> +#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
> +
> +/* blk0() and blk() perform the initial expand. */
> +/* I got the idea of expanding during the round function from SSLeay */
> +#ifdef __LITTLE_ENDIAN
> +#define blk0(i) (block->l[i] = (rol(block->l[i],24)&0xFF00FF00) \
> +    |(rol(block->l[i],8)&0x00FF00FF))
> +#else
> +#define blk0(i) block->l[i]
> +#endif
> +#define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \
> +    ^block->l[(i+2)&15]^block->l[i&15],1))
> +
> +/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */
> +#define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30);
> +#define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30);
> +#define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30);
> +#define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30);
> +#define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30);
> +
> +
> +/* Hash a single 512-bit block. This is the core of the algorithm. */
> +
> +void SHA1Transform(__u32 state[5], __u8 buffer[64])
> +{
> +__u32 a, b, c, d, e;
> +typedef union {
> +    unsigned char c[64];
> +    __u32 l[16];
> +} CHAR64LONG16;
> +CHAR64LONG16* block;
> +#ifdef SHA1HANDSOFF
> +static unsigned char workspace[64];
> +    block = (CHAR64LONG16*)workspace;
> +    memcpy(block, buffer, 64);
> +#else
> +    block = (CHAR64LONG16*)buffer;
> +#endif
> +    /* Copy context->state[] to working vars */
> +    a = state[0];
> +    b = state[1];
> +    c = state[2];
> +    d = state[3];
> +    e = state[4];
> +    /* 4 rounds of 20 operations each. Loop unrolled. */
> +    R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3);
> +    R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7);
> +    R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11);
> +    R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15);
> +    R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19);
> +    R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23);
> +    R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27);
> +    R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31);
> +    R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35);
> +    R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39);
> +    R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43);
> +    R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47);
> +    R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51);
> +    R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55);
> +    R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59);
> +    R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63);
> +    R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67);
> +    R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71);
> +    R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75);
> +    R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79);
> +    /* Add the working vars back into context.state[] */
> +    state[0] += a;
> +    state[1] += b;
> +    state[2] += c;
> +    state[3] += d;
> +    state[4] += e;
> +    /* Wipe variables */
> +    a = b = c = d = e = 0;
> +}
> +
> +
> +/* SHA1Init - Initialize new context */
> +
> +void SHA1Init(SHA1_CTX* context)
> +{
> +    /* SHA1 initialization constants */
> +    context->state[0] = 0x67452301;
> +    context->state[1] = 0xEFCDAB89;
> +    context->state[2] = 0x98BADCFE;
> +    context->state[3] = 0x10325476;
> +    context->state[4] = 0xC3D2E1F0;
> +    context->count[0] = context->count[1] = 0;
> +}
> +
> +
> +/* Run your data through this. */
> +
> +void SHA1Update(SHA1_CTX* context, unsigned char* data, __u32 len)
> +{
> +__u32 i, j;
> +
> +    j = context->count[0];
> +    if ((context->count[0] += len << 3) < j)
> +	context->count[1]++;
> +    context->count[1] += (len>>29);
> +    j = (j >> 3) & 63;
> +    if ((j + len) > 63) {
> +        memcpy(&context->buffer[j], data, (i = 64-j));
> +        SHA1Transform(context->state, context->buffer);
> +        for ( ; i + 63 < len; i += 64) {
> +            SHA1Transform(context->state, &data[i]);
> +        }
> +        j = 0;
> +    }
> +    else i = 0;
> +    memcpy(&context->buffer[j], &data[i], len - i);
> +}
> +
> +
> +/* Add padding and return the message digest. */
> +
> +void SHA1Final(unsigned char digest[20], SHA1_CTX* context)
> +{
> +__u32 i, j;
> +unsigned char finalcount[8];
> +
> +    for (i = 0; i < 8; i++) {
> +        finalcount[i] = (unsigned char)((context->count[(i >= 4 ? 0 : 1)]
> +         >> ((3-(i & 3)) * 8) ) & 255);  /* Endian independent */
> +    }
> +    SHA1Update(context, (unsigned char *)"\200", 1);
> +    while ((context->count[0] & 504) != 448) {
> +        SHA1Update(context, (unsigned char *)"\0", 1);
> +    }
> +    SHA1Update(context, finalcount, 8);  /* Should cause a SHA1Transform() */
> +    for (i = 0; i < 20; i++) {
> +        digest[i] = (unsigned char)
> +         ((context->state[i>>2] >> ((3-(i & 3)) * 8) ) & 255);
> +    }
> +    /* Wipe variables */
> +    i = j = 0;
> +    memset(context->buffer, 0, 64);
> +    memset(context->state, 0, 20);
> +    memset(context->count, 0, 8);
> +    memset(&finalcount, 0, 8);
> +#ifdef SHA1HANDSOFF  /* make SHA1Transform overwrite its own static vars */
> +    SHA1Transform(context->state, context->buffer);
> +#endif
> +}
> +
> +
> +/*
> + * $Log: ipsec_sha1.c,v $
> + * Revision 1.5  1999/12/13 13:59:13  rgb
> + * Quick fix to argument size to Update bugs.
> + *
> + * Revision 1.4  1999/04/11 00:29:00  henry
> + * GPL boilerplate
> + *
> + * Revision 1.3  1999/04/06 04:54:27  rgb
> + * Fix/Add RCSID Id: and Log: bits to make PHMDs happy.  This includes
> + * patch shell fixes.
> + *
> + * Revision 1.2  1999/01/22 06:55:50  rgb
> + * 64-bit clean-up.
> + *
> + * Revision 1.1  1998/06/18 21:27:50  henry
> + * move sources from klips/src to klips/net/ipsec, to keep stupid
> + * kernel-build scripts happier in the presence of symlinks
> + *
> + * Revision 1.2  1998/04/23 20:54:04  rgb
> + * Fixed md5 and sha1 include file nesting issues, to be cleaned up when
> + * verified.
> + *
> + * Revision 1.1  1998/04/09 03:06:11  henry
> + * sources moved up from linux/net/ipsec
> + *
> + * Revision 1.1.1.1  1998/04/08 05:35:05  henry
> + * RGB's ipsec-0.8pre2.tar.gz ipsec-0.8
> + *
> + * Revision 0.4  1997/01/15 01:28:15  ji
> + * New transform
> + *
> + *
> + */
> diff -Naur linux/include/linux/des.h linux-crypto/include/linux/des.h
> --- linux/include/linux/des.h	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/include/linux/des.h	Tue Aug 27 11:20:55 2002
> @@ -0,0 +1,303 @@
> +/* crypto/des/des.org */
> +/* Copyright (C) 1995-1997 Eric Young ([email protected])
> + * All rights reserved.
> + *
> + * This package is an SSL implementation written
> + * by Eric Young ([email protected]).
> + * The implementation was written so as to conform with Netscapes SSL.
> + * 
> + * This library is free for commercial and non-commercial use as long as
> + * the following conditions are aheared to.  The following conditions
> + * apply to all code found in this distribution, be it the RC4, RSA,
> + * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
> + * included with this distribution is covered by the same copyright terms
> + * except that the holder is Tim Hudson ([email protected]).
> + * 
> + * Copyright remains Eric Young's, and as such any Copyright notices in
> + * the code are not to be removed.
> + * If this package is used in a product, Eric Young should be given attribution
> + * as the author of the parts of the library used.
> + * This can be in the form of a textual message at program startup or
> + * in documentation (online or textual) provided with the package.
> + * 
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the copyright
> + *    notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + *    notice, this list of conditions and the following disclaimer in the
> + *    documentation and/or other materials provided with the distribution.
> + * 3. All advertising materials mentioning features or use of this software
> + *    must display the following acknowledgement:
> + *    "This product includes cryptographic software written by
> + *     Eric Young ([email protected])"
> + *    The word 'cryptographic' can be left out if the rouines from the library
> + *    being used are not cryptographic related :-).
> + * 4. If you include any Windows specific code (or a derivative thereof) from 
> + *    the apps directory (application code) you must include an acknowledgement:
> + *    "This product includes software written by Tim Hudson ([email protected])"
> + * 
> + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + * 
> + * The licence and distribution terms for any publically available version or
> + * derivative of this code cannot be changed.  i.e. this code cannot simply be
> + * copied and put under another distribution licence
> + * [including the GNU Public Licence.]
> + */
> +
> +/* WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING 
> + *
> + * Always modify des.org since des.h is automatically generated from
> + * it during SSLeay configuration.
> + *
> + * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
> + */
> +
> +#ifndef HEADER_DES_H
> +#define HEADER_DES_H
> +
> +#ifdef  __cplusplus
> +extern "C" {
> +#endif
> +
> +/* If this is set to 'unsigned int' on a DEC Alpha, this gives about a
> + * %20 speed up (longs are 8 bytes, int's are 4). */
> +#ifndef DES_LONG
> +/* RCSID $Id: des.h,v 1.6 2000/10/04 14:54:10 henry Exp $ */
> +/* This conditional for FreeS/WAN project. */
> +#ifdef __alpha
> +#define DES_LONG unsigned int
> +#else
> +#define DES_LONG unsigned long
> +#endif
> +#endif
> +
> +typedef unsigned char des_cblock[8];
> +typedef struct des_ks_struct
> +	{
> +	union	{
> +		des_cblock _;
> +		/* make sure things are correct size on machines with
> +		 * 8 byte longs */
> +		DES_LONG pad[2];
> +		} ks;
> +#undef _
> +#define _	ks._
> +	} des_key_schedule[16];
> +
> +#define DES_KEY_SZ 	(sizeof(des_cblock))
> +#define DES_SCHEDULE_SZ (sizeof(des_key_schedule))
> +
> +#define DES_ENCRYPT	1
> +#define DES_DECRYPT	0
> +
> +#define DES_CBC_MODE	0
> +#define DES_PCBC_MODE	1
> +
> +#define des_ecb2_encrypt(i,o,k1,k2,e) \
> +	des_ecb3_encrypt((i),(o),(k1),(k2),(k1),(e))
> +
> +#define des_ede2_cbc_encrypt(i,o,l,k1,k2,iv,e) \
> +	des_ede3_cbc_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(e))
> +
> +#define des_ede2_cfb64_encrypt(i,o,l,k1,k2,iv,n,e) \
> +	des_ede3_cfb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n),(e))
> +
> +#define des_ede2_ofb64_encrypt(i,o,l,k1,k2,iv,n) \
> +	des_ede3_ofb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n))
> +
> +#define C_Block des_cblock
> +#define Key_schedule des_key_schedule
> +#ifdef KERBEROS
> +#define ENCRYPT DES_ENCRYPT
> +#define DECRYPT DES_DECRYPT
> +#endif
> +#define KEY_SZ DES_KEY_SZ
> +#define string_to_key des_string_to_key
> +#define read_pw_string des_read_pw_string
> +#define random_key des_random_key
> +#define pcbc_encrypt des_pcbc_encrypt
> +#define set_key des_set_key
> +#define key_sched des_key_sched
> +#define ecb_encrypt des_ecb_encrypt
> +#define cbc_encrypt des_cbc_encrypt
> +#define ncbc_encrypt des_ncbc_encrypt
> +#define xcbc_encrypt des_xcbc_encrypt
> +#define cbc_cksum des_cbc_cksum
> +#define quad_cksum des_quad_cksum
> +
> +/* For compatibility with the MIT lib - eay 20/05/92 */
> +typedef des_key_schedule bit_64;
> +#define des_fixup_key_parity des_set_odd_parity
> +#define des_check_key_parity check_parity
> +
> +extern int des_check_key;	/* defaults to false */
> +extern int des_rw_mode;		/* defaults to DES_PCBC_MODE */
> +
> +/* The next line is used to disable full ANSI prototypes, if your
> + * compiler has problems with the prototypes, make sure this line always
> + * evaluates to true :-) */
> +#if defined(MSDOS) || defined(__STDC__)
> +#undef NOPROTO
> +#endif
> +#ifndef NOPROTO
> +char *des_options(void);
> +void des_ecb3_encrypt(des_cblock *input,des_cblock *output,
> +	des_key_schedule ks1,des_key_schedule ks2,
> +	des_key_schedule ks3, int enc);
> +DES_LONG des_cbc_cksum(des_cblock *input,des_cblock *output,
> +	long length,des_key_schedule schedule,des_cblock *ivec);
> +void des_cbc_encrypt(des_cblock *input,des_cblock *output,long length,
> +	des_key_schedule schedule,des_cblock *ivec,int enc);
> +void des_ncbc_encrypt(des_cblock *input,des_cblock *output,long length,
> +	des_key_schedule schedule,des_cblock *ivec,int enc);
> +void des_xcbc_encrypt(des_cblock *input,des_cblock *output,long length,
> +	des_key_schedule schedule,des_cblock *ivec,
> +	des_cblock *inw,des_cblock *outw,int enc);
> +void des_cfb_encrypt(unsigned char *in,unsigned char *out,int numbits,
> +	long length,des_key_schedule schedule,des_cblock *ivec,int enc);
> +void des_ecb_encrypt(des_cblock *input,des_cblock *output,
> +	des_key_schedule ks,int enc);
> +void des_encrypt(DES_LONG *data,des_key_schedule ks, int enc);
> +void des_encrypt2(DES_LONG *data,des_key_schedule ks, int enc);
> +void des_encrypt3(DES_LONG *data, des_key_schedule ks1,
> +	des_key_schedule ks2, des_key_schedule ks3);
> +void des_decrypt3(DES_LONG *data, des_key_schedule ks1,
> +	des_key_schedule ks2, des_key_schedule ks3);
> +void des_ede3_cbc_encrypt(des_cblock *input, des_cblock *output, 
> +	long length, des_key_schedule ks1, des_key_schedule ks2, 
> +	des_key_schedule ks3, des_cblock *ivec, int enc);
> +void des_ede3_cfb64_encrypt(unsigned char *in, unsigned char *out,
> +	long length, des_key_schedule ks1, des_key_schedule ks2,
> +	des_key_schedule ks3, des_cblock *ivec, int *num, int enc);
> +void des_ede3_ofb64_encrypt(unsigned char *in, unsigned char *out,
> +	long length, des_key_schedule ks1, des_key_schedule ks2,
> +	des_key_schedule ks3, des_cblock *ivec, int *num);
> +
> +void des_xwhite_in2out(des_cblock (*des_key), des_cblock (*in_white),
> +	des_cblock (*out_white));
> +
> +int des_enc_read(int fd,char *buf,int len,des_key_schedule sched,
> +	des_cblock *iv);
> +int des_enc_write(int fd,char *buf,int len,des_key_schedule sched,
> +	des_cblock *iv);
> +char *des_fcrypt(const char *buf,const char *salt, char *ret);
> +#ifdef PERL5
> +char *des_crypt(const char *buf,const char *salt);
> +#else
> +/* some stupid compilers complain because I have declared char instead
> + * of const char */
> +#ifdef HEADER_DES_LOCL_H
> +char *crypt(const char *buf,const char *salt);
> +#else
> +char *crypt();
> +#endif
> +#endif
> +void des_ofb_encrypt(unsigned char *in,unsigned char *out,
> +	int numbits,long length,des_key_schedule schedule,des_cblock *ivec);
> +void des_pcbc_encrypt(des_cblock *input,des_cblock *output,long length,
> +	des_key_schedule schedule,des_cblock *ivec,int enc);
> +DES_LONG des_quad_cksum(des_cblock *input,des_cblock *output,
> +	long length,int out_count,des_cblock *seed);
> +void des_random_seed(des_cblock key);
> +void des_random_key(des_cblock ret);
> +int des_read_password(des_cblock *key,char *prompt,int verify);
> +int des_read_2passwords(des_cblock *key1,des_cblock *key2,
> +	char *prompt,int verify);
> +int des_read_pw_string(char *buf,int length,char *prompt,int verify);
> +void des_set_odd_parity(des_cblock *key);
> +int des_is_weak_key(des_cblock *key);
> +int des_set_key(des_cblock *key,des_key_schedule schedule);
> +int des_key_sched(des_cblock *key,des_key_schedule schedule);
> +void des_string_to_key(char *str,des_cblock *key);
> +void des_string_to_2keys(char *str,des_cblock *key1,des_cblock *key2);
> +void des_cfb64_encrypt(unsigned char *in, unsigned char *out, long length,
> +	des_key_schedule schedule, des_cblock *ivec, int *num, int enc);
> +void des_ofb64_encrypt(unsigned char *in, unsigned char *out, long length,
> +	des_key_schedule schedule, des_cblock *ivec, int *num);
> +int des_read_pw(char *buf, char *buff, int size, char *prompt, int verify);
> +
> +/* Extra functions from Mark Murray <[email protected]> */
> +/* The following functions are not in the normal unix build or the
> + * SSLeay build.  When using the SSLeay build, use RAND_seed()
> + * and RAND_bytes() instead. */
> +int des_new_random_key(des_cblock *key);
> +void des_init_random_number_generator(des_cblock *key);
> +void des_set_random_generator_seed(des_cblock *key);
> +void des_set_sequence_number(des_cblock new_sequence_number);
> +void des_generate_random_block(des_cblock *block);
> +
> +#else
> +
> +char *des_options();
> +void des_ecb3_encrypt();
> +DES_LONG des_cbc_cksum();
> +void des_cbc_encrypt();
> +void des_ncbc_encrypt();
> +void des_xcbc_encrypt();
> +void des_cfb_encrypt();
> +void des_ede3_cfb64_encrypt();
> +void des_ede3_ofb64_encrypt();
> +void des_ecb_encrypt();
> +void des_encrypt();
> +void des_encrypt2();
> +void des_encrypt3();
> +void des_decrypt3();
> +void des_ede3_cbc_encrypt();
> +int des_enc_read();
> +int des_enc_write();
> +char *des_fcrypt();
> +#ifdef PERL5
> +char *des_crypt();
> +#else
> +char *crypt();
> +#endif
> +void des_ofb_encrypt();
> +void des_pcbc_encrypt();
> +DES_LONG des_quad_cksum();
> +void des_random_seed();
> +void des_random_key();
> +int des_read_password();
> +int des_read_2passwords();
> +int des_read_pw_string();
> +void des_set_odd_parity();
> +int des_is_weak_key();
> +int des_set_key();
> +int des_key_sched();
> +void des_string_to_key();
> +void des_string_to_2keys();
> +void des_cfb64_encrypt();
> +void des_ofb64_encrypt();
> +int des_read_pw();
> +void des_xwhite_in2out();
> +
> +/* Extra functions from Mark Murray <[email protected]> */
> +/* The following functions are not in the normal unix build or the
> + * SSLeay build.  When using the SSLeay build, use RAND_seed()
> + * and RAND_bytes() instead. */
> +#ifdef FreeBSD
> +int des_new_random_key();
> +void des_init_random_number_generator();
> +void des_set_random_generator_seed();
> +void des_set_sequence_number();
> +void des_generate_random_block();
> +#endif
> +
> +#endif
> +
> +#ifdef  __cplusplus
> +}
> +#endif
> +
> +#endif
> diff -Naur linux/include/linux/des_locl.h linux-crypto/include/linux/des_locl.h
> --- linux/include/linux/des_locl.h	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/include/linux/des_locl.h	Tue Aug 27 11:20:55 2002
> @@ -0,0 +1,513 @@
> +/* crypto/des/des_locl.org */
> +/* Copyright (C) 1995-1997 Eric Young ([email protected])
> + * All rights reserved.
> + *
> + * This package is an SSL implementation written
> + * by Eric Young ([email protected]).
> + * The implementation was written so as to conform with Netscapes SSL.
> + * 
> + * This library is free for commercial and non-commercial use as long as
> + * the following conditions are aheared to.  The following conditions
> + * apply to all code found in this distribution, be it the RC4, RSA,
> + * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
> + * included with this distribution is covered by the same copyright terms
> + * except that the holder is Tim Hudson ([email protected]).
> + * 
> + * Copyright remains Eric Young's, and as such any Copyright notices in
> + * the code are not to be removed.
> + * If this package is used in a product, Eric Young should be given attribution
> + * as the author of the parts of the library used.
> + * This can be in the form of a textual message at program startup or
> + * in documentation (online or textual) provided with the package.
> + * 
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the copyright
> + *    notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + *    notice, this list of conditions and the following disclaimer in the
> + *    documentation and/or other materials provided with the distribution.
> + * 3. All advertising materials mentioning features or use of this software
> + *    must display the following acknowledgement:
> + *    "This product includes cryptographic software written by
> + *     Eric Young ([email protected])"
> + *    The word 'cryptographic' can be left out if the rouines from the library
> + *    being used are not cryptographic related :-).
> + * 4. If you include any Windows specific code (or a derivative thereof) from 
> + *    the apps directory (application code) you must include an acknowledgement:
> + *    "This product includes software written by Tim Hudson ([email protected])"
> + * 
> + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + * 
> + * The licence and distribution terms for any publically available version or
> + * derivative of this code cannot be changed.  i.e. this code cannot simply be
> + * copied and put under another distribution licence
> + * [including the GNU Public Licence.]
> + */
> +
> +/* WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
> + *
> + * Always modify des_locl.org since des_locl.h is automatically generated from
> + * it during SSLeay configuration.
> + *
> + * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
> + */
> +
> +#ifndef HEADER_DES_LOCL_H
> +#define HEADER_DES_LOCL_H
> +
> +#if defined(WIN32) || defined(WIN16)
> +#ifndef MSDOS
> +#define MSDOS
> +#endif
> +#endif
> +
> +#include <linux/des.h>
> +
> +#ifndef DES_DEFAULT_OPTIONS
> +/* the following is tweaked from a config script, that is why it is a
> + * protected undef/define */
> +#ifndef DES_PTR
> +#define DES_PTR
> +#endif
> +
> +/* This helps C compiler generate the correct code for multiple functional
> + * units.  It reduces register dependancies at the expense of 2 more
> + * registers */
> +#ifndef DES_RISC1
> +#define DES_RISC1
> +#endif
> +
> +#ifndef DES_RISC2
> +#undef DES_RISC2
> +#endif
> +
> +#if defined(DES_RISC1) && defined(DES_RISC2)
> +YOU SHOULD NOT HAVE BOTH DES_RISC1 AND DES_RISC2 DEFINED!!!!!
> +#endif
> +
> +/* Unroll the inner loop, this sometimes helps, sometimes hinders.
> + * Very mucy CPU dependant */
> +#ifndef DES_UNROLL
> +#define DES_UNROLL
> +#endif
> +
> +/* These default values were supplied by
> + * Peter Gutman <[email protected]>
> + * They are only used if nothing else has been defined */
> +#if !defined(DES_PTR) && !defined(DES_RISC1) && !defined(DES_RISC2) && !defined(DES_UNROLL)
> +/* Special defines which change the way the code is built depending on the
> +   CPU and OS.  For SGI machines you can use _MIPS_SZLONG (32 or 64) to find
> +   even newer MIPS CPU's, but at the moment one size fits all for
> +   optimization options.  Older Sparc's work better with only UNROLL, but
> +   there's no way to tell at compile time what it is you're running on */
> + 
> +#if defined( sun )		/* Newer Sparc's */
> +  #define DES_PTR
> +  #define DES_RISC1
> +  #define DES_UNROLL
> +#elif defined( __ultrix )	/* Older MIPS */
> +  #define DES_PTR
> +  #define DES_RISC2
> +  #define DES_UNROLL
> +#elif defined( __osf1__ )	/* Alpha */
> +  #define DES_PTR
> +  #define DES_RISC2
> +#elif defined ( _AIX )		/* RS6000 */
> +  /* Unknown */
> +#elif defined( __hpux )		/* HP-PA */
> +  /* Unknown */
> +#elif defined( __aux )		/* 68K */
> +  /* Unknown */
> +#elif defined( __dgux )		/* 88K (but P6 in latest boxes) */
> +  #define DES_UNROLL
> +#elif defined( __sgi )		/* Newer MIPS */
> +  #define DES_PTR
> +  #define DES_RISC2
> +  #define DES_UNROLL
> +#elif defined( i386 )		/* x86 boxes, should be gcc */
> +  #define DES_PTR
> +  #define DES_RISC1
> +  #define DES_UNROLL
> +#endif /* Systems-specific speed defines */
> +#endif
> +
> +#endif /* DES_DEFAULT_OPTIONS */
> +
> +#ifdef MSDOS		/* Visual C++ 2.1 (Windows NT/95) */
> +#include <stdlib.h>
> +#include <errno.h>
> +#include <time.h>
> +#include <io.h>
> +#ifndef RAND
> +#define RAND
> +#endif
> +#undef NOPROTO
> +#endif
> +
> +#ifndef __KERNEL__
> +#if defined(__STDC__) || defined(VMS) || defined(M_XENIX) || defined(MSDOS)
> +#include <string.h>
> +#endif
> +#endif
> +
> +#ifndef RAND
> +#define RAND
> +#endif
> +
> +#ifdef linux
> +#undef RAND
> +#endif
> +
> +#ifdef MSDOS
> +#define getpid() 2
> +#define RAND
> +#undef NOPROTO
> +#endif
> +
> +#if defined(NOCONST)
> +#define const
> +#endif
> +
> +#ifdef __STDC__
> +#undef NOPROTO
> +#endif
> +
> +#ifdef RAND
> +#define srandom(s) srand(s)
> +#define random rand
> +#endif
> +
> +#define ITERATIONS 16
> +#define HALF_ITERATIONS 8
> +
> +/* used in des_read and des_write */
> +#define MAXWRITE	(1024*16)
> +#define BSIZE		(MAXWRITE+4)
> +
> +#define c2l(c,l)	(l =((DES_LONG)(*((c)++)))    , \
> +			 l|=((DES_LONG)(*((c)++)))<< 8L, \
> +			 l|=((DES_LONG)(*((c)++)))<<16L, \
> +			 l|=((DES_LONG)(*((c)++)))<<24L)
> +
> +/* NOTE - c is not incremented as per c2l */
> +#define c2ln(c,l1,l2,n)	{ \
> +			c+=n; \
> +			l1=l2=0; \
> +			switch (n) { \
> +			case 8: l2 =((DES_LONG)(*(--(c))))<<24L; \
> +			case 7: l2|=((DES_LONG)(*(--(c))))<<16L; \
> +			case 6: l2|=((DES_LONG)(*(--(c))))<< 8L; \
> +			case 5: l2|=((DES_LONG)(*(--(c))));     \
> +			case 4: l1 =((DES_LONG)(*(--(c))))<<24L; \
> +			case 3: l1|=((DES_LONG)(*(--(c))))<<16L; \
> +			case 2: l1|=((DES_LONG)(*(--(c))))<< 8L; \
> +			case 1: l1|=((DES_LONG)(*(--(c))));     \
> +				} \
> +			}
> +
> +#define l2c(l,c)	(*((c)++)=(unsigned char)(((l)     )&0xff), \
> +			 *((c)++)=(unsigned char)(((l)>> 8L)&0xff), \
> +			 *((c)++)=(unsigned char)(((l)>>16L)&0xff), \
> +			 *((c)++)=(unsigned char)(((l)>>24L)&0xff))
> +
> +/* replacements for htonl and ntohl since I have no idea what to do
> + * when faced with machines with 8 byte longs. */
> +#define HDRSIZE 4
> +
> +#define n2l(c,l)	(l =((DES_LONG)(*((c)++)))<<24L, \
> +			 l|=((DES_LONG)(*((c)++)))<<16L, \
> +			 l|=((DES_LONG)(*((c)++)))<< 8L, \
> +			 l|=((DES_LONG)(*((c)++))))
> +
> +#define l2n(l,c)	(*((c)++)=(unsigned char)(((l)>>24L)&0xff), \
> +			 *((c)++)=(unsigned char)(((l)>>16L)&0xff), \
> +			 *((c)++)=(unsigned char)(((l)>> 8L)&0xff), \
> +			 *((c)++)=(unsigned char)(((l)     )&0xff))
> +
> +/* NOTE - c is not incremented as per l2c */
> +#define l2cn(l1,l2,c,n)	{ \
> +			c+=n; \
> +			switch (n) { \
> +			case 8: *(--(c))=(unsigned char)(((l2)>>24L)&0xff); \
> +			case 7: *(--(c))=(unsigned char)(((l2)>>16L)&0xff); \
> +			case 6: *(--(c))=(unsigned char)(((l2)>> 8L)&0xff); \
> +			case 5: *(--(c))=(unsigned char)(((l2)     )&0xff); \
> +			case 4: *(--(c))=(unsigned char)(((l1)>>24L)&0xff); \
> +			case 3: *(--(c))=(unsigned char)(((l1)>>16L)&0xff); \
> +			case 2: *(--(c))=(unsigned char)(((l1)>> 8L)&0xff); \
> +			case 1: *(--(c))=(unsigned char)(((l1)     )&0xff); \
> +				} \
> +			}
> +
> +#if defined(WIN32)
> +#define	ROTATE(a,n)	(_lrotr(a,n))
> +#else
> +#define	ROTATE(a,n)	(((a)>>(n))+((a)<<(32-(n))))
> +#endif
> +
> +/* Don't worry about the LOAD_DATA() stuff, that is used by
> + * fcrypt() to add it's little bit to the front */
> +
> +#ifdef DES_FCRYPT
> +
> +#define LOAD_DATA_tmp(R,S,u,t,E0,E1) \
> +	{ DES_LONG tmp; LOAD_DATA(R,S,u,t,E0,E1,tmp); }
> +
> +#define LOAD_DATA(R,S,u,t,E0,E1,tmp) \
> +	t=R^(R>>16L); \
> +	u=t&E0; t&=E1; \
> +	tmp=(u<<16); u^=R^s[S  ]; u^=tmp; \
> +	tmp=(t<<16); t^=R^s[S+1]; t^=tmp
> +#else
> +#define LOAD_DATA_tmp(a,b,c,d,e,f) LOAD_DATA(a,b,c,d,e,f,g)
> +#define LOAD_DATA(R,S,u,t,E0,E1,tmp) \
> +	u=R^s[S  ]; \
> +	t=R^s[S+1]
> +#endif
> +
> +/* The changes to this macro may help or hinder, depending on the
> + * compiler and the achitecture.  gcc2 always seems to do well :-).
> + * Inspired by Dana How <[email protected]>
> + * DO NOT use the alternative version on machines with 8 byte longs.
> + * It does not seem to work on the Alpha, even when DES_LONG is 4
> + * bytes, probably an issue of accessing non-word aligned objects :-( */
> +#ifdef DES_PTR
> +
> +/* It recently occured to me that 0^0^0^0^0^0^0 == 0, so there
> + * is no reason to not xor all the sub items together.  This potentially
> + * saves a register since things can be xored directly into L */
> +
> +#if defined(DES_RISC1) || defined(DES_RISC2)
> +#ifdef DES_RISC1
> +#define D_ENCRYPT(LL,R,S) { \
> +	unsigned int u1,u2,u3; \
> +	LOAD_DATA(R,S,u,t,E0,E1,u1); \
> +	u2=(int)u>>8L; \
> +	u1=(int)u&0xfc; \
> +	u2&=0xfc; \
> +	t=ROTATE(t,4); \
> +	u>>=16L; \
> +	LL^= *(DES_LONG *)((unsigned char *)des_SP      +u1); \
> +	LL^= *(DES_LONG *)((unsigned char *)des_SP+0x200+u2); \
> +	u3=(int)(u>>8L); \
> +	u1=(int)u&0xfc; \
> +	u3&=0xfc; \
> +	LL^= *(DES_LONG *)((unsigned char *)des_SP+0x400+u1); \
> +	LL^= *(DES_LONG *)((unsigned char *)des_SP+0x600+u3); \
> +	u2=(int)t>>8L; \
> +	u1=(int)t&0xfc; \
> +	u2&=0xfc; \
> +	t>>=16L; \
> +	LL^= *(DES_LONG *)((unsigned char *)des_SP+0x100+u1); \
> +	LL^= *(DES_LONG *)((unsigned char *)des_SP+0x300+u2); \
> +	u3=(int)t>>8L; \
> +	u1=(int)t&0xfc; \
> +	u3&=0xfc; \
> +	LL^= *(DES_LONG *)((unsigned char *)des_SP+0x500+u1); \
> +	LL^= *(DES_LONG *)((unsigned char *)des_SP+0x700+u3); }
> +#endif
> +#ifdef DES_RISC2
> +#define D_ENCRYPT(LL,R,S) { \
> +	unsigned int u1,u2,s1,s2; \
> +	LOAD_DATA(R,S,u,t,E0,E1,u1); \
> +	u2=(int)u>>8L; \
> +	u1=(int)u&0xfc; \
> +	u2&=0xfc; \
> +	t=ROTATE(t,4); \
> +	LL^= *(DES_LONG *)((unsigned char *)des_SP      +u1); \
> +	LL^= *(DES_LONG *)((unsigned char *)des_SP+0x200+u2); \
> +	s1=(int)(u>>16L); \
> +	s2=(int)(u>>24L); \
> +	s1&=0xfc; \
> +	s2&=0xfc; \
> +	LL^= *(DES_LONG *)((unsigned char *)des_SP+0x400+s1); \
> +	LL^= *(DES_LONG *)((unsigned char *)des_SP+0x600+s2); \
> +	u2=(int)t>>8L; \
> +	u1=(int)t&0xfc; \
> +	u2&=0xfc; \
> +	LL^= *(DES_LONG *)((unsigned char *)des_SP+0x100+u1); \
> +	LL^= *(DES_LONG *)((unsigned char *)des_SP+0x300+u2); \
> +	s1=(int)(t>>16L); \
> +	s2=(int)(t>>24L); \
> +	s1&=0xfc; \
> +	s2&=0xfc; \
> +	LL^= *(DES_LONG *)((unsigned char *)des_SP+0x500+s1); \
> +	LL^= *(DES_LONG *)((unsigned char *)des_SP+0x700+s2); }
> +#endif
> +#else
> +#define D_ENCRYPT(LL,R,S) { \
> +	LOAD_DATA_tmp(R,S,u,t,E0,E1); \
> +	t=ROTATE(t,4); \
> +	LL^= \
> +	*(DES_LONG *)((unsigned char *)des_SP      +((u     )&0xfc))^ \
> +	*(DES_LONG *)((unsigned char *)des_SP+0x200+((u>> 8L)&0xfc))^ \
> +	*(DES_LONG *)((unsigned char *)des_SP+0x400+((u>>16L)&0xfc))^ \
> +	*(DES_LONG *)((unsigned char *)des_SP+0x600+((u>>24L)&0xfc))^ \
> +	*(DES_LONG *)((unsigned char *)des_SP+0x100+((t     )&0xfc))^ \
> +	*(DES_LONG *)((unsigned char *)des_SP+0x300+((t>> 8L)&0xfc))^ \
> +	*(DES_LONG *)((unsigned char *)des_SP+0x500+((t>>16L)&0xfc))^ \
> +	*(DES_LONG *)((unsigned char *)des_SP+0x700+((t>>24L)&0xfc)); }
> +#endif
> +
> +#else /* original version */
> +
> +#if defined(DES_RISC1) || defined(DES_RISC2)
> +#ifdef DES_RISC1
> +#define D_ENCRYPT(LL,R,S) {\
> +	unsigned int u1,u2,u3; \
> +	LOAD_DATA(R,S,u,t,E0,E1,u1); \
> +	u>>=2L; \
> +	t=ROTATE(t,6); \
> +	u2=(int)u>>8L; \
> +	u1=(int)u&0x3f; \
> +	u2&=0x3f; \
> +	u>>=16L; \
> +	LL^=des_SPtrans[0][u1]; \
> +	LL^=des_SPtrans[2][u2]; \
> +	u3=(int)u>>8L; \
> +	u1=(int)u&0x3f; \
> +	u3&=0x3f; \
> +	LL^=des_SPtrans[4][u1]; \
> +	LL^=des_SPtrans[6][u3]; \
> +	u2=(int)t>>8L; \
> +	u1=(int)t&0x3f; \
> +	u2&=0x3f; \
> +	t>>=16L; \
> +	LL^=des_SPtrans[1][u1]; \
> +	LL^=des_SPtrans[3][u2]; \
> +	u3=(int)t>>8L; \
> +	u1=(int)t&0x3f; \
> +	u3&=0x3f; \
> +	LL^=des_SPtrans[5][u1]; \
> +	LL^=des_SPtrans[7][u3]; }
> +#endif
> +#ifdef DES_RISC2
> +#define D_ENCRYPT(LL,R,S) {\
> +	unsigned int u1,u2,s1,s2; \
> +	LOAD_DATA(R,S,u,t,E0,E1,u1); \
> +	u>>=2L; \
> +	t=ROTATE(t,6); \
> +	u2=(int)u>>8L; \
> +	u1=(int)u&0x3f; \
> +	u2&=0x3f; \
> +	LL^=des_SPtrans[0][u1]; \
> +	LL^=des_SPtrans[2][u2]; \
> +	s1=(int)u>>16L; \
> +	s2=(int)u>>24L; \
> +	s1&=0x3f; \
> +	s2&=0x3f; \
> +	LL^=des_SPtrans[4][s1]; \
> +	LL^=des_SPtrans[6][s2]; \
> +	u2=(int)t>>8L; \
> +	u1=(int)t&0x3f; \
> +	u2&=0x3f; \
> +	LL^=des_SPtrans[1][u1]; \
> +	LL^=des_SPtrans[3][u2]; \
> +	s1=(int)t>>16; \
> +	s2=(int)t>>24L; \
> +	s1&=0x3f; \
> +	s2&=0x3f; \
> +	LL^=des_SPtrans[5][s1]; \
> +	LL^=des_SPtrans[7][s2]; }
> +#endif
> +
> +#else
> +
> +#define D_ENCRYPT(LL,R,S) {\
> +	LOAD_DATA_tmp(R,S,u,t,E0,E1); \
> +	t=ROTATE(t,4); \
> +	LL^=\
> +		des_SPtrans[0][(u>> 2L)&0x3f]^ \
> +		des_SPtrans[2][(u>>10L)&0x3f]^ \
> +		des_SPtrans[4][(u>>18L)&0x3f]^ \
> +		des_SPtrans[6][(u>>26L)&0x3f]^ \
> +		des_SPtrans[1][(t>> 2L)&0x3f]^ \
> +		des_SPtrans[3][(t>>10L)&0x3f]^ \
> +		des_SPtrans[5][(t>>18L)&0x3f]^ \
> +		des_SPtrans[7][(t>>26L)&0x3f]; }
> +#endif
> +#endif
> +
> +	/* IP and FP
> +	 * The problem is more of a geometric problem that random bit fiddling.
> +	 0  1  2  3  4  5  6  7      62 54 46 38 30 22 14  6
> +	 8  9 10 11 12 13 14 15      60 52 44 36 28 20 12  4
> +	16 17 18 19 20 21 22 23      58 50 42 34 26 18 10  2
> +	24 25 26 27 28 29 30 31  to  56 48 40 32 24 16  8  0
> +
> +	32 33 34 35 36 37 38 39      63 55 47 39 31 23 15  7
> +	40 41 42 43 44 45 46 47      61 53 45 37 29 21 13  5
> +	48 49 50 51 52 53 54 55      59 51 43 35 27 19 11  3
> +	56 57 58 59 60 61 62 63      57 49 41 33 25 17  9  1
> +
> +	The output has been subject to swaps of the form
> +	0 1 -> 3 1 but the odd and even bits have been put into
> +	2 3    2 0
> +	different words.  The main trick is to remember that
> +	t=((l>>size)^r)&(mask);
> +	r^=t;
> +	l^=(t<<size);
> +	can be used to swap and move bits between words.
> +
> +	So l =  0  1  2  3  r = 16 17 18 19
> +	        4  5  6  7      20 21 22 23
> +	        8  9 10 11      24 25 26 27
> +	       12 13 14 15      28 29 30 31
> +	becomes (for size == 2 and mask == 0x3333)
> +	   t =   2^16  3^17 -- --   l =  0  1 16 17  r =  2  3 18 19
> +		 6^20  7^21 -- --        4  5 20 21       6  7 22 23
> +		10^24 11^25 -- --        8  9 24 25      10 11 24 25
> +		14^28 15^29 -- --       12 13 28 29      14 15 28 29
> +
> +	Thanks for hints from Richard Outerbridge - he told me IP&FP
> +	could be done in 15 xor, 10 shifts and 5 ands.
> +	When I finally started to think of the problem in 2D
> +	I first got ~42 operations without xors.  When I remembered
> +	how to use xors :-) I got it to its final state.
> +	*/
> +#define PERM_OP(a,b,t,n,m) ((t)=((((a)>>(n))^(b))&(m)),\
> +	(b)^=(t),\
> +	(a)^=((t)<<(n)))
> +
> +#define IP(l,r) \
> +	{ \
> +	register DES_LONG tt; \
> +	PERM_OP(r,l,tt, 4,0x0f0f0f0fL); \
> +	PERM_OP(l,r,tt,16,0x0000ffffL); \
> +	PERM_OP(r,l,tt, 2,0x33333333L); \
> +	PERM_OP(l,r,tt, 8,0x00ff00ffL); \
> +	PERM_OP(r,l,tt, 1,0x55555555L); \
> +	}
> +
> +#define FP(l,r) \
> +	{ \
> +	register DES_LONG tt; \
> +	PERM_OP(l,r,tt, 1,0x55555555L); \
> +	PERM_OP(r,l,tt, 8,0x00ff00ffL); \
> +	PERM_OP(l,r,tt, 2,0x33333333L); \
> +	PERM_OP(r,l,tt,16,0x0000ffffL); \
> +	PERM_OP(l,r,tt, 4,0x0f0f0f0fL); \
> +	}
> +
> +extern const DES_LONG des_SPtrans[8][64];
> +
> +#ifndef NOPROTO
> +void fcrypt_body(DES_LONG *out,des_key_schedule ks,
> +	DES_LONG Eswap0, DES_LONG Eswap1);
> +#else
> +void fcrypt_body();
> +#endif
> +
> +#endif
> diff -Naur linux/include/linux/if_crypto.h linux-crypto/include/linux/if_crypto.h
> --- linux/include/linux/if_crypto.h	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/include/linux/if_crypto.h	Tue Aug 27 12:34:04 2002
> @@ -0,0 +1,130 @@
> +#ifndef __IF_CRYPTO_H
> +#define __IF_CRYPTO_H
> +#ifdef USE_RC4
> +#include <openssl/rc4.h>
> +#endif /* USE_RC4 */
> +#include <linux/des_locl.h>
> +#include <linux/slab.h>
> +
> +typedef struct RC4_KEY_HW {
> +	unsigned char raw[16];		/* Raw key */		
> +	int	len;				/* Key len */
> +} RC4_KEY_HW;
> +
> +typedef unsigned short	crypto_cmd_t;
> +struct crypto_engine_def;
> +
> +struct crypto_request
> +{
> +	char 	*inbuf;								/* Input buffer */
> +	char 	*outbuf;								/* Output buffer */
> +	int 	inlen;								/* Length of input buffer */
> +	int 	outlen;								/* On input, max size. On Output, real size of output */
> +	unsigned int 	flags;					
> +	struct crypto_engine_def *engine;	/* Engine to use. If NULL, use best one */
> +	struct crypto_operation
> +	{
> +		crypto_cmd_t cmd;						/* Operation to perform */
> +		int	offset;				/* Offset, from inbuf, to start operation */
> +		int 	len;					/* Length of operation */
> +		union
> +		{
> +			struct CRYPTO_RC4
> +			{
> +				struct RC4_KEY_HW 	*key;
> +			} rc4;
> +			struct CRYPTO_DES
> +			{
> +				des_cblock	key[3];		/* For DES, key[0] only is used */
> +				des_cblock	*ivec;				/* NULL if no ivec */
> +			} des;
> +			struct CRYPTO_HASH
> +			{
> +				unsigned char hmac_key[64];
> +				unsigned char hmac_key_len;
> +				unsigned char result[20];	/* On output, contains the hash result */
> +				unsigned char reslen;		/* Contains the result len */
> +			} hash;
> +		} u;
> +		struct crypto_operation *next;			/* If non-NULL, pointer to next operation to perform on buffer 
> +												* Users are responsable for memory allocated for *next 
> +												*/
> +	} op;
> +	void 	(*callback)(struct crypto_request *);	/* function to call when done request. This struct * is passed as argument. */
> +	void 	*priv;						/* Private to requester */
> +};
> +
> +/* Commands */
> +#define CRYPT_NO_OP		0x00
> +#define CRYPT_ENCODE 	0x00
> +#define CRYPT_DECODE 	0x80 
> +#define CRYPT_RC4 		0x01
> +#define CRYPT_DES			0x02		/* Should not be used... insecure (key space too small) */
> +#define CRYPT_3DES		0x04
> +# define CRYPT_ECB		0x08		/* Meaningful only for [3]DES */
> +# define CRYPT_CBC		0x10		/* Meaningful only for [3]DES */
> +#define CRYPT_MD5			0x20
> +#define CRYPT_SHA			0x40
> +# define CRYPT_HMAC		0x08		/* Meaningful only for MD5|SHA */
> +# define CRYPT_96			0x10		/* Meaningful only for MD5|SHA */
> +# define CRYPT_APPEND	0x100		/* Meaningful only for MD5|SHA, append hash to output */
> +#define CRYPT_RANDOM	0x200		/* Get some random bytes in outbuf */
> +
> +/* Flags */
> +#define CRYPT_SYNC				0x1	/* Must wait for completion */
> +#define CRYPT_HIGH_PRIORITY 0x2	/* Process in priority (insert at end of queue) */
> +#define CRYPT_DATA			0x4		/* Use to filter data from other stuff */
> +#define CRYPT_SOFTWARE	0x8		/* Force software, or in output, was done in Software automagically */
> +#define CRYPT_HARDWARE	0x10		/* Force hardware, or in output, was done in Hardware */
> +
> +/* Return codes */
> +#define CRYPT_READY	1
> +#define CRYPT_OK		0
> +#define CRYPT_ERROR	-1
> +#define CRYPT_NO_RESSOURCE 	-2
> +
> +enum crypto_engine_attributes
> +{
> +	IS_SOFTWARE	=0x01,		
> +	IS_HARDWARE	=0x02,
> +	IS_ASYNC		=0x04,	/* Can return CRYPT_OK and calls back when done */
> +	IS_SYNC		=0x08		/* Can be instructed to wait until completion (BUSY LOOPING?!) */
> +};
> +
> +
> +/* Prototypes */
> +
> +struct crypto_request *crypto_alloc_request(int flags);
> +int crypto_execute(struct crypto_request *req);	
> +int crypto_query(crypto_cmd_t cap,unsigned int attrib);	/* Returns TRUE when there is an engine that matches */ 
> +/* Optionnaly, open the engine to use and put it in req->engine */
> +struct crypto_engine_def *crypto_open_engine(crypto_cmd_t cap,unsigned int attrib);
> +void crypto_close_engine(struct crypto_engine_def *eng);
> +
> +static inline void crypto_free_request(struct crypto_request *r)
> +{
> +	kfree(r);
> +}
> +
> +/**************************************************
> +*
> +* For crypto providers 
> +*
> +***************************************************/
> +
> +struct crypto_engine_def
> +{
> +	char *name;
> +	crypto_cmd_t	capability;
> +	unsigned int	attributes;
> +	int (*request_handler)(struct crypto_request *req);
> +	void (*open)(void);
> +	void (*close)(void);
> +};
> +
> +
> +int crypto_register_engine(struct crypto_engine_def *eng);
> +int crypto_unregister_engine(char *name);
> +
> +
> +#endif
> diff -Naur linux/include/linux/md5.h linux-crypto/include/linux/md5.h
> --- linux/include/linux/md5.h	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/include/linux/md5.h	Tue Aug 27 11:20:55 2002
> @@ -0,0 +1,129 @@
> +/*
> + * RCSID $Id: ipsec_md5h.h,v 1.6 1999/12/13 13:59:13 rgb Exp $
> + */
> +
> +/*
> + * The rest of this file is Copyright RSA DSI. See the following comments
> + * for the full Copyright notice.
> + */
> +
> +#ifndef _MD5_H_
> +#define _MD5_H_
> +
> +/* GLOBAL.H - RSAREF types and constants
> + */
> +
> +/* PROTOTYPES should be set to one if and only if the compiler supports
> +     function argument prototyping.
> +   The following makes PROTOTYPES default to 0 if it has not already
> +     been defined with C compiler flags.
> + */
> +#ifndef PROTOTYPES
> +#define PROTOTYPES 1
> +#endif /* !PROTOTYPES */
> +
> +/* POINTER defines a generic pointer type */
> +typedef __u8 *POINTER;
> +
> +/* UINT2 defines a two byte word */
> +typedef __u16 UINT2;
> +
> +/* UINT4 defines a four byte word */
> +typedef __u32 UINT4;
> +
> +/* PROTO_LIST is defined depending on how PROTOTYPES is defined above.
> +   If using PROTOTYPES, then PROTO_LIST returns the list, otherwise it
> +     returns an empty list.
> + */
> +
> +#if PROTOTYPES
> +#define PROTO_LIST(list) list
> +#else /* PROTOTYPES */
> +#define PROTO_LIST(list) ()
> +#endif /* PROTOTYPES */
> +
> +
> +/* MD5.H - header file for MD5C.C
> + */
> +
> +/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
> +rights reserved.
> +
> +License to copy and use this software is granted provided that it
> +is identified as the "RSA Data Security, Inc. MD5 Message-Digest
> +Algorithm" in all material mentioning or referencing this software
> +or this function.
> +
> +License is also granted to make and use derivative works provided
> +that such works are identified as "derived from the RSA Data
> +Security, Inc. MD5 Message-Digest Algorithm" in all material
> +mentioning or referencing the derived work.
> +
> +RSA Data Security, Inc. makes no representations concerning either
> +the merchantability of this software or the suitability of this
> +software for any particular purpose. It is provided "as is"
> +without express or implied warranty of any kind.
> +
> +These notices must be retained in any copies of any part of this
> +documentation and/or software.
> + */
> +
> +/* MD5 context. */
> +typedef struct {
> +  UINT4 state[4];                                   /* state (ABCD) */
> +  UINT4 count[2];        /* number of bits, modulo 2^64 (lsb first) */
> +  unsigned char buffer[64];                         /* input buffer */
> +} MD5_CTX;
> +
> +void MD5Init PROTO_LIST ((MD5_CTX *));
> +void MD5Update PROTO_LIST
> +  ((MD5_CTX *, unsigned char *, __u32));
> +void MD5Final PROTO_LIST ((unsigned char [16], MD5_CTX *));
> + 
> +#endif /* _MD5_H_ */
> +
> +/*
> + * $Log: ipsec_md5h.h,v $
> + * Revision 1.6  1999/12/13 13:59:13  rgb
> + * Quick fix to argument size to Update bugs.
> + *
> + * Revision 1.5  1999/12/07 18:16:23  rgb
> + * Fixed comments at end of #endif lines.
> + *
> + * Revision 1.4  1999/04/06 04:54:26  rgb
> + * Fix/Add RCSID Id: and Log: bits to make PHMDs happy.  This includes
> + * patch shell fixes.
> + *
> + * Revision 1.3  1999/01/22 06:19:58  rgb
> + * 64-bit clean-up.
> + *
> + * Revision 1.2  1998/11/30 13:22:54  rgb
> + * Rationalised all the klips kernel file headers.  They are much shorter
> + * now and won't conflict under RH5.2.
> + *
> + * Revision 1.1  1998/06/18 21:27:48  henry
> + * move sources from klips/src to klips/net/ipsec, to keep stupid
> + * kernel-build scripts happier in the presence of symlinks
> + *
> + * Revision 1.2  1998/04/23 20:54:03  rgb
> + * Fixed md5 and sha1 include file nesting issues, to be cleaned up when
> + * verified.
> + *
> + * Revision 1.1  1998/04/09 03:04:21  henry
> + * sources moved up from linux/net/ipsec
> + * these two include files modified not to include others except in kernel
> + *
> + * Revision 1.1.1.1  1998/04/08 05:35:03  henry
> + * RGB's ipsec-0.8pre2.tar.gz ipsec-0.8
> + *
> + * Revision 0.4  1997/01/15 01:28:15  ji
> + * No changes.
> + *
> + * Revision 0.3  1996/11/20 14:48:53  ji
> + * Release update only.
> + *
> + * Revision 0.2  1996/11/02 00:18:33  ji
> + * First limited release.
> + *
> + *
> + */
> diff -Naur linux/include/linux/sha1.h linux-crypto/include/linux/sha1.h
> --- linux/include/linux/sha1.h	Thu Jan  1 01:00:00 1970
> +++ linux-crypto/include/linux/sha1.h	Tue Aug 27 11:20:55 2002
> @@ -0,0 +1,68 @@
> +/*
> + * RCSID $Id: sha1.h,v 1.5 1999/12/13 13:59:13 rgb Exp $
> + */
> +
> +/*
> + * Here is the original comment from the distribution:
> +
> +SHA-1 in C
> +By Steve Reid <[email protected]>
> +100% Public Domain
> +
> + * Adapted for use by the IPSEC code by John Ioannidis
> + */
> +
> +
> +#ifndef _SHA1_H_
> +#define _SHA1_H_
> +
> +typedef struct
> +{
> +	__u32	state[5];
> +	__u32	count[2];
> +	__u8	buffer[64];
> +} SHA1_CTX;
> +
> +void SHA1Transform(__u32 state[5], __u8 buffer[64]);
> +void SHA1Init(SHA1_CTX *context);
> +void SHA1Update(SHA1_CTX *context, unsigned char *data, __u32 len);
> +void SHA1Final(unsigned char digest[20], SHA1_CTX *context);
> +
> + 
> +#endif /* _SHA1_H_ */
> +
> +/*
> + * $Log: ipsec_sha1.h,v $
> + * Revision 1.5  1999/12/13 13:59:13  rgb
> + * Quick fix to argument size to Update bugs.
> + *
> + * Revision 1.4  1999/12/07 18:16:23  rgb
> + * Fixed comments at end of #endif lines.
> + *
> + * Revision 1.3  1999/04/06 04:54:27  rgb
> + * Fix/Add RCSID Id: and Log: bits to make PHMDs happy.  This includes
> + * patch shell fixes.
> + *
> + * Revision 1.2  1998/11/30 13:22:54  rgb
> + * Rationalised all the klips kernel file headers.  They are much shorter
> + * now and won't conflict under RH5.2.
> + *
> + * Revision 1.1  1998/06/18 21:27:50  henry
> + * move sources from klips/src to klips/net/ipsec, to keep stupid
> + * kernel-build scripts happier in the presence of symlinks
> + *
> + * Revision 1.2  1998/04/23 20:54:05  rgb
> + * Fixed md5 and sha1 include file nesting issues, to be cleaned up when
> + * verified.
> + *
> + * Revision 1.1  1998/04/09 03:04:21  henry
> + * sources moved up from linux/net/ipsec
> + * these two include files modified not to include others except in kernel
> + *
> + * Revision 1.1.1.1  1998/04/08 05:35:04  henry
> + * RGB's ipsec-0.8pre2.tar.gz ipsec-0.8
> + *
> + * Revision 0.4  1997/01/15 01:28:15  ji
> + * New transform
> + *
> + */


	slainte mhath, RGB

-- 
Richard Guy Briggs           --    ~\                 Auto-Free Ottawa! Canada
<www.TriColour.net>            --    \@       @           <www.flora.org/afo/>
No Internet Wiretapping!        --   _\\/\%___\\/\%        Vote! -- <Green.ca>
<www.FreeSWAN.org>_______GTVS6#790__(*)_______(*)(*)_______<www.Marillion.com>