Hex Artifact Content

Artifact 879253f9c1c3da6994c09595e07407abfa83da11cb924ce430dc6e8294e9dba6:


0000: 2f 2a 0a 20 2a 20 4d 65 73 73 61 67 65 20 44 69  /*. * Message Di
0010: 67 65 73 74 20 28 4d 44 29 20 61 6e 64 20 4d 65  gest (MD) and Me
0020: 73 73 61 67 65 20 41 75 74 68 65 6e 74 69 63 61  ssage Authentica
0030: 74 69 6f 6e 20 43 6f 64 65 20 28 4d 41 43 29 20  tion Code (MAC) 
0040: 4d 6f 64 75 6c 65 0a 20 2a 0a 20 2a 20 50 72 6f  Module. *. * Pro
0050: 76 69 64 65 73 20 63 6f 6d 6d 61 6e 64 73 20 74  vides commands t
0060: 6f 20 63 61 6c 63 75 6c 61 74 65 20 61 20 6d 65  o calculate a me
0070: 73 73 61 67 65 20 64 69 67 65 73 74 20 28 4d 44  ssage digest (MD
0080: 29 20 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a 20  ) or message. * 
0090: 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 63  authentication c
00a0: 6f 64 65 20 28 4d 41 43 29 20 75 73 69 6e 67 20  ode (MAC) using 
00b0: 61 20 73 70 65 63 69 66 69 65 64 20 68 61 73 68  a specified hash
00c0: 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 2f 6f 72   function and/or
00d0: 20 63 69 70 68 65 72 2e 0a 20 2a 0a 20 2a 20 43   cipher.. *. * C
00e0: 6f 70 79 72 69 67 68 74 20 28 43 29 20 32 30 32  opyright (C) 202
00f0: 33 20 42 72 69 61 6e 20 4f 27 48 61 67 61 6e 0a  3 Brian O'Hagan.
0100: 20 2a 0a 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65   *. */..#include
0110: 20 22 74 6c 73 49 6e 74 2e 68 22 0a 23 69 6e 63   "tlsInt.h".#inc
0120: 6c 75 64 65 20 22 74 63 6c 4f 70 74 73 2e 68 22  lude "tclOpts.h"
0130: 0a 23 69 6e 63 6c 75 64 65 20 3c 74 63 6c 2e 68  .#include <tcl.h
0140: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69  >.#include <stdi
0150: 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  o.h>.#include <s
0160: 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64  tring.h>.#includ
0170: 65 20 3c 6f 70 65 6e 73 73 6c 2f 65 76 70 2e 68  e <openssl/evp.h
0180: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e  >.#include <open
0190: 73 73 6c 2f 63 6d 61 63 2e 68 3e 0a 23 69 6e 63  ssl/cmac.h>.#inc
01a0: 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 68 6d  lude <openssl/hm
01b0: 61 63 2e 68 3e 0a 0a 2f 2a 20 43 6f 6e 73 74 61  ac.h>../* Consta
01c0: 6e 74 73 20 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  nts */.const cha
01d0: 72 20 2a 68 65 78 20 3d 20 22 30 31 32 33 34 35  r *hex = "012345
01e0: 36 37 38 39 61 62 63 64 65 66 22 3b 0a 0a 2f 2a  6789abcdef";../*
01f0: 20 4d 61 63 72 6f 73 20 2a 2f 0a 23 64 65 66 69   Macros */.#defi
0200: 6e 65 20 42 55 46 46 45 52 5f 53 49 5a 45 09 36  ne BUFFER_SIZE.6
0210: 35 35 33 36 0a 23 64 65 66 69 6e 65 20 43 48 41  5536.#define CHA
0220: 4e 5f 45 4f 46 09 30 78 31 30 0a 23 64 65 66 69  N_EOF.0x10.#defi
0230: 6e 65 20 52 45 41 44 5f 44 45 4c 41 59 09 35 0a  ne READ_DELAY.5.
0240: 0a 2f 2a 20 44 69 67 65 73 74 20 66 6f 72 6d 61  ./* Digest forma
0250: 74 20 61 6e 64 20 6f 70 65 72 61 74 69 6f 6e 20  t and operation 
0260: 2a 2f 0a 23 64 65 66 69 6e 65 20 42 49 4e 5f 46  */.#define BIN_F
0270: 4f 52 4d 41 54 09 30 78 30 31 0a 23 64 65 66 69  ORMAT.0x01.#defi
0280: 6e 65 20 48 45 58 5f 46 4f 52 4d 41 54 09 30 78  ne HEX_FORMAT.0x
0290: 30 32 0a 23 64 65 66 69 6e 65 20 49 53 5f 58 4f  02.#define IS_XO
02a0: 46 09 09 30 78 30 38 0a 23 64 65 66 69 6e 65 20  F..0x08.#define 
02b0: 54 59 50 45 5f 4d 44 09 09 30 78 31 30 0a 23 64  TYPE_MD..0x10.#d
02c0: 65 66 69 6e 65 20 54 59 50 45 5f 48 4d 41 43 09  efine TYPE_HMAC.
02d0: 30 78 32 30 0a 23 64 65 66 69 6e 65 20 54 59 50  0x20.#define TYP
02e0: 45 5f 43 4d 41 43 09 30 78 34 30 0a 0a 2f 2a 0a  E_CMAC.0x40../*.
02f0: 20 2a 20 54 68 69 73 20 73 74 72 75 63 74 75 72   * This structur
0300: 65 20 64 65 66 69 6e 65 73 20 74 68 65 20 70 65  e defines the pe
0310: 72 2d 69 6e 73 74 61 6e 63 65 20 73 74 61 74 65  r-instance state
0320: 20 6f 66 20 61 20 64 69 67 65 73 74 20 6f 70 65   of a digest ope
0330: 72 61 74 69 6f 6e 2e 0a 20 2a 2f 0a 74 79 70 65  ration.. */.type
0340: 64 65 66 20 73 74 72 75 63 74 20 44 69 67 65 73  def struct Diges
0350: 74 53 74 61 74 65 20 7b 0a 09 54 63 6c 5f 43 68  tState {..Tcl_Ch
0360: 61 6e 6e 65 6c 20 73 65 6c 66 3b 09 2f 2a 20 54  annel self;./* T
0370: 68 69 73 20 73 6f 63 6b 65 74 20 63 68 61 6e 6e  his socket chann
0380: 65 6c 20 2a 2f 0a 09 54 63 6c 5f 54 69 6d 65 72  el */..Tcl_Timer
0390: 54 6f 6b 65 6e 20 74 69 6d 65 72 3b 09 2f 2a 20  Token timer;./* 
03a0: 54 69 6d 65 72 20 66 6f 72 20 72 65 61 64 20 65  Timer for read e
03b0: 76 65 6e 74 73 20 2a 2f 0a 0a 09 69 6e 74 20 66  vents */...int f
03c0: 6c 61 67 73 3b 09 09 2f 2a 20 43 68 61 6e 20 63  lags;../* Chan c
03d0: 6f 6e 66 69 67 20 66 6c 61 67 73 20 2a 2f 0a 09  onfig flags */..
03e0: 69 6e 74 20 77 61 74 63 68 4d 61 73 6b 3b 09 09  int watchMask;..
03f0: 2f 2a 20 43 75 72 72 65 6e 74 20 57 61 74 63 68  /* Current Watch
0400: 50 72 6f 63 20 6d 61 73 6b 20 2a 2f 0a 09 69 6e  Proc mask */..in
0410: 74 20 6d 6f 64 65 3b 09 09 2f 2a 20 43 75 72 72  t mode;../* Curr
0420: 65 6e 74 20 6d 6f 64 65 20 6f 66 20 70 61 72 65  ent mode of pare
0430: 6e 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 09 69  nt channel */..i
0440: 6e 74 20 66 6f 72 6d 61 74 3b 09 09 2f 2a 20 44  nt format;../* D
0450: 69 67 65 73 74 20 66 6f 72 6d 61 74 20 61 6e 64  igest format and
0460: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 09   operation */...
0470: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
0480: 72 70 3b 09 2f 2a 20 43 75 72 72 65 6e 74 20 69  rp;./* Current i
0490: 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 09 45  nterpreter */..E
04a0: 56 50 5f 4d 44 5f 43 54 58 20 2a 63 74 78 3b 09  VP_MD_CTX *ctx;.
04b0: 2f 2a 20 4d 44 20 43 6f 6e 74 65 78 74 20 2a 2f  /* MD Context */
04c0: 0a 09 48 4d 41 43 5f 43 54 58 20 2a 68 63 74 78  ..HMAC_CTX *hctx
04d0: 3b 09 09 2f 2a 20 48 4d 41 43 20 43 6f 6e 74 65  ;../* HMAC Conte
04e0: 78 74 20 2a 2f 0a 09 43 4d 41 43 5f 43 54 58 20  xt */..CMAC_CTX 
04f0: 2a 63 63 74 78 3b 09 09 2f 2a 20 43 4d 41 43 20  *cctx;../* CMAC 
0500: 43 6f 6e 74 65 78 74 20 2a 2f 0a 09 54 63 6c 5f  Context */..Tcl_
0510: 43 6f 6d 6d 61 6e 64 20 74 6f 6b 65 6e 3b 09 2f  Command token;./
0520: 2a 20 43 6f 6d 6d 61 6e 64 20 74 6f 6b 65 6e 20  * Command token 
0530: 2a 2f 0a 7d 20 44 69 67 65 73 74 53 74 61 74 65  */.} DigestState
0540: 3b 0a 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
0590: 2a 20 44 69 67 65 73 74 53 74 61 74 65 4e 65 77  * DigestStateNew
05a0: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66   --. *. *.This f
05b0: 75 6e 63 74 69 6f 6e 20 63 72 65 61 74 65 73 20  unction creates 
05c0: 61 20 70 65 72 2d 69 6e 73 74 61 6e 63 65 20 73  a per-instance s
05d0: 74 61 74 65 20 64 61 74 61 20 73 74 72 75 63 74  tate data struct
05e0: 75 72 65 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  ure. *. * Return
05f0: 73 3a 0a 20 2a 09 44 69 67 65 73 74 20 73 74 72  s:. *.Digest str
0600: 75 63 74 75 72 65 20 70 6f 69 6e 74 65 72 0a 20  ucture pointer. 
0610: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
0620: 73 3a 0a 20 2a 09 43 72 65 61 74 65 73 20 73 74  s:. *.Creates st
0630: 72 75 63 74 75 72 65 0a 20 2a 0a 20 2a 2d 2d 2d  ructure. *. *---
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: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0680: 0a 20 2a 2f 0a 44 69 67 65 73 74 53 74 61 74 65  . */.DigestState
0690: 20 2a 44 69 67 65 73 74 53 74 61 74 65 4e 65 77   *DigestStateNew
06a0: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
06b0: 65 72 70 2c 20 69 6e 74 20 66 6f 72 6d 61 74 29  erp, int format)
06c0: 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74 61   {.    DigestSta
06d0: 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 0a 20  te *statePtr;.. 
06e0: 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 44     statePtr = (D
06f0: 69 67 65 73 74 53 74 61 74 65 20 2a 29 20 63 6b  igestState *) ck
0700: 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64 29  alloc((unsigned)
0710: 20 73 69 7a 65 6f 66 28 44 69 67 65 73 74 53 74   sizeof(DigestSt
0720: 61 74 65 29 29 3b 0a 20 20 20 20 69 66 20 28 73  ate));.    if (s
0730: 74 61 74 65 50 74 72 20 21 3d 20 4e 55 4c 4c 29  tatePtr != NULL)
0740: 20 7b 0a 09 6d 65 6d 73 65 74 28 73 74 61 74 65   {..memset(state
0750: 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 44  Ptr, 0, sizeof(D
0760: 69 67 65 73 74 53 74 61 74 65 29 29 3b 0a 09 73  igestState));..s
0770: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 09 3d 20  tatePtr->self.= 
0780: 4e 55 4c 4c 3b 09 09 2f 2a 20 54 68 69 73 20 73  NULL;../* This s
0790: 6f 63 6b 65 74 20 63 68 61 6e 6e 65 6c 20 2a 2f  ocket channel */
07a0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65  ..statePtr->time
07b0: 72 20 3d 20 4e 55 4c 4c 3b 09 09 2f 2a 20 54 69  r = NULL;../* Ti
07c0: 6d 65 72 20 74 6f 20 66 6c 75 73 68 20 64 61 74  mer to flush dat
07d0: 61 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e  a */..statePtr->
07e0: 66 6c 61 67 73 20 3d 20 30 3b 09 09 2f 2a 20 43  flags = 0;../* C
07f0: 68 61 6e 20 63 6f 6e 66 69 67 20 66 6c 61 67 73  han config flags
0800: 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 77   */..statePtr->w
0810: 61 74 63 68 4d 61 73 6b 20 3d 20 30 3b 09 2f 2a  atchMask = 0;./*
0820: 20 43 75 72 72 65 6e 74 20 57 61 74 63 68 50 72   Current WatchPr
0830: 6f 63 20 6d 61 73 6b 20 2a 2f 0a 09 73 74 61 74  oc mask */..stat
0840: 65 50 74 72 2d 3e 6d 6f 64 65 09 3d 20 30 3b 09  ePtr->mode.= 0;.
0850: 09 2f 2a 20 43 75 72 72 65 6e 74 20 6d 6f 64 65  ./* Current mode
0860: 20 6f 66 20 70 61 72 65 6e 74 20 63 68 61 6e 6e   of parent chann
0870: 65 6c 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d  el */..statePtr-
0880: 3e 66 6f 72 6d 61 74 20 3d 20 66 6f 72 6d 61 74  >format = format
0890: 3b 09 2f 2a 20 44 69 67 65 73 74 20 66 6f 72 6d  ;./* Digest form
08a0: 61 74 20 61 6e 64 20 6f 70 65 72 61 74 69 6f 6e  at and operation
08b0: 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 69   */..statePtr->i
08c0: 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 09  nterp = interp;.
08d0: 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 65 72  /* Current inter
08e0: 70 72 65 74 65 72 20 2a 2f 0a 09 73 74 61 74 65  preter */..state
08f0: 50 74 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b  Ptr->ctx = NULL;
0900: 09 09 2f 2a 20 4d 44 20 43 6f 6e 74 65 78 74 20  ../* MD Context 
0910: 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 68 63  */..statePtr->hc
0920: 74 78 20 3d 20 4e 55 4c 4c 3b 09 09 2f 2a 20 48  tx = NULL;../* H
0930: 4d 41 43 20 43 6f 6e 74 65 78 74 20 2a 2f 0a 09  MAC Context */..
0940: 73 74 61 74 65 50 74 72 2d 3e 63 63 74 78 20 3d  statePtr->cctx =
0950: 20 4e 55 4c 4c 3b 09 09 2f 2a 20 43 4d 41 43 20   NULL;../* CMAC 
0960: 43 6f 6e 74 65 78 74 20 2a 2f 0a 09 73 74 61 74  Context */..stat
0970: 65 50 74 72 2d 3e 74 6f 6b 65 6e 20 3d 20 4e 55  ePtr->token = NU
0980: 4c 4c 3b 09 09 2f 2a 20 43 6f 6d 6d 61 6e 64 20  LL;../* Command 
0990: 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20  token */.    }. 
09a0: 20 20 20 72 65 74 75 72 6e 20 73 74 61 74 65 50     return stateP
09b0: 74 72 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  tr;.}../*. *----
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 2d 2d  ----------------
09e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
0a00: 20 2a 0a 20 2a 20 44 69 67 65 73 74 53 74 61 74   *. * DigestStat
0a10: 65 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54  eFree --. *. *.T
0a20: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 6c  his function del
0a30: 65 74 65 73 20 61 20 64 69 67 65 73 74 20 73 74  etes a digest st
0a40: 61 74 65 20 73 74 72 75 63 74 75 72 65 0a 20 2a  ate structure. *
0a50: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09  . * Returns:. *.
0a60: 4e 6f 74 68 69 6e 67 0a 20 2a 0a 20 2a 20 53 69  Nothing. *. * Si
0a70: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 52  de effects:. *.R
0a80: 65 6d 6f 76 65 73 20 73 74 72 75 63 74 75 72 65  emoves structure
0a90: 0a 20 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f  ---------. */.vo
0ae0: 69 64 20 44 69 67 65 73 74 53 74 61 74 65 46 72  id DigestStateFr
0af0: 65 65 28 44 69 67 65 73 74 53 74 61 74 65 20 2a  ee(DigestState *
0b00: 73 74 61 74 65 50 74 72 29 20 7b 0a 20 20 20 20  statePtr) {.    
0b10: 69 66 20 28 73 74 61 74 65 50 74 72 20 3d 3d 20  if (statePtr == 
0b20: 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 29 20  (DigestState *) 
0b30: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 3b  NULL) {..return;
0b40: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
0b50: 65 6d 6f 76 65 20 70 65 6e 64 69 6e 67 20 74 69  emove pending ti
0b60: 6d 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 28 73  mer */.    if (s
0b70: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21  tatePtr->timer !
0b80: 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65  = (Tcl_TimerToke
0b90: 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f  n) NULL) {..Tcl_
0ba0: 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c  DeleteTimerHandl
0bb0: 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d  er(statePtr->tim
0bc0: 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  er);.    }..    
0bd0: 2f 2a 20 46 72 65 65 20 63 6f 6e 74 65 78 74 20  /* Free context 
0be0: 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20 20  structures */.  
0bf0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
0c00: 63 74 78 20 21 3d 20 28 45 56 50 5f 4d 44 5f 43  ctx != (EVP_MD_C
0c10: 54 58 20 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 45  TX *) NULL) {..E
0c20: 56 50 5f 4d 44 5f 43 54 58 5f 66 72 65 65 28 73  VP_MD_CTX_free(s
0c30: 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20  tatePtr->ctx);. 
0c40: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61     }.    if (sta
0c50: 74 65 50 74 72 2d 3e 68 63 74 78 20 21 3d 20 28  tePtr->hctx != (
0c60: 48 4d 41 43 5f 43 54 58 20 2a 29 20 4e 55 4c 4c  HMAC_CTX *) NULL
0c70: 29 20 7b 0a 09 48 4d 41 43 5f 43 54 58 5f 66 72  ) {..HMAC_CTX_fr
0c80: 65 65 28 73 74 61 74 65 50 74 72 2d 3e 68 63 74  ee(statePtr->hct
0c90: 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  x);.    }.    if
0ca0: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 63 74 78   (statePtr->cctx
0cb0: 20 21 3d 20 28 43 4d 41 43 5f 43 54 58 20 2a 29   != (CMAC_CTX *)
0cc0: 20 4e 55 4c 4c 29 20 7b 0a 09 43 4d 41 43 5f 43   NULL) {..CMAC_C
0cd0: 54 58 5f 66 72 65 65 28 73 74 61 74 65 50 74 72  TX_free(statePtr
0ce0: 2d 3e 63 63 74 78 29 3b 0a 20 20 20 20 7d 0a 20  ->cctx);.    }. 
0cf0: 20 20 20 63 6b 66 72 65 65 28 73 74 61 74 65 50     ckfree(stateP
0d00: 74 72 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  tr);.}../*******
0d10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0d20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0d30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0d40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
0d50: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
0d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d90: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69  -------. *. * Di
0da0: 67 65 73 74 49 6e 69 74 69 61 6c 69 7a 65 20 2d  gestInitialize -
0db0: 2d 0a 20 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69  -. *. *.Initiali
0dc0: 7a 65 20 61 20 68 61 73 68 20 66 75 6e 63 74 69  ze a hash functi
0dd0: 6f 6e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73  on. *. * Returns
0de0: 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 69 66 20 73  :. *.TCL_OK if s
0df0: 75 63 63 65 73 73 66 75 6c 20 6f 72 20 54 43 4c  uccessful or TCL
0e00: 5f 45 52 52 4f 52 20 66 6f 72 20 66 61 69 6c 75  _ERROR for failu
0e10: 72 65 20 77 69 74 68 20 72 65 73 75 6c 74 20 73  re with result s
0e20: 65 74 0a 20 2a 09 74 6f 20 65 72 72 6f 72 20 6d  et. *.to error m
0e30: 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 20 53 69  essage.. *. * Si
0e40: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e  de effects:. *.N
0e50: 6f 20 72 65 73 75 6c 74 20 6f 72 20 65 72 72 6f  o result or erro
0e60: 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d  r message. *. *-
0e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0eb0: 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73  --. */.int Diges
0ec0: 74 49 6e 69 74 69 61 6c 69 7a 65 28 54 63 6c 5f  tInitialize(Tcl_
0ed0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
0ee0: 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61  DigestState *sta
0ef0: 74 65 50 74 72 2c 20 63 6f 6e 73 74 20 45 56 50  tePtr, const EVP
0f00: 5f 4d 44 20 2a 6d 64 2c 0a 09 63 6f 6e 73 74 20  _MD *md,..const 
0f10: 45 56 50 5f 43 49 50 48 45 52 20 2a 63 69 70 68  EVP_CIPHER *ciph
0f20: 65 72 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79  er, Tcl_Obj *key
0f30: 4f 62 6a 29 20 7b 0a 20 20 20 20 69 6e 74 20 6b  Obj) {.    int k
0f40: 65 79 5f 6c 65 6e 20 3d 20 30 2c 20 72 65 73 20  ey_len = 0, res 
0f50: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75  = 0;.    const u
0f60: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65  nsigned char *ke
0f70: 79 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f  y = NULL;..    /
0f80: 2a 20 43 72 65 61 74 65 20 6d 65 73 73 61 67 65  * Create message
0f90: 20 64 69 67 65 73 74 20 63 6f 6e 74 65 78 74 20   digest context 
0fa0: 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  */.    if (state
0fb0: 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20 54 59  Ptr->format & TY
0fc0: 50 45 5f 4d 44 29 20 7b 0a 09 73 74 61 74 65 50  PE_MD) {..stateP
0fd0: 74 72 2d 3e 63 74 78 20 3d 20 45 56 50 5f 4d 44  tr->ctx = EVP_MD
0fe0: 5f 43 54 58 5f 6e 65 77 28 29 3b 0a 09 72 65 73  _CTX_new();..res
0ff0: 20 3d 20 28 73 74 61 74 65 50 74 72 2d 3e 63 74   = (statePtr->ct
1000: 78 20 21 3d 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  x != NULL);.    
1010: 7d 20 65 6c 73 65 20 69 66 20 28 73 74 61 74 65  } else if (state
1020: 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20 54 59  Ptr->format & TY
1030: 50 45 5f 48 4d 41 43 29 20 7b 0a 09 73 74 61 74  PE_HMAC) {..stat
1040: 65 50 74 72 2d 3e 68 63 74 78 20 3d 20 48 4d 41  ePtr->hctx = HMA
1050: 43 5f 43 54 58 5f 6e 65 77 28 29 3b 0a 09 72 65  C_CTX_new();..re
1060: 73 20 3d 20 28 73 74 61 74 65 50 74 72 2d 3e 68  s = (statePtr->h
1070: 63 74 78 20 21 3d 20 4e 55 4c 4c 29 3b 0a 20 20  ctx != NULL);.  
1080: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 61    } else if (sta
1090: 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20  tePtr->format & 
10a0: 54 59 50 45 5f 43 4d 41 43 29 20 7b 0a 09 73 74  TYPE_CMAC) {..st
10b0: 61 74 65 50 74 72 2d 3e 63 63 74 78 20 3d 20 43  atePtr->cctx = C
10c0: 4d 41 43 5f 43 54 58 5f 6e 65 77 28 29 3b 0a 09  MAC_CTX_new();..
10d0: 72 65 73 20 3d 20 28 73 74 61 74 65 50 74 72 2d  res = (statePtr-
10e0: 3e 63 63 74 78 20 21 3d 20 4e 55 4c 4c 29 3b 0a  >cctx != NULL);.
10f0: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 72      }.    if (!r
1100: 65 73 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  es) {..Tcl_Appen
1110: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1120: 22 43 72 65 61 74 65 20 63 6f 6e 74 65 78 74 20  "Create context 
1130: 66 61 69 6c 65 64 3a 20 22 2c 20 52 45 41 53 4f  failed: ", REASO
1140: 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  N(), NULL);..ret
1150: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1160: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74     }..    /* Get
1170: 20 6b 65 79 20 2a 2f 0a 20 20 20 20 69 66 20 28   key */.    if (
1180: 6b 65 79 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20  keyObj != NULL) 
1190: 7b 0a 09 6b 65 79 20 3d 20 54 63 6c 5f 47 65 74  {..key = Tcl_Get
11a0: 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
11b0: 28 6b 65 79 4f 62 6a 2c 20 26 6b 65 79 5f 6c 65  (keyObj, &key_le
11c0: 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  n);.    }..    /
11d0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 68 61 73  * Initialize has
11e0: 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  h function */.  
11f0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
1200: 66 6f 72 6d 61 74 20 26 20 54 59 50 45 5f 4d 44  format & TYPE_MD
1210: 29 20 7b 0a 09 72 65 73 20 3d 20 45 56 50 5f 44  ) {..res = EVP_D
1220: 69 67 65 73 74 49 6e 69 74 5f 65 78 28 73 74 61  igestInit_ex(sta
1230: 74 65 50 74 72 2d 3e 63 74 78 2c 20 6d 64 2c 20  tePtr->ctx, md, 
1240: 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 20 65 6c 73  NULL);.    } els
1250: 65 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e  e if (statePtr->
1260: 66 6f 72 6d 61 74 20 26 20 54 59 50 45 5f 48 4d  format & TYPE_HM
1270: 41 43 29 20 7b 0a 09 72 65 73 20 3d 20 48 4d 41  AC) {..res = HMA
1280: 43 5f 49 6e 69 74 5f 65 78 28 73 74 61 74 65 50  C_Init_ex(stateP
1290: 74 72 2d 3e 68 63 74 78 2c 20 28 63 6f 6e 73 74  tr->hctx, (const
12a0: 20 76 6f 69 64 20 2a 29 20 6b 65 79 2c 20 6b 65   void *) key, ke
12b0: 79 5f 6c 65 6e 2c 20 6d 64 2c 20 4e 55 4c 4c 29  y_len, md, NULL)
12c0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ;.    } else if 
12d0: 28 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61  (statePtr->forma
12e0: 74 20 26 20 54 59 50 45 5f 43 4d 41 43 29 20 7b  t & TYPE_CMAC) {
12f0: 0a 09 72 65 73 20 3d 20 43 4d 41 43 5f 49 6e 69  ..res = CMAC_Ini
1300: 74 28 73 74 61 74 65 50 74 72 2d 3e 63 63 74 78  t(statePtr->cctx
1310: 2c 20 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 29  , (const void *)
1320: 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 2c 20 63   key, key_len, c
1330: 69 70 68 65 72 2c 20 4e 55 4c 4c 29 3b 0a 20 20  ipher, NULL);.  
1340: 20 20 7d 0a 20 20 20 20 69 66 20 28 21 72 65 73    }.    if (!res
1350: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
1360: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 49  esult(interp, "I
1370: 6e 69 74 69 61 6c 69 7a 65 20 66 61 69 6c 65 64  nitialize failed
1380: 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e  : ", REASON(), N
1390: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  ULL);..return TC
13a0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
13b0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
13c0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ;.}../*. *------
13d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a  -------------. *
1410: 0a 20 2a 20 44 69 67 65 73 74 55 70 64 61 74 65  . * DigestUpdate
1420: 20 2d 2d 0a 20 2a 0a 20 2a 09 55 70 64 61 74 65   --. *. *.Update
1430: 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e   a hash function
1440: 20 77 69 74 68 20 64 61 74 61 0a 20 2a 0a 20 2a   with data. *. *
1450: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 31 20 69   Returns:. *.1 i
1460: 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20  f successful or 
1470: 30 20 66 6f 72 20 66 61 69 6c 75 72 65 0a 20 2a  0 for failure. *
1480: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
1490: 3a 0a 20 2a 09 41 64 64 73 20 62 75 66 20 64 61  :. *.Adds buf da
14a0: 74 61 20 74 6f 20 68 61 73 68 20 66 75 6e 63 74  ta to hash funct
14b0: 69 6f 6e 20 6f 72 20 73 65 74 73 20 72 65 73 75  ion or sets resu
14c0: 6c 74 20 74 6f 20 65 72 72 6f 72 20 6d 65 73 73  lt to error mess
14d0: 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  age. *. *-------
14e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
1520: 0a 69 6e 74 20 44 69 67 65 73 74 55 70 64 61 74  .int DigestUpdat
1530: 65 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 73  e(DigestState *s
1540: 74 61 74 65 50 74 72 2c 20 63 68 61 72 20 2a 62  tatePtr, char *b
1550: 75 66 2c 20 73 69 7a 65 5f 74 20 72 65 61 64 2c  uf, size_t read,
1560: 20 69 6e 74 20 64 6f 5f 72 65 73 75 6c 74 29 20   int do_result) 
1570: 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20  {.    int res = 
1580: 30 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74  0;..    if (stat
1590: 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20 54  ePtr->format & T
15a0: 59 50 45 5f 4d 44 29 20 7b 0a 09 72 65 73 20 3d  YPE_MD) {..res =
15b0: 20 45 56 50 5f 44 69 67 65 73 74 55 70 64 61 74   EVP_DigestUpdat
15c0: 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c  e(statePtr->ctx,
15d0: 20 62 75 66 2c 20 72 65 61 64 29 3b 0a 20 20 20   buf, read);.   
15e0: 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 61 74   } else if (stat
15f0: 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20 54  ePtr->format & T
1600: 59 50 45 5f 48 4d 41 43 29 20 7b 0a 09 72 65 73  YPE_HMAC) {..res
1610: 20 3d 20 48 4d 41 43 5f 55 70 64 61 74 65 28 73   = HMAC_Update(s
1620: 74 61 74 65 50 74 72 2d 3e 68 63 74 78 2c 20 62  tatePtr->hctx, b
1630: 75 66 2c 20 72 65 61 64 29 3b 0a 20 20 20 20 7d  uf, read);.    }
1640: 20 65 6c 73 65 20 69 66 20 28 73 74 61 74 65 50   else if (stateP
1650: 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20 54 59 50  tr->format & TYP
1660: 45 5f 43 4d 41 43 29 20 7b 0a 09 72 65 73 20 3d  E_CMAC) {..res =
1670: 20 43 4d 41 43 5f 55 70 64 61 74 65 28 73 74 61   CMAC_Update(sta
1680: 74 65 50 74 72 2d 3e 63 63 74 78 2c 20 62 75 66  tePtr->cctx, buf
1690: 2c 20 72 65 61 64 29 3b 0a 20 20 20 20 7d 0a 20  , read);.    }. 
16a0: 20 20 20 69 66 20 28 21 72 65 73 20 26 26 20 64     if (!res && d
16b0: 6f 5f 72 65 73 75 6c 74 29 20 7b 0a 09 54 63 6c  o_result) {..Tcl
16c0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 73 74  _AppendResult(st
16d0: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20  atePtr->interp, 
16e0: 22 55 70 64 61 74 65 20 66 61 69 6c 65 64 3a 20  "Update failed: 
16f0: 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c  ", REASON(), NUL
1700: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  L);..return TCL_
1710: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
1720: 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
1730: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
1740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1770: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44  --------. *. * D
1780: 69 67 65 73 74 46 69 6e 61 6c 69 7a 65 20 2d 2d  igestFinalize --
1790: 0a 20 2a 0a 20 2a 09 46 69 6e 61 6c 69 7a 65 20  . *. *.Finalize 
17a0: 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20  a hash function 
17b0: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 6d  and return the m
17c0: 65 73 73 61 67 65 20 64 69 67 65 73 74 0a 20 2a  essage digest. *
17d0: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09  . * Returns:. *.
17e0: 54 43 4c 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  TCL_OK if succes
17f0: 73 66 75 6c 20 6f 72 20 54 43 4c 5f 45 52 52 4f  sful or TCL_ERRO
1800: 52 20 66 6f 72 20 66 61 69 6c 75 72 65 20 77 69  R for failure wi
1810: 74 68 20 72 65 73 75 6c 74 20 73 65 74 0a 20 2a  th result set. *
1820: 09 74 6f 20 65 72 72 6f 72 20 6d 65 73 73 61 67  .to error messag
1830: 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  e.. *. * Side ef
1840: 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 72  fects:. *.Sets r
1850: 65 73 75 6c 74 20 74 6f 20 6d 65 73 73 61 67 65  esult to message
1860: 20 64 69 67 65 73 74 20 6f 72 20 61 6e 20 65 72   digest or an er
1870: 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a  ror message.. *.
1880: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
1890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18c0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69  -----. */.int Di
18d0: 67 65 73 74 46 69 6e 61 6c 69 7a 65 28 54 63 6c  gestFinalize(Tcl
18e0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
18f0: 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74   DigestState *st
1900: 61 74 65 50 74 72 2c 20 54 63 6c 5f 4f 62 6a 20  atePtr, Tcl_Obj 
1910: 2a 2a 72 65 73 75 6c 74 4f 62 6a 29 20 7b 0a 20  **resultObj) {. 
1920: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
1930: 20 6d 64 5f 62 75 66 5b 45 56 50 5f 4d 41 58 5f   md_buf[EVP_MAX_
1940: 4d 44 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 75 6e  MD_SIZE];.    un
1950: 73 69 67 6e 65 64 20 69 6e 74 20 6d 64 5f 6c 65  signed int md_le
1960: 6e 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 20 3d  n;.    int res =
1970: 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61   0;..    /* Fina
1980: 6c 69 7a 65 20 68 61 73 68 20 66 75 6e 63 74 69  lize hash functi
1990: 6f 6e 20 61 6e 64 20 63 61 6c 63 75 6c 61 74 65  on and calculate
19a0: 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20   message digest 
19b0: 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  */.    if (state
19c0: 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20 54 59  Ptr->format & TY
19d0: 50 45 5f 4d 44 29 20 7b 0a 09 69 66 20 28 21 28  PE_MD) {..if (!(
19e0: 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74  statePtr->format
19f0: 20 26 20 49 53 5f 58 4f 46 29 29 20 7b 0a 09 20   & IS_XOF)) {.. 
1a00: 20 20 20 72 65 73 20 3d 20 45 56 50 5f 44 69 67     res = EVP_Dig
1a10: 65 73 74 46 69 6e 61 6c 5f 65 78 28 73 74 61 74  estFinal_ex(stat
1a20: 65 50 74 72 2d 3e 63 74 78 2c 20 6d 64 5f 62 75  ePtr->ctx, md_bu
1a30: 66 2c 20 26 6d 64 5f 6c 65 6e 29 3b 0a 09 7d 20  f, &md_len);..} 
1a40: 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 73 20  else {..    res 
1a50: 3d 20 45 56 50 5f 44 69 67 65 73 74 46 69 6e 61  = EVP_DigestFina
1a60: 6c 58 4f 46 28 73 74 61 74 65 50 74 72 2d 3e 63  lXOF(statePtr->c
1a70: 74 78 2c 20 6d 64 5f 62 75 66 2c 20 45 56 50 5f  tx, md_buf, EVP_
1a80: 4d 41 58 5f 4d 44 5f 53 49 5a 45 29 3b 0a 09 7d  MAX_MD_SIZE);..}
1a90: 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
1aa0: 28 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61  (statePtr->forma
1ab0: 74 20 26 20 54 59 50 45 5f 48 4d 41 43 29 20 7b  t & TYPE_HMAC) {
1ac0: 0a 09 72 65 73 20 3d 20 48 4d 41 43 5f 46 69 6e  ..res = HMAC_Fin
1ad0: 61 6c 28 73 74 61 74 65 50 74 72 2d 3e 68 63 74  al(statePtr->hct
1ae0: 78 2c 20 6d 64 5f 62 75 66 2c 20 26 6d 64 5f 6c  x, md_buf, &md_l
1af0: 65 6e 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65  en);..    } else
1b00: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66   if (statePtr->f
1b10: 6f 72 6d 61 74 20 26 20 54 59 50 45 5f 43 4d 41  ormat & TYPE_CMA
1b20: 43 29 20 7b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e  C) {..size_t len
1b30: 3b 0a 09 72 65 73 20 3d 20 43 4d 41 43 5f 46 69  ;..res = CMAC_Fi
1b40: 6e 61 6c 28 73 74 61 74 65 50 74 72 2d 3e 63 63  nal(statePtr->cc
1b50: 74 78 2c 20 6d 64 5f 62 75 66 2c 20 26 6c 65 6e  tx, md_buf, &len
1b60: 29 3b 0a 09 6d 64 5f 6c 65 6e 20 3d 20 28 75 6e  );..md_len = (un
1b70: 73 69 67 6e 65 64 20 69 6e 74 29 20 6c 65 6e 3b  signed int) len;
1b80: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
1b90: 21 72 65 73 29 20 7b 0a 09 69 66 20 28 72 65 73  !res) {..if (res
1ba0: 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20  ultObj == NULL) 
1bb0: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  {..    Tcl_Appen
1bc0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1bd0: 22 46 69 6e 61 6c 69 7a 65 20 66 61 69 6c 65 64  "Finalize failed
1be0: 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e  : ", REASON(), N
1bf0: 55 4c 4c 29 3b 0a 09 7d 0a 09 72 65 74 75 72 6e  ULL);..}..return
1c00: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
1c10: 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  }..    /* Return
1c20: 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20   message digest 
1c30: 61 73 20 65 69 74 68 65 72 20 61 20 62 69 6e 61  as either a bina
1c40: 72 79 20 6f 72 20 68 65 78 20 73 74 72 69 6e 67  ry or hex string
1c50: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74   */.    if (stat
1c60: 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20 42  ePtr->format & B
1c70: 49 4e 5f 46 4f 52 4d 41 54 29 20 7b 0a 09 69 66  IN_FORMAT) {..if
1c80: 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e   (resultObj == N
1c90: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  ULL) {..    Tcl_
1ca0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
1cb0: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65  erp, Tcl_NewByte
1cc0: 41 72 72 61 79 4f 62 6a 28 6d 64 5f 62 75 66 2c  ArrayObj(md_buf,
1cd0: 20 6d 64 5f 6c 65 6e 29 29 3b 0a 09 7d 20 65 6c   md_len));..} el
1ce0: 73 65 20 7b 0a 09 20 20 20 20 2a 72 65 73 75 6c  se {..    *resul
1cf0: 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 42 79  tObj = Tcl_NewBy
1d00: 74 65 41 72 72 61 79 4f 62 6a 28 6d 64 5f 62 75  teArrayObj(md_bu
1d10: 66 2c 20 6d 64 5f 6c 65 6e 29 3b 0a 09 20 20 20  f, md_len);..   
1d20: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
1d30: 74 28 2a 72 65 73 75 6c 74 4f 62 6a 29 3b 0a 09  t(*resultObj);..
1d40: 7d 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  }..    } else {.
1d50: 09 54 63 6c 5f 4f 62 6a 20 2a 6e 65 77 4f 62 6a  .Tcl_Obj *newObj
1d60: 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b   = Tcl_NewObj();
1d70: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
1d80: 2a 70 74 72 20 3d 20 54 63 6c 5f 53 65 74 42 79  *ptr = Tcl_SetBy
1d90: 74 65 41 72 72 61 79 4c 65 6e 67 74 68 28 6e 65  teArrayLength(ne
1da0: 77 4f 62 6a 2c 20 6d 64 5f 6c 65 6e 2a 32 29 3b  wObj, md_len*2);
1db0: 0a 0a 09 66 6f 72 20 28 75 6e 73 69 67 6e 65 64  ...for (unsigned
1dc0: 20 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20   int i = 0; i < 
1dd0: 6d 64 5f 6c 65 6e 3b 20 69 2b 2b 29 20 7b 0a 09  md_len; i++) {..
1de0: 20 20 20 20 2a 70 74 72 2b 2b 20 3d 20 68 65 78      *ptr++ = hex
1df0: 5b 28 6d 64 5f 62 75 66 5b 69 5d 20 3e 3e 20 34  [(md_buf[i] >> 4
1e00: 29 20 26 20 30 78 30 46 5d 3b 0a 09 20 20 20 20  ) & 0x0F];..    
1e10: 2a 70 74 72 2b 2b 20 3d 20 68 65 78 5b 6d 64 5f  *ptr++ = hex[md_
1e20: 62 75 66 5b 69 5d 20 26 20 30 78 30 46 5d 3b 0a  buf[i] & 0x0F];.
1e30: 09 7d 0a 0a 09 69 66 20 28 72 65 73 75 6c 74 4f  .}...if (resultO
1e40: 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  bj == NULL) {.. 
1e50: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
1e60: 75 6c 74 28 69 6e 74 65 72 70 2c 20 6e 65 77 4f  ult(interp, newO
1e70: 62 6a 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  bj);..} else {..
1e80: 20 20 20 20 2a 72 65 73 75 6c 74 4f 62 6a 20 3d      *resultObj =
1e90: 20 6e 65 77 4f 62 6a 3b 0a 09 20 20 20 20 54 63   newObj;..    Tc
1ea0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 2a  l_IncrRefCount(*
1eb0: 72 65 73 75 6c 74 4f 62 6a 29 3b 0a 09 7d 0a 20  resultObj);..}. 
1ec0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
1ed0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a  TCL_OK;.}../****
1ee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
1f20: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
1f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
1f70: 20 44 69 67 65 73 74 42 6c 6f 63 6b 4d 6f 64 65   DigestBlockMode
1f80: 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  Proc --. *. *.Th
1f90: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  is function is i
1fa0: 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 67 65  nvoked by the ge
1fb0: 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 6c 0a 20  neric IO level. 
1fc0: 2a 09 74 6f 20 73 65 74 20 62 6c 6f 63 6b 69 6e  *.to set blockin
1fd0: 67 20 61 6e 64 20 6e 6f 6e 62 6c 6f 63 6b 69 6e  g and nonblockin
1fe0: 67 20 6d 6f 64 65 73 2e 0a 20 2a 0a 20 2a 20 52  g modes.. *. * R
1ff0: 65 74 75 72 6e 73 3a 0a 20 2a 09 30 20 69 66 20  eturns:. *.0 if 
2000: 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 50 4f  successful or PO
2010: 53 49 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69  SIX error code i
2020: 66 20 66 61 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20  f failed.. *. * 
2030: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
2040: 09 53 65 74 73 20 74 68 65 20 64 65 76 69 63 65  .Sets the device
2050: 20 69 6e 74 6f 20 62 6c 6f 63 6b 69 6e 67 20 6f   into blocking o
2060: 72 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f  r nonblocking mo
2070: 64 65 2e 0a 20 2a 09 43 61 6e 20 63 61 6c 6c 20  de.. *.Can call 
2080: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 45 72  Tcl_SetChannelEr
2090: 72 6f 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ror.. *. *------
20a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
20e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 69 67  /.static int Dig
20f0: 65 73 74 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63  estBlockModeProc
2100: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
2110: 6e 74 44 61 74 61 2c 20 69 6e 74 20 6d 6f 64 65  ntData, int mode
2120: 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74  ) {.    DigestSt
2130: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
2140: 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 29 20  (DigestState *) 
2150: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20  clientData;..   
2160: 20 69 66 20 28 6d 6f 64 65 20 3d 3d 20 54 43 4c   if (mode == TCL
2170: 5f 4d 4f 44 45 5f 4e 4f 4e 42 4c 4f 43 4b 49 4e  _MODE_NONBLOCKIN
2180: 47 29 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e  G) {..statePtr->
2190: 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c  flags |= TLS_TCL
21a0: 5f 41 53 59 4e 43 3b 0a 20 20 20 20 7d 20 65 6c  _ASYNC;.    } el
21b0: 73 65 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e  se {..statePtr->
21c0: 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54  flags &= ~(TLS_T
21d0: 43 4c 5f 41 53 59 4e 43 29 3b 0a 20 20 20 20 7d  CL_ASYNC);.    }
21e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  .    return 0;.}
21f0: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
2200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
2240: 20 44 69 67 65 73 74 43 6c 6f 73 65 50 72 6f 63   DigestCloseProc
2250: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66   --. *. *.This f
2260: 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b  unction is invok
2270: 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 69  ed by the generi
2280: 63 20 49 4f 20 6c 65 76 65 6c 20 74 6f 20 70 65  c IO level to pe
2290: 72 66 6f 72 6d 0a 20 2a 09 63 68 61 6e 6e 65 6c  rform. *.channel
22a0: 2d 74 79 70 65 20 73 70 65 63 69 66 69 63 20 63  -type specific c
22b0: 6c 65 61 6e 75 70 20 77 68 65 6e 20 74 68 65 20  leanup when the 
22c0: 63 68 61 6e 6e 65 6c 20 69 73 20 63 6c 6f 73 65  channel is close
22d0: 64 2e 20 41 6c 6c 0a 20 2a 09 71 75 65 75 65 64  d. All. *.queued
22e0: 20 6f 75 74 70 75 74 20 69 73 20 66 6c 75 73 68   output is flush
22f0: 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ed prior to call
2300: 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
2310: 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73  n.. *. * Returns
2320: 3a 0a 20 2a 09 30 20 69 66 20 73 75 63 63 65 73  :. *.0 if succes
2330: 73 66 75 6c 20 6f 72 20 50 4f 53 49 58 20 65 72  sful or POSIX er
2340: 72 6f 72 20 63 6f 64 65 20 69 66 20 66 61 69 6c  ror code if fail
2350: 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ed.. *. * Side e
2360: 66 66 65 63 74 73 3a 0a 20 2a 09 44 65 6c 65 74  ffects:. *.Delet
2370: 65 73 20 73 74 6f 72 65 64 20 73 74 61 74 65 20  es stored state 
2380: 64 61 74 61 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  data.. *. *-----
2390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
23d0: 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 43 6c 6f  */.int DigestClo
23e0: 73 65 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74  seProc(ClientDat
23f0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63  a clientData, Tc
2400: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2410: 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74  ) {.    DigestSt
2420: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
2430: 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 29 20  (DigestState *) 
2440: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20  clientData;..   
2450: 20 2f 2a 20 43 61 6e 63 65 6c 20 61 63 74 69 76   /* Cancel activ
2460: 65 20 74 69 6d 65 72 2c 20 69 66 20 61 6e 79 20  e timer, if any 
2470: 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  */.    if (state
2480: 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54  Ptr->timer != (T
2490: 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e  cl_TimerToken) N
24a0: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65  ULL) {..Tcl_Dele
24b0: 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73  teTimerHandler(s
24c0: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b  tatePtr->timer);
24d0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65  ..statePtr->time
24e0: 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f  r = (Tcl_TimerTo
24f0: 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  ken) NULL;.    }
2500: 0a 0a 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20  ..    /* Output 
2510: 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20 69  message digest i
2520: 66 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 64 6f  f not already do
2530: 6e 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 28  ne */.    if (!(
2540: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20  statePtr->flags 
2550: 26 20 43 48 41 4e 5f 45 4f 46 29 29 20 7b 0a 09  & CHAN_EOF)) {..
2560: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 70 61 72 65  Tcl_Channel pare
2570: 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 63  nt = Tcl_GetStac
2580: 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 65  kedChannel(state
2590: 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 09 54 63 6c  Ptr->self);..Tcl
25a0: 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 3b  _Obj *resultObj;
25b0: 0a 09 69 6e 74 20 77 72 69 74 74 65 6e 3b 0a 0a  ..int written;..
25c0: 09 69 66 20 28 44 69 67 65 73 74 46 69 6e 61 6c  .if (DigestFinal
25d0: 69 7a 65 28 73 74 61 74 65 50 74 72 2d 3e 69 6e  ize(statePtr->in
25e0: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20  terp, statePtr, 
25f0: 26 72 65 73 75 6c 74 4f 62 6a 29 20 3d 3d 20 54  &resultObj) == T
2600: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 75 6e  CL_OK) {..    un
2610: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
2620: 61 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41  a = Tcl_GetByteA
2630: 72 72 61 79 46 72 6f 6d 4f 62 6a 28 72 65 73 75  rrayFromObj(resu
2640: 6c 74 4f 62 6a 2c 20 26 77 72 69 74 74 65 6e 29  ltObj, &written)
2650: 3b 0a 09 20 20 20 20 54 63 6c 5f 57 72 69 74 65  ;..    Tcl_Write
2660: 52 61 77 28 70 61 72 65 6e 74 2c 20 64 61 74 61  Raw(parent, data
2670: 2c 20 77 72 69 74 74 65 6e 29 3b 0a 09 20 20 20  , written);..   
2680: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
2690: 74 28 72 65 73 75 6c 74 4f 62 6a 29 3b 0a 09 7d  t(resultObj);..}
26a0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67  ..statePtr->flag
26b0: 73 20 7c 3d 20 43 48 41 4e 5f 45 4f 46 3b 0a 20  s |= CHAN_EOF;. 
26c0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 65     }..    /* Cle
26d0: 61 6e 2d 75 70 20 2a 2f 0a 20 20 20 20 44 69 67  an-up */.    Dig
26e0: 65 73 74 53 74 61 74 65 46 72 65 65 28 73 74 61  estStateFree(sta
26f0: 74 65 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75  tePtr);.    retu
2700: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  rn 0;.}../*. * S
2710: 61 6d 65 20 61 73 20 44 69 67 65 73 74 43 6c 6f  ame as DigestClo
2720: 73 65 50 72 6f 63 20 62 75 74 20 77 69 74 68 20  seProc but with 
2730: 69 6e 64 69 76 69 64 75 61 6c 20 72 65 61 64 20  individual read 
2740: 61 6e 64 20 77 72 69 74 65 20 63 6c 6f 73 65 20  and write close 
2750: 63 6f 6e 74 72 6f 6c 0a 20 2a 2f 0a 73 74 61 74  control. */.stat
2760: 69 63 20 69 6e 74 20 44 69 67 65 73 74 43 6c 6f  ic int DigestClo
2770: 73 65 32 50 72 6f 63 28 43 6c 69 65 6e 74 44 61  se2Proc(ClientDa
2780: 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c  ta instanceData,
2790: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
27a0: 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 20  erp, int flags) 
27b0: 7b 0a 0a 20 20 20 20 69 66 20 28 28 66 6c 61 67  {..    if ((flag
27c0: 73 20 26 20 28 54 43 4c 5f 43 4c 4f 53 45 5f 52  s & (TCL_CLOSE_R
27d0: 45 41 44 20 7c 20 54 43 4c 5f 43 4c 4f 53 45 5f  EAD | TCL_CLOSE_
27e0: 57 52 49 54 45 29 29 20 3d 3d 20 30 29 20 7b 0a  WRITE)) == 0) {.
27f0: 09 72 65 74 75 72 6e 20 44 69 67 65 73 74 43 6c  .return DigestCl
2800: 6f 73 65 50 72 6f 63 28 69 6e 73 74 61 6e 63 65  oseProc(instance
2810: 44 61 74 61 2c 20 69 6e 74 65 72 70 29 3b 0a 20  Data, interp);. 
2820: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
2830: 45 49 4e 56 41 4c 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  EINVAL;.}../*. *
2840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2880: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67  ------. *. * Dig
2890: 65 73 74 49 6e 70 75 74 50 72 6f 63 20 2d 2d 0a  estInputProc --.
28a0: 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79 20   *. *.Called by 
28b0: 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 73  the generic IO s
28c0: 79 73 74 65 6d 20 74 6f 20 72 65 61 64 20 64 61  ystem to read da
28d0: 74 61 20 66 72 6f 6d 20 74 72 61 6e 73 66 6f 72  ta from transfor
28e0: 6d 20 61 6e 64 0a 20 2a 09 70 6c 61 63 65 20 69  m and. *.place i
28f0: 6e 20 62 75 66 2e 20 54 72 61 6e 73 66 6f 72 6d  n buf. Transform
2900: 20 67 65 74 73 20 64 61 74 61 20 66 72 6f 6d 20   gets data from 
2910: 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 63  the underlying c
2920: 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65  hannel.. *. * Re
2930: 74 75 72 6e 73 3a 0a 20 2a 09 54 6f 74 61 6c 20  turns:. *.Total 
2940: 62 79 74 65 73 20 72 65 61 64 20 6f 72 20 2d 31  bytes read or -1
2950: 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 20 61 6c   for an error al
2960: 6f 6e 67 20 77 69 74 68 20 61 20 50 4f 53 49 58  ong with a POSIX
2970: 20 65 72 72 6f 72 0a 20 2a 09 63 6f 64 65 20 69   error. *.code i
2980: 6e 20 65 72 72 6f 72 43 6f 64 65 50 74 72 2e 20  n errorCodePtr. 
2990: 55 73 65 20 45 41 47 41 49 4e 20 66 6f 72 20 6e  Use EAGAIN for n
29a0: 6f 6e 62 6c 6f 63 6b 69 6e 67 20 61 6e 64 20 6e  onblocking and n
29b0: 6f 20 64 61 74 61 2e 0a 20 2a 0a 20 2a 20 53 69  o data.. *. * Si
29c0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 52  de effects:. *.R
29d0: 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 74 72  ead data from tr
29e0: 61 6e 73 66 6f 72 6d 20 61 6e 64 20 77 72 69 74  ansform and writ
29f0: 65 20 74 6f 20 62 75 66 0a 20 2a 0a 20 2a 2d 2d  e to buf. *. *--
2a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a40: 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 67  ----. */.int Dig
2a50: 65 73 74 49 6e 70 75 74 50 72 6f 63 28 43 6c 69  estInputProc(Cli
2a60: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
2a70: 74 61 2c 20 63 68 61 72 20 2a 62 75 66 2c 20 69  ta, char *buf, i
2a80: 6e 74 20 74 6f 52 65 61 64 2c 20 69 6e 74 20 2a  nt toRead, int *
2a90: 65 72 72 6f 72 43 6f 64 65 50 74 72 29 20 7b 0a  errorCodePtr) {.
2aa0: 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20      DigestState 
2ab0: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67  *statePtr = (Dig
2ac0: 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65  estState *) clie
2ad0: 6e 74 44 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f  ntData;.    Tcl_
2ae0: 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 3b 0a  Channel parent;.
2af0: 20 20 20 20 69 6e 74 20 72 65 61 64 3b 0a 20 20      int read;.  
2b00: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20    *errorCodePtr 
2b10: 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 41 62 6f  = 0;..    /* Abo
2b20: 72 74 20 69 66 20 6e 6f 74 68 69 6e 67 20 74 6f  rt if nothing to
2b30: 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 20 20   process */.    
2b40: 69 66 20 28 74 6f 52 65 61 64 20 3c 3d 20 30 20  if (toRead <= 0 
2b50: 7c 7c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  || statePtr->sel
2b60: 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65  f == (Tcl_Channe
2b70: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  l) NULL) {..retu
2b80: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 0;.    }..   
2b90: 20 2f 2a 20 47 65 74 20 62 79 74 65 73 20 66 72   /* Get bytes fr
2ba0: 6f 6d 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 68  om underlying ch
2bb0: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 70 61 72  annel */.    par
2bc0: 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 61  ent = Tcl_GetSta
2bd0: 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 61 74  ckedChannel(stat
2be0: 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 20  ePtr->self);.   
2bf0: 20 72 65 61 64 20 3d 20 54 63 6c 5f 52 65 61 64   read = Tcl_Read
2c00: 52 61 77 28 70 61 72 65 6e 74 2c 20 62 75 66 2c  Raw(parent, buf,
2c10: 20 74 6f 52 65 61 64 29 3b 0a 0a 20 20 20 20 2f   toRead);..    /
2c20: 2a 20 55 70 64 61 74 65 20 68 61 73 68 20 66 75  * Update hash fu
2c30: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66  nction */.    if
2c40: 20 28 72 65 61 64 20 3e 20 30 29 20 7b 0a 09 2f   (read > 0) {../
2c50: 2a 20 48 61 76 65 20 64 61 74 61 20 2a 2f 0a 09  * Have data */..
2c60: 69 66 20 28 21 44 69 67 65 73 74 55 70 64 61 74  if (!DigestUpdat
2c70: 65 28 73 74 61 74 65 50 74 72 2c 20 62 75 66 2c  e(statePtr, buf,
2c80: 20 28 73 69 7a 65 5f 74 29 20 72 65 61 64 2c 20   (size_t) read, 
2c90: 30 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53  0)) {..    Tcl_S
2ca0: 65 74 43 68 61 6e 6e 65 6c 45 72 72 6f 72 28 73  etChannelError(s
2cb0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 54  tatePtr->self, T
2cc0: 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 22 55 70  cl_ObjPrintf("Up
2cd0: 64 61 74 65 20 66 61 69 6c 65 64 3a 20 25 73 22  date failed: %s"
2ce0: 2c 20 52 45 41 53 4f 4e 28 29 29 29 3b 0a 09 20  , REASON()));.. 
2cf0: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72     *errorCodePtr
2d00: 20 3d 20 45 49 4e 56 41 4c 3b 0a 09 20 20 20 20   = EINVAL;..    
2d10: 72 65 74 75 72 6e 20 30 3b 0a 09 7d 0a 09 2f 2a  return 0;..}../*
2d20: 20 54 68 69 73 20 69 73 20 63 6f 72 72 65 63 74   This is correct
2d30: 20 2a 2f 0a 09 72 65 61 64 20 3d 20 2d 31 3b 0a   */..read = -1;.
2d40: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d  .*errorCodePtr =
2d50: 20 45 41 47 41 49 4e 3b 0a 0a 20 20 20 20 7d 20   EAGAIN;..    } 
2d60: 65 6c 73 65 20 69 66 20 28 72 65 61 64 20 3c 20  else if (read < 
2d70: 30 29 20 7b 0a 09 2f 2a 20 45 72 72 6f 72 20 2a  0) {../* Error *
2d80: 2f 0a 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72  /..*errorCodePtr
2d90: 20 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28   = Tcl_GetErrno(
2da0: 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  );..    } else i
2db0: 66 20 28 21 28 73 74 61 74 65 50 74 72 2d 3e 66  f (!(statePtr->f
2dc0: 6c 61 67 73 20 26 20 43 48 41 4e 5f 45 4f 46 29  lags & CHAN_EOF)
2dd0: 29 20 7b 0a 09 2f 2a 20 45 4f 46 20 2a 2f 0a 09  ) {../* EOF */..
2de0: 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f  Tcl_Obj *resultO
2df0: 62 6a 3b 0a 09 69 66 20 28 44 69 67 65 73 74 46  bj;..if (DigestF
2e00: 69 6e 61 6c 69 7a 65 28 73 74 61 74 65 50 74 72  inalize(statePtr
2e10: 2d 3e 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50  ->interp, stateP
2e20: 74 72 2c 20 26 72 65 73 75 6c 74 4f 62 6a 29 20  tr, &resultObj) 
2e30: 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20  == TCL_OK) {..  
2e40: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2e50: 2a 64 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 42  *data = Tcl_GetB
2e60: 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
2e70: 72 65 73 75 6c 74 4f 62 6a 2c 20 26 72 65 61 64  resultObj, &read
2e80: 29 3b 0a 09 20 20 20 20 6d 65 6d 63 70 79 28 62  );..    memcpy(b
2e90: 75 66 2c 20 64 61 74 61 2c 20 72 65 61 64 29 3b  uf, data, read);
2ea0: 0a 09 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  ..    Tcl_DecrRe
2eb0: 66 43 6f 75 6e 74 28 72 65 73 75 6c 74 4f 62 6a  fCount(resultObj
2ec0: 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20  );...} else {.. 
2ed0: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65     Tcl_SetChanne
2ee0: 6c 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2d  lError(statePtr-
2ef0: 3e 73 65 6c 66 2c 20 54 63 6c 5f 4f 62 6a 50 72  >self, Tcl_ObjPr
2f00: 69 6e 74 66 28 22 46 69 6e 61 6c 69 7a 65 20 66  intf("Finalize f
2f10: 61 69 6c 65 64 3a 20 25 73 22 2c 20 52 45 41 53  ailed: %s", REAS
2f20: 4f 4e 28 29 29 29 3b 0a 09 20 20 20 20 2a 65 72  ON()));..    *er
2f30: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49 4e  rorCodePtr = EIN
2f40: 56 41 4c 3b 0a 09 20 20 20 20 72 65 61 64 20 3d  VAL;..    read =
2f50: 20 30 3b 0a 09 7d 0a 09 73 74 61 74 65 50 74 72   0;..}..statePtr
2f60: 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 48 41 4e 5f  ->flags |= CHAN_
2f70: 45 4f 46 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  EOF;.    }.    r
2f80: 65 74 75 72 6e 20 72 65 61 64 3b 0a 7d 0a 0a 2f  eturn read;.}../
2f90: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
2fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
2fe0: 20 44 69 67 65 73 74 4f 75 74 70 75 74 50 72 6f   DigestOutputPro
2ff0: 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65  c --. *. *.Calle
3000: 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 63  d by the generic
3010: 20 49 4f 20 73 79 73 74 65 6d 20 74 6f 20 77 72   IO system to wr
3020: 69 74 65 20 64 61 74 61 20 69 6e 20 62 75 66 20  ite data in buf 
3030: 74 6f 20 74 72 61 6e 73 66 6f 72 6d 2e 0a 20 2a  to transform.. *
3040: 09 54 68 65 20 74 72 61 6e 73 66 6f 72 6d 20 77  .The transform w
3050: 72 69 74 65 73 20 74 68 65 20 72 65 73 75 6c 74  rites the result
3060: 20 74 6f 20 74 68 65 20 75 6e 64 65 72 6c 79 69   to the underlyi
3070: 6e 67 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20  ng channel.. *. 
3080: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 6f  * Returns:. *.To
3090: 74 61 6c 20 62 79 74 65 73 20 77 72 69 74 74 65  tal bytes writte
30a0: 6e 20 6f 72 20 2d 31 20 66 6f 72 20 61 6e 20 65  n or -1 for an e
30b0: 72 72 6f 72 20 61 6c 6f 6e 67 20 77 69 74 68 20  rror along with 
30c0: 61 20 50 4f 53 49 58 20 65 72 72 6f 72 0a 20 2a  a POSIX error. *
30d0: 09 63 6f 64 65 20 69 6e 20 65 72 72 6f 72 43 6f  .code in errorCo
30e0: 64 65 50 74 72 2e 20 55 73 65 20 45 41 47 41 49  dePtr. Use EAGAI
30f0: 4e 20 66 6f 72 20 6e 6f 6e 62 6c 6f 63 6b 69 6e  N for nonblockin
3100: 67 20 61 6e 64 20 63 61 6e 27 74 20 77 72 69 74  g and can't writ
3110: 65 20 64 61 74 61 2e 0a 20 2a 0a 20 2a 20 53 69  e data.. *. * Si
3120: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 47  de effects:. *.G
3130: 65 74 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66  et data from buf
3140: 20 61 6e 64 20 75 70 64 61 74 65 20 64 69 67 65   and update dige
3150: 73 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  st. *. *--------
3160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
31a0: 2a 2f 0a 20 69 6e 74 20 44 69 67 65 73 74 4f 75  */. int DigestOu
31b0: 74 70 75 74 50 72 6f 63 28 43 6c 69 65 6e 74 44  tputProc(ClientD
31c0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
31d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 62 75 66 2c  const char *buf,
31e0: 20 69 6e 74 20 74 6f 57 72 69 74 65 2c 20 69 6e   int toWrite, in
31f0: 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29  t *errorCodePtr)
3200: 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74 61   {.    DigestSta
3210: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
3220: 44 69 67 65 73 74 53 74 61 74 65 20 2a 29 20 63  DigestState *) c
3230: 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 2a  lientData;.    *
3240: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30  errorCodePtr = 0
3250: 3b 0a 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74 20  ;..    /* Abort 
3260: 69 66 20 6e 6f 74 68 69 6e 67 20 74 6f 20 70 72  if nothing to pr
3270: 6f 63 65 73 73 20 2a 2f 0a 20 20 20 20 69 66 20  ocess */.    if 
3280: 28 74 6f 57 72 69 74 65 20 3c 3d 20 30 20 7c 7c  (toWrite <= 0 ||
3290: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20   statePtr->self 
32a0: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29  == (Tcl_Channel)
32b0: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
32c0: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
32d0: 2a 20 55 70 64 61 74 65 20 68 61 73 68 20 66 75  * Update hash fu
32e0: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66  nction */.    if
32f0: 20 28 74 6f 57 72 69 74 65 20 3e 20 30 20 26 26   (toWrite > 0 &&
3300: 20 21 44 69 67 65 73 74 55 70 64 61 74 65 28 73   !DigestUpdate(s
3310: 74 61 74 65 50 74 72 2c 20 62 75 66 2c 20 28 73  tatePtr, buf, (s
3320: 69 7a 65 5f 74 29 20 74 6f 57 72 69 74 65 2c 20  ize_t) toWrite, 
3330: 30 29 29 20 7b 0a 09 54 63 6c 5f 53 65 74 43 68  0)) {..Tcl_SetCh
3340: 61 6e 6e 65 6c 45 72 72 6f 72 28 73 74 61 74 65  annelError(state
3350: 50 74 72 2d 3e 73 65 6c 66 2c 20 54 63 6c 5f 4f  Ptr->self, Tcl_O
3360: 62 6a 50 72 69 6e 74 66 28 22 55 70 64 61 74 65  bjPrintf("Update
3370: 20 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 52 45   failed: %s", RE
3380: 41 53 4f 4e 28 29 29 29 3b 0a 09 2a 65 72 72 6f  ASON()));..*erro
3390: 72 43 6f 64 65 50 74 72 20 3d 20 45 49 4e 56 41  rCodePtr = EINVA
33a0: 4c 3b 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20  L;..return 0;.  
33b0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 74    }.    return t
33c0: 6f 57 72 69 74 65 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  oWrite;.}../*. *
33d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3410: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67  ------. *. * Dig
3420: 65 73 74 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63  estSetOptionProc
3430: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64   --. *. *.Called
3440: 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20   by the generic 
3450: 49 4f 20 73 79 73 74 65 6d 20 74 6f 20 73 65 74  IO system to set
3460: 20 63 68 61 6e 6e 65 6c 20 6f 70 74 69 6f 6e 20   channel option 
3470: 6e 61 6d 65 20 74 6f 20 76 61 6c 75 65 2e 0a 20  name to value.. 
3480: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a  *. * Returns:. *
3490: 09 54 43 4c 5f 4f 4b 20 69 66 20 73 75 63 63 65  .TCL_OK if succe
34a0: 73 73 66 75 6c 20 6f 72 20 54 43 4c 5f 45 52 52  ssful or TCL_ERR
34b0: 4f 52 20 69 66 20 66 61 69 6c 65 64 20 61 6c 6f  OR if failed alo
34c0: 6e 67 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  ng with an error
34d0: 0a 20 2a 09 6d 65 73 73 61 67 65 20 69 6e 20 69  . *.message in i
34e0: 6e 74 65 72 70 20 61 6e 64 20 54 63 6c 5f 53 65  nterp and Tcl_Se
34f0: 74 45 72 72 6e 6f 2e 0a 20 2a 0a 20 2a 20 53 69  tErrno.. *. * Si
3500: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 55  de effects:. *.U
3510: 70 64 61 74 65 73 20 63 68 61 6e 6e 65 6c 20 6f  pdates channel o
3520: 70 74 69 6f 6e 20 74 6f 20 6e 65 77 20 76 61 6c  ption to new val
3530: 75 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ue.. *. *-------
3540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
3580: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44   */.static int D
3590: 69 67 65 73 74 53 65 74 4f 70 74 69 6f 6e 50 72  igestSetOptionPr
35a0: 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  oc(ClientData cl
35b0: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e  ientData, Tcl_In
35c0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 63 6f  terp *interp, co
35d0: 6e 73 74 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e  nst char *option
35e0: 4e 61 6d 65 2c 0a 09 63 6f 6e 73 74 20 63 68 61  Name,..const cha
35f0: 72 20 2a 6f 70 74 69 6f 6e 56 61 6c 75 65 29 20  r *optionValue) 
3600: 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74  {.    DigestStat
3610: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44  e *statePtr = (D
3620: 69 67 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c  igestState *) cl
3630: 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 54 63  ientData;.    Tc
3640: 6c 5f 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74  l_Channel parent
3650: 3b 0a 20 20 20 20 54 63 6c 5f 44 72 69 76 65 72  ;.    Tcl_Driver
3660: 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2a 73  SetOptionProc *s
3670: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 3b 0a 0a 20  etOptionProc;.. 
3680: 20 20 20 2f 2a 20 41 62 6f 72 74 20 69 66 20 6e     /* Abort if n
3690: 6f 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20  o channel */.   
36a0: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73   if (statePtr->s
36b0: 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  elf == (Tcl_Chan
36c0: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  nel) NULL) {..re
36d0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
36e0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
36f0: 6c 65 67 61 74 65 20 6f 70 74 69 6f 6e 73 20 64  legate options d
3700: 6f 77 6e 73 74 72 65 61 6d 20 2a 2f 0a 20 20 20  ownstream */.   
3710: 20 70 61 72 65 6e 74 20 3d 20 54 63 6c 5f 47 65   parent = Tcl_Ge
3720: 74 53 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28  tStackedChannel(
3730: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b  statePtr->self);
3740: 0a 20 20 20 20 73 65 74 4f 70 74 69 6f 6e 50 72  .    setOptionPr
3750: 6f 63 20 3d 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  oc = Tcl_Channel
3760: 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 54 63  SetOptionProc(Tc
3770: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65  l_GetChannelType
3780: 28 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 69  (parent));.    i
3790: 66 20 28 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63  f (setOptionProc
37a0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74   != NULL) {..ret
37b0: 75 72 6e 20 28 2a 73 65 74 4f 70 74 69 6f 6e 50  urn (*setOptionP
37c0: 72 6f 63 29 28 54 63 6c 5f 47 65 74 43 68 61 6e  roc)(Tcl_GetChan
37d0: 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28  nelInstanceData(
37e0: 70 61 72 65 6e 74 29 2c 20 69 6e 74 65 72 70 2c  parent), interp,
37f0: 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 6f 70 74   optionName, opt
3800: 69 6f 6e 56 61 6c 75 65 29 3b 0a 20 20 20 20 7d  ionValue);.    }
3810: 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 53 65 74   else {..Tcl_Set
3820: 45 72 72 6e 6f 28 45 49 4e 56 41 4c 29 3b 0a 09  Errno(EINVAL);..
3830: 72 65 74 75 72 6e 20 54 63 6c 5f 42 61 64 43 68  return Tcl_BadCh
3840: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
3850: 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20  rp, optionName, 
3860: 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a  NULL);.    }.}..
3870: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
3880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38a0: 2d 2d 2d 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 0a 20 2a 0a 20  -----------. *. 
38c0: 2a 20 44 69 67 65 73 74 47 65 74 4f 70 74 69 6f  * DigestGetOptio
38d0: 6e 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43  nProc --. *. *.C
38e0: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 67 65 6e  alled by the gen
38f0: 65 72 69 63 20 49 4f 20 73 79 73 74 65 6d 20 74  eric IO system t
3900: 6f 20 67 65 74 20 63 68 61 6e 6e 65 6c 20 6f 70  o get channel op
3910: 74 69 6f 6e 20 6e 61 6d 65 27 73 20 76 61 6c 75  tion name's valu
3920: 65 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73  e.. *. * Returns
3930: 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 69 66 20 73  :. *.TCL_OK if s
3940: 75 63 63 65 73 73 66 75 6c 20 6f 72 20 54 43 4c  uccessful or TCL
3950: 5f 45 52 52 4f 52 20 69 66 20 66 61 69 6c 65 64  _ERROR if failed
3960: 20 61 6c 6f 6e 67 20 77 69 74 68 20 61 6e 20 65   along with an e
3970: 72 72 6f 72 0a 20 2a 09 6d 65 73 73 61 67 65 20  rror. *.message 
3980: 69 6e 20 69 6e 74 65 72 70 20 61 6e 64 20 54 63  in interp and Tc
3990: 6c 5f 53 65 74 45 72 72 6e 6f 2e 0a 20 2a 0a 20  l_SetErrno.. *. 
39a0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
39b0: 20 2a 09 53 65 74 73 20 72 65 73 75 6c 74 20 74   *.Sets result t
39c0: 6f 20 6f 70 74 69 6f 6e 27 73 20 76 61 6c 75 65  o option's value
39d0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
39e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
3a20: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 69 67 65  .static int Dige
3a30: 73 74 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28  stGetOptionProc(
3a40: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
3a50: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
3a60: 70 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74  p *interp, const
3a70: 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d   char *optionNam
3a80: 65 2c 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 20  e,..Tcl_DString 
3a90: 2a 6f 70 74 69 6f 6e 56 61 6c 75 65 29 20 7b 0a  *optionValue) {.
3aa0: 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20      DigestState 
3ab0: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67  *statePtr = (Dig
3ac0: 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65  estState *) clie
3ad0: 6e 74 44 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f  ntData;.    Tcl_
3ae0: 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 3b 0a  Channel parent;.
3af0: 20 20 20 20 54 63 6c 5f 44 72 69 76 65 72 47 65      Tcl_DriverGe
3b00: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2a 67 65 74  tOptionProc *get
3b10: 4f 70 74 69 6f 6e 50 72 6f 63 3b 0a 0a 20 20 20  OptionProc;..   
3b20: 20 2f 2a 20 41 62 6f 72 74 20 69 66 20 6e 6f 20   /* Abort if no 
3b30: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69  channel */.    i
3b40: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  f (statePtr->sel
3b50: 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65  f == (Tcl_Channe
3b60: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  l) NULL) {..retu
3b70: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
3b80: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65    }..    /* Dele
3b90: 67 61 74 65 20 6f 70 74 69 6f 6e 73 20 64 6f 77  gate options dow
3ba0: 6e 73 74 72 65 61 6d 20 2a 2f 0a 20 20 20 20 70  nstream */.    p
3bb0: 61 72 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53  arent = Tcl_GetS
3bc0: 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74  tackedChannel(st
3bd0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 20  atePtr->self);. 
3be0: 20 20 20 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63     getOptionProc
3bf0: 20 3d 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 47 65   = Tcl_ChannelGe
3c00: 74 4f 70 74 69 6f 6e 50 72 6f 63 28 54 63 6c 5f  tOptionProc(Tcl_
3c10: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 70  GetChannelType(p
3c20: 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 69 66 20  arent));.    if 
3c30: 28 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 21  (getOptionProc !
3c40: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  = NULL) {..retur
3c50: 6e 20 28 2a 67 65 74 4f 70 74 69 6f 6e 50 72 6f  n (*getOptionPro
3c60: 63 29 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  c)(Tcl_GetChanne
3c70: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 70 61  lInstanceData(pa
3c80: 72 65 6e 74 29 2c 20 69 6e 74 65 72 70 2c 20 6f  rent), interp, o
3c90: 70 74 69 6f 6e 4e 61 6d 65 2c 20 6f 70 74 69 6f  ptionName, optio
3ca0: 6e 56 61 6c 75 65 29 3b 0a 20 20 20 20 7d 20 65  nValue);.    } e
3cb0: 6c 73 65 20 69 66 20 28 6f 70 74 69 6f 6e 4e 61  lse if (optionNa
3cc0: 6d 65 20 3d 3d 20 28 63 68 61 72 2a 29 20 4e 55  me == (char*) NU
3cd0: 4c 4c 29 20 7b 0a 09 2f 2a 20 52 65 71 75 65 73  LL) {../* Reques
3ce0: 74 20 69 73 20 71 75 65 72 79 20 66 6f 72 20 61  t is query for a
3cf0: 6c 6c 20 6f 70 74 69 6f 6e 73 2c 20 74 68 69 73  ll options, this
3d00: 20 69 73 20 6f 6b 2e 20 2a 2f 0a 09 72 65 74 75   is ok. */..retu
3d10: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d  rn TCL_OK;.    }
3d20: 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 53 65 74   else {..Tcl_Set
3d30: 45 72 72 6e 6f 28 45 49 4e 56 41 4c 29 3b 0a 09  Errno(EINVAL);..
3d40: 72 65 74 75 72 6e 20 54 63 6c 5f 42 61 64 43 68  return Tcl_BadCh
3d50: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
3d60: 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20  rp, optionName, 
3d70: 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a  NULL);.    }.}..
3d80: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
3d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
3dd0: 2a 20 44 69 67 65 73 74 54 69 6d 65 72 48 61 6e  * DigestTimerHan
3de0: 64 6c 65 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61  dler --. *. *.Ca
3df0: 6c 6c 65 64 20 62 79 20 74 68 65 20 6e 6f 74 69  lled by the noti
3e00: 66 69 65 72 20 76 69 61 20 74 69 6d 65 72 20 74  fier via timer t
3e10: 6f 20 66 6c 75 73 68 20 6f 75 74 20 70 65 6e 64  o flush out pend
3e20: 69 6e 67 20 69 6e 70 75 74 20 64 61 74 61 2e 0a  ing input data..
3e30: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20   *. * Returns:. 
3e40: 2a 09 4e 6f 74 68 69 6e 67 0a 20 2a 0a 20 2a 20  *.Nothing. *. * 
3e50: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
3e60: 09 4d 61 79 20 63 61 6c 6c 20 54 63 6c 5f 4e 6f  .May call Tcl_No
3e70: 74 69 66 79 43 68 61 6e 6e 65 6c 0a 20 2a 0a 20  tifyChannel. *. 
3e80: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
3e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ec0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
3ed0: 69 63 20 76 6f 69 64 20 44 69 67 65 73 74 54 69  ic void DigestTi
3ee0: 6d 65 72 48 61 6e 64 6c 65 72 28 43 6c 69 65 6e  merHandler(Clien
3ef0: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
3f00: 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74  ) {.    DigestSt
3f10: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
3f20: 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 29 20  (DigestState *) 
3f30: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20  clientData;..   
3f40: 20 2f 2a 20 41 62 6f 72 74 20 69 66 20 6e 6f 20   /* Abort if no 
3f50: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69  channel */.    i
3f60: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  f (statePtr->sel
3f70: 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65  f == (Tcl_Channe
3f80: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  l) NULL) {..retu
3f90: 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rn;.    }..    /
3fa0: 2a 20 43 6c 65 61 72 20 74 69 6d 65 72 20 74 6f  * Clear timer to
3fb0: 6b 65 6e 20 2a 2f 0a 20 20 20 20 73 74 61 74 65  ken */.    state
3fc0: 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63  Ptr->timer = (Tc
3fd0: 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55  l_TimerToken) NU
3fe0: 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 72 65  LL;..    /* Fire
3ff0: 20 65 76 65 6e 74 20 69 66 20 74 68 65 72 65 20   event if there 
4000: 69 73 20 70 65 6e 64 69 6e 67 20 64 61 74 61 2c  is pending data,
4010: 20 73 6b 69 70 20 6f 74 68 65 72 77 69 73 65 20   skip otherwise 
4020: 2a 2f 0a 20 20 20 20 69 66 20 28 28 73 74 61 74  */.    if ((stat
4030: 65 50 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b 20  ePtr->watchMask 
4040: 26 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 29 20  & TCL_READABLE) 
4050: 26 26 20 28 54 63 6c 5f 49 6e 70 75 74 42 75 66  && (Tcl_InputBuf
4060: 66 65 72 65 64 28 73 74 61 74 65 50 74 72 2d 3e  fered(statePtr->
4070: 73 65 6c 66 29 20 3e 20 30 29 29 20 7b 0a 09 54  self) > 0)) {..T
4080: 63 6c 5f 4e 6f 74 69 66 79 43 68 61 6e 6e 65 6c  cl_NotifyChannel
4090: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c  (statePtr->self,
40a0: 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 29 3b 0a   TCL_READABLE);.
40b0: 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d      }.}../*. *--
40c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 0a 20 2a 20 44 69 67 65 73  ----. *. * Diges
4110: 74 57 61 74 63 68 50 72 6f 63 20 2d 2d 0a 20 2a  tWatchProc --. *
4120: 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 20 74  . *.Initialize t
4130: 68 65 20 6e 6f 74 69 66 69 65 72 20 74 6f 20 77  he notifier to w
4140: 61 74 63 68 20 66 6f 72 20 65 76 65 6e 74 73 20  atch for events 
4150: 66 72 6f 6d 20 74 68 69 73 20 63 68 61 6e 6e 65  from this channe
4160: 6c 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73  l.. *. * Returns
4170: 3a 0a 20 2a 09 4e 6f 74 68 69 6e 67 20 28 63 61  :. *.Nothing (ca
4180: 6e 27 74 20 72 65 74 75 72 6e 20 65 72 72 6f 72  n't return error
4190: 20 6d 65 73 73 61 67 65 73 29 0a 20 2a 0a 20 2a   messages). *. *
41a0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
41b0: 2a 09 43 6f 6e 66 69 67 75 72 65 20 6e 6f 74 69  *.Configure noti
41c0: 66 69 65 72 20 73 6f 20 66 75 74 75 72 65 20 65  fier so future e
41d0: 76 65 6e 74 73 20 6f 6e 20 74 68 65 20 63 68 61  vents on the cha
41e0: 6e 6e 65 6c 20 77 69 6c 6c 20 62 65 20 73 65 65  nnel will be see
41f0: 6e 20 62 79 20 54 63 6c 2e 0a 20 2a 0a 20 2a 2d  n by Tcl.. *. *-
4200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4240: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 44  -----. */.void D
4250: 69 67 65 73 74 57 61 74 63 68 50 72 6f 63 28 43  igestWatchProc(C
4260: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
4270: 44 61 74 61 2c 20 69 6e 74 20 6d 61 73 6b 29 20  Data, int mask) 
4280: 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74  {.    DigestStat
4290: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44  e *statePtr = (D
42a0: 69 67 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c  igestState *) cl
42b0: 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 54 63  ientData;.    Tc
42c0: 6c 5f 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74  l_Channel parent
42d0: 3b 0a 20 20 20 20 54 63 6c 5f 44 72 69 76 65 72  ;.    Tcl_Driver
42e0: 57 61 74 63 68 50 72 6f 63 20 2a 77 61 74 63 68  WatchProc *watch
42f0: 50 72 6f 63 3b 0a 0a 20 20 20 20 2f 2a 20 41 62  Proc;..    /* Ab
4300: 6f 72 74 20 69 66 20 6e 6f 20 63 68 61 6e 6e 65  ort if no channe
4310: 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61  l */.    if (sta
4320: 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28  tePtr->self == (
4330: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
4340: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 3b 0a 20 20  L) {..return;.  
4350: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72    }..    /* Stor
4360: 65 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74  e OR-ed combinat
4370: 69 6f 6e 20 6f 66 20 54 43 4c 5f 52 45 41 44 41  ion of TCL_READA
4380: 42 4c 45 2c 20 54 43 4c 5f 57 52 49 54 41 42 4c  BLE, TCL_WRITABL
4390: 45 20 61 6e 64 20 54 43 4c 5f 45 58 43 45 50 54  E and TCL_EXCEPT
43a0: 49 4f 4e 20 2a 2f 0a 20 20 20 20 73 74 61 74 65  ION */.    state
43b0: 50 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b 20 3d  Ptr->watchMask =
43c0: 20 6d 61 73 6b 3b 0a 0a 20 20 20 20 2f 2a 20 50   mask;..    /* P
43d0: 72 6f 70 61 67 61 74 65 20 6d 61 73 6b 20 69 6e  ropagate mask in
43e0: 66 6f 20 74 6f 20 70 61 72 65 6e 74 20 63 68 61  fo to parent cha
43f0: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 70 61 72 65  nnel */.    pare
4400: 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 63  nt = Tcl_GetStac
4410: 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 65  kedChannel(state
4420: 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 20  Ptr->self);.    
4430: 77 61 74 63 68 50 72 6f 63 20 3d 20 54 63 6c 5f  watchProc = Tcl_
4440: 43 68 61 6e 6e 65 6c 57 61 74 63 68 50 72 6f 63  ChannelWatchProc
4450: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54  (Tcl_GetChannelT
4460: 79 70 65 28 70 61 72 65 6e 74 29 29 3b 0a 20 20  ype(parent));.  
4470: 20 20 77 61 74 63 68 50 72 6f 63 28 54 63 6c 5f    watchProc(Tcl_
4480: 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e  GetChannelInstan
4490: 63 65 44 61 74 61 28 70 61 72 65 6e 74 29 2c 20  ceData(parent), 
44a0: 6d 61 73 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 52  mask);..    /* R
44b0: 65 6d 6f 76 65 20 70 65 6e 64 69 6e 67 20 74 69  emove pending ti
44c0: 6d 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 28 73  mer */.    if (s
44d0: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21  tatePtr->timer !
44e0: 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65  = (Tcl_TimerToke
44f0: 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f  n) NULL) {..Tcl_
4500: 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c  DeleteTimerHandl
4510: 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d  er(statePtr->tim
4520: 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  er);..statePtr->
4530: 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d  timer = (Tcl_Tim
4540: 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 20  erToken) NULL;. 
4550: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
4560: 74 68 65 72 65 20 69 73 20 64 61 74 61 20 70 65  there is data pe
4570: 6e 64 69 6e 67 2c 20 73 65 74 20 6e 65 77 20 74  nding, set new t
4580: 69 6d 65 72 20 74 6f 20 63 61 6c 6c 20 54 63 6c  imer to call Tcl
4590: 5f 4e 6f 74 69 66 79 43 68 61 6e 6e 65 6c 20 2a  _NotifyChannel *
45a0: 2f 0a 20 20 20 20 69 66 20 28 28 6d 61 73 6b 20  /.    if ((mask 
45b0: 26 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 29 20  & TCL_READABLE) 
45c0: 26 26 20 28 54 63 6c 5f 49 6e 70 75 74 42 75 66  && (Tcl_InputBuf
45d0: 66 65 72 65 64 28 73 74 61 74 65 50 74 72 2d 3e  fered(statePtr->
45e0: 73 65 6c 66 29 20 3e 20 30 29 29 20 7b 0a 09 73  self) > 0)) {..s
45f0: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d  tatePtr->timer =
4600: 20 54 63 6c 5f 43 72 65 61 74 65 54 69 6d 65 72   Tcl_CreateTimer
4610: 48 61 6e 64 6c 65 72 28 52 45 41 44 5f 44 45 4c  Handler(READ_DEL
4620: 41 59 2c 20 44 69 67 65 73 74 54 69 6d 65 72 48  AY, DigestTimerH
4630: 61 6e 64 6c 65 72 2c 20 28 43 6c 69 65 6e 74 44  andler, (ClientD
4640: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a  ata) statePtr);.
4650: 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d      }.}../*. *--
4660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46a0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73  ----. *. * Diges
46b0: 74 47 65 74 48 61 6e 64 6c 65 50 72 6f 63 20 2d  tGetHandleProc -
46c0: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 66  -. *. *.Called f
46d0: 72 6f 6d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  rom Tcl_GetChann
46e0: 65 6c 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 72  elHandle to retr
46f0: 69 65 76 65 20 4f 53 20 73 70 65 63 69 66 69 63  ieve OS specific
4700: 20 66 69 6c 65 20 68 61 6e 64 6c 65 0a 20 2a 09   file handle. *.
4710: 66 72 6f 6d 20 69 6e 73 69 64 65 20 74 68 69 73  from inside this
4720: 20 63 68 61 6e 6e 65 6c 2e 20 4e 6f 74 20 75 73   channel. Not us
4730: 65 64 20 66 6f 72 20 74 72 61 6e 73 66 6f 72 6d  ed for transform
4740: 61 74 69 6f 6e 73 3f 0a 20 2a 0a 20 2a 20 52 65  ations?. *. * Re
4750: 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b  turns:. *.TCL_OK
4760: 20 66 6f 72 20 73 75 63 63 65 73 73 20 6f 72 20   for success or 
4770: 54 43 4c 5f 45 52 52 4f 52 20 66 6f 72 20 65 72  TCL_ERROR for er
4780: 72 6f 72 20 6f 72 20 69 66 20 6e 6f 74 20 73 75  ror or if not su
4790: 70 70 6f 72 74 65 64 2e 20 49 66 0a 20 2a 09 64  pported. If. *.d
47a0: 69 72 65 63 74 69 6f 6e 20 69 73 20 54 43 4c 5f  irection is TCL_
47b0: 52 45 41 44 41 42 4c 45 2c 20 73 65 74 73 20 68  READABLE, sets h
47c0: 61 6e 64 6c 65 50 74 72 20 74 6f 20 74 68 65 20  andlePtr to the 
47d0: 68 61 6e 64 6c 65 20 75 73 65 64 20 66 6f 72 0a  handle used for.
47e0: 20 2a 09 69 6e 70 75 74 2c 20 6f 72 20 69 66 20   *.input, or if 
47f0: 54 43 4c 5f 57 52 49 54 41 42 4c 45 20 73 65 74  TCL_WRITABLE set
4800: 73 20 74 6f 20 74 68 65 20 68 61 6e 64 6c 65 20  s to the handle 
4810: 75 73 65 64 20 66 6f 72 20 6f 75 74 70 75 74 2e  used for output.
4820: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
4830: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a  cts:. *.None. *.
4840: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
4850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4880: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74  --------. */.int
4890: 20 44 69 67 65 73 74 47 65 74 48 61 6e 64 6c 65   DigestGetHandle
48a0: 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20  Proc(ClientData 
48b0: 63 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e 74 20  clientData, int 
48c0: 64 69 72 65 63 74 69 6f 6e 2c 20 43 6c 69 65 6e  direction, Clien
48d0: 74 44 61 74 61 20 2a 68 61 6e 64 6c 65 50 74 72  tData *handlePtr
48e0: 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74  ) {.    DigestSt
48f0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
4900: 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 29 20  (DigestState *) 
4910: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20  clientData;.    
4920: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 70 61 72 65  Tcl_Channel pare
4930: 6e 74 3b 0a 0a 20 20 20 20 2f 2a 20 41 62 6f 72  nt;..    /* Abor
4940: 74 20 69 66 20 6e 6f 20 63 68 61 6e 6e 65 6c 20  t if no channel 
4950: 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  */.    if (state
4960: 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63  Ptr->self == (Tc
4970: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29  l_Channel) NULL)
4980: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
4990: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
49a0: 20 70 61 72 65 6e 74 20 3d 20 54 63 6c 5f 47 65   parent = Tcl_Ge
49b0: 74 53 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28  tStackedChannel(
49c0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b  statePtr->self);
49d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f  .    return Tcl_
49e0: 47 65 74 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65  GetChannelHandle
49f0: 28 70 61 72 65 6e 74 2c 20 64 69 72 65 63 74 69  (parent, directi
4a00: 6f 6e 2c 20 68 61 6e 64 6c 65 50 74 72 29 3b 0a  on, handlePtr);.
4a10: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
4a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20  --------------. 
4a60: 2a 0a 20 2a 20 44 69 67 65 73 74 4e 6f 74 69 66  *. * DigestNotif
4a70: 79 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43  yProc --. *. *.C
4a80: 61 6c 6c 65 64 20 62 79 20 54 63 6c 20 74 6f 20  alled by Tcl to 
4a90: 69 6e 66 6f 72 6d 20 75 73 20 6f 66 20 61 63 74  inform us of act
4aa0: 69 76 69 74 79 20 6f 6e 20 74 68 65 20 75 6e 64  ivity on the und
4ab0: 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 2e  erlying channel.
4ac0: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a  . *. * Returns:.
4ad0: 20 2a 09 55 6e 63 68 61 6e 67 65 64 20 69 6e 74   *.Unchanged int
4ae0: 65 72 65 73 74 4d 61 73 6b 20 77 68 69 63 68 20  erestMask which 
4af0: 69 73 20 61 6e 20 4f 52 2d 65 64 20 63 6f 6d 62  is an OR-ed comb
4b00: 69 6e 61 74 69 6f 6e 20 6f 66 20 54 43 4c 5f 52  ination of TCL_R
4b10: 45 41 44 41 42 4c 45 20 6f 72 20 54 43 4c 5f 57  EADABLE or TCL_W
4b20: 52 49 54 41 42 4c 45 0a 20 2a 0a 20 2a 20 53 69  RITABLE. *. * Si
4b30: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
4b40: 61 6e 63 65 6c 73 20 61 6e 79 20 70 65 6e 64 69  ancels any pendi
4b50: 6e 67 20 74 69 6d 65 72 2e 0a 20 2a 0a 20 2a 2d  ng timer.. *. *-
4b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ba0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69  -----. */.int Di
4bb0: 67 65 73 74 4e 6f 74 69 66 79 50 72 6f 63 28 43  gestNotifyProc(C
4bc0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
4bd0: 44 61 74 61 2c 20 69 6e 74 20 69 6e 74 65 72 65  Data, int intere
4be0: 73 74 4d 61 73 6b 29 20 7b 0a 20 20 20 20 44 69  stMask) {.    Di
4bf0: 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65  gestState *state
4c00: 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 61  Ptr = (DigestSta
4c10: 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61  te *) clientData
4c20: 3b 0a 0a 20 20 20 20 2f 2a 20 53 6b 69 70 20 74  ;..    /* Skip t
4c30: 69 6d 65 72 20 65 76 65 6e 74 20 61 73 20 72 65  imer event as re
4c40: 64 75 6e 64 61 6e 74 20 2a 2f 0a 20 20 20 20 69  dundant */.    i
4c50: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d  f (statePtr->tim
4c60: 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72  er != (Tcl_Timer
4c70: 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09  Token) NULL) {..
4c80: 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48  Tcl_DeleteTimerH
4c90: 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d  andler(statePtr-
4ca0: 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50  >timer);..stateP
4cb0: 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c  tr->timer = (Tcl
4cc0: 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c  _TimerToken) NUL
4cd0: 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  L;.    }.    ret
4ce0: 75 72 6e 20 69 6e 74 65 72 65 73 74 4d 61 73 6b  urn interestMask
4cf0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 0a 20 2a 20 43 68  ;.}../*. *. * Ch
4d00: 61 6e 6e 65 6c 20 74 79 70 65 20 73 74 72 75 63  annel type struc
4d10: 74 75 72 65 20 64 65 66 69 6e 69 74 69 6f 6e 20  ture definition 
4d20: 66 6f 72 20 64 69 67 65 73 74 20 74 72 61 6e 73  for digest trans
4d30: 66 6f 72 6d 61 74 69 6f 6e 73 2e 0a 20 2a 0a 20  formations.. *. 
4d40: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
4d50: 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20  Tcl_ChannelType 
4d60: 64 69 67 65 73 74 43 68 61 6e 6e 65 6c 54 79 70  digestChannelTyp
4d70: 65 20 3d 20 7b 0a 20 20 20 20 22 64 69 67 65 73  e = {.    "diges
4d80: 74 22 2c 09 09 09 2f 2a 20 54 79 70 65 20 6e 61  t",.../* Type na
4d90: 6d 65 20 2a 2f 0a 20 20 20 20 54 43 4c 5f 43 48  me */.    TCL_CH
4da0: 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 35 2c  ANNEL_VERSION_5,
4db0: 09 2f 2a 20 76 35 20 63 68 61 6e 6e 65 6c 20 2a  ./* v5 channel *
4dc0: 2f 0a 20 20 20 20 44 69 67 65 73 74 43 6c 6f 73  /.    DigestClos
4dd0: 65 50 72 6f 63 2c 09 09 2f 2a 20 43 6c 6f 73 65  eProc,../* Close
4de0: 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 44 69 67   proc */.    Dig
4df0: 65 73 74 49 6e 70 75 74 50 72 6f 63 2c 09 09 2f  estInputProc,../
4e00: 2a 20 49 6e 70 75 74 20 70 72 6f 63 20 2a 2f 0a  * Input proc */.
4e10: 20 20 20 20 44 69 67 65 73 74 4f 75 74 70 75 74      DigestOutput
4e20: 50 72 6f 63 2c 09 09 2f 2a 20 4f 75 74 70 75 74  Proc,../* Output
4e30: 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 4e 55 4c   proc */.    NUL
4e40: 4c 2c 09 09 09 2f 2a 20 53 65 65 6b 20 70 72 6f  L,.../* Seek pro
4e50: 63 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 53  c */.    DigestS
4e60: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 2c 09 2f 2a  etOptionProc,./*
4e70: 20 53 65 74 20 6f 70 74 69 6f 6e 20 70 72 6f 63   Set option proc
4e80: 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 47 65   */.    DigestGe
4e90: 74 4f 70 74 69 6f 6e 50 72 6f 63 2c 09 2f 2a 20  tOptionProc,./* 
4ea0: 47 65 74 20 6f 70 74 69 6f 6e 20 70 72 6f 63 20  Get option proc 
4eb0: 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 57 61 74  */.    DigestWat
4ec0: 63 68 50 72 6f 63 2c 09 09 2f 2a 20 49 6e 69 74  chProc,../* Init
4ed0: 69 61 6c 69 7a 65 20 6e 6f 74 69 66 69 65 72 20  ialize notifier 
4ee0: 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 47 65 74  */.    DigestGet
4ef0: 48 61 6e 64 6c 65 50 72 6f 63 2c 09 2f 2a 20 47  HandleProc,./* G
4f00: 65 74 20 4f 53 20 68 61 6e 64 6c 65 73 20 6f 75  et OS handles ou
4f10: 74 20 6f 66 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  t of channel */.
4f20: 20 20 20 20 44 69 67 65 73 74 43 6c 6f 73 65 32      DigestClose2
4f30: 50 72 6f 63 2c 09 09 2f 2a 20 63 6c 6f 73 65 32  Proc,../* close2
4f40: 70 72 6f 63 20 2a 2f 0a 20 20 20 20 44 69 67 65  proc */.    Dige
4f50: 73 74 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 2c  stBlockModeProc,
4f60: 09 2f 2a 20 53 65 74 20 62 6c 6f 63 6b 69 6e 67  ./* Set blocking
4f70: 2f 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64  /nonblocking mod
4f80: 65 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 09  e*/.    NULL,...
4f90: 2f 2a 20 46 6c 75 73 68 20 70 72 6f 63 20 2a 2f  /* Flush proc */
4fa0: 0a 20 20 20 20 44 69 67 65 73 74 4e 6f 74 69 66  .    DigestNotif
4fb0: 79 50 72 6f 63 2c 09 09 2f 2a 20 48 61 6e 64 6c  yProc,../* Handl
4fc0: 69 6e 67 20 6f 66 20 65 76 65 6e 74 73 20 62 75  ing of events bu
4fd0: 62 62 6c 69 6e 67 20 75 70 20 2a 2f 0a 20 20 20  bbling up */.   
4fe0: 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 57 69 64 65   NULL,.../* Wide
4ff0: 20 73 65 65 6b 20 70 72 6f 63 20 2a 2f 0a 20 20   seek proc */.  
5000: 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 54 68 72    NULL,.../* Thr
5010: 65 61 64 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ead action */.  
5020: 20 20 4e 55 4c 4c 09 09 09 2f 2a 20 54 72 75 6e    NULL.../* Trun
5030: 63 61 74 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 20  cate */.};../*. 
5040: 2a 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 2d 0a 20 2a 0a 20 2a 20 44 69  -------. *. * Di
5090: 67 65 73 74 43 68 61 6e 6e 65 6c 48 61 6e 64 6c  gestChannelHandl
50a0: 65 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 72 65 61  er --. *. *.Crea
50b0: 74 65 20 61 20 73 74 61 63 6b 65 64 20 63 68 61  te a stacked cha
50c0: 6e 6e 65 6c 20 66 6f 72 20 61 20 6d 65 73 73 61  nnel for a messa
50d0: 67 65 20 64 69 67 65 73 74 20 74 72 61 6e 73 66  ge digest transf
50e0: 6f 72 6d 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20  ormation.. *. * 
50f0: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f  Returns:. *.TCL_
5100: 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a  OK or TCL_ERROR.
5110: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
5120: 74 73 3a 0a 20 2a 09 41 64 64 73 20 74 72 61 6e  ts:. *.Adds tran
5130: 73 66 6f 72 6d 20 74 6f 20 63 68 61 6e 6e 65 6c  sform to channel
5140: 20 61 6e 64 20 73 65 74 73 20 72 65 73 75 6c 74   and sets result
5150: 20 74 6f 20 63 68 61 6e 6e 65 6c 20 69 64 20 6f   to channel id o
5160: 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  r error message.
5170: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
5180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
51c0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 44 69 67 65  .static int.Dige
51d0: 73 74 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72  stChannelHandler
51e0: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
51f0: 65 72 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  erp, const char 
5200: 2a 63 68 61 6e 6e 65 6c 2c 20 63 6f 6e 73 74 20  *channel, const 
5210: 45 56 50 5f 4d 44 20 2a 6d 64 2c 0a 09 63 6f 6e  EVP_MD *md,..con
5220: 73 74 20 45 56 50 5f 43 49 50 48 45 52 20 2a 63  st EVP_CIPHER *c
5230: 69 70 68 65 72 2c 20 69 6e 74 20 66 6f 72 6d 61  ipher, int forma
5240: 74 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4f  t, Tcl_Obj *keyO
5250: 62 6a 29 20 7b 0a 20 20 20 20 69 6e 74 20 6d 6f  bj) {.    int mo
5260: 64 65 3b 20 2f 2a 20 4f 52 2d 65 64 20 63 6f 6d  de; /* OR-ed com
5270: 62 69 6e 61 74 69 6f 6e 20 6f 66 20 54 43 4c 5f  bination of TCL_
5280: 52 45 41 44 41 42 4c 45 20 61 6e 64 20 54 43 4c  READABLE and TCL
5290: 5f 57 52 49 54 41 42 4c 45 20 2a 2f 0a 20 20 20  _WRITABLE */.   
52a0: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61   Tcl_Channel cha
52b0: 6e 3b 0a 20 20 20 20 44 69 67 65 73 74 53 74 61  n;.    DigestSta
52c0: 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 0a 20  te *statePtr;.. 
52d0: 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 65 20 61     /* Validate a
52e0: 72 67 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 63  rgs */.    if (c
52f0: 68 61 6e 6e 65 6c 20 3d 3d 20 28 63 6f 6e 73 74  hannel == (const
5300: 20 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 20 7b   char *) NULL) {
5310: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
5320: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
5330: 2a 20 47 65 74 20 63 68 61 6e 6e 65 6c 20 49 64  * Get channel Id
5340: 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54   */.    chan = T
5350: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e  cl_GetChannel(in
5360: 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c 2c 20 26  terp, channel, &
5370: 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63  mode);.    if (c
5380: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  han == (Tcl_Chan
5390: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  nel) NULL) {..re
53a0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
53b0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
53c0: 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61  ke sure to opera
53d0: 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73  te on the topmos
53e0: 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20  t channel */.   
53f0: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54   chan = Tcl_GetT
5400: 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b  opChannel(chan);
5410: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
5420: 73 74 61 74 65 20 64 61 74 61 20 73 74 72 75 63  state data struc
5430: 74 75 72 65 20 2a 2f 0a 20 20 20 20 69 66 20 28  ture */.    if (
5440: 28 73 74 61 74 65 50 74 72 20 3d 20 44 69 67 65  (statePtr = Dige
5450: 73 74 53 74 61 74 65 4e 65 77 28 69 6e 74 65 72  stStateNew(inter
5460: 70 2c 20 66 6f 72 6d 61 74 29 29 20 3d 3d 20 4e  p, format)) == N
5470: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  ULL) {..Tcl_Appe
5480: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
5490: 20 22 4d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74   "Memory allocat
54a0: 69 6f 6e 20 65 72 72 6f 72 22 2c 20 28 63 68 61  ion error", (cha
54b0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  r *) NULL);..ret
54c0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
54d0: 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74     }.    statePt
54e0: 72 2d 3e 73 65 6c 66 20 3d 20 63 68 61 6e 3b 0a  r->self = chan;.
54f0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 6d 6f      statePtr->mo
5500: 64 65 20 3d 20 6d 6f 64 65 3b 0a 0a 20 20 20 20  de = mode;..    
5510: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 68 61  /* Initialize ha
5520: 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  sh function */. 
5530: 20 20 20 69 66 20 28 44 69 67 65 73 74 49 6e 69     if (DigestIni
5540: 74 69 61 6c 69 7a 65 28 69 6e 74 65 72 70 2c 20  tialize(interp, 
5550: 73 74 61 74 65 50 74 72 2c 20 6d 64 2c 20 63 69  statePtr, md, ci
5560: 70 68 65 72 2c 20 6b 65 79 4f 62 6a 29 20 21 3d  pher, keyObj) !=
5570: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75   TCL_OK) {..retu
5580: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
5590: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 66    }..    /* Conf
55a0: 69 67 75 72 65 20 63 68 61 6e 6e 65 6c 20 2a 2f  igure channel */
55b0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e  .    Tcl_SetChan
55c0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
55d0: 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c  , chan, "-transl
55e0: 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72 79 22  ation", "binary"
55f0: 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47  );.    if (Tcl_G
5600: 65 74 43 68 61 6e 6e 65 6c 42 75 66 66 65 72 53  etChannelBufferS
5610: 69 7a 65 28 63 68 61 6e 29 20 3c 20 45 56 50 5f  ize(chan) < EVP_
5620: 4d 41 58 5f 4d 44 5f 53 49 5a 45 20 2a 20 32 29  MAX_MD_SIZE * 2)
5630: 20 7b 0a 09 54 63 6c 5f 53 65 74 43 68 61 6e 6e   {..Tcl_SetChann
5640: 65 6c 42 75 66 66 65 72 53 69 7a 65 28 63 68 61  elBufferSize(cha
5650: 6e 2c 20 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49  n, EVP_MAX_MD_SI
5660: 5a 45 20 2a 20 32 29 3b 0a 20 20 20 20 7d 0a 0a  ZE * 2);.    }..
5670: 20 20 20 20 2f 2a 20 53 74 61 63 6b 20 63 68 61      /* Stack cha
5680: 6e 6e 65 6c 2c 20 61 62 6f 72 74 20 66 6f 72 20  nnel, abort for 
5690: 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 73 74 61  error */.    sta
56a0: 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63  tePtr->self = Tc
56b0: 6c 5f 53 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69  l_StackChannel(i
56c0: 6e 74 65 72 70 2c 20 26 64 69 67 65 73 74 43 68  nterp, &digestCh
56d0: 61 6e 6e 65 6c 54 79 70 65 2c 20 28 43 6c 69 65  annelType, (Clie
56e0: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72  ntData) statePtr
56f0: 2c 20 6d 6f 64 65 2c 20 63 68 61 6e 29 3b 0a 20  , mode, chan);. 
5700: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
5710: 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68  >self == (Tcl_Ch
5720: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
5730: 44 69 67 65 73 74 53 74 61 74 65 46 72 65 65 28  DigestStateFree(
5740: 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75  statePtr);..retu
5750: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
5760: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
5770: 72 65 73 75 6c 74 20 74 6f 20 63 68 61 6e 6e 65  result to channe
5780: 6c 20 49 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  l Id */.    Tcl_
5790: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
57a0: 2c 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47  , (char *) Tcl_G
57b0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68  etChannelName(ch
57c0: 61 6e 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  an), TCL_VOLATIL
57d0: 45 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  E);.    return T
57e0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d  CL_OK;.}../*. *-
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 0a 20 2a 0a 20 2a 20 55 6e 73 74  -----. *. * Unst
5840: 61 63 6b 20 43 68 61 6e 6e 65 6c 20 2d 2d 0a 20  ack Channel --. 
5850: 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69  *. *.This functi
5860: 6f 6e 20 72 65 6d 6f 76 65 73 20 74 68 65 20 73  on removes the s
5870: 74 61 63 6b 65 64 20 63 68 61 6e 6e 65 6c 20 66  tacked channel f
5880: 72 6f 6d 20 74 68 65 20 74 6f 70 20 6f 66 20 74  rom the top of t
5890: 68 65 0a 20 2a 09 63 68 61 6e 6e 65 6c 20 73 74  he. *.channel st
58a0: 61 63 6b 20 69 66 20 69 74 20 69 73 20 61 20 64  ack if it is a d
58b0: 69 67 65 73 74 20 63 68 61 6e 6e 65 6c 2e 0a 20  igest channel.. 
58c0: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a  *. * Returns:. *
58d0: 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45  .TCL_OK or TCL_E
58e0: 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20  RROR. *. * Side 
58f0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 52 65 6d 6f  effects:. *.Remo
5900: 76 65 73 20 74 72 61 6e 73 66 6f 72 6d 20 66 72  ves transform fr
5910: 6f 6d 20 63 68 61 6e 6e 65 6c 20 6f 72 20 73 65  om channel or se
5920: 74 73 20 72 65 73 75 6c 74 20 74 6f 20 65 72 72  ts result to err
5930: 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20  or message.. *. 
5940: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
5950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5980: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
5990: 69 63 20 69 6e 74 0a 44 69 67 65 73 74 55 6e 73  ic int.DigestUns
59a0: 74 61 63 6b 4f 62 6a 43 6d 64 28 43 6c 69 65 6e  tackObjCmd(Clien
59b0: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
59c0: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
59d0: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
59e0: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
59f0: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c  bjv[]) {.    Tcl
5a00: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20  _Channel chan;. 
5a10: 20 20 20 69 6e 74 20 6d 6f 64 65 3b 20 2f 2a 20     int mode; /* 
5a20: 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f  OR-ed combinatio
5a30: 6e 20 6f 66 20 54 43 4c 5f 52 45 41 44 41 42 4c  n of TCL_READABL
5a40: 45 20 61 6e 64 20 54 43 4c 5f 57 52 49 54 41 42  E and TCL_WRITAB
5a50: 4c 45 20 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 56  LE  */..    /* V
5a60: 61 6c 69 64 61 74 65 20 61 72 67 20 63 6f 75 6e  alidate arg coun
5a70: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a  t */.    if (obj
5a80: 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57  c != 2) {..Tcl_W
5a90: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
5aa0: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68  rp, 1, objv, "ch
5ab0: 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e  annel");..return
5ac0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
5ad0: 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 68  }..    /* Get ch
5ae0: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61  annel */.    cha
5af0: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  n = Tcl_GetChann
5b00: 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  el(interp, Tcl_G
5b10: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
5b20: 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20  objv[1], NULL), 
5b30: 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 28  &mode);.    if (
5b40: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61  chan == (Tcl_Cha
5b50: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72  nnel) NULL) {..r
5b60: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
5b70: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
5b80: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72  ake sure to oper
5b90: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f  ate on the topmo
5ba0: 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20  st channel */.  
5bb0: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
5bc0: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29  TopChannel(chan)
5bd0: 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
5be0: 69 66 20 64 69 67 65 73 74 20 63 68 61 6e 6e 65  if digest channe
5bf0: 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c  l */.    if (Tcl
5c00: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28  _GetChannelType(
5c10: 63 68 61 6e 29 20 21 3d 20 26 64 69 67 65 73 74  chan) != &digest
5c20: 43 68 61 6e 6e 65 6c 54 79 70 65 29 20 7b 0a 09  ChannelType) {..
5c30: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
5c40: 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68  (interp, "bad ch
5c50: 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47  annel \"", Tcl_G
5c60: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68  etChannelName(ch
5c70: 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e  an),..    "\": n
5c80: 6f 74 20 61 20 64 69 67 65 73 74 20 63 68 61 6e  ot a digest chan
5c90: 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63  nel", NULL);..Tc
5ca0: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
5cb0: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 55  nterp, "TLS", "U
5cc0: 4e 53 54 41 43 4b 22 2c 20 22 43 48 41 4e 4e 45  NSTACK", "CHANNE
5cd0: 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28  L", "INVALID", (
5ce0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
5cf0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
5d00: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
5d10: 50 6f 70 20 74 72 61 6e 73 66 6f 72 6d 20 66 72  Pop transform fr
5d20: 6f 6d 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20  om channel */.  
5d30: 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 55 6e 73    return Tcl_Uns
5d40: 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65  tackChannel(inte
5d50: 72 70 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 09  rp, chan);.    .
5d60: 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69  clientData = cli
5d70: 65 6e 74 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 2a 2a  entData;.}../***
5d80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5d90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5da0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5db0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5dc0: 2f 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  /..static const 
5dd0: 63 68 61 72 20 2a 69 6e 73 74 61 6e 63 65 5f 66  char *instance_f
5de0: 6e 73 20 5b 5d 20 3d 20 7b 20 22 66 69 6e 61 6c  ns [] = { "final
5df0: 69 7a 65 22 2c 20 22 75 70 64 61 74 65 22 2c 20  ize", "update", 
5e00: 4e 55 4c 4c 20 7d 3b 0a 0a 2f 2a 0a 20 2a 2d 2d  NULL };../*. *--
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5e50: 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 49 6e  -. *. * DigestIn
5e60: 73 74 61 6e 63 65 4f 62 6a 43 6d 64 20 2d 2d 0a  stanceObjCmd --.
5e70: 20 2a 0a 20 2a 09 48 61 6e 64 6c 65 72 20 66 6f   *. *.Handler fo
5e80: 72 20 64 69 67 65 73 74 20 63 6f 6d 6d 61 6e 64  r digest command
5e90: 20 69 6e 73 74 61 6e 63 65 73 2e 20 55 73 65 64   instances. Used
5ea0: 20 74 6f 20 61 64 64 20 64 61 74 61 20 74 6f 20   to add data to 
5eb0: 68 61 73 68 0a 20 2a 09 66 75 6e 63 74 69 6f 6e  hash. *.function
5ec0: 20 6f 72 20 72 65 74 72 69 65 76 65 20 6d 65 73   or retrieve mes
5ed0: 73 61 67 65 20 64 69 67 65 73 74 2e 0a 20 2a 0a  sage digest.. *.
5ee0: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54   * Returns:. *.T
5ef0: 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52  CL_OK or TCL_ERR
5f00: 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  OR. *. * Side ef
5f10: 66 65 63 74 73 3a 0a 20 2a 09 41 64 64 73 20 64  fects:. *.Adds d
5f20: 61 74 61 20 74 6f 20 68 61 73 68 20 6f 72 20 72  ata to hash or r
5f30: 65 74 75 72 6e 73 20 6d 65 73 73 61 67 65 20 64  eturns message d
5f40: 69 67 65 73 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  igest. *. *-----
5f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
5f90: 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 49 6e 73  */.int DigestIns
5fa0: 74 61 6e 63 65 4f 62 6a 43 6d 64 28 43 6c 69 65  tanceObjCmd(Clie
5fb0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
5fc0: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
5fd0: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
5fe0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20   Tcl_Obj *const 
5ff0: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 44 69  objv[]) {.    Di
6000: 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65  gestState *state
6010: 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 61  Ptr = (DigestSta
6020: 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61  te *) clientData
6030: 3b 0a 20 20 20 20 69 6e 74 20 66 6e 2c 20 6c 65  ;.    int fn, le
6040: 6e 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20  n = 0;.    char 
6050: 2a 62 75 66 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20  *buf = NULL;..  
6060: 20 20 2f 2a 20 56 61 6c 69 64 61 74 65 20 61 72    /* Validate ar
6070: 67 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69  g count */.    i
6080: 66 20 28 6f 62 6a 63 20 3c 20 32 20 7c 7c 20 6f  f (objc < 2 || o
6090: 62 6a 63 20 3e 20 33 29 20 7b 0a 09 54 63 6c 5f  bjc > 3) {..Tcl_
60a0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
60b0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 66  erp, 1, objv, "f
60c0: 75 6e 63 74 69 6f 6e 20 3f 64 61 74 61 3f 22 29  unction ?data?")
60d0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
60e0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
60f0: 2f 2a 20 47 65 74 20 66 75 6e 63 74 69 6f 6e 20  /* Get function 
6100: 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47  */.    if (Tcl_G
6110: 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69  etIndexFromObj(i
6120: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
6130: 69 6e 73 74 61 6e 63 65 5f 66 6e 73 2c 20 22 66  instance_fns, "f
6140: 75 6e 63 74 69 6f 6e 22 2c 20 30 2c 20 26 66 6e  unction", 0, &fn
6150: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
6160: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
6170: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
6180: 44 6f 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  Do function */. 
6190: 20 20 20 69 66 20 28 66 6e 29 20 7b 0a 09 2f 2a     if (fn) {../*
61a0: 20 47 65 74 20 64 61 74 61 20 6f 72 20 72 65 74   Get data or ret
61b0: 75 72 6e 20 65 72 72 6f 72 20 69 66 20 6e 6f 6e  urn error if non
61c0: 65 20 2a 2f 0a 09 69 66 20 28 6f 62 6a 63 20 3d  e */..if (objc =
61d0: 3d 20 33 29 20 7b 0a 09 20 20 20 20 62 75 66 20  = 3) {..    buf 
61e0: 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
61f0: 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ayFromObj(objv[2
6200: 5d 2c 20 26 6c 65 6e 29 3b 0a 09 7d 20 65 6c 73  ], &len);..} els
6210: 65 20 7b 0a 09 20 20 20 20 54 63 6c 5f 57 72 6f  e {..    Tcl_Wro
6220: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
6230: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 75 70 64 61  , 1, objv, "upda
6240: 74 65 20 64 61 74 61 22 29 3b 0a 09 20 20 20 20  te data");..    
6250: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
6260: 3b 0a 09 7d 0a 0a 09 2f 2a 20 55 70 64 61 74 65  ;..}.../* Update
6270: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a   hash function *
6280: 2f 0a 09 69 66 20 28 21 44 69 67 65 73 74 55 70  /..if (!DigestUp
6290: 64 61 74 65 28 73 74 61 74 65 50 74 72 2c 20 62  date(statePtr, b
62a0: 75 66 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e  uf, (size_t) len
62b0: 2c 20 31 29 29 20 7b 0a 09 20 20 20 20 72 65 74  , 1)) {..    ret
62c0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
62d0: 7d 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  }..    } else {.
62e0: 09 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 68 61 73  ./* Finalize has
62f0: 68 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 63  h function and c
6300: 61 6c 63 75 6c 61 74 65 20 6d 65 73 73 61 67 65  alculate message
6310: 20 64 69 67 65 73 74 20 2a 2f 0a 09 69 66 20 28   digest */..if (
6320: 44 69 67 65 73 74 46 69 6e 61 6c 69 7a 65 28 69  DigestFinalize(i
6330: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c  nterp, statePtr,
6340: 20 4e 55 4c 4c 29 20 21 3d 20 54 43 4c 5f 4f 4b   NULL) != TCL_OK
6350: 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  ) {..    return 
6360: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09  TCL_ERROR;..}...
6370: 54 63 6c 5f 44 65 6c 65 74 65 43 6f 6d 6d 61 6e  Tcl_DeleteComman
6380: 64 46 72 6f 6d 54 6f 6b 65 6e 28 69 6e 74 65 72  dFromToken(inter
6390: 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 74 6f 6b  p, statePtr->tok
63a0: 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  en);.    }.    r
63b0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
63c0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
63d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
63e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
63f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
6410: 44 69 67 65 73 74 43 6f 6d 6d 61 6e 64 44 65 6c  DigestCommandDel
6420: 65 74 65 48 61 6e 64 6c 65 72 20 2d 2d 0a 20 2a  eteHandler --. *
6430: 0a 20 2a 09 20 43 61 6c 6c 62 61 63 6b 20 74 6f  . *. Callback to
6440: 20 63 6c 65 61 6e 2d 75 70 20 77 68 65 6e 20 64   clean-up when d
6450: 69 67 65 73 74 20 69 6e 73 74 61 6e 63 65 20 63  igest instance c
6460: 6f 6d 6d 61 6e 64 20 69 73 20 64 65 6c 65 74 65  ommand is delete
6470: 64 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73  d.. *. * Returns
6480: 3a 0a 20 2a 09 4e 6f 74 68 69 6e 67 0a 20 2a 0a  :. *.Nothing. *.
6490: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
64a0: 0a 20 2a 09 44 65 73 74 72 6f 79 73 20 73 74 61  . *.Destroys sta
64b0: 74 65 20 69 6e 66 6f 20 73 74 72 75 63 74 75 72  te info structur
64c0: 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  e. *. *---------
64d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76  ----------. */.v
6510: 6f 69 64 20 44 69 67 65 73 74 43 6f 6d 6d 61 6e  oid DigestComman
6520: 64 44 65 6c 65 74 65 48 61 6e 64 6c 65 72 28 43  dDeleteHandler(C
6530: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
6540: 44 61 74 61 29 20 7b 0a 20 20 20 20 44 69 67 65  Data) {.    Dige
6550: 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74  stState *statePt
6560: 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 65  r = (DigestState
6570: 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a   *) clientData;.
6580: 0a 20 20 20 20 2f 2a 20 43 6c 65 61 6e 2d 75 70  .    /* Clean-up
6590: 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 53 74   */.    DigestSt
65a0: 61 74 65 46 72 65 65 28 73 74 61 74 65 50 74 72  ateFree(statePtr
65b0: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  );.}../*. *-----
65c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
6600: 2a 0a 20 2a 20 44 69 67 65 73 74 43 6f 6d 6d 61  *. * DigestComma
6610: 6e 64 48 61 6e 64 6c 65 72 20 2d 2d 0a 20 2a 0a  ndHandler --. *.
6620: 20 2a 09 20 43 72 65 61 74 65 20 63 6f 6d 6d 61   *. Create comma
6630: 6e 64 20 74 6f 20 61 6c 6c 6f 77 20 75 73 65 72  nd to allow user
6640: 20 74 6f 20 61 64 64 20 64 61 74 61 20 74 6f 20   to add data to 
6650: 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 0a 20  hash function.. 
6660: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a  *. * Returns:. *
6670: 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45  .TCL_OK or TCL_E
6680: 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20  RROR. *. * Side 
6690: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 72 65 61  effects:. *.Crea
66a0: 74 65 73 20 63 6f 6d 6d 61 6e 64 20 6f 72 20 65  tes command or e
66b0: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a  rror message. *.
66c0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
66d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
66e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
66f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6700: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69  -----. */.int Di
6710: 67 65 73 74 43 6f 6d 6d 61 6e 64 48 61 6e 64 6c  gestCommandHandl
6720: 65 72 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  er(Tcl_Interp *i
6730: 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a  nterp, Tcl_Obj *
6740: 63 6d 64 4f 62 6a 2c 20 63 6f 6e 73 74 20 45 56  cmdObj, const EV
6750: 50 5f 4d 44 20 2a 6d 64 2c 0a 09 63 6f 6e 73 74  P_MD *md,..const
6760: 20 45 56 50 5f 43 49 50 48 45 52 20 2a 63 69 70   EVP_CIPHER *cip
6770: 68 65 72 2c 20 69 6e 74 20 66 6f 72 6d 61 74 2c  her, int format,
6780: 20 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4f 62 6a   Tcl_Obj *keyObj
6790: 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74  ) {.    DigestSt
67a0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20  ate *statePtr;. 
67b0: 20 20 20 63 68 61 72 20 2a 63 6d 64 4e 61 6d 65     char *cmdName
67c0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
67d0: 46 72 6f 6d 4f 62 6a 28 63 6d 64 4f 62 6a 2c 20  FromObj(cmdObj, 
67e0: 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  NULL);..    /* C
67f0: 72 65 61 74 65 20 73 74 61 74 65 20 64 61 74 61  reate state data
6800: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
6810: 20 20 69 66 20 28 28 73 74 61 74 65 50 74 72 20    if ((statePtr 
6820: 3d 20 44 69 67 65 73 74 53 74 61 74 65 4e 65 77  = DigestStateNew
6830: 28 69 6e 74 65 72 70 2c 20 66 6f 72 6d 61 74 29  (interp, format)
6840: 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63  ) == NULL) {..Tc
6850: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
6860: 6e 74 65 72 70 2c 20 22 4d 65 6d 6f 72 79 20 61  nterp, "Memory a
6870: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 22  llocation error"
6880: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
6890: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
68a0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
68b0: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 68 61  /* Initialize ha
68c0: 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  sh function */. 
68d0: 20 20 20 69 66 20 28 44 69 67 65 73 74 49 6e 69     if (DigestIni
68e0: 74 69 61 6c 69 7a 65 28 69 6e 74 65 72 70 2c 20  tialize(interp, 
68f0: 73 74 61 74 65 50 74 72 2c 20 6d 64 2c 20 63 69  statePtr, md, ci
6900: 70 68 65 72 2c 20 6b 65 79 4f 62 6a 29 20 21 3d  pher, keyObj) !=
6910: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75   TCL_OK) {..retu
6920: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
6930: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61    }..    /* Crea
6940: 74 65 20 69 6e 73 74 61 6e 63 65 20 63 6f 6d 6d  te instance comm
6950: 61 6e 64 20 2a 2f 0a 20 20 20 20 73 74 61 74 65  and */.    state
6960: 50 74 72 2d 3e 74 6f 6b 65 6e 20 3d 20 54 63 6c  Ptr->token = Tcl
6970: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
6980: 64 28 69 6e 74 65 72 70 2c 20 63 6d 64 4e 61 6d  d(interp, cmdNam
6990: 65 2c 20 44 69 67 65 73 74 49 6e 73 74 61 6e 63  e, DigestInstanc
69a0: 65 4f 62 6a 43 6d 64 2c 0a 09 28 43 6c 69 65 6e  eObjCmd,..(Clien
69b0: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2c  tData) statePtr,
69c0: 20 44 69 67 65 73 74 43 6f 6d 6d 61 6e 64 44 65   DigestCommandDe
69d0: 6c 65 74 65 48 61 6e 64 6c 65 72 29 3b 0a 0a 20  leteHandler);.. 
69e0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 6d     /* Return com
69f0: 6d 61 6e 64 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  mand name */.   
6a00: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
6a10: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 4f 62 6a  t(interp, cmdObj
6a20: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
6a30: 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a  L_OK;.}.../*****
6a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
6a80: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
6a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
6ad0: 44 69 67 65 73 74 44 61 74 61 48 61 6e 64 6c 65  DigestDataHandle
6ae0: 72 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 75 72  r --. *. *.Retur
6af0: 6e 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74  n message digest
6b00: 20 66 6f 72 20 64 61 74 61 20 75 73 69 6e 67 20   for data using 
6b10: 75 73 65 72 20 73 70 65 63 69 66 69 65 64 20 68  user specified h
6b20: 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a  ash function.. *
6b30: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09  . * Returns:. *.
6b40: 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52  TCL_OK or TCL_ER
6b50: 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ROR. *. * Side e
6b60: 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20  ffects:. *.Sets 
6b70: 72 65 73 75 6c 74 20 74 6f 20 6d 65 73 73 61 67  result to messag
6b80: 65 20 64 69 67 65 73 74 20 6f 72 20 65 72 72 6f  e digest or erro
6b90: 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d  r message. *. *-
6ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6be0: 2d 2d 0a 20 2a 2f 0a 69 6e 74 0a 44 69 67 65 73  --. */.int.Diges
6bf0: 74 44 61 74 61 48 61 6e 64 6c 65 72 28 54 63 6c  tDataHandler(Tcl
6c00: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
6c10: 20 54 63 6c 5f 4f 62 6a 20 2a 64 61 74 61 4f 62   Tcl_Obj *dataOb
6c20: 6a 2c 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20  j, const EVP_MD 
6c30: 2a 6d 64 2c 0a 09 63 6f 6e 73 74 20 45 56 50 5f  *md,..const EVP_
6c40: 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 2c 20  CIPHER *cipher, 
6c50: 69 6e 74 20 66 6f 72 6d 61 74 2c 20 54 63 6c 5f  int format, Tcl_
6c60: 4f 62 6a 20 2a 6b 65 79 4f 62 6a 29 20 7b 0a 20  Obj *keyObj) {. 
6c70: 20 20 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20     char *data;. 
6c80: 20 20 20 69 6e 74 20 64 61 74 61 5f 6c 65 6e 3b     int data_len;
6c90: 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65  .    DigestState
6ca0: 20 2a 73 74 61 74 65 50 74 72 3b 0a 0a 20 20 20   *statePtr;..   
6cb0: 20 2f 2a 20 47 65 74 20 64 61 74 61 20 2a 2f 0a   /* Get data */.
6cc0: 20 20 20 20 64 61 74 61 20 3d 20 54 63 6c 5f 47      data = Tcl_G
6cd0: 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
6ce0: 62 6a 28 64 61 74 61 4f 62 6a 2c 20 26 64 61 74  bj(dataObj, &dat
6cf0: 61 5f 6c 65 6e 29 3b 0a 20 20 20 20 69 66 20 28  a_len);.    if (
6d00: 64 61 74 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  data == NULL || 
6d10: 64 61 74 61 5f 6c 65 6e 20 3d 3d 20 30 29 20 7b  data_len == 0) {
6d20: 0a 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28  ..Tcl_SetResult(
6d30: 69 6e 74 65 72 70 2c 20 22 4e 6f 20 64 61 74 61  interp, "No data
6d40: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  ", NULL);..retur
6d50: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
6d60: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
6d70: 65 20 73 74 61 74 65 20 64 61 74 61 20 73 74 72  e state data str
6d80: 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 69 66  ucture */.    if
6d90: 20 28 28 73 74 61 74 65 50 74 72 20 3d 20 44 69   ((statePtr = Di
6da0: 67 65 73 74 53 74 61 74 65 4e 65 77 28 69 6e 74  gestStateNew(int
6db0: 65 72 70 2c 20 66 6f 72 6d 61 74 29 29 20 3d 3d  erp, format)) ==
6dc0: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70   NULL) {..Tcl_Ap
6dd0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
6de0: 70 2c 20 22 4d 65 6d 6f 72 79 20 61 6c 6c 6f 63  p, "Memory alloc
6df0: 61 74 69 6f 6e 20 65 72 72 6f 72 22 2c 20 28 63  ation error", (c
6e00: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72  har *) NULL);..r
6e10: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
6e20: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
6e30: 61 6c 63 20 44 69 67 65 73 74 2c 20 61 62 6f 72  alc Digest, abor
6e40: 74 20 66 6f 72 20 65 72 72 6f 72 20 2a 2f 0a 20  t for error */. 
6e50: 20 20 20 69 66 20 28 44 69 67 65 73 74 49 6e 69     if (DigestIni
6e60: 74 69 61 6c 69 7a 65 28 69 6e 74 65 72 70 2c 20  tialize(interp, 
6e70: 73 74 61 74 65 50 74 72 2c 20 6d 64 2c 20 63 69  statePtr, md, ci
6e80: 70 68 65 72 2c 20 6b 65 79 4f 62 6a 29 20 21 3d  pher, keyObj) !=
6e90: 20 54 43 4c 5f 4f 4b 20 7c 7c 0a 09 44 69 67 65   TCL_OK ||..Dige
6ea0: 73 74 55 70 64 61 74 65 28 73 74 61 74 65 50 74  stUpdate(statePt
6eb0: 72 2c 20 64 61 74 61 2c 20 28 73 69 7a 65 5f 74  r, data, (size_t
6ec0: 29 20 64 61 74 61 5f 6c 65 6e 2c 20 31 29 20 3d  ) data_len, 1) =
6ed0: 3d 20 30 20 7c 7c 0a 09 44 69 67 65 73 74 46 69  = 0 ||..DigestFi
6ee0: 6e 61 6c 69 7a 65 28 69 6e 74 65 72 70 2c 20 73  nalize(interp, s
6ef0: 74 61 74 65 50 74 72 2c 20 4e 55 4c 4c 29 20 21  tatePtr, NULL) !
6f00: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 44 69 67  = TCL_OK) {..Dig
6f10: 65 73 74 53 74 61 74 65 46 72 65 65 28 73 74 61  estStateFree(sta
6f20: 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20  tePtr);..return 
6f30: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
6f40: 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 6e 2d 75  ..    /* Clean-u
6f50: 70 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 53  p */.    DigestS
6f60: 74 61 74 65 46 72 65 65 28 73 74 61 74 65 50 74  tateFree(statePt
6f70: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  r);.    return T
6f80: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a  CL_OK;.}../*****
6f90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6fa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6fb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6fc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
6fd0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
6fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
7020: 44 69 67 65 73 74 46 69 6c 65 48 61 6e 64 6c 65  DigestFileHandle
7030: 72 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 75 72  r --. *. *.Retur
7040: 6e 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74  n message digest
7050: 20 66 6f 72 20 66 69 6c 65 20 75 73 69 6e 67 20   for file using 
7060: 75 73 65 72 20 73 70 65 63 69 66 69 65 64 20 68  user specified h
7070: 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a  ash function.. *
7080: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09  . * Returns:. *.
7090: 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52  TCL_OK or TCL_ER
70a0: 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ROR. *. * Side e
70b0: 66 66 65 63 74 73 3a 0a 20 2a 09 52 65 73 75 6c  ffects:. *.Resul
70c0: 74 20 69 73 20 6d 65 73 73 61 67 65 20 64 69 67  t is message dig
70d0: 65 73 74 20 6f 72 20 65 72 72 6f 72 20 6d 65 73  est or error mes
70e0: 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  sage. *. *------
70f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
7130: 2f 0a 69 6e 74 20 44 69 67 65 73 74 46 69 6c 65  /.int DigestFile
7140: 48 61 6e 64 6c 65 72 28 54 63 6c 5f 49 6e 74 65  Handler(Tcl_Inte
7150: 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f  rp *interp, Tcl_
7160: 4f 62 6a 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 63  Obj *filename, c
7170: 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 2c  onst EVP_MD *md,
7180: 0a 09 63 6f 6e 73 74 20 45 56 50 5f 43 49 50 48  ..const EVP_CIPH
7190: 45 52 20 2a 63 69 70 68 65 72 2c 20 69 6e 74 20  ER *cipher, int 
71a0: 66 6f 72 6d 61 74 2c 20 54 63 6c 5f 4f 62 6a 20  format, Tcl_Obj 
71b0: 2a 6b 65 79 4f 62 6a 29 20 7b 0a 20 20 20 20 44  *keyObj) {.    D
71c0: 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74  igestState *stat
71d0: 65 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68  ePtr;.    Tcl_Ch
71e0: 61 6e 6e 65 6c 20 63 68 61 6e 20 3d 20 4e 55 4c  annel chan = NUL
71f0: 4c 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  L;.    unsigned 
7200: 63 68 61 72 20 62 75 66 5b 42 55 46 46 45 52 5f  char buf[BUFFER_
7210: 53 49 5a 45 5d 3b 0a 20 20 20 20 69 6e 74 20 72  SIZE];.    int r
7220: 65 73 20 3d 20 54 43 4c 5f 4f 4b 2c 20 6c 65 6e  es = TCL_OK, len
7230: 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ;..    /* Create
7240: 20 73 74 61 74 65 20 64 61 74 61 20 73 74 72 75   state data stru
7250: 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 69 66 20  cture */.    if 
7260: 28 28 73 74 61 74 65 50 74 72 20 3d 20 44 69 67  ((statePtr = Dig
7270: 65 73 74 53 74 61 74 65 4e 65 77 28 69 6e 74 65  estStateNew(inte
7280: 72 70 2c 20 66 6f 72 6d 61 74 29 29 20 3d 3d 20  rp, format)) == 
7290: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70  NULL) {..Tcl_App
72a0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
72b0: 2c 20 22 4d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  , "Memory alloca
72c0: 74 69 6f 6e 20 65 72 72 6f 72 22 2c 20 28 63 68  tion error", (ch
72d0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65  ar *) NULL);..re
72e0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
72f0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 70      }..    /* Op
7300: 65 6e 20 66 69 6c 65 20 63 68 61 6e 6e 65 6c 2c  en file channel,
7310: 20 61 62 6f 72 74 20 66 6f 72 20 65 72 72 6f 72   abort for error
7320: 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54   */.    chan = T
7330: 63 6c 5f 46 53 4f 70 65 6e 46 69 6c 65 43 68 61  cl_FSOpenFileCha
7340: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 66 69 6c  nnel(interp, fil
7350: 65 6e 61 6d 65 2c 20 22 72 62 22 2c 20 30 34 34  ename, "rb", 044
7360: 34 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e  4);.    if (chan
7370: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c   == (Tcl_Channel
7380: 29 20 4e 55 4c 4c 29 20 7b 0a 09 44 69 67 65 73  ) NULL) {..Diges
7390: 74 53 74 61 74 65 46 72 65 65 28 73 74 61 74 65  tStateFree(state
73a0: 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  Ptr);..return TC
73b0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
73c0: 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65      /* Configure
73d0: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20   channel */.    
73e0: 69 66 20 28 28 72 65 73 20 3d 20 54 63 6c 5f 53  if ((res = Tcl_S
73f0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
7400: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d  interp, chan, "-
7410: 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62  translation", "b
7420: 69 6e 61 72 79 22 29 29 20 3d 3d 20 54 43 4c 5f  inary")) == TCL_
7430: 45 52 52 4f 52 29 20 7b 0a 09 67 6f 74 6f 20 64  ERROR) {..goto d
7440: 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  one;.    }.    T
7450: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 42 75 66  cl_SetChannelBuf
7460: 66 65 72 53 69 7a 65 28 63 68 61 6e 2c 20 42 55  ferSize(chan, BU
7470: 46 46 45 52 5f 53 49 5a 45 29 3b 0a 0a 20 20 20  FFER_SIZE);..   
7480: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 68   /* Initialize h
7490: 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ash function */.
74a0: 20 20 20 20 69 66 20 28 28 72 65 73 20 3d 20 44      if ((res = D
74b0: 69 67 65 73 74 49 6e 69 74 69 61 6c 69 7a 65 28  igestInitialize(
74c0: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
74d0: 2c 20 6d 64 2c 20 63 69 70 68 65 72 2c 20 6b 65  , md, cipher, ke
74e0: 79 4f 62 6a 29 29 20 21 3d 20 54 43 4c 5f 4f 4b  yObj)) != TCL_OK
74f0: 29 20 7b 0a 09 67 6f 74 6f 20 64 6f 6e 65 3b 0a  ) {..goto done;.
7500: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
7510: 61 64 20 66 69 6c 65 20 64 61 74 61 20 61 6e 64  ad file data and
7520: 20 75 70 64 61 74 65 20 68 61 73 68 20 66 75 6e   update hash fun
7530: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 77 68 69  ction */.    whi
7540: 6c 65 20 28 21 54 63 6c 5f 45 6f 66 28 63 68 61  le (!Tcl_Eof(cha
7550: 6e 29 29 20 7b 0a 09 6c 65 6e 20 3d 20 54 63 6c  n)) {..len = Tcl
7560: 5f 52 65 61 64 52 61 77 28 63 68 61 6e 2c 20 28  _ReadRaw(chan, (
7570: 63 68 61 72 20 2a 29 20 62 75 66 2c 20 42 55 46  char *) buf, BUF
7580: 46 45 52 5f 53 49 5a 45 29 3b 0a 09 69 66 20 28  FER_SIZE);..if (
7590: 6c 65 6e 20 3e 20 30 29 20 7b 0a 09 20 20 20 20  len > 0) {..    
75a0: 69 66 20 28 21 44 69 67 65 73 74 55 70 64 61 74  if (!DigestUpdat
75b0: 65 28 73 74 61 74 65 50 74 72 2c 20 26 62 75 66  e(statePtr, &buf
75c0: 5b 30 5d 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65  [0], (size_t) le
75d0: 6e 2c 20 31 29 29 20 7b 0a 09 09 72 65 73 20 3d  n, 1)) {...res =
75e0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 67 6f   TCL_ERROR;...go
75f0: 74 6f 20 64 6f 6e 65 3b 0a 09 20 20 20 20 7d 0a  to done;..    }.
7600: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  .}.    }..    /*
7610: 20 46 69 6e 61 6c 69 7a 65 20 68 61 73 68 20 66   Finalize hash f
7620: 75 6e 63 74 69 6f 6e 20 61 6e 64 20 63 61 6c 63  unction and calc
7630: 75 6c 61 74 65 20 6d 65 73 73 61 67 65 20 64 69  ulate message di
7640: 67 65 73 74 20 2a 2f 0a 20 20 20 20 72 65 73 20  gest */.    res 
7650: 3d 20 44 69 67 65 73 74 46 69 6e 61 6c 69 7a 65  = DigestFinalize
7660: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
7670: 72 2c 20 4e 55 4c 4c 29 3b 0a 0a 64 6f 6e 65 3a  r, NULL);..done:
7680: 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20 63 68  .    /* Close ch
7690: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20  annel */.    if 
76a0: 28 54 63 6c 5f 43 6c 6f 73 65 28 69 6e 74 65 72  (Tcl_Close(inter
76b0: 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54 43 4c 5f  p, chan) == TCL_
76c0: 45 52 52 4f 52 29 20 7b 0a 09 72 65 73 20 3d 20  ERROR) {..res = 
76d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
76e0: 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 6e 2d 75  ..    /* Clean-u
76f0: 70 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 53  p */.    DigestS
7700: 74 61 74 65 46 72 65 65 28 73 74 61 74 65 50 74  tateFree(statePt
7710: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  r);.    return r
7720: 65 73 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  es;.}../********
7730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
7770: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
7780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
77a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
77b0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67  ------. *. * Dig
77c0: 65 73 74 4d 61 69 6e 20 2d 2d 0a 20 2a 0a 20 2a  estMain --. *. *
77d0: 09 52 65 74 75 72 6e 20 6d 65 73 73 61 67 65 20  .Return message 
77e0: 64 69 67 65 73 74 20 6f 72 20 4d 65 73 73 61 67  digest or Messag
77f0: 65 20 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e  e Authentication
7800: 20 43 6f 64 65 20 28 4d 41 43 29 20 6f 66 0a 20   Code (MAC) of. 
7810: 2a 09 64 61 74 61 20 75 73 69 6e 67 20 75 73 65  *.data using use
7820: 72 20 73 70 65 63 69 66 69 65 64 20 68 61 73 68  r specified hash
7830: 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a   function.. *. *
7840: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c   Returns:. *.TCL
7850: 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52  _OK or TCL_ERROR
7860: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
7870: 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 72 65 73  cts:. *.Sets res
7880: 75 6c 74 20 74 6f 20 6d 65 73 73 61 67 65 20 64  ult to message d
7890: 69 67 65 73 74 20 6f 72 20 65 72 72 6f 72 20 6d  igest or error m
78a0: 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d  essage. *. *----
78b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
78c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
78d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
78e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
78f0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44   */.static int D
7900: 69 67 65 73 74 4d 61 69 6e 28 69 6e 74 20 74 79  igestMain(int ty
7910: 70 65 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  pe, Tcl_Interp *
7920: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
7930: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
7940: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 69   objv[]) {.    i
7950: 6e 74 20 69 64 78 2c 20 66 6f 72 6d 61 74 20 3d  nt idx, format =
7960: 20 48 45 58 5f 46 4f 52 4d 41 54 2c 20 72 65 73   HEX_FORMAT, res
7970: 20 3d 20 54 43 4c 5f 4f 4b 2c 20 66 6c 61 67 73   = TCL_OK, flags
7980: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
7990: 63 68 61 72 20 2a 64 69 67 65 73 74 4e 61 6d 65  char *digestName
79a0: 2c 20 2a 63 68 61 6e 6e 65 6c 20 3d 20 4e 55 4c  , *channel = NUL
79b0: 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  L;.    Tcl_Obj *
79c0: 63 6d 64 4f 62 6a 20 3d 20 4e 55 4c 4c 2c 20 2a  cmdObj = NULL, *
79d0: 64 61 74 61 4f 62 6a 20 3d 20 4e 55 4c 4c 2c 20  dataObj = NULL, 
79e0: 2a 66 69 6c 65 4f 62 6a 20 3d 20 4e 55 4c 4c 2c  *fileObj = NULL,
79f0: 20 2a 6b 65 79 4f 62 6a 20 3d 20 4e 55 4c 4c 3b   *keyObj = NULL;
7a00: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
7a10: 61 72 20 2a 63 69 70 68 65 72 4e 61 6d 65 20 3d  ar *cipherName =
7a20: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 6f 6e 73 74   NULL;.    const
7a30: 20 45 56 50 5f 4d 44 20 2a 6d 64 20 3d 20 4e 55   EVP_MD *md = NU
7a40: 4c 4c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45 56  LL;.    const EV
7a50: 50 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65 72  P_CIPHER *cipher
7a60: 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a   = NULL;..    /*
7a70: 20 43 6c 65 61 72 20 69 6e 74 65 72 70 20 72 65   Clear interp re
7a80: 73 75 6c 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  sult */.    Tcl_
7a90: 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65  ResetResult(inte
7aa0: 72 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c  rp);..    /* Val
7ab0: 69 64 61 74 65 20 61 72 67 20 63 6f 75 6e 74 20  idate arg count 
7ac0: 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  */.    if (objc 
7ad0: 3c 20 33 20 7c 7c 20 6f 62 6a 63 20 3e 20 31 32  < 3 || objc > 12
7ae0: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75  ) {..Tcl_WrongNu
7af0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
7b00: 20 6f 62 6a 76 2c 20 22 3f 2d 62 69 6e 7c 2d 68   objv, "?-bin|-h
7b10: 65 78 3f 20 3f 2d 63 69 70 68 65 72 20 6e 61 6d  ex? ?-cipher nam
7b20: 65 3f 20 3f 2d 64 69 67 65 73 74 20 6e 61 6d 65  e? ?-digest name
7b30: 3f 20 3f 2d 6b 65 79 20 6b 65 79 3f 20 5b 2d 63  ? ?-key key? [-c
7b40: 68 61 6e 6e 65 6c 20 63 68 61 6e 20 7c 20 2d 63  hannel chan | -c
7b50: 6f 6d 6d 61 6e 64 20 63 6d 64 4e 61 6d 65 20 7c  ommand cmdName |
7b60: 20 2d 66 69 6c 65 20 66 69 6c 65 6e 61 6d 65 20   -file filename 
7b70: 7c 20 3f 2d 64 61 74 61 3f 20 64 61 74 61 5d 22  | ?-data? data]"
7b80: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
7b90: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
7ba0: 20 2f 2a 20 4f 70 74 69 6d 61 6c 20 63 61 73 65   /* Optimal case
7bb0: 20 66 6f 72 20 61 20 64 69 67 65 73 74 20 61 6e   for a digest an
7bc0: 64 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 2a  d blob of data *
7bd0: 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d  /.    if (objc =
7be0: 3d 20 33 20 26 26 20 74 79 70 65 20 3d 3d 20 54  = 3 && type == T
7bf0: 59 50 45 5f 4d 44 29 20 7b 0a 09 64 69 67 65 73  YPE_MD) {..diges
7c00: 74 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53  tName = Tcl_GetS
7c10: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
7c20: 76 5b 31 5d 2c 4e 55 4c 4c 29 3b 0a 09 69 66 20  v[1],NULL);..if 
7c30: 28 28 6d 64 20 3d 20 45 56 50 5f 67 65 74 5f 64  ((md = EVP_get_d
7c40: 69 67 65 73 74 62 79 6e 61 6d 65 28 64 69 67 65  igestbyname(dige
7c50: 73 74 4e 61 6d 65 29 29 20 21 3d 20 4e 55 4c 4c  stName)) != NULL
7c60: 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  ) {..    return 
7c70: 44 69 67 65 73 74 44 61 74 61 48 61 6e 64 6c 65  DigestDataHandle
7c80: 72 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  r(interp, objv[2
7c90: 5d 2c 20 6d 64 2c 20 4e 55 4c 4c 2c 20 48 45 58  ], md, NULL, HEX
7ca0: 5f 46 4f 52 4d 41 54 20 7c 20 54 59 50 45 5f 4d  _FORMAT | TYPE_M
7cb0: 44 2c 20 4e 55 4c 4c 29 3b 0a 09 7d 20 65 6c 73  D, NULL);..} els
7cc0: 65 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  e {..    Tcl_App
7cd0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
7ce0: 2c 20 22 49 6e 76 61 6c 69 64 20 64 69 67 65 73  , "Invalid diges
7cf0: 74 20 5c 22 22 2c 20 64 69 67 65 73 74 4e 61 6d  t \"", digestNam
7d00: 65 2c 20 22 5c 22 22 2c 20 4e 55 4c 4c 29 3b 0a  e, "\"", NULL);.
7d10: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
7d20: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a  ERROR;..}.    }.
7d30: 0a 20 20 20 20 2f 2a 20 47 65 74 20 6f 70 74 69  .    /* Get opti
7d40: 6f 6e 73 20 2a 2f 0a 20 20 20 20 66 6f 72 20 28  ons */.    for (
7d50: 69 64 78 20 3d 20 31 3b 20 69 64 78 20 3c 20 6f  idx = 1; idx < o
7d60: 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 63  bjc; idx++) {..c
7d70: 68 61 72 20 2a 6f 70 74 20 3d 20 54 63 6c 5f 47  har *opt = Tcl_G
7d80: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
7d90: 6f 62 6a 76 5b 69 64 78 5d 2c 20 4e 55 4c 4c 29  objv[idx], NULL)
7da0: 3b 0a 0a 09 69 66 20 28 6f 70 74 5b 30 5d 20 21  ;...if (opt[0] !
7db0: 3d 20 27 2d 27 29 20 7b 0a 09 20 20 20 20 62 72  = '-') {..    br
7dc0: 65 61 6b 3b 0a 09 7d 0a 0a 09 4f 50 54 46 4c 41  eak;..}...OPTFLA
7dd0: 47 28 22 2d 62 69 6e 22 2c 20 66 6f 72 6d 61 74  G("-bin", format
7de0: 2c 20 42 49 4e 5f 46 4f 52 4d 41 54 29 3b 0a 09  , BIN_FORMAT);..
7df0: 4f 50 54 46 4c 41 47 28 22 2d 62 69 6e 61 72 79  OPTFLAG("-binary
7e00: 22 2c 20 66 6f 72 6d 61 74 2c 20 42 49 4e 5f 46  ", format, BIN_F
7e10: 4f 52 4d 41 54 29 3b 0a 09 4f 50 54 46 4c 41 47  ORMAT);..OPTFLAG
7e20: 28 22 2d 68 65 78 22 2c 20 66 6f 72 6d 61 74 2c  ("-hex", format,
7e30: 20 48 45 58 5f 46 4f 52 4d 41 54 29 3b 0a 09 4f   HEX_FORMAT);..O
7e40: 50 54 46 4c 41 47 28 22 2d 68 65 78 61 64 65 63  PTFLAG("-hexadec
7e50: 69 6d 61 6c 22 2c 20 66 6f 72 6d 61 74 2c 20 48  imal", format, H
7e60: 45 58 5f 46 4f 52 4d 41 54 29 3b 0a 09 4f 50 54  EX_FORMAT);..OPT
7e70: 53 54 52 28 22 2d 63 68 61 6e 22 2c 20 63 68 61  STR("-chan", cha
7e80: 6e 6e 65 6c 29 3b 0a 09 4f 50 54 53 54 52 28 22  nnel);..OPTSTR("
7e90: 2d 63 68 61 6e 6e 65 6c 22 2c 20 63 68 61 6e 6e  -channel", chann
7ea0: 65 6c 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63  el);..OPTSTR("-c
7eb0: 69 70 68 65 72 22 2c 20 63 69 70 68 65 72 4e 61  ipher", cipherNa
7ec0: 6d 65 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 63  me);..OPTOBJ("-c
7ed0: 6f 6d 6d 61 6e 64 22 2c 20 63 6d 64 4f 62 6a 29  ommand", cmdObj)
7ee0: 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 64 61 74 61  ;..OPTOBJ("-data
7ef0: 22 2c 20 64 61 74 61 4f 62 6a 29 3b 0a 09 4f 50  ", dataObj);..OP
7f00: 54 53 54 52 28 22 2d 64 69 67 65 73 74 22 2c 20  TSTR("-digest", 
7f10: 64 69 67 65 73 74 4e 61 6d 65 29 3b 0a 09 4f 50  digestName);..OP
7f20: 54 4f 42 4a 28 22 2d 66 69 6c 65 22 2c 20 66 69  TOBJ("-file", fi
7f30: 6c 65 4f 62 6a 29 3b 0a 09 4f 50 54 4f 42 4a 28  leObj);..OPTOBJ(
7f40: 22 2d 66 69 6c 65 6e 61 6d 65 22 2c 20 66 69 6c  "-filename", fil
7f50: 65 4f 62 6a 29 3b 0a 09 4f 50 54 4f 42 4a 28 22  eObj);..OPTOBJ("
7f60: 2d 6b 65 79 22 2c 20 6b 65 79 4f 62 6a 29 3b 0a  -key", keyObj);.
7f70: 0a 09 4f 50 54 42 41 44 28 22 6f 70 74 69 6f 6e  ..OPTBAD("option
7f80: 22 2c 20 22 2d 62 69 6e 2c 20 2d 63 68 61 6e 6e  ", "-bin, -chann
7f90: 65 6c 2c 20 2d 63 69 70 68 65 72 2c 20 2d 63 6f  el, -cipher, -co
7fa0: 6d 6d 61 6e 64 2c 20 2d 64 61 74 61 2c 20 2d 64  mmand, -data, -d
7fb0: 69 67 65 73 74 2c 20 2d 66 69 6c 65 2c 20 2d 66  igest, -file, -f
7fc0: 69 6c 65 6e 61 6d 65 2c 20 2d 68 65 78 2c 20 6f  ilename, -hex, o
7fd0: 72 20 2d 6b 65 79 22 29 3b 0a 09 72 65 74 75 72  r -key");..retur
7fe0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
7ff0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63   }..    /* Get c
8000: 69 70 68 65 72 20 2a 2f 0a 20 20 20 20 69 66 20  ipher */.    if 
8010: 28 63 69 70 68 65 72 4e 61 6d 65 20 21 3d 20 4e  (cipherName != N
8020: 55 4c 4c 29 20 7b 0a 09 63 69 70 68 65 72 20 3d  ULL) {..cipher =
8030: 20 45 56 50 5f 67 65 74 5f 63 69 70 68 65 72 62   EVP_get_cipherb
8040: 79 6e 61 6d 65 28 63 69 70 68 65 72 4e 61 6d 65  yname(cipherName
8050: 29 3b 0a 09 74 79 70 65 20 3d 20 54 59 50 45 5f  );..type = TYPE_
8060: 43 4d 41 43 3b 0a 09 69 66 20 28 63 69 70 68 65  CMAC;..if (ciphe
8070: 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  r == NULL) {..  
8080: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
8090: 6c 74 28 69 6e 74 65 72 70 2c 20 22 49 6e 76 61  lt(interp, "Inva
80a0: 6c 69 64 20 63 69 70 68 65 72 20 5c 22 22 2c 20  lid cipher \"", 
80b0: 63 69 70 68 65 72 4e 61 6d 65 2c 20 22 5c 22 22  cipherName, "\""
80c0: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65  , NULL);..    re
80d0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
80e0: 09 7d 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  .}..    } else i
80f0: 66 20 28 74 79 70 65 20 3d 3d 20 54 59 50 45 5f  f (type == TYPE_
8100: 43 4d 41 43 29 20 7b 0a 09 54 63 6c 5f 41 70 70  CMAC) {..Tcl_App
8110: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8120: 2c 20 22 4e 6f 20 63 69 70 68 65 72 20 73 70 65  , "No cipher spe
8130: 63 69 66 69 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a  cified", NULL);.
8140: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
8150: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
8160: 20 47 65 74 20 64 69 67 65 73 74 20 2a 2f 0a 20   Get digest */. 
8170: 20 20 20 69 66 20 28 64 69 67 65 73 74 4e 61 6d     if (digestNam
8180: 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6d 64  e != NULL) {..md
8190: 20 3d 20 45 56 50 5f 67 65 74 5f 64 69 67 65 73   = EVP_get_diges
81a0: 74 62 79 6e 61 6d 65 28 64 69 67 65 73 74 4e 61  tbyname(digestNa
81b0: 6d 65 29 3b 0a 09 69 66 20 28 6d 64 20 3d 3d 20  me);..if (md == 
81c0: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c  NULL) {..    Tcl
81d0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
81e0: 74 65 72 70 2c 20 22 49 6e 76 61 6c 69 64 20 64  terp, "Invalid d
81f0: 69 67 65 73 74 20 5c 22 22 2c 20 64 69 67 65 73  igest \"", diges
8200: 74 4e 61 6d 65 2c 20 22 5c 22 22 2c 20 4e 55 4c  tName, "\"", NUL
8210: 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  L);..    return 
8220: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 20 65 6c  TCL_ERROR;..} el
8230: 73 65 20 69 66 20 28 6d 64 20 3d 3d 20 45 56 50  se if (md == EVP
8240: 5f 73 68 61 6b 65 31 32 38 28 29 20 7c 7c 20 6d  _shake128() || m
8250: 64 20 3d 3d 20 45 56 50 5f 73 68 61 6b 65 32 35  d == EVP_shake25
8260: 36 28 29 29 20 7b 0a 09 20 20 20 20 66 6f 72 6d  6()) {..    form
8270: 61 74 20 7c 3d 20 49 53 5f 58 4f 46 3b 0a 09 7d  at |= IS_XOF;..}
8280: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
8290: 74 79 70 65 20 3d 3d 20 54 59 50 45 5f 4d 44 20  type == TYPE_MD 
82a0: 7c 7c 20 74 79 70 65 20 3d 3d 20 54 59 50 45 5f  || type == TYPE_
82b0: 48 4d 41 43 29 20 7b 0a 09 54 63 6c 5f 41 70 70  HMAC) {..Tcl_App
82c0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
82d0: 2c 20 22 4e 6f 20 64 69 67 65 73 74 20 73 70 65  , "No digest spe
82e0: 63 69 66 69 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a  cified", NULL);.
82f0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
8300: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
8310: 20 47 65 74 20 6b 65 79 20 2a 2f 0a 20 20 20 20   Get key */.    
8320: 69 66 20 28 6b 65 79 4f 62 6a 20 21 3d 20 4e 55  if (keyObj != NU
8330: 4c 4c 29 20 7b 0a 09 69 66 20 28 74 79 70 65 20  LL) {..if (type 
8340: 3d 3d 20 54 59 50 45 5f 4d 44 29 20 7b 0a 09 20  == TYPE_MD) {.. 
8350: 20 20 20 74 79 70 65 20 3d 20 54 59 50 45 5f 48     type = TYPE_H
8360: 4d 41 43 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c  MAC;..}.    } el
8370: 73 65 20 69 66 20 28 74 79 70 65 20 21 3d 20 54  se if (type != T
8380: 59 50 45 5f 4d 44 29 20 7b 0a 09 54 63 6c 5f 41  YPE_MD) {..Tcl_A
8390: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
83a0: 72 70 2c 20 22 4e 6f 20 6b 65 79 20 73 70 65 63  rp, "No key spec
83b0: 69 66 69 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09  ified", NULL);..
83c0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
83d0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
83e0: 43 61 6c 63 20 64 69 67 65 73 74 20 6f 6e 20 66  Calc digest on f
83f0: 69 6c 65 2c 20 73 74 61 63 6b 65 64 20 63 68 61  ile, stacked cha
8400: 6e 6e 65 6c 2c 20 75 73 69 6e 67 20 69 6e 73 74  nnel, using inst
8410: 61 6e 63 65 20 63 6f 6d 6d 61 6e 64 2c 20 6f 72  ance command, or
8420: 20 64 61 74 61 20 62 6c 6f 62 20 2a 2f 0a 20 20   data blob */.  
8430: 20 20 69 66 20 28 66 69 6c 65 4f 62 6a 20 21 3d    if (fileObj !=
8440: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 20 3d 20   NULL) {..res = 
8450: 44 69 67 65 73 74 46 69 6c 65 48 61 6e 64 6c 65  DigestFileHandle
8460: 72 28 69 6e 74 65 72 70 2c 20 66 69 6c 65 4f 62  r(interp, fileOb
8470: 6a 2c 20 6d 64 2c 20 63 69 70 68 65 72 2c 20 66  j, md, cipher, f
8480: 6f 72 6d 61 74 20 7c 20 74 79 70 65 2c 20 6b 65  ormat | type, ke
8490: 79 4f 62 6a 29 3b 0a 20 20 20 20 7d 20 65 6c 73  yObj);.    } els
84a0: 65 20 69 66 20 28 63 68 61 6e 6e 65 6c 20 21 3d  e if (channel !=
84b0: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 20 3d 20   NULL) {..res = 
84c0: 44 69 67 65 73 74 43 68 61 6e 6e 65 6c 48 61 6e  DigestChannelHan
84d0: 64 6c 65 72 28 69 6e 74 65 72 70 2c 20 63 68 61  dler(interp, cha
84e0: 6e 6e 65 6c 2c 20 6d 64 2c 20 63 69 70 68 65 72  nnel, md, cipher
84f0: 2c 20 66 6f 72 6d 61 74 20 7c 20 74 79 70 65 2c  , format | type,
8500: 20 6b 65 79 4f 62 6a 29 3b 0a 20 20 20 20 7d 20   keyObj);.    } 
8510: 65 6c 73 65 20 69 66 20 28 63 6d 64 4f 62 6a 20  else if (cmdObj 
8520: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 20  != NULL) {..res 
8530: 3d 20 44 69 67 65 73 74 43 6f 6d 6d 61 6e 64 48  = DigestCommandH
8540: 61 6e 64 6c 65 72 28 69 6e 74 65 72 70 2c 20 63  andler(interp, c
8550: 6d 64 4f 62 6a 2c 20 6d 64 2c 20 63 69 70 68 65  mdObj, md, ciphe
8560: 72 2c 20 66 6f 72 6d 61 74 20 7c 20 74 79 70 65  r, format | type
8570: 2c 20 6b 65 79 4f 62 6a 29 3b 0a 20 20 20 20 7d  , keyObj);.    }
8580: 20 65 6c 73 65 20 69 66 20 28 64 61 74 61 4f 62   else if (dataOb
8590: 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  j != NULL) {..re
85a0: 73 20 3d 20 44 69 67 65 73 74 44 61 74 61 48 61  s = DigestDataHa
85b0: 6e 64 6c 65 72 28 69 6e 74 65 72 70 2c 20 64 61  ndler(interp, da
85c0: 74 61 4f 62 6a 2c 20 6d 64 2c 20 63 69 70 68 65  taObj, md, ciphe
85d0: 72 2c 20 66 6f 72 6d 61 74 20 7c 20 74 79 70 65  r, format | type
85e0: 2c 20 6b 65 79 4f 62 6a 29 3b 0a 20 20 20 20 7d  , keyObj);.    }
85f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b  .    return res;
8600: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
8610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
8650: 20 2a 20 4d 65 73 73 61 67 65 20 44 69 67 65 73   * Message Diges
8660: 74 20 61 6e 64 20 4d 65 73 73 61 67 65 20 41 75  t and Message Au
8670: 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 43 6f 64  thentication Cod
8680: 65 20 43 6f 6d 6d 61 6e 64 73 20 2d 2d 0a 20 2a  e Commands --. *
8690: 0a 20 2a 09 52 65 74 75 72 6e 20 4d 65 73 73 61  . *.Return Messa
86a0: 67 65 20 44 69 67 65 73 74 20 28 4d 44 29 20 6f  ge Digest (MD) o
86b0: 72 20 4d 65 73 73 61 67 65 20 41 75 74 68 65 6e  r Message Authen
86c0: 74 69 63 61 74 69 6f 6e 20 43 6f 64 65 20 28 4d  tication Code (M
86d0: 41 43 29 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72  AC).. *. * Retur
86e0: 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72  ns:. *.TCL_OK or
86f0: 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a   TCL_ERROR. *. *
8700: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
8710: 2a 09 53 65 74 73 20 72 65 73 75 6c 74 20 74 6f  *.Sets result to
8720: 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20   message digest 
8730: 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  or error message
8740: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
8750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
8790: 61 74 69 63 20 69 6e 74 20 4d 64 4f 62 6a 43 6d  atic int MdObjCm
87a0: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  d(ClientData cli
87b0: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  entData, Tcl_Int
87c0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
87d0: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
87e0: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a  const objv[]) {.
87f0: 20 20 20 20 72 65 74 75 72 6e 20 44 69 67 65 73      return Diges
8800: 74 4d 61 69 6e 28 54 59 50 45 5f 4d 44 2c 20 69  tMain(TYPE_MD, i
8810: 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a  nterp, objc, obj
8820: 76 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  v);.}..static in
8830: 74 20 43 4d 41 43 4f 62 6a 43 6d 64 28 43 6c 69  t CMACObjCmd(Cli
8840: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
8850: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
8860: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
8870: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
8880: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 72   objv[]) {.    r
8890: 65 74 75 72 6e 20 44 69 67 65 73 74 4d 61 69 6e  eturn DigestMain
88a0: 28 54 59 50 45 5f 43 4d 41 43 2c 20 69 6e 74 65  (TYPE_CMAC, inte
88b0: 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b  rp, objc, objv);
88c0: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 48  .}..static int H
88d0: 4d 41 43 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74  MACObjCmd(Client
88e0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
88f0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
8900: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
8910: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
8920: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74 75  jv[]) {.    retu
8930: 72 6e 20 44 69 67 65 73 74 4d 61 69 6e 28 54 59  rn DigestMain(TY
8940: 50 45 5f 48 4d 41 43 2c 20 69 6e 74 65 72 70 2c  PE_HMAC, interp,
8950: 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 7d 0a   objc, objv);.}.
8960: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
8970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
89a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
89b0: 4d 65 73 73 61 67 65 20 44 69 67 65 73 74 20 43  Message Digest C
89c0: 6f 6e 76 65 6e 69 65 6e 63 65 20 43 6f 6d 6d 61  onvenience Comma
89d0: 6e 64 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43 6f 6e  nds --. *. *.Con
89e0: 76 65 6e 69 65 6e 63 65 20 63 6f 6d 6d 61 6e 64  venience command
89f0: 73 20 66 6f 72 20 73 65 6c 65 63 74 20 6d 65 73  s for select mes
8a00: 73 61 67 65 20 64 69 67 65 73 74 73 2e 0a 20 2a  sage digests.. *
8a10: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09  . * Returns:. *.
8a20: 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52  TCL_OK or TCL_ER
8a30: 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ROR. *. * Side e
8a40: 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20  ffects:. *.Sets 
8a50: 72 65 73 75 6c 74 20 74 6f 20 6d 65 73 73 61 67  result to messag
8a60: 65 20 64 69 67 65 73 74 20 6f 72 20 65 72 72 6f  e digest or erro
8a70: 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d  r message. *. *-
8a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ac0: 2d 2d 0a 20 2a 2f 0a 20 23 64 65 66 69 6e 65 20  --. */. #define 
8ad0: 76 61 6c 69 64 61 74 65 5f 61 72 67 63 28 6f 62  validate_argc(ob
8ae0: 6a 63 2c 20 6f 62 6a 76 29 20 7b 20 5c 0a 20 20  jc, objv) { \.  
8af0: 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29    if (objc != 2)
8b00: 20 7b 20 5c 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e   { \..Tcl_WrongN
8b10: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
8b20: 2c 20 6f 62 6a 76 2c 20 22 64 61 74 61 22 29 3b  , objv, "data");
8b30: 20 5c 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   \..return TCL_E
8b40: 52 52 4f 52 3b 20 5c 0a 20 20 20 20 7d 20 5c 0a  RROR; \.    } \.
8b50: 7d 0a 20 0a 69 6e 74 20 4d 44 34 4f 62 6a 43 6d  }. .int MD4ObjCm
8b60: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  d(ClientData cli
8b70: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  entData, Tcl_Int
8b80: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
8b90: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
8ba0: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a  const objv[]) {.
8bb0: 20 20 20 20 76 61 6c 69 64 61 74 65 5f 61 72 67      validate_arg
8bc0: 63 28 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 20  c(objc, objv);. 
8bd0: 20 20 20 72 65 74 75 72 6e 20 44 69 67 65 73 74     return Digest
8be0: 44 61 74 61 48 61 6e 64 6c 65 72 28 69 6e 74 65  DataHandler(inte
8bf0: 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 45 56 50  rp, objv[1], EVP
8c00: 5f 6d 64 34 28 29 2c 20 4e 55 4c 4c 2c 20 48 45  _md4(), NULL, HE
8c10: 58 5f 46 4f 52 4d 41 54 20 7c 20 54 59 50 45 5f  X_FORMAT | TYPE_
8c20: 4d 44 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 69 6e  MD, NULL);.}..in
8c30: 74 20 4d 44 35 4f 62 6a 43 6d 64 28 43 6c 69 65  t MD5ObjCmd(Clie
8c40: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
8c50: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
8c60: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
8c70: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20   Tcl_Obj *const 
8c80: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 76 61  objv[]) {.    va
8c90: 6c 69 64 61 74 65 5f 61 72 67 63 28 6f 62 6a 63  lidate_argc(objc
8ca0: 2c 20 6f 62 6a 76 29 3b 0a 20 20 20 20 72 65 74  , objv);.    ret
8cb0: 75 72 6e 20 44 69 67 65 73 74 44 61 74 61 48 61  urn DigestDataHa
8cc0: 6e 64 6c 65 72 28 69 6e 74 65 72 70 2c 20 6f 62  ndler(interp, ob
8cd0: 6a 76 5b 31 5d 2c 20 45 56 50 5f 6d 64 35 28 29  jv[1], EVP_md5()
8ce0: 2c 20 4e 55 4c 4c 2c 20 48 45 58 5f 46 4f 52 4d  , NULL, HEX_FORM
8cf0: 41 54 20 7c 20 54 59 50 45 5f 4d 44 2c 20 4e 55  AT | TYPE_MD, NU
8d00: 4c 4c 29 3b 0a 7d 0a 0a 69 6e 74 20 53 48 41 31  LL);.}..int SHA1
8d10: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74  ObjCmd(ClientDat
8d20: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63  a clientData, Tc
8d30: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
8d40: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f  , int objc, Tcl_
8d50: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b  Obj *const objv[
8d60: 5d 29 20 7b 0a 20 20 20 20 76 61 6c 69 64 61 74  ]) {.    validat
8d70: 65 5f 61 72 67 63 28 6f 62 6a 63 2c 20 6f 62 6a  e_argc(objc, obj
8d80: 76 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 44  v);.    return D
8d90: 69 67 65 73 74 44 61 74 61 48 61 6e 64 6c 65 72  igestDataHandler
8da0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d  (interp, objv[1]
8db0: 2c 20 45 56 50 5f 73 68 61 31 28 29 2c 20 4e 55  , EVP_sha1(), NU
8dc0: 4c 4c 2c 20 48 45 58 5f 46 4f 52 4d 41 54 20 7c  LL, HEX_FORMAT |
8dd0: 20 54 59 50 45 5f 4d 44 2c 20 4e 55 4c 4c 29 3b   TYPE_MD, NULL);
8de0: 0a 7d 0a 0a 69 6e 74 20 53 48 41 32 35 36 4f 62  .}..int SHA256Ob
8df0: 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20  jCmd(ClientData 
8e00: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f  clientData, Tcl_
8e10: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
8e20: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
8e30: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j *const objv[])
8e40: 20 7b 0a 20 20 20 20 76 61 6c 69 64 61 74 65 5f   {.    validate_
8e50: 61 72 67 63 28 6f 62 6a 63 2c 20 6f 62 6a 76 29  argc(objc, objv)
8e60: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 44 69 67  ;.    return Dig
8e70: 65 73 74 44 61 74 61 48 61 6e 64 6c 65 72 28 69  estDataHandler(i
8e80: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
8e90: 45 56 50 5f 73 68 61 32 35 36 28 29 2c 20 4e 55  EVP_sha256(), NU
8ea0: 4c 4c 2c 20 48 45 58 5f 46 4f 52 4d 41 54 20 7c  LL, HEX_FORMAT |
8eb0: 20 54 59 50 45 5f 4d 44 2c 20 4e 55 4c 4c 29 3b   TYPE_MD, NULL);
8ec0: 0a 7d 0a 0a 69 6e 74 20 53 48 41 35 31 32 4f 62  .}..int SHA512Ob
8ed0: 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20  jCmd(ClientData 
8ee0: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f  clientData, Tcl_
8ef0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
8f00: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
8f10: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j *const objv[])
8f20: 20 7b 0a 20 20 20 20 76 61 6c 69 64 61 74 65 5f   {.    validate_
8f30: 61 72 67 63 28 6f 62 6a 63 2c 20 6f 62 6a 76 29  argc(objc, objv)
8f40: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 44 69 67  ;.    return Dig
8f50: 65 73 74 44 61 74 61 48 61 6e 64 6c 65 72 28 69  estDataHandler(i
8f60: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
8f70: 45 56 50 5f 73 68 61 35 31 32 28 29 2c 20 4e 55  EVP_sha512(), NU
8f80: 4c 4c 2c 20 48 45 58 5f 46 4f 52 4d 41 54 20 7c  LL, HEX_FORMAT |
8f90: 20 54 59 50 45 5f 4d 44 2c 20 4e 55 4c 4c 29 3b   TYPE_MD, NULL);
8fa0: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
8fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
8ff0: 20 2a 20 54 6c 73 5f 44 69 67 65 73 74 43 6f 6d   * Tls_DigestCom
9000: 6d 61 6e 64 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43  mands --. *. *.C
9010: 72 65 61 74 65 20 64 69 67 65 73 74 20 63 6f 6d  reate digest com
9020: 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 74 75  mands. *. * Retu
9030: 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f  rns:. *.TCL_OK o
9040: 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20  r TCL_ERROR. *. 
9050: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
9060: 20 2a 09 43 72 65 61 74 65 73 20 63 6f 6d 6d 61   *.Creates comma
9070: 6e 64 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  nds. *. *-------
9080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
90a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
90b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
90c0: 0a 69 6e 74 20 54 6c 73 5f 44 69 67 65 73 74 43  .int Tls_DigestC
90d0: 6f 6d 6d 61 6e 64 73 28 54 63 6c 5f 49 6e 74 65  ommands(Tcl_Inte
90e0: 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20  rp *interp) {.  
90f0: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
9100: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
9110: 74 6c 73 3a 3a 64 69 67 65 73 74 22 2c 20 4d 64  tls::digest", Md
9120: 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44  ObjCmd, (ClientD
9130: 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64  ata) 0, (Tcl_Cmd
9140: 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
9150: 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65  LL);.    Tcl_Cre
9160: 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
9170: 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 64 22 2c  terp, "tls::md",
9180: 20 4d 64 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65   MdObjCmd, (Clie
9190: 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f  ntData) 0, (Tcl_
91a0: 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
91b0: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f   NULL);.    Tcl_
91c0: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
91d0: 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63  (interp, "tls::c
91e0: 6d 61 63 22 2c 20 43 4d 41 43 4f 62 6a 43 6d 64  mac", CMACObjCmd
91f0: 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30  , (ClientData) 0
9200: 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
9210: 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Proc *) NULL);. 
9220: 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
9230: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
9240: 22 74 6c 73 3a 3a 68 6d 61 63 22 2c 20 48 4d 41  "tls::hmac", HMA
9250: 43 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  CObjCmd, (Client
9260: 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d  Data) 0, (Tcl_Cm
9270: 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
9280: 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72  ULL);.    Tcl_Cr
9290: 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
92a0: 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 64 34  nterp, "tls::md4
92b0: 22 2c 20 4d 44 34 4f 62 6a 43 6d 64 2c 20 28 43  ", MD4ObjCmd, (C
92c0: 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54  lientData) 0, (T
92d0: 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
92e0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
92f0: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
9300: 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  and(interp, "tls
9310: 3a 3a 6d 64 35 22 2c 20 4d 44 35 4f 62 6a 43 6d  ::md5", MD5ObjCm
9320: 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  d, (ClientData) 
9330: 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  0, (Tcl_CmdDelet
9340: 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
9350: 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
9360: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
9370: 20 22 74 6c 73 3a 3a 73 68 61 31 22 2c 20 53 48   "tls::sha1", SH
9380: 41 31 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e  A1ObjCmd, (Clien
9390: 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43  tData) 0, (Tcl_C
93a0: 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
93b0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43  NULL);.    Tcl_C
93c0: 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
93d0: 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 68  interp, "tls::sh
93e0: 61 32 35 36 22 2c 20 53 48 41 32 35 36 4f 62 6a  a256", SHA256Obj
93f0: 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  Cmd, (ClientData
9400: 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ) 0, (Tcl_CmdDel
9410: 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
9420: 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
9430: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
9440: 70 2c 20 22 74 6c 73 3a 3a 73 68 61 35 31 32 22  p, "tls::sha512"
9450: 2c 20 53 48 41 35 31 32 4f 62 6a 43 6d 64 2c 20  , SHA512ObjCmd, 
9460: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20  (ClientData) 0, 
9470: 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
9480: 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  oc *) NULL);.   
9490: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
94a0: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74  mmand(interp, "t
94b0: 6c 73 3a 3a 75 6e 73 74 61 63 6b 22 2c 20 44 69  ls::unstack", Di
94c0: 67 65 73 74 55 6e 73 74 61 63 6b 4f 62 6a 43 6d  gestUnstackObjCm
94d0: 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  d, (ClientData) 
94e0: 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  0, (Tcl_CmdDelet
94f0: 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
9500: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
9510: 4b 3b 0a 7d 0a 0a                                K;.}..