diff options
Diffstat (limited to 'drivers/md/dm-crypt.c')
-rw-r--r-- | drivers/md/dm-crypt.c | 207 |
1 files changed, 139 insertions, 68 deletions
diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c index e412980763bd..a93637223c8d 100644 --- a/drivers/md/dm-crypt.c +++ b/drivers/md/dm-crypt.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (C) 2003 Christophe Saout <christophe@saout.de> | 2 | * Copyright (C) 2003 Christophe Saout <christophe@saout.de> |
3 | * Copyright (C) 2004 Clemens Fruhwirth <clemens@endorphin.org> | 3 | * Copyright (C) 2004 Clemens Fruhwirth <clemens@endorphin.org> |
4 | * Copyright (C) 2006-2008 Red Hat, Inc. All rights reserved. | 4 | * Copyright (C) 2006-2009 Red Hat, Inc. All rights reserved. |
5 | * | 5 | * |
6 | * This file is released under the GPL. | 6 | * This file is released under the GPL. |
7 | */ | 7 | */ |
@@ -71,10 +71,21 @@ struct crypt_iv_operations { | |||
71 | int (*ctr)(struct crypt_config *cc, struct dm_target *ti, | 71 | int (*ctr)(struct crypt_config *cc, struct dm_target *ti, |
72 | const char *opts); | 72 | const char *opts); |
73 | void (*dtr)(struct crypt_config *cc); | 73 | void (*dtr)(struct crypt_config *cc); |
74 | const char *(*status)(struct crypt_config *cc); | 74 | int (*init)(struct crypt_config *cc); |
75 | int (*wipe)(struct crypt_config *cc); | ||
75 | int (*generator)(struct crypt_config *cc, u8 *iv, sector_t sector); | 76 | int (*generator)(struct crypt_config *cc, u8 *iv, sector_t sector); |
76 | }; | 77 | }; |
77 | 78 | ||
79 | struct iv_essiv_private { | ||
80 | struct crypto_cipher *tfm; | ||
81 | struct crypto_hash *hash_tfm; | ||
82 | u8 *salt; | ||
83 | }; | ||
84 | |||
85 | struct iv_benbi_private { | ||
86 | int shift; | ||
87 | }; | ||
88 | |||
78 | /* | 89 | /* |
79 | * Crypt: maps a linear range of a block device | 90 | * Crypt: maps a linear range of a block device |
80 | * and encrypts / decrypts at the same time. | 91 | * and encrypts / decrypts at the same time. |
@@ -102,8 +113,8 @@ struct crypt_config { | |||
102 | struct crypt_iv_operations *iv_gen_ops; | 113 | struct crypt_iv_operations *iv_gen_ops; |
103 | char *iv_mode; | 114 | char *iv_mode; |
104 | union { | 115 | union { |
105 | struct crypto_cipher *essiv_tfm; | 116 | struct iv_essiv_private essiv; |
106 | int benbi_shift; | 117 | struct iv_benbi_private benbi; |
107 | } iv_gen_private; | 118 | } iv_gen_private; |
108 | sector_t iv_offset; | 119 | sector_t iv_offset; |
109 | unsigned int iv_size; | 120 | unsigned int iv_size; |
@@ -147,6 +158,9 @@ static void kcryptd_queue_crypt(struct dm_crypt_io *io); | |||
147 | * plain: the initial vector is the 32-bit little-endian version of the sector | 158 | * plain: the initial vector is the 32-bit little-endian version of the sector |
148 | * number, padded with zeros if necessary. | 159 | * number, padded with zeros if necessary. |
149 | * | 160 | * |
161 | * plain64: the initial vector is the 64-bit little-endian version of the sector | ||
162 | * number, padded with zeros if necessary. | ||
163 | * | ||
150 | * essiv: "encrypted sector|salt initial vector", the sector number is | 164 | * essiv: "encrypted sector|salt initial vector", the sector number is |
151 | * encrypted with the bulk cipher using a salt as key. The salt | 165 | * encrypted with the bulk cipher using a salt as key. The salt |
152 | * should be derived from the bulk cipher's key via hashing. | 166 | * should be derived from the bulk cipher's key via hashing. |
@@ -169,88 +183,123 @@ static int crypt_iv_plain_gen(struct crypt_config *cc, u8 *iv, sector_t sector) | |||
169 | return 0; | 183 | return 0; |
170 | } | 184 | } |
171 | 185 | ||
172 | static int crypt_iv_essiv_ctr(struct crypt_config *cc, struct dm_target *ti, | 186 | static int crypt_iv_plain64_gen(struct crypt_config *cc, u8 *iv, |
173 | const char *opts) | 187 | sector_t sector) |
174 | { | 188 | { |
175 | struct crypto_cipher *essiv_tfm; | 189 | memset(iv, 0, cc->iv_size); |
176 | struct crypto_hash *hash_tfm; | 190 | *(u64 *)iv = cpu_to_le64(sector); |
191 | |||
192 | return 0; | ||
193 | } | ||
194 | |||
195 | /* Initialise ESSIV - compute salt but no local memory allocations */ | ||
196 | static int crypt_iv_essiv_init(struct crypt_config *cc) | ||
197 | { | ||
198 | struct iv_essiv_private *essiv = &cc->iv_gen_private.essiv; | ||
177 | struct hash_desc desc; | 199 | struct hash_desc desc; |
178 | struct scatterlist sg; | 200 | struct scatterlist sg; |
179 | unsigned int saltsize; | ||
180 | u8 *salt; | ||
181 | int err; | 201 | int err; |
182 | 202 | ||
183 | if (opts == NULL) { | 203 | sg_init_one(&sg, cc->key, cc->key_size); |
204 | desc.tfm = essiv->hash_tfm; | ||
205 | desc.flags = CRYPTO_TFM_REQ_MAY_SLEEP; | ||
206 | |||
207 | err = crypto_hash_digest(&desc, &sg, cc->key_size, essiv->salt); | ||
208 | if (err) | ||
209 | return err; | ||
210 | |||
211 | return crypto_cipher_setkey(essiv->tfm, essiv->salt, | ||
212 | crypto_hash_digestsize(essiv->hash_tfm)); | ||
213 | } | ||
214 | |||
215 | /* Wipe salt and reset key derived from volume key */ | ||
216 | static int crypt_iv_essiv_wipe(struct crypt_config *cc) | ||
217 | { | ||
218 | struct iv_essiv_private *essiv = &cc->iv_gen_private.essiv; | ||
219 | unsigned salt_size = crypto_hash_digestsize(essiv->hash_tfm); | ||
220 | |||
221 | memset(essiv->salt, 0, salt_size); | ||
222 | |||
223 | return crypto_cipher_setkey(essiv->tfm, essiv->salt, salt_size); | ||
224 | } | ||
225 | |||
226 | static void crypt_iv_essiv_dtr(struct crypt_config *cc) | ||
227 | { | ||
228 | struct iv_essiv_private *essiv = &cc->iv_gen_private.essiv; | ||
229 | |||
230 | crypto_free_cipher(essiv->tfm); | ||
231 | essiv->tfm = NULL; | ||
232 | |||
233 | crypto_free_hash(essiv->hash_tfm); | ||
234 | essiv->hash_tfm = NULL; | ||
235 | |||
236 | kzfree(essiv->salt); | ||
237 | essiv->salt = NULL; | ||
238 | } | ||
239 | |||
240 | static int crypt_iv_essiv_ctr(struct crypt_config *cc, struct dm_target *ti, | ||
241 | const char *opts) | ||
242 | { | ||
243 | struct crypto_cipher *essiv_tfm = NULL; | ||
244 | struct crypto_hash *hash_tfm = NULL; | ||
245 | u8 *salt = NULL; | ||
246 | int err; | ||
247 | |||
248 | if (!opts) { | ||
184 | ti->error = "Digest algorithm missing for ESSIV mode"; | 249 | ti->error = "Digest algorithm missing for ESSIV mode"; |
185 | return -EINVAL; | 250 | return -EINVAL; |
186 | } | 251 | } |
187 | 252 | ||
188 | /* Hash the cipher key with the given hash algorithm */ | 253 | /* Allocate hash algorithm */ |
189 | hash_tfm = crypto_alloc_hash(opts, 0, CRYPTO_ALG_ASYNC); | 254 | hash_tfm = crypto_alloc_hash(opts, 0, CRYPTO_ALG_ASYNC); |
190 | if (IS_ERR(hash_tfm)) { | 255 | if (IS_ERR(hash_tfm)) { |
191 | ti->error = "Error initializing ESSIV hash"; | 256 | ti->error = "Error initializing ESSIV hash"; |
192 | return PTR_ERR(hash_tfm); | 257 | err = PTR_ERR(hash_tfm); |
258 | goto bad; | ||
193 | } | 259 | } |
194 | 260 | ||
195 | saltsize = crypto_hash_digestsize(hash_tfm); | 261 | salt = kzalloc(crypto_hash_digestsize(hash_tfm), GFP_KERNEL); |
196 | salt = kmalloc(saltsize, GFP_KERNEL); | 262 | if (!salt) { |
197 | if (salt == NULL) { | ||
198 | ti->error = "Error kmallocing salt storage in ESSIV"; | 263 | ti->error = "Error kmallocing salt storage in ESSIV"; |
199 | crypto_free_hash(hash_tfm); | 264 | err = -ENOMEM; |
200 | return -ENOMEM; | 265 | goto bad; |
201 | } | 266 | } |
202 | 267 | ||
203 | sg_init_one(&sg, cc->key, cc->key_size); | 268 | /* Allocate essiv_tfm */ |
204 | desc.tfm = hash_tfm; | ||
205 | desc.flags = CRYPTO_TFM_REQ_MAY_SLEEP; | ||
206 | err = crypto_hash_digest(&desc, &sg, cc->key_size, salt); | ||
207 | crypto_free_hash(hash_tfm); | ||
208 | |||
209 | if (err) { | ||
210 | ti->error = "Error calculating hash in ESSIV"; | ||
211 | kfree(salt); | ||
212 | return err; | ||
213 | } | ||
214 | |||
215 | /* Setup the essiv_tfm with the given salt */ | ||
216 | essiv_tfm = crypto_alloc_cipher(cc->cipher, 0, CRYPTO_ALG_ASYNC); | 269 | essiv_tfm = crypto_alloc_cipher(cc->cipher, 0, CRYPTO_ALG_ASYNC); |
217 | if (IS_ERR(essiv_tfm)) { | 270 | if (IS_ERR(essiv_tfm)) { |
218 | ti->error = "Error allocating crypto tfm for ESSIV"; | 271 | ti->error = "Error allocating crypto tfm for ESSIV"; |
219 | kfree(salt); | 272 | err = PTR_ERR(essiv_tfm); |
220 | return PTR_ERR(essiv_tfm); | 273 | goto bad; |
221 | } | 274 | } |
222 | if (crypto_cipher_blocksize(essiv_tfm) != | 275 | if (crypto_cipher_blocksize(essiv_tfm) != |
223 | crypto_ablkcipher_ivsize(cc->tfm)) { | 276 | crypto_ablkcipher_ivsize(cc->tfm)) { |
224 | ti->error = "Block size of ESSIV cipher does " | 277 | ti->error = "Block size of ESSIV cipher does " |
225 | "not match IV size of block cipher"; | 278 | "not match IV size of block cipher"; |
226 | crypto_free_cipher(essiv_tfm); | 279 | err = -EINVAL; |
227 | kfree(salt); | 280 | goto bad; |
228 | return -EINVAL; | ||
229 | } | 281 | } |
230 | err = crypto_cipher_setkey(essiv_tfm, salt, saltsize); | ||
231 | if (err) { | ||
232 | ti->error = "Failed to set key for ESSIV cipher"; | ||
233 | crypto_free_cipher(essiv_tfm); | ||
234 | kfree(salt); | ||
235 | return err; | ||
236 | } | ||
237 | kfree(salt); | ||
238 | 282 | ||
239 | cc->iv_gen_private.essiv_tfm = essiv_tfm; | 283 | cc->iv_gen_private.essiv.salt = salt; |
284 | cc->iv_gen_private.essiv.tfm = essiv_tfm; | ||
285 | cc->iv_gen_private.essiv.hash_tfm = hash_tfm; | ||
286 | |||
240 | return 0; | 287 | return 0; |
241 | } | ||
242 | 288 | ||
243 | static void crypt_iv_essiv_dtr(struct crypt_config *cc) | 289 | bad: |
244 | { | 290 | if (essiv_tfm && !IS_ERR(essiv_tfm)) |
245 | crypto_free_cipher(cc->iv_gen_private.essiv_tfm); | 291 | crypto_free_cipher(essiv_tfm); |
246 | cc->iv_gen_private.essiv_tfm = NULL; | 292 | if (hash_tfm && !IS_ERR(hash_tfm)) |
293 | crypto_free_hash(hash_tfm); | ||
294 | kfree(salt); | ||
295 | return err; | ||
247 | } | 296 | } |
248 | 297 | ||
249 | static int crypt_iv_essiv_gen(struct crypt_config *cc, u8 *iv, sector_t sector) | 298 | static int crypt_iv_essiv_gen(struct crypt_config *cc, u8 *iv, sector_t sector) |
250 | { | 299 | { |
251 | memset(iv, 0, cc->iv_size); | 300 | memset(iv, 0, cc->iv_size); |
252 | *(u64 *)iv = cpu_to_le64(sector); | 301 | *(u64 *)iv = cpu_to_le64(sector); |
253 | crypto_cipher_encrypt_one(cc->iv_gen_private.essiv_tfm, iv, iv); | 302 | crypto_cipher_encrypt_one(cc->iv_gen_private.essiv.tfm, iv, iv); |
254 | return 0; | 303 | return 0; |
255 | } | 304 | } |
256 | 305 | ||
@@ -273,7 +322,7 @@ static int crypt_iv_benbi_ctr(struct crypt_config *cc, struct dm_target *ti, | |||
273 | return -EINVAL; | 322 | return -EINVAL; |
274 | } | 323 | } |
275 | 324 | ||
276 | cc->iv_gen_private.benbi_shift = 9 - log; | 325 | cc->iv_gen_private.benbi.shift = 9 - log; |
277 | 326 | ||
278 | return 0; | 327 | return 0; |
279 | } | 328 | } |
@@ -288,7 +337,7 @@ static int crypt_iv_benbi_gen(struct crypt_config *cc, u8 *iv, sector_t sector) | |||
288 | 337 | ||
289 | memset(iv, 0, cc->iv_size - sizeof(u64)); /* rest is cleared below */ | 338 | memset(iv, 0, cc->iv_size - sizeof(u64)); /* rest is cleared below */ |
290 | 339 | ||
291 | val = cpu_to_be64(((u64)sector << cc->iv_gen_private.benbi_shift) + 1); | 340 | val = cpu_to_be64(((u64)sector << cc->iv_gen_private.benbi.shift) + 1); |
292 | put_unaligned(val, (__be64 *)(iv + cc->iv_size - sizeof(u64))); | 341 | put_unaligned(val, (__be64 *)(iv + cc->iv_size - sizeof(u64))); |
293 | 342 | ||
294 | return 0; | 343 | return 0; |
@@ -305,9 +354,15 @@ static struct crypt_iv_operations crypt_iv_plain_ops = { | |||
305 | .generator = crypt_iv_plain_gen | 354 | .generator = crypt_iv_plain_gen |
306 | }; | 355 | }; |
307 | 356 | ||
357 | static struct crypt_iv_operations crypt_iv_plain64_ops = { | ||
358 | .generator = crypt_iv_plain64_gen | ||
359 | }; | ||
360 | |||
308 | static struct crypt_iv_operations crypt_iv_essiv_ops = { | 361 | static struct crypt_iv_operations crypt_iv_essiv_ops = { |
309 | .ctr = crypt_iv_essiv_ctr, | 362 | .ctr = crypt_iv_essiv_ctr, |
310 | .dtr = crypt_iv_essiv_dtr, | 363 | .dtr = crypt_iv_essiv_dtr, |
364 | .init = crypt_iv_essiv_init, | ||
365 | .wipe = crypt_iv_essiv_wipe, | ||
311 | .generator = crypt_iv_essiv_gen | 366 | .generator = crypt_iv_essiv_gen |
312 | }; | 367 | }; |
313 | 368 | ||
@@ -934,14 +989,14 @@ static int crypt_set_key(struct crypt_config *cc, char *key) | |||
934 | 989 | ||
935 | set_bit(DM_CRYPT_KEY_VALID, &cc->flags); | 990 | set_bit(DM_CRYPT_KEY_VALID, &cc->flags); |
936 | 991 | ||
937 | return 0; | 992 | return crypto_ablkcipher_setkey(cc->tfm, cc->key, cc->key_size); |
938 | } | 993 | } |
939 | 994 | ||
940 | static int crypt_wipe_key(struct crypt_config *cc) | 995 | static int crypt_wipe_key(struct crypt_config *cc) |
941 | { | 996 | { |
942 | clear_bit(DM_CRYPT_KEY_VALID, &cc->flags); | 997 | clear_bit(DM_CRYPT_KEY_VALID, &cc->flags); |
943 | memset(&cc->key, 0, cc->key_size * sizeof(u8)); | 998 | memset(&cc->key, 0, cc->key_size * sizeof(u8)); |
944 | return 0; | 999 | return crypto_ablkcipher_setkey(cc->tfm, cc->key, cc->key_size); |
945 | } | 1000 | } |
946 | 1001 | ||
947 | /* | 1002 | /* |
@@ -983,11 +1038,6 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv) | |||
983 | return -ENOMEM; | 1038 | return -ENOMEM; |
984 | } | 1039 | } |
985 | 1040 | ||
986 | if (crypt_set_key(cc, argv[1])) { | ||
987 | ti->error = "Error decoding key"; | ||
988 | goto bad_cipher; | ||
989 | } | ||
990 | |||
991 | /* Compatibility mode for old dm-crypt cipher strings */ | 1041 | /* Compatibility mode for old dm-crypt cipher strings */ |
992 | if (!chainmode || (strcmp(chainmode, "plain") == 0 && !ivmode)) { | 1042 | if (!chainmode || (strcmp(chainmode, "plain") == 0 && !ivmode)) { |
993 | chainmode = "cbc"; | 1043 | chainmode = "cbc"; |
@@ -1015,6 +1065,11 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv) | |||
1015 | strcpy(cc->chainmode, chainmode); | 1065 | strcpy(cc->chainmode, chainmode); |
1016 | cc->tfm = tfm; | 1066 | cc->tfm = tfm; |
1017 | 1067 | ||
1068 | if (crypt_set_key(cc, argv[1]) < 0) { | ||
1069 | ti->error = "Error decoding and setting key"; | ||
1070 | goto bad_ivmode; | ||
1071 | } | ||
1072 | |||
1018 | /* | 1073 | /* |
1019 | * Choose ivmode. Valid modes: "plain", "essiv:<esshash>", "benbi". | 1074 | * Choose ivmode. Valid modes: "plain", "essiv:<esshash>", "benbi". |
1020 | * See comments at iv code | 1075 | * See comments at iv code |
@@ -1024,6 +1079,8 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv) | |||
1024 | cc->iv_gen_ops = NULL; | 1079 | cc->iv_gen_ops = NULL; |
1025 | else if (strcmp(ivmode, "plain") == 0) | 1080 | else if (strcmp(ivmode, "plain") == 0) |
1026 | cc->iv_gen_ops = &crypt_iv_plain_ops; | 1081 | cc->iv_gen_ops = &crypt_iv_plain_ops; |
1082 | else if (strcmp(ivmode, "plain64") == 0) | ||
1083 | cc->iv_gen_ops = &crypt_iv_plain64_ops; | ||
1027 | else if (strcmp(ivmode, "essiv") == 0) | 1084 | else if (strcmp(ivmode, "essiv") == 0) |
1028 | cc->iv_gen_ops = &crypt_iv_essiv_ops; | 1085 | cc->iv_gen_ops = &crypt_iv_essiv_ops; |
1029 | else if (strcmp(ivmode, "benbi") == 0) | 1086 | else if (strcmp(ivmode, "benbi") == 0) |
@@ -1039,6 +1096,12 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv) | |||
1039 | cc->iv_gen_ops->ctr(cc, ti, ivopts) < 0) | 1096 | cc->iv_gen_ops->ctr(cc, ti, ivopts) < 0) |
1040 | goto bad_ivmode; | 1097 | goto bad_ivmode; |
1041 | 1098 | ||
1099 | if (cc->iv_gen_ops && cc->iv_gen_ops->init && | ||
1100 | cc->iv_gen_ops->init(cc) < 0) { | ||
1101 | ti->error = "Error initialising IV"; | ||
1102 | goto bad_slab_pool; | ||
1103 | } | ||
1104 | |||
1042 | cc->iv_size = crypto_ablkcipher_ivsize(tfm); | 1105 | cc->iv_size = crypto_ablkcipher_ivsize(tfm); |
1043 | if (cc->iv_size) | 1106 | if (cc->iv_size) |
1044 | /* at least a 64 bit sector number should fit in our buffer */ | 1107 | /* at least a 64 bit sector number should fit in our buffer */ |
@@ -1085,11 +1148,6 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv) | |||
1085 | goto bad_bs; | 1148 | goto bad_bs; |
1086 | } | 1149 | } |
1087 | 1150 | ||
1088 | if (crypto_ablkcipher_setkey(tfm, cc->key, key_size) < 0) { | ||
1089 | ti->error = "Error setting key"; | ||
1090 | goto bad_device; | ||
1091 | } | ||
1092 | |||
1093 | if (sscanf(argv[2], "%llu", &tmpll) != 1) { | 1151 | if (sscanf(argv[2], "%llu", &tmpll) != 1) { |
1094 | ti->error = "Invalid iv_offset sector"; | 1152 | ti->error = "Invalid iv_offset sector"; |
1095 | goto bad_device; | 1153 | goto bad_device; |
@@ -1278,6 +1336,7 @@ static void crypt_resume(struct dm_target *ti) | |||
1278 | static int crypt_message(struct dm_target *ti, unsigned argc, char **argv) | 1336 | static int crypt_message(struct dm_target *ti, unsigned argc, char **argv) |
1279 | { | 1337 | { |
1280 | struct crypt_config *cc = ti->private; | 1338 | struct crypt_config *cc = ti->private; |
1339 | int ret = -EINVAL; | ||
1281 | 1340 | ||
1282 | if (argc < 2) | 1341 | if (argc < 2) |
1283 | goto error; | 1342 | goto error; |
@@ -1287,10 +1346,22 @@ static int crypt_message(struct dm_target *ti, unsigned argc, char **argv) | |||
1287 | DMWARN("not suspended during key manipulation."); | 1346 | DMWARN("not suspended during key manipulation."); |
1288 | return -EINVAL; | 1347 | return -EINVAL; |
1289 | } | 1348 | } |
1290 | if (argc == 3 && !strnicmp(argv[1], MESG_STR("set"))) | 1349 | if (argc == 3 && !strnicmp(argv[1], MESG_STR("set"))) { |
1291 | return crypt_set_key(cc, argv[2]); | 1350 | ret = crypt_set_key(cc, argv[2]); |
1292 | if (argc == 2 && !strnicmp(argv[1], MESG_STR("wipe"))) | 1351 | if (ret) |
1352 | return ret; | ||
1353 | if (cc->iv_gen_ops && cc->iv_gen_ops->init) | ||
1354 | ret = cc->iv_gen_ops->init(cc); | ||
1355 | return ret; | ||
1356 | } | ||
1357 | if (argc == 2 && !strnicmp(argv[1], MESG_STR("wipe"))) { | ||
1358 | if (cc->iv_gen_ops && cc->iv_gen_ops->wipe) { | ||
1359 | ret = cc->iv_gen_ops->wipe(cc); | ||
1360 | if (ret) | ||
1361 | return ret; | ||
1362 | } | ||
1293 | return crypt_wipe_key(cc); | 1363 | return crypt_wipe_key(cc); |
1364 | } | ||
1294 | } | 1365 | } |
1295 | 1366 | ||
1296 | error: | 1367 | error: |