1/*	$OpenBSD: cryptodev.h,v 1.82 2022/05/03 09:18:11 claudio Exp $	*/
2
3/*
4 * The author of this code is Angelos D. Keromytis (angelos@cis.upenn.edu)
5 *
6 * This code was written by Angelos D. Keromytis in Athens, Greece, in
7 * February 2000. Network Security Technologies Inc. (NSTI) kindly
8 * supported the development of this code.
9 *
10 * Copyright (c) 2000 Angelos D. Keromytis
11 *
12 * Permission to use, copy, and modify this software with or without fee
13 * is hereby granted, provided that this entire notice is included in
14 * all source code copies of any software which is or includes a copy or
15 * modification of this software.
16 *
17 * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR
18 * IMPLIED WARRANTY. IN PARTICULAR, NONE OF THE AUTHORS MAKES ANY
19 * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE
20 * MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
21 * PURPOSE.
22 *
23 * Copyright (c) 2001 Theo de Raadt
24 *
25 * Redistribution and use in source and binary forms, with or without
26 * modification, are permitted provided that the following conditions
27 * are met:
28 *
29 * 1. Redistributions of source code must retain the above copyright
30 *    notice, this list of conditions and the following disclaimer.
31 * 2. Redistributions in binary form must reproduce the above copyright
32 *    notice, this list of conditions and the following disclaimer in the
33 *    documentation and/or other materials provided with the distribution.
34 *
35 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
36 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
37 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
38 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
39 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
40 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
41 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
42 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
43 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
44 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
45 *
46 * Effort sponsored in part by the Defense Advanced Research Projects
47 * Agency (DARPA) and Air Force Research Laboratory, Air Force
48 * Materiel Command, USAF, under agreement number F30602-01-2-0537.
49 *
50 */
51
52#ifndef _CRYPTO_CRYPTO_H_
53#define _CRYPTO_CRYPTO_H_
54
55#include <sys/task.h>
56
57/* Some initial values */
58#define CRYPTO_DRIVERS_INITIAL	4
59#define CRYPTO_DRIVERS_MAX	128
60#define CRYPTO_SW_SESSIONS	32
61
62/* HMAC values */
63#define HMAC_MD5_BLOCK_LEN	64
64#define HMAC_SHA1_BLOCK_LEN	64
65#define HMAC_RIPEMD160_BLOCK_LEN 64
66#define HMAC_SHA2_256_BLOCK_LEN	64
67#define HMAC_SHA2_384_BLOCK_LEN	128
68#define HMAC_SHA2_512_BLOCK_LEN	128
69#define HMAC_MAX_BLOCK_LEN	HMAC_SHA2_512_BLOCK_LEN	/* keep in sync */
70#define HMAC_IPAD_VAL		0x36
71#define HMAC_OPAD_VAL		0x5C
72
73/* Encryption algorithm block sizes */
74#define DES3_BLOCK_LEN		8
75#define BLOWFISH_BLOCK_LEN	8
76#define CAST128_BLOCK_LEN	8
77#define RIJNDAEL128_BLOCK_LEN	16
78#define CHACHA20_BLOCK_LEN	64
79#define EALG_MAX_BLOCK_LEN	64 /* Keep this updated */
80
81/* Maximum hash algorithm result length */
82#define AALG_MAX_RESULT_LEN	64 /* Keep this updated */
83
84#define CRYPTO_3DES_CBC		1
85#define CRYPTO_BLF_CBC		2
86#define CRYPTO_CAST_CBC		3
87#define CRYPTO_MD5_HMAC		4
88#define CRYPTO_SHA1_HMAC	5
89#define CRYPTO_RIPEMD160_HMAC	6
90#define CRYPTO_RIJNDAEL128_CBC	7  /* 128 bit blocksize */
91#define CRYPTO_AES_CBC		7  /* 128 bit blocksize -- the same as above */
92#define CRYPTO_DEFLATE_COMP	8  /* Deflate compression algorithm */
93#define CRYPTO_NULL		9
94#define CRYPTO_SHA2_256_HMAC	11
95#define CRYPTO_SHA2_384_HMAC	12
96#define CRYPTO_SHA2_512_HMAC	13
97#define CRYPTO_AES_CTR		14
98#define CRYPTO_AES_XTS		15
99#define CRYPTO_AES_GCM_16	16
100#define CRYPTO_AES_128_GMAC	17
101#define CRYPTO_AES_192_GMAC	18
102#define CRYPTO_AES_256_GMAC	19
103#define CRYPTO_AES_GMAC		20
104#define CRYPTO_CHACHA20_POLY1305	21
105#define CRYPTO_CHACHA20_POLY1305_MAC	22
106#define CRYPTO_ESN		23 /* Support for Extended Sequence Numbers */
107#define CRYPTO_ALGORITHM_MAX	23 /* Keep updated */
108
109/* Algorithm flags */
110#define	CRYPTO_ALG_FLAG_SUPPORTED	0x01 /* Algorithm is supported */
111
112/* Standard initialization structure beginning */
113struct cryptoini {
114	int		cri_alg;	/* Algorithm to use */
115	int		cri_klen;	/* Key length, in bits */
116	int		cri_rnd;	/* Algorithm rounds, where relevant */
117	caddr_t		cri_key;	/* key to use */
118	union {
119		u_int8_t	iv[EALG_MAX_BLOCK_LEN];	/* IV to use */
120		u_int8_t	esn[4];			/* high-order ESN */
121	} u;
122#define cri_iv		u.iv
123#define cri_esn		u.esn
124	struct cryptoini *cri_next;
125};
126
127/* Describe boundaries of a single crypto operation */
128struct cryptodesc {
129	int		crd_skip;	/* How many bytes to ignore from start */
130	int		crd_len;	/* How many bytes to process */
131	int		crd_inject;	/* Where to inject results, if applicable */
132	int		crd_flags;
133
134#define	CRD_F_ENCRYPT		0x01	/* Set when doing encryption */
135#define	CRD_F_IV_PRESENT	0x02	/* When encrypting, IV is already in
136					   place, so don't copy. */
137#define	CRD_F_IV_EXPLICIT	0x04	/* IV explicitly provided */
138#define CRD_F_COMP		0x10    /* Set when doing compression */
139#define CRD_F_ESN		0x20	/* Set when ESN field is provided */
140
141	struct cryptoini	CRD_INI; /* Initialization/context data */
142#define crd_esn		CRD_INI.cri_esn
143#define crd_iv		CRD_INI.cri_iv
144#define crd_key		CRD_INI.cri_key
145#define crd_rnd		CRD_INI.cri_rnd
146#define crd_alg		CRD_INI.cri_alg
147#define crd_klen	CRD_INI.cri_klen
148};
149
150/* Structure describing complete operation */
151struct cryptop {
152	u_int64_t	crp_sid;	/* Session ID */
153	int		crp_ilen;	/* Input data total length */
154	int		crp_olen;	/* Result total length */
155	int		crp_alloctype;	/* Type of buf to allocate if needed */
156
157	int		crp_flags;
158
159#define CRYPTO_F_IMBUF	0x0001	/* Input/output are mbuf chains, otherwise contig */
160#define CRYPTO_F_IOV	0x0002	/* Input/output are uio */
161
162	void 		*crp_buf;	/* Data to be processed */
163
164	struct cryptodesc *crp_desc;	/* List of processing descriptors */
165	struct cryptodesc crp_sdesc[2];	/* Static array for small ops */
166	int		 crp_ndesc;	/* Amount of descriptors to use */
167	int		 crp_ndescalloc;/* Amount of descriptors allocated */
168
169	caddr_t		crp_mac;
170};
171
172#define CRYPTO_BUF_IOV		0x1
173#define CRYPTO_BUF_MBUF		0x2
174
175#define CRYPTO_OP_DECRYPT	0x0
176#define CRYPTO_OP_ENCRYPT	0x1
177
178/* Crypto capabilities structure */
179struct cryptocap {
180	u_int64_t	cc_operations;	/* Counter of how many ops done */
181	u_int64_t	cc_bytes;	/* Counter of how many bytes done */
182
183	u_int32_t	cc_sessions;	/* How many sessions allocated */
184
185	/* Symmetric/hash algorithms supported */
186	int		cc_alg[CRYPTO_ALGORITHM_MAX + 1];
187
188	u_int8_t	cc_flags;
189#define CRYPTOCAP_F_CLEANUP     0x01
190#define CRYPTOCAP_F_SOFTWARE    0x02
191#define CRYPTOCAP_F_MPSAFE      0x04
192
193	int		(*cc_newsession) (u_int32_t *, struct cryptoini *);
194	int		(*cc_process) (struct cryptop *);
195	int		(*cc_freesession) (u_int64_t);
196};
197
198void	crypto_init(void);
199
200int	crypto_newsession(u_int64_t *, struct cryptoini *, int);
201int	crypto_freesession(u_int64_t);
202int	crypto_register(u_int32_t, int *,
203	    int (*)(u_int32_t *, struct cryptoini *), int (*)(u_int64_t),
204	    int (*)(struct cryptop *));
205int	crypto_unregister(u_int32_t, int);
206int32_t	crypto_get_driverid(u_int8_t);
207int	crypto_invoke(struct cryptop *);
208
209void	cuio_copydata(struct uio *, int, int, caddr_t);
210void	cuio_copyback(struct uio *, int, int, const void *);
211int	cuio_getptr(struct uio *, int, int *);
212int	cuio_apply(struct uio *, int, int,
213	    int (*f)(caddr_t, caddr_t, unsigned int), caddr_t);
214
215struct	cryptop *crypto_getreq(int);
216void	crypto_freereq(struct cryptop *);
217#endif /* _CRYPTO_CRYPTO_H_ */
218