windows-kfw-sdk-20060921
[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(__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 #       pragma pack(push,2)
55 #endif
56
57 #if UINT_MAX >= 0xFFFFFFFFUL
58 #define DES_INT32 int
59 #define DES_UINT32 unsigned int
60 #else
61 #define DES_INT32 long
62 #define DES_UINT32 unsigned long
63 #endif
64
65 typedef unsigned char des_cblock[8];    /* crypto-block size */
66 /*
67  * Key schedule.
68  *
69  * This used to be
70  *
71  * typedef struct des_ks_struct {
72  *     union { DES_INT32 pad; des_cblock _;} __;
73  * } des_key_schedule[16];
74  *
75  * but it would cause trouble if DES_INT32 were ever more than 4
76  * bytes.  The reason is that all the encryption functions cast it to
77  * (DES_INT32 *), and treat it as if it were DES_INT32[32].  If
78  * 2*sizeof(DES_INT32) is ever more than sizeof(des_cblock), the
79  * caller-allocated des_key_schedule will be overflowed by the key
80  * scheduling functions.  We can't assume that every platform will
81  * have an exact 32-bit int, and nothing should be looking inside a
82  * des_key_schedule anyway.
83  */
84 typedef struct des_ks_struct {  DES_INT32 _[2]; } des_key_schedule[16];
85
86 #if TARGET_OS_MAC
87 #       pragma pack(pop)
88 #endif
89
90 KRBINT_END_DECLS
91
92 #endif /* KRB5INT_DES_TYPES_DEFINED */
93
94 /* only do the whole thing once  */
95 #ifndef DES_DEFS
96 /*
97  * lib/crypto/des/des_int.h defines KRB5INT_CRYPTO_DES_INT temporarily
98  * to avoid including the defintions and declarations below.  The
99  * reason that the crypto library needs to include this file is that
100  * it needs to have its types aligned with krb4's types.
101  */
102 #ifndef KRB5INT_CRYPTO_DES_INT
103 #define DES_DEFS
104
105 #if defined(_WIN32)
106 #ifndef KRB4
107 #define KRB4 1
108 #endif
109 #include <win-mac.h>
110 #endif
111 #include <stdio.h> /* need FILE for des_cblock_print_file */
112
113 KRBINT_BEGIN_DECLS
114
115 #if TARGET_OS_MAC
116 #       pragma pack(push,2)
117 #endif
118
119 /* Windows declarations */
120 #ifndef KRB5_CALLCONV
121 #define KRB5_CALLCONV
122 #define KRB5_CALLCONV_C
123 #endif
124
125 #define DES_KEY_SZ      (sizeof(des_cblock))
126 #define DES_ENCRYPT     1
127 #define DES_DECRYPT     0
128
129 #ifndef NCOMPAT
130 #define C_Block des_cblock
131 #define Key_schedule des_key_schedule
132 #define ENCRYPT DES_ENCRYPT
133 #define DECRYPT DES_DECRYPT
134 #define KEY_SZ DES_KEY_SZ
135 #define string_to_key des_string_to_key
136 #define read_pw_string des_read_pw_string
137 #define random_key des_random_key
138 #define pcbc_encrypt des_pcbc_encrypt
139 #define key_sched des_key_sched
140 #define cbc_encrypt des_cbc_encrypt
141 #define cbc_cksum des_cbc_cksum
142 #define C_Block_print des_cblock_print
143 #define quad_cksum des_quad_cksum
144 typedef struct des_ks_struct bit_64;
145 #endif
146
147 #define des_cblock_print(x) des_cblock_print_file(x, stdout)
148
149 /*
150  * Function Prototypes
151  */
152
153 int KRB5_CALLCONV des_key_sched (C_Block, Key_schedule);
154
155 int KRB5_CALLCONV
156 des_pcbc_encrypt (C_Block *in, C_Block *out, long length,
157                   const des_key_schedule schedule, C_Block *ivec,
158                   int enc);
159
160 unsigned long KRB5_CALLCONV
161 des_quad_cksum (const unsigned char *in, unsigned DES_INT32 *out,
162                 long length, int out_count, C_Block *seed);
163 /*
164  * XXX ABI change: used to return void; also, cns/kfm have signed long
165  * instead of unsigned long length.
166  */
167 unsigned long KRB5_CALLCONV
168 des_cbc_cksum(const des_cblock *, des_cblock *, unsigned long,
169               const des_key_schedule, const des_cblock *);
170 int KRB5_CALLCONV des_string_to_key (const char *, C_Block);
171 void afs_string_to_key(char *, char *, des_cblock);
172
173 /* XXX ABI change: used to return krb5_error_code */
174 int KRB5_CALLCONV des_read_password(des_cblock *, char *, int);
175 int KRB5_CALLCONV des_ecb_encrypt(des_cblock *, des_cblock *,
176                                   const des_key_schedule, int);
177 /* XXX kfm/cns have signed long length */
178 int des_cbc_encrypt(des_cblock *, des_cblock *, unsigned long,
179                     const des_key_schedule, const des_cblock *, int);
180 void des_fixup_key_parity(des_cblock);
181 int des_check_key_parity(des_cblock);
182 int KRB5_CALLCONV des_new_random_key(des_cblock);
183 void des_init_random_number_generator(des_cblock);
184 int des_random_key(des_cblock *);
185 int des_is_weak_key(des_cblock);
186 void des_cblock_print_file(des_cblock *, FILE *fp);
187
188 #if TARGET_OS_MAC
189 #       pragma pack(pop)
190 #endif
191
192 KRBINT_END_DECLS
193
194 #endif /* KRB5INT_CRYPTO_DES_INT */
195 #endif  /* DES_DEFS */