summaryrefslogtreecommitdiffstats
path: root/include/linux/cryptodev.h
blob: a916177eaa7baded1c532be13f3a64ec38d98f0b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
/* This is a source compatible implementation with the original API of 
 * cryptodev by Angelos D. Keromytis, found at openbsd cryptodev.h.
 * Placed under public domain */

#ifndef _LINUX_CRYPTODEV_H
#define _LINUX_CRYPTODEV_H

#include <linux/types.h>

/* API extensions for linux */
#define CRYPTO_HMAC_MAX_KEY_LEN		512
#define CRYPTO_CIPHER_MAX_KEY_LEN	64

/* All the supported algorithms
 */
typedef enum {
	CRYPTO_DES_CBC=1,
	CRYPTO_3DES_CBC=2,
	CRYPTO_BLF_CBC=3,
	CRYPTO_CAST_CBC=4,
	CRYPTO_SKIPJACK_CBC=5,
	CRYPTO_MD5_HMAC=6,
	CRYPTO_SHA1_HMAC=7,
	CRYPTO_RIPEMD160_HMAC=8,
	CRYPTO_MD5_KPDK=9,
	CRYPTO_SHA1_KPDK=10,
	CRYPTO_RIJNDAEL128_CBC=11,
	CRYPTO_AES_CBC=CRYPTO_RIJNDAEL128_CBC,
	CRYPTO_ARC4=12,
	CRYPTO_MD5=13,
	CRYPTO_SHA1=14,
	CRYPTO_DEFLATE_COMP=15,
	CRYPTO_NULL=16,
	CRYPTO_LZS_COMP=17,
	CRYPTO_SHA2_256_HMAC=18,
	CRYPTO_SHA2_384_HMAC=19,
	CRYPTO_SHA2_512_HMAC=20,
	CRYPTO_AES_CTR=21,
	CRYPTO_AES_XTS=22,

	CRYPTO_CAMELLIA_CBC=101,
	CRYPTO_RIPEMD160,
	CRYPTO_SHA2_256,
	CRYPTO_SHA2_384,
	CRYPTO_SHA2_512,
	CRYPTO_ALGORITHM_ALL, /* Keep updated - see below */
} cryptodev_crypto_op_t;
#define	CRYPTO_ALGORITHM_MAX	(CRYPTO_ALGORITHM_ALL - 1)

/* Values for ciphers */
#define DES_BLOCK_LEN		8
#define DES3_BLOCK_LEN		8
#define RIJNDAEL128_BLOCK_LEN	16
#define AES_BLOCK_LEN		RIJNDAEL128_BLOCK_LEN
#define CAMELLIA_BLOCK_LEN
#define BLOWFISH_BLOCK_LEN	8
#define SKIPJACK_BLOCK_LEN	8
#define CAST128_BLOCK_LEN	8

/* the maximum of the above */
#define EALG_MAX_BLOCK_LEN	16

/* Values for hashes/MAC */
#define AALG_MAX_RESULT_LEN		64

/* input of CIOCGSESSION */
struct session_op {
	/* Specify either cipher or mac
	 */
	__u32	cipher;		/* cryptodev_crypto_op_t */
	__u32	mac;		/* cryptodev_crypto_op_t */

	__u32	keylen;
	__u8	__user *key;
	__u32	mackeylen;
	__u8	__user *mackey;

	__u32	ses;		/* session identifier */
};

#define	COP_ENCRYPT	0
#define COP_DECRYPT	1

/* input of CIOCCRYPT */
 struct crypt_op {
	__u32	ses;		/* session identifier */
	__u16	op;		/* COP_ENCRYPT or COP_DECRYPT */
	__u16	flags;		/* no usage so far, use 0 */
	__u32	len;		/* length of source data */
	__u8	__user *src;		/* source data */
	__u8	__user *dst;		/* pointer to output data */
	__u8	__user *mac;		/* pointer to output data for hash/MAC operations */
	__u8	__user *iv;		/* initialization vector for encryption operations */
};

/* Stuff for bignum arithmetic and public key
 * cryptography - not supported yet by linux
 * cryptodev.
 */

#define	CRYPTO_ALG_FLAG_SUPPORTED	1
#define	CRYPTO_ALG_FLAG_RNG_ENABLE	2
#define	CRYPTO_ALG_FLAG_DSA_SHA		4

struct crparam {
	__u8*	crp_p;
	__u32	crp_nbits;
};

#define CRK_MAXPARAM	8

/* input of CIOCKEY */
struct crypt_kop {
	__u32	crk_op;		/* cryptodev_crk_ot_t */
	__u32	crk_status;
	__u16	crk_iparams;
	__u16	crk_oparams;
	__u32	crk_pad1;
	struct crparam	crk_param[CRK_MAXPARAM];
};

typedef enum {
	CRK_MOD_EXP=0,
	CRK_MOD_EXP_CRT=1,
	CRK_DSA_SIGN=2,
	CRK_DSA_VERIFY=3,
	CRK_DH_COMPUTE_KEY=4,
	CRK_ALGORITHM_ALL
} cryptodev_crk_op_t;

#define CRK_ALGORITHM_MAX	CRK_ALGORITHM_ALL-1

/* features to be queried with CIOCASYMFEAT ioctl
 */
#define CRF_MOD_EXP		(1 << CRK_MOD_EXP)
#define CRF_MOD_EXP_CRT		(1 << CRK_MOD_EXP_CRT)
#define CRF_DSA_SIGN		(1 << CRK_DSA_SIGN)
#define CRF_DSA_VERIFY		(1 << CRK_DSA_VERIFY)
#define CRF_DH_COMPUTE_KEY	(1 << CRK_DH_COMPUTE_KEY)


/* ioctl's. Compatible with old linux cryptodev.h
 */
#define CRIOGET         _IOWR('c', 101, __u32)
#define CIOCGSESSION    _IOWR('c', 102, struct session_op)
#define CIOCFSESSION    _IOW('c', 103, __u32)
#define CIOCCRYPT       _IOWR('c', 104, struct crypt_op)
#define CIOCKEY         _IOWR('c', 105, struct crypt_kop)
#define CIOCASYMFEAT    _IOR('c', 106, __u32)

#endif /* _LINUX_CRYPTODEV_H */