Patch title: Release 94 bulk changes
Abstract:
File: /pliant/util/crypto/random.pli
Key:
    Removed line
    Added line
   
abstract
  [A true and strong pseudo random generator.] ; eol


function memory_true_random buffer size study
  arg Address buffer ; arg Int size ; arg CBool study
  var Int done := 0
  if random_device<>""
abstract
  [A true and strong pseudo random generator.] ; eol


function memory_true_random buffer size study
  arg Address buffer ; arg Int size ; arg CBool study
  var Int done := 0
  if random_device<>""
    (var Stream rd) open random_device in+nocache
    while done<size and (os_socket_wait rd:stream_handle in 
    (var Stream rd) open random_device in+safe+nocache
    while done<size and (os_socket_wait rd:stream_handle in 15)=success
      os_read rd:stream_handle (buffer translate Byte done) 
    if done=size
      return
    else
      console "Timeout reading OS random device." eol
  if fast_weak_generator
    module "/pliant/admin/md5.pli"
    var RC4Ctx ctx
    var DateTime start := datetime
    var Str all := ""
    while datetime:seconds-start:seconds<2 or all:len<64
      all += datetime_string
      if all:len>=431
        all := (all all:len-297 all:len)+string_md5_binary_s
      rc4_init ctx all cipher_init_laps
    for (var Int i) done size-1
      (buffer translate uInt8 i) map uInt8 := rc4_byte:ctx .
    wait_time := 2^0.5
  else
    part generate
      if trace
        var DateTime start := datetime
      var Int last := 0 ; var Int same := 0 ; var Int ones :
      memory_clear buffer size
      var Int bits := 8*size
      for (var Int i) 0 bits-1
        sleep wait_time
        var Pointer:uInt8 b :> (buffer translate uInt8 i\8) 
        var Int r := random_bit
        b := b .or. r*2^(i%8)
        if r=last
          same += 1
        ones += r
        last := r
      if study
        var Float same_ratio := same/bits
        var Float ones_ratio := ones/bits
        var Float delta := 0.1 # 1/bits^0.5
        var CBool biased := (abs same_ratio-0.5)>delta or (a
        if trace
          console "generated " bits " random bits (sleep " w
        if biased
          console "The random seed is biased. "
          if wait_time<2
            console "retrying." eol
            wait_time *= shunt wait_time<0.5 2.6 1.3
            restart generate
          else
            console "surrendering." eol



      os_read rd:stream_handle (buffer translate Byte done) 
    if done=size
      return
    else
      console "Timeout reading OS random device." eol
  if fast_weak_generator
    module "/pliant/admin/md5.pli"
    var RC4Ctx ctx
    var DateTime start := datetime
    var Str all := ""
    while datetime:seconds-start:seconds<2 or all:len<64
      all += datetime_string
      if all:len>=431
        all := (all all:len-297 all:len)+string_md5_binary_s
      rc4_init ctx all cipher_init_laps
    for (var Int i) done size-1
      (buffer translate uInt8 i) map uInt8 := rc4_byte:ctx .
    wait_time := 2^0.5
  else
    part generate
      if trace
        var DateTime start := datetime
      var Int last := 0 ; var Int same := 0 ; var Int ones :
      memory_clear buffer size
      var Int bits := 8*size
      for (var Int i) 0 bits-1
        sleep wait_time
        var Pointer:uInt8 b :> (buffer translate uInt8 i\8) 
        var Int r := random_bit
        b := b .or. r*2^(i%8)
        if r=last
          same += 1
        ones += r
        last := r
      if study
        var Float same_ratio := same/bits
        var Float ones_ratio := ones/bits
        var Float delta := 0.1 # 1/bits^0.5
        var CBool biased := (abs same_ratio-0.5)>delta or (a
        if trace
          console "generated " bits " random bits (sleep " w
        if biased
          console "The random seed is biased. "
          if wait_time<2
            console "retrying." eol
            wait_time *= shunt wait_time<0.5 2.6 1.3
            restart generate
          else
            console "surrendering." eol