1/*	$NetBSD: dst_internal.h,v 1.2 2012/11/16 02:11:05 joerg Exp $	*/
2
3#ifndef DST_INTERNAL_H
4#define DST_INTERNAL_H
5
6/*
7 * Portions Copyright (c) 1995-1998 by Trusted Information Systems, Inc.
8 *
9 * Permission to use, copy modify, and distribute this software for any
10 * purpose with or without fee is hereby granted, provided that the above
11 * copyright notice and this permission notice appear in all copies.
12 *
13 * THE SOFTWARE IS PROVIDED "AS IS" AND TRUSTED INFORMATION SYSTEMS
14 * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL
16 * TRUSTED INFORMATION SYSTEMS BE LIABLE FOR ANY SPECIAL, DIRECT,
17 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
18 * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
19 * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
20 * WITH THE USE OR PERFORMANCE OF THE SOFTWARE.
21 */
22#include <limits.h>
23#include <sys/param.h>
24#if (!defined(BSD)) || (BSD < 199306)
25# include <sys/bitypes.h>
26#else
27# include <sys/types.h>
28#endif
29
30#ifndef PATH_MAX
31# ifdef POSIX_PATH_MAX
32#  define PATH_MAX POSIX_PATH_MAX
33# else
34#  define PATH_MAX 255 /*%< this is the value of POSIX_PATH_MAX */
35# endif
36#endif
37
38typedef struct dst_key {
39	char	*dk_key_name;   /*%< name of the key */
40	int	dk_key_size;    /*%< this is the size of the key in bits */
41	int	dk_proto;       /*%< what protocols this key can be used for */
42	int	dk_alg;         /*%< algorithm number from key record */
43	u_int32_t dk_flags;     /*%< and the flags of the public key */
44	u_int16_t dk_id;        /*%< identifier of the key */
45	void	*dk_KEY_struct; /*%< pointer to key in crypto pkg fmt */
46	struct dst_func *dk_func; /*%< point to cryptto pgk specific function table */
47} DST_KEY;
48#define HAS_DST_KEY
49
50#include <isc/dst.h>
51/*
52 * define what crypto systems are supported for RSA,
53 * BSAFE is prefered over RSAREF; only one can be set at any time
54 */
55#if defined(BSAFE) && defined(RSAREF)
56# error "Cannot have both BSAFE and RSAREF defined"
57#endif
58
59/* Declare dst_lib specific constants */
60#define KEY_FILE_FORMAT "1.2"
61
62/* suffixes for key file names */
63#define PRIVATE_KEY		"private"
64#define PUBLIC_KEY		"key"
65
66/* error handling */
67#ifdef DEBUG
68#define EREPORT(str)		printf str
69#else
70#define EREPORT(str)		do {} while (/*CONSTCOND*/0)
71#endif
72
73/* use our own special macro to FRRE memory */
74
75#ifndef SAFE_FREE2
76#define SAFE_FREE2(a, s) do { \
77	if ((a) != NULL) { \
78		memset((a), 0, (s)); \
79		free((a)); \
80		(a) = NULL; \
81	} \
82} while (/*CONSTCOND*/0)
83#endif
84
85#ifndef SAFE_FREE
86#define SAFE_FREE(a) SAFE_FREE2((a), sizeof(*(a)))
87#endif
88
89typedef struct dst_func {
90	int (*sign)(const int mode, DST_KEY *key, void **context,
91		     const u_int8_t *data, const int len,
92		     u_int8_t *signature, const int sig_len);
93	int (*verify)(const int mode, DST_KEY *key, void **context,
94		       const u_int8_t *data, const int len,
95		       const u_int8_t *signature, const int sig_len);
96	int (*compare)(const DST_KEY *key1, const DST_KEY *key2);
97	int (*generate)(DST_KEY *key, int parms);
98	void *(*destroy)(void *key);
99	/* conversion functions */
100	int (*to_dns_key)(const DST_KEY *key, u_int8_t *out,
101			   const int out_len);
102	int (*from_dns_key)(DST_KEY *key, const u_int8_t *str,
103			     const int str_len);
104	int (*to_file_fmt)(const DST_KEY *key, char *out,
105			    const int out_len);
106	int (*from_file_fmt)(DST_KEY *key, const char *out,
107			      const int out_len);
108
109} dst_func;
110
111extern dst_func *dst_t_func[DST_MAX_ALGS];
112extern const char *key_file_fmt_str;
113extern const char *dst_path;
114
115#ifndef DST_HASH_SIZE
116#define DST_HASH_SIZE 20	/*%< RIPEMD160 and SHA-1 are 20 bytes MD5 is 16 */
117#endif
118
119int dst_bsafe_init(void);
120
121int dst_rsaref_init(void);
122
123int dst_hmac_md5_init(void);
124
125int dst_cylink_init(void);
126
127int dst_eay_dss_init(void);
128
129/* from higher level support routines */
130int       dst_s_calculate_bits( const u_int8_t *str, const int max_bits);
131int       dst_s_verify_str( const char **buf, const char *str);
132
133
134/* conversion between dns names and key file names */
135size_t    dst_s_filename_length( const char *name, const char *suffix);
136int       dst_s_build_filename(  char *filename, const char *name,
137			         u_int16_t id, int alg, const char *suffix,
138			         size_t filename_length);
139
140FILE      *dst_s_fopen (const char *filename, const char *mode, int perm);
141
142/*%
143 * read and write network byte order into u_int?_t
144 *  all of these should be retired
145 */
146u_int16_t dst_s_get_int16( const u_int8_t *buf);
147void      dst_s_put_int16( u_int8_t *buf, const u_int16_t val);
148
149u_int32_t dst_s_get_int32( const u_int8_t *buf);
150void      dst_s_put_int32( u_int8_t *buf, const u_int32_t val);
151
152#ifdef DUMP
153# undef DUMP
154# define DUMP(a,b,c,d) dst_s_dump(a,b,c,d)
155#else
156# define DUMP(a,b,c,d)
157#endif
158void
159dst_s_dump(const int mode, const u_char *data, const int size,
160            const char *msg);
161
162#define  KEY_FILE_FMT_STR "Private-key-format: v%s\nAlgorithm: %d (%s)\n"
163
164
165#endif /* DST_INTERNAL_H */
166/*! \file */
167