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