Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / crypto / digest.c
index 30dabe2..61a7676 100644 (file)
@@ -27,16 +27,38 @@ static void update(struct crypto_tfm *tfm,
                    struct scatterlist *sg, unsigned int nsg)
 {
        unsigned int i;
-       
+
        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);
+
+               struct page *pg = sg[i].page;
+               unsigned int offset = sg[i].offset;
+               unsigned int l = sg[i].length;
+
+               do {
+                       unsigned int bytes_from_page = min(l, ((unsigned int)
+                                                          (PAGE_SIZE)) - 
+                                                          offset);
+                       char *p = crypto_kmap(pg, 0) + offset;
+
+                       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++;
+                       l -= bytes_from_page;
+               } while (l > 0);
        }
 }
 
+static void update_kernel(struct crypto_tfm *tfm,
+                         const void *data, size_t count)
+{
+       tfm->__crt_alg->cra_digest.dia_update(crypto_tfm_ctx(tfm), data, count);
+       crypto_yield(tfm);
+}
+
 static void final(struct crypto_tfm *tfm, u8 *out)
 {
        tfm->__crt_alg->cra_digest.dia_final(crypto_tfm_ctx(tfm), out);
@@ -79,6 +101,7 @@ 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;