Merge git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 4 Oct 2012 16:06:34 +0000 (09:06 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 4 Oct 2012 16:06:34 +0000 (09:06 -0700)
Pull crypto update from Herbert Xu:
 - Optimised AES/SHA1 for ARM.
 - IPsec ESN support in talitos and caam.
 - x86_64/avx implementation of cast5/cast6.
 - Add/use multi-algorithm registration helpers where possible.
 - Added IBM Power7+ in-Nest support.
 - Misc fixes.

Fix up trivial conflicts in crypto/Kconfig due to the sparc64 crypto
config options being added next to the new ARM ones.

[ Side note: cut-and-paste duplicate help texts make those conflicts
  harder to read than necessary, thanks to git being smart about
  minimizing conflicts and maximizing the common parts... ]

* git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6: (71 commits)
  crypto: x86/glue_helper - fix storing of new IV in CBC encryption
  crypto: cast5/avx - fix storing of new IV in CBC encryption
  crypto: tcrypt - add missing tests for camellia and ghash
  crypto: testmgr - make test_aead also test 'dst != src' code paths
  crypto: testmgr - make test_skcipher also test 'dst != src' code paths
  crypto: testmgr - add test vectors for CTR mode IV increasement
  crypto: testmgr - add test vectors for partial ctr(cast5) and ctr(cast6)
  crypto: testmgr - allow non-multi page and multi page skcipher tests from same test template
  crypto: caam - increase TRNG clocks per sample
  crypto, tcrypt: remove local_bh_disable/enable() around local_irq_disable/enable()
  crypto: tegra-aes - fix error return code
  crypto: crypto4xx - fix error return code
  crypto: hifn_795x - fix error return code
  crypto: ux500 - fix error return code
  crypto: caam - fix error IDs for SEC v5.x RNG4
  hwrng: mxc-rnga - Access data via structure
  hwrng: mxc-rnga - Adapt clocks to new i.mx clock framework
  crypto: caam - add IPsec ESN support
  crypto: 842 - remove .cra_list initialization
  Revert "[CRYPTO] cast6: inline bloat--"
  ...

100 files changed:
MAINTAINERS
arch/arm/Makefile
arch/arm/crypto/Makefile [new file with mode: 0644]
arch/arm/crypto/aes-armv4.S [new file with mode: 0644]
arch/arm/crypto/aes_glue.c [new file with mode: 0644]
arch/arm/crypto/sha1-armv4-large.S [new file with mode: 0644]
arch/arm/crypto/sha1_glue.c [new file with mode: 0644]
arch/powerpc/configs/ppc64_defconfig
arch/powerpc/configs/pseries_defconfig
arch/powerpc/kernel/prom_init.c
arch/s390/crypto/aes_s390.c
arch/s390/crypto/des_s390.c
arch/s390/crypto/ghash_s390.c
arch/x86/crypto/Makefile
arch/x86/crypto/aes_glue.c
arch/x86/crypto/aesni-intel_glue.c
arch/x86/crypto/blowfish_glue.c
arch/x86/crypto/camellia_glue.c
arch/x86/crypto/cast5-avx-x86_64-asm_64.S [new file with mode: 0644]
arch/x86/crypto/cast5_avx_glue.c [new file with mode: 0644]
arch/x86/crypto/cast6-avx-x86_64-asm_64.S [new file with mode: 0644]
arch/x86/crypto/cast6_avx_glue.c [new file with mode: 0644]
arch/x86/crypto/ghash-clmulni-intel_glue.c
arch/x86/crypto/glue_helper.c
arch/x86/crypto/salsa20_glue.c
arch/x86/crypto/serpent_avx_glue.c
arch/x86/crypto/serpent_sse2_glue.c
arch/x86/crypto/twofish-avx-x86_64-asm_64.S
arch/x86/crypto/twofish_avx_glue.c
arch/x86/crypto/twofish_glue.c
arch/x86/crypto/twofish_glue_3way.c
crypto/842.c [new file with mode: 0644]
crypto/Kconfig
crypto/Makefile
crypto/aes_generic.c
crypto/ansi_cprng.c
crypto/anubis.c
crypto/blowfish_generic.c
crypto/camellia_generic.c
crypto/cast5_generic.c [moved from crypto/cast5.c with 95% similarity]
crypto/cast6_generic.c [moved from crypto/cast6.c with 93% similarity]
crypto/crypto_null.c
crypto/crypto_user.c
crypto/deflate.c
crypto/des_generic.c
crypto/fcrypt.c
crypto/ghash-generic.c
crypto/khazad.c
crypto/krng.c
crypto/lzo.c
crypto/salsa20_generic.c
crypto/seed.c
crypto/serpent_generic.c
crypto/sha256_generic.c
crypto/sha512_generic.c
crypto/shash.c
crypto/tcrypt.c
crypto/tcrypt.h
crypto/tea.c
crypto/testmgr.c
crypto/testmgr.h
crypto/tgr192.c
crypto/twofish_generic.c
crypto/vmac.c
crypto/wp512.c
drivers/char/hw_random/mxc-rnga.c
drivers/char/hw_random/octeon-rng.c
drivers/crypto/Kconfig
drivers/crypto/amcc/crypto4xx_core.c
drivers/crypto/atmel-aes.c
drivers/crypto/atmel-sha.c
drivers/crypto/atmel-tdes.c
drivers/crypto/caam/caamalg.c
drivers/crypto/caam/caamhash.c
drivers/crypto/caam/caamrng.c
drivers/crypto/caam/compat.h
drivers/crypto/caam/ctrl.c
drivers/crypto/caam/error.c
drivers/crypto/caam/key_gen.c
drivers/crypto/geode-aes.c
drivers/crypto/hifn_795x.c
drivers/crypto/nx/Kconfig [new file with mode: 0644]
drivers/crypto/nx/Makefile
drivers/crypto/nx/nx-842.c [new file with mode: 0644]
drivers/crypto/nx/nx-aes-cbc.c
drivers/crypto/nx/nx-aes-ccm.c
drivers/crypto/nx/nx-aes-ctr.c
drivers/crypto/nx/nx-aes-ecb.c
drivers/crypto/nx/nx-aes-gcm.c
drivers/crypto/omap-aes.c
drivers/crypto/padlock-aes.c
drivers/crypto/s5p-sss.c
drivers/crypto/talitos.c
drivers/crypto/tegra-aes.c
drivers/crypto/ux500/cryp/cryp_core.c
drivers/crypto/ux500/hash/hash_core.c
include/crypto/cast5.h [new file with mode: 0644]
include/crypto/cast6.h [new file with mode: 0644]
include/crypto/internal/hash.h
include/linux/nx842.h [new file with mode: 0644]

index d919e3d..f883fc1 100644 (file)
@@ -3438,6 +3438,18 @@ T:       git git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux.git
 S:     Maintained
 F:     arch/ia64/
 
+IBM Power in-Nest Crypto Acceleration
+M:     Kent Yoder <key@linux.vnet.ibm.com>
+L:     linux-crypto@vger.kernel.org
+S:     Supported
+F:     drivers/crypto/nx/
+
+IBM Power 842 compression accelerator
+M:     Robert Jennings <rcj@linux.vnet.ibm.com>
+S:     Supported
+F:     drivers/crypto/nx/nx-842.c
+F:     include/linux/nx842.h
+
 IBM Power Linux RAID adapter
 M:     Brian King <brking@us.ibm.com>
 S:     Supported
index 770da51..b86e57e 100644 (file)
@@ -254,6 +254,7 @@ core-$(CONFIG_VFP)          += arch/arm/vfp/
 # If we have a machine-specific directory, then include it in the build.
 core-y                         += arch/arm/kernel/ arch/arm/mm/ arch/arm/common/
 core-y                         += arch/arm/net/
+core-y                         += arch/arm/crypto/
 core-y                         += $(machdirs) $(platdirs)
 
 drivers-$(CONFIG_OPROFILE)      += arch/arm/oprofile/
diff --git a/arch/arm/crypto/Makefile b/arch/arm/crypto/Makefile
new file mode 100644 (file)
index 0000000..a2c8385
--- /dev/null
@@ -0,0 +1,9 @@
+#
+# Arch-specific CryptoAPI modules.
+#
+
+obj-$(CONFIG_CRYPTO_AES_ARM) += aes-arm.o
+obj-$(CONFIG_CRYPTO_SHA1_ARM) += sha1-arm.o
+
+aes-arm-y  := aes-armv4.o aes_glue.o
+sha1-arm-y := sha1-armv4-large.o sha1_glue.o
diff --git a/arch/arm/crypto/aes-armv4.S b/arch/arm/crypto/aes-armv4.S
new file mode 100644 (file)
index 0000000..e59b1d5
--- /dev/null
@@ -0,0 +1,1112 @@
+#define __ARM_ARCH__ __LINUX_ARM_ARCH__
+@ ====================================================================
+@ Written by Andy Polyakov <appro@fy.chalmers.se> for the OpenSSL
+@ project. The module is, however, dual licensed under OpenSSL and
+@ CRYPTOGAMS licenses depending on where you obtain it. For further
+@ details see http://www.openssl.org/~appro/cryptogams/.
+@ ====================================================================
+
+@ AES for ARMv4
+
+@ January 2007.
+@
+@ Code uses single 1K S-box and is >2 times faster than code generated
+@ by gcc-3.4.1. This is thanks to unique feature of ARMv4 ISA, which
+@ allows to merge logical or arithmetic operation with shift or rotate
+@ in one instruction and emit combined result every cycle. The module
+@ is endian-neutral. The performance is ~42 cycles/byte for 128-bit
+@ key [on single-issue Xscale PXA250 core].
+
+@ May 2007.
+@
+@ AES_set_[en|de]crypt_key is added.
+
+@ July 2010.
+@
+@ Rescheduling for dual-issue pipeline resulted in 12% improvement on
+@ Cortex A8 core and ~25 cycles per byte processed with 128-bit key.
+
+@ February 2011.
+@
+@ Profiler-assisted and platform-specific optimization resulted in 16%
+@ improvement on Cortex A8 core and ~21.5 cycles per byte.
+
+@ A little glue here to select the correct code below for the ARM CPU
+@ that is being targetted.
+
+.text
+.code  32
+
+.type  AES_Te,%object
+.align 5
+AES_Te:
+.word  0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d
+.word  0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554
+.word  0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d
+.word  0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a
+.word  0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87
+.word  0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b
+.word  0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea
+.word  0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b
+.word  0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a
+.word  0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f
+.word  0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108
+.word  0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f
+.word  0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e
+.word  0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5
+.word  0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d
+.word  0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f
+.word  0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e
+.word  0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb
+.word  0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce
+.word  0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497
+.word  0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c
+.word  0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed
+.word  0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b
+.word  0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a
+.word  0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16
+.word  0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594
+.word  0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81
+.word  0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3
+.word  0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a
+.word  0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504
+.word  0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163
+.word  0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d
+.word  0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f
+.word  0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739
+.word  0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47
+.word  0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395
+.word  0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f
+.word  0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883
+.word  0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c
+.word  0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76
+.word  0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e
+.word  0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4
+.word  0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6
+.word  0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b
+.word  0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7
+.word  0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0
+.word  0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25
+.word  0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818
+.word  0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72
+.word  0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651
+.word  0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21
+.word  0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85
+.word  0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa
+.word  0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12
+.word  0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0
+.word  0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9
+.word  0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133
+.word  0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7
+.word  0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920
+.word  0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a
+.word  0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17
+.word  0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8
+.word  0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11
+.word  0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a
+@ Te4[256]
+.byte  0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5
+.byte  0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76
+.byte  0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0
+.byte  0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0
+.byte  0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc
+.byte  0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15
+.byte  0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a
+.byte  0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75
+.byte  0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0
+.byte  0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84
+.byte  0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b
+.byte  0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf
+.byte  0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85
+.byte  0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8
+.byte  0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5
+.byte  0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2
+.byte  0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17
+.byte  0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73
+.byte  0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88
+.byte  0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb
+.byte  0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c
+.byte  0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79
+.byte  0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9
+.byte  0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08
+.byte  0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6
+.byte  0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a
+.byte  0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e
+.byte  0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e
+.byte  0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94
+.byte  0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf
+.byte  0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68
+.byte  0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
+@ rcon[]
+.word  0x01000000, 0x02000000, 0x04000000, 0x08000000
+.word  0x10000000, 0x20000000, 0x40000000, 0x80000000
+.word  0x1B000000, 0x36000000, 0, 0, 0, 0, 0, 0
+.size  AES_Te,.-AES_Te
+
+@ void AES_encrypt(const unsigned char *in, unsigned char *out,
+@               const AES_KEY *key) {
+.global AES_encrypt
+.type   AES_encrypt,%function
+.align 5
+AES_encrypt:
+       sub     r3,pc,#8                @ AES_encrypt
+       stmdb   sp!,{r1,r4-r12,lr}
+       mov     r12,r0          @ inp
+       mov     r11,r2
+       sub     r10,r3,#AES_encrypt-AES_Te      @ Te
+#if __ARM_ARCH__<7
+       ldrb    r0,[r12,#3]     @ load input data in endian-neutral
+       ldrb    r4,[r12,#2]     @ manner...
+       ldrb    r5,[r12,#1]
+       ldrb    r6,[r12,#0]
+       orr     r0,r0,r4,lsl#8
+       ldrb    r1,[r12,#7]
+       orr     r0,r0,r5,lsl#16
+       ldrb    r4,[r12,#6]
+       orr     r0,r0,r6,lsl#24
+       ldrb    r5,[r12,#5]
+       ldrb    r6,[r12,#4]
+       orr     r1,r1,r4,lsl#8
+       ldrb    r2,[r12,#11]
+       orr     r1,r1,r5,lsl#16
+       ldrb    r4,[r12,#10]
+       orr     r1,r1,r6,lsl#24
+       ldrb    r5,[r12,#9]
+       ldrb    r6,[r12,#8]
+       orr     r2,r2,r4,lsl#8
+       ldrb    r3,[r12,#15]
+       orr     r2,r2,r5,lsl#16
+       ldrb    r4,[r12,#14]
+       orr     r2,r2,r6,lsl#24
+       ldrb    r5,[r12,#13]
+       ldrb    r6,[r12,#12]
+       orr     r3,r3,r4,lsl#8
+       orr     r3,r3,r5,lsl#16
+       orr     r3,r3,r6,lsl#24
+#else
+       ldr     r0,[r12,#0]
+       ldr     r1,[r12,#4]
+       ldr     r2,[r12,#8]
+       ldr     r3,[r12,#12]
+#ifdef __ARMEL__
+       rev     r0,r0
+       rev     r1,r1
+       rev     r2,r2
+       rev     r3,r3
+#endif
+#endif
+       bl      _armv4_AES_encrypt
+
+       ldr     r12,[sp],#4             @ pop out
+#if __ARM_ARCH__>=7
+#ifdef __ARMEL__
+       rev     r0,r0
+       rev     r1,r1
+       rev     r2,r2
+       rev     r3,r3
+#endif
+       str     r0,[r12,#0]
+       str     r1,[r12,#4]
+       str     r2,[r12,#8]
+       str     r3,[r12,#12]
+#else
+       mov     r4,r0,lsr#24            @ write output in endian-neutral
+       mov     r5,r0,lsr#16            @ manner...
+       mov     r6,r0,lsr#8
+       strb    r4,[r12,#0]
+       strb    r5,[r12,#1]
+       mov     r4,r1,lsr#24
+       strb    r6,[r12,#2]
+       mov     r5,r1,lsr#16
+       strb    r0,[r12,#3]
+       mov     r6,r1,lsr#8
+       strb    r4,[r12,#4]
+       strb    r5,[r12,#5]
+       mov     r4,r2,lsr#24
+       strb    r6,[r12,#6]
+       mov     r5,r2,lsr#16
+       strb    r1,[r12,#7]
+       mov     r6,r2,lsr#8
+       strb    r4,[r12,#8]
+       strb    r5,[r12,#9]
+       mov     r4,r3,lsr#24
+       strb    r6,[r12,#10]
+       mov     r5,r3,lsr#16
+       strb    r2,[r12,#11]
+       mov     r6,r3,lsr#8
+       strb    r4,[r12,#12]
+       strb    r5,[r12,#13]
+       strb    r6,[r12,#14]
+       strb    r3,[r12,#15]
+#endif
+#if __ARM_ARCH__>=5
+       ldmia   sp!,{r4-r12,pc}
+#else
+       ldmia   sp!,{r4-r12,lr}
+       tst     lr,#1
+       moveq   pc,lr                   @ be binary compatible with V4, yet
+       .word   0xe12fff1e                      @ interoperable with Thumb ISA:-)
+#endif
+.size  AES_encrypt,.-AES_encrypt
+
+.type   _armv4_AES_encrypt,%function
+.align 2
+_armv4_AES_encrypt:
+       str     lr,[sp,#-4]!            @ push lr
+       ldmia   r11!,{r4-r7}
+       eor     r0,r0,r4
+       ldr     r12,[r11,#240-16]
+       eor     r1,r1,r5
+       eor     r2,r2,r6
+       eor     r3,r3,r7
+       sub     r12,r12,#1
+       mov     lr,#255
+
+       and     r7,lr,r0
+       and     r8,lr,r0,lsr#8
+       and     r9,lr,r0,lsr#16
+       mov     r0,r0,lsr#24
+.Lenc_loop:
+       ldr     r4,[r10,r7,lsl#2]       @ Te3[s0>>0]
+       and     r7,lr,r1,lsr#16 @ i0
+       ldr     r5,[r10,r8,lsl#2]       @ Te2[s0>>8]
+       and     r8,lr,r1
+       ldr     r6,[r10,r9,lsl#2]       @ Te1[s0>>16]
+       and     r9,lr,r1,lsr#8
+       ldr     r0,[r10,r0,lsl#2]       @ Te0[s0>>24]
+       mov     r1,r1,lsr#24
+
+       ldr     r7,[r10,r7,lsl#2]       @ Te1[s1>>16]
+       ldr     r8,[r10,r8,lsl#2]       @ Te3[s1>>0]
+       ldr     r9,[r10,r9,lsl#2]       @ Te2[s1>>8]
+       eor     r0,r0,r7,ror#8
+       ldr     r1,[r10,r1,lsl#2]       @ Te0[s1>>24]
+       and     r7,lr,r2,lsr#8  @ i0
+       eor     r5,r5,r8,ror#8
+       and     r8,lr,r2,lsr#16 @ i1
+       eor     r6,r6,r9,ror#8
+       and     r9,lr,r2
+       ldr     r7,[r10,r7,lsl#2]       @ Te2[s2>>8]
+       eor     r1,r1,r4,ror#24
+       ldr     r8,[r10,r8,lsl#2]       @ Te1[s2>>16]
+       mov     r2,r2,lsr#24
+
+       ldr     r9,[r10,r9,lsl#2]       @ Te3[s2>>0]
+       eor     r0,r0,r7,ror#16
+       ldr     r2,[r10,r2,lsl#2]       @ Te0[s2>>24]
+       and     r7,lr,r3                @ i0
+       eor     r1,r1,r8,ror#8
+       and     r8,lr,r3,lsr#8  @ i1
+       eor     r6,r6,r9,ror#16
+       and     r9,lr,r3,lsr#16 @ i2
+       ldr     r7,[r10,r7,lsl#2]       @ Te3[s3>>0]
+       eor     r2,r2,r5,ror#16
+       ldr     r8,[r10,r8,lsl#2]       @ Te2[s3>>8]
+       mov     r3,r3,lsr#24
+
+       ldr     r9,[r10,r9,lsl#2]       @ Te1[s3>>16]
+       eor     r0,r0,r7,ror#24
+       ldr     r7,[r11],#16
+       eor     r1,r1,r8,ror#16
+       ldr     r3,[r10,r3,lsl#2]       @ Te0[s3>>24]
+       eor     r2,r2,r9,ror#8
+       ldr     r4,[r11,#-12]
+       eor     r3,r3,r6,ror#8
+
+       ldr     r5,[r11,#-8]
+       eor     r0,r0,r7
+       ldr     r6,[r11,#-4]
+       and     r7,lr,r0
+       eor     r1,r1,r4
+       and     r8,lr,r0,lsr#8
+       eor     r2,r2,r5
+       and     r9,lr,r0,lsr#16
+       eor     r3,r3,r6
+       mov     r0,r0,lsr#24
+
+       subs    r12,r12,#1
+       bne     .Lenc_loop
+
+       add     r10,r10,#2
+
+       ldrb    r4,[r10,r7,lsl#2]       @ Te4[s0>>0]
+       and     r7,lr,r1,lsr#16 @ i0
+       ldrb    r5,[r10,r8,lsl#2]       @ Te4[s0>>8]
+       and     r8,lr,r1
+       ldrb    r6,[r10,r9,lsl#2]       @ Te4[s0>>16]
+       and     r9,lr,r1,lsr#8
+       ldrb    r0,[r10,r0,lsl#2]       @ Te4[s0>>24]
+       mov     r1,r1,lsr#24
+
+       ldrb    r7,[r10,r7,lsl#2]       @ Te4[s1>>16]
+       ldrb    r8,[r10,r8,lsl#2]       @ Te4[s1>>0]
+       ldrb    r9,[r10,r9,lsl#2]       @ Te4[s1>>8]
+       eor     r0,r7,r0,lsl#8
+       ldrb    r1,[r10,r1,lsl#2]       @ Te4[s1>>24]
+       and     r7,lr,r2,lsr#8  @ i0
+       eor     r5,r8,r5,lsl#8
+       and     r8,lr,r2,lsr#16 @ i1
+       eor     r6,r9,r6,lsl#8
+       and     r9,lr,r2
+       ldrb    r7,[r10,r7,lsl#2]       @ Te4[s2>>8]
+       eor     r1,r4,r1,lsl#24
+       ldrb    r8,[r10,r8,lsl#2]       @ Te4[s2>>16]
+       mov     r2,r2,lsr#24
+
+       ldrb    r9,[r10,r9,lsl#2]       @ Te4[s2>>0]
+       eor     r0,r7,r0,lsl#8
+       ldrb    r2,[r10,r2,lsl#2]       @ Te4[s2>>24]
+       and     r7,lr,r3                @ i0
+       eor     r1,r1,r8,lsl#16
+       and     r8,lr,r3,lsr#8  @ i1
+       eor     r6,r9,r6,lsl#8
+       and     r9,lr,r3,lsr#16 @ i2
+       ldrb    r7,[r10,r7,lsl#2]       @ Te4[s3>>0]
+       eor     r2,r5,r2,lsl#24
+       ldrb    r8,[r10,r8,lsl#2]       @ Te4[s3>>8]
+       mov     r3,r3,lsr#24
+
+       ldrb    r9,[r10,r9,lsl#2]       @ Te4[s3>>16]
+       eor     r0,r7,r0,lsl#8
+       ldr     r7,[r11,#0]
+       ldrb    r3,[r10,r3,lsl#2]       @ Te4[s3>>24]
+       eor     r1,r1,r8,lsl#8
+       ldr     r4,[r11,#4]
+       eor     r2,r2,r9,lsl#16
+       ldr     r5,[r11,#8]
+       eor     r3,r6,r3,lsl#24
+       ldr     r6,[r11,#12]
+
+       eor     r0,r0,r7
+       eor     r1,r1,r4
+       eor     r2,r2,r5
+       eor     r3,r3,r6
+
+       sub     r10,r10,#2
+       ldr     pc,[sp],#4              @ pop and return
+.size  _armv4_AES_encrypt,.-_armv4_AES_encrypt
+
+.global private_AES_set_encrypt_key
+.type   private_AES_set_encrypt_key,%function
+.align 5
+private_AES_set_encrypt_key:
+_armv4_AES_set_encrypt_key:
+       sub     r3,pc,#8                @ AES_set_encrypt_key
+       teq     r0,#0
+       moveq   r0,#-1
+       beq     .Labrt
+       teq     r2,#0
+       moveq   r0,#-1
+       beq     .Labrt
+
+       teq     r1,#128
+       beq     .Lok
+       teq     r1,#192
+       beq     .Lok
+       teq     r1,#256
+       movne   r0,#-1
+       bne     .Labrt
+
+.Lok:  stmdb   sp!,{r4-r12,lr}
+       sub     r10,r3,#_armv4_AES_set_encrypt_key-AES_Te-1024  @ Te4
+
+       mov     r12,r0          @ inp
+       mov     lr,r1                   @ bits
+       mov     r11,r2                  @ key
+
+#if __ARM_ARCH__<7
+       ldrb    r0,[r12,#3]     @ load input data in endian-neutral
+       ldrb    r4,[r12,#2]     @ manner...
+       ldrb    r5,[r12,#1]
+       ldrb    r6,[r12,#0]
+       orr     r0,r0,r4,lsl#8
+       ldrb    r1,[r12,#7]
+       orr     r0,r0,r5,lsl#16
+       ldrb    r4,[r12,#6]
+       orr     r0,r0,r6,lsl#24
+       ldrb    r5,[r12,#5]
+       ldrb    r6,[r12,#4]
+       orr     r1,r1,r4,lsl#8
+       ldrb    r2,[r12,#11]
+       orr     r1,r1,r5,lsl#16
+       ldrb    r4,[r12,#10]
+       orr     r1,r1,r6,lsl#24
+       ldrb    r5,[r12,#9]
+       ldrb    r6,[r12,#8]
+       orr     r2,r2,r4,lsl#8
+       ldrb    r3,[r12,#15]
+       orr     r2,r2,r5,lsl#16
+       ldrb    r4,[r12,#14]
+       orr     r2,r2,r6,lsl#24
+       ldrb    r5,[r12,#13]
+       ldrb    r6,[r12,#12]
+       orr     r3,r3,r4,lsl#8
+       str     r0,[r11],#16
+       orr     r3,r3,r5,lsl#16
+       str     r1,[r11,#-12]
+       orr     r3,r3,r6,lsl#24
+       str     r2,[r11,#-8]
+       str     r3,[r11,#-4]
+#else
+       ldr     r0,[r12,#0]
+       ldr     r1,[r12,#4]
+       ldr     r2,[r12,#8]
+       ldr     r3,[r12,#12]
+#ifdef __ARMEL__
+       rev     r0,r0
+       rev     r1,r1
+       rev     r2,r2
+       rev     r3,r3
+#endif
+       str     r0,[r11],#16
+       str     r1,[r11,#-12]
+       str     r2,[r11,#-8]
+       str     r3,[r11,#-4]
+#endif
+
+       teq     lr,#128
+       bne     .Lnot128
+       mov     r12,#10
+       str     r12,[r11,#240-16]
+       add     r6,r10,#256                     @ rcon
+       mov     lr,#255
+
+.L128_loop:
+       and     r5,lr,r3,lsr#24
+       and     r7,lr,r3,lsr#16
+       ldrb    r5,[r10,r5]
+       and     r8,lr,r3,lsr#8
+       ldrb    r7,[r10,r7]
+       and     r9,lr,r3
+       ldrb    r8,[r10,r8]
+       orr     r5,r5,r7,lsl#24
+       ldrb    r9,[r10,r9]
+       orr     r5,r5,r8,lsl#16
+       ldr     r4,[r6],#4                      @ rcon[i++]
+       orr     r5,r5,r9,lsl#8
+       eor     r5,r5,r4
+       eor     r0,r0,r5                        @ rk[4]=rk[0]^...
+       eor     r1,r1,r0                        @ rk[5]=rk[1]^rk[4]
+       str     r0,[r11],#16
+       eor     r2,r2,r1                        @ rk[6]=rk[2]^rk[5]
+       str     r1,[r11,#-12]
+       eor     r3,r3,r2                        @ rk[7]=rk[3]^rk[6]
+       str     r2,[r11,#-8]
+       subs    r12,r12,#1
+       str     r3,[r11,#-4]
+       bne     .L128_loop
+       sub     r2,r11,#176
+       b       .Ldone
+
+.Lnot128:
+#if __ARM_ARCH__<7
+       ldrb    r8,[r12,#19]
+       ldrb    r4,[r12,#18]
+       ldrb    r5,[r12,#17]
+       ldrb    r6,[r12,#16]
+       orr     r8,r8,r4,lsl#8
+       ldrb    r9,[r12,#23]
+       orr     r8,r8,r5,lsl#16
+       ldrb    r4,[r12,#22]
+       orr     r8,r8,r6,lsl#24
+       ldrb    r5,[r12,#21]
+       ldrb    r6,[r12,#20]
+       orr     r9,r9,r4,lsl#8
+       orr     r9,r9,r5,lsl#16
+       str     r8,[r11],#8
+       orr     r9,r9,r6,lsl#24
+       str     r9,[r11,#-4]
+#else
+       ldr     r8,[r12,#16]
+       ldr     r9,[r12,#20]
+#ifdef __ARMEL__
+       rev     r8,r8
+       rev     r9,r9
+#endif
+       str     r8,[r11],#8
+       str     r9,[r11,#-4]
+#endif
+
+       teq     lr,#192
+       bne     .Lnot192
+       mov     r12,#12
+       str     r12,[r11,#240-24]
+       add     r6,r10,#256                     @ rcon
+       mov     lr,#255
+       mov     r12,#8
+
+.L192_loop:
+       and     r5,lr,r9,lsr#24
+       and     r7,lr,r9,lsr#16
+       ldrb    r5,[r10,r5]
+       and     r8,lr,r9,lsr#8
+       ldrb    r7,[r10,r7]
+       and     r9,lr,r9
+       ldrb    r8,[r10,r8]
+       orr     r5,r5,r7,lsl#24
+       ldrb    r9,[r10,r9]
+       orr     r5,r5,r8,lsl#16
+       ldr     r4,[r6],#4                      @ rcon[i++]
+       orr     r5,r5,r9,lsl#8
+       eor     r9,r5,r4
+       eor     r0,r0,r9                        @ rk[6]=rk[0]^...
+       eor     r1,r1,r0                        @ rk[7]=rk[1]^rk[6]
+       str     r0,[r11],#24
+       eor     r2,r2,r1                        @ rk[8]=rk[2]^rk[7]
+       str     r1,[r11,#-20]
+       eor     r3,r3,r2                        @ rk[9]=rk[3]^rk[8]
+       str     r2,[r11,#-16]
+       subs    r12,r12,#1
+       str     r3,[r11,#-12]
+       subeq   r2,r11,#216
+       beq     .Ldone
+
+       ldr     r7,[r11,#-32]
+       ldr     r8,[r11,#-28]
+       eor     r7,r7,r3                        @ rk[10]=rk[4]^rk[9]
+       eor     r9,r8,r7                        @ rk[11]=rk[5]^rk[10]
+       str     r7,[r11,#-8]
+       str     r9,[r11,#-4]
+       b       .L192_loop
+
+.Lnot192:
+#if __ARM_ARCH__<7
+       ldrb    r8,[r12,#27]
+       ldrb    r4,[r12,#26]
+       ldrb    r5,[r12,#25]
+       ldrb    r6,[r12,#24]
+       orr     r8,r8,r4,lsl#8
+       ldrb    r9,[r12,#31]
+       orr     r8,r8,r5,lsl#16
+       ldrb    r4,[r12,#30]
+       orr     r8,r8,r6,lsl#24
+       ldrb    r5,[r12,#29]
+       ldrb    r6,[r12,#28]
+       orr     r9,r9,r4,lsl#8
+       orr     r9,r9,r5,lsl#16
+       str     r8,[r11],#8
+       orr     r9,r9,r6,lsl#24
+       str     r9,[r11,#-4]
+#else
+       ldr     r8,[r12,#24]
+       ldr     r9,[r12,#28]
+#ifdef __ARMEL__
+       rev     r8,r8
+       rev     r9,r9
+#endif
+       str     r8,[r11],#8
+       str     r9,[r11,#-4]
+#endif
+
+       mov     r12,#14
+       str     r12,[r11,#240-32]
+       add     r6,r10,#256                     @ rcon
+       mov     lr,#255
+       mov     r12,#7
+
+.L256_loop:
+       and     r5,lr,r9,lsr#24
+       and     r7,lr,r9,lsr#16
+       ldrb    r5,[r10,r5]
+       and     r8,lr,r9,lsr#8
+       ldrb    r7,[r10,r7]
+       and     r9,lr,r9
+       ldrb    r8,[r10,r8]
+       orr     r5,r5,r7,lsl#24
+       ldrb    r9,[r10,r9]
+       orr     r5,r5,r8,lsl#16
+       ldr     r4,[r6],#4                      @ rcon[i++]
+       orr     r5,r5,r9,lsl#8
+       eor     r9,r5,r4
+       eor     r0,r0,r9                        @ rk[8]=rk[0]^...
+       eor     r1,r1,r0                        @ rk[9]=rk[1]^rk[8]
+       str     r0,[r11],#32
+       eor     r2,r2,r1                        @ rk[10]=rk[2]^rk[9]
+       str     r1,[r11,#-28]
+       eor     r3,r3,r2                        @ rk[11]=rk[3]^rk[10]
+       str     r2,[r11,#-24]
+       subs    r12,r12,#1
+       str     r3,[r11,#-20]
+       subeq   r2,r11,#256
+       beq     .Ldone
+
+       and     r5,lr,r3
+       and     r7,lr,r3,lsr#8
+       ldrb    r5,[r10,r5]
+       and     r8,lr,r3,lsr#16
+       ldrb    r7,[r10,r7]
+       and     r9,lr,r3,lsr#24
+       ldrb    r8,[r10,r8]
+       orr     r5,r5,r7,lsl#8
+       ldrb    r9,[r10,r9]
+       orr     r5,r5,r8,lsl#16
+       ldr     r4,[r11,#-48]
+       orr     r5,r5,r9,lsl#24
+
+       ldr     r7,[r11,#-44]
+       ldr     r8,[r11,#-40]
+       eor     r4,r4,r5                        @ rk[12]=rk[4]^...
+       ldr     r9,[r11,#-36]
+       eor     r7,r7,r4                        @ rk[13]=rk[5]^rk[12]
+       str     r4,[r11,#-16]
+       eor     r8,r8,r7                        @ rk[14]=rk[6]^rk[13]
+       str     r7,[r11,#-12]
+       eor     r9,r9,r8                        @ rk[15]=rk[7]^rk[14]
+       str     r8,[r11,#-8]
+       str     r9,[r11,#-4]
+       b       .L256_loop
+
+.Ldone:        mov     r0,#0
+       ldmia   sp!,{r4-r12,lr}
+.Labrt:        tst     lr,#1
+       moveq   pc,lr                   @ be binary compatible with V4, yet
+       .word   0xe12fff1e                      @ interoperable with Thumb ISA:-)
+.size  private_AES_set_encrypt_key,.-private_AES_set_encrypt_key
+
+.global private_AES_set_decrypt_key
+.type   private_AES_set_decrypt_key,%function
+.align 5
+private_AES_set_decrypt_key:
+       str     lr,[sp,#-4]!            @ push lr
+#if 0
+       @ kernel does both of these in setkey so optimise this bit out by
+       @ expecting the key to already have the enc_key work done (see aes_glue.c)
+       bl      _armv4_AES_set_encrypt_key
+#else
+       mov     r0,#0
+#endif
+       teq     r0,#0
+       ldrne   lr,[sp],#4              @ pop lr
+       bne     .Labrt
+
+       stmdb   sp!,{r4-r12}
+
+       ldr     r12,[r2,#240]   @ AES_set_encrypt_key preserves r2,
+       mov     r11,r2                  @ which is AES_KEY *key
+       mov     r7,r2
+       add     r8,r2,r12,lsl#4
+
+.Linv: ldr     r0,[r7]
+       ldr     r1,[r7,#4]
+       ldr     r2,[r7,#8]
+       ldr     r3,[r7,#12]
+       ldr     r4,[r8]
+       ldr     r5,[r8,#4]
+       ldr     r6,[r8,#8]
+       ldr     r9,[r8,#12]
+       str     r0,[r8],#-16
+       str     r1,[r8,#16+4]
+       str     r2,[r8,#16+8]
+       str     r3,[r8,#16+12]
+       str     r4,[r7],#16
+       str     r5,[r7,#-12]
+       str     r6,[r7,#-8]
+       str     r9,[r7,#-4]
+       teq     r7,r8
+       bne     .Linv
+       ldr     r0,[r11,#16]!           @ prefetch tp1
+       mov     r7,#0x80
+       mov     r8,#0x1b
+       orr     r7,r7,#0x8000
+       orr     r8,r8,#0x1b00
+       orr     r7,r7,r7,lsl#16
+       orr     r8,r8,r8,lsl#16
+       sub     r12,r12,#1
+       mvn     r9,r7
+       mov     r12,r12,lsl#2   @ (rounds-1)*4
+
+.Lmix: and     r4,r0,r7
+       and     r1,r0,r9
+       sub     r4,r4,r4,lsr#7
+       and     r4,r4,r8
+       eor     r1,r4,r1,lsl#1  @ tp2
+
+       and     r4,r1,r7
+       and     r2,r1,r9
+       sub     r4,r4,r4,lsr#7
+       and     r4,r4,r8
+       eor     r2,r4,r2,lsl#1  @ tp4
+
+       and     r4,r2,r7
+       and     r3,r2,r9
+       sub     r4,r4,r4,lsr#7
+       and     r4,r4,r8
+       eor     r3,r4,r3,lsl#1  @ tp8
+
+       eor     r4,r1,r2
+       eor     r5,r0,r3                @ tp9
+       eor     r4,r4,r3                @ tpe
+       eor     r4,r4,r1,ror#24
+       eor     r4,r4,r5,ror#24 @ ^= ROTATE(tpb=tp9^tp2,8)
+       eor     r4,r4,r2,ror#16
+       eor     r4,r4,r5,ror#16 @ ^= ROTATE(tpd=tp9^tp4,16)
+       eor     r4,r4,r5,ror#8  @ ^= ROTATE(tp9,24)
+
+       ldr     r0,[r11,#4]             @ prefetch tp1
+       str     r4,[r11],#4
+       subs    r12,r12,#1
+       bne     .Lmix
+
+       mov     r0,#0
+#if __ARM_ARCH__>=5
+       ldmia   sp!,{r4-r12,pc}
+#else
+       ldmia   sp!,{r4-r12,lr}
+       tst     lr,#1
+       moveq   pc,lr                   @ be binary compatible with V4, yet
+       .word   0xe12fff1e                      @ interoperable with Thumb ISA:-)
+#endif
+.size  private_AES_set_decrypt_key,.-private_AES_set_decrypt_key
+
+.type  AES_Td,%object
+.align 5
+AES_Td:
+.word  0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96
+.word  0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393
+.word  0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25
+.word  0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f
+.word  0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1
+.word  0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6
+.word  0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da
+.word  0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844
+.word  0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd
+.word  0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4
+.word  0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45
+.word  0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94
+.word  0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7
+.word  0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a
+.word  0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5
+.word  0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c
+.word  0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1
+.word  0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a
+.word  0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75
+.word  0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051
+.word  0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46
+.word  0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff
+.word  0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77
+.word  0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb
+.word  0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000
+.word  0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e
+.word  0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927
+.word  0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a
+.word  0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e
+.word  0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16
+.word  0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d
+.word  0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8
+.word  0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd
+.word  0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34
+.word  0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163
+.word  0xd731dcca, 0x42638510, 0x13972240, 0x84c61120
+.word  0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d
+.word  0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0
+.word  0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422
+.word  0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef
+.word  0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36
+.word  0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4
+.word  0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662
+.word  0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5
+.word  0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3
+.word  0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b
+.word  0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8
+.word  0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6
+.word  0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6
+.word  0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0
+.word  0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815
+.word  0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f
+.word  0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df
+.word  0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f
+.word  0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e
+.word  0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713
+.word  0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89
+.word  0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c
+.word  0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf
+.word  0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86
+.word  0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f
+.word  0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541
+.word  0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190
+.word  0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742
+@ Td4[256]
+.byte  0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38
+.byte  0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb
+.byte  0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87
+.byte  0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb
+.byte  0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d
+.byte  0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e
+.byte  0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2
+.byte  0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25
+.byte  0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16
+.byte  0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92
+.byte  0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda
+.byte  0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84
+.byte  0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a
+.byte  0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06
+.byte  0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02
+.byte  0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b
+.byte  0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea
+.byte  0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73
+.byte  0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85
+.byte  0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e
+.byte  0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89
+.byte  0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b
+.byte  0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20
+.byte  0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4
+.byte  0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31
+.byte  0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f
+.byte  0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d
+.byte  0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef
+.byte  0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0
+.byte  0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61
+.byte  0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26
+.byte  0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d
+.size  AES_Td,.-AES_Td
+
+@ void AES_decrypt(const unsigned char *in, unsigned char *out,
+@               const AES_KEY *key) {
+.global AES_decrypt
+.type   AES_decrypt,%function
+.align 5
+AES_decrypt:
+       sub     r3,pc,#8                @ AES_decrypt
+       stmdb   sp!,{r1,r4-r12,lr}
+       mov     r12,r0          @ inp
+       mov     r11,r2
+       sub     r10,r3,#AES_decrypt-AES_Td              @ Td
+#if __ARM_ARCH__<7
+       ldrb    r0,[r12,#3]     @ load input data in endian-neutral
+       ldrb    r4,[r12,#2]     @ manner...
+       ldrb    r5,[r12,#1]
+       ldrb    r6,[r12,#0]
+       orr     r0,r0,r4,lsl#8
+       ldrb    r1,[r12,#7]
+       orr     r0,r0,r5,lsl#16
+       ldrb    r4,[r12,#6]
+       orr     r0,r0,r6,lsl#24
+       ldrb    r5,[r12,#5]
+       ldrb    r6,[r12,#4]
+       orr     r1,r1,r4,lsl#8
+       ldrb    r2,[r12,#11]
+       orr     r1,r1,r5,lsl#16
+       ldrb    r4,[r12,#10]
+       orr     r1,r1,r6,lsl#24
+       ldrb    r5,[r12,#9]
+       ldrb    r6,[r12,#8]
+       orr     r2,r2,r4,lsl#8
+       ldrb    r3,[r12,#15]
+       orr     r2,r2,r5,lsl#16
+       ldrb    r4,[r12,#14]
+       orr     r2,r2,r6,lsl#24
+       ldrb    r5,[r12,#13]
+       ldrb    r6,[r12,#12]
+       orr     r3,r3,r4,lsl#8
+       orr     r3,r3,r5,lsl#16
+       orr     r3,r3,r6,lsl#24
+#else
+       ldr     r0,[r12,#0]
+       ldr     r1,[r12,#4]
+       ldr     r2,[r12,#8]
+       ldr     r3,[r12,#12]
+#ifdef __ARMEL__
+       rev     r0,r0
+       rev     r1,r1
+       rev     r2,r2
+       rev     r3,r3
+#endif
+#endif
+       bl      _armv4_AES_decrypt
+
+       ldr     r12,[sp],#4             @ pop out
+#if __ARM_ARCH__>=7
+#ifdef __ARMEL__
+       rev     r0,r0
+       rev     r1,r1
+       rev     r2,r2
+       rev     r3,r3
+#endif
+       str     r0,[r12,#0]
+       str     r1,[r12,#4]
+       str     r2,[r12,#8]
+       str     r3,[r12,#12]
+#else
+       mov     r4,r0,lsr#24            @ write output in endian-neutral
+       mov     r5,r0,lsr#16            @ manner...
+       mov     r6,r0,lsr#8
+       strb    r4,[r12,#0]
+       strb    r5,[r12,#1]
+       mov     r4,r1,lsr#24
+       strb    r6,[r12,#2]
+       mov     r5,r1,lsr#16
+       strb    r0,[r12,#3]
+       mov     r6,r1,lsr#8
+       strb    r4,[r12,#4]
+       strb    r5,[r12,#5]
+       mov     r4,r2,lsr#24
+       strb    r6,[r12,#6]
+       mov     r5,r2,lsr#16
+       strb    r1,[r12,#7]
+       mov     r6,r2,lsr#8
+       strb    r4,[r12,#8]
+       strb    r5,[r12,#9]
+       mov     r4,r3,lsr#24
+       strb    r6,[r12,#10]
+       mov     r5,r3,lsr#16
+       strb    r2,[r12,#11]
+       mov     r6,r3,lsr#8
+       strb    r4,[r12,#12]
+       strb    r5,[r12,#13]
+       strb    r6,[r12,#14]
+       strb    r3,[r12,#15]
+#endif
+#if __ARM_ARCH__>=5
+       ldmia   sp!,{r4-r12,pc}
+#else
+       ldmia   sp!,{r4-r12,lr}
+       tst     lr,#1
+       moveq   pc,lr                   @ be binary compatible with V4, yet
+       .word   0xe12fff1e                      @ interoperable with Thumb ISA:-)
+#endif
+.size  AES_decrypt,.-AES_decrypt
+
+.type   _armv4_AES_decrypt,%function
+.align 2
+_armv4_AES_decrypt:
+       str     lr,[sp,#-4]!            @ push lr
+       ldmia   r11!,{r4-r7}
+       eor     r0,r0,r4
+       ldr     r12,[r11,#240-16]
+       eor     r1,r1,r5
+       eor     r2,r2,r6
+       eor     r3,r3,r7
+       sub     r12,r12,#1
+       mov     lr,#255
+
+       and     r7,lr,r0,lsr#16
+       and     r8,lr,r0,lsr#8
+       and     r9,lr,r0
+       mov     r0,r0,lsr#24
+.Ldec_loop:
+       ldr     r4,[r10,r7,lsl#2]       @ Td1[s0>>16]
+       and     r7,lr,r1                @ i0
+       ldr     r5,[r10,r8,lsl#2]       @ Td2[s0>>8]
+       and     r8,lr,r1,lsr#16
+       ldr     r6,[r10,r9,lsl#2]       @ Td3[s0>>0]
+       and     r9,lr,r1,lsr#8
+       ldr     r0,[r10,r0,lsl#2]       @ Td0[s0>>24]
+       mov     r1,r1,lsr#24
+
+       ldr     r7,[r10,r7,lsl#2]       @ Td3[s1>>0]
+       ldr     r8,[r10,r8,lsl#2]       @ Td1[s1>>16]
+       ldr     r9,[r10,r9,lsl#2]       @ Td2[s1>>8]
+       eor     r0,r0,r7,ror#24
+       ldr     r1,[r10,r1,lsl#2]       @ Td0[s1>>24]
+       and     r7,lr,r2,lsr#8  @ i0
+       eor     r5,r8,r5,ror#8
+       and     r8,lr,r2                @ i1
+       eor     r6,r9,r6,ror#8
+       and     r9,lr,r2,lsr#16
+       ldr     r7,[r10,r7,lsl#2]       @ Td2[s2>>8]
+       eor     r1,r1,r4,ror#8
+       ldr     r8,[r10,r8,lsl#2]       @ Td3[s2>>0]
+       mov     r2,r2,lsr#24
+
+       ldr     r9,[r10,r9,lsl#2]       @ Td1[s2>>16]
+       eor     r0,r0,r7,ror#16
+       ldr     r2,[r10,r2,lsl#2]       @ Td0[s2>>24]
+       and     r7,lr,r3,lsr#16 @ i0
+       eor     r1,r1,r8,ror#24
+       and     r8,lr,r3,lsr#8  @ i1
+       eor     r6,r9,r6,ror#8
+       and     r9,lr,r3                @ i2
+       ldr     r7,[r10,r7,lsl#2]       @ Td1[s3>>16]
+       eor     r2,r2,r5,ror#8
+       ldr     r8,[r10,r8,lsl#2]       @ Td2[s3>>8]
+       mov     r3,r3,lsr#24
+
+       ldr     r9,[r10,r9,lsl#2]       @ Td3[s3>>0]
+       eor     r0,r0,r7,ror#8
+       ldr     r7,[r11],#16
+       eor     r1,r1,r8,ror#16
+       ldr     r3,[r10,r3,lsl#2]       @ Td0[s3>>24]
+       eor     r2,r2,r9,ror#24
+
+       ldr     r4,[r11,#-12]
+       eor     r0,r0,r7
+       ldr     r5,[r11,#-8]
+       eor     r3,r3,r6,ror#8
+       ldr     r6,[r11,#-4]
+       and     r7,lr,r0,lsr#16
+       eor     r1,r1,r4
+       and     r8,lr,r0,lsr#8
+       eor     r2,r2,r5
+       and     r9,lr,r0
+       eor     r3,r3,r6
+       mov     r0,r0,lsr#24
+
+       subs    r12,r12,#1
+       bne     .Ldec_loop
+
+       add     r10,r10,#1024
+
+       ldr     r5,[r10,#0]             @ prefetch Td4
+       ldr     r6,[r10,#32]
+       ldr     r4,[r10,#64]
+       ldr     r5,[r10,#96]
+       ldr     r6,[r10,#128]
+       ldr     r4,[r10,#160]
+       ldr     r5,[r10,#192]
+       ldr     r6,[r10,#224]
+
+       ldrb    r0,[r10,r0]             @ Td4[s0>>24]
+       ldrb    r4,[r10,r7]             @ Td4[s0>>16]
+       and     r7,lr,r1                @ i0
+       ldrb    r5,[r10,r8]             @ Td4[s0>>8]
+       and     r8,lr,r1,lsr#16
+       ldrb    r6,[r10,r9]             @ Td4[s0>>0]
+       and     r9,lr,r1,lsr#8
+
+       ldrb    r7,[r10,r7]             @ Td4[s1>>0]
+       ldrb    r1,[r10,r1,lsr#24]      @ Td4[s1>>24]
+       ldrb    r8,[r10,r8]             @ Td4[s1>>16]
+       eor     r0,r7,r0,lsl#24
+       ldrb    r9,[r10,r9]             @ Td4[s1>>8]
+       eor     r1,r4,r1,lsl#8
+       and     r7,lr,r2,lsr#8  @ i0
+       eor     r5,r5,r8,lsl#8
+       and     r8,lr,r2                @ i1
+       ldrb    r7,[r10,r7]             @ Td4[s2>>8]
+       eor     r6,r6,r9,lsl#8
+       ldrb    r8,[r10,r8]             @ Td4[s2>>0]
+       and     r9,lr,r2,lsr#16
+
+       ldrb    r2,[r10,r2,lsr#24]      @ Td4[s2>>24]
+       eor     r0,r0,r7,lsl#8
+       ldrb    r9,[r10,r9]             @ Td4[s2>>16]
+       eor     r1,r8,r1,lsl#16
+       and     r7,lr,r3,lsr#16 @ i0
+       eor     r2,r5,r2,lsl#16
+       and     r8,lr,r3,lsr#8  @ i1
+       ldrb    r7,[r10,r7]             @ Td4[s3>>16]
+       eor     r6,r6,r9,lsl#16
+       ldrb    r8,[r10,r8]             @ Td4[s3>>8]
+       and     r9,lr,r3                @ i2
+
+       ldrb    r9,[r10,r9]             @ Td4[s3>>0]
+       ldrb    r3,[r10,r3,lsr#24]      @ Td4[s3>>24]
+       eor     r0,r0,r7,lsl#16
+       ldr     r7,[r11,#0]
+       eor     r1,r1,r8,lsl#8
+       ldr     r4,[r11,#4]
+       eor     r2,r9,r2,lsl#8
+       ldr     r5,[r11,#8]
+       eor     r3,r6,r3,lsl#24
+       ldr     r6,[r11,#12]
+
+       eor     r0,r0,r7
+       eor     r1,r1,r4
+       eor     r2,r2,r5
+       eor     r3,r3,r6
+
+       sub     r10,r10,#1024
+       ldr     pc,[sp],#4              @ pop and return
+.size  _armv4_AES_decrypt,.-_armv4_AES_decrypt
+.asciz "AES for ARMv4, CRYPTOGAMS by <appro@openssl.org>"
+.align 2
diff --git a/arch/arm/crypto/aes_glue.c b/arch/arm/crypto/aes_glue.c
new file mode 100644 (file)
index 0000000..59f7877
--- /dev/null
@@ -0,0 +1,108 @@
+/*
+ * Glue Code for the asm optimized version of the AES Cipher Algorithm
+ */
+
+#include <linux/module.h>
+#include <linux/crypto.h>
+#include <crypto/aes.h>
+
+#define AES_MAXNR 14
+
+typedef struct {
+       unsigned int rd_key[4 *(AES_MAXNR + 1)];
+       int rounds;
+} AES_KEY;
+
+struct AES_CTX {
+       AES_KEY enc_key;
+       AES_KEY dec_key;
+};
+
+asmlinkage void AES_encrypt(const u8 *in, u8 *out, AES_KEY *ctx);
+asmlinkage void AES_decrypt(const u8 *in, u8 *out, AES_KEY *ctx);
+asmlinkage int private_AES_set_decrypt_key(const unsigned char *userKey, const int bits, AES_KEY *key);
+asmlinkage int private_AES_set_encrypt_key(const unsigned char *userKey, const int bits, AES_KEY *key);
+
+static void aes_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
+{
+       struct AES_CTX *ctx = crypto_tfm_ctx(tfm);
+       AES_encrypt(src, dst, &ctx->enc_key);
+}
+
+static void aes_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
+{
+       struct AES_CTX *ctx = crypto_tfm_ctx(tfm);
+       AES_decrypt(src, dst, &ctx->dec_key);
+}
+
+static int aes_set_key(struct crypto_tfm *tfm, const u8 *in_key,
+               unsigned int key_len)
+{
+       struct AES_CTX *ctx = crypto_tfm_ctx(tfm);
+
+       switch (key_len) {
+       case AES_KEYSIZE_128:
+               key_len = 128;
+               break;
+       case AES_KEYSIZE_192:
+               key_len = 192;
+               break;
+       case AES_KEYSIZE_256:
+               key_len = 256;
+               break;
+       default:
+               tfm->crt_flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
+               return -EINVAL;
+       }
+
+       if (private_AES_set_encrypt_key(in_key, key_len, &ctx->enc_key) == -1) {
+               tfm->crt_flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
+               return -EINVAL;
+       }
+       /* private_AES_set_decrypt_key expects an encryption key as input */
+       ctx->dec_key = ctx->enc_key;
+       if (private_AES_set_decrypt_key(in_key, key_len, &ctx->dec_key) == -1) {
+               tfm->crt_flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
+               return -EINVAL;
+       }
+       return 0;
+}
+
+static struct crypto_alg aes_alg = {
+       .cra_name               = "aes",
+       .cra_driver_name        = "aes-asm",
+       .cra_priority           = 200,
+       .cra_flags              = CRYPTO_ALG_TYPE_CIPHER,
+       .cra_blocksize          = AES_BLOCK_SIZE,
+       .cra_ctxsize            = sizeof(struct AES_CTX),
+       .cra_module             = THIS_MODULE,
+       .cra_list               = LIST_HEAD_INIT(aes_alg.cra_list),
+       .cra_u  = {
+               .cipher = {
+                       .cia_min_keysize        = AES_MIN_KEY_SIZE,
+                       .cia_max_keysize        = AES_MAX_KEY_SIZE,
+                       .cia_setkey                     = aes_set_key,
+                       .cia_encrypt            = aes_encrypt,
+                       .cia_decrypt            = aes_decrypt
+               }
+       }
+};
+
+static int __init aes_init(void)
+{
+       return crypto_register_alg(&aes_alg);
+}
+
+static void __exit aes_fini(void)
+{
+       crypto_unregister_alg(&aes_alg);
+}
+
+module_init(aes_init);
+module_exit(aes_fini);
+
+MODULE_DESCRIPTION("Rijndael (AES) Cipher Algorithm (ASM)");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("aes");
+MODULE_ALIAS("aes-asm");
+MODULE_AUTHOR("David McCullough <ucdevel@gmail.com>");
diff --git a/arch/arm/crypto/sha1-armv4-large.S b/arch/arm/crypto/sha1-armv4-large.S
new file mode 100644 (file)
index 0000000..7050ab1
--- /dev/null
@@ -0,0 +1,503 @@
+#define __ARM_ARCH__ __LINUX_ARM_ARCH__
+@ ====================================================================
+@ Written by Andy Polyakov <appro@fy.chalmers.se> for the OpenSSL
+@ project. The module is, however, dual licensed under OpenSSL and
+@ CRYPTOGAMS licenses depending on where you obtain it. For further
+@ details see http://www.openssl.org/~appro/cryptogams/.
+@ ====================================================================
+
+@ sha1_block procedure for ARMv4.
+@
+@ January 2007.
+
+@ Size/performance trade-off
+@ ====================================================================
+@ impl         size in bytes   comp cycles[*]  measured performance
+@ ====================================================================
+@ thumb                304             3212            4420
+@ armv4-small  392/+29%        1958/+64%       2250/+96%
+@ armv4-compact        740/+89%        1552/+26%       1840/+22%
+@ armv4-large  1420/+92%       1307/+19%       1370/+34%[***]
+@ full unroll  ~5100/+260%     ~1260/+4%       ~1300/+5%
+@ ====================================================================
+@ thumb                = same as 'small' but in Thumb instructions[**] and
+@                with recurring code in two private functions;
+@ small                = detached Xload/update, loops are folded;
+@ compact      = detached Xload/update, 5x unroll;
+@ large                = interleaved Xload/update, 5x unroll;
+@ full unroll  = interleaved Xload/update, full unroll, estimated[!];
+@
+@ [*]  Manually counted instructions in "grand" loop body. Measured
+@      performance is affected by prologue and epilogue overhead,
+@      i-cache availability, branch penalties, etc.
+@ [**] While each Thumb instruction is twice smaller, they are not as
+@      diverse as ARM ones: e.g., there are only two arithmetic
+@      instructions with 3 arguments, no [fixed] rotate, addressing
+@      modes are limited. As result it takes more instructions to do
+@      the same job in Thumb, therefore the code is never twice as
+@      small and always slower.
+@ [***]        which is also ~35% better than compiler generated code. Dual-
+@      issue Cortex A8 core was measured to process input block in
+@      ~990 cycles.
+
+@ August 2010.
+@
+@ Rescheduling for dual-issue pipeline resulted in 13% improvement on
+@ Cortex A8 core and in absolute terms ~870 cycles per input block
+@ [or 13.6 cycles per byte].
+
+@ February 2011.
+@
+@ Profiler-assisted and platform-specific optimization resulted in 10%
+@ improvement on Cortex A8 core and 12.2 cycles per byte.
+
+.text
+
+.global        sha1_block_data_order
+.type  sha1_block_data_order,%function
+
+.align 2
+sha1_block_data_order:
+       stmdb   sp!,{r4-r12,lr}
+       add     r2,r1,r2,lsl#6  @ r2 to point at the end of r1
+       ldmia   r0,{r3,r4,r5,r6,r7}
+.Lloop:
+       ldr     r8,.LK_00_19
+       mov     r14,sp
+       sub     sp,sp,#15*4
+       mov     r5,r5,ror#30
+       mov     r6,r6,ror#30
+       mov     r7,r7,ror#30            @ [6]
+.L_00_15:
+#if __ARM_ARCH__<7
+       ldrb    r10,[r1,#2]
+       ldrb    r9,[r1,#3]
+       ldrb    r11,[r1,#1]
+       add     r7,r8,r7,ror#2                  @ E+=K_00_19
+       ldrb    r12,[r1],#4
+       orr     r9,r9,r10,lsl#8
+       eor     r10,r5,r6                       @ F_xx_xx
+       orr     r9,r9,r11,lsl#16
+       add     r7,r7,r3,ror#27                 @ E+=ROR(A,27)
+       orr     r9,r9,r12,lsl#24
+#else
+       ldr     r9,[r1],#4                      @ handles unaligned
+       add     r7,r8,r7,ror#2                  @ E+=K_00_19
+       eor     r10,r5,r6                       @ F_xx_xx
+       add     r7,r7,r3,ror#27                 @ E+=ROR(A,27)
+#ifdef __ARMEL__
+       rev     r9,r9                           @ byte swap
+#endif
+#endif
+       and     r10,r4,r10,ror#2
+       add     r7,r7,r9                        @ E+=X[i]
+       eor     r10,r10,r6,ror#2                @ F_00_19(B,C,D)
+       str     r9,[r14,#-4]!
+       add     r7,r7,r10                       @ E+=F_00_19(B,C,D)
+#if __ARM_ARCH__<7
+       ldrb    r10,[r1,#2]
+       ldrb    r9,[r1,#3]
+       ldrb    r11,[r1,#1]
+       add     r6,r8,r6,ror#2                  @ E+=K_00_19
+       ldrb    r12,[r1],#4
+       orr     r9,r9,r10,lsl#8
+       eor     r10,r4,r5                       @ F_xx_xx
+       orr     r9,r9,r11,lsl#16
+       add     r6,r6,r7,ror#27                 @ E+=ROR(A,27)
+       orr     r9,r9,r12,lsl#24
+#else
+       ldr     r9,[r1],#4                      @ handles unaligned
+       add     r6,r8,r6,ror#2                  @ E+=K_00_19
+       eor     r10,r4,r5                       @ F_xx_xx
+       add     r6,r6,r7,ror#27                 @ E+=ROR(A,27)
+#ifdef __ARMEL__
+       rev     r9,r9                           @ byte swap
+#endif
+#endif
+       and     r10,r3,r10,ror#2
+       add     r6,r6,r9                        @ E+=X[i]
+       eor     r10,r10,r5,ror#2                @ F_00_19(B,C,D)
+       str     r9,[r14,#-4]!
+       add     r6,r6,r10                       @ E+=F_00_19(B,C,D)
+#if __ARM_ARCH__<7
+       ldrb    r10,[r1,#2]
+       ldrb    r9,[r1,#3]
+       ldrb    r11,[r1,#1]
+       add     r5,r8,r5,ror#2                  @ E+=K_00_19
+       ldrb    r12,[r1],#4
+       orr     r9,r9,r10,lsl#8
+       eor     r10,r3,r4                       @ F_xx_xx
+       orr     r9,r9,r11,lsl#16
+       add     r5,r5,r6,ror#27                 @ E+=ROR(A,27)
+       orr     r9,r9,r12,lsl#24
+#else
+       ldr     r9,[r1],#4                      @ handles unaligned
+       add     r5,r8,r5,ror#2                  @ E+=K_00_19
+       eor     r10,r3,r4                       @ F_xx_xx
+       add     r5,r5,r6,ror#27                 @ E+=ROR(A,27)
+#ifdef __ARMEL__
+       rev     r9,r9                           @ byte swap
+#endif
+#endif
+       and     r10,r7,r10,ror#2
+       add     r5,r5,r9                        @ E+=X[i]
+       eor     r10,r10,r4,ror#2                @ F_00_19(B,C,D)
+       str     r9,[r14,#-4]!
+       add     r5,r5,r10                       @ E+=F_00_19(B,C,D)
+#if __ARM_ARCH__<7
+       ldrb    r10,[r1,#2]
+       ldrb    r9,[r1,#3]
+       ldrb    r11,[r1,#1]
+       add     r4,r8,r4,ror#2                  @ E+=K_00_19
+       ldrb    r12,[r1],#4
+       orr     r9,r9,r10,lsl#8
+       eor     r10,r7,r3                       @ F_xx_xx
+       orr     r9,r9,r11,lsl#16
+       add     r4,r4,r5,ror#27                 @ E+=ROR(A,27)
+       orr     r9,r9,r12,lsl#24
+#else
+       ldr     r9,[r1],#4                      @ handles unaligned
+       add     r4,r8,r4,ror#2                  @ E+=K_00_19
+       eor     r10,r7,r3                       @ F_xx_xx
+       add     r4,r4,r5,ror#27                 @ E+=ROR(A,27)
+#ifdef __ARMEL__
+       rev     r9,r9                           @ byte swap
+#endif
+#endif
+       and     r10,r6,r10,ror#2
+       add     r4,r4,r9                        @ E+=X[i]
+       eor     r10,r10,r3,ror#2                @ F_00_19(B,C,D)
+       str     r9,[r14,#-4]!
+       add     r4,r4,r10                       @ E+=F_00_19(B,C,D)
+#if __ARM_ARCH__<7
+       ldrb    r10,[r1,#2]
+       ldrb    r9,[r1,#3]
+       ldrb    r11,[r1,#1]
+       add     r3,r8,r3,ror#2                  @ E+=K_00_19
+       ldrb    r12,[r1],#4
+       orr     r9,r9,r10,lsl#8
+       eor     r10,r6,r7                       @ F_xx_xx
+       orr     r9,r9,r11,lsl#16
+       add     r3,r3,r4,ror#27                 @ E+=ROR(A,27)
+       orr     r9,r9,r12,lsl#24
+#else
+       ldr     r9,[r1],#4                      @ handles unaligned
+       add     r3,r8,r3,ror#2                  @ E+=K_00_19
+       eor     r10,r6,r7                       @ F_xx_xx
+       add     r3,r3,r4,ror#27                 @ E+=ROR(A,27)
+#ifdef __ARMEL__
+       rev     r9,r9                           @ byte swap
+#endif
+#endif
+       and     r10,r5,r10,ror#2
+       add     r3,r3,r9                        @ E+=X[i]
+       eor     r10,r10,r7,ror#2                @ F_00_19(B,C,D)
+       str     r9,[r14,#-4]!
+       add     r3,r3,r10                       @ E+=F_00_19(B,C,D)
+       teq     r14,sp
+       bne     .L_00_15                @ [((11+4)*5+2)*3]
+#if __ARM_ARCH__<7
+       ldrb    r10,[r1,#2]
+       ldrb    r9,[r1,#3]
+       ldrb    r11,[r1,#1]
+       add     r7,r8,r7,ror#2                  @ E+=K_00_19
+       ldrb    r12,[r1],#4
+       orr     r9,r9,r10,lsl#8
+       eor     r10,r5,r6                       @ F_xx_xx
+       orr     r9,r9,r11,lsl#16
+       add     r7,r7,r3,ror#27                 @ E+=ROR(A,27)
+       orr     r9,r9,r12,lsl#24
+#else
+       ldr     r9,[r1],#4                      @ handles unaligned
+       add     r7,r8,r7,ror#2                  @ E+=K_00_19
+       eor     r10,r5,r6                       @ F_xx_xx
+       add     r7,r7,r3,ror#27                 @ E+=ROR(A,27)
+#ifdef __ARMEL__
+       rev     r9,r9                           @ byte swap
+#endif
+#endif
+       and     r10,r4,r10,ror#2
+       add     r7,r7,r9                        @ E+=X[i]
+       eor     r10,r10,r6,ror#2                @ F_00_19(B,C,D)
+       str     r9,[r14,#-4]!
+       add     r7,r7,r10                       @ E+=F_00_19(B,C,D)
+       ldr     r9,[r14,#15*4]
+       ldr     r10,[r14,#13*4]
+       ldr     r11,[r14,#7*4]
+       add     r6,r8,r6,ror#2                  @ E+=K_xx_xx
+       ldr     r12,[r14,#2*4]
+       eor     r9,r9,r10
+       eor     r11,r11,r12                     @ 1 cycle stall
+       eor     r10,r4,r5                       @ F_xx_xx
+       mov     r9,r9,ror#31
+       add     r6,r6,r7,ror#27                 @ E+=ROR(A,27)
+       eor     r9,r9,r11,ror#31
+       str     r9,[r14,#-4]!
+       and r10,r3,r10,ror#2                                    @ F_xx_xx
+                                               @ F_xx_xx
+       add     r6,r6,r9                        @ E+=X[i]
+       eor     r10,r10,r5,ror#2                @ F_00_19(B,C,D)
+       add     r6,r6,r10                       @ E+=F_00_19(B,C,D)
+       ldr     r9,[r14,#15*4]
+       ldr     r10,[r14,#13*4]
+       ldr     r11,[r14,#7*4]
+       add     r5,r8,r5,ror#2                  @ E+=K_xx_xx
+       ldr     r12,[r14,#2*4]
+       eor     r9,r9,r10
+       eor     r11,r11,r12                     @ 1 cycle stall
+       eor     r10,r3,r4                       @ F_xx_xx
+       mov     r9,r9,ror#31
+       add     r5,r5,r6,ror#27                 @ E+=ROR(A,27)
+       eor     r9,r9,r11,ror#31
+       str     r9,[r14,#-4]!
+       and r10,r7,r10,ror#2                                    @ F_xx_xx
+                                               @ F_xx_xx
+       add     r5,r5,r9                        @ E+=X[i]
+       eor     r10,r10,r4,ror#2                @ F_00_19(B,C,D)
+       add     r5,r5,r10                       @ E+=F_00_19(B,C,D)
+       ldr     r9,[r14,#15*4]
+       ldr     r10,[r14,#13*4]
+       ldr     r11,[r14,#7*4]
+       add     r4,r8,r4,ror#2                  @ E+=K_xx_xx
+       ldr     r12,[r14,#2*4]
+       eor     r9,r9,r10
+       eor     r11,r11,r12                     @ 1 cycle stall
+       eor     r10,r7,r3                       @ F_xx_xx
+       mov     r9,r9,ror#31
+       add     r4,r4,r5,ror#27                 @ E+=ROR(A,27)
+       eor     r9,r9,r11,ror#31
+       str     r9,[r14,#-4]!
+       and r10,r6,r10,ror#2                                    @ F_xx_xx
+                                               @ F_xx_xx
+       add     r4,r4,r9                        @ E+=X[i]
+       eor     r10,r10,r3,ror#2                @ F_00_19(B,C,D)
+       add     r4,r4,r10                       @ E+=F_00_19(B,C,D)
+       ldr     r9,[r14,#15*4]
+       ldr     r10,[r14,#13*4]
+       ldr     r11,[r14,#7*4]
+       add     r3,r8,r3,ror#2                  @ E+=K_xx_xx
+       ldr     r12,[r14,#2*4]
+       eor     r9,r9,r10
+       eor     r11,r11,r12                     @ 1 cycle stall
+       eor     r10,r6,r7                       @ F_xx_xx
+       mov     r9,r9,ror#31
+       add     r3,r3,r4,ror#27                 @ E+=ROR(A,27)
+       eor     r9,r9,r11,ror#31
+       str     r9,[r14,#-4]!
+       and r10,r5,r10,ror#2                                    @ F_xx_xx
+                                               @ F_xx_xx
+       add     r3,r3,r9                        @ E+=X[i]
+       eor     r10,r10,r7,ror#2                @ F_00_19(B,C,D)
+       add     r3,r3,r10                       @ E+=F_00_19(B,C,D)
+
+       ldr     r8,.LK_20_39            @ [+15+16*4]
+       sub     sp,sp,#25*4
+       cmn     sp,#0                   @ [+3], clear carry to denote 20_39
+.L_20_39_or_60_79:
+       ldr     r9,[r14,#15*4]
+       ldr     r10,[r14,#13*4]
+       ldr     r11,[r14,#7*4]
+       add     r7,r8,r7,ror#2                  @ E+=K_xx_xx
+       ldr     r12,[r14,#2*4]
+       eor     r9,r9,r10
+       eor     r11,r11,r12                     @ 1 cycle stall
+       eor     r10,r5,r6                       @ F_xx_xx
+       mov     r9,r9,ror#31
+       add     r7,r7,r3,ror#27                 @ E+=ROR(A,27)
+       eor     r9,r9,r11,ror#31
+       str     r9,[r14,#-4]!
+       eor r10,r4,r10,ror#2                                    @ F_xx_xx
+                                               @ F_xx_xx
+       add     r7,r7,r9                        @ E+=X[i]
+       add     r7,r7,r10                       @ E+=F_20_39(B,C,D)
+       ldr     r9,[r14,#15*4]
+       ldr     r10,[r14,#13*4]
+       ldr     r11,[r14,#7*4]
+       add     r6,r8,r6,ror#2                  @ E+=K_xx_xx
+       ldr     r12,[r14,#2*4]
+       eor     r9,r9,r10
+       eor     r11,r11,r12                     @ 1 cycle stall
+       eor     r10,r4,r5                       @ F_xx_xx
+       mov     r9,r9,ror#31
+       add     r6,r6,r7,ror#27                 @ E+=ROR(A,27)
+       eor     r9,r9,r11,ror#31
+       str     r9,[r14,#-4]!
+       eor r10,r3,r10,ror#2                                    @ F_xx_xx
+                                               @ F_xx_xx
+       add     r6,r6,r9                        @ E+=X[i]
+       add     r6,r6,r10                       @ E+=F_20_39(B,C,D)
+       ldr     r9,[r14,#15*4]
+       ldr     r10,[r14,#13*4]
+       ldr     r11,[r14,#7*4]
+       add     r5,r8,r5,ror#2                  @ E+=K_xx_xx
+       ldr     r12,[r14,#2*4]
+       eor     r9,r9,r10
+       eor     r11,r11,r12                     @ 1 cycle stall
+       eor     r10,r3,r4                       @ F_xx_xx
+       mov     r9,r9,ror#31
+       add     r5,r5,r6,ror#27                 @ E+=ROR(A,27)
+       eor     r9,r9,r11,ror#31
+       str     r9,[r14,#-4]!
+       eor r10,r7,r10,ror#2                                    @ F_xx_xx
+                                               @ F_xx_xx
+       add     r5,r5,r9                        @ E+=X[i]
+       add     r5,r5,r10                       @ E+=F_20_39(B,C,D)
+       ldr     r9,[r14,#15*4]
+       ldr     r10,[r14,#13*4]
+       ldr     r11,[r14,#7*4]
+       add     r4,r8,r4,ror#2                  @ E+=K_xx_xx
+       ldr     r12,[r14,#2*4]
+       eor     r9,r9,r10
+       eor     r11,r11,r12                     @ 1 cycle stall
+       eor     r10,r7,r3                       @ F_xx_xx
+       mov     r9,r9,ror#31
+       add     r4,r4,r5,ror#27                 @ E+=ROR(A,27)
+       eor     r9,r9,r11,ror#31
+       str     r9,[r14,#-4]!
+       eor r10,r6,r10,ror#2                                    @ F_xx_xx
+                                               @ F_xx_xx
+       add     r4,r4,r9                        @ E+=X[i]
+       add     r4,r4,r10                       @ E+=F_20_39(B,C,D)
+       ldr     r9,[r14,#15*4]
+       ldr     r10,[r14,#13*4]
+       ldr     r11,[r14,#7*4]
+       add     r3,r8,r3,ror#2                  @ E+=K_xx_xx
+       ldr     r12,[r14,#2*4]
+       eor     r9,r9,r10
+       eor     r11,r11,r12                     @ 1 cycle stall
+       eor     r10,r6,r7                       @ F_xx_xx
+       mov     r9,r9,ror#31
+       add     r3,r3,r4,ror#27                 @ E+=ROR(A,27)
+       eor     r9,r9,r11,ror#31
+       str     r9,[r14,#-4]!
+       eor r10,r5,r10,ror#2                                    @ F_xx_xx
+                                               @ F_xx_xx
+       add     r3,r3,r9                        @ E+=X[i]
+       add     r3,r3,r10                       @ E+=F_20_39(B,C,D)
+       teq     r14,sp                  @ preserve carry
+       bne     .L_20_39_or_60_79       @ [+((12+3)*5+2)*4]
+       bcs     .L_done                 @ [+((12+3)*5+2)*4], spare 300 bytes
+
+       ldr     r8,.LK_40_59
+       sub     sp,sp,#20*4             @ [+2]
+.L_40_59:
+       ldr     r9,[r14,#15*4]
+       ldr     r10,[r14,#13*4]
+       ldr     r11,[r14,#7*4]
+       add     r7,r8,r7,ror#2                  @ E+=K_xx_xx
+       ldr     r12,[r14,#2*4]
+       eor     r9,r9,r10
+       eor     r11,r11,r12                     @ 1 cycle stall
+       eor     r10,r5,r6                       @ F_xx_xx
+       mov     r9,r9,ror#31
+       add     r7,r7,r3,ror#27                 @ E+=ROR(A,27)
+       eor     r9,r9,r11,ror#31
+       str     r9,[r14,#-4]!
+       and r10,r4,r10,ror#2                                    @ F_xx_xx
+       and r11,r5,r6                                   @ F_xx_xx
+       add     r7,r7,r9                        @ E+=X[i]
+       add     r7,r7,r10                       @ E+=F_40_59(B,C,D)
+       add     r7,r7,r11,ror#2
+       ldr     r9,[r14,#15*4]
+       ldr     r10,[r14,#13*4]
+       ldr     r11,[r14,#7*4]
+       add     r6,r8,r6,ror#2                  @ E+=K_xx_xx
+       ldr     r12,[r14,#2*4]
+       eor     r9,r9,r10
+       eor     r11,r11,r12                     @ 1 cycle stall
+       eor     r10,r4,r5                       @ F_xx_xx
+       mov     r9,r9,ror#31
+       add     r6,r6,r7,ror#27                 @ E+=ROR(A,27)
+       eor     r9,r9,r11,ror#31
+       str     r9,[r14,#-4]!
+       and r10,r3,r10,ror#2                                    @ F_xx_xx
+       and r11,r4,r5                                   @ F_xx_xx
+       add     r6,r6,r9                        @ E+=X[i]
+       add     r6,r6,r10                       @ E+=F_40_59(B,C,D)
+       add     r6,r6,r11,ror#2
+       ldr     r9,[r14,#15*4]
+       ldr     r10,[r14,#13*4]
+       ldr     r11,[r14,#7*4]
+       add     r5,r8,r5,ror#2                  @ E+=K_xx_xx
+       ldr     r12,[r14,#2*4]
+       eor     r9,r9,r10
+       eor     r11,r11,r12                     @ 1 cycle stall
+       eor     r10,r3,r4                       @ F_xx_xx
+       mov     r9,r9,ror#31
+       add     r5,r5,r6,ror#27                 @ E+=ROR(A,27)
+       eor     r9,r9,r11,ror#31
+       str     r9,[r14,#-4]!
+       and r10,r7,r10,ror#2                                    @ F_xx_xx
+       and r11,r3,r4                                   @ F_xx_xx
+       add     r5,r5,r9                        @ E+=X[i]
+       add     r5,r5,r10                       @ E+=F_40_59(B,C,D)
+       add     r5,r5,r11,ror#2
+       ldr     r9,[r14,#15*4]
+       ldr     r10,[r14,#13*4]
+       ldr     r11,[r14,#7*4]
+       add     r4,r8,r4,ror#2                  @ E+=K_xx_xx
+       ldr     r12,[r14,#2*4]
+       eor     r9,r9,r10
+       eor     r11,r11,r12                     @ 1 cycle stall
+       eor     r10,r7,r3                       @ F_xx_xx
+       mov     r9,r9,ror#31
+       add     r4,r4,r5,ror#27                 @ E+=ROR(A,27)
+       eor     r9,r9,r11,ror#31
+       str     r9,[r14,#-4]!
+       and r10,r6,r10,ror#2                                    @ F_xx_xx
+       and r11,r7,r3                                   @ F_xx_xx
+       add     r4,r4,r9                        @ E+=X[i]
+       add     r4,r4,r10                       @ E+=F_40_59(B,C,D)
+       add     r4,r4,r11,ror#2
+       ldr     r9,[r14,#15*4]
+       ldr     r10,[r14,#13*4]
+       ldr     r11,[r14,#7*4]
+       add     r3,r8,r3,ror#2                  @ E+=K_xx_xx
+       ldr     r12,[r14,#2*4]
+       eor     r9,r9,r10
+       eor     r11,r11,r12                     @ 1 cycle stall
+       eor     r10,r6,r7                       @ F_xx_xx
+       mov     r9,r9,ror#31
+       add     r3,r3,r4,ror#27                 @ E+=ROR(A,27)
+       eor     r9,r9,r11,ror#31
+       str     r9,[r14,#-4]!
+       and r10,r5,r10,ror#2                                    @ F_xx_xx
+       and r11,r6,r7                                   @ F_xx_xx
+       add     r3,r3,r9                        @ E+=X[i]
+       add     r3,r3,r10                       @ E+=F_40_59(B,C,D)
+       add     r3,r3,r11,ror#2
+       teq     r14,sp
+       bne     .L_40_59                @ [+((12+5)*5+2)*4]
+
+       ldr     r8,.LK_60_79
+       sub     sp,sp,#20*4
+       cmp     sp,#0                   @ set carry to denote 60_79
+       b       .L_20_39_or_60_79       @ [+4], spare 300 bytes
+.L_done:
+       add     sp,sp,#80*4             @ "deallocate" stack frame
+       ldmia   r0,{r8,r9,r10,r11,r12}
+       add     r3,r8,r3
+       add     r4,r9,r4
+       add     r5,r10,r5,ror#2
+       add     r6,r11,r6,ror#2
+       add     r7,r12,r7,ror#2
+       stmia   r0,{r3,r4,r5,r6,r7}
+       teq     r1,r2
+       bne     .Lloop                  @ [+18], total 1307
+
+#if __ARM_ARCH__>=5
+       ldmia   sp!,{r4-r12,pc}
+#else
+       ldmia   sp!,{r4-r12,lr}
+       tst     lr,#1
+       moveq   pc,lr                   @ be binary compatible with V4, yet
+       .word   0xe12fff1e                      @ interoperable with Thumb ISA:-)
+#endif
+.align 2
+.LK_00_19:     .word   0x5a827999
+.LK_20_39:     .word   0x6ed9eba1
+.LK_40_59:     .word   0x8f1bbcdc
+.LK_60_79:     .word   0xca62c1d6
+.size  sha1_block_data_order,.-sha1_block_data_order
+.asciz "SHA1 block transform for ARMv4, CRYPTOGAMS by <appro@openssl.org>"
+.align 2
diff --git a/arch/arm/crypto/sha1_glue.c b/arch/arm/crypto/sha1_glue.c
new file mode 100644 (file)
index 0000000..76cd976
--- /dev/null
@@ -0,0 +1,179 @@
+/*
+ * Cryptographic API.
+ * Glue code for the SHA1 Secure Hash Algorithm assembler implementation
+ *
+ * This file is based on sha1_generic.c and sha1_ssse3_glue.c
+ *
+ * Copyright (c) Alan Smithee.
+ * Copyright (c) Andrew McDonald <andrew@mcdonald.org.uk>
+ * Copyright (c) Jean-Francois Dive <jef@linuxbe.org>
+ * Copyright (c) Mathias Krause <minipli@googlemail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ */
+
+#include <crypto/internal/hash.h>
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/cryptohash.h>
+#include <linux/types.h>
+#include <crypto/sha.h>
+#include <asm/byteorder.h>
+
+struct SHA1_CTX {
+       uint32_t h0,h1,h2,h3,h4;
+       u64 count;
+       u8 data[SHA1_BLOCK_SIZE];
+};
+
+asmlinkage void sha1_block_data_order(struct SHA1_CTX *digest,
+               const unsigned char *data, unsigned int rounds);
+
+
+static int sha1_init(struct shash_desc *desc)
+{
+       struct SHA1_CTX *sctx = shash_desc_ctx(desc);
+       memset(sctx, 0, sizeof(*sctx));
+       sctx->h0 = SHA1_H0;
+       sctx->h1 = SHA1_H1;
+       sctx->h2 = SHA1_H2;
+       sctx->h3 = SHA1_H3;
+       sctx->h4 = SHA1_H4;
+       return 0;
+}
+
+
+static int __sha1_update(struct SHA1_CTX *sctx, const u8 *data,
+                              unsigned int len, unsigned int partial)
+{
+       unsigned int done = 0;
+
+       sctx->count += len;
+
+       if (partial) {
+               done = SHA1_BLOCK_SIZE - partial;
+               memcpy(sctx->data + partial, data, done);
+               sha1_block_data_order(sctx, sctx->data, 1);
+       }
+
+       if (len - done >= SHA1_BLOCK_SIZE) {
+               const unsigned int rounds = (len - done) / SHA1_BLOCK_SIZE;
+               sha1_block_data_order(sctx, data + done, rounds);
+               done += rounds * SHA1_BLOCK_SIZE;
+       }
+
+       memcpy(sctx->data, data + done, len - done);
+       return 0;
+}
+
+
+static int sha1_update(struct shash_desc *desc, const u8 *data,
+                            unsigned int len)
+{
+       struct SHA1_CTX *sctx = shash_desc_ctx(desc);
+       unsigned int partial = sctx->count % SHA1_BLOCK_SIZE;
+       int res;
+
+       /* Handle the fast case right here */
+       if (partial + len < SHA1_BLOCK_SIZE) {
+               sctx->count += len;
+               memcpy(sctx->data + partial, data, len);
+               return 0;
+       }
+       res = __sha1_update(sctx, data, len, partial);
+       return res;
+}
+
+
+/* Add padding and return the message digest. */
+static int sha1_final(struct shash_desc *desc, u8 *out)
+{
+       struct SHA1_CTX *sctx = shash_desc_ctx(desc);
+       unsigned int i, index, padlen;
+       __be32 *dst = (__be32 *)out;
+       __be64 bits;
+       static const u8 padding[SHA1_BLOCK_SIZE] = { 0x80, };
+
+       bits = cpu_to_be64(sctx->count << 3);
+
+       /* Pad out to 56 mod 64 and append length */
+       index = sctx->count % SHA1_BLOCK_SIZE;
+       padlen = (index < 56) ? (56 - index) : ((SHA1_BLOCK_SIZE+56) - index);
+       /* We need to fill a whole block for __sha1_update() */
+       if (padlen <= 56) {
+               sctx->count += padlen;
+               memcpy(sctx->data + index, padding, padlen);
+       } else {
+               __sha1_update(sctx, padding, padlen, index);
+       }
+       __sha1_update(sctx, (const u8 *)&bits, sizeof(bits), 56);
+
+       /* Store state in digest */
+       for (i = 0; i < 5; i++)
+               dst[i] = cpu_to_be32(((u32 *)sctx)[i]);
+
+       /* Wipe context */
+       memset(sctx, 0, sizeof(*sctx));
+       return 0;
+}
+
+
+static int sha1_export(struct shash_desc *desc, void *out)
+{
+       struct SHA1_CTX *sctx = shash_desc_ctx(desc);
+       memcpy(out, sctx, sizeof(*sctx));
+       return 0;
+}
+
+
+static int sha1_import(struct shash_desc *desc, const void *in)
+{
+       struct SHA1_CTX *sctx = shash_desc_ctx(desc);
+       memcpy(sctx, in, sizeof(*sctx));
+       return 0;
+}
+
+
+static struct shash_alg alg = {
+       .digestsize     =       SHA1_DIGEST_SIZE,
+       .init           =       sha1_init,
+       .update         =       sha1_update,
+       .final          =       sha1_final,
+       .export         =       sha1_export,
+       .import         =       sha1_import,
+       .descsize       =       sizeof(struct SHA1_CTX),
+       .statesize      =       sizeof(struct SHA1_CTX),
+       .base           =       {
+               .cra_name       =       "sha1",
+               .cra_driver_name=       "sha1-asm",
+               .cra_priority   =       150,
+               .cra_flags      =       CRYPTO_ALG_TYPE_SHASH,
+               .cra_blocksize  =       SHA1_BLOCK_SIZE,
+               .cra_module     =       THIS_MODULE,
+       }
+};
+
+
+static int __init sha1_mod_init(void)
+{
+       return crypto_register_shash(&alg);
+}
+
+
+static void __exit sha1_mod_fini(void)
+{
+       crypto_unregister_shash(&alg);
+}
+
+
+module_init(sha1_mod_init);
+module_exit(sha1_mod_fini);
+
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("SHA1 Secure Hash Algorithm (ARM)");
+MODULE_ALIAS("sha1");
+MODULE_AUTHOR("David McCullough <ucdevel@gmail.com>");
index 06b5624..de7c4c5 100644 (file)
@@ -486,7 +486,8 @@ CONFIG_CRYPTO_TWOFISH=m
 CONFIG_CRYPTO_LZO=m
 # CONFIG_CRYPTO_ANSI_CPRNG is not set
 CONFIG_CRYPTO_HW=y
-CONFIG_CRYPTO_DEV_NX=m
+CONFIG_CRYPTO_DEV_NX=y
+CONFIG_CRYPTO_DEV_NX_ENCRYPT=m
 CONFIG_VIRTUALIZATION=y
 CONFIG_KVM_BOOK3S_64=m
 CONFIG_KVM_BOOK3S_64_HV=y
index 1f65b3c..9f4a936 100644 (file)
@@ -369,7 +369,8 @@ CONFIG_CRYPTO_TWOFISH=m
 CONFIG_CRYPTO_LZO=m
 # CONFIG_CRYPTO_ANSI_CPRNG is not set
 CONFIG_CRYPTO_HW=y
-CONFIG_CRYPTO_DEV_NX=m
+CONFIG_CRYPTO_DEV_NX=y
+CONFIG_CRYPTO_DEV_NX_ENCRYPT=m
 CONFIG_VIRTUALIZATION=y
 CONFIG_KVM_BOOK3S_64=m
 CONFIG_KVM_BOOK3S_64_HV=y
index e144498..47834a3 100644 (file)
@@ -705,6 +705,7 @@ static void __init early_cmdline_parse(void)
 #endif
 #define OV5_TYPE1_AFFINITY     0x80    /* Type 1 NUMA affinity */
 #define OV5_PFO_HW_RNG         0x80    /* PFO Random Number Generator */
+#define OV5_PFO_HW_842         0x40    /* PFO Compression Accelerator */
 #define OV5_PFO_HW_ENCR                0x20    /* PFO Encryption Accelerator */
 
 /* Option Vector 6: IBM PAPR hints */
@@ -774,8 +775,7 @@ static unsigned char ibm_architecture_vec[] = {
        0,
        0,
        0,
-       OV5_PFO_HW_RNG | OV5_PFO_HW_ENCR,
-
+       OV5_PFO_HW_RNG | OV5_PFO_HW_ENCR | OV5_PFO_HW_842,
        /* option vector 6: IBM PAPR hints */
        4 - 2,                          /* length */
        0,
index e402a9d..da3c1a7 100644 (file)
@@ -216,7 +216,6 @@ static struct crypto_alg aes_alg = {
        .cra_blocksize          =       AES_BLOCK_SIZE,
        .cra_ctxsize            =       sizeof(struct s390_aes_ctx),
        .cra_module             =       THIS_MODULE,
-       .cra_list               =       LIST_HEAD_INIT(aes_alg.cra_list),
        .cra_init               =       fallback_init_cip,
        .cra_exit               =       fallback_exit_cip,
        .cra_u                  =       {
@@ -398,7 +397,6 @@ static struct crypto_alg ecb_aes_alg = {
        .cra_ctxsize            =       sizeof(struct s390_aes_ctx),
        .cra_type               =       &crypto_blkcipher_type,
        .cra_module             =       THIS_MODULE,
-       .cra_list               =       LIST_HEAD_INIT(ecb_aes_alg.cra_list),
        .cra_init               =       fallback_init_blk,
        .cra_exit               =       fallback_exit_blk,
        .cra_u                  =       {
@@ -508,7 +506,6 @@ static struct crypto_alg cbc_aes_alg = {
        .cra_ctxsize            =       sizeof(struct s390_aes_ctx),
        .cra_type               =       &crypto_blkcipher_type,
        .cra_module             =       THIS_MODULE,
-       .cra_list               =       LIST_HEAD_INIT(cbc_aes_alg.cra_list),
        .cra_init               =       fallback_init_blk,
        .cra_exit               =       fallback_exit_blk,
        .cra_u                  =       {
@@ -710,7 +707,6 @@ static struct crypto_alg xts_aes_alg = {
        .cra_ctxsize            =       sizeof(struct s390_xts_ctx),
        .cra_type               =       &crypto_blkcipher_type,
        .cra_module             =       THIS_MODULE,
-       .cra_list               =       LIST_HEAD_INIT(xts_aes_alg.cra_list),
        .cra_init               =       xts_fallback_init,
        .cra_exit               =       xts_fallback_exit,
        .cra_u                  =       {
@@ -832,7 +828,6 @@ static struct crypto_alg ctr_aes_alg = {
        .cra_ctxsize            =       sizeof(struct s390_aes_ctx),
        .cra_type               =       &crypto_blkcipher_type,
        .cra_module             =       THIS_MODULE,
-       .cra_list               =       LIST_HEAD_INIT(ctr_aes_alg.cra_list),
        .cra_u                  =       {
                .blkcipher = {
                        .min_keysize            =       AES_MIN_KEY_SIZE,
index 1eaa371..b49fb96 100644 (file)
@@ -70,7 +70,6 @@ static struct crypto_alg des_alg = {
        .cra_blocksize          =       DES_BLOCK_SIZE,
        .cra_ctxsize            =       sizeof(struct s390_des_ctx),
        .cra_module             =       THIS_MODULE,
-       .cra_list               =       LIST_HEAD_INIT(des_alg.cra_list),
        .cra_u                  =       {
                .cipher = {
                        .cia_min_keysize        =       DES_KEY_SIZE,
@@ -163,7 +162,6 @@ static struct crypto_alg ecb_des_alg = {
        .cra_ctxsize            =       sizeof(struct s390_des_ctx),
        .cra_type               =       &crypto_blkcipher_type,
        .cra_module             =       THIS_MODULE,
-       .cra_list               =       LIST_HEAD_INIT(ecb_des_alg.cra_list),
        .cra_u                  =       {
                .blkcipher = {
                        .min_keysize            =       DES_KEY_SIZE,
@@ -206,7 +204,6 @@ static struct crypto_alg cbc_des_alg = {
        .cra_ctxsize            =       sizeof(struct s390_des_ctx),
        .cra_type               =       &crypto_blkcipher_type,
        .cra_module             =       THIS_MODULE,
-       .cra_list               =       LIST_HEAD_INIT(cbc_des_alg.cra_list),
        .cra_u                  =       {
                .blkcipher = {
                        .min_keysize            =       DES_KEY_SIZE,
@@ -271,7 +268,6 @@ static struct crypto_alg des3_alg = {
        .cra_blocksize          =       DES_BLOCK_SIZE,
        .cra_ctxsize            =       sizeof(struct s390_des_ctx),
        .cra_module             =       THIS_MODULE,
-       .cra_list               =       LIST_HEAD_INIT(des3_alg.cra_list),
        .cra_u                  =       {
                .cipher = {
                        .cia_min_keysize        =       DES3_KEY_SIZE,
@@ -314,8 +310,6 @@ static struct crypto_alg ecb_des3_alg = {
        .cra_ctxsize            =       sizeof(struct s390_des_ctx),
        .cra_type               =       &crypto_blkcipher_type,
        .cra_module             =       THIS_MODULE,
-       .cra_list               =       LIST_HEAD_INIT(
-                                               ecb_des3_alg.cra_list),
        .cra_u                  =       {
                .blkcipher = {
                        .min_keysize            =       DES3_KEY_SIZE,
@@ -358,8 +352,6 @@ static struct crypto_alg cbc_des3_alg = {
        .cra_ctxsize            =       sizeof(struct s390_des_ctx),
        .cra_type               =       &crypto_blkcipher_type,
        .cra_module             =       THIS_MODULE,
-       .cra_list               =       LIST_HEAD_INIT(
-                                               cbc_des3_alg.cra_list),
        .cra_u                  =       {
                .blkcipher = {
                        .min_keysize            =       DES3_KEY_SIZE,
@@ -452,7 +444,6 @@ static struct crypto_alg ctr_des_alg = {
        .cra_ctxsize            =       sizeof(struct s390_des_ctx),
        .cra_type               =       &crypto_blkcipher_type,
        .cra_module             =       THIS_MODULE,
-       .cra_list               =       LIST_HEAD_INIT(ctr_des_alg.cra_list),
        .cra_u                  =       {
                .blkcipher = {
                        .min_keysize            =       DES_KEY_SIZE,
@@ -496,7 +487,6 @@ static struct crypto_alg ctr_des3_alg = {
        .cra_ctxsize            =       sizeof(struct s390_des_ctx),
        .cra_type               =       &crypto_blkcipher_type,
        .cra_module             =       THIS_MODULE,
-       .cra_list               =       LIST_HEAD_INIT(ctr_des3_alg.cra_list),
        .cra_u                  =       {
                .blkcipher = {
                        .min_keysize            =       DES3_KEY_SIZE,
index b1bd170..1ebd3a1 100644 (file)
@@ -135,7 +135,6 @@ static struct shash_alg ghash_alg = {
                .cra_blocksize          = GHASH_BLOCK_SIZE,
                .cra_ctxsize            = sizeof(struct ghash_ctx),
                .cra_module             = THIS_MODULE,
-               .cra_list               = LIST_HEAD_INIT(ghash_alg.base.cra_list),
        },
 };
 
index e908e5d..5bacb4a 100644 (file)
@@ -12,6 +12,8 @@ obj-$(CONFIG_CRYPTO_SERPENT_SSE2_586) += serpent-sse2-i586.o
 
 obj-$(CONFIG_CRYPTO_AES_X86_64) += aes-x86_64.o
 obj-$(CONFIG_CRYPTO_CAMELLIA_X86_64) += camellia-x86_64.o
+obj-$(CONFIG_CRYPTO_CAST5_AVX_X86_64) += cast5-avx-x86_64.o
+obj-$(CONFIG_CRYPTO_CAST6_AVX_X86_64) += cast6-avx-x86_64.o
 obj-$(CONFIG_CRYPTO_BLOWFISH_X86_64) += blowfish-x86_64.o
 obj-$(CONFIG_CRYPTO_TWOFISH_X86_64) += twofish-x86_64.o
 obj-$(CONFIG_CRYPTO_TWOFISH_X86_64_3WAY) += twofish-x86_64-3way.o
@@ -32,6 +34,8 @@ serpent-sse2-i586-y := serpent-sse2-i586-asm_32.o serpent_sse2_glue.o
 
 aes-x86_64-y := aes-x86_64-asm_64.o aes_glue.o
 camellia-x86_64-y := camellia-x86_64-asm_64.o camellia_glue.o
+cast5-avx-x86_64-y := cast5-avx-x86_64-asm_64.o cast5_avx_glue.o
+cast6-avx-x86_64-y := cast6-avx-x86_64-asm_64.o cast6_avx_glue.o
 blowfish-x86_64-y := blowfish-x86_64-asm_64.o blowfish_glue.o
 twofish-x86_64-y := twofish-x86_64-asm_64.o twofish_glue.o
 twofish-x86_64-3way-y := twofish-x86_64-asm_64-3way.o twofish_glue_3way.o
index 59b37de..aafe8ce 100644 (file)
@@ -40,7 +40,6 @@ static struct crypto_alg aes_alg = {
        .cra_blocksize          = AES_BLOCK_SIZE,
        .cra_ctxsize            = sizeof(struct crypto_aes_ctx),
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(aes_alg.cra_list),
        .cra_u  = {
                .cipher = {
                        .cia_min_keysize        = AES_MIN_KEY_SIZE,
index 34fdcff..7c04d0d 100644 (file)
@@ -28,6 +28,9 @@
 #include <crypto/aes.h>
 #include <crypto/cryptd.h>
 #include <crypto/ctr.h>
+#include <crypto/b128ops.h>
+#include <crypto/lrw.h>
+#include <crypto/xts.h>
 #include <asm/cpu_device_id.h>
 #include <asm/i387.h>
 #include <asm/crypto/aes.h>
 #define HAS_CTR
 #endif
 
-#if defined(CONFIG_CRYPTO_LRW) || defined(CONFIG_CRYPTO_LRW_MODULE)
-#define HAS_LRW
-#endif
-
 #if defined(CONFIG_CRYPTO_PCBC) || defined(CONFIG_CRYPTO_PCBC_MODULE)
 #define HAS_PCBC
 #endif
 
-#if defined(CONFIG_CRYPTO_XTS) || defined(CONFIG_CRYPTO_XTS_MODULE)
-#define HAS_XTS
-#endif
-
 /* This data is stored at the end of the crypto_tfm struct.
  * It's a type of per "session" data storage location.
  * This needs to be 16 byte aligned.
@@ -79,6 +74,16 @@ struct aesni_hash_subkey_req_data {
 #define AES_BLOCK_MASK (~(AES_BLOCK_SIZE-1))
 #define RFC4106_HASH_SUBKEY_SIZE 16
 
+struct aesni_lrw_ctx {
+       struct lrw_table_ctx lrw_table;
+       u8 raw_aes_ctx[sizeof(struct crypto_aes_ctx) + AESNI_ALIGN - 1];
+};
+
+struct aesni_xts_ctx {
+       u8 raw_tweak_ctx[sizeof(struct crypto_aes_ctx) + AESNI_ALIGN - 1];
+       u8 raw_crypt_ctx[sizeof(struct crypto_aes_ctx) + AESNI_ALIGN - 1];
+};
+
 asmlinkage int aesni_set_key(struct crypto_aes_ctx *ctx, const u8 *in_key,
                             unsigned int key_len);
 asmlinkage void aesni_enc(struct crypto_aes_ctx *ctx, u8 *out,
@@ -398,13 +403,6 @@ static int ablk_rfc3686_ctr_init(struct crypto_tfm *tfm)
 #endif
 #endif
 
-#ifdef HAS_LRW
-static int ablk_lrw_init(struct crypto_tfm *tfm)
-{
-       return ablk_init_common(tfm, "fpu(lrw(__driver-aes-aesni))");
-}
-#endif
-
 #ifdef HAS_PCBC
 static int ablk_pcbc_init(struct crypto_tfm *tfm)
 {
@@ -412,12 +410,160 @@ static int ablk_pcbc_init(struct crypto_tfm *tfm)
 }
 #endif
 
-#ifdef HAS_XTS
-static int ablk_xts_init(struct crypto_tfm *tfm)
+static void lrw_xts_encrypt_callback(void *ctx, u8 *blks, unsigned int nbytes)
 {
-       return ablk_init_common(tfm, "fpu(xts(__driver-aes-aesni))");
+       aesni_ecb_enc(ctx, blks, blks, nbytes);
+}
+
+static void lrw_xts_decrypt_callback(void *ctx, u8 *blks, unsigned int nbytes)
+{
+       aesni_ecb_dec(ctx, blks, blks, nbytes);
+}
+
+static int lrw_aesni_setkey(struct crypto_tfm *tfm, const u8 *key,
+                           unsigned int keylen)
+{
+       struct aesni_lrw_ctx *ctx = crypto_tfm_ctx(tfm);
+       int err;
+
+       err = aes_set_key_common(tfm, ctx->raw_aes_ctx, key,
+                                keylen - AES_BLOCK_SIZE);
+       if (err)
+               return err;
+
+       return lrw_init_table(&ctx->lrw_table, key + keylen - AES_BLOCK_SIZE);
+}
+
+static void lrw_aesni_exit_tfm(struct crypto_tfm *tfm)
+{
+       struct aesni_lrw_ctx *ctx = crypto_tfm_ctx(tfm);
+
+       lrw_free_table(&ctx->lrw_table);
+}
+
+static int lrw_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
+                      struct scatterlist *src, unsigned int nbytes)
+{
+       struct aesni_lrw_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
+       be128 buf[8];
+       struct lrw_crypt_req req = {
+               .tbuf = buf,
+               .tbuflen = sizeof(buf),
+
+               .table_ctx = &ctx->lrw_table,
+               .crypt_ctx = aes_ctx(ctx->raw_aes_ctx),
+               .crypt_fn = lrw_xts_encrypt_callback,
+       };
+       int ret;
+
+       desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
+
+       kernel_fpu_begin();
+       ret = lrw_crypt(desc, dst, src, nbytes, &req);
+       kernel_fpu_end();
+
+       return ret;
+}
+
+static int lrw_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
+                      struct scatterlist *src, unsigned int nbytes)
+{
+       struct aesni_lrw_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
+       be128 buf[8];
+       struct lrw_crypt_req req = {
+               .tbuf = buf,
+               .tbuflen = sizeof(buf),
+
+               .table_ctx = &ctx->lrw_table,
+               .crypt_ctx = aes_ctx(ctx->raw_aes_ctx),
+               .crypt_fn = lrw_xts_decrypt_callback,
+       };
+       int ret;
+
+       desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
+
+       kernel_fpu_begin();
+       ret = lrw_crypt(desc, dst, src, nbytes, &req);
+       kernel_fpu_end();
+
+       return ret;
+}
+
+static int xts_aesni_setkey(struct crypto_tfm *tfm, const u8 *key,
+                           unsigned int keylen)
+{
+       struct aesni_xts_ctx *ctx = crypto_tfm_ctx(tfm);
+       u32 *flags = &tfm->crt_flags;
+       int err;
+
+       /* key consists of keys of equal size concatenated, therefore
+        * the length must be even
+        */
+       if (keylen % 2) {
+               *flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
+               return -EINVAL;
+       }
+
+       /* first half of xts-key is for crypt */
+       err = aes_set_key_common(tfm, ctx->raw_crypt_ctx, key, keylen / 2);
+       if (err)
+               return err;
+
+       /* second half of xts-key is for tweak */
+       return aes_set_key_common(tfm, ctx->raw_tweak_ctx, key + keylen / 2,
+                                 keylen / 2);
+}
+
+
+static int xts_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
+                      struct scatterlist *src, unsigned int nbytes)
+{
+       struct aesni_xts_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
+       be128 buf[8];
+       struct xts_crypt_req req = {
+               .tbuf = buf,
+               .tbuflen = sizeof(buf),
+
+               .tweak_ctx = aes_ctx(ctx->raw_tweak_ctx),
+               .tweak_fn = XTS_TWEAK_CAST(aesni_enc),
+               .crypt_ctx = aes_ctx(ctx->raw_crypt_ctx),
+               .crypt_fn = lrw_xts_encrypt_callback,
+       };
+       int ret;
+
+       desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
+
+       kernel_fpu_begin();
+       ret = xts_crypt(desc, dst, src, nbytes, &req);
+       kernel_fpu_end();
+
+       return ret;
+}
+
+static int xts_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
+                      struct scatterlist *src, unsigned int nbytes)
+{
+       struct aesni_xts_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
+       be128 buf[8];
+       struct xts_crypt_req req = {
+               .tbuf = buf,
+               .tbuflen = sizeof(buf),
+
+               .tweak_ctx = aes_ctx(ctx->raw_tweak_ctx),
+               .tweak_fn = XTS_TWEAK_CAST(aesni_enc),
+               .crypt_ctx = aes_ctx(ctx->raw_crypt_ctx),
+               .crypt_fn = lrw_xts_decrypt_callback,
+       };
+       int ret;
+
+       desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
+
+       kernel_fpu_begin();
+       ret = xts_crypt(desc, dst, src, nbytes, &req);
+       kernel_fpu_end();
+
+       return ret;
 }
-#endif
 
 #ifdef CONFIG_X86_64
 static int rfc4106_init(struct crypto_tfm *tfm)
@@ -1035,10 +1181,10 @@ static struct crypto_alg aesni_algs[] = { {
        },
 #endif
 #endif
-#ifdef HAS_LRW
+#ifdef HAS_PCBC
 }, {
-       .cra_name               = "lrw(aes)",
-       .cra_driver_name        = "lrw-aes-aesni",
+       .cra_name               = "pcbc(aes)",
+       .cra_driver_name        = "pcbc-aes-aesni",
        .cra_priority           = 400,
        .cra_flags              = CRYPTO_ALG_TYPE_ABLKCIPHER | CRYPTO_ALG_ASYNC,
        .cra_blocksize          = AES_BLOCK_SIZE,
@@ -1046,12 +1192,12 @@ static struct crypto_alg aesni_algs[] = { {
        .cra_alignmask          = 0,
        .cra_type               = &crypto_ablkcipher_type,
        .cra_module             = THIS_MODULE,
-       .cra_init               = ablk_lrw_init,
+       .cra_init               = ablk_pcbc_init,
        .cra_exit               = ablk_exit,
        .cra_u = {
                .ablkcipher = {
-                       .min_keysize    = AES_MIN_KEY_SIZE + AES_BLOCK_SIZE,
-                       .max_keysize    = AES_MAX_KEY_SIZE + AES_BLOCK_SIZE,
+                       .min_keysize    = AES_MIN_KEY_SIZE,
+                       .max_keysize    = AES_MAX_KEY_SIZE,
                        .ivsize         = AES_BLOCK_SIZE,
                        .setkey         = ablk_set_key,
                        .encrypt        = ablk_encrypt,
@@ -1059,10 +1205,50 @@ static struct crypto_alg aesni_algs[] = { {
                },
        },
 #endif
-#ifdef HAS_PCBC
 }, {
-       .cra_name               = "pcbc(aes)",
-       .cra_driver_name        = "pcbc-aes-aesni",
+       .cra_name               = "__lrw-aes-aesni",
+       .cra_driver_name        = "__driver-lrw-aes-aesni",
+       .cra_priority           = 0,
+       .cra_flags              = CRYPTO_ALG_TYPE_BLKCIPHER,
+       .cra_blocksize          = AES_BLOCK_SIZE,
+       .cra_ctxsize            = sizeof(struct aesni_lrw_ctx),
+       .cra_alignmask          = 0,
+       .cra_type               = &crypto_blkcipher_type,
+       .cra_module             = THIS_MODULE,
+       .cra_exit               = lrw_aesni_exit_tfm,
+       .cra_u = {
+               .blkcipher = {
+                       .min_keysize    = AES_MIN_KEY_SIZE + AES_BLOCK_SIZE,
+                       .max_keysize    = AES_MAX_KEY_SIZE + AES_BLOCK_SIZE,
+                       .ivsize         = AES_BLOCK_SIZE,
+                       .setkey         = lrw_aesni_setkey,
+                       .encrypt        = lrw_encrypt,
+                       .decrypt        = lrw_decrypt,
+               },
+       },
+}, {
+       .cra_name               = "__xts-aes-aesni",
+       .cra_driver_name        = "__driver-xts-aes-aesni",
+       .cra_priority           = 0,
+       .cra_flags              = CRYPTO_ALG_TYPE_BLKCIPHER,
+       .cra_blocksize          = AES_BLOCK_SIZE,
+       .cra_ctxsize            = sizeof(struct aesni_xts_ctx),
+       .cra_alignmask          = 0,
+       .cra_type               = &crypto_blkcipher_type,
+       .cra_module             = THIS_MODULE,
+       .cra_u = {
+               .blkcipher = {
+                       .min_keysize    = 2 * AES_MIN_KEY_SIZE,
+                       .max_keysize    = 2 * AES_MAX_KEY_SIZE,
+                       .ivsize         = AES_BLOCK_SIZE,
+                       .setkey         = xts_aesni_setkey,
+                       .encrypt        = xts_encrypt,
+                       .decrypt        = xts_decrypt,
+               },
+       },
+}, {
+       .cra_name               = "lrw(aes)",
+       .cra_driver_name        = "lrw-aes-aesni",
        .cra_priority           = 400,
        .cra_flags              = CRYPTO_ALG_TYPE_ABLKCIPHER | CRYPTO_ALG_ASYNC,
        .cra_blocksize          = AES_BLOCK_SIZE,
@@ -1070,20 +1256,18 @@ static struct crypto_alg aesni_algs[] = { {
        .cra_alignmask          = 0,
        .cra_type               = &crypto_ablkcipher_type,
        .cra_module             = THIS_MODULE,
-       .cra_init               = ablk_pcbc_init,
+       .cra_init               = ablk_init,
        .cra_exit               = ablk_exit,
        .cra_u = {
                .ablkcipher = {
-                       .min_keysize    = AES_MIN_KEY_SIZE,
-                       .max_keysize    = AES_MAX_KEY_SIZE,
+                       .min_keysize    = AES_MIN_KEY_SIZE + AES_BLOCK_SIZE,
+                       .max_keysize    = AES_MAX_KEY_SIZE + AES_BLOCK_SIZE,
                        .ivsize         = AES_BLOCK_SIZE,
                        .setkey         = ablk_set_key,
                        .encrypt        = ablk_encrypt,
                        .decrypt        = ablk_decrypt,
                },
        },
-#endif
-#ifdef HAS_XTS
 }, {
        .cra_name               = "xts(aes)",
        .cra_driver_name        = "xts-aes-aesni",
@@ -1094,7 +1278,7 @@ static struct crypto_alg aesni_algs[] = { {
        .cra_alignmask          = 0,
        .cra_type               = &crypto_ablkcipher_type,
        .cra_module             = THIS_MODULE,
-       .cra_init               = ablk_xts_init,
+       .cra_init               = ablk_init,
        .cra_exit               = ablk_exit,
        .cra_u = {
                .ablkcipher = {
@@ -1106,7 +1290,6 @@ static struct crypto_alg aesni_algs[] = { {
                        .decrypt        = ablk_decrypt,
                },
        },
-#endif
 } };
 
 
@@ -1118,7 +1301,7 @@ MODULE_DEVICE_TABLE(x86cpu, aesni_cpu_id);
 
 static int __init aesni_init(void)
 {
-       int err, i;
+       int err;
 
        if (!x86_match_cpu(aesni_cpu_id))
                return -ENODEV;
@@ -1127,9 +1310,6 @@ static int __init aesni_init(void)
        if (err)
                return err;
 
-       for (i = 0; i < ARRAY_SIZE(aesni_algs); i++)
-               INIT_LIST_HEAD(&aesni_algs[i].cra_list);
-
        return crypto_register_algs(aesni_algs, ARRAY_SIZE(aesni_algs));
 }
 
index 7967474..50ec333 100644 (file)
@@ -367,7 +367,6 @@ static struct crypto_alg bf_algs[4] = { {
        .cra_ctxsize            = sizeof(struct bf_ctx),
        .cra_alignmask          = 0,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(bf_algs[0].cra_list),
        .cra_u = {
                .cipher = {
                        .cia_min_keysize        = BF_MIN_KEY_SIZE,
@@ -387,7 +386,6 @@ static struct crypto_alg bf_algs[4] = { {
        .cra_alignmask          = 0,
        .cra_type               = &crypto_blkcipher_type,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(bf_algs[1].cra_list),
        .cra_u = {
                .blkcipher = {
                        .min_keysize    = BF_MIN_KEY_SIZE,
@@ -407,7 +405,6 @@ static struct crypto_alg bf_algs[4] = { {
        .cra_alignmask          = 0,
        .cra_type               = &crypto_blkcipher_type,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(bf_algs[2].cra_list),
        .cra_u = {
                .blkcipher = {
                        .min_keysize    = BF_MIN_KEY_SIZE,
@@ -428,7 +425,6 @@ static struct crypto_alg bf_algs[4] = { {
        .cra_alignmask          = 0,
        .cra_type               = &crypto_blkcipher_type,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(bf_algs[3].cra_list),
        .cra_u = {
                .blkcipher = {
                        .min_keysize    = BF_MIN_KEY_SIZE,
index eeb2b3b..42ffd2b 100644 (file)
@@ -92,715 +92,715 @@ static void camellia_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
 
 /* camellia sboxes */
 const u64 camellia_sp10011110[256] = {
-       0x7000007070707000, 0x8200008282828200, 0x2c00002c2c2c2c00,
-       0xec0000ecececec00, 0xb30000b3b3b3b300, 0x2700002727272700,
-       0xc00000c0c0c0c000, 0xe50000e5e5e5e500, 0xe40000e4e4e4e400,
-       0x8500008585858500, 0x5700005757575700, 0x3500003535353500,
-       0xea0000eaeaeaea00, 0x0c00000c0c0c0c00, 0xae0000aeaeaeae00,
-       0x4100004141414100, 0x2300002323232300, 0xef0000efefefef00,
-       0x6b00006b6b6b6b00, 0x9300009393939300, 0x4500004545454500,
-       0x1900001919191900, 0xa50000a5a5a5a500, 0x2100002121212100,
-       0xed0000edededed00, 0x0e00000e0e0e0e00, 0x4f00004f4f4f4f00,
-       0x4e00004e4e4e4e00, 0x1d00001d1d1d1d00, 0x6500006565656500,
-       0x9200009292929200, 0xbd0000bdbdbdbd00, 0x8600008686868600,
-       0xb80000b8b8b8b800, 0xaf0000afafafaf00, 0x8f00008f8f8f8f00,
-       0x7c00007c7c7c7c00, 0xeb0000ebebebeb00, 0x1f00001f1f1f1f00,
-       0xce0000cececece00, 0x3e00003e3e3e3e00, 0x3000003030303000,
-       0xdc0000dcdcdcdc00, 0x5f00005f5f5f5f00, 0x5e00005e5e5e5e00,
-       0xc50000c5c5c5c500, 0x0b00000b0b0b0b00, 0x1a00001a1a1a1a00,
-       0xa60000a6a6a6a600, 0xe10000e1e1e1e100, 0x3900003939393900,
-       0xca0000cacacaca00, 0xd50000d5d5d5d500, 0x4700004747474700,
-       0x5d00005d5d5d5d00, 0x3d00003d3d3d3d00, 0xd90000d9d9d9d900,
-       0x0100000101010100, 0x5a00005a5a5a5a00, 0xd60000d6d6d6d600,
-       0x5100005151515100, 0x5600005656565600, 0x6c00006c6c6c6c00,
-       0x4d00004d4d4d4d00, 0x8b00008b8b8b8b00, 0x0d00000d0d0d0d00,
-       0x9a00009a9a9a9a00, 0x6600006666666600, 0xfb0000fbfbfbfb00,
-       0xcc0000cccccccc00, 0xb00000b0b0b0b000, 0x2d00002d2d2d2d00,
-       0x7400007474747400, 0x1200001212121200, 0x2b00002b2b2b2b00,
-       0x2000002020202000, 0xf00000f0f0f0f000, 0xb10000b1b1b1b100,
-       0x8400008484848400, 0x9900009999999900, 0xdf0000dfdfdfdf00,
-       0x4c00004c4c4c4c00, 0xcb0000cbcbcbcb00, 0xc20000c2c2c2c200,
-       0x3400003434343400, 0x7e00007e7e7e7e00, 0x7600007676767600,
-       0x0500000505050500, 0x6d00006d6d6d6d00, 0xb70000b7b7b7b700,
-       0xa90000a9a9a9a900, 0x3100003131313100, 0xd10000d1d1d1d100,
-       0x1700001717171700, 0x0400000404040400, 0xd70000d7d7d7d700,
-       0x1400001414141400, 0x5800005858585800, 0x3a00003a3a3a3a00,
-       0x6100006161616100, 0xde0000dededede00, 0x1b00001b1b1b1b00,
-       0x1100001111111100, 0x1c00001c1c1c1c00, 0x3200003232323200,
-       0x0f00000f0f0f0f00, 0x9c00009c9c9c9c00, 0x1600001616161600,
-       0x5300005353535300, 0x1800001818181800, 0xf20000f2f2f2f200,
-       0x2200002222222200, 0xfe0000fefefefe00, 0x4400004444444400,
-       0xcf0000cfcfcfcf00, 0xb20000b2b2b2b200, 0xc30000c3c3c3c300,
-       0xb50000b5b5b5b500, 0x7a00007a7a7a7a00, 0x9100009191919100,
-       0x2400002424242400, 0x0800000808080800, 0xe80000e8e8e8e800,
-       0xa80000a8a8a8a800, 0x6000006060606000, 0xfc0000fcfcfcfc00,
-       0x6900006969696900, 0x5000005050505000, 0xaa0000aaaaaaaa00,
-       0xd00000d0d0d0d000, 0xa00000a0a0a0a000, 0x7d00007d7d7d7d00,
-       0xa10000a1a1a1a100, 0x8900008989898900, 0x6200006262626200,
-       0x9700009797979700, 0x5400005454545400, 0x5b00005b5b5b5b00,
-       0x1e00001e1e1e1e00, 0x9500009595959500, 0xe00000e0e0e0e000,
-       0xff0000ffffffff00, 0x6400006464646400, 0xd20000d2d2d2d200,
-       0x1000001010101000, 0xc40000c4c4c4c400, 0x0000000000000000,
-       0x4800004848484800, 0xa30000a3a3a3a300, 0xf70000f7f7f7f700,
-       0x7500007575757500, 0xdb0000dbdbdbdb00, 0x8a00008a8a8a8a00,
-       0x0300000303030300, 0xe60000e6e6e6e600, 0xda0000dadadada00,
-       0x0900000909090900, 0x3f00003f3f3f3f00, 0xdd0000dddddddd00,
-       0x9400009494949400, 0x8700008787878700, 0x5c00005c5c5c5c00,
-       0x8300008383838300, 0x0200000202020200, 0xcd0000cdcdcdcd00,
-       0x4a00004a4a4a4a00, 0x9000009090909000, 0x3300003333333300,
-       0x7300007373737300, 0x6700006767676700, 0xf60000f6f6f6f600,
-       0xf30000f3f3f3f300, 0x9d00009d9d9d9d00, 0x7f00007f7f7f7f00,
-       0xbf0000bfbfbfbf00, 0xe20000e2e2e2e200, 0x5200005252525200,
-       0x9b00009b9b9b9b00, 0xd80000d8d8d8d800, 0x2600002626262600,
-       0xc80000c8c8c8c800, 0x3700003737373700, 0xc60000c6c6c6c600,
-       0x3b00003b3b3b3b00, 0x8100008181818100, 0x9600009696969600,
-       0x6f00006f6f6f6f00, 0x4b00004b4b4b4b00, 0x1300001313131300,
-       0xbe0000bebebebe00, 0x6300006363636300, 0x2e00002e2e2e2e00,
-       0xe90000e9e9e9e900, 0x7900007979797900, 0xa70000a7a7a7a700,
-       0x8c00008c8c8c8c00, 0x9f00009f9f9f9f00, 0x6e00006e6e6e6e00,
-       0xbc0000bcbcbcbc00, 0x8e00008e8e8e8e00, 0x2900002929292900,
-       0xf50000f5f5f5f500, 0xf90000f9f9f9f900, 0xb60000b6b6b6b600,
-       0x2f00002f2f2f2f00, 0xfd0000fdfdfdfd00, 0xb40000b4b4b4b400,
-       0x5900005959595900, 0x7800007878787800, 0x9800009898989800,
-       0x0600000606060600, 0x6a00006a6a6a6a00, 0xe70000e7e7e7e700,
-       0x4600004646464600, 0x7100007171717100, 0xba0000babababa00,
-       0xd40000d4d4d4d400, 0x2500002525252500, 0xab0000abababab00,
-       0x4200004242424200, 0x8800008888888800, 0xa20000a2a2a2a200,
-       0x8d00008d8d8d8d00, 0xfa0000fafafafa00, 0x7200007272727200,
-       0x0700000707070700, 0xb90000b9b9b9b900, 0x5500005555555500,
-       0xf80000f8f8f8f800, 0xee0000eeeeeeee00, 0xac0000acacacac00,
-       0x0a00000a0a0a0a00, 0x3600003636363600, 0x4900004949494900,
-       0x2a00002a2a2a2a00, 0x6800006868686800, 0x3c00003c3c3c3c00,
-       0x3800003838383800, 0xf10000f1f1f1f100, 0xa40000a4a4a4a400,
-       0x4000004040404000, 0x2800002828282800, 0xd30000d3d3d3d300,
-       0x7b00007b7b7b7b00, 0xbb0000bbbbbbbb00, 0xc90000c9c9c9c900,
-       0x4300004343434300, 0xc10000c1c1c1c100, 0x1500001515151500,
-       0xe30000e3e3e3e300, 0xad0000adadadad00, 0xf40000f4f4f4f400,
-       0x7700007777777700, 0xc70000c7c7c7c700, 0x8000008080808000,
-       0x9e00009e9e9e9e00,
+       0x7000007070707000ULL, 0x8200008282828200ULL, 0x2c00002c2c2c2c00ULL,
+       0xec0000ecececec00ULL, 0xb30000b3b3b3b300ULL, 0x2700002727272700ULL,
+       0xc00000c0c0c0c000ULL, 0xe50000e5e5e5e500ULL, 0xe40000e4e4e4e400ULL,
+       0x8500008585858500ULL, 0x5700005757575700ULL, 0x3500003535353500ULL,
+       0xea0000eaeaeaea00ULL, 0x0c00000c0c0c0c00ULL, 0xae0000aeaeaeae00ULL,
+       0x4100004141414100ULL, 0x2300002323232300ULL, 0xef0000efefefef00ULL,
+       0x6b00006b6b6b6b00ULL, 0x9300009393939300ULL, 0x4500004545454500ULL,
+       0x1900001919191900ULL, 0xa50000a5a5a5a500ULL, 0x2100002121212100ULL,
+       0xed0000edededed00ULL, 0x0e00000e0e0e0e00ULL, 0x4f00004f4f4f4f00ULL,
+       0x4e00004e4e4e4e00ULL, 0x1d00001d1d1d1d00ULL, 0x6500006565656500ULL,
+       0x9200009292929200ULL, 0xbd0000bdbdbdbd00ULL, 0x8600008686868600ULL,
+       0xb80000b8b8b8b800ULL, 0xaf0000afafafaf00ULL, 0x8f00008f8f8f8f00ULL,
+       0x7c00007c7c7c7c00ULL, 0xeb0000ebebebeb00ULL, 0x1f00001f1f1f1f00ULL,
+       0xce0000cececece00ULL, 0x3e00003e3e3e3e00ULL, 0x3000003030303000ULL,
+       0xdc0000dcdcdcdc00ULL, 0x5f00005f5f5f5f00ULL, 0x5e00005e5e5e5e00ULL,
+       0xc50000c5c5c5c500ULL, 0x0b00000b0b0b0b00ULL, 0x1a00001a1a1a1a00ULL,
+       0xa60000a6a6a6a600ULL, 0xe10000e1e1e1e100ULL, 0x3900003939393900ULL,
+       0xca0000cacacaca00ULL, 0xd50000d5d5d5d500ULL, 0x4700004747474700ULL,
+       0x5d00005d5d5d5d00ULL, 0x3d00003d3d3d3d00ULL, 0xd90000d9d9d9d900ULL,
+       0x0100000101010100ULL, 0x5a00005a5a5a5a00ULL, 0xd60000d6d6d6d600ULL,
+       0x5100005151515100ULL, 0x5600005656565600ULL, 0x6c00006c6c6c6c00ULL,
+       0x4d00004d4d4d4d00ULL, 0x8b00008b8b8b8b00ULL, 0x0d00000d0d0d0d00ULL,
+       0x9a00009a9a9a9a00ULL, 0x6600006666666600ULL, 0xfb0000fbfbfbfb00ULL,
+       0xcc0000cccccccc00ULL, 0xb00000b0b0b0b000ULL, 0x2d00002d2d2d2d00ULL,
+       0x7400007474747400ULL, 0x1200001212121200ULL, 0x2b00002b2b2b2b00ULL,
+       0x2000002020202000ULL, 0xf00000f0f0f0f000ULL, 0xb10000b1b1b1b100ULL,
+       0x8400008484848400ULL, 0x9900009999999900ULL, 0xdf0000dfdfdfdf00ULL,
+       0x4c00004c4c4c4c00ULL, 0xcb0000cbcbcbcb00ULL, 0xc20000c2c2c2c200ULL,
+       0x3400003434343400ULL, 0x7e00007e7e7e7e00ULL, 0x7600007676767600ULL,
+       0x0500000505050500ULL, 0x6d00006d6d6d6d00ULL, 0xb70000b7b7b7b700ULL,
+       0xa90000a9a9a9a900ULL, 0x3100003131313100ULL, 0xd10000d1d1d1d100ULL,
+       0x1700001717171700ULL, 0x0400000404040400ULL, 0xd70000d7d7d7d700ULL,
+       0x1400001414141400ULL, 0x5800005858585800ULL, 0x3a00003a3a3a3a00ULL,
+       0x6100006161616100ULL, 0xde0000dededede00ULL, 0x1b00001b1b1b1b00ULL,
+       0x1100001111111100ULL, 0x1c00001c1c1c1c00ULL, 0x3200003232323200ULL,
+       0x0f00000f0f0f0f00ULL, 0x9c00009c9c9c9c00ULL, 0x1600001616161600ULL,
+       0x5300005353535300ULL, 0x1800001818181800ULL, 0xf20000f2f2f2f200ULL,
+       0x2200002222222200ULL, 0xfe0000fefefefe00ULL, 0x4400004444444400ULL,
+       0xcf0000cfcfcfcf00ULL, 0xb20000b2b2b2b200ULL, 0xc30000c3c3c3c300ULL,
+       0xb50000b5b5b5b500ULL, 0x7a00007a7a7a7a00ULL, 0x9100009191919100ULL,
+       0x2400002424242400ULL, 0x0800000808080800ULL, 0xe80000e8e8e8e800ULL,
+       0xa80000a8a8a8a800ULL, 0x6000006060606000ULL, 0xfc0000fcfcfcfc00ULL,
+       0x6900006969696900ULL, 0x5000005050505000ULL, 0xaa0000aaaaaaaa00ULL,
+       0xd00000d0d0d0d000ULL, 0xa00000a0a0a0a000ULL, 0x7d00007d7d7d7d00ULL,
+       0xa10000a1a1a1a100ULL, 0x8900008989898900ULL, 0x6200006262626200ULL,
+       0x9700009797979700ULL, 0x5400005454545400ULL, 0x5b00005b5b5b5b00ULL,
+       0x1e00001e1e1e1e00ULL, 0x9500009595959500ULL, 0xe00000e0e0e0e000ULL,
+       0xff0000ffffffff00ULL, 0x6400006464646400ULL, 0xd20000d2d2d2d200ULL,
+       0x1000001010101000ULL, 0xc40000c4c4c4c400ULL, 0x0000000000000000ULL,
+       0x4800004848484800ULL, 0xa30000a3a3a3a300ULL, 0xf70000f7f7f7f700ULL,
+       0x7500007575757500ULL, 0xdb0000dbdbdbdb00ULL, 0x8a00008a8a8a8a00ULL,
+       0x0300000303030300ULL, 0xe60000e6e6e6e600ULL, 0xda0000dadadada00ULL,
+       0x0900000909090900ULL, 0x3f00003f3f3f3f00ULL, 0xdd0000dddddddd00ULL,
+       0x9400009494949400ULL, 0x8700008787878700ULL, 0x5c00005c5c5c5c00ULL,
+       0x8300008383838300ULL, 0x0200000202020200ULL, 0xcd0000cdcdcdcd00ULL,
+       0x4a00004a4a4a4a00ULL, 0x9000009090909000ULL, 0x3300003333333300ULL,
+       0x7300007373737300ULL, 0x6700006767676700ULL, 0xf60000f6f6f6f600ULL,
+       0xf30000f3f3f3f300ULL, 0x9d00009d9d9d9d00ULL, 0x7f00007f7f7f7f00ULL,
+       0xbf0000bfbfbfbf00ULL, 0xe20000e2e2e2e200ULL, 0x5200005252525200ULL,
+       0x9b00009b9b9b9b00ULL, 0xd80000d8d8d8d800ULL, 0x2600002626262600ULL,
+       0xc80000c8c8c8c800ULL, 0x3700003737373700ULL, 0xc60000c6c6c6c600ULL,
+       0x3b00003b3b3b3b00ULL, 0x8100008181818100ULL, 0x9600009696969600ULL,
+       0x6f00006f6f6f6f00ULL, 0x4b00004b4b4b4b00ULL, 0x1300001313131300ULL,
+       0xbe0000bebebebe00ULL, 0x6300006363636300ULL, 0x2e00002e2e2e2e00ULL,
+       0xe90000e9e9e9e900ULL, 0x7900007979797900ULL, 0xa70000a7a7a7a700ULL,
+       0x8c00008c8c8c8c00ULL, 0x9f00009f9f9f9f00ULL, 0x6e00006e6e6e6e00ULL,
+       0xbc0000bcbcbcbc00ULL, 0x8e00008e8e8e8e00ULL, 0x2900002929292900ULL,
+       0xf50000f5f5f5f500ULL, 0xf90000f9f9f9f900ULL, 0xb60000b6b6b6b600ULL,
+       0x2f00002f2f2f2f00ULL, 0xfd0000fdfdfdfd00ULL, 0xb40000b4b4b4b400ULL,
+       0x5900005959595900ULL, 0x7800007878787800ULL, 0x9800009898989800ULL,
+       0x0600000606060600ULL, 0x6a00006a6a6a6a00ULL, 0xe70000e7e7e7e700ULL,
+       0x4600004646464600ULL, 0x7100007171717100ULL, 0xba0000babababa00ULL,
+       0xd40000d4d4d4d400ULL, 0x2500002525252500ULL, 0xab0000abababab00ULL,
+       0x4200004242424200ULL, 0x8800008888888800ULL, 0xa20000a2a2a2a200ULL,
+       0x8d00008d8d8d8d00ULL, 0xfa0000fafafafa00ULL, 0x7200007272727200ULL,
+       0x0700000707070700ULL, 0xb90000b9b9b9b900ULL, 0x5500005555555500ULL,
+       0xf80000f8f8f8f800ULL, 0xee0000eeeeeeee00ULL, 0xac0000acacacac00ULL,
+       0x0a00000a0a0a0a00ULL, 0x3600003636363600ULL, 0x4900004949494900ULL,
+       0x2a00002a2a2a2a00ULL, 0x6800006868686800ULL, 0x3c00003c3c3c3c00ULL,
+       0x3800003838383800ULL, 0xf10000f1f1f1f100ULL, 0xa40000a4a4a4a400ULL,
+       0x4000004040404000ULL, 0x2800002828282800ULL, 0xd30000d3d3d3d300ULL,
+       0x7b00007b7b7b7b00ULL, 0xbb0000bbbbbbbb00ULL, 0xc90000c9c9c9c900ULL,
+       0x4300004343434300ULL, 0xc10000c1c1c1c100ULL, 0x1500001515151500ULL,
+       0xe30000e3e3e3e300ULL, 0xad0000adadadad00ULL, 0xf40000f4f4f4f400ULL,
+       0x7700007777777700ULL, 0xc70000c7c7c7c700ULL, 0x8000008080808000ULL,
+       0x9e00009e9e9e9e00ULL,
 };
 
 const u64 camellia_sp22000222[256] = {
-       0xe0e0000000e0e0e0, 0x0505000000050505, 0x5858000000585858,
-       0xd9d9000000d9d9d9, 0x6767000000676767, 0x4e4e0000004e4e4e,
-       0x8181000000818181, 0xcbcb000000cbcbcb, 0xc9c9000000c9c9c9,
-       0x0b0b0000000b0b0b, 0xaeae000000aeaeae, 0x6a6a0000006a6a6a,
-       0xd5d5000000d5d5d5, 0x1818000000181818, 0x5d5d0000005d5d5d,
-       0x8282000000828282, 0x4646000000464646, 0xdfdf000000dfdfdf,
-       0xd6d6000000d6d6d6, 0x2727000000272727, 0x8a8a0000008a8a8a,
-       0x3232000000323232, 0x4b4b0000004b4b4b, 0x4242000000424242,
-       0xdbdb000000dbdbdb, 0x1c1c0000001c1c1c, 0x9e9e0000009e9e9e,
-       0x9c9c0000009c9c9c, 0x3a3a0000003a3a3a, 0xcaca000000cacaca,
-       0x2525000000252525, 0x7b7b0000007b7b7b, 0x0d0d0000000d0d0d,
-       0x7171000000717171, 0x5f5f0000005f5f5f, 0x1f1f0000001f1f1f,
-       0xf8f8000000f8f8f8, 0xd7d7000000d7d7d7, 0x3e3e0000003e3e3e,
-       0x9d9d0000009d9d9d, 0x7c7c0000007c7c7c, 0x6060000000606060,
-       0xb9b9000000b9b9b9, 0xbebe000000bebebe, 0xbcbc000000bcbcbc,
-       0x8b8b0000008b8b8b, 0x1616000000161616, 0x3434000000343434,
-       0x4d4d0000004d4d4d, 0xc3c3000000c3c3c3, 0x7272000000727272,
-       0x9595000000959595, 0xabab000000ababab, 0x8e8e0000008e8e8e,
-       0xbaba000000bababa, 0x7a7a0000007a7a7a, 0xb3b3000000b3b3b3,
-       0x0202000000020202, 0xb4b4000000b4b4b4, 0xadad000000adadad,
-       0xa2a2000000a2a2a2, 0xacac000000acacac, 0xd8d8000000d8d8d8,
-       0x9a9a0000009a9a9a, 0x1717000000171717, 0x1a1a0000001a1a1a,
-       0x3535000000353535, 0xcccc000000cccccc, 0xf7f7000000f7f7f7,
-       0x9999000000999999, 0x6161000000616161, 0x5a5a0000005a5a5a,
-       0xe8e8000000e8e8e8, 0x2424000000242424, 0x5656000000565656,
-       0x4040000000404040, 0xe1e1000000e1e1e1, 0x6363000000636363,
-       0x0909000000090909, 0x3333000000333333, 0xbfbf000000bfbfbf,
-       0x9898000000989898, 0x9797000000979797, 0x8585000000858585,
-       0x6868000000686868, 0xfcfc000000fcfcfc, 0xecec000000ececec,
-       0x0a0a0000000a0a0a, 0xdada000000dadada, 0x6f6f0000006f6f6f,
-       0x5353000000535353, 0x6262000000626262, 0xa3a3000000a3a3a3,
-       0x2e2e0000002e2e2e, 0x0808000000080808, 0xafaf000000afafaf,
-       0x2828000000282828, 0xb0b0000000b0b0b0, 0x7474000000747474,
-       0xc2c2000000c2c2c2, 0xbdbd000000bdbdbd, 0x3636000000363636,
-       0x2222000000222222, 0x3838000000383838, 0x6464000000646464,
-       0x1e1e0000001e1e1e, 0x3939000000393939, 0x2c2c0000002c2c2c,
-       0xa6a6000000a6a6a6, 0x3030000000303030, 0xe5e5000000e5e5e5,
-       0x4444000000444444, 0xfdfd000000fdfdfd, 0x8888000000888888,
-       0x9f9f0000009f9f9f, 0x6565000000656565, 0x8787000000878787,
-       0x6b6b0000006b6b6b, 0xf4f4000000f4f4f4, 0x2323000000232323,
-       0x4848000000484848, 0x1010000000101010, 0xd1d1000000d1d1d1,
-       0x5151000000515151, 0xc0c0000000c0c0c0, 0xf9f9000000f9f9f9,
-       0xd2d2000000d2d2d2, 0xa0a0000000a0a0a0, 0x5555000000555555,
-       0xa1a1000000a1a1a1, 0x4141000000414141, 0xfafa000000fafafa,
-       0x4343000000434343, 0x1313000000131313, 0xc4c4000000c4c4c4,
-       0x2f2f0000002f2f2f, 0xa8a8000000a8a8a8, 0xb6b6000000b6b6b6,
-       0x3c3c0000003c3c3c, 0x2b2b0000002b2b2b, 0xc1c1000000c1c1c1,
-       0xffff000000ffffff, 0xc8c8000000c8c8c8, 0xa5a5000000a5a5a5,
-       0x2020000000202020, 0x8989000000898989, 0x0000000000000000,
-       0x9090000000909090, 0x4747000000474747, 0xefef000000efefef,
-       0xeaea000000eaeaea, 0xb7b7000000b7b7b7, 0x1515000000151515,
-       0x0606000000060606, 0xcdcd000000cdcdcd, 0xb5b5000000b5b5b5,
-       0x1212000000121212, 0x7e7e0000007e7e7e, 0xbbbb000000bbbbbb,
-       0x2929000000292929, 0x0f0f0000000f0f0f, 0xb8b8000000b8b8b8,
-       0x0707000000070707, 0x0404000000040404, 0x9b9b0000009b9b9b,
-       0x9494000000949494, 0x2121000000212121, 0x6666000000666666,
-       0xe6e6000000e6e6e6, 0xcece000000cecece, 0xeded000000ededed,
-       0xe7e7000000e7e7e7, 0x3b3b0000003b3b3b, 0xfefe000000fefefe,
-       0x7f7f0000007f7f7f, 0xc5c5000000c5c5c5, 0xa4a4000000a4a4a4,
-       0x3737000000373737, 0xb1b1000000b1b1b1, 0x4c4c0000004c4c4c,
-       0x9191000000919191, 0x6e6e0000006e6e6e, 0x8d8d0000008d8d8d,
-       0x7676000000767676, 0x0303000000030303, 0x2d2d0000002d2d2d,
-       0xdede000000dedede, 0x9696000000969696, 0x2626000000262626,
-       0x7d7d0000007d7d7d, 0xc6c6000000c6c6c6, 0x5c5c0000005c5c5c,
-       0xd3d3000000d3d3d3, 0xf2f2000000f2f2f2, 0x4f4f0000004f4f4f,
-       0x1919000000191919, 0x3f3f0000003f3f3f, 0xdcdc000000dcdcdc,
-       0x7979000000797979, 0x1d1d0000001d1d1d, 0x5252000000525252,
-       0xebeb000000ebebeb, 0xf3f3000000f3f3f3, 0x6d6d0000006d6d6d,
-       0x5e5e0000005e5e5e, 0xfbfb000000fbfbfb, 0x6969000000696969,
-       0xb2b2000000b2b2b2, 0xf0f0000000f0f0f0, 0x3131000000313131,
-       0x0c0c0000000c0c0c, 0xd4d4000000d4d4d4, 0xcfcf000000cfcfcf,
-       0x8c8c0000008c8c8c, 0xe2e2000000e2e2e2, 0x7575000000757575,
-       0xa9a9000000a9a9a9, 0x4a4a0000004a4a4a, 0x5757000000575757,
-       0x8484000000848484, 0x1111000000111111, 0x4545000000454545,
-       0x1b1b0000001b1b1b, 0xf5f5000000f5f5f5, 0xe4e4000000e4e4e4,
-       0x0e0e0000000e0e0e, 0x7373000000737373, 0xaaaa000000aaaaaa,
-       0xf1f1000000f1f1f1, 0xdddd000000dddddd, 0x5959000000595959,
-       0x1414000000141414, 0x6c6c0000006c6c6c, 0x9292000000929292,
-       0x5454000000545454, 0xd0d0000000d0d0d0, 0x7878000000787878,
-       0x7070000000707070, 0xe3e3000000e3e3e3, 0x4949000000494949,
-       0x8080000000808080, 0x5050000000505050, 0xa7a7000000a7a7a7,
-       0xf6f6000000f6f6f6, 0x7777000000777777, 0x9393000000939393,
-       0x8686000000868686, 0x8383000000838383, 0x2a2a0000002a2a2a,
-       0xc7c7000000c7c7c7, 0x5b5b0000005b5b5b, 0xe9e9000000e9e9e9,
-       0xeeee000000eeeeee, 0x8f8f0000008f8f8f, 0x0101000000010101,
-       0x3d3d0000003d3d3d,
+       0xe0e0000000e0e0e0ULL, 0x0505000000050505ULL, 0x5858000000585858ULL,
+       0xd9d9000000d9d9d9ULL, 0x6767000000676767ULL, 0x4e4e0000004e4e4eULL,
+       0x8181000000818181ULL, 0xcbcb000000cbcbcbULL, 0xc9c9000000c9c9c9ULL,
+       0x0b0b0000000b0b0bULL, 0xaeae000000aeaeaeULL, 0x6a6a0000006a6a6aULL,
+       0xd5d5000000d5d5d5ULL, 0x1818000000181818ULL, 0x5d5d0000005d5d5dULL,
+       0x8282000000828282ULL, 0x4646000000464646ULL, 0xdfdf000000dfdfdfULL,
+       0xd6d6000000d6d6d6ULL, 0x2727000000272727ULL, 0x8a8a0000008a8a8aULL,
+       0x3232000000323232ULL, 0x4b4b0000004b4b4bULL, 0x4242000000424242ULL,
+       0xdbdb000000dbdbdbULL, 0x1c1c0000001c1c1cULL, 0x9e9e0000009e9e9eULL,
+       0x9c9c0000009c9c9cULL, 0x3a3a0000003a3a3aULL, 0xcaca000000cacacaULL,
+       0x2525000000252525ULL, 0x7b7b0000007b7b7bULL, 0x0d0d0000000d0d0dULL,
+       0x7171000000717171ULL, 0x5f5f0000005f5f5fULL, 0x1f1f0000001f1f1fULL,
+       0xf8f8000000f8f8f8ULL, 0xd7d7000000d7d7d7ULL, 0x3e3e0000003e3e3eULL,
+       0x9d9d0000009d9d9dULL, 0x7c7c0000007c7c7cULL, 0x6060000000606060ULL,
+       0xb9b9000000b9b9b9ULL, 0xbebe000000bebebeULL, 0xbcbc000000bcbcbcULL,
+       0x8b8b0000008b8b8bULL, 0x1616000000161616ULL, 0x3434000000343434ULL,
+       0x4d4d0000004d4d4dULL, 0xc3c3000000c3c3c3ULL, 0x7272000000727272ULL,
+       0x9595000000959595ULL, 0xabab000000abababULL, 0x8e8e0000008e8e8eULL,
+       0xbaba000000bababaULL, 0x7a7a0000007a7a7aULL, 0xb3b3000000b3b3b3ULL,
+       0x0202000000020202ULL, 0xb4b4000000b4b4b4ULL, 0xadad000000adadadULL,
+       0xa2a2000000a2a2a2ULL, 0xacac000000acacacULL, 0xd8d8000000d8d8d8ULL,
+       0x9a9a0000009a9a9aULL, 0x1717000000171717ULL, 0x1a1a0000001a1a1aULL,
+       0x3535000000353535ULL, 0xcccc000000ccccccULL, 0xf7f7000000f7f7f7ULL,
+       0x9999000000999999ULL, 0x6161000000616161ULL, 0x5a5a0000005a5a5aULL,
+       0xe8e8000000e8e8e8ULL, 0x2424000000242424ULL, 0x5656000000565656ULL,
+       0x4040000000404040ULL, 0xe1e1000000e1e1e1ULL, 0x6363000000636363ULL,
+       0x0909000000090909ULL, 0x3333000000333333ULL, 0xbfbf000000bfbfbfULL,
+       0x9898000000989898ULL, 0x9797000000979797ULL, 0x8585000000858585ULL,
+       0x6868000000686868ULL, 0xfcfc000000fcfcfcULL, 0xecec000000ecececULL,
+       0x0a0a0000000a0a0aULL, 0xdada000000dadadaULL, 0x6f6f0000006f6f6fULL,
+       0x5353000000535353ULL, 0x6262000000626262ULL, 0xa3a3000000a3a3a3ULL,
+       0x2e2e0000002e2e2eULL, 0x0808000000080808ULL, 0xafaf000000afafafULL,
+       0x2828000000282828ULL, 0xb0b0000000b0b0b0ULL, 0x7474000000747474ULL,
+       0xc2c2000000c2c2c2ULL, 0xbdbd000000bdbdbdULL, 0x3636000000363636ULL,
+       0x2222000000222222ULL, 0x3838000000383838ULL, 0x6464000000646464ULL,
+       0x1e1e0000001e1e1eULL, 0x3939000000393939ULL, 0x2c2c0000002c2c2cULL,
+       0xa6a6000000a6a6a6ULL, 0x3030000000303030ULL, 0xe5e5000000e5e5e5ULL,
+       0x4444000000444444ULL, 0xfdfd000000fdfdfdULL, 0x8888000000888888ULL,
+       0x9f9f0000009f9f9fULL, 0x6565000000656565ULL, 0x8787000000878787ULL,
+       0x6b6b0000006b6b6bULL, 0xf4f4000000f4f4f4ULL, 0x2323000000232323ULL,
+       0x4848000000484848ULL, 0x1010000000101010ULL, 0xd1d1000000d1d1d1ULL,
+       0x5151000000515151ULL, 0xc0c0000000c0c0c0ULL, 0xf9f9000000f9f9f9ULL,
+       0xd2d2000000d2d2d2ULL, 0xa0a0000000a0a0a0ULL, 0x5555000000555555ULL,
+       0xa1a1000000a1a1a1ULL, 0x4141000000414141ULL, 0xfafa000000fafafaULL,
+       0x4343000000434343ULL, 0x1313000000131313ULL, 0xc4c4000000c4c4c4ULL,
+       0x2f2f0000002f2f2fULL, 0xa8a8000000a8a8a8ULL, 0xb6b6000000b6b6b6ULL,
+       0x3c3c0000003c3c3cULL, 0x2b2b0000002b2b2bULL, 0xc1c1000000c1c1c1ULL,
+       0xffff000000ffffffULL, 0xc8c8000000c8c8c8ULL, 0xa5a5000000a5a5a5ULL,
+       0x2020000000202020ULL, 0x8989000000898989ULL, 0x0000000000000000ULL,
+       0x9090000000909090ULL, 0x4747000000474747ULL, 0xefef000000efefefULL,
+       0xeaea000000eaeaeaULL, 0xb7b7000000b7b7b7ULL, 0x1515000000151515ULL,
+       0x0606000000060606ULL, 0xcdcd000000cdcdcdULL, 0xb5b5000000b5b5b5ULL,
+       0x1212000000121212ULL, 0x7e7e0000007e7e7eULL, 0xbbbb000000bbbbbbULL,
+       0x2929000000292929ULL, 0x0f0f0000000f0f0fULL, 0xb8b8000000b8b8b8ULL,
+       0x0707000000070707ULL, 0x0404000000040404ULL, 0x9b9b0000009b9b9bULL,
+       0x9494000000949494ULL, 0x2121000000212121ULL, 0x6666000000666666ULL,
+       0xe6e6000000e6e6e6ULL, 0xcece000000cececeULL, 0xeded000000edededULL,
+       0xe7e7000000e7e7e7ULL, 0x3b3b0000003b3b3bULL, 0xfefe000000fefefeULL,
+       0x7f7f0000007f7f7fULL, 0xc5c5000000c5c5c5ULL, 0xa4a4000000a4a4a4ULL,
+       0x3737000000373737ULL, 0xb1b1000000b1b1b1ULL, 0x4c4c0000004c4c4cULL,
+       0x9191000000919191ULL, 0x6e6e0000006e6e6eULL, 0x8d8d0000008d8d8dULL,
+       0x7676000000767676ULL, 0x0303000000030303ULL, 0x2d2d0000002d2d2dULL,
+       0xdede000000dededeULL, 0x9696000000969696ULL, 0x2626000000262626ULL,
+       0x7d7d0000007d7d7dULL, 0xc6c6000000c6c6c6ULL, 0x5c5c0000005c5c5cULL,
+       0xd3d3000000d3d3d3ULL, 0xf2f2000000f2f2f2ULL, 0x4f4f0000004f4f4fULL,
+       0x1919000000191919ULL, 0x3f3f0000003f3f3fULL, 0xdcdc000000dcdcdcULL,
+       0x7979000000797979ULL, 0x1d1d0000001d1d1dULL, 0x5252000000525252ULL,
+       0xebeb000000ebebebULL, 0xf3f3000000f3f3f3ULL, 0x6d6d0000006d6d6dULL,
+       0x5e5e0000005e5e5eULL, 0xfbfb000000fbfbfbULL, 0x6969000000696969ULL,
+       0xb2b2000000b2b2b2ULL, 0xf0f0000000f0f0f0ULL, 0x3131000000313131ULL,
+       0x0c0c0000000c0c0cULL, 0xd4d4000000d4d4d4ULL, 0xcfcf000000cfcfcfULL,
+       0x8c8c0000008c8c8cULL, 0xe2e2000000e2e2e2ULL, 0x7575000000757575ULL,
+       0xa9a9000000a9a9a9ULL, 0x4a4a0000004a4a4aULL, 0x5757000000575757ULL,
+       0x8484000000848484ULL, 0x1111000000111111ULL, 0x4545000000454545ULL,
+       0x1b1b0000001b1b1bULL, 0xf5f5000000f5f5f5ULL, 0xe4e4000000e4e4e4ULL,
+       0x0e0e0000000e0e0eULL, 0x7373000000737373ULL, 0xaaaa000000aaaaaaULL,
+       0xf1f1000000f1f1f1ULL, 0xdddd000000ddddddULL, 0x5959000000595959ULL,
+       0x1414000000141414ULL, 0x6c6c0000006c6c6cULL, 0x9292000000929292ULL,
+       0x5454000000545454ULL, 0xd0d0000000d0d0d0ULL, 0x7878000000787878ULL,
+       0x7070000000707070ULL, 0xe3e3000000e3e3e3ULL, 0x4949000000494949ULL,
+       0x8080000000808080ULL, 0x5050000000505050ULL, 0xa7a7000000a7a7a7ULL,
+       0xf6f6000000f6f6f6ULL, 0x7777000000777777ULL, 0x9393000000939393ULL,
+       0x8686000000868686ULL, 0x8383000000838383ULL, 0x2a2a0000002a2a2aULL,
+       0xc7c7000000c7c7c7ULL, 0x5b5b0000005b5b5bULL, 0xe9e9000000e9e9e9ULL,
+       0xeeee000000eeeeeeULL, 0x8f8f0000008f8f8fULL, 0x0101000000010101ULL,
+       0x3d3d0000003d3d3dULL,
 };
 
 const u64 camellia_sp03303033[256] = {
-       0x0038380038003838, 0x0041410041004141, 0x0016160016001616,
-       0x0076760076007676, 0x00d9d900d900d9d9, 0x0093930093009393,
-       0x0060600060006060, 0x00f2f200f200f2f2, 0x0072720072007272,
-       0x00c2c200c200c2c2, 0x00abab00ab00abab, 0x009a9a009a009a9a,
-       0x0075750075007575, 0x0006060006000606, 0x0057570057005757,
-       0x00a0a000a000a0a0, 0x0091910091009191, 0x00f7f700f700f7f7,
-       0x00b5b500b500b5b5, 0x00c9c900c900c9c9, 0x00a2a200a200a2a2,
-       0x008c8c008c008c8c, 0x00d2d200d200d2d2, 0x0090900090009090,
-       0x00f6f600f600f6f6, 0x0007070007000707, 0x00a7a700a700a7a7,
-       0x0027270027002727, 0x008e8e008e008e8e, 0x00b2b200b200b2b2,
-       0x0049490049004949, 0x00dede00de00dede, 0x0043430043004343,
-       0x005c5c005c005c5c, 0x00d7d700d700d7d7, 0x00c7c700c700c7c7,
-       0x003e3e003e003e3e, 0x00f5f500f500f5f5, 0x008f8f008f008f8f,
-       0x0067670067006767, 0x001f1f001f001f1f, 0x0018180018001818,
-       0x006e6e006e006e6e, 0x00afaf00af00afaf, 0x002f2f002f002f2f,
-       0x00e2e200e200e2e2, 0x0085850085008585, 0x000d0d000d000d0d,
-       0x0053530053005353, 0x00f0f000f000f0f0, 0x009c9c009c009c9c,
-       0x0065650065006565, 0x00eaea00ea00eaea, 0x00a3a300a300a3a3,
-       0x00aeae00ae00aeae, 0x009e9e009e009e9e, 0x00ecec00ec00ecec,
-       0x0080800080008080, 0x002d2d002d002d2d, 0x006b6b006b006b6b,
-       0x00a8a800a800a8a8, 0x002b2b002b002b2b, 0x0036360036003636,
-       0x00a6a600a600a6a6, 0x00c5c500c500c5c5, 0x0086860086008686,
-       0x004d4d004d004d4d, 0x0033330033003333, 0x00fdfd00fd00fdfd,
-       0x0066660066006666, 0x0058580058005858, 0x0096960096009696,
-       0x003a3a003a003a3a, 0x0009090009000909, 0x0095950095009595,
-       0x0010100010001010, 0x0078780078007878, 0x00d8d800d800d8d8,
-       0x0042420042004242, 0x00cccc00cc00cccc, 0x00efef00ef00efef,
-       0x0026260026002626, 0x00e5e500e500e5e5, 0x0061610061006161,
-       0x001a1a001a001a1a, 0x003f3f003f003f3f, 0x003b3b003b003b3b,
-       0x0082820082008282, 0x00b6b600b600b6b6, 0x00dbdb00db00dbdb,
-       0x00d4d400d400d4d4, 0x0098980098009898, 0x00e8e800e800e8e8,
-       0x008b8b008b008b8b, 0x0002020002000202, 0x00ebeb00eb00ebeb,
-       0x000a0a000a000a0a, 0x002c2c002c002c2c, 0x001d1d001d001d1d,
-       0x00b0b000b000b0b0, 0x006f6f006f006f6f, 0x008d8d008d008d8d,
-       0x0088880088008888, 0x000e0e000e000e0e, 0x0019190019001919,
-       0x0087870087008787, 0x004e4e004e004e4e, 0x000b0b000b000b0b,
-       0x00a9a900a900a9a9, 0x000c0c000c000c0c, 0x0079790079007979,
-       0x0011110011001111, 0x007f7f007f007f7f, 0x0022220022002222,
-       0x00e7e700e700e7e7, 0x0059590059005959, 0x00e1e100e100e1e1,
-       0x00dada00da00dada, 0x003d3d003d003d3d, 0x00c8c800c800c8c8,
-       0x0012120012001212, 0x0004040004000404, 0x0074740074007474,
-       0x0054540054005454, 0x0030300030003030, 0x007e7e007e007e7e,
-       0x00b4b400b400b4b4, 0x0028280028002828, 0x0055550055005555,
-       0x0068680068006868, 0x0050500050005050, 0x00bebe00be00bebe,
-       0x00d0d000d000d0d0, 0x00c4c400c400c4c4, 0x0031310031003131,
-       0x00cbcb00cb00cbcb, 0x002a2a002a002a2a, 0x00adad00ad00adad,
-       0x000f0f000f000f0f, 0x00caca00ca00caca, 0x0070700070007070,
-       0x00ffff00ff00ffff, 0x0032320032003232, 0x0069690069006969,
-       0x0008080008000808, 0x0062620062006262, 0x0000000000000000,
-       0x0024240024002424, 0x00d1d100d100d1d1, 0x00fbfb00fb00fbfb,
-       0x00baba00ba00baba, 0x00eded00ed00eded, 0x0045450045004545,
-       0x0081810081008181, 0x0073730073007373, 0x006d6d006d006d6d,
-       0x0084840084008484, 0x009f9f009f009f9f, 0x00eeee00ee00eeee,
-       0x004a4a004a004a4a, 0x00c3c300c300c3c3, 0x002e2e002e002e2e,
-       0x00c1c100c100c1c1, 0x0001010001000101, 0x00e6e600e600e6e6,
-       0x0025250025002525, 0x0048480048004848, 0x0099990099009999,
-       0x00b9b900b900b9b9, 0x00b3b300b300b3b3, 0x007b7b007b007b7b,
-       0x00f9f900f900f9f9, 0x00cece00ce00cece, 0x00bfbf00bf00bfbf,
-       0x00dfdf00df00dfdf, 0x0071710071007171, 0x0029290029002929,
-       0x00cdcd00cd00cdcd, 0x006c6c006c006c6c, 0x0013130013001313,
-       0x0064640064006464, 0x009b9b009b009b9b, 0x0063630063006363,
-       0x009d9d009d009d9d, 0x00c0c000c000c0c0, 0x004b4b004b004b4b,
-       0x00b7b700b700b7b7, 0x00a5a500a500a5a5, 0x0089890089008989,
-       0x005f5f005f005f5f, 0x00b1b100b100b1b1, 0x0017170017001717,
-       0x00f4f400f400f4f4, 0x00bcbc00bc00bcbc, 0x00d3d300d300d3d3,
-       0x0046460046004646, 0x00cfcf00cf00cfcf, 0x0037370037003737,
-       0x005e5e005e005e5e, 0x0047470047004747, 0x0094940094009494,
-       0x00fafa00fa00fafa, 0x00fcfc00fc00fcfc, 0x005b5b005b005b5b,
-       0x0097970097009797, 0x00fefe00fe00fefe, 0x005a5a005a005a5a,
-       0x00acac00ac00acac, 0x003c3c003c003c3c, 0x004c4c004c004c4c,
-       0x0003030003000303, 0x0035350035003535, 0x00f3f300f300f3f3,
-       0x0023230023002323, 0x00b8b800b800b8b8, 0x005d5d005d005d5d,
-       0x006a6a006a006a6a, 0x0092920092009292, 0x00d5d500d500d5d5,
-       0x0021210021002121, 0x0044440044004444, 0x0051510051005151,
-       0x00c6c600c600c6c6, 0x007d7d007d007d7d, 0x0039390039003939,
-       0x0083830083008383, 0x00dcdc00dc00dcdc, 0x00aaaa00aa00aaaa,
-       0x007c7c007c007c7c, 0x0077770077007777, 0x0056560056005656,
-       0x0005050005000505, 0x001b1b001b001b1b, 0x00a4a400a400a4a4,
-       0x0015150015001515, 0x0034340034003434, 0x001e1e001e001e1e,
-       0x001c1c001c001c1c, 0x00f8f800f800f8f8, 0x0052520052005252,
-       0x0020200020002020, 0x0014140014001414, 0x00e9e900e900e9e9,
-       0x00bdbd00bd00bdbd, 0x00dddd00dd00dddd, 0x00e4e400e400e4e4,
-       0x00a1a100a100a1a1, 0x00e0e000e000e0e0, 0x008a8a008a008a8a,
-       0x00f1f100f100f1f1, 0x00d6d600d600d6d6, 0x007a7a007a007a7a,
-       0x00bbbb00bb00bbbb, 0x00e3e300e300e3e3, 0x0040400040004040,
-       0x004f4f004f004f4f,
+       0x0038380038003838ULL, 0x0041410041004141ULL, 0x0016160016001616ULL,
+       0x0076760076007676ULL, 0x00d9d900d900d9d9ULL, 0x0093930093009393ULL,
+       0x0060600060006060ULL, 0x00f2f200f200f2f2ULL, 0x0072720072007272ULL,
+       0x00c2c200c200c2c2ULL, 0x00abab00ab00ababULL, 0x009a9a009a009a9aULL,
+       0x0075750075007575ULL, 0x0006060006000606ULL, 0x0057570057005757ULL,
+       0x00a0a000a000a0a0ULL, 0x0091910091009191ULL, 0x00f7f700f700f7f7ULL,
+       0x00b5b500b500b5b5ULL, 0x00c9c900c900c9c9ULL, 0x00a2a200a200a2a2ULL,
+       0x008c8c008c008c8cULL, 0x00d2d200d200d2d2ULL, 0x0090900090009090ULL,
+       0x00f6f600f600f6f6ULL, 0x0007070007000707ULL, 0x00a7a700a700a7a7ULL,
+       0x0027270027002727ULL, 0x008e8e008e008e8eULL, 0x00b2b200b200b2b2ULL,
+       0x0049490049004949ULL, 0x00dede00de00dedeULL, 0x0043430043004343ULL,
+       0x005c5c005c005c5cULL, 0x00d7d700d700d7d7ULL, 0x00c7c700c700c7c7ULL,
+       0x003e3e003e003e3eULL, 0x00f5f500f500f5f5ULL, 0x008f8f008f008f8fULL,
+       0x0067670067006767ULL, 0x001f1f001f001f1fULL, 0x0018180018001818ULL,
+       0x006e6e006e006e6eULL, 0x00afaf00af00afafULL, 0x002f2f002f002f2fULL,
+       0x00e2e200e200e2e2ULL, 0x0085850085008585ULL, 0x000d0d000d000d0dULL,
+       0x0053530053005353ULL, 0x00f0f000f000f0f0ULL, 0x009c9c009c009c9cULL,
+       0x0065650065006565ULL, 0x00eaea00ea00eaeaULL, 0x00a3a300a300a3a3ULL,
+       0x00aeae00ae00aeaeULL, 0x009e9e009e009e9eULL, 0x00ecec00ec00ececULL,
+       0x0080800080008080ULL, 0x002d2d002d002d2dULL, 0x006b6b006b006b6bULL,
+       0x00a8a800a800a8a8ULL, 0x002b2b002b002b2bULL, 0x0036360036003636ULL,
+       0x00a6a600a600a6a6ULL, 0x00c5c500c500c5c5ULL, 0x0086860086008686ULL,
+       0x004d4d004d004d4dULL, 0x0033330033003333ULL, 0x00fdfd00fd00fdfdULL,
+       0x0066660066006666ULL, 0x0058580058005858ULL, 0x0096960096009696ULL,
+       0x003a3a003a003a3aULL, 0x0009090009000909ULL, 0x0095950095009595ULL,
+       0x0010100010001010ULL, 0x0078780078007878ULL, 0x00d8d800d800d8d8ULL,
+       0x0042420042004242ULL, 0x00cccc00cc00ccccULL, 0x00efef00ef00efefULL,
+       0x0026260026002626ULL, 0x00e5e500e500e5e5ULL, 0x0061610061006161ULL,
+       0x001a1a001a001a1aULL, 0x003f3f003f003f3fULL, 0x003b3b003b003b3bULL,
+       0x0082820082008282ULL, 0x00b6b600b600b6b6ULL, 0x00dbdb00db00dbdbULL,
+       0x00d4d400d400d4d4ULL, 0x0098980098009898ULL, 0x00e8e800e800e8e8ULL,
+       0x008b8b008b008b8bULL, 0x0002020002000202ULL, 0x00ebeb00eb00ebebULL,
+       0x000a0a000a000a0aULL, 0x002c2c002c002c2cULL, 0x001d1d001d001d1dULL,
+       0x00b0b000b000b0b0ULL, 0x006f6f006f006f6fULL, 0x008d8d008d008d8dULL,
+       0x0088880088008888ULL, 0x000e0e000e000e0eULL, 0x0019190019001919ULL,
+       0x0087870087008787ULL, 0x004e4e004e004e4eULL, 0x000b0b000b000b0bULL,
+       0x00a9a900a900a9a9ULL, 0x000c0c000c000c0cULL, 0x0079790079007979ULL,
+       0x0011110011001111ULL, 0x007f7f007f007f7fULL, 0x0022220022002222ULL,
+       0x00e7e700e700e7e7ULL, 0x0059590059005959ULL, 0x00e1e100e100e1e1ULL,
+       0x00dada00da00dadaULL, 0x003d3d003d003d3dULL, 0x00c8c800c800c8c8ULL,
+       0x0012120012001212ULL, 0x0004040004000404ULL, 0x0074740074007474ULL,
+       0x0054540054005454ULL, 0x0030300030003030ULL, 0x007e7e007e007e7eULL,
+       0x00b4b400b400b4b4ULL, 0x0028280028002828ULL, 0x0055550055005555ULL,
+       0x0068680068006868ULL, 0x0050500050005050ULL, 0x00bebe00be00bebeULL,
+       0x00d0d000d000d0d0ULL, 0x00c4c400c400c4c4ULL, 0x0031310031003131ULL,
+       0x00cbcb00cb00cbcbULL, 0x002a2a002a002a2aULL, 0x00adad00ad00adadULL,
+       0x000f0f000f000f0fULL, 0x00caca00ca00cacaULL, 0x0070700070007070ULL,
+       0x00ffff00ff00ffffULL, 0x0032320032003232ULL, 0x0069690069006969ULL,
+       0x0008080008000808ULL, 0x0062620062006262ULL, 0x0000000000000000ULL,
+       0x0024240024002424ULL, 0x00d1d100d100d1d1ULL, 0x00fbfb00fb00fbfbULL,
+       0x00baba00ba00babaULL, 0x00eded00ed00ededULL, 0x0045450045004545ULL,
+       0x0081810081008181ULL, 0x0073730073007373ULL, 0x006d6d006d006d6dULL,
+       0x0084840084008484ULL, 0x009f9f009f009f9fULL, 0x00eeee00ee00eeeeULL,
+       0x004a4a004a004a4aULL, 0x00c3c300c300c3c3ULL, 0x002e2e002e002e2eULL,
+       0x00c1c100c100c1c1ULL, 0x0001010001000101ULL, 0x00e6e600e600e6e6ULL,
+       0x0025250025002525ULL, 0x0048480048004848ULL, 0x0099990099009999ULL,
+       0x00b9b900b900b9b9ULL, 0x00b3b300b300b3b3ULL, 0x007b7b007b007b7bULL,
+       0x00f9f900f900f9f9ULL, 0x00cece00ce00ceceULL, 0x00bfbf00bf00bfbfULL,
+       0x00dfdf00df00dfdfULL, 0x0071710071007171ULL, 0x0029290029002929ULL,
+       0x00cdcd00cd00cdcdULL, 0x006c6c006c006c6cULL, 0x0013130013001313ULL,
+       0x0064640064006464ULL, 0x009b9b009b009b9bULL, 0x0063630063006363ULL,
+       0x009d9d009d009d9dULL, 0x00c0c000c000c0c0ULL, 0x004b4b004b004b4bULL,
+       0x00b7b700b700b7b7ULL, 0x00a5a500a500a5a5ULL, 0x0089890089008989ULL,
+       0x005f5f005f005f5fULL, 0x00b1b100b100b1b1ULL, 0x0017170017001717ULL,
+       0x00f4f400f400f4f4ULL, 0x00bcbc00bc00bcbcULL, 0x00d3d300d300d3d3ULL,
+       0x0046460046004646ULL, 0x00cfcf00cf00cfcfULL, 0x0037370037003737ULL,
+       0x005e5e005e005e5eULL, 0x0047470047004747ULL, 0x0094940094009494ULL,
+       0x00fafa00fa00fafaULL, 0x00fcfc00fc00fcfcULL, 0x005b5b005b005b5bULL,
+       0x0097970097009797ULL, 0x00fefe00fe00fefeULL, 0x005a5a005a005a5aULL,
+       0x00acac00ac00acacULL, 0x003c3c003c003c3cULL, 0x004c4c004c004c4cULL,
+       0x0003030003000303ULL, 0x0035350035003535ULL, 0x00f3f300f300f3f3ULL,
+       0x0023230023002323ULL, 0x00b8b800b800b8b8ULL, 0x005d5d005d005d5dULL,
+       0x006a6a006a006a6aULL, 0x0092920092009292ULL, 0x00d5d500d500d5d5ULL,
+       0x0021210021002121ULL, 0x0044440044004444ULL, 0x0051510051005151ULL,
+       0x00c6c600c600c6c6ULL, 0x007d7d007d007d7dULL, 0x0039390039003939ULL,
+       0x0083830083008383ULL, 0x00dcdc00dc00dcdcULL, 0x00aaaa00aa00aaaaULL,
+       0x007c7c007c007c7cULL, 0x0077770077007777ULL, 0x0056560056005656ULL,
+       0x0005050005000505ULL, 0x001b1b001b001b1bULL, 0x00a4a400a400a4a4ULL,
+       0x0015150015001515ULL, 0x0034340034003434ULL, 0x001e1e001e001e1eULL,
+       0x001c1c001c001c1cULL, 0x00f8f800f800f8f8ULL, 0x0052520052005252ULL,
+       0x0020200020002020ULL, 0x0014140014001414ULL, 0x00e9e900e900e9e9ULL,
+       0x00bdbd00bd00bdbdULL, 0x00dddd00dd00ddddULL, 0x00e4e400e400e4e4ULL,
+       0x00a1a100a100a1a1ULL, 0x00e0e000e000e0e0ULL, 0x008a8a008a008a8aULL,
+       0x00f1f100f100f1f1ULL, 0x00d6d600d600d6d6ULL, 0x007a7a007a007a7aULL,
+       0x00bbbb00bb00bbbbULL, 0x00e3e300e300e3e3ULL, 0x0040400040004040ULL,
+       0x004f4f004f004f4fULL,
 };
 
 const u64 camellia_sp00444404[256] = {
-       0x0000707070700070, 0x00002c2c2c2c002c, 0x0000b3b3b3b300b3,
-       0x0000c0c0c0c000c0, 0x0000e4e4e4e400e4, 0x0000575757570057,
-       0x0000eaeaeaea00ea, 0x0000aeaeaeae00ae, 0x0000232323230023,
-       0x00006b6b6b6b006b, 0x0000454545450045, 0x0000a5a5a5a500a5,
-       0x0000edededed00ed, 0x00004f4f4f4f004f, 0x00001d1d1d1d001d,
-       0x0000929292920092, 0x0000868686860086, 0x0000afafafaf00af,
-       0x00007c7c7c7c007c, 0x00001f1f1f1f001f, 0x00003e3e3e3e003e,
-       0x0000dcdcdcdc00dc, 0x00005e5e5e5e005e, 0x00000b0b0b0b000b,
-       0x0000a6a6a6a600a6, 0x0000393939390039, 0x0000d5d5d5d500d5,
-       0x00005d5d5d5d005d, 0x0000d9d9d9d900d9, 0x00005a5a5a5a005a,
-       0x0000515151510051, 0x00006c6c6c6c006c, 0x00008b8b8b8b008b,
-       0x00009a9a9a9a009a, 0x0000fbfbfbfb00fb, 0x0000b0b0b0b000b0,
-       0x0000747474740074, 0x00002b2b2b2b002b, 0x0000f0f0f0f000f0,
-       0x0000848484840084, 0x0000dfdfdfdf00df, 0x0000cbcbcbcb00cb,
-       0x0000343434340034, 0x0000767676760076, 0x00006d6d6d6d006d,
-       0x0000a9a9a9a900a9, 0x0000d1d1d1d100d1, 0x0000040404040004,
-       0x0000141414140014, 0x00003a3a3a3a003a, 0x0000dededede00de,
-       0x0000111111110011, 0x0000323232320032, 0x00009c9c9c9c009c,
-       0x0000535353530053, 0x0000f2f2f2f200f2, 0x0000fefefefe00fe,
-       0x0000cfcfcfcf00cf, 0x0000c3c3c3c300c3, 0x00007a7a7a7a007a,
-       0x0000242424240024, 0x0000e8e8e8e800e8, 0x0000606060600060,
-       0x0000696969690069, 0x0000aaaaaaaa00aa, 0x0000a0a0a0a000a0,
-       0x0000a1a1a1a100a1, 0x0000626262620062, 0x0000545454540054,
-       0x00001e1e1e1e001e, 0x0000e0e0e0e000e0, 0x0000646464640064,
-       0x0000101010100010, 0x0000000000000000, 0x0000a3a3a3a300a3,
-       0x0000757575750075, 0x00008a8a8a8a008a, 0x0000e6e6e6e600e6,
-       0x0000090909090009, 0x0000dddddddd00dd, 0x0000878787870087,
-       0x0000838383830083, 0x0000cdcdcdcd00cd, 0x0000909090900090,
-       0x0000737373730073, 0x0000f6f6f6f600f6, 0x00009d9d9d9d009d,
-       0x0000bfbfbfbf00bf, 0x0000525252520052, 0x0000d8d8d8d800d8,
-       0x0000c8c8c8c800c8, 0x0000c6c6c6c600c6, 0x0000818181810081,
-       0x00006f6f6f6f006f, 0x0000131313130013, 0x0000636363630063,
-       0x0000e9e9e9e900e9, 0x0000a7a7a7a700a7, 0x00009f9f9f9f009f,
-       0x0000bcbcbcbc00bc, 0x0000292929290029, 0x0000f9f9f9f900f9,
-       0x00002f2f2f2f002f, 0x0000b4b4b4b400b4, 0x0000787878780078,
-       0x0000060606060006, 0x0000e7e7e7e700e7, 0x0000717171710071,
-       0x0000d4d4d4d400d4, 0x0000abababab00ab, 0x0000888888880088,
-       0x00008d8d8d8d008d, 0x0000727272720072, 0x0000b9b9b9b900b9,
-       0x0000f8f8f8f800f8, 0x0000acacacac00ac, 0x0000363636360036,
-       0x00002a2a2a2a002a, 0x00003c3c3c3c003c, 0x0000f1f1f1f100f1,
-       0x0000404040400040, 0x0000d3d3d3d300d3, 0x0000bbbbbbbb00bb,
-       0x0000434343430043, 0x0000151515150015, 0x0000adadadad00ad,
-       0x0000777777770077, 0x0000808080800080, 0x0000828282820082,
-       0x0000ecececec00ec, 0x0000272727270027, 0x0000e5e5e5e500e5,
-       0x0000858585850085, 0x0000353535350035, 0x00000c0c0c0c000c,
-       0x0000414141410041, 0x0000efefefef00ef, 0x0000939393930093,
-       0x0000191919190019, 0x0000212121210021, 0x00000e0e0e0e000e,
-       0x00004e4e4e4e004e, 0x0000656565650065, 0x0000bdbdbdbd00bd,
-       0x0000b8b8b8b800b8, 0x00008f8f8f8f008f, 0x0000ebebebeb00eb,
-       0x0000cececece00ce, 0x0000303030300030, 0x00005f5f5f5f005f,
-       0x0000c5c5c5c500c5, 0x00001a1a1a1a001a, 0x0000e1e1e1e100e1,
-       0x0000cacacaca00ca, 0x0000474747470047, 0x00003d3d3d3d003d,
-       0x0000010101010001, 0x0000d6d6d6d600d6, 0x0000565656560056,
-       0x00004d4d4d4d004d, 0x00000d0d0d0d000d, 0x0000666666660066,
-       0x0000cccccccc00cc, 0x00002d2d2d2d002d, 0x0000121212120012,
-       0x0000202020200020, 0x0000b1b1b1b100b1, 0x0000999999990099,
-       0x00004c4c4c4c004c, 0x0000c2c2c2c200c2, 0x00007e7e7e7e007e,
-       0x0000050505050005, 0x0000b7b7b7b700b7, 0x0000313131310031,
-       0x0000171717170017, 0x0000d7d7d7d700d7, 0x0000585858580058,
-       0x0000616161610061, 0x00001b1b1b1b001b, 0x00001c1c1c1c001c,
-       0x00000f0f0f0f000f, 0x0000161616160016, 0x0000181818180018,
-       0x0000222222220022, 0x0000444444440044, 0x0000b2b2b2b200b2,
-       0x0000b5b5b5b500b5, 0x0000919191910091, 0x0000080808080008,
-       0x0000a8a8a8a800a8, 0x0000fcfcfcfc00fc, 0x0000505050500050,
-       0x0000d0d0d0d000d0, 0x00007d7d7d7d007d, 0x0000898989890089,
-       0x0000979797970097, 0x00005b5b5b5b005b, 0x0000959595950095,
-       0x0000ffffffff00ff, 0x0000d2d2d2d200d2, 0x0000c4c4c4c400c4,
-       0x0000484848480048, 0x0000f7f7f7f700f7, 0x0000dbdbdbdb00db,
-       0x0000030303030003, 0x0000dadadada00da, 0x00003f3f3f3f003f,
-       0x0000949494940094, 0x00005c5c5c5c005c, 0x0000020202020002,
-       0x00004a4a4a4a004a, 0x0000333333330033, 0x0000676767670067,
-       0x0000f3f3f3f300f3, 0x00007f7f7f7f007f, 0x0000e2e2e2e200e2,
-       0x00009b9b9b9b009b, 0x0000262626260026, 0x0000373737370037,
-       0x00003b3b3b3b003b, 0x0000969696960096, 0x00004b4b4b4b004b,
-       0x0000bebebebe00be, 0x00002e2e2e2e002e, 0x0000797979790079,
-       0x00008c8c8c8c008c, 0x00006e6e6e6e006e, 0x00008e8e8e8e008e,
-       0x0000f5f5f5f500f5, 0x0000b6b6b6b600b6, 0x0000fdfdfdfd00fd,
-       0x0000595959590059, 0x0000989898980098, 0x00006a6a6a6a006a,
-       0x0000464646460046, 0x0000babababa00ba, 0x0000252525250025,
-       0x0000424242420042, 0x0000a2a2a2a200a2, 0x0000fafafafa00fa,
-       0x0000070707070007, 0x0000555555550055, 0x0000eeeeeeee00ee,
-       0x00000a0a0a0a000a, 0x0000494949490049, 0x0000686868680068,
-       0x0000383838380038, 0x0000a4a4a4a400a4, 0x0000282828280028,
-       0x00007b7b7b7b007b, 0x0000c9c9c9c900c9, 0x0000c1c1c1c100c1,
-       0x0000e3e3e3e300e3, 0x0000f4f4f4f400f4, 0x0000c7c7c7c700c7,
-       0x00009e9e9e9e009e,
+       0x0000707070700070ULL, 0x00002c2c2c2c002cULL, 0x0000b3b3b3b300b3ULL,
+       0x0000c0c0c0c000c0ULL, 0x0000e4e4e4e400e4ULL, 0x0000575757570057ULL,
+       0x0000eaeaeaea00eaULL, 0x0000aeaeaeae00aeULL, 0x0000232323230023ULL,
+       0x00006b6b6b6b006bULL, 0x0000454545450045ULL, 0x0000a5a5a5a500a5ULL,
+       0x0000edededed00edULL, 0x00004f4f4f4f004fULL, 0x00001d1d1d1d001dULL,
+       0x0000929292920092ULL, 0x0000868686860086ULL, 0x0000afafafaf00afULL,
+       0x00007c7c7c7c007cULL, 0x00001f1f1f1f001fULL, 0x00003e3e3e3e003eULL,
+       0x0000dcdcdcdc00dcULL, 0x00005e5e5e5e005eULL, 0x00000b0b0b0b000bULL,
+       0x0000a6a6a6a600a6ULL, 0x0000393939390039ULL, 0x0000d5d5d5d500d5ULL,
+       0x00005d5d5d5d005dULL, 0x0000d9d9d9d900d9ULL, 0x00005a5a5a5a005aULL,
+       0x0000515151510051ULL, 0x00006c6c6c6c006cULL, 0x00008b8b8b8b008bULL,
+       0x00009a9a9a9a009aULL, 0x0000fbfbfbfb00fbULL, 0x0000b0b0b0b000b0ULL,
+       0x0000747474740074ULL, 0x00002b2b2b2b002bULL, 0x0000f0f0f0f000f0ULL,
+       0x0000848484840084ULL, 0x0000dfdfdfdf00dfULL, 0x0000cbcbcbcb00cbULL,
+       0x0000343434340034ULL, 0x0000767676760076ULL, 0x00006d6d6d6d006dULL,
+       0x0000a9a9a9a900a9ULL, 0x0000d1d1d1d100d1ULL, 0x0000040404040004ULL,
+       0x0000141414140014ULL, 0x00003a3a3a3a003aULL, 0x0000dededede00deULL,
+       0x0000111111110011ULL, 0x0000323232320032ULL, 0x00009c9c9c9c009cULL,
+       0x0000535353530053ULL, 0x0000f2f2f2f200f2ULL, 0x0000fefefefe00feULL,
+       0x0000cfcfcfcf00cfULL, 0x0000c3c3c3c300c3ULL, 0x00007a7a7a7a007aULL,
+       0x0000242424240024ULL, 0x0000e8e8e8e800e8ULL, 0x0000606060600060ULL,
+       0x0000696969690069ULL, 0x0000aaaaaaaa00aaULL, 0x0000a0a0a0a000a0ULL,
+       0x0000a1a1a1a100a1ULL, 0x0000626262620062ULL, 0x0000545454540054ULL,
+       0x00001e1e1e1e001eULL, 0x0000e0e0e0e000e0ULL, 0x0000646464640064ULL,
+       0x0000101010100010ULL, 0x0000000000000000ULL, 0x0000a3a3a3a300a3ULL,
+       0x0000757575750075ULL, 0x00008a8a8a8a008aULL, 0x0000e6e6e6e600e6ULL,
+       0x0000090909090009ULL, 0x0000dddddddd00ddULL, 0x0000878787870087ULL,
+       0x0000838383830083ULL, 0x0000cdcdcdcd00cdULL, 0x0000909090900090ULL,
+       0x0000737373730073ULL, 0x0000f6f6f6f600f6ULL, 0x00009d9d9d9d009dULL,
+       0x0000bfbfbfbf00bfULL, 0x0000525252520052ULL, 0x0000d8d8d8d800d8ULL,
+       0x0000c8c8c8c800c8ULL, 0x0000c6c6c6c600c6ULL, 0x0000818181810081ULL,
+       0x00006f6f6f6f006fULL, 0x0000131313130013ULL, 0x0000636363630063ULL,
+       0x0000e9e9e9e900e9ULL, 0x0000a7a7a7a700a7ULL, 0x00009f9f9f9f009fULL,
+       0x0000bcbcbcbc00bcULL, 0x0000292929290029ULL, 0x0000f9f9f9f900f9ULL,
+       0x00002f2f2f2f002fULL, 0x0000b4b4b4b400b4ULL, 0x0000787878780078ULL,
+       0x0000060606060006ULL, 0x0000e7e7e7e700e7ULL, 0x0000717171710071ULL,
+       0x0000d4d4d4d400d4ULL, 0x0000abababab00abULL, 0x0000888888880088ULL,
+       0x00008d8d8d8d008dULL, 0x0000727272720072ULL, 0x0000b9b9b9b900b9ULL,
+       0x0000f8f8f8f800f8ULL, 0x0000acacacac00acULL, 0x0000363636360036ULL,
+       0x00002a2a2a2a002aULL, 0x00003c3c3c3c003cULL, 0x0000f1f1f1f100f1ULL,
+       0x0000404040400040ULL, 0x0000d3d3d3d300d3ULL, 0x0000bbbbbbbb00bbULL,
+       0x0000434343430043ULL, 0x0000151515150015ULL, 0x0000adadadad00adULL,
+       0x0000777777770077ULL, 0x0000808080800080ULL, 0x0000828282820082ULL,
+       0x0000ecececec00ecULL, 0x0000272727270027ULL, 0x0000e5e5e5e500e5ULL,
+       0x0000858585850085ULL, 0x0000353535350035ULL, 0x00000c0c0c0c000cULL,
+       0x0000414141410041ULL, 0x0000efefefef00efULL, 0x0000939393930093ULL,
+       0x0000191919190019ULL, 0x0000212121210021ULL, 0x00000e0e0e0e000eULL,
+       0x00004e4e4e4e004eULL, 0x0000656565650065ULL, 0x0000bdbdbdbd00bdULL,
+       0x0000b8b8b8b800b8ULL, 0x00008f8f8f8f008fULL, 0x0000ebebebeb00ebULL,
+       0x0000cececece00ceULL, 0x0000303030300030ULL, 0x00005f5f5f5f005fULL,
+       0x0000c5c5c5c500c5ULL, 0x00001a1a1a1a001aULL, 0x0000e1e1e1e100e1ULL,
+       0x0000cacacaca00caULL, 0x0000474747470047ULL, 0x00003d3d3d3d003dULL,
+       0x0000010101010001ULL, 0x0000d6d6d6d600d6ULL, 0x0000565656560056ULL,
+       0x00004d4d4d4d004dULL, 0x00000d0d0d0d000dULL, 0x0000666666660066ULL,
+       0x0000cccccccc00ccULL, 0x00002d2d2d2d002dULL, 0x0000121212120012ULL,
+       0x0000202020200020ULL, 0x0000b1b1b1b100b1ULL, 0x0000999999990099ULL,
+       0x00004c4c4c4c004cULL, 0x0000c2c2c2c200c2ULL, 0x00007e7e7e7e007eULL,
+       0x0000050505050005ULL, 0x0000b7b7b7b700b7ULL, 0x0000313131310031ULL,
+       0x0000171717170017ULL, 0x0000d7d7d7d700d7ULL, 0x0000585858580058ULL,
+       0x0000616161610061ULL, 0x00001b1b1b1b001bULL, 0x00001c1c1c1c001cULL,
+       0x00000f0f0f0f000fULL, 0x0000161616160016ULL, 0x0000181818180018ULL,
+       0x0000222222220022ULL, 0x0000444444440044ULL, 0x0000b2b2b2b200b2ULL,
+       0x0000b5b5b5b500b5ULL, 0x0000919191910091ULL, 0x0000080808080008ULL,
+       0x0000a8a8a8a800a8ULL, 0x0000fcfcfcfc00fcULL, 0x0000505050500050ULL,
+       0x0000d0d0d0d000d0ULL, 0x00007d7d7d7d007dULL, 0x0000898989890089ULL,
+       0x0000979797970097ULL, 0x00005b5b5b5b005bULL, 0x0000959595950095ULL,
+       0x0000ffffffff00ffULL, 0x0000d2d2d2d200d2ULL, 0x0000c4c4c4c400c4ULL,
+       0x0000484848480048ULL, 0x0000f7f7f7f700f7ULL, 0x0000dbdbdbdb00dbULL,
+       0x0000030303030003ULL, 0x0000dadadada00daULL, 0x00003f3f3f3f003fULL,
+       0x0000949494940094ULL, 0x00005c5c5c5c005cULL, 0x0000020202020002ULL,
+       0x00004a4a4a4a004aULL, 0x0000333333330033ULL, 0x0000676767670067ULL,
+       0x0000f3f3f3f300f3ULL, 0x00007f7f7f7f007fULL, 0x0000e2e2e2e200e2ULL,
+       0x00009b9b9b9b009bULL, 0x0000262626260026ULL, 0x0000373737370037ULL,
+       0x00003b3b3b3b003bULL, 0x0000969696960096ULL, 0x00004b4b4b4b004bULL,
+       0x0000bebebebe00beULL, 0x00002e2e2e2e002eULL, 0x0000797979790079ULL,
+       0x00008c8c8c8c008cULL, 0x00006e6e6e6e006eULL, 0x00008e8e8e8e008eULL,
+       0x0000f5f5f5f500f5ULL, 0x0000b6b6b6b600b6ULL, 0x0000fdfdfdfd00fdULL,
+       0x0000595959590059ULL, 0x0000989898980098ULL, 0x00006a6a6a6a006aULL,
+       0x0000464646460046ULL, 0x0000babababa00baULL, 0x0000252525250025ULL,
+       0x0000424242420042ULL, 0x0000a2a2a2a200a2ULL, 0x0000fafafafa00faULL,
+       0x0000070707070007ULL, 0x0000555555550055ULL, 0x0000eeeeeeee00eeULL,
+       0x00000a0a0a0a000aULL, 0x0000494949490049ULL, 0x0000686868680068ULL,
+       0x0000383838380038ULL, 0x0000a4a4a4a400a4ULL, 0x0000282828280028ULL,
+       0x00007b7b7b7b007bULL, 0x0000c9c9c9c900c9ULL, 0x0000c1c1c1c100c1ULL,
+       0x0000e3e3e3e300e3ULL, 0x0000f4f4f4f400f4ULL, 0x0000c7c7c7c700c7ULL,
+       0x00009e9e9e9e009eULL,
 };
 
 const u64 camellia_sp02220222[256] = {
-       0x00e0e0e000e0e0e0, 0x0005050500050505, 0x0058585800585858,
-       0x00d9d9d900d9d9d9, 0x0067676700676767, 0x004e4e4e004e4e4e,
-       0x0081818100818181, 0x00cbcbcb00cbcbcb, 0x00c9c9c900c9c9c9,
-       0x000b0b0b000b0b0b, 0x00aeaeae00aeaeae, 0x006a6a6a006a6a6a,
-       0x00d5d5d500d5d5d5, 0x0018181800181818, 0x005d5d5d005d5d5d,
-       0x0082828200828282, 0x0046464600464646, 0x00dfdfdf00dfdfdf,
-       0x00d6d6d600d6d6d6, 0x0027272700272727, 0x008a8a8a008a8a8a,
-       0x0032323200323232, 0x004b4b4b004b4b4b, 0x0042424200424242,
-       0x00dbdbdb00dbdbdb, 0x001c1c1c001c1c1c, 0x009e9e9e009e9e9e,
-       0x009c9c9c009c9c9c, 0x003a3a3a003a3a3a, 0x00cacaca00cacaca,
-       0x0025252500252525, 0x007b7b7b007b7b7b, 0x000d0d0d000d0d0d,
-       0x0071717100717171, 0x005f5f5f005f5f5f, 0x001f1f1f001f1f1f,
-       0x00f8f8f800f8f8f8, 0x00d7d7d700d7d7d7, 0x003e3e3e003e3e3e,
-       0x009d9d9d009d9d9d, 0x007c7c7c007c7c7c, 0x0060606000606060,
-       0x00b9b9b900b9b9b9, 0x00bebebe00bebebe, 0x00bcbcbc00bcbcbc,
-       0x008b8b8b008b8b8b, 0x0016161600161616, 0x0034343400343434,
-       0x004d4d4d004d4d4d, 0x00c3c3c300c3c3c3, 0x0072727200727272,
-       0x0095959500959595, 0x00ababab00ababab, 0x008e8e8e008e8e8e,
-       0x00bababa00bababa, 0x007a7a7a007a7a7a, 0x00b3b3b300b3b3b3,
-       0x0002020200020202, 0x00b4b4b400b4b4b4, 0x00adadad00adadad,
-       0x00a2a2a200a2a2a2, 0x00acacac00acacac, 0x00d8d8d800d8d8d8,
-       0x009a9a9a009a9a9a, 0x0017171700171717, 0x001a1a1a001a1a1a,
-       0x0035353500353535, 0x00cccccc00cccccc, 0x00f7f7f700f7f7f7,
-       0x0099999900999999, 0x0061616100616161, 0x005a5a5a005a5a5a,
-       0x00e8e8e800e8e8e8, 0x0024242400242424, 0x0056565600565656,
-       0x0040404000404040, 0x00e1e1e100e1e1e1, 0x0063636300636363,
-       0x0009090900090909, 0x0033333300333333, 0x00bfbfbf00bfbfbf,
-       0x0098989800989898, 0x0097979700979797, 0x0085858500858585,
-       0x0068686800686868, 0x00fcfcfc00fcfcfc, 0x00ececec00ececec,
-       0x000a0a0a000a0a0a, 0x00dadada00dadada, 0x006f6f6f006f6f6f,
-       0x0053535300535353, 0x0062626200626262, 0x00a3a3a300a3a3a3,
-       0x002e2e2e002e2e2e, 0x0008080800080808, 0x00afafaf00afafaf,
-       0x0028282800282828, 0x00b0b0b000b0b0b0, 0x0074747400747474,
-       0x00c2c2c200c2c2c2, 0x00bdbdbd00bdbdbd, 0x0036363600363636,
-       0x0022222200222222, 0x0038383800383838, 0x0064646400646464,
-       0x001e1e1e001e1e1e, 0x0039393900393939, 0x002c2c2c002c2c2c,
-       0x00a6a6a600a6a6a6, 0x0030303000303030, 0x00e5e5e500e5e5e5,
-       0x0044444400444444, 0x00fdfdfd00fdfdfd, 0x0088888800888888,
-       0x009f9f9f009f9f9f, 0x0065656500656565, 0x0087878700878787,
-       0x006b6b6b006b6b6b, 0x00f4f4f400f4f4f4, 0x0023232300232323,
-       0x0048484800484848, 0x0010101000101010, 0x00d1d1d100d1d1d1,
-       0x0051515100515151, 0x00c0c0c000c0c0c0, 0x00f9f9f900f9f9f9,
-       0x00d2d2d200d2d2d2, 0x00a0a0a000a0a0a0, 0x0055555500555555,
-       0x00a1a1a100a1a1a1, 0x0041414100414141, 0x00fafafa00fafafa,
-       0x0043434300434343, 0x0013131300131313, 0x00c4c4c400c4c4c4,
-       0x002f2f2f002f2f2f, 0x00a8a8a800a8a8a8, 0x00b6b6b600b6b6b6,
-       0x003c3c3c003c3c3c, 0x002b2b2b002b2b2b, 0x00c1c1c100c1c1c1,
-       0x00ffffff00ffffff, 0x00c8c8c800c8c8c8, 0x00a5a5a500a5a5a5,
-       0x0020202000202020, 0x0089898900898989, 0x0000000000000000,
-       0x0090909000909090, 0x0047474700474747, 0x00efefef00efefef,
-       0x00eaeaea00eaeaea, 0x00b7b7b700b7b7b7, 0x0015151500151515,
-       0x0006060600060606, 0x00cdcdcd00cdcdcd, 0x00b5b5b500b5b5b5,
-       0x0012121200121212, 0x007e7e7e007e7e7e, 0x00bbbbbb00bbbbbb,
-       0x0029292900292929, 0x000f0f0f000f0f0f, 0x00b8b8b800b8b8b8,
-       0x0007070700070707, 0x0004040400040404, 0x009b9b9b009b9b9b,
-       0x0094949400949494, 0x0021212100212121, 0x0066666600666666,
-       0x00e6e6e600e6e6e6, 0x00cecece00cecece, 0x00ededed00ededed,
-       0x00e7e7e700e7e7e7, 0x003b3b3b003b3b3b, 0x00fefefe00fefefe,
-       0x007f7f7f007f7f7f, 0x00c5c5c500c5c5c5, 0x00a4a4a400a4a4a4,
-       0x0037373700373737, 0x00b1b1b100b1b1b1, 0x004c4c4c004c4c4c,
-       0x0091919100919191, 0x006e6e6e006e6e6e, 0x008d8d8d008d8d8d,
-       0x0076767600767676, 0x0003030300030303, 0x002d2d2d002d2d2d,
-       0x00dedede00dedede, 0x0096969600969696, 0x0026262600262626,
-       0x007d7d7d007d7d7d, 0x00c6c6c600c6c6c6, 0x005c5c5c005c5c5c,
-       0x00d3d3d300d3d3d3, 0x00f2f2f200f2f2f2, 0x004f4f4f004f4f4f,
-       0x0019191900191919, 0x003f3f3f003f3f3f, 0x00dcdcdc00dcdcdc,
-       0x0079797900797979, 0x001d1d1d001d1d1d, 0x0052525200525252,
-       0x00ebebeb00ebebeb, 0x00f3f3f300f3f3f3, 0x006d6d6d006d6d6d,
-       0x005e5e5e005e5e5e, 0x00fbfbfb00fbfbfb, 0x0069696900696969,
-       0x00b2b2b200b2b2b2, 0x00f0f0f000f0f0f0, 0x0031313100313131,
-       0x000c0c0c000c0c0c, 0x00d4d4d400d4d4d4, 0x00cfcfcf00cfcfcf,
-       0x008c8c8c008c8c8c, 0x00e2e2e200e2e2e2, 0x0075757500757575,
-       0x00a9a9a900a9a9a9, 0x004a4a4a004a4a4a, 0x0057575700575757,
-       0x0084848400848484, 0x0011111100111111, 0x0045454500454545,
-       0x001b1b1b001b1b1b, 0x00f5f5f500f5f5f5, 0x00e4e4e400e4e4e4,
-       0x000e0e0e000e0e0e, 0x0073737300737373, 0x00aaaaaa00aaaaaa,
-       0x00f1f1f100f1f1f1, 0x00dddddd00dddddd, 0x0059595900595959,
-       0x0014141400141414, 0x006c6c6c006c6c6c, 0x0092929200929292,
-       0x0054545400545454, 0x00d0d0d000d0d0d0, 0x0078787800787878,
-       0x0070707000707070, 0x00e3e3e300e3e3e3, 0x0049494900494949,
-       0x0080808000808080, 0x0050505000505050, 0x00a7a7a700a7a7a7,
-       0x00f6f6f600f6f6f6, 0x0077777700777777, 0x0093939300939393,
-       0x0086868600868686, 0x0083838300838383, 0x002a2a2a002a2a2a,
-       0x00c7c7c700c7c7c7, 0x005b5b5b005b5b5b, 0x00e9e9e900e9e9e9,
-       0x00eeeeee00eeeeee, 0x008f8f8f008f8f8f, 0x0001010100010101,
-       0x003d3d3d003d3d3d,
+       0x00e0e0e000e0e0e0ULL, 0x0005050500050505ULL, 0x0058585800585858ULL,
+       0x00d9d9d900d9d9d9ULL, 0x0067676700676767ULL, 0x004e4e4e004e4e4eULL,
+       0x0081818100818181ULL, 0x00cbcbcb00cbcbcbULL, 0x00c9c9c900c9c9c9ULL,
+       0x000b0b0b000b0b0bULL, 0x00aeaeae00aeaeaeULL, 0x006a6a6a006a6a6aULL,
+       0x00d5d5d500d5d5d5ULL, 0x0018181800181818ULL, 0x005d5d5d005d5d5dULL,
+       0x0082828200828282ULL, 0x0046464600464646ULL, 0x00dfdfdf00dfdfdfULL,
+       0x00d6d6d600d6d6d6ULL, 0x0027272700272727ULL, 0x008a8a8a008a8a8aULL,
+       0x0032323200323232ULL, 0x004b4b4b004b4b4bULL, 0x0042424200424242ULL,
+       0x00dbdbdb00dbdbdbULL, 0x001c1c1c001c1c1cULL, 0x009e9e9e009e9e9eULL,
+       0x009c9c9c009c9c9cULL, 0x003a3a3a003a3a3aULL, 0x00cacaca00cacacaULL,
+       0x0025252500252525ULL, 0x007b7b7b007b7b7bULL, 0x000d0d0d000d0d0dULL,
+       0x0071717100717171ULL, 0x005f5f5f005f5f5fULL, 0x001f1f1f001f1f1fULL,
+       0x00f8f8f800f8f8f8ULL, 0x00d7d7d700d7d7d7ULL, 0x003e3e3e003e3e3eULL,
+       0x009d9d9d009d9d9dULL, 0x007c7c7c007c7c7cULL, 0x0060606000606060ULL,
+       0x00b9b9b900b9b9b9ULL, 0x00bebebe00bebebeULL, 0x00bcbcbc00bcbcbcULL,
+       0x008b8b8b008b8b8bULL, 0x0016161600161616ULL, 0x0034343400343434ULL,
+       0x004d4d4d004d4d4dULL, 0x00c3c3c300c3c3c3ULL, 0x0072727200727272ULL,
+       0x0095959500959595ULL, 0x00ababab00abababULL, 0x008e8e8e008e8e8eULL,
+       0x00bababa00bababaULL, 0x007a7a7a007a7a7aULL, 0x00b3b3b300b3b3b3ULL,
+       0x0002020200020202ULL, 0x00b4b4b400b4b4b4ULL, 0x00adadad00adadadULL,
+       0x00a2a2a200a2a2a2ULL, 0x00acacac00acacacULL, 0x00d8d8d800d8d8d8ULL,
+       0x009a9a9a009a9a9aULL, 0x0017171700171717ULL, 0x001a1a1a001a1a1aULL,
+       0x0035353500353535ULL, 0x00cccccc00ccccccULL, 0x00f7f7f700f7f7f7ULL,
+       0x0099999900999999ULL, 0x0061616100616161ULL, 0x005a5a5a005a5a5aULL,
+       0x00e8e8e800e8e8e8ULL, 0x0024242400242424ULL, 0x0056565600565656ULL,
+       0x0040404000404040ULL, 0x00e1e1e100e1e1e1ULL, 0x0063636300636363ULL,
+       0x0009090900090909ULL, 0x0033333300333333ULL, 0x00bfbfbf00bfbfbfULL,
+       0x0098989800989898ULL, 0x0097979700979797ULL, 0x0085858500858585ULL,
+       0x0068686800686868ULL, 0x00fcfcfc00fcfcfcULL, 0x00ececec00ecececULL,
+       0x000a0a0a000a0a0aULL, 0x00dadada00dadadaULL, 0x006f6f6f006f6f6fULL,
+       0x0053535300535353ULL, 0x0062626200626262ULL, 0x00a3a3a300a3a3a3ULL,
+       0x002e2e2e002e2e2eULL, 0x0008080800080808ULL, 0x00afafaf00afafafULL,
+       0x0028282800282828ULL, 0x00b0b0b000b0b0b0ULL, 0x0074747400747474ULL,
+       0x00c2c2c200c2c2c2ULL, 0x00bdbdbd00bdbdbdULL, 0x0036363600363636ULL,
+       0x0022222200222222ULL, 0x0038383800383838ULL, 0x0064646400646464ULL,
+       0x001e1e1e001e1e1eULL, 0x0039393900393939ULL, 0x002c2c2c002c2c2cULL,
+       0x00a6a6a600a6a6a6ULL, 0x0030303000303030ULL, 0x00e5e5e500e5e5e5ULL,
+       0x0044444400444444ULL, 0x00fdfdfd00fdfdfdULL, 0x0088888800888888ULL,
+       0x009f9f9f009f9f9fULL, 0x0065656500656565ULL, 0x0087878700878787ULL,
+       0x006b6b6b006b6b6bULL, 0x00f4f4f400f4f4f4ULL, 0x0023232300232323ULL,
+       0x0048484800484848ULL, 0x0010101000101010ULL, 0x00d1d1d100d1d1d1ULL,
+       0x0051515100515151ULL, 0x00c0c0c000c0c0c0ULL, 0x00f9f9f900f9f9f9ULL,
+       0x00d2d2d200d2d2d2ULL, 0x00a0a0a000a0a0a0ULL, 0x0055555500555555ULL,
+       0x00a1a1a100a1a1a1ULL, 0x0041414100414141ULL, 0x00fafafa00fafafaULL,
+       0x0043434300434343ULL, 0x0013131300131313ULL, 0x00c4c4c400c4c4c4ULL,
+       0x002f2f2f002f2f2fULL, 0x00a8a8a800a8a8a8ULL, 0x00b6b6b600b6b6b6ULL,
+       0x003c3c3c003c3c3cULL, 0x002b2b2b002b2b2bULL, 0x00c1c1c100c1c1c1ULL,
+       0x00ffffff00ffffffULL, 0x00c8c8c800c8c8c8ULL, 0x00a5a5a500a5a5a5ULL,
+       0x0020202000202020ULL, 0x0089898900898989ULL, 0x0000000000000000ULL,
+       0x0090909000909090ULL, 0x0047474700474747ULL, 0x00efefef00efefefULL,
+       0x00eaeaea00eaeaeaULL, 0x00b7b7b700b7b7b7ULL, 0x0015151500151515ULL,
+       0x0006060600060606ULL, 0x00cdcdcd00cdcdcdULL, 0x00b5b5b500b5b5b5ULL,
+       0x0012121200121212ULL, 0x007e7e7e007e7e7eULL, 0x00bbbbbb00bbbbbbULL,
+       0x0029292900292929ULL, 0x000f0f0f000f0f0fULL, 0x00b8b8b800b8b8b8ULL,
+       0x0007070700070707ULL, 0x0004040400040404ULL, 0x009b9b9b009b9b9bULL,
+       0x0094949400949494ULL, 0x0021212100212121ULL, 0x0066666600666666ULL,
+       0x00e6e6e600e6e6e6ULL, 0x00cecece00cececeULL, 0x00ededed00edededULL,
+       0x00e7e7e700e7e7e7ULL, 0x003b3b3b003b3b3bULL, 0x00fefefe00fefefeULL,
+       0x007f7f7f007f7f7fULL, 0x00c5c5c500c5c5c5ULL, 0x00a4a4a400a4a4a4ULL,
+       0x0037373700373737ULL, 0x00b1b1b100b1b1b1ULL, 0x004c4c4c004c4c4cULL,
+       0x0091919100919191ULL, 0x006e6e6e006e6e6eULL, 0x008d8d8d008d8d8dULL,
+       0x0076767600767676ULL, 0x0003030300030303ULL, 0x002d2d2d002d2d2dULL,
+       0x00dedede00dededeULL, 0x0096969600969696ULL, 0x0026262600262626ULL,
+       0x007d7d7d007d7d7dULL, 0x00c6c6c600c6c6c6ULL, 0x005c5c5c005c5c5cULL,
+       0x00d3d3d300d3d3d3ULL, 0x00f2f2f200f2f2f2ULL, 0x004f4f4f004f4f4fULL,
+       0x0019191900191919ULL, 0x003f3f3f003f3f3fULL, 0x00dcdcdc00dcdcdcULL,
+       0x0079797900797979ULL, 0x001d1d1d001d1d1dULL, 0x0052525200525252ULL,
+       0x00ebebeb00ebebebULL, 0x00f3f3f300f3f3f3ULL, 0x006d6d6d006d6d6dULL,
+       0x005e5e5e005e5e5eULL, 0x00fbfbfb00fbfbfbULL, 0x0069696900696969ULL,
+       0x00b2b2b200b2b2b2ULL, 0x00f0f0f000f0f0f0ULL, 0x0031313100313131ULL,
+       0x000c0c0c000c0c0cULL, 0x00d4d4d400d4d4d4ULL, 0x00cfcfcf00cfcfcfULL,
+       0x008c8c8c008c8c8cULL, 0x00e2e2e200e2e2e2ULL, 0x0075757500757575ULL,
+       0x00a9a9a900a9a9a9ULL, 0x004a4a4a004a4a4aULL, 0x0057575700575757ULL,
+       0x0084848400848484ULL, 0x0011111100111111ULL, 0x0045454500454545ULL,
+       0x001b1b1b001b1b1bULL, 0x00f5f5f500f5f5f5ULL, 0x00e4e4e400e4e4e4ULL,
+       0x000e0e0e000e0e0eULL, 0x0073737300737373ULL, 0x00aaaaaa00aaaaaaULL,
+       0x00f1f1f100f1f1f1ULL, 0x00dddddd00ddddddULL, 0x0059595900595959ULL,
+       0x0014141400141414ULL, 0x006c6c6c006c6c6cULL, 0x0092929200929292ULL,
+       0x0054545400545454ULL, 0x00d0d0d000d0d0d0ULL, 0x0078787800787878ULL,
+       0x0070707000707070ULL, 0x00e3e3e300e3e3e3ULL, 0x0049494900494949ULL,
+       0x0080808000808080ULL, 0x0050505000505050ULL, 0x00a7a7a700a7a7a7ULL,
+       0x00f6f6f600f6f6f6ULL, 0x0077777700777777ULL, 0x0093939300939393ULL,
+       0x0086868600868686ULL, 0x0083838300838383ULL, 0x002a2a2a002a2a2aULL,
+       0x00c7c7c700c7c7c7ULL, 0x005b5b5b005b5b5bULL, 0x00e9e9e900e9e9e9ULL,
+       0x00eeeeee00eeeeeeULL, 0x008f8f8f008f8f8fULL, 0x0001010100010101ULL,
+       0x003d3d3d003d3d3dULL,
 };
 
 const u64 camellia_sp30333033[256] = {
-       0x3800383838003838, 0x4100414141004141, 0x1600161616001616,
-       0x7600767676007676, 0xd900d9d9d900d9d9, 0x9300939393009393,
-       0x6000606060006060, 0xf200f2f2f200f2f2, 0x7200727272007272,
-       0xc200c2c2c200c2c2, 0xab00ababab00abab, 0x9a009a9a9a009a9a,
-       0x7500757575007575, 0x0600060606000606, 0x5700575757005757,
-       0xa000a0a0a000a0a0, 0x9100919191009191, 0xf700f7f7f700f7f7,
-       0xb500b5b5b500b5b5, 0xc900c9c9c900c9c9, 0xa200a2a2a200a2a2,
-       0x8c008c8c8c008c8c, 0xd200d2d2d200d2d2, 0x9000909090009090,
-       0xf600f6f6f600f6f6, 0x0700070707000707, 0xa700a7a7a700a7a7,
-       0x2700272727002727, 0x8e008e8e8e008e8e, 0xb200b2b2b200b2b2,
-       0x4900494949004949, 0xde00dedede00dede, 0x4300434343004343,
-       0x5c005c5c5c005c5c, 0xd700d7d7d700d7d7, 0xc700c7c7c700c7c7,
-       0x3e003e3e3e003e3e, 0xf500f5f5f500f5f5, 0x8f008f8f8f008f8f,
-       0x6700676767006767, 0x1f001f1f1f001f1f, 0x1800181818001818,
-       0x6e006e6e6e006e6e, 0xaf00afafaf00afaf, 0x2f002f2f2f002f2f,
-       0xe200e2e2e200e2e2, 0x8500858585008585, 0x0d000d0d0d000d0d,
-       0x5300535353005353, 0xf000f0f0f000f0f0, 0x9c009c9c9c009c9c,
-       0x6500656565006565, 0xea00eaeaea00eaea, 0xa300a3a3a300a3a3,
-       0xae00aeaeae00aeae, 0x9e009e9e9e009e9e, 0xec00ececec00ecec,
-       0x8000808080008080, 0x2d002d2d2d002d2d, 0x6b006b6b6b006b6b,
-       0xa800a8a8a800a8a8, 0x2b002b2b2b002b2b, 0x3600363636003636,
-       0xa600a6a6a600a6a6, 0xc500c5c5c500c5c5, 0x8600868686008686,
-       0x4d004d4d4d004d4d, 0x3300333333003333, 0xfd00fdfdfd00fdfd,
-       0x6600666666006666, 0x5800585858005858, 0x9600969696009696,
-       0x3a003a3a3a003a3a, 0x0900090909000909, 0x9500959595009595,
-       0x1000101010001010, 0x7800787878007878, 0xd800d8d8d800d8d8,
-       0x4200424242004242, 0xcc00cccccc00cccc, 0xef00efefef00efef,
-       0x2600262626002626, 0xe500e5e5e500e5e5, 0x6100616161006161,
-       0x1a001a1a1a001a1a, 0x3f003f3f3f003f3f, 0x3b003b3b3b003b3b,
-       0x8200828282008282, 0xb600b6b6b600b6b6, 0xdb00dbdbdb00dbdb,
-       0xd400d4d4d400d4d4, 0x9800989898009898, 0xe800e8e8e800e8e8,
-       0x8b008b8b8b008b8b, 0x0200020202000202, 0xeb00ebebeb00ebeb,
-       0x0a000a0a0a000a0a, 0x2c002c2c2c002c2c, 0x1d001d1d1d001d1d,
-       0xb000b0b0b000b0b0, 0x6f006f6f6f006f6f, 0x8d008d8d8d008d8d,
-       0x8800888888008888, 0x0e000e0e0e000e0e, 0x1900191919001919,
-       0x8700878787008787, 0x4e004e4e4e004e4e, 0x0b000b0b0b000b0b,
-       0xa900a9a9a900a9a9, 0x0c000c0c0c000c0c, 0x7900797979007979,
-       0x1100111111001111, 0x7f007f7f7f007f7f, 0x2200222222002222,
-       0xe700e7e7e700e7e7, 0x5900595959005959, 0xe100e1e1e100e1e1,
-       0xda00dadada00dada, 0x3d003d3d3d003d3d, 0xc800c8c8c800c8c8,
-       0x1200121212001212, 0x0400040404000404, 0x7400747474007474,
-       0x5400545454005454, 0x3000303030003030, 0x7e007e7e7e007e7e,
-       0xb400b4b4b400b4b4, 0x2800282828002828, 0x5500555555005555,
-       0x6800686868006868, 0x5000505050005050, 0xbe00bebebe00bebe,
-       0xd000d0d0d000d0d0, 0xc400c4c4c400c4c4, 0x3100313131003131,
-       0xcb00cbcbcb00cbcb, 0x2a002a2a2a002a2a, 0xad00adadad00adad,
-       0x0f000f0f0f000f0f, 0xca00cacaca00caca, 0x7000707070007070,
-       0xff00ffffff00ffff, 0x3200323232003232, 0x6900696969006969,
-       0x0800080808000808, 0x6200626262006262, 0x0000000000000000,
-       0x2400242424002424, 0xd100d1d1d100d1d1, 0xfb00fbfbfb00fbfb,
-       0xba00bababa00baba, 0xed00ededed00eded, 0x4500454545004545,
-       0x8100818181008181, 0x7300737373007373, 0x6d006d6d6d006d6d,
-       0x8400848484008484, 0x9f009f9f9f009f9f, 0xee00eeeeee00eeee,
-       0x4a004a4a4a004a4a, 0xc300c3c3c300c3c3, 0x2e002e2e2e002e2e,
-       0xc100c1c1c100c1c1, 0x0100010101000101, 0xe600e6e6e600e6e6,
-       0x2500252525002525, 0x4800484848004848, 0x9900999999009999,
-       0xb900b9b9b900b9b9, 0xb300b3b3b300b3b3, 0x7b007b7b7b007b7b,
-       0xf900f9f9f900f9f9, 0xce00cecece00cece, 0xbf00bfbfbf00bfbf,
-       0xdf00dfdfdf00dfdf, 0x7100717171007171, 0x2900292929002929,
-       0xcd00cdcdcd00cdcd, 0x6c006c6c6c006c6c, 0x1300131313001313,
-       0x6400646464006464, 0x9b009b9b9b009b9b, 0x6300636363006363,
-       0x9d009d9d9d009d9d, 0xc000c0c0c000c0c0, 0x4b004b4b4b004b4b,
-       0xb700b7b7b700b7b7, 0xa500a5a5a500a5a5, 0x8900898989008989,
-       0x5f005f5f5f005f5f, 0xb100b1b1b100b1b1, 0x1700171717001717,
-       0xf400f4f4f400f4f4, 0xbc00bcbcbc00bcbc, 0xd300d3d3d300d3d3,
-       0x4600464646004646, 0xcf00cfcfcf00cfcf, 0x3700373737003737,
-       0x5e005e5e5e005e5e, 0x4700474747004747, 0x9400949494009494,
-       0xfa00fafafa00fafa, 0xfc00fcfcfc00fcfc, 0x5b005b5b5b005b5b,
-       0x9700979797009797, 0xfe00fefefe00fefe, 0x5a005a5a5a005a5a,
-       0xac00acacac00acac, 0x3c003c3c3c003c3c, 0x4c004c4c4c004c4c,
-       0x0300030303000303, 0x3500353535003535, 0xf300f3f3f300f3f3,
-       0x2300232323002323, 0xb800b8b8b800b8b8, 0x5d005d5d5d005d5d,
-       0x6a006a6a6a006a6a, 0x9200929292009292, 0xd500d5d5d500d5d5,
-       0x2100212121002121, 0x4400444444004444, 0x5100515151005151,
-       0xc600c6c6c600c6c6, 0x7d007d7d7d007d7d, 0x3900393939003939,
-       0x8300838383008383, 0xdc00dcdcdc00dcdc, 0xaa00aaaaaa00aaaa,
-       0x7c007c7c7c007c7c, 0x7700777777007777, 0x5600565656005656,
-       0x0500050505000505, 0x1b001b1b1b001b1b, 0xa400a4a4a400a4a4,
-       0x1500151515001515, 0x3400343434003434, 0x1e001e1e1e001e1e,
-       0x1c001c1c1c001c1c, 0xf800f8f8f800f8f8, 0x5200525252005252,
-       0x2000202020002020, 0x1400141414001414, 0xe900e9e9e900e9e9,
-       0xbd00bdbdbd00bdbd, 0xdd00dddddd00dddd, 0xe400e4e4e400e4e4,
-       0xa100a1a1a100a1a1, 0xe000e0e0e000e0e0, 0x8a008a8a8a008a8a,
-       0xf100f1f1f100f1f1, 0xd600d6d6d600d6d6, 0x7a007a7a7a007a7a,
-       0xbb00bbbbbb00bbbb, 0xe300e3e3e300e3e3, 0x4000404040004040,
-       0x4f004f4f4f004f4f,
+       0x3800383838003838ULL, 0x4100414141004141ULL, 0x1600161616001616ULL,
+       0x7600767676007676ULL, 0xd900d9d9d900d9d9ULL, 0x9300939393009393ULL,
+       0x6000606060006060ULL, 0xf200f2f2f200f2f2ULL, 0x7200727272007272ULL,
+       0xc200c2c2c200c2c2ULL, 0xab00ababab00ababULL, 0x9a009a9a9a009a9aULL,
+       0x7500757575007575ULL, 0x0600060606000606ULL, 0x5700575757005757ULL,
+       0xa000a0a0a000a0a0ULL, 0x9100919191009191ULL, 0xf700f7f7f700f7f7ULL,
+       0xb500b5b5b500b5b5ULL, 0xc900c9c9c900c9c9ULL, 0xa200a2a2a200a2a2ULL,
+       0x8c008c8c8c008c8cULL, 0xd200d2d2d200d2d2ULL, 0x9000909090009090ULL,
+       0xf600f6f6f600f6f6ULL, 0x0700070707000707ULL, 0xa700a7a7a700a7a7ULL,
+       0x2700272727002727ULL, 0x8e008e8e8e008e8eULL, 0xb200b2b2b200b2b2ULL,
+       0x4900494949004949ULL, 0xde00dedede00dedeULL, 0x4300434343004343ULL,
+       0x5c005c5c5c005c5cULL, 0xd700d7d7d700d7d7ULL, 0xc700c7c7c700c7c7ULL,
+       0x3e003e3e3e003e3eULL, 0xf500f5f5f500f5f5ULL, 0x8f008f8f8f008f8fULL,
+       0x6700676767006767ULL, 0x1f001f1f1f001f1fULL, 0x1800181818001818ULL,
+       0x6e006e6e6e006e6eULL, 0xaf00afafaf00afafULL, 0x2f002f2f2f002f2fULL,
+       0xe200e2e2e200e2e2ULL, 0x8500858585008585ULL, 0x0d000d0d0d000d0dULL,
+       0x5300535353005353ULL, 0xf000f0f0f000f0f0ULL, 0x9c009c9c9c009c9cULL,
+       0x6500656565006565ULL, 0xea00eaeaea00eaeaULL, 0xa300a3a3a300a3a3ULL,
+       0xae00aeaeae00aeaeULL, 0x9e009e9e9e009e9eULL, 0xec00ececec00ececULL,
+       0x8000808080008080ULL, 0x2d002d2d2d002d2dULL, 0x6b006b6b6b006b6bULL,
+       0xa800a8a8a800a8a8ULL, 0x2b002b2b2b002b2bULL, 0x3600363636003636ULL,
+       0xa600a6a6a600a6a6ULL, 0xc500c5c5c500c5c5ULL, 0x8600868686008686ULL,
+       0x4d004d4d4d004d4dULL, 0x3300333333003333ULL, 0xfd00fdfdfd00fdfdULL,
+       0x6600666666006666ULL, 0x5800585858005858ULL, 0x9600969696009696ULL,
+       0x3a003a3a3a003a3aULL, 0x0900090909000909ULL, 0x9500959595009595ULL,
+       0x1000101010001010ULL, 0x7800787878007878ULL, 0xd800d8d8d800d8d8ULL,
+       0x4200424242004242ULL, 0xcc00cccccc00ccccULL, 0xef00efefef00efefULL,
+       0x2600262626002626ULL, 0xe500e5e5e500e5e5ULL, 0x6100616161006161ULL,
+       0x1a001a1a1a001a1aULL, 0x3f003f3f3f003f3fULL, 0x3b003b3b3b003b3bULL,
+       0x8200828282008282ULL, 0xb600b6b6b600b6b6ULL, 0xdb00dbdbdb00dbdbULL,
+       0xd400d4d4d400d4d4ULL, 0x9800989898009898ULL, 0xe800e8e8e800e8e8ULL,
+       0x8b008b8b8b008b8bULL, 0x0200020202000202ULL, 0xeb00ebebeb00ebebULL,
+       0x0a000a0a0a000a0aULL, 0x2c002c2c2c002c2cULL, 0x1d001d1d1d001d1dULL,
+       0xb000b0b0b000b0b0ULL, 0x6f006f6f6f006f6fULL, 0x8d008d8d8d008d8dULL,
+       0x8800888888008888ULL, 0x0e000e0e0e000e0eULL, 0x1900191919001919ULL,
+       0x8700878787008787ULL, 0x4e004e4e4e004e4eULL, 0x0b000b0b0b000b0bULL,
+       0xa900a9a9a900a9a9ULL, 0x0c000c0c0c000c0cULL, 0x7900797979007979ULL,
+       0x1100111111001111ULL, 0x7f007f7f7f007f7fULL, 0x2200222222002222ULL,
+       0xe700e7e7e700e7e7ULL, 0x5900595959005959ULL, 0xe100e1e1e100e1e1ULL,
+       0xda00dadada00dadaULL, 0x3d003d3d3d003d3dULL, 0xc800c8c8c800c8c8ULL,
+       0x1200121212001212ULL, 0x0400040404000404ULL, 0x7400747474007474ULL,
+       0x5400545454005454ULL, 0x3000303030003030ULL, 0x7e007e7e7e007e7eULL,
+       0xb400b4b4b400b4b4ULL, 0x2800282828002828ULL, 0x5500555555005555ULL,
+       0x6800686868006868ULL, 0x5000505050005050ULL, 0xbe00bebebe00bebeULL,
+       0xd000d0d0d000d0d0ULL, 0xc400c4c4c400c4c4ULL, 0x3100313131003131ULL,
+       0xcb00cbcbcb00cbcbULL, 0x2a002a2a2a002a2aULL, 0xad00adadad00adadULL,
+       0x0f000f0f0f000f0fULL, 0xca00cacaca00cacaULL, 0x7000707070007070ULL,
+       0xff00ffffff00ffffULL, 0x3200323232003232ULL, 0x6900696969006969ULL,
+       0x0800080808000808ULL, 0x6200626262006262ULL, 0x0000000000000000ULL,
+       0x2400242424002424ULL, 0xd100d1d1d100d1d1ULL, 0xfb00fbfbfb00fbfbULL,
+       0xba00bababa00babaULL, 0xed00ededed00ededULL, 0x4500454545004545ULL,
+       0x8100818181008181ULL, 0x7300737373007373ULL, 0x6d006d6d6d006d6dULL,
+       0x8400848484008484ULL, 0x9f009f9f9f009f9fULL, 0xee00eeeeee00eeeeULL,
+       0x4a004a4a4a004a4aULL, 0xc300c3c3c300c3c3ULL, 0x2e002e2e2e002e2eULL,
+       0xc100c1c1c100c1c1ULL, 0x0100010101000101ULL, 0xe600e6e6e600e6e6ULL,
+       0x2500252525002525ULL, 0x4800484848004848ULL, 0x9900999999009999ULL,
+       0xb900b9b9b900b9b9ULL, 0xb300b3b3b300b3b3ULL, 0x7b007b7b7b007b7bULL,
+       0xf900f9f9f900f9f9ULL, 0xce00cecece00ceceULL, 0xbf00bfbfbf00bfbfULL,
+       0xdf00dfdfdf00dfdfULL, 0x7100717171007171ULL, 0x2900292929002929ULL,
+       0xcd00cdcdcd00cdcdULL, 0x6c006c6c6c006c6cULL, 0x1300131313001313ULL,
+       0x6400646464006464ULL, 0x9b009b9b9b009b9bULL, 0x6300636363006363ULL,
+       0x9d009d9d9d009d9dULL, 0xc000c0c0c000c0c0ULL, 0x4b004b4b4b004b4bULL,
+       0xb700b7b7b700b7b7ULL, 0xa500a5a5a500a5a5ULL, 0x8900898989008989ULL,
+       0x5f005f5f5f005f5fULL, 0xb100b1b1b100b1b1ULL, 0x1700171717001717ULL,
+       0xf400f4f4f400f4f4ULL, 0xbc00bcbcbc00bcbcULL, 0xd300d3d3d300d3d3ULL,
+       0x4600464646004646ULL, 0xcf00cfcfcf00cfcfULL, 0x3700373737003737ULL,
+       0x5e005e5e5e005e5eULL, 0x4700474747004747ULL, 0x9400949494009494ULL,
+       0xfa00fafafa00fafaULL, 0xfc00fcfcfc00fcfcULL, 0x5b005b5b5b005b5bULL,
+       0x9700979797009797ULL, 0xfe00fefefe00fefeULL, 0x5a005a5a5a005a5aULL,
+       0xac00acacac00acacULL, 0x3c003c3c3c003c3cULL, 0x4c004c4c4c004c4cULL,
+       0x0300030303000303ULL, 0x3500353535003535ULL, 0xf300f3f3f300f3f3ULL,
+       0x2300232323002323ULL, 0xb800b8b8b800b8b8ULL, 0x5d005d5d5d005d5dULL,
+       0x6a006a6a6a006a6aULL, 0x9200929292009292ULL, 0xd500d5d5d500d5d5ULL,
+       0x2100212121002121ULL, 0x4400444444004444ULL, 0x5100515151005151ULL,
+       0xc600c6c6c600c6c6ULL, 0x7d007d7d7d007d7dULL, 0x3900393939003939ULL,
+       0x8300838383008383ULL, 0xdc00dcdcdc00dcdcULL, 0xaa00aaaaaa00aaaaULL,
+       0x7c007c7c7c007c7cULL, 0x7700777777007777ULL, 0x5600565656005656ULL,
+       0x0500050505000505ULL, 0x1b001b1b1b001b1bULL, 0xa400a4a4a400a4a4ULL,
+       0x1500151515001515ULL, 0x3400343434003434ULL, 0x1e001e1e1e001e1eULL,
+       0x1c001c1c1c001c1cULL, 0xf800f8f8f800f8f8ULL, 0x5200525252005252ULL,
+       0x2000202020002020ULL, 0x1400141414001414ULL, 0xe900e9e9e900e9e9ULL,
+       0xbd00bdbdbd00bdbdULL, 0xdd00dddddd00ddddULL, 0xe400e4e4e400e4e4ULL,
+       0xa100a1a1a100a1a1ULL, 0xe000e0e0e000e0e0ULL, 0x8a008a8a8a008a8aULL,
+       0xf100f1f1f100f1f1ULL, 0xd600d6d6d600d6d6ULL, 0x7a007a7a7a007a7aULL,
+       0xbb00bbbbbb00bbbbULL, 0xe300e3e3e300e3e3ULL, 0x4000404040004040ULL,
+       0x4f004f4f4f004f4fULL,
 };
 
 const u64 camellia_sp44044404[256] = {
-       0x7070007070700070, 0x2c2c002c2c2c002c, 0xb3b300b3b3b300b3,
-       0xc0c000c0c0c000c0, 0xe4e400e4e4e400e4, 0x5757005757570057,
-       0xeaea00eaeaea00ea, 0xaeae00aeaeae00ae, 0x2323002323230023,
-       0x6b6b006b6b6b006b, 0x4545004545450045, 0xa5a500a5a5a500a5,
-       0xeded00ededed00ed, 0x4f4f004f4f4f004f, 0x1d1d001d1d1d001d,
-       0x9292009292920092, 0x8686008686860086, 0xafaf00afafaf00af,
-       0x7c7c007c7c7c007c, 0x1f1f001f1f1f001f, 0x3e3e003e3e3e003e,
-       0xdcdc00dcdcdc00dc, 0x5e5e005e5e5e005e, 0x0b0b000b0b0b000b,
-       0xa6a600a6a6a600a6, 0x3939003939390039, 0xd5d500d5d5d500d5,
-       0x5d5d005d5d5d005d, 0xd9d900d9d9d900d9, 0x5a5a005a5a5a005a,
-       0x5151005151510051, 0x6c6c006c6c6c006c, 0x8b8b008b8b8b008b,
-       0x9a9a009a9a9a009a, 0xfbfb00fbfbfb00fb, 0xb0b000b0b0b000b0,
-       0x7474007474740074, 0x2b2b002b2b2b002b, 0xf0f000f0f0f000f0,
-       0x8484008484840084, 0xdfdf00dfdfdf00df, 0xcbcb00cbcbcb00cb,
-       0x3434003434340034, 0x7676007676760076, 0x6d6d006d6d6d006d,
-       0xa9a900a9a9a900a9, 0xd1d100d1d1d100d1, 0x0404000404040004,
-       0x1414001414140014, 0x3a3a003a3a3a003a, 0xdede00dedede00de,
-       0x1111001111110011, 0x3232003232320032, 0x9c9c009c9c9c009c,
-       0x5353005353530053, 0xf2f200f2f2f200f2, 0xfefe00fefefe00fe,
-       0xcfcf00cfcfcf00cf, 0xc3c300c3c3c300c3, 0x7a7a007a7a7a007a,
-       0x2424002424240024, 0xe8e800e8e8e800e8, 0x6060006060600060,
-       0x6969006969690069, 0xaaaa00aaaaaa00aa, 0xa0a000a0a0a000a0,
-       0xa1a100a1a1a100a1, 0x6262006262620062, 0x5454005454540054,
-       0x1e1e001e1e1e001e, 0xe0e000e0e0e000e0, 0x6464006464640064,
-       0x1010001010100010, 0x0000000000000000, 0xa3a300a3a3a300a3,
-       0x7575007575750075, 0x8a8a008a8a8a008a, 0xe6e600e6e6e600e6,
-       0x0909000909090009, 0xdddd00dddddd00dd, 0x8787008787870087,
-       0x8383008383830083, 0xcdcd00cdcdcd00cd, 0x9090009090900090,
-       0x7373007373730073, 0xf6f600f6f6f600f6, 0x9d9d009d9d9d009d,
-       0xbfbf00bfbfbf00bf, 0x5252005252520052, 0xd8d800d8d8d800d8,
-       0xc8c800c8c8c800c8, 0xc6c600c6c6c600c6, 0x8181008181810081,
-       0x6f6f006f6f6f006f, 0x1313001313130013, 0x6363006363630063,
-       0xe9e900e9e9e900e9, 0xa7a700a7a7a700a7, 0x9f9f009f9f9f009f,
-       0xbcbc00bcbcbc00bc, 0x2929002929290029, 0xf9f900f9f9f900f9,
-       0x2f2f002f2f2f002f, 0xb4b400b4b4b400b4, 0x7878007878780078,
-       0x0606000606060006, 0xe7e700e7e7e700e7, 0x7171007171710071,
-       0xd4d400d4d4d400d4, 0xabab00ababab00ab, 0x8888008888880088,
-       0x8d8d008d8d8d008d, 0x7272007272720072, 0xb9b900b9b9b900b9,
-       0xf8f800f8f8f800f8, 0xacac00acacac00ac, 0x3636003636360036,
-       0x2a2a002a2a2a002a, 0x3c3c003c3c3c003c, 0xf1f100f1f1f100f1,
-       0x4040004040400040, 0xd3d300d3d3d300d3, 0xbbbb00bbbbbb00bb,
-       0x4343004343430043, 0x1515001515150015, 0xadad00adadad00ad,
-       0x7777007777770077, 0x8080008080800080, 0x8282008282820082,
-       0xecec00ececec00ec, 0x2727002727270027, 0xe5e500e5e5e500e5,
-       0x8585008585850085, 0x3535003535350035, 0x0c0c000c0c0c000c,
-       0x4141004141410041, 0xefef00efefef00ef, 0x9393009393930093,
-       0x1919001919190019, 0x2121002121210021, 0x0e0e000e0e0e000e,
-       0x4e4e004e4e4e004e, 0x6565006565650065, 0xbdbd00bdbdbd00bd,
-       0xb8b800b8b8b800b8, 0x8f8f008f8f8f008f, 0xebeb00ebebeb00eb,
-       0xcece00cecece00ce, 0x3030003030300030, 0x5f5f005f5f5f005f,
-       0xc5c500c5c5c500c5, 0x1a1a001a1a1a001a, 0xe1e100e1e1e100e1,
-       0xcaca00cacaca00ca, 0x4747004747470047, 0x3d3d003d3d3d003d,
-       0x0101000101010001, 0xd6d600d6d6d600d6, 0x5656005656560056,
-       0x4d4d004d4d4d004d, 0x0d0d000d0d0d000d, 0x6666006666660066,
-       0xcccc00cccccc00cc, 0x2d2d002d2d2d002d, 0x1212001212120012,
-       0x2020002020200020, 0xb1b100b1b1b100b1, 0x9999009999990099,
-       0x4c4c004c4c4c004c, 0xc2c200c2c2c200c2, 0x7e7e007e7e7e007e,
-       0x0505000505050005, 0xb7b700b7b7b700b7, 0x3131003131310031,
-       0x1717001717170017, 0xd7d700d7d7d700d7, 0x5858005858580058,
-       0x6161006161610061, 0x1b1b001b1b1b001b, 0x1c1c001c1c1c001c,
-       0x0f0f000f0f0f000f, 0x1616001616160016, 0x1818001818180018,
-       0x2222002222220022, 0x4444004444440044, 0xb2b200b2b2b200b2,
-       0xb5b500b5b5b500b5, 0x9191009191910091, 0x0808000808080008,
-       0xa8a800a8a8a800a8, 0xfcfc00fcfcfc00fc, 0x5050005050500050,
-       0xd0d000d0d0d000d0, 0x7d7d007d7d7d007d, 0x8989008989890089,
-       0x9797009797970097, 0x5b5b005b5b5b005b, 0x9595009595950095,
-       0xffff00ffffff00ff, 0xd2d200d2d2d200d2, 0xc4c400c4c4c400c4,
-       0x4848004848480048, 0xf7f700f7f7f700f7, 0xdbdb00dbdbdb00db,
-       0x0303000303030003, 0xdada00dadada00da, 0x3f3f003f3f3f003f,
-       0x9494009494940094, 0x5c5c005c5c5c005c, 0x0202000202020002,
-       0x4a4a004a4a4a004a, 0x3333003333330033, 0x6767006767670067,
-       0xf3f300f3f3f300f3, 0x7f7f007f7f7f007f, 0xe2e200e2e2e200e2,
-       0x9b9b009b9b9b009b, 0x2626002626260026, 0x3737003737370037,
-       0x3b3b003b3b3b003b, 0x9696009696960096, 0x4b4b004b4b4b004b,
-       0xbebe00bebebe00be, 0x2e2e002e2e2e002e, 0x7979007979790079,
-       0x8c8c008c8c8c008c, 0x6e6e006e6e6e006e, 0x8e8e008e8e8e008e,
-       0xf5f500f5f5f500f5, 0xb6b600b6b6b600b6, 0xfdfd00fdfdfd00fd,
-       0x5959005959590059, 0x9898009898980098, 0x6a6a006a6a6a006a,
-       0x4646004646460046, 0xbaba00bababa00ba, 0x2525002525250025,
-       0x4242004242420042, 0xa2a200a2a2a200a2, 0xfafa00fafafa00fa,
-       0x0707000707070007, 0x5555005555550055, 0xeeee00eeeeee00ee,
-       0x0a0a000a0a0a000a, 0x4949004949490049, 0x6868006868680068,
-       0x3838003838380038, 0xa4a400a4a4a400a4, 0x2828002828280028,
-       0x7b7b007b7b7b007b, 0xc9c900c9c9c900c9, 0xc1c100c1c1c100c1,
-       0xe3e300e3e3e300e3, 0xf4f400f4f4f400f4, 0xc7c700c7c7c700c7,
-       0x9e9e009e9e9e009e,
+       0x7070007070700070ULL, 0x2c2c002c2c2c002cULL, 0xb3b300b3b3b300b3ULL,
+       0xc0c000c0c0c000c0ULL, 0xe4e400e4e4e400e4ULL, 0x5757005757570057ULL,
+       0xeaea00eaeaea00eaULL, 0xaeae00aeaeae00aeULL, 0x2323002323230023ULL,
+       0x6b6b006b6b6b006bULL, 0x4545004545450045ULL, 0xa5a500a5a5a500a5ULL,
+       0xeded00ededed00edULL, 0x4f4f004f4f4f004fULL, 0x1d1d001d1d1d001dULL,
+       0x9292009292920092ULL, 0x8686008686860086ULL, 0xafaf00afafaf00afULL,
+       0x7c7c007c7c7c007cULL, 0x1f1f001f1f1f001fULL, 0x3e3e003e3e3e003eULL,
+       0xdcdc00dcdcdc00dcULL, 0x5e5e005e5e5e005eULL, 0x0b0b000b0b0b000bULL,
+       0xa6a600a6a6a600a6ULL, 0x3939003939390039ULL, 0xd5d500d5d5d500d5ULL,
+       0x5d5d005d5d5d005dULL, 0xd9d900d9d9d900d9ULL, 0x5a5a005a5a5a005aULL,
+       0x5151005151510051ULL, 0x6c6c006c6c6c006cULL, 0x8b8b008b8b8b008bULL,
+       0x9a9a009a9a9a009aULL, 0xfbfb00fbfbfb00fbULL, 0xb0b000b0b0b000b0ULL,
+       0x7474007474740074ULL, 0x2b2b002b2b2b002bULL, 0xf0f000f0f0f000f0ULL,
+       0x8484008484840084ULL, 0xdfdf00dfdfdf00dfULL, 0xcbcb00cbcbcb00cbULL,
+       0x3434003434340034ULL, 0x7676007676760076ULL, 0x6d6d006d6d6d006dULL,
+       0xa9a900a9a9a900a9ULL, 0xd1d100d1d1d100d1ULL, 0x0404000404040004ULL,
+       0x1414001414140014ULL, 0x3a3a003a3a3a003aULL, 0xdede00dedede00deULL,
+       0x1111001111110011ULL, 0x3232003232320032ULL, 0x9c9c009c9c9c009cULL,
+       0x5353005353530053ULL, 0xf2f200f2f2f200f2ULL, 0xfefe00fefefe00feULL,
+       0xcfcf00cfcfcf00cfULL, 0xc3c300c3c3c300c3ULL, 0x7a7a007a7a7a007aULL,
+       0x2424002424240024ULL, 0xe8e800e8e8e800e8ULL, 0x6060006060600060ULL,
+       0x6969006969690069ULL, 0xaaaa00aaaaaa00aaULL, 0xa0a000a0a0a000a0ULL,
+       0xa1a100a1a1a100a1ULL, 0x6262006262620062ULL, 0x5454005454540054ULL,
+       0x1e1e001e1e1e001eULL, 0xe0e000e0e0e000e0ULL, 0x6464006464640064ULL,
+       0x1010001010100010ULL, 0x0000000000000000ULL, 0xa3a300a3a3a300a3ULL,
+       0x7575007575750075ULL, 0x8a8a008a8a8a008aULL, 0xe6e600e6e6e600e6ULL,
+       0x0909000909090009ULL, 0xdddd00dddddd00ddULL, 0x8787008787870087ULL,
+       0x8383008383830083ULL, 0xcdcd00cdcdcd00cdULL, 0x9090009090900090ULL,
+       0x7373007373730073ULL, 0xf6f600f6f6f600f6ULL, 0x9d9d009d9d9d009dULL,
+       0xbfbf00bfbfbf00bfULL, 0x5252005252520052ULL, 0xd8d800d8d8d800d8ULL,
+       0xc8c800c8c8c800c8ULL, 0xc6c600c6c6c600c6ULL, 0x8181008181810081ULL,
+       0x6f6f006f6f6f006fULL, 0x1313001313130013ULL, 0x6363006363630063ULL,
+       0xe9e900e9e9e900e9ULL, 0xa7a700a7a7a700a7ULL, 0x9f9f009f9f9f009fULL,
+       0xbcbc00bcbcbc00bcULL, 0x2929002929290029ULL, 0xf9f900f9f9f900f9ULL,
+       0x2f2f002f2f2f002fULL, 0xb4b400b4b4b400b4ULL, 0x7878007878780078ULL,
+       0x0606000606060006ULL, 0xe7e700e7e7e700e7ULL, 0x7171007171710071ULL,
+       0xd4d400d4d4d400d4ULL, 0xabab00ababab00abULL, 0x8888008888880088ULL,
+       0x8d8d008d8d8d008dULL, 0x7272007272720072ULL, 0xb9b900b9b9b900b9ULL,
+       0xf8f800f8f8f800f8ULL, 0xacac00acacac00acULL, 0x3636003636360036ULL,
+       0x2a2a002a2a2a002aULL, 0x3c3c003c3c3c003cULL, 0xf1f100f1f1f100f1ULL,
+       0x4040004040400040ULL, 0xd3d300d3d3d300d3ULL, 0xbbbb00bbbbbb00bbULL,
+       0x4343004343430043ULL, 0x1515001515150015ULL, 0xadad00adadad00adULL,
+       0x7777007777770077ULL, 0x8080008080800080ULL, 0x8282008282820082ULL,
+       0xecec00ececec00ecULL, 0x2727002727270027ULL, 0xe5e500e5e5e500e5ULL,
+       0x8585008585850085ULL, 0x3535003535350035ULL, 0x0c0c000c0c0c000cULL,
+       0x4141004141410041ULL, 0xefef00efefef00efULL, 0x9393009393930093ULL,
+       0x1919001919190019ULL, 0x2121002121210021ULL, 0x0e0e000e0e0e000eULL,
+       0x4e4e004e4e4e004eULL, 0x6565006565650065ULL, 0xbdbd00bdbdbd00bdULL,
+       0xb8b800b8b8b800b8ULL, 0x8f8f008f8f8f008fULL, 0xebeb00ebebeb00ebULL,
+       0xcece00cecece00ceULL, 0x3030003030300030ULL, 0x5f5f005f5f5f005fULL,
+       0xc5c500c5c5c500c5ULL, 0x1a1a001a1a1a001aULL, 0xe1e100e1e1e100e1ULL,
+       0xcaca00cacaca00caULL, 0x4747004747470047ULL, 0x3d3d003d3d3d003dULL,
+       0x0101000101010001ULL, 0xd6d600d6d6d600d6ULL, 0x5656005656560056ULL,
+       0x4d4d004d4d4d004dULL, 0x0d0d000d0d0d000dULL, 0x6666006666660066ULL,
+       0xcccc00cccccc00ccULL, 0x2d2d002d2d2d002dULL, 0x1212001212120012ULL,
+       0x2020002020200020ULL, 0xb1b100b1b1b100b1ULL, 0x9999009999990099ULL,
+       0x4c4c004c4c4c004cULL, 0xc2c200c2c2c200c2ULL, 0x7e7e007e7e7e007eULL,
+       0x0505000505050005ULL, 0xb7b700b7b7b700b7ULL, 0x3131003131310031ULL,
+       0x1717001717170017ULL, 0xd7d700d7d7d700d7ULL, 0x5858005858580058ULL,
+       0x6161006161610061ULL, 0x1b1b001b1b1b001bULL, 0x1c1c001c1c1c001cULL,
+       0x0f0f000f0f0f000fULL, 0x1616001616160016ULL, 0x1818001818180018ULL,
+       0x2222002222220022ULL, 0x4444004444440044ULL, 0xb2b200b2b2b200b2ULL,
+       0xb5b500b5b5b500b5ULL, 0x9191009191910091ULL, 0x0808000808080008ULL,
+       0xa8a800a8a8a800a8ULL, 0xfcfc00fcfcfc00fcULL, 0x5050005050500050ULL,
+       0xd0d000d0d0d000d0ULL, 0x7d7d007d7d7d007dULL, 0x8989008989890089ULL,
+       0x9797009797970097ULL, 0x5b5b005b5b5b005bULL, 0x9595009595950095ULL,
+       0xffff00ffffff00ffULL, 0xd2d200d2d2d200d2ULL, 0xc4c400c4c4c400c4ULL,
+       0x4848004848480048ULL, 0xf7f700f7f7f700f7ULL, 0xdbdb00dbdbdb00dbULL,
+       0x0303000303030003ULL, 0xdada00dadada00daULL, 0x3f3f003f3f3f003fULL,
+       0x9494009494940094ULL, 0x5c5c005c5c5c005cULL, 0x0202000202020002ULL,
+       0x4a4a004a4a4a004aULL, 0x3333003333330033ULL, 0x6767006767670067ULL,
+       0xf3f300f3f3f300f3ULL, 0x7f7f007f7f7f007fULL, 0xe2e200e2e2e200e2ULL,
+       0x9b9b009b9b9b009bULL, 0x2626002626260026ULL, 0x3737003737370037ULL,
+       0x3b3b003b3b3b003bULL, 0x9696009696960096ULL, 0x4b4b004b4b4b004bULL,
+       0xbebe00bebebe00beULL, 0x2e2e002e2e2e002eULL, 0x7979007979790079ULL,
+       0x8c8c008c8c8c008cULL, 0x6e6e006e6e6e006eULL, 0x8e8e008e8e8e008eULL,
+       0xf5f500f5f5f500f5ULL, 0xb6b600b6b6b600b6ULL, 0xfdfd00fdfdfd00fdULL,
+       0x5959005959590059ULL, 0x9898009898980098ULL, 0x6a6a006a6a6a006aULL,
+       0x4646004646460046ULL, 0xbaba00bababa00baULL, 0x2525002525250025ULL,
+       0x4242004242420042ULL, 0xa2a200a2a2a200a2ULL, 0xfafa00fafafa00faULL,
+       0x0707000707070007ULL, 0x5555005555550055ULL, 0xeeee00eeeeee00eeULL,
+       0x0a0a000a0a0a000aULL, 0x4949004949490049ULL, 0x6868006868680068ULL,
+       0x3838003838380038ULL, 0xa4a400a4a4a400a4ULL, 0x2828002828280028ULL,
+       0x7b7b007b7b7b007bULL, 0xc9c900c9c9c900c9ULL, 0xc1c100c1c1c100c1ULL,
+       0xe3e300e3e3e300e3ULL, 0xf4f400f4f4f400f4ULL, 0xc7c700c7c7c700c7ULL,
+       0x9e9e009e9e9e009eULL,
 };
 
 const u64 camellia_sp11101110[256] = {
-       0x7070700070707000, 0x8282820082828200, 0x2c2c2c002c2c2c00,
-       0xececec00ececec00, 0xb3b3b300b3b3b300, 0x2727270027272700,
-       0xc0c0c000c0c0c000, 0xe5e5e500e5e5e500, 0xe4e4e400e4e4e400,
-       0x8585850085858500, 0x5757570057575700, 0x3535350035353500,
-       0xeaeaea00eaeaea00, 0x0c0c0c000c0c0c00, 0xaeaeae00aeaeae00,
-       0x4141410041414100, 0x2323230023232300, 0xefefef00efefef00,
-       0x6b6b6b006b6b6b00, 0x9393930093939300, 0x4545450045454500,
-       0x1919190019191900, 0xa5a5a500a5a5a500, 0x2121210021212100,
-       0xededed00ededed00, 0x0e0e0e000e0e0e00, 0x4f4f4f004f4f4f00,
-       0x4e4e4e004e4e4e00, 0x1d1d1d001d1d1d00, 0x6565650065656500,
-       0x9292920092929200, 0xbdbdbd00bdbdbd00, 0x8686860086868600,
-       0xb8b8b800b8b8b800, 0xafafaf00afafaf00, 0x8f8f8f008f8f8f00,
-       0x7c7c7c007c7c7c00, 0xebebeb00ebebeb00, 0x1f1f1f001f1f1f00,
-       0xcecece00cecece00, 0x3e3e3e003e3e3e00, 0x3030300030303000,
-       0xdcdcdc00dcdcdc00, 0x5f5f5f005f5f5f00, 0x5e5e5e005e5e5e00,
-       0xc5c5c500c5c5c500, 0x0b0b0b000b0b0b00, 0x1a1a1a001a1a1a00,
-       0xa6a6a600a6a6a600, 0xe1e1e100e1e1e100, 0x3939390039393900,
-       0xcacaca00cacaca00, 0xd5d5d500d5d5d500, 0x4747470047474700,
-       0x5d5d5d005d5d5d00, 0x3d3d3d003d3d3d00, 0xd9d9d900d9d9d900,
-       0x0101010001010100, 0x5a5a5a005a5a5a00, 0xd6d6d600d6d6d600,
-       0x5151510051515100, 0x5656560056565600, 0x6c6c6c006c6c6c00,
-       0x4d4d4d004d4d4d00, 0x8b8b8b008b8b8b00, 0x0d0d0d000d0d0d00,
-       0x9a9a9a009a9a9a00, 0x6666660066666600, 0xfbfbfb00fbfbfb00,
-       0xcccccc00cccccc00, 0xb0b0b000b0b0b000, 0x2d2d2d002d2d2d00,
-       0x7474740074747400, 0x1212120012121200, 0x2b2b2b002b2b2b00,
-       0x2020200020202000, 0xf0f0f000f0f0f000, 0xb1b1b100b1b1b100,
-       0x8484840084848400, 0x9999990099999900, 0xdfdfdf00dfdfdf00,
-       0x4c4c4c004c4c4c00, 0xcbcbcb00cbcbcb00, 0xc2c2c200c2c2c200,
-       0x3434340034343400, 0x7e7e7e007e7e7e00, 0x7676760076767600,
-       0x0505050005050500, 0x6d6d6d006d6d6d00, 0xb7b7b700b7b7b700,
-       0xa9a9a900a9a9a900, 0x3131310031313100, 0xd1d1d100d1d1d100,
-       0x1717170017171700, 0x0404040004040400, 0xd7d7d700d7d7d700,
-       0x1414140014141400, 0x5858580058585800, 0x3a3a3a003a3a3a00,
-       0x6161610061616100, 0xdedede00dedede00, 0x1b1b1b001b1b1b00,
-       0x1111110011111100, 0x1c1c1c001c1c1c00, 0x3232320032323200,
-       0x0f0f0f000f0f0f00, 0x9c9c9c009c9c9c00, 0x1616160016161600,
-       0x5353530053535300, 0x1818180018181800, 0xf2f2f200f2f2f200,
-       0x2222220022222200, 0xfefefe00fefefe00, 0x4444440044444400,
-       0xcfcfcf00cfcfcf00, 0xb2b2b200b2b2b200, 0xc3c3c300c3c3c300,
-       0xb5b5b500b5b5b500, 0x7a7a7a007a7a7a00, 0x9191910091919100,
-       0x2424240024242400, 0x0808080008080800, 0xe8e8e800e8e8e800,
-       0xa8a8a800a8a8a800, 0x6060600060606000, 0xfcfcfc00fcfcfc00,
-       0x6969690069696900, 0x5050500050505000, 0xaaaaaa00aaaaaa00,
-       0xd0d0d000d0d0d000, 0xa0a0a000a0a0a000, 0x7d7d7d007d7d7d00,
-       0xa1a1a100a1a1a100, 0x8989890089898900, 0x6262620062626200,
-       0x9797970097979700, 0x5454540054545400, 0x5b5b5b005b5b5b00,
-       0x1e1e1e001e1e1e00, 0x9595950095959500, 0xe0e0e000e0e0e000,
-       0xffffff00ffffff00, 0x6464640064646400, 0xd2d2d200d2d2d200,
-       0x1010100010101000, 0xc4c4c400c4c4c400, 0x0000000000000000,
-       0x4848480048484800, 0xa3a3a300a3a3a300, 0xf7f7f700f7f7f700,
-       0x7575750075757500, 0xdbdbdb00dbdbdb00, 0x8a8a8a008a8a8a00,
-       0x0303030003030300, 0xe6e6e600e6e6e600, 0xdadada00dadada00,
-       0x0909090009090900, 0x3f3f3f003f3f3f00, 0xdddddd00dddddd00,
-       0x9494940094949400, 0x8787870087878700, 0x5c5c5c005c5c5c00,
-       0x8383830083838300, 0x0202020002020200, 0xcdcdcd00cdcdcd00,
-       0x4a4a4a004a4a4a00, 0x9090900090909000, 0x3333330033333300,
-       0x7373730073737300, 0x6767670067676700, 0xf6f6f600f6f6f600,
-       0xf3f3f300f3f3f300, 0x9d9d9d009d9d9d00, 0x7f7f7f007f7f7f00,
-       0xbfbfbf00bfbfbf00, 0xe2e2e200e2e2e200, 0x5252520052525200,
-       0x9b9b9b009b9b9b00, 0xd8d8d800d8d8d800, 0x2626260026262600,
-       0xc8c8c800c8c8c800, 0x3737370037373700, 0xc6c6c600c6c6c600,
-       0x3b3b3b003b3b3b00, 0x8181810081818100, 0x9696960096969600,
-       0x6f6f6f006f6f6f00, 0x4b4b4b004b4b4b00, 0x1313130013131300,
-       0xbebebe00bebebe00, 0x6363630063636300, 0x2e2e2e002e2e2e00,
-       0xe9e9e900e9e9e900, 0x7979790079797900, 0xa7a7a700a7a7a700,
-       0x8c8c8c008c8c8c00, 0x9f9f9f009f9f9f00, 0x6e6e6e006e6e6e00,
-       0xbcbcbc00bcbcbc00, 0x8e8e8e008e8e8e00, 0x2929290029292900,
-       0xf5f5f500f5f5f500, 0xf9f9f900f9f9f900, 0xb6b6b600b6b6b600,
-       0x2f2f2f002f2f2f00, 0xfdfdfd00fdfdfd00, 0xb4b4b400b4b4b400,
-       0x5959590059595900, 0x7878780078787800, 0x9898980098989800,
-       0x0606060006060600, 0x6a6a6a006a6a6a00, 0xe7e7e700e7e7e700,
-       0x4646460046464600, 0x7171710071717100, 0xbababa00bababa00,
-       0xd4d4d400d4d4d400, 0x2525250025252500, 0xababab00ababab00,
-       0x4242420042424200, 0x8888880088888800, 0xa2a2a200a2a2a200,
-       0x8d8d8d008d8d8d00, 0xfafafa00fafafa00, 0x7272720072727200,
-       0x0707070007070700, 0xb9b9b900b9b9b900, 0x5555550055555500,
-       0xf8f8f800f8f8f800, 0xeeeeee00eeeeee00, 0xacacac00acacac00,
-       0x0a0a0a000a0a0a00, 0x3636360036363600, 0x4949490049494900,
-       0x2a2a2a002a2a2a00, 0x6868680068686800, 0x3c3c3c003c3c3c00,
-       0x3838380038383800, 0xf1f1f100f1f1f100, 0xa4a4a400a4a4a400,
-       0x4040400040404000, 0x2828280028282800, 0xd3d3d300d3d3d300,
-       0x7b7b7b007b7b7b00, 0xbbbbbb00bbbbbb00, 0xc9c9c900c9c9c900,
-       0x4343430043434300, 0xc1c1c100c1c1c100, 0x1515150015151500,
-       0xe3e3e300e3e3e300, 0xadadad00adadad00, 0xf4f4f400f4f4f400,
-       0x7777770077777700, 0xc7c7c700c7c7c700, 0x8080800080808000,
-       0x9e9e9e009e9e9e00,
+       0x7070700070707000ULL, 0x8282820082828200ULL, 0x2c2c2c002c2c2c00ULL,
+       0xececec00ececec00ULL, 0xb3b3b300b3b3b300ULL, 0x2727270027272700ULL,
+       0xc0c0c000c0c0c000ULL, 0xe5e5e500e5e5e500ULL, 0xe4e4e400e4e4e400ULL,
+       0x8585850085858500ULL, 0x5757570057575700ULL, 0x3535350035353500ULL,
+       0xeaeaea00eaeaea00ULL, 0x0c0c0c000c0c0c00ULL, 0xaeaeae00aeaeae00ULL,
+       0x4141410041414100ULL, 0x2323230023232300ULL, 0xefefef00efefef00ULL,
+       0x6b6b6b006b6b6b00ULL, 0x9393930093939300ULL, 0x4545450045454500ULL,
+       0x1919190019191900ULL, 0xa5a5a500a5a5a500ULL, 0x2121210021212100ULL,
+       0xededed00ededed00ULL, 0x0e0e0e000e0e0e00ULL, 0x4f4f4f004f4f4f00ULL,
+       0x4e4e4e004e4e4e00ULL, 0x1d1d1d001d1d1d00ULL, 0x6565650065656500ULL,
+       0x9292920092929200ULL, 0xbdbdbd00bdbdbd00ULL, 0x8686860086868600ULL,
+       0xb8b8b800b8b8b800ULL, 0xafafaf00afafaf00ULL, 0x8f8f8f008f8f8f00ULL,
+       0x7c7c7c007c7c7c00ULL, 0xebebeb00ebebeb00ULL, 0x1f1f1f001f1f1f00ULL,
+       0xcecece00cecece00ULL, 0x3e3e3e003e3e3e00ULL, 0x3030300030303000ULL,
+       0xdcdcdc00dcdcdc00ULL, 0x5f5f5f005f5f5f00ULL, 0x5e5e5e005e5e5e00ULL,
+       0xc5c5c500c5c5c500ULL, 0x0b0b0b000b0b0b00ULL, 0x1a1a1a001a1a1a00ULL,
+       0xa6a6a600a6a6a600ULL, 0xe1e1e100e1e1e100ULL, 0x3939390039393900ULL,
+       0xcacaca00cacaca00ULL, 0xd5d5d500d5d5d500ULL, 0x4747470047474700ULL,
+       0x5d5d5d005d5d5d00ULL, 0x3d3d3d003d3d3d00ULL, 0xd9d9d900d9d9d900ULL,
+       0x0101010001010100ULL, 0x5a5a5a005a5a5a00ULL, 0xd6d6d600d6d6d600ULL,
+       0x5151510051515100ULL, 0x5656560056565600ULL, 0x6c6c6c006c6c6c00ULL,
+       0x4d4d4d004d4d4d00ULL, 0x8b8b8b008b8b8b00ULL, 0x0d0d0d000d0d0d00ULL,
+       0x9a9a9a009a9a9a00ULL, 0x6666660066666600ULL, 0xfbfbfb00fbfbfb00ULL,
+       0xcccccc00cccccc00ULL, 0xb0b0b000b0b0b000ULL, 0x2d2d2d002d2d2d00ULL,
+       0x7474740074747400ULL, 0x1212120012121200ULL, 0x2b2b2b002b2b2b00ULL,
+       0x2020200020202000ULL, 0xf0f0f000f0f0f000ULL, 0xb1b1b100b1b1b100ULL,
+       0x8484840084848400ULL, 0x9999990099999900ULL, 0xdfdfdf00dfdfdf00ULL,
+       0x4c4c4c004c4c4c00ULL, 0xcbcbcb00cbcbcb00ULL, 0xc2c2c200c2c2c200ULL,
+       0x3434340034343400ULL, 0x7e7e7e007e7e7e00ULL, 0x7676760076767600ULL,
+       0x0505050005050500ULL, 0x6d6d6d006d6d6d00ULL, 0xb7b7b700b7b7b700ULL,
+       0xa9a9a900a9a9a900ULL, 0x3131310031313100ULL, 0xd1d1d100d1d1d100ULL,
+       0x1717170017171700ULL, 0x0404040004040400ULL, 0xd7d7d700d7d7d700ULL,
+       0x1414140014141400ULL, 0x5858580058585800ULL, 0x3a3a3a003a3a3a00ULL,
+       0x6161610061616100ULL, 0xdedede00dedede00ULL, 0x1b1b1b001b1b1b00ULL,
+       0x1111110011111100ULL, 0x1c1c1c001c1c1c00ULL, 0x3232320032323200ULL,
+       0x0f0f0f000f0f0f00ULL, 0x9c9c9c009c9c9c00ULL, 0x1616160016161600ULL,
+       0x5353530053535300ULL, 0x1818180018181800ULL, 0xf2f2f200f2f2f200ULL,
+       0x2222220022222200ULL, 0xfefefe00fefefe00ULL, 0x4444440044444400ULL,
+       0xcfcfcf00cfcfcf00ULL, 0xb2b2b200b2b2b200ULL, 0xc3c3c300c3c3c300ULL,
+       0xb5b5b500b5b5b500ULL, 0x7a7a7a007a7a7a00ULL, 0x9191910091919100ULL,
+       0x2424240024242400ULL, 0x0808080008080800ULL, 0xe8e8e800e8e8e800ULL,
+       0xa8a8a800a8a8a800ULL, 0x6060600060606000ULL, 0xfcfcfc00fcfcfc00ULL,
+       0x6969690069696900ULL, 0x5050500050505000ULL, 0xaaaaaa00aaaaaa00ULL,
+       0xd0d0d000d0d0d000ULL, 0xa0a0a000a0a0a000ULL, 0x7d7d7d007d7d7d00ULL,
+       0xa1a1a100a1a1a100ULL, 0x8989890089898900ULL, 0x6262620062626200ULL,
+       0x9797970097979700ULL, 0x5454540054545400ULL, 0x5b5b5b005b5b5b00ULL,
+       0x1e1e1e001e1e1e00ULL, 0x9595950095959500ULL, 0xe0e0e000e0e0e000ULL,
+       0xffffff00ffffff00ULL, 0x6464640064646400ULL, 0xd2d2d200d2d2d200ULL,
+       0x1010100010101000ULL, 0xc4c4c400c4c4c400ULL, 0x0000000000000000ULL,
+       0x4848480048484800ULL, 0xa3a3a300a3a3a300ULL, 0xf7f7f700f7f7f700ULL,
+       0x7575750075757500ULL, 0xdbdbdb00dbdbdb00ULL, 0x8a8a8a008a8a8a00ULL,
+       0x0303030003030300ULL, 0xe6e6e600e6e6e600ULL, 0xdadada00dadada00ULL,
+       0x0909090009090900ULL, 0x3f3f3f003f3f3f00ULL, 0xdddddd00dddddd00ULL,
+       0x9494940094949400ULL, 0x8787870087878700ULL, 0x5c5c5c005c5c5c00ULL,
+       0x8383830083838300ULL, 0x0202020002020200ULL, 0xcdcdcd00cdcdcd00ULL,
+       0x4a4a4a004a4a4a00ULL, 0x9090900090909000ULL, 0x3333330033333300ULL,
+       0x7373730073737300ULL, 0x6767670067676700ULL, 0xf6f6f600f6f6f600ULL,
+       0xf3f3f300f3f3f300ULL, 0x9d9d9d009d9d9d00ULL, 0x7f7f7f007f7f7f00ULL,
+       0xbfbfbf00bfbfbf00ULL, 0xe2e2e200e2e2e200ULL, 0x5252520052525200ULL,
+       0x9b9b9b009b9b9b00ULL, 0xd8d8d800d8d8d800ULL, 0x2626260026262600ULL,
+       0xc8c8c800c8c8c800ULL, 0x3737370037373700ULL, 0xc6c6c600c6c6c600ULL,
+       0x3b3b3b003b3b3b00ULL, 0x8181810081818100ULL, 0x9696960096969600ULL,
+       0x6f6f6f006f6f6f00ULL, 0x4b4b4b004b4b4b00ULL, 0x1313130013131300ULL,
+       0xbebebe00bebebe00ULL, 0x6363630063636300ULL, 0x2e2e2e002e2e2e00ULL,
+       0xe9e9e900e9e9e900ULL, 0x7979790079797900ULL, 0xa7a7a700a7a7a700ULL,
+       0x8c8c8c008c8c8c00ULL, 0x9f9f9f009f9f9f00ULL, 0x6e6e6e006e6e6e00ULL,
+       0xbcbcbc00bcbcbc00ULL, 0x8e8e8e008e8e8e00ULL, 0x2929290029292900ULL,
+       0xf5f5f500f5f5f500ULL, 0xf9f9f900f9f9f900ULL, 0xb6b6b600b6b6b600ULL,
+       0x2f2f2f002f2f2f00ULL, 0xfdfdfd00fdfdfd00ULL, 0xb4b4b400b4b4b400ULL,
+       0x5959590059595900ULL, 0x7878780078787800ULL, 0x9898980098989800ULL,
+       0x0606060006060600ULL, 0x6a6a6a006a6a6a00ULL, 0xe7e7e700e7e7e700ULL,
+       0x4646460046464600ULL, 0x7171710071717100ULL, 0xbababa00bababa00ULL,
+       0xd4d4d400d4d4d400ULL, 0x2525250025252500ULL, 0xababab00ababab00ULL,
+       0x4242420042424200ULL, 0x8888880088888800ULL, 0xa2a2a200a2a2a200ULL,
+       0x8d8d8d008d8d8d00ULL, 0xfafafa00fafafa00ULL, 0x7272720072727200ULL,
+       0x0707070007070700ULL, 0xb9b9b900b9b9b900ULL, 0x5555550055555500ULL,
+       0xf8f8f800f8f8f800ULL, 0xeeeeee00eeeeee00ULL, 0xacacac00acacac00ULL,
+       0x0a0a0a000a0a0a00ULL, 0x3636360036363600ULL, 0x4949490049494900ULL,
+       0x2a2a2a002a2a2a00ULL, 0x6868680068686800ULL, 0x3c3c3c003c3c3c00ULL,
+       0x3838380038383800ULL, 0xf1f1f100f1f1f100ULL, 0xa4a4a400a4a4a400ULL,
+       0x4040400040404000ULL, 0x2828280028282800ULL, 0xd3d3d300d3d3d300ULL,
+       0x7b7b7b007b7b7b00ULL, 0xbbbbbb00bbbbbb00ULL, 0xc9c9c900c9c9c900ULL,
+       0x4343430043434300ULL, 0xc1c1c100c1c1c100ULL, 0x1515150015151500ULL,
+       0xe3e3e300e3e3e300ULL, 0xadadad00adadad00ULL, 0xf4f4f400f4f4f400ULL,
+       0x7777770077777700ULL, 0xc7c7c700c7c7c700ULL, 0x8080800080808000ULL,
+       0x9e9e9e009e9e9e00ULL,
 };
 
 /* key constants */
@@ -1601,7 +1601,6 @@ static struct crypto_alg camellia_algs[6] = { {
        .cra_ctxsize            = sizeof(struct camellia_ctx),
        .cra_alignmask          = 0,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(camellia_algs[0].cra_list),
        .cra_u                  = {
                .cipher = {
                        .cia_min_keysize = CAMELLIA_MIN_KEY_SIZE,
@@ -1621,7 +1620,6 @@ static struct crypto_alg camellia_algs[6] = { {
        .cra_alignmask          = 0,
        .cra_type               = &crypto_blkcipher_type,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(camellia_algs[1].cra_list),
        .cra_u = {
                .blkcipher = {
                        .min_keysize    = CAMELLIA_MIN_KEY_SIZE,
@@ -1641,7 +1639,6 @@ static struct crypto_alg camellia_algs[6] = { {
        .cra_alignmask          = 0,
        .cra_type               = &crypto_blkcipher_type,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(camellia_algs[2].cra_list),
        .cra_u = {
                .blkcipher = {
                        .min_keysize    = CAMELLIA_MIN_KEY_SIZE,
@@ -1662,7 +1659,6 @@ static struct crypto_alg camellia_algs[6] = { {
        .cra_alignmask          = 0,
        .cra_type               = &crypto_blkcipher_type,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(camellia_algs[3].cra_list),
        .cra_u = {
                .blkcipher = {
                        .min_keysize    = CAMELLIA_MIN_KEY_SIZE,
@@ -1683,7 +1679,6 @@ static struct crypto_alg camellia_algs[6] = { {
        .cra_alignmask          = 0,
        .cra_type               = &crypto_blkcipher_type,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(camellia_algs[4].cra_list),
        .cra_exit               = lrw_exit_tfm,
        .cra_u = {
                .blkcipher = {
@@ -1707,7 +1702,6 @@ static struct crypto_alg camellia_algs[6] = { {
        .cra_alignmask          = 0,
        .cra_type               = &crypto_blkcipher_type,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(camellia_algs[5].cra_list),
        .cra_u = {
                .blkcipher = {
                        .min_keysize    = CAMELLIA_MIN_KEY_SIZE * 2,
diff --git a/arch/x86/crypto/cast5-avx-x86_64-asm_64.S b/arch/x86/crypto/cast5-avx-x86_64-asm_64.S
new file mode 100644 (file)
index 0000000..a41a3aa
--- /dev/null
@@ -0,0 +1,376 @@
+/*
+ * Cast5 Cipher 16-way parallel algorithm (AVX/x86_64)
+ *
+ * Copyright (C) 2012 Johannes Goetzfried
+ *     <Johannes.Goetzfried@informatik.stud.uni-erlangen.de>
+ *
+ * Copyright Â© 2012 Jussi Kivilinna <jussi.kivilinna@mbnet.fi>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
+ * USA
+ *
+ */
+
+.file "cast5-avx-x86_64-asm_64.S"
+
+.extern cast5_s1
+.extern cast5_s2
+.extern cast5_s3
+.extern cast5_s4
+
+/* structure of crypto context */
+#define km     0
+#define kr     (16*4)
+#define rr     ((16*4)+16)
+
+/* s-boxes */
+#define s1     cast5_s1
+#define s2     cast5_s2
+#define s3     cast5_s3
+#define s4     cast5_s4
+
+/**********************************************************************
+  16-way AVX cast5
+ **********************************************************************/
+#define CTX %rdi
+
+#define RL1 %xmm0
+#define RR1 %xmm1
+#define RL2 %xmm2
+#define RR2 %xmm3
+#define RL3 %xmm4
+#define RR3 %xmm5
+#define RL4 %xmm6
+#define RR4 %xmm7
+
+#define RX %xmm8
+
+#define RKM  %xmm9
+#define RKR  %xmm10
+#define RKRF %xmm11
+#define RKRR %xmm12
+
+#define R32  %xmm13
+#define R1ST %xmm14
+
+#define RTMP %xmm15
+
+#define RID1  %rbp
+#define RID1d %ebp
+#define RID2  %rsi
+#define RID2d %esi
+
+#define RGI1   %rdx
+#define RGI1bl %dl
+#define RGI1bh %dh
+#define RGI2   %rcx
+#define RGI2bl %cl
+#define RGI2bh %ch
+
+#define RGI3   %rax
+#define RGI3bl %al
+#define RGI3bh %ah
+#define RGI4   %rbx
+#define RGI4bl %bl
+#define RGI4bh %bh
+
+#define RFS1  %r8
+#define RFS1d %r8d
+#define RFS2  %r9
+#define RFS2d %r9d
+#define RFS3  %r10
+#define RFS3d %r10d
+
+
+#define lookup_32bit(src, dst, op1, op2, op3, interleave_op, il_reg) \
+       movzbl          src ## bh,     RID1d;    \
+       movzbl          src ## bl,     RID2d;    \
+       shrq $16,       src;                     \
+       movl            s1(, RID1, 4), dst ## d; \
+       op1             s2(, RID2, 4), dst ## d; \
+       movzbl          src ## bh,     RID1d;    \
+       movzbl          src ## bl,     RID2d;    \
+       interleave_op(il_reg);                   \
+       op2             s3(, RID1, 4), dst ## d; \
+       op3             s4(, RID2, 4), dst ## d;
+
+#define dummy(d) /* do nothing */
+
+#define shr_next(reg) \
+       shrq $16,       reg;
+
+#define F_head(a, x, gi1, gi2, op0) \
+       op0     a,      RKM,  x;                 \
+       vpslld  RKRF,   x,    RTMP;              \
+       vpsrld  RKRR,   x,    x;                 \
+       vpor    RTMP,   x,    x;                 \
+       \
+       vmovq           x,    gi1;               \
+       vpextrq $1,     x,    gi2;
+
+#define F_tail(a, x, gi1, gi2, op1, op2, op3) \
+       lookup_32bit(##gi1, RFS1, op1, op2, op3, shr_next, ##gi1); \
+       lookup_32bit(##gi2, RFS3, op1, op2, op3, shr_next, ##gi2); \
+       \
+       lookup_32bit(##gi1, RFS2, op1, op2, op3, dummy, none);     \
+       shlq $32,       RFS2;                                      \
+       orq             RFS1, RFS2;                                \
+       lookup_32bit(##gi2, RFS1, op1, op2, op3, dummy, none);     \
+       shlq $32,       RFS1;                                      \
+       orq             RFS1, RFS3;                                \
+       \
+       vmovq           RFS2, x;                                   \
+       vpinsrq $1,     RFS3, x, x;
+
+#define F_2(a1, b1, a2, b2, op0, op1, op2, op3) \
+       F_head(b1, RX, RGI1, RGI2, op0);              \
+       F_head(b2, RX, RGI3, RGI4, op0);              \
+       \
+       F_tail(b1, RX, RGI1, RGI2, op1, op2, op3);    \
+       F_tail(b2, RTMP, RGI3, RGI4, op1, op2, op3);  \
+       \
+       vpxor           a1, RX,   a1;                 \
+       vpxor           a2, RTMP, a2;
+
+#define F1_2(a1, b1, a2, b2) \
+       F_2(a1, b1, a2, b2, vpaddd, xorl, subl, addl)
+#define F2_2(a1, b1, a2, b2) \
+       F_2(a1, b1, a2, b2, vpxor, subl, addl, xorl)
+#define F3_2(a1, b1, a2, b2) \
+       F_2(a1, b1, a2, b2, vpsubd, addl, xorl, subl)
+
+#define subround(a1, b1, a2, b2, f) \
+       F ## f ## _2(a1, b1, a2, b2);
+
+#define round(l, r, n, f) \
+       vbroadcastss    (km+(4*n))(CTX), RKM;        \
+       vpand           R1ST,            RKR,  RKRF; \
+       vpsubq          RKRF,            R32,  RKRR; \
+       vpsrldq $1,     RKR,             RKR;        \
+       subround(l ## 1, r ## 1, l ## 2, r ## 2, f); \
+       subround(l ## 3, r ## 3, l ## 4, r ## 4, f);
+
+#define enc_preload_rkr() \
+       vbroadcastss    .L16_mask,                RKR;      \
+       /* add 16-bit rotation to key rotations (mod 32) */ \
+       vpxor           kr(CTX),                  RKR, RKR;
+
+#define dec_preload_rkr() \
+       vbroadcastss    .L16_mask,                RKR;      \
+       /* add 16-bit rotation to key rotations (mod 32) */ \
+       vpxor           kr(CTX),                  RKR, RKR; \
+       vpshufb         .Lbswap128_mask,          RKR, RKR;
+
+#define transpose_2x4(x0, x1, t0, t1) \
+       vpunpckldq              x1, x0, t0; \
+       vpunpckhdq              x1, x0, t1; \
+       \
+       vpunpcklqdq             t1, t0, x0; \
+       vpunpckhqdq             t1, t0, x1;
+
+#define inpack_blocks(in, x0, x1, t0, t1, rmask) \
+       vmovdqu (0*4*4)(in),    x0; \
+       vmovdqu (1*4*4)(in),    x1; \
+       vpshufb rmask,  x0,     x0; \
+       vpshufb rmask,  x1,     x1; \
+       \
+       transpose_2x4(x0, x1, t0, t1)
+
+#define outunpack_blocks(out, x0, x1, t0, t1, rmask) \
+       transpose_2x4(x0, x1, t0, t1) \
+       \
+       vpshufb rmask,  x0, x0;           \
+       vpshufb rmask,  x1, x1;           \
+       vmovdqu         x0, (0*4*4)(out); \
+       vmovdqu         x1, (1*4*4)(out);
+
+#define outunpack_xor_blocks(out, x0, x1, t0, t1, rmask) \
+       transpose_2x4(x0, x1, t0, t1) \
+       \
+       vpshufb rmask,  x0, x0;               \
+       vpshufb rmask,  x1, x1;               \
+       vpxor           (0*4*4)(out), x0, x0; \
+       vmovdqu         x0, (0*4*4)(out);     \
+       vpxor           (1*4*4)(out), x1, x1; \
+       vmovdqu         x1, (1*4*4)(out);
+
+.data
+
+.align 16
+.Lbswap_mask:
+       .byte 3, 2, 1, 0, 7, 6, 5, 4, 11, 10, 9, 8, 15, 14, 13, 12
+.Lbswap128_mask:
+       .byte 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
+.L16_mask:
+       .byte 16, 16, 16, 16
+.L32_mask:
+       .byte 32, 0, 0, 0
+.Lfirst_mask:
+       .byte 0x1f, 0, 0, 0
+
+.text
+
+.align 16
+.global __cast5_enc_blk_16way
+.type   __cast5_enc_blk_16way,@function;
+
+__cast5_enc_blk_16way:
+       /* input:
+        *      %rdi: ctx, CTX
+        *      %rsi: dst
+        *      %rdx: src
+        *      %rcx: bool, if true: xor output
+        */
+
+       pushq %rbp;
+       pushq %rbx;
+       pushq %rcx;
+
+       vmovdqa .Lbswap_mask, RKM;
+       vmovd .Lfirst_mask, R1ST;
+       vmovd .L32_mask, R32;
+       enc_preload_rkr();
+
+       leaq 1*(2*4*4)(%rdx), %rax;
+       inpack_blocks(%rdx, RL1, RR1, RTMP, RX, RKM);
+       inpack_blocks(%rax, RL2, RR2, RTMP, RX, RKM);
+       leaq 2*(2*4*4)(%rdx), %rax;
+       inpack_blocks(%rax, RL3, RR3, RTMP, RX, RKM);
+       leaq 3*(2*4*4)(%rdx), %rax;
+       inpack_blocks(%rax, RL4, RR4, RTMP, RX, RKM);
+
+       movq %rsi, %r11;
+
+       round(RL, RR, 0, 1);
+       round(RR, RL, 1, 2);
+       round(RL, RR, 2, 3);
+       round(RR, RL, 3, 1);
+       round(RL, RR, 4, 2);
+       round(RR, RL, 5, 3);
+       round(RL, RR, 6, 1);
+       round(RR, RL, 7, 2);
+       round(RL, RR, 8, 3);
+       round(RR, RL, 9, 1);
+       round(RL, RR, 10, 2);
+       round(RR, RL, 11, 3);
+
+       movzbl rr(CTX), %eax;
+       testl %eax, %eax;
+       jnz __skip_enc;
+
+       round(RL, RR, 12, 1);
+       round(RR, RL, 13, 2);
+       round(RL, RR, 14, 3);
+       round(RR, RL, 15, 1);
+
+__skip_enc:
+       popq %rcx;
+       popq %rbx;
+       popq %rbp;
+
+       vmovdqa .Lbswap_mask, RKM;
+       leaq 1*(2*4*4)(%r11), %rax;
+
+       testb %cl, %cl;
+       jnz __enc_xor16;
+
+       outunpack_blocks(%r11, RR1, RL1, RTMP, RX, RKM);
+       outunpack_blocks(%rax, RR2, RL2, RTMP, RX, RKM);
+       leaq 2*(2*4*4)(%r11), %rax;
+       outunpack_blocks(%rax, RR3, RL3, RTMP, RX, RKM);
+       leaq 3*(2*4*4)(%r11), %rax;
+       outunpack_blocks(%rax, RR4, RL4, RTMP, RX, RKM);
+
+       ret;
+
+__enc_xor16:
+       outunpack_xor_blocks(%r11, RR1, RL1, RTMP, RX, RKM);
+       outunpack_xor_blocks(%rax, RR2, RL2, RTMP, RX, RKM);
+       leaq 2*(2*4*4)(%r11), %rax;
+       outunpack_xor_blocks(%rax, RR3, RL3, RTMP, RX, RKM);
+       leaq 3*(2*4*4)(%r11), %rax;
+       outunpack_xor_blocks(%rax, RR4, RL4, RTMP, RX, RKM);
+
+       ret;
+
+.align 16
+.global cast5_dec_blk_16way
+.type   cast5_dec_blk_16way,@function;
+
+cast5_dec_blk_16way:
+       /* input:
+        *      %rdi: ctx, CTX
+        *      %rsi: dst
+        *      %rdx: src
+        */
+
+       pushq %rbp;
+       pushq %rbx;
+
+       vmovdqa .Lbswap_mask, RKM;
+       vmovd .Lfirst_mask, R1ST;
+       vmovd .L32_mask, R32;
+       dec_preload_rkr();
+
+       leaq 1*(2*4*4)(%rdx), %rax;
+       inpack_blocks(%rdx, RL1, RR1, RTMP, RX, RKM);
+       inpack_blocks(%rax, RL2, RR2, RTMP, RX, RKM);
+       leaq 2*(2*4*4)(%rdx), %rax;
+       inpack_blocks(%rax, RL3, RR3, RTMP, RX, RKM);
+       leaq 3*(2*4*4)(%rdx), %rax;
+       inpack_blocks(%rax, RL4, RR4, RTMP, RX, RKM);
+
+       movq %rsi, %r11;
+
+       movzbl rr(CTX), %eax;
+       testl %eax, %eax;
+       jnz __skip_dec;
+
+       round(RL, RR, 15, 1);
+       round(RR, RL, 14, 3);
+       round(RL, RR, 13, 2);
+       round(RR, RL, 12, 1);
+
+__dec_tail:
+       round(RL, RR, 11, 3);
+       round(RR, RL, 10, 2);
+       round(RL, RR, 9, 1);
+       round(RR, RL, 8, 3);
+       round(RL, RR, 7, 2);
+       round(RR, RL, 6, 1);
+       round(RL, RR, 5, 3);
+       round(RR, RL, 4, 2);
+       round(RL, RR, 3, 1);
+       round(RR, RL, 2, 3);
+       round(RL, RR, 1, 2);
+       round(RR, RL, 0, 1);
+
+       vmovdqa .Lbswap_mask, RKM;
+       popq %rbx;
+       popq %rbp;
+
+       leaq 1*(2*4*4)(%r11), %rax;
+       outunpack_blocks(%r11, RR1, RL1, RTMP, RX, RKM);
+       outunpack_blocks(%rax, RR2, RL2, RTMP, RX, RKM);
+       leaq 2*(2*4*4)(%r11), %rax;
+       outunpack_blocks(%rax, RR3, RL3, RTMP, RX, RKM);
+       leaq 3*(2*4*4)(%r11), %rax;
+       outunpack_blocks(%rax, RR4, RL4, RTMP, RX, RKM);
+
+       ret;
+
+__skip_dec:
+       vpsrldq $4, RKR, RKR;
+       jmp __dec_tail;
diff --git a/arch/x86/crypto/cast5_avx_glue.c b/arch/x86/crypto/cast5_avx_glue.c
new file mode 100644 (file)
index 0000000..e0ea14f
--- /dev/null
@@ -0,0 +1,530 @@
+/*
+ * Glue Code for the AVX assembler implemention of the Cast5 Cipher
+ *
+ * Copyright (C) 2012 Johannes Goetzfried
+ *     <Johannes.Goetzfried@informatik.stud.uni-erlangen.de>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
+ * USA
+ *
+ */
+
+#include <linux/module.h>
+#include <linux/hardirq.h>
+#include <linux/types.h>
+#include <linux/crypto.h>
+#include <linux/err.h>
+#include <crypto/algapi.h>
+#include <crypto/cast5.h>
+#include <crypto/cryptd.h>
+#include <crypto/ctr.h>
+#include <asm/xcr.h>
+#include <asm/xsave.h>
+#include <asm/crypto/ablk_helper.h>
+#include <asm/crypto/glue_helper.h>
+
+#define CAST5_PARALLEL_BLOCKS 16
+
+asmlinkage void __cast5_enc_blk_16way(struct cast5_ctx *ctx, u8 *dst,
+                                     const u8 *src, bool xor);
+asmlinkage void cast5_dec_blk_16way(struct cast5_ctx *ctx, u8 *dst,
+                                   const u8 *src);
+
+static inline void cast5_enc_blk_xway(struct cast5_ctx *ctx, u8 *dst,
+                                     const u8 *src)
+{
+       __cast5_enc_blk_16way(ctx, dst, src, false);
+}
+
+static inline void cast5_enc_blk_xway_xor(struct cast5_ctx *ctx, u8 *dst,
+                                         const u8 *src)
+{
+       __cast5_enc_blk_16way(ctx, dst, src, true);
+}
+
+static inline void cast5_dec_blk_xway(struct cast5_ctx *ctx, u8 *dst,
+                                     const u8 *src)
+{
+       cast5_dec_blk_16way(ctx, dst, src);
+}
+
+
+static inline bool cast5_fpu_begin(bool fpu_enabled, unsigned int nbytes)
+{
+       return glue_fpu_begin(CAST5_BLOCK_SIZE, CAST5_PARALLEL_BLOCKS,
+                             NULL, fpu_enabled, nbytes);
+}
+
+static inline void cast5_fpu_end(bool fpu_enabled)
+{
+       return glue_fpu_end(fpu_enabled);
+}
+
+static int ecb_crypt(struct blkcipher_desc *desc, struct blkcipher_walk *walk,
+                    bool enc)
+{
+       bool fpu_enabled = false;
+       struct cast5_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
+       const unsigned int bsize = CAST5_BLOCK_SIZE;
+       unsigned int nbytes;
+       int err;
+
+       err = blkcipher_walk_virt(desc, walk);
+       desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
+
+       while ((nbytes = walk->nbytes)) {
+               u8 *wsrc = walk->src.virt.addr;
+               u8 *wdst = walk->dst.virt.addr;
+
+               fpu_enabled = cast5_fpu_begin(fpu_enabled, nbytes);
+
+               /* Process multi-block batch */
+               if (nbytes >= bsize * CAST5_PARALLEL_BLOCKS) {
+                       do {
+                               if (enc)
+                                       cast5_enc_blk_xway(ctx, wdst, wsrc);
+                               else
+                                       cast5_dec_blk_xway(ctx, wdst, wsrc);
+
+                               wsrc += bsize * CAST5_PARALLEL_BLOCKS;
+                               wdst += bsize * CAST5_PARALLEL_BLOCKS;
+                               nbytes -= bsize * CAST5_PARALLEL_BLOCKS;
+                       } while (nbytes >= bsize * CAST5_PARALLEL_BLOCKS);
+
+                       if (nbytes < bsize)
+                               goto done;
+               }
+
+               /* Handle leftovers */
+               do {
+                       if (enc)
+                               __cast5_encrypt(ctx, wdst, wsrc);
+                       else
+                               __cast5_decrypt(ctx, wdst, wsrc);
+
+                       wsrc += bsize;
+                       wdst += bsize;
+                       nbytes -= bsize;
+               } while (nbytes >= bsize);
+
+done:
+               err = blkcipher_walk_done(desc, walk, nbytes);
+       }
+
+       cast5_fpu_end(fpu_enabled);
+       return err;
+}
+
+static int ecb_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
+                      struct scatterlist *src, unsigned int nbytes)
+{
+       struct blkcipher_walk walk;
+
+       blkcipher_walk_init(&walk, dst, src, nbytes);
+       return ecb_crypt(desc, &walk, true);
+}
+
+static int ecb_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
+                      struct scatterlist *src, unsigned int nbytes)
+{
+       struct blkcipher_walk walk;
+
+       blkcipher_walk_init(&walk, dst, src, nbytes);
+       return ecb_crypt(desc, &walk, false);
+}
+
+static unsigned int __cbc_encrypt(struct blkcipher_desc *desc,
+                                 struct blkcipher_walk *walk)
+{
+       struct cast5_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
+       const unsigned int bsize = CAST5_BLOCK_SIZE;
+       unsigned int nbytes = walk->nbytes;
+       u64 *src = (u64 *)walk->src.virt.addr;
+       u64 *dst = (u64 *)walk->dst.virt.addr;
+       u64 *iv = (u64 *)walk->iv;
+
+       do {
+               *dst = *src ^ *iv;
+               __cast5_encrypt(ctx, (u8 *)dst, (u8 *)dst);
+               iv = dst;
+
+               src += 1;
+               dst += 1;
+               nbytes -= bsize;
+       } while (nbytes >= bsize);
+
+       *(u64 *)walk->iv = *iv;
+       return nbytes;
+}
+
+static int cbc_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
+                      struct scatterlist *src, unsigned int nbytes)
+{
+       struct blkcipher_walk walk;
+       int err;
+
+       blkcipher_walk_init(&walk, dst, src, nbytes);
+       err = blkcipher_walk_virt(desc, &walk);
+
+       while ((nbytes = walk.nbytes)) {
+               nbytes = __cbc_encrypt(desc, &walk);
+               err = blkcipher_walk_done(desc, &walk, nbytes);
+       }
+
+       return err;
+}
+
+static unsigned int __cbc_decrypt(struct blkcipher_desc *desc,
+                                 struct blkcipher_walk *walk)
+{
+       struct cast5_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
+       const unsigned int bsize = CAST5_BLOCK_SIZE;
+       unsigned int nbytes = walk->nbytes;
+       u64 *src = (u64 *)walk->src.virt.addr;
+       u64 *dst = (u64 *)walk->dst.virt.addr;
+       u64 ivs[CAST5_PARALLEL_BLOCKS - 1];
+       u64 last_iv;
+       int i;
+
+       /* Start of the last block. */
+       src += nbytes / bsize - 1;
+       dst += nbytes / bsize - 1;
+
+       last_iv = *src;
+
+       /* Process multi-block batch */
+       if (nbytes >= bsize * CAST5_PARALLEL_BLOCKS) {
+               do {
+                       nbytes -= bsize * (CAST5_PARALLEL_BLOCKS - 1);
+                       src -= CAST5_PARALLEL_BLOCKS - 1;
+                       dst -= CAST5_PARALLEL_BLOCKS - 1;
+
+                       for (i = 0; i < CAST5_PARALLEL_BLOCKS - 1; i++)
+                               ivs[i] = src[i];
+
+                       cast5_dec_blk_xway(ctx, (u8 *)dst, (u8 *)src);
+
+                       for (i = 0; i < CAST5_PARALLEL_BLOCKS - 1; i++)
+                               *(dst + (i + 1)) ^= *(ivs + i);
+
+                       nbytes -= bsize;
+                       if (nbytes < bsize)
+                               goto done;
+
+                       *dst ^= *(src - 1);
+                       src -= 1;
+                       dst -= 1;
+               } while (nbytes >= bsize * CAST5_PARALLEL_BLOCKS);
+
+               if (nbytes < bsize)
+                       goto done;
+       }
+
+       /* Handle leftovers */
+       for (;;) {
+               __cast5_decrypt(ctx, (u8 *)dst, (u8 *)src);
+
+               nbytes -= bsize;
+               if (nbytes < bsize)
+                       break;
+
+               *dst ^= *(src - 1);
+               src -= 1;
+               dst -= 1;
+       }
+
+done:
+       *dst ^= *(u64 *)walk->iv;
+       *(u64 *)walk->iv = last_iv;
+
+       return nbytes;
+}
+
+static int cbc_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
+                      struct scatterlist *src, unsigned int nbytes)
+{
+       bool fpu_enabled = false;
+       struct blkcipher_walk walk;
+       int err;
+
+       blkcipher_walk_init(&walk, dst, src, nbytes);
+       err = blkcipher_walk_virt(desc, &walk);
+       desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
+
+       while ((nbytes = walk.nbytes)) {
+               fpu_enabled = cast5_fpu_begin(fpu_enabled, nbytes);
+               nbytes = __cbc_decrypt(desc, &walk);
+               err = blkcipher_walk_done(desc, &walk, nbytes);
+       }
+
+       cast5_fpu_end(fpu_enabled);
+       return err;
+}
+
+static void ctr_crypt_final(struct blkcipher_desc *desc,
+                           struct blkcipher_walk *walk)
+{
+       struct cast5_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
+       u8 *ctrblk = walk->iv;
+       u8 keystream[CAST5_BLOCK_SIZE];
+       u8 *src = walk->src.virt.addr;
+       u8 *dst = walk->dst.virt.addr;
+       unsigned int nbytes = walk->nbytes;
+
+       __cast5_encrypt(ctx, keystream, ctrblk);
+       crypto_xor(keystream, src, nbytes);
+       memcpy(dst, keystream, nbytes);
+
+       crypto_inc(ctrblk, CAST5_BLOCK_SIZE);
+}
+
+static unsigned int __ctr_crypt(struct blkcipher_desc *desc,
+                               struct blkcipher_walk *walk)
+{
+       struct cast5_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
+       const unsigned int bsize = CAST5_BLOCK_SIZE;
+       unsigned int nbytes = walk->nbytes;
+       u64 *src = (u64 *)walk->src.virt.addr;
+       u64 *dst = (u64 *)walk->dst.virt.addr;
+       u64 ctrblk = be64_to_cpu(*(__be64 *)walk->iv);
+       __be64 ctrblocks[CAST5_PARALLEL_BLOCKS];
+       int i;
+
+       /* Process multi-block batch */
+       if (nbytes >= bsize * CAST5_PARALLEL_BLOCKS) {
+               do {
+                       /* create ctrblks for parallel encrypt */
+                       for (i = 0; i < CAST5_PARALLEL_BLOCKS; i++) {
+                               if (dst != src)
+                                       dst[i] = src[i];
+
+                               ctrblocks[i] = cpu_to_be64(ctrblk++);
+                       }
+
+                       cast5_enc_blk_xway_xor(ctx, (u8 *)dst,
+                                              (u8 *)ctrblocks);
+
+                       src += CAST5_PARALLEL_BLOCKS;
+                       dst += CAST5_PARALLEL_BLOCKS;
+                       nbytes -= bsize * CAST5_PARALLEL_BLOCKS;
+               } while (nbytes >= bsize * CAST5_PARALLEL_BLOCKS);
+
+               if (nbytes < bsize)
+                       goto done;
+       }
+
+       /* Handle leftovers */
+       do {
+               if (dst != src)
+                       *dst = *src;
+
+               ctrblocks[0] = cpu_to_be64(ctrblk++);
+
+               __cast5_encrypt(ctx, (u8 *)ctrblocks, (u8 *)ctrblocks);
+               *dst ^= ctrblocks[0];
+
+               src += 1;
+               dst += 1;
+               nbytes -= bsize;
+       } while (nbytes >= bsize);
+
+done:
+       *(__be64 *)walk->iv = cpu_to_be64(ctrblk);
+       return nbytes;
+}
+
+static int ctr_crypt(struct blkcipher_desc *desc, struct scatterlist *dst,
+                    struct scatterlist *src, unsigned int nbytes)
+{
+       bool fpu_enabled = false;
+       struct blkcipher_walk walk;
+       int err;
+
+       blkcipher_walk_init(&walk, dst, src, nbytes);
+       err = blkcipher_walk_virt_block(desc, &walk, CAST5_BLOCK_SIZE);
+       desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
+
+       while ((nbytes = walk.nbytes) >= CAST5_BLOCK_SIZE) {
+               fpu_enabled = cast5_fpu_begin(fpu_enabled, nbytes);
+               nbytes = __ctr_crypt(desc, &walk);
+               err = blkcipher_walk_done(desc, &walk, nbytes);
+       }
+
+       cast5_fpu_end(fpu_enabled);
+
+       if (walk.nbytes) {
+               ctr_crypt_final(desc, &walk);
+               err = blkcipher_walk_done(desc, &walk, 0);
+       }
+
+       return err;
+}
+
+
+static struct crypto_alg cast5_algs[6] = { {
+       .cra_name               = "__ecb-cast5-avx",
+       .cra_driver_name        = "__driver-ecb-cast5-avx",
+       .cra_priority           = 0,
+       .cra_flags              = CRYPTO_ALG_TYPE_BLKCIPHER,
+       .cra_blocksize          = CAST5_BLOCK_SIZE,
+       .cra_ctxsize            = sizeof(struct cast5_ctx),
+       .cra_alignmask          = 0,
+       .cra_type               = &crypto_blkcipher_type,
+       .cra_module             = THIS_MODULE,
+       .cra_u = {
+               .blkcipher = {
+                       .min_keysize    = CAST5_MIN_KEY_SIZE,
+                       .max_keysize    = CAST5_MAX_KEY_SIZE,
+                       .setkey         = cast5_setkey,
+                       .encrypt        = ecb_encrypt,
+                       .decrypt        = ecb_decrypt,
+               },
+       },
+}, {
+       .cra_name               = "__cbc-cast5-avx",
+       .cra_driver_name        = "__driver-cbc-cast5-avx",
+       .cra_priority           = 0,
+       .cra_flags              = CRYPTO_ALG_TYPE_BLKCIPHER,
+       .cra_blocksize          = CAST5_BLOCK_SIZE,
+       .cra_ctxsize            = sizeof(struct cast5_ctx),
+       .cra_alignmask          = 0,
+       .cra_type               = &crypto_blkcipher_type,
+       .cra_module             = THIS_MODULE,
+       .cra_u = {
+               .blkcipher = {
+                       .min_keysize    = CAST5_MIN_KEY_SIZE,
+                       .max_keysize    = CAST5_MAX_KEY_SIZE,
+                       .setkey         = cast5_setkey,
+                       .encrypt        = cbc_encrypt,
+                       .decrypt        = cbc_decrypt,
+               },
+       },
+}, {
+       .cra_name               = "__ctr-cast5-avx",
+       .cra_driver_name        = "__driver-ctr-cast5-avx",
+       .cra_priority           = 0,
+       .cra_flags              = CRYPTO_ALG_TYPE_BLKCIPHER,
+       .cra_blocksize          = 1,
+       .cra_ctxsize            = sizeof(struct cast5_ctx),
+       .cra_alignmask          = 0,
+       .cra_type               = &crypto_blkcipher_type,
+       .cra_module             = THIS_MODULE,
+       .cra_u = {
+               .blkcipher = {
+                       .min_keysize    = CAST5_MIN_KEY_SIZE,
+                       .max_keysize    = CAST5_MAX_KEY_SIZE,
+                       .ivsize         = CAST5_BLOCK_SIZE,
+                       .setkey         = cast5_setkey,
+                       .encrypt        = ctr_crypt,
+                       .decrypt        = ctr_crypt,
+               },
+       },
+}, {
+       .cra_name               = "ecb(cast5)",
+       .cra_driver_name        = "ecb-cast5-avx",
+       .cra_priority           = 200,
+       .cra_flags              = CRYPTO_ALG_TYPE_ABLKCIPHER | CRYPTO_ALG_ASYNC,
+       .cra_blocksize          = CAST5_BLOCK_SIZE,
+       .cra_ctxsize            = sizeof(struct async_helper_ctx),
+       .cra_alignmask          = 0,
+       .cra_type               = &crypto_ablkcipher_type,
+       .cra_module             = THIS_MODULE,
+       .cra_init               = ablk_init,
+       .cra_exit               = ablk_exit,
+       .cra_u = {
+               .ablkcipher = {
+                       .min_keysize    = CAST5_MIN_KEY_SIZE,
+                       .max_keysize    = CAST5_MAX_KEY_SIZE,
+                       .setkey         = ablk_set_key,
+                       .encrypt        = ablk_encrypt,
+                       .decrypt        = ablk_decrypt,
+               },
+       },
+}, {
+       .cra_name               = "cbc(cast5)",
+       .cra_driver_name        = "cbc-cast5-avx",
+       .cra_priority           = 200,
+       .cra_flags              = CRYPTO_ALG_TYPE_ABLKCIPHER | CRYPTO_ALG_ASYNC,
+       .cra_blocksize          = CAST5_BLOCK_SIZE,
+       .cra_ctxsize            = sizeof(struct async_helper_ctx),
+       .cra_alignmask          = 0,
+       .cra_type               = &crypto_ablkcipher_type,
+       .cra_module             = THIS_MODULE,
+       .cra_init               = ablk_init,
+       .cra_exit               = ablk_exit,
+       .cra_u = {
+               .ablkcipher = {
+                       .min_keysize    = CAST5_MIN_KEY_SIZE,
+                       .max_keysize    = CAST5_MAX_KEY_SIZE,
+                       .ivsize         = CAST5_BLOCK_SIZE,
+                       .setkey         = ablk_set_key,
+                       .encrypt        = __ablk_encrypt,
+                       .decrypt        = ablk_decrypt,
+               },
+       },
+}, {
+       .cra_name               = "ctr(cast5)",
+       .cra_driver_name        = "ctr-cast5-avx",
+       .cra_priority           = 200,
+       .cra_flags              = CRYPTO_ALG_TYPE_ABLKCIPHER | CRYPTO_ALG_ASYNC,
+       .cra_blocksize          = 1,
+       .cra_ctxsize            = sizeof(struct async_helper_ctx),
+       .cra_alignmask          = 0,
+       .cra_type               = &crypto_ablkcipher_type,
+       .cra_module             = THIS_MODULE,
+       .cra_init               = ablk_init,
+       .cra_exit               = ablk_exit,
+       .cra_u = {
+               .ablkcipher = {
+                       .min_keysize    = CAST5_MIN_KEY_SIZE,
+                       .max_keysize    = CAST5_MAX_KEY_SIZE,
+                       .ivsize         = CAST5_BLOCK_SIZE,
+                       .setkey         = ablk_set_key,
+                       .encrypt        = ablk_encrypt,
+                       .decrypt        = ablk_encrypt,
+                       .geniv          = "chainiv",
+               },
+       },
+} };
+
+static int __init cast5_init(void)
+{
+       u64 xcr0;
+
+       if (!cpu_has_avx || !cpu_has_osxsave) {
+               pr_info("AVX instructions are not detected.\n");
+               return -ENODEV;
+       }
+
+       xcr0 = xgetbv(XCR_XFEATURE_ENABLED_MASK);
+       if ((xcr0 & (XSTATE_SSE | XSTATE_YMM)) != (XSTATE_SSE | XSTATE_YMM)) {
+               pr_info("AVX detected but unusable.\n");
+               return -ENODEV;
+       }
+
+       return crypto_register_algs(cast5_algs, ARRAY_SIZE(cast5_algs));
+}
+
+static void __exit cast5_exit(void)
+{
+       crypto_unregister_algs(cast5_algs, ARRAY_SIZE(cast5_algs));
+}
+
+module_init(cast5_init);
+module_exit(cast5_exit);
+
+MODULE_DESCRIPTION("Cast5 Cipher Algorithm, AVX optimized");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("cast5");
diff --git a/arch/x86/crypto/cast6-avx-x86_64-asm_64.S b/arch/x86/crypto/cast6-avx-x86_64-asm_64.S
new file mode 100644 (file)
index 0000000..218d283
--- /dev/null
@@ -0,0 +1,383 @@
+/*
+ * Cast6 Cipher 8-way parallel algorithm (AVX/x86_64)
+ *
+ * Copyright (C) 2012 Johannes Goetzfried
+ *     <Johannes.Goetzfried@informatik.stud.uni-erlangen.de>
+ *
+ * Copyright Â© 2012 Jussi Kivilinna <jussi.kivilinna@mbnet.fi>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
+ * USA
+ *
+ */
+
+.file "cast6-avx-x86_64-asm_64.S"
+
+.extern cast6_s1
+.extern cast6_s2
+.extern cast6_s3
+.extern cast6_s4
+
+/* structure of crypto context */
+#define km     0
+#define kr     (12*4*4)
+
+/* s-boxes */
+#define s1     cast6_s1
+#define s2     cast6_s2
+#define s3     cast6_s3
+#define s4     cast6_s4
+
+/**********************************************************************
+  8-way AVX cast6
+ **********************************************************************/
+#define CTX %rdi
+
+#define RA1 %xmm0
+#define RB1 %xmm1
+#define RC1 %xmm2
+#define RD1 %xmm3
+
+#define RA2 %xmm4
+#define RB2 %xmm5
+#define RC2 %xmm6
+#define RD2 %xmm7
+
+#define RX  %xmm8
+
+#define RKM  %xmm9
+#define RKR  %xmm10
+#define RKRF %xmm11
+#define RKRR %xmm12
+#define R32  %xmm13
+#define R1ST %xmm14
+
+#define RTMP %xmm15
+
+#define RID1  %rbp
+#define RID1d %ebp
+#define RID2  %rsi
+#define RID2d %esi
+
+#define RGI1   %rdx
+#define RGI1bl %dl
+#define RGI1bh %dh
+#define RGI2   %rcx
+#define RGI2bl %cl
+#define RGI2bh %ch
+
+#define RGI3   %rax
+#define RGI3bl %al
+#define RGI3bh %ah
+#define RGI4   %rbx
+#define RGI4bl %bl
+#define RGI4bh %bh
+
+#define RFS1  %r8
+#define RFS1d %r8d
+#define RFS2  %r9
+#define RFS2d %r9d
+#define RFS3  %r10
+#define RFS3d %r10d
+
+
+#define lookup_32bit(src, dst, op1, op2, op3, interleave_op, il_reg) \
+       movzbl          src ## bh,     RID1d;    \
+       movzbl          src ## bl,     RID2d;    \
+       shrq $16,       src;                     \
+       movl            s1(, RID1, 4), dst ## d; \
+       op1             s2(, RID2, 4), dst ## d; \
+       movzbl          src ## bh,     RID1d;    \
+       movzbl          src ## bl,     RID2d;    \
+       interleave_op(il_reg);                   \
+       op2             s3(, RID1, 4), dst ## d; \
+       op3             s4(, RID2, 4), dst ## d;
+
+#define dummy(d) /* do nothing */
+
+#define shr_next(reg) \
+       shrq $16,       reg;
+
+#define F_head(a, x, gi1, gi2, op0) \
+       op0     a,      RKM,  x;                 \
+       vpslld  RKRF,   x,    RTMP;              \
+       vpsrld  RKRR,   x,    x;                 \
+       vpor    RTMP,   x,    x;                 \
+       \
+       vmovq           x,    gi1;               \
+       vpextrq $1,     x,    gi2;
+
+#define F_tail(a, x, gi1, gi2, op1, op2, op3) \
+       lookup_32bit(##gi1, RFS1, op1, op2, op3, shr_next, ##gi1); \
+       lookup_32bit(##gi2, RFS3, op1, op2, op3, shr_next, ##gi2); \
+       \
+       lookup_32bit(##gi1, RFS2, op1, op2, op3, dummy, none);     \
+       shlq $32,       RFS2;                                      \
+       orq             RFS1, RFS2;                                \
+       lookup_32bit(##gi2, RFS1, op1, op2, op3, dummy, none);     \
+       shlq $32,       RFS1;                                      \
+       orq             RFS1, RFS3;                                \
+       \
+       vmovq           RFS2, x;                                   \
+       vpinsrq $1,     RFS3, x, x;
+
+#define F_2(a1, b1, a2, b2, op0, op1, op2, op3) \
+       F_head(b1, RX, RGI1, RGI2, op0);              \
+       F_head(b2, RX, RGI3, RGI4, op0);              \
+       \
+       F_tail(b1, RX, RGI1, RGI2, op1, op2, op3);    \
+       F_tail(b2, RTMP, RGI3, RGI4, op1, op2, op3);  \
+       \
+       vpxor           a1, RX,   a1;                 \
+       vpxor           a2, RTMP, a2;
+
+#define F1_2(a1, b1, a2, b2) \
+       F_2(a1, b1, a2, b2, vpaddd, xorl, subl, addl)
+#define F2_2(a1, b1, a2, b2) \
+       F_2(a1, b1, a2, b2, vpxor, subl, addl, xorl)
+#define F3_2(a1, b1, a2, b2) \
+       F_2(a1, b1, a2, b2, vpsubd, addl, xorl, subl)
+
+#define qop(in, out, f) \
+       F ## f ## _2(out ## 1, in ## 1, out ## 2, in ## 2);
+
+#define get_round_keys(nn) \
+       vbroadcastss    (km+(4*(nn)))(CTX), RKM;        \
+       vpand           R1ST,               RKR,  RKRF; \
+       vpsubq          RKRF,               R32,  RKRR; \
+       vpsrldq $1,     RKR,                RKR;
+
+#define Q(n) \
+       get_round_keys(4*n+0); \
+       qop(RD, RC, 1);        \
+       \
+       get_round_keys(4*n+1); \
+       qop(RC, RB, 2);        \
+       \
+       get_round_keys(4*n+2); \
+       qop(RB, RA, 3);        \
+       \
+       get_round_keys(4*n+3); \
+       qop(RA, RD, 1);
+
+#define QBAR(n) \
+       get_round_keys(4*n+3); \
+       qop(RA, RD, 1);        \
+       \
+       get_round_keys(4*n+2); \
+       qop(RB, RA, 3);        \
+       \
+       get_round_keys(4*n+1); \
+       qop(RC, RB, 2);        \
+       \
+       get_round_keys(4*n+0); \
+       qop(RD, RC, 1);
+
+#define shuffle(mask) \
+       vpshufb         mask,            RKR, RKR;
+
+#define preload_rkr(n, do_mask, mask) \
+       vbroadcastss    .L16_mask,                RKR;      \
+       /* add 16-bit rotation to key rotations (mod 32) */ \
+       vpxor           (kr+n*16)(CTX),           RKR, RKR; \
+       do_mask(mask);
+
+#define transpose_4x4(x0, x1, x2, x3, t0, t1, t2) \
+       vpunpckldq              x1, x0, t0; \
+       vpunpckhdq              x1, x0, t2; \
+       vpunpckldq              x3, x2, t1; \
+       vpunpckhdq              x3, x2, x3; \
+       \
+       vpunpcklqdq             t1, t0, x0; \
+       vpunpckhqdq             t1, t0, x1; \
+       vpunpcklqdq             x3, t2, x2; \
+       vpunpckhqdq             x3, t2, x3;
+
+#define inpack_blocks(in, x0, x1, x2, x3, t0, t1, t2, rmask) \
+       vmovdqu (0*4*4)(in),    x0; \
+       vmovdqu (1*4*4)(in),    x1; \
+       vmovdqu (2*4*4)(in),    x2; \
+       vmovdqu (3*4*4)(in),    x3; \
+       vpshufb rmask, x0,      x0; \
+       vpshufb rmask, x1,      x1; \
+       vpshufb rmask, x2,      x2; \
+       vpshufb rmask, x3,      x3; \
+       \
+       transpose_4x4(x0, x1, x2, x3, t0, t1, t2)
+
+#define outunpack_blocks(out, x0, x1, x2, x3, t0, t1, t2, rmask) \
+       transpose_4x4(x0, x1, x2, x3, t0, t1, t2) \
+       \
+       vpshufb rmask,          x0, x0;       \
+       vpshufb rmask,          x1, x1;       \
+       vpshufb rmask,          x2, x2;       \
+       vpshufb rmask,          x3, x3;       \
+       vmovdqu x0,             (0*4*4)(out); \
+       vmovdqu x1,             (1*4*4)(out); \
+       vmovdqu x2,             (2*4*4)(out); \
+       vmovdqu x3,             (3*4*4)(out);
+
+#define outunpack_xor_blocks(out, x0, x1, x2, x3, t0, t1, t2, rmask) \
+       transpose_4x4(x0, x1, x2, x3, t0, t1, t2) \
+       \
+       vpshufb rmask,          x0, x0;       \
+       vpshufb rmask,          x1, x1;       \
+       vpshufb rmask,          x2, x2;       \
+       vpshufb rmask,          x3, x3;       \
+       vpxor (0*4*4)(out),     x0, x0;       \
+       vmovdqu x0,             (0*4*4)(out); \
+       vpxor (1*4*4)(out),     x1, x1;       \
+       vmovdqu x1,             (1*4*4)(out); \
+       vpxor (2*4*4)(out),     x2, x2;       \
+       vmovdqu x2,             (2*4*4)(out); \
+       vpxor (3*4*4)(out),     x3, x3;       \
+       vmovdqu x3,             (3*4*4)(out);
+
+.data
+
+.align 16
+.Lbswap_mask:
+       .byte 3, 2, 1, 0, 7, 6, 5, 4, 11, 10, 9, 8, 15, 14, 13, 12
+.Lrkr_enc_Q_Q_QBAR_QBAR:
+       .byte 0, 1, 2, 3, 4, 5, 6, 7, 11, 10, 9, 8, 15, 14, 13, 12
+.Lrkr_enc_QBAR_QBAR_QBAR_QBAR:
+       .byte 3, 2, 1, 0, 7, 6, 5, 4, 11, 10, 9, 8, 15, 14, 13, 12
+.Lrkr_dec_Q_Q_Q_Q:
+       .byte 12, 13, 14, 15, 8, 9, 10, 11, 4, 5, 6, 7, 0, 1, 2, 3
+.Lrkr_dec_Q_Q_QBAR_QBAR:
+       .byte 12, 13, 14, 15, 8, 9, 10, 11, 7, 6, 5, 4, 3, 2, 1, 0
+.Lrkr_dec_QBAR_QBAR_QBAR_QBAR:
+       .byte 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
+.L16_mask:
+       .byte 16, 16, 16, 16
+.L32_mask:
+       .byte 32, 0, 0, 0
+.Lfirst_mask:
+       .byte 0x1f, 0, 0, 0
+
+.text
+
+.align 16
+.global __cast6_enc_blk_8way
+.type   __cast6_enc_blk_8way,@function;
+
+__cast6_enc_blk_8way:
+       /* input:
+        *      %rdi: ctx, CTX
+        *      %rsi: dst
+        *      %rdx: src
+        *      %rcx: bool, if true: xor output
+        */
+
+       pushq %rbp;
+       pushq %rbx;
+       pushq %rcx;
+
+       vmovdqa .Lbswap_mask, RKM;
+       vmovd .Lfirst_mask, R1ST;
+       vmovd .L32_mask, R32;
+
+       leaq (4*4*4)(%rdx), %rax;
+       inpack_blocks(%rdx, RA1, RB1, RC1, RD1, RTMP, RX, RKRF, RKM);
+       inpack_blocks(%rax, RA2, RB2, RC2, RD2, RTMP, RX, RKRF, RKM);
+
+       movq %rsi, %r11;
+
+       preload_rkr(0, dummy, none);
+       Q(0);
+       Q(1);
+       Q(2);
+       Q(3);
+       preload_rkr(1, shuffle, .Lrkr_enc_Q_Q_QBAR_QBAR);
+       Q(4);
+       Q(5);
+       QBAR(6);
+       QBAR(7);
+       preload_rkr(2, shuffle, .Lrkr_enc_QBAR_QBAR_QBAR_QBAR);
+       QBAR(8);
+       QBAR(9);
+       QBAR(10);
+       QBAR(11);
+
+       popq %rcx;
+       popq %rbx;
+       popq %rbp;
+
+       vmovdqa .Lbswap_mask, RKM;
+       leaq (4*4*4)(%r11), %rax;
+
+       testb %cl, %cl;
+       jnz __enc_xor8;
+
+       outunpack_blocks(%r11, RA1, RB1, RC1, RD1, RTMP, RX, RKRF, RKM);
+       outunpack_blocks(%rax, RA2, RB2, RC2, RD2, RTMP, RX, RKRF, RKM);
+
+       ret;
+
+__enc_xor8:
+       outunpack_xor_blocks(%r11, RA1, RB1, RC1, RD1, RTMP, RX, RKRF, RKM);
+       outunpack_xor_blocks(%rax, RA2, RB2, RC2, RD2, RTMP, RX, RKRF, RKM);
+
+       ret;
+
+.align 16
+.global cast6_dec_blk_8way
+.type   cast6_dec_blk_8way,@function;
+
+cast6_dec_blk_8way:
+       /* input:
+        *      %rdi: ctx, CTX
+        *      %rsi: dst
+        *      %rdx: src
+        */
+
+       pushq %rbp;
+       pushq %rbx;
+
+       vmovdqa .Lbswap_mask, RKM;
+       vmovd .Lfirst_mask, R1ST;
+       vmovd .L32_mask, R32;
+
+       leaq (4*4*4)(%rdx), %rax;
+       inpack_blocks(%rdx, RA1, RB1, RC1, RD1, RTMP, RX, RKRF, RKM);
+       inpack_blocks(%rax, RA2, RB2, RC2, RD2, RTMP, RX, RKRF, RKM);
+
+       movq %rsi, %r11;
+
+       preload_rkr(2, shuffle, .Lrkr_dec_Q_Q_Q_Q);
+       Q(11);
+       Q(10);
+       Q(9);
+       Q(8);
+       preload_rkr(1, shuffle, .Lrkr_dec_Q_Q_QBAR_QBAR);
+       Q(7);
+       Q(6);
+       QBAR(5);
+       QBAR(4);
+       preload_rkr(0, shuffle, .Lrkr_dec_QBAR_QBAR_QBAR_QBAR);
+       QBAR(3);
+       QBAR(2);
+       QBAR(1);
+       QBAR(0);
+
+       popq %rbx;
+       popq %rbp;
+
+       vmovdqa .Lbswap_mask, RKM;
+       leaq (4*4*4)(%r11), %rax;
+       outunpack_blocks(%r11, RA1, RB1, RC1, RD1, RTMP, RX, RKRF, RKM);
+       outunpack_blocks(%rax, RA2, RB2, RC2, RD2, RTMP, RX, RKRF, RKM);
+
+       ret;
diff --git a/arch/x86/crypto/cast6_avx_glue.c b/arch/x86/crypto/cast6_avx_glue.c
new file mode 100644 (file)
index 0000000..15e5f85
--- /dev/null
@@ -0,0 +1,648 @@
+/*
+ * Glue Code for the AVX assembler implemention of the Cast6 Cipher
+ *
+ * Copyright (C) 2012 Johannes Goetzfried
+ *     <Johannes.Goetzfried@informatik.stud.uni-erlangen.de>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
+ * USA
+ *
+ */
+
+#include <linux/module.h>
+#include <linux/hardirq.h>
+#include <linux/types.h>
+#include <linux/crypto.h>
+#include <linux/err.h>
+#include <crypto/algapi.h>
+#include <crypto/cast6.h>
+#include <crypto/cryptd.h>
+#include <crypto/b128ops.h>
+#include <crypto/ctr.h>
+#include <crypto/lrw.h>
+#include <crypto/xts.h>
+#include <asm/xcr.h>
+#include <asm/xsave.h>
+#include <asm/crypto/ablk_helper.h>
+#include <asm/crypto/glue_helper.h>
+
+#define CAST6_PARALLEL_BLOCKS 8
+
+asmlinkage void __cast6_enc_blk_8way(struct cast6_ctx *ctx, u8 *dst,
+                                    const u8 *src, bool xor);
+asmlinkage void cast6_dec_blk_8way(struct cast6_ctx *ctx, u8 *dst,
+                                  const u8 *src);
+
+static inline void cast6_enc_blk_xway(struct cast6_ctx *ctx, u8 *dst,
+                                     const u8 *src)
+{
+       __cast6_enc_blk_8way(ctx, dst, src, false);
+}
+
+static inline void cast6_enc_blk_xway_xor(struct cast6_ctx *ctx, u8 *dst,
+                                         const u8 *src)
+{
+       __cast6_enc_blk_8way(ctx, dst, src, true);
+}
+
+static inline void cast6_dec_blk_xway(struct cast6_ctx *ctx, u8 *dst,
+                                     const u8 *src)
+{
+       cast6_dec_blk_8way(ctx, dst, src);
+}
+
+
+static void cast6_decrypt_cbc_xway(void *ctx, u128 *dst, const u128 *src)
+{
+       u128 ivs[CAST6_PARALLEL_BLOCKS - 1];
+       unsigned int j;
+
+       for (j = 0; j < CAST6_PARALLEL_BLOCKS - 1; j++)
+               ivs[j] = src[j];
+
+       cast6_dec_blk_xway(ctx, (u8 *)dst, (u8 *)src);
+
+       for (j = 0; j < CAST6_PARALLEL_BLOCKS - 1; j++)
+               u128_xor(dst + (j + 1), dst + (j + 1), ivs + j);
+}
+
+static void cast6_crypt_ctr(void *ctx, u128 *dst, const u128 *src, u128 *iv)
+{
+       be128 ctrblk;
+
+       u128_to_be128(&ctrblk, iv);
+       u128_inc(iv);
+
+       __cast6_encrypt(ctx, (u8 *)&ctrblk, (u8 *)&ctrblk);
+       u128_xor(dst, src, (u128 *)&ctrblk);
+}
+
+static void cast6_crypt_ctr_xway(void *ctx, u128 *dst, const u128 *src,
+                                  u128 *iv)
+{
+       be128 ctrblks[CAST6_PARALLEL_BLOCKS];
+       unsigned int i;
+
+       for (i = 0; i < CAST6_PARALLEL_BLOCKS; i++) {
+               if (dst != src)
+                       dst[i] = src[i];
+
+               u128_to_be128(&ctrblks[i], iv);
+               u128_inc(iv);
+       }
+
+       cast6_enc_blk_xway_xor(ctx, (u8 *)dst, (u8 *)ctrblks);
+}
+
+static const struct common_glue_ctx cast6_enc = {
+       .num_funcs = 2,
+       .fpu_blocks_limit = CAST6_PARALLEL_BLOCKS,
+
+       .funcs = { {
+               .num_blocks = CAST6_PARALLEL_BLOCKS,
+               .fn_u = { .ecb = GLUE_FUNC_CAST(cast6_enc_blk_xway) }
+       }, {
+               .num_blocks = 1,
+               .fn_u = { .ecb = GLUE_FUNC_CAST(__cast6_encrypt) }
+       } }
+};
+
+static const struct common_glue_ctx cast6_ctr = {
+       .num_funcs = 2,
+       .fpu_blocks_limit = CAST6_PARALLEL_BLOCKS,
+
+       .funcs = { {
+               .num_blocks = CAST6_PARALLEL_BLOCKS,
+               .fn_u = { .ctr = GLUE_CTR_FUNC_CAST(cast6_crypt_ctr_xway) }
+       }, {
+               .num_blocks = 1,
+               .fn_u = { .ctr = GLUE_CTR_FUNC_CAST(cast6_crypt_ctr) }
+       } }
+};
+
+static const struct common_glue_ctx cast6_dec = {
+       .num_funcs = 2,
+       .fpu_blocks_limit = CAST6_PARALLEL_BLOCKS,
+
+       .funcs = { {
+               .num_blocks = CAST6_PARALLEL_BLOCKS,
+               .fn_u = { .ecb = GLUE_FUNC_CAST(cast6_dec_blk_xway) }
+       }, {
+               .num_blocks = 1,
+               .fn_u = { .ecb = GLUE_FUNC_CAST(__cast6_decrypt) }
+       } }
+};
+
+static const struct common_glue_ctx cast6_dec_cbc = {
+       .num_funcs = 2,
+       .fpu_blocks_limit = CAST6_PARALLEL_BLOCKS,
+
+       .funcs = { {
+               .num_blocks = CAST6_PARALLEL_BLOCKS,
+               .fn_u = { .cbc = GLUE_CBC_FUNC_CAST(cast6_decrypt_cbc_xway) }
+       }, {
+               .num_blocks = 1,
+               .fn_u = { .cbc = GLUE_CBC_FUNC_CAST(__cast6_decrypt) }
+       } }
+};
+
+static int ecb_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
+                      struct scatterlist *src, unsigned int nbytes)
+{
+       return glue_ecb_crypt_128bit(&cast6_enc, desc, dst, src, nbytes);
+}
+
+static int ecb_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
+                      struct scatterlist *src, unsigned int nbytes)
+{
+       return glue_ecb_crypt_128bit(&cast6_dec, desc, dst, src, nbytes);
+}
+
+static int cbc_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
+                      struct scatterlist *src, unsigned int nbytes)
+{
+       return glue_cbc_encrypt_128bit(GLUE_FUNC_CAST(__cast6_encrypt), desc,
+                                      dst, src, nbytes);
+}
+
+static int cbc_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
+                      struct scatterlist *src, unsigned int nbytes)
+{
+       return glue_cbc_decrypt_128bit(&cast6_dec_cbc, desc, dst, src,
+                                      nbytes);
+}
+
+static int ctr_crypt(struct blkcipher_desc *desc, struct scatterlist *dst,
+                    struct scatterlist *src, unsigned int nbytes)
+{
+       return glue_ctr_crypt_128bit(&cast6_ctr, desc, dst, src, nbytes);
+}
+
+static inline bool cast6_fpu_begin(bool fpu_enabled, unsigned int nbytes)
+{
+       return glue_fpu_begin(CAST6_BLOCK_SIZE, CAST6_PARALLEL_BLOCKS,
+                             NULL, fpu_enabled, nbytes);
+}
+
+static inline void cast6_fpu_end(bool fpu_enabled)
+{
+       glue_fpu_end(fpu_enabled);
+}
+
+struct crypt_priv {
+       struct cast6_ctx *ctx;
+       bool fpu_enabled;
+};
+
+static void encrypt_callback(void *priv, u8 *srcdst, unsigned int nbytes)
+{
+       const unsigned int bsize = CAST6_BLOCK_SIZE;
+       struct crypt_priv *ctx = priv;
+       int i;
+
+       ctx->fpu_enabled = cast6_fpu_begin(ctx->fpu_enabled, nbytes);
+
+       if (nbytes == bsize * CAST6_PARALLEL_BLOCKS) {
+               cast6_enc_blk_xway(ctx->ctx, srcdst, srcdst);
+               return;
+       }
+
+       for (i = 0; i < nbytes / bsize; i++, srcdst += bsize)
+               __cast6_encrypt(ctx->ctx, srcdst, srcdst);
+}
+
+static void decrypt_callback(void *priv, u8 *srcdst, unsigned int nbytes)
+{
+       const unsigned int bsize = CAST6_BLOCK_SIZE;
+       struct crypt_priv *ctx = priv;
+       int i;
+
+       ctx->fpu_enabled = cast6_fpu_begin(ctx->fpu_enabled, nbytes);
+
+       if (nbytes == bsize * CAST6_PARALLEL_BLOCKS) {
+               cast6_dec_blk_xway(ctx->ctx, srcdst, srcdst);
+               return;
+       }
+
+       for (i = 0; i < nbytes / bsize; i++, srcdst += bsize)
+               __cast6_decrypt(ctx->ctx, srcdst, srcdst);
+}
+
+struct cast6_lrw_ctx {
+       struct lrw_table_ctx lrw_table;
+       struct cast6_ctx cast6_ctx;
+};
+
+static int lrw_cast6_setkey(struct crypto_tfm *tfm, const u8 *key,
+                             unsigned int keylen)
+{
+       struct cast6_lrw_ctx *ctx = crypto_tfm_ctx(tfm);
+       int err;
+
+       err = __cast6_setkey(&ctx->cast6_ctx, key, keylen - CAST6_BLOCK_SIZE,
+                            &tfm->crt_flags);
+       if (err)
+               return err;
+
+       return lrw_init_table(&ctx->lrw_table, key + keylen - CAST6_BLOCK_SIZE);
+}
+
+static int lrw_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
+                      struct scatterlist *src, unsigned int nbytes)
+{
+       struct cast6_lrw_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
+       be128 buf[CAST6_PARALLEL_BLOCKS];
+       struct crypt_priv crypt_ctx = {
+               .ctx = &ctx->cast6_ctx,
+               .fpu_enabled = false,
+       };
+       struct lrw_crypt_req req = {
+               .tbuf = buf,
+               .tbuflen = sizeof(buf),
+
+               .table_ctx = &ctx->lrw_table,
+               .crypt_ctx = &crypt_ctx,
+               .crypt_fn = encrypt_callback,
+       };
+       int ret;
+
+       desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
+       ret = lrw_crypt(desc, dst, src, nbytes, &req);
+       cast6_fpu_end(crypt_ctx.fpu_enabled);
+
+       return ret;
+}
+
+static int lrw_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
+                      struct scatterlist *src, unsigned int nbytes)
+{
+       struct cast6_lrw_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
+       be128 buf[CAST6_PARALLEL_BLOCKS];
+       struct crypt_priv crypt_ctx = {
+               .ctx = &ctx->cast6_ctx,
+               .fpu_enabled = false,
+       };
+       struct lrw_crypt_req req = {
+               .tbuf = buf,
+               .tbuflen = sizeof(buf),
+
+               .table_ctx = &ctx->lrw_table,
+               .crypt_ctx = &crypt_ctx,
+               .crypt_fn = decrypt_callback,
+       };
+       int ret;
+
+       desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
+       ret = lrw_crypt(desc, dst, src, nbytes, &req);
+       cast6_fpu_end(crypt_ctx.fpu_enabled);
+
+       return ret;
+}
+
+static void lrw_exit_tfm(struct crypto_tfm *tfm)
+{
+       struct cast6_lrw_ctx *ctx = crypto_tfm_ctx(tfm);
+
+       lrw_free_table(&ctx->lrw_table);
+}
+
+struct cast6_xts_ctx {
+       struct cast6_ctx tweak_ctx;
+       struct cast6_ctx crypt_ctx;
+};
+
+static int xts_cast6_setkey(struct crypto_tfm *tfm, const u8 *key,
+                             unsigned int keylen)
+{
+       struct cast6_xts_ctx *ctx = crypto_tfm_ctx(tfm);
+       u32 *flags = &tfm->crt_flags;
+       int err;
+
+       /* key consists of keys of equal size concatenated, therefore
+        * the length must be even
+        */
+       if (keylen % 2) {
+               *flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
+               return -EINVAL;
+       }
+
+       /* first half of xts-key is for crypt */
+       err = __cast6_setkey(&ctx->crypt_ctx, key, keylen / 2, flags);
+       if (err)
+               return err;
+
+       /* second half of xts-key is for tweak */
+       return __cast6_setkey(&ctx->tweak_ctx, key + keylen / 2, keylen / 2,
+                             flags);
+}
+
+static int xts_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
+                      struct scatterlist *src, unsigned int nbytes)
+{
+       struct cast6_xts_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
+       be128 buf[CAST6_PARALLEL_BLOCKS];
+       struct crypt_priv crypt_ctx = {
+               .ctx = &ctx->crypt_ctx,
+               .fpu_enabled = false,
+       };
+       struct xts_crypt_req req = {
+               .tbuf = buf,
+               .tbuflen = sizeof(buf),
+
+               .tweak_ctx = &ctx->tweak_ctx,
+               .tweak_fn = XTS_TWEAK_CAST(__cast6_encrypt),
+               .crypt_ctx = &crypt_ctx,
+               .crypt_fn = encrypt_callback,
+       };
+       int ret;
+
+       desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
+       ret = xts_crypt(desc, dst, src, nbytes, &req);
+       cast6_fpu_end(crypt_ctx.fpu_enabled);
+
+       return ret;
+}
+
+static int xts_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
+                      struct scatterlist *src, unsigned int nbytes)
+{
+       struct cast6_xts_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
+       be128 buf[CAST6_PARALLEL_BLOCKS];
+       struct crypt_priv crypt_ctx = {
+               .ctx = &ctx->crypt_ctx,
+               .fpu_enabled = false,
+       };
+       struct xts_crypt_req req = {
+               .tbuf = buf,
+               .tbuflen = sizeof(buf),
+
+               .tweak_ctx = &ctx->tweak_ctx,
+               .tweak_fn = XTS_TWEAK_CAST(__cast6_encrypt),
+               .crypt_ctx = &crypt_ctx,
+               .crypt_fn = decrypt_callback,
+       };
+       int ret;
+
+       desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
+       ret = xts_crypt(desc, dst, src, nbytes, &req);
+       cast6_fpu_end(crypt_ctx.fpu_enabled);
+
+       return ret;
+}
+
+static struct crypto_alg cast6_algs[10] = { {
+       .cra_name               = "__ecb-cast6-avx",
+       .cra_driver_name        = "__driver-ecb-cast6-avx",
+       .cra_priority           = 0,
+       .cra_flags              = CRYPTO_ALG_TYPE_BLKCIPHER,
+       .cra_blocksize          = CAST6_BLOCK_SIZE,
+       .cra_ctxsize            = sizeof(struct cast6_ctx),
+       .cra_alignmask          = 0,
+       .cra_type               = &crypto_blkcipher_type,
+       .cra_module             = THIS_MODULE,
+       .cra_u = {
+               .blkcipher = {
+                       .min_keysize    = CAST6_MIN_KEY_SIZE,
+                       .max_keysize    = CAST6_MAX_KEY_SIZE,
+                       .setkey         = cast6_setkey,
+                       .encrypt        = ecb_encrypt,
+                       .decrypt        = ecb_decrypt,
+               },
+       },
+}, {
+       .cra_name               = "__cbc-cast6-avx",
+       .cra_driver_name        = "__driver-cbc-cast6-avx",
+       .cra_priority           = 0,
+       .cra_flags              = CRYPTO_ALG_TYPE_BLKCIPHER,
+       .cra_blocksize          = CAST6_BLOCK_SIZE,
+       .cra_ctxsize            = sizeof(struct cast6_ctx),
+       .cra_alignmask          = 0,
+       .cra_type               = &crypto_blkcipher_type,
+       .cra_module             = THIS_MODULE,
+       .cra_u = {
+               .blkcipher = {
+                       .min_keysize    = CAST6_MIN_KEY_SIZE,
+                       .max_keysize    = CAST6_MAX_KEY_SIZE,
+                       .setkey         = cast6_setkey,
+                       .encrypt        = cbc_encrypt,
+                       .decrypt        = cbc_decrypt,
+               },
+       },
+}, {
+       .cra_name               = "__ctr-cast6-avx",
+       .cra_driver_name        = "__driver-ctr-cast6-avx",
+       .cra_priority           = 0,
+       .cra_flags              = CRYPTO_ALG_TYPE_BLKCIPHER,
+       .cra_blocksize          = 1,
+       .cra_ctxsize            = sizeof(struct cast6_ctx),
+       .cra_alignmask          = 0,
+       .cra_type               = &crypto_blkcipher_type,
+       .cra_module             = THIS_MODULE,
+       .cra_u = {
+               .blkcipher = {
+                       .min_keysize    = CAST6_MIN_KEY_SIZE,
+                       .max_keysize    = CAST6_MAX_KEY_SIZE,
+                       .ivsize         = CAST6_BLOCK_SIZE,
+                       .setkey         = cast6_setkey,
+                       .encrypt        = ctr_crypt,
+                       .decrypt        = ctr_crypt,
+               },
+       },
+}, {
+       .cra_name               = "__lrw-cast6-avx",
+       .cra_driver_name        = "__driver-lrw-cast6-avx",
+       .cra_priority           = 0,
+       .cra_flags              = CRYPTO_ALG_TYPE_BLKCIPHER,
+       .cra_blocksize          = CAST6_BLOCK_SIZE,
+       .cra_ctxsize            = sizeof(struct cast6_lrw_ctx),
+       .cra_alignmask          = 0,
+       .cra_type               = &crypto_blkcipher_type,
+       .cra_module             = THIS_MODULE,
+       .cra_exit               = lrw_exit_tfm,
+       .cra_u = {
+               .blkcipher = {
+                       .min_keysize    = CAST6_MIN_KEY_SIZE +
+                                         CAST6_BLOCK_SIZE,
+                       .max_keysize    = CAST6_MAX_KEY_SIZE +
+                                         CAST6_BLOCK_SIZE,
+                       .ivsize         = CAST6_BLOCK_SIZE,
+                       .setkey         = lrw_cast6_setkey,
+                       .encrypt        = lrw_encrypt,
+                       .decrypt        = lrw_decrypt,
+               },
+       },
+}, {
+       .cra_name               = "__xts-cast6-avx",
+       .cra_driver_name        = "__driver-xts-cast6-avx",
+       .cra_priority           = 0,
+       .cra_flags              = CRYPTO_ALG_TYPE_BLKCIPHER,
+       .cra_blocksize          = CAST6_BLOCK_SIZE,
+       .cra_ctxsize            = sizeof(struct cast6_xts_ctx),
+       .cra_alignmask          = 0,
+       .cra_type               = &crypto_blkcipher_type,
+       .cra_module             = THIS_MODULE,
+       .cra_u = {
+               .blkcipher = {
+                       .min_keysize    = CAST6_MIN_KEY_SIZE * 2,
+                       .max_keysize    = CAST6_MAX_KEY_SIZE * 2,
+                       .ivsize         = CAST6_BLOCK_SIZE,
+                       .setkey         = xts_cast6_setkey,
+                       .encrypt        = xts_encrypt,
+                       .decrypt        = xts_decrypt,
+               },
+       },
+}, {
+       .cra_name               = "ecb(cast6)",
+       .cra_driver_name        = "ecb-cast6-avx",
+       .cra_priority           = 200,
+       .cra_flags              = CRYPTO_ALG_TYPE_ABLKCIPHER | CRYPTO_ALG_ASYNC,
+       .cra_blocksize          = CAST6_BLOCK_SIZE,
+       .cra_ctxsize            = sizeof(struct async_helper_ctx),
+       .cra_alignmask          = 0,
+       .cra_type               = &crypto_ablkcipher_type,
+       .cra_module             = THIS_MODULE,
+       .cra_init               = ablk_init,
+       .cra_exit               = ablk_exit,
+       .cra_u = {
+               .ablkcipher = {
+                       .min_keysize    = CAST6_MIN_KEY_SIZE,
+                       .max_keysize    = CAST6_MAX_KEY_SIZE,
+                       .setkey         = ablk_set_key,
+                       .encrypt        = ablk_encrypt,
+                       .decrypt        = ablk_decrypt,
+               },
+       },
+}, {
+       .cra_name               = "cbc(cast6)",
+       .cra_driver_name        = "cbc-cast6-avx",
+       .cra_priority           = 200,
+       .cra_flags              = CRYPTO_ALG_TYPE_ABLKCIPHER | CRYPTO_ALG_ASYNC,
+       .cra_blocksize          = CAST6_BLOCK_SIZE,
+       .cra_ctxsize            = sizeof(struct async_helper_ctx),
+       .cra_alignmask          = 0,
+       .cra_type               = &crypto_ablkcipher_type,
+       .cra_module             = THIS_MODULE,
+       .cra_init               = ablk_init,
+       .cra_exit               = ablk_exit,
+       .cra_u = {
+               .ablkcipher = {
+                       .min_keysize    = CAST6_MIN_KEY_SIZE,
+                       .max_keysize    = CAST6_MAX_KEY_SIZE,
+                       .ivsize         = CAST6_BLOCK_SIZE,
+                       .setkey         = ablk_set_key,
+                       .encrypt        = __ablk_encrypt,
+                       .decrypt        = ablk_decrypt,
+               },
+       },
+}, {
+       .cra_name               = "ctr(cast6)",
+       .cra_driver_name        = "ctr-cast6-avx",
+       .cra_priority           = 200,
+       .cra_flags              = CRYPTO_ALG_TYPE_ABLKCIPHER | CRYPTO_ALG_ASYNC,
+       .cra_blocksize          = 1,
+       .cra_ctxsize            = sizeof(struct async_helper_ctx),
+       .cra_alignmask          = 0,
+       .cra_type               = &crypto_ablkcipher_type,
+       .cra_module             = THIS_MODULE,
+       .cra_init               = ablk_init,
+       .cra_exit               = ablk_exit,
+       .cra_u = {
+               .ablkcipher = {
+                       .min_keysize    = CAST6_MIN_KEY_SIZE,
+                       .max_keysize    = CAST6_MAX_KEY_SIZE,
+                       .ivsize         = CAST6_BLOCK_SIZE,
+                       .setkey         = ablk_set_key,
+                       .encrypt        = ablk_encrypt,
+                       .decrypt        = ablk_encrypt,
+                       .geniv          = "chainiv",
+               },
+       },
+}, {
+       .cra_name               = "lrw(cast6)",
+       .cra_driver_name        = "lrw-cast6-avx",
+       .cra_priority           = 200,
+       .cra_flags              = CRYPTO_ALG_TYPE_ABLKCIPHER | CRYPTO_ALG_ASYNC,
+       .cra_blocksize          = CAST6_BLOCK_SIZE,
+       .cra_ctxsize            = sizeof(struct async_helper_ctx),
+       .cra_alignmask          = 0,
+       .cra_type               = &crypto_ablkcipher_type,
+       .cra_module             = THIS_MODULE,
+       .cra_init               = ablk_init,
+       .cra_exit               = ablk_exit,
+       .cra_u = {
+               .ablkcipher = {
+                       .min_keysize    = CAST6_MIN_KEY_SIZE +
+                                         CAST6_BLOCK_SIZE,
+                       .max_keysize    = CAST6_MAX_KEY_SIZE +
+                                         CAST6_BLOCK_SIZE,
+                       .ivsize         = CAST6_BLOCK_SIZE,
+                       .setkey         = ablk_set_key,
+                       .encrypt        = ablk_encrypt,
+                       .decrypt        = ablk_decrypt,
+               },
+       },
+}, {
+       .cra_name               = "xts(cast6)",
+       .cra_driver_name        = "xts-cast6-avx",
+       .cra_priority           = 200,
+       .cra_flags              = CRYPTO_ALG_TYPE_ABLKCIPHER | CRYPTO_ALG_ASYNC,
+       .cra_blocksize          = CAST6_BLOCK_SIZE,
+       .cra_ctxsize            = sizeof(struct async_helper_ctx),
+       .cra_alignmask          = 0,
+       .cra_type               = &crypto_ablkcipher_type,
+       .cra_module             = THIS_MODULE,
+       .cra_init               = ablk_init,
+       .cra_exit               = ablk_exit,
+       .cra_u = {
+               .ablkcipher = {
+                       .min_keysize    = CAST6_MIN_KEY_SIZE * 2,
+                       .max_keysize    = CAST6_MAX_KEY_SIZE * 2,
+                       .ivsize         = CAST6_BLOCK_SIZE,
+                       .setkey         = ablk_set_key,
+                       .encrypt        = ablk_encrypt,
+                       .decrypt        = ablk_decrypt,
+               },
+       },
+} };
+
+static int __init cast6_init(void)
+{
+       u64 xcr0;
+
+       if (!cpu_has_avx || !cpu_has_osxsave) {
+               pr_info("AVX instructions are not detected.\n");
+               return -ENODEV;
+       }
+
+       xcr0 = xgetbv(XCR_XFEATURE_ENABLED_MASK);
+       if ((xcr0 & (XSTATE_SSE | XSTATE_YMM)) != (XSTATE_SSE | XSTATE_YMM)) {
+               pr_info("AVX detected but unusable.\n");
+               return -ENODEV;
+       }
+
+       return crypto_register_algs(cast6_algs, ARRAY_SIZE(cast6_algs));
+}
+
+static void __exit cast6_exit(void)
+{
+       crypto_unregister_algs(cast6_algs, ARRAY_SIZE(cast6_algs));
+}
+
+module_init(cast6_init);
+module_exit(cast6_exit);
+
+MODULE_DESCRIPTION("Cast6 Cipher Algorithm, AVX optimized");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("cast6");
index b4bf0a6..6759dd1 100644 (file)
@@ -150,7 +150,6 @@ static struct shash_alg ghash_alg = {
                .cra_blocksize          = GHASH_BLOCK_SIZE,
                .cra_ctxsize            = sizeof(struct ghash_ctx),
                .cra_module             = THIS_MODULE,
-               .cra_list               = LIST_HEAD_INIT(ghash_alg.base.cra_list),
        },
 };
 
@@ -288,7 +287,6 @@ static struct ahash_alg ghash_async_alg = {
                        .cra_blocksize          = GHASH_BLOCK_SIZE,
                        .cra_type               = &crypto_ahash_type,
                        .cra_module             = THIS_MODULE,
-                       .cra_list               = LIST_HEAD_INIT(ghash_async_alg.halg.base.cra_list),
                        .cra_init               = ghash_async_init_tfm,
                        .cra_exit               = ghash_async_exit_tfm,
                },
index 4854f0f..30b3927 100644 (file)
@@ -110,7 +110,7 @@ static unsigned int __glue_cbc_encrypt_128bit(const common_glue_func_t fn,
                nbytes -= bsize;
        } while (nbytes >= bsize);
 
-       u128_xor((u128 *)walk->iv, (u128 *)walk->iv, iv);
+       *(u128 *)walk->iv = *iv;
        return nbytes;
 }
 
index bccb76d..a3a3c02 100644 (file)
@@ -97,7 +97,6 @@ static struct crypto_alg alg = {
        .cra_ctxsize        =   sizeof(struct salsa20_ctx),
        .cra_alignmask      =   3,
        .cra_module         =   THIS_MODULE,
-       .cra_list           =   LIST_HEAD_INIT(alg.cra_list),
        .cra_u              =   {
                .blkcipher = {
                        .setkey         =   setkey,
index b36bdac..3f543a0 100644 (file)
@@ -390,7 +390,6 @@ static struct crypto_alg serpent_algs[10] = { {
        .cra_alignmask          = 0,
        .cra_type               = &crypto_blkcipher_type,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(serpent_algs[0].cra_list),
        .cra_u = {
                .blkcipher = {
                        .min_keysize    = SERPENT_MIN_KEY_SIZE,
@@ -410,7 +409,6 @@ static struct crypto_alg serpent_algs[10] = { {
        .cra_alignmask          = 0,
        .cra_type               = &crypto_blkcipher_type,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(serpent_algs[1].cra_list),
        .cra_u = {
                .blkcipher = {
                        .min_keysize    = SERPENT_MIN_KEY_SIZE,
@@ -430,7 +428,6 @@ static struct crypto_alg serpent_algs[10] = { {
        .cra_alignmask          = 0,
        .cra_type               = &crypto_blkcipher_type,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(serpent_algs[2].cra_list),
        .cra_u = {
                .blkcipher = {
                        .min_keysize    = SERPENT_MIN_KEY_SIZE,
@@ -451,7 +448,6 @@ static struct crypto_alg serpent_algs[10] = { {
        .cra_alignmask          = 0,
        .cra_type               = &crypto_blkcipher_type,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(serpent_algs[3].cra_list),
        .cra_exit               = lrw_exit_tfm,
        .cra_u = {
                .blkcipher = {
@@ -475,7 +471,6 @@ static struct crypto_alg serpent_algs[10] = { {
        .cra_alignmask          = 0,
        .cra_type               = &crypto_blkcipher_type,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(serpent_algs[4].cra_list),
        .cra_u = {
                .blkcipher = {
                        .min_keysize    = SERPENT_MIN_KEY_SIZE * 2,
@@ -496,7 +491,6 @@ static struct crypto_alg serpent_algs[10] = { {
        .cra_alignmask          = 0,
        .cra_type               = &crypto_ablkcipher_type,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(serpent_algs[5].cra_list),
        .cra_init               = ablk_init,
        .cra_exit               = ablk_exit,
        .cra_u = {
@@ -518,7 +512,6 @@ static struct crypto_alg serpent_algs[10] = { {
        .cra_alignmask          = 0,
        .cra_type               = &crypto_ablkcipher_type,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(serpent_algs[6].cra_list),
        .cra_init               = ablk_init,
        .cra_exit               = ablk_exit,
        .cra_u = {
@@ -541,7 +534,6 @@ static struct crypto_alg serpent_algs[10] = { {
        .cra_alignmask          = 0,
        .cra_type               = &crypto_ablkcipher_type,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(serpent_algs[7].cra_list),
        .cra_init               = ablk_init,
        .cra_exit               = ablk_exit,
        .cra_u = {
@@ -565,7 +557,6 @@ static struct crypto_alg serpent_algs[10] = { {
        .cra_alignmask          = 0,
        .cra_type               = &crypto_ablkcipher_type,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(serpent_algs[8].cra_list),
        .cra_init               = ablk_init,
        .cra_exit               = ablk_exit,
        .cra_u = {
@@ -590,7 +581,6 @@ static struct crypto_alg serpent_algs[10] = { {
        .cra_alignmask          = 0,
        .cra_type               = &crypto_ablkcipher_type,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(serpent_algs[9].cra_list),
        .cra_init               = ablk_init,
        .cra_exit               = ablk_exit,
        .cra_u = {
index d679c86..9107a99 100644 (file)
@@ -393,7 +393,6 @@ static struct crypto_alg serpent_algs[10] = { {
        .cra_alignmask          = 0,
        .cra_type               = &crypto_blkcipher_type,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(serpent_algs[0].cra_list),
        .cra_u = {
                .blkcipher = {
                        .min_keysize    = SERPENT_MIN_KEY_SIZE,
@@ -413,7 +412,6 @@ static struct crypto_alg serpent_algs[10] = { {
        .cra_alignmask          = 0,
        .cra_type               = &crypto_blkcipher_type,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(serpent_algs[1].cra_list),
        .cra_u = {
                .blkcipher = {
                        .min_keysize    = SERPENT_MIN_KEY_SIZE,
@@ -433,7 +431,6 @@ static struct crypto_alg serpent_algs[10] = { {
        .cra_alignmask          = 0,
        .cra_type               = &crypto_blkcipher_type,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(serpent_algs[2].cra_list),
        .cra_u = {
                .blkcipher = {
                        .min_keysize    = SERPENT_MIN_KEY_SIZE,
@@ -454,7 +451,6 @@ static struct crypto_alg serpent_algs[10] = { {
        .cra_alignmask          = 0,
        .cra_type               = &crypto_blkcipher_type,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(serpent_algs[3].cra_list),
        .cra_exit               = lrw_exit_tfm,
        .cra_u = {
                .blkcipher = {
@@ -478,7 +474,6 @@ static struct crypto_alg serpent_algs[10] = { {
        .cra_alignmask          = 0,
        .cra_type               = &crypto_blkcipher_type,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(serpent_algs[4].cra_list),
        .cra_u = {
                .blkcipher = {
                        .min_keysize    = SERPENT_MIN_KEY_SIZE * 2,
@@ -499,7 +494,6 @@ static struct crypto_alg serpent_algs[10] = { {
        .cra_alignmask          = 0,
        .cra_type               = &crypto_ablkcipher_type,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(serpent_algs[5].cra_list),
        .cra_init               = ablk_init,
        .cra_exit               = ablk_exit,
        .cra_u = {
@@ -521,7 +515,6 @@ static struct crypto_alg serpent_algs[10] = { {
        .cra_alignmask          = 0,
        .cra_type               = &crypto_ablkcipher_type,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(serpent_algs[6].cra_list),
        .cra_init               = ablk_init,
        .cra_exit               = ablk_exit,
        .cra_u = {
@@ -544,7 +537,6 @@ static struct crypto_alg serpent_algs[10] = { {
        .cra_alignmask          = 0,
        .cra_type               = &crypto_ablkcipher_type,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(serpent_algs[7].cra_list),
        .cra_init               = ablk_init,
        .cra_exit               = ablk_exit,
        .cra_u = {
@@ -568,7 +560,6 @@ static struct crypto_alg serpent_algs[10] = { {
        .cra_alignmask          = 0,
        .cra_type               = &crypto_ablkcipher_type,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(serpent_algs[8].cra_list),
        .cra_init               = ablk_init,
        .cra_exit               = ablk_exit,
        .cra_u = {
@@ -593,7 +584,6 @@ static struct crypto_alg serpent_algs[10] = { {
        .cra_alignmask          = 0,
        .cra_type               = &crypto_ablkcipher_type,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(serpent_algs[9].cra_list),
        .cra_init               = ablk_init,
        .cra_exit               = ablk_exit,
        .cra_u = {
index 35f4557..1585abb 100644 (file)
@@ -4,6 +4,8 @@
  * Copyright (C) 2012 Johannes Goetzfried
  *     <Johannes.Goetzfried@informatik.stud.uni-erlangen.de>
  *
+ * Copyright Â© 2012 Jussi Kivilinna <jussi.kivilinna@mbnet.fi>
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
 #define RC2 %xmm6
 #define RD2 %xmm7
 
-#define RX %xmm8
-#define RY %xmm9
+#define RX0 %xmm8
+#define RY0 %xmm9
+
+#define RX1 %xmm10
+#define RY1 %xmm11
 
-#define RK1 %xmm10
-#define RK2 %xmm11
+#define RK1 %xmm12
+#define RK2 %xmm13
 
-#define RID1  %rax
-#define RID1b %al
-#define RID2  %rbx
-#define RID2b %bl
+#define RT %xmm14
+#define RR %xmm15
+
+#define RID1  %rbp
+#define RID1d %ebp
+#define RID2  %rsi
+#define RID2d %esi
 
 #define RGI1   %rdx
 #define RGI1bl %dl
 #define RGI2bl %cl
 #define RGI2bh %ch
 
+#define RGI3   %rax
+#define RGI3bl %al
+#define RGI3bh %ah
+#define RGI4   %rbx
+#define RGI4bl %bl
+#define RGI4bh %bh
+
 #define RGS1  %r8
 #define RGS1d %r8d
 #define RGS2  %r9
 #define RGS3d %r10d
 
 
-#define lookup_32bit(t0, t1, t2, t3, src, dst) \
-       movb            src ## bl,        RID1b;     \
-       movb            src ## bh,        RID2b;     \
-       movl            t0(CTX, RID1, 4), dst ## d;  \
-       xorl            t1(CTX, RID2, 4), dst ## d;  \
+#define lookup_32bit(t0, t1, t2, t3, src, dst, interleave_op, il_reg) \
+       movzbl          src ## bl,        RID1d;     \
+       movzbl          src ## bh,        RID2d;     \
        shrq $16,       src;                         \
-       movb            src ## bl,        RID1b;     \
-       movb            src ## bh,        RID2b;     \
+       movl            t0(CTX, RID1, 4), dst ## d;  \
+       movl            t1(CTX, RID2, 4), RID2d;     \
+       movzbl          src ## bl,        RID1d;     \
+       xorl            RID2d,            dst ## d;  \
+       movzbl          src ## bh,        RID2d;     \
+       interleave_op(il_reg);                       \
        xorl            t2(CTX, RID1, 4), dst ## d;  \
        xorl            t3(CTX, RID2, 4), dst ## d;
 
-#define G(a, x, t0, t1, t2, t3) \
-       vmovq           a,    RGI1;               \
-       vpsrldq $8,     a,    x;                  \
-       vmovq           x,    RGI2;               \
+#define dummy(d) /* do nothing */
+
+#define shr_next(reg) \
+       shrq $16,       reg;
+
+#define G(gi1, gi2, x, t0, t1, t2, t3) \
+       lookup_32bit(t0, t1, t2, t3, ##gi1, RGS1, shr_next, ##gi1);  \
+       lookup_32bit(t0, t1, t2, t3, ##gi2, RGS3, shr_next, ##gi2);  \
+       \
+       lookup_32bit(t0, t1, t2, t3, ##gi1, RGS2, dummy, none);      \
+       shlq $32,       RGS2;                                        \
+       orq             RGS1, RGS2;                                  \
+       lookup_32bit(t0, t1, t2, t3, ##gi2, RGS1, dummy, none);      \
+       shlq $32,       RGS1;                                        \
+       orq             RGS1, RGS3;
+
+#define round_head_2(a, b, x1, y1, x2, y2) \
+       vmovq           b ## 1, RGI3;           \
+       vpextrq $1,     b ## 1, RGI4;           \
        \
-       lookup_32bit(t0, t1, t2, t3, RGI1, RGS1); \
-       shrq $16,       RGI1;                     \
-       lookup_32bit(t0, t1, t2, t3, RGI1, RGS2); \
-       shlq $32,       RGS2;                     \
-       orq             RGS1, RGS2;               \
+       G(RGI1, RGI2, x1, s0, s1, s2, s3);      \
+       vmovq           a ## 2, RGI1;           \
+       vpextrq $1,     a ## 2, RGI2;           \
+       vmovq           RGS2, x1;               \
+       vpinsrq $1,     RGS3, x1, x1;           \
        \
-       lookup_32bit(t0, t1, t2, t3, RGI2, RGS1); \
-       shrq $16,       RGI2;                     \
-       lookup_32bit(t0, t1, t2, t3, RGI2, RGS3); \
-       shlq $32,       RGS3;                     \
-       orq             RGS1, RGS3;               \
+       G(RGI3, RGI4, y1, s1, s2, s3, s0);      \
+       vmovq           b ## 2, RGI3;           \
+       vpextrq $1,     b ## 2, RGI4;           \
+       vmovq           RGS2, y1;               \
+       vpinsrq $1,     RGS3, y1, y1;           \
        \
-       vmovq           RGS2, x;                  \
-       vpinsrq $1,     RGS3, x, x;
+       G(RGI1, RGI2, x2, s0, s1, s2, s3);      \
+       vmovq           RGS2, x2;               \
+       vpinsrq $1,     RGS3, x2, x2;           \
+       \
+       G(RGI3, RGI4, y2, s1, s2, s3, s0);      \
+       vmovq           RGS2, y2;               \
+       vpinsrq $1,     RGS3, y2, y2;
 
-#define encround(a, b, c, d, x, y) \
-       G(a, x, s0, s1, s2, s3);           \
-       G(b, y, s1, s2, s3, s0);           \
+#define encround_tail(a, b, c, d, x, y, prerotate) \
        vpaddd                  x, y,   x; \
+       vpaddd                  x, RK1, RT;\
+       prerotate(b);                      \
+       vpxor                   RT, c,  c; \
        vpaddd                  y, x,   y; \
-       vpaddd                  x, RK1, x; \
        vpaddd                  y, RK2, y; \
-       vpxor                   x, c,   c; \
-       vpsrld $1,              c, x;      \
+       vpsrld $1,              c, RT;     \
        vpslld $(32 - 1),       c, c;      \
-       vpor                    c, x,   c; \
-       vpslld $1,              d, x;      \
-       vpsrld $(32 - 1),       d, d;      \
-       vpor                    d, x,   d; \
-       vpxor                   d, y,   d;
-
-#define decround(a, b, c, d, x, y) \
-       G(a, x, s0, s1, s2, s3);           \
-       G(b, y, s1, s2, s3, s0);           \
+       vpor                    c, RT,  c; \
+       vpxor                   d, y,   d; \
+
+#define decround_tail(a, b, c, d, x, y, prerotate) \
        vpaddd                  x, y,   x; \
+       vpaddd                  x, RK1, RT;\
+       prerotate(a);                      \
+       vpxor                   RT, c,  c; \
        vpaddd                  y, x,   y; \
        vpaddd                  y, RK2, y; \
        vpxor                   d, y,   d; \
        vpsrld $1,              d, y;      \
        vpslld $(32 - 1),       d, d;      \
        vpor                    d, y,   d; \
-       vpslld $1,              c, y;      \
-       vpsrld $(32 - 1),       c, c;      \
-       vpor                    c, y,   c; \
-       vpaddd                  x, RK1, x; \
-       vpxor                   x, c,   c;
-
-#define encrypt_round(n, a, b, c, d) \
-       vbroadcastss (k+4*(2*(n)))(CTX),   RK1;           \
-       vbroadcastss (k+4*(2*(n)+1))(CTX), RK2;           \
-       encround(a ## 1, b ## 1, c ## 1, d ## 1, RX, RY); \
-       encround(a ## 2, b ## 2, c ## 2, d ## 2, RX, RY);
-
-#define decrypt_round(n, a, b, c, d) \
-       vbroadcastss (k+4*(2*(n)))(CTX),   RK1;           \
-       vbroadcastss (k+4*(2*(n)+1))(CTX), RK2;           \
-       decround(a ## 1, b ## 1, c ## 1, d ## 1, RX, RY); \
-       decround(a ## 2, b ## 2, c ## 2, d ## 2, RX, RY);
+
+#define rotate_1l(x) \
+       vpslld $1,              x, RR;     \
+       vpsrld $(32 - 1),       x, x;      \
+       vpor                    x, RR,  x;
+
+#define preload_rgi(c) \
+       vmovq                   c, RGI1; \
+       vpextrq $1,             c, RGI2;
+
+#define encrypt_round(n, a, b, c, d, preload, prerotate) \
+       vbroadcastss (k+4*(2*(n)))(CTX),   RK1;                  \
+       vbroadcastss (k+4*(2*(n)+1))(CTX), RK2;                  \
+       round_head_2(a, b, RX0, RY0, RX1, RY1);                  \
+       encround_tail(a ## 1, b ## 1, c ## 1, d ## 1, RX0, RY0, prerotate); \
+       preload(c ## 1);                                         \
+       encround_tail(a ## 2, b ## 2, c ## 2, d ## 2, RX1, RY1, prerotate);
+
+#define decrypt_round(n, a, b, c, d, preload, prerotate) \
+       vbroadcastss (k+4*(2*(n)))(CTX),   RK1;                  \
+       vbroadcastss (k+4*(2*(n)+1))(CTX), RK2;                  \
+       round_head_2(a, b, RX0, RY0, RX1, RY1);                  \
+       decround_tail(a ## 1, b ## 1, c ## 1, d ## 1, RX0, RY0, prerotate); \
+       preload(c ## 1);                                         \
+       decround_tail(a ## 2, b ## 2, c ## 2, d ## 2, RX1, RY1, prerotate);
 
 #define encrypt_cycle(n) \
-       encrypt_round((2*n), RA, RB, RC, RD);       \
-       encrypt_round(((2*n) + 1), RC, RD, RA, RB);
+       encrypt_round((2*n), RA, RB, RC, RD, preload_rgi, rotate_1l); \
+       encrypt_round(((2*n) + 1), RC, RD, RA, RB, preload_rgi, rotate_1l);
+
+#define encrypt_cycle_last(n) \
+       encrypt_round((2*n), RA, RB, RC, RD, preload_rgi, rotate_1l); \
+       encrypt_round(((2*n) + 1), RC, RD, RA, RB, dummy, dummy);
 
 #define decrypt_cycle(n) \
-       decrypt_round(((2*n) + 1), RC, RD, RA, RB); \
-       decrypt_round((2*n), RA, RB, RC, RD);
+       decrypt_round(((2*n) + 1), RC, RD, RA, RB, preload_rgi, rotate_1l); \
+       decrypt_round((2*n), RA, RB, RC, RD, preload_rgi, rotate_1l);
 
+#define decrypt_cycle_last(n) \
+       decrypt_round(((2*n) + 1), RC, RD, RA, RB, preload_rgi, rotate_1l); \
+       decrypt_round((2*n), RA, RB, RC, RD, dummy, dummy);
 
 #define transpose_4x4(x0, x1, x2, x3, t0, t1, t2) \
        vpunpckldq              x1, x0, t0; \
@@ -216,17 +265,20 @@ __twofish_enc_blk_8way:
         *      %rcx: bool, if true: xor output
         */
 
+       pushq %rbp;
        pushq %rbx;
        pushq %rcx;
 
        vmovdqu w(CTX), RK1;
 
        leaq (4*4*4)(%rdx), %rax;
-       inpack_blocks(%rdx, RA1, RB1, RC1, RD1, RK1, RX, RY, RK2);
-       inpack_blocks(%rax, RA2, RB2, RC2, RD2, RK1, RX, RY, RK2);
+       inpack_blocks(%rdx, RA1, RB1, RC1, RD1, RK1, RX0, RY0, RK2);
+       preload_rgi(RA1);
+       rotate_1l(RD1);
+       inpack_blocks(%rax, RA2, RB2, RC2, RD2, RK1, RX0, RY0, RK2);
+       rotate_1l(RD2);
 
-       xorq RID1, RID1;
-       xorq RID2, RID2;
+       movq %rsi, %r11;
 
        encrypt_cycle(0);
        encrypt_cycle(1);
@@ -235,26 +287,27 @@ __twofish_enc_blk_8way:
        encrypt_cycle(4);
        encrypt_cycle(5);
        encrypt_cycle(6);
-       encrypt_cycle(7);
+       encrypt_cycle_last(7);
 
        vmovdqu (w+4*4)(CTX), RK1;
 
        popq %rcx;
        popq %rbx;
+       popq %rbp;
 
-       leaq (4*4*4)(%rsi), %rax;
+       leaq (4*4*4)(%r11), %rax;
 
        testb %cl, %cl;
        jnz __enc_xor8;
 
-       outunpack_blocks(%rsi, RC1, RD1, RA1, RB1, RK1, RX, RY, RK2);
-       outunpack_blocks(%rax, RC2, RD2, RA2, RB2, RK1, RX, RY, RK2);
+       outunpack_blocks(%r11, RC1, RD1, RA1, RB1, RK1, RX0, RY0, RK2);
+       outunpack_blocks(%rax, RC2, RD2, RA2, RB2, RK1, RX0, RY0, RK2);
 
        ret;
 
 __enc_xor8:
-       outunpack_xor_blocks(%rsi, RC1, RD1, RA1, RB1, RK1, RX, RY, RK2);
-       outunpack_xor_blocks(%rax, RC2, RD2, RA2, RB2, RK1, RX, RY, RK2);
+       outunpack_xor_blocks(%r11, RC1, RD1, RA1, RB1, RK1, RX0, RY0, RK2);
+       outunpack_xor_blocks(%rax, RC2, RD2, RA2, RB2, RK1, RX0, RY0, RK2);
 
        ret;
 
@@ -269,16 +322,19 @@ twofish_dec_blk_8way:
         *      %rdx: src
         */
 
+       pushq %rbp;
        pushq %rbx;
 
        vmovdqu (w+4*4)(CTX), RK1;
 
        leaq (4*4*4)(%rdx), %rax;
-       inpack_blocks(%rdx, RC1, RD1, RA1, RB1, RK1, RX, RY, RK2);
-       inpack_blocks(%rax, RC2, RD2, RA2, RB2, RK1, RX, RY, RK2);
+       inpack_blocks(%rdx, RC1, RD1, RA1, RB1, RK1, RX0, RY0, RK2);
+       preload_rgi(RC1);
+       rotate_1l(RA1);
+       inpack_blocks(%rax, RC2, RD2, RA2, RB2, RK1, RX0, RY0, RK2);
+       rotate_1l(RA2);
 
-       xorq RID1, RID1;
-       xorq RID2, RID2;
+       movq %rsi, %r11;
 
        decrypt_cycle(7);
        decrypt_cycle(6);
@@ -287,14 +343,15 @@ twofish_dec_blk_8way:
        decrypt_cycle(3);
        decrypt_cycle(2);
        decrypt_cycle(1);
-       decrypt_cycle(0);
+       decrypt_cycle_last(0);
 
        vmovdqu (w)(CTX), RK1;
 
        popq %rbx;
+       popq %rbp;
 
-       leaq (4*4*4)(%rsi), %rax;
-       outunpack_blocks(%rsi, RA1, RB1, RC1, RD1, RK1, RX, RY, RK2);
-       outunpack_blocks(%rax, RA2, RB2, RC2, RD2, RK1, RX, RY, RK2);
+       leaq (4*4*4)(%r11), %rax;
+       outunpack_blocks(%r11, RA1, RB1, RC1, RD1, RK1, RX0, RY0, RK2);
+       outunpack_blocks(%rax, RA2, RB2, RC2, RD2, RK1, RX0, RY0, RK2);
 
        ret;
index 782b67d..e7708b5 100644 (file)
@@ -378,7 +378,6 @@ static struct crypto_alg twofish_algs[10] = { {
        .cra_alignmask          = 0,
        .cra_type               = &crypto_blkcipher_type,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(twofish_algs[0].cra_list),
        .cra_u = {
                .blkcipher = {
                        .min_keysize    = TF_MIN_KEY_SIZE,
@@ -398,7 +397,6 @@ static struct crypto_alg twofish_algs[10] = { {
        .cra_alignmask          = 0,
        .cra_type               = &crypto_blkcipher_type,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(twofish_algs[1].cra_list),
        .cra_u = {
                .blkcipher = {
                        .min_keysize    = TF_MIN_KEY_SIZE,
@@ -418,7 +416,6 @@ static struct crypto_alg twofish_algs[10] = { {
        .cra_alignmask          = 0,
        .cra_type               = &crypto_blkcipher_type,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(twofish_algs[2].cra_list),
        .cra_u = {
                .blkcipher = {
                        .min_keysize    = TF_MIN_KEY_SIZE,
@@ -439,7 +436,6 @@ static struct crypto_alg twofish_algs[10] = { {
        .cra_alignmask          = 0,
        .cra_type               = &crypto_blkcipher_type,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(twofish_algs[3].cra_list),
        .cra_exit               = lrw_twofish_exit_tfm,
        .cra_u = {
                .blkcipher = {
@@ -463,7 +459,6 @@ static struct crypto_alg twofish_algs[10] = { {
        .cra_alignmask          = 0,
        .cra_type               = &crypto_blkcipher_type,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(twofish_algs[4].cra_list),
        .cra_u = {
                .blkcipher = {
                        .min_keysize    = TF_MIN_KEY_SIZE * 2,
@@ -484,7 +479,6 @@ static struct crypto_alg twofish_algs[10] = { {
        .cra_alignmask          = 0,
        .cra_type               = &crypto_ablkcipher_type,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(twofish_algs[5].cra_list),
        .cra_init               = ablk_init,
        .cra_exit               = ablk_exit,
        .cra_u = {
@@ -506,7 +500,6 @@ static struct crypto_alg twofish_algs[10] = { {
        .cra_alignmask          = 0,
        .cra_type               = &crypto_ablkcipher_type,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(twofish_algs[6].cra_list),
        .cra_init               = ablk_init,
        .cra_exit               = ablk_exit,
        .cra_u = {
@@ -529,7 +522,6 @@ static struct crypto_alg twofish_algs[10] = { {
        .cra_alignmask          = 0,
        .cra_type               = &crypto_ablkcipher_type,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(twofish_algs[7].cra_list),
        .cra_init               = ablk_init,
        .cra_exit               = ablk_exit,
        .cra_u = {
@@ -553,7 +545,6 @@ static struct crypto_alg twofish_algs[10] = { {
        .cra_alignmask          = 0,
        .cra_type               = &crypto_ablkcipher_type,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(twofish_algs[8].cra_list),
        .cra_init               = ablk_init,
        .cra_exit               = ablk_exit,
        .cra_u = {
@@ -578,7 +569,6 @@ static struct crypto_alg twofish_algs[10] = { {
        .cra_alignmask          = 0,
        .cra_type               = &crypto_ablkcipher_type,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(twofish_algs[9].cra_list),
        .cra_init               = ablk_init,
        .cra_exit               = ablk_exit,
        .cra_u = {
index 359ae08..0a52023 100644 (file)
@@ -70,7 +70,6 @@ static struct crypto_alg alg = {
        .cra_ctxsize            =       sizeof(struct twofish_ctx),
        .cra_alignmask          =       0,
        .cra_module             =       THIS_MODULE,
-       .cra_list               =       LIST_HEAD_INIT(alg.cra_list),
        .cra_u                  =       {
                .cipher = {
                        .cia_min_keysize        =       TF_MIN_KEY_SIZE,
index 15f9347..aa3eb35 100644 (file)
@@ -342,7 +342,6 @@ static struct crypto_alg tf_algs[5] = { {
        .cra_alignmask          = 0,
        .cra_type               = &crypto_blkcipher_type,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(tf_algs[0].cra_list),
        .cra_u = {
                .blkcipher = {
                        .min_keysize    = TF_MIN_KEY_SIZE,
@@ -362,7 +361,6 @@ static struct crypto_alg tf_algs[5] = { {
        .cra_alignmask          = 0,
        .cra_type               = &crypto_blkcipher_type,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(tf_algs[1].cra_list),
        .cra_u = {
                .blkcipher = {
                        .min_keysize    = TF_MIN_KEY_SIZE,
@@ -383,7 +381,6 @@ static struct crypto_alg tf_algs[5] = { {
        .cra_alignmask          = 0,
        .cra_type               = &crypto_blkcipher_type,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(tf_algs[2].cra_list),
        .cra_u = {
                .blkcipher = {
                        .min_keysize    = TF_MIN_KEY_SIZE,
@@ -404,7 +401,6 @@ static struct crypto_alg tf_algs[5] = { {
        .cra_alignmask          = 0,
        .cra_type               = &crypto_blkcipher_type,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(tf_algs[3].cra_list),
        .cra_exit               = lrw_twofish_exit_tfm,
        .cra_u = {
                .blkcipher = {
@@ -426,7 +422,6 @@ static struct crypto_alg tf_algs[5] = { {
        .cra_alignmask          = 0,
        .cra_type               = &crypto_blkcipher_type,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(tf_algs[4].cra_list),
        .cra_u = {
                .blkcipher = {
                        .min_keysize    = TF_MIN_KEY_SIZE * 2,
diff --git a/crypto/842.c b/crypto/842.c
new file mode 100644 (file)
index 0000000..65c7a89
--- /dev/null
@@ -0,0 +1,182 @@
+/*
+ * Cryptographic API for the 842 compression algorithm.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ * Copyright (C) IBM Corporation, 2011
+ *
+ * Authors: Robert Jennings <rcj@linux.vnet.ibm.com>
+ *          Seth Jennings <sjenning@linux.vnet.ibm.com>
+ */
+
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/crypto.h>
+#include <linux/vmalloc.h>
+#include <linux/nx842.h>
+#include <linux/lzo.h>
+#include <linux/timer.h>
+
+static int nx842_uselzo;
+
+struct nx842_ctx {
+       void *nx842_wmem; /* working memory for 842/lzo */
+};
+
+enum nx842_crypto_type {
+       NX842_CRYPTO_TYPE_842,
+       NX842_CRYPTO_TYPE_LZO
+};
+
+#define NX842_SENTINEL 0xdeadbeef
+
+struct nx842_crypto_header {
+       unsigned int sentinel; /* debug */
+       enum nx842_crypto_type type;
+};
+
+static int nx842_init(struct crypto_tfm *tfm)
+{
+       struct nx842_ctx *ctx = crypto_tfm_ctx(tfm);
+       int wmemsize;
+
+       wmemsize = max_t(int, nx842_get_workmem_size(), LZO1X_MEM_COMPRESS);
+       ctx->nx842_wmem = kmalloc(wmemsize, GFP_NOFS);
+       if (!ctx->nx842_wmem)
+               return -ENOMEM;
+
+       return 0;
+}
+
+static void nx842_exit(struct crypto_tfm *tfm)
+{
+       struct nx842_ctx *ctx = crypto_tfm_ctx(tfm);
+
+       kfree(ctx->nx842_wmem);
+}
+
+static void nx842_reset_uselzo(unsigned long data)
+{
+       nx842_uselzo = 0;
+}
+
+static DEFINE_TIMER(failover_timer, nx842_reset_uselzo, 0, 0);
+
+static int nx842_crypto_compress(struct crypto_tfm *tfm, const u8 *src,
+                           unsigned int slen, u8 *dst, unsigned int *dlen)
+{
+       struct nx842_ctx *ctx = crypto_tfm_ctx(tfm);
+       struct nx842_crypto_header *hdr;
+       unsigned int tmp_len = *dlen;
+       size_t lzodlen; /* needed for lzo */
+       int err;
+
+       *dlen = 0;
+       hdr = (struct nx842_crypto_header *)dst;
+       hdr->sentinel = NX842_SENTINEL; /* debug */
+       dst += sizeof(struct nx842_crypto_header);
+       tmp_len -= sizeof(struct nx842_crypto_header);
+       lzodlen = tmp_len;
+
+       if (likely(!nx842_uselzo)) {
+               err = nx842_compress(src, slen, dst, &tmp_len, ctx->nx842_wmem);
+
+               if (likely(!err)) {
+                       hdr->type = NX842_CRYPTO_TYPE_842;
+                       *dlen = tmp_len + sizeof(struct nx842_crypto_header);
+                       return 0;
+               }
+
+               /* hardware failed */
+               nx842_uselzo = 1;
+
+               /* set timer to check for hardware again in 1 second */
+               mod_timer(&failover_timer, jiffies + msecs_to_jiffies(1000));
+       }
+
+       /* no hardware, use lzo */
+       err = lzo1x_1_compress(src, slen, dst, &lzodlen, ctx->nx842_wmem);
+       if (err != LZO_E_OK)
+               return -EINVAL;
+
+       hdr->type = NX842_CRYPTO_TYPE_LZO;
+       *dlen = lzodlen + sizeof(struct nx842_crypto_header);
+       return 0;
+}
+
+static int nx842_crypto_decompress(struct crypto_tfm *tfm, const u8 *src,
+                             unsigned int slen, u8 *dst, unsigned int *dlen)
+{
+       struct nx842_ctx *ctx = crypto_tfm_ctx(tfm);
+       struct nx842_crypto_header *hdr;
+       unsigned int tmp_len = *dlen;
+       size_t lzodlen; /* needed for lzo */
+       int err;
+
+       *dlen = 0;
+       hdr = (struct nx842_crypto_header *)src;
+
+       if (unlikely(hdr->sentinel != NX842_SENTINEL))
+               return -EINVAL;
+
+       src += sizeof(struct nx842_crypto_header);
+       slen -= sizeof(struct nx842_crypto_header);
+
+       if (likely(hdr->type == NX842_CRYPTO_TYPE_842)) {
+               err = nx842_decompress(src, slen, dst, &tmp_len,
+                       ctx->nx842_wmem);
+               if (err)
+                       return -EINVAL;
+               *dlen = tmp_len;
+       } else if (hdr->type == NX842_CRYPTO_TYPE_LZO) {
+               lzodlen = tmp_len;
+               err = lzo1x_decompress_safe(src, slen, dst, &lzodlen);
+               if (err != LZO_E_OK)
+                       return -EINVAL;
+               *dlen = lzodlen;
+       } else
+               return -EINVAL;
+
+       return 0;
+}
+
+static struct crypto_alg alg = {
+       .cra_name               = "842",
+       .cra_flags              = CRYPTO_ALG_TYPE_COMPRESS,
+       .cra_ctxsize            = sizeof(struct nx842_ctx),
+       .cra_module             = THIS_MODULE,
+       .cra_init               = nx842_init,
+       .cra_exit               = nx842_exit,
+       .cra_u                  = { .compress = {
+       .coa_compress           = nx842_crypto_compress,
+       .coa_decompress         = nx842_crypto_decompress } }
+};
+
+static int __init nx842_mod_init(void)
+{
+       del_timer(&failover_timer);
+       return crypto_register_alg(&alg);
+}
+
+static void __exit nx842_mod_exit(void)
+{
+       crypto_unregister_alg(&alg);
+}
+
+module_init(nx842_mod_init);
+module_exit(nx842_mod_exit);
+
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("842 Compression Algorithm");
index 957cc56..50402dc 100644 (file)
@@ -460,6 +460,15 @@ config CRYPTO_SHA1_SPARC64
          SHA-1 secure hash standard (FIPS 180-1/DFIPS 180-2) implemented
          using sparc64 crypto instructions, when available.
 
+config CRYPTO_SHA1_ARM
+       tristate "SHA1 digest algorithm (ARM-asm)"
+       depends on ARM
+       select CRYPTO_SHA1
+       select CRYPTO_HASH
+       help
+         SHA-1 secure hash standard (FIPS 180-1/DFIPS 180-2) implemented
+         using optimized ARM assembler.
+
 config CRYPTO_SHA256
        tristate "SHA224 and SHA256 digest algorithm"
        select CRYPTO_HASH
@@ -609,6 +618,8 @@ config CRYPTO_AES_NI_INTEL
        select CRYPTO_CRYPTD
        select CRYPTO_ABLK_HELPER_X86
        select CRYPTO_ALGAPI
+       select CRYPTO_LRW
+       select CRYPTO_XTS
        help
          Use Intel AES-NI instructions for AES algorithm.
 
@@ -661,6 +672,30 @@ config CRYPTO_AES_SPARC64
          for some popular block cipher mode is supported too, including
          ECB and CBC.
 
+config CRYPTO_AES_ARM
+       tristate "AES cipher algorithms (ARM-asm)"
+       depends on ARM
+       select CRYPTO_ALGAPI
+       select CRYPTO_AES
+       help
+         Use optimized AES assembler routines for ARM platforms.
+
+         AES cipher algorithms (FIPS-197). AES uses the Rijndael
+         algorithm.
+
+         Rijndael appears to be consistently a very good performer in
+         both hardware and software across a wide range of computing
+         environments regardless of its use in feedback or non-feedback
+         modes. Its key setup time is excellent, and its key agility is
+         good. Rijndael's very low memory requirements make it very well
+         suited for restricted-space environments, in which it also
+         demonstrates excellent performance. Rijndael's operations are
+         among the easiest to defend against power and timing attacks.
+
+         The AES specifies three key sizes: 128, 192 and 256 bits
+
+         See <http://csrc.nist.gov/encryption/aes/> for more information.
+
 config CRYPTO_ANUBIS
        tristate "Anubis cipher algorithm"
        select CRYPTO_ALGAPI
@@ -781,6 +816,20 @@ config CRYPTO_CAST5
          The CAST5 encryption algorithm (synonymous with CAST-128) is
          described in RFC2144.
 
+config CRYPTO_CAST5_AVX_X86_64
+       tristate "CAST5 (CAST-128) cipher algorithm (x86_64/AVX)"
+       depends on X86 && 64BIT
+       select CRYPTO_ALGAPI
+       select CRYPTO_CRYPTD
+       select CRYPTO_ABLK_HELPER_X86
+       select CRYPTO_CAST5
+       help
+         The CAST5 encryption algorithm (synonymous with CAST-128) is
+         described in RFC2144.
+
+         This module provides the Cast5 cipher algorithm that processes
+         sixteen blocks parallel using the AVX instruction set.
+
 config CRYPTO_CAST6
        tristate "CAST6 (CAST-256) cipher algorithm"
        select CRYPTO_ALGAPI
@@ -788,6 +837,23 @@ config CRYPTO_CAST6
          The CAST6 encryption algorithm (synonymous with CAST-256) is
          described in RFC2612.
 
+config CRYPTO_CAST6_AVX_X86_64
+       tristate "CAST6 (CAST-256) cipher algorithm (x86_64/AVX)"
+       depends on X86 && 64BIT
+       select CRYPTO_ALGAPI
+       select CRYPTO_CRYPTD
+       select CRYPTO_ABLK_HELPER_X86
+       select CRYPTO_GLUE_HELPER_X86
+       select CRYPTO_CAST6
+       select CRYPTO_LRW
+       select CRYPTO_XTS
+       help
+         The CAST6 encryption algorithm (synonymous with CAST-256) is
+         described in RFC2612.
+
+         This module provides the Cast6 cipher algorithm that processes
+         eight blocks parallel using the AVX instruction set.
+
 config CRYPTO_DES
        tristate "DES and Triple DES EDE cipher algorithms"
        select CRYPTO_ALGAPI
@@ -1106,6 +1172,15 @@ config CRYPTO_LZO
        help
          This is the LZO algorithm.
 
+config CRYPTO_842
+       tristate "842 compression algorithm"
+       depends on CRYPTO_DEV_NX_COMPRESS
+       # 842 uses lzo if the hardware becomes unavailable
+       select LZO_COMPRESS
+       select LZO_DECOMPRESS
+       help
+         This is the 842 algorithm.
+
 comment "Random Number Generation"
 
 config CRYPTO_ANSI_CPRNG
index 30f33d6..a301ad2 100644 (file)
@@ -68,8 +68,8 @@ obj-$(CONFIG_CRYPTO_TWOFISH_COMMON) += twofish_common.o
 obj-$(CONFIG_CRYPTO_SERPENT) += serpent_generic.o
 obj-$(CONFIG_CRYPTO_AES) += aes_generic.o
 obj-$(CONFIG_CRYPTO_CAMELLIA) += camellia_generic.o
-obj-$(CONFIG_CRYPTO_CAST5) += cast5.o
-obj-$(CONFIG_CRYPTO_CAST6) += cast6.o
+obj-$(CONFIG_CRYPTO_CAST5) += cast5_generic.o
+obj-$(CONFIG_CRYPTO_CAST6) += cast6_generic.o
 obj-$(CONFIG_CRYPTO_ARC4) += arc4.o
 obj-$(CONFIG_CRYPTO_TEA) += tea.o
 obj-$(CONFIG_CRYPTO_KHAZAD) += khazad.o
@@ -82,6 +82,7 @@ obj-$(CONFIG_CRYPTO_MICHAEL_MIC) += michael_mic.o
 obj-$(CONFIG_CRYPTO_CRC32C) += crc32c.o
 obj-$(CONFIG_CRYPTO_AUTHENC) += authenc.o authencesn.o
 obj-$(CONFIG_CRYPTO_LZO) += lzo.o
+obj-$(CONFIG_CRYPTO_842) += 842.o
 obj-$(CONFIG_CRYPTO_RNG2) += rng.o
 obj-$(CONFIG_CRYPTO_RNG2) += krng.o
 obj-$(CONFIG_CRYPTO_ANSI_CPRNG) += ansi_cprng.o
index a68c73d..47f2e5c 100644 (file)
@@ -1448,7 +1448,6 @@ static struct crypto_alg aes_alg = {
        .cra_ctxsize            =       sizeof(struct crypto_aes_ctx),
        .cra_alignmask          =       3,
        .cra_module             =       THIS_MODULE,
-       .cra_list               =       LIST_HEAD_INIT(aes_alg.cra_list),
        .cra_u                  =       {
                .cipher = {
                        .cia_min_keysize        =       AES_MIN_KEY_SIZE,
index 6ddd99e..c0bb377 100644 (file)
@@ -382,26 +382,6 @@ static int cprng_reset(struct crypto_rng *tfm, u8 *seed, unsigned int slen)
        return 0;
 }
 
-static struct crypto_alg rng_alg = {
-       .cra_name               = "stdrng",
-       .cra_driver_name        = "ansi_cprng",
-       .cra_priority           = 100,
-       .cra_flags              = CRYPTO_ALG_TYPE_RNG,
-       .cra_ctxsize            = sizeof(struct prng_context),
-       .cra_type               = &crypto_rng_type,
-       .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(rng_alg.cra_list),
-       .cra_init               = cprng_init,
-       .cra_exit               = cprng_exit,
-       .cra_u                  = {
-               .rng = {
-                       .rng_make_random        = cprng_get_random,
-                       .rng_reset              = cprng_reset,
-                       .seedsize = DEFAULT_PRNG_KSZ + 2*DEFAULT_BLK_SZ,
-               }
-       }
-};
-
 #ifdef CONFIG_CRYPTO_FIPS
 static int fips_cprng_get_random(struct crypto_rng *tfm, u8 *rdata,
                            unsigned int dlen)
@@ -438,8 +418,27 @@ static int fips_cprng_reset(struct crypto_rng *tfm, u8 *seed, unsigned int slen)
 out:
        return rc;
 }
+#endif
 
-static struct crypto_alg fips_rng_alg = {
+static struct crypto_alg rng_algs[] = { {
+       .cra_name               = "stdrng",
+       .cra_driver_name        = "ansi_cprng",
+       .cra_priority           = 100,
+       .cra_flags              = CRYPTO_ALG_TYPE_RNG,
+       .cra_ctxsize            = sizeof(struct prng_context),
+       .cra_type               = &crypto_rng_type,
+       .cra_module             = THIS_MODULE,
+       .cra_init               = cprng_init,
+       .cra_exit               = cprng_exit,
+       .cra_u                  = {
+               .rng = {
+                       .rng_make_random        = cprng_get_random,
+                       .rng_reset              = cprng_reset,
+                       .seedsize = DEFAULT_PRNG_KSZ + 2*DEFAULT_BLK_SZ,
+               }
+       }
+#ifdef CONFIG_CRYPTO_FIPS
+}, {
        .cra_name               = "fips(ansi_cprng)",
        .cra_driver_name        = "fips_ansi_cprng",
        .cra_priority           = 300,
@@ -447,7 +446,6 @@ static struct crypto_alg fips_rng_alg = {
        .cra_ctxsize            = sizeof(struct prng_context),
        .cra_type               = &crypto_rng_type,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(rng_alg.cra_list),
        .cra_init               = cprng_init,
        .cra_exit               = cprng_exit,
        .cra_u                  = {
@@ -457,33 +455,18 @@ static struct crypto_alg fips_rng_alg = {
                        .seedsize = DEFAULT_PRNG_KSZ + 2*DEFAULT_BLK_SZ,
                }
        }
-};
 #endif
+} };
 
 /* Module initalization */
 static int __init prng_mod_init(void)
 {
-       int rc = 0;
-
-       rc = crypto_register_alg(&rng_alg);
-#ifdef CONFIG_CRYPTO_FIPS
-       if (rc)
-               goto out;
-
-       rc = crypto_register_alg(&fips_rng_alg);
-
-out:
-#endif
-       return rc;
+       return crypto_register_algs(rng_algs, ARRAY_SIZE(rng_algs));
 }
 
 static void __exit prng_mod_fini(void)
 {
-       crypto_unregister_alg(&rng_alg);
-#ifdef CONFIG_CRYPTO_FIPS
-       crypto_unregister_alg(&fips_rng_alg);
-#endif
-       return;
+       crypto_unregister_algs(rng_algs, ARRAY_SIZE(rng_algs));
 }
 
 MODULE_LICENSE("GPL");
index 77530d5..008c8a4 100644 (file)
@@ -678,7 +678,6 @@ static struct crypto_alg anubis_alg = {
        .cra_ctxsize            =       sizeof (struct anubis_ctx),
        .cra_alignmask          =       3,
        .cra_module             =       THIS_MODULE,
-       .cra_list               =       LIST_HEAD_INIT(anubis_alg.cra_list),
        .cra_u                  =       { .cipher = {
        .cia_min_keysize        =       ANUBIS_MIN_KEY_SIZE,
        .cia_max_keysize        =       ANUBIS_MAX_KEY_SIZE,
index 6f269b5..8baf544 100644 (file)
@@ -115,7 +115,6 @@ static struct crypto_alg alg = {
        .cra_ctxsize            =       sizeof(struct bf_ctx),
        .cra_alignmask          =       3,
        .cra_module             =       THIS_MODULE,
-       .cra_list               =       LIST_HEAD_INIT(alg.cra_list),
        .cra_u                  =       { .cipher = {
        .cia_min_keysize        =       BF_MIN_KEY_SIZE,
        .cia_max_keysize        =       BF_MAX_KEY_SIZE,
index f7aaaaf..75efa20 100644 (file)
@@ -1072,7 +1072,6 @@ static struct crypto_alg camellia_alg = {
        .cra_ctxsize            =       sizeof(struct camellia_ctx),
        .cra_alignmask          =       3,
        .cra_module             =       THIS_MODULE,
-       .cra_list               =       LIST_HEAD_INIT(camellia_alg.cra_list),
        .cra_u                  =       {
                .cipher = {
                        .cia_min_keysize        =       CAMELLIA_MIN_KEY_SIZE,
similarity index 95%
rename from crypto/cast5.c
rename to crypto/cast5_generic.c
index 4a230dd..bc525db 100644 (file)
@@ -4,8 +4,8 @@
 * Derived from GnuPG implementation of cast5.
 *
 * Major Changes.
-*      Complete conformance to rfc2144.
-*      Supports key size from 40 to 128 bits.
+*      Complete conformance to rfc2144.
+*      Supports key size from 40 to 128 bits.
 *
 * Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
 * Copyright (C) 2003 Kartikey Mahendra Bhatt <kartik_me@hotmail.com>.
 #include <linux/errno.h>
 #include <linux/string.h>
 #include <linux/types.h>
+#include <crypto/cast5.h>
 
-#define CAST5_BLOCK_SIZE 8
-#define CAST5_MIN_KEY_SIZE 5
-#define CAST5_MAX_KEY_SIZE 16
 
-struct cast5_ctx {
-       u32 Km[16];
-       u8 Kr[16];
-       int rr; /* rr?number of rounds = 16:number of rounds = 12; (rfc 2144) */
-};
-
-
-static const u32 s1[256] = {
+const u32 cast5_s1[256] = {
        0x30fb40d4, 0x9fa0ff0b, 0x6beccd2f, 0x3f258c7a, 0x1e213f2f,
        0x9c004dd3, 0x6003e540, 0xcf9fc949,
        0xbfd4af27, 0x88bbbdb5, 0xe2034090, 0x98d09675, 0x6e63a0e0,
@@ -106,7 +97,8 @@ static const u32 s1[256] = {
        0x1a69e783, 0x02cc4843, 0xa2f7c579, 0x429ef47d, 0x427b169c,
        0x5ac9f049, 0xdd8f0f00, 0x5c8165bf
 };
-static const u32 s2[256] = {
+EXPORT_SYMBOL_GPL(cast5_s1);
+const u32 cast5_s2[256] = {
        0x1f201094, 0xef0ba75b, 0x69e3cf7e, 0x393f4380, 0xfe61cf7a,
        0xeec5207a, 0x55889c94, 0x72fc0651,
        0xada7ef79, 0x4e1d7235, 0xd55a63ce, 0xde0436ba, 0x99c430ef,
@@ -172,7 +164,8 @@ static const u32 s2[256] = {
        0x43d79572, 0x7e6dd07c, 0x06dfdf1e, 0x6c6cc4ef, 0x7160a539,
        0x73bfbe70, 0x83877605, 0x4523ecf1
 };
-static const u32 s3[256] = {
+EXPORT_SYMBOL_GPL(cast5_s2);
+const u32 cast5_s3[256] = {
        0x8defc240, 0x25fa5d9f, 0xeb903dbf, 0xe810c907, 0x47607fff,
        0x369fe44b, 0x8c1fc644, 0xaececa90,
        0xbeb1f9bf, 0xeefbcaea, 0xe8cf1950, 0x51df07ae, 0x920e8806,
@@ -238,7 +231,8 @@ static const u32 s3[256] = {
        0xf7baefd5, 0x4142ed9c, 0xa4315c11, 0x83323ec5, 0xdfef4636,
        0xa133c501, 0xe9d3531c, 0xee353783
 };
-static const u32 s4[256] = {
+EXPORT_SYMBOL_GPL(cast5_s3);
+const u32 cast5_s4[256] = {
        0x9db30420, 0x1fb6e9de, 0xa7be7bef, 0xd273a298, 0x4a4f7bdb,
        0x64ad8c57, 0x85510443, 0xfa020ed1,
        0x7e287aff, 0xe60fb663, 0x095f35a1, 0x79ebf120, 0xfd059d43,
@@ -304,6 +298,7 @@ static const u32 s4[256] = {
        0x7ae5290c, 0x3cb9536b, 0x851e20fe, 0x9833557e, 0x13ecf0b0,
        0xd3ffb372, 0x3f85c5c1, 0x0aef7ed2
 };
+EXPORT_SYMBOL_GPL(cast5_s4);
 static const u32 s5[256] = {
        0x7ec90c04, 0x2c6e74b9, 0x9b0e66df, 0xa6337911, 0xb86a7fff,
        0x1dd358f5, 0x44dd9d44, 0x1731167f,
@@ -569,17 +564,21 @@ static const u32 sb8[256] = {
        0xeaee6801, 0x8db2a283, 0xea8bf59e
 };
 
+#define s1 cast5_s1
+#define s2 cast5_s2
+#define s3 cast5_s3
+#define s4 cast5_s4
+
 #define F1(D, m, r)  ((I = ((m) + (D))), (I = rol32(I, (r))),   \
-    (((s1[I >> 24] ^ s2[(I>>16)&0xff]) - s3[(I>>8)&0xff]) + s4[I&0xff]))
+       (((s1[I >> 24] ^ s2[(I>>16)&0xff]) - s3[(I>>8)&0xff]) + s4[I&0xff]))
 #define F2(D, m, r)  ((I = ((m) ^ (D))), (I = rol32(I, (r))),   \
-    (((s1[I >> 24] - s2[(I>>16)&0xff]) + s3[(I>>8)&0xff]) ^ s4[I&0xff]))
+       (((s1[I >> 24] - s2[(I>>16)&0xff]) + s3[(I>>8)&0xff]) ^ s4[I&0xff]))
 #define F3(D, m, r)  ((I = ((m) - (D))), (I = rol32(I, (r))),   \
-    (((s1[I >> 24] + s2[(I>>16)&0xff]) ^ s3[(I>>8)&0xff]) - s4[I&0xff]))
+       (((s1[I >> 24] + s2[(I>>16)&0xff]) ^ s3[(I>>8)&0xff]) - s4[I&0xff]))
 
 
-static void cast5_encrypt(struct crypto_tfm *tfm, u8 *outbuf, const u8 *inbuf)
+void __cast5_encrypt(struct cast5_ctx *c, u8 *outbuf, const u8 *inbuf)
 {
-       struct cast5_ctx *c = crypto_tfm_ctx(tfm);
        const __be32 *src = (const __be32 *)inbuf;
        __be32 *dst = (__be32 *)outbuf;
        u32 l, r, t;
@@ -628,10 +627,15 @@ static void cast5_encrypt(struct crypto_tfm *tfm, u8 *outbuf, const u8 *inbuf)
        dst[0] = cpu_to_be32(r);
        dst[1] = cpu_to_be32(l);
 }
+EXPORT_SYMBOL_GPL(__cast5_encrypt);
 
-static void cast5_decrypt(struct crypto_tfm *tfm, u8 *outbuf, const u8 *inbuf)
+static void cast5_encrypt(struct crypto_tfm *tfm, u8 *outbuf, const u8 *inbuf)
+{
+       __cast5_encrypt(crypto_tfm_ctx(tfm), outbuf, inbuf);
+}
+
+void __cast5_decrypt(struct cast5_ctx *c, u8 *outbuf, const u8 *inbuf)
 {
-       struct cast5_ctx *c = crypto_tfm_ctx(tfm);
        const __be32 *src = (const __be32 *)inbuf;
        __be32 *dst = (__be32 *)outbuf;
        u32 l, r, t;
@@ -667,6 +671,12 @@ static void cast5_decrypt(struct crypto_tfm *tfm, u8 *outbuf, const u8 *inbuf)
        dst[0] = cpu_to_be32(r);
        dst[1] = cpu_to_be32(l);
 }
+EXPORT_SYMBOL_GPL(__cast5_decrypt);
+
+static void cast5_decrypt(struct crypto_tfm *tfm, u8 *outbuf, const u8 *inbuf)
+{
+       __cast5_decrypt(crypto_tfm_ctx(tfm), outbuf, inbuf);
+}
 
 static void key_schedule(u32 *x, u32 *z, u32 *k)
 {
@@ -743,7 +753,7 @@ static void key_schedule(u32 *x, u32 *z, u32 *k)
 }
 
 
-static int cast5_setkey(struct crypto_tfm *tfm, const u8 *key, unsigned key_len)
+int cast5_setkey(struct crypto_tfm *tfm, const u8 *key, unsigned int key_len)
 {
        struct cast5_ctx *c = crypto_tfm_ctx(tfm);
        int i;
@@ -771,20 +781,22 @@ static int cast5_setkey(struct crypto_tfm *tfm, const u8 *key, unsigned key_len)
                c->Kr[i] = k[i] & 0x1f;
        return 0;
 }
+EXPORT_SYMBOL_GPL(cast5_setkey);
 
 static struct crypto_alg alg = {
-       .cra_name       = "cast5",
-       .cra_flags      = CRYPTO_ALG_TYPE_CIPHER,
-       .cra_blocksize  = CAST5_BLOCK_SIZE,
-       .cra_ctxsize    = sizeof(struct cast5_ctx),
-       .cra_alignmask  = 3,
-       .cra_module     = THIS_MODULE,
-       .cra_list       = LIST_HEAD_INIT(alg.cra_list),
-       .cra_u          = {
+       .cra_name               = "cast5",
+       .cra_driver_name        = "cast5-generic",
+       .cra_priority           = 100,
+       .cra_flags              = CRYPTO_ALG_TYPE_CIPHER,
+       .cra_blocksize          = CAST5_BLOCK_SIZE,
+       .cra_ctxsize            = sizeof(struct cast5_ctx),
+       .cra_alignmask          = 3,
+       .cra_module             = THIS_MODULE,
+       .cra_u                  = {
                .cipher = {
                        .cia_min_keysize = CAST5_MIN_KEY_SIZE,
                        .cia_max_keysize = CAST5_MAX_KEY_SIZE,
-                       .cia_setkey = cast5_setkey,
+                       .cia_setkey  = cast5_setkey,
                        .cia_encrypt = cast5_encrypt,
                        .cia_decrypt = cast5_decrypt
                }
@@ -806,4 +818,4 @@ module_exit(cast5_mod_fini);
 
 MODULE_LICENSE("GPL");
 MODULE_DESCRIPTION("Cast5 Cipher Algorithm");
-
+MODULE_ALIAS("cast5");
similarity index 93%
rename from crypto/cast6.c
rename to crypto/cast6_generic.c
index e0c15a6..1acd2f1 100644 (file)
 #include <linux/errno.h>
 #include <linux/string.h>
 #include <linux/types.h>
+#include <crypto/cast6.h>
 
-#define CAST6_BLOCK_SIZE 16
-#define CAST6_MIN_KEY_SIZE 16
-#define CAST6_MAX_KEY_SIZE 32
-
-struct cast6_ctx {
-       u32 Km[12][4];
-       u8 Kr[12][4];
-};
+#define s1 cast6_s1
+#define s2 cast6_s2
+#define s3 cast6_s3
+#define s4 cast6_s4
 
 #define F1(D, r, m)  ((I = ((m) + (D))), (I = rol32(I, (r))),   \
-    (((s1[I >> 24] ^ s2[(I>>16)&0xff]) - s3[(I>>8)&0xff]) + s4[I&0xff]))
+       (((s1[I >> 24] ^ s2[(I>>16)&0xff]) - s3[(I>>8)&0xff]) + s4[I&0xff]))
 #define F2(D, r, m)  ((I = ((m) ^ (D))), (I = rol32(I, (r))),   \
-    (((s1[I >> 24] - s2[(I>>16)&0xff]) + s3[(I>>8)&0xff]) ^ s4[I&0xff]))
+       (((s1[I >> 24] - s2[(I>>16)&0xff]) + s3[(I>>8)&0xff]) ^ s4[I&0xff]))
 #define F3(D, r, m)  ((I = ((m) - (D))), (I = rol32(I, (r))),   \
-    (((s1[I >> 24] + s2[(I>>16)&0xff]) ^ s3[(I>>8)&0xff]) - s4[I&0xff]))
+       (((s1[I >> 24] + s2[(I>>16)&0xff]) ^ s3[(I>>8)&0xff]) - s4[I&0xff]))
 
-static const u32 s1[256] = {
+const u32 cast6_s1[256] = {
        0x30fb40d4, 0x9fa0ff0b, 0x6beccd2f, 0x3f258c7a, 0x1e213f2f,
        0x9c004dd3, 0x6003e540, 0xcf9fc949,
        0xbfd4af27, 0x88bbbdb5, 0xe2034090, 0x98d09675, 0x6e63a0e0,
@@ -108,8 +105,9 @@ static const u32 s1[256] = {
        0x1a69e783, 0x02cc4843, 0xa2f7c579, 0x429ef47d, 0x427b169c,
        0x5ac9f049, 0xdd8f0f00, 0x5c8165bf
 };
+EXPORT_SYMBOL_GPL(cast6_s1);
 
-static const u32 s2[256] = {
+const u32 cast6_s2[256] = {
        0x1f201094, 0xef0ba75b, 0x69e3cf7e, 0x393f4380, 0xfe61cf7a,
        0xeec5207a, 0x55889c94, 0x72fc0651,
        0xada7ef79, 0x4e1d7235, 0xd55a63ce, 0xde0436ba, 0x99c430ef,
@@ -175,8 +173,9 @@ static const u32 s2[256] = {
        0x43d79572, 0x7e6dd07c, 0x06dfdf1e, 0x6c6cc4ef, 0x7160a539,
        0x73bfbe70, 0x83877605, 0x4523ecf1
 };
+EXPORT_SYMBOL_GPL(cast6_s2);
 
-static const u32 s3[256] = {
+const u32 cast6_s3[256] = {
        0x8defc240, 0x25fa5d9f, 0xeb903dbf, 0xe810c907, 0x47607fff,
        0x369fe44b, 0x8c1fc644, 0xaececa90,
        0xbeb1f9bf, 0xeefbcaea, 0xe8cf1950, 0x51df07ae, 0x920e8806,
@@ -242,8 +241,9 @@ static const u32 s3[256] = {
        0xf7baefd5, 0x4142ed9c, 0xa4315c11, 0x83323ec5, 0xdfef4636,
        0xa133c501, 0xe9d3531c, 0xee353783
 };
+EXPORT_SYMBOL_GPL(cast6_s3);
 
-static const u32 s4[256] = {
+const u32 cast6_s4[256] = {
        0x9db30420, 0x1fb6e9de, 0xa7be7bef, 0xd273a298, 0x4a4f7bdb,
        0x64ad8c57, 0x85510443, 0xfa020ed1,
        0x7e287aff, 0xe60fb663, 0x095f35a1, 0x79ebf120, 0xfd059d43,
@@ -309,6 +309,7 @@ static const u32 s4[256] = {
        0x7ae5290c, 0x3cb9536b, 0x851e20fe, 0x9833557e, 0x13ecf0b0,
        0xd3ffb372, 0x3f85c5c1, 0x0aef7ed2
 };
+EXPORT_SYMBOL_GPL(cast6_s4);
 
 static const u32 Tm[24][8] = {
        { 0x5a827999, 0xc95c653a, 0x383650db, 0xa7103c7c, 0x15ea281d,
@@ -369,7 +370,7 @@ static const u8 Tr[4][8] = {
 };
 
 /* forward octave */
-static void W(u32 *key, unsigned int i)
+static inline void W(u32 *key, unsigned int i)
 {
        u32 I;
        key[6] ^= F1(key[7], Tr[i % 4][0], Tm[i][0]);
@@ -382,14 +383,12 @@ static void W(u32 *key, unsigned int i)
        key[7] ^= F2(key[0], Tr[i % 4][7], Tm[i][7]);
 }
 
-static int cast6_setkey(struct crypto_tfm *tfm, const u8 *in_key,
-                       unsigned key_len)
+int __cast6_setkey(struct cast6_ctx *c, const u8 *in_key,
+                  unsigned key_len, u32 *flags)
 {
        int i;
        u32 key[8];
        __be32 p_key[8]; /* padded key */
-       struct cast6_ctx *c = crypto_tfm_ctx(tfm);
-       u32 *flags = &tfm->crt_flags;
 
        if (key_len % 4 != 0) {
                *flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
@@ -425,9 +424,17 @@ static int cast6_setkey(struct crypto_tfm *tfm, const u8 *in_key,
 
        return 0;
 }
+EXPORT_SYMBOL_GPL(__cast6_setkey);
+
+int cast6_setkey(struct crypto_tfm *tfm, const u8 *key, unsigned int keylen)
+{
+       return __cast6_setkey(crypto_tfm_ctx(tfm), key, keylen,
+                             &tfm->crt_flags);
+}
+EXPORT_SYMBOL_GPL(cast6_setkey);
 
 /*forward quad round*/
-static void Q(u32 *block, u8 *Kr, u32 *Km)
+static inline void Q(u32 *block, u8 *Kr, u32 *Km)
 {
        u32 I;
        block[2] ^= F1(block[3], Kr[0], Km[0]);
@@ -437,7 +444,7 @@ static void Q(u32 *block, u8 *Kr, u32 *Km)
 }
 
 /*reverse quad round*/
-static void QBAR(u32 *block, u8 *Kr, u32 *Km)
+static inline void QBAR(u32 *block, u8 *Kr, u32 *Km)
 {
        u32 I;
        block[3] ^= F1(block[0], Kr[3], Km[3]);
@@ -446,9 +453,8 @@ static void QBAR(u32 *block, u8 *Kr, u32 *Km)
        block[2] ^= F1(block[3], Kr[0], Km[0]);
 }
 
-static void cast6_encrypt(struct crypto_tfm *tfm, u8 *outbuf, const u8 *inbuf)
+void __cast6_encrypt(struct cast6_ctx *c, u8 *outbuf, const u8 *inbuf)
 {
-       struct cast6_ctx *c = crypto_tfm_ctx(tfm);
        const __be32 *src = (const __be32 *)inbuf;
        __be32 *dst = (__be32 *)outbuf;
        u32 block[4];
@@ -478,10 +484,15 @@ static void cast6_encrypt(struct crypto_tfm *tfm, u8 *outbuf, const u8 *inbuf)
        dst[2] = cpu_to_be32(block[2]);
        dst[3] = cpu_to_be32(block[3]);
 }
+EXPORT_SYMBOL_GPL(__cast6_encrypt);
 
-static void cast6_decrypt(struct crypto_tfm *tfm, u8 *outbuf, const u8 *inbuf)
+static void cast6_encrypt(struct crypto_tfm *tfm, u8 *outbuf, const u8 *inbuf)
+{
+       __cast6_encrypt(crypto_tfm_ctx(tfm), outbuf, inbuf);
+}
+
+void __cast6_decrypt(struct cast6_ctx *c, u8 *outbuf, const u8 *inbuf)
 {
-       struct cast6_ctx *c = crypto_tfm_ctx(tfm);
        const __be32 *src = (const __be32 *)inbuf;
        __be32 *dst = (__be32 *)outbuf;
        u32 block[4];
@@ -511,15 +522,22 @@ static void cast6_decrypt(struct crypto_tfm *tfm, u8 *outbuf, const u8 *inbuf)
        dst[2] = cpu_to_be32(block[2]);
        dst[3] = cpu_to_be32(block[3]);
 }
+EXPORT_SYMBOL_GPL(__cast6_decrypt);
+
+static void cast6_decrypt(struct crypto_tfm *tfm, u8 *outbuf, const u8 *inbuf)
+{
+       __cast6_decrypt(crypto_tfm_ctx(tfm), outbuf, inbuf);
+}
 
 static struct crypto_alg alg = {
        .cra_name = "cast6",
+       .cra_driver_name = "cast6-generic",
+       .cra_priority = 100,
        .cra_flags = CRYPTO_ALG_TYPE_CIPHER,
        .cra_blocksize = CAST6_BLOCK_SIZE,
        .cra_ctxsize = sizeof(struct cast6_ctx),
        .cra_alignmask = 3,
        .cra_module = THIS_MODULE,
-       .cra_list = LIST_HEAD_INIT(alg.cra_list),
        .cra_u = {
                  .cipher = {
                             .cia_min_keysize = CAST6_MIN_KEY_SIZE,
@@ -545,3 +563,4 @@ module_exit(cast6_mod_fini);
 
 MODULE_LICENSE("GPL");
 MODULE_DESCRIPTION("Cast6 Cipher Algorithm");
+MODULE_ALIAS("cast6");
index 07a8a96..fee7265 100644 (file)
@@ -94,18 +94,6 @@ static int skcipher_null_crypt(struct blkcipher_desc *desc,
        return err;
 }
 
-static struct crypto_alg compress_null = {
-       .cra_name               =       "compress_null",
-       .cra_flags              =       CRYPTO_ALG_TYPE_COMPRESS,
-       .cra_blocksize          =       NULL_BLOCK_SIZE,
-       .cra_ctxsize            =       0,
-       .cra_module             =       THIS_MODULE,
-       .cra_list               =       LIST_HEAD_INIT(compress_null.cra_list),
-       .cra_u                  =       { .compress = {
-       .coa_compress           =       null_compress,
-       .coa_decompress         =       null_compress } }
-};
-
 static struct shash_alg digest_null = {
        .digestsize             =       NULL_DIGEST_SIZE,
        .setkey                 =       null_hash_setkey,
@@ -122,22 +110,19 @@ static struct shash_alg digest_null = {
        }
 };
 
-static struct crypto_alg cipher_null = {
+static struct crypto_alg null_algs[3] = { {
        .cra_name               =       "cipher_null",
        .cra_flags              =       CRYPTO_ALG_TYPE_CIPHER,
        .cra_blocksize          =       NULL_BLOCK_SIZE,
        .cra_ctxsize            =       0,
        .cra_module             =       THIS_MODULE,
-       .cra_list               =       LIST_HEAD_INIT(cipher_null.cra_list),
        .cra_u                  =       { .cipher = {
        .cia_min_keysize        =       NULL_KEY_SIZE,
        .cia_max_keysize        =       NULL_KEY_SIZE,
        .cia_setkey             =       null_setkey,
        .cia_encrypt            =       null_crypt,
        .cia_decrypt            =       null_crypt } }
-};
-
-static struct crypto_alg skcipher_null = {
+}, {
        .cra_name               =       "ecb(cipher_null)",
        .cra_driver_name        =       "ecb-cipher_null",
        .cra_priority           =       100,
@@ -146,7 +131,6 @@ static struct crypto_alg skcipher_null = {
        .cra_type               =       &crypto_blkcipher_type,
        .cra_ctxsize            =       0,
        .cra_module             =       THIS_MODULE,
-       .cra_list               =       LIST_HEAD_INIT(skcipher_null.cra_list),
        .cra_u                  =       { .blkcipher = {
        .min_keysize            =       NULL_KEY_SIZE,
        .max_keysize            =       NULL_KEY_SIZE,
@@ -154,7 +138,16 @@ static struct crypto_alg skcipher_null = {
        .setkey                 =       null_setkey,
        .encrypt                =       skcipher_null_crypt,
        .decrypt                =       skcipher_null_crypt } }
-};
+}, {
+       .cra_name               =       "compress_null",
+       .cra_flags              =       CRYPTO_ALG_TYPE_COMPRESS,
+       .cra_blocksize          =       NULL_BLOCK_SIZE,
+       .cra_ctxsize            =       0,
+       .cra_module             =       THIS_MODULE,
+       .cra_u                  =       { .compress = {
+       .coa_compress           =       null_compress,
+       .coa_decompress         =       null_compress } }
+} };
 
 MODULE_ALIAS("compress_null");
 MODULE_ALIAS("digest_null");
@@ -164,40 +157,26 @@ static int __init crypto_null_mod_init(void)
 {
        int ret = 0;
 
-       ret = crypto_register_alg(&cipher_null);
+       ret = crypto_register_algs(null_algs, ARRAY_SIZE(null_algs));
        if (ret < 0)
                goto out;
 
-       ret = crypto_register_alg(&skcipher_null);
-       if (ret < 0)
-               goto out_unregister_cipher;
-
        ret = crypto_register_shash(&digest_null);
        if (ret < 0)
-               goto out_unregister_skcipher;
+               goto out_unregister_algs;
 
-       ret = crypto_register_alg(&compress_null);
-       if (ret < 0)
-               goto out_unregister_digest;
+       return 0;
 
+out_unregister_algs:
+       crypto_unregister_algs(null_algs, ARRAY_SIZE(null_algs));
 out:
        return ret;
-
-out_unregister_digest:
-       crypto_unregister_shash(&digest_null);
-out_unregister_skcipher:
-       crypto_unregister_alg(&skcipher_null);
-out_unregister_cipher:
-       crypto_unregister_alg(&cipher_null);
-       goto out;
 }
 
 static void __exit crypto_null_mod_fini(void)
 {
-       crypto_unregister_alg(&compress_null);
        crypto_unregister_shash(&digest_null);
-       crypto_unregister_alg(&skcipher_null);
-       crypto_unregister_alg(&cipher_null);
+       crypto_unregister_algs(null_algs, ARRAY_SIZE(null_algs));
 }
 
 module_init(crypto_null_mod_init);
index 6bba414..35d700a 100644 (file)
@@ -30,7 +30,7 @@
 
 #include "internal.h"
 
-DEFINE_MUTEX(crypto_cfg_mutex);
+static DEFINE_MUTEX(crypto_cfg_mutex);
 
 /* The crypto netlink socket */
 static struct sock *crypto_nlsk;
index b0165ec..b57d70e 100644 (file)
@@ -199,7 +199,6 @@ static struct crypto_alg alg = {
        .cra_flags              = CRYPTO_ALG_TYPE_COMPRESS,
        .cra_ctxsize            = sizeof(struct deflate_ctx),
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(alg.cra_list),
        .cra_init               = deflate_init,
        .cra_exit               = deflate_exit,
        .cra_u                  = { .compress = {
index 873818d..f6cf63f 100644 (file)
@@ -943,59 +943,44 @@ static void des3_ede_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
        d[1] = cpu_to_le32(L);
 }
 
-static struct crypto_alg des_alg = {
+static struct crypto_alg des_algs[2] = { {
        .cra_name               =       "des",
        .cra_flags              =       CRYPTO_ALG_TYPE_CIPHER,
        .cra_blocksize          =       DES_BLOCK_SIZE,
        .cra_ctxsize            =       sizeof(struct des_ctx),
        .cra_module             =       THIS_MODULE,
        .cra_alignmask          =       3,
-       .cra_list               =       LIST_HEAD_INIT(des_alg.cra_list),
        .cra_u                  =       { .cipher = {
        .cia_min_keysize        =       DES_KEY_SIZE,
        .cia_max_keysize        =       DES_KEY_SIZE,
        .cia_setkey             =       des_setkey,
        .cia_encrypt            =       des_encrypt,
        .cia_decrypt            =       des_decrypt } }
-};
-
-static struct crypto_alg des3_ede_alg = {
+}, {
        .cra_name               =       "des3_ede",
        .cra_flags              =       CRYPTO_ALG_TYPE_CIPHER,
        .cra_blocksize          =       DES3_EDE_BLOCK_SIZE,
        .cra_ctxsize            =       sizeof(struct des3_ede_ctx),
        .cra_module             =       THIS_MODULE,
        .cra_alignmask          =       3,
-       .cra_list               =       LIST_HEAD_INIT(des3_ede_alg.cra_list),
        .cra_u                  =       { .cipher = {
        .cia_min_keysize        =       DES3_EDE_KEY_SIZE,
        .cia_max_keysize        =       DES3_EDE_KEY_SIZE,
        .cia_setkey             =       des3_ede_setkey,
        .cia_encrypt            =       des3_ede_encrypt,
        .cia_decrypt            =       des3_ede_decrypt } }
-};
+} };
 
 MODULE_ALIAS("des3_ede");
 
 static int __init des_generic_mod_init(void)
 {
-       int ret = 0;
-
-       ret = crypto_register_alg(&des_alg);
-       if (ret < 0)
-               goto out;
-
-       ret = crypto_register_alg(&des3_ede_alg);
-       if (ret < 0)
-               crypto_unregister_alg(&des_alg);
-out:
-       return ret;
+       return crypto_register_algs(des_algs, ARRAY_SIZE(des_algs));
 }
 
 static void __exit des_generic_mod_fini(void)
 {
-       crypto_unregister_alg(&des3_ede_alg);
-       crypto_unregister_alg(&des_alg);
+       crypto_unregister_algs(des_algs, ARRAY_SIZE(des_algs));
 }
 
 module_init(des_generic_mod_init);
index c33107e..3b2cf56 100644 (file)
@@ -396,7 +396,6 @@ static struct crypto_alg fcrypt_alg = {
        .cra_ctxsize            =       sizeof(struct fcrypt_ctx),
        .cra_module             =       THIS_MODULE,
        .cra_alignmask          =       3,
-       .cra_list               =       LIST_HEAD_INIT(fcrypt_alg.cra_list),
        .cra_u                  =       { .cipher = {
        .cia_min_keysize        =       8,
        .cia_max_keysize        =       8,
index 7835b8f..9d3f0c6 100644 (file)
@@ -153,7 +153,6 @@ static struct shash_alg ghash_alg = {
                .cra_blocksize          = GHASH_BLOCK_SIZE,
                .cra_ctxsize            = sizeof(struct ghash_ctx),
                .cra_module             = THIS_MODULE,
-               .cra_list               = LIST_HEAD_INIT(ghash_alg.base.cra_list),
                .cra_exit               = ghash_exit_tfm,
        },
 };
index 527e4e3..60e7cd6 100644 (file)
@@ -853,7 +853,6 @@ static struct crypto_alg khazad_alg = {
        .cra_ctxsize            =       sizeof (struct khazad_ctx),
        .cra_alignmask          =       7,
        .cra_module             =       THIS_MODULE,
-       .cra_list               =       LIST_HEAD_INIT(khazad_alg.cra_list),
        .cra_u                  =       { .cipher = {
        .cia_min_keysize        =       KHAZAD_KEY_SIZE,
        .cia_max_keysize        =       KHAZAD_KEY_SIZE,
index 4328bb3..a2d2b72 100644 (file)
@@ -35,7 +35,6 @@ static struct crypto_alg krng_alg = {
        .cra_ctxsize            = 0,
        .cra_type               = &crypto_rng_type,
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(krng_alg.cra_list),
        .cra_u                  = {
                .rng = {
                        .rng_make_random        = krng_get_random,
index b5e7707..1c2aa69 100644 (file)
@@ -81,7 +81,6 @@ static struct crypto_alg alg = {
        .cra_flags              = CRYPTO_ALG_TYPE_COMPRESS,
        .cra_ctxsize            = sizeof(struct lzo_ctx),
        .cra_module             = THIS_MODULE,
-       .cra_list               = LIST_HEAD_INIT(alg.cra_list),
        .cra_init               = lzo_init,
        .cra_exit               = lzo_exit,
        .cra_u                  = { .compress = {
index eac10c1..9a4770c 100644 (file)
@@ -221,7 +221,6 @@ static struct crypto_alg alg = {
        .cra_ctxsize        =   sizeof(struct salsa20_ctx),
        .cra_alignmask      =   3,
        .cra_module         =   THIS_MODULE,
-       .cra_list           =   LIST_HEAD_INIT(alg.cra_list),
        .cra_u              =   {
                .blkcipher = {
                        .setkey         =   setkey,
index d3e422f..9c904d6 100644 (file)
@@ -449,7 +449,6 @@ static struct crypto_alg seed_alg = {
        .cra_ctxsize            =       sizeof(struct seed_ctx),
        .cra_alignmask          =       3,
        .cra_module             =       THIS_MODULE,
-       .cra_list               =       LIST_HEAD_INIT(seed_alg.cra_list),
        .cra_u                  =       {
                .cipher = {
                        .cia_min_keysize        =       SEED_KEY_SIZE,
index 8f32cf3..7ddbd7e 100644 (file)
@@ -567,24 +567,6 @@ static void serpent_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
        __serpent_decrypt(ctx, dst, src);
 }
 
-static struct crypto_alg serpent_alg = {
-       .cra_name               =       "serpent",
-       .cra_driver_name        =       "serpent-generic",
-       .cra_priority           =       100,
-       .cra_flags              =       CRYPTO_ALG_TYPE_CIPHER,
-       .cra_blocksize          =       SERPENT_BLOCK_SIZE,
-       .cra_ctxsize            =       sizeof(struct serpent_ctx),
-       .cra_alignmask          =       3,
-       .cra_module             =       THIS_MODULE,
-       .cra_list               =       LIST_HEAD_INIT(serpent_alg.cra_list),
-       .cra_u                  =       { .cipher = {
-       .cia_min_keysize        =       SERPENT_MIN_KEY_SIZE,
-       .cia_max_keysize        =       SERPENT_MAX_KEY_SIZE,
-       .cia_setkey             =       serpent_setkey,
-       .cia_encrypt            =       serpent_encrypt,
-       .cia_decrypt            =       serpent_decrypt } }
-};
-
 static int tnepres_setkey(struct crypto_tfm *tfm, const u8 *key,
                          unsigned int keylen)
 {
@@ -637,41 +619,44 @@ static void tnepres_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
        d[3] = swab32(rd[0]);
 }
 
-static struct crypto_alg tnepres_alg = {
+static struct crypto_alg srp_algs[2] = { {
+       .cra_name               =       "serpent",
+       .cra_driver_name        =       "serpent-generic",
+       .cra_priority           =       100,
+       .cra_flags              =       CRYPTO_ALG_TYPE_CIPHER,
+       .cra_blocksize          =       SERPENT_BLOCK_SIZE,
+       .cra_ctxsize            =       sizeof(struct serpent_ctx),
+       .cra_alignmask          =       3,
+       .cra_module             =       THIS_MODULE,
+       .cra_u                  =       { .cipher = {
+       .cia_min_keysize        =       SERPENT_MIN_KEY_SIZE,
+       .cia_max_keysize        =       SERPENT_MAX_KEY_SIZE,
+       .cia_setkey             =       serpent_setkey,
+       .cia_encrypt            =       serpent_encrypt,
+       .cia_decrypt            =       serpent_decrypt } }
+}, {
        .cra_name               =       "tnepres",
        .cra_flags              =       CRYPTO_ALG_TYPE_CIPHER,
        .cra_blocksize          =       SERPENT_BLOCK_SIZE,
        .cra_ctxsize            =       sizeof(struct serpent_ctx),
        .cra_alignmask          =       3,
        .cra_module             =       THIS_MODULE,
-       .cra_list               =       LIST_HEAD_INIT(serpent_alg.cra_list),
        .cra_u                  =       { .cipher = {
        .cia_min_keysize        =       SERPENT_MIN_KEY_SIZE,
        .cia_max_keysize        =       SERPENT_MAX_KEY_SIZE,
        .cia_setkey             =       tnepres_setkey,
        .cia_encrypt            =       tnepres_encrypt,
        .cia_decrypt            =       tnepres_decrypt } }
-};
+} };
 
 static int __init serpent_mod_init(void)
 {
-       int ret = crypto_register_alg(&serpent_alg);
-
-       if (ret)
-               return ret;
-
-       ret = crypto_register_alg(&tnepres_alg);
-
-       if (ret)
-               crypto_unregister_alg(&serpent_alg);
-
-       return ret;
+       return crypto_register_algs(srp_algs, ARRAY_SIZE(srp_algs));
 }
 
 static void __exit serpent_mod_fini(void)
 {
-       crypto_unregister_alg(&tnepres_alg);
-       crypto_unregister_alg(&serpent_alg);
+       crypto_unregister_algs(srp_algs, ARRAY_SIZE(srp_algs));
 }
 
 module_init(serpent_mod_init);
index c48459e..c3ed4ec 100644 (file)
@@ -336,7 +336,7 @@ static int sha256_import(struct shash_desc *desc, const void *in)
        return 0;
 }
 
-static struct shash_alg sha256 = {
+static struct shash_alg sha256_algs[2] = { {
        .digestsize     =       SHA256_DIGEST_SIZE,
        .init           =       sha256_init,
        .update         =       sha256_update,
@@ -352,9 +352,7 @@ static struct shash_alg sha256 = {
                .cra_blocksize  =       SHA256_BLOCK_SIZE,
                .cra_module     =       THIS_MODULE,
        }
-};
-
-static struct shash_alg sha224 = {
+}, {
        .digestsize     =       SHA224_DIGEST_SIZE,
        .init           =       sha224_init,
        .update         =       sha256_update,
@@ -367,29 +365,16 @@ static struct shash_alg sha224 = {
                .cra_blocksize  =       SHA224_BLOCK_SIZE,
                .cra_module     =       THIS_MODULE,
        }
-};
+} };
 
 static int __init sha256_generic_mod_init(void)
 {
-       int ret = 0;
-
-       ret = crypto_register_shash(&sha224);
-
-       if (ret < 0)
-               return ret;
-
-       ret = crypto_register_shash(&sha256);
-
-       if (ret < 0)
-               crypto_unregister_shash(&sha224);
-
-       return ret;
+       return crypto_register_shashes(sha256_algs, ARRAY_SIZE(sha256_algs));
 }
 
 static void __exit sha256_generic_mod_fini(void)
 {
-       crypto_unregister_shash(&sha224);
-       crypto_unregister_shash(&sha256);
+       crypto_unregister_shashes(sha256_algs, ARRAY_SIZE(sha256_algs));
 }
 
 module_init(sha256_generic_mod_init);
index dd30f40..71fcf36 100644 (file)
@@ -242,7 +242,7 @@ static int sha384_final(struct shash_desc *desc, u8 *hash)
        return 0;
 }
 
-static struct shash_alg sha512 = {
+static struct shash_alg sha512_algs[2] = { {
        .digestsize     =       SHA512_DIGEST_SIZE,
        .init           =       sha512_init,
        .update         =       sha512_update,
@@ -254,9 +254,7 @@ static struct shash_alg sha512 = {
                .cra_blocksize  =       SHA512_BLOCK_SIZE,
                .cra_module     =       THIS_MODULE,
        }
-};
-
-static struct shash_alg sha384 = {
+}, {
        .digestsize     =       SHA384_DIGEST_SIZE,
        .init           =       sha384_init,
        .update         =       sha512_update,
@@ -268,24 +266,16 @@ static struct shash_alg sha384 = {
                .cra_blocksize  =       SHA384_BLOCK_SIZE,
                .cra_module     =       THIS_MODULE,
        }
-};
+} };
 
 static int __init sha512_generic_mod_init(void)
 {
-        int ret = 0;
-
-        if ((ret = crypto_register_shash(&sha384)) < 0)
-                goto out;
-        if ((ret = crypto_register_shash(&sha512)) < 0)
-                crypto_unregister_shash(&sha384);
-out:
-        return ret;
+       return crypto_register_shashes(sha512_algs, ARRAY_SIZE(sha512_algs));
 }
 
 static void __exit sha512_generic_mod_fini(void)
 {
-        crypto_unregister_shash(&sha384);
-        crypto_unregister_shash(&sha512);
+       crypto_unregister_shashes(sha512_algs, ARRAY_SIZE(sha512_algs));
 }
 
 module_init(sha512_generic_mod_init);
index 32067f4..f426330 100644 (file)
@@ -629,6 +629,42 @@ int crypto_unregister_shash(struct shash_alg *alg)
 }
 EXPORT_SYMBOL_GPL(crypto_unregister_shash);
 
+int crypto_register_shashes(struct shash_alg *algs, int count)
+{
+       int i, ret;
+
+       for (i = 0; i < count; i++) {
+               ret = crypto_register_shash(&algs[i]);
+               if (ret)
+                       goto err;
+       }
+
+       return 0;
+
+err:
+       for (--i; i >= 0; --i)
+               crypto_unregister_shash(&algs[i]);
+
+       return ret;
+}
+EXPORT_SYMBOL_GPL(crypto_register_shashes);
+
+int crypto_unregister_shashes(struct shash_alg *algs, int count)
+{
+       int i, ret;
+
+       for (i = count - 1; i >= 0; --i) {
+               ret = crypto_unregister_shash(&algs[i]);
+               if (ret)
+                       pr_err("Failed to unregister %s %s: %d\n",
+                              algs[i].base.cra_driver_name,
+                              algs[i].base.cra_name, ret);
+       }
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(crypto_unregister_shashes);
+
 int shash_register_instance(struct crypto_template *tmpl,
                            struct shash_instance *inst)
 {
index 5cf2ccb..e87fa60 100644 (file)
@@ -97,7 +97,6 @@ static int test_cipher_cycles(struct blkcipher_desc *desc, int enc,
        int ret = 0;
        int i;
 
-       local_bh_disable();
        local_irq_disable();
 
        /* Warm-up run. */
@@ -130,7 +129,6 @@ static int test_cipher_cycles(struct blkcipher_desc *desc, int enc,
 
 out:
        local_irq_enable();
-       local_bh_enable();
 
        if (ret == 0)
                printk("1 operation in %lu cycles (%d bytes)\n",
@@ -300,7 +298,6 @@ static int test_hash_cycles_digest(struct hash_desc *desc,
        int i;
        int ret;
 
-       local_bh_disable();
        local_irq_disable();
 
        /* Warm-up run. */
@@ -327,7 +324,6 @@ static int test_hash_cycles_digest(struct hash_desc *desc,
 
 out:
        local_irq_enable();
-       local_bh_enable();
 
        if (ret)
                return ret;
@@ -348,7 +344,6 @@ static int test_hash_cycles(struct hash_desc *desc, struct scatterlist *sg,
        if (plen == blen)
                return test_hash_cycles_digest(desc, sg, blen, out);
 
-       local_bh_disable();
        local_irq_disable();
 
        /* Warm-up run. */
@@ -391,7 +386,6 @@ static int test_hash_cycles(struct hash_desc *desc, struct scatterlist *sg,
 
 out:
        local_irq_enable();
-       local_bh_enable();
 
        if (ret)
                return ret;
@@ -1037,10 +1031,16 @@ static int do_test(int m)
 
        case 14:
                ret += tcrypt_test("ecb(cast5)");
+               ret += tcrypt_test("cbc(cast5)");
+               ret += tcrypt_test("ctr(cast5)");
                break;
 
        case 15:
                ret += tcrypt_test("ecb(cast6)");
+               ret += tcrypt_test("cbc(cast6)");
+               ret += tcrypt_test("ctr(cast6)");
+               ret += tcrypt_test("lrw(cast6)");
+               ret += tcrypt_test("xts(cast6)");
                break;
 
        case 16:
@@ -1112,6 +1112,9 @@ static int do_test(int m)
        case 32:
                ret += tcrypt_test("ecb(camellia)");
                ret += tcrypt_test("cbc(camellia)");
+               ret += tcrypt_test("ctr(camellia)");
+               ret += tcrypt_test("lrw(camellia)");
+               ret += tcrypt_test("xts(camellia)");
                break;
        case 33:
                ret += tcrypt_test("sha224");
@@ -1165,6 +1168,10 @@ static int do_test(int m)
                ret += tcrypt_test("rfc4309(ccm(aes))");
                break;
 
+       case 46:
+               ret += tcrypt_test("ghash");
+               break;
+
        case 100:
                ret += tcrypt_test("hmac(md5)");
                break;
@@ -1359,6 +1366,44 @@ static int do_test(int m)
                                  speed_template_8);
                break;
 
+       case 209:
+               test_cipher_speed("ecb(cast5)", ENCRYPT, sec, NULL, 0,
+                                 speed_template_8_16);
+               test_cipher_speed("ecb(cast5)", DECRYPT, sec, NULL, 0,
+                                 speed_template_8_16);
+               test_cipher_speed("cbc(cast5)", ENCRYPT, sec, NULL, 0,
+                                 speed_template_8_16);
+               test_cipher_speed("cbc(cast5)", DECRYPT, sec, NULL, 0,
+                                 speed_template_8_16);
+               test_cipher_speed("ctr(cast5)", ENCRYPT, sec, NULL, 0,
+                                 speed_template_8_16);
+               test_cipher_speed("ctr(cast5)", DECRYPT, sec, NULL, 0,
+                                 speed_template_8_16);
+               break;
+
+       case 210:
+               test_cipher_speed("ecb(cast6)", ENCRYPT, sec, NULL, 0,
+                                 speed_template_16_32);
+               test_cipher_speed("ecb(cast6)", DECRYPT, sec, NULL, 0,
+                                 speed_template_16_32);
+               test_cipher_speed("cbc(cast6)", ENCRYPT, sec, NULL, 0,
+                                 speed_template_16_32);
+               test_cipher_speed("cbc(cast6)", DECRYPT, sec, NULL, 0,
+                                 speed_template_16_32);
+               test_cipher_speed("ctr(cast6)", ENCRYPT, sec, NULL, 0,
+                                 speed_template_16_32);
+               test_cipher_speed("ctr(cast6)", DECRYPT, sec, NULL, 0,
+                                 speed_template_16_32);
+               test_cipher_speed("lrw(cast6)", ENCRYPT, sec, NULL, 0,
+                                 speed_template_32_48);
+               test_cipher_speed("lrw(cast6)", DECRYPT, sec, NULL, 0,
+                                 speed_template_32_48);
+               test_cipher_speed("xts(cast6)", ENCRYPT, sec, NULL, 0,
+                                 speed_template_32_64);
+               test_cipher_speed("xts(cast6)", DECRYPT, sec, NULL, 0,
+                                 speed_template_32_64);
+               break;
+
        case 300:
                /* fall through */
 
@@ -1639,6 +1684,44 @@ static int do_test(int m)
                                   speed_template_8);
                break;
 
+       case 506:
+               test_acipher_speed("ecb(cast5)", ENCRYPT, sec, NULL, 0,
+                                  speed_template_8_16);
+               test_acipher_speed("ecb(cast5)", DECRYPT, sec, NULL, 0,
+                                  speed_template_8_16);
+               test_acipher_speed("cbc(cast5)", ENCRYPT, sec, NULL, 0,
+                                  speed_template_8_16);
+               test_acipher_speed("cbc(cast5)", DECRYPT, sec, NULL, 0,
+                                  speed_template_8_16);
+               test_acipher_speed("ctr(cast5)", ENCRYPT, sec, NULL, 0,
+                                  speed_template_8_16);
+               test_acipher_speed("ctr(cast5)", DECRYPT, sec, NULL, 0,
+                                  speed_template_8_16);
+               break;
+
+       case 507:
+               test_acipher_speed("ecb(cast6)", ENCRYPT, sec, NULL, 0,
+                                  speed_template_16_32);
+               test_acipher_speed("ecb(cast6)", DECRYPT, sec, NULL, 0,
+                                  speed_template_16_32);
+               test_acipher_speed("cbc(cast6)", ENCRYPT, sec, NULL, 0,
+                                  speed_template_16_32);
+               test_acipher_speed("cbc(cast6)", DECRYPT, sec, NULL, 0,
+                                  speed_template_16_32);
+               test_acipher_speed("ctr(cast6)", ENCRYPT, sec, NULL, 0,
+                                  speed_template_16_32);
+               test_acipher_speed("ctr(cast6)", DECRYPT, sec, NULL, 0,
+                                  speed_template_16_32);
+               test_acipher_speed("lrw(cast6)", ENCRYPT, sec, NULL, 0,
+                                  speed_template_32_48);
+               test_acipher_speed("lrw(cast6)", DECRYPT, sec, NULL, 0,
+                                  speed_template_32_48);
+               test_acipher_speed("xts(cast6)", ENCRYPT, sec, NULL, 0,
+                                  speed_template_32_64);
+               test_acipher_speed("xts(cast6)", DECRYPT, sec, NULL, 0,
+                                  speed_template_32_64);
+               break;
+
        case 1000:
                test_available();
                break;
index 5be1fc8..cd20685 100644 (file)
@@ -47,6 +47,7 @@ static struct cipher_speed_template des3_speed_template[] = {
  */
 static u8 speed_template_8[] = {8, 0};
 static u8 speed_template_24[] = {24, 0};
+static u8 speed_template_8_16[] = {8, 16, 0};
 static u8 speed_template_8_32[] = {8, 32, 0};
 static u8 speed_template_16_32[] = {16, 32, 0};
 static u8 speed_template_16_24_32[] = {16, 24, 32, 0};
index 412bc74..0a57232 100644 (file)
@@ -219,84 +219,55 @@ static void xeta_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
        out[1] = cpu_to_le32(z);
 }
 
-static struct crypto_alg tea_alg = {
+static struct crypto_alg tea_algs[3] = { {
        .cra_name               =       "tea",
        .cra_flags              =       CRYPTO_ALG_TYPE_CIPHER,
        .cra_blocksize          =       TEA_BLOCK_SIZE,
        .cra_ctxsize            =       sizeof (struct tea_ctx),
        .cra_alignmask          =       3,
        .cra_module             =       THIS_MODULE,
-       .cra_list               =       LIST_HEAD_INIT(tea_alg.cra_list),
        .cra_u                  =       { .cipher = {
        .cia_min_keysize        =       TEA_KEY_SIZE,
        .cia_max_keysize        =       TEA_KEY_SIZE,
        .cia_setkey             =       tea_setkey,
        .cia_encrypt            =       tea_encrypt,
        .cia_decrypt            =       tea_decrypt } }
-};
-
-static struct crypto_alg xtea_alg = {
+}, {
        .cra_name               =       "xtea",
        .cra_flags              =       CRYPTO_ALG_TYPE_CIPHER,
        .cra_blocksize          =       XTEA_BLOCK_SIZE,
        .cra_ctxsize            =       sizeof (struct xtea_ctx),
        .cra_alignmask          =       3,
        .cra_module             =       THIS_MODULE,
-       .cra_list               =       LIST_HEAD_INIT(xtea_alg.cra_list),
        .cra_u                  =       { .cipher = {
        .cia_min_keysize        =       XTEA_KEY_SIZE,
        .cia_max_keysize        =       XTEA_KEY_SIZE,
        .cia_setkey             =       xtea_setkey,
        .cia_encrypt            =       xtea_encrypt,
        .cia_decrypt            =       xtea_decrypt } }
-};
-
-static struct crypto_alg xeta_alg = {
+}, {
        .cra_name               =       "xeta",
        .cra_flags              =       CRYPTO_ALG_TYPE_CIPHER,
        .cra_blocksize          =       XTEA_BLOCK_SIZE,
        .cra_ctxsize            =       sizeof (struct xtea_ctx),
        .cra_alignmask          =       3,
        .cra_module             =       THIS_MODULE,
-       .cra_list               =       LIST_HEAD_INIT(xtea_alg.cra_list),
        .cra_u                  =       { .cipher = {
        .cia_min_keysize        =       XTEA_KEY_SIZE,
        .cia_max_keysize        =       XTEA_KEY_SIZE,
        .cia_setkey             =       xtea_setkey,
        .cia_encrypt            =       xeta_encrypt,
        .cia_decrypt            =       xeta_decrypt } }
-};
+} };
 
 static int __init tea_mod_init(void)
 {
-       int ret = 0;
-       
-       ret = crypto_register_alg(&tea_alg);
-       if (ret < 0)
-               goto out;
-
-       ret = crypto_register_alg(&xtea_alg);
-       if (ret < 0) {
-               crypto_unregister_alg(&tea_alg);
-               goto out;
-       }
-
-       ret = crypto_register_alg(&xeta_alg);
-       if (ret < 0) {
-               crypto_unregister_alg(&tea_alg);
-               crypto_unregister_alg(&xtea_alg);
-               goto out;
-       }
-
-out:   
-       return ret;
+       return crypto_register_algs(tea_algs, ARRAY_SIZE(tea_algs));
 }
 
 static void __exit tea_mod_fini(void)
 {
-       crypto_unregister_alg(&tea_alg);
-       crypto_unregister_alg(&xtea_alg);
-       crypto_unregister_alg(&xeta_alg);
+       crypto_unregister_algs(tea_algs, ARRAY_SIZE(tea_algs));
 }
 
 MODULE_ALIAS("xtea");
index a2ca743..941d75c 100644 (file)
@@ -358,8 +358,9 @@ out_nobuf:
        return ret;
 }
 
-static int test_aead(struct crypto_aead *tfm, int enc,
-                    struct aead_testvec *template, unsigned int tcount)
+static int __test_aead(struct crypto_aead *tfm, int enc,
+                      struct aead_testvec *template, unsigned int tcount,
+                      const bool diff_dst)
 {
        const char *algo = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm));
        unsigned int i, j, k, n, temp;
@@ -367,15 +368,18 @@ static int test_aead(struct crypto_aead *tfm, int enc,
        char *q;
        char *key;
        struct aead_request *req;
-       struct scatterlist sg[8];
-       struct scatterlist asg[8];
-       const char *e;
+       struct scatterlist *sg;
+       struct scatterlist *asg;
+       struct scatterlist *sgout;
+       const char *e, *d;
        struct tcrypt_result result;
        unsigned int authsize;
        void *input;
+       void *output;
        void *assoc;
        char iv[MAX_IVLEN];
        char *xbuf[XBUFSIZE];
+       char *xoutbuf[XBUFSIZE];
        char *axbuf[XBUFSIZE];
 
        if (testmgr_alloc_buf(xbuf))
@@ -383,6 +387,21 @@ static int test_aead(struct crypto_aead *tfm, int enc,
        if (testmgr_alloc_buf(axbuf))
                goto out_noaxbuf;
 
+       if (diff_dst && testmgr_alloc_buf(xoutbuf))
+               goto out_nooutbuf;
+
+       /* avoid "the frame size is larger than 1024 bytes" compiler warning */
+       sg = kmalloc(sizeof(*sg) * 8 * (diff_dst ? 3 : 2), GFP_KERNEL);
+       if (!sg)
+               goto out_nosg;
+       asg = &sg[8];
+       sgout = &asg[8];
+
+       if (diff_dst)
+               d = "-ddst";
+       else
+               d = "";
+
        if (enc == ENCRYPT)
                e = "encryption";
        else
@@ -392,8 +411,8 @@ static int test_aead(struct crypto_aead *tfm, int enc,
 
        req = aead_request_alloc(tfm, GFP_KERNEL);
        if (!req) {
-               printk(KERN_ERR "alg: aead: Failed to allocate request for "
-                      "%s\n", algo);
+               pr_err("alg: aead%s: Failed to allocate request for %s\n",
+                      d, algo);
                goto out;
        }
 
@@ -432,9 +451,8 @@ static int test_aead(struct crypto_aead *tfm, int enc,
                        ret = crypto_aead_setkey(tfm, key,
                                                 template[i].klen);
                        if (!ret == template[i].fail) {
-                               printk(KERN_ERR "alg: aead: setkey failed on "
-                                      "test %d for %s: flags=%x\n", j, algo,
-                                      crypto_aead_get_flags(tfm));
+                               pr_err("alg: aead%s: setkey failed on test %d for %s: flags=%x\n",
+                                      d, j, algo, crypto_aead_get_flags(tfm));
                                goto out;
                        } else if (ret)
                                continue;
@@ -442,18 +460,26 @@ static int test_aead(struct crypto_aead *tfm, int enc,
                        authsize = abs(template[i].rlen - template[i].ilen);
                        ret = crypto_aead_setauthsize(tfm, authsize);
                        if (ret) {
-                               printk(KERN_ERR "alg: aead: Failed to set "
-                                      "authsize to %u on test %d for %s\n",
-                                      authsize, j, algo);
+                               pr_err("alg: aead%s: Failed to set authsize to %u on test %d for %s\n",
+                                      d, authsize, j, algo);
                                goto out;
                        }
 
                        sg_init_one(&sg[0], input,
                                    template[i].ilen + (enc ? authsize : 0));
 
+                       if (diff_dst) {
+                               output = xoutbuf[0];
+                               sg_init_one(&sgout[0], output,
+                                           template[i].ilen +
+                                               (enc ? authsize : 0));
+                       } else {
+                               output = input;
+                       }
+
                        sg_init_one(&asg[0], assoc, template[i].alen);
 
-                       aead_request_set_crypt(req, sg, sg,
+                       aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
                                               template[i].ilen, iv);
 
                        aead_request_set_assoc(req, asg, template[i].alen);
@@ -466,10 +492,8 @@ static int test_aead(struct crypto_aead *tfm, int enc,
                        case 0:
                                if (template[i].novrfy) {
                                        /* verification was supposed to fail */
-                                       printk(KERN_ERR "alg: aead: %s failed "
-                                              "on test %d for %s: ret was 0, "
-                                              "expected -EBADMSG\n",
-                                              e, j, algo);
+                                       pr_err("alg: aead%s: %s failed on test %d for %s: ret was 0, expected -EBADMSG\n",
+                                              d, e, j, algo);
                                        /* so really, we got a bad message */
                                        ret = -EBADMSG;
                                        goto out;
@@ -489,15 +513,15 @@ static int test_aead(struct crypto_aead *tfm, int enc,
                                        continue;
                                /* fall through */
                        default:
-                               printk(KERN_ERR "alg: aead: %s failed on test "
-                                      "%d for %s: ret=%d\n", e, j, algo, -ret);
+                               pr_err("alg: aead%s: %s failed on test %d for %s: ret=%d\n",
+                                      d, e, j, algo, -ret);
                                goto out;
                        }
 
-                       q = input;
+                       q = output;
                        if (memcmp(q, template[i].result, template[i].rlen)) {
-                               printk(KERN_ERR "alg: aead: Test %d failed on "
-                                      "%s for %s\n", j, e, algo);
+                               pr_err("alg: aead%s: Test %d failed on %s for %s\n",
+                                      d, j, e, algo);
                                hexdump(q, template[i].rlen);
                                ret = -EINVAL;
                                goto out;
@@ -522,9 +546,8 @@ static int test_aead(struct crypto_aead *tfm, int enc,
 
                        ret = crypto_aead_setkey(tfm, key, template[i].klen);
                        if (!ret == template[i].fail) {
-                               printk(KERN_ERR "alg: aead: setkey failed on "
-                                      "chunk test %d for %s: flags=%x\n", j,
-                                      algo, crypto_aead_get_flags(tfm));
+                               pr_err("alg: aead%s: setkey failed on chunk test %d for %s: flags=%x\n",
+                                      d, j, algo, crypto_aead_get_flags(tfm));
                                goto out;
                        } else if (ret)
                                continue;
@@ -533,6 +556,8 @@ static int test_aead(struct crypto_aead *tfm, int enc,
 
                        ret = -EINVAL;
                        sg_init_table(sg, template[i].np);
+                       if (diff_dst)
+                               sg_init_table(sgout, template[i].np);
                        for (k = 0, temp = 0; k < template[i].np; k++) {
                                if (WARN_ON(offset_in_page(IDX[k]) +
                                            template[i].tap[k] > PAGE_SIZE))
@@ -551,14 +576,26 @@ static int test_aead(struct crypto_aead *tfm, int enc,
                                        q[n] = 0;
 
                                sg_set_buf(&sg[k], q, template[i].tap[k]);
+
+                               if (diff_dst) {
+                                       q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
+                                           offset_in_page(IDX[k]);
+
+                                       memset(q, 0, template[i].tap[k]);
+                                       if (offset_in_page(q) + n < PAGE_SIZE)
+                                               q[n] = 0;
+
+                                       sg_set_buf(&sgout[k], q,
+                                                  template[i].tap[k]);
+                               }
+
                                temp += template[i].tap[k];
                        }
 
                        ret = crypto_aead_setauthsize(tfm, authsize);
                        if (ret) {
-                               printk(KERN_ERR "alg: aead: Failed to set "
-                                      "authsize to %u on chunk test %d for "
-                                      "%s\n", authsize, j, algo);
+                               pr_err("alg: aead%s: Failed to set authsize to %u on chunk test %d for %s\n",
+                                      d, authsize, j, algo);
                                goto out;
                        }
 
@@ -571,6 +608,9 @@ static int test_aead(struct crypto_aead *tfm, int enc,
                                }
 
                                sg[k - 1].length += authsize;
+
+                               if (diff_dst)
+                                       sgout[k - 1].length += authsize;
                        }
 
                        sg_init_table(asg, template[i].anp);
@@ -588,7 +628,7 @@ static int test_aead(struct crypto_aead *tfm, int enc,
                                temp += template[i].atap[k];
                        }
 
-                       aead_request_set_crypt(req, sg, sg,
+                       aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
                                               template[i].ilen,
                                               iv);
 
@@ -602,10 +642,8 @@ static int test_aead(struct crypto_aead *tfm, int enc,
                        case 0:
                                if (template[i].novrfy) {
                                        /* verification was supposed to fail */
-                                       printk(KERN_ERR "alg: aead: %s failed "
-                                              "on chunk test %d for %s: ret "
-                                              "was 0, expected -EBADMSG\n",
-                                              e, j, algo);
+                                       pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret was 0, expected -EBADMSG\n",
+                                              d, e, j, algo);
                                        /* so really, we got a bad message */
                                        ret = -EBADMSG;
                                        goto out;
@@ -625,32 +663,35 @@ static int test_aead(struct crypto_aead *tfm, int enc,
                                        continue;
                                /* fall through */
                        default:
-                               printk(KERN_ERR "alg: aead: %s failed on "
-                                      "chunk test %d for %s: ret=%d\n", e, j,
-                                      algo, -ret);
+                               pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret=%d\n",
+                                      d, e, j, algo, -ret);
                                goto out;
                        }
 
                        ret = -EINVAL;
                        for (k = 0, temp = 0; k < template[i].np; k++) {
-                               q = xbuf[IDX[k] >> PAGE_SHIFT] +
-                                   offset_in_page(IDX[k]);
+                               if (diff_dst)
+                                       q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
+                                           offset_in_page(IDX[k]);
+                               else
+                                       q = xbuf[IDX[k] >> PAGE_SHIFT] +
+                                           offset_in_page(IDX[k]);
 
                                n = template[i].tap[k];
                                if (k == template[i].np - 1)
                                        n += enc ? authsize : -authsize;
 
                                if (memcmp(q, template[i].result + temp, n)) {
-                                       printk(KERN_ERR "alg: aead: Chunk "
-                                              "test %d failed on %s at page "
-                                              "%u for %s\n", j, e, k, algo);
+                                       pr_err("alg: aead%s: Chunk test %d failed on %s at page %u for %s\n",
+                                              d, j, e, k, algo);
                                        hexdump(q, n);
                                        goto out;
                                }
 
                                q += n;
                                if (k == template[i].np - 1 && !enc) {
-                                       if (memcmp(q, template[i].input +
+                                       if (!diff_dst &&
+                                               memcmp(q, template[i].input +
                                                      temp + n, authsize))
                                                n = authsize;
                                        else
@@ -661,11 +702,8 @@ static int test_aead(struct crypto_aead *tfm, int enc,
                                                ;
                                }
                                if (n) {
-                                       printk(KERN_ERR "alg: aead: Result "
-                                              "buffer corruption in chunk "
-                                              "test %d on %s at page %u for "
-                                              "%s: %u bytes:\n", j, e, k,
-                                              algo, n);
+                                       pr_err("alg: aead%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
+                                              d, j, e, k, algo, n);
                                        hexdump(q, n);
                                        goto out;
                                }
@@ -679,6 +717,11 @@ static int test_aead(struct crypto_aead *tfm, int enc,
 
 out:
        aead_request_free(req);
+       kfree(sg);
+out_nosg:
+       if (diff_dst)
+               testmgr_free_buf(xoutbuf);
+out_nooutbuf:
        testmgr_free_buf(axbuf);
 out_noaxbuf:
        testmgr_free_buf(xbuf);
@@ -686,6 +729,20 @@ out_noxbuf:
        return ret;
 }
 
+static int test_aead(struct crypto_aead *tfm, int enc,
+                    struct aead_testvec *template, unsigned int tcount)
+{
+       int ret;
+
+       /* test 'dst == src' case */
+       ret = __test_aead(tfm, enc, template, tcount, false);
+       if (ret)
+               return ret;
+
+       /* test 'dst != src' case */
+       return __test_aead(tfm, enc, template, tcount, true);
+}
+
 static int test_cipher(struct crypto_cipher *tfm, int enc,
                       struct cipher_testvec *template, unsigned int tcount)
 {
@@ -761,8 +818,9 @@ out_nobuf:
        return ret;
 }
 
-static int test_skcipher(struct crypto_ablkcipher *tfm, int enc,
-                        struct cipher_testvec *template, unsigned int tcount)
+static int __test_skcipher(struct crypto_ablkcipher *tfm, int enc,
+                          struct cipher_testvec *template, unsigned int tcount,
+                          const bool diff_dst)
 {
        const char *algo =
                crypto_tfm_alg_driver_name(crypto_ablkcipher_tfm(tfm));
@@ -770,16 +828,26 @@ static int test_skcipher(struct crypto_ablkcipher *tfm, int enc,
        char *q;
        struct ablkcipher_request *req;
        struct scatterlist sg[8];
-       const char *e;
+       struct scatterlist sgout[8];
+       const char *e, *d;
        struct tcrypt_result result;
        void *data;
        char iv[MAX_IVLEN];
        char *xbuf[XBUFSIZE];
+       char *xoutbuf[XBUFSIZE];
        int ret = -ENOMEM;
 
        if (testmgr_alloc_buf(xbuf))
                goto out_nobuf;
 
+       if (diff_dst && testmgr_alloc_buf(xoutbuf))
+               goto out_nooutbuf;
+
+       if (diff_dst)
+               d = "-ddst";
+       else
+               d = "";
+
        if (enc == ENCRYPT)
                e = "encryption";
        else
@@ -789,8 +857,8 @@ static int test_skcipher(struct crypto_ablkcipher *tfm, int enc,
 
        req = ablkcipher_request_alloc(tfm, GFP_KERNEL);
        if (!req) {
-               printk(KERN_ERR "alg: skcipher: Failed to allocate request "
-                      "for %s\n", algo);
+               pr_err("alg: skcipher%s: Failed to allocate request for %s\n",
+                      d, algo);
                goto out;
        }
 
@@ -804,7 +872,7 @@ static int test_skcipher(struct crypto_ablkcipher *tfm, int enc,
                else
                        memset(iv, 0, MAX_IVLEN);
 
-               if (!(template[i].np)) {
+               if (!(template[i].np) || (template[i].also_non_np)) {
                        j++;
 
                        ret = -EINVAL;
@@ -822,16 +890,21 @@ static int test_skcipher(struct crypto_ablkcipher *tfm, int enc,
                        ret = crypto_ablkcipher_setkey(tfm, template[i].key,
                                                       template[i].klen);
                        if (!ret == template[i].fail) {
-                               printk(KERN_ERR "alg: skcipher: setkey failed "
-                                      "on test %d for %s: flags=%x\n", j,
-                                      algo, crypto_ablkcipher_get_flags(tfm));
+                               pr_err("alg: skcipher%s: setkey failed on test %d for %s: flags=%x\n",
+                                      d, j, algo,
+                                      crypto_ablkcipher_get_flags(tfm));
                                goto out;
                        } else if (ret)
                                continue;
 
                        sg_init_one(&sg[0], data, template[i].ilen);
+                       if (diff_dst) {
+                               data = xoutbuf[0];
+                               sg_init_one(&sgout[0], data, template[i].ilen);
+                       }
 
-                       ablkcipher_request_set_crypt(req, sg, sg,
+                       ablkcipher_request_set_crypt(req, sg,
+                                                    (diff_dst) ? sgout : sg,
                                                     template[i].ilen, iv);
                        ret = enc ?
                                crypto_ablkcipher_encrypt(req) :
@@ -850,16 +923,15 @@ static int test_skcipher(struct crypto_ablkcipher *tfm, int enc,
                                }
                                /* fall through */
                        default:
-                               printk(KERN_ERR "alg: skcipher: %s failed on "
-                                      "test %d for %s: ret=%d\n", e, j, algo,
-                                      -ret);
+                               pr_err("alg: skcipher%s: %s failed on test %d for %s: ret=%d\n",
+                                      d, e, j, algo, -ret);
                                goto out;
                        }
 
                        q = data;
                        if (memcmp(q, template[i].result, template[i].rlen)) {
-                               printk(KERN_ERR "alg: skcipher: Test %d "
-                                      "failed on %s for %s\n", j, e, algo);
+                               pr_err("alg: skcipher%s: Test %d failed on %s for %s\n",
+                                      d, j, e, algo);
                                hexdump(q, template[i].rlen);
                                ret = -EINVAL;
                                goto out;
@@ -886,9 +958,8 @@ static int test_skcipher(struct crypto_ablkcipher *tfm, int enc,
                        ret = crypto_ablkcipher_setkey(tfm, template[i].key,
                                                       template[i].klen);
                        if (!ret == template[i].fail) {
-                               printk(KERN_ERR "alg: skcipher: setkey failed "
-                                      "on chunk test %d for %s: flags=%x\n",
-                                      j, algo,
+                               pr_err("alg: skcipher%s: setkey failed on chunk test %d for %s: flags=%x\n",
+                                      d, j, algo,
                                       crypto_ablkcipher_get_flags(tfm));
                                goto out;
                        } else if (ret)
@@ -897,6 +968,8 @@ static int test_skcipher(struct crypto_ablkcipher *tfm, int enc,
                        temp = 0;
                        ret = -EINVAL;
                        sg_init_table(sg, template[i].np);
+                       if (diff_dst)
+                               sg_init_table(sgout, template[i].np);
                        for (k = 0; k < template[i].np; k++) {
                                if (WARN_ON(offset_in_page(IDX[k]) +
                                            template[i].tap[k] > PAGE_SIZE))
@@ -913,11 +986,24 @@ static int test_skcipher(struct crypto_ablkcipher *tfm, int enc,
                                        q[template[i].tap[k]] = 0;
 
                                sg_set_buf(&sg[k], q, template[i].tap[k]);
+                               if (diff_dst) {
+                                       q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
+                                           offset_in_page(IDX[k]);
+
+                                       sg_set_buf(&sgout[k], q,
+                                                  template[i].tap[k]);
+
+                                       memset(q, 0, template[i].tap[k]);
+                                       if (offset_in_page(q) +
+                                           template[i].tap[k] < PAGE_SIZE)
+                                               q[template[i].tap[k]] = 0;
+                               }
 
                                temp += template[i].tap[k];
                        }
 
-                       ablkcipher_request_set_crypt(req, sg, sg,
+                       ablkcipher_request_set_crypt(req, sg,
+                                       (diff_dst) ? sgout : sg,
                                        template[i].ilen, iv);
 
                        ret = enc ?
@@ -937,23 +1023,25 @@ static int test_skcipher(struct crypto_ablkcipher *tfm, int enc,
                                }
                                /* fall through */
                        default:
-                               printk(KERN_ERR "alg: skcipher: %s failed on "
-                                      "chunk test %d for %s: ret=%d\n", e, j,
-                                      algo, -ret);
+                               pr_err("alg: skcipher%s: %s failed on chunk test %d for %s: ret=%d\n",
+                                      d, e, j, algo, -ret);
                                goto out;
                        }
 
                        temp = 0;
                        ret = -EINVAL;
                        for (k = 0; k < template[i].np; k++) {
-                               q = xbuf[IDX[k] >> PAGE_SHIFT] +
-                                   offset_in_page(IDX[k]);
+                               if (diff_dst)
+                                       q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
+                                           offset_in_page(IDX[k]);
+                               else
+                                       q = xbuf[IDX[k] >> PAGE_SHIFT] +
+                                           offset_in_page(IDX[k]);
 
                                if (memcmp(q, template[i].result + temp,
                                           template[i].tap[k])) {
-                                       printk(KERN_ERR "alg: skcipher: Chunk "
-                                              "test %d failed on %s at page "
-                                              "%u for %s\n", j, e, k, algo);
+                                       pr_err("alg: skcipher%s: Chunk test %d failed on %s at page %u for %s\n",
+                                              d, j, e, k, algo);
                                        hexdump(q, template[i].tap[k]);
                                        goto out;
                                }
@@ -962,11 +1050,8 @@ static int test_skcipher(struct crypto_ablkcipher *tfm, int enc,
                                for (n = 0; offset_in_page(q + n) && q[n]; n++)
                                        ;
                                if (n) {
-                                       printk(KERN_ERR "alg: skcipher: "
-                                              "Result buffer corruption in "
-                                              "chunk test %d on %s at page "
-                                              "%u for %s: %u bytes:\n", j, e,
-                                              k, algo, n);
+                                       pr_err("alg: skcipher%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
+                                              d, j, e, k, algo, n);
                                        hexdump(q, n);
                                        goto out;
                                }
@@ -979,11 +1064,28 @@ static int test_skcipher(struct crypto_ablkcipher *tfm, int enc,
 
 out:
        ablkcipher_request_free(req);
+       if (diff_dst)
+               testmgr_free_buf(xoutbuf);
+out_nooutbuf:
        testmgr_free_buf(xbuf);
 out_nobuf:
        return ret;
 }
 
+static int test_skcipher(struct crypto_ablkcipher *tfm, int enc,
+                        struct cipher_testvec *template, unsigned int tcount)
+{
+       int ret;
+
+       /* test 'dst == src' case */
+       ret = __test_skcipher(tfm, enc, template, tcount, false);
+       if (ret)
+               return ret;
+
+       /* test 'dst != src' case */
+       return __test_skcipher(tfm, enc, template, tcount, true);
+}
+
 static int test_comp(struct crypto_comp *tfm, struct comp_testvec *ctemplate,
                     struct comp_testvec *dtemplate, int ctcount, int dtcount)
 {
@@ -1534,6 +1636,36 @@ static int alg_test_null(const struct alg_test_desc *desc,
 /* Please keep this list sorted by algorithm name. */
 static const struct alg_test_desc alg_test_descs[] = {
        {
+               .alg = "__cbc-cast5-avx",
+               .test = alg_test_null,
+               .suite = {
+                       .cipher = {
+                               .enc = {
+                                       .vecs = NULL,
+                                       .count = 0
+                               },
+                               .dec = {
+                                       .vecs = NULL,
+                                       .count = 0
+                               }
+                       }
+               }
+       }, {
+               .alg = "__cbc-cast6-avx",
+               .test = alg_test_null,
+               .suite = {
+                       .cipher = {
+                               .enc = {
+                                       .vecs = NULL,
+                                       .count = 0
+                               },
+                               .dec = {
+                                       .vecs = NULL,
+                                       .count = 0
+                               }
+                       }
+               }
+       }, {
                .alg = "__cbc-serpent-avx",
                .test = alg_test_null,
                .suite = {
@@ -1595,6 +1727,36 @@ static const struct alg_test_desc alg_test_descs[] = {
                        }
                }
        }, {
+               .alg = "__driver-cbc-cast5-avx",
+               .test = alg_test_null,
+               .suite = {
+                       .cipher = {
+                               .enc = {
+                                       .vecs = NULL,
+                                       .count = 0
+                               },
+                               .dec = {
+                                       .vecs = NULL,
+                                       .count = 0
+                               }
+                       }
+               }
+       }, {
+               .alg = "__driver-cbc-cast6-avx",
+               .test = alg_test_null,
+               .suite = {
+                       .cipher = {
+                               .enc = {
+                                       .vecs = NULL,
+                                       .count = 0
+                               },
+                               .dec = {
+                                       .vecs = NULL,
+                                       .count = 0
+                               }
+                       }
+               }
+       }, {
                .alg = "__driver-cbc-serpent-avx",
                .test = alg_test_null,
                .suite = {
@@ -1656,6 +1818,36 @@ static const struct alg_test_desc alg_test_descs[] = {
                        }
                }
        }, {
+               .alg = "__driver-ecb-cast5-avx",
+               .test = alg_test_null,
+               .suite = {
+                       .cipher = {
+                               .enc = {
+                                       .vecs = NULL,
+                                       .count = 0
+                               },
+                               .dec = {
+                                       .vecs = NULL,
+                                       .count = 0
+                               }
+                       }
+               }
+       }, {
+               .alg = "__driver-ecb-cast6-avx",
+               .test = alg_test_null,
+               .suite = {
+                       .cipher = {
+                               .enc = {
+                                       .vecs = NULL,
+                                       .count = 0
+                               },
+                               .dec = {
+                                       .vecs = NULL,
+                                       .count = 0
+                               }
+                       }
+               }
+       }, {
                .alg = "__driver-ecb-serpent-avx",
                .test = alg_test_null,
                .suite = {
@@ -1818,6 +2010,36 @@ static const struct alg_test_desc alg_test_descs[] = {
                        }
                }
        }, {
+               .alg = "cbc(cast5)",
+               .test = alg_test_skcipher,
+               .suite = {
+                       .cipher = {
+                               .enc = {
+                                       .vecs = cast5_cbc_enc_tv_template,
+                                       .count = CAST5_CBC_ENC_TEST_VECTORS
+                               },
+                               .dec = {
+                                       .vecs = cast5_cbc_dec_tv_template,
+                                       .count = CAST5_CBC_DEC_TEST_VECTORS
+                               }
+                       }
+               }
+       }, {
+               .alg = "cbc(cast6)",
+               .test = alg_test_skcipher,
+               .suite = {
+                       .cipher = {
+                               .enc = {
+                                       .vecs = cast6_cbc_enc_tv_template,
+                                       .count = CAST6_CBC_ENC_TEST_VECTORS
+                               },
+                               .dec = {
+                                       .vecs = cast6_cbc_dec_tv_template,
+                                       .count = CAST6_CBC_DEC_TEST_VECTORS
+                               }
+                       }
+               }
+       }, {
                .alg = "cbc(des)",
                .test = alg_test_skcipher,
                .suite = {
@@ -1937,6 +2159,36 @@ static const struct alg_test_desc alg_test_descs[] = {
                        }
                }
        }, {
+               .alg = "cryptd(__driver-ecb-cast5-avx)",
+               .test = alg_test_null,
+               .suite = {
+                       .cipher = {
+                               .enc = {
+                                       .vecs = NULL,
+                                       .count = 0
+                               },
+                               .dec = {
+                                       .vecs = NULL,
+                                       .count = 0
+                               }
+                       }
+               }
+       }, {
+               .alg = "cryptd(__driver-ecb-cast6-avx)",
+               .test = alg_test_null,
+               .suite = {
+                       .cipher = {
+                               .enc = {
+                                       .vecs = NULL,
+                                       .count = 0
+                               },
+                               .dec = {
+                                       .vecs = NULL,
+                                       .count = 0
+                               }
+                       }
+               }
+       }, {
                .alg = "cryptd(__driver-ecb-serpent-avx)",
                .test = alg_test_null,
                .suite = {
@@ -2054,6 +2306,36 @@ static const struct alg_test_desc alg_test_descs[] = {
                        }
                }
        }, {
+               .alg = "ctr(cast5)",
+               .test = alg_test_skcipher,
+               .suite = {
+                       .cipher = {
+                               .enc = {
+                                       .vecs = cast5_ctr_enc_tv_template,
+                                       .count = CAST5_CTR_ENC_TEST_VECTORS
+                               },
+                               .dec = {
+                                       .vecs = cast5_ctr_dec_tv_template,
+                                       .count = CAST5_CTR_DEC_TEST_VECTORS
+                               }
+                       }
+               }
+       }, {
+               .alg = "ctr(cast6)",
+               .test = alg_test_skcipher,
+               .suite = {
+                       .cipher = {
+                               .enc = {
+                                       .vecs = cast6_ctr_enc_tv_template,
+                                       .count = CAST6_CTR_ENC_TEST_VECTORS
+                               },
+                               .dec = {
+                                       .vecs = cast6_ctr_dec_tv_template,
+                                       .count = CAST6_CTR_DEC_TEST_VECTORS
+                               }
+                       }
+               }
+       }, {
                .alg = "ctr(serpent)",
                .test = alg_test_skcipher,
                .suite = {
@@ -2530,6 +2812,21 @@ static const struct alg_test_desc alg_test_descs[] = {
                        }
                }
        }, {
+               .alg = "lrw(cast6)",
+               .test = alg_test_skcipher,
+               .suite = {
+                       .cipher = {
+                               .enc = {
+                                       .vecs = cast6_lrw_enc_tv_template,
+                                       .count = CAST6_LRW_ENC_TEST_VECTORS
+                               },
+                               .dec = {
+                                       .vecs = cast6_lrw_dec_tv_template,
+                                       .count = CAST6_LRW_DEC_TEST_VECTORS
+                               }
+                       }
+               }
+       }, {
                .alg = "lrw(serpent)",
                .test = alg_test_skcipher,
                .suite = {
@@ -2882,6 +3179,21 @@ static const struct alg_test_desc alg_test_descs[] = {
                        }
                }
        }, {
+               .alg = "xts(cast6)",
+               .test = alg_test_skcipher,
+               .suite = {
+                       .cipher = {
+                               .enc = {
+                                       .vecs = cast6_xts_enc_tv_template,
+                                       .count = CAST6_XTS_ENC_TEST_VECTORS
+                               },
+                               .dec = {
+                                       .vecs = cast6_xts_dec_tv_template,
+                                       .count = CAST6_XTS_DEC_TEST_VECTORS
+                               }
+                       }
+               }
+       }, {
                .alg = "xts(serpent)",
                .test = alg_test_skcipher,
                .suite = {
index f8179e0..76d7f6c 100644 (file)
@@ -53,6 +53,7 @@ struct cipher_testvec {
        char *result;
        unsigned short tap[MAX_TAP];
        int np;
+       unsigned char also_non_np;
        unsigned char fail;
        unsigned char wk; /* weak key flag */
        unsigned char klen;
@@ -2468,6 +2469,9 @@ static struct cipher_testvec bf_enc_tv_template[] = {
                          "\xC2\xF4\x6D\xFF\xF6\xCD\x6B\x40"
                          "\xE1\xB3\xBF\xD4\x38\x2B\xC8\x3B",
                .rlen   = 40,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 40 - 8, 8 },
        },
 };
 
@@ -2541,6 +2545,9 @@ static struct cipher_testvec bf_dec_tv_template[] = {
                          "\xAC\x20\xB7\x4E\xE5\x59\xF0\x87"
                          "\x1E\x92\x29\xC0\x34\xCB\x62\xF9",
                .rlen   = 40,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 40 - 8, 8 },
        },
 };
 
@@ -2579,6 +2586,9 @@ static struct cipher_testvec bf_cbc_enc_tv_template[] = {
                          "\x1B\xD9\x02\xB6\x48\xB0\x87\x25"
                          "\x01\x9C\x93\x63\x51\x60\x82\xD2",
                .rlen   = 40,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 40 - 8, 8 },
        },
 };
 
@@ -2617,6 +2627,9 @@ static struct cipher_testvec bf_cbc_dec_tv_template[] = {
                          "\xAC\x20\xB7\x4E\xE5\x59\xF0\x87"
                          "\x1E\x92\x29\xC0\x34\xCB\x62\xF9",
                .rlen   = 40,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 40 - 8, 8 },
        },
 };
 
@@ -2661,6 +2674,144 @@ static struct cipher_testvec bf_ctr_enc_tv_template[] = {
                          "\xE4\x1F\x5E\xA5\x89\xAC\x32\xBC"
                          "\x3D\xA7\xE9",
                .rlen   = 43,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 43 - 8, 8 },
+       }, { /* Generated with Crypto++ */
+               .key    = "\x85\x62\x3F\x1C\xF9\xD6\x1C\xF9"
+                         "\xD6\xB3\x90\x6D\x4A\x90\x6D\x4A"
+                         "\x27\x04\xE1\x27\x04\xE1\xBE\x9B"
+                         "\x78\xBE\x9B\x78\x55\x32\x0F\x55",
+               .klen   = 32,
+               .iv     = "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFD",
+               .input  = "\x56\xED\x84\x1B\x8F\x26\xBD\x31"
+                         "\xC8\x5F\xF6\x6A\x01\x98\x0C\xA3"
+                         "\x3A\xD1\x45\xDC\x73\x0A\x7E\x15"
+                         "\xAC\x20\xB7\x4E\xE5\x59\xF0\x87"
+                         "\x1E\x92\x29\xC0\x34\xCB\x62\xF9"
+                         "\x6D\x04\x9B\x0F\xA6\x3D\xD4\x48"
+                         "\xDF\x76\x0D\x81\x18\xAF\x23\xBA"
+                         "\x51\xE8\x5C\xF3\x8A\x21\x95\x2C"
+                         "\xC3\x37\xCE\x65\xFC\x70\x07\x9E"
+                         "\x12\xA9\x40\xD7\x4B\xE2\x79\x10"
+                         "\x84\x1B\xB2\x26\xBD\x54\xEB\x5F"
+                         "\xF6\x8D\x01\x98\x2F\xC6\x3A\xD1"
+                         "\x68\xFF\x73\x0A\xA1\x15\xAC\x43"
+                         "\xDA\x4E\xE5\x7C\x13\x87\x1E\xB5"
+                         "\x29\xC0\x57\xEE\x62\xF9\x90\x04"
+                         "\x9B\x32\xC9\x3D\xD4\x6B\x02\x76"
+                         "\x0D\xA4\x18\xAF\x46\xDD\x51\xE8"
+                         "\x7F\x16\x8A\x21\xB8\x2C\xC3\x5A"
+                         "\xF1\x65\xFC\x93\x07\x9E\x35\xCC"
+                         "\x40\xD7\x6E\x05\x79\x10\xA7\x1B"
+                         "\xB2\x49\xE0\x54\xEB\x82\x19\x8D"
+                         "\x24\xBB\x2F\xC6\x5D\xF4\x68\xFF"
+                         "\x96\x0A\xA1\x38\xCF\x43\xDA\x71"
+                         "\x08\x7C\x13\xAA\x1E\xB5\x4C\xE3"
+                         "\x57\xEE\x85\x1C\x90\x27\xBE\x32"
+                         "\xC9\x60\xF7\x6B\x02\x99\x0D\xA4"
+                         "\x3B\xD2\x46\xDD\x74\x0B\x7F\x16"
+                         "\xAD\x21\xB8\x4F\xE6\x5A\xF1\x88"
+                         "\x1F\x93\x2A\xC1\x35\xCC\x63\xFA"
+                         "\x6E\x05\x9C\x10\xA7\x3E\xD5\x49"
+                         "\xE0\x77\x0E\x82\x19\xB0\x24\xBB"
+                         "\x52\xE9\x5D\xF4\x8B\x22\x96\x2D"
+                         "\xC4\x38\xCF\x66\xFD\x71\x08\x9F"
+                         "\x13\xAA\x41\xD8\x4C\xE3\x7A\x11"
+                         "\x85\x1C\xB3\x27\xBE\x55\xEC\x60"
+                         "\xF7\x8E\x02\x99\x30\xC7\x3B\xD2"
+                         "\x69\x00\x74\x0B\xA2\x16\xAD\x44"
+                         "\xDB\x4F\xE6\x7D\x14\x88\x1F\xB6"
+                         "\x2A\xC1\x58\xEF\x63\xFA\x91\x05"
+                         "\x9C\x33\xCA\x3E\xD5\x6C\x03\x77"
+                         "\x0E\xA5\x19\xB0\x47\xDE\x52\xE9"
+                         "\x80\x17\x8B\x22\xB9\x2D\xC4\x5B"
+                         "\xF2\x66\xFD\x94\x08\x9F\x36\xCD"
+                         "\x41\xD8\x6F\x06\x7A\x11\xA8\x1C"
+                         "\xB3\x4A\xE1\x55\xEC\x83\x1A\x8E"
+                         "\x25\xBC\x30\xC7\x5E\xF5\x69\x00"
+                         "\x97\x0B\xA2\x39\xD0\x44\xDB\x72"
+                         "\x09\x7D\x14\xAB\x1F\xB6\x4D\xE4"
+                         "\x58\xEF\x86\x1D\x91\x28\xBF\x33"
+                         "\xCA\x61\xF8\x6C\x03\x9A\x0E\xA5"
+                         "\x3C\xD3\x47\xDE\x75\x0C\x80\x17"
+                         "\xAE\x22\xB9\x50\xE7\x5B\xF2\x89"
+                         "\x20\x94\x2B\xC2\x36\xCD\x64\xFB"
+                         "\x6F\x06\x9D\x11\xA8\x3F\xD6\x4A"
+                         "\xE1\x78\x0F\x83\x1A\xB1\x25\xBC"
+                         "\x53\xEA\x5E\xF5\x8C\x00\x97\x2E"
+                         "\xC5\x39\xD0\x67\xFE\x72\x09\xA0"
+                         "\x14\xAB\x42\xD9\x4D\xE4\x7B\x12"
+                         "\x86\x1D\xB4\x28\xBF\x56\xED\x61"
+                         "\xF8\x8F\x03\x9A\x31\xC8\x3C\xD3"
+                         "\x6A\x01\x75\x0C\xA3\x17\xAE\x45"
+                         "\xDC\x50\xE7\x7E\x15\x89\x20\xB7"
+                         "\x2B\xC2\x59\xF0\x64\xFB\x92\x06",
+               .ilen   = 504,
+               .result = "\x5F\x58\x6E\x60\x51\x6E\xDC\x3D"
+                         "\xD1\xBB\xF7\xB7\xFD\x04\x44\x82"
+                         "\xDC\x9F\x4B\x02\xF1\xD2\x5A\x6F"
+                         "\x25\xF9\x27\x21\xF2\xD2\x9A\x01"
+                         "\xBD\xAD\x3D\x93\x87\xCA\x0D\xFE"
+                         "\xB7\x2C\x17\x1F\x42\x8C\x13\xB2"
+                         "\x62\x44\x72\xB9\x5D\xC0\xF8\x37"
+                         "\xDF\xEA\x78\x81\x8F\xA6\x34\xB2"
+                         "\x07\x09\x7C\xB9\x3A\xA0\x2B\x18"
+                         "\x34\x6A\x9D\x3D\xA5\xEB\xF4\x60"
+                         "\xF8\x98\xA2\x39\x81\x23\x6C\xA9"
+                         "\x70\xCA\xCC\x45\xD8\x1F\xDF\x44"
+                         "\x2A\x67\x7A\x88\x28\xDC\x36\x83"
+                         "\x18\xD7\x48\x43\x17\x2B\x1B\xE6"
+                         "\x0B\x82\x59\x14\x26\x67\x08\x09"
+                         "\x5B\x5D\x38\xD0\x81\xCE\x54\x2A"
+                         "\xCD\x22\x94\x42\xF5\xBA\x74\x7E"
+                         "\xD9\x00\x40\xA9\x0D\x0B\xBD\x8E"
+                         "\xC4\x8E\x5E\x17\x8F\x48\xE2\xB8"
+                         "\xF4\xCC\x19\x76\xAB\x48\x29\xAA"
+                         "\x81\xD5\xCE\xD5\x8A\x3B\xC9\x21"
+                         "\xEF\x50\x4F\x04\x02\xBF\xE1\x1F"
+                         "\x59\x28\x1A\xE4\x18\x16\xA0\x29"
+                         "\xBF\x34\xA9\x2D\x28\x83\xC0\x5E"
+                         "\xEA\x44\xC4\x6E\xAB\x24\x79\x9D"
+                         "\x2D\xA1\xE8\x55\xCA\x74\xFC\xBD"
+                         "\xFE\xDD\xDA\xA5\xFB\x34\x90\x31"
+                         "\x0E\x62\x28\x9B\xDC\xD7\xA1\xBB"
+                         "\xF0\x1A\xB3\xE2\xD0\xFA\xBD\xE8"
+                         "\x5C\x5A\x10\x67\xF6\x6A\x17\x3F"
+                         "\xC5\xE9\x09\x08\xDD\x22\x77\x42"
+                         "\x26\x6A\x6A\x7A\x3F\x87\x80\x0C"
+                         "\xF0\xFF\x15\x8E\x84\x86\xC0\x10"
+                         "\x0F\x8D\x33\x06\xB8\x72\xA4\x47"
+                         "\x6B\xED\x2E\x05\x94\x6C\x5C\x5B"
+                         "\x13\xF6\x77\xEE\x3B\x16\xDF\xC2"
+                         "\x63\x66\x07\x6D\x3F\x6C\x51\x7C"
+                         "\x1C\xAC\x80\xB6\x58\x48\xB7\x9D"
+                         "\xB4\x19\xD8\x19\x45\x66\x27\x02"
+                         "\xA1\xA9\x99\xF3\x1F\xE5\xA7\x1D"
+                         "\x31\xE7\x1B\x0D\xFF\xBB\xB5\xA1"
+                         "\xF5\x9C\x45\x1E\x18\x19\xA1\xE7"
+                         "\xC2\xF1\xBF\x68\xC3\xEC\xCF\x53"
+                         "\x67\xA6\x2B\x7D\x3C\x6D\x24\xC3"
+                         "\xE8\xE6\x07\x5A\x09\xE0\x32\xA8"
+                         "\x52\xF6\xE9\xED\x0E\xC6\x0A\x6A"
+                         "\xFC\x60\x2A\xE0\x93\xCE\xB8\x2E"
+                         "\xA2\xA8\x0E\x79\x9E\x34\x5D\x37"
+                         "\x6F\x12\xFE\x48\x7B\xE7\xB9\x22"
+                         "\x29\xE8\xD7\xBE\x5D\xD1\x8B\xD9"
+                         "\x91\x51\x4E\x71\xF2\x98\x85\x16"
+                         "\x25\x7A\x76\x8A\x51\x0E\x65\x14"
+                         "\x81\xB5\x3A\x37\xFD\xEC\xB5\x8A"
+                         "\xE1\xCF\x41\x72\x14\x29\x4C\xF0"
+                         "\x20\xD9\x9A\xC5\x66\xA4\x03\x76"
+                         "\x5B\xA4\x15\x4F\x0E\x64\x39\x40"
+                         "\x25\xF9\x20\x22\xF5\x88\xF5\xBA"
+                         "\xE4\xDF\x45\x61\xBF\x8D\x7A\x24"
+                         "\x4B\x92\x71\xD9\x2F\x77\xA7\x95"
+                         "\xA8\x7F\x61\xD5\xA4\x57\xB0\xFB"
+                         "\xB5\x77\xBA\x1C\xEE\x71\xFA\xB0"
+                         "\x16\x4C\x18\x6B\xF2\x69\xA0\x07"
+                         "\xEF\xBE\xEC\x69\xAC\xA8\x63\x9E",
+               .rlen   = 504,
        },
 };
 
@@ -2705,6 +2856,144 @@ static struct cipher_testvec bf_ctr_dec_tv_template[] = {
                          "\x1E\x92\x29\xC0\x34\xCB\x62\xF9"
                          "\x6D\x04\x9B",
                .rlen   = 43,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 43 - 8, 8 },
+       }, { /* Generated with Crypto++ */
+               .key    = "\x85\x62\x3F\x1C\xF9\xD6\x1C\xF9"
+                         "\xD6\xB3\x90\x6D\x4A\x90\x6D\x4A"
+                         "\x27\x04\xE1\x27\x04\xE1\xBE\x9B"
+                         "\x78\xBE\x9B\x78\x55\x32\x0F\x55",
+               .klen   = 32,
+               .iv     = "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFD",
+               .input  = "\x5F\x58\x6E\x60\x51\x6E\xDC\x3D"
+                         "\xD1\xBB\xF7\xB7\xFD\x04\x44\x82"
+                         "\xDC\x9F\x4B\x02\xF1\xD2\x5A\x6F"
+                         "\x25\xF9\x27\x21\xF2\xD2\x9A\x01"
+                         "\xBD\xAD\x3D\x93\x87\xCA\x0D\xFE"
+                         "\xB7\x2C\x17\x1F\x42\x8C\x13\xB2"
+                         "\x62\x44\x72\xB9\x5D\xC0\xF8\x37"
+                         "\xDF\xEA\x78\x81\x8F\xA6\x34\xB2"
+                         "\x07\x09\x7C\xB9\x3A\xA0\x2B\x18"
+                         "\x34\x6A\x9D\x3D\xA5\xEB\xF4\x60"
+                         "\xF8\x98\xA2\x39\x81\x23\x6C\xA9"
+                         "\x70\xCA\xCC\x45\xD8\x1F\xDF\x44"
+                         "\x2A\x67\x7A\x88\x28\xDC\x36\x83"
+                         "\x18\xD7\x48\x43\x17\x2B\x1B\xE6"
+                         "\x0B\x82\x59\x14\x26\x67\x08\x09"
+                         "\x5B\x5D\x38\xD0\x81\xCE\x54\x2A"
+                         "\xCD\x22\x94\x42\xF5\xBA\x74\x7E"
+                         "\xD9\x00\x40\xA9\x0D\x0B\xBD\x8E"
+                         "\xC4\x8E\x5E\x17\x8F\x48\xE2\xB8"
+                         "\xF4\xCC\x19\x76\xAB\x48\x29\xAA"
+                         "\x81\xD5\xCE\xD5\x8A\x3B\xC9\x21"
+                         "\xEF\x50\x4F\x04\x02\xBF\xE1\x1F"
+                         "\x59\x28\x1A\xE4\x18\x16\xA0\x29"
+                         "\xBF\x34\xA9\x2D\x28\x83\xC0\x5E"
+                         "\xEA\x44\xC4\x6E\xAB\x24\x79\x9D"
+                         "\x2D\xA1\xE8\x55\xCA\x74\xFC\xBD"
+                         "\xFE\xDD\xDA\xA5\xFB\x34\x90\x31"
+                         "\x0E\x62\x28\x9B\xDC\xD7\xA1\xBB"
+                         "\xF0\x1A\xB3\xE2\xD0\xFA\xBD\xE8"
+                         "\x5C\x5A\x10\x67\xF6\x6A\x17\x3F"
+                         "\xC5\xE9\x09\x08\xDD\x22\x77\x42"
+                         "\x26\x6A\x6A\x7A\x3F\x87\x80\x0C"
+                         "\xF0\xFF\x15\x8E\x84\x86\xC0\x10"
+                         "\x0F\x8D\x33\x06\xB8\x72\xA4\x47"
+                         "\x6B\xED\x2E\x05\x94\x6C\x5C\x5B"
+                         "\x13\xF6\x77\xEE\x3B\x16\xDF\xC2"
+                         "\x63\x66\x07\x6D\x3F\x6C\x51\x7C"
+                         "\x1C\xAC\x80\xB6\x58\x48\xB7\x9D"
+                         "\xB4\x19\xD8\x19\x45\x66\x27\x02"
+                         "\xA1\xA9\x99\xF3\x1F\xE5\xA7\x1D"
+                         "\x31\xE7\x1B\x0D\xFF\xBB\xB5\xA1"
+                         "\xF5\x9C\x45\x1E\x18\x19\xA1\xE7"
+                         "\xC2\xF1\xBF\x68\xC3\xEC\xCF\x53"
+                         "\x67\xA6\x2B\x7D\x3C\x6D\x24\xC3"
+                         "\xE8\xE6\x07\x5A\x09\xE0\x32\xA8"
+                         "\x52\xF6\xE9\xED\x0E\xC6\x0A\x6A"
+                         "\xFC\x60\x2A\xE0\x93\xCE\xB8\x2E"
+                         "\xA2\xA8\x0E\x79\x9E\x34\x5D\x37"
+                         "\x6F\x12\xFE\x48\x7B\xE7\xB9\x22"
+                         "\x29\xE8\xD7\xBE\x5D\xD1\x8B\xD9"
+                         "\x91\x51\x4E\x71\xF2\x98\x85\x16"
+                         "\x25\x7A\x76\x8A\x51\x0E\x65\x14"
+                         "\x81\xB5\x3A\x37\xFD\xEC\xB5\x8A"
+                         "\xE1\xCF\x41\x72\x14\x29\x4C\xF0"
+                         "\x20\xD9\x9A\xC5\x66\xA4\x03\x76"
+                         "\x5B\xA4\x15\x4F\x0E\x64\x39\x40"
+                         "\x25\xF9\x20\x22\xF5\x88\xF5\xBA"
+                         "\xE4\xDF\x45\x61\xBF\x8D\x7A\x24"
+                         "\x4B\x92\x71\xD9\x2F\x77\xA7\x95"
+                         "\xA8\x7F\x61\xD5\xA4\x57\xB0\xFB"
+                         "\xB5\x77\xBA\x1C\xEE\x71\xFA\xB0"
+                         "\x16\x4C\x18\x6B\xF2\x69\xA0\x07"
+                         "\xEF\xBE\xEC\x69\xAC\xA8\x63\x9E",
+               .ilen   = 504,
+               .result = "\x56\xED\x84\x1B\x8F\x26\xBD\x31"
+                         "\xC8\x5F\xF6\x6A\x01\x98\x0C\xA3"
+                         "\x3A\xD1\x45\xDC\x73\x0A\x7E\x15"
+                         "\xAC\x20\xB7\x4E\xE5\x59\xF0\x87"
+                         "\x1E\x92\x29\xC0\x34\xCB\x62\xF9"
+                         "\x6D\x04\x9B\x0F\xA6\x3D\xD4\x48"
+                         "\xDF\x76\x0D\x81\x18\xAF\x23\xBA"
+                         "\x51\xE8\x5C\xF3\x8A\x21\x95\x2C"
+                         "\xC3\x37\xCE\x65\xFC\x70\x07\x9E"
+                         "\x12\xA9\x40\xD7\x4B\xE2\x79\x10"
+                         "\x84\x1B\xB2\x26\xBD\x54\xEB\x5F"
+                         "\xF6\x8D\x01\x98\x2F\xC6\x3A\xD1"
+                         "\x68\xFF\x73\x0A\xA1\x15\xAC\x43"
+                         "\xDA\x4E\xE5\x7C\x13\x87\x1E\xB5"
+                         "\x29\xC0\x57\xEE\x62\xF9\x90\x04"
+                         "\x9B\x32\xC9\x3D\xD4\x6B\x02\x76"
+                         "\x0D\xA4\x18\xAF\x46\xDD\x51\xE8"
+                         "\x7F\x16\x8A\x21\xB8\x2C\xC3\x5A"
+                         "\xF1\x65\xFC\x93\x07\x9E\x35\xCC"
+                         "\x40\xD7\x6E\x05\x79\x10\xA7\x1B"
+                         "\xB2\x49\xE0\x54\xEB\x82\x19\x8D"
+                         "\x24\xBB\x2F\xC6\x5D\xF4\x68\xFF"
+                         "\x96\x0A\xA1\x38\xCF\x43\xDA\x71"
+                         "\x08\x7C\x13\xAA\x1E\xB5\x4C\xE3"
+                         "\x57\xEE\x85\x1C\x90\x27\xBE\x32"
+                         "\xC9\x60\xF7\x6B\x02\x99\x0D\xA4"
+                         "\x3B\xD2\x46\xDD\x74\x0B\x7F\x16"
+                         "\xAD\x21\xB8\x4F\xE6\x5A\xF1\x88"
+                         "\x1F\x93\x2A\xC1\x35\xCC\x63\xFA"
+                         "\x6E\x05\x9C\x10\xA7\x3E\xD5\x49"
+                         "\xE0\x77\x0E\x82\x19\xB0\x24\xBB"
+                         "\x52\xE9\x5D\xF4\x8B\x22\x96\x2D"
+                         "\xC4\x38\xCF\x66\xFD\x71\x08\x9F"
+                         "\x13\xAA\x41\xD8\x4C\xE3\x7A\x11"
+                         "\x85\x1C\xB3\x27\xBE\x55\xEC\x60"
+                         "\xF7\x8E\x02\x99\x30\xC7\x3B\xD2"
+                         "\x69\x00\x74\x0B\xA2\x16\xAD\x44"
+                         "\xDB\x4F\xE6\x7D\x14\x88\x1F\xB6"
+                         "\x2A\xC1\x58\xEF\x63\xFA\x91\x05"
+                         "\x9C\x33\xCA\x3E\xD5\x6C\x03\x77"
+                         "\x0E\xA5\x19\xB0\x47\xDE\x52\xE9"
+                         "\x80\x17\x8B\x22\xB9\x2D\xC4\x5B"
+                         "\xF2\x66\xFD\x94\x08\x9F\x36\xCD"
+                         "\x41\xD8\x6F\x06\x7A\x11\xA8\x1C"
+                         "\xB3\x4A\xE1\x55\xEC\x83\x1A\x8E"
+                         "\x25\xBC\x30\xC7\x5E\xF5\x69\x00"
+                         "\x97\x0B\xA2\x39\xD0\x44\xDB\x72"
+                         "\x09\x7D\x14\xAB\x1F\xB6\x4D\xE4"
+                         "\x58\xEF\x86\x1D\x91\x28\xBF\x33"
+                         "\xCA\x61\xF8\x6C\x03\x9A\x0E\xA5"
+                         "\x3C\xD3\x47\xDE\x75\x0C\x80\x17"
+                         "\xAE\x22\xB9\x50\xE7\x5B\xF2\x89"
+                         "\x20\x94\x2B\xC2\x36\xCD\x64\xFB"
+                         "\x6F\x06\x9D\x11\xA8\x3F\xD6\x4A"
+                         "\xE1\x78\x0F\x83\x1A\xB1\x25\xBC"
+                         "\x53\xEA\x5E\xF5\x8C\x00\x97\x2E"
+                         "\xC5\x39\xD0\x67\xFE\x72\x09\xA0"
+                         "\x14\xAB\x42\xD9\x4D\xE4\x7B\x12"
+                         "\x86\x1D\xB4\x28\xBF\x56\xED\x61"
+                         "\xF8\x8F\x03\x9A\x31\xC8\x3C\xD3"
+                         "\x6A\x01\x75\x0C\xA3\x17\xAE\x45"
+                         "\xDC\x50\xE7\x7E\x15\x89\x20\xB7"
+                         "\x2B\xC2\x59\xF0\x64\xFB\x92\x06",
+               .rlen   = 504,
        },
 };
 
@@ -2884,6 +3173,9 @@ static struct cipher_testvec tf_enc_tv_template[] = {
                          "\x58\x33\x9B\x78\xC7\x58\x48\x6B"
                          "\x2C\x75\x64\xC4\xCA\xC1\x7E\xD5",
                .rlen   = 496,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 496 - 16, 16 },
        },
 };
 
@@ -3049,6 +3341,9 @@ static struct cipher_testvec tf_dec_tv_template[] = {
                          "\x6A\x01\x75\x0C\xA3\x17\xAE\x45"
                          "\xDC\x50\xE7\x7E\x15\x89\x20\xB7",
                .rlen   = 496,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 496 - 16, 16 },
        },
 };
 
@@ -3229,6 +3524,9 @@ static struct cipher_testvec tf_cbc_enc_tv_template[] = {
                          "\x30\x70\x56\xA4\x37\xDD\x7C\xC0"
                          "\x0A\xA3\x30\x10\x26\x25\x41\x2C",
                .rlen   = 496,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 496 - 16, 16 },
        },
 };
 
@@ -3409,6 +3707,9 @@ static struct cipher_testvec tf_cbc_dec_tv_template[] = {
                          "\x6A\x01\x75\x0C\xA3\x17\xAE\x45"
                          "\xDC\x50\xE7\x7E\x15\x89\x20\xB7",
                .rlen   = 496,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 496 - 16, 16 },
        },
 };
 
@@ -3553,6 +3854,140 @@ static struct cipher_testvec tf_ctr_enc_tv_template[] = {
                          "\x27\x04\xE1\x27\x04\xE1\xBE\x9B"
                          "\x78\xBE\x9B\x78\x55\x32\x0F\x55",
                .klen   = 32,
+               .iv     = "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+                         "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFD",
+               .input  = "\x56\xED\x84\x1B\x8F\x26\xBD\x31"
+                         "\xC8\x5F\xF6\x6A\x01\x98\x0C\xA3"
+                         "\x3A\xD1\x45\xDC\x73\x0A\x7E\x15"
+                         "\xAC\x20\xB7\x4E\xE5\x59\xF0\x87"
+                         "\x1E\x92\x29\xC0\x34\xCB\x62\xF9"
+                         "\x6D\x04\x9B\x0F\xA6\x3D\xD4\x48"
+                         "\xDF\x76\x0D\x81\x18\xAF\x23\xBA"
+                         "\x51\xE8\x5C\xF3\x8A\x21\x95\x2C"
+                         "\xC3\x37\xCE\x65\xFC\x70\x07\x9E"
+                         "\x12\xA9\x40\xD7\x4B\xE2\x79\x10"
+                         "\x84\x1B\xB2\x26\xBD\x54\xEB\x5F"
+                         "\xF6\x8D\x01\x98\x2F\xC6\x3A\xD1"
+                         "\x68\xFF\x73\x0A\xA1\x15\xAC\x43"
+                         "\xDA\x4E\xE5\x7C\x13\x87\x1E\xB5"
+                         "\x29\xC0\x57\xEE\x62\xF9\x90\x04"
+                         "\x9B\x32\xC9\x3D\xD4\x6B\x02\x76"
+                         "\x0D\xA4\x18\xAF\x46\xDD\x51\xE8"
+                         "\x7F\x16\x8A\x21\xB8\x2C\xC3\x5A"
+                         "\xF1\x65\xFC\x93\x07\x9E\x35\xCC"
+                         "\x40\xD7\x6E\x05\x79\x10\xA7\x1B"
+                         "\xB2\x49\xE0\x54\xEB\x82\x19\x8D"
+                         "\x24\xBB\x2F\xC6\x5D\xF4\x68\xFF"
+                         "\x96\x0A\xA1\x38\xCF\x43\xDA\x71"
+                         "\x08\x7C\x13\xAA\x1E\xB5\x4C\xE3"
+                         "\x57\xEE\x85\x1C\x90\x27\xBE\x32"
+                         "\xC9\x60\xF7\x6B\x02\x99\x0D\xA4"
+                         "\x3B\xD2\x46\xDD\x74\x0B\x7F\x16"
+                         "\xAD\x21\xB8\x4F\xE6\x5A\xF1\x88"
+                         "\x1F\x93\x2A\xC1\x35\xCC\x63\xFA"
+                         "\x6E\x05\x9C\x10\xA7\x3E\xD5\x49"
+                         "\xE0\x77\x0E\x82\x19\xB0\x24\xBB"
+                         "\x52\xE9\x5D\xF4\x8B\x22\x96\x2D"
+                         "\xC4\x38\xCF\x66\xFD\x71\x08\x9F"
+                         "\x13\xAA\x41\xD8\x4C\xE3\x7A\x11"
+                         "\x85\x1C\xB3\x27\xBE\x55\xEC\x60"
+                         "\xF7\x8E\x02\x99\x30\xC7\x3B\xD2"
+                         "\x69\x00\x74\x0B\xA2\x16\xAD\x44"
+                         "\xDB\x4F\xE6\x7D\x14\x88\x1F\xB6"
+                         "\x2A\xC1\x58\xEF\x63\xFA\x91\x05"
+                         "\x9C\x33\xCA\x3E\xD5\x6C\x03\x77"
+                         "\x0E\xA5\x19\xB0\x47\xDE\x52\xE9"
+                         "\x80\x17\x8B\x22\xB9\x2D\xC4\x5B"
+                         "\xF2\x66\xFD\x94\x08\x9F\x36\xCD"
+                         "\x41\xD8\x6F\x06\x7A\x11\xA8\x1C"
+                         "\xB3\x4A\xE1\x55\xEC\x83\x1A\x8E"
+                         "\x25\xBC\x30\xC7\x5E\xF5\x69\x00"
+                         "\x97\x0B\xA2\x39\xD0\x44\xDB\x72"
+                         "\x09\x7D\x14\xAB\x1F\xB6\x4D\xE4"
+                         "\x58\xEF\x86\x1D\x91\x28\xBF\x33"
+                         "\xCA\x61\xF8\x6C\x03\x9A\x0E\xA5"
+                         "\x3C\xD3\x47\xDE\x75\x0C\x80\x17"
+                         "\xAE\x22\xB9\x50\xE7\x5B\xF2\x89"
+                         "\x20\x94\x2B\xC2\x36\xCD\x64\xFB"
+                         "\x6F\x06\x9D\x11\xA8\x3F\xD6\x4A"
+                         "\xE1\x78\x0F\x83\x1A\xB1\x25\xBC"
+                         "\x53\xEA\x5E\xF5\x8C\x00\x97\x2E"
+                         "\xC5\x39\xD0\x67\xFE\x72\x09\xA0"
+                         "\x14\xAB\x42\xD9\x4D\xE4\x7B\x12"
+                         "\x86\x1D\xB4\x28\xBF\x56\xED\x61"
+                         "\xF8\x8F\x03\x9A\x31\xC8\x3C\xD3"
+                         "\x6A\x01\x75\x0C\xA3\x17\xAE\x45"
+                         "\xDC\x50\xE7\x7E\x15\x89\x20\xB7",
+               .ilen   = 496,
+               .result = "\xEB\x44\xAF\x49\x27\xB8\xFB\x44"
+                         "\x4C\xA6\xC3\x0C\x8B\xD0\x01\x0C"
+                         "\x53\xC8\x16\x38\xDE\x40\x4F\x91"
+                         "\x25\x6D\x4C\xA0\x9A\x87\x1E\xDA"
+                         "\x88\x7E\x89\xE9\x67\x2B\x83\xA2"
+                         "\x5F\x2E\x23\x3E\x45\xB9\x77\x7B"
+                         "\xA6\x7E\x47\x36\x81\x9F\x9B\xF3"
+                         "\xE0\xF0\xD7\x47\xA9\xC8\xEF\x33"
+                         "\x0C\x43\xFE\x67\x50\x0A\x2C\x3E"
+                         "\xA0\xE1\x25\x8E\x80\x07\x4A\xC0"
+                         "\x64\x89\x9F\x6A\x27\x96\x07\xA6"
+                         "\x9B\xC8\x1B\x21\x60\xAE\x5D\x01"
+                         "\xE2\xCD\xC8\xAA\x6C\x9D\x1C\x34"
+                         "\x39\x18\x09\xA4\x82\x59\x78\xE7"
+                         "\xFC\x59\x65\xF2\x94\xFF\xFB\xE2"
+                         "\x3C\xDA\xB1\x90\x95\xBF\x91\xE3"
+                         "\xE6\x87\x31\x9E\x16\x85\xAD\xB1"
+                         "\x4C\xAE\x43\x4D\x19\x58\xB5\x5E"
+                         "\x2E\xF5\x09\xAA\x39\xF4\xC0\xB3"
+                         "\xD4\x4D\xDB\x73\x7A\xD4\xF1\xBF"
+                         "\x89\x16\x4D\x2D\xA2\x26\x33\x72"
+                         "\x18\x33\x7E\xD6\xD2\x16\xA4\x54"
+                         "\xF4\x8C\xB3\x52\xDF\x21\x9C\xEB"
+                         "\xBF\x49\xD3\xF9\x05\x06\xCB\xD2"
+                         "\xA9\xD2\x3B\x6E\x19\x8C\xBC\x19"
+                         "\xAB\x89\xD6\xD8\xCD\x56\x89\x5E"
+                         "\xAC\x00\xE3\x50\x63\x4A\x80\x9A"
+                         "\x05\xBC\x50\x39\xD3\x32\xD9\x0D"
+                         "\xE3\x20\x0D\x75\x54\xEC\xE6\x31"
+                         "\x14\xB9\x3A\x59\x00\x43\x37\x8E"
+                         "\x8C\x5A\x79\x62\x14\x76\x8A\xAE"
+                         "\x8F\xCC\xA1\x6C\x38\x78\xDD\x2D"
+                         "\x8B\x6D\xEA\xBD\x7B\x25\xFF\x60"
+                         "\xC9\x87\xB1\x79\x1E\xA5\x86\x68"
+                         "\x81\xB4\xE2\xC1\x05\x7D\x3A\x73"
+                         "\xD0\xDA\x75\x77\x9E\x05\x27\xF1"
+                         "\x08\xA9\x66\x64\x6C\xBC\x82\x17"
+                         "\x2C\x23\x5F\x62\x4D\x02\x1A\x58"
+                         "\xE7\xB7\x23\x6D\xE2\x20\xDA\xEF"
+                         "\xB4\xB3\x3F\xB2\x2B\x69\x98\x83"
+                         "\x95\x87\x13\x57\x60\xD7\xB5\xB1"
+                         "\xEE\x0A\x2F\x95\x36\x4C\x76\x5D"
+                         "\x5F\xD9\x19\xED\xB9\xA5\x48\xBF"
+                         "\xC8\xAB\x0F\x71\xCC\x61\x8E\x0A"
+                         "\xD0\x29\x44\xA8\xB9\xC1\xE8\xC8"
+                         "\xC9\xA8\x28\x81\xFB\x50\xF2\xF0"
+                         "\x26\xAE\x39\xB8\x91\xCD\xA8\xAC"
+                         "\xDE\x55\x1B\x50\x14\x53\x44\x17"
+                         "\x54\x46\xFC\xB1\xE4\x07\x6B\x9A"
+                         "\x01\x14\xF0\x2E\x2E\xDB\x46\x1B"
+                         "\x1A\x09\x97\xA9\xB6\x97\x79\x06"
+                         "\xFB\xCB\x85\xCF\xDD\xA1\x41\xB1"
+                         "\x00\xAA\xF7\xE0\x89\x73\xFB\xE5"
+                         "\xBF\x84\xDB\xC9\xCD\xC4\xA2\x0D"
+                         "\x3B\xAC\xF9\xDF\x96\xBF\x88\x23"
+                         "\x41\x67\xA1\x24\x99\x7E\xCC\x9B"
+                         "\x02\x8F\x6A\x49\xF6\x25\xBA\x7A"
+                         "\xF4\x78\xFD\x79\x62\x63\x4F\x14"
+                         "\xD6\x11\x11\x04\x05\x5F\x7E\xEA"
+                         "\x4C\xB6\xF8\xF4\x5F\x48\x52\x54"
+                         "\x94\x63\xA8\x4E\xCF\xD2\x1B\x1B"
+                         "\x22\x18\x6A\xAF\x6E\x3E\xE1\x0D",
+               .rlen   = 496,
+       }, { /* Generated with Crypto++ */
+               .key    = "\x85\x62\x3F\x1C\xF9\xD6\x1C\xF9"
+                         "\xD6\xB3\x90\x6D\x4A\x90\x6D\x4A"
+                         "\x27\x04\xE1\x27\x04\xE1\xBE\x9B"
+                         "\x78\xBE\x9B\x78\x55\x32\x0F\x55",
+               .klen   = 32,
                .iv     = "\xE2\x24\x89\xEE\x53\xB8\x1D\x5F"
                          "\xC4\x29\x8E\xF3\x35\x9A\xFF\x64",
                .input  = "\x56\xED\x84\x1B\x8F\x26\xBD\x31"
@@ -3683,6 +4118,9 @@ static struct cipher_testvec tf_ctr_enc_tv_template[] = {
                          "\xC5\xC9\x7F\x9E\xCF\x33\x7A\xDF"
                          "\x6C\x82\x9D",
                .rlen   = 499,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 499 - 16, 16 },
        },
 };
 
@@ -3827,45 +4265,179 @@ static struct cipher_testvec tf_ctr_dec_tv_template[] = {
                          "\x27\x04\xE1\x27\x04\xE1\xBE\x9B"
                          "\x78\xBE\x9B\x78\x55\x32\x0F\x55",
                .klen   = 32,
-               .iv     = "\xE2\x24\x89\xEE\x53\xB8\x1D\x5F"
-                         "\xC4\x29\x8E\xF3\x35\x9A\xFF\x64",
-               .input  = "\xDF\xDD\x69\xFA\xB0\x2E\xFD\xFE"
-                         "\x70\x9E\xC5\x4B\xC9\xD4\xA1\x30"
-                         "\x26\x9B\x89\xA1\xEE\x43\xE0\x52"
-                         "\x55\x17\x4E\xC7\x0E\x33\x1F\xF1"
-                         "\x9F\x8D\x40\x9F\x24\xFD\x92\xA0"
-                         "\xBC\x8F\x35\xDD\x67\x38\xD8\xAA"
-                         "\xCF\xF8\x48\xCA\xFB\xE4\x5C\x60"
-                         "\x01\x41\x21\x12\x38\xAB\x52\x4F"
-                         "\xA8\x57\x20\xE0\x21\x6A\x17\x0D"
-                         "\x0E\xF9\x8E\x49\x42\x00\x3C\x94"
-                         "\x14\xC0\xD0\x8D\x8A\x98\xEB\x29"
-                         "\xEC\xAE\x96\x44\xC0\x3C\x48\xDC"
-                         "\x29\x35\x25\x2F\xE7\x11\x6C\x68"
-                         "\xC8\x67\x0A\x2F\xF4\x07\xBE\xF9"
-                         "\x2C\x31\x87\x40\xAB\xB2\xB6\xFA"
-                         "\xD2\xC9\x6D\x5C\x50\xE9\xE6\x7E"
-                         "\xE3\x0A\xD2\xD5\x6D\x8D\x64\x9E"
-                         "\x70\xCE\x03\x76\xDD\xE0\xF0\x8C"
-                         "\x84\x86\x8B\x6A\xFE\xC7\xF9\x69"
-                         "\x2E\xFE\xFC\xC2\xC4\x1A\x55\x58"
-                         "\xB3\xBE\xE2\x7E\xED\x39\x42\x6C"
-                         "\xB4\x42\x97\x9A\xEC\xE1\x0A\x06"
-                         "\x02\xC5\x03\x9D\xC4\x48\x15\x66"
-                         "\x35\x6A\xC2\xC9\xA2\x26\x30\xBB"
-                         "\xDB\x2D\xC8\x08\x2B\xA0\x29\x1A"
-                         "\x23\x61\x48\xEA\x80\x04\x27\xAA"
-                         "\x69\x49\xE8\xE8\x4A\x83\x6B\x5A"
-                         "\xCA\x7C\xD3\xB1\xB5\x0B\xCC\x23"
-                         "\x74\x1F\xA9\x87\xCD\xED\xC0\x2D"
-                         "\xBF\xEB\xCF\x16\x2D\x2A\x2E\x1D"
-                         "\x96\xBA\x36\x11\x45\x41\xDA\xCE"
-                         "\xA4\x48\x80\x8B\x06\xF4\x98\x89"
-                         "\x8B\x23\x08\x53\xF4\xD4\x5A\x24"
-                         "\x8B\xF8\x43\x73\xD1\xEE\xC4\xB0"
-                         "\xF8\xFE\x09\x0C\x75\x05\x38\x0B"
-                         "\x7C\x81\xDE\x9D\xE4\x61\x37\x63"
-                         "\x63\xAD\x12\xD2\x04\xB9\xCE\x45"
+               .iv     = "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+                         "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFD",
+               .input  = "\xEB\x44\xAF\x49\x27\xB8\xFB\x44"
+                         "\x4C\xA6\xC3\x0C\x8B\xD0\x01\x0C"
+                         "\x53\xC8\x16\x38\xDE\x40\x4F\x91"
+                         "\x25\x6D\x4C\xA0\x9A\x87\x1E\xDA"
+                         "\x88\x7E\x89\xE9\x67\x2B\x83\xA2"
+                         "\x5F\x2E\x23\x3E\x45\xB9\x77\x7B"
+                         "\xA6\x7E\x47\x36\x81\x9F\x9B\xF3"
+                         "\xE0\xF0\xD7\x47\xA9\xC8\xEF\x33"
+                         "\x0C\x43\xFE\x67\x50\x0A\x2C\x3E"
+                         "\xA0\xE1\x25\x8E\x80\x07\x4A\xC0"
+                         "\x64\x89\x9F\x6A\x27\x96\x07\xA6"
+                         "\x9B\xC8\x1B\x21\x60\xAE\x5D\x01"
+                         "\xE2\xCD\xC8\xAA\x6C\x9D\x1C\x34"
+                         "\x39\x18\x09\xA4\x82\x59\x78\xE7"
+                         "\xFC\x59\x65\xF2\x94\xFF\xFB\xE2"
+                         "\x3C\xDA\xB1\x90\x95\xBF\x91\xE3"
+                         "\xE6\x87\x31\x9E\x16\x85\xAD\xB1"
+                         "\x4C\xAE\x43\x4D\x19\x58\xB5\x5E"
+                         "\x2E\xF5\x09\xAA\x39\xF4\xC0\xB3"
+                         "\xD4\x4D\xDB\x73\x7A\xD4\xF1\xBF"
+                         "\x89\x16\x4D\x2D\xA2\x26\x33\x72"
+                         "\x18\x33\x7E\xD6\xD2\x16\xA4\x54"
+                         "\xF4\x8C\xB3\x52\xDF\x21\x9C\xEB"
+                         "\xBF\x49\xD3\xF9\x05\x06\xCB\xD2"
+                         "\xA9\xD2\x3B\x6E\x19\x8C\xBC\x19"
+                         "\xAB\x89\xD6\xD8\xCD\x56\x89\x5E"
+                         "\xAC\x00\xE3\x50\x63\x4A\x80\x9A"
+                         "\x05\xBC\x50\x39\xD3\x32\xD9\x0D"
+                         "\xE3\x20\x0D\x75\x54\xEC\xE6\x31"
+                         "\x14\xB9\x3A\x59\x00\x43\x37\x8E"
+                         "\x8C\x5A\x79\x62\x14\x76\x8A\xAE"
+                         "\x8F\xCC\xA1\x6C\x38\x78\xDD\x2D"
+                         "\x8B\x6D\xEA\xBD\x7B\x25\xFF\x60"
+                         "\xC9\x87\xB1\x79\x1E\xA5\x86\x68"
+                         "\x81\xB4\xE2\xC1\x05\x7D\x3A\x73"
+                         "\xD0\xDA\x75\x77\x9E\x05\x27\xF1"
+                         "\x08\xA9\x66\x64\x6C\xBC\x82\x17"
+                         "\x2C\x23\x5F\x62\x4D\x02\x1A\x58"
+                         "\xE7\xB7\x23\x6D\xE2\x20\xDA\xEF"
+                         "\xB4\xB3\x3F\xB2\x2B\x69\x98\x83"
+                         "\x95\x87\x13\x57\x60\xD7\xB5\xB1"
+                         "\xEE\x0A\x2F\x95\x36\x4C\x76\x5D"
+                         "\x5F\xD9\x19\xED\xB9\xA5\x48\xBF"
+                         "\xC8\xAB\x0F\x71\xCC\x61\x8E\x0A"
+                         "\xD0\x29\x44\xA8\xB9\xC1\xE8\xC8"
+                         "\xC9\xA8\x28\x81\xFB\x50\xF2\xF0"
+                         "\x26\xAE\x39\xB8\x91\xCD\xA8\xAC"
+                         "\xDE\x55\x1B\x50\x14\x53\x44\x17"
+                         "\x54\x46\xFC\xB1\xE4\x07\x6B\x9A"
+                         "\x01\x14\xF0\x2E\x2E\xDB\x46\x1B"
+                         "\x1A\x09\x97\xA9\xB6\x97\x79\x06"
+                         "\xFB\xCB\x85\xCF\xDD\xA1\x41\xB1"
+                         "\x00\xAA\xF7\xE0\x89\x73\xFB\xE5"
+                         "\xBF\x84\xDB\xC9\xCD\xC4\xA2\x0D"
+                         "\x3B\xAC\xF9\xDF\x96\xBF\x88\x23"
+                         "\x41\x67\xA1\x24\x99\x7E\xCC\x9B"
+                         "\x02\x8F\x6A\x49\xF6\x25\xBA\x7A"
+                         "\xF4\x78\xFD\x79\x62\x63\x4F\x14"
+                         "\xD6\x11\x11\x04\x05\x5F\x7E\xEA"
+                         "\x4C\xB6\xF8\xF4\x5F\x48\x52\x54"
+                         "\x94\x63\xA8\x4E\xCF\xD2\x1B\x1B"
+                         "\x22\x18\x6A\xAF\x6E\x3E\xE1\x0D",
+               .ilen   = 496,
+               .result = "\x56\xED\x84\x1B\x8F\x26\xBD\x31"
+                         "\xC8\x5F\xF6\x6A\x01\x98\x0C\xA3"
+                         "\x3A\xD1\x45\xDC\x73\x0A\x7E\x15"
+                         "\xAC\x20\xB7\x4E\xE5\x59\xF0\x87"
+                         "\x1E\x92\x29\xC0\x34\xCB\x62\xF9"
+                         "\x6D\x04\x9B\x0F\xA6\x3D\xD4\x48"
+                         "\xDF\x76\x0D\x81\x18\xAF\x23\xBA"
+                         "\x51\xE8\x5C\xF3\x8A\x21\x95\x2C"
+                         "\xC3\x37\xCE\x65\xFC\x70\x07\x9E"
+                         "\x12\xA9\x40\xD7\x4B\xE2\x79\x10"
+                         "\x84\x1B\xB2\x26\xBD\x54\xEB\x5F"
+                         "\xF6\x8D\x01\x98\x2F\xC6\x3A\xD1"
+                         "\x68\xFF\x73\x0A\xA1\x15\xAC\x43"
+                         "\xDA\x4E\xE5\x7C\x13\x87\x1E\xB5"
+                         "\x29\xC0\x57\xEE\x62\xF9\x90\x04"
+                         "\x9B\x32\xC9\x3D\xD4\x6B\x02\x76"
+                         "\x0D\xA4\x18\xAF\x46\xDD\x51\xE8"
+                         "\x7F\x16\x8A\x21\xB8\x2C\xC3\x5A"
+                         "\xF1\x65\xFC\x93\x07\x9E\x35\xCC"
+                         "\x40\xD7\x6E\x05\x79\x10\xA7\x1B"
+                         "\xB2\x49\xE0\x54\xEB\x82\x19\x8D"
+                         "\x24\xBB\x2F\xC6\x5D\xF4\x68\xFF"
+                         "\x96\x0A\xA1\x38\xCF\x43\xDA\x71"
+                         "\x08\x7C\x13\xAA\x1E\xB5\x4C\xE3"
+                         "\x57\xEE\x85\x1C\x90\x27\xBE\x32"
+                         "\xC9\x60\xF7\x6B\x02\x99\x0D\xA4"
+                         "\x3B\xD2\x46\xDD\x74\x0B\x7F\x16"
+                         "\xAD\x21\xB8\x4F\xE6\x5A\xF1\x88"
+                         "\x1F\x93\x2A\xC1\x35\xCC\x63\xFA"
+                         "\x6E\x05\x9C\x10\xA7\x3E\xD5\x49"
+                         "\xE0\x77\x0E\x82\x19\xB0\x24\xBB"
+                         "\x52\xE9\x5D\xF4\x8B\x22\x96\x2D"
+                         "\xC4\x38\xCF\x66\xFD\x71\x08\x9F"
+                         "\x13\xAA\x41\xD8\x4C\xE3\x7A\x11"
+                         "\x85\x1C\xB3\x27\xBE\x55\xEC\x60"
+                         "\xF7\x8E\x02\x99\x30\xC7\x3B\xD2"
+                         "\x69\x00\x74\x0B\xA2\x16\xAD\x44"
+                         "\xDB\x4F\xE6\x7D\x14\x88\x1F\xB6"
+                         "\x2A\xC1\x58\xEF\x63\xFA\x91\x05"
+                         "\x9C\x33\xCA\x3E\xD5\x6C\x03\x77"
+                         "\x0E\xA5\x19\xB0\x47\xDE\x52\xE9"
+                         "\x80\x17\x8B\x22\xB9\x2D\xC4\x5B"
+                         "\xF2\x66\xFD\x94\x08\x9F\x36\xCD"
+                         "\x41\xD8\x6F\x06\x7A\x11\xA8\x1C"
+                         "\xB3\x4A\xE1\x55\xEC\x83\x1A\x8E"
+                         "\x25\xBC\x30\xC7\x5E\xF5\x69\x00"
+                         "\x97\x0B\xA2\x39\xD0\x44\xDB\x72"
+                         "\x09\x7D\x14\xAB\x1F\xB6\x4D\xE4"
+                         "\x58\xEF\x86\x1D\x91\x28\xBF\x33"
+                         "\xCA\x61\xF8\x6C\x03\x9A\x0E\xA5"
+                         "\x3C\xD3\x47\xDE\x75\x0C\x80\x17"
+                         "\xAE\x22\xB9\x50\xE7\x5B\xF2\x89"
+                         "\x20\x94\x2B\xC2\x36\xCD\x64\xFB"
+                         "\x6F\x06\x9D\x11\xA8\x3F\xD6\x4A"
+                         "\xE1\x78\x0F\x83\x1A\xB1\x25\xBC"
+                         "\x53\xEA\x5E\xF5\x8C\x00\x97\x2E"
+                         "\xC5\x39\xD0\x67\xFE\x72\x09\xA0"
+                         "\x14\xAB\x42\xD9\x4D\xE4\x7B\x12"
+                         "\x86\x1D\xB4\x28\xBF\x56\xED\x61"
+                         "\xF8\x8F\x03\x9A\x31\xC8\x3C\xD3"
+                         "\x6A\x01\x75\x0C\xA3\x17\xAE\x45"
+                         "\xDC\x50\xE7\x7E\x15\x89\x20\xB7",
+               .rlen   = 496,
+       }, { /* Generated with Crypto++ */
+               .key    = "\x85\x62\x3F\x1C\xF9\xD6\x1C\xF9"
+                         "\xD6\xB3\x90\x6D\x4A\x90\x6D\x4A"
+                         "\x27\x04\xE1\x27\x04\xE1\xBE\x9B"
+                         "\x78\xBE\x9B\x78\x55\x32\x0F\x55",
+               .klen   = 32,
+               .iv     = "\xE2\x24\x89\xEE\x53\xB8\x1D\x5F"
+                         "\xC4\x29\x8E\xF3\x35\x9A\xFF\x64",
+               .input  = "\xDF\xDD\x69\xFA\xB0\x2E\xFD\xFE"
+                         "\x70\x9E\xC5\x4B\xC9\xD4\xA1\x30"
+                         "\x26\x9B\x89\xA1\xEE\x43\xE0\x52"
+                         "\x55\x17\x4E\xC7\x0E\x33\x1F\xF1"
+                         "\x9F\x8D\x40\x9F\x24\xFD\x92\xA0"
+                         "\xBC\x8F\x35\xDD\x67\x38\xD8\xAA"
+                         "\xCF\xF8\x48\xCA\xFB\xE4\x5C\x60"
+                         "\x01\x41\x21\x12\x38\xAB\x52\x4F"
+                         "\xA8\x57\x20\xE0\x21\x6A\x17\x0D"
+                         "\x0E\xF9\x8E\x49\x42\x00\x3C\x94"
+                         "\x14\xC0\xD0\x8D\x8A\x98\xEB\x29"
+                         "\xEC\xAE\x96\x44\xC0\x3C\x48\xDC"
+                         "\x29\x35\x25\x2F\xE7\x11\x6C\x68"
+                         "\xC8\x67\x0A\x2F\xF4\x07\xBE\xF9"
+                         "\x2C\x31\x87\x40\xAB\xB2\xB6\xFA"
+                         "\xD2\xC9\x6D\x5C\x50\xE9\xE6\x7E"
+                         "\xE3\x0A\xD2\xD5\x6D\x8D\x64\x9E"
+                         "\x70\xCE\x03\x76\xDD\xE0\xF0\x8C"
+                         "\x84\x86\x8B\x6A\xFE\xC7\xF9\x69"
+                         "\x2E\xFE\xFC\xC2\xC4\x1A\x55\x58"
+                         "\xB3\xBE\xE2\x7E\xED\x39\x42\x6C"
+                         "\xB4\x42\x97\x9A\xEC\xE1\x0A\x06"
+                         "\x02\xC5\x03\x9D\xC4\x48\x15\x66"
+                         "\x35\x6A\xC2\xC9\xA2\x26\x30\xBB"
+                         "\xDB\x2D\xC8\x08\x2B\xA0\x29\x1A"
+                         "\x23\x61\x48\xEA\x80\x04\x27\xAA"
+                         "\x69\x49\xE8\xE8\x4A\x83\x6B\x5A"
+                         "\xCA\x7C\xD3\xB1\xB5\x0B\xCC\x23"
+                         "\x74\x1F\xA9\x87\xCD\xED\xC0\x2D"
+                         "\xBF\xEB\xCF\x16\x2D\x2A\x2E\x1D"
+                         "\x96\xBA\x36\x11\x45\x41\xDA\xCE"
+                         "\xA4\x48\x80\x8B\x06\xF4\x98\x89"
+                         "\x8B\x23\x08\x53\xF4\xD4\x5A\x24"
+                         "\x8B\xF8\x43\x73\xD1\xEE\xC4\xB0"
+                         "\xF8\xFE\x09\x0C\x75\x05\x38\x0B"
+                         "\x7C\x81\xDE\x9D\xE4\x61\x37\x63"
+                         "\x63\xAD\x12\xD2\x04\xB9\xCE\x45"
                          "\x5A\x1A\x6E\xB3\x78\x2A\xA4\x74"
                          "\x86\xD0\xE3\xFF\xDA\x38\x9C\xB5"
                          "\xB8\xB1\xDB\x38\x2F\xC5\x6A\xB4"
@@ -3957,6 +4529,9 @@ static struct cipher_testvec tf_ctr_dec_tv_template[] = {
                          "\xDC\x50\xE7\x7E\x15\x89\x20\xB7"
                          "\x2B\xC2\x59",
                .rlen   = 499,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 499 - 16, 16 },
        },
 };
 
@@ -4206,6 +4781,9 @@ static struct cipher_testvec tf_lrw_enc_tv_template[] = {
                          "\x80\x18\xc4\x6c\x03\xd3\xb7\xba"
                          "\x11\xd7\xb8\x6e\xea\xe1\x80\x30",
                .rlen   = 512,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 512 - 16, 16 },
        },
 };
 
@@ -4456,6 +5034,9 @@ static struct cipher_testvec tf_lrw_dec_tv_template[] = {
                          "\xe9\x2e\xc4\x29\x0f\x84\xdb\xc4"
                          "\x21\xc4\xc2\x75\x67\x89\x37\x0a",
                .rlen   = 512,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 512 - 16, 16 },
        },
 };
 
@@ -4795,6 +5376,9 @@ static struct cipher_testvec tf_xts_enc_tv_template[] = {
                          "\xa4\x05\x0b\xb2\xb3\xa8\x30\x97"
                          "\x37\x30\xe1\x91\x8d\xb3\x2a\xff",
                .rlen   = 512,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 512 - 16, 16 },
        },
 };
 
@@ -5135,6 +5719,9 @@ static struct cipher_testvec tf_xts_dec_tv_template[] = {
                          "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7"
                          "\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff",
                .rlen   = 512,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 512 - 16, 16 },
        },
 };
 
@@ -5242,6 +5829,9 @@ static struct cipher_testvec serpent_enc_tv_template[] = {
                          "\x30\xD4\x2C\xF2\x8E\x06\x4B\x39"
                          "\xB3\x12\x1D\xB3\x17\x46\xE6\xD6",
                .rlen   = 144,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 144 - 16, 16 },
        },
 };
 
@@ -5377,6 +5967,9 @@ static struct cipher_testvec serpent_dec_tv_template[] = {
                          "\x0D\xA4\x18\xAF\x46\xDD\x51\xE8"
                          "\x7F\x16\x8A\x21\xB8\x2C\xC3\x5A",
                .rlen   = 144,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 144 - 16, 16 },
        },
 };
 
@@ -5468,6 +6061,9 @@ static struct cipher_testvec serpent_cbc_enc_tv_template[] = {
                          "\x27\xDF\x89\x1D\x86\x3E\xF7\x5A"
                          "\xF6\xE3\x0F\xC7\x6B\x4C\x96\x7C",
                .rlen   = 144,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 144 - 16, 16 },
        },
 };
 
@@ -5518,6 +6114,9 @@ static struct cipher_testvec serpent_cbc_dec_tv_template[] = {
                          "\x0D\xA4\x18\xAF\x46\xDD\x51\xE8"
                          "\x7F\x16\x8A\x21\xB8\x2C\xC3\x5A",
                .rlen   = 144,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 144 - 16, 16 },
        },
 };
 
@@ -5616,6 +6215,143 @@ static struct cipher_testvec serpent_ctr_enc_tv_template[] = {
                          "\x5D\xE1\x4F\xA1\xEA\xB3\xCA\xB9"
                          "\xE6\xD0\x97",
                .rlen   = 147,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 147 - 16, 16 },
+       }, { /* Generated with Crypto++ */
+               .key    = "\x85\x62\x3F\x1C\xF9\xD6\x1C\xF9"
+                         "\xD6\xB3\x90\x6D\x4A\x90\x6D\x4A"
+                         "\x27\x04\xE1\x27\x04\xE1\xBE\x9B"
+                         "\x78\xBE\x9B\x78\x55\x32\x0F\x55",
+               .klen   = 32,
+               .iv     = "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+                         "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFD",
+               .input  = "\x56\xED\x84\x1B\x8F\x26\xBD\x31"
+                         "\xC8\x5F\xF6\x6A\x01\x98\x0C\xA3"
+                         "\x3A\xD1\x45\xDC\x73\x0A\x7E\x15"
+                         "\xAC\x20\xB7\x4E\xE5\x59\xF0\x87"
+                         "\x1E\x92\x29\xC0\x34\xCB\x62\xF9"
+                         "\x6D\x04\x9B\x0F\xA6\x3D\xD4\x48"
+                         "\xDF\x76\x0D\x81\x18\xAF\x23\xBA"
+                         "\x51\xE8\x5C\xF3\x8A\x21\x95\x2C"
+                         "\xC3\x37\xCE\x65\xFC\x70\x07\x9E"
+                         "\x12\xA9\x40\xD7\x4B\xE2\x79\x10"
+                         "\x84\x1B\xB2\x26\xBD\x54\xEB\x5F"
+                         "\xF6\x8D\x01\x98\x2F\xC6\x3A\xD1"
+                         "\x68\xFF\x73\x0A\xA1\x15\xAC\x43"
+                         "\xDA\x4E\xE5\x7C\x13\x87\x1E\xB5"
+                         "\x29\xC0\x57\xEE\x62\xF9\x90\x04"
+                         "\x9B\x32\xC9\x3D\xD4\x6B\x02\x76"
+                         "\x0D\xA4\x18\xAF\x46\xDD\x51\xE8"
+                         "\x7F\x16\x8A\x21\xB8\x2C\xC3\x5A"
+                         "\xF1\x65\xFC\x93\x07\x9E\x35\xCC"
+                         "\x40\xD7\x6E\x05\x79\x10\xA7\x1B"
+                         "\xB2\x49\xE0\x54\xEB\x82\x19\x8D"
+                         "\x24\xBB\x2F\xC6\x5D\xF4\x68\xFF"
+                         "\x96\x0A\xA1\x38\xCF\x43\xDA\x71"
+                         "\x08\x7C\x13\xAA\x1E\xB5\x4C\xE3"
+                         "\x57\xEE\x85\x1C\x90\x27\xBE\x32"
+                         "\xC9\x60\xF7\x6B\x02\x99\x0D\xA4"
+                         "\x3B\xD2\x46\xDD\x74\x0B\x7F\x16"
+                         "\xAD\x21\xB8\x4F\xE6\x5A\xF1\x88"
+                         "\x1F\x93\x2A\xC1\x35\xCC\x63\xFA"
+                         "\x6E\x05\x9C\x10\xA7\x3E\xD5\x49"
+                         "\xE0\x77\x0E\x82\x19\xB0\x24\xBB"
+                         "\x52\xE9\x5D\xF4\x8B\x22\x96\x2D"
+                         "\xC4\x38\xCF\x66\xFD\x71\x08\x9F"
+                         "\x13\xAA\x41\xD8\x4C\xE3\x7A\x11"
+                         "\x85\x1C\xB3\x27\xBE\x55\xEC\x60"
+                         "\xF7\x8E\x02\x99\x30\xC7\x3B\xD2"
+                         "\x69\x00\x74\x0B\xA2\x16\xAD\x44"
+                         "\xDB\x4F\xE6\x7D\x14\x88\x1F\xB6"
+                         "\x2A\xC1\x58\xEF\x63\xFA\x91\x05"
+                         "\x9C\x33\xCA\x3E\xD5\x6C\x03\x77"
+                         "\x0E\xA5\x19\xB0\x47\xDE\x52\xE9"
+                         "\x80\x17\x8B\x22\xB9\x2D\xC4\x5B"
+                         "\xF2\x66\xFD\x94\x08\x9F\x36\xCD"
+                         "\x41\xD8\x6F\x06\x7A\x11\xA8\x1C"
+                         "\xB3\x4A\xE1\x55\xEC\x83\x1A\x8E"
+                         "\x25\xBC\x30\xC7\x5E\xF5\x69\x00"
+                         "\x97\x0B\xA2\x39\xD0\x44\xDB\x72"
+                         "\x09\x7D\x14\xAB\x1F\xB6\x4D\xE4"
+                         "\x58\xEF\x86\x1D\x91\x28\xBF\x33"
+                         "\xCA\x61\xF8\x6C\x03\x9A\x0E\xA5"
+                         "\x3C\xD3\x47\xDE\x75\x0C\x80\x17"
+                         "\xAE\x22\xB9\x50\xE7\x5B\xF2\x89"
+                         "\x20\x94\x2B\xC2\x36\xCD\x64\xFB"
+                         "\x6F\x06\x9D\x11\xA8\x3F\xD6\x4A"
+                         "\xE1\x78\x0F\x83\x1A\xB1\x25\xBC"
+                         "\x53\xEA\x5E\xF5\x8C\x00\x97\x2E"
+                         "\xC5\x39\xD0\x67\xFE\x72\x09\xA0"
+                         "\x14\xAB\x42\xD9\x4D\xE4\x7B\x12"
+                         "\x86\x1D\xB4\x28\xBF\x56\xED\x61"
+                         "\xF8\x8F\x03\x9A\x31\xC8\x3C\xD3"
+                         "\x6A\x01\x75\x0C\xA3\x17\xAE\x45"
+                         "\xDC\x50\xE7\x7E\x15\x89\x20\xB7",
+               .ilen   = 496,
+               .result = "\x06\x9A\xF8\xB4\x53\x88\x62\xFC"
+                         "\x68\xB8\x2E\xDF\xC1\x05\x0F\x3D"
+                         "\xAF\x4D\x95\xAE\xC4\xE9\x1C\xDC"
+                         "\xF6\x2B\x8F\x90\x89\xF6\x7E\x1A"
+                         "\xA6\xB9\xE4\xF4\xFA\xCA\xE5\x7E"
+                         "\x71\x28\x06\x4F\xE8\x08\x39\xDA"
+                         "\xA5\x0E\xC8\xC0\xB8\x16\xE5\x69"
+                         "\xE5\xCA\xEC\x4F\x63\x2C\xC0\x9B"
+                         "\x9F\x3E\x39\x79\xF0\xCD\x64\x35"
+                         "\x4A\xD3\xC8\xA9\x31\xCD\x48\x5B"
+                         "\x92\x3D\x8F\x3F\x96\xBD\xB3\x18"
+                         "\x74\x2A\x5D\x29\x3F\x57\x8F\xE2"
+                         "\x67\x9A\xE0\xE5\xD4\x4A\xE2\x47"
+                         "\xBC\xF6\xEB\x14\xF3\x8C\x20\xC2"
+                         "\x7D\xE2\x43\x81\x86\x72\x2E\xB1"
+                         "\x39\xF6\x95\xE1\x1F\xCB\x76\x33"
+                         "\x5B\x7D\x23\x0F\x3A\x67\x2A\x2F"
+                         "\xB9\x37\x9D\xDD\x1F\x16\xA1\x3C"
+                         "\x70\xFE\x52\xAA\x93\x3C\xC4\x46"
+                         "\xB1\xE5\xFF\xDA\xAF\xE2\x84\xFE"
+                         "\x25\x92\xB2\x63\xBD\x49\x77\xB4"
+                         "\x22\xA4\x6A\xD5\x04\xE0\x45\x58"
+                         "\x1C\x34\x96\x7C\x03\x0C\x13\xA2"
+                         "\x05\x22\xE2\xCB\x5A\x35\x03\x09"
+                         "\x40\xD2\x82\x05\xCA\x58\x73\xF2"
+                         "\x29\x5E\x01\x47\x13\x32\x78\xBE"
+                         "\x06\xB0\x51\xDB\x6C\x31\xA0\x1C"
+                         "\x74\xBC\x8D\x25\xDF\xF8\x65\xD1"
+                         "\x38\x35\x11\x26\x4A\xB4\x06\x32"
+                         "\xFA\xD2\x07\x77\xB3\x74\x98\x80"
+                         "\x61\x59\xA8\x9F\xF3\x6F\x2A\xBF"
+                         "\xE6\xA5\x9A\xC4\x6B\xA6\x49\x6F"
+                         "\xBC\x47\xD9\xFB\xC6\xEF\x25\x65"
+                         "\x96\xAC\x9F\xE4\x81\x4B\xD8\xBA"
+                         "\xD6\x9B\xC9\x6D\x58\x40\x81\x02"
+                         "\x73\x44\x4E\x43\x6E\x37\xBB\x11"
+                         "\xE3\xF9\xB8\x2F\xEC\x76\x34\xEA"
+                         "\x90\xCD\xB7\x2E\x0E\x32\x71\xE8"
+                         "\xBB\x4E\x0B\x98\xA4\x17\x17\x5B"
+                         "\x07\xB5\x82\x3A\xC4\xE8\x42\x51"
+                         "\x5A\x4C\x4E\x7D\xBF\xC4\xC0\x4F"
+                         "\x68\xB8\xC6\x4A\x32\x6F\x0B\xD7"
+                         "\x85\xED\x6B\xFB\x72\xD2\xA5\x8F"
+                         "\xBF\xF9\xAC\x59\x50\xA8\x08\x70"
+                         "\xEC\xBD\x0A\xBF\xE5\x87\xA1\xC2"
+                         "\x92\x14\x78\xAF\xE8\xEA\x2E\xDD"
+                         "\xC1\x03\x9A\xAA\x89\x8B\x32\x46"
+                         "\x5B\x18\x27\xBA\x46\xAA\x64\xDE"
+                         "\xE3\xD5\xA3\xFC\x7B\x5B\x61\xDB"
+                         "\x7E\xDA\xEC\x30\x17\x19\xF8\x80"
+                         "\xB5\x5E\x27\xB5\x37\x3A\x1F\x28"
+                         "\x07\x73\xC3\x63\xCE\xFF\x8C\xFE"
+                         "\x81\x4E\xF8\x24\xF3\xB8\xC7\xE8"
+                         "\x16\x9A\xCC\x58\x2F\x88\x1C\x4B"
+                         "\xBB\x33\xA2\x73\xF0\x1C\x89\x0E"
+                         "\xDC\x34\x27\x89\x98\xCE\x1C\xA2"
+                         "\xD8\xB8\x90\xBE\xEC\x72\x28\x13"
+                         "\xAC\x7B\xF1\xD0\x7F\x7A\x28\x50"
+                         "\xB7\x99\x65\x8A\xC9\xC6\x21\x34"
+                         "\x7F\x67\x9D\xB7\x2C\xCC\xF5\x17"
+                         "\x2B\x89\xAC\xB0\xD7\x1E\x47\xB0"
+                         "\x61\xAF\xD4\x63\x6D\xB8\x2D\x20",
+               .rlen   = 496,
        },
 };
 
@@ -5714,68 +6450,205 @@ static struct cipher_testvec serpent_ctr_dec_tv_template[] = {
                          "\x7F\x16\x8A\x21\xB8\x2C\xC3\x5A"
                          "\xF1\x65\xFC",
                .rlen   = 147,
-       },
-};
-
-static struct cipher_testvec serpent_lrw_enc_tv_template[] = {
-       /* Generated from AES-LRW test vectors */
-       {
-               .key    = "\x45\x62\xac\x25\xf8\x28\x17\x6d"
-                         "\x4c\x26\x84\x14\xb5\x68\x01\x85"
-                         "\x25\x8e\x2a\x05\xe7\x3e\x9d\x03"
-                         "\xee\x5a\x83\x0c\xcc\x09\x4c\x87",
-               .klen   = 32,
-               .iv     = "\x00\x00\x00\x00\x00\x00\x00\x00"
-                         "\x00\x00\x00\x00\x00\x00\x00\x01",
-               .input  = "\x30\x31\x32\x33\x34\x35\x36\x37"
-                         "\x38\x39\x41\x42\x43\x44\x45\x46",
-               .ilen   = 16,
-               .result = "\x6f\xbf\xd4\xa4\x5d\x71\x16\x79"
-                         "\x63\x9c\xa6\x8e\x40\xbe\x0d\x8a",
-               .rlen   = 16,
-       }, {
-               .key    = "\x59\x70\x47\x14\xf5\x57\x47\x8c"
-                         "\xd7\x79\xe8\x0f\x54\x88\x79\x44"
-                         "\x0d\x48\xf0\xb7\xb1\x5a\x53\xea"
-                         "\x1c\xaa\x6b\x29\xc2\xca\xfb\xaf",
-               .klen   = 32,
-               .iv     = "\x00\x00\x00\x00\x00\x00\x00\x00"
-                         "\x00\x00\x00\x00\x00\x00\x00\x02",
-               .input  = "\x30\x31\x32\x33\x34\x35\x36\x37"
-                         "\x38\x39\x41\x42\x43\x44\x45\x46",
-               .ilen   = 16,
-               .result = "\xfd\xb2\x66\x98\x80\x96\x55\xad"
-                         "\x08\x94\x54\x9c\x21\x7c\x69\xe3",
-               .rlen   = 16,
-       }, {
-               .key    = "\xd8\x2a\x91\x34\xb2\x6a\x56\x50"
-                         "\x30\xfe\x69\xe2\x37\x7f\x98\x47"
-                         "\xcd\xf9\x0b\x16\x0c\x64\x8f\xb6"
-                         "\xb0\x0d\x0d\x1b\xae\x85\x87\x1f",
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 147 - 16, 16 },
+       }, { /* Generated with Crypto++ */
+               .key    = "\x85\x62\x3F\x1C\xF9\xD6\x1C\xF9"
+                         "\xD6\xB3\x90\x6D\x4A\x90\x6D\x4A"
+                         "\x27\x04\xE1\x27\x04\xE1\xBE\x9B"
+                         "\x78\xBE\x9B\x78\x55\x32\x0F\x55",
                .klen   = 32,
-               .iv     = "\x00\x00\x00\x00\x00\x00\x00\x00"
-                         "\x00\x00\x00\x02\x00\x00\x00\x00",
-               .input  = "\x30\x31\x32\x33\x34\x35\x36\x37"
-                         "\x38\x39\x41\x42\x43\x44\x45\x46",
-               .ilen   = 16,
-               .result = "\x14\x5e\x3d\x70\xc0\x6e\x9c\x34"
-                         "\x5b\x5e\xcf\x0f\xe4\x8c\x21\x5c",
-               .rlen   = 16,
-       }, {
-               .key    = "\x0f\x6a\xef\xf8\xd3\xd2\xbb\x15"
-                         "\x25\x83\xf7\x3c\x1f\x01\x28\x74"
-                         "\xca\xc6\xbc\x35\x4d\x4a\x65\x54"
-                         "\x90\xae\x61\xcf\x7b\xae\xbd\xcc"
-                         "\xad\xe4\x94\xc5\x4a\x29\xae\x70",
-               .klen   = 40,
-               .iv     = "\x00\x00\x00\x00\x00\x00\x00\x00"
-                         "\x00\x00\x00\x00\x00\x00\x00\x01",
-               .input  = "\x30\x31\x32\x33\x34\x35\x36\x37"
-                         "\x38\x39\x41\x42\x43\x44\x45\x46",
-               .ilen   = 16,
-               .result = "\x25\x39\xaa\xa5\xf0\x65\xc8\xdc"
-                         "\x5d\x45\x95\x30\x8f\xff\x2f\x1b",
-               .rlen   = 16,
+               .iv     = "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+                         "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFD",
+               .input  = "\x06\x9A\xF8\xB4\x53\x88\x62\xFC"
+                         "\x68\xB8\x2E\xDF\xC1\x05\x0F\x3D"
+                         "\xAF\x4D\x95\xAE\xC4\xE9\x1C\xDC"
+                         "\xF6\x2B\x8F\x90\x89\xF6\x7E\x1A"
+                         "\xA6\xB9\xE4\xF4\xFA\xCA\xE5\x7E"
+                         "\x71\x28\x06\x4F\xE8\x08\x39\xDA"
+                         "\xA5\x0E\xC8\xC0\xB8\x16\xE5\x69"
+                         "\xE5\xCA\xEC\x4F\x63\x2C\xC0\x9B"
+                         "\x9F\x3E\x39\x79\xF0\xCD\x64\x35"
+                         "\x4A\xD3\xC8\xA9\x31\xCD\x48\x5B"
+                         "\x92\x3D\x8F\x3F\x96\xBD\xB3\x18"
+                         "\x74\x2A\x5D\x29\x3F\x57\x8F\xE2"
+                         "\x67\x9A\xE0\xE5\xD4\x4A\xE2\x47"
+                         "\xBC\xF6\xEB\x14\xF3\x8C\x20\xC2"
+                         "\x7D\xE2\x43\x81\x86\x72\x2E\xB1"
+                         "\x39\xF6\x95\xE1\x1F\xCB\x76\x33"
+                         "\x5B\x7D\x23\x0F\x3A\x67\x2A\x2F"
+                         "\xB9\x37\x9D\xDD\x1F\x16\xA1\x3C"
+                         "\x70\xFE\x52\xAA\x93\x3C\xC4\x46"
+                         "\xB1\xE5\xFF\xDA\xAF\xE2\x84\xFE"
+                         "\x25\x92\xB2\x63\xBD\x49\x77\xB4"
+                         "\x22\xA4\x6A\xD5\x04\xE0\x45\x58"
+                         "\x1C\x34\x96\x7C\x03\x0C\x13\xA2"
+                         "\x05\x22\xE2\xCB\x5A\x35\x03\x09"
+                         "\x40\xD2\x82\x05\xCA\x58\x73\xF2"
+                         "\x29\x5E\x01\x47\x13\x32\x78\xBE"
+                         "\x06\xB0\x51\xDB\x6C\x31\xA0\x1C"
+                         "\x74\xBC\x8D\x25\xDF\xF8\x65\xD1"
+                         "\x38\x35\x11\x26\x4A\xB4\x06\x32"
+                         "\xFA\xD2\x07\x77\xB3\x74\x98\x80"
+                         "\x61\x59\xA8\x9F\xF3\x6F\x2A\xBF"
+                         "\xE6\xA5\x9A\xC4\x6B\xA6\x49\x6F"
+                         "\xBC\x47\xD9\xFB\xC6\xEF\x25\x65"
+                         "\x96\xAC\x9F\xE4\x81\x4B\xD8\xBA"
+                         "\xD6\x9B\xC9\x6D\x58\x40\x81\x02"
+                         "\x73\x44\x4E\x43\x6E\x37\xBB\x11"
+                         "\xE3\xF9\xB8\x2F\xEC\x76\x34\xEA"
+                         "\x90\xCD\xB7\x2E\x0E\x32\x71\xE8"
+                         "\xBB\x4E\x0B\x98\xA4\x17\x17\x5B"
+                         "\x07\xB5\x82\x3A\xC4\xE8\x42\x51"
+                         "\x5A\x4C\x4E\x7D\xBF\xC4\xC0\x4F"
+                         "\x68\xB8\xC6\x4A\x32\x6F\x0B\xD7"
+                         "\x85\xED\x6B\xFB\x72\xD2\xA5\x8F"
+                         "\xBF\xF9\xAC\x59\x50\xA8\x08\x70"
+                         "\xEC\xBD\x0A\xBF\xE5\x87\xA1\xC2"
+                         "\x92\x14\x78\xAF\xE8\xEA\x2E\xDD"
+                         "\xC1\x03\x9A\xAA\x89\x8B\x32\x46"
+                         "\x5B\x18\x27\xBA\x46\xAA\x64\xDE"
+                         "\xE3\xD5\xA3\xFC\x7B\x5B\x61\xDB"
+                         "\x7E\xDA\xEC\x30\x17\x19\xF8\x80"
+                         "\xB5\x5E\x27\xB5\x37\x3A\x1F\x28"
+                         "\x07\x73\xC3\x63\xCE\xFF\x8C\xFE"
+                         "\x81\x4E\xF8\x24\xF3\xB8\xC7\xE8"
+                         "\x16\x9A\xCC\x58\x2F\x88\x1C\x4B"
+                         "\xBB\x33\xA2\x73\xF0\x1C\x89\x0E"
+                         "\xDC\x34\x27\x89\x98\xCE\x1C\xA2"
+                         "\xD8\xB8\x90\xBE\xEC\x72\x28\x13"
+                         "\xAC\x7B\xF1\xD0\x7F\x7A\x28\x50"
+                         "\xB7\x99\x65\x8A\xC9\xC6\x21\x34"
+                         "\x7F\x67\x9D\xB7\x2C\xCC\xF5\x17"
+                         "\x2B\x89\xAC\xB0\xD7\x1E\x47\xB0"
+                         "\x61\xAF\xD4\x63\x6D\xB8\x2D\x20",
+               .ilen   = 496,
+               .result = "\x56\xED\x84\x1B\x8F\x26\xBD\x31"
+                         "\xC8\x5F\xF6\x6A\x01\x98\x0C\xA3"
+                         "\x3A\xD1\x45\xDC\x73\x0A\x7E\x15"
+                         "\xAC\x20\xB7\x4E\xE5\x59\xF0\x87"
+                         "\x1E\x92\x29\xC0\x34\xCB\x62\xF9"
+                         "\x6D\x04\x9B\x0F\xA6\x3D\xD4\x48"
+                         "\xDF\x76\x0D\x81\x18\xAF\x23\xBA"
+                         "\x51\xE8\x5C\xF3\x8A\x21\x95\x2C"
+                         "\xC3\x37\xCE\x65\xFC\x70\x07\x9E"
+                         "\x12\xA9\x40\xD7\x4B\xE2\x79\x10"
+                         "\x84\x1B\xB2\x26\xBD\x54\xEB\x5F"
+                         "\xF6\x8D\x01\x98\x2F\xC6\x3A\xD1"
+                         "\x68\xFF\x73\x0A\xA1\x15\xAC\x43"
+                         "\xDA\x4E\xE5\x7C\x13\x87\x1E\xB5"
+                         "\x29\xC0\x57\xEE\x62\xF9\x90\x04"
+                         "\x9B\x32\xC9\x3D\xD4\x6B\x02\x76"
+                         "\x0D\xA4\x18\xAF\x46\xDD\x51\xE8"
+                         "\x7F\x16\x8A\x21\xB8\x2C\xC3\x5A"
+                         "\xF1\x65\xFC\x93\x07\x9E\x35\xCC"
+                         "\x40\xD7\x6E\x05\x79\x10\xA7\x1B"
+                         "\xB2\x49\xE0\x54\xEB\x82\x19\x8D"
+                         "\x24\xBB\x2F\xC6\x5D\xF4\x68\xFF"
+                         "\x96\x0A\xA1\x38\xCF\x43\xDA\x71"
+                         "\x08\x7C\x13\xAA\x1E\xB5\x4C\xE3"
+                         "\x57\xEE\x85\x1C\x90\x27\xBE\x32"
+                         "\xC9\x60\xF7\x6B\x02\x99\x0D\xA4"
+                         "\x3B\xD2\x46\xDD\x74\x0B\x7F\x16"
+                         "\xAD\x21\xB8\x4F\xE6\x5A\xF1\x88"
+                         "\x1F\x93\x2A\xC1\x35\xCC\x63\xFA"
+                         "\x6E\x05\x9C\x10\xA7\x3E\xD5\x49"
+                         "\xE0\x77\x0E\x82\x19\xB0\x24\xBB"
+                         "\x52\xE9\x5D\xF4\x8B\x22\x96\x2D"
+                         "\xC4\x38\xCF\x66\xFD\x71\x08\x9F"
+                         "\x13\xAA\x41\xD8\x4C\xE3\x7A\x11"
+                         "\x85\x1C\xB3\x27\xBE\x55\xEC\x60"
+                         "\xF7\x8E\x02\x99\x30\xC7\x3B\xD2"
+                         "\x69\x00\x74\x0B\xA2\x16\xAD\x44"
+                         "\xDB\x4F\xE6\x7D\x14\x88\x1F\xB6"
+                         "\x2A\xC1\x58\xEF\x63\xFA\x91\x05"
+                         "\x9C\x33\xCA\x3E\xD5\x6C\x03\x77"
+                         "\x0E\xA5\x19\xB0\x47\xDE\x52\xE9"
+                         "\x80\x17\x8B\x22\xB9\x2D\xC4\x5B"
+                         "\xF2\x66\xFD\x94\x08\x9F\x36\xCD"
+                         "\x41\xD8\x6F\x06\x7A\x11\xA8\x1C"
+                         "\xB3\x4A\xE1\x55\xEC\x83\x1A\x8E"
+                         "\x25\xBC\x30\xC7\x5E\xF5\x69\x00"
+                         "\x97\x0B\xA2\x39\xD0\x44\xDB\x72"
+                         "\x09\x7D\x14\xAB\x1F\xB6\x4D\xE4"
+                         "\x58\xEF\x86\x1D\x91\x28\xBF\x33"
+                         "\xCA\x61\xF8\x6C\x03\x9A\x0E\xA5"
+                         "\x3C\xD3\x47\xDE\x75\x0C\x80\x17"
+                         "\xAE\x22\xB9\x50\xE7\x5B\xF2\x89"
+                         "\x20\x94\x2B\xC2\x36\xCD\x64\xFB"
+                         "\x6F\x06\x9D\x11\xA8\x3F\xD6\x4A"
+                         "\xE1\x78\x0F\x83\x1A\xB1\x25\xBC"
+                         "\x53\xEA\x5E\xF5\x8C\x00\x97\x2E"
+                         "\xC5\x39\xD0\x67\xFE\x72\x09\xA0"
+                         "\x14\xAB\x42\xD9\x4D\xE4\x7B\x12"
+                         "\x86\x1D\xB4\x28\xBF\x56\xED\x61"
+                         "\xF8\x8F\x03\x9A\x31\xC8\x3C\xD3"
+                         "\x6A\x01\x75\x0C\xA3\x17\xAE\x45"
+                         "\xDC\x50\xE7\x7E\x15\x89\x20\xB7",
+               .rlen   = 496,
+       },
+};
+
+static struct cipher_testvec serpent_lrw_enc_tv_template[] = {
+       /* Generated from AES-LRW test vectors */
+       {
+               .key    = "\x45\x62\xac\x25\xf8\x28\x17\x6d"
+                         "\x4c\x26\x84\x14\xb5\x68\x01\x85"
+                         "\x25\x8e\x2a\x05\xe7\x3e\x9d\x03"
+                         "\xee\x5a\x83\x0c\xcc\x09\x4c\x87",
+               .klen   = 32,
+               .iv     = "\x00\x00\x00\x00\x00\x00\x00\x00"
+                         "\x00\x00\x00\x00\x00\x00\x00\x01",
+               .input  = "\x30\x31\x32\x33\x34\x35\x36\x37"
+                         "\x38\x39\x41\x42\x43\x44\x45\x46",
+               .ilen   = 16,
+               .result = "\x6f\xbf\xd4\xa4\x5d\x71\x16\x79"
+                         "\x63\x9c\xa6\x8e\x40\xbe\x0d\x8a",
+               .rlen   = 16,
+       }, {
+               .key    = "\x59\x70\x47\x14\xf5\x57\x47\x8c"
+                         "\xd7\x79\xe8\x0f\x54\x88\x79\x44"
+                         "\x0d\x48\xf0\xb7\xb1\x5a\x53\xea"
+                         "\x1c\xaa\x6b\x29\xc2\xca\xfb\xaf",
+               .klen   = 32,
+               .iv     = "\x00\x00\x00\x00\x00\x00\x00\x00"
+                         "\x00\x00\x00\x00\x00\x00\x00\x02",
+               .input  = "\x30\x31\x32\x33\x34\x35\x36\x37"
+                         "\x38\x39\x41\x42\x43\x44\x45\x46",
+               .ilen   = 16,
+               .result = "\xfd\xb2\x66\x98\x80\x96\x55\xad"
+                         "\x08\x94\x54\x9c\x21\x7c\x69\xe3",
+               .rlen   = 16,
+       }, {
+               .key    = "\xd8\x2a\x91\x34\xb2\x6a\x56\x50"
+                         "\x30\xfe\x69\xe2\x37\x7f\x98\x47"
+                         "\xcd\xf9\x0b\x16\x0c\x64\x8f\xb6"
+                         "\xb0\x0d\x0d\x1b\xae\x85\x87\x1f",
+               .klen   = 32,
+               .iv     = "\x00\x00\x00\x00\x00\x00\x00\x00"
+                         "\x00\x00\x00\x02\x00\x00\x00\x00",
+               .input  = "\x30\x31\x32\x33\x34\x35\x36\x37"
+                         "\x38\x39\x41\x42\x43\x44\x45\x46",
+               .ilen   = 16,
+               .result = "\x14\x5e\x3d\x70\xc0\x6e\x9c\x34"
+                         "\x5b\x5e\xcf\x0f\xe4\x8c\x21\x5c",
+               .rlen   = 16,
+       }, {
+               .key    = "\x0f\x6a\xef\xf8\xd3\xd2\xbb\x15"
+                         "\x25\x83\xf7\x3c\x1f\x01\x28\x74"
+                         "\xca\xc6\xbc\x35\x4d\x4a\x65\x54"
+                         "\x90\xae\x61\xcf\x7b\xae\xbd\xcc"
+                         "\xad\xe4\x94\xc5\x4a\x29\xae\x70",
+               .klen   = 40,
+               .iv     = "\x00\x00\x00\x00\x00\x00\x00\x00"
+                         "\x00\x00\x00\x00\x00\x00\x00\x01",
+               .input  = "\x30\x31\x32\x33\x34\x35\x36\x37"
+                         "\x38\x39\x41\x42\x43\x44\x45\x46",
+               .ilen   = 16,
+               .result = "\x25\x39\xaa\xa5\xf0\x65\xc8\xdc"
+                         "\x5d\x45\x95\x30\x8f\xff\x2f\x1b",
+               .rlen   = 16,
        }, {
                .key    = "\x8a\xd4\xee\x10\x2f\xbd\x81\xff"
                          "\xf8\x86\xce\xac\x93\xc5\xad\xc6"
@@ -5963,6 +6836,9 @@ static struct cipher_testvec serpent_lrw_enc_tv_template[] = {
                          "\x5c\xc6\x84\xfe\x7c\xcb\x26\xfd"
                          "\xd9\x51\x0f\xd7\x94\x2f\xc5\xa7",
                .rlen   = 512,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 512 - 16, 16 },
        },
 };
 
@@ -6213,6 +7089,9 @@ static struct cipher_testvec serpent_lrw_dec_tv_template[] = {
                          "\xe9\x2e\xc4\x29\x0f\x84\xdb\xc4"
                          "\x21\xc4\xc2\x75\x67\x89\x37\x0a",
                .rlen   = 512,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 512 - 16, 16 },
        },
 };
 
@@ -6552,6 +7431,9 @@ static struct cipher_testvec serpent_xts_enc_tv_template[] = {
                          "\xaf\x43\x0b\xc5\x20\x41\x92\x20"
                          "\xd4\xa0\x91\x98\x11\x5f\x4d\xb1",
                .rlen   = 512,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 512 - 16, 16 },
        },
 };
 
@@ -6892,12 +7774,23 @@ static struct cipher_testvec serpent_xts_dec_tv_template[] = {
                          "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7"
                          "\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff",
                .rlen   = 512,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 512 - 16, 16 },
        },
 };
 
 /* Cast6 test vectors from RFC 2612 */
-#define CAST6_ENC_TEST_VECTORS 3
-#define CAST6_DEC_TEST_VECTORS  3
+#define CAST6_ENC_TEST_VECTORS         4
+#define CAST6_DEC_TEST_VECTORS         4
+#define CAST6_CBC_ENC_TEST_VECTORS     1
+#define CAST6_CBC_DEC_TEST_VECTORS     1
+#define CAST6_CTR_ENC_TEST_VECTORS     2
+#define CAST6_CTR_DEC_TEST_VECTORS     2
+#define CAST6_LRW_ENC_TEST_VECTORS     1
+#define CAST6_LRW_DEC_TEST_VECTORS     1
+#define CAST6_XTS_ENC_TEST_VECTORS     1
+#define CAST6_XTS_DEC_TEST_VECTORS     1
 
 static struct cipher_testvec cast6_enc_tv_template[] = {
        {
@@ -6930,6 +7823,143 @@ static struct cipher_testvec cast6_enc_tv_template[] = {
                .result = "\x4f\x6a\x20\x38\x28\x68\x97\xb9"
                          "\xc9\x87\x01\x36\x55\x33\x17\xfa",
                .rlen   = 16,
+       }, { /* Generated from TF test vectors */
+               .key    = "\x85\x62\x3F\x1C\xF9\xD6\x1C\xF9"
+                         "\xD6\xB3\x90\x6D\x4A\x90\x6D\x4A"
+                         "\x27\x04\xE1\x27\x04\xE1\xBE\x9B"
+                         "\x78\xBE\x9B\x78\x55\x32\x0F\x55",
+               .klen   = 32,
+               .iv     = "\xE2\x24\x89\xEE\x53\xB8\x1D\x5F"
+                         "\xC4\x29\x8E\xF3\x35\x9A\xFF\x64",
+               .input  = "\x56\xED\x84\x1B\x8F\x26\xBD\x31"
+                         "\xC8\x5F\xF6\x6A\x01\x98\x0C\xA3"
+                         "\x3A\xD1\x45\xDC\x73\x0A\x7E\x15"
+                         "\xAC\x20\xB7\x4E\xE5\x59\xF0\x87"
+                         "\x1E\x92\x29\xC0\x34\xCB\x62\xF9"
+                         "\x6D\x04\x9B\x0F\xA6\x3D\xD4\x48"
+                         "\xDF\x76\x0D\x81\x18\xAF\x23\xBA"
+                         "\x51\xE8\x5C\xF3\x8A\x21\x95\x2C"
+                         "\xC3\x37\xCE\x65\xFC\x70\x07\x9E"
+                         "\x12\xA9\x40\xD7\x4B\xE2\x79\x10"
+                         "\x84\x1B\xB2\x26\xBD\x54\xEB\x5F"
+                         "\xF6\x8D\x01\x98\x2F\xC6\x3A\xD1"
+                         "\x68\xFF\x73\x0A\xA1\x15\xAC\x43"
+                         "\xDA\x4E\xE5\x7C\x13\x87\x1E\xB5"
+                         "\x29\xC0\x57\xEE\x62\xF9\x90\x04"
+                         "\x9B\x32\xC9\x3D\xD4\x6B\x02\x76"
+                         "\x0D\xA4\x18\xAF\x46\xDD\x51\xE8"
+                         "\x7F\x16\x8A\x21\xB8\x2C\xC3\x5A"
+                         "\xF1\x65\xFC\x93\x07\x9E\x35\xCC"
+                         "\x40\xD7\x6E\x05\x79\x10\xA7\x1B"
+                         "\xB2\x49\xE0\x54\xEB\x82\x19\x8D"
+                         "\x24\xBB\x2F\xC6\x5D\xF4\x68\xFF"
+                         "\x96\x0A\xA1\x38\xCF\x43\xDA\x71"
+                         "\x08\x7C\x13\xAA\x1E\xB5\x4C\xE3"
+                         "\x57\xEE\x85\x1C\x90\x27\xBE\x32"
+                         "\xC9\x60\xF7\x6B\x02\x99\x0D\xA4"
+                         "\x3B\xD2\x46\xDD\x74\x0B\x7F\x16"
+                         "\xAD\x21\xB8\x4F\xE6\x5A\xF1\x88"
+                         "\x1F\x93\x2A\xC1\x35\xCC\x63\xFA"
+                         "\x6E\x05\x9C\x10\xA7\x3E\xD5\x49"
+                         "\xE0\x77\x0E\x82\x19\xB0\x24\xBB"
+                         "\x52\xE9\x5D\xF4\x8B\x22\x96\x2D"
+                         "\xC4\x38\xCF\x66\xFD\x71\x08\x9F"
+                         "\x13\xAA\x41\xD8\x4C\xE3\x7A\x11"
+                         "\x85\x1C\xB3\x27\xBE\x55\xEC\x60"
+                         "\xF7\x8E\x02\x99\x30\xC7\x3B\xD2"
+                         "\x69\x00\x74\x0B\xA2\x16\xAD\x44"
+                         "\xDB\x4F\xE6\x7D\x14\x88\x1F\xB6"
+                         "\x2A\xC1\x58\xEF\x63\xFA\x91\x05"
+                         "\x9C\x33\xCA\x3E\xD5\x6C\x03\x77"
+                         "\x0E\xA5\x19\xB0\x47\xDE\x52\xE9"
+                         "\x80\x17\x8B\x22\xB9\x2D\xC4\x5B"
+                         "\xF2\x66\xFD\x94\x08\x9F\x36\xCD"
+                         "\x41\xD8\x6F\x06\x7A\x11\xA8\x1C"
+                         "\xB3\x4A\xE1\x55\xEC\x83\x1A\x8E"
+                         "\x25\xBC\x30\xC7\x5E\xF5\x69\x00"
+                         "\x97\x0B\xA2\x39\xD0\x44\xDB\x72"
+                         "\x09\x7D\x14\xAB\x1F\xB6\x4D\xE4"
+                         "\x58\xEF\x86\x1D\x91\x28\xBF\x33"
+                         "\xCA\x61\xF8\x6C\x03\x9A\x0E\xA5"
+                         "\x3C\xD3\x47\xDE\x75\x0C\x80\x17"
+                         "\xAE\x22\xB9\x50\xE7\x5B\xF2\x89"
+                         "\x20\x94\x2B\xC2\x36\xCD\x64\xFB"
+                         "\x6F\x06\x9D\x11\xA8\x3F\xD6\x4A"
+                         "\xE1\x78\x0F\x83\x1A\xB1\x25\xBC"
+                         "\x53\xEA\x5E\xF5\x8C\x00\x97\x2E"
+                         "\xC5\x39\xD0\x67\xFE\x72\x09\xA0"
+                         "\x14\xAB\x42\xD9\x4D\xE4\x7B\x12"
+                         "\x86\x1D\xB4\x28\xBF\x56\xED\x61"
+                         "\xF8\x8F\x03\x9A\x31\xC8\x3C\xD3"
+                         "\x6A\x01\x75\x0C\xA3\x17\xAE\x45"
+                         "\xDC\x50\xE7\x7E\x15\x89\x20\xB7",
+               .ilen   = 496,
+               .result = "\xC3\x70\x22\x32\xF5\x80\xCB\x54"
+                         "\xFC\x30\xE0\xF6\xEB\x39\x57\xA6"
+                         "\xB6\xB9\xC5\xA4\x91\x55\x14\x97"
+                         "\xC1\x20\xFF\x6C\x5C\xF0\x67\xEA"
+                         "\x2F\xED\xD8\xC9\xFB\x38\x3F\xFE"
+                         "\x93\xBE\xDC\x00\xD3\x7F\xAD\x4C"
+                         "\x5A\x08\x92\xD1\x47\x0C\xFA\x6C"
+                         "\xD0\x6A\x99\x10\x72\xF8\x47\x62"
+                         "\x81\x42\xF8\xD8\xF5\xBB\x94\x08"
+                         "\xAA\x97\xA2\x8B\x69\xB3\xD2\x7E"
+                         "\xBC\xB5\x00\x0C\xE5\x44\x4B\x58"
+                         "\xE8\x63\xDC\xB3\xC4\xE5\x23\x12"
+                         "\x5A\x72\x85\x47\x8B\xEC\x9F\x26"
+                         "\x84\xB6\xED\x10\x33\x63\x9B\x5F"
+                         "\x4D\x53\xEE\x94\x45\x8B\x60\x58"
+                         "\x86\x20\xF9\x1E\x82\x08\x3E\x58"
+                         "\x60\x1B\x34\x19\x02\xBE\x4E\x09"
+                         "\xBB\x7C\x15\xCC\x60\x27\x55\x7A"
+                         "\x12\xB8\xD8\x08\x89\x3C\xA6\xF3"
+                         "\xF1\xDD\xA7\x07\xA3\x12\x85\x28"
+                         "\xE9\x57\xAC\x80\x0C\x5C\x0F\x3A"
+                         "\x5D\xC2\x91\xC7\x90\xE4\x8C\x43"
+                         "\x92\xE4\x7C\x26\x69\x4D\x83\x68"
+                         "\x14\x96\x42\x47\xBD\xA9\xE4\x8A"
+                         "\x33\x19\xEB\x54\x8E\x0D\x4B\x6E"
+                         "\x91\x51\xB5\x36\x08\xDE\x1C\x06"
+                         "\x03\xBD\xDE\x81\x26\xF7\x99\xC2"
+                         "\xBA\xF7\x6D\x87\x0D\xE4\xA6\xCF"
+                         "\xC1\xF5\x27\x05\xB8\x02\x57\x72"
+                         "\xE6\x42\x13\x0B\xC6\x47\x05\x74"
+                         "\x24\x15\xF7\x0D\xC2\x23\x9D\xB9"
+                         "\x3C\x77\x18\x93\xBA\xB4\xFC\x8C"
+                         "\x98\x82\x67\x67\xB4\xD7\xD3\x43"
+                         "\x23\x08\x02\xB7\x9B\x99\x05\xFB"
+                         "\xD3\xB5\x00\x0A\xA9\x9D\x66\xD6"
+                         "\x2E\x49\x58\xD0\xA8\x57\x29\x7F"
+                         "\x0A\x0E\x7D\xFC\x92\x83\xCC\x67"
+                         "\xA2\xB1\x70\x3A\x8F\x87\x4A\x8D"
+                         "\x17\xE2\x58\x2B\x88\x0D\x68\x62"
+                         "\xBF\x35\xD1\x6F\xC0\xF0\x18\x62"
+                         "\xB2\xC7\x2D\x58\xC7\x16\xDE\x08"
+                         "\xEB\x84\x1D\x25\xA7\x38\x94\x06"
+                         "\x93\x9D\xF8\xFE\x88\x71\xE7\x84"
+                         "\x2C\xA0\x38\xA3\x1D\x48\xCF\x29"
+                         "\x0B\xBC\xD8\x50\x99\x1A\x26\xFB"
+                         "\x8E\x75\x3D\x73\xEB\x6A\xED\x29"
+                         "\xE0\x8E\xED\xFC\xFE\x6F\xF6\xBA"
+                         "\x41\xE2\x10\x4C\x01\x8B\x69\x2B"
+                         "\x25\x3F\x4D\x70\x7B\x92\xD6\x3B"
+                         "\xAC\xF9\x77\x18\xD9\x6A\x30\xA6"
+                         "\x2E\xFA\x30\xFF\xC8\xD5\x1D\x06"
+                         "\x59\x28\x1D\x86\x43\x04\x5D\x3B"
+                         "\x99\x4C\x04\x5A\x21\x17\x8B\x76"
+                         "\x8F\x72\xCB\xA1\x9C\x29\x4C\xC3"
+                         "\x65\xA2\x58\x2A\xC5\x66\x24\xBF"
+                         "\xBA\xE6\x0C\xDD\x34\x24\x74\xC8"
+                         "\x84\x0A\x66\x2C\xBE\x8F\x32\xA9"
+                         "\xE7\xE4\xA1\xD7\xDA\xAB\x23\x1E"
+                         "\xEB\xEE\x6C\x94\x6F\x9C\x2E\xD1"
+                         "\x49\x2C\xF3\xD4\x90\xCC\x93\x4C"
+                         "\x84\x52\x6D\x68\xDE\xC6\x64\xB2"
+                         "\x11\x74\x93\x57\xB4\x7E\xC6\x00",
+               .rlen   = 496,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 496 - 16, 16 },
        },
 };
 
@@ -6964,293 +7994,1618 @@ static struct cipher_testvec cast6_dec_tv_template[] = {
                .ilen   = 16,
                .result = zeroed_string,
                .rlen   = 16,
-       },
-};
-
-
-/*
- * AES test vectors.
- */
-#define AES_ENC_TEST_VECTORS 3
-#define AES_DEC_TEST_VECTORS 3
-#define AES_CBC_ENC_TEST_VECTORS 4
-#define AES_CBC_DEC_TEST_VECTORS 4
-#define HMAC_SHA1_AES_CBC_ENC_TEST_VECTORS 7
-#define HMAC_SHA256_AES_CBC_ENC_TEST_VECTORS 7
-#define HMAC_SHA512_AES_CBC_ENC_TEST_VECTORS 7
-#define AES_LRW_ENC_TEST_VECTORS 8
-#define AES_LRW_DEC_TEST_VECTORS 8
-#define AES_XTS_ENC_TEST_VECTORS 5
-#define AES_XTS_DEC_TEST_VECTORS 5
-#define AES_CTR_ENC_TEST_VECTORS 3
-#define AES_CTR_DEC_TEST_VECTORS 3
-#define AES_OFB_ENC_TEST_VECTORS 1
-#define AES_OFB_DEC_TEST_VECTORS 1
-#define AES_CTR_3686_ENC_TEST_VECTORS 7
-#define AES_CTR_3686_DEC_TEST_VECTORS 6
-#define AES_GCM_ENC_TEST_VECTORS 9
-#define AES_GCM_DEC_TEST_VECTORS 8
-#define AES_GCM_4106_ENC_TEST_VECTORS 7
-#define AES_GCM_4106_DEC_TEST_VECTORS 7
-#define AES_CCM_ENC_TEST_VECTORS 7
-#define AES_CCM_DEC_TEST_VECTORS 7
-#define AES_CCM_4309_ENC_TEST_VECTORS 7
-#define AES_CCM_4309_DEC_TEST_VECTORS 10
-
-static struct cipher_testvec aes_enc_tv_template[] = {
-       { /* From FIPS-197 */
-               .key    = "\x00\x01\x02\x03\x04\x05\x06\x07"
-                         "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
-               .klen   = 16,
-               .input  = "\x00\x11\x22\x33\x44\x55\x66\x77"
-                         "\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
-               .ilen   = 16,
-               .result = "\x69\xc4\xe0\xd8\x6a\x7b\x04\x30"
-                         "\xd8\xcd\xb7\x80\x70\xb4\xc5\x5a",
-               .rlen   = 16,
-       }, {
-               .key    = "\x00\x01\x02\x03\x04\x05\x06\x07"
-                         "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
-                         "\x10\x11\x12\x13\x14\x15\x16\x17",
-               .klen   = 24,
-               .input  = "\x00\x11\x22\x33\x44\x55\x66\x77"
-                         "\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
-               .ilen   = 16,
-               .result = "\xdd\xa9\x7c\xa4\x86\x4c\xdf\xe0"
-                         "\x6e\xaf\x70\xa0\xec\x0d\x71\x91",
-               .rlen   = 16,
-       }, {
-               .key    = "\x00\x01\x02\x03\x04\x05\x06\x07"
-                         "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
-                         "\x10\x11\x12\x13\x14\x15\x16\x17"
-                         "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
+       }, { /* Generated from TF test vectors */
+               .key    = "\x85\x62\x3F\x1C\xF9\xD6\x1C\xF9"
+                         "\xD6\xB3\x90\x6D\x4A\x90\x6D\x4A"
+                         "\x27\x04\xE1\x27\x04\xE1\xBE\x9B"
+                         "\x78\xBE\x9B\x78\x55\x32\x0F\x55",
                .klen   = 32,
-               .input  = "\x00\x11\x22\x33\x44\x55\x66\x77"
-                         "\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
-               .ilen   = 16,
-               .result = "\x8e\xa2\xb7\xca\x51\x67\x45\xbf"
-                         "\xea\xfc\x49\x90\x4b\x49\x60\x89",
-               .rlen   = 16,
+               .iv     = "\xE2\x24\x89\xEE\x53\xB8\x1D\x5F"
+                         "\xC4\x29\x8E\xF3\x35\x9A\xFF\x64",
+               .input  = "\xC3\x70\x22\x32\xF5\x80\xCB\x54"
+                         "\xFC\x30\xE0\xF6\xEB\x39\x57\xA6"
+                         "\xB6\xB9\xC5\xA4\x91\x55\x14\x97"
+                         "\xC1\x20\xFF\x6C\x5C\xF0\x67\xEA"
+                         "\x2F\xED\xD8\xC9\xFB\x38\x3F\xFE"
+                         "\x93\xBE\xDC\x00\xD3\x7F\xAD\x4C"
+                         "\x5A\x08\x92\xD1\x47\x0C\xFA\x6C"
+                         "\xD0\x6A\x99\x10\x72\xF8\x47\x62"
+                         "\x81\x42\xF8\xD8\xF5\xBB\x94\x08"
+                         "\xAA\x97\xA2\x8B\x69\xB3\xD2\x7E"
+                         "\xBC\xB5\x00\x0C\xE5\x44\x4B\x58"
+                         "\xE8\x63\xDC\xB3\xC4\xE5\x23\x12"
+                         "\x5A\x72\x85\x47\x8B\xEC\x9F\x26"
+                         "\x84\xB6\xED\x10\x33\x63\x9B\x5F"
+                         "\x4D\x53\xEE\x94\x45\x8B\x60\x58"
+                         "\x86\x20\xF9\x1E\x82\x08\x3E\x58"
+                         "\x60\x1B\x34\x19\x02\xBE\x4E\x09"
+                         "\xBB\x7C\x15\xCC\x60\x27\x55\x7A"
+                         "\x12\xB8\xD8\x08\x89\x3C\xA6\xF3"
+                         "\xF1\xDD\xA7\x07\xA3\x12\x85\x28"
+                         "\xE9\x57\xAC\x80\x0C\x5C\x0F\x3A"
+                         "\x5D\xC2\x91\xC7\x90\xE4\x8C\x43"
+                         "\x92\xE4\x7C\x26\x69\x4D\x83\x68"
+                         "\x14\x96\x42\x47\xBD\xA9\xE4\x8A"
+                         "\x33\x19\xEB\x54\x8E\x0D\x4B\x6E"
+                         "\x91\x51\xB5\x36\x08\xDE\x1C\x06"
+                         "\x03\xBD\xDE\x81\x26\xF7\x99\xC2"
+                         "\xBA\xF7\x6D\x87\x0D\xE4\xA6\xCF"
+                         "\xC1\xF5\x27\x05\xB8\x02\x57\x72"
+                         "\xE6\x42\x13\x0B\xC6\x47\x05\x74"
+                         "\x24\x15\xF7\x0D\xC2\x23\x9D\xB9"
+                         "\x3C\x77\x18\x93\xBA\xB4\xFC\x8C"
+                         "\x98\x82\x67\x67\xB4\xD7\xD3\x43"
+                         "\x23\x08\x02\xB7\x9B\x99\x05\xFB"
+                         "\xD3\xB5\x00\x0A\xA9\x9D\x66\xD6"
+                         "\x2E\x49\x58\xD0\xA8\x57\x29\x7F"
+                         "\x0A\x0E\x7D\xFC\x92\x83\xCC\x67"
+                         "\xA2\xB1\x70\x3A\x8F\x87\x4A\x8D"
+                         "\x17\xE2\x58\x2B\x88\x0D\x68\x62"
+                         "\xBF\x35\xD1\x6F\xC0\xF0\x18\x62"
+                         "\xB2\xC7\x2D\x58\xC7\x16\xDE\x08"
+                         "\xEB\x84\x1D\x25\xA7\x38\x94\x06"
+                         "\x93\x9D\xF8\xFE\x88\x71\xE7\x84"
+                         "\x2C\xA0\x38\xA3\x1D\x48\xCF\x29"
+                         "\x0B\xBC\xD8\x50\x99\x1A\x26\xFB"
+                         "\x8E\x75\x3D\x73\xEB\x6A\xED\x29"
+                         "\xE0\x8E\xED\xFC\xFE\x6F\xF6\xBA"
+                         "\x41\xE2\x10\x4C\x01\x8B\x69\x2B"
+                         "\x25\x3F\x4D\x70\x7B\x92\xD6\x3B"
+                         "\xAC\xF9\x77\x18\xD9\x6A\x30\xA6"
+                         "\x2E\xFA\x30\xFF\xC8\xD5\x1D\x06"
+                         "\x59\x28\x1D\x86\x43\x04\x5D\x3B"
+                         "\x99\x4C\x04\x5A\x21\x17\x8B\x76"
+                         "\x8F\x72\xCB\xA1\x9C\x29\x4C\xC3"
+                         "\x65\xA2\x58\x2A\xC5\x66\x24\xBF"
+                         "\xBA\xE6\x0C\xDD\x34\x24\x74\xC8"
+                         "\x84\x0A\x66\x2C\xBE\x8F\x32\xA9"
+                         "\xE7\xE4\xA1\xD7\xDA\xAB\x23\x1E"
+                         "\xEB\xEE\x6C\x94\x6F\x9C\x2E\xD1"
+                         "\x49\x2C\xF3\xD4\x90\xCC\x93\x4C"
+                         "\x84\x52\x6D\x68\xDE\xC6\x64\xB2"
+                         "\x11\x74\x93\x57\xB4\x7E\xC6\x00",
+               .ilen   = 496,
+               .result = "\x56\xED\x84\x1B\x8F\x26\xBD\x31"
+                         "\xC8\x5F\xF6\x6A\x01\x98\x0C\xA3"
+                         "\x3A\xD1\x45\xDC\x73\x0A\x7E\x15"
+                         "\xAC\x20\xB7\x4E\xE5\x59\xF0\x87"
+                         "\x1E\x92\x29\xC0\x34\xCB\x62\xF9"
+                         "\x6D\x04\x9B\x0F\xA6\x3D\xD4\x48"
+                         "\xDF\x76\x0D\x81\x18\xAF\x23\xBA"
+                         "\x51\xE8\x5C\xF3\x8A\x21\x95\x2C"
+                         "\xC3\x37\xCE\x65\xFC\x70\x07\x9E"
+                         "\x12\xA9\x40\xD7\x4B\xE2\x79\x10"
+                         "\x84\x1B\xB2\x26\xBD\x54\xEB\x5F"
+                         "\xF6\x8D\x01\x98\x2F\xC6\x3A\xD1"
+                         "\x68\xFF\x73\x0A\xA1\x15\xAC\x43"
+                         "\xDA\x4E\xE5\x7C\x13\x87\x1E\xB5"
+                         "\x29\xC0\x57\xEE\x62\xF9\x90\x04"
+                         "\x9B\x32\xC9\x3D\xD4\x6B\x02\x76"
+                         "\x0D\xA4\x18\xAF\x46\xDD\x51\xE8"
+                         "\x7F\x16\x8A\x21\xB8\x2C\xC3\x5A"
+                         "\xF1\x65\xFC\x93\x07\x9E\x35\xCC"
+                         "\x40\xD7\x6E\x05\x79\x10\xA7\x1B"
+                         "\xB2\x49\xE0\x54\xEB\x82\x19\x8D"
+                         "\x24\xBB\x2F\xC6\x5D\xF4\x68\xFF"
+                         "\x96\x0A\xA1\x38\xCF\x43\xDA\x71"
+                         "\x08\x7C\x13\xAA\x1E\xB5\x4C\xE3"
+                         "\x57\xEE\x85\x1C\x90\x27\xBE\x32"
+                         "\xC9\x60\xF7\x6B\x02\x99\x0D\xA4"
+                         "\x3B\xD2\x46\xDD\x74\x0B\x7F\x16"
+                         "\xAD\x21\xB8\x4F\xE6\x5A\xF1\x88"
+                         "\x1F\x93\x2A\xC1\x35\xCC\x63\xFA"
+                         "\x6E\x05\x9C\x10\xA7\x3E\xD5\x49"
+                         "\xE0\x77\x0E\x82\x19\xB0\x24\xBB"
+                         "\x52\xE9\x5D\xF4\x8B\x22\x96\x2D"
+                         "\xC4\x38\xCF\x66\xFD\x71\x08\x9F"
+                         "\x13\xAA\x41\xD8\x4C\xE3\x7A\x11"
+                         "\x85\x1C\xB3\x27\xBE\x55\xEC\x60"
+                         "\xF7\x8E\x02\x99\x30\xC7\x3B\xD2"
+                         "\x69\x00\x74\x0B\xA2\x16\xAD\x44"
+                         "\xDB\x4F\xE6\x7D\x14\x88\x1F\xB6"
+                         "\x2A\xC1\x58\xEF\x63\xFA\x91\x05"
+                         "\x9C\x33\xCA\x3E\xD5\x6C\x03\x77"
+                         "\x0E\xA5\x19\xB0\x47\xDE\x52\xE9"
+                         "\x80\x17\x8B\x22\xB9\x2D\xC4\x5B"
+                         "\xF2\x66\xFD\x94\x08\x9F\x36\xCD"
+                         "\x41\xD8\x6F\x06\x7A\x11\xA8\x1C"
+                         "\xB3\x4A\xE1\x55\xEC\x83\x1A\x8E"
+                         "\x25\xBC\x30\xC7\x5E\xF5\x69\x00"
+                         "\x97\x0B\xA2\x39\xD0\x44\xDB\x72"
+                         "\x09\x7D\x14\xAB\x1F\xB6\x4D\xE4"
+                         "\x58\xEF\x86\x1D\x91\x28\xBF\x33"
+                         "\xCA\x61\xF8\x6C\x03\x9A\x0E\xA5"
+                         "\x3C\xD3\x47\xDE\x75\x0C\x80\x17"
+                         "\xAE\x22\xB9\x50\xE7\x5B\xF2\x89"
+                         "\x20\x94\x2B\xC2\x36\xCD\x64\xFB"
+                         "\x6F\x06\x9D\x11\xA8\x3F\xD6\x4A"
+                         "\xE1\x78\x0F\x83\x1A\xB1\x25\xBC"
+                         "\x53\xEA\x5E\xF5\x8C\x00\x97\x2E"
+                         "\xC5\x39\xD0\x67\xFE\x72\x09\xA0"
+                         "\x14\xAB\x42\xD9\x4D\xE4\x7B\x12"
+                         "\x86\x1D\xB4\x28\xBF\x56\xED\x61"
+                         "\xF8\x8F\x03\x9A\x31\xC8\x3C\xD3"
+                         "\x6A\x01\x75\x0C\xA3\x17\xAE\x45"
+                         "\xDC\x50\xE7\x7E\x15\x89\x20\xB7",
+               .rlen   = 496,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 496 - 16, 16 },
        },
 };
 
-static struct cipher_testvec aes_dec_tv_template[] = {
-       { /* From FIPS-197 */
-               .key    = "\x00\x01\x02\x03\x04\x05\x06\x07"
-                         "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
-               .klen   = 16,
-               .input  = "\x69\xc4\xe0\xd8\x6a\x7b\x04\x30"
-                         "\xd8\xcd\xb7\x80\x70\xb4\xc5\x5a",
-               .ilen   = 16,
-               .result = "\x00\x11\x22\x33\x44\x55\x66\x77"
-                         "\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
-               .rlen   = 16,
-       }, {
-               .key    = "\x00\x01\x02\x03\x04\x05\x06\x07"
-                         "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
-                         "\x10\x11\x12\x13\x14\x15\x16\x17",
-               .klen   = 24,
-               .input  = "\xdd\xa9\x7c\xa4\x86\x4c\xdf\xe0"
-                         "\x6e\xaf\x70\xa0\xec\x0d\x71\x91",
-               .ilen   = 16,
-               .result = "\x00\x11\x22\x33\x44\x55\x66\x77"
-                         "\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
-               .rlen   = 16,
-       }, {
-               .key    = "\x00\x01\x02\x03\x04\x05\x06\x07"
-                         "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
-                         "\x10\x11\x12\x13\x14\x15\x16\x17"
-                         "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
+static struct cipher_testvec cast6_cbc_enc_tv_template[] = {
+       { /* Generated from TF test vectors */
+               .key    = "\x85\x62\x3F\x1C\xF9\xD6\x1C\xF9"
+                         "\xD6\xB3\x90\x6D\x4A\x90\x6D\x4A"
+                         "\x27\x04\xE1\x27\x04\xE1\xBE\x9B"
+                         "\x78\xBE\x9B\x78\x55\x32\x0F\x55",
                .klen   = 32,
-               .input  = "\x8e\xa2\xb7\xca\x51\x67\x45\xbf"
-                         "\xea\xfc\x49\x90\x4b\x49\x60\x89",
-               .ilen   = 16,
-               .result = "\x00\x11\x22\x33\x44\x55\x66\x77"
-                         "\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
-               .rlen   = 16,
+               .iv     = "\xE2\x24\x89\xEE\x53\xB8\x1D\x5F"
+                         "\xC4\x29\x8E\xF3\x35\x9A\xFF\x64",
+               .input  = "\x56\xED\x84\x1B\x8F\x26\xBD\x31"
+                         "\xC8\x5F\xF6\x6A\x01\x98\x0C\xA3"
+                         "\x3A\xD1\x45\xDC\x73\x0A\x7E\x15"
+                         "\xAC\x20\xB7\x4E\xE5\x59\xF0\x87"
+                         "\x1E\x92\x29\xC0\x34\xCB\x62\xF9"
+                         "\x6D\x04\x9B\x0F\xA6\x3D\xD4\x48"
+                         "\xDF\x76\x0D\x81\x18\xAF\x23\xBA"
+                         "\x51\xE8\x5C\xF3\x8A\x21\x95\x2C"
+                         "\xC3\x37\xCE\x65\xFC\x70\x07\x9E"
+                         "\x12\xA9\x40\xD7\x4B\xE2\x79\x10"
+                         "\x84\x1B\xB2\x26\xBD\x54\xEB\x5F"
+                         "\xF6\x8D\x01\x98\x2F\xC6\x3A\xD1"
+                         "\x68\xFF\x73\x0A\xA1\x15\xAC\x43"
+                         "\xDA\x4E\xE5\x7C\x13\x87\x1E\xB5"
+                         "\x29\xC0\x57\xEE\x62\xF9\x90\x04"
+                         "\x9B\x32\xC9\x3D\xD4\x6B\x02\x76"
+                         "\x0D\xA4\x18\xAF\x46\xDD\x51\xE8"
+                         "\x7F\x16\x8A\x21\xB8\x2C\xC3\x5A"
+                         "\xF1\x65\xFC\x93\x07\x9E\x35\xCC"
+                         "\x40\xD7\x6E\x05\x79\x10\xA7\x1B"
+                         "\xB2\x49\xE0\x54\xEB\x82\x19\x8D"
+                         "\x24\xBB\x2F\xC6\x5D\xF4\x68\xFF"
+                         "\x96\x0A\xA1\x38\xCF\x43\xDA\x71"
+                         "\x08\x7C\x13\xAA\x1E\xB5\x4C\xE3"
+                         "\x57\xEE\x85\x1C\x90\x27\xBE\x32"
+                         "\xC9\x60\xF7\x6B\x02\x99\x0D\xA4"
+                         "\x3B\xD2\x46\xDD\x74\x0B\x7F\x16"
+                         "\xAD\x21\xB8\x4F\xE6\x5A\xF1\x88"
+                         "\x1F\x93\x2A\xC1\x35\xCC\x63\xFA"
+                         "\x6E\x05\x9C\x10\xA7\x3E\xD5\x49"
+                         "\xE0\x77\x0E\x82\x19\xB0\x24\xBB"
+                         "\x52\xE9\x5D\xF4\x8B\x22\x96\x2D"
+                         "\xC4\x38\xCF\x66\xFD\x71\x08\x9F"
+                         "\x13\xAA\x41\xD8\x4C\xE3\x7A\x11"
+                         "\x85\x1C\xB3\x27\xBE\x55\xEC\x60"
+                         "\xF7\x8E\x02\x99\x30\xC7\x3B\xD2"
+                         "\x69\x00\x74\x0B\xA2\x16\xAD\x44"
+                         "\xDB\x4F\xE6\x7D\x14\x88\x1F\xB6"
+                         "\x2A\xC1\x58\xEF\x63\xFA\x91\x05"
+                         "\x9C\x33\xCA\x3E\xD5\x6C\x03\x77"
+                         "\x0E\xA5\x19\xB0\x47\xDE\x52\xE9"
+                         "\x80\x17\x8B\x22\xB9\x2D\xC4\x5B"
+                         "\xF2\x66\xFD\x94\x08\x9F\x36\xCD"
+                         "\x41\xD8\x6F\x06\x7A\x11\xA8\x1C"
+                         "\xB3\x4A\xE1\x55\xEC\x83\x1A\x8E"
+                         "\x25\xBC\x30\xC7\x5E\xF5\x69\x00"
+                         "\x97\x0B\xA2\x39\xD0\x44\xDB\x72"
+                         "\x09\x7D\x14\xAB\x1F\xB6\x4D\xE4"
+                         "\x58\xEF\x86\x1D\x91\x28\xBF\x33"
+                         "\xCA\x61\xF8\x6C\x03\x9A\x0E\xA5"
+                         "\x3C\xD3\x47\xDE\x75\x0C\x80\x17"
+                         "\xAE\x22\xB9\x50\xE7\x5B\xF2\x89"
+                         "\x20\x94\x2B\xC2\x36\xCD\x64\xFB"
+                         "\x6F\x06\x9D\x11\xA8\x3F\xD6\x4A"
+                         "\xE1\x78\x0F\x83\x1A\xB1\x25\xBC"
+                         "\x53\xEA\x5E\xF5\x8C\x00\x97\x2E"
+                         "\xC5\x39\xD0\x67\xFE\x72\x09\xA0"
+                         "\x14\xAB\x42\xD9\x4D\xE4\x7B\x12"
+                         "\x86\x1D\xB4\x28\xBF\x56\xED\x61"
+                         "\xF8\x8F\x03\x9A\x31\xC8\x3C\xD3"
+                         "\x6A\x01\x75\x0C\xA3\x17\xAE\x45"
+                         "\xDC\x50\xE7\x7E\x15\x89\x20\xB7",
+               .ilen   = 496,
+               .result = "\xDF\x77\x68\x96\xC7\xBA\xF8\xE2"
+                         "\x0E\x24\x99\x1A\xAA\xF3\xC6\x9F"
+                         "\xA0\x73\xB3\x70\xC3\x68\x64\x70"
+                         "\xAD\x33\x02\xFB\x88\x74\xAA\x78"
+                         "\xC7\x47\x1A\x18\x61\x2D\xAC\x9F"
+                         "\x7E\x6F\xDF\x05\x13\x76\xA6\x72"
+                         "\xB7\x13\x09\x0F\x7D\x38\xDF\x25"
+                         "\x4E\xFD\x50\x45\xFA\x35\x6A\xC0"
+                         "\x57\x95\xE1\x21\x26\x10\x9A\x21"
+                         "\xA1\x8A\x51\x05\xD1\xB1\x78\x35"
+                         "\x98\xF5\xAE\xC0\xC1\x8B\x94\xFF"
+                         "\xD0\x69\x3F\x42\xC2\x01\xA7\x9B"
+                         "\x23\x16\x47\x72\x81\x13\x3A\x72"
+                         "\xEC\xD9\x40\x88\x00\x9C\xB0\xA8"
+                         "\x9C\xAC\xCE\x11\x73\x7B\x63\x3E"
+                         "\xA3\x63\x98\x7D\x35\xE4\xD9\x83"
+                         "\xE2\xD0\x52\x87\x0C\x1F\xB0\xB3"
+                         "\x41\x1A\x93\x8D\x76\x31\x9F\xF2"
+                         "\xFE\x09\xA3\x8F\x22\x6A\x3B\xB9"
+                         "\x6C\x9E\xE4\xA1\xA0\xC4\xE7\xA1"
+                         "\x21\x9C\x1A\xCA\x65\xDE\x44\x03"
+                         "\x99\xF2\xD2\x39\xE3\x3F\x0F\x37"
+                         "\x53\x50\x23\xA4\x81\x6E\xDA\xFB"
+                         "\xF8\x7B\x01\xD7\xB2\x32\x9C\xB8"
+                         "\xB1\x0E\x99\x17\xB5\x38\xF9\xD7"
+                         "\x86\x2D\x6E\x94\x5C\x99\x9D\xB3"
+                         "\xD3\x63\x4B\x2A\x7D\x44\x6A\xB2"
+                         "\xC1\x03\xE6\x5A\x37\xD8\x64\x18"
+                         "\xAA\x32\xCE\x29\xED\xC0\xA2\xCB"
+                         "\x8D\xAF\xCD\xBE\x8F\xB6\xEC\xB4"
+                         "\x89\x05\x81\x6E\x71\x4F\xC3\x28"
+                         "\x10\xC1\x62\xC4\x41\xE9\xD2\x39"
+                         "\xF3\x22\x39\x12\x2C\xC2\x95\x2D"
+                         "\xBF\x93\x58\x4B\x04\xD1\x8D\x57"
+                         "\xAE\xEB\x60\x03\x56\x35\xAD\x5A"
+                         "\xE9\xC3\xFF\x4E\x31\xE1\x37\xF8"
+                         "\x7D\xEE\x65\x8A\xB6\x88\x1A\x3E"
+                         "\x07\x09\x82\xBA\xF0\x80\x8A\xD0"
+                         "\xA0\x3F\x6A\xE9\x24\x87\x19\x65"
+                         "\x73\x3F\x12\x91\x47\x54\xBA\x39"
+                         "\x30\x5B\x1E\xE5\xC2\xF9\x3F\xEF"
+                         "\xD6\x75\xF9\xB8\x7C\x8B\x05\x76"
+                         "\xEE\xB7\x08\x25\x4B\xB6\x7B\x47"
+                         "\x72\xC0\x4C\xD4\xDA\xE0\x75\xF1"
+                         "\x7C\xE8\x94\x9E\x16\x6E\xB8\x12"
+                         "\xA1\xC1\x6E\x3B\x1C\x59\x41\x2D"
+                         "\x23\xFA\x7D\x77\xB8\x46\x75\xFE"
+                         "\x4F\x10\xD3\x09\x60\xA1\x36\x96"
+                         "\x5B\xC2\xDC\x6E\x84\x7D\x9B\x14"
+                         "\x80\x21\x83\x58\x3C\x76\xFD\x28"
+                         "\x1D\xF9\x93\x13\xD7\x0E\x62\x14"
+                         "\x5A\xC5\x4E\x08\xA5\x56\xA4\x3C"
+                         "\x68\x93\x44\x70\xDF\xCF\x4A\x51"
+                         "\x0B\x81\x29\x41\xE5\x62\x4D\x36"
+                         "\xB3\xEA\x94\xA6\xB9\xDD\x3F\x09"
+                         "\x62\x34\xA0\x6A\x7E\x7D\xF5\xF6"
+                         "\x01\x91\xB4\x27\xDA\x59\xD6\x17"
+                         "\x56\x4D\x82\x62\x37\xA3\x48\x01"
+                         "\x99\x91\x77\xB2\x08\x6B\x2C\x37"
+                         "\xC5\x5C\xAD\xB6\x07\xB6\x84\xF3"
+                         "\x4D\x59\x7D\xC5\x28\x69\xFA\x92"
+                         "\x22\x46\x89\x2D\x0F\x2B\x08\x24",
+               .rlen   = 496,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 496 - 16, 16 },
        },
 };
 
-static struct cipher_testvec aes_cbc_enc_tv_template[] = {
-       { /* From RFC 3602 */
-               .key    = "\x06\xa9\x21\x40\x36\xb8\xa1\x5b"
-                         "\x51\x2e\x03\xd5\x34\x12\x00\x06",
-               .klen   = 16,
-               .iv     = "\x3d\xaf\xba\x42\x9d\x9e\xb4\x30"
-                         "\xb4\x22\xda\x80\x2c\x9f\xac\x41",
-               .input  = "Single block msg",
-               .ilen   = 16,
-               .result = "\xe3\x53\x77\x9c\x10\x79\xae\xb8"
-                         "\x27\x08\x94\x2d\xbe\x77\x18\x1a",
-               .rlen   = 16,
-       }, {
-               .key    = "\xc2\x86\x69\x6d\x88\x7c\x9a\xa0"
-                         "\x61\x1b\xbb\x3e\x20\x25\xa4\x5a",
-               .klen   = 16,
-               .iv     = "\x56\x2e\x17\x99\x6d\x09\x3d\x28"
-                         "\xdd\xb3\xba\x69\x5a\x2e\x6f\x58",
-               .input  = "\x00\x01\x02\x03\x04\x05\x06\x07"
-                         "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
-                         "\x10\x11\x12\x13\x14\x15\x16\x17"
-                         "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
-               .ilen   = 32,
-               .result = "\xd2\x96\xcd\x94\xc2\xcc\xcf\x8a"
-                         "\x3a\x86\x30\x28\xb5\xe1\xdc\x0a"
-                         "\x75\x86\x60\x2d\x25\x3c\xff\xf9"
-                         "\x1b\x82\x66\xbe\xa6\xd6\x1a\xb1",
-               .rlen   = 32,
-       }, { /* From NIST SP800-38A */
-               .key    = "\x8e\x73\xb0\xf7\xda\x0e\x64\x52"
-                         "\xc8\x10\xf3\x2b\x80\x90\x79\xe5"
-                         "\x62\xf8\xea\xd2\x52\x2c\x6b\x7b",
-               .klen   = 24,
-               .iv     = "\x00\x01\x02\x03\x04\x05\x06\x07"
-                         "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
-               .input  = "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96"
-                         "\xe9\x3d\x7e\x11\x73\x93\x17\x2a"
-                         "\xae\x2d\x8a\x57\x1e\x03\xac\x9c"
-                         "\x9e\xb7\x6f\xac\x45\xaf\x8e\x51"
-                         "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11"
-                         "\xe5\xfb\xc1\x19\x1a\x0a\x52\xef"
-                         "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17"
-                         "\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
-               .ilen   = 64,
-               .result = "\x4f\x02\x1d\xb2\x43\xbc\x63\x3d"
-                         "\x71\x78\x18\x3a\x9f\xa0\x71\xe8"
-                         "\xb4\xd9\xad\xa9\xad\x7d\xed\xf4"
-                         "\xe5\xe7\x38\x76\x3f\x69\x14\x5a"
-                         "\x57\x1b\x24\x20\x12\xfb\x7a\xe0"
-                         "\x7f\xa9\xba\xac\x3d\xf1\x02\xe0"
-                         "\x08\xb0\xe2\x79\x88\x59\x88\x81"
-                         "\xd9\x20\xa9\xe6\x4f\x56\x15\xcd",
-               .rlen   = 64,
-       }, {
-               .key    = "\x60\x3d\xeb\x10\x15\xca\x71\xbe"
-                         "\x2b\x73\xae\xf0\x85\x7d\x77\x81"
-                         "\x1f\x35\x2c\x07\x3b\x61\x08\xd7"
-                         "\x2d\x98\x10\xa3\x09\x14\xdf\xf4",
+static struct cipher_testvec cast6_cbc_dec_tv_template[] = {
+       { /* Generated from TF test vectors */
+               .key    = "\x85\x62\x3F\x1C\xF9\xD6\x1C\xF9"
+                         "\xD6\xB3\x90\x6D\x4A\x90\x6D\x4A"
+                         "\x27\x04\xE1\x27\x04\xE1\xBE\x9B"
+                         "\x78\xBE\x9B\x78\x55\x32\x0F\x55",
                .klen   = 32,
-               .iv     = "\x00\x01\x02\x03\x04\x05\x06\x07"
-                         "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
-               .input  = "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96"
-                         "\xe9\x3d\x7e\x11\x73\x93\x17\x2a"
-                         "\xae\x2d\x8a\x57\x1e\x03\xac\x9c"
-                         "\x9e\xb7\x6f\xac\x45\xaf\x8e\x51"
-                         "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11"
-                         "\xe5\xfb\xc1\x19\x1a\x0a\x52\xef"
-                         "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17"
-                         "\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
-               .ilen   = 64,
-               .result = "\xf5\x8c\x4c\x04\xd6\xe5\xf1\xba"
-                         "\x77\x9e\xab\xfb\x5f\x7b\xfb\xd6"
-                         "\x9c\xfc\x4e\x96\x7e\xdb\x80\x8d"
-                         "\x67\x9f\x77\x7b\xc6\x70\x2c\x7d"
-                         "\x39\xf2\x33\x69\xa9\xd9\xba\xcf"
-                         "\xa5\x30\xe2\x63\x04\x23\x14\x61"
-                         "\xb2\xeb\x05\xe2\xc3\x9b\xe9\xfc"
-                         "\xda\x6c\x19\x07\x8c\x6a\x9d\x1b",
-               .rlen   = 64,
+               .iv     = "\xE2\x24\x89\xEE\x53\xB8\x1D\x5F"
+                         "\xC4\x29\x8E\xF3\x35\x9A\xFF\x64",
+               .input  = "\xDF\x77\x68\x96\xC7\xBA\xF8\xE2"
+                         "\x0E\x24\x99\x1A\xAA\xF3\xC6\x9F"
+                         "\xA0\x73\xB3\x70\xC3\x68\x64\x70"
+                         "\xAD\x33\x02\xFB\x88\x74\xAA\x78"
+                         "\xC7\x47\x1A\x18\x61\x2D\xAC\x9F"
+                         "\x7E\x6F\xDF\x05\x13\x76\xA6\x72"
+                         "\xB7\x13\x09\x0F\x7D\x38\xDF\x25"
+                         "\x4E\xFD\x50\x45\xFA\x35\x6A\xC0"
+                         "\x57\x95\xE1\x21\x26\x10\x9A\x21"
+                         "\xA1\x8A\x51\x05\xD1\xB1\x78\x35"
+                         "\x98\xF5\xAE\xC0\xC1\x8B\x94\xFF"
+                         "\xD0\x69\x3F\x42\xC2\x01\xA7\x9B"
+                         "\x23\x16\x47\x72\x81\x13\x3A\x72"
+                         "\xEC\xD9\x40\x88\x00\x9C\xB0\xA8"
+                         "\x9C\xAC\xCE\x11\x73\x7B\x63\x3E"
+                         "\xA3\x63\x98\x7D\x35\xE4\xD9\x83"
+                         "\xE2\xD0\x52\x87\x0C\x1F\xB0\xB3"
+                         "\x41\x1A\x93\x8D\x76\x31\x9F\xF2"
+                         "\xFE\x09\xA3\x8F\x22\x6A\x3B\xB9"
+                         "\x6C\x9E\xE4\xA1\xA0\xC4\xE7\xA1"
+                         "\x21\x9C\x1A\xCA\x65\xDE\x44\x03"
+                         "\x99\xF2\xD2\x39\xE3\x3F\x0F\x37"
+                         "\x53\x50\x23\xA4\x81\x6E\xDA\xFB"
+                         "\xF8\x7B\x01\xD7\xB2\x32\x9C\xB8"
+                         "\xB1\x0E\x99\x17\xB5\x38\xF9\xD7"
+                         "\x86\x2D\x6E\x94\x5C\x99\x9D\xB3"
+                         "\xD3\x63\x4B\x2A\x7D\x44\x6A\xB2"
+                         "\xC1\x03\xE6\x5A\x37\xD8\x64\x18"
+                         "\xAA\x32\xCE\x29\xED\xC0\xA2\xCB"
+                         "\x8D\xAF\xCD\xBE\x8F\xB6\xEC\xB4"
+                         "\x89\x05\x81\x6E\x71\x4F\xC3\x28"
+                         "\x10\xC1\x62\xC4\x41\xE9\xD2\x39"
+                         "\xF3\x22\x39\x12\x2C\xC2\x95\x2D"
+                         "\xBF\x93\x58\x4B\x04\xD1\x8D\x57"
+                         "\xAE\xEB\x60\x03\x56\x35\xAD\x5A"
+                         "\xE9\xC3\xFF\x4E\x31\xE1\x37\xF8"
+                         "\x7D\xEE\x65\x8A\xB6\x88\x1A\x3E"
+                         "\x07\x09\x82\xBA\xF0\x80\x8A\xD0"
+                         "\xA0\x3F\x6A\xE9\x24\x87\x19\x65"
+                         "\x73\x3F\x12\x91\x47\x54\xBA\x39"
+                         "\x30\x5B\x1E\xE5\xC2\xF9\x3F\xEF"
+                         "\xD6\x75\xF9\xB8\x7C\x8B\x05\x76"
+                         "\xEE\xB7\x08\x25\x4B\xB6\x7B\x47"
+                         "\x72\xC0\x4C\xD4\xDA\xE0\x75\xF1"
+                         "\x7C\xE8\x94\x9E\x16\x6E\xB8\x12"
+                         "\xA1\xC1\x6E\x3B\x1C\x59\x41\x2D"
+                         "\x23\xFA\x7D\x77\xB8\x46\x75\xFE"
+                         "\x4F\x10\xD3\x09\x60\xA1\x36\x96"
+                         "\x5B\xC2\xDC\x6E\x84\x7D\x9B\x14"
+                         "\x80\x21\x83\x58\x3C\x76\xFD\x28"
+                         "\x1D\xF9\x93\x13\xD7\x0E\x62\x14"
+                         "\x5A\xC5\x4E\x08\xA5\x56\xA4\x3C"
+                         "\x68\x93\x44\x70\xDF\xCF\x4A\x51"
+                         "\x0B\x81\x29\x41\xE5\x62\x4D\x36"
+                         "\xB3\xEA\x94\xA6\xB9\xDD\x3F\x09"
+                         "\x62\x34\xA0\x6A\x7E\x7D\xF5\xF6"
+                         "\x01\x91\xB4\x27\xDA\x59\xD6\x17"
+                         "\x56\x4D\x82\x62\x37\xA3\x48\x01"
+                         "\x99\x91\x77\xB2\x08\x6B\x2C\x37"
+                         "\xC5\x5C\xAD\xB6\x07\xB6\x84\xF3"
+                         "\x4D\x59\x7D\xC5\x28\x69\xFA\x92"
+                         "\x22\x46\x89\x2D\x0F\x2B\x08\x24",
+               .ilen   = 496,
+               .result = "\x56\xED\x84\x1B\x8F\x26\xBD\x31"
+                         "\xC8\x5F\xF6\x6A\x01\x98\x0C\xA3"
+                         "\x3A\xD1\x45\xDC\x73\x0A\x7E\x15"
+                         "\xAC\x20\xB7\x4E\xE5\x59\xF0\x87"
+                         "\x1E\x92\x29\xC0\x34\xCB\x62\xF9"
+                         "\x6D\x04\x9B\x0F\xA6\x3D\xD4\x48"
+                         "\xDF\x76\x0D\x81\x18\xAF\x23\xBA"
+                         "\x51\xE8\x5C\xF3\x8A\x21\x95\x2C"
+                         "\xC3\x37\xCE\x65\xFC\x70\x07\x9E"
+                         "\x12\xA9\x40\xD7\x4B\xE2\x79\x10"
+                         "\x84\x1B\xB2\x26\xBD\x54\xEB\x5F"
+                         "\xF6\x8D\x01\x98\x2F\xC6\x3A\xD1"
+                         "\x68\xFF\x73\x0A\xA1\x15\xAC\x43"
+                         "\xDA\x4E\xE5\x7C\x13\x87\x1E\xB5"
+                         "\x29\xC0\x57\xEE\x62\xF9\x90\x04"
+                         "\x9B\x32\xC9\x3D\xD4\x6B\x02\x76"
+                         "\x0D\xA4\x18\xAF\x46\xDD\x51\xE8"
+                         "\x7F\x16\x8A\x21\xB8\x2C\xC3\x5A"
+                         "\xF1\x65\xFC\x93\x07\x9E\x35\xCC"
+                         "\x40\xD7\x6E\x05\x79\x10\xA7\x1B"
+                         "\xB2\x49\xE0\x54\xEB\x82\x19\x8D"
+                         "\x24\xBB\x2F\xC6\x5D\xF4\x68\xFF"
+                         "\x96\x0A\xA1\x38\xCF\x43\xDA\x71"
+                         "\x08\x7C\x13\xAA\x1E\xB5\x4C\xE3"
+                         "\x57\xEE\x85\x1C\x90\x27\xBE\x32"
+                         "\xC9\x60\xF7\x6B\x02\x99\x0D\xA4"
+                         "\x3B\xD2\x46\xDD\x74\x0B\x7F\x16"
+                         "\xAD\x21\xB8\x4F\xE6\x5A\xF1\x88"
+                         "\x1F\x93\x2A\xC1\x35\xCC\x63\xFA"
+                         "\x6E\x05\x9C\x10\xA7\x3E\xD5\x49"
+                         "\xE0\x77\x0E\x82\x19\xB0\x24\xBB"
+                         "\x52\xE9\x5D\xF4\x8B\x22\x96\x2D"
+                         "\xC4\x38\xCF\x66\xFD\x71\x08\x9F"
+                         "\x13\xAA\x41\xD8\x4C\xE3\x7A\x11"
+                         "\x85\x1C\xB3\x27\xBE\x55\xEC\x60"
+                         "\xF7\x8E\x02\x99\x30\xC7\x3B\xD2"
+                         "\x69\x00\x74\x0B\xA2\x16\xAD\x44"
+                         "\xDB\x4F\xE6\x7D\x14\x88\x1F\xB6"
+                         "\x2A\xC1\x58\xEF\x63\xFA\x91\x05"
+                         "\x9C\x33\xCA\x3E\xD5\x6C\x03\x77"
+                         "\x0E\xA5\x19\xB0\x47\xDE\x52\xE9"
+                         "\x80\x17\x8B\x22\xB9\x2D\xC4\x5B"
+                         "\xF2\x66\xFD\x94\x08\x9F\x36\xCD"
+                         "\x41\xD8\x6F\x06\x7A\x11\xA8\x1C"
+                         "\xB3\x4A\xE1\x55\xEC\x83\x1A\x8E"
+                         "\x25\xBC\x30\xC7\x5E\xF5\x69\x00"
+                         "\x97\x0B\xA2\x39\xD0\x44\xDB\x72"
+                         "\x09\x7D\x14\xAB\x1F\xB6\x4D\xE4"
+                         "\x58\xEF\x86\x1D\x91\x28\xBF\x33"
+                         "\xCA\x61\xF8\x6C\x03\x9A\x0E\xA5"
+                         "\x3C\xD3\x47\xDE\x75\x0C\x80\x17"
+                         "\xAE\x22\xB9\x50\xE7\x5B\xF2\x89"
+                         "\x20\x94\x2B\xC2\x36\xCD\x64\xFB"
+                         "\x6F\x06\x9D\x11\xA8\x3F\xD6\x4A"
+                         "\xE1\x78\x0F\x83\x1A\xB1\x25\xBC"
+                         "\x53\xEA\x5E\xF5\x8C\x00\x97\x2E"
+                         "\xC5\x39\xD0\x67\xFE\x72\x09\xA0"
+                         "\x14\xAB\x42\xD9\x4D\xE4\x7B\x12"
+                         "\x86\x1D\xB4\x28\xBF\x56\xED\x61"
+                         "\xF8\x8F\x03\x9A\x31\xC8\x3C\xD3"
+                         "\x6A\x01\x75\x0C\xA3\x17\xAE\x45"
+                         "\xDC\x50\xE7\x7E\x15\x89\x20\xB7",
+               .rlen   = 496,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 496 - 16, 16 },
        },
 };
 
-static struct cipher_testvec aes_cbc_dec_tv_template[] = {
-       { /* From RFC 3602 */
-               .key    = "\x06\xa9\x21\x40\x36\xb8\xa1\x5b"
-                         "\x51\x2e\x03\xd5\x34\x12\x00\x06",
-               .klen   = 16,
-               .iv     = "\x3d\xaf\xba\x42\x9d\x9e\xb4\x30"
-                         "\xb4\x22\xda\x80\x2c\x9f\xac\x41",
-               .input  = "\xe3\x53\x77\x9c\x10\x79\xae\xb8"
-                         "\x27\x08\x94\x2d\xbe\x77\x18\x1a",
-               .ilen   = 16,
-               .result = "Single block msg",
-               .rlen   = 16,
-       }, {
-               .key    = "\xc2\x86\x69\x6d\x88\x7c\x9a\xa0"
-                         "\x61\x1b\xbb\x3e\x20\x25\xa4\x5a",
-               .klen   = 16,
-               .iv     = "\x56\x2e\x17\x99\x6d\x09\x3d\x28"
-                         "\xdd\xb3\xba\x69\x5a\x2e\x6f\x58",
-               .input  = "\xd2\x96\xcd\x94\xc2\xcc\xcf\x8a"
-                         "\x3a\x86\x30\x28\xb5\xe1\xdc\x0a"
-                         "\x75\x86\x60\x2d\x25\x3c\xff\xf9"
-                         "\x1b\x82\x66\xbe\xa6\xd6\x1a\xb1",
-               .ilen   = 32,
-               .result = "\x00\x01\x02\x03\x04\x05\x06\x07"
-                         "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
-                         "\x10\x11\x12\x13\x14\x15\x16\x17"
-                         "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
-               .rlen   = 32,
-       }, { /* From NIST SP800-38A */
-               .key    = "\x8e\x73\xb0\xf7\xda\x0e\x64\x52"
-                         "\xc8\x10\xf3\x2b\x80\x90\x79\xe5"
-                         "\x62\xf8\xea\xd2\x52\x2c\x6b\x7b",
-               .klen   = 24,
-               .iv     = "\x00\x01\x02\x03\x04\x05\x06\x07"
-                         "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
-               .input  = "\x4f\x02\x1d\xb2\x43\xbc\x63\x3d"
-                         "\x71\x78\x18\x3a\x9f\xa0\x71\xe8"
-                         "\xb4\xd9\xad\xa9\xad\x7d\xed\xf4"
-                         "\xe5\xe7\x38\x76\x3f\x69\x14\x5a"
-                         "\x57\x1b\x24\x20\x12\xfb\x7a\xe0"
-                         "\x7f\xa9\xba\xac\x3d\xf1\x02\xe0"
-                         "\x08\xb0\xe2\x79\x88\x59\x88\x81"
-                         "\xd9\x20\xa9\xe6\x4f\x56\x15\xcd",
-               .ilen   = 64,
-               .result = "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96"
-                         "\xe9\x3d\x7e\x11\x73\x93\x17\x2a"
-                         "\xae\x2d\x8a\x57\x1e\x03\xac\x9c"
-                         "\x9e\xb7\x6f\xac\x45\xaf\x8e\x51"
-                         "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11"
-                         "\xe5\xfb\xc1\x19\x1a\x0a\x52\xef"
-                         "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17"
-                         "\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
-               .rlen   = 64,
-       }, {
-               .key    = "\x60\x3d\xeb\x10\x15\xca\x71\xbe"
-                         "\x2b\x73\xae\xf0\x85\x7d\x77\x81"
-                         "\x1f\x35\x2c\x07\x3b\x61\x08\xd7"
-                         "\x2d\x98\x10\xa3\x09\x14\xdf\xf4",
+static struct cipher_testvec cast6_ctr_enc_tv_template[] = {
+       { /* Generated from TF test vectors */
+               .key    = "\x85\x62\x3F\x1C\xF9\xD6\x1C\xF9"
+                         "\xD6\xB3\x90\x6D\x4A\x90\x6D\x4A"
+                         "\x27\x04\xE1\x27\x04\xE1\xBE\x9B"
+                         "\x78\xBE\x9B\x78\x55\x32\x0F\x55",
                .klen   = 32,
-               .iv     = "\x00\x01\x02\x03\x04\x05\x06\x07"
-                         "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
-               .input  = "\xf5\x8c\x4c\x04\xd6\xe5\xf1\xba"
-                         "\x77\x9e\xab\xfb\x5f\x7b\xfb\xd6"
-                         "\x9c\xfc\x4e\x96\x7e\xdb\x80\x8d"
-                         "\x67\x9f\x77\x7b\xc6\x70\x2c\x7d"
-                         "\x39\xf2\x33\x69\xa9\xd9\xba\xcf"
-                         "\xa5\x30\xe2\x63\x04\x23\x14\x61"
-                         "\xb2\xeb\x05\xe2\xc3\x9b\xe9\xfc"
-                         "\xda\x6c\x19\x07\x8c\x6a\x9d\x1b",
-               .ilen   = 64,
-               .result = "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96"
-                         "\xe9\x3d\x7e\x11\x73\x93\x17\x2a"
-                         "\xae\x2d\x8a\x57\x1e\x03\xac\x9c"
-                         "\x9e\xb7\x6f\xac\x45\xaf\x8e\x51"
-                         "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11"
-                         "\xe5\xfb\xc1\x19\x1a\x0a\x52\xef"
-                         "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17"
-                         "\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
-               .rlen   = 64,
+               .iv     = "\xE2\x24\x89\xEE\x53\xB8\x1D\x5F"
+                         "\xC4\x29\x8E\xF3\x35\x9A\xFF\x64",
+               .input  = "\x56\xED\x84\x1B\x8F\x26\xBD\x31"
+                         "\xC8\x5F\xF6\x6A\x01\x98\x0C\xA3"
+                         "\x3A",
+               .ilen   = 17,
+               .result = "\x26\x0A\xF1\xE2\x3F\x8A\xEF\xA3"
+                         "\x53\x9A\x5E\x1B\x2A\x1A\xC6\x0A"
+                         "\x57",
+               .rlen   = 17,
+       }, { /* Generated from TF test vectors */
+               .key    = "\x85\x62\x3F\x1C\xF9\xD6\x1C\xF9"
+                         "\xD6\xB3\x90\x6D\x4A\x90\x6D\x4A"
+                         "\x27\x04\xE1\x27\x04\xE1\xBE\x9B"
+                         "\x78\xBE\x9B\x78\x55\x32\x0F\x55",
+               .klen   = 32,
+               .iv     = "\xE2\x24\x89\xEE\x53\xB8\x1D\x5F"
+                         "\xC4\x29\x8E\xF3\x35\x9A\xFF\x64",
+               .input  = "\x56\xED\x84\x1B\x8F\x26\xBD\x31"
+                         "\xC8\x5F\xF6\x6A\x01\x98\x0C\xA3"
+                         "\x3A\xD1\x45\xDC\x73\x0A\x7E\x15"
+                         "\xAC\x20\xB7\x4E\xE5\x59\xF0\x87"
+                         "\x1E\x92\x29\xC0\x34\xCB\x62\xF9"
+                         "\x6D\x04\x9B\x0F\xA6\x3D\xD4\x48"
+                         "\xDF\x76\x0D\x81\x18\xAF\x23\xBA"
+                         "\x51\xE8\x5C\xF3\x8A\x21\x95\x2C"
+                         "\xC3\x37\xCE\x65\xFC\x70\x07\x9E"
+                         "\x12\xA9\x40\xD7\x4B\xE2\x79\x10"
+                         "\x84\x1B\xB2\x26\xBD\x54\xEB\x5F"
+                         "\xF6\x8D\x01\x98\x2F\xC6\x3A\xD1"
+                         "\x68\xFF\x73\x0A\xA1\x15\xAC\x43"
+                         "\xDA\x4E\xE5\x7C\x13\x87\x1E\xB5"
+                         "\x29\xC0\x57\xEE\x62\xF9\x90\x04"
+                         "\x9B\x32\xC9\x3D\xD4\x6B\x02\x76"
+                         "\x0D\xA4\x18\xAF\x46\xDD\x51\xE8"
+                         "\x7F\x16\x8A\x21\xB8\x2C\xC3\x5A"
+                         "\xF1\x65\xFC\x93\x07\x9E\x35\xCC"
+                         "\x40\xD7\x6E\x05\x79\x10\xA7\x1B"
+                         "\xB2\x49\xE0\x54\xEB\x82\x19\x8D"
+                         "\x24\xBB\x2F\xC6\x5D\xF4\x68\xFF"
+                         "\x96\x0A\xA1\x38\xCF\x43\xDA\x71"
+                         "\x08\x7C\x13\xAA\x1E\xB5\x4C\xE3"
+                         "\x57\xEE\x85\x1C\x90\x27\xBE\x32"
+                         "\xC9\x60\xF7\x6B\x02\x99\x0D\xA4"
+                         "\x3B\xD2\x46\xDD\x74\x0B\x7F\x16"
+                         "\xAD\x21\xB8\x4F\xE6\x5A\xF1\x88"
+                         "\x1F\x93\x2A\xC1\x35\xCC\x63\xFA"
+                         "\x6E\x05\x9C\x10\xA7\x3E\xD5\x49"
+                         "\xE0\x77\x0E\x82\x19\xB0\x24\xBB"
+                         "\x52\xE9\x5D\xF4\x8B\x22\x96\x2D"
+                         "\xC4\x38\xCF\x66\xFD\x71\x08\x9F"
+                         "\x13\xAA\x41\xD8\x4C\xE3\x7A\x11"
+                         "\x85\x1C\xB3\x27\xBE\x55\xEC\x60"
+                         "\xF7\x8E\x02\x99\x30\xC7\x3B\xD2"
+                         "\x69\x00\x74\x0B\xA2\x16\xAD\x44"
+                         "\xDB\x4F\xE6\x7D\x14\x88\x1F\xB6"
+                         "\x2A\xC1\x58\xEF\x63\xFA\x91\x05"
+                         "\x9C\x33\xCA\x3E\xD5\x6C\x03\x77"
+                         "\x0E\xA5\x19\xB0\x47\xDE\x52\xE9"
+                         "\x80\x17\x8B\x22\xB9\x2D\xC4\x5B"
+                         "\xF2\x66\xFD\x94\x08\x9F\x36\xCD"
+                         "\x41\xD8\x6F\x06\x7A\x11\xA8\x1C"
+                         "\xB3\x4A\xE1\x55\xEC\x83\x1A\x8E"
+                         "\x25\xBC\x30\xC7\x5E\xF5\x69\x00"
+                         "\x97\x0B\xA2\x39\xD0\x44\xDB\x72"
+                         "\x09\x7D\x14\xAB\x1F\xB6\x4D\xE4"
+                         "\x58\xEF\x86\x1D\x91\x28\xBF\x33"
+                         "\xCA\x61\xF8\x6C\x03\x9A\x0E\xA5"
+                         "\x3C\xD3\x47\xDE\x75\x0C\x80\x17"
+                         "\xAE\x22\xB9\x50\xE7\x5B\xF2\x89"
+                         "\x20\x94\x2B\xC2\x36\xCD\x64\xFB"
+                         "\x6F\x06\x9D\x11\xA8\x3F\xD6\x4A"
+                         "\xE1\x78\x0F\x83\x1A\xB1\x25\xBC"
+                         "\x53\xEA\x5E\xF5\x8C\x00\x97\x2E"
+                         "\xC5\x39\xD0\x67\xFE\x72\x09\xA0"
+                         "\x14\xAB\x42\xD9\x4D\xE4\x7B\x12"
+                         "\x86\x1D\xB4\x28\xBF\x56\xED\x61"
+                         "\xF8\x8F\x03\x9A\x31\xC8\x3C\xD3"
+                         "\x6A\x01\x75\x0C\xA3\x17\xAE\x45"
+                         "\xDC\x50\xE7\x7E\x15\x89\x20\xB7",
+               .ilen   = 496,
+               .result = "\x26\x0A\xF1\xE2\x3F\x8A\xEF\xA3"
+                         "\x53\x9A\x5E\x1B\x2A\x1A\xC6\x0A"
+                         "\x57\xA3\xEF\x47\x2A\xE8\x88\xA7"
+                         "\x3C\xD0\xEC\xB9\x94\x50\x7D\x56"
+                         "\xBC\xE1\xC1\xF5\xE1\xEE\x12\xF8"
+                         "\x4F\x03\x82\x3A\x93\x6B\x4C\xD3"
+                         "\xE3\xF3\xFA\xC2\x23\x55\x98\x20"
+                         "\x49\x76\x9B\x6B\xC1\x23\xBF\xE5"
+                         "\xD4\xC4\x2F\x61\xE1\x67\x2A\x30"
+                         "\x6F\x29\xCA\x54\xF8\x1B\xA6\x7D"
+                         "\x66\x45\xEE\xC8\x19\xBE\x50\xF0"
+                         "\x5F\x65\xF8\x1E\x4D\x07\x87\xD9"
+                         "\xD3\xD9\x1B\x09\x89\xFD\x42\xC5"
+                         "\xDB\xEB\x86\xF1\x67\x04\x0F\x5C"
+                         "\x81\xDF\x82\x12\xC7\x4C\x1B\x07"
+                         "\xDE\xE6\xFA\x29\x86\xD1\xB0\xBA"
+                         "\x3D\x6A\x69\x76\xEC\x0F\xB4\xE6"
+                         "\xCD\xA7\xF8\xA8\xB8\xE0\x33\xF5"
+                         "\x49\x61\x22\x52\x64\x8C\x46\x41"
+                         "\x1F\x48\x5F\x4F\xA2\x89\x36\x17"
+                         "\x20\xF8\x2F\x8F\x4B\xFA\xF2\xC0"
+                         "\x1E\x18\xA2\xF8\xB7\x6D\x98\xE3"
+                         "\x00\x14\x15\x59\xC1\x30\x64\xAF"
+                         "\xA8\x01\x38\xAB\xD4\x8B\xEC\x7C"
+                         "\x44\x9A\xC6\x2C\x2E\x2B\x2B\xF4"
+                         "\x02\x37\xC4\x69\xEF\x36\xC1\xF3"
+                         "\xA0\xFB\xFE\x29\xAD\x39\xCF\xD0"
+                         "\x51\x73\xA3\x22\x42\x41\xAB\xD2"
+                         "\x0F\x50\x14\xB9\x54\xD3\xD4\xFA"
+                         "\xBF\xC9\xBB\xCE\xC4\x1D\x2D\xAF"
+                         "\xC9\x3F\x07\x87\x42\x4B\x3A\x54"
+                         "\x34\x8E\x37\xA3\x03\x6F\x65\x66"
+                         "\xDB\x44\xC3\xE8\xD7\xDD\x7D\xDD"
+                         "\x61\xB4\x2B\x80\xA3\x98\x13\xF5"
+                         "\x5A\xD3\x34\x58\xC3\x6E\xF6\xB8"
+                         "\x0A\xC6\x50\x01\x8E\xD5\x6C\x7D"
+                         "\xFE\x16\xB6\xCF\xFC\x51\x40\xAE"
+                         "\xB3\x15\xAC\x90\x6F\x0B\x28\x3A"
+                         "\x60\x40\x38\x90\x20\x46\xC7\xB3"
+                         "\x0B\x12\x6D\x3B\x15\x14\xF9\xF4"
+                         "\x11\x41\x76\x6B\xB3\x60\x82\x3C"
+                         "\x84\xFB\x08\x2E\x92\x25\xCB\x79"
+                         "\x6F\x58\xC5\x94\x00\x00\x47\xB6"
+                         "\x9E\xDC\x0F\x29\x70\x46\x20\x76"
+                         "\x65\x75\x66\x5C\x00\x96\xB3\xE1"
+                         "\x0B\xA7\x11\x8B\x2E\x61\x4E\x45"
+                         "\x73\xFC\x91\xAB\x79\x41\x23\x14"
+                         "\x13\xB6\x72\x6C\x46\xB3\x03\x11"
+                         "\xE4\xF1\xEE\xC9\x7A\xCF\x96\x32"
+                         "\xB6\xF0\x8B\x97\xB4\xCF\x82\xB7"
+                         "\x15\x48\x44\x99\x09\xF6\xE0\xD7"
+                         "\xBC\xF1\x5B\x91\x4F\x30\x22\xA2"
+                         "\x45\xC4\x68\x55\xC2\xBE\xA7\xD2"
+                         "\x12\x53\x35\x9C\xF9\xE7\x35\x5D"
+                         "\x81\xE4\x86\x42\xC3\x58\xFB\xF0"
+                         "\x38\x9B\x8E\x5A\xEF\x83\x33\x0F"
+                         "\x00\x4E\x3F\x9F\xF5\x84\x62\xC4"
+                         "\x19\x35\x88\x22\x45\x59\x0E\x8F"
+                         "\xEC\x27\xDD\x4A\xA4\x1F\xBC\x41"
+                         "\x9B\x66\x8D\x32\xBA\x81\x34\x87"
+                         "\x0E\x74\x33\x30\x62\xB9\x89\xDF"
+                         "\xF9\xC5\xDD\x27\xB3\x39\xCB\xCB",
+               .rlen   = 496,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 496 - 16, 16 },
        },
 };
 
-static struct aead_testvec hmac_sha1_aes_cbc_enc_tv_template[] = {
-       { /* RFC 3602 Case 1 */
-#ifdef __LITTLE_ENDIAN
-               .key    = "\x08\x00"            /* rta length */
-                         "\x01\x00"            /* rta type */
-#else
-               .key    = "\x00\x08"            /* rta length */
-                         "\x00\x01"            /* rta type */
-#endif
-                         "\x00\x00\x00\x10"    /* enc key length */
-                         "\x00\x00\x00\x00\x00\x00\x00\x00"
-                         "\x00\x00\x00\x00\x00\x00\x00\x00"
-                         "\x00\x00\x00\x00"
-                         "\x06\xa9\x21\x40\x36\xb8\xa1\x5b"
-                         "\x51\x2e\x03\xd5\x34\x12\x00\x06",
-               .klen   = 8 + 20 + 16,
+static struct cipher_testvec cast6_ctr_dec_tv_template[] = {
+       { /* Generated from TF test vectors */
+               .key    = "\x85\x62\x3F\x1C\xF9\xD6\x1C\xF9"
+                         "\xD6\xB3\x90\x6D\x4A\x90\x6D\x4A"
+                         "\x27\x04\xE1\x27\x04\xE1\xBE\x9B"
+                         "\x78\xBE\x9B\x78\x55\x32\x0F\x55",
+               .klen   = 32,
+               .iv     = "\xE2\x24\x89\xEE\x53\xB8\x1D\x5F"
+                         "\xC4\x29\x8E\xF3\x35\x9A\xFF\x64",
+               .input  = "\x26\x0A\xF1\xE2\x3F\x8A\xEF\xA3"
+                         "\x53\x9A\x5E\x1B\x2A\x1A\xC6\x0A"
+                         "\x57",
+               .ilen   = 17,
+               .result = "\x56\xED\x84\x1B\x8F\x26\xBD\x31"
+                         "\xC8\x5F\xF6\x6A\x01\x98\x0C\xA3"
+                         "\x3A",
+               .rlen   = 17,
+       }, { /* Generated from TF test vectors */
+               .key    = "\x85\x62\x3F\x1C\xF9\xD6\x1C\xF9"
+                         "\xD6\xB3\x90\x6D\x4A\x90\x6D\x4A"
+                         "\x27\x04\xE1\x27\x04\xE1\xBE\x9B"
+                         "\x78\xBE\x9B\x78\x55\x32\x0F\x55",
+               .klen   = 32,
+               .iv     = "\xE2\x24\x89\xEE\x53\xB8\x1D\x5F"
+                         "\xC4\x29\x8E\xF3\x35\x9A\xFF\x64",
+               .input  = "\x26\x0A\xF1\xE2\x3F\x8A\xEF\xA3"
+                         "\x53\x9A\x5E\x1B\x2A\x1A\xC6\x0A"
+                         "\x57\xA3\xEF\x47\x2A\xE8\x88\xA7"
+                         "\x3C\xD0\xEC\xB9\x94\x50\x7D\x56"
+                         "\xBC\xE1\xC1\xF5\xE1\xEE\x12\xF8"
+                         "\x4F\x03\x82\x3A\x93\x6B\x4C\xD3"
+                         "\xE3\xF3\xFA\xC2\x23\x55\x98\x20"
+                         "\x49\x76\x9B\x6B\xC1\x23\xBF\xE5"
+                         "\xD4\xC4\x2F\x61\xE1\x67\x2A\x30"
+                         "\x6F\x29\xCA\x54\xF8\x1B\xA6\x7D"
+                         "\x66\x45\xEE\xC8\x19\xBE\x50\xF0"
+                         "\x5F\x65\xF8\x1E\x4D\x07\x87\xD9"
+                         "\xD3\xD9\x1B\x09\x89\xFD\x42\xC5"
+                         "\xDB\xEB\x86\xF1\x67\x04\x0F\x5C"
+                         "\x81\xDF\x82\x12\xC7\x4C\x1B\x07"
+                         "\xDE\xE6\xFA\x29\x86\xD1\xB0\xBA"
+                         "\x3D\x6A\x69\x76\xEC\x0F\xB4\xE6"
+                         "\xCD\xA7\xF8\xA8\xB8\xE0\x33\xF5"
+                         "\x49\x61\x22\x52\x64\x8C\x46\x41"
+                         "\x1F\x48\x5F\x4F\xA2\x89\x36\x17"
+                         "\x20\xF8\x2F\x8F\x4B\xFA\xF2\xC0"
+                         "\x1E\x18\xA2\xF8\xB7\x6D\x98\xE3"
+                         "\x00\x14\x15\x59\xC1\x30\x64\xAF"
+                         "\xA8\x01\x38\xAB\xD4\x8B\xEC\x7C"
+                         "\x44\x9A\xC6\x2C\x2E\x2B\x2B\xF4"
+                         "\x02\x37\xC4\x69\xEF\x36\xC1\xF3"
+                         "\xA0\xFB\xFE\x29\xAD\x39\xCF\xD0"
+                         "\x51\x73\xA3\x22\x42\x41\xAB\xD2"
+                         "\x0F\x50\x14\xB9\x54\xD3\xD4\xFA"
+                         "\xBF\xC9\xBB\xCE\xC4\x1D\x2D\xAF"
+                         "\xC9\x3F\x07\x87\x42\x4B\x3A\x54"
+                         "\x34\x8E\x37\xA3\x03\x6F\x65\x66"
+                         "\xDB\x44\xC3\xE8\xD7\xDD\x7D\xDD"
+                         "\x61\xB4\x2B\x80\xA3\x98\x13\xF5"
+                         "\x5A\xD3\x34\x58\xC3\x6E\xF6\xB8"
+                         "\x0A\xC6\x50\x01\x8E\xD5\x6C\x7D"
+                         "\xFE\x16\xB6\xCF\xFC\x51\x40\xAE"
+                         "\xB3\x15\xAC\x90\x6F\x0B\x28\x3A"
+                         "\x60\x40\x38\x90\x20\x46\xC7\xB3"
+                         "\x0B\x12\x6D\x3B\x15\x14\xF9\xF4"
+                         "\x11\x41\x76\x6B\xB3\x60\x82\x3C"
+                         "\x84\xFB\x08\x2E\x92\x25\xCB\x79"
+                         "\x6F\x58\xC5\x94\x00\x00\x47\xB6"
+                         "\x9E\xDC\x0F\x29\x70\x46\x20\x76"
+                         "\x65\x75\x66\x5C\x00\x96\xB3\xE1"
+                         "\x0B\xA7\x11\x8B\x2E\x61\x4E\x45"
+                         "\x73\xFC\x91\xAB\x79\x41\x23\x14"
+                         "\x13\xB6\x72\x6C\x46\xB3\x03\x11"
+                         "\xE4\xF1\xEE\xC9\x7A\xCF\x96\x32"
+                         "\xB6\xF0\x8B\x97\xB4\xCF\x82\xB7"
+                         "\x15\x48\x44\x99\x09\xF6\xE0\xD7"
+                         "\xBC\xF1\x5B\x91\x4F\x30\x22\xA2"
+                         "\x45\xC4\x68\x55\xC2\xBE\xA7\xD2"
+                         "\x12\x53\x35\x9C\xF9\xE7\x35\x5D"
+                         "\x81\xE4\x86\x42\xC3\x58\xFB\xF0"
+                         "\x38\x9B\x8E\x5A\xEF\x83\x33\x0F"
+                         "\x00\x4E\x3F\x9F\xF5\x84\x62\xC4"
+                         "\x19\x35\x88\x22\x45\x59\x0E\x8F"
+                         "\xEC\x27\xDD\x4A\xA4\x1F\xBC\x41"
+                         "\x9B\x66\x8D\x32\xBA\x81\x34\x87"
+                         "\x0E\x74\x33\x30\x62\xB9\x89\xDF"
+                         "\xF9\xC5\xDD\x27\xB3\x39\xCB\xCB",
+               .ilen   = 496,
+               .result = "\x56\xED\x84\x1B\x8F\x26\xBD\x31"
+                         "\xC8\x5F\xF6\x6A\x01\x98\x0C\xA3"
+                         "\x3A\xD1\x45\xDC\x73\x0A\x7E\x15"
+                         "\xAC\x20\xB7\x4E\xE5\x59\xF0\x87"
+                         "\x1E\x92\x29\xC0\x34\xCB\x62\xF9"
+                         "\x6D\x04\x9B\x0F\xA6\x3D\xD4\x48"
+                         "\xDF\x76\x0D\x81\x18\xAF\x23\xBA"
+                         "\x51\xE8\x5C\xF3\x8A\x21\x95\x2C"
+                         "\xC3\x37\xCE\x65\xFC\x70\x07\x9E"
+                         "\x12\xA9\x40\xD7\x4B\xE2\x79\x10"
+                         "\x84\x1B\xB2\x26\xBD\x54\xEB\x5F"
+                         "\xF6\x8D\x01\x98\x2F\xC6\x3A\xD1"
+                         "\x68\xFF\x73\x0A\xA1\x15\xAC\x43"
+                         "\xDA\x4E\xE5\x7C\x13\x87\x1E\xB5"
+                         "\x29\xC0\x57\xEE\x62\xF9\x90\x04"
+                         "\x9B\x32\xC9\x3D\xD4\x6B\x02\x76"
+                         "\x0D\xA4\x18\xAF\x46\xDD\x51\xE8"
+                         "\x7F\x16\x8A\x21\xB8\x2C\xC3\x5A"
+                         "\xF1\x65\xFC\x93\x07\x9E\x35\xCC"
+                         "\x40\xD7\x6E\x05\x79\x10\xA7\x1B"
+                         "\xB2\x49\xE0\x54\xEB\x82\x19\x8D"
+                         "\x24\xBB\x2F\xC6\x5D\xF4\x68\xFF"
+                         "\x96\x0A\xA1\x38\xCF\x43\xDA\x71"
+                         "\x08\x7C\x13\xAA\x1E\xB5\x4C\xE3"
+                         "\x57\xEE\x85\x1C\x90\x27\xBE\x32"
+                         "\xC9\x60\xF7\x6B\x02\x99\x0D\xA4"
+                         "\x3B\xD2\x46\xDD\x74\x0B\x7F\x16"
+                         "\xAD\x21\xB8\x4F\xE6\x5A\xF1\x88"
+                         "\x1F\x93\x2A\xC1\x35\xCC\x63\xFA"
+                         "\x6E\x05\x9C\x10\xA7\x3E\xD5\x49"
+                         "\xE0\x77\x0E\x82\x19\xB0\x24\xBB"
+                         "\x52\xE9\x5D\xF4\x8B\x22\x96\x2D"
+                         "\xC4\x38\xCF\x66\xFD\x71\x08\x9F"
+                         "\x13\xAA\x41\xD8\x4C\xE3\x7A\x11"
+                         "\x85\x1C\xB3\x27\xBE\x55\xEC\x60"
+                         "\xF7\x8E\x02\x99\x30\xC7\x3B\xD2"
+                         "\x69\x00\x74\x0B\xA2\x16\xAD\x44"
+                         "\xDB\x4F\xE6\x7D\x14\x88\x1F\xB6"
+                         "\x2A\xC1\x58\xEF\x63\xFA\x91\x05"
+                         "\x9C\x33\xCA\x3E\xD5\x6C\x03\x77"
+                         "\x0E\xA5\x19\xB0\x47\xDE\x52\xE9"
+                         "\x80\x17\x8B\x22\xB9\x2D\xC4\x5B"
+                         "\xF2\x66\xFD\x94\x08\x9F\x36\xCD"
+                         "\x41\xD8\x6F\x06\x7A\x11\xA8\x1C"
+                         "\xB3\x4A\xE1\x55\xEC\x83\x1A\x8E"
+                         "\x25\xBC\x30\xC7\x5E\xF5\x69\x00"
+                         "\x97\x0B\xA2\x39\xD0\x44\xDB\x72"
+                         "\x09\x7D\x14\xAB\x1F\xB6\x4D\xE4"
+                         "\x58\xEF\x86\x1D\x91\x28\xBF\x33"
+                         "\xCA\x61\xF8\x6C\x03\x9A\x0E\xA5"
+                         "\x3C\xD3\x47\xDE\x75\x0C\x80\x17"
+                         "\xAE\x22\xB9\x50\xE7\x5B\xF2\x89"
+                         "\x20\x94\x2B\xC2\x36\xCD\x64\xFB"
+                         "\x6F\x06\x9D\x11\xA8\x3F\xD6\x4A"
+                         "\xE1\x78\x0F\x83\x1A\xB1\x25\xBC"
+                         "\x53\xEA\x5E\xF5\x8C\x00\x97\x2E"
+                         "\xC5\x39\xD0\x67\xFE\x72\x09\xA0"
+                         "\x14\xAB\x42\xD9\x4D\xE4\x7B\x12"
+                         "\x86\x1D\xB4\x28\xBF\x56\xED\x61"
+                         "\xF8\x8F\x03\x9A\x31\xC8\x3C\xD3"
+                         "\x6A\x01\x75\x0C\xA3\x17\xAE\x45"
+                         "\xDC\x50\xE7\x7E\x15\x89\x20\xB7",
+               .rlen   = 496,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 496 - 16, 16 },
+       },
+};
+
+static struct cipher_testvec cast6_lrw_enc_tv_template[] = {
+       { /* Generated from TF test vectors */
+               .key    = "\xf8\xd4\x76\xff\xd6\x46\xee\x6c"
+                         "\x23\x84\xcb\x1c\x77\xd6\x19\x5d"
+                         "\xfe\xf1\xa9\xf3\x7b\xbc\x8d\x21"
+                         "\xa7\x9c\x21\xf8\xcb\x90\x02\x89"
+                         "\xa8\x45\x34\x8e\xc8\xc5\xb5\xf1"
+                         "\x26\xf5\x0e\x76\xfe\xfd\x1b\x1e",
+               .klen   = 48,
+               .iv     = "\x00\x00\x00\x00\x00\x00\x00\x00"
+                         "\x00\x00\x00\x00\x00\x00\x00\x01",
+               .input  = "\x05\x11\xb7\x18\xab\xc6\x2d\xac"
+                         "\x70\x5d\xf6\x22\x94\xcd\xe5\x6c"
+                         "\x17\x6b\xf6\x1c\xf0\xf3\x6e\xf8"
+                         "\x50\x38\x1f\x71\x49\xb6\x57\xd6"
+                         "\x8f\xcb\x8d\x6b\xe3\xa6\x29\x90"
+                         "\xfe\x2a\x62\x82\xae\x6d\x8b\xf6"
+                         "\xad\x1e\x9e\x20\x5f\x38\xbe\x04"
+                         "\xda\x10\x8e\xed\xa2\xa4\x87\xab"
+                         "\xda\x6b\xb4\x0c\x75\xba\xd3\x7c"
+                         "\xc9\xac\x42\x31\x95\x7c\xc9\x04"
+                         "\xeb\xd5\x6e\x32\x69\x8a\xdb\xa6"
+                         "\x15\xd7\x3f\x4f\x2f\x66\x69\x03"
+                         "\x9c\x1f\x54\x0f\xde\x1f\xf3\x65"
+                         "\x4c\x96\x12\xed\x7c\x92\x03\x01"
+                         "\x6f\xbc\x35\x93\xac\xf1\x27\xf1"
+                         "\xb4\x96\x82\x5a\x5f\xb0\xa0\x50"
+                         "\x89\xa4\x8e\x66\x44\x85\xcc\xfd"
+                         "\x33\x14\x70\xe3\x96\xb2\xc3\xd3"
+                         "\xbb\x54\x5a\x1a\xf9\x74\xa2\xc5"
+                         "\x2d\x64\x75\xdd\xb4\x54\xe6\x74"
+                         "\x8c\xd3\x9d\x9e\x86\xab\x51\x53"
+                         "\xb7\x93\x3e\x6f\xd0\x4e\x2c\x40"
+                         "\xf6\xa8\x2e\x3e\x9d\xf4\x66\xa5"
+                         "\x76\x12\x73\x44\x1a\x56\xd7\x72"
+                         "\x88\xcd\x21\x8c\x4c\x0f\xfe\xda"
+                         "\x95\xe0\x3a\xa6\xa5\x84\x46\xcd"
+                         "\xd5\x3e\x9d\x3a\xe2\x67\xe6\x60"
+                         "\x1a\xe2\x70\x85\x58\xc2\x1b\x09"
+                         "\xe1\xd7\x2c\xca\xad\xa8\x8f\xf9"
+                         "\xac\xb3\x0e\xdb\xca\x2e\xe2\xb8"
+                         "\x51\x71\xd9\x3c\x6c\xf1\x56\xf8"
+                         "\xea\x9c\xf1\xfb\x0c\xe6\xb7\x10"
+                         "\x1c\xf8\xa9\x7c\xe8\x53\x35\xc1"
+                         "\x90\x3e\x76\x4a\x74\xa4\x21\x2c"
+                         "\xf6\x2c\x4e\x0f\x94\x3a\x88\x2e"
+                         "\x41\x09\x6a\x33\x7d\xf6\xdd\x3f"
+                         "\x8d\x23\x31\x74\x84\xeb\x88\x6e"
+                         "\xcc\xb9\xbc\x22\x83\x19\x07\x22"
+                         "\xa5\x2d\xdf\xa5\xf3\x80\x85\x78"
+                         "\x84\x39\x6a\x6d\x6a\x99\x4f\xa5"
+                         "\x15\xfe\x46\xb0\xe4\x6c\xa5\x41"
+                         "\x3c\xce\x8f\x42\x60\x71\xa7\x75"
+                         "\x08\x40\x65\x8a\x82\xbf\xf5\x43"
+                         "\x71\x96\xa9\x4d\x44\x8a\x20\xbe"
+                         "\xfa\x4d\xbb\xc0\x7d\x31\x96\x65"
+                         "\xe7\x75\xe5\x3e\xfd\x92\x3b\xc9"
+                         "\x55\xbb\x16\x7e\xf7\xc2\x8c\xa4"
+                         "\x40\x1d\xe5\xef\x0e\xdf\xe4\x9a"
+                         "\x62\x73\x65\xfd\x46\x63\x25\x3d"
+                         "\x2b\xaf\xe5\x64\xfe\xa5\x5c\xcf"
+                         "\x24\xf3\xb4\xac\x64\xba\xdf\x4b"
+                         "\xc6\x96\x7d\x81\x2d\x8d\x97\xf7"
+                         "\xc5\x68\x77\x84\x32\x2b\xcc\x85"
+                         "\x74\x96\xf0\x12\x77\x61\xb9\xeb"
+                         "\x71\xaa\x82\xcb\x1c\xdb\x89\xc8"
+                         "\xc6\xb5\xe3\x5c\x7d\x39\x07\x24"
+                         "\xda\x39\x87\x45\xc0\x2b\xbb\x01"
+                         "\xac\xbc\x2a\x5c\x7f\xfc\xe8\xce"
+                         "\x6d\x9c\x6f\xed\xd3\xc1\xa1\xd6"
+                         "\xc5\x55\xa9\x66\x2f\xe1\xc8\x32"
+                         "\xa6\x5d\xa4\x3a\x98\x73\xe8\x45"
+                         "\xa4\xc7\xa8\xb4\xf6\x13\x03\xf6"
+                         "\xe9\x2e\xc4\x29\x0f\x84\xdb\xc4"
+                         "\x21\xc4\xc2\x75\x67\x89\x37\x0a",
+               .ilen   = 512,
+               .result = "\x55\x25\x09\x8B\xB5\xD5\xF8\xBF"
+                         "\x37\x4A\xFE\x3C\x47\xD8\xE6\xEB"
+                         "\xCA\xA4\x9B\xB0\xAB\x6D\x64\xCA"
+                         "\x58\xB6\x73\xF0\xD7\x52\x34\xEF"
+                         "\xFB\x3E\x96\x81\xB7\x71\x34\xA4"
+                         "\x55\x20\xBE\x39\x5A\x2B\xF9\xD1"
+                         "\x65\x0B\xDA\xD3\x7E\xB3\xA6\xF7"
+                         "\x2E\x0B\x5A\x52\xDB\x39\x8C\x9B"
+                         "\x61\x17\x5F\xAF\xB6\x5A\xC8\x08"
+                         "\xA7\xB7\x2A\x11\x7C\x97\x38\x9D"
+                         "\x59\x0E\x66\x59\x5E\xD8\x8B\xCE"
+                         "\x70\xE0\xC3\x42\xB0\x8C\x0F\xBA"
+                         "\xB2\x0D\x81\xB6\xBE\x61\x1C\x2D"
+                         "\x7E\xEA\x91\x25\xAC\xEC\xF8\x28"
+                         "\x80\x1D\xF0\x30\xBA\x62\x77\x7D"
+                         "\xDB\x15\x69\xDF\xFA\x2A\x81\x64"
+                         "\x95\x5B\xA4\x7F\x3E\x4F\xE3\x30"
+                         "\xB0\x5C\xC2\x05\xF8\xF0\x29\xE7"
+                         "\x0A\xA0\x66\xB2\x5D\x0F\x39\x2B"
+                         "\xB4\xB3\x00\xA9\xD0\xAB\x63\x61"
+                         "\x5E\xDB\xFC\x11\x74\x25\x96\x65"
+                         "\xE8\xE2\x34\x57\x77\x15\x5E\x70"
+                         "\xFF\x10\x90\xC3\x64\xF0\x11\x0A"
+                         "\x63\x3A\xD3\x55\x92\x15\x4B\x0C"
+                         "\xC7\x08\x89\x17\x3B\x99\xAD\x63"
+                         "\xE7\x06\xDF\x52\xBC\x15\x64\x45"
+                         "\x9D\x7A\xFB\x69\xBC\x2D\x6E\xA9"
+                         "\x35\xD9\xD8\xF5\x0C\xC4\xA2\x23"
+                         "\x9C\x18\x8B\xA8\x8C\xFE\xF8\x0E"
+                         "\xBD\xAB\x60\x1A\x51\x17\x54\x27"
+                         "\xB6\xE8\xBE\x0F\xA9\xA5\x82\x19"
+                         "\x2F\x6F\x20\xA7\x47\xED\x74\x6C"
+                         "\x4E\xC1\xF8\x8C\x14\xF3\xBB\x1F"
+                         "\xED\x4D\x8F\x7C\x37\xEF\x19\xA1"
+                         "\x07\x16\xDE\x76\xCC\x5E\x94\x02"
+                         "\xFB\xBF\xE4\x81\x50\xCE\xFC\x0F"
+                         "\x9E\xCF\x3D\xF6\x67\x00\xBF\xA7"
+                         "\x6E\x21\x58\x36\x06\xDE\xB3\xD4"
+                         "\xA2\xFA\xD8\x4E\xE0\xB9\x7F\x23"
+                         "\x51\x21\x2B\x32\x68\xAA\xF8\xA8"
+                         "\x93\x08\xB5\x6D\xE6\x43\x2C\xB7"
+                         "\x31\xB2\x0F\xD0\xA2\x51\xC0\x25"
+                         "\x30\xC7\x10\x3F\x97\x27\x01\x8E"
+                         "\xFA\xD8\x4F\x78\xD8\x2E\x1D\xEB"
+                         "\xA1\x37\x52\x0F\x7B\x5E\x87\xA8"
+                         "\x22\xE2\xE6\x92\xA7\x5F\x11\x32"
+                         "\xCC\x93\x34\xFC\xD1\x7E\xAE\x54"
+                         "\xBC\x6A\x1B\x91\xD1\x2E\x21\xEC"
+                         "\x5D\xF1\xC4\xF1\x55\x20\xBF\xE5"
+                         "\x96\x3D\x69\x91\x20\x4E\xF2\x61"
+                         "\xDA\x77\xFE\xEE\xC3\x74\x57\x2A"
+                         "\x78\x39\xB0\xE0\xCF\x12\x56\xD6"
+                         "\x05\xDC\xF9\x19\x66\x44\x1D\xF9"
+                         "\x82\x37\xD4\xC2\x60\xB6\x31\xDF"
+                         "\x0C\xAF\xBC\x8B\x55\x9A\xC8\x2D"
+                         "\xAB\xA7\x88\x7B\x41\xE8\x29\xC9"
+                         "\x9B\x8D\xA7\x00\x86\x25\xB6\x14"
+                         "\xF5\x13\x73\xD7\x4B\x6B\x83\xF3"
+                         "\xAF\x96\x00\xE4\xB7\x3C\x65\xA6"
+                         "\x15\xB7\x94\x7D\x4E\x70\x4C\x75"
+                         "\xF3\xB4\x02\xA9\x17\x1C\x7A\x0A"
+                         "\xC0\xD5\x33\x11\x56\xDE\xDC\xF5"
+                         "\x8D\xD9\xCD\x3B\x22\x67\x18\xC7"
+                         "\xC4\xF5\x99\x61\xBC\xBB\x5B\x46",
+               .rlen   = 512,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 512 - 16, 16 },
+       },
+};
+
+static struct cipher_testvec cast6_lrw_dec_tv_template[] = {
+       { /* Generated from TF test vectors */
+               .key    = "\xf8\xd4\x76\xff\xd6\x46\xee\x6c"
+                         "\x23\x84\xcb\x1c\x77\xd6\x19\x5d"
+                         "\xfe\xf1\xa9\xf3\x7b\xbc\x8d\x21"
+                         "\xa7\x9c\x21\xf8\xcb\x90\x02\x89"
+                         "\xa8\x45\x34\x8e\xc8\xc5\xb5\xf1"
+                         "\x26\xf5\x0e\x76\xfe\xfd\x1b\x1e",
+               .klen   = 48,
+               .iv     = "\x00\x00\x00\x00\x00\x00\x00\x00"
+                         "\x00\x00\x00\x00\x00\x00\x00\x01",
+               .input  = "\x55\x25\x09\x8B\xB5\xD5\xF8\xBF"
+                         "\x37\x4A\xFE\x3C\x47\xD8\xE6\xEB"
+                         "\xCA\xA4\x9B\xB0\xAB\x6D\x64\xCA"
+                         "\x58\xB6\x73\xF0\xD7\x52\x34\xEF"
+                         "\xFB\x3E\x96\x81\xB7\x71\x34\xA4"
+                         "\x55\x20\xBE\x39\x5A\x2B\xF9\xD1"
+                         "\x65\x0B\xDA\xD3\x7E\xB3\xA6\xF7"
+                         "\x2E\x0B\x5A\x52\xDB\x39\x8C\x9B"
+                         "\x61\x17\x5F\xAF\xB6\x5A\xC8\x08"
+                         "\xA7\xB7\x2A\x11\x7C\x97\x38\x9D"
+                         "\x59\x0E\x66\x59\x5E\xD8\x8B\xCE"
+                         "\x70\xE0\xC3\x42\xB0\x8C\x0F\xBA"
+                         "\xB2\x0D\x81\xB6\xBE\x61\x1C\x2D"
+                         "\x7E\xEA\x91\x25\xAC\xEC\xF8\x28"
+                         "\x80\x1D\xF0\x30\xBA\x62\x77\x7D"
+                         "\xDB\x15\x69\xDF\xFA\x2A\x81\x64"
+                         "\x95\x5B\xA4\x7F\x3E\x4F\xE3\x30"
+                         "\xB0\x5C\xC2\x05\xF8\xF0\x29\xE7"
+                         "\x0A\xA0\x66\xB2\x5D\x0F\x39\x2B"
+                         "\xB4\xB3\x00\xA9\xD0\xAB\x63\x61"
+                         "\x5E\xDB\xFC\x11\x74\x25\x96\x65"
+                         "\xE8\xE2\x34\x57\x77\x15\x5E\x70"
+                         "\xFF\x10\x90\xC3\x64\xF0\x11\x0A"
+                         "\x63\x3A\xD3\x55\x92\x15\x4B\x0C"
+                         "\xC7\x08\x89\x17\x3B\x99\xAD\x63"
+                         "\xE7\x06\xDF\x52\xBC\x15\x64\x45"
+                         "\x9D\x7A\xFB\x69\xBC\x2D\x6E\xA9"
+                         "\x35\xD9\xD8\xF5\x0C\xC4\xA2\x23"
+                         "\x9C\x18\x8B\xA8\x8C\xFE\xF8\x0E"
+                         "\xBD\xAB\x60\x1A\x51\x17\x54\x27"
+                         "\xB6\xE8\xBE\x0F\xA9\xA5\x82\x19"
+                         "\x2F\x6F\x20\xA7\x47\xED\x74\x6C"
+                         "\x4E\xC1\xF8\x8C\x14\xF3\xBB\x1F"
+                         "\xED\x4D\x8F\x7C\x37\xEF\x19\xA1"
+                         "\x07\x16\xDE\x76\xCC\x5E\x94\x02"
+                         "\xFB\xBF\xE4\x81\x50\xCE\xFC\x0F"
+                         "\x9E\xCF\x3D\xF6\x67\x00\xBF\xA7"
+                         "\x6E\x21\x58\x36\x06\xDE\xB3\xD4"
+                         "\xA2\xFA\xD8\x4E\xE0\xB9\x7F\x23"
+                         "\x51\x21\x2B\x32\x68\xAA\xF8\xA8"
+                         "\x93\x08\xB5\x6D\xE6\x43\x2C\xB7"
+                         "\x31\xB2\x0F\xD0\xA2\x51\xC0\x25"
+                         "\x30\xC7\x10\x3F\x97\x27\x01\x8E"
+                         "\xFA\xD8\x4F\x78\xD8\x2E\x1D\xEB"
+                         "\xA1\x37\x52\x0F\x7B\x5E\x87\xA8"
+                         "\x22\xE2\xE6\x92\xA7\x5F\x11\x32"
+                         "\xCC\x93\x34\xFC\xD1\x7E\xAE\x54"
+                         "\xBC\x6A\x1B\x91\xD1\x2E\x21\xEC"
+                         "\x5D\xF1\xC4\xF1\x55\x20\xBF\xE5"
+                         "\x96\x3D\x69\x91\x20\x4E\xF2\x61"
+                         "\xDA\x77\xFE\xEE\xC3\x74\x57\x2A"
+                         "\x78\x39\xB0\xE0\xCF\x12\x56\xD6"
+                         "\x05\xDC\xF9\x19\x66\x44\x1D\xF9"
+                         "\x82\x37\xD4\xC2\x60\xB6\x31\xDF"
+                         "\x0C\xAF\xBC\x8B\x55\x9A\xC8\x2D"
+                         "\xAB\xA7\x88\x7B\x41\xE8\x29\xC9"
+                         "\x9B\x8D\xA7\x00\x86\x25\xB6\x14"
+                         "\xF5\x13\x73\xD7\x4B\x6B\x83\xF3"
+                         "\xAF\x96\x00\xE4\xB7\x3C\x65\xA6"
+                         "\x15\xB7\x94\x7D\x4E\x70\x4C\x75"
+                         "\xF3\xB4\x02\xA9\x17\x1C\x7A\x0A"
+                         "\xC0\xD5\x33\x11\x56\xDE\xDC\xF5"
+                         "\x8D\xD9\xCD\x3B\x22\x67\x18\xC7"
+                         "\xC4\xF5\x99\x61\xBC\xBB\x5B\x46",
+               .ilen   = 512,
+               .result = "\x05\x11\xb7\x18\xab\xc6\x2d\xac"
+                         "\x70\x5d\xf6\x22\x94\xcd\xe5\x6c"
+                         "\x17\x6b\xf6\x1c\xf0\xf3\x6e\xf8"
+                         "\x50\x38\x1f\x71\x49\xb6\x57\xd6"
+                         "\x8f\xcb\x8d\x6b\xe3\xa6\x29\x90"
+                         "\xfe\x2a\x62\x82\xae\x6d\x8b\xf6"
+                         "\xad\x1e\x9e\x20\x5f\x38\xbe\x04"
+                         "\xda\x10\x8e\xed\xa2\xa4\x87\xab"
+                         "\xda\x6b\xb4\x0c\x75\xba\xd3\x7c"
+                         "\xc9\xac\x42\x31\x95\x7c\xc9\x04"
+                         "\xeb\xd5\x6e\x32\x69\x8a\xdb\xa6"
+                         "\x15\xd7\x3f\x4f\x2f\x66\x69\x03"
+                         "\x9c\x1f\x54\x0f\xde\x1f\xf3\x65"
+                         "\x4c\x96\x12\xed\x7c\x92\x03\x01"
+                         "\x6f\xbc\x35\x93\xac\xf1\x27\xf1"
+                         "\xb4\x96\x82\x5a\x5f\xb0\xa0\x50"
+                         "\x89\xa4\x8e\x66\x44\x85\xcc\xfd"
+                         "\x33\x14\x70\xe3\x96\xb2\xc3\xd3"
+                         "\xbb\x54\x5a\x1a\xf9\x74\xa2\xc5"
+                         "\x2d\x64\x75\xdd\xb4\x54\xe6\x74"
+                         "\x8c\xd3\x9d\x9e\x86\xab\x51\x53"
+                         "\xb7\x93\x3e\x6f\xd0\x4e\x2c\x40"
+                         "\xf6\xa8\x2e\x3e\x9d\xf4\x66\xa5"
+                         "\x76\x12\x73\x44\x1a\x56\xd7\x72"
+                         "\x88\xcd\x21\x8c\x4c\x0f\xfe\xda"
+                         "\x95\xe0\x3a\xa6\xa5\x84\x46\xcd"
+                         "\xd5\x3e\x9d\x3a\xe2\x67\xe6\x60"
+                         "\x1a\xe2\x70\x85\x58\xc2\x1b\x09"
+                         "\xe1\xd7\x2c\xca\xad\xa8\x8f\xf9"
+                         "\xac\xb3\x0e\xdb\xca\x2e\xe2\xb8"
+                         "\x51\x71\xd9\x3c\x6c\xf1\x56\xf8"
+                         "\xea\x9c\xf1\xfb\x0c\xe6\xb7\x10"
+                         "\x1c\xf8\xa9\x7c\xe8\x53\x35\xc1"
+                         "\x90\x3e\x76\x4a\x74\xa4\x21\x2c"
+                         "\xf6\x2c\x4e\x0f\x94\x3a\x88\x2e"
+                         "\x41\x09\x6a\x33\x7d\xf6\xdd\x3f"
+                         "\x8d\x23\x31\x74\x84\xeb\x88\x6e"
+                         "\xcc\xb9\xbc\x22\x83\x19\x07\x22"
+                         "\xa5\x2d\xdf\xa5\xf3\x80\x85\x78"
+                         "\x84\x39\x6a\x6d\x6a\x99\x4f\xa5"
+                         "\x15\xfe\x46\xb0\xe4\x6c\xa5\x41"
+                         "\x3c\xce\x8f\x42\x60\x71\xa7\x75"
+                         "\x08\x40\x65\x8a\x82\xbf\xf5\x43"
+                         "\x71\x96\xa9\x4d\x44\x8a\x20\xbe"
+                         "\xfa\x4d\xbb\xc0\x7d\x31\x96\x65"
+                         "\xe7\x75\xe5\x3e\xfd\x92\x3b\xc9"
+                         "\x55\xbb\x16\x7e\xf7\xc2\x8c\xa4"
+                         "\x40\x1d\xe5\xef\x0e\xdf\xe4\x9a"
+                         "\x62\x73\x65\xfd\x46\x63\x25\x3d"
+                         "\x2b\xaf\xe5\x64\xfe\xa5\x5c\xcf"
+                         "\x24\xf3\xb4\xac\x64\xba\xdf\x4b"
+                         "\xc6\x96\x7d\x81\x2d\x8d\x97\xf7"
+                         "\xc5\x68\x77\x84\x32\x2b\xcc\x85"
+                         "\x74\x96\xf0\x12\x77\x61\xb9\xeb"
+                         "\x71\xaa\x82\xcb\x1c\xdb\x89\xc8"
+                         "\xc6\xb5\xe3\x5c\x7d\x39\x07\x24"
+                         "\xda\x39\x87\x45\xc0\x2b\xbb\x01"
+                         "\xac\xbc\x2a\x5c\x7f\xfc\xe8\xce"
+                         "\x6d\x9c\x6f\xed\xd3\xc1\xa1\xd6"
+                         "\xc5\x55\xa9\x66\x2f\xe1\xc8\x32"
+                         "\xa6\x5d\xa4\x3a\x98\x73\xe8\x45"
+                         "\xa4\xc7\xa8\xb4\xf6\x13\x03\xf6"
+                         "\xe9\x2e\xc4\x29\x0f\x84\xdb\xc4"
+                         "\x21\xc4\xc2\x75\x67\x89\x37\x0a",
+               .rlen   = 512,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 512 - 16, 16 },
+       },
+};
+
+static struct cipher_testvec cast6_xts_enc_tv_template[] = {
+       { /* Generated from TF test vectors */
+               .key    = "\x27\x18\x28\x18\x28\x45\x90\x45"
+                         "\x23\x53\x60\x28\x74\x71\x35\x26"
+                         "\x62\x49\x77\x57\x24\x70\x93\x69"
+                         "\x99\x59\x57\x49\x66\x96\x76\x27"
+                         "\x31\x41\x59\x26\x53\x58\x97\x93"
+                         "\x23\x84\x62\x64\x33\x83\x27\x95"
+                         "\x02\x88\x41\x97\x16\x93\x99\x37"
+                         "\x51\x05\x82\x09\x74\x94\x45\x92",
+               .klen   = 64,
+               .iv     = "\xff\x00\x00\x00\x00\x00\x00\x00"
+                         "\x00\x00\x00\x00\x00\x00\x00\x00",
+               .input  = "\x00\x01\x02\x03\x04\x05\x06\x07"
+                         "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
+                         "\x10\x11\x12\x13\x14\x15\x16\x17"
+                         "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
+                         "\x20\x21\x22\x23\x24\x25\x26\x27"
+                         "\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f"
+                         "\x30\x31\x32\x33\x34\x35\x36\x37"
+                         "\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f"
+                         "\x40\x41\x42\x43\x44\x45\x46\x47"
+                         "\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f"
+                         "\x50\x51\x52\x53\x54\x55\x56\x57"
+                         "\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f"
+                         "\x60\x61\x62\x63\x64\x65\x66\x67"
+                         "\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f"
+                         "\x70\x71\x72\x73\x74\x75\x76\x77"
+                         "\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f"
+                         "\x80\x81\x82\x83\x84\x85\x86\x87"
+                         "\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
+                         "\x90\x91\x92\x93\x94\x95\x96\x97"
+                         "\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
+                         "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7"
+                         "\xa8\xa9\xaa\xab\xac\xad\xae\xaf"
+                         "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7"
+                         "\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
+                         "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
+                         "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
+                         "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7"
+                         "\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf"
+                         "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7"
+                         "\xe8\xe9\xea\xeb\xec\xed\xee\xef"
+                         "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7"
+                         "\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"
+                         "\x00\x01\x02\x03\x04\x05\x06\x07"
+                         "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
+                         "\x10\x11\x12\x13\x14\x15\x16\x17"
+                         "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
+                         "\x20\x21\x22\x23\x24\x25\x26\x27"
+                         "\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f"
+                         "\x30\x31\x32\x33\x34\x35\x36\x37"
+                         "\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f"
+                         "\x40\x41\x42\x43\x44\x45\x46\x47"
+                         "\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f"
+                         "\x50\x51\x52\x53\x54\x55\x56\x57"
+                         "\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f"
+                         "\x60\x61\x62\x63\x64\x65\x66\x67"
+                         "\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f"
+                         "\x70\x71\x72\x73\x74\x75\x76\x77"
+                         "\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f"
+                         "\x80\x81\x82\x83\x84\x85\x86\x87"
+                         "\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
+                         "\x90\x91\x92\x93\x94\x95\x96\x97"
+                         "\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
+                         "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7"
+                         "\xa8\xa9\xaa\xab\xac\xad\xae\xaf"
+                         "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7"
+                         "\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
+                         "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
+                         "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
+                         "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7"
+                         "\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf"
+                         "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7"
+                         "\xe8\xe9\xea\xeb\xec\xed\xee\xef"
+                         "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7"
+                         "\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff",
+               .ilen   = 512,
+               .result = "\xDE\x6F\x22\xA5\xE8\x39\xE8\x78"
+                         "\x88\x5A\x4F\x8D\x82\x76\x52\x6D"
+                         "\xB2\x41\x16\xF4\x2B\xA6\xEB\xF6"
+                         "\xE2\xC5\x62\x8D\x61\xA1\x01\xED"
+                         "\xD9\x38\x01\xC1\x43\x63\x4E\x88"
+                         "\xC9\x4B\x5A\x88\x80\xB7\x5C\x71"
+                         "\x47\xEE\x11\xD8\xB7\x2D\x5D\x13"
+                         "\x1A\xB1\x68\x5B\x61\xA7\xA9\x81"
+                         "\x8B\x83\xA1\x6A\xAA\x36\xD6\xB6"
+                         "\x60\x54\x09\x32\xFE\x6A\x76\x2E"
+                         "\x28\xFF\xD5\xD6\xDD\x1D\x45\x7D"
+                         "\xF0\x8B\xF3\x32\x4E\x6C\x12\xCB"
+                         "\xB8\x25\x70\xF8\x40\xBC\x90\x1B"
+                         "\x11\xC3\x59\xAF\xF0\x2F\x92\xDD"
+                         "\xD3\x3B\xCF\x60\xA1\x78\x94\x57"
+                         "\xAF\x76\xC1\x67\xA6\x3C\xCD\x98"
+                         "\xB1\xF7\x27\xB9\xA3\xBD\x10\xEA"
+                         "\xCD\x8B\xC2\xF2\x14\xF2\xB2\x67"
+                         "\x05\xDD\x1D\x58\x6E\x2F\x95\x08"
+                         "\x3A\xF8\x78\x76\x82\x56\xA7\xEC"
+                         "\x51\x4B\x85\x77\xC2\x4C\x4A\x34"
+                         "\x71\x38\x17\x91\x44\xE8\xFC\x65"
+                         "\x99\x0D\x52\x91\xEE\xF8\xEF\x27"
+                         "\x2A\x9E\x6E\x78\xC4\x26\x87\xF4"
+                         "\x8A\xF0\x2D\x04\xE8\x14\x92\x5D"
+                         "\x59\x22\x9B\x29\x5C\x18\xF0\xC3"
+                         "\x47\xF3\x76\xD8\xE4\xF3\x1B\xD1"
+                         "\x70\xA3\x0D\xB5\x70\x02\x1D\xA3"
+                         "\x91\x3B\x49\x73\x18\xAB\xD4\xC9"
+                         "\xC3\x1E\xEF\x1F\xFE\xD5\x59\x8A"
+                         "\xD7\xF6\xC9\x71\x67\x79\xD7\x0E"
+                         "\xBE\x1F\x8E\xEC\x55\x7E\x4F\x24"
+                         "\xE6\x87\xEA\xFE\x96\x25\x67\x8E"
+                         "\x93\x03\xFA\xFF\xCE\xAF\xB2\x3C"
+                         "\x6F\xEB\x57\xFB\xD3\x28\x87\xA9"
+                         "\xCE\xC2\xF5\x9C\xC6\x67\xB5\x97"
+                         "\x49\xF7\x04\xCB\xEF\x84\x98\x33"
+                         "\xAF\x38\xD3\x04\x1C\x24\x71\x38"
+                         "\xC7\x71\xDD\x43\x0D\x12\x4A\x18"
+                         "\xBA\xC4\xAF\xBA\xB2\x5B\xEB\x95"
+                         "\x02\x43\x5D\xCE\x19\xCC\xCD\x66"
+                         "\x91\x0B\x8C\x7F\x51\xC4\xBF\x3C"
+                         "\x8B\xF1\xCC\xAA\x29\xD7\x87\xCB"
+                         "\x3E\xC5\xF3\xC9\x75\xE8\xA3\x5B"
+                         "\x30\x45\xA9\xB7\xAF\x80\x64\x6F"
+                         "\x75\x4A\xA7\xC0\x6D\x19\x6B\xDE"
+                         "\x17\xDE\x6D\xEA\x87\x9F\x95\xAE"
+                         "\xF5\x3C\xEE\x54\xB8\x27\x84\xF8"
+                         "\x97\xA3\xE1\x6F\x38\x24\x34\x88"
+                         "\xCE\xBD\x32\x52\xE0\x00\x6C\x94"
+                         "\xC9\xD7\x5D\x37\x81\x33\x2E\x7F"
+                         "\x4F\x7E\x2E\x0D\x94\xBD\xEA\x59"
+                         "\x34\x39\xA8\x35\x12\xB7\xBC\xAC"
+                         "\xEA\x52\x9C\x78\x02\x6D\x92\x36"
+                         "\xFB\x59\x2B\xA4\xEA\x7B\x1B\x83"
+                         "\xE1\x4D\x5E\x2A\x7E\x92\xB1\x64"
+                         "\xDE\xE0\x27\x4B\x0A\x6F\x4C\xE3"
+                         "\xB0\xEB\x31\xE4\x69\x95\xAB\x35"
+                         "\x8B\x2C\xF5\x6B\x7F\xF1\xA2\x82"
+                         "\xF8\xD9\x47\x82\xA9\x82\x03\x91"
+                         "\x69\x1F\xBE\x4C\xE7\xC7\x34\x2F"
+                         "\x45\x72\x80\x17\x81\xBD\x9D\x62"
+                         "\xA1\xAC\xE8\xCF\xC6\x74\xCF\xDC"
+                         "\x22\x60\x4E\xE8\xA4\x5D\x85\xB9",
+               .rlen   = 512,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 512 - 16, 16 },
+       },
+};
+
+static struct cipher_testvec cast6_xts_dec_tv_template[] = {
+       { /* Generated from TF test vectors */
+               .key    = "\x27\x18\x28\x18\x28\x45\x90\x45"
+                         "\x23\x53\x60\x28\x74\x71\x35\x26"
+                         "\x62\x49\x77\x57\x24\x70\x93\x69"
+                         "\x99\x59\x57\x49\x66\x96\x76\x27"
+                         "\x31\x41\x59\x26\x53\x58\x97\x93"
+                         "\x23\x84\x62\x64\x33\x83\x27\x95"
+                         "\x02\x88\x41\x97\x16\x93\x99\x37"
+                         "\x51\x05\x82\x09\x74\x94\x45\x92",
+               .klen   = 64,
+               .iv     = "\xff\x00\x00\x00\x00\x00\x00\x00"
+                         "\x00\x00\x00\x00\x00\x00\x00\x00",
+               .input  = "\xDE\x6F\x22\xA5\xE8\x39\xE8\x78"
+                         "\x88\x5A\x4F\x8D\x82\x76\x52\x6D"
+                         "\xB2\x41\x16\xF4\x2B\xA6\xEB\xF6"
+                         "\xE2\xC5\x62\x8D\x61\xA1\x01\xED"
+                         "\xD9\x38\x01\xC1\x43\x63\x4E\x88"
+                         "\xC9\x4B\x5A\x88\x80\xB7\x5C\x71"
+                         "\x47\xEE\x11\xD8\xB7\x2D\x5D\x13"
+                         "\x1A\xB1\x68\x5B\x61\xA7\xA9\x81"
+                         "\x8B\x83\xA1\x6A\xAA\x36\xD6\xB6"
+                         "\x60\x54\x09\x32\xFE\x6A\x76\x2E"
+                         "\x28\xFF\xD5\xD6\xDD\x1D\x45\x7D"
+                         "\xF0\x8B\xF3\x32\x4E\x6C\x12\xCB"
+                         "\xB8\x25\x70\xF8\x40\xBC\x90\x1B"
+                         "\x11\xC3\x59\xAF\xF0\x2F\x92\xDD"
+                         "\xD3\x3B\xCF\x60\xA1\x78\x94\x57"
+                         "\xAF\x76\xC1\x67\xA6\x3C\xCD\x98"
+                         "\xB1\xF7\x27\xB9\xA3\xBD\x10\xEA"
+                         "\xCD\x8B\xC2\xF2\x14\xF2\xB2\x67"
+                         "\x05\xDD\x1D\x58\x6E\x2F\x95\x08"
+                         "\x3A\xF8\x78\x76\x82\x56\xA7\xEC"
+                         "\x51\x4B\x85\x77\xC2\x4C\x4A\x34"
+                         "\x71\x38\x17\x91\x44\xE8\xFC\x65"
+                         "\x99\x0D\x52\x91\xEE\xF8\xEF\x27"
+                         "\x2A\x9E\x6E\x78\xC4\x26\x87\xF4"
+                         "\x8A\xF0\x2D\x04\xE8\x14\x92\x5D"
+                         "\x59\x22\x9B\x29\x5C\x18\xF0\xC3"
+                         "\x47\xF3\x76\xD8\xE4\xF3\x1B\xD1"
+                         "\x70\xA3\x0D\xB5\x70\x02\x1D\xA3"
+                         "\x91\x3B\x49\x73\x18\xAB\xD4\xC9"
+                         "\xC3\x1E\xEF\x1F\xFE\xD5\x59\x8A"
+                         "\xD7\xF6\xC9\x71\x67\x79\xD7\x0E"
+                         "\xBE\x1F\x8E\xEC\x55\x7E\x4F\x24"
+                         "\xE6\x87\xEA\xFE\x96\x25\x67\x8E"
+                         "\x93\x03\xFA\xFF\xCE\xAF\xB2\x3C"
+                         "\x6F\xEB\x57\xFB\xD3\x28\x87\xA9"
+                         "\xCE\xC2\xF5\x9C\xC6\x67\xB5\x97"
+                         "\x49\xF7\x04\xCB\xEF\x84\x98\x33"
+                         "\xAF\x38\xD3\x04\x1C\x24\x71\x38"
+                         "\xC7\x71\xDD\x43\x0D\x12\x4A\x18"
+                         "\xBA\xC4\xAF\xBA\xB2\x5B\xEB\x95"
+                         "\x02\x43\x5D\xCE\x19\xCC\xCD\x66"
+                         "\x91\x0B\x8C\x7F\x51\xC4\xBF\x3C"
+                         "\x8B\xF1\xCC\xAA\x29\xD7\x87\xCB"
+                         "\x3E\xC5\xF3\xC9\x75\xE8\xA3\x5B"
+                         "\x30\x45\xA9\xB7\xAF\x80\x64\x6F"
+                         "\x75\x4A\xA7\xC0\x6D\x19\x6B\xDE"
+                         "\x17\xDE\x6D\xEA\x87\x9F\x95\xAE"
+                         "\xF5\x3C\xEE\x54\xB8\x27\x84\xF8"
+                         "\x97\xA3\xE1\x6F\x38\x24\x34\x88"
+                         "\xCE\xBD\x32\x52\xE0\x00\x6C\x94"
+                         "\xC9\xD7\x5D\x37\x81\x33\x2E\x7F"
+                         "\x4F\x7E\x2E\x0D\x94\xBD\xEA\x59"
+                         "\x34\x39\xA8\x35\x12\xB7\xBC\xAC"
+                         "\xEA\x52\x9C\x78\x02\x6D\x92\x36"
+                         "\xFB\x59\x2B\xA4\xEA\x7B\x1B\x83"
+                         "\xE1\x4D\x5E\x2A\x7E\x92\xB1\x64"
+                         "\xDE\xE0\x27\x4B\x0A\x6F\x4C\xE3"
+                         "\xB0\xEB\x31\xE4\x69\x95\xAB\x35"
+                         "\x8B\x2C\xF5\x6B\x7F\xF1\xA2\x82"
+                         "\xF8\xD9\x47\x82\xA9\x82\x03\x91"
+                         "\x69\x1F\xBE\x4C\xE7\xC7\x34\x2F"
+                         "\x45\x72\x80\x17\x81\xBD\x9D\x62"
+                         "\xA1\xAC\xE8\xCF\xC6\x74\xCF\xDC"
+                         "\x22\x60\x4E\xE8\xA4\x5D\x85\xB9",
+               .ilen   = 512,
+               .result = "\x00\x01\x02\x03\x04\x05\x06\x07"
+                         "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
+                         "\x10\x11\x12\x13\x14\x15\x16\x17"
+                         "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
+                         "\x20\x21\x22\x23\x24\x25\x26\x27"
+                         "\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f"
+                         "\x30\x31\x32\x33\x34\x35\x36\x37"
+                         "\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f"
+                         "\x40\x41\x42\x43\x44\x45\x46\x47"
+                         "\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f"
+                         "\x50\x51\x52\x53\x54\x55\x56\x57"
+                         "\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f"
+                         "\x60\x61\x62\x63\x64\x65\x66\x67"
+                         "\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f"
+                         "\x70\x71\x72\x73\x74\x75\x76\x77"
+                         "\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f"
+                         "\x80\x81\x82\x83\x84\x85\x86\x87"
+                         "\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
+                         "\x90\x91\x92\x93\x94\x95\x96\x97"
+                         "\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
+                         "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7"
+                         "\xa8\xa9\xaa\xab\xac\xad\xae\xaf"
+                         "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7"
+                         "\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
+                         "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
+                         "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
+                         "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7"
+                         "\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf"
+                         "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7"
+                         "\xe8\xe9\xea\xeb\xec\xed\xee\xef"
+                         "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7"
+                         "\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"
+                         "\x00\x01\x02\x03\x04\x05\x06\x07"
+                         "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
+                         "\x10\x11\x12\x13\x14\x15\x16\x17"
+                         "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
+                         "\x20\x21\x22\x23\x24\x25\x26\x27"
+                         "\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f"
+                         "\x30\x31\x32\x33\x34\x35\x36\x37"
+                         "\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f"
+                         "\x40\x41\x42\x43\x44\x45\x46\x47"
+                         "\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f"
+                         "\x50\x51\x52\x53\x54\x55\x56\x57"
+                         "\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f"
+                         "\x60\x61\x62\x63\x64\x65\x66\x67"
+                         "\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f"
+                         "\x70\x71\x72\x73\x74\x75\x76\x77"
+                         "\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f"
+                         "\x80\x81\x82\x83\x84\x85\x86\x87"
+                         "\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
+                         "\x90\x91\x92\x93\x94\x95\x96\x97"
+                         "\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
+                         "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7"
+                         "\xa8\xa9\xaa\xab\xac\xad\xae\xaf"
+                         "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7"
+                         "\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
+                         "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
+                         "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
+                         "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7"
+                         "\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf"
+                         "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7"
+                         "\xe8\xe9\xea\xeb\xec\xed\xee\xef"
+                         "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7"
+                         "\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff",
+               .rlen   = 512,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 512 - 16, 16 },
+       },
+};
+
+
+/*
+ * AES test vectors.
+ */
+#define AES_ENC_TEST_VECTORS 3
+#define AES_DEC_TEST_VECTORS 3
+#define AES_CBC_ENC_TEST_VECTORS 4
+#define AES_CBC_DEC_TEST_VECTORS 4
+#define HMAC_SHA1_AES_CBC_ENC_TEST_VECTORS 7
+#define HMAC_SHA256_AES_CBC_ENC_TEST_VECTORS 7
+#define HMAC_SHA512_AES_CBC_ENC_TEST_VECTORS 7
+#define AES_LRW_ENC_TEST_VECTORS 8
+#define AES_LRW_DEC_TEST_VECTORS 8
+#define AES_XTS_ENC_TEST_VECTORS 5
+#define AES_XTS_DEC_TEST_VECTORS 5
+#define AES_CTR_ENC_TEST_VECTORS 3
+#define AES_CTR_DEC_TEST_VECTORS 3
+#define AES_OFB_ENC_TEST_VECTORS 1
+#define AES_OFB_DEC_TEST_VECTORS 1
+#define AES_CTR_3686_ENC_TEST_VECTORS 7
+#define AES_CTR_3686_DEC_TEST_VECTORS 6
+#define AES_GCM_ENC_TEST_VECTORS 9
+#define AES_GCM_DEC_TEST_VECTORS 8
+#define AES_GCM_4106_ENC_TEST_VECTORS 7
+#define AES_GCM_4106_DEC_TEST_VECTORS 7
+#define AES_CCM_ENC_TEST_VECTORS 7
+#define AES_CCM_DEC_TEST_VECTORS 7
+#define AES_CCM_4309_ENC_TEST_VECTORS 7
+#define AES_CCM_4309_DEC_TEST_VECTORS 10
+
+static struct cipher_testvec aes_enc_tv_template[] = {
+       { /* From FIPS-197 */
+               .key    = "\x00\x01\x02\x03\x04\x05\x06\x07"
+                         "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
+               .klen   = 16,
+               .input  = "\x00\x11\x22\x33\x44\x55\x66\x77"
+                         "\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
+               .ilen   = 16,
+               .result = "\x69\xc4\xe0\xd8\x6a\x7b\x04\x30"
+                         "\xd8\xcd\xb7\x80\x70\xb4\xc5\x5a",
+               .rlen   = 16,
+       }, {
+               .key    = "\x00\x01\x02\x03\x04\x05\x06\x07"
+                         "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
+                         "\x10\x11\x12\x13\x14\x15\x16\x17",
+               .klen   = 24,
+               .input  = "\x00\x11\x22\x33\x44\x55\x66\x77"
+                         "\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
+               .ilen   = 16,
+               .result = "\xdd\xa9\x7c\xa4\x86\x4c\xdf\xe0"
+                         "\x6e\xaf\x70\xa0\xec\x0d\x71\x91",
+               .rlen   = 16,
+       }, {
+               .key    = "\x00\x01\x02\x03\x04\x05\x06\x07"
+                         "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
+                         "\x10\x11\x12\x13\x14\x15\x16\x17"
+                         "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
+               .klen   = 32,
+               .input  = "\x00\x11\x22\x33\x44\x55\x66\x77"
+                         "\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
+               .ilen   = 16,
+               .result = "\x8e\xa2\xb7\xca\x51\x67\x45\xbf"
+                         "\xea\xfc\x49\x90\x4b\x49\x60\x89",
+               .rlen   = 16,
+       },
+};
+
+static struct cipher_testvec aes_dec_tv_template[] = {
+       { /* From FIPS-197 */
+               .key    = "\x00\x01\x02\x03\x04\x05\x06\x07"
+                         "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
+               .klen   = 16,
+               .input  = "\x69\xc4\xe0\xd8\x6a\x7b\x04\x30"
+                         "\xd8\xcd\xb7\x80\x70\xb4\xc5\x5a",
+               .ilen   = 16,
+               .result = "\x00\x11\x22\x33\x44\x55\x66\x77"
+                         "\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
+               .rlen   = 16,
+       }, {
+               .key    = "\x00\x01\x02\x03\x04\x05\x06\x07"
+                         "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
+                         "\x10\x11\x12\x13\x14\x15\x16\x17",
+               .klen   = 24,
+               .input  = "\xdd\xa9\x7c\xa4\x86\x4c\xdf\xe0"
+                         "\x6e\xaf\x70\xa0\xec\x0d\x71\x91",
+               .ilen   = 16,
+               .result = "\x00\x11\x22\x33\x44\x55\x66\x77"
+                         "\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
+               .rlen   = 16,
+       }, {
+               .key    = "\x00\x01\x02\x03\x04\x05\x06\x07"
+                         "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
+                         "\x10\x11\x12\x13\x14\x15\x16\x17"
+                         "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
+               .klen   = 32,
+               .input  = "\x8e\xa2\xb7\xca\x51\x67\x45\xbf"
+                         "\xea\xfc\x49\x90\x4b\x49\x60\x89",
+               .ilen   = 16,
+               .result = "\x00\x11\x22\x33\x44\x55\x66\x77"
+                         "\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
+               .rlen   = 16,
+       },
+};
+
+static struct cipher_testvec aes_cbc_enc_tv_template[] = {
+       { /* From RFC 3602 */
+               .key    = "\x06\xa9\x21\x40\x36\xb8\xa1\x5b"
+                         "\x51\x2e\x03\xd5\x34\x12\x00\x06",
+               .klen   = 16,
+               .iv     = "\x3d\xaf\xba\x42\x9d\x9e\xb4\x30"
+                         "\xb4\x22\xda\x80\x2c\x9f\xac\x41",
+               .input  = "Single block msg",
+               .ilen   = 16,
+               .result = "\xe3\x53\x77\x9c\x10\x79\xae\xb8"
+                         "\x27\x08\x94\x2d\xbe\x77\x18\x1a",
+               .rlen   = 16,
+       }, {
+               .key    = "\xc2\x86\x69\x6d\x88\x7c\x9a\xa0"
+                         "\x61\x1b\xbb\x3e\x20\x25\xa4\x5a",
+               .klen   = 16,
+               .iv     = "\x56\x2e\x17\x99\x6d\x09\x3d\x28"
+                         "\xdd\xb3\xba\x69\x5a\x2e\x6f\x58",
+               .input  = "\x00\x01\x02\x03\x04\x05\x06\x07"
+                         "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
+                         "\x10\x11\x12\x13\x14\x15\x16\x17"
+                         "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
+               .ilen   = 32,
+               .result = "\xd2\x96\xcd\x94\xc2\xcc\xcf\x8a"
+                         "\x3a\x86\x30\x28\xb5\xe1\xdc\x0a"
+                         "\x75\x86\x60\x2d\x25\x3c\xff\xf9"
+                         "\x1b\x82\x66\xbe\xa6\xd6\x1a\xb1",
+               .rlen   = 32,
+       }, { /* From NIST SP800-38A */
+               .key    = "\x8e\x73\xb0\xf7\xda\x0e\x64\x52"
+                         "\xc8\x10\xf3\x2b\x80\x90\x79\xe5"
+                         "\x62\xf8\xea\xd2\x52\x2c\x6b\x7b",
+               .klen   = 24,
+               .iv     = "\x00\x01\x02\x03\x04\x05\x06\x07"
+                         "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
+               .input  = "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96"
+                         "\xe9\x3d\x7e\x11\x73\x93\x17\x2a"
+                         "\xae\x2d\x8a\x57\x1e\x03\xac\x9c"
+                         "\x9e\xb7\x6f\xac\x45\xaf\x8e\x51"
+                         "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11"
+                         "\xe5\xfb\xc1\x19\x1a\x0a\x52\xef"
+                         "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17"
+                         "\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
+               .ilen   = 64,
+               .result = "\x4f\x02\x1d\xb2\x43\xbc\x63\x3d"
+                         "\x71\x78\x18\x3a\x9f\xa0\x71\xe8"
+                         "\xb4\xd9\xad\xa9\xad\x7d\xed\xf4"
+                         "\xe5\xe7\x38\x76\x3f\x69\x14\x5a"
+                         "\x57\x1b\x24\x20\x12\xfb\x7a\xe0"
+                         "\x7f\xa9\xba\xac\x3d\xf1\x02\xe0"
+                         "\x08\xb0\xe2\x79\x88\x59\x88\x81"
+                         "\xd9\x20\xa9\xe6\x4f\x56\x15\xcd",
+               .rlen   = 64,
+       }, {
+               .key    = "\x60\x3d\xeb\x10\x15\xca\x71\xbe"
+                         "\x2b\x73\xae\xf0\x85\x7d\x77\x81"
+                         "\x1f\x35\x2c\x07\x3b\x61\x08\xd7"
+                         "\x2d\x98\x10\xa3\x09\x14\xdf\xf4",
+               .klen   = 32,
+               .iv     = "\x00\x01\x02\x03\x04\x05\x06\x07"
+                         "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
+               .input  = "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96"
+                         "\xe9\x3d\x7e\x11\x73\x93\x17\x2a"
+                         "\xae\x2d\x8a\x57\x1e\x03\xac\x9c"
+                         "\x9e\xb7\x6f\xac\x45\xaf\x8e\x51"
+                         "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11"
+                         "\xe5\xfb\xc1\x19\x1a\x0a\x52\xef"
+                         "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17"
+                         "\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
+               .ilen   = 64,
+               .result = "\xf5\x8c\x4c\x04\xd6\xe5\xf1\xba"
+                         "\x77\x9e\xab\xfb\x5f\x7b\xfb\xd6"
+                         "\x9c\xfc\x4e\x96\x7e\xdb\x80\x8d"
+                         "\x67\x9f\x77\x7b\xc6\x70\x2c\x7d"
+                         "\x39\xf2\x33\x69\xa9\xd9\xba\xcf"
+                         "\xa5\x30\xe2\x63\x04\x23\x14\x61"
+                         "\xb2\xeb\x05\xe2\xc3\x9b\xe9\xfc"
+                         "\xda\x6c\x19\x07\x8c\x6a\x9d\x1b",
+               .rlen   = 64,
+       },
+};
+
+static struct cipher_testvec aes_cbc_dec_tv_template[] = {
+       { /* From RFC 3602 */
+               .key    = "\x06\xa9\x21\x40\x36\xb8\xa1\x5b"
+                         "\x51\x2e\x03\xd5\x34\x12\x00\x06",
+               .klen   = 16,
+               .iv     = "\x3d\xaf\xba\x42\x9d\x9e\xb4\x30"
+                         "\xb4\x22\xda\x80\x2c\x9f\xac\x41",
+               .input  = "\xe3\x53\x77\x9c\x10\x79\xae\xb8"
+                         "\x27\x08\x94\x2d\xbe\x77\x18\x1a",
+               .ilen   = 16,
+               .result = "Single block msg",
+               .rlen   = 16,
+       }, {
+               .key    = "\xc2\x86\x69\x6d\x88\x7c\x9a\xa0"
+                         "\x61\x1b\xbb\x3e\x20\x25\xa4\x5a",
+               .klen   = 16,
+               .iv     = "\x56\x2e\x17\x99\x6d\x09\x3d\x28"
+                         "\xdd\xb3\xba\x69\x5a\x2e\x6f\x58",
+               .input  = "\xd2\x96\xcd\x94\xc2\xcc\xcf\x8a"
+                         "\x3a\x86\x30\x28\xb5\xe1\xdc\x0a"
+                         "\x75\x86\x60\x2d\x25\x3c\xff\xf9"
+                         "\x1b\x82\x66\xbe\xa6\xd6\x1a\xb1",
+               .ilen   = 32,
+               .result = "\x00\x01\x02\x03\x04\x05\x06\x07"
+                         "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
+                         "\x10\x11\x12\x13\x14\x15\x16\x17"
+                         "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
+               .rlen   = 32,
+       }, { /* From NIST SP800-38A */
+               .key    = "\x8e\x73\xb0\xf7\xda\x0e\x64\x52"
+                         "\xc8\x10\xf3\x2b\x80\x90\x79\xe5"
+                         "\x62\xf8\xea\xd2\x52\x2c\x6b\x7b",
+               .klen   = 24,
+               .iv     = "\x00\x01\x02\x03\x04\x05\x06\x07"
+                         "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
+               .input  = "\x4f\x02\x1d\xb2\x43\xbc\x63\x3d"
+                         "\x71\x78\x18\x3a\x9f\xa0\x71\xe8"
+                         "\xb4\xd9\xad\xa9\xad\x7d\xed\xf4"
+                         "\xe5\xe7\x38\x76\x3f\x69\x14\x5a"
+                         "\x57\x1b\x24\x20\x12\xfb\x7a\xe0"
+                         "\x7f\xa9\xba\xac\x3d\xf1\x02\xe0"
+                         "\x08\xb0\xe2\x79\x88\x59\x88\x81"
+                         "\xd9\x20\xa9\xe6\x4f\x56\x15\xcd",
+               .ilen   = 64,
+               .result = "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96"
+                         "\xe9\x3d\x7e\x11\x73\x93\x17\x2a"
+                         "\xae\x2d\x8a\x57\x1e\x03\xac\x9c"
+                         "\x9e\xb7\x6f\xac\x45\xaf\x8e\x51"
+                         "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11"
+                         "\xe5\xfb\xc1\x19\x1a\x0a\x52\xef"
+                         "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17"
+                         "\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
+               .rlen   = 64,
+       }, {
+               .key    = "\x60\x3d\xeb\x10\x15\xca\x71\xbe"
+                         "\x2b\x73\xae\xf0\x85\x7d\x77\x81"
+                         "\x1f\x35\x2c\x07\x3b\x61\x08\xd7"
+                         "\x2d\x98\x10\xa3\x09\x14\xdf\xf4",
+               .klen   = 32,
+               .iv     = "\x00\x01\x02\x03\x04\x05\x06\x07"
+                         "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
+               .input  = "\xf5\x8c\x4c\x04\xd6\xe5\xf1\xba"
+                         "\x77\x9e\xab\xfb\x5f\x7b\xfb\xd6"
+                         "\x9c\xfc\x4e\x96\x7e\xdb\x80\x8d"
+                         "\x67\x9f\x77\x7b\xc6\x70\x2c\x7d"
+                         "\x39\xf2\x33\x69\xa9\xd9\xba\xcf"
+                         "\xa5\x30\xe2\x63\x04\x23\x14\x61"
+                         "\xb2\xeb\x05\xe2\xc3\x9b\xe9\xfc"
+                         "\xda\x6c\x19\x07\x8c\x6a\x9d\x1b",
+               .ilen   = 64,
+               .result = "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96"
+                         "\xe9\x3d\x7e\x11\x73\x93\x17\x2a"
+                         "\xae\x2d\x8a\x57\x1e\x03\xac\x9c"
+                         "\x9e\xb7\x6f\xac\x45\xaf\x8e\x51"
+                         "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11"
+                         "\xe5\xfb\xc1\x19\x1a\x0a\x52\xef"
+                         "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17"
+                         "\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
+               .rlen   = 64,
+       },
+};
+
+static struct aead_testvec hmac_sha1_aes_cbc_enc_tv_template[] = {
+       { /* RFC 3602 Case 1 */
+#ifdef __LITTLE_ENDIAN
+               .key    = "\x08\x00"            /* rta length */
+                         "\x01\x00"            /* rta type */
+#else
+               .key    = "\x00\x08"            /* rta length */
+                         "\x00\x01"            /* rta type */
+#endif
+                         "\x00\x00\x00\x10"    /* enc key length */
+                         "\x00\x00\x00\x00\x00\x00\x00\x00"
+                         "\x00\x00\x00\x00\x00\x00\x00\x00"
+                         "\x00\x00\x00\x00"
+                         "\x06\xa9\x21\x40\x36\xb8\xa1\x5b"
+                         "\x51\x2e\x03\xd5\x34\x12\x00\x06",
+               .klen   = 8 + 20 + 16,
                .iv     = "\x3d\xaf\xba\x42\x9d\x9e\xb4\x30"
                          "\xb4\x22\xda\x80\x2c\x9f\xac\x41",
                .input  = "Single block msg",
@@ -8313,6 +10668,9 @@ static struct cipher_testvec aes_lrw_enc_tv_template[] = {
                          "\xcd\x7e\x2b\x5d\x43\xea\x42\xe7"
                          "\x74\x3f\x7d\x58\x88\x75\xde\x3e",
                .rlen   = 512,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 512 - 16, 16 },
        }
 };
 
@@ -8564,6 +10922,9 @@ static struct cipher_testvec aes_lrw_dec_tv_template[] = {
                          "\xe9\x2e\xc4\x29\x0f\x84\xdb\xc4"
                          "\x21\xc4\xc2\x75\x67\x89\x37\x0a",
                .rlen   = 512,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 512 - 16, 16 },
        }
 };
 
@@ -8905,6 +11266,9 @@ static struct cipher_testvec aes_xts_enc_tv_template[] = {
                          "\xc4\xf3\x6f\xfd\xa9\xfc\xea\x70"
                          "\xb9\xc6\xe6\x93\xe1\x48\xc1\x51",
                .rlen   = 512,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 512 - 16, 16 },
        }
 };
 
@@ -9246,7 +11610,9 @@ static struct cipher_testvec aes_xts_dec_tv_template[] = {
                          "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7"
                          "\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff",
                .rlen   = 512,
-
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 512 - 16, 16 },
        }
 };
 
@@ -11691,494 +14057,1344 @@ static struct aead_testvec aes_ccm_rfc4309_enc_tv_template[] = {
                          "\xa4\xbe\xd9\xf2\x1a\x6d\x22\xa8",
                .rlen   = 48,
        }, {
-               .key    = "\x1e\x2c\x7e\x01\x41\x9a\xef\xc0"
-                         "\x0d\x58\x96\x6e\x5c\xa2\x4b\xd3"
-                         "\x4f\xa3\x19",
-               .klen   = 19,
-               .iv     = "\xd3\x01\x5a\xd8\x30\x60\x15\x56",
-               .assoc  = "\xda\xe6\x28\x9c\x45\x2d\xfd\x63"
-                         "\x5e\xda\x4c\xb6\xe6\xfc\xf9\xb7"
-                         "\x0c\x56\xcb\xe4\xe0\x05\x7a\xe1"
-                         "\x0a\x63\x09\x78\xbc\x2c\x55\xde",
+               .key    = "\x1e\x2c\x7e\x01\x41\x9a\xef\xc0"
+                         "\x0d\x58\x96\x6e\x5c\xa2\x4b\xd3"
+                         "\x4f\xa3\x19",
+               .klen   = 19,
+               .iv     = "\xd3\x01\x5a\xd8\x30\x60\x15\x56",
+               .assoc  = "\xda\xe6\x28\x9c\x45\x2d\xfd\x63"
+                         "\x5e\xda\x4c\xb6\xe6\xfc\xf9\xb7"
+                         "\x0c\x56\xcb\xe4\xe0\x05\x7a\xe1"
+                         "\x0a\x63\x09\x78\xbc\x2c\x55\xde",
+               .alen   = 32,
+               .input  = "\x87\xa3\x36\xfd\x96\xb3\x93\x78"
+                         "\xa9\x28\x63\xba\x12\xa3\x14\x85"
+                         "\x57\x1e\x06\xc9\x7b\x21\xef\x76"
+                         "\x7f\x38\x7e\x8e\x29\xa4\x3e\x7e",
+               .ilen   = 32,
+               .result = "\x8a\x1e\x11\xf0\x02\x6b\xe2\x19"
+                         "\xfc\x70\xc4\x6d\x8e\xb7\x99\xab"
+                         "\xc5\x4b\xa2\xac\xd3\xf3\x48\xff"
+                         "\x3b\xb5\xce\x53\xef\xde\xbb\x02"
+                         "\xa9\x86\x15\x6c\x13\xfe\xda\x0a"
+                         "\x22\xb8\x29\x3d\xd8\x39\x9a\x23",
+               .rlen   = 48,
+       }, {
+               .key    = "\xf4\x6b\xc2\x75\x62\xfe\xb4\xe1"
+                         "\xa3\xf0\xff\xdd\x4e\x4b\x12\x75"
+                         "\x53\x14\x73\x66\x8d\x88\xf6\x80"
+                         "\xa0\x20\x35",
+               .klen   = 27,
+               .iv     = "\x26\xf2\x21\x8d\x50\x20\xda\xe2",
+               .assoc  = "\x5b\x9e\x13\x67\x02\x5e\xef\xc1"
+                         "\x6c\xf9\xd7\x1e\x52\x8f\x7a\x47"
+                         "\xe9\xd4\xcf\x20\x14\x6e\xf0\x2d"
+                         "\xd8\x9e\x2b\x56\x10\x23\x56\xe7",
+               .alen   = 32,
+               .ilen   = 0,
+               .result = "\x36\xea\x7a\x70\x08\xdc\x6a\xbc"
+                         "\xad\x0c\x7a\x63\xf6\x61\xfd\x9b",
+               .rlen   = 16,
+       }, {
+               .key    = "\x56\xdf\x5c\x8f\x26\x3f\x0e\x42"
+                         "\xef\x7a\xd3\xce\xfc\x84\x60\x62"
+                         "\xca\xb4\x40\xaf\x5f\xc9\xc9\x01"
+                         "\xd6\x3c\x8c",
+               .klen   = 27,
+               .iv     = "\x86\x84\xb6\xcd\xef\x09\x2e\x94",
+               .assoc  = "\x02\x65\x78\x3c\xe9\x21\x30\x91"
+                         "\xb1\xb9\xda\x76\x9a\x78\x6d\x95"
+                         "\xf2\x88\x32\xa3\xf2\x50\xcb\x4c"
+                         "\xe3\x00\x73\x69\x84\x69\x87\x79",
+               .alen   = 32,
+               .input  = "\x9f\xd2\x02\x4b\x52\x49\x31\x3c"
+                         "\x43\x69\x3a\x2d\x8e\x70\xad\x7e"
+                         "\xe0\xe5\x46\x09\x80\x89\x13\xb2"
+                         "\x8c\x8b\xd9\x3f\x86\xfb\xb5\x6b",
+               .ilen   = 32,
+               .result = "\x39\xdf\x7c\x3c\x5a\x29\xb9\x62"
+                         "\x5d\x51\xc2\x16\xd8\xbd\x06\x9f"
+                         "\x9b\x6a\x09\x70\xc1\x51\x83\xc2"
+                         "\x66\x88\x1d\x4f\x9a\xda\xe0\x1e"
+                         "\xc7\x79\x11\x58\xe5\x6b\x20\x40"
+                         "\x7a\xea\x46\x42\x8b\xe4\x6f\xe1",
+               .rlen   = 48,
+       }, {
+               .key    = "\xe0\x8d\x99\x71\x60\xd7\x97\x1a"
+                         "\xbd\x01\x99\xd5\x8a\xdf\x71\x3a"
+                         "\xd3\xdf\x24\x4b\x5e\x3d\x4b\x4e"
+                         "\x30\x7a\xb9\xd8\x53\x0a\x5e\x2b"
+                         "\x1e\x29\x91",
+               .klen   = 35,
+               .iv     = "\xad\x8e\xc1\x53\x0a\xcf\x2d\xbe",
+               .assoc  = "\x19\xb6\x1f\x57\xc4\xf3\xf0\x8b"
+                         "\x78\x2b\x94\x02\x29\x0f\x42\x27"
+                         "\x6b\x75\xcb\x98\x34\x08\x7e\x79"
+                         "\xe4\x3e\x49\x0d\x84\x8b\x22\x87",
+               .alen   = 32,
+               .input  = "\xe1\xd9\xd8\x13\xeb\x3a\x75\x3f"
+                         "\x9d\xbd\x5f\x66\xbe\xdc\xbb\x66"
+                         "\xbf\x17\x99\x62\x4a\x39\x27\x1f"
+                         "\x1d\xdc\x24\xae\x19\x2f\x98\x4c",
+               .ilen   = 32,
+               .result = "\x19\xb8\x61\x33\x45\x2b\x43\x96"
+                         "\x6f\x51\xd0\x20\x30\x7d\x9b\xc6"
+                         "\x26\x3d\xf8\xc9\x65\x16\xa8\x9f"
+                         "\xf0\x62\x17\x34\xf2\x1e\x8d\x75"
+                         "\x4e\x13\xcc\xc0\xc3\x2a\x54\x2d",
+               .rlen   = 40,
+       }, {
+               .key    = "\x7c\xc8\x18\x3b\x8d\x99\xe0\x7c"
+                         "\x45\x41\xb8\xbd\x5c\xa7\xc2\x32"
+                         "\x8a\xb8\x02\x59\xa4\xfe\xa9\x2c"
+                         "\x09\x75\x9a\x9b\x3c\x9b\x27\x39"
+                         "\xf9\xd9\x4e",
+               .klen   = 35,
+               .iv     = "\x63\xb5\x3d\x9d\x43\xf6\x1e\x50",
+               .assoc  = "\x57\xf5\x6b\x8b\x57\x5c\x3d\x3b"
+                         "\x13\x02\x01\x0c\x83\x4c\x96\x35"
+                         "\x8e\xd6\x39\xcf\x7d\x14\x9b\x94"
+                         "\xb0\x39\x36\xe6\x8f\x57\xe0\x13",
+               .alen   = 32,
+               .input  = "\x3b\x6c\x29\x36\xb6\xef\x07\xa6"
+                         "\x83\x72\x07\x4f\xcf\xfa\x66\x89"
+                         "\x5f\xca\xb1\xba\xd5\x8f\x2c\x27"
+                         "\x30\xdb\x75\x09\x93\xd4\x65\xe4",
+               .ilen   = 32,
+               .result = "\xb0\x88\x5a\x33\xaa\xe5\xc7\x1d"
+                         "\x85\x23\xc7\xc6\x2f\xf4\x1e\x3d"
+                         "\xcc\x63\x44\x25\x07\x78\x4f\x9e"
+                         "\x96\xb8\x88\xeb\xbc\x48\x1f\x06"
+                         "\x39\xaf\x39\xac\xd8\x4a\x80\x39"
+                         "\x7b\x72\x8a\xf7",
+               .rlen   = 44,
+       }, {
+               .key    = "\xab\xd0\xe9\x33\x07\x26\xe5\x83"
+                         "\x8c\x76\x95\xd4\xb6\xdc\xf3\x46"
+                         "\xf9\x8f\xad\xe3\x02\x13\x83\x77"
+                         "\x3f\xb0\xf1\xa1\xa1\x22\x0f\x2b"
+                         "\x24\xa7\x8b",
+               .klen   = 35,
+               .iv     = "\x07\xcb\xcc\x0e\xe6\x33\xbf\xf5",
+               .assoc  = "\xd4\xdb\x30\x1d\x03\xfe\xfd\x5f"
+                         "\x87\xd4\x8c\xb6\xb6\xf1\x7a\x5d"
+                         "\xab\x90\x65\x8d\x8e\xca\x4d\x4f"
+                         "\x16\x0c\x40\x90\x4b\xc7\x36\x73",
+               .alen   = 32,
+               .input  = "\xf5\xc6\x7d\x48\xc1\xb7\xe6\x92"
+                         "\x97\x5a\xca\xc4\xa9\x6d\xf9\x3d"
+                         "\x6c\xde\xbc\xf1\x90\xea\x6a\xb2"
+                         "\x35\x86\x36\xaf\x5c\xfe\x4b\x3a",
+               .ilen   = 32,
+               .result = "\x83\x6f\x40\x87\x72\xcf\xc1\x13"
+                         "\xef\xbb\x80\x21\x04\x6c\x58\x09"
+                         "\x07\x1b\xfc\xdf\xc0\x3f\x5b\xc7"
+                         "\xe0\x79\xa8\x6e\x71\x7c\x3f\xcf"
+                         "\x5c\xda\xb2\x33\xe5\x13\xe2\x0d"
+                         "\x74\xd1\xef\xb5\x0f\x3a\xb5\xf8",
+               .rlen   = 48,
+       },
+};
+
+static struct aead_testvec aes_ccm_rfc4309_dec_tv_template[] = {
+       {
+               .key    = "\xab\x2f\x8a\x74\xb7\x1c\xd2\xb1"
+                         "\xff\x80\x2e\x48\x7d\x82\xf8\xb9"
+                         "\xc6\xfb\x7d",
+               .klen   = 19,
+               .iv     = "\x80\x0d\x13\xab\xd8\xa6\xb2\xd8",
+               .alen   = 0,
+               .input  = "\xd5\xe8\x93\x9f\xc7\x89\x2e\x2b",
+               .ilen   = 8,
+               .result = "\x00",
+               .rlen   = 0,
+               .novrfy = 1,
+       }, {
+               .key    = "\xab\x2f\x8a\x74\xb7\x1c\xd2\xb1"
+                         "\xff\x80\x2e\x48\x7d\x82\xf8\xb9"
+                         "\xaf\x94\x87",
+               .klen   = 19,
+               .iv     = "\x78\x35\x82\x81\x7f\x88\x94\x68",
+               .alen   = 0,
+               .input  = "\x41\x3c\xb8\x87\x73\xcb\xf3\xf3",
+               .ilen   = 8,
+               .result = "\x00",
+               .rlen   = 0,
+       }, {
+               .key    = "\x61\x0e\x8c\xae\xe3\x23\xb6\x38"
+                         "\x76\x1c\xf6\x3a\x67\xa3\x9c\xd8"
+                         "\xc6\xfb\x7d",
+               .klen   = 19,
+               .iv     = "\x80\x0d\x13\xab\xd8\xa6\xb2\xd8",
+               .assoc  = "\xf3\x94\x87\x78\x35\x82\x81\x7f"
+                         "\x88\x94\x68\xb1\x78\x6b\x2b\xd6"
+                         "\x04\x1f\x4e\xed\x78\xd5\x33\x66"
+                         "\xd8\x94\x99\x91\x81\x54\x62\x57",
+               .alen   = 32,
+               .input  = "\xf0\x7c\x29\x02\xae\x1c\x2f\x55"
+                         "\xd0\xd1\x3d\x1a\xa3\x6d\xe4\x0a"
+                         "\x86\xb0\x87\x6b\x62\x33\x8c\x34"
+                         "\xce\xab\x57\xcc\x79\x0b\xe0\x6f"
+                         "\x5c\x3e\x48\x1f\x6c\x46\xf7\x51"
+                         "\x8b\x84\x83\x2a\xc1\x05\xb8\xc5",
+               .ilen   = 48,
+               .result = "\x50\x82\x3e\x07\xe2\x1e\xb6\xfb"
+                         "\x33\xe4\x73\xce\xd2\xfb\x95\x79"
+                         "\xe8\xb4\xb5\x77\x11\x10\x62\x6f"
+                         "\x6a\x82\xd1\x13\xec\xf5\xd0\x48",
+               .rlen   = 32,
+               .novrfy = 1,
+       }, {
+               .key    = "\x61\x0e\x8c\xae\xe3\x23\xb6\x38"
+                         "\x76\x1c\xf6\x3a\x67\xa3\x9c\xd8"
+                         "\x05\xe0\xc9",
+               .klen   = 19,
+               .iv     = "\x0f\xed\x34\xea\x97\xd4\x3b\xdf",
+               .assoc  = "\x49\x5c\x50\x1f\x1d\x94\xcc\x81"
+                         "\xba\xb7\xb6\x03\xaf\xa5\xc1\xa1"
+                         "\xd8\x5c\x42\x68\xe0\x6c\xda\x89"
+                         "\x05\xac\x56\xac\x1b\x2a\xd3\x86",
+               .alen   = 32,
+               .input  = "\x39\xbe\x7d\x15\x62\x77\xf3\x3c"
+                         "\xad\x83\x52\x6d\x71\x03\x25\x1c"
+                         "\xed\x81\x3a\x9a\x16\x7d\x19\x80"
+                         "\x72\x04\x72\xd0\xf6\xff\x05\x0f"
+                         "\xb7\x14\x30\x00\x32\x9e\xa0\xa6"
+                         "\x9e\x5a\x18\xa1\xb8\xfe\xdb\xd3",
+               .ilen   = 48,
+               .result = "\x75\x05\xbe\xc2\xd9\x1e\xde\x60"
+                         "\x47\x3d\x8c\x7d\xbd\xb5\xd9\xb7"
+                         "\xf2\xae\x61\x05\x8f\x82\x24\x3f"
+                         "\x9c\x67\x91\xe1\x38\x4f\xe4\x0c",
+               .rlen   = 32,
+       }, {
+               .key    = "\x39\xbb\xa7\xbe\x59\x97\x9e\x73"
+                         "\xa2\xbc\x6b\x98\xd7\x75\x7f\xe3"
+                         "\xa4\x48\x93\x39\x26\x71\x4a\xc6"
+                         "\xee\x49\x83",
+               .klen   = 27,
+               .iv     = "\xe9\xa9\xff\xe9\x57\xba\xfd\x9e",
+               .assoc  = "\x44\xa6\x2c\x05\xe9\xe1\x43\xb1"
+                         "\x58\x7c\xf2\x5c\x6d\x39\x0a\x64"
+                         "\xa4\xf0\x13\x05\xd1\x77\x99\x67"
+                         "\x11\xc4\xc6\xdb\x00\x56\x36\x61",
                .alen   = 32,
-               .input  = "\x87\xa3\x36\xfd\x96\xb3\x93\x78"
-                         "\xa9\x28\x63\xba\x12\xa3\x14\x85"
-                         "\x57\x1e\x06\xc9\x7b\x21\xef\x76"
-                         "\x7f\x38\x7e\x8e\x29\xa4\x3e\x7e",
-               .ilen   = 32,
-               .result = "\x8a\x1e\x11\xf0\x02\x6b\xe2\x19"
-                         "\xfc\x70\xc4\x6d\x8e\xb7\x99\xab"
-                         "\xc5\x4b\xa2\xac\xd3\xf3\x48\xff"
-                         "\x3b\xb5\xce\x53\xef\xde\xbb\x02"
-                         "\xa9\x86\x15\x6c\x13\xfe\xda\x0a"
-                         "\x22\xb8\x29\x3d\xd8\x39\x9a\x23",
-               .rlen   = 48,
+               .input  = "\x71\x99\xfa\xf4\x44\x12\x68\x9b",
+               .ilen   = 8,
+               .result = "\x00",
+               .rlen   = 0,
        }, {
-               .key    = "\xf4\x6b\xc2\x75\x62\xfe\xb4\xe1"
-                         "\xa3\xf0\xff\xdd\x4e\x4b\x12\x75"
-                         "\x53\x14\x73\x66\x8d\x88\xf6\x80"
-                         "\xa0\x20\x35",
+               .key    = "\x58\x5d\xa0\x96\x65\x1a\x04\xd7"
+                         "\x96\xe5\xc5\x68\xaa\x95\x35\xe0"
+                         "\x29\xa0\xba\x9e\x48\x78\xd1\xba"
+                         "\xee\x49\x83",
                .klen   = 27,
-               .iv     = "\x26\xf2\x21\x8d\x50\x20\xda\xe2",
-               .assoc  = "\x5b\x9e\x13\x67\x02\x5e\xef\xc1"
-                         "\x6c\xf9\xd7\x1e\x52\x8f\x7a\x47"
-                         "\xe9\xd4\xcf\x20\x14\x6e\xf0\x2d"
-                         "\xd8\x9e\x2b\x56\x10\x23\x56\xe7",
+               .iv     = "\xe9\xa9\xff\xe9\x57\xba\xfd\x9e",
+               .assoc  = "\x44\xa6\x2c\x05\xe9\xe1\x43\xb1"
+                         "\x58\x7c\xf2\x5c\x6d\x39\x0a\x64"
+                         "\xa4\xf0\x13\x05\xd1\x77\x99\x67"
+                         "\x11\xc4\xc6\xdb\x00\x56\x36\x61",
                .alen   = 32,
-               .ilen   = 0,
-               .result = "\x36\xea\x7a\x70\x08\xdc\x6a\xbc"
-                         "\xad\x0c\x7a\x63\xf6\x61\xfd\x9b",
-               .rlen   = 16,
+               .input  = "\xfb\xe5\x5d\x34\xbe\xe5\xe8\xe7"
+                         "\x5a\xef\x2f\xbf\x1f\x7f\xd4\xb2"
+                         "\x66\xca\x61\x1e\x96\x7a\x61\xb3"
+                         "\x1c\x16\x45\x52\xba\x04\x9c\x9f"
+                         "\xb1\xd2\x40\xbc\x52\x7c\x6f\xb1",
+               .ilen   = 40,
+               .result = "\x85\x34\x66\x42\xc8\x92\x0f\x36"
+                         "\x58\xe0\x6b\x91\x3c\x98\x5c\xbb"
+                         "\x0a\x85\xcc\x02\xad\x7a\x96\xe9"
+                         "\x65\x43\xa4\xc3\x0f\xdc\x55\x81",
+               .rlen   = 32,
        }, {
-               .key    = "\x56\xdf\x5c\x8f\x26\x3f\x0e\x42"
-                         "\xef\x7a\xd3\xce\xfc\x84\x60\x62"
-                         "\xca\xb4\x40\xaf\x5f\xc9\xc9\x01"
-                         "\xd6\x3c\x8c",
+               .key    = "\x58\x5d\xa0\x96\x65\x1a\x04\xd7"
+                         "\x96\xe5\xc5\x68\xaa\x95\x35\xe0"
+                         "\x29\xa0\xba\x9e\x48\x78\xd1\xba"
+                         "\xd1\xfc\x57",
                .klen   = 27,
-               .iv     = "\x86\x84\xb6\xcd\xef\x09\x2e\x94",
-               .assoc  = "\x02\x65\x78\x3c\xe9\x21\x30\x91"
-                         "\xb1\xb9\xda\x76\x9a\x78\x6d\x95"
-                         "\xf2\x88\x32\xa3\xf2\x50\xcb\x4c"
-                         "\xe3\x00\x73\x69\x84\x69\x87\x79",
+               .iv     = "\x9c\xfe\xb8\x9c\xad\x71\xaa\x1f",
+               .assoc  = "\x86\x67\xa5\xa9\x14\x5f\x0d\xc6"
+                         "\xff\x14\xc7\x44\xbf\x6c\x3a\xc3"
+                         "\xff\xb6\x81\xbd\xe2\xd5\x06\xc7"
+                         "\x3c\xa1\x52\x13\x03\x8a\x23\x3a",
                .alen   = 32,
-               .input  = "\x9f\xd2\x02\x4b\x52\x49\x31\x3c"
-                         "\x43\x69\x3a\x2d\x8e\x70\xad\x7e"
-                         "\xe0\xe5\x46\x09\x80\x89\x13\xb2"
-                         "\x8c\x8b\xd9\x3f\x86\xfb\xb5\x6b",
-               .ilen   = 32,
-               .result = "\x39\xdf\x7c\x3c\x5a\x29\xb9\x62"
-                         "\x5d\x51\xc2\x16\xd8\xbd\x06\x9f"
-                         "\x9b\x6a\x09\x70\xc1\x51\x83\xc2"
-                         "\x66\x88\x1d\x4f\x9a\xda\xe0\x1e"
-                         "\xc7\x79\x11\x58\xe5\x6b\x20\x40"
-                         "\x7a\xea\x46\x42\x8b\xe4\x6f\xe1",
-               .rlen   = 48,
+               .input  = "\x3f\x66\xb0\x9d\xe5\x4b\x38\x00"
+                         "\xc6\x0e\x6e\xe5\xd6\x98\xa6\x37"
+                         "\x8c\x26\x33\xc6\xb2\xa2\x17\xfa"
+                         "\x64\x19\xc0\x30\xd7\xfc\x14\x6b"
+                         "\xe3\x33\xc2\x04\xb0\x37\xbe\x3f"
+                         "\xa9\xb4\x2d\x68\x03\xa3\x44\xef",
+               .ilen   = 48,
+               .result = "\x02\x87\x4d\x28\x80\x6e\xb2\xed"
+                         "\x99\x2a\xa8\xca\x04\x25\x45\x90"
+                         "\x1d\xdd\x5a\xd9\xe4\xdb\x9c\x9c"
+                         "\x49\xe9\x01\xfe\xa7\x80\x6d\x6b",
+               .rlen   = 32,
+               .novrfy = 1,
        }, {
-               .key    = "\xe0\x8d\x99\x71\x60\xd7\x97\x1a"
-                         "\xbd\x01\x99\xd5\x8a\xdf\x71\x3a"
-                         "\xd3\xdf\x24\x4b\x5e\x3d\x4b\x4e"
-                         "\x30\x7a\xb9\xd8\x53\x0a\x5e\x2b"
-                         "\x1e\x29\x91",
+               .key    = "\xa4\x4b\x54\x29\x0a\xb8\x6d\x01"
+                         "\x5b\x80\x2a\xcf\x25\xc4\xb7\x5c"
+                         "\x20\x2c\xad\x30\xc2\x2b\x41\xfb"
+                         "\x0e\x85\xbc\x33\xad\x0f\x2b\xff"
+                         "\xee\x49\x83",
                .klen   = 35,
-               .iv     = "\xad\x8e\xc1\x53\x0a\xcf\x2d\xbe",
-               .assoc  = "\x19\xb6\x1f\x57\xc4\xf3\xf0\x8b"
-                         "\x78\x2b\x94\x02\x29\x0f\x42\x27"
-                         "\x6b\x75\xcb\x98\x34\x08\x7e\x79"
-                         "\xe4\x3e\x49\x0d\x84\x8b\x22\x87",
-               .alen   = 32,
-               .input  = "\xe1\xd9\xd8\x13\xeb\x3a\x75\x3f"
-                         "\x9d\xbd\x5f\x66\xbe\xdc\xbb\x66"
-                         "\xbf\x17\x99\x62\x4a\x39\x27\x1f"
-                         "\x1d\xdc\x24\xae\x19\x2f\x98\x4c",
-               .ilen   = 32,
-               .result = "\x19\xb8\x61\x33\x45\x2b\x43\x96"
-                         "\x6f\x51\xd0\x20\x30\x7d\x9b\xc6"
-                         "\x26\x3d\xf8\xc9\x65\x16\xa8\x9f"
-                         "\xf0\x62\x17\x34\xf2\x1e\x8d\x75"
-                         "\x4e\x13\xcc\xc0\xc3\x2a\x54\x2d",
-               .rlen   = 40,
+               .iv     = "\xe9\xa9\xff\xe9\x57\xba\xfd\x9e",
+               .alen   = 0,
+               .input  = "\x1f\xb8\x8f\xa3\xdd\x54\x00\xf2",
+               .ilen   = 8,
+               .result = "\x00",
+               .rlen   = 0,
        }, {
-               .key    = "\x7c\xc8\x18\x3b\x8d\x99\xe0\x7c"
-                         "\x45\x41\xb8\xbd\x5c\xa7\xc2\x32"
-                         "\x8a\xb8\x02\x59\xa4\xfe\xa9\x2c"
-                         "\x09\x75\x9a\x9b\x3c\x9b\x27\x39"
-                         "\xf9\xd9\x4e",
+               .key    = "\x39\xbb\xa7\xbe\x59\x97\x9e\x73"
+                         "\xa2\xbc\x6b\x98\xd7\x75\x7f\xe3"
+                         "\xa4\x48\x93\x39\x26\x71\x4a\xc6"
+                         "\xae\x8f\x11\x4c\xc2\x9c\x4a\xbb"
+                         "\x85\x34\x66",
                .klen   = 35,
-               .iv     = "\x63\xb5\x3d\x9d\x43\xf6\x1e\x50",
-               .assoc  = "\x57\xf5\x6b\x8b\x57\x5c\x3d\x3b"
-                         "\x13\x02\x01\x0c\x83\x4c\x96\x35"
-                         "\x8e\xd6\x39\xcf\x7d\x14\x9b\x94"
-                         "\xb0\x39\x36\xe6\x8f\x57\xe0\x13",
+               .iv     = "\x42\xc8\x92\x0f\x36\x58\xe0\x6b",
+               .alen   = 0,
+               .input  = "\x48\x01\x5e\x02\x24\x04\x66\x47"
+                         "\xa1\xea\x6f\xaf\xe8\xfc\xfb\xdd"
+                         "\xa5\xa9\x87\x8d\x84\xee\x2e\x77"
+                         "\xbb\x86\xb9\xf5\x5c\x6c\xff\xf6"
+                         "\x72\xc3\x8e\xf7\x70\xb1\xb2\x07"
+                         "\xbc\xa8\xa3\xbd\x83\x7c\x1d\x2a",
+               .ilen   = 48,
+               .result = "\xdc\x56\xf2\x71\xb0\xb1\xa0\x6c"
+                         "\xf0\x97\x3a\xfb\x6d\xe7\x32\x99"
+                         "\x3e\xaf\x70\x5e\xb2\x4d\xea\x39"
+                         "\x89\xd4\x75\x7a\x63\xb1\xda\x93",
+               .rlen   = 32,
+               .novrfy = 1,
+       }, {
+               .key    = "\x58\x5d\xa0\x96\x65\x1a\x04\xd7"
+                         "\x96\xe5\xc5\x68\xaa\x95\x35\xe0"
+                         "\x29\xa0\xba\x9e\x48\x78\xd1\xba"
+                         "\x0d\x1a\x53\x3b\xb5\xe3\xf8\x8b"
+                         "\xcf\x76\x3f",
+               .klen   = 35,
+               .iv     = "\xd9\x95\x75\x8f\x44\x89\x40\x7b",
+               .assoc  = "\x8f\x86\x6c\x4d\x1d\xc5\x39\x88"
+                         "\xc8\xf3\x5c\x52\x10\x63\x6f\x2b"
+                         "\x8a\x2a\xc5\x6f\x30\x23\x58\x7b"
+                         "\xfb\x36\x03\x11\xb4\xd9\xf2\xfe",
                .alen   = 32,
-               .input  = "\x3b\x6c\x29\x36\xb6\xef\x07\xa6"
-                         "\x83\x72\x07\x4f\xcf\xfa\x66\x89"
-                         "\x5f\xca\xb1\xba\xd5\x8f\x2c\x27"
-                         "\x30\xdb\x75\x09\x93\xd4\x65\xe4",
-               .ilen   = 32,
-               .result = "\xb0\x88\x5a\x33\xaa\xe5\xc7\x1d"
-                         "\x85\x23\xc7\xc6\x2f\xf4\x1e\x3d"
-                         "\xcc\x63\x44\x25\x07\x78\x4f\x9e"
-                         "\x96\xb8\x88\xeb\xbc\x48\x1f\x06"
-                         "\x39\xaf\x39\xac\xd8\x4a\x80\x39"
-                         "\x7b\x72\x8a\xf7",
-               .rlen   = 44,
+               .input  = "\x48\x58\xd6\xf3\xad\x63\x58\xbf"
+                         "\xae\xc7\x5e\xae\x83\x8f\x7b\xe4"
+                         "\x78\x5c\x4c\x67\x71\x89\x94\xbf"
+                         "\x47\xf1\x63\x7e\x1c\x59\xbd\xc5"
+                         "\x7f\x44\x0a\x0c\x01\x18\x07\x92"
+                         "\xe1\xd3\x51\xce\x32\x6d\x0c\x5b",
+               .ilen   = 48,
+               .result = "\xc2\x54\xc8\xde\x78\x87\x77\x40"
+                         "\x49\x71\xe4\xb7\xe7\xcb\x76\x61"
+                         "\x0a\x41\xb9\xe9\xc0\x76\x54\xab"
+                         "\x04\x49\x3b\x19\x93\x57\x25\x5d",
+               .rlen   = 32,
+       },
+};
+
+/*
+ * ANSI X9.31 Continuous Pseudo-Random Number Generator (AES mode)
+ * test vectors, taken from Appendix B.2.9 and B.2.10:
+ *     http://csrc.nist.gov/groups/STM/cavp/documents/rng/RNGVS.pdf
+ * Only AES-128 is supported at this time.
+ */
+#define ANSI_CPRNG_AES_TEST_VECTORS    6
+
+static struct cprng_testvec ansi_cprng_aes_tv_template[] = {
+       {
+               .key    = "\xf3\xb1\x66\x6d\x13\x60\x72\x42"
+                         "\xed\x06\x1c\xab\xb8\xd4\x62\x02",
+               .klen   = 16,
+               .dt     = "\xe6\xb3\xbe\x78\x2a\x23\xfa\x62"
+                         "\xd7\x1d\x4a\xfb\xb0\xe9\x22\xf9",
+               .dtlen  = 16,
+               .v      = "\x80\x00\x00\x00\x00\x00\x00\x00"
+                         "\x00\x00\x00\x00\x00\x00\x00\x00",
+               .vlen   = 16,
+               .result = "\x59\x53\x1e\xd1\x3b\xb0\xc0\x55"
+                         "\x84\x79\x66\x85\xc1\x2f\x76\x41",
+               .rlen   = 16,
+               .loops  = 1,
+       }, {
+               .key    = "\xf3\xb1\x66\x6d\x13\x60\x72\x42"
+                         "\xed\x06\x1c\xab\xb8\xd4\x62\x02",
+               .klen   = 16,
+               .dt     = "\xe6\xb3\xbe\x78\x2a\x23\xfa\x62"
+                         "\xd7\x1d\x4a\xfb\xb0\xe9\x22\xfa",
+               .dtlen  = 16,
+               .v      = "\xc0\x00\x00\x00\x00\x00\x00\x00"
+                         "\x00\x00\x00\x00\x00\x00\x00\x00",
+               .vlen   = 16,
+               .result = "\x7c\x22\x2c\xf4\xca\x8f\xa2\x4c"
+                         "\x1c\x9c\xb6\x41\xa9\xf3\x22\x0d",
+               .rlen   = 16,
+               .loops  = 1,
        }, {
-               .key    = "\xab\xd0\xe9\x33\x07\x26\xe5\x83"
-                         "\x8c\x76\x95\xd4\xb6\xdc\xf3\x46"
-                         "\xf9\x8f\xad\xe3\x02\x13\x83\x77"
-                         "\x3f\xb0\xf1\xa1\xa1\x22\x0f\x2b"
-                         "\x24\xa7\x8b",
-               .klen   = 35,
-               .iv     = "\x07\xcb\xcc\x0e\xe6\x33\xbf\xf5",
-               .assoc  = "\xd4\xdb\x30\x1d\x03\xfe\xfd\x5f"
-                         "\x87\xd4\x8c\xb6\xb6\xf1\x7a\x5d"
-                         "\xab\x90\x65\x8d\x8e\xca\x4d\x4f"
-                         "\x16\x0c\x40\x90\x4b\xc7\x36\x73",
-               .alen   = 32,
-               .input  = "\xf5\xc6\x7d\x48\xc1\xb7\xe6\x92"
-                         "\x97\x5a\xca\xc4\xa9\x6d\xf9\x3d"
-                         "\x6c\xde\xbc\xf1\x90\xea\x6a\xb2"
-                         "\x35\x86\x36\xaf\x5c\xfe\x4b\x3a",
-               .ilen   = 32,
-               .result = "\x83\x6f\x40\x87\x72\xcf\xc1\x13"
-                         "\xef\xbb\x80\x21\x04\x6c\x58\x09"
-                         "\x07\x1b\xfc\xdf\xc0\x3f\x5b\xc7"
-                         "\xe0\x79\xa8\x6e\x71\x7c\x3f\xcf"
-                         "\x5c\xda\xb2\x33\xe5\x13\xe2\x0d"
-                         "\x74\xd1\xef\xb5\x0f\x3a\xb5\xf8",
-               .rlen   = 48,
+               .key    = "\xf3\xb1\x66\x6d\x13\x60\x72\x42"
+                         "\xed\x06\x1c\xab\xb8\xd4\x62\x02",
+               .klen   = 16,
+               .dt     = "\xe6\xb3\xbe\x78\x2a\x23\xfa\x62"
+                         "\xd7\x1d\x4a\xfb\xb0\xe9\x22\xfb",
+               .dtlen  = 16,
+               .v      = "\xe0\x00\x00\x00\x00\x00\x00\x00"
+                         "\x00\x00\x00\x00\x00\x00\x00\x00",
+               .vlen   = 16,
+               .result = "\x8a\xaa\x00\x39\x66\x67\x5b\xe5"
+                         "\x29\x14\x28\x81\xa9\x4d\x4e\xc7",
+               .rlen   = 16,
+               .loops  = 1,
+       }, {
+               .key    = "\xf3\xb1\x66\x6d\x13\x60\x72\x42"
+                         "\xed\x06\x1c\xab\xb8\xd4\x62\x02",
+               .klen   = 16,
+               .dt     = "\xe6\xb3\xbe\x78\x2a\x23\xfa\x62"
+                         "\xd7\x1d\x4a\xfb\xb0\xe9\x22\xfc",
+               .dtlen  = 16,
+               .v      = "\xf0\x00\x00\x00\x00\x00\x00\x00"
+                         "\x00\x00\x00\x00\x00\x00\x00\x00",
+               .vlen   = 16,
+               .result = "\x88\xdd\xa4\x56\x30\x24\x23\xe5"
+                         "\xf6\x9d\xa5\x7e\x7b\x95\xc7\x3a",
+               .rlen   = 16,
+               .loops  = 1,
+       }, {
+               .key    = "\xf3\xb1\x66\x6d\x13\x60\x72\x42"
+                         "\xed\x06\x1c\xab\xb8\xd4\x62\x02",
+               .klen   = 16,
+               .dt     = "\xe6\xb3\xbe\x78\x2a\x23\xfa\x62"
+                         "\xd7\x1d\x4a\xfb\xb0\xe9\x22\xfd",
+               .dtlen  = 16,
+               .v      = "\xf8\x00\x00\x00\x00\x00\x00\x00"
+                         "\x00\x00\x00\x00\x00\x00\x00\x00",
+               .vlen   = 16,
+               .result = "\x05\x25\x92\x46\x61\x79\xd2\xcb"
+                         "\x78\xc4\x0b\x14\x0a\x5a\x9a\xc8",
+               .rlen   = 16,
+               .loops  = 1,
+       }, {    /* Monte Carlo Test */
+               .key    = "\x9f\x5b\x51\x20\x0b\xf3\x34\xb5"
+                         "\xd8\x2b\xe8\xc3\x72\x55\xc8\x48",
+               .klen   = 16,
+               .dt     = "\x63\x76\xbb\xe5\x29\x02\xba\x3b"
+                         "\x67\xc9\x25\xfa\x70\x1f\x11\xac",
+               .dtlen  = 16,
+               .v      = "\x57\x2c\x8e\x76\x87\x26\x47\x97"
+                         "\x7e\x74\xfb\xdd\xc4\x95\x01\xd1",
+               .vlen   = 16,
+               .result = "\x48\xe9\xbd\x0d\x06\xee\x18\xfb"
+                         "\xe4\x57\x90\xd5\xc3\xfc\x9b\x73",
+               .rlen   = 16,
+               .loops  = 10000,
        },
 };
 
-static struct aead_testvec aes_ccm_rfc4309_dec_tv_template[] = {
+/* Cast5 test vectors from RFC 2144 */
+#define CAST5_ENC_TEST_VECTORS         4
+#define CAST5_DEC_TEST_VECTORS         4
+#define CAST5_CBC_ENC_TEST_VECTORS     1
+#define CAST5_CBC_DEC_TEST_VECTORS     1
+#define CAST5_CTR_ENC_TEST_VECTORS     2
+#define CAST5_CTR_DEC_TEST_VECTORS     2
+
+static struct cipher_testvec cast5_enc_tv_template[] = {
        {
-               .key    = "\xab\x2f\x8a\x74\xb7\x1c\xd2\xb1"
-                         "\xff\x80\x2e\x48\x7d\x82\xf8\xb9"
-                         "\xc6\xfb\x7d",
-               .klen   = 19,
-               .iv     = "\x80\x0d\x13\xab\xd8\xa6\xb2\xd8",
-               .alen   = 0,
-               .input  = "\xd5\xe8\x93\x9f\xc7\x89\x2e\x2b",
+               .key    = "\x01\x23\x45\x67\x12\x34\x56\x78"
+                         "\x23\x45\x67\x89\x34\x56\x78\x9a",
+               .klen   = 16,
+               .input  = "\x01\x23\x45\x67\x89\xab\xcd\xef",
                .ilen   = 8,
-               .result = "\x00",
-               .rlen   = 0,
-               .novrfy = 1,
+               .result = "\x23\x8b\x4f\xe5\x84\x7e\x44\xb2",
+               .rlen   = 8,
        }, {
-               .key    = "\xab\x2f\x8a\x74\xb7\x1c\xd2\xb1"
-                         "\xff\x80\x2e\x48\x7d\x82\xf8\xb9"
-                         "\xaf\x94\x87",
-               .klen   = 19,
-               .iv     = "\x78\x35\x82\x81\x7f\x88\x94\x68",
-               .alen   = 0,
-               .input  = "\x41\x3c\xb8\x87\x73\xcb\xf3\xf3",
+               .key    = "\x01\x23\x45\x67\x12\x34\x56\x78"
+                         "\x23\x45",
+               .klen   = 10,
+               .input  = "\x01\x23\x45\x67\x89\xab\xcd\xef",
                .ilen   = 8,
-               .result = "\x00",
-               .rlen   = 0,
-       }, {
-               .key    = "\x61\x0e\x8c\xae\xe3\x23\xb6\x38"
-                         "\x76\x1c\xf6\x3a\x67\xa3\x9c\xd8"
-                         "\xc6\xfb\x7d",
-               .klen   = 19,
-               .iv     = "\x80\x0d\x13\xab\xd8\xa6\xb2\xd8",
-               .assoc  = "\xf3\x94\x87\x78\x35\x82\x81\x7f"
-                         "\x88\x94\x68\xb1\x78\x6b\x2b\xd6"
-                         "\x04\x1f\x4e\xed\x78\xd5\x33\x66"
-                         "\xd8\x94\x99\x91\x81\x54\x62\x57",
-               .alen   = 32,
-               .input  = "\xf0\x7c\x29\x02\xae\x1c\x2f\x55"
-                         "\xd0\xd1\x3d\x1a\xa3\x6d\xe4\x0a"
-                         "\x86\xb0\x87\x6b\x62\x33\x8c\x34"
-                         "\xce\xab\x57\xcc\x79\x0b\xe0\x6f"
-                         "\x5c\x3e\x48\x1f\x6c\x46\xf7\x51"
-                         "\x8b\x84\x83\x2a\xc1\x05\xb8\xc5",
-               .ilen   = 48,
-               .result = "\x50\x82\x3e\x07\xe2\x1e\xb6\xfb"
-                         "\x33\xe4\x73\xce\xd2\xfb\x95\x79"
-                         "\xe8\xb4\xb5\x77\x11\x10\x62\x6f"
-                         "\x6a\x82\xd1\x13\xec\xf5\xd0\x48",
-               .rlen   = 32,
-               .novrfy = 1,
-       }, {
-               .key    = "\x61\x0e\x8c\xae\xe3\x23\xb6\x38"
-                         "\x76\x1c\xf6\x3a\x67\xa3\x9c\xd8"
-                         "\x05\xe0\xc9",
-               .klen   = 19,
-               .iv     = "\x0f\xed\x34\xea\x97\xd4\x3b\xdf",
-               .assoc  = "\x49\x5c\x50\x1f\x1d\x94\xcc\x81"
-                         "\xba\xb7\xb6\x03\xaf\xa5\xc1\xa1"
-                         "\xd8\x5c\x42\x68\xe0\x6c\xda\x89"
-                         "\x05\xac\x56\xac\x1b\x2a\xd3\x86",
-               .alen   = 32,
-               .input  = "\x39\xbe\x7d\x15\x62\x77\xf3\x3c"
-                         "\xad\x83\x52\x6d\x71\x03\x25\x1c"
-                         "\xed\x81\x3a\x9a\x16\x7d\x19\x80"
-                         "\x72\x04\x72\xd0\xf6\xff\x05\x0f"
-                         "\xb7\x14\x30\x00\x32\x9e\xa0\xa6"
-                         "\x9e\x5a\x18\xa1\xb8\xfe\xdb\xd3",
-               .ilen   = 48,
-               .result = "\x75\x05\xbe\xc2\xd9\x1e\xde\x60"
-                         "\x47\x3d\x8c\x7d\xbd\xb5\xd9\xb7"
-                         "\xf2\xae\x61\x05\x8f\x82\x24\x3f"
-                         "\x9c\x67\x91\xe1\x38\x4f\xe4\x0c",
-               .rlen   = 32,
+               .result = "\xeb\x6a\x71\x1a\x2c\x02\x27\x1b",
+               .rlen   = 8,
        }, {
-               .key    = "\x39\xbb\xa7\xbe\x59\x97\x9e\x73"
-                         "\xa2\xbc\x6b\x98\xd7\x75\x7f\xe3"
-                         "\xa4\x48\x93\x39\x26\x71\x4a\xc6"
-                         "\xee\x49\x83",
-               .klen   = 27,
-               .iv     = "\xe9\xa9\xff\xe9\x57\xba\xfd\x9e",
-               .assoc  = "\x44\xa6\x2c\x05\xe9\xe1\x43\xb1"
-                         "\x58\x7c\xf2\x5c\x6d\x39\x0a\x64"
-                         "\xa4\xf0\x13\x05\xd1\x77\x99\x67"
-                         "\x11\xc4\xc6\xdb\x00\x56\x36\x61",
-               .alen   = 32,
-               .input  = "\x71\x99\xfa\xf4\x44\x12\x68\x9b",
+               .key    = "\x01\x23\x45\x67\x12",
+               .klen   = 5,
+               .input  = "\x01\x23\x45\x67\x89\xab\xcd\xef",
+               .ilen   = 8,
+               .result = "\x7a\xc8\x16\xd1\x6e\x9b\x30\x2e",
+               .rlen   = 8,
+       }, { /* Generated from TF test vectors */
+               .key    = "\x85\x62\x3F\x1C\xF9\xD6\x1C\xF9"
+                         "\xD6\xB3\x90\x6D\x4A\x90\x6D\x4A",
+               .klen   = 16,
+               .iv     = "\xE2\x24\x89\xEE\x53\xB8\x1D\x5F",
+               .input  = "\x56\xED\x84\x1B\x8F\x26\xBD\x31"
+                         "\xC8\x5F\xF6\x6A\x01\x98\x0C\xA3"
+                         "\x3A\xD1\x45\xDC\x73\x0A\x7E\x15"
+                         "\xAC\x20\xB7\x4E\xE5\x59\xF0\x87"
+                         "\x1E\x92\x29\xC0\x34\xCB\x62\xF9"
+                         "\x6D\x04\x9B\x0F\xA6\x3D\xD4\x48"
+                         "\xDF\x76\x0D\x81\x18\xAF\x23\xBA"
+                         "\x51\xE8\x5C\xF3\x8A\x21\x95\x2C"
+                         "\xC3\x37\xCE\x65\xFC\x70\x07\x9E"
+                         "\x12\xA9\x40\xD7\x4B\xE2\x79\x10"
+                         "\x84\x1B\xB2\x26\xBD\x54\xEB\x5F"
+                         "\xF6\x8D\x01\x98\x2F\xC6\x3A\xD1"
+                         "\x68\xFF\x73\x0A\xA1\x15\xAC\x43"
+                         "\xDA\x4E\xE5\x7C\x13\x87\x1E\xB5"
+                         "\x29\xC0\x57\xEE\x62\xF9\x90\x04"
+                         "\x9B\x32\xC9\x3D\xD4\x6B\x02\x76"
+                         "\x0D\xA4\x18\xAF\x46\xDD\x51\xE8"
+                         "\x7F\x16\x8A\x21\xB8\x2C\xC3\x5A"
+                         "\xF1\x65\xFC\x93\x07\x9E\x35\xCC"
+                         "\x40\xD7\x6E\x05\x79\x10\xA7\x1B"
+                         "\xB2\x49\xE0\x54\xEB\x82\x19\x8D"
+                         "\x24\xBB\x2F\xC6\x5D\xF4\x68\xFF"
+                         "\x96\x0A\xA1\x38\xCF\x43\xDA\x71"
+                         "\x08\x7C\x13\xAA\x1E\xB5\x4C\xE3"
+                         "\x57\xEE\x85\x1C\x90\x27\xBE\x32"
+                         "\xC9\x60\xF7\x6B\x02\x99\x0D\xA4"
+                         "\x3B\xD2\x46\xDD\x74\x0B\x7F\x16"
+                         "\xAD\x21\xB8\x4F\xE6\x5A\xF1\x88"
+                         "\x1F\x93\x2A\xC1\x35\xCC\x63\xFA"
+                         "\x6E\x05\x9C\x10\xA7\x3E\xD5\x49"
+                         "\xE0\x77\x0E\x82\x19\xB0\x24\xBB"
+                         "\x52\xE9\x5D\xF4\x8B\x22\x96\x2D"
+                         "\xC4\x38\xCF\x66\xFD\x71\x08\x9F"
+                         "\x13\xAA\x41\xD8\x4C\xE3\x7A\x11"
+                         "\x85\x1C\xB3\x27\xBE\x55\xEC\x60"
+                         "\xF7\x8E\x02\x99\x30\xC7\x3B\xD2"
+                         "\x69\x00\x74\x0B\xA2\x16\xAD\x44"
+                         "\xDB\x4F\xE6\x7D\x14\x88\x1F\xB6"
+                         "\x2A\xC1\x58\xEF\x63\xFA\x91\x05"
+                         "\x9C\x33\xCA\x3E\xD5\x6C\x03\x77"
+                         "\x0E\xA5\x19\xB0\x47\xDE\x52\xE9"
+                         "\x80\x17\x8B\x22\xB9\x2D\xC4\x5B"
+                         "\xF2\x66\xFD\x94\x08\x9F\x36\xCD"
+                         "\x41\xD8\x6F\x06\x7A\x11\xA8\x1C"
+                         "\xB3\x4A\xE1\x55\xEC\x83\x1A\x8E"
+                         "\x25\xBC\x30\xC7\x5E\xF5\x69\x00"
+                         "\x97\x0B\xA2\x39\xD0\x44\xDB\x72"
+                         "\x09\x7D\x14\xAB\x1F\xB6\x4D\xE4"
+                         "\x58\xEF\x86\x1D\x91\x28\xBF\x33"
+                         "\xCA\x61\xF8\x6C\x03\x9A\x0E\xA5"
+                         "\x3C\xD3\x47\xDE\x75\x0C\x80\x17"
+                         "\xAE\x22\xB9\x50\xE7\x5B\xF2\x89"
+                         "\x20\x94\x2B\xC2\x36\xCD\x64\xFB"
+                         "\x6F\x06\x9D\x11\xA8\x3F\xD6\x4A"
+                         "\xE1\x78\x0F\x83\x1A\xB1\x25\xBC"
+                         "\x53\xEA\x5E\xF5\x8C\x00\x97\x2E"
+                         "\xC5\x39\xD0\x67\xFE\x72\x09\xA0"
+                         "\x14\xAB\x42\xD9\x4D\xE4\x7B\x12"
+                         "\x86\x1D\xB4\x28\xBF\x56\xED\x61"
+                         "\xF8\x8F\x03\x9A\x31\xC8\x3C\xD3"
+                         "\x6A\x01\x75\x0C\xA3\x17\xAE\x45"
+                         "\xDC\x50\xE7\x7E\x15\x89\x20\xB7",
+               .ilen   = 496,
+               .result = "\x8D\xFC\x81\x9C\xCB\xAA\x5A\x1C"
+                         "\x7E\x95\xCF\x40\xAB\x4D\x6F\xEA"
+                         "\xD3\xD9\xB0\x9A\xB7\xC7\xE0\x2E"
+                         "\xD1\x39\x34\x92\x8F\xFA\x14\xF1"
+                         "\xD5\xD2\x7B\x59\x1F\x35\x28\xC2"
+                         "\x20\xD9\x42\x06\xC9\x0B\x10\x04"
+                         "\xF8\x79\xCD\x32\x86\x75\x4C\xB6"
+                         "\x7B\x1C\x52\xB1\x91\x64\x22\x4B"
+                         "\x13\xC7\xAE\x98\x0E\xB5\xCF\x6F"
+                         "\x3F\xF4\x43\x96\x73\x0D\xA2\x05"
+                         "\xDB\xFD\x28\x90\x2C\x56\xB9\x37"
+                         "\x5B\x69\x0C\xAD\x84\x67\xFF\x15"
+                         "\x4A\xD4\xA7\xD3\xDD\x99\x47\x3A"
+                         "\xED\x34\x35\x78\x6B\x91\xC9\x32"
+                         "\xE1\xBF\xBC\xB4\x04\x85\x6A\x39"
+                         "\xC0\xBA\x51\xD0\x0F\x4E\xD1\xE2"
+                         "\x1C\xFD\x0E\x05\x07\xF4\x10\xED"
+                         "\xA2\x17\xFF\xF5\x64\xC6\x1A\x22"
+                         "\xAD\x78\xE7\xD7\x11\xE9\x99\xB9"
+                         "\xAA\xEC\x6F\xF8\x3B\xBF\xCE\x77"
+                         "\x93\xE8\xAD\x1D\x50\x6C\xAE\xBC"
+                         "\xBA\x5C\x80\xD1\x91\x65\x51\x1B"
+                         "\xE8\x0A\xCD\x99\x96\x71\x3D\xB6"
+                         "\x78\x75\x37\x55\xC1\xF5\x90\x40"
+                         "\x34\xF4\x7E\xC8\xCC\x3A\x5F\x6E"
+                         "\x36\xA1\xA1\xC2\x3A\x72\x42\x8E"
+                         "\x0E\x37\x88\xE8\xCE\x83\xCB\xAD"
+                         "\xE0\x69\x77\x50\xC7\x0C\x99\xCA"
+                         "\x19\x5B\x30\x25\x9A\xEF\x9B\x0C"
+                         "\xEF\x8F\x74\x4C\xCF\x49\x4E\xB9"
+                         "\xC5\xAE\x9E\x2E\x78\x9A\xB9\x48"
+                         "\xD5\x81\xE4\x37\x1D\xBF\x27\xD9"
+                         "\xC5\xD6\x65\x43\x45\x8C\xBB\xB6"
+                         "\x55\xF4\x06\xBB\x49\x53\x8B\x1B"
+                         "\x07\xA9\x96\x69\x5B\xCB\x0F\xBC"
+                         "\x93\x85\x90\x0F\x0A\x68\x40\x2A"
+                         "\x95\xED\x2D\x88\xBF\x71\xD0\xBB"
+                         "\xEC\xB0\x77\x6C\x79\xFC\x3C\x05"
+                         "\x49\x3F\xB8\x24\xEF\x8E\x09\xA2"
+                         "\x1D\xEF\x92\x02\x96\xD4\x7F\xC8"
+                         "\x03\xB2\xCA\xDB\x17\x5C\x52\xCF"
+                         "\xDD\x70\x37\x63\xAA\xA5\x83\x20"
+                         "\x52\x02\xF6\xB9\xE7\x6E\x0A\xB6"
+                         "\x79\x03\xA0\xDA\xA3\x79\x21\xBD"
+                         "\xE3\x37\x3A\xC0\xF7\x2C\x32\xBE"
+                         "\x8B\xE8\xA6\x00\xC7\x32\xD5\x06"
+                         "\xBB\xE3\xAB\x06\x21\x82\xB8\x32"
+                         "\x31\x34\x2A\xA7\x1F\x64\x99\xBF"
+                         "\xFA\xDA\x3D\x75\xF7\x48\xD5\x48"
+                         "\x4B\x52\x7E\xF6\x7C\xAB\x67\x59"
+                         "\xC5\xDC\xA8\xC6\x63\x85\x4A\xDF"
+                         "\xF0\x40\x5F\xCF\xE3\x58\x52\x67"
+                         "\x7A\x24\x32\xC5\xEC\x9E\xA9\x6F"
+                         "\x58\x56\xDD\x94\x1F\x71\x8D\xF4"
+                         "\x6E\xFF\x2C\xA7\xA5\xD8\xBA\xAF"
+                         "\x1D\x8B\xA2\x46\xB5\xC4\x9F\x57"
+                         "\x8D\xD8\xB3\x3C\x02\x0D\xBB\x84"
+                         "\xC7\xBD\xB4\x9A\x6E\xBB\xB1\x37"
+                         "\x95\x79\xC4\xA7\xEA\x1D\xDC\x33"
+                         "\x5D\x0B\x3F\x03\x8F\x30\xF9\xAE"
+                         "\x4F\xFE\x24\x9C\x9A\x02\xE5\x57"
+                         "\xF5\xBC\x25\xD6\x02\x56\x57\x1C",
+               .rlen   = 496,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 496 - 16, 16 },
+       },
+};
+
+static struct cipher_testvec cast5_dec_tv_template[] = {
+       {
+               .key    = "\x01\x23\x45\x67\x12\x34\x56\x78"
+                         "\x23\x45\x67\x89\x34\x56\x78\x9a",
+               .klen   = 16,
+               .input  = "\x23\x8b\x4f\xe5\x84\x7e\x44\xb2",
                .ilen   = 8,
-               .result = "\x00",
-               .rlen   = 0,
-       }, {
-               .key    = "\x58\x5d\xa0\x96\x65\x1a\x04\xd7"
-                         "\x96\xe5\xc5\x68\xaa\x95\x35\xe0"
-                         "\x29\xa0\xba\x9e\x48\x78\xd1\xba"
-                         "\xee\x49\x83",
-               .klen   = 27,
-               .iv     = "\xe9\xa9\xff\xe9\x57\xba\xfd\x9e",
-               .assoc  = "\x44\xa6\x2c\x05\xe9\xe1\x43\xb1"
-                         "\x58\x7c\xf2\x5c\x6d\x39\x0a\x64"
-                         "\xa4\xf0\x13\x05\xd1\x77\x99\x67"
-                         "\x11\xc4\xc6\xdb\x00\x56\x36\x61",
-               .alen   = 32,
-               .input  = "\xfb\xe5\x5d\x34\xbe\xe5\xe8\xe7"
-                         "\x5a\xef\x2f\xbf\x1f\x7f\xd4\xb2"
-                         "\x66\xca\x61\x1e\x96\x7a\x61\xb3"
-                         "\x1c\x16\x45\x52\xba\x04\x9c\x9f"
-                         "\xb1\xd2\x40\xbc\x52\x7c\x6f\xb1",
-               .ilen   = 40,
-               .result = "\x85\x34\x66\x42\xc8\x92\x0f\x36"
-                         "\x58\xe0\x6b\x91\x3c\x98\x5c\xbb"
-                         "\x0a\x85\xcc\x02\xad\x7a\x96\xe9"
-                         "\x65\x43\xa4\xc3\x0f\xdc\x55\x81",
-               .rlen   = 32,
-       }, {
-               .key    = "\x58\x5d\xa0\x96\x65\x1a\x04\xd7"
-                         "\x96\xe5\xc5\x68\xaa\x95\x35\xe0"
-                         "\x29\xa0\xba\x9e\x48\x78\xd1\xba"
-                         "\xd1\xfc\x57",
-               .klen   = 27,
-               .iv     = "\x9c\xfe\xb8\x9c\xad\x71\xaa\x1f",
-               .assoc  = "\x86\x67\xa5\xa9\x14\x5f\x0d\xc6"
-                         "\xff\x14\xc7\x44\xbf\x6c\x3a\xc3"
-                         "\xff\xb6\x81\xbd\xe2\xd5\x06\xc7"
-                         "\x3c\xa1\x52\x13\x03\x8a\x23\x3a",
-               .alen   = 32,
-               .input  = "\x3f\x66\xb0\x9d\xe5\x4b\x38\x00"
-                         "\xc6\x0e\x6e\xe5\xd6\x98\xa6\x37"
-                         "\x8c\x26\x33\xc6\xb2\xa2\x17\xfa"
-                         "\x64\x19\xc0\x30\xd7\xfc\x14\x6b"
-                         "\xe3\x33\xc2\x04\xb0\x37\xbe\x3f"
-                         "\xa9\xb4\x2d\x68\x03\xa3\x44\xef",
-               .ilen   = 48,
-               .result = "\x02\x87\x4d\x28\x80\x6e\xb2\xed"
-                         "\x99\x2a\xa8\xca\x04\x25\x45\x90"
-                         "\x1d\xdd\x5a\xd9\xe4\xdb\x9c\x9c"
-                         "\x49\xe9\x01\xfe\xa7\x80\x6d\x6b",
-               .rlen   = 32,
-               .novrfy = 1,
+               .result = "\x01\x23\x45\x67\x89\xab\xcd\xef",
+               .rlen   = 8,
        }, {
-               .key    = "\xa4\x4b\x54\x29\x0a\xb8\x6d\x01"
-                         "\x5b\x80\x2a\xcf\x25\xc4\xb7\x5c"
-                         "\x20\x2c\xad\x30\xc2\x2b\x41\xfb"
-                         "\x0e\x85\xbc\x33\xad\x0f\x2b\xff"
-                         "\xee\x49\x83",
-               .klen   = 35,
-               .iv     = "\xe9\xa9\xff\xe9\x57\xba\xfd\x9e",
-               .alen   = 0,
-               .input  = "\x1f\xb8\x8f\xa3\xdd\x54\x00\xf2",
+               .key    = "\x01\x23\x45\x67\x12\x34\x56\x78"
+                         "\x23\x45",
+               .klen   = 10,
+               .input  = "\xeb\x6a\x71\x1a\x2c\x02\x27\x1b",
                .ilen   = 8,
-               .result = "\x00",
-               .rlen   = 0,
-       }, {
-               .key    = "\x39\xbb\xa7\xbe\x59\x97\x9e\x73"
-                         "\xa2\xbc\x6b\x98\xd7\x75\x7f\xe3"
-                         "\xa4\x48\x93\x39\x26\x71\x4a\xc6"
-                         "\xae\x8f\x11\x4c\xc2\x9c\x4a\xbb"
-                         "\x85\x34\x66",
-               .klen   = 35,
-               .iv     = "\x42\xc8\x92\x0f\x36\x58\xe0\x6b",
-               .alen   = 0,
-               .input  = "\x48\x01\x5e\x02\x24\x04\x66\x47"
-                         "\xa1\xea\x6f\xaf\xe8\xfc\xfb\xdd"
-                         "\xa5\xa9\x87\x8d\x84\xee\x2e\x77"
-                         "\xbb\x86\xb9\xf5\x5c\x6c\xff\xf6"
-                         "\x72\xc3\x8e\xf7\x70\xb1\xb2\x07"
-                         "\xbc\xa8\xa3\xbd\x83\x7c\x1d\x2a",
-               .ilen   = 48,
-               .result = "\xdc\x56\xf2\x71\xb0\xb1\xa0\x6c"
-                         "\xf0\x97\x3a\xfb\x6d\xe7\x32\x99"
-                         "\x3e\xaf\x70\x5e\xb2\x4d\xea\x39"
-                         "\x89\xd4\x75\x7a\x63\xb1\xda\x93",
-               .rlen   = 32,
-               .novrfy = 1,
+               .result = "\x01\x23\x45\x67\x89\xab\xcd\xef",
+               .rlen   = 8,
        }, {
-               .key    = "\x58\x5d\xa0\x96\x65\x1a\x04\xd7"
-                         "\x96\xe5\xc5\x68\xaa\x95\x35\xe0"
-                         "\x29\xa0\xba\x9e\x48\x78\xd1\xba"
-                         "\x0d\x1a\x53\x3b\xb5\xe3\xf8\x8b"
-                         "\xcf\x76\x3f",
-               .klen   = 35,
-               .iv     = "\xd9\x95\x75\x8f\x44\x89\x40\x7b",
-               .assoc  = "\x8f\x86\x6c\x4d\x1d\xc5\x39\x88"
-                         "\xc8\xf3\x5c\x52\x10\x63\x6f\x2b"
-                         "\x8a\x2a\xc5\x6f\x30\x23\x58\x7b"
-                         "\xfb\x36\x03\x11\xb4\xd9\xf2\xfe",
-               .alen   = 32,
-               .input  = "\x48\x58\xd6\xf3\xad\x63\x58\xbf"
-                         "\xae\xc7\x5e\xae\x83\x8f\x7b\xe4"
-                         "\x78\x5c\x4c\x67\x71\x89\x94\xbf"
-                         "\x47\xf1\x63\x7e\x1c\x59\xbd\xc5"
-                         "\x7f\x44\x0a\x0c\x01\x18\x07\x92"
-                         "\xe1\xd3\x51\xce\x32\x6d\x0c\x5b",
-               .ilen   = 48,
-               .result = "\xc2\x54\xc8\xde\x78\x87\x77\x40"
-                         "\x49\x71\xe4\xb7\xe7\xcb\x76\x61"
-                         "\x0a\x41\xb9\xe9\xc0\x76\x54\xab"
-                         "\x04\x49\x3b\x19\x93\x57\x25\x5d",
-               .rlen   = 32,
+               .key    = "\x01\x23\x45\x67\x12",
+               .klen   = 5,
+               .input  = "\x7a\xc8\x16\xd1\x6e\x9b\x30\x2e",
+               .ilen   = 8,
+               .result = "\x01\x23\x45\x67\x89\xab\xcd\xef",
+               .rlen   = 8,
+       }, { /* Generated from TF test vectors */
+               .key    = "\x85\x62\x3F\x1C\xF9\xD6\x1C\xF9"
+                         "\xD6\xB3\x90\x6D\x4A\x90\x6D\x4A",
+               .klen   = 16,
+               .iv     = "\xE2\x24\x89\xEE\x53\xB8\x1D\x5F",
+               .input  = "\x8D\xFC\x81\x9C\xCB\xAA\x5A\x1C"
+                         "\x7E\x95\xCF\x40\xAB\x4D\x6F\xEA"
+                         "\xD3\xD9\xB0\x9A\xB7\xC7\xE0\x2E"
+                         "\xD1\x39\x34\x92\x8F\xFA\x14\xF1"
+                         "\xD5\xD2\x7B\x59\x1F\x35\x28\xC2"
+                         "\x20\xD9\x42\x06\xC9\x0B\x10\x04"
+                         "\xF8\x79\xCD\x32\x86\x75\x4C\xB6"
+                         "\x7B\x1C\x52\xB1\x91\x64\x22\x4B"
+                         "\x13\xC7\xAE\x98\x0E\xB5\xCF\x6F"
+                         "\x3F\xF4\x43\x96\x73\x0D\xA2\x05"
+                         "\xDB\xFD\x28\x90\x2C\x56\xB9\x37"
+                         "\x5B\x69\x0C\xAD\x84\x67\xFF\x15"
+                         "\x4A\xD4\xA7\xD3\xDD\x99\x47\x3A"
+                         "\xED\x34\x35\x78\x6B\x91\xC9\x32"
+                         "\xE1\xBF\xBC\xB4\x04\x85\x6A\x39"
+                         "\xC0\xBA\x51\xD0\x0F\x4E\xD1\xE2"
+                         "\x1C\xFD\x0E\x05\x07\xF4\x10\xED"
+                         "\xA2\x17\xFF\xF5\x64\xC6\x1A\x22"
+                         "\xAD\x78\xE7\xD7\x11\xE9\x99\xB9"
+                         "\xAA\xEC\x6F\xF8\x3B\xBF\xCE\x77"
+                         "\x93\xE8\xAD\x1D\x50\x6C\xAE\xBC"
+                         "\xBA\x5C\x80\xD1\x91\x65\x51\x1B"
+                         "\xE8\x0A\xCD\x99\x96\x71\x3D\xB6"
+                         "\x78\x75\x37\x55\xC1\xF5\x90\x40"
+                         "\x34\xF4\x7E\xC8\xCC\x3A\x5F\x6E"
+                         "\x36\xA1\xA1\xC2\x3A\x72\x42\x8E"
+                         "\x0E\x37\x88\xE8\xCE\x83\xCB\xAD"
+                         "\xE0\x69\x77\x50\xC7\x0C\x99\xCA"
+                         "\x19\x5B\x30\x25\x9A\xEF\x9B\x0C"
+                         "\xEF\x8F\x74\x4C\xCF\x49\x4E\xB9"
+                         "\xC5\xAE\x9E\x2E\x78\x9A\xB9\x48"
+                         "\xD5\x81\xE4\x37\x1D\xBF\x27\xD9"
+                         "\xC5\xD6\x65\x43\x45\x8C\xBB\xB6"
+                         "\x55\xF4\x06\xBB\x49\x53\x8B\x1B"
+                         "\x07\xA9\x96\x69\x5B\xCB\x0F\xBC"
+                         "\x93\x85\x90\x0F\x0A\x68\x40\x2A"
+                         "\x95\xED\x2D\x88\xBF\x71\xD0\xBB"
+                         "\xEC\xB0\x77\x6C\x79\xFC\x3C\x05"
+                         "\x49\x3F\xB8\x24\xEF\x8E\x09\xA2"
+                         "\x1D\xEF\x92\x02\x96\xD4\x7F\xC8"
+                         "\x03\xB2\xCA\xDB\x17\x5C\x52\xCF"
+                         "\xDD\x70\x37\x63\xAA\xA5\x83\x20"
+                         "\x52\x02\xF6\xB9\xE7\x6E\x0A\xB6"
+                         "\x79\x03\xA0\xDA\xA3\x79\x21\xBD"
+                         "\xE3\x37\x3A\xC0\xF7\x2C\x32\xBE"
+                         "\x8B\xE8\xA6\x00\xC7\x32\xD5\x06"
+                         "\xBB\xE3\xAB\x06\x21\x82\xB8\x32"
+                         "\x31\x34\x2A\xA7\x1F\x64\x99\xBF"
+                         "\xFA\xDA\x3D\x75\xF7\x48\xD5\x48"
+                         "\x4B\x52\x7E\xF6\x7C\xAB\x67\x59"
+                         "\xC5\xDC\xA8\xC6\x63\x85\x4A\xDF"
+                         "\xF0\x40\x5F\xCF\xE3\x58\x52\x67"
+                         "\x7A\x24\x32\xC5\xEC\x9E\xA9\x6F"
+                         "\x58\x56\xDD\x94\x1F\x71\x8D\xF4"
+                         "\x6E\xFF\x2C\xA7\xA5\xD8\xBA\xAF"
+                         "\x1D\x8B\xA2\x46\xB5\xC4\x9F\x57"
+                         "\x8D\xD8\xB3\x3C\x02\x0D\xBB\x84"
+                         "\xC7\xBD\xB4\x9A\x6E\xBB\xB1\x37"
+                         "\x95\x79\xC4\xA7\xEA\x1D\xDC\x33"
+                         "\x5D\x0B\x3F\x03\x8F\x30\xF9\xAE"
+                         "\x4F\xFE\x24\x9C\x9A\x02\xE5\x57"
+                         "\xF5\xBC\x25\xD6\x02\x56\x57\x1C",
+               .ilen   = 496,
+               .result = "\x56\xED\x84\x1B\x8F\x26\xBD\x31"
+                         "\xC8\x5F\xF6\x6A\x01\x98\x0C\xA3"
+                         "\x3A\xD1\x45\xDC\x73\x0A\x7E\x15"
+                         "\xAC\x20\xB7\x4E\xE5\x59\xF0\x87"
+                         "\x1E\x92\x29\xC0\x34\xCB\x62\xF9"
+                         "\x6D\x04\x9B\x0F\xA6\x3D\xD4\x48"
+                         "\xDF\x76\x0D\x81\x18\xAF\x23\xBA"
+                         "\x51\xE8\x5C\xF3\x8A\x21\x95\x2C"
+                         "\xC3\x37\xCE\x65\xFC\x70\x07\x9E"
+                         "\x12\xA9\x40\xD7\x4B\xE2\x79\x10"
+                         "\x84\x1B\xB2\x26\xBD\x54\xEB\x5F"
+                         "\xF6\x8D\x01\x98\x2F\xC6\x3A\xD1"
+                         "\x68\xFF\x73\x0A\xA1\x15\xAC\x43"
+                         "\xDA\x4E\xE5\x7C\x13\x87\x1E\xB5"
+                         "\x29\xC0\x57\xEE\x62\xF9\x90\x04"
+                         "\x9B\x32\xC9\x3D\xD4\x6B\x02\x76"
+                         "\x0D\xA4\x18\xAF\x46\xDD\x51\xE8"
+                         "\x7F\x16\x8A\x21\xB8\x2C\xC3\x5A"
+                         "\xF1\x65\xFC\x93\x07\x9E\x35\xCC"
+                         "\x40\xD7\x6E\x05\x79\x10\xA7\x1B"
+                         "\xB2\x49\xE0\x54\xEB\x82\x19\x8D"
+                         "\x24\xBB\x2F\xC6\x5D\xF4\x68\xFF"
+                         "\x96\x0A\xA1\x38\xCF\x43\xDA\x71"
+                         "\x08\x7C\x13\xAA\x1E\xB5\x4C\xE3"
+                         "\x57\xEE\x85\x1C\x90\x27\xBE\x32"
+                         "\xC9\x60\xF7\x6B\x02\x99\x0D\xA4"
+                         "\x3B\xD2\x46\xDD\x74\x0B\x7F\x16"
+                         "\xAD\x21\xB8\x4F\xE6\x5A\xF1\x88"
+                         "\x1F\x93\x2A\xC1\x35\xCC\x63\xFA"
+                         "\x6E\x05\x9C\x10\xA7\x3E\xD5\x49"
+                         "\xE0\x77\x0E\x82\x19\xB0\x24\xBB"
+                         "\x52\xE9\x5D\xF4\x8B\x22\x96\x2D"
+                         "\xC4\x38\xCF\x66\xFD\x71\x08\x9F"
+                         "\x13\xAA\x41\xD8\x4C\xE3\x7A\x11"
+                         "\x85\x1C\xB3\x27\xBE\x55\xEC\x60"
+                         "\xF7\x8E\x02\x99\x30\xC7\x3B\xD2"
+                         "\x69\x00\x74\x0B\xA2\x16\xAD\x44"
+                         "\xDB\x4F\xE6\x7D\x14\x88\x1F\xB6"
+                         "\x2A\xC1\x58\xEF\x63\xFA\x91\x05"
+                         "\x9C\x33\xCA\x3E\xD5\x6C\x03\x77"
+                         "\x0E\xA5\x19\xB0\x47\xDE\x52\xE9"
+                         "\x80\x17\x8B\x22\xB9\x2D\xC4\x5B"
+                         "\xF2\x66\xFD\x94\x08\x9F\x36\xCD"
+                         "\x41\xD8\x6F\x06\x7A\x11\xA8\x1C"
+                         "\xB3\x4A\xE1\x55\xEC\x83\x1A\x8E"
+                         "\x25\xBC\x30\xC7\x5E\xF5\x69\x00"
+                         "\x97\x0B\xA2\x39\xD0\x44\xDB\x72"
+                         "\x09\x7D\x14\xAB\x1F\xB6\x4D\xE4"
+                         "\x58\xEF\x86\x1D\x91\x28\xBF\x33"
+                         "\xCA\x61\xF8\x6C\x03\x9A\x0E\xA5"
+                         "\x3C\xD3\x47\xDE\x75\x0C\x80\x17"
+                         "\xAE\x22\xB9\x50\xE7\x5B\xF2\x89"
+                         "\x20\x94\x2B\xC2\x36\xCD\x64\xFB"
+                         "\x6F\x06\x9D\x11\xA8\x3F\xD6\x4A"
+                         "\xE1\x78\x0F\x83\x1A\xB1\x25\xBC"
+                         "\x53\xEA\x5E\xF5\x8C\x00\x97\x2E"
+                         "\xC5\x39\xD0\x67\xFE\x72\x09\xA0"
+                         "\x14\xAB\x42\xD9\x4D\xE4\x7B\x12"
+                         "\x86\x1D\xB4\x28\xBF\x56\xED\x61"
+                         "\xF8\x8F\x03\x9A\x31\xC8\x3C\xD3"
+                         "\x6A\x01\x75\x0C\xA3\x17\xAE\x45"
+                         "\xDC\x50\xE7\x7E\x15\x89\x20\xB7",
+               .rlen   = 496,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 496 - 16, 16 },
+       },
+};
+
+static struct cipher_testvec cast5_cbc_enc_tv_template[] = {
+       { /* Generated from TF test vectors */
+               .key    = "\x85\x62\x3F\x1C\xF9\xD6\x1C\xF9"
+                         "\xD6\xB3\x90\x6D\x4A\x90\x6D\x4A",
+               .klen   = 16,
+               .iv     = "\xE2\x24\x89\xEE\x53\xB8\x1D\x5F",
+               .input  = "\x56\xED\x84\x1B\x8F\x26\xBD\x31"
+                         "\xC8\x5F\xF6\x6A\x01\x98\x0C\xA3"
+                         "\x3A\xD1\x45\xDC\x73\x0A\x7E\x15"
+                         "\xAC\x20\xB7\x4E\xE5\x59\xF0\x87"
+                         "\x1E\x92\x29\xC0\x34\xCB\x62\xF9"
+                         "\x6D\x04\x9B\x0F\xA6\x3D\xD4\x48"
+                         "\xDF\x76\x0D\x81\x18\xAF\x23\xBA"
+                         "\x51\xE8\x5C\xF3\x8A\x21\x95\x2C"
+                         "\xC3\x37\xCE\x65\xFC\x70\x07\x9E"
+                         "\x12\xA9\x40\xD7\x4B\xE2\x79\x10"
+                         "\x84\x1B\xB2\x26\xBD\x54\xEB\x5F"
+                         "\xF6\x8D\x01\x98\x2F\xC6\x3A\xD1"
+                         "\x68\xFF\x73\x0A\xA1\x15\xAC\x43"
+                         "\xDA\x4E\xE5\x7C\x13\x87\x1E\xB5"
+                         "\x29\xC0\x57\xEE\x62\xF9\x90\x04"
+                         "\x9B\x32\xC9\x3D\xD4\x6B\x02\x76"
+                         "\x0D\xA4\x18\xAF\x46\xDD\x51\xE8"
+                         "\x7F\x16\x8A\x21\xB8\x2C\xC3\x5A"
+                         "\xF1\x65\xFC\x93\x07\x9E\x35\xCC"
+                         "\x40\xD7\x6E\x05\x79\x10\xA7\x1B"
+                         "\xB2\x49\xE0\x54\xEB\x82\x19\x8D"
+                         "\x24\xBB\x2F\xC6\x5D\xF4\x68\xFF"
+                         "\x96\x0A\xA1\x38\xCF\x43\xDA\x71"
+                         "\x08\x7C\x13\xAA\x1E\xB5\x4C\xE3"
+                         "\x57\xEE\x85\x1C\x90\x27\xBE\x32"
+                         "\xC9\x60\xF7\x6B\x02\x99\x0D\xA4"
+                         "\x3B\xD2\x46\xDD\x74\x0B\x7F\x16"
+                         "\xAD\x21\xB8\x4F\xE6\x5A\xF1\x88"
+                         "\x1F\x93\x2A\xC1\x35\xCC\x63\xFA"
+                         "\x6E\x05\x9C\x10\xA7\x3E\xD5\x49"
+                         "\xE0\x77\x0E\x82\x19\xB0\x24\xBB"
+                         "\x52\xE9\x5D\xF4\x8B\x22\x96\x2D"
+                         "\xC4\x38\xCF\x66\xFD\x71\x08\x9F"
+                         "\x13\xAA\x41\xD8\x4C\xE3\x7A\x11"
+                         "\x85\x1C\xB3\x27\xBE\x55\xEC\x60"
+                         "\xF7\x8E\x02\x99\x30\xC7\x3B\xD2"
+                         "\x69\x00\x74\x0B\xA2\x16\xAD\x44"
+                         "\xDB\x4F\xE6\x7D\x14\x88\x1F\xB6"
+                         "\x2A\xC1\x58\xEF\x63\xFA\x91\x05"
+                         "\x9C\x33\xCA\x3E\xD5\x6C\x03\x77"
+                         "\x0E\xA5\x19\xB0\x47\xDE\x52\xE9"
+                         "\x80\x17\x8B\x22\xB9\x2D\xC4\x5B"
+                         "\xF2\x66\xFD\x94\x08\x9F\x36\xCD"
+                         "\x41\xD8\x6F\x06\x7A\x11\xA8\x1C"
+                         "\xB3\x4A\xE1\x55\xEC\x83\x1A\x8E"
+                         "\x25\xBC\x30\xC7\x5E\xF5\x69\x00"
+                         "\x97\x0B\xA2\x39\xD0\x44\xDB\x72"
+                         "\x09\x7D\x14\xAB\x1F\xB6\x4D\xE4"
+                         "\x58\xEF\x86\x1D\x91\x28\xBF\x33"
+                         "\xCA\x61\xF8\x6C\x03\x9A\x0E\xA5"
+                         "\x3C\xD3\x47\xDE\x75\x0C\x80\x17"
+                         "\xAE\x22\xB9\x50\xE7\x5B\xF2\x89"
+                         "\x20\x94\x2B\xC2\x36\xCD\x64\xFB"
+                         "\x6F\x06\x9D\x11\xA8\x3F\xD6\x4A"
+                         "\xE1\x78\x0F\x83\x1A\xB1\x25\xBC"
+                         "\x53\xEA\x5E\xF5\x8C\x00\x97\x2E"
+                         "\xC5\x39\xD0\x67\xFE\x72\x09\xA0"
+                         "\x14\xAB\x42\xD9\x4D\xE4\x7B\x12"
+                         "\x86\x1D\xB4\x28\xBF\x56\xED\x61"
+                         "\xF8\x8F\x03\x9A\x31\xC8\x3C\xD3"
+                         "\x6A\x01\x75\x0C\xA3\x17\xAE\x45"
+                         "\xDC\x50\xE7\x7E\x15\x89\x20\xB7",
+               .ilen   = 496,
+               .result = "\x05\x28\xCE\x61\x90\x80\xE1\x78"
+                         "\xB9\x2A\x97\x7C\xB0\x83\xD8\x1A"
+                         "\xDE\x58\x7F\xD7\xFD\x72\xB8\xFB"
+                         "\xDA\xF0\x6E\x77\x14\x47\x82\xBA"
+                         "\x29\x0E\x25\x6E\xB4\x39\xD9\x7F"
+                         "\x05\xA7\xA7\x3A\xC1\x5D\x9E\x39"
+                         "\xA7\xFB\x0D\x05\x00\xF3\x58\x67"
+                         "\x60\xEC\x73\x77\x46\x85\x9B\x6A"
+                         "\x08\x3E\xBE\x59\xFB\xE4\x96\x34"
+                         "\xB4\x05\x49\x1A\x97\x43\xAD\xA0"
+                         "\xA9\x1E\x6E\x74\xF1\x94\xEC\xA8"
+                         "\xB5\x8A\x20\xEA\x89\x6B\x19\xAA"
+                         "\xA7\xF1\x33\x67\x90\x23\x0D\xEE"
+                         "\x81\xD5\x78\x4F\xD3\x63\xEA\x46"
+                         "\xB5\xB2\x6E\xBB\xCA\x76\x06\x10"
+                         "\x96\x2A\x0A\xBA\xF9\x41\x5A\x1D"
+                         "\x36\x7C\x56\x14\x54\x83\xFA\xA1"
+                         "\x27\xDD\xBA\x8A\x90\x29\xD6\xA6"
+                         "\xFA\x48\x3E\x1E\x23\x6E\x98\xA8"
+                         "\xA7\xD9\x67\x92\x5C\x13\xB4\x71"
+                         "\xA8\xAA\x89\x4A\xA4\xB3\x49\x7C"
+                         "\x7D\x7F\xCE\x6F\x29\x2E\x7E\x37"
+                         "\xC8\x52\x60\xD9\xE7\xCA\x60\x98"
+                         "\xED\xCD\xE8\x60\x83\xAD\x34\x4D"
+                         "\x96\x4A\x99\x2B\xB7\x14\x75\x66"
+                         "\x6C\x2C\x1A\xBA\x4B\xBB\x49\x56"
+                         "\xE1\x86\xA2\x0E\xD0\xF0\x07\xD3"
+                         "\x18\x38\x09\x9C\x0E\x8B\x86\x07"
+                         "\x90\x12\x37\x49\x27\x98\x69\x18"
+                         "\xB0\xCC\xFB\xD3\xBD\x04\xA0\x85"
+                         "\x4B\x22\x97\x07\xB6\x97\xE9\x95"
+                         "\x0F\x88\x36\xA9\x44\x00\xC6\xE9"
+                         "\x27\x53\x5C\x5B\x1F\xD3\xE2\xEE"
+                         "\xD0\xCD\x63\x30\xA9\xC0\xDD\x49"
+                         "\xFE\x16\xA4\x07\x0D\xE2\x5D\x97"
+                         "\xDE\x89\xBA\x2E\xF3\xA9\x5E\xBE"
+                         "\x03\x55\x0E\x02\x41\x4A\x45\x06"
+                         "\xBE\xEA\x32\xF2\xDC\x91\x5C\x20"
+                         "\x94\x02\x30\xD2\xFC\x29\xFA\x8E"
+                         "\x34\xA0\x31\xB8\x34\xBA\xAE\x54"
+                         "\xB5\x88\x1F\xDC\x43\xDC\x22\x9F"
+                         "\xDC\xCE\xD3\xFA\xA4\xA8\xBC\x8A"
+                         "\xC7\x5A\x43\x21\xA5\xB1\xDB\xC3"
+                         "\x84\x3B\xB4\x9B\xB5\xA7\xF1\x0A"
+                         "\xB6\x37\x21\x19\x55\xC2\xBD\x99"
+                         "\x49\x24\xBB\x7C\xB3\x8E\xEF\xD2"
+                         "\x3A\xCF\xA0\x31\x28\x0E\x25\xA2"
+                         "\x11\xB4\x18\x17\x1A\x65\x92\x56"
+                         "\xE8\xE0\x52\x9C\x61\x18\x2A\xB1"
+                         "\x1A\x01\x22\x45\x17\x62\x52\x6C"
+                         "\x91\x44\xCF\x98\xC7\xC0\x79\x26"
+                         "\x32\x66\x6F\x23\x7F\x94\x36\x88"
+                         "\x3C\xC9\xD0\xB7\x45\x30\x31\x86"
+                         "\x3D\xC6\xA3\x98\x62\x84\x1A\x8B"
+                         "\x16\x88\xC7\xA3\xE9\x4F\xE0\x86"
+                         "\xA4\x93\xA8\x34\x5A\xCA\xDF\xCA"
+                         "\x46\x38\xD2\xF4\xE0\x2D\x1E\xC9"
+                         "\x7C\xEF\x53\xB7\x60\x72\x41\xBF"
+                         "\x29\x00\x87\x02\xAF\x44\x4C\xB7"
+                         "\x8C\xF5\x3F\x19\xF4\x80\x45\xA7"
+                         "\x15\x5F\xDB\xE9\xB1\x83\xD2\xE6"
+                         "\x1D\x18\x66\x44\x5B\x8F\x14\xEB",
+               .rlen   = 496,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 496 - 16, 16 },
        },
 };
 
-/*
- * ANSI X9.31 Continuous Pseudo-Random Number Generator (AES mode)
- * test vectors, taken from Appendix B.2.9 and B.2.10:
- *     http://csrc.nist.gov/groups/STM/cavp/documents/rng/RNGVS.pdf
- * Only AES-128 is supported at this time.
- */
-#define ANSI_CPRNG_AES_TEST_VECTORS    6
-
-static struct cprng_testvec ansi_cprng_aes_tv_template[] = {
-       {
-               .key    = "\xf3\xb1\x66\x6d\x13\x60\x72\x42"
-                         "\xed\x06\x1c\xab\xb8\xd4\x62\x02",
-               .klen   = 16,
-               .dt     = "\xe6\xb3\xbe\x78\x2a\x23\xfa\x62"
-                         "\xd7\x1d\x4a\xfb\xb0\xe9\x22\xf9",
-               .dtlen  = 16,
-               .v      = "\x80\x00\x00\x00\x00\x00\x00\x00"
-                         "\x00\x00\x00\x00\x00\x00\x00\x00",
-               .vlen   = 16,
-               .result = "\x59\x53\x1e\xd1\x3b\xb0\xc0\x55"
-                         "\x84\x79\x66\x85\xc1\x2f\x76\x41",
-               .rlen   = 16,
-               .loops  = 1,
-       }, {
-               .key    = "\xf3\xb1\x66\x6d\x13\x60\x72\x42"
-                         "\xed\x06\x1c\xab\xb8\xd4\x62\x02",
-               .klen   = 16,
-               .dt     = "\xe6\xb3\xbe\x78\x2a\x23\xfa\x62"
-                         "\xd7\x1d\x4a\xfb\xb0\xe9\x22\xfa",
-               .dtlen  = 16,
-               .v      = "\xc0\x00\x00\x00\x00\x00\x00\x00"
-                         "\x00\x00\x00\x00\x00\x00\x00\x00",
-               .vlen   = 16,
-               .result = "\x7c\x22\x2c\xf4\xca\x8f\xa2\x4c"
-                         "\x1c\x9c\xb6\x41\xa9\xf3\x22\x0d",
-               .rlen   = 16,
-               .loops  = 1,
-       }, {
-               .key    = "\xf3\xb1\x66\x6d\x13\x60\x72\x42"
-                         "\xed\x06\x1c\xab\xb8\xd4\x62\x02",
-               .klen   = 16,
-               .dt     = "\xe6\xb3\xbe\x78\x2a\x23\xfa\x62"
-                         "\xd7\x1d\x4a\xfb\xb0\xe9\x22\xfb",
-               .dtlen  = 16,
-               .v      = "\xe0\x00\x00\x00\x00\x00\x00\x00"
-                         "\x00\x00\x00\x00\x00\x00\x00\x00",
-               .vlen   = 16,
-               .result = "\x8a\xaa\x00\x39\x66\x67\x5b\xe5"
-                         "\x29\x14\x28\x81\xa9\x4d\x4e\xc7",
-               .rlen   = 16,
-               .loops  = 1,
-       }, {
-               .key    = "\xf3\xb1\x66\x6d\x13\x60\x72\x42"
-                         "\xed\x06\x1c\xab\xb8\xd4\x62\x02",
-               .klen   = 16,
-               .dt     = "\xe6\xb3\xbe\x78\x2a\x23\xfa\x62"
-                         "\xd7\x1d\x4a\xfb\xb0\xe9\x22\xfc",
-               .dtlen  = 16,
-               .v      = "\xf0\x00\x00\x00\x00\x00\x00\x00"
-                         "\x00\x00\x00\x00\x00\x00\x00\x00",
-               .vlen   = 16,
-               .result = "\x88\xdd\xa4\x56\x30\x24\x23\xe5"
-                         "\xf6\x9d\xa5\x7e\x7b\x95\xc7\x3a",
-               .rlen   = 16,
-               .loops  = 1,
-       }, {
-               .key    = "\xf3\xb1\x66\x6d\x13\x60\x72\x42"
-                         "\xed\x06\x1c\xab\xb8\xd4\x62\x02",
-               .klen   = 16,
-               .dt     = "\xe6\xb3\xbe\x78\x2a\x23\xfa\x62"
-                         "\xd7\x1d\x4a\xfb\xb0\xe9\x22\xfd",
-               .dtlen  = 16,
-               .v      = "\xf8\x00\x00\x00\x00\x00\x00\x00"
-                         "\x00\x00\x00\x00\x00\x00\x00\x00",
-               .vlen   = 16,
-               .result = "\x05\x25\x92\x46\x61\x79\xd2\xcb"
-                         "\x78\xc4\x0b\x14\x0a\x5a\x9a\xc8",
-               .rlen   = 16,
-               .loops  = 1,
-       }, {    /* Monte Carlo Test */
-               .key    = "\x9f\x5b\x51\x20\x0b\xf3\x34\xb5"
-                         "\xd8\x2b\xe8\xc3\x72\x55\xc8\x48",
+static struct cipher_testvec cast5_cbc_dec_tv_template[] = {
+       { /* Generated from TF test vectors */
+               .key    = "\x85\x62\x3F\x1C\xF9\xD6\x1C\xF9"
+                         "\xD6\xB3\x90\x6D\x4A\x90\x6D\x4A",
                .klen   = 16,
-               .dt     = "\x63\x76\xbb\xe5\x29\x02\xba\x3b"
-                         "\x67\xc9\x25\xfa\x70\x1f\x11\xac",
-               .dtlen  = 16,
-               .v      = "\x57\x2c\x8e\x76\x87\x26\x47\x97"
-                         "\x7e\x74\xfb\xdd\xc4\x95\x01\xd1",
-               .vlen   = 16,
-               .result = "\x48\xe9\xbd\x0d\x06\xee\x18\xfb"
-                         "\xe4\x57\x90\xd5\xc3\xfc\x9b\x73",
-               .rlen   = 16,
-               .loops  = 10000,
+               .iv     = "\xE2\x24\x89\xEE\x53\xB8\x1D\x5F",
+               .input  = "\x05\x28\xCE\x61\x90\x80\xE1\x78"
+                         "\xB9\x2A\x97\x7C\xB0\x83\xD8\x1A"
+                         "\xDE\x58\x7F\xD7\xFD\x72\xB8\xFB"
+                         "\xDA\xF0\x6E\x77\x14\x47\x82\xBA"
+                         "\x29\x0E\x25\x6E\xB4\x39\xD9\x7F"
+                         "\x05\xA7\xA7\x3A\xC1\x5D\x9E\x39"
+                         "\xA7\xFB\x0D\x05\x00\xF3\x58\x67"
+                         "\x60\xEC\x73\x77\x46\x85\x9B\x6A"
+                         "\x08\x3E\xBE\x59\xFB\xE4\x96\x34"
+                         "\xB4\x05\x49\x1A\x97\x43\xAD\xA0"
+                         "\xA9\x1E\x6E\x74\xF1\x94\xEC\xA8"
+                         "\xB5\x8A\x20\xEA\x89\x6B\x19\xAA"
+                         "\xA7\xF1\x33\x67\x90\x23\x0D\xEE"
+                         "\x81\xD5\x78\x4F\xD3\x63\xEA\x46"
+                         "\xB5\xB2\x6E\xBB\xCA\x76\x06\x10"
+                         "\x96\x2A\x0A\xBA\xF9\x41\x5A\x1D"
+                         "\x36\x7C\x56\x14\x54\x83\xFA\xA1"
+                         "\x27\xDD\xBA\x8A\x90\x29\xD6\xA6"
+                         "\xFA\x48\x3E\x1E\x23\x6E\x98\xA8"
+                         "\xA7\xD9\x67\x92\x5C\x13\xB4\x71"
+                         "\xA8\xAA\x89\x4A\xA4\xB3\x49\x7C"
+                         "\x7D\x7F\xCE\x6F\x29\x2E\x7E\x37"
+                         "\xC8\x52\x60\xD9\xE7\xCA\x60\x98"
+                         "\xED\xCD\xE8\x60\x83\xAD\x34\x4D"
+                         "\x96\x4A\x99\x2B\xB7\x14\x75\x66"
+                         "\x6C\x2C\x1A\xBA\x4B\xBB\x49\x56"
+                         "\xE1\x86\xA2\x0E\xD0\xF0\x07\xD3"
+                         "\x18\x38\x09\x9C\x0E\x8B\x86\x07"
+                         "\x90\x12\x37\x49\x27\x98\x69\x18"
+                         "\xB0\xCC\xFB\xD3\xBD\x04\xA0\x85"
+                         "\x4B\x22\x97\x07\xB6\x97\xE9\x95"
+                         "\x0F\x88\x36\xA9\x44\x00\xC6\xE9"
+                         "\x27\x53\x5C\x5B\x1F\xD3\xE2\xEE"
+                         "\xD0\xCD\x63\x30\xA9\xC0\xDD\x49"
+                         "\xFE\x16\xA4\x07\x0D\xE2\x5D\x97"
+                         "\xDE\x89\xBA\x2E\xF3\xA9\x5E\xBE"
+                         "\x03\x55\x0E\x02\x41\x4A\x45\x06"
+                         "\xBE\xEA\x32\xF2\xDC\x91\x5C\x20"
+                         "\x94\x02\x30\xD2\xFC\x29\xFA\x8E"
+                         "\x34\xA0\x31\xB8\x34\xBA\xAE\x54"
+                         "\xB5\x88\x1F\xDC\x43\xDC\x22\x9F"
+                         "\xDC\xCE\xD3\xFA\xA4\xA8\xBC\x8A"
+                         "\xC7\x5A\x43\x21\xA5\xB1\xDB\xC3"
+                         "\x84\x3B\xB4\x9B\xB5\xA7\xF1\x0A"
+                         "\xB6\x37\x21\x19\x55\xC2\xBD\x99"
+                         "\x49\x24\xBB\x7C\xB3\x8E\xEF\xD2"
+                         "\x3A\xCF\xA0\x31\x28\x0E\x25\xA2"
+                         "\x11\xB4\x18\x17\x1A\x65\x92\x56"
+                         "\xE8\xE0\x52\x9C\x61\x18\x2A\xB1"
+                         "\x1A\x01\x22\x45\x17\x62\x52\x6C"
+                         "\x91\x44\xCF\x98\xC7\xC0\x79\x26"
+                         "\x32\x66\x6F\x23\x7F\x94\x36\x88"
+                         "\x3C\xC9\xD0\xB7\x45\x30\x31\x86"
+                         "\x3D\xC6\xA3\x98\x62\x84\x1A\x8B"
+                         "\x16\x88\xC7\xA3\xE9\x4F\xE0\x86"
+                         "\xA4\x93\xA8\x34\x5A\xCA\xDF\xCA"
+                         "\x46\x38\xD2\xF4\xE0\x2D\x1E\xC9"
+                         "\x7C\xEF\x53\xB7\x60\x72\x41\xBF"
+                         "\x29\x00\x87\x02\xAF\x44\x4C\xB7"
+                         "\x8C\xF5\x3F\x19\xF4\x80\x45\xA7"
+                         "\x15\x5F\xDB\xE9\xB1\x83\xD2\xE6"
+                         "\x1D\x18\x66\x44\x5B\x8F\x14\xEB",
+               .ilen   = 496,
+               .result = "\x56\xED\x84\x1B\x8F\x26\xBD\x31"
+                         "\xC8\x5F\xF6\x6A\x01\x98\x0C\xA3"
+                         "\x3A\xD1\x45\xDC\x73\x0A\x7E\x15"
+                         "\xAC\x20\xB7\x4E\xE5\x59\xF0\x87"
+                         "\x1E\x92\x29\xC0\x34\xCB\x62\xF9"
+                         "\x6D\x04\x9B\x0F\xA6\x3D\xD4\x48"
+                         "\xDF\x76\x0D\x81\x18\xAF\x23\xBA"
+                         "\x51\xE8\x5C\xF3\x8A\x21\x95\x2C"
+                         "\xC3\x37\xCE\x65\xFC\x70\x07\x9E"
+                         "\x12\xA9\x40\xD7\x4B\xE2\x79\x10"
+                         "\x84\x1B\xB2\x26\xBD\x54\xEB\x5F"
+                         "\xF6\x8D\x01\x98\x2F\xC6\x3A\xD1"
+                         "\x68\xFF\x73\x0A\xA1\x15\xAC\x43"
+                         "\xDA\x4E\xE5\x7C\x13\x87\x1E\xB5"
+                         "\x29\xC0\x57\xEE\x62\xF9\x90\x04"
+                         "\x9B\x32\xC9\x3D\xD4\x6B\x02\x76"
+                         "\x0D\xA4\x18\xAF\x46\xDD\x51\xE8"
+                         "\x7F\x16\x8A\x21\xB8\x2C\xC3\x5A"
+                         "\xF1\x65\xFC\x93\x07\x9E\x35\xCC"
+                         "\x40\xD7\x6E\x05\x79\x10\xA7\x1B"
+                         "\xB2\x49\xE0\x54\xEB\x82\x19\x8D"
+                         "\x24\xBB\x2F\xC6\x5D\xF4\x68\xFF"
+                         "\x96\x0A\xA1\x38\xCF\x43\xDA\x71"
+                         "\x08\x7C\x13\xAA\x1E\xB5\x4C\xE3"
+                         "\x57\xEE\x85\x1C\x90\x27\xBE\x32"
+                         "\xC9\x60\xF7\x6B\x02\x99\x0D\xA4"
+                         "\x3B\xD2\x46\xDD\x74\x0B\x7F\x16"
+                         "\xAD\x21\xB8\x4F\xE6\x5A\xF1\x88"
+                         "\x1F\x93\x2A\xC1\x35\xCC\x63\xFA"
+                         "\x6E\x05\x9C\x10\xA7\x3E\xD5\x49"
+                         "\xE0\x77\x0E\x82\x19\xB0\x24\xBB"
+                         "\x52\xE9\x5D\xF4\x8B\x22\x96\x2D"
+                         "\xC4\x38\xCF\x66\xFD\x71\x08\x9F"
+                         "\x13\xAA\x41\xD8\x4C\xE3\x7A\x11"
+                         "\x85\x1C\xB3\x27\xBE\x55\xEC\x60"
+                         "\xF7\x8E\x02\x99\x30\xC7\x3B\xD2"
+                         "\x69\x00\x74\x0B\xA2\x16\xAD\x44"
+                         "\xDB\x4F\xE6\x7D\x14\x88\x1F\xB6"
+                         "\x2A\xC1\x58\xEF\x63\xFA\x91\x05"
+                         "\x9C\x33\xCA\x3E\xD5\x6C\x03\x77"
+                         "\x0E\xA5\x19\xB0\x47\xDE\x52\xE9"
+                         "\x80\x17\x8B\x22\xB9\x2D\xC4\x5B"
+                         "\xF2\x66\xFD\x94\x08\x9F\x36\xCD"
+                         "\x41\xD8\x6F\x06\x7A\x11\xA8\x1C"
+                         "\xB3\x4A\xE1\x55\xEC\x83\x1A\x8E"
+                         "\x25\xBC\x30\xC7\x5E\xF5\x69\x00"
+                         "\x97\x0B\xA2\x39\xD0\x44\xDB\x72"
+                         "\x09\x7D\x14\xAB\x1F\xB6\x4D\xE4"
+                         "\x58\xEF\x86\x1D\x91\x28\xBF\x33"
+                         "\xCA\x61\xF8\x6C\x03\x9A\x0E\xA5"
+                         "\x3C\xD3\x47\xDE\x75\x0C\x80\x17"
+                         "\xAE\x22\xB9\x50\xE7\x5B\xF2\x89"
+                         "\x20\x94\x2B\xC2\x36\xCD\x64\xFB"
+                         "\x6F\x06\x9D\x11\xA8\x3F\xD6\x4A"
+                         "\xE1\x78\x0F\x83\x1A\xB1\x25\xBC"
+                         "\x53\xEA\x5E\xF5\x8C\x00\x97\x2E"
+                         "\xC5\x39\xD0\x67\xFE\x72\x09\xA0"
+                         "\x14\xAB\x42\xD9\x4D\xE4\x7B\x12"
+                         "\x86\x1D\xB4\x28\xBF\x56\xED\x61"
+                         "\xF8\x8F\x03\x9A\x31\xC8\x3C\xD3"
+                         "\x6A\x01\x75\x0C\xA3\x17\xAE\x45"
+                         "\xDC\x50\xE7\x7E\x15\x89\x20\xB7",
+               .rlen   = 496,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 496 - 16, 16 },
        },
 };
 
-/* Cast5 test vectors from RFC 2144 */
-#define CAST5_ENC_TEST_VECTORS 3
-#define CAST5_DEC_TEST_VECTORS 3
-
-static struct cipher_testvec cast5_enc_tv_template[] = {
-       {
-               .key    = "\x01\x23\x45\x67\x12\x34\x56\x78"
-                         "\x23\x45\x67\x89\x34\x56\x78\x9a",
+static struct cipher_testvec cast5_ctr_enc_tv_template[] = {
+       { /* Generated from TF test vectors */
+               .key    = "\x85\x62\x3F\x1C\xF9\xD6\x1C\xF9"
+                         "\xD6\xB3\x90\x6D\x4A\x90\x6D\x4A",
                .klen   = 16,
-               .input  = "\x01\x23\x45\x67\x89\xab\xcd\xef",
-               .ilen   = 8,
-               .result = "\x23\x8b\x4f\xe5\x84\x7e\x44\xb2",
-               .rlen   = 8,
-       }, {
-               .key    = "\x01\x23\x45\x67\x12\x34\x56\x78"
-                         "\x23\x45",
-               .klen   = 10,
-               .input  = "\x01\x23\x45\x67\x89\xab\xcd\xef",
-               .ilen   = 8,
-               .result = "\xeb\x6a\x71\x1a\x2c\x02\x27\x1b",
-               .rlen   = 8,
-       }, {
-               .key    = "\x01\x23\x45\x67\x12",
-               .klen   = 5,
-               .input  = "\x01\x23\x45\x67\x89\xab\xcd\xef",
-               .ilen   = 8,
-               .result = "\x7a\xc8\x16\xd1\x6e\x9b\x30\x2e",
-               .rlen   = 8,
+               .iv     = "\xE2\x24\x89\xEE\x53\xB8\x1D\x5F",
+               .input  = "\x56\xED\x84\x1B\x8F\x26\xBD\x31"
+                         "\xC8\x5F\xF6\x6A\x01\x98\x0C\xA3"
+                         "\x3A",
+               .ilen   = 17,
+               .result = "\xFF\xC4\x2E\x82\x3D\xF8\xA8\x39"
+                         "\x7C\x52\xC4\xD3\xBB\x62\xC6\xA8"
+                         "\x0C",
+               .rlen   = 17,
+       }, { /* Generated from TF test vectors */
+               .key    = "\x85\x62\x3F\x1C\xF9\xD6\x1C\xF9"
+                         "\xD6\xB3\x90\x6D\x4A\x90\x6D\x4A",
+               .klen   = 16,
+               .iv     = "\xE2\x24\x89\xEE\x53\xB8\x1D\x5F",
+               .input  = "\x56\xED\x84\x1B\x8F\x26\xBD\x31"
+                         "\xC8\x5F\xF6\x6A\x01\x98\x0C\xA3"
+                         "\x3A\xD1\x45\xDC\x73\x0A\x7E\x15"
+                         "\xAC\x20\xB7\x4E\xE5\x59\xF0\x87"
+                         "\x1E\x92\x29\xC0\x34\xCB\x62\xF9"
+                         "\x6D\x04\x9B\x0F\xA6\x3D\xD4\x48"
+                         "\xDF\x76\x0D\x81\x18\xAF\x23\xBA"
+                         "\x51\xE8\x5C\xF3\x8A\x21\x95\x2C"
+                         "\xC3\x37\xCE\x65\xFC\x70\x07\x9E"
+                         "\x12\xA9\x40\xD7\x4B\xE2\x79\x10"
+                         "\x84\x1B\xB2\x26\xBD\x54\xEB\x5F"
+                         "\xF6\x8D\x01\x98\x2F\xC6\x3A\xD1"
+                         "\x68\xFF\x73\x0A\xA1\x15\xAC\x43"
+                         "\xDA\x4E\xE5\x7C\x13\x87\x1E\xB5"
+                         "\x29\xC0\x57\xEE\x62\xF9\x90\x04"
+                         "\x9B\x32\xC9\x3D\xD4\x6B\x02\x76"
+                         "\x0D\xA4\x18\xAF\x46\xDD\x51\xE8"
+                         "\x7F\x16\x8A\x21\xB8\x2C\xC3\x5A"
+                         "\xF1\x65\xFC\x93\x07\x9E\x35\xCC"
+                         "\x40\xD7\x6E\x05\x79\x10\xA7\x1B"
+                         "\xB2\x49\xE0\x54\xEB\x82\x19\x8D"
+                         "\x24\xBB\x2F\xC6\x5D\xF4\x68\xFF"
+                         "\x96\x0A\xA1\x38\xCF\x43\xDA\x71"
+                         "\x08\x7C\x13\xAA\x1E\xB5\x4C\xE3"
+                         "\x57\xEE\x85\x1C\x90\x27\xBE\x32"
+                         "\xC9\x60\xF7\x6B\x02\x99\x0D\xA4"
+                         "\x3B\xD2\x46\xDD\x74\x0B\x7F\x16"
+                         "\xAD\x21\xB8\x4F\xE6\x5A\xF1\x88"
+                         "\x1F\x93\x2A\xC1\x35\xCC\x63\xFA"
+                         "\x6E\x05\x9C\x10\xA7\x3E\xD5\x49"
+                         "\xE0\x77\x0E\x82\x19\xB0\x24\xBB"
+                         "\x52\xE9\x5D\xF4\x8B\x22\x96\x2D"
+                         "\xC4\x38\xCF\x66\xFD\x71\x08\x9F"
+                         "\x13\xAA\x41\xD8\x4C\xE3\x7A\x11"
+                         "\x85\x1C\xB3\x27\xBE\x55\xEC\x60"
+                         "\xF7\x8E\x02\x99\x30\xC7\x3B\xD2"
+                         "\x69\x00\x74\x0B\xA2\x16\xAD\x44"
+                         "\xDB\x4F\xE6\x7D\x14\x88\x1F\xB6"
+                         "\x2A\xC1\x58\xEF\x63\xFA\x91\x05"
+                         "\x9C\x33\xCA\x3E\xD5\x6C\x03\x77"
+                         "\x0E\xA5\x19\xB0\x47\xDE\x52\xE9"
+                         "\x80\x17\x8B\x22\xB9\x2D\xC4\x5B"
+                         "\xF2\x66\xFD\x94\x08\x9F\x36\xCD"
+                         "\x41\xD8\x6F\x06\x7A\x11\xA8\x1C"
+                         "\xB3\x4A\xE1\x55\xEC\x83\x1A\x8E"
+                         "\x25\xBC\x30\xC7\x5E\xF5\x69\x00"
+                         "\x97\x0B\xA2\x39\xD0\x44\xDB\x72"
+                         "\x09\x7D\x14\xAB\x1F\xB6\x4D\xE4"
+                         "\x58\xEF\x86\x1D\x91\x28\xBF\x33"
+                         "\xCA\x61\xF8\x6C\x03\x9A\x0E\xA5"
+                         "\x3C\xD3\x47\xDE\x75\x0C\x80\x17"
+                         "\xAE\x22\xB9\x50\xE7\x5B\xF2\x89"
+                         "\x20\x94\x2B\xC2\x36\xCD\x64\xFB"
+                         "\x6F\x06\x9D\x11\xA8\x3F\xD6\x4A"
+                         "\xE1\x78\x0F\x83\x1A\xB1\x25\xBC"
+                         "\x53\xEA\x5E\xF5\x8C\x00\x97\x2E"
+                         "\xC5\x39\xD0\x67\xFE\x72\x09\xA0"
+                         "\x14\xAB\x42\xD9\x4D\xE4\x7B\x12"
+                         "\x86\x1D\xB4\x28\xBF\x56\xED\x61"
+                         "\xF8\x8F\x03\x9A\x31\xC8\x3C\xD3"
+                         "\x6A\x01\x75\x0C\xA3\x17\xAE\x45"
+                         "\xDC\x50\xE7\x7E\x15\x89\x20\xB7",
+               .ilen   = 496,
+               .result = "\xFF\xC4\x2E\x82\x3D\xF8\xA8\x39"
+                         "\x7C\x52\xC4\xD3\xBB\x62\xC6\xA8"
+                         "\x0C\x63\xA5\x55\xE3\xF8\x1C\x7F"
+                         "\xDC\x59\xF9\xA0\x52\xAD\x83\xDF"
+                         "\xD5\x3B\x53\x4A\xAA\x1F\x49\x44"
+                         "\xE8\x20\xCC\xF8\x97\xE6\xE0\x3C"
+                         "\x5A\xD2\x83\xEC\xEE\x25\x3F\xCF"
+                         "\x0D\xC2\x79\x80\x99\x6E\xFF\x7B"
+                         "\x64\xB0\x7B\x86\x29\x1D\x9F\x17"
+                         "\x10\xA5\xA5\xEB\x16\x55\x9E\xE3"
+                         "\x88\x18\x52\x56\x48\x58\xD1\x6B"
+                         "\xE8\x74\x6E\x48\xB0\x2E\x69\x63"
+                         "\x32\xAA\xAC\x26\x55\x45\x94\xDE"
+                         "\x30\x26\x26\xE6\x08\x82\x2F\x5F"
+                         "\xA7\x15\x94\x07\x75\x2D\xC6\x3A"
+                         "\x1B\xA0\x39\xFB\xBA\xB9\x06\x56"
+                         "\xF6\x9F\xF1\x2F\x9B\xF3\x89\x8B"
+                         "\x08\xC8\x9D\x5E\x6B\x95\x09\xC7"
+                         "\x98\xB7\x62\xA4\x1D\x25\xFA\xC5"
+                         "\x62\xC8\x5D\x6B\xB4\x85\x88\x7F"
+                         "\x3B\x29\xF9\xB4\x32\x62\x69\xBF"
+                         "\x32\xB8\xEB\xFD\x0E\x26\xAA\xA3"
+                         "\x44\x67\x90\x20\xAC\x41\xDF\x43"
+                         "\xC6\xC7\x19\x9F\x2C\x28\x74\xEB"
+                         "\x3E\x7F\x7A\x80\x5B\xE4\x08\x60"
+                         "\xC7\xC9\x71\x34\x44\xCE\x05\xFD"
+                         "\xA8\x91\xA8\x44\x5E\xD3\x89\x2C"
+                         "\xAE\x59\x0F\x07\x88\x79\x53\x26"
+                         "\xAF\xAC\xCB\x1D\x6F\x08\x25\x62"
+                         "\xD0\x82\x65\x66\xE4\x2A\x29\x1C"
+                         "\x9C\x64\x5F\x49\x9D\xF8\x62\xF9"
+                         "\xED\xC4\x13\x52\x75\xDC\xE4\xF9"
+                         "\x68\x0F\x8A\xCD\xA6\x8D\x75\xAA"
+                         "\x49\xA1\x86\x86\x37\x5C\x6B\x3D"
+                         "\x56\xE5\x6F\xBE\x27\xC0\x10\xF8"
+                         "\x3C\x4D\x17\x35\x14\xDC\x1C\xA0"
+                         "\x6E\xAE\xD1\x10\xDD\x83\x06\xC2"
+                         "\x23\xD3\xC7\x27\x15\x04\x2C\x27"
+                         "\xDD\x1F\x2E\x97\x09\x9C\x33\x7D"
+                         "\xAC\x50\x1B\x2E\xC9\x52\x0C\x14"
+                         "\x4B\x78\xC4\xDE\x07\x6A\x12\x02"
+                         "\x6E\xD7\x4B\x91\xB9\x88\x4D\x02"
+                         "\xC3\xB5\x04\xBC\xE0\x67\xCA\x18"
+                         "\x22\xA1\xAE\x9A\x21\xEF\xB2\x06"
+                         "\x35\xCD\xEC\x37\x70\x2D\xFC\x1E"
+                         "\xA8\x31\xE7\xFC\xE5\x8E\x88\x66"
+                         "\x16\xB5\xC8\x45\x21\x37\xBD\x24"
+                         "\xA9\xD5\x36\x12\x9F\x6E\x67\x80"
+                         "\x87\x54\xD5\xAF\x97\xE1\x15\xA7"
+                         "\x11\xF0\x63\x7B\xE1\x44\x14\x1C"
+                         "\x06\x32\x05\x8C\x6C\xDB\x9B\x36"
+                         "\x6A\x6B\xAD\x3A\x27\x55\x20\x4C"
+                         "\x76\x36\x43\xE8\x16\x60\xB5\xF3"
+                         "\xDF\x5A\xC6\xA5\x69\x78\x59\x51"
+                         "\x54\x68\x65\x06\x84\xDE\x3D\xAE"
+                         "\x38\x91\xBD\xCC\xA2\x8A\xEC\xE6"
+                         "\x9E\x83\xAE\x1E\x8E\x34\x5D\xDE"
+                         "\x91\xCE\x8F\xED\x40\xF7\xC8\x8B"
+                         "\x9A\x13\x4C\xAD\x89\x97\x9E\xD1"
+                         "\x91\x01\xD7\x21\x23\x28\x1E\xCC"
+                         "\x8C\x98\xDB\xDE\xFC\x72\x94\xAA"
+                         "\xC0\x0D\x96\xAA\x23\xF8\xFE\x13",
+               .rlen   = 496,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 496 - 16, 16 },
        },
 };
 
-static struct cipher_testvec cast5_dec_tv_template[] = {
-       {
-               .key    = "\x01\x23\x45\x67\x12\x34\x56\x78"
-                         "\x23\x45\x67\x89\x34\x56\x78\x9a",
+static struct cipher_testvec cast5_ctr_dec_tv_template[] = {
+       { /* Generated from TF test vectors */
+               .key    = "\x85\x62\x3F\x1C\xF9\xD6\x1C\xF9"
+                         "\xD6\xB3\x90\x6D\x4A\x90\x6D\x4A",
                .klen   = 16,
-               .input  = "\x23\x8b\x4f\xe5\x84\x7e\x44\xb2",
-               .ilen   = 8,
-               .result = "\x01\x23\x45\x67\x89\xab\xcd\xef",
-               .rlen   = 8,
-       }, {
-               .key    = "\x01\x23\x45\x67\x12\x34\x56\x78"
-                         "\x23\x45",
-               .klen   = 10,
-               .input  = "\xeb\x6a\x71\x1a\x2c\x02\x27\x1b",
-               .ilen   = 8,
-               .result = "\x01\x23\x45\x67\x89\xab\xcd\xef",
-               .rlen   = 8,
-       }, {
-               .key    = "\x01\x23\x45\x67\x12",
-               .klen   = 5,
-               .input  = "\x7a\xc8\x16\xd1\x6e\x9b\x30\x2e",
-               .ilen   = 8,
-               .result = "\x01\x23\x45\x67\x89\xab\xcd\xef",
-               .rlen   = 8,
+               .iv     = "\xE2\x24\x89\xEE\x53\xB8\x1D\x5F",
+               .input  = "\xFF\xC4\x2E\x82\x3D\xF8\xA8\x39"
+                         "\x7C\x52\xC4\xD3\xBB\x62\xC6\xA8"
+                         "\x0C",
+               .ilen   = 17,
+               .result = "\x56\xED\x84\x1B\x8F\x26\xBD\x31"
+                         "\xC8\x5F\xF6\x6A\x01\x98\x0C\xA3"
+                         "\x3A",
+               .rlen   = 17,
+       }, { /* Generated from TF test vectors */
+               .key    = "\x85\x62\x3F\x1C\xF9\xD6\x1C\xF9"
+                         "\xD6\xB3\x90\x6D\x4A\x90\x6D\x4A",
+               .klen   = 16,
+               .iv     = "\xE2\x24\x89\xEE\x53\xB8\x1D\x5F",
+               .input  = "\xFF\xC4\x2E\x82\x3D\xF8\xA8\x39"
+                         "\x7C\x52\xC4\xD3\xBB\x62\xC6\xA8"
+                         "\x0C\x63\xA5\x55\xE3\xF8\x1C\x7F"
+                         "\xDC\x59\xF9\xA0\x52\xAD\x83\xDF"
+                         "\xD5\x3B\x53\x4A\xAA\x1F\x49\x44"
+                         "\xE8\x20\xCC\xF8\x97\xE6\xE0\x3C"
+                         "\x5A\xD2\x83\xEC\xEE\x25\x3F\xCF"
+                         "\x0D\xC2\x79\x80\x99\x6E\xFF\x7B"
+                         "\x64\xB0\x7B\x86\x29\x1D\x9F\x17"
+                         "\x10\xA5\xA5\xEB\x16\x55\x9E\xE3"
+                         "\x88\x18\x52\x56\x48\x58\xD1\x6B"
+                         "\xE8\x74\x6E\x48\xB0\x2E\x69\x63"
+                         "\x32\xAA\xAC\x26\x55\x45\x94\xDE"
+                         "\x30\x26\x26\xE6\x08\x82\x2F\x5F"
+                         "\xA7\x15\x94\x07\x75\x2D\xC6\x3A"
+                         "\x1B\xA0\x39\xFB\xBA\xB9\x06\x56"
+                         "\xF6\x9F\xF1\x2F\x9B\xF3\x89\x8B"
+                         "\x08\xC8\x9D\x5E\x6B\x95\x09\xC7"
+                         "\x98\xB7\x62\xA4\x1D\x25\xFA\xC5"
+                         "\x62\xC8\x5D\x6B\xB4\x85\x88\x7F"
+                         "\x3B\x29\xF9\xB4\x32\x62\x69\xBF"
+                         "\x32\xB8\xEB\xFD\x0E\x26\xAA\xA3"
+                         "\x44\x67\x90\x20\xAC\x41\xDF\x43"
+                         "\xC6\xC7\x19\x9F\x2C\x28\x74\xEB"
+                         "\x3E\x7F\x7A\x80\x5B\xE4\x08\x60"
+                         "\xC7\xC9\x71\x34\x44\xCE\x05\xFD"
+                         "\xA8\x91\xA8\x44\x5E\xD3\x89\x2C"
+                         "\xAE\x59\x0F\x07\x88\x79\x53\x26"
+                         "\xAF\xAC\xCB\x1D\x6F\x08\x25\x62"
+                         "\xD0\x82\x65\x66\xE4\x2A\x29\x1C"
+                         "\x9C\x64\x5F\x49\x9D\xF8\x62\xF9"
+                         "\xED\xC4\x13\x52\x75\xDC\xE4\xF9"
+                         "\x68\x0F\x8A\xCD\xA6\x8D\x75\xAA"
+                         "\x49\xA1\x86\x86\x37\x5C\x6B\x3D"
+                         "\x56\xE5\x6F\xBE\x27\xC0\x10\xF8"
+                         "\x3C\x4D\x17\x35\x14\xDC\x1C\xA0"
+                         "\x6E\xAE\xD1\x10\xDD\x83\x06\xC2"
+                         "\x23\xD3\xC7\x27\x15\x04\x2C\x27"
+                         "\xDD\x1F\x2E\x97\x09\x9C\x33\x7D"
+                         "\xAC\x50\x1B\x2E\xC9\x52\x0C\x14"
+                         "\x4B\x78\xC4\xDE\x07\x6A\x12\x02"
+                         "\x6E\xD7\x4B\x91\xB9\x88\x4D\x02"
+                         "\xC3\xB5\x04\xBC\xE0\x67\xCA\x18"
+                         "\x22\xA1\xAE\x9A\x21\xEF\xB2\x06"
+                         "\x35\xCD\xEC\x37\x70\x2D\xFC\x1E"
+                         "\xA8\x31\xE7\xFC\xE5\x8E\x88\x66"
+                         "\x16\xB5\xC8\x45\x21\x37\xBD\x24"
+                         "\xA9\xD5\x36\x12\x9F\x6E\x67\x80"
+                         "\x87\x54\xD5\xAF\x97\xE1\x15\xA7"
+                         "\x11\xF0\x63\x7B\xE1\x44\x14\x1C"
+                         "\x06\x32\x05\x8C\x6C\xDB\x9B\x36"
+                         "\x6A\x6B\xAD\x3A\x27\x55\x20\x4C"
+                         "\x76\x36\x43\xE8\x16\x60\xB5\xF3"
+                         "\xDF\x5A\xC6\xA5\x69\x78\x59\x51"
+                         "\x54\x68\x65\x06\x84\xDE\x3D\xAE"
+                         "\x38\x91\xBD\xCC\xA2\x8A\xEC\xE6"
+                         "\x9E\x83\xAE\x1E\x8E\x34\x5D\xDE"
+                         "\x91\xCE\x8F\xED\x40\xF7\xC8\x8B"
+                         "\x9A\x13\x4C\xAD\x89\x97\x9E\xD1"
+                         "\x91\x01\xD7\x21\x23\x28\x1E\xCC"
+                         "\x8C\x98\xDB\xDE\xFC\x72\x94\xAA"
+                         "\xC0\x0D\x96\xAA\x23\xF8\xFE\x13",
+               .ilen   = 496,
+               .result = "\x56\xED\x84\x1B\x8F\x26\xBD\x31"
+                         "\xC8\x5F\xF6\x6A\x01\x98\x0C\xA3"
+                         "\x3A\xD1\x45\xDC\x73\x0A\x7E\x15"
+                         "\xAC\x20\xB7\x4E\xE5\x59\xF0\x87"
+                         "\x1E\x92\x29\xC0\x34\xCB\x62\xF9"
+                         "\x6D\x04\x9B\x0F\xA6\x3D\xD4\x48"
+                         "\xDF\x76\x0D\x81\x18\xAF\x23\xBA"
+                         "\x51\xE8\x5C\xF3\x8A\x21\x95\x2C"
+                         "\xC3\x37\xCE\x65\xFC\x70\x07\x9E"
+                         "\x12\xA9\x40\xD7\x4B\xE2\x79\x10"
+                         "\x84\x1B\xB2\x26\xBD\x54\xEB\x5F"
+                         "\xF6\x8D\x01\x98\x2F\xC6\x3A\xD1"
+                         "\x68\xFF\x73\x0A\xA1\x15\xAC\x43"
+                         "\xDA\x4E\xE5\x7C\x13\x87\x1E\xB5"
+                         "\x29\xC0\x57\xEE\x62\xF9\x90\x04"
+                         "\x9B\x32\xC9\x3D\xD4\x6B\x02\x76"
+                         "\x0D\xA4\x18\xAF\x46\xDD\x51\xE8"
+                         "\x7F\x16\x8A\x21\xB8\x2C\xC3\x5A"
+                         "\xF1\x65\xFC\x93\x07\x9E\x35\xCC"
+                         "\x40\xD7\x6E\x05\x79\x10\xA7\x1B"
+                         "\xB2\x49\xE0\x54\xEB\x82\x19\x8D"
+                         "\x24\xBB\x2F\xC6\x5D\xF4\x68\xFF"
+                         "\x96\x0A\xA1\x38\xCF\x43\xDA\x71"
+                         "\x08\x7C\x13\xAA\x1E\xB5\x4C\xE3"
+                         "\x57\xEE\x85\x1C\x90\x27\xBE\x32"
+                         "\xC9\x60\xF7\x6B\x02\x99\x0D\xA4"
+                         "\x3B\xD2\x46\xDD\x74\x0B\x7F\x16"
+                         "\xAD\x21\xB8\x4F\xE6\x5A\xF1\x88"
+                         "\x1F\x93\x2A\xC1\x35\xCC\x63\xFA"
+                         "\x6E\x05\x9C\x10\xA7\x3E\xD5\x49"
+                         "\xE0\x77\x0E\x82\x19\xB0\x24\xBB"
+                         "\x52\xE9\x5D\xF4\x8B\x22\x96\x2D"
+                         "\xC4\x38\xCF\x66\xFD\x71\x08\x9F"
+                         "\x13\xAA\x41\xD8\x4C\xE3\x7A\x11"
+                         "\x85\x1C\xB3\x27\xBE\x55\xEC\x60"
+                         "\xF7\x8E\x02\x99\x30\xC7\x3B\xD2"
+                         "\x69\x00\x74\x0B\xA2\x16\xAD\x44"
+                         "\xDB\x4F\xE6\x7D\x14\x88\x1F\xB6"
+                         "\x2A\xC1\x58\xEF\x63\xFA\x91\x05"
+                         "\x9C\x33\xCA\x3E\xD5\x6C\x03\x77"
+                         "\x0E\xA5\x19\xB0\x47\xDE\x52\xE9"
+                         "\x80\x17\x8B\x22\xB9\x2D\xC4\x5B"
+                         "\xF2\x66\xFD\x94\x08\x9F\x36\xCD"
+                         "\x41\xD8\x6F\x06\x7A\x11\xA8\x1C"
+                         "\xB3\x4A\xE1\x55\xEC\x83\x1A\x8E"
+                         "\x25\xBC\x30\xC7\x5E\xF5\x69\x00"
+                         "\x97\x0B\xA2\x39\xD0\x44\xDB\x72"
+                         "\x09\x7D\x14\xAB\x1F\xB6\x4D\xE4"
+                         "\x58\xEF\x86\x1D\x91\x28\xBF\x33"
+                         "\xCA\x61\xF8\x6C\x03\x9A\x0E\xA5"
+                         "\x3C\xD3\x47\xDE\x75\x0C\x80\x17"
+                         "\xAE\x22\xB9\x50\xE7\x5B\xF2\x89"
+                         "\x20\x94\x2B\xC2\x36\xCD\x64\xFB"
+                         "\x6F\x06\x9D\x11\xA8\x3F\xD6\x4A"
+                         "\xE1\x78\x0F\x83\x1A\xB1\x25\xBC"
+                         "\x53\xEA\x5E\xF5\x8C\x00\x97\x2E"
+                         "\xC5\x39\xD0\x67\xFE\x72\x09\xA0"
+                         "\x14\xAB\x42\xD9\x4D\xE4\x7B\x12"
+                         "\x86\x1D\xB4\x28\xBF\x56\xED\x61"
+                         "\xF8\x8F\x03\x9A\x31\xC8\x3C\xD3"
+                         "\x6A\x01\x75\x0C\xA3\x17\xAE\x45"
+                         "\xDC\x50\xE7\x7E\x15\x89\x20\xB7",
+               .rlen   = 496,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 496 - 16, 16 },
        },
 };
 
@@ -13096,6 +16312,9 @@ static struct cipher_testvec camellia_enc_tv_template[] = {
                          "\x0D\xD0\xFD\xC4\x65\xA5\x69\xB9"
                          "\xF1\xF6\xB1\xA5\xB2\x75\x4F\x8A",
                .rlen   = 48,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 48 - 16, 16 },
        },
 };
 
@@ -13154,6 +16373,9 @@ static struct cipher_testvec camellia_dec_tv_template[] = {
                          "\x1E\x92\x29\xC0\x34\xCB\x62\xF9"
                          "\x6D\x04\x9B\x0F\xA6\x3D\xD4\x48",
                .rlen   = 48,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 48 - 16, 16 },
        },
 };
 
@@ -13208,6 +16430,9 @@ static struct cipher_testvec camellia_cbc_enc_tv_template[] = {
                          "\xB9\xF9\xC2\x27\x6A\xB6\x31\x27"
                          "\xA6\xAD\xEF\xE5\x5D\xE4\x02\x01",
                .rlen   = 48,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 48 - 16, 16 },
        },
 };
 
@@ -13262,6 +16487,9 @@ static struct cipher_testvec camellia_cbc_dec_tv_template[] = {
                          "\x1E\x92\x29\xC0\x34\xCB\x62\xF9"
                          "\x6D\x04\x9B\x0F\xA6\x3D\xD4\x48",
                .rlen   = 48,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 48 - 16, 16 },
        },
 };
 
@@ -13313,6 +16541,143 @@ static struct cipher_testvec camellia_ctr_enc_tv_template[] = {
                          "\x60\xFC\xE8\x94\xE8\xB5\x09\x2C"
                          "\x1E\x43\xEF",
                .rlen   = 51,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 51 - 16, 16 },
+       }, { /* Generated with Crypto++ */
+               .key    = "\x85\x62\x3F\x1C\xF9\xD6\x1C\xF9"
+                         "\xD6\xB3\x90\x6D\x4A\x90\x6D\x4A"
+                         "\x27\x04\xE1\x27\x04\xE1\xBE\x9B"
+                         "\x78\xBE\x9B\x78\x55\x32\x0F\x55",
+               .klen   = 32,
+               .iv     = "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+                         "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFD",
+               .input  = "\x56\xED\x84\x1B\x8F\x26\xBD\x31"
+                         "\xC8\x5F\xF6\x6A\x01\x98\x0C\xA3"
+                         "\x3A\xD1\x45\xDC\x73\x0A\x7E\x15"
+                         "\xAC\x20\xB7\x4E\xE5\x59\xF0\x87"
+                         "\x1E\x92\x29\xC0\x34\xCB\x62\xF9"
+                         "\x6D\x04\x9B\x0F\xA6\x3D\xD4\x48"
+                         "\xDF\x76\x0D\x81\x18\xAF\x23\xBA"
+                         "\x51\xE8\x5C\xF3\x8A\x21\x95\x2C"
+                         "\xC3\x37\xCE\x65\xFC\x70\x07\x9E"
+                         "\x12\xA9\x40\xD7\x4B\xE2\x79\x10"
+                         "\x84\x1B\xB2\x26\xBD\x54\xEB\x5F"
+                         "\xF6\x8D\x01\x98\x2F\xC6\x3A\xD1"
+                         "\x68\xFF\x73\x0A\xA1\x15\xAC\x43"
+                         "\xDA\x4E\xE5\x7C\x13\x87\x1E\xB5"
+                         "\x29\xC0\x57\xEE\x62\xF9\x90\x04"
+                         "\x9B\x32\xC9\x3D\xD4\x6B\x02\x76"
+                         "\x0D\xA4\x18\xAF\x46\xDD\x51\xE8"
+                         "\x7F\x16\x8A\x21\xB8\x2C\xC3\x5A"
+                         "\xF1\x65\xFC\x93\x07\x9E\x35\xCC"
+                         "\x40\xD7\x6E\x05\x79\x10\xA7\x1B"
+                         "\xB2\x49\xE0\x54\xEB\x82\x19\x8D"
+                         "\x24\xBB\x2F\xC6\x5D\xF4\x68\xFF"
+                         "\x96\x0A\xA1\x38\xCF\x43\xDA\x71"
+                         "\x08\x7C\x13\xAA\x1E\xB5\x4C\xE3"
+                         "\x57\xEE\x85\x1C\x90\x27\xBE\x32"
+                         "\xC9\x60\xF7\x6B\x02\x99\x0D\xA4"
+                         "\x3B\xD2\x46\xDD\x74\x0B\x7F\x16"
+                         "\xAD\x21\xB8\x4F\xE6\x5A\xF1\x88"
+                         "\x1F\x93\x2A\xC1\x35\xCC\x63\xFA"
+                         "\x6E\x05\x9C\x10\xA7\x3E\xD5\x49"
+                         "\xE0\x77\x0E\x82\x19\xB0\x24\xBB"
+                         "\x52\xE9\x5D\xF4\x8B\x22\x96\x2D"
+                         "\xC4\x38\xCF\x66\xFD\x71\x08\x9F"
+                         "\x13\xAA\x41\xD8\x4C\xE3\x7A\x11"
+                         "\x85\x1C\xB3\x27\xBE\x55\xEC\x60"
+                         "\xF7\x8E\x02\x99\x30\xC7\x3B\xD2"
+                         "\x69\x00\x74\x0B\xA2\x16\xAD\x44"
+                         "\xDB\x4F\xE6\x7D\x14\x88\x1F\xB6"
+                         "\x2A\xC1\x58\xEF\x63\xFA\x91\x05"
+                         "\x9C\x33\xCA\x3E\xD5\x6C\x03\x77"
+                         "\x0E\xA5\x19\xB0\x47\xDE\x52\xE9"
+                         "\x80\x17\x8B\x22\xB9\x2D\xC4\x5B"
+                         "\xF2\x66\xFD\x94\x08\x9F\x36\xCD"
+                         "\x41\xD8\x6F\x06\x7A\x11\xA8\x1C"
+                         "\xB3\x4A\xE1\x55\xEC\x83\x1A\x8E"
+                         "\x25\xBC\x30\xC7\x5E\xF5\x69\x00"
+                         "\x97\x0B\xA2\x39\xD0\x44\xDB\x72"
+                         "\x09\x7D\x14\xAB\x1F\xB6\x4D\xE4"
+                         "\x58\xEF\x86\x1D\x91\x28\xBF\x33"
+                         "\xCA\x61\xF8\x6C\x03\x9A\x0E\xA5"
+                         "\x3C\xD3\x47\xDE\x75\x0C\x80\x17"
+                         "\xAE\x22\xB9\x50\xE7\x5B\xF2\x89"
+                         "\x20\x94\x2B\xC2\x36\xCD\x64\xFB"
+                         "\x6F\x06\x9D\x11\xA8\x3F\xD6\x4A"
+                         "\xE1\x78\x0F\x83\x1A\xB1\x25\xBC"
+                         "\x53\xEA\x5E\xF5\x8C\x00\x97\x2E"
+                         "\xC5\x39\xD0\x67\xFE\x72\x09\xA0"
+                         "\x14\xAB\x42\xD9\x4D\xE4\x7B\x12"
+                         "\x86\x1D\xB4\x28\xBF\x56\xED\x61"
+                         "\xF8\x8F\x03\x9A\x31\xC8\x3C\xD3"
+                         "\x6A\x01\x75\x0C\xA3\x17\xAE\x45"
+                         "\xDC\x50\xE7\x7E\x15\x89\x20\xB7",
+               .ilen   = 496,
+               .result = "\x85\x79\x6C\x8B\x2B\x6D\x14\xF9"
+                         "\xA6\x83\xB6\x80\x5B\x3A\xF3\x7E"
+                         "\x30\x29\xEB\x1F\xDC\x19\x5F\xEB"
+                         "\xF7\xC4\x27\x04\x51\x87\xD7\x6F"
+                         "\xB8\x4E\x07\xFB\xAC\x3B\x08\xB4"
+                         "\x4D\xCB\xE8\xE1\x71\x7D\x4F\x48"
+                         "\xCD\x81\x64\xA5\xC4\x07\x1A\x9A"
+                         "\x4B\x62\x90\x0E\xC8\xB3\x2B\x6B"
+                         "\x8F\x9C\x6E\x72\x4B\xBA\xEF\x07"
+                         "\x2C\x56\x07\x5E\x37\x30\x60\xA9"
+                         "\xE3\xEF\xD6\x69\xE1\xA1\x77\x64"
+                         "\x93\x75\x7A\xB7\x7A\x3B\xE9\x43"
+                         "\x23\x35\x95\x91\x80\x8A\xC7\xCF"
+                         "\xC3\xD5\xBF\xE7\xFE\x4C\x06\x6B"
+                         "\x05\x19\x48\xE2\x62\xBA\x4F\xF2"
+                         "\xFB\xEE\xE4\xCB\x79\x9D\xA3\x10"
+                         "\x1D\x29\x8C\x1D\x7A\x88\x5A\xDD"
+                         "\x4E\xB6\x18\xAA\xCD\xE6\x33\x96"
+                         "\xD9\x0F\x90\x5A\x78\x76\x4D\x77"
+                         "\x3C\x20\x89\x3B\xA3\xF9\x07\xFD"
+                         "\xE4\xE8\x20\x2D\x15\x0A\x63\x49"
+                         "\xF5\x4F\x89\xD8\xDE\xA1\x28\x78"
+                         "\x28\x07\x09\x1B\x03\x94\x1D\x4B"
+                         "\x82\x28\x1E\x1D\x95\xBA\xAC\x85"
+                         "\x71\x6E\x3C\x18\x4B\x77\x74\x79"
+                         "\xBF\x67\x0A\x53\x3C\x94\xD9\x60"
+                         "\xE9\x6D\x40\x34\xA0\x2A\x53\x5D"
+                         "\x27\xD5\x47\xF9\xC3\x4B\x27\x29"
+                         "\xE4\x76\x9C\x3F\xA7\x1C\x87\xFC"
+                         "\x6E\x0F\xCF\x9B\x60\xF0\xF0\x8B"
+                         "\x70\x1C\x84\x81\x72\x4D\xB4\x98"
+                         "\x23\x62\xE7\x6A\x2B\xFC\xA5\xB2"
+                         "\xFF\xF5\x71\x07\xCD\x90\x23\x13"
+                         "\x19\xD7\x79\x36\x6C\x9D\x55\x8B"
+                         "\x93\x78\x86\x05\x69\x46\xD0\xC5"
+                         "\x39\x09\xEB\x79\xEF\xFA\x9F\xAE"
+                         "\xF3\xD5\x44\xC3\xFD\x86\xD2\x7C"
+                         "\x83\x4B\xD8\x75\x9C\x18\x04\x7B"
+                         "\x73\xAD\x72\xA4\xF6\xAB\xCF\x4B"
+                         "\xCC\x01\x45\x90\xA6\x43\x05\x0C"
+                         "\x6C\x4F\x62\x77\x57\x97\x9F\xEE"
+                         "\x75\xA7\x3C\x38\xD1\x0F\x3D\x0E"
+                         "\x2C\x43\x98\xFB\x13\x65\x73\xE4"
+                         "\x3C\x1E\xD6\x90\x08\xF7\xE0\x99"
+                         "\x3B\xF1\x9D\x6C\x48\xA9\x0E\x32"
+                         "\x17\xC2\xCC\x20\xA1\x19\x26\xAA"
+                         "\xE0\x75\x2F\xFB\x54\x66\x0A\xDF"
+                         "\xB5\xF2\x1F\xC1\x34\x3C\x30\x56"
+                         "\xE8\xDC\xF7\x92\x6B\xBF\x17\x24"
+                         "\xEC\x94\xB5\x3B\xD6\xCE\xA2\x54"
+                         "\x10\x7F\x50\xDE\x69\x77\xD5\x37"
+                         "\xFE\x9C\x10\x83\xC5\xEB\xC9\x53"
+                         "\xB7\xF3\xC4\x20\xAF\x0A\x7E\x57"
+                         "\x3A\xE6\x75\xFE\x89\x00\x6E\x48"
+                         "\xFB\x99\x17\x2C\xF6\x64\x40\x95"
+                         "\x5E\xDC\x7A\xA6\x70\xC7\xF4\xDD"
+                         "\x52\x05\x24\x34\xF9\x0E\xC8\x64"
+                         "\x6D\xE2\xD8\x80\x53\x31\x4C\xFE"
+                         "\xB4\x3A\x5F\x19\xCF\x42\x1B\x22"
+                         "\x0B\x2D\x7B\xF1\xC5\x43\xF7\x5E"
+                         "\x12\xA8\x01\x64\x16\x0B\x26\x5A"
+                         "\x0C\x95\x0F\x40\xC5\x5A\x06\x7C",
+               .rlen   = 496,
        },
 };
 
@@ -13364,8 +16729,144 @@ static struct cipher_testvec camellia_ctr_dec_tv_template[] = {
                          "\x6D\x04\x9B\x0F\xA6\x3D\xD4\x48"
                          "\xDF\x76\x0D",
                .rlen   = 51,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 51 - 16, 16 },
+       }, { /* Generated with Crypto++ */
+               .key    = "\x85\x62\x3F\x1C\xF9\xD6\x1C\xF9"
+                         "\xD6\xB3\x90\x6D\x4A\x90\x6D\x4A"
+                         "\x27\x04\xE1\x27\x04\xE1\xBE\x9B"
+                         "\x78\xBE\x9B\x78\x55\x32\x0F\x55",
+               .klen   = 32,
+               .iv     = "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+                         "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFD",
+               .input  = "\x85\x79\x6C\x8B\x2B\x6D\x14\xF9"
+                         "\xA6\x83\xB6\x80\x5B\x3A\xF3\x7E"
+                         "\x30\x29\xEB\x1F\xDC\x19\x5F\xEB"
+                         "\xF7\xC4\x27\x04\x51\x87\xD7\x6F"
+                         "\xB8\x4E\x07\xFB\xAC\x3B\x08\xB4"
+                         "\x4D\xCB\xE8\xE1\x71\x7D\x4F\x48"
+                         "\xCD\x81\x64\xA5\xC4\x07\x1A\x9A"
+                         "\x4B\x62\x90\x0E\xC8\xB3\x2B\x6B"
+                         "\x8F\x9C\x6E\x72\x4B\xBA\xEF\x07"
+                         "\x2C\x56\x07\x5E\x37\x30\x60\xA9"
+                         "\xE3\xEF\xD6\x69\xE1\xA1\x77\x64"
+                         "\x93\x75\x7A\xB7\x7A\x3B\xE9\x43"
+                         "\x23\x35\x95\x91\x80\x8A\xC7\xCF"
+                         "\xC3\xD5\xBF\xE7\xFE\x4C\x06\x6B"
+                         "\x05\x19\x48\xE2\x62\xBA\x4F\xF2"
+                         "\xFB\xEE\xE4\xCB\x79\x9D\xA3\x10"
+                         "\x1D\x29\x8C\x1D\x7A\x88\x5A\xDD"
+                         "\x4E\xB6\x18\xAA\xCD\xE6\x33\x96"
+                         "\xD9\x0F\x90\x5A\x78\x76\x4D\x77"
+                         "\x3C\x20\x89\x3B\xA3\xF9\x07\xFD"
+                         "\xE4\xE8\x20\x2D\x15\x0A\x63\x49"
+                         "\xF5\x4F\x89\xD8\xDE\xA1\x28\x78"
+                         "\x28\x07\x09\x1B\x03\x94\x1D\x4B"
+                         "\x82\x28\x1E\x1D\x95\xBA\xAC\x85"
+                         "\x71\x6E\x3C\x18\x4B\x77\x74\x79"
+                         "\xBF\x67\x0A\x53\x3C\x94\xD9\x60"
+                         "\xE9\x6D\x40\x34\xA0\x2A\x53\x5D"
+                         "\x27\xD5\x47\xF9\xC3\x4B\x27\x29"
+                         "\xE4\x76\x9C\x3F\xA7\x1C\x87\xFC"
+                         "\x6E\x0F\xCF\x9B\x60\xF0\xF0\x8B"
+                         "\x70\x1C\x84\x81\x72\x4D\xB4\x98"
+                         "\x23\x62\xE7\x6A\x2B\xFC\xA5\xB2"
+                         "\xFF\xF5\x71\x07\xCD\x90\x23\x13"
+                         "\x19\xD7\x79\x36\x6C\x9D\x55\x8B"
+                         "\x93\x78\x86\x05\x69\x46\xD0\xC5"
+                         "\x39\x09\xEB\x79\xEF\xFA\x9F\xAE"
+                         "\xF3\xD5\x44\xC3\xFD\x86\xD2\x7C"
+                         "\x83\x4B\xD8\x75\x9C\x18\x04\x7B"
+                         "\x73\xAD\x72\xA4\xF6\xAB\xCF\x4B"
+                         "\xCC\x01\x45\x90\xA6\x43\x05\x0C"
+                         "\x6C\x4F\x62\x77\x57\x97\x9F\xEE"
+                         "\x75\xA7\x3C\x38\xD1\x0F\x3D\x0E"
+                         "\x2C\x43\x98\xFB\x13\x65\x73\xE4"
+                         "\x3C\x1E\xD6\x90\x08\xF7\xE0\x99"
+                         "\x3B\xF1\x9D\x6C\x48\xA9\x0E\x32"
+                         "\x17\xC2\xCC\x20\xA1\x19\x26\xAA"
+                         "\xE0\x75\x2F\xFB\x54\x66\x0A\xDF"
+                         "\xB5\xF2\x1F\xC1\x34\x3C\x30\x56"
+                         "\xE8\xDC\xF7\x92\x6B\xBF\x17\x24"
+                         "\xEC\x94\xB5\x3B\xD6\xCE\xA2\x54"
+                         "\x10\x7F\x50\xDE\x69\x77\xD5\x37"
+                         "\xFE\x9C\x10\x83\xC5\xEB\xC9\x53"
+                         "\xB7\xF3\xC4\x20\xAF\x0A\x7E\x57"
+                         "\x3A\xE6\x75\xFE\x89\x00\x6E\x48"
+                         "\xFB\x99\x17\x2C\xF6\x64\x40\x95"
+                         "\x5E\xDC\x7A\xA6\x70\xC7\xF4\xDD"
+                         "\x52\x05\x24\x34\xF9\x0E\xC8\x64"
+                         "\x6D\xE2\xD8\x80\x53\x31\x4C\xFE"
+                         "\xB4\x3A\x5F\x19\xCF\x42\x1B\x22"
+                         "\x0B\x2D\x7B\xF1\xC5\x43\xF7\x5E"
+                         "\x12\xA8\x01\x64\x16\x0B\x26\x5A"
+                         "\x0C\x95\x0F\x40\xC5\x5A\x06\x7C",
+               .ilen   = 496,
+               .result = "\x56\xED\x84\x1B\x8F\x26\xBD\x31"
+                         "\xC8\x5F\xF6\x6A\x01\x98\x0C\xA3"
+                         "\x3A\xD1\x45\xDC\x73\x0A\x7E\x15"
+                         "\xAC\x20\xB7\x4E\xE5\x59\xF0\x87"
+                         "\x1E\x92\x29\xC0\x34\xCB\x62\xF9"
+                         "\x6D\x04\x9B\x0F\xA6\x3D\xD4\x48"
+                         "\xDF\x76\x0D\x81\x18\xAF\x23\xBA"
+                         "\x51\xE8\x5C\xF3\x8A\x21\x95\x2C"
+                         "\xC3\x37\xCE\x65\xFC\x70\x07\x9E"
+                         "\x12\xA9\x40\xD7\x4B\xE2\x79\x10"
+                         "\x84\x1B\xB2\x26\xBD\x54\xEB\x5F"
+                         "\xF6\x8D\x01\x98\x2F\xC6\x3A\xD1"
+                         "\x68\xFF\x73\x0A\xA1\x15\xAC\x43"
+                         "\xDA\x4E\xE5\x7C\x13\x87\x1E\xB5"
+                         "\x29\xC0\x57\xEE\x62\xF9\x90\x04"
+                         "\x9B\x32\xC9\x3D\xD4\x6B\x02\x76"
+                         "\x0D\xA4\x18\xAF\x46\xDD\x51\xE8"
+                         "\x7F\x16\x8A\x21\xB8\x2C\xC3\x5A"
+                         "\xF1\x65\xFC\x93\x07\x9E\x35\xCC"
+                         "\x40\xD7\x6E\x05\x79\x10\xA7\x1B"
+                         "\xB2\x49\xE0\x54\xEB\x82\x19\x8D"
+                         "\x24\xBB\x2F\xC6\x5D\xF4\x68\xFF"
+                         "\x96\x0A\xA1\x38\xCF\x43\xDA\x71"
+                         "\x08\x7C\x13\xAA\x1E\xB5\x4C\xE3"
+                         "\x57\xEE\x85\x1C\x90\x27\xBE\x32"
+                         "\xC9\x60\xF7\x6B\x02\x99\x0D\xA4"
+                         "\x3B\xD2\x46\xDD\x74\x0B\x7F\x16"
+                         "\xAD\x21\xB8\x4F\xE6\x5A\xF1\x88"
+                         "\x1F\x93\x2A\xC1\x35\xCC\x63\xFA"
+                         "\x6E\x05\x9C\x10\xA7\x3E\xD5\x49"
+                         "\xE0\x77\x0E\x82\x19\xB0\x24\xBB"
+                         "\x52\xE9\x5D\xF4\x8B\x22\x96\x2D"
+                         "\xC4\x38\xCF\x66\xFD\x71\x08\x9F"
+                         "\x13\xAA\x41\xD8\x4C\xE3\x7A\x11"
+                         "\x85\x1C\xB3\x27\xBE\x55\xEC\x60"
+                         "\xF7\x8E\x02\x99\x30\xC7\x3B\xD2"
+                         "\x69\x00\x74\x0B\xA2\x16\xAD\x44"
+                         "\xDB\x4F\xE6\x7D\x14\x88\x1F\xB6"
+                         "\x2A\xC1\x58\xEF\x63\xFA\x91\x05"
+                         "\x9C\x33\xCA\x3E\xD5\x6C\x03\x77"
+                         "\x0E\xA5\x19\xB0\x47\xDE\x52\xE9"
+                         "\x80\x17\x8B\x22\xB9\x2D\xC4\x5B"
+                         "\xF2\x66\xFD\x94\x08\x9F\x36\xCD"
+                         "\x41\xD8\x6F\x06\x7A\x11\xA8\x1C"
+                         "\xB3\x4A\xE1\x55\xEC\x83\x1A\x8E"
+                         "\x25\xBC\x30\xC7\x5E\xF5\x69\x00"
+                         "\x97\x0B\xA2\x39\xD0\x44\xDB\x72"
+                         "\x09\x7D\x14\xAB\x1F\xB6\x4D\xE4"
+                         "\x58\xEF\x86\x1D\x91\x28\xBF\x33"
+                         "\xCA\x61\xF8\x6C\x03\x9A\x0E\xA5"
+                         "\x3C\xD3\x47\xDE\x75\x0C\x80\x17"
+                         "\xAE\x22\xB9\x50\xE7\x5B\xF2\x89"
+                         "\x20\x94\x2B\xC2\x36\xCD\x64\xFB"
+                         "\x6F\x06\x9D\x11\xA8\x3F\xD6\x4A"
+                         "\xE1\x78\x0F\x83\x1A\xB1\x25\xBC"
+                         "\x53\xEA\x5E\xF5\x8C\x00\x97\x2E"
+                         "\xC5\x39\xD0\x67\xFE\x72\x09\xA0"
+                         "\x14\xAB\x42\xD9\x4D\xE4\x7B\x12"
+                         "\x86\x1D\xB4\x28\xBF\x56\xED\x61"
+                         "\xF8\x8F\x03\x9A\x31\xC8\x3C\xD3"
+                         "\x6A\x01\x75\x0C\xA3\x17\xAE\x45"
+                         "\xDC\x50\xE7\x7E\x15\x89\x20\xB7",
+               .rlen   = 496,
        },
-
 };
 
 static struct cipher_testvec camellia_lrw_enc_tv_template[] = {
@@ -13614,6 +17115,9 @@ static struct cipher_testvec camellia_lrw_enc_tv_template[] = {
                          "\xb2\x1a\xd8\x4c\xbd\x1d\x10\xe9"
                          "\x5a\xa8\x92\x7f\xba\xe6\x0c\x95",
                .rlen   = 512,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 512 - 16, 16 },
        },
 };
 
@@ -13864,6 +17368,9 @@ static struct cipher_testvec camellia_lrw_dec_tv_template[] = {
                          "\xe9\x2e\xc4\x29\x0f\x84\xdb\xc4"
                          "\x21\xc4\xc2\x75\x67\x89\x37\x0a",
                .rlen   = 512,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 512 - 16, 16 },
        },
 };
 
@@ -14203,6 +17710,9 @@ static struct cipher_testvec camellia_xts_enc_tv_template[] = {
                          "\xb7\x16\xd8\x12\x5c\xcd\x7d\x4e"
                          "\xd5\xc6\x99\xcc\x4e\x6c\x94\x95",
                .rlen   = 512,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 512 - 16, 16 },
        },
 };
 
@@ -14543,6 +18053,9 @@ static struct cipher_testvec camellia_xts_dec_tv_template[] = {
                          "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7"
                          "\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff",
                .rlen   = 512,
+               .also_non_np = 1,
+               .np     = 2,
+               .tap    = { 512 - 16, 16 },
        },
 };
 
index cbca4f2..8740355 100644 (file)
@@ -628,7 +628,7 @@ static int tgr128_final(struct shash_desc *desc, u8 * out)
        return 0;
 }
 
-static struct shash_alg tgr192 = {
+static struct shash_alg tgr_algs[3] = { {
        .digestsize     =       TGR192_DIGEST_SIZE,
        .init           =       tgr192_init,
        .update         =       tgr192_update,
@@ -640,9 +640,7 @@ static struct shash_alg tgr192 = {
                .cra_blocksize  =       TGR192_BLOCK_SIZE,
                .cra_module     =       THIS_MODULE,
        }
-};
-
-static struct shash_alg tgr160 = {
+}, {
        .digestsize     =       TGR160_DIGEST_SIZE,
        .init           =       tgr192_init,
        .update         =       tgr192_update,
@@ -654,9 +652,7 @@ static struct shash_alg tgr160 = {
                .cra_blocksize  =       TGR192_BLOCK_SIZE,
                .cra_module     =       THIS_MODULE,
        }
-};
-
-static struct shash_alg tgr128 = {
+}, {
        .digestsize     =       TGR128_DIGEST_SIZE,
        .init           =       tgr192_init,
        .update         =       tgr192_update,
@@ -668,38 +664,16 @@ static struct shash_alg tgr128 = {
                .cra_blocksize  =       TGR192_BLOCK_SIZE,
                .cra_module     =       THIS_MODULE,
        }
-};
+} };
 
 static int __init tgr192_mod_init(void)
 {
-       int ret = 0;
-
-       ret = crypto_register_shash(&tgr192);
-
-       if (ret < 0) {
-               goto out;
-       }
-
-       ret = crypto_register_shash(&tgr160);
-       if (ret < 0) {
-               crypto_unregister_shash(&tgr192);
-               goto out;
-       }
-
-       ret = crypto_register_shash(&tgr128);
-       if (ret < 0) {
-               crypto_unregister_shash(&tgr192);
-               crypto_unregister_shash(&tgr160);
-       }
-      out:
-       return ret;
+       return crypto_register_shashes(tgr_algs, ARRAY_SIZE(tgr_algs));
 }
 
 static void __exit tgr192_mod_fini(void)
 {
-       crypto_unregister_shash(&tgr192);
-       crypto_unregister_shash(&tgr160);
-       crypto_unregister_shash(&tgr128);
+       crypto_unregister_shashes(tgr_algs, ARRAY_SIZE(tgr_algs));
 }
 
 MODULE_ALIAS("tgr160");
index 1f07b84..2d50005 100644 (file)
@@ -188,7 +188,6 @@ static struct crypto_alg alg = {
        .cra_ctxsize        =   sizeof(struct twofish_ctx),
        .cra_alignmask      =   3,
        .cra_module         =   THIS_MODULE,
-       .cra_list           =   LIST_HEAD_INIT(alg.cra_list),
        .cra_u              =   { .cipher = {
        .cia_min_keysize    =   TF_MIN_KEY_SIZE,
        .cia_max_keysize    =   TF_MAX_KEY_SIZE,
index 4243905..f2338ca 100644 (file)
  * Constants and masks
  */
 #define UINT64_C(x) x##ULL
-const u64 p64   = UINT64_C(0xfffffffffffffeff);  /* 2^64 - 257 prime  */
-const u64 m62   = UINT64_C(0x3fffffffffffffff);  /* 62-bit mask       */
-const u64 m63   = UINT64_C(0x7fffffffffffffff);  /* 63-bit mask       */
-const u64 m64   = UINT64_C(0xffffffffffffffff);  /* 64-bit mask       */
-const u64 mpoly = UINT64_C(0x1fffffff1fffffff);  /* Poly key mask     */
+static const u64 p64   = UINT64_C(0xfffffffffffffeff); /* 2^64 - 257 prime  */
+static const u64 m62   = UINT64_C(0x3fffffffffffffff); /* 62-bit mask       */
+static const u64 m63   = UINT64_C(0x7fffffffffffffff); /* 63-bit mask       */
+static const u64 m64   = UINT64_C(0xffffffffffffffff); /* 64-bit mask       */
+static const u64 mpoly = UINT64_C(0x1fffffff1fffffff); /* Poly key mask     */
 
 #define pe64_to_cpup le64_to_cpup              /* Prefer little endian */
 
index 71719a2..180f1d6 100644 (file)
@@ -1119,7 +1119,7 @@ static int wp256_final(struct shash_desc *desc, u8 *out)
        return 0;
 }
 
-static struct shash_alg wp512 = {
+static struct shash_alg wp_algs[3] = { {
        .digestsize     =       WP512_DIGEST_SIZE,
        .init           =       wp512_init,
        .update         =       wp512_update,
@@ -1131,9 +1131,7 @@ static struct shash_alg wp512 = {
                .cra_blocksize  =       WP512_BLOCK_SIZE,
                .cra_module     =       THIS_MODULE,
        }
-};
-
-static struct shash_alg wp384 = {
+}, {
        .digestsize     =       WP384_DIGEST_SIZE,
        .init           =       wp512_init,
        .update         =       wp512_update,
@@ -1145,9 +1143,7 @@ static struct shash_alg wp384 = {
                .cra_blocksize  =       WP512_BLOCK_SIZE,
                .cra_module     =       THIS_MODULE,
        }
-};
-
-static struct shash_alg wp256 = {
+}, {
        .digestsize     =       WP256_DIGEST_SIZE,
        .init           =       wp512_init,
        .update         =       wp512_update,
@@ -1159,39 +1155,16 @@ static struct shash_alg wp256 = {
                .cra_blocksize  =       WP512_BLOCK_SIZE,
                .cra_module     =       THIS_MODULE,
        }
-};
+} };
 
 static int __init wp512_mod_init(void)
 {
-       int ret = 0;
-
-       ret = crypto_register_shash(&wp512);
-
-       if (ret < 0)
-               goto out;
-
-       ret = crypto_register_shash(&wp384);
-       if (ret < 0)
-       {
-               crypto_unregister_shash(&wp512);
-               goto out;
-       }
-
-       ret = crypto_register_shash(&wp256);
-       if (ret < 0)
-       {
-               crypto_unregister_shash(&wp512);
-               crypto_unregister_shash(&wp384);
-       }
-out:
-       return ret;
+       return crypto_register_shashes(wp_algs, ARRAY_SIZE(wp_algs));
 }
 
 static void __exit wp512_mod_fini(void)
 {
-       crypto_unregister_shash(&wp512);
-       crypto_unregister_shash(&wp384);
-       crypto_unregister_shash(&wp256);
+       crypto_unregister_shashes(wp_algs, ARRAY_SIZE(wp_algs));
 }
 
 MODULE_ALIAS("wp384");
index 85074de..f05d857 100644 (file)
 #define RNGA_STATUS_LAST_READ_STATUS   0x00000002
 #define RNGA_STATUS_SECURITY_VIOLATION 0x00000001
 
-static struct platform_device *rng_dev;
+struct mxc_rng {
+       struct device *dev;
+       struct hwrng rng;
+       void __iomem *mem;
+       struct clk *clk;
+};
 
 static int mxc_rnga_data_present(struct hwrng *rng, int wait)
 {
-       void __iomem *rng_base = (void __iomem *)rng->priv;
        int i;
+       struct mxc_rng *mxc_rng = container_of(rng, struct mxc_rng, rng);
 
        for (i = 0; i < 20; i++) {
                /* how many random numbers are in FIFO? [0-16] */
-               int level = (__raw_readl(rng_base + RNGA_STATUS) &
+               int level = (__raw_readl(mxc_rng->mem + RNGA_STATUS) &
                                RNGA_STATUS_LEVEL_MASK) >> 8;
                if (level || !wait)
                        return !!level;
@@ -81,20 +86,20 @@ static int mxc_rnga_data_read(struct hwrng *rng, u32 * data)
 {
        int err;
        u32 ctrl;
-       void __iomem *rng_base = (void __iomem *)rng->priv;
+       struct mxc_rng *mxc_rng = container_of(rng, struct mxc_rng, rng);
 
        /* retrieve a random number from FIFO */
-       *data = __raw_readl(rng_base + RNGA_OUTPUT_FIFO);
+       *data = __raw_readl(mxc_rng->mem + RNGA_OUTPUT_FIFO);
 
        /* some error while reading this random number? */
-       err = __raw_readl(rng_base + RNGA_STATUS) & RNGA_STATUS_ERROR_INT;
+       err = __raw_readl(mxc_rng->mem + RNGA_STATUS) & RNGA_STATUS_ERROR_INT;
 
        /* if error: clear error interrupt, but doesn't return random number */
        if (err) {
-               dev_dbg(&rng_dev->dev, "Error while reading random number!\n");
-               ctrl = __raw_readl(rng_base + RNGA_CONTROL);
+               dev_dbg(mxc_rng->dev, "Error while reading random number!\n");
+               ctrl = __raw_readl(mxc_rng->mem + RNGA_CONTROL);
                __raw_writel(ctrl | RNGA_CONTROL_CLEAR_INT,
-                                       rng_base + RNGA_CONTROL);
+                                       mxc_rng->mem + RNGA_CONTROL);
                return 0;
        } else
                return 4;
@@ -103,22 +108,22 @@ static int mxc_rnga_data_read(struct hwrng *rng, u32 * data)
 static int mxc_rnga_init(struct hwrng *rng)
 {
        u32 ctrl, osc;
-       void __iomem *rng_base = (void __iomem *)rng->priv;
+       struct mxc_rng *mxc_rng = container_of(rng, struct mxc_rng, rng);
 
        /* wake up */
-       ctrl = __raw_readl(rng_base + RNGA_CONTROL);
-       __raw_writel(ctrl & ~RNGA_CONTROL_SLEEP, rng_base + RNGA_CONTROL);
+       ctrl = __raw_readl(mxc_rng->mem + RNGA_CONTROL);
+       __raw_writel(ctrl & ~RNGA_CONTROL_SLEEP, mxc_rng->mem + RNGA_CONTROL);
 
        /* verify if oscillator is working */
-       osc = __raw_readl(rng_base + RNGA_STATUS);
+       osc = __raw_readl(mxc_rng->mem + RNGA_STATUS);
        if (osc & RNGA_STATUS_OSC_DEAD) {
-               dev_err(&rng_dev->dev, "RNGA Oscillator is dead!\n");
+               dev_err(mxc_rng->dev, "RNGA Oscillator is dead!\n");
                return -ENODEV;
        }
 
        /* go running */
-       ctrl = __raw_readl(rng_base + RNGA_CONTROL);
-       __raw_writel(ctrl | RNGA_CONTROL_GO, rng_base + RNGA_CONTROL);
+       ctrl = __raw_readl(mxc_rng->mem + RNGA_CONTROL);
+       __raw_writel(ctrl | RNGA_CONTROL_GO, mxc_rng->mem + RNGA_CONTROL);
 
        return 0;
 }
@@ -126,40 +131,40 @@ static int mxc_rnga_init(struct hwrng *rng)
 static void mxc_rnga_cleanup(struct hwrng *rng)
 {
        u32 ctrl;
-       void __iomem *rng_base = (void __iomem *)rng->priv;
+       struct mxc_rng *mxc_rng = container_of(rng, struct mxc_rng, rng);
 
-       ctrl = __raw_readl(rng_base + RNGA_CONTROL);
+       ctrl = __raw_readl(mxc_rng->mem + RNGA_CONTROL);
 
        /* stop rnga */
-       __raw_writel(ctrl & ~RNGA_CONTROL_GO, rng_base + RNGA_CONTROL);
+       __raw_writel(ctrl & ~RNGA_CONTROL_GO, mxc_rng->mem + RNGA_CONTROL);
 }
 
-static struct hwrng mxc_rnga = {
-       .name = "mxc-rnga",
-       .init = mxc_rnga_init,
-       .cleanup = mxc_rnga_cleanup,
-       .data_present = mxc_rnga_data_present,
-       .data_read = mxc_rnga_data_read
-};
-
 static int __init mxc_rnga_probe(struct platform_device *pdev)
 {
        int err = -ENODEV;
-       struct clk *clk;
        struct resource *res, *mem;
-       void __iomem *rng_base = NULL;
-
-       if (rng_dev)
-               return -EBUSY;
-
-       clk = clk_get(&pdev->dev, "rng");
-       if (IS_ERR(clk)) {
+       struct mxc_rng *mxc_rng;
+
+       mxc_rng = devm_kzalloc(&pdev->dev, sizeof(struct mxc_rng),
+                                       GFP_KERNEL);
+       if (!mxc_rng)
+               return -ENOMEM;
+
+       mxc_rng->dev = &pdev->dev;
+       mxc_rng->rng.name = "mxc-rnga";
+       mxc_rng->rng.init = mxc_rnga_init;
+       mxc_rng->rng.cleanup = mxc_rnga_cleanup,
+       mxc_rng->rng.data_present = mxc_rnga_data_present,
+       mxc_rng->rng.data_read = mxc_rnga_data_read,
+
+       mxc_rng->clk = devm_clk_get(&pdev->dev, NULL);
+       if (IS_ERR(mxc_rng->clk)) {
                dev_err(&pdev->dev, "Could not get rng_clk!\n");
-               err = PTR_ERR(clk);
+               err = PTR_ERR(mxc_rng->clk);
                goto out;
        }
 
-       clk_enable(clk);
+       clk_prepare_enable(mxc_rng->clk);
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        if (!res) {
@@ -173,36 +178,27 @@ static int __init mxc_rnga_probe(struct platform_device *pdev)
                goto err_region;
        }
 
-       rng_base = ioremap(res->start, resource_size(res));
-       if (!rng_base) {
+       mxc_rng->mem = ioremap(res->start, resource_size(res));
+       if (!mxc_rng->mem) {
                err = -ENOMEM;
                goto err_ioremap;
        }
 
-       mxc_rnga.priv = (unsigned long)rng_base;
-
-       err = hwrng_register(&mxc_rnga);
+       err = hwrng_register(&mxc_rng->rng);
        if (err) {
                dev_err(&pdev->dev, "MXC RNGA registering failed (%d)\n", err);
-               goto err_register;
+               goto err_ioremap;
        }
 
-       rng_dev = pdev;
-
        dev_info(&pdev->dev, "MXC RNGA Registered.\n");
 
        return 0;
 
-err_register:
-       iounmap(rng_base);
-       rng_base = NULL;
-
 err_ioremap:
        release_mem_region(res->start, resource_size(res));
 
 err_region:
-       clk_disable(clk);
-       clk_put(clk);
+       clk_disable_unprepare(mxc_rng->clk);
 
 out:
        return err;
@@ -211,17 +207,15 @@ out:
 static int __exit mxc_rnga_remove(struct platform_device *pdev)
 {
        struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       void __iomem *rng_base = (void __iomem *)mxc_rnga.priv;
-       struct clk *clk = clk_get(&pdev->dev, "rng");
+       struct mxc_rng *mxc_rng = platform_get_drvdata(pdev);
 
-       hwrng_unregister(&mxc_rnga);
+       hwrng_unregister(&mxc_rng->rng);
 
-       iounmap(rng_base);
+       iounmap(mxc_rng->mem);
 
        release_mem_region(res->start, resource_size(res));
 
-       clk_disable(clk);
-       clk_put(clk);
+       clk_disable_unprepare(mxc_rng->clk);
 
        return 0;
 }
index 0943edc..5c34c09 100644 (file)
@@ -75,42 +75,35 @@ static int __devinit octeon_rng_probe(struct platform_device *pdev)
 
        res_ports = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        if (!res_ports)
-               goto err_ports;
+               return -ENOENT;
 
        res_result = platform_get_resource(pdev, IORESOURCE_MEM, 1);
        if (!res_result)
-               goto err_ports;
+               return -ENOENT;
 
 
        rng->control_status = devm_ioremap_nocache(&pdev->dev,
                                                   res_ports->start,
                                                   sizeof(u64));
        if (!rng->control_status)
-               goto err_ports;
+               return -ENOENT;
 
        rng->result = devm_ioremap_nocache(&pdev->dev,
                                           res_result->start,
                                           sizeof(u64));
        if (!rng->result)
-               goto err_r;
+               return -ENOENT;
 
        rng->ops = ops;
 
        dev_set_drvdata(&pdev->dev, &rng->ops);
        ret = hwrng_register(&rng->ops);
        if (ret)
-               goto err;
+               return -ENOENT;
 
        dev_info(&pdev->dev, "Octeon Random Number Generator\n");
 
        return 0;
-err:
-       devm_iounmap(&pdev->dev, rng->control_status);
-err_r:
-       devm_iounmap(&pdev->dev, rng->result);
-err_ports:
-       devm_kfree(&pdev->dev, rng);
-       return -ENOENT;
 }
 
 static int __exit octeon_rng_remove(struct platform_device *pdev)
index 7d74d09..308c7fb 100644 (file)
@@ -298,21 +298,15 @@ config CRYPTO_DEV_TEGRA_AES
          will be called tegra-aes.
 
 config CRYPTO_DEV_NX
-       tristate "Support for Power7+ in-Nest cryptographic acceleration"
+       bool "Support for IBM Power7+ in-Nest cryptographic acceleration"
        depends on PPC64 && IBMVIO
-       select CRYPTO_AES
-       select CRYPTO_CBC
-       select CRYPTO_ECB
-       select CRYPTO_CCM
-       select CRYPTO_GCM
-       select CRYPTO_AUTHENC
-       select CRYPTO_XCBC
-       select CRYPTO_SHA256
-       select CRYPTO_SHA512
+       default n
        help
-         Support for Power7+ in-Nest cryptographic acceleration. This
-         module supports acceleration for AES and SHA2 algorithms. If you
-         choose 'M' here, this module will be called nx_crypto.
+         Support for Power7+ in-Nest cryptographic acceleration.
+
+if CRYPTO_DEV_NX
+       source "drivers/crypto/nx/Kconfig"
+endif
 
 config CRYPTO_DEV_UX500
        tristate "Driver for ST-Ericsson UX500 crypto hardware acceleration"
@@ -340,7 +334,7 @@ config CRYPTO_DEV_ATMEL_AES
        select CRYPTO_AES
        select CRYPTO_ALGAPI
        select CRYPTO_BLKCIPHER
-       select CONFIG_AT_HDMAC
+       select AT_HDMAC
        help
          Some Atmel processors have AES hw accelerator.
          Select this if you want to use the Atmel module for
index 802e851..f88e3d8 100644 (file)
@@ -1226,6 +1226,7 @@ static int __init crypto4xx_probe(struct platform_device *ofdev)
        core_dev->dev->ce_base = of_iomap(ofdev->dev.of_node, 0);
        if (!core_dev->dev->ce_base) {
                dev_err(dev, "failed to of_iomap\n");
+               rc = -ENOMEM;
                goto err_iomap;
        }
 
index 6bb20ff..8061336 100644 (file)
 #include <linux/platform_device.h>
 
 #include <linux/device.h>
-#include <linux/module.h>
 #include <linux/init.h>
 #include <linux/errno.h>
 #include <linux/interrupt.h>
-#include <linux/kernel.h>
-#include <linux/clk.h>
 #include <linux/irq.h>
-#include <linux/io.h>
-#include <linux/platform_device.h>
 #include <linux/scatterlist.h>
 #include <linux/dma-mapping.h>
 #include <linux/delay.h>
@@ -1017,7 +1012,6 @@ static int atmel_aes_register_algs(struct atmel_aes_dev *dd)
        int err, i, j;
 
        for (i = 0; i < ARRAY_SIZE(aes_algs); i++) {
-               INIT_LIST_HEAD(&aes_algs[i].cra_list);
                err = crypto_register_alg(&aes_algs[i]);
                if (err)
                        goto err_aes_algs;
@@ -1026,7 +1020,6 @@ static int atmel_aes_register_algs(struct atmel_aes_dev *dd)
        atmel_aes_hw_version_init(dd);
 
        if (dd->hw_version >= 0x130) {
-               INIT_LIST_HEAD(&aes_cfb64_alg[0].cra_list);
                err = crypto_register_alg(&aes_cfb64_alg[0]);
                if (err)
                        goto err_aes_cfb64_alg;
index f938b9d..bcdf55f 100644 (file)
 #include <linux/platform_device.h>
 
 #include <linux/device.h>
-#include <linux/module.h>
 #include <linux/init.h>
 #include <linux/errno.h>
 #include <linux/interrupt.h>
-#include <linux/kernel.h>
-#include <linux/clk.h>
 #include <linux/irq.h>
-#include <linux/io.h>
-#include <linux/platform_device.h>
 #include <linux/scatterlist.h>
 #include <linux/dma-mapping.h>
 #include <linux/delay.h>
index eb2b61e..7495f98 100644 (file)
 #include <linux/platform_device.h>
 
 #include <linux/device.h>
-#include <linux/module.h>
 #include <linux/init.h>
 #include <linux/errno.h>
 #include <linux/interrupt.h>
-#include <linux/kernel.h>
-#include <linux/clk.h>
 #include <linux/irq.h>
-#include <linux/io.h>
-#include <linux/platform_device.h>
 #include <linux/scatterlist.h>
 #include <linux/dma-mapping.h>
 #include <linux/delay.h>
@@ -1044,7 +1039,6 @@ static int atmel_tdes_register_algs(struct atmel_tdes_dev *dd)
        int err, i, j;
 
        for (i = 0; i < ARRAY_SIZE(tdes_algs); i++) {
-               INIT_LIST_HEAD(&tdes_algs[i].cra_list);
                err = crypto_register_alg(&tdes_algs[i]);
                if (err)
                        goto err_tdes_algs;
index 0c1ea84..b2a0a07 100644 (file)
@@ -205,7 +205,7 @@ static void init_sh_desc_key_aead(u32 *desc, struct caam_ctx *ctx,
 {
        u32 *key_jump_cmd;
 
-       init_sh_desc(desc, HDR_SHARE_WAIT);
+       init_sh_desc(desc, HDR_SHARE_SERIAL);
 
        /* Skip if already shared */
        key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
@@ -224,7 +224,7 @@ static int aead_set_sh_desc(struct crypto_aead *aead)
        struct aead_tfm *tfm = &aead->base.crt_aead;
        struct caam_ctx *ctx = crypto_aead_ctx(aead);
        struct device *jrdev = ctx->jrdev;
-       bool keys_fit_inline = 0;
+       bool keys_fit_inline = false;
        u32 *key_jump_cmd, *jump_cmd;
        u32 geniv, moveiv;
        u32 *desc;
@@ -239,7 +239,7 @@ static int aead_set_sh_desc(struct crypto_aead *aead)
        if (DESC_AEAD_ENC_LEN + DESC_JOB_IO_LEN +
            ctx->split_key_pad_len + ctx->enckeylen <=
            CAAM_DESC_BYTES_MAX)
-               keys_fit_inline = 1;
+               keys_fit_inline = true;
 
        /* aead_encrypt shared descriptor */
        desc = ctx->sh_desc_enc;
@@ -297,12 +297,12 @@ static int aead_set_sh_desc(struct crypto_aead *aead)
        if (DESC_AEAD_DEC_LEN + DESC_JOB_IO_LEN +
            ctx->split_key_pad_len + ctx->enckeylen <=
            CAAM_DESC_BYTES_MAX)
-               keys_fit_inline = 1;
+               keys_fit_inline = true;
 
        desc = ctx->sh_desc_dec;
 
        /* aead_decrypt shared descriptor */
-       init_sh_desc(desc, HDR_SHARE_WAIT);
+       init_sh_desc(desc, HDR_SHARE_SERIAL);
 
        /* Skip if already shared */
        key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
@@ -365,7 +365,7 @@ static int aead_set_sh_desc(struct crypto_aead *aead)
        if (DESC_AEAD_GIVENC_LEN + DESC_JOB_IO_LEN +
            ctx->split_key_pad_len + ctx->enckeylen <=
            CAAM_DESC_BYTES_MAX)
-               keys_fit_inline = 1;
+               keys_fit_inline = true;
 
        /* aead_givencrypt shared descriptor */
        desc = ctx->sh_desc_givenc;
@@ -564,7 +564,7 @@ static int ablkcipher_setkey(struct crypto_ablkcipher *ablkcipher,
 
        /* ablkcipher_encrypt shared descriptor */
        desc = ctx->sh_desc_enc;
-       init_sh_desc(desc, HDR_SHARE_WAIT);
+       init_sh_desc(desc, HDR_SHARE_SERIAL);
        /* Skip if already shared */
        key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
                                   JUMP_COND_SHRD);
@@ -605,7 +605,7 @@ static int ablkcipher_setkey(struct crypto_ablkcipher *ablkcipher,
        /* ablkcipher_decrypt shared descriptor */
        desc = ctx->sh_desc_dec;
 
-       init_sh_desc(desc, HDR_SHARE_WAIT);
+       init_sh_desc(desc, HDR_SHARE_SERIAL);
        /* Skip if already shared */
        key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
                                   JUMP_COND_SHRD);
@@ -1354,10 +1354,10 @@ static struct aead_edesc *aead_giv_edesc_alloc(struct aead_givcrypt_request
                contig &= ~GIV_SRC_CONTIG;
        if (dst_nents || iv_dma + ivsize != sg_dma_address(req->dst))
                contig &= ~GIV_DST_CONTIG;
-               if (unlikely(req->src != req->dst)) {
-                       dst_nents = dst_nents ? : 1;
-                       sec4_sg_len += 1;
-               }
+       if (unlikely(req->src != req->dst)) {
+               dst_nents = dst_nents ? : 1;
+               sec4_sg_len += 1;
+       }
        if (!(contig & GIV_SRC_CONTIG)) {
                assoc_nents = assoc_nents ? : 1;
                src_nents = src_nents ? : 1;
@@ -1650,7 +1650,11 @@ struct caam_alg_template {
 };
 
 static struct caam_alg_template driver_algs[] = {
-       /* single-pass ipsec_esp descriptor */
+       /*
+        * single-pass ipsec_esp descriptor
+        * authencesn(*,*) is also registered, although not present
+        * explicitly here.
+        */
        {
                .name = "authenc(hmac(md5),cbc(aes))",
                .driver_name = "authenc-hmac-md5-cbc-aes-caam",
@@ -2213,7 +2217,9 @@ static int __init caam_algapi_init(void)
        for (i = 0; i < ARRAY_SIZE(driver_algs); i++) {
                /* TODO: check if h/w supports alg */
                struct caam_crypto_alg *t_alg;
+               bool done = false;
 
+authencesn:
                t_alg = caam_alg_alloc(ctrldev, &driver_algs[i]);
                if (IS_ERR(t_alg)) {
                        err = PTR_ERR(t_alg);
@@ -2227,8 +2233,25 @@ static int __init caam_algapi_init(void)
                        dev_warn(ctrldev, "%s alg registration failed\n",
                                t_alg->crypto_alg.cra_driver_name);
                        kfree(t_alg);
-               } else
+               } else {
                        list_add_tail(&t_alg->entry, &priv->alg_list);
+                       if (driver_algs[i].type == CRYPTO_ALG_TYPE_AEAD &&
+                           !memcmp(driver_algs[i].name, "authenc", 7) &&
+                           !done) {
+                               char *name;
+
+                               name = driver_algs[i].name;
+                               memmove(name + 10, name + 7, strlen(name) - 7);
+                               memcpy(name + 7, "esn", 3);
+
+                               name = driver_algs[i].driver_name;
+                               memmove(name + 10, name + 7, strlen(name) - 7);
+                               memcpy(name + 7, "esn", 3);
+
+                               done = true;
+                               goto authencesn;
+                       }
+               }
        }
        if (!list_empty(&priv->alg_list))
                dev_info(ctrldev, "%s algorithms registered in /proc/crypto\n",
index 895aaf2..32aba7a 100644 (file)
@@ -225,7 +225,7 @@ static inline void init_sh_desc_key_ahash(u32 *desc, struct caam_hash_ctx *ctx)
 {
        u32 *key_jump_cmd;
 
-       init_sh_desc(desc, HDR_SHARE_WAIT);
+       init_sh_desc(desc, HDR_SHARE_SERIAL);
 
        if (ctx->split_key_len) {
                /* Skip if already shared */
@@ -311,7 +311,7 @@ static int ahash_set_sh_desc(struct crypto_ahash *ahash)
        /* ahash_update shared descriptor */
        desc = ctx->sh_desc_update;
 
-       init_sh_desc(desc, HDR_SHARE_WAIT);
+       init_sh_desc(desc, HDR_SHARE_SERIAL);
 
        /* Import context from software */
        append_cmd(desc, CMD_SEQ_LOAD | LDST_SRCDST_BYTE_CONTEXT |
@@ -430,6 +430,10 @@ static u32 hash_digest_key(struct caam_hash_ctx *ctx, const u8 *key_in,
        int ret = 0;
 
        desc = kmalloc(CAAM_CMD_SZ * 6 + CAAM_PTR_SZ * 2, GFP_KERNEL | GFP_DMA);
+       if (!desc) {
+               dev_err(jrdev, "unable to allocate key input memory\n");
+               return -ENOMEM;
+       }
 
        init_job_desc(desc, 0);
 
@@ -1736,8 +1740,11 @@ static void __exit caam_algapi_hash_exit(void)
        struct caam_hash_alg *t_alg, *n;
 
        dev_node = of_find_compatible_node(NULL, NULL, "fsl,sec-v4.0");
-       if (!dev_node)
-               return;
+       if (!dev_node) {
+               dev_node = of_find_compatible_node(NULL, NULL, "fsl,sec4.0");
+               if (!dev_node)
+                       return;
+       }
 
        pdev = of_find_device_by_node(dev_node);
        if (!pdev)
@@ -1812,8 +1819,11 @@ static int __init caam_algapi_hash_init(void)
        int i = 0, err = 0;
 
        dev_node = of_find_compatible_node(NULL, NULL, "fsl,sec-v4.0");
-       if (!dev_node)
-               return -ENODEV;
+       if (!dev_node) {
+               dev_node = of_find_compatible_node(NULL, NULL, "fsl,sec4.0");
+               if (!dev_node)
+                       return -ENODEV;
+       }
 
        pdev = of_find_device_by_node(dev_node);
        if (!pdev)
index e2bfe16..d1939a9 100644 (file)
@@ -193,7 +193,7 @@ static inline void rng_create_sh_desc(struct caam_rng_ctx *ctx)
        struct device *jrdev = ctx->jrdev;
        u32 *desc = ctx->sh_desc;
 
-       init_sh_desc(desc, HDR_SHARE_WAIT);
+       init_sh_desc(desc, HDR_SHARE_SERIAL);
 
        /* Propagate errors from shared to job descriptor */
        append_cmd(desc, SET_OK_NO_PROP_ERRORS | CMD_LOAD);
@@ -284,8 +284,11 @@ static int __init caam_rng_init(void)
        struct caam_drv_private *priv;
 
        dev_node = of_find_compatible_node(NULL, NULL, "fsl,sec-v4.0");
-       if (!dev_node)
-               return -ENODEV;
+       if (!dev_node) {
+               dev_node = of_find_compatible_node(NULL, NULL, "fsl,sec4.0");
+               if (!dev_node)
+                       return -ENODEV;
+       }
 
        pdev = of_find_device_by_node(dev_node);
        if (!pdev)
index 762aeff..cf15e78 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/types.h>
 #include <linux/debugfs.h>
 #include <linux/circ_buf.h>
+#include <linux/string.h>
 #include <net/xfrm.h>
 
 #include <crypto/algapi.h>
index 414ba20..bf20dd8 100644 (file)
@@ -129,7 +129,7 @@ static int instantiate_rng(struct device *jrdev)
 
 /*
  * By default, the TRNG runs for 200 clocks per sample;
- * 800 clocks per sample generates better entropy.
+ * 1600 clocks per sample generates better entropy.
  */
 static void kick_trng(struct platform_device *pdev)
 {
@@ -144,9 +144,9 @@ static void kick_trng(struct platform_device *pdev)
 
        /* put RNG4 into program mode */
        setbits32(&r4tst->rtmctl, RTMCTL_PRGM);
-       /* 800 clocks per sample */
+       /* 1600 clocks per sample */
        val = rd_reg32(&r4tst->rtsdctl);
-       val = (val & ~RTSDCTL_ENT_DLY_MASK) | (800 << RTSDCTL_ENT_DLY_SHIFT);
+       val = (val & ~RTSDCTL_ENT_DLY_MASK) | (1600 << RTSDCTL_ENT_DLY_SHIFT);
        wr_reg32(&r4tst->rtsdctl, val);
        /* min. freq. count */
        wr_reg32(&r4tst->rtfrqmin, 400);
index 9955ed9..30b8f74 100644 (file)
@@ -77,10 +77,8 @@ static void report_ccb_status(u32 status, char *outstr)
                "Not instantiated",
                "Test instantiate",
                "Prediction resistance",
-               "",
                "Prediction resistance and test request",
                "Uninstantiate",
-               "",
                "Secure key generation",
        };
        u8 cha_id = (status & JRSTA_CCBERR_CHAID_MASK) >>
index d216cd3..f6dba10 100644 (file)
@@ -54,6 +54,10 @@ u32 gen_split_key(struct device *jrdev, u8 *key_out, int split_key_len,
        int ret = 0;
 
        desc = kmalloc(CAAM_CMD_SZ * 6 + CAAM_PTR_SZ * 2, GFP_KERNEL | GFP_DMA);
+       if (!desc) {
+               dev_err(jrdev, "unable to allocate key input memory\n");
+               return -ENOMEM;
+       }
 
        init_job_desc(desc, 0);
 
index f3e36c8..51f196d 100644 (file)
@@ -289,7 +289,6 @@ static struct crypto_alg geode_alg = {
        .cra_blocksize          =       AES_MIN_BLOCK_SIZE,
        .cra_ctxsize            =       sizeof(struct geode_aes_op),
        .cra_module                     =       THIS_MODULE,
-       .cra_list                       =       LIST_HEAD_INIT(geode_alg.cra_list),
        .cra_u                          =       {
                .cipher =       {
                        .cia_min_keysize        =       AES_MIN_KEY_SIZE,
@@ -402,7 +401,6 @@ static struct crypto_alg geode_cbc_alg = {
        .cra_alignmask          =       15,
        .cra_type                       =       &crypto_blkcipher_type,
        .cra_module                     =       THIS_MODULE,
-       .cra_list                       =       LIST_HEAD_INIT(geode_cbc_alg.cra_list),
        .cra_u                          =       {
                .blkcipher      =       {
                        .min_keysize    =       AES_MIN_KEY_SIZE,
@@ -489,7 +487,6 @@ static struct crypto_alg geode_ecb_alg = {
        .cra_alignmask          =       15,
        .cra_type                       =       &crypto_blkcipher_type,
        .cra_module                     =       THIS_MODULE,
-       .cra_list                       =       LIST_HEAD_INIT(geode_ecb_alg.cra_list),
        .cra_u                          =       {
                .blkcipher      =       {
                        .min_keysize    =       AES_MIN_KEY_SIZE,
@@ -588,21 +585,8 @@ static struct pci_driver geode_aes_driver = {
        .remove = __devexit_p(geode_aes_remove)
 };
 
-static int __init
-geode_aes_init(void)
-{
-       return pci_register_driver(&geode_aes_driver);
-}
-
-static void __exit
-geode_aes_exit(void)
-{
-       pci_unregister_driver(&geode_aes_driver);
-}
+module_pci_driver(geode_aes_driver);
 
 MODULE_AUTHOR("Advanced Micro Devices, Inc.");
 MODULE_DESCRIPTION("Geode LX Hardware AES driver");
 MODULE_LICENSE("GPL");
-
-module_init(geode_aes_init);
-module_exit(geode_aes_exit);
index df14358..fda3296 100644 (file)
@@ -2611,14 +2611,17 @@ static int __devinit hifn_probe(struct pci_dev *pdev, const struct pci_device_id
                size = pci_resource_len(pdev, i);
 
                dev->bar[i] = ioremap_nocache(addr, size);
-               if (!dev->bar[i])
+               if (!dev->bar[i]) {
+                       err = -ENOMEM;
                        goto err_out_unmap_bars;
+               }
        }
 
        dev->desc_virt = pci_alloc_consistent(pdev, sizeof(struct hifn_dma),
                        &dev->desc_dma);
        if (!dev->desc_virt) {
                dprintk("Failed to allocate descriptor rings.\n");
+               err = -ENOMEM;
                goto err_out_unmap_bars;
        }
        memset(dev->desc_virt, 0, sizeof(struct hifn_dma));
diff --git a/drivers/crypto/nx/Kconfig b/drivers/crypto/nx/Kconfig
new file mode 100644 (file)
index 0000000..f826166
--- /dev/null
@@ -0,0 +1,26 @@
+config CRYPTO_DEV_NX_ENCRYPT
+       tristate "Encryption acceleration support"
+       depends on PPC64 && IBMVIO
+       default y
+       select CRYPTO_AES
+       select CRYPTO_CBC
+       select CRYPTO_ECB
+       select CRYPTO_CCM
+       select CRYPTO_GCM
+       select CRYPTO_AUTHENC
+       select CRYPTO_XCBC
+       select CRYPTO_SHA256
+       select CRYPTO_SHA512
+       help
+         Support for Power7+ in-Nest encryption acceleration. This
+         module supports acceleration for AES and SHA2 algorithms. If you
+         choose 'M' here, this module will be called nx_crypto.
+
+config CRYPTO_DEV_NX_COMPRESS
+       tristate "Compression acceleration support"
+       depends on PPC64 && IBMVIO
+       default y
+       help
+         Support for Power7+ in-Nest compression acceleration. This
+         module supports acceleration for AES and SHA2 algorithms. If you
+         choose 'M' here, this module will be called nx_compress.
index 411ce59..bb770ea 100644 (file)
@@ -1,4 +1,4 @@
-obj-$(CONFIG_CRYPTO_DEV_NX) += nx-crypto.o
+obj-$(CONFIG_CRYPTO_DEV_NX_ENCRYPT) += nx-crypto.o
 nx-crypto-objs := nx.o \
                  nx_debugfs.o \
                  nx-aes-cbc.o \
@@ -9,3 +9,6 @@ nx-crypto-objs := nx.o \
                  nx-aes-xcbc.o \
                  nx-sha256.o \
                  nx-sha512.o
+
+obj-$(CONFIG_CRYPTO_DEV_NX_COMPRESS) += nx-compress.o
+nx-compress-objs := nx-842.o
diff --git a/drivers/crypto/nx/nx-842.c b/drivers/crypto/nx/nx-842.c
new file mode 100644 (file)
index 0000000..0ce6257
--- /dev/null
@@ -0,0 +1,1617 @@
+/*
+ * Driver for IBM Power 842 compression accelerator
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ * Copyright (C) IBM Corporation, 2012
+ *
+ * Authors: Robert Jennings <rcj@linux.vnet.ibm.com>
+ *          Seth Jennings <sjenning@linux.vnet.ibm.com>
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/nx842.h>
+#include <linux/of.h>
+#include <linux/slab.h>
+
+#include <asm/page.h>
+#include <asm/pSeries_reconfig.h>
+#include <asm/vio.h>
+
+#include "nx_csbcpb.h" /* struct nx_csbcpb */
+
+#define MODULE_NAME "nx-compress"
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Robert Jennings <rcj@linux.vnet.ibm.com>");
+MODULE_DESCRIPTION("842 H/W Compression driver for IBM Power processors");
+
+#define SHIFT_4K 12
+#define SHIFT_64K 16
+#define SIZE_4K (1UL << SHIFT_4K)
+#define SIZE_64K (1UL << SHIFT_64K)
+
+/* IO buffer must be 128 byte aligned */
+#define IO_BUFFER_ALIGN 128
+
+struct nx842_header {
+       int blocks_nr; /* number of compressed blocks */
+       int offset; /* offset of the first block (from beginning of header) */
+       int sizes[0]; /* size of compressed blocks */
+};
+
+static inline int nx842_header_size(const struct nx842_header *hdr)
+{
+       return sizeof(struct nx842_header) +
+                       hdr->blocks_nr * sizeof(hdr->sizes[0]);
+}
+
+/* Macros for fields within nx_csbcpb */
+/* Check the valid bit within the csbcpb valid field */
+#define NX842_CSBCBP_VALID_CHK(x) (x & BIT_MASK(7))
+
+/* CE macros operate on the completion_extension field bits in the csbcpb.
+ * CE0 0=full completion, 1=partial completion
+ * CE1 0=CE0 indicates completion, 1=termination (output may be modified)
+ * CE2 0=processed_bytes is source bytes, 1=processed_bytes is target bytes */
+#define NX842_CSBCPB_CE0(x)    (x & BIT_MASK(7))
+#define NX842_CSBCPB_CE1(x)    (x & BIT_MASK(6))
+#define NX842_CSBCPB_CE2(x)    (x & BIT_MASK(5))
+
+/* The NX unit accepts data only on 4K page boundaries */
+#define NX842_HW_PAGE_SHIFT    SHIFT_4K
+#define NX842_HW_PAGE_SIZE     (ASM_CONST(1) << NX842_HW_PAGE_SHIFT)
+#define NX842_HW_PAGE_MASK     (~(NX842_HW_PAGE_SIZE-1))
+
+enum nx842_status {
+       UNAVAILABLE,
+       AVAILABLE
+};
+
+struct ibm_nx842_counters {
+       atomic64_t comp_complete;
+       atomic64_t comp_failed;
+       atomic64_t decomp_complete;
+       atomic64_t decomp_failed;
+       atomic64_t swdecomp;
+       atomic64_t comp_times[32];
+       atomic64_t decomp_times[32];
+};
+
+static struct nx842_devdata {
+       struct vio_dev *vdev;
+       struct device *dev;
+       struct ibm_nx842_counters *counters;
+       unsigned int max_sg_len;
+       unsigned int max_sync_size;
+       unsigned int max_sync_sg;
+       enum nx842_status status;
+} __rcu *devdata;
+static DEFINE_SPINLOCK(devdata_mutex);
+
+#define NX842_COUNTER_INC(_x) \
+static inline void nx842_inc_##_x( \
+       const struct nx842_devdata *dev) { \
+       if (dev) \
+               atomic64_inc(&dev->counters->_x); \
+}
+NX842_COUNTER_INC(comp_complete);
+NX842_COUNTER_INC(comp_failed);
+NX842_COUNTER_INC(decomp_complete);
+NX842_COUNTER_INC(decomp_failed);
+NX842_COUNTER_INC(swdecomp);
+
+#define NX842_HIST_SLOTS 16
+
+static void ibm_nx842_incr_hist(atomic64_t *times, unsigned int time)
+{
+       int bucket = fls(time);
+
+       if (bucket)
+               bucket = min((NX842_HIST_SLOTS - 1), bucket - 1);
+
+       atomic64_inc(&times[bucket]);
+}
+
+/* NX unit operation flags */
+#define NX842_OP_COMPRESS      0x0
+#define NX842_OP_CRC           0x1
+#define NX842_OP_DECOMPRESS    0x2
+#define NX842_OP_COMPRESS_CRC   (NX842_OP_COMPRESS | NX842_OP_CRC)
+#define NX842_OP_DECOMPRESS_CRC (NX842_OP_DECOMPRESS | NX842_OP_CRC)
+#define NX842_OP_ASYNC         (1<<23)
+#define NX842_OP_NOTIFY                (1<<22)
+#define NX842_OP_NOTIFY_INT(x) ((x & 0xff)<<8)
+
+static unsigned long nx842_get_desired_dma(struct vio_dev *viodev)
+{
+       /* No use of DMA mappings within the driver. */
+       return 0;
+}
+
+struct nx842_slentry {
+       unsigned long ptr; /* Real address (use __pa()) */
+       unsigned long len;
+};
+
+/* pHyp scatterlist entry */
+struct nx842_scatterlist {
+       int entry_nr; /* number of slentries */
+       struct nx842_slentry *entries; /* ptr to array of slentries */
+};
+
+/* Does not include sizeof(entry_nr) in the size */
+static inline unsigned long nx842_get_scatterlist_size(
+                               struct nx842_scatterlist *sl)
+{
+       return sl->entry_nr * sizeof(struct nx842_slentry);
+}
+
+static int nx842_build_scatterlist(unsigned long buf, int len,
+                       struct nx842_scatterlist *sl)
+{
+       unsigned long nextpage;
+       struct nx842_slentry *entry;
+
+       sl->entry_nr = 0;
+
+       entry = sl->entries;
+       while (len) {
+               entry->ptr = __pa(buf);
+               nextpage = ALIGN(buf + 1, NX842_HW_PAGE_SIZE);
+               if (nextpage < buf + len) {
+                       /* we aren't at the end yet */
+                       if (IS_ALIGNED(buf, NX842_HW_PAGE_SIZE))
+                               /* we are in the middle (or beginning) */
+                               entry->len = NX842_HW_PAGE_SIZE;
+                       else
+                               /* we are at the beginning */
+                               entry->len = nextpage - buf;
+               } else {
+                       /* at the end */
+                       entry->len = len;
+               }
+
+               len -= entry->len;
+               buf += entry->len;
+               sl->entry_nr++;
+               entry++;
+       }
+
+       return 0;
+}
+
+/*
+ * Working memory for software decompression
+ */
+struct sw842_fifo {
+       union {
+               char f8[256][8];
+               char f4[512][4];
+       };
+       char f2[256][2];
+       unsigned char f84_full;
+       unsigned char f2_full;
+       unsigned char f8_count;
+       unsigned char f2_count;
+       unsigned int f4_count;
+};
+
+/*
+ * Working memory for crypto API
+ */
+struct nx842_workmem {
+       char bounce[PAGE_SIZE]; /* bounce buffer for decompression input */
+       union {
+               /* hardware working memory */
+               struct {
+                       /* scatterlist */
+                       char slin[SIZE_4K];
+                       char slout[SIZE_4K];
+                       /* coprocessor status/parameter block */
+                       struct nx_csbcpb csbcpb;
+               };
+               /* software working memory */
+               struct sw842_fifo swfifo; /* software decompression fifo */
+       };
+};
+
+int nx842_get_workmem_size(void)
+{
+       return sizeof(struct nx842_workmem) + NX842_HW_PAGE_SIZE;
+}
+EXPORT_SYMBOL_GPL(nx842_get_workmem_size);
+
+int nx842_get_workmem_size_aligned(void)
+{
+       return sizeof(struct nx842_workmem);
+}
+EXPORT_SYMBOL_GPL(nx842_get_workmem_size_aligned);
+
+static int nx842_validate_result(struct device *dev,
+       struct cop_status_block *csb)
+{
+       /* The csb must be valid after returning from vio_h_cop_sync */
+       if (!NX842_CSBCBP_VALID_CHK(csb->valid)) {
+               dev_err(dev, "%s: cspcbp not valid upon completion.\n",
+                               __func__);
+               dev_dbg(dev, "valid:0x%02x cs:0x%02x cc:0x%02x ce:0x%02x\n",
+                               csb->valid,
+                               csb->crb_seq_number,
+                               csb->completion_code,
+                               csb->completion_extension);
+               dev_dbg(dev, "processed_bytes:%d address:0x%016lx\n",
+                               csb->processed_byte_count,
+                               (unsigned long)csb->address);
+               return -EIO;
+       }
+
+       /* Check return values from the hardware in the CSB */
+       switch (csb->completion_code) {
+       case 0: /* Completed without error */
+               break;
+       case 64: /* Target bytes > Source bytes during compression */
+       case 13: /* Output buffer too small */
+               dev_dbg(dev, "%s: Compression output larger than input\n",
+                                       __func__);
+               return -ENOSPC;
+       case 66: /* Input data contains an illegal template field */
+       case 67: /* Template indicates data past the end of the input stream */
+               dev_dbg(dev, "%s: Bad data for decompression (code:%d)\n",
+                                       __func__, csb->completion_code);
+               return -EINVAL;
+       default:
+               dev_dbg(dev, "%s: Unspecified error (code:%d)\n",
+                                       __func__, csb->completion_code);
+               return -EIO;
+       }
+
+       /* Hardware sanity check */
+       if (!NX842_CSBCPB_CE2(csb->completion_extension)) {
+               dev_err(dev, "%s: No error returned by hardware, but "
+                               "data returned is unusable, contact support.\n"
+                               "(Additional info: csbcbp->processed bytes "
+                               "does not specify processed bytes for the "
+                               "target buffer.)\n", __func__);
+               return -EIO;
+       }
+
+       return 0;
+}
+
+/**
+ * nx842_compress - Compress data using the 842 algorithm
+ *
+ * Compression provide by the NX842 coprocessor on IBM Power systems.
+ * The input buffer is compressed and the result is stored in the
+ * provided output buffer.
+ *
+ * Upon return from this function @outlen contains the length of the
+ * compressed data.  If there is an error then @outlen will be 0 and an
+ * error will be specified by the return code from this function.
+ *
+ * @in: Pointer to input buffer, must be page aligned
+ * @inlen: Length of input buffer, must be PAGE_SIZE
+ * @out: Pointer to output buffer
+ * @outlen: Length of output buffer
+ * @wrkmem: ptr to buffer for working memory, size determined by
+ *          nx842_get_workmem_size()
+ *
+ * Returns:
+ *   0         Success, output of length @outlen stored in the buffer at @out
+ *   -ENOMEM   Unable to allocate internal buffers
+ *   -ENOSPC   Output buffer is to small
+ *   -EMSGSIZE XXX Difficult to describe this limitation
+ *   -EIO      Internal error
+ *   -ENODEV   Hardware unavailable
+ */
+int nx842_compress(const unsigned char *in, unsigned int inlen,
+                      unsigned char *out, unsigned int *outlen, void *wmem)
+{
+       struct nx842_header *hdr;
+       struct nx842_devdata *local_devdata;
+       struct device *dev = NULL;
+       struct nx842_workmem *workmem;
+       struct nx842_scatterlist slin, slout;
+       struct nx_csbcpb *csbcpb;
+       int ret = 0, max_sync_size, i, bytesleft, size, hdrsize;
+       unsigned long inbuf, outbuf, padding;
+       struct vio_pfo_op op = {
+               .done = NULL,
+               .handle = 0,
+               .timeout = 0,
+       };
+       unsigned long start_time = get_tb();
+
+       /*
+        * Make sure input buffer is 64k page aligned.  This is assumed since
+        * this driver is designed for page compression only (for now).  This
+        * is very nice since we can now use direct DDE(s) for the input and
+        * the alignment is guaranteed.
+       */
+       inbuf = (unsigned long)in;
+       if (!IS_ALIGNED(inbuf, PAGE_SIZE) || inlen != PAGE_SIZE)
+               return -EINVAL;
+
+       rcu_read_lock();
+       local_devdata = rcu_dereference(devdata);
+       if (!local_devdata || !local_devdata->dev) {
+               rcu_read_unlock();
+               return -ENODEV;
+       }
+       max_sync_size = local_devdata->max_sync_size;
+       dev = local_devdata->dev;
+
+       /* Create the header */
+       hdr = (struct nx842_header *)out;
+       hdr->blocks_nr = PAGE_SIZE / max_sync_size;
+       hdrsize = nx842_header_size(hdr);
+       outbuf = (unsigned long)out + hdrsize;
+       bytesleft = *outlen - hdrsize;
+
+       /* Init scatterlist */
+       workmem = (struct nx842_workmem *)ALIGN((unsigned long)wmem,
+               NX842_HW_PAGE_SIZE);
+       slin.entries = (struct nx842_slentry *)workmem->slin;
+       slout.entries = (struct nx842_slentry *)workmem->slout;
+
+       /* Init operation */
+       op.flags = NX842_OP_COMPRESS;
+       csbcpb = &workmem->csbcpb;
+       memset(csbcpb, 0, sizeof(*csbcpb));
+       op.csbcpb = __pa(csbcpb);
+       op.out = __pa(slout.entries);
+
+       for (i = 0; i < hdr->blocks_nr; i++) {
+               /*
+                * Aligning the output blocks to 128 bytes does waste space,
+                * but it prevents the need for bounce buffers and memory
+                * copies.  It also simplifies the code a lot.  In the worst
+                * case (64k page, 4k max_sync_size), you lose up to
+                * (128*16)/64k = ~3% the compression factor. For 64k
+                * max_sync_size, the loss would be at most 128/64k = ~0.2%.
+                */
+               padding = ALIGN(outbuf, IO_BUFFER_ALIGN) - outbuf;
+               outbuf += padding;
+               bytesleft -= padding;
+               if (i == 0)
+                       /* save offset into first block in header */
+                       hdr->offset = padding + hdrsize;
+
+               if (bytesleft <= 0) {
+                       ret = -ENOSPC;
+                       goto unlock;
+               }
+
+               /*
+                * NOTE: If the default max_sync_size is changed from 4k
+                * to 64k, remove the "likely" case below, since a
+                * scatterlist will always be needed.
+                */
+               if (likely(max_sync_size == NX842_HW_PAGE_SIZE)) {
+                       /* Create direct DDE */
+                       op.in = __pa(inbuf);
+                       op.inlen = max_sync_size;
+
+               } else {
+                       /* Create indirect DDE (scatterlist) */
+                       nx842_build_scatterlist(inbuf, max_sync_size, &slin);
+                       op.in = __pa(slin.entries);
+                       op.inlen = -nx842_get_scatterlist_size(&slin);
+               }
+
+               /*
+                * If max_sync_size != NX842_HW_PAGE_SIZE, an indirect
+                * DDE is required for the outbuf.
+                * If max_sync_size == NX842_HW_PAGE_SIZE, outbuf must
+                * also be page aligned (1 in 128/4k=32 chance) in order
+                * to use a direct DDE.
+                * This is unlikely, just use an indirect DDE always.
+                */
+               nx842_build_scatterlist(outbuf,
+                       min(bytesleft, max_sync_size), &slout);
+               /* op.out set before loop */
+               op.outlen = -nx842_get_scatterlist_size(&slout);
+
+               /* Send request to pHyp */
+               ret = vio_h_cop_sync(local_devdata->vdev, &op);
+
+               /* Check for pHyp error */
+               if (ret) {
+                       dev_dbg(dev, "%s: vio_h_cop_sync error (ret=%d, hret=%ld)\n",
+                               __func__, ret, op.hcall_err);
+                       ret = -EIO;
+                       goto unlock;
+               }
+
+               /* Check for hardware error */
+               ret = nx842_validate_result(dev, &csbcpb->csb);
+               if (ret && ret != -ENOSPC)
+                       goto unlock;
+
+               /* Handle incompressible data */
+               if (unlikely(ret == -ENOSPC)) {
+                       if (bytesleft < max_sync_size) {
+                               /*
+                                * Not enough space left in the output buffer
+                                * to store uncompressed block
+                                */
+                               goto unlock;
+                       } else {
+                               /* Store incompressible block */
+                               memcpy((void *)outbuf, (void *)inbuf,
+                                       max_sync_size);
+                               hdr->sizes[i] = -max_sync_size;
+                               outbuf += max_sync_size;
+                               bytesleft -= max_sync_size;
+                               /* Reset ret, incompressible data handled */
+                               ret = 0;
+                       }
+               } else {
+                       /* Normal case, compression was successful */
+                       size = csbcpb->csb.processed_byte_count;
+                       dev_dbg(dev, "%s: processed_bytes=%d\n",
+                               __func__, size);
+                       hdr->sizes[i] = size;
+                       outbuf += size;
+                       bytesleft -= size;
+               }
+
+               inbuf += max_sync_size;
+       }
+
+       *outlen = (unsigned int)(outbuf - (unsigned long)out);
+
+unlock:
+       if (ret)
+               nx842_inc_comp_failed(local_devdata);
+       else {
+               nx842_inc_comp_complete(local_devdata);
+               ibm_nx842_incr_hist(local_devdata->counters->comp_times,
+                       (get_tb() - start_time) / tb_ticks_per_usec);
+       }
+       rcu_read_unlock();
+       return ret;
+}
+EXPORT_SYMBOL_GPL(nx842_compress);
+
+static int sw842_decompress(const unsigned char *, int, unsigned char *, int *,
+                       const void *);
+
+/**
+ * nx842_decompress - Decompress data using the 842 algorithm
+ *
+ * Decompression provide by the NX842 coprocessor on IBM Power systems.
+ * The input buffer is decompressed and the result is stored in the
+ * provided output buffer.  The size allocated to the output buffer is
+ * provided by the caller of this function in @outlen.  Upon return from
+ * this function @outlen contains the length of the decompressed data.
+ * If there is an error then @outlen will be 0 and an error will be
+ * specified by the return code from this function.
+ *
+ * @in: Pointer to input buffer, will use bounce buffer if not 128 byte
+ *      aligned
+ * @inlen: Length of input buffer
+ * @out: Pointer to output buffer, must be page aligned
+ * @outlen: Length of output buffer, must be PAGE_SIZE
+ * @wrkmem: ptr to buffer for working memory, size determined by
+ *          nx842_get_workmem_size()
+ *
+ * Returns:
+ *   0         Success, output of length @outlen stored in the buffer at @out
+ *   -ENODEV   Hardware decompression device is unavailable
+ *   -ENOMEM   Unable to allocate internal buffers
+ *   -ENOSPC   Output buffer is to small
+ *   -EINVAL   Bad input data encountered when attempting decompress
+ *   -EIO      Internal error
+ */
+int nx842_decompress(const unsigned char *in, unsigned int inlen,
+                        unsigned char *out, unsigned int *outlen, void *wmem)
+{
+       struct nx842_header *hdr;
+       struct nx842_devdata *local_devdata;
+       struct device *dev = NULL;
+       struct nx842_workmem *workmem;
+       struct nx842_scatterlist slin, slout;
+       struct nx_csbcpb *csbcpb;
+       int ret = 0, i, size, max_sync_size;
+       unsigned long inbuf, outbuf;
+       struct vio_pfo_op op = {
+               .done = NULL,
+               .handle = 0,
+               .timeout = 0,
+       };
+       unsigned long start_time = get_tb();
+
+       /* Ensure page alignment and size */
+       outbuf = (unsigned long)out;
+       if (!IS_ALIGNED(outbuf, PAGE_SIZE) || *outlen != PAGE_SIZE)
+               return -EINVAL;
+
+       rcu_read_lock();
+       local_devdata = rcu_dereference(devdata);
+       if (local_devdata)
+               dev = local_devdata->dev;
+
+       /* Get header */
+       hdr = (struct nx842_header *)in;
+
+       workmem = (struct nx842_workmem *)ALIGN((unsigned long)wmem,
+               NX842_HW_PAGE_SIZE);
+
+       inbuf = (unsigned long)in + hdr->offset;
+       if (likely(!IS_ALIGNED(inbuf, IO_BUFFER_ALIGN))) {
+               /* Copy block(s) into bounce buffer for alignment */
+               memcpy(workmem->bounce, in + hdr->offset, inlen - hdr->offset);
+               inbuf = (unsigned long)workmem->bounce;
+       }
+
+       /* Init scatterlist */
+       slin.entries = (struct nx842_slentry *)workmem->slin;
+       slout.entries = (struct nx842_slentry *)workmem->slout;
+
+       /* Init operation */
+       op.flags = NX842_OP_DECOMPRESS;
+       csbcpb = &workmem->csbcpb;
+       memset(csbcpb, 0, sizeof(*csbcpb));
+       op.csbcpb = __pa(csbcpb);
+
+       /*
+        * max_sync_size may have changed since compression,
+        * so we can't read it from the device info. We need
+        * to derive it from hdr->blocks_nr.
+        */
+       max_sync_size = PAGE_SIZE / hdr->blocks_nr;
+
+       for (i = 0; i < hdr->blocks_nr; i++) {
+               /* Skip padding */
+               inbuf = ALIGN(inbuf, IO_BUFFER_ALIGN);
+
+               if (hdr->sizes[i] < 0) {
+                       /* Negative sizes indicate uncompressed data blocks */
+                       size = abs(hdr->sizes[i]);
+                       memcpy((void *)outbuf, (void *)inbuf, size);
+                       outbuf += size;
+                       inbuf += size;
+                       continue;
+               }
+
+               if (!dev)
+                       goto sw;
+
+               /*
+                * The better the compression, the more likely the "likely"
+                * case becomes.
+                */
+               if (likely((inbuf & NX842_HW_PAGE_MASK) ==
+                       ((inbuf + hdr->sizes[i] - 1) & NX842_HW_PAGE_MASK))) {
+                       /* Create direct DDE */
+                       op.in = __pa(inbuf);
+                       op.inlen = hdr->sizes[i];
+               } else {
+                       /* Create indirect DDE (scatterlist) */
+                       nx842_build_scatterlist(inbuf, hdr->sizes[i] , &slin);
+                       op.in = __pa(slin.entries);
+                       op.inlen = -nx842_get_scatterlist_size(&slin);
+               }
+
+               /*
+                * NOTE: If the default max_sync_size is changed from 4k
+                * to 64k, remove the "likely" case below, since a
+                * scatterlist will always be needed.
+                */
+               if (likely(max_sync_size == NX842_HW_PAGE_SIZE)) {
+                       /* Create direct DDE */
+                       op.out = __pa(outbuf);
+                       op.outlen = max_sync_size;
+               } else {
+                       /* Create indirect DDE (scatterlist) */
+                       nx842_build_scatterlist(outbuf, max_sync_size, &slout);
+                       op.out = __pa(slout.entries);
+                       op.outlen = -nx842_get_scatterlist_size(&slout);
+               }
+
+               /* Send request to pHyp */
+               ret = vio_h_cop_sync(local_devdata->vdev, &op);
+
+               /* Check for pHyp error */
+               if (ret) {
+                       dev_dbg(dev, "%s: vio_h_cop_sync error (ret=%d, hret=%ld)\n",
+                               __func__, ret, op.hcall_err);
+                       dev = NULL;
+                       goto sw;
+               }
+
+               /* Check for hardware error */
+               ret = nx842_validate_result(dev, &csbcpb->csb);
+               if (ret) {
+                       dev = NULL;
+                       goto sw;
+               }
+
+               /* HW decompression success */
+               inbuf += hdr->sizes[i];
+               outbuf += csbcpb->csb.processed_byte_count;
+               continue;
+
+sw:
+               /* software decompression */
+               size = max_sync_size;
+               ret = sw842_decompress(
+                       (unsigned char *)inbuf, hdr->sizes[i],
+                       (unsigned char *)outbuf, &size, wmem);
+               if (ret)
+                       pr_debug("%s: sw842_decompress failed with %d\n",
+                               __func__, ret);
+
+               if (ret) {
+                       if (ret != -ENOSPC && ret != -EINVAL &&
+                                       ret != -EMSGSIZE)
+                               ret = -EIO;
+                       goto unlock;
+               }
+
+               /* SW decompression success */
+               inbuf += hdr->sizes[i];
+               outbuf += size;
+       }
+
+       *outlen = (unsigned int)(outbuf - (unsigned long)out);
+
+unlock:
+       if (ret)
+               /* decompress fail */
+               nx842_inc_decomp_failed(local_devdata);
+       else {
+               if (!dev)
+                       /* software decompress */
+                       nx842_inc_swdecomp(local_devdata);
+               nx842_inc_decomp_complete(local_devdata);
+               ibm_nx842_incr_hist(local_devdata->counters->decomp_times,
+                       (get_tb() - start_time) / tb_ticks_per_usec);
+       }
+
+       rcu_read_unlock();
+       return ret;
+}
+EXPORT_SYMBOL_GPL(nx842_decompress);
+
+/**
+ * nx842_OF_set_defaults -- Set default (disabled) values for devdata
+ *
+ * @devdata - struct nx842_devdata to update
+ *
+ * Returns:
+ *  0 on success
+ *  -ENOENT if @devdata ptr is NULL
+ */
+static int nx842_OF_set_defaults(struct nx842_devdata *devdata)
+{
+       if (devdata) {
+               devdata->max_sync_size = 0;
+               devdata->max_sync_sg = 0;
+               devdata->max_sg_len = 0;
+               devdata->status = UNAVAILABLE;
+               return 0;
+       } else
+               return -ENOENT;
+}
+
+/**
+ * nx842_OF_upd_status -- Update the device info from OF status prop
+ *
+ * The status property indicates if the accelerator is enabled.  If the
+ * device is in the OF tree it indicates that the hardware is present.
+ * The status field indicates if the device is enabled when the status
+ * is 'okay'.  Otherwise the device driver will be disabled.
+ *
+ * @devdata - struct nx842_devdata to update
+ * @prop - struct property point containing the maxsyncop for the update
+ *
+ * Returns:
+ *  0 - Device is available
+ *  -EINVAL - Device is not available
+ */
+static int nx842_OF_upd_status(struct nx842_devdata *devdata,
+                                       struct property *prop) {
+       int ret = 0;
+       const char *status = (const char *)prop->value;
+
+       if (!strncmp(status, "okay", (size_t)prop->length)) {
+               devdata->status = AVAILABLE;
+       } else {
+               dev_info(devdata->dev, "%s: status '%s' is not 'okay'\n",
+                               __func__, status);
+               devdata->status = UNAVAILABLE;
+       }
+
+       return ret;
+}
+
+/**
+ * nx842_OF_upd_maxsglen -- Update the device info from OF maxsglen prop
+ *
+ * Definition of the 'ibm,max-sg-len' OF property:
+ *  This field indicates the maximum byte length of a scatter list
+ *  for the platform facility. It is a single cell encoded as with encode-int.
+ *
+ * Example:
+ *  # od -x ibm,max-sg-len
+ *  0000000 0000 0ff0
+ *
+ *  In this example, the maximum byte length of a scatter list is
+ *  0x0ff0 (4,080).
+ *
+ * @devdata - struct nx842_devdata to update
+ * @prop - struct property point containing the maxsyncop for the update
+ *
+ * Returns:
+ *  0 on success
+ *  -EINVAL on failure
+ */
+static int nx842_OF_upd_maxsglen(struct nx842_devdata *devdata,
+                                       struct property *prop) {
+       int ret = 0;
+       const int *maxsglen = prop->value;
+
+       if (prop->length != sizeof(*maxsglen)) {
+               dev_err(devdata->dev, "%s: unexpected format for ibm,max-sg-len property\n", __func__);
+               dev_dbg(devdata->dev, "%s: ibm,max-sg-len is %d bytes long, expected %lu bytes\n", __func__,
+                               prop->length, sizeof(*maxsglen));
+               ret = -EINVAL;
+       } else {
+               devdata->max_sg_len = (unsigned int)min(*maxsglen,
+                               (int)NX842_HW_PAGE_SIZE);
+       }
+
+       return ret;
+}
+
+/**
+ * nx842_OF_upd_maxsyncop -- Update the device info from OF maxsyncop prop
+ *
+ * Definition of the 'ibm,max-sync-cop' OF property:
+ *  Two series of cells.  The first series of cells represents the maximums
+ *  that can be synchronously compressed. The second series of cells
+ *  represents the maximums that can be synchronously decompressed.
+ *  1. The first cell in each series contains the count of the number of
+ *     data length, scatter list elements pairs that follow â€“ each being
+ *     of the form
+ *    a. One cell data byte length
+ *    b. One cell total number of scatter list elements
+ *
+ * Example:
+ *  # od -x ibm,max-sync-cop
+ *  0000000 0000 0001 0000 1000 0000 01fe 0000 0001
+ *  0000020 0000 1000 0000 01fe
+ *
+ *  In this example, compression supports 0x1000 (4,096) data byte length
+ *  and 0x1fe (510) total scatter list elements.  Decompression supports
+ *  0x1000 (4,096) data byte length and 0x1f3 (510) total scatter list
+ *  elements.
+ *
+ * @devdata - struct nx842_devdata to update
+ * @prop - struct property point containing the maxsyncop for the update
+ *
+ * Returns:
+ *  0 on success
+ *  -EINVAL on failure
+ */
+static int nx842_OF_upd_maxsyncop(struct nx842_devdata *devdata,
+                                       struct property *prop) {
+       int ret = 0;
+       const struct maxsynccop_t {
+               int comp_elements;
+               int comp_data_limit;
+               int comp_sg_limit;
+               int decomp_elements;
+               int decomp_data_limit;
+               int decomp_sg_limit;
+       } *maxsynccop;
+
+       if (prop->length != sizeof(*maxsynccop)) {
+               dev_err(devdata->dev, "%s: unexpected format for ibm,max-sync-cop property\n", __func__);
+               dev_dbg(devdata->dev, "%s: ibm,max-sync-cop is %d bytes long, expected %lu bytes\n", __func__, prop->length,
+                               sizeof(*maxsynccop));
+               ret = -EINVAL;
+               goto out;
+       }
+
+       maxsynccop = (const struct maxsynccop_t *)prop->value;
+
+       /* Use one limit rather than separate limits for compression and
+        * decompression. Set a maximum for this so as not to exceed the
+        * size that the header can support and round the value down to
+        * the hardware page size (4K) */
+       devdata->max_sync_size =
+                       (unsigned int)min(maxsynccop->comp_data_limit,
+                                       maxsynccop->decomp_data_limit);
+
+       devdata->max_sync_size = min_t(unsigned int, devdata->max_sync_size,
+                                       SIZE_64K);
+
+       if (devdata->max_sync_size < SIZE_4K) {
+               dev_err(devdata->dev, "%s: hardware max data size (%u) is "
+                               "less than the driver minimum, unable to use "
+                               "the hardware device\n",
+                               __func__, devdata->max_sync_size);
+               ret = -EINVAL;
+               goto out;
+       }
+
+       devdata->max_sync_sg = (unsigned int)min(maxsynccop->comp_sg_limit,
+                                               maxsynccop->decomp_sg_limit);
+       if (devdata->max_sync_sg < 1) {
+               dev_err(devdata->dev, "%s: hardware max sg size (%u) is "
+                               "less than the driver minimum, unable to use "
+                               "the hardware device\n",
+                               __func__, devdata->max_sync_sg);
+               ret = -EINVAL;
+               goto out;
+       }
+
+out:
+       return ret;
+}
+
+/**
+ *
+ * nx842_OF_upd -- Handle OF properties updates for the device.
+ *
+ * Set all properties from the OF tree.  Optionally, a new property
+ * can be provided by the @new_prop pointer to overwrite an existing value.
+ * The device will remain disabled until all values are valid, this function
+ * will return an error for updates unless all values are valid.
+ *
+ * @new_prop: If not NULL, this property is being updated.  If NULL, update
+ *  all properties from the current values in the OF tree.
+ *
+ * Returns:
+ *  0 - Success
+ *  -ENOMEM - Could not allocate memory for new devdata structure
+ *  -EINVAL - property value not found, new_prop is not a recognized
+ *     property for the device or property value is not valid.
+ *  -ENODEV - Device is not available
+ */
+static int nx842_OF_upd(struct property *new_prop)
+{
+       struct nx842_devdata *old_devdata = NULL;
+       struct nx842_devdata *new_devdata = NULL;
+       struct device_node *of_node = NULL;
+       struct property *status = NULL;
+       struct property *maxsglen = NULL;
+       struct property *maxsyncop = NULL;
+       int ret = 0;
+       unsigned long flags;
+
+       spin_lock_irqsave(&devdata_mutex, flags);
+       old_devdata = rcu_dereference_check(devdata,
+                       lockdep_is_held(&devdata_mutex));
+       if (old_devdata)
+               of_node = old_devdata->dev->of_node;
+
+       if (!old_devdata || !of_node) {
+               pr_err("%s: device is not available\n", __func__);
+               spin_unlock_irqrestore(&devdata_mutex, flags);
+               return -ENODEV;
+       }
+
+       new_devdata = kzalloc(sizeof(*new_devdata), GFP_NOFS);
+       if (!new_devdata) {
+               dev_err(old_devdata->dev, "%s: Could not allocate memory for device data\n", __func__);
+               ret = -ENOMEM;
+               goto error_out;
+       }
+
+       memcpy(new_devdata, old_devdata, sizeof(*old_devdata));
+       new_devdata->counters = old_devdata->counters;
+
+       /* Set ptrs for existing properties */
+       status = of_find_property(of_node, "status", NULL);
+       maxsglen = of_find_property(of_node, "ibm,max-sg-len", NULL);
+       maxsyncop = of_find_property(of_node, "ibm,max-sync-cop", NULL);
+       if (!status || !maxsglen || !maxsyncop) {
+               dev_err(old_devdata->dev, "%s: Could not locate device properties\n", __func__);
+               ret = -EINVAL;
+               goto error_out;
+       }
+
+       /* Set ptr to new property if provided */
+       if (new_prop) {
+               /* Single property */
+               if (!strncmp(new_prop->name, "status", new_prop->length)) {
+                       status = new_prop;
+
+               } else if (!strncmp(new_prop->name, "ibm,max-sg-len",
+                                       new_prop->length)) {
+                       maxsglen = new_prop;
+
+               } else if (!strncmp(new_prop->name, "ibm,max-sync-cop",
+                                       new_prop->length)) {
+                       maxsyncop = new_prop;
+
+               } else {
+                       /*
+                        * Skip the update, the property being updated
+                        * has no impact.
+                        */
+                       goto out;
+               }
+       }
+
+       /* Perform property updates */
+       ret = nx842_OF_upd_status(new_devdata, status);
+       if (ret)
+               goto error_out;
+
+       ret = nx842_OF_upd_maxsglen(new_devdata, maxsglen);
+       if (ret)
+               goto error_out;
+
+       ret = nx842_OF_upd_maxsyncop(new_devdata, maxsyncop);
+       if (ret)
+               goto error_out;
+
+out:
+       dev_info(old_devdata->dev, "%s: max_sync_size new:%u old:%u\n",
+                       __func__, new_devdata->max_sync_size,
+                       old_devdata->max_sync_size);
+       dev_info(old_devdata->dev, "%s: max_sync_sg new:%u old:%u\n",
+                       __func__, new_devdata->max_sync_sg,
+                       old_devdata->max_sync_sg);
+       dev_info(old_devdata->dev, "%s: max_sg_len new:%u old:%u\n",
+                       __func__, new_devdata->max_sg_len,
+                       old_devdata->max_sg_len);
+
+       rcu_assign_pointer(devdata, new_devdata);
+       spin_unlock_irqrestore(&devdata_mutex, flags);
+       synchronize_rcu();
+       dev_set_drvdata(new_devdata->dev, new_devdata);
+       kfree(old_devdata);
+       return 0;
+
+error_out:
+       if (new_devdata) {
+               dev_info(old_devdata->dev, "%s: device disabled\n", __func__);
+               nx842_OF_set_defaults(new_devdata);
+               rcu_assign_pointer(devdata, new_devdata);
+               spin_unlock_irqrestore(&devdata_mutex, flags);
+               synchronize_rcu();
+               dev_set_drvdata(new_devdata->dev, new_devdata);
+               kfree(old_devdata);
+       } else {
+               dev_err(old_devdata->dev, "%s: could not update driver from hardware\n", __func__);
+               spin_unlock_irqrestore(&devdata_mutex, flags);
+       }
+
+       if (!ret)
+               ret = -EINVAL;
+       return ret;
+}
+
+/**
+ * nx842_OF_notifier - Process updates to OF properties for the device
+ *
+ * @np: notifier block
+ * @action: notifier action
+ * @update: struct pSeries_reconfig_prop_update pointer if action is
+ *     PSERIES_UPDATE_PROPERTY
+ *
+ * Returns:
+ *     NOTIFY_OK on success
+ *     NOTIFY_BAD encoded with error number on failure, use
+ *             notifier_to_errno() to decode this value
+ */
+static int nx842_OF_notifier(struct notifier_block *np,
+                                       unsigned long action,
+                                       void *update)
+{
+       struct pSeries_reconfig_prop_update *upd;
+       struct nx842_devdata *local_devdata;
+       struct device_node *node = NULL;
+
+       upd = (struct pSeries_reconfig_prop_update *)update;
+
+       rcu_read_lock();
+       local_devdata = rcu_dereference(devdata);
+       if (local_devdata)
+               node = local_devdata->dev->of_node;
+
+       if (local_devdata &&
+                       action == PSERIES_UPDATE_PROPERTY &&
+                       !strcmp(upd->node->name, node->name)) {
+               rcu_read_unlock();
+               nx842_OF_upd(upd->property);
+       } else
+               rcu_read_unlock();
+
+       return NOTIFY_OK;
+}
+
+static struct notifier_block nx842_of_nb = {
+       .notifier_call = nx842_OF_notifier,
+};
+
+#define nx842_counter_read(_name)                                      \
+static ssize_t nx842_##_name##_show(struct device *dev,                \
+               struct device_attribute *attr,                          \
+               char *buf) {                                            \
+       struct nx842_devdata *local_devdata;                    \
+       int p = 0;                                                      \
+       rcu_read_lock();                                                \
+       local_devdata = rcu_dereference(devdata);                       \
+       if (local_devdata)                                              \
+               p = snprintf(buf, PAGE_SIZE, "%ld\n",                   \
+                      atomic64_read(&local_devdata->counters->_name)); \
+       rcu_read_unlock();                                              \
+       return p;                                                       \
+}
+
+#define NX842DEV_COUNTER_ATTR_RO(_name)                                        \
+       nx842_counter_read(_name);                                      \
+       static struct device_attribute dev_attr_##_name = __ATTR(_name, \
+                                               0444,                   \
+                                               nx842_##_name##_show,\
+                                               NULL);
+
+NX842DEV_COUNTER_ATTR_RO(comp_complete);
+NX842DEV_COUNTER_ATTR_RO(comp_failed);
+NX842DEV_COUNTER_ATTR_RO(decomp_complete);
+NX842DEV_COUNTER_ATTR_RO(decomp_failed);
+NX842DEV_COUNTER_ATTR_RO(swdecomp);
+
+static ssize_t nx842_timehist_show(struct device *,
+               struct device_attribute *, char *);
+
+static struct device_attribute dev_attr_comp_times = __ATTR(comp_times, 0444,
+               nx842_timehist_show, NULL);
+static struct device_attribute dev_attr_decomp_times = __ATTR(decomp_times,
+               0444, nx842_timehist_show, NULL);
+
+static ssize_t nx842_timehist_show(struct device *dev,
+               struct device_attribute *attr, char *buf) {
+       char *p = buf;
+       struct nx842_devdata *local_devdata;
+       atomic64_t *times;
+       int bytes_remain = PAGE_SIZE;
+       int bytes;
+       int i;
+
+       rcu_read_lock();
+       local_devdata = rcu_dereference(devdata);
+       if (!local_devdata) {
+               rcu_read_unlock();
+               return 0;
+       }
+
+       if (attr == &dev_attr_comp_times)
+               times = local_devdata->counters->comp_times;
+       else if (attr == &dev_attr_decomp_times)
+               times = local_devdata->counters->decomp_times;
+       else {
+               rcu_read_unlock();
+               return 0;
+       }
+
+       for (i = 0; i < (NX842_HIST_SLOTS - 2); i++) {
+               bytes = snprintf(p, bytes_remain, "%u-%uus:\t%ld\n",
+                              i ? (2<<(i-1)) : 0, (2<<i)-1,
+                              atomic64_read(&times[i]));
+               bytes_remain -= bytes;
+               p += bytes;
+       }
+       /* The last bucket holds everything over
+        * 2<<(NX842_HIST_SLOTS - 2) us */
+       bytes = snprintf(p, bytes_remain, "%uus - :\t%ld\n",
+                       2<<(NX842_HIST_SLOTS - 2),
+                       atomic64_read(&times[(NX842_HIST_SLOTS - 1)]));
+       p += bytes;
+
+       rcu_read_unlock();
+       return p - buf;
+}
+
+static struct attribute *nx842_sysfs_entries[] = {
+       &dev_attr_comp_complete.attr,
+       &dev_attr_comp_failed.attr,
+       &dev_attr_decomp_complete.attr,
+       &dev_attr_decomp_failed.attr,
+       &dev_attr_swdecomp.attr,
+       &dev_attr_comp_times.attr,
+       &dev_attr_decomp_times.attr,
+       NULL,
+};
+
+static struct attribute_group nx842_attribute_group = {
+       .name = NULL,           /* put in device directory */
+       .attrs = nx842_sysfs_entries,
+};
+
+static int __init nx842_probe(struct vio_dev *viodev,
+                                 const struct vio_device_id *id)
+{
+       struct nx842_devdata *old_devdata, *new_devdata = NULL;
+       unsigned long flags;
+       int ret = 0;
+
+       spin_lock_irqsave(&devdata_mutex, flags);
+       old_devdata = rcu_dereference_check(devdata,
+                       lockdep_is_held(&devdata_mutex));
+
+       if (old_devdata && old_devdata->vdev != NULL) {
+               dev_err(&viodev->dev, "%s: Attempt to register more than one instance of the hardware\n", __func__);
+               ret = -1;
+               goto error_unlock;
+       }
+
+       dev_set_drvdata(&viodev->dev, NULL);
+
+       new_devdata = kzalloc(sizeof(*new_devdata), GFP_NOFS);
+       if (!new_devdata) {
+               dev_err(&viodev->dev, "%s: Could not allocate memory for device data\n", __func__);
+               ret = -ENOMEM;
+               goto error_unlock;
+       }
+
+       new_devdata->counters = kzalloc(sizeof(*new_devdata->counters),
+                       GFP_NOFS);
+       if (!new_devdata->counters) {
+               dev_err(&viodev->dev, "%s: Could not allocate memory for performance counters\n", __func__);
+               ret = -ENOMEM;
+               goto error_unlock;
+       }
+
+       new_devdata->vdev = viodev;
+       new_devdata->dev = &viodev->dev;
+       nx842_OF_set_defaults(new_devdata);
+
+       rcu_assign_pointer(devdata, new_devdata);
+       spin_unlock_irqrestore(&devdata_mutex, flags);
+       synchronize_rcu();
+       kfree(old_devdata);
+
+       pSeries_reconfig_notifier_register(&nx842_of_nb);
+
+       ret = nx842_OF_upd(NULL);
+       if (ret && ret != -ENODEV) {
+               dev_err(&viodev->dev, "could not parse device tree. %d\n", ret);
+               ret = -1;
+               goto error;
+       }
+
+       rcu_read_lock();
+       if (dev_set_drvdata(&viodev->dev, rcu_dereference(devdata))) {
+               rcu_read_unlock();
+               dev_err(&viodev->dev, "failed to set driver data for device\n");
+               ret = -1;
+               goto error;
+       }
+       rcu_read_unlock();
+
+       if (sysfs_create_group(&viodev->dev.kobj, &nx842_attribute_group)) {
+               dev_err(&viodev->dev, "could not create sysfs device attributes\n");
+               ret = -1;
+               goto error;
+       }
+
+       return 0;
+
+error_unlock:
+       spin_unlock_irqrestore(&devdata_mutex, flags);
+       if (new_devdata)
+               kfree(new_devdata->counters);
+       kfree(new_devdata);
+error:
+       return ret;
+}
+
+static int __exit nx842_remove(struct vio_dev *viodev)
+{
+       struct nx842_devdata *old_devdata;
+       unsigned long flags;
+
+       pr_info("Removing IBM Power 842 compression device\n");
+       sysfs_remove_group(&viodev->dev.kobj, &nx842_attribute_group);
+
+       spin_lock_irqsave(&devdata_mutex, flags);
+       old_devdata = rcu_dereference_check(devdata,
+                       lockdep_is_held(&devdata_mutex));
+       pSeries_reconfig_notifier_unregister(&nx842_of_nb);
+       rcu_assign_pointer(devdata, NULL);
+       spin_unlock_irqrestore(&devdata_mutex, flags);
+       synchronize_rcu();
+       dev_set_drvdata(&viodev->dev, NULL);
+       if (old_devdata)
+               kfree(old_devdata->counters);
+       kfree(old_devdata);
+       return 0;
+}
+
+static struct vio_device_id nx842_driver_ids[] = {
+       {"ibm,compression-v1", "ibm,compression"},
+       {"", ""},
+};
+
+static struct vio_driver nx842_driver = {
+       .name = MODULE_NAME,
+       .probe = nx842_probe,
+       .remove = nx842_remove,
+       .get_desired_dma = nx842_get_desired_dma,
+       .id_table = nx842_driver_ids,
+};
+
+static int __init nx842_init(void)
+{
+       struct nx842_devdata *new_devdata;
+       pr_info("Registering IBM Power 842 compression driver\n");
+
+       RCU_INIT_POINTER(devdata, NULL);
+       new_devdata = kzalloc(sizeof(*new_devdata), GFP_KERNEL);
+       if (!new_devdata) {
+               pr_err("Could not allocate memory for device data\n");
+               return -ENOMEM;
+       }
+       new_devdata->status = UNAVAILABLE;
+       RCU_INIT_POINTER(devdata, new_devdata);
+
+       return vio_register_driver(&nx842_driver);
+}
+
+module_init(nx842_init);
+
+static void __exit nx842_exit(void)
+{
+       struct nx842_devdata *old_devdata;
+       unsigned long flags;
+
+       pr_info("Exiting IBM Power 842 compression driver\n");
+       spin_lock_irqsave(&devdata_mutex, flags);
+       old_devdata = rcu_dereference_check(devdata,
+                       lockdep_is_held(&devdata_mutex));
+       rcu_assign_pointer(devdata, NULL);
+       spin_unlock_irqrestore(&devdata_mutex, flags);
+       synchronize_rcu();
+       if (old_devdata)
+               dev_set_drvdata(old_devdata->dev, NULL);
+       kfree(old_devdata);
+       vio_unregister_driver(&nx842_driver);
+}
+
+module_exit(nx842_exit);
+
+/*********************************
+ * 842 software decompressor
+*********************************/
+typedef int (*sw842_template_op)(const char **, int *, unsigned char **,
+                                               struct sw842_fifo *);
+
+static int sw842_data8(const char **, int *, unsigned char **,
+                                               struct sw842_fifo *);
+static int sw842_data4(const char **, int *, unsigned char **,
+                                               struct sw842_fifo *);
+static int sw842_data2(const char **, int *, unsigned char **,
+                                               struct sw842_fifo *);
+static int sw842_ptr8(const char **, int *, unsigned char **,
+                                               struct sw842_fifo *);
+static int sw842_ptr4(const char **, int *, unsigned char **,
+                                               struct sw842_fifo *);
+static int sw842_ptr2(const char **, int *, unsigned char **,
+                                               struct sw842_fifo *);
+
+/* special templates */
+#define SW842_TMPL_REPEAT 0x1B
+#define SW842_TMPL_ZEROS 0x1C
+#define SW842_TMPL_EOF 0x1E
+
+static sw842_template_op sw842_tmpl_ops[26][4] = {
+       { sw842_data8, NULL}, /* 0 (00000) */
+       { sw842_data4, sw842_data2, sw842_ptr2,  NULL},
+       { sw842_data4, sw842_ptr2,  sw842_data2, NULL},
+       { sw842_data4, sw842_ptr2,  sw842_ptr2,  NULL},
+       { sw842_data4, sw842_ptr4,  NULL},
+       { sw842_data2, sw842_ptr2,  sw842_data4, NULL},
+       { sw842_data2, sw842_ptr2,  sw842_data2, sw842_ptr2},
+       { sw842_data2, sw842_ptr2,  sw842_ptr2,  sw842_data2},
+       { sw842_data2, sw842_ptr2,  sw842_ptr2,  sw842_ptr2,},
+       { sw842_data2, sw842_ptr2,  sw842_ptr4,  NULL},
+       { sw842_ptr2,  sw842_data2, sw842_data4, NULL}, /* 10 (01010) */
+       { sw842_ptr2,  sw842_data4, sw842_ptr2,  NULL},
+       { sw842_ptr2,  sw842_data2, sw842_ptr2,  sw842_data2},
+       { sw842_ptr2,  sw842_data2, sw842_ptr2,  sw842_ptr2},
+       { sw842_ptr2,  sw842_data2, sw842_ptr4,  NULL},
+       { sw842_ptr2,  sw842_ptr2,  sw842_data4, NULL},
+       { sw842_ptr2,  sw842_ptr2,  sw842_data2, sw842_ptr2},
+       { sw842_ptr2,  sw842_ptr2,  sw842_ptr2,  sw842_data2},
+       { sw842_ptr2,  sw842_ptr2,  sw842_ptr2,  sw842_ptr2},
+       { sw842_ptr2,  sw842_ptr2,  sw842_ptr4,  NULL},
+       { sw842_ptr4,  sw842_data4, NULL}, /* 20 (10100) */
+       { sw842_ptr4,  sw842_data2, sw842_ptr2,  NULL},
+       { sw842_ptr4,  sw842_ptr2,  sw842_data2, NULL},
+       { sw842_ptr4,  sw842_ptr2,  sw842_ptr2,  NULL},
+       { sw842_ptr4,  sw842_ptr4,  NULL},
+       { sw842_ptr8,  NULL}
+};
+
+/* Software decompress helpers */
+
+static uint8_t sw842_get_byte(const char *buf, int bit)
+{
+       uint8_t tmpl;
+       uint16_t tmp;
+       tmp = htons(*(uint16_t *)(buf));
+       tmp = (uint16_t)(tmp << bit);
+       tmp = ntohs(tmp);
+       memcpy(&tmpl, &tmp, 1);
+       return tmpl;
+}
+
+static uint8_t sw842_get_template(const char **buf, int *bit)
+{
+       uint8_t byte;
+       byte = sw842_get_byte(*buf, *bit);
+       byte = byte >> 3;
+       byte &= 0x1F;
+       *buf += (*bit + 5) / 8;
+       *bit = (*bit + 5) % 8;
+       return byte;
+}
+
+/* repeat_count happens to be 5-bit too (like the template) */
+static uint8_t sw842_get_repeat_count(const char **buf, int *bit)
+{
+       uint8_t byte;
+       byte = sw842_get_byte(*buf, *bit);
+       byte = byte >> 2;
+       byte &= 0x3F;
+       *buf += (*bit + 6) / 8;
+       *bit = (*bit + 6) % 8;
+       return byte;
+}
+
+static uint8_t sw842_get_ptr2(const char **buf, int *bit)
+{
+       uint8_t ptr;
+       ptr = sw842_get_byte(*buf, *bit);
+       (*buf)++;
+       return ptr;
+}
+
+static uint16_t sw842_get_ptr4(const char **buf, int *bit,
+               struct sw842_fifo *fifo)
+{
+       uint16_t ptr;
+       ptr = htons(*(uint16_t *)(*buf));
+       ptr = (uint16_t)(ptr << *bit);
+       ptr = ptr >> 7;
+       ptr &= 0x01FF;
+       *buf += (*bit + 9) / 8;
+       *bit = (*bit + 9) % 8;
+       return ptr;
+}
+
+static uint8_t sw842_get_ptr8(const char **buf, int *bit,
+               struct sw842_fifo *fifo)
+{
+       return sw842_get_ptr2(buf, bit);
+}
+
+/* Software decompress template ops */
+
+static int sw842_data8(const char **inbuf, int *inbit,
+               unsigned char **outbuf, struct sw842_fifo *fifo)
+{
+       int ret;
+
+       ret = sw842_data4(inbuf, inbit, outbuf, fifo);
+       if (ret)
+               return ret;
+       ret = sw842_data4(inbuf, inbit, outbuf, fifo);
+       return ret;
+}
+
+static int sw842_data4(const char **inbuf, int *inbit,
+               unsigned char **outbuf, struct sw842_fifo *fifo)
+{
+       int ret;
+
+       ret = sw842_data2(inbuf, inbit, outbuf, fifo);
+       if (ret)
+               return ret;
+       ret = sw842_data2(inbuf, inbit, outbuf, fifo);
+       return ret;
+}
+
+static int sw842_data2(const char **inbuf, int *inbit,
+               unsigned char **outbuf, struct sw842_fifo *fifo)
+{
+       **outbuf = sw842_get_byte(*inbuf, *inbit);
+       (*inbuf)++;
+       (*outbuf)++;
+       **outbuf = sw842_get_byte(*inbuf, *inbit);
+       (*inbuf)++;
+       (*outbuf)++;
+       return 0;
+}
+
+static int sw842_ptr8(const char **inbuf, int *inbit,
+               unsigned char **outbuf, struct sw842_fifo *fifo)
+{
+       uint8_t ptr;
+       ptr = sw842_get_ptr8(inbuf, inbit, fifo);
+       if (!fifo->f84_full && (ptr >= fifo->f8_count))
+               return 1;
+       memcpy(*outbuf, fifo->f8[ptr], 8);
+       *outbuf += 8;
+       return 0;
+}
+
+static int sw842_ptr4(const char **inbuf, int *inbit,
+               unsigned char **outbuf, struct sw842_fifo *fifo)
+{
+       uint16_t ptr;
+       ptr = sw842_get_ptr4(inbuf, inbit, fifo);
+       if (!fifo->f84_full && (ptr >= fifo->f4_count))
+               return 1;
+       memcpy(*outbuf, fifo->f4[ptr], 4);
+       *outbuf += 4;
+       return 0;
+}
+
+static int sw842_ptr2(const char **inbuf, int *inbit,
+               unsigned char **outbuf, struct sw842_fifo *fifo)
+{
+       uint8_t ptr;
+       ptr = sw842_get_ptr2(inbuf, inbit);
+       if (!fifo->f2_full && (ptr >= fifo->f2_count))
+               return 1;
+       memcpy(*outbuf, fifo->f2[ptr], 2);
+       *outbuf += 2;
+       return 0;
+}
+
+static void sw842_copy_to_fifo(const char *buf, struct sw842_fifo *fifo)
+{
+       unsigned char initial_f2count = fifo->f2_count;
+
+       memcpy(fifo->f8[fifo->f8_count], buf, 8);
+       fifo->f4_count += 2;
+       fifo->f8_count += 1;
+
+       if (!fifo->f84_full && fifo->f4_count >= 512) {
+               fifo->f84_full = 1;
+               fifo->f4_count /= 512;
+       }
+
+       memcpy(fifo->f2[fifo->f2_count++], buf, 2);
+       memcpy(fifo->f2[fifo->f2_count++], buf + 2, 2);
+       memcpy(fifo->f2[fifo->f2_count++], buf + 4, 2);
+       memcpy(fifo->f2[fifo->f2_count++], buf + 6, 2);
+       if (fifo->f2_count < initial_f2count)
+               fifo->f2_full = 1;
+}
+
+static int sw842_decompress(const unsigned char *src, int srclen,
+                       unsigned char *dst, int *destlen,
+                       const void *wrkmem)
+{
+       uint8_t tmpl;
+       const char *inbuf;
+       int inbit = 0;
+       unsigned char *outbuf, *outbuf_end, *origbuf, *prevbuf;
+       const char *inbuf_end;
+       sw842_template_op op;
+       int opindex;
+       int i, repeat_count;
+       struct sw842_fifo *fifo;
+       int ret = 0;
+
+       fifo = &((struct nx842_workmem *)(wrkmem))->swfifo;
+       memset(fifo, 0, sizeof(*fifo));
+
+       origbuf = NULL;
+       inbuf = src;
+       inbuf_end = src + srclen;
+       outbuf = dst;
+       outbuf_end = dst + *destlen;
+
+       while ((tmpl = sw842_get_template(&inbuf, &inbit)) != SW842_TMPL_EOF) {
+               if (inbuf >= inbuf_end) {
+                       ret = -EINVAL;
+                       goto out;
+               }
+
+               opindex = 0;
+               prevbuf = origbuf;
+               origbuf = outbuf;
+               switch (tmpl) {
+               case SW842_TMPL_REPEAT:
+                       if (prevbuf == NULL) {
+                               ret = -EINVAL;
+                               goto out;
+                       }
+
+                       repeat_count = sw842_get_repeat_count(&inbuf,
+                                                               &inbit) + 1;
+
+                       /* Did the repeat count advance past the end of input */
+                       if (inbuf > inbuf_end) {
+                               ret = -EINVAL;
+                               goto out;
+                       }
+
+                       for (i = 0; i < repeat_count; i++) {
+                               /* Would this overflow the output buffer */
+                               if ((outbuf + 8) > outbuf_end) {
+                                       ret = -ENOSPC;
+                                       goto out;
+                               }
+
+                               memcpy(outbuf, prevbuf, 8);
+                               sw842_copy_to_fifo(outbuf, fifo);
+                               outbuf += 8;
+                       }
+                       break;
+
+               case SW842_TMPL_ZEROS:
+                       /* Would this overflow the output buffer */
+                       if ((outbuf + 8) > outbuf_end) {
+                               ret = -ENOSPC;
+                               goto out;
+                       }
+
+                       memset(outbuf, 0, 8);
+                       sw842_copy_to_fifo(outbuf, fifo);
+                       outbuf += 8;
+                       break;
+
+               default:
+                       if (tmpl > 25) {
+                               ret = -EINVAL;
+                               goto out;
+                       }
+
+                       /* Does this go past the end of the input buffer */
+                       if ((inbuf + 2) > inbuf_end) {
+                               ret = -EINVAL;
+                               goto out;
+                       }
+
+                       /* Would this overflow the output buffer */
+                       if ((outbuf + 8) > outbuf_end) {
+                               ret = -ENOSPC;
+                               goto out;
+                       }
+
+                       while (opindex < 4 &&
+                               (op = sw842_tmpl_ops[tmpl][opindex++])
+                                       != NULL) {
+                               ret = (*op)(&inbuf, &inbit, &outbuf, fifo);
+                               if (ret) {
+                                       ret = -EINVAL;
+                                       goto out;
+                               }
+                               sw842_copy_to_fifo(origbuf, fifo);
+                       }
+               }
+       }
+
+out:
+       if (!ret)
+               *destlen = (unsigned int)(outbuf - dst);
+       else
+               *destlen = 0;
+
+       return ret;
+}
index 69ed796..a76d4c4 100644 (file)
@@ -127,7 +127,6 @@ struct crypto_alg nx_cbc_aes_alg = {
        .cra_ctxsize     = sizeof(struct nx_crypto_ctx),
        .cra_type        = &crypto_blkcipher_type,
        .cra_module      = THIS_MODULE,
-       .cra_list        = LIST_HEAD_INIT(nx_cbc_aes_alg.cra_list),
        .cra_init        = nx_crypto_ctx_aes_cbc_init,
        .cra_exit        = nx_crypto_ctx_exit,
        .cra_blkcipher = {
index 7aeac67..ef5eae6 100644 (file)
@@ -430,7 +430,6 @@ struct crypto_alg nx_ccm_aes_alg = {
        .cra_ctxsize     = sizeof(struct nx_crypto_ctx),
        .cra_type        = &crypto_aead_type,
        .cra_module      = THIS_MODULE,
-       .cra_list        = LIST_HEAD_INIT(nx_ccm_aes_alg.cra_list),
        .cra_init        = nx_crypto_ctx_aes_ccm_init,
        .cra_exit        = nx_crypto_ctx_exit,
        .cra_aead = {
@@ -453,7 +452,6 @@ struct crypto_alg nx_ccm4309_aes_alg = {
        .cra_ctxsize     = sizeof(struct nx_crypto_ctx),
        .cra_type        = &crypto_nivaead_type,
        .cra_module      = THIS_MODULE,
-       .cra_list        = LIST_HEAD_INIT(nx_ccm4309_aes_alg.cra_list),
        .cra_init        = nx_crypto_ctx_aes_ccm_init,
        .cra_exit        = nx_crypto_ctx_exit,
        .cra_aead = {
index 52d4eb0..b6286f1 100644 (file)
@@ -141,7 +141,6 @@ struct crypto_alg nx_ctr_aes_alg = {
        .cra_ctxsize     = sizeof(struct nx_crypto_ctx),
        .cra_type        = &crypto_blkcipher_type,
        .cra_module      = THIS_MODULE,
-       .cra_list        = LIST_HEAD_INIT(nx_ctr_aes_alg.cra_list),
        .cra_init        = nx_crypto_ctx_aes_ctr_init,
        .cra_exit        = nx_crypto_ctx_exit,
        .cra_blkcipher = {
@@ -163,7 +162,6 @@ struct crypto_alg nx_ctr3686_aes_alg = {
        .cra_ctxsize     = sizeof(struct nx_crypto_ctx),
        .cra_type        = &crypto_blkcipher_type,
        .cra_module      = THIS_MODULE,
-       .cra_list        = LIST_HEAD_INIT(nx_ctr3686_aes_alg.cra_list),
        .cra_init        = nx_crypto_ctx_aes_ctr_init,
        .cra_exit        = nx_crypto_ctx_exit,
        .cra_blkcipher = {
index 7b77bc2..ba5f161 100644 (file)
@@ -126,7 +126,6 @@ struct crypto_alg nx_ecb_aes_alg = {
        .cra_ctxsize     = sizeof(struct nx_crypto_ctx),
        .cra_type        = &crypto_blkcipher_type,
        .cra_module      = THIS_MODULE,
-       .cra_list        = LIST_HEAD_INIT(nx_ecb_aes_alg.cra_list),
        .cra_init        = nx_crypto_ctx_aes_ecb_init,
        .cra_exit        = nx_crypto_ctx_exit,
        .cra_blkcipher = {
index 9ab1c73..c8109ed 100644 (file)
@@ -316,7 +316,6 @@ struct crypto_alg nx_gcm_aes_alg = {
        .cra_ctxsize     = sizeof(struct nx_crypto_ctx),
        .cra_type        = &crypto_aead_type,
        .cra_module      = THIS_MODULE,
-       .cra_list        = LIST_HEAD_INIT(nx_gcm_aes_alg.cra_list),
        .cra_init        = nx_crypto_ctx_aes_gcm_init,
        .cra_exit        = nx_crypto_ctx_exit,
        .cra_aead = {
@@ -338,7 +337,6 @@ struct crypto_alg nx_gcm4106_aes_alg = {
        .cra_ctxsize     = sizeof(struct nx_crypto_ctx),
        .cra_type        = &crypto_nivaead_type,
        .cra_module      = THIS_MODULE,
-       .cra_list        = LIST_HEAD_INIT(nx_gcm4106_aes_alg.cra_list),
        .cra_init        = nx_crypto_ctx_aes_gcm_init,
        .cra_exit        = nx_crypto_ctx_exit,
        .cra_aead = {
index 63e57b5..093a8af 100644 (file)
@@ -876,7 +876,6 @@ static int omap_aes_probe(struct platform_device *pdev)
 
        for (i = 0; i < ARRAY_SIZE(algs); i++) {
                pr_debug("i: %d\n", i);
-               INIT_LIST_HEAD(&algs[i].cra_list);
                err = crypto_register_alg(&algs[i]);
                if (err)
                        goto err_algs;
index 37b2e94..633ba94 100644 (file)
@@ -328,7 +328,6 @@ static struct crypto_alg aes_alg = {
        .cra_ctxsize            =       sizeof(struct aes_ctx),
        .cra_alignmask          =       PADLOCK_ALIGNMENT - 1,
        .cra_module             =       THIS_MODULE,
-       .cra_list               =       LIST_HEAD_INIT(aes_alg.cra_list),
        .cra_u                  =       {
                .cipher = {
                        .cia_min_keysize        =       AES_MIN_KEY_SIZE,
@@ -408,7 +407,6 @@ static struct crypto_alg ecb_aes_alg = {
        .cra_alignmask          =       PADLOCK_ALIGNMENT - 1,
        .cra_type               =       &crypto_blkcipher_type,
        .cra_module             =       THIS_MODULE,
-       .cra_list               =       LIST_HEAD_INIT(ecb_aes_alg.cra_list),
        .cra_u                  =       {
                .blkcipher = {
                        .min_keysize            =       AES_MIN_KEY_SIZE,
@@ -491,7 +489,6 @@ static struct crypto_alg cbc_aes_alg = {
        .cra_alignmask          =       PADLOCK_ALIGNMENT - 1,
        .cra_type               =       &crypto_blkcipher_type,
        .cra_module             =       THIS_MODULE,
-       .cra_list               =       LIST_HEAD_INIT(cbc_aes_alg.cra_list),
        .cra_u                  =       {
                .blkcipher = {
                        .min_keysize            =       AES_MIN_KEY_SIZE,
index bc986f8..a227144 100644 (file)
@@ -626,7 +626,6 @@ static int s5p_aes_probe(struct platform_device *pdev)
        crypto_init_queue(&pdata->queue, CRYPTO_QUEUE_LEN);
 
        for (i = 0; i < ARRAY_SIZE(algs); i++) {
-               INIT_LIST_HEAD(&algs[i].cra_list);
                err = crypto_register_alg(&algs[i]);
                if (err)
                        goto err_algs;
index efff788..da11127 100644 (file)
@@ -38,6 +38,7 @@
 #include <linux/spinlock.h>
 #include <linux/rtnetlink.h>
 #include <linux/slab.h>
+#include <linux/string.h>
 
 #include <crypto/algapi.h>
 #include <crypto/aes.h>
@@ -714,8 +715,13 @@ badkey:
 
 /*
  * talitos_edesc - s/w-extended descriptor
+ * @assoc_nents: number of segments in associated data scatterlist
  * @src_nents: number of segments in input scatterlist
  * @dst_nents: number of segments in output scatterlist
+ * @assoc_chained: whether assoc is chained or not
+ * @src_chained: whether src is chained or not
+ * @dst_chained: whether dst is chained or not
+ * @iv_dma: dma address of iv for checking continuity and link table
  * @dma_len: length of dma mapped link_tbl space
  * @dma_link_tbl: bus physical address of link_tbl
  * @desc: h/w descriptor
@@ -726,10 +732,13 @@ badkey:
  * of link_tbl data
  */
 struct talitos_edesc {
+       int assoc_nents;
        int src_nents;
        int dst_nents;
-       int src_is_chained;
-       int dst_is_chained;
+       bool assoc_chained;
+       bool src_chained;
+       bool dst_chained;
+       dma_addr_t iv_dma;
        int dma_len;
        dma_addr_t dma_link_tbl;
        struct talitos_desc desc;
@@ -738,7 +747,7 @@ struct talitos_edesc {
 
 static int talitos_map_sg(struct device *dev, struct scatterlist *sg,
                          unsigned int nents, enum dma_data_direction dir,
-                         int chained)
+                         bool chained)
 {
        if (unlikely(chained))
                while (sg) {
@@ -768,13 +777,13 @@ static void talitos_sg_unmap(struct device *dev,
        unsigned int dst_nents = edesc->dst_nents ? : 1;
 
        if (src != dst) {
-               if (edesc->src_is_chained)
+               if (edesc->src_chained)
                        talitos_unmap_sg_chain(dev, src, DMA_TO_DEVICE);
                else
                        dma_unmap_sg(dev, src, src_nents, DMA_TO_DEVICE);
 
                if (dst) {
-                       if (edesc->dst_is_chained)
+                       if (edesc->dst_chained)
                                talitos_unmap_sg_chain(dev, dst,
                                                       DMA_FROM_DEVICE);
                        else
@@ -782,7 +791,7 @@ static void talitos_sg_unmap(struct device *dev,
                                             DMA_FROM_DEVICE);
                }
        } else
-               if (edesc->src_is_chained)
+               if (edesc->src_chained)
                        talitos_unmap_sg_chain(dev, src, DMA_BIDIRECTIONAL);
                else
                        dma_unmap_sg(dev, src, src_nents, DMA_BIDIRECTIONAL);
@@ -797,7 +806,13 @@ static void ipsec_esp_unmap(struct device *dev,
        unmap_single_talitos_ptr(dev, &edesc->desc.ptr[2], DMA_TO_DEVICE);
        unmap_single_talitos_ptr(dev, &edesc->desc.ptr[0], DMA_TO_DEVICE);
 
-       dma_unmap_sg(dev, areq->assoc, 1, DMA_TO_DEVICE);
+       if (edesc->assoc_chained)
+               talitos_unmap_sg_chain(dev, areq->assoc, DMA_TO_DEVICE);
+       else
+               /* assoc_nents counts also for IV in non-contiguous cases */
+               dma_unmap_sg(dev, areq->assoc,
+                            edesc->assoc_nents ? edesc->assoc_nents - 1 : 1,
+                            DMA_TO_DEVICE);
 
        talitos_sg_unmap(dev, edesc, areq->src, areq->dst);
 
@@ -825,9 +840,10 @@ static void ipsec_esp_encrypt_done(struct device *dev,
        ipsec_esp_unmap(dev, edesc, areq);
 
        /* copy the generated ICV to dst */
-       if (edesc->dma_len) {
+       if (edesc->dst_nents) {
                icvdata = &edesc->link_tbl[edesc->src_nents +
-                                          edesc->dst_nents + 2];
+                                          edesc->dst_nents + 2 +
+                                          edesc->assoc_nents];
                sg = sg_last(areq->dst, edesc->dst_nents);
                memcpy((char *)sg_virt(sg) + sg->length - ctx->authsize,
                       icvdata, ctx->authsize);
@@ -857,7 +873,8 @@ static void ipsec_esp_decrypt_swauth_done(struct device *dev,
                /* auth check */
                if (edesc->dma_len)
                        icvdata = &edesc->link_tbl[edesc->src_nents +
-                                                  edesc->dst_nents + 2];
+                                                  edesc->dst_nents + 2 +
+                                                  edesc->assoc_nents];
                else
                        icvdata = &edesc->link_tbl[0];
 
@@ -932,10 +949,9 @@ static int sg_to_link_tbl(struct scatterlist *sg, int sg_count,
  * fill in and submit ipsec_esp descriptor
  */
 static int ipsec_esp(struct talitos_edesc *edesc, struct aead_request *areq,
-                    u8 *giv, u64 seq,
-                    void (*callback) (struct device *dev,
-                                      struct talitos_desc *desc,
-                                      void *context, int error))
+                    u64 seq, void (*callback) (struct device *dev,
+                                               struct talitos_desc *desc,
+                                               void *context, int error))
 {
        struct crypto_aead *aead = crypto_aead_reqtfm(areq);
        struct talitos_ctx *ctx = crypto_aead_ctx(aead);
@@ -950,12 +966,42 @@ static int ipsec_esp(struct talitos_edesc *edesc, struct aead_request *areq,
        /* hmac key */
        map_single_talitos_ptr(dev, &desc->ptr[0], ctx->authkeylen, &ctx->key,
                               0, DMA_TO_DEVICE);
+
        /* hmac data */
-       map_single_talitos_ptr(dev, &desc->ptr[1], areq->assoclen + ivsize,
-                              sg_virt(areq->assoc), 0, DMA_TO_DEVICE);
+       desc->ptr[1].len = cpu_to_be16(areq->assoclen + ivsize);
+       if (edesc->assoc_nents) {
+               int tbl_off = edesc->src_nents + edesc->dst_nents + 2;
+               struct talitos_ptr *tbl_ptr = &edesc->link_tbl[tbl_off];
+
+               to_talitos_ptr(&desc->ptr[1], edesc->dma_link_tbl + tbl_off *
+                              sizeof(struct talitos_ptr));
+               desc->ptr[1].j_extent = DESC_PTR_LNKTBL_JUMP;
+
+               /* assoc_nents - 1 entries for assoc, 1 for IV */
+               sg_count = sg_to_link_tbl(areq->assoc, edesc->assoc_nents - 1,
+                                         areq->assoclen, tbl_ptr);
+
+               /* add IV to link table */
+               tbl_ptr += sg_count - 1;
+               tbl_ptr->j_extent = 0;
+               tbl_ptr++;
+               to_talitos_ptr(tbl_ptr, edesc->iv_dma);
+               tbl_ptr->len = cpu_to_be16(ivsize);
+               tbl_ptr->j_extent = DESC_PTR_LNKTBL_RETURN;
+
+               dma_sync_single_for_device(dev, edesc->dma_link_tbl,
+                                          edesc->dma_len, DMA_BIDIRECTIONAL);
+       } else {
+               to_talitos_ptr(&desc->ptr[1], sg_dma_address(areq->assoc));
+               desc->ptr[1].j_extent = 0;
+       }
+
        /* cipher iv */
-       map_single_talitos_ptr(dev, &desc->ptr[2], ivsize, giv ?: areq->iv, 0,
-                              DMA_TO_DEVICE);
+       to_talitos_ptr(&desc->ptr[2], edesc->iv_dma);
+       desc->ptr[2].len = cpu_to_be16(ivsize);
+       desc->ptr[2].j_extent = 0;
+       /* Sync needed for the aead_givencrypt case */
+       dma_sync_single_for_device(dev, edesc->iv_dma, ivsize, DMA_TO_DEVICE);
 
        /* cipher key */
        map_single_talitos_ptr(dev, &desc->ptr[3], ctx->enckeylen,
@@ -974,7 +1020,7 @@ static int ipsec_esp(struct talitos_edesc *edesc, struct aead_request *areq,
        sg_count = talitos_map_sg(dev, areq->src, edesc->src_nents ? : 1,
                                  (areq->src == areq->dst) ? DMA_BIDIRECTIONAL
                                                           : DMA_TO_DEVICE,
-                                 edesc->src_is_chained);
+                                 edesc->src_chained);
 
        if (sg_count == 1) {
                to_talitos_ptr(&desc->ptr[4], sg_dma_address(areq->src));
@@ -1006,32 +1052,30 @@ static int ipsec_esp(struct talitos_edesc *edesc, struct aead_request *areq,
        if (areq->src != areq->dst)
                sg_count = talitos_map_sg(dev, areq->dst,
                                          edesc->dst_nents ? : 1,
-                                         DMA_FROM_DEVICE,
-                                         edesc->dst_is_chained);
+                                         DMA_FROM_DEVICE, edesc->dst_chained);
 
        if (sg_count == 1) {
                to_talitos_ptr(&desc->ptr[5], sg_dma_address(areq->dst));
        } else {
-               struct talitos_ptr *link_tbl_ptr =
-                       &edesc->link_tbl[edesc->src_nents + 1];
+               int tbl_off = edesc->src_nents + 1;
+               struct talitos_ptr *tbl_ptr = &edesc->link_tbl[tbl_off];
 
                to_talitos_ptr(&desc->ptr[5], edesc->dma_link_tbl +
-                              (edesc->src_nents + 1) *
-                              sizeof(struct talitos_ptr));
+                              tbl_off * sizeof(struct talitos_ptr));
                sg_count = sg_to_link_tbl(areq->dst, sg_count, cryptlen,
-                                         link_tbl_ptr);
+                                         tbl_ptr);
 
                /* Add an entry to the link table for ICV data */
-               link_tbl_ptr += sg_count - 1;
-               link_tbl_ptr->j_extent = 0;
-               sg_count++;
-               link_tbl_ptr++;
-               link_tbl_ptr->j_extent = DESC_PTR_LNKTBL_RETURN;
-               link_tbl_ptr->len = cpu_to_be16(authsize);
+               tbl_ptr += sg_count - 1;
+               tbl_ptr->j_extent = 0;
+               tbl_ptr++;
+               tbl_ptr->j_extent = DESC_PTR_LNKTBL_RETURN;
+               tbl_ptr->len = cpu_to_be16(authsize);
 
                /* icv data follows link tables */
-               to_talitos_ptr(link_tbl_ptr, edesc->dma_link_tbl +
-                              (edesc->src_nents + edesc->dst_nents + 2) *
+               to_talitos_ptr(tbl_ptr, edesc->dma_link_tbl +
+                              (tbl_off + edesc->dst_nents + 1 +
+                               edesc->assoc_nents) *
                               sizeof(struct talitos_ptr));
                desc->ptr[5].j_extent |= DESC_PTR_LNKTBL_JUMP;
                dma_sync_single_for_device(ctx->dev, edesc->dma_link_tbl,
@@ -1053,17 +1097,17 @@ static int ipsec_esp(struct talitos_edesc *edesc, struct aead_request *areq,
 /*
  * derive number of elements in scatterlist
  */
-static int sg_count(struct scatterlist *sg_list, int nbytes, int *chained)
+static int sg_count(struct scatterlist *sg_list, int nbytes, bool *chained)
 {
        struct scatterlist *sg = sg_list;
        int sg_nents = 0;
 
-       *chained = 0;
+       *chained = false;
        while (nbytes > 0) {
                sg_nents++;
                nbytes -= sg->length;
                if (!sg_is_last(sg) && (sg + 1)->length == 0)
-                       *chained = 1;
+                       *chained = true;
                sg = scatterwalk_sg_next(sg);
        }
 
@@ -1132,17 +1176,21 @@ static size_t sg_copy_end_to_buffer(struct scatterlist *sgl, unsigned int nents,
  * allocate and map the extended descriptor
  */
 static struct talitos_edesc *talitos_edesc_alloc(struct device *dev,
+                                                struct scatterlist *assoc,
                                                 struct scatterlist *src,
                                                 struct scatterlist *dst,
-                                                int hash_result,
+                                                u8 *iv,
+                                                unsigned int assoclen,
                                                 unsigned int cryptlen,
                                                 unsigned int authsize,
+                                                unsigned int ivsize,
                                                 int icv_stashing,
                                                 u32 cryptoflags)
 {
        struct talitos_edesc *edesc;
-       int src_nents, dst_nents, alloc_len, dma_len;
-       int src_chained, dst_chained = 0;
+       int assoc_nents = 0, src_nents, dst_nents, alloc_len, dma_len;
+       bool assoc_chained = false, src_chained = false, dst_chained = false;
+       dma_addr_t iv_dma = 0;
        gfp_t flags = cryptoflags & CRYPTO_TFM_REQ_MAY_SLEEP ? GFP_KERNEL :
                      GFP_ATOMIC;
 
@@ -1151,10 +1199,29 @@ static struct talitos_edesc *talitos_edesc_alloc(struct device *dev,
                return ERR_PTR(-EINVAL);
        }
 
+       if (iv)
+               iv_dma = dma_map_single(dev, iv, ivsize, DMA_TO_DEVICE);
+
+       if (assoc) {
+               /*
+                * Currently it is assumed that iv is provided whenever assoc
+                * is.
+                */
+               BUG_ON(!iv);
+
+               assoc_nents = sg_count(assoc, assoclen, &assoc_chained);
+               talitos_map_sg(dev, assoc, assoc_nents, DMA_TO_DEVICE,
+                              assoc_chained);
+               assoc_nents = (assoc_nents == 1) ? 0 : assoc_nents;
+
+               if (assoc_nents || sg_dma_address(assoc) + assoclen != iv_dma)
+                       assoc_nents = assoc_nents ? assoc_nents + 1 : 2;
+       }
+
        src_nents = sg_count(src, cryptlen + authsize, &src_chained);
        src_nents = (src_nents == 1) ? 0 : src_nents;
 
-       if (hash_result) {
+       if (!dst) {
                dst_nents = 0;
        } else {
                if (dst == src) {
@@ -1172,9 +1239,9 @@ static struct talitos_edesc *talitos_edesc_alloc(struct device *dev,
         * and the ICV data itself
         */
        alloc_len = sizeof(struct talitos_edesc);
-       if (src_nents || dst_nents) {
-               dma_len = (src_nents + dst_nents + 2) *
-                                sizeof(struct talitos_ptr) + authsize;
+       if (assoc_nents || src_nents || dst_nents) {
+               dma_len = (src_nents + dst_nents + 2 + assoc_nents) *
+                         sizeof(struct talitos_ptr) + authsize;
                alloc_len += dma_len;
        } else {
                dma_len = 0;
@@ -1183,14 +1250,20 @@ static struct talitos_edesc *talitos_edesc_alloc(struct device *dev,
 
        edesc = kmalloc(alloc_len, GFP_DMA | flags);
        if (!edesc) {
+               talitos_unmap_sg_chain(dev, assoc, DMA_TO_DEVICE);
+               if (iv_dma)
+                       dma_unmap_single(dev, iv_dma, ivsize, DMA_TO_DEVICE);
                dev_err(dev, "could not allocate edescriptor\n");
                return ERR_PTR(-ENOMEM);
        }
 
+       edesc->assoc_nents = assoc_nents;
        edesc->src_nents = src_nents;
        edesc->dst_nents = dst_nents;
-       edesc->src_is_chained = src_chained;
-       edesc->dst_is_chained = dst_chained;
+       edesc->assoc_chained = assoc_chained;
+       edesc->src_chained = src_chained;
+       edesc->dst_chained = dst_chained;
+       edesc->iv_dma = iv_dma;
        edesc->dma_len = dma_len;
        if (dma_len)
                edesc->dma_link_tbl = dma_map_single(dev, &edesc->link_tbl[0],
@@ -1200,14 +1273,16 @@ static struct talitos_edesc *talitos_edesc_alloc(struct device *dev,
        return edesc;
 }
 
-static struct talitos_edesc *aead_edesc_alloc(struct aead_request *areq,
+static struct talitos_edesc *aead_edesc_alloc(struct aead_request *areq, u8 *iv,
                                              int icv_stashing)
 {
        struct crypto_aead *authenc = crypto_aead_reqtfm(areq);
        struct talitos_ctx *ctx = crypto_aead_ctx(authenc);
+       unsigned int ivsize = crypto_aead_ivsize(authenc);
 
-       return talitos_edesc_alloc(ctx->dev, areq->src, areq->dst, 0,
-                                  areq->cryptlen, ctx->authsize, icv_stashing,
+       return talitos_edesc_alloc(ctx->dev, areq->assoc, areq->src, areq->dst,
+                                  iv, areq->assoclen, areq->cryptlen,
+                                  ctx->authsize, ivsize, icv_stashing,
                                   areq->base.flags);
 }
 
@@ -1218,14 +1293,14 @@ static int aead_encrypt(struct aead_request *req)
        struct talitos_edesc *edesc;
 
        /* allocate extended descriptor */
-       edesc = aead_edesc_alloc(req, 0);
+       edesc = aead_edesc_alloc(req, req->iv, 0);
        if (IS_ERR(edesc))
                return PTR_ERR(edesc);
 
        /* set encrypt */
        edesc->desc.hdr = ctx->desc_hdr_template | DESC_HDR_MODE0_ENCRYPT;
 
-       return ipsec_esp(edesc, req, NULL, 0, ipsec_esp_encrypt_done);
+       return ipsec_esp(edesc, req, 0, ipsec_esp_encrypt_done);
 }
 
 static int aead_decrypt(struct aead_request *req)
@@ -1241,7 +1316,7 @@ static int aead_decrypt(struct aead_request *req)
        req->cryptlen -= authsize;
 
        /* allocate extended descriptor */
-       edesc = aead_edesc_alloc(req, 1);
+       edesc = aead_edesc_alloc(req, req->iv, 1);
        if (IS_ERR(edesc))
                return PTR_ERR(edesc);
 
@@ -1257,9 +1332,7 @@ static int aead_decrypt(struct aead_request *req)
                /* reset integrity check result bits */
                edesc->desc.hdr_lo = 0;
 
-               return ipsec_esp(edesc, req, NULL, 0,
-                                ipsec_esp_decrypt_hwauth_done);
-
+               return ipsec_esp(edesc, req, 0, ipsec_esp_decrypt_hwauth_done);
        }
 
        /* Have to check the ICV with software */
@@ -1268,7 +1341,8 @@ static int aead_decrypt(struct aead_request *req)
        /* stash incoming ICV for later cmp with ICV generated by the h/w */
        if (edesc->dma_len)
                icvdata = &edesc->link_tbl[edesc->src_nents +
-                                          edesc->dst_nents + 2];
+                                          edesc->dst_nents + 2 +
+                                          edesc->assoc_nents];
        else
                icvdata = &edesc->link_tbl[0];
 
@@ -1277,7 +1351,7 @@ static int aead_decrypt(struct aead_request *req)
        memcpy(icvdata, (char *)sg_virt(sg) + sg->length - ctx->authsize,
               ctx->authsize);
 
-       return ipsec_esp(edesc, req, NULL, 0, ipsec_esp_decrypt_swauth_done);
+       return ipsec_esp(edesc, req, 0, ipsec_esp_decrypt_swauth_done);
 }
 
 static int aead_givencrypt(struct aead_givcrypt_request *req)
@@ -1288,7 +1362,7 @@ static int aead_givencrypt(struct aead_givcrypt_request *req)
        struct talitos_edesc *edesc;
 
        /* allocate extended descriptor */
-       edesc = aead_edesc_alloc(areq, 0);
+       edesc = aead_edesc_alloc(areq, req->giv, 0);
        if (IS_ERR(edesc))
                return PTR_ERR(edesc);
 
@@ -1299,8 +1373,7 @@ static int aead_givencrypt(struct aead_givcrypt_request *req)
        /* avoid consecutive packets going out with same IV */
        *(__be64 *)req->giv ^= cpu_to_be64(req->seq);
 
-       return ipsec_esp(edesc, areq, req->giv, req->seq,
-                        ipsec_esp_encrypt_done);
+       return ipsec_esp(edesc, areq, req->seq, ipsec_esp_encrypt_done);
 }
 
 static int ablkcipher_setkey(struct crypto_ablkcipher *cipher,
@@ -1356,7 +1429,7 @@ static int common_nonsnoop(struct talitos_edesc *edesc,
        struct device *dev = ctx->dev;
        struct talitos_desc *desc = &edesc->desc;
        unsigned int cryptlen = areq->nbytes;
-       unsigned int ivsize;
+       unsigned int ivsize = crypto_ablkcipher_ivsize(cipher);
        int sg_count, ret;
 
        /* first DWORD empty */
@@ -1365,9 +1438,9 @@ static int common_nonsnoop(struct talitos_edesc *edesc,
        desc->ptr[0].j_extent = 0;
 
        /* cipher iv */
-       ivsize = crypto_ablkcipher_ivsize(cipher);
-       map_single_talitos_ptr(dev, &desc->ptr[1], ivsize, areq->info, 0,
-                              DMA_TO_DEVICE);
+       to_talitos_ptr(&desc->ptr[1], edesc->iv_dma);
+       desc->ptr[1].len = cpu_to_be16(ivsize);
+       desc->ptr[1].j_extent = 0;
 
        /* cipher key */
        map_single_talitos_ptr(dev, &desc->ptr[2], ctx->keylen,
@@ -1382,7 +1455,7 @@ static int common_nonsnoop(struct talitos_edesc *edesc,
        sg_count = talitos_map_sg(dev, areq->src, edesc->src_nents ? : 1,
                                  (areq->src == areq->dst) ? DMA_BIDIRECTIONAL
                                                           : DMA_TO_DEVICE,
-                                 edesc->src_is_chained);
+                                 edesc->src_chained);
 
        if (sg_count == 1) {
                to_talitos_ptr(&desc->ptr[3], sg_dma_address(areq->src));
@@ -1409,8 +1482,7 @@ static int common_nonsnoop(struct talitos_edesc *edesc,
        if (areq->src != areq->dst)
                sg_count = talitos_map_sg(dev, areq->dst,
                                          edesc->dst_nents ? : 1,
-                                         DMA_FROM_DEVICE,
-                                         edesc->dst_is_chained);
+                                         DMA_FROM_DEVICE, edesc->dst_chained);
 
        if (sg_count == 1) {
                to_talitos_ptr(&desc->ptr[4], sg_dma_address(areq->dst));
@@ -1450,9 +1522,11 @@ static struct talitos_edesc *ablkcipher_edesc_alloc(struct ablkcipher_request *
 {
        struct crypto_ablkcipher *cipher = crypto_ablkcipher_reqtfm(areq);
        struct talitos_ctx *ctx = crypto_ablkcipher_ctx(cipher);
+       unsigned int ivsize = crypto_ablkcipher_ivsize(cipher);
 
-       return talitos_edesc_alloc(ctx->dev, areq->src, areq->dst, 0,
-                                  areq->nbytes, 0, 0, areq->base.flags);
+       return talitos_edesc_alloc(ctx->dev, NULL, areq->src, areq->dst,
+                                  areq->info, 0, areq->nbytes, 0, ivsize, 0,
+                                  areq->base.flags);
 }
 
 static int ablkcipher_encrypt(struct ablkcipher_request *areq)
@@ -1578,8 +1652,7 @@ static int common_nonsnoop_hash(struct talitos_edesc *edesc,
 
        sg_count = talitos_map_sg(dev, req_ctx->psrc,
                                  edesc->src_nents ? : 1,
-                                 DMA_TO_DEVICE,
-                                 edesc->src_is_chained);
+                                 DMA_TO_DEVICE, edesc->src_chained);
 
        if (sg_count == 1) {
                to_talitos_ptr(&desc->ptr[3], sg_dma_address(req_ctx->psrc));
@@ -1631,8 +1704,8 @@ static struct talitos_edesc *ahash_edesc_alloc(struct ahash_request *areq,
        struct talitos_ctx *ctx = crypto_ahash_ctx(tfm);
        struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
 
-       return talitos_edesc_alloc(ctx->dev, req_ctx->psrc, NULL, 1,
-                                  nbytes, 0, 0, areq->base.flags);
+       return talitos_edesc_alloc(ctx->dev, NULL, req_ctx->psrc, NULL, NULL, 0,
+                                  nbytes, 0, 0, 0, areq->base.flags);
 }
 
 static int ahash_init(struct ahash_request *areq)
@@ -1690,7 +1763,7 @@ static int ahash_process_req(struct ahash_request *areq, unsigned int nbytes)
        unsigned int nbytes_to_hash;
        unsigned int to_hash_later;
        unsigned int nsg;
-       int chained;
+       bool chained;
 
        if (!req_ctx->last && (nbytes + req_ctx->nbuf <= blocksize)) {
                /* Buffer up to one whole block */
@@ -1902,21 +1975,18 @@ struct talitos_alg_template {
 };
 
 static struct talitos_alg_template driver_algs[] = {
-       /* AEAD algorithms.  These use a single-pass ipsec_esp descriptor */
+       /*
+        * AEAD algorithms. These use a single-pass ipsec_esp descriptor.
+        * authencesn(*,*) is also registered, although not present
+        * explicitly here.
+        */
        {       .type = CRYPTO_ALG_TYPE_AEAD,
                .alg.crypto = {
                        .cra_name = "authenc(hmac(sha1),cbc(aes))",
                        .cra_driver_name = "authenc-hmac-sha1-cbc-aes-talitos",
                        .cra_blocksize = AES_BLOCK_SIZE,
                        .cra_flags = CRYPTO_ALG_TYPE_AEAD | CRYPTO_ALG_ASYNC,
-                       .cra_type = &crypto_aead_type,
                        .cra_aead = {
-                               .setkey = aead_setkey,
-                               .setauthsize = aead_setauthsize,
-                               .encrypt = aead_encrypt,
-                               .decrypt = aead_decrypt,
-                               .givencrypt = aead_givencrypt,
-                               .geniv = "<built-in>",
                                .ivsize = AES_BLOCK_SIZE,
                                .maxauthsize = SHA1_DIGEST_SIZE,
                        }
@@ -1935,14 +2005,7 @@ static struct talitos_alg_template driver_algs[] = {
                        .cra_driver_name = "authenc-hmac-sha1-cbc-3des-talitos",
                        .cra_blocksize = DES3_EDE_BLOCK_SIZE,
                        .cra_flags = CRYPTO_ALG_TYPE_AEAD | CRYPTO_ALG_ASYNC,
-                       .cra_type = &crypto_aead_type,
                        .cra_aead = {
-                               .setkey = aead_setkey,
-                               .setauthsize = aead_setauthsize,
-                               .encrypt = aead_encrypt,
-                               .decrypt = aead_decrypt,
-                               .givencrypt = aead_givencrypt,
-                               .geniv = "<built-in>",
                                .ivsize = DES3_EDE_BLOCK_SIZE,
                                .maxauthsize = SHA1_DIGEST_SIZE,
                        }
@@ -1962,14 +2025,7 @@ static struct talitos_alg_template driver_algs[] = {
                        .cra_driver_name = "authenc-hmac-sha224-cbc-aes-talitos",
                        .cra_blocksize = AES_BLOCK_SIZE,
                        .cra_flags = CRYPTO_ALG_TYPE_AEAD | CRYPTO_ALG_ASYNC,
-                       .cra_type = &crypto_aead_type,
                        .cra_aead = {
-                               .setkey = aead_setkey,
-                               .setauthsize = aead_setauthsize,
-                               .encrypt = aead_encrypt,
-                               .decrypt = aead_decrypt,
-                               .givencrypt = aead_givencrypt,
-                               .geniv = "<built-in>",
                                .ivsize = AES_BLOCK_SIZE,
                                .maxauthsize = SHA224_DIGEST_SIZE,
                        }
@@ -1988,14 +2044,7 @@ static struct talitos_alg_template driver_algs[] = {
                        .cra_driver_name = "authenc-hmac-sha224-cbc-3des-talitos",
                        .cra_blocksize = DES3_EDE_BLOCK_SIZE,
                        .cra_flags = CRYPTO_ALG_TYPE_AEAD | CRYPTO_ALG_ASYNC,
-                       .cra_type = &crypto_aead_type,
                        .cra_aead = {
-                               .setkey = aead_setkey,
-                               .setauthsize = aead_setauthsize,
-                               .encrypt = aead_encrypt,
-                               .decrypt = aead_decrypt,
-                               .givencrypt = aead_givencrypt,
-                               .geniv = "<built-in>",
                                .ivsize = DES3_EDE_BLOCK_SIZE,
                                .maxauthsize = SHA224_DIGEST_SIZE,
                        }
@@ -2015,14 +2064,7 @@ static struct talitos_alg_template driver_algs[] = {
                        .cra_driver_name = "authenc-hmac-sha256-cbc-aes-talitos",
                        .cra_blocksize = AES_BLOCK_SIZE,
                        .cra_flags = CRYPTO_ALG_TYPE_AEAD | CRYPTO_ALG_ASYNC,
-                       .cra_type = &crypto_aead_type,
                        .cra_aead = {
-                               .setkey = aead_setkey,
-                               .setauthsize = aead_setauthsize,
-                               .encrypt = aead_encrypt,
-                               .decrypt = aead_decrypt,
-                               .givencrypt = aead_givencrypt,
-                               .geniv = "<built-in>",
                                .ivsize = AES_BLOCK_SIZE,
                                .maxauthsize = SHA256_DIGEST_SIZE,
                        }
@@ -2041,14 +2083,7 @@ static struct talitos_alg_template driver_algs[] = {
                        .cra_driver_name = "authenc-hmac-sha256-cbc-3des-talitos",
                        .cra_blocksize = DES3_EDE_BLOCK_SIZE,
                        .cra_flags = CRYPTO_ALG_TYPE_AEAD | CRYPTO_ALG_ASYNC,
-                       .cra_type = &crypto_aead_type,
                        .cra_aead = {
-                               .setkey = aead_setkey,
-                               .setauthsize = aead_setauthsize,
-                               .encrypt = aead_encrypt,
-                               .decrypt = aead_decrypt,
-                               .givencrypt = aead_givencrypt,
-                               .geniv = "<built-in>",
                                .ivsize = DES3_EDE_BLOCK_SIZE,
                                .maxauthsize = SHA256_DIGEST_SIZE,
                        }
@@ -2068,14 +2103,7 @@ static struct talitos_alg_template driver_algs[] = {
                        .cra_driver_name = "authenc-hmac-sha384-cbc-aes-talitos",
                        .cra_blocksize = AES_BLOCK_SIZE,
                        .cra_flags = CRYPTO_ALG_TYPE_AEAD | CRYPTO_ALG_ASYNC,
-                       .cra_type = &crypto_aead_type,
                        .cra_aead = {
-                               .setkey = aead_setkey,
-                               .setauthsize = aead_setauthsize,
-                               .encrypt = aead_encrypt,
-                               .decrypt = aead_decrypt,
-                               .givencrypt = aead_givencrypt,
-                               .geniv = "<built-in>",
                                .ivsize = AES_BLOCK_SIZE,
                                .maxauthsize = SHA384_DIGEST_SIZE,
                        }
@@ -2094,14 +2122,7 @@ static struct talitos_alg_template driver_algs[] = {
                        .cra_driver_name = "authenc-hmac-sha384-cbc-3des-talitos",
                        .cra_blocksize = DES3_EDE_BLOCK_SIZE,
                        .cra_flags = CRYPTO_ALG_TYPE_AEAD | CRYPTO_ALG_ASYNC,
-                       .cra_type = &crypto_aead_type,
                        .cra_aead = {
-                               .setkey = aead_setkey,
-                               .setauthsize = aead_setauthsize,
-                               .encrypt = aead_encrypt,
-                               .decrypt = aead_decrypt,
-                               .givencrypt = aead_givencrypt,
-                               .geniv = "<built-in>",
                                .ivsize = DES3_EDE_BLOCK_SIZE,
                                .maxauthsize = SHA384_DIGEST_SIZE,
                        }
@@ -2121,14 +2142,7 @@ static struct talitos_alg_template driver_algs[] = {
                        .cra_driver_name = "authenc-hmac-sha512-cbc-aes-talitos",
                        .cra_blocksize = AES_BLOCK_SIZE,
                        .cra_flags = CRYPTO_ALG_TYPE_AEAD | CRYPTO_ALG_ASYNC,
-                       .cra_type = &crypto_aead_type,
                        .cra_aead = {
-                               .setkey = aead_setkey,
-                               .setauthsize = aead_setauthsize,
-                               .encrypt = aead_encrypt,
-                               .decrypt = aead_decrypt,
-                               .givencrypt = aead_givencrypt,
-                               .geniv = "<built-in>",
                                .ivsize = AES_BLOCK_SIZE,
                                .maxauthsize = SHA512_DIGEST_SIZE,
                        }
@@ -2147,14 +2161,7 @@ static struct talitos_alg_template driver_algs[] = {
                        .cra_driver_name = "authenc-hmac-sha512-cbc-3des-talitos",
                        .cra_blocksize = DES3_EDE_BLOCK_SIZE,
                        .cra_flags = CRYPTO_ALG_TYPE_AEAD | CRYPTO_ALG_ASYNC,
-                       .cra_type = &crypto_aead_type,
                        .cra_aead = {
-                               .setkey = aead_setkey,
-                               .setauthsize = aead_setauthsize,
-                               .encrypt = aead_encrypt,
-                               .decrypt = aead_decrypt,
-                               .givencrypt = aead_givencrypt,
-                               .geniv = "<built-in>",
                                .ivsize = DES3_EDE_BLOCK_SIZE,
                                .maxauthsize = SHA512_DIGEST_SIZE,
                        }
@@ -2174,14 +2181,7 @@ static struct talitos_alg_template driver_algs[] = {
                        .cra_driver_name = "authenc-hmac-md5-cbc-aes-talitos",
                        .cra_blocksize = AES_BLOCK_SIZE,
                        .cra_flags = CRYPTO_ALG_TYPE_AEAD | CRYPTO_ALG_ASYNC,
-                       .cra_type = &crypto_aead_type,
                        .cra_aead = {
-                               .setkey = aead_setkey,
-                               .setauthsize = aead_setauthsize,
-                               .encrypt = aead_encrypt,
-                               .decrypt = aead_decrypt,
-                               .givencrypt = aead_givencrypt,
-                               .geniv = "<built-in>",
                                .ivsize = AES_BLOCK_SIZE,
                                .maxauthsize = MD5_DIGEST_SIZE,
                        }
@@ -2200,14 +2200,7 @@ static struct talitos_alg_template driver_algs[] = {
                        .cra_driver_name = "authenc-hmac-md5-cbc-3des-talitos",
                        .cra_blocksize = DES3_EDE_BLOCK_SIZE,
                        .cra_flags = CRYPTO_ALG_TYPE_AEAD | CRYPTO_ALG_ASYNC,
-                       .cra_type = &crypto_aead_type,
                        .cra_aead = {
-                               .setkey = aead_setkey,
-                               .setauthsize = aead_setauthsize,
-                               .encrypt = aead_encrypt,
-                               .decrypt = aead_decrypt,
-                               .givencrypt = aead_givencrypt,
-                               .geniv = "<built-in>",
                                .ivsize = DES3_EDE_BLOCK_SIZE,
                                .maxauthsize = MD5_DIGEST_SIZE,
                        }
@@ -2229,12 +2222,7 @@ static struct talitos_alg_template driver_algs[] = {
                        .cra_blocksize = AES_BLOCK_SIZE,
                        .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER |
                                      CRYPTO_ALG_ASYNC,
-                       .cra_type = &crypto_ablkcipher_type,
                        .cra_ablkcipher = {
-                               .setkey = ablkcipher_setkey,
-                               .encrypt = ablkcipher_encrypt,
-                               .decrypt = ablkcipher_decrypt,
-                               .geniv = "eseqiv",
                                .min_keysize = AES_MIN_KEY_SIZE,
                                .max_keysize = AES_MAX_KEY_SIZE,
                                .ivsize = AES_BLOCK_SIZE,
@@ -2251,12 +2239,7 @@ static struct talitos_alg_template driver_algs[] = {
                        .cra_blocksize = DES3_EDE_BLOCK_SIZE,
                        .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER |
                                      CRYPTO_ALG_ASYNC,
-                       .cra_type = &crypto_ablkcipher_type,
                        .cra_ablkcipher = {
-                               .setkey = ablkcipher_setkey,
-                               .encrypt = ablkcipher_encrypt,
-                               .decrypt = ablkcipher_decrypt,
-                               .geniv = "eseqiv",
                                .min_keysize = DES3_EDE_KEY_SIZE,
                                .max_keysize = DES3_EDE_KEY_SIZE,
                                .ivsize = DES3_EDE_BLOCK_SIZE,
@@ -2270,11 +2253,6 @@ static struct talitos_alg_template driver_algs[] = {
        /* AHASH algorithms. */
        {       .type = CRYPTO_ALG_TYPE_AHASH,
                .alg.hash = {
-                       .init = ahash_init,
-                       .update = ahash_update,
-                       .final = ahash_final,
-                       .finup = ahash_finup,
-                       .digest = ahash_digest,
                        .halg.digestsize = MD5_DIGEST_SIZE,
                        .halg.base = {
                                .cra_name = "md5",
@@ -2282,7 +2260,6 @@ static struct talitos_alg_template driver_algs[] = {
                                .cra_blocksize = MD5_BLOCK_SIZE,
                                .cra_flags = CRYPTO_ALG_TYPE_AHASH |
                                             CRYPTO_ALG_ASYNC,
-                               .cra_type = &crypto_ahash_type
                        }
                },
                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
@@ -2291,11 +2268,6 @@ static struct talitos_alg_template driver_algs[] = {
        },
        {       .type = CRYPTO_ALG_TYPE_AHASH,
                .alg.hash = {
-                       .init = ahash_init,
-                       .update = ahash_update,
-                       .final = ahash_final,
-                       .finup = ahash_finup,
-                       .digest = ahash_digest,
                        .halg.digestsize = SHA1_DIGEST_SIZE,
                        .halg.base = {
                                .cra_name = "sha1",
@@ -2303,7 +2275,6 @@ static struct talitos_alg_template driver_algs[] = {
                                .cra_blocksize = SHA1_BLOCK_SIZE,
                                .cra_flags = CRYPTO_ALG_TYPE_AHASH |
                                             CRYPTO_ALG_ASYNC,
-                               .cra_type = &crypto_ahash_type
                        }
                },
                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
@@ -2312,11 +2283,6 @@ static struct talitos_alg_template driver_algs[] = {
        },
        {       .type = CRYPTO_ALG_TYPE_AHASH,
                .alg.hash = {
-                       .init = ahash_init,
-                       .update = ahash_update,
-                       .final = ahash_final,
-                       .finup = ahash_finup,
-                       .digest = ahash_digest,
                        .halg.digestsize = SHA224_DIGEST_SIZE,
                        .halg.base = {
                                .cra_name = "sha224",
@@ -2324,7 +2290,6 @@ static struct talitos_alg_template driver_algs[] = {
                                .cra_blocksize = SHA224_BLOCK_SIZE,
                                .cra_flags = CRYPTO_ALG_TYPE_AHASH |
                                             CRYPTO_ALG_ASYNC,
-                               .cra_type = &crypto_ahash_type
                        }
                },
                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
@@ -2333,11 +2298,6 @@ static struct talitos_alg_template driver_algs[] = {
        },
        {       .type = CRYPTO_ALG_TYPE_AHASH,
                .alg.hash = {
-                       .init = ahash_init,
-                       .update = ahash_update,
-                       .final = ahash_final,
-                       .finup = ahash_finup,
-                       .digest = ahash_digest,
                        .halg.digestsize = SHA256_DIGEST_SIZE,
                        .halg.base = {
                                .cra_name = "sha256",
@@ -2345,7 +2305,6 @@ static struct talitos_alg_template driver_algs[] = {
                                .cra_blocksize = SHA256_BLOCK_SIZE,
                                .cra_flags = CRYPTO_ALG_TYPE_AHASH |
                                             CRYPTO_ALG_ASYNC,
-                               .cra_type = &crypto_ahash_type
                        }
                },
                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
@@ -2354,11 +2313,6 @@ static struct talitos_alg_template driver_algs[] = {
        },
        {       .type = CRYPTO_ALG_TYPE_AHASH,
                .alg.hash = {
-                       .init = ahash_init,
-                       .update = ahash_update,
-                       .final = ahash_final,
-                       .finup = ahash_finup,
-                       .digest = ahash_digest,
                        .halg.digestsize = SHA384_DIGEST_SIZE,
                        .halg.base = {
                                .cra_name = "sha384",
@@ -2366,7 +2320,6 @@ static struct talitos_alg_template driver_algs[] = {
                                .cra_blocksize = SHA384_BLOCK_SIZE,
                                .cra_flags = CRYPTO_ALG_TYPE_AHASH |
                                             CRYPTO_ALG_ASYNC,
-                               .cra_type = &crypto_ahash_type
                        }
                },
                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
@@ -2375,11 +2328,6 @@ static struct talitos_alg_template driver_algs[] = {
        },
        {       .type = CRYPTO_ALG_TYPE_AHASH,
                .alg.hash = {
-                       .init = ahash_init,
-                       .update = ahash_update,
-                       .final = ahash_final,
-                       .finup = ahash_finup,
-                       .digest = ahash_digest,
                        .halg.digestsize = SHA512_DIGEST_SIZE,
                        .halg.base = {
                                .cra_name = "sha512",
@@ -2387,7 +2335,6 @@ static struct talitos_alg_template driver_algs[] = {
                                .cra_blocksize = SHA512_BLOCK_SIZE,
                                .cra_flags = CRYPTO_ALG_TYPE_AHASH |
                                             CRYPTO_ALG_ASYNC,
-                               .cra_type = &crypto_ahash_type
                        }
                },
                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
@@ -2396,12 +2343,6 @@ static struct talitos_alg_template driver_algs[] = {
        },
        {       .type = CRYPTO_ALG_TYPE_AHASH,
                .alg.hash = {
-                       .init = ahash_init,
-                       .update = ahash_update,
-                       .final = ahash_final,
-                       .finup = ahash_finup,
-                       .digest = ahash_digest,
-                       .setkey = ahash_setkey,
                        .halg.digestsize = MD5_DIGEST_SIZE,
                        .halg.base = {
                                .cra_name = "hmac(md5)",
@@ -2409,7 +2350,6 @@ static struct talitos_alg_template driver_algs[] = {
                                .cra_blocksize = MD5_BLOCK_SIZE,
                                .cra_flags = CRYPTO_ALG_TYPE_AHASH |
                                             CRYPTO_ALG_ASYNC,
-                               .cra_type = &crypto_ahash_type
                        }
                },
                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
@@ -2418,12 +2358,6 @@ static struct talitos_alg_template driver_algs[] = {
        },
        {       .type = CRYPTO_ALG_TYPE_AHASH,
                .alg.hash = {
-                       .init = ahash_init,
-                       .update = ahash_update,
-                       .final = ahash_final,
-                       .finup = ahash_finup,
-                       .digest = ahash_digest,
-                       .setkey = ahash_setkey,
                        .halg.digestsize = SHA1_DIGEST_SIZE,
                        .halg.base = {
                                .cra_name = "hmac(sha1)",
@@ -2431,7 +2365,6 @@ static struct talitos_alg_template driver_algs[] = {
                                .cra_blocksize = SHA1_BLOCK_SIZE,
                                .cra_flags = CRYPTO_ALG_TYPE_AHASH |
                                             CRYPTO_ALG_ASYNC,
-                               .cra_type = &crypto_ahash_type
                        }
                },
                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
@@ -2440,12 +2373,6 @@ static struct talitos_alg_template driver_algs[] = {
        },
        {       .type = CRYPTO_ALG_TYPE_AHASH,
                .alg.hash = {
-                       .init = ahash_init,
-                       .update = ahash_update,
-                       .final = ahash_final,
-                       .finup = ahash_finup,
-                       .digest = ahash_digest,
-                       .setkey = ahash_setkey,
                        .halg.digestsize = SHA224_DIGEST_SIZE,
                        .halg.base = {
                                .cra_name = "hmac(sha224)",
@@ -2453,7 +2380,6 @@ static struct talitos_alg_template driver_algs[] = {
                                .cra_blocksize = SHA224_BLOCK_SIZE,
                                .cra_flags = CRYPTO_ALG_TYPE_AHASH |
                                             CRYPTO_ALG_ASYNC,
-                               .cra_type = &crypto_ahash_type
                        }
                },
                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
@@ -2462,12 +2388,6 @@ static struct talitos_alg_template driver_algs[] = {
        },
        {       .type = CRYPTO_ALG_TYPE_AHASH,
                .alg.hash = {
-                       .init = ahash_init,
-                       .update = ahash_update,
-                       .final = ahash_final,
-                       .finup = ahash_finup,
-                       .digest = ahash_digest,
-                       .setkey = ahash_setkey,
                        .halg.digestsize = SHA256_DIGEST_SIZE,
                        .halg.base = {
                                .cra_name = "hmac(sha256)",
@@ -2475,7 +2395,6 @@ static struct talitos_alg_template driver_algs[] = {
                                .cra_blocksize = SHA256_BLOCK_SIZE,
                                .cra_flags = CRYPTO_ALG_TYPE_AHASH |
                                             CRYPTO_ALG_ASYNC,
-                               .cra_type = &crypto_ahash_type
                        }
                },
                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
@@ -2484,12 +2403,6 @@ static struct talitos_alg_template driver_algs[] = {
        },
        {       .type = CRYPTO_ALG_TYPE_AHASH,
                .alg.hash = {
-                       .init = ahash_init,
-                       .update = ahash_update,
-                       .final = ahash_final,
-                       .finup = ahash_finup,
-                       .digest = ahash_digest,
-                       .setkey = ahash_setkey,
                        .halg.digestsize = SHA384_DIGEST_SIZE,
                        .halg.base = {
                                .cra_name = "hmac(sha384)",
@@ -2497,7 +2410,6 @@ static struct talitos_alg_template driver_algs[] = {
                                .cra_blocksize = SHA384_BLOCK_SIZE,
                                .cra_flags = CRYPTO_ALG_TYPE_AHASH |
                                             CRYPTO_ALG_ASYNC,
-                               .cra_type = &crypto_ahash_type
                        }
                },
                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
@@ -2506,12 +2418,6 @@ static struct talitos_alg_template driver_algs[] = {
        },
        {       .type = CRYPTO_ALG_TYPE_AHASH,
                .alg.hash = {
-                       .init = ahash_init,
-                       .update = ahash_update,
-                       .final = ahash_final,
-                       .finup = ahash_finup,
-                       .digest = ahash_digest,
-                       .setkey = ahash_setkey,
                        .halg.digestsize = SHA512_DIGEST_SIZE,
                        .halg.base = {
                                .cra_name = "hmac(sha512)",
@@ -2519,7 +2425,6 @@ static struct talitos_alg_template driver_algs[] = {
                                .cra_blocksize = SHA512_BLOCK_SIZE,
                                .cra_flags = CRYPTO_ALG_TYPE_AHASH |
                                             CRYPTO_ALG_ASYNC,
-                               .cra_type = &crypto_ahash_type
                        }
                },
                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
@@ -2677,14 +2582,34 @@ static struct talitos_crypto_alg *talitos_alg_alloc(struct device *dev,
        case CRYPTO_ALG_TYPE_ABLKCIPHER:
                alg = &t_alg->algt.alg.crypto;
                alg->cra_init = talitos_cra_init;
+               alg->cra_type = &crypto_ablkcipher_type;
+               alg->cra_ablkcipher.setkey = ablkcipher_setkey;
+               alg->cra_ablkcipher.encrypt = ablkcipher_encrypt;
+               alg->cra_ablkcipher.decrypt = ablkcipher_decrypt;
+               alg->cra_ablkcipher.geniv = "eseqiv";
                break;
        case CRYPTO_ALG_TYPE_AEAD:
                alg = &t_alg->algt.alg.crypto;
                alg->cra_init = talitos_cra_init_aead;
+               alg->cra_type = &crypto_aead_type;
+               alg->cra_aead.setkey = aead_setkey;
+               alg->cra_aead.setauthsize = aead_setauthsize;
+               alg->cra_aead.encrypt = aead_encrypt;
+               alg->cra_aead.decrypt = aead_decrypt;
+               alg->cra_aead.givencrypt = aead_givencrypt;
+               alg->cra_aead.geniv = "<built-in>";
                break;
        case CRYPTO_ALG_TYPE_AHASH:
                alg = &t_alg->algt.alg.hash.halg.base;
                alg->cra_init = talitos_cra_init_ahash;
+               alg->cra_type = &crypto_ahash_type;
+               t_alg->algt.alg.hash.init = ahash_init;
+               t_alg->algt.alg.hash.update = ahash_update;
+               t_alg->algt.alg.hash.final = ahash_final;
+               t_alg->algt.alg.hash.finup = ahash_finup;
+               t_alg->algt.alg.hash.digest = ahash_digest;
+               t_alg->algt.alg.hash.setkey = ahash_setkey;
+
                if (!(priv->features & TALITOS_FTR_HMAC_OK) &&
                    !strncmp(alg->cra_name, "hmac", 4)) {
                        kfree(t_alg);
@@ -2896,7 +2821,9 @@ static int talitos_probe(struct platform_device *ofdev)
                if (hw_supports(dev, driver_algs[i].desc_hdr_template)) {
                        struct talitos_crypto_alg *t_alg;
                        char *name = NULL;
+                       bool authenc = false;
 
+authencesn:
                        t_alg = talitos_alg_alloc(dev, &driver_algs[i]);
                        if (IS_ERR(t_alg)) {
                                err = PTR_ERR(t_alg);
@@ -2911,6 +2838,8 @@ static int talitos_probe(struct platform_device *ofdev)
                                err = crypto_register_alg(
                                                &t_alg->algt.alg.crypto);
                                name = t_alg->algt.alg.crypto.cra_driver_name;
+                               authenc = authenc ? !authenc :
+                                         !(bool)memcmp(name, "authenc", 7);
                                break;
                        case CRYPTO_ALG_TYPE_AHASH:
                                err = crypto_register_ahash(
@@ -2923,8 +2852,25 @@ static int talitos_probe(struct platform_device *ofdev)
                                dev_err(dev, "%s alg registration failed\n",
                                        name);
                                kfree(t_alg);
-                       } else
+                       } else {
                                list_add_tail(&t_alg->entry, &priv->alg_list);
+                               if (authenc) {
+                                       struct crypto_alg *alg =
+                                               &driver_algs[i].alg.crypto;
+
+                                       name = alg->cra_name;
+                                       memmove(name + 10, name + 7,
+                                               strlen(name) - 7);
+                                       memcpy(name + 7, "esn", 3);
+
+                                       name = alg->cra_driver_name;
+                                       memmove(name + 10, name + 7,
+                                               strlen(name) - 7);
+                                       memcpy(name + 7, "esn", 3);
+
+                                       goto authencesn;
+                               }
+                       }
                }
        }
        if (!list_empty(&priv->alg_list))
index ac236f6..37185e6 100644 (file)
@@ -969,6 +969,7 @@ static int tegra_aes_probe(struct platform_device *pdev)
        aes_wq = alloc_workqueue("tegra_aes_wq", WQ_HIGHPRI | WQ_UNBOUND, 1);
        if (!aes_wq) {
                dev_err(dev, "alloc_workqueue failed\n");
+               err = -ENOMEM;
                goto out;
        }
 
@@ -1004,8 +1005,6 @@ static int tegra_aes_probe(struct platform_device *pdev)
 
        aes_dev = dd;
        for (i = 0; i < ARRAY_SIZE(algs); i++) {
-               INIT_LIST_HEAD(&algs[i].cra_list);
-
                algs[i].cra_priority = 300;
                algs[i].cra_ctxsize = sizeof(struct tegra_aes_ctx);
                algs[i].cra_module = THIS_MODULE;
index ef17e38..bc615cc 100644 (file)
@@ -1486,6 +1486,7 @@ static int ux500_cryp_probe(struct platform_device *pdev)
        if (!res_irq) {
                dev_err(dev, "[%s]: IORESOURCE_IRQ unavailable",
                        __func__);
+               ret = -ENODEV;
                goto out_power;
        }
 
index 0876507..632c333 100644 (file)
@@ -1991,7 +1991,6 @@ static int __init ux500_hash_mod_init(void)
 static void __exit ux500_hash_mod_fini(void)
 {
        platform_driver_unregister(&hash_driver);
-       return;
 }
 
 module_init(ux500_hash_mod_init);
diff --git a/include/crypto/cast5.h b/include/crypto/cast5.h
new file mode 100644 (file)
index 0000000..586183a
--- /dev/null
@@ -0,0 +1,27 @@
+#ifndef _CRYPTO_CAST5_H
+#define _CRYPTO_CAST5_H
+
+#include <linux/types.h>
+#include <linux/crypto.h>
+
+#define CAST5_BLOCK_SIZE 8
+#define CAST5_MIN_KEY_SIZE 5
+#define CAST5_MAX_KEY_SIZE 16
+
+struct cast5_ctx {
+       u32 Km[16];
+       u8 Kr[16];
+       int rr; /* rr ? rounds = 12 : rounds = 16; (rfc 2144) */
+};
+
+int cast5_setkey(struct crypto_tfm *tfm, const u8 *key, unsigned int keylen);
+
+void __cast5_encrypt(struct cast5_ctx *ctx, u8 *dst, const u8 *src);
+void __cast5_decrypt(struct cast5_ctx *ctx, u8 *dst, const u8 *src);
+
+extern const u32 cast5_s1[256];
+extern const u32 cast5_s2[256];
+extern const u32 cast5_s3[256];
+extern const u32 cast5_s4[256];
+
+#endif
diff --git a/include/crypto/cast6.h b/include/crypto/cast6.h
new file mode 100644 (file)
index 0000000..157af6f
--- /dev/null
@@ -0,0 +1,28 @@
+#ifndef _CRYPTO_CAST6_H
+#define _CRYPTO_CAST6_H
+
+#include <linux/types.h>
+#include <linux/crypto.h>
+
+#define CAST6_BLOCK_SIZE 16
+#define CAST6_MIN_KEY_SIZE 16
+#define CAST6_MAX_KEY_SIZE 32
+
+struct cast6_ctx {
+       u32 Km[12][4];
+       u8 Kr[12][4];
+};
+
+int __cast6_setkey(struct cast6_ctx *ctx, const u8 *key,
+                  unsigned int keylen, u32 *flags);
+int cast6_setkey(struct crypto_tfm *tfm, const u8 *key, unsigned int keylen);
+
+void __cast6_encrypt(struct cast6_ctx *ctx, u8 *dst, const u8 *src);
+void __cast6_decrypt(struct cast6_ctx *ctx, u8 *dst, const u8 *src);
+
+extern const u32 cast6_s1[256];
+extern const u32 cast6_s2[256];
+extern const u32 cast6_s3[256];
+extern const u32 cast6_s4[256];
+
+#endif
index 5bfad8c..821eae8 100644 (file)
@@ -83,6 +83,8 @@ struct hash_alg_common *ahash_attr_alg(struct rtattr *rta, u32 type, u32 mask);
 
 int crypto_register_shash(struct shash_alg *alg);
 int crypto_unregister_shash(struct shash_alg *alg);
+int crypto_register_shashes(struct shash_alg *algs, int count);
+int crypto_unregister_shashes(struct shash_alg *algs, int count);
 int shash_register_instance(struct crypto_template *tmpl,
                            struct shash_instance *inst);
 void shash_free_instance(struct crypto_instance *inst);
diff --git a/include/linux/nx842.h b/include/linux/nx842.h
new file mode 100644 (file)
index 0000000..a4d324c
--- /dev/null
@@ -0,0 +1,11 @@
+#ifndef __NX842_H__
+#define __NX842_H__
+
+int nx842_get_workmem_size(void);
+int nx842_get_workmem_size_aligned(void);
+int nx842_compress(const unsigned char *in, unsigned int in_len,
+               unsigned char *out, unsigned int *out_len, void *wrkmem);
+int nx842_decompress(const unsigned char *in, unsigned int in_len,
+               unsigned char *out, unsigned int *out_len, void *wrkmem);
+
+#endif