|
@@ -252,8 +252,10 @@ MODULE_ALIAS_CRYPTO("drbg_nopr_ctr_aes192");
|
|
|
MODULE_ALIAS_CRYPTO("drbg_pr_ctr_aes128");
|
|
|
MODULE_ALIAS_CRYPTO("drbg_nopr_ctr_aes128");
|
|
|
|
|
|
-static int drbg_kcapi_sym(struct drbg_state *drbg, const unsigned char *key,
|
|
|
- unsigned char *outval, const struct drbg_string *in);
|
|
|
+static void drbg_kcapi_symsetkey(struct drbg_state *drbg,
|
|
|
+ const unsigned char *key);
|
|
|
+static int drbg_kcapi_sym(struct drbg_state *drbg, unsigned char *outval,
|
|
|
+ const struct drbg_string *in);
|
|
|
static int drbg_init_sym_kernel(struct drbg_state *drbg);
|
|
|
static int drbg_fini_sym_kernel(struct drbg_state *drbg);
|
|
|
|
|
@@ -270,6 +272,7 @@ static int drbg_ctr_bcc(struct drbg_state *drbg,
|
|
|
drbg_string_fill(&data, out, drbg_blocklen(drbg));
|
|
|
|
|
|
/* 10.4.3 step 2 / 4 */
|
|
|
+ drbg_kcapi_symsetkey(drbg, key);
|
|
|
list_for_each_entry(curr, in, list) {
|
|
|
const unsigned char *pos = curr->buf;
|
|
|
size_t len = curr->len;
|
|
@@ -278,7 +281,7 @@ static int drbg_ctr_bcc(struct drbg_state *drbg,
|
|
|
/* 10.4.3 step 4.2 */
|
|
|
if (drbg_blocklen(drbg) == cnt) {
|
|
|
cnt = 0;
|
|
|
- ret = drbg_kcapi_sym(drbg, key, out, &data);
|
|
|
+ ret = drbg_kcapi_sym(drbg, out, &data);
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
}
|
|
@@ -290,7 +293,7 @@ static int drbg_ctr_bcc(struct drbg_state *drbg,
|
|
|
}
|
|
|
/* 10.4.3 step 4.2 for last block */
|
|
|
if (cnt)
|
|
|
- ret = drbg_kcapi_sym(drbg, key, out, &data);
|
|
|
+ ret = drbg_kcapi_sym(drbg, out, &data);
|
|
|
|
|
|
return ret;
|
|
|
}
|
|
@@ -425,6 +428,7 @@ static int drbg_ctr_df(struct drbg_state *drbg,
|
|
|
/* 10.4.2 step 12: overwriting of outval is implemented in next step */
|
|
|
|
|
|
/* 10.4.2 step 13 */
|
|
|
+ drbg_kcapi_symsetkey(drbg, temp);
|
|
|
while (generated_len < bytes_to_return) {
|
|
|
short blocklen = 0;
|
|
|
/*
|
|
@@ -432,7 +436,7 @@ static int drbg_ctr_df(struct drbg_state *drbg,
|
|
|
* implicit as the key is only drbg_blocklen in size based on
|
|
|
* the implementation of the cipher function callback
|
|
|
*/
|
|
|
- ret = drbg_kcapi_sym(drbg, temp, X, &cipherin);
|
|
|
+ ret = drbg_kcapi_sym(drbg, X, &cipherin);
|
|
|
if (ret)
|
|
|
goto out;
|
|
|
blocklen = (drbg_blocklen(drbg) <
|
|
@@ -488,6 +492,7 @@ static int drbg_ctr_update(struct drbg_state *drbg, struct list_head *seed,
|
|
|
ret = drbg_ctr_df(drbg, df_data, drbg_statelen(drbg), seed);
|
|
|
if (ret)
|
|
|
goto out;
|
|
|
+ drbg_kcapi_symsetkey(drbg, drbg->C);
|
|
|
}
|
|
|
|
|
|
drbg_string_fill(&cipherin, drbg->V, drbg_blocklen(drbg));
|
|
@@ -500,7 +505,7 @@ static int drbg_ctr_update(struct drbg_state *drbg, struct list_head *seed,
|
|
|
crypto_inc(drbg->V, drbg_blocklen(drbg));
|
|
|
/*
|
|
|
* 10.2.1.2 step 2.2 */
|
|
|
- ret = drbg_kcapi_sym(drbg, drbg->C, temp + len, &cipherin);
|
|
|
+ ret = drbg_kcapi_sym(drbg, temp + len, &cipherin);
|
|
|
if (ret)
|
|
|
goto out;
|
|
|
/* 10.2.1.2 step 2.3 and 3 */
|
|
@@ -517,6 +522,7 @@ static int drbg_ctr_update(struct drbg_state *drbg, struct list_head *seed,
|
|
|
|
|
|
/* 10.2.1.2 step 5 */
|
|
|
memcpy(drbg->C, temp, drbg_keylen(drbg));
|
|
|
+ drbg_kcapi_symsetkey(drbg, drbg->C);
|
|
|
/* 10.2.1.2 step 6 */
|
|
|
memcpy(drbg->V, temp + drbg_keylen(drbg), drbg_blocklen(drbg));
|
|
|
ret = 0;
|
|
@@ -546,6 +552,7 @@ static int drbg_ctr_generate(struct drbg_state *drbg,
|
|
|
ret = drbg_ctr_update(drbg, addtl, 2);
|
|
|
if (ret)
|
|
|
return 0;
|
|
|
+ drbg_kcapi_symsetkey(drbg, drbg->C);
|
|
|
}
|
|
|
|
|
|
/* 10.2.1.5.2 step 4.1 */
|
|
@@ -554,7 +561,7 @@ static int drbg_ctr_generate(struct drbg_state *drbg,
|
|
|
while (len < buflen) {
|
|
|
int outlen = 0;
|
|
|
/* 10.2.1.5.2 step 4.2 */
|
|
|
- ret = drbg_kcapi_sym(drbg, drbg->C, drbg->scratchpad, &data);
|
|
|
+ ret = drbg_kcapi_sym(drbg, drbg->scratchpad, &data);
|
|
|
if (ret) {
|
|
|
len = ret;
|
|
|
goto out;
|
|
@@ -1653,13 +1660,21 @@ static int drbg_fini_sym_kernel(struct drbg_state *drbg)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int drbg_kcapi_sym(struct drbg_state *drbg, const unsigned char *key,
|
|
|
- unsigned char *outval, const struct drbg_string *in)
|
|
|
+static void drbg_kcapi_symsetkey(struct drbg_state *drbg,
|
|
|
+ const unsigned char *key)
|
|
|
{
|
|
|
struct crypto_cipher *tfm =
|
|
|
(struct crypto_cipher *)drbg->priv_data;
|
|
|
|
|
|
crypto_cipher_setkey(tfm, key, (drbg_keylen(drbg)));
|
|
|
+}
|
|
|
+
|
|
|
+static int drbg_kcapi_sym(struct drbg_state *drbg, unsigned char *outval,
|
|
|
+ const struct drbg_string *in)
|
|
|
+{
|
|
|
+ struct crypto_cipher *tfm =
|
|
|
+ (struct crypto_cipher *)drbg->priv_data;
|
|
|
+
|
|
|
/* there is only component in *in */
|
|
|
BUG_ON(in->len < drbg_blocklen(drbg));
|
|
|
crypto_cipher_encrypt_one(tfm, outval, in->buf);
|