1*8fb009dcSAndroid Build Coastguard Worker /* Copyright (C) 1995-1998 Eric Young ([email protected]) 2*8fb009dcSAndroid Build Coastguard Worker * All rights reserved. 3*8fb009dcSAndroid Build Coastguard Worker * 4*8fb009dcSAndroid Build Coastguard Worker * This package is an SSL implementation written 5*8fb009dcSAndroid Build Coastguard Worker * by Eric Young ([email protected]). 6*8fb009dcSAndroid Build Coastguard Worker * The implementation was written so as to conform with Netscapes SSL. 7*8fb009dcSAndroid Build Coastguard Worker * 8*8fb009dcSAndroid Build Coastguard Worker * This library is free for commercial and non-commercial use as long as 9*8fb009dcSAndroid Build Coastguard Worker * the following conditions are aheared to. The following conditions 10*8fb009dcSAndroid Build Coastguard Worker * apply to all code found in this distribution, be it the RC4, RSA, 11*8fb009dcSAndroid Build Coastguard Worker * lhash, DES, etc., code; not just the SSL code. The SSL documentation 12*8fb009dcSAndroid Build Coastguard Worker * included with this distribution is covered by the same copyright terms 13*8fb009dcSAndroid Build Coastguard Worker * except that the holder is Tim Hudson ([email protected]). 14*8fb009dcSAndroid Build Coastguard Worker * 15*8fb009dcSAndroid Build Coastguard Worker * Copyright remains Eric Young's, and as such any Copyright notices in 16*8fb009dcSAndroid Build Coastguard Worker * the code are not to be removed. 17*8fb009dcSAndroid Build Coastguard Worker * If this package is used in a product, Eric Young should be given attribution 18*8fb009dcSAndroid Build Coastguard Worker * as the author of the parts of the library used. 19*8fb009dcSAndroid Build Coastguard Worker * This can be in the form of a textual message at program startup or 20*8fb009dcSAndroid Build Coastguard Worker * in documentation (online or textual) provided with the package. 21*8fb009dcSAndroid Build Coastguard Worker * 22*8fb009dcSAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without 23*8fb009dcSAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions 24*8fb009dcSAndroid Build Coastguard Worker * are met: 25*8fb009dcSAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the copyright 26*8fb009dcSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer. 27*8fb009dcSAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright 28*8fb009dcSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in the 29*8fb009dcSAndroid Build Coastguard Worker * documentation and/or other materials provided with the distribution. 30*8fb009dcSAndroid Build Coastguard Worker * 3. All advertising materials mentioning features or use of this software 31*8fb009dcSAndroid Build Coastguard Worker * must display the following acknowledgement: 32*8fb009dcSAndroid Build Coastguard Worker * "This product includes cryptographic software written by 33*8fb009dcSAndroid Build Coastguard Worker * Eric Young ([email protected])" 34*8fb009dcSAndroid Build Coastguard Worker * The word 'cryptographic' can be left out if the rouines from the library 35*8fb009dcSAndroid Build Coastguard Worker * being used are not cryptographic related :-). 36*8fb009dcSAndroid Build Coastguard Worker * 4. If you include any Windows specific code (or a derivative thereof) from 37*8fb009dcSAndroid Build Coastguard Worker * the apps directory (application code) you must include an acknowledgement: 38*8fb009dcSAndroid Build Coastguard Worker * "This product includes software written by Tim Hudson ([email protected])" 39*8fb009dcSAndroid Build Coastguard Worker * 40*8fb009dcSAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 41*8fb009dcSAndroid Build Coastguard Worker * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 42*8fb009dcSAndroid Build Coastguard Worker * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 43*8fb009dcSAndroid Build Coastguard Worker * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 44*8fb009dcSAndroid Build Coastguard Worker * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 45*8fb009dcSAndroid Build Coastguard Worker * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 46*8fb009dcSAndroid Build Coastguard Worker * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 47*8fb009dcSAndroid Build Coastguard Worker * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 48*8fb009dcSAndroid Build Coastguard Worker * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 49*8fb009dcSAndroid Build Coastguard Worker * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 50*8fb009dcSAndroid Build Coastguard Worker * SUCH DAMAGE. 51*8fb009dcSAndroid Build Coastguard Worker * 52*8fb009dcSAndroid Build Coastguard Worker * The licence and distribution terms for any publically available version or 53*8fb009dcSAndroid Build Coastguard Worker * derivative of this code cannot be changed. i.e. this code cannot simply be 54*8fb009dcSAndroid Build Coastguard Worker * copied and put under another distribution licence 55*8fb009dcSAndroid Build Coastguard Worker * [including the GNU Public Licence.] */ 56*8fb009dcSAndroid Build Coastguard Worker 57*8fb009dcSAndroid Build Coastguard Worker #ifndef OPENSSL_HEADER_DES_H 58*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_HEADER_DES_H 59*8fb009dcSAndroid Build Coastguard Worker 60*8fb009dcSAndroid Build Coastguard Worker #include <openssl/base.h> 61*8fb009dcSAndroid Build Coastguard Worker 62*8fb009dcSAndroid Build Coastguard Worker #if defined(__cplusplus) 63*8fb009dcSAndroid Build Coastguard Worker extern "C" { 64*8fb009dcSAndroid Build Coastguard Worker #endif 65*8fb009dcSAndroid Build Coastguard Worker 66*8fb009dcSAndroid Build Coastguard Worker 67*8fb009dcSAndroid Build Coastguard Worker // DES. 68*8fb009dcSAndroid Build Coastguard Worker // 69*8fb009dcSAndroid Build Coastguard Worker // This module is deprecated and retained for legacy reasons only. It is slow 70*8fb009dcSAndroid Build Coastguard Worker // and may leak key material with timing or cache side channels. Moreover, 71*8fb009dcSAndroid Build Coastguard Worker // single-keyed DES is broken and can be brute-forced in under a day. 72*8fb009dcSAndroid Build Coastguard Worker // 73*8fb009dcSAndroid Build Coastguard Worker // Use a modern cipher, such as AES-GCM or ChaCha20-Poly1305, instead. 74*8fb009dcSAndroid Build Coastguard Worker 75*8fb009dcSAndroid Build Coastguard Worker 76*8fb009dcSAndroid Build Coastguard Worker typedef struct DES_cblock_st { 77*8fb009dcSAndroid Build Coastguard Worker uint8_t bytes[8]; 78*8fb009dcSAndroid Build Coastguard Worker } DES_cblock; 79*8fb009dcSAndroid Build Coastguard Worker 80*8fb009dcSAndroid Build Coastguard Worker typedef struct DES_ks { 81*8fb009dcSAndroid Build Coastguard Worker uint32_t subkeys[16][2]; 82*8fb009dcSAndroid Build Coastguard Worker } DES_key_schedule; 83*8fb009dcSAndroid Build Coastguard Worker 84*8fb009dcSAndroid Build Coastguard Worker 85*8fb009dcSAndroid Build Coastguard Worker #define DES_KEY_SZ (sizeof(DES_cblock)) 86*8fb009dcSAndroid Build Coastguard Worker #define DES_SCHEDULE_SZ (sizeof(DES_key_schedule)) 87*8fb009dcSAndroid Build Coastguard Worker 88*8fb009dcSAndroid Build Coastguard Worker #define DES_ENCRYPT 1 89*8fb009dcSAndroid Build Coastguard Worker #define DES_DECRYPT 0 90*8fb009dcSAndroid Build Coastguard Worker 91*8fb009dcSAndroid Build Coastguard Worker #define DES_CBC_MODE 0 92*8fb009dcSAndroid Build Coastguard Worker #define DES_PCBC_MODE 1 93*8fb009dcSAndroid Build Coastguard Worker 94*8fb009dcSAndroid Build Coastguard Worker // DES_set_key performs a key schedule and initialises |schedule| with |key|. 95*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT void DES_set_key(const DES_cblock *key, 96*8fb009dcSAndroid Build Coastguard Worker DES_key_schedule *schedule); 97*8fb009dcSAndroid Build Coastguard Worker 98*8fb009dcSAndroid Build Coastguard Worker // DES_set_odd_parity sets the parity bits (the least-significant bits in each 99*8fb009dcSAndroid Build Coastguard Worker // byte) of |key| given the other bits in each byte. 100*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT void DES_set_odd_parity(DES_cblock *key); 101*8fb009dcSAndroid Build Coastguard Worker 102*8fb009dcSAndroid Build Coastguard Worker // DES_ecb_encrypt encrypts (or decrypts, if |is_encrypt| is |DES_DECRYPT|) a 103*8fb009dcSAndroid Build Coastguard Worker // single DES block (8 bytes) from in to out, using the key configured in 104*8fb009dcSAndroid Build Coastguard Worker // |schedule|. 105*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT void DES_ecb_encrypt(const DES_cblock *in, DES_cblock *out, 106*8fb009dcSAndroid Build Coastguard Worker const DES_key_schedule *schedule, 107*8fb009dcSAndroid Build Coastguard Worker int is_encrypt); 108*8fb009dcSAndroid Build Coastguard Worker 109*8fb009dcSAndroid Build Coastguard Worker // DES_ncbc_encrypt encrypts (or decrypts, if |enc| is |DES_DECRYPT|) |len| 110*8fb009dcSAndroid Build Coastguard Worker // bytes from |in| to |out| with DES in CBC mode. 111*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT void DES_ncbc_encrypt(const uint8_t *in, uint8_t *out, 112*8fb009dcSAndroid Build Coastguard Worker size_t len, 113*8fb009dcSAndroid Build Coastguard Worker const DES_key_schedule *schedule, 114*8fb009dcSAndroid Build Coastguard Worker DES_cblock *ivec, int enc); 115*8fb009dcSAndroid Build Coastguard Worker 116*8fb009dcSAndroid Build Coastguard Worker // DES_ecb3_encrypt encrypts (or decrypts, if |enc| is |DES_DECRYPT|) a single 117*8fb009dcSAndroid Build Coastguard Worker // block (8 bytes) of data from |input| to |output| using 3DES. 118*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT void DES_ecb3_encrypt(const DES_cblock *input, 119*8fb009dcSAndroid Build Coastguard Worker DES_cblock *output, 120*8fb009dcSAndroid Build Coastguard Worker const DES_key_schedule *ks1, 121*8fb009dcSAndroid Build Coastguard Worker const DES_key_schedule *ks2, 122*8fb009dcSAndroid Build Coastguard Worker const DES_key_schedule *ks3, 123*8fb009dcSAndroid Build Coastguard Worker int enc); 124*8fb009dcSAndroid Build Coastguard Worker 125*8fb009dcSAndroid Build Coastguard Worker // DES_ede3_cbc_encrypt encrypts (or decrypts, if |enc| is |DES_DECRYPT|) |len| 126*8fb009dcSAndroid Build Coastguard Worker // bytes from |in| to |out| with 3DES in CBC mode. 3DES uses three keys, thus 127*8fb009dcSAndroid Build Coastguard Worker // the function takes three different |DES_key_schedule|s. 128*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT void DES_ede3_cbc_encrypt(const uint8_t *in, uint8_t *out, 129*8fb009dcSAndroid Build Coastguard Worker size_t len, 130*8fb009dcSAndroid Build Coastguard Worker const DES_key_schedule *ks1, 131*8fb009dcSAndroid Build Coastguard Worker const DES_key_schedule *ks2, 132*8fb009dcSAndroid Build Coastguard Worker const DES_key_schedule *ks3, 133*8fb009dcSAndroid Build Coastguard Worker DES_cblock *ivec, int enc); 134*8fb009dcSAndroid Build Coastguard Worker 135*8fb009dcSAndroid Build Coastguard Worker // DES_ede2_cbc_encrypt encrypts (or decrypts, if |enc| is |DES_DECRYPT|) |len| 136*8fb009dcSAndroid Build Coastguard Worker // bytes from |in| to |out| with 3DES in CBC mode. With this keying option, the 137*8fb009dcSAndroid Build Coastguard Worker // first and third 3DES keys are identical. Thus, this function takes only two 138*8fb009dcSAndroid Build Coastguard Worker // different |DES_key_schedule|s. 139*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT void DES_ede2_cbc_encrypt(const uint8_t *in, uint8_t *out, 140*8fb009dcSAndroid Build Coastguard Worker size_t len, 141*8fb009dcSAndroid Build Coastguard Worker const DES_key_schedule *ks1, 142*8fb009dcSAndroid Build Coastguard Worker const DES_key_schedule *ks2, 143*8fb009dcSAndroid Build Coastguard Worker DES_cblock *ivec, int enc); 144*8fb009dcSAndroid Build Coastguard Worker 145*8fb009dcSAndroid Build Coastguard Worker 146*8fb009dcSAndroid Build Coastguard Worker // Deprecated functions. 147*8fb009dcSAndroid Build Coastguard Worker 148*8fb009dcSAndroid Build Coastguard Worker // DES_set_key_unchecked calls |DES_set_key|. 149*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT void DES_set_key_unchecked(const DES_cblock *key, 150*8fb009dcSAndroid Build Coastguard Worker DES_key_schedule *schedule); 151*8fb009dcSAndroid Build Coastguard Worker 152*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT void DES_ede3_cfb64_encrypt(const uint8_t *in, uint8_t *out, 153*8fb009dcSAndroid Build Coastguard Worker long length, DES_key_schedule *ks1, 154*8fb009dcSAndroid Build Coastguard Worker DES_key_schedule *ks2, 155*8fb009dcSAndroid Build Coastguard Worker DES_key_schedule *ks3, 156*8fb009dcSAndroid Build Coastguard Worker DES_cblock *ivec, int *num, int enc); 157*8fb009dcSAndroid Build Coastguard Worker 158*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT void DES_ede3_cfb_encrypt(const uint8_t *in, uint8_t *out, 159*8fb009dcSAndroid Build Coastguard Worker int numbits, long length, 160*8fb009dcSAndroid Build Coastguard Worker DES_key_schedule *ks1, 161*8fb009dcSAndroid Build Coastguard Worker DES_key_schedule *ks2, 162*8fb009dcSAndroid Build Coastguard Worker DES_key_schedule *ks3, 163*8fb009dcSAndroid Build Coastguard Worker DES_cblock *ivec, int enc); 164*8fb009dcSAndroid Build Coastguard Worker 165*8fb009dcSAndroid Build Coastguard Worker 166*8fb009dcSAndroid Build Coastguard Worker #if defined(__cplusplus) 167*8fb009dcSAndroid Build Coastguard Worker } // extern C 168*8fb009dcSAndroid Build Coastguard Worker #endif 169*8fb009dcSAndroid Build Coastguard Worker 170*8fb009dcSAndroid Build Coastguard Worker #endif // OPENSSL_HEADER_DES_H 171