components/openssl/openssl-1.0.0/engines/t4/eng_t4.c
author Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
Mon, 14 Nov 2011 08:53:40 -0800
branchs11-sru
changeset 2230 f34d51fb8646
parent 537 10bd3a98a582
child 603 1b966e9a6b03
permissions -rw-r--r--
7101906 Need to add the digest support back to the OpenSSL T4 engine
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
426
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
     1
/*
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
     2
 * CDDL HEADER START
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
     3
 *
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
     5
 * Common Development and Distribution License (the "License").
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
     6
 * You may not use this file except in compliance with the License.
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
     7
 *
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    11
 * and limitations under the License.
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    12
 *
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    18
 *
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    19
 * CDDL HEADER END
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    20
 */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    21
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    22
/*
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    23
 * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    24
 */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    25
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    26
/*
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    27
 * This engine supports SPARC microprocessors that provide AES and other
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    28
 * cipher and hash instructions, such as the T4 microprocessor.
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    29
 */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    30
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    31
#include <openssl/opensslconf.h>
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    32
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    33
#if !defined(OPENSSL_NO_HW) && !defined(OPENSSL_NO_HW_AES_T4) && \
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    34
	!defined(OPENSSL_NO_AES)
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    35
#include <sys/types.h>
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    36
#include <sys/auxv.h>	/* getisax() */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    37
#include <stdlib.h>
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    38
#include <string.h>
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    39
#include <errno.h>
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    40
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    41
#include <openssl/bio.h>
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    42
#include <openssl/aes.h>
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    43
#include <openssl/engine.h>
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    44
#include "eng_t4_aes_asm.h"
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    45
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    46
#define	T4_LIB_NAME "SPARC T4 engine"
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    47
#include "eng_t4_err.c"
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    48
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    49
/* Copied from Solaris aes_impl.h */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    50
#ifndef	MAX_AES_NR
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    51
#define	MAX_AES_NR		14 /* Maximum number of rounds */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    52
#endif
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    53
#ifndef	MAX_AES_NB
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    54
#define	MAX_AES_NB		4  /* Number of columns comprising a state */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    55
#endif
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    56
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    57
/* Index for the supported ciphers */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    58
typedef enum {
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    59
	T4_AES_128_CBC,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    60
	T4_AES_192_CBC,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    61
	T4_AES_256_CBC,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    62
#ifndef	SOLARIS_NO_AES_CFB128
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    63
	T4_AES_128_CFB128,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    64
	T4_AES_192_CFB128,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    65
	T4_AES_256_CFB128,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    66
#endif	/* !SOLARIS_NO_AES_CFB128 */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    67
#ifndef	SOLARIS_NO_AES_CTR
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    68
	T4_AES_128_CTR,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    69
	T4_AES_192_CTR,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    70
	T4_AES_256_CTR,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    71
#endif
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    72
	T4_AES_128_ECB,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    73
	T4_AES_192_ECB,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    74
	T4_AES_256_ECB,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    75
	T4_CIPHER_MAX
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    76
} t4_cipher_id;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    77
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    78
/* T4 cipher context; must be 8-byte aligned (last field must be uint64_t)  */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    79
typedef struct t4_cipher_ctx {
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    80
	t4_cipher_id	index;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    81
	uint64_t	*iv;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    82
	uint64_t	aligned_iv_buffer[2]; /* use if original IV unaligned */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    83
	/* Encryption and decryption key schedule are the same: */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    84
	uint64_t	t4_ks[((MAX_AES_NR) + 1) * (MAX_AES_NB)];
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    85
} t4_cipher_ctx_t;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    86
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    87
typedef struct t4_cipher {
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    88
	t4_cipher_id	id;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    89
	int		nid;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    90
	int		iv_len;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    91
	int		min_key_len;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    92
	int		max_key_len;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    93
	unsigned long	flags;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    94
} t4_cipher_t;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    95
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    96
/* Constants used when creating the ENGINE */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    97
static const char *ENGINE_T4_ID = "t4";
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    98
static const char *ENGINE_T4_NAME = "SPARC T4 engine support";
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
    99
static const char *ENGINE_NO_T4_NAME = "SPARC T4 engine support (no T4)";
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   100
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   101
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   102
#if (defined(sun4v) || defined(__sparcv9) || defined(__sparcv8plus) || \
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   103
	defined(__sparcv8)) && !defined(OPENSSL_NO_ASM)
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   104
#define	COMPILE_HW_T4
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   105
static int t4_bind_helper(ENGINE *e, const char *id);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   106
#pragma inline(t4_bind_helper)
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   107
#endif
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   108
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   109
/*
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   110
 * This makes the engine "built-in" with OpenSSL.
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   111
 * On non-T4 CPUs this just returns.
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   112
 * Called by ENGINE_load_builtin_engines().
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   113
 */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   114
void
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   115
ENGINE_load_t4(void)
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   116
{
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   117
#ifdef COMPILE_HW_T4
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   118
	ENGINE *toadd = ENGINE_new();
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   119
	if (toadd != NULL) {
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   120
		if (t4_bind_helper(toadd, ENGINE_T4_ID) != 0) {
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   121
			(void) ENGINE_add(toadd);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   122
			(void) ENGINE_free(toadd);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   123
			ERR_clear_error();
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   124
		} else {
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   125
			(void) ENGINE_free(toadd);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   126
		}
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   127
	}
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   128
#endif
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   129
}
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   130
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   131
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   132
#ifdef	COMPILE_HW_T4
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   133
static int t4_bind(ENGINE *e);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   134
#ifndef DYNAMIC_ENGINE
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   135
#pragma inline(t4_bind)
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   136
#endif
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   137
static t4_cipher_id get_cipher_index_by_nid(int nid);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   138
#pragma inline(get_cipher_index_by_nid)
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   139
static boolean_t t4_aes_instructions_present(void);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   140
#pragma inline(t4_aes_instructions_present)
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   141
static boolean_t t4_digest_instructions_present(void);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   142
#pragma inline(t4_digest_instructions_present)
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   143
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   144
/* Digest registration function. Called by ENGINE_set_ciphers() */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   145
int t4_get_all_digests(ENGINE *e, const EVP_MD **digest,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   146
    const int **nids, int nid);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   147
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   148
#ifndef	SOLARIS_NO_AES_CTR
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   149
/*
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   150
 * NIDs for AES counter mode that will be defined during the engine
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   151
 * initialization (because OpenSSL doesn't support CTR mode).
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   152
 */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   153
