1 /* 2 * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. 3 * 4 * Licensed under the Apache License 2.0 (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 /* 11 * DES low level APIs are deprecated for public use, but still ok for internal 12 * use. 13 */ 14 #include "internal/deprecated.h" 15 16 #include "des_local.h" 17 18 /* 19 * The input and output encrypted as though 64bit ofb mode is being used. 20 * The extra state information to record how much of the 64bit block we have 21 * used is contained in *num; 22 */ 23 void DES_ofb64_encrypt(register const unsigned char *in, 24 register unsigned char *out, long length, 25 DES_key_schedule *schedule, DES_cblock *ivec, int *num) 26 { 27 register DES_LONG v0, v1, t; 28 register int n = *num; 29 register long l = length; 30 DES_cblock d; 31 register unsigned char *dp; 32 DES_LONG ti[2]; 33 unsigned char *iv; 34 int save = 0; 35 36 iv = &(*ivec)[0]; 37 c2l(iv, v0); 38 c2l(iv, v1); 39 ti[0] = v0; 40 ti[1] = v1; 41 dp = d; 42 l2c(v0, dp); 43 l2c(v1, dp); 44 while (l--) { 45 if (n == 0) { 46 DES_encrypt1(ti, schedule, DES_ENCRYPT); 47 dp = d; 48 t = ti[0]; 49 l2c(t, dp); 50 t = ti[1]; 51 l2c(t, dp); 52 save++; 53 } 54 *(out++) = *(in++) ^ d[n]; 55 n = (n + 1) & 0x07; 56 } 57 if (save) { 58 v0 = ti[0]; 59 v1 = ti[1]; 60 iv = &(*ivec)[0]; 61 l2c(v0, iv); 62 l2c(v1, iv); 63 } 64 t = v0 = v1 = ti[0] = ti[1] = 0; 65 *num = n; 66 } 67