Patch title: Release 94 bulk changes
Abstract:
File: /pliant/util/crypto/rsa.pli
Key:
    Removed line
    Added line
   
abstract
  [This is Pliant (Rivest-Shamir-Adelman) RSA implementation


module "/pliant/language/unsafe.pli"
module "/pliant/language/context.pli"
module "/pliant/util/encoding/base64.pli"
abstract
  [This is Pliant (Rivest-Shamir-Adelman) RSA implementation


module "/pliant/language/unsafe.pli"
module "/pliant/language/context.pli"
module "/pliant/util/encoding/base64.pli"
module "/pliant/language/type/text/str8.pli"
module "/pliant/language/type/misc/blob.pli"
module "/pliant/admin/md5.pli"
module "intn.pli"
module "random.pli"
module "/pliant/admin/md5.pli"
module "intn.pli"
module "random.pli"
module "legal.pli"
module "/pliant/fullpliant/user.pli"
module "/pliant/protocol/dns/name.pli"
module "/pliant/protocol/http/site.pli"
module "cipher.pli"


function rsa_cipher input key -> output
  arg Str input key output
  if not (key parse word:"rsa" _ any:(var Str encoded_n) _ a
    return ""
  (var Intn n) binary_decode base64_decode:encoded_n true
module "/pliant/fullpliant/user.pli"
module "/pliant/protocol/dns/name.pli"
module "/pliant/protocol/http/site.pli"
module "cipher.pli"


function rsa_cipher input key -> output
  arg Str input key output
  if not (key parse word:"rsa" _ any:(var Str encoded_n) _ a
    return ""
  (var Intn n) binary_decode base64_decode:encoded_n true
  if n:nbbits>max_legal_key_bits
    return ""
  if verbose
    console "(message " input:len*8 " bis ; rsa key " rsa_nb
  var DateTime start := datetime
  if trace
    console "n=" n eol
  (var Intn e_or_d) binary_decode base64_decode:encoded_e_or
  if trace
    console "e_or_d=" e_or_d eol
  (var Intn in) binary_decode input true
  if trace
    console "in=" in eol
  var Intn out := 0
  var Intn f := 1
  if mp
    parallel
      while in<>0
        var Intn out_i
        task
          share n e_or_d
          var Intn in_i := in%n
          out_i := ( in_i^e_or_d%n )*f
        post
          share out
          out := out+out_i
        f := f*n
        in := in\n
  else
    while in<>0
      var Intn in_i := in%n
      var Intn out_i := in_i^e_or_d%n
      out := out+out_i*f
      f := f*n
      in := in\n
  if trace
    console "out=" out eol
  output := out binary_encode
  if verbose
    console "-> time " datetime:seconds-start:seconds "s)" e
  if wait
    sleep 0.25*(datetime:seconds-start:seconds)*(cast random

  if verbose
    console "(message " input:len*8 " bis ; rsa key " rsa_nb
  var DateTime start := datetime
  if trace
    console "n=" n eol
  (var Intn e_or_d) binary_decode base64_decode:encoded_e_or
  if trace
    console "e_or_d=" e_or_d eol
  (var Intn in) binary_decode input true
  if trace
    console "in=" in eol
  var Intn out := 0
  var Intn f := 1
  if mp
    parallel
      while in<>0
        var Intn out_i
        task
          share n e_or_d
          var Intn in_i := in%n
          out_i := ( in_i^e_or_d%n )*f
        post
          share out
          out := out+out_i
        f := f*n
        in := in\n
  else
    while in<>0
      var Intn in_i := in%n
      var Intn out_i := in_i^e_or_d%n
      out := out+out_i*f
      f := f*n
      in := in\n
  if trace
    console "out=" out eol
  output := out binary_encode
  if verbose
    console "-> time " datetime:seconds-start:seconds "s)" e
  if wait
    sleep 0.25*(datetime:seconds-start:seconds)*(cast random

function rsa_cipher input key -> output
  arg Blob input ; arg Str key ; arg Blob output
  addressof:output map Str := rsa_cipher (addressof:input map Str) key

doc
  listing
    function rsa_generate nbits error_probability public pri
      arg Int nbits ; arg Float error_probability ; arg_w St
  [Generates a new RSA keys pair.] ; eol
  ['nbits' specify how many bits we want in the two prime nu
  [The 'error_probability' should be a very small number suc

doc
  listing
    function rsa_generate nbits error_probability public pri
      arg Int nbits ; arg Float error_probability ; arg_w St
  [Generates a new RSA keys pair.] ; eol
  ['nbits' specify how many bits we want in the two prime nu
  [The 'error_probability' should be a very small number suc
  [The size of the key you can generate using this software 

function rsa_generate nbits error_probability public private
  arg Int nbits ; arg Float error_probability ; arg_w Str pu

function rsa_generate nbits error_probability public private
  arg Int nbits ; arg Float error_probability ; arg_w Str pu
  if nbits>max_legal_key_bits
    console "Since this software has been written in france,
    return failure
  part generate
    var Intn p q
    if mp
      parallel
        task
          share p := prime 2n^(nbits\2) error_probability
        task
          share q := prime 2n^(nbits\2) error_probability
    else
      p := prime 2n^(nbits\2) error_probability
      q := prime 2n^(nbits\2) error_probability
    if trace
      console "p=" p eol
      console "q=" q eol
    var Intn n := p*q
    if trace
      console "n=" n " (" n:nbbits ")" eol
    if n:nbbits<nbits-2
      restart generate # the key is too small
    part pick_e
      var Intn e := random (p-1)*(q-1)
      if (pgcd e (p-1)*(q-1))<>1
        restart pick_e
    var Intn d := inverse e (p-1)*(q-1)
    if trace
      console "e=" e " (" e:nbbits ")" eol
      console "d=" d " (" d:nbbits ")" eol
    public := "rsa "+(base64_encode n:binary_encode)+" "+(ba
    private := "rsa "+(base64_encode n:binary_encode)+" "+(b
    if trace
      console "public key is " public " (" rsa_nbbits:public
      console "private key is " private " (" rsa_nbbits:priv
  return success



function rsa_generate name nbits password -> status
  arg Str name ; arg Int nbits ; arg Str password ; arg Stat
  if verbose
    console "Now "
    random 2n^nbits
    console "generating a " nbits " bits RSA key." eol
    var DateTime dt := datetime
  status := rsa_generate nbits 1e-90 (var Str public) (var S
  if verbose
    var Float s := datetime:seconds-dt:seconds
  if status=success
    status := rsa_check public private 1024
  if status=success
    if (name eparse "user:" any:(var Str username))
      user:username public_key := public
      user_secret_database:data:user create username
  part generate
    var Intn p q
    if mp
      parallel
        task
          share p := prime 2n^(nbits\2) error_probability
        task
          share q := prime 2n^(nbits\2) error_probability
    else
      p := prime 2n^(nbits\2) error_probability
      q := prime 2n^(nbits\2) error_probability
    if trace
      console "p=" p eol
      console "q=" q eol
    var Intn n := p*q
    if trace
      console "n=" n " (" n:nbbits ")" eol
    if n:nbbits<nbits-2
      restart generate # the key is too small
    part pick_e
      var Intn e := random (p-1)*(q-1)
      if (pgcd e (p-1)*(q-1))<>1
        restart pick_e
    var Intn d := inverse e (p-1)*(q-1)
    if trace
      console "e=" e " (" e:nbbits ")" eol
      console "d=" d " (" d:nbbits ")" eol
    public := "rsa "+(base64_encode n:binary_encode)+" "+(ba
    private := "rsa "+(base64_encode n:binary_encode)+" "+(b
    if trace
      console "public key is " public " (" rsa_nbbits:public
      console "private key is " private " (" rsa_nbbits:priv
  return success



function rsa_generate name nbits password -> status
  arg Str name ; arg Int nbits ; arg Str password ; arg Stat
  if verbose
    console "Now "
    random 2n^nbits
    console "generating a " nbits " bits RSA key." eol
    var DateTime dt := datetime
  status := rsa_generate nbits 1e-90 (var Str public) (var S
  if verbose
    var Float s := datetime:seconds-dt:seconds
  if status=success
    status := rsa_check public private 1024
  if status=success
    if (name eparse "user:" any:(var Str username))
      user:username public_key := public
      user_secret_database:data:user create username
      user_secret_database:data:user:username private_key :=
      user_secret_database:data:user:username private_key := straight_to_Str8 (cipher private password)
      user_secret_database:data:user:username key_md5 := str
      data_reset user_secret_database:data:user:username:ses
      user_database store
      user_secret_database store
    eif (name eparse "host:" any:(var Str hostname))
      name_database:data:host create hostname
      name_database:data:host:hostname public_key := public
      name_secret_database:data:host create hostname
      name_secret_database:data:host:hostname private_key :=
      data_reset name_secret_database:data:host:hostname:ses
      name_database store
      name_secret_database store
    eif (name eparse "site:" any:(var Str sitename))
      site_database:data:site create sitename
      site:sitename public_key := public
      site_secret_database:data:site create sitename
      site_secret_database:data:site:sitename private_key :=
      data_reset site_secret_database:data:site:sitename:ses
      site_database store
      site_secret_database store
    eif (name eparse "target:" any:(var Str hostname))
      name_database:data:host create hostname
      name_database:data:host:hostname public_key := public
      name_database store
      var (Link Database:NameDatabase) name_db :> new Databa
      name_db load "target:/pliant_security/name.pdb"
      var (Data Set:NameHost) name_tbl :> name_db:data:host
      name_tbl create hostname
      name_tbl:hostname public_key := public
      name_db store
      var (Link Database:NameSecretDatabase) secret_db :> ne
      secret_db load "target:/pliant_security/name_secret.pd
      var (Data Set:NameSecret) secret_tbl :> secret_db:data
      secret_tbl create hostname
      secret_tbl:hostname private_key := private
      data_reset secret_tbl:hostname:session
      secret_db store
   if verbose
      console "Succeded to generate a valid " rsa_nbbits:pub
  else
    console "Failed to generate a valid RSA key." eol


export rsa_cipher rsa_nbbits
export rsa_generate
      user_secret_database:data:user:username key_md5 := str
      data_reset user_secret_database:data:user:username:ses
      user_database store
      user_secret_database store
    eif (name eparse "host:" any:(var Str hostname))
      name_database:data:host create hostname
      name_database:data:host:hostname public_key := public
      name_secret_database:data:host create hostname
      name_secret_database:data:host:hostname private_key :=
      data_reset name_secret_database:data:host:hostname:ses
      name_database store
      name_secret_database store
    eif (name eparse "site:" any:(var Str sitename))
      site_database:data:site create sitename
      site:sitename public_key := public
      site_secret_database:data:site create sitename
      site_secret_database:data:site:sitename private_key :=
      data_reset site_secret_database:data:site:sitename:ses
      site_database store
      site_secret_database store
    eif (name eparse "target:" any:(var Str hostname))
      name_database:data:host create hostname
      name_database:data:host:hostname public_key := public
      name_database store
      var (Link Database:NameDatabase) name_db :> new Databa
      name_db load "target:/pliant_security/name.pdb"
      var (Data Set:NameHost) name_tbl :> name_db:data:host
      name_tbl create hostname
      name_tbl:hostname public_key := public
      name_db store
      var (Link Database:NameSecretDatabase) secret_db :> ne
      secret_db load "target:/pliant_security/name_secret.pd
      var (Data Set:NameSecret) secret_tbl :> secret_db:data
      secret_tbl create hostname
      secret_tbl:hostname private_key := private
      data_reset secret_tbl:hostname:session
      secret_db store
   if verbose
      console "Succeded to generate a valid " rsa_nbbits:pub
  else
    console "Failed to generate a valid RSA key." eol


export rsa_cipher rsa_nbbits
export rsa_generate