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