On Mon, Mar 07, 2016 at 01:51:40PM +0800, Fam Zheng wrote:
> On Mon, 02/29 12:00, Daniel P. Berrange wrote:
> > The LUKS format specifies an anti-forensic split algorithm which
> > is used to artificially expand the size of the key material on
> > disk. This is an implementation of that algorithm.
> > 
> > Signed-off-by: Daniel P. Berrange <berra...@redhat.com>
> > ---
> >  crypto/Makefile.objs        |   1 +
> >  crypto/afsplit.c            | 158 ++++++++++++++++++++++++++++++++++++
> >  include/crypto/afsplit.h    | 135 +++++++++++++++++++++++++++++++
> >  tests/.gitignore            |   1 +
> >  tests/Makefile              |   2 +
> >  tests/test-crypto-afsplit.c | 190 
> > ++++++++++++++++++++++++++++++++++++++++++++
> >  6 files changed, 487 insertions(+)
> >  create mode 100644 crypto/afsplit.c
> >  create mode 100644 include/crypto/afsplit.h
> >  create mode 100644 tests/test-crypto-afsplit.c
> > 

> > +static int qcrypto_afsplit_hash(QCryptoHashAlgorithm hash,
> > +                                size_t blocklen,
> > +                                uint8_t *block,
> > +                                Error **errp)
> > +{
> > +    size_t digestlen = qcrypto_hash_digest_len(hash);
> > +
> > +    size_t hashcount = blocklen / digestlen;
> 
> Do you want to use DIV_ROUND_UP? Because if blocklen < digestlen, hashcount is
> 0, and your for loop below will be skipped.

It is not needed actually - look a couple of lines
further where we do  'if (finallen) { hashcount ++ }'.
This achieves the same end result.

> 
> Fam
> 
> > +    size_t finallen = blocklen % digestlen;
> > +    uint32_t i;
> > +
> > +    if (finallen) {
> > +        hashcount++;
> > +    } else {
> > +        finallen = digestlen;
> > +    }
> > +
> > +    for (i = 0; i < hashcount; i++) {
> > +        uint8_t *out = NULL;
> > +        size_t outlen = 0;
> > +        uint32_t iv = cpu_to_be32(i);
> > +        struct iovec in[] = {
> > +            { .iov_base = &iv,
> > +              .iov_len = sizeof(iv) },
> > +            { .iov_base = block + (i * digestlen),
> > +              .iov_len = (i == (hashcount - 1)) ? finallen : digestlen },
> > +        };
> > +
> > +        if (qcrypto_hash_bytesv(hash,
> > +                                in,
> > +                                G_N_ELEMENTS(in),
> > +                                &out, &outlen,
> > +                                errp) < 0) {
> > +            return -1;
> > +        }
> > +
> > +        assert(outlen == digestlen);
> > +        memcpy(block + (i * digestlen), out,
> > +               (i == (hashcount - 1)) ? finallen : digestlen);
> > +        g_free(out);
> > +    }
> > +
> > +    return 0;
> > +}

Regards,
Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|

Reply via email to