aboutsummaryrefslogtreecommitdiffstats
path: root/crypto
diff options
context:
space:
mode:
authorJohannes Goetzfried <Johannes.Goetzfried@informatik.stud.uni-erlangen.de>2012-06-12 04:47:43 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2012-06-12 04:47:43 -0400
commit7efe4076725aeb01722445b56613681aa492c8d6 (patch)
tree138a24608d523e9794012586a904be0360cfebce /crypto
parent4da7de4d8be7d18559c56bca446b1161a3b63acc (diff)
crypto: serpent - add x86_64/avx assembler implementation
This patch adds a x86_64/avx assembler implementation of the Serpent block cipher. The implementation is very similar to the sse2 implementation and processes eight blocks in parallel. Because of the new non-destructive three operand syntax all move-instructions can be removed and therefore a little performance increase is provided. Patch has been tested with tcrypt and automated filesystem tests. Tcrypt benchmark results: Intel Core i5-2500 CPU (fam:6, model:42, step:7) serpent-avx-x86_64 vs. serpent-sse2-x86_64 128bit key: (lrw:256bit) (xts:256bit) size ecb-enc ecb-dec cbc-enc cbc-dec ctr-enc ctr-dec lrw-enc lrw-dec xts-enc xts-dec 16B 1.03x 1.01x 1.01x 1.01x 1.00x 1.00x 1.00x 1.00x 1.00x 1.01x 64B 1.00x 1.00x 1.00x 1.00x 1.00x 0.99x 1.00x 1.01x 1.00x 1.00x 256B 1.05x 1.03x 1.00x 1.02x 1.05x 1.06x 1.05x 1.02x 1.05x 1.02x 1024B 1.05x 1.02x 1.00x 1.02x 1.05x 1.06x 1.05x 1.03x 1.05x 1.02x 8192B 1.05x 1.02x 1.00x 1.02x 1.06x 1.06x 1.04x 1.03x 1.04x 1.02x 256bit key: (lrw:384bit) (xts:512bit) size ecb-enc ecb-dec cbc-enc cbc-dec ctr-enc ctr-dec lrw-enc lrw-dec xts-enc xts-dec 16B 1.01x 1.00x 1.01x 1.01x 1.00x 1.00x 0.99x 1.03x 1.01x 1.01x 64B 1.00x 1.00x 1.00x 1.00x 1.00x 1.00x 1.00x 1.01x 1.00x 1.02x 256B 1.05x 1.02x 1.00x 1.02x 1.05x 1.02x 1.04x 1.05x 1.05x 1.02x 1024B 1.06x 1.02x 1.00x 1.02x 1.07x 1.06x 1.05x 1.04x 1.05x 1.02x 8192B 1.05x 1.02x 1.00x 1.02x 1.06x 1.06x 1.04x 1.05x 1.05x 1.02x serpent-avx-x86_64 vs aes-asm (8kB block): 128bit 256bit ecb-enc 1.26x 1.73x ecb-dec 1.20x 1.64x cbc-enc 0.33x 0.45x cbc-dec 1.24x 1.67x ctr-enc 1.32x 1.76x ctr-dec 1.32x 1.76x lrw-enc 1.20x 1.60x lrw-dec 1.15x 1.54x xts-enc 1.22x 1.64x xts-dec 1.17x 1.57x Signed-off-by: Johannes Goetzfried <Johannes.Goetzfried@informatik.stud.uni-erlangen.de> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'crypto')
-rw-r--r--crypto/Kconfig20
-rw-r--r--crypto/testmgr.c60
2 files changed, 80 insertions, 0 deletions
diff --git a/crypto/Kconfig b/crypto/Kconfig
index e00a4e49e013..2c1c2dfcc02a 100644
--- a/crypto/Kconfig
+++ b/crypto/Kconfig
@@ -821,6 +821,26 @@ config CRYPTO_SERPENT_SSE2_586
821 See also: 821 See also:
822 <http://www.cl.cam.ac.uk/~rja14/serpent.html> 822 <http://www.cl.cam.ac.uk/~rja14/serpent.html>
823 823
824config CRYPTO_SERPENT_AVX_X86_64
825 tristate "Serpent cipher algorithm (x86_64/AVX)"
826 depends on X86 && 64BIT
827 select CRYPTO_ALGAPI
828 select CRYPTO_CRYPTD
829 select CRYPTO_SERPENT
830 select CRYPTO_LRW
831 select CRYPTO_XTS
832 help
833 Serpent cipher algorithm, by Anderson, Biham & Knudsen.
834
835 Keys are allowed to be from 0 to 256 bits in length, in steps
836 of 8 bits.
837
838 This module provides the Serpent cipher algorithm that processes
839 eight blocks parallel using the AVX instruction set.
840
841 See also:
842 <http://www.cl.cam.ac.uk/~rja14/serpent.html>
843
824config CRYPTO_TEA 844config CRYPTO_TEA
825 tristate "TEA, XTEA and XETA cipher algorithms" 845 tristate "TEA, XTEA and XETA cipher algorithms"
826 select CRYPTO_ALGAPI 846 select CRYPTO_ALGAPI
diff --git a/crypto/testmgr.c b/crypto/testmgr.c
index 73b3ec6fe1a2..36748a5996e2 100644
--- a/crypto/testmgr.c
+++ b/crypto/testmgr.c
@@ -1534,6 +1534,21 @@ static int alg_test_null(const struct alg_test_desc *desc,
1534/* Please keep this list sorted by algorithm name. */ 1534/* Please keep this list sorted by algorithm name. */
1535static const struct alg_test_desc alg_test_descs[] = { 1535static const struct alg_test_desc alg_test_descs[] = {
1536 { 1536 {
1537 .alg = "__cbc-serpent-avx",
1538 .test = alg_test_null,
1539 .suite = {
1540 .cipher = {
1541 .enc = {
1542 .vecs = NULL,
1543 .count = 0
1544 },
1545 .dec = {
1546 .vecs = NULL,
1547 .count = 0
1548 }
1549 }
1550 }
1551 }, {
1537 .alg = "__cbc-serpent-sse2", 1552 .alg = "__cbc-serpent-sse2",
1538 .test = alg_test_null, 1553 .test = alg_test_null,
1539 .suite = { 1554 .suite = {
@@ -1579,6 +1594,21 @@ static const struct alg_test_desc alg_test_descs[] = {
1579 } 1594 }
1580 } 1595 }
1581 }, { 1596 }, {
1597 .alg = "__driver-cbc-serpent-avx",
1598 .test = alg_test_null,
1599 .suite = {
1600 .cipher = {
1601 .enc = {
1602 .vecs = NULL,
1603 .count = 0
1604 },
1605 .dec = {
1606 .vecs = NULL,
1607 .count = 0
1608 }
1609 }
1610 }
1611 }, {
1582 .alg = "__driver-cbc-serpent-sse2", 1612 .alg = "__driver-cbc-serpent-sse2",
1583 .test = alg_test_null, 1613 .test = alg_test_null,
1584 .suite = { 1614 .suite = {
@@ -1624,6 +1654,21 @@ static const struct alg_test_desc alg_test_descs[] = {
1624 } 1654 }
1625 } 1655 }
1626 }, { 1656 }, {
1657 .alg = "__driver-ecb-serpent-avx",
1658 .test = alg_test_null,
1659 .suite = {
1660 .cipher = {
1661 .enc = {
1662 .vecs = NULL,
1663 .count = 0
1664 },
1665 .dec = {
1666 .vecs = NULL,
1667 .count = 0
1668 }
1669 }
1670 }
1671 }, {
1627 .alg = "__driver-ecb-serpent-sse2", 1672 .alg = "__driver-ecb-serpent-sse2",
1628 .test = alg_test_null, 1673 .test = alg_test_null,
1629 .suite = { 1674 .suite = {
@@ -1836,6 +1881,21 @@ static const struct alg_test_desc alg_test_descs[] = {
1836 } 1881 }
1837 } 1882 }
1838 }, { 1883 }, {
1884 .alg = "cryptd(__driver-ecb-serpent-avx)",
1885 .test = alg_test_null,
1886 .suite = {
1887 .cipher = {
1888 .enc = {
1889 .vecs = NULL,
1890 .count = 0
1891 },
1892 .dec = {
1893 .vecs = NULL,
1894 .count = 0
1895 }
1896 }
1897 }
1898 }, {
1839 .alg = "cryptd(__driver-ecb-serpent-sse2)", 1899 .alg = "cryptd(__driver-ecb-serpent-sse2)",
1840 .test = alg_test_null, 1900 .test = alg_test_null,
1841 .suite = { 1901 .suite = {