crypto: salsa20 - cleanup and convert to skcipher API
Subsystems (2)
v2 cover crypto: salsa20 - cleanup and convert to skcipher API
From: Eric Biggers <[email protected]>
This series converts the Salsa20 implementations over to the skcipher API, in the process fixing a couple bugs and making them be more similar to the ChaCha20 implementations, rather than doing things slightly differently for no good reason. (Note, however, that Salsa20 still interprets the IV differently from ChaCha20; I didn't change that.)
I'm not sure who is actually using Salsa20 in the kernel, but either way if we're going to have it at all we might as well keep it up to date.
The Salsa20 algorithms still pass the self-tests after these changes.
Changed since v1:
- Use '__le32' type for keystream, as suggested by Stephan.
Eric Biggers (3):
crypto: salsa20-generic - cleanup and convert to skcipher API
crypto: salsa20 - export generic helpers
crypto: x86/salsa20 - cleanup and convert to skcipher API
arch/x86/crypto/salsa20-i586-asm_32.S | 184 +----------------------- arch/x86/crypto/salsa20-x86_64-asm_64.S | 114 --------------- arch/x86/crypto/salsa20_glue.c | 105 ++++++-------- crypto/Kconfig | 2 + crypto/salsa20_generic.c | 240 ++++++++++++++------------------ include/crypto/salsa20.h | 27 ++++ 6 files changed, 174 insertions(+), 498 deletions(-) create mode 100644 include/crypto/salsa20.h
Signature · 1 line
2.16.0.rc0.223.g4a4ac83678-goog
PATCH v2 1/3 crypto: salsa20-generic - cleanup and convert to skcipher API
From: Eric Biggers <[email protected]>
Convert salsa20-generic from the deprecated "blkcipher" API to the "skcipher" API, in the process fixing it up to be thread-safe (as the crypto API expects) by maintaining each request's state separately from the transform context.
Also remove the unnecessary cra_alignmask and tighten validation of the key size by accepting only 16 or 32 bytes, not anything in between.
These changes bring the code close to the way chacha20-generic does things, so hopefully it will be easier to maintain in the future.
However, the way Salsa20 interprets the IV is still slightly different; that was not changed.
--- crypto/salsa20_generic.c | 240 ++++++++++++++++++++--------------------------- 1 file changed, 104 insertions(+), 136 deletions(-)
crypto/salsa20_generic.c +104 -136
@@ -19,49 +19,27 @@* */ -#include <linux/init.h> +#include <asm/unaligned.h> +#include <crypto/internal/skcipher.h> #include <linux/module.h> -#include <linux/errno.h> -#include <linux/crypto.h> -#include <linux/types.h> -#include <linux/bitops.h> -#include <crypto/algapi.h> -#include <asm/byteorder.h> -#define SALSA20_IV_SIZE 8U -#define SALSA20_MIN_KEY_SIZE 16U -#define SALSA20_MAX_KEY_SIZE 32U +#define SALSA20_IV_SIZE 8 +#define SALSA20_MIN_KEY_SIZE 16 +#define SALSA20_MAX_KEY_SIZE 32 +#define SALSA20_BLOCK_SIZE 64 -/* -* Start of code taken from D. J. Bernstein's reference implementation. -* With some modifications and optimizations made to suit our needs. -*/ - -/* -salsa20-ref.c version 20051118 -D. J. Bernstein -Public domain. -*/ - -#define U32TO8_LITTLE (p, v) \ - { (p)[0] = (v >> 0) & 0xff; (p)[1] = (v >> 8) & 0xff; \ - (p)[2] = (v >> 16) & 0xff; (p)[3] = (v >> 24) & 0xff; } -#define U8TO32_LITTLE (p) \ - (((u32)((p)[0]) ) | ((u32)((p)[1]) << 8) | \ - ((u32)((p)[2]) << 16) | ((u32)((p)[3]) << 24) ) - -struct salsa20_ctx -{ -u32 input[16 ]; +struct salsa20_ctx { +u32 initial_state[16 ]; }; -static void salsa20_wordtobyte (u8 output[64 ],const u32 input[16 ]) +static void salsa20_block (u32 *state,__le32 *stream) {u32 x[16 ];int i; -memcpy (x, input,sizeof (x)); -for (i =20 ; i >0 ; i -=2 ) { +memcpy (x, state,sizeof (x)); + +for (i =0 ; i <20 ; i +=2 ) { x[4 ] ^=rol32 ((x[0 ] + x[12 ]),7 ); x[8 ] ^=rol32 ((x[4 ] + x[0 ]),9 ); x[12 ] ^=rol32 ((x[8 ] + x[4 ]),13 );
@@ -95,145 +73,135 @@ static void salsa20_wordtobyte(u8 output[64], const u32 input[16]) x[14 ] ^=rol32 ((x[13 ] + x[12 ]),13 ); x[15 ] ^=rol32 ((x[14 ] + x[13 ]),18 ); } -for (i =0 ; i <16 ; ++i) - x[i] += input[i]; -for (i =0 ; i <16 ; ++i) -U32TO8_LITTLE (output +4 * i,x[i]); -} -static const char sigma[16 ] ="expand 32-byte k" ; -static const char tau[16 ] ="expand 16-byte k" ; +for (i =0 ; i <16 ; i++) + stream[i] =cpu_to_le32 (x[i] + state[i]); + +if (++state[8 ] ==0 ) + state[9 ]++; +} -static void salsa20_keysetup (struct salsa20_ctx *ctx,const u8 *k,u32 kbytes) +static void salsa20_docrypt (u32 *state,u8 *dst,const u8 *src, +unsigned int bytes) { -const char *constants; +__le32 stream[SALSA20_BLOCK_SIZE /sizeof (__le32)]; - ctx->input[1 ] =U8TO32_LITTLE (k +0 ); - ctx->input[2 ] =U8TO32_LITTLE (k +4 ); - ctx->input[3 ] =U8TO32_LITTLE (k +8 ); - ctx->input[4 ] =U8TO32_LITTLE (k +12 ); -if (kbytes ==32 ) {/* recommended */ - k +=16 ; - constants = sigma; - }else {/* kbytes == 16 */ - constants = tau; +if (dst != src) +memcpy (dst, src, bytes); + +while (bytes >=SALSA20_BLOCK_SIZE ) { +salsa20_block (state, stream); +crypto_xor (dst, (const u8 *)stream,SALSA20_BLOCK_SIZE ); + bytes -=SALSA20_BLOCK_SIZE ; + dst +=SALSA20_BLOCK_SIZE ; + } +if (bytes) { +salsa20_block (state, stream); +crypto_xor (dst, (const u8 *)stream, bytes); } - ctx->input[11 ] =U8TO32_LITTLE (k +0 ); - ctx->input[12 ] =U8TO32_LITTLE (k +4 ); - ctx->input[13 ] =U8TO32_LITTLE (k +8 ); - ctx->input[14 ] =U8TO32_LITTLE (k +12 ); - ctx->input[0 ] =U8TO32_LITTLE (constants +0 ); - ctx->input[5 ] =U8TO32_LITTLE (constants +4 ); - ctx->input[10 ] =U8TO32_LITTLE (constants +8 ); - ctx->input[15 ] =U8TO32_LITTLE (constants +12 ); } -static void salsa20_ivsetup (struct salsa20_ctx *ctx,const u8 *iv) +static void salsa20_init (u32 *state,const struct salsa20_ctx *ctx, +const u8 *iv) { - ctx->input[6 ] =U8TO32_LITTLE (iv +0 ); - ctx->input[7 ] =U8TO32_LITTLE (iv +4 ); - ctx->input[8 ] =0 ; - ctx->input[9 ] =0 ; +memcpy (state, ctx->initial_state,sizeof (ctx->initial_state)); + state[6 ] =get_unaligned_le32 (iv +0 ); + state[7 ] =get_unaligned_le32 (iv +4 ); } -static void salsa20_encrypt_bytes (struct salsa20_ctx *ctx,u8 *dst, -const u8 *src,unsigned int bytes) +static int salsa20_setkey (struct crypto_skcipher *tfm,const u8 *key, +unsigned int keysize) { -u8 buf[64 ]; - -if (dst != src) -memcpy (dst, src, bytes); - -while (bytes) { -salsa20_wordtobyte (buf, ctx->input); - - ctx->input[8 ]++; -if (!ctx->input[8 ]) - ctx->input[9 ]++; +static const char sigma[16 ] ="expand 32-byte k" ; +static const char tau[16 ] ="expand 16-byte k" ; +struct salsa20_ctx *ctx =crypto_skcipher_ctx (tfm); +const char *constants; -if (bytes <=64 ) { -crypto_xor (dst, buf, bytes); -return ; - } +if (keysize !=SALSA20_MIN_KEY_SIZE && + keysize !=SALSA20_MAX_KEY_SIZE ) +return -EINVAL ; -crypto_xor (dst, buf,64 ); - bytes -=64 ; - dst +=64 ; + ctx->initial_state[1 ] =get_unaligned_le32 (key +0 ); + ctx->initial_state[2 ] =get_unaligned_le32 (key +4 ); + ctx->initial_state[3 ] =get_unaligned_le32 (key +8 ); + ctx->initial_state[4 ] =get_unaligned_le32 (key +12 ); +if (keysize ==32 ) {/* recommended */ + key +=16 ; + constants = sigma; + }else {/* keysize == 16 */ + constants = tau; } -} - -/* -* End of code taken from D. J. Bernstein's reference implementation. -*/ + ctx->initial_state[11 ] =get_unaligned_le32 (key +0 ); + ctx->initial_state[12 ] =get_unaligned_le32 (key +4 ); + ctx->initial_state[13 ] =get_unaligned_le32 (key +8 ); + ctx->initial_state[14 ] =get_unaligned_le32 (key +12 ); + ctx->initial_state[0 ] =get_unaligned_le32 (constants +0 ); + ctx->initial_state[5 ] =get_unaligned_le32 (constants +4 ); + ctx->initial_state[10 ] =get_unaligned_le32 (constants +8 ); + ctx->initial_state[15 ] =get_unaligned_le32 (constants +12 ); + +/* space for the nonce; it will be overridden for each request */ + ctx->initial_state[6 ] =0 ; + ctx->initial_state[7 ] =0 ; + +/* initial block number */ + ctx->initial_state[8 ] =0 ; + ctx->initial_state[9 ] =0 ; -static int setkey (struct crypto_tfm *tfm,const u8 *key, -unsigned int keysize) -{ -struct salsa20_ctx *ctx =crypto_tfm_ctx (tfm); -salsa20_keysetup (ctx, key, keysize);return 0 ; } -static int encrypt (struct blkcipher_desc *desc, -struct scatterlist *dst,struct scatterlist *src, -unsigned int nbytes) +static int salsa20_crypt (struct skcipher_request *req) { -struct blkcipher_walk walk; -struct crypto_blkcipher *tfm = desc->tfm; -struct salsa20_ctx *ctx =crypto_blkcipher_ctx (tfm); +struct crypto_skcipher *tfm =crypto_skcipher_reqtfm (req); +const struct salsa20_ctx *ctx =crypto_skcipher_ctx (tfm); +struct skcipher_walk walk; +u32 state[16 ];int err; -blkcipher_walk_init (&walk, dst, src, nbytes); - err =blkcipher_walk_virt_block (desc, &walk,64 ); + err =skcipher_walk_virt (&walk, req, true); -salsa20_ivsetup (ctx, walk.iv); +salsa20_init (state, ctx, walk.iv); -while (walk.nbytes >=64 ) { -salsa20_encrypt_bytes (ctx, walk.dst.virt.addr, - walk.src.virt.addr, - walk.nbytes - (walk.nbytes %64 )); - err =blkcipher_walk_done (desc, &walk, walk.nbytes %64 ); - } +while (walk.nbytes >0 ) { +unsigned int nbytes = walk.nbytes; -if (walk.nbytes) { -salsa20_encrypt_bytes (ctx, walk.dst.virt.addr, - walk.src.virt.addr, walk.nbytes); - err =blkcipher_walk_done (desc, &walk,0 ); +if (nbytes < walk.total) + nbytes =round_down (nbytes, walk.stride); + +salsa20_docrypt (state, walk.dst.virt.addr, walk.src.virt.addr, + nbytes); + err =skcipher_walk_done (&walk, walk.nbytes - nbytes); }return err; } -static struct crypto_alg alg = { - .cra_name ="salsa20" , - .cra_driver_name ="salsa20-generic" , - .cra_priority =100 , - .cra_flags =CRYPTO_ALG_TYPE_BLKCIPHER , - .cra_type = &crypto_blkcipher_type, - .cra_blocksize =1 , - .cra_ctxsize =sizeof (struct salsa20_ctx ), - .cra_alignmask =3 , - .cra_module =THIS_MODULE , - .cra_u = { - .blkcipher = { - .setkey = setkey, - .encrypt = encrypt, - .decrypt = encrypt, - .min_keysize =SALSA20_MIN_KEY_SIZE , - .max_keysize =SALSA20_MAX_KEY_SIZE , - .ivsize =SALSA20_IV_SIZE , - } - } +static struct skcipher_alg alg = { + .base.cra_name ="salsa20" , + .base.cra_driver_name ="salsa20-generic" , + .base.cra_priority =100 , + .base.cra_blocksize =1 , + .base.cra_ctxsize =sizeof (struct salsa20_ctx ), + .base.cra_module =THIS_MODULE , + + .min_keysize =SALSA20_MIN_KEY_SIZE , + .max_keysize =SALSA20_MAX_KEY_SIZE , + .ivsize =SALSA20_IV_SIZE , + .chunksize =SALSA20_BLOCK_SIZE , + .setkey = salsa20_setkey, + .encrypt = salsa20_crypt, + .decrypt = salsa20_crypt, };static int __init salsa20_generic_mod_init (void ) { -return crypto_register_alg (&alg); +return crypto_register_skcipher (&alg); } static void __exit salsa20_generic_mod_fini(void) { -crypto_unregister_alg (&alg); +crypto_unregister_skcipher (&alg); }module_init (salsa20_generic_mod_init);
Signature · 1 line
2.16.0.rc0.223.g4a4ac83678-goog
PATCH v2 2/3 crypto: salsa20 - export generic helpers
In reply to Eric BiggersFrom: Eric Biggers <[email protected]>
Export the Salsa20 constants, transform context, and initialization functions so that they can be reused by the x86 implementation.
--- crypto/salsa20_generic.c | 20 +++++++------------- include/crypto/salsa20.h | 27 +++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 13 deletions(-) create mode 100644 include/crypto/salsa20.h
crypto/salsa20_generic.c +7 -13
@@ -21,17 +21,9 @@#include <asm/unaligned.h> #include <crypto/internal/skcipher.h> +#include <crypto/salsa20.h> #include <linux/module.h> -#define SALSA20_IV_SIZE 8 -#define SALSA20_MIN_KEY_SIZE 16 -#define SALSA20_MAX_KEY_SIZE 32 -#define SALSA20_BLOCK_SIZE 64 - -struct salsa20_ctx { -u32 initial_state[16 ]; -}; -static void salsa20_block (u32 *state,__le32 *stream) {u32 x[16 ];
@@ -101,15 +93,16 @@ static void salsa20_docrypt(u32 *state, u8 *dst, const u8 *src, } } -static void salsa20_init (u32 *state,const struct salsa20_ctx *ctx, +void crypto_salsa20_init (u32 *state,const struct salsa20_ctx *ctx,const u8 *iv) {memcpy (state, ctx->initial_state,sizeof (ctx->initial_state)); state[6 ] =get_unaligned_le32 (iv +0 ); state[7 ] =get_unaligned_le32 (iv +4 ); } +EXPORT_SYMBOL_GPL (crypto_salsa20_init); -static int salsa20_setkey (struct crypto_skcipher *tfm,const u8 *key, +int crypto_salsa20_setkey (struct crypto_skcipher *tfm,const u8 *key,unsigned int keysize) {static const char sigma[16 ] ="expand 32-byte k" ;
@@ -150,6 +143,7 @@ static int salsa20_setkey(struct crypto_skcipher *tfm, const u8 *key,return 0 ; } +EXPORT_SYMBOL_GPL (crypto_salsa20_setkey);static int salsa20_crypt (struct skcipher_request *req) {
@@ -161,7 +155,7 @@ static int salsa20_crypt(struct skcipher_request *req) err =skcipher_walk_virt (&walk, req, true); -salsa20_init (state, ctx, walk.iv); +crypto_salsa20_init (state, ctx, walk.iv);while (walk.nbytes >0 ) {unsigned int nbytes = walk.nbytes;
@@ -189,7 +183,7 @@ static struct skcipher_alg alg = { .max_keysize = SALSA20_MAX_KEY_SIZE, .ivsize = SALSA20_IV_SIZE, .chunksize = SALSA20_BLOCK_SIZE, - .setkey = salsa20_setkey, + .setkey = crypto_salsa20_setkey, .encrypt = salsa20_crypt, .decrypt = salsa20_crypt, };
include/crypto/salsa20.h new file +27 -0
@@ -0,0 +1,27 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* +* Common values for the Salsa20 algorithm +*/ + +#ifndef _CRYPTO_SALSA20_H +#define _CRYPTO_SALSA20_H + +#include <linux/types.h> + +#define SALSA20_IV_SIZE 8 +#define SALSA20_MIN_KEY_SIZE 16 +#define SALSA20_MAX_KEY_SIZE 32 +#define SALSA20_BLOCK_SIZE 64 + +struct crypto_skcipher ; + +struct salsa20_ctx { +u32 initial_state[16 ]; +}; + +void crypto_salsa20_init (u32 *state,const struct salsa20_ctx *ctx, +const u8 *iv); +int crypto_salsa20_setkey (struct crypto_skcipher *tfm,const u8 *key, +unsigned int keysize); + +#endif /* _CRYPTO_SALSA20_H */
Signature · 1 line
2.16.0.rc0.223.g4a4ac83678-goog
PATCH v2 3/3 crypto: x86/salsa20 - cleanup and convert to skcipher API
In reply to Eric BiggersFrom: Eric Biggers <[email protected]>
Convert salsa20-asm from the deprecated "blkcipher" API to the "skcipher" API, in the process fixing it up to use the generic helpers. This allows removing the salsa20_keysetup() and salsa20_ivsetup() assembly functions, which aren't performance critical; the C versions do just fine.
This also fixes the same bug that salsa20-generic had, where the state array was being maintained directly in the transform context rather than on the stack or in the request context. Thus, if multiple threads used the same Salsa20 transform concurrently they produced the wrong results.
--- arch/x86/crypto/salsa20-i586-asm_32.S | 184 +------------------------------- arch/x86/crypto/salsa20-x86_64-asm_64.S | 114 -------------------- arch/x86/crypto/salsa20_glue.c | 105 +++++++----------- crypto/Kconfig | 2 + 4 files changed, 46 insertions(+), 359 deletions(-)
arch/x86/crypto/salsa20-i586-asm_32.S +4 -180
@@ -1,6 +1,7 @@ -# salsa20_pm.s version 20051229 -# D. J. Bernstein -# Public domain. +# Derived from: +# salsa20_pm.s version 20051229 +# D. J. Bernstein +# Public domain. #include <linux/linkage.h>
@@ -935,180 +936,3 @@ ENTRY(salsa20_encrypt_bytes) # goto bytesatleast1 jmp ._bytesatleast1 ENDPROC(salsa20_encrypt_bytes) - -# enter salsa20_keysetup -ENTRY(salsa20_keysetup) - mov %esp,%eax - and $31,%eax - add $256,%eax - sub %eax,%esp - # eax_stack = eax - movl %eax,64(%esp) - # ebx_stack = ebx - movl %ebx,68(%esp) - # esi_stack = esi - movl %esi,72(%esp) - # edi_stack = edi - movl %edi,76(%esp) - # ebp_stack = ebp - movl %ebp,80(%esp) - # k = arg2 - movl 8(%esp,%eax),%ecx - # kbits = arg3 - movl 12(%esp,%eax),%edx - # x = arg1 - movl 4(%esp,%eax),%eax - # in1 = *(uint32 *) (k + 0) - movl 0(%ecx),%ebx - # in2 = *(uint32 *) (k + 4) - movl 4(%ecx),%esi - # in3 = *(uint32 *) (k + 8) - movl 8(%ecx),%edi - # in4 = *(uint32 *) (k + 12) - movl 12(%ecx),%ebp - # *(uint32 *) (x + 4) = in1 - movl %ebx,4(%eax) - # *(uint32 *) (x + 8) = in2 - movl %esi,8(%eax) - # *(uint32 *) (x + 12) = in3 - movl %edi,12(%eax) - # *(uint32 *) (x + 16) = in4 - movl %ebp,16(%eax) - # kbits - 256 - cmp $256,%edx - # goto kbits128 if unsigned< - jb ._kbits128 -._kbits256: - # in11 = *(uint32 *) (k + 16) - movl 16(%ecx),%edx - # in12 = *(uint32 *) (k + 20) - movl 20(%ecx),%ebx - # in13 = *(uint32 *) (k + 24) - movl 24(%ecx),%esi - # in14 = *(uint32 *) (k + 28) - movl 28(%ecx),%ecx - # *(uint32 *) (x + 44) = in11 - movl %edx,44(%eax) - # *(uint32 *) (x + 48) = in12 - movl %ebx,48(%eax) - # *(uint32 *) (x + 52) = in13 - movl %esi,52(%eax) - # *(uint32 *) (x + 56) = in14 - movl %ecx,56(%eax) - # in0 = 1634760805 - mov $1634760805,%ecx - # in5 = 857760878 - mov $857760878,%edx - # in10 = 2036477234 - mov $2036477234,%ebx - # in15 = 1797285236 - mov $1797285236,%esi - # *(uint32 *) (x + 0) = in0 - movl %ecx,0(%eax) - # *(uint32 *) (x + 20) = in5 - movl %edx,20(%eax) - # *(uint32 *) (x + 40) = in10 - movl %ebx,40(%eax) - # *(uint32 *) (x + 60) = in15 - movl %esi,60(%eax) - # goto keysetupdone - jmp ._keysetupdone -._kbits128: - # in11 = *(uint32 *) (k + 0) - movl 0(%ecx),%edx - # in12 = *(uint32 *) (k + 4) - movl 4(%ecx),%ebx - # in13 = *(uint32 *) (k + 8) - movl 8(%ecx),%esi - # in14 = *(uint32 *) (k + 12) - movl 12(%ecx),%ecx - # *(uint32 *) (x + 44) = in11 - movl %edx,44(%eax) - # *(uint32 *) (x + 48) = in12 - movl %ebx,48(%eax) - # *(uint32 *) (x + 52) = in13 - movl %esi,52(%eax) - # *(uint32 *) (x + 56) = in14 - movl %ecx,56(%eax) - # in0 = 1634760805 - mov $1634760805,%ecx - # in5 = 824206446 - mov $824206446,%edx - # in10 = 2036477238 - mov $2036477238,%ebx - # in15 = 1797285236 - mov $1797285236,%esi - # *(uint32 *) (x + 0) = in0 - movl %ecx,0(%eax) - # *(uint32 *) (x + 20) = in5 - movl %edx,20(%eax) - # *(uint32 *) (x + 40) = in10 - movl %ebx,40(%eax) - # *(uint32 *) (x + 60) = in15 - movl %esi,60(%eax) -._keysetupdone: - # eax = eax_stack - movl 64(%esp),%eax - # ebx = ebx_stack - movl 68(%esp),%ebx - # esi = esi_stack - movl 72(%esp),%esi - # edi = edi_stack - movl 76(%esp),%edi - # ebp = ebp_stack - movl 80(%esp),%ebp - # leave - add %eax,%esp - ret -ENDPROC(salsa20_keysetup) - -# enter salsa20_ivsetup -ENTRY(salsa20_ivsetup) - mov %esp,%eax - and $31,%eax - add $256,%eax - sub %eax,%esp - # eax_stack = eax - movl %eax,64(%esp) - # ebx_stack = ebx - movl %ebx,68(%esp) - # esi_stack = esi - movl %esi,72(%esp) - # edi_stack = edi - movl %edi,76(%esp) - # ebp_stack = ebp - movl %ebp,80(%esp) - # iv = arg2 - movl 8(%esp,%eax),%ecx - # x = arg1 - movl 4(%esp,%eax),%eax - # in6 = *(uint32 *) (iv + 0) - movl 0(%ecx),%edx - # in7 = *(uint32 *) (iv + 4) - movl 4(%ecx),%ecx - # in8 = 0 - mov $0,%ebx - # in9 = 0 - mov $0,%esi - # *(uint32 *) (x + 24) = in6 - movl %edx,24(%eax) - # *(uint32 *) (x + 28) = in7 - movl %ecx,28(%eax) - # *(uint32 *) (x + 32) = in8 - movl %ebx,32(%eax) - # *(uint32 *) (x + 36) = in9 - movl %esi,36(%eax) - # eax = eax_stack - movl 64(%esp),%eax - # ebx = ebx_stack - movl 68(%esp),%ebx - # esi = esi_stack - movl 72(%esp),%esi - # edi = edi_stack - movl 76(%esp),%edi - # ebp = ebp_stack - movl 80(%esp),%ebp - # leave - add %eax,%esp - ret -ENDPROC(salsa20_ivsetup)
arch/x86/crypto/salsa20-x86_64-asm_64.S +0 -114
117 lines not on this page · raw message
arch/x86/crypto/salsa20_glue.c +40 -65
139 lines not on this page · raw message
crypto/Kconfig +2 -0
@@ -1339,6 +1339,7 @@ config CRYPTO_SALSA20_586 tristate "Salsa20 stream cipher algorithm (i586)" depends on (X86 || UML_X86) && !64BIT select CRYPTO_BLKCIPHER + select CRYPTO_SALSA20 help Salsa20 stream cipher algorithm.
@@ -1352,6 +1353,7 @@ config CRYPTO_SALSA20_X86_64 tristate "Salsa20 stream cipher algorithm (x86_64)" depends on (X86 || UML_X86) && 64BIT select CRYPTO_BLKCIPHER + select CRYPTO_SALSA20 help Salsa20 stream cipher algorithm.
Signature · 1 line
2.16.0.rc0.223.g4a4ac83678-goog
Herbert Xu
maintainerQuoted 22 lines · Eric Biggers
From: Eric Biggers <[email protected]>
This series converts the Salsa20 implementations over to the skcipher API, in the process fixing a couple bugs and making them be more similar to the ChaCha20 implementations, rather than doing things slightly differently for no good reason. (Note, however, that Salsa20 still interprets the IV differently from ChaCha20; I didn't change that.)
I'm not sure who is actually using Salsa20 in the kernel, but either way if we're going to have it at all we might as well keep it up to date.
The Salsa20 algorithms still pass the self-tests after these changes.
Changed since v1:
- Use '
__le32' type for keystream, as suggested by Stephan.Eric Biggers (3):
crypto: salsa20-generic - cleanup and convert to skcipher API
crypto: salsa20 - export generic helpers
crypto: x86/salsa20 - cleanup and convert to skcipher API
Quoted 8 lines
arch/x86/crypto/salsa20-i586-asm_32.S | 184 +----------------------- arch/x86/crypto/salsa20-x86_64-asm_64.S | 114 --------------- arch/x86/crypto/salsa20_glue.c | 105 ++++++-------- crypto/Kconfig | 2 + crypto/salsa20_generic.c | 240 ++++++++++++++------------------ include/crypto/salsa20.h | 27 ++++ 6 files changed, 174 insertions(+), 498 deletions(-) create mode 100644 include/crypto/salsa20.h
All applied. Thanks.
Signature · 3 lines
Email: Herbert Xu <[email protected]> Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt