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/* 19 * The input and output encrypted as though 64bit cfb mode is being used. 20 * The extra state information to record how much of the 64bit block we have 21 * used is contained in *num; 22 */ 23 24void DES_cfb64_encrypt(const unsigned char *in, unsigned char *out, 25 long length, DES_key_schedule *schedule, 26 DES_cblock *ivec, int *num, int enc) 27{ 28 register DES_LONG v0, v1; 29 register long l = length; 30 register int n = *num; 31 DES_LONG ti[2]; 32 unsigned char *iv, c, cc; 33 34 iv = &(*ivec)[0]; 35 if (enc) { 36 while (l--) { 37 if (n == 0) { 38 c2l(iv, v0); 39 ti[0] = v0; 40 c2l(iv, v1); 41 ti[1] = v1; 42 DES_encrypt1(ti, schedule, DES_ENCRYPT); 43 iv = &(*ivec)[0]; 44 v0 = ti[0]; 45 l2c(v0, iv); 46 v0 = ti[1]; 47 l2c(v0, iv); 48 iv = &(*ivec)[0]; 49 } 50 c = *(in++) ^ iv[n]; 51 *(out++) = c; 52 iv[n] = c; 53 n = (n + 1) & 0x07; 54 } 55 } else { 56 while (l--) { 57 if (n == 0) { 58 c2l(iv, v0); 59 ti[0] = v0; 60 c2l(iv, v1); 61 ti[1] = v1; 62 DES_encrypt1(ti, schedule, DES_ENCRYPT); 63 iv = &(*ivec)[0]; 64 v0 = ti[0]; 65 l2c(v0, iv); 66 v0 = ti[1]; 67 l2c(v0, iv); 68 iv = &(*ivec)[0]; 69 } 70 cc = *(in++); 71 c = iv[n]; 72 iv[n] = cc; 73 *(out++) = c ^ cc; 74 n = (n + 1) & 0x07; 75 } 76 } 77 v0 = v1 = ti[0] = ti[1] = c = cc = 0; 78 *num = n; 79} 80