static int NID_t4_aes_128_ctr = NID_undef;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   154
static int NID_t4_aes_192_ctr = NID_undef;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   155
static int NID_t4_aes_256_ctr = NID_undef;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   156
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   157
static int t4_add_NID(char *sn, char *ln);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   158
static int t4_add_aes_ctr_NIDs(void);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   159
#pragma inline(t4_add_aes_ctr_NIDs)
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   160
static void t4_free_aes_ctr_NIDs(void);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   161
#define	T4_FREE_AES_CTR_NIDS	t4_free_aes_ctr_NIDs()
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   162
#else
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   163
#define	T4_FREE_AES_CTR_NIDS
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   164
#endif	/* !SOLARIS_NO_AES_CTR */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   165
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   166
/* Static variables */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   167
/* This can't be const as NID*ctr is inserted when the engine is initialized */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   168
static int t4_cipher_nids[] = {
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   169
	NID_aes_128_cbc,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   170
	NID_aes_192_cbc,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   171
	NID_aes_256_cbc,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   172
#ifndef	SOLARIS_NO_AES_CFB128
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   173
	NID_aes_128_cfb128,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   174
	NID_aes_192_cfb128,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   175
	NID_aes_256_cfb128,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   176
#endif
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   177
#ifndef	SOLARIS_NO_AES_CTR
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   178
	NID_undef, /* NID_t4_aes_128_ctr */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   179
	NID_undef, /* NID_t4_aes_192_ctr */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   180
	NID_undef, /* NID_t4_aes_256_ctr */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   181
#endif
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   182
	NID_aes_128_ecb,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   183
	NID_aes_192_ecb,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   184
	NID_aes_256_ecb,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   185
};
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   186
static const int t4_cipher_count =
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   187
	(sizeof (t4_cipher_nids) / sizeof (t4_cipher_nids[0]));
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   188
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   189
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   190
/*
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   191
 * Cipher Table for all supported symmetric ciphers.
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   192
 * Must be in same order as t4_cipher_id.
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   193
 */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   194
static t4_cipher_t t4_cipher_table[] = {
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   195
	/* ID			NID			IV min- max-key flags */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   196
	{T4_AES_128_CBC,	NID_aes_128_cbc,	16, 16, 16, 0},
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   197
	{T4_AES_192_CBC,	NID_aes_192_cbc,	16, 24, 24, 0},
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   198
	{T4_AES_256_CBC,	NID_aes_256_cbc,	16, 32, 32, 0},
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   199
#ifndef	SOLARIS_NO_AES_CFB128
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   200
	{T4_AES_128_CFB128,	NID_aes_128_cfb128,	16, 16, 16,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   201
							EVP_CIPH_NO_PADDING},
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   202
	{T4_AES_192_CFB128,	NID_aes_192_cfb128,	16, 24, 24,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   203
							EVP_CIPH_NO_PADDING},
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   204
	{T4_AES_256_CFB128,	NID_aes_256_cfb128,	16, 32, 32,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   205
							EVP_CIPH_NO_PADDING},
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   206
#endif
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   207
#ifndef	SOLARIS_NO_AES_CTR
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   208
	/* We don't know the correct NIDs until the engine is initialized */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   209
	{T4_AES_128_CTR,	NID_undef,		16, 16, 16,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   210
							EVP_CIPH_NO_PADDING},
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   211
	{T4_AES_192_CTR,	NID_undef,		16, 24, 24,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   212
							EVP_CIPH_NO_PADDING},
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   213
	{T4_AES_256_CTR,	NID_undef,		16, 32, 32,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   214
							EVP_CIPH_NO_PADDING},
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   215
#endif
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   216
	{T4_AES_128_ECB,	NID_aes_128_ecb,	0, 16, 16, 0},
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   217
	{T4_AES_192_ECB,	NID_aes_192_ecb,	0, 24, 24, 0},
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   218
	{T4_AES_256_ECB,	NID_aes_256_ecb,	0, 32, 32, 0},
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   219
};
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   220
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   221
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   222
/* Formal declaration for functions in EVP_CIPHER structure */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   223
static int t4_cipher_init_aes(EVP_CIPHER_CTX *ctx, const unsigned char *key,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   224
    const unsigned char *iv, int enc);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   225
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   226
static int t4_cipher_do_aes_128_cbc(EVP_CIPHER_CTX *ctx, unsigned char *out,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   227
    const unsigned char *in, size_t inl);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   228
static int t4_cipher_do_aes_192_cbc(EVP_CIPHER_CTX *ctx, unsigned char *out,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   229
    const unsigned char *in, size_t inl);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   230
static int t4_cipher_do_aes_256_cbc(EVP_CIPHER_CTX *ctx, unsigned char *out,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   231
    const unsigned char *in, size_t inl);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   232
#ifndef	SOLARIS_NO_AES_CFB128
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   233
static int t4_cipher_do_aes_128_cfb128(EVP_CIPHER_CTX *ctx, unsigned char *out,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   234
    const unsigned char *in, size_t inl);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   235
static int t4_cipher_do_aes_192_cfb128(EVP_CIPHER_CTX *ctx, unsigned char *out,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   236
    const unsigned char *in, size_t inl);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   237
static int t4_cipher_do_aes_256_cfb128(EVP_CIPHER_CTX *ctx, unsigned char *out,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   238
    const unsigned char *in, size_t inl);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   239
#endif
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   240
#ifndef	SOLARIS_NO_AES_CTR
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   241
static int t4_cipher_do_aes_128_ctr(EVP_CIPHER_CTX *ctx, unsigned char *out,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   242
    const unsigned char *in, size_t inl);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   243
static int t4_cipher_do_aes_192_ctr(EVP_CIPHER_CTX *ctx, unsigned char *out,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   244
    const unsigned char *in, size_t inl);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   245
static int t4_cipher_do_aes_256_ctr(EVP_CIPHER_CTX *ctx, unsigned char *out,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   246
    const unsigned char *in, size_t inl);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   247
#endif	/* !SOLARIS_NO_AES_CTR */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   248
static int t4_cipher_do_aes_128_ecb(EVP_CIPHER_CTX *ctx, unsigned char *out,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   249
    const unsigned char *in, size_t inl);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   250
