1e1051a39Sopenharmony_ci/* 2e1051a39Sopenharmony_ci * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved. 3e1051a39Sopenharmony_ci * 4e1051a39Sopenharmony_ci * Licensed under the Apache License 2.0 (the "License"). You may not use 5e1051a39Sopenharmony_ci * this file except in compliance with the License. You can obtain a copy 6e1051a39Sopenharmony_ci * in the file LICENSE in the source distribution or at 7e1051a39Sopenharmony_ci * https://www.openssl.org/source/license.html 8e1051a39Sopenharmony_ci */ 9e1051a39Sopenharmony_ci 10e1051a39Sopenharmony_ci/* 11e1051a39Sopenharmony_ci * DES low level APIs are deprecated for public use, but still ok for internal 12e1051a39Sopenharmony_ci * use. 13e1051a39Sopenharmony_ci */ 14e1051a39Sopenharmony_ci#include "internal/deprecated.h" 15e1051a39Sopenharmony_ci 16e1051a39Sopenharmony_ci#include <openssl/e_os2.h> 17e1051a39Sopenharmony_ci#include <string.h> 18e1051a39Sopenharmony_ci 19e1051a39Sopenharmony_ci#include "testutil.h" 20e1051a39Sopenharmony_ci#include "internal/nelem.h" 21e1051a39Sopenharmony_ci 22e1051a39Sopenharmony_ci#ifndef OPENSSL_NO_DES 23e1051a39Sopenharmony_ci# include <openssl/des.h> 24e1051a39Sopenharmony_ci 25e1051a39Sopenharmony_ci/* In case any platform doesn't use unsigned int for its checksums */ 26e1051a39Sopenharmony_ci# define TEST_cs_eq TEST_uint_eq 27e1051a39Sopenharmony_ci 28e1051a39Sopenharmony_ci# define DATA_BUF_SIZE 20 29e1051a39Sopenharmony_ci 30e1051a39Sopenharmony_ci/* tisk tisk - the test keys don't all have odd parity :-( */ 31e1051a39Sopenharmony_ci/* test data */ 32e1051a39Sopenharmony_ci# define NUM_TESTS 34 33e1051a39Sopenharmony_cistatic unsigned char key_data[NUM_TESTS][8] = { 34e1051a39Sopenharmony_ci {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 35e1051a39Sopenharmony_ci {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, 36e1051a39Sopenharmony_ci {0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 37e1051a39Sopenharmony_ci {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11}, 38e1051a39Sopenharmony_ci {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF}, 39e1051a39Sopenharmony_ci {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11}, 40e1051a39Sopenharmony_ci {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 41e1051a39Sopenharmony_ci {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}, 42e1051a39Sopenharmony_ci {0x7C, 0xA1, 0x10, 0x45, 0x4A, 0x1A, 0x6E, 0x57}, 43e1051a39Sopenharmony_ci {0x01, 0x31, 0xD9, 0x61, 0x9D, 0xC1, 0x37, 0x6E}, 44e1051a39Sopenharmony_ci {0x07, 0xA1, 0x13, 0x3E, 0x4A, 0x0B, 0x26, 0x86}, 45e1051a39Sopenharmony_ci {0x38, 0x49, 0x67, 0x4C, 0x26, 0x02, 0x31, 0x9E}, 46e1051a39Sopenharmony_ci {0x04, 0xB9, 0x15, 0xBA, 0x43, 0xFE, 0xB5, 0xB6}, 47e1051a39Sopenharmony_ci {0x01, 0x13, 0xB9, 0x70, 0xFD, 0x34, 0xF2, 0xCE}, 48e1051a39Sopenharmony_ci {0x01, 0x70, 0xF1, 0x75, 0x46, 0x8F, 0xB5, 0xE6}, 49e1051a39Sopenharmony_ci {0x43, 0x29, 0x7F, 0xAD, 0x38, 0xE3, 0x73, 0xFE}, 50e1051a39Sopenharmony_ci {0x07, 0xA7, 0x13, 0x70, 0x45, 0xDA, 0x2A, 0x16}, 51e1051a39Sopenharmony_ci {0x04, 0x68, 0x91, 0x04, 0xC2, 0xFD, 0x3B, 0x2F}, 52e1051a39Sopenharmony_ci {0x37, 0xD0, 0x6B, 0xB5, 0x16, 0xCB, 0x75, 0x46}, 53e1051a39Sopenharmony_ci {0x1F, 0x08, 0x26, 0x0D, 0x1A, 0xC2, 0x46, 0x5E}, 54e1051a39Sopenharmony_ci {0x58, 0x40, 0x23, 0x64, 0x1A, 0xBA, 0x61, 0x76}, 55e1051a39Sopenharmony_ci {0x02, 0x58, 0x16, 0x16, 0x46, 0x29, 0xB0, 0x07}, 56e1051a39Sopenharmony_ci {0x49, 0x79, 0x3E, 0xBC, 0x79, 0xB3, 0x25, 0x8F}, 57e1051a39Sopenharmony_ci {0x4F, 0xB0, 0x5E, 0x15, 0x15, 0xAB, 0x73, 0xA7}, 58e1051a39Sopenharmony_ci {0x49, 0xE9, 0x5D, 0x6D, 0x4C, 0xA2, 0x29, 0xBF}, 59e1051a39Sopenharmony_ci {0x01, 0x83, 0x10, 0xDC, 0x40, 0x9B, 0x26, 0xD6}, 60e1051a39Sopenharmony_ci {0x1C, 0x58, 0x7F, 0x1C, 0x13, 0x92, 0x4F, 0xEF}, 61e1051a39Sopenharmony_ci {0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 62e1051a39Sopenharmony_ci {0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E}, 63e1051a39Sopenharmony_ci {0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE}, 64e1051a39Sopenharmony_ci {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 65e1051a39Sopenharmony_ci {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, 66e1051a39Sopenharmony_ci {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF}, 67e1051a39Sopenharmony_ci {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10} 68e1051a39Sopenharmony_ci}; 69e1051a39Sopenharmony_ci 70e1051a39Sopenharmony_cistatic unsigned char plain_data[NUM_TESTS][8] = { 71e1051a39Sopenharmony_ci {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 72e1051a39Sopenharmony_ci {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, 73e1051a39Sopenharmony_ci {0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}, 74e1051a39Sopenharmony_ci {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11}, 75e1051a39Sopenharmony_ci {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11}, 76e1051a39Sopenharmony_ci {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF}, 77e1051a39Sopenharmony_ci {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 78e1051a39Sopenharmony_ci {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF}, 79e1051a39Sopenharmony_ci {0x01, 0xA1, 0xD6, 0xD0, 0x39, 0x77, 0x67, 0x42}, 80e1051a39Sopenharmony_ci {0x5C, 0xD5, 0x4C, 0xA8, 0x3D, 0xEF, 0x57, 0xDA}, 81e1051a39Sopenharmony_ci {0x02, 0x48, 0xD4, 0x38, 0x06, 0xF6, 0x71, 0x72}, 82e1051a39Sopenharmony_ci {0x51, 0x45, 0x4B, 0x58, 0x2D, 0xDF, 0x44, 0x0A}, 83e1051a39Sopenharmony_ci {0x42, 0xFD, 0x44, 0x30, 0x59, 0x57, 0x7F, 0xA2}, 84e1051a39Sopenharmony_ci {0x05, 0x9B, 0x5E, 0x08, 0x51, 0xCF, 0x14, 0x3A}, 85e1051a39Sopenharmony_ci {0x07, 0x56, 0xD8, 0xE0, 0x77, 0x47, 0x61, 0xD2}, 86e1051a39Sopenharmony_ci {0x76, 0x25, 0x14, 0xB8, 0x29, 0xBF, 0x48, 0x6A}, 87e1051a39Sopenharmony_ci {0x3B, 0xDD, 0x11, 0x90, 0x49, 0x37, 0x28, 0x02}, 88e1051a39Sopenharmony_ci {0x26, 0x95, 0x5F, 0x68, 0x35, 0xAF, 0x60, 0x9A}, 89e1051a39Sopenharmony_ci {0x16, 0x4D, 0x5E, 0x40, 0x4F, 0x27, 0x52, 0x32}, 90e1051a39Sopenharmony_ci {0x6B, 0x05, 0x6E, 0x18, 0x75, 0x9F, 0x5C, 0xCA}, 91e1051a39Sopenharmony_ci {0x00, 0x4B, 0xD6, 0xEF, 0x09, 0x17, 0x60, 0x62}, 92e1051a39Sopenharmony_ci {0x48, 0x0D, 0x39, 0x00, 0x6E, 0xE7, 0x62, 0xF2}, 93e1051a39Sopenharmony_ci {0x43, 0x75, 0x40, 0xC8, 0x69, 0x8F, 0x3C, 0xFA}, 94e1051a39Sopenharmony_ci {0x07, 0x2D, 0x43, 0xA0, 0x77, 0x07, 0x52, 0x92}, 95e1051a39Sopenharmony_ci {0x02, 0xFE, 0x55, 0x77, 0x81, 0x17, 0xF1, 0x2A}, 96e1051a39Sopenharmony_ci {0x1D, 0x9D, 0x5C, 0x50, 0x18, 0xF7, 0x28, 0xC2}, 97e1051a39Sopenharmony_ci {0x30, 0x55, 0x32, 0x28, 0x6D, 0x6F, 0x29, 0x5A}, 98e1051a39Sopenharmony_ci {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF}, 99e1051a39Sopenharmony_ci {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF}, 100e1051a39Sopenharmony_ci {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF}, 101e1051a39Sopenharmony_ci {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, 102e1051a39Sopenharmony_ci {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 103e1051a39Sopenharmony_ci {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 104e1051a39Sopenharmony_ci {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF} 105e1051a39Sopenharmony_ci}; 106e1051a39Sopenharmony_ci 107e1051a39Sopenharmony_cistatic unsigned char cipher_data[NUM_TESTS][8] = { 108e1051a39Sopenharmony_ci {0x8C, 0xA6, 0x4D, 0xE9, 0xC1, 0xB1, 0x23, 0xA7}, 109e1051a39Sopenharmony_ci {0x73, 0x59, 0xB2, 0x16, 0x3E, 0x4E, 0xDC, 0x58}, 110e1051a39Sopenharmony_ci {0x95, 0x8E, 0x6E, 0x62, 0x7A, 0x05, 0x55, 0x7B}, 111e1051a39Sopenharmony_ci {0xF4, 0x03, 0x79, 0xAB, 0x9E, 0x0E, 0xC5, 0x33}, 112e1051a39Sopenharmony_ci {0x17, 0x66, 0x8D, 0xFC, 0x72, 0x92, 0x53, 0x2D}, 113e1051a39Sopenharmony_ci {0x8A, 0x5A, 0xE1, 0xF8, 0x1A, 0xB8, 0xF2, 0xDD}, 114e1051a39Sopenharmony_ci {0x8C, 0xA6, 0x4D, 0xE9, 0xC1, 0xB1, 0x23, 0xA7}, 115e1051a39Sopenharmony_ci {0xED, 0x39, 0xD9, 0x50, 0xFA, 0x74, 0xBC, 0xC4}, 116e1051a39Sopenharmony_ci {0x69, 0x0F, 0x5B, 0x0D, 0x9A, 0x26, 0x93, 0x9B}, 117e1051a39Sopenharmony_ci {0x7A, 0x38, 0x9D, 0x10, 0x35, 0x4B, 0xD2, 0x71}, 118e1051a39Sopenharmony_ci {0x86, 0x8E, 0xBB, 0x51, 0xCA, 0xB4, 0x59, 0x9A}, 119e1051a39Sopenharmony_ci {0x71, 0x78, 0x87, 0x6E, 0x01, 0xF1, 0x9B, 0x2A}, 120e1051a39Sopenharmony_ci {0xAF, 0x37, 0xFB, 0x42, 0x1F, 0x8C, 0x40, 0x95}, 121e1051a39Sopenharmony_ci {0x86, 0xA5, 0x60, 0xF1, 0x0E, 0xC6, 0xD8, 0x5B}, 122e1051a39Sopenharmony_ci {0x0C, 0xD3, 0xDA, 0x02, 0x00, 0x21, 0xDC, 0x09}, 123e1051a39Sopenharmony_ci {0xEA, 0x67, 0x6B, 0x2C, 0xB7, 0xDB, 0x2B, 0x7A}, 124e1051a39Sopenharmony_ci {0xDF, 0xD6, 0x4A, 0x81, 0x5C, 0xAF, 0x1A, 0x0F}, 125e1051a39Sopenharmony_ci {0x5C, 0x51, 0x3C, 0x9C, 0x48, 0x86, 0xC0, 0x88}, 126e1051a39Sopenharmony_ci {0x0A, 0x2A, 0xEE, 0xAE, 0x3F, 0xF4, 0xAB, 0x77}, 127e1051a39Sopenharmony_ci {0xEF, 0x1B, 0xF0, 0x3E, 0x5D, 0xFA, 0x57, 0x5A}, 128e1051a39Sopenharmony_ci {0x88, 0xBF, 0x0D, 0xB6, 0xD7, 0x0D, 0xEE, 0x56}, 129e1051a39Sopenharmony_ci {0xA1, 0xF9, 0x91, 0x55, 0x41, 0x02, 0x0B, 0x56}, 130e1051a39Sopenharmony_ci {0x6F, 0xBF, 0x1C, 0xAF, 0xCF, 0xFD, 0x05, 0x56}, 131e1051a39Sopenharmony_ci {0x2F, 0x22, 0xE4, 0x9B, 0xAB, 0x7C, 0xA1, 0xAC}, 132e1051a39Sopenharmony_ci {0x5A, 0x6B, 0x61, 0x2C, 0xC2, 0x6C, 0xCE, 0x4A}, 133e1051a39Sopenharmony_ci {0x5F, 0x4C, 0x03, 0x8E, 0xD1, 0x2B, 0x2E, 0x41}, 134e1051a39Sopenharmony_ci {0x63, 0xFA, 0xC0, 0xD0, 0x34, 0xD9, 0xF7, 0x93}, 135e1051a39Sopenharmony_ci {0x61, 0x7B, 0x3A, 0x0C, 0xE8, 0xF0, 0x71, 0x00}, 136e1051a39Sopenharmony_ci {0xDB, 0x95, 0x86, 0x05, 0xF8, 0xC8, 0xC6, 0x06}, 137e1051a39Sopenharmony_ci {0xED, 0xBF, 0xD1, 0xC6, 0x6C, 0x29, 0xCC, 0xC7}, 138e1051a39Sopenharmony_ci {0x35, 0x55, 0x50, 0xB2, 0x15, 0x0E, 0x24, 0x51}, 139e1051a39Sopenharmony_ci {0xCA, 0xAA, 0xAF, 0x4D, 0xEA, 0xF1, 0xDB, 0xAE}, 140e1051a39Sopenharmony_ci {0xD5, 0xD4, 0x4F, 0xF7, 0x20, 0x68, 0x3D, 0x0D}, 141e1051a39Sopenharmony_ci {0x2A, 0x2B, 0xB0, 0x08, 0xDF, 0x97, 0xC2, 0xF2} 142e1051a39Sopenharmony_ci}; 143e1051a39Sopenharmony_ci 144e1051a39Sopenharmony_cistatic unsigned char cipher_ecb2[NUM_TESTS - 1][8] = { 145e1051a39Sopenharmony_ci {0x92, 0x95, 0xB5, 0x9B, 0xB3, 0x84, 0x73, 0x6E}, 146e1051a39Sopenharmony_ci {0x19, 0x9E, 0x9D, 0x6D, 0xF3, 0x9A, 0xA8, 0x16}, 147e1051a39Sopenharmony_ci {0x2A, 0x4B, 0x4D, 0x24, 0x52, 0x43, 0x84, 0x27}, 148e1051a39Sopenharmony_ci {0x35, 0x84, 0x3C, 0x01, 0x9D, 0x18, 0xC5, 0xB6}, 149e1051a39Sopenharmony_ci {0x4A, 0x5B, 0x2F, 0x42, 0xAA, 0x77, 0x19, 0x25}, 150e1051a39Sopenharmony_ci {0xA0, 0x6B, 0xA9, 0xB8, 0xCA, 0x5B, 0x17, 0x8A}, 151e1051a39Sopenharmony_ci {0xAB, 0x9D, 0xB7, 0xFB, 0xED, 0x95, 0xF2, 0x74}, 152e1051a39Sopenharmony_ci {0x3D, 0x25, 0x6C, 0x23, 0xA7, 0x25, 0x2F, 0xD6}, 153e1051a39Sopenharmony_ci {0xB7, 0x6F, 0xAB, 0x4F, 0xBD, 0xBD, 0xB7, 0x67}, 154e1051a39Sopenharmony_ci {0x8F, 0x68, 0x27, 0xD6, 0x9C, 0xF4, 0x1A, 0x10}, 155e1051a39Sopenharmony_ci {0x82, 0x57, 0xA1, 0xD6, 0x50, 0x5E, 0x81, 0x85}, 156e1051a39Sopenharmony_ci {0xA2, 0x0F, 0x0A, 0xCD, 0x80, 0x89, 0x7D, 0xFA}, 157e1051a39Sopenharmony_ci {0xCD, 0x2A, 0x53, 0x3A, 0xDB, 0x0D, 0x7E, 0xF3}, 158e1051a39Sopenharmony_ci {0xD2, 0xC2, 0xBE, 0x27, 0xE8, 0x1B, 0x68, 0xE3}, 159e1051a39Sopenharmony_ci {0xE9, 0x24, 0xCF, 0x4F, 0x89, 0x3C, 0x5B, 0x0A}, 160e1051a39Sopenharmony_ci {0xA7, 0x18, 0xC3, 0x9F, 0xFA, 0x9F, 0xD7, 0x69}, 161e1051a39Sopenharmony_ci {0x77, 0x2C, 0x79, 0xB1, 0xD2, 0x31, 0x7E, 0xB1}, 162e1051a39Sopenharmony_ci {0x49, 0xAB, 0x92, 0x7F, 0xD0, 0x22, 0x00, 0xB7}, 163e1051a39Sopenharmony_ci {0xCE, 0x1C, 0x6C, 0x7D, 0x85, 0xE3, 0x4A, 0x6F}, 164e1051a39Sopenharmony_ci {0xBE, 0x91, 0xD6, 0xE1, 0x27, 0xB2, 0xE9, 0x87}, 165e1051a39Sopenharmony_ci {0x70, 0x28, 0xAE, 0x8F, 0xD1, 0xF5, 0x74, 0x1A}, 166e1051a39Sopenharmony_ci {0xAA, 0x37, 0x80, 0xBB, 0xF3, 0x22, 0x1D, 0xDE}, 167e1051a39Sopenharmony_ci {0xA6, 0xC4, 0xD2, 0x5E, 0x28, 0x93, 0xAC, 0xB3}, 168e1051a39Sopenharmony_ci {0x22, 0x07, 0x81, 0x5A, 0xE4, 0xB7, 0x1A, 0xAD}, 169e1051a39Sopenharmony_ci {0xDC, 0xCE, 0x05, 0xE7, 0x07, 0xBD, 0xF5, 0x84}, 170e1051a39Sopenharmony_ci {0x26, 0x1D, 0x39, 0x2C, 0xB3, 0xBA, 0xA5, 0x85}, 171e1051a39Sopenharmony_ci {0xB4, 0xF7, 0x0F, 0x72, 0xFB, 0x04, 0xF0, 0xDC}, 172e1051a39Sopenharmony_ci {0x95, 0xBA, 0xA9, 0x4E, 0x87, 0x36, 0xF2, 0x89}, 173e1051a39Sopenharmony_ci {0xD4, 0x07, 0x3A, 0xF1, 0x5A, 0x17, 0x82, 0x0E}, 174e1051a39Sopenharmony_ci {0xEF, 0x6F, 0xAF, 0xA7, 0x66, 0x1A, 0x7E, 0x89}, 175e1051a39Sopenharmony_ci {0xC1, 0x97, 0xF5, 0x58, 0x74, 0x8A, 0x20, 0xE7}, 176e1051a39Sopenharmony_ci {0x43, 0x34, 0xCF, 0xDA, 0x22, 0xC4, 0x86, 0xC8}, 177e1051a39Sopenharmony_ci {0x08, 0xD7, 0xB4, 0xFB, 0x62, 0x9D, 0x08, 0x85} 178e1051a39Sopenharmony_ci}; 179e1051a39Sopenharmony_ci 180e1051a39Sopenharmony_cistatic unsigned char cbc_key[8] = 181e1051a39Sopenharmony_ci { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef }; 182e1051a39Sopenharmony_cistatic unsigned char cbc2_key[8] = 183e1051a39Sopenharmony_ci { 0xf1, 0xe0, 0xd3, 0xc2, 0xb5, 0xa4, 0x97, 0x86 }; 184e1051a39Sopenharmony_cistatic unsigned char cbc3_key[8] = 185e1051a39Sopenharmony_ci { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 }; 186e1051a39Sopenharmony_cistatic unsigned char cbc_iv[8] = 187e1051a39Sopenharmony_ci { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 }; 188e1051a39Sopenharmony_ci/* 189e1051a39Sopenharmony_ci * Changed the following text constant to binary so it will work on ebcdic 190e1051a39Sopenharmony_ci * machines :-) 191e1051a39Sopenharmony_ci */ 192e1051a39Sopenharmony_ci/* static char cbc_data[40]="7654321 Now is the time for \0001"; */ 193e1051a39Sopenharmony_cistatic unsigned char cbc_data[40] = { 194e1051a39Sopenharmony_ci 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x20, 195e1051a39Sopenharmony_ci 0x4E, 0x6F, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74, 196e1051a39Sopenharmony_ci 0x68, 0x65, 0x20, 0x74, 0x69, 0x6D, 0x65, 0x20, 197e1051a39Sopenharmony_ci 0x66, 0x6F, 0x72, 0x20, 0x00, 0x31, 0x00, 0x00, 198e1051a39Sopenharmony_ci 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 199e1051a39Sopenharmony_ci}; 200e1051a39Sopenharmony_ci 201e1051a39Sopenharmony_cistatic unsigned char cbc_ok[32] = { 202e1051a39Sopenharmony_ci 0xcc, 0xd1, 0x73, 0xff, 0xab, 0x20, 0x39, 0xf4, 203e1051a39Sopenharmony_ci 0xac, 0xd8, 0xae, 0xfd, 0xdf, 0xd8, 0xa1, 0xeb, 204e1051a39Sopenharmony_ci 0x46, 0x8e, 0x91, 0x15, 0x78, 0x88, 0xba, 0x68, 205e1051a39Sopenharmony_ci 0x1d, 0x26, 0x93, 0x97, 0xf7, 0xfe, 0x62, 0xb4 206e1051a39Sopenharmony_ci}; 207e1051a39Sopenharmony_ci 208e1051a39Sopenharmony_ci# ifdef SCREW_THE_PARITY 209e1051a39Sopenharmony_ci# error "SCREW_THE_PARITY is not meant to be defined." 210e1051a39Sopenharmony_ci# error "Original vectors are preserved for reference only." 211e1051a39Sopenharmony_cistatic unsigned char cbc2_key[8] = 212e1051a39Sopenharmony_ci { 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87 }; 213e1051a39Sopenharmony_cistatic unsigned char xcbc_ok[32] = { 214e1051a39Sopenharmony_ci 0x86, 0x74, 0x81, 0x0D, 0x61, 0xA4, 0xA5, 0x48, 215e1051a39Sopenharmony_ci 0xB9, 0x93, 0x03, 0xE1, 0xB8, 0xBB, 0xBD, 0xBD, 216e1051a39Sopenharmony_ci 0x64, 0x30, 0x0B, 0xB9, 0x06, 0x65, 0x81, 0x76, 217e1051a39Sopenharmony_ci 0x04, 0x1D, 0x77, 0x62, 0x17, 0xCA, 0x2B, 0xD2, 218e1051a39Sopenharmony_ci}; 219e1051a39Sopenharmony_ci# else 220e1051a39Sopenharmony_cistatic unsigned char xcbc_ok[32] = { 221e1051a39Sopenharmony_ci 0x84, 0x6B, 0x29, 0x14, 0x85, 0x1E, 0x9A, 0x29, 222e1051a39Sopenharmony_ci 0x54, 0x73, 0x2F, 0x8A, 0xA0, 0xA6, 0x11, 0xC1, 223e1051a39Sopenharmony_ci 0x15, 0xCD, 0xC2, 0xD7, 0x95, 0x1B, 0x10, 0x53, 224e1051a39Sopenharmony_ci 0xA6, 0x3C, 0x5E, 0x03, 0xB2, 0x1A, 0xA3, 0xC4, 225e1051a39Sopenharmony_ci}; 226e1051a39Sopenharmony_ci# endif 227e1051a39Sopenharmony_ci 228e1051a39Sopenharmony_cistatic unsigned char cbc3_ok[32] = { 229e1051a39Sopenharmony_ci 0x3F, 0xE3, 0x01, 0xC9, 0x62, 0xAC, 0x01, 0xD0, 230e1051a39Sopenharmony_ci 0x22, 0x13, 0x76, 0x3C, 0x1C, 0xBD, 0x4C, 0xDC, 231e1051a39Sopenharmony_ci 0x79, 0x96, 0x57, 0xC0, 0x64, 0xEC, 0xF5, 0xD4, 232e1051a39Sopenharmony_ci 0x1C, 0x67, 0x38, 0x12, 0xCF, 0xDE, 0x96, 0x75 233e1051a39Sopenharmony_ci}; 234e1051a39Sopenharmony_ci 235e1051a39Sopenharmony_cistatic unsigned char pcbc_ok[32] = { 236e1051a39Sopenharmony_ci 0xcc, 0xd1, 0x73, 0xff, 0xab, 0x20, 0x39, 0xf4, 237e1051a39Sopenharmony_ci 0x6d, 0xec, 0xb4, 0x70, 0xa0, 0xe5, 0x6b, 0x15, 238e1051a39Sopenharmony_ci 0xae, 0xa6, 0xbf, 0x61, 0xed, 0x7d, 0x9c, 0x9f, 239e1051a39Sopenharmony_ci 0xf7, 0x17, 0x46, 0x3b, 0x8a, 0xb3, 0xcc, 0x88 240e1051a39Sopenharmony_ci}; 241e1051a39Sopenharmony_ci 242e1051a39Sopenharmony_cistatic unsigned char cfb_key[8] = 243e1051a39Sopenharmony_ci { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef }; 244e1051a39Sopenharmony_cistatic unsigned char cfb_iv[8] = 245e1051a39Sopenharmony_ci { 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef }; 246e1051a39Sopenharmony_cistatic unsigned char cfb_buf1[40], cfb_buf2[40], cfb_tmp[8]; 247e1051a39Sopenharmony_cistatic unsigned char plain[24] = { 248e1051a39Sopenharmony_ci 0x4e, 0x6f, 0x77, 0x20, 0x69, 0x73, 249e1051a39Sopenharmony_ci 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 250e1051a39Sopenharmony_ci 0x69, 0x6d, 0x65, 0x20, 0x66, 0x6f, 251e1051a39Sopenharmony_ci 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20 252e1051a39Sopenharmony_ci}; 253e1051a39Sopenharmony_ci 254e1051a39Sopenharmony_cistatic unsigned char cfb_cipher8[24] = { 255e1051a39Sopenharmony_ci 0xf3, 0x1f, 0xda, 0x07, 0x01, 0x14, 0x62, 0xee, 0x18, 0x7f, 0x43, 0xd8, 256e1051a39Sopenharmony_ci 0x0a, 0x7c, 0xd9, 0xb5, 0xb0, 0xd2, 0x90, 0xda, 0x6e, 0x5b, 0x9a, 0x87 257e1051a39Sopenharmony_ci}; 258e1051a39Sopenharmony_ci 259e1051a39Sopenharmony_cistatic unsigned char cfb_cipher16[24] = { 260e1051a39Sopenharmony_ci 0xF3, 0x09, 0x87, 0x87, 0x7F, 0x57, 0xF7, 0x3C, 0x36, 0xB6, 0xDB, 0x70, 261e1051a39Sopenharmony_ci 0xD8, 0xD5, 0x34, 0x19, 0xD3, 0x86, 0xB2, 0x23, 0xB7, 0xB2, 0xAD, 0x1B 262e1051a39Sopenharmony_ci}; 263e1051a39Sopenharmony_ci 264e1051a39Sopenharmony_cistatic unsigned char cfb_cipher32[24] = { 265e1051a39Sopenharmony_ci 0xF3, 0x09, 0x62, 0x49, 0xA4, 0xDF, 0xA4, 0x9F, 0x33, 0xDC, 0x7B, 0xAD, 266e1051a39Sopenharmony_ci 0x4C, 0xC8, 0x9F, 0x64, 0xE4, 0x53, 0xE5, 0xEC, 0x67, 0x20, 0xDA, 0xB6 267e1051a39Sopenharmony_ci}; 268e1051a39Sopenharmony_ci 269e1051a39Sopenharmony_cistatic unsigned char cfb_cipher48[24] = { 270e1051a39Sopenharmony_ci 0xF3, 0x09, 0x62, 0x49, 0xC7, 0xF4, 0x30, 0xB5, 0x15, 0xEC, 0xBB, 0x85, 271e1051a39Sopenharmony_ci 0x97, 0x5A, 0x13, 0x8C, 0x68, 0x60, 0xE2, 0x38, 0x34, 0x3C, 0xDC, 0x1F 272e1051a39Sopenharmony_ci}; 273e1051a39Sopenharmony_ci 274e1051a39Sopenharmony_cistatic unsigned char cfb_cipher64[24] = { 275e1051a39Sopenharmony_ci 0xF3, 0x09, 0x62, 0x49, 0xC7, 0xF4, 0x6E, 0x51, 0xA6, 0x9E, 0x83, 0x9B, 276e1051a39Sopenharmony_ci 0x1A, 0x92, 0xF7, 0x84, 0x03, 0x46, 0x71, 0x33, 0x89, 0x8E, 0xA6, 0x22 277e1051a39Sopenharmony_ci}; 278e1051a39Sopenharmony_ci 279e1051a39Sopenharmony_cistatic unsigned char ofb_key[8] = 280e1051a39Sopenharmony_ci { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef }; 281e1051a39Sopenharmony_cistatic unsigned char ofb_iv[8] = 282e1051a39Sopenharmony_ci { 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef }; 283e1051a39Sopenharmony_cistatic unsigned char ofb_buf1[24], ofb_buf2[24], ofb_tmp[8]; 284e1051a39Sopenharmony_cistatic unsigned char ofb_cipher[24] = { 285e1051a39Sopenharmony_ci 0xf3, 0x09, 0x62, 0x49, 0xc7, 0xf4, 0x6e, 0x51, 286e1051a39Sopenharmony_ci 0x35, 0xf2, 0x4a, 0x24, 0x2e, 0xeb, 0x3d, 0x3f, 287e1051a39Sopenharmony_ci 0x3d, 0x6d, 0x5b, 0xe3, 0x25, 0x5a, 0xf8, 0xc3 288e1051a39Sopenharmony_ci}; 289e1051a39Sopenharmony_cistatic DES_LONG cbc_cksum_ret = 0xF7FE62B4L; 290e1051a39Sopenharmony_cistatic unsigned char cbc_cksum_data[8] = 291e1051a39Sopenharmony_ci { 0x1D, 0x26, 0x93, 0x97, 0xf7, 0xfe, 0x62, 0xb4 }; 292e1051a39Sopenharmony_ci 293e1051a39Sopenharmony_cistatic char *pt(const unsigned char *p, char buf[DATA_BUF_SIZE]) 294e1051a39Sopenharmony_ci{ 295e1051a39Sopenharmony_ci char *ret; 296e1051a39Sopenharmony_ci int i; 297e1051a39Sopenharmony_ci static const char *f = "0123456789ABCDEF"; 298e1051a39Sopenharmony_ci 299e1051a39Sopenharmony_ci ret = &(buf[0]); 300e1051a39Sopenharmony_ci for (i = 0; i < 8; i++) { 301e1051a39Sopenharmony_ci ret[i * 2] = f[(p[i] >> 4) & 0xf]; 302e1051a39Sopenharmony_ci ret[i * 2 + 1] = f[p[i] & 0xf]; 303e1051a39Sopenharmony_ci } 304e1051a39Sopenharmony_ci ret[16] = '\0'; 305e1051a39Sopenharmony_ci return ret; 306e1051a39Sopenharmony_ci} 307e1051a39Sopenharmony_ci 308e1051a39Sopenharmony_cistatic int test_des_ecb(int i) 309e1051a39Sopenharmony_ci{ 310e1051a39Sopenharmony_ci DES_key_schedule ks; 311e1051a39Sopenharmony_ci DES_cblock in, out, outin; 312e1051a39Sopenharmony_ci char b1[DATA_BUF_SIZE], b2[DATA_BUF_SIZE]; 313e1051a39Sopenharmony_ci 314e1051a39Sopenharmony_ci DES_set_key_unchecked(&key_data[i], &ks); 315e1051a39Sopenharmony_ci memcpy(in, plain_data[i], 8); 316e1051a39Sopenharmony_ci memset(out, 0, 8); 317e1051a39Sopenharmony_ci memset(outin, 0, 8); 318e1051a39Sopenharmony_ci DES_ecb_encrypt(&in, &out, &ks, DES_ENCRYPT); 319e1051a39Sopenharmony_ci DES_ecb_encrypt(&out, &outin, &ks, DES_DECRYPT); 320e1051a39Sopenharmony_ci 321e1051a39Sopenharmony_ci if (!TEST_mem_eq(out, 8, cipher_data[i], 8)) { 322e1051a39Sopenharmony_ci TEST_info("Encryption error %2d k=%s p=%s", i + 1, 323e1051a39Sopenharmony_ci pt(key_data[i], b1), pt(in, b2)); 324e1051a39Sopenharmony_ci return 0; 325e1051a39Sopenharmony_ci } 326e1051a39Sopenharmony_ci if (!TEST_mem_eq(in, 8, outin, 8)) { 327e1051a39Sopenharmony_ci TEST_info("Decryption error %2d k=%s p=%s", i + 1, 328e1051a39Sopenharmony_ci pt(key_data[i], b1), pt(out, b2)); 329e1051a39Sopenharmony_ci return 0; 330e1051a39Sopenharmony_ci } 331e1051a39Sopenharmony_ci return 1; 332e1051a39Sopenharmony_ci} 333e1051a39Sopenharmony_ci 334e1051a39Sopenharmony_cistatic int test_des_ede_ecb(int i) 335e1051a39Sopenharmony_ci{ 336e1051a39Sopenharmony_ci DES_cblock in, out, outin; 337e1051a39Sopenharmony_ci DES_key_schedule ks, ks2, ks3; 338e1051a39Sopenharmony_ci char b1[DATA_BUF_SIZE], b2[DATA_BUF_SIZE]; 339e1051a39Sopenharmony_ci 340e1051a39Sopenharmony_ci DES_set_key_unchecked(&key_data[i], &ks); 341e1051a39Sopenharmony_ci DES_set_key_unchecked(&key_data[i + 1], &ks2); 342e1051a39Sopenharmony_ci DES_set_key_unchecked(&key_data[i + 2], &ks3); 343e1051a39Sopenharmony_ci memcpy(in, plain_data[i], 8); 344e1051a39Sopenharmony_ci memset(out, 0, 8); 345e1051a39Sopenharmony_ci memset(outin, 0, 8); 346e1051a39Sopenharmony_ci DES_ecb3_encrypt(&in, &out, &ks, &ks2, &ks, DES_ENCRYPT); 347e1051a39Sopenharmony_ci DES_ecb3_encrypt(&out, &outin, &ks, &ks2, &ks, DES_DECRYPT); 348e1051a39Sopenharmony_ci 349e1051a39Sopenharmony_ci if (!TEST_mem_eq(out, 8, cipher_ecb2[i], 8)) { 350e1051a39Sopenharmony_ci TEST_info("Encryption error %2d k=%s p=%s", i + 1, 351e1051a39Sopenharmony_ci pt(key_data[i], b1), pt(in, b2)); 352e1051a39Sopenharmony_ci return 0; 353e1051a39Sopenharmony_ci } 354e1051a39Sopenharmony_ci if (!TEST_mem_eq(in, 8, outin, 8)) { 355e1051a39Sopenharmony_ci TEST_info("Decryption error %2d k=%s p=%s ", i + 1, 356e1051a39Sopenharmony_ci pt(key_data[i], b1), pt(out, b2)); 357e1051a39Sopenharmony_ci return 0; 358e1051a39Sopenharmony_ci } 359e1051a39Sopenharmony_ci return 1; 360e1051a39Sopenharmony_ci} 361e1051a39Sopenharmony_ci 362e1051a39Sopenharmony_cistatic int test_des_cbc(void) 363e1051a39Sopenharmony_ci{ 364e1051a39Sopenharmony_ci unsigned char cbc_in[40]; 365e1051a39Sopenharmony_ci unsigned char cbc_out[40]; 366e1051a39Sopenharmony_ci DES_cblock iv3; 367e1051a39Sopenharmony_ci DES_key_schedule ks; 368e1051a39Sopenharmony_ci const size_t cbc_data_len = strlen((char *)cbc_data); 369e1051a39Sopenharmony_ci 370e1051a39Sopenharmony_ci if (!TEST_int_eq(DES_set_key_checked(&cbc_key, &ks), 0)) 371e1051a39Sopenharmony_ci return 0; 372e1051a39Sopenharmony_ci memset(cbc_out, 0, sizeof(cbc_out)); 373e1051a39Sopenharmony_ci memset(cbc_in, 0, sizeof(cbc_in)); 374e1051a39Sopenharmony_ci memcpy(iv3, cbc_iv, sizeof(cbc_iv)); 375e1051a39Sopenharmony_ci DES_ncbc_encrypt(cbc_data, cbc_out, cbc_data_len + 1, &ks, 376e1051a39Sopenharmony_ci &iv3, DES_ENCRYPT); 377e1051a39Sopenharmony_ci if (!TEST_mem_eq(cbc_out, 32, cbc_ok, 32)) 378e1051a39Sopenharmony_ci return 0; 379e1051a39Sopenharmony_ci 380e1051a39Sopenharmony_ci memcpy(iv3, cbc_iv, sizeof(cbc_iv)); 381e1051a39Sopenharmony_ci DES_ncbc_encrypt(cbc_out, cbc_in, cbc_data_len + 1, &ks, 382e1051a39Sopenharmony_ci &iv3, DES_DECRYPT); 383e1051a39Sopenharmony_ci return TEST_mem_eq(cbc_in, cbc_data_len, cbc_data, cbc_data_len); 384e1051a39Sopenharmony_ci} 385e1051a39Sopenharmony_ci 386e1051a39Sopenharmony_cistatic int test_des_ede_cbc(void) 387e1051a39Sopenharmony_ci{ 388e1051a39Sopenharmony_ci DES_cblock iv3; 389e1051a39Sopenharmony_ci DES_key_schedule ks; 390e1051a39Sopenharmony_ci unsigned char cbc_in[40]; 391e1051a39Sopenharmony_ci unsigned char cbc_out[40]; 392e1051a39Sopenharmony_ci const size_t n = strlen((char *)cbc_data) + 1; 393e1051a39Sopenharmony_ci 394e1051a39Sopenharmony_ci if (!TEST_int_eq(DES_set_key_checked(&cbc_key, &ks), 0)) 395e1051a39Sopenharmony_ci return 0; 396e1051a39Sopenharmony_ci memset(cbc_out, 0, sizeof(cbc_out)); 397e1051a39Sopenharmony_ci memset(cbc_in, 0, sizeof(cbc_in)); 398e1051a39Sopenharmony_ci memcpy(iv3, cbc_iv, sizeof(cbc_iv)); 399e1051a39Sopenharmony_ci DES_xcbc_encrypt(cbc_data, cbc_out, n, &ks, &iv3, &cbc2_key, &cbc3_key, 400e1051a39Sopenharmony_ci DES_ENCRYPT); 401e1051a39Sopenharmony_ci if (!TEST_mem_eq(cbc_out, sizeof(xcbc_ok), xcbc_ok, sizeof(xcbc_ok))) 402e1051a39Sopenharmony_ci return 0; 403e1051a39Sopenharmony_ci memcpy(iv3, cbc_iv, sizeof(cbc_iv)); 404e1051a39Sopenharmony_ci DES_xcbc_encrypt(cbc_out, cbc_in, n, &ks, &iv3, &cbc2_key, &cbc3_key, 405e1051a39Sopenharmony_ci DES_DECRYPT); 406e1051a39Sopenharmony_ci return TEST_mem_eq(cbc_data, n, cbc_data, n); 407e1051a39Sopenharmony_ci} 408e1051a39Sopenharmony_ci 409e1051a39Sopenharmony_cistatic int test_ede_cbc(void) 410e1051a39Sopenharmony_ci{ 411e1051a39Sopenharmony_ci DES_cblock iv3; 412e1051a39Sopenharmony_ci DES_key_schedule ks, ks2, ks3; 413e1051a39Sopenharmony_ci unsigned char cbc_in[40]; 414e1051a39Sopenharmony_ci unsigned char cbc_out[40]; 415e1051a39Sopenharmony_ci const size_t i = strlen((char *)cbc_data) + 1; 416e1051a39Sopenharmony_ci const size_t n = (i + 7) / 8 * 8; 417e1051a39Sopenharmony_ci 418e1051a39Sopenharmony_ci if (!TEST_int_eq(DES_set_key_checked(&cbc_key, &ks), 0)) 419e1051a39Sopenharmony_ci return 0; 420e1051a39Sopenharmony_ci if (!TEST_int_eq(DES_set_key_checked(&cbc2_key, &ks2), 0)) 421e1051a39Sopenharmony_ci return 0; 422e1051a39Sopenharmony_ci if (!TEST_int_eq(DES_set_key_checked(&cbc3_key, &ks3), 0)) 423e1051a39Sopenharmony_ci return 0; 424e1051a39Sopenharmony_ci memset(cbc_out, 0, sizeof(cbc_out)); 425e1051a39Sopenharmony_ci memset(cbc_in, 0, sizeof(cbc_in)); 426e1051a39Sopenharmony_ci memcpy(iv3, cbc_iv, sizeof(cbc_iv)); 427e1051a39Sopenharmony_ci 428e1051a39Sopenharmony_ci DES_ede3_cbc_encrypt(cbc_data, cbc_out, 16L, &ks, &ks2, &ks3, &iv3, 429e1051a39Sopenharmony_ci DES_ENCRYPT); 430e1051a39Sopenharmony_ci DES_ede3_cbc_encrypt(&cbc_data[16], &cbc_out[16], i - 16, &ks, &ks2, 431e1051a39Sopenharmony_ci &ks3, &iv3, DES_ENCRYPT); 432e1051a39Sopenharmony_ci if (!TEST_mem_eq(cbc_out, n, cbc3_ok, n)) 433e1051a39Sopenharmony_ci return 0; 434e1051a39Sopenharmony_ci 435e1051a39Sopenharmony_ci memcpy(iv3, cbc_iv, sizeof(cbc_iv)); 436e1051a39Sopenharmony_ci DES_ede3_cbc_encrypt(cbc_out, cbc_in, i, &ks, &ks2, &ks3, &iv3, 437e1051a39Sopenharmony_ci DES_DECRYPT); 438e1051a39Sopenharmony_ci return TEST_mem_eq(cbc_in, i, cbc_data, i); 439e1051a39Sopenharmony_ci} 440e1051a39Sopenharmony_ci 441e1051a39Sopenharmony_cistatic int test_input_align(int i) 442e1051a39Sopenharmony_ci{ 443e1051a39Sopenharmony_ci unsigned char cbc_out[40]; 444e1051a39Sopenharmony_ci DES_cblock iv; 445e1051a39Sopenharmony_ci DES_key_schedule ks; 446e1051a39Sopenharmony_ci const size_t n = strlen(i + (char *)cbc_data) + 1; 447e1051a39Sopenharmony_ci 448e1051a39Sopenharmony_ci memset(cbc_out, 0, sizeof(cbc_out)); 449e1051a39Sopenharmony_ci memcpy(iv, cbc_iv, sizeof(cbc_iv)); 450e1051a39Sopenharmony_ci if (!TEST_int_eq(DES_set_key_checked(&cbc_key, &ks), 0)) 451e1051a39Sopenharmony_ci return 0; 452e1051a39Sopenharmony_ci DES_ncbc_encrypt(&cbc_data[i], cbc_out, n, &ks, &iv, DES_ENCRYPT); 453e1051a39Sopenharmony_ci return 1; 454e1051a39Sopenharmony_ci} 455e1051a39Sopenharmony_ci 456e1051a39Sopenharmony_cistatic int test_output_align(int i) 457e1051a39Sopenharmony_ci{ 458e1051a39Sopenharmony_ci unsigned char cbc_out[40]; 459e1051a39Sopenharmony_ci DES_cblock iv; 460e1051a39Sopenharmony_ci DES_key_schedule ks; 461e1051a39Sopenharmony_ci const size_t n = strlen((char *)cbc_data) + 1; 462e1051a39Sopenharmony_ci 463e1051a39Sopenharmony_ci memset(cbc_out, 0, sizeof(cbc_out)); 464e1051a39Sopenharmony_ci memcpy(iv, cbc_iv, sizeof(cbc_iv)); 465e1051a39Sopenharmony_ci if (!TEST_int_eq(DES_set_key_checked(&cbc_key, &ks), 0)) 466e1051a39Sopenharmony_ci return 0; 467e1051a39Sopenharmony_ci DES_ncbc_encrypt(cbc_data, &cbc_out[i], n, &ks, &iv, DES_ENCRYPT); 468e1051a39Sopenharmony_ci return 1; 469e1051a39Sopenharmony_ci} 470e1051a39Sopenharmony_ci 471e1051a39Sopenharmony_cistatic int test_des_crypt(void) 472e1051a39Sopenharmony_ci{ 473e1051a39Sopenharmony_ci if (!TEST_str_eq("efGnQx2725bI2", DES_crypt("testing", "ef"))) 474e1051a39Sopenharmony_ci return 0; 475e1051a39Sopenharmony_ci if (!TEST_str_eq("yA1Rp/1hZXIJk", DES_crypt("bca76;23", "yA"))) 476e1051a39Sopenharmony_ci return 0; 477e1051a39Sopenharmony_ci 478e1051a39Sopenharmony_ci if (!TEST_ptr_null(DES_crypt("testing", "y\202"))) 479e1051a39Sopenharmony_ci return 0; 480e1051a39Sopenharmony_ci if (!TEST_ptr_null(DES_crypt("testing", "\0A"))) 481e1051a39Sopenharmony_ci return 0; 482e1051a39Sopenharmony_ci if (!TEST_ptr_null(DES_crypt("testing", "A"))) 483e1051a39Sopenharmony_ci return 0; 484e1051a39Sopenharmony_ci return 1; 485e1051a39Sopenharmony_ci} 486e1051a39Sopenharmony_ci 487e1051a39Sopenharmony_cistatic int test_des_pcbc(void) 488e1051a39Sopenharmony_ci{ 489e1051a39Sopenharmony_ci unsigned char cbc_in[40]; 490e1051a39Sopenharmony_ci unsigned char cbc_out[40]; 491e1051a39Sopenharmony_ci DES_key_schedule ks; 492e1051a39Sopenharmony_ci const int n = strlen((char *)cbc_data) + 1; 493e1051a39Sopenharmony_ci 494e1051a39Sopenharmony_ci if (!TEST_int_eq(DES_set_key_checked(&cbc_key, &ks), 0)) 495e1051a39Sopenharmony_ci return 0; 496e1051a39Sopenharmony_ci memset(cbc_out, 0, sizeof(cbc_out)); 497e1051a39Sopenharmony_ci memset(cbc_in, 0, sizeof(cbc_in)); 498e1051a39Sopenharmony_ci DES_pcbc_encrypt(cbc_data, cbc_out, n, &ks, 499e1051a39Sopenharmony_ci &cbc_iv, DES_ENCRYPT); 500e1051a39Sopenharmony_ci if (!TEST_mem_eq(cbc_out, sizeof(pcbc_ok), pcbc_ok, sizeof(pcbc_ok))) 501e1051a39Sopenharmony_ci return 0; 502e1051a39Sopenharmony_ci DES_pcbc_encrypt(cbc_out, cbc_in, n, &ks, 503e1051a39Sopenharmony_ci &cbc_iv, DES_DECRYPT); 504e1051a39Sopenharmony_ci return TEST_mem_eq(cbc_in, n, cbc_data, n); 505e1051a39Sopenharmony_ci} 506e1051a39Sopenharmony_ci 507e1051a39Sopenharmony_cistatic int cfb_test(int bits, unsigned char *cfb_cipher) 508e1051a39Sopenharmony_ci{ 509e1051a39Sopenharmony_ci DES_key_schedule ks; 510e1051a39Sopenharmony_ci 511e1051a39Sopenharmony_ci DES_set_key_checked(&cfb_key, &ks); 512e1051a39Sopenharmony_ci memcpy(cfb_tmp, cfb_iv, sizeof(cfb_iv)); 513e1051a39Sopenharmony_ci DES_cfb_encrypt(plain, cfb_buf1, bits, sizeof(plain), &ks, &cfb_tmp, 514e1051a39Sopenharmony_ci DES_ENCRYPT); 515e1051a39Sopenharmony_ci if (!TEST_mem_eq(cfb_cipher, sizeof(plain), cfb_buf1, sizeof(plain))) 516e1051a39Sopenharmony_ci return 0; 517e1051a39Sopenharmony_ci memcpy(cfb_tmp, cfb_iv, sizeof(cfb_iv)); 518e1051a39Sopenharmony_ci DES_cfb_encrypt(cfb_buf1, cfb_buf2, bits, sizeof(plain), &ks, &cfb_tmp, 519e1051a39Sopenharmony_ci DES_DECRYPT); 520e1051a39Sopenharmony_ci return TEST_mem_eq(plain, sizeof(plain), cfb_buf2, sizeof(plain)); 521e1051a39Sopenharmony_ci} 522e1051a39Sopenharmony_ci 523e1051a39Sopenharmony_cistatic int test_des_cfb8(void) 524e1051a39Sopenharmony_ci{ 525e1051a39Sopenharmony_ci return cfb_test(8, cfb_cipher8); 526e1051a39Sopenharmony_ci} 527e1051a39Sopenharmony_ci 528e1051a39Sopenharmony_cistatic int test_des_cfb16(void) 529e1051a39Sopenharmony_ci{ 530e1051a39Sopenharmony_ci return cfb_test(16, cfb_cipher16); 531e1051a39Sopenharmony_ci} 532e1051a39Sopenharmony_ci 533e1051a39Sopenharmony_cistatic int test_des_cfb32(void) 534e1051a39Sopenharmony_ci{ 535e1051a39Sopenharmony_ci return cfb_test(32, cfb_cipher32); 536e1051a39Sopenharmony_ci} 537e1051a39Sopenharmony_ci 538e1051a39Sopenharmony_cistatic int test_des_cfb48(void) 539e1051a39Sopenharmony_ci{ 540e1051a39Sopenharmony_ci return cfb_test(48, cfb_cipher48); 541e1051a39Sopenharmony_ci} 542e1051a39Sopenharmony_ci 543e1051a39Sopenharmony_cistatic int test_des_cfb64(void) 544e1051a39Sopenharmony_ci{ 545e1051a39Sopenharmony_ci DES_key_schedule ks; 546e1051a39Sopenharmony_ci int n; 547e1051a39Sopenharmony_ci size_t i; 548e1051a39Sopenharmony_ci 549e1051a39Sopenharmony_ci if (!cfb_test(64, cfb_cipher64)) 550e1051a39Sopenharmony_ci return 0; 551e1051a39Sopenharmony_ci 552e1051a39Sopenharmony_ci DES_set_key_checked(&cfb_key, &ks); 553e1051a39Sopenharmony_ci memcpy(cfb_tmp, cfb_iv, sizeof(cfb_iv)); 554e1051a39Sopenharmony_ci n = 0; 555e1051a39Sopenharmony_ci DES_cfb64_encrypt(plain, cfb_buf1, 12, &ks, &cfb_tmp, &n, DES_ENCRYPT); 556e1051a39Sopenharmony_ci DES_cfb64_encrypt(&plain[12], &cfb_buf1[12], sizeof(plain) - 12, &ks, 557e1051a39Sopenharmony_ci &cfb_tmp, &n, DES_ENCRYPT); 558e1051a39Sopenharmony_ci if (!TEST_mem_eq(cfb_cipher64, sizeof(plain), cfb_buf1, sizeof(plain))) 559e1051a39Sopenharmony_ci return 0; 560e1051a39Sopenharmony_ci memcpy(cfb_tmp, cfb_iv, sizeof(cfb_iv)); 561e1051a39Sopenharmony_ci n = 0; 562e1051a39Sopenharmony_ci DES_cfb64_encrypt(cfb_buf1, cfb_buf2, 17, &ks, &cfb_tmp, &n, DES_DECRYPT); 563e1051a39Sopenharmony_ci DES_cfb64_encrypt(&cfb_buf1[17], &cfb_buf2[17], 564e1051a39Sopenharmony_ci sizeof(plain) - 17, &ks, &cfb_tmp, &n, DES_DECRYPT); 565e1051a39Sopenharmony_ci if (!TEST_mem_eq(plain, sizeof(plain), cfb_buf2, sizeof(plain))) 566e1051a39Sopenharmony_ci return 0; 567e1051a39Sopenharmony_ci 568e1051a39Sopenharmony_ci memcpy(cfb_tmp, cfb_iv, sizeof(cfb_iv)); 569e1051a39Sopenharmony_ci for (i = 0; i < sizeof(plain); i++) 570e1051a39Sopenharmony_ci DES_cfb_encrypt(&plain[i], &cfb_buf1[i], 8, 1, &ks, &cfb_tmp, 571e1051a39Sopenharmony_ci DES_ENCRYPT); 572e1051a39Sopenharmony_ci if (!TEST_mem_eq(cfb_cipher8, sizeof(plain), cfb_buf1, sizeof(plain))) 573e1051a39Sopenharmony_ci return 0; 574e1051a39Sopenharmony_ci 575e1051a39Sopenharmony_ci memcpy(cfb_tmp, cfb_iv, sizeof(cfb_iv)); 576e1051a39Sopenharmony_ci for (i = 0; i < sizeof(plain); i++) 577e1051a39Sopenharmony_ci DES_cfb_encrypt(&cfb_buf1[i], &cfb_buf2[i], 8, 1, &ks, &cfb_tmp, 578e1051a39Sopenharmony_ci DES_DECRYPT); 579e1051a39Sopenharmony_ci return TEST_mem_eq(plain, sizeof(plain), cfb_buf2, sizeof(plain)); 580e1051a39Sopenharmony_ci} 581e1051a39Sopenharmony_ci 582e1051a39Sopenharmony_cistatic int test_des_ede_cfb64(void) 583e1051a39Sopenharmony_ci{ 584e1051a39Sopenharmony_ci DES_key_schedule ks; 585e1051a39Sopenharmony_ci int n; 586e1051a39Sopenharmony_ci 587e1051a39Sopenharmony_ci DES_set_key_checked(&cfb_key, &ks); 588e1051a39Sopenharmony_ci memcpy(cfb_tmp, cfb_iv, sizeof(cfb_iv)); 589e1051a39Sopenharmony_ci n = 0; 590e1051a39Sopenharmony_ci DES_ede3_cfb64_encrypt(plain, cfb_buf1, 12, &ks, &ks, &ks, &cfb_tmp, &n, 591e1051a39Sopenharmony_ci DES_ENCRYPT); 592e1051a39Sopenharmony_ci DES_ede3_cfb64_encrypt(&plain[12], &cfb_buf1[12], sizeof(plain) - 12, &ks, 593e1051a39Sopenharmony_ci &ks, &ks, &cfb_tmp, &n, DES_ENCRYPT); 594e1051a39Sopenharmony_ci if (!TEST_mem_eq(cfb_cipher64, sizeof(plain), cfb_buf1, sizeof(plain))) 595e1051a39Sopenharmony_ci return 0; 596e1051a39Sopenharmony_ci memcpy(cfb_tmp, cfb_iv, sizeof(cfb_iv)); 597e1051a39Sopenharmony_ci n = 0; 598e1051a39Sopenharmony_ci DES_ede3_cfb64_encrypt(cfb_buf1, cfb_buf2, (long)17, &ks, &ks, &ks, 599e1051a39Sopenharmony_ci &cfb_tmp, &n, DES_DECRYPT); 600e1051a39Sopenharmony_ci DES_ede3_cfb64_encrypt(&cfb_buf1[17], &cfb_buf2[17], sizeof(plain) - 17, 601e1051a39Sopenharmony_ci &ks, &ks, &ks, &cfb_tmp, &n, DES_DECRYPT); 602e1051a39Sopenharmony_ci return TEST_mem_eq(plain, sizeof(plain), cfb_buf2, sizeof(plain)); 603e1051a39Sopenharmony_ci} 604e1051a39Sopenharmony_ci 605e1051a39Sopenharmony_cistatic int test_des_ofb(void) 606e1051a39Sopenharmony_ci{ 607e1051a39Sopenharmony_ci DES_key_schedule ks; 608e1051a39Sopenharmony_ci 609e1051a39Sopenharmony_ci DES_set_key_checked(&ofb_key, &ks); 610e1051a39Sopenharmony_ci memcpy(ofb_tmp, ofb_iv, sizeof(ofb_iv)); 611e1051a39Sopenharmony_ci DES_ofb_encrypt(plain, ofb_buf1, 64, sizeof(plain) / 8, &ks, &ofb_tmp); 612e1051a39Sopenharmony_ci if (!TEST_mem_eq(ofb_cipher, sizeof(ofb_buf1), ofb_buf1, sizeof(ofb_buf1))) 613e1051a39Sopenharmony_ci return 0; 614e1051a39Sopenharmony_ci 615e1051a39Sopenharmony_ci memcpy(ofb_tmp, ofb_iv, sizeof(ofb_iv)); 616e1051a39Sopenharmony_ci DES_ofb_encrypt(ofb_buf1, ofb_buf2, 64, sizeof(ofb_buf1) / 8, &ks, 617e1051a39Sopenharmony_ci &ofb_tmp); 618e1051a39Sopenharmony_ci return TEST_mem_eq(plain, sizeof(ofb_buf2), ofb_buf2, sizeof(ofb_buf2)); 619e1051a39Sopenharmony_ci} 620e1051a39Sopenharmony_ci 621e1051a39Sopenharmony_cistatic int test_des_ofb64(void) 622e1051a39Sopenharmony_ci{ 623e1051a39Sopenharmony_ci DES_key_schedule ks; 624e1051a39Sopenharmony_ci int num; 625e1051a39Sopenharmony_ci size_t i; 626e1051a39Sopenharmony_ci 627e1051a39Sopenharmony_ci DES_set_key_checked(&ofb_key, &ks); 628e1051a39Sopenharmony_ci memcpy(ofb_tmp, ofb_iv, sizeof(ofb_iv)); 629e1051a39Sopenharmony_ci memset(ofb_buf1, 0, sizeof(ofb_buf1)); 630e1051a39Sopenharmony_ci memset(ofb_buf2, 0, sizeof(ofb_buf1)); 631e1051a39Sopenharmony_ci num = 0; 632e1051a39Sopenharmony_ci for (i = 0; i < sizeof(plain); i++) { 633e1051a39Sopenharmony_ci DES_ofb64_encrypt(&plain[i], &ofb_buf1[i], 1, &ks, &ofb_tmp, &num); 634e1051a39Sopenharmony_ci } 635e1051a39Sopenharmony_ci if (!TEST_mem_eq(ofb_cipher, sizeof(ofb_buf1), ofb_buf1, sizeof(ofb_buf1))) 636e1051a39Sopenharmony_ci return 0; 637e1051a39Sopenharmony_ci memcpy(ofb_tmp, ofb_iv, sizeof(ofb_iv)); 638e1051a39Sopenharmony_ci num = 0; 639e1051a39Sopenharmony_ci DES_ofb64_encrypt(ofb_buf1, ofb_buf2, sizeof(ofb_buf1), &ks, &ofb_tmp, 640e1051a39Sopenharmony_ci &num); 641e1051a39Sopenharmony_ci return TEST_mem_eq(plain, sizeof(ofb_buf2), ofb_buf2, sizeof(ofb_buf2)); 642e1051a39Sopenharmony_ci} 643e1051a39Sopenharmony_ci 644e1051a39Sopenharmony_cistatic int test_des_ede_ofb64(void) 645e1051a39Sopenharmony_ci{ 646e1051a39Sopenharmony_ci DES_key_schedule ks; 647e1051a39Sopenharmony_ci int num; 648e1051a39Sopenharmony_ci size_t i; 649e1051a39Sopenharmony_ci 650e1051a39Sopenharmony_ci DES_set_key_checked(&ofb_key, &ks); 651e1051a39Sopenharmony_ci memcpy(ofb_tmp, ofb_iv, sizeof(ofb_iv)); 652e1051a39Sopenharmony_ci memset(ofb_buf1, 0, sizeof(ofb_buf1)); 653e1051a39Sopenharmony_ci memset(ofb_buf2, 0, sizeof(ofb_buf1)); 654e1051a39Sopenharmony_ci num = 0; 655e1051a39Sopenharmony_ci for (i = 0; i < sizeof(plain); i++) { 656e1051a39Sopenharmony_ci DES_ede3_ofb64_encrypt(&plain[i], &ofb_buf1[i], 1, &ks, &ks, 657e1051a39Sopenharmony_ci &ks, &ofb_tmp, &num); 658e1051a39Sopenharmony_ci } 659e1051a39Sopenharmony_ci if (!TEST_mem_eq(ofb_cipher, sizeof(ofb_buf1), ofb_buf1, sizeof(ofb_buf1))) 660e1051a39Sopenharmony_ci return 0; 661e1051a39Sopenharmony_ci memcpy(ofb_tmp, ofb_iv, sizeof(ofb_iv)); 662e1051a39Sopenharmony_ci num = 0; 663e1051a39Sopenharmony_ci DES_ede3_ofb64_encrypt(ofb_buf1, ofb_buf2, sizeof(ofb_buf1), &ks, &ks, &ks, 664e1051a39Sopenharmony_ci &ofb_tmp, &num); 665e1051a39Sopenharmony_ci return TEST_mem_eq(plain, sizeof(ofb_buf2), ofb_buf2, sizeof(ofb_buf2)); 666e1051a39Sopenharmony_ci} 667e1051a39Sopenharmony_ci 668e1051a39Sopenharmony_cistatic int test_des_cbc_cksum(void) 669e1051a39Sopenharmony_ci{ 670e1051a39Sopenharmony_ci DES_LONG cs; 671e1051a39Sopenharmony_ci DES_key_schedule ks; 672e1051a39Sopenharmony_ci unsigned char cret[8]; 673e1051a39Sopenharmony_ci 674e1051a39Sopenharmony_ci DES_set_key_checked(&cbc_key, &ks); 675e1051a39Sopenharmony_ci cs = DES_cbc_cksum(cbc_data, &cret, strlen((char *)cbc_data), &ks, 676e1051a39Sopenharmony_ci &cbc_iv); 677e1051a39Sopenharmony_ci if (!TEST_cs_eq(cs, cbc_cksum_ret)) 678e1051a39Sopenharmony_ci return 0; 679e1051a39Sopenharmony_ci return TEST_mem_eq(cret, 8, cbc_cksum_data, 8); 680e1051a39Sopenharmony_ci} 681e1051a39Sopenharmony_ci 682e1051a39Sopenharmony_cistatic int test_des_quad_cksum(void) 683e1051a39Sopenharmony_ci{ 684e1051a39Sopenharmony_ci DES_LONG cs, lqret[4]; 685e1051a39Sopenharmony_ci 686e1051a39Sopenharmony_ci cs = DES_quad_cksum(cbc_data, (DES_cblock *)lqret, 687e1051a39Sopenharmony_ci (long)strlen((char *)cbc_data), 2, 688e1051a39Sopenharmony_ci (DES_cblock *)cbc_iv); 689e1051a39Sopenharmony_ci if (!TEST_cs_eq(cs, 0x70d7a63aL)) 690e1051a39Sopenharmony_ci return 0; 691e1051a39Sopenharmony_ci if (!TEST_cs_eq(lqret[0], 0x327eba8dL)) 692e1051a39Sopenharmony_ci return 0; 693e1051a39Sopenharmony_ci if (!TEST_cs_eq(lqret[1], 0x201a49ccL)) 694e1051a39Sopenharmony_ci return 0; 695e1051a39Sopenharmony_ci if (!TEST_cs_eq(lqret[2], 0x70d7a63aL)) 696e1051a39Sopenharmony_ci return 0; 697e1051a39Sopenharmony_ci if (!TEST_cs_eq(lqret[3], 0x501c2c26L)) 698e1051a39Sopenharmony_ci return 0; 699e1051a39Sopenharmony_ci return 1; 700e1051a39Sopenharmony_ci} 701e1051a39Sopenharmony_ci 702e1051a39Sopenharmony_ci/* 703e1051a39Sopenharmony_ci * Test TDES based key wrapping. 704e1051a39Sopenharmony_ci * The wrapping process uses a randomly generated IV so it is difficult to 705e1051a39Sopenharmony_ci * undertake KATs. End to end testing is performed instead. 706e1051a39Sopenharmony_ci */ 707e1051a39Sopenharmony_cistatic const int test_des_key_wrap_sizes[] = { 708e1051a39Sopenharmony_ci 8, 16, 24, 32, 64, 80 709e1051a39Sopenharmony_ci}; 710e1051a39Sopenharmony_ci 711e1051a39Sopenharmony_cistatic int test_des_key_wrap(int idx) 712e1051a39Sopenharmony_ci{ 713e1051a39Sopenharmony_ci int in_bytes = test_des_key_wrap_sizes[idx]; 714e1051a39Sopenharmony_ci unsigned char in[100], c_txt[200], p_txt[200], key[24]; 715e1051a39Sopenharmony_ci int clen, clen_upd, clen_fin, plen, plen_upd, plen_fin, expect, bs, i; 716e1051a39Sopenharmony_ci EVP_CIPHER *cipher = NULL; 717e1051a39Sopenharmony_ci EVP_CIPHER_CTX *ctx = NULL; 718e1051a39Sopenharmony_ci int res = 0; 719e1051a39Sopenharmony_ci 720e1051a39Sopenharmony_ci /* Some sanity checks and cipher loading */ 721e1051a39Sopenharmony_ci if (!TEST_size_t_le(in_bytes, sizeof(in)) 722e1051a39Sopenharmony_ci || !TEST_ptr(cipher = EVP_CIPHER_fetch(NULL, "DES3-WRAP", NULL)) 723e1051a39Sopenharmony_ci || !TEST_int_eq(bs = EVP_CIPHER_get_block_size(cipher), 8) 724e1051a39Sopenharmony_ci || !TEST_size_t_eq(bs * 3u, sizeof(key)) 725e1051a39Sopenharmony_ci || !TEST_true(in_bytes % bs == 0) 726e1051a39Sopenharmony_ci || !TEST_ptr(ctx = EVP_CIPHER_CTX_new())) 727e1051a39Sopenharmony_ci goto err; 728e1051a39Sopenharmony_ci 729e1051a39Sopenharmony_ci /* Create random data to end to end test */ 730e1051a39Sopenharmony_ci for (i = 0; i < in_bytes; i++) 731e1051a39Sopenharmony_ci in[i] = test_random(); 732e1051a39Sopenharmony_ci 733e1051a39Sopenharmony_ci /* Build the key */ 734e1051a39Sopenharmony_ci memcpy(key, cbc_key, sizeof(cbc_key)); 735e1051a39Sopenharmony_ci memcpy(key + sizeof(cbc_key), cbc2_key, sizeof(cbc2_key)); 736e1051a39Sopenharmony_ci memcpy(key + sizeof(cbc_key) + sizeof(cbc3_key), cbc_key, sizeof(cbc3_key)); 737e1051a39Sopenharmony_ci 738e1051a39Sopenharmony_ci /* Wrap / encrypt the key */ 739e1051a39Sopenharmony_ci clen_upd = sizeof(c_txt); 740e1051a39Sopenharmony_ci if (!TEST_true(EVP_EncryptInit(ctx, cipher, key, NULL)) 741e1051a39Sopenharmony_ci || !TEST_true(EVP_EncryptUpdate(ctx, c_txt, &clen_upd, 742e1051a39Sopenharmony_ci in, in_bytes))) 743e1051a39Sopenharmony_ci goto err; 744e1051a39Sopenharmony_ci 745e1051a39Sopenharmony_ci expect = (in_bytes + (bs - 1)) / bs * bs + 2 * bs; 746e1051a39Sopenharmony_ci if (!TEST_int_eq(clen_upd, expect)) 747e1051a39Sopenharmony_ci goto err; 748e1051a39Sopenharmony_ci 749e1051a39Sopenharmony_ci clen_fin = sizeof(c_txt) - clen_upd; 750e1051a39Sopenharmony_ci if (!TEST_true(EVP_EncryptFinal(ctx, c_txt + clen_upd, &clen_fin)) 751e1051a39Sopenharmony_ci || !TEST_int_eq(clen_fin, 0)) 752e1051a39Sopenharmony_ci goto err; 753e1051a39Sopenharmony_ci clen = clen_upd + clen_fin; 754e1051a39Sopenharmony_ci 755e1051a39Sopenharmony_ci /* Decrypt the wrapped key */ 756e1051a39Sopenharmony_ci plen_upd = sizeof(p_txt); 757e1051a39Sopenharmony_ci if (!TEST_true(EVP_DecryptInit(ctx, cipher, key, NULL)) 758e1051a39Sopenharmony_ci || !TEST_true(EVP_DecryptUpdate(ctx, p_txt, &plen_upd, 759e1051a39Sopenharmony_ci c_txt, clen))) 760e1051a39Sopenharmony_ci goto err; 761e1051a39Sopenharmony_ci plen_fin = sizeof(p_txt) - plen_upd; 762e1051a39Sopenharmony_ci if (!TEST_true(EVP_DecryptFinal(ctx, p_txt + plen_upd, &plen_fin))) 763e1051a39Sopenharmony_ci goto err; 764e1051a39Sopenharmony_ci plen = plen_upd + plen_fin; 765e1051a39Sopenharmony_ci 766e1051a39Sopenharmony_ci if (!TEST_mem_eq(in, in_bytes, p_txt, plen)) 767e1051a39Sopenharmony_ci goto err; 768e1051a39Sopenharmony_ci res = 1; 769e1051a39Sopenharmony_ci err: 770e1051a39Sopenharmony_ci EVP_CIPHER_free(cipher); 771e1051a39Sopenharmony_ci EVP_CIPHER_CTX_free(ctx); 772e1051a39Sopenharmony_ci return res; 773e1051a39Sopenharmony_ci} 774e1051a39Sopenharmony_ci 775e1051a39Sopenharmony_ci/*- 776e1051a39Sopenharmony_ci * Weak and semi weak keys as taken from 777e1051a39Sopenharmony_ci * %A D.W. Davies 778e1051a39Sopenharmony_ci * %A W.L. Price 779e1051a39Sopenharmony_ci * %T Security for Computer Networks 780e1051a39Sopenharmony_ci * %I John Wiley & Sons 781e1051a39Sopenharmony_ci * %D 1984 782e1051a39Sopenharmony_ci */ 783e1051a39Sopenharmony_cistatic struct { 784e1051a39Sopenharmony_ci const DES_cblock key; 785e1051a39Sopenharmony_ci int expect; 786e1051a39Sopenharmony_ci} weak_keys[] = { 787e1051a39Sopenharmony_ci /* weak keys */ 788e1051a39Sopenharmony_ci {{0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 1 }, 789e1051a39Sopenharmony_ci {{0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE}, 1 }, 790e1051a39Sopenharmony_ci {{0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E}, 1 }, 791e1051a39Sopenharmony_ci {{0xE0, 0xE0, 0xE0, 0xE0, 0xF1, 0xF1, 0xF1, 0xF1}, 1 }, 792e1051a39Sopenharmony_ci /* semi-weak keys */ 793e1051a39Sopenharmony_ci {{0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE}, 1 }, 794e1051a39Sopenharmony_ci {{0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01}, 1 }, 795e1051a39Sopenharmony_ci {{0x1F, 0xE0, 0x1F, 0xE0, 0x0E, 0xF1, 0x0E, 0xF1}, 1 }, 796e1051a39Sopenharmony_ci {{0xE0, 0x1F, 0xE0, 0x1F, 0xF1, 0x0E, 0xF1, 0x0E}, 1 }, 797e1051a39Sopenharmony_ci {{0x01, 0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1}, 1 }, 798e1051a39Sopenharmony_ci {{0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1, 0x01}, 1 }, 799e1051a39Sopenharmony_ci {{0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E, 0xFE}, 1 }, 800e1051a39Sopenharmony_ci {{0xFE, 0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E}, 1 }, 801e1051a39Sopenharmony_ci {{0x01, 0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E}, 1 }, 802e1051a39Sopenharmony_ci {{0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E, 0x01}, 1 }, 803e1051a39Sopenharmony_ci {{0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE}, 1 }, 804e1051a39Sopenharmony_ci {{0xFE, 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1}, 1 }, 805e1051a39Sopenharmony_ci /* good key */ 806e1051a39Sopenharmony_ci {{0x49, 0xE9, 0x5D, 0x6D, 0x4C, 0xA2, 0x29, 0xBF}, 0 } 807e1051a39Sopenharmony_ci}; 808e1051a39Sopenharmony_ci 809e1051a39Sopenharmony_cistatic int test_des_weak_keys(int n) 810e1051a39Sopenharmony_ci{ 811e1051a39Sopenharmony_ci const_DES_cblock *key = (unsigned char (*)[8])weak_keys[n].key; 812e1051a39Sopenharmony_ci 813e1051a39Sopenharmony_ci return TEST_int_eq(DES_is_weak_key(key), weak_keys[n].expect); 814e1051a39Sopenharmony_ci} 815e1051a39Sopenharmony_ci 816e1051a39Sopenharmony_cistatic struct { 817e1051a39Sopenharmony_ci const DES_cblock key; 818e1051a39Sopenharmony_ci int expect; 819e1051a39Sopenharmony_ci} bad_parity_keys[] = { 820e1051a39Sopenharmony_ci {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 0 }, 821e1051a39Sopenharmony_ci {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, 0 }, 822e1051a39Sopenharmony_ci /* Perturb each byte in turn to create even parity */ 823e1051a39Sopenharmony_ci {{0x48, 0xE9, 0x5D, 0x6D, 0x4C, 0xA2, 0x29, 0xBF}, 0 }, 824e1051a39Sopenharmony_ci {{0x49, 0xE8, 0x5D, 0x6D, 0x4C, 0xA2, 0x29, 0xBF}, 0 }, 825e1051a39Sopenharmony_ci {{0x49, 0xE9, 0x5C, 0x6D, 0x4C, 0xA2, 0x29, 0xBF}, 0 }, 826e1051a39Sopenharmony_ci {{0x49, 0xE9, 0x5D, 0x7D, 0x4C, 0xA2, 0x29, 0xBF}, 0 }, 827e1051a39Sopenharmony_ci {{0x49, 0xE9, 0x5D, 0x6D, 0x5C, 0xA2, 0x29, 0xBF}, 0 }, 828e1051a39Sopenharmony_ci {{0x49, 0xE9, 0x5D, 0x6D, 0x4C, 0xA3, 0x29, 0xBF}, 0 }, 829e1051a39Sopenharmony_ci {{0x49, 0xE9, 0x5D, 0x6D, 0x4C, 0xA2, 0x39, 0xBF}, 0 }, 830e1051a39Sopenharmony_ci {{0x49, 0xE9, 0x5D, 0x6D, 0x4C, 0xA2, 0x29, 0xBE}, 0 }, 831e1051a39Sopenharmony_ci /* Odd parity version of above */ 832e1051a39Sopenharmony_ci {{0x49, 0xE9, 0x5D, 0x6D, 0x4C, 0xA2, 0x29, 0xBF}, 1 } 833e1051a39Sopenharmony_ci}; 834e1051a39Sopenharmony_ci 835e1051a39Sopenharmony_cistatic int test_des_check_bad_parity(int n) 836e1051a39Sopenharmony_ci{ 837e1051a39Sopenharmony_ci const_DES_cblock *key = (unsigned char (*)[8])bad_parity_keys[n].key; 838e1051a39Sopenharmony_ci 839e1051a39Sopenharmony_ci return TEST_int_eq(DES_check_key_parity(key), bad_parity_keys[n].expect); 840e1051a39Sopenharmony_ci} 841e1051a39Sopenharmony_ci 842e1051a39Sopenharmony_ci/* Test that two key 3DES can generate a random key without error */ 843e1051a39Sopenharmony_cistatic int test_des_two_key(void) 844e1051a39Sopenharmony_ci{ 845e1051a39Sopenharmony_ci int res = 0; 846e1051a39Sopenharmony_ci EVP_CIPHER *cipher = NULL; 847e1051a39Sopenharmony_ci EVP_CIPHER_CTX *ctx = NULL; 848e1051a39Sopenharmony_ci unsigned char key[16]; 849e1051a39Sopenharmony_ci 850e1051a39Sopenharmony_ci if (!TEST_ptr(cipher = EVP_CIPHER_fetch(NULL, "DES-EDE-ECB", NULL)) 851e1051a39Sopenharmony_ci || !TEST_ptr(ctx = EVP_CIPHER_CTX_new()) 852e1051a39Sopenharmony_ci || !EVP_CipherInit_ex(ctx, cipher, NULL, NULL, NULL, 1) 853e1051a39Sopenharmony_ci || !EVP_CIPHER_CTX_set_key_length(ctx, sizeof(key)) 854e1051a39Sopenharmony_ci || !EVP_CIPHER_CTX_rand_key(ctx, key)) 855e1051a39Sopenharmony_ci goto err; 856e1051a39Sopenharmony_ci 857e1051a39Sopenharmony_ci res = 1; 858e1051a39Sopenharmony_ci err: 859e1051a39Sopenharmony_ci EVP_CIPHER_free(cipher); 860e1051a39Sopenharmony_ci EVP_CIPHER_CTX_free(ctx); 861e1051a39Sopenharmony_ci return res; 862e1051a39Sopenharmony_ci} 863e1051a39Sopenharmony_ci 864e1051a39Sopenharmony_ci#endif 865e1051a39Sopenharmony_ci 866e1051a39Sopenharmony_ciint setup_tests(void) 867e1051a39Sopenharmony_ci{ 868e1051a39Sopenharmony_ci#ifndef OPENSSL_NO_DES 869e1051a39Sopenharmony_ci ADD_ALL_TESTS(test_des_ecb, NUM_TESTS); 870e1051a39Sopenharmony_ci ADD_TEST(test_des_cbc); 871e1051a39Sopenharmony_ci ADD_TEST(test_ede_cbc); 872e1051a39Sopenharmony_ci ADD_ALL_TESTS(test_des_ede_ecb, NUM_TESTS - 2); 873e1051a39Sopenharmony_ci ADD_TEST(test_des_ede_cbc); 874e1051a39Sopenharmony_ci ADD_TEST(test_des_pcbc); 875e1051a39Sopenharmony_ci ADD_TEST(test_des_cfb8); 876e1051a39Sopenharmony_ci ADD_TEST(test_des_cfb16); 877e1051a39Sopenharmony_ci ADD_TEST(test_des_cfb32); 878e1051a39Sopenharmony_ci ADD_TEST(test_des_cfb48); 879e1051a39Sopenharmony_ci ADD_TEST(test_des_cfb64); 880e1051a39Sopenharmony_ci ADD_TEST(test_des_ede_cfb64); 881e1051a39Sopenharmony_ci ADD_TEST(test_des_ofb); 882e1051a39Sopenharmony_ci ADD_TEST(test_des_ofb64); 883e1051a39Sopenharmony_ci ADD_TEST(test_des_ede_ofb64); 884e1051a39Sopenharmony_ci ADD_TEST(test_des_cbc_cksum); 885e1051a39Sopenharmony_ci ADD_TEST(test_des_quad_cksum); 886e1051a39Sopenharmony_ci ADD_TEST(test_des_crypt); 887e1051a39Sopenharmony_ci ADD_ALL_TESTS(test_input_align, 4); 888e1051a39Sopenharmony_ci ADD_ALL_TESTS(test_output_align, 4); 889e1051a39Sopenharmony_ci ADD_ALL_TESTS(test_des_key_wrap, OSSL_NELEM(test_des_key_wrap_sizes)); 890e1051a39Sopenharmony_ci ADD_ALL_TESTS(test_des_weak_keys, OSSL_NELEM(weak_keys)); 891e1051a39Sopenharmony_ci ADD_ALL_TESTS(test_des_check_bad_parity, OSSL_NELEM(bad_parity_keys)); 892e1051a39Sopenharmony_ci ADD_TEST(test_des_two_key); 893e1051a39Sopenharmony_ci#endif 894e1051a39Sopenharmony_ci return 1; 895e1051a39Sopenharmony_ci} 896