Blame test/ideatest.c

Packit c4476c
/*
Packit c4476c
 * Copyright 1995-2017 The OpenSSL Project Authors. All Rights Reserved.
Packit c4476c
 *
Packit c4476c
 * Licensed under the OpenSSL license (the "License").  You may not use
Packit c4476c
 * this file except in compliance with the License.  You can obtain a copy
Packit c4476c
 * in the file LICENSE in the source distribution or at
Packit c4476c
 * https://www.openssl.org/source/license.html
Packit c4476c
 */
Packit c4476c
Packit c4476c
#include <string.h>
Packit c4476c
Packit c4476c
#include "internal/nelem.h"
Packit c4476c
#include "testutil.h"
Packit c4476c
Packit c4476c
#ifndef OPENSSL_NO_IDEA
Packit c4476c
# include <openssl/idea.h>
Packit c4476c
Packit c4476c
static const unsigned char k[16] = {
Packit c4476c
    0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04,
Packit c4476c
    0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08
Packit c4476c
};
Packit c4476c
Packit c4476c
static const  unsigned char in[8] = { 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03 };
Packit c4476c
static const unsigned char c[8] = { 0x11, 0xFB, 0xED, 0x2B, 0x01, 0x98, 0x6D, 0xE5 };
Packit c4476c
Packit c4476c
static unsigned char out[80];
Packit c4476c
Packit c4476c
static const char text[] = "Hello to all people out there";
Packit c4476c
Packit c4476c
static const unsigned char cfb_key[16] = {
Packit c4476c
    0xe1, 0xf0, 0xc3, 0xd2, 0xa5, 0xb4, 0x87, 0x96,
Packit c4476c
    0x69, 0x78, 0x4b, 0x5a, 0x2d, 0x3c, 0x0f, 0x1e,
Packit c4476c
};
Packit c4476c
static const unsigned char cfb_iv[80] =
Packit c4476c
    { 0x34, 0x12, 0x78, 0x56, 0xab, 0x90, 0xef, 0xcd };
