On Tue, Oct 09, 2018 at 04:50:16PM +0200, Alberto Garcia wrote: > On Tue 09 Oct 2018 02:55:38 PM CEST, Daniel P. Berrangé wrote: > > > @@ -85,7 +90,7 @@ void xts_decrypt(const void *datactx, > > uint8_t *dst, > > const uint8_t *src) > > { > > - uint8_t PP[XTS_BLOCK_SIZE], CC[XTS_BLOCK_SIZE], T[XTS_BLOCK_SIZE]; > > + xts_uint128 PP, CC, T; > > unsigned long i, m, mo, lim; > > [...] > > > /* Pm = first length % XTS_BLOCK_SIZE bytes of PP */ > > for (i = 0; i < mo; i++) { > > - CC[i] = src[XTS_BLOCK_SIZE + i]; > > - dst[XTS_BLOCK_SIZE + i] = PP[i]; > > + ((uint8_t *)&CC)[i] = src[XTS_BLOCK_SIZE + i]; > > + dst[XTS_BLOCK_SIZE + i] = ((uint8_t *)&PP)[i]; > > } > > On second thoughts, these casts are a bit cumbersome. I wonder if it > isn't better to keep the array a uint8_t[] and only treat it as > xts_uint128 in the places where you actually do 64-bit operations > (xts_uint128_xor, xts_mult_x).
I had done that originally, but it just shifts ugly casts from one place to another place in the code. I preferred the idea of storing it all as a 128bit data type since that's matching the operational block size. A further alternative is for xts_uint128 to be a union providing both, and then have an extra level of access for respective fields, which I had also tried at one time but ultimately i decided I didn't mind the casts. Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|