1210409Skib/*-
2210409Skib * Copyright (c) 2010 Konstantin Belousov <kib@FreeBSD.org>
3210409Skib * All rights reserved.
4210409Skib *
5210409Skib * Redistribution and use in source and binary forms, with or without
6210409Skib * modification, are permitted provided that the following conditions
7210409Skib * are met:
8210409Skib * 1. Redistributions of source code must retain the above copyright
9210409Skib *    notice, this list of conditions and the following disclaimer.
10210409Skib * 2. Redistributions in binary form must reproduce the above copyright
11210409Skib *    notice, this list of conditions and the following disclaimer in the
12210409Skib *    documentation and/or other materials provided with the distribution.
13210409Skib *
14210409Skib * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
15210409Skib * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16210409Skib * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17210409Skib * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
18210409Skib * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19210409Skib * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20210409Skib * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21210409Skib * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22210409Skib * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23210409Skib * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24210409Skib * SUCH DAMAGE.
25210409Skib *
26210409Skib * $FreeBSD: releng/10.3/sys/crypto/aesni/aesni.h 268034 2014-06-30 09:51:27Z kib $
27210409Skib */
28210409Skib
29210409Skib#ifndef _AESNI_H_
30210409Skib#define _AESNI_H_
31210409Skib
32210409Skib#include <sys/types.h>
33210409Skib#include <sys/malloc.h>
34210409Skib#include <sys/queue.h>
35210409Skib
36210409Skib#include <opencrypto/cryptodev.h>
37210409Skib
38210409Skib#if defined(__amd64__) || (defined(__i386__) && !defined(PC98))
39210409Skib#include <machine/cpufunc.h>
40210409Skib#include <machine/cputypes.h>
41210409Skib#include <machine/md_var.h>
42210409Skib#include <machine/specialreg.h>
43210409Skib#endif
44210409Skib#if defined(__i386__)
45210409Skib#include <machine/npx.h>
46210409Skib#elif defined(__amd64__)
47210409Skib#include <machine/fpu.h>
48210409Skib#endif
49210409Skib
50210409Skib#define	AES128_ROUNDS	10
51210409Skib#define	AES192_ROUNDS	12
52210409Skib#define	AES256_ROUNDS	14
53210409Skib#define	AES_SCHED_LEN	((AES256_ROUNDS + 1) * AES_BLOCK_LEN)
54210409Skib
55210409Skibstruct aesni_session {
56210409Skib	uint8_t enc_schedule[AES_SCHED_LEN] __aligned(16);
57210409Skib	uint8_t dec_schedule[AES_SCHED_LEN] __aligned(16);
58213069Spjd	uint8_t xts_schedule[AES_SCHED_LEN] __aligned(16);
59210409Skib	uint8_t iv[AES_BLOCK_LEN];
60213069Spjd	int algo;
61210409Skib	int rounds;
62210409Skib	/* uint8_t *ses_ictx; */
63210409Skib	/* uint8_t *ses_octx; */
64210409Skib	/* int ses_mlen; */
65210409Skib	int used;
66210409Skib	uint32_t id;
67210409Skib	TAILQ_ENTRY(aesni_session) next;
68230426Skib	struct fpu_kern_ctx *fpu_ctx;
69210409Skib};
70210409Skib
71210409Skib/*
72210409Skib * Internal functions, implemented in assembler.
73210409Skib */
74258212Sjmgvoid aesni_set_enckey(const uint8_t *userkey,
75258212Sjmg    uint8_t *encrypt_schedule /*__aligned(16)*/, int number_of_rounds);
76258212Sjmgvoid aesni_set_deckey(const uint8_t *encrypt_schedule /*__aligned(16)*/,
77258212Sjmg    uint8_t *decrypt_schedule /*__aligned(16)*/, int number_of_rounds);
78210409Skib
79210409Skib/*
80210409Skib * Slightly more public interfaces.
81210409Skib */
82258212Sjmgvoid aesni_encrypt_cbc(int rounds, const void *key_schedule /*__aligned(16)*/,
83258212Sjmg    size_t len, const uint8_t *from, uint8_t *to,
84258212Sjmg    const uint8_t iv[AES_BLOCK_LEN]);
85258212Sjmgvoid aesni_decrypt_cbc(int rounds, const void *key_schedule /*__aligned(16)*/,
86258212Sjmg    size_t len, uint8_t *buf, const uint8_t iv[AES_BLOCK_LEN]);
87258212Sjmgvoid aesni_encrypt_ecb(int rounds, const void *key_schedule /*__aligned(16)*/,
88258212Sjmg    size_t len, const uint8_t *from, uint8_t *to);
89258212Sjmgvoid aesni_decrypt_ecb(int rounds, const void *key_schedule /*__aligned(16)*/,
90258212Sjmg    size_t len, const uint8_t *from, uint8_t *to);
91258212Sjmg
92258212Sjmgvoid aesni_encrypt_xts(int rounds, const void *data_schedule /*__aligned(16)*/,
93258212Sjmg    const void *tweak_schedule /*__aligned(16)*/, size_t len,
94210409Skib    const uint8_t *from, uint8_t *to, const uint8_t iv[AES_BLOCK_LEN]);
95258212Sjmgvoid aesni_decrypt_xts(int rounds, const void *data_schedule /*__aligned(16)*/,
96258212Sjmg    const void *tweak_schedule /*__aligned(16)*/, size_t len,
97258212Sjmg    const uint8_t *from, uint8_t *to, const uint8_t iv[AES_BLOCK_LEN]);
98210409Skib
99268034Skibint aesni_cipher_setup_common(struct aesni_session *ses, const uint8_t *key,
100268034Skib    int keylen);
101210409Skibuint8_t *aesni_cipher_alloc(struct cryptodesc *enccrd, struct cryptop *crp,
102210409Skib    int *allocated);
103210409Skib
104258212Sjmg#endif /* _AESNI_H_ */
105