xref: /freebsd/crypto/openssl/crypto/rc2/rc2ofb64.c (revision b077aed3)
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