xref: /openssl/crypto/idea/i_cfb64.c (revision 3c2bdd7d)
1 /*
2  * Copyright 1995-2021 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  * IDEA low level APIs are deprecated for public use, but still ok for internal
12  * use where we're using them to implement the higher level EVP interface, as is
13  * the case here.
14  */
15 #include "internal/deprecated.h"
16 
17 #include <openssl/idea.h>
18 #include "idea_local.h"
19 
20 /*
21  * The input and output encrypted as though 64bit cfb mode is being used.
22  * The extra state information to record how much of the 64bit block we have
23  * used is contained in *num;
24  */
25 
IDEA_cfb64_encrypt(const unsigned char * in,unsigned char * out,long length,IDEA_KEY_SCHEDULE * schedule,unsigned char * ivec,int * num,int encrypt)26 void IDEA_cfb64_encrypt(const unsigned char *in, unsigned char *out,
27                         long length, IDEA_KEY_SCHEDULE *schedule,
28                         unsigned char *ivec, int *num, int encrypt)
29 {
30     register unsigned long v0, v1, t;
31     register int n = *num;
32     register long l = length;
33     unsigned long ti[2];
34     unsigned char *iv, c, cc;
35 
36     if (n < 0) {
37         *num = -1;
38         return;
39     }
40 
41     iv = (unsigned char *)ivec;
42     if (encrypt) {
43         while (l--) {
44             if (n == 0) {
45                 n2l(iv, v0);
46                 ti[0] = v0;
47                 n2l(iv, v1);
48                 ti[1] = v1;
49                 IDEA_encrypt((unsigned long *)ti, schedule);
50                 iv = (unsigned char *)ivec;
51                 t = ti[0];
52                 l2n(t, iv);
53                 t = ti[1];
54                 l2n(t, iv);
55                 iv = (unsigned char *)ivec;
56             }
57             c = *(in++) ^ iv[n];
58             *(out++) = c;
59             iv[n] = c;
60             n = (n + 1) & 0x07;
61         }
62     } else {
63         while (l--) {
64             if (n == 0) {
65                 n2l(iv, v0);
66                 ti[0] = v0;
67                 n2l(iv, v1);
68                 ti[1] = v1;
69                 IDEA_encrypt((unsigned long *)ti, schedule);
70                 iv = (unsigned char *)ivec;
71                 t = ti[0];
72                 l2n(t, iv);
73                 t = ti[1];
74                 l2n(t, iv);
75                 iv = (unsigned char *)ivec;
76             }
77             cc = *(in++);
78             c = iv[n];
79             iv[n] = cc;
80             *(out++) = c ^ cc;
81             n = (n + 1) & 0x07;
82         }
83     }
84     v0 = v1 = ti[0] = ti[1] = t = c = cc = 0;
85     *num = n;
86 }
87