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