[CRYPTO] geode: use consistent IV copy
authorSebastian Siewior <sebastian@breakpoint.cc>
Sun, 21 Oct 2007 08:04:23 +0000 (16:04 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Thu, 10 Jan 2008 21:16:04 +0000 (08:16 +1100)
It is enough if the IV is copied before and after the while loop.
With DM-Crypt is seems not be required to save the IV after encrytion
because a new one is used in the request (dunno about other users).
It is not save to load the IV within while loop and not save afterwards
because we mill end up with the wrong IV if the request goes consists
of more than one page.

Signed-off-by: Sebastian Siewior <sebastian@breakpoint.cc>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/geode-aes.c

index 5008a1cddffbcae8d40c64d43640cdffdf2d6ff6..6c04f1363e6d492250aec5b2d3a7cc5f2cab7617 100644 (file)
@@ -226,6 +226,7 @@ geode_cbc_decrypt(struct blkcipher_desc *desc,
 
        blkcipher_walk_init(&walk, dst, src, nbytes);
        err = blkcipher_walk_virt(desc, &walk);
 
        blkcipher_walk_init(&walk, dst, src, nbytes);
        err = blkcipher_walk_virt(desc, &walk);
+       memcpy(op->iv, walk.iv, AES_IV_LENGTH);
 
        while((nbytes = walk.nbytes)) {
                op->src = walk.src.virt.addr,
 
        while((nbytes = walk.nbytes)) {
                op->src = walk.src.virt.addr,
@@ -234,16 +235,13 @@ geode_cbc_decrypt(struct blkcipher_desc *desc,
                op->len = nbytes - (nbytes % AES_MIN_BLOCK_SIZE);
                op->dir = AES_DIR_DECRYPT;
 
                op->len = nbytes - (nbytes % AES_MIN_BLOCK_SIZE);
                op->dir = AES_DIR_DECRYPT;
 
-               memcpy(op->iv, walk.iv, AES_IV_LENGTH);
-
                ret = geode_aes_crypt(op);
 
                ret = geode_aes_crypt(op);
 
-               memcpy(walk.iv, op->iv, AES_IV_LENGTH);
                nbytes -= ret;
                nbytes -= ret;
-
                err = blkcipher_walk_done(desc, &walk, nbytes);
        }
 
                err = blkcipher_walk_done(desc, &walk, nbytes);
        }
 
+       memcpy(walk.iv, op->iv, AES_IV_LENGTH);
        return err;
 }
 
        return err;
 }
 
@@ -258,6 +256,7 @@ geode_cbc_encrypt(struct blkcipher_desc *desc,
 
        blkcipher_walk_init(&walk, dst, src, nbytes);
        err = blkcipher_walk_virt(desc, &walk);
 
        blkcipher_walk_init(&walk, dst, src, nbytes);
        err = blkcipher_walk_virt(desc, &walk);
+       memcpy(op->iv, walk.iv, AES_IV_LENGTH);
 
        while((nbytes = walk.nbytes)) {
                op->src = walk.src.virt.addr,
 
        while((nbytes = walk.nbytes)) {
                op->src = walk.src.virt.addr,
@@ -266,13 +265,12 @@ geode_cbc_encrypt(struct blkcipher_desc *desc,
                op->len = nbytes - (nbytes % AES_MIN_BLOCK_SIZE);
                op->dir = AES_DIR_ENCRYPT;
 
                op->len = nbytes - (nbytes % AES_MIN_BLOCK_SIZE);
                op->dir = AES_DIR_ENCRYPT;
 
-               memcpy(op->iv, walk.iv, AES_IV_LENGTH);
-
                ret = geode_aes_crypt(op);
                nbytes -= ret;
                err = blkcipher_walk_done(desc, &walk, nbytes);
        }
 
                ret = geode_aes_crypt(op);
                nbytes -= ret;
                err = blkcipher_walk_done(desc, &walk, nbytes);
        }
 
+       memcpy(walk.iv, op->iv, AES_IV_LENGTH);
        return err;
 }
 
        return err;
 }