xref: /openbsd-src/sbin/iked/dh.h (revision 9b50bc253d6cf270fe0a001333c163c7cd5422e5)
1*9b50bc25Stobhe /*	$OpenBSD: dh.h,v 1.15 2021/05/28 18:01:39 tobhe Exp $	*/
245ae9d61Sreyk 
345ae9d61Sreyk /*
4fcebd35dSreyk  * Copyright (c) 2010-2013 Reyk Floeter <reyk@openbsd.org>
545ae9d61Sreyk  *
645ae9d61Sreyk  * Permission to use, copy, modify, and distribute this software for any
745ae9d61Sreyk  * purpose with or without fee is hereby granted, provided that the above
845ae9d61Sreyk  * copyright notice and this permission notice appear in all copies.
945ae9d61Sreyk  *
1045ae9d61Sreyk  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1145ae9d61Sreyk  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1245ae9d61Sreyk  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1345ae9d61Sreyk  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1445ae9d61Sreyk  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1545ae9d61Sreyk  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1645ae9d61Sreyk  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1745ae9d61Sreyk  */
1845ae9d61Sreyk 
19a3e464c5Sreyk #ifndef DH_GROUP_H
20a3e464c5Sreyk #define DH_GROUP_H
2145ae9d61Sreyk 
2245ae9d61Sreyk enum group_type {
2345ae9d61Sreyk 	GROUP_MODP		= 0,
24bc77414bStobhe 	GROUP_ECP		= 1,
25*9b50bc25Stobhe 	GROUP_CURVE25519	= 2,
26*9b50bc25Stobhe 	GROUP_SNTRUP761X25519	= 3
2745ae9d61Sreyk };
2845ae9d61Sreyk 
2945ae9d61Sreyk struct group_id {
3045ae9d61Sreyk 	enum group_type	 type;
31d09d3a7dSreyk 	unsigned int	 id;
3245ae9d61Sreyk 	int		 bits;
3345ae9d61Sreyk 	char		*prime;
3445ae9d61Sreyk 	char		*generator;
3545ae9d61Sreyk 	int		 nid;
3645ae9d61Sreyk };
3745ae9d61Sreyk 
380e1bb3dcStobhe struct dh_group {
3945ae9d61Sreyk 	int		 id;
40e254d6eaSmikeb 	const struct group_id
41e254d6eaSmikeb 			*spec;
4245ae9d61Sreyk 
4345ae9d61Sreyk 	void		*dh;
4445ae9d61Sreyk 	void		*ec;
4545135ebcSreyk 	void		*curve25519;
46*9b50bc25Stobhe 	void		*kemsx;
4745ae9d61Sreyk 
480e1bb3dcStobhe 	int		(*init)(struct dh_group *);
490e1bb3dcStobhe 	int		(*getlen)(struct dh_group *);
500e1bb3dcStobhe 	int		(*secretlen)(struct dh_group *);
510e1bb3dcStobhe 	int		(*exchange)(struct dh_group *, uint8_t *);
52*9b50bc25Stobhe 	int		(*exchange2)(struct dh_group *, struct ibuf **, struct ibuf *);
530e1bb3dcStobhe 	int		(*shared)(struct dh_group *, uint8_t *, uint8_t *);
54*9b50bc25Stobhe 	int		(*shared2)(struct dh_group *, struct ibuf **, struct ibuf *);
5545ae9d61Sreyk };
5645ae9d61Sreyk 
570d5bf58dSreyk #define DH_MAXSZ	1024	/* 8192 bits */
580d5bf58dSreyk 
5945ae9d61Sreyk void		 group_init(void);
600e1bb3dcStobhe void		 group_free(struct dh_group *);
610e1bb3dcStobhe struct dh_group	*group_get(uint32_t);
62e254d6eaSmikeb const struct group_id
63e254d6eaSmikeb 		*group_getid(uint32_t);
6445ae9d61Sreyk 
650e1bb3dcStobhe int		 dh_create_exchange(struct dh_group *, struct ibuf **, struct ibuf *);
660e1bb3dcStobhe int		 dh_create_shared(struct dh_group *, struct ibuf **, struct ibuf *);
6745ae9d61Sreyk 
68a3e464c5Sreyk #endif /* DH_GROUP_H */
69