| OLD | NEW | 
|---|
| 1 /* crypto/evp/e_des.c */ | 1 /* crypto/evp/e_des.c */ | 
| 2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 
| 3  * All rights reserved. | 3  * All rights reserved. | 
| 4  * | 4  * | 
| 5  * This package is an SSL implementation written | 5  * This package is an SSL implementation written | 
| 6  * by Eric Young (eay@cryptsoft.com). | 6  * by Eric Young (eay@cryptsoft.com). | 
| 7  * The implementation was written so as to conform with Netscapes SSL. | 7  * The implementation was written so as to conform with Netscapes SSL. | 
| 8  * | 8  * | 
| 9  * This library is free for commercial and non-commercial use as long as | 9  * This library is free for commercial and non-commercial use as long as | 
| 10  * the following conditions are aheared to.  The following conditions | 10  * the following conditions are aheared to.  The following conditions | 
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 65 #include <openssl/des.h> | 65 #include <openssl/des.h> | 
| 66 #include <openssl/rand.h> | 66 #include <openssl/rand.h> | 
| 67 | 67 | 
| 68 static int des_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, | 68 static int des_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, | 
| 69                         const unsigned char *iv, int enc); | 69                         const unsigned char *iv, int enc); | 
| 70 static int des_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr); | 70 static int des_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr); | 
| 71 | 71 | 
| 72 /* Because of various casts and different names can't use IMPLEMENT_BLOCK_CIPHER
      */ | 72 /* Because of various casts and different names can't use IMPLEMENT_BLOCK_CIPHER
      */ | 
