| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 | /* * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. * * Licensed under the Apache License 2.0 (the "License").  You may not use * this file except in compliance with the License.  You can obtain a copy * in the file LICENSE in the source distribution or at * https://www.openssl.org/source/license.html *//* * IDEA low level APIs are deprecated for public use, but still ok for internal * use where we're using them to implement the higher level EVP interface, as is * the case here. */#include "internal/deprecated.h"#include <openssl/idea.h>#include "idea_local.h"/* * The input and output encrypted as though 64bit cfb mode is being used. * The extra state information to record how much of the 64bit block we have * used is contained in *num; */void IDEA_cfb64_encrypt(const unsigned char *in, unsigned char *out,                        long length, IDEA_KEY_SCHEDULE *schedule,                        unsigned char *ivec, int *num, int encrypt){    register unsigned long v0, v1, t;    register int n = *num;    register long l = length;    unsigned long ti[2];    unsigned char *iv, c, cc;    if (n < 0) {        *num = -1;        return;    }    iv = (unsigned char *)ivec;    if (encrypt) {        while (l--) {            if (n == 0) {                n2l(iv, v0);                ti[0] = v0;                n2l(iv, v1);                ti[1] = v1;                IDEA_encrypt((unsigned long *)ti, schedule);                iv = (unsigned char *)ivec;                t = ti[0];                l2n(t, iv);                t = ti[1];                l2n(t, iv);                iv = (unsigned char *)ivec;            }            c = *(in++) ^ iv[n];            *(out++) = c;            iv[n] = c;            n = (n + 1) & 0x07;        }    } else {        while (l--) {            if (n == 0) {                n2l(iv, v0);                ti[0] = v0;                n2l(iv, v1);                ti[1] = v1;                IDEA_encrypt((unsigned long *)ti, schedule);                iv = (unsigned char *)ivec;                t = ti[0];                l2n(t, iv);                t = ti[1];                l2n(t, iv);                iv = (unsigned char *)ivec;            }            cc = *(in++);            c = iv[n];            iv[n] = cc;            *(out++) = c ^ cc;            n = (n + 1) & 0x07;        }    }    v0 = v1 = ti[0] = ti[1] = t = c = cc = 0;    *num = n;}
 |