Home | History | Annotate | Line # | Download | only in test
      1  1.1.1.2  christos /*
      2  1.1.1.2  christos  * Copyright 2006-2017 The OpenSSL Project Authors. All Rights Reserved.
      3      1.1  christos  *
      4  1.1.1.2  christos  * Licensed under the OpenSSL license (the "License").  You may not use
      5  1.1.1.2  christos  * this file except in compliance with the License.  You can obtain a copy
      6  1.1.1.2  christos  * in the file LICENSE in the source distribution or at
      7  1.1.1.2  christos  * https://www.openssl.org/source/license.html
      8      1.1  christos  */
      9      1.1  christos 
     10  1.1.1.2  christos #include <openssl/crypto.h>
     11      1.1  christos #include <openssl/aes.h>
     12      1.1  christos #include <openssl/rand.h>
     13      1.1  christos #include <stdio.h>
     14      1.1  christos #include <string.h>
     15  1.1.1.2  christos #include "internal/nelem.h"
     16  1.1.1.2  christos #include "testutil.h"
     17      1.1  christos 
     18      1.1  christos #define TEST_SIZE       128
     19      1.1  christos #define BIG_TEST_SIZE 10240
     20      1.1  christos 
     21  1.1.1.2  christos #if BIG_TEST_SIZE < TEST_SIZE
     22  1.1.1.2  christos #error BIG_TEST_SIZE is smaller than TEST_SIZE
     23  1.1.1.2  christos #endif
     24  1.1.1.2  christos 
     25  1.1.1.2  christos static unsigned char rkey[16];
     26  1.1.1.2  christos static unsigned char rkey2[16];
     27  1.1.1.2  christos static unsigned char plaintext[BIG_TEST_SIZE];
     28  1.1.1.2  christos static unsigned char saved_iv[AES_BLOCK_SIZE * 4];
     29      1.1  christos 
     30      1.1  christos #define MAX_VECTOR_SIZE 64
     31      1.1  christos 
     32      1.1  christos struct ige_test {
     33      1.1  christos     const unsigned char key[16];
     34      1.1  christos     const unsigned char iv[32];
     35      1.1  christos     const unsigned char in[MAX_VECTOR_SIZE];
     36      1.1  christos     const unsigned char out[MAX_VECTOR_SIZE];
     37      1.1  christos     const size_t length;
     38      1.1  christos     const int encrypt;
     39      1.1  christos };
     40      1.1  christos 
     41      1.1  christos static struct ige_test const ige_test_vectors[] = {
     42      1.1  christos     {{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
     43      1.1  christos       0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, /* key */
     44      1.1  christos      {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
     45      1.1  christos       0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
     46      1.1  christos       0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
     47      1.1  christos       0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f}, /* iv */
     48      1.1  christos      {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     49      1.1  christos       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     50      1.1  christos       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     51      1.1  christos       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* in */
     52      1.1  christos      {0x1a, 0x85, 0x19, 0xa6, 0x55, 0x7b, 0xe6, 0x52,
     53      1.1  christos       0xe9, 0xda, 0x8e, 0x43, 0xda, 0x4e, 0xf4, 0x45,
     54      1.1  christos       0x3c, 0xf4, 0x56, 0xb4, 0xca, 0x48, 0x8a, 0xa3,
     55      1.1  christos       0x83, 0xc7, 0x9c, 0x98, 0xb3, 0x47, 0x97, 0xcb}, /* out */
     56      1.1  christos      32, AES_ENCRYPT},          /* test vector 0 */
     57      1.1  christos 
     58      1.1  christos     {{0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20,
     59      1.1  christos       0x61, 0x6e, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x65}, /* key */
     60      1.1  christos      {0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f,
     61      1.1  christos       0x6e, 0x20, 0x6f, 0x66, 0x20, 0x49, 0x47, 0x45,
     62      1.1  christos       0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x66, 0x6f,
     63      1.1  christos       0x72, 0x20, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x53}, /* iv */
     64      1.1  christos      {0x4c, 0x2e, 0x20, 0x4c, 0x65, 0x74, 0x27, 0x73,
     65      1.1  christos       0x20, 0x68, 0x6f, 0x70, 0x65, 0x20, 0x42, 0x65,
     66      1.1  christos       0x6e, 0x20, 0x67, 0x6f, 0x74, 0x20, 0x69, 0x74,
     67      1.1  christos       0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x21, 0x0a}, /* in */
     68      1.1  christos      {0x99, 0x70, 0x64, 0x87, 0xa1, 0xcd, 0xe6, 0x13,
     69      1.1  christos       0xbc, 0x6d, 0xe0, 0xb6, 0xf2, 0x4b, 0x1c, 0x7a,
     70      1.1  christos       0xa4, 0x48, 0xc8, 0xb9, 0xc3, 0x40, 0x3e, 0x34,
     71      1.1  christos       0x67, 0xa8, 0xca, 0xd8, 0x93, 0x40, 0xf5, 0x3b}, /* out */
     72      1.1  christos      32, AES_DECRYPT},          /* test vector 1 */
     73      1.1  christos };
     74      1.1  christos 
     75      1.1  christos struct bi_ige_test {
     76      1.1  christos     const unsigned char key1[32];
     77      1.1  christos     const unsigned char key2[32];
     78      1.1  christos     const unsigned char iv[64];
     79      1.1  christos     const unsigned char in[MAX_VECTOR_SIZE];
     80      1.1  christos     const unsigned char out[MAX_VECTOR_SIZE];
     81      1.1  christos     const size_t keysize;
     82      1.1  christos     const size_t length;
     83      1.1  christos     const int encrypt;
     84      1.1  christos };
     85      1.1  christos 
     86      1.1  christos static struct bi_ige_test const bi_ige_test_vectors[] = {
     87      1.1  christos     {{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
     88      1.1  christos       0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, /* key1 */
     89      1.1  christos      {0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
     90      1.1  christos       0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f}, /* key2 */
     91      1.1  christos      {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
     92      1.1  christos       0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
     93      1.1  christos       0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
     94      1.1  christos       0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
     95      1.1  christos       0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
     96      1.1  christos       0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
     97      1.1  christos       0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
     98      1.1  christos       0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f}, /* iv */
     99      1.1  christos      {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    100      1.1  christos       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    101      1.1  christos       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    102      1.1  christos       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* in */
    103      1.1  christos      {0x14, 0x40, 0x6f, 0xae, 0xa2, 0x79, 0xf2, 0x56,
    104      1.1  christos       0x1f, 0x86, 0xeb, 0x3b, 0x7d, 0xff, 0x53, 0xdc,
    105      1.1  christos       0x4e, 0x27, 0x0c, 0x03, 0xde, 0x7c, 0xe5, 0x16,
    106      1.1  christos       0x6a, 0x9c, 0x20, 0x33, 0x9d, 0x33, 0xfe, 0x12}, /* out */
    107      1.1  christos      16, 32, AES_ENCRYPT},      /* test vector 0 */
    108      1.1  christos     {{0x58, 0x0a, 0x06, 0xe9, 0x97, 0x07, 0x59, 0x5c,
    109      1.1  christos       0x9e, 0x19, 0xd2, 0xa7, 0xbb, 0x40, 0x2b, 0x7a,
    110      1.1  christos       0xc7, 0xd8, 0x11, 0x9e, 0x4c, 0x51, 0x35, 0x75,
    111      1.1  christos       0x64, 0x28, 0x0f, 0x23, 0xad, 0x74, 0xac, 0x37}, /* key1 */
    112      1.1  christos      {0xd1, 0x80, 0xa0, 0x31, 0x47, 0xa3, 0x11, 0x13,
    113      1.1  christos       0x86, 0x26, 0x9e, 0x6d, 0xff, 0xaf, 0x72, 0x74,
    114      1.1  christos       0x5b, 0xa2, 0x35, 0x81, 0xd2, 0xa6, 0x3d, 0x21,
    115      1.1  christos       0x67, 0x7b, 0x58, 0xa8, 0x18, 0xf9, 0x72, 0xe4}, /* key2 */
    116      1.1  christos      {0x80, 0x3d, 0xbd, 0x4c, 0xe6, 0x7b, 0x06, 0xa9,
    117      1.1  christos       0x53, 0x35, 0xd5, 0x7e, 0x71, 0xc1, 0x70, 0x70,
    118      1.1  christos       0x74, 0x9a, 0x00, 0x28, 0x0c, 0xbf, 0x6c, 0x42,
    119      1.1  christos       0x9b, 0xa4, 0xdd, 0x65, 0x11, 0x77, 0x7c, 0x67,
    120      1.1  christos       0xfe, 0x76, 0x0a, 0xf0, 0xd5, 0xc6, 0x6e, 0x6a,
    121      1.1  christos       0xe7, 0x5e, 0x4c, 0xf2, 0x7e, 0x9e, 0xf9, 0x20,
    122      1.1  christos       0x0e, 0x54, 0x6f, 0x2d, 0x8a, 0x8d, 0x7e, 0xbd,
    123      1.1  christos       0x48, 0x79, 0x37, 0x99, 0xff, 0x27, 0x93, 0xa3}, /* iv */
    124      1.1  christos      {0xf1, 0x54, 0x3d, 0xca, 0xfe, 0xb5, 0xef, 0x1c,
    125      1.1  christos       0x4f, 0xa6, 0x43, 0xf6, 0xe6, 0x48, 0x57, 0xf0,
    126      1.1  christos       0xee, 0x15, 0x7f, 0xe3, 0xe7, 0x2f, 0xd0, 0x2f,
    127      1.1  christos       0x11, 0x95, 0x7a, 0x17, 0x00, 0xab, 0xa7, 0x0b,
    128      1.1  christos       0xbe, 0x44, 0x09, 0x9c, 0xcd, 0xac, 0xa8, 0x52,
    129      1.1  christos       0xa1, 0x8e, 0x7b, 0x75, 0xbc, 0xa4, 0x92, 0x5a,
    130      1.1  christos       0xab, 0x46, 0xd3, 0x3a, 0xa0, 0xd5, 0x35, 0x1c,
    131      1.1  christos       0x55, 0xa4, 0xb3, 0xa8, 0x40, 0x81, 0xa5, 0x0b}, /* in */
    132      1.1  christos      {0x42, 0xe5, 0x28, 0x30, 0x31, 0xc2, 0xa0, 0x23,
    133      1.1  christos       0x68, 0x49, 0x4e, 0xb3, 0x24, 0x59, 0x92, 0x79,
    134      1.1  christos       0xc1, 0xa5, 0xcc, 0xe6, 0x76, 0x53, 0xb1, 0xcf,
    135      1.1  christos       0x20, 0x86, 0x23, 0xe8, 0x72, 0x55, 0x99, 0x92,
    136      1.1  christos       0x0d, 0x16, 0x1c, 0x5a, 0x2f, 0xce, 0xcb, 0x51,
    137      1.1  christos       0xe2, 0x67, 0xfa, 0x10, 0xec, 0xcd, 0x3d, 0x67,
    138      1.1  christos       0xa5, 0xe6, 0xf7, 0x31, 0x26, 0xb0, 0x0d, 0x76,
    139      1.1  christos       0x5e, 0x28, 0xdc, 0x7f, 0x01, 0xc5, 0xa5, 0x4c}, /* out */
    140      1.1  christos      32, 64, AES_ENCRYPT},      /* test vector 1 */
    141      1.1  christos 
    142      1.1  christos };
    143      1.1  christos 
    144  1.1.1.2  christos static int test_ige_vectors(int n)
    145      1.1  christos {
    146  1.1.1.2  christos     const struct ige_test *const v = &ige_test_vectors[n];
    147  1.1.1.2  christos     AES_KEY key;
    148  1.1.1.2  christos     unsigned char buf[MAX_VECTOR_SIZE];
    149  1.1.1.2  christos     unsigned char iv[AES_BLOCK_SIZE * 2];
    150  1.1.1.2  christos     int testresult = 1;
    151  1.1.1.2  christos 
    152  1.1.1.2  christos     if (!TEST_int_le(v->length, MAX_VECTOR_SIZE))
    153  1.1.1.2  christos         return 0;
    154  1.1.1.2  christos 
    155  1.1.1.2  christos     if (v->encrypt == AES_ENCRYPT)
    156  1.1.1.2  christos         AES_set_encrypt_key(v->key, 8 * sizeof(v->key), &key);
    157  1.1.1.2  christos     else
    158  1.1.1.2  christos         AES_set_decrypt_key(v->key, 8 * sizeof(v->key), &key);
    159  1.1.1.2  christos     memcpy(iv, v->iv, sizeof(iv));
    160  1.1.1.2  christos     AES_ige_encrypt(v->in, buf, v->length, &key, iv, v->encrypt);
    161  1.1.1.2  christos 
    162  1.1.1.2  christos     if (!TEST_mem_eq(v->out, v->length, buf, v->length)) {
    163  1.1.1.2  christos         TEST_info("IGE test vector %d failed", n);
    164  1.1.1.2  christos         test_output_memory("key", v->key, sizeof(v->key));
    165  1.1.1.2  christos         test_output_memory("iv", v->iv, sizeof(v->iv));
    166  1.1.1.2  christos         test_output_memory("in", v->in, v->length);
    167  1.1.1.2  christos         testresult = 0;
    168  1.1.1.2  christos     }
    169  1.1.1.2  christos 
    170  1.1.1.2  christos     /* try with in == out */
    171  1.1.1.2  christos     memcpy(iv, v->iv, sizeof(iv));
    172  1.1.1.2  christos     memcpy(buf, v->in, v->length);
    173  1.1.1.2  christos     AES_ige_encrypt(buf, buf, v->length, &key, iv, v->encrypt);
    174  1.1.1.2  christos 
    175  1.1.1.2  christos     if (!TEST_mem_eq(v->out, v->length, buf, v->length)) {
    176  1.1.1.2  christos         TEST_info("IGE test vector %d failed (with in == out)", n);
    177  1.1.1.2  christos         test_output_memory("key", v->key, sizeof(v->key));
    178  1.1.1.2  christos         test_output_memory("iv", v->iv, sizeof(v->iv));
    179  1.1.1.2  christos         test_output_memory("in", v->in, v->length);
    180  1.1.1.2  christos         testresult = 0;
    181  1.1.1.2  christos     }
    182      1.1  christos 
    183  1.1.1.2  christos     return testresult;
    184  1.1.1.2  christos }
    185      1.1  christos 
    186  1.1.1.2  christos static int test_bi_ige_vectors(int n)
    187  1.1.1.2  christos {
    188  1.1.1.2  christos     const struct bi_ige_test *const v = &bi_ige_test_vectors[n];
    189  1.1.1.2  christos     AES_KEY key1;
    190  1.1.1.2  christos     AES_KEY key2;
    191  1.1.1.2  christos     unsigned char buf[MAX_VECTOR_SIZE];
    192  1.1.1.2  christos 
    193  1.1.1.2  christos         if (!TEST_int_le(v->length, MAX_VECTOR_SIZE))
    194  1.1.1.2  christos             return 0;
    195  1.1.1.2  christos 
    196  1.1.1.2  christos     if (v->encrypt == AES_ENCRYPT) {
    197  1.1.1.2  christos         AES_set_encrypt_key(v->key1, 8 * v->keysize, &key1);
    198  1.1.1.2  christos         AES_set_encrypt_key(v->key2, 8 * v->keysize, &key2);
    199  1.1.1.2  christos     } else {
    200  1.1.1.2  christos         AES_set_decrypt_key(v->key1, 8 * v->keysize, &key1);
    201  1.1.1.2  christos         AES_set_decrypt_key(v->key2, 8 * v->keysize, &key2);
    202      1.1  christos     }
    203      1.1  christos 
    204  1.1.1.2  christos     AES_bi_ige_encrypt(v->in, buf, v->length, &key1, &key2, v->iv,
    205  1.1.1.2  christos                        v->encrypt);
    206      1.1  christos 
    207  1.1.1.2  christos     if (!TEST_mem_eq(v->out, v->length, buf, v->length)) {
    208  1.1.1.2  christos         test_output_memory("key 1", v->key1, sizeof(v->key1));
    209  1.1.1.2  christos         test_output_memory("key 2", v->key2, sizeof(v->key2));
    210  1.1.1.2  christos         test_output_memory("iv", v->iv, sizeof(v->iv));
    211  1.1.1.2  christos         test_output_memory("in", v->in, v->length);
    212  1.1.1.2  christos         return 0;
    213      1.1  christos     }
    214      1.1  christos 
    215  1.1.1.2  christos     return 1;
    216      1.1  christos }
    217      1.1  christos 
    218  1.1.1.2  christos static int test_ige_enc_dec(void)
    219      1.1  christos {
    220      1.1  christos     AES_KEY key;
    221  1.1.1.2  christos     unsigned char iv[AES_BLOCK_SIZE * 4];
    222      1.1  christos     unsigned char ciphertext[BIG_TEST_SIZE];
    223      1.1  christos     unsigned char checktext[BIG_TEST_SIZE];
    224      1.1  christos 
    225  1.1.1.2  christos     memcpy(iv, saved_iv, sizeof(iv));
    226  1.1.1.2  christos     AES_set_encrypt_key(rkey, 8 * sizeof(rkey), &key);
    227      1.1  christos     AES_ige_encrypt(plaintext, ciphertext, TEST_SIZE, &key, iv, AES_ENCRYPT);
    228      1.1  christos 
    229  1.1.1.2  christos     AES_set_decrypt_key(rkey, 8 * sizeof(rkey), &key);
    230  1.1.1.2  christos     memcpy(iv, saved_iv, sizeof(iv));
    231      1.1  christos     AES_ige_encrypt(ciphertext, checktext, TEST_SIZE, &key, iv, AES_DECRYPT);
    232      1.1  christos 
    233  1.1.1.2  christos     return TEST_mem_eq(checktext, TEST_SIZE, plaintext, TEST_SIZE);
    234  1.1.1.2  christos }
    235  1.1.1.2  christos 
    236  1.1.1.2  christos static int test_ige_enc_chaining(void)
    237  1.1.1.2  christos {
    238  1.1.1.2  christos     AES_KEY key;
    239  1.1.1.2  christos     unsigned char iv[AES_BLOCK_SIZE * 4];
    240  1.1.1.2  christos     unsigned char ciphertext[BIG_TEST_SIZE];
    241  1.1.1.2  christos     unsigned char checktext[BIG_TEST_SIZE];
    242      1.1  christos 
    243  1.1.1.2  christos     AES_set_encrypt_key(rkey, 8 * sizeof(rkey), &key);
    244  1.1.1.2  christos     memcpy(iv, saved_iv, sizeof(iv));
    245      1.1  christos     AES_ige_encrypt(plaintext, ciphertext, TEST_SIZE / 2, &key, iv,
    246      1.1  christos                     AES_ENCRYPT);
    247      1.1  christos     AES_ige_encrypt(plaintext + TEST_SIZE / 2,
    248      1.1  christos                     ciphertext + TEST_SIZE / 2, TEST_SIZE / 2,
    249      1.1  christos                     &key, iv, AES_ENCRYPT);
    250      1.1  christos 
    251  1.1.1.2  christos     AES_set_decrypt_key(rkey, 8 * sizeof(rkey), &key);
    252  1.1.1.2  christos     memcpy(iv, saved_iv, sizeof(iv));
    253      1.1  christos     AES_ige_encrypt(ciphertext, checktext, TEST_SIZE, &key, iv, AES_DECRYPT);
    254      1.1  christos 
    255  1.1.1.2  christos     return TEST_mem_eq(checktext, TEST_SIZE, plaintext, TEST_SIZE);
    256  1.1.1.2  christos }
    257      1.1  christos 
    258  1.1.1.2  christos static int test_ige_dec_chaining(void)
    259  1.1.1.2  christos {
    260  1.1.1.2  christos     AES_KEY key;
    261  1.1.1.2  christos     unsigned char iv[AES_BLOCK_SIZE * 4];
    262  1.1.1.2  christos     unsigned char ciphertext[BIG_TEST_SIZE];
    263  1.1.1.2  christos     unsigned char checktext[BIG_TEST_SIZE];
    264  1.1.1.2  christos 
    265  1.1.1.2  christos     AES_set_encrypt_key(rkey, 8 * sizeof(rkey), &key);
    266  1.1.1.2  christos     memcpy(iv, saved_iv, sizeof(iv));
    267      1.1  christos     AES_ige_encrypt(plaintext, ciphertext, TEST_SIZE / 2, &key, iv,
    268      1.1  christos                     AES_ENCRYPT);
    269      1.1  christos     AES_ige_encrypt(plaintext + TEST_SIZE / 2,
    270      1.1  christos                     ciphertext + TEST_SIZE / 2, TEST_SIZE / 2,
    271      1.1  christos                     &key, iv, AES_ENCRYPT);
    272      1.1  christos 
    273  1.1.1.2  christos     AES_set_decrypt_key(rkey, 8 * sizeof(rkey), &key);
    274  1.1.1.2  christos     memcpy(iv, saved_iv, sizeof(iv));
    275      1.1  christos     AES_ige_encrypt(ciphertext, checktext, TEST_SIZE / 2, &key, iv,
    276      1.1  christos                     AES_DECRYPT);
    277      1.1  christos     AES_ige_encrypt(ciphertext + TEST_SIZE / 2,
    278      1.1  christos                     checktext + TEST_SIZE / 2, TEST_SIZE / 2, &key, iv,
    279      1.1  christos                     AES_DECRYPT);
    280      1.1  christos 
    281  1.1.1.2  christos     return TEST_mem_eq(checktext, TEST_SIZE, plaintext, TEST_SIZE);
    282  1.1.1.2  christos }
    283      1.1  christos 
    284  1.1.1.2  christos static int test_ige_garble_forwards(void)
    285  1.1.1.2  christos {
    286  1.1.1.2  christos     AES_KEY key;
    287  1.1.1.2  christos     unsigned char iv[AES_BLOCK_SIZE * 4];
    288  1.1.1.2  christos     unsigned char ciphertext[BIG_TEST_SIZE];
    289  1.1.1.2  christos     unsigned char checktext[BIG_TEST_SIZE];
    290  1.1.1.2  christos     unsigned int n;
    291  1.1.1.2  christos     int testresult = 1;
    292  1.1.1.2  christos     const size_t ctsize = sizeof(checktext);
    293  1.1.1.2  christos     size_t matches;
    294  1.1.1.2  christos 
    295  1.1.1.2  christos     AES_set_encrypt_key(rkey, 8 * sizeof(rkey), &key);
    296  1.1.1.2  christos     memcpy(iv, saved_iv, sizeof(iv));
    297  1.1.1.2  christos     AES_ige_encrypt(plaintext, ciphertext, sizeof(plaintext), &key, iv,
    298      1.1  christos                     AES_ENCRYPT);
    299      1.1  christos 
    300      1.1  christos     /* corrupt halfway through */
    301  1.1.1.2  christos     ++ciphertext[sizeof(ciphertext) / 2];
    302  1.1.1.2  christos     AES_set_decrypt_key(rkey, 8 * sizeof(rkey), &key);
    303  1.1.1.2  christos     memcpy(iv, saved_iv, sizeof(iv));
    304  1.1.1.2  christos     AES_ige_encrypt(ciphertext, checktext, sizeof(checktext), &key, iv,
    305      1.1  christos                     AES_DECRYPT);
    306      1.1  christos 
    307      1.1  christos     matches = 0;
    308  1.1.1.2  christos     for (n = 0; n < sizeof(checktext); ++n)
    309      1.1  christos         if (checktext[n] == plaintext[n])
    310      1.1  christos             ++matches;
    311      1.1  christos 
    312  1.1.1.2  christos     /* Fail if there is more than 51% matching bytes */
    313  1.1.1.2  christos     if (!TEST_size_t_le(matches, ctsize / 2 + ctsize / 100))
    314  1.1.1.2  christos         testresult = 0;
    315  1.1.1.2  christos 
    316  1.1.1.2  christos     /* Fail if the garble goes backwards */
    317  1.1.1.2  christos     if (!TEST_size_t_gt(matches, ctsize / 2))
    318  1.1.1.2  christos         testresult = 0;
    319  1.1.1.2  christos     return testresult;
    320  1.1.1.2  christos }
    321      1.1  christos 
    322  1.1.1.2  christos static int test_bi_ige_enc_dec(void)
    323  1.1.1.2  christos {
    324  1.1.1.2  christos     AES_KEY key, key2;
    325  1.1.1.2  christos     unsigned char iv[AES_BLOCK_SIZE * 4];
    326  1.1.1.2  christos     unsigned char ciphertext[BIG_TEST_SIZE];
    327  1.1.1.2  christos     unsigned char checktext[BIG_TEST_SIZE];
    328      1.1  christos 
    329  1.1.1.2  christos     memcpy(iv, saved_iv, sizeof(iv));
    330  1.1.1.2  christos     AES_set_encrypt_key(rkey, 8 * sizeof(rkey), &key);
    331  1.1.1.2  christos     AES_set_encrypt_key(rkey2, 8 * sizeof(rkey2), &key2);
    332      1.1  christos     AES_bi_ige_encrypt(plaintext, ciphertext, TEST_SIZE, &key, &key2, iv,
    333      1.1  christos                        AES_ENCRYPT);
    334      1.1  christos 
    335  1.1.1.2  christos     AES_set_decrypt_key(rkey, 8 * sizeof(rkey), &key);
    336  1.1.1.2  christos     AES_set_decrypt_key(rkey2, 8 * sizeof(rkey2), &key2);
    337      1.1  christos     AES_bi_ige_encrypt(ciphertext, checktext, TEST_SIZE, &key, &key2, iv,
    338      1.1  christos                        AES_DECRYPT);
    339      1.1  christos 
    340  1.1.1.2  christos     return TEST_mem_eq(checktext, TEST_SIZE, plaintext, TEST_SIZE);
    341  1.1.1.2  christos }
    342      1.1  christos 
    343  1.1.1.2  christos static int test_bi_ige_garble1(void)
    344  1.1.1.2  christos {
    345  1.1.1.2  christos     AES_KEY key, key2;
    346  1.1.1.2  christos     unsigned char iv[AES_BLOCK_SIZE * 4];
    347  1.1.1.2  christos     unsigned char ciphertext[BIG_TEST_SIZE];
    348  1.1.1.2  christos     unsigned char checktext[BIG_TEST_SIZE];
    349  1.1.1.2  christos     unsigned int n;
    350  1.1.1.2  christos     size_t matches;
    351  1.1.1.2  christos 
    352  1.1.1.2  christos     memcpy(iv, saved_iv, sizeof(iv));
    353  1.1.1.2  christos     AES_set_encrypt_key(rkey, 8 * sizeof(rkey), &key);
    354  1.1.1.2  christos     AES_set_encrypt_key(rkey2, 8 * sizeof(rkey2), &key2);
    355  1.1.1.2  christos     AES_ige_encrypt(plaintext, ciphertext, sizeof(plaintext), &key, iv,
    356      1.1  christos                     AES_ENCRYPT);
    357      1.1  christos 
    358      1.1  christos     /* corrupt halfway through */
    359  1.1.1.2  christos     ++ciphertext[sizeof(ciphertext) / 2];
    360  1.1.1.2  christos     AES_set_decrypt_key(rkey, 8 * sizeof(rkey), &key);
    361  1.1.1.2  christos     AES_set_decrypt_key(rkey2, 8 * sizeof(rkey2), &key2);
    362  1.1.1.2  christos     AES_ige_encrypt(ciphertext, checktext, sizeof(checktext), &key, iv,
    363      1.1  christos                     AES_DECRYPT);
    364      1.1  christos 
    365      1.1  christos     matches = 0;
    366  1.1.1.2  christos     for (n = 0; n < sizeof(checktext); ++n)
    367      1.1  christos         if (checktext[n] == plaintext[n])
    368      1.1  christos             ++matches;
    369      1.1  christos 
    370  1.1.1.2  christos     /* Fail if there is more than 1% matching bytes */
    371  1.1.1.2  christos     return TEST_size_t_le(matches, sizeof(checktext) / 100);
    372  1.1.1.2  christos }
    373      1.1  christos 
    374  1.1.1.2  christos static int test_bi_ige_garble2(void)
    375  1.1.1.2  christos {
    376  1.1.1.2  christos     AES_KEY key, key2;
    377  1.1.1.2  christos     unsigned char iv[AES_BLOCK_SIZE * 4];
    378  1.1.1.2  christos     unsigned char ciphertext[BIG_TEST_SIZE];
    379  1.1.1.2  christos     unsigned char checktext[BIG_TEST_SIZE];
    380  1.1.1.2  christos     unsigned int n;
    381  1.1.1.2  christos     size_t matches;
    382  1.1.1.2  christos 
    383  1.1.1.2  christos     memcpy(iv, saved_iv, sizeof(iv));
    384  1.1.1.2  christos     AES_set_encrypt_key(rkey, 8 * sizeof(rkey), &key);
    385  1.1.1.2  christos     AES_set_encrypt_key(rkey2, 8 * sizeof(rkey2), &key2);
    386  1.1.1.2  christos     AES_ige_encrypt(plaintext, ciphertext, sizeof(plaintext), &key, iv,
    387      1.1  christos                     AES_ENCRYPT);
    388      1.1  christos 
    389      1.1  christos     /* corrupt right at the end */
    390  1.1.1.2  christos     ++ciphertext[sizeof(ciphertext) - 1];
    391  1.1.1.2  christos     AES_set_decrypt_key(rkey, 8 * sizeof(rkey), &key);
    392  1.1.1.2  christos     AES_set_decrypt_key(rkey2, 8 * sizeof(rkey2), &key2);
    393  1.1.1.2  christos     AES_ige_encrypt(ciphertext, checktext, sizeof(checktext), &key, iv,
    394      1.1  christos                     AES_DECRYPT);
    395      1.1  christos 
    396      1.1  christos     matches = 0;
    397  1.1.1.2  christos     for (n = 0; n < sizeof(checktext); ++n)
    398      1.1  christos         if (checktext[n] == plaintext[n])
    399      1.1  christos             ++matches;
    400      1.1  christos 
    401  1.1.1.2  christos     /* Fail if there is more than 1% matching bytes */
    402  1.1.1.2  christos     return TEST_size_t_le(matches, sizeof(checktext) / 100);
    403  1.1.1.2  christos }
    404      1.1  christos 
    405  1.1.1.2  christos static int test_bi_ige_garble3(void)
    406  1.1.1.2  christos {
    407  1.1.1.2  christos     AES_KEY key, key2;
    408  1.1.1.2  christos     unsigned char iv[AES_BLOCK_SIZE * 4];
    409  1.1.1.2  christos     unsigned char ciphertext[BIG_TEST_SIZE];
    410  1.1.1.2  christos     unsigned char checktext[BIG_TEST_SIZE];
    411  1.1.1.2  christos     unsigned int n;
    412  1.1.1.2  christos     size_t matches;
    413  1.1.1.2  christos 
    414  1.1.1.2  christos     memcpy(iv, saved_iv, sizeof(iv));
    415  1.1.1.2  christos     AES_set_encrypt_key(rkey, 8 * sizeof(rkey), &key);
    416  1.1.1.2  christos     AES_set_encrypt_key(rkey2, 8 * sizeof(rkey2), &key2);
    417  1.1.1.2  christos     AES_ige_encrypt(plaintext, ciphertext, sizeof(plaintext), &key, iv,
    418      1.1  christos                     AES_ENCRYPT);
    419      1.1  christos 
    420      1.1  christos     /* corrupt right at the start */
    421      1.1  christos     ++ciphertext[0];
    422  1.1.1.2  christos     AES_set_decrypt_key(rkey, 8 * sizeof(rkey), &key);
    423  1.1.1.2  christos     AES_set_decrypt_key(rkey2, 8 * sizeof(rkey2), &key2);
    424  1.1.1.2  christos     AES_ige_encrypt(ciphertext, checktext, sizeof(checktext), &key, iv,
    425      1.1  christos                     AES_DECRYPT);
    426      1.1  christos 
    427      1.1  christos     matches = 0;
    428  1.1.1.2  christos     for (n = 0; n < sizeof(checktext); ++n)
    429      1.1  christos         if (checktext[n] == plaintext[n])
    430      1.1  christos             ++matches;
    431      1.1  christos 
    432  1.1.1.2  christos     /* Fail if there is more than 1% matching bytes */
    433  1.1.1.2  christos     return TEST_size_t_le(matches, sizeof(checktext) / 100);
    434  1.1.1.2  christos }
    435      1.1  christos 
    436  1.1.1.2  christos int setup_tests(void)
    437  1.1.1.2  christos {
    438  1.1.1.2  christos     RAND_bytes(rkey, sizeof(rkey));
    439  1.1.1.2  christos     RAND_bytes(rkey2, sizeof(rkey2));
    440  1.1.1.2  christos     RAND_bytes(plaintext, sizeof(plaintext));
    441  1.1.1.2  christos     RAND_bytes(saved_iv, sizeof(saved_iv));
    442  1.1.1.2  christos 
    443  1.1.1.2  christos     ADD_TEST(test_ige_enc_dec);
    444  1.1.1.2  christos     ADD_TEST(test_ige_enc_chaining);
    445  1.1.1.2  christos     ADD_TEST(test_ige_dec_chaining);
    446  1.1.1.2  christos     ADD_TEST(test_ige_garble_forwards);
    447  1.1.1.2  christos     ADD_TEST(test_bi_ige_enc_dec);
    448  1.1.1.2  christos     ADD_TEST(test_bi_ige_garble1);
    449  1.1.1.2  christos     ADD_TEST(test_bi_ige_garble2);
    450  1.1.1.2  christos     ADD_TEST(test_bi_ige_garble3);
    451  1.1.1.2  christos     ADD_ALL_TESTS(test_ige_vectors, OSSL_NELEM(ige_test_vectors));
    452  1.1.1.2  christos     ADD_ALL_TESTS(test_bi_ige_vectors, OSSL_NELEM(bi_ige_test_vectors));
    453  1.1.1.2  christos     return 1;
    454      1.1  christos }
    455