8655e1d8f39dfd44b07fe996a87d7cb5d4234c21
[openafs.git] / src / WINNT / kfw / inc / krb5 / KerberosIV / des.h
1 /*
2  * include/kerberosIV/des.h
3  *
4  * Copyright 1987, 1988, 1994, 2002 by the Massachusetts Institute of
5  * Technology.  All Rights Reserved.
6  *
7  * Export of this software from the United States of America may
8  *   require a specific license from the United States Government.
9  *   It is the responsibility of any person or organization contemplating
10  *   export to obtain such a license before exporting.
11  * 
12  * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
13  * distribute this software and its documentation for any purpose and
14  * without fee is hereby granted, provided that the above copyright
15  * notice appear in all copies and that both that copyright notice and
16  * this permission notice appear in supporting documentation, and that
17  * the name of M.I.T. not be used in advertising or publicity pertaining
18  * to distribution of the software without specific, written prior
19  * permission.  Furthermore if you modify this software you must label
20  * your software as modified software and not distribute it in such a
21  * fashion that it might be confused with the original M.I.T. software.
22  * M.I.T. makes no representations about the suitability of
23  * this software for any purpose.  It is provided "as is" without express
24  * or implied warranty.
25  * 
26  * Include file for the Data Encryption Standard library.
27  */
28
29 #if defined(macintosh) || (defined(__MACH__) && defined(__APPLE__))
30 #       include <TargetConditionals.h>
31 #       if TARGET_RT_MAC_CFM
32 #               error "Use KfM 4.0 SDK headers for CFM compilation."
33 #       endif
34 #endif
35
36 #ifdef __cplusplus
37 #ifndef KRBINT_BEGIN_DECLS
38 #define KRBINT_BEGIN_DECLS      extern "C" {
39 #define KRBINT_END_DECLS        }
40 #endif
41 #else
42 #define KRBINT_BEGIN_DECLS
43 #define KRBINT_END_DECLS
44 #endif
45
46 #ifndef KRB5INT_DES_TYPES_DEFINED
47 #define KRB5INT_DES_TYPES_DEFINED
48
49 #include <limits.h>
50
51 KRBINT_BEGIN_DECLS
52
53 #if TARGET_OS_MAC
54 #       if defined(__MWERKS__)
55 #               pragma import on
56 #       endif
57 #       pragma options align=mac68k
58 #endif
59
60 #if UINT_MAX >= 0xFFFFFFFFUL
61 #define DES_INT32 int
62 #define DES_UINT32 unsigned int
63 #else
64 #define DES_INT32 long
65 #define DES_UINT32 unsigned long
66 #endif
67
68 typedef unsigned char des_cblock[8];    /* crypto-block size */
69 /*
70  * Key schedule.
71  *
72  * This used to be
73  *
74  * typedef struct des_ks_struct {
75  *     union { DES_INT32 pad; des_cblock _;} __;
76  * } des_key_schedule[16];
77  *
78  * but it would cause trouble if DES_INT32 were ever more than 4
79  * bytes.  The reason is that all the encryption functions cast it to
80  * (DES_INT32 *), and treat it as if it were DES_INT32[32].  If
81  * 2*sizeof(DES_INT32) is ever more than sizeof(des_cblock), the
82  * caller-allocated des_key_schedule will be overflowed by the key
83  * scheduling functions.  We can't assume that every platform will
84  * have an exact 32-bit int, and nothing should be looking inside a
85  * des_key_schedule anyway.
86  */
87 typedef struct des_ks_struct {  DES_INT32 _[2]; } des_key_schedule[16];
88
89 #if TARGET_OS_MAC
90 #       if defined(__MWERKS__)
91 #               pragma enumsalwaysint reset
92 #               pragma import reset
93 #       endif
94 #       pragma options align=reset
95 #endif
96
97 KRBINT_END_DECLS
98
99 #endif /* KRB5INT_DES_TYPES_DEFINED */
100
101 /* only do the whole thing once  */
102 #ifndef DES_DEFS
103 /*
104  * lib/crypto/des/des_int.h defines KRB5INT_CRYPTO_DES_INT temporarily
105  * to avoid including the defintions and declarations below.  The
106  * reason that the crypto library needs to include this file is that
107  * it needs to have its types aligned with krb4's types.
108  */
109 #ifndef KRB5INT_CRYPTO_DES_INT
110 #define DES_DEFS
111
112 #if defined(_WIN32)
113 #ifndef KRB4
114 #define KRB4 1
115 #endif
116 #include <win-mac.h>
117 #endif
118 #include <stdio.h> /* need FILE for des_cblock_print_file */
119
120 KRBINT_BEGIN_DECLS
121
122 #if TARGET_OS_MAC
123 #       if defined(__MWERKS__)
124 #               pragma import on
125 #               pragma enumsalwaysint on
126 #       endif
127 #       pragma options align=mac68k
128 #endif
129
130 /* Windows declarations */
131 #ifndef KRB5_CALLCONV
132 #define KRB5_CALLCONV
133 #define KRB5_CALLCONV_C
134 #endif
135
136 #define DES_KEY_SZ      (sizeof(des_cblock))
137 #define DES_ENCRYPT     1
138 #define DES_DECRYPT     0
139
140 #ifndef NCOMPAT
141 #define C_Block des_cblock
142 #define Key_schedule des_key_schedule
143 #define ENCRYPT DES_ENCRYPT
144 #define DECRYPT DES_DECRYPT
145 #define KEY_SZ DES_KEY_SZ
146 #define string_to_key des_string_to_key
147 #define read_pw_string des_read_pw_string
148 #define random_key des_random_key
149 #define pcbc_encrypt des_pcbc_encrypt
150 #define key_sched des_key_sched
151 #define cbc_encrypt des_cbc_encrypt
152 #define cbc_cksum des_cbc_cksum
153 #define C_Block_print des_cblock_print
154 #define quad_cksum des_quad_cksum
155 typedef struct des_ks_struct bit_64;
156 #endif
157
158 #define des_cblock_print(x) des_cblock_print_file(x, stdout)
159
160 /*
161  * Function Prototypes
162  */
163
164 int KRB5_CALLCONV des_key_sched (C_Block, Key_schedule);
165
166 int KRB5_CALLCONV
167 des_pcbc_encrypt (C_Block *in, C_Block *out, long length,
168                   const des_key_schedule schedule, C_Block *ivec,
169                   int enc);
170
171 unsigned long KRB5_CALLCONV
172 des_quad_cksum (const unsigned char *in, unsigned DES_INT32 *out,
173                 long length, int out_count, C_Block *seed);
174 /*
175  * XXX ABI change: used to return void; also, cns/kfm have signed long
176  * instead of unsigned long length.
177  */
178 unsigned long KRB5_CALLCONV
179 des_cbc_cksum(const des_cblock *, des_cblock *, unsigned long,
180               const des_key_schedule, const des_cblock *);
181 int KRB5_CALLCONV des_string_to_key (const char *, C_Block);
182 void afs_string_to_key(char *, char *, des_cblock);
183
184 /* XXX ABI change: used to return krb5_error_code */
185 int KRB5_CALLCONV des_read_password(des_cblock *, char *, int);
186 int KRB5_CALLCONV des_ecb_encrypt(des_cblock *, des_cblock *,
187                                   const des_key_schedule, int);
188 /* XXX kfm/cns have signed long length */
189 int des_cbc_encrypt(des_cblock *, des_cblock *, unsigned long,
190                     const des_key_schedule, const des_cblock *, int);
191 void des_fixup_key_parity(des_cblock);
192 int des_check_key_parity(des_cblock);
193 int KRB5_CALLCONV des_new_random_key(des_cblock);
194 void des_init_random_number_generator(des_cblock);
195 int des_random_key(des_cblock *);
196 int des_is_weak_key(des_cblock);
197 void des_cblock_print_file(des_cblock *, FILE *fp);
198
199 #if TARGET_OS_MAC
200 #       if defined(__MWERKS__)
201 #               pragma import reset
202 #       endif
203 #       pragma options align=reset
204 #endif
205
206 KRBINT_END_DECLS
207
208 #endif /* KRB5INT_CRYPTO_DES_INT */
209 #endif  /* DES_DEFS */