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_local.h" 11 12 /* RSA's DESX */ 13 14 void DES_xcbc_encrypt(const unsigned char *in, unsigned char *out, 15 long length, DES_key_schedule *schedule, 16 DES_cblock *ivec, const_DES_cblock *inw, 17 const_DES_cblock *outw, int enc) 18 { 19 register DES_LONG tin0, tin1; 20 register DES_LONG tout0, tout1, xor0, xor1; 21 register DES_LONG inW0, inW1, outW0, outW1; 22 register const unsigned char *in2; 23 register long l = length; 24 DES_LONG tin[2]; 25 unsigned char *iv; 26 27 in2 = &(*inw)[0]; 28 c2l(in2, inW0); 29 c2l(in2, inW1); 30 in2 = &(*outw)[0]; 31 c2l(in2, outW0); 32 c2l(in2, outW1); 33 34 iv = &(*ivec)[0]; 35 36 if (enc) { 37 c2l(iv, tout0); 38 c2l(iv, tout1); 39 for (l -= 8; l >= 0; l -= 8) { 40 c2l(in, tin0); 41 c2l(in, tin1); 42 tin0 ^= tout0 ^ inW0; 43 tin[0] = tin0; 44 tin1 ^= tout1 ^ inW1; 45 tin[1] = tin1; 46 DES_encrypt1(tin, schedule, DES_ENCRYPT); 47 tout0 = tin[0] ^ outW0; 48 l2c(tout0, out); 49 tout1 = tin[1] ^ outW1; 50 l2c(tout1, out); 51 } 52 if (l != -8) { 53 c2ln(in, tin0, tin1, l + 8); 54 tin0 ^= tout0 ^ inW0; 55 tin[0] = tin0; 56 tin1 ^= tout1 ^ inW1; 57 tin[1] = tin1; 58 DES_encrypt1(tin, schedule, DES_ENCRYPT); 59 tout0 = tin[0] ^ outW0; 60 l2c(tout0, out); 61 tout1 = tin[1] ^ outW1; 62 l2c(tout1, out); 63 } 64 iv = &(*ivec)[0]; 65 l2c(tout0, iv); 66 l2c(tout1, iv); 67 } else { 68 c2l(iv, xor0); 69 c2l(iv, xor1); 70 for (l -= 8; l > 0; l -= 8) { 71 c2l(in, tin0); 72 tin[0] = tin0 ^ outW0; 73 c2l(in, tin1); 74 tin[1] = tin1 ^ outW1; 75 DES_encrypt1(tin, schedule, DES_DECRYPT); 76 tout0 = tin[0] ^ xor0 ^ inW0; 77 tout1 = tin[1] ^ xor1 ^ inW1; 78 l2c(tout0, out); 79 l2c(tout1, out); 80 xor0 = tin0; 81 xor1 = tin1; 82 } 83 if (l != -8) { 84 c2l(in, tin0); 85 tin[0] = tin0 ^ outW0; 86 c2l(in, tin1); 87 tin[1] = tin1 ^ outW1; 88 DES_encrypt1(tin, schedule, DES_DECRYPT); 89 tout0 = tin[0] ^ xor0 ^ inW0; 90 tout1 = tin[1] ^ xor1 ^ inW1; 91 l2cn(tout0, tout1, out, l + 8); 92 xor0 = tin0; 93 xor1 = tin1; 94 } 95 96 iv = &(*ivec)[0]; 97 l2c(xor0, iv); 98 l2c(xor1, iv); 99 } 100 tin0 = tin1 = tout0 = tout1 = xor0 = xor1 = 0; 101 inW0 = inW1 = outW0 = outW1 = 0; 102 tin[0] = tin[1] = 0; 103 } 104