static int t4_cipher_do_aes_192_ecb(EVP_CIPHER_CTX *ctx, unsigned char *out,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   251
    const unsigned char *in, size_t inl);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   252
static int t4_cipher_do_aes_256_ecb(EVP_CIPHER_CTX *ctx, unsigned char *out,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   253
    const unsigned char *in, size_t inl);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   254
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   255
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   256
/*
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   257
 * Cipher Algorithms
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   258
 *
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   259
 * OpenSSL's libcrypto EVP stuff. This is how this engine gets wired to EVP.
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   260
 * EVP_CIPHER is defined in evp.h.  To maintain binary compatibility the
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   261
 * definition cannot be modified.
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   262
 * Stuff specific to the t4 engine is kept in t4_cipher_ctx_t, which is
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   263
 * pointed to by the last field, app_data.
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   264
 *
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   265
 * Fields: nid, block_size, key_len, iv_len, flags,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   266
 *	init(), do_cipher(), cleanup(),
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   267
 *	ctx_size,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   268
 *	set_asn1_parameters(), get_asn1_parameters(), ctrl(), app_data
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   269
 * For the T4 engine, field app_data points to t4_cipher_ctx_t.
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   270
 */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   271
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   272
static const EVP_CIPHER t4_aes_128_cbc = {
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   273
	NID_aes_128_cbc,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   274
	16, 16, 16,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   275
	EVP_CIPH_CBC_MODE,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   276
	t4_cipher_init_aes, t4_cipher_do_aes_128_cbc, NULL,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   277
	sizeof (t4_cipher_ctx_t),
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   278
	EVP_CIPHER_set_asn1_iv, EVP_CIPHER_get_asn1_iv,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   279
	NULL, NULL
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   280
};
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   281
static const EVP_CIPHER t4_aes_192_cbc = {
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   282
	NID_aes_192_cbc,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   283
	16, 24, 16,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   284
	EVP_CIPH_CBC_MODE,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   285
	t4_cipher_init_aes, t4_cipher_do_aes_192_cbc, NULL,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   286
	sizeof (t4_cipher_ctx_t),
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   287
	EVP_CIPHER_set_asn1_iv, EVP_CIPHER_get_asn1_iv,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   288
	NULL, NULL
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   289
};
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   290
static const EVP_CIPHER t4_aes_256_cbc = {
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   291
	NID_aes_256_cbc,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   292
	16, 32, 16,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   293
	EVP_CIPH_CBC_MODE,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   294
	t4_cipher_init_aes, t4_cipher_do_aes_256_cbc, NULL,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   295
	sizeof (t4_cipher_ctx_t),
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   296
	EVP_CIPHER_set_asn1_iv, EVP_CIPHER_get_asn1_iv,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   297
	NULL, NULL
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   298
};
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   299
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   300
#ifndef	SOLARIS_NO_AES_CFB128
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   301
static const EVP_CIPHER t4_aes_128_cfb128 = {
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   302
	NID_aes_128_cfb128,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   303
	16, 16, 16,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   304
	EVP_CIPH_CFB_MODE,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   305
	t4_cipher_init_aes, t4_cipher_do_aes_128_cfb128, NULL,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   306
	sizeof (t4_cipher_ctx_t),
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   307
	EVP_CIPHER_set_asn1_iv, EVP_CIPHER_get_asn1_iv,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   308
	NULL, NULL
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   309
};
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   310
static const EVP_CIPHER t4_aes_192_cfb128 = {
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   311
	NID_aes_192_cfb128,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   312
	16, 24, 16,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   313
	EVP_CIPH_CFB_MODE,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   314
	t4_cipher_init_aes, t4_cipher_do_aes_192_cfb128, NULL,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   315
	sizeof (t4_cipher_ctx_t),
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   316
	EVP_CIPHER_set_asn1_iv, EVP_CIPHER_get_asn1_iv,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   317
	NULL, NULL
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   318
};
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   319
static const EVP_CIPHER t4_aes_256_cfb128 = {
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   320
	NID_aes_256_cfb128,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   321
	16, 32, 16,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   322
	EVP_CIPH_CFB_MODE,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   323
	t4_cipher_init_aes, t4_cipher_do_aes_256_cfb128, NULL,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   324
	sizeof (t4_cipher_ctx_t),
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   325
	EVP_CIPHER_set_asn1_iv, EVP_CIPHER_get_asn1_iv,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   326
	NULL, NULL
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   327
};
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   328
#endif	/* !SOLARIS_NO_AES_CFB128 */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   329
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   330
#ifndef	SOLARIS_NO_AES_CTR
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   331
/*
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   332
 * Counter mode is not defined in OpenSSL.
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   333
 * NID_undef's will be changed to AES counter mode NIDs as soon as they are
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   334
 * created in t4_add_aes_ctr_NIDs() when the engine is initialized.
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   335
 * Note that the need to change these structures during initialization is the
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   336
 * reason why we don't define them with the const keyword.
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   337
 */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   338
static EVP_CIPHER t4_aes_128_ctr = {
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   339
	NID_undef,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   340
	16, 16, 16,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   341
	EVP_CIPH_CBC_MODE,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   342
	t4_cipher_init_aes, t4_cipher_do_aes_128_ctr, NULL,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   343
	sizeof (t4_cipher_ctx_t),
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   344
	EVP_CIPHER_set_asn1_iv, EVP_CIPHER_get_asn1_iv,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   345
	NULL, NULL
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   346
};
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   347
static EVP_CIPHER t4_aes_192_ctr = {
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   348
	NID_undef,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   349
	16, 24, 16,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   350
	EVP_CIPH_CBC_MODE,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   351
	t4_cipher_init_aes, t4_cipher_do_aes_192_ctr, NULL,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   352
	sizeof (t4_cipher_ctx_t),
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   353
	EVP_CIPHER_set_asn1_iv, EVP_CIPHER_get_asn1_iv,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   354
	NULL, NULL
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   355
};
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   356
static EVP_CIPHER t4_aes_256_ctr = {
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   357
	NID_undef,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   358
	16, 32, 16,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   359
	EVP_CIPH_CBC_MODE,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   360
	t4_cipher_init_aes, t4_cipher_do_aes_256_ctr, NULL,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   361
	sizeof (t4_cipher_ctx_t),
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   362
	EVP_CIPHER_set_asn1_iv, EVP_CIPHER_get_asn1_iv,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   363
	NULL, NULL
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   364
};
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   365
#endif	/* !SOLARIS_NO_AES_CTR */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   366
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   367
/*
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   368
 * ECB modes don't use an Initial Vector, so that's why set_asn1_parameters,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   369
 * get_asn1_parameters, and cleanup fields are set to NULL.
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   370
 */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   371
