Home | History | Annotate | Line # | Download | only in des
      1 /*
      2  * Copyright 1998-2016 The OpenSSL Project Authors. All Rights Reserved.
      3  *
      4  * Licensed under the OpenSSL license (the "License").  You may not use
      5  * this file except in compliance with the License.  You can obtain a copy
      6  * in the file LICENSE in the source distribution or at
      7  * https://www.openssl.org/source/license.html
      8  */
      9 
     10 /*-
     11  * #included by:
     12  *    cbc_enc.c  (DES_cbc_encrypt)
     13  *    des_enc.c  (DES_ncbc_encrypt)
     14  */
     15 
     16 #include "des_local.h"
     17 
     18 #ifdef CBC_ENC_C__DONT_UPDATE_IV
     19 void DES_cbc_encrypt(const unsigned char *in, unsigned char *out, long length,
     20                      DES_key_schedule *_schedule, DES_cblock *ivec, int enc)
     21 #else
     22 void DES_ncbc_encrypt(const unsigned char *in, unsigned char *out,
     23                       long length, DES_key_schedule *_schedule,
     24                       DES_cblock *ivec, int enc)
     25 #endif
     26 {
     27     register DES_LONG tin0, tin1;
     28     register DES_LONG tout0, tout1, xor0, xor1;
     29     register long l = length;
     30     DES_LONG tin[2];
     31     unsigned char *iv;
     32 
     33     iv = &(*ivec)[0];
     34 
     35     if (enc) {
     36         c2l(iv, tout0);
     37         c2l(iv, tout1);
     38         for (l -= 8; l >= 0; l -= 8) {
     39             c2l(in, tin0);
     40             c2l(in, tin1);
     41             tin0 ^= tout0;
     42             tin[0] = tin0;
     43             tin1 ^= tout1;
     44             tin[1] = tin1;
     45             DES_encrypt1((DES_LONG *)tin, _schedule, DES_ENCRYPT);
     46             tout0 = tin[0];
     47             l2c(tout0, out);
     48             tout1 = tin[1];
     49             l2c(tout1, out);
     50         }
     51         if (l != -8) {
     52             c2ln(in, tin0, tin1, l + 8);
     53             tin0 ^= tout0;
     54             tin[0] = tin0;
     55             tin1 ^= tout1;
     56             tin[1] = tin1;
     57             DES_encrypt1((DES_LONG *)tin, _schedule, DES_ENCRYPT);
     58             tout0 = tin[0];
     59             l2c(tout0, out);
     60             tout1 = tin[1];
     61             l2c(tout1, out);
     62         }
     63 #ifndef CBC_ENC_C__DONT_UPDATE_IV
     64         iv = &(*ivec)[0];
     65         l2c(tout0, iv);
     66         l2c(tout1, iv);
     67 #endif
     68     } else {
     69         c2l(iv, xor0);
     70         c2l(iv, xor1);
     71         for (l -= 8; l >= 0; l -= 8) {
     72             c2l(in, tin0);
     73             tin[0] = tin0;
     74             c2l(in, tin1);
     75             tin[1] = tin1;
     76             DES_encrypt1((DES_LONG *)tin, _schedule, DES_DECRYPT);
     77             tout0 = tin[0] ^ xor0;
     78             tout1 = tin[1] ^ xor1;
     79             l2c(tout0, out);
     80             l2c(tout1, out);
     81             xor0 = tin0;
     82             xor1 = tin1;
     83         }
     84         if (l != -8) {
     85             c2l(in, tin0);
     86             tin[0] = tin0;
     87             c2l(in, tin1);
     88             tin[1] = tin1;
     89             DES_encrypt1((DES_LONG *)tin, _schedule, DES_DECRYPT);
     90             tout0 = tin[0] ^ xor0;
     91             tout1 = tin[1] ^ xor1;
     92             l2cn(tout0, tout1, out, l + 8);
     93 #ifndef CBC_ENC_C__DONT_UPDATE_IV
     94             xor0 = tin0;
     95             xor1 = tin1;
     96 #endif
     97         }
     98 #ifndef CBC_ENC_C__DONT_UPDATE_IV
     99         iv = &(*ivec)[0];
    100         l2c(xor0, iv);
    101         l2c(xor1, iv);
    102 #endif
    103     }
    104     tin0 = tin1 = tout0 = tout1 = xor0 = xor1 = 0;
    105     tin[0] = tin[1] = 0;
    106 }
    107