File icaioctl.h of Package libica

/* Copyright (c) International Business Machines Corp., 2001 */
/*
 * linux/include/linux/icaioctl.h
 * 
 */



#ifndef _LINUX_ICAIOCTL_H_
#define _LINUX_ICAIOCTL_H_

enum _sizelimits {
  ICA_DES_DATALENGTH_MIN = 8,
  ICA_DES_DATALENGTH_MAX = 32 * 1024 * 1024 - 8,
  ICA_SHA_DATALENGTH = 20,
  ICA_SHA_BLOCKLENGTH = 64,
  ICA_RSA_DATALENGTH_MIN = 256/8,
  ICA_RSA_DATALENGTH_MAX = 2048/8
};


typedef struct _ica_rng_rec {
  unsigned int nbytes;
  char *buf;
} ica_rng_t;


// May have some porting issues here 

typedef struct _ica_rsa_modexpo {
  char         *inputdata;
  unsigned int  inputdatalength;
  char         *outputdata;
  unsigned int  outputdatalength;
  char         *b_key;
  char         *n_modulus;
} ica_rsa_modexpo_t;

typedef ica_rsa_modexpo_t ica_rsa_modmult_t;

typedef struct _ica_rsa_modexpo_crt {
  char         *inputdata;
  unsigned int  inputdatalength;
  char         *outputdata;
  unsigned int  outputdatalength;
  char         *bp_key;
  char         *bq_key;
  char         *np_prime;
  char         *nq_prime;
  char         *u_mult_inv;
} ica_rsa_modexpo_crt_t;

typedef unsigned char ica_des_vector_t[8];
typedef unsigned char ica_des_key_t[8];
typedef ica_des_key_t ica_des_single_t[1];
typedef ica_des_single_t ica_des_triple_t[3];

enum _ica_mode_des {
  DEVICA_MODE_DES_CBC = 0,
  DEVICA_MODE_DES_ECB = 1
};

enum _ica_direction_des {
  DEVICA_DIR_DES_ENCRYPT = 0,
  DEVICA_DIR_DES_DECRYPT = 1
};

typedef struct _ica_des {
  unsigned int      mode;
  unsigned int      direction;
  unsigned char    *inputdata;
  unsigned int      inputdatalength;
  ica_des_vector_t *iv;
  ica_des_key_t    *keys;
  unsigned char    *outputdata;
  int              outputdatalength;
} ica_des_t;
  
typedef struct _ica_desmac {
  unsigned char    *inputdata;
  unsigned int      inputdatalength;
  ica_des_vector_t *iv;
  ica_des_key_t    *keys;
  unsigned char    *outputdata;
  int              outputdatalength;
} ica_desmac_t;
  

typedef unsigned char ica_sha1_result_t[ICA_SHA_DATALENGTH];


typedef struct _ica_sha1 {
  unsigned char     *inputdata;
  unsigned int       inputdatalength;
  ica_sha1_result_t *outputdata;
  ica_sha1_result_t *initialh;
} ica_sha1_t;

/* The following structs are used by conversion functions
   on PowerPC 64 bit only.  They should not be used by externel
   applications.  Should the non PPC specific structs change, these
   structures may need to change as well.  Also, new conversion
   routines will need to be added to devica.c to deal with new 
   structs or structure members.
*/
#ifdef CONFIG_PPC64
typedef struct _ica_rng_rec_32 {
  unsigned int nbytes;
  unsigned int buf;
} ica_rng_t_32;

typedef struct _ica_des_32 {
  unsigned int   mode;
  unsigned int   direction;
  unsigned int    inputdata;
  unsigned int  inputdatalength;
  unsigned int     iv;
  unsigned int      keys;
  unsigned int      outputdata;
  unsigned int   outputdatalength;
} ica_des_t_32;

typedef struct _ica_sha1_32 {
  unsigned int       inputdata;
  unsigned int       inputdatalength;
  unsigned int       outputdata;
  unsigned int       initialh;
} ica_sha1_t_32;

typedef struct _ica_desmac_32 {
  unsigned int    inputdata;
  unsigned int      inputdatalength;
  unsigned int     iv;
  unsigned int     keys;
  unsigned int     outputdata;
  int              outputdatalength;
} ica_desmac_t_32;