static const EVP_CIPHER t4_aes_128_ecb = {
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   372
	NID_aes_128_ecb,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   373
	16, 16, 0,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   374
	EVP_CIPH_ECB_MODE,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   375
	t4_cipher_init_aes, t4_cipher_do_aes_128_ecb, NULL,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   376
	sizeof (t4_cipher_ctx_t),
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   377
	NULL, NULL, NULL, NULL
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   378
};
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   379
static const EVP_CIPHER t4_aes_192_ecb = {
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   380
	NID_aes_192_ecb,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   381
	16, 24, 0,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   382
	EVP_CIPH_ECB_MODE,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   383
	t4_cipher_init_aes, t4_cipher_do_aes_192_ecb, NULL,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   384
	sizeof (t4_cipher_ctx_t),
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   385
	NULL, NULL, NULL, NULL
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   386
};
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   387
static const EVP_CIPHER t4_aes_256_ecb = {
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   388
	NID_aes_256_ecb,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   389
	16, 32, 0,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   390
	EVP_CIPH_ECB_MODE,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   391
	t4_cipher_init_aes, t4_cipher_do_aes_256_ecb, NULL,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   392
	sizeof (t4_cipher_ctx_t),
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   393
	NULL, NULL, NULL, NULL
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   394
};
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   395
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   396
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   397
/*
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   398
 * Return true if executing on a SPARC processor with AES instruction support,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   399
 * such as a T4; otherwise false.
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   400
 */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   401
static boolean_t
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   402
t4_aes_instructions_present(void)
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   403
{
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   404
	uint_t ui;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   405
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   406
	(void) getisax(&ui, 1);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   407
	return ((ui & AV_SPARC_AES) != 0);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   408
}
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   409
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   410
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   411
/*
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   412
 * Return true if executing on a SPARC processor with MD5/SHA1/SHA{1,256,512}
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   413
 * instruction support, such as a T4; otherwise false.
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   414
 */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   415
static boolean_t
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   416
t4_digest_instructions_present(void)
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   417
{
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   418
#ifndef	OPENSSL_NO_SHA
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   419
#define	UI_MASK	(AV_SPARC_MD5 | AV_SPARC_SHA1 | AV_SPARC_SHA256 | \
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   420
	AV_SPARC_SHA512)
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   421
#else
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   422
#define	UI_MASK	(AV_SPARC_MD5)
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   423
#endif
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   424
	uint_t		ui;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   425
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   426
	(void) getisax(&ui, 1);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   427
	return ((ui & UI_MASK) == UI_MASK);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   428
}
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   429
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   430
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   431
#ifndef	SOLARIS_NO_AES_CTR
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   432
/* Create a new NID when we have no OID for that mechanism */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   433
static int
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   434
t4_add_NID(char *sn, char *ln)
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   435
{
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   436
	ASN1_OBJECT	*o;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   437
	int		nid;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   438
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   439
	if ((o = ASN1_OBJECT_create(OBJ_new_nid(1), (unsigned char *)"",
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   440
	    1, sn, ln)) == NULL) {
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   441
		T4err(T4_F_ADD_NID, T4_R_ASN1_OBJECT_CREATE);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   442
		return (0);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   443
	}
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   444
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   445
	/* Will return NID_undef on error */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   446
	nid = OBJ_add_object(o);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   447
	ASN1_OBJECT_free(o);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   448
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   449
	return (nid);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   450
}
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   451
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   452
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   453
/*
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   454
 * Create new NIDs for AES counter mode.
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   455
 * OpenSSL doesn't support them now so we have to help ourselves here.
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   456
 */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   457