| 73 | 73 | 
| 74 static int des_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | 74 static int des_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | 
| 75 »       »       »         const unsigned char *in, unsigned int inl) | 75 »       »       »         const unsigned char *in, size_t inl) | 
| 76 { | 76 { | 
| 77         BLOCK_CIPHER_ecb_loop() | 77         BLOCK_CIPHER_ecb_loop() | 
| 78                 DES_ecb_encrypt((DES_cblock *)(in + i), (DES_cblock *)(out + i),
      ctx->cipher_data, ctx->encrypt); | 78                 DES_ecb_encrypt((DES_cblock *)(in + i), (DES_cblock *)(out + i),
      ctx->cipher_data, ctx->encrypt); | 
| 79         return 1; | 79         return 1; | 
| 80 } | 80 } | 
| 81 | 81 | 
| 82 static int des_ofb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | 82 static int des_ofb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | 
| 83 »       »       »         const unsigned char *in, unsigned int inl) | 83 »       »       »         const unsigned char *in, size_t inl) | 
| 84 { | 84 { | 
| 85 »       DES_ofb64_encrypt(in, out, (long)inl, ctx->cipher_data, (DES_cblock *)ct
     x->iv, &ctx->num); | 85 »       while(inl>=EVP_MAXCHUNK) | 
|  | 86 »       »       { | 
|  | 87 »       »       DES_ofb64_encrypt(in, out, (long)EVP_MAXCHUNK, ctx->cipher_data, | 
|  | 88 »       »       »       »       (DES_cblock *)ctx->iv, &ctx->num); | 
|  | 89 »       »       inl-=EVP_MAXCHUNK; | 
|  | 90 »       »       in +=EVP_MAXCHUNK; | 
|  | 91 »       »       out+=EVP_MAXCHUNK; | 
|  | 92 »       »       } | 
|  | 93 »       if (inl) | 
|  | 94 »       »       DES_ofb64_encrypt(in, out, (long)inl, ctx->cipher_data, | 
|  | 95 »       »       »       »       (DES_cblock *)ctx->iv, &ctx->num); | 
| 86         return 1; | 96         return 1; | 
| 87 } | 97 } | 
| 88 | 98 | 
| 89 static int des_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | 99 static int des_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | 
| 90 »       »       »         const unsigned char *in, unsigned int inl) | 100 »       »       »         const unsigned char *in, size_t inl) | 
| 91 { | 101 { | 
| 92 »       DES_ncbc_encrypt(in, out, (long)inl, ctx->cipher_data, | 102 »       while(inl>=EVP_MAXCHUNK) | 
| 93 »       »       »        (DES_cblock *)ctx->iv, ctx->encrypt); | 103 »       »       { | 
|  | 104 »       »       DES_ncbc_encrypt(in, out, (long)EVP_MAXCHUNK, ctx->cipher_data, | 
|  | 105 »       »       »       »       (DES_cblock *)ctx->iv, ctx->encrypt); | 
|  | 106 »       »       inl-=EVP_MAXCHUNK; | 
|  | 107 »       »       in +=EVP_MAXCHUNK; | 
|  | 108 »       »       out+=EVP_MAXCHUNK; | 
|  | 109 »       »       } | 
|  | 110 »       if (inl) | 
|  | 111 »       »       DES_ncbc_encrypt(in, out, (long)inl, ctx->cipher_data, | 
|  | 112 »       »       »       »       (DES_cblock *)ctx->iv, ctx->encrypt); | 
| 94         return 1; | 113         return 1; | 
| 95 } | 114 } | 
| 96 | 115 | 
| 97 static int des_cfb64_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | 116 static int des_cfb64_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | 
| 98 »       »       »           const unsigned char *in, unsigned int inl) | 117 »       »       »           const unsigned char *in, size_t inl) | 
| 99 { | 118 { | 
| 100 »       DES_cfb64_encrypt(in, out, (long)inl, ctx->cipher_data, | 119 »       while(inl>=EVP_MAXCHUNK) | 
|  | 120 »       »       { | 
|  | 121 »       »       DES_cfb64_encrypt(in,out, (long)EVP_MAXCHUNK, ctx->cipher_data, | 
|  | 122 »       »       »       »       (DES_cblock *)ctx->iv, &ctx->num, ctx->encrypt); | 
|  | 123 »       »       inl-=EVP_MAXCHUNK; | 
|  | 124 »       »       in +=EVP_MAXCHUNK; | 
|  | 125 »       »       out+=EVP_MAXCHUNK; | 
|  | 126 »       »       } | 
|  | 127 »       if (inl) | 
|  | 128 »       »       DES_cfb64_encrypt(in, out, (long)inl, ctx->cipher_data, | 
| 101                           (DES_cblock *)ctx->iv, &ctx->num, ctx->encrypt); | 129                           (DES_cblock *)ctx->iv, &ctx->num, ctx->encrypt); | 
| 102         return 1; | 130         return 1; | 
| 103 } | 131 } | 
| 104 | 132 | 
| 105 /* Although we have a CFB-r implementation for DES, it doesn't pack the right | 133 /* Although we have a CFB-r implementation for DES, it doesn't pack the right | 
| 106    way, so wrap it here */ | 134    way, so wrap it here */ | 
| 107 static int des_cfb1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | 135 static int des_cfb1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | 
| 108 »       »       »          const unsigned char *in, unsigned int inl) | 136 »       »       »          const unsigned char *in, size_t inl) | 
| 109     { | 137     { | 
| 110     unsigned int n; | 138     size_t n,chunk=EVP_MAXCHUNK/8; | 
| 111     unsigned char c[1],d[1]; | 139     unsigned char c[1],d[1]; | 
| 112 | 140 | 
| 113     for(n=0 ; n < inl ; ++n) | 141     if (inl<chunk) chunk=inl; | 
|  | 142 | 
|  | 143     while (inl && inl>=chunk) | 
| 114         { | 144         { | 
| 115 »       c[0]=(in[n/8]&(1 << (7-n%8))) ? 0x80 : 0; | 145 »       for(n=0 ; n < chunk*8; ++n) | 
| 116 »       DES_cfb_encrypt(c,d,1,1,ctx->cipher_data,(DES_cblock *)ctx->iv, | 146 »           { | 
|  | 147 »           c[0]=(in[n/8]&(1 << (7-n%8))) ? 0x80 : 0; | 
|  | 148 »           DES_cfb_encrypt(c,d,1,1,ctx->cipher_data,(DES_cblock *)ctx->iv, | 
| 117                         ctx->encrypt); | 149                         ctx->encrypt); | 
| 118 »       out[n/8]=(out[n/8]&~(0x80 >> (n%8)))|((d[0]&0x80) >> (n%8)); | 150 »           out[n/8]=(out[n/8]&~(0x80 >> (unsigned int)(n%8))) | | 
|  | 151 »       »            ((d[0]&0x80) >> (unsigned int)(n%8)); | 
|  | 152 »           } | 
|  | 153 »       inl-=chunk; | 
|  | 154 »       in +=chunk; | 
|  | 155 »       out+=chunk; | 
|  | 156 »       if (inl<chunk) chunk=inl; | 
| 119         } | 157         } | 
|  | 158 | 
| 120     return 1; | 159     return 1; | 
| 121     } | 160     } | 
| 122 | 161 | 
| 123 static int des_cfb8_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | 162 static int des_cfb8_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | 
| 124 »       »       »          const unsigned char *in, unsigned int inl) | 163 »       »       »          const unsigned char *in, size_t inl) | 
| 125     { | 164     { | 
| 126     DES_cfb_encrypt(in,out,8,inl,ctx->cipher_data,(DES_cblock *)ctx->iv, | 165     while (inl>=EVP_MAXCHUNK) | 
| 127 »       »           ctx->encrypt); | 166 »       { | 
|  | 167 »       DES_cfb_encrypt(in,out,8,(long)EVP_MAXCHUNK,ctx->cipher_data, | 
|  | 168 »       »       »       (DES_cblock *)ctx->iv,ctx->encrypt); | 
|  | 169 »       inl-=EVP_MAXCHUNK; | 
|  | 170 »       in +=EVP_MAXCHUNK; | 
|  | 171 »       out+=EVP_MAXCHUNK; | 
|  | 172 »       } | 
|  | 173     if (inl) | 
|  | 174 »       DES_cfb_encrypt(in,out,8,(long)inl,ctx->cipher_data, | 
|  | 175 »       »       »       (DES_cblock *)ctx->iv,ctx->encrypt); | 
| 128     return 1; | 176     return 1; | 
| 129     } | 177     } | 
| 130 | 178 | 
| 131 BLOCK_CIPHER_defs(des, DES_key_schedule, NID_des, 8, 8, 8, 64, | 179 BLOCK_CIPHER_defs(des, DES_key_schedule, NID_des, 8, 8, 8, 64, | 
| 132 »       »       »       EVP_CIPH_RAND_KEY, | 180 »       »       »       EVP_CIPH_RAND_KEY, des_init_key, NULL, | 
| 133 »       »       »       des_init_key, NULL, |  | 
| 134                         EVP_CIPHER_set_asn1_iv, | 181                         EVP_CIPHER_set_asn1_iv, | 
| 135                         EVP_CIPHER_get_asn1_iv, | 182                         EVP_CIPHER_get_asn1_iv, | 
| 136                         des_ctrl) | 183                         des_ctrl) | 
| 137 | 184 | 
| 138 BLOCK_CIPHER_def_cfb(des,DES_key_schedule,NID_des,8,8,1, | 185 BLOCK_CIPHER_def_cfb(des,DES_key_schedule,NID_des,8,8,1, | 
| 139 »       »            EVP_CIPH_RAND_KEY, | 186 »       »            EVP_CIPH_RAND_KEY, des_init_key,NULL, | 
| 140 »       »            des_init_key, NULL, |  | 
| 141                      EVP_CIPHER_set_asn1_iv, | 187                      EVP_CIPHER_set_asn1_iv, | 
| 142                      EVP_CIPHER_get_asn1_iv,des_ctrl) | 188                      EVP_CIPHER_get_asn1_iv,des_ctrl) | 
| 143 | 189 | 
| 144 BLOCK_CIPHER_def_cfb(des,DES_key_schedule,NID_des,8,8,8, | 190 BLOCK_CIPHER_def_cfb(des,DES_key_schedule,NID_des,8,8,8, | 
| 145 »       »            EVP_CIPH_RAND_KEY, | 191 »       »            EVP_CIPH_RAND_KEY,des_init_key,NULL, | 
| 146 »       »            des_init_key,NULL, |  | 
| 147                      EVP_CIPHER_set_asn1_iv, | 192                      EVP_CIPHER_set_asn1_iv, | 
| 148                      EVP_CIPHER_get_asn1_iv,des_ctrl) | 193                      EVP_CIPHER_get_asn1_iv,des_ctrl) | 
| 149 | 194 | 
| 150 static int des_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, | 195 static int des_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, | 
| 151                         const unsigned char *iv, int enc) | 196                         const unsigned char *iv, int enc) | 
| 152         { | 197         { | 
| 153         DES_cblock *deskey = (DES_cblock *)key; | 198         DES_cblock *deskey = (DES_cblock *)key; | 
| 154 #ifdef EVP_CHECK_DES_KEY | 199 #ifdef EVP_CHECK_DES_KEY | 
| 155         if(DES_set_key_checked(deskey,ctx->cipher_data) != 0) | 200         if(DES_set_key_checked(deskey,ctx->cipher_data) != 0) | 
| 156                 return 0; | 201                 return 0; | 
| (...skipping 13 matching lines...) Expand all  Loading... | 
| 170                         return 0; | 215                         return 0; | 
| 171                 DES_set_odd_parity((DES_cblock *)ptr); | 216                 DES_set_odd_parity((DES_cblock *)ptr); | 
| 172                 return 1; | 217                 return 1; | 
| 173 | 218 | 
| 174         default: | 219         default: | 
| 175                 return -1; | 220                 return -1; | 
| 176                 } | 221                 } | 
| 177         } | 222         } | 
| 178 | 223 | 
| 179 #endif | 224 #endif | 
| OLD | NEW | 
|---|