1 /* crypto/des/des.h */ 2 /* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au) 3 * All rights reserved. 4 * 5 * This package is an SSL implementation written 6 * by Eric Young (eay@mincom.oz.au). 7 * The implementation was written so as to conform with Netscapes SSL. 8 * 9 * This library is free for commercial and non-commercial use as long as 10 * the following conditions are aheared to. The following conditions 11 * apply to all code found in this distribution, be it the RC4, RSA, 12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation 13 * included with this distribution is covered by the same copyright terms 14 * except that the holder is Tim Hudson (tjh@mincom.oz.au). 15 * 16 * Copyright remains Eric Young's, and as such any Copyright notices in 17 * the code are not to be removed. 18 * If this package is used in a product, Eric Young should be given attribution 19 * as the author of the parts of the library used. 20 * This can be in the form of a textual message at program startup or 21 * in documentation (online or textual) provided with the package. 22 * 23 * Redistribution and use in source and binary forms, with or without 24 * modification, are permitted provided that the following conditions 25 * are met: 26 * 1. Redistributions of source code must retain the copyright 27 * notice, this list of conditions and the following disclaimer. 28 * 2. Redistributions in binary form must reproduce the above copyright 29 * notice, this list of conditions and the following disclaimer in the 30 * documentation and/or other materials provided with the distribution. 31 * 3. All advertising materials mentioning features or use of this software 32 * must display the following acknowledgement: 33 * "This product includes cryptographic software written by 34 * Eric Young (eay@mincom.oz.au)" 35 * The word 'cryptographic' can be left out if the rouines from the library 36 * being used are not cryptographic related :-). 37 * 4. If you include any Windows specific code (or a derivative thereof) from 38 * the apps directory (application code) you must include an acknowledgement: 39 * "This product includes software written by Tim Hudson (tjh@mincom.oz.au)" 40 * 41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 51 * SUCH DAMAGE. 52 * 53 * The licence and distribution terms for any publically available version or 54 * derivative of this code cannot be changed. i.e. this code cannot simply be 55 * copied and put under another distribution licence 56 * [including the GNU Public Licence.] 57 */ 58 59 #ifndef HEADER_DES_H 60 #define HEADER_DES_H 61 62 #ifdef __cplusplus 63 extern "C" { 64 #endif 65 66 #include <stdio.h> 67 68 #if (defined(__MWERKS__)&&defined(__MC68K__)&&(!defined(DESLIB_CFM68K_NO_IMPORTS))) 69 #pragma import on 70 #define UNDO_CFM68K_IMPORT 71 #endif 72 73 #ifndef DES_LIB_FUNCTION 74 #if defined(__BORLANDC__) 75 #define DES_LIB_FUNCTION /* not-ready-definition-yet */ 76 #elif defined(_MSC_VER) 77 #define DES_LIB_FUNCTION /* not-ready-definition-yet2 */ 78 #else 79 #define DES_LIB_FUNCTION 80 #endif 81 #endif 82 83 /* If this is set to 'unsigned int' on a DEC Alpha, this gives about a 84 * %20 speed up (longs are 8 bytes, int's are 4). */ 85 #ifndef DES_LONG 86 #if defined(__alpha) 87 #define DES_LONG unsigned int 88 #else /* Not a 64 bit machine */ 89 #define DES_LONG unsigned long 90 #endif 91 #endif 92 93 typedef unsigned char des_cblock[8]; 94 typedef struct des_ks_struct 95 { 96 union { 97 des_cblock _; 98 /* make sure things are correct size on machines with 99 * 8 byte longs */ 100 DES_LONG pad[2]; 101 } ks; 102 #undef _ 103 #define _ ks._ 104 } des_key_schedule[16]; 105 106 #define DES_KEY_SZ (sizeof(des_cblock)) 107 #define DES_SCHEDULE_SZ (sizeof(des_key_schedule)) 108 109 #define DES_ENCRYPT 1 110 #define DES_DECRYPT 0 111 112 #define DES_CBC_MODE 0 113 #define DES_PCBC_MODE 1 114 115 #define des_ecb2_encrypt(i,o,k1,k2,e) \ 116 des_ecb3_encrypt((i),(o),(k1),(k2),(k1),(e)) 117 118 #define des_ede2_cbc_encrypt(i,o,l,k1,k2,iv,e) \ 119 des_ede3_cbc_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(e)) 120 121 #define des_ede2_cfb64_encrypt(i,o,l,k1,k2,iv,n,e) \ 122 des_ede3_cfb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n),(e)) 123 124 #define des_ede2_ofb64_encrypt(i,o,l,k1,k2,iv,n) \ 125 des_ede3_ofb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n)) 126 127 #define C_Block des_cblock 128 #define Key_schedule des_key_schedule 129 #ifdef KERBEROS 130 #define ENCRYPT DES_ENCRYPT 131 #define DECRYPT DES_DECRYPT 132 #endif 133 #define KEY_SZ DES_KEY_SZ 134 #define string_to_key des_string_to_key 135 #define read_pw_string des_read_pw_string 136 #define random_key des_random_key 137 #define pcbc_encrypt des_pcbc_encrypt 138 #define set_key des_set_key 139 #define key_sched des_key_sched 140 #define ecb_encrypt des_ecb_encrypt 141 #define cbc_encrypt des_cbc_encrypt 142 #define ncbc_encrypt des_ncbc_encrypt 143 #define xcbc_encrypt des_xcbc_encrypt 144 #define cbc_cksum des_cbc_cksum 145 #define quad_cksum des_quad_cksum 146 147 /* For compatibility with the MIT lib - eay 20/05/92 */ 148 typedef des_key_schedule bit_64; 149 #define des_fixup_key_parity des_set_odd_parity 150 #define des_check_key_parity check_parity 151 152 extern int des_check_key; /* defaults to false */ 153 extern int des_rw_mode; /* defaults to DES_PCBC_MODE */ 154 155 #ifdef cplusplus 156 extern "C" { 157 #endif 158 159 /* The next line is used to disable full ANSI prototypes, if your 160 * compiler has problems with the prototypes, make sure this line always 161 * evaluates to true :-) */ 162 #if defined(MSDOS) || defined(__STDC__) 163 #undef NOPROTO 164 #endif 165 #ifndef NOPROTO 166 char *DES_LIB_FUNCTION des_options(void); 167 void DES_LIB_FUNCTION des_ecb3_encrypt(des_cblock *input,des_cblock *output, 168 des_key_schedule ks1,des_key_schedule ks2, 169 des_key_schedule ks3, int enc); 170 DES_LONG DES_LIB_FUNCTION des_cbc_cksum(des_cblock *input,des_cblock *output, 171 long length,des_key_schedule schedule,des_cblock *ivec); 172 void DES_LIB_FUNCTION des_cbc_encrypt(des_cblock *input,des_cblock *output,long length, 173 des_key_schedule schedule,des_cblock *ivec,int enc); 174 void DES_LIB_FUNCTION des_ncbc_encrypt(des_cblock *input,des_cblock *output,long length, 175 des_key_schedule schedule,des_cblock *ivec,int enc); 176 void DES_LIB_FUNCTION des_xcbc_encrypt(des_cblock *input,des_cblock *output,long length, 177 des_key_schedule schedule,des_cblock *ivec, 178 des_cblock *inw,des_cblock *outw,int enc); 179 void DES_LIB_FUNCTION des_3cbc_encrypt(des_cblock *input,des_cblock *output,long length, 180 des_key_schedule sk1,des_key_schedule sk2, 181 des_cblock *ivec1,des_cblock *ivec2,int enc); 182 void DES_LIB_FUNCTION des_cfb_encrypt(unsigned char *in,unsigned char *out,int numbits, 183 long length,des_key_schedule schedule,des_cblock *ivec,int enc); 184 void DES_LIB_FUNCTION des_ecb_encrypt(des_cblock *input,des_cblock *output, 185 des_key_schedule ks,int enc); 186 void DES_LIB_FUNCTION des_encrypt(DES_LONG *data,des_key_schedule ks, int enc); 187 void DES_LIB_FUNCTION des_encrypt2(DES_LONG *data,des_key_schedule ks, int enc); 188 void DES_LIB_FUNCTION des_encrypt3(DES_LONG *data, des_key_schedule ks1, 189 des_key_schedule ks2, des_key_schedule ks3); 190 void DES_LIB_FUNCTION des_decrypt3(DES_LONG *data, des_key_schedule ks1, 191 des_key_schedule ks2, des_key_schedule ks3); 192 void DES_LIB_FUNCTION des_ede3_cbc_encrypt(des_cblock *input, des_cblock *output, 193 long length, des_key_schedule ks1, des_key_schedule ks2, 194 des_key_schedule ks3, des_cblock *ivec, int enc); 195 void DES_LIB_FUNCTION des_ede3_cfb64_encrypt(unsigned char *in, unsigned char *out, 196 long length, des_key_schedule ks1, des_key_schedule ks2, 197 des_key_schedule ks3, des_cblock *ivec, int *num, int encrypt); 198 void DES_LIB_FUNCTION des_ede3_ofb64_encrypt(unsigned char *in, unsigned char *out, 199 long length, des_key_schedule ks1, des_key_schedule ks2, 200 des_key_schedule ks3, des_cblock *ivec, int *num); 201 202 int DES_LIB_FUNCTION des_enc_read(int fd,char *buf,int len,des_key_schedule sched, 203 des_cblock *iv); 204 int DES_LIB_FUNCTION des_enc_write(int fd,char *buf,int len,des_key_schedule sched, 205 des_cblock *iv); 206 char *DES_LIB_FUNCTION des_fcrypt(const char *buf,const char *salt, char *ret); 207 #ifdef PERL5 208 char *des_crypt(const char *buf,const char *salt); 209 #else 210 /* some stupid compilers complain because I have declared char instead 211 * of const char */ 212 #ifdef HEADER_DES_LOCL_H 213 char *DES_LIB_FUNCTION crypt(const char *buf,const char *salt); 214 #else 215 char *crypt(); 216 #endif 217 #endif 218 void DES_LIB_FUNCTION des_ofb_encrypt(unsigned char *in,unsigned char *out, 219 int numbits,long length,des_key_schedule schedule,des_cblock *ivec); 220 void DES_LIB_FUNCTION des_pcbc_encrypt(des_cblock *input,des_cblock *output,long length, 221 des_key_schedule schedule,des_cblock *ivec,int enc); 222 DES_LONG DES_LIB_FUNCTION des_quad_cksum(des_cblock *input,des_cblock *output, 223 long length,int out_count,des_cblock *seed); 224 void DES_LIB_FUNCTION des_random_seed(des_cblock key); 225 void DES_LIB_FUNCTION des_random_key(des_cblock ret); 226 int DES_LIB_FUNCTION des_read_password(des_cblock *key,char *prompt,int verify); 227 int DES_LIB_FUNCTION des_read_2passwords(des_cblock *key1,des_cblock *key2, 228 char *prompt,int verify); 229 int DES_LIB_FUNCTION des_read_pw_string(char *buf,int length,char *prompt,int verify); 230 void DES_LIB_FUNCTION des_set_odd_parity(des_cblock *key); 231 int DES_LIB_FUNCTION des_is_weak_key(des_cblock *key); 232 int DES_LIB_FUNCTION des_set_key(des_cblock *key,des_key_schedule schedule); 233 int DES_LIB_FUNCTION des_key_sched(des_cblock *key,des_key_schedule schedule); 234 void DES_LIB_FUNCTION des_string_to_key(char *str,des_cblock *key); 235 void DES_LIB_FUNCTION des_string_to_2keys(char *str,des_cblock *key1,des_cblock *key2); 236 void DES_LIB_FUNCTION des_cfb64_encrypt(unsigned char *in, unsigned char *out, long length, 237 des_key_schedule schedule, des_cblock *ivec, int *num, int enc); 238 void DES_LIB_FUNCTION des_ofb64_encrypt(unsigned char *in, unsigned char *out, long length, 239 des_key_schedule schedule, des_cblock *ivec, int *num); 240 241 /* Extra functions from Mark Murray <mark@grondar.za> */ 242 void DES_LIB_FUNCTION des_cblock_print_file(des_cblock *cb, FILE *fp); 243 /* The following functions are not in the normal unix build or the 244 * SSLeay build. When using the SSLeay build, use RAND_seed() 245 * and RAND_bytes() instead. */ 246 int DES_LIB_FUNCTION des_new_random_key(des_cblock *key); 247 void DES_LIB_FUNCTION des_init_random_number_generator(des_cblock *key); 248 void DES_LIB_FUNCTION des_set_random_generator_seed(des_cblock *key); 249 void DES_LIB_FUNCTION des_set_sequence_number(des_cblock new_sequence_number); 250 void DES_LIB_FUNCTION des_generate_random_block(des_cblock *block); 251 void DES_LIB_FUNCTION des_rand_data(unsigned char *data, int size); 252 253 #else 254 255 char *des_options(); 256 void des_ecb3_encrypt(); 257 DES_LONG des_cbc_cksum(); 258 void des_cbc_encrypt(); 259 void des_ncbc_encrypt(); 260 void des_xcbc_encrypt(); 261 void des_3cbc_encrypt(); 262 void des_cfb_encrypt(); 263 void des_ede3_cfb64_encrypt(); 264 void des_ede3_ofb64_encrypt(); 265 void des_ecb_encrypt(); 266 void des_encrypt(); 267 void des_encrypt2(); 268 void des_encrypt3(); 269 void des_decrypt3(); 270 void des_ede3_cbc_encrypt(); 271 int des_enc_read(); 272 int des_enc_write(); 273 char *des_fcrypt(); 274 #ifdef PERL5 275 char *des_crypt(); 276 #else 277 char *crypt(); 278 #endif 279 void des_ofb_encrypt(); 280 void des_pcbc_encrypt(); 281 DES_LONG des_quad_cksum(); 282 void des_random_seed(); 283 void des_random_key(); 284 int des_read_password(); 285 int des_read_2passwords(); 286 int des_read_pw_string(); 287 void des_set_odd_parity(); 288 int des_is_weak_key(); 289 int des_set_key(); 290 int des_key_sched(); 291 void des_string_to_key(); 292 void des_string_to_2keys(); 293 void des_cfb64_encrypt(); 294 void des_ofb64_encrypt(); 295 296 /* Extra functions from Mark Murray <mark@grondar.za> */ 297 void des_cblock_print_file(); 298 /* The following functions are not in the normal unix build or the 299 * SSLeay build. When using the SSLeay build, use RAND_seed() 300 * and RAND_bytes() instead. */ 301 int des_new_random_key(); 302 void des_init_random_number_generator(); 303 void des_set_random_generator_seed(); 304 void des_set_sequence_number(); 305 void des_generate_random_block(); 306 void des_rand_data(); 307 308 #endif 309 310 #ifdef UNDO_CFM68K_IMPORT 311 #pragma import reset 312 #endif 313 #ifdef __cplusplus 314 } 315 #endif 316 317 #endif 318