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