| lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame] | 1 | /* | 
|  | 2 | * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. | 
|  | 3 | * | 
|  | 4 | * Licensed under the OpenSSL license (the "License").  You may not use | 
|  | 5 | * this file except in compliance with the License.  You can obtain a copy | 
|  | 6 | * in the file LICENSE in the source distribution or at | 
|  | 7 | * https://www.openssl.org/source/license.html | 
|  | 8 | */ | 
|  | 9 |  | 
|  | 10 | #include <openssl/rc5.h> | 
|  | 11 | #include "rc5_local.h" | 
|  | 12 |  | 
|  | 13 | /* | 
|  | 14 | * The input and output encrypted as though 64bit cfb mode is being used. | 
|  | 15 | * The extra state information to record how much of the 64bit block we have | 
|  | 16 | * used is contained in *num; | 
|  | 17 | */ | 
|  | 18 |  | 
|  | 19 | void RC5_32_cfb64_encrypt(const unsigned char *in, unsigned char *out, | 
|  | 20 | long length, RC5_32_KEY *schedule, | 
|  | 21 | unsigned char *ivec, int *num, int encrypt) | 
|  | 22 | { | 
|  | 23 | register unsigned long v0, v1, t; | 
|  | 24 | register int n = *num; | 
|  | 25 | register long l = length; | 
|  | 26 | unsigned long ti[2]; | 
|  | 27 | unsigned char *iv, c, cc; | 
|  | 28 |  | 
|  | 29 | iv = (unsigned char *)ivec; | 
|  | 30 | if (encrypt) { | 
|  | 31 | while (l--) { | 
|  | 32 | if (n == 0) { | 
|  | 33 | c2l(iv, v0); | 
|  | 34 | ti[0] = v0; | 
|  | 35 | c2l(iv, v1); | 
|  | 36 | ti[1] = v1; | 
|  | 37 | RC5_32_encrypt((unsigned long *)ti, schedule); | 
|  | 38 | iv = (unsigned char *)ivec; | 
|  | 39 | t = ti[0]; | 
|  | 40 | l2c(t, iv); | 
|  | 41 | t = ti[1]; | 
|  | 42 | l2c(t, iv); | 
|  | 43 | iv = (unsigned char *)ivec; | 
|  | 44 | } | 
|  | 45 | c = *(in++) ^ iv[n]; | 
|  | 46 | *(out++) = c; | 
|  | 47 | iv[n] = c; | 
|  | 48 | n = (n + 1) & 0x07; | 
|  | 49 | } | 
|  | 50 | } else { | 
|  | 51 | while (l--) { | 
|  | 52 | if (n == 0) { | 
|  | 53 | c2l(iv, v0); | 
|  | 54 | ti[0] = v0; | 
|  | 55 | c2l(iv, v1); | 
|  | 56 | ti[1] = v1; | 
|  | 57 | RC5_32_encrypt((unsigned long *)ti, schedule); | 
|  | 58 | iv = (unsigned char *)ivec; | 
|  | 59 | t = ti[0]; | 
|  | 60 | l2c(t, iv); | 
|  | 61 | t = ti[1]; | 
|  | 62 | l2c(t, iv); | 
|  | 63 | iv = (unsigned char *)ivec; | 
|  | 64 | } | 
|  | 65 | cc = *(in++); | 
|  | 66 | c = iv[n]; | 
|  | 67 | iv[n] = cc; | 
|  | 68 | *(out++) = c ^ cc; | 
|  | 69 | n = (n + 1) & 0x07; | 
|  | 70 | } | 
|  | 71 | } | 
|  | 72 | v0 = v1 = ti[0] = ti[1] = t = c = cc = 0; | 
|  | 73 | *num = n; | 
|  | 74 | } |