static int aes_aarch64_cipher_setkey(void *_ctx, const void *userkey, size_t keysize) { struct aes_ctx *ctx = _ctx; int ret; if (ctx->enc) ret = aes_v8_set_encrypt_key(userkey, keysize * 8, ALIGN16(&ctx->expanded_key)); else ret = aes_v8_set_decrypt_key(userkey, keysize * 8, ALIGN16(&ctx->expanded_key)); if (ret != 0) return gnutls_assert_val(GNUTLS_E_ENCRYPTION_FAILED); return 0; }
static int aes_gcm_cipher_setkey(void *_ctx, const void *userkey, size_t keysize) { struct aes_gcm_ctx *ctx = _ctx; int ret; CHECK_AES_KEYSIZE(keysize); ret = aes_v8_set_encrypt_key(userkey, keysize * 8, ALIGN16(&ctx->expanded_key)); if (ret != 0) return gnutls_assert_val(GNUTLS_E_ENCRYPTION_FAILED); aes_v8_encrypt(ctx->gcm.H.c, ctx->gcm.H.c, ALIGN16(&ctx->expanded_key)); ctx->gcm.H.u[0] = bswap_64(ctx->gcm.H.u[0]); ctx->gcm.H.u[1] = bswap_64(ctx->gcm.H.u[1]); gcm_init_v8(ctx->gcm.Htable, ctx->gcm.H.u); return 0; }
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; }