ed0641b7adf27b5cd5dec36ec84e10e9f4d01ba7
[openssl.git] / crypto / rc5 / rc5cfb64.c
1 /*
2  * Copyright 1995-2016 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 #include <openssl/rc5.h>
11 #include "rc5_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 RC5_32_cfb64_encrypt(const unsigned char *in, unsigned char *out,
20                           long length, RC5_32_KEY *schedule,
21                           unsigned char *ivec, 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                 RC5_32_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                 RC5_32_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 }