Patch title: Release 85 bulk changes
Abstract:
File: /pliant/util/crypto/channel.pli
Key:
    Removed line
    Added line
   
abstract
  [This is complete secured channel implementation, but it's
  list
    item [it has not been seriously review yet.]
    item [the legal maximum key size is too low.]


method fs open name options flags stream support -> status
  arg_rw SecuredFileSystem fs ; arg Str name options ; arg I
  var TraceSession log
  if (name parse "/server/" (var Int port))
    log bind server_trace
    # this is the server side: this code is executed on the 
    var Link:Stream s
    if addressof:support<>null
      s :> support
    else
      var Link:Stream s :> new Stream
      s open "tcp:/server/"+string:port "" in+out+(flags .an
      if s=failure
        log trace "Failed to connect to " s:name
        return (failure "failed to listen TCP port "+string:
    # receive the client seed
    var Str server_site := ""
    var Str client_site := ""
    var Str client_user := ""
    var Str client_seed := ""
    var Int client_laps := undefined
    var CBool query_client := false
    var CBool query_server := false
    var Str encoding := ""
    while not s:atend and { var Str l := s:readline ; l<>"" 
      if (l parse "server-site:" any:(var Str encoded))
        server_site := base64_decode encoded
      eif backward_compatibility and (l parse "server-user:"
        server_site := base64_decode encoded
      eif (l parse "client-site:" any:(var Str encoded))
        client_site := base64_decode encoded
      eif (l parse "client-user:" any:(var Str encoded))
        client_user := base64_decode encoded
      eif (l parse "seed-rc4:" any:(var Str encoded))
        client_seed := base64_decode encoded
      eif (l parse "laps-rc4:" (var Int i))
        client_laps := i
      eif (l parse "query-client-key")
        query_client := true
      eif (l parse "query-server-key")
        query_server := true
      eif (l parse "encoding:" any:(var Str enc)) and (enc="
        encoding := enc
    if query_client
      if client_site<>""
        var Str client_public := name_database:data:host:cli
        if client_public=""
          client_public := site:client_site public_key
        s writeline "client-key: "+client_public
      else
abstract
  [This is complete secured channel implementation, but it's
  list
    item [it has not been seriously review yet.]
    item [the legal maximum key size is too low.]


method fs open name options flags stream support -> status
  arg_rw SecuredFileSystem fs ; arg Str name options ; arg I
  var TraceSession log
  if (name parse "/server/" (var Int port))
    log bind server_trace
    # this is the server side: this code is executed on the 
    var Link:Stream s
    if addressof:support<>null
      s :> support
    else
      var Link:Stream s :> new Stream
      s open "tcp:/server/"+string:port "" in+out+(flags .an
      if s=failure
        log trace "Failed to connect to " s:name
        return (failure "failed to listen TCP port "+string:
    # receive the client seed
    var Str server_site := ""
    var Str client_site := ""
    var Str client_user := ""
    var Str client_seed := ""
    var Int client_laps := undefined
    var CBool query_client := false
    var CBool query_server := false
    var Str encoding := ""
    while not s:atend and { var Str l := s:readline ; l<>"" 
      if (l parse "server-site:" any:(var Str encoded))
        server_site := base64_decode encoded
      eif backward_compatibility and (l parse "server-user:"
        server_site := base64_decode encoded
      eif (l parse "client-site:" any:(var Str encoded))
        client_site := base64_decode encoded
      eif (l parse "client-user:" any:(var Str encoded))
        client_user := base64_decode encoded
      eif (l parse "seed-rc4:" any:(var Str encoded))
        client_seed := base64_decode encoded
      eif (l parse "laps-rc4:" (var Int i))
        client_laps := i
      eif (l parse "query-client-key")
        query_client := true
      eif (l parse "query-server-key")
        query_server := true
      eif (l parse "encoding:" any:(var Str enc)) and (enc="
        encoding := enc
    if query_client
      if client_site<>""
        var Str client_public := name_database:data:host:cli
        if client_public=""
          client_public := site:client_site public_key
        s writeline "client-key: "+client_public
      else
        s writeline "client-key: "+user:client_user:public_k
        var Str client_public := user:client_user public_key
        s writeline "client-key: "+client_public
    if query_server
      var Str server_public := name_database:data:host:serve
    if query_server
      var Str server_public := name_database:data:host:serve
      if server_public=""
      if server_public<>""
        if not (server_public parse word:"rsa" _ any:(var Str part1a) _ any ) or not (name_secret_database:data:host:server_site:private_key parse word:"rsa" _ any:(var Str part1b) _ any) or part1a<>part1b
          server_public := "corrupted key"
      else
        server_public := site:server_site public_key
        server_public := site:server_site public_key
        if server_public<>""
          if not (server_public parse word:"rsa" _ any:(var Str part1a) _ any ) or not (site_secret_database:data:site:server_site:private_key parse word:"rsa" _ any:(var Str part1b) _ any) or part1a<>part1b
            server_public := "corrupted key"
      s writeline "server-key: "+server_public
    if encoding<>""
      s writeline "encoding: "+encoding
    log trace "info" "secured server: connection from " (shu
    if client_seed="" or client_laps=undefined
      log trace "wrong client seed or laps."
      return failure
    if name_secret_database:data:host:server_site:private_ke
      log trace "no private key for " server_site
      return failure
    # send server seed
    var Str server_seed := random_seed server_seed_bits\8
    var Int server_laps := server_rc4_laps
    s writeline "seed-rc4: "+base64_encode:server_seed
    s writeline "laps-rc4: "+string:server_laps
    # retreive the shared secret with this client (may be em
    var Str key := name_secret_database:data:host:server_sit
    if key=""
      key := site_secret_database:data:site:server_site:sess
    # send MD5 digest of shared secret + client seed
    s writeline "sign-md5: "+base64_encode:(string_md5_binar
    s writeline "" ; s flush anytime
    # wait for the MD5 digest of server seed + shared secret
    var Str back := ""
    while not s:atend and { var Str l := s:readline ; l<>"" 
      if (l parse "sign-md5:" any:(var Str encoded))
        back := base64_decode encoded
    if back<>(string_md5_binary_signature server_seed+key) o
      # the MD5 was wrong or there was no shared secret: we 
      log trace "info" "secured server: needs to exchange a 
      part exchange "exchange secret keys"
        key := server_exchange_key s server_site client_site
      if key=""
        log trace "failed to exchange a shared key."
        return failure
    log trace "success" "secured server: session opened (" k
    var Link:SecuredStreamDriver drv :> new SecuredStreamDri
    if (flags .and. out)<>0
      rc4_init drv:write_ctx client_seed+key+server_seed ser
    if (flags .and. in)<>0
      rc4_init drv:read_ctx server_seed+key+client_seed clie
    drv local_site := server_site
    if client_site<>""
      drv remote_site := client_site
    eif client_user<>""
      drv remote_user := client_user
    drv security_level := min (rsa_nbbits site:server_site:p
    log trace "bits" "secured server: security level is " dr
    drv s :> s
    if encoding<>""
      log trace "encoding" "secured server: encoding is " en
      drv encoding := encoding
      var Link:Stream zs :> new Stream
      if (zs open "null:" options flags)=failure
        return failure
      zs stream_driver :> drv
      if (pliant_default_file_system open encoding+":" optio
        return failure
    else
      stream stream_driver :> drv
    status := success
    log trace "connection" "secured channel " server_site " 
  eif (name parse "//" any:(var Str server_site) "/user/" (v
    status := open_client_channel server_site "" client_user
  eif (name parse "//" any:(var Str server_site) "/site/" (v
    status := open_client_channel server_site client_site ""
  eif backward_compatibility and (name parse "//" any:(var S
    status := open_client_channel server_site client_site cl
  else
    status := failure



export '. channel_support'
      s writeline "server-key: "+server_public
    if encoding<>""
      s writeline "encoding: "+encoding
    log trace "info" "secured server: connection from " (shu
    if client_seed="" or client_laps=undefined
      log trace "wrong client seed or laps."
      return failure
    if name_secret_database:data:host:server_site:private_ke
      log trace "no private key for " server_site
      return failure
    # send server seed
    var Str server_seed := random_seed server_seed_bits\8
    var Int server_laps := server_rc4_laps
    s writeline "seed-rc4: "+base64_encode:server_seed
    s writeline "laps-rc4: "+string:server_laps
    # retreive the shared secret with this client (may be em
    var Str key := name_secret_database:data:host:server_sit
    if key=""
      key := site_secret_database:data:site:server_site:sess
    # send MD5 digest of shared secret + client seed
    s writeline "sign-md5: "+base64_encode:(string_md5_binar
    s writeline "" ; s flush anytime
    # wait for the MD5 digest of server seed + shared secret
    var Str back := ""
    while not s:atend and { var Str l := s:readline ; l<>"" 
      if (l parse "sign-md5:" any:(var Str encoded))
        back := base64_decode encoded
    if back<>(string_md5_binary_signature server_seed+key) o
      # the MD5 was wrong or there was no shared secret: we 
      log trace "info" "secured server: needs to exchange a 
      part exchange "exchange secret keys"
        key := server_exchange_key s server_site client_site
      if key=""
        log trace "failed to exchange a shared key."
        return failure
    log trace "success" "secured server: session opened (" k
    var Link:SecuredStreamDriver drv :> new SecuredStreamDri
    if (flags .and. out)<>0
      rc4_init drv:write_ctx client_seed+key+server_seed ser
    if (flags .and. in)<>0
      rc4_init drv:read_ctx server_seed+key+client_seed clie
    drv local_site := server_site
    if client_site<>""
      drv remote_site := client_site
    eif client_user<>""
      drv remote_user := client_user
    drv security_level := min (rsa_nbbits site:server_site:p
    log trace "bits" "secured server: security level is " dr
    drv s :> s
    if encoding<>""
      log trace "encoding" "secured server: encoding is " en
      drv encoding := encoding
      var Link:Stream zs :> new Stream
      if (zs open "null:" options flags)=failure
        return failure
      zs stream_driver :> drv
      if (pliant_default_file_system open encoding+":" optio
        return failure
    else
      stream stream_driver :> drv
    status := success
    log trace "connection" "secured channel " server_site " 
  eif (name parse "//" any:(var Str server_site) "/user/" (v
    status := open_client_channel server_site "" client_user
  eif (name parse "//" any:(var Str server_site) "/site/" (v
    status := open_client_channel server_site client_site ""
  eif backward_compatibility and (name parse "//" any:(var S
    status := open_client_channel server_site client_site cl
  else
    status := failure



export '. channel_support'