typedef struct _ica_rsa_modexpo_crt_32 {
  unsigned int  inputdata;
  unsigned int  inputdatalength;
  unsigned int  outputdata;
  unsigned int  outputdatalength;
  unsigned int  bp_key;
  unsigned int  bq_key;
  unsigned int  np_prime;
  unsigned int  nq_prime;
  unsigned int  u_mult_inv;
} ica_rsa_modexpo_crt_t_32;

typedef struct _ica_rsa_modexpo_32 {
  unsigned int  inputdata;
  unsigned int  inputdatalength;
  unsigned int  outputdata;
  unsigned int  outputdatalength;
  unsigned int  b_key;
  unsigned int  n_modulus;
} ica_rsa_modexpo_t_32;

#endif

#define ICA_IOCTL_MAGIC '?'  // NOTE:  Need to allocate from linux folks

/*
 * Note: Some platforms only use 8 bits to define the parameter size.  As 
 * the macros in ioctl.h don't seem to mask off offending bits, they look
 * a little unsafe.  We should probably just not use the parameter size
 * at all for these ioctls.  I don't know if we'll ever run on any of those
 * architectures, but seems easier just to not count on this feature.
 */

#define ICASETBIND     _IOW(ICA_IOCTL_MAGIC, 0x01, int)
#define ICAGETBIND     _IOR(ICA_IOCTL_MAGIC, 0x02, int)
#define ICAGETCOUNT    _IOR(ICA_IOCTL_MAGIC, 0x03, int)
#define ICAGETID       _IOR(ICA_IOCTL_MAGIC, 0x04, int)
#define ICARSAMODEXPO  _IOC(_IOC_READ|_IOC_WRITE, ICA_IOCTL_MAGIC, 0x05, 0)
#define ICARSACRT      _IOC(_IOC_READ|_IOC_WRITE, ICA_IOCTL_MAGIC, 0x06, 0) 
#define ICARSAMODMULT  _IOC(_IOC_READ|_IOC_WRITE, ICA_IOCTL_MAGIC, 0x07, 0)
#define ICADES         _IOC(_IOC_READ|_IOC_WRITE, ICA_IOCTL_MAGIC, 0x08, 0)
#define ICADESMAC      _IOC(_IOC_READ|_IOC_WRITE, ICA_IOCTL_MAGIC, 0x09, 0)
#define ICATDES        _IOC(_IOC_READ|_IOC_WRITE, ICA_IOCTL_MAGIC, 0x0a, 0)
#define ICATDESSHA     _IOC(_IOC_READ|_IOC_WRITE, ICA_IOCTL_MAGIC, 0x0b, 0)
#define ICATDESMAC     _IOC(_IOC_READ|_IOC_WRITE, ICA_IOCTL_MAGIC, 0x0c, 0)
#define ICASHA1        _IOC(_IOC_READ|_IOC_WRITE, ICA_IOCTL_MAGIC, 0x0d, 0)
#define ICARNG         _IOC(_IOC_READ, ICA_IOCTL_MAGIC, 0x0e, 0)
#define ICAGETVPD      _IOC(_IOC_READ, ICA_IOCTL_MAGIC, 0x0f, 0)

#ifdef __KERNEL__

#ifndef assertk
#ifdef NDEBUG
#  define assertk(expr) do {} while (0)
#else
#  define assertk(expr) \
        if(!(expr)) {                                   \
        printk( "Assertion failed! %s,%s,%s,line=%d\n", \
        #expr,__FILE__,__FUNCTION__,__LINE__);          \
        }
#endif
#endif


struct ica_operations {
  ssize_t (*read) (struct file *, char *, size_t, loff_t *, void *);
  int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long, void *);
};

typedef struct ica_worker {
  struct ica_operations *icaops;
  void * private_data;  
} ica_worker_t;


extern int ica_register_worker(int partitionnum, ica_worker_t *device);
extern int ica_unregister_worker(int partitionnum, ica_worker_t *device);

#endif /* __KERNEL__ */

#endif /* _LINUX_ICAIOCTL_H_ */