2 #ifndef CRYPTODEV_INT_H
3 # define CRYPTODEV_INT_H
5 #include <linux/init.h>
6 #include <linux/sched.h>
8 #include <linux/file.h>
9 #include <linux/fdtable.h>
10 #include <linux/miscdevice.h>
11 #include <linux/module.h>
12 #include <linux/moduleparam.h>
13 #include <linux/scatterlist.h>
14 #include "cryptodev.h"
16 #define PFX "cryptodev: "
17 #define dprintk(level, severity, format, a...) \
19 if (level <= cryptodev_verbosity) \
20 printk(severity PFX "%s[%u]: " format, \
21 current->comm, current->pid, \
25 extern int cryptodev_verbosity
;
28 int __get_userbuf(uint8_t __user
*addr
, uint32_t len
, int write
,
29 int pgcount
, struct page
**pg
, struct scatterlist
*sg
,
30 struct task_struct
*task
, struct mm_struct
*mm
);
31 void release_user_pages(struct page
**pg
, int pagecount
);
33 /* last page - first page + 1 */
34 #define PAGECOUNT(buf, buflen) \
35 ((((unsigned long)(buf + buflen - 1) & PAGE_MASK) >> PAGE_SHIFT) - \
36 (((unsigned long) buf & PAGE_MASK) >> PAGE_SHIFT) + 1)
38 #define DEFAULT_PREALLOC_PAGES 32
41 int init
; /* 0 uninitialized */
46 struct crypto_ablkcipher
*s
;
47 struct cryptodev_result
*result
;
48 struct ablkcipher_request
*request
;
49 uint8_t iv
[EALG_MAX_BLOCK_LEN
];
53 int cryptodev_cipher_init(struct cipher_data
*out
, const char *alg_name
,
54 uint8_t *key
, size_t keylen
);
55 void cryptodev_cipher_deinit(struct cipher_data
*cdata
);
56 ssize_t
cryptodev_cipher_decrypt(struct cipher_data
*cdata
,
57 const struct scatterlist
*sg1
,
58 struct scatterlist
*sg2
, size_t len
);
59 ssize_t
cryptodev_cipher_encrypt(struct cipher_data
*cdata
,
60 const struct scatterlist
*sg1
,
61 struct scatterlist
*sg2
, size_t len
);
63 inline static void cryptodev_cipher_set_iv(struct cipher_data
*cdata
,
64 void *iv
, size_t iv_size
)
66 memcpy(cdata
->async
.iv
, iv
, min(iv_size
, sizeof(cdata
->async
.iv
)));
71 int init
; /* 0 uninitialized */
75 struct crypto_ahash
*s
;
76 struct cryptodev_result
*result
;
77 struct ahash_request
*request
;
81 int cryptodev_hash_final(struct hash_data
*hdata
, void *output
);
82 ssize_t
cryptodev_hash_update(struct hash_data
*hdata
,
83 struct scatterlist
*sg
, size_t len
);
84 int cryptodev_hash_reset(struct hash_data
*hdata
);
85 void cryptodev_hash_deinit(struct hash_data
*hdata
);
86 int cryptodev_hash_init(struct hash_data
*hdata
, const char *alg_name
,
87 int hmac_mode
, void *mackey
, size_t mackeylen
);
89 /* compatibility stuff */
91 #include <linux/compat.h>
93 /* input of CIOCGSESSION */
94 struct compat_session_op
{
95 /* Specify either cipher or mac
97 uint32_t cipher
; /* cryptodev_crypto_op_t */
98 uint32_t mac
; /* cryptodev_crypto_op_t */
101 compat_uptr_t key
; /* pointer to key data */
103 compat_uptr_t mackey
; /* pointer to mac key data */
105 uint32_t ses
; /* session identifier */
107 uint16_t alignmask
; /* alignment constraints */
110 /* input of CIOCCRYPT */
111 struct compat_crypt_op
{
112 uint32_t ses
; /* session identifier */
113 uint16_t op
; /* COP_ENCRYPT or COP_DECRYPT */
114 uint16_t flags
; /* no usage so far, use 0 */
115 uint32_t len
; /* length of source data */
116 compat_uptr_t src
; /* source data */
117 compat_uptr_t dst
; /* pointer to output data */
118 compat_uptr_t mac
;/* pointer to output data for hash/MAC operations */
119 compat_uptr_t iv
;/* initialization vector for encryption operations */
122 /* compat ioctls, defined for the above structs */
123 #define COMPAT_CIOCGSESSION _IOWR('c', 102, struct compat_session_op)
124 #define COMPAT_CIOCCRYPT _IOWR('c', 104, struct compat_crypt_op)
125 #define COMPAT_CIOCASYNCCRYPT _IOW('c', 107, struct compat_crypt_op)
126 #define COMPAT_CIOCASYNCFETCH _IOR('c', 108, struct compat_crypt_op)
128 #endif /* CONFIG_COMPAT */
130 /* kernel-internal extension to struct crypt_op */
131 struct kernel_crypt_op
{
135 __u8 iv
[EALG_MAX_BLOCK_LEN
];
138 uint8_t hash_output
[AALG_MAX_RESULT_LEN
];
140 struct task_struct
*task
;
141 struct mm_struct
*mm
;
144 #endif /* CRYPTODEV_INT_H */