1e71b7053SJung-uk Kim /*
2b077aed3SPierre Pronchery * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved.
374664626SKris Kennaway *
4b077aed3SPierre 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
10b077aed3SPierre Pronchery /*
11b077aed3SPierre Pronchery * RC2 low level APIs are deprecated for public use, but still ok for internal
12b077aed3SPierre Pronchery * use.
13b077aed3SPierre Pronchery */
14b077aed3SPierre Pronchery #include "internal/deprecated.h"
15b077aed3SPierre 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 ofb 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 */
RC2_ofb64_encrypt(const unsigned char * in,unsigned char * out,long length,RC2_KEY * schedule,unsigned char * ivec,int * num)24ddd58736SKris Kennaway void RC2_ofb64_encrypt(const unsigned char *in, unsigned char *out,
25ddd58736SKris Kennaway long length, RC2_KEY *schedule, unsigned char *ivec,
26ddd58736SKris Kennaway int *num)
2774664626SKris Kennaway {
2874664626SKris Kennaway register unsigned long v0, v1, t;
2974664626SKris Kennaway register int n = *num;
3074664626SKris Kennaway register long l = length;
3174664626SKris Kennaway unsigned char d[8];
3274664626SKris Kennaway register char *dp;
3374664626SKris Kennaway unsigned long ti[2];
3474664626SKris Kennaway unsigned char *iv;
3574664626SKris Kennaway int save = 0;
3674664626SKris Kennaway
3774664626SKris Kennaway iv = (unsigned char *)ivec;
3874664626SKris Kennaway c2l(iv, v0);
3974664626SKris Kennaway c2l(iv, v1);
4074664626SKris Kennaway ti[0] = v0;
4174664626SKris Kennaway ti[1] = v1;
4274664626SKris Kennaway dp = (char *)d;
4374664626SKris Kennaway l2c(v0, dp);
4474664626SKris Kennaway l2c(v1, dp);
456f9291ceSJung-uk Kim while (l--) {
466f9291ceSJung-uk Kim if (n == 0) {
4774664626SKris Kennaway RC2_encrypt((unsigned long *)ti, schedule);
4874664626SKris Kennaway dp = (char *)d;
496f9291ceSJung-uk Kim t = ti[0];
506f9291ceSJung-uk Kim l2c(t, dp);
516f9291ceSJung-uk Kim t = ti[1];
526f9291ceSJung-uk Kim l2c(t, dp);
5374664626SKris Kennaway save++;
5474664626SKris Kennaway }
5574664626SKris Kennaway *(out++) = *(in++) ^ d[n];
5674664626SKris Kennaway n = (n + 1) & 0x07;
5774664626SKris Kennaway }
586f9291ceSJung-uk Kim if (save) {
5974664626SKris Kennaway v0 = ti[0];
6074664626SKris Kennaway v1 = ti[1];
6174664626SKris Kennaway iv = (unsigned char *)ivec;
6274664626SKris Kennaway l2c(v0, iv);
6374664626SKris Kennaway l2c(v1, iv);
6474664626SKris Kennaway }
6574664626SKris Kennaway t = v0 = v1 = ti[0] = ti[1] = 0;
6674664626SKris Kennaway *num = n;
6774664626SKris Kennaway }
68