Now that shared glue code is available, convert camellia-x86_64 to use it.
Unified · Split
| @@ -5,10 +5,6 @@ · 4 unmodified lines | |||
| 5 | * | 5 | * |
| 6 | * Camellia parts based on code by: | 6 | * Camellia parts based on code by: |
| 7 | * Copyright (C) 2006 NTT (Nippon Telegraph and Telephone Corporation) | 7 | * Copyright (C) 2006 NTT (Nippon Telegraph and Telephone Corporation) |
| 8 | * CBC & ECB parts based on code (crypto/cbc.c,ecb.c) by: | ||
| 9 | * Copyright (c) 2006 Herbert Xu <herbert@gondor.apana.org.au> | ||
| 10 | * CTR part based on code (crypto/ctr.c) by: | ||
| 11 | * (C) Copyright IBM Corp. 2007 - Joy Latten <latten@us.ibm.com> | ||
| 12 | * | 8 | * |
| 13 | * This program is free software; you can redistribute it and/or modify | 9 | * This program is free software; you can redistribute it and/or modify |
| 14 | * it under the terms of the GNU General Public License as published by | 10 | * it under the terms of the GNU General Public License as published by |
| @@ -34,9 +30,9 @@ · 19 unmodified lines | |||
| 34 | #include <linux/module.h> | 30 | #include <linux/module.h> |
| 35 | #include <linux/types.h> | 31 | #include <linux/types.h> |
| 36 | #include <crypto/algapi.h> | 32 | #include <crypto/algapi.h> |
| 37 | #include <crypto/b128ops.h> | ||
| 38 | #include <crypto/lrw.h> | 33 | #include <crypto/lrw.h> |
| 39 | #include <crypto/xts.h> | 34 | #include <crypto/xts.h> |
| 35 | #include <asm/crypto/glue_helper.h> | ||
| 40 | 36 | ||
| 41 | #define CAMELLIA_MIN_KEY_SIZE 16 | 37 | #define CAMELLIA_MIN_KEY_SIZE 16 |
| 42 | #define CAMELLIA_MAX_KEY_SIZE 32 | 38 | #define CAMELLIA_MAX_KEY_SIZE 32 |
| @@ -1312,307 +1308,128 @@ static int camellia_setkey(struct crypto_tfm *tfm, const u8 *in_key, · 1269 unmodified lines | |||
| 1312 | &tfm->crt_flags); | 1308 | &tfm->crt_flags); |
| 1313 | } | 1309 | } |
| 1314 | 1310 | ||
| 1315 | static int ecb_crypt(struct blkcipher_desc *desc, struct blkcipher_walk *walk, | 1311 | static void camellia_decrypt_cbc_2way(void *ctx, u128 *dst, const u128 *src) |
| 1316 | void (*fn)(struct camellia_ctx *, u8 *, const u8 *), | ||
| 1317 | void (*fn_2way)(struct camellia_ctx *, u8 *, const u8 *)) | ||
| 1318 | { | 1312 | { |
| 1319 | struct camellia_ctx *ctx = crypto_blkcipher_ctx(desc->tfm); | 1313 | u128 iv = *src; |
| 1320 | unsigned int bsize = CAMELLIA_BLOCK_SIZE; | ||
| 1321 | unsigned int nbytes; | ||
| 1322 | int err; | ||
| 1323 | |||
| 1324 | err = blkcipher_walk_virt(desc, walk); | ||
| 1325 | |||
| 1326 | while ((nbytes = walk->nbytes)) { | ||
| 1327 | u8 *wsrc = walk->src.virt.addr; | ||
| 1328 | u8 *wdst = walk->dst.virt.addr; | ||
| 1329 | |||
| 1330 | /* Process two block batch */ | ||
| 1331 | if (nbytes >= bsize * 2) { | ||
| 1332 | do { | ||
| 1333 | fn_2way(ctx, wdst, wsrc); | ||
| 1334 | |||
| 1335 | wsrc += bsize * 2; | ||
| 1336 | wdst += bsize * 2; | ||
| 1337 | nbytes -= bsize * 2; | ||
| 1338 | } while (nbytes >= bsize * 2); | ||
| 1339 | |||
| 1340 | if (nbytes < bsize) | ||
| 1341 | goto done; | ||
| 1342 | } | ||
| 1343 | |||
| 1344 | /* Handle leftovers */ | ||
| 1345 | do { | ||
| 1346 | fn(ctx, wdst, wsrc); | ||
| 1347 | |||
| 1348 | wsrc += bsize; | ||
| 1349 | wdst += bsize; | ||
| 1350 | nbytes -= bsize; | ||
| 1351 | } while (nbytes >= bsize); | ||
| 1352 | |||
| 1353 | done: | ||
| 1354 | err = blkcipher_walk_done(desc, walk, nbytes); | ||
| 1355 | } | ||
| 1356 | |||
| 1357 | return err; | ||
| 1358 | } | ||
| 1359 | |||
| 1360 | static int ecb_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst, | ||
| 1361 | struct scatterlist *src, unsigned int nbytes) | ||
| 1362 | { | ||
| 1363 | struct blkcipher_walk walk; | ||
| 1364 | |||
| 1365 | blkcipher_walk_init(&walk, dst, src, nbytes); | ||
| 1366 | return ecb_crypt(desc, &walk, camellia_enc_blk, camellia_enc_blk_2way); | ||
| 1367 | } | ||
| 1368 | 1314 | ||
| 1369 | static int ecb_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst, | 1315 | camellia_dec_blk_2way(ctx, (u8 *)dst, (u8 *)src); |
| 1370 | struct scatterlist *src, unsigned int nbytes) | ||
| 1371 | { | ||
| 1372 | struct blkcipher_walk walk; | ||
| 1373 | |||
| 1374 | blkcipher_walk_init(&walk, dst, src, nbytes); | ||
| 1375 | return ecb_crypt(desc, &walk, camellia_dec_blk, camellia_dec_blk_2way); | ||
| 1376 | } | ||
| 1377 | 1316 | ||
| 1378 | static unsigned int __cbc_encrypt(struct blkcipher_desc *desc, | 1317 | u128_xor(&dst[1], &dst[1], &iv); |
| 1379 | struct blkcipher_walk *walk) | ||
| 1380 | { | ||
| 1381 | struct camellia_ctx *ctx = crypto_blkcipher_ctx(desc->tfm); | ||
| 1382 | unsigned int bsize = CAMELLIA_BLOCK_SIZE; | ||
| 1383 | unsigned int nbytes = walk->nbytes; | ||
| 1384 | u128 *src = (u128 *)walk->src.virt.addr; | ||
| 1385 | u128 *dst = (u128 *)walk->dst.virt.addr; | ||
| 1386 | u128 *iv = (u128 *)walk->iv; | ||
| 1387 | |||
| 1388 | do { | ||
| 1389 | u128_xor(dst, src, iv); | ||
| 1390 | camellia_enc_blk(ctx, (u8 *)dst, (u8 *)dst); | ||
| 1391 | iv = dst; | ||
| 1392 | |||
| 1393 | src += 1; | ||
| 1394 | dst += 1; | ||
| 1395 | nbytes -= bsize; | ||
| 1396 | } while (nbytes >= bsize); | ||
| 1397 | |||
| 1398 | u128_xor((u128 *)walk->iv, (u128 *)walk->iv, iv); | ||
| 1399 | return nbytes; | ||
| 1400 | } | 1318 | } |
| 1401 | 1319 | ||
| 1402 | static int cbc_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst, | 1320 | static void camellia_crypt_ctr(void *ctx, u128 *dst, const u128 *src, u128 *iv) |
| 1403 | struct scatterlist *src, unsigned int nbytes) | ||
| 1404 | { | 1321 | { |
| 1405 | struct blkcipher_walk walk; | 1322 | be128 ctrblk; |
| 1406 | int err; | ||
| 1407 | 1323 | ||
| 1408 | blkcipher_walk_init(&walk, dst, src, nbytes); | 1324 | if (dst != src) |
| 1409 | err = blkcipher_walk_virt(desc, &walk); | 1325 | *dst = *src; |
| 1410 | 1326 | ||
| 1411 | while ((nbytes = walk.nbytes)) { | 1327 | u128_to_be128(&ctrblk, iv); |
| 1412 | nbytes = __cbc_encrypt(desc, &walk); | 1328 | u128_inc(iv); |
| 1413 | err = blkcipher_walk_done(desc, &walk, nbytes); | ||
| 1414 | } | ||
| 1415 | 1329 | ||
| 1416 | return err; | 1330 | camellia_enc_blk_xor(ctx, (u8 *)dst, (u8 *)&ctrblk); |
| 1417 | } | 1331 | } |
| 1418 | 1332 | ||
| 1419 | static unsigned int __cbc_decrypt(struct blkcipher_desc *desc, | 1333 | static void camellia_crypt_ctr_2way(void *ctx, u128 *dst, const u128 *src, |
| 1420 | struct blkcipher_walk *walk) | 1334 | u128 *iv) |
| 1421 | { | 1335 | { |
| 1422 | struct camellia_ctx *ctx = crypto_blkcipher_ctx(desc->tfm); | 1336 | be128 ctrblks[2]; |
| 1423 | unsigned int bsize = CAMELLIA_BLOCK_SIZE; | ||
| 1424 | unsigned int nbytes = walk->nbytes; | ||
| 1425 | u128 *src = (u128 *)walk->src.virt.addr; | ||
| 1426 | u128 *dst = (u128 *)walk->dst.virt.addr; | ||
| 1427 | u128 ivs[2 - 1]; | ||
| 1428 | u128 last_iv; | ||
| 1429 | 1337 | ||
| 1430 | /* Start of the last block. */ | 1338 | if (dst != src) { |
| 1431 | src += nbytes / bsize - 1; | 1339 | dst[0] = src[0]; |
| 1432 | dst += nbytes / bsize - 1; | 1340 | dst[1] = src[1]; |
| 1433 | |||
| 1434 | last_iv = *src; | ||
| 1435 | |||
| 1436 | /* Process two block batch */ | ||
| 1437 | if (nbytes >= bsize * 2) { | ||
| 1438 | do { | ||
| 1439 | nbytes -= bsize * (2 - 1); | ||
| 1440 | src -= 2 - 1; | ||
| 1441 | dst -= 2 - 1; | ||
| 1442 | |||
| 1443 | ivs[0] = src[0]; | ||
| 1444 | |||
| 1445 | camellia_dec_blk_2way(ctx, (u8 *)dst, (u8 *)src); | ||
| 1446 | |||
| 1447 | u128_xor(dst + 1, dst + 1, ivs + 0); | ||
| 1448 | |||
| 1449 | nbytes -= bsize; | ||
| 1450 | if (nbytes < bsize) | ||
| 1451 | goto done; | ||
| 1452 | |||
| 1453 | u128_xor(dst, dst, src - 1); | ||
| 1454 | src -= 1; | ||
| 1455 | dst -= 1; | ||
| 1456 | } while (nbytes >= bsize * 2); | ||
| 1457 | |||
| 1458 | if (nbytes < bsize) | ||
| 1459 | goto done; | ||
| 1460 | } | 1341 | } |
| 1461 | 1342 | ||
| 1462 | /* Handle leftovers */ | 1343 | u128_to_be128(&ctrblks[0], iv); |
| 1463 | for (;;) { | 1344 | u128_inc(iv); |
| 1464 | camellia_dec_blk(ctx, (u8 *)dst, (u8 *)src); | 1345 | u128_to_be128(&ctrblks[1], iv); |
| 1465 | 1346 | u128_inc(iv); | |
| 1466 | nbytes -= bsize; | ||
| 1467 | if (nbytes < bsize) | ||
| 1468 | break; | ||
| 1469 | 1347 | ||
| 1470 | u128_xor(dst, dst, src - 1); | 1348 | camellia_enc_blk_xor_2way(ctx, (u8 *)dst, (u8 *)ctrblks); |
| 1471 | src -= 1; | ||
| 1472 | dst -= 1; | ||
| 1473 | } | ||
| 1474 | |||
| 1475 | done: | ||
| 1476 | u128_xor(dst, dst, (u128 *)walk->iv); | ||
| 1477 | *(u128 *)walk->iv = last_iv; | ||
| 1478 | |||
| 1479 | return nbytes; | ||
| 1480 | } | 1349 | } |
| 1481 | 1350 | ||
| 1482 | static int cbc_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst, | 1351 | static const struct common_glue_ctx camellia_enc = { |
| 1483 | struct scatterlist *src, unsigned int nbytes) | 1352 | .num_funcs = 2, |
| 1484 | { | 1353 | .fpu_blocks_limit = -1, |
| 1485 | struct blkcipher_walk walk; | 1354 | |
| 1486 | int err; | 1355 | .funcs = { { |
| 1487 | 1356 | .num_blocks = 2, | |
| 1488 | blkcipher_walk_init(&walk, dst, src, nbytes); | 1357 | .fn_u = { .ecb = GLUE_FUNC_CAST(camellia_enc_blk_2way) } |
| 1489 | err = blkcipher_walk_virt(desc, &walk); | 1358 | }, { |
| 1359 | .num_blocks = 1, | ||
| 1360 | .fn_u = { .ecb = GLUE_FUNC_CAST(camellia_enc_blk) } | ||
| 1361 | } } | ||
| 1362 | }; | ||
| 1490 | 1363 | ||
| 1491 | while ((nbytes = walk.nbytes)) { | 1364 | static const struct common_glue_ctx camellia_ctr = { |
| 1492 | nbytes = __cbc_decrypt(desc, &walk); | 1365 | .num_funcs = 2, |
| 1493 | err = blkcipher_walk_done(desc, &walk, nbytes); | 1366 | .fpu_blocks_limit = -1, |
| 1494 | } | 1367 | |
| 1368 | .funcs = { { | ||
| 1369 | .num_blocks = 2, | ||
| 1370 | .fn_u = { .ctr = GLUE_CTR_FUNC_CAST(camellia_crypt_ctr_2way) } | ||
| 1371 | }, { | ||
| 1372 | .num_blocks = 1, | ||
| 1373 | .fn_u = { .ctr = GLUE_CTR_FUNC_CAST(camellia_crypt_ctr) } | ||
| 1374 | } } | ||
| 1375 | }; | ||
| 1495 | 1376 | ||
| 1496 | return err; | 1377 | static const struct common_glue_ctx camellia_dec = { |
| 1497 | } | 1378 | .num_funcs = 2, |
| 1379 | .fpu_blocks_limit = -1, | ||
| 1380 | |||
| 1381 | .funcs = { { | ||
| 1382 | .num_blocks = 2, | ||
| 1383 | .fn_u = { .ecb = GLUE_FUNC_CAST(camellia_dec_blk_2way) } | ||
| 1384 | }, { | ||
| 1385 | .num_blocks = 1, | ||
| 1386 | .fn_u = { .ecb = GLUE_FUNC_CAST(camellia_dec_blk) } | ||
| 1387 | } } | ||
| 1388 | }; | ||
| 1498 | 1389 | ||
| 1499 | static inline void u128_to_be128(be128 *dst, const u128 *src) | 1390 | static const struct common_glue_ctx camellia_dec_cbc = { |
| 1500 | { | 1391 | .num_funcs = 2, |
| 1501 | dst->a = cpu_to_be64(src->a); | 1392 | .fpu_blocks_limit = -1, |
| 1502 | dst->b = cpu_to_be64(src->b); | 1393 | |
| 1503 | } | 1394 | .funcs = { { |
| 1395 | .num_blocks = 2, | ||
| 1396 | .fn_u = { .cbc = GLUE_CBC_FUNC_CAST(camellia_decrypt_cbc_2way) } | ||
| 1397 | }, { | ||
| 1398 | .num_blocks = 1, | ||
| 1399 | .fn_u = { .cbc = GLUE_CBC_FUNC_CAST(camellia_dec_blk) } | ||
| 1400 | } } | ||
| 1401 | }; | ||
| 1504 | 1402 | ||
| 1505 | static inline void be128_to_u128(u128 *dst, const be128 *src) | 1403 | static int ecb_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst, |
| 1404 | struct scatterlist *src, unsigned int nbytes) | ||
| 1506 | { | 1405 | { |
| 1507 | dst->a = be64_to_cpu(src->a); | 1406 | return glue_ecb_crypt_128bit(&camellia_enc, desc, dst, src, nbytes); |
| 1508 | dst->b = be64_to_cpu(src->b); | ||
| 1509 | } | 1407 | } |
| 1510 | 1408 | ||
| 1511 | static inline void u128_inc(u128 *i) | 1409 | static int ecb_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst, |
| 1410 | struct scatterlist *src, unsigned int nbytes) | ||
| 1512 | { | 1411 | { |
| 1513 | i->b++; | 1412 | return glue_ecb_crypt_128bit(&camellia_dec, desc, dst, src, nbytes); |
| 1514 | if (!i->b) | ||
| 1515 | i->a++; | ||
| 1516 | } | 1413 | } |
| 1517 | 1414 | ||
| 1518 | static void ctr_crypt_final(struct blkcipher_desc *desc, | 1415 | static int cbc_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst, |
| 1519 | struct blkcipher_walk *walk) | 1416 | struct scatterlist *src, unsigned int nbytes) |
| 1520 | { | 1417 | { |
| 1521 | struct camellia_ctx *ctx = crypto_blkcipher_ctx(desc->tfm); | 1418 | return glue_cbc_encrypt_128bit(GLUE_FUNC_CAST(camellia_enc_blk), desc, |
| 1522 | u8 keystream[CAMELLIA_BLOCK_SIZE]; | 1419 | dst, src, nbytes); |
| 1523 | u8 *src = walk->src.virt.addr; | ||
| 1524 | u8 *dst = walk->dst.virt.addr; | ||
| 1525 | unsigned int nbytes = walk->nbytes; | ||
| 1526 | u128 ctrblk; | ||
| 1527 | |||
| 1528 | memcpy(keystream, src, nbytes); | ||
| 1529 | camellia_enc_blk_xor(ctx, keystream, walk->iv); | ||
| 1530 | memcpy(dst, keystream, nbytes); | ||
| 1531 | |||
| 1532 | be128_to_u128(&ctrblk, (be128 *)walk->iv); | ||
| 1533 | u128_inc(&ctrblk); | ||
| 1534 | u128_to_be128((be128 *)walk->iv, &ctrblk); | ||
| 1535 | } | 1420 | } |
| 1536 | 1421 | ||
| 1537 | static unsigned int __ctr_crypt(struct blkcipher_desc *desc, | 1422 | static int cbc_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst, |
| 1538 | struct blkcipher_walk *walk) | 1423 | struct scatterlist *src, unsigned int nbytes) |
| 1539 | { | 1424 | { |
| 1540 | struct camellia_ctx *ctx = crypto_blkcipher_ctx(desc->tfm); | 1425 | return glue_cbc_decrypt_128bit(&camellia_dec_cbc, desc, dst, src, |
| 1541 | unsigned int bsize = CAMELLIA_BLOCK_SIZE; | 1426 | nbytes); |
| 1542 | unsigned int nbytes = walk->nbytes; | ||
| 1543 | u128 *src = (u128 *)walk->src.virt.addr; | ||
| 1544 | u128 *dst = (u128 *)walk->dst.virt.addr; | ||
| 1545 | u128 ctrblk; | ||
| 1546 | be128 ctrblocks[2]; | ||
| 1547 | |||
| 1548 | be128_to_u128(&ctrblk, (be128 *)walk->iv); | ||
| 1549 | |||
| 1550 | /* Process two block batch */ | ||
| 1551 | if (nbytes >= bsize * 2) { | ||
| 1552 | do { | ||
| 1553 | if (dst != src) { | ||
| 1554 | dst[0] = src[0]; | ||
| 1555 | dst[1] = src[1]; | ||
| 1556 | } | ||
| 1557 | |||
| 1558 | /* create ctrblks for parallel encrypt */ | ||
| 1559 | u128_to_be128(&ctrblocks[0], &ctrblk); | ||
| 1560 | u128_inc(&ctrblk); | ||
| 1561 | u128_to_be128(&ctrblocks[1], &ctrblk); | ||
| 1562 | u128_inc(&ctrblk); | ||
| 1563 | |||
| 1564 | camellia_enc_blk_xor_2way(ctx, (u8 *)dst, | ||
| 1565 | (u8 *)ctrblocks); | ||
| 1566 | |||
| 1567 | src += 2; | ||
| 1568 | dst += 2; | ||
| 1569 | nbytes -= bsize * 2; | ||
| 1570 | } while (nbytes >= bsize * 2); | ||
| 1571 | |||
| 1572 | if (nbytes < bsize) | ||
| 1573 | goto done; | ||
| 1574 | } | ||
| 1575 | |||
| 1576 | /* Handle leftovers */ | ||
| 1577 | do { | ||
| 1578 | if (dst != src) | ||
| 1579 | *dst = *src; | ||
| 1580 | |||
| 1581 | u128_to_be128(&ctrblocks[0], &ctrblk); | ||
| 1582 | u128_inc(&ctrblk); | ||
| 1583 | |||
| 1584 | camellia_enc_blk_xor(ctx, (u8 *)dst, (u8 *)ctrblocks); | ||
| 1585 | |||
| 1586 | src += 1; | ||
| 1587 | dst += 1; | ||
| 1588 | nbytes -= bsize; | ||
| 1589 | } while (nbytes >= bsize); | ||
| 1590 | |||
| 1591 | done: | ||
| 1592 | u128_to_be128((be128 *)walk->iv, &ctrblk); | ||
| 1593 | return nbytes; | ||
| 1594 | } | 1427 | } |
| 1595 | 1428 | ||
| 1596 | static int ctr_crypt(struct blkcipher_desc *desc, struct scatterlist *dst, | 1429 | static int ctr_crypt(struct blkcipher_desc *desc, struct scatterlist *dst, |
| 1597 | struct scatterlist *src, unsigned int nbytes) | 1430 | struct scatterlist *src, unsigned int nbytes) |
| 1598 | { | 1431 | { |
| 1599 | struct blkcipher_walk walk; | 1432 | return glue_ctr_crypt_128bit(&camellia_ctr, desc, dst, src, nbytes); |
| 1600 | int err; | ||
| 1601 | |||
| 1602 | blkcipher_walk_init(&walk, dst, src, nbytes); | ||
| 1603 | err = blkcipher_walk_virt_block(desc, &walk, CAMELLIA_BLOCK_SIZE); | ||
| 1604 | |||
| 1605 | while ((nbytes = walk.nbytes) >= CAMELLIA_BLOCK_SIZE) { | ||
| 1606 | nbytes = __ctr_crypt(desc, &walk); | ||
| 1607 | err = blkcipher_walk_done(desc, &walk, nbytes); | ||
| 1608 | } | ||
| 1609 | |||
| 1610 | if (walk.nbytes) { | ||
| 1611 | ctr_crypt_final(desc, &walk); | ||
| 1612 | err = blkcipher_walk_done(desc, &walk, 0); | ||
| 1613 | } | ||
| 1614 | |||
| 1615 | return err; | ||
| 1616 | } | 1433 | } |
| 1617 | 1434 | ||
| 1618 | static void encrypt_callback(void *priv, u8 *srcdst, unsigned int nbytes) | 1435 | static void encrypt_callback(void *priv, u8 *srcdst, unsigned int nbytes) |
| @@ -671,6 +671,7 @@ config CRYPTO_CAMELLIA_X86_64 · 670 unmodified lines | |||
| 671 | depends on X86 && 64BIT | 671 | depends on X86 && 64BIT |
| 672 | depends on CRYPTO | 672 | depends on CRYPTO |
| 673 | select CRYPTO_ALGAPI | 673 | select CRYPTO_ALGAPI |
| 674 | select CRYPTO_GLUE_HELPER_X86 | ||
| 674 | select CRYPTO_LRW | 675 | select CRYPTO_LRW |
| 675 | select CRYPTO_XTS | 676 | select CRYPTO_XTS |
| 676 | help | 677 | help |