1ceab6f8fSSascha Wildner /*- 2ceab6f8fSSascha Wildner * Copyright (c) 2010 Konstantin Belousov <kib@FreeBSD.org> 3ceab6f8fSSascha Wildner * All rights reserved. 4ceab6f8fSSascha Wildner * 5ceab6f8fSSascha Wildner * Redistribution and use in source and binary forms, with or without 6ceab6f8fSSascha Wildner * modification, are permitted provided that the following conditions 7ceab6f8fSSascha Wildner * are met: 8ceab6f8fSSascha Wildner * 1. Redistributions of source code must retain the above copyright 9ceab6f8fSSascha Wildner * notice, this list of conditions and the following disclaimer. 10ceab6f8fSSascha Wildner * 2. Redistributions in binary form must reproduce the above copyright 11ceab6f8fSSascha Wildner * notice, this list of conditions and the following disclaimer in the 12ceab6f8fSSascha Wildner * documentation and/or other materials provided with the distribution. 13ceab6f8fSSascha Wildner * 14ceab6f8fSSascha Wildner * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND 15ceab6f8fSSascha Wildner * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16ceab6f8fSSascha Wildner * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17ceab6f8fSSascha Wildner * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE 18ceab6f8fSSascha Wildner * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19ceab6f8fSSascha Wildner * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20ceab6f8fSSascha Wildner * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21ceab6f8fSSascha Wildner * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22ceab6f8fSSascha Wildner * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23ceab6f8fSSascha Wildner * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24ceab6f8fSSascha Wildner * SUCH DAMAGE. 25ceab6f8fSSascha Wildner * 26ceab6f8fSSascha Wildner * $FreeBSD: src/sys/crypto/aesni/aesni.h,v 1.2 2010/09/23 11:57:25 pjd Exp $ 27ceab6f8fSSascha Wildner */ 28ceab6f8fSSascha Wildner 29ceab6f8fSSascha Wildner #ifndef _AESNI_H_ 30ceab6f8fSSascha Wildner #define _AESNI_H_ 31ceab6f8fSSascha Wildner 32ceab6f8fSSascha Wildner #include <sys/types.h> 33ceab6f8fSSascha Wildner #include <sys/queue.h> 34ceab6f8fSSascha Wildner 35ceab6f8fSSascha Wildner #include <opencrypto/cryptodev.h> 36ceab6f8fSSascha Wildner 37*483114b6SSascha Wildner #if defined(__x86_64__) 38ceab6f8fSSascha Wildner #include <machine/cpufunc.h> 39ceab6f8fSSascha Wildner #include <machine/cputypes.h> 40ceab6f8fSSascha Wildner #include <machine/md_var.h> 41ceab6f8fSSascha Wildner #include <machine/specialreg.h> 42ceab6f8fSSascha Wildner #endif 43ceab6f8fSSascha Wildner 4435b78578SSepherosa Ziehau #define AESNI_ALIGN 16 4535b78578SSepherosa Ziehau 46ceab6f8fSSascha Wildner #define AES128_ROUNDS 10 47ceab6f8fSSascha Wildner #define AES192_ROUNDS 12 48ceab6f8fSSascha Wildner #define AES256_ROUNDS 14 49ceab6f8fSSascha Wildner #define AES_SCHED_LEN ((AES256_ROUNDS + 1) * AES_BLOCK_LEN) 50ceab6f8fSSascha Wildner 51ceab6f8fSSascha Wildner struct aesni_session { 52ceab6f8fSSascha Wildner uint8_t enc_schedule[AES_SCHED_LEN] __aligned(16); 53ceab6f8fSSascha Wildner uint8_t dec_schedule[AES_SCHED_LEN] __aligned(16); 54ceab6f8fSSascha Wildner uint8_t xts_schedule[AES_SCHED_LEN] __aligned(16); 55ceab6f8fSSascha Wildner uint8_t iv[AES_BLOCK_LEN]; 56ceab6f8fSSascha Wildner int algo; 57ceab6f8fSSascha Wildner int rounds; 58ceab6f8fSSascha Wildner /* uint8_t *ses_ictx; */ 59ceab6f8fSSascha Wildner /* uint8_t *ses_octx; */ 60ceab6f8fSSascha Wildner /* int ses_mlen; */ 61ceab6f8fSSascha Wildner int used; 62ceab6f8fSSascha Wildner uint32_t id; 63ceab6f8fSSascha Wildner TAILQ_ENTRY(aesni_session) next; 64ceab6f8fSSascha Wildner #if 0 65ceab6f8fSSascha Wildner struct fpu_kern_ctx fpu_ctx; 66ceab6f8fSSascha Wildner #endif 67ceab6f8fSSascha Wildner }; 68ceab6f8fSSascha Wildner 69ceab6f8fSSascha Wildner /* 70ceab6f8fSSascha Wildner * Internal functions, implemented in assembler. 71ceab6f8fSSascha Wildner */ 72ceab6f8fSSascha Wildner void aesni_enc(int rounds, const uint8_t *key_schedule, 73ceab6f8fSSascha Wildner const uint8_t from[AES_BLOCK_LEN], uint8_t to[AES_BLOCK_LEN], 74ceab6f8fSSascha Wildner const uint8_t iv[AES_BLOCK_LEN]); 75ceab6f8fSSascha Wildner void aesni_dec(int rounds, const uint8_t *key_schedule, 76ceab6f8fSSascha Wildner const uint8_t from[AES_BLOCK_LEN], uint8_t to[AES_BLOCK_LEN], 77ceab6f8fSSascha Wildner const uint8_t iv[AES_BLOCK_LEN]); 78ceab6f8fSSascha Wildner void aesni_set_enckey(const uint8_t *userkey, uint8_t *encrypt_schedule, 79ceab6f8fSSascha Wildner int number_of_rounds); 80ceab6f8fSSascha Wildner void aesni_set_deckey(const uint8_t *encrypt_schedule, 81ceab6f8fSSascha Wildner uint8_t *decrypt_schedule, int number_of_rounds); 82ceab6f8fSSascha Wildner 83ceab6f8fSSascha Wildner /* 84ceab6f8fSSascha Wildner * Slightly more public interfaces. 85ceab6f8fSSascha Wildner */ 86ceab6f8fSSascha Wildner void aesni_encrypt_cbc(int rounds, const void *key_schedule, size_t len, 87ceab6f8fSSascha Wildner const uint8_t *from, uint8_t *to, const uint8_t iv[AES_BLOCK_LEN]); 88ceab6f8fSSascha Wildner void aesni_decrypt_cbc(int rounds, const void *key_schedule, size_t len, 89ceab6f8fSSascha Wildner const uint8_t *from, const uint8_t iv[AES_BLOCK_LEN]); 90ceab6f8fSSascha Wildner void aesni_encrypt_ecb(int rounds, const void *key_schedule, size_t len, 91ceab6f8fSSascha Wildner const uint8_t from[AES_BLOCK_LEN], uint8_t to[AES_BLOCK_LEN]); 92ceab6f8fSSascha Wildner void aesni_decrypt_ecb(int rounds, const void *key_schedule, size_t len, 93ceab6f8fSSascha Wildner const uint8_t from[AES_BLOCK_LEN], uint8_t to[AES_BLOCK_LEN]); 94ceab6f8fSSascha Wildner 95ceab6f8fSSascha Wildner int aesni_cipher_setup(struct aesni_session *ses, 96ceab6f8fSSascha Wildner struct cryptoini *encini); 97ceab6f8fSSascha Wildner int aesni_cipher_process(struct aesni_session *ses, 98ceab6f8fSSascha Wildner struct cryptodesc *enccrd, struct cryptop *crp); 99ceab6f8fSSascha Wildner 100ceab6f8fSSascha Wildner uint8_t *aesni_cipher_alloc(struct cryptodesc *enccrd, struct cryptop *crp, 101ceab6f8fSSascha Wildner int *allocated); 102ceab6f8fSSascha Wildner 103ceab6f8fSSascha Wildner #endif 104