xref: /freebsd/crypto/openssl/crypto/rc2/rc2cfb64.c (revision b077aed33b7b6aefca7b17ddb250cf521f938613)
1e71b7053SJung-uk Kim /*
2*b077aed3SPierre Pronchery  * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved.
374664626SKris Kennaway  *
4*b077aed3SPierre Pronchery  * Licensed under the Apache License 2.0 (the "License").  You may not use
5e71b7053SJung-uk Kim  * this file except in compliance with the License.  You can obtain a copy
6e71b7053SJung-uk Kim  * in the file LICENSE in the source distribution or at
7e71b7053SJung-uk Kim  * https://www.openssl.org/source/license.html
874664626SKris Kennaway  */
974664626SKris Kennaway 
10*b077aed3SPierre Pronchery /*
11*b077aed3SPierre Pronchery  * RC2 low level APIs are deprecated for public use, but still ok for internal
12*b077aed3SPierre Pronchery  * use.
13*b077aed3SPierre Pronchery  */
14*b077aed3SPierre Pronchery #include "internal/deprecated.h"
15*b077aed3SPierre Pronchery 
1674664626SKris Kennaway #include <openssl/rc2.h>
1717f01e99SJung-uk Kim #include "rc2_local.h"
1874664626SKris Kennaway 
196f9291ceSJung-uk Kim /*
206f9291ceSJung-uk Kim  * The input and output encrypted as though 64bit cfb mode is being used.
216f9291ceSJung-uk Kim  * The extra state information to record how much of the 64bit block we have
226f9291ceSJung-uk Kim  * used is contained in *num;
2374664626SKris Kennaway  */
2474664626SKris Kennaway 
RC2_cfb64_encrypt(const unsigned char * in,unsigned char * out,long length,RC2_KEY * schedule,unsigned char * ivec,int * num,int encrypt)25ddd58736SKris Kennaway void RC2_cfb64_encrypt(const unsigned char *in, unsigned char *out,
26ddd58736SKris Kennaway                        long length, RC2_KEY *schedule, unsigned char *ivec,
27ddd58736SKris Kennaway                        int *num, int encrypt)
2874664626SKris Kennaway {
2974664626SKris Kennaway     register unsigned long v0, v1, t;
3074664626SKris Kennaway     register int n = *num;
3174664626SKris Kennaway     register long l = length;
3274664626SKris Kennaway     unsigned long ti[2];
3374664626SKris Kennaway     unsigned char *iv, c, cc;
3474664626SKris Kennaway 
3574664626SKris Kennaway     iv = (unsigned char *)ivec;
366f9291ceSJung-uk Kim     if (encrypt) {
376f9291ceSJung-uk Kim         while (l--) {
386f9291ceSJung-uk Kim             if (n == 0) {
396f9291ceSJung-uk Kim                 c2l(iv, v0);
406f9291ceSJung-uk Kim                 ti[0] = v0;
416f9291ceSJung-uk Kim                 c2l(iv, v1);
426f9291ceSJung-uk Kim                 ti[1] = v1;
4374664626SKris Kennaway                 RC2_encrypt((unsigned long *)ti, schedule);
4474664626SKris Kennaway                 iv = (unsigned char *)ivec;
456f9291ceSJung-uk Kim                 t = ti[0];
466f9291ceSJung-uk Kim                 l2c(t, iv);
476f9291ceSJung-uk Kim                 t = ti[1];
486f9291ceSJung-uk Kim                 l2c(t, iv);
4974664626SKris Kennaway                 iv = (unsigned char *)ivec;
5074664626SKris Kennaway             }
5174664626SKris Kennaway             c = *(in++) ^ iv[n];
5274664626SKris Kennaway             *(out++) = c;
5374664626SKris Kennaway             iv[n] = c;
5474664626SKris Kennaway             n = (n + 1) & 0x07;
5574664626SKris Kennaway         }
566f9291ceSJung-uk Kim     } else {
576f9291ceSJung-uk Kim         while (l--) {
586f9291ceSJung-uk Kim             if (n == 0) {
596f9291ceSJung-uk Kim                 c2l(iv, v0);
606f9291ceSJung-uk Kim                 ti[0] = v0;
616f9291ceSJung-uk Kim                 c2l(iv, v1);
626f9291ceSJung-uk Kim                 ti[1] = v1;
6374664626SKris Kennaway                 RC2_encrypt((unsigned long *)ti, schedule);
6474664626SKris Kennaway                 iv = (unsigned char *)ivec;
656f9291ceSJung-uk Kim                 t = ti[0];
666f9291ceSJung-uk Kim                 l2c(t, iv);
676f9291ceSJung-uk Kim                 t = ti[1];
686f9291ceSJung-uk Kim                 l2c(t, iv);
6974664626SKris Kennaway                 iv = (unsigned char *)ivec;
7074664626SKris Kennaway             }
7174664626SKris Kennaway             cc = *(in++);
7274664626SKris Kennaway             c = iv[n];
7374664626SKris Kennaway             iv[n] = cc;
7474664626SKris Kennaway             *(out++) = c ^ cc;
7574664626SKris Kennaway             n = (n + 1) & 0x07;
7674664626SKris Kennaway         }
7774664626SKris Kennaway     }
7874664626SKris Kennaway     v0 = v1 = ti[0] = ti[1] = t = c = cc = 0;
7974664626SKris Kennaway     *num = n;
8074664626SKris Kennaway }
81