Tcl Library Source Code

Hex Artifact Content
Login
Bounty program for improvements to Tcl and certain Tcl packages.

Artifact b47454aa1688516a8bde3a1a1b86c087888f91a4:


0000: 23 20 73 68 61 32 35 36 2e 74 63 6c 20 2d 20 43  # sha256.tcl - C
0010: 6f 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30  opyright (C) 200
0020: 35 20 50 61 74 20 54 68 6f 79 74 73 20 3c 70 61  5 Pat Thoyts <pa
0030: 74 74 68 6f 79 74 73 40 75 73 65 72 73 2e 73 6f  [email protected]
0040: 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 3e 0a 23  urceforge.net>.#
0050: 0a 23 20 53 48 41 31 20 64 65 66 69 6e 65 64 20  .# SHA1 defined 
0060: 62 79 20 46 49 50 53 20 31 38 30 2d 32 2c 20 22  by FIPS 180-2, "
0070: 54 68 65 20 53 65 63 75 72 65 20 48 61 73 68 20  The Secure Hash 
0080: 53 74 61 6e 64 61 72 64 22 0a 23 20 48 4d 41 43  Standard".# HMAC
0090: 20 64 65 66 69 6e 65 64 20 62 79 20 52 46 43 20   defined by RFC 
00a0: 32 31 30 34 2c 20 22 4b 65 79 65 64 2d 48 61 73  2104, "Keyed-Has
00b0: 68 69 6e 67 20 66 6f 72 20 4d 65 73 73 61 67 65  hing for Message
00c0: 20 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 22   Authentication"
00d0: 0a 23 0a 23 20 54 68 69 73 20 69 73 20 61 6e 20  .#.# This is an 
00e0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
00f0: 66 20 74 68 65 20 73 65 63 75 72 65 20 68 61 73  f the secure has
0100: 68 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65  h algorithms spe
0110: 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a 23 20  cified in the.# 
0120: 46 49 50 53 20 31 38 30 2d 32 20 64 6f 63 75 6d  FIPS 180-2 docum
0130: 65 6e 74 2e 0a 23 0a 23 20 54 68 69 73 20 69 6d  ent..#.# This im
0140: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 65 72  plementation per
0150: 6d 69 74 73 20 69 6e 63 72 65 6d 65 6e 74 61 6c  mits incremental
0160: 20 75 70 64 61 74 69 6e 67 20 6f 66 20 74 68 65   updating of the
0170: 20 68 61 73 68 20 61 6e 64 20 0a 23 20 70 72 6f   hash and .# pro
0180: 76 69 64 65 73 20 73 75 70 70 6f 72 74 20 66 6f  vides support fo
0190: 72 20 65 78 74 65 72 6e 61 6c 20 63 6f 6d 70 69  r external compi
01a0: 6c 65 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  led implementati
01b0: 6f 6e 73 20 75 73 69 6e 67 20 63 72 69 74 63 6c  ons using critcl
01c0: 2e 0a 23 0a 23 20 54 68 69 73 20 69 6d 70 6c 65  ..#.# This imple
01d0: 6d 65 6e 74 61 74 69 6f 6e 20 70 65 72 6d 69 74  mentation permit
01e0: 73 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 75 70  s incremental up
01f0: 64 61 74 69 6e 67 20 6f 66 20 74 68 65 20 68 61  dating of the ha
0200: 73 68 20 61 6e 64 20 0a 23 20 70 72 6f 76 69 64  sh and .# provid
0210: 65 73 20 73 75 70 70 6f 72 74 20 66 6f 72 20 65  es support for e
0220: 78 74 65 72 6e 61 6c 20 63 6f 6d 70 69 6c 65 64  xternal compiled
0230: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
0240: 20 65 69 74 68 65 72 20 75 73 69 6e 67 0a 23 20   either using.# 
0250: 63 72 69 74 63 6c 20 28 73 68 61 32 35 36 63 29  critcl (sha256c)
0260: 2e 0a 23 0a 23 20 52 65 66 3a 20 68 74 74 70 3a  ..#.# Ref: http:
0270: 2f 2f 63 73 72 63 2e 6e 69 73 74 2e 67 6f 76 2f  //csrc.nist.gov/
0280: 70 75 62 6c 69 63 61 74 69 6f 6e 73 2f 66 69 70  publications/fip
0290: 73 2f 66 69 70 73 31 38 30 2d 32 2f 66 69 70 73  s/fips180-2/fips
02a0: 31 38 30 2d 32 2e 70 64 66 0a 23 20 20 20 20 20  180-2.pdf.#     
02b0: 20 68 74 74 70 3a 2f 2f 63 73 72 63 2e 6e 69 73   http://csrc.nis
02c0: 74 2e 67 6f 76 2f 70 75 62 6c 69 63 61 74 69 6f  t.gov/publicatio
02d0: 6e 73 2f 66 69 70 73 2f 66 69 70 73 31 38 30 2d  ns/fips/fips180-
02e0: 32 2f 66 69 70 73 31 38 30 2d 32 77 69 74 68 63  2/fips180-2withc
02f0: 68 61 6e 67 65 6e 6f 74 69 63 65 2e 70 64 66 0a  hangenotice.pdf.
0300: 23 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #.# ------------
0310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
0350: 53 65 65 20 74 68 65 20 66 69 6c 65 20 22 6c 69  See the file "li
0360: 63 65 6e 73 65 2e 74 65 72 6d 73 22 20 66 6f 72  cense.terms" for
0370: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20   information on 
0380: 75 73 61 67 65 20 61 6e 64 20 72 65 64 69 73 74  usage and redist
0390: 72 69 62 75 74 69 6f 6e 0a 23 20 6f 66 20 74 68  ribution.# of th
03a0: 69 73 20 66 69 6c 65 2c 20 61 6e 64 20 66 6f 72  is file, and for
03b0: 20 61 20 44 49 53 43 4c 41 49 4d 45 52 20 4f 46   a DISCLAIMER OF
03c0: 20 41 4c 4c 20 57 41 52 52 41 4e 54 49 45 53 2e   ALL WARRANTIES.
03d0: 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .# -------------
03e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 40  ------------.# @
0420: 6d 64 67 65 6e 20 45 58 43 4c 55 44 45 3a 20 73  mdgen EXCLUDE: s
0430: 68 61 32 35 36 63 2e 74 63 6c 0a 0a 70 61 63 6b  ha256c.tcl..pack
0440: 61 67 65 20 72 65 71 75 69 72 65 20 54 63 6c 20  age require Tcl 
0450: 38 2e 32 3b 20 20 20 20 20 20 20 20 20 20 20 20  8.2;            
0460: 20 20 20 20 23 20 74 63 6c 20 6d 69 6e 69 6d 75      # tcl minimu
0470: 6d 20 76 65 72 73 69 6f 6e 0a 0a 6e 61 6d 65 73  m version..names
0480: 70 61 63 65 20 65 76 61 6c 20 3a 3a 73 68 61 32  pace eval ::sha2
0490: 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20   {.    variable 
04a0: 20 61 63 63 65 6c 0a 20 20 20 20 61 72 72 61 79   accel.    array
04b0: 20 73 65 74 20 61 63 63 65 6c 20 7b 74 63 6c 20   set accel {tcl 
04c0: 30 20 63 72 69 74 63 6c 20 30 7d 0a 20 20 20 20  0 critcl 0}.    
04d0: 76 61 72 69 61 62 6c 65 20 20 6c 6f 61 64 65 64  variable  loaded
04e0: 20 7b 7d 0a 0a 20 20 20 20 6e 61 6d 65 73 70 61   {}..    namespa
04f0: 63 65 20 65 78 70 6f 72 74 20 73 68 61 32 35 36  ce export sha256
0500: 20 68 6d 61 63 20 5c 0a 20 20 20 20 20 20 20 20   hmac \.        
0510: 20 20 20 20 53 48 41 32 35 36 49 6e 69 74 20 53      SHA256Init S
0520: 48 41 32 35 36 55 70 64 61 74 65 20 53 48 41 32  HA256Update SHA2
0530: 35 36 46 69 6e 61 6c 0a 0a 20 20 20 20 76 61 72  56Final..    var
0540: 69 61 62 6c 65 20 75 69 64 0a 20 20 20 20 69 66  iable uid.    if
0550: 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
0560: 75 69 64 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20  uid]} {.        
0570: 73 65 74 20 75 69 64 20 30 0a 20 20 20 20 7d 0a  set uid 0.    }.
0580: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 4b 0a  .    variable K.
0590: 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
05a0: 78 69 73 74 73 20 4b 5d 7d 20 7b 0a 20 20 20 20  xists K]} {.    
05b0: 20 20 20 20 23 20 46 49 50 53 20 31 38 30 2d 32      # FIPS 180-2
05c0: 3a 20 34 2e 32 2e 32 20 53 48 41 2d 32 35 36 20  : 4.2.2 SHA-256 
05d0: 63 6f 6e 73 74 61 6e 74 73 0a 20 20 20 20 20 20  constants.      
05e0: 20 20 73 65 74 20 4b 20 5b 6c 69 73 74 20 5c 0a    set K [list \.
05f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0600: 20 20 20 30 78 34 32 38 61 32 66 39 38 20 30 78     0x428a2f98 0x
0610: 37 31 33 37 34 34 39 31 20 30 78 62 35 63 30 66  71374491 0xb5c0f
0620: 62 63 66 20 30 78 65 39 62 35 64 62 61 35 20 5c  bcf 0xe9b5dba5 \
0630: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0640: 20 20 20 20 30 78 33 39 35 36 63 32 35 62 20 30      0x3956c25b 0
0650: 78 35 39 66 31 31 31 66 31 20 30 78 39 32 33 66  x59f111f1 0x923f
0660: 38 32 61 34 20 30 78 61 62 31 63 35 65 64 35 20  82a4 0xab1c5ed5 
0670: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
0680: 20 20 20 20 20 30 78 64 38 30 37 61 61 39 38 20       0xd807aa98 
0690: 30 78 31 32 38 33 35 62 30 31 20 30 78 32 34 33  0x12835b01 0x243
06a0: 31 38 35 62 65 20 30 78 35 35 30 63 37 64 63 33  185be 0x550c7dc3
06b0: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
06c0: 20 20 20 20 20 20 30 78 37 32 62 65 35 64 37 34        0x72be5d74
06d0: 20 30 78 38 30 64 65 62 31 66 65 20 30 78 39 62   0x80deb1fe 0x9b
06e0: 64 63 30 36 61 37 20 30 78 63 31 39 62 66 31 37  dc06a7 0xc19bf17
06f0: 34 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  4 \.            
0700: 20 20 20 20 20 20 20 30 78 65 34 39 62 36 39 63         0xe49b69c
0710: 31 20 30 78 65 66 62 65 34 37 38 36 20 30 78 30  1 0xefbe4786 0x0
0720: 66 63 31 39 64 63 36 20 30 78 32 34 30 63 61 31  fc19dc6 0x240ca1
0730: 63 63 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  cc \.           
0740: 20 20 20 20 20 20 20 20 30 78 32 64 65 39 32 63          0x2de92c
0750: 36 66 20 30 78 34 61 37 34 38 34 61 61 20 30 78  6f 0x4a7484aa 0x
0760: 35 63 62 30 61 39 64 63 20 30 78 37 36 66 39 38  5cb0a9dc 0x76f98
0770: 38 64 61 20 5c 0a 20 20 20 20 20 20 20 20 20 20  8da \.          
0780: 20 20 20 20 20 20 20 20 20 30 78 39 38 33 65 35           0x983e5
0790: 31 35 32 20 30 78 61 38 33 31 63 36 36 64 20 30  152 0xa831c66d 0
07a0: 78 62 30 30 33 32 37 63 38 20 30 78 62 66 35 39  xb00327c8 0xbf59
07b0: 37 66 63 37 20 5c 0a 20 20 20 20 20 20 20 20 20  7fc7 \.         
07c0: 20 20 20 20 20 20 20 20 20 20 30 78 63 36 65 30            0xc6e0
07d0: 30 62 66 33 20 30 78 64 35 61 37 39 31 34 37 20  0bf3 0xd5a79147 
07e0: 30 78 30 36 63 61 36 33 35 31 20 30 78 31 34 32  0x06ca6351 0x142
07f0: 39 32 39 36 37 20 5c 0a 20 20 20 20 20 20 20 20  92967 \.        
0800: 20 20 20 20 20 20 20 20 20 20 20 30 78 32 37 62             0x27b
0810: 37 30 61 38 35 20 30 78 32 65 31 62 32 31 33 38  70a85 0x2e1b2138
0820: 20 30 78 34 64 32 63 36 64 66 63 20 30 78 35 33   0x4d2c6dfc 0x53
0830: 33 38 30 64 31 33 20 5c 0a 20 20 20 20 20 20 20  380d13 \.       
0840: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 36 35              0x65
0850: 30 61 37 33 35 34 20 30 78 37 36 36 61 30 61 62  0a7354 0x766a0ab
0860: 62 20 30 78 38 31 63 32 63 39 32 65 20 30 78 39  b 0x81c2c92e 0x9
0870: 32 37 32 32 63 38 35 20 5c 0a 20 20 20 20 20 20  2722c85 \.      
0880: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 61               0xa
0890: 32 62 66 65 38 61 31 20 30 78 61 38 31 61 36 36  2bfe8a1 0xa81a66
08a0: 34 62 20 30 78 63 32 34 62 38 62 37 30 20 30 78  4b 0xc24b8b70 0x
08b0: 63 37 36 63 35 31 61 33 20 5c 0a 20 20 20 20 20  c76c51a3 \.     
08c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78                0x
08d0: 64 31 39 32 65 38 31 39 20 30 78 64 36 39 39 30  d192e819 0xd6990
08e0: 36 32 34 20 30 78 66 34 30 65 33 35 38 35 20 30  624 0xf40e3585 0
08f0: 78 31 30 36 61 61 30 37 30 20 5c 0a 20 20 20 20  x106aa070 \.    
0900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
0910: 78 31 39 61 34 63 31 31 36 20 30 78 31 65 33 37  x19a4c116 0x1e37
0920: 36 63 30 38 20 30 78 32 37 34 38 37 37 34 63 20  6c08 0x2748774c 
0930: 30 78 33 34 62 30 62 63 62 35 20 5c 0a 20 20 20  0x34b0bcb5 \.   
0940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0950: 30 78 33 39 31 63 30 63 62 33 20 30 78 34 65 64  0x391c0cb3 0x4ed
0960: 38 61 61 34 61 20 30 78 35 62 39 63 63 61 34 66  8aa4a 0x5b9cca4f
0970: 20 30 78 36 38 32 65 36 66 66 33 20 5c 0a 20 20   0x682e6ff3 \.  
0980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0990: 20 30 78 37 34 38 66 38 32 65 65 20 30 78 37 38   0x748f82ee 0x78
09a0: 61 35 36 33 36 66 20 30 78 38 34 63 38 37 38 31  a5636f 0x84c8781
09b0: 34 20 30 78 38 63 63 37 30 32 30 38 20 5c 0a 20  4 0x8cc70208 \. 
09c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09d0: 20 20 30 78 39 30 62 65 66 66 66 61 20 30 78 61    0x90befffa 0xa
09e0: 34 35 30 36 63 65 62 20 30 78 62 65 66 39 61 33  4506ceb 0xbef9a3
09f0: 66 37 20 30 78 63 36 37 31 37 38 66 32 20 5c 0a  f7 0xc67178f2 \.
0a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a10: 20 20 5d 0a 20 20 20 20 7d 0a 20 20 20 20 0a 7d    ].    }.    .}
0a20: 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..# ------------
0a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
0a70: 4d 61 6e 61 67 65 6d 65 6e 74 20 6f 66 20 73 68  Management of sh
0a80: 61 32 35 36 20 69 6d 70 6c 65 6d 65 6e 74 61 74  a256 implementat
0a90: 69 6f 6e 73 2e 0a 0a 23 20 4c 6f 61 64 41 63 63  ions...# LoadAcc
0aa0: 65 6c 65 72 61 74 6f 72 20 2d 2d 0a 23 0a 23 09  elerator --.#.#.
0ab0: 54 68 69 73 20 70 61 63 6b 61 67 65 20 63 61 6e  This package can
0ac0: 20 6d 61 6b 65 20 75 73 65 20 6f 66 20 61 20 6e   make use of a n
0ad0: 75 6d 62 65 72 20 6f 66 20 63 6f 6d 70 69 6c 65  umber of compile
0ae0: 64 20 65 78 74 65 6e 73 69 6f 6e 73 20 74 6f 0a  d extensions to.
0af0: 23 09 61 63 63 65 6c 65 72 61 74 65 20 74 68 65  #.accelerate the
0b00: 20 64 69 67 65 73 74 20 63 6f 6d 70 75 74 61 74   digest computat
0b10: 69 6f 6e 2e 20 54 68 69 73 20 70 72 6f 63 65 64  ion. This proced
0b20: 75 72 65 20 6d 61 6e 61 67 65 73 20 74 68 65 0a  ure manages the.
0b30: 23 09 75 73 65 20 6f 66 20 74 68 65 73 65 20 65  #.use of these e
0b40: 78 74 65 6e 73 69 6f 6e 73 20 77 69 74 68 69 6e  xtensions within
0b50: 20 74 68 65 20 70 61 63 6b 61 67 65 2e 20 44 75   the package. Du
0b60: 72 69 6e 67 20 6e 6f 72 6d 61 6c 20 75 73 61 67  ring normal usag
0b70: 65 0a 23 09 74 68 69 73 20 73 68 6f 75 6c 64 20  e.#.this should 
0b80: 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 2c 20 62  not be called, b
0b90: 75 74 20 74 68 65 20 74 65 73 74 20 70 61 63 6b  ut the test pack
0ba0: 61 67 65 20 6d 61 6e 69 70 75 6c 61 74 65 73 20  age manipulates 
0bb0: 74 68 65 0a 23 09 6c 69 73 74 20 6f 66 20 65 6e  the.#.list of en
0bc0: 61 62 6c 65 64 20 61 63 63 65 6c 65 72 61 74 6f  abled accelerato
0bd0: 72 73 2e 0a 23 0a 70 72 6f 63 20 3a 3a 73 68 61  rs..#.proc ::sha
0be0: 32 3a 3a 4c 6f 61 64 41 63 63 65 6c 65 72 61 74  2::LoadAccelerat
0bf0: 6f 72 20 7b 6e 61 6d 65 7d 20 7b 0a 20 20 20 20  or {name} {.    
0c00: 76 61 72 69 61 62 6c 65 20 61 63 63 65 6c 0a 20  variable accel. 
0c10: 20 20 20 73 65 74 20 72 20 30 0a 20 20 20 20 73     set r 0.    s
0c20: 77 69 74 63 68 20 2d 65 78 61 63 74 20 2d 2d 20  witch -exact -- 
0c30: 24 6e 61 6d 65 20 7b 0a 20 20 20 20 20 20 20 20  $name {.        
0c40: 74 63 6c 20 7b 0a 20 20 20 20 20 20 20 20 20 20  tcl {.          
0c50: 20 20 23 20 41 6c 72 65 61 64 79 20 70 72 65 73    # Already pres
0c60: 65 6e 74 20 28 74 68 69 73 20 66 69 6c 65 29 0a  ent (this file).
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
0c80: 72 20 31 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r 1.        }.  
0c90: 20 20 20 20 20 20 63 72 69 74 63 6c 20 7b 0a 20        critcl {. 
0ca0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
0cb0: 5b 63 61 74 63 68 20 7b 70 61 63 6b 61 67 65 20  [catch {package 
0cc0: 72 65 71 75 69 72 65 20 74 63 6c 6c 69 62 63 7d  require tcllibc}
0cd0: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ].              
0ce0: 20 20 7c 7c 20 21 5b 63 61 74 63 68 20 7b 70 61    || ![catch {pa
0cf0: 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 73 68  ckage require sh
0d00: 61 32 35 36 63 7d 5d 7d 20 7b 0a 20 20 20 20 20  a256c}]} {.     
0d10: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 72             set r
0d20: 20 5b 65 78 70 72 20 7b 5b 69 6e 66 6f 20 63 6f   [expr {[info co
0d30: 6d 6d 61 6e 64 73 20 3a 3a 73 68 61 32 3a 3a 73  mmands ::sha2::s
0d40: 68 61 32 35 36 63 5f 75 70 64 61 74 65 5d 20 21  ha256c_update] !
0d50: 3d 20 7b 7d 7d 5d 0a 20 20 20 20 20 20 20 20 20  = {}}].         
0d60: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
0d70: 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 20 7b         default {
0d80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
0d90: 75 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 20  urn -code error 
0da0: 22 69 6e 76 61 6c 69 64 20 61 63 63 65 6c 65 72  "invalid acceler
0db0: 61 74 6f 72 20 24 6b 65 79 3a 5c 0a 20 20 20 20  ator $key:\.    
0dc0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 75 73 74              must
0dd0: 20 62 65 20 6f 6e 65 20 6f 66 20 5b 6a 6f 69 6e   be one of [join
0de0: 20 5b 4b 6e 6f 77 6e 49 6d 70 6c 65 6d 65 6e 74   [KnownImplement
0df0: 61 74 69 6f 6e 73 5d 20 7b 2c 20 7d 5d 22 0a 20  ations] {, }]". 
0e00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20         }.    }. 
0e10: 20 20 20 73 65 74 20 61 63 63 65 6c 28 24 6e 61     set accel($na
0e20: 6d 65 29 20 24 72 0a 20 20 20 20 72 65 74 75 72  me) $r.    retur
0e30: 6e 20 24 72 0a 7d 0a 0a 23 20 3a 3a 73 68 61 32  n $r.}..# ::sha2
0e40: 3a 3a 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  ::Implementation
0e50: 73 20 2d 2d 0a 23 0a 23 09 44 65 74 65 72 6d 69  s --.#.#.Determi
0e60: 6e 65 73 20 77 68 69 63 68 20 69 6d 70 6c 65 6d  nes which implem
0e70: 65 6e 74 61 74 69 6f 6e 73 20 61 72 65 0a 23 09  entations are.#.
0e80: 70 72 65 73 65 6e 74 2c 20 69 2e 65 2e 20 6c 6f  present, i.e. lo
0e90: 61 64 65 64 2e 0a 23 0a 23 20 41 72 67 75 6d 65  aded..#.# Argume
0ea0: 6e 74 73 3a 0a 23 09 4e 6f 6e 65 2e 0a 23 0a 23  nts:.#.None..#.#
0eb0: 20 52 65 73 75 6c 74 73 3a 0a 23 09 41 20 6c 69   Results:.#.A li
0ec0: 73 74 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 61  st of implementa
0ed0: 74 69 6f 6e 20 6b 65 79 73 2e 0a 0a 70 72 6f 63  tion keys...proc
0ee0: 20 3a 3a 73 68 61 32 3a 3a 49 6d 70 6c 65 6d 65   ::sha2::Impleme
0ef0: 6e 74 61 74 69 6f 6e 73 20 7b 7d 20 7b 0a 20 20  ntations {} {.  
0f00: 20 20 76 61 72 69 61 62 6c 65 20 61 63 63 65 6c    variable accel
0f10: 0a 20 20 20 20 73 65 74 20 72 65 73 20 7b 7d 0a  .    set res {}.
0f20: 20 20 20 20 66 6f 72 65 61 63 68 20 6e 20 5b 61      foreach n [a
0f30: 72 72 61 79 20 6e 61 6d 65 73 20 61 63 63 65 6c  rray names accel
0f40: 5d 20 7b 0a 09 69 66 20 7b 21 24 61 63 63 65 6c  ] {..if {!$accel
0f50: 28 24 6e 29 7d 20 63 6f 6e 74 69 6e 75 65 0a 09  ($n)} continue..
0f60: 6c 61 70 70 65 6e 64 20 72 65 73 20 24 6e 0a 20  lappend res $n. 
0f70: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
0f80: 24 72 65 73 0a 7d 0a 0a 23 20 3a 3a 73 68 61 32  $res.}..# ::sha2
0f90: 3a 3a 4b 6e 6f 77 6e 49 6d 70 6c 65 6d 65 6e 74  ::KnownImplement
0fa0: 61 74 69 6f 6e 73 20 2d 2d 0a 23 0a 23 09 44 65  ations --.#.#.De
0fb0: 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 69  termines which i
0fc0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61  mplementations a
0fd0: 72 65 20 6b 6e 6f 77 6e 0a 23 09 61 73 20 70 6f  re known.#.as po
0fe0: 73 73 69 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74  ssible implement
0ff0: 61 74 69 6f 6e 73 2e 0a 23 0a 23 20 41 72 67 75  ations..#.# Argu
1000: 6d 65 6e 74 73 3a 0a 23 09 4e 6f 6e 65 2e 0a 23  ments:.#.None..#
1010: 0a 23 20 52 65 73 75 6c 74 73 3a 0a 23 09 41 20  .# Results:.#.A 
1020: 6c 69 73 74 20 6f 66 20 69 6d 70 6c 65 6d 65 6e  list of implemen
1030: 74 61 74 69 6f 6e 20 6b 65 79 73 2e 20 49 6e 20  tation keys. In 
1040: 74 68 65 20 6f 72 64 65 72 0a 23 09 6f 66 20 70  the order.#.of p
1050: 72 65 66 65 72 65 6e 63 65 2c 20 6d 6f 73 74 20  reference, most 
1060: 70 72 65 66 65 72 65 64 20 66 69 72 73 74 2e 0a  prefered first..
1070: 0a 70 72 6f 63 20 3a 3a 73 68 61 32 3a 3a 4b 6e  .proc ::sha2::Kn
1080: 6f 77 6e 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ownImplementatio
1090: 6e 73 20 7b 7d 20 7b 0a 20 20 20 20 72 65 74 75  ns {} {.    retu
10a0: 72 6e 20 7b 63 72 69 74 63 6c 20 74 63 6c 7d 0a  rn {critcl tcl}.
10b0: 7d 0a 0a 70 72 6f 63 20 3a 3a 73 68 61 32 3a 3a  }..proc ::sha2::
10c0: 4e 61 6d 65 73 20 7b 7d 20 7b 0a 20 20 20 20 72  Names {} {.    r
10d0: 65 74 75 72 6e 20 7b 0a 09 63 72 69 74 63 6c 20  eturn {..critcl 
10e0: 20 20 7b 74 63 6c 6c 69 62 63 20 62 61 73 65 64    {tcllibc based
10f0: 7d 0a 09 74 63 6c 20 20 20 20 20 20 7b 70 75 72  }..tcl      {pur
1100: 65 20 54 63 6c 7d 0a 20 20 20 20 7d 0a 7d 0a 0a  e Tcl}.    }.}..
1110: 23 20 3a 3a 73 68 61 32 3a 3a 53 77 69 74 63 68  # ::sha2::Switch
1120: 54 6f 20 2d 2d 0a 23 0a 23 09 41 63 74 69 76 61  To --.#.#.Activa
1130: 74 65 73 20 61 20 6c 6f 61 64 65 64 20 6e 61 6d  tes a loaded nam
1140: 65 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ed implementatio
1150: 6e 2e 0a 23 0a 23 20 41 72 67 75 6d 65 6e 74 73  n..#.# Arguments
1160: 3a 0a 23 09 6b 65 79 09 4e 61 6d 65 20 6f 66 20  :.#.key.Name of 
1170: 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
1180: 6f 6e 20 74 6f 20 61 63 74 69 76 61 74 65 2e 0a  on to activate..
1190: 23 0a 23 20 52 65 73 75 6c 74 73 3a 0a 23 09 4e  #.# Results:.#.N
11a0: 6f 6e 65 2e 0a 0a 70 72 6f 63 20 3a 3a 73 68 61  one...proc ::sha
11b0: 32 3a 3a 53 77 69 74 63 68 54 6f 20 7b 6b 65 79  2::SwitchTo {key
11c0: 7d 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c 65  } {.    variable
11d0: 20 61 63 63 65 6c 0a 20 20 20 20 76 61 72 69 61   accel.    varia
11e0: 62 6c 65 20 6c 6f 61 64 65 64 0a 0a 20 20 20 20  ble loaded..    
11f0: 69 66 20 7b 5b 73 74 72 69 6e 67 20 65 71 75 61  if {[string equa
1200: 6c 20 24 6b 65 79 20 24 6c 6f 61 64 65 64 5d 7d  l $key $loaded]}
1210: 20 7b 0a 09 23 20 4e 6f 20 63 68 61 6e 67 65 2c   {..# No change,
1220: 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 2e 0a   nothing to do..
1230: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 20 65 6c  .return.    } el
1240: 73 65 69 66 20 7b 21 5b 73 74 72 69 6e 67 20 65  seif {![string e
1250: 71 75 61 6c 20 24 6b 65 79 20 22 22 5d 7d 20 7b  qual $key ""]} {
1260: 0a 09 23 20 56 61 6c 69 64 61 74 65 20 74 68 65  ..# Validate the
1270: 20 74 61 72 67 65 74 20 69 6d 70 6c 65 6d 65 6e   target implemen
1280: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 77  tation of the sw
1290: 69 74 63 68 2e 0a 0a 09 69 66 20 7b 21 5b 69 6e  itch....if {![in
12a0: 66 6f 20 65 78 69 73 74 73 20 61 63 63 65 6c 28  fo exists accel(
12b0: 24 6b 65 79 29 5d 7d 20 7b 0a 09 20 20 20 20 72  $key)]} {..    r
12c0: 65 74 75 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f  eturn -code erro
12d0: 72 20 22 55 6e 61 62 6c 65 20 74 6f 20 61 63 74  r "Unable to act
12e0: 69 76 61 74 65 20 75 6e 6b 6e 6f 77 6e 20 69 6d  ivate unknown im
12f0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 5c 22 24  plementation \"$
1300: 6b 65 79 5c 22 22 0a 09 7d 20 65 6c 73 65 69 66  key\""..} elseif
1310: 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
1320: 61 63 63 65 6c 28 24 6b 65 79 29 5d 20 7c 7c 20  accel($key)] || 
1330: 21 24 61 63 63 65 6c 28 24 6b 65 79 29 7d 20 7b  !$accel($key)} {
1340: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d 63 6f  ..    return -co
1350: 64 65 20 65 72 72 6f 72 20 22 55 6e 61 62 6c 65  de error "Unable
1360: 20 74 6f 20 61 63 74 69 76 61 74 65 20 6d 69 73   to activate mis
1370: 73 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74  sing implementat
1380: 69 6f 6e 20 5c 22 24 6b 65 79 5c 22 22 0a 09 7d  ion \"$key\""..}
1390: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 44 65  .    }..    # De
13a0: 61 63 74 69 76 61 74 65 20 74 68 65 20 70 72 65  activate the pre
13b0: 76 69 6f 75 73 20 69 6d 70 6c 65 6d 65 6e 74 61  vious implementa
13c0: 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65 20 77  tion, if there w
13d0: 61 73 20 61 6e 79 2e 0a 0a 20 20 20 20 69 66 20  as any...    if 
13e0: 7b 21 5b 73 74 72 69 6e 67 20 65 71 75 61 6c 20  {![string equal 
13f0: 24 6c 6f 61 64 65 64 20 22 22 5d 7d 20 7b 0a 20  $loaded ""]} {. 
1400: 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 63         foreach c
1410: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53   {.            S
1420: 48 41 32 35 36 49 6e 69 74 20 20 20 53 48 41 32  HA256Init   SHA2
1430: 32 34 49 6e 69 74 0a 20 20 20 20 20 20 20 20 20  24Init.         
1440: 20 20 20 53 48 41 32 35 36 46 69 6e 61 6c 20 20     SHA256Final  
1450: 53 48 41 32 32 34 46 69 6e 61 6c 0a 20 20 20 20  SHA224Final.    
1460: 20 20 20 20 20 20 20 20 53 48 41 32 35 36 55 70          SHA256Up
1470: 64 61 74 65 0a 20 20 20 20 20 20 20 20 7d 20 7b  date.        } {
1480: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6e  .            ren
1490: 61 6d 65 20 3a 3a 73 68 61 32 3a 3a 24 63 20 3a  ame ::sha2::$c :
14a0: 3a 73 68 61 32 3a 3a 24 7b 63 7d 2d 24 7b 6c 6f  :sha2::${c}-${lo
14b0: 61 64 65 64 7d 0a 20 20 20 20 20 20 20 20 7d 0a  aded}.        }.
14c0: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 41 63 74      }..    # Act
14d0: 69 76 61 74 65 20 74 68 65 20 6e 65 77 20 69 6d  ivate the new im
14e0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 69 66  plementation, if
14f0: 20 74 68 65 72 65 20 69 73 20 61 6e 79 2e 0a 0a   there is any...
1500: 20 20 20 20 69 66 20 7b 21 5b 73 74 72 69 6e 67      if {![string
1510: 20 65 71 75 61 6c 20 24 6b 65 79 20 22 22 5d 7d   equal $key ""]}
1520: 20 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61   {.        forea
1530: 63 68 20 63 20 7b 0a 20 20 20 20 20 20 20 20 20  ch c {.         
1540: 20 20 20 53 48 41 32 35 36 49 6e 69 74 20 20 20     SHA256Init   
1550: 53 48 41 32 32 34 49 6e 69 74 0a 20 20 20 20 20  SHA224Init.     
1560: 20 20 20 20 20 20 20 53 48 41 32 35 36 46 69 6e         SHA256Fin
1570: 61 6c 20 20 53 48 41 32 32 34 46 69 6e 61 6c 0a  al  SHA224Final.
1580: 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41 32              SHA2
1590: 35 36 55 70 64 61 74 65 0a 20 20 20 20 20 20 20  56Update.       
15a0: 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20   } {.           
15b0: 20 72 65 6e 61 6d 65 20 3a 3a 73 68 61 32 3a 3a   rename ::sha2::
15c0: 24 7b 63 7d 2d 24 7b 6b 65 79 7d 20 3a 3a 73 68  ${c}-${key} ::sh
15d0: 61 32 3a 3a 24 63 0a 20 20 20 20 20 20 20 20 7d  a2::$c.        }
15e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 52 65  .    }..    # Re
15f0: 6d 65 6d 62 65 72 20 74 68 65 20 61 63 74 69 76  member the activ
1600: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
1610: 2c 20 66 6f 72 20 64 65 61 63 74 69 76 61 74 69  , for deactivati
1620: 6f 6e 20 62 79 20 66 75 74 75 72 65 0a 20 20 20  on by future.   
1630: 20 23 20 73 77 69 74 63 68 65 73 2e 0a 0a 20 20   # switches...  
1640: 20 20 73 65 74 20 6c 6f 61 64 65 64 20 24 6b 65    set loaded $ke
1650: 79 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a  y.    return.}..
1660: 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  # --------------
1670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 20 53  -----------..# S
16b0: 48 41 32 35 36 49 6e 69 74 20 2d 2d 0a 23 0a 23  HA256Init --.#.#
16c0: 20 20 20 43 72 65 61 74 65 20 61 6e 64 20 69 6e     Create and in
16d0: 69 74 69 61 6c 69 7a 65 20 61 6e 20 53 48 41 32  itialize an SHA2
16e0: 35 36 20 73 74 61 74 65 20 76 61 72 69 61 62 6c  56 state variabl
16f0: 65 2e 20 54 68 69 73 20 77 69 6c 6c 20 62 65 0a  e. This will be.
1700: 23 20 20 20 63 6c 65 61 6e 65 64 20 75 70 20 77  #   cleaned up w
1710: 68 65 6e 20 77 65 20 63 61 6c 6c 20 53 48 41 32  hen we call SHA2
1720: 35 36 46 69 6e 61 6c 0a 23 0a 0a 70 72 6f 63 20  56Final.#..proc 
1730: 3a 3a 73 68 61 32 3a 3a 53 48 41 32 35 36 49 6e  ::sha2::SHA256In
1740: 69 74 2d 74 63 6c 20 7b 7d 20 7b 0a 20 20 20 20  it-tcl {} {.    
1750: 76 61 72 69 61 62 6c 65 20 75 69 64 0a 20 20 20  variable uid.   
1760: 20 73 65 74 20 74 6f 6b 65 6e 20 5b 6e 61 6d 65   set token [name
1770: 73 70 61 63 65 20 63 75 72 72 65 6e 74 5d 3a 3a  space current]::
1780: 5b 69 6e 63 72 20 75 69 64 5d 0a 20 20 20 20 75  [incr uid].    u
1790: 70 76 61 72 20 23 30 20 24 74 6f 6b 65 6e 20 74  pvar #0 $token t
17a0: 6f 6b 0a 0a 20 20 20 20 23 20 46 49 50 53 20 31  ok..    # FIPS 1
17b0: 38 30 2d 32 3a 20 35 2e 33 2e 32 20 53 65 74 74  80-2: 5.3.2 Sett
17c0: 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c 20  ing the initial 
17d0: 68 61 73 68 20 76 61 6c 75 65 0a 20 20 20 20 61  hash value.    a
17e0: 72 72 61 79 20 73 65 74 20 74 6f 6b 20 5c 0a 20  rray set tok \. 
17f0: 20 20 20 20 20 20 20 20 20 20 20 5b 6c 69 73 74             [list
1800: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 41   \.            A
1810: 20 5b 65 78 70 72 20 7b 69 6e 74 28 30 78 36 61   [expr {int(0x6a
1820: 30 39 65 36 36 37 29 7d 5d 20 5c 0a 20 20 20 20  09e667)}] \.    
1830: 20 20 20 20 20 20 20 20 42 20 5b 65 78 70 72 20          B [expr 
1840: 7b 69 6e 74 28 30 78 62 62 36 37 61 65 38 35 29  {int(0xbb67ae85)
1850: 7d 5d 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  }] \.           
1860: 20 43 20 5b 65 78 70 72 20 7b 69 6e 74 28 30 78   C [expr {int(0x
1870: 33 63 36 65 66 33 37 32 29 7d 5d 20 5c 0a 20 20  3c6ef372)}] \.  
1880: 20 20 20 20 20 20 20 20 20 20 44 20 5b 65 78 70            D [exp
1890: 72 20 7b 69 6e 74 28 30 78 61 35 34 66 66 35 33  r {int(0xa54ff53
18a0: 61 29 7d 5d 20 5c 0a 20 20 20 20 20 20 20 20 20  a)}] \.         
18b0: 20 20 20 45 20 5b 65 78 70 72 20 7b 69 6e 74 28     E [expr {int(
18c0: 30 78 35 31 30 65 35 32 37 66 29 7d 5d 20 5c 0a  0x510e527f)}] \.
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 46 20 5b 65              F [e
18e0: 78 70 72 20 7b 69 6e 74 28 30 78 39 62 30 35 36  xpr {int(0x9b056
18f0: 38 38 63 29 7d 5d 20 5c 0a 20 20 20 20 20 20 20  88c)}] \.       
1900: 20 20 20 20 20 47 20 5b 65 78 70 72 20 7b 69 6e       G [expr {in
1910: 74 28 30 78 31 66 38 33 64 39 61 62 29 7d 5d 20  t(0x1f83d9ab)}] 
1920: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 48 20  \.            H 
1930: 5b 65 78 70 72 20 7b 69 6e 74 28 30 78 35 62 65  [expr {int(0x5be
1940: 30 63 64 31 39 29 7d 5d 20 5c 0a 20 20 20 20 20  0cd19)}] \.     
1950: 20 20 20 20 20 20 20 6e 20 30 20 69 20 22 22 20         n 0 i "" 
1960: 76 20 32 35 36 5d 0a 20 20 20 20 72 65 74 75 72  v 256].    retur
1970: 6e 20 24 74 6f 6b 65 6e 0a 7d 0a 0a 70 72 6f 63  n $token.}..proc
1980: 20 3a 3a 73 68 61 32 3a 3a 53 48 41 32 35 36 49   ::sha2::SHA256I
1990: 6e 69 74 2d 63 72 69 74 63 6c 20 7b 7d 20 7b 0a  nit-critcl {} {.
19a0: 20 20 20 20 76 61 72 69 61 62 6c 65 20 75 69 64      variable uid
19b0: 0a 20 20 20 20 73 65 74 20 74 6f 6b 65 6e 20 5b  .    set token [
19c0: 6e 61 6d 65 73 70 61 63 65 20 63 75 72 72 65 6e  namespace curren
19d0: 74 5d 3a 3a 5b 69 6e 63 72 20 75 69 64 5d 0a 20  t]::[incr uid]. 
19e0: 20 20 20 75 70 76 61 72 20 23 30 20 24 74 6f 6b     upvar #0 $tok
19f0: 65 6e 20 74 6f 6b 0a 0a 20 20 20 20 23 20 46 49  en tok..    # FI
1a00: 50 53 20 31 38 30 2d 32 3a 20 35 2e 33 2e 32 20  PS 180-2: 5.3.2 
1a10: 53 65 74 74 69 6e 67 20 74 68 65 20 69 6e 69 74  Setting the init
1a20: 69 61 6c 20 68 61 73 68 20 76 61 6c 75 65 0a 20  ial hash value. 
1a30: 20 20 20 73 65 74 20 74 6f 6b 28 73 68 61 32 35     set tok(sha25
1a40: 36 63 29 20 5b 73 68 61 32 35 36 63 5f 69 6e 69  6c) [sha256c_ini
1a50: 74 32 35 36 5d 0a 20 20 20 20 72 65 74 75 72 6e  t256].    return
1a60: 20 24 74 6f 6b 65 6e 0a 7d 0a 0a 23 20 53 48 41   $token.}..# SHA
1a70: 32 35 36 55 70 64 61 74 65 20 2d 2d 0a 23 0a 23  256Update --.#.#
1a80: 20 20 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65     This is calle
1a90: 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20 64 61  d to add more da
1aa0: 74 61 20 69 6e 74 6f 20 74 68 65 20 68 61 73 68  ta into the hash
1ab0: 2e 20 59 6f 75 20 6d 61 79 20 63 61 6c 6c 20 74  . You may call t
1ac0: 68 69 73 0a 23 20 20 20 61 73 20 6d 61 6e 79 20  his.#   as many 
1ad0: 74 69 6d 65 73 20 61 73 20 79 6f 75 20 72 65 71  times as you req
1ae0: 75 69 72 65 2e 20 4e 6f 74 65 20 74 68 61 74 20  uire. Note that 
1af0: 70 61 73 73 69 6e 67 20 69 6e 20 22 41 42 43 22  passing in "ABC"
1b00: 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 0a 23   is equivalent.#
1b10: 20 20 20 74 6f 20 70 61 73 73 69 6e 67 20 74 68     to passing th
1b20: 65 73 65 20 6c 65 74 74 65 72 73 20 69 6e 20 61  ese letters in a
1b30: 73 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c 73  s separate calls
1b40: 20 2d 2d 20 68 65 6e 63 65 20 74 68 69 73 20 70   -- hence this p
1b50: 72 6f 63 20 0a 23 20 20 20 70 65 72 6d 69 74 73  roc .#   permits
1b60: 20 68 61 73 68 69 6e 67 20 6f 66 20 63 68 75 6e   hashing of chun
1b70: 6b 65 64 20 64 61 74 61 0a 23 0a 23 20 20 20 49  ked data.#.#   I
1b80: 66 20 77 65 20 68 61 76 65 20 61 20 43 2d 62 61  f we have a C-ba
1b90: 73 65 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  sed implementati
1ba0: 6f 6e 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68  on available, th
1bb0: 65 6e 20 77 65 20 77 69 6c 6c 20 75 73 65 0a 23  en we will use.#
1bc0: 20 20 20 69 74 20 68 65 72 65 20 69 6e 20 70 72     it here in pr
1bd0: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
1be0: 70 75 72 65 2d 54 63 6c 20 69 6d 70 6c 65 6d 65  pure-Tcl impleme
1bf0: 6e 74 61 74 69 6f 6e 2e 0a 23 0a 0a 70 72 6f 63  ntation..#..proc
1c00: 20 3a 3a 73 68 61 32 3a 3a 53 48 41 32 35 36 55   ::sha2::SHA256U
1c10: 70 64 61 74 65 2d 74 63 6c 20 7b 74 6f 6b 65 6e  pdate-tcl {token
1c20: 20 64 61 74 61 7d 20 7b 0a 20 20 20 20 75 70 76   data} {.    upv
1c30: 61 72 20 23 30 20 24 74 6f 6b 65 6e 20 73 74 61  ar #0 $token sta
1c40: 74 65 0a 0a 20 20 20 20 23 20 55 70 64 61 74 65  te..    # Update
1c50: 20 74 68 65 20 73 74 61 74 65 20 76 61 6c 75 65   the state value
1c60: 73 0a 20 20 20 20 69 6e 63 72 20 20 20 73 74 61  s.    incr   sta
1c70: 74 65 28 6e 29 20 5b 73 74 72 69 6e 67 20 6c 65  te(n) [string le
1c80: 6e 67 74 68 20 24 64 61 74 61 5d 0a 20 20 20 20  ngth $data].    
1c90: 61 70 70 65 6e 64 20 73 74 61 74 65 28 69 29 20  append state(i) 
1ca0: 24 64 61 74 61 0a 0a 20 20 20 20 23 20 43 61 6c  $data..    # Cal
1cb0: 63 75 6c 61 74 65 20 74 68 65 20 68 61 73 68 20  culate the hash 
1cc0: 66 6f 72 20 61 6e 79 20 63 6f 6d 70 6c 65 74 65  for any complete
1cd0: 20 62 6c 6f 63 6b 73 0a 20 20 20 20 73 65 74 20   blocks.    set 
1ce0: 6c 65 6e 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67  len [string leng
1cf0: 74 68 20 24 73 74 61 74 65 28 69 29 5d 0a 20 20  th $state(i)].  
1d00: 20 20 66 6f 72 20 7b 73 65 74 20 6e 20 30 7d 20    for {set n 0} 
1d10: 7b 28 24 6e 20 2b 20 36 34 29 20 3c 3d 20 24 6c  {($n + 64) <= $l
1d20: 65 6e 7d 20 7b 7d 20 7b 0a 20 20 20 20 20 20 20  en} {} {.       
1d30: 20 53 48 41 32 35 36 54 72 61 6e 73 66 6f 72 6d   SHA256Transform
1d40: 20 24 74 6f 6b 65 6e 20 5b 73 74 72 69 6e 67 20   $token [string 
1d50: 72 61 6e 67 65 20 24 73 74 61 74 65 28 69 29 20  range $state(i) 
1d60: 24 6e 20 5b 69 6e 63 72 20 6e 20 36 34 5d 5d 0a  $n [incr n 64]].
1d70: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 41 64 6a      }..    # Adj
1d80: 75 73 74 20 74 68 65 20 73 74 61 74 65 20 66 6f  ust the state fo
1d90: 72 20 74 68 65 20 62 6c 6f 63 6b 73 20 63 6f 6d  r the blocks com
1da0: 70 6c 65 74 65 64 2e 0a 20 20 20 20 73 65 74 20  pleted..    set 
1db0: 73 74 61 74 65 28 69 29 20 5b 73 74 72 69 6e 67  state(i) [string
1dc0: 20 72 61 6e 67 65 20 24 73 74 61 74 65 28 69 29   range $state(i)
1dd0: 20 24 6e 20 65 6e 64 5d 0a 20 20 20 20 72 65 74   $n end].    ret
1de0: 75 72 6e 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 73 68  urn.}..proc ::sh
1df0: 61 32 3a 3a 53 48 41 32 35 36 55 70 64 61 74 65  a2::SHA256Update
1e00: 2d 63 72 69 74 63 6c 20 7b 74 6f 6b 65 6e 20 64  -critcl {token d
1e10: 61 74 61 7d 20 7b 0a 20 20 20 20 75 70 76 61 72  ata} {.    upvar
1e20: 20 23 30 20 24 74 6f 6b 65 6e 20 73 74 61 74 65   #0 $token state
1e30: 0a 0a 20 20 20 20 73 65 74 20 73 74 61 74 65 28  ..    set state(
1e40: 73 68 61 32 35 36 63 29 20 5b 73 68 61 32 35 36  sha256c) [sha256
1e50: 63 5f 75 70 64 61 74 65 20 24 64 61 74 61 20 24  c_update $data $
1e60: 73 74 61 74 65 28 73 68 61 32 35 36 63 29 5d 0a  state(sha256c)].
1e70: 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 23 20      return.}..# 
1e80: 53 48 41 32 35 36 46 69 6e 61 6c 20 2d 2d 0a 23  SHA256Final --.#
1e90: 0a 23 20 20 20 20 54 68 69 73 20 70 72 6f 63 65  .#    This proce
1ea0: 64 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20  dure is used to 
1eb0: 63 6c 6f 73 65 20 74 68 65 20 63 75 72 72 65 6e  close the curren
1ec0: 74 20 68 61 73 68 20 61 6e 64 20 72 65 74 75 72  t hash and retur
1ed0: 6e 73 20 74 68 65 0a 23 20 20 20 20 68 61 73 68  ns the.#    hash
1ee0: 20 64 61 74 61 2e 20 4f 6e 63 65 20 74 68 69 73   data. Once this
1ef0: 20 70 72 6f 63 65 64 75 72 65 20 68 61 73 20 62   procedure has b
1f00: 65 65 6e 20 63 61 6c 6c 65 64 20 74 68 65 20 68  een called the h
1f10: 61 73 68 20 63 6f 6e 74 65 78 74 0a 23 20 20 20  ash context.#   
1f20: 20 69 73 20 66 72 65 65 64 20 61 6e 64 20 63 61   is freed and ca
1f30: 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 61 67 61  nnot be used aga
1f40: 69 6e 2e 0a 23 0a 23 20 20 20 20 4e 6f 74 65 20  in..#.#    Note 
1f50: 74 68 61 74 20 74 68 65 20 6f 75 74 70 75 74 20  that the output 
1f60: 69 73 20 32 35 36 20 62 69 74 73 20 72 65 70 72  is 256 bits repr
1f70: 65 73 65 6e 74 65 64 20 61 73 20 62 69 6e 61 72  esented as binar
1f80: 79 20 64 61 74 61 2e 0a 23 0a 0a 70 72 6f 63 20  y data..#..proc 
1f90: 3a 3a 73 68 61 32 3a 3a 53 48 41 32 35 36 46 69  ::sha2::SHA256Fi
1fa0: 6e 61 6c 2d 74 63 6c 20 7b 74 6f 6b 65 6e 7d 20  nal-tcl {token} 
1fb0: 7b 0a 20 20 20 20 75 70 76 61 72 20 23 30 20 24  {.    upvar #0 $
1fc0: 74 6f 6b 65 6e 20 73 74 61 74 65 0a 20 20 20 20  token state.    
1fd0: 53 48 41 32 35 36 50 65 6e 75 6c 74 69 6d 61 74  SHA256Penultimat
1fe0: 65 20 24 74 6f 6b 65 6e 0a 20 20 20 20 0a 20 20  e $token.    .  
1ff0: 20 20 23 20 4f 75 74 70 75 74 0a 20 20 20 20 73    # Output.    s
2000: 65 74 20 72 20 5b 62 79 74 65 73 20 24 73 74 61  et r [bytes $sta
2010: 74 65 28 41 29 5d 5b 62 79 74 65 73 20 24 73 74  te(A)][bytes $st
2020: 61 74 65 28 42 29 5d 5b 62 79 74 65 73 20 24 73  ate(B)][bytes $s
2030: 74 61 74 65 28 43 29 5d 5b 62 79 74 65 73 20 24  tate(C)][bytes $
2040: 73 74 61 74 65 28 44 29 5d 5b 62 79 74 65 73 20  state(D)][bytes 
2050: 24 73 74 61 74 65 28 45 29 5d 5b 62 79 74 65 73  $state(E)][bytes
2060: 20 24 73 74 61 74 65 28 46 29 5d 5b 62 79 74 65   $state(F)][byte
2070: 73 20 24 73 74 61 74 65 28 47 29 5d 5b 62 79 74  s $state(G)][byt
2080: 65 73 20 24 73 74 61 74 65 28 48 29 5d 0a 20 20  es $state(H)].  
2090: 20 20 75 6e 73 65 74 20 73 74 61 74 65 0a 20 20    unset state.  
20a0: 20 20 72 65 74 75 72 6e 20 24 72 0a 7d 0a 0a 70    return $r.}..p
20b0: 72 6f 63 20 3a 3a 73 68 61 32 3a 3a 53 48 41 32  roc ::sha2::SHA2
20c0: 35 36 46 69 6e 61 6c 2d 63 72 69 74 63 6c 20 7b  56Final-critcl {
20d0: 74 6f 6b 65 6e 7d 20 7b 0a 20 20 20 20 75 70 76  token} {.    upv
20e0: 61 72 20 23 30 20 24 74 6f 6b 65 6e 20 73 74 61  ar #0 $token sta
20f0: 74 65 0a 20 20 20 20 73 65 74 20 72 20 24 73 74  te.    set r $st
2100: 61 74 65 28 73 68 61 32 35 36 63 29 0a 20 20 20  ate(sha256c).   
2110: 20 75 6e 73 65 74 20 20 73 74 61 74 65 0a 20 20   unset  state.  
2120: 20 20 72 65 74 75 72 6e 20 24 72 0a 7d 0a 0a 23    return $r.}..#
2130: 20 53 48 41 32 35 36 50 65 6e 75 6c 74 69 6d 61   SHA256Penultima
2140: 74 65 20 2d 2d 0a 23 0a 23 0a 70 72 6f 63 20 3a  te --.#.#.proc :
2150: 3a 73 68 61 32 3a 3a 53 48 41 32 35 36 50 65 6e  :sha2::SHA256Pen
2160: 75 6c 74 69 6d 61 74 65 20 7b 74 6f 6b 65 6e 7d  ultimate {token}
2170: 20 7b 0a 20 20 20 20 75 70 76 61 72 20 23 30 20   {.    upvar #0 
2180: 24 74 6f 6b 65 6e 20 73 74 61 74 65 0a 0a 20 20  $token state..  
2190: 20 20 23 20 46 49 50 53 20 31 38 30 2d 32 3a 20    # FIPS 180-2: 
21a0: 35 2e 31 2e 31 3a 20 50 61 64 64 69 6e 67 20 74  5.1.1: Padding t
21b0: 68 65 20 6d 65 73 73 61 67 65 0a 20 20 20 20 23  he message.    #
21c0: 0a 20 20 20 20 73 65 74 20 6c 65 6e 20 5b 73 74  .    set len [st
21d0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 74 61  ring length $sta
21e0: 74 65 28 69 29 5d 0a 20 20 20 20 73 65 74 20 70  te(i)].    set p
21f0: 61 64 20 5b 65 78 70 72 20 7b 35 36 20 2d 20 28  ad [expr {56 - (
2200: 24 6c 65 6e 20 25 20 36 34 29 7d 5d 0a 20 20 20  $len % 64)}].   
2210: 20 69 66 20 7b 24 6c 65 6e 20 25 20 36 34 20 3e   if {$len % 64 >
2220: 20 35 36 7d 20 7b 0a 20 20 20 20 20 20 20 20 69   56} {.        i
2230: 6e 63 72 20 70 61 64 20 36 34 0a 20 20 20 20 7d  ncr pad 64.    }
2240: 0a 20 20 20 20 69 66 20 7b 24 70 61 64 20 3d 3d  .    if {$pad ==
2250: 20 30 7d 20 7b 0a 20 20 20 20 20 20 20 20 69 6e   0} {.        in
2260: 63 72 20 70 61 64 20 36 34 0a 20 20 20 20 7d 0a  cr pad 64.    }.
2270: 20 20 20 20 61 70 70 65 6e 64 20 73 74 61 74 65      append state
2280: 28 69 29 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d  (i) [binary form
2290: 61 74 20 61 24 70 61 64 20 5c 78 38 30 5d 0a 0a  at a$pad \x80]..
22a0: 20 20 20 20 23 20 41 70 70 65 6e 64 20 6c 65 6e      # Append len
22b0: 67 74 68 20 69 6e 20 62 69 74 73 20 61 73 20 62  gth in bits as b
22c0: 69 67 2d 65 6e 64 69 61 6e 20 77 69 64 65 20 69  ig-endian wide i
22d0: 6e 74 2e 0a 20 20 20 20 73 65 74 20 64 6c 65 6e  nt..    set dlen
22e0: 20 5b 65 78 70 72 20 7b 38 20 2a 20 24 73 74 61   [expr {8 * $sta
22f0: 74 65 28 6e 29 7d 5d 0a 20 20 20 20 61 70 70 65  te(n)}].    appe
2300: 6e 64 20 73 74 61 74 65 28 69 29 20 5b 62 69 6e  nd state(i) [bin
2310: 61 72 79 20 66 6f 72 6d 61 74 20 49 49 20 30 20  ary format II 0 
2320: 24 64 6c 65 6e 5d 0a 0a 20 20 20 20 23 20 43 61  $dlen]..    # Ca
2330: 6c 63 75 6c 61 74 65 20 74 68 65 20 68 61 73 68  lculate the hash
2340: 20 66 6f 72 20 74 68 65 20 72 65 6d 61 69 6e 69   for the remaini
2350: 6e 67 20 62 6c 6f 63 6b 2e 0a 20 20 20 20 73 65  ng block..    se
2360: 74 20 6c 65 6e 20 5b 73 74 72 69 6e 67 20 6c 65  t len [string le
2370: 6e 67 74 68 20 24 73 74 61 74 65 28 69 29 5d 0a  ngth $state(i)].
2380: 20 20 20 20 66 6f 72 20 7b 73 65 74 20 6e 20 30      for {set n 0
2390: 7d 20 7b 28 24 6e 20 2b 20 36 34 29 20 3c 3d 20  } {($n + 64) <= 
23a0: 24 6c 65 6e 7d 20 7b 7d 20 7b 0a 20 20 20 20 20  $len} {} {.     
23b0: 20 20 20 53 48 41 32 35 36 54 72 61 6e 73 66 6f     SHA256Transfo
23c0: 72 6d 20 24 74 6f 6b 65 6e 20 5b 73 74 72 69 6e  rm $token [strin
23d0: 67 20 72 61 6e 67 65 20 24 73 74 61 74 65 28 69  g range $state(i
23e0: 29 20 24 6e 20 5b 69 6e 63 72 20 6e 20 36 34 5d  ) $n [incr n 64]
23f0: 5d 0a 20 20 20 20 7d 0a 7d 0a 0a 23 20 2d 2d 2d  ].    }.}..# ---
2400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2440: 2d 2d 2d 2d 2d 2d 0a 0a 70 72 6f 63 20 3a 3a 73  ------..proc ::s
2450: 68 61 32 3a 3a 53 48 41 32 32 34 49 6e 69 74 2d  ha2::SHA224Init-
2460: 74 63 6c 20 7b 7d 20 7b 0a 20 20 20 20 76 61 72  tcl {} {.    var
2470: 69 61 62 6c 65 20 75 69 64 0a 20 20 20 20 73 65  iable uid.    se
2480: 74 20 74 6f 6b 65 6e 20 5b 6e 61 6d 65 73 70 61  t token [namespa
2490: 63 65 20 63 75 72 72 65 6e 74 5d 3a 3a 5b 69 6e  ce current]::[in
24a0: 63 72 20 75 69 64 5d 0a 20 20 20 20 75 70 76 61  cr uid].    upva
24b0: 72 20 23 30 20 24 74 6f 6b 65 6e 20 74 6f 6b 0a  r #0 $token tok.
24c0: 0a 20 20 20 20 23 20 46 49 50 53 20 31 38 30 2d  .    # FIPS 180-
24d0: 32 20 28 63 68 61 6e 67 65 20 6e 6f 74 69 63 65  2 (change notice
24e0: 20 31 29 20 28 31 29 3a 20 53 48 41 2d 32 32 34   1) (1): SHA-224
24f0: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
2500: 76 61 6c 75 65 73 0a 20 20 20 20 61 72 72 61 79  values.    array
2510: 20 73 65 74 20 74 6f 6b 20 5c 0a 20 20 20 20 20   set tok \.     
2520: 20 20 20 20 20 20 20 5b 6c 69 73 74 20 5c 0a 20         [list \. 
2530: 20 20 20 20 20 20 20 20 20 20 20 41 20 5b 65 78             A [ex
2540: 70 72 20 7b 69 6e 74 28 30 78 63 31 30 35 39 65  pr {int(0xc1059e
2550: 64 38 29 7d 5d 20 5c 0a 20 20 20 20 20 20 20 20  d8)}] \.        
2560: 20 20 20 20 42 20 5b 65 78 70 72 20 7b 69 6e 74      B [expr {int
2570: 28 30 78 33 36 37 63 64 35 30 37 29 7d 5d 20 5c  (0x367cd507)}] \
2580: 0a 20 20 20 20 20 20 20 20 20 20 20 20 43 20 5b  .            C [
2590: 65 78 70 72 20 7b 69 6e 74 28 30 78 33 30 37 30  expr {int(0x3070
25a0: 64 64 31 37 29 7d 5d 20 5c 0a 20 20 20 20 20 20  dd17)}] \.      
25b0: 20 20 20 20 20 20 44 20 5b 65 78 70 72 20 7b 69        D [expr {i
25c0: 6e 74 28 30 78 66 37 30 65 35 39 33 39 29 7d 5d  nt(0xf70e5939)}]
25d0: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 45   \.            E
25e0: 20 5b 65 78 70 72 20 7b 69 6e 74 28 30 78 66 66   [expr {int(0xff
25f0: 63 30 30 62 33 31 29 7d 5d 20 5c 0a 20 20 20 20  c00b31)}] \.    
2600: 20 20 20 20 20 20 20 20 46 20 5b 65 78 70 72 20          F [expr 
2610: 7b 69 6e 74 28 30 78 36 38 35 38 31 35 31 31 29  {int(0x68581511)
2620: 7d 5d 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  }] \.           
2630: 20 47 20 5b 65 78 70 72 20 7b 69 6e 74 28 30 78   G [expr {int(0x
2640: 36 34 66 39 38 66 61 37 29 7d 5d 20 5c 0a 20 20  64f98fa7)}] \.  
2650: 20 20 20 20 20 20 20 20 20 20 48 20 5b 65 78 70            H [exp
2660: 72 20 7b 69 6e 74 28 30 78 62 65 66 61 34 66 61  r {int(0xbefa4fa
2670: 34 29 7d 5d 20 5c 0a 20 20 20 20 20 20 20 20 20  4)}] \.         
2680: 20 20 20 6e 20 30 20 69 20 22 22 20 76 20 32 32     n 0 i "" v 22
2690: 34 5d 0a 20 20 20 20 72 65 74 75 72 6e 20 24 74  4].    return $t
26a0: 6f 6b 65 6e 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 73  oken.}..proc ::s
26b0: 68 61 32 3a 3a 53 48 41 32 32 34 49 6e 69 74 2d  ha2::SHA224Init-
26c0: 63 72 69 74 63 6c 20 7b 7d 20 7b 0a 20 20 20 20  critcl {} {.    
26d0: 76 61 72 69 61 62 6c 65 20 75 69 64 0a 20 20 20  variable uid.   
26e0: 20 73 65 74 20 74 6f 6b 65 6e 20 5b 6e 61 6d 65   set token [name
26f0: 73 70 61 63 65 20 63 75 72 72 65 6e 74 5d 3a 3a  space current]::
2700: 5b 69 6e 63 72 20 75 69 64 5d 0a 20 20 20 20 75  [incr uid].    u
2710: 70 76 61 72 20 23 30 20 24 74 6f 6b 65 6e 20 74  pvar #0 $token t
2720: 6f 6b 0a 0a 20 20 20 20 23 20 46 49 50 53 20 31  ok..    # FIPS 1
2730: 38 30 2d 32 20 28 63 68 61 6e 67 65 20 6e 6f 74  80-2 (change not
2740: 69 63 65 20 31 29 20 28 31 29 3a 20 53 48 41 2d  ice 1) (1): SHA-
2750: 32 32 34 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  224 initializati
2760: 6f 6e 20 76 61 6c 75 65 73 0a 20 20 20 20 73 65  on values.    se
2770: 74 20 74 6f 6b 28 73 68 61 32 35 36 63 29 20 5b  t tok(sha256c) [
2780: 73 68 61 32 35 36 63 5f 69 6e 69 74 32 32 34 5d  sha256c_init224]
2790: 0a 20 20 20 20 72 65 74 75 72 6e 20 24 74 6f 6b  .    return $tok
27a0: 65 6e 0a 7d 0a 0a 69 6e 74 65 72 70 20 61 6c 69  en.}..interp ali
27b0: 61 73 20 7b 7d 20 3a 3a 73 68 61 32 3a 3a 53 48  as {} ::sha2::SH
27c0: 41 32 32 34 55 70 64 61 74 65 20 7b 7d 20 3a 3a  A224Update {} ::
27d0: 73 68 61 32 3a 3a 53 48 41 32 35 36 55 70 64 61  sha2::SHA256Upda
27e0: 74 65 0a 0a 70 72 6f 63 20 3a 3a 73 68 61 32 3a  te..proc ::sha2:
27f0: 3a 53 48 41 32 32 34 46 69 6e 61 6c 2d 74 63 6c  :SHA224Final-tcl
2800: 20 7b 74 6f 6b 65 6e 7d 20 7b 0a 20 20 20 20 75   {token} {.    u
2810: 70 76 61 72 20 23 30 20 24 74 6f 6b 65 6e 20 73  pvar #0 $token s
2820: 74 61 74 65 0a 20 20 20 20 53 48 41 32 35 36 50  tate.    SHA256P
2830: 65 6e 75 6c 74 69 6d 61 74 65 20 24 74 6f 6b 65  enultimate $toke
2840: 6e 0a 20 20 20 20 0a 20 20 20 20 23 20 4f 75 74  n.    .    # Out
2850: 70 75 74 0a 20 20 20 20 73 65 74 20 72 20 5b 62  put.    set r [b
2860: 79 74 65 73 20 24 73 74 61 74 65 28 41 29 5d 5b  ytes $state(A)][
2870: 62 79 74 65 73 20 24 73 74 61 74 65 28 42 29 5d  bytes $state(B)]
2880: 5b 62 79 74 65 73 20 24 73 74 61 74 65 28 43 29  [bytes $state(C)
2890: 5d 5b 62 79 74 65 73 20 24 73 74 61 74 65 28 44  ][bytes $state(D
28a0: 29 5d 5b 62 79 74 65 73 20 24 73 74 61 74 65 28  )][bytes $state(
28b0: 45 29 5d 5b 62 79 74 65 73 20 24 73 74 61 74 65  E)][bytes $state
28c0: 28 46 29 5d 5b 62 79 74 65 73 20 24 73 74 61 74  (F)][bytes $stat
28d0: 65 28 47 29 5d 0a 20 20 20 20 75 6e 73 65 74 20  e(G)].    unset 
28e0: 73 74 61 74 65 0a 20 20 20 20 72 65 74 75 72 6e  state.    return
28f0: 20 24 72 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 73 68   $r.}..proc ::sh
2900: 61 32 3a 3a 53 48 41 32 32 34 46 69 6e 61 6c 2d  a2::SHA224Final-
2910: 63 72 69 74 63 6c 20 7b 74 6f 6b 65 6e 7d 20 7b  critcl {token} {
2920: 0a 20 20 20 20 75 70 76 61 72 20 23 30 20 24 74  .    upvar #0 $t
2930: 6f 6b 65 6e 20 73 74 61 74 65 0a 20 20 20 20 23  oken state.    #
2940: 20 54 72 69 6d 20 72 65 73 75 6c 74 20 64 6f 77   Trim result dow
2950: 6e 20 74 6f 20 32 32 34 20 62 69 74 73 20 28 62  n to 224 bits (b
2960: 79 20 34 20 62 79 74 65 73 29 2e 0a 20 20 20 20  y 4 bytes)..    
2970: 23 20 53 65 65 20 6f 75 74 70 75 74 20 62 65 6c  # See output bel
2980: 6f 77 2c 20 41 2e 2e 47 2c 20 6e 6f 74 20 41 2e  ow, A..G, not A.
2990: 2e 48 0a 20 20 20 20 73 65 74 20 72 20 5b 73 74  .H.    set r [st
29a0: 72 69 6e 67 20 72 61 6e 67 65 20 24 73 74 61 74  ring range $stat
29b0: 65 28 73 68 61 32 35 36 63 29 20 30 20 65 6e 64  e(sha256c) 0 end
29c0: 2d 34 5d 0a 20 20 20 20 75 6e 73 65 74 20 73 74  -4].    unset st
29d0: 61 74 65 0a 20 20 20 20 72 65 74 75 72 6e 20 24  ate.    return $
29e0: 72 0a 7d 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  r.}..# ---------
29f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a30: 0a 23 20 48 4d 41 43 20 48 61 73 68 65 64 20 4d  .# HMAC Hashed M
2a40: 65 73 73 61 67 65 20 41 75 74 68 65 6e 74 69 63  essage Authentic
2a50: 61 74 69 6f 6e 20 28 52 46 43 20 32 31 30 34 29  ation (RFC 2104)
2a60: 0a 23 0a 23 20 68 6d 61 63 20 3d 20 48 28 4b 20  .#.# hmac = H(K 
2a70: 78 6f 72 20 6f 70 61 64 2c 20 48 28 4b 20 78 6f  xor opad, H(K xo
2a80: 72 20 69 70 61 64 2c 20 74 65 78 74 29 29 0a 23  r ipad, text)).#
2a90: 0a 0a 23 20 48 4d 41 43 49 6e 69 74 20 2d 2d 0a  ..# HMACInit --.
2aa0: 23 0a 23 20 20 20 20 54 68 69 73 20 69 73 20 65  #.#    This is e
2ab0: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65  quivalent to the
2ac0: 20 53 48 41 31 49 6e 69 74 20 70 72 6f 63 65 64   SHA1Init proced
2ad0: 75 72 65 20 65 78 63 65 70 74 20 74 68 61 74 20  ure except that 
2ae0: 61 20 6b 65 79 20 69 73 0a 23 20 20 20 20 61 64  a key is.#    ad
2af0: 64 65 64 20 69 6e 74 6f 20 74 68 65 20 61 6c 67  ded into the alg
2b00: 6f 72 69 74 68 6d 0a 23 0a 70 72 6f 63 20 3a 3a  orithm.#.proc ::
2b10: 73 68 61 32 3a 3a 48 4d 41 43 49 6e 69 74 20 7b  sha2::HMACInit {
2b20: 4b 7d 20 7b 0a 0a 20 20 20 20 23 20 4b 65 79 20  K} {..    # Key 
2b30: 4b 20 69 73 20 61 64 6a 75 73 74 65 64 20 74 6f  K is adjusted to
2b40: 20 62 65 20 36 34 20 62 79 74 65 73 20 6c 6f 6e   be 64 bytes lon
2b50: 67 2e 20 49 66 20 4b 20 69 73 20 6c 61 72 67 65  g. If K is large
2b60: 72 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 20 20  r, then use.    
2b70: 23 20 74 68 65 20 53 48 41 31 20 64 69 67 65 73  # the SHA1 diges
2b80: 74 20 6f 66 20 4b 20 61 6e 64 20 70 61 64 20 74  t of K and pad t
2b90: 68 69 73 20 69 6e 73 74 65 61 64 2e 0a 20 20 20  his instead..   
2ba0: 20 73 65 74 20 6c 65 6e 20 5b 73 74 72 69 6e 67   set len [string
2bb0: 20 6c 65 6e 67 74 68 20 24 4b 5d 0a 20 20 20 20   length $K].    
2bc0: 69 66 20 7b 24 6c 65 6e 20 3e 20 36 34 7d 20 7b  if {$len > 64} {
2bd0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 6f 6b  .        set tok
2be0: 20 5b 53 48 41 32 35 36 49 6e 69 74 5d 0a 20 20   [SHA256Init].  
2bf0: 20 20 20 20 20 20 53 48 41 32 35 36 55 70 64 61        SHA256Upda
2c00: 74 65 20 24 74 6f 6b 20 24 4b 0a 20 20 20 20 20  te $tok $K.     
2c10: 20 20 20 73 65 74 20 4b 20 5b 53 48 41 32 35 36     set K [SHA256
2c20: 46 69 6e 61 6c 20 24 74 6f 6b 5d 0a 20 20 20 20  Final $tok].    
2c30: 20 20 20 20 73 65 74 20 6c 65 6e 20 5b 73 74 72      set len [str
2c40: 69 6e 67 20 6c 65 6e 67 74 68 20 24 4b 5d 0a 20  ing length $K]. 
2c50: 20 20 20 7d 0a 20 20 20 20 73 65 74 20 70 61 64     }.    set pad
2c60: 20 5b 65 78 70 72 20 7b 36 34 20 2d 20 24 6c 65   [expr {64 - $le
2c70: 6e 7d 5d 0a 20 20 20 20 61 70 70 65 6e 64 20 4b  n}].    append K
2c80: 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20   [string repeat 
2c90: 5c 30 20 24 70 61 64 5d 0a 0a 20 20 20 20 23 20  \0 $pad]..    # 
2ca0: 43 61 63 6c 75 61 74 65 20 74 68 65 20 70 61 64  Cacluate the pad
2cb0: 64 69 6e 67 20 62 75 66 66 65 72 73 2e 0a 20 20  ding buffers..  
2cc0: 20 20 73 65 74 20 4b 69 20 7b 7d 0a 20 20 20 20    set Ki {}.    
2cd0: 73 65 74 20 4b 6f 20 7b 7d 0a 20 20 20 20 62 69  set Ko {}.    bi
2ce0: 6e 61 72 79 20 73 63 61 6e 20 24 4b 20 69 31 36  nary scan $K i16
2cf0: 20 4b 73 0a 20 20 20 20 66 6f 72 65 61 63 68 20   Ks.    foreach 
2d00: 6b 20 24 4b 73 20 7b 0a 20 20 20 20 20 20 20 20  k $Ks {.        
2d10: 61 70 70 65 6e 64 20 4b 69 20 5b 62 69 6e 61 72  append Ki [binar
2d20: 79 20 66 6f 72 6d 61 74 20 69 20 5b 65 78 70 72  y format i [expr
2d30: 20 7b 24 6b 20 5e 20 30 78 33 36 33 36 33 36 33   {$k ^ 0x3636363
2d40: 36 7d 5d 5d 0a 20 20 20 20 20 20 20 20 61 70 70  6}]].        app
2d50: 65 6e 64 20 4b 6f 20 5b 62 69 6e 61 72 79 20 66  end Ko [binary f
2d60: 6f 72 6d 61 74 20 69 20 5b 65 78 70 72 20 7b 24  ormat i [expr {$
2d70: 6b 20 5e 20 30 78 35 63 35 63 35 63 35 63 7d 5d  k ^ 0x5c5c5c5c}]
2d80: 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 65 74  ].    }..    set
2d90: 20 74 6f 6b 20 5b 53 48 41 32 35 36 49 6e 69 74   tok [SHA256Init
2da0: 5d 0a 20 20 20 20 53 48 41 32 35 36 55 70 64 61  ].    SHA256Upda
2db0: 74 65 20 24 74 6f 6b 20 24 4b 69 3b 20 20 20 20  te $tok $Ki;    
2dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 69               # i
2dd0: 6e 69 74 69 61 6c 69 7a 65 20 77 69 74 68 20 74  nitialize with t
2de0: 68 65 20 69 6e 6e 65 72 20 70 61 64 0a 20 20 20  he inner pad.   
2df0: 20 0a 20 20 20 20 23 20 70 72 65 73 65 72 76 65   .    # preserve
2e00: 20 74 68 65 20 4b 6f 20 76 61 6c 75 65 20 66 6f   the Ko value fo
2e10: 72 20 74 68 65 20 66 69 6e 61 6c 20 73 74 61 67  r the final stag
2e20: 65 2e 0a 20 20 20 20 23 20 46 52 49 4e 4b 3a 20  e..    # FRINK: 
2e30: 6e 6f 63 68 65 63 6b 0a 20 20 20 20 73 65 74 20  nocheck.    set 
2e40: 5b 73 75 62 73 74 20 24 74 6f 6b 5d 28 4b 6f 29  [subst $tok](Ko)
2e50: 20 24 4b 6f 0a 0a 20 20 20 20 72 65 74 75 72 6e   $Ko..    return
2e60: 20 24 74 6f 6b 0a 7d 0a 0a 23 20 48 4d 41 43 55   $tok.}..# HMACU
2e70: 70 64 61 74 65 20 2d 2d 0a 23 0a 23 20 20 20 20  pdate --.#.#    
2e80: 49 64 65 6e 74 69 63 61 6c 20 74 6f 20 63 61 6c  Identical to cal
2e90: 6c 69 6e 67 20 53 48 41 32 35 36 55 70 64 61 74  ling SHA256Updat
2ea0: 65 0a 23 0a 70 72 6f 63 20 3a 3a 73 68 61 32 3a  e.#.proc ::sha2:
2eb0: 3a 48 4d 41 43 55 70 64 61 74 65 20 7b 74 6f 6b  :HMACUpdate {tok
2ec0: 65 6e 20 64 61 74 61 7d 20 7b 0a 20 20 20 20 53  en data} {.    S
2ed0: 48 41 32 35 36 55 70 64 61 74 65 20 24 74 6f 6b  HA256Update $tok
2ee0: 65 6e 20 24 64 61 74 61 0a 20 20 20 20 72 65 74  en $data.    ret
2ef0: 75 72 6e 0a 7d 0a 0a 23 20 48 4d 41 43 46 69 6e  urn.}..# HMACFin
2f00: 61 6c 20 2d 2d 0a 23 0a 23 20 20 20 20 54 68 69  al --.#.#    Thi
2f10: 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  s is equivalent 
2f20: 74 6f 20 74 68 65 20 53 48 41 32 35 36 46 69 6e  to the SHA256Fin
2f30: 61 6c 20 70 72 6f 63 65 64 75 72 65 2e 20 54 68  al procedure. Th
2f40: 65 20 68 61 73 68 20 63 6f 6e 74 65 78 74 20 69  e hash context i
2f50: 73 0a 23 20 20 20 20 63 6c 6f 73 65 64 20 61 6e  s.#    closed an
2f60: 64 20 74 68 65 20 62 69 6e 61 72 79 20 72 65 70  d the binary rep
2f70: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
2f80: 68 65 20 68 61 73 68 20 72 65 73 75 6c 74 20 69  he hash result i
2f90: 73 20 72 65 74 75 72 6e 65 64 2e 0a 23 0a 70 72  s returned..#.pr
2fa0: 6f 63 20 3a 3a 73 68 61 32 3a 3a 48 4d 41 43 46  oc ::sha2::HMACF
2fb0: 69 6e 61 6c 20 7b 74 6f 6b 65 6e 7d 20 7b 0a 20  inal {token} {. 
2fc0: 20 20 20 75 70 76 61 72 20 23 30 20 24 74 6f 6b     upvar #0 $tok
2fd0: 65 6e 20 73 74 61 74 65 0a 0a 20 20 20 20 73 65  en state..    se
2fe0: 74 20 74 6f 6b 20 5b 53 48 41 32 35 36 49 6e 69  t tok [SHA256Ini
2ff0: 74 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  t];             
3000: 20 20 20 20 23 20 69 6e 69 74 20 74 68 65 20 6f      # init the o
3010: 75 74 65 72 20 68 61 73 68 69 6e 67 20 66 75 6e  uter hashing fun
3020: 63 74 69 6f 6e 0a 20 20 20 20 53 48 41 32 35 36  ction.    SHA256
3030: 55 70 64 61 74 65 20 24 74 6f 6b 20 24 73 74 61  Update $tok $sta
3040: 74 65 28 4b 6f 29 3b 20 20 20 20 20 20 20 20 20  te(Ko);         
3050: 23 20 70 72 65 70 61 72 65 20 77 69 74 68 20 74  # prepare with t
3060: 68 65 20 6f 75 74 65 72 20 70 61 64 2e 0a 20 20  he outer pad..  
3070: 20 20 53 48 41 32 35 36 55 70 64 61 74 65 20 24    SHA256Update $
3080: 74 6f 6b 20 5b 53 48 41 32 35 36 46 69 6e 61 6c  tok [SHA256Final
3090: 20 24 74 6f 6b 65 6e 5d 3b 20 23 20 68 61 73 68   $token]; # hash
30a0: 20 74 68 65 20 69 6e 6e 65 72 20 72 65 73 75 6c   the inner resul
30b0: 74 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 53 48  t.    return [SH
30c0: 41 32 35 36 46 69 6e 61 6c 20 24 74 6f 6b 5d 0a  A256Final $tok].
30d0: 7d 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..# -----------
30e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
3120: 20 44 65 73 63 72 69 70 74 69 6f 6e 3a 0a 23 20   Description:.# 
3130: 20 54 68 69 73 20 69 73 20 74 68 65 20 63 6f 72   This is the cor
3140: 65 20 53 48 41 31 20 61 6c 67 6f 72 69 74 68 6d  e SHA1 algorithm
3150: 2e 20 49 74 20 69 73 20 61 20 6c 6f 74 20 6c 69  . It is a lot li
3160: 6b 65 20 74 68 65 20 4d 44 34 20 61 6c 67 6f 72  ke the MD4 algor
3170: 69 74 68 6d 20 62 75 74 0a 23 20 20 69 6e 63 6c  ithm but.#  incl
3180: 75 64 65 73 20 61 6e 20 65 78 74 72 61 20 72 6f  udes an extra ro
3190: 75 6e 64 20 61 6e 64 20 61 20 73 65 74 20 6f 66  und and a set of
31a0: 20 63 6f 6e 73 74 61 6e 74 20 6d 6f 64 69 66 69   constant modifi
31b0: 65 72 73 20 74 68 72 6f 75 67 68 6f 75 74 2e 0a  ers throughout..
31c0: 23 0a 73 65 74 20 3a 3a 73 68 61 32 3a 3a 53 48  #.set ::sha2::SH
31d0: 41 32 35 36 54 72 61 6e 73 66 6f 72 6d 5f 62 6f  A256Transform_bo
31e0: 64 79 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c  dy {.    variabl
31f0: 65 20 4b 0a 20 20 20 20 75 70 76 61 72 20 23 30  e K.    upvar #0
3200: 20 24 74 6f 6b 65 6e 20 73 74 61 74 65 0a 0a 20   $token state.. 
3210: 20 20 20 23 20 46 49 50 53 20 31 38 30 2d 32 3a     # FIPS 180-2:
3220: 20 36 2e 32 2e 32 20 53 48 41 2d 32 35 36 20 48   6.2.2 SHA-256 H
3230: 61 73 68 20 63 6f 6d 70 75 74 61 74 69 6f 6e 2e  ash computation.
3240: 0a 20 20 20 20 62 69 6e 61 72 79 20 73 63 61 6e  .    binary scan
3250: 20 24 6d 73 67 20 49 2a 20 62 6c 6f 63 6b 73 0a   $msg I* blocks.
3260: 20 20 20 20 73 65 74 20 62 6c 6f 63 6b 4c 65 6e      set blockLen
3270: 20 5b 6c 6c 65 6e 67 74 68 20 24 62 6c 6f 63 6b   [llength $block
3280: 73 5d 0a 20 20 20 20 66 6f 72 20 7b 73 65 74 20  s].    for {set 
3290: 69 20 30 7d 20 7b 24 69 20 3c 20 24 62 6c 6f 63  i 0} {$i < $bloc
32a0: 6b 4c 65 6e 7d 20 7b 69 6e 63 72 20 69 20 31 36  kLen} {incr i 16
32b0: 7d 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20  } {.        set 
32c0: 57 20 5b 6c 72 61 6e 67 65 20 24 62 6c 6f 63 6b  W [lrange $block
32d0: 73 20 24 69 20 5b 65 78 70 72 20 7b 24 69 2b 31  s $i [expr {$i+1
32e0: 35 7d 5d 5d 0a 0a 20 20 20 20 20 20 20 20 23 20  5}]]..        # 
32f0: 46 49 50 53 20 31 38 30 2d 32 3a 20 36 2e 32 2e  FIPS 180-2: 6.2.
3300: 32 20 28 31 29 20 50 72 65 70 61 72 65 20 74 68  2 (1) Prepare th
3310: 65 20 6d 65 73 73 61 67 65 20 73 63 68 65 64 75  e message schedu
3320: 6c 65 0a 20 20 20 20 20 20 20 20 23 20 46 6f 72  le.        # For
3330: 20 74 20 3d 20 31 36 20 74 6f 20 36 34 20 0a 20   t = 16 to 64 . 
3340: 20 20 20 20 20 20 20 23 20 20 20 6c 65 74 20 57         #   let W
3350: 74 20 3d 20 28 73 69 67 6d 61 31 28 57 74 2d 32  t = (sigma1(Wt-2
3360: 29 20 2b 20 57 74 2d 37 20 2b 20 73 69 67 6d 61  ) + Wt-7 + sigma
3370: 30 28 57 74 2d 31 35 29 20 2b 20 57 74 2d 31 36  0(Wt-15) + Wt-16
3380: 29 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 32  ).        set t2
3390: 20 20 31 33 0a 20 20 20 20 20 20 20 20 73 65 74    13.        set
33a0: 20 74 37 20 20 20 38 0a 20 20 20 20 20 20 20 20   t7   8.        
33b0: 73 65 74 20 74 31 35 20 20 30 0a 20 20 20 20 20  set t15  0.     
33c0: 20 20 20 73 65 74 20 74 31 36 20 2d 31 0a 20 20     set t16 -1.  
33d0: 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20 74        for {set t
33e0: 20 31 36 7d 20 7b 24 74 20 3c 20 36 34 7d 20 7b   16} {$t < 64} {
33f0: 69 6e 63 72 20 74 7d 20 7b 0a 20 20 20 20 20 20  incr t} {.      
3400: 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 57 20        lappend W 
3410: 5b 65 78 70 72 20 7b 28 5b 73 69 67 6d 61 31 20  [expr {([sigma1 
3420: 5b 6c 69 6e 64 65 78 20 24 57 20 5b 69 6e 63 72  [lindex $W [incr
3430: 20 74 32 5d 5d 5d 20 5c 0a 20 20 20 20 20 20 20   t2]]] \.       
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3450: 20 20 20 20 20 20 20 20 20 20 2b 20 5b 6c 69 6e            + [lin
3460: 64 65 78 20 24 57 20 5b 69 6e 63 72 20 74 37 5d  dex $W [incr t7]
3470: 5d 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ] \.            
3480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3490: 20 20 20 20 20 2b 20 5b 73 69 67 6d 61 30 20 5b       + [sigma0 [
34a0: 6c 69 6e 64 65 78 20 24 57 20 5b 69 6e 63 72 20  lindex $W [incr 
34b0: 74 31 35 5d 5d 5d 20 5c 0a 20 20 20 20 20 20 20  t15]]] \.       
34c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d0: 20 20 20 20 20 20 20 20 20 20 2b 20 5b 6c 69 6e            + [lin
34e0: 64 65 78 20 24 57 20 5b 69 6e 63 72 20 74 31 36  dex $W [incr t16
34f0: 5d 5d 29 20 26 20 30 78 66 66 66 66 66 66 66 66  ]]) & 0xffffffff
3500: 7d 5d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  }].        }.   
3510: 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 23 20       .        # 
3520: 46 49 50 53 20 31 38 30 2d 32 3a 20 36 2e 32 2e  FIPS 180-2: 6.2.
3530: 32 20 28 32 29 20 49 6e 69 74 69 61 6c 69 73 65  2 (2) Initialise
3540: 20 74 68 65 20 77 6f 72 6b 69 6e 67 20 76 61 72   the working var
3550: 69 61 62 6c 65 73 0a 20 20 20 20 20 20 20 20 73  iables.        s
3560: 65 74 20 41 20 24 73 74 61 74 65 28 41 29 0a 20  et A $state(A). 
3570: 20 20 20 20 20 20 20 73 65 74 20 42 20 24 73 74         set B $st
3580: 61 74 65 28 42 29 0a 20 20 20 20 20 20 20 20 73  ate(B).        s
3590: 65 74 20 43 20 24 73 74 61 74 65 28 43 29 0a 20  et C $state(C). 
35a0: 20 20 20 20 20 20 20 73 65 74 20 44 20 24 73 74         set D $st
35b0: 61 74 65 28 44 29 0a 20 20 20 20 20 20 20 20 73  ate(D).        s
35c0: 65 74 20 45 20 24 73 74 61 74 65 28 45 29 0a 20  et E $state(E). 
35d0: 20 20 20 20 20 20 20 73 65 74 20 46 20 24 73 74         set F $st
35e0: 61 74 65 28 46 29 0a 20 20 20 20 20 20 20 20 73  ate(F).        s
35f0: 65 74 20 47 20 24 73 74 61 74 65 28 47 29 0a 20  et G $state(G). 
3600: 20 20 20 20 20 20 20 73 65 74 20 48 20 24 73 74         set H $st
3610: 61 74 65 28 48 29 0a 0a 20 20 20 20 20 20 20 20  ate(H)..        
3620: 23 20 46 49 50 53 20 31 38 30 2d 32 3a 20 36 2e  # FIPS 180-2: 6.
3630: 32 2e 32 20 28 33 29 20 44 6f 20 70 65 72 6d 75  2.2 (3) Do permu
3640: 74 61 74 69 6f 6e 20 72 6f 75 6e 64 73 0a 20 20  tation rounds.  
3650: 20 20 20 20 20 20 23 20 46 6f 72 20 74 20 3d 20        # For t = 
3660: 30 20 74 6f 20 36 33 20 64 6f 0a 20 20 20 20 20  0 to 63 do.     
3670: 20 20 20 23 20 20 20 54 31 20 3d 20 68 20 2b 20     #   T1 = h + 
3680: 53 49 47 4d 41 31 28 65 29 20 2b 20 43 68 28 65  SIGMA1(e) + Ch(e
3690: 2c 66 2c 67 29 20 2b 20 4b 74 20 2b 20 57 74 0a  ,f,g) + Kt + Wt.
36a0: 20 20 20 20 20 20 20 20 23 20 20 20 54 32 20 3d          #   T2 =
36b0: 20 53 49 47 4d 41 30 28 61 29 20 2b 20 4d 61 6a   SIGMA0(a) + Maj
36c0: 28 61 2c 62 2c 63 29 0a 20 20 20 20 20 20 20 20  (a,b,c).        
36d0: 23 20 20 20 68 20 3d 20 67 3b 20 67 20 3d 20 66  #   h = g; g = f
36e0: 3b 20 20 66 20 3d 20 65 3b 20 20 65 20 3d 20 64  ;  f = e;  e = d
36f0: 20 2b 20 54 31 3b 20 20 64 20 3d 20 63 3b 20 20   + T1;  d = c;  
3700: 63 20 3d 20 62 3b 20 62 20 3d 20 61 3b 0a 20 20  c = b; b = a;.  
3710: 20 20 20 20 20 20 23 20 20 20 61 20 3d 20 54 31        #   a = T1
3720: 20 2b 20 54 32 0a 20 20 20 20 20 20 20 20 23 0a   + T2.        #.
3730: 20 20 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74          for {set
3740: 20 74 20 30 7d 20 7b 24 74 20 3c 20 36 34 7d 20   t 0} {$t < 64} 
3750: 7b 69 6e 63 72 20 74 7d 20 7b 0a 20 20 20 20 20  {incr t} {.     
3760: 20 20 20 20 20 20 20 73 65 74 20 54 31 20 5b 65         set T1 [e
3770: 78 70 72 20 7b 28 24 48 20 2b 20 5b 53 49 47 4d  xpr {($H + [SIGM
3780: 41 31 20 24 45 5d 20 2b 20 5b 43 68 20 24 45 20  A1 $E] + [Ch $E 
3790: 24 46 20 24 47 5d 20 0a 20 20 20 20 20 20 20 20  $F $G] .        
37a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37b0: 20 20 2b 20 5b 6c 69 6e 64 65 78 20 24 4b 20 24    + [lindex $K $
37c0: 74 5d 20 2b 20 5b 6c 69 6e 64 65 78 20 24 57 20  t] + [lindex $W 
37d0: 24 74 5d 29 20 26 20 30 78 66 66 66 66 66 66 66  $t]) & 0xfffffff
37e0: 66 7d 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  f}].            
37f0: 73 65 74 20 54 32 20 5b 65 78 70 72 20 7b 28 5b  set T2 [expr {([
3800: 53 49 47 4d 41 30 20 24 41 5d 20 2b 20 5b 4d 61  SIGMA0 $A] + [Ma
3810: 6a 20 24 41 20 24 42 20 24 43 5d 29 20 26 20 30  j $A $B $C]) & 0
3820: 78 66 66 66 66 66 66 66 66 7d 5d 0a 20 20 20 20  xffffffff}].    
3830: 20 20 20 20 20 20 20 20 73 65 74 20 48 20 24 47          set H $G
3840: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
3850: 20 47 20 24 46 0a 20 20 20 20 20 20 20 20 20 20   G $F.          
3860: 20 20 73 65 74 20 46 20 24 45 0a 20 20 20 20 20    set F $E.     
3870: 20 20 20 20 20 20 20 73 65 74 20 45 20 5b 65 78         set E [ex
3880: 70 72 20 7b 28 24 44 20 2b 20 24 54 31 29 20 26  pr {($D + $T1) &
3890: 20 30 78 66 66 66 66 66 66 66 66 7d 5d 0a 20 20   0xffffffff}].  
38a0: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 44 20            set D 
38b0: 24 43 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  $C.            s
38c0: 65 74 20 43 20 24 42 0a 20 20 20 20 20 20 20 20  et C $B.        
38d0: 20 20 20 20 73 65 74 20 42 20 24 41 0a 20 20 20      set B $A.   
38e0: 20 20 20 20 20 20 20 20 20 73 65 74 20 41 20 5b           set A [
38f0: 65 78 70 72 20 7b 28 24 54 31 20 2b 20 24 54 32  expr {($T1 + $T2
3900: 29 20 26 20 30 78 66 66 66 66 66 66 66 66 7d 5d  ) & 0xffffffff}]
3910: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
3920: 20 20 20 20 23 20 46 49 50 53 20 31 38 30 2d 32      # FIPS 180-2
3930: 3a 20 36 2e 32 2e 32 20 28 34 29 20 43 6f 6d 70  : 6.2.2 (4) Comp
3940: 75 74 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64  ute the intermed
3950: 69 61 74 65 20 68 61 73 68 0a 20 20 20 20 20 20  iate hash.      
3960: 20 20 69 6e 63 72 20 73 74 61 74 65 28 41 29 20    incr state(A) 
3970: 24 41 0a 20 20 20 20 20 20 20 20 69 6e 63 72 20  $A.        incr 
3980: 73 74 61 74 65 28 42 29 20 24 42 0a 20 20 20 20  state(B) $B.    
3990: 20 20 20 20 69 6e 63 72 20 73 74 61 74 65 28 43      incr state(C
39a0: 29 20 24 43 0a 20 20 20 20 20 20 20 20 69 6e 63  ) $C.        inc
39b0: 72 20 73 74 61 74 65 28 44 29 20 24 44 0a 20 20  r state(D) $D.  
39c0: 20 20 20 20 20 20 69 6e 63 72 20 73 74 61 74 65        incr state
39d0: 28 45 29 20 24 45 0a 20 20 20 20 20 20 20 20 69  (E) $E.        i
39e0: 6e 63 72 20 73 74 61 74 65 28 46 29 20 24 46 0a  ncr state(F) $F.
39f0: 20 20 20 20 20 20 20 20 69 6e 63 72 20 73 74 61          incr sta
3a00: 74 65 28 47 29 20 24 47 0a 20 20 20 20 20 20 20  te(G) $G.       
3a10: 20 69 6e 63 72 20 73 74 61 74 65 28 48 29 20 24   incr state(H) $
3a20: 48 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74  H.    }..    ret
3a30: 75 72 6e 0a 7d 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d  urn.}..# -------
3a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a80: 2d 2d 0a 0a 23 20 46 49 50 53 20 31 38 30 2d 32  --..# FIPS 180-2
3a90: 3a 20 34 2e 31 2e 32 20 65 71 75 61 74 69 6f 6e  : 4.1.2 equation
3aa0: 20 34 2e 32 0a 70 72 6f 63 20 3a 3a 73 68 61 32   4.2.proc ::sha2
3ab0: 3a 3a 43 68 20 7b 78 20 79 20 7a 7d 20 7b 0a 20  ::Ch {x y z} {. 
3ac0: 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20     return [expr 
3ad0: 7b 28 24 78 20 26 20 24 79 29 20 5e 20 28 7e 24  {($x & $y) ^ (~$
3ae0: 78 20 26 20 24 7a 29 7d 5d 0a 7d 0a 0a 23 20 46  x & $z)}].}..# F
3af0: 49 50 53 20 31 38 30 2d 32 3a 20 34 2e 31 2e 32  IPS 180-2: 4.1.2
3b00: 20 65 71 75 61 74 69 6f 6e 20 34 2e 33 0a 70 72   equation 4.3.pr
3b10: 6f 63 20 3a 3a 73 68 61 32 3a 3a 4d 61 6a 20 7b  oc ::sha2::Maj {
3b20: 78 20 79 20 7a 7d 20 7b 0a 20 20 20 20 72 65 74  x y z} {.    ret
3b30: 75 72 6e 20 5b 65 78 70 72 20 7b 28 24 78 20 26  urn [expr {($x &
3b40: 20 24 79 29 20 5e 20 28 24 78 20 26 20 24 7a 29   $y) ^ ($x & $z)
3b50: 20 5e 20 28 24 79 20 26 20 24 7a 29 7d 5d 0a 7d   ^ ($y & $z)}].}
3b60: 0a 0a 23 20 46 49 50 53 20 31 38 30 2d 32 3a 20  ..# FIPS 180-2: 
3b70: 34 2e 31 2e 32 20 65 71 75 61 74 69 6f 6e 20 34  4.1.2 equation 4
3b80: 2e 34 0a 23 20 20 28 78 20 3e 3e 3e 20 32 29 20  .4.#  (x >>> 2) 
3b90: 5e 20 28 78 20 3e 3e 3e 20 31 33 29 20 5e 20 28  ^ (x >>> 13) ^ (
3ba0: 78 20 3e 3e 3e 20 32 32 29 0a 70 72 6f 63 20 3a  x >>> 22).proc :
3bb0: 3a 73 68 61 32 3a 3a 53 49 47 4d 41 30 20 7b 78  :sha2::SIGMA0 {x
3bc0: 7d 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 5b  } {.    return [
3bd0: 65 78 70 72 20 7b 5b 3e 3e 3e 20 24 78 20 32 5d  expr {[>>> $x 2]
3be0: 20 5e 20 5b 3e 3e 3e 20 24 78 20 31 33 5d 20 5e   ^ [>>> $x 13] ^
3bf0: 20 5b 3e 3e 3e 20 24 78 20 32 32 5d 7d 5d 0a 7d   [>>> $x 22]}].}
3c00: 0a 0a 23 20 46 49 50 53 20 31 38 30 2d 32 3a 20  ..# FIPS 180-2: 
3c10: 34 2e 31 2e 32 20 65 71 75 61 74 69 6f 6e 20 34  4.1.2 equation 4
3c20: 2e 35 0a 23 20 20 28 78 20 3e 3e 3e 20 36 29 20  .5.#  (x >>> 6) 
3c30: 5e 20 28 78 20 3e 3e 3e 20 31 31 29 20 5e 20 28  ^ (x >>> 11) ^ (
3c40: 78 20 3e 3e 3e 20 32 35 29 0a 70 72 6f 63 20 3a  x >>> 25).proc :
3c50: 3a 73 68 61 32 3a 3a 53 49 47 4d 41 31 20 7b 78  :sha2::SIGMA1 {x
3c60: 7d 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 5b  } {.    return [
3c70: 65 78 70 72 20 7b 5b 3e 3e 3e 20 24 78 20 36 5d  expr {[>>> $x 6]
3c80: 20 5e 20 5b 3e 3e 3e 20 24 78 20 31 31 5d 20 5e   ^ [>>> $x 11] ^
3c90: 20 5b 3e 3e 3e 20 24 78 20 32 35 5d 7d 5d 0a 7d   [>>> $x 25]}].}
3ca0: 0a 0a 23 20 46 49 50 53 20 31 38 30 2d 32 3a 20  ..# FIPS 180-2: 
3cb0: 34 2e 31 2e 32 20 65 71 75 61 74 69 6f 6e 20 34  4.1.2 equation 4
3cc0: 2e 36 0a 23 20 20 73 30 20 3d 20 28 78 20 3e 3e  .6.#  s0 = (x >>
3cd0: 3e 20 37 29 20 20 5e 20 28 78 20 3e 3e 3e 20 31  > 7)  ^ (x >>> 1
3ce0: 38 29 20 5e 20 28 78 20 3e 3e 20 33 29 0a 70 72  8) ^ (x >> 3).pr
3cf0: 6f 63 20 3a 3a 73 68 61 32 3a 3a 73 69 67 6d 61  oc ::sha2::sigma
3d00: 30 20 7b 78 7d 20 7b 0a 20 20 20 20 23 72 65 74  0 {x} {.    #ret
3d10: 75 72 6e 20 5b 65 78 70 72 20 7b 5b 3e 3e 3e 20  urn [expr {[>>> 
3d20: 24 78 20 37 5d 20 5e 20 5b 3e 3e 3e 20 24 78 20  $x 7] ^ [>>> $x 
3d30: 31 38 5d 20 5e 20 28 28 24 78 20 3e 3e 20 33 29  18] ^ (($x >> 3)
3d40: 20 26 20 30 78 31 66 66 66 66 66 66 66 29 7d 5d   & 0x1fffffff)}]
3d50: 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70  .    return [exp
3d60: 72 20 7b 28 28 28 24 78 3c 3c 32 35 29 20 7c 20  r {((($x<<25) | 
3d70: 28 28 24 78 3e 3e 37 29 20 26 20 28 30 78 37 46  (($x>>7) & (0x7F
3d80: 46 46 46 46 46 46 3e 3e 36 29 29 29 20 5c 0a 20  FFFFFF>>6))) \. 
3d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3da0: 5e 20 28 28 24 78 3c 3c 31 34 29 20 7c 20 28 28  ^ (($x<<14) | ((
3db0: 24 78 3e 3e 31 38 29 20 26 20 28 30 78 37 46 46  $x>>18) & (0x7FF
3dc0: 46 46 46 46 46 3e 3e 31 37 29 29 29 20 26 20 30  FFFFF>>17))) & 0
3dd0: 78 46 46 46 46 46 46 46 46 29 20 5c 0a 20 20 20  xFFFFFFFF) \.   
3de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5e 20                ^ 
3df0: 28 28 24 78 3e 3e 33 29 20 26 20 30 78 31 66 66  (($x>>3) & 0x1ff
3e00: 66 66 66 66 66 29 7d 5d 0a 7d 0a 0a 23 20 46 49  fffff)}].}..# FI
3e10: 50 53 20 31 38 30 2d 32 3a 20 34 2e 31 2e 32 20  PS 180-2: 4.1.2 
3e20: 65 71 75 61 74 69 6f 6e 20 34 2e 37 0a 23 20 20  equation 4.7.#  
3e30: 73 31 20 3d 20 28 78 20 3e 3e 3e 20 31 37 29 20  s1 = (x >>> 17) 
3e40: 5e 20 28 78 20 3e 3e 3e 20 31 39 29 20 5e 20 28  ^ (x >>> 19) ^ (
3e50: 78 20 3e 3e 20 31 30 29 0a 70 72 6f 63 20 3a 3a  x >> 10).proc ::
3e60: 73 68 61 32 3a 3a 73 69 67 6d 61 31 20 7b 78 7d  sha2::sigma1 {x}
3e70: 20 7b 0a 20 20 20 20 23 72 65 74 75 72 6e 20 5b   {.    #return [
3e80: 65 78 70 72 20 7b 5b 3e 3e 3e 20 24 78 20 31 37  expr {[>>> $x 17
3e90: 5d 20 5e 20 5b 3e 3e 3e 20 24 78 20 31 39 5d 20  ] ^ [>>> $x 19] 
3ea0: 5e 20 28 28 24 78 20 3e 3e 20 31 30 29 20 26 20  ^ (($x >> 10) & 
3eb0: 30 78 30 30 33 66 66 66 66 66 29 7d 5d 0a 20 20  0x003fffff)}].  
3ec0: 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b    return [expr {
3ed0: 28 28 28 24 78 3c 3c 31 35 29 20 7c 20 28 28 24  ((($x<<15) | (($
3ee0: 78 3e 3e 31 37 29 20 26 20 28 30 78 37 46 46 46  x>>17) & (0x7FFF
3ef0: 46 46 46 46 3e 3e 31 36 29 29 29 20 5c 0a 20 20  FFFF>>16))) \.  
3f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5e                 ^
3f10: 20 28 28 24 78 3c 3c 31 33 29 20 7c 20 28 28 24   (($x<<13) | (($
3f20: 78 3e 3e 31 39 29 20 26 20 28 30 78 37 46 46 46  x>>19) & (0x7FFF
3f30: 46 46 46 46 3e 3e 31 38 29 29 29 20 26 20 30 78  FFFF>>18))) & 0x
3f40: 46 46 46 46 46 46 46 46 29 20 5c 0a 20 20 20 20  FFFFFFFF) \.    
3f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 5e 20 28               ^ (
3f60: 28 24 78 20 3e 3e 20 31 30 29 20 26 20 30 78 30  ($x >> 10) & 0x0
3f70: 30 33 66 66 66 66 66 29 7d 5d 0a 7d 0a 0a 23 20  03fffff)}].}..# 
3f80: 33 32 62 69 74 20 72 6f 74 61 74 65 2d 72 69 67  32bit rotate-rig
3f90: 68 74 0a 70 72 6f 63 20 3a 3a 73 68 61 32 3a 3a  ht.proc ::sha2::
3fa0: 3e 3e 3e 20 7b 76 20 6e 7d 20 7b 0a 20 20 20 20  >>> {v n} {.    
3fb0: 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 28 28  return [expr {((
3fc0: 24 76 20 3c 3c 20 28 33 32 20 2d 20 24 6e 29 29  $v << (32 - $n))
3fd0: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
3fe0: 20 20 20 20 20 20 20 20 20 20 7c 20 28 28 24 76            | (($v
3ff0: 20 3e 3e 20 24 6e 29 20 26 20 28 30 78 37 46 46   >> $n) & (0x7FF
4000: 46 46 46 46 46 20 3e 3e 20 28 24 6e 20 2d 20 31  FFFFF >> ($n - 1
4010: 29 29 29 29 20 5c 0a 20 20 20 20 20 20 20 20 20  )))) \.         
4020: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 20 30               & 0
4030: 78 46 46 46 46 46 46 46 46 7d 5d 0a 7d 0a 0a 23  xFFFFFFFF}].}..#
4040: 20 33 32 62 69 74 20 72 6f 74 61 74 65 2d 6c 65   32bit rotate-le
4050: 66 74 0a 70 72 6f 63 20 3a 3a 73 68 61 32 3a 3a  ft.proc ::sha2::
4060: 3c 3c 3c 20 7b 76 20 6e 7d 20 7b 0a 20 20 20 20  <<< {v n} {.    
4070: 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 28 28  return [expr {((
4080: 28 24 76 20 3c 3c 20 24 6e 29 20 5c 0a 20 20 20  ($v << $n) \.   
4090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40a0: 20 20 20 20 20 7c 20 28 28 24 76 20 3e 3e 20 28       | (($v >> (
40b0: 33 32 20 2d 20 24 6e 29 29 20 5c 0a 20 20 20 20  32 - $n)) \.    
40c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40d0: 20 20 20 20 20 20 20 20 20 20 20 26 20 28 30 78             & (0x
40e0: 37 46 46 46 46 46 46 46 20 3e 3e 20 28 33 31 20  7FFFFFFF >> (31 
40f0: 2d 20 24 6e 29 29 29 29 29 20 5c 0a 20 20 20 20  - $n))))) \.    
4100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4110: 20 20 26 20 30 78 46 46 46 46 46 46 46 46 7d 5d    & 0xFFFFFFFF}]
4120: 0a 7d 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..# ----------
4130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
4170: 23 20 57 65 20 73 70 65 65 64 20 75 70 20 74 68  # We speed up th
4180: 65 20 53 48 41 32 35 36 54 72 61 6e 73 66 6f 72  e SHA256Transfor
4190: 6d 20 63 6f 64 65 20 77 68 69 6c 65 20 6d 61 69  m code while mai
41a0: 6e 74 61 69 6e 69 6e 67 20 72 65 61 64 61 62 69  ntaining readabi
41b0: 6c 69 74 79 20 69 6e 20 74 68 65 0a 23 20 73 6f  lity in the.# so
41c0: 75 72 63 65 20 63 6f 64 65 20 62 79 20 73 75 62  urce code by sub
41d0: 73 74 69 74 75 74 69 6e 67 20 69 6e 6c 69 6e 65  stituting inline
41e0: 20 66 6f 72 20 61 20 6e 75 6d 62 65 72 20 6f 66   for a number of
41f0: 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 23 20 54 68   functions..# Th
4200: 65 20 69 64 65 61 20 69 73 20 74 6f 20 72 65 64  e idea is to red
4210: 75 63 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  uce the number o
4220: 66 20 5b 65 78 70 72 5d 20 63 61 6c 6c 73 2e 0a  f [expr] calls..
4230: 0a 23 20 49 6e 6c 69 6e 65 20 74 68 65 20 43 68  .# Inline the Ch
4240: 20 66 75 6e 63 74 69 6f 6e 0a 72 65 67 73 75 62   function.regsub
4250: 20 2d 61 6c 6c 20 2d 6c 69 6e 65 20 5c 0a 20 20   -all -line \.  
4260: 20 20 7b 5c 5b 43 68 20 28 5c 24 5b 41 42 43 44    {\[Ch (\$[ABCD
4270: 45 46 47 48 5d 29 20 28 5c 24 5b 41 42 43 44 45  EFGH]) (\$[ABCDE
4280: 46 47 48 5d 29 20 28 5c 24 5b 41 42 43 44 45 46  FGH]) (\$[ABCDEF
4290: 47 48 5d 29 5c 5d 7d 20 5c 0a 20 20 20 20 24 3a  GH])\]} \.    $:
42a0: 3a 73 68 61 32 3a 3a 53 48 41 32 35 36 54 72 61  :sha2::SHA256Tra
42b0: 6e 73 66 6f 72 6d 5f 62 6f 64 79 20 5c 0a 20 20  nsform_body \.  
42c0: 20 20 7b 28 28 5c 31 20 5c 26 20 5c 32 29 20 5e    {((\1 \& \2) ^
42d0: 20 28 28 7e 5c 31 29 20 5c 26 20 5c 33 29 29 7d   ((~\1) \& \3))}
42e0: 20 5c 0a 20 20 20 20 3a 3a 73 68 61 32 3a 3a 53   \.    ::sha2::S
42f0: 48 41 32 35 36 54 72 61 6e 73 66 6f 72 6d 5f 62  HA256Transform_b
4300: 6f 64 79 0a 0a 23 20 49 6e 6c 69 6e 65 20 74 68  ody..# Inline th
4310: 65 20 4d 61 6a 20 66 75 6e 63 74 69 6f 6e 0a 72  e Maj function.r
4320: 65 67 73 75 62 20 2d 61 6c 6c 20 2d 6c 69 6e 65  egsub -all -line
4330: 20 5c 0a 20 20 20 20 7b 5c 5b 4d 61 6a 20 28 5c   \.    {\[Maj (\
4340: 24 5b 41 42 43 44 45 46 47 48 5d 29 20 28 5c 24  $[ABCDEFGH]) (\$
4350: 5b 41 42 43 44 45 46 47 48 5d 29 20 28 5c 24 5b  [ABCDEFGH]) (\$[
4360: 41 42 43 44 45 46 47 48 5d 29 5c 5d 7d 20 5c 0a  ABCDEFGH])\]} \.
4370: 20 20 20 20 24 3a 3a 73 68 61 32 3a 3a 53 48 41      $::sha2::SHA
4380: 32 35 36 54 72 61 6e 73 66 6f 72 6d 5f 62 6f 64  256Transform_bod
4390: 79 20 5c 0a 20 20 20 20 7b 28 28 5c 31 20 5c 26  y \.    {((\1 \&
43a0: 20 5c 32 29 20 5e 20 28 5c 31 20 5c 26 20 5c 33   \2) ^ (\1 \& \3
43b0: 29 20 5e 20 28 5c 32 20 5c 26 20 5c 33 29 29 7d  ) ^ (\2 \& \3))}
43c0: 20 5c 0a 20 20 20 20 3a 3a 73 68 61 32 3a 3a 53   \.    ::sha2::S
43d0: 48 41 32 35 36 54 72 61 6e 73 66 6f 72 6d 5f 62  HA256Transform_b
43e0: 6f 64 79 0a 0a 0a 23 20 49 6e 6c 69 6e 65 20 74  ody...# Inline t
43f0: 68 65 20 53 49 47 4d 41 30 20 66 75 6e 63 74 69  he SIGMA0 functi
4400: 6f 6e 0a 72 65 67 73 75 62 20 2d 61 6c 6c 20 2d  on.regsub -all -
4410: 6c 69 6e 65 20 5c 0a 20 20 20 20 7b 5c 5b 53 49  line \.    {\[SI
4420: 47 4d 41 30 20 28 5c 24 5b 41 42 43 44 45 46 47  GMA0 (\$[ABCDEFG
4430: 48 5d 29 5c 5d 7d 20 5c 0a 20 20 20 20 24 3a 3a  H])\]} \.    $::
4440: 73 68 61 32 3a 3a 53 48 41 32 35 36 54 72 61 6e  sha2::SHA256Tran
4450: 73 66 6f 72 6d 5f 62 6f 64 79 20 5c 0a 20 20 20  sform_body \.   
4460: 20 7b 28 28 28 28 5c 31 3c 3c 33 30 29 20 7c 20   {((((\1<<30) | 
4470: 28 28 5c 31 3e 3e 32 29 20 5c 26 20 28 30 78 37  ((\1>>2) \& (0x7
4480: 46 46 46 46 46 46 46 3e 3e 31 29 29 29 20 5c 26  FFFFFFF>>1))) \&
4490: 20 30 78 46 46 46 46 46 46 46 46 29 20 5c 0a 20   0xFFFFFFFF) \. 
44a0: 20 20 20 20 20 20 20 20 20 5e 20 28 28 28 5c 31           ^ (((\1
44b0: 3c 3c 31 39 29 20 7c 20 28 28 5c 31 3e 3e 31 33  <<19) | ((\1>>13
44c0: 29 20 5c 26 20 28 30 78 37 46 46 46 46 46 46 46  ) \& (0x7FFFFFFF
44d0: 3e 3e 31 32 29 29 29 20 5c 26 20 30 78 46 46 46  >>12))) \& 0xFFF
44e0: 46 46 46 46 46 29 20 5c 0a 20 20 20 20 20 20 20  FFFFF) \.       
44f0: 20 20 20 5e 20 28 28 28 5c 31 3c 3c 31 30 29 20     ^ (((\1<<10) 
4500: 7c 20 28 28 5c 31 3e 3e 32 32 29 20 5c 26 20 28  | ((\1>>22) \& (
4510: 30 78 37 46 46 46 46 46 46 46 3e 3e 32 31 29 29  0x7FFFFFFF>>21))
4520: 29 20 5c 26 20 30 78 46 46 46 46 46 46 46 46 29  ) \& 0xFFFFFFFF)
4530: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 29 7d 20   \.          )} 
4540: 5c 0a 20 20 20 20 3a 3a 73 68 61 32 3a 3a 53 48  \.    ::sha2::SH
4550: 41 32 35 36 54 72 61 6e 73 66 6f 72 6d 5f 62 6f  A256Transform_bo
4560: 64 79 0a 0a 23 20 49 6e 6c 69 6e 65 20 74 68 65  dy..# Inline the
4570: 20 53 49 47 4d 41 31 20 66 75 6e 63 74 69 6f 6e   SIGMA1 function
4580: 0a 72 65 67 73 75 62 20 2d 61 6c 6c 20 2d 6c 69  .regsub -all -li
4590: 6e 65 20 5c 0a 20 20 20 20 7b 5c 5b 53 49 47 4d  ne \.    {\[SIGM
45a0: 41 31 20 28 5c 24 5b 41 42 43 44 45 46 47 48 5d  A1 (\$[ABCDEFGH]
45b0: 29 5c 5d 7d 20 5c 0a 20 20 20 20 24 3a 3a 73 68  )\]} \.    $::sh
45c0: 61 32 3a 3a 53 48 41 32 35 36 54 72 61 6e 73 66  a2::SHA256Transf
45d0: 6f 72 6d 5f 62 6f 64 79 20 5c 0a 20 20 20 20 7b  orm_body \.    {
45e0: 28 28 28 28 5c 31 3c 3c 32 36 29 20 7c 20 28 28  ((((\1<<26) | ((
45f0: 5c 31 3e 3e 36 29 20 5c 26 20 28 30 78 37 46 46  \1>>6) \& (0x7FF
4600: 46 46 46 46 46 3e 3e 35 29 29 29 20 5c 26 20 30  FFFFF>>5))) \& 0
4610: 78 46 46 46 46 46 46 46 46 29 20 5c 0a 20 20 20  xFFFFFFFF) \.   
4620: 20 20 20 20 20 20 20 5e 20 28 28 28 5c 31 3c 3c         ^ (((\1<<
4630: 32 31 29 20 7c 20 28 28 5c 31 3e 3e 31 31 29 20  21) | ((\1>>11) 
4640: 5c 26 20 28 30 78 37 46 46 46 46 46 46 46 3e 3e  \& (0x7FFFFFFF>>
4650: 31 30 29 29 29 20 5c 26 20 30 78 46 46 46 46 46  10))) \& 0xFFFFF
4660: 46 46 46 29 20 5c 0a 20 20 20 20 20 20 20 20 20  FFF) \.         
4670: 20 5e 20 28 28 28 5c 31 3c 3c 37 29 20 7c 20 28   ^ (((\1<<7) | (
4680: 28 5c 31 3e 3e 32 35 29 20 5c 26 20 28 30 78 37  (\1>>25) \& (0x7
4690: 46 46 46 46 46 46 46 3e 3e 32 34 29 29 29 20 5c  FFFFFFF>>24))) \
46a0: 26 20 30 78 46 46 46 46 46 46 46 46 29 20 5c 0a  & 0xFFFFFFFF) \.
46b0: 20 20 20 20 20 20 20 20 20 20 29 7d 20 5c 0a 20            )} \. 
46c0: 20 20 20 3a 3a 73 68 61 32 3a 3a 53 48 41 32 35     ::sha2::SHA25
46d0: 36 54 72 61 6e 73 66 6f 72 6d 5f 62 6f 64 79 0a  6Transform_body.
46e0: 0a 70 72 6f 63 20 3a 3a 73 68 61 32 3a 3a 53 48  .proc ::sha2::SH
46f0: 41 32 35 36 54 72 61 6e 73 66 6f 72 6d 20 7b 74  A256Transform {t
4700: 6f 6b 65 6e 20 6d 73 67 7d 20 24 3a 3a 73 68 61  oken msg} $::sha
4710: 32 3a 3a 53 48 41 32 35 36 54 72 61 6e 73 66 6f  2::SHA256Transfo
4720: 72 6d 5f 62 6f 64 79 0a 0a 23 20 2d 2d 2d 2d 2d  rm_body..# -----
4730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4770: 2d 2d 2d 2d 0a 0a 23 20 43 6f 6e 76 65 72 74 20  ----..# Convert 
4780: 61 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20  a integer value 
4790: 69 6e 74 6f 20 61 20 62 69 6e 61 72 79 20 73 74  into a binary st
47a0: 72 69 6e 67 20 69 6e 20 62 69 67 2d 65 6e 64 69  ring in big-endi
47b0: 61 6e 20 6f 72 64 65 72 2e 0a 70 72 6f 63 20 3a  an order..proc :
47c0: 3a 73 68 61 32 3a 3a 62 79 74 65 20 7b 6e 20 76  :sha2::byte {n v
47d0: 7d 20 7b 65 78 70 72 20 7b 28 28 30 78 46 46 20  } {expr {((0xFF 
47e0: 3c 3c 20 28 38 20 2a 20 24 6e 29 29 20 26 20 24  << (8 * $n)) & $
47f0: 76 29 20 3e 3e 20 28 38 20 2a 20 24 6e 29 7d 7d  v) >> (8 * $n)}}
4800: 0a 70 72 6f 63 20 3a 3a 73 68 61 32 3a 3a 62 79  .proc ::sha2::by
4810: 74 65 73 20 7b 76 7d 20 7b 20 0a 20 20 20 20 23  tes {v} { .    #
4820: 66 6f 72 6d 61 74 20 25 63 25 63 25 63 25 63 20  format %c%c%c%c 
4830: 5b 62 79 74 65 20 33 20 24 76 5d 20 5b 62 79 74  [byte 3 $v] [byt
4840: 65 20 32 20 24 76 5d 20 5b 62 79 74 65 20 31 20  e 2 $v] [byte 1 
4850: 24 76 5d 20 5b 62 79 74 65 20 30 20 24 76 5d 0a  $v] [byte 0 $v].
4860: 20 20 20 20 66 6f 72 6d 61 74 20 25 63 25 63 25      format %c%c%
4870: 63 25 63 20 5c 0a 20 20 20 20 20 20 20 20 5b 65  c%c \.        [e
4880: 78 70 72 20 7b 28 28 30 78 46 46 30 30 30 30 30  xpr {((0xFF00000
4890: 30 20 26 20 24 76 29 20 3e 3e 20 32 34 29 20 26  0 & $v) >> 24) &
48a0: 20 30 78 46 46 7d 5d 20 5c 0a 20 20 20 20 20 20   0xFF}] \.      
48b0: 20 20 5b 65 78 70 72 20 7b 28 30 78 46 46 30 30    [expr {(0xFF00
48c0: 30 30 20 26 20 24 76 29 20 3e 3e 20 31 36 7d 5d  00 & $v) >> 16}]
48d0: 20 5c 0a 20 20 20 20 20 20 20 20 5b 65 78 70 72   \.        [expr
48e0: 20 7b 28 30 78 46 46 30 30 20 26 20 24 76 29 20   {(0xFF00 & $v) 
48f0: 3e 3e 20 38 7d 5d 20 5c 0a 20 20 20 20 20 20 20  >> 8}] \.       
4900: 20 5b 65 78 70 72 20 7b 30 78 46 46 20 26 20 24   [expr {0xFF & $
4910: 76 7d 5d 0a 7d 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d  v}].}..# -------
4920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4960: 2d 2d 0a 0a 70 72 6f 63 20 3a 3a 73 68 61 32 3a  --..proc ::sha2:
4970: 3a 48 65 78 20 7b 64 61 74 61 7d 20 7b 0a 20 20  :Hex {data} {.  
4980: 20 20 62 69 6e 61 72 79 20 73 63 61 6e 20 24 64    binary scan $d
4990: 61 74 61 20 48 2a 20 72 65 73 75 6c 74 0a 20 20  ata H* result.  
49a0: 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74    return $result
49b0: 0a 7d 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..# ----------
49c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
4a00: 0a 23 20 44 65 73 63 72 69 70 74 69 6f 6e 3a 0a  .# Description:.
4a10: 23 20 20 50 6f 70 20 74 68 65 20 6e 74 68 20 65  #  Pop the nth e
4a20: 6c 65 6d 65 6e 74 20 6f 66 66 20 61 20 6c 69 73  lement off a lis
4a30: 74 2e 20 55 73 65 64 20 69 6e 20 6f 70 74 69 6f  t. Used in optio
4a40: 6e 73 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 23  ns processing..#
4a50: 0a 70 72 6f 63 20 3a 3a 73 68 61 32 3a 3a 50 6f  .proc ::sha2::Po
4a60: 70 20 7b 76 61 72 6e 61 6d 65 20 7b 6e 74 68 20  p {varname {nth 
4a70: 30 7d 7d 20 7b 0a 20 20 20 20 75 70 76 61 72 20  0}} {.    upvar 
4a80: 24 76 61 72 6e 61 6d 65 20 61 72 67 73 0a 20 20  $varname args.  
4a90: 20 20 73 65 74 20 72 20 5b 6c 69 6e 64 65 78 20    set r [lindex 
4aa0: 24 61 72 67 73 20 24 6e 74 68 5d 0a 20 20 20 20  $args $nth].    
4ab0: 73 65 74 20 61 72 67 73 20 5b 6c 72 65 70 6c 61  set args [lrepla
4ac0: 63 65 20 24 61 72 67 73 20 24 6e 74 68 20 24 6e  ce $args $nth $n
4ad0: 74 68 5d 0a 20 20 20 20 72 65 74 75 72 6e 20 24  th].    return $
4ae0: 72 0a 7d 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  r.}..# ---------
4af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b30: 0a 0a 23 20 66 69 6c 65 65 76 65 6e 74 20 68 61  ..# fileevent ha
4b40: 6e 64 6c 65 72 20 66 6f 72 20 63 68 75 6e 6b 65  ndler for chunke
4b50: 64 20 66 69 6c 65 20 68 61 73 68 69 6e 67 2e 0a  d file hashing..
4b60: 23 0a 70 72 6f 63 20 3a 3a 73 68 61 32 3a 3a 43  #.proc ::sha2::C
4b70: 68 75 6e 6b 20 7b 74 6f 6b 65 6e 20 63 68 61 6e  hunk {token chan
4b80: 6e 65 6c 20 7b 63 68 75 6e 6b 73 69 7a 65 20 34  nel {chunksize 4
4b90: 30 39 36 7d 7d 20 7b 0a 20 20 20 20 75 70 76 61  096}} {.    upva
4ba0: 72 20 23 30 20 24 74 6f 6b 65 6e 20 73 74 61 74  r #0 $token stat
4bb0: 65 0a 20 20 20 20 0a 20 20 20 20 69 66 20 7b 5b  e.    .    if {[
4bc0: 65 6f 66 20 24 63 68 61 6e 6e 65 6c 5d 7d 20 7b  eof $channel]} {
4bd0: 0a 20 20 20 20 20 20 20 20 66 69 6c 65 65 76 65  .        fileeve
4be0: 6e 74 20 24 63 68 61 6e 6e 65 6c 20 72 65 61 64  nt $channel read
4bf0: 61 62 6c 65 20 7b 7d 0a 20 20 20 20 20 20 20 20  able {}.        
4c00: 73 65 74 20 73 74 61 74 65 28 72 65 61 64 69 6e  set state(readin
4c10: 67 29 20 30 0a 20 20 20 20 7d 0a 20 20 20 20 20  g) 0.    }.     
4c20: 20 20 20 0a 20 20 20 20 53 48 41 32 35 36 55 70     .    SHA256Up
4c30: 64 61 74 65 20 24 74 6f 6b 65 6e 20 5b 72 65 61  date $token [rea
4c40: 64 20 24 63 68 61 6e 6e 65 6c 20 24 63 68 75 6e  d $channel $chun
4c50: 6b 73 69 7a 65 5d 0a 7d 0a 0a 23 20 2d 2d 2d 2d  ksize].}..# ----
4c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ca0: 2d 2d 2d 2d 2d 0a 0a 70 72 6f 63 20 3a 3a 73 68  -----..proc ::sh
4cb0: 61 32 3a 3a 5f 73 68 61 32 35 36 20 7b 76 65 72  a2::_sha256 {ver
4cc0: 20 61 72 67 73 7d 20 7b 0a 20 20 20 20 61 72 72   args} {.    arr
4cd0: 61 79 20 73 65 74 20 6f 70 74 73 20 7b 2d 68 65  ay set opts {-he
4ce0: 78 20 30 20 2d 66 69 6c 65 6e 61 6d 65 20 7b 7d  x 0 -filename {}
4cf0: 20 2d 63 68 61 6e 6e 65 6c 20 7b 7d 20 2d 63 68   -channel {} -ch
4d00: 75 6e 6b 73 69 7a 65 20 34 30 39 36 7d 0a 20 20  unksize 4096}.  
4d10: 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24    if {[llength $
4d20: 61 72 67 73 5d 20 3d 3d 20 31 7d 20 7b 0a 20 20  args] == 1} {.  
4d30: 20 20 20 20 20 20 73 65 74 20 6f 70 74 73 28 2d        set opts(-
4d40: 68 65 78 29 20 31 0a 20 20 20 20 7d 20 65 6c 73  hex) 1.    } els
4d50: 65 20 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  e {.        whil
4d60: 65 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68  e {[string match
4d70: 20 2d 2a 20 5b 73 65 74 20 6f 70 74 69 6f 6e 20   -* [set option 
4d80: 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 20 30 5d  [lindex $args 0]
4d90: 5d 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ]]} {.          
4da0: 20 20 73 77 69 74 63 68 20 2d 67 6c 6f 62 20 2d    switch -glob -
4db0: 2d 20 24 6f 70 74 69 6f 6e 20 7b 0a 20 20 20 20  - $option {.    
4dc0: 20 20 20 20 20 20 20 20 20 20 20 20 2d 68 65 78              -hex
4dd0: 20 20 20 20 20 20 20 7b 20 73 65 74 20 6f 70 74         { set opt
4de0: 73 28 2d 68 65 78 29 20 31 20 7d 0a 20 20 20 20  s(-hex) 1 }.    
4df0: 20 20 20 20 20 20 20 20 20 20 20 20 2d 62 69 6e              -bin
4e00: 20 20 20 20 20 20 20 7b 20 73 65 74 20 6f 70 74         { set opt
4e10: 73 28 2d 68 65 78 29 20 30 20 7d 0a 20 20 20 20  s(-hex) 0 }.    
4e20: 20 20 20 20 20 20 20 20 20 20 20 20 2d 66 69 6c              -fil
4e30: 65 2a 20 20 20 20 20 7b 20 73 65 74 20 6f 70 74  e*     { set opt
4e40: 73 28 2d 66 69 6c 65 6e 61 6d 65 29 20 5b 50 6f  s(-filename) [Po
4e50: 70 20 61 72 67 73 20 31 5d 20 7d 0a 20 20 20 20  p args 1] }.    
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 2d 63 68 61              -cha
4e70: 6e 6e 65 6c 20 20 20 7b 20 73 65 74 20 6f 70 74  nnel   { set opt
4e80: 73 28 2d 63 68 61 6e 6e 65 6c 29 20 5b 50 6f 70  s(-channel) [Pop
4e90: 20 61 72 67 73 20 31 5d 20 7d 0a 20 20 20 20 20   args 1] }.     
4ea0: 20 20 20 20 20 20 20 20 20 20 20 2d 63 68 75 6e             -chun
4eb0: 6b 73 69 7a 65 20 7b 20 73 65 74 20 6f 70 74 73  ksize { set opts
4ec0: 28 2d 63 68 75 6e 6b 73 69 7a 65 29 20 5b 50 6f  (-chunksize) [Po
4ed0: 70 20 61 72 67 73 20 31 5d 20 7d 0a 20 20 20 20  p args 1] }.    
4ee0: 20 20 20 20 20 20 20 20 20 20 20 20 64 65 66 61              defa
4ef0: 75 6c 74 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ult {.          
4f00: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c            if {[l
4f10: 6c 65 6e 67 74 68 20 24 61 72 67 73 5d 20 3d 3d  length $args] ==
4f20: 20 31 7d 20 7b 20 62 72 65 61 6b 20 7d 0a 20 20   1} { break }.  
4f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f40: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 63 6f    if {[string co
4f50: 6d 70 61 72 65 20 24 6f 70 74 69 6f 6e 20 22 2d  mpare $option "-
4f60: 2d 22 5d 20 3d 3d 20 30 7d 20 7b 20 50 6f 70 20  -"] == 0} { Pop 
4f70: 61 72 67 73 3b 20 62 72 65 61 6b 20 7d 0a 20 20  args; break }.  
4f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f90: 20 20 73 65 74 20 65 72 72 20 5b 6a 6f 69 6e 20    set err [join 
4fa0: 5b 6c 73 6f 72 74 20 5b 63 6f 6e 63 61 74 20 2d  [lsort [concat -
4fb0: 62 69 6e 20 5b 61 72 72 61 79 20 6e 61 6d 65 73  bin [array names
4fc0: 20 6f 70 74 73 5d 5d 5d 20 22 2c 20 22 5d 0a 20   opts]]] ", "]. 
4fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fe0: 20 20 20 72 65 74 75 72 6e 20 2d 63 6f 64 65 20     return -code 
4ff0: 65 72 72 6f 72 20 22 62 61 64 20 6f 70 74 69 6f  error "bad optio
5000: 6e 20 24 6f 70 74 69 6f 6e 3a 5c 0a 20 20 20 20  n $option:\.    
5010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5020: 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 24  must be one of $
5030: 65 72 72 22 0a 20 20 20 20 20 20 20 20 20 20 20  err".           
5040: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
5050: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
5060: 20 50 6f 70 20 61 72 67 73 0a 20 20 20 20 20 20   Pop args.      
5070: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
5080: 66 20 7b 24 6f 70 74 73 28 2d 66 69 6c 65 6e 61  f {$opts(-filena
5090: 6d 65 29 20 21 3d 20 7b 7d 7d 20 7b 0a 20 20 20  me) != {}} {.   
50a0: 20 20 20 20 20 73 65 74 20 6f 70 74 73 28 2d 63       set opts(-c
50b0: 68 61 6e 6e 65 6c 29 20 5b 6f 70 65 6e 20 24 6f  hannel) [open $o
50c0: 70 74 73 28 2d 66 69 6c 65 6e 61 6d 65 29 20 72  pts(-filename) r
50d0: 5d 0a 20 20 20 20 20 20 20 20 66 63 6f 6e 66 69  ].        fconfi
50e0: 67 75 72 65 20 24 6f 70 74 73 28 2d 63 68 61 6e  gure $opts(-chan
50f0: 6e 65 6c 29 20 2d 74 72 61 6e 73 6c 61 74 69 6f  nel) -translatio
5100: 6e 20 62 69 6e 61 72 79 0a 20 20 20 20 7d 0a 0a  n binary.    }..
5110: 20 20 20 20 69 66 20 7b 24 6f 70 74 73 28 2d 63      if {$opts(-c
5120: 68 61 6e 6e 65 6c 29 20 3d 3d 20 7b 7d 7d 20 7b  hannel) == {}} {
5130: 0a 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c  ..        if {[l
5140: 6c 65 6e 67 74 68 20 24 61 72 67 73 5d 20 21 3d  length $args] !=
5150: 20 31 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20   1} {.          
5160: 20 20 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 65    return -code e
5170: 72 72 6f 72 20 22 77 72 6f 6e 67 20 23 20 61 72  rror "wrong # ar
5180: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 5c 0a 20  gs: should be\. 
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
51a0: 22 5b 6e 61 6d 65 73 70 61 63 65 20 63 75 72 72  "[namespace curr
51b0: 65 6e 74 5d 3a 3a 73 68 61 24 76 65 72 20 3f 2d  ent]::sha$ver ?-
51c0: 68 65 78 7c 2d 62 69 6e 3f 20 2d 66 69 6c 65 6e  hex|-bin? -filen
51d0: 61 6d 65 20 66 69 6c 65 5c 0a 20 20 20 20 20 20  ame file\.      
51e0: 20 20 20 20 20 20 20 20 20 20 7c 20 2d 63 68 61            | -cha
51f0: 6e 6e 65 6c 20 63 68 61 6e 6e 65 6c 20 7c 20 73  nnel channel | s
5200: 74 72 69 6e 67 5c 22 22 0a 20 20 20 20 20 20 20  tring\"".       
5210: 20 7d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74   }.        set t
5220: 6f 6b 20 5b 53 48 41 24 7b 76 65 72 7d 49 6e 69  ok [SHA${ver}Ini
5230: 74 5d 0a 20 20 20 20 20 20 20 20 53 48 41 24 7b  t].        SHA${
5240: 76 65 72 7d 55 70 64 61 74 65 20 24 74 6f 6b 20  ver}Update $tok 
5250: 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 20 30 5d  [lindex $args 0]
5260: 0a 20 20 20 20 20 20 20 20 73 65 74 20 72 20 5b  .        set r [
5270: 53 48 41 24 7b 76 65 72 7d 46 69 6e 61 6c 20 24  SHA${ver}Final $
5280: 74 6f 6b 5d 0a 0a 20 20 20 20 7d 20 65 6c 73 65  tok]..    } else
5290: 20 7b 0a 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
52a0: 74 6f 6b 20 5b 53 48 41 24 7b 76 65 72 7d 49 6e  tok [SHA${ver}In
52b0: 69 74 5d 0a 20 20 20 20 20 20 20 20 23 20 46 52  it].        # FR
52c0: 49 4e 4b 3a 20 6e 6f 63 68 65 63 6b 0a 20 20 20  INK: nocheck.   
52d0: 20 20 20 20 20 73 65 74 20 5b 73 75 62 73 74 20       set [subst 
52e0: 24 74 6f 6b 5d 28 72 65 61 64 69 6e 67 29 20 31  $tok](reading) 1
52f0: 0a 20 20 20 20 20 20 20 20 66 69 6c 65 65 76 65  .        fileeve
5300: 6e 74 20 24 6f 70 74 73 28 2d 63 68 61 6e 6e 65  nt $opts(-channe
5310: 6c 29 20 72 65 61 64 61 62 6c 65 20 5c 0a 20 20  l) readable \.  
5320: 20 20 20 20 20 20 20 20 20 20 5b 6c 69 73 74 20            [list 
5330: 5b 6e 61 6d 65 73 70 61 63 65 20 6f 72 69 67 69  [namespace origi
5340: 6e 20 43 68 75 6e 6b 5d 20 5c 0a 20 20 20 20 20  n Chunk] \.     
5350: 20 20 20 20 20 20 20 20 20 20 20 20 24 74 6f 6b              $tok
5360: 20 24 6f 70 74 73 28 2d 63 68 61 6e 6e 65 6c 29   $opts(-channel)
5370: 20 24 6f 70 74 73 28 2d 63 68 75 6e 6b 73 69 7a   $opts(-chunksiz
5380: 65 29 5d 0a 20 20 20 20 20 20 20 20 23 20 46 52  e)].        # FR
5390: 49 4e 4b 3a 20 6e 6f 63 68 65 63 6b 0a 20 20 20  INK: nocheck.   
53a0: 20 20 20 20 20 76 77 61 69 74 20 5b 73 75 62 73       vwait [subs
53b0: 74 20 24 74 6f 6b 5d 28 72 65 61 64 69 6e 67 29  t $tok](reading)
53c0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 72 20 5b  .        set r [
53d0: 53 48 41 24 7b 76 65 72 7d 46 69 6e 61 6c 20 24  SHA${ver}Final $
53e0: 74 6f 6b 5d 0a 0a 20 20 20 20 20 20 20 20 23 20  tok]..        # 
53f0: 49 66 20 77 65 20 6f 70 65 6e 65 64 20 74 68 65  If we opened the
5400: 20 63 68 61 6e 6e 65 6c 20 2d 20 77 65 20 73 68   channel - we sh
5410: 6f 75 6c 64 20 63 6c 6f 73 65 20 69 74 20 74 6f  ould close it to
5420: 6f 2e 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24  o..        if {$
5430: 6f 70 74 73 28 2d 66 69 6c 65 6e 61 6d 65 29 20  opts(-filename) 
5440: 21 3d 20 7b 7d 7d 20 7b 0a 20 20 20 20 20 20 20  != {}} {.       
5450: 20 20 20 20 20 63 6c 6f 73 65 20 24 6f 70 74 73       close $opts
5460: 28 2d 63 68 61 6e 6e 65 6c 29 0a 20 20 20 20 20  (-channel).     
5470: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 0a     }.    }.    .
5480: 20 20 20 20 69 66 20 7b 24 6f 70 74 73 28 2d 68      if {$opts(-h
5490: 65 78 29 7d 20 7b 0a 20 20 20 20 20 20 20 20 73  ex)} {.        s
54a0: 65 74 20 72 20 5b 48 65 78 20 24 72 5d 0a 20 20  et r [Hex $r].  
54b0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 24    }.    return $
54c0: 72 0a 7d 0a 0a 69 6e 74 65 72 70 20 61 6c 69 61  r.}..interp alia
54d0: 73 20 7b 7d 20 3a 3a 73 68 61 32 3a 3a 73 68 61  s {} ::sha2::sha
54e0: 32 35 36 20 7b 7d 20 3a 3a 73 68 61 32 3a 3a 5f  256 {} ::sha2::_
54f0: 73 68 61 32 35 36 20 32 35 36 0a 69 6e 74 65 72  sha256 256.inter
5500: 70 20 61 6c 69 61 73 20 7b 7d 20 3a 3a 73 68 61  p alias {} ::sha
5510: 32 3a 3a 73 68 61 32 32 34 20 7b 7d 20 3a 3a 73  2::sha224 {} ::s
5520: 68 61 32 3a 3a 5f 73 68 61 32 35 36 20 32 32 34  ha2::_sha256 224
5530: 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..# ------------
5540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 70  -------------..p
5580: 72 6f 63 20 3a 3a 73 68 61 32 3a 3a 68 6d 61 63  roc ::sha2::hmac
5590: 20 7b 61 72 67 73 7d 20 7b 0a 20 20 20 20 61 72   {args} {.    ar
55a0: 72 61 79 20 73 65 74 20 6f 70 74 73 20 7b 2d 68  ray set opts {-h
55b0: 65 78 20 31 20 2d 66 69 6c 65 6e 61 6d 65 20 7b  ex 1 -filename {
55c0: 7d 20 2d 63 68 61 6e 6e 65 6c 20 7b 7d 20 2d 63  } -channel {} -c
55d0: 68 75 6e 6b 73 69 7a 65 20 34 30 39 36 7d 0a 20  hunksize 4096}. 
55e0: 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20     if {[llength 
55f0: 24 61 72 67 73 5d 20 21 3d 20 32 7d 20 7b 0a 20  $args] != 2} {. 
5600: 20 20 20 20 20 20 20 77 68 69 6c 65 20 7b 5b 73         while {[s
5610: 74 72 69 6e 67 20 6d 61 74 63 68 20 2d 2a 20 5b  tring match -* [
5620: 73 65 74 20 6f 70 74 69 6f 6e 20 5b 6c 69 6e 64  set option [lind
5630: 65 78 20 24 61 72 67 73 20 30 5d 5d 5d 7d 20 7b  ex $args 0]]]} {
5640: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 77 69  .            swi
5650: 74 63 68 20 2d 67 6c 6f 62 20 2d 2d 20 24 6f 70  tch -glob -- $op
5660: 74 69 6f 6e 20 7b 0a 20 20 20 20 20 20 20 20 20  tion {.         
5670: 20 20 20 20 20 20 20 2d 6b 65 79 20 20 20 20 20         -key     
5680: 20 20 7b 20 73 65 74 20 6f 70 74 73 28 2d 6b 65    { set opts(-ke
5690: 79 29 20 5b 50 6f 70 20 61 72 67 73 20 31 5d 20  y) [Pop args 1] 
56a0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
56b0: 20 20 2d 68 65 78 20 20 20 20 20 20 20 7b 20 73    -hex       { s
56c0: 65 74 20 6f 70 74 73 28 2d 68 65 78 29 20 31 20  et opts(-hex) 1 
56d0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
56e0: 20 20 2d 62 69 6e 20 20 20 20 20 20 20 7b 20 73    -bin       { s
56f0: 65 74 20 6f 70 74 73 28 2d 68 65 78 29 20 30 20  et opts(-hex) 0 
5700: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
5710: 20 20 2d 66 69 6c 65 2a 20 20 20 20 20 7b 20 73    -file*     { s
5720: 65 74 20 6f 70 74 73 28 2d 66 69 6c 65 6e 61 6d  et opts(-filenam
5730: 65 29 20 5b 50 6f 70 20 61 72 67 73 20 31 5d 20  e) [Pop args 1] 
5740: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
5750: 20 20 2d 63 68 61 6e 6e 65 6c 20 20 20 7b 20 73    -channel   { s
5760: 65 74 20 6f 70 74 73 28 2d 63 68 61 6e 6e 65 6c  et opts(-channel
5770: 29 20 5b 50 6f 70 20 61 72 67 73 20 31 5d 20 7d  ) [Pop args 1] }
5780: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5790: 20 2d 63 68 75 6e 6b 73 69 7a 65 20 7b 20 73 65   -chunksize { se
57a0: 74 20 6f 70 74 73 28 2d 63 68 75 6e 6b 73 69 7a  t opts(-chunksiz
57b0: 65 29 20 5b 50 6f 70 20 61 72 67 73 20 31 5d 20  e) [Pop args 1] 
57c0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
57d0: 20 20 64 65 66 61 75 6c 74 20 7b 0a 20 20 20 20    default {.    
57e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57f0: 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 61 72  if {[llength $ar
5800: 67 73 5d 20 3d 3d 20 31 7d 20 7b 20 62 72 65 61  gs] == 1} { brea
5810: 6b 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20  k }.            
5820: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
5830: 69 6e 67 20 63 6f 6d 70 61 72 65 20 24 6f 70 74  ing compare $opt
5840: 69 6f 6e 20 22 2d 2d 22 5d 20 3d 3d 20 30 7d 20  ion "--"] == 0} 
5850: 7b 20 50 6f 70 20 61 72 67 73 3b 20 62 72 65 61  { Pop args; brea
5860: 6b 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20  k }.            
5870: 20 20 20 20 20 20 20 20 73 65 74 20 65 72 72 20          set err 
5880: 5b 6a 6f 69 6e 20 5b 6c 73 6f 72 74 20 5b 61 72  [join [lsort [ar
5890: 72 61 79 20 6e 61 6d 65 73 20 6f 70 74 73 5d 5d  ray names opts]]
58a0: 20 22 2c 20 22 5d 0a 20 20 20 20 20 20 20 20 20   ", "].         
58b0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
58c0: 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 22 62  n -code error "b
58d0: 61 64 20 6f 70 74 69 6f 6e 20 24 6f 70 74 69 6f  ad option $optio
58e0: 6e 3a 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n:\.            
58f0: 20 20 20 20 20 20 20 20 6d 75 73 74 20 62 65 20          must be 
5900: 6f 6e 65 20 6f 66 20 24 65 72 72 22 0a 20 20 20  one of $err".   
5910: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
5920: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
5930: 20 20 20 20 20 20 20 20 20 50 6f 70 20 61 72 67           Pop arg
5940: 73 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  s.        }.    
5950: 7d 0a 0a 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e  }..    if {[llen
5960: 67 74 68 20 24 61 72 67 73 5d 20 3d 3d 20 32 7d  gth $args] == 2}
5970: 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20 6f   {.        set o
5980: 70 74 73 28 2d 6b 65 79 29 20 5b 50 6f 70 20 61  pts(-key) [Pop a
5990: 72 67 73 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  rgs].    }..    
59a0: 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
59b0: 73 20 6f 70 74 73 28 2d 6b 65 79 29 5d 7d 20 7b  s opts(-key)]} {
59c0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
59d0: 2d 63 6f 64 65 20 65 72 72 6f 72 20 22 77 72 6f  -code error "wro
59e0: 6e 67 20 23 20 61 72 67 73 3a 5c 0a 20 20 20 20  ng # args:\.    
59f0: 20 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62          should b
5a00: 65 20 5c 22 68 6d 61 63 20 3f 2d 68 65 78 3f 20  e \"hmac ?-hex? 
5a10: 2d 6b 65 79 20 6b 65 79 20 2d 66 69 6c 65 6e 61  -key key -filena
5a20: 6d 65 20 66 69 6c 65 20 7c 20 73 74 72 69 6e 67  me file | string
5a30: 5c 22 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  \"".    }..    i
5a40: 66 20 7b 24 6f 70 74 73 28 2d 66 69 6c 65 6e 61  f {$opts(-filena
5a50: 6d 65 29 20 21 3d 20 7b 7d 7d 20 7b 0a 20 20 20  me) != {}} {.   
5a60: 20 20 20 20 20 73 65 74 20 6f 70 74 73 28 2d 63       set opts(-c
5a70: 68 61 6e 6e 65 6c 29 20 5b 6f 70 65 6e 20 24 6f  hannel) [open $o
5a80: 70 74 73 28 2d 66 69 6c 65 6e 61 6d 65 29 20 72  pts(-filename) r
5a90: 5d 0a 20 20 20 20 20 20 20 20 66 63 6f 6e 66 69  ].        fconfi
5aa0: 67 75 72 65 20 24 6f 70 74 73 28 2d 63 68 61 6e  gure $opts(-chan
5ab0: 6e 65 6c 29 20 2d 74 72 61 6e 73 6c 61 74 69 6f  nel) -translatio
5ac0: 6e 20 62 69 6e 61 72 79 0a 20 20 20 20 7d 0a 0a  n binary.    }..
5ad0: 20 20 20 20 69 66 20 7b 24 6f 70 74 73 28 2d 63      if {$opts(-c
5ae0: 68 61 6e 6e 65 6c 29 20 3d 3d 20 7b 7d 7d 20 7b  hannel) == {}} {
5af0: 0a 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c  ..        if {[l
5b00: 6c 65 6e 67 74 68 20 24 61 72 67 73 5d 20 21 3d  length $args] !=
5b10: 20 31 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20   1} {.          
5b20: 20 20 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 65    return -code e
5b30: 72 72 6f 72 20 22 77 72 6f 6e 67 20 23 20 61 72  rror "wrong # ar
5b40: 67 73 3a 5c 0a 20 20 20 20 20 20 20 20 20 20 20  gs:\.           
5b50: 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 5c       should be \
5b60: 22 68 6d 61 63 20 3f 2d 68 65 78 3f 20 2d 6b 65  "hmac ?-hex? -ke
5b70: 79 20 6b 65 79 20 2d 66 69 6c 65 6e 61 6d 65 20  y key -filename 
5b80: 66 69 6c 65 20 7c 20 73 74 72 69 6e 67 5c 22 22  file | string\""
5b90: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5ba0: 20 20 20 73 65 74 20 74 6f 6b 20 5b 48 4d 41 43     set tok [HMAC
5bb0: 49 6e 69 74 20 24 6f 70 74 73 28 2d 6b 65 79 29  Init $opts(-key)
5bc0: 5d 0a 20 20 20 20 20 20 20 20 48 4d 41 43 55 70  ].        HMACUp
5bd0: 64 61 74 65 20 24 74 6f 6b 20 5b 6c 69 6e 64 65  date $tok [linde
5be0: 78 20 24 61 72 67 73 20 30 5d 0a 20 20 20 20 20  x $args 0].     
5bf0: 20 20 20 73 65 74 20 72 20 5b 48 4d 41 43 46 69     set r [HMACFi
5c00: 6e 61 6c 20 24 74 6f 6b 5d 0a 0a 20 20 20 20 7d  nal $tok]..    }
5c10: 20 65 6c 73 65 20 7b 0a 0a 20 20 20 20 20 20 20   else {..       
5c20: 20 73 65 74 20 74 6f 6b 20 5b 48 4d 41 43 49 6e   set tok [HMACIn
5c30: 69 74 20 24 6f 70 74 73 28 2d 6b 65 79 29 5d 0a  it $opts(-key)].
5c40: 20 20 20 20 20 20 20 20 23 20 46 52 49 4e 4b 3a          # FRINK:
5c50: 20 6e 6f 63 68 65 63 6b 0a 20 20 20 20 20 20 20   nocheck.       
5c60: 20 73 65 74 20 5b 73 75 62 73 74 20 24 74 6f 6b   set [subst $tok
5c70: 5d 28 72 65 61 64 69 6e 67 29 20 31 0a 20 20 20  ](reading) 1.   
5c80: 20 20 20 20 20 66 69 6c 65 65 76 65 6e 74 20 24       fileevent $
5c90: 6f 70 74 73 28 2d 63 68 61 6e 6e 65 6c 29 20 72  opts(-channel) r
5ca0: 65 61 64 61 62 6c 65 20 5c 0a 20 20 20 20 20 20  eadable \.      
5cb0: 20 20 20 20 20 20 5b 6c 69 73 74 20 5b 6e 61 6d        [list [nam
5cc0: 65 73 70 61 63 65 20 6f 72 69 67 69 6e 20 43 68  espace origin Ch
5cd0: 75 6e 6b 5d 20 5c 0a 20 20 20 20 20 20 20 20 20  unk] \.         
5ce0: 20 20 20 20 20 20 20 20 24 74 6f 6b 20 24 6f 70          $tok $op
5cf0: 74 73 28 2d 63 68 61 6e 6e 65 6c 29 20 24 6f 70  ts(-channel) $op
5d00: 74 73 28 2d 63 68 75 6e 6b 73 69 7a 65 29 5d 0a  ts(-chunksize)].
5d10: 20 20 20 20 20 20 20 20 23 20 46 52 49 4e 4b 3a          # FRINK:
5d20: 20 6e 6f 63 68 65 63 6b 0a 20 20 20 20 20 20 20   nocheck.       
5d30: 20 76 77 61 69 74 20 5b 73 75 62 73 74 20 24 74   vwait [subst $t
5d40: 6f 6b 5d 28 72 65 61 64 69 6e 67 29 0a 20 20 20  ok](reading).   
5d50: 20 20 20 20 20 73 65 74 20 72 20 5b 48 4d 41 43       set r [HMAC
5d60: 46 69 6e 61 6c 20 24 74 6f 6b 5d 0a 0a 20 20 20  Final $tok]..   
5d70: 20 20 20 20 20 23 20 49 66 20 77 65 20 6f 70 65       # If we ope
5d80: 6e 65 64 20 74 68 65 20 63 68 61 6e 6e 65 6c 20  ned the channel 
5d90: 2d 20 77 65 20 73 68 6f 75 6c 64 20 63 6c 6f 73  - we should clos
5da0: 65 20 69 74 20 74 6f 6f 2e 0a 20 20 20 20 20 20  e it too..      
5db0: 20 20 69 66 20 7b 24 6f 70 74 73 28 2d 66 69 6c    if {$opts(-fil
5dc0: 65 6e 61 6d 65 29 20 21 3d 20 7b 7d 7d 20 7b 0a  ename) != {}} {.
5dd0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73              clos
5de0: 65 20 24 6f 70 74 73 28 2d 63 68 61 6e 6e 65 6c  e $opts(-channel
5df0: 29 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ).        }.    
5e00: 7d 0a 20 20 20 20 0a 20 20 20 20 69 66 20 7b 24  }.    .    if {$
5e10: 6f 70 74 73 28 2d 68 65 78 29 7d 20 7b 0a 20 20  opts(-hex)} {.  
5e20: 20 20 20 20 20 20 73 65 74 20 72 20 5b 48 65 78        set r [Hex
5e30: 20 24 72 5d 0a 20 20 20 20 7d 0a 20 20 20 20 72   $r].    }.    r
5e40: 65 74 75 72 6e 20 24 72 0a 7d 0a 0a 23 20 2d 2d  eturn $r.}..# --
5e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5e90: 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 20 54 72 79 20 61  -------..# Try a
5ea0: 6e 64 20 6c 6f 61 64 20 61 20 63 6f 6d 70 69 6c  nd load a compil
5eb0: 65 64 20 65 78 74 65 6e 73 69 6f 6e 20 74 6f 20  ed extension to 
5ec0: 68 65 6c 70 2e 0a 6e 61 6d 65 73 70 61 63 65 20  help..namespace 
5ed0: 65 76 61 6c 20 3a 3a 73 68 61 32 20 7b 0a 20 20  eval ::sha2 {.  
5ee0: 20 20 76 61 72 69 61 62 6c 65 20 65 20 7b 7d 0a    variable e {}.
5ef0: 20 20 20 20 66 6f 72 65 61 63 68 20 65 20 5b 4b      foreach e [K
5f00: 6e 6f 77 6e 49 6d 70 6c 65 6d 65 6e 74 61 74 69  nownImplementati
5f10: 6f 6e 73 5d 20 7b 0a 09 69 66 20 7b 5b 4c 6f 61  ons] {..if {[Loa
5f20: 64 41 63 63 65 6c 65 72 61 74 6f 72 20 24 65 5d  dAccelerator $e]
5f30: 7d 20 7b 0a 09 20 20 20 20 53 77 69 74 63 68 54  } {..    SwitchT
5f40: 6f 20 24 65 0a 09 20 20 20 20 62 72 65 61 6b 0a  o $e..    break.
5f50: 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 73  .}.    }.    uns
5f60: 65 74 20 65 0a 7d 0a 0a 70 61 63 6b 61 67 65 20  et e.}..package 
5f70: 70 72 6f 76 69 64 65 20 73 68 61 32 35 36 20 31  provide sha256 1
5f80: 2e 30 2e 33 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d  .0.3..# --------
5f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fd0: 2d 0a 23 20 4c 6f 63 61 6c 20 56 61 72 69 61 62  -.# Local Variab
5fe0: 6c 65 73 3a 0a 23 20 20 20 6d 6f 64 65 3a 20 74  les:.#   mode: t
5ff0: 63 6c 0a 23 20 20 20 69 6e 64 65 6e 74 2d 74 61  cl.#   indent-ta
6000: 62 73 2d 6d 6f 64 65 3a 20 6e 69 6c 0a 23 20 45  bs-mode: nil.# E
6010: 6e 64 3a 0a                                      nd:.