1e71b7053SJung-uk Kim /* 2*b077aed3SPierre Pronchery * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. 3e71b7053SJung-uk Kim * 4*b077aed3SPierre Pronchery * Licensed under the Apache License 2.0 (the "License"). You may not use 5e71b7053SJung-uk Kim * this file except in compliance with the License. You can obtain a copy 6e71b7053SJung-uk Kim * in the file LICENSE in the source distribution or at 7e71b7053SJung-uk Kim * https://www.openssl.org/source/license.html 8e71b7053SJung-uk Kim */ 9e71b7053SJung-uk Kim 10*b077aed3SPierre Pronchery #ifndef OPENSSL_DES_H 11*b077aed3SPierre Pronchery # define OPENSSL_DES_H 12*b077aed3SPierre Pronchery # pragma once 13*b077aed3SPierre Pronchery 14*b077aed3SPierre Pronchery # include <openssl/macros.h> 15*b077aed3SPierre Pronchery # ifndef OPENSSL_NO_DEPRECATED_3_0 16e71b7053SJung-uk Kim # define HEADER_DES_H 17*b077aed3SPierre Pronchery # endif 18e71b7053SJung-uk Kim 19e71b7053SJung-uk Kim # include <openssl/opensslconf.h> 20e71b7053SJung-uk Kim 21e71b7053SJung-uk Kim # ifndef OPENSSL_NO_DES 22e71b7053SJung-uk Kim # ifdef __cplusplus 23e71b7053SJung-uk Kim extern "C" { 24e71b7053SJung-uk Kim # endif 25e71b7053SJung-uk Kim # include <openssl/e_os2.h> 26e71b7053SJung-uk Kim 27*b077aed3SPierre Pronchery # ifndef OPENSSL_NO_DEPRECATED_3_0 28e71b7053SJung-uk Kim typedef unsigned int DES_LONG; 29e71b7053SJung-uk Kim 30e71b7053SJung-uk Kim # ifdef OPENSSL_BUILD_SHLIBCRYPTO 31e71b7053SJung-uk Kim # undef OPENSSL_EXTERN 32e71b7053SJung-uk Kim # define OPENSSL_EXTERN OPENSSL_EXPORT 33e71b7053SJung-uk Kim # endif 34e71b7053SJung-uk Kim 35e71b7053SJung-uk Kim typedef unsigned char DES_cblock[8]; 36e71b7053SJung-uk Kim typedef /* const */ unsigned char const_DES_cblock[8]; 37e71b7053SJung-uk Kim /* 38e71b7053SJung-uk Kim * With "const", gcc 2.8.1 on Solaris thinks that DES_cblock * and 39e71b7053SJung-uk Kim * const_DES_cblock * are incompatible pointer types. 40e71b7053SJung-uk Kim */ 41e71b7053SJung-uk Kim 42e71b7053SJung-uk Kim typedef struct DES_ks { 43e71b7053SJung-uk Kim union { 44e71b7053SJung-uk Kim DES_cblock cblock; 45e71b7053SJung-uk Kim /* 46e71b7053SJung-uk Kim * make sure things are correct size on machines with 8 byte longs 47e71b7053SJung-uk Kim */ 48e71b7053SJung-uk Kim DES_LONG deslong[2]; 49e71b7053SJung-uk Kim } ks[16]; 50e71b7053SJung-uk Kim } DES_key_schedule; 51e71b7053SJung-uk Kim 52e71b7053SJung-uk Kim # define DES_KEY_SZ (sizeof(DES_cblock)) 53e71b7053SJung-uk Kim # define DES_SCHEDULE_SZ (sizeof(DES_key_schedule)) 54e71b7053SJung-uk Kim 55e71b7053SJung-uk Kim # define DES_ENCRYPT 1 56e71b7053SJung-uk Kim # define DES_DECRYPT 0 57e71b7053SJung-uk Kim 58e71b7053SJung-uk Kim # define DES_CBC_MODE 0 59e71b7053SJung-uk Kim # define DES_PCBC_MODE 1 60e71b7053SJung-uk Kim 61e71b7053SJung-uk Kim # define DES_ecb2_encrypt(i,o,k1,k2,e) \ 62e71b7053SJung-uk Kim DES_ecb3_encrypt((i),(o),(k1),(k2),(k1),(e)) 63e71b7053SJung-uk Kim 64e71b7053SJung-uk Kim # define DES_ede2_cbc_encrypt(i,o,l,k1,k2,iv,e) \ 65e71b7053SJung-uk Kim DES_ede3_cbc_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(e)) 66e71b7053SJung-uk Kim 67e71b7053SJung-uk Kim # define DES_ede2_cfb64_encrypt(i,o,l,k1,k2,iv,n,e) \ 68e71b7053SJung-uk Kim DES_ede3_cfb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n),(e)) 69e71b7053SJung-uk Kim 70e71b7053SJung-uk Kim # define DES_ede2_ofb64_encrypt(i,o,l,k1,k2,iv,n) \ 71e71b7053SJung-uk Kim DES_ede3_ofb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n)) 72e71b7053SJung-uk Kim 73*b077aed3SPierre Pronchery # define DES_fixup_key_parity DES_set_odd_parity 74*b077aed3SPierre Pronchery # endif 75*b077aed3SPierre Pronchery # ifndef OPENSSL_NO_DEPRECATED_3_0 76*b077aed3SPierre Pronchery OSSL_DEPRECATEDIN_3_0 const char *DES_options(void); 77*b077aed3SPierre Pronchery OSSL_DEPRECATEDIN_3_0 78e71b7053SJung-uk Kim void DES_ecb3_encrypt(const_DES_cblock *input, DES_cblock *output, 79e71b7053SJung-uk Kim DES_key_schedule *ks1, DES_key_schedule *ks2, 80e71b7053SJung-uk Kim DES_key_schedule *ks3, int enc); 81*b077aed3SPierre Pronchery OSSL_DEPRECATEDIN_3_0 82e71b7053SJung-uk Kim DES_LONG DES_cbc_cksum(const unsigned char *input, DES_cblock *output, 83e71b7053SJung-uk Kim long length, DES_key_schedule *schedule, 84e71b7053SJung-uk Kim const_DES_cblock *ivec); 85*b077aed3SPierre Pronchery # endif 86e71b7053SJung-uk Kim /* DES_cbc_encrypt does not update the IV! Use DES_ncbc_encrypt instead. */ 87*b077aed3SPierre Pronchery # ifndef OPENSSL_NO_DEPRECATED_3_0 88*b077aed3SPierre Pronchery OSSL_DEPRECATEDIN_3_0 89e71b7053SJung-uk Kim void DES_cbc_encrypt(const unsigned char *input, unsigned char *output, 90*b077aed3SPierre Pronchery long length, DES_key_schedule *schedule, DES_cblock *ivec, 91*b077aed3SPierre Pronchery int enc); 92*b077aed3SPierre Pronchery OSSL_DEPRECATEDIN_3_0 93e71b7053SJung-uk Kim void DES_ncbc_encrypt(const unsigned char *input, unsigned char *output, 94*b077aed3SPierre Pronchery long length, DES_key_schedule *schedule, DES_cblock *ivec, 95*b077aed3SPierre Pronchery int enc); 96*b077aed3SPierre Pronchery OSSL_DEPRECATEDIN_3_0 97e71b7053SJung-uk Kim void DES_xcbc_encrypt(const unsigned char *input, unsigned char *output, 98*b077aed3SPierre Pronchery long length, DES_key_schedule *schedule, DES_cblock *ivec, 99*b077aed3SPierre Pronchery const_DES_cblock *inw, const_DES_cblock *outw, int enc); 100*b077aed3SPierre Pronchery OSSL_DEPRECATEDIN_3_0 101e71b7053SJung-uk Kim void DES_cfb_encrypt(const unsigned char *in, unsigned char *out, int numbits, 102*b077aed3SPierre Pronchery long length, DES_key_schedule *schedule, DES_cblock *ivec, 103*b077aed3SPierre Pronchery int enc); 104*b077aed3SPierre Pronchery OSSL_DEPRECATEDIN_3_0 105e71b7053SJung-uk Kim void DES_ecb_encrypt(const_DES_cblock *input, DES_cblock *output, 106e71b7053SJung-uk Kim DES_key_schedule *ks, int enc); 107*b077aed3SPierre Pronchery # endif 108e71b7053SJung-uk Kim 109e71b7053SJung-uk Kim /* 110e71b7053SJung-uk Kim * This is the DES encryption function that gets called by just about every 111e71b7053SJung-uk Kim * other DES routine in the library. You should not use this function except 112e71b7053SJung-uk Kim * to implement 'modes' of DES. I say this because the functions that call 113e71b7053SJung-uk Kim * this routine do the conversion from 'char *' to long, and this needs to be 114e71b7053SJung-uk Kim * done to make sure 'non-aligned' memory access do not occur. The 115e71b7053SJung-uk Kim * characters are loaded 'little endian'. Data is a pointer to 2 unsigned 116e71b7053SJung-uk Kim * long's and ks is the DES_key_schedule to use. enc, is non zero specifies 117e71b7053SJung-uk Kim * encryption, zero if decryption. 118e71b7053SJung-uk Kim */ 119*b077aed3SPierre Pronchery # ifndef OPENSSL_NO_DEPRECATED_3_0 120*b077aed3SPierre Pronchery OSSL_DEPRECATEDIN_3_0 121e71b7053SJung-uk Kim void DES_encrypt1(DES_LONG *data, DES_key_schedule *ks, int enc); 122*b077aed3SPierre Pronchery # endif 123e71b7053SJung-uk Kim 124e71b7053SJung-uk Kim /* 125e71b7053SJung-uk Kim * This functions is the same as DES_encrypt1() except that the DES initial 126e71b7053SJung-uk Kim * permutation (IP) and final permutation (FP) have been left out. As for 127e71b7053SJung-uk Kim * DES_encrypt1(), you should not use this function. It is used by the 128e71b7053SJung-uk Kim * routines in the library that implement triple DES. IP() DES_encrypt2() 129e71b7053SJung-uk Kim * DES_encrypt2() DES_encrypt2() FP() is the same as DES_encrypt1() 130e71b7053SJung-uk Kim * DES_encrypt1() DES_encrypt1() except faster :-). 131e71b7053SJung-uk Kim */ 132*b077aed3SPierre Pronchery # ifndef OPENSSL_NO_DEPRECATED_3_0 133*b077aed3SPierre Pronchery OSSL_DEPRECATEDIN_3_0 134e71b7053SJung-uk Kim void DES_encrypt2(DES_LONG *data, DES_key_schedule *ks, int enc); 135*b077aed3SPierre Pronchery OSSL_DEPRECATEDIN_3_0 136*b077aed3SPierre Pronchery void DES_encrypt3(DES_LONG *data, DES_key_schedule *ks1, DES_key_schedule *ks2, 137*b077aed3SPierre Pronchery DES_key_schedule *ks3); 138*b077aed3SPierre Pronchery OSSL_DEPRECATEDIN_3_0 139*b077aed3SPierre Pronchery void DES_decrypt3(DES_LONG *data, DES_key_schedule *ks1, DES_key_schedule *ks2, 140*b077aed3SPierre Pronchery DES_key_schedule *ks3); 141*b077aed3SPierre Pronchery OSSL_DEPRECATEDIN_3_0 142e71b7053SJung-uk Kim void DES_ede3_cbc_encrypt(const unsigned char *input, unsigned char *output, 143*b077aed3SPierre Pronchery long length, DES_key_schedule *ks1, 144*b077aed3SPierre Pronchery DES_key_schedule *ks2, DES_key_schedule *ks3, 145*b077aed3SPierre Pronchery DES_cblock *ivec, int enc); 146*b077aed3SPierre Pronchery OSSL_DEPRECATEDIN_3_0 147e71b7053SJung-uk Kim void DES_ede3_cfb64_encrypt(const unsigned char *in, unsigned char *out, 148e71b7053SJung-uk Kim long length, DES_key_schedule *ks1, 149e71b7053SJung-uk Kim DES_key_schedule *ks2, DES_key_schedule *ks3, 150e71b7053SJung-uk Kim DES_cblock *ivec, int *num, int enc); 151*b077aed3SPierre Pronchery OSSL_DEPRECATEDIN_3_0 152e71b7053SJung-uk Kim void DES_ede3_cfb_encrypt(const unsigned char *in, unsigned char *out, 153e71b7053SJung-uk Kim int numbits, long length, DES_key_schedule *ks1, 154e71b7053SJung-uk Kim DES_key_schedule *ks2, DES_key_schedule *ks3, 155e71b7053SJung-uk Kim DES_cblock *ivec, int enc); 156*b077aed3SPierre Pronchery OSSL_DEPRECATEDIN_3_0 157e71b7053SJung-uk Kim void DES_ede3_ofb64_encrypt(const unsigned char *in, unsigned char *out, 158e71b7053SJung-uk Kim long length, DES_key_schedule *ks1, 159e71b7053SJung-uk Kim DES_key_schedule *ks2, DES_key_schedule *ks3, 160e71b7053SJung-uk Kim DES_cblock *ivec, int *num); 161*b077aed3SPierre Pronchery OSSL_DEPRECATEDIN_3_0 162e71b7053SJung-uk Kim char *DES_fcrypt(const char *buf, const char *salt, char *ret); 163*b077aed3SPierre Pronchery OSSL_DEPRECATEDIN_3_0 164e71b7053SJung-uk Kim char *DES_crypt(const char *buf, const char *salt); 165*b077aed3SPierre Pronchery OSSL_DEPRECATEDIN_3_0 166e71b7053SJung-uk Kim void DES_ofb_encrypt(const unsigned char *in, unsigned char *out, int numbits, 167*b077aed3SPierre Pronchery long length, DES_key_schedule *schedule, DES_cblock *ivec); 168*b077aed3SPierre Pronchery OSSL_DEPRECATEDIN_3_0 169e71b7053SJung-uk Kim void DES_pcbc_encrypt(const unsigned char *input, unsigned char *output, 170e71b7053SJung-uk Kim long length, DES_key_schedule *schedule, 171e71b7053SJung-uk Kim DES_cblock *ivec, int enc); 172*b077aed3SPierre Pronchery OSSL_DEPRECATEDIN_3_0 173e71b7053SJung-uk Kim DES_LONG DES_quad_cksum(const unsigned char *input, DES_cblock output[], 174e71b7053SJung-uk Kim long length, int out_count, DES_cblock *seed); 175*b077aed3SPierre Pronchery OSSL_DEPRECATEDIN_3_0 int DES_random_key(DES_cblock *ret); 176*b077aed3SPierre Pronchery OSSL_DEPRECATEDIN_3_0 void DES_set_odd_parity(DES_cblock *key); 177*b077aed3SPierre Pronchery OSSL_DEPRECATEDIN_3_0 int DES_check_key_parity(const_DES_cblock *key); 178*b077aed3SPierre Pronchery OSSL_DEPRECATEDIN_3_0 int DES_is_weak_key(const_DES_cblock *key); 179*b077aed3SPierre Pronchery # endif 180e71b7053SJung-uk Kim /* 181e71b7053SJung-uk Kim * DES_set_key (= set_key = DES_key_sched = key_sched) calls 182*b077aed3SPierre Pronchery * DES_set_key_checked 183e71b7053SJung-uk Kim */ 184*b077aed3SPierre Pronchery # ifndef OPENSSL_NO_DEPRECATED_3_0 185*b077aed3SPierre Pronchery OSSL_DEPRECATEDIN_3_0 186e71b7053SJung-uk Kim int DES_set_key(const_DES_cblock *key, DES_key_schedule *schedule); 187*b077aed3SPierre Pronchery OSSL_DEPRECATEDIN_3_0 188e71b7053SJung-uk Kim int DES_key_sched(const_DES_cblock *key, DES_key_schedule *schedule); 189*b077aed3SPierre Pronchery OSSL_DEPRECATEDIN_3_0 190e71b7053SJung-uk Kim int DES_set_key_checked(const_DES_cblock *key, DES_key_schedule *schedule); 191*b077aed3SPierre Pronchery OSSL_DEPRECATEDIN_3_0 192e71b7053SJung-uk Kim void DES_set_key_unchecked(const_DES_cblock *key, DES_key_schedule *schedule); 193*b077aed3SPierre Pronchery OSSL_DEPRECATEDIN_3_0 void DES_string_to_key(const char *str, DES_cblock *key); 194*b077aed3SPierre Pronchery OSSL_DEPRECATEDIN_3_0 195e71b7053SJung-uk Kim void DES_string_to_2keys(const char *str, DES_cblock *key1, DES_cblock *key2); 196*b077aed3SPierre Pronchery OSSL_DEPRECATEDIN_3_0 197e71b7053SJung-uk Kim void DES_cfb64_encrypt(const unsigned char *in, unsigned char *out, 198e71b7053SJung-uk Kim long length, DES_key_schedule *schedule, 199e71b7053SJung-uk Kim DES_cblock *ivec, int *num, int enc); 200*b077aed3SPierre Pronchery OSSL_DEPRECATEDIN_3_0 201e71b7053SJung-uk Kim void DES_ofb64_encrypt(const unsigned char *in, unsigned char *out, 202e71b7053SJung-uk Kim long length, DES_key_schedule *schedule, 203e71b7053SJung-uk Kim DES_cblock *ivec, int *num); 204*b077aed3SPierre Pronchery # endif 205e71b7053SJung-uk Kim 206e71b7053SJung-uk Kim # ifdef __cplusplus 207e71b7053SJung-uk Kim } 208e71b7053SJung-uk Kim # endif 209e71b7053SJung-uk Kim # endif 210e71b7053SJung-uk Kim 211e71b7053SJung-uk Kim #endif 212