1/*	$NetBSD: algorithm.h,v 1.5 2006/10/06 12:02:27 manu Exp $	*/
2
3/* Id: algorithm.h,v 1.10 2005/04/09 16:25:23 manubsd Exp */
4
5/*
6 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 *    notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 *    notice, this list of conditions and the following disclaimer in the
16 *    documentation and/or other materials provided with the distribution.
17 * 3. Neither the name of the project nor the names of its contributors
18 *    may be used to endorse or promote products derived from this software
19 *    without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 */
33
34#ifndef _ALGORITHM_H
35#define _ALGORITHM_H
36
37#include <gnuc.h>
38
39/* algorithm class */
40enum {
41	algclass_ipsec_enc,
42	algclass_ipsec_auth,
43	algclass_ipsec_comp,
44	algclass_isakmp_enc,
45	algclass_isakmp_hash,
46	algclass_isakmp_dh,
47	algclass_isakmp_ameth,	/* authentication method. */
48#define MAXALGCLASS	7
49};
50
51#define ALG_DEFAULT_KEYLEN	64
52
53#define ALGTYPE_NOTHING		0
54
55/* algorithm type */
56enum algtype {
57	algtype_nothing = 0,
58
59	/* enc */
60	algtype_des_iv64,
61	algtype_des,
62	algtype_3des,
63	algtype_rc5,
64	algtype_idea,
65	algtype_cast128,
66	algtype_blowfish,
67	algtype_3idea,
68	algtype_des_iv32,
69	algtype_rc4,
70	algtype_null_enc,
71	algtype_aes,
72	algtype_twofish,
73	algtype_camellia,
74
75	/* ipsec auth */
76	algtype_hmac_md5,
77	algtype_hmac_sha1,
78	algtype_des_mac,
79	algtype_kpdk,
80	algtype_non_auth,
81	algtype_hmac_sha2_256,
82	algtype_hmac_sha2_384,
83	algtype_hmac_sha2_512,
84
85	/* ipcomp */
86	algtype_oui,
87	algtype_deflate,
88	algtype_lzs,
89
90	/* hash */
91	algtype_md5,
92	algtype_sha1,
93	algtype_tiger,
94	algtype_sha2_256,
95	algtype_sha2_384,
96	algtype_sha2_512,
97
98	/* dh_group */
99	algtype_modp768,
100	algtype_modp1024,
101	algtype_ec2n155,
102	algtype_ec2n185,
103	algtype_modp1536,
104	algtype_modp2048,
105	algtype_modp3072,
106	algtype_modp4096,
107	algtype_modp6144,
108	algtype_modp8192,
109
110	/* authentication method. */
111	algtype_psk,
112	algtype_dsssig,
113	algtype_rsasig,
114	algtype_rsaenc,
115	algtype_rsarev,
116	algtype_gssapikrb,
117#ifdef ENABLE_HYBRID
118	algtype_hybrid_rsa_s,
119	algtype_hybrid_dss_s,
120	algtype_hybrid_rsa_c,
121	algtype_hybrid_dss_c,
122	algtype_xauth_psk_s,
123	algtype_xauth_psk_c,
124	algtype_xauth_rsa_s,
125	algtype_xauth_rsa_c,
126#endif
127};
128
129struct hmac_algorithm {
130	char *name;
131	int type;
132	int doi;
133	caddr_t (*init) __P((vchar_t *));
134	void (*update) __P((caddr_t, vchar_t *));
135	vchar_t *(*final) __P((caddr_t));
136	int (*hashlen) __P((void));
137	vchar_t *(*one) __P((vchar_t *, vchar_t *));
138};
139
140struct hash_algorithm {
141	char *name;
142	int type;
143	int doi;
144	caddr_t (*init) __P((void));
145	void (*update) __P((caddr_t, vchar_t *));
146	vchar_t *(*final) __P((caddr_t));
147	int (*hashlen) __P((void));
148	vchar_t *(*one) __P((vchar_t *));
149};
150
151struct enc_algorithm {
152	char *name;
153	int type;
154	int doi;
155	int blocklen;
156	vchar_t *(*encrypt) __P((vchar_t *, vchar_t *, vchar_t *));
157	vchar_t *(*decrypt) __P((vchar_t *, vchar_t *, vchar_t *));
158	int (*weakkey) __P((vchar_t *));
159	int (*keylen) __P((int));
160};
161
162/* dh group */
163struct dh_algorithm {
164	char *name;
165	int type;
166	int doi;
167	struct dhgroup *dhgroup;
168};
169
170/* ipcomp, auth meth, dh group */
171struct misc_algorithm {
172	char *name;
173	int type;
174	int doi;
175};
176
177extern int alg_oakley_hashdef_ok __P((int));
178extern int alg_oakley_hashdef_doi __P((int));
179extern int alg_oakley_hashdef_hashlen __P((int));
180extern vchar_t *alg_oakley_hashdef_one __P((int, vchar_t *));
181
182extern int alg_oakley_hmacdef_doi __P((int));
183extern vchar_t *alg_oakley_hmacdef_one __P((int, vchar_t *, vchar_t *));
184
185extern int alg_oakley_encdef_ok __P((int));
186extern int alg_oakley_encdef_doi __P((int));
187extern int alg_oakley_encdef_keylen __P((int, int));
188extern int alg_oakley_encdef_blocklen __P((int));
189extern vchar_t *alg_oakley_encdef_decrypt __P((int, vchar_t *, vchar_t *, vchar_t *));
190extern vchar_t *alg_oakley_encdef_encrypt __P((int, vchar_t *, vchar_t *, vchar_t *));
191
192extern int alg_ipsec_encdef_doi __P((int));
193extern int alg_ipsec_encdef_keylen __P((int, int));
194
195extern int alg_ipsec_hmacdef_doi __P((int));
196extern int alg_ipsec_hmacdef_hashlen __P((int));
197
198extern int alg_ipsec_compdef_doi __P((int));
199
200extern int alg_oakley_dhdef_doi __P((int));
201extern int alg_oakley_dhdef_ok __P((int));
202extern struct dhgroup *alg_oakley_dhdef_group __P((int));
203
204extern int alg_oakley_authdef_doi __P((int));
205
206extern int default_keylen __P((int, int));
207extern int check_keylen __P((int, int, int));
208extern int algtype2doi __P((int, int));
209extern int algclass2doi __P((int));
210
211extern const char *alg_oakley_encdef_name __P((int));
212extern const char *alg_oakley_hashdef_name __P((int));
213extern const char *alg_oakley_dhdef_name __P((int));
214extern const char *alg_oakley_authdef_name __P((int));
215
216#endif /* _ALGORITHM_H */
217