X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=crypto%2Fdigest.c;fp=crypto%2Fdigest.c;h=d9b6ac9dbf8d08e8ae88572c71f93d132a10df25;hb=64ba3f394c830ec48a1c31b53dcae312c56f1604;hp=c4dd9f26acc047aa67606c6e5cfa99ba44a78f17;hpb=be1e6109ac94a859551f8e1774eb9a8469fe055c;p=linux-2.6.git diff --git a/crypto/digest.c b/crypto/digest.c index c4dd9f26a..d9b6ac9db 100644 --- a/crypto/digest.c +++ b/crypto/digest.c @@ -20,14 +20,13 @@ static void init(struct crypto_tfm *tfm) { - tfm->__crt_alg->cra_digest.dia_init(tfm); + tfm->__crt_alg->cra_digest.dia_init(crypto_tfm_ctx(tfm)); } static void update(struct crypto_tfm *tfm, struct scatterlist *sg, unsigned int nsg) { unsigned int i; - unsigned int alignmask = crypto_tfm_alg_alignmask(tfm); for (i = 0; i < nsg; i++) { @@ -39,22 +38,12 @@ static void update(struct crypto_tfm *tfm, unsigned int bytes_from_page = min(l, ((unsigned int) (PAGE_SIZE)) - offset); - char *src = crypto_kmap(pg, 0); - char *p = src + offset; + char *p = crypto_kmap(pg, 0) + offset; - if (unlikely(offset & alignmask)) { - unsigned int bytes = - alignmask + 1 - (offset & alignmask); - bytes = min(bytes, bytes_from_page); - tfm->__crt_alg->cra_digest.dia_update(tfm, p, - bytes); - p += bytes; - bytes_from_page -= bytes; - l -= bytes; - } - tfm->__crt_alg->cra_digest.dia_update(tfm, p, - bytes_from_page); - crypto_kunmap(src, 0); + tfm->__crt_alg->cra_digest.dia_update + (crypto_tfm_ctx(tfm), p, + bytes_from_page); + crypto_kunmap(p, 0); crypto_yield(tfm); offset = 0; pg++; @@ -63,24 +52,9 @@ static void update(struct crypto_tfm *tfm, } } -static void update_kernel(struct crypto_tfm *tfm, - const void *data, size_t count) -{ - tfm->__crt_alg->cra_digest.dia_update(tfm, data, count); - crypto_yield(tfm); -} - static void final(struct crypto_tfm *tfm, u8 *out) { - unsigned long alignmask = crypto_tfm_alg_alignmask(tfm); - if (unlikely((unsigned long)out & alignmask)) { - unsigned int size = crypto_tfm_alg_digestsize(tfm); - u8 buffer[size + alignmask]; - u8 *dst = (u8 *)ALIGN((unsigned long)buffer, alignmask + 1); - tfm->__crt_alg->cra_digest.dia_final(tfm, dst); - memcpy(out, dst, size); - } else - tfm->__crt_alg->cra_digest.dia_final(tfm, out); + tfm->__crt_alg->cra_digest.dia_final(crypto_tfm_ctx(tfm), out); } static int setkey(struct crypto_tfm *tfm, const u8 *key, unsigned int keylen) @@ -88,15 +62,25 @@ static int setkey(struct crypto_tfm *tfm, const u8 *key, unsigned int keylen) u32 flags; if (tfm->__crt_alg->cra_digest.dia_setkey == NULL) return -ENOSYS; - return tfm->__crt_alg->cra_digest.dia_setkey(tfm, key, keylen, &flags); + return tfm->__crt_alg->cra_digest.dia_setkey(crypto_tfm_ctx(tfm), + key, keylen, &flags); } static void digest(struct crypto_tfm *tfm, struct scatterlist *sg, unsigned int nsg, u8 *out) { - init(tfm); - update(tfm, sg, nsg); - final(tfm, out); + unsigned int i; + + tfm->crt_digest.dit_init(tfm); + + for (i = 0; i < nsg; i++) { + char *p = crypto_kmap(sg[i].page, 0) + sg[i].offset; + tfm->__crt_alg->cra_digest.dia_update(crypto_tfm_ctx(tfm), + p, sg[i].length); + crypto_kunmap(p, 0); + crypto_yield(tfm); + } + crypto_digest_final(tfm, out); } int crypto_init_digest_flags(struct crypto_tfm *tfm, u32 flags) @@ -110,7 +94,6 @@ int crypto_init_digest_ops(struct crypto_tfm *tfm) ops->dit_init = init; ops->dit_update = update; - ops->dit_update_kernel = update_kernel; ops->dit_final = final; ops->dit_digest = digest; ops->dit_setkey = setkey;