Hex Artifact Content

Artifact 260d7b3ffd1225a40215cc35f5025c1196ffd33c9660b44b98417dcbcd98cc49:


0000: 23 0a 23 20 54 65 73 74 20 56 65 63 74 6f 72 73  #.# Test Vectors
0010: 0a 23 0a 0a 23 0a 23 20 43 72 65 61 74 65 20 74  .#..#.# Create t
0020: 65 73 74 20 63 61 73 65 20 61 6e 64 20 6f 75 74  est case and out
0030: 70 75 74 20 74 6f 20 74 65 73 74 20 66 69 6c 65  put to test file
0040: 0a 23 0a 70 72 6f 63 20 64 6f 5f 74 65 73 74 20  .#.proc do_test 
0050: 7b 67 72 6f 75 70 20 74 61 69 6c 20 66 69 6c 65  {group tail file
0060: 5f 6e 75 6d 20 74 63 20 6b 64 66 20 64 69 67 65  _num tc kdf dige
0070: 73 74 20 70 61 72 61 6d 73 7d 20 7b 0a 20 20 20  st params} {.   
0080: 20 61 72 72 61 79 20 73 65 74 20 63 6f 6e 66 69   array set confi
0090: 67 20 24 70 61 72 61 6d 73 0a 0a 20 20 20 20 23  g $params..    #
00a0: 20 54 65 73 74 20 69 6e 66 6f 0a 20 20 20 20 73   Test info.    s
00b0: 65 74 20 6c 69 6e 65 20 5b 66 6f 72 6d 61 74 20  et line [format 
00c0: 22 74 63 6c 74 65 73 74 3a 3a 74 65 73 74 20 25  "tcltest::test %
00d0: 73 2d 25 64 2e 25 64 20 7b 25 73 7d 22 20 24 67  s-%d.%d {%s}" $g
00e0: 72 6f 75 70 20 24 66 69 6c 65 5f 6e 75 6d 20 24  roup $file_num $
00f0: 74 63 20 24 74 61 69 6c 5d 0a 20 20 20 20 61 70  tc $tail].    ap
0100: 70 65 6e 64 20 6c 69 6e 65 20 22 20 5c 5c 5c 6e  pend line " \\\n
0110: 5c 74 22 0a 0a 20 20 20 20 23 20 54 65 73 74 20  \t"..    # Test 
0120: 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 20 20  constraints.    
0130: 61 70 70 65 6e 64 20 6c 69 6e 65 20 5b 66 6f 72  append line [for
0140: 6d 61 74 20 22 2d 63 6f 6e 73 74 72 61 69 6e 74  mat "-constraint
0150: 73 20 7b 25 73 20 25 73 7d 22 20 5b 73 74 72 69  s {%s %s}" [stri
0160: 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20 22 2d 22  ng map [list "-"
0170: 20 22 5f 22 5d 20 24 6b 64 66 5d 20 5b 73 74 72   "_"] $kdf] [str
0180: 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20 22 2d  ing map [list "-
0190: 22 20 22 5f 22 5d 20 24 64 69 67 65 73 74 5d 5d  " "_"] $digest]]
01a0: 0a 20 20 20 20 61 70 70 65 6e 64 20 6c 69 6e 65  .    append line
01b0: 20 22 20 5c 5c 5c 6e 5c 74 22 0a 0a 20 20 20 20   " \\\n\t"..    
01c0: 23 20 54 65 73 74 20 73 65 74 75 70 0a 20 20 20  # Test setup.   
01d0: 20 61 70 70 65 6e 64 20 6c 69 6e 65 20 22 2d 73   append line "-s
01e0: 65 74 75 70 20 7b 7d 20 5c 5c 5c 6e 5c 74 22 0a  etup {} \\\n\t".
01f0: 0a 20 20 20 20 23 20 54 65 73 74 20 62 6f 64 79  .    # Test body
0200: 20 70 61 72 61 6d 65 74 65 72 73 0a 20 20 20 20   parameters.    
0210: 73 65 74 20 63 6d 64 20 5b 66 6f 72 6d 61 74 20  set cmd [format 
0220: 22 74 6c 73 3a 3a 25 73 22 20 5b 73 74 72 69 6e  "tls::%s" [strin
0230: 67 20 74 6f 6c 6f 77 65 72 20 24 6b 64 66 5d 5d  g tolower $kdf]]
0240: 0a 20 20 20 20 69 66 20 7b 24 64 69 67 65 73 74  .    if {$digest
0250: 20 6e 65 20 22 22 7d 20 7b 0a 09 61 70 70 65 6e   ne ""} {..appen
0260: 64 20 63 6d 64 20 22 20 2d 64 69 67 65 73 74 20  d cmd " -digest 
0270: 22 20 24 64 69 67 65 73 74 0a 20 20 20 20 7d 0a  " $digest.    }.
0280: 20 20 20 20 66 6f 72 65 61 63 68 20 7b 70 61 72      foreach {par
0290: 61 6d 20 6e 61 6d 65 73 20 74 79 70 65 7d 20 5b  am names type} [
02a0: 6c 69 73 74 20 2d 6b 65 79 20 5b 6c 69 73 74 20  list -key [list 
02b0: 49 4b 4d 20 4b 65 79 20 6b 65 79 5d 20 73 20 2d  IKM Key key] s -
02c0: 69 6e 66 6f 20 5b 6c 69 73 74 20 49 20 69 6e 66  info [list I inf
02d0: 6f 5d 20 73 20 2d 70 61 73 73 77 6f 72 64 20 5b  o] s -password [
02e0: 6c 69 73 74 20 50 5d 20 73 20 5c 0a 09 20 20 20  list P] s \..   
02f0: 20 2d 73 61 6c 74 20 5b 6c 69 73 74 20 53 20 73   -salt [list S s
0300: 61 6c 74 5d 20 73 20 2d 69 74 65 72 61 74 69 6f  alt] s -iteratio
0310: 6e 73 20 5b 6c 69 73 74 20 63 5d 20 69 20 2d 73  ns [list c] i -s
0320: 69 7a 65 20 5b 6c 69 73 74 20 4c 20 64 6b 4c 65  ize [list L dkLe
0330: 6e 20 64 6b 6c 65 6e 5d 20 69 20 5c 0a 09 20 20  n dklen] i \..  
0340: 20 20 2d 4e 20 5b 6c 69 73 74 20 4e 5d 20 69 20    -N [list N] i 
0350: 2d 72 20 5b 6c 69 73 74 20 72 5d 20 69 20 2d 70  -r [list r] i -p
0360: 20 5b 6c 69 73 74 20 70 5d 20 69 5d 20 7b 0a 09   [list p] i] {..
0370: 66 6f 72 65 61 63 68 20 6e 61 6d 65 20 24 6e 61  foreach name $na
0380: 6d 65 73 20 7b 0a 09 20 20 20 20 69 66 20 7b 5b  mes {..    if {[
0390: 69 6e 66 6f 20 65 78 69 73 74 73 20 63 6f 6e 66  info exists conf
03a0: 69 67 28 24 6e 61 6d 65 29 5d 7d 20 7b 0a 09 09  ig($name)]} {...
03b0: 73 65 74 20 64 61 74 61 20 24 63 6f 6e 66 69 67  set data $config
03c0: 28 24 6e 61 6d 65 29 0a 09 09 23 20 48 61 6e 64  ($name)...# Hand
03d0: 6c 65 20 68 65 78 20 73 74 72 69 6e 67 0a 09 09  le hex string...
03e0: 69 66 20 7b 24 74 79 70 65 20 65 71 20 22 73 22  if {$type eq "s"
03f0: 20 26 26 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67   && [string leng
0400: 74 68 20 24 64 61 74 61 5d 20 3e 20 30 20 26 26  th $data] > 0 &&
0410: 20 5b 73 74 72 69 6e 67 20 69 6e 64 65 78 20 24   [string index $
0420: 64 61 74 61 20 30 5d 20 6e 65 20 22 5c 22 22 7d  data 0] ne "\""}
0430: 20 7b 0a 09 09 20 20 20 20 73 65 74 20 64 61 74   {...    set dat
0440: 61 20 5b 66 6f 72 6d 61 74 20 7b 5b 62 69 6e 61  a [format {[bina
0450: 72 79 20 64 65 63 6f 64 65 20 68 65 78 20 25 73  ry decode hex %s
0460: 5d 7d 20 24 64 61 74 61 5d 0a 09 09 7d 0a 09 09  ]} $data]...}...
0470: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
0480: 74 68 20 24 64 61 74 61 5d 20 3e 20 30 7d 20 7b  th $data] > 0} {
0490: 0a 09 09 20 20 20 20 61 70 70 65 6e 64 20 63 6d  ...    append cm
04a0: 64 20 22 20 22 20 24 70 61 72 61 6d 20 22 20 22  d " " $param " "
04b0: 20 24 64 61 74 61 0a 09 09 7d 0a 09 20 20 20 20   $data...}..    
04c0: 7d 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  }..}.    }..    
04d0: 23 20 54 65 73 74 20 62 6f 64 79 0a 20 20 20 20  # Test body.    
04e0: 61 70 70 65 6e 64 20 6c 69 6e 65 20 22 2d 62 6f  append line "-bo
04f0: 64 79 20 5c 7b 62 69 6e 61 72 79 20 65 6e 63 6f  dy \{binary enco
0500: 64 65 20 68 65 78 20 5c 5b 22 20 24 63 6d 64 20  de hex \[" $cmd 
0510: 22 5c 5d 5c 7d 20 5c 5c 5c 6e 5c 74 22 0a 0a 20  "\]\} \\\n\t".. 
0520: 20 20 20 23 20 54 65 73 74 20 63 6c 65 61 6e 75     # Test cleanu
0530: 70 0a 20 20 20 20 23 61 70 70 65 6e 64 20 6c 69  p.    #append li
0540: 6e 65 20 22 2d 63 6c 65 61 6e 75 70 20 7b 7d 20  ne "-cleanup {} 
0550: 5c 5c 6e 5c 74 22 0a 0a 20 20 20 20 23 20 54 65  \\n\t"..    # Te
0560: 73 74 20 72 65 73 75 6c 74 0a 20 20 20 20 73 65  st result.    se
0570: 74 20 72 65 73 75 6c 74 20 22 22 0a 20 20 20 20  t result "".    
0580: 66 6f 72 65 61 63 68 20 6e 61 6d 65 20 5b 6c 69  foreach name [li
0590: 73 74 20 4f 4b 4d 20 44 4b 20 4f 75 74 70 75 74  st OKM DK Output
05a0: 5d 20 7b 0a 09 69 66 20 7b 5b 69 6e 66 6f 20 65  ] {..if {[info e
05b0: 78 69 73 74 73 20 63 6f 6e 66 69 67 28 24 6e 61  xists config($na
05c0: 6d 65 29 5d 7d 20 7b 0a 09 20 20 20 20 73 65 74  me)]} {..    set
05d0: 20 72 65 73 75 6c 74 20 24 63 6f 6e 66 69 67 28   result $config(
05e0: 24 6e 61 6d 65 29 0a 09 20 20 20 20 62 72 65 61  $name)..    brea
05f0: 6b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 0a  k..}.    }.    .
0600: 20 20 20 20 61 70 70 65 6e 64 20 6c 69 6e 65 20      append line 
0610: 5b 66 6f 72 6d 61 74 20 7b 2d 6d 61 74 63 68 20  [format {-match 
0620: 65 78 61 63 74 20 2d 72 65 73 75 6c 74 20 25 73  exact -result %s
0630: 7d 20 24 72 65 73 75 6c 74 5d 0a 0a 20 20 20 20  } $result]..    
0640: 23 20 52 65 74 75 72 6e 20 63 6f 64 65 73 0a 20  # Return codes. 
0650: 20 20 20 23 61 70 70 65 6e 64 20 6c 69 6e 65 20     #append line 
0660: 7b 20 2d 72 65 74 75 72 6e 43 6f 64 65 73 20 30  { -returnCodes 0
0670: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 24 6c 69  }.    return $li
0680: 6e 65 0a 7d 0a 0a 23 0a 23 20 50 61 72 73 65 20  ne.}..#.# Parse 
0690: 74 65 73 74 20 76 65 63 74 6f 72 20 66 69 6c 65  test vector file
06a0: 20 61 6e 64 20 67 65 74 20 74 65 73 74 20 63 61   and get test ca
06b0: 73 65 73 20 63 6f 6e 66 69 67 20 69 6e 66 6f 0a  ses config info.
06c0: 23 0a 70 72 6f 63 20 70 61 72 73 65 20 7b 67 72  #.proc parse {gr
06d0: 6f 75 70 20 66 69 6c 65 6e 61 6d 65 20 66 69 6c  oup filename fil
06e0: 65 5f 6e 75 6d 7d 20 7b 0a 20 20 20 20 73 65 74  e_num} {.    set
06f0: 20 74 63 20 30 0a 0a 20 20 20 20 23 20 4f 70 65   tc 0..    # Ope
0700: 6e 20 69 6e 70 75 74 20 66 69 6c 65 0a 20 20 20  n input file.   
0710: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 70 65   if {[catch {ope
0720: 6e 20 24 66 69 6c 65 6e 61 6d 65 20 72 7d 20 63  n $filename r} c
0730: 68 5d 7d 20 7b 0a 09 72 65 74 75 72 6e 20 2d 63  h]} {..return -c
0740: 6f 64 65 20 65 72 72 6f 72 20 24 63 68 0a 20 20  ode error $ch.  
0750: 20 20 7d 0a 20 20 20 20 73 65 74 20 74 61 69 6c    }.    set tail
0760: 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20   [file rootname 
0770: 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65  [file tail $file
0780: 6e 61 6d 65 5d 5d 0a 0a 20 20 20 20 23 20 4f 70  name]]..    # Op
0790: 65 6e 20 6f 75 74 70 75 74 20 66 69 6c 65 0a 20  en output file. 
07a0: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f     if {[catch {o
07b0: 70 65 6e 20 5b 66 6f 72 6d 61 74 20 22 25 73 2e  pen [format "%s.
07c0: 74 65 73 74 22 20 5b 66 69 6c 65 20 72 6f 6f 74  test" [file root
07d0: 6e 61 6d 65 20 24 66 69 6c 65 6e 61 6d 65 5d 5d  name $filename]]
07e0: 20 77 7d 20 6f 75 74 5d 7d 20 7b 0a 09 72 65 74   w} out]} {..ret
07f0: 75 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 20  urn -code error 
0800: 24 63 68 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23  $ch.    }..    #
0810: 20 47 65 74 20 64 69 67 65 73 74 0a 20 20 20 20   Get digest.    
0820: 6c 61 73 73 69 67 6e 20 5b 73 70 6c 69 74 20 5b  lassign [split [
0830: 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74  string map [list
0840: 20 22 5f 22 20 22 2d 22 5d 20 24 74 61 69 6c 5d   "_" "-"] $tail]
0850: 20 22 2d 22 5d 20 6b 64 66 20 64 69 67 65 73 74   "-"] kdf digest
0860: 0a 20 20 20 20 73 65 74 20 70 61 72 61 6d 73 20  .    set params 
0870: 5b 6c 69 73 74 5d 0a 0a 20 20 20 20 23 20 41 64  [list]..    # Ad
0880: 64 20 63 6f 6e 66 69 67 20 69 6e 66 6f 0a 20 20  d config info.  
0890: 20 20 70 75 74 73 20 24 6f 75 74 20 5b 66 6f 72    puts $out [for
08a0: 6d 61 74 20 22 23 20 41 75 74 6f 20 67 65 6e 65  mat "# Auto gene
08b0: 72 61 74 65 64 20 66 72 6f 6d 20 5c 22 25 73 5c  rated from \"%s\
08c0: 22 22 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66  "" [file tail $f
08d0: 69 6c 65 6e 61 6d 65 5d 5d 0a 20 20 20 20 70 75  ilename]].    pu
08e0: 74 73 20 24 6f 75 74 20 22 70 61 63 6b 61 67 65  ts $out "package
08f0: 20 72 65 71 75 69 72 65 20 74 6c 73 22 0a 20 20   require tls".  
0900: 20 20 70 75 74 73 20 24 6f 75 74 20 22 70 61 63    puts $out "pac
0910: 6b 61 67 65 20 72 65 71 75 69 72 65 20 74 63 6c  kage require tcl
0920: 74 65 73 74 5c 6e 22 0a 20 20 20 20 70 75 74 73  test\n".    puts
0930: 20 24 6f 75 74 20 5b 66 6f 72 6d 61 74 20 22 74   $out [format "t
0940: 63 6c 74 65 73 74 3a 3a 74 65 73 74 43 6f 6e 73  cltest::testCons
0950: 74 72 61 69 6e 74 20 25 73 20 25 73 22 20 5b 73  traint %s %s" [s
0960: 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20  tring map [list 
0970: 22 2d 22 20 22 5f 22 5d 20 24 6b 64 66 5d 20 5c  "-" "_"] $kdf] \
0980: 0a 09 5b 66 6f 72 6d 61 74 20 7b 5b 65 78 70 72  ..[format {[expr
0990: 20 7b 5b 6c 73 65 61 72 63 68 20 2d 6e 6f 63 61   {[lsearch -noca
09a0: 73 65 20 5b 74 6c 73 3a 3a 6b 64 66 73 5d 20 25  se [tls::kdfs] %
09b0: 73 5d 20 3e 20 2d 31 7d 5d 7d 20 24 6b 64 66 5d  s] > -1}]} $kdf]
09c0: 5d 0a 20 20 20 20 69 66 20 7b 24 64 69 67 65 73  ].    if {$diges
09d0: 74 20 6e 65 20 22 22 7d 20 7b 0a 09 70 75 74 73  t ne ""} {..puts
09e0: 20 24 6f 75 74 20 5b 66 6f 72 6d 61 74 20 22 74   $out [format "t
09f0: 63 6c 74 65 73 74 3a 3a 74 65 73 74 43 6f 6e 73  cltest::testCons
0a00: 74 72 61 69 6e 74 20 25 73 20 25 73 22 20 5b 73  traint %s %s" [s
0a10: 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20  tring map [list 
0a20: 22 2d 22 20 22 5f 22 5d 20 24 64 69 67 65 73 74  "-" "_"] $digest
0a30: 5d 20 5c 0a 09 20 20 20 20 5b 66 6f 72 6d 61 74  ] \..    [format
0a40: 20 7b 5b 65 78 70 72 20 7b 5b 6c 73 65 61 72 63   {[expr {[lsearc
0a50: 68 20 2d 6e 6f 63 61 73 65 20 5b 74 6c 73 3a 3a  h -nocase [tls::
0a60: 64 69 67 65 73 74 73 5d 20 25 73 5d 20 3e 20 2d  digests] %s] > -
0a70: 31 7d 5d 7d 20 24 64 69 67 65 73 74 5d 5d 0a 20  1}]} $digest]]. 
0a80: 20 20 20 7d 0a 20 20 20 20 70 75 74 73 20 24 6f     }.    puts $o
0a90: 75 74 20 22 22 0a 0a 20 20 20 20 23 20 50 72 6f  ut ""..    # Pro
0aa0: 63 65 73 73 20 66 69 6c 65 0a 20 20 20 20 77 68  cess file.    wh
0ab0: 69 6c 65 20 7b 21 5b 65 6f 66 20 24 63 68 5d 7d  ile {![eof $ch]}
0ac0: 20 7b 0a 09 67 65 74 73 20 24 63 68 20 6c 69 6e   {..gets $ch lin
0ad0: 65 0a 09 73 65 74 20 6c 69 6e 65 20 5b 73 74 72  e..set line [str
0ae0: 69 6e 67 20 74 72 69 6d 20 24 6c 69 6e 65 5d 0a  ing trim $line].
0af0: 09 73 65 74 20 6c 65 6e 20 5b 73 74 72 69 6e 67  .set len [string
0b00: 20 6c 65 6e 67 74 68 20 24 6c 69 6e 65 5d 0a 0a   length $line]..
0b10: 09 69 66 20 7b 5b 73 74 72 69 6e 67 20 69 6e 64  .if {[string ind
0b20: 65 78 20 24 6c 69 6e 65 20 30 5d 20 69 6e 20 5b  ex $line 0] in [
0b30: 6c 69 73 74 20 22 23 22 20 22 5c 5b 22 5d 7d 20  list "#" "\["]} 
0b40: 7b 0a 09 20 20 20 20 23 20 53 6b 69 70 20 63 6f  {..    # Skip co
0b50: 6d 6d 65 6e 74 73 20 61 6e 64 20 69 6e 66 6f 20  mments and info 
0b60: 6c 69 6e 65 73 0a 09 20 20 20 20 63 6f 6e 74 69  lines..    conti
0b70: 6e 75 65 0a 0a 09 7d 20 65 6c 73 65 69 66 20 7b  nue...} elseif {
0b80: 24 6c 65 6e 20 3d 3d 20 30 7d 20 7b 0a 09 20 20  $len == 0} {..  
0b90: 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24    if {[llength $
0ba0: 70 61 72 61 6d 73 5d 20 3e 20 30 7d 20 7b 0a 09  params] > 0} {..
0bb0: 09 23 20 44 6f 20 74 65 73 74 20 69 66 20 65 6e  .# Do test if en
0bc0: 64 20 6f 66 20 70 61 72 61 6d 73 0a 09 09 70 75  d of params...pu
0bd0: 74 73 20 24 6f 75 74 20 5b 64 6f 5f 74 65 73 74  ts $out [do_test
0be0: 20 24 67 72 6f 75 70 20 24 74 61 69 6c 20 24 66   $group $tail $f
0bf0: 69 6c 65 5f 6e 75 6d 20 5b 69 6e 63 72 20 74 63  ile_num [incr tc
0c00: 5d 20 24 6b 64 66 20 24 64 69 67 65 73 74 20 24  ] $kdf $digest $
0c10: 70 61 72 61 6d 73 5d 0a 09 09 70 75 74 73 20 24  params]...puts $
0c20: 6f 75 74 20 22 22 0a 09 09 73 65 74 20 70 61 72  out ""...set par
0c30: 61 6d 73 20 5b 6c 69 73 74 5d 0a 09 20 20 20 20  ams [list]..    
0c40: 7d 20 65 6c 73 65 20 7b 0a 09 09 23 20 45 6d 70  } else {...# Emp
0c50: 74 79 20 6c 69 6e 65 0a 09 20 20 20 20 7d 0a 0a  ty line..    }..
0c60: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 23  .} else {..    #
0c70: 20 41 70 70 65 6e 64 20 61 72 67 73 20 74 6f 20   Append args to 
0c80: 70 61 72 61 6d 73 0a 09 20 20 20 20 73 65 74 20  params..    set 
0c90: 69 6e 64 65 78 20 5b 73 74 72 69 6e 67 20 66 69  index [string fi
0ca0: 72 73 74 20 22 3d 22 20 24 6c 69 6e 65 5d 0a 09  rst "=" $line]..
0cb0: 20 20 20 20 69 66 20 7b 24 69 6e 64 65 78 20 3e      if {$index >
0cc0: 20 2d 31 7d 20 7b 0a 09 09 73 65 74 20 6b 65 79   -1} {...set key
0cd0: 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 5b 73   [string trim [s
0ce0: 74 72 69 6e 67 20 72 61 6e 67 65 20 24 6c 69 6e  tring range $lin
0cf0: 65 20 30 20 5b 65 78 70 72 20 7b 24 69 6e 64 65  e 0 [expr {$inde
0d00: 78 20 2d 20 31 7d 5d 5d 5d 0a 09 09 73 65 74 20  x - 1}]]]...set 
0d10: 76 61 6c 75 65 20 5b 73 74 72 69 6e 67 20 74 72  value [string tr
0d20: 69 6d 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65  im [string range
0d30: 20 24 6c 69 6e 65 20 5b 65 78 70 72 20 7b 24 69   $line [expr {$i
0d40: 6e 64 65 78 20 2b 20 31 7d 5d 20 65 6e 64 5d 5d  ndex + 1}] end]]
0d50: 0a 09 09 6c 61 70 70 65 6e 64 20 70 61 72 61 6d  ...lappend param
0d60: 73 20 24 6b 65 79 20 24 76 61 6c 75 65 0a 09 20  s $key $value.. 
0d70: 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20     }..}.    }.. 
0d80: 20 20 20 23 20 48 61 6e 64 6c 65 20 6c 61 73 74     # Handle last
0d90: 20 74 65 73 74 20 63 61 73 65 0a 20 20 20 20 69   test case.    i
0da0: 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 70 61 72  f {[llength $par
0db0: 61 6d 73 5d 20 3e 20 30 7d 20 7b 0a 09 70 75 74  ams] > 0} {..put
0dc0: 73 20 24 6f 75 74 20 5b 64 6f 5f 74 65 73 74 20  s $out [do_test 
0dd0: 24 67 72 6f 75 70 20 24 74 61 69 6c 20 24 66 69  $group $tail $fi
0de0: 6c 65 5f 6e 75 6d 20 5b 69 6e 63 72 20 74 63 5d  le_num [incr tc]
0df0: 20 24 6b 64 66 20 24 64 69 67 65 73 74 20 24 70   $kdf $digest $p
0e00: 61 72 61 6d 73 5d 0a 09 70 75 74 73 20 24 6f 75  arams]..puts $ou
0e10: 74 20 22 22 0a 20 20 20 20 7d 0a 20 20 20 20 0a  t "".    }.    .
0e20: 20 20 20 20 23 20 43 6c 65 61 6e 75 70 0a 20 20      # Cleanup.  
0e30: 20 20 70 75 74 73 20 24 6f 75 74 20 22 23 20 43    puts $out "# C
0e40: 6c 65 61 6e 75 70 5c 6e 3a 3a 74 63 6c 74 65 73  leanup\n::tcltes
0e50: 74 3a 3a 63 6c 65 61 6e 75 70 54 65 73 74 73 5c  t::cleanupTests\
0e60: 6e 72 65 74 75 72 6e 22 0a 20 20 20 20 63 6c 6f  nreturn".    clo
0e70: 73 65 20 24 63 68 0a 20 20 20 20 63 6c 6f 73 65  se $ch.    close
0e80: 20 24 6f 75 74 0a 7d 0a 0a 23 0a 23 20 52 65 61   $out.}..#.# Rea
0e90: 64 20 61 6c 6c 20 63 6f 6e 66 69 67 20 66 69 6c  d all config fil
0ea0: 65 73 20 69 6e 20 64 69 72 65 63 74 6f 72 79 0a  es in directory.
0eb0: 23 0a 70 72 6f 63 20 6d 61 69 6e 20 7b 70 61 74  #.proc main {pat
0ec0: 68 7d 20 7b 0a 20 20 20 20 73 65 74 20 66 69 6c  h} {.    set fil
0ed0: 65 5f 6e 75 6d 20 30 0a 20 20 20 20 73 65 74 20  e_num 0.    set 
0ee0: 67 72 6f 75 70 20 5b 66 69 6c 65 20 72 6f 6f 74  group [file root
0ef0: 6e 61 6d 65 20 5b 66 69 6c 65 20 74 61 69 6c 20  name [file tail 
0f00: 24 70 61 74 68 5d 5d 0a 0a 20 20 20 20 66 6f 72  $path]]..    for
0f10: 65 61 63 68 20 66 69 6c 65 6e 61 6d 65 20 5b 67  each filename [g
0f20: 6c 6f 62 20 2d 64 69 72 65 63 74 6f 72 79 20 24  lob -directory $
0f30: 70 61 74 68 20 2a 2e 74 78 74 20 2a 53 68 6f 72  path *.txt *Shor
0f40: 74 4d 73 67 2e 72 73 70 20 2a 4c 6f 6e 67 4d 73  tMsg.rsp *LongMs
0f50: 67 2e 72 73 70 5d 20 7b 0a 09 70 75 74 73 20 5b  g.rsp] {..puts [
0f60: 66 6f 72 6d 61 74 20 22 50 72 6f 63 65 73 73 69  format "Processi
0f70: 6e 67 20 25 73 22 20 24 66 69 6c 65 6e 61 6d 65  ng %s" $filename
0f80: 5d 0a 09 73 65 74 20 74 61 69 6c 20 5b 66 69 6c  ]..set tail [fil
0f90: 65 20 74 61 69 6c 20 24 66 69 6c 65 6e 61 6d 65  e tail $filename
0fa0: 5d 0a 09 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d  ]..if {[string m
0fb0: 61 74 63 68 20 2d 6e 6f 63 61 73 65 20 22 52 65  atch -nocase "Re
0fc0: 61 64 6d 65 2e 74 78 74 22 20 24 74 61 69 6c 5d  adme.txt" $tail]
0fd0: 20 7c 7c 20 5b 73 74 72 69 6e 67 20 6d 61 74 63   || [string matc
0fe0: 68 20 2d 6e 6f 63 61 73 65 20 22 2a 4d 6f 6e 74  h -nocase "*Mont
0ff0: 65 2e 74 78 74 22 20 24 74 61 69 6c 5d 7d 20 7b  e.txt" $tail]} {
1000: 0a 09 20 20 20 20 63 6f 6e 74 69 6e 75 65 0a 09  ..    continue..
1010: 7d 0a 0a 09 73 65 74 20 74 61 69 6c 20 5b 66 69  }...set tail [fi
1020: 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 5b 66 69 6c  le rootname [fil
1030: 65 20 74 61 69 6c 20 24 66 69 6c 65 6e 61 6d 65  e tail $filename
1040: 5d 5d 0a 09 73 65 74 20 64 69 67 65 73 74 20 5b  ]]..set digest [
1050: 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74  string map [list
1060: 20 4c 6f 6e 67 4d 73 67 20 22 22 20 53 68 6f 72   LongMsg "" Shor
1070: 74 4d 73 67 20 22 22 20 4d 6f 6e 74 65 20 22 22  tMsg "" Monte ""
1080: 20 22 5f 22 20 22 2d 22 5d 20 24 74 61 69 6c 5d   "_" "-"] $tail]
1090: 0a 09 73 65 74 20 69 64 20 5b 66 6f 72 6d 61 74  ..set id [format
10a0: 20 22 25 73 5f 25 73 22 20 24 67 72 6f 75 70 20   "%s_%s" $group 
10b0: 24 64 69 67 65 73 74 5d 0a 09 73 65 74 20 74 65  $digest]..set te
10c0: 73 74 5f 6e 75 6d 20 5b 69 6e 63 72 20 74 65 73  st_num [incr tes
10d0: 74 5f 69 64 73 28 24 69 64 29 5d 0a 09 70 61 72  t_ids($id)]..par
10e0: 73 65 20 24 69 64 20 24 66 69 6c 65 6e 61 6d 65  se $id $filename
10f0: 20 24 74 65 73 74 5f 6e 75 6d 0a 20 20 20 20 7d   $test_num.    }
1100: 0a 7d 0a 0a 6d 61 69 6e 20 5b 70 77 64 5d 0a 65  .}..main [pwd].e
1110: 78 69 74 0a                                      xit.