2 * Glue code for optimized assembly version of Salsa20.
4 * Copyright (c) 2007 Tan Swee Heng <thesweeheng@gmail.com>
6 * The assembly codes are public domain assembly codes written by Daniel. J.
7 * Bernstein <djb@cr.yp.to>. The codes are modified to include indentation
8 * and to remove extraneous comments and functions that are not needed.
9 * - i586 version, renamed as salsa20-i586-asm_32.S
10 * available from <http://cr.yp.to/snuffle/salsa20/x86-pm/salsa20.s>
11 * - x86-64 version, renamed as salsa20-x86_64-asm_64.S
12 * available from <http://cr.yp.to/snuffle/salsa20/amd64-3/salsa20.s>
14 * Also modified to set up the initial state using the generic C code rather
17 * This program is free software; you can redistribute it and/or modify it
18 * under the terms of the GNU General Public License as published by the Free
19 * Software Foundation; either version 2 of the License, or (at your option)
24 #include <asm/unaligned.h>
25 #include <crypto/internal/skcipher.h>
26 #include <crypto/salsa20.h>
27 #include <linux/module.h>
29 asmlinkage
void salsa20_encrypt_bytes(u32 state
[16], const u8
*src
, u8
*dst
,
32 static int salsa20_asm_crypt(struct skcipher_request
*req
)
34 struct crypto_skcipher
*tfm
= crypto_skcipher_reqtfm(req
);
35 const struct salsa20_ctx
*ctx
= crypto_skcipher_ctx(tfm
);
36 struct skcipher_walk walk
;
40 err
= skcipher_walk_virt(&walk
, req
, true);
42 crypto_salsa20_init(state
, ctx
, walk
.iv
);
44 while (walk
.nbytes
> 0) {
45 unsigned int nbytes
= walk
.nbytes
;
47 if (nbytes
< walk
.total
)
48 nbytes
= round_down(nbytes
, walk
.stride
);
50 salsa20_encrypt_bytes(state
, walk
.src
.virt
.addr
,
51 walk
.dst
.virt
.addr
, nbytes
);
52 err
= skcipher_walk_done(&walk
, walk
.nbytes
- nbytes
);
58 static struct skcipher_alg alg
= {
59 .base
.cra_name
= "salsa20",
60 .base
.cra_driver_name
= "salsa20-asm",
61 .base
.cra_priority
= 200,
62 .base
.cra_blocksize
= 1,
63 .base
.cra_ctxsize
= sizeof(struct salsa20_ctx
),
64 .base
.cra_module
= THIS_MODULE
,
66 .min_keysize
= SALSA20_MIN_KEY_SIZE
,
67 .max_keysize
= SALSA20_MAX_KEY_SIZE
,
68 .ivsize
= SALSA20_IV_SIZE
,
69 .chunksize
= SALSA20_BLOCK_SIZE
,
70 .setkey
= crypto_salsa20_setkey
,
71 .encrypt
= salsa20_asm_crypt
,
72 .decrypt
= salsa20_asm_crypt
,
75 static int __init
init(void)
77 return crypto_register_skcipher(&alg
);
80 static void __exit
fini(void)
82 crypto_unregister_skcipher(&alg
);
88 MODULE_LICENSE("GPL");
89 MODULE_DESCRIPTION ("Salsa20 stream cipher algorithm (optimized assembly version)");
90 MODULE_ALIAS_CRYPTO("salsa20");
91 MODULE_ALIAS_CRYPTO("salsa20-asm");