static int
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   458
t4_add_aes_ctr_NIDs(void)
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   459
{
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   460
	/* Are we already set? */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   461
	if (NID_t4_aes_256_ctr != NID_undef)
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   462
		return (1);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   463
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   464
	/*
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   465
	 * There are no official names for AES counter modes yet so we just
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   466
	 * follow the format of those that exist.
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   467
	 */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   468
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   469
	/* Initialize NID_t4_aes_*_ctr and t4_cipher_table[] variables */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   470
	if ((NID_t4_aes_128_ctr = t4_add_NID("AES-128-CTR", "aes-128-ctr")) ==
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   471
	    NID_undef)
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   472
		return (0);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   473
	t4_cipher_table[T4_AES_128_CTR].nid =
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   474
	    t4_aes_128_ctr.nid = NID_t4_aes_128_ctr;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   475
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   476
	if ((NID_t4_aes_192_ctr = t4_add_NID("AES-192-CTR", "aes-192-ctr")) ==
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   477
	    NID_undef)
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   478
		return (0);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   479
	t4_cipher_table[T4_AES_192_CTR].nid =
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   480
	    t4_aes_192_ctr.nid = NID_t4_aes_192_ctr;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   481
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   482
	if ((NID_t4_aes_256_ctr = t4_add_NID("AES-256-CTR", "aes-256-ctr")) ==
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   483
	    NID_undef)
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   484
		return (0);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   485
	t4_cipher_table[T4_AES_256_CTR].nid =
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   486
	    t4_aes_256_ctr.nid = NID_t4_aes_256_ctr;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   487
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   488
	/* Initialize t4_cipher_nids[] */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   489
	for (int i = 0; i < t4_cipher_count; ++i) {
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   490
		if (t4_cipher_nids[i] == NID_undef) { /* found */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   491
			t4_cipher_nids[i] = NID_t4_aes_128_ctr;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   492
			t4_cipher_nids[++i] = NID_t4_aes_192_ctr;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   493
			t4_cipher_nids[++i] = NID_t4_aes_256_ctr;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   494
			break;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   495
		}
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   496
	}
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   497
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   498
	return (1);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   499
}
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   500
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   501
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   502
static void
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   503
t4_free_aes_ctr_NIDs(void)
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   504
{
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   505
	ASN1_OBJECT *o = NULL;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   506
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   507
	/* Clear entries in t4_cipher_nids[] */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   508
	for (int i = 0; i < t4_cipher_count; ++i) {
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   509
		if (t4_cipher_nids[i] == NID_t4_aes_128_ctr) {
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   510
			t4_cipher_nids[i] = NID_undef;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   511
		} else if (t4_cipher_nids[i] == NID_t4_aes_192_ctr) {
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   512
			t4_cipher_nids[i] = NID_undef;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   513
		} else if (t4_cipher_nids[i] == NID_t4_aes_256_ctr) {
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   514
			t4_cipher_nids[i] = NID_undef;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   515
		}
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   516
	}
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   517
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   518
	/* Clear NID_t4_aes_*_ctr and t4_cipher_table[] variables */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   519
	if (NID_t4_aes_128_ctr != NID_undef) {
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   520
		o = OBJ_nid2obj(NID_t4_aes_128_ctr);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   521
		if (o != NULL)
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   522
			ASN1_OBJECT_free(o);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   523
		NID_t4_aes_128_ctr = NID_undef;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   524
		t4_cipher_table[T4_AES_128_CTR].nid =
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   525
		    t4_aes_128_ctr.nid = NID_undef;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   526
	}
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   527
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   528
	if (NID_t4_aes_192_ctr != NID_undef) {
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   529
		o = OBJ_nid2obj(NID_t4_aes_192_ctr);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   530
		if (o != NULL)
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   531
			ASN1_OBJECT_free(o);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   532
		NID_t4_aes_192_ctr = NID_undef;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   533
		t4_cipher_table[T4_AES_192_CTR].nid =
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   534
		    t4_aes_192_ctr.nid = NID_undef;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   535
	}
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   536
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   537
	if (NID_t4_aes_256_ctr != NID_undef) {
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   538
		o = OBJ_nid2obj(NID_t4_aes_256_ctr);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   539
		if (o != NULL)
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   540
		ASN1_OBJECT_free(o);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   541
		NID_t4_aes_256_ctr = NID_undef;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   542
		t4_cipher_table[T4_AES_256_CTR].nid =
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   543
		    t4_aes_256_ctr.nid = NID_undef;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   544
	}
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   545
}
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   546
#endif	/* !SOLARIS_NO_AES_CTR */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   547
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   548
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   549
/*
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   550
 * Cipher functions
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   551
 */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   552
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   553
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   554
/*
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   555
 * Registered by the ENGINE with ENGINE_set_ciphers().
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   556
 * Finds out how to deal with a particular cipher NID in the ENGINE.
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   557
 */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   558
/* ARGSUSED */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   559
static int
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   560
t4_get_all_ciphers(ENGINE *e, const EVP_CIPHER **cipher,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   561
    const int **nids, int nid)
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   562
{
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   563
	if (cipher == NULL) { /* return a list of all supported ciphers */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   564
		*nids = (t4_cipher_count > 0) ? t4_cipher_nids : NULL;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   565
		return (t4_cipher_count);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   566
	}
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   567
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   568
	switch (nid) {
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   569
	case NID_aes_128_cbc:
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   570
		*cipher = &t4_aes_128_cbc;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   571
		break;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   572
	case NID_aes_192_cbc:
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   573
		*cipher = &t4_aes_192_cbc;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   574
		break;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   575
	case NID_aes_256_cbc:
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   576
		*cipher = &t4_aes_256_cbc;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   577
		break;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   578
	case NID_aes_128_ecb:
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   579
		*cipher = &t4_aes_128_ecb;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   580
		break;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   581
	case NID_aes_192_ecb:
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   582
		*cipher = &t4_aes_192_ecb;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   583
		break;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   584
	case NID_aes_256_ecb:
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   585
		*cipher = &t4_aes_256_ecb;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   586
		break;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   587
#ifndef	SOLARIS_NO_AES_CFB128
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   588
	case NID_aes_128_cfb128:
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   589
		*cipher = &t4_aes_128_cfb128;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   590
		break;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   591
	case NID_aes_192_cfb128:
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   592
		*cipher = &t4_aes_192_cfb128;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   593
		break;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   594
	case NID_aes_256_cfb128:
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   595
		*cipher = &t4_aes_256_cfb128;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   596
		break;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   597
#endif	/* !SOLARIS_NO_AES_CFB128 */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   598
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   599
	default:
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   600
#ifndef	SOLARIS_NO_AES_CTR
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   601
		/* These NIDs cannot be const, so must be tested with "if" */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   602
		if (nid == NID_t4_aes_128_ctr) {
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   603
			*cipher = &t4_aes_128_ctr;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   604
			break;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   605
		} else if (nid == NID_t4_aes_192_ctr) {
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   606
			*cipher = &t4_aes_192_ctr;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   607
			break;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   608
		} else if (nid == NID_t4_aes_256_ctr) {
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   609
			*cipher = &t4_aes_256_ctr;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   610
			break;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   611
		} else
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   612
#endif	/* !SOLARIS_NO_AES_CTR */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   613
		{
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   614
			/* cipher not supported */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   615
			*cipher = NULL;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   616
			return (0);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   617
		}
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   618
	}
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   619
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   620
	return (1);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   621
}
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   622
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   623
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   624
/* Called by t4_cipher_init_aes() */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   625
static t4_cipher_id
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   626
get_cipher_index_by_nid(int nid)
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   627
{
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   628
	t4_cipher_id i;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   629
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   630
	for (i = (t4_cipher_id)0; i < T4_CIPHER_MAX; ++i)
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   631
		if (t4_cipher_table[i].nid == nid)
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   632
			return (i);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   633
	return (T4_CIPHER_MAX);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   634
}
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   635
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   636
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   637
/* ARGSUSED2 */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   638
static int
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   639
t4_cipher_init_aes(EVP_CIPHER_CTX *ctx, const unsigned char *key,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   640
    const unsigned char *iv, int enc)
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   641
{
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   642
	t4_cipher_ctx_t	*tctx = ctx->cipher_data;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   643
	uint64_t	*t4_ks = tctx->t4_ks;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   644
	t4_cipher_t	*t4_cipher;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   645
	t4_cipher_id	index;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   646
	int		key_len = ctx->key_len;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   647
	uint64_t	aligned_key_buffer[4]; /* 16, 24, or 32 bytes long */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   648
	uint64_t	*aligned_key;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   649
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   650
	if (key == NULL) {
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   651
		T4err(T4_F_CIPHER_INIT_AES, T4_R_CIPHER_KEY);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   652
		return (0);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   653
	}
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   654
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   655
	/* Get the cipher entry index in t4_cipher_table from nid */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   656
	index = get_cipher_index_by_nid(ctx->cipher->nid);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   657
	if (index >= T4_CIPHER_MAX) {
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   658
		T4err(T4_F_CIPHER_INIT_AES, T4_R_CIPHER_NID);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   659
		return (0); /* Error */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   660
	}
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   661
	t4_cipher = &t4_cipher_table[index];
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   662
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   663
	/* Check key size and iv size */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   664
	if (ctx->cipher->iv_len < t4_cipher->iv_len) {
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   665
		T4err(T4_F_CIPHER_INIT_AES, T4_R_IV_LEN_INCORRECT);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   666
		return (0); /* Error */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   667
	}
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   668
	if ((key_len < t4_cipher->min_key_len) ||
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   669
	    (key_len > t4_cipher->max_key_len)) {
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   670
		T4err(T4_F_CIPHER_INIT_AES, T4_R_KEY_LEN_INCORRECT);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   671
		return (0); /* Error */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   672
	}
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   673
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   674
	/* Set cipher flags, if any */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   675
	ctx->flags |= t4_cipher->flags;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   676
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   677
	/* Align the key */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   678
	if (((unsigned long)key & 0x7) == 0) /* already aligned */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   679
		aligned_key = (uint64_t *)key;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   680
	else { /* key is not 8-byte aligned */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   681
#ifdef DEBUG_T4
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   682
		(void) fprintf(stderr, "T4: key is not 8 byte aligned\n");
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   683
#endif
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   684
		(void) memcpy(aligned_key_buffer, key, key_len);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   685
		aligned_key = aligned_key_buffer;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   686
	}
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   687
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   688
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   689
	/*
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   690
	 * Expand the key schedule.
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   691
	 * Copy original key to start of t4_ks key schedule. Note that the
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   692
	 * encryption and decryption key schedule are the same for T4.
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   693
	 */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   694
	switch (key_len) {
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   695
		case 16:
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   696
			t4_aes_expand128(&t4_ks[2],
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   697
			    (const uint32_t *)aligned_key);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   698
			t4_ks[0] = aligned_key[0];
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   699
			t4_ks[1] = aligned_key[1];
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   700
			break;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   701
		case 24:
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   702
			t4_aes_expand192(&t4_ks[3],
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   703
			    (const uint32_t *)aligned_key);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   704
			t4_ks[0] = aligned_key[0];
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   705
			t4_ks[1] = aligned_key[1];
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   706
			t4_ks[2] = aligned_key[2];
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   707
			break;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   708
		case 32:
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   709
			t4_aes_expand256(&t4_ks[4],
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   710
			    (const uint32_t *)aligned_key);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   711
			t4_ks[0] = aligned_key[0];
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   712
			t4_ks[1] = aligned_key[1];
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   713
			t4_ks[2] = aligned_key[2];
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   714
			t4_ks[3] = aligned_key[3];
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   715
			break;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   716
		default:
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   717
			T4err(T4_F_CIPHER_INIT_AES, T4_R_CIPHER_KEY);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   718
			return (0);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   719
	}
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   720
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   721
	/* Save index to cipher */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   722
	tctx->index = index;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   723
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   724
	/* Process IV */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   725
	if (t4_cipher->iv_len <= 0) { /* no IV (such as with ECB mode) */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   726
		tctx->iv = NULL;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   727
	} else if (((unsigned long)ctx->iv & 0x7) == 0) { /* already aligned */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   728
		tctx->iv = (uint64_t *)ctx->iv;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   729
	} else {
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   730
		/* IV is not 8 byte aligned */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   731
		(void) memcpy(tctx->aligned_iv_buffer, ctx->iv,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   732
		    ctx->cipher->iv_len);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   733
		tctx->iv = tctx->aligned_iv_buffer;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   734
#ifdef DEBUG_T4
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   735
		(void) fprintf(stderr,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   736
		    "t4_cipher_init_aes: IV is not 8 byte aligned\n");
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   737
		(void) fprintf(stderr,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   738
		    "t4_cipher_init_aes: ctx->cipher->iv_len =%d\n",
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   739
		    ctx->cipher->iv_len);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   740
		(void) fprintf(stderr, "t4_cipher_init_aes: after "
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   741
		    "re-alignment, tctx->iv = %p\n", (void *)tctx->iv);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   742
#endif	/* DEBUG_T4 */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   743
	}
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   744
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   745
	return (1);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   746
}
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   747
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   748
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   749
/*
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   750
 * ENCRYPT_UPDATE or DECRYPT_UPDATE
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   751
 */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   752
#define	T4_CIPHER_DO_AES(t4_cipher_do_aes, t4_aes_load_keys_for_encrypt, \
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   753
    t4_aes_encrypt, t4_aes_load_keys_for_decrypt, t4_aes_decrypt, iv)	\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   754
static int								\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   755
t4_cipher_do_aes(EVP_CIPHER_CTX *ctx, unsigned char *out,		\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   756
    const unsigned char *in, size_t inl)				\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   757
{									\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   758
	t4_cipher_ctx_t	*tctx = ctx->cipher_data;			\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   759
	uint64_t	*t4_ks = tctx->t4_ks;				\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   760
	unsigned long	outl = inl;					\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   761
	unsigned char	*bufin_alloc = NULL, *bufout_alloc = NULL;	\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   762
	unsigned char	*bufin, *bufout;				\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   763
									\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   764
	/* "in" and "out" must be 8 byte aligned */			\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   765
	if (((unsigned long)in & 0x7) == 0) { /* already aligned */	\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   766
		bufin = (unsigned char *)in;				\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   767
	} else { /* "in" is not 8 byte aligned */			\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   768
		if (((unsigned long)out & 0x7) == 0) { /* aligned */	\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   769
			/* use output buffer for input */		\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   770
			bufin = out;					\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   771
		} else {						\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   772
			bufin = bufin_alloc = OPENSSL_malloc(inl);	\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   773
			if (bufin_alloc == NULL)			\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   774
				return (0); /* error */			\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   775
		}							\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   776
		(void) memcpy(bufin, in, inl);				\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   777
	}								\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   778
									\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   779
	if (((unsigned long)out & 0x7) == 0) { /* already aligned */	\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   780
		bufout = out;						\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   781
	} else { /* "out" is not 8 byte aligned */			\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   782
		if (bufin_alloc != NULL) {				\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   783
			/* use allocated input buffer for output */	\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   784
			bufout = bufin_alloc;				\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   785
		} else {						\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   786
			bufout = bufout_alloc = OPENSSL_malloc(outl);	\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   787
			if (bufout_alloc == NULL) {			\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   788
				OPENSSL_free(bufin_alloc);		\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   789
				return (0); /* error */			\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   790
			}						\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   791
		}							\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   792
	}								\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   793
									\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   794
	/* Data length must be an even multiple of block size. */	\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   795
	if ((inl & 0xf) != 0) {						\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   796
		OPENSSL_free(bufout_alloc);				\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   797
		OPENSSL_free(bufin_alloc);				\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   798
		T4err(T4_F_CIPHER_DO_AES, T4_R_NOT_BLOCKSIZE_LENGTH);	\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   799
		return (0);						\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   800
	}								\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   801
									\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   802
	if (ctx->encrypt) {						\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   803
		t4_aes_load_keys_for_encrypt(t4_ks);			\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   804
		t4_aes_encrypt(t4_ks, (uint64_t *)bufin,		\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   805
		    (uint64_t *)bufout, (size_t)inl, iv);		\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   806
	} else { /* decrypt */						\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   807
		t4_aes_load_keys_for_decrypt(t4_ks);			\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   808
		t4_aes_decrypt(t4_ks, (uint64_t *)bufin,		\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   809
		    (uint64_t *)bufout,					\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   810
		    (size_t)inl, iv);					\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   811
	}								\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   812
									\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   813
	/* Cleanup */							\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   814
	if (bufin_alloc != NULL) {					\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   815
		if (bufout == bufin_alloc)				\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   816
			(void) memcpy(out, bufout, outl);		\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   817
		OPENSSL_free(bufin_alloc);				\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   818
	}								\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   819
	if (bufout_alloc != NULL) {					\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   820
		(void) memcpy(out, bufout_alloc, outl);			\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   821
		OPENSSL_free(bufout_alloc);				\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   822
	}								\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   823
									\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   824
	return (1);							\
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   825
}
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   826
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   827
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   828
/* AES CBC mode. */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   829
T4_CIPHER_DO_AES(t4_cipher_do_aes_128_cbc,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   830
	t4_aes128_load_keys_for_encrypt, t4_aes128_cbc_encrypt,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   831
	t4_aes128_load_keys_for_decrypt, t4_aes128_cbc_decrypt, tctx->iv)
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   832
T4_CIPHER_DO_AES(t4_cipher_do_aes_192_cbc,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   833
	t4_aes192_load_keys_for_encrypt, t4_aes192_cbc_encrypt,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   834
	t4_aes192_load_keys_for_decrypt, t4_aes192_cbc_decrypt, tctx->iv)
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   835
T4_CIPHER_DO_AES(t4_cipher_do_aes_256_cbc,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   836
	t4_aes256_load_keys_for_encrypt, t4_aes256_cbc_encrypt,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   837
	t4_aes256_load_keys_for_decrypt, t4_aes256_cbc_decrypt, tctx->iv)
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   838
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   839
/*
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   840
 * AES CFB128 mode.
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   841
 * CFB128 decrypt uses load_keys_for_encrypt() as the mode uses
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   842
 * the raw AES encrypt operation for the decryption, too.
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   843
 */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   844
#ifndef	SOLARIS_NO_AES_CFB128
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   845
T4_CIPHER_DO_AES(t4_cipher_do_aes_128_cfb128,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   846
	t4_aes128_load_keys_for_encrypt, t4_aes128_cfb128_encrypt,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   847
	t4_aes128_load_keys_for_encrypt, t4_aes128_cfb128_decrypt, tctx->iv)
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   848
T4_CIPHER_DO_AES(t4_cipher_do_aes_192_cfb128,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   849
	t4_aes192_load_keys_for_encrypt, t4_aes192_cfb128_encrypt,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   850
	t4_aes192_load_keys_for_encrypt, t4_aes192_cfb128_decrypt, tctx->iv)
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   851
T4_CIPHER_DO_AES(t4_cipher_do_aes_256_cfb128,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   852
	t4_aes256_load_keys_for_encrypt, t4_aes256_cfb128_encrypt,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   853
	t4_aes256_load_keys_for_encrypt, t4_aes256_cfb128_decrypt, tctx->iv)
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   854
#endif	/* !SOLARIS_NO_AES_CFB128 */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   855
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   856
/* AES CTR mode. */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   857
#ifndef	SOLARIS_NO_AES_CTR
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   858
T4_CIPHER_DO_AES(t4_cipher_do_aes_128_ctr,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   859
	t4_aes128_load_keys_for_encrypt, t4_aes128_ctr_crypt,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   860
	t4_aes128_load_keys_for_decrypt, t4_aes128_ctr_crypt, tctx->iv)
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   861
T4_CIPHER_DO_AES(t4_cipher_do_aes_192_ctr,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   862
	t4_aes192_load_keys_for_encrypt, t4_aes192_ctr_crypt,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   863
	t4_aes192_load_keys_for_decrypt, t4_aes192_ctr_crypt, tctx->iv)
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   864
T4_CIPHER_DO_AES(t4_cipher_do_aes_256_ctr,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   865
	t4_aes256_load_keys_for_encrypt, t4_aes256_ctr_crypt,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   866
	t4_aes256_load_keys_for_decrypt, t4_aes256_ctr_crypt, tctx->iv)
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   867
#endif	/* !SOLARIS_NO_AES_CTR */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   868
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   869
/* AES ECB mode. */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   870
T4_CIPHER_DO_AES(t4_cipher_do_aes_128_ecb,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   871
	t4_aes128_load_keys_for_encrypt, t4_aes128_ecb_encrypt,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   872
	t4_aes128_load_keys_for_decrypt, t4_aes128_ecb_decrypt, NULL)
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   873
T4_CIPHER_DO_AES(t4_cipher_do_aes_192_ecb,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   874
	t4_aes192_load_keys_for_encrypt, t4_aes192_ecb_encrypt,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   875
	t4_aes192_load_keys_for_decrypt, t4_aes192_ecb_decrypt, NULL)
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   876
T4_CIPHER_DO_AES(t4_cipher_do_aes_256_ecb,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   877
	t4_aes256_load_keys_for_encrypt, t4_aes256_ecb_encrypt,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   878
	t4_aes256_load_keys_for_decrypt, t4_aes256_ecb_decrypt, NULL)
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   879
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   880
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   881
/*
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   882
 * Is the t4 engine available?
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   883
 * Passed to ENGINE_set_init_function().
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   884
 */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   885
