[BACK]Return to subr_cprng.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / kern

Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.

Diff for /src/sys/kern/subr_cprng.c between version 1.14 and 1.15

version 1.14, 2012/11/20 11:06:27 version 1.15, 2013/01/26 16:05:34
Line 84  cprng_strong_doreseed(cprng_strong_t *co
Line 84  cprng_strong_doreseed(cprng_strong_t *co
                                  &cc, sizeof(cc))) {                                   &cc, sizeof(cc))) {
                 panic("cprng %s: nist_ctr_drbg_reseed failed.", c->name);                  panic("cprng %s: nist_ctr_drbg_reseed failed.", c->name);
         }          }
           memset(c->reseed.data, 0, c->reseed.len);
   
 #ifdef RND_VERBOSE  #ifdef RND_VERBOSE
         printf("cprng %s: reseeded with rnd_filled = %d\n", c->name,          printf("cprng %s: reseeded with rnd_filled = %d\n", c->name,
                                                             rnd_filled);                                                              rnd_filled);
Line 154  cprng_strong_reseed(void *const arg)
Line 156  cprng_strong_reseed(void *const arg)
         mutex_exit(&c->mtx);          mutex_exit(&c->mtx);
 }  }
   
   static size_t
   cprng_entropy_try(uint8_t *key, size_t keylen, int hard)
   {
           int r;
           r = rnd_extract_data(key, keylen, RND_EXTRACT_GOOD);
           if (r != keylen && !hard) {
                   rnd_extract_data(key + r, keylen - r, RND_EXTRACT_ANY);
           }
           return r;
   }
   
 cprng_strong_t *  cprng_strong_t *
 cprng_strong_create(const char *const name, int ipl, int flags)  cprng_strong_create(const char *const name, int ipl, int flags)
 {  {
Line 183  cprng_strong_create(const char *const na
Line 196  cprng_strong_create(const char *const na
   
         selinit(&c->selq);          selinit(&c->selq);
   
         r = rnd_extract_data(key, sizeof(key), RND_EXTRACT_GOOD);          r = cprng_entropy_try(key, sizeof(key), c->flags & CPRNG_INIT_ANY);
         if (r != sizeof(key)) {          if (r != sizeof(key)) {
                 if (c->flags & CPRNG_INIT_ANY) {                  if (c->flags & CPRNG_INIT_ANY) {
 #ifdef DEBUG  #ifdef DEBUG
                         printf("cprng %s: WARNING insufficient "                          printf("cprng %s: WARNING insufficient "
                                "entropy at creation.\n", name);                                 "entropy at creation.\n", name);
 #endif  #endif
                         rnd_extract_data(key + r, sizeof(key - r),  
                                          RND_EXTRACT_ANY);  
                 } else {                  } else {
                         hard++;                          hard++;
                 }                  }
Line 240  rekeyany:
Line 251  rekeyany:
                 if (c->flags & CPRNG_REKEY_ANY) {                  if (c->flags & CPRNG_REKEY_ANY) {
                         uint8_t key[NIST_BLOCK_KEYLEN_BYTES];                          uint8_t key[NIST_BLOCK_KEYLEN_BYTES];
   
                         printf("cprng %s: WARNING pseudorandom rekeying.\n",                          if (cprng_entropy_try(key, sizeof(key), 0) !=
                                c->name);                              sizeof(key)) {
                         rnd_extract_data(key, sizeof(key), RND_EXTRACT_ANY);                                  printf("cprng %s: WARNING "
                                          "pseudorandom rekeying.\n", c->name);
                           }
                         cc = cprng_counter();                          cc = cprng_counter();
                         if (nist_ctr_drbg_reseed(&c->drbg, key, sizeof(key),                          if (nist_ctr_drbg_reseed(&c->drbg, key, sizeof(key),
                             &cc, sizeof(cc))) {                              &cc, sizeof(cc))) {
                                 panic("cprng %s: nist_ctr_drbg_reseed "                                  panic("cprng %s: nist_ctr_drbg_reseed "
                                       "failed.", c->name);                                        "failed.", c->name);
                         }                          }
                           memset(key, 0, sizeof(key));
                 } else {                  } else {
                         int wr;                          int wr;
   

Legend:
Removed from v.1.14  
changed lines
  Added in v.1.15

CVSweb <webmaster@jp.NetBSD.org>