Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 4173
b: refs/heads/master
c: 9547737
h: refs/heads/master
i:
  4171: d26f842
v: v3
  • Loading branch information
Herbert Xu authored and David S. Miller committed Jul 6, 2005
1 parent 08163f8 commit 4157c8e
Show file tree
Hide file tree
Showing 5 changed files with 50 additions and 8 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 40725181b74be6b0e3bdc8c05bd1e0b9873ec5cc
refs/heads/master: 95477377995aefa2ec1654a9a3777bd57ea99146
6 changes: 6 additions & 0 deletions trunk/crypto/api.c
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,12 @@ int crypto_register_alg(struct crypto_alg *alg)
{
int ret = 0;
struct crypto_alg *q;

if (alg->cra_alignmask & (alg->cra_alignmask + 1))
return -EINVAL;

if (alg->cra_alignmask > PAGE_SIZE)
return -EINVAL;

down_write(&crypto_alg_sem);

Expand Down
43 changes: 36 additions & 7 deletions trunk/crypto/cipher.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,10 @@ static unsigned int crypt_slow(const struct cipher_desc *desc,
struct scatter_walk *in,
struct scatter_walk *out, unsigned int bsize)
{
u8 src[bsize];
u8 dst[bsize];
unsigned int alignmask = desc->tfm->__crt_alg->cra_alignmask;
u8 buffer[bsize * 2 + alignmask];
u8 *src = (u8 *)ALIGN((unsigned long)buffer, alignmask + 1);
u8 *dst = src + bsize;
unsigned int n;

n = scatterwalk_copychunks(src, in, bsize, 0);
Expand All @@ -59,15 +61,24 @@ static unsigned int crypt_slow(const struct cipher_desc *desc,
static inline unsigned int crypt_fast(const struct cipher_desc *desc,
struct scatter_walk *in,
struct scatter_walk *out,
unsigned int nbytes)
unsigned int nbytes, u8 *tmp)
{
u8 *src, *dst;

src = in->data;
dst = scatterwalk_samebuf(in, out) ? src : out->data;

if (tmp) {
memcpy(tmp, in->data, nbytes);
src = tmp;
dst = tmp;
}

nbytes = desc->prfn(desc, dst, src, nbytes);

if (tmp)
memcpy(out->data, tmp, nbytes);

scatterwalk_advance(in, nbytes);
scatterwalk_advance(out, nbytes);

Expand All @@ -87,6 +98,8 @@ static int crypt(const struct cipher_desc *desc,
struct scatter_walk walk_in, walk_out;
struct crypto_tfm *tfm = desc->tfm;
const unsigned int bsize = crypto_tfm_alg_blocksize(tfm);
unsigned int alignmask = tfm->__crt_alg->cra_alignmask;
unsigned long buffer = 0;

if (!nbytes)
return 0;
Expand All @@ -100,16 +113,27 @@ static int crypt(const struct cipher_desc *desc,
scatterwalk_start(&walk_out, dst);

for(;;) {
unsigned int n;
unsigned int n = nbytes;
u8 *tmp = NULL;

if (!scatterwalk_aligned(&walk_in, alignmask) ||
!scatterwalk_aligned(&walk_out, alignmask)) {
if (!buffer) {
buffer = __get_free_page(GFP_ATOMIC);
if (!buffer)
n = 0;
}
tmp = (u8 *)buffer;
}

scatterwalk_map(&walk_in, 0);
scatterwalk_map(&walk_out, 1);

n = scatterwalk_clamp(&walk_in, nbytes);
n = scatterwalk_clamp(&walk_in, n);
n = scatterwalk_clamp(&walk_out, n);

if (likely(n >= bsize))
n = crypt_fast(desc, &walk_in, &walk_out, n);
n = crypt_fast(desc, &walk_in, &walk_out, n, tmp);
else
n = crypt_slow(desc, &walk_in, &walk_out, bsize);

Expand All @@ -119,10 +143,15 @@ static int crypt(const struct cipher_desc *desc,
scatterwalk_done(&walk_out, 1, nbytes);

if (!nbytes)
return 0;
break;

crypto_yield(tfm);
}

if (buffer)
free_page(buffer);

return 0;
}

static unsigned int cbc_process_encrypt(const struct cipher_desc *desc,
Expand Down
6 changes: 6 additions & 0 deletions trunk/crypto/scatterwalk.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,12 @@ static inline void scatterwalk_advance(struct scatter_walk *walk,
walk->len_this_segment -= nbytes;
}

static inline unsigned int scatterwalk_aligned(struct scatter_walk *walk,
unsigned int alignmask)
{
return !(walk->offset & alignmask);
}

void scatterwalk_start(struct scatter_walk *walk, struct scatterlist *sg);
int scatterwalk_copychunks(void *buf, struct scatter_walk *walk, size_t nbytes, int out);
void scatterwalk_map(struct scatter_walk *walk, int out);
Expand Down
1 change: 1 addition & 0 deletions trunk/include/linux/crypto.h
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,7 @@ struct crypto_alg {
u32 cra_flags;
unsigned int cra_blocksize;
unsigned int cra_ctxsize;
unsigned int cra_alignmask;
const char cra_name[CRYPTO_MAX_ALG_NAME];

union {
Expand Down

0 comments on commit 4157c8e

Please sign in to comment.