146 lines
3.9 KiB
C
Executable File
146 lines
3.9 KiB
C
Executable File
/* cipher stuff */
|
|
#ifndef CRYPTODEV_INT_H
|
|
# define CRYPTODEV_INT_H
|
|
|
|
#include <linux/version.h>
|
|
|
|
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 13, 0))
|
|
# define reinit_completion(x) INIT_COMPLETION(*(x))
|
|
#endif
|
|
|
|
#include <linux/init.h>
|
|
#include <linux/sched.h>
|
|
#include <linux/fs.h>
|
|
#include <linux/file.h>
|
|
#include <linux/fdtable.h>
|
|
#include <linux/miscdevice.h>
|
|
#include <linux/module.h>
|
|
#include <linux/moduleparam.h>
|
|
#include <linux/scatterlist.h>
|
|
#include <crypto/cryptodev.h>
|
|
#include <crypto/aead.h>
|
|
|
|
#define PFX "cryptodev: "
|
|
#define dprintk(level, severity, format, a...) \
|
|
do { \
|
|
if (level <= cryptodev_verbosity) \
|
|
printk(severity PFX "%s[%u] (%s:%u): " format "\n", \
|
|
current->comm, current->pid, \
|
|
__func__, __LINE__, \
|
|
##a); \
|
|
} while (0)
|
|
#define derr(level, format, a...) dprintk(level, KERN_ERR, format, ##a)
|
|
#define dwarning(level, format, a...) dprintk(level, KERN_WARNING, format, ##a)
|
|
#define dinfo(level, format, a...) dprintk(level, KERN_INFO, format, ##a)
|
|
#define ddebug(level, format, a...) dprintk(level, KERN_DEBUG, format, ##a)
|
|
|
|
|
|
extern int cryptodev_verbosity;
|
|
|
|
struct fcrypt {
|
|
struct list_head list;
|
|
struct mutex sem;
|
|
};
|
|
|
|
/* compatibility stuff */
|
|
#ifdef CONFIG_COMPAT
|
|
#include <linux/compat.h>
|
|
|
|
/* input of CIOCGSESSION */
|
|
struct compat_session_op {
|
|
/* Specify either cipher or mac
|
|
*/
|
|
uint32_t cipher; /* cryptodev_crypto_op_t */
|
|
uint32_t mac; /* cryptodev_crypto_op_t */
|
|
|
|
uint32_t keylen;
|
|
compat_uptr_t key; /* pointer to key data */
|
|
uint32_t mackeylen;
|
|
compat_uptr_t mackey; /* pointer to mac key data */
|
|
|
|
uint32_t ses; /* session identifier */
|
|
};
|
|
|
|
/* input of CIOCCRYPT */
|
|
struct compat_crypt_op {
|
|
uint32_t ses; /* session identifier */
|
|
uint16_t op; /* COP_ENCRYPT or COP_DECRYPT */
|
|
uint16_t flags; /* see COP_FLAG_* */
|
|
uint32_t len; /* length of source data */
|
|
compat_uptr_t src; /* source data */
|
|
compat_uptr_t dst; /* pointer to output data */
|
|
compat_uptr_t mac;/* pointer to output data for hash/MAC operations */
|
|
compat_uptr_t iv;/* initialization vector for encryption operations */
|
|
};
|
|
|
|
/* compat ioctls, defined for the above structs */
|
|
#define COMPAT_CIOCGSESSION _IOWR('c', 102, struct compat_session_op)
|
|
#define COMPAT_CIOCCRYPT _IOWR('c', 104, struct compat_crypt_op)
|
|
#define COMPAT_CIOCASYNCCRYPT _IOW('c', 107, struct compat_crypt_op)
|
|
#define COMPAT_CIOCASYNCFETCH _IOR('c', 108, struct compat_crypt_op)
|
|
|
|
#endif /* CONFIG_COMPAT */
|
|
|
|
/* kernel-internal extension to struct crypt_op */
|
|
struct kernel_crypt_op {
|
|
struct crypt_op cop;
|
|
|
|
int ivlen;
|
|
__u8 iv[EALG_MAX_BLOCK_LEN];
|
|
|
|
int digestsize;
|
|
uint8_t hash_output[AALG_MAX_RESULT_LEN];
|
|
|
|
struct task_struct *task;
|
|
struct mm_struct *mm;
|
|
};
|
|
|
|
struct kernel_crypt_auth_op {
|
|
struct crypt_auth_op caop;
|
|
|
|
int dst_len; /* based on src_len + pad + tag */
|
|
int ivlen;
|
|
__u8 iv[EALG_MAX_BLOCK_LEN];
|
|
|
|
struct task_struct *task;
|
|
struct mm_struct *mm;
|
|
};
|
|
|
|
/* auth */
|
|
|
|
int kcaop_from_user(struct kernel_crypt_auth_op *kcop,
|
|
struct fcrypt *fcr, void __user *arg);
|
|
int kcaop_to_user(struct kernel_crypt_auth_op *kcaop,
|
|
struct fcrypt *fcr, void __user *arg);
|
|
int crypto_auth_run(struct fcrypt *fcr, struct kernel_crypt_auth_op *kcaop);
|
|
int crypto_run(struct fcrypt *fcr, struct kernel_crypt_op *kcop);
|
|
|
|
#include <cryptlib.h>
|
|
|
|
/* other internal structs */
|
|
struct csession {
|
|
struct list_head entry;
|
|
struct mutex sem;
|
|
struct cipher_data cdata;
|
|
struct hash_data hdata;
|
|
uint32_t sid;
|
|
uint32_t alignmask;
|
|
|
|
unsigned int array_size;
|
|
unsigned int used_pages; /* the number of pages that are used */
|
|
/* the number of pages marked as NOT-writable; they preceed writeables */
|
|
unsigned int readonly_pages;
|
|
struct page **pages;
|
|
struct scatterlist *sg;
|
|
};
|
|
|
|
struct csession *crypto_get_session_by_sid(struct fcrypt *fcr, uint32_t sid);
|
|
|
|
static inline void crypto_put_session(struct csession *ses_ptr)
|
|
{
|
|
mutex_unlock(&ses_ptr->sem);
|
|
}
|
|
int adjust_sg_array(struct csession *ses, int pagecount);
|
|
|
|
#endif /* CRYPTODEV_INT_H */
|