/* * des.h * * Copyright (C) 1987, 1988, 1989 by the Massachusetts Institute of Technology. * * Export of this software from the United States of America is assumed * to require a specific license from the United States Government. * It is the responsibility of any person or organization contemplating * export to obtain such a license before exporting. * * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and * distribute this software and its documentation for any purpose and * without fee is hereby granted, provided that the above copyright * notice appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, and that * the name of M.I.T. not be used in advertising or publicity pertaining * to distribution of the software without specific, written prior * permission. M.I.T. makes no representations about the suitability of * this software for any purpose. It is provided "as is" without express * or implied warranty. * * Include file for the Data Encryption Standard library. */ /* only do the whole thing once */ #ifndef DES_H #define DES_H #include #if defined(macintosh) || (defined(__MACH__) && defined(__APPLE__)) #include #endif #if TARGET_API_MAC_OSX #include #ifndef DES_INT32 #define DES_INT32 int32_t #endif #ifndef DES_UINT32 #define DES_UINT32 u_int32_t #endif #elif TARGET_API_MAC_OS8 || TARGET_API_MAC_CARBON #include #ifndef DES_INT32 #define DES_INT32 SInt32 #endif #ifndef DES_UINT32 #define DES_UINT32 UInt32 #endif #endif #if !defined(DES_INT32) || !defined(DES_UINT32) #error "Unsupported platform. Need definitions for UInt32 and SInt32." #endif /* There are some declarations in the system-specific header files which can't be done until DES_INT32 is defined. So they are in a macro, which we expand here if defined. */ #ifdef DECL_THAT_NEEDS_DES_INT32 DECL_THAT_NEEDS_DES_INT32 #endif typedef unsigned char des_cblock[8]; /* crypto-block size */ /* Key schedule */ typedef struct des_ks_struct { union { DES_INT32 pad; des_cblock _;} __; } des_key_schedule[16]; #define DES_KEY_SZ (sizeof(des_cblock)) #define DES_ENCRYPT 1 #define DES_DECRYPT 0 #ifndef NCOMPAT #define C_Block des_cblock #define Key_schedule des_key_schedule #define ENCRYPT DES_ENCRYPT #define DECRYPT DES_DECRYPT #define KEY_SZ DES_KEY_SZ #define mit_string_to_key des_string_to_key #define string_to_key des_string_to_key #define read_pw_string des_read_pw_string #define random_key des_random_key #define pcbc_encrypt des_pcbc_encrypt #define key_sched des_key_sched #define cbc_encrypt des_cbc_encrypt #define cbc_cksum des_cbc_cksum #define C_Block_print des_cblock_print #define quad_cksum des_quad_cksum typedef struct des_ks_struct bit_64; #endif #define des_cblock_print(x) des_cblock_print_file(x, stdout) /* Function declarations */ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /* Macintosh CFM-68K magic incantation */ #if PRAGMA_IMPORT #pragma import on #endif #if PRAGMA_STRUCT_ALIGN #pragma options align=mac68k #elif PRAGMA_STRUCT_PACKPUSH #pragma pack(push, 2) #elif PRAGMA_STRUCT_PACK #pragma pack(2) #endif #if TARGET_RT_MAC_CFM # define DESLibraryIsPresent() ((Ptr) (des_cbc_encrypt) != (Ptr) (kUnresolvedCFragSymbolAddress)) #elif TARGET_CPU_68K # pragma d0_pointers on #endif int des_cbc_encrypt(des_cblock *in, des_cblock *out, long length, des_key_schedule schedule, des_cblock ivec, int encrypt); void des_3cbc_encrypt(des_cblock *in, des_cblock *out, long length, des_key_schedule ks1, des_key_schedule ks2, des_key_schedule ks3, des_cblock ivec, int encrypt); unsigned long des_cbc_cksum(des_cblock *in, des_cblock *out, long length, des_key_schedule schedule, des_cblock *ivec); int des_ecb_encrypt(des_cblock *in, des_cblock *out, des_key_schedule schedule, int encrypt); void des_3ecb_encrypt(des_cblock *in, des_cblock *out, des_key_schedule ks1, des_key_schedule ks2, des_key_schedule ks3, int encrypt); void des_fixup_key_parity(register des_cblock key); int des_check_key_parity(register des_cblock key); int des_pcbc_encrypt(des_cblock *in, des_cblock *out, long length, des_key_schedule schedule, des_cblock ivec, int encrypt); int make_key_sched(des_cblock *key, des_key_schedule schedule); int des_key_sched(des_cblock k, des_key_schedule schedule); int des_new_random_key(des_cblock key); void des_init_random_number_generator(des_cblock key); void des_set_random_generator_seed(des_cblock key); void des_set_sequence_number(des_cblock new_sequence_number); void des_generate_random_block(des_cblock block); unsigned long des_quad_cksum(unsigned char *in, unsigned long *out, long length, int out_count, des_cblock *c_seed); int des_random_key(des_cblock *key); int des_read_password(des_cblock *k, char *prompt, int verify); int des_read_pw_string(char *s, int max, char *prompt, int verify); int des_string_to_key(char *str, des_cblock key); void afs_string_to_key(char *str, char *cell, des_cblock key); void des_cblock_print_file(des_cblock *x, FILE *fp); int des_is_weak_key(des_cblock key); char *des_crypt(const char *buf, const char *salt); char *des_fcrypt(const char *buf, const char *salt, char *ret); int des_set_key(des_cblock *key, des_key_schedule schedule); #if !TARGET_RT_MAC_CFM # pragma d0_pointers reset #endif /* Macintosh CFM-68K magic incantation */ #if PRAGMA_STRUCT_ALIGN #pragma options align=reset #elif PRAGMA_STRUCT_PACKPUSH #pragma pack(pop) #elif PRAGMA_STRUCT_PACK #pragma pack() #endif #ifdef PRAGMA_IMPORT_OFF #pragma import off #elif PRAGMA_IMPORT #pragma import reset #endif #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* DES_H */