1/* Copyright (c) 2017, Google Inc. 2 * 3 * Permission to use, copy, modify, and/or distribute this software for any 4 * purpose with or without fee is hereby granted, provided that the above 5 * copyright notice and this permission notice appear in all copies. 6 * 7 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 8 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 9 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 10 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 11 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION 12 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 13 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ 14 15#ifndef OPENSSL_HEADER_AES_INTERNAL_H 16#define OPENSSL_HEADER_AES_INTERNAL_H 17 18#include <stdlib.h> 19 20#include <openssl/cpu.h> 21 22#if defined(__cplusplus) 23extern "C" { 24#endif 25 26 27#if !defined(OPENSSL_NO_ASM) 28 29#if defined(OPENSSL_X86_64) 30#define HWAES 31#define HWAES_ECB 32 33static int hwaes_capable(void) { 34 return (OPENSSL_ia32cap_P[1] & (1 << (57 - 32))) != 0; 35} 36#elif defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64) 37#define HWAES 38 39static int hwaes_capable(void) { 40 return CRYPTO_is_ARMv8_AES_capable(); 41} 42#elif defined(OPENSSL_PPC64LE) 43#define HWAES 44 45static int hwaes_capable(void) { 46 return CRYPTO_is_PPC64LE_vcrypto_capable(); 47} 48#endif 49 50#endif // !NO_ASM 51 52 53#if defined(HWAES) 54 55int aes_hw_set_encrypt_key(const uint8_t *user_key, const int bits, 56 AES_KEY *key); 57int aes_hw_set_decrypt_key(const uint8_t *user_key, const int bits, 58 AES_KEY *key); 59void aes_hw_encrypt(const uint8_t *in, uint8_t *out, const AES_KEY *key); 60void aes_hw_decrypt(const uint8_t *in, uint8_t *out, const AES_KEY *key); 61void aes_hw_cbc_encrypt(const uint8_t *in, uint8_t *out, size_t length, 62 const AES_KEY *key, uint8_t *ivec, const int enc); 63void aes_hw_ctr32_encrypt_blocks(const uint8_t *in, uint8_t *out, size_t len, 64 const AES_KEY *key, const uint8_t ivec[16]); 65 66#else 67 68// If HWAES isn't defined then we provide dummy functions for each of the hwaes 69// functions. 70static int hwaes_capable(void) { return 0; } 71 72static int aes_hw_set_encrypt_key(const uint8_t *user_key, int bits, 73 AES_KEY *key) { 74 abort(); 75} 76 77static int aes_hw_set_decrypt_key(const uint8_t *user_key, int bits, 78 AES_KEY *key) { 79 abort(); 80} 81 82static void aes_hw_encrypt(const uint8_t *in, uint8_t *out, 83 const AES_KEY *key) { 84 abort(); 85} 86 87static void aes_hw_decrypt(const uint8_t *in, uint8_t *out, 88 const AES_KEY *key) { 89 abort(); 90} 91 92static void aes_hw_cbc_encrypt(const uint8_t *in, uint8_t *out, size_t length, 93 const AES_KEY *key, uint8_t *ivec, int enc) { 94 abort(); 95} 96 97static void aes_hw_ctr32_encrypt_blocks(const uint8_t *in, uint8_t *out, 98 size_t len, const AES_KEY *key, 99 const uint8_t ivec[16]) { 100 abort(); 101} 102 103#endif // !HWAES 104 105 106#if defined(HWAES_ECB) 107void aes_hw_ecb_encrypt(const uint8_t *in, uint8_t *out, size_t length, 108 const AES_KEY *key, const int enc); 109#endif 110 111#if defined(__cplusplus) 112} // extern C 113#endif 114 115#endif // OPENSSL_HEADER_AES_INTERNAL_H 116