I updated my webrev with review comments from Dan and Ferenc. The updated webrev is at:
http://cr.opensolaris.org/~haimay/CR6703956-v1/ Please reply by Friday 10/24/08. Thanks, Hai-May Hai-May Chao wrote: > Dan, > > Thanks for your review comments. My responses are inline. > > Dan Anderson wrote: > >> FILE usr/src/uts/common/crypto/api/kcf_random.c >> >> 580 #define RND_CPU_PAD (RND_CPU_PAD_SIZE - \ >> 581 (sizeof (kmutex_t) + 3*sizeof (uint8_t *) + sizeof >> (HMAC_KEYSCHED) + \ >> 582 sizeof (uint64_t) + 3*sizeof (uint32_t) + sizeof >> (rnd_stats_t))) + \ >> 583 15*sizeof (uint32_t) >> >> DEA-1. This won't work in computing the correct padding size. Field >> rnd_stats_t has 64-bit integers and are aligned on 0mod8 byte boundaries on >> SPARC or x86/64-bit and, on x86/32-bit, 0mod4 byte boundaries. >> >> But from reading the comments, it seems like the padding size doesn't have >> to be exact. It appears that if the padding is greater than that necessary, >> the purpose is accomplished here (that is, exceed the cache-line size). >> >> Otherwise, a way to avoid padding is to order the 64-bit structure elements >> first, followed by 32-bit elements, and so forth. >> >> > > Agreed. Took a general solution that we change the code to use two > structures > suggested by Ferenc. > > #define RND_CPU_CACHE_SIZE 64 > #define RND_CPU_PAD_SIZE RND_CPU_CACHE_SIZE*6 > #define RND_CPU_PAD (RND_CPU_PAD_SIZE - \ > sizeof(rndmag_t)) > > typedef struct rndmag_s > { > kmutex_t rm_lock; > uint8_t *rm_buffer; /* Start of buffer */ > uint8_t *rm_eptr; /* End of buffer */ > uint8_t *rm_rptr; /* Current read pointer */ > HMAC_KEYSCHED rm_ks; /* seed */ > uint64_t rm_counter; /* rotating counter for extracting */ > uint32_t rm_oblocks; /* time to rekey? */ > uint32_t rm_ofuzz; /* Rekey backoff state */ > uint32_t rm_olimit; /* Hard rekey limit */ > rnd_stats_t rm_stats; /* Per-CPU Statistics */ > uint32_t rm_key[SHA1WORDS]; /* FIP XKEY */ > uint32_t rm_seed[SHA1WORDS]; /* seed for rekey */ > uint32_t rm_previous[SHA1WORDS]; /* previous random bytes */ > } rndmag_t; > > typedef struct rndmag_pad_s > { > rndmag_t rm_mag; > uint8_t rm_pad[RND_CPU_PAD]; > } rndmag_pad_t; > > and changed all the usages. > > > >> 702 bcopy((uint8_t *)tempout, (uint8_t *)rmp->rm_previous, >> 703 HASHSIZE); >> 833 bcopy((uint8_t *)rmp->rm_seed, (uint8_t >> *)rmp->rm_previous, >> 834 HMAC_KEYSIZE); >> DEA-2. Casting uint8_t* is not needed for bcopy() as the bcopy prototype >> uses void*. >> The casting may be needed for other functions, but not bcopy(). >> void* has no alignment or type restriction. >> >> >> > > Ok. removed the casting. > > > >> FILE usr/src/uts/common/crypto/io/swrand.c >> 258 bcopy((uint8_t *)swrand_XKEY, (uint8_t *)previous_bytes, >> HASHSIZE); >> 387 bcopy(digest, (uint8_t *)digest32, HASHSIZE); >> 409 bcopy((uint8_t *)tempout, (uint8_t *)previous_bytes, >> HASHSIZE); >> 410 >> 414 bcopy((uint8_t *)tempout + bytes, >> 415 leftover, leftover_bytes); >> >> See comment above, DEA-2. >> >> > > Ok. removed the casting. > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://mail.opensolaris.org/pipermail/crypto-discuss/attachments/20081021/4633994d/attachment.html>