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