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/blowfish.h> 11 #include "bf_locl.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 BF_cfb64_encrypt(const unsigned char *in, unsigned char *out, 20 long length, const BF_KEY *schedule, 21 unsigned char *ivec, int *num, int encrypt) 22 { 23 register BF_LONG v0, v1, t; 24 register int n = *num; 25 register long l = length; 26 BF_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 n2l(iv, v0); 34 ti[0] = v0; 35 n2l(iv, v1); 36 ti[1] = v1; 37 BF_encrypt((BF_LONG *)ti, schedule); 38 iv = (unsigned char *)ivec; 39 t = ti[0]; 40 l2n(t, iv); 41 t = ti[1]; 42 l2n(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 n2l(iv, v0); 54 ti[0] = v0; 55 n2l(iv, v1); 56 ti[1] = v1; 57 BF_encrypt((BF_LONG *)ti, schedule); 58 iv = (unsigned char *)ivec; 59 t = ti[0]; 60 l2n(t, iv); 61 t = ti[1]; 62 l2n(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