/* ARGSUSED */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   886
static int
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   887
t4_init(ENGINE *e)
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   888
{
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   889
	return (1);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   890
}
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   891
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   892
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   893
/* Passed to ENGINE_set_destroy_function(). */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   894
/* ARGSUSED */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   895
static int
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   896
t4_destroy(ENGINE *e)
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   897
{
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   898
	T4_FREE_AES_CTR_NIDS;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   899
	ERR_unload_t4_strings();
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   900
	return (1);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   901
}
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   902
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   903
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   904
/*
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   905
 * Called by t4_bind_helper().
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   906
 * Note: too early to use T4err() functions on errors.
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   907
 */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   908
/* ARGSUSED */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   909
static int
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   910
t4_bind(ENGINE *e)
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   911
{
2230
f34d51fb8646 7101906 Need to add the digest support back to the OpenSSL T4 engine
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 537
diff changeset
   912
	static int aes_engage = -1, digest_engage = -1;
426
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   913
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   914
	if (aes_engage == -1) {
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   915
		aes_engage = (t4_aes_instructions_present() != 0);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   916
	}
2230
f34d51fb8646 7101906 Need to add the digest support back to the OpenSSL T4 engine
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 537
diff changeset
   917
	if (digest_engage == -1) {
f34d51fb8646 7101906 Need to add the digest support back to the OpenSSL T4 engine
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 537
diff changeset
   918
		digest_engage = (t4_digest_instructions_present() != 0);
f34d51fb8646 7101906 Need to add the digest support back to the OpenSSL T4 engine
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 537
diff changeset
   919
	}
537
10bd3a98a582 7099856 Apache HTTP server crashes when tested with TLSv1 using OpenSSL T4 engine
Huie-Ying Lee <huieying.lee@oracle.com>
parents: 426
diff changeset
   920
426
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   921
#ifdef DEBUG_T4
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   922
	(void) fprintf(stderr,
2230
f34d51fb8646 7101906 Need to add the digest support back to the OpenSSL T4 engine
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 537
diff changeset
   923
	    "t4_bind: engage aes=%d, digest=%d\n", aes_engage, digest_engage);
426
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   924
#endif
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   925
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   926
#ifndef  SOLARIS_NO_AES_CTR
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   927
	/*
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   928
	 * We must do this before we start working with slots since we need all
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   929
	 * NIDs there.
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   930
	 */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   931
	if (aes_engage) {
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   932
		if (t4_add_aes_ctr_NIDs() == 0) {
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   933
			T4_FREE_AES_CTR_NIDS;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   934
			return (0);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   935
		}
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   936
	}
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   937
#endif	/* !SOLARIS_NO_AES_CTR */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   938
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   939
#ifdef DEBUG_T4
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   940
	(void) fprintf(stderr, "t4_cipher_count = %d; t4_cipher_nids[] =\n",
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   941
	    t4_cipher_count);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   942
	for (int i = 0; i < t4_cipher_count; ++i) {
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   943
		(void) fprintf(stderr, " %d", t4_cipher_nids[i]);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   944
	}
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   945
	(void) fprintf(stderr, "\n");
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   946
#endif	/* DEBUG_T4 */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   947
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   948
	/* Register T4 engine ID, name, and functions */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   949
	if (!ENGINE_set_id(e, ENGINE_T4_ID) ||
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   950
	    !ENGINE_set_name(e,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   951
	    aes_engage ? ENGINE_T4_NAME: ENGINE_NO_T4_NAME) ||
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   952
	    !ENGINE_set_init_function(e, t4_init) ||
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   953
	    (aes_engage && !ENGINE_set_ciphers(e, t4_get_all_ciphers)) ||
2230
f34d51fb8646 7101906 Need to add the digest support back to the OpenSSL T4 engine
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 537
diff changeset
   954
	    (digest_engage && !ENGINE_set_digests(e, t4_get_all_digests)) ||
426
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   955
	    !ENGINE_set_destroy_function(e, t4_destroy)) {
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   956
		T4_FREE_AES_CTR_NIDS;
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   957
		return (0);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   958
	}
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   959
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   960
	return (1);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   961
}
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   962
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   963
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   964
/*
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   965
 * Called by ENGINE_load_t4().
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   966
 * Note: too early to use T4err() functions on errors.
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   967
 */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   968
static int
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   969
t4_bind_helper(ENGINE *e, const char *id)
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   970
{
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   971
	if (id != NULL && (strcmp(id, ENGINE_T4_ID) != 0)) {
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   972
		(void) fprintf(stderr, "T4: bad t4 engine ID\n");
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   973
		return (0);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   974
	}
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   975
	if (!t4_bind(e)) {
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   976
		(void) fprintf(stderr,
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   977
		    "T4: failed to bind t4 engine\n");
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   978
		return (0);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   979
	}
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   980
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   981
	return (1);
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   982
}
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   983
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   984
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   985
#ifdef DYNAMIC_ENGINE
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   986
IMPLEMENT_DYNAMIC_CHECK_FN()
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   987
IMPLEMENT_DYNAMIC_BIND_FN(t4_bind_helper)
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   988
#endif	/* DYNAMIC_ENGINE */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   989
#endif	/* COMPILE_HW_T4 */
8c675b553a27 7048212 T4 engine needed for openssl
Dan Anderson <dan.anderson@oracle.com>
parents:
diff changeset
   990
#endif	/* !OPENSSL_NO_HW && !OPENSSL_NO_HW_AES_T4 && !OPENSSL_NO_AES */