Hex Artifact Content

Artifact 075035113a6c55715b5412364b23fce84a4a25d506f51f2529e05ae14c3ee4a0:


0000: 2f 2a 0a 20 2a 20 4d 65 73 73 61 67 65 20 44 69  /*. * Message Di
0010: 67 65 73 74 73 20 28 4d 44 29 20 61 6e 64 20 4d  gests (MD) and M
0020: 65 73 73 61 67 65 20 41 75 74 68 65 6e 74 69 63  essage Authentic
0030: 61 74 69 6f 6e 20 43 6f 64 65 20 28 4d 41 43 29  ation Code (MAC)
0040: 20 4d 6f 64 75 6c 65 0a 20 2a 0a 20 2a 20 50 72   Module. *. * Pr
0050: 6f 76 69 64 65 73 20 63 6f 6d 6d 61 6e 64 73 20  ovides commands 
0060: 74 6f 20 63 61 6c 63 75 6c 61 74 65 20 61 20 6d  to calculate a m
0070: 65 73 73 61 67 65 20 64 69 67 65 73 74 20 28 4d  essage digest (M
0080: 44 29 20 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a  D) or message. *
0090: 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20   authentication 
00a0: 63 6f 64 65 20 28 4d 41 43 29 20 75 73 69 6e 67  code (MAC) using
00b0: 20 61 20 73 70 65 63 69 66 69 65 64 20 68 61 73   a specified has
00c0: 68 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 2f 6f  h function and/o
00d0: 72 20 63 69 70 68 65 72 2e 0a 20 2a 0a 20 2a 20  r cipher.. *. * 
00e0: 43 6f 70 79 72 69 67 68 74 20 28 43 29 20 32 30  Copyright (C) 20
00f0: 32 33 20 42 72 69 61 6e 20 4f 27 48 61 67 61 6e  23 Brian O'Hagan
0100: 0a 20 2a 0a 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64  . *. */..#includ
0110: 65 20 22 74 6c 73 49 6e 74 2e 68 22 0a 23 69 6e  e "tlsInt.h".#in
0120: 63 6c 75 64 65 20 22 74 63 6c 4f 70 74 73 2e 68  clude "tclOpts.h
0130: 22 0a 23 69 6e 63 6c 75 64 65 20 3c 74 63 6c 2e  ".#include <tcl.
0140: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  h>.#include <std
0150: 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  io.h>.#include <
0160: 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75  string.h>.#inclu
0170: 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 65 76 70 2e  de <openssl/evp.
0180: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65  h>.#include <ope
0190: 6e 73 73 6c 2f 63 6d 61 63 2e 68 3e 0a 23 69 6e  nssl/cmac.h>.#in
01a0: 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 68  clude <openssl/h
01b0: 6d 61 63 2e 68 3e 0a 0a 2f 2a 20 43 6f 6e 73 74  mac.h>../* Const
01c0: 61 6e 74 73 20 2a 2f 0a 63 6f 6e 73 74 20 63 68  ants */.const ch
01d0: 61 72 20 2a 68 65 78 20 3d 20 22 30 31 32 33 34  ar *hex = "01234
01e0: 35 36 37 38 39 61 62 63 64 65 66 22 3b 0a 0a 2f  56789abcdef";../
01f0: 2a 20 4d 61 63 72 6f 73 20 2a 2f 0a 23 64 65 66  * Macros */.#def
0200: 69 6e 65 20 42 55 46 46 45 52 5f 53 49 5a 45 09  ine BUFFER_SIZE.
0210: 36 35 35 33 36 0a 23 64 65 66 69 6e 65 20 43 48  65536.#define CH
0220: 41 4e 5f 45 4f 46 09 30 78 31 30 0a 23 64 65 66  AN_EOF.0x10.#def
0230: 69 6e 65 20 52 45 41 44 5f 44 45 4c 41 59 09 35  ine READ_DELAY.5
0240: 0a 0a 2f 2a 20 44 69 67 65 73 74 20 66 6f 72 6d  ../* Digest form
0250: 61 74 20 61 6e 64 20 6f 70 65 72 61 74 69 6f 6e  at and operation
0260: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 42 49 4e 5f   */.#define BIN_
0270: 46 4f 52 4d 41 54 09 30 78 30 31 0a 23 64 65 66  FORMAT.0x01.#def
0280: 69 6e 65 20 48 45 58 5f 46 4f 52 4d 41 54 09 30  ine HEX_FORMAT.0
0290: 78 30 32 0a 23 64 65 66 69 6e 65 20 54 59 50 45  x02.#define TYPE
02a0: 5f 4d 44 09 09 30 78 31 30 0a 23 64 65 66 69 6e  _MD..0x10.#defin
02b0: 65 20 54 59 50 45 5f 48 4d 41 43 09 30 78 32 30  e TYPE_HMAC.0x20
02c0: 0a 23 64 65 66 69 6e 65 20 54 59 50 45 5f 43 4d  .#define TYPE_CM
02d0: 41 43 09 30 78 34 30 0a 0a 2f 2a 0a 20 2a 20 54  AC.0x40../*. * T
02e0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 64 65  his structure de
02f0: 66 69 6e 65 73 20 74 68 65 20 70 65 72 2d 69 6e  fines the per-in
0300: 73 74 61 6e 63 65 20 73 74 61 74 65 20 6f 66 20  stance state of 
0310: 61 20 64 69 67 65 73 74 20 6f 70 65 72 61 74 69  a digest operati
0320: 6f 6e 2e 0a 20 2a 2f 0a 74 79 70 65 64 65 66 20  on.. */.typedef 
0330: 73 74 72 75 63 74 20 44 69 67 65 73 74 53 74 61  struct DigestSta
0340: 74 65 20 7b 0a 09 54 63 6c 5f 43 68 61 6e 6e 65  te {..Tcl_Channe
0350: 6c 20 73 65 6c 66 3b 09 2f 2a 20 54 68 69 73 20  l self;./* This 
0360: 73 6f 63 6b 65 74 20 63 68 61 6e 6e 65 6c 20 2a  socket channel *
0370: 2f 0a 09 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65  /..Tcl_TimerToke
0380: 6e 20 74 69 6d 65 72 3b 09 2f 2a 20 54 69 6d 65  n timer;./* Time
0390: 72 20 66 6f 72 20 72 65 61 64 20 65 76 65 6e 74  r for read event
03a0: 73 20 2a 2f 0a 0a 09 69 6e 74 20 66 6c 61 67 73  s */...int flags
03b0: 3b 09 09 2f 2a 20 43 68 61 6e 20 63 6f 6e 66 69  ;../* Chan confi
03c0: 67 20 66 6c 61 67 73 20 2a 2f 0a 09 69 6e 74 20  g flags */..int 
03d0: 77 61 74 63 68 4d 61 73 6b 3b 09 09 2f 2a 20 43  watchMask;../* C
03e0: 75 72 72 65 6e 74 20 57 61 74 63 68 50 72 6f 63  urrent WatchProc
03f0: 20 6d 61 73 6b 20 2a 2f 0a 09 69 6e 74 20 6d 6f   mask */..int mo
0400: 64 65 3b 09 09 2f 2a 20 43 75 72 72 65 6e 74 20  de;../* Current 
0410: 6d 6f 64 65 20 6f 66 20 70 61 72 65 6e 74 20 63  mode of parent c
0420: 68 61 6e 6e 65 6c 20 2a 2f 0a 09 69 6e 74 20 66  hannel */..int f
0430: 6f 72 6d 61 74 3b 09 09 2f 2a 20 44 69 67 65 73  ormat;../* Diges
0440: 74 20 66 6f 72 6d 61 74 20 61 6e 64 20 6f 70 65  t format and ope
0450: 72 61 74 69 6f 6e 20 2a 2f 0a 0a 09 54 63 6c 5f  ration */...Tcl_
0460: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 09  Interp *interp;.
0470: 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 65 72  /* Current inter
0480: 70 72 65 74 65 72 20 2a 2f 0a 09 45 56 50 5f 4d  preter */..EVP_M
0490: 44 5f 43 54 58 20 2a 63 74 78 3b 09 2f 2a 20 4d  D_CTX *ctx;./* M
04a0: 44 20 43 6f 6e 74 65 78 74 20 2a 2f 0a 09 48 4d  D Context */..HM
04b0: 41 43 5f 43 54 58 20 2a 68 63 74 78 3b 09 09 2f  AC_CTX *hctx;../
04c0: 2a 20 48 4d 41 43 20 43 6f 6e 74 65 78 74 20 2a  * HMAC Context *
04d0: 2f 0a 09 43 4d 41 43 5f 43 54 58 20 2a 63 63 74  /..CMAC_CTX *cct
04e0: 78 3b 09 09 2f 2a 20 43 4d 41 43 20 43 6f 6e 74  x;../* CMAC Cont
04f0: 65 78 74 20 2a 2f 0a 09 54 63 6c 5f 43 6f 6d 6d  ext */..Tcl_Comm
0500: 61 6e 64 20 74 6f 6b 65 6e 3b 09 2f 2a 20 43 6f  and token;./* Co
0510: 6d 6d 61 6e 64 20 74 6f 6b 65 6e 20 2a 2f 0a 7d  mmand token */.}
0520: 20 44 69 67 65 73 74 53 74 61 74 65 3b 0a 0a 2f   DigestState;../
0530: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
0540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0570: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c  -------. *. * Tl
0580: 73 5f 44 69 67 65 73 74 4e 65 77 20 2d 2d 0a 20  s_DigestNew --. 
0590: 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69  *. *.This functi
05a0: 6f 6e 20 63 72 65 61 74 65 73 20 61 20 64 69 67  on creates a dig
05b0: 65 73 74 20 73 74 61 74 65 20 73 74 72 75 63 74  est state struct
05c0: 75 72 65 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  ure. *. * Return
05d0: 73 3a 0a 20 2a 09 44 69 67 65 73 74 20 73 74 72  s:. *.Digest str
05e0: 75 63 74 75 72 65 20 70 6f 69 6e 74 65 72 0a 20  ucture pointer. 
05f0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
0600: 73 3a 0a 20 2a 09 43 72 65 61 74 65 73 20 73 74  s:. *.Creates st
0610: 72 75 63 74 75 72 65 0a 20 2a 0a 20 2a 2d 2d 2d  ructure. *. *---
0620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0660: 0a 20 2a 2f 0a 44 69 67 65 73 74 53 74 61 74 65  . */.DigestState
0670: 20 2a 54 6c 73 5f 44 69 67 65 73 74 4e 65 77 28   *Tls_DigestNew(
0680: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
0690: 72 70 2c 20 69 6e 74 20 66 6f 72 6d 61 74 29 20  rp, int format) 
06a0: 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74  {.    DigestStat
06b0: 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 0a 20 20  e *statePtr;..  
06c0: 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 44 69    statePtr = (Di
06d0: 67 65 73 74 53 74 61 74 65 20 2a 29 20 63 6b 61  gestState *) cka
06e0: 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20  lloc((unsigned) 
06f0: 73 69 7a 65 6f 66 28 44 69 67 65 73 74 53 74 61  sizeof(DigestSta
0700: 74 65 29 29 3b 0a 20 20 20 20 69 66 20 28 73 74  te));.    if (st
0710: 61 74 65 50 74 72 20 21 3d 20 4e 55 4c 4c 29 20  atePtr != NULL) 
0720: 7b 0a 09 6d 65 6d 73 65 74 28 73 74 61 74 65 50  {..memset(stateP
0730: 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 44 69  tr, 0, sizeof(Di
0740: 67 65 73 74 53 74 61 74 65 29 29 3b 0a 09 73 74  gestState));..st
0750: 61 74 65 50 74 72 2d 3e 73 65 6c 66 09 3d 20 4e  atePtr->self.= N
0760: 55 4c 4c 3b 09 09 2f 2a 20 54 68 69 73 20 73 6f  ULL;../* This so
0770: 63 6b 65 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  cket channel */.
0780: 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72  .statePtr->timer
0790: 20 3d 20 4e 55 4c 4c 3b 09 09 2f 2a 20 54 69 6d   = NULL;../* Tim
07a0: 65 72 20 74 6f 20 66 6c 75 73 68 20 64 61 74 61  er to flush data
07b0: 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 66   */..statePtr->f
07c0: 6c 61 67 73 20 3d 20 30 3b 09 09 2f 2a 20 43 68  lags = 0;../* Ch
07d0: 61 6e 20 63 6f 6e 66 69 67 20 66 6c 61 67 73 20  an config flags 
07e0: 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 77 61  */..statePtr->wa
07f0: 74 63 68 4d 61 73 6b 20 3d 20 30 3b 09 2f 2a 20  tchMask = 0;./* 
0800: 43 75 72 72 65 6e 74 20 57 61 74 63 68 50 72 6f  Current WatchPro
0810: 63 20 6d 61 73 6b 20 2a 2f 0a 09 73 74 61 74 65  c mask */..state
0820: 50 74 72 2d 3e 6d 6f 64 65 09 3d 20 30 3b 09 09  Ptr->mode.= 0;..
0830: 2f 2a 20 43 75 72 72 65 6e 74 20 6d 6f 64 65 20  /* Current mode 
0840: 6f 66 20 70 61 72 65 6e 74 20 63 68 61 6e 6e 65  of parent channe
0850: 6c 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e  l */..statePtr->
0860: 66 6f 72 6d 61 74 20 3d 20 66 6f 72 6d 61 74 3b  format = format;
0870: 09 2f 2a 20 44 69 67 65 73 74 20 66 6f 72 6d 61  ./* Digest forma
0880: 74 20 61 6e 64 20 6f 70 65 72 61 74 69 6f 6e 20  t and operation 
0890: 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 69 6e  */..statePtr->in
08a0: 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 09 2f  terp = interp;./
08b0: 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 65 72 70  * Current interp
08c0: 72 65 74 65 72 20 2a 2f 0a 09 73 74 61 74 65 50  reter */..stateP
08d0: 74 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 09  tr->ctx = NULL;.
08e0: 09 2f 2a 20 4d 44 20 43 6f 6e 74 65 78 74 20 2a  ./* MD Context *
08f0: 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 68 63 74  /..statePtr->hct
0900: 78 20 3d 20 4e 55 4c 4c 3b 09 09 2f 2a 20 48 4d  x = NULL;../* HM
0910: 41 43 20 43 6f 6e 74 65 78 74 20 2a 2f 0a 09 73  AC Context */..s
0920: 74 61 74 65 50 74 72 2d 3e 63 63 74 78 20 3d 20  tatePtr->cctx = 
0930: 4e 55 4c 4c 3b 09 09 2f 2a 20 43 4d 41 43 20 43  NULL;../* CMAC C
0940: 6f 6e 74 65 78 74 20 2a 2f 0a 09 73 74 61 74 65  ontext */..state
0950: 50 74 72 2d 3e 74 6f 6b 65 6e 20 3d 20 4e 55 4c  Ptr->token = NUL
0960: 4c 3b 09 09 2f 2a 20 43 6f 6d 6d 61 6e 64 20 74  L;../* Command t
0970: 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  oken */.    }.  
0980: 20 20 72 65 74 75 72 6e 20 73 74 61 74 65 50 74    return statePt
0990: 72 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  r;.}../*. *-----
09a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
09e0: 2a 0a 20 2a 20 54 6c 73 5f 44 69 67 65 73 74 46  *. * Tls_DigestF
09f0: 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  ree --. *. *.Thi
0a00: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 6d 6f 76  s function remov
0a10: 65 73 20 61 20 64 69 67 65 73 74 20 73 74 61 74  es a digest stat
0a20: 65 20 73 74 72 75 63 74 75 72 65 0a 20 2a 0a 20  e structure. *. 
0a30: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 4e 6f  * Returns:. *.No
0a40: 74 68 69 6e 67 0a 20 2a 0a 20 2a 20 53 69 64 65  thing. *. * Side
0a50: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 52 65 6d   effects:. *.Rem
0a60: 6f 76 65 73 20 73 74 72 75 63 74 75 72 65 0a 20  oves structure. 
0a70: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
0a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ab0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64  -------. */.void
0ac0: 20 54 6c 73 5f 44 69 67 65 73 74 46 72 65 65 28   Tls_DigestFree(
0ad0: 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61  DigestState *sta
0ae0: 74 65 50 74 72 29 20 7b 0a 20 20 20 20 69 66 20  tePtr) {.    if 
0af0: 28 73 74 61 74 65 50 74 72 20 3d 3d 20 28 44 69  (statePtr == (Di
0b00: 67 65 73 74 53 74 61 74 65 20 2a 29 20 4e 55 4c  gestState *) NUL
0b10: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 3b 0a 20 20  L) {..return;.  
0b20: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61    }..    if (sta
0b30: 74 65 50 74 72 2d 3e 63 74 78 20 21 3d 20 28 45  tePtr->ctx != (E
0b40: 56 50 5f 4d 44 5f 43 54 58 20 2a 29 20 4e 55 4c  VP_MD_CTX *) NUL
0b50: 4c 29 20 7b 0a 09 45 56 50 5f 4d 44 5f 43 54 58  L) {..EVP_MD_CTX
0b60: 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e  _free(statePtr->
0b70: 63 74 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ctx);.    }.    
0b80: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 68 63  if (statePtr->hc
0b90: 74 78 20 21 3d 20 28 48 4d 41 43 5f 43 54 58 20  tx != (HMAC_CTX 
0ba0: 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 48 4d 41 43  *) NULL) {..HMAC
0bb0: 5f 43 54 58 5f 66 72 65 65 28 73 74 61 74 65 50  _CTX_free(stateP
0bc0: 74 72 2d 3e 68 63 74 78 29 3b 0a 20 20 20 20 7d  tr->hctx);.    }
0bd0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
0be0: 72 2d 3e 63 63 74 78 20 21 3d 20 28 43 4d 41 43  r->cctx != (CMAC
0bf0: 5f 43 54 58 20 2a 29 20 4e 55 4c 4c 29 20 7b 0a  _CTX *) NULL) {.
0c00: 09 43 4d 41 43 5f 43 54 58 5f 66 72 65 65 28 73  .CMAC_CTX_free(s
0c10: 74 61 74 65 50 74 72 2d 3e 63 63 74 78 29 3b 0a  tatePtr->cctx);.
0c20: 20 20 20 20 7d 0a 20 20 20 20 63 6b 66 72 65 65      }.    ckfree
0c30: 28 73 74 61 74 65 50 74 72 29 3b 0a 7d 0a 0a 2f  (statePtr);.}../
0c40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0c50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0c60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0c70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0c80: 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ***/../*. *-----
0c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
0cd0: 2a 0a 20 2a 20 54 6c 73 5f 44 69 67 65 73 74 49  *. * Tls_DigestI
0ce0: 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 49 6e 69  nit --. *. *.Ini
0cf0: 74 69 61 6c 69 7a 65 20 61 20 68 61 73 68 20 66  tialize a hash f
0d00: 75 6e 63 74 69 6f 6e 0a 20 2a 0a 20 2a 20 52 65  unction. *. * Re
0d10: 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b  turns:. *.TCL_OK
0d20: 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f   if successful o
0d30: 72 20 54 43 4c 5f 45 52 52 4f 52 20 66 6f 72 20  r TCL_ERROR for 
0d40: 66 61 69 6c 75 72 65 20 77 69 74 68 20 72 65 73  failure with res
0d50: 75 6c 74 20 73 65 74 0a 20 2a 09 74 6f 20 65 72  ult set. *.to er
0d60: 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a  ror message.. *.
0d70: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
0d80: 0a 20 2a 09 4e 6f 20 72 65 73 75 6c 74 20 6f 72  . *.No result or
0d90: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20   error message. 
0da0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
0db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0de0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20  -------. */.int 
0df0: 54 6c 73 5f 44 69 67 65 73 74 49 6e 69 74 28 54  Tls_DigestInit(T
0e00: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
0e10: 70 2c 20 44 69 67 65 73 74 53 74 61 74 65 20 2a  p, DigestState *
0e20: 73 74 61 74 65 50 74 72 2c 20 63 6f 6e 73 74 20  statePtr, const 
0e30: 45 56 50 5f 4d 44 20 2a 6d 64 2c 0a 09 63 6f 6e  EVP_MD *md,..con
0e40: 73 74 20 45 56 50 5f 43 49 50 48 45 52 20 2a 63  st EVP_CIPHER *c
0e50: 69 70 68 65 72 2c 20 54 63 6c 5f 4f 62 6a 20 2a  ipher, Tcl_Obj *
0e60: 6b 65 79 4f 62 6a 29 20 7b 0a 20 20 20 20 69 6e  keyObj) {.    in
0e70: 74 20 6b 65 79 5f 6c 65 6e 20 3d 20 30 2c 20 72  t key_len = 0, r
0e80: 65 73 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  es = 0;.    cons
0e90: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
0ea0: 2a 6b 65 79 3b 0a 0a 20 20 20 20 2f 2a 20 43 72  *key;..    /* Cr
0eb0: 65 61 74 65 20 6d 65 73 73 61 67 65 20 64 69 67  eate message dig
0ec0: 65 73 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  est context */. 
0ed0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
0ee0: 3e 66 6f 72 6d 61 74 20 26 20 54 59 50 45 5f 4d  >format & TYPE_M
0ef0: 44 29 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e  D) {..statePtr->
0f00: 63 74 78 20 3d 20 45 56 50 5f 4d 44 5f 43 54 58  ctx = EVP_MD_CTX
0f10: 5f 6e 65 77 28 29 3b 0a 09 72 65 73 20 3d 20 28  _new();..res = (
0f20: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 21 3d  statePtr->ctx !=
0f30: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 20 65 6c   NULL);.    } el
0f40: 73 65 20 69 66 20 28 73 74 61 74 65 50 74 72 2d  se if (statePtr-
0f50: 3e 66 6f 72 6d 61 74 20 26 20 54 59 50 45 5f 48  >format & TYPE_H
0f60: 4d 41 43 29 20 7b 0a 09 73 74 61 74 65 50 74 72  MAC) {..statePtr
0f70: 2d 3e 68 63 74 78 20 3d 20 48 4d 41 43 5f 43 54  ->hctx = HMAC_CT
0f80: 58 5f 6e 65 77 28 29 3b 0a 09 72 65 73 20 3d 20  X_new();..res = 
0f90: 28 73 74 61 74 65 50 74 72 2d 3e 68 63 74 78 20  (statePtr->hctx 
0fa0: 21 3d 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 20  != NULL);.    } 
0fb0: 65 6c 73 65 20 69 66 20 28 73 74 61 74 65 50 74  else if (statePt
0fc0: 72 2d 3e 66 6f 72 6d 61 74 20 26 20 54 59 50 45  r->format & TYPE
0fd0: 5f 43 4d 41 43 29 20 7b 0a 09 73 74 61 74 65 50  _CMAC) {..stateP
0fe0: 74 72 2d 3e 63 63 74 78 20 3d 20 43 4d 41 43 5f  tr->cctx = CMAC_
0ff0: 43 54 58 5f 6e 65 77 28 29 3b 0a 09 72 65 73 20  CTX_new();..res 
1000: 3d 20 28 73 74 61 74 65 50 74 72 2d 3e 63 63 74  = (statePtr->cct
1010: 78 20 21 3d 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  x != NULL);.    
1020: 7d 0a 20 20 20 20 69 66 20 28 21 72 65 73 29 20  }.    if (!res) 
1030: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
1040: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 72 65  ult(interp, "Cre
1050: 61 74 65 20 63 6f 6e 74 65 78 74 20 66 61 69 6c  ate context fail
1060: 65 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c  ed: ", REASON(),
1070: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
1080: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
1090: 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  ..    /* Initial
10a0: 69 7a 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f  ize hash functio
10b0: 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61  n */.    if (sta
10c0: 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20  tePtr->format & 
10d0: 54 59 50 45 5f 4d 44 29 20 7b 0a 09 72 65 73 20  TYPE_MD) {..res 
10e0: 3d 20 45 56 50 5f 44 69 67 65 73 74 49 6e 69 74  = EVP_DigestInit
10f0: 5f 65 78 28 73 74 61 74 65 50 74 72 2d 3e 63 74  _ex(statePtr->ct
1100: 78 2c 20 6d 64 2c 20 4e 55 4c 4c 29 3b 0a 20 20  x, md, NULL);.  
1110: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 61    } else if (sta
1120: 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20  tePtr->format & 
1130: 54 59 50 45 5f 48 4d 41 43 29 20 7b 0a 09 6b 65  TYPE_HMAC) {..ke
1140: 79 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41  y = Tcl_GetByteA
1150: 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6b 65 79 4f  rrayFromObj(keyO
1160: 62 6a 2c 20 26 6b 65 79 5f 6c 65 6e 29 3b 0a 09  bj, &key_len);..
1170: 72 65 73 20 3d 20 48 4d 41 43 5f 49 6e 69 74 5f  res = HMAC_Init_
1180: 65 78 28 73 74 61 74 65 50 74 72 2d 3e 68 63 74  ex(statePtr->hct
1190: 78 2c 20 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a  x, (const void *
11a0: 29 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 2c 20  ) key, key_len, 
11b0: 6d 64 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d  md, NULL);.    }
11c0: 20 65 6c 73 65 20 69 66 20 28 73 74 61 74 65 50   else if (stateP
11d0: 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20 54 59 50  tr->format & TYP
11e0: 45 5f 43 4d 41 43 29 20 7b 0a 09 6b 65 79 20 3d  E_CMAC) {..key =
11f0: 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61   Tcl_GetByteArra
1200: 79 46 72 6f 6d 4f 62 6a 28 6b 65 79 4f 62 6a 2c  yFromObj(keyObj,
1210: 20 26 6b 65 79 5f 6c 65 6e 29 3b 0a 09 72 65 73   &key_len);..res
1220: 20 3d 20 43 4d 41 43 5f 49 6e 69 74 28 73 74 61   = CMAC_Init(sta
1230: 74 65 50 74 72 2d 3e 63 63 74 78 2c 20 28 63 6f  tePtr->cctx, (co
1240: 6e 73 74 20 76 6f 69 64 20 2a 29 20 6b 65 79 2c  nst void *) key,
1250: 20 6b 65 79 5f 6c 65 6e 2c 20 63 69 70 68 65 72   key_len, cipher
1260: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20  , NULL);.    }. 
1270: 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 0a 09     if (!res) {..
1280: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1290: 28 69 6e 74 65 72 70 2c 20 22 49 6e 69 74 69 61  (interp, "Initia
12a0: 6c 69 7a 65 20 66 61 69 6c 65 64 3a 20 22 2c 20  lize failed: ", 
12b0: 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b  REASON(), NULL);
12c0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
12d0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  OR;.    }.    re
12e0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
12f0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
1300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1330: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
1340: 6c 73 5f 44 69 67 65 73 74 55 70 64 61 74 65 20  ls_DigestUpdate 
1350: 2d 2d 0a 20 2a 0a 20 2a 09 55 70 64 61 74 65 20  --. *. *.Update 
1360: 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 0a  a hash function.
1370: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20   *. * Returns:. 
1380: 2a 09 31 20 69 66 20 73 75 63 63 65 73 73 66 75  *.1 if successfu
1390: 6c 20 6f 72 20 30 20 66 6f 72 20 66 61 69 6c 75  l or 0 for failu
13a0: 72 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  re. *. * Side ef
13b0: 66 65 63 74 73 3a 0a 20 2a 09 41 64 64 73 20 62  fects:. *.Adds b
13c0: 75 66 20 74 6f 20 68 61 73 68 20 66 75 6e 63 74  uf to hash funct
13d0: 69 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ion. *. *-------
13e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
1420: 0a 69 6e 74 20 54 6c 73 5f 44 69 67 65 73 74 55  .int Tls_DigestU
1430: 70 64 61 74 65 28 44 69 67 65 73 74 53 74 61 74  pdate(DigestStat
1440: 65 20 2a 73 74 61 74 65 50 74 72 2c 20 63 68 61  e *statePtr, cha
1450: 72 20 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20 72  r *buf, size_t r
1460: 65 61 64 2c 20 69 6e 74 20 64 6f 5f 72 65 73 75  ead, int do_resu
1470: 6c 74 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 65  lt) {.    int re
1480: 73 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 20 28  s = 0;..    if (
1490: 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74  statePtr->format
14a0: 20 26 20 54 59 50 45 5f 4d 44 29 20 7b 0a 09 72   & TYPE_MD) {..r
14b0: 65 73 20 3d 20 45 56 50 5f 44 69 67 65 73 74 55  es = EVP_DigestU
14c0: 70 64 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e  pdate(statePtr->
14d0: 63 74 78 2c 20 62 75 66 2c 20 72 65 61 64 29 3b  ctx, buf, read);
14e0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
14f0: 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74  statePtr->format
1500: 20 26 20 54 59 50 45 5f 48 4d 41 43 29 20 7b 0a   & TYPE_HMAC) {.
1510: 09 72 65 73 20 3d 20 48 4d 41 43 5f 55 70 64 61  .res = HMAC_Upda
1520: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 68 63 74  te(statePtr->hct
1530: 78 2c 20 62 75 66 2c 20 72 65 61 64 29 3b 0a 20  x, buf, read);. 
1540: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
1550: 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26  atePtr->format &
1560: 20 54 59 50 45 5f 43 4d 41 43 29 20 7b 0a 09 72   TYPE_CMAC) {..r
1570: 65 73 20 3d 20 43 4d 41 43 5f 55 70 64 61 74 65  es = CMAC_Update
1580: 28 73 74 61 74 65 50 74 72 2d 3e 63 63 74 78 2c  (statePtr->cctx,
1590: 20 62 75 66 2c 20 72 65 61 64 29 3b 0a 20 20 20   buf, read);.   
15a0: 20 7d 0a 20 20 20 20 69 66 20 28 21 72 65 73 20   }.    if (!res 
15b0: 26 26 20 64 6f 5f 72 65 73 75 6c 74 29 20 7b 0a  && do_result) {.
15c0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
15d0: 74 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  t(statePtr->inte
15e0: 72 70 2c 20 22 55 70 64 61 74 65 20 66 61 69 6c  rp, "Update fail
15f0: 65 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c  ed: ", REASON(),
1600: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
1610: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
1620: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b  .    return res;
1630: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
1640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1660: 2d 2d 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 0a 20 2a 0a  ------------. *.
1680: 20 2a 20 54 6c 73 5f 44 69 67 65 73 74 46 69 6e   * Tls_DigestFin
1690: 69 61 6c 69 7a 65 20 2d 2d 0a 20 2a 0a 20 2a 09  ialize --. *. *.
16a0: 46 69 6e 61 6c 69 7a 65 20 61 20 68 61 73 68 20  Finalize a hash 
16b0: 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 67 65 6e  function and gen
16c0: 65 72 61 74 65 20 61 20 6d 65 73 73 61 67 65 20  erate a message 
16d0: 64 69 67 65 73 74 0a 20 2a 0a 20 2a 20 52 65 74  digest. *. * Ret
16e0: 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20  urns:. *.TCL_OK 
16f0: 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72  if successful or
1700: 20 54 43 4c 5f 45 52 52 4f 52 20 66 6f 72 20 66   TCL_ERROR for f
1710: 61 69 6c 75 72 65 20 77 69 74 68 20 72 65 73 75  ailure with resu
1720: 6c 74 20 73 65 74 0a 20 2a 09 74 6f 20 65 72 72  lt set. *.to err
1730: 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20  or message.. *. 
1740: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
1750: 20 2a 09 53 65 74 73 20 72 65 73 75 6c 74 20 74   *.Sets result t
1760: 6f 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74  o message digest
1770: 20 66 6f 72 20 68 61 73 68 20 66 75 6e 63 74 69   for hash functi
1780: 6f 6e 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 6d  on or an error m
1790: 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d  essage.. *. *---
17a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17e0: 0a 20 2a 2f 0a 69 6e 74 20 54 6c 73 5f 44 69 67  . */.int Tls_Dig
17f0: 65 73 74 46 69 6e 69 61 6c 69 7a 65 28 54 63 6c  estFinialize(Tcl
1800: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1810: 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74   DigestState *st
1820: 61 74 65 50 74 72 29 20 7b 0a 20 20 20 20 75 6e  atePtr) {.    un
1830: 73 69 67 6e 65 64 20 63 68 61 72 20 6d 64 5f 62  signed char md_b
1840: 75 66 5b 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49  uf[EVP_MAX_MD_SI
1850: 5a 45 5d 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  ZE];.    unsigne
1860: 64 20 69 6e 74 20 6d 64 5f 6c 65 6e 3b 0a 20 20  d int md_len;.  
1870: 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 0a    int res = 0;..
1880: 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20      /* Finalize 
1890: 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 61 6e  hash function an
18a0: 64 20 63 61 6c 63 75 6c 61 74 65 20 6d 65 73 73  d calculate mess
18b0: 61 67 65 20 64 69 67 65 73 74 20 2a 2f 0a 20 20  age digest */.  
18c0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
18d0: 66 6f 72 6d 61 74 20 26 20 54 59 50 45 5f 4d 44  format & TYPE_MD
18e0: 29 20 7b 0a 09 72 65 73 20 3d 20 45 56 50 5f 44  ) {..res = EVP_D
18f0: 69 67 65 73 74 46 69 6e 61 6c 5f 65 78 28 73 74  igestFinal_ex(st
1900: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 6d 64 5f  atePtr->ctx, md_
1910: 62 75 66 2c 20 26 6d 64 5f 6c 65 6e 29 3b 0a 20  buf, &md_len);. 
1920: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
1930: 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26  atePtr->format &
1940: 20 54 59 50 45 5f 48 4d 41 43 29 20 7b 0a 09 72   TYPE_HMAC) {..r
1950: 65 73 20 3d 20 48 4d 41 43 5f 46 69 6e 61 6c 28  es = HMAC_Final(
1960: 73 74 61 74 65 50 74 72 2d 3e 68 63 74 78 2c 20  statePtr->hctx, 
1970: 6d 64 5f 62 75 66 2c 20 26 6d 64 5f 6c 65 6e 29  md_buf, &md_len)
1980: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ;.    } else if 
1990: 28 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61  (statePtr->forma
19a0: 74 20 26 20 54 59 50 45 5f 43 4d 41 43 29 20 7b  t & TYPE_CMAC) {
19b0: 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 3b 0a 09 72  ..size_t len;..r
19c0: 65 73 20 3d 20 43 4d 41 43 5f 46 69 6e 61 6c 28  es = CMAC_Final(
19d0: 73 74 61 74 65 50 74 72 2d 3e 63 63 74 78 2c 20  statePtr->cctx, 
19e0: 6d 64 5f 62 75 66 2c 20 26 6c 65 6e 29 3b 0a 09  md_buf, &len);..
19f0: 6d 64 5f 6c 65 6e 20 3d 20 28 75 6e 73 69 67 6e  md_len = (unsign
1a00: 65 64 20 69 6e 74 29 20 6c 65 6e 3b 0a 20 20 20  ed int) len;.   
1a10: 20 7d 0a 20 20 20 20 69 66 20 28 21 72 65 73 29   }.    if (!res)
1a20: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
1a30: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 46 69  sult(interp, "Fi
1a40: 6e 61 6c 69 7a 65 20 66 61 69 6c 65 64 3a 20 22  nalize failed: "
1a50: 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c  , REASON(), NULL
1a60: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
1a70: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
1a80: 20 2f 2a 20 52 65 74 75 72 6e 20 6d 65 73 73 61   /* Return messa
1a90: 67 65 20 64 69 67 65 73 74 20 61 73 20 65 69 74  ge digest as eit
1aa0: 68 65 72 20 61 20 62 69 6e 61 72 79 20 6f 72 20  her a binary or 
1ab0: 68 65 78 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  hex string */.  
1ac0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
1ad0: 66 6f 72 6d 61 74 20 26 20 42 49 4e 5f 46 4f 52  format & BIN_FOR
1ae0: 4d 41 54 29 20 7b 0a 09 54 63 6c 5f 53 65 74 4f  MAT) {..Tcl_SetO
1af0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
1b00: 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
1b10: 79 4f 62 6a 28 6d 64 5f 62 75 66 2c 20 6d 64 5f  yObj(md_buf, md_
1b20: 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c  len));..    } el
1b30: 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72  se {..Tcl_Obj *r
1b40: 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e  esultObj = Tcl_N
1b50: 65 77 4f 62 6a 28 29 3b 0a 09 75 6e 73 69 67 6e  ewObj();..unsign
1b60: 65 64 20 63 68 61 72 20 2a 70 74 72 20 3d 20 54  ed char *ptr = T
1b70: 63 6c 5f 53 65 74 42 79 74 65 41 72 72 61 79 4c  cl_SetByteArrayL
1b80: 65 6e 67 74 68 28 72 65 73 75 6c 74 4f 62 6a 2c  ength(resultObj,
1b90: 20 6d 64 5f 6c 65 6e 2a 32 29 3b 0a 0a 09 66 6f   md_len*2);...fo
1ba0: 72 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  r (unsigned int 
1bb0: 69 20 3d 20 30 3b 20 69 20 3c 20 6d 64 5f 6c 65  i = 0; i < md_le
1bc0: 6e 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 2a  n; i++) {..    *
1bd0: 70 74 72 2b 2b 20 3d 20 68 65 78 5b 28 6d 64 5f  ptr++ = hex[(md_
1be0: 62 75 66 5b 69 5d 20 3e 3e 20 34 29 20 26 20 30  buf[i] >> 4) & 0
1bf0: 78 30 46 5d 3b 0a 09 20 20 20 20 2a 70 74 72 2b  x0F];..    *ptr+
1c00: 2b 20 3d 20 68 65 78 5b 6d 64 5f 62 75 66 5b 69  + = hex[md_buf[i
1c10: 5d 20 26 20 30 78 30 46 5d 3b 0a 09 7d 0a 09 54  ] & 0x0F];..}..T
1c20: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1c30: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
1c40: 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  j);.    }.    re
1c50: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1c60: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
1c70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ca0: 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  ****/../*. *----
1cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1cf0: 20 2a 0a 20 2a 20 44 69 67 65 73 74 42 6c 6f 63   *. * DigestBloc
1d00: 6b 4d 6f 64 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a  kModeProc --. *.
1d10: 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e   *.This function
1d20: 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 74   is invoked by t
1d30: 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c 65  he generic IO le
1d40: 76 65 6c 0a 20 2a 09 74 6f 20 73 65 74 20 62 6c  vel. *.to set bl
1d50: 6f 63 6b 69 6e 67 20 61 6e 64 20 6e 6f 6e 62 6c  ocking and nonbl
1d60: 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 2e 0a 20 2a  ocking modes.. *
1d70: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09  . * Returns:. *.
1d80: 30 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20  0 if successful 
1d90: 6f 72 20 50 4f 53 49 58 20 65 72 72 6f 72 20 63  or POSIX error c
1da0: 6f 64 65 20 69 66 20 66 61 69 6c 65 64 2e 0a 20  ode if failed.. 
1db0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
1dc0: 73 3a 0a 20 2a 09 53 65 74 73 20 74 68 65 20 64  s:. *.Sets the d
1dd0: 65 76 69 63 65 20 69 6e 74 6f 20 62 6c 6f 63 6b  evice into block
1de0: 69 6e 67 20 6f 72 20 6e 6f 6e 62 6c 6f 63 6b 69  ing or nonblocki
1df0: 6e 67 20 6d 6f 64 65 2e 0a 20 2a 09 43 61 6e 20  ng mode.. *.Can 
1e00: 63 61 6c 6c 20 54 63 6c 5f 53 65 74 43 68 61 6e  call Tcl_SetChan
1e10: 6e 65 6c 45 72 72 6f 72 2e 0a 20 2a 0a 20 2a 2d  nelError.. *. *-
1e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e60: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
1e70: 74 20 44 69 67 65 73 74 42 6c 6f 63 6b 4d 6f 64  t DigestBlockMod
1e80: 65 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61  eProc(ClientData
1e90: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e 74   clientData, int
1ea0: 20 6d 6f 64 65 29 20 7b 0a 20 20 20 20 44 69 67   mode) {.    Dig
1eb0: 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50  estState *stateP
1ec0: 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 74  tr = (DigestStat
1ed0: 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b  e *) clientData;
1ee0: 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 20 3d  ..    if (mode =
1ef0: 3d 20 54 43 4c 5f 4d 4f 44 45 5f 4e 4f 4e 42 4c  = TCL_MODE_NONBL
1f00: 4f 43 4b 49 4e 47 29 20 7b 0a 09 73 74 61 74 65  OCKING) {..state
1f10: 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c  Ptr->flags |= TL
1f20: 53 5f 54 43 4c 5f 41 53 59 4e 43 3b 0a 20 20 20  S_TCL_ASYNC;.   
1f30: 20 7d 20 65 6c 73 65 20 7b 0a 09 73 74 61 74 65   } else {..state
1f40: 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28  Ptr->flags &= ~(
1f50: 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29 3b 0a  TLS_TCL_ASYNC);.
1f60: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
1f70: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d   0;.}../*. *----
1f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1fc0: 20 2a 0a 20 2a 20 44 69 67 65 73 74 43 6c 6f 73   *. * DigestClos
1fd0: 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54  eProc --. *. *.T
1fe0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1ff0: 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 67  invoked by the g
2000: 65 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 6c 20  eneric IO level 
2010: 74 6f 20 70 65 72 66 6f 72 6d 0a 20 2a 09 63 68  to perform. *.ch
2020: 61 6e 6e 65 6c 2d 74 79 70 65 2d 73 70 65 63 69  annel-type-speci
2030: 66 69 63 20 63 6c 65 61 6e 75 70 20 77 68 65 6e  fic cleanup when
2040: 20 63 68 61 6e 6e 65 6c 20 69 73 20 63 6c 6f 73   channel is clos
2050: 65 64 2e 20 41 6c 6c 0a 20 2a 09 71 75 65 75 65  ed. All. *.queue
2060: 64 20 6f 75 74 70 75 74 20 69 73 20 66 6c 75 73  d output is flus
2070: 68 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  hed prior to cal
2080: 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
2090: 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  on.. *. * Return
20a0: 73 3a 0a 20 2a 09 30 20 69 66 20 73 75 63 63 65  s:. *.0 if succe
20b0: 73 73 66 75 6c 20 6f 72 20 50 4f 53 49 58 20 65  ssful or POSIX e
20c0: 72 72 6f 72 20 63 6f 64 65 20 69 66 20 66 61 69  rror code if fai
20d0: 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  led.. *. * Side 
20e0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 57 72 69 74  effects:. *.Writ
20f0: 65 73 20 64 69 67 65 73 74 20 74 6f 20 6f 75 74  es digest to out
2100: 70 75 74 20 61 6e 64 20 63 6c 6f 73 65 73 20 74  put and closes t
2110: 68 65 20 63 68 61 6e 6e 65 6c 2e 20 53 74 6f 72  he channel. Stor
2120: 65 73 20 65 72 72 6f 72 0a 20 2a 09 6d 65 73 73  es error. *.mess
2130: 61 67 65 73 20 69 6e 20 69 6e 74 65 72 70 20 72  ages in interp r
2140: 65 73 75 6c 74 20 75 73 69 6e 67 20 54 63 6c 5f  esult using Tcl_
2150: 47 65 74 43 68 61 6e 6e 65 6c 45 72 72 6f 72 49  GetChannelErrorI
2160: 6e 74 65 72 70 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  nterp.. *. *----
2170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
21b0: 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 43 6c   */.int DigestCl
21c0: 6f 73 65 50 72 6f 63 28 43 6c 69 65 6e 74 44 61  oseProc(ClientDa
21d0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
21e0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
21f0: 70 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53  p) {.    DigestS
2200: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
2210: 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 29   (DigestState *)
2220: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20   clientData;..  
2230: 20 20 2f 2a 20 43 61 6e 63 65 6c 20 61 63 74 69    /* Cancel acti
2240: 76 65 20 74 69 6d 65 72 2c 20 69 66 20 61 6e 79  ve timer, if any
2250: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74   */.    if (stat
2260: 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28  ePtr->timer != (
2270: 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20  Tcl_TimerToken) 
2280: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c  NULL) {..Tcl_Del
2290: 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28  eteTimerHandler(
22a0: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29  statePtr->timer)
22b0: 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d  ;..statePtr->tim
22c0: 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54  er = (Tcl_TimerT
22d0: 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 20 20 20 20  oken) NULL;.    
22e0: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 6e 2d  }..    /* Clean-
22f0: 75 70 20 2a 2f 0a 20 20 20 20 54 6c 73 5f 44 69  up */.    Tls_Di
2300: 67 65 73 74 46 72 65 65 28 73 74 61 74 65 50 74  gestFree(statePt
2310: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  r);.    return 0
2320: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 61 6d 65 20  ;.}../*. * Same 
2330: 61 73 20 44 69 67 65 73 74 43 6c 6f 73 65 50 72  as DigestClosePr
2340: 6f 63 20 62 75 74 20 77 69 74 68 20 69 6e 64 69  oc but with indi
2350: 76 69 64 75 61 6c 20 72 65 61 64 20 61 6e 64 20  vidual read and 
2360: 77 72 69 74 65 20 63 6c 6f 73 65 20 63 6f 6e 74  write close cont
2370: 72 6f 6c 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  rol. */.static i
2380: 6e 74 20 44 69 67 65 73 74 43 6c 6f 73 65 32 50  nt DigestClose2P
2390: 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69  roc(ClientData i
23a0: 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 54 63 6c  nstanceData, Tcl
23b0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
23c0: 20 69 6e 74 20 66 6c 61 67 73 29 20 7b 0a 0a 20   int flags) {.. 
23d0: 20 20 20 69 66 20 28 28 66 6c 61 67 73 20 26 20     if ((flags & 
23e0: 28 54 43 4c 5f 43 4c 4f 53 45 5f 52 45 41 44 20  (TCL_CLOSE_READ 
23f0: 7c 20 54 43 4c 5f 43 4c 4f 53 45 5f 57 52 49 54  | TCL_CLOSE_WRIT
2400: 45 29 29 20 3d 3d 20 30 29 20 7b 0a 09 72 65 74  E)) == 0) {..ret
2410: 75 72 6e 20 44 69 67 65 73 74 43 6c 6f 73 65 50  urn DigestCloseP
2420: 72 6f 63 28 69 6e 73 74 61 6e 63 65 44 61 74 61  roc(instanceData
2430: 2c 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 7d  , interp);.    }
2440: 0a 20 20 20 20 72 65 74 75 72 6e 20 45 49 4e 56  .    return EINV
2450: 41 4c 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  AL;.}../*. *----
2460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24a0: 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 49  --. *. * DigestI
24b0: 6e 70 75 74 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20  nputProc --. *. 
24c0: 2a 09 43 61 6c 6c 65 64 20 62 79 20 74 68 65 20  *.Called by the 
24d0: 67 65 6e 65 72 69 63 20 49 4f 20 73 79 73 74 65  generic IO syste
24e0: 6d 20 74 6f 20 72 65 61 64 20 64 61 74 61 20 66  m to read data f
24f0: 72 6f 6d 20 74 72 61 6e 73 66 6f 72 6d 20 61 6e  rom transform an
2500: 64 0a 20 2a 09 70 6c 61 63 65 20 69 6e 20 62 75  d. *.place in bu
2510: 66 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73  f.. *. * Returns
2520: 3a 0a 20 2a 09 54 6f 74 61 6c 20 62 79 74 65 73  :. *.Total bytes
2530: 20 72 65 61 64 20 6f 72 20 2d 31 20 66 6f 72 20   read or -1 for 
2540: 61 6e 20 65 72 72 6f 72 20 61 6c 6f 6e 67 20 77  an error along w
2550: 69 74 68 20 61 20 50 4f 53 49 58 20 65 72 72 6f  ith a POSIX erro
2560: 72 0a 20 2a 09 63 6f 64 65 20 69 6e 20 65 72 72  r. *.code in err
2570: 6f 72 43 6f 64 65 50 74 72 2e 20 55 73 65 20 45  orCodePtr. Use E
2580: 41 47 41 49 4e 20 66 6f 72 20 6e 6f 6e 62 6c 6f  AGAIN for nonblo
2590: 63 6b 69 6e 67 20 61 6e 64 20 6e 6f 20 64 61 74  cking and no dat
25a0: 61 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  a.. *. * Side ef
25b0: 66 65 63 74 73 3a 0a 20 2a 09 52 65 61 64 20 64  fects:. *.Read d
25c0: 61 74 61 20 66 72 6f 6d 20 74 72 61 6e 73 66 6f  ata from transfo
25d0: 72 6d 20 61 6e 64 20 77 72 69 74 65 20 74 6f 20  rm and write to 
25e0: 62 75 66 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  buf. *. *-------
25f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2630: 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 49 6e   */.int DigestIn
2640: 70 75 74 50 72 6f 63 28 43 6c 69 65 6e 74 44 61  putProc(ClientDa
2650: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 63  ta clientData, c
2660: 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 74 6f  har *buf, int to
2670: 52 65 61 64 2c 20 69 6e 74 20 2a 65 72 72 6f 72  Read, int *error
2680: 43 6f 64 65 50 74 72 29 20 7b 0a 20 20 20 20 44  CodePtr) {.    D
2690: 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74  igestState *stat
26a0: 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74  ePtr = (DigestSt
26b0: 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74  ate *) clientDat
26c0: 61 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e  a;.    Tcl_Chann
26d0: 65 6c 20 70 61 72 65 6e 74 3b 0a 20 20 20 20 69  el parent;.    i
26e0: 6e 74 20 72 65 61 64 2c 20 72 65 73 20 3d 20 30  nt read, res = 0
26f0: 3b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65  ;.    *errorCode
2700: 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  Ptr = 0;..    /*
2710: 20 41 62 6f 72 74 20 69 66 20 6e 6f 74 68 69 6e   Abort if nothin
2720: 67 20 74 6f 20 70 72 6f 63 65 73 73 20 2a 2f 0a  g to process */.
2730: 20 20 20 20 69 66 20 28 74 6f 52 65 61 64 20 3c      if (toRead <
2740: 3d 20 30 20 7c 7c 20 73 74 61 74 65 50 74 72 2d  = 0 || statePtr-
2750: 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68  >self == (Tcl_Ch
2760: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
2770: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
2780: 0a 20 20 20 20 2f 2a 20 47 65 74 20 62 79 74 65  .    /* Get byte
2790: 73 20 66 72 6f 6d 20 75 6e 64 65 72 6c 79 69 6e  s from underlyin
27a0: 67 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20  g channel */.   
27b0: 20 70 61 72 65 6e 74 20 3d 20 54 63 6c 5f 47 65   parent = Tcl_Ge
27c0: 74 53 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28  tStackedChannel(
27d0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b  statePtr->self);
27e0: 0a 20 20 20 20 72 65 61 64 20 3d 20 54 63 6c 5f  .    read = Tcl_
27f0: 52 65 61 64 52 61 77 28 70 61 72 65 6e 74 2c 20  ReadRaw(parent, 
2800: 62 75 66 2c 20 74 6f 52 65 61 64 29 3b 0a 0a 20  buf, toRead);.. 
2810: 20 20 20 2f 2a 20 55 70 64 61 74 65 20 68 61 73     /* Update has
2820: 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  h function */.  
2830: 20 20 69 66 20 28 72 65 61 64 20 3e 20 30 29 20    if (read > 0) 
2840: 7b 0a 09 69 66 20 28 21 54 6c 73 5f 44 69 67 65  {..if (!Tls_Dige
2850: 73 74 55 70 64 61 74 65 28 73 74 61 74 65 50 74  stUpdate(statePt
2860: 72 2c 20 62 75 66 2c 20 28 73 69 7a 65 5f 74 29  r, buf, (size_t)
2870: 20 72 65 61 64 2c 20 30 29 29 20 7b 0a 09 20 20   read, 0)) {..  
2880: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c    Tcl_SetChannel
2890: 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2d 3e  Error(statePtr->
28a0: 73 65 6c 66 2c 20 54 63 6c 5f 4f 62 6a 50 72 69  self, Tcl_ObjPri
28b0: 6e 74 66 28 22 55 70 64 61 74 65 20 66 61 69 6c  ntf("Update fail
28c0: 65 64 3a 20 25 73 22 2c 20 52 45 41 53 4f 4e 28  ed: %s", REASON(
28d0: 29 29 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72  )));..    *error
28e0: 43 6f 64 65 50 74 72 20 3d 20 45 49 4e 56 41 4c  CodePtr = EINVAL
28f0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31  ;..    return -1
2900: 3b 0a 09 7d 0a 09 2f 2a 20 54 68 69 73 20 69 73  ;..}../* This is
2910: 20 63 6f 72 72 65 63 74 20 2a 2f 0a 09 72 65 61   correct */..rea
2920: 64 20 3d 20 2d 31 3b 0a 09 2a 65 72 72 6f 72 43  d = -1;..*errorC
2930: 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b  odePtr = EAGAIN;
2940: 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
2950: 28 72 65 61 64 20 3c 20 30 29 20 7b 0a 09 2f 2a  (read < 0) {../*
2960: 20 45 72 72 6f 72 20 2a 2f 0a 09 2a 65 72 72 6f   Error */..*erro
2970: 72 43 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f 47  rCodePtr = Tcl_G
2980: 65 74 45 72 72 6e 6f 28 29 3b 0a 0a 20 20 20 20  etErrno();..    
2990: 7d 20 65 6c 73 65 20 69 66 20 28 21 28 73 74 61  } else if (!(sta
29a0: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 43  tePtr->flags & C
29b0: 48 41 4e 5f 45 4f 46 29 29 20 7b 0a 09 2f 2a 20  HAN_EOF)) {../* 
29c0: 45 4f 46 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64  EOF */..unsigned
29d0: 20 63 68 61 72 20 6d 64 5f 62 75 66 5b 45 56 50   char md_buf[EVP
29e0: 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45 5d 3b 0a 09  _MAX_MD_SIZE];..
29f0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6d 64 5f  unsigned int md_
2a00: 6c 65 6e 20 3d 20 30 3b 0a 0a 09 2f 2a 20 46 69  len = 0;.../* Fi
2a10: 6e 61 6c 69 7a 65 20 68 61 73 68 20 66 75 6e 63  nalize hash func
2a20: 74 69 6f 6e 20 61 6e 64 20 63 61 6c 63 75 6c 61  tion and calcula
2a30: 74 65 20 6d 65 73 73 61 67 65 20 64 69 67 65 73  te message diges
2a40: 74 20 2a 2f 0a 09 69 66 20 28 73 74 61 74 65 50  t */..if (stateP
2a50: 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20 54 59 50  tr->format & TYP
2a60: 45 5f 4d 44 29 20 7b 0a 09 20 20 20 20 72 65 73  E_MD) {..    res
2a70: 20 3d 20 45 56 50 5f 44 69 67 65 73 74 46 69 6e   = EVP_DigestFin
2a80: 61 6c 5f 65 78 28 73 74 61 74 65 50 74 72 2d 3e  al_ex(statePtr->
2a90: 63 74 78 2c 20 6d 64 5f 62 75 66 2c 20 26 6d 64  ctx, md_buf, &md
2aa0: 5f 6c 65 6e 29 3b 0a 09 7d 20 65 6c 73 65 20 69  _len);..} else i
2ab0: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6f 72  f (statePtr->for
2ac0: 6d 61 74 20 26 20 54 59 50 45 5f 48 4d 41 43 29  mat & TYPE_HMAC)
2ad0: 20 7b 0a 09 20 20 20 20 72 65 73 20 3d 20 48 4d   {..    res = HM
2ae0: 41 43 5f 46 69 6e 61 6c 28 73 74 61 74 65 50 74  AC_Final(statePt
2af0: 72 2d 3e 68 63 74 78 2c 20 6d 64 5f 62 75 66 2c  r->hctx, md_buf,
2b00: 20 26 6d 64 5f 6c 65 6e 29 3b 0a 09 7d 20 65 6c   &md_len);..} el
2b10: 73 65 20 69 66 20 28 73 74 61 74 65 50 74 72 2d  se if (statePtr-
2b20: 3e 66 6f 72 6d 61 74 20 26 20 54 59 50 45 5f 43  >format & TYPE_C
2b30: 4d 41 43 29 20 7b 0a 09 20 20 20 20 73 69 7a 65  MAC) {..    size
2b40: 5f 74 20 6c 65 6e 3b 0a 09 20 20 20 20 72 65 73  _t len;..    res
2b50: 20 3d 20 43 4d 41 43 5f 46 69 6e 61 6c 28 73 74   = CMAC_Final(st
2b60: 61 74 65 50 74 72 2d 3e 63 63 74 78 2c 20 6d 64  atePtr->cctx, md
2b70: 5f 62 75 66 2c 20 26 6c 65 6e 29 3b 0a 09 20 20  _buf, &len);..  
2b80: 20 20 6d 64 5f 6c 65 6e 20 3d 20 28 75 6e 73 69    md_len = (unsi
2b90: 67 6e 65 64 20 69 6e 74 29 20 6c 65 6e 3b 0a 09  gned int) len;..
2ba0: 7d 0a 09 69 66 20 28 21 72 65 73 29 20 7b 0a 09  }..if (!res) {..
2bb0: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e      Tcl_SetChann
2bc0: 65 6c 45 72 72 6f 72 28 73 74 61 74 65 50 74 72  elError(statePtr
2bd0: 2d 3e 73 65 6c 66 2c 20 54 63 6c 5f 4f 62 6a 50  ->self, Tcl_ObjP
2be0: 72 69 6e 74 66 28 22 46 69 6e 61 6c 69 7a 65 20  rintf("Finalize 
2bf0: 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 52 45 41  failed: %s", REA
2c00: 53 4f 4e 28 29 29 29 3b 0a 09 20 20 20 20 2a 65  SON()));..    *e
2c10: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49  rrorCodePtr = EI
2c20: 4e 56 41 4c 3b 0a 0a 09 2f 2a 20 57 72 69 74 65  NVAL;.../* Write
2c30: 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20   message digest 
2c40: 74 6f 20 6f 75 74 70 75 74 20 63 68 61 6e 6e 65  to output channe
2c50: 6c 20 61 73 20 62 79 74 65 20 61 72 72 61 79 20  l as byte array 
2c60: 6f 72 20 68 65 78 20 73 74 72 69 6e 67 20 2a 2f  or hex string */
2c70: 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 64 5f  ..} else if (md_
2c80: 6c 65 6e 20 3e 20 30 29 20 7b 0a 09 20 20 20 20  len > 0) {..    
2c90: 69 66 20 28 28 73 74 61 74 65 50 74 72 2d 3e 66  if ((statePtr->f
2ca0: 6f 72 6d 61 74 20 26 20 42 49 4e 5f 46 4f 52 4d  ormat & BIN_FORM
2cb0: 41 54 29 20 26 26 20 74 6f 52 65 61 64 20 3e 3d  AT) && toRead >=
2cc0: 20 28 69 6e 74 29 20 6d 64 5f 6c 65 6e 29 20 7b   (int) md_len) {
2cd0: 0a 09 09 72 65 61 64 20 3d 20 6d 64 5f 6c 65 6e  ...read = md_len
2ce0: 3b 0a 09 09 6d 65 6d 63 70 79 28 62 75 66 2c 20  ;...memcpy(buf, 
2cf0: 6d 64 5f 62 75 66 2c 20 72 65 61 64 29 3b 0a 0a  md_buf, read);..
2d00: 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 28  .    } else if((
2d10: 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74  statePtr->format
2d20: 20 26 20 48 45 58 5f 46 4f 52 4d 41 54 29 20 26   & HEX_FORMAT) &
2d30: 26 20 74 6f 52 65 61 64 20 3e 3d 20 28 69 6e 74  & toRead >= (int
2d40: 29 20 28 6d 64 5f 6c 65 6e 2a 32 29 29 20 7b 0a  ) (md_len*2)) {.
2d50: 09 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
2d60: 68 65 78 5f 62 75 66 5b 45 56 50 5f 4d 41 58 5f  hex_buf[EVP_MAX_
2d70: 4d 44 5f 53 49 5a 45 2a 32 5d 3b 0a 09 09 75 6e  MD_SIZE*2];...un
2d80: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 74 72  signed char *ptr
2d90: 20 3d 20 68 65 78 5f 62 75 66 3b 0a 0a 09 09 66   = hex_buf;....f
2da0: 6f 72 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  or (unsigned int
2db0: 20 69 20 3d 20 30 3b 20 69 20 3c 20 6d 64 5f 6c   i = 0; i < md_l
2dc0: 65 6e 3b 20 69 2b 2b 29 20 7b 0a 09 09 20 20 20  en; i++) {...   
2dd0: 20 2a 70 74 72 2b 2b 20 3d 20 68 65 78 5b 28 6d   *ptr++ = hex[(m
2de0: 64 5f 62 75 66 5b 69 5d 20 3e 3e 20 34 29 20 26  d_buf[i] >> 4) &
2df0: 20 30 78 30 46 5d 3b 0a 09 09 20 20 20 20 2a 70   0x0F];...    *p
2e00: 74 72 2b 2b 20 3d 20 68 65 78 5b 6d 64 5f 62 75  tr++ = hex[md_bu
2e10: 66 5b 69 5d 20 26 20 30 78 30 46 5d 3b 0a 09 09  f[i] & 0x0F];...
2e20: 7d 0a 09 09 72 65 61 64 20 3d 20 6d 64 5f 6c 65  }...read = md_le
2e30: 6e 2a 32 3b 0a 09 09 6d 65 6d 63 70 79 28 62 75  n*2;...memcpy(bu
2e40: 66 2c 20 68 65 78 5f 62 75 66 2c 20 72 65 61 64  f, hex_buf, read
2e50: 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 73 74  );..    }..}..st
2e60: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d  atePtr->flags |=
2e70: 20 43 48 41 4e 5f 45 4f 46 3b 0a 20 20 20 20 7d   CHAN_EOF;.    }
2e80: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 61 64  .    return read
2e90: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ;.}../*. *------
2ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ee0: 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 4f 75 74  . *. * DigestOut
2ef0: 70 75 74 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a  putProc --. *. *
2f00: 09 43 61 6c 6c 65 64 20 62 79 20 74 68 65 20 67  .Called by the g
2f10: 65 6e 65 72 69 63 20 49 4f 20 73 79 73 74 65 6d  eneric IO system
2f20: 20 74 6f 20 77 72 69 74 65 20 64 61 74 61 20 69   to write data i
2f30: 6e 20 62 75 66 20 74 6f 20 74 72 61 6e 73 66 6f  n buf to transfo
2f40: 72 6d 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  rm.. *. * Return
2f50: 73 3a 0a 20 2a 09 54 6f 74 61 6c 20 62 79 74 65  s:. *.Total byte
2f60: 73 20 77 72 69 74 74 65 6e 20 6f 72 20 2d 31 20  s written or -1 
2f70: 66 6f 72 20 61 6e 20 65 72 72 6f 72 20 61 6c 6f  for an error alo
2f80: 6e 67 20 77 69 74 68 20 61 20 50 4f 53 49 58 20  ng with a POSIX 
2f90: 65 72 72 6f 72 0a 20 2a 09 63 6f 64 65 20 69 6e  error. *.code in
2fa0: 20 65 72 72 6f 72 43 6f 64 65 50 74 72 2e 20 55   errorCodePtr. U
2fb0: 73 65 20 45 41 47 41 49 4e 20 66 6f 72 20 6e 6f  se EAGAIN for no
2fc0: 6e 62 6c 6f 63 6b 69 6e 67 20 61 6e 64 20 63 61  nblocking and ca
2fd0: 6e 27 74 20 77 72 69 74 65 20 64 61 74 61 2e 0a  n't write data..
2fe0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
2ff0: 74 73 3a 0a 20 2a 09 47 65 74 20 64 61 74 61 20  ts:. *.Get data 
3000: 66 72 6f 6d 20 62 75 66 20 61 6e 64 20 75 70 64  from buf and upd
3010: 61 74 65 20 64 69 67 65 73 74 0a 20 2a 0a 20 2a  ate digest. *. *
3020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3060: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 20 69 6e 74 20  ------. */. int 
3070: 44 69 67 65 73 74 4f 75 74 70 75 74 50 72 6f 63  DigestOutputProc
3080: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
3090: 6e 74 44 61 74 61 2c 20 63 6f 6e 73 74 20 63 68  ntData, const ch
30a0: 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 74 6f 57  ar *buf, int toW
30b0: 72 69 74 65 2c 20 69 6e 74 20 2a 65 72 72 6f 72  rite, int *error
30c0: 43 6f 64 65 50 74 72 29 20 7b 0a 20 20 20 20 44  CodePtr) {.    D
30d0: 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74  igestState *stat
30e0: 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74  ePtr = (DigestSt
30f0: 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74  ate *) clientDat
3100: 61 3b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64  a;.    *errorCod
3110: 65 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  ePtr = 0;..    /
3120: 2a 20 41 62 6f 72 74 20 69 66 20 6e 6f 74 68 69  * Abort if nothi
3130: 6e 67 20 74 6f 20 70 72 6f 63 65 73 73 20 2a 2f  ng to process */
3140: 0a 20 20 20 20 69 66 20 28 74 6f 57 72 69 74 65  .    if (toWrite
3150: 20 3c 3d 20 30 20 7c 7c 20 73 74 61 74 65 50 74   <= 0 || statePt
3160: 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f  r->self == (Tcl_
3170: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
3180: 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ..return 0;.    
3190: 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65  }..    /* Update
31a0: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a   hash function *
31b0: 2f 0a 20 20 20 20 69 66 20 28 74 6f 57 72 69 74  /.    if (toWrit
31c0: 65 20 3e 20 30 20 26 26 20 21 54 6c 73 5f 44 69  e > 0 && !Tls_Di
31d0: 67 65 73 74 55 70 64 61 74 65 28 73 74 61 74 65  gestUpdate(state
31e0: 50 74 72 2c 20 62 75 66 2c 20 28 73 69 7a 65 5f  Ptr, buf, (size_
31f0: 74 29 20 74 6f 57 72 69 74 65 2c 20 30 29 29 20  t) toWrite, 0)) 
3200: 7b 0a 09 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65  {..Tcl_SetChanne
3210: 6c 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2d  lError(statePtr-
3220: 3e 73 65 6c 66 2c 20 54 63 6c 5f 4f 62 6a 50 72  >self, Tcl_ObjPr
3230: 69 6e 74 66 28 22 55 70 64 61 74 65 20 66 61 69  intf("Update fai
3240: 6c 65 64 3a 20 25 73 22 2c 20 52 45 41 53 4f 4e  led: %s", REASON
3250: 28 29 29 29 3b 0a 09 2a 65 72 72 6f 72 43 6f 64  ()));..*errorCod
3260: 65 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 09  ePtr = EINVAL;..
3270: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
3280: 0a 20 20 20 20 72 65 74 75 72 6e 20 74 6f 57 72  .    return toWr
3290: 69 74 65 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  ite;.}../*. *---
32a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
32b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
32c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
32d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
32e0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74  ---. *. * Digest
32f0: 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2d 2d  SetOptionProc --
3300: 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79  . *. *.Called by
3310: 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20   the generic IO 
3320: 73 79 73 74 65 6d 20 74 6f 20 73 65 74 20 63 68  system to set ch
3330: 61 6e 6e 65 6c 20 6f 70 74 69 6f 6e 20 6e 61 6d  annel option nam
3340: 65 20 74 6f 20 76 61 6c 75 65 2e 0a 20 2a 0a 20  e to value.. *. 
3350: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43  * Returns:. *.TC
3360: 4c 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66  L_OK if successf
3370: 75 6c 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 20  ul or TCL_ERROR 
3380: 69 66 20 66 61 69 6c 65 64 20 61 6c 6f 6e 67 20  if failed along 
3390: 77 69 74 68 20 61 6e 20 65 72 72 6f 72 0a 20 2a  with an error. *
33a0: 09 6d 65 73 73 61 67 65 20 69 6e 20 69 6e 74 65  .message in inte
33b0: 72 70 20 61 6e 64 20 54 63 6c 5f 53 65 74 45 72  rp and Tcl_SetEr
33c0: 72 6e 6f 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  rno.. *. * Side 
33d0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 55 70 64 61  effects:. *.Upda
33e0: 74 65 73 20 63 68 61 6e 6e 65 6c 20 6f 70 74 69  tes channel opti
33f0: 6f 6e 20 74 6f 20 6e 65 77 20 76 61 6c 75 65 2e  on to new value.
3400: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
3410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
3450: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 69 67 65  .static int Dige
3460: 73 74 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28  stSetOptionProc(
3470: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
3480: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
3490: 70 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74  p *interp, const
34a0: 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d   char *optionNam
34b0: 65 2c 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a  e,..const char *
34c0: 6f 70 74 69 6f 6e 56 61 6c 75 65 29 20 7b 0a 20  optionValue) {. 
34d0: 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a     DigestState *
34e0: 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65  statePtr = (Dige
34f0: 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e  stState *) clien
3500: 74 44 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 43  tData;.    Tcl_C
3510: 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 3b 0a 20  hannel parent;. 
3520: 20 20 20 54 63 6c 5f 44 72 69 76 65 72 53 65 74     Tcl_DriverSet
3530: 4f 70 74 69 6f 6e 50 72 6f 63 20 2a 73 65 74 4f  OptionProc *setO
3540: 70 74 69 6f 6e 50 72 6f 63 3b 0a 0a 20 20 20 20  ptionProc;..    
3550: 2f 2a 20 41 62 6f 72 74 20 69 66 20 6e 6f 20 63  /* Abort if no c
3560: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66  hannel */.    if
3570: 20 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66   (statePtr->self
3580: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c   == (Tcl_Channel
3590: 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  ) NULL) {..retur
35a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
35b0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 67   }..    /* Deleg
35c0: 61 74 65 20 6f 70 74 69 6f 6e 73 20 64 6f 77 6e  ate options down
35d0: 73 74 72 65 61 6d 20 2a 2f 0a 20 20 20 20 70 61  stream */.    pa
35e0: 72 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74  rent = Tcl_GetSt
35f0: 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 61  ackedChannel(sta
3600: 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 20 20  tePtr->self);.  
3610: 20 20 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20    setOptionProc 
3620: 3d 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 53 65 74  = Tcl_ChannelSet
3630: 4f 70 74 69 6f 6e 50 72 6f 63 28 54 63 6c 5f 47  OptionProc(Tcl_G
3640: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 70 61  etChannelType(pa
3650: 72 65 6e 74 29 29 3b 0a 20 20 20 20 69 66 20 28  rent));.    if (
3660: 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 21 3d  setOptionProc !=
3670: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
3680: 20 28 2a 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63   (*setOptionProc
3690: 29 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  )(Tcl_GetChannel
36a0: 49 6e 73 74 61 6e 63 65 44 61 74 61 28 70 61 72  InstanceData(par
36b0: 65 6e 74 29 2c 20 69 6e 74 65 72 70 2c 20 6f 70  ent), interp, op
36c0: 74 69 6f 6e 4e 61 6d 65 2c 20 6f 70 74 69 6f 6e  tionName, option
36d0: 56 61 6c 75 65 29 3b 0a 20 20 20 20 7d 20 65 6c  Value);.    } el
36e0: 73 65 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72 72  se {..Tcl_SetErr
36f0: 6e 6f 28 45 49 4e 56 41 4c 29 3b 0a 09 72 65 74  no(EINVAL);..ret
3700: 75 72 6e 20 54 63 6c 5f 42 61 64 43 68 61 6e 6e  urn Tcl_BadChann
3710: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
3720: 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 4e 55 4c   optionName, NUL
3730: 4c 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a  L);.    }.}../*.
3740: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
3750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3780: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44  --------. *. * D
3790: 69 67 65 73 74 47 65 74 4f 70 74 69 6f 6e 50 72  igestGetOptionPr
37a0: 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c  oc --. *. *.Call
37b0: 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 69  ed by the generi
37c0: 63 20 49 4f 20 73 79 73 74 65 6d 20 74 6f 20 67  c IO system to g
37d0: 65 74 20 63 68 61 6e 6e 65 6c 20 6f 70 74 69 6f  et channel optio
37e0: 6e 20 6e 61 6d 65 27 73 20 76 61 6c 75 65 2e 0a  n name's value..
37f0: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20   *. * Returns:. 
3800: 2a 09 54 43 4c 5f 4f 4b 20 69 66 20 73 75 63 63  *.TCL_OK if succ
3810: 65 73 73 66 75 6c 20 6f 72 20 54 43 4c 5f 45 52  essful or TCL_ER
3820: 52 4f 52 20 69 66 20 66 61 69 6c 65 64 20 61 6c  ROR if failed al
3830: 6f 6e 67 20 77 69 74 68 20 61 6e 20 65 72 72 6f  ong with an erro
3840: 72 0a 20 2a 09 6d 65 73 73 61 67 65 20 69 6e 20  r. *.message in 
3850: 69 6e 74 65 72 70 20 61 6e 64 20 54 63 6c 5f 53  interp and Tcl_S
3860: 65 74 45 72 72 6e 6f 2e 0a 20 2a 0a 20 2a 20 53  etErrno.. *. * S
3870: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
3880: 53 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20 6f  Sets result to o
3890: 70 74 69 6f 6e 27 73 20 76 61 6c 75 65 0a 20 2a  ption's value. *
38a0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
38b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
38f0: 61 74 69 63 20 69 6e 74 20 44 69 67 65 73 74 47  atic int DigestG
3900: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 43 6c 69  etOptionProc(Cli
3910: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
3920: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
3930: 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74 20 63 68  interp, const ch
3940: 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c 0a  ar *optionName,.
3950: 09 54 63 6c 5f 44 53 74 72 69 6e 67 20 2a 6f 70  .Tcl_DString *op
3960: 74 69 6f 6e 56 61 6c 75 65 29 20 7b 0a 20 20 20  tionValue) {.   
3970: 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74   DigestState *st
3980: 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 74  atePtr = (Digest
3990: 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44  State *) clientD
39a0: 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61  ata;.    Tcl_Cha
39b0: 6e 6e 65 6c 20 70 61 72 65 6e 74 3b 0a 20 20 20  nnel parent;.   
39c0: 20 54 63 6c 5f 44 72 69 76 65 72 47 65 74 4f 70   Tcl_DriverGetOp
39d0: 74 69 6f 6e 50 72 6f 63 20 2a 67 65 74 4f 70 74  tionProc *getOpt
39e0: 69 6f 6e 50 72 6f 63 3b 0a 0a 20 20 20 20 2f 2a  ionProc;..    /*
39f0: 20 41 62 6f 72 74 20 69 66 20 6e 6f 20 63 68 61   Abort if no cha
3a00: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28  nnel */.    if (
3a10: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d  statePtr->self =
3a20: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
3a30: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
3a40: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
3a50: 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 67 61 74  ..    /* Delegat
3a60: 65 20 6f 70 74 69 6f 6e 73 20 64 6f 77 6e 73 74  e options downst
3a70: 72 65 61 6d 20 2a 2f 0a 20 20 20 20 70 61 72 65  ream */.    pare
3a80: 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 63  nt = Tcl_GetStac
3a90: 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 65  kedChannel(state
3aa0: 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 20  Ptr->self);.    
3ab0: 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 3d 20  getOptionProc = 
3ac0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 47 65 74 4f 70  Tcl_ChannelGetOp
3ad0: 74 69 6f 6e 50 72 6f 63 28 54 63 6c 5f 47 65 74  tionProc(Tcl_Get
3ae0: 43 68 61 6e 6e 65 6c 54 79 70 65 28 70 61 72 65  ChannelType(pare
3af0: 6e 74 29 29 3b 0a 20 20 20 20 69 66 20 28 67 65  nt));.    if (ge
3b00: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 21 3d 20 4e  tOptionProc != N
3b10: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 28  ULL) {..return (
3b20: 2a 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 29 28  *getOptionProc)(
3b30: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e  Tcl_GetChannelIn
3b40: 73 74 61 6e 63 65 44 61 74 61 28 70 61 72 65 6e  stanceData(paren
3b50: 74 29 2c 20 69 6e 74 65 72 70 2c 20 6f 70 74 69  t), interp, opti
3b60: 6f 6e 4e 61 6d 65 2c 20 6f 70 74 69 6f 6e 56 61  onName, optionVa
3b70: 6c 75 65 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  lue);.    } else
3b80: 20 69 66 20 28 6f 70 74 69 6f 6e 4e 61 6d 65 20   if (optionName 
3b90: 3d 3d 20 28 63 68 61 72 2a 29 20 4e 55 4c 4c 29  == (char*) NULL)
3ba0: 20 7b 0a 09 2f 2a 20 52 65 71 75 65 73 74 20 69   {../* Request i
3bb0: 73 20 71 75 65 72 79 20 66 6f 72 20 61 6c 6c 20  s query for all 
3bc0: 6f 70 74 69 6f 6e 73 2c 20 74 68 69 73 20 69 73  options, this is
3bd0: 20 6f 6b 2e 20 2a 2f 0a 09 72 65 74 75 72 6e 20   ok. */..return 
3be0: 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c  TCL_OK;.    } el
3bf0: 73 65 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72 72  se {..Tcl_SetErr
3c00: 6e 6f 28 45 49 4e 56 41 4c 29 3b 0a 09 72 65 74  no(EINVAL);..ret
3c10: 75 72 6e 20 54 63 6c 5f 42 61 64 43 68 61 6e 6e  urn Tcl_BadChann
3c20: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
3c30: 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 4e 55 4c   optionName, NUL
3c40: 4c 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a  L);.    }.}../*.
3c50: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
3c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c90: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44  --------. *. * D
3ca0: 69 67 65 73 74 54 69 6d 65 72 48 61 6e 64 6c 65  igestTimerHandle
3cb0: 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65  r --. *. *.Calle
3cc0: 64 20 62 79 20 74 68 65 20 6e 6f 74 69 66 69 65  d by the notifie
3cd0: 72 20 76 69 61 20 74 69 6d 65 72 20 74 6f 20 66  r via timer to f
3ce0: 6c 75 73 68 20 6f 75 74 20 70 65 6e 64 69 6e 67  lush out pending
3cf0: 20 69 6e 70 75 74 20 64 61 74 61 2e 0a 20 2a 0a   input data.. *.
3d00: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 4e   * Returns:. *.N
3d10: 6f 74 68 69 6e 67 0a 20 2a 0a 20 2a 20 53 69 64  othing. *. * Sid
3d20: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61  e effects:. *.Ma
3d30: 79 20 63 61 6c 6c 20 54 63 6c 5f 4e 6f 74 69 66  y call Tcl_Notif
3d40: 79 43 68 61 6e 6e 65 6c 0a 20 2a 0a 20 2a 2d 2d  yChannel. *. *--
3d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3d90: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
3da0: 76 6f 69 64 20 44 69 67 65 73 74 54 69 6d 65 72  void DigestTimer
3db0: 48 61 6e 64 6c 65 72 28 43 6c 69 65 6e 74 44 61  Handler(ClientDa
3dc0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 29 20 7b  ta clientData) {
3dd0: 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65  .    DigestState
3de0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44 69   *statePtr = (Di
3df0: 67 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69  gestState *) cli
3e00: 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 2f 2a  entData;..    /*
3e10: 20 41 62 6f 72 74 20 69 66 20 6e 6f 20 63 68 61   Abort if no cha
3e20: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28  nnel */.    if (
3e30: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d  statePtr->self =
3e40: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
3e50: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 3b  NULL) {..return;
3e60: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
3e70: 6c 65 61 72 20 74 69 6d 65 72 20 74 6f 6b 65 6e  lear timer token
3e80: 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72   */.    statePtr
3e90: 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54  ->timer = (Tcl_T
3ea0: 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b  imerToken) NULL;
3eb0: 0a 0a 20 20 20 20 2f 2a 20 46 69 72 65 20 65 76  ..    /* Fire ev
3ec0: 65 6e 74 20 69 66 20 74 68 65 72 65 20 69 73 20  ent if there is 
3ed0: 70 65 6e 64 69 6e 67 20 64 61 74 61 2c 20 73 6b  pending data, sk
3ee0: 69 70 20 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a  ip otherwise */.
3ef0: 20 20 20 20 69 66 20 28 28 73 74 61 74 65 50 74      if ((statePt
3f00: 72 2d 3e 77 61 74 63 68 4d 61 73 6b 20 26 20 54  r->watchMask & T
3f10: 43 4c 5f 52 45 41 44 41 42 4c 45 29 20 26 26 20  CL_READABLE) && 
3f20: 28 54 63 6c 5f 49 6e 70 75 74 42 75 66 66 65 72  (Tcl_InputBuffer
3f30: 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  ed(statePtr->sel
3f40: 66 29 20 3e 20 30 29 29 20 7b 0a 09 54 63 6c 5f  f) > 0)) {..Tcl_
3f50: 4e 6f 74 69 66 79 43 68 61 6e 6e 65 6c 28 73 74  NotifyChannel(st
3f60: 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 54 43  atePtr->self, TC
3f70: 4c 5f 52 45 41 44 41 42 4c 45 29 3b 0a 20 20 20  L_READABLE);.   
3f80: 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d   }.}../*. *-----
3f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fd0: 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 57 61  -. *. * DigestWa
3fe0: 74 63 68 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a  tchProc --. *. *
3ff0: 09 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20  .Initialize the 
4000: 6e 6f 74 69 66 69 65 72 20 74 6f 20 77 61 74 63  notifier to watc
4010: 68 20 66 6f 72 20 65 76 65 6e 74 73 20 66 72 6f  h for events fro
4020: 6d 20 74 68 69 73 20 63 68 61 6e 6e 65 6c 2e 0a  m this channel..
4030: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20   *. * Returns:. 
4040: 2a 09 4e 6f 74 68 69 6e 67 20 28 63 61 6e 27 74  *.Nothing (can't
4050: 20 72 65 74 75 72 6e 20 65 72 72 6f 72 20 6d 65   return error me
4060: 73 73 61 67 65 73 29 0a 20 2a 0a 20 2a 20 53 69  ssages). *. * Si
4070: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
4080: 6f 6e 66 69 67 75 72 65 20 6e 6f 74 69 66 69 65  onfigure notifie
4090: 72 20 73 6f 20 66 75 74 75 72 65 20 65 76 65 6e  r so future even
40a0: 74 73 20 6f 6e 20 74 68 65 20 63 68 61 6e 6e 65  ts on the channe
40b0: 6c 20 77 69 6c 6c 20 62 65 20 73 65 65 6e 20 62  l will be seen b
40c0: 79 20 54 63 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  y Tcl.. *. *----
40d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4110: 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 44 69 67 65  --. */.void Dige
4120: 73 74 57 61 74 63 68 50 72 6f 63 28 43 6c 69 65  stWatchProc(Clie
4130: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
4140: 61 2c 20 69 6e 74 20 6d 61 73 6b 29 20 7b 0a 20  a, int mask) {. 
4150: 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a     DigestState *
4160: 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65  statePtr = (Dige
4170: 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e  stState *) clien
4180: 74 44 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 43  tData;.    Tcl_C
4190: 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 3b 0a 20  hannel parent;. 
41a0: 20 20 20 54 63 6c 5f 44 72 69 76 65 72 57 61 74     Tcl_DriverWat
41b0: 63 68 50 72 6f 63 20 2a 77 61 74 63 68 50 72 6f  chProc *watchPro
41c0: 63 3b 0a 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74  c;..    /* Abort
41d0: 20 69 66 20 6e 6f 20 63 68 61 6e 6e 65 6c 20 2a   if no channel *
41e0: 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  /.    if (stateP
41f0: 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c  tr->self == (Tcl
4200: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20  _Channel) NULL) 
4210: 7b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d  {..return;.    }
4220: 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 4f  ..    /* Store O
4230: 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  R-ed combination
4240: 20 6f 66 20 54 43 4c 5f 52 45 41 44 41 42 4c 45   of TCL_READABLE
4250: 2c 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 20 61  , TCL_WRITABLE a
4260: 6e 64 20 54 43 4c 5f 45 58 43 45 50 54 49 4f 4e  nd TCL_EXCEPTION
4270: 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72   */.    statePtr
4280: 2d 3e 77 61 74 63 68 4d 61 73 6b 20 3d 20 6d 61  ->watchMask = ma
4290: 73 6b 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 70  sk;..    /* Prop
42a0: 61 67 61 74 65 20 6d 61 73 6b 20 69 6e 66 6f 20  agate mask info 
42b0: 74 6f 20 70 61 72 65 6e 74 20 63 68 61 6e 6e 65  to parent channe
42c0: 6c 20 2a 2f 0a 20 20 20 20 70 61 72 65 6e 74 20  l */.    parent 
42d0: 3d 20 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 64  = Tcl_GetStacked
42e0: 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72  Channel(statePtr
42f0: 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 20 77 61 74  ->self);.    wat
4300: 63 68 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68 61  chProc = Tcl_Cha
4310: 6e 6e 65 6c 57 61 74 63 68 50 72 6f 63 28 54 63  nnelWatchProc(Tc
4320: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65  l_GetChannelType
4330: 28 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 77  (parent));.    w
4340: 61 74 63 68 50 72 6f 63 28 54 63 6c 5f 47 65 74  atchProc(Tcl_Get
4350: 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44  ChannelInstanceD
4360: 61 74 61 28 70 61 72 65 6e 74 29 2c 20 6d 61 73  ata(parent), mas
4370: 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f  k);..    /* Remo
4380: 76 65 20 70 65 6e 64 69 6e 67 20 74 69 6d 65 72  ve pending timer
4390: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74   */.    if (stat
43a0: 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28  ePtr->timer != (
43b0: 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20  Tcl_TimerToken) 
43c0: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c  NULL) {..Tcl_Del
43d0: 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28  eteTimerHandler(
43e0: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29  statePtr->timer)
43f0: 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d  ;..statePtr->tim
4400: 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54  er = (Tcl_TimerT
4410: 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 20 20 20 20  oken) NULL;.    
4420: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
4430: 72 65 20 69 73 20 64 61 74 61 20 70 65 6e 64 69  re is data pendi
4440: 6e 67 2c 20 73 65 74 20 6e 65 77 20 74 69 6d 65  ng, set new time
4450: 72 20 74 6f 20 63 61 6c 6c 20 54 63 6c 5f 4e 6f  r to call Tcl_No
4460: 74 69 66 79 43 68 61 6e 6e 65 6c 20 2a 2f 0a 20  tifyChannel */. 
4470: 20 20 20 69 66 20 28 28 6d 61 73 6b 20 26 20 54     if ((mask & T
4480: 43 4c 5f 52 45 41 44 41 42 4c 45 29 20 26 26 20  CL_READABLE) && 
4490: 28 54 63 6c 5f 49 6e 70 75 74 42 75 66 66 65 72  (Tcl_InputBuffer
44a0: 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  ed(statePtr->sel
44b0: 66 29 20 3e 20 30 29 29 20 7b 0a 09 73 74 61 74  f) > 0)) {..stat
44c0: 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 54 63  ePtr->timer = Tc
44d0: 6c 5f 43 72 65 61 74 65 54 69 6d 65 72 48 61 6e  l_CreateTimerHan
44e0: 64 6c 65 72 28 52 45 41 44 5f 44 45 4c 41 59 2c  dler(READ_DELAY,
44f0: 20 44 69 67 65 73 74 54 69 6d 65 72 48 61 6e 64   DigestTimerHand
4500: 6c 65 72 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  ler, (ClientData
4510: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20  ) statePtr);.   
4520: 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d   }.}../*. *-----
4530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4570: 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 47 65  -. *. * DigestGe
4580: 74 48 61 6e 64 6c 65 50 72 6f 63 20 2d 2d 0a 20  tHandleProc --. 
4590: 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 66 72 6f 6d  *. *.Called from
45a0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 48   Tcl_GetChannelH
45b0: 61 6e 64 6c 65 20 74 6f 20 72 65 74 72 69 65 76  andle to retriev
45c0: 65 20 4f 53 20 73 70 65 63 69 66 69 63 20 66 69  e OS specific fi
45d0: 6c 65 20 68 61 6e 64 6c 65 0a 20 2a 09 66 72 6f  le handle. *.fro
45e0: 6d 20 69 6e 73 69 64 65 20 74 68 69 73 20 63 68  m inside this ch
45f0: 61 6e 6e 65 6c 2e 20 4e 6f 74 20 75 73 65 64 20  annel. Not used 
4600: 66 6f 72 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  for transformati
4610: 6f 6e 73 3f 0a 20 2a 0a 20 2a 20 52 65 74 75 72  ons?. *. * Retur
4620: 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 66 6f  ns:. *.TCL_OK fo
4630: 72 20 73 75 63 63 65 73 73 20 6f 72 20 54 43 4c  r success or TCL
4640: 5f 45 52 52 4f 52 20 66 6f 72 20 65 72 72 6f 72  _ERROR for error
4650: 20 6f 72 20 69 66 20 6e 6f 74 20 73 75 70 70 6f   or if not suppo
4660: 72 74 65 64 2e 20 49 66 0a 20 2a 09 64 69 72 65  rted. If. *.dire
4670: 63 74 69 6f 6e 20 69 73 20 54 43 4c 5f 52 45 41  ction is TCL_REA
4680: 44 41 42 4c 45 2c 20 73 65 74 73 20 68 61 6e 64  DABLE, sets hand
4690: 6c 65 50 74 72 20 74 6f 20 74 68 65 20 68 61 6e  lePtr to the han
46a0: 64 6c 65 20 75 73 65 64 20 66 6f 72 0a 20 2a 09  dle used for. *.
46b0: 69 6e 70 75 74 2c 20 6f 72 20 69 66 20 54 43 4c  input, or if TCL
46c0: 5f 57 52 49 54 41 42 4c 45 20 73 65 74 73 20 74  _WRITABLE sets t
46d0: 6f 20 74 68 65 20 68 61 6e 64 6c 65 20 75 73 65  o the handle use
46e0: 64 20 66 6f 72 20 6f 75 74 70 75 74 2e 0a 20 2a  d for output.. *
46f0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
4700: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d  :. *.None. *. *-
4710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 2f 0a 69 6e 74 20 44 69  -----. */.int Di
4760: 67 65 73 74 47 65 74 48 61 6e 64 6c 65 50 72 6f  gestGetHandlePro
4770: 63 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  c(ClientData cli
4780: 65 6e 74 44 61 74 61 2c 20 69 6e 74 20 64 69 72  entData, int dir
4790: 65 63 74 69 6f 6e 2c 20 43 6c 69 65 6e 74 44 61  ection, ClientDa
47a0: 74 61 20 2a 68 61 6e 64 6c 65 50 74 72 29 20 7b  ta *handlePtr) {
47b0: 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65  .    DigestState
47c0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44 69   *statePtr = (Di
47d0: 67 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69  gestState *) cli
47e0: 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 54 63 6c  entData;.    Tcl
47f0: 5f 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 3b  _Channel parent;
4800: 0a 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 69  ..    /* Abort i
4810: 66 20 6e 6f 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  f no channel */.
4820: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
4830: 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43  ->self == (Tcl_C
4840: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a  hannel) NULL) {.
4850: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
4860: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 61  R;.    }..    pa
4870: 72 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74  rent = Tcl_GetSt
4880: 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 61  ackedChannel(sta
4890: 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 20 20  tePtr->self);.  
48a0: 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 47 65 74    return Tcl_Get
48b0: 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 28 70 61  ChannelHandle(pa
48c0: 72 65 6e 74 2c 20 64 69 72 65 63 74 69 6f 6e 2c  rent, direction,
48d0: 20 68 61 6e 64 6c 65 50 74 72 29 3b 0a 7d 0a 0a   handlePtr);.}..
48e0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
48f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
4930: 2a 20 44 69 67 65 73 74 4e 6f 74 69 66 79 50 72  * DigestNotifyPr
4940: 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c  oc --. *. *.Call
4950: 65 64 20 62 79 20 54 63 6c 20 74 6f 20 69 6e 66  ed by Tcl to inf
4960: 6f 72 6d 20 75 73 20 6f 66 20 61 63 74 69 76 69  orm us of activi
4970: 74 79 20 6f 6e 20 74 68 65 20 75 6e 64 65 72 6c  ty on the underl
4980: 79 69 6e 67 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a  ying channel.. *
4990: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09  . * Returns:. *.
49a0: 55 6e 63 68 61 6e 67 65 64 20 69 6e 74 65 72 65  Unchanged intere
49b0: 73 74 4d 61 73 6b 20 77 68 69 63 68 20 69 73 20  stMask which is 
49c0: 61 6e 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61  an OR-ed combina
49d0: 74 69 6f 6e 20 6f 66 20 54 43 4c 5f 52 45 41 44  tion of TCL_READ
49e0: 41 42 4c 45 20 6f 72 20 54 43 4c 5f 57 52 49 54  ABLE or TCL_WRIT
49f0: 41 42 4c 45 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ABLE. *. * Side 
4a00: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6e 63  effects:. *.Canc
4a10: 65 6c 73 20 61 6e 79 20 70 65 6e 64 69 6e 67 20  els any pending 
4a20: 74 69 6d 65 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  timer.. *. *----
4a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a70: 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73  --. */.int Diges
4a80: 74 4e 6f 74 69 66 79 50 72 6f 63 28 43 6c 69 65  tNotifyProc(Clie
4a90: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
4aa0: 61 2c 20 69 6e 74 20 69 6e 74 65 72 65 73 74 4d  a, int interestM
4ab0: 61 73 6b 29 20 7b 0a 20 20 20 20 44 69 67 65 73  ask) {.    Diges
4ac0: 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72  tState *statePtr
4ad0: 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20   = (DigestState 
4ae0: 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a  *) clientData;..
4af0: 20 20 20 20 2f 2a 20 53 6b 69 70 20 74 69 6d 65      /* Skip time
4b00: 72 20 65 76 65 6e 74 20 61 73 20 72 65 64 75 6e  r event as redun
4b10: 64 61 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20 28  dant */.    if (
4b20: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20  statePtr->timer 
4b30: 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b  != (Tcl_TimerTok
4b40: 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c  en) NULL) {..Tcl
4b50: 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64  _DeleteTimerHand
4b60: 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69  ler(statePtr->ti
4b70: 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d  mer);..statePtr-
4b80: 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69  >timer = (Tcl_Ti
4b90: 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a  merToken) NULL;.
4ba0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
4bb0: 20 69 6e 74 65 72 65 73 74 4d 61 73 6b 3b 0a 7d   interestMask;.}
4bc0: 0a 0a 2f 2a 0a 20 2a 0a 20 2a 20 43 68 61 6e 6e  ../*. *. * Chann
4bd0: 65 6c 20 74 79 70 65 20 73 74 72 75 63 74 75 72  el type structur
4be0: 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72  e definition for
4bf0: 20 64 69 67 65 73 74 20 74 72 61 6e 73 66 6f 72   digest transfor
4c00: 6d 61 74 69 6f 6e 73 2e 0a 20 2a 0a 20 2a 2f 0a  mations.. *. */.
4c10: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 54 63 6c  static const Tcl
4c20: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 64 69 67  _ChannelType dig
4c30: 65 73 74 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d  estChannelType =
4c40: 20 7b 0a 20 20 20 20 22 64 69 67 65 73 74 22 2c   {.    "digest",
4c50: 09 09 09 2f 2a 20 54 79 70 65 20 6e 61 6d 65 20  .../* Type name 
4c60: 2a 2f 0a 20 20 20 20 54 43 4c 5f 43 48 41 4e 4e  */.    TCL_CHANN
4c70: 45 4c 5f 56 45 52 53 49 4f 4e 5f 35 2c 09 2f 2a  EL_VERSION_5,./*
4c80: 20 76 35 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20   v5 channel */. 
4c90: 20 20 20 44 69 67 65 73 74 43 6c 6f 73 65 50 72     DigestClosePr
4ca0: 6f 63 2c 09 09 2f 2a 20 43 6c 6f 73 65 20 70 72  oc,../* Close pr
4cb0: 6f 63 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74  oc */.    Digest
4cc0: 49 6e 70 75 74 50 72 6f 63 2c 09 09 2f 2a 20 49  InputProc,../* I
4cd0: 6e 70 75 74 20 70 72 6f 63 20 2a 2f 0a 20 20 20  nput proc */.   
4ce0: 20 44 69 67 65 73 74 4f 75 74 70 75 74 50 72 6f   DigestOutputPro
4cf0: 63 2c 09 09 2f 2a 20 4f 75 74 70 75 74 20 70 72  c,../* Output pr
4d00: 6f 63 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09  oc */.    NULL,.
4d10: 09 09 2f 2a 20 53 65 65 6b 20 70 72 6f 63 20 2a  ../* Seek proc *
4d20: 2f 0a 20 20 20 20 44 69 67 65 73 74 53 65 74 4f  /.    DigestSetO
4d30: 70 74 69 6f 6e 50 72 6f 63 2c 09 2f 2a 20 53 65  ptionProc,./* Se
4d40: 74 20 6f 70 74 69 6f 6e 20 70 72 6f 63 20 2a 2f  t option proc */
4d50: 0a 20 20 20 20 44 69 67 65 73 74 47 65 74 4f 70  .    DigestGetOp
4d60: 74 69 6f 6e 50 72 6f 63 2c 09 2f 2a 20 47 65 74  tionProc,./* Get
4d70: 20 6f 70 74 69 6f 6e 20 70 72 6f 63 20 2a 2f 0a   option proc */.
4d80: 20 20 20 20 44 69 67 65 73 74 57 61 74 63 68 50      DigestWatchP
4d90: 72 6f 63 2c 09 09 2f 2a 20 49 6e 69 74 69 61 6c  roc,../* Initial
4da0: 69 7a 65 20 6e 6f 74 69 66 69 65 72 20 2a 2f 0a  ize notifier */.
4db0: 20 20 20 20 44 69 67 65 73 74 47 65 74 48 61 6e      DigestGetHan
4dc0: 64 6c 65 50 72 6f 63 2c 09 2f 2a 20 47 65 74 20  dleProc,./* Get 
4dd0: 4f 53 20 68 61 6e 64 6c 65 73 20 6f 75 74 20 6f  OS handles out o
4de0: 66 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20  f channel */.   
4df0: 20 44 69 67 65 73 74 43 6c 6f 73 65 32 50 72 6f   DigestClose2Pro
4e00: 63 2c 09 09 2f 2a 20 63 6c 6f 73 65 32 70 72 6f  c,../* close2pro
4e10: 63 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 42  c */.    DigestB
4e20: 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 2c 09 2f 2a  lockModeProc,./*
4e30: 20 53 65 74 20 62 6c 6f 63 6b 69 6e 67 2f 6e 6f   Set blocking/no
4e40: 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2a 2f  nblocking mode*/
4e50: 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20  .    NULL,.../* 
4e60: 46 6c 75 73 68 20 70 72 6f 63 20 2a 2f 0a 20 20  Flush proc */.  
4e70: 20 20 44 69 67 65 73 74 4e 6f 74 69 66 79 50 72    DigestNotifyPr
4e80: 6f 63 2c 09 09 2f 2a 20 48 61 6e 64 6c 69 6e 67  oc,../* Handling
4e90: 20 6f 66 20 65 76 65 6e 74 73 20 62 75 62 62 6c   of events bubbl
4ea0: 69 6e 67 20 75 70 20 2a 2f 0a 20 20 20 20 4e 55  ing up */.    NU
4eb0: 4c 4c 2c 09 09 09 2f 2a 20 57 69 64 65 20 73 65  LL,.../* Wide se
4ec0: 65 6b 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 4e  ek proc */.    N
4ed0: 55 4c 4c 2c 09 09 09 2f 2a 20 54 68 72 65 61 64  ULL,.../* Thread
4ee0: 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 4e   action */.    N
4ef0: 55 4c 4c 09 09 09 2f 2a 20 54 72 75 6e 63 61 74  ULL.../* Truncat
4f00: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2d 2d  e */.};../*. *--
4f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4f50: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 44  ----. *. * Tls_D
4f60: 69 67 65 73 74 43 68 61 6e 6e 65 6c 20 2d 2d 0a  igestChannel --.
4f70: 20 2a 0a 20 2a 09 43 72 65 61 74 65 20 61 20 73   *. *.Create a s
4f80: 74 61 63 6b 65 64 20 63 68 61 6e 6e 65 6c 20 66  tacked channel f
4f90: 6f 72 20 61 20 6d 65 73 73 61 67 65 20 64 69 67  or a message dig
4fa0: 65 73 74 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  est transformati
4fb0: 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  on.. *. * Return
4fc0: 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20  s:. *.TCL_OK or 
4fd0: 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20  TCL_ERROR. *. * 
4fe0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
4ff0: 09 41 64 64 73 20 74 72 61 6e 73 66 6f 72 6d 20  .Adds transform 
5000: 74 6f 20 63 68 61 6e 6e 65 6c 20 61 6e 64 20 73  to channel and s
5010: 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20 63 68  ets result to ch
5020: 61 6e 6e 65 6c 20 69 64 20 6f 72 20 65 72 72 6f  annel id or erro
5030: 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a  r message.. *. *
5040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5080: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
5090: 63 20 69 6e 74 0a 54 6c 73 5f 44 69 67 65 73 74  c int.Tls_Digest
50a0: 43 68 61 6e 6e 65 6c 28 54 63 6c 5f 49 6e 74 65  Channel(Tcl_Inte
50b0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73  rp *interp, cons
50c0: 74 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c 2c  t char *channel,
50d0: 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d   const EVP_MD *m
50e0: 64 2c 0a 09 63 6f 6e 73 74 20 45 56 50 5f 43 49  d,..const EVP_CI
50f0: 50 48 45 52 20 2a 63 69 70 68 65 72 2c 20 69 6e  PHER *cipher, in
5100: 74 20 66 6f 72 6d 61 74 2c 20 54 63 6c 5f 4f 62  t format, Tcl_Ob
5110: 6a 20 2a 6b 65 79 4f 62 6a 29 20 7b 0a 20 20 20  j *keyObj) {.   
5120: 20 69 6e 74 20 6d 6f 64 65 3b 20 2f 2a 20 4f 52   int mode; /* OR
5130: 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  -ed combination 
5140: 6f 66 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 20  of TCL_READABLE 
5150: 61 6e 64 20 54 43 4c 5f 57 52 49 54 41 42 4c 45  and TCL_WRITABLE
5160: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e   */.    Tcl_Chan
5170: 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 44 69  nel chan;.    Di
5180: 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65  gestState *state
5190: 50 74 72 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c  Ptr;..    /* Val
51a0: 69 64 61 74 65 20 61 72 67 73 20 2a 2f 0a 20 20  idate args */.  
51b0: 20 20 69 66 20 28 63 68 61 6e 6e 65 6c 20 3d 3d    if (channel ==
51c0: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20   (const char *) 
51d0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
51e0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
51f0: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 68 61  ..    /* Get cha
5200: 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20 20 20 20 63  nnel Id */.    c
5210: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61  han = Tcl_GetCha
5220: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61  nnel(interp, cha
5230: 6e 6e 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 20 20  nnel, &mode);.  
5240: 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54    if (chan == (T
5250: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c  cl_Channel) NULL
5260: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
5270: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
5280: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
5290: 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65  o operate on the
52a0: 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c   topmost channel
52b0: 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54   */.    chan = T
52c0: 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c  cl_GetTopChannel
52d0: 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20  (chan);..    /* 
52e0: 43 72 65 61 74 65 20 73 74 61 74 65 20 64 61 74  Create state dat
52f0: 61 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 20 20  a struct */.    
5300: 69 66 20 28 28 73 74 61 74 65 50 74 72 20 3d 20  if ((statePtr = 
5310: 54 6c 73 5f 44 69 67 65 73 74 4e 65 77 28 69 6e  Tls_DigestNew(in
5320: 74 65 72 70 2c 20 66 6f 72 6d 61 74 29 29 20 3d  terp, format)) =
5330: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41  = NULL) {..Tcl_A
5340: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
5350: 72 70 2c 20 22 4d 65 6d 6f 72 79 20 61 6c 6c 6f  rp, "Memory allo
5360: 63 61 74 69 6f 6e 20 65 72 72 6f 72 22 2c 20 28  cation error", (
5370: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
5380: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
5390: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74  ;.    }.    stat
53a0: 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 63 68 61  ePtr->self = cha
53b0: 6e 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  n;.    statePtr-
53c0: 3e 6d 6f 64 65 20 3d 20 6d 6f 64 65 3b 0a 0a 20  >mode = mode;.. 
53d0: 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
53e0: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a   hash function *
53f0: 2f 0a 20 20 20 20 69 66 20 28 54 6c 73 5f 44 69  /.    if (Tls_Di
5400: 67 65 73 74 49 6e 69 74 28 69 6e 74 65 72 70 2c  gestInit(interp,
5410: 20 73 74 61 74 65 50 74 72 2c 20 6d 64 2c 20 63   statePtr, md, c
5420: 69 70 68 65 72 2c 20 6b 65 79 4f 62 6a 29 20 21  ipher, keyObj) !
5430: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74  = TCL_OK) {..ret
5440: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
5450: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e     }..    /* Con
5460: 66 69 67 75 72 65 20 63 68 61 6e 6e 65 6c 20 2a  figure channel *
5470: 2f 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61  /.    Tcl_SetCha
5480: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
5490: 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73  p, chan, "-trans
54a0: 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72 79  lation", "binary
54b0: 22 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f  ");.    if (Tcl_
54c0: 47 65 74 43 68 61 6e 6e 65 6c 42 75 66 66 65 72  GetChannelBuffer
54d0: 53 69 7a 65 28 63 68 61 6e 29 20 3c 20 45 56 50  Size(chan) < EVP
54e0: 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45 20 2a 20 32  _MAX_MD_SIZE * 2
54f0: 29 20 7b 0a 09 54 63 6c 5f 53 65 74 43 68 61 6e  ) {..Tcl_SetChan
5500: 6e 65 6c 42 75 66 66 65 72 53 69 7a 65 28 63 68  nelBufferSize(ch
5510: 61 6e 2c 20 45 56 50 5f 4d 41 58 5f 4d 44 5f 53  an, EVP_MAX_MD_S
5520: 49 5a 45 20 2a 20 32 29 3b 0a 20 20 20 20 7d 0a  IZE * 2);.    }.
5530: 0a 20 20 20 20 2f 2a 20 53 74 61 63 6b 20 63 68  .    /* Stack ch
5540: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 73 74 61  annel */.    sta
5550: 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63  tePtr->self = Tc
5560: 6c 5f 53 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69  l_StackChannel(i
5570: 6e 74 65 72 70 2c 20 26 64 69 67 65 73 74 43 68  nterp, &digestCh
5580: 61 6e 6e 65 6c 54 79 70 65 2c 20 28 43 6c 69 65  annelType, (Clie
5590: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72  ntData) statePtr
55a0: 2c 20 6d 6f 64 65 2c 20 63 68 61 6e 29 3b 0a 20  , mode, chan);. 
55b0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
55c0: 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68  >self == (Tcl_Ch
55d0: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
55e0: 54 6c 73 5f 44 69 67 65 73 74 46 72 65 65 28 73  Tls_DigestFree(s
55f0: 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72  tatePtr);..retur
5600: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
5610: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 72   }..    /* Set r
5620: 65 73 75 6c 74 20 74 6f 20 63 68 61 6e 6e 65 6c  esult to channel
5630: 20 49 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 53   Id */.    Tcl_S
5640: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
5650: 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65   (char *) Tcl_Ge
5660: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61  tChannelName(cha
5670: 6e 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  n), TCL_VOLATILE
5680: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
5690: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d  L_OK;.}../*. *--
56a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56e0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e 73 74 61  ----. *. * Unsta
56f0: 63 6b 20 43 68 61 6e 6e 65 6c 20 2d 2d 0a 20 2a  ck Channel --. *
5700: 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f  . *.This functio
5710: 6e 20 72 65 6d 6f 76 65 73 20 74 68 65 20 73 74  n removes the st
5720: 61 63 6b 65 64 20 63 68 61 6e 6e 65 6c 20 66 72  acked channel fr
5730: 6f 6d 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  om the top of th
5740: 65 0a 20 2a 09 63 68 61 6e 6e 65 6c 20 73 74 61  e. *.channel sta
5750: 63 6b 20 69 66 20 69 74 20 69 73 20 61 20 64 69  ck if it is a di
5760: 67 65 73 74 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a  gest channel.. *
5770: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09  . * Returns:. *.
5780: 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52  TCL_OK or TCL_ER
5790: 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ROR. *. * Side e
57a0: 66 66 65 63 74 73 3a 0a 20 2a 09 52 65 6d 6f 76  ffects:. *.Remov
57b0: 65 73 20 74 72 61 6e 73 66 6f 72 6d 20 66 72 6f  es transform fro
57c0: 6d 20 63 68 61 6e 6e 65 6c 20 6f 72 20 73 65 74  m channel or set
57d0: 73 20 72 65 73 75 6c 74 20 74 6f 20 65 72 72 6f  s result to erro
57e0: 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a  r message.. *. *
57f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5830: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
5840: 63 20 69 6e 74 0a 55 6e 73 74 61 63 6b 4f 62 6a  c int.UnstackObj
5850: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63  Cmd(ClientData c
5860: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
5870: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
5880: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
5890: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20   *const objv[]) 
58a0: 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65  {.    Tcl_Channe
58b0: 6c 20 63 68 61 6e 3b 0a 20 20 20 20 69 6e 74 20  l chan;.    int 
58c0: 6d 6f 64 65 3b 20 2f 2a 20 4f 52 2d 65 64 20 63  mode; /* OR-ed c
58d0: 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 54 43  ombination of TC
58e0: 4c 5f 52 45 41 44 41 42 4c 45 20 61 6e 64 20 54  L_READABLE and T
58f0: 43 4c 5f 57 52 49 54 41 42 4c 45 20 20 2a 2f 0a  CL_WRITABLE  */.
5900: 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 65  .    /* Validate
5910: 20 61 72 67 20 63 6f 75 6e 74 20 2a 2f 0a 20 20   arg count */.  
5920: 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29    if (objc != 2)
5930: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d   {..Tcl_WrongNum
5940: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
5950: 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29  objv, "channel")
5960: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
5970: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
5980: 2f 2a 20 47 65 74 20 63 68 61 6e 6e 65 6c 20 2a  /* Get channel *
5990: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  /.    chan = Tcl
59a0: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65  _GetChannel(inte
59b0: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
59c0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d  gFromObj(objv[1]
59d0: 2c 20 4e 55 4c 4c 29 2c 20 26 6d 6f 64 65 29 3b  , NULL), &mode);
59e0: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d  .    if (chan ==
59f0: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e   (Tcl_Channel) N
5a00: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  ULL) {..return T
5a10: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
5a20: 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
5a30: 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20  e to operate on 
5a40: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e  the topmost chan
5a50: 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20  nel */.    chan 
5a60: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e  = Tcl_GetTopChan
5a70: 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20  nel(chan);..    
5a80: 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 69 67 65  /* Check if dige
5a90: 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20  st channel */.  
5aa0: 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61    if (Tcl_GetCha
5ab0: 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21  nnelType(chan) !
5ac0: 3d 20 26 64 69 67 65 73 74 43 68 61 6e 6e 65 6c  = &digestChannel
5ad0: 54 79 70 65 29 20 7b 0a 09 54 63 6c 5f 41 70 70  Type) {..Tcl_App
5ae0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
5af0: 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c  , "bad channel \
5b00: 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  "", Tcl_GetChann
5b10: 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20  elName(chan),.. 
5b20: 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 64 69     "\": not a di
5b30: 67 65 73 74 20 63 68 61 6e 6e 65 6c 22 2c 20 4e  gest channel", N
5b40: 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72  ULL);..Tcl_SetEr
5b50: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
5b60: 22 54 4c 53 22 2c 20 22 55 4e 53 54 41 43 4b 22  "TLS", "UNSTACK"
5b70: 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e  , "CHANNEL", "IN
5b80: 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29  VALID", (char *)
5b90: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
5ba0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
5bb0: 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 20 74 72 61  ..    /* Pop tra
5bc0: 6e 73 66 6f 72 6d 20 66 72 6f 6d 20 63 68 61 6e  nsform from chan
5bd0: 6e 65 6c 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  nel */.    retur
5be0: 6e 20 54 63 6c 5f 55 6e 73 74 61 63 6b 43 68 61  n Tcl_UnstackCha
5bf0: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61  nnel(interp, cha
5c00: 6e 29 3b 0a 20 20 20 20 09 63 6c 69 65 6e 74 44  n);.    .clientD
5c10: 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61  ata = clientData
5c20: 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../**********
5c30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 73 74 61 74  *********/..stat
5c70: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69  ic const char *i
5c80: 6e 73 74 61 6e 63 65 5f 66 6e 73 20 5b 5d 20 3d  nstance_fns [] =
5c90: 20 7b 20 22 66 69 6e 61 6c 69 7a 65 22 2c 20 22   { "finalize", "
5ca0: 75 70 64 61 74 65 22 2c 20 4e 55 4c 4c 20 7d 3b  update", NULL };
5cb0: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
5cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
5d00: 20 49 6e 73 74 61 6e 63 65 4f 62 6a 43 6d 64 20   InstanceObjCmd 
5d10: 2d 2d 0a 20 2a 0a 20 2a 09 48 61 6e 64 6c 65 72  --. *. *.Handler
5d20: 20 66 6f 72 20 64 69 67 65 73 74 20 63 6f 6d 6d   for digest comm
5d30: 61 6e 64 20 69 6e 73 74 61 6e 63 65 73 2e 20 55  and instances. U
5d40: 73 65 64 20 74 6f 20 61 64 64 20 64 61 74 61 20  sed to add data 
5d50: 74 6f 20 68 61 73 68 0a 20 2a 09 66 75 6e 63 74  to hash. *.funct
5d60: 69 6f 6e 20 6f 72 20 72 65 74 72 69 65 76 65 20  ion or retrieve 
5d70: 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 2e 0a  message digest..
5d80: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20   *. * Returns:. 
5d90: 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f  *.TCL_OK or TCL_
5da0: 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65  ERROR. *. * Side
5db0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 41 64 64   effects:. *.Add
5dc0: 73 20 64 61 74 61 20 74 6f 20 68 61 73 68 20 6f  s data to hash o
5dd0: 72 20 72 65 74 75 72 6e 73 20 6d 65 73 73 61 67  r returns messag
5de0: 65 20 64 69 67 65 73 74 0a 20 2a 0a 20 2a 2d 2d  e digest. *. *--
5df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5e30: 2d 0a 20 2a 2f 0a 69 6e 74 20 49 6e 73 74 61 6e  -. */.int Instan
5e40: 63 65 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44  ceObjCmd(ClientD
5e50: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
5e60: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
5e70: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
5e80: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
5e90: 76 5b 5d 29 20 7b 0a 20 20 20 20 44 69 67 65 73  v[]) {.    Diges
5ea0: 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72  tState *statePtr
5eb0: 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20   = (DigestState 
5ec0: 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20  *) clientData;. 
5ed0: 20 20 20 69 6e 74 20 66 6e 2c 20 6c 65 6e 20 3d     int fn, len =
5ee0: 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 62 75   0;.    char *bu
5ef0: 66 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f  f = NULL;..    /
5f00: 2a 20 56 61 6c 69 64 61 74 65 20 61 72 67 20 63  * Validate arg c
5f10: 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20 28  ount */.    if (
5f20: 6f 62 6a 63 20 3c 20 32 20 7c 7c 20 6f 62 6a 63  objc < 2 || objc
5f30: 20 3e 20 33 29 20 7b 0a 09 54 63 6c 5f 57 72 6f   > 3) {..Tcl_Wro
5f40: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
5f50: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 66 75 6e 63  , 1, objv, "func
5f60: 74 69 6f 6e 20 3f 64 61 74 61 3f 22 29 3b 0a 09  tion ?data?");..
5f70: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
5f80: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
5f90: 47 65 74 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  Get function */.
5fa0: 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49      if (Tcl_GetI
5fb0: 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  ndexFromObj(inte
5fc0: 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 69 6e 73  rp, objv[1], ins
5fd0: 74 61 6e 63 65 5f 66 6e 73 2c 20 22 66 75 6e 63  tance_fns, "func
5fe0: 74 69 6f 6e 22 2c 20 30 2c 20 26 66 6e 29 20 21  tion", 0, &fn) !
5ff0: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74  = TCL_OK) {..ret
6000: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
6010: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20     }..    /* Do 
6020: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  function */.    
6030: 69 66 20 28 66 6e 29 20 7b 0a 09 2f 2a 20 47 65  if (fn) {../* Ge
6040: 74 20 64 61 74 61 20 6f 72 20 72 65 74 75 72 6e  t data or return
6050: 20 65 72 72 6f 72 20 69 66 20 6e 6f 6e 65 20 2a   error if none *
6060: 2f 0a 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20 33  /..if (objc == 3
6070: 29 20 7b 0a 09 20 20 20 20 62 75 66 20 3d 20 54  ) {..    buf = T
6080: 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46  cl_GetByteArrayF
6090: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
60a0: 26 6c 65 6e 29 3b 0a 09 7d 20 65 6c 73 65 20 7b  &len);..} else {
60b0: 0a 09 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  ..    Tcl_WrongN
60c0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
60d0: 2c 20 6f 62 6a 76 2c 20 22 75 70 64 61 74 65 20  , objv, "update 
60e0: 64 61 74 61 22 29 3b 0a 09 20 20 20 20 72 65 74  data");..    ret
60f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
6100: 7d 0a 0a 09 2f 2a 20 55 70 64 61 74 65 20 68 61  }.../* Update ha
6110: 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 09  sh function */..
6120: 69 66 20 28 21 54 6c 73 5f 44 69 67 65 73 74 55  if (!Tls_DigestU
6130: 70 64 61 74 65 28 73 74 61 74 65 50 74 72 2c 20  pdate(statePtr, 
6140: 62 75 66 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65  buf, (size_t) le
6150: 6e 2c 20 31 29 29 20 7b 0a 09 20 20 20 20 72 65  n, 1)) {..    re
6160: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6170: 09 7d 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  .}..    } else {
6180: 0a 09 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 68 61  ../* Finalize ha
6190: 73 68 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  sh function and 
61a0: 63 61 6c 63 75 6c 61 74 65 20 6d 65 73 73 61 67  calculate messag
61b0: 65 20 64 69 67 65 73 74 20 2a 2f 0a 09 69 66 20  e digest */..if 
61c0: 28 54 6c 73 5f 44 69 67 65 73 74 46 69 6e 69 61  (Tls_DigestFinia
61d0: 6c 69 7a 65 28 69 6e 74 65 72 70 2c 20 73 74 61  lize(interp, sta
61e0: 74 65 50 74 72 29 20 21 3d 20 54 43 4c 5f 4f 4b  tePtr) != TCL_OK
61f0: 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  ) {..    return 
6200: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09  TCL_ERROR;..}...
6210: 54 63 6c 5f 44 65 6c 65 74 65 43 6f 6d 6d 61 6e  Tcl_DeleteComman
6220: 64 46 72 6f 6d 54 6f 6b 65 6e 28 69 6e 74 65 72  dFromToken(inter
6230: 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 74 6f 6b  p, statePtr->tok
6240: 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  en);.    }.    r
6250: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
6260: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
6270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
62a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
62b0: 49 6e 73 74 61 6e 63 65 44 65 6c 43 61 6c 6c 62  InstanceDelCallb
62c0: 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 20 43 61  ack --. *. *. Ca
62d0: 6c 6c 62 61 63 6b 20 74 6f 20 63 6c 65 61 6e 2d  llback to clean-
62e0: 75 70 20 77 68 65 6e 20 64 69 67 65 73 74 20 69  up when digest i
62f0: 6e 73 74 61 6e 63 65 20 63 6f 6d 6d 61 6e 64 20  nstance command 
6300: 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 2a 0a 20  is deleted.. *. 
6310: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 4e 6f  * Returns:. *.No
6320: 74 68 69 6e 67 0a 20 2a 0a 20 2a 20 53 69 64 65  thing. *. * Side
6330: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 44 65 73   effects:. *.Des
6340: 74 72 6f 79 73 20 73 74 72 75 63 74 0a 20 2a 0a  troys struct. *.
6350: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
6360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6390: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 49  -----. */.void I
63a0: 6e 73 74 61 6e 63 65 44 65 6c 43 61 6c 6c 62 61  nstanceDelCallba
63b0: 63 6b 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  ck(ClientData cl
63c0: 69 65 6e 74 44 61 74 61 29 20 7b 0a 20 20 20 20  ientData) {.    
63d0: 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61  DigestState *sta
63e0: 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53  tePtr = (DigestS
63f0: 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61  tate *) clientDa
6400: 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61  ta;..    /* Clea
6410: 6e 2d 75 70 20 2a 2f 0a 20 20 20 20 54 6c 73 5f  n-up */.    Tls_
6420: 44 69 67 65 73 74 46 72 65 65 28 73 74 61 74 65  DigestFree(state
6430: 50 74 72 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d  Ptr);.}../*. *--
6440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6480: 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 44 69 67 65  -. *. * Tls_Dige
6490: 73 74 49 6e 73 74 61 6e 63 65 20 2d 2d 0a 20 2a  stInstance --. *
64a0: 0a 20 2a 09 20 43 72 65 61 74 65 20 63 6f 6d 6d  . *. Create comm
64b0: 61 6e 64 20 74 6f 20 61 6c 6c 6f 77 20 75 73 65  and to allow use
64c0: 72 20 74 6f 20 61 64 64 20 64 61 74 61 20 74 6f  r to add data to
64d0: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 0a   hash function..
64e0: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20   *. * Returns:. 
64f0: 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f  *.TCL_OK or TCL_
6500: 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65  ERROR. *. * Side
6510: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 72 65   effects:. *.Cre
6520: 61 74 65 73 20 63 6f 6d 6d 61 6e 64 20 6f 72 20  ates command or 
6530: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a  error message. *
6540: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
6550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6580: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 54  ------. */.int T
6590: 6c 73 5f 44 69 67 65 73 74 49 6e 73 74 61 6e 63  ls_DigestInstanc
65a0: 65 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  e(Tcl_Interp *in
65b0: 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63  terp, Tcl_Obj *c
65c0: 6d 64 4f 62 6a 2c 20 63 6f 6e 73 74 20 45 56 50  mdObj, const EVP
65d0: 5f 4d 44 20 2a 6d 64 2c 0a 09 63 6f 6e 73 74 20  _MD *md,..const 
65e0: 45 56 50 5f 43 49 50 48 45 52 20 2a 63 69 70 68  EVP_CIPHER *ciph
65f0: 65 72 2c 20 69 6e 74 20 66 6f 72 6d 61 74 2c 20  er, int format, 
6600: 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4f 62 6a 29  Tcl_Obj *keyObj)
6610: 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74 61   {.    DigestSta
6620: 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 20  te *statePtr;.  
6630: 20 20 63 68 61 72 20 2a 63 6d 64 4e 61 6d 65 20    char *cmdName 
6640: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
6650: 72 6f 6d 4f 62 6a 28 63 6d 64 4f 62 6a 2c 20 4e  romObj(cmdObj, N
6660: 55 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72  ULL);..    /* Cr
6670: 65 61 74 65 20 73 74 61 74 65 20 64 61 74 61 20  eate state data 
6680: 73 74 72 75 63 74 20 2a 2f 0a 20 20 20 20 69 66  struct */.    if
6690: 20 28 28 73 74 61 74 65 50 74 72 20 3d 20 54 6c   ((statePtr = Tl
66a0: 73 5f 44 69 67 65 73 74 4e 65 77 28 69 6e 74 65  s_DigestNew(inte
66b0: 72 70 2c 20 66 6f 72 6d 61 74 29 29 20 3d 3d 20  rp, format)) == 
66c0: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70  NULL) {..Tcl_App
66d0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
66e0: 2c 20 22 4d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  , "Memory alloca
66f0: 74 69 6f 6e 20 65 72 72 6f 72 22 2c 20 28 63 68  tion error", (ch
6700: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65  ar *) NULL);..re
6710: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6720: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e      }..    /* In
6730: 69 74 69 61 6c 69 7a 65 20 68 61 73 68 20 66 75  itialize hash fu
6740: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66  nction */.    if
6750: 20 28 54 6c 73 5f 44 69 67 65 73 74 49 6e 69 74   (Tls_DigestInit
6760: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
6770: 72 2c 20 6d 64 2c 20 63 69 70 68 65 72 2c 20 6b  r, md, cipher, k
6780: 65 79 4f 62 6a 29 20 21 3d 20 54 43 4c 5f 4f 4b  eyObj) != TCL_OK
6790: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
67a0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
67b0: 20 20 2f 2a 20 43 72 65 61 74 65 20 69 6e 73 74    /* Create inst
67c0: 61 6e 63 65 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  ance command */.
67d0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 74 6f      statePtr->to
67e0: 6b 65 6e 20 3d 20 54 63 6c 5f 43 72 65 61 74 65  ken = Tcl_Create
67f0: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
6800: 70 2c 20 63 6d 64 4e 61 6d 65 2c 20 49 6e 73 74  p, cmdName, Inst
6810: 61 6e 63 65 4f 62 6a 43 6d 64 2c 0a 09 28 43 6c  anceObjCmd,..(Cl
6820: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50  ientData) stateP
6830: 74 72 2c 20 49 6e 73 74 61 6e 63 65 44 65 6c 43  tr, InstanceDelC
6840: 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f  allback);..    /
6850: 2a 20 52 65 74 75 72 6e 20 63 6f 6d 6d 61 6e 64  * Return command
6860: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 54 63 6c   name */.    Tcl
6870: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
6880: 74 65 72 70 2c 20 63 6d 64 4f 62 6a 29 3b 0a 20  terp, cmdObj);. 
6890: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
68a0: 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}.../*********
68b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
68c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
68d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
68e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
68f0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
6900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6930: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f  -----. *. * Tls_
6940: 44 69 67 65 73 74 44 61 74 61 20 2d 2d 0a 20 2a  DigestData --. *
6950: 0a 20 2a 09 52 65 74 75 72 6e 20 6d 65 73 73 61  . *.Return messa
6960: 67 65 20 64 69 67 65 73 74 20 66 6f 72 20 64 61  ge digest for da
6970: 74 61 20 75 73 69 6e 67 20 75 73 65 72 20 73 70  ta using user sp
6980: 65 63 69 66 69 65 64 20 68 61 73 68 20 66 75 6e  ecified hash fun
6990: 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74  ction.. *. * Ret
69a0: 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20  urns:. *.TCL_OK 
69b0: 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a  or TCL_ERROR. *.
69c0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
69d0: 0a 20 2a 09 53 65 74 73 20 72 65 73 75 6c 74 20  . *.Sets result 
69e0: 74 6f 20 6d 65 73 73 61 67 65 20 64 69 67 65 73  to message diges
69f0: 74 20 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61  t or error messa
6a00: 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  ge. *. *--------
6a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
6a50: 69 6e 74 0a 54 6c 73 5f 44 69 67 65 73 74 44 61  int.Tls_DigestDa
6a60: 74 61 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  ta(Tcl_Interp *i
6a70: 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a  nterp, Tcl_Obj *
6a80: 64 61 74 61 4f 62 6a 2c 20 63 6f 6e 73 74 20 45  dataObj, const E
6a90: 56 50 5f 4d 44 20 2a 6d 64 2c 0a 09 63 6f 6e 73  VP_MD *md,..cons
6aa0: 74 20 45 56 50 5f 43 49 50 48 45 52 20 2a 63 69  t EVP_CIPHER *ci
6ab0: 70 68 65 72 2c 20 69 6e 74 20 66 6f 72 6d 61 74  pher, int format
6ac0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4f 62  , Tcl_Obj *keyOb
6ad0: 6a 29 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 64  j) {.    char *d
6ae0: 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 64 61 74  ata;.    int dat
6af0: 61 5f 6c 65 6e 3b 0a 20 20 20 20 44 69 67 65 73  a_len;.    Diges
6b00: 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72  tState *statePtr
6b10: 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 64 61  ;..    /* Get da
6b20: 74 61 20 2a 2f 0a 20 20 20 20 64 61 74 61 20 3d  ta */.    data =
6b30: 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61   Tcl_GetByteArra
6b40: 79 46 72 6f 6d 4f 62 6a 28 64 61 74 61 4f 62 6a  yFromObj(dataObj
6b50: 2c 20 26 64 61 74 61 5f 6c 65 6e 29 3b 0a 20 20  , &data_len);.  
6b60: 20 20 69 66 20 28 64 61 74 61 20 3d 3d 20 4e 55    if (data == NU
6b70: 4c 4c 20 7c 7c 20 64 61 74 61 5f 6c 65 6e 20 3d  LL || data_len =
6b80: 3d 20 30 29 20 7b 0a 09 54 63 6c 5f 53 65 74 52  = 0) {..Tcl_SetR
6b90: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e  esult(interp, "N
6ba0: 6f 20 64 61 74 61 22 2c 20 4e 55 4c 4c 29 3b 0a  o data", NULL);.
6bb0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
6bc0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
6bd0: 20 43 72 65 61 74 65 20 73 74 61 74 65 20 73 74   Create state st
6be0: 72 75 63 74 20 2a 2f 0a 20 20 20 20 69 66 20 28  ruct */.    if (
6bf0: 28 73 74 61 74 65 50 74 72 20 3d 20 54 6c 73 5f  (statePtr = Tls_
6c00: 44 69 67 65 73 74 4e 65 77 28 69 6e 74 65 72 70  DigestNew(interp
6c10: 2c 20 66 6f 72 6d 61 74 29 29 20 3d 3d 20 4e 55  , format)) == NU
6c20: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  LL) {..Tcl_Appen
6c30: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
6c40: 22 4d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69  "Memory allocati
6c50: 6f 6e 20 65 72 72 6f 72 22 2c 20 28 63 68 61 72  on error", (char
6c60: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75   *) NULL);..retu
6c70: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
6c80: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 63    }..    /* Calc
6c90: 20 44 69 67 65 73 74 20 2a 2f 0a 20 20 20 20 69   Digest */.    i
6ca0: 66 20 28 54 6c 73 5f 44 69 67 65 73 74 49 6e 69  f (Tls_DigestIni
6cb0: 74 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50  t(interp, stateP
6cc0: 74 72 2c 20 6d 64 2c 20 63 69 70 68 65 72 2c 20  tr, md, cipher, 
6cd0: 6b 65 79 4f 62 6a 29 20 21 3d 20 54 43 4c 5f 4f  keyObj) != TCL_O
6ce0: 4b 20 7c 7c 0a 09 54 6c 73 5f 44 69 67 65 73 74  K ||..Tls_Digest
6cf0: 55 70 64 61 74 65 28 73 74 61 74 65 50 74 72 2c  Update(statePtr,
6d00: 20 64 61 74 61 2c 20 28 73 69 7a 65 5f 74 29 20   data, (size_t) 
6d10: 6c 65 6e 2c 20 31 29 20 3d 3d 20 30 20 7c 7c 0a  len, 1) == 0 ||.
6d20: 09 54 6c 73 5f 44 69 67 65 73 74 46 69 6e 69 61  .Tls_DigestFinia
6d30: 6c 69 7a 65 28 69 6e 74 65 72 70 2c 20 73 74 61  lize(interp, sta
6d40: 74 65 50 74 72 29 20 21 3d 20 54 43 4c 5f 4f 4b  tePtr) != TCL_OK
6d50: 29 20 7b 0a 09 54 6c 73 5f 44 69 67 65 73 74 46  ) {..Tls_DigestF
6d60: 72 65 65 28 73 74 61 74 65 50 74 72 29 3b 0a 09  ree(statePtr);..
6d70: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
6d80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 6c 73 5f  ;.    }.    Tls_
6d90: 44 69 67 65 73 74 46 72 65 65 28 73 74 61 74 65  DigestFree(state
6da0: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Ptr);.    return
6db0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 2a 2a   TCL_OK;.}../***
6dc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6dd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6de0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6df0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6e00: 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  /../*. *--------
6e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
6e50: 2a 20 54 6c 73 5f 44 69 67 65 73 74 46 69 6c 65  * Tls_DigestFile
6e60: 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 75 72 6e   --. *. *.Return
6e70: 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20   message digest 
6e80: 66 6f 72 20 66 69 6c 65 20 75 73 69 6e 67 20 75  for file using u
6e90: 73 65 72 20 73 70 65 63 69 66 69 65 64 20 68 61  ser specified ha
6ea0: 73 68 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 0a  sh function.. *.
6eb0: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54   * Returns:. *.T
6ec0: 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52  CL_OK or TCL_ERR
6ed0: 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  OR. *. * Side ef
6ee0: 66 65 63 74 73 3a 0a 20 2a 09 52 65 73 75 6c 74  fects:. *.Result
6ef0: 20 69 73 20 6d 65 73 73 61 67 65 20 64 69 67 65   is message dige
6f00: 73 74 20 6f 72 20 65 72 72 6f 72 20 6d 65 73 73  st or error mess
6f10: 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  age. *. *-------
6f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
6f60: 0a 69 6e 74 20 54 6c 73 5f 44 69 67 65 73 74 46  .int Tls_DigestF
6f70: 69 6c 65 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ile(Tcl_Interp *
6f80: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20  interp, Tcl_Obj 
6f90: 2a 66 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74  *filename, const
6fa0: 20 45 56 50 5f 4d 44 20 2a 6d 64 2c 0a 09 63 6f   EVP_MD *md,..co
6fb0: 6e 73 74 20 45 56 50 5f 43 49 50 48 45 52 20 2a  nst EVP_CIPHER *
6fc0: 63 69 70 68 65 72 2c 20 69 6e 74 20 66 6f 72 6d  cipher, int form
6fd0: 61 74 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79  at, Tcl_Obj *key
6fe0: 4f 62 6a 29 20 7b 0a 20 20 20 20 44 69 67 65 73  Obj) {.    Diges
6ff0: 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72  tState *statePtr
7000: 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65  ;.    Tcl_Channe
7010: 6c 20 63 68 61 6e 20 3d 20 4e 55 4c 4c 3b 0a 20  l chan = NULL;. 
7020: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
7030: 20 62 75 66 5b 42 55 46 46 45 52 5f 53 49 5a 45   buf[BUFFER_SIZE
7040: 5d 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 20 3d  ];.    int res =
7050: 20 54 43 4c 5f 4f 4b 2c 20 6c 65 6e 3b 0a 0a 20   TCL_OK, len;.. 
7060: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 73 74 61     /* Create sta
7070: 74 65 20 64 61 74 61 20 73 74 72 75 63 74 20 2a  te data struct *
7080: 2f 0a 20 20 20 20 69 66 20 28 28 73 74 61 74 65  /.    if ((state
7090: 50 74 72 20 3d 20 54 6c 73 5f 44 69 67 65 73 74  Ptr = Tls_Digest
70a0: 4e 65 77 28 69 6e 74 65 72 70 2c 20 66 6f 72 6d  New(interp, form
70b0: 61 74 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  at)) == NULL) {.
70c0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
70d0: 74 28 69 6e 74 65 72 70 2c 20 22 4d 65 6d 6f 72  t(interp, "Memor
70e0: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
70f0: 6f 72 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  or", (char *) NU
7100: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
7110: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
7120: 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20     /* Open file 
7130: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63  channel */.    c
7140: 68 61 6e 20 3d 20 54 63 6c 5f 46 53 4f 70 65 6e  han = Tcl_FSOpen
7150: 46 69 6c 65 43 68 61 6e 6e 65 6c 28 69 6e 74 65  FileChannel(inte
7160: 72 70 2c 20 66 69 6c 65 6e 61 6d 65 2c 20 22 72  rp, filename, "r
7170: 62 22 2c 20 30 34 34 34 29 3b 0a 20 20 20 20 69  b", 0444);.    i
7180: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f  f (chan == (Tcl_
7190: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
71a0: 0a 09 54 6c 73 5f 44 69 67 65 73 74 46 72 65 65  ..Tls_DigestFree
71b0: 28 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74  (statePtr);..ret
71c0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
71d0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e     }..    /* Con
71e0: 66 69 67 75 72 65 20 63 68 61 6e 6e 65 6c 20 2a  figure channel *
71f0: 2f 0a 20 20 20 20 69 66 20 28 28 72 65 73 20 3d  /.    if ((res =
7200: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_SetChannelO
7210: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68  ption(interp, ch
7220: 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f  an, "-translatio
7230: 6e 22 2c 20 22 62 69 6e 61 72 79 22 29 29 20 3d  n", "binary")) =
7240: 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09  = TCL_ERROR) {..
7250: 67 6f 74 6f 20 64 6f 6e 65 3b 0a 20 20 20 20 7d  goto done;.    }
7260: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e  .    Tcl_SetChan
7270: 6e 65 6c 42 75 66 66 65 72 53 69 7a 65 28 63 68  nelBufferSize(ch
7280: 61 6e 2c 20 42 55 46 46 45 52 5f 53 49 5a 45 29  an, BUFFER_SIZE)
7290: 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  ;..    /* Initia
72a0: 6c 69 7a 65 20 68 61 73 68 20 66 75 6e 63 74 69  lize hash functi
72b0: 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 72  on */.    if ((r
72c0: 65 73 20 3d 20 54 6c 73 5f 44 69 67 65 73 74 49  es = Tls_DigestI
72d0: 6e 69 74 28 69 6e 74 65 72 70 2c 20 73 74 61 74  nit(interp, stat
72e0: 65 50 74 72 2c 20 6d 64 2c 20 63 69 70 68 65 72  ePtr, md, cipher
72f0: 2c 20 6b 65 79 4f 62 6a 29 29 20 21 3d 20 54 43  , keyObj)) != TC
7300: 4c 5f 4f 4b 29 20 7b 0a 09 67 6f 74 6f 20 64 6f  L_OK) {..goto do
7310: 6e 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ne;.    }..    /
7320: 2a 20 52 65 61 64 20 66 69 6c 65 20 64 61 74 61  * Read file data
7330: 20 61 6e 64 20 75 70 64 61 74 65 20 68 61 73 68   and update hash
7340: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20   function */.   
7350: 20 77 68 69 6c 65 20 28 21 54 63 6c 5f 45 6f 66   while (!Tcl_Eof
7360: 28 63 68 61 6e 29 29 20 7b 0a 09 6c 65 6e 20 3d  (chan)) {..len =
7370: 20 54 63 6c 5f 52 65 61 64 52 61 77 28 63 68 61   Tcl_ReadRaw(cha
7380: 6e 2c 20 28 63 68 61 72 20 2a 29 20 62 75 66 2c  n, (char *) buf,
7390: 20 42 55 46 46 45 52 5f 53 49 5a 45 29 3b 0a 09   BUFFER_SIZE);..
73a0: 69 66 20 28 6c 65 6e 20 3e 20 30 29 20 7b 0a 09  if (len > 0) {..
73b0: 20 20 20 20 69 66 20 28 21 54 6c 73 5f 44 69 67      if (!Tls_Dig
73c0: 65 73 74 55 70 64 61 74 65 28 73 74 61 74 65 50  estUpdate(stateP
73d0: 74 72 2c 20 26 62 75 66 5b 30 5d 2c 20 28 73 69  tr, &buf[0], (si
73e0: 7a 65 5f 74 29 20 6c 65 6e 2c 20 31 29 29 20 7b  ze_t) len, 1)) {
73f0: 0a 09 09 72 65 73 20 3d 20 54 43 4c 5f 45 52 52  ...res = TCL_ERR
7400: 4f 52 3b 0a 09 09 67 6f 74 6f 20 64 6f 6e 65 3b  OR;...goto done;
7410: 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d  ..    }..}.    }
7420: 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a  ..    /* Finaliz
7430: 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20  e hash function 
7440: 61 6e 64 20 63 61 6c 63 75 6c 61 74 65 20 6d 65  and calculate me
7450: 73 73 61 67 65 20 64 69 67 65 73 74 20 2a 2f 0a  ssage digest */.
7460: 20 20 20 20 72 65 73 20 3d 20 54 6c 73 5f 44 69      res = Tls_Di
7470: 67 65 73 74 46 69 6e 69 61 6c 69 7a 65 28 69 6e  gestFinialize(in
7480: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 29 3b  terp, statePtr);
7490: 0a 0a 64 6f 6e 65 3a 0a 20 20 20 20 2f 2a 20 43  ..done:.    /* C
74a0: 6c 6f 73 65 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  lose channel */.
74b0: 20 20 20 20 69 66 20 28 54 63 6c 5f 43 6c 6f 73      if (Tcl_Clos
74c0: 65 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 20  e(interp, chan) 
74d0: 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a  == TCL_ERROR) {.
74e0: 09 72 65 73 20 3d 20 54 43 4c 5f 45 52 52 4f 52  .res = TCL_ERROR
74f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
7500: 43 6c 65 61 6e 2d 75 70 20 2a 2f 0a 20 20 20 20  Clean-up */.    
7510: 54 6c 73 5f 44 69 67 65 73 74 46 72 65 65 28 73  Tls_DigestFree(s
7520: 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 72 65  tatePtr);.    re
7530: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 2a  turn res;.}../**
7540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7580: 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  */../*. *-------
7590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
75a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
75b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
75c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
75d0: 20 2a 20 44 69 67 65 73 74 4d 61 69 6e 20 2d 2d   * DigestMain --
75e0: 0a 20 2a 0a 20 2a 09 52 65 74 75 72 6e 20 6d 65  . *. *.Return me
75f0: 73 73 61 67 65 20 64 69 67 65 73 74 20 6f 72 20  ssage digest or 
7600: 4d 65 73 73 61 67 65 20 41 75 74 68 65 6e 74 69  Message Authenti
7610: 63 61 74 69 6f 6e 20 43 6f 64 65 20 28 4d 41 43  cation Code (MAC
7620: 29 20 6f 66 0a 20 2a 09 64 61 74 61 20 75 73 69  ) of. *.data usi
7630: 6e 67 20 75 73 65 72 20 73 70 65 63 69 66 69 65  ng user specifie
7640: 64 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e  d hash function.
7650: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a  . *. * Returns:.
7660: 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c   *.TCL_OK or TCL
7670: 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64  _ERROR. *. * Sid
7680: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65  e effects:. *.Se
7690: 74 73 20 72 65 73 75 6c 74 20 74 6f 20 6d 65 73  ts result to mes
76a0: 73 61 67 65 20 64 69 67 65 73 74 20 6f 72 20 65  sage digest or e
76b0: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a  rror message. *.
76c0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
76d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
76e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
76f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7700: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
7710: 20 69 6e 74 20 44 69 67 65 73 74 4d 61 69 6e 28   int DigestMain(
7720: 69 6e 74 20 74 79 70 65 2c 20 54 63 6c 5f 49 6e  int type, Tcl_In
7730: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
7740: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
7750: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b  *const objv[]) {
7760: 0a 20 20 20 20 69 6e 74 20 69 64 78 2c 20 6c 65  .    int idx, le
7770: 6e 2c 20 66 6f 72 6d 61 74 20 3d 20 48 45 58 5f  n, format = HEX_
7780: 46 4f 52 4d 41 54 2c 20 72 65 73 20 3d 20 54 43  FORMAT, res = TC
7790: 4c 5f 4f 4b 2c 20 66 6c 61 67 73 20 3d 20 30 3b  L_OK, flags = 0;
77a0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
77b0: 2a 64 69 67 65 73 74 4e 61 6d 65 2c 20 2a 63 68  *digestName, *ch
77c0: 61 6e 6e 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20  annel = NULL;.  
77d0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 4f 62    Tcl_Obj *cmdOb
77e0: 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 64 61 74 61 4f  j = NULL, *dataO
77f0: 62 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 66 69 6c 65  bj = NULL, *file
7800: 4f 62 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 6b 65 79  Obj = NULL, *key
7810: 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  Obj = NULL;.    
7820: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63  unsigned char *c
7830: 69 70 68 65 72 4e 61 6d 65 20 3d 20 4e 55 4c 4c  ipherName = NULL
7840: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45 56 50 5f  ;.    const EVP_
7850: 4d 44 20 2a 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20  MD *md = NULL;. 
7860: 20 20 20 63 6f 6e 73 74 20 45 56 50 5f 43 49 50     const EVP_CIP
7870: 48 45 52 20 2a 63 69 70 68 65 72 20 3d 20 4e 55  HER *cipher = NU
7880: 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61  LL;..    /* Clea
7890: 72 20 69 6e 74 65 72 70 20 72 65 73 75 6c 74 20  r interp result 
78a0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74  */.    Tcl_Reset
78b0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
78c0: 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 65  .    /* Validate
78d0: 20 61 72 67 20 63 6f 75 6e 74 20 2a 2f 0a 20 20   arg count */.  
78e0: 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 33 20 7c    if (objc < 3 |
78f0: 7c 20 6f 62 6a 63 20 3e 20 31 32 29 20 7b 0a 09  | objc > 12) {..
7900: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
7910: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
7920: 2c 20 22 3f 2d 62 69 6e 7c 2d 68 65 78 3f 20 3f  , "?-bin|-hex? ?
7930: 2d 63 69 70 68 65 72 20 6e 61 6d 65 3f 20 3f 2d  -cipher name? ?-
7940: 64 69 67 65 73 74 20 6e 61 6d 65 3f 20 3f 2d 6b  digest name? ?-k
7950: 65 79 20 6b 65 79 3f 20 5b 2d 63 68 61 6e 6e 65  ey key? [-channe
7960: 6c 20 63 68 61 6e 20 7c 20 2d 63 6f 6d 6d 61 6e  l chan | -comman
7970: 64 20 63 6d 64 4e 61 6d 65 20 7c 20 2d 66 69 6c  d cmdName | -fil
7980: 65 20 66 69 6c 65 6e 61 6d 65 20 7c 20 3f 2d 64  e filename | ?-d
7990: 61 74 61 3f 20 64 61 74 61 5d 22 29 3b 0a 09 72  ata? data]");..r
79a0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
79b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f  .    }..    /* O
79c0: 70 74 69 6d 61 6c 20 63 61 73 65 20 66 6f 72 20  ptimal case for 
79d0: 61 20 64 69 67 65 73 74 20 61 6e 64 20 62 6c 6f  a digest and blo
79e0: 62 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 20  b of data */.   
79f0: 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 33 20 26   if (objc == 3 &
7a00: 26 20 74 79 70 65 20 3d 3d 20 54 59 50 45 5f 4d  & type == TYPE_M
7a10: 44 29 20 7b 0a 09 64 69 67 65 73 74 4e 61 6d 65  D) {..digestName
7a20: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
7a30: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c  FromObj(objv[1],
7a40: 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 28 6d 64 20  NULL);..if ((md 
7a50: 3d 20 45 56 50 5f 67 65 74 5f 64 69 67 65 73 74  = EVP_get_digest
7a60: 62 79 6e 61 6d 65 28 64 69 67 65 73 74 4e 61 6d  byname(digestNam
7a70: 65 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  e)) != NULL) {..
7a80: 20 20 20 20 72 65 74 75 72 6e 20 54 6c 73 5f 44      return Tls_D
7a90: 69 67 65 73 74 44 61 74 61 28 69 6e 74 65 72 70  igestData(interp
7aa0: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 6d 64 2c 20 4e  , objv[2], md, N
7ab0: 55 4c 4c 2c 20 48 45 58 5f 46 4f 52 4d 41 54 20  ULL, HEX_FORMAT 
7ac0: 7c 20 54 59 50 45 5f 4d 44 2c 20 4e 55 4c 4c 29  | TYPE_MD, NULL)
7ad0: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20  ;..} else {..   
7ae0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
7af0: 74 28 69 6e 74 65 72 70 2c 20 22 49 6e 76 61 6c  t(interp, "Inval
7b00: 69 64 20 64 69 67 65 73 74 20 5c 22 22 2c 20 64  id digest \"", d
7b10: 69 67 65 73 74 4e 61 6d 65 2c 20 22 5c 22 22 2c  igestName, "\"",
7b20: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74   NULL);..    ret
7b30: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
7b40: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
7b50: 47 65 74 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a 20  Get options */. 
7b60: 20 20 20 66 6f 72 20 28 69 64 78 20 3d 20 32 3b     for (idx = 2;
7b70: 20 69 64 78 20 3c 20 6f 62 6a 63 2d 31 3b 20 69   idx < objc-1; i
7b80: 64 78 2b 2b 29 20 7b 0a 09 63 68 61 72 20 2a 6f  dx++) {..char *o
7b90: 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  pt = Tcl_GetStri
7ba0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69  ngFromObj(objv[i
7bb0: 64 78 5d 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66  dx], NULL);...if
7bc0: 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d 27 29   (opt[0] != '-')
7bd0: 20 7b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09   {..    break;..
7be0: 7d 0a 0a 09 4f 50 54 46 4c 41 47 28 22 2d 62 69  }...OPTFLAG("-bi
7bf0: 6e 22 2c 20 66 6f 72 6d 61 74 2c 20 42 49 4e 5f  n", format, BIN_
7c00: 46 4f 52 4d 41 54 29 3b 0a 09 4f 50 54 46 4c 41  FORMAT);..OPTFLA
7c10: 47 28 22 2d 62 69 6e 61 72 79 22 2c 20 66 6f 72  G("-binary", for
7c20: 6d 61 74 2c 20 42 49 4e 5f 46 4f 52 4d 41 54 29  mat, BIN_FORMAT)
7c30: 3b 0a 09 4f 50 54 46 4c 41 47 28 22 2d 68 65 78  ;..OPTFLAG("-hex
7c40: 22 2c 20 66 6f 72 6d 61 74 2c 20 48 45 58 5f 46  ", format, HEX_F
7c50: 4f 52 4d 41 54 29 3b 0a 09 4f 50 54 46 4c 41 47  ORMAT);..OPTFLAG
7c60: 28 22 2d 68 65 78 61 64 65 63 69 6d 61 6c 22 2c  ("-hexadecimal",
7c70: 20 66 6f 72 6d 61 74 2c 20 48 45 58 5f 46 4f 52   format, HEX_FOR
7c80: 4d 41 54 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d  MAT);..OPTSTR("-
7c90: 63 68 61 6e 22 2c 20 63 68 61 6e 6e 65 6c 29 3b  chan", channel);
7ca0: 0a 09 4f 50 54 53 54 52 28 22 2d 63 68 61 6e 6e  ..OPTSTR("-chann
7cb0: 65 6c 22 2c 20 63 68 61 6e 6e 65 6c 29 3b 0a 09  el", channel);..
7cc0: 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 22  OPTSTR("-cipher"
7cd0: 2c 20 63 69 70 68 65 72 4e 61 6d 65 29 3b 0a 09  , cipherName);..
7ce0: 4f 50 54 4f 42 4a 28 22 2d 63 6f 6d 6d 61 6e 64  OPTOBJ("-command
7cf0: 22 2c 20 63 6d 64 4f 62 6a 29 3b 0a 09 4f 50 54  ", cmdObj);..OPT
7d00: 4f 42 4a 28 22 2d 64 61 74 61 22 2c 20 64 61 74  OBJ("-data", dat
7d10: 61 4f 62 6a 29 3b 0a 09 4f 50 54 53 54 52 28 22  aObj);..OPTSTR("
7d20: 2d 64 69 67 65 73 74 22 2c 20 64 69 67 65 73 74  -digest", digest
7d30: 4e 61 6d 65 29 3b 0a 09 4f 50 54 4f 42 4a 28 22  Name);..OPTOBJ("
7d40: 2d 66 69 6c 65 22 2c 20 66 69 6c 65 4f 62 6a 29  -file", fileObj)
7d50: 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 66 69 6c 65  ;..OPTOBJ("-file
7d60: 6e 61 6d 65 22 2c 20 66 69 6c 65 4f 62 6a 29 3b  name", fileObj);
7d70: 0a 09 4f 50 54 4f 42 4a 28 22 2d 6b 65 79 22 2c  ..OPTOBJ("-key",
7d80: 20 6b 65 79 4f 62 6a 29 3b 0a 0a 09 4f 50 54 42   keyObj);...OPTB
7d90: 41 44 28 22 6f 70 74 69 6f 6e 22 2c 20 22 2d 62  AD("option", "-b
7da0: 69 6e 2c 20 2d 63 68 61 6e 6e 65 6c 2c 20 2d 63  in, -channel, -c
7db0: 69 70 68 65 72 2c 20 2d 63 6f 6d 6d 61 6e 64 2c  ipher, -command,
7dc0: 20 2d 64 61 74 61 2c 20 2d 64 69 67 65 73 74 2c   -data, -digest,
7dd0: 20 2d 66 69 6c 65 2c 20 2d 66 69 6c 65 6e 61 6d   -file, -filenam
7de0: 65 2c 20 2d 68 65 78 2c 20 6f 72 20 2d 6b 65 79  e, -hex, or -key
7df0: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ");..return TCL_
7e00: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
7e10: 20 20 2f 2a 20 49 66 20 6e 6f 20 6f 70 74 69 6f    /* If no optio
7e20: 6e 20 66 6f 72 20 6c 61 73 74 20 61 72 67 2c 20  n for last arg, 
7e30: 74 68 65 6e 20 69 74 73 20 74 68 65 20 64 61 74  then its the dat
7e40: 61 20 2a 2f 0a 20 20 20 20 69 66 20 28 69 64 78  a */.    if (idx
7e50: 20 3c 20 6f 62 6a 63 29 20 7b 0a 09 64 61 74 61   < objc) {..data
7e60: 4f 62 6a 20 3d 20 6f 62 6a 76 5b 69 64 78 5d 3b  Obj = objv[idx];
7e70: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
7e80: 65 74 20 63 69 70 68 65 72 20 2a 2f 0a 20 20 20  et cipher */.   
7e90: 20 69 66 20 28 63 69 70 68 65 72 4e 61 6d 65 20   if (cipherName 
7ea0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 69 70 68  != NULL) {..ciph
7eb0: 65 72 20 3d 20 45 56 50 5f 67 65 74 5f 63 69 70  er = EVP_get_cip
7ec0: 68 65 72 62 79 6e 61 6d 65 28 63 69 70 68 65 72  herbyname(cipher
7ed0: 4e 61 6d 65 29 3b 0a 09 74 79 70 65 20 3d 20 54  Name);..type = T
7ee0: 59 50 45 5f 43 4d 41 43 3b 0a 09 69 66 20 28 63  YPE_CMAC;..if (c
7ef0: 69 70 68 65 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b  ipher == NULL) {
7f00: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
7f10: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
7f20: 49 6e 76 61 6c 69 64 20 63 69 70 68 65 72 20 5c  Invalid cipher \
7f30: 22 22 2c 20 63 69 70 68 65 72 4e 61 6d 65 2c 20  "", cipherName, 
7f40: 22 5c 22 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20  "\"", NULL);..  
7f50: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
7f60: 4f 52 3b 0a 09 7d 0a 0a 20 20 20 20 7d 20 65 6c  OR;..}..    } el
7f70: 73 65 20 69 66 20 28 74 79 70 65 20 3d 3d 20 54  se if (type == T
7f80: 59 50 45 5f 43 4d 41 43 29 20 7b 0a 09 54 63 6c  YPE_CMAC) {..Tcl
7f90: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
7fa0: 74 65 72 70 2c 20 22 4e 6f 20 63 69 70 68 65 72  terp, "No cipher
7fb0: 20 73 70 65 63 69 66 69 65 64 22 2c 20 4e 55 4c   specified", NUL
7fc0: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  L);..return TCL_
7fd0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
7fe0: 20 20 2f 2a 20 47 65 74 20 64 69 67 65 73 74 20    /* Get digest 
7ff0: 2a 2f 0a 20 20 20 20 69 66 20 28 64 69 67 65 73  */.    if (diges
8000: 74 4e 61 6d 65 20 21 3d 20 4e 55 4c 4c 29 20 7b  tName != NULL) {
8010: 0a 09 6d 64 20 3d 20 45 56 50 5f 67 65 74 5f 64  ..md = EVP_get_d
8020: 69 67 65 73 74 62 79 6e 61 6d 65 28 64 69 67 65  igestbyname(dige
8030: 73 74 4e 61 6d 65 29 3b 0a 09 69 66 20 28 6d 64  stName);..if (md
8040: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   == NULL) {..   
8050: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8060: 74 28 69 6e 74 65 72 70 2c 20 22 49 6e 76 61 6c  t(interp, "Inval
8070: 69 64 20 64 69 67 65 73 74 20 5c 22 22 2c 20 64  id digest \"", d
8080: 69 67 65 73 74 4e 61 6d 65 2c 20 22 5c 22 22 2c  igestName, "\"",
8090: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74   NULL);..    ret
80a0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
80b0: 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  }.    } else if 
80c0: 28 74 79 70 65 20 3d 3d 20 54 59 50 45 5f 4d 44  (type == TYPE_MD
80d0: 20 7c 7c 20 74 79 70 65 20 3d 3d 20 54 59 50 45   || type == TYPE
80e0: 5f 48 4d 41 43 29 20 7b 0a 09 54 63 6c 5f 41 70  _HMAC) {..Tcl_Ap
80f0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
8100: 70 2c 20 22 4e 6f 20 64 69 67 65 73 74 20 73 70  p, "No digest sp
8110: 65 63 69 66 69 65 64 22 2c 20 4e 55 4c 4c 29 3b  ecified", NULL);
8120: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
8130: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
8140: 2a 20 47 65 74 20 6b 65 79 20 2a 2f 0a 20 20 20  * Get key */.   
8150: 20 69 66 20 28 6b 65 79 4f 62 6a 20 21 3d 20 4e   if (keyObj != N
8160: 55 4c 4c 29 20 7b 0a 09 69 66 20 28 74 79 70 65  ULL) {..if (type
8170: 20 3d 3d 20 54 59 50 45 5f 4d 44 29 20 7b 0a 09   == TYPE_MD) {..
8180: 20 20 20 20 74 79 70 65 20 3d 20 54 59 50 45 5f      type = TYPE_
8190: 48 4d 41 43 3b 0a 09 7d 0a 20 20 20 20 7d 20 65  HMAC;..}.    } e
81a0: 6c 73 65 20 69 66 20 28 74 79 70 65 20 21 3d 20  lse if (type != 
81b0: 54 59 50 45 5f 4d 44 29 20 7b 0a 09 54 63 6c 5f  TYPE_MD) {..Tcl_
81c0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
81d0: 65 72 70 2c 20 22 4e 6f 20 6b 65 79 20 73 70 65  erp, "No key spe
81e0: 63 69 66 69 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a  cified", NULL);.
81f0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
8200: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
8210: 20 43 61 6c 63 20 64 69 67 65 73 74 20 6f 6e 20   Calc digest on 
8220: 66 69 6c 65 2c 20 73 74 61 63 6b 65 64 20 63 68  file, stacked ch
8230: 61 6e 6e 65 6c 2c 20 75 73 69 6e 67 20 69 6e 73  annel, using ins
8240: 74 61 6e 63 65 20 63 6f 6d 6d 61 6e 64 2c 20 6f  tance command, o
8250: 72 20 64 61 74 61 20 62 6c 6f 62 20 2a 2f 0a 20  r data blob */. 
8260: 20 20 20 69 66 20 28 66 69 6c 65 4f 62 6a 20 21     if (fileObj !
8270: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 20 3d  = NULL) {..res =
8280: 20 54 6c 73 5f 44 69 67 65 73 74 46 69 6c 65 28   Tls_DigestFile(
8290: 69 6e 74 65 72 70 2c 20 66 69 6c 65 4f 62 6a 2c  interp, fileObj,
82a0: 20 6d 64 2c 20 63 69 70 68 65 72 2c 20 66 6f 72   md, cipher, for
82b0: 6d 61 74 20 7c 20 74 79 70 65 2c 20 6b 65 79 4f  mat | type, keyO
82c0: 62 6a 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  bj);.    } else 
82d0: 69 66 20 28 63 68 61 6e 6e 65 6c 20 21 3d 20 4e  if (channel != N
82e0: 55 4c 4c 29 20 7b 0a 09 72 65 73 20 3d 20 54 6c  ULL) {..res = Tl
82f0: 73 5f 44 69 67 65 73 74 43 68 61 6e 6e 65 6c 28  s_DigestChannel(
8300: 69 6e 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c 2c  interp, channel,
8310: 20 6d 64 2c 20 63 69 70 68 65 72 2c 20 66 6f 72   md, cipher, for
8320: 6d 61 74 20 7c 20 74 79 70 65 2c 20 6b 65 79 4f  mat | type, keyO
8330: 62 6a 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  bj);.    } else 
8340: 69 66 20 28 63 6d 64 4f 62 6a 20 21 3d 20 4e 55  if (cmdObj != NU
8350: 4c 4c 29 20 7b 0a 09 72 65 73 20 3d 20 54 6c 73  LL) {..res = Tls
8360: 5f 44 69 67 65 73 74 49 6e 73 74 61 6e 63 65 28  _DigestInstance(
8370: 69 6e 74 65 72 70 2c 20 63 6d 64 4f 62 6a 2c 20  interp, cmdObj, 
8380: 6d 64 2c 20 63 69 70 68 65 72 2c 20 66 6f 72 6d  md, cipher, form
8390: 61 74 20 7c 20 74 79 70 65 2c 20 6b 65 79 4f 62  at | type, keyOb
83a0: 6a 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  j);.    } else i
83b0: 66 20 28 64 61 74 61 4f 62 6a 20 21 3d 20 4e 55  f (dataObj != NU
83c0: 4c 4c 29 20 7b 0a 09 72 65 73 20 3d 20 54 6c 73  LL) {..res = Tls
83d0: 5f 44 69 67 65 73 74 44 61 74 61 28 69 6e 74 65  _DigestData(inte
83e0: 72 70 2c 20 64 61 74 61 4f 62 6a 2c 20 6d 64 2c  rp, dataObj, md,
83f0: 20 63 69 70 68 65 72 2c 20 66 6f 72 6d 61 74 20   cipher, format 
8400: 7c 20 74 79 70 65 2c 20 6b 65 79 4f 62 6a 29 3b  | type, keyObj);
8410: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
8420: 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d  n res;.}../*. *-
8430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8470: 2d 2d 0a 20 2a 0a 20 2a 20 4d 65 73 73 61 67 65  --. *. * Message
8480: 20 44 69 67 65 73 74 20 61 6e 64 20 4d 65 73 73   Digest and Mess
8490: 61 67 65 20 41 75 74 68 65 6e 74 69 63 61 74 69  age Authenticati
84a0: 6f 6e 20 43 6f 64 65 20 43 6f 6d 6d 61 6e 64 73  on Code Commands
84b0: 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 75 72 6e   --. *. *.Return
84c0: 20 4d 65 73 73 61 67 65 20 44 69 67 65 73 74 20   Message Digest 
84d0: 28 4d 44 29 20 6f 72 20 4d 65 73 73 61 67 65 20  (MD) or Message 
84e0: 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 43  Authentication C
84f0: 6f 64 65 20 28 4d 41 43 29 2e 0a 20 2a 0a 20 2a  ode (MAC).. *. *
8500: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c   Returns:. *.TCL
8510: 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52  _OK or TCL_ERROR
8520: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
8530: 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 72 65 73  cts:. *.Sets res
8540: 75 6c 74 20 74 6f 20 6d 65 73 73 61 67 65 20 64  ult to message d
8550: 69 67 65 73 74 20 6f 72 20 65 72 72 6f 72 20 6d  igest or error m
8560: 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d  essage. *. *----
8570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
85a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
85b0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44   */.static int D
85c0: 69 67 65 73 74 4f 62 6a 43 6d 64 28 43 6c 69 65  igestObjCmd(Clie
85d0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
85e0: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
85f0: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
8600: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20   Tcl_Obj *const 
8610: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 72 65  objv[]) {.    re
8620: 74 75 72 6e 20 44 69 67 65 73 74 4d 61 69 6e 28  turn DigestMain(
8630: 54 59 50 45 5f 4d 44 2c 20 69 6e 74 65 72 70 2c  TYPE_MD, interp,
8640: 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 7d 0a   objc, objv);.}.
8650: 0a 73 74 61 74 69 63 20 69 6e 74 20 43 4d 41 43  .static int CMAC
8660: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74  ObjCmd(ClientDat
8670: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63  a clientData, Tc
8680: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
8690: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f  , int objc, Tcl_
86a0: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b  Obj *const objv[
86b0: 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ]) {.    return 
86c0: 44 69 67 65 73 74 4d 61 69 6e 28 54 59 50 45 5f  DigestMain(TYPE_
86d0: 43 4d 41 43 2c 20 69 6e 74 65 72 70 2c 20 6f 62  CMAC, interp, ob
86e0: 6a 63 2c 20 6f 62 6a 76 29 3b 0a 7d 0a 0a 73 74  jc, objv);.}..st
86f0: 61 74 69 63 20 69 6e 74 20 48 4d 41 43 4f 62 6a  atic int HMACObj
8700: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63  Cmd(ClientData c
8710: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
8720: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
8730: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
8740: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20   *const objv[]) 
8750: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 44 69 67  {.    return Dig
8760: 65 73 74 4d 61 69 6e 28 54 59 50 45 5f 48 4d 41  estMain(TYPE_HMA
8770: 43 2c 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c  C, interp, objc,
8780: 20 6f 62 6a 76 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a   objv);.}../*. *
8790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
87a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
87b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
87c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
87d0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 65 73 73 61 67  ---. *. * Messag
87e0: 65 20 44 69 67 65 73 74 20 43 6f 6e 76 65 6e 69  e Digest Conveni
87f0: 65 6e 63 65 20 43 6f 6d 6d 61 6e 64 73 20 2d 2d  ence Commands --
8800: 0a 20 2a 0a 20 2a 09 43 6f 6e 76 65 6e 69 65 6e  . *. *.Convenien
8810: 63 65 20 63 6f 6d 6d 61 6e 64 73 20 66 6f 72 20  ce commands for 
8820: 73 65 6c 65 63 74 20 6d 65 73 73 61 67 65 20 64  select message d
8830: 69 67 65 73 74 73 2e 0a 20 2a 0a 20 2a 20 52 65  igests.. *. * Re
8840: 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b  turns:. *.TCL_OK
8850: 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a   or TCL_ERROR. *
8860: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
8870: 3a 0a 20 2a 09 53 65 74 73 20 72 65 73 75 6c 74  :. *.Sets result
8880: 20 74 6f 20 6d 65 73 73 61 67 65 20 64 69 67 65   to message dige
8890: 73 74 20 6f 72 20 65 72 72 6f 72 20 6d 65 73 73  st or error mess
88a0: 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  age. *. *-------
88b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
88c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
88d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
88e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
88f0: 0a 69 6e 74 20 44 69 67 65 73 74 4d 44 34 43 6d  .int DigestMD4Cm
8900: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  d(ClientData cli
8910: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  entData, Tcl_Int
8920: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
8930: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
8940: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a  const objv[]) {.
8950: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20      if (objc != 
8960: 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e  2) {..Tcl_WrongN
8970: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
8980: 2c 20 6f 62 6a 76 2c 20 22 64 61 74 61 22 29 3b  , objv, "data");
8990: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
89a0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  OR;.    }.    re
89b0: 74 75 72 6e 20 54 6c 73 5f 44 69 67 65 73 74 44  turn Tls_DigestD
89c0: 61 74 61 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  ata(interp, objv
89d0: 5b 31 5d 2c 20 45 56 50 5f 6d 64 34 28 29 2c 20  [1], EVP_md4(), 
89e0: 4e 55 4c 4c 2c 20 48 45 58 5f 46 4f 52 4d 41 54  NULL, HEX_FORMAT
89f0: 20 7c 20 54 59 50 45 5f 4d 44 2c 20 4e 55 4c 4c   | TYPE_MD, NULL
8a00: 29 3b 0a 7d 0a 0a 69 6e 74 20 44 69 67 65 73 74  );.}..int Digest
8a10: 4d 44 35 43 6d 64 28 43 6c 69 65 6e 74 44 61 74  MD5Cmd(ClientDat
8a20: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63  a clientData, Tc
8a30: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
8a40: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f  , int objc, Tcl_
8a50: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b  Obj *const objv[
8a60: 5d 29 20 7b 0a 20 20 20 20 69 66 20 28 6f 62 6a  ]) {.    if (obj
8a70: 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57  c != 2) {..Tcl_W
8a80: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
8a90: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 64 61  rp, 1, objv, "da
8aa0: 74 61 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  ta");..return TC
8ab0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
8ac0: 20 20 20 72 65 74 75 72 6e 20 54 6c 73 5f 44 69     return Tls_Di
8ad0: 67 65 73 74 44 61 74 61 28 69 6e 74 65 72 70 2c  gestData(interp,
8ae0: 20 6f 62 6a 76 5b 31 5d 2c 20 45 56 50 5f 6d 64   objv[1], EVP_md
8af0: 35 28 29 2c 20 4e 55 4c 4c 2c 20 48 45 58 5f 46  5(), NULL, HEX_F
8b00: 4f 52 4d 41 54 20 7c 20 54 59 50 45 5f 4d 44 2c  ORMAT | TYPE_MD,
8b10: 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 69 6e 74 20 44   NULL);.}..int D
8b20: 69 67 65 73 74 53 48 41 31 43 6d 64 28 43 6c 69  igestSHA1Cmd(Cli
8b30: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
8b40: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
8b50: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
8b60: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
8b70: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 69   objv[]) {.    i
8b80: 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a  f (objc != 2) {.
8b90: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
8ba0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
8bb0: 76 2c 20 22 64 61 74 61 22 29 3b 0a 09 72 65 74  v, "data");..ret
8bc0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8bd0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
8be0: 54 6c 73 5f 44 69 67 65 73 74 44 61 74 61 28 69  Tls_DigestData(i
8bf0: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
8c00: 45 56 50 5f 73 68 61 31 28 29 2c 20 4e 55 4c 4c  EVP_sha1(), NULL
8c10: 2c 20 48 45 58 5f 46 4f 52 4d 41 54 20 7c 20 54  , HEX_FORMAT | T
8c20: 59 50 45 5f 4d 44 2c 20 4e 55 4c 4c 29 3b 0a 7d  YPE_MD, NULL);.}
8c30: 0a 0a 69 6e 74 20 44 69 67 65 73 74 53 48 41 32  ..int DigestSHA2
8c40: 35 36 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  56Cmd(ClientData
8c50: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
8c60: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
8c70: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
8c80: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
8c90: 29 20 7b 0a 20 20 20 20 69 66 20 28 6f 62 6a 63  ) {.    if (objc
8ca0: 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72   != 2) {..Tcl_Wr
8cb0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
8cc0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 64 61 74  p, 1, objv, "dat
8cd0: 61 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  a");..return TCL
8ce0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
8cf0: 20 20 72 65 74 75 72 6e 20 54 6c 73 5f 44 69 67    return Tls_Dig
8d00: 65 73 74 44 61 74 61 28 69 6e 74 65 72 70 2c 20  estData(interp, 
8d10: 6f 62 6a 76 5b 31 5d 2c 20 45 56 50 5f 73 68 61  objv[1], EVP_sha
8d20: 32 35 36 28 29 2c 20 4e 55 4c 4c 2c 20 48 45 58  256(), NULL, HEX
8d30: 5f 46 4f 52 4d 41 54 20 7c 20 54 59 50 45 5f 4d  _FORMAT | TYPE_M
8d40: 44 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 69 6e 74  D, NULL);.}..int
8d50: 20 44 69 67 65 73 74 53 48 41 35 31 32 43 6d 64   DigestSHA512Cmd
8d60: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
8d70: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ntData, Tcl_Inte
8d80: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
8d90: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63  objc, Tcl_Obj *c
8da0: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20  onst objv[]) {. 
8db0: 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32     if (objc != 2
8dc0: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75  ) {..Tcl_WrongNu
8dd0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
8de0: 20 6f 62 6a 76 2c 20 22 64 61 74 61 22 29 3b 0a   objv, "data");.
8df0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
8e00: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  R;.    }.    ret
8e10: 75 72 6e 20 54 6c 73 5f 44 69 67 65 73 74 44 61  urn Tls_DigestDa
8e20: 74 61 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  ta(interp, objv[
8e30: 31 5d 2c 20 45 56 50 5f 73 68 61 35 31 32 28 29  1], EVP_sha512()
8e40: 2c 20 4e 55 4c 4c 2c 20 48 45 58 5f 46 4f 52 4d  , NULL, HEX_FORM
8e50: 41 54 20 7c 20 54 59 50 45 5f 4d 44 2c 20 4e 55  AT | TYPE_MD, NU
8e60: 4c 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  LL);.}../*. *---
8e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8eb0: 0a 20 2a 0a 20 2a 20 54 6c 73 5f 44 69 67 65 73  . *. * Tls_Diges
8ec0: 74 43 6f 6d 6d 61 6e 64 73 20 2d 2d 0a 20 2a 0a  tCommands --. *.
8ed0: 20 2a 09 43 72 65 61 74 65 20 64 69 67 65 73 74   *.Create digest
8ee0: 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20   commands. *. * 
8ef0: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f  Returns:. *.TCL_
8f00: 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a  OK or TCL_ERROR.
8f10: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
8f20: 74 73 3a 0a 20 2a 09 43 72 65 61 74 65 73 20 63  ts:. *.Creates c
8f30: 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 2d 2d 2d  ommands. *. *---
8f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f80: 0a 20 2a 2f 0a 69 6e 74 20 54 6c 73 5f 44 69 67  . */.int Tls_Dig
8f90: 65 73 74 43 6f 6d 6d 61 6e 64 73 28 54 63 6c 5f  estCommands(Tcl_
8fa0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20  Interp *interp) 
8fb0: 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  {.    Tcl_Create
8fc0: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
8fd0: 70 2c 20 22 74 6c 73 3a 3a 64 69 67 65 73 74 22  p, "tls::digest"
8fe0: 2c 20 44 69 67 65 73 74 4f 62 6a 43 6d 64 2c 20  , DigestObjCmd, 
8ff0: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20  (ClientData) 0, 
9000: 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
9010: 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  oc *) NULL);.   
9020: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
9030: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74  mmand(interp, "t
9040: 6c 73 3a 3a 63 6d 61 63 22 2c 20 43 4d 41 43 4f  ls::cmac", CMACO
9050: 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61  bjCmd, (ClientDa
9060: 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44  ta) 0, (Tcl_CmdD
9070: 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
9080: 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  L);.    Tcl_Crea
9090: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
90a0: 65 72 70 2c 20 22 74 6c 73 3a 3a 68 6d 61 63 22  erp, "tls::hmac"
90b0: 2c 20 48 4d 41 43 4f 62 6a 43 6d 64 2c 20 28 43  , HMACObjCmd, (C
90c0: 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54  lientData) 0, (T
90d0: 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
90e0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
90f0: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
9100: 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  and(interp, "tls
9110: 3a 3a 6d 64 34 22 2c 20 44 69 67 65 73 74 4d 44  ::md4", DigestMD
9120: 34 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74  4Cmd, (ClientDat
9130: 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65  a) 0, (Tcl_CmdDe
9140: 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c  leteProc *) NULL
9150: 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  );.    Tcl_Creat
9160: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
9170: 72 70 2c 20 22 74 6c 73 3a 3a 6d 64 35 22 2c 20  rp, "tls::md5", 
9180: 44 69 67 65 73 74 4d 44 35 43 6d 64 2c 20 28 43  DigestMD5Cmd, (C
9190: 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54  lientData) 0, (T
91a0: 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
91b0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
91c0: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
91d0: 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  and(interp, "tls
91e0: 3a 3a 73 68 61 31 22 2c 20 44 69 67 65 73 74 53  ::sha1", DigestS
91f0: 48 41 31 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44  HA1Cmd, (ClientD
9200: 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64  ata) 0, (Tcl_Cmd
9210: 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
9220: 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65  LL);.    Tcl_Cre
9230: 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
9240: 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 68 61 32  terp, "tls::sha2
9250: 35 36 22 2c 20 44 69 67 65 73 74 53 48 41 32 35  56", DigestSHA25
9260: 36 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74  6Cmd, (ClientDat
9270: 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65  a) 0, (Tcl_CmdDe
9280: 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c  leteProc *) NULL
9290: 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  );.    Tcl_Creat
92a0: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
92b0: 72 70 2c 20 22 74 6c 73 3a 3a 73 68 61 35 31 32  rp, "tls::sha512
92c0: 22 2c 20 44 69 67 65 73 74 53 48 41 35 31 32 43  ", DigestSHA512C
92d0: 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
92e0: 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65   0, (Tcl_CmdDele
92f0: 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
9300: 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
9310: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
9320: 2c 20 22 74 6c 73 3a 3a 75 6e 73 74 61 63 6b 22  , "tls::unstack"
9330: 2c 20 55 6e 73 74 61 63 6b 4f 62 6a 43 6d 64 2c  , UnstackObjCmd,
9340: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c   (ClientData) 0,
9350: 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
9360: 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
9370: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
9380: 0a 7d 0a 0a                                      .}..