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