ASSUMPTIONS
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:5k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. Assumptions
  2. ===========
  3. The Yarrow design, described in "Yarrow-160: Notes on the Design and
  4. Analysis of the Yarrow Cryptographic Pseudonumber Generator" by John
  5. Kelsey, Bruce Schneier and Niels Ferguson of Counterpane Systems
  6. (available from http://www.counterpane.com/yarrow.html), left out some
  7. implementation details and has some ambiguities in the protocol.  ZKS
  8. has to made some assumptions and taken some decisions in its
  9. implementation of Yarrow. In the text, `we' represents ZKS.
  10. Here is the list of those assumptions: 
  11. 1) To simplify the code and speed up running time, we limit the number
  12. of different sources to 20. This should be enough for most
  13. applications. This can be changed by redefining YARROW_MAX_SOURCE in
  14. yarrow.h.
  15. 2) The Yarrow paper (in section 5.3) state that Pt is either
  16. implementation dependent or dynamically adjusted. We chose to fix the
  17. slow pool's Pt to 100 and the fast pool's Pt to 10. This can be
  18. changed by redefining YARROW_FAST_PT and YARROW_SLOW_PT in yarrow.c.
  19. 3) Initialization when there is no saved state is not discussed in the
  20. Yarrow paper.  We have defined that CPRNG is becomes seeded after a
  21. slow reseed.  During initialization, a slow reseed is triggered by
  22. YARROW_K_OF_N_INIT_THRESH sources reaching the slow threshold
  23. YARROW_SLOW_INIT_THRESH.  During initialization, fast reseeds are
  24. triggered when a source reaches the fast threshold
  25. YARROW_FAST_INIT_THRESH.  After reseed the behavior of the pools is
  26. controlled by YARROW_K_OF_N_THRESH, YARROW_SLOW_THRESH and
  27. YARROW_FAST_THRESH.  
  28. Our default values for YARROW_K_OF_N_INIT_THRESH,
  29. YARROW_SLOW_INIT_THRESH and YARROW_FAST_INIT_THRESH are the same as
  30. YARROW_K_OF_N_THRESH, YARROW_SLOW_THRESH and YARROW_FAST_THRESH
  31. respectively.  Note this means that a Yarrow_Poll call by itself can
  32. never put us in an initialized state, as it only works on one pool,
  33. and the default YARROW_K_OF_N_INIT_THRESH value is 2.
  34. 4) We define a function Yarrow_Poll which can gather entropy.  The
  35. user must allocate a source_id, and call Yarrow_Poll manually.
  36. Yarrow_Poll just adds samples from the machines state to the source
  37. given as an argument.
  38. 5) Prior to initialization, Yarrow_Output will fail.
  39. 6) The actions to take on state load are not described in the yarrow
  40. paper, all it says is that 2k bytes should be written (and by
  41. implication read back in somehow).  We read in the 2k bytes, hash
  42. them into the fast pool, and then do a forced fast reseed, and an
  43. immediate state save.
  44. 7) In step 2 of the reseed process, we must hash the value i. The
  45. representation of this integer will affect the hash value. In our
  46. code, i is a 64-bit unsigned value. We update the hash context using
  47. the 64 bit big endian representation of i.
  48. 8) Yarrow outputs random bits in blocks. If the calling function
  49. requests less bits than available, then the unused bits are kept
  50. in memory until the next call. In case of a reseed, we chose to 
  51. discard those leftover bits.
  52. 9) The samples from one source must alternate between the two pools.
  53. As a default, we initialize the first pool to send the sample too to
  54. be the fast pool. This initialization is done only when a source is
  55. added, not when we reseed from one.
  56. 10) The Yarrow paper states that the maximum number of outputs between
  57. reseeding is limited to min(2^n,2^(k/3)*Pg), but does not explain
  58. what is to happen when this limit is reached. It could be the case
  59. that we reach the limit but there is not enough entropy in the pools 
  60. to reseed. In our code, the Yarrow_Output_Block will do a forced
  61. fast reseed. 
  62. 11) In the Yarrow paper, the limit on the number of outputs between
  63. reseeding is expressed in number of outputs:
  64. #oututs <= min(2^n, 2^(k/3).Pg)
  65. but we redefine it in terms of gates by dividing the numbers by Pg,
  66. the number of outputs per gate, and counting the number of gates
  67. instead.  This makes an overflow a little less likely.
  68. We don't use a bignum library, so in event of overflow, the limit in
  69. number of gates before reseed (y->gates_limit) is reduced down to
  70. 2^64-1 (or 2^32-1 if 64 bit ints aren't available on the platform).
  71. 12) The Yarrow paper describes that the cipher block C should be 
  72. incremented as part of the output function.  We treat the bytes
  73. of C as a big endian number to do the increment.
  74. 13) Triple-DES key size.  The yarrow paper uses the letter k to
  75. represent the keysize in bits.  Due to the parity bits, the size of k
  76. is 192 bits.  However the effective key size is actually 168 bits, as
  77. the value of k is used in security limits, k must be 168 bits.  The
  78. paper uses k (eg set K to the next k output bits), so we have to do
  79. the parity padding function, to copy bits 0-6 to 0-7, 7-13 to 8-15
  80. etc.  The macro DES_Init performs the function of doing a DES key
  81. schedule from a packed key (no parity bits), internally doing the
  82. parity padding.  Other ciphers are simpler as there is no parity.