1a74702c6SGeorge Wang/* Copyright (c) 2017 - 2022 LiteSpeed Technologies Inc.  See LICENSE. */
250aadb33SDmitri Tikhonov/*
350aadb33SDmitri Tikhonov * test_dec.c -- Benchmark decryption using aligned and non-aligned buffers.
450aadb33SDmitri Tikhonov */
550aadb33SDmitri Tikhonov
650aadb33SDmitri Tikhonov#include <assert.h>
750aadb33SDmitri Tikhonov#include <stdint.h>
850aadb33SDmitri Tikhonov#include <stdio.h>
950aadb33SDmitri Tikhonov#include <stdlib.h>
1050aadb33SDmitri Tikhonov#include <string.h>
11461e84d8SAmol Deshpande#ifndef WIN32
1250aadb33SDmitri Tikhonov#include <unistd.h>
13461e84d8SAmol Deshpande#else
14461e84d8SAmol Deshpande#include <getopt.h>
15461e84d8SAmol Deshpande#endif
1650aadb33SDmitri Tikhonov
1750aadb33SDmitri Tikhonov#include <openssl/aead.h>
1850aadb33SDmitri Tikhonov#include <openssl/rand.h>
1950aadb33SDmitri Tikhonov
2050aadb33SDmitri Tikhonov#define MAX_SIZE 1400
2150aadb33SDmitri Tikhonov
2250aadb33SDmitri Tikhonovint
2350aadb33SDmitri Tikhonovmain (int argc, char **argv)
2450aadb33SDmitri Tikhonov{
2550aadb33SDmitri Tikhonov    EVP_AEAD_CTX aead_ctx;
2650aadb33SDmitri Tikhonov    int opt, n = 1, r;
2750aadb33SDmitri Tikhonov    size_t sealed_len, opened_len;
2850aadb33SDmitri Tikhonov    unsigned char key[16];
2950aadb33SDmitri Tikhonov    unsigned char data[1328];
3050aadb33SDmitri Tikhonov    unsigned char sealed_buf[63 + MAX_SIZE], *sealed = sealed_buf;
3150aadb33SDmitri Tikhonov    unsigned char opened_buf[63 + MAX_SIZE], *opened = opened_buf;
3250aadb33SDmitri Tikhonov
3350aadb33SDmitri Tikhonov    while (-1 != (opt = getopt(argc, argv, "an:")))
3450aadb33SDmitri Tikhonov    {
3550aadb33SDmitri Tikhonov        switch (opt)
3650aadb33SDmitri Tikhonov        {
3750aadb33SDmitri Tikhonov        case 'a':
3850aadb33SDmitri Tikhonov            if ((uintptr_t) sealed & (64 - 1))
3950aadb33SDmitri Tikhonov                sealed += 64 - ((uintptr_t) sealed & (64 - 1));
4050aadb33SDmitri Tikhonov            if ((uintptr_t) opened & (64 - 1))
4150aadb33SDmitri Tikhonov                opened += 64 - ((uintptr_t) opened & (64 - 1));
4250aadb33SDmitri Tikhonov            break;
4350aadb33SDmitri Tikhonov        case 'n':                   /* Number of decrypt iterations */
4450aadb33SDmitri Tikhonov            n = atoi(optarg);
4550aadb33SDmitri Tikhonov            break;
4650aadb33SDmitri Tikhonov        default:
4750aadb33SDmitri Tikhonov            exit(EXIT_FAILURE);
4850aadb33SDmitri Tikhonov        }
4950aadb33SDmitri Tikhonov    }
5050aadb33SDmitri Tikhonov
5150aadb33SDmitri Tikhonov    RAND_bytes(key, sizeof(key));
5250aadb33SDmitri Tikhonov    RAND_bytes(data, sizeof(data));
5350aadb33SDmitri Tikhonov
5450aadb33SDmitri Tikhonov    EVP_AEAD_CTX_init(&aead_ctx, EVP_aead_aes_128_gcm(), key, sizeof(key),
5550aadb33SDmitri Tikhonov                                                                    12, NULL);
5650aadb33SDmitri Tikhonov    r = EVP_AEAD_CTX_seal(&aead_ctx, sealed, &sealed_len, MAX_SIZE,
5750aadb33SDmitri Tikhonov                              key, sizeof(key), data, sizeof(data), NULL, 0);
5850aadb33SDmitri Tikhonov    if (!r)
5950aadb33SDmitri Tikhonov    {
6050aadb33SDmitri Tikhonov        fprintf(stderr, "cannot seal\n");
6150aadb33SDmitri Tikhonov        exit(EXIT_FAILURE);
6250aadb33SDmitri Tikhonov    }
6350aadb33SDmitri Tikhonov
6450aadb33SDmitri Tikhonov    printf("buffers are %saligned\n", ((uintptr_t) opened & (64 - 1)) ||
6550aadb33SDmitri Tikhonov                            ((uintptr_t) sealed & (64 - 1)) ?  "not " : "");
6650aadb33SDmitri Tikhonov
6750aadb33SDmitri Tikhonov    /* Check that decryption works first time around */
6850aadb33SDmitri Tikhonov    r = EVP_AEAD_CTX_open(&aead_ctx, opened, &opened_len, MAX_SIZE,
6950aadb33SDmitri Tikhonov                          key, sizeof(key), sealed, sealed_len, NULL, 0);
7050aadb33SDmitri Tikhonov    assert(r && opened_len == sizeof(data) &&
7150aadb33SDmitri Tikhonov                                0 == memcmp(data, opened, sizeof(data)));
7250aadb33SDmitri Tikhonov    --n;
7350aadb33SDmitri Tikhonov
7450aadb33SDmitri Tikhonov    /* Do no bother checking return value in the loop */
7550aadb33SDmitri Tikhonov    while (n-- > 0)
7650aadb33SDmitri Tikhonov    {
7750aadb33SDmitri Tikhonov        EVP_AEAD_CTX_open(&aead_ctx, opened, &opened_len, MAX_SIZE,
7850aadb33SDmitri Tikhonov                          key, sizeof(key), sealed, sealed_len, NULL, 0);
7950aadb33SDmitri Tikhonov    }
8050aadb33SDmitri Tikhonov
8150aadb33SDmitri Tikhonov    exit(EXIT_SUCCESS);
8250aadb33SDmitri Tikhonov}
83