#ifndef CLICK_IPSECDES_HH
#define CLICK_IPSECDES_HH
#include <click/element.hh>
#include <click/glue.hh>
CLICK_DECLS

/*
 * =c
 * IPsecDES(DECRYPT/ENCRYPT, KEY [, IGNORE])
 * =s ipsec
 * encrypt packet using DES-CBC
 * =d
 * 
 * Encrypts or decrypts packet using DES-CBC. If the first argument is 0,
 * IPsecDES will decrypt. If the first argument is 1, IPsecDES will encrypt.
 * KEY is the DES secret key. Gets IV value from ESP header. IGNORE is the
 * number of bytes at the end of the payload to ignore. By default, IGNORE is
 * 12, which is the number of SHA1 authentication digest bytes for ESP or AH.
 *
 * =a IPsecESPEncap, IPsecESPUnencap, IPsecAuthSHA1
 */

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 */ 
    unsigned long pad[2]; 
  } ks; 
} des_key_schedule[16];

class Address;

class Des : public Element {
public:
  Des();
  Des(int, unsigned char *);
  ~Des();
  
  const char *class_name() const	{ return "IPsecDES"; }
  const char *port_count() const	{ return PORTS_1_1; }
  const char *processing() const	{ return AGNOSTIC; }
  
  int configure(Vector<String> &, ErrorHandler *);
  int initialize(ErrorHandler *);

  Packet *simple_action(Packet *);

  enum { DES_DECRYPT = 0, DES_ENCRYPT = 1 };
  
private:

  void des_set_key(des_cblock *key, des_key_schedule schedule);
  void des_encrypt(unsigned long *input,unsigned long *output,
		   des_key_schedule ks,int encrypt);
  int des_ecb_encrypt(des_cblock *input, des_cblock *output,
		      des_key_schedule ks, int encrypt);

  unsigned _op;
  int _ignore;
  des_cblock _key;
  des_key_schedule _ks;
};

CLICK_ENDDECLS
#endif


syntax highlighted by Code2HTML, v. 0.9.1