static int qat_alg_aead_init_sessions(struct crypto_aead *tfm, const u8 *key, unsigned int keylen, int mode) { struct crypto_authenc_keys keys; int alg; if (crypto_authenc_extractkeys(&keys, key, keylen)) goto bad_key; if (qat_alg_validate_key(keys.enckeylen, &alg, mode)) goto bad_key; if (qat_alg_aead_init_enc_session(tfm, alg, &keys, mode)) goto error; if (qat_alg_aead_init_dec_session(tfm, alg, &keys, mode)) goto error; memzero_explicit(&keys, sizeof(keys)); return 0; bad_key: crypto_aead_set_flags(tfm, CRYPTO_TFM_RES_BAD_KEY_LEN); memzero_explicit(&keys, sizeof(keys)); return -EINVAL; error: memzero_explicit(&keys, sizeof(keys)); return -EFAULT; }
static int qat_alg_aead_init_sessions(struct qat_alg_aead_ctx *ctx, const uint8_t *key, unsigned int keylen) { struct crypto_authenc_keys keys; int alg; if (crypto_rng_get_bytes(crypto_default_rng, ctx->salt, AES_BLOCK_SIZE)) return -EFAULT; if (crypto_authenc_extractkeys(&keys, key, keylen)) goto bad_key; if (qat_alg_validate_key(keys.enckeylen, &alg)) goto bad_key; if (qat_alg_aead_init_enc_session(ctx, alg, &keys)) goto error; if (qat_alg_aead_init_dec_session(ctx, alg, &keys)) goto error; return 0; bad_key: crypto_tfm_set_flags(ctx->tfm, CRYPTO_TFM_RES_BAD_KEY_LEN); return -EINVAL; error: return -EFAULT; }