aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/dm-crypt.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/md/dm-crypt.c')
-rw-r--r--drivers/md/dm-crypt.c29
1 files changed, 18 insertions, 11 deletions
diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c
index 0fce0bc1a957..e0c61a326550 100644
--- a/drivers/md/dm-crypt.c
+++ b/drivers/md/dm-crypt.c
@@ -171,7 +171,8 @@ struct crypt_config {
171 171
172 unsigned long flags; 172 unsigned long flags;
173 unsigned int key_size; 173 unsigned int key_size;
174 unsigned int key_parts; 174 unsigned int key_parts; /* independent parts in key buffer */
175 unsigned int key_extra_size; /* additional keys length */
175 u8 key[0]; 176 u8 key[0];
176}; 177};
177 178
@@ -530,7 +531,7 @@ static int crypt_iv_lmk_one(struct crypt_config *cc, u8 *iv,
530 char ctx[crypto_shash_descsize(lmk->hash_tfm)]; 531 char ctx[crypto_shash_descsize(lmk->hash_tfm)];
531 } sdesc; 532 } sdesc;
532 struct md5_state md5state; 533 struct md5_state md5state;
533 u32 buf[4]; 534 __le32 buf[4];
534 int i, r; 535 int i, r;
535 536
536 sdesc.desc.tfm = lmk->hash_tfm; 537 sdesc.desc.tfm = lmk->hash_tfm;
@@ -1274,9 +1275,12 @@ static int crypt_alloc_tfms(struct crypt_config *cc, char *ciphermode)
1274 1275
1275static int crypt_setkey_allcpus(struct crypt_config *cc) 1276static int crypt_setkey_allcpus(struct crypt_config *cc)
1276{ 1277{
1277 unsigned subkey_size = cc->key_size >> ilog2(cc->tfms_count); 1278 unsigned subkey_size;
1278 int err = 0, i, r; 1279 int err = 0, i, r;
1279 1280
1281 /* Ignore extra keys (which are used for IV etc) */
1282 subkey_size = (cc->key_size - cc->key_extra_size) >> ilog2(cc->tfms_count);
1283
1280 for (i = 0; i < cc->tfms_count; i++) { 1284 for (i = 0; i < cc->tfms_count; i++) {
1281 r = crypto_ablkcipher_setkey(cc->tfms[i], 1285 r = crypto_ablkcipher_setkey(cc->tfms[i],
1282 cc->key + (i * subkey_size), 1286 cc->key + (i * subkey_size),
@@ -1409,6 +1413,7 @@ static int crypt_ctr_cipher(struct dm_target *ti,
1409 return -EINVAL; 1413 return -EINVAL;
1410 } 1414 }
1411 cc->key_parts = cc->tfms_count; 1415 cc->key_parts = cc->tfms_count;
1416 cc->key_extra_size = 0;
1412 1417
1413 cc->cipher = kstrdup(cipher, GFP_KERNEL); 1418 cc->cipher = kstrdup(cipher, GFP_KERNEL);
1414 if (!cc->cipher) 1419 if (!cc->cipher)
@@ -1460,13 +1465,6 @@ static int crypt_ctr_cipher(struct dm_target *ti,
1460 goto bad; 1465 goto bad;
1461 } 1466 }
1462 1467
1463 /* Initialize and set key */
1464 ret = crypt_set_key(cc, key);
1465 if (ret < 0) {
1466 ti->error = "Error decoding and setting key";
1467 goto bad;
1468 }
1469
1470 /* Initialize IV */ 1468 /* Initialize IV */
1471 cc->iv_size = crypto_ablkcipher_ivsize(any_tfm(cc)); 1469 cc->iv_size = crypto_ablkcipher_ivsize(any_tfm(cc));
1472 if (cc->iv_size) 1470 if (cc->iv_size)
@@ -1497,14 +1495,23 @@ static int crypt_ctr_cipher(struct dm_target *ti,
1497 * to length of provided multi-key string. 1495 * to length of provided multi-key string.
1498 * If present (version 3), last key is used as IV seed. 1496 * If present (version 3), last key is used as IV seed.
1499 */ 1497 */
1500 if (cc->key_size % cc->key_parts) 1498 if (cc->key_size % cc->key_parts) {
1501 cc->key_parts++; 1499 cc->key_parts++;
1500 cc->key_extra_size = cc->key_size / cc->key_parts;
1501 }
1502 } else { 1502 } else {
1503 ret = -EINVAL; 1503 ret = -EINVAL;
1504 ti->error = "Invalid IV mode"; 1504 ti->error = "Invalid IV mode";
1505 goto bad; 1505 goto bad;
1506 } 1506 }
1507 1507
1508 /* Initialize and set key */
1509 ret = crypt_set_key(cc, key);
1510 if (ret < 0) {
1511 ti->error = "Error decoding and setting key";
1512 goto bad;
1513 }
1514
1508 /* Allocate IV */ 1515 /* Allocate IV */
1509 if (cc->iv_gen_ops && cc->iv_gen_ops->ctr) { 1516 if (cc->iv_gen_ops && cc->iv_gen_ops->ctr) {
1510 ret = cc->iv_gen_ops->ctr(cc, ti, ivopts); 1517 ret = cc->iv_gen_ops->ctr(cc, ti, ivopts);