int EVP_has_aes_hardware(void) { #if defined(OPENSSL_X86) || defined(OPENSSL_X86_64) return aesni_capable() && crypto_gcm_clmul_enabled(); #else return 0; #endif }
int EVP_has_aes_hardware(void) { #if defined(OPENSSL_X86) || defined(OPENSSL_X86_64) return aesni_capable() && crypto_gcm_clmul_enabled(); #elif defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64) return hwaes_capable() && CRYPTO_is_ARMv8_PMULL_capable(); #else return 0; #endif }
ctr128_f aes_ctr_set_key(AES_KEY *aes_key, GCM128_CONTEXT *gcm_ctx, block128_f *out_block, const uint8_t *key, size_t key_bytes) { if (aesni_capable()) { aesni_set_encrypt_key(key, key_bytes * 8, aes_key); if (gcm_ctx != NULL) { CRYPTO_gcm128_init(gcm_ctx, aes_key, (block128_f)aesni_encrypt, 1); } if (out_block) { *out_block = (block128_f) aesni_encrypt; } return (ctr128_f)aesni_ctr32_encrypt_blocks; } if (hwaes_capable()) { aes_hw_set_encrypt_key(key, key_bytes * 8, aes_key); if (gcm_ctx != NULL) { CRYPTO_gcm128_init(gcm_ctx, aes_key, (block128_f)aes_hw_encrypt, 0); } if (out_block) { *out_block = (block128_f) aes_hw_encrypt; } return (ctr128_f)aes_hw_ctr32_encrypt_blocks; } if (bsaes_capable()) { AES_set_encrypt_key(key, key_bytes * 8, aes_key); if (gcm_ctx != NULL) { CRYPTO_gcm128_init(gcm_ctx, aes_key, (block128_f)AES_encrypt, 0); } if (out_block) { *out_block = (block128_f) AES_encrypt; } return (ctr128_f)bsaes_ctr32_encrypt_blocks; } if (vpaes_capable()) { vpaes_set_encrypt_key(key, key_bytes * 8, aes_key); if (out_block) { *out_block = (block128_f) vpaes_encrypt; } if (gcm_ctx != NULL) { CRYPTO_gcm128_init(gcm_ctx, aes_key, (block128_f)vpaes_encrypt, 0); } return NULL; } AES_set_encrypt_key(key, key_bytes * 8, aes_key); if (gcm_ctx != NULL) { CRYPTO_gcm128_init(gcm_ctx, aes_key, (block128_f)AES_encrypt, 0); } if (out_block) { *out_block = (block128_f) AES_encrypt; } return NULL; }
static int aead_aes_gcm_init(EVP_AEAD_CTX *ctx, const uint8_t *key, size_t key_len, size_t tag_len) { struct aead_aes_gcm_ctx *gcm_ctx; const size_t key_bits = key_len * 8; if (key_bits != 128 && key_bits != 256) { OPENSSL_PUT_ERROR(CIPHER, aead_aes_gcm_init, CIPHER_R_BAD_KEY_LENGTH); return 0; /* EVP_AEAD_CTX_init should catch this. */ } if (tag_len == EVP_AEAD_DEFAULT_TAG_LENGTH) { tag_len = EVP_AEAD_AES_GCM_TAG_LEN; } if (tag_len > EVP_AEAD_AES_GCM_TAG_LEN) { OPENSSL_PUT_ERROR(CIPHER, aead_aes_gcm_init, CIPHER_R_TAG_TOO_LARGE); return 0; } gcm_ctx = OPENSSL_malloc(sizeof(struct aead_aes_gcm_ctx)); if (gcm_ctx == NULL) { return 0; } if (aesni_capable()) { aesni_set_encrypt_key(key, key_len * 8, &gcm_ctx->ks.ks); CRYPTO_gcm128_init(&gcm_ctx->gcm, &gcm_ctx->ks.ks, (block128_f)aesni_encrypt); gcm_ctx->ctr = (ctr128_f)aesni_ctr32_encrypt_blocks; } else { gcm_ctx->ctr = aes_gcm_set_key(&gcm_ctx->ks.ks, &gcm_ctx->gcm, key, key_len); } gcm_ctx->tag_len = tag_len; ctx->aead_state = gcm_ctx; return 1; }
static ctr128_f aes_ctr_set_key(AES_KEY *aes_key, GCM128_CONTEXT *gcm_ctx, block128_f *out_block, const uint8_t *key, size_t key_len) { #if defined(AESNI) if (aesni_capable()) { aesni_set_encrypt_key(key, key_len * 8, aes_key); if (gcm_ctx != NULL) { CRYPTO_gcm128_init(gcm_ctx, aes_key, (block128_f)aesni_encrypt); } if (out_block) { *out_block = (block128_f) aesni_encrypt; } return (ctr128_f)aesni_ctr32_encrypt_blocks; } #endif #if defined(HWAES) if (hwaes_capable()) { aes_v8_set_encrypt_key(key, key_len * 8, aes_key); if (gcm_ctx != NULL) { CRYPTO_gcm128_init(gcm_ctx, aes_key, (block128_f)aes_v8_encrypt); } if (out_block) { *out_block = (block128_f) aes_v8_encrypt; } return (ctr128_f)aes_v8_ctr32_encrypt_blocks; } #endif #if defined(BSAES) if (bsaes_capable()) { AES_set_encrypt_key(key, key_len * 8, aes_key); if (gcm_ctx != NULL) { CRYPTO_gcm128_init(gcm_ctx, aes_key, (block128_f)AES_encrypt); } if (out_block) { *out_block = (block128_f) AES_encrypt; } return (ctr128_f)bsaes_ctr32_encrypt_blocks; } #endif #if defined(VPAES) if (vpaes_capable()) { vpaes_set_encrypt_key(key, key_len * 8, aes_key); if (out_block) { *out_block = (block128_f) vpaes_encrypt; } if (gcm_ctx != NULL) { CRYPTO_gcm128_init(gcm_ctx, aes_key, (block128_f)vpaes_encrypt); } return NULL; } #endif AES_set_encrypt_key(key, key_len * 8, aes_key); if (gcm_ctx != NULL) { CRYPTO_gcm128_init(gcm_ctx, aes_key, (block128_f)AES_encrypt); } if (out_block) { *out_block = (block128_f) AES_encrypt; } return NULL; }