Packit c4476c
static unsigned char cfb_buf1[40], cfb_buf2[40], cfb_tmp[8];
Packit c4476c
# define CFB_TEST_SIZE 24
Packit c4476c
static const unsigned char plain[CFB_TEST_SIZE] = {
Packit c4476c
    0x4e, 0x6f, 0x77, 0x20, 0x69, 0x73,
Packit c4476c
    0x20, 0x74, 0x68, 0x65, 0x20, 0x74,
Packit c4476c
    0x69, 0x6d, 0x65, 0x20, 0x66, 0x6f,
Packit c4476c
    0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20
Packit c4476c
};
Packit c4476c
Packit c4476c
static const unsigned char cfb_cipher64[CFB_TEST_SIZE] = {
Packit c4476c
    0x59, 0xD8, 0xE2, 0x65, 0x00, 0x58, 0x6C, 0x3F,
Packit c4476c
    0x2C, 0x17, 0x25, 0xD0, 0x1A, 0x38, 0xB7, 0x2A,
Packit c4476c
    0x39, 0x61, 0x37, 0xDC, 0x79, 0xFB, 0x9F, 0x45
Packit c4476c
/*- 0xF9,0x78,0x32,0xB5,0x42,0x1A,0x6B,0x38,
Packit c4476c
    0x9A,0x44,0xD6,0x04,0x19,0x43,0xC4,0xD9,
Packit c4476c
    0x3D,0x1E,0xAE,0x47,0xFC,0xCF,0x29,0x0B,*/
Packit c4476c
};
Packit c4476c
Packit c4476c
static int test_idea_ecb(void)
Packit c4476c
{
Packit c4476c
    IDEA_KEY_SCHEDULE key, dkey;
Packit c4476c
Packit c4476c
    IDEA_set_encrypt_key(k, &key);
Packit c4476c
    IDEA_ecb_encrypt(in, out, &key);
Packit c4476c
    if (!TEST_mem_eq(out, IDEA_BLOCK, c, sizeof(c)))
Packit c4476c
        return 0;
Packit c4476c
Packit c4476c
    IDEA_set_decrypt_key(&key, &dkey);
Packit c4476c
    IDEA_ecb_encrypt(c, out, &dkey);
Packit c4476c
    return TEST_mem_eq(out, IDEA_BLOCK, in, sizeof(in));
Packit c4476c
}
Packit c4476c
Packit c4476c
static int test_idea_cbc(void)
Packit c4476c
{
Packit c4476c
    IDEA_KEY_SCHEDULE key, dkey;
Packit c4476c
    unsigned char iv[IDEA_BLOCK];
Packit c4476c
    const size_t text_len = sizeof(text);
Packit c4476c
Packit c4476c
    IDEA_set_encrypt_key(k, &key);
Packit c4476c
    IDEA_set_decrypt_key(&key, &dkey);
Packit c4476c
    memcpy(iv, k, sizeof(iv));
Packit c4476c
    IDEA_cbc_encrypt((unsigned char *)text, out, text_len, &key, iv, 1);
Packit c4476c
    memcpy(iv, k, sizeof(iv));
Packit c4476c
    IDEA_cbc_encrypt(out, out, IDEA_BLOCK, &dkey, iv, 0);
Packit c4476c
    IDEA_cbc_encrypt(&out[8], &out[8], text_len - 8, &dkey, iv, 0);
Packit c4476c
    return TEST_mem_eq(text, text_len, out, text_len);
Packit c4476c
}
Packit c4476c
Packit c4476c
static int test_idea_cfb64(void)
Packit c4476c
{
Packit c4476c
    IDEA_KEY_SCHEDULE eks, dks;
Packit c4476c
    int n;
Packit c4476c
Packit c4476c
    IDEA_set_encrypt_key(cfb_key, &eks);
Packit c4476c
    IDEA_set_decrypt_key(&eks, &dks);
Packit c4476c
    memcpy(cfb_tmp, cfb_iv, sizeof(cfb_tmp));
Packit c4476c
    n = 0;
Packit c4476c
    IDEA_cfb64_encrypt(plain, cfb_buf1, (long)12, &eks,
Packit c4476c
                       cfb_tmp, &n, IDEA_ENCRYPT);
Packit c4476c
    IDEA_cfb64_encrypt(&plain[12], &cfb_buf1[12],
Packit c4476c
                       (long)CFB_TEST_SIZE - 12, &eks,
Packit c4476c
                       cfb_tmp, &n, IDEA_ENCRYPT);
Packit c4476c
    if (!TEST_mem_eq(cfb_cipher64, CFB_TEST_SIZE, cfb_buf1, CFB_TEST_SIZE))
Packit c4476c
        return 0;
Packit c4476c
    memcpy(cfb_tmp, cfb_iv, sizeof(cfb_tmp));
Packit c4476c
    n = 0;
Packit c4476c
    IDEA_cfb64_encrypt(cfb_buf1, cfb_buf2, (long)13, &eks,
Packit c4476c
                       cfb_tmp, &n, IDEA_DECRYPT);
Packit c4476c
    IDEA_cfb64_encrypt(&cfb_buf1[13], &cfb_buf2[13],
Packit c4476c
                       (long)CFB_TEST_SIZE - 13, &eks,
Packit c4476c
                       cfb_tmp, &n, IDEA_DECRYPT);
Packit c4476c
    return TEST_mem_eq(plain, CFB_TEST_SIZE, cfb_buf2, CFB_TEST_SIZE);
Packit c4476c
}
Packit c4476c
#endif
Packit c4476c
Packit c4476c
int setup_tests(void)
Packit c4476c
{
Packit c4476c
#ifndef OPENSSL_NO_IDEA
Packit c4476c
    ADD_TEST(test_idea_ecb);
Packit c4476c
    ADD_TEST(test_idea_cbc);
Packit c4476c
    ADD_TEST(test_idea_cfb64);
Packit c4476c
#endif
Packit c4476c
    return 1;
Packit c4476c
}