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