>>easy contiguous sector processing The LBA length can be changed with low-level formatting (at least in the factory), so, as I said, if you allowed to change, how much you shift the LBA in I, no (or only more complex) hard-wired optimization (pre-computed tables) would be possible. This was the thinking behind the proposal of LBA<<16.
The polynomial T = I*K2 = (Drive_Index*x^64 + LBA*x^16 + index)*K2. For optimization you can pre-compute Drive_Index*x^64 * K2, and simply XOR it to T' (polynomial addition). Within an LBA: LBA*x^16 * K2 is also constant, to be XOR-ed, so only the index*K2 needs to be computed, with at most 16-bit long indices, in at most 16 shift-XOR cycles (could be pre-computed and taken from a table). If you move from LBA to LBA+1 (arithmetic increment), they could have many different bits. How would you avoid a full Galois multiplication, with up to 48 shift-XOR cycles in the worst case? Why is it any different from moving to an arbitrary other LBA'? >>it's called a key scope, we don't need a new term for it. Compartments and key scopes are different things. >>AES-256 is only slightly larger and slower than AES-128 in hardware We need larger secure (expensive) internal key store, more rounds, slower key transfer, etc. these are serious issues, if you just barely managed to implement AES-128 within the constraints (3GBit/s, consuming only milliwatts in a dye area of less than 1 mm^2...). Laszlo > -------- Original Message -------- > Subject: RE: p1619 (disk): tweak-computation, other > From: "Colin Sinclair" <[EMAIL PROTECTED]> > Date: Wed, December 21, 2005 1:08 pm > To: "SISWG" <[EMAIL PROTECTED]> > > > (b) The "LBA to I mapping" is not quite the right question to discuss, > > it should be "tweak to T mapping". (Recall that T is what you get when > > multiplying I by Key_2.) > > A different proposal is to use two 128-bit values for K2... > > Gents, > > I have to say we need a reality check at this point. There is a real danger > that the standard is > going to get unnecessarily complicated. > > I personally am quite happy with the T = K2.I computation; there is > absolutely nothing to be gained > in security or implementation by splitting this to use multiple K2a,K2b keys > - that just makes it > harder since implementations with ONLY hardware multipliers have to switch > keys which can be time > consuming. > > There is also nothing wrong with the current use of incrementing I values for > sequential cipher > blocks within a sector (and preferably between contiguous power-of-two-sized > sectors too). Changing > to K2.(1<<j) is just silly; an optimised implementation using tables would > have to store 32 K2 > partial products rather than the 5 currently needed (1,3,7,15,31). > > I am still dubious about allowing I=0; I'll go with the flow if most people > agree this is a > non-issue; it is trivial to avoid but if you don't have to it makes it > slightly easier. > > *** All I was originally looking for was a clarification on the way I is > formed: *** > > (a) The endianness is unclear with the current wording of $5.2. We now agree > that I is defined back > to front and that the LS bit of I is on the right, to match the GF > polynomial. I suggest we use "i > =" where i is the integer value which gets encoded bitwise backwards into I. > This can be fixed with > a simple rewrite and a couple of nice pictures. > > (b) How are the I values assigned within a key scope, with the three > scenarios of multiple keyscopes > and/or drives? This could be considered implementation dependent (since I is > not a > drive-user-visible value) and does not even need to go in the standard, but I > feel some guidance > here is necessary. > > By careful choice, nasty binary boundaries during contiguous block processing > can be avoided - we > have already worked out how to do this with minimal effort. I propose that > "i" is formed by this > recommended (but not mandatory) method: > > i = drive_index<<96 + LBA<<n + (0,1,2...j-1), > > where n = ceil(log2(j)), and j = ceil(sector_size/16) are constants > computed at format time. > and drive_index is in range 0..65535 (or start at 1 to avoid I=0: > vendor decision) > > For a single drive with one scope, the index defaults to 0 and the LBA can be > completely unmodified > (apart from shift offset) and the multiplication is as easy as it will ever > get. > > For multiple key scopes on a single drive (partitions?) the LBA used in this > calculation could be > normalised to 0 within the partition/scope, or it could be completely > unmodifed (easier) - just need > to choose either rule and document it. > > For a key scope spanning multiple drives, the index _must_ be varied > accordingly. The controller can > program each connected drive uniquely at power up to ensure the same I value > is never reused within > a key scope (the security proof relies on this assumption). This is most > likely scenario where this > is needed is a RAID application, I think. > > > We seem to have enough bits in I for partitioning: 64-bit drive ID, > > 48-bit LBA (up to 140,737 TB disks with 512-byte LBAs), 16-bit > > cipher-block index, so one K2 key looks sufficient. > > This is just a trivial variant of the proposal above. It's not as friendly > because it doesn't allow > easy contiguous sector processing (unless you have 64K*16 byte sectors). > Maybe the > cipher-block-index & LBA alignment I proposed should be mandatory, and the > drive_index/drive_ID part > made recommended. Using a 64-bit drive ID rather than a simple index is > slightly more work for no > security benefit and should be the vendors choice. > > > In this regard there is no difference between the drive and the LBA index: > > in both > > cases you do not expect sequential access, so you might as well pack them > > both in > > one "compartment index". > > I disagree that random access within the LBA is the norm. An application may > perform lots of > contiguous sector accesses and we don't want to make that inefficient by > mandating composition of I > badly. > > > Although this standard is specifically for disk, I still think that there > > is a wide variety of disks and virtualized disks out there, and I prefer > > not to tie the standard too much to one of them. So I prefer that the part > > of the standard that specifies the transform would be stated using > > "technology neutral" terms (such as "compartments"). > > The current standard defines just that - it's called a key scope, we don't > need a new term for it. > What needs to be made clear is how the key scopes are utilised in some > typical scenarios, using > examples with familiar terms such as LBA and drive_index used to formt he > block index within the key > scope, "i". > > > Other things: > > > that the standard is intended to protect data at rest, and *not* in transit > > Agreed. If you want to implement LRW externally to the drive you must ensure > the controller-drive > connection is appropriately secure, either physically in a strong box or > using an appropriate > encapsulating security protocol with non-repeating nonces and frequent > re-keying. IPsec or MacSec > are approriate here. Perhaps this can be made clear in the introduction? > > >> You did not comment on my real proposal of using AES keys K1, K1+K2, > >> K1+K2^2,..., if you want to differentiate between disk drives. > > There are many techniques of generating multiple smaller keys from larger > master keying material > using well-understood PRFs with nonces (ie, drive index). Why not use one? > > >>Didn't we mandate 256-bit AES? > > We should not. The most important application (in hundreds of million > > disk drives a year, a $10 billion business) is protection of data on > > laptop drives. These drives must consume little power, must be cheap, > > so the difference in HW complexity precludes anything but AES-128. > > I totally disagree. AES-256 is only slightly larger and slower than AES-128 > in hardware; it's even > closer in area provided you don't change the key too frequently (ie random > access in multiple > scopes). > > Colin.