| /* |
| * Copyright 1995-2020 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 |
| */ |
| |
| /* |
| * DES low level APIs are deprecated for public use, but still ok for internal |
| * use. |
| */ |
| #include "internal/deprecated.h" |
| |
| #include "des_local.h" |
| |
| DES_LONG DES_cbc_cksum(const unsigned char *in, DES_cblock *output, |
| long length, DES_key_schedule *schedule, |
| const_DES_cblock *ivec) |
| { |
| register DES_LONG tout0, tout1, tin0, tin1; |
| register long l = length; |
| DES_LONG tin[2]; |
| unsigned char *out = &(*output)[0]; |
| const unsigned char *iv = &(*ivec)[0]; |
| |
| c2l(iv, tout0); |
| c2l(iv, tout1); |
| for (; l > 0; l -= 8) { |
| if (l >= 8) { |
| c2l(in, tin0); |
| c2l(in, tin1); |
| } else |
| c2ln(in, tin0, tin1, l); |
| |
| tin0 ^= tout0; |
| tin[0] = tin0; |
| tin1 ^= tout1; |
| tin[1] = tin1; |
| DES_encrypt1((DES_LONG *)tin, schedule, DES_ENCRYPT); |
| tout0 = tin[0]; |
| tout1 = tin[1]; |
| } |
| if (out != NULL) { |
| l2c(tout0, out); |
| l2c(tout1, out); |
| } |
| tout0 = tin0 = tin1 = tin[0] = tin[1] = 0; |
| /* |
| * Transform the data in tout1 so that it will match the return value |
| * that the MIT Kerberos mit_des_cbc_cksum API returns. |
| */ |
| tout1 = ((tout1 >> 24L) & 0x000000FF) |
| | ((tout1 >> 8L) & 0x0000FF00) |
| | ((tout1 << 8L) & 0x00FF0000) |
| | ((tout1 << 24L) & 0xFF000000); |
| return tout1; |
| } |