diff options
| author | David S. Miller <davem@sunset.davemloft.net> | 2007-02-08 18:25:18 -0500 |
|---|---|---|
| committer | David S. Miller <davem@sunset.davemloft.net> | 2007-02-08 18:25:18 -0500 |
| commit | 9783e1df7a6bd1e4dc5e2cafcdc29b65a47473d6 (patch) | |
| tree | 9216a285bfe23aa799ca6efa01a3f4063d798e64 /crypto | |
| parent | 4387ff75f29412a234d394b0276c2b239d3d3844 (diff) | |
| parent | dc2e2f33bbf07344995357314fd8887f6564dba7 (diff) | |
Merge branch 'HEAD' of master.kernel.org:/pub/scm/linux/kernel/git/herbert/crypto-2.6
Conflicts:
crypto/Kconfig
Diffstat (limited to 'crypto')
| -rw-r--r-- | crypto/Kconfig | 31 | ||||
| -rw-r--r-- | crypto/Makefile | 3 | ||||
| -rw-r--r-- | crypto/algapi.c | 15 | ||||
| -rw-r--r-- | crypto/api.c | 80 | ||||
| -rw-r--r-- | crypto/blkcipher.c | 9 | ||||
| -rw-r--r-- | crypto/camellia.c | 1801 | ||||
| -rw-r--r-- | crypto/cbc.c | 9 | ||||
| -rw-r--r-- | crypto/cipher.c | 447 | ||||
| -rw-r--r-- | crypto/compress.c | 5 | ||||
| -rw-r--r-- | crypto/digest.c | 24 | ||||
| -rw-r--r-- | crypto/ecb.c | 9 | ||||
| -rw-r--r-- | crypto/fcrypt.c | 423 | ||||
| -rw-r--r-- | crypto/hash.c | 5 | ||||
| -rw-r--r-- | crypto/hmac.c | 9 | ||||
| -rw-r--r-- | crypto/internal.h | 27 | ||||
| -rw-r--r-- | crypto/lrw.c | 11 | ||||
| -rw-r--r-- | crypto/pcbc.c | 349 | ||||
| -rw-r--r-- | crypto/tcrypt.c | 73 | ||||
| -rw-r--r-- | crypto/tcrypt.h | 538 | ||||
| -rw-r--r-- | crypto/xcbc.c | 60 |
20 files changed, 3337 insertions, 591 deletions
diff --git a/crypto/Kconfig b/crypto/Kconfig index 918b4d845f93..086fcec44720 100644 --- a/crypto/Kconfig +++ b/crypto/Kconfig | |||
| @@ -149,6 +149,15 @@ config CRYPTO_CBC | |||
| 149 | CBC: Cipher Block Chaining mode | 149 | CBC: Cipher Block Chaining mode |
| 150 | This block cipher algorithm is required for IPSec. | 150 | This block cipher algorithm is required for IPSec. |
| 151 | 151 | ||
| 152 | config CRYPTO_PCBC | ||
| 153 | tristate "PCBC support" | ||
| 154 | select CRYPTO_BLKCIPHER | ||
| 155 | select CRYPTO_MANAGER | ||
| 156 | default m | ||
| 157 | help | ||
| 158 | PCBC: Propagating Cipher Block Chaining mode | ||
| 159 | This block cipher algorithm is required for RxRPC. | ||
| 160 | |||
| 152 | config CRYPTO_LRW | 161 | config CRYPTO_LRW |
| 153 | tristate "LRW support (EXPERIMENTAL)" | 162 | tristate "LRW support (EXPERIMENTAL)" |
| 154 | depends on EXPERIMENTAL | 163 | depends on EXPERIMENTAL |
| @@ -168,6 +177,13 @@ config CRYPTO_DES | |||
| 168 | help | 177 | help |
| 169 | DES cipher algorithm (FIPS 46-2), and Triple DES EDE (FIPS 46-3). | 178 | DES cipher algorithm (FIPS 46-2), and Triple DES EDE (FIPS 46-3). |
| 170 | 179 | ||
| 180 | config CRYPTO_FCRYPT | ||
| 181 | tristate "FCrypt cipher algorithm" | ||
| 182 | select CRYPTO_ALGAPI | ||
| 183 | select CRYPTO_BLKCIPHER | ||
| 184 | help | ||
| 185 | FCrypt algorithm used by RxRPC. | ||
| 186 | |||
| 171 | config CRYPTO_BLOWFISH | 187 | config CRYPTO_BLOWFISH |
| 172 | tristate "Blowfish cipher algorithm" | 188 | tristate "Blowfish cipher algorithm" |
| 173 | select CRYPTO_ALGAPI | 189 | select CRYPTO_ALGAPI |
| @@ -409,6 +425,21 @@ config CRYPTO_CRC32C | |||
| 409 | See Castagnoli93. This implementation uses lib/libcrc32c. | 425 | See Castagnoli93. This implementation uses lib/libcrc32c. |
| 410 | Module will be crc32c. | 426 | Module will be crc32c. |
| 411 | 427 | ||
| 428 | config CRYPTO_CAMELLIA | ||
| 429 | tristate "Camellia cipher algorithms" | ||
| 430 | depends on CRYPTO | ||
| 431 | select CRYPTO_ALGAPI | ||
| 432 | help | ||
| 433 | Camellia cipher algorithms module. | ||
| 434 | |||
| 435 | Camellia is a symmetric key block cipher developed jointly | ||
| 436 | at NTT and Mitsubishi Electric Corporation. | ||
| 437 | |||
| 438 | The Camellia specifies three key sizes: 128, 192 and 256 bits. | ||
| 439 | |||
| 440 | See also: | ||
| 441 | <https://info.isl.ntt.co.jp/crypt/eng/camellia/index_s.html> | ||
| 442 | |||
| 412 | config CRYPTO_TEST | 443 | config CRYPTO_TEST |
| 413 | tristate "Testing module" | 444 | tristate "Testing module" |
| 414 | depends on m | 445 | depends on m |
diff --git a/crypto/Makefile b/crypto/Makefile index 60e3d24f61f5..12f93f578171 100644 --- a/crypto/Makefile +++ b/crypto/Makefile | |||
| @@ -27,13 +27,16 @@ obj-$(CONFIG_CRYPTO_TGR192) += tgr192.o | |||
| 27 | obj-$(CONFIG_CRYPTO_GF128MUL) += gf128mul.o | 27 | obj-$(CONFIG_CRYPTO_GF128MUL) += gf128mul.o |
| 28 | obj-$(CONFIG_CRYPTO_ECB) += ecb.o | 28 | obj-$(CONFIG_CRYPTO_ECB) += ecb.o |
| 29 | obj-$(CONFIG_CRYPTO_CBC) += cbc.o | 29 | obj-$(CONFIG_CRYPTO_CBC) += cbc.o |
| 30 | obj-$(CONFIG_CRYPTO_PCBC) += pcbc.o | ||
| 30 | obj-$(CONFIG_CRYPTO_LRW) += lrw.o | 31 | obj-$(CONFIG_CRYPTO_LRW) += lrw.o |
| 31 | obj-$(CONFIG_CRYPTO_DES) += des.o | 32 | obj-$(CONFIG_CRYPTO_DES) += des.o |
| 33 | obj-$(CONFIG_CRYPTO_FCRYPT) += fcrypt.o | ||
| 32 | obj-$(CONFIG_CRYPTO_BLOWFISH) += blowfish.o | 34 | obj-$(CONFIG_CRYPTO_BLOWFISH) += blowfish.o |
| 33 | obj-$(CONFIG_CRYPTO_TWOFISH) += twofish.o | 35 | obj-$(CONFIG_CRYPTO_TWOFISH) += twofish.o |
| 34 | obj-$(CONFIG_CRYPTO_TWOFISH_COMMON) += twofish_common.o | 36 | obj-$(CONFIG_CRYPTO_TWOFISH_COMMON) += twofish_common.o |
| 35 | obj-$(CONFIG_CRYPTO_SERPENT) += serpent.o | 37 | obj-$(CONFIG_CRYPTO_SERPENT) += serpent.o |
| 36 | obj-$(CONFIG_CRYPTO_AES) += aes.o | 38 | obj-$(CONFIG_CRYPTO_AES) += aes.o |
| 39 | obj-$(CONFIG_CRYPTO_CAMELLIA) += camellia.o | ||
| 37 | obj-$(CONFIG_CRYPTO_CAST5) += cast5.o | 40 | obj-$(CONFIG_CRYPTO_CAST5) += cast5.o |
| 38 | obj-$(CONFIG_CRYPTO_CAST6) += cast6.o | 41 | obj-$(CONFIG_CRYPTO_CAST6) += cast6.o |
| 39 | obj-$(CONFIG_CRYPTO_ARC4) += arc4.o | 42 | obj-$(CONFIG_CRYPTO_ARC4) += arc4.o |
diff --git a/crypto/algapi.c b/crypto/algapi.c index c91530021e9c..f7d2185b2c8f 100644 --- a/crypto/algapi.c +++ b/crypto/algapi.c | |||
| @@ -377,7 +377,8 @@ void crypto_drop_spawn(struct crypto_spawn *spawn) | |||
| 377 | } | 377 | } |
| 378 | EXPORT_SYMBOL_GPL(crypto_drop_spawn); | 378 | EXPORT_SYMBOL_GPL(crypto_drop_spawn); |
| 379 | 379 | ||
| 380 | struct crypto_tfm *crypto_spawn_tfm(struct crypto_spawn *spawn) | 380 | struct crypto_tfm *crypto_spawn_tfm(struct crypto_spawn *spawn, u32 type, |
| 381 | u32 mask) | ||
| 381 | { | 382 | { |
| 382 | struct crypto_alg *alg; | 383 | struct crypto_alg *alg; |
| 383 | struct crypto_alg *alg2; | 384 | struct crypto_alg *alg2; |
| @@ -396,10 +397,18 @@ struct crypto_tfm *crypto_spawn_tfm(struct crypto_spawn *spawn) | |||
| 396 | return ERR_PTR(-EAGAIN); | 397 | return ERR_PTR(-EAGAIN); |
| 397 | } | 398 | } |
| 398 | 399 | ||
| 399 | tfm = __crypto_alloc_tfm(alg, 0); | 400 | tfm = ERR_PTR(-EINVAL); |
| 401 | if (unlikely((alg->cra_flags ^ type) & mask)) | ||
| 402 | goto out_put_alg; | ||
| 403 | |||
| 404 | tfm = __crypto_alloc_tfm(alg, type, mask); | ||
| 400 | if (IS_ERR(tfm)) | 405 | if (IS_ERR(tfm)) |
| 401 | crypto_mod_put(alg); | 406 | goto out_put_alg; |
| 407 | |||
| 408 | return tfm; | ||
| 402 | 409 | ||
| 410 | out_put_alg: | ||
| 411 | crypto_mod_put(alg); | ||
| 403 | return tfm; | 412 | return tfm; |
| 404 | } | 413 | } |
| 405 | EXPORT_SYMBOL_GPL(crypto_spawn_tfm); | 414 | EXPORT_SYMBOL_GPL(crypto_spawn_tfm); |
diff --git a/crypto/api.c b/crypto/api.c index 8c446871cd5b..55af8bb0f050 100644 --- a/crypto/api.c +++ b/crypto/api.c | |||
| @@ -212,31 +212,12 @@ struct crypto_alg *crypto_alg_mod_lookup(const char *name, u32 type, u32 mask) | |||
| 212 | } | 212 | } |
| 213 | EXPORT_SYMBOL_GPL(crypto_alg_mod_lookup); | 213 | EXPORT_SYMBOL_GPL(crypto_alg_mod_lookup); |
| 214 | 214 | ||
| 215 | static int crypto_init_flags(struct crypto_tfm *tfm, u32 flags) | 215 | static int crypto_init_ops(struct crypto_tfm *tfm, u32 type, u32 mask) |
| 216 | { | 216 | { |
| 217 | tfm->crt_flags = flags & CRYPTO_TFM_REQ_MASK; | 217 | const struct crypto_type *type_obj = tfm->__crt_alg->cra_type; |
| 218 | flags &= ~CRYPTO_TFM_REQ_MASK; | ||
| 219 | |||
| 220 | switch (crypto_tfm_alg_type(tfm)) { | ||
| 221 | case CRYPTO_ALG_TYPE_CIPHER: | ||
| 222 | return crypto_init_cipher_flags(tfm, flags); | ||
| 223 | |||
| 224 | case CRYPTO_ALG_TYPE_DIGEST: | ||
| 225 | return crypto_init_digest_flags(tfm, flags); | ||
| 226 | |||
| 227 | case CRYPTO_ALG_TYPE_COMPRESS: | ||
| 228 | return crypto_init_compress_flags(tfm, flags); | ||
| 229 | } | ||
| 230 | |||
| 231 | return 0; | ||
| 232 | } | ||
| 233 | 218 | ||
| 234 | static int crypto_init_ops(struct crypto_tfm *tfm) | 219 | if (type_obj) |
| 235 | { | 220 | return type_obj->init(tfm, type, mask); |
| 236 | const struct crypto_type *type = tfm->__crt_alg->cra_type; | ||
| 237 | |||
| 238 | if (type) | ||
| 239 | return type->init(tfm); | ||
| 240 | 221 | ||
| 241 | switch (crypto_tfm_alg_type(tfm)) { | 222 | switch (crypto_tfm_alg_type(tfm)) { |
| 242 | case CRYPTO_ALG_TYPE_CIPHER: | 223 | case CRYPTO_ALG_TYPE_CIPHER: |
| @@ -285,29 +266,29 @@ static void crypto_exit_ops(struct crypto_tfm *tfm) | |||
| 285 | } | 266 | } |
| 286 | } | 267 | } |
| 287 | 268 | ||
| 288 | static unsigned int crypto_ctxsize(struct crypto_alg *alg, int flags) | 269 | static unsigned int crypto_ctxsize(struct crypto_alg *alg, u32 type, u32 mask) |
| 289 | { | 270 | { |
| 290 | const struct crypto_type *type = alg->cra_type; | 271 | const struct crypto_type *type_obj = alg->cra_type; |
| 291 | unsigned int len; | 272 | unsigned int len; |
| 292 | 273 | ||
| 293 | len = alg->cra_alignmask & ~(crypto_tfm_ctx_alignment() - 1); | 274 | len = alg->cra_alignmask & ~(crypto_tfm_ctx_alignment() - 1); |
| 294 | if (type) | 275 | if (type_obj) |
| 295 | return len + type->ctxsize(alg); | 276 | return len + type_obj->ctxsize(alg, type, mask); |
| 296 | 277 | ||
| 297 | switch (alg->cra_flags & CRYPTO_ALG_TYPE_MASK) { | 278 | switch (alg->cra_flags & CRYPTO_ALG_TYPE_MASK) { |
| 298 | default: | 279 | default: |
| 299 | BUG(); | 280 | BUG(); |
| 300 | 281 | ||
| 301 | case CRYPTO_ALG_TYPE_CIPHER: | 282 | case CRYPTO_ALG_TYPE_CIPHER: |
| 302 | len += crypto_cipher_ctxsize(alg, flags); | 283 | len += crypto_cipher_ctxsize(alg); |
| 303 | break; | 284 | break; |
| 304 | 285 | ||
| 305 | case CRYPTO_ALG_TYPE_DIGEST: | 286 | case CRYPTO_ALG_TYPE_DIGEST: |
| 306 | len += crypto_digest_ctxsize(alg, flags); | 287 | len += crypto_digest_ctxsize(alg); |
| 307 | break; | 288 | break; |
| 308 | 289 | ||
| 309 | case CRYPTO_ALG_TYPE_COMPRESS: | 290 | case CRYPTO_ALG_TYPE_COMPRESS: |
| 310 | len += crypto_compress_ctxsize(alg, flags); | 291 | len += crypto_compress_ctxsize(alg); |
| 311 | break; | 292 | break; |
| 312 | } | 293 | } |
| 313 | 294 | ||
| @@ -322,24 +303,21 @@ void crypto_shoot_alg(struct crypto_alg *alg) | |||
| 322 | } | 303 | } |
| 323 | EXPORT_SYMBOL_GPL(crypto_shoot_alg); | 304 | EXPORT_SYMBOL_GPL(crypto_shoot_alg); |
| 324 | 305 | ||
| 325 | struct crypto_tfm *__crypto_alloc_tfm(struct crypto_alg *alg, u32 flags) | 306 | struct crypto_tfm *__crypto_alloc_tfm(struct crypto_alg *alg, u32 type, |
| 307 | u32 mask) | ||
| 326 | { | 308 | { |
| 327 | struct crypto_tfm *tfm = NULL; | 309 | struct crypto_tfm *tfm = NULL; |
| 328 | unsigned int tfm_size; | 310 | unsigned int tfm_size; |
| 329 | int err = -ENOMEM; | 311 | int err = -ENOMEM; |
| 330 | 312 | ||
| 331 | tfm_size = sizeof(*tfm) + crypto_ctxsize(alg, flags); | 313 | tfm_size = sizeof(*tfm) + crypto_ctxsize(alg, type, mask); |
| 332 | tfm = kzalloc(tfm_size, GFP_KERNEL); | 314 | tfm = kzalloc(tfm_size, GFP_KERNEL); |
| 333 | if (tfm == NULL) | 315 | if (tfm == NULL) |
| 334 | goto out_err; | 316 | goto out_err; |
| 335 | 317 | ||
| 336 | tfm->__crt_alg = alg; | 318 | tfm->__crt_alg = alg; |
| 337 | 319 | ||
| 338 | err = crypto_init_flags(tfm, flags); | 320 | err = crypto_init_ops(tfm, type, mask); |
| 339 | if (err) | ||
| 340 | goto out_free_tfm; | ||
| 341 | |||
| 342 | err = crypto_init_ops(tfm); | ||
| 343 | if (err) | 321 | if (err) |
| 344 | goto out_free_tfm; | 322 | goto out_free_tfm; |
| 345 | 323 | ||
| @@ -362,31 +340,6 @@ out: | |||
| 362 | } | 340 | } |
| 363 | EXPORT_SYMBOL_GPL(__crypto_alloc_tfm); | 341 | EXPORT_SYMBOL_GPL(__crypto_alloc_tfm); |
| 364 | 342 | ||
| 365 | struct crypto_tfm *crypto_alloc_tfm(const char *name, u32 flags) | ||
| 366 | { | ||
| 367 | struct crypto_tfm *tfm = NULL; | ||
| 368 | int err; | ||
| 369 | |||
| 370 | do { | ||
| 371 | struct crypto_alg *alg; | ||
| 372 | |||
| 373 | alg = crypto_alg_mod_lookup(name, 0, CRYPTO_ALG_ASYNC); | ||
| 374 | err = PTR_ERR(alg); | ||
| 375 | if (IS_ERR(alg)) | ||
| 376 | continue; | ||
| 377 | |||
| 378 | tfm = __crypto_alloc_tfm(alg, flags); | ||
| 379 | err = 0; | ||
| 380 | if (IS_ERR(tfm)) { | ||
| 381 | crypto_mod_put(alg); | ||
| 382 | err = PTR_ERR(tfm); | ||
| 383 | tfm = NULL; | ||
| 384 | } | ||
| 385 | } while (err == -EAGAIN && !signal_pending(current)); | ||
| 386 | |||
| 387 | return tfm; | ||
| 388 | } | ||
| 389 | |||
| 390 | /* | 343 | /* |
| 391 | * crypto_alloc_base - Locate algorithm and allocate transform | 344 | * crypto_alloc_base - Locate algorithm and allocate transform |
| 392 | * @alg_name: Name of algorithm | 345 | * @alg_name: Name of algorithm |
| @@ -420,7 +373,7 @@ struct crypto_tfm *crypto_alloc_base(const char *alg_name, u32 type, u32 mask) | |||
| 420 | goto err; | 373 | goto err; |
| 421 | } | 374 | } |
| 422 | 375 | ||
| 423 | tfm = __crypto_alloc_tfm(alg, 0); | 376 | tfm = __crypto_alloc_tfm(alg, type, mask); |
| 424 | if (!IS_ERR(tfm)) | 377 | if (!IS_ERR(tfm)) |
| 425 | return tfm; | 378 | return tfm; |
| 426 | 379 | ||
| @@ -466,7 +419,6 @@ void crypto_free_tfm(struct crypto_tfm *tfm) | |||
| 466 | kfree(tfm); | 419 | kfree(tfm); |
| 467 | } | 420 | } |
| 468 | 421 | ||
| 469 | EXPORT_SYMBOL_GPL(crypto_alloc_tfm); | ||
| 470 | EXPORT_SYMBOL_GPL(crypto_free_tfm); | 422 | EXPORT_SYMBOL_GPL(crypto_free_tfm); |
| 471 | 423 | ||
| 472 | int crypto_has_alg(const char *name, u32 type, u32 mask) | 424 | int crypto_has_alg(const char *name, u32 type, u32 mask) |
diff --git a/crypto/blkcipher.c b/crypto/blkcipher.c index 6e93004f2181..b5befe8c3a96 100644 --- a/crypto/blkcipher.c +++ b/crypto/blkcipher.c | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | 16 | ||
| 17 | #include <linux/crypto.h> | 17 | #include <linux/crypto.h> |
| 18 | #include <linux/errno.h> | 18 | #include <linux/errno.h> |
| 19 | #include <linux/hardirq.h> | ||
| 19 | #include <linux/kernel.h> | 20 | #include <linux/kernel.h> |
| 20 | #include <linux/module.h> | 21 | #include <linux/module.h> |
| 21 | #include <linux/scatterlist.h> | 22 | #include <linux/scatterlist.h> |
| @@ -313,6 +314,9 @@ static int blkcipher_walk_first(struct blkcipher_desc *desc, | |||
| 313 | struct crypto_blkcipher *tfm = desc->tfm; | 314 | struct crypto_blkcipher *tfm = desc->tfm; |
| 314 | unsigned int alignmask = crypto_blkcipher_alignmask(tfm); | 315 | unsigned int alignmask = crypto_blkcipher_alignmask(tfm); |
| 315 | 316 | ||
| 317 | if (WARN_ON_ONCE(in_irq())) | ||
| 318 | return -EDEADLK; | ||
| 319 | |||
| 316 | walk->nbytes = walk->total; | 320 | walk->nbytes = walk->total; |
| 317 | if (unlikely(!walk->total)) | 321 | if (unlikely(!walk->total)) |
| 318 | return 0; | 322 | return 0; |
| @@ -345,7 +349,8 @@ static int setkey(struct crypto_tfm *tfm, const u8 *key, | |||
| 345 | return cipher->setkey(tfm, key, keylen); | 349 | return cipher->setkey(tfm, key, keylen); |
| 346 | } | 350 | } |
| 347 | 351 | ||
| 348 | static unsigned int crypto_blkcipher_ctxsize(struct crypto_alg *alg) | 352 | static unsigned int crypto_blkcipher_ctxsize(struct crypto_alg *alg, u32 type, |
| 353 | u32 mask) | ||
| 349 | { | 354 | { |
| 350 | struct blkcipher_alg *cipher = &alg->cra_blkcipher; | 355 | struct blkcipher_alg *cipher = &alg->cra_blkcipher; |
| 351 | unsigned int len = alg->cra_ctxsize; | 356 | unsigned int len = alg->cra_ctxsize; |
| @@ -358,7 +363,7 @@ static unsigned int crypto_blkcipher_ctxsize(struct crypto_alg *alg) | |||
| 358 | return len; | 363 | return len; |
| 359 | } | 364 | } |
| 360 | 365 | ||
| 361 | static int crypto_init_blkcipher_ops(struct crypto_tfm *tfm) | 366 | static int crypto_init_blkcipher_ops(struct crypto_tfm *tfm, u32 type, u32 mask) |
| 362 | { | 367 | { |
| 363 | struct blkcipher_tfm *crt = &tfm->crt_blkcipher; | 368 | struct blkcipher_tfm *crt = &tfm->crt_blkcipher; |
| 364 | struct blkcipher_alg *alg = &tfm->__crt_alg->cra_blkcipher; | 369 | struct blkcipher_alg *alg = &tfm->__crt_alg->cra_blkcipher; |
diff --git a/crypto/camellia.c b/crypto/camellia.c new file mode 100644 index 000000000000..6877ecfd90bb --- /dev/null +++ b/crypto/camellia.c | |||
| @@ -0,0 +1,1801 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2006 | ||
| 3 | * NTT (Nippon Telegraph and Telephone Corporation). | ||
| 4 | * | ||
| 5 | * This program is free software; you can redistribute it and/or | ||
| 6 | * modify it under the terms of the GNU General Public License | ||
| 7 | * as published by the Free Software Foundation; either version 2 | ||
| 8 | * of the License, or (at your option) any later version. | ||
| 9 | * | ||
| 10 | * This program is distributed in the hope that it will be useful, | ||
| 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 13 | * GNU General Public License for more details. | ||
| 14 | * | ||
| 15 | * You should have received a copy of the GNU General Public License | ||
| 16 | * along with this program; if not, write to the Free Software | ||
| 17 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 18 | */ | ||
| 19 | |||
| 20 | /* | ||
| 21 | * Algorithm Specification | ||
| 22 | * http://info.isl.ntt.co.jp/crypt/eng/camellia/specifications.html | ||
| 23 | */ | ||
| 24 | |||
| 25 | /* | ||
| 26 | * | ||
| 27 | * NOTE --- NOTE --- NOTE --- NOTE | ||
| 28 | * This implementation assumes that all memory addresses passed | ||
| 29 | * as parameters are four-byte aligned. | ||
| 30 | * | ||
| 31 | */ | ||
| 32 | |||
| 33 | #include <linux/crypto.h> | ||
| 34 | #include <linux/errno.h> | ||
| 35 | #include <linux/init.h> | ||
| 36 | #include <linux/kernel.h> | ||
| 37 | #include <linux/module.h> | ||
| 38 | |||
| 39 | |||
| 40 | #define CAMELLIA_MIN_KEY_SIZE 16 | ||
| 41 | #define CAMELLIA_MAX_KEY_SIZE 32 | ||
| 42 | #define CAMELLIA_BLOCK_SIZE 16 | ||
| 43 | #define CAMELLIA_TABLE_BYTE_LEN 272 | ||
| 44 | #define CAMELLIA_TABLE_WORD_LEN (CAMELLIA_TABLE_BYTE_LEN / 4) | ||
| 45 | |||
| 46 | typedef u32 KEY_TABLE_TYPE[CAMELLIA_TABLE_WORD_LEN]; | ||
| 47 | |||
| 48 | |||
| 49 | /* key constants */ | ||
| 50 | |||
| 51 | #define CAMELLIA_SIGMA1L (0xA09E667FL) | ||
| 52 | #define CAMELLIA_SIGMA1R (0x3BCC908BL) | ||
| 53 | #define CAMELLIA_SIGMA2L (0xB67AE858L) | ||
| 54 | #define CAMELLIA_SIGMA2R (0x4CAA73B2L) | ||
| 55 | #define CAMELLIA_SIGMA3L (0xC6EF372FL) | ||
| 56 | #define CAMELLIA_SIGMA3R (0xE94F82BEL) | ||
| 57 | #define CAMELLIA_SIGMA4L (0x54FF53A5L) | ||
| 58 | #define CAMELLIA_SIGMA4R (0xF1D36F1CL) | ||
| 59 | #define CAMELLIA_SIGMA5L (0x10E527FAL) | ||
| 60 | #define CAMELLIA_SIGMA5R (0xDE682D1DL) | ||
| 61 | #define CAMELLIA_SIGMA6L (0xB05688C2L) | ||
| 62 | #define CAMELLIA_SIGMA6R (0xB3E6C1FDL) | ||
| 63 | |||
| 64 | struct camellia_ctx { | ||
| 65 | int key_length; | ||
| 66 | KEY_TABLE_TYPE key_table; | ||
| 67 | }; | ||
| 68 | |||
| 69 | |||
| 70 | /* | ||
| 71 | * macros | ||
| 72 | */ | ||
| 73 | |||
| 74 | |||
| 75 | # define GETU32(pt) (((u32)(pt)[0] << 24) \ | ||
| 76 | ^ ((u32)(pt)[1] << 16) \ | ||
| 77 | ^ ((u32)(pt)[2] << 8) \ | ||
| 78 | ^ ((u32)(pt)[3])) | ||
| 79 | |||
| 80 | #define COPY4WORD(dst, src) \ | ||
| 81 | do { \ | ||
| 82 | (dst)[0]=(src)[0]; \ | ||
| 83 | (dst)[1]=(src)[1]; \ | ||
| 84 | (dst)[2]=(src)[2]; \ | ||
| 85 | (dst)[3]=(src)[3]; \ | ||
| 86 | }while(0) | ||
| 87 | |||
| 88 | #define SWAP4WORD(word) \ | ||
| 89 | do { \ | ||
| 90 | CAMELLIA_SWAP4((word)[0]); \ | ||
| 91 | CAMELLIA_SWAP4((word)[1]); \ | ||
| 92 | CAMELLIA_SWAP4((word)[2]); \ | ||
| 93 | CAMELLIA_SWAP4((word)[3]); \ | ||
| 94 | }while(0) | ||
| 95 | |||
| 96 | #define XOR4WORD(a, b)/* a = a ^ b */ \ | ||
| 97 | do { \ | ||
| 98 | (a)[0]^=(b)[0]; \ | ||
| 99 | (a)[1]^=(b)[1]; \ | ||
| 100 | (a)[2]^=(b)[2]; \ | ||
| 101 | (a)[3]^=(b)[3]; \ | ||
| 102 | }while(0) | ||
| 103 | |||
| 104 | #define XOR4WORD2(a, b, c)/* a = b ^ c */ \ | ||
| 105 | do { \ | ||
| 106 | (a)[0]=(b)[0]^(c)[0]; \ | ||
| 107 | (a)[1]=(b)[1]^(c)[1]; \ | ||
| 108 | (a)[2]=(b)[2]^(c)[2]; \ | ||
| 109 | (a)[3]=(b)[3]^(c)[3]; \ | ||
| 110 | }while(0) | ||
| 111 | |||
| 112 | #define CAMELLIA_SUBKEY_L(INDEX) (subkey[(INDEX)*2]) | ||
| 113 | #define CAMELLIA_SUBKEY_R(INDEX) (subkey[(INDEX)*2 + 1]) | ||
| 114 | |||
| 115 | /* rotation right shift 1byte */ | ||
| 116 | #define CAMELLIA_RR8(x) (((x) >> 8) + ((x) << 24)) | ||
| 117 | /* rotation left shift 1bit */ | ||
| 118 | #define CAMELLIA_RL1(x) (((x) << 1) + ((x) >> 31)) | ||
| 119 | /* rotation left shift 1byte */ | ||
| 120 | #define CAMELLIA_RL8(x) (((x) << 8) + ((x) >> 24)) | ||
| 121 | |||
| 122 | #define CAMELLIA_ROLDQ(ll, lr, rl, rr, w0, w1, bits) \ | ||
| 123 | do { \ | ||
| 124 | w0 = ll; \ | ||
| 125 | ll = (ll << bits) + (lr >> (32 - bits)); \ | ||
| 126 | lr = (lr << bits) + (rl >> (32 - bits)); \ | ||
| 127 | rl = (rl << bits) + (rr >> (32 - bits)); \ | ||
| 128 | rr = (rr << bits) + (w0 >> (32 - bits)); \ | ||
| 129 | } while(0) | ||
| 130 | |||
| 131 | #define CAMELLIA_ROLDQo32(ll, lr, rl, rr, w0, w1, bits) \ | ||
| 132 | do { \ | ||
| 133 | w0 = ll; \ | ||
| 134 | w1 = lr; \ | ||
| 135 | ll = (lr << (bits - 32)) + (rl >> (64 - bits)); \ | ||
| 136 | lr = (rl << (bits - 32)) + (rr >> (64 - bits)); \ | ||
| 137 | rl = (rr << (bits - 32)) + (w0 >> (64 - bits)); \ | ||
| 138 | rr = (w0 << (bits - 32)) + (w1 >> (64 - bits)); \ | ||
| 139 | } while(0) | ||
| 140 | |||
| 141 | #define CAMELLIA_SP1110(INDEX) (camellia_sp1110[(INDEX)]) | ||
| 142 | #define CAMELLIA_SP0222(INDEX) (camellia_sp0222[(INDEX)]) | ||
| 143 | #define CAMELLIA_SP3033(INDEX) (camellia_sp3033[(INDEX)]) | ||
| 144 | #define CAMELLIA_SP4404(INDEX) (camellia_sp4404[(INDEX)]) | ||
| 145 | |||
| 146 | #define CAMELLIA_F(xl, xr, kl, kr, yl, yr, il, ir, t0, t1) \ | ||
| 147 | do { \ | ||
| 148 | il = xl ^ kl; \ | ||
| 149 | ir = xr ^ kr; \ | ||
| 150 | t0 = il >> 16; \ | ||
| 151 | t1 = ir >> 16; \ | ||
| 152 | yl = CAMELLIA_SP1110(ir & 0xff) \ | ||
| 153 | ^ CAMELLIA_SP0222((t1 >> 8) & 0xff) \ | ||
| 154 | ^ CAMELLIA_SP3033(t1 & 0xff) \ | ||
| 155 | ^ CAMELLIA_SP4404((ir >> 8) & 0xff); \ | ||
| 156 | yr = CAMELLIA_SP1110((t0 >> 8) & 0xff) \ | ||
| 157 | ^ CAMELLIA_SP0222(t0 & 0xff) \ | ||
| 158 | ^ CAMELLIA_SP3033((il >> 8) & 0xff) \ | ||
| 159 | ^ CAMELLIA_SP4404(il & 0xff); \ | ||
| 160 | yl ^= yr; \ | ||
| 161 | yr = CAMELLIA_RR8(yr); \ | ||
| 162 | yr ^= yl; \ | ||
| 163 | } while(0) | ||
| 164 | |||
| 165 | |||
| 166 | /* | ||
| 167 | * for speed up | ||
| 168 | * | ||
| 169 | */ | ||
| 170 | #define CAMELLIA_FLS(ll, lr, rl, rr, kll, klr, krl, krr, t0, t1, t2, t3) \ | ||
| 171 | do { \ | ||
| 172 | t0 = kll; \ | ||
| 173 | t2 = krr; \ | ||
| 174 | t0 &= ll; \ | ||
| 175 | t2 |= rr; \ | ||
| 176 | rl ^= t2; \ | ||
| 177 | lr ^= CAMELLIA_RL1(t0); \ | ||
| 178 | t3 = krl; \ | ||
| 179 | t1 = klr; \ | ||
| 180 | t3 &= rl; \ | ||
| 181 | t1 |= lr; \ | ||
| 182 | ll ^= t1; \ | ||
| 183 | rr ^= CAMELLIA_RL1(t3); \ | ||
| 184 | } while(0) | ||
| 185 | |||
| 186 | #define CAMELLIA_ROUNDSM(xl, xr, kl, kr, yl, yr, il, ir, t0, t1) \ | ||
| 187 | do { \ | ||
| 188 | ir = CAMELLIA_SP1110(xr & 0xff); \ | ||
| 189 | il = CAMELLIA_SP1110((xl>>24) & 0xff); \ | ||
| 190 | ir ^= CAMELLIA_SP0222((xr>>24) & 0xff); \ | ||
| 191 | il ^= CAMELLIA_SP0222((xl>>16) & 0xff); \ | ||
| 192 | ir ^= CAMELLIA_SP3033((xr>>16) & 0xff); \ | ||
| 193 | il ^= CAMELLIA_SP3033((xl>>8) & 0xff); \ | ||
| 194 | ir ^= CAMELLIA_SP4404((xr>>8) & 0xff); \ | ||
| 195 | il ^= CAMELLIA_SP4404(xl & 0xff); \ | ||
| 196 | il ^= kl; \ | ||
| 197 | ir ^= il ^ kr; \ | ||
| 198 | yl ^= ir; \ | ||
| 199 | yr ^= CAMELLIA_RR8(il) ^ ir; \ | ||
| 200 | } while(0) | ||
| 201 | |||
| 202 | /** | ||
| 203 | * Stuff related to the Camellia key schedule | ||
| 204 | */ | ||
| 205 | #define SUBL(x) subL[(x)] | ||
| 206 | #define SUBR(x) subR[(x)] | ||
| 207 | |||
| 208 | |||
| 209 | static const u32 camellia_sp1110[256] = { | ||
| 210 | 0x70707000,0x82828200,0x2c2c2c00,0xececec00, | ||
| 211 | 0xb3b3b300,0x27272700,0xc0c0c000,0xe5e5e500, | ||
| 212 | 0xe4e4e400,0x85858500,0x57575700,0x35353500, | ||
| 213 | 0xeaeaea00,0x0c0c0c00,0xaeaeae00,0x41414100, | ||
| 214 | 0x23232300,0xefefef00,0x6b6b6b00,0x93939300, | ||
| 215 | 0x45454500,0x19191900,0xa5a5a500,0x21212100, | ||
| 216 | 0xededed00,0x0e0e0e00,0x4f4f4f00,0x4e4e4e00, | ||
| 217 | 0x1d1d1d00,0x65656500,0x92929200,0xbdbdbd00, | ||
| 218 | 0x86868600,0xb8b8b800,0xafafaf00,0x8f8f8f00, | ||
| 219 | 0x7c7c7c00,0xebebeb00,0x1f1f1f00,0xcecece00, | ||
| 220 | 0x3e3e3e00,0x30303000,0xdcdcdc00,0x5f5f5f00, | ||
| 221 | 0x5e5e5e00,0xc5c5c500,0x0b0b0b00,0x1a1a1a00, | ||
| 222 | 0xa6a6a600,0xe1e1e100,0x39393900,0xcacaca00, | ||
| 223 | 0xd5d5d500,0x47474700,0x5d5d5d00,0x3d3d3d00, | ||
| 224 | 0xd9d9d900,0x01010100,0x5a5a5a00,0xd6d6d600, | ||
| 225 | 0x51515100,0x56565600,0x6c6c6c00,0x4d4d4d00, | ||
| 226 | 0x8b8b8b00,0x0d0d0d00,0x9a9a9a00,0x66666600, | ||
| 227 | 0xfbfbfb00,0xcccccc00,0xb0b0b000,0x2d2d2d00, | ||
| 228 | 0x74747400,0x12121200,0x2b2b2b00,0x20202000, | ||
| 229 | 0xf0f0f000,0xb1b1b100,0x84848400,0x99999900, | ||
| 230 | 0xdfdfdf00,0x4c4c4c00,0xcbcbcb00,0xc2c2c200, | ||
| 231 | 0x34343400,0x7e7e7e00,0x76767600,0x05050500, | ||
| 232 | 0x6d6d6d00,0xb7b7b700,0xa9a9a900,0x31313100, | ||
| 233 | 0xd1d1d100,0x17171700,0x04040400,0xd7d7d700, | ||
| 234 | 0x14141400,0x58585800,0x3a3a3a00,0x61616100, | ||
| 235 | 0xdedede00,0x1b1b1b00,0x11111100,0x1c1c1c00, | ||
| 236 | 0x32323200,0x0f0f0f00,0x9c9c9c00,0x16161600, | ||
| 237 | 0x53535300,0x18181800,0xf2f2f200,0x22222200, | ||
| 238 | 0xfefefe00,0x44444400,0xcfcfcf00,0xb2b2b200, | ||
| 239 | 0xc3c3c300,0xb5b5b500,0x7a7a7a00,0x91919100, | ||
| 240 | 0x24242400,0x08080800,0xe8e8e800,0xa8a8a800, | ||
| 241 | 0x60606000,0xfcfcfc00,0x69696900,0x50505000, | ||
| 242 | 0xaaaaaa00,0xd0d0d000,0xa0a0a000,0x7d7d7d00, | ||
| 243 | 0xa1a1a100,0x89898900,0x62626200,0x97979700, | ||
| 244 | 0x54545400,0x5b5b5b00,0x1e1e1e00,0x95959500, | ||
| 245 | 0xe0e0e000,0xffffff00,0x64646400,0xd2d2d200, | ||
| 246 | 0x10101000,0xc4c4c400,0x00000000,0x48484800, | ||
| 247 | 0xa3a3a300,0xf7f7f700,0x75757500,0xdbdbdb00, | ||
| 248 | 0x8a8a8a00,0x03030300,0xe6e6e600,0xdadada00, | ||
| 249 | 0x09090900,0x3f3f3f00,0xdddddd00,0x94949400, | ||
| 250 | 0x87878700,0x5c5c5c00,0x83838300,0x02020200, | ||
| 251 | 0xcdcdcd00,0x4a4a4a00,0x90909000,0x33333300, | ||
| 252 | 0x73737300,0x67676700,0xf6f6f600,0xf3f3f300, | ||
| 253 | 0x9d9d9d00,0x7f7f7f00,0xbfbfbf00,0xe2e2e200, | ||
| 254 | 0x52525200,0x9b9b9b00,0xd8d8d800,0x26262600, | ||
| 255 | 0xc8c8c800,0x37373700,0xc6c6c600,0x3b3b3b00, | ||
| 256 | 0x81818100,0x96969600,0x6f6f6f00,0x4b4b4b00, | ||
| 257 | 0x13131300,0xbebebe00,0x63636300,0x2e2e2e00, | ||
| 258 | 0xe9e9e900,0x79797900,0xa7a7a700,0x8c8c8c00, | ||
| 259 | 0x9f9f9f00,0x6e6e6e00,0xbcbcbc00,0x8e8e8e00, | ||
| 260 | 0x29292900,0xf5f5f500,0xf9f9f900,0xb6b6b600, | ||
| 261 | 0x2f2f2f00,0xfdfdfd00,0xb4b4b400,0x59595900, | ||
| 262 | 0x78787800,0x98989800,0x06060600,0x6a6a6a00, | ||
| 263 | 0xe7e7e700,0x46464600,0x71717100,0xbababa00, | ||
| 264 | 0xd4d4d400,0x25252500,0xababab00,0x42424200, | ||
| 265 | 0x88888800,0xa2a2a200,0x8d8d8d00,0xfafafa00, | ||
| 266 | 0x72727200,0x07070700,0xb9b9b900,0x55555500, | ||
| 267 | 0xf8f8f800,0xeeeeee00,0xacacac00,0x0a0a0a00, | ||
| 268 | 0x36363600,0x49494900,0x2a2a2a00,0x68686800, | ||
| 269 | 0x3c3c3c00,0x38383800,0xf1f1f100,0xa4a4a400, | ||
| 270 | 0x40404000,0x28282800,0xd3d3d300,0x7b7b7b00, | ||
| 271 | 0xbbbbbb00,0xc9c9c900,0x43434300,0xc1c1c100, | ||
| 272 | 0x15151500,0xe3e3e300,0xadadad00,0xf4f4f400, | ||
| 273 | 0x77777700,0xc7c7c700,0x80808000,0x9e9e9e00, | ||
| 274 | }; | ||
| 275 | |||
| 276 | static const u32 camellia_sp0222[256] = { | ||
| 277 | 0x00e0e0e0,0x00050505,0x00585858,0x00d9d9d9, | ||
| 278 | 0x00676767,0x004e4e4e,0x00818181,0x00cbcbcb, | ||
| 279 | 0x00c9c9c9,0x000b0b0b,0x00aeaeae,0x006a6a6a, | ||
| 280 | 0x00d5d5d5,0x00181818,0x005d5d5d,0x00828282, | ||
| 281 | 0x00464646,0x00dfdfdf,0x00d6d6d6,0x00272727, | ||
| 282 | 0x008a8a8a,0x00323232,0x004b4b4b,0x00424242, | ||
| 283 | 0x00dbdbdb,0x001c1c1c,0x009e9e9e,0x009c9c9c, | ||
| 284 | 0x003a3a3a,0x00cacaca,0x00252525,0x007b7b7b, | ||
| 285 | 0x000d0d0d,0x00717171,0x005f5f5f,0x001f1f1f, | ||
| 286 | 0x00f8f8f8,0x00d7d7d7,0x003e3e3e,0x009d9d9d, | ||
| 287 | 0x007c7c7c,0x00606060,0x00b9b9b9,0x00bebebe, | ||
| 288 | 0x00bcbcbc,0x008b8b8b,0x00161616,0x00343434, | ||
| 289 | 0x004d4d4d,0x00c3c3c3,0x00727272,0x00959595, | ||
| 290 | 0x00ababab,0x008e8e8e,0x00bababa,0x007a7a7a, | ||
| 291 | 0x00b3b3b3,0x00020202,0x00b4b4b4,0x00adadad, | ||
| 292 | 0x00a2a2a2,0x00acacac,0x00d8d8d8,0x009a9a9a, | ||
| 293 | 0x00171717,0x001a1a1a,0x00353535,0x00cccccc, | ||
| 294 | 0x00f7f7f7,0x00999999,0x00616161,0x005a5a5a, | ||
| 295 | 0x00e8e8e8,0x00242424,0x00565656,0x00404040, | ||
| 296 | 0x00e1e1e1,0x00636363,0x00090909,0x00333333, | ||
| 297 | 0x00bfbfbf,0x00989898,0x00979797,0x00858585, | ||
| 298 | 0x00686868,0x00fcfcfc,0x00ececec,0x000a0a0a, | ||
| 299 | 0x00dadada,0x006f6f6f,0x00535353,0x00626262, | ||
| 300 | 0x00a3a3a3,0x002e2e2e,0x00080808,0x00afafaf, | ||
| 301 | 0x00282828,0x00b0b0b0,0x00747474,0x00c2c2c2, | ||
| 302 | 0x00bdbdbd,0x00363636,0x00222222,0x00383838, | ||
| 303 | 0x00646464,0x001e1e1e,0x00393939,0x002c2c2c, | ||
| 304 | 0x00a6a6a6,0x00303030,0x00e5e5e5,0x00444444, | ||
| 305 | 0x00fdfdfd,0x00888888,0x009f9f9f,0x00656565, | ||
| 306 | 0x00878787,0x006b6b6b,0x00f4f4f4,0x00232323, | ||
| 307 | 0x00484848,0x00101010,0x00d1d1d1,0x00515151, | ||
| 308 | 0x00c0c0c0,0x00f9f9f9,0x00d2d2d2,0x00a0a0a0, | ||
| 309 | 0x00555555,0x00a1a1a1,0x00414141,0x00fafafa, | ||
| 310 | 0x00434343,0x00131313,0x00c4c4c4,0x002f2f2f, | ||
| 311 | 0x00a8a8a8,0x00b6b6b6,0x003c3c3c,0x002b2b2b, | ||
| 312 | 0x00c1c1c1,0x00ffffff,0x00c8c8c8,0x00a5a5a5, | ||
| 313 | 0x00202020,0x00898989,0x00000000,0x00909090, | ||
| 314 | 0x00474747,0x00efefef,0x00eaeaea,0x00b7b7b7, | ||
| 315 | 0x00151515,0x00060606,0x00cdcdcd,0x00b5b5b5, | ||
| 316 | 0x00121212,0x007e7e7e,0x00bbbbbb,0x00292929, | ||
| 317 | 0x000f0f0f,0x00b8b8b8,0x00070707,0x00040404, | ||
| 318 | 0x009b9b9b,0x00949494,0x00212121,0x00666666, | ||
| 319 | 0x00e6e6e6,0x00cecece,0x00ededed,0x00e7e7e7, | ||
| 320 | 0x003b3b3b,0x00fefefe,0x007f7f7f,0x00c5c5c5, | ||
| 321 | 0x00a4a4a4,0x00373737,0x00b1b1b1,0x004c4c4c, | ||
| 322 | 0x00919191,0x006e6e6e,0x008d8d8d,0x00767676, | ||
| 323 | 0x00030303,0x002d2d2d,0x00dedede,0x00969696, | ||
| 324 | 0x00262626,0x007d7d7d,0x00c6c6c6,0x005c5c5c, | ||
| 325 | 0x00d3d3d3,0x00f2f2f2,0x004f4f4f,0x00191919, | ||
| 326 | 0x003f3f3f,0x00dcdcdc,0x00797979,0x001d1d1d, | ||
| 327 | 0x00525252,0x00ebebeb,0x00f3f3f3,0x006d6d6d, | ||
| 328 | 0x005e5e5e,0x00fbfbfb,0x00696969,0x00b2b2b2, | ||
| 329 | 0x00f0f0f0,0x00313131,0x000c0c0c,0x00d4d4d4, | ||
| 330 | 0x00cfcfcf,0x008c8c8c,0x00e2e2e2,0x00757575, | ||
| 331 | 0x00a9a9a9,0x004a4a4a,0x00575757,0x00848484, | ||
| 332 | 0x00111111,0x00454545,0x001b1b1b,0x00f5f5f5, | ||
| 333 | 0x00e4e4e4,0x000e0e0e,0x00737373,0x00aaaaaa, | ||
| 334 | 0x00f1f1f1,0x00dddddd,0x00595959,0x00141414, | ||
| 335 | 0x006c6c6c,0x00929292,0x00545454,0x00d0d0d0, | ||
| 336 | 0x00787878,0x00707070,0x00e3e3e3,0x00494949, | ||
| 337 | 0x00808080,0x00505050,0x00a7a7a7,0x00f6f6f6, | ||
| 338 | 0x00777777,0x00939393,0x00868686,0x00838383, | ||
| 339 | 0x002a2a2a,0x00c7c7c7,0x005b5b5b,0x00e9e9e9, | ||
| 340 | 0x00eeeeee,0x008f8f8f,0x00010101,0x003d3d3d, | ||
| 341 | }; | ||
| 342 | |||
| 343 | static const u32 camellia_sp3033[256] = { | ||
| 344 | 0x38003838,0x41004141,0x16001616,0x76007676, | ||
| 345 | 0xd900d9d9,0x93009393,0x60006060,0xf200f2f2, | ||
| 346 | 0x72007272,0xc200c2c2,0xab00abab,0x9a009a9a, | ||
| 347 | 0x75007575,0x06000606,0x57005757,0xa000a0a0, | ||
| 348 | 0x91009191,0xf700f7f7,0xb500b5b5,0xc900c9c9, | ||
| 349 | 0xa200a2a2,0x8c008c8c,0xd200d2d2,0x90009090, | ||
| 350 | 0xf600f6f6,0x07000707,0xa700a7a7,0x27002727, | ||
| 351 | 0x8e008e8e,0xb200b2b2,0x49004949,0xde00dede, | ||
| 352 | 0x43004343,0x5c005c5c,0xd700d7d7,0xc700c7c7, | ||
| 353 | 0x3e003e3e,0xf500f5f5,0x8f008f8f,0x67006767, | ||
| 354 | 0x1f001f1f,0x18001818,0x6e006e6e,0xaf00afaf, | ||
| 355 | 0x2f002f2f,0xe200e2e2,0x85008585,0x0d000d0d, | ||
| 356 | 0x53005353,0xf000f0f0,0x9c009c9c,0x65006565, | ||
| 357 | 0xea00eaea,0xa300a3a3,0xae00aeae,0x9e009e9e, | ||
| 358 | 0xec00ecec,0x80008080,0x2d002d2d,0x6b006b6b, | ||
| 359 | 0xa800a8a8,0x2b002b2b,0x36003636,0xa600a6a6, | ||
| 360 | 0xc500c5c5,0x86008686,0x4d004d4d,0x33003333, | ||
| 361 | 0xfd00fdfd,0x66006666,0x58005858,0x96009696, | ||
| 362 | 0x3a003a3a,0x09000909,0x95009595,0x10001010, | ||
| 363 | 0x78007878,0xd800d8d8,0x42004242,0xcc00cccc, | ||
| 364 | 0xef00efef,0x26002626,0xe500e5e5,0x61006161, | ||
| 365 | 0x1a001a1a,0x3f003f3f,0x3b003b3b,0x82008282, | ||
| 366 | 0xb600b6b6,0xdb00dbdb,0xd400d4d4,0x98009898, | ||
| 367 | 0xe800e8e8,0x8b008b8b,0x02000202,0xeb00ebeb, | ||
| 368 | 0x0a000a0a,0x2c002c2c,0x1d001d1d,0xb000b0b0, | ||
| 369 | 0x6f006f6f,0x8d008d8d,0x88008888,0x0e000e0e, | ||
| 370 | 0x19001919,0x87008787,0x4e004e4e,0x0b000b0b, | ||
| 371 | 0xa900a9a9,0x0c000c0c,0x79007979,0x11001111, | ||
| 372 | 0x7f007f7f,0x22002222,0xe700e7e7,0x59005959, | ||
| 373 | 0xe100e1e1,0xda00dada,0x3d003d3d,0xc800c8c8, | ||
| 374 | 0x12001212,0x04000404,0x74007474,0x54005454, | ||
| 375 | 0x30003030,0x7e007e7e,0xb400b4b4,0x28002828, | ||
| 376 | 0x55005555,0x68006868,0x50005050,0xbe00bebe, | ||
| 377 | 0xd000d0d0,0xc400c4c4,0x31003131,0xcb00cbcb, | ||
| 378 | 0x2a002a2a,0xad00adad,0x0f000f0f,0xca00caca, | ||
| 379 | 0x70007070,0xff00ffff,0x32003232,0x69006969, | ||
| 380 | 0x08000808,0x62006262,0x00000000,0x24002424, | ||
| 381 | 0xd100d1d1,0xfb00fbfb,0xba00baba,0xed00eded, | ||
| 382 | 0x45004545,0x81008181,0x73007373,0x6d006d6d, | ||
| 383 | 0x84008484,0x9f009f9f,0xee00eeee,0x4a004a4a, | ||
| 384 | 0xc300c3c3,0x2e002e2e,0xc100c1c1,0x01000101, | ||
| 385 | 0xe600e6e6,0x25002525,0x48004848,0x99009999, | ||
| 386 | 0xb900b9b9,0xb300b3b3,0x7b007b7b,0xf900f9f9, | ||
| 387 | 0xce00cece,0xbf00bfbf,0xdf00dfdf,0x71007171, | ||
| 388 | 0x29002929,0xcd00cdcd,0x6c006c6c,0x13001313, | ||
| 389 | 0x64006464,0x9b009b9b,0x63006363,0x9d009d9d, | ||
| 390 | 0xc000c0c0,0x4b004b4b,0xb700b7b7,0xa500a5a5, | ||
| 391 | 0x89008989,0x5f005f5f,0xb100b1b1,0x17001717, | ||
| 392 | 0xf400f4f4,0xbc00bcbc,0xd300d3d3,0x46004646, | ||
| 393 | 0xcf00cfcf,0x37003737,0x5e005e5e,0x47004747, | ||
| 394 | 0x94009494,0xfa00fafa,0xfc00fcfc,0x5b005b5b, | ||
| 395 | 0x97009797,0xfe00fefe,0x5a005a5a,0xac00acac, | ||
| 396 | 0x3c003c3c,0x4c004c4c,0x03000303,0x35003535, | ||
| 397 | 0xf300f3f3,0x23002323,0xb800b8b8,0x5d005d5d, | ||
| 398 | 0x6a006a6a,0x92009292,0xd500d5d5,0x21002121, | ||
| 399 | 0x44004444,0x51005151,0xc600c6c6,0x7d007d7d, | ||
| 400 | 0x39003939,0x83008383,0xdc00dcdc,0xaa00aaaa, | ||
| 401 | 0x7c007c7c,0x77007777,0x56005656,0x05000505, | ||
| 402 | 0x1b001b1b,0xa400a4a4,0x15001515,0x34003434, | ||
| 403 | 0x1e001e1e,0x1c001c1c,0xf800f8f8,0x52005252, | ||
| 404 | 0x20002020,0x14001414,0xe900e9e9,0xbd00bdbd, | ||
| 405 | 0xdd00dddd,0xe400e4e4,0xa100a1a1,0xe000e0e0, | ||
| 406 | 0x8a008a8a,0xf100f1f1,0xd600d6d6,0x7a007a7a, | ||
| 407 | 0xbb00bbbb,0xe300e3e3,0x40004040,0x4f004f4f, | ||
| 408 | }; | ||
| 409 | |||
| 410 | static const u32 camellia_sp4404[256] = { | ||
| 411 | 0x70700070,0x2c2c002c,0xb3b300b3,0xc0c000c0, | ||
| 412 | 0xe4e400e4,0x57570057,0xeaea00ea,0xaeae00ae, | ||
| 413 | 0x23230023,0x6b6b006b,0x45450045,0xa5a500a5, | ||
| 414 | 0xeded00ed,0x4f4f004f,0x1d1d001d,0x92920092, | ||
| 415 | 0x86860086,0xafaf00af,0x7c7c007c,0x1f1f001f, | ||
| 416 | 0x3e3e003e,0xdcdc00dc,0x5e5e005e,0x0b0b000b, | ||
| 417 | 0xa6a600a6,0x39390039,0xd5d500d5,0x5d5d005d, | ||
| 418 | 0xd9d900d9,0x5a5a005a,0x51510051,0x6c6c006c, | ||
| 419 | 0x8b8b008b,0x9a9a009a,0xfbfb00fb,0xb0b000b0, | ||
| 420 | 0x74740074,0x2b2b002b,0xf0f000f0,0x84840084, | ||
| 421 | 0xdfdf00df,0xcbcb00cb,0x34340034,0x76760076, | ||
| 422 | 0x6d6d006d,0xa9a900a9,0xd1d100d1,0x04040004, | ||
| 423 | 0x14140014,0x3a3a003a,0xdede00de,0x11110011, | ||
| 424 | 0x32320032,0x9c9c009c,0x53530053,0xf2f200f2, | ||
| 425 | 0xfefe00fe,0xcfcf00cf,0xc3c300c3,0x7a7a007a, | ||
| 426 | 0x24240024,0xe8e800e8,0x60600060,0x69690069, | ||
| 427 | 0xaaaa00aa,0xa0a000a0,0xa1a100a1,0x62620062, | ||
| 428 | 0x54540054,0x1e1e001e,0xe0e000e0,0x64640064, | ||
| 429 | 0x10100010,0x00000000,0xa3a300a3,0x75750075, | ||
| 430 | 0x8a8a008a,0xe6e600e6,0x09090009,0xdddd00dd, | ||
| 431 | 0x87870087,0x83830083,0xcdcd00cd,0x90900090, | ||
| 432 | 0x73730073,0xf6f600f6,0x9d9d009d,0xbfbf00bf, | ||
| 433 | 0x52520052,0xd8d800d8,0xc8c800c8,0xc6c600c6, | ||
| 434 | 0x81810081,0x6f6f006f,0x13130013,0x63630063, | ||
| 435 | 0xe9e900e9,0xa7a700a7,0x9f9f009f,0xbcbc00bc, | ||
| 436 | 0x29290029,0xf9f900f9,0x2f2f002f,0xb4b400b4, | ||
| 437 | 0x78780078,0x06060006,0xe7e700e7,0x71710071, | ||
| 438 | 0xd4d400d4,0xabab00ab,0x88880088,0x8d8d008d, | ||
| 439 | 0x72720072,0xb9b900b9,0xf8f800f8,0xacac00ac, | ||
| 440 | 0x36360036,0x2a2a002a,0x3c3c003c,0xf1f100f1, | ||
| 441 | 0x40400040,0xd3d300d3,0xbbbb00bb,0x43430043, | ||
| 442 | 0x15150015,0xadad00ad,0x77770077,0x80800080, | ||
| 443 | 0x82820082,0xecec00ec,0x27270027,0xe5e500e5, | ||
| 444 | 0x85850085,0x35350035,0x0c0c000c,0x41410041, | ||
| 445 | 0xefef00ef,0x93930093,0x19190019,0x21210021, | ||
| 446 | 0x0e0e000e,0x4e4e004e,0x65650065,0xbdbd00bd, | ||
| 447 | 0xb8b800b8,0x8f8f008f,0xebeb00eb,0xcece00ce, | ||
| 448 | 0x30300030,0x5f5f005f,0xc5c500c5,0x1a1a001a, | ||
| 449 | 0xe1e100e1,0xcaca00ca,0x47470047,0x3d3d003d, | ||
| 450 | 0x01010001,0xd6d600d6,0x56560056,0x4d4d004d, | ||
| 451 | 0x0d0d000d,0x66660066,0xcccc00cc,0x2d2d002d, | ||
| 452 | 0x12120012,0x20200020,0xb1b100b1,0x99990099, | ||
| 453 | 0x4c4c004c,0xc2c200c2,0x7e7e007e,0x05050005, | ||
| 454 | 0xb7b700b7,0x31310031,0x17170017,0xd7d700d7, | ||
| 455 | 0x58580058,0x61610061,0x1b1b001b,0x1c1c001c, | ||
| 456 | 0x0f0f000f,0x16160016,0x18180018,0x22220022, | ||
| 457 | 0x44440044,0xb2b200b2,0xb5b500b5,0x91910091, | ||
| 458 | 0x08080008,0xa8a800a8,0xfcfc00fc,0x50500050, | ||
| 459 | 0xd0d000d0,0x7d7d007d,0x89890089,0x97970097, | ||
| 460 | 0x5b5b005b,0x95950095,0xffff00ff,0xd2d200d2, | ||
| 461 | 0xc4c400c4,0x48480048,0xf7f700f7,0xdbdb00db, | ||
| 462 | 0x03030003,0xdada00da,0x3f3f003f,0x94940094, | ||
| 463 | 0x5c5c005c,0x02020002,0x4a4a004a,0x33330033, | ||
| 464 | 0x67670067,0xf3f300f3,0x7f7f007f,0xe2e200e2, | ||
| 465 | 0x9b9b009b,0x26260026,0x37370037,0x3b3b003b, | ||
| 466 | 0x96960096,0x4b4b004b,0xbebe00be,0x2e2e002e, | ||
| 467 | 0x79790079,0x8c8c008c,0x6e6e006e,0x8e8e008e, | ||
| 468 | 0xf5f500f5,0xb6b600b6,0xfdfd00fd,0x59590059, | ||
| 469 | 0x98980098,0x6a6a006a,0x46460046,0xbaba00ba, | ||
| 470 | 0x25250025,0x42420042,0xa2a200a2,0xfafa00fa, | ||
| 471 | 0x07070007,0x55550055,0xeeee00ee,0x0a0a000a, | ||
| 472 | 0x49490049,0x68680068,0x38380038,0xa4a400a4, | ||
| 473 | 0x28280028,0x7b7b007b,0xc9c900c9,0xc1c100c1, | ||
| 474 | 0xe3e300e3,0xf4f400f4,0xc7c700c7,0x9e9e009e, | ||
| 475 | }; | ||
| 476 | |||
| 477 | |||
| 478 | |||
| 479 | static void camellia_setup128(const unsigned char *key, u32 *subkey) | ||
| 480 | { | ||
| 481 | u32 kll, klr, krl, krr; | ||
| 482 | u32 il, ir, t0, t1, w0, w1; | ||
| 483 | u32 kw4l, kw4r, dw, tl, tr; | ||
| 484 | u32 subL[26]; | ||
| 485 | u32 subR[26]; | ||
| 486 | |||
| 487 | /** | ||
| 488 | * k == kll || klr || krl || krr (|| is concatination) | ||
| 489 | */ | ||
| 490 | kll = GETU32(key ); | ||
| 491 | klr = GETU32(key + 4); | ||
| 492 | krl = GETU32(key + 8); | ||
| 493 | krr = GETU32(key + 12); | ||
| 494 | /** | ||
| 495 | * generate KL dependent subkeys | ||
| 496 | */ | ||
| 497 | /* kw1 */ | ||
| 498 | SUBL(0) = kll; SUBR(0) = klr; | ||
| 499 | /* kw2 */ | ||
| 500 | SUBL(1) = krl; SUBR(1) = krr; | ||
| 501 | /* rotation left shift 15bit */ | ||
| 502 | CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15); | ||
| 503 | /* k3 */ | ||
| 504 | SUBL(4) = kll; SUBR(4) = klr; | ||
| 505 | /* k4 */ | ||
| 506 | SUBL(5) = krl; SUBR(5) = krr; | ||
| 507 | /* rotation left shift 15+30bit */ | ||
| 508 | CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 30); | ||
| 509 | /* k7 */ | ||
| 510 | SUBL(10) = kll; SUBR(10) = klr; | ||
| 511 | /* k8 */ | ||
| 512 | SUBL(11) = krl; SUBR(11) = krr; | ||
| 513 | /* rotation left shift 15+30+15bit */ | ||
| 514 | CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15); | ||
| 515 | /* k10 */ | ||
| 516 | SUBL(13) = krl; SUBR(13) = krr; | ||
| 517 | /* rotation left shift 15+30+15+17 bit */ | ||
| 518 | CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 17); | ||
| 519 | /* kl3 */ | ||
| 520 | SUBL(16) = kll; SUBR(16) = klr; | ||
| 521 | /* kl4 */ | ||
| 522 | SUBL(17) = krl; SUBR(17) = krr; | ||
| 523 | /* rotation left shift 15+30+15+17+17 bit */ | ||
| 524 | CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 17); | ||
| 525 | /* k13 */ | ||
| 526 | SUBL(18) = kll; SUBR(18) = klr; | ||
| 527 | /* k14 */ | ||
| 528 | SUBL(19) = krl; SUBR(19) = krr; | ||
| 529 | /* rotation left shift 15+30+15+17+17+17 bit */ | ||
| 530 | CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 17); | ||
| 531 | /* k17 */ | ||
| 532 | SUBL(22) = kll; SUBR(22) = klr; | ||
| 533 | /* k18 */ | ||
| 534 | SUBL(23) = krl; SUBR(23) = krr; | ||
| 535 | |||
| 536 | /* generate KA */ | ||
| 537 | kll = SUBL(0); klr = SUBR(0); | ||
| 538 | krl = SUBL(1); krr = SUBR(1); | ||
| 539 | CAMELLIA_F(kll, klr, | ||
| 540 | CAMELLIA_SIGMA1L, CAMELLIA_SIGMA1R, | ||
| 541 | w0, w1, il, ir, t0, t1); | ||
| 542 | krl ^= w0; krr ^= w1; | ||
| 543 | CAMELLIA_F(krl, krr, | ||
| 544 | CAMELLIA_SIGMA2L, CAMELLIA_SIGMA2R, | ||
| 545 | kll, klr, il, ir, t0, t1); | ||
| 546 | /* current status == (kll, klr, w0, w1) */ | ||
| 547 | CAMELLIA_F(kll, klr, | ||
| 548 | CAMELLIA_SIGMA3L, CAMELLIA_SIGMA3R, | ||
| 549 | krl, krr, il, ir, t0, t1); | ||
| 550 | krl ^= w0; krr ^= w1; | ||
| 551 | CAMELLIA_F(krl, krr, | ||
| 552 | CAMELLIA_SIGMA4L, CAMELLIA_SIGMA4R, | ||
| 553 | w0, w1, il, ir, t0, t1); | ||
| 554 | kll ^= w0; klr ^= w1; | ||
| 555 | |||
| 556 | /* generate KA dependent subkeys */ | ||
| 557 | /* k1, k2 */ | ||
| 558 | SUBL(2) = kll; SUBR(2) = klr; | ||
| 559 | SUBL(3) = krl; SUBR(3) = krr; | ||
| 560 | CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15); | ||
| 561 | /* k5,k6 */ | ||
| 562 | SUBL(6) = kll; SUBR(6) = klr; | ||
| 563 | SUBL(7) = krl; SUBR(7) = krr; | ||
| 564 | CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15); | ||
| 565 | /* kl1, kl2 */ | ||
| 566 | SUBL(8) = kll; SUBR(8) = klr; | ||
| 567 | SUBL(9) = krl; SUBR(9) = krr; | ||
| 568 | CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15); | ||
| 569 | /* k9 */ | ||
| 570 | SUBL(12) = kll; SUBR(12) = klr; | ||
| 571 | CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15); | ||
| 572 | /* k11, k12 */ | ||
| 573 | SUBL(14) = kll; SUBR(14) = klr; | ||
| 574 | SUBL(15) = krl; SUBR(15) = krr; | ||
| 575 | CAMELLIA_ROLDQo32(kll, klr, krl, krr, w0, w1, 34); | ||
| 576 | /* k15, k16 */ | ||
| 577 | SUBL(20) = kll; SUBR(20) = klr; | ||
| 578 | SUBL(21) = krl; SUBR(21) = krr; | ||
| 579 | CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 17); | ||
| 580 | /* kw3, kw4 */ | ||
| 581 | SUBL(24) = kll; SUBR(24) = klr; | ||
| 582 | SUBL(25) = krl; SUBR(25) = krr; | ||
| 583 | |||
| 584 | |||
| 585 | /* absorb kw2 to other subkeys */ | ||
| 586 | /* round 2 */ | ||
| 587 | SUBL(3) ^= SUBL(1); SUBR(3) ^= SUBR(1); | ||
| 588 | /* round 4 */ | ||
| 589 | SUBL(5) ^= SUBL(1); SUBR(5) ^= SUBR(1); | ||
| 590 | /* round 6 */ | ||
| 591 | SUBL(7) ^= SUBL(1); SUBR(7) ^= SUBR(1); | ||
| 592 | SUBL(1) ^= SUBR(1) & ~SUBR(9); | ||
| 593 | dw = SUBL(1) & SUBL(9), | ||
| 594 | SUBR(1) ^= CAMELLIA_RL1(dw); /* modified for FLinv(kl2) */ | ||
| 595 | /* round 8 */ | ||
| 596 | SUBL(11) ^= SUBL(1); SUBR(11) ^= SUBR(1); | ||
| 597 | /* round 10 */ | ||
| 598 | SUBL(13) ^= SUBL(1); SUBR(13) ^= SUBR(1); | ||
| 599 | /* round 12 */ | ||
| 600 | SUBL(15) ^= SUBL(1); SUBR(15) ^= SUBR(1); | ||
| 601 | SUBL(1) ^= SUBR(1) & ~SUBR(17); | ||
| 602 | dw = SUBL(1) & SUBL(17), | ||
| 603 | SUBR(1) ^= CAMELLIA_RL1(dw); /* modified for FLinv(kl4) */ | ||
| 604 | /* round 14 */ | ||
| 605 | SUBL(19) ^= SUBL(1); SUBR(19) ^= SUBR(1); | ||
| 606 | /* round 16 */ | ||
| 607 | SUBL(21) ^= SUBL(1); SUBR(21) ^= SUBR(1); | ||
| 608 | /* round 18 */ | ||
| 609 | SUBL(23) ^= SUBL(1); SUBR(23) ^= SUBR(1); | ||
| 610 | /* kw3 */ | ||
| 611 | SUBL(24) ^= SUBL(1); SUBR(24) ^= SUBR(1); | ||
| 612 | |||
| 613 | /* absorb kw4 to other subkeys */ | ||
| 614 | kw4l = SUBL(25); kw4r = SUBR(25); | ||
| 615 | /* round 17 */ | ||
| 616 | SUBL(22) ^= kw4l; SUBR(22) ^= kw4r; | ||
| 617 | /* round 15 */ | ||
| 618 | SUBL(20) ^= kw4l; SUBR(20) ^= kw4r; | ||
| 619 | /* round 13 */ | ||
| 620 | SUBL(18) ^= kw4l; SUBR(18) ^= kw4r; | ||
| 621 | kw4l ^= kw4r & ~SUBR(16); | ||
| 622 | dw = kw4l & SUBL(16), | ||
| 623 | kw4r ^= CAMELLIA_RL1(dw); /* modified for FL(kl3) */ | ||
| 624 | /* round 11 */ | ||
| 625 | SUBL(14) ^= kw4l; SUBR(14) ^= kw4r; | ||
| 626 | /* round 9 */ | ||
| 627 | SUBL(12) ^= kw4l; SUBR(12) ^= kw4r; | ||
| 628 | /* round 7 */ | ||
| 629 | SUBL(10) ^= kw4l; SUBR(10) ^= kw4r; | ||
| 630 | kw4l ^= kw4r & ~SUBR(8); | ||
| 631 | dw = kw4l & SUBL(8), | ||
| 632 | kw4r ^= CAMELLIA_RL1(dw); /* modified for FL(kl1) */ | ||
| 633 | /* round 5 */ | ||
| 634 | SUBL(6) ^= kw4l; SUBR(6) ^= kw4r; | ||
| 635 | /* round 3 */ | ||
| 636 | SUBL(4) ^= kw4l; SUBR(4) ^= kw4r; | ||
| 637 | /* round 1 */ | ||
| 638 | SUBL(2) ^= kw4l; SUBR(2) ^= kw4r; | ||
| 639 | /* kw1 */ | ||
| 640 | SUBL(0) ^= kw4l; SUBR(0) ^= kw4r; | ||
| 641 | |||
| 642 | |||
| 643 | /* key XOR is end of F-function */ | ||
| 644 | CAMELLIA_SUBKEY_L(0) = SUBL(0) ^ SUBL(2);/* kw1 */ | ||
| 645 | CAMELLIA_SUBKEY_R(0) = SUBR(0) ^ SUBR(2); | ||
| 646 | CAMELLIA_SUBKEY_L(2) = SUBL(3); /* round 1 */ | ||
| 647 | CAMELLIA_SUBKEY_R(2) = SUBR(3); | ||
| 648 | CAMELLIA_SUBKEY_L(3) = SUBL(2) ^ SUBL(4); /* round 2 */ | ||
| 649 | CAMELLIA_SUBKEY_R(3) = SUBR(2) ^ SUBR(4); | ||
| 650 | CAMELLIA_SUBKEY_L(4) = SUBL(3) ^ SUBL(5); /* round 3 */ | ||
| 651 | CAMELLIA_SUBKEY_R(4) = SUBR(3) ^ SUBR(5); | ||
| 652 | CAMELLIA_SUBKEY_L(5) = SUBL(4) ^ SUBL(6); /* round 4 */ | ||
| 653 | CAMELLIA_SUBKEY_R(5) = SUBR(4) ^ SUBR(6); | ||
| 654 | CAMELLIA_SUBKEY_L(6) = SUBL(5) ^ SUBL(7); /* round 5 */ | ||
| 655 | CAMELLIA_SUBKEY_R(6) = SUBR(5) ^ SUBR(7); | ||
| 656 | tl = SUBL(10) ^ (SUBR(10) & ~SUBR(8)); | ||
| 657 | dw = tl & SUBL(8), /* FL(kl1) */ | ||
| 658 | tr = SUBR(10) ^ CAMELLIA_RL1(dw); | ||
| 659 | CAMELLIA_SUBKEY_L(7) = SUBL(6) ^ tl; /* round 6 */ | ||
| 660 | CAMELLIA_SUBKEY_R(7) = SUBR(6) ^ tr; | ||
| 661 | CAMELLIA_SUBKEY_L(8) = SUBL(8); /* FL(kl1) */ | ||
| 662 | CAMELLIA_SUBKEY_R(8) = SUBR(8); | ||
| 663 | CAMELLIA_SUBKEY_L(9) = SUBL(9); /* FLinv(kl2) */ | ||
| 664 | CAMELLIA_SUBKEY_R(9) = SUBR(9); | ||
| 665 | tl = SUBL(7) ^ (SUBR(7) & ~SUBR(9)); | ||
| 666 | dw = tl & SUBL(9), /* FLinv(kl2) */ | ||
| 667 | tr = SUBR(7) ^ CAMELLIA_RL1(dw); | ||
| 668 | CAMELLIA_SUBKEY_L(10) = tl ^ SUBL(11); /* round 7 */ | ||
| 669 | CAMELLIA_SUBKEY_R(10) = tr ^ SUBR(11); | ||
| 670 | CAMELLIA_SUBKEY_L(11) = SUBL(10) ^ SUBL(12); /* round 8 */ | ||
| 671 | CAMELLIA_SUBKEY_R(11) = SUBR(10) ^ SUBR(12); | ||
| 672 | CAMELLIA_SUBKEY_L(12) = SUBL(11) ^ SUBL(13); /* round 9 */ | ||
| 673 | CAMELLIA_SUBKEY_R(12) = SUBR(11) ^ SUBR(13); | ||
| 674 | CAMELLIA_SUBKEY_L(13) = SUBL(12) ^ SUBL(14); /* round 10 */ | ||
| 675 | CAMELLIA_SUBKEY_R(13) = SUBR(12) ^ SUBR(14); | ||
| 676 | CAMELLIA_SUBKEY_L(14) = SUBL(13) ^ SUBL(15); /* round 11 */ | ||
| 677 | CAMELLIA_SUBKEY_R(14) = SUBR(13) ^ SUBR(15); | ||
| 678 | tl = SUBL(18) ^ (SUBR(18) & ~SUBR(16)); | ||
| 679 | dw = tl & SUBL(16), /* FL(kl3) */ | ||
| 680 | tr = SUBR(18) ^ CAMELLIA_RL1(dw); | ||
| 681 | CAMELLIA_SUBKEY_L(15) = SUBL(14) ^ tl; /* round 12 */ | ||
| 682 | CAMELLIA_SUBKEY_R(15) = SUBR(14) ^ tr; | ||
| 683 | CAMELLIA_SUBKEY_L(16) = SUBL(16); /* FL(kl3) */ | ||
| 684 | CAMELLIA_SUBKEY_R(16) = SUBR(16); | ||
| 685 | CAMELLIA_SUBKEY_L(17) = SUBL(17); /* FLinv(kl4) */ | ||
| 686 | CAMELLIA_SUBKEY_R(17) = SUBR(17); | ||
| 687 | tl = SUBL(15) ^ (SUBR(15) & ~SUBR(17)); | ||
| 688 | dw = tl & SUBL(17), /* FLinv(kl4) */ | ||
| 689 | tr = SUBR(15) ^ CAMELLIA_RL1(dw); | ||
| 690 | CAMELLIA_SUBKEY_L(18) = tl ^ SUBL(19); /* round 13 */ | ||
| 691 | CAMELLIA_SUBKEY_R(18) = tr ^ SUBR(19); | ||
| 692 | CAMELLIA_SUBKEY_L(19) = SUBL(18) ^ SUBL(20); /* round 14 */ | ||
| 693 | CAMELLIA_SUBKEY_R(19) = SUBR(18) ^ SUBR(20); | ||
| 694 | CAMELLIA_SUBKEY_L(20) = SUBL(19) ^ SUBL(21); /* round 15 */ | ||
| 695 | CAMELLIA_SUBKEY_R(20) = SUBR(19) ^ SUBR(21); | ||
| 696 | CAMELLIA_SUBKEY_L(21) = SUBL(20) ^ SUBL(22); /* round 16 */ | ||
| 697 | CAMELLIA_SUBKEY_R(21) = SUBR(20) ^ SUBR(22); | ||
| 698 | CAMELLIA_SUBKEY_L(22) = SUBL(21) ^ SUBL(23); /* round 17 */ | ||
| 699 | CAMELLIA_SUBKEY_R(22) = SUBR(21) ^ SUBR(23); | ||
| 700 | CAMELLIA_SUBKEY_L(23) = SUBL(22); /* round 18 */ | ||
| 701 | CAMELLIA_SUBKEY_R(23) = SUBR(22); | ||
| 702 | CAMELLIA_SUBKEY_L(24) = SUBL(24) ^ SUBL(23); /* kw3 */ | ||
| 703 | CAMELLIA_SUBKEY_R(24) = SUBR(24) ^ SUBR(23); | ||
| 704 | |||
| 705 | /* apply the inverse of the last half of P-function */ | ||
| 706 | dw = CAMELLIA_SUBKEY_L(2) ^ CAMELLIA_SUBKEY_R(2), | ||
| 707 | dw = CAMELLIA_RL8(dw);/* round 1 */ | ||
| 708 | CAMELLIA_SUBKEY_R(2) = CAMELLIA_SUBKEY_L(2) ^ dw, | ||
| 709 | CAMELLIA_SUBKEY_L(2) = dw; | ||
| 710 | dw = CAMELLIA_SUBKEY_L(3) ^ CAMELLIA_SUBKEY_R(3), | ||
| 711 | dw = CAMELLIA_RL8(dw);/* round 2 */ | ||
| 712 | CAMELLIA_SUBKEY_R(3) = CAMELLIA_SUBKEY_L(3) ^ dw, | ||
| 713 | CAMELLIA_SUBKEY_L(3) = dw; | ||
| 714 | dw = CAMELLIA_SUBKEY_L(4) ^ CAMELLIA_SUBKEY_R(4), | ||
| 715 | dw = CAMELLIA_RL8(dw);/* round 3 */ | ||
| 716 | CAMELLIA_SUBKEY_R(4) = CAMELLIA_SUBKEY_L(4) ^ dw, | ||
| 717 | CAMELLIA_SUBKEY_L(4) = dw; | ||
| 718 | dw = CAMELLIA_SUBKEY_L(5) ^ CAMELLIA_SUBKEY_R(5), | ||
| 719 | dw = CAMELLIA_RL8(dw);/* round 4 */ | ||
| 720 | CAMELLIA_SUBKEY_R(5) = CAMELLIA_SUBKEY_L(5) ^ dw, | ||
| 721 | CAMELLIA_SUBKEY_L(5) = dw; | ||
| 722 | dw = CAMELLIA_SUBKEY_L(6) ^ CAMELLIA_SUBKEY_R(6), | ||
| 723 | dw = CAMELLIA_RL8(dw);/* round 5 */ | ||
| 724 | CAMELLIA_SUBKEY_R(6) = CAMELLIA_SUBKEY_L(6) ^ dw, | ||
| 725 | CAMELLIA_SUBKEY_L(6) = dw; | ||
| 726 | dw = CAMELLIA_SUBKEY_L(7) ^ CAMELLIA_SUBKEY_R(7), | ||
| 727 | dw = CAMELLIA_RL8(dw);/* round 6 */ | ||
| 728 | CAMELLIA_SUBKEY_R(7) = CAMELLIA_SUBKEY_L(7) ^ dw, | ||
| 729 | CAMELLIA_SUBKEY_L(7) = dw; | ||
| 730 | dw = CAMELLIA_SUBKEY_L(10) ^ CAMELLIA_SUBKEY_R(10), | ||
| 731 | dw = CAMELLIA_RL8(dw);/* round 7 */ | ||
| 732 | CAMELLIA_SUBKEY_R(10) = CAMELLIA_SUBKEY_L(10) ^ dw, | ||
| 733 | CAMELLIA_SUBKEY_L(10) = dw; | ||
| 734 | dw = CAMELLIA_SUBKEY_L(11) ^ CAMELLIA_SUBKEY_R(11), | ||
| 735 | dw = CAMELLIA_RL8(dw);/* round 8 */ | ||
| 736 | CAMELLIA_SUBKEY_R(11) = CAMELLIA_SUBKEY_L(11) ^ dw, | ||
| 737 | CAMELLIA_SUBKEY_L(11) = dw; | ||
| 738 | dw = CAMELLIA_SUBKEY_L(12) ^ CAMELLIA_SUBKEY_R(12), | ||
| 739 | dw = CAMELLIA_RL8(dw);/* round 9 */ | ||
| 740 | CAMELLIA_SUBKEY_R(12) = CAMELLIA_SUBKEY_L(12) ^ dw, | ||
| 741 | CAMELLIA_SUBKEY_L(12) = dw; | ||
| 742 | dw = CAMELLIA_SUBKEY_L(13) ^ CAMELLIA_SUBKEY_R(13), | ||
| 743 | dw = CAMELLIA_RL8(dw);/* round 10 */ | ||
| 744 | CAMELLIA_SUBKEY_R(13) = CAMELLIA_SUBKEY_L(13) ^ dw, | ||
| 745 | CAMELLIA_SUBKEY_L(13) = dw; | ||
| 746 | dw = CAMELLIA_SUBKEY_L(14) ^ CAMELLIA_SUBKEY_R(14), | ||
| 747 | dw = CAMELLIA_RL8(dw);/* round 11 */ | ||
| 748 | CAMELLIA_SUBKEY_R(14) = CAMELLIA_SUBKEY_L(14) ^ dw, | ||
| 749 | CAMELLIA_SUBKEY_L(14) = dw; | ||
| 750 | dw = CAMELLIA_SUBKEY_L(15) ^ CAMELLIA_SUBKEY_R(15), | ||
| 751 | dw = CAMELLIA_RL8(dw);/* round 12 */ | ||
| 752 | CAMELLIA_SUBKEY_R(15) = CAMELLIA_SUBKEY_L(15) ^ dw, | ||
| 753 | CAMELLIA_SUBKEY_L(15) = dw; | ||
| 754 | dw = CAMELLIA_SUBKEY_L(18) ^ CAMELLIA_SUBKEY_R(18), | ||
| 755 | dw = CAMELLIA_RL8(dw);/* round 13 */ | ||
| 756 | CAMELLIA_SUBKEY_R(18) = CAMELLIA_SUBKEY_L(18) ^ dw, | ||
| 757 | CAMELLIA_SUBKEY_L(18) = dw; | ||
| 758 | dw = CAMELLIA_SUBKEY_L(19) ^ CAMELLIA_SUBKEY_R(19), | ||
| 759 | dw = CAMELLIA_RL8(dw);/* round 14 */ | ||
| 760 | CAMELLIA_SUBKEY_R(19) = CAMELLIA_SUBKEY_L(19) ^ dw, | ||
| 761 | CAMELLIA_SUBKEY_L(19) = dw; | ||
| 762 | dw = CAMELLIA_SUBKEY_L(20) ^ CAMELLIA_SUBKEY_R(20), | ||
| 763 | dw = CAMELLIA_RL8(dw);/* round 15 */ | ||
| 764 | CAMELLIA_SUBKEY_R(20) = CAMELLIA_SUBKEY_L(20) ^ dw, | ||
| 765 | CAMELLIA_SUBKEY_L(20) = dw; | ||
| 766 | dw = CAMELLIA_SUBKEY_L(21) ^ CAMELLIA_SUBKEY_R(21), | ||
| 767 | dw = CAMELLIA_RL8(dw);/* round 16 */ | ||
| 768 | CAMELLIA_SUBKEY_R(21) = CAMELLIA_SUBKEY_L(21) ^ dw, | ||
| 769 | CAMELLIA_SUBKEY_L(21) = dw; | ||
| 770 | dw = CAMELLIA_SUBKEY_L(22) ^ CAMELLIA_SUBKEY_R(22), | ||
| 771 | dw = CAMELLIA_RL8(dw);/* round 17 */ | ||
| 772 | CAMELLIA_SUBKEY_R(22) = CAMELLIA_SUBKEY_L(22) ^ dw, | ||
| 773 | CAMELLIA_SUBKEY_L(22) = dw; | ||
| 774 | dw = CAMELLIA_SUBKEY_L(23) ^ CAMELLIA_SUBKEY_R(23), | ||
| 775 | dw = CAMELLIA_RL8(dw);/* round 18 */ | ||
| 776 | CAMELLIA_SUBKEY_R(23) = CAMELLIA_SUBKEY_L(23) ^ dw, | ||
| 777 | CAMELLIA_SUBKEY_L(23) = dw; | ||
| 778 | |||
| 779 | return; | ||
| 780 | } | ||
| 781 | |||
| 782 | |||
| 783 | static void camellia_setup256(const unsigned char *key, u32 *subkey) | ||
| 784 | { | ||
| 785 | u32 kll,klr,krl,krr; /* left half of key */ | ||
| 786 | u32 krll,krlr,krrl,krrr; /* right half of key */ | ||
| 787 | u32 il, ir, t0, t1, w0, w1; /* temporary variables */ | ||
| 788 | u32 kw4l, kw4r, dw, tl, tr; | ||
| 789 | u32 subL[34]; | ||
| 790 | u32 subR[34]; | ||
| 791 | |||
| 792 | /** | ||
| 793 | * key = (kll || klr || krl || krr || krll || krlr || krrl || krrr) | ||
| 794 | * (|| is concatination) | ||
| 795 | */ | ||
| 796 | |||
| 797 | kll = GETU32(key ); | ||
| 798 | klr = GETU32(key + 4); | ||
| 799 | krl = GETU32(key + 8); | ||
| 800 | krr = GETU32(key + 12); | ||
| 801 | krll = GETU32(key + 16); | ||
| 802 | krlr = GETU32(key + 20); | ||
| 803 | krrl = GETU32(key + 24); | ||
| 804 | krrr = GETU32(key + 28); | ||
| 805 | |||
| 806 | /* generate KL dependent subkeys */ | ||
| 807 | /* kw1 */ | ||
| 808 | SUBL(0) = kll; SUBR(0) = klr; | ||
| 809 | /* kw2 */ | ||
| 810 | SUBL(1) = krl; SUBR(1) = krr; | ||
| 811 | CAMELLIA_ROLDQo32(kll, klr, krl, krr, w0, w1, 45); | ||
| 812 | /* k9 */ | ||
| 813 | SUBL(12) = kll; SUBR(12) = klr; | ||
| 814 | /* k10 */ | ||
| 815 | SUBL(13) = krl; SUBR(13) = krr; | ||
| 816 | CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15); | ||
| 817 | /* kl3 */ | ||
| 818 | SUBL(16) = kll; SUBR(16) = klr; | ||
| 819 | /* kl4 */ | ||
| 820 | SUBL(17) = krl; SUBR(17) = krr; | ||
| 821 | CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 17); | ||
| 822 | /* k17 */ | ||
| 823 | SUBL(22) = kll; SUBR(22) = klr; | ||
| 824 | /* k18 */ | ||
| 825 | SUBL(23) = krl; SUBR(23) = krr; | ||
| 826 | CAMELLIA_ROLDQo32(kll, klr, krl, krr, w0, w1, 34); | ||
| 827 | /* k23 */ | ||
| 828 | SUBL(30) = kll; SUBR(30) = klr; | ||
| 829 | /* k24 */ | ||
| 830 | SUBL(31) = krl; SUBR(31) = krr; | ||
| 831 | |||
| 832 | /* generate KR dependent subkeys */ | ||
| 833 | CAMELLIA_ROLDQ(krll, krlr, krrl, krrr, w0, w1, 15); | ||
| 834 | /* k3 */ | ||
| 835 | SUBL(4) = krll; SUBR(4) = krlr; | ||
| 836 | /* k4 */ | ||
| 837 | SUBL(5) = krrl; SUBR(5) = krrr; | ||
| 838 | CAMELLIA_ROLDQ(krll, krlr, krrl, krrr, w0, w1, 15); | ||
| 839 | /* kl1 */ | ||
| 840 | SUBL(8) = krll; SUBR(8) = krlr; | ||
| 841 | /* kl2 */ | ||
| 842 | SUBL(9) = krrl; SUBR(9) = krrr; | ||
| 843 | CAMELLIA_ROLDQ(krll, krlr, krrl, krrr, w0, w1, 30); | ||
| 844 | /* k13 */ | ||
| 845 | SUBL(18) = krll; SUBR(18) = krlr; | ||
| 846 | /* k14 */ | ||
| 847 | SUBL(19) = krrl; SUBR(19) = krrr; | ||
| 848 | CAMELLIA_ROLDQo32(krll, krlr, krrl, krrr, w0, w1, 34); | ||
| 849 | /* k19 */ | ||
| 850 | SUBL(26) = krll; SUBR(26) = krlr; | ||
| 851 | /* k20 */ | ||
| 852 | SUBL(27) = krrl; SUBR(27) = krrr; | ||
| 853 | CAMELLIA_ROLDQo32(krll, krlr, krrl, krrr, w0, w1, 34); | ||
| 854 | |||
| 855 | /* generate KA */ | ||
| 856 | kll = SUBL(0) ^ krll; klr = SUBR(0) ^ krlr; | ||
| 857 | krl = SUBL(1) ^ krrl; krr = SUBR(1) ^ krrr; | ||
| 858 | CAMELLIA_F(kll, klr, | ||
| 859 | CAMELLIA_SIGMA1L, CAMELLIA_SIGMA1R, | ||
| 860 | w0, w1, il, ir, t0, t1); | ||
| 861 | krl ^= w0; krr ^= w1; | ||
| 862 | CAMELLIA_F(krl, krr, | ||
| 863 | CAMELLIA_SIGMA2L, CAMELLIA_SIGMA2R, | ||
| 864 | kll, klr, il, ir, t0, t1); | ||
| 865 | kll ^= krll; klr ^= krlr; | ||
| 866 | CAMELLIA_F(kll, klr, | ||
| 867 | CAMELLIA_SIGMA3L, CAMELLIA_SIGMA3R, | ||
| 868 | krl, krr, il, ir, t0, t1); | ||
| 869 | krl ^= w0 ^ krrl; krr ^= w1 ^ krrr; | ||
| 870 | CAMELLIA_F(krl, krr, | ||
| 871 | CAMELLIA_SIGMA4L, CAMELLIA_SIGMA4R, | ||
| 872 | w0, w1, il, ir, t0, t1); | ||
| 873 | kll ^= w0; klr ^= w1; | ||
| 874 | |||
| 875 | /* generate KB */ | ||
| 876 | krll ^= kll; krlr ^= klr; | ||
| 877 | krrl ^= krl; krrr ^= krr; | ||
| 878 | CAMELLIA_F(krll, krlr, | ||
| 879 | CAMELLIA_SIGMA5L, CAMELLIA_SIGMA5R, | ||
| 880 | w0, w1, il, ir, t0, t1); | ||
| 881 | krrl ^= w0; krrr ^= w1; | ||
| 882 | CAMELLIA_F(krrl, krrr, | ||
| 883 | CAMELLIA_SIGMA6L, CAMELLIA_SIGMA6R, | ||
| 884 | w0, w1, il, ir, t0, t1); | ||
| 885 | krll ^= w0; krlr ^= w1; | ||
| 886 | |||
| 887 | /* generate KA dependent subkeys */ | ||
| 888 | CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15); | ||
| 889 | /* k5 */ | ||
| 890 | SUBL(6) = kll; SUBR(6) = klr; | ||
| 891 | /* k6 */ | ||
| 892 | SUBL(7) = krl; SUBR(7) = krr; | ||
| 893 | CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 30); | ||
| 894 | /* k11 */ | ||
| 895 | SUBL(14) = kll; SUBR(14) = klr; | ||
| 896 | /* k12 */ | ||
| 897 | SUBL(15) = krl; SUBR(15) = krr; | ||
| 898 | /* rotation left shift 32bit */ | ||
| 899 | /* kl5 */ | ||
| 900 | SUBL(24) = klr; SUBR(24) = krl; | ||
| 901 | /* kl6 */ | ||
| 902 | SUBL(25) = krr; SUBR(25) = kll; | ||
| 903 | /* rotation left shift 49 from k11,k12 -> k21,k22 */ | ||
| 904 | CAMELLIA_ROLDQo32(kll, klr, krl, krr, w0, w1, 49); | ||
| 905 | /* k21 */ | ||
| 906 | SUBL(28) = kll; SUBR(28) = klr; | ||
| 907 | /* k22 */ | ||
| 908 | SUBL(29) = krl; SUBR(29) = krr; | ||
| 909 | |||
| 910 | /* generate KB dependent subkeys */ | ||
| 911 | /* k1 */ | ||
| 912 | SUBL(2) = krll; SUBR(2) = krlr; | ||
| 913 | /* k2 */ | ||
| 914 | SUBL(3) = krrl; SUBR(3) = krrr; | ||
| 915 | CAMELLIA_ROLDQ(krll, krlr, krrl, krrr, w0, w1, 30); | ||
| 916 | /* k7 */ | ||
| 917 | SUBL(10) = krll; SUBR(10) = krlr; | ||
| 918 | /* k8 */ | ||
| 919 | SUBL(11) = krrl; SUBR(11) = krrr; | ||
| 920 | CAMELLIA_ROLDQ(krll, krlr, krrl, krrr, w0, w1, 30); | ||
| 921 | /* k15 */ | ||
| 922 | SUBL(20) = krll; SUBR(20) = krlr; | ||
| 923 | /* k16 */ | ||
| 924 | SUBL(21) = krrl; SUBR(21) = krrr; | ||
| 925 | CAMELLIA_ROLDQo32(krll, krlr, krrl, krrr, w0, w1, 51); | ||
| 926 | /* kw3 */ | ||
| 927 | SUBL(32) = krll; SUBR(32) = krlr; | ||
| 928 | /* kw4 */ | ||
| 929 | SUBL(33) = krrl; SUBR(33) = krrr; | ||
| 930 | |||
| 931 | /* absorb kw2 to other subkeys */ | ||
| 932 | /* round 2 */ | ||
| 933 | SUBL(3) ^= SUBL(1); SUBR(3) ^= SUBR(1); | ||
| 934 | /* round 4 */ | ||
| 935 | SUBL(5) ^= SUBL(1); SUBR(5) ^= SUBR(1); | ||
| 936 | /* round 6 */ | ||
| 937 | SUBL(7) ^= SUBL(1); SUBR(7) ^= SUBR(1); | ||
| 938 | SUBL(1) ^= SUBR(1) & ~SUBR(9); | ||
| 939 | dw = SUBL(1) & SUBL(9), | ||
| 940 | SUBR(1) ^= CAMELLIA_RL1(dw); /* modified for FLinv(kl2) */ | ||
| 941 | /* round 8 */ | ||
| 942 | SUBL(11) ^= SUBL(1); SUBR(11) ^= SUBR(1); | ||
| 943 | /* round 10 */ | ||
| 944 | SUBL(13) ^= SUBL(1); SUBR(13) ^= SUBR(1); | ||
| 945 | /* round 12 */ | ||
| 946 | SUBL(15) ^= SUBL(1); SUBR(15) ^= SUBR(1); | ||
| 947 | SUBL(1) ^= SUBR(1) & ~SUBR(17); | ||
| 948 | dw = SUBL(1) & SUBL(17), | ||
| 949 | SUBR(1) ^= CAMELLIA_RL1(dw); /* modified for FLinv(kl4) */ | ||
| 950 | /* round 14 */ | ||
| 951 | SUBL(19) ^= SUBL(1); SUBR(19) ^= SUBR(1); | ||
| 952 | /* round 16 */ | ||
| 953 | SUBL(21) ^= SUBL(1); SUBR(21) ^= SUBR(1); | ||
| 954 | /* round 18 */ | ||
| 955 | SUBL(23) ^= SUBL(1); SUBR(23) ^= SUBR(1); | ||
| 956 | SUBL(1) ^= SUBR(1) & ~SUBR(25); | ||
| 957 | dw = SUBL(1) & SUBL(25), | ||
| 958 | SUBR(1) ^= CAMELLIA_RL1(dw); /* modified for FLinv(kl6) */ | ||
| 959 | /* round 20 */ | ||
| 960 | SUBL(27) ^= SUBL(1); SUBR(27) ^= SUBR(1); | ||
| 961 | /* round 22 */ | ||
| 962 | SUBL(29) ^= SUBL(1); SUBR(29) ^= SUBR(1); | ||
| 963 | /* round 24 */ | ||
| 964 | SUBL(31) ^= SUBL(1); SUBR(31) ^= SUBR(1); | ||
| 965 | /* kw3 */ | ||
| 966 | SUBL(32) ^= SUBL(1); SUBR(32) ^= SUBR(1); | ||
| 967 | |||
| 968 | |||
| 969 | /* absorb kw4 to other subkeys */ | ||
| 970 | kw4l = SUBL(33); kw4r = SUBR(33); | ||
| 971 | /* round 23 */ | ||
| 972 | SUBL(30) ^= kw4l; SUBR(30) ^= kw4r; | ||
| 973 | /* round 21 */ | ||
| 974 | SUBL(28) ^= kw4l; SUBR(28) ^= kw4r; | ||
| 975 | /* round 19 */ | ||
| 976 | SUBL(26) ^= kw4l; SUBR(26) ^= kw4r; | ||
| 977 | kw4l ^= kw4r & ~SUBR(24); | ||
| 978 | dw = kw4l & SUBL(24), | ||
| 979 | kw4r ^= CAMELLIA_RL1(dw); /* modified for FL(kl5) */ | ||
| 980 | /* round 17 */ | ||
| 981 | SUBL(22) ^= kw4l; SUBR(22) ^= kw4r; | ||
| 982 | /* round 15 */ | ||
| 983 | SUBL(20) ^= kw4l; SUBR(20) ^= kw4r; | ||
| 984 | /* round 13 */ | ||
| 985 | SUBL(18) ^= kw4l; SUBR(18) ^= kw4r; | ||
| 986 | kw4l ^= kw4r & ~SUBR(16); | ||
| 987 | dw = kw4l & SUBL(16), | ||
| 988 | kw4r ^= CAMELLIA_RL1(dw); /* modified for FL(kl3) */ | ||
| 989 | /* round 11 */ | ||
| 990 | SUBL(14) ^= kw4l; SUBR(14) ^= kw4r; | ||
| 991 | /* round 9 */ | ||
| 992 | SUBL(12) ^= kw4l; SUBR(12) ^= kw4r; | ||
| 993 | /* round 7 */ | ||
| 994 | SUBL(10) ^= kw4l; SUBR(10) ^= kw4r; | ||
| 995 | kw4l ^= kw4r & ~SUBR(8); | ||
| 996 | dw = kw4l & SUBL(8), | ||
| 997 | kw4r ^= CAMELLIA_RL1(dw); /* modified for FL(kl1) */ | ||
| 998 | /* round 5 */ | ||
| 999 | SUBL(6) ^= kw4l; SUBR(6) ^= kw4r; | ||
| 1000 | /* round 3 */ | ||
| 1001 | SUBL(4) ^= kw4l; SUBR(4) ^= kw4r; | ||
| 1002 | /* round 1 */ | ||
| 1003 | SUBL(2) ^= kw4l; SUBR(2) ^= kw4r; | ||
| 1004 | /* kw1 */ | ||
| 1005 | SUBL(0) ^= kw4l; SUBR(0) ^= kw4r; | ||
| 1006 | |||
| 1007 | /* key XOR is end of F-function */ | ||
| 1008 | CAMELLIA_SUBKEY_L(0) = SUBL(0) ^ SUBL(2);/* kw1 */ | ||
| 1009 | CAMELLIA_SUBKEY_R(0) = SUBR(0) ^ SUBR(2); | ||
| 1010 | CAMELLIA_SUBKEY_L(2) = SUBL(3); /* round 1 */ | ||
| 1011 | CAMELLIA_SUBKEY_R(2) = SUBR(3); | ||
| 1012 | CAMELLIA_SUBKEY_L(3) = SUBL(2) ^ SUBL(4); /* round 2 */ | ||
| 1013 | CAMELLIA_SUBKEY_R(3) = SUBR(2) ^ SUBR(4); | ||
| 1014 | CAMELLIA_SUBKEY_L(4) = SUBL(3) ^ SUBL(5); /* round 3 */ | ||
| 1015 | CAMELLIA_SUBKEY_R(4) = SUBR(3) ^ SUBR(5); | ||
| 1016 | CAMELLIA_SUBKEY_L(5) = SUBL(4) ^ SUBL(6); /* round 4 */ | ||
| 1017 | CAMELLIA_SUBKEY_R(5) = SUBR(4) ^ SUBR(6); | ||
| 1018 | CAMELLIA_SUBKEY_L(6) = SUBL(5) ^ SUBL(7); /* round 5 */ | ||
| 1019 | CAMELLIA_SUBKEY_R(6) = SUBR(5) ^ SUBR(7); | ||
| 1020 | tl = SUBL(10) ^ (SUBR(10) & ~SUBR(8)); | ||
| 1021 | dw = tl & SUBL(8), /* FL(kl1) */ | ||
| 1022 | tr = SUBR(10) ^ CAMELLIA_RL1(dw); | ||
| 1023 | CAMELLIA_SUBKEY_L(7) = SUBL(6) ^ tl; /* round 6 */ | ||
| 1024 | CAMELLIA_SUBKEY_R(7) = SUBR(6) ^ tr; | ||
| 1025 | CAMELLIA_SUBKEY_L(8) = SUBL(8); /* FL(kl1) */ | ||
| 1026 | CAMELLIA_SUBKEY_R(8) = SUBR(8); | ||
| 1027 | CAMELLIA_SUBKEY_L(9) = SUBL(9); /* FLinv(kl2) */ | ||
| 1028 | CAMELLIA_SUBKEY_R(9) = SUBR(9); | ||
| 1029 | tl = SUBL(7) ^ (SUBR(7) & ~SUBR(9)); | ||
| 1030 | dw = tl & SUBL(9), /* FLinv(kl2) */ | ||
| 1031 | tr = SUBR(7) ^ CAMELLIA_RL1(dw); | ||
| 1032 | CAMELLIA_SUBKEY_L(10) = tl ^ SUBL(11); /* round 7 */ | ||
| 1033 | CAMELLIA_SUBKEY_R(10) = tr ^ SUBR(11); | ||
| 1034 | CAMELLIA_SUBKEY_L(11) = SUBL(10) ^ SUBL(12); /* round 8 */ | ||
| 1035 | CAMELLIA_SUBKEY_R(11) = SUBR(10) ^ SUBR(12); | ||
| 1036 | CAMELLIA_SUBKEY_L(12) = SUBL(11) ^ SUBL(13); /* round 9 */ | ||
| 1037 | CAMELLIA_SUBKEY_R(12) = SUBR(11) ^ SUBR(13); | ||
| 1038 | CAMELLIA_SUBKEY_L(13) = SUBL(12) ^ SUBL(14); /* round 10 */ | ||
| 1039 | CAMELLIA_SUBKEY_R(13) = SUBR(12) ^ SUBR(14); | ||
| 1040 | CAMELLIA_SUBKEY_L(14) = SUBL(13) ^ SUBL(15); /* round 11 */ | ||
| 1041 | CAMELLIA_SUBKEY_R(14) = SUBR(13) ^ SUBR(15); | ||
| 1042 | tl = SUBL(18) ^ (SUBR(18) & ~SUBR(16)); | ||
| 1043 | dw = tl & SUBL(16), /* FL(kl3) */ | ||
| 1044 | tr = SUBR(18) ^ CAMELLIA_RL1(dw); | ||
| 1045 | CAMELLIA_SUBKEY_L(15) = SUBL(14) ^ tl; /* round 12 */ | ||
| 1046 | CAMELLIA_SUBKEY_R(15) = SUBR(14) ^ tr; | ||
| 1047 | CAMELLIA_SUBKEY_L(16) = SUBL(16); /* FL(kl3) */ | ||
| 1048 | CAMELLIA_SUBKEY_R(16) = SUBR(16); | ||
| 1049 | CAMELLIA_SUBKEY_L(17) = SUBL(17); /* FLinv(kl4) */ | ||
| 1050 | CAMELLIA_SUBKEY_R(17) = SUBR(17); | ||
| 1051 | tl = SUBL(15) ^ (SUBR(15) & ~SUBR(17)); | ||
| 1052 | dw = tl & SUBL(17), /* FLinv(kl4) */ | ||
| 1053 | tr = SUBR(15) ^ CAMELLIA_RL1(dw); | ||
| 1054 | CAMELLIA_SUBKEY_L(18) = tl ^ SUBL(19); /* round 13 */ | ||
| 1055 | CAMELLIA_SUBKEY_R(18) = tr ^ SUBR(19); | ||
| 1056 | CAMELLIA_SUBKEY_L(19) = SUBL(18) ^ SUBL(20); /* round 14 */ | ||
| 1057 | CAMELLIA_SUBKEY_R(19) = SUBR(18) ^ SUBR(20); | ||
| 1058 | CAMELLIA_SUBKEY_L(20) = SUBL(19) ^ SUBL(21); /* round 15 */ | ||
| 1059 | CAMELLIA_SUBKEY_R(20) = SUBR(19) ^ SUBR(21); | ||
| 1060 | CAMELLIA_SUBKEY_L(21) = SUBL(20) ^ SUBL(22); /* round 16 */ | ||
| 1061 | CAMELLIA_SUBKEY_R(21) = SUBR(20) ^ SUBR(22); | ||
| 1062 | CAMELLIA_SUBKEY_L(22) = SUBL(21) ^ SUBL(23); /* round 17 */ | ||
| 1063 | CAMELLIA_SUBKEY_R(22) = SUBR(21) ^ SUBR(23); | ||
| 1064 | tl = SUBL(26) ^ (SUBR(26) | ||
| 1065 | & ~SUBR(24)); | ||
| 1066 | dw = tl & SUBL(24), /* FL(kl5) */ | ||
| 1067 | tr = SUBR(26) ^ CAMELLIA_RL1(dw); | ||
| 1068 | CAMELLIA_SUBKEY_L(23) = SUBL(22) ^ tl; /* round 18 */ | ||
| 1069 | CAMELLIA_SUBKEY_R(23) = SUBR(22) ^ tr; | ||
| 1070 | CAMELLIA_SUBKEY_L(24) = SUBL(24); /* FL(kl5) */ | ||
| 1071 | CAMELLIA_SUBKEY_R(24) = SUBR(24); | ||
| 1072 | CAMELLIA_SUBKEY_L(25) = SUBL(25); /* FLinv(kl6) */ | ||
| 1073 | CAMELLIA_SUBKEY_R(25) = SUBR(25); | ||
| 1074 | tl = SUBL(23) ^ (SUBR(23) & | ||
| 1075 | ~SUBR(25)); | ||
| 1076 | dw = tl & SUBL(25), /* FLinv(kl6) */ | ||
| 1077 | tr = SUBR(23) ^ CAMELLIA_RL1(dw); | ||
| 1078 | CAMELLIA_SUBKEY_L(26) = tl ^ SUBL(27); /* round 19 */ | ||
| 1079 | CAMELLIA_SUBKEY_R(26) = tr ^ SUBR(27); | ||
| 1080 | CAMELLIA_SUBKEY_L(27) = SUBL(26) ^ SUBL(28); /* round 20 */ | ||
| 1081 | CAMELLIA_SUBKEY_R(27) = SUBR(26) ^ SUBR(28); | ||
| 1082 | CAMELLIA_SUBKEY_L(28) = SUBL(27) ^ SUBL(29); /* round 21 */ | ||
| 1083 | CAMELLIA_SUBKEY_R(28) = SUBR(27) ^ SUBR(29); | ||
| 1084 | CAMELLIA_SUBKEY_L(29) = SUBL(28) ^ SUBL(30); /* round 22 */ | ||
| 1085 | CAMELLIA_SUBKEY_R(29) = SUBR(28) ^ SUBR(30); | ||
| 1086 | CAMELLIA_SUBKEY_L(30) = SUBL(29) ^ SUBL(31); /* round 23 */ | ||
| 1087 | CAMELLIA_SUBKEY_R(30) = SUBR(29) ^ SUBR(31); | ||
| 1088 | CAMELLIA_SUBKEY_L(31) = SUBL(30); /* round 24 */ | ||
| 1089 | CAMELLIA_SUBKEY_R(31) = SUBR(30); | ||
| 1090 | CAMELLIA_SUBKEY_L(32) = SUBL(32) ^ SUBL(31); /* kw3 */ | ||
| 1091 | CAMELLIA_SUBKEY_R(32) = SUBR(32) ^ SUBR(31); | ||
| 1092 | |||
| 1093 | /* apply the inverse of the last half of P-function */ | ||
| 1094 | dw = CAMELLIA_SUBKEY_L(2) ^ CAMELLIA_SUBKEY_R(2), | ||
| 1095 | dw = CAMELLIA_RL8(dw);/* round 1 */ | ||
| 1096 | CAMELLIA_SUBKEY_R(2) = CAMELLIA_SUBKEY_L(2) ^ dw, | ||
| 1097 | CAMELLIA_SUBKEY_L(2) = dw; | ||
| 1098 | dw = CAMELLIA_SUBKEY_L(3) ^ CAMELLIA_SUBKEY_R(3), | ||
| 1099 | dw = CAMELLIA_RL8(dw);/* round 2 */ | ||
| 1100 | CAMELLIA_SUBKEY_R(3) = CAMELLIA_SUBKEY_L(3) ^ dw, | ||
| 1101 | CAMELLIA_SUBKEY_L(3) = dw; | ||
| 1102 | dw = CAMELLIA_SUBKEY_L(4) ^ CAMELLIA_SUBKEY_R(4), | ||
| 1103 | dw = CAMELLIA_RL8(dw);/* round 3 */ | ||
| 1104 | CAMELLIA_SUBKEY_R(4) = CAMELLIA_SUBKEY_L(4) ^ dw, | ||
| 1105 | CAMELLIA_SUBKEY_L(4) = dw; | ||
| 1106 | dw = CAMELLIA_SUBKEY_L(5) ^ CAMELLIA_SUBKEY_R(5), | ||
| 1107 | dw = CAMELLIA_RL8(dw);/* round 4 */ | ||
| 1108 | CAMELLIA_SUBKEY_R(5) = CAMELLIA_SUBKEY_L(5) ^ dw, | ||
| 1109 | CAMELLIA_SUBKEY_L(5) = dw; | ||
| 1110 | dw = CAMELLIA_SUBKEY_L(6) ^ CAMELLIA_SUBKEY_R(6), | ||
| 1111 | dw = CAMELLIA_RL8(dw);/* round 5 */ | ||
| 1112 | CAMELLIA_SUBKEY_R(6) = CAMELLIA_SUBKEY_L(6) ^ dw, | ||
| 1113 | CAMELLIA_SUBKEY_L(6) = dw; | ||
| 1114 | dw = CAMELLIA_SUBKEY_L(7) ^ CAMELLIA_SUBKEY_R(7), | ||
| 1115 | dw = CAMELLIA_RL8(dw);/* round 6 */ | ||
| 1116 | CAMELLIA_SUBKEY_R(7) = CAMELLIA_SUBKEY_L(7) ^ dw, | ||
| 1117 | CAMELLIA_SUBKEY_L(7) = dw; | ||
| 1118 | dw = CAMELLIA_SUBKEY_L(10) ^ CAMELLIA_SUBKEY_R(10), | ||
| 1119 | dw = CAMELLIA_RL8(dw);/* round 7 */ | ||
| 1120 | CAMELLIA_SUBKEY_R(10) = CAMELLIA_SUBKEY_L(10) ^ dw, | ||
| 1121 | CAMELLIA_SUBKEY_L(10) = dw; | ||
| 1122 | dw = CAMELLIA_SUBKEY_L(11) ^ CAMELLIA_SUBKEY_R(11), | ||
| 1123 | dw = CAMELLIA_RL8(dw);/* round 8 */ | ||
| 1124 | CAMELLIA_SUBKEY_R(11) = CAMELLIA_SUBKEY_L(11) ^ dw, | ||
| 1125 | CAMELLIA_SUBKEY_L(11) = dw; | ||
| 1126 | dw = CAMELLIA_SUBKEY_L(12) ^ CAMELLIA_SUBKEY_R(12), | ||
| 1127 | dw = CAMELLIA_RL8(dw);/* round 9 */ | ||
| 1128 | CAMELLIA_SUBKEY_R(12) = CAMELLIA_SUBKEY_L(12) ^ dw, | ||
| 1129 | CAMELLIA_SUBKEY_L(12) = dw; | ||
| 1130 | dw = CAMELLIA_SUBKEY_L(13) ^ CAMELLIA_SUBKEY_R(13), | ||
| 1131 | dw = CAMELLIA_RL8(dw);/* round 10 */ | ||
| 1132 | CAMELLIA_SUBKEY_R(13) = CAMELLIA_SUBKEY_L(13) ^ dw, | ||
| 1133 | CAMELLIA_SUBKEY_L(13) = dw; | ||
| 1134 | dw = CAMELLIA_SUBKEY_L(14) ^ CAMELLIA_SUBKEY_R(14), | ||
| 1135 | dw = CAMELLIA_RL8(dw);/* round 11 */ | ||
| 1136 | CAMELLIA_SUBKEY_R(14) = CAMELLIA_SUBKEY_L(14) ^ dw, | ||
| 1137 | CAMELLIA_SUBKEY_L(14) = dw; | ||
| 1138 | dw = CAMELLIA_SUBKEY_L(15) ^ CAMELLIA_SUBKEY_R(15), | ||
| 1139 | dw = CAMELLIA_RL8(dw);/* round 12 */ | ||
| 1140 | CAMELLIA_SUBKEY_R(15) = CAMELLIA_SUBKEY_L(15) ^ dw, | ||
| 1141 | CAMELLIA_SUBKEY_L(15) = dw; | ||
| 1142 | dw = CAMELLIA_SUBKEY_L(18) ^ CAMELLIA_SUBKEY_R(18), | ||
| 1143 | dw = CAMELLIA_RL8(dw);/* round 13 */ | ||
| 1144 | CAMELLIA_SUBKEY_R(18) = CAMELLIA_SUBKEY_L(18) ^ dw, | ||
| 1145 | CAMELLIA_SUBKEY_L(18) = dw; | ||
| 1146 | dw = CAMELLIA_SUBKEY_L(19) ^ CAMELLIA_SUBKEY_R(19), | ||
| 1147 | dw = CAMELLIA_RL8(dw);/* round 14 */ | ||
| 1148 | CAMELLIA_SUBKEY_R(19) = CAMELLIA_SUBKEY_L(19) ^ dw, | ||
| 1149 | CAMELLIA_SUBKEY_L(19) = dw; | ||
| 1150 | dw = CAMELLIA_SUBKEY_L(20) ^ CAMELLIA_SUBKEY_R(20), | ||
| 1151 | dw = CAMELLIA_RL8(dw);/* round 15 */ | ||
| 1152 | CAMELLIA_SUBKEY_R(20) = CAMELLIA_SUBKEY_L(20) ^ dw, | ||
| 1153 | CAMELLIA_SUBKEY_L(20) = dw; | ||
| 1154 | dw = CAMELLIA_SUBKEY_L(21) ^ CAMELLIA_SUBKEY_R(21), | ||
| 1155 | dw = CAMELLIA_RL8(dw);/* round 16 */ | ||
| 1156 | CAMELLIA_SUBKEY_R(21) = CAMELLIA_SUBKEY_L(21) ^ dw, | ||
| 1157 | CAMELLIA_SUBKEY_L(21) = dw; | ||
| 1158 | dw = CAMELLIA_SUBKEY_L(22) ^ CAMELLIA_SUBKEY_R(22), | ||
| 1159 | dw = CAMELLIA_RL8(dw);/* round 17 */ | ||
| 1160 | CAMELLIA_SUBKEY_R(22) = CAMELLIA_SUBKEY_L(22) ^ dw, | ||
| 1161 | CAMELLIA_SUBKEY_L(22) = dw; | ||
| 1162 | dw = CAMELLIA_SUBKEY_L(23) ^ CAMELLIA_SUBKEY_R(23), | ||
| 1163 | dw = CAMELLIA_RL8(dw);/* round 18 */ | ||
| 1164 | CAMELLIA_SUBKEY_R(23) = CAMELLIA_SUBKEY_L(23) ^ dw, | ||
| 1165 | CAMELLIA_SUBKEY_L(23) = dw; | ||
| 1166 | dw = CAMELLIA_SUBKEY_L(26) ^ CAMELLIA_SUBKEY_R(26), | ||
| 1167 | dw = CAMELLIA_RL8(dw);/* round 19 */ | ||
| 1168 | CAMELLIA_SUBKEY_R(26) = CAMELLIA_SUBKEY_L(26) ^ dw, | ||
| 1169 | CAMELLIA_SUBKEY_L(26) = dw; | ||
| 1170 | dw = CAMELLIA_SUBKEY_L(27) ^ CAMELLIA_SUBKEY_R(27), | ||
| 1171 | dw = CAMELLIA_RL8(dw);/* round 20 */ | ||
| 1172 | CAMELLIA_SUBKEY_R(27) = CAMELLIA_SUBKEY_L(27) ^ dw, | ||
| 1173 | CAMELLIA_SUBKEY_L(27) = dw; | ||
| 1174 | dw = CAMELLIA_SUBKEY_L(28) ^ CAMELLIA_SUBKEY_R(28), | ||
| 1175 | dw = CAMELLIA_RL8(dw);/* round 21 */ | ||
| 1176 | CAMELLIA_SUBKEY_R(28) = CAMELLIA_SUBKEY_L(28) ^ dw, | ||
| 1177 | CAMELLIA_SUBKEY_L(28) = dw; | ||
| 1178 | dw = CAMELLIA_SUBKEY_L(29) ^ CAMELLIA_SUBKEY_R(29), | ||
| 1179 | dw = CAMELLIA_RL8(dw);/* round 22 */ | ||
| 1180 | CAMELLIA_SUBKEY_R(29) = CAMELLIA_SUBKEY_L(29) ^ dw, | ||
| 1181 | CAMELLIA_SUBKEY_L(29) = dw; | ||
| 1182 | dw = CAMELLIA_SUBKEY_L(30) ^ CAMELLIA_SUBKEY_R(30), | ||
| 1183 | dw = CAMELLIA_RL8(dw);/* round 23 */ | ||
| 1184 | CAMELLIA_SUBKEY_R(30) = CAMELLIA_SUBKEY_L(30) ^ dw, | ||
| 1185 | CAMELLIA_SUBKEY_L(30) = dw; | ||
| 1186 | dw = CAMELLIA_SUBKEY_L(31) ^ CAMELLIA_SUBKEY_R(31), | ||
| 1187 | dw = CAMELLIA_RL8(dw);/* round 24 */ | ||
| 1188 | CAMELLIA_SUBKEY_R(31) = CAMELLIA_SUBKEY_L(31) ^ dw, | ||
| 1189 | CAMELLIA_SUBKEY_L(31) = dw; | ||
| 1190 | |||
| 1191 | return; | ||
| 1192 | } | ||
| 1193 | |||
| 1194 | static void camellia_setup192(const unsigned char *key, u32 *subkey) | ||
| 1195 | { | ||
| 1196 | unsigned char kk[32]; | ||
| 1197 | u32 krll, krlr, krrl,krrr; | ||
| 1198 | |||
| 1199 | memcpy(kk, key, 24); | ||
| 1200 | memcpy((unsigned char *)&krll, key+16,4); | ||
| 1201 | memcpy((unsigned char *)&krlr, key+20,4); | ||
| 1202 | krrl = ~krll; | ||
| 1203 | krrr = ~krlr; | ||
| 1204 | memcpy(kk+24, (unsigned char *)&krrl, 4); | ||
| 1205 | memcpy(kk+28, (unsigned char *)&krrr, 4); | ||
| 1206 | camellia_setup256(kk, subkey); | ||
| 1207 | return; | ||
| 1208 | } | ||
| 1209 | |||
| 1210 | |||
| 1211 | /** | ||
| 1212 | * Stuff related to camellia encryption/decryption | ||
| 1213 | */ | ||
| 1214 | static void camellia_encrypt128(const u32 *subkey, __be32 *io_text) | ||
| 1215 | { | ||
| 1216 | u32 il,ir,t0,t1; /* temporary valiables */ | ||
| 1217 | |||
| 1218 | u32 io[4]; | ||
| 1219 | |||
| 1220 | io[0] = be32_to_cpu(io_text[0]); | ||
| 1221 | io[1] = be32_to_cpu(io_text[1]); | ||
| 1222 | io[2] = be32_to_cpu(io_text[2]); | ||
| 1223 | io[3] = be32_to_cpu(io_text[3]); | ||
| 1224 | |||
| 1225 | /* pre whitening but absorb kw2*/ | ||
| 1226 | io[0] ^= CAMELLIA_SUBKEY_L(0); | ||
| 1227 | io[1] ^= CAMELLIA_SUBKEY_R(0); | ||
| 1228 | /* main iteration */ | ||
| 1229 | |||
| 1230 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
| 1231 | CAMELLIA_SUBKEY_L(2),CAMELLIA_SUBKEY_R(2), | ||
| 1232 | io[2],io[3],il,ir,t0,t1); | ||
| 1233 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
| 1234 | CAMELLIA_SUBKEY_L(3),CAMELLIA_SUBKEY_R(3), | ||
| 1235 | io[0],io[1],il,ir,t0,t1); | ||
| 1236 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
| 1237 | CAMELLIA_SUBKEY_L(4),CAMELLIA_SUBKEY_R(4), | ||
| 1238 | io[2],io[3],il,ir,t0,t1); | ||
| 1239 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
| 1240 | CAMELLIA_SUBKEY_L(5),CAMELLIA_SUBKEY_R(5), | ||
| 1241 | io[0],io[1],il,ir,t0,t1); | ||
| 1242 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
| 1243 | CAMELLIA_SUBKEY_L(6),CAMELLIA_SUBKEY_R(6), | ||
| 1244 | io[2],io[3],il,ir,t0,t1); | ||
| 1245 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
| 1246 | CAMELLIA_SUBKEY_L(7),CAMELLIA_SUBKEY_R(7), | ||
| 1247 | io[0],io[1],il,ir,t0,t1); | ||
| 1248 | |||
| 1249 | CAMELLIA_FLS(io[0],io[1],io[2],io[3], | ||
| 1250 | CAMELLIA_SUBKEY_L(8),CAMELLIA_SUBKEY_R(8), | ||
| 1251 | CAMELLIA_SUBKEY_L(9),CAMELLIA_SUBKEY_R(9), | ||
| 1252 | t0,t1,il,ir); | ||
| 1253 | |||
| 1254 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
| 1255 | CAMELLIA_SUBKEY_L(10),CAMELLIA_SUBKEY_R(10), | ||
| 1256 | io[2],io[3],il,ir,t0,t1); | ||
| 1257 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
| 1258 | CAMELLIA_SUBKEY_L(11),CAMELLIA_SUBKEY_R(11), | ||
| 1259 | io[0],io[1],il,ir,t0,t1); | ||
| 1260 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
| 1261 | CAMELLIA_SUBKEY_L(12),CAMELLIA_SUBKEY_R(12), | ||
| 1262 | io[2],io[3],il,ir,t0,t1); | ||
| 1263 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
| 1264 | CAMELLIA_SUBKEY_L(13),CAMELLIA_SUBKEY_R(13), | ||
| 1265 | io[0],io[1],il,ir,t0,t1); | ||
| 1266 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
| 1267 | CAMELLIA_SUBKEY_L(14),CAMELLIA_SUBKEY_R(14), | ||
| 1268 | io[2],io[3],il,ir,t0,t1); | ||
| 1269 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
| 1270 | CAMELLIA_SUBKEY_L(15),CAMELLIA_SUBKEY_R(15), | ||
| 1271 | io[0],io[1],il,ir,t0,t1); | ||
| 1272 | |||
| 1273 | CAMELLIA_FLS(io[0],io[1],io[2],io[3], | ||
| 1274 | CAMELLIA_SUBKEY_L(16),CAMELLIA_SUBKEY_R(16), | ||
| 1275 | CAMELLIA_SUBKEY_L(17),CAMELLIA_SUBKEY_R(17), | ||
| 1276 | t0,t1,il,ir); | ||
| 1277 | |||
| 1278 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
| 1279 | CAMELLIA_SUBKEY_L(18),CAMELLIA_SUBKEY_R(18), | ||
| 1280 | io[2],io[3],il,ir,t0,t1); | ||
| 1281 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
| 1282 | CAMELLIA_SUBKEY_L(19),CAMELLIA_SUBKEY_R(19), | ||
| 1283 | io[0],io[1],il,ir,t0,t1); | ||
| 1284 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
| 1285 | CAMELLIA_SUBKEY_L(20),CAMELLIA_SUBKEY_R(20), | ||
| 1286 | io[2],io[3],il,ir,t0,t1); | ||
| 1287 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
| 1288 | CAMELLIA_SUBKEY_L(21),CAMELLIA_SUBKEY_R(21), | ||
| 1289 | io[0],io[1],il,ir,t0,t1); | ||
| 1290 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
| 1291 | CAMELLIA_SUBKEY_L(22),CAMELLIA_SUBKEY_R(22), | ||
| 1292 | io[2],io[3],il,ir,t0,t1); | ||
| 1293 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
| 1294 | CAMELLIA_SUBKEY_L(23),CAMELLIA_SUBKEY_R(23), | ||
| 1295 | io[0],io[1],il,ir,t0,t1); | ||
| 1296 | |||
| 1297 | /* post whitening but kw4 */ | ||
| 1298 | io[2] ^= CAMELLIA_SUBKEY_L(24); | ||
| 1299 | io[3] ^= CAMELLIA_SUBKEY_R(24); | ||
| 1300 | |||
| 1301 | t0 = io[0]; | ||
| 1302 | t1 = io[1]; | ||
| 1303 | io[0] = io[2]; | ||
| 1304 | io[1] = io[3]; | ||
| 1305 | io[2] = t0; | ||
| 1306 | io[3] = t1; | ||
| 1307 | |||
| 1308 | io_text[0] = cpu_to_be32(io[0]); | ||
| 1309 | io_text[1] = cpu_to_be32(io[1]); | ||
| 1310 | io_text[2] = cpu_to_be32(io[2]); | ||
| 1311 | io_text[3] = cpu_to_be32(io[3]); | ||
| 1312 | |||
| 1313 | return; | ||
| 1314 | } | ||
| 1315 | |||
| 1316 | static void camellia_decrypt128(const u32 *subkey, __be32 *io_text) | ||
| 1317 | { | ||
| 1318 | u32 il,ir,t0,t1; /* temporary valiables */ | ||
| 1319 | |||
| 1320 | u32 io[4]; | ||
| 1321 | |||
| 1322 | io[0] = be32_to_cpu(io_text[0]); | ||
| 1323 | io[1] = be32_to_cpu(io_text[1]); | ||
| 1324 | io[2] = be32_to_cpu(io_text[2]); | ||
| 1325 | io[3] = be32_to_cpu(io_text[3]); | ||
| 1326 | |||
| 1327 | /* pre whitening but absorb kw2*/ | ||
| 1328 | io[0] ^= CAMELLIA_SUBKEY_L(24); | ||
| 1329 | io[1] ^= CAMELLIA_SUBKEY_R(24); | ||
| 1330 | |||
| 1331 | /* main iteration */ | ||
| 1332 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
| 1333 | CAMELLIA_SUBKEY_L(23),CAMELLIA_SUBKEY_R(23), | ||
| 1334 | io[2],io[3],il,ir,t0,t1); | ||
| 1335 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
| 1336 | CAMELLIA_SUBKEY_L(22),CAMELLIA_SUBKEY_R(22), | ||
| 1337 | io[0],io[1],il,ir,t0,t1); | ||
| 1338 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
| 1339 | CAMELLIA_SUBKEY_L(21),CAMELLIA_SUBKEY_R(21), | ||
| 1340 | io[2],io[3],il,ir,t0,t1); | ||
| 1341 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
| 1342 | CAMELLIA_SUBKEY_L(20),CAMELLIA_SUBKEY_R(20), | ||
| 1343 | io[0],io[1],il,ir,t0,t1); | ||
| 1344 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
| 1345 | CAMELLIA_SUBKEY_L(19),CAMELLIA_SUBKEY_R(19), | ||
| 1346 | io[2],io[3],il,ir,t0,t1); | ||
| 1347 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
| 1348 | CAMELLIA_SUBKEY_L(18),CAMELLIA_SUBKEY_R(18), | ||
| 1349 | io[0],io[1],il,ir,t0,t1); | ||
| 1350 | |||
| 1351 | CAMELLIA_FLS(io[0],io[1],io[2],io[3], | ||
| 1352 | CAMELLIA_SUBKEY_L(17),CAMELLIA_SUBKEY_R(17), | ||
| 1353 | CAMELLIA_SUBKEY_L(16),CAMELLIA_SUBKEY_R(16), | ||
| 1354 | t0,t1,il,ir); | ||
| 1355 | |||
| 1356 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
| 1357 | CAMELLIA_SUBKEY_L(15),CAMELLIA_SUBKEY_R(15), | ||
| 1358 | io[2],io[3],il,ir,t0,t1); | ||
| 1359 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
| 1360 | CAMELLIA_SUBKEY_L(14),CAMELLIA_SUBKEY_R(14), | ||
| 1361 | io[0],io[1],il,ir,t0,t1); | ||
| 1362 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
| 1363 | CAMELLIA_SUBKEY_L(13),CAMELLIA_SUBKEY_R(13), | ||
| 1364 | io[2],io[3],il,ir,t0,t1); | ||
| 1365 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
| 1366 | CAMELLIA_SUBKEY_L(12),CAMELLIA_SUBKEY_R(12), | ||
| 1367 | io[0],io[1],il,ir,t0,t1); | ||
| 1368 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
| 1369 | CAMELLIA_SUBKEY_L(11),CAMELLIA_SUBKEY_R(11), | ||
| 1370 | io[2],io[3],il,ir,t0,t1); | ||
| 1371 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
| 1372 | CAMELLIA_SUBKEY_L(10),CAMELLIA_SUBKEY_R(10), | ||
| 1373 | io[0],io[1],il,ir,t0,t1); | ||
| 1374 | |||
| 1375 | CAMELLIA_FLS(io[0],io[1],io[2],io[3], | ||
| 1376 | CAMELLIA_SUBKEY_L(9),CAMELLIA_SUBKEY_R(9), | ||
| 1377 | CAMELLIA_SUBKEY_L(8),CAMELLIA_SUBKEY_R(8), | ||
| 1378 | t0,t1,il,ir); | ||
| 1379 | |||
| 1380 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
| 1381 | CAMELLIA_SUBKEY_L(7),CAMELLIA_SUBKEY_R(7), | ||
| 1382 | io[2],io[3],il,ir,t0,t1); | ||
| 1383 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
| 1384 | CAMELLIA_SUBKEY_L(6),CAMELLIA_SUBKEY_R(6), | ||
| 1385 | io[0],io[1],il,ir,t0,t1); | ||
| 1386 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
| 1387 | CAMELLIA_SUBKEY_L(5),CAMELLIA_SUBKEY_R(5), | ||
| 1388 | io[2],io[3],il,ir,t0,t1); | ||
| 1389 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
| 1390 | CAMELLIA_SUBKEY_L(4),CAMELLIA_SUBKEY_R(4), | ||
| 1391 | io[0],io[1],il,ir,t0,t1); | ||
| 1392 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
| 1393 | CAMELLIA_SUBKEY_L(3),CAMELLIA_SUBKEY_R(3), | ||
| 1394 | io[2],io[3],il,ir,t0,t1); | ||
| 1395 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
| 1396 | CAMELLIA_SUBKEY_L(2),CAMELLIA_SUBKEY_R(2), | ||
| 1397 | io[0],io[1],il,ir,t0,t1); | ||
| 1398 | |||
| 1399 | /* post whitening but kw4 */ | ||
| 1400 | io[2] ^= CAMELLIA_SUBKEY_L(0); | ||
| 1401 | io[3] ^= CAMELLIA_SUBKEY_R(0); | ||
| 1402 | |||
| 1403 | t0 = io[0]; | ||
| 1404 | t1 = io[1]; | ||
| 1405 | io[0] = io[2]; | ||
| 1406 | io[1] = io[3]; | ||
| 1407 | io[2] = t0; | ||
| 1408 | io[3] = t1; | ||
| 1409 | |||
| 1410 | io_text[0] = cpu_to_be32(io[0]); | ||
| 1411 | io_text[1] = cpu_to_be32(io[1]); | ||
| 1412 | io_text[2] = cpu_to_be32(io[2]); | ||
| 1413 | io_text[3] = cpu_to_be32(io[3]); | ||
| 1414 | |||
| 1415 | return; | ||
| 1416 | } | ||
| 1417 | |||
| 1418 | |||
| 1419 | /** | ||
| 1420 | * stuff for 192 and 256bit encryption/decryption | ||
| 1421 | */ | ||
| 1422 | static void camellia_encrypt256(const u32 *subkey, __be32 *io_text) | ||
| 1423 | { | ||
| 1424 | u32 il,ir,t0,t1; /* temporary valiables */ | ||
| 1425 | |||
| 1426 | u32 io[4]; | ||
| 1427 | |||
| 1428 | io[0] = be32_to_cpu(io_text[0]); | ||
| 1429 | io[1] = be32_to_cpu(io_text[1]); | ||
| 1430 | io[2] = be32_to_cpu(io_text[2]); | ||
| 1431 | io[3] = be32_to_cpu(io_text[3]); | ||
| 1432 | |||
| 1433 | /* pre whitening but absorb kw2*/ | ||
| 1434 | io[0] ^= CAMELLIA_SUBKEY_L(0); | ||
| 1435 | io[1] ^= CAMELLIA_SUBKEY_R(0); | ||
| 1436 | |||
| 1437 | /* main iteration */ | ||
| 1438 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
| 1439 | CAMELLIA_SUBKEY_L(2),CAMELLIA_SUBKEY_R(2), | ||
| 1440 | io[2],io[3],il,ir,t0,t1); | ||
| 1441 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
| 1442 | CAMELLIA_SUBKEY_L(3),CAMELLIA_SUBKEY_R(3), | ||
| 1443 | io[0],io[1],il,ir,t0,t1); | ||
| 1444 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
| 1445 | CAMELLIA_SUBKEY_L(4),CAMELLIA_SUBKEY_R(4), | ||
| 1446 | io[2],io[3],il,ir,t0,t1); | ||
| 1447 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
| 1448 | CAMELLIA_SUBKEY_L(5),CAMELLIA_SUBKEY_R(5), | ||
| 1449 | io[0],io[1],il,ir,t0,t1); | ||
| 1450 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
| 1451 | CAMELLIA_SUBKEY_L(6),CAMELLIA_SUBKEY_R(6), | ||
| 1452 | io[2],io[3],il,ir,t0,t1); | ||
| 1453 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
| 1454 | CAMELLIA_SUBKEY_L(7),CAMELLIA_SUBKEY_R(7), | ||
| 1455 | io[0],io[1],il,ir,t0,t1); | ||
| 1456 | |||
| 1457 | CAMELLIA_FLS(io[0],io[1],io[2],io[3], | ||
| 1458 | CAMELLIA_SUBKEY_L(8),CAMELLIA_SUBKEY_R(8), | ||
| 1459 | CAMELLIA_SUBKEY_L(9),CAMELLIA_SUBKEY_R(9), | ||
| 1460 | t0,t1,il,ir); | ||
| 1461 | |||
| 1462 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
| 1463 | CAMELLIA_SUBKEY_L(10),CAMELLIA_SUBKEY_R(10), | ||
| 1464 | io[2],io[3],il,ir,t0,t1); | ||
| 1465 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
| 1466 | CAMELLIA_SUBKEY_L(11),CAMELLIA_SUBKEY_R(11), | ||
| 1467 | io[0],io[1],il,ir,t0,t1); | ||
| 1468 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
| 1469 | CAMELLIA_SUBKEY_L(12),CAMELLIA_SUBKEY_R(12), | ||
| 1470 | io[2],io[3],il,ir,t0,t1); | ||
| 1471 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
| 1472 | CAMELLIA_SUBKEY_L(13),CAMELLIA_SUBKEY_R(13), | ||
| 1473 | io[0],io[1],il,ir,t0,t1); | ||
| 1474 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
| 1475 | CAMELLIA_SUBKEY_L(14),CAMELLIA_SUBKEY_R(14), | ||
| 1476 | io[2],io[3],il,ir,t0,t1); | ||
| 1477 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
| 1478 | CAMELLIA_SUBKEY_L(15),CAMELLIA_SUBKEY_R(15), | ||
| 1479 | io[0],io[1],il,ir,t0,t1); | ||
| 1480 | |||
| 1481 | CAMELLIA_FLS(io[0],io[1],io[2],io[3], | ||
| 1482 | CAMELLIA_SUBKEY_L(16),CAMELLIA_SUBKEY_R(16), | ||
| 1483 | CAMELLIA_SUBKEY_L(17),CAMELLIA_SUBKEY_R(17), | ||
| 1484 | t0,t1,il,ir); | ||
| 1485 | |||
| 1486 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
| 1487 | CAMELLIA_SUBKEY_L(18),CAMELLIA_SUBKEY_R(18), | ||
| 1488 | io[2],io[3],il,ir,t0,t1); | ||
| 1489 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
| 1490 | CAMELLIA_SUBKEY_L(19),CAMELLIA_SUBKEY_R(19), | ||
| 1491 | io[0],io[1],il,ir,t0,t1); | ||
| 1492 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
| 1493 | CAMELLIA_SUBKEY_L(20),CAMELLIA_SUBKEY_R(20), | ||
| 1494 | io[2],io[3],il,ir,t0,t1); | ||
| 1495 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
| 1496 | CAMELLIA_SUBKEY_L(21),CAMELLIA_SUBKEY_R(21), | ||
| 1497 | io[0],io[1],il,ir,t0,t1); | ||
| 1498 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
| 1499 | CAMELLIA_SUBKEY_L(22),CAMELLIA_SUBKEY_R(22), | ||
| 1500 | io[2],io[3],il,ir,t0,t1); | ||
| 1501 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
| 1502 | CAMELLIA_SUBKEY_L(23),CAMELLIA_SUBKEY_R(23), | ||
| 1503 | io[0],io[1],il,ir,t0,t1); | ||
| 1504 | |||
| 1505 | CAMELLIA_FLS(io[0],io[1],io[2],io[3], | ||
| 1506 | CAMELLIA_SUBKEY_L(24),CAMELLIA_SUBKEY_R(24), | ||
| 1507 | CAMELLIA_SUBKEY_L(25),CAMELLIA_SUBKEY_R(25), | ||
| 1508 | t0,t1,il,ir); | ||
| 1509 | |||
| 1510 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
| 1511 | CAMELLIA_SUBKEY_L(26),CAMELLIA_SUBKEY_R(26), | ||
| 1512 | io[2],io[3],il,ir,t0,t1); | ||
| 1513 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
| 1514 | CAMELLIA_SUBKEY_L(27),CAMELLIA_SUBKEY_R(27), | ||
| 1515 | io[0],io[1],il,ir,t0,t1); | ||
| 1516 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
| 1517 | CAMELLIA_SUBKEY_L(28),CAMELLIA_SUBKEY_R(28), | ||
| 1518 | io[2],io[3],il,ir,t0,t1); | ||
| 1519 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
| 1520 | CAMELLIA_SUBKEY_L(29),CAMELLIA_SUBKEY_R(29), | ||
| 1521 | io[0],io[1],il,ir,t0,t1); | ||
| 1522 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
| 1523 | CAMELLIA_SUBKEY_L(30),CAMELLIA_SUBKEY_R(30), | ||
| 1524 | io[2],io[3],il,ir,t0,t1); | ||
| 1525 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
| 1526 | CAMELLIA_SUBKEY_L(31),CAMELLIA_SUBKEY_R(31), | ||
| 1527 | io[0],io[1],il,ir,t0,t1); | ||
| 1528 | |||
| 1529 | /* post whitening but kw4 */ | ||
| 1530 | io[2] ^= CAMELLIA_SUBKEY_L(32); | ||
| 1531 | io[3] ^= CAMELLIA_SUBKEY_R(32); | ||
| 1532 | |||
| 1533 | t0 = io[0]; | ||
| 1534 | t1 = io[1]; | ||
| 1535 | io[0] = io[2]; | ||
| 1536 | io[1] = io[3]; | ||
| 1537 | io[2] = t0; | ||
| 1538 | io[3] = t1; | ||
| 1539 | |||
| 1540 | io_text[0] = cpu_to_be32(io[0]); | ||
| 1541 | io_text[1] = cpu_to_be32(io[1]); | ||
| 1542 | io_text[2] = cpu_to_be32(io[2]); | ||
| 1543 | io_text[3] = cpu_to_be32(io[3]); | ||
| 1544 | |||
| 1545 | return; | ||
| 1546 | } | ||
| 1547 | |||
| 1548 | |||
| 1549 | static void camellia_decrypt256(const u32 *subkey, __be32 *io_text) | ||
| 1550 | { | ||
| 1551 | u32 il,ir,t0,t1; /* temporary valiables */ | ||
| 1552 | |||
| 1553 | u32 io[4]; | ||
| 1554 | |||
| 1555 | io[0] = be32_to_cpu(io_text[0]); | ||
| 1556 | io[1] = be32_to_cpu(io_text[1]); | ||
| 1557 | io[2] = be32_to_cpu(io_text[2]); | ||
| 1558 | io[3] = be32_to_cpu(io_text[3]); | ||
| 1559 | |||
| 1560 | /* pre whitening but absorb kw2*/ | ||
| 1561 | io[0] ^= CAMELLIA_SUBKEY_L(32); | ||
| 1562 | io[1] ^= CAMELLIA_SUBKEY_R(32); | ||
| 1563 | |||
| 1564 | /* main iteration */ | ||
| 1565 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
| 1566 | CAMELLIA_SUBKEY_L(31),CAMELLIA_SUBKEY_R(31), | ||
| 1567 | io[2],io[3],il,ir,t0,t1); | ||
| 1568 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
| 1569 | CAMELLIA_SUBKEY_L(30),CAMELLIA_SUBKEY_R(30), | ||
| 1570 | io[0],io[1],il,ir,t0,t1); | ||
| 1571 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
| 1572 | CAMELLIA_SUBKEY_L(29),CAMELLIA_SUBKEY_R(29), | ||
| 1573 | io[2],io[3],il,ir,t0,t1); | ||
| 1574 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
| 1575 | CAMELLIA_SUBKEY_L(28),CAMELLIA_SUBKEY_R(28), | ||
| 1576 | io[0],io[1],il,ir,t0,t1); | ||
| 1577 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
| 1578 | CAMELLIA_SUBKEY_L(27),CAMELLIA_SUBKEY_R(27), | ||
| 1579 | io[2],io[3],il,ir,t0,t1); | ||
| 1580 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
| 1581 | CAMELLIA_SUBKEY_L(26),CAMELLIA_SUBKEY_R(26), | ||
| 1582 | io[0],io[1],il,ir,t0,t1); | ||
| 1583 | |||
| 1584 | CAMELLIA_FLS(io[0],io[1],io[2],io[3], | ||
| 1585 | CAMELLIA_SUBKEY_L(25),CAMELLIA_SUBKEY_R(25), | ||
| 1586 | CAMELLIA_SUBKEY_L(24),CAMELLIA_SUBKEY_R(24), | ||
| 1587 | t0,t1,il,ir); | ||
| 1588 | |||
| 1589 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
| 1590 | CAMELLIA_SUBKEY_L(23),CAMELLIA_SUBKEY_R(23), | ||
| 1591 | io[2],io[3],il,ir,t0,t1); | ||
| 1592 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
| 1593 | CAMELLIA_SUBKEY_L(22),CAMELLIA_SUBKEY_R(22), | ||
| 1594 | io[0],io[1],il,ir,t0,t1); | ||
| 1595 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
| 1596 | CAMELLIA_SUBKEY_L(21),CAMELLIA_SUBKEY_R(21), | ||
| 1597 | io[2],io[3],il,ir,t0,t1); | ||
| 1598 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
| 1599 | CAMELLIA_SUBKEY_L(20),CAMELLIA_SUBKEY_R(20), | ||
| 1600 | io[0],io[1],il,ir,t0,t1); | ||
| 1601 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
| 1602 | CAMELLIA_SUBKEY_L(19),CAMELLIA_SUBKEY_R(19), | ||
| 1603 | io[2],io[3],il,ir,t0,t1); | ||
| 1604 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
| 1605 | CAMELLIA_SUBKEY_L(18),CAMELLIA_SUBKEY_R(18), | ||
| 1606 | io[0],io[1],il,ir,t0,t1); | ||
| 1607 | |||
| 1608 | CAMELLIA_FLS(io[0],io[1],io[2],io[3], | ||
| 1609 | CAMELLIA_SUBKEY_L(17),CAMELLIA_SUBKEY_R(17), | ||
| 1610 | CAMELLIA_SUBKEY_L(16),CAMELLIA_SUBKEY_R(16), | ||
| 1611 | t0,t1,il,ir); | ||
| 1612 | |||
| 1613 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
| 1614 | CAMELLIA_SUBKEY_L(15),CAMELLIA_SUBKEY_R(15), | ||
| 1615 | io[2],io[3],il,ir,t0,t1); | ||
| 1616 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
| 1617 | CAMELLIA_SUBKEY_L(14),CAMELLIA_SUBKEY_R(14), | ||
| 1618 | io[0],io[1],il,ir,t0,t1); | ||
| 1619 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
| 1620 | CAMELLIA_SUBKEY_L(13),CAMELLIA_SUBKEY_R(13), | ||
| 1621 | io[2],io[3],il,ir,t0,t1); | ||
| 1622 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
| 1623 | CAMELLIA_SUBKEY_L(12),CAMELLIA_SUBKEY_R(12), | ||
| 1624 | io[0],io[1],il,ir,t0,t1); | ||
| 1625 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
| 1626 | CAMELLIA_SUBKEY_L(11),CAMELLIA_SUBKEY_R(11), | ||
| 1627 | io[2],io[3],il,ir,t0,t1); | ||
| 1628 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
| 1629 | CAMELLIA_SUBKEY_L(10),CAMELLIA_SUBKEY_R(10), | ||
| 1630 | io[0],io[1],il,ir,t0,t1); | ||
| 1631 | |||
| 1632 | CAMELLIA_FLS(io[0],io[1],io[2],io[3], | ||
| 1633 | CAMELLIA_SUBKEY_L(9),CAMELLIA_SUBKEY_R(9), | ||
| 1634 | CAMELLIA_SUBKEY_L(8),CAMELLIA_SUBKEY_R(8), | ||
| 1635 | t0,t1,il,ir); | ||
| 1636 | |||
| 1637 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
| 1638 | CAMELLIA_SUBKEY_L(7),CAMELLIA_SUBKEY_R(7), | ||
| 1639 | io[2],io[3],il,ir,t0,t1); | ||
| 1640 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
| 1641 | CAMELLIA_SUBKEY_L(6),CAMELLIA_SUBKEY_R(6), | ||
| 1642 | io[0],io[1],il,ir,t0,t1); | ||
| 1643 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
| 1644 | CAMELLIA_SUBKEY_L(5),CAMELLIA_SUBKEY_R(5), | ||
| 1645 | io[2],io[3],il,ir,t0,t1); | ||
| 1646 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
| 1647 | CAMELLIA_SUBKEY_L(4),CAMELLIA_SUBKEY_R(4), | ||
| 1648 | io[0],io[1],il,ir,t0,t1); | ||
| 1649 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
| 1650 | CAMELLIA_SUBKEY_L(3),CAMELLIA_SUBKEY_R(3), | ||
| 1651 | io[2],io[3],il,ir,t0,t1); | ||
| 1652 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
| 1653 | CAMELLIA_SUBKEY_L(2),CAMELLIA_SUBKEY_R(2), | ||
| 1654 | io[0],io[1],il,ir,t0,t1); | ||
| 1655 | |||
| 1656 | /* post whitening but kw4 */ | ||
| 1657 | io[2] ^= CAMELLIA_SUBKEY_L(0); | ||
| 1658 | io[3] ^= CAMELLIA_SUBKEY_R(0); | ||
| 1659 | |||
| 1660 | t0 = io[0]; | ||
| 1661 | t1 = io[1]; | ||
| 1662 | io[0] = io[2]; | ||
| 1663 | io[1] = io[3]; | ||
| 1664 | io[2] = t0; | ||
| 1665 | io[3] = t1; | ||
| 1666 | |||
| 1667 | io_text[0] = cpu_to_be32(io[0]); | ||
| 1668 | io_text[1] = cpu_to_be32(io[1]); | ||
| 1669 | io_text[2] = cpu_to_be32(io[2]); | ||
| 1670 | io_text[3] = cpu_to_be32(io[3]); | ||
| 1671 | |||
| 1672 | return; | ||
| 1673 | } | ||
| 1674 | |||
| 1675 | |||
| 1676 | static int | ||
| 1677 | camellia_set_key(struct crypto_tfm *tfm, const u8 *in_key, | ||
| 1678 | unsigned int key_len) | ||
| 1679 | { | ||
| 1680 | struct camellia_ctx *cctx = crypto_tfm_ctx(tfm); | ||
| 1681 | const unsigned char *key = (const unsigned char *)in_key; | ||
| 1682 | u32 *flags = &tfm->crt_flags; | ||
| 1683 | |||
| 1684 | if (key_len != 16 && key_len != 24 && key_len != 32) { | ||
| 1685 | *flags |= CRYPTO_TFM_RES_BAD_KEY_LEN; | ||
| 1686 | return -EINVAL; | ||
| 1687 | } | ||
| 1688 | |||
| 1689 | cctx->key_length = key_len; | ||
| 1690 | |||
| 1691 | switch(key_len) { | ||
| 1692 | case 16: | ||
| 1693 | camellia_setup128(key, cctx->key_table); | ||
| 1694 | break; | ||
| 1695 | case 24: | ||
| 1696 | camellia_setup192(key, cctx->key_table); | ||
| 1697 | break; | ||
| 1698 | case 32: | ||
| 1699 | camellia_setup256(key, cctx->key_table); | ||
| 1700 | break; | ||
| 1701 | default: | ||
| 1702 | break; | ||
| 1703 | } | ||
| 1704 | |||
| 1705 | return 0; | ||
| 1706 | } | ||
| 1707 | |||
| 1708 | |||
| 1709 | static void camellia_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) | ||
| 1710 | { | ||
| 1711 | const struct camellia_ctx *cctx = crypto_tfm_ctx(tfm); | ||
| 1712 | const __be32 *src = (const __be32 *)in; | ||
| 1713 | __be32 *dst = (__be32 *)out; | ||
| 1714 | |||
| 1715 | __be32 tmp[4]; | ||
| 1716 | |||
| 1717 | memcpy(tmp, src, CAMELLIA_BLOCK_SIZE); | ||
| 1718 | |||
| 1719 | switch (cctx->key_length) { | ||
| 1720 | case 16: | ||
| 1721 | camellia_encrypt128(cctx->key_table, tmp); | ||
| 1722 | break; | ||
| 1723 | case 24: | ||
| 1724 | /* fall through */ | ||
| 1725 | case 32: | ||
| 1726 | camellia_encrypt256(cctx->key_table, tmp); | ||
| 1727 | break; | ||
| 1728 | default: | ||
| 1729 | break; | ||
| 1730 | } | ||
| 1731 | |||
| 1732 | memcpy(dst, tmp, CAMELLIA_BLOCK_SIZE); | ||
| 1733 | } | ||
| 1734 | |||
| 1735 | |||
| 1736 | static void camellia_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) | ||
| 1737 | { | ||
| 1738 | const struct camellia_ctx *cctx = crypto_tfm_ctx(tfm); | ||
| 1739 | const __be32 *src = (const __be32 *)in; | ||
| 1740 | __be32 *dst = (__be32 *)out; | ||
| 1741 | |||
| 1742 | __be32 tmp[4]; | ||
| 1743 | |||
| 1744 | memcpy(tmp, src, CAMELLIA_BLOCK_SIZE); | ||
| 1745 | |||
| 1746 | switch (cctx->key_length) { | ||
| 1747 | case 16: | ||
| 1748 | camellia_decrypt128(cctx->key_table, tmp); | ||
| 1749 | break; | ||
| 1750 | case 24: | ||
| 1751 | /* fall through */ | ||
| 1752 | case 32: | ||
| 1753 | camellia_decrypt256(cctx->key_table, tmp); | ||
| 1754 | break; | ||
| 1755 | default: | ||
| 1756 | break; | ||
| 1757 | } | ||
| 1758 | |||
| 1759 | memcpy(dst, tmp, CAMELLIA_BLOCK_SIZE); | ||
| 1760 | } | ||
| 1761 | |||
| 1762 | |||
| 1763 | static struct crypto_alg camellia_alg = { | ||
| 1764 | .cra_name = "camellia", | ||
| 1765 | .cra_driver_name = "camellia-generic", | ||
| 1766 | .cra_priority = 100, | ||
| 1767 | .cra_flags = CRYPTO_ALG_TYPE_CIPHER, | ||
| 1768 | .cra_blocksize = CAMELLIA_BLOCK_SIZE, | ||
| 1769 | .cra_ctxsize = sizeof(struct camellia_ctx), | ||
| 1770 | .cra_alignmask = 3, | ||
| 1771 | .cra_module = THIS_MODULE, | ||
| 1772 | .cra_list = LIST_HEAD_INIT(camellia_alg.cra_list), | ||
| 1773 | .cra_u = { | ||
| 1774 | .cipher = { | ||
| 1775 | .cia_min_keysize = CAMELLIA_MIN_KEY_SIZE, | ||
| 1776 | .cia_max_keysize = CAMELLIA_MAX_KEY_SIZE, | ||
| 1777 | .cia_setkey = camellia_set_key, | ||
| 1778 | .cia_encrypt = camellia_encrypt, | ||
| 1779 | .cia_decrypt = camellia_decrypt | ||
| 1780 | } | ||
| 1781 | } | ||
| 1782 | }; | ||
| 1783 | |||
| 1784 | static int __init camellia_init(void) | ||
| 1785 | { | ||
| 1786 | return crypto_register_alg(&camellia_alg); | ||
| 1787 | } | ||
| 1788 | |||
| 1789 | |||
| 1790 | static void __exit camellia_fini(void) | ||
| 1791 | { | ||
| 1792 | crypto_unregister_alg(&camellia_alg); | ||
| 1793 | } | ||
| 1794 | |||
| 1795 | |||
| 1796 | module_init(camellia_init); | ||
| 1797 | module_exit(camellia_fini); | ||
| 1798 | |||
| 1799 | |||
| 1800 | MODULE_DESCRIPTION("Camellia Cipher Algorithm"); | ||
| 1801 | MODULE_LICENSE("GPL"); | ||
diff --git a/crypto/cbc.c b/crypto/cbc.c index f5542b4db387..136fea7e7000 100644 --- a/crypto/cbc.c +++ b/crypto/cbc.c | |||
| @@ -243,6 +243,7 @@ static int crypto_cbc_init_tfm(struct crypto_tfm *tfm) | |||
| 243 | struct crypto_instance *inst = (void *)tfm->__crt_alg; | 243 | struct crypto_instance *inst = (void *)tfm->__crt_alg; |
| 244 | struct crypto_spawn *spawn = crypto_instance_ctx(inst); | 244 | struct crypto_spawn *spawn = crypto_instance_ctx(inst); |
| 245 | struct crypto_cbc_ctx *ctx = crypto_tfm_ctx(tfm); | 245 | struct crypto_cbc_ctx *ctx = crypto_tfm_ctx(tfm); |
| 246 | struct crypto_cipher *cipher; | ||
| 246 | 247 | ||
| 247 | switch (crypto_tfm_alg_blocksize(tfm)) { | 248 | switch (crypto_tfm_alg_blocksize(tfm)) { |
| 248 | case 8: | 249 | case 8: |
| @@ -260,11 +261,11 @@ static int crypto_cbc_init_tfm(struct crypto_tfm *tfm) | |||
| 260 | ctx->xor = xor_quad; | 261 | ctx->xor = xor_quad; |
| 261 | } | 262 | } |
| 262 | 263 | ||
| 263 | tfm = crypto_spawn_tfm(spawn); | 264 | cipher = crypto_spawn_cipher(spawn); |
| 264 | if (IS_ERR(tfm)) | 265 | if (IS_ERR(cipher)) |
| 265 | return PTR_ERR(tfm); | 266 | return PTR_ERR(cipher); |
| 266 | 267 | ||
| 267 | ctx->child = crypto_cipher_cast(tfm); | 268 | ctx->child = cipher; |
| 268 | return 0; | 269 | return 0; |
| 269 | } | 270 | } |
| 270 | 271 | ||
diff --git a/crypto/cipher.c b/crypto/cipher.c index 9e03701cfdcc..333aab2f0277 100644 --- a/crypto/cipher.c +++ b/crypto/cipher.c | |||
| @@ -12,274 +12,13 @@ | |||
| 12 | * any later version. | 12 | * any later version. |
| 13 | * | 13 | * |
| 14 | */ | 14 | */ |
| 15 | #include <linux/compiler.h> | 15 | |
| 16 | #include <linux/kernel.h> | 16 | #include <linux/kernel.h> |
| 17 | #include <linux/crypto.h> | 17 | #include <linux/crypto.h> |
| 18 | #include <linux/errno.h> | 18 | #include <linux/errno.h> |
| 19 | #include <linux/mm.h> | 19 | #include <linux/scatterlist.h> |
| 20 | #include <linux/slab.h> | ||
| 21 | #include <linux/string.h> | 20 | #include <linux/string.h> |
| 22 | #include <asm/scatterlist.h> | ||
| 23 | #include "internal.h" | 21 | #include "internal.h" |
| 24 | #include "scatterwalk.h" | ||
| 25 | |||
| 26 | struct cipher_alg_compat { | ||
| 27 | unsigned int cia_min_keysize; | ||
| 28 | unsigned int cia_max_keysize; | ||
| 29 | int (*cia_setkey)(struct crypto_tfm *tfm, const u8 *key, | ||
| 30 | unsigned int keylen); | ||
| 31 | void (*cia_encrypt)(struct crypto_tfm *tfm, u8 *dst, const u8 *src); | ||
| 32 | void (*cia_decrypt)(struct crypto_tfm *tfm, u8 *dst, const u8 *src); | ||
| 33 | |||
| 34 | unsigned int (*cia_encrypt_ecb)(const struct cipher_desc *desc, | ||
| 35 | u8 *dst, const u8 *src, | ||
| 36 | unsigned int nbytes); | ||
| 37 | unsigned int (*cia_decrypt_ecb)(const struct cipher_desc *desc, | ||
| 38 | u8 *dst, const u8 *src, | ||
| 39 | unsigned int nbytes); | ||
| 40 | unsigned int (*cia_encrypt_cbc)(const struct cipher_desc *desc, | ||
| 41 | u8 *dst, const u8 *src, | ||
| 42 | unsigned int nbytes); | ||
| 43 | unsigned int (*cia_decrypt_cbc)(const struct cipher_desc *desc, | ||
| 44 | u8 *dst, const u8 *src, | ||
| 45 | unsigned int nbytes); | ||
| 46 | }; | ||
| 47 | |||
| 48 | static inline void xor_64(u8 *a, const u8 *b) | ||
| 49 | { | ||
| 50 | ((u32 *)a)[0] ^= ((u32 *)b)[0]; | ||
| 51 | ((u32 *)a)[1] ^= ((u32 *)b)[1]; | ||
| 52 | } | ||
| 53 | |||
| 54 | static inline void xor_128(u8 *a, const u8 *b) | ||
| 55 | { | ||
| 56 | ((u32 *)a)[0] ^= ((u32 *)b)[0]; | ||
| 57 | ((u32 *)a)[1] ^= ((u32 *)b)[1]; | ||
| 58 | ((u32 *)a)[2] ^= ((u32 *)b)[2]; | ||
| 59 | ((u32 *)a)[3] ^= ((u32 *)b)[3]; | ||
| 60 | } | ||
| 61 | |||
| 62 | static unsigned int crypt_slow(const struct cipher_desc *desc, | ||
| 63 | struct scatter_walk *in, | ||
| 64 | struct scatter_walk *out, unsigned int bsize) | ||
| 65 | { | ||
| 66 | unsigned long alignmask = crypto_tfm_alg_alignmask(desc->tfm); | ||
| 67 | u8 buffer[bsize * 2 + alignmask]; | ||
| 68 | u8 *src = (u8 *)ALIGN((unsigned long)buffer, alignmask + 1); | ||
| 69 | u8 *dst = src + bsize; | ||
| 70 | |||
| 71 | scatterwalk_copychunks(src, in, bsize, 0); | ||
| 72 | desc->prfn(desc, dst, src, bsize); | ||
| 73 | scatterwalk_copychunks(dst, out, bsize, 1); | ||
| 74 | |||
| 75 | return bsize; | ||
| 76 | } | ||
| 77 | |||
| 78 | static inline unsigned int crypt_fast(const struct cipher_desc *desc, | ||
| 79 | struct scatter_walk *in, | ||
| 80 | struct scatter_walk *out, | ||
| 81 | unsigned int nbytes, u8 *tmp) | ||
| 82 | { | ||
| 83 | u8 *src, *dst; | ||
| 84 | u8 *real_src, *real_dst; | ||
| 85 | |||
| 86 | real_src = scatterwalk_map(in, 0); | ||
| 87 | real_dst = scatterwalk_map(out, 1); | ||
| 88 | |||
| 89 | src = real_src; | ||
| 90 | dst = scatterwalk_samebuf(in, out) ? src : real_dst; | ||
| 91 | |||
| 92 | if (tmp) { | ||
| 93 | memcpy(tmp, src, nbytes); | ||
| 94 | src = tmp; | ||
| 95 | dst = tmp; | ||
| 96 | } | ||
| 97 | |||
| 98 | nbytes = desc->prfn(desc, dst, src, nbytes); | ||
| 99 | |||
| 100 | if (tmp) | ||
| 101 | memcpy(real_dst, tmp, nbytes); | ||
| 102 | |||
| 103 | scatterwalk_unmap(real_src, 0); | ||
| 104 | scatterwalk_unmap(real_dst, 1); | ||
| 105 | |||
| 106 | scatterwalk_advance(in, nbytes); | ||
| 107 | scatterwalk_advance(out, nbytes); | ||
| 108 | |||
| 109 | return nbytes; | ||
| 110 | } | ||
| 111 | |||
| 112 | /* | ||
| 113 | * Generic encrypt/decrypt wrapper for ciphers, handles operations across | ||
| 114 | * multiple page boundaries by using temporary blocks. In user context, | ||
| 115 | * the kernel is given a chance to schedule us once per page. | ||
| 116 | */ | ||
| 117 | static int crypt(const struct cipher_desc *desc, | ||
| 118 | struct scatterlist *dst, | ||
| 119 | struct scatterlist *src, | ||
| 120 | unsigned int nbytes) | ||
| 121 | { | ||
| 122 | struct scatter_walk walk_in, walk_out; | ||
| 123 | struct crypto_tfm *tfm = desc->tfm; | ||
| 124 | const unsigned int bsize = crypto_tfm_alg_blocksize(tfm); | ||
| 125 | unsigned int alignmask = crypto_tfm_alg_alignmask(tfm); | ||
| 126 | unsigned long buffer = 0; | ||
| 127 | |||
| 128 | if (!nbytes) | ||
| 129 | return 0; | ||
| 130 | |||
| 131 | if (nbytes % bsize) { | ||
| 132 | tfm->crt_flags |= CRYPTO_TFM_RES_BAD_BLOCK_LEN; | ||
| 133 | return -EINVAL; | ||
| 134 | } | ||
| 135 | |||
| 136 | scatterwalk_start(&walk_in, src); | ||
| 137 | scatterwalk_start(&walk_out, dst); | ||
| 138 | |||
| 139 | for(;;) { | ||
| 140 | unsigned int n = nbytes; | ||
| 141 | u8 *tmp = NULL; | ||
| 142 | |||
| 143 | if (!scatterwalk_aligned(&walk_in, alignmask) || | ||
| 144 | !scatterwalk_aligned(&walk_out, alignmask)) { | ||
| 145 | if (!buffer) { | ||
| 146 | buffer = __get_free_page(GFP_ATOMIC); | ||
| 147 | if (!buffer) | ||
| 148 | n = 0; | ||
| 149 | } | ||
| 150 | tmp = (u8 *)buffer; | ||
| 151 | } | ||
| 152 | |||
| 153 | n = scatterwalk_clamp(&walk_in, n); | ||
| 154 | n = scatterwalk_clamp(&walk_out, n); | ||
| 155 | |||
| 156 | if (likely(n >= bsize)) | ||
| 157 | n = crypt_fast(desc, &walk_in, &walk_out, n, tmp); | ||
| 158 | else | ||
| 159 | n = crypt_slow(desc, &walk_in, &walk_out, bsize); | ||
| 160 | |||
| 161 | nbytes -= n; | ||
| 162 | |||
| 163 | scatterwalk_done(&walk_in, 0, nbytes); | ||
| 164 | scatterwalk_done(&walk_out, 1, nbytes); | ||
| 165 | |||
| 166 | if (!nbytes) | ||
| 167 | break; | ||
| 168 | |||
| 169 | crypto_yield(tfm->crt_flags); | ||
| 170 | } | ||
| 171 | |||
| 172 | if (buffer) | ||
| 173 | free_page(buffer); | ||
| 174 | |||
| 175 | return 0; | ||
| 176 | } | ||
| 177 | |||
| 178 | static int crypt_iv_unaligned(struct cipher_desc *desc, | ||
| 179 | struct scatterlist *dst, | ||
| 180 | struct scatterlist *src, | ||
| 181 | unsigned int nbytes) | ||
| 182 | { | ||
| 183 | struct crypto_tfm *tfm = desc->tfm; | ||
| 184 | unsigned long alignmask = crypto_tfm_alg_alignmask(tfm); | ||
| 185 | u8 *iv = desc->info; | ||
| 186 | |||
| 187 | if (unlikely(((unsigned long)iv & alignmask))) { | ||
| 188 | unsigned int ivsize = tfm->crt_cipher.cit_ivsize; | ||
| 189 | u8 buffer[ivsize + alignmask]; | ||
| 190 | u8 *tmp = (u8 *)ALIGN((unsigned long)buffer, alignmask + 1); | ||
| 191 | int err; | ||
| 192 | |||
| 193 | desc->info = memcpy(tmp, iv, ivsize); | ||
| 194 | err = crypt(desc, dst, src, nbytes); | ||
| 195 | memcpy(iv, tmp, ivsize); | ||
| 196 | |||
| 197 | return err; | ||
| 198 | } | ||
| 199 | |||
| 200 | return crypt(desc, dst, src, nbytes); | ||
| 201 | } | ||
| 202 | |||
| 203 | static unsigned int cbc_process_encrypt(const struct cipher_desc *desc, | ||
| 204 | u8 *dst, const u8 *src, | ||
| 205 | unsigned int nbytes) | ||
| 206 | { | ||
| 207 | struct crypto_tfm *tfm = desc->tfm; | ||
| 208 | void (*xor)(u8 *, const u8 *) = tfm->crt_u.cipher.cit_xor_block; | ||
| 209 | int bsize = crypto_tfm_alg_blocksize(tfm); | ||
| 210 | |||
| 211 | void (*fn)(struct crypto_tfm *, u8 *, const u8 *) = desc->crfn; | ||
| 212 | u8 *iv = desc->info; | ||
| 213 | unsigned int done = 0; | ||
| 214 | |||
| 215 | nbytes -= bsize; | ||
| 216 | |||
| 217 | do { | ||
| 218 | xor(iv, src); | ||
| 219 | fn(tfm, dst, iv); | ||
| 220 | memcpy(iv, dst, bsize); | ||
| 221 | |||
| 222 | src += bsize; | ||
| 223 | dst += bsize; | ||
| 224 | } while ((done += bsize) <= nbytes); | ||
| 225 | |||
| 226 | return done; | ||
| 227 | } | ||
| 228 | |||
| 229 | static unsigned int cbc_process_decrypt(const struct cipher_desc *desc, | ||
| 230 | u8 *dst, const u8 *src, | ||
| 231 | unsigned int nbytes) | ||
| 232 | { | ||
| 233 | struct crypto_tfm *tfm = desc->tfm; | ||
| 234 | void (*xor)(u8 *, const u8 *) = tfm->crt_u.cipher.cit_xor_block; | ||
| 235 | int bsize = crypto_tfm_alg_blocksize(tfm); | ||
| 236 | unsigned long alignmask = crypto_tfm_alg_alignmask(desc->tfm); | ||
| 237 | |||
| 238 | u8 stack[src == dst ? bsize + alignmask : 0]; | ||
| 239 | u8 *buf = (u8 *)ALIGN((unsigned long)stack, alignmask + 1); | ||
| 240 | u8 **dst_p = src == dst ? &buf : &dst; | ||
| 241 | |||
| 242 | void (*fn)(struct crypto_tfm *, u8 *, const u8 *) = desc->crfn; | ||
| 243 | u8 *iv = desc->info; | ||
| 244 | unsigned int done = 0; | ||
| 245 | |||
| 246 | nbytes -= bsize; | ||
| 247 | |||
| 248 | do { | ||
| 249 | u8 *tmp_dst = *dst_p; | ||
| 250 | |||
| 251 | fn(tfm, tmp_dst, src); | ||
| 252 | xor(tmp_dst, iv); | ||
| 253 | memcpy(iv, src, bsize); | ||
| 254 | if (tmp_dst != dst) | ||
| 255 | memcpy(dst, tmp_dst, bsize); | ||
| 256 | |||
| 257 | src += bsize; | ||
| 258 | dst += bsize; | ||
| 259 | } while ((done += bsize) <= nbytes); | ||
| 260 | |||
| 261 | return done; | ||
| 262 | } | ||
| 263 | |||
| 264 | static unsigned int ecb_process(const struct cipher_desc *desc, u8 *dst, | ||
| 265 | const u8 *src, unsigned int nbytes) | ||
| 266 | { | ||
| 267 | struct crypto_tfm *tfm = desc->tfm; | ||
| 268 | int bsize = crypto_tfm_alg_blocksize(tfm); | ||
| 269 | void (*fn)(struct crypto_tfm *, u8 *, const u8 *) = desc->crfn; | ||
| 270 | unsigned int done = 0; | ||
| 271 | |||
| 272 | nbytes -= bsize; | ||
| 273 | |||
| 274 | do { | ||
| 275 | fn(tfm, dst, src); | ||
| 276 | |||
| 277 | src += bsize; | ||
| 278 | dst += bsize; | ||
| 279 | } while ((done += bsize) <= nbytes); | ||
| 280 | |||
| 281 | return done; | ||
| 282 | } | ||
| 283 | 22 | ||
| 284 | static int setkey(struct crypto_tfm *tfm, const u8 *key, unsigned int keylen) | 23 | static int setkey(struct crypto_tfm *tfm, const u8 *key, unsigned int keylen) |
| 285 | { | 24 | { |
| @@ -293,122 +32,6 @@ static int setkey(struct crypto_tfm *tfm, const u8 *key, unsigned int keylen) | |||
| 293 | return cia->cia_setkey(tfm, key, keylen); | 32 | return cia->cia_setkey(tfm, key, keylen); |
| 294 | } | 33 | } |
| 295 | 34 | ||
| 296 | static int ecb_encrypt(struct crypto_tfm *tfm, | ||
| 297 | struct scatterlist *dst, | ||
| 298 | struct scatterlist *src, unsigned int nbytes) | ||
| 299 | { | ||
| 300 | struct cipher_desc desc; | ||
| 301 | struct cipher_alg_compat *cipher = (void *)&tfm->__crt_alg->cra_cipher; | ||
| 302 | |||
| 303 | desc.tfm = tfm; | ||
| 304 | desc.crfn = cipher->cia_encrypt; | ||
| 305 | desc.prfn = cipher->cia_encrypt_ecb ?: ecb_process; | ||
| 306 | |||
| 307 | return crypt(&desc, dst, src, nbytes); | ||
| 308 | } | ||
| 309 | |||
| 310 | static int ecb_decrypt(struct crypto_tfm *tfm, | ||
| 311 | struct scatterlist *dst, | ||
| 312 | struct scatterlist *src, | ||
| 313 | unsigned int nbytes) | ||
| 314 | { | ||
| 315 | struct cipher_desc desc; | ||
| 316 | struct cipher_alg_compat *cipher = (void *)&tfm->__crt_alg->cra_cipher; | ||
| 317 | |||
| 318 | desc.tfm = tfm; | ||
| 319 | desc.crfn = cipher->cia_decrypt; | ||
| 320 | desc.prfn = cipher->cia_decrypt_ecb ?: ecb_process; | ||
| 321 | |||
| 322 | return crypt(&desc, dst, src, nbytes); | ||
| 323 | } | ||
| 324 | |||
| 325 | static int cbc_encrypt(struct crypto_tfm *tfm, | ||
| 326 | struct scatterlist *dst, | ||
| 327 | struct scatterlist *src, | ||
| 328 | unsigned int nbytes) | ||
| 329 | { | ||
| 330 | struct cipher_desc desc; | ||
| 331 | struct cipher_alg_compat *cipher = (void *)&tfm->__crt_alg->cra_cipher; | ||
| 332 | |||
| 333 | desc.tfm = tfm; | ||
| 334 | desc.crfn = cipher->cia_encrypt; | ||
| 335 | desc.prfn = cipher->cia_encrypt_cbc ?: cbc_process_encrypt; | ||
| 336 | desc.info = tfm->crt_cipher.cit_iv; | ||
| 337 | |||
| 338 | return crypt(&desc, dst, src, nbytes); | ||
| 339 | } | ||
| 340 | |||
| 341 | static int cbc_encrypt_iv(struct crypto_tfm *tfm, | ||
| 342 | struct scatterlist *dst, | ||
| 343 | struct scatterlist *src, | ||
| 344 | unsigned int nbytes, u8 *iv) | ||
| 345 | { | ||
| 346 | struct cipher_desc desc; | ||
| 347 | struct cipher_alg_compat *cipher = (void *)&tfm->__crt_alg->cra_cipher; | ||
| 348 | |||
| 349 | desc.tfm = tfm; | ||
| 350 | desc.crfn = cipher->cia_encrypt; | ||
| 351 | desc.prfn = cipher->cia_encrypt_cbc ?: cbc_process_encrypt; | ||
| 352 | desc.info = iv; | ||
| 353 | |||
| 354 | return crypt_iv_unaligned(&desc, dst, src, nbytes); | ||
| 355 | } | ||
| 356 | |||
| 357 | static int cbc_decrypt(struct crypto_tfm *tfm, | ||
| 358 | struct scatterlist *dst, | ||
| 359 | struct scatterlist *src, | ||
| 360 | unsigned int nbytes) | ||
| 361 | { | ||
| 362 | struct cipher_desc desc; | ||
| 363 | struct cipher_alg_compat *cipher = (void *)&tfm->__crt_alg->cra_cipher; | ||
| 364 | |||
| 365 | desc.tfm = tfm; | ||
| 366 | desc.crfn = cipher->cia_decrypt; | ||
| 367 | desc.prfn = cipher->cia_decrypt_cbc ?: cbc_process_decrypt; | ||
| 368 | desc.info = tfm->crt_cipher.cit_iv; | ||
| 369 | |||
| 370 | return crypt(&desc, dst, src, nbytes); | ||
| 371 | } | ||
| 372 | |||
| 373 | static int cbc_decrypt_iv(struct crypto_tfm *tfm, | ||
| 374 | struct scatterlist *dst, | ||
| 375 | struct scatterlist *src, | ||
| 376 | unsigned int nbytes, u8 *iv) | ||
| 377 | { | ||
| 378 | struct cipher_desc desc; | ||
| 379 | struct cipher_alg_compat *cipher = (void *)&tfm->__crt_alg->cra_cipher; | ||
| 380 | |||
| 381 | desc.tfm = tfm; | ||
| 382 | desc.crfn = cipher->cia_decrypt; | ||
| 383 | desc.prfn = cipher->cia_decrypt_cbc ?: cbc_process_decrypt; | ||
| 384 | desc.info = iv; | ||
| 385 | |||
| 386 | return crypt_iv_unaligned(&desc, dst, src, nbytes); | ||
| 387 | } | ||
| 388 | |||
| 389 | static int nocrypt(struct crypto_tfm *tfm, | ||
| 390 | struct scatterlist *dst, | ||
| 391 | struct scatterlist *src, | ||
| 392 | unsigned int nbytes) | ||
| 393 | { | ||
| 394 | return -ENOSYS; | ||
| 395 | } | ||
| 396 | |||
| 397 | static int nocrypt_iv(struct crypto_tfm *tfm, | ||
| 398 | struct scatterlist *dst, | ||
| 399 | struct scatterlist *src, | ||
| 400 | unsigned int nbytes, u8 *iv) | ||
| 401 | { | ||
| 402 | return -ENOSYS; | ||
| 403 | } | ||
| 404 | |||
| 405 | int crypto_init_cipher_flags(struct crypto_tfm *tfm, u32 flags) | ||
| 406 | { | ||
| 407 | u32 mode = flags & CRYPTO_TFM_MODE_MASK; | ||
| 408 | tfm->crt_cipher.cit_mode = mode ? mode : CRYPTO_TFM_MODE_ECB; | ||
| 409 | return 0; | ||
| 410 | } | ||
| 411 | |||
| 412 | static void cipher_crypt_unaligned(void (*fn)(struct crypto_tfm *, u8 *, | 35 | static void cipher_crypt_unaligned(void (*fn)(struct crypto_tfm *, u8 *, |
| 413 | const u8 *), | 36 | const u8 *), |
| 414 | struct crypto_tfm *tfm, | 37 | struct crypto_tfm *tfm, |
| @@ -454,7 +77,6 @@ static void cipher_decrypt_unaligned(struct crypto_tfm *tfm, | |||
| 454 | 77 | ||
| 455 | int crypto_init_cipher_ops(struct crypto_tfm *tfm) | 78 | int crypto_init_cipher_ops(struct crypto_tfm *tfm) |
| 456 | { | 79 | { |
| 457 | int ret = 0; | ||
| 458 | struct cipher_tfm *ops = &tfm->crt_cipher; | 80 | struct cipher_tfm *ops = &tfm->crt_cipher; |
| 459 | struct cipher_alg *cipher = &tfm->__crt_alg->cra_cipher; | 81 | struct cipher_alg *cipher = &tfm->__crt_alg->cra_cipher; |
| 460 | 82 | ||
| @@ -464,70 +86,7 @@ int crypto_init_cipher_ops(struct crypto_tfm *tfm) | |||
| 464 | ops->cit_decrypt_one = crypto_tfm_alg_alignmask(tfm) ? | 86 | ops->cit_decrypt_one = crypto_tfm_alg_alignmask(tfm) ? |
| 465 | cipher_decrypt_unaligned : cipher->cia_decrypt; | 87 | cipher_decrypt_unaligned : cipher->cia_decrypt; |
| 466 | 88 | ||
| 467 | switch (tfm->crt_cipher.cit_mode) { | 89 | return 0; |
| 468 | case CRYPTO_TFM_MODE_ECB: | ||
| 469 | ops->cit_encrypt = ecb_encrypt; | ||
| 470 | ops->cit_decrypt = ecb_decrypt; | ||
| 471 | ops->cit_encrypt_iv = nocrypt_iv; | ||
| 472 | ops->cit_decrypt_iv = nocrypt_iv; | ||
| 473 | break; | ||
| 474 | |||
| 475 | case CRYPTO_TFM_MODE_CBC: | ||
| 476 | ops->cit_encrypt = cbc_encrypt; | ||
| 477 | ops->cit_decrypt = cbc_decrypt; | ||
| 478 | ops->cit_encrypt_iv = cbc_encrypt_iv; | ||
| 479 | ops->cit_decrypt_iv = cbc_decrypt_iv; | ||
| 480 | break; | ||
| 481 | |||
| 482 | case CRYPTO_TFM_MODE_CFB: | ||
| 483 | ops->cit_encrypt = nocrypt; | ||
| 484 | ops->cit_decrypt = nocrypt; | ||
| 485 | ops->cit_encrypt_iv = nocrypt_iv; | ||
| 486 | ops->cit_decrypt_iv = nocrypt_iv; | ||
| 487 | break; | ||
| 488 | |||
| 489 | case CRYPTO_TFM_MODE_CTR: | ||
| 490 | ops->cit_encrypt = nocrypt; | ||
| 491 | ops->cit_decrypt = nocrypt; | ||
| 492 | ops->cit_encrypt_iv = nocrypt_iv; | ||
| 493 | ops->cit_decrypt_iv = nocrypt_iv; | ||
| 494 | break; | ||
| 495 | |||
| 496 | default: | ||
| 497 | BUG(); | ||
| 498 | } | ||
| 499 | |||
| 500 | if (ops->cit_mode == CRYPTO_TFM_MODE_CBC) { | ||
| 501 | unsigned long align; | ||
| 502 | unsigned long addr; | ||
| 503 | |||
| 504 | switch (crypto_tfm_alg_blocksize(tfm)) { | ||
| 505 | case 8: | ||
| 506 | ops->cit_xor_block = xor_64; | ||
| 507 | break; | ||
| 508 | |||
| 509 | case 16: | ||
| 510 | ops->cit_xor_block = xor_128; | ||
| 511 | break; | ||
| 512 | |||
| 513 | default: | ||
| 514 | printk(KERN_WARNING "%s: block size %u not supported\n", | ||
| 515 | crypto_tfm_alg_name(tfm), | ||
| 516 | crypto_tfm_alg_blocksize(tfm)); | ||
| 517 | ret = -EINVAL; | ||
| 518 | goto out; | ||
| 519 | } | ||
| 520 | |||
| 521 | ops->cit_ivsize = crypto_tfm_alg_blocksize(tfm); | ||
| 522 | align = crypto_tfm_alg_alignmask(tfm) + 1; | ||
| 523 | addr = (unsigned long)crypto_tfm_ctx(tfm); | ||
| 524 | addr = ALIGN(addr, align); | ||
| 525 | addr += ALIGN(tfm->__crt_alg->cra_ctxsize, align); | ||
| 526 | ops->cit_iv = (void *)addr; | ||
| 527 | } | ||
| 528 | |||
| 529 | out: | ||
| 530 | return ret; | ||
| 531 | } | 90 | } |
| 532 | 91 | ||
| 533 | void crypto_exit_cipher_ops(struct crypto_tfm *tfm) | 92 | void crypto_exit_cipher_ops(struct crypto_tfm *tfm) |
diff --git a/crypto/compress.c b/crypto/compress.c index eca182aa3380..0a6570048c1e 100644 --- a/crypto/compress.c +++ b/crypto/compress.c | |||
| @@ -34,11 +34,6 @@ static int crypto_decompress(struct crypto_tfm *tfm, | |||
| 34 | dlen); | 34 | dlen); |
| 35 | } | 35 | } |
| 36 | 36 | ||
| 37 | int crypto_init_compress_flags(struct crypto_tfm *tfm, u32 flags) | ||
| 38 | { | ||
| 39 | return flags ? -EINVAL : 0; | ||
| 40 | } | ||
| 41 | |||
| 42 | int crypto_init_compress_ops(struct crypto_tfm *tfm) | 37 | int crypto_init_compress_ops(struct crypto_tfm *tfm) |
| 43 | { | 38 | { |
| 44 | struct compress_tfm *ops = &tfm->crt_compress; | 39 | struct compress_tfm *ops = &tfm->crt_compress; |
diff --git a/crypto/digest.c b/crypto/digest.c index 8f4593268ce0..1bf7414aeb9e 100644 --- a/crypto/digest.c +++ b/crypto/digest.c | |||
| @@ -14,7 +14,9 @@ | |||
| 14 | 14 | ||
| 15 | #include <linux/mm.h> | 15 | #include <linux/mm.h> |
| 16 | #include <linux/errno.h> | 16 | #include <linux/errno.h> |
| 17 | #include <linux/hardirq.h> | ||
| 17 | #include <linux/highmem.h> | 18 | #include <linux/highmem.h> |
| 19 | #include <linux/kernel.h> | ||
| 18 | #include <linux/module.h> | 20 | #include <linux/module.h> |
| 19 | #include <linux/scatterlist.h> | 21 | #include <linux/scatterlist.h> |
| 20 | 22 | ||
| @@ -29,8 +31,8 @@ static int init(struct hash_desc *desc) | |||
| 29 | return 0; | 31 | return 0; |
| 30 | } | 32 | } |
| 31 | 33 | ||
| 32 | static int update(struct hash_desc *desc, | 34 | static int update2(struct hash_desc *desc, |
| 33 | struct scatterlist *sg, unsigned int nbytes) | 35 | struct scatterlist *sg, unsigned int nbytes) |
| 34 | { | 36 | { |
| 35 | struct crypto_tfm *tfm = crypto_hash_tfm(desc->tfm); | 37 | struct crypto_tfm *tfm = crypto_hash_tfm(desc->tfm); |
| 36 | unsigned int alignmask = crypto_tfm_alg_alignmask(tfm); | 38 | unsigned int alignmask = crypto_tfm_alg_alignmask(tfm); |
| @@ -81,6 +83,14 @@ static int update(struct hash_desc *desc, | |||
| 81 | return 0; | 83 | return 0; |
| 82 | } | 84 | } |
| 83 | 85 | ||
| 86 | static int update(struct hash_desc *desc, | ||
| 87 | struct scatterlist *sg, unsigned int nbytes) | ||
| 88 | { | ||
| 89 | if (WARN_ON_ONCE(in_irq())) | ||
| 90 | return -EDEADLK; | ||
| 91 | return update2(desc, sg, nbytes); | ||
| 92 | } | ||
| 93 | |||
| 84 | static int final(struct hash_desc *desc, u8 *out) | 94 | static int final(struct hash_desc *desc, u8 *out) |
| 85 | { | 95 | { |
| 86 | struct crypto_tfm *tfm = crypto_hash_tfm(desc->tfm); | 96 | struct crypto_tfm *tfm = crypto_hash_tfm(desc->tfm); |
| @@ -118,16 +128,14 @@ static int setkey(struct crypto_hash *hash, const u8 *key, unsigned int keylen) | |||
| 118 | static int digest(struct hash_desc *desc, | 128 | static int digest(struct hash_desc *desc, |
| 119 | struct scatterlist *sg, unsigned int nbytes, u8 *out) | 129 | struct scatterlist *sg, unsigned int nbytes, u8 *out) |
| 120 | { | 130 | { |
| 131 | if (WARN_ON_ONCE(in_irq())) | ||
| 132 | return -EDEADLK; | ||
| 133 | |||
| 121 | init(desc); | 134 | init(desc); |
| 122 | update(desc, sg, nbytes); | 135 | update2(desc, sg, nbytes); |
| 123 | return final(desc, out); | 136 | return final(desc, out); |
| 124 | } | 137 | } |
| 125 | 138 | ||
| 126 | int crypto_init_digest_flags(struct crypto_tfm *tfm, u32 flags) | ||
| 127 | { | ||
| 128 | return flags ? -EINVAL : 0; | ||
| 129 | } | ||
| 130 | |||
| 131 | int crypto_init_digest_ops(struct crypto_tfm *tfm) | 139 | int crypto_init_digest_ops(struct crypto_tfm *tfm) |
| 132 | { | 140 | { |
| 133 | struct hash_tfm *ops = &tfm->crt_hash; | 141 | struct hash_tfm *ops = &tfm->crt_hash; |
diff --git a/crypto/ecb.c b/crypto/ecb.c index f239aa9c4017..839a0aed8c22 100644 --- a/crypto/ecb.c +++ b/crypto/ecb.c | |||
| @@ -99,12 +99,13 @@ static int crypto_ecb_init_tfm(struct crypto_tfm *tfm) | |||
| 99 | struct crypto_instance *inst = (void *)tfm->__crt_alg; | 99 | struct crypto_instance *inst = (void *)tfm->__crt_alg; |
| 100 | struct crypto_spawn *spawn = crypto_instance_ctx(inst); | 100 | struct crypto_spawn *spawn = crypto_instance_ctx(inst); |
| 101 | struct crypto_ecb_ctx *ctx = crypto_tfm_ctx(tfm); | 101 | struct crypto_ecb_ctx *ctx = crypto_tfm_ctx(tfm); |
| 102 | struct crypto_cipher *cipher; | ||
| 102 | 103 | ||
| 103 | tfm = crypto_spawn_tfm(spawn); | 104 | cipher = crypto_spawn_cipher(spawn); |
| 104 | if (IS_ERR(tfm)) | 105 | if (IS_ERR(cipher)) |
| 105 | return PTR_ERR(tfm); | 106 | return PTR_ERR(cipher); |
| 106 | 107 | ||
| 107 | ctx->child = crypto_cipher_cast(tfm); | 108 | ctx->child = cipher; |
| 108 | return 0; | 109 | return 0; |
| 109 | } | 110 | } |
| 110 | 111 | ||
diff --git a/crypto/fcrypt.c b/crypto/fcrypt.c new file mode 100644 index 000000000000..9c2bb535b09a --- /dev/null +++ b/crypto/fcrypt.c | |||
| @@ -0,0 +1,423 @@ | |||
| 1 | /* FCrypt encryption algorithm | ||
| 2 | * | ||
| 3 | * Copyright (C) 2006 Red Hat, Inc. All Rights Reserved. | ||
| 4 | * Written by David Howells (dhowells@redhat.com) | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or | ||
| 7 | * modify it under the terms of the GNU General Public License | ||
| 8 | * as published by the Free Software Foundation; either version | ||
| 9 | * 2 of the License, or (at your option) any later version. | ||
| 10 | * | ||
| 11 | * Based on code: | ||
| 12 | * | ||
| 13 | * Copyright (c) 1995 - 2000 Kungliga Tekniska Högskolan | ||
| 14 | * (Royal Institute of Technology, Stockholm, Sweden). | ||
| 15 | * All rights reserved. | ||
| 16 | * | ||
| 17 | * Redistribution and use in source and binary forms, with or without | ||
| 18 | * modification, are permitted provided that the following conditions | ||
| 19 | * are met: | ||
| 20 | * | ||
| 21 | * 1. Redistributions of source code must retain the above copyright | ||
| 22 | * notice, this list of conditions and the following disclaimer. | ||
| 23 | * | ||
| 24 | * 2. Redistributions in binary form must reproduce the above copyright | ||
| 25 | * notice, this list of conditions and the following disclaimer in the | ||
| 26 | * documentation and/or other materials provided with the distribution. | ||
| 27 | * | ||
| 28 | * 3. Neither the name of the Institute nor the names of its contributors | ||
| 29 | * may be used to endorse or promote products derived from this software | ||
| 30 | * without specific prior written permission. | ||
| 31 | * | ||
| 32 | * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND | ||
| 33 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||
| 34 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||
| 35 | * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE | ||
| 36 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
| 37 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||
| 38 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
| 39 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||
| 40 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||
| 41 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||
| 42 | * SUCH DAMAGE. | ||
| 43 | */ | ||
| 44 | |||
| 45 | #include <asm/byteorder.h> | ||
| 46 | #include <linux/bitops.h> | ||
| 47 | #include <linux/init.h> | ||
| 48 | #include <linux/module.h> | ||
| 49 | #include <linux/crypto.h> | ||
| 50 | |||
| 51 | #define ROUNDS 16 | ||
| 52 | |||
| 53 | struct fcrypt_ctx { | ||
| 54 | u32 sched[ROUNDS]; | ||
| 55 | }; | ||
| 56 | |||
| 57 | /* Rotate right two 32 bit numbers as a 56 bit number */ | ||
| 58 | #define ror56(hi, lo, n) \ | ||
| 59 | do { \ | ||
| 60 | u32 t = lo & ((1 << n) - 1); \ | ||
| 61 | lo = (lo >> n) | ((hi & ((1 << n) - 1)) << (32 - n)); \ | ||
| 62 | hi = (hi >> n) | (t << (24-n)); \ | ||
| 63 | } while(0) | ||
| 64 | |||
| 65 | /* Rotate right one 64 bit number as a 56 bit number */ | ||
| 66 | #define ror56_64(k, n) \ | ||
| 67 | do { \ | ||
| 68 | k = (k >> n) | ((k & ((1 << n) - 1)) << (56 - n)); \ | ||
| 69 | } while(0) | ||
| 70 | |||
| 71 | /* | ||
| 72 | * Sboxes for Feistel network derived from | ||
| 73 | * /afs/transarc.com/public/afsps/afs.rel31b.export-src/rxkad/sboxes.h | ||
| 74 | */ | ||
| 75 | #undef Z | ||
| 76 | #define Z(x) __constant_be32_to_cpu(x << 3) | ||
| 77 | static const u32 sbox0[256] = { | ||
| 78 | Z(0xea), Z(0x7f), Z(0xb2), Z(0x64), Z(0x9d), Z(0xb0), Z(0xd9), Z(0x11), | ||
| 79 | Z(0xcd), Z(0x86), Z(0x86), Z(0x91), Z(0x0a), Z(0xb2), Z(0x93), Z(0x06), | ||
| 80 | Z(0x0e), Z(0x06), Z(0xd2), Z(0x65), Z(0x73), Z(0xc5), Z(0x28), Z(0x60), | ||
| 81 | Z(0xf2), Z(0x20), Z(0xb5), Z(0x38), Z(0x7e), Z(0xda), Z(0x9f), Z(0xe3), | ||
| 82 | Z(0xd2), Z(0xcf), Z(0xc4), Z(0x3c), Z(0x61), Z(0xff), Z(0x4a), Z(0x4a), | ||
| 83 | Z(0x35), Z(0xac), Z(0xaa), Z(0x5f), Z(0x2b), Z(0xbb), Z(0xbc), Z(0x53), | ||
| 84 | Z(0x4e), Z(0x9d), Z(0x78), Z(0xa3), Z(0xdc), Z(0x09), Z(0x32), Z(0x10), | ||
| 85 | Z(0xc6), Z(0x6f), Z(0x66), Z(0xd6), Z(0xab), Z(0xa9), Z(0xaf), Z(0xfd), | ||
| 86 | Z(0x3b), Z(0x95), Z(0xe8), Z(0x34), Z(0x9a), Z(0x81), Z(0x72), Z(0x80), | ||
| 87 | Z(0x9c), Z(0xf3), Z(0xec), Z(0xda), Z(0x9f), Z(0x26), Z(0x76), Z(0x15), | ||
| 88 | Z(0x3e), Z(0x55), Z(0x4d), Z(0xde), Z(0x84), Z(0xee), Z(0xad), Z(0xc7), | ||
| 89 | Z(0xf1), Z(0x6b), Z(0x3d), Z(0xd3), Z(0x04), Z(0x49), Z(0xaa), Z(0x24), | ||
| 90 | Z(0x0b), Z(0x8a), Z(0x83), Z(0xba), Z(0xfa), Z(0x85), Z(0xa0), Z(0xa8), | ||
| 91 | Z(0xb1), Z(0xd4), Z(0x01), Z(0xd8), Z(0x70), Z(0x64), Z(0xf0), Z(0x51), | ||
| 92 | Z(0xd2), Z(0xc3), Z(0xa7), Z(0x75), Z(0x8c), Z(0xa5), Z(0x64), Z(0xef), | ||
| 93 | Z(0x10), Z(0x4e), Z(0xb7), Z(0xc6), Z(0x61), Z(0x03), Z(0xeb), Z(0x44), | ||
| 94 | Z(0x3d), Z(0xe5), Z(0xb3), Z(0x5b), Z(0xae), Z(0xd5), Z(0xad), Z(0x1d), | ||
| 95 | Z(0xfa), Z(0x5a), Z(0x1e), Z(0x33), Z(0xab), Z(0x93), Z(0xa2), Z(0xb7), | ||
| 96 | Z(0xe7), Z(0xa8), Z(0x45), Z(0xa4), Z(0xcd), Z(0x29), Z(0x63), Z(0x44), | ||
| 97 | Z(0xb6), Z(0x69), Z(0x7e), Z(0x2e), Z(0x62), Z(0x03), Z(0xc8), Z(0xe0), | ||
| 98 | Z(0x17), Z(0xbb), Z(0xc7), Z(0xf3), Z(0x3f), Z(0x36), Z(0xba), Z(0x71), | ||
| 99 | Z(0x8e), Z(0x97), Z(0x65), Z(0x60), Z(0x69), Z(0xb6), Z(0xf6), Z(0xe6), | ||
| 100 | Z(0x6e), Z(0xe0), Z(0x81), Z(0x59), Z(0xe8), Z(0xaf), Z(0xdd), Z(0x95), | ||
| 101 | Z(0x22), Z(0x99), Z(0xfd), Z(0x63), Z(0x19), Z(0x74), Z(0x61), Z(0xb1), | ||
| 102 | Z(0xb6), Z(0x5b), Z(0xae), Z(0x54), Z(0xb3), Z(0x70), Z(0xff), Z(0xc6), | ||
| 103 | Z(0x3b), Z(0x3e), Z(0xc1), Z(0xd7), Z(0xe1), Z(0x0e), Z(0x76), Z(0xe5), | ||
| 104 | Z(0x36), Z(0x4f), Z(0x59), Z(0xc7), Z(0x08), Z(0x6e), Z(0x82), Z(0xa6), | ||
| 105 | Z(0x93), Z(0xc4), Z(0xaa), Z(0x26), Z(0x49), Z(0xe0), Z(0x21), Z(0x64), | ||
| 106 | Z(0x07), Z(0x9f), Z(0x64), Z(0x81), Z(0x9c), Z(0xbf), Z(0xf9), Z(0xd1), | ||
| 107 | Z(0x43), Z(0xf8), Z(0xb6), Z(0xb9), Z(0xf1), Z(0x24), Z(0x75), Z(0x03), | ||
| 108 | Z(0xe4), Z(0xb0), Z(0x99), Z(0x46), Z(0x3d), Z(0xf5), Z(0xd1), Z(0x39), | ||
| 109 | Z(0x72), Z(0x12), Z(0xf6), Z(0xba), Z(0x0c), Z(0x0d), Z(0x42), Z(0x2e) | ||
| 110 | }; | ||
| 111 | |||
| 112 | #undef Z | ||
| 113 | #define Z(x) __constant_be32_to_cpu((x << 27) | (x >> 5)) | ||
| 114 | static const u32 sbox1[256] = { | ||
| 115 | Z(0x77), Z(0x14), Z(0xa6), Z(0xfe), Z(0xb2), Z(0x5e), Z(0x8c), Z(0x3e), | ||
| 116 | Z(0x67), Z(0x6c), Z(0xa1), Z(0x0d), Z(0xc2), Z(0xa2), Z(0xc1), Z(0x85), | ||
| 117 | Z(0x6c), Z(0x7b), Z(0x67), Z(0xc6), Z(0x23), Z(0xe3), Z(0xf2), Z(0x89), | ||
| 118 | Z(0x50), Z(0x9c), Z(0x03), Z(0xb7), Z(0x73), Z(0xe6), Z(0xe1), Z(0x39), | ||
| 119 | Z(0x31), Z(0x2c), Z(0x27), Z(0x9f), Z(0xa5), Z(0x69), Z(0x44), Z(0xd6), | ||
| 120 | Z(0x23), Z(0x83), Z(0x98), Z(0x7d), Z(0x3c), Z(0xb4), Z(0x2d), Z(0x99), | ||
| 121 | Z(0x1c), Z(0x1f), Z(0x8c), Z(0x20), Z(0x03), Z(0x7c), Z(0x5f), Z(0xad), | ||
| 122 | Z(0xf4), Z(0xfa), Z(0x95), Z(0xca), Z(0x76), Z(0x44), Z(0xcd), Z(0xb6), | ||
| 123 | Z(0xb8), Z(0xa1), Z(0xa1), Z(0xbe), Z(0x9e), Z(0x54), Z(0x8f), Z(0x0b), | ||
| 124 | Z(0x16), Z(0x74), Z(0x31), Z(0x8a), Z(0x23), Z(0x17), Z(0x04), Z(0xfa), | ||
| 125 | Z(0x79), Z(0x84), Z(0xb1), Z(0xf5), Z(0x13), Z(0xab), Z(0xb5), Z(0x2e), | ||
| 126 | Z(0xaa), Z(0x0c), Z(0x60), Z(0x6b), Z(0x5b), Z(0xc4), Z(0x4b), Z(0xbc), | ||
| 127 | Z(0xe2), Z(0xaf), Z(0x45), Z(0x73), Z(0xfa), Z(0xc9), Z(0x49), Z(0xcd), | ||
| 128 | Z(0x00), Z(0x92), Z(0x7d), Z(0x97), Z(0x7a), Z(0x18), Z(0x60), Z(0x3d), | ||
| 129 | Z(0xcf), Z(0x5b), Z(0xde), Z(0xc6), Z(0xe2), Z(0xe6), Z(0xbb), Z(0x8b), | ||
| 130 | Z(0x06), Z(0xda), Z(0x08), Z(0x15), Z(0x1b), Z(0x88), Z(0x6a), Z(0x17), | ||
| 131 | Z(0x89), Z(0xd0), Z(0xa9), Z(0xc1), Z(0xc9), Z(0x70), Z(0x6b), Z(0xe5), | ||
| 132 | Z(0x43), Z(0xf4), Z(0x68), Z(0xc8), Z(0xd3), Z(0x84), Z(0x28), Z(0x0a), | ||
| 133 | Z(0x52), Z(0x66), Z(0xa3), Z(0xca), Z(0xf2), Z(0xe3), Z(0x7f), Z(0x7a), | ||
| 134 | Z(0x31), Z(0xf7), Z(0x88), Z(0x94), Z(0x5e), Z(0x9c), Z(0x63), Z(0xd5), | ||
| 135 | Z(0x24), Z(0x66), Z(0xfc), Z(0xb3), Z(0x57), Z(0x25), Z(0xbe), Z(0x89), | ||
| 136 | Z(0x44), Z(0xc4), Z(0xe0), Z(0x8f), Z(0x23), Z(0x3c), Z(0x12), Z(0x52), | ||
| 137 | Z(0xf5), Z(0x1e), Z(0xf4), Z(0xcb), Z(0x18), Z(0x33), Z(0x1f), Z(0xf8), | ||
| 138 | Z(0x69), Z(0x10), Z(0x9d), Z(0xd3), Z(0xf7), Z(0x28), Z(0xf8), Z(0x30), | ||
| 139 | Z(0x05), Z(0x5e), Z(0x32), Z(0xc0), Z(0xd5), Z(0x19), Z(0xbd), Z(0x45), | ||
| 140 | Z(0x8b), Z(0x5b), Z(0xfd), Z(0xbc), Z(0xe2), Z(0x5c), Z(0xa9), Z(0x96), | ||
| 141 | Z(0xef), Z(0x70), Z(0xcf), Z(0xc2), Z(0x2a), Z(0xb3), Z(0x61), Z(0xad), | ||
| 142 | Z(0x80), Z(0x48), Z(0x81), Z(0xb7), Z(0x1d), Z(0x43), Z(0xd9), Z(0xd7), | ||
| 143 | Z(0x45), Z(0xf0), Z(0xd8), Z(0x8a), Z(0x59), Z(0x7c), Z(0x57), Z(0xc1), | ||
| 144 | Z(0x79), Z(0xc7), Z(0x34), Z(0xd6), Z(0x43), Z(0xdf), Z(0xe4), Z(0x78), | ||
| 145 | Z(0x16), Z(0x06), Z(0xda), Z(0x92), Z(0x76), Z(0x51), Z(0xe1), Z(0xd4), | ||
| 146 | Z(0x70), Z(0x03), Z(0xe0), Z(0x2f), Z(0x96), Z(0x91), Z(0x82), Z(0x80) | ||
| 147 | }; | ||
| 148 | |||
| 149 | #undef Z | ||
| 150 | #define Z(x) __constant_be32_to_cpu(x << 11) | ||
| 151 | static const u32 sbox2[256] = { | ||
| 152 | Z(0xf0), Z(0x37), Z(0x24), Z(0x53), Z(0x2a), Z(0x03), Z(0x83), Z(0x86), | ||
| 153 | Z(0xd1), Z(0xec), Z(0x50), Z(0xf0), Z(0x42), Z(0x78), Z(0x2f), Z(0x6d), | ||
| 154 | Z(0xbf), Z(0x80), Z(0x87), Z(0x27), Z(0x95), Z(0xe2), Z(0xc5), Z(0x5d), | ||
| 155 | Z(0xf9), Z(0x6f), Z(0xdb), Z(0xb4), Z(0x65), Z(0x6e), Z(0xe7), Z(0x24), | ||
| 156 | Z(0xc8), Z(0x1a), Z(0xbb), Z(0x49), Z(0xb5), Z(0x0a), Z(0x7d), Z(0xb9), | ||
| 157 | Z(0xe8), Z(0xdc), Z(0xb7), Z(0xd9), Z(0x45), Z(0x20), Z(0x1b), Z(0xce), | ||
| 158 | Z(0x59), Z(0x9d), Z(0x6b), Z(0xbd), Z(0x0e), Z(0x8f), Z(0xa3), Z(0xa9), | ||
| 159 | Z(0xbc), Z(0x74), Z(0xa6), Z(0xf6), Z(0x7f), Z(0x5f), Z(0xb1), Z(0x68), | ||
| 160 | Z(0x84), Z(0xbc), Z(0xa9), Z(0xfd), Z(0x55), Z(0x50), Z(0xe9), Z(0xb6), | ||
| 161 | Z(0x13), Z(0x5e), Z(0x07), Z(0xb8), Z(0x95), Z(0x02), Z(0xc0), Z(0xd0), | ||
| 162 | Z(0x6a), Z(0x1a), Z(0x85), Z(0xbd), Z(0xb6), Z(0xfd), Z(0xfe), Z(0x17), | ||
| 163 | Z(0x3f), Z(0x09), Z(0xa3), Z(0x8d), Z(0xfb), Z(0xed), Z(0xda), Z(0x1d), | ||
| 164 | Z(0x6d), Z(0x1c), Z(0x6c), Z(0x01), Z(0x5a), Z(0xe5), Z(0x71), Z(0x3e), | ||
| 165 | Z(0x8b), Z(0x6b), Z(0xbe), Z(0x29), Z(0xeb), Z(0x12), Z(0x19), Z(0x34), | ||
| 166 | Z(0xcd), Z(0xb3), Z(0xbd), Z(0x35), Z(0xea), Z(0x4b), Z(0xd5), Z(0xae), | ||
| 167 | Z(0x2a), Z(0x79), Z(0x5a), Z(0xa5), Z(0x32), Z(0x12), Z(0x7b), Z(0xdc), | ||
| 168 | Z(0x2c), Z(0xd0), Z(0x22), Z(0x4b), Z(0xb1), Z(0x85), Z(0x59), Z(0x80), | ||
| 169 | Z(0xc0), Z(0x30), Z(0x9f), Z(0x73), Z(0xd3), Z(0x14), Z(0x48), Z(0x40), | ||
| 170 | Z(0x07), Z(0x2d), Z(0x8f), Z(0x80), Z(0x0f), Z(0xce), Z(0x0b), Z(0x5e), | ||
| 171 | Z(0xb7), Z(0x5e), Z(0xac), Z(0x24), Z(0x94), Z(0x4a), Z(0x18), Z(0x15), | ||
| 172 | Z(0x05), Z(0xe8), Z(0x02), Z(0x77), Z(0xa9), Z(0xc7), Z(0x40), Z(0x45), | ||
| 173 | Z(0x89), Z(0xd1), Z(0xea), Z(0xde), Z(0x0c), Z(0x79), Z(0x2a), Z(0x99), | ||
| 174 | Z(0x6c), Z(0x3e), Z(0x95), Z(0xdd), Z(0x8c), Z(0x7d), Z(0xad), Z(0x6f), | ||
| 175 | Z(0xdc), Z(0xff), Z(0xfd), Z(0x62), Z(0x47), Z(0xb3), Z(0x21), Z(0x8a), | ||
| 176 | Z(0xec), Z(0x8e), Z(0x19), Z(0x18), Z(0xb4), Z(0x6e), Z(0x3d), Z(0xfd), | ||
| 177 | Z(0x74), Z(0x54), Z(0x1e), Z(0x04), Z(0x85), Z(0xd8), Z(0xbc), Z(0x1f), | ||
| 178 | Z(0x56), Z(0xe7), Z(0x3a), Z(0x56), Z(0x67), Z(0xd6), Z(0xc8), Z(0xa5), | ||
| 179 | Z(0xf3), Z(0x8e), Z(0xde), Z(0xae), Z(0x37), Z(0x49), Z(0xb7), Z(0xfa), | ||
| 180 | Z(0xc8), Z(0xf4), Z(0x1f), Z(0xe0), Z(0x2a), Z(0x9b), Z(0x15), Z(0xd1), | ||
| 181 | Z(0x34), Z(0x0e), Z(0xb5), Z(0xe0), Z(0x44), Z(0x78), Z(0x84), Z(0x59), | ||
| 182 | Z(0x56), Z(0x68), Z(0x77), Z(0xa5), Z(0x14), Z(0x06), Z(0xf5), Z(0x2f), | ||
| 183 | Z(0x8c), Z(0x8a), Z(0x73), Z(0x80), Z(0x76), Z(0xb4), Z(0x10), Z(0x86) | ||
| 184 | }; | ||
| 185 | |||
| 186 | #undef Z | ||
| 187 | #define Z(x) __constant_be32_to_cpu(x << 19) | ||
| 188 | static const u32 sbox3[256] = { | ||
| 189 | Z(0xa9), Z(0x2a), Z(0x48), Z(0x51), Z(0x84), Z(0x7e), Z(0x49), Z(0xe2), | ||
| 190 | Z(0xb5), Z(0xb7), Z(0x42), Z(0x33), Z(0x7d), Z(0x5d), Z(0xa6), Z(0x12), | ||
| 191 | Z(0x44), Z(0x48), Z(0x6d), Z(0x28), Z(0xaa), Z(0x20), Z(0x6d), Z(0x57), | ||
| 192 | Z(0xd6), Z(0x6b), Z(0x5d), Z(0x72), Z(0xf0), Z(0x92), Z(0x5a), Z(0x1b), | ||
| 193 | Z(0x53), Z(0x80), Z(0x24), Z(0x70), Z(0x9a), Z(0xcc), Z(0xa7), Z(0x66), | ||
| 194 | Z(0xa1), Z(0x01), Z(0xa5), Z(0x41), Z(0x97), Z(0x41), Z(0x31), Z(0x82), | ||
| 195 | Z(0xf1), Z(0x14), Z(0xcf), Z(0x53), Z(0x0d), Z(0xa0), Z(0x10), Z(0xcc), | ||
| 196 | Z(0x2a), Z(0x7d), Z(0xd2), Z(0xbf), Z(0x4b), Z(0x1a), Z(0xdb), Z(0x16), | ||
| 197 | Z(0x47), Z(0xf6), Z(0x51), Z(0x36), Z(0xed), Z(0xf3), Z(0xb9), Z(0x1a), | ||
| 198 | Z(0xa7), Z(0xdf), Z(0x29), Z(0x43), Z(0x01), Z(0x54), Z(0x70), Z(0xa4), | ||
| 199 | Z(0xbf), Z(0xd4), Z(0x0b), Z(0x53), Z(0x44), Z(0x60), Z(0x9e), Z(0x23), | ||
| 200 | Z(0xa1), Z(0x18), Z(0x68), Z(0x4f), Z(0xf0), Z(0x2f), Z(0x82), Z(0xc2), | ||
| 201 | Z(0x2a), Z(0x41), Z(0xb2), Z(0x42), Z(0x0c), Z(0xed), Z(0x0c), Z(0x1d), | ||
| 202 | Z(0x13), Z(0x3a), Z(0x3c), Z(0x6e), Z(0x35), Z(0xdc), Z(0x60), Z(0x65), | ||
| 203 | Z(0x85), Z(0xe9), Z(0x64), Z(0x02), Z(0x9a), Z(0x3f), Z(0x9f), Z(0x87), | ||
| 204 | Z(0x96), Z(0xdf), Z(0xbe), Z(0xf2), Z(0xcb), Z(0xe5), Z(0x6c), Z(0xd4), | ||
| 205 | Z(0x5a), Z(0x83), Z(0xbf), Z(0x92), Z(0x1b), Z(0x94), Z(0x00), Z(0x42), | ||
| 206 | Z(0xcf), Z(0x4b), Z(0x00), Z(0x75), Z(0xba), Z(0x8f), Z(0x76), Z(0x5f), | ||
| 207 | Z(0x5d), Z(0x3a), Z(0x4d), Z(0x09), Z(0x12), Z(0x08), Z(0x38), Z(0x95), | ||
| 208 | Z(0x17), Z(0xe4), Z(0x01), Z(0x1d), Z(0x4c), Z(0xa9), Z(0xcc), Z(0x85), | ||
| 209 | Z(0x82), Z(0x4c), Z(0x9d), Z(0x2f), Z(0x3b), Z(0x66), Z(0xa1), Z(0x34), | ||
| 210 | Z(0x10), Z(0xcd), Z(0x59), Z(0x89), Z(0xa5), Z(0x31), Z(0xcf), Z(0x05), | ||
| 211 | Z(0xc8), Z(0x84), Z(0xfa), Z(0xc7), Z(0xba), Z(0x4e), Z(0x8b), Z(0x1a), | ||
| 212 | Z(0x19), Z(0xf1), Z(0xa1), Z(0x3b), Z(0x18), Z(0x12), Z(0x17), Z(0xb0), | ||
| 213 | Z(0x98), Z(0x8d), Z(0x0b), Z(0x23), Z(0xc3), Z(0x3a), Z(0x2d), Z(0x20), | ||
| 214 | Z(0xdf), Z(0x13), Z(0xa0), Z(0xa8), Z(0x4c), Z(0x0d), Z(0x6c), Z(0x2f), | ||
| 215 | Z(0x47), Z(0x13), Z(0x13), Z(0x52), Z(0x1f), Z(0x2d), Z(0xf5), Z(0x79), | ||
| 216 | Z(0x3d), Z(0xa2), Z(0x54), Z(0xbd), Z(0x69), Z(0xc8), Z(0x6b), Z(0xf3), | ||
| 217 | Z(0x05), Z(0x28), Z(0xf1), Z(0x16), Z(0x46), Z(0x40), Z(0xb0), Z(0x11), | ||
| 218 | Z(0xd3), Z(0xb7), Z(0x95), Z(0x49), Z(0xcf), Z(0xc3), Z(0x1d), Z(0x8f), | ||
| 219 | Z(0xd8), Z(0xe1), Z(0x73), Z(0xdb), Z(0xad), Z(0xc8), Z(0xc9), Z(0xa9), | ||
| 220 | Z(0xa1), Z(0xc2), Z(0xc5), Z(0xe3), Z(0xba), Z(0xfc), Z(0x0e), Z(0x25) | ||
| 221 | }; | ||
| 222 | |||
| 223 | /* | ||
| 224 | * This is a 16 round Feistel network with permutation F_ENCRYPT | ||
| 225 | */ | ||
| 226 | #define F_ENCRYPT(R, L, sched) \ | ||
| 227 | do { \ | ||
| 228 | union lc4 { u32 l; u8 c[4]; } u; \ | ||
| 229 | u.l = sched ^ R; \ | ||
| 230 | L ^= sbox0[u.c[0]] ^ sbox1[u.c[1]] ^ sbox2[u.c[2]] ^ sbox3[u.c[3]]; \ | ||
| 231 | } while(0) | ||
| 232 | |||
| 233 | /* | ||
| 234 | * encryptor | ||
| 235 | */ | ||
| 236 | static void fcrypt_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src) | ||
| 237 | { | ||
| 238 | const struct fcrypt_ctx *ctx = crypto_tfm_ctx(tfm); | ||
| 239 | struct { | ||
| 240 | u32 l, r; | ||
| 241 | } X; | ||
| 242 | |||
| 243 | memcpy(&X, src, sizeof(X)); | ||
| 244 | |||
| 245 | F_ENCRYPT(X.r, X.l, ctx->sched[0x0]); | ||
| 246 | F_ENCRYPT(X.l, X.r, ctx->sched[0x1]); | ||
| 247 | F_ENCRYPT(X.r, X.l, ctx->sched[0x2]); | ||
| 248 | F_ENCRYPT(X.l, X.r, ctx->sched[0x3]); | ||
| 249 | F_ENCRYPT(X.r, X.l, ctx->sched[0x4]); | ||
| 250 | F_ENCRYPT(X.l, X.r, ctx->sched[0x5]); | ||
| 251 | F_ENCRYPT(X.r, X.l, ctx->sched[0x6]); | ||
| 252 | F_ENCRYPT(X.l, X.r, ctx->sched[0x7]); | ||
| 253 | F_ENCRYPT(X.r, X.l, ctx->sched[0x8]); | ||
| 254 | F_ENCRYPT(X.l, X.r, ctx->sched[0x9]); | ||
| 255 | F_ENCRYPT(X.r, X.l, ctx->sched[0xa]); | ||
| 256 | F_ENCRYPT(X.l, X.r, ctx->sched[0xb]); | ||
| 257 | F_ENCRYPT(X.r, X.l, ctx->sched[0xc]); | ||
| 258 | F_ENCRYPT(X.l, X.r, ctx->sched[0xd]); | ||
| 259 | F_ENCRYPT(X.r, X.l, ctx->sched[0xe]); | ||
| 260 | F_ENCRYPT(X.l, X.r, ctx->sched[0xf]); | ||
| 261 | |||
| 262 | memcpy(dst, &X, sizeof(X)); | ||
| 263 | } | ||
| 264 | |||
| 265 | /* | ||
| 266 | * decryptor | ||
| 267 | */ | ||
| 268 | static void fcrypt_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src) | ||
| 269 | { | ||
| 270 | const struct fcrypt_ctx *ctx = crypto_tfm_ctx(tfm); | ||
| 271 | struct { | ||
| 272 | u32 l, r; | ||
| 273 | } X; | ||
| 274 | |||
| 275 | memcpy(&X, src, sizeof(X)); | ||
| 276 | |||
| 277 | F_ENCRYPT(X.l, X.r, ctx->sched[0xf]); | ||
| 278 | F_ENCRYPT(X.r, X.l, ctx->sched[0xe]); | ||
| 279 | F_ENCRYPT(X.l, X.r, ctx->sched[0xd]); | ||
| 280 | F_ENCRYPT(X.r, X.l, ctx->sched[0xc]); | ||
| 281 | F_ENCRYPT(X.l, X.r, ctx->sched[0xb]); | ||
| 282 | F_ENCRYPT(X.r, X.l, ctx->sched[0xa]); | ||
| 283 | F_ENCRYPT(X.l, X.r, ctx->sched[0x9]); | ||
| 284 | F_ENCRYPT(X.r, X.l, ctx->sched[0x8]); | ||
| 285 | F_ENCRYPT(X.l, X.r, ctx->sched[0x7]); | ||
| 286 | F_ENCRYPT(X.r, X.l, ctx->sched[0x6]); | ||
| 287 | F_ENCRYPT(X.l, X.r, ctx->sched[0x5]); | ||
| 288 | F_ENCRYPT(X.r, X.l, ctx->sched[0x4]); | ||
| 289 | F_ENCRYPT(X.l, X.r, ctx->sched[0x3]); | ||
| 290 | F_ENCRYPT(X.r, X.l, ctx->sched[0x2]); | ||
| 291 | F_ENCRYPT(X.l, X.r, ctx->sched[0x1]); | ||
| 292 | F_ENCRYPT(X.r, X.l, ctx->sched[0x0]); | ||
| 293 | |||
| 294 | memcpy(dst, &X, sizeof(X)); | ||
| 295 | } | ||
| 296 | |||
| 297 | /* | ||
| 298 | * Generate a key schedule from key, the least significant bit in each key byte | ||
| 299 | * is parity and shall be ignored. This leaves 56 significant bits in the key | ||
| 300 | * to scatter over the 16 key schedules. For each schedule extract the low | ||
| 301 | * order 32 bits and use as schedule, then rotate right by 11 bits. | ||
| 302 | */ | ||
| 303 | static int fcrypt_setkey(struct crypto_tfm *tfm, const u8 *key, unsigned int keylen) | ||
| 304 | { | ||
| 305 | struct fcrypt_ctx *ctx = crypto_tfm_ctx(tfm); | ||
| 306 | |||
| 307 | #if BITS_PER_LONG == 64 /* the 64-bit version can also be used for 32-bit | ||
| 308 | * kernels - it seems to be faster but the code is | ||
| 309 | * larger */ | ||
| 310 | |||
| 311 | u64 k; /* k holds all 56 non-parity bits */ | ||
| 312 | |||
| 313 | /* discard the parity bits */ | ||
| 314 | k = (*key++) >> 1; | ||
| 315 | k <<= 7; | ||
| 316 | k |= (*key++) >> 1; | ||
| 317 | k <<= 7; | ||
| 318 | k |= (*key++) >> 1; | ||
| 319 | k <<= 7; | ||
| 320 | k |= (*key++) >> 1; | ||
| 321 | k <<= 7; | ||
| 322 | k |= (*key++) >> 1; | ||
| 323 | k <<= 7; | ||
| 324 | k |= (*key++) >> 1; | ||
| 325 | k <<= 7; | ||
| 326 | k |= (*key++) >> 1; | ||
| 327 | k <<= 7; | ||
| 328 | k |= (*key) >> 1; | ||
| 329 | |||
| 330 | /* Use lower 32 bits for schedule, rotate by 11 each round (16 times) */ | ||
| 331 | ctx->sched[0x0] = be32_to_cpu(k); ror56_64(k, 11); | ||
| 332 | ctx->sched[0x1] = be32_to_cpu(k); ror56_64(k, 11); | ||
| 333 | ctx->sched[0x2] = be32_to_cpu(k); ror56_64(k, 11); | ||
| 334 | ctx->sched[0x3] = be32_to_cpu(k); ror56_64(k, 11); | ||
| 335 | ctx->sched[0x4] = be32_to_cpu(k); ror56_64(k, 11); | ||
| 336 | ctx->sched[0x5] = be32_to_cpu(k); ror56_64(k, 11); | ||
| 337 | ctx->sched[0x6] = be32_to_cpu(k); ror56_64(k, 11); | ||
| 338 | ctx->sched[0x7] = be32_to_cpu(k); ror56_64(k, 11); | ||
| 339 | ctx->sched[0x8] = be32_to_cpu(k); ror56_64(k, 11); | ||
| 340 | ctx->sched[0x9] = be32_to_cpu(k); ror56_64(k, 11); | ||
| 341 | ctx->sched[0xa] = be32_to_cpu(k); ror56_64(k, 11); | ||
| 342 | ctx->sched[0xb] = be32_to_cpu(k); ror56_64(k, 11); | ||
| 343 | ctx->sched[0xc] = be32_to_cpu(k); ror56_64(k, 11); | ||
| 344 | ctx->sched[0xd] = be32_to_cpu(k); ror56_64(k, 11); | ||
| 345 | ctx->sched[0xe] = be32_to_cpu(k); ror56_64(k, 11); | ||
| 346 | ctx->sched[0xf] = be32_to_cpu(k); | ||
| 347 | |||
| 348 | return 0; | ||
| 349 | #else | ||
| 350 | u32 hi, lo; /* hi is upper 24 bits and lo lower 32, total 56 */ | ||
| 351 | |||
| 352 | /* discard the parity bits */ | ||
| 353 | lo = (*key++) >> 1; | ||
| 354 | lo <<= 7; | ||
| 355 | lo |= (*key++) >> 1; | ||
| 356 | lo <<= 7; | ||
| 357 | lo |= (*key++) >> 1; | ||
| 358 | lo <<= 7; | ||
| 359 | lo |= (*key++) >> 1; | ||
| 360 | hi = lo >> 4; | ||
| 361 | lo &= 0xf; | ||
| 362 | lo <<= 7; | ||
| 363 | lo |= (*key++) >> 1; | ||
| 364 | lo <<= 7; | ||
| 365 | lo |= (*key++) >> 1; | ||
| 366 | lo <<= 7; | ||
| 367 | lo |= (*key++) >> 1; | ||
| 368 | lo <<= 7; | ||
| 369 | lo |= (*key) >> 1; | ||
| 370 | |||
| 371 | /* Use lower 32 bits for schedule, rotate by 11 each round (16 times) */ | ||
| 372 | ctx->sched[0x0] = be32_to_cpu(lo); ror56(hi, lo, 11); | ||
| 373 | ctx->sched[0x1] = be32_to_cpu(lo); ror56(hi, lo, 11); | ||
| 374 | ctx->sched[0x2] = be32_to_cpu(lo); ror56(hi, lo, 11); | ||
| 375 | ctx->sched[0x3] = be32_to_cpu(lo); ror56(hi, lo, 11); | ||
| 376 | ctx->sched[0x4] = be32_to_cpu(lo); ror56(hi, lo, 11); | ||
| 377 | ctx->sched[0x5] = be32_to_cpu(lo); ror56(hi, lo, 11); | ||
| 378 | ctx->sched[0x6] = be32_to_cpu(lo); ror56(hi, lo, 11); | ||
| 379 | ctx->sched[0x7] = be32_to_cpu(lo); ror56(hi, lo, 11); | ||
| 380 | ctx->sched[0x8] = be32_to_cpu(lo); ror56(hi, lo, 11); | ||
| 381 | ctx->sched[0x9] = be32_to_cpu(lo); ror56(hi, lo, 11); | ||
| 382 | ctx->sched[0xa] = be32_to_cpu(lo); ror56(hi, lo, 11); | ||
| 383 | ctx->sched[0xb] = be32_to_cpu(lo); ror56(hi, lo, 11); | ||
| 384 | ctx->sched[0xc] = be32_to_cpu(lo); ror56(hi, lo, 11); | ||
| 385 | ctx->sched[0xd] = be32_to_cpu(lo); ror56(hi, lo, 11); | ||
| 386 | ctx->sched[0xe] = be32_to_cpu(lo); ror56(hi, lo, 11); | ||
| 387 | ctx->sched[0xf] = be32_to_cpu(lo); | ||
| 388 | return 0; | ||
| 389 | #endif | ||
| 390 | } | ||
| 391 | |||
| 392 | static struct crypto_alg fcrypt_alg = { | ||
| 393 | .cra_name = "fcrypt", | ||
| 394 | .cra_flags = CRYPTO_ALG_TYPE_CIPHER, | ||
| 395 | .cra_blocksize = 8, | ||
| 396 | .cra_ctxsize = sizeof(struct fcrypt_ctx), | ||
| 397 | .cra_module = THIS_MODULE, | ||
| 398 | .cra_alignmask = 3, | ||
| 399 | .cra_list = LIST_HEAD_INIT(fcrypt_alg.cra_list), | ||
| 400 | .cra_u = { .cipher = { | ||
| 401 | .cia_min_keysize = 8, | ||
| 402 | .cia_max_keysize = 8, | ||
| 403 | .cia_setkey = fcrypt_setkey, | ||
| 404 | .cia_encrypt = fcrypt_encrypt, | ||
| 405 | .cia_decrypt = fcrypt_decrypt } } | ||
| 406 | }; | ||
| 407 | |||
| 408 | static int __init init(void) | ||
| 409 | { | ||
| 410 | return crypto_register_alg(&fcrypt_alg); | ||
| 411 | } | ||
| 412 | |||
| 413 | static void __exit fini(void) | ||
| 414 | { | ||
| 415 | crypto_unregister_alg(&fcrypt_alg); | ||
| 416 | } | ||
| 417 | |||
| 418 | module_init(init); | ||
| 419 | module_exit(fini); | ||
| 420 | |||
| 421 | MODULE_LICENSE("Dual BSD/GPL"); | ||
| 422 | MODULE_DESCRIPTION("FCrypt Cipher Algorithm"); | ||
| 423 | MODULE_AUTHOR("David Howells <dhowells@redhat.com>"); | ||
diff --git a/crypto/hash.c b/crypto/hash.c index cdec23d885fe..12c4514f3478 100644 --- a/crypto/hash.c +++ b/crypto/hash.c | |||
| @@ -16,12 +16,13 @@ | |||
| 16 | 16 | ||
| 17 | #include "internal.h" | 17 | #include "internal.h" |
| 18 | 18 | ||
| 19 | static unsigned int crypto_hash_ctxsize(struct crypto_alg *alg) | 19 | static unsigned int crypto_hash_ctxsize(struct crypto_alg *alg, u32 type, |
| 20 | u32 mask) | ||
| 20 | { | 21 | { |
| 21 | return alg->cra_ctxsize; | 22 | return alg->cra_ctxsize; |
| 22 | } | 23 | } |
| 23 | 24 | ||
| 24 | static int crypto_init_hash_ops(struct crypto_tfm *tfm) | 25 | static int crypto_init_hash_ops(struct crypto_tfm *tfm, u32 type, u32 mask) |
| 25 | { | 26 | { |
| 26 | struct hash_tfm *crt = &tfm->crt_hash; | 27 | struct hash_tfm *crt = &tfm->crt_hash; |
| 27 | struct hash_alg *alg = &tfm->__crt_alg->cra_hash; | 28 | struct hash_alg *alg = &tfm->__crt_alg->cra_hash; |
diff --git a/crypto/hmac.c b/crypto/hmac.c index b521bcd2b2c6..44187c5ee593 100644 --- a/crypto/hmac.c +++ b/crypto/hmac.c | |||
| @@ -172,15 +172,16 @@ static int hmac_digest(struct hash_desc *pdesc, struct scatterlist *sg, | |||
| 172 | 172 | ||
| 173 | static int hmac_init_tfm(struct crypto_tfm *tfm) | 173 | static int hmac_init_tfm(struct crypto_tfm *tfm) |
| 174 | { | 174 | { |
| 175 | struct crypto_hash *hash; | ||
| 175 | struct crypto_instance *inst = (void *)tfm->__crt_alg; | 176 | struct crypto_instance *inst = (void *)tfm->__crt_alg; |
| 176 | struct crypto_spawn *spawn = crypto_instance_ctx(inst); | 177 | struct crypto_spawn *spawn = crypto_instance_ctx(inst); |
| 177 | struct hmac_ctx *ctx = hmac_ctx(__crypto_hash_cast(tfm)); | 178 | struct hmac_ctx *ctx = hmac_ctx(__crypto_hash_cast(tfm)); |
| 178 | 179 | ||
| 179 | tfm = crypto_spawn_tfm(spawn); | 180 | hash = crypto_spawn_hash(spawn); |
| 180 | if (IS_ERR(tfm)) | 181 | if (IS_ERR(hash)) |
| 181 | return PTR_ERR(tfm); | 182 | return PTR_ERR(hash); |
| 182 | 183 | ||
| 183 | ctx->child = crypto_hash_cast(tfm); | 184 | ctx->child = hash; |
| 184 | return 0; | 185 | return 0; |
| 185 | } | 186 | } |
| 186 | 187 | ||
diff --git a/crypto/internal.h b/crypto/internal.h index 2da6ad4f3593..60acad9788c5 100644 --- a/crypto/internal.h +++ b/crypto/internal.h | |||
| @@ -83,8 +83,7 @@ static inline void crypto_exit_proc(void) | |||
| 83 | { } | 83 | { } |
| 84 | #endif | 84 | #endif |
| 85 | 85 | ||
| 86 | static inline unsigned int crypto_digest_ctxsize(struct crypto_alg *alg, | 86 | static inline unsigned int crypto_digest_ctxsize(struct crypto_alg *alg) |
| 87 | int flags) | ||
| 88 | { | 87 | { |
| 89 | unsigned int len = alg->cra_ctxsize; | 88 | unsigned int len = alg->cra_ctxsize; |
| 90 | 89 | ||
| @@ -96,23 +95,12 @@ static inline unsigned int crypto_digest_ctxsize(struct crypto_alg *alg, | |||
| 96 | return len; | 95 | return len; |
| 97 | } | 96 | } |
| 98 | 97 | ||
| 99 | static inline unsigned int crypto_cipher_ctxsize(struct crypto_alg *alg, | 98 | static inline unsigned int crypto_cipher_ctxsize(struct crypto_alg *alg) |
| 100 | int flags) | ||
| 101 | { | 99 | { |
| 102 | unsigned int len = alg->cra_ctxsize; | 100 | return alg->cra_ctxsize; |
| 103 | |||
| 104 | switch (flags & CRYPTO_TFM_MODE_MASK) { | ||
| 105 | case CRYPTO_TFM_MODE_CBC: | ||
| 106 | len = ALIGN(len, (unsigned long)alg->cra_alignmask + 1); | ||
| 107 | len += alg->cra_blocksize; | ||
| 108 | break; | ||
| 109 | } | ||
| 110 | |||
| 111 | return len; | ||
| 112 | } | 101 | } |
| 113 | 102 | ||
| 114 | static inline unsigned int crypto_compress_ctxsize(struct crypto_alg *alg, | 103 | static inline unsigned int crypto_compress_ctxsize(struct crypto_alg *alg) |
| 115 | int flags) | ||
| 116 | { | 104 | { |
| 117 | return alg->cra_ctxsize; | 105 | return alg->cra_ctxsize; |
| 118 | } | 106 | } |
| @@ -121,10 +109,6 @@ struct crypto_alg *crypto_mod_get(struct crypto_alg *alg); | |||
| 121 | struct crypto_alg *__crypto_alg_lookup(const char *name, u32 type, u32 mask); | 109 | struct crypto_alg *__crypto_alg_lookup(const char *name, u32 type, u32 mask); |
| 122 | struct crypto_alg *crypto_alg_mod_lookup(const char *name, u32 type, u32 mask); | 110 | struct crypto_alg *crypto_alg_mod_lookup(const char *name, u32 type, u32 mask); |
| 123 | 111 | ||
| 124 | int crypto_init_digest_flags(struct crypto_tfm *tfm, u32 flags); | ||
| 125 | int crypto_init_cipher_flags(struct crypto_tfm *tfm, u32 flags); | ||
| 126 | int crypto_init_compress_flags(struct crypto_tfm *tfm, u32 flags); | ||
| 127 | |||
| 128 | int crypto_init_digest_ops(struct crypto_tfm *tfm); | 112 | int crypto_init_digest_ops(struct crypto_tfm *tfm); |
| 129 | int crypto_init_cipher_ops(struct crypto_tfm *tfm); | 113 | int crypto_init_cipher_ops(struct crypto_tfm *tfm); |
| 130 | int crypto_init_compress_ops(struct crypto_tfm *tfm); | 114 | int crypto_init_compress_ops(struct crypto_tfm *tfm); |
| @@ -136,7 +120,8 @@ void crypto_exit_compress_ops(struct crypto_tfm *tfm); | |||
| 136 | void crypto_larval_error(const char *name, u32 type, u32 mask); | 120 | void crypto_larval_error(const char *name, u32 type, u32 mask); |
| 137 | 121 | ||
| 138 | void crypto_shoot_alg(struct crypto_alg *alg); | 122 | void crypto_shoot_alg(struct crypto_alg *alg); |
| 139 | struct crypto_tfm *__crypto_alloc_tfm(struct crypto_alg *alg, u32 flags); | 123 | struct crypto_tfm *__crypto_alloc_tfm(struct crypto_alg *alg, u32 type, |
| 124 | u32 mask); | ||
| 140 | 125 | ||
| 141 | int crypto_register_instance(struct crypto_template *tmpl, | 126 | int crypto_register_instance(struct crypto_template *tmpl, |
| 142 | struct crypto_instance *inst); | 127 | struct crypto_instance *inst); |
diff --git a/crypto/lrw.c b/crypto/lrw.c index 56642586d84f..b4105080ac7a 100644 --- a/crypto/lrw.c +++ b/crypto/lrw.c | |||
| @@ -201,21 +201,22 @@ static int decrypt(struct blkcipher_desc *desc, struct scatterlist *dst, | |||
| 201 | 201 | ||
| 202 | static int init_tfm(struct crypto_tfm *tfm) | 202 | static int init_tfm(struct crypto_tfm *tfm) |
| 203 | { | 203 | { |
| 204 | struct crypto_cipher *cipher; | ||
| 204 | struct crypto_instance *inst = (void *)tfm->__crt_alg; | 205 | struct crypto_instance *inst = (void *)tfm->__crt_alg; |
| 205 | struct crypto_spawn *spawn = crypto_instance_ctx(inst); | 206 | struct crypto_spawn *spawn = crypto_instance_ctx(inst); |
| 206 | struct priv *ctx = crypto_tfm_ctx(tfm); | 207 | struct priv *ctx = crypto_tfm_ctx(tfm); |
| 207 | u32 *flags = &tfm->crt_flags; | 208 | u32 *flags = &tfm->crt_flags; |
| 208 | 209 | ||
| 209 | tfm = crypto_spawn_tfm(spawn); | 210 | cipher = crypto_spawn_cipher(spawn); |
| 210 | if (IS_ERR(tfm)) | 211 | if (IS_ERR(cipher)) |
| 211 | return PTR_ERR(tfm); | 212 | return PTR_ERR(cipher); |
| 212 | 213 | ||
| 213 | if (crypto_tfm_alg_blocksize(tfm) != 16) { | 214 | if (crypto_cipher_blocksize(cipher) != 16) { |
| 214 | *flags |= CRYPTO_TFM_RES_BAD_BLOCK_LEN; | 215 | *flags |= CRYPTO_TFM_RES_BAD_BLOCK_LEN; |
| 215 | return -EINVAL; | 216 | return -EINVAL; |
| 216 | } | 217 | } |
| 217 | 218 | ||
| 218 | ctx->child = crypto_cipher_cast(tfm); | 219 | ctx->child = cipher; |
| 219 | return 0; | 220 | return 0; |
| 220 | } | 221 | } |
| 221 | 222 | ||
diff --git a/crypto/pcbc.c b/crypto/pcbc.c new file mode 100644 index 000000000000..5174d7fdad6e --- /dev/null +++ b/crypto/pcbc.c | |||
| @@ -0,0 +1,349 @@ | |||
| 1 | /* | ||
| 2 | * PCBC: Propagating Cipher Block Chaining mode | ||
| 3 | * | ||
| 4 | * Copyright (C) 2006 Red Hat, Inc. All Rights Reserved. | ||
| 5 | * Written by David Howells (dhowells@redhat.com) | ||
| 6 | * | ||
| 7 | * Derived from cbc.c | ||
| 8 | * - Copyright (c) 2006 Herbert Xu <herbert@gondor.apana.org.au> | ||
| 9 | * | ||
| 10 | * This program is free software; you can redistribute it and/or modify it | ||
| 11 | * under the terms of the GNU General Public License as published by the Free | ||
| 12 | * Software Foundation; either version 2 of the License, or (at your option) | ||
| 13 | * any later version. | ||
| 14 | * | ||
| 15 | */ | ||
| 16 | |||
| 17 | #include <crypto/algapi.h> | ||
| 18 | #include <linux/err.h> | ||
| 19 | #include <linux/init.h> | ||
| 20 | #include <linux/kernel.h> | ||
| 21 | #include <linux/module.h> | ||
| 22 | #include <linux/scatterlist.h> | ||
| 23 | #include <linux/slab.h> | ||
| 24 | |||
| 25 | struct crypto_pcbc_ctx { | ||
| 26 | struct crypto_cipher *child; | ||
| 27 | void (*xor)(u8 *dst, const u8 *src, unsigned int bs); | ||
| 28 | }; | ||
| 29 | |||
| 30 | static int crypto_pcbc_setkey(struct crypto_tfm *parent, const u8 *key, | ||
| 31 | unsigned int keylen) | ||
| 32 | { | ||
| 33 | struct crypto_pcbc_ctx *ctx = crypto_tfm_ctx(parent); | ||
| 34 | struct crypto_cipher *child = ctx->child; | ||
| 35 | int err; | ||
| 36 | |||
| 37 | crypto_cipher_clear_flags(child, CRYPTO_TFM_REQ_MASK); | ||
| 38 | crypto_cipher_set_flags(child, crypto_tfm_get_flags(parent) & | ||
| 39 | CRYPTO_TFM_REQ_MASK); | ||
| 40 | err = crypto_cipher_setkey(child, key, keylen); | ||
| 41 | crypto_tfm_set_flags(parent, crypto_cipher_get_flags(child) & | ||
| 42 | CRYPTO_TFM_RES_MASK); | ||
| 43 | return err; | ||
| 44 | } | ||
| 45 | |||
| 46 | static int crypto_pcbc_encrypt_segment(struct blkcipher_desc *desc, | ||
| 47 | struct blkcipher_walk *walk, | ||
| 48 | struct crypto_cipher *tfm, | ||
| 49 | void (*xor)(u8 *, const u8 *, | ||
| 50 | unsigned int)) | ||
| 51 | { | ||
| 52 | void (*fn)(struct crypto_tfm *, u8 *, const u8 *) = | ||
| 53 | crypto_cipher_alg(tfm)->cia_encrypt; | ||
| 54 | int bsize = crypto_cipher_blocksize(tfm); | ||
| 55 | unsigned int nbytes = walk->nbytes; | ||
| 56 | u8 *src = walk->src.virt.addr; | ||
| 57 | u8 *dst = walk->dst.virt.addr; | ||
| 58 | u8 *iv = walk->iv; | ||
| 59 | |||
| 60 | do { | ||
| 61 | xor(iv, src, bsize); | ||
| 62 | fn(crypto_cipher_tfm(tfm), dst, iv); | ||
| 63 | memcpy(iv, dst, bsize); | ||
| 64 | xor(iv, src, bsize); | ||
| 65 | |||
| 66 | src += bsize; | ||
| 67 | dst += bsize; | ||
| 68 | } while ((nbytes -= bsize) >= bsize); | ||
| 69 | |||
| 70 | return nbytes; | ||
| 71 | } | ||
| 72 | |||
| 73 | static int crypto_pcbc_encrypt_inplace(struct blkcipher_desc *desc, | ||
| 74 | struct blkcipher_walk *walk, | ||
| 75 | struct crypto_cipher *tfm, | ||
| 76 | void (*xor)(u8 *, const u8 *, | ||
| 77 | unsigned int)) | ||
| 78 | { | ||
| 79 | void (*fn)(struct crypto_tfm *, u8 *, const u8 *) = | ||
| 80 | crypto_cipher_alg(tfm)->cia_encrypt; | ||
| 81 | int bsize = crypto_cipher_blocksize(tfm); | ||
| 82 | unsigned int nbytes = walk->nbytes; | ||
| 83 | u8 *src = walk->src.virt.addr; | ||
| 84 | u8 *iv = walk->iv; | ||
| 85 | u8 tmpbuf[bsize]; | ||
| 86 | |||
| 87 | do { | ||
| 88 | memcpy(tmpbuf, src, bsize); | ||
| 89 | xor(iv, tmpbuf, bsize); | ||
| 90 | fn(crypto_cipher_tfm(tfm), src, iv); | ||
| 91 | memcpy(iv, src, bsize); | ||
| 92 | xor(iv, tmpbuf, bsize); | ||
| 93 | |||
| 94 | src += bsize; | ||
| 95 | } while ((nbytes -= bsize) >= bsize); | ||
| 96 | |||
| 97 | memcpy(walk->iv, iv, bsize); | ||
| 98 | |||
| 99 | return nbytes; | ||
| 100 | } | ||
| 101 | |||
| 102 | static int crypto_pcbc_encrypt(struct blkcipher_desc *desc, | ||
| 103 | struct scatterlist *dst, struct scatterlist *src, | ||
| 104 | unsigned int nbytes) | ||
| 105 | { | ||
| 106 | struct blkcipher_walk walk; | ||
| 107 | struct crypto_blkcipher *tfm = desc->tfm; | ||
| 108 | struct crypto_pcbc_ctx *ctx = crypto_blkcipher_ctx(tfm); | ||
| 109 | struct crypto_cipher *child = ctx->child; | ||
| 110 | void (*xor)(u8 *, const u8 *, unsigned int bs) = ctx->xor; | ||
| 111 | int err; | ||
| 112 | |||
| 113 | blkcipher_walk_init(&walk, dst, src, nbytes); | ||
| 114 | err = blkcipher_walk_virt(desc, &walk); | ||
| 115 | |||
| 116 | while ((nbytes = walk.nbytes)) { | ||
| 117 | if (walk.src.virt.addr == walk.dst.virt.addr) | ||
| 118 | nbytes = crypto_pcbc_encrypt_inplace(desc, &walk, child, | ||
| 119 | xor); | ||
| 120 | else | ||
| 121 | nbytes = crypto_pcbc_encrypt_segment(desc, &walk, child, | ||
| 122 | xor); | ||
| 123 | err = blkcipher_walk_done(desc, &walk, nbytes); | ||
| 124 | } | ||
| 125 | |||
| 126 | return err; | ||
| 127 | } | ||
| 128 | |||
| 129 | static int crypto_pcbc_decrypt_segment(struct blkcipher_desc *desc, | ||
| 130 | struct blkcipher_walk *walk, | ||
| 131 | struct crypto_cipher *tfm, | ||
| 132 | void (*xor)(u8 *, const u8 *, | ||
| 133 | unsigned int)) | ||
| 134 | { | ||
| 135 | void (*fn)(struct crypto_tfm *, u8 *, const u8 *) = | ||
| 136 | crypto_cipher_alg(tfm)->cia_decrypt; | ||
| 137 | int bsize = crypto_cipher_blocksize(tfm); | ||
| 138 | unsigned int nbytes = walk->nbytes; | ||
| 139 | u8 *src = walk->src.virt.addr; | ||
| 140 | u8 *dst = walk->dst.virt.addr; | ||
| 141 | u8 *iv = walk->iv; | ||
| 142 | |||
| 143 | do { | ||
| 144 | fn(crypto_cipher_tfm(tfm), dst, src); | ||
| 145 | xor(dst, iv, bsize); | ||
| 146 | memcpy(iv, src, bsize); | ||
| 147 | xor(iv, dst, bsize); | ||
| 148 | |||
| 149 | src += bsize; | ||
| 150 | dst += bsize; | ||
| 151 | } while ((nbytes -= bsize) >= bsize); | ||
| 152 | |||
| 153 | memcpy(walk->iv, iv, bsize); | ||
| 154 | |||
| 155 | return nbytes; | ||
| 156 | } | ||
| 157 | |||
| 158 | static int crypto_pcbc_decrypt_inplace(struct blkcipher_desc *desc, | ||
| 159 | struct blkcipher_walk *walk, | ||
| 160 | struct crypto_cipher *tfm, | ||
| 161 | void (*xor)(u8 *, const u8 *, | ||
| 162 | unsigned int)) | ||
| 163 | { | ||
| 164 | void (*fn)(struct crypto_tfm *, u8 *, const u8 *) = | ||
| 165 | crypto_cipher_alg(tfm)->cia_decrypt; | ||
| 166 | int bsize = crypto_cipher_blocksize(tfm); | ||
| 167 | unsigned int nbytes = walk->nbytes; | ||
| 168 | u8 *src = walk->src.virt.addr; | ||
| 169 | u8 *iv = walk->iv; | ||
| 170 | u8 tmpbuf[bsize]; | ||
| 171 | |||
| 172 | do { | ||
| 173 | memcpy(tmpbuf, src, bsize); | ||
| 174 | fn(crypto_cipher_tfm(tfm), src, src); | ||
| 175 | xor(src, iv, bsize); | ||
| 176 | memcpy(iv, tmpbuf, bsize); | ||
| 177 | xor(iv, src, bsize); | ||
| 178 | |||
| 179 | src += bsize; | ||
| 180 | } while ((nbytes -= bsize) >= bsize); | ||
| 181 | |||
| 182 | memcpy(walk->iv, iv, bsize); | ||
| 183 | |||
| 184 | return nbytes; | ||
| 185 | } | ||
| 186 | |||
| 187 | static int crypto_pcbc_decrypt(struct blkcipher_desc *desc, | ||
| 188 | struct scatterlist *dst, struct scatterlist *src, | ||
| 189 | unsigned int nbytes) | ||
| 190 | { | ||
| 191 | struct blkcipher_walk walk; | ||
| 192 | struct crypto_blkcipher *tfm = desc->tfm; | ||
| 193 | struct crypto_pcbc_ctx *ctx = crypto_blkcipher_ctx(tfm); | ||
| 194 | struct crypto_cipher *child = ctx->child; | ||
| 195 | void (*xor)(u8 *, const u8 *, unsigned int bs) = ctx->xor; | ||
| 196 | int err; | ||
| 197 | |||
| 198 | blkcipher_walk_init(&walk, dst, src, nbytes); | ||
| 199 | err = blkcipher_walk_virt(desc, &walk); | ||
| 200 | |||
| 201 | while ((nbytes = walk.nbytes)) { | ||
| 202 | if (walk.src.virt.addr == walk.dst.virt.addr) | ||
| 203 | nbytes = crypto_pcbc_decrypt_inplace(desc, &walk, child, | ||
| 204 | xor); | ||
| 205 | else | ||
| 206 | nbytes = crypto_pcbc_decrypt_segment(desc, &walk, child, | ||
| 207 | xor); | ||
| 208 | err = blkcipher_walk_done(desc, &walk, nbytes); | ||
| 209 | } | ||
| 210 | |||
| 211 | return err; | ||
| 212 | } | ||
| 213 | |||
| 214 | static void xor_byte(u8 *a, const u8 *b, unsigned int bs) | ||
| 215 | { | ||
| 216 | do { | ||
| 217 | *a++ ^= *b++; | ||
| 218 | } while (--bs); | ||
| 219 | } | ||
| 220 | |||
| 221 | static void xor_quad(u8 *dst, const u8 *src, unsigned int bs) | ||
| 222 | { | ||
| 223 | u32 *a = (u32 *)dst; | ||
| 224 | u32 *b = (u32 *)src; | ||
| 225 | |||
| 226 | do { | ||
| 227 | *a++ ^= *b++; | ||
| 228 | } while ((bs -= 4)); | ||
| 229 | } | ||
| 230 | |||
| 231 | static void xor_64(u8 *a, const u8 *b, unsigned int bs) | ||
| 232 | { | ||
| 233 | ((u32 *)a)[0] ^= ((u32 *)b)[0]; | ||
| 234 | ((u32 *)a)[1] ^= ((u32 *)b)[1]; | ||
| 235 | } | ||
| 236 | |||
| 237 | static void xor_128(u8 *a, const u8 *b, unsigned int bs) | ||
| 238 | { | ||
| 239 | ((u32 *)a)[0] ^= ((u32 *)b)[0]; | ||
| 240 | ((u32 *)a)[1] ^= ((u32 *)b)[1]; | ||
| 241 | ((u32 *)a)[2] ^= ((u32 *)b)[2]; | ||
| 242 | ((u32 *)a)[3] ^= ((u32 *)b)[3]; | ||
| 243 | } | ||
| 244 | |||
| 245 | static int crypto_pcbc_init_tfm(struct crypto_tfm *tfm) | ||
| 246 | { | ||
| 247 | struct crypto_instance *inst = (void *)tfm->__crt_alg; | ||
| 248 | struct crypto_spawn *spawn = crypto_instance_ctx(inst); | ||
| 249 | struct crypto_pcbc_ctx *ctx = crypto_tfm_ctx(tfm); | ||
| 250 | struct crypto_cipher *cipher; | ||
| 251 | |||
| 252 | switch (crypto_tfm_alg_blocksize(tfm)) { | ||
| 253 | case 8: | ||
| 254 | ctx->xor = xor_64; | ||
| 255 | break; | ||
| 256 | |||
| 257 | case 16: | ||
| 258 | ctx->xor = xor_128; | ||
| 259 | break; | ||
| 260 | |||
| 261 | default: | ||
| 262 | if (crypto_tfm_alg_blocksize(tfm) % 4) | ||
| 263 | ctx->xor = xor_byte; | ||
| 264 | else | ||
| 265 | ctx->xor = xor_quad; | ||
| 266 | } | ||
| 267 | |||
| 268 | cipher = crypto_spawn_cipher(spawn); | ||
| 269 | if (IS_ERR(cipher)) | ||
| 270 | return PTR_ERR(cipher); | ||
| 271 | |||
| 272 | ctx->child = cipher; | ||
| 273 | return 0; | ||
| 274 | } | ||
| 275 | |||
| 276 | static void crypto_pcbc_exit_tfm(struct crypto_tfm *tfm) | ||
| 277 | { | ||
| 278 | struct crypto_pcbc_ctx *ctx = crypto_tfm_ctx(tfm); | ||
| 279 | crypto_free_cipher(ctx->child); | ||
| 280 | } | ||
| 281 | |||
| 282 | static struct crypto_instance *crypto_pcbc_alloc(void *param, unsigned int len) | ||
| 283 | { | ||
| 284 | struct crypto_instance *inst; | ||
| 285 | struct crypto_alg *alg; | ||
| 286 | |||
| 287 | alg = crypto_get_attr_alg(param, len, CRYPTO_ALG_TYPE_CIPHER, | ||
| 288 | CRYPTO_ALG_TYPE_MASK | CRYPTO_ALG_ASYNC); | ||
| 289 | if (IS_ERR(alg)) | ||
| 290 | return ERR_PTR(PTR_ERR(alg)); | ||
| 291 | |||
| 292 | inst = crypto_alloc_instance("pcbc", alg); | ||
| 293 | if (IS_ERR(inst)) | ||
| 294 | goto out_put_alg; | ||
| 295 | |||
| 296 | inst->alg.cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER; | ||
| 297 | inst->alg.cra_priority = alg->cra_priority; | ||
| 298 | inst->alg.cra_blocksize = alg->cra_blocksize; | ||
| 299 | inst->alg.cra_alignmask = alg->cra_alignmask; | ||
| 300 | inst->alg.cra_type = &crypto_blkcipher_type; | ||
| 301 | |||
| 302 | if (!(alg->cra_blocksize % 4)) | ||
| 303 | inst->alg.cra_alignmask |= 3; | ||
| 304 | inst->alg.cra_blkcipher.ivsize = alg->cra_blocksize; | ||
| 305 | inst->alg.cra_blkcipher.min_keysize = alg->cra_cipher.cia_min_keysize; | ||
| 306 | inst->alg.cra_blkcipher.max_keysize = alg->cra_cipher.cia_max_keysize; | ||
| 307 | |||
| 308 | inst->alg.cra_ctxsize = sizeof(struct crypto_pcbc_ctx); | ||
| 309 | |||
| 310 | inst->alg.cra_init = crypto_pcbc_init_tfm; | ||
| 311 | inst->alg.cra_exit = crypto_pcbc_exit_tfm; | ||
| 312 | |||
| 313 | inst->alg.cra_blkcipher.setkey = crypto_pcbc_setkey; | ||
| 314 | inst->alg.cra_blkcipher.encrypt = crypto_pcbc_encrypt; | ||
| 315 | inst->alg.cra_blkcipher.decrypt = crypto_pcbc_decrypt; | ||
| 316 | |||
| 317 | out_put_alg: | ||
| 318 | crypto_mod_put(alg); | ||
| 319 | return inst; | ||
| 320 | } | ||
| 321 | |||
| 322 | static void crypto_pcbc_free(struct crypto_instance *inst) | ||
| 323 | { | ||
| 324 | crypto_drop_spawn(crypto_instance_ctx(inst)); | ||
| 325 | kfree(inst); | ||
| 326 | } | ||
| 327 | |||
| 328 | static struct crypto_template crypto_pcbc_tmpl = { | ||
| 329 | .name = "pcbc", | ||
| 330 | .alloc = crypto_pcbc_alloc, | ||
| 331 | .free = crypto_pcbc_free, | ||
| 332 | .module = THIS_MODULE, | ||
| 333 | }; | ||
| 334 | |||
| 335 | static int __init crypto_pcbc_module_init(void) | ||
| 336 | { | ||
| 337 | return crypto_register_template(&crypto_pcbc_tmpl); | ||
| 338 | } | ||
| 339 | |||
| 340 | static void __exit crypto_pcbc_module_exit(void) | ||
| 341 | { | ||
| 342 | crypto_unregister_template(&crypto_pcbc_tmpl); | ||
| 343 | } | ||
| 344 | |||
| 345 | module_init(crypto_pcbc_module_init); | ||
| 346 | module_exit(crypto_pcbc_module_exit); | ||
| 347 | |||
| 348 | MODULE_LICENSE("GPL"); | ||
| 349 | MODULE_DESCRIPTION("PCBC block cipher algorithm"); | ||
diff --git a/crypto/tcrypt.c b/crypto/tcrypt.c index d671e8942b1f..f5e9da319ece 100644 --- a/crypto/tcrypt.c +++ b/crypto/tcrypt.c | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | * Software Foundation; either version 2 of the License, or (at your option) | 12 | * Software Foundation; either version 2 of the License, or (at your option) |
| 13 | * any later version. | 13 | * any later version. |
| 14 | * | 14 | * |
| 15 | * 2006-12-07 Added SHA384 HMAC and SHA512 HMAC tests | ||
| 15 | * 2004-08-09 Added cipher speed tests (Reyk Floeter <reyk@vantronix.net>) | 16 | * 2004-08-09 Added cipher speed tests (Reyk Floeter <reyk@vantronix.net>) |
| 16 | * 2003-09-14 Rewritten by Kartikey Mahendra Bhatt | 17 | * 2003-09-14 Rewritten by Kartikey Mahendra Bhatt |
| 17 | * | 18 | * |
| @@ -71,7 +72,8 @@ static char *check[] = { | |||
| 71 | "des", "md5", "des3_ede", "rot13", "sha1", "sha256", "blowfish", | 72 | "des", "md5", "des3_ede", "rot13", "sha1", "sha256", "blowfish", |
| 72 | "twofish", "serpent", "sha384", "sha512", "md4", "aes", "cast6", | 73 | "twofish", "serpent", "sha384", "sha512", "md4", "aes", "cast6", |
| 73 | "arc4", "michael_mic", "deflate", "crc32c", "tea", "xtea", | 74 | "arc4", "michael_mic", "deflate", "crc32c", "tea", "xtea", |
| 74 | "khazad", "wp512", "wp384", "wp256", "tnepres", "xeta", NULL | 75 | "khazad", "wp512", "wp384", "wp256", "tnepres", "xeta", "fcrypt", |
| 76 | "camellia", NULL | ||
| 75 | }; | 77 | }; |
| 76 | 78 | ||
| 77 | static void hexdump(unsigned char *buf, unsigned int len) | 79 | static void hexdump(unsigned char *buf, unsigned int len) |
| @@ -765,7 +767,7 @@ static void test_deflate(void) | |||
| 765 | memcpy(tvmem, deflate_comp_tv_template, tsize); | 767 | memcpy(tvmem, deflate_comp_tv_template, tsize); |
| 766 | tv = (void *)tvmem; | 768 | tv = (void *)tvmem; |
| 767 | 769 | ||
| 768 | tfm = crypto_alloc_tfm("deflate", 0); | 770 | tfm = crypto_alloc_comp("deflate", 0, CRYPTO_ALG_ASYNC); |
| 769 | if (tfm == NULL) { | 771 | if (tfm == NULL) { |
| 770 | printk("failed to load transform for deflate\n"); | 772 | printk("failed to load transform for deflate\n"); |
| 771 | return; | 773 | return; |
| @@ -964,6 +966,26 @@ static void do_test(void) | |||
| 964 | test_cipher("ecb(xeta)", DECRYPT, xeta_dec_tv_template, | 966 | test_cipher("ecb(xeta)", DECRYPT, xeta_dec_tv_template, |
| 965 | XETA_DEC_TEST_VECTORS); | 967 | XETA_DEC_TEST_VECTORS); |
| 966 | 968 | ||
| 969 | //FCrypt | ||
| 970 | test_cipher("pcbc(fcrypt)", ENCRYPT, fcrypt_pcbc_enc_tv_template, | ||
| 971 | FCRYPT_ENC_TEST_VECTORS); | ||
| 972 | test_cipher("pcbc(fcrypt)", DECRYPT, fcrypt_pcbc_dec_tv_template, | ||
| 973 | FCRYPT_DEC_TEST_VECTORS); | ||
| 974 | |||
| 975 | //CAMELLIA | ||
| 976 | test_cipher("ecb(camellia)", ENCRYPT, | ||
| 977 | camellia_enc_tv_template, | ||
| 978 | CAMELLIA_ENC_TEST_VECTORS); | ||
| 979 | test_cipher("ecb(camellia)", DECRYPT, | ||
| 980 | camellia_dec_tv_template, | ||
| 981 | CAMELLIA_DEC_TEST_VECTORS); | ||
| 982 | test_cipher("cbc(camellia)", ENCRYPT, | ||
| 983 | camellia_cbc_enc_tv_template, | ||
| 984 | CAMELLIA_CBC_ENC_TEST_VECTORS); | ||
| 985 | test_cipher("cbc(camellia)", DECRYPT, | ||
| 986 | camellia_cbc_dec_tv_template, | ||
| 987 | CAMELLIA_CBC_DEC_TEST_VECTORS); | ||
| 988 | |||
| 967 | test_hash("sha384", sha384_tv_template, SHA384_TEST_VECTORS); | 989 | test_hash("sha384", sha384_tv_template, SHA384_TEST_VECTORS); |
| 968 | test_hash("sha512", sha512_tv_template, SHA512_TEST_VECTORS); | 990 | test_hash("sha512", sha512_tv_template, SHA512_TEST_VECTORS); |
| 969 | test_hash("wp512", wp512_tv_template, WP512_TEST_VECTORS); | 991 | test_hash("wp512", wp512_tv_template, WP512_TEST_VECTORS); |
| @@ -980,6 +1002,10 @@ static void do_test(void) | |||
| 980 | HMAC_SHA1_TEST_VECTORS); | 1002 | HMAC_SHA1_TEST_VECTORS); |
| 981 | test_hash("hmac(sha256)", hmac_sha256_tv_template, | 1003 | test_hash("hmac(sha256)", hmac_sha256_tv_template, |
| 982 | HMAC_SHA256_TEST_VECTORS); | 1004 | HMAC_SHA256_TEST_VECTORS); |
| 1005 | test_hash("hmac(sha384)", hmac_sha384_tv_template, | ||
| 1006 | HMAC_SHA384_TEST_VECTORS); | ||
| 1007 | test_hash("hmac(sha512)", hmac_sha512_tv_template, | ||
| 1008 | HMAC_SHA512_TEST_VECTORS); | ||
| 983 | 1009 | ||
| 984 | test_hash("xcbc(aes)", aes_xcbc128_tv_template, | 1010 | test_hash("xcbc(aes)", aes_xcbc128_tv_template, |
| 985 | XCBC_AES_TEST_VECTORS); | 1011 | XCBC_AES_TEST_VECTORS); |
| @@ -1177,6 +1203,28 @@ static void do_test(void) | |||
| 1177 | XETA_DEC_TEST_VECTORS); | 1203 | XETA_DEC_TEST_VECTORS); |
| 1178 | break; | 1204 | break; |
| 1179 | 1205 | ||
| 1206 | case 31: | ||
| 1207 | test_cipher("pcbc(fcrypt)", ENCRYPT, fcrypt_pcbc_enc_tv_template, | ||
| 1208 | FCRYPT_ENC_TEST_VECTORS); | ||
| 1209 | test_cipher("pcbc(fcrypt)", DECRYPT, fcrypt_pcbc_dec_tv_template, | ||
| 1210 | FCRYPT_DEC_TEST_VECTORS); | ||
| 1211 | break; | ||
| 1212 | |||
| 1213 | case 32: | ||
| 1214 | test_cipher("ecb(camellia)", ENCRYPT, | ||
| 1215 | camellia_enc_tv_template, | ||
| 1216 | CAMELLIA_ENC_TEST_VECTORS); | ||
| 1217 | test_cipher("ecb(camellia)", DECRYPT, | ||
| 1218 | camellia_dec_tv_template, | ||
| 1219 | CAMELLIA_DEC_TEST_VECTORS); | ||
| 1220 | test_cipher("cbc(camellia)", ENCRYPT, | ||
| 1221 | camellia_cbc_enc_tv_template, | ||
| 1222 | CAMELLIA_CBC_ENC_TEST_VECTORS); | ||
| 1223 | test_cipher("cbc(camellia)", DECRYPT, | ||
| 1224 | camellia_cbc_dec_tv_template, | ||
| 1225 | CAMELLIA_CBC_DEC_TEST_VECTORS); | ||
| 1226 | break; | ||
| 1227 | |||
| 1180 | case 100: | 1228 | case 100: |
| 1181 | test_hash("hmac(md5)", hmac_md5_tv_template, | 1229 | test_hash("hmac(md5)", hmac_md5_tv_template, |
| 1182 | HMAC_MD5_TEST_VECTORS); | 1230 | HMAC_MD5_TEST_VECTORS); |
| @@ -1192,6 +1240,16 @@ static void do_test(void) | |||
| 1192 | HMAC_SHA256_TEST_VECTORS); | 1240 | HMAC_SHA256_TEST_VECTORS); |
| 1193 | break; | 1241 | break; |
| 1194 | 1242 | ||
| 1243 | case 103: | ||
| 1244 | test_hash("hmac(sha384)", hmac_sha384_tv_template, | ||
| 1245 | HMAC_SHA384_TEST_VECTORS); | ||
| 1246 | break; | ||
| 1247 | |||
| 1248 | case 104: | ||
| 1249 | test_hash("hmac(sha512)", hmac_sha512_tv_template, | ||
| 1250 | HMAC_SHA512_TEST_VECTORS); | ||
| 1251 | break; | ||
| 1252 | |||
| 1195 | 1253 | ||
| 1196 | case 200: | 1254 | case 200: |
| 1197 | test_cipher_speed("ecb(aes)", ENCRYPT, sec, NULL, 0, | 1255 | test_cipher_speed("ecb(aes)", ENCRYPT, sec, NULL, 0, |
| @@ -1260,6 +1318,17 @@ static void do_test(void) | |||
| 1260 | des_speed_template); | 1318 | des_speed_template); |
| 1261 | break; | 1319 | break; |
| 1262 | 1320 | ||
| 1321 | case 205: | ||
| 1322 | test_cipher_speed("ecb(camellia)", ENCRYPT, sec, NULL, 0, | ||
| 1323 | camellia_speed_template); | ||
| 1324 | test_cipher_speed("ecb(camellia)", DECRYPT, sec, NULL, 0, | ||
| 1325 | camellia_speed_template); | ||
| 1326 | test_cipher_speed("cbc(camellia)", ENCRYPT, sec, NULL, 0, | ||
| 1327 | camellia_speed_template); | ||
| 1328 | test_cipher_speed("cbc(camellia)", DECRYPT, sec, NULL, 0, | ||
| 1329 | camellia_speed_template); | ||
| 1330 | break; | ||
| 1331 | |||
| 1263 | case 300: | 1332 | case 300: |
| 1264 | /* fall through */ | 1333 | /* fall through */ |
| 1265 | 1334 | ||
diff --git a/crypto/tcrypt.h b/crypto/tcrypt.h index 48a81362cb85..887527bd5bc6 100644 --- a/crypto/tcrypt.h +++ b/crypto/tcrypt.h | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | * Software Foundation; either version 2 of the License, or (at your option) | 12 | * Software Foundation; either version 2 of the License, or (at your option) |
| 13 | * any later version. | 13 | * any later version. |
| 14 | * | 14 | * |
| 15 | * 2006-12-07 Added SHA384 HMAC and SHA512 HMAC tests | ||
| 15 | * 2004-08-09 Cipher speed tests by Reyk Floeter <reyk@vantronix.net> | 16 | * 2004-08-09 Cipher speed tests by Reyk Floeter <reyk@vantronix.net> |
| 16 | * 2003-09-14 Changes by Kartikey Mahendra Bhatt | 17 | * 2003-09-14 Changes by Kartikey Mahendra Bhatt |
| 17 | * | 18 | * |
| @@ -27,7 +28,7 @@ | |||
| 27 | 28 | ||
| 28 | struct hash_testvec { | 29 | struct hash_testvec { |
| 29 | /* only used with keyed hash algorithms */ | 30 | /* only used with keyed hash algorithms */ |
| 30 | char key[128] __attribute__ ((__aligned__(4))); | 31 | char key[132] __attribute__ ((__aligned__(4))); |
| 31 | char plaintext[240]; | 32 | char plaintext[240]; |
| 32 | char digest[MAX_DIGEST_SIZE]; | 33 | char digest[MAX_DIGEST_SIZE]; |
| 33 | unsigned char tap[MAX_TAP]; | 34 | unsigned char tap[MAX_TAP]; |
| @@ -1002,6 +1003,248 @@ static struct hash_testvec aes_xcbc128_tv_template[] = { | |||
| 1002 | }; | 1003 | }; |
| 1003 | 1004 | ||
| 1004 | /* | 1005 | /* |
| 1006 | * SHA384 HMAC test vectors from RFC4231 | ||
| 1007 | */ | ||
| 1008 | |||
| 1009 | #define HMAC_SHA384_TEST_VECTORS 4 | ||
| 1010 | |||
| 1011 | static struct hash_testvec hmac_sha384_tv_template[] = { | ||
| 1012 | { | ||
| 1013 | .key = { 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, | ||
| 1014 | 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, | ||
| 1015 | 0x0b, 0x0b, 0x0b, 0x0b }, // (20 bytes) | ||
| 1016 | .ksize = 20, | ||
| 1017 | .plaintext = { 0x48, 0x69, 0x20, 0x54, 0x68, 0x65, 0x72, 0x65 }, // ("Hi There") | ||
| 1018 | .psize = 8, | ||
| 1019 | .digest = { 0xaf, 0xd0, 0x39, 0x44, 0xd8, 0x48, 0x95, 0x62, | ||
| 1020 | 0x6b, 0x08, 0x25, 0xf4, 0xab, 0x46, 0x90, 0x7f, | ||
| 1021 | 0x15, 0xf9, 0xda, 0xdb, 0xe4, 0x10, 0x1e, 0xc6, | ||
| 1022 | 0x82, 0xaa, 0x03, 0x4c, 0x7c, 0xeb, 0xc5, 0x9c, | ||
| 1023 | 0xfa, 0xea, 0x9e, 0xa9, 0x07, 0x6e, 0xde, 0x7f, | ||
| 1024 | 0x4a, 0xf1, 0x52, 0xe8, 0xb2, 0xfa, 0x9c, 0xb6 }, | ||
| 1025 | }, { | ||
| 1026 | .key = { 0x4a, 0x65, 0x66, 0x65 }, // ("Jefe") | ||
| 1027 | .ksize = 4, | ||
| 1028 | .plaintext = { 0x77, 0x68, 0x61, 0x74, 0x20, 0x64, 0x6f, 0x20, | ||
| 1029 | 0x79, 0x61, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x20, // ("what do ya want ") | ||
| 1030 | 0x66, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x68, | ||
| 1031 | 0x69, 0x6e, 0x67, 0x3f }, // ("for nothing?") | ||
| 1032 | .psize = 28, | ||
| 1033 | .digest = { 0xaf, 0x45, 0xd2, 0xe3, 0x76, 0x48, 0x40, 0x31, | ||
| 1034 | 0x61, 0x7f, 0x78, 0xd2, 0xb5, 0x8a, 0x6b, 0x1b, | ||
| 1035 | 0x9c, 0x7e, 0xf4, 0x64, 0xf5, 0xa0, 0x1b, 0x47, | ||
| 1036 | 0xe4, 0x2e, 0xc3, 0x73, 0x63, 0x22, 0x44, 0x5e, | ||
| 1037 | 0x8e, 0x22, 0x40, 0xca, 0x5e, 0x69, 0xe2, 0xc7, | ||
| 1038 | 0x8b, 0x32, 0x39, 0xec, 0xfa, 0xb2, 0x16, 0x49 }, | ||
| 1039 | .np = 4, | ||
| 1040 | .tap = { 7, 7, 7, 7 } | ||
| 1041 | }, { | ||
| 1042 | .key = { 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1043 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1044 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1045 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1046 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1047 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1048 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1049 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1050 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1051 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1052 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1053 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1054 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1055 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1056 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1057 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1058 | 0xaa, 0xaa, 0xaa }, // (131 bytes) | ||
| 1059 | .ksize = 131, | ||
| 1060 | .plaintext = { 0x54, 0x65, 0x73, 0x74, 0x20, 0x55, 0x73, 0x69, | ||
| 1061 | 0x6e, 0x67, 0x20, 0x4c, 0x61, 0x72, 0x67, 0x65, // ("Test Using Large") | ||
| 1062 | 0x72, 0x20, 0x54, 0x68, 0x61, 0x6e, 0x20, 0x42, | ||
| 1063 | 0x6c, 0x6f, 0x63, 0x6b, 0x2d, 0x53, 0x69, 0x7a, // ("r Than Block-Siz") | ||
| 1064 | 0x65, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x2d, 0x20, | ||
| 1065 | 0x48, 0x61, 0x73, 0x68, 0x20, 0x4b, 0x65, 0x79, // ("e Key - Hash Key") | ||
| 1066 | 0x20, 0x46, 0x69, 0x72, 0x73, 0x74 }, // (" First") | ||
| 1067 | .psize = 54, | ||
| 1068 | .digest = { 0x4e, 0xce, 0x08, 0x44, 0x85, 0x81, 0x3e, 0x90, | ||
| 1069 | 0x88, 0xd2, 0xc6, 0x3a, 0x04, 0x1b, 0xc5, 0xb4, | ||
| 1070 | 0x4f, 0x9e, 0xf1, 0x01, 0x2a, 0x2b, 0x58, 0x8f, | ||
| 1071 | 0x3c, 0xd1, 0x1f, 0x05, 0x03, 0x3a, 0xc4, 0xc6, | ||
| 1072 | 0x0c, 0x2e, 0xf6, 0xab, 0x40, 0x30, 0xfe, 0x82, | ||
| 1073 | 0x96, 0x24, 0x8d, 0xf1, 0x63, 0xf4, 0x49, 0x52 }, | ||
| 1074 | }, { | ||
| 1075 | .key = { 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1076 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1077 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1078 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1079 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1080 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1081 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1082 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1083 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1084 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1085 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1086 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1087 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1088 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1089 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1090 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1091 | 0xaa, 0xaa, 0xaa }, // (131 bytes) | ||
| 1092 | .ksize = 131, | ||
| 1093 | .plaintext = { 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, | ||
| 1094 | 0x61, 0x20, 0x74, 0x65, 0x73, 0x74, 0x20, 0x75, // ("This is a test u") | ||
| 1095 | 0x73, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x6c, | ||
| 1096 | 0x61, 0x72, 0x67, 0x65, 0x72, 0x20, 0x74, 0x68, // ("sing a larger th") | ||
| 1097 | 0x61, 0x6e, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, | ||
| 1098 | 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6b, 0x65, // ("an block-size ke") | ||
| 1099 | 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x20, | ||
| 1100 | 0x6c, 0x61, 0x72, 0x67, 0x65, 0x72, 0x20, 0x74, // ("y and a larger t") | ||
| 1101 | 0x68, 0x61, 0x6e, 0x20, 0x62, 0x6c, 0x6f, 0x63, | ||
| 1102 | 0x6b, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x64, // ("han block-size d") | ||
| 1103 | 0x61, 0x74, 0x61, 0x2e, 0x20, 0x54, 0x68, 0x65, | ||
| 1104 | 0x20, 0x6b, 0x65, 0x79, 0x20, 0x6e, 0x65, 0x65, // ("ata. The key nee") | ||
| 1105 | 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, | ||
| 1106 | 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x64, 0x20, // ("ds to be hashed ") | ||
| 1107 | 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x62, | ||
| 1108 | 0x65, 0x69, 0x6e, 0x67, 0x20, 0x75, 0x73, 0x65, // ("before being use") | ||
| 1109 | 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, | ||
| 1110 | 0x20, 0x48, 0x4d, 0x41, 0x43, 0x20, 0x61, 0x6c, // ("d by the HMAC al") | ||
| 1111 | 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x2e }, // ("gorithm.") | ||
| 1112 | .psize = 152, | ||
| 1113 | .digest = { 0x66, 0x17, 0x17, 0x8e, 0x94, 0x1f, 0x02, 0x0d, | ||
| 1114 | 0x35, 0x1e, 0x2f, 0x25, 0x4e, 0x8f, 0xd3, 0x2c, | ||
| 1115 | 0x60, 0x24, 0x20, 0xfe, 0xb0, 0xb8, 0xfb, 0x9a, | ||
| 1116 | 0xdc, 0xce, 0xbb, 0x82, 0x46, 0x1e, 0x99, 0xc5, | ||
| 1117 | 0xa6, 0x78, 0xcc, 0x31, 0xe7, 0x99, 0x17, 0x6d, | ||
| 1118 | 0x38, 0x60, 0xe6, 0x11, 0x0c, 0x46, 0x52, 0x3e }, | ||
| 1119 | }, | ||
| 1120 | }; | ||
| 1121 | |||
| 1122 | /* | ||
| 1123 | * SHA512 HMAC test vectors from RFC4231 | ||
| 1124 | */ | ||
| 1125 | |||
| 1126 | #define HMAC_SHA512_TEST_VECTORS 4 | ||
| 1127 | |||
| 1128 | static struct hash_testvec hmac_sha512_tv_template[] = { | ||
| 1129 | { | ||
| 1130 | .key = { 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, | ||
| 1131 | 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, | ||
| 1132 | 0x0b, 0x0b, 0x0b, 0x0b }, // (20 bytes) | ||
| 1133 | .ksize = 20, | ||
| 1134 | .plaintext = { 0x48, 0x69, 0x20, 0x54, 0x68, 0x65, 0x72, 0x65 }, // ("Hi There") | ||
| 1135 | .psize = 8, | ||
| 1136 | .digest = { 0x87, 0xaa, 0x7c, 0xde, 0xa5, 0xef, 0x61, 0x9d, | ||
| 1137 | 0x4f, 0xf0, 0xb4, 0x24, 0x1a, 0x1d, 0x6c, 0xb0, | ||
| 1138 | 0x23, 0x79, 0xf4, 0xe2, 0xce, 0x4e, 0xc2, 0x78, | ||
| 1139 | 0x7a, 0xd0, 0xb3, 0x05, 0x45, 0xe1, 0x7c, 0xde, | ||
| 1140 | 0xda, 0xa8, 0x33, 0xb7, 0xd6, 0xb8, 0xa7, 0x02, | ||
| 1141 | 0x03, 0x8b, 0x27, 0x4e, 0xae, 0xa3, 0xf4, 0xe4, | ||
| 1142 | 0xbe, 0x9d, 0x91, 0x4e, 0xeb, 0x61, 0xf1, 0x70, | ||
| 1143 | 0x2e, 0x69, 0x6c, 0x20, 0x3a, 0x12, 0x68, 0x54 }, | ||
| 1144 | }, { | ||
| 1145 | .key = { 0x4a, 0x65, 0x66, 0x65 }, // ("Jefe") | ||
| 1146 | .ksize = 4, | ||
| 1147 | .plaintext = { 0x77, 0x68, 0x61, 0x74, 0x20, 0x64, 0x6f, 0x20, | ||
| 1148 | 0x79, 0x61, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x20, // ("what do ya want ") | ||
| 1149 | 0x66, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x68, | ||
| 1150 | 0x69, 0x6e, 0x67, 0x3f }, // ("for nothing?") | ||
| 1151 | .psize = 28, | ||
| 1152 | .digest = { 0x16, 0x4b, 0x7a, 0x7b, 0xfc, 0xf8, 0x19, 0xe2, | ||
| 1153 | 0xe3, 0x95, 0xfb, 0xe7, 0x3b, 0x56, 0xe0, 0xa3, | ||
| 1154 | 0x87, 0xbd, 0x64, 0x22, 0x2e, 0x83, 0x1f, 0xd6, | ||
| 1155 | 0x10, 0x27, 0x0c, 0xd7, 0xea, 0x25, 0x05, 0x54, | ||
| 1156 | 0x97, 0x58, 0xbf, 0x75, 0xc0, 0x5a, 0x99, 0x4a, | ||
| 1157 | 0x6d, 0x03, 0x4f, 0x65, 0xf8, 0xf0, 0xe6, 0xfd, | ||
| 1158 | 0xca, 0xea, 0xb1, 0xa3, 0x4d, 0x4a, 0x6b, 0x4b, | ||
| 1159 | 0x63, 0x6e, 0x07, 0x0a, 0x38, 0xbc, 0xe7, 0x37 }, | ||
| 1160 | .np = 4, | ||
| 1161 | .tap = { 7, 7, 7, 7 } | ||
| 1162 | }, { | ||
| 1163 | .key = { 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1164 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1165 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1166 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1167 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1168 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1169 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1170 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1171 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1172 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1173 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1174 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1175 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1176 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1177 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1178 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1179 | 0xaa, 0xaa, 0xaa }, // (131 bytes) | ||
| 1180 | .ksize = 131, | ||
| 1181 | .plaintext = { 0x54, 0x65, 0x73, 0x74, 0x20, 0x55, 0x73, 0x69, | ||
| 1182 | 0x6e, 0x67, 0x20, 0x4c, 0x61, 0x72, 0x67, 0x65, // ("Test Using Large") | ||
| 1183 | 0x72, 0x20, 0x54, 0x68, 0x61, 0x6e, 0x20, 0x42, | ||
| 1184 | 0x6c, 0x6f, 0x63, 0x6b, 0x2d, 0x53, 0x69, 0x7a, // ("r Than Block-Siz") | ||
| 1185 | 0x65, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x2d, 0x20, | ||
| 1186 | 0x48, 0x61, 0x73, 0x68, 0x20, 0x4b, 0x65, 0x79, // ("e Key - Hash Key") | ||
| 1187 | 0x20, 0x46, 0x69, 0x72, 0x73, 0x74 }, // (" First") | ||
| 1188 | .psize = 54, | ||
| 1189 | .digest = { 0x80, 0xb2, 0x42, 0x63, 0xc7, 0xc1, 0xa3, 0xeb, | ||
| 1190 | 0xb7, 0x14, 0x93, 0xc1, 0xdd, 0x7b, 0xe8, 0xb4, | ||
| 1191 | 0x9b, 0x46, 0xd1, 0xf4, 0x1b, 0x4a, 0xee, 0xc1, | ||
| 1192 | 0x12, 0x1b, 0x01, 0x37, 0x83, 0xf8, 0xf3, 0x52, | ||
| 1193 | 0x6b, 0x56, 0xd0, 0x37, 0xe0, 0x5f, 0x25, 0x98, | ||
| 1194 | 0xbd, 0x0f, 0xd2, 0x21, 0x5d, 0x6a, 0x1e, 0x52, | ||
| 1195 | 0x95, 0xe6, 0x4f, 0x73, 0xf6, 0x3f, 0x0a, 0xec, | ||
| 1196 | 0x8b, 0x91, 0x5a, 0x98, 0x5d, 0x78, 0x65, 0x98 }, | ||
| 1197 | }, { | ||
| 1198 | .key = { 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1199 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1200 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1201 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1202 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1203 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1204 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1205 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1206 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1207 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1208 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1209 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1210 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1211 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1212 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1213 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
| 1214 | 0xaa, 0xaa, 0xaa }, // (131 bytes) | ||
| 1215 | .ksize = 131, | ||
| 1216 | .plaintext = { 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, | ||
| 1217 | 0x61, 0x20, 0x74, 0x65, 0x73, 0x74, 0x20, 0x75, // ("This is a test u") | ||
| 1218 | 0x73, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x6c, | ||
| 1219 | 0x61, 0x72, 0x67, 0x65, 0x72, 0x20, 0x74, 0x68, // ("sing a larger th") | ||
| 1220 | 0x61, 0x6e, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, | ||
| 1221 | 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6b, 0x65, // ("an block-size ke") | ||
| 1222 | 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x20, | ||
| 1223 | 0x6c, 0x61, 0x72, 0x67, 0x65, 0x72, 0x20, 0x74, // ("y and a larger t") | ||
| 1224 | 0x68, 0x61, 0x6e, 0x20, 0x62, 0x6c, 0x6f, 0x63, | ||
| 1225 | 0x6b, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x64, // ("han block-size d") | ||
| 1226 | 0x61, 0x74, 0x61, 0x2e, 0x20, 0x54, 0x68, 0x65, | ||
| 1227 | 0x20, 0x6b, 0x65, 0x79, 0x20, 0x6e, 0x65, 0x65, // ("ata. The key nee") | ||
| 1228 | 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, | ||
| 1229 | 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x64, 0x20, // ("ds to be hashed ") | ||
| 1230 | 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x62, | ||
| 1231 | 0x65, 0x69, 0x6e, 0x67, 0x20, 0x75, 0x73, 0x65, // ("before being use") | ||
| 1232 | 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, | ||
| 1233 | 0x20, 0x48, 0x4d, 0x41, 0x43, 0x20, 0x61, 0x6c, // ("d by the HMAC al") | ||
| 1234 | 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x2e }, // ("gorithm.") | ||
| 1235 | .psize = 152, | ||
| 1236 | .digest = { 0xe3, 0x7b, 0x6a, 0x77, 0x5d, 0xc8, 0x7d, 0xba, | ||
| 1237 | 0xa4, 0xdf, 0xa9, 0xf9, 0x6e, 0x5e, 0x3f, 0xfd, | ||
| 1238 | 0xde, 0xbd, 0x71, 0xf8, 0x86, 0x72, 0x89, 0x86, | ||
| 1239 | 0x5d, 0xf5, 0xa3, 0x2d, 0x20, 0xcd, 0xc9, 0x44, | ||
| 1240 | 0xb6, 0x02, 0x2c, 0xac, 0x3c, 0x49, 0x82, 0xb1, | ||
| 1241 | 0x0d, 0x5e, 0xeb, 0x55, 0xc3, 0xe4, 0xde, 0x15, | ||
| 1242 | 0x13, 0x46, 0x76, 0xfb, 0x6d, 0xe0, 0x44, 0x60, | ||
| 1243 | 0x65, 0xc9, 0x74, 0x40, 0xfa, 0x8c, 0x6a, 0x58 }, | ||
| 1244 | }, | ||
| 1245 | }; | ||
| 1246 | |||
| 1247 | /* | ||
| 1005 | * DES test vectors. | 1248 | * DES test vectors. |
| 1006 | */ | 1249 | */ |
| 1007 | #define DES_ENC_TEST_VECTORS 10 | 1250 | #define DES_ENC_TEST_VECTORS 10 |
| @@ -3316,6 +3559,278 @@ static struct cipher_testvec xeta_dec_tv_template[] = { | |||
| 3316 | } | 3559 | } |
| 3317 | }; | 3560 | }; |
| 3318 | 3561 | ||
| 3562 | /* | ||
| 3563 | * FCrypt test vectors | ||
| 3564 | */ | ||
| 3565 | #define FCRYPT_ENC_TEST_VECTORS ARRAY_SIZE(fcrypt_pcbc_enc_tv_template) | ||
| 3566 | #define FCRYPT_DEC_TEST_VECTORS ARRAY_SIZE(fcrypt_pcbc_dec_tv_template) | ||
| 3567 | |||
| 3568 | static struct cipher_testvec fcrypt_pcbc_enc_tv_template[] = { | ||
| 3569 | { /* http://www.openafs.org/pipermail/openafs-devel/2000-December/005320.html */ | ||
| 3570 | .key = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, | ||
| 3571 | .klen = 8, | ||
| 3572 | .iv = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, | ||
| 3573 | .input = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, | ||
| 3574 | .ilen = 8, | ||
| 3575 | .result = { 0x0E, 0x09, 0x00, 0xC7, 0x3E, 0xF7, 0xED, 0x41 }, | ||
| 3576 | .rlen = 8, | ||
| 3577 | }, { | ||
| 3578 | .key = { 0x11, 0x44, 0x77, 0xAA, 0xDD, 0x00, 0x33, 0x66 }, | ||
| 3579 | .klen = 8, | ||
| 3580 | .iv = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, | ||
| 3581 | .input = { 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0 }, | ||
| 3582 | .ilen = 8, | ||
| 3583 | .result = { 0xD8, 0xED, 0x78, 0x74, 0x77, 0xEC, 0x06, 0x80 }, | ||
| 3584 | .rlen = 8, | ||
| 3585 | }, { /* From Arla */ | ||
| 3586 | .key = { 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87 }, | ||
| 3587 | .klen = 8, | ||
| 3588 | .iv = { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 }, | ||
| 3589 | .input = "The quick brown fox jumps over the lazy dogs.\0\0", | ||
| 3590 | .ilen = 48, | ||
| 3591 | .result = { 0x00, 0xf0, 0xe, 0x11, 0x75, 0xe6, 0x23, 0x82, | ||
| 3592 | 0xee, 0xac, 0x98, 0x62, 0x44, 0x51, 0xe4, 0x84, | ||
| 3593 | 0xc3, 0x59, 0xd8, 0xaa, 0x64, 0x60, 0xae, 0xf7, | ||
| 3594 | 0xd2, 0xd9, 0x13, 0x79, 0x72, 0xa3, 0x45, 0x03, | ||
| 3595 | 0x23, 0xb5, 0x62, 0xd7, 0x0c, 0xf5, 0x27, 0xd1, | ||
| 3596 | 0xf8, 0x91, 0x3c, 0xac, 0x44, 0x22, 0x92, 0xef }, | ||
| 3597 | .rlen = 48, | ||
| 3598 | }, { | ||
| 3599 | .key = { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 }, | ||
| 3600 | .klen = 8, | ||
| 3601 | .iv = { 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87 }, | ||
| 3602 | .input = "The quick brown fox jumps over the lazy dogs.\0\0", | ||
| 3603 | .ilen = 48, | ||
| 3604 | .result = { 0xca, 0x90, 0xf5, 0x9d, 0xcb, 0xd4, 0xd2, 0x3c, | ||
| 3605 | 0x01, 0x88, 0x7f, 0x3e, 0x31, 0x6e, 0x62, 0x9d, | ||
| 3606 | 0xd8, 0xe0, 0x57, 0xa3, 0x06, 0x3a, 0x42, 0x58, | ||
| 3607 | 0x2a, 0x28, 0xfe, 0x72, 0x52, 0x2f, 0xdd, 0xe0, | ||
| 3608 | 0x19, 0x89, 0x09, 0x1c, 0x2a, 0x8e, 0x8c, 0x94, | ||
| 3609 | 0xfc, 0xc7, 0x68, 0xe4, 0x88, 0xaa, 0xde, 0x0f }, | ||
| 3610 | .rlen = 48, | ||
| 3611 | }, { /* split-page version */ | ||
| 3612 | .key = { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 }, | ||
| 3613 | .klen = 8, | ||
| 3614 | .iv = { 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87 }, | ||
| 3615 | .input = "The quick brown fox jumps over the lazy dogs.\0\0", | ||
| 3616 | .ilen = 48, | ||
| 3617 | .result = { 0xca, 0x90, 0xf5, 0x9d, 0xcb, 0xd4, 0xd2, 0x3c, | ||
| 3618 | 0x01, 0x88, 0x7f, 0x3e, 0x31, 0x6e, 0x62, 0x9d, | ||
| 3619 | 0xd8, 0xe0, 0x57, 0xa3, 0x06, 0x3a, 0x42, 0x58, | ||
| 3620 | 0x2a, 0x28, 0xfe, 0x72, 0x52, 0x2f, 0xdd, 0xe0, | ||
| 3621 | 0x19, 0x89, 0x09, 0x1c, 0x2a, 0x8e, 0x8c, 0x94, | ||
| 3622 | 0xfc, 0xc7, 0x68, 0xe4, 0x88, 0xaa, 0xde, 0x0f }, | ||
| 3623 | .rlen = 48, | ||
| 3624 | .np = 2, | ||
| 3625 | .tap = { 20, 28 }, | ||
| 3626 | } | ||
| 3627 | }; | ||
| 3628 | |||
| 3629 | static struct cipher_testvec fcrypt_pcbc_dec_tv_template[] = { | ||
| 3630 | { /* http://www.openafs.org/pipermail/openafs-devel/2000-December/005320.html */ | ||
| 3631 | .key = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, | ||
| 3632 | .klen = 8, | ||
| 3633 | .iv = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, | ||
| 3634 | .input = { 0x0E, 0x09, 0x00, 0xC7, 0x3E, 0xF7, 0xED, 0x41 }, | ||
| 3635 | .ilen = 8, | ||
| 3636 | .result = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, | ||
| 3637 | .rlen = 8, | ||
| 3638 | }, { | ||
| 3639 | .key = { 0x11, 0x44, 0x77, 0xAA, 0xDD, 0x00, 0x33, 0x66 }, | ||
| 3640 | .klen = 8, | ||
| 3641 | .iv = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, | ||
| 3642 | .input = { 0xD8, 0xED, 0x78, 0x74, 0x77, 0xEC, 0x06, 0x80 }, | ||
| 3643 | .ilen = 8, | ||
| 3644 | .result = { 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0 }, | ||
| 3645 | .rlen = 8, | ||
| 3646 | }, { /* From Arla */ | ||
| 3647 | .key = { 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87 }, | ||
| 3648 | .klen = 8, | ||
| 3649 | .iv = { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 }, | ||
| 3650 | .input = { 0x00, 0xf0, 0xe, 0x11, 0x75, 0xe6, 0x23, 0x82, | ||
| 3651 | 0xee, 0xac, 0x98, 0x62, 0x44, 0x51, 0xe4, 0x84, | ||
| 3652 | 0xc3, 0x59, 0xd8, 0xaa, 0x64, 0x60, 0xae, 0xf7, | ||
| 3653 | 0xd2, 0xd9, 0x13, 0x79, 0x72, 0xa3, 0x45, 0x03, | ||
| 3654 | 0x23, 0xb5, 0x62, 0xd7, 0x0c, 0xf5, 0x27, 0xd1, | ||
| 3655 | 0xf8, 0x91, 0x3c, 0xac, 0x44, 0x22, 0x92, 0xef }, | ||
| 3656 | .ilen = 48, | ||
| 3657 | .result = "The quick brown fox jumps over the lazy dogs.\0\0", | ||
| 3658 | .rlen = 48, | ||
| 3659 | }, { | ||
| 3660 | .key = { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 }, | ||
| 3661 | .klen = 8, | ||
| 3662 | .iv = { 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87 }, | ||
| 3663 | .input = { 0xca, 0x90, 0xf5, 0x9d, 0xcb, 0xd4, 0xd2, 0x3c, | ||
| 3664 | 0x01, 0x88, 0x7f, 0x3e, 0x31, 0x6e, 0x62, 0x9d, | ||
| 3665 | 0xd8, 0xe0, 0x57, 0xa3, 0x06, 0x3a, 0x42, 0x58, | ||
| 3666 | 0x2a, 0x28, 0xfe, 0x72, 0x52, 0x2f, 0xdd, 0xe0, | ||
| 3667 | 0x19, 0x89, 0x09, 0x1c, 0x2a, 0x8e, 0x8c, 0x94, | ||
| 3668 | 0xfc, 0xc7, 0x68, 0xe4, 0x88, 0xaa, 0xde, 0x0f }, | ||
| 3669 | .ilen = 48, | ||
| 3670 | .result = "The quick brown fox jumps over the lazy dogs.\0\0", | ||
| 3671 | .rlen = 48, | ||
| 3672 | }, { /* split-page version */ | ||
| 3673 | .key = { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 }, | ||
| 3674 | .klen = 8, | ||
| 3675 | .iv = { 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87 }, | ||
| 3676 | .input = { 0xca, 0x90, 0xf5, 0x9d, 0xcb, 0xd4, 0xd2, 0x3c, | ||
| 3677 | 0x01, 0x88, 0x7f, 0x3e, 0x31, 0x6e, 0x62, 0x9d, | ||
| 3678 | 0xd8, 0xe0, 0x57, 0xa3, 0x06, 0x3a, 0x42, 0x58, | ||
| 3679 | 0x2a, 0x28, 0xfe, 0x72, 0x52, 0x2f, 0xdd, 0xe0, | ||
| 3680 | 0x19, 0x89, 0x09, 0x1c, 0x2a, 0x8e, 0x8c, 0x94, | ||
| 3681 | 0xfc, 0xc7, 0x68, 0xe4, 0x88, 0xaa, 0xde, 0x0f }, | ||
| 3682 | .ilen = 48, | ||
| 3683 | .result = "The quick brown fox jumps over the lazy dogs.\0\0", | ||
| 3684 | .rlen = 48, | ||
| 3685 | .np = 2, | ||
| 3686 | .tap = { 20, 28 }, | ||
| 3687 | } | ||
| 3688 | }; | ||
| 3689 | |||
| 3690 | /* | ||
| 3691 | * CAMELLIA test vectors. | ||
| 3692 | */ | ||
| 3693 | #define CAMELLIA_ENC_TEST_VECTORS 3 | ||
| 3694 | #define CAMELLIA_DEC_TEST_VECTORS 3 | ||
| 3695 | #define CAMELLIA_CBC_ENC_TEST_VECTORS 2 | ||
| 3696 | #define CAMELLIA_CBC_DEC_TEST_VECTORS 2 | ||
| 3697 | |||
| 3698 | static struct cipher_testvec camellia_enc_tv_template[] = { | ||
| 3699 | { | ||
| 3700 | .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, | ||
| 3701 | 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 }, | ||
| 3702 | .klen = 16, | ||
| 3703 | .input = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, | ||
| 3704 | 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 }, | ||
| 3705 | .ilen = 16, | ||
| 3706 | .result = { 0x67, 0x67, 0x31, 0x38, 0x54, 0x96, 0x69, 0x73, | ||
| 3707 | 0x08, 0x57, 0x06, 0x56, 0x48, 0xea, 0xbe, 0x43 }, | ||
| 3708 | .rlen = 16, | ||
| 3709 | }, { | ||
| 3710 | .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, | ||
| 3711 | 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10, | ||
| 3712 | 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 }, | ||
| 3713 | .klen = 24, | ||
| 3714 | .input = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, | ||
| 3715 | 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 }, | ||
| 3716 | .ilen = 16, | ||
| 3717 | .result = { 0xb4, 0x99, 0x34, 0x01, 0xb3, 0xe9, 0x96, 0xf8, | ||
| 3718 | 0x4e, 0xe5, 0xce, 0xe7, 0xd7, 0x9b, 0x09, 0xb9 }, | ||
| 3719 | .rlen = 16, | ||
| 3720 | }, { | ||
| 3721 | .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, | ||
| 3722 | 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10, | ||
| 3723 | 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, | ||
| 3724 | 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff }, | ||
| 3725 | .klen = 32, | ||
| 3726 | .input = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, | ||
| 3727 | 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 }, | ||
| 3728 | .ilen = 16, | ||
| 3729 | .result = { 0x9a, 0xcc, 0x23, 0x7d, 0xff, 0x16, 0xd7, 0x6c, | ||
| 3730 | 0x20, 0xef, 0x7c, 0x91, 0x9e, 0x3a, 0x75, 0x09 }, | ||
| 3731 | .rlen = 16, | ||
| 3732 | }, | ||
| 3733 | }; | ||
| 3734 | |||
| 3735 | static struct cipher_testvec camellia_dec_tv_template[] = { | ||
| 3736 | { | ||
| 3737 | .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, | ||
| 3738 | 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 }, | ||
| 3739 | .klen = 16, | ||
| 3740 | .input = { 0x67, 0x67, 0x31, 0x38, 0x54, 0x96, 0x69, 0x73, | ||
| 3741 | 0x08, 0x57, 0x06, 0x56, 0x48, 0xea, 0xbe, 0x43 }, | ||
| 3742 | .ilen = 16, | ||
| 3743 | .result = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, | ||
| 3744 | 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 }, | ||
| 3745 | .rlen = 16, | ||
| 3746 | }, { | ||
| 3747 | .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, | ||
| 3748 | 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10, | ||
| 3749 | 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 }, | ||
| 3750 | .klen = 24, | ||
| 3751 | .input = { 0xb4, 0x99, 0x34, 0x01, 0xb3, 0xe9, 0x96, 0xf8, | ||
| 3752 | 0x4e, 0xe5, 0xce, 0xe7, 0xd7, 0x9b, 0x09, 0xb9 }, | ||
| 3753 | .ilen = 16, | ||
| 3754 | .result = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, | ||
| 3755 | 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 }, | ||
| 3756 | .rlen = 16, | ||
| 3757 | }, { | ||
| 3758 | .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, | ||
| 3759 | 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10, | ||
| 3760 | 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, | ||
| 3761 | 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff }, | ||
| 3762 | .klen = 32, | ||
| 3763 | .input = { 0x9a, 0xcc, 0x23, 0x7d, 0xff, 0x16, 0xd7, 0x6c, | ||
| 3764 | 0x20, 0xef, 0x7c, 0x91, 0x9e, 0x3a, 0x75, 0x09 }, | ||
| 3765 | .ilen = 16, | ||
| 3766 | .result = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, | ||
| 3767 | 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 }, | ||
| 3768 | .rlen = 16, | ||
| 3769 | }, | ||
| 3770 | }; | ||
| 3771 | |||
| 3772 | static struct cipher_testvec camellia_cbc_enc_tv_template[] = { | ||
| 3773 | { | ||
| 3774 | .key = { 0x06, 0xa9, 0x21, 0x40, 0x36, 0xb8, 0xa1, 0x5b, | ||
| 3775 | 0x51, 0x2e, 0x03, 0xd5, 0x34, 0x12, 0x00, 0x06 }, | ||
| 3776 | .klen = 16, | ||
| 3777 | .iv = { 0x3d, 0xaf, 0xba, 0x42, 0x9d, 0x9e, 0xb4, 0x30, | ||
| 3778 | 0xb4, 0x22, 0xda, 0x80, 0x2c, 0x9f, 0xac, 0x41 }, | ||
| 3779 | .input = { "Single block msg" }, | ||
| 3780 | .ilen = 16, | ||
| 3781 | .result = { 0xea, 0x32, 0x12, 0x76, 0x3b, 0x50, 0x10, 0xe7, | ||
| 3782 | 0x18, 0xf6, 0xfd, 0x5d, 0xf6, 0x8f, 0x13, 0x51 }, | ||
| 3783 | .rlen = 16, | ||
| 3784 | }, { | ||
| 3785 | .key = { 0xc2, 0x86, 0x69, 0x6d, 0x88, 0x7c, 0x9a, 0xa0, | ||
| 3786 | 0x61, 0x1b, 0xbb, 0x3e, 0x20, 0x25, 0xa4, 0x5a }, | ||
| 3787 | .klen = 16, | ||
| 3788 | .iv = { 0x56, 0x2e, 0x17, 0x99, 0x6d, 0x09, 0x3d, 0x28, | ||
| 3789 | 0xdd, 0xb3, 0xba, 0x69, 0x5a, 0x2e, 0x6f, 0x58 }, | ||
| 3790 | .input = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
| 3791 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, | ||
| 3792 | 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, | ||
| 3793 | 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f }, | ||
| 3794 | .ilen = 32, | ||
| 3795 | .result = { 0xa5, 0xdf, 0x6e, 0x50, 0xda, 0x70, 0x6c, 0x01, | ||
| 3796 | 0x4a, 0xab, 0xf3, 0xf2, 0xd6, 0xfc, 0x6c, 0xfd, | ||
| 3797 | 0x19, 0xb4, 0x3e, 0x57, 0x1c, 0x02, 0x5e, 0xa0, | ||
| 3798 | 0x15, 0x78, 0xe0, 0x5e, 0xf2, 0xcb, 0x87, 0x16 }, | ||
| 3799 | .rlen = 32, | ||
| 3800 | }, | ||
| 3801 | }; | ||
| 3802 | |||
| 3803 | static struct cipher_testvec camellia_cbc_dec_tv_template[] = { | ||
| 3804 | { | ||
| 3805 | .key = { 0x06, 0xa9, 0x21, 0x40, 0x36, 0xb8, 0xa1, 0x5b, | ||
| 3806 | 0x51, 0x2e, 0x03, 0xd5, 0x34, 0x12, 0x00, 0x06 }, | ||
| 3807 | .klen = 16, | ||
| 3808 | .iv = { 0x3d, 0xaf, 0xba, 0x42, 0x9d, 0x9e, 0xb4, 0x30, | ||
| 3809 | 0xb4, 0x22, 0xda, 0x80, 0x2c, 0x9f, 0xac, 0x41 }, | ||
| 3810 | .input = { 0xea, 0x32, 0x12, 0x76, 0x3b, 0x50, 0x10, 0xe7, | ||
| 3811 | 0x18, 0xf6, 0xfd, 0x5d, 0xf6, 0x8f, 0x13, 0x51 }, | ||
| 3812 | .ilen = 16, | ||
| 3813 | .result = { "Single block msg" }, | ||
| 3814 | .rlen = 16, | ||
| 3815 | }, { | ||
| 3816 | .key = { 0xc2, 0x86, 0x69, 0x6d, 0x88, 0x7c, 0x9a, 0xa0, | ||
| 3817 | 0x61, 0x1b, 0xbb, 0x3e, 0x20, 0x25, 0xa4, 0x5a }, | ||
| 3818 | .klen = 16, | ||
| 3819 | .iv = { 0x56, 0x2e, 0x17, 0x99, 0x6d, 0x09, 0x3d, 0x28, | ||
| 3820 | 0xdd, 0xb3, 0xba, 0x69, 0x5a, 0x2e, 0x6f, 0x58 }, | ||
| 3821 | .input = { 0xa5, 0xdf, 0x6e, 0x50, 0xda, 0x70, 0x6c, 0x01, | ||
| 3822 | 0x4a, 0xab, 0xf3, 0xf2, 0xd6, 0xfc, 0x6c, 0xfd, | ||
| 3823 | 0x19, 0xb4, 0x3e, 0x57, 0x1c, 0x02, 0x5e, 0xa0, | ||
| 3824 | 0x15, 0x78, 0xe0, 0x5e, 0xf2, 0xcb, 0x87, 0x16 }, | ||
| 3825 | .ilen = 32, | ||
| 3826 | .result = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
| 3827 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, | ||
| 3828 | 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, | ||
| 3829 | 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f }, | ||
| 3830 | .rlen = 32, | ||
| 3831 | }, | ||
| 3832 | }; | ||
| 3833 | |||
| 3319 | /* | 3834 | /* |
| 3320 | * Compression stuff. | 3835 | * Compression stuff. |
| 3321 | */ | 3836 | */ |
| @@ -3769,4 +4284,25 @@ static struct hash_speed generic_hash_speed_template[] = { | |||
| 3769 | { .blen = 0, .plen = 0, } | 4284 | { .blen = 0, .plen = 0, } |
| 3770 | }; | 4285 | }; |
| 3771 | 4286 | ||
| 4287 | static struct cipher_speed camellia_speed_template[] = { | ||
| 4288 | { .klen = 16, .blen = 16, }, | ||
| 4289 | { .klen = 16, .blen = 64, }, | ||
| 4290 | { .klen = 16, .blen = 256, }, | ||
| 4291 | { .klen = 16, .blen = 1024, }, | ||
| 4292 | { .klen = 16, .blen = 8192, }, | ||
| 4293 | { .klen = 24, .blen = 16, }, | ||
| 4294 | { .klen = 24, .blen = 64, }, | ||
| 4295 | { .klen = 24, .blen = 256, }, | ||
| 4296 | { .klen = 24, .blen = 1024, }, | ||
| 4297 | { .klen = 24, .blen = 8192, }, | ||
| 4298 | { .klen = 32, .blen = 16, }, | ||
| 4299 | { .klen = 32, .blen = 64, }, | ||
| 4300 | { .klen = 32, .blen = 256, }, | ||
| 4301 | { .klen = 32, .blen = 1024, }, | ||
| 4302 | { .klen = 32, .blen = 8192, }, | ||
| 4303 | |||
| 4304 | /* End marker */ | ||
| 4305 | { .klen = 0, .blen = 0, } | ||
| 4306 | }; | ||
| 4307 | |||
| 3772 | #endif /* _CRYPTO_TCRYPT_H */ | 4308 | #endif /* _CRYPTO_TCRYPT_H */ |
diff --git a/crypto/xcbc.c b/crypto/xcbc.c index 9347eb6bcf69..53e8ccbf0f5f 100644 --- a/crypto/xcbc.c +++ b/crypto/xcbc.c | |||
| @@ -21,6 +21,7 @@ | |||
| 21 | 21 | ||
| 22 | #include <linux/crypto.h> | 22 | #include <linux/crypto.h> |
| 23 | #include <linux/err.h> | 23 | #include <linux/err.h> |
| 24 | #include <linux/hardirq.h> | ||
| 24 | #include <linux/kernel.h> | 25 | #include <linux/kernel.h> |
| 25 | #include <linux/mm.h> | 26 | #include <linux/mm.h> |
| 26 | #include <linux/rtnetlink.h> | 27 | #include <linux/rtnetlink.h> |
| @@ -47,7 +48,7 @@ static u_int32_t ks[12] = {0x01010101, 0x01010101, 0x01010101, 0x01010101, | |||
| 47 | * +------------------------ | 48 | * +------------------------ |
| 48 | */ | 49 | */ |
| 49 | struct crypto_xcbc_ctx { | 50 | struct crypto_xcbc_ctx { |
| 50 | struct crypto_tfm *child; | 51 | struct crypto_cipher *child; |
| 51 | u8 *odds; | 52 | u8 *odds; |
| 52 | u8 *prev; | 53 | u8 *prev; |
| 53 | u8 *key; | 54 | u8 *key; |
| @@ -75,8 +76,7 @@ static int _crypto_xcbc_digest_setkey(struct crypto_hash *parent, | |||
| 75 | if ((err = crypto_cipher_setkey(ctx->child, ctx->key, ctx->keylen))) | 76 | if ((err = crypto_cipher_setkey(ctx->child, ctx->key, ctx->keylen))) |
| 76 | return err; | 77 | return err; |
| 77 | 78 | ||
| 78 | ctx->child->__crt_alg->cra_cipher.cia_encrypt(ctx->child, key1, | 79 | crypto_cipher_encrypt_one(ctx->child, key1, ctx->consts); |
| 79 | ctx->consts); | ||
| 80 | 80 | ||
| 81 | return crypto_cipher_setkey(ctx->child, key1, bs); | 81 | return crypto_cipher_setkey(ctx->child, key1, bs); |
| 82 | } | 82 | } |
| @@ -86,7 +86,7 @@ static int crypto_xcbc_digest_setkey(struct crypto_hash *parent, | |||
| 86 | { | 86 | { |
| 87 | struct crypto_xcbc_ctx *ctx = crypto_hash_ctx_aligned(parent); | 87 | struct crypto_xcbc_ctx *ctx = crypto_hash_ctx_aligned(parent); |
| 88 | 88 | ||
| 89 | if (keylen != crypto_tfm_alg_blocksize(ctx->child)) | 89 | if (keylen != crypto_cipher_blocksize(ctx->child)) |
| 90 | return -EINVAL; | 90 | return -EINVAL; |
| 91 | 91 | ||
| 92 | ctx->keylen = keylen; | 92 | ctx->keylen = keylen; |
| @@ -108,13 +108,13 @@ static int crypto_xcbc_digest_init(struct hash_desc *pdesc) | |||
| 108 | return 0; | 108 | return 0; |
| 109 | } | 109 | } |
| 110 | 110 | ||
| 111 | static int crypto_xcbc_digest_update(struct hash_desc *pdesc, | 111 | static int crypto_xcbc_digest_update2(struct hash_desc *pdesc, |
| 112 | struct scatterlist *sg, | 112 | struct scatterlist *sg, |
| 113 | unsigned int nbytes) | 113 | unsigned int nbytes) |
| 114 | { | 114 | { |
| 115 | struct crypto_hash *parent = pdesc->tfm; | 115 | struct crypto_hash *parent = pdesc->tfm; |
| 116 | struct crypto_xcbc_ctx *ctx = crypto_hash_ctx_aligned(parent); | 116 | struct crypto_xcbc_ctx *ctx = crypto_hash_ctx_aligned(parent); |
| 117 | struct crypto_tfm *tfm = ctx->child; | 117 | struct crypto_cipher *tfm = ctx->child; |
| 118 | int bs = crypto_hash_blocksize(parent); | 118 | int bs = crypto_hash_blocksize(parent); |
| 119 | unsigned int i = 0; | 119 | unsigned int i = 0; |
| 120 | 120 | ||
| @@ -142,7 +142,7 @@ static int crypto_xcbc_digest_update(struct hash_desc *pdesc, | |||
| 142 | offset += len; | 142 | offset += len; |
| 143 | 143 | ||
| 144 | crypto_kunmap(p, 0); | 144 | crypto_kunmap(p, 0); |
| 145 | crypto_yield(tfm->crt_flags); | 145 | crypto_yield(pdesc->flags); |
| 146 | continue; | 146 | continue; |
| 147 | } | 147 | } |
| 148 | 148 | ||
| @@ -152,7 +152,7 @@ static int crypto_xcbc_digest_update(struct hash_desc *pdesc, | |||
| 152 | p += bs - ctx->len; | 152 | p += bs - ctx->len; |
| 153 | 153 | ||
| 154 | ctx->xor(ctx->prev, ctx->odds, bs); | 154 | ctx->xor(ctx->prev, ctx->odds, bs); |
| 155 | tfm->__crt_alg->cra_cipher.cia_encrypt(tfm, ctx->prev, ctx->prev); | 155 | crypto_cipher_encrypt_one(tfm, ctx->prev, ctx->prev); |
| 156 | 156 | ||
| 157 | /* clearing the length */ | 157 | /* clearing the length */ |
| 158 | ctx->len = 0; | 158 | ctx->len = 0; |
| @@ -160,7 +160,8 @@ static int crypto_xcbc_digest_update(struct hash_desc *pdesc, | |||
| 160 | /* encrypting the rest of data */ | 160 | /* encrypting the rest of data */ |
| 161 | while (len > bs) { | 161 | while (len > bs) { |
| 162 | ctx->xor(ctx->prev, p, bs); | 162 | ctx->xor(ctx->prev, p, bs); |
| 163 | tfm->__crt_alg->cra_cipher.cia_encrypt(tfm, ctx->prev, ctx->prev); | 163 | crypto_cipher_encrypt_one(tfm, ctx->prev, |
| 164 | ctx->prev); | ||
| 164 | p += bs; | 165 | p += bs; |
| 165 | len -= bs; | 166 | len -= bs; |
| 166 | } | 167 | } |
| @@ -171,7 +172,7 @@ static int crypto_xcbc_digest_update(struct hash_desc *pdesc, | |||
| 171 | ctx->len = len; | 172 | ctx->len = len; |
| 172 | } | 173 | } |
| 173 | crypto_kunmap(p, 0); | 174 | crypto_kunmap(p, 0); |
| 174 | crypto_yield(tfm->crt_flags); | 175 | crypto_yield(pdesc->flags); |
| 175 | slen -= min(slen, ((unsigned int)(PAGE_SIZE)) - offset); | 176 | slen -= min(slen, ((unsigned int)(PAGE_SIZE)) - offset); |
| 176 | offset = 0; | 177 | offset = 0; |
| 177 | pg++; | 178 | pg++; |
| @@ -183,11 +184,20 @@ static int crypto_xcbc_digest_update(struct hash_desc *pdesc, | |||
| 183 | return 0; | 184 | return 0; |
| 184 | } | 185 | } |
| 185 | 186 | ||
| 187 | static int crypto_xcbc_digest_update(struct hash_desc *pdesc, | ||
| 188 | struct scatterlist *sg, | ||
| 189 | unsigned int nbytes) | ||
| 190 | { | ||
| 191 | if (WARN_ON_ONCE(in_irq())) | ||
| 192 | return -EDEADLK; | ||
| 193 | return crypto_xcbc_digest_update2(pdesc, sg, nbytes); | ||
| 194 | } | ||
| 195 | |||
| 186 | static int crypto_xcbc_digest_final(struct hash_desc *pdesc, u8 *out) | 196 | static int crypto_xcbc_digest_final(struct hash_desc *pdesc, u8 *out) |
| 187 | { | 197 | { |
| 188 | struct crypto_hash *parent = pdesc->tfm; | 198 | struct crypto_hash *parent = pdesc->tfm; |
| 189 | struct crypto_xcbc_ctx *ctx = crypto_hash_ctx_aligned(parent); | 199 | struct crypto_xcbc_ctx *ctx = crypto_hash_ctx_aligned(parent); |
| 190 | struct crypto_tfm *tfm = ctx->child; | 200 | struct crypto_cipher *tfm = ctx->child; |
| 191 | int bs = crypto_hash_blocksize(parent); | 201 | int bs = crypto_hash_blocksize(parent); |
| 192 | int err = 0; | 202 | int err = 0; |
| 193 | 203 | ||
| @@ -197,13 +207,14 @@ static int crypto_xcbc_digest_final(struct hash_desc *pdesc, u8 *out) | |||
| 197 | if ((err = crypto_cipher_setkey(tfm, ctx->key, ctx->keylen)) != 0) | 207 | if ((err = crypto_cipher_setkey(tfm, ctx->key, ctx->keylen)) != 0) |
| 198 | return err; | 208 | return err; |
| 199 | 209 | ||
| 200 | tfm->__crt_alg->cra_cipher.cia_encrypt(tfm, key2, (const u8*)(ctx->consts+bs)); | 210 | crypto_cipher_encrypt_one(tfm, key2, |
| 211 | (u8 *)(ctx->consts + bs)); | ||
| 201 | 212 | ||
| 202 | ctx->xor(ctx->prev, ctx->odds, bs); | 213 | ctx->xor(ctx->prev, ctx->odds, bs); |
| 203 | ctx->xor(ctx->prev, key2, bs); | 214 | ctx->xor(ctx->prev, key2, bs); |
| 204 | _crypto_xcbc_digest_setkey(parent, ctx); | 215 | _crypto_xcbc_digest_setkey(parent, ctx); |
| 205 | 216 | ||
| 206 | tfm->__crt_alg->cra_cipher.cia_encrypt(tfm, out, ctx->prev); | 217 | crypto_cipher_encrypt_one(tfm, out, ctx->prev); |
| 207 | } else { | 218 | } else { |
| 208 | u8 key3[bs]; | 219 | u8 key3[bs]; |
| 209 | unsigned int rlen; | 220 | unsigned int rlen; |
| @@ -218,14 +229,15 @@ static int crypto_xcbc_digest_final(struct hash_desc *pdesc, u8 *out) | |||
| 218 | if ((err = crypto_cipher_setkey(tfm, ctx->key, ctx->keylen)) != 0) | 229 | if ((err = crypto_cipher_setkey(tfm, ctx->key, ctx->keylen)) != 0) |
| 219 | return err; | 230 | return err; |
| 220 | 231 | ||
| 221 | tfm->__crt_alg->cra_cipher.cia_encrypt(tfm, key3, (const u8*)(ctx->consts+bs*2)); | 232 | crypto_cipher_encrypt_one(tfm, key3, |
| 233 | (u8 *)(ctx->consts + bs * 2)); | ||
| 222 | 234 | ||
| 223 | ctx->xor(ctx->prev, ctx->odds, bs); | 235 | ctx->xor(ctx->prev, ctx->odds, bs); |
| 224 | ctx->xor(ctx->prev, key3, bs); | 236 | ctx->xor(ctx->prev, key3, bs); |
| 225 | 237 | ||
| 226 | _crypto_xcbc_digest_setkey(parent, ctx); | 238 | _crypto_xcbc_digest_setkey(parent, ctx); |
| 227 | 239 | ||
| 228 | tfm->__crt_alg->cra_cipher.cia_encrypt(tfm, out, ctx->prev); | 240 | crypto_cipher_encrypt_one(tfm, out, ctx->prev); |
| 229 | } | 241 | } |
| 230 | 242 | ||
| 231 | return 0; | 243 | return 0; |
| @@ -234,21 +246,25 @@ static int crypto_xcbc_digest_final(struct hash_desc *pdesc, u8 *out) | |||
| 234 | static int crypto_xcbc_digest(struct hash_desc *pdesc, | 246 | static int crypto_xcbc_digest(struct hash_desc *pdesc, |
| 235 | struct scatterlist *sg, unsigned int nbytes, u8 *out) | 247 | struct scatterlist *sg, unsigned int nbytes, u8 *out) |
| 236 | { | 248 | { |
| 249 | if (WARN_ON_ONCE(in_irq())) | ||
| 250 | return -EDEADLK; | ||
| 251 | |||
| 237 | crypto_xcbc_digest_init(pdesc); | 252 | crypto_xcbc_digest_init(pdesc); |
| 238 | crypto_xcbc_digest_update(pdesc, sg, nbytes); | 253 | crypto_xcbc_digest_update2(pdesc, sg, nbytes); |
| 239 | return crypto_xcbc_digest_final(pdesc, out); | 254 | return crypto_xcbc_digest_final(pdesc, out); |
| 240 | } | 255 | } |
| 241 | 256 | ||
| 242 | static int xcbc_init_tfm(struct crypto_tfm *tfm) | 257 | static int xcbc_init_tfm(struct crypto_tfm *tfm) |
| 243 | { | 258 | { |
| 259 | struct crypto_cipher *cipher; | ||
| 244 | struct crypto_instance *inst = (void *)tfm->__crt_alg; | 260 | struct crypto_instance *inst = (void *)tfm->__crt_alg; |
| 245 | struct crypto_spawn *spawn = crypto_instance_ctx(inst); | 261 | struct crypto_spawn *spawn = crypto_instance_ctx(inst); |
| 246 | struct crypto_xcbc_ctx *ctx = crypto_hash_ctx_aligned(__crypto_hash_cast(tfm)); | 262 | struct crypto_xcbc_ctx *ctx = crypto_hash_ctx_aligned(__crypto_hash_cast(tfm)); |
| 247 | int bs = crypto_hash_blocksize(__crypto_hash_cast(tfm)); | 263 | int bs = crypto_hash_blocksize(__crypto_hash_cast(tfm)); |
| 248 | 264 | ||
| 249 | tfm = crypto_spawn_tfm(spawn); | 265 | cipher = crypto_spawn_cipher(spawn); |
| 250 | if (IS_ERR(tfm)) | 266 | if (IS_ERR(cipher)) |
| 251 | return PTR_ERR(tfm); | 267 | return PTR_ERR(cipher); |
| 252 | 268 | ||
| 253 | switch(bs) { | 269 | switch(bs) { |
| 254 | case 16: | 270 | case 16: |
| @@ -258,7 +274,7 @@ static int xcbc_init_tfm(struct crypto_tfm *tfm) | |||
| 258 | return -EINVAL; | 274 | return -EINVAL; |
| 259 | } | 275 | } |
| 260 | 276 | ||
| 261 | ctx->child = crypto_cipher_cast(tfm); | 277 | ctx->child = cipher; |
| 262 | ctx->odds = (u8*)(ctx+1); | 278 | ctx->odds = (u8*)(ctx+1); |
| 263 | ctx->prev = ctx->odds + bs; | 279 | ctx->prev = ctx->odds + bs; |
| 264 | ctx->key = ctx->prev + bs; | 280 | ctx->key = ctx->prev + bs; |
