1 /* 2 * Copyright 1995-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 #include "des_locl.h" 11 12 void DES_pcbc_encrypt(const unsigned char *input, unsigned char *output, 13 long length, DES_key_schedule *schedule, 14 DES_cblock *ivec, int enc) 15 { 16 register DES_LONG sin0, sin1, xor0, xor1, tout0, tout1; 17 DES_LONG tin[2]; 18 const unsigned char *in; 19 unsigned char *out, *iv; 20 21 in = input; 22 out = output; 23 iv = &(*ivec)[0]; 24 25 if (enc) { 26 c2l(iv, xor0); 27 c2l(iv, xor1); 28 for (; length > 0; length -= 8) { 29 if (length >= 8) { 30 c2l(in, sin0); 31 c2l(in, sin1); 32 } else 33 c2ln(in, sin0, sin1, length); 34 tin[0] = sin0 ^ xor0; 35 tin[1] = sin1 ^ xor1; 36 DES_encrypt1((DES_LONG *)tin, schedule, DES_ENCRYPT); 37 tout0 = tin[0]; 38 tout1 = tin[1]; 39 xor0 = sin0 ^ tout0; 40 xor1 = sin1 ^ tout1; 41 l2c(tout0, out); 42 l2c(tout1, out); 43 } 44 } else { 45 c2l(iv, xor0); 46 c2l(iv, xor1); 47 for (; length > 0; length -= 8) { 48 c2l(in, sin0); 49 c2l(in, sin1); 50 tin[0] = sin0; 51 tin[1] = sin1; 52 DES_encrypt1((DES_LONG *)tin, schedule, DES_DECRYPT); 53 tout0 = tin[0] ^ xor0; 54 tout1 = tin[1] ^ xor1; 55 if (length >= 8) { 56 l2c(tout0, out); 57 l2c(tout1, out); 58 } else 59 l2cn(tout0, tout1, out, length); 60 xor0 = tout0 ^ sin0; 61 xor1 = tout1 ^ sin1; 62 } 63 } 64 tin[0] = tin[1] = 0; 65 sin0 = sin1 = xor0 = xor1 = tout0 = tout1 = 0; 66 } 67