Hex Artifact Content

Artifact 65509e5caaf2b475cad74b5918b158e2c821ca6ead78c7283e38ea30bf3f0854:


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 23 64 65 66  E_CMAC.0x40.#def
02f0: 69 6e 65 20 54 59 50 45 5f 4d 41 43 09 30 78 38  ine TYPE_MAC.0x8
0300: 30 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  0../************
0310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0340: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 20  *******/../*. * 
0350: 54 68 69 73 20 73 74 72 75 63 74 75 72 65 20 64  This structure d
0360: 65 66 69 6e 65 73 20 74 68 65 20 70 65 72 2d 69  efines the per-i
0370: 6e 73 74 61 6e 63 65 20 73 74 61 74 65 20 6f 66  nstance state of
0380: 20 61 20 64 69 67 65 73 74 20 6f 70 65 72 61 74   a digest operat
0390: 69 6f 6e 2e 0a 20 2a 2f 0a 74 79 70 65 64 65 66  ion.. */.typedef
03a0: 20 73 74 72 75 63 74 20 44 69 67 65 73 74 53 74   struct DigestSt
03b0: 61 74 65 20 7b 0a 09 54 63 6c 5f 43 68 61 6e 6e  ate {..Tcl_Chann
03c0: 65 6c 20 73 65 6c 66 3b 09 2f 2a 20 54 68 69 73  el self;./* This
03d0: 20 73 6f 63 6b 65 74 20 63 68 61 6e 6e 65 6c 20   socket channel 
03e0: 2a 2f 0a 09 54 63 6c 5f 54 69 6d 65 72 54 6f 6b  */..Tcl_TimerTok
03f0: 65 6e 20 74 69 6d 65 72 3b 09 2f 2a 20 54 69 6d  en timer;./* Tim
0400: 65 72 20 66 6f 72 20 72 65 61 64 20 65 76 65 6e  er for read even
0410: 74 73 20 2a 2f 0a 0a 09 69 6e 74 20 66 6c 61 67  ts */...int flag
0420: 73 3b 09 09 2f 2a 20 43 68 61 6e 20 63 6f 6e 66  s;../* Chan conf
0430: 69 67 20 66 6c 61 67 73 20 2a 2f 0a 09 69 6e 74  ig flags */..int
0440: 20 77 61 74 63 68 4d 61 73 6b 3b 09 09 2f 2a 20   watchMask;../* 
0450: 43 75 72 72 65 6e 74 20 57 61 74 63 68 50 72 6f  Current WatchPro
0460: 63 20 6d 61 73 6b 20 2a 2f 0a 09 69 6e 74 20 6d  c mask */..int m
0470: 6f 64 65 3b 09 09 2f 2a 20 43 75 72 72 65 6e 74  ode;../* Current
0480: 20 6d 6f 64 65 20 6f 66 20 70 61 72 65 6e 74 20   mode of parent 
0490: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 09 69 6e 74 20  channel */..int 
04a0: 66 6f 72 6d 61 74 3b 09 09 2f 2a 20 44 69 67 65  format;../* Dige
04b0: 73 74 20 66 6f 72 6d 61 74 20 61 6e 64 20 6f 70  st format and op
04c0: 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 09 54 63 6c  eration */...Tcl
04d0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b  _Interp *interp;
04e0: 09 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 65  ./* Current inte
04f0: 72 70 72 65 74 65 72 20 2a 2f 0a 09 45 56 50 5f  rpreter */..EVP_
0500: 4d 44 5f 43 54 58 20 2a 63 74 78 3b 09 2f 2a 20  MD_CTX *ctx;./* 
0510: 4d 44 20 43 6f 6e 74 65 78 74 20 2a 2f 0a 09 48  MD Context */..H
0520: 4d 41 43 5f 43 54 58 20 2a 68 63 74 78 3b 09 09  MAC_CTX *hctx;..
0530: 2f 2a 20 48 4d 41 43 20 63 6f 6e 74 65 78 74 20  /* HMAC context 
0540: 2a 2f 0a 09 43 4d 41 43 5f 43 54 58 20 2a 63 63  */..CMAC_CTX *cc
0550: 74 78 3b 09 09 2f 2a 20 43 4d 41 43 20 63 6f 6e  tx;../* CMAC con
0560: 74 65 78 74 20 2a 2f 0a 09 54 63 6c 5f 43 6f 6d  text */..Tcl_Com
0570: 6d 61 6e 64 20 74 6f 6b 65 6e 3b 09 2f 2a 20 43  mand token;./* C
0580: 6f 6d 6d 61 6e 64 20 74 6f 6b 65 6e 20 2a 2f 0a  ommand token */.
0590: 7d 20 44 69 67 65 73 74 53 74 61 74 65 3b 0a 0a  } DigestState;..
05a0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
05b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05e0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44  --------. *. * D
05f0: 69 67 65 73 74 53 74 61 74 65 4e 65 77 20 2d 2d  igestStateNew --
0600: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63  . *. *.This func
0610: 74 69 6f 6e 20 63 72 65 61 74 65 73 20 61 20 70  tion creates a p
0620: 65 72 2d 69 6e 73 74 61 6e 63 65 20 73 74 61 74  er-instance stat
0630: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
0640: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a  . *. * Returns:.
0650: 20 2a 09 44 69 67 65 73 74 20 73 74 72 75 63 74   *.Digest struct
0660: 75 72 65 20 70 6f 69 6e 74 65 72 0a 20 2a 0a 20  ure pointer. *. 
0670: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
0680: 20 2a 09 43 72 65 61 74 65 73 20 73 74 72 75 63   *.Creates struc
0690: 74 75 72 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ture. *. *------
06a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
06e0: 2f 0a 44 69 67 65 73 74 53 74 61 74 65 20 2a 44  /.DigestState *D
06f0: 69 67 65 73 74 53 74 61 74 65 4e 65 77 28 54 63  igestStateNew(Tc
0700: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
0710: 2c 20 69 6e 74 20 66 6f 72 6d 61 74 29 20 7b 0a  , int format) {.
0720: 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20      DigestState 
0730: 2a 73 74 61 74 65 50 74 72 3b 0a 0a 20 20 20 20  *statePtr;..    
0740: 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65  statePtr = (Dige
0750: 73 74 53 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c  stState *) ckall
0760: 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69  oc((unsigned) si
0770: 7a 65 6f 66 28 44 69 67 65 73 74 53 74 61 74 65  zeof(DigestState
0780: 29 29 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74  ));.    if (stat
0790: 65 50 74 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  ePtr != NULL) {.
07a0: 09 6d 65 6d 73 65 74 28 73 74 61 74 65 50 74 72  .memset(statePtr
07b0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 44 69 67 65  , 0, sizeof(Dige
07c0: 73 74 53 74 61 74 65 29 29 3b 0a 09 73 74 61 74  stState));..stat
07d0: 65 50 74 72 2d 3e 73 65 6c 66 09 3d 20 4e 55 4c  ePtr->self.= NUL
07e0: 4c 3b 09 09 2f 2a 20 54 68 69 73 20 73 6f 63 6b  L;../* This sock
07f0: 65 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 09 73  et channel */..s
0800: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d  tatePtr->timer =
0810: 20 4e 55 4c 4c 3b 09 09 2f 2a 20 54 69 6d 65 72   NULL;../* Timer
0820: 20 74 6f 20 66 6c 75 73 68 20 64 61 74 61 20 2a   to flush data *
0830: 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61  /..statePtr->fla
0840: 67 73 20 3d 20 30 3b 09 09 2f 2a 20 43 68 61 6e  gs = 0;../* Chan
0850: 20 63 6f 6e 66 69 67 20 66 6c 61 67 73 20 2a 2f   config flags */
0860: 0a 09 73 74 61 74 65 50 74 72 2d 3e 77 61 74 63  ..statePtr->watc
0870: 68 4d 61 73 6b 20 3d 20 30 3b 09 2f 2a 20 43 75  hMask = 0;./* Cu
0880: 72 72 65 6e 74 20 57 61 74 63 68 50 72 6f 63 20  rrent WatchProc 
0890: 6d 61 73 6b 20 2a 2f 0a 09 73 74 61 74 65 50 74  mask */..statePt
08a0: 72 2d 3e 6d 6f 64 65 09 3d 20 30 3b 09 09 2f 2a  r->mode.= 0;../*
08b0: 20 43 75 72 72 65 6e 74 20 6d 6f 64 65 20 6f 66   Current mode of
08c0: 20 70 61 72 65 6e 74 20 63 68 61 6e 6e 65 6c 20   parent channel 
08d0: 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6f  */..statePtr->fo
08e0: 72 6d 61 74 20 3d 20 66 6f 72 6d 61 74 3b 09 2f  rmat = format;./
08f0: 2a 20 44 69 67 65 73 74 20 66 6f 72 6d 61 74 20  * Digest format 
0900: 61 6e 64 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  and operation */
0910: 0a 09 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  ..statePtr->inte
0920: 72 70 20 3d 20 69 6e 74 65 72 70 3b 09 2f 2a 20  rp = interp;./* 
0930: 43 75 72 72 65 6e 74 20 69 6e 74 65 72 70 72 65  Current interpre
0940: 74 65 72 20 2a 2f 0a 09 73 74 61 74 65 50 74 72  ter */..statePtr
0950: 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 09 09 2f  ->ctx = NULL;../
0960: 2a 20 4d 44 20 43 6f 6e 74 65 78 74 20 2a 2f 0a  * MD Context */.
0970: 09 73 74 61 74 65 50 74 72 2d 3e 68 63 74 78 20  .statePtr->hctx 
0980: 3d 20 4e 55 4c 4c 3b 09 09 2f 2a 20 48 4d 41 43  = NULL;../* HMAC
0990: 20 43 6f 6e 74 65 78 74 20 2a 2f 0a 09 73 74 61   Context */..sta
09a0: 74 65 50 74 72 2d 3e 63 63 74 78 20 3d 20 4e 55  tePtr->cctx = NU
09b0: 4c 4c 3b 09 09 2f 2a 20 43 4d 41 43 20 43 6f 6e  LL;../* CMAC Con
09c0: 74 65 78 74 20 2a 2f 0a 09 73 74 61 74 65 50 74  text */..statePt
09d0: 72 2d 3e 74 6f 6b 65 6e 20 3d 20 4e 55 4c 4c 3b  r->token = NULL;
09e0: 09 09 2f 2a 20 43 6f 6d 6d 61 6e 64 20 74 6f 6b  ../* Command tok
09f0: 65 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  en */.    }.    
0a00: 72 65 74 75 72 6e 20 73 74 61 74 65 50 74 72 3b  return statePtr;
0a10: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
0a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
0a60: 20 2a 20 44 69 67 65 73 74 53 74 61 74 65 46 72   * DigestStateFr
0a70: 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  ee --. *. *.This
0a80: 20 66 75 6e 63 74 69 6f 6e 20 64 65 6c 65 74 65   function delete
0a90: 73 20 61 20 64 69 67 65 73 74 20 73 74 61 74 65  s a digest state
0aa0: 20 73 74 72 75 63 74 75 72 65 0a 20 2a 0a 20 2a   structure. *. *
0ab0: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 4e 6f 74   Returns:. *.Not
0ac0: 68 69 6e 67 0a 20 2a 0a 20 2a 20 53 69 64 65 20  hing. *. * Side 
0ad0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 52 65 6d 6f  effects:. *.Remo
0ae0: 76 65 73 20 73 74 72 75 63 74 75 72 65 0a 20 2a  ves structure. *
0af0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
0b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b30: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20  ------. */.void 
0b40: 44 69 67 65 73 74 53 74 61 74 65 46 72 65 65 28  DigestStateFree(
0b50: 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61  DigestState *sta
0b60: 74 65 50 74 72 29 20 7b 0a 20 20 20 20 69 66 20  tePtr) {.    if 
0b70: 28 73 74 61 74 65 50 74 72 20 3d 3d 20 28 44 69  (statePtr == (Di
0b80: 67 65 73 74 53 74 61 74 65 20 2a 29 20 4e 55 4c  gestState *) NUL
0b90: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 3b 0a 20 20  L) {..return;.  
0ba0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f    }..    /* Remo
0bb0: 76 65 20 70 65 6e 64 69 6e 67 20 74 69 6d 65 72  ve pending timer
0bc0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74   */.    if (stat
0bd0: 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28  ePtr->timer != (
0be0: 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20  Tcl_TimerToken) 
0bf0: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c  NULL) {..Tcl_Del
0c00: 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28  eteTimerHandler(
0c10: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29  statePtr->timer)
0c20: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
0c30: 46 72 65 65 20 63 6f 6e 74 65 78 74 20 73 74 72  Free context str
0c40: 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 69  uctures */.    i
0c50: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  f (statePtr->ctx
0c60: 20 21 3d 20 28 45 56 50 5f 4d 44 5f 43 54 58 20   != (EVP_MD_CTX 
0c70: 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 45 56 50 5f  *) NULL) {..EVP_
0c80: 4d 44 5f 43 54 58 5f 66 72 65 65 28 73 74 61 74  MD_CTX_free(stat
0c90: 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20  ePtr->ctx);.    
0ca0: 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  }.    if (stateP
0cb0: 74 72 2d 3e 68 63 74 78 20 21 3d 20 28 48 4d 41  tr->hctx != (HMA
0cc0: 43 5f 43 54 58 20 2a 29 20 4e 55 4c 4c 29 20 7b  C_CTX *) NULL) {
0cd0: 0a 09 48 4d 41 43 5f 43 54 58 5f 66 72 65 65 28  ..HMAC_CTX_free(
0ce0: 73 74 61 74 65 50 74 72 2d 3e 68 63 74 78 29 3b  statePtr->hctx);
0cf0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73  .    }.    if (s
0d00: 74 61 74 65 50 74 72 2d 3e 63 63 74 78 20 21 3d  tatePtr->cctx !=
0d10: 20 28 43 4d 41 43 5f 43 54 58 20 2a 29 20 4e 55   (CMAC_CTX *) NU
0d20: 4c 4c 29 20 7b 0a 09 43 4d 41 43 5f 43 54 58 5f  LL) {..CMAC_CTX_
0d30: 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 63  free(statePtr->c
0d40: 63 74 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ctx);.    }.    
0d50: 63 6b 66 72 65 65 28 73 74 61 74 65 50 74 72 29  ckfree(statePtr)
0d60: 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../**********
0d70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0d80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0d90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0da0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20  *********/../*. 
0db0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
0dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0df0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73  ----. *. * Diges
0e00: 74 49 6e 69 74 69 61 6c 69 7a 65 20 2d 2d 0a 20  tInitialize --. 
0e10: 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 20  *. *.Initialize 
0e20: 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 0a  a hash function.
0e30: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20   *. * Returns:. 
0e40: 2a 09 54 43 4c 5f 4f 4b 20 69 66 20 73 75 63 63  *.TCL_OK if succ
0e50: 65 73 73 66 75 6c 20 6f 72 20 54 43 4c 5f 45 52  essful or TCL_ER
0e60: 52 4f 52 20 66 6f 72 20 66 61 69 6c 75 72 65 20  ROR for failure 
0e70: 77 69 74 68 20 72 65 73 75 6c 74 20 73 65 74 0a  with result set.
0e80: 20 2a 09 74 6f 20 65 72 72 6f 72 20 6d 65 73 73   *.to error mess
0e90: 61 67 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  age.. *. * Side 
0ea0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 20 72  effects:. *.No r
0eb0: 65 73 75 6c 74 20 6f 72 20 65 72 72 6f 72 20 6d  esult or error m
0ec0: 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d  essage. *. *----
0ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
0f10: 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 49 6e   */.int DigestIn
0f20: 69 74 69 61 6c 69 7a 65 28 54 63 6c 5f 49 6e 74  itialize(Tcl_Int
0f30: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 44 69 67  erp *interp, Dig
0f40: 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50  estState *stateP
0f50: 74 72 2c 20 54 63 6c 5f 4f 62 6a 20 2a 64 69 67  tr, Tcl_Obj *dig
0f60: 65 73 74 4f 62 6a 2c 0a 09 54 63 6c 5f 4f 62 6a  estObj,..Tcl_Obj
0f70: 20 2a 63 69 70 68 65 72 4f 62 6a 2c 20 54 63 6c   *cipherObj, Tcl
0f80: 5f 4f 62 6a 20 2a 6b 65 79 4f 62 6a 2c 20 54 63  _Obj *keyObj, Tc
0f90: 6c 5f 4f 62 6a 20 2a 6d 61 63 4f 62 6a 29 20 7b  l_Obj *macObj) {
0fa0: 0a 20 20 20 20 69 6e 74 20 6b 65 79 5f 6c 65 6e  .    int key_len
0fb0: 20 3d 20 30 2c 20 74 79 70 65 20 3d 20 73 74 61   = 0, type = sta
0fc0: 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20  tePtr->format & 
0fd0: 30 78 46 46 30 3b 0a 20 20 20 20 63 6f 6e 73 74  0xFF0;.    const
0fe0: 20 63 68 61 72 20 2a 64 69 67 65 73 74 4e 61 6d   char *digestNam
0ff0: 65 20 3d 20 4e 55 4c 4c 2c 20 2a 63 69 70 68 65  e = NULL, *ciphe
1000: 72 4e 61 6d 65 20 3d 20 4e 55 4c 4c 2c 20 2a 6d  rName = NULL, *m
1010: 61 63 4e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 20  acName = NULL;. 
1020: 20 20 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20     const EVP_MD 
1030: 2a 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  *md = NULL;.    
1040: 63 6f 6e 73 74 20 45 56 50 5f 43 49 50 48 45 52  const EVP_CIPHER
1050: 20 2a 63 69 70 68 65 72 20 3d 20 4e 55 4c 4c 3b   *cipher = NULL;
1060: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  .    const unsig
1070: 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 20 3d 20  ned char *key = 
1080: 4e 55 4c 4c 3b 0a 0a 20 20 20 20 64 70 72 69 6e  NULL;..    dprin
1090: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
10a0: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6e     /* Create con
10b0: 74 65 78 74 73 20 2a 2f 0a 20 20 20 20 73 77 69  texts */.    swi
10c0: 74 63 68 28 74 79 70 65 29 20 7b 0a 20 20 20 20  tch(type) {.    
10d0: 63 61 73 65 20 54 59 50 45 5f 4d 44 3a 0a 09 73  case TYPE_MD:..s
10e0: 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 45  tatePtr->ctx = E
10f0: 56 50 5f 4d 44 5f 43 54 58 5f 6e 65 77 28 29 3b  VP_MD_CTX_new();
1100: 0a 09 72 65 73 20 3d 20 28 73 74 61 74 65 50 74  ..res = (statePt
1110: 72 2d 3e 63 74 78 20 21 3d 20 4e 55 4c 4c 29 3b  r->ctx != NULL);
1120: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ..break;.    cas
1130: 65 20 54 59 50 45 5f 48 4d 41 43 3a 0a 09 73 74  e TYPE_HMAC:..st
1140: 61 74 65 50 74 72 2d 3e 68 63 74 78 20 3d 20 48  atePtr->hctx = H
1150: 4d 41 43 5f 43 54 58 5f 6e 65 77 28 29 3b 0a 09  MAC_CTX_new();..
1160: 72 65 73 20 3d 20 28 73 74 61 74 65 50 74 72 2d  res = (statePtr-
1170: 3e 68 63 74 78 20 21 3d 20 4e 55 4c 4c 29 3b 0a  >hctx != NULL);.
1180: 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65  .break;.    case
1190: 20 54 59 50 45 5f 43 4d 41 43 3a 0a 09 73 74 61   TYPE_CMAC:..sta
11a0: 74 65 50 74 72 2d 3e 63 63 74 78 20 3d 20 43 4d  tePtr->cctx = CM
11b0: 41 43 5f 43 54 58 5f 6e 65 77 28 29 3b 0a 09 72  AC_CTX_new();..r
11c0: 65 73 20 3d 20 28 73 74 61 74 65 50 74 72 2d 3e  es = (statePtr->
11d0: 63 63 74 78 20 21 3d 20 4e 55 4c 4c 29 3b 0a 09  cctx != NULL);..
11e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
11f0: 20 20 69 66 20 28 21 72 65 73 29 20 7b 0a 09 54    if (!res) {..T
1200: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1210: 69 6e 74 65 72 70 2c 20 22 43 72 65 61 74 65 20  interp, "Create 
1220: 63 6f 6e 74 65 78 74 20 66 61 69 6c 65 64 22 2c  context failed",
1230: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
1240: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
1250: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 4d 41 43  ..    /* Get MAC
1260: 20 2a 2f 0a 20 20 20 20 69 66 20 28 6d 61 63 4f   */.    if (macO
1270: 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6d  bj != NULL) {..m
1280: 61 63 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74  acName = Tcl_Get
1290: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6d 61  StringFromObj(ma
12a0: 63 4f 62 6a 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66  cObj, NULL);..if
12b0: 20 28 73 74 72 63 6d 70 28 6d 61 63 4e 61 6d 65   (strcmp(macName
12c0: 2c 20 22 63 6d 61 63 22 29 20 3d 3d 20 30 29 20  , "cmac") == 0) 
12d0: 7b 0a 09 20 20 20 20 74 79 70 65 20 3d 20 54 59  {..    type = TY
12e0: 50 45 5f 43 4d 41 43 3b 0a 09 7d 20 65 6c 73 65  PE_CMAC;..} else
12f0: 20 69 66 20 28 73 74 72 63 6d 70 28 6d 61 63 4e   if (strcmp(macN
1300: 61 6d 65 2c 20 22 68 6d 61 63 22 29 20 3d 3d 20  ame, "hmac") == 
1310: 30 29 20 7b 0a 09 20 20 20 20 74 79 70 65 20 3d  0) {..    type =
1320: 20 54 59 50 45 5f 48 4d 41 43 3b 0a 09 7d 20 65   TYPE_HMAC;..} e
1330: 6c 73 65 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41  lse {..    Tcl_A
1340: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1350: 72 70 2c 20 22 49 6e 76 61 6c 69 64 20 4d 41 43  rp, "Invalid MAC
1360: 20 5c 22 22 2c 20 6d 61 63 4e 61 6d 65 2c 20 22   \"", macName, "
1370: 5c 22 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  \"", NULL);..   
1380: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1390: 52 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65  R;..}.    } else
13a0: 20 69 66 20 28 74 79 70 65 20 3d 3d 20 54 59 50   if (type == TYP
13b0: 45 5f 4d 41 43 29 20 7b 0a 09 54 63 6c 5f 41 70  E_MAC) {..Tcl_Ap
13c0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
13d0: 70 2c 20 22 4e 6f 20 4d 41 43 20 73 70 65 63 69  p, "No MAC speci
13e0: 66 69 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72  fied", NULL);..r
13f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1400: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
1410: 65 74 20 64 69 67 65 73 74 20 2a 2f 0a 20 20 20  et digest */.   
1420: 20 69 66 20 28 64 69 67 65 73 74 4f 62 6a 20 21   if (digestObj !
1430: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 64 69 67 65 73  = NULL) {..diges
1440: 74 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53  tName = Tcl_GetS
1450: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 64 69 67  tringFromObj(dig
1460: 65 73 74 4f 62 6a 2c 20 4e 55 4c 4c 29 3b 0a 09  estObj, NULL);..
1470: 6d 64 20 3d 20 45 56 50 5f 67 65 74 5f 64 69 67  md = EVP_get_dig
1480: 65 73 74 62 79 6e 61 6d 65 28 64 69 67 65 73 74  estbyname(digest
1490: 4e 61 6d 65 29 3b 0a 09 69 66 20 28 6d 64 20 3d  Name);..if (md =
14a0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54  = NULL) {..    T
14b0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
14c0: 69 6e 74 65 72 70 2c 20 22 49 6e 76 61 6c 69 64  interp, "Invalid
14d0: 20 64 69 67 65 73 74 20 5c 22 22 2c 20 64 69 67   digest \"", dig
14e0: 65 73 74 4e 61 6d 65 2c 20 22 5c 22 22 2c 20 4e  estName, "\"", N
14f0: 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72  ULL);..    retur
1500: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 20  n TCL_ERROR;..} 
1510: 65 6c 73 65 20 69 66 20 28 6d 64 20 3d 3d 20 45  else if (md == E
1520: 56 50 5f 73 68 61 6b 65 31 32 38 28 29 20 7c 7c  VP_shake128() ||
1530: 20 6d 64 20 3d 3d 20 45 56 50 5f 73 68 61 6b 65   md == EVP_shake
1540: 32 35 36 28 29 29 20 7b 0a 09 20 20 20 20 73 74  256()) {..    st
1550: 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 7c  atePtr->format |
1560: 3d 20 49 53 5f 58 4f 46 3b 0a 09 7d 0a 20 20 20  = IS_XOF;..}.   
1570: 20 7d 20 65 6c 73 65 20 69 66 20 28 74 79 70 65   } else if (type
1580: 20 21 3d 20 54 59 50 45 5f 43 4d 41 43 29 20 7b   != TYPE_CMAC) {
1590: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
15a0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20 64  lt(interp, "No d
15b0: 69 67 65 73 74 20 73 70 65 63 69 66 69 65 64 22  igest specified"
15c0: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  , NULL);..return
15d0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
15e0: 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 69  }..    /* Get ci
15f0: 70 68 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 28  pher */.    if (
1600: 63 69 70 68 65 72 4f 62 6a 20 21 3d 20 4e 55 4c  cipherObj != NUL
1610: 4c 29 20 7b 0a 09 63 69 70 68 65 72 4e 61 6d 65  L) {..cipherName
1620: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
1630: 46 72 6f 6d 4f 62 6a 28 63 69 70 68 65 72 4f 62  FromObj(cipherOb
1640: 6a 2c 20 4e 55 4c 4c 29 3b 0a 09 63 69 70 68 65  j, NULL);..ciphe
1650: 72 20 3d 20 45 56 50 5f 67 65 74 5f 63 69 70 68  r = EVP_get_ciph
1660: 65 72 62 79 6e 61 6d 65 28 63 69 70 68 65 72 4e  erbyname(cipherN
1670: 61 6d 65 29 3b 0a 09 69 66 20 28 63 69 70 68 65  ame);..if (ciphe
1680: 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  r == NULL) {..  
1690: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
16a0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 49 6e 76 61  lt(interp, "Inva
16b0: 6c 69 64 20 63 69 70 68 65 72 20 5c 22 22 2c 20  lid cipher \"", 
16c0: 63 69 70 68 65 72 4e 61 6d 65 2c 20 22 5c 22 22  cipherName, "\""
16d0: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65  , NULL);..    re
16e0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
16f0: 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  .}.    } else if
1700: 20 28 74 79 70 65 20 3d 3d 20 54 59 50 45 5f 43   (type == TYPE_C
1710: 4d 41 43 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  MAC) {..Tcl_Appe
1720: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1730: 20 22 4e 6f 20 63 69 70 68 65 72 20 73 70 65 63   "No cipher spec
1740: 69 66 69 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09  ified", NULL);..
1750: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1760: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1770: 47 65 74 20 6b 65 79 20 2a 2f 0a 20 20 20 20 69  Get key */.    i
1780: 66 20 28 6b 65 79 4f 62 6a 20 21 3d 20 4e 55 4c  f (keyObj != NUL
1790: 4c 29 20 7b 0a 09 6b 65 79 20 3d 20 54 63 6c 5f  L) {..key = Tcl_
17a0: 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
17b0: 4f 62 6a 28 6b 65 79 4f 62 6a 2c 20 26 6b 65 79  Obj(keyObj, &key
17c0: 5f 6c 65 6e 29 3b 0a 20 20 20 20 7d 20 65 6c 73  _len);.    } els
17d0: 65 20 69 66 20 28 74 79 70 65 20 21 3d 20 54 59  e if (type != TY
17e0: 50 45 5f 4d 44 29 20 7b 0a 09 54 63 6c 5f 41 70  PE_MD) {..Tcl_Ap
17f0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1800: 70 2c 20 22 4e 6f 20 6b 65 79 20 73 70 65 63 69  p, "No key speci
1810: 66 69 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72  fied", NULL);..r
1820: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1830: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1840: 6e 69 74 69 61 6c 69 7a 65 20 63 72 79 70 74 6f  nitialize crypto
1850: 67 72 61 70 68 79 20 66 75 6e 63 74 69 6f 6e 20  graphy function 
1860: 2a 2f 0a 20 20 20 20 73 77 69 74 63 68 28 74 79  */.    switch(ty
1870: 70 65 29 20 7b 0a 20 20 20 20 63 61 73 65 20 54  pe) {.    case T
1880: 59 50 45 5f 4d 44 3a 0a 09 72 65 73 20 3d 20 45  YPE_MD:..res = E
1890: 56 50 5f 44 69 67 65 73 74 49 6e 69 74 5f 65 78  VP_DigestInit_ex
18a0: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
18b0: 6d 64 2c 20 4e 55 4c 4c 29 3b 0a 09 62 72 65 61  md, NULL);..brea
18c0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 59 50 45  k;.    case TYPE
18d0: 5f 48 4d 41 43 3a 0a 09 72 65 73 20 3d 20 48 4d  _HMAC:..res = HM
18e0: 41 43 5f 49 6e 69 74 5f 65 78 28 73 74 61 74 65  AC_Init_ex(state
18f0: 50 74 72 2d 3e 68 63 74 78 2c 20 28 63 6f 6e 73  Ptr->hctx, (cons
1900: 74 20 76 6f 69 64 20 2a 29 20 6b 65 79 2c 20 6b  t void *) key, k
1910: 65 79 5f 6c 65 6e 2c 20 6d 64 2c 20 4e 55 4c 4c  ey_len, md, NULL
1920: 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63  );..break;.    c
1930: 61 73 65 20 54 59 50 45 5f 43 4d 41 43 3a 0a 09  ase TYPE_CMAC:..
1940: 72 65 73 20 3d 20 43 4d 41 43 5f 49 6e 69 74 28  res = CMAC_Init(
1950: 73 74 61 74 65 50 74 72 2d 3e 63 63 74 78 2c 20  statePtr->cctx, 
1960: 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 29 20 6b  (const void *) k
1970: 65 79 2c 20 6b 65 79 5f 6c 65 6e 2c 20 63 69 70  ey, key_len, cip
1980: 68 65 72 2c 20 4e 55 4c 4c 29 3b 0a 09 62 72 65  her, NULL);..bre
1990: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ak;.    }..    i
19a0: 66 20 28 21 72 65 73 29 20 7b 0a 09 54 63 6c 5f  f (!res) {..Tcl_
19b0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
19c0: 65 72 70 2c 20 22 49 6e 69 74 69 61 6c 69 7a 65  erp, "Initialize
19d0: 20 66 61 69 6c 65 64 3a 20 22 2c 20 52 45 41 53   failed: ", REAS
19e0: 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65  ON(), NULL);..re
19f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1a00: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
1a10: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20   TCL_OK;.}../*. 
1a20: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
1a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a60: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73  ----. *. * Diges
1a70: 74 55 70 64 61 74 65 20 2d 2d 0a 20 2a 0a 20 2a  tUpdate --. *. *
1a80: 09 55 70 64 61 74 65 20 61 20 68 61 73 68 20 66  .Update a hash f
1a90: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 64 61 74  unction with dat
1aa0: 61 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a  a. *. * Returns:
1ab0: 0a 20 2a 09 54 43 4c 5f 4f 4b 20 69 66 20 73 75  . *.TCL_OK if su
1ac0: 63 63 65 73 73 66 75 6c 20 6f 72 20 54 43 4c 5f  ccessful or TCL_
1ad0: 45 52 52 4f 52 20 66 6f 72 20 66 61 69 6c 75 72  ERROR for failur
1ae0: 65 20 77 69 74 68 20 72 65 73 75 6c 74 20 73 65  e with result se
1af0: 74 0a 20 2a 09 74 6f 20 65 72 72 6f 72 20 6d 65  t. *.to error me
1b00: 73 73 61 67 65 20 69 66 20 64 6f 5f 72 65 73 75  ssage if do_resu
1b10: 6c 74 20 69 73 20 74 72 75 65 2e 0a 20 2a 0a 20  lt is true.. *. 
1b20: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
1b30: 20 2a 09 41 64 64 73 20 62 75 66 20 64 61 74 61   *.Adds buf data
1b40: 20 74 6f 20 68 61 73 68 20 66 75 6e 63 74 69 6f   to hash functio
1b50: 6e 20 6f 72 20 73 65 74 73 20 72 65 73 75 6c 74  n or sets result
1b60: 20 74 6f 20 65 72 72 6f 72 20 6d 65 73 73 61 67   to error messag
1b70: 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  e. *. *---------
1b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69  ----------. */.i
1bc0: 6e 74 20 44 69 67 65 73 74 55 70 64 61 74 65 28  nt DigestUpdate(
1bd0: 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61  DigestState *sta
1be0: 74 65 50 74 72 2c 20 63 68 61 72 20 2a 62 75 66  tePtr, char *buf
1bf0: 2c 20 73 69 7a 65 5f 74 20 72 65 61 64 2c 20 69  , size_t read, i
1c00: 6e 74 20 64 6f 5f 72 65 73 75 6c 74 29 20 7b 0a  nt do_result) {.
1c10: 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b      int res = 0;
1c20: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
1c30: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 73 77  alled");..    sw
1c40: 69 74 63 68 28 73 74 61 74 65 50 74 72 2d 3e 66  itch(statePtr->f
1c50: 6f 72 6d 61 74 20 26 20 30 78 46 46 30 29 20 7b  ormat & 0xFF0) {
1c60: 0a 20 20 20 20 63 61 73 65 20 54 59 50 45 5f 4d  .    case TYPE_M
1c70: 44 3a 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d  D:.        res =
1c80: 20 45 56 50 5f 44 69 67 65 73 74 55 70 64 61 74   EVP_DigestUpdat
1c90: 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c  e(statePtr->ctx,
1ca0: 20 62 75 66 2c 20 72 65 61 64 29 3b 0a 09 62 72   buf, read);..br
1cb0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 59  eak;.    case TY
1cc0: 50 45 5f 48 4d 41 43 3a 0a 20 20 20 20 20 20 20  PE_HMAC:.       
1cd0: 20 72 65 73 20 3d 20 48 4d 41 43 5f 55 70 64 61   res = HMAC_Upda
1ce0: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 68 63 74  te(statePtr->hct
1cf0: 78 2c 20 62 75 66 2c 20 72 65 61 64 29 3b 0a 09  x, buf, read);..
1d00: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1d10: 54 59 50 45 5f 43 4d 41 43 3a 0a 20 20 20 20 20  TYPE_CMAC:.     
1d20: 20 20 20 72 65 73 20 3d 20 43 4d 41 43 5f 55 70     res = CMAC_Up
1d30: 64 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 63  date(statePtr->c
1d40: 63 74 78 2c 20 62 75 66 2c 20 72 65 61 64 29 3b  ctx, buf, read);
1d50: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a  ..break;.    }..
1d60: 20 20 20 20 69 66 20 28 21 72 65 73 20 26 26 20      if (!res && 
1d70: 64 6f 5f 72 65 73 75 6c 74 29 20 7b 0a 09 54 63  do_result) {..Tc
1d80: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 73  l_AppendResult(s
1d90: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c  tatePtr->interp,
1da0: 20 22 55 70 64 61 74 65 20 66 61 69 6c 65 64 3a   "Update failed:
1db0: 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55   ", REASON(), NU
1dc0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
1dd0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
1de0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1df0: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
1e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
1e40: 20 2a 20 44 69 67 65 73 74 46 69 6e 61 6c 69 7a   * DigestFinaliz
1e50: 65 20 2d 2d 0a 20 2a 0a 20 2a 09 46 69 6e 61 6c  e --. *. *.Final
1e60: 69 7a 65 20 61 20 68 61 73 68 20 66 75 6e 63 74  ize a hash funct
1e70: 69 6f 6e 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ion and return t
1e80: 68 65 20 6d 65 73 73 61 67 65 20 64 69 67 65 73  he message diges
1e90: 74 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a  t. *. * Returns:
1ea0: 0a 20 2a 09 54 43 4c 5f 4f 4b 20 69 66 20 73 75  . *.TCL_OK if su
1eb0: 63 63 65 73 73 66 75 6c 20 6f 72 20 54 43 4c 5f  ccessful or TCL_
1ec0: 45 52 52 4f 52 20 66 6f 72 20 66 61 69 6c 75 72  ERROR for failur
1ed0: 65 20 77 69 74 68 20 72 65 73 75 6c 74 20 73 65  e with result se
1ee0: 74 0a 20 2a 09 74 6f 20 65 72 72 6f 72 20 6d 65  t. *.to error me
1ef0: 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 20 53 69 64  ssage.. *. * Sid
1f00: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65  e effects:. *.Se
1f10: 74 73 20 72 65 73 75 6c 74 20 74 6f 20 6d 65 73  ts result to mes
1f20: 73 61 67 65 20 64 69 67 65 73 74 20 6f 72 20 61  sage digest or a
1f30: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  n error message.
1f40: 0a 20 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d  ----------------
1f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e  ---------. */.in
1f90: 74 20 44 69 67 65 73 74 46 69 6e 61 6c 69 7a 65  t DigestFinalize
1fa0: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
1fb0: 65 72 70 2c 20 44 69 67 65 73 74 53 74 61 74 65  erp, DigestState
1fc0: 20 2a 73 74 61 74 65 50 74 72 2c 20 54 63 6c 5f   *statePtr, Tcl_
1fd0: 4f 62 6a 20 2a 2a 72 65 73 75 6c 74 4f 62 6a 29  Obj **resultObj)
1fe0: 20 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20   {.    unsigned 
1ff0: 63 68 61 72 20 6d 64 5f 62 75 66 5b 45 56 50 5f  char md_buf[EVP_
2000: 4d 41 58 5f 4d 44 5f 53 49 5a 45 5d 3b 0a 20 20  MAX_MD_SIZE];.  
2010: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75    unsigned int u
2020: 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 72 65 73  len;.    int res
2030: 20 3d 20 30 2c 20 6d 64 5f 6c 65 6e 20 3d 20 30   = 0, md_len = 0
2040: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
2050: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f  Called");..    /
2060: 2a 20 46 69 6e 61 6c 69 7a 65 20 63 72 79 70 74  * Finalize crypt
2070: 6f 67 72 61 70 68 79 20 66 75 6e 63 74 69 6f 6e  ography function
2080: 20 61 6e 64 20 67 65 74 20 72 65 73 75 6c 74 20   and get result 
2090: 2a 2f 0a 20 20 20 20 73 77 69 74 63 68 28 73 74  */.    switch(st
20a0: 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26  atePtr->format &
20b0: 20 30 78 46 46 30 29 20 7b 0a 20 20 20 20 63 61   0xFF0) {.    ca
20c0: 73 65 20 54 59 50 45 5f 4d 44 3a 0a 09 69 66 20  se TYPE_MD:..if 
20d0: 28 21 28 73 74 61 74 65 50 74 72 2d 3e 66 6f 72  (!(statePtr->for
20e0: 6d 61 74 20 26 20 49 53 5f 58 4f 46 29 29 20 7b  mat & IS_XOF)) {
20f0: 0a 09 20 20 20 20 72 65 73 20 3d 20 45 56 50 5f  ..    res = EVP_
2100: 44 69 67 65 73 74 46 69 6e 61 6c 5f 65 78 28 73  DigestFinal_ex(s
2110: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 6d 64  tatePtr->ctx, md
2120: 5f 62 75 66 2c 20 26 75 6c 65 6e 29 3b 0a 09 20  _buf, &ulen);.. 
2130: 20 20 20 6d 64 5f 6c 65 6e 20 3d 20 28 69 6e 74     md_len = (int
2140: 29 20 75 6c 65 6e 3b 0a 09 7d 20 65 6c 73 65 20  ) ulen;..} else 
2150: 7b 0a 09 20 20 20 20 72 65 73 20 3d 20 45 56 50  {..    res = EVP
2160: 5f 44 69 67 65 73 74 46 69 6e 61 6c 58 4f 46 28  _DigestFinalXOF(
2170: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 6d  statePtr->ctx, m
2180: 64 5f 62 75 66 2c 20 28 73 69 7a 65 5f 74 29 20  d_buf, (size_t) 
2190: 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45 29  EVP_MAX_MD_SIZE)
21a0: 3b 0a 09 20 20 20 20 6d 64 5f 6c 65 6e 20 3d 20  ;..    md_len = 
21b0: 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45 3b  EVP_MAX_MD_SIZE;
21c0: 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  ..}..break;.    
21d0: 63 61 73 65 20 54 59 50 45 5f 48 4d 41 43 3a 0a  case TYPE_HMAC:.
21e0: 09 72 65 73 20 3d 20 48 4d 41 43 5f 46 69 6e 61  .res = HMAC_Fina
21f0: 6c 28 73 74 61 74 65 50 74 72 2d 3e 68 63 74 78  l(statePtr->hctx
2200: 2c 20 6d 64 5f 62 75 66 2c 20 26 75 6c 65 6e 29  , md_buf, &ulen)
2210: 3b 0a 09 6d 64 5f 6c 65 6e 20 3d 20 28 69 6e 74  ;..md_len = (int
2220: 29 20 75 6c 65 6e 3b 0a 09 62 72 65 61 6b 3b 0a  ) ulen;..break;.
2230: 20 20 20 20 63 61 73 65 20 54 59 50 45 5f 43 4d      case TYPE_CM
2240: 41 43 3a 0a 09 73 69 7a 65 5f 74 20 73 69 7a 65  AC:..size_t size
2250: 3b 0a 09 72 65 73 20 3d 20 43 4d 41 43 5f 46 69  ;..res = CMAC_Fi
2260: 6e 61 6c 28 73 74 61 74 65 50 74 72 2d 3e 63 63  nal(statePtr->cc
2270: 74 78 2c 20 6d 64 5f 62 75 66 2c 20 26 73 69 7a  tx, md_buf, &siz
2280: 65 29 3b 0a 09 6d 64 5f 6c 65 6e 20 3d 20 28 69  e);..md_len = (i
2290: 6e 74 29 20 73 69 7a 65 3b 0a 09 62 72 65 61 6b  nt) size;..break
22a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
22b0: 28 21 72 65 73 29 20 7b 0a 09 69 66 20 28 72 65  (!res) {..if (re
22c0: 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29  sultObj == NULL)
22d0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65   {..    Tcl_Appe
22e0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
22f0: 20 22 46 69 6e 61 6c 69 7a 65 20 66 61 69 6c 65   "Finalize faile
2300: 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20  d: ", REASON(), 
2310: 4e 55 4c 4c 29 3b 0a 09 7d 0a 09 72 65 74 75 72  NULL);..}..retur
2320: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
2330: 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 74 75 72   }..    /* Retur
2340: 6e 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74  n message digest
2350: 20 61 73 20 65 69 74 68 65 72 20 61 20 62 69 6e   as either a bin
2360: 61 72 79 20 6f 72 20 68 65 78 20 73 74 72 69 6e  ary or hex strin
2370: 67 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61  g */.    if (sta
2380: 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20  tePtr->format & 
2390: 42 49 4e 5f 46 4f 52 4d 41 54 29 20 7b 0a 09 69  BIN_FORMAT) {..i
23a0: 66 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20  f (resultObj == 
23b0: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c  NULL) {..    Tcl
23c0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
23d0: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74  terp, Tcl_NewByt
23e0: 65 41 72 72 61 79 4f 62 6a 28 6d 64 5f 62 75 66  eArrayObj(md_buf
23f0: 2c 20 6d 64 5f 6c 65 6e 29 29 3b 0a 09 7d 20 65  , md_len));..} e
2400: 6c 73 65 20 7b 0a 09 20 20 20 20 2a 72 65 73 75  lse {..    *resu
2410: 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 42  ltObj = Tcl_NewB
2420: 79 74 65 41 72 72 61 79 4f 62 6a 28 6d 64 5f 62  yteArrayObj(md_b
2430: 75 66 2c 20 6d 64 5f 6c 65 6e 29 3b 0a 09 20 20  uf, md_len);..  
2440: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
2450: 6e 74 28 2a 72 65 73 75 6c 74 4f 62 6a 29 3b 0a  nt(*resultObj);.
2460: 09 7d 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  .}..    } else {
2470: 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6e 65 77 4f 62  ..Tcl_Obj *newOb
2480: 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29  j = Tcl_NewObj()
2490: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
24a0: 20 2a 70 74 72 20 3d 20 54 63 6c 5f 53 65 74 42   *ptr = Tcl_SetB
24b0: 79 74 65 41 72 72 61 79 4c 65 6e 67 74 68 28 6e  yteArrayLength(n
24c0: 65 77 4f 62 6a 2c 20 6d 64 5f 6c 65 6e 2a 32 29  ewObj, md_len*2)
24d0: 3b 0a 0a 09 66 6f 72 20 28 69 6e 74 20 69 20 3d  ;...for (int i =
24e0: 20 30 3b 20 69 20 3c 20 6d 64 5f 6c 65 6e 3b 20   0; i < md_len; 
24f0: 69 2b 2b 29 20 7b 0a 09 20 20 20 20 2a 70 74 72  i++) {..    *ptr
2500: 2b 2b 20 3d 20 68 65 78 5b 28 6d 64 5f 62 75 66  ++ = hex[(md_buf
2510: 5b 69 5d 20 3e 3e 20 34 29 20 26 20 30 78 30 46  [i] >> 4) & 0x0F
2520: 5d 3b 0a 09 20 20 20 20 2a 70 74 72 2b 2b 20 3d  ];..    *ptr++ =
2530: 20 68 65 78 5b 6d 64 5f 62 75 66 5b 69 5d 20 26   hex[md_buf[i] &
2540: 20 30 78 30 46 5d 3b 0a 09 7d 0a 0a 09 69 66 20   0x0F];..}...if 
2550: 28 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55  (resultObj == NU
2560: 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53  LL) {..    Tcl_S
2570: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
2580: 72 70 2c 20 6e 65 77 4f 62 6a 29 3b 0a 09 7d 20  rp, newObj);..} 
2590: 65 6c 73 65 20 7b 0a 09 20 20 20 20 2a 72 65 73  else {..    *res
25a0: 75 6c 74 4f 62 6a 20 3d 20 6e 65 77 4f 62 6a 3b  ultObj = newObj;
25b0: 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ..    Tcl_IncrRe
25c0: 66 43 6f 75 6e 74 28 2a 72 65 73 75 6c 74 4f 62  fCount(*resultOb
25d0: 6a 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20  j);..}.    }.   
25e0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
25f0: 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../************
2600: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2630: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d  *******/../*. *-
2640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2680: 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 42  --. *. * DigestB
2690: 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 2d 2d 0a  lockModeProc --.
26a0: 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74   *. *.This funct
26b0: 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 62  ion is invoked b
26c0: 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f  y the generic IO
26d0: 20 6c 65 76 65 6c 0a 20 2a 09 74 6f 20 73 65 74   level. *.to set
26e0: 20 62 6c 6f 63 6b 69 6e 67 20 61 6e 64 20 6e 6f   blocking and no
26f0: 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 2e  nblocking modes.
2700: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a  . *. * Returns:.
2710: 20 2a 09 30 20 69 66 20 73 75 63 63 65 73 73 66   *.0 if successf
2720: 75 6c 20 6f 72 20 50 4f 53 49 58 20 65 72 72 6f  ul or POSIX erro
2730: 72 20 63 6f 64 65 20 69 66 20 66 61 69 6c 65 64  r code if failed
2740: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
2750: 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 74 68  ects:. *.Sets th
2760: 65 20 64 65 76 69 63 65 20 69 6e 74 6f 20 62 6c  e device into bl
2770: 6f 63 6b 69 6e 67 20 6f 72 20 6e 6f 6e 62 6c 6f  ocking or nonblo
2780: 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 2a 09 43  cking mode.. *.C
2790: 61 6e 20 63 61 6c 6c 20 54 63 6c 5f 53 65 74 43  an call Tcl_SetC
27a0: 68 61 6e 6e 65 6c 45 72 72 6f 72 2e 0a 20 2a 0a  hannelError.. *.
27b0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
27c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27f0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
2800: 20 69 6e 74 20 44 69 67 65 73 74 42 6c 6f 63 6b   int DigestBlock
2810: 4d 6f 64 65 50 72 6f 63 28 43 6c 69 65 6e 74 44  ModeProc(ClientD
2820: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
2830: 69 6e 74 20 6d 6f 64 65 29 20 7b 0a 20 20 20 20  int mode) {.    
2840: 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61  DigestState *sta
2850: 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53  tePtr = (DigestS
2860: 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61  tate *) clientDa
2870: 74 61 3b 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64  ta;..    if (mod
2880: 65 20 3d 3d 20 54 43 4c 5f 4d 4f 44 45 5f 4e 4f  e == TCL_MODE_NO
2890: 4e 42 4c 4f 43 4b 49 4e 47 29 20 7b 0a 09 73 74  NBLOCKING) {..st
28a0: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d  atePtr->flags |=
28b0: 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 3b 0a   TLS_TCL_ASYNC;.
28c0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 74      } else {..st
28d0: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d  atePtr->flags &=
28e0: 20 7e 28 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43   ~(TLS_TCL_ASYNC
28f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
2900: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d  urn 0;.}../*. *-
2910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2950: 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 43  --. *. * DigestC
2960: 6c 6f 73 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20  loseProc --. *. 
2970: 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  *.This function 
2980: 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68  is invoked by th
2990: 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c 65 76  e generic IO lev
29a0: 65 6c 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20 2a  el to perform. *
29b0: 09 63 68 61 6e 6e 65 6c 2d 74 79 70 65 20 73 70  .channel-type sp
29c0: 65 63 69 66 69 63 20 63 6c 65 61 6e 75 70 20 77  ecific cleanup w
29d0: 68 65 6e 20 74 68 65 20 63 68 61 6e 6e 65 6c 20  hen the channel 
29e0: 69 73 20 63 6c 6f 73 65 64 2e 20 41 6c 6c 0a 20  is closed. All. 
29f0: 2a 09 71 75 65 75 65 64 20 6f 75 74 70 75 74 20  *.queued output 
2a00: 69 73 20 66 6c 75 73 68 65 64 20 70 72 69 6f 72  is flushed prior
2a10: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
2a20: 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a   function.. *. *
2a30: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 30 20 69   Returns:. *.0 i
2a40: 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20  f successful or 
2a50: 50 4f 53 49 58 20 65 72 72 6f 72 20 63 6f 64 65  POSIX error code
2a60: 20 69 66 20 66 61 69 6c 65 64 2e 0a 20 2a 0a 20   if failed.. *. 
2a70: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
2a80: 20 2a 09 44 65 6c 65 74 65 73 20 73 74 6f 72 65   *.Deletes store
2a90: 64 20 73 74 61 74 65 20 64 61 74 61 2e 0a 20 2a  d state data.. *
2aa0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
2ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ae0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44  ------. */.int D
2af0: 69 67 65 73 74 43 6c 6f 73 65 50 72 6f 63 28 43  igestCloseProc(C
2b00: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
2b10: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
2b20: 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20   *interp) {.    
2b30: 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61  DigestState *sta
2b40: 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53  tePtr = (DigestS
2b50: 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61  tate *) clientDa
2b60: 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 6e 63  ta;..    /* Canc
2b70: 65 6c 20 61 63 74 69 76 65 20 74 69 6d 65 72 2c  el active timer,
2b80: 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 20 20 69   if any */.    i
2b90: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d  f (statePtr->tim
2ba0: 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72  er != (Tcl_Timer
2bb0: 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09  Token) NULL) {..
2bc0: 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48  Tcl_DeleteTimerH
2bd0: 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d  andler(statePtr-
2be0: 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50  >timer);..stateP
2bf0: 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c  tr->timer = (Tcl
2c00: 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c  _TimerToken) NUL
2c10: 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  L;.    }..    /*
2c20: 20 4f 75 74 70 75 74 20 6d 65 73 73 61 67 65 20   Output message 
2c30: 64 69 67 65 73 74 20 69 66 20 6e 6f 74 20 61 6c  digest if not al
2c40: 72 65 61 64 79 20 64 6f 6e 65 20 2a 2f 0a 20 20  ready done */.  
2c50: 20 20 69 66 20 28 21 28 73 74 61 74 65 50 74 72    if (!(statePtr
2c60: 2d 3e 66 6c 61 67 73 20 26 20 43 48 41 4e 5f 45  ->flags & CHAN_E
2c70: 4f 46 29 29 20 7b 0a 09 54 63 6c 5f 43 68 61 6e  OF)) {..Tcl_Chan
2c80: 6e 65 6c 20 70 61 72 65 6e 74 20 3d 20 54 63 6c  nel parent = Tcl
2c90: 5f 47 65 74 53 74 61 63 6b 65 64 43 68 61 6e 6e  _GetStackedChann
2ca0: 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  el(statePtr->sel
2cb0: 66 29 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72 65  f);..Tcl_Obj *re
2cc0: 73 75 6c 74 4f 62 6a 3b 0a 09 69 6e 74 20 77 72  sultObj;..int wr
2cd0: 69 74 74 65 6e 3b 0a 0a 09 69 66 20 28 44 69 67  itten;...if (Dig
2ce0: 65 73 74 46 69 6e 61 6c 69 7a 65 28 73 74 61 74  estFinalize(stat
2cf0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 73 74  ePtr->interp, st
2d00: 61 74 65 50 74 72 2c 20 26 72 65 73 75 6c 74 4f  atePtr, &resultO
2d10: 62 6a 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b  bj) == TCL_OK) {
2d20: 0a 09 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ..    unsigned c
2d30: 68 61 72 20 2a 64 61 74 61 20 3d 20 54 63 6c 5f  har *data = Tcl_
2d40: 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
2d50: 4f 62 6a 28 72 65 73 75 6c 74 4f 62 6a 2c 20 26  Obj(resultObj, &
2d60: 77 72 69 74 74 65 6e 29 3b 0a 09 20 20 20 20 54  written);..    T
2d70: 63 6c 5f 57 72 69 74 65 52 61 77 28 70 61 72 65  cl_WriteRaw(pare
2d80: 6e 74 2c 20 64 61 74 61 2c 20 77 72 69 74 74 65  nt, data, writte
2d90: 6e 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 65 63  n);..    Tcl_Dec
2da0: 72 52 65 66 43 6f 75 6e 74 28 72 65 73 75 6c 74  rRefCount(result
2db0: 4f 62 6a 29 3b 0a 09 7d 0a 09 73 74 61 74 65 50  Obj);..}..stateP
2dc0: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 48 41  tr->flags |= CHA
2dd0: 4e 5f 45 4f 46 3b 0a 20 20 20 20 7d 0a 0a 20 20  N_EOF;.    }..  
2de0: 20 20 2f 2a 20 43 6c 65 61 6e 2d 75 70 20 2a 2f    /* Clean-up */
2df0: 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65  .    DigestState
2e00: 46 72 65 65 28 73 74 61 74 65 50 74 72 29 3b 0a  Free(statePtr);.
2e10: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a      return 0;.}.
2e20: 0a 2f 2a 0a 20 2a 20 53 61 6d 65 20 61 73 20 44  ./*. * Same as D
2e30: 69 67 65 73 74 43 6c 6f 73 65 50 72 6f 63 20 62  igestCloseProc b
2e40: 75 74 20 77 69 74 68 20 69 6e 64 69 76 69 64 75  ut with individu
2e50: 61 6c 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  al read and writ
2e60: 65 20 63 6c 6f 73 65 20 63 6f 6e 74 72 6f 6c 0a  e close control.
2e70: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44   */.static int D
2e80: 69 67 65 73 74 43 6c 6f 73 65 32 50 72 6f 63 28  igestClose2Proc(
2e90: 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61  ClientData insta
2ea0: 6e 63 65 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  nceData, Tcl_Int
2eb0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
2ec0: 20 66 6c 61 67 73 29 20 7b 0a 0a 20 20 20 20 69   flags) {..    i
2ed0: 66 20 28 28 66 6c 61 67 73 20 26 20 28 54 43 4c  f ((flags & (TCL
2ee0: 5f 43 4c 4f 53 45 5f 52 45 41 44 20 7c 20 54 43  _CLOSE_READ | TC
2ef0: 4c 5f 43 4c 4f 53 45 5f 57 52 49 54 45 29 29 20  L_CLOSE_WRITE)) 
2f00: 3d 3d 20 30 29 20 7b 0a 09 72 65 74 75 72 6e 20  == 0) {..return 
2f10: 44 69 67 65 73 74 43 6c 6f 73 65 50 72 6f 63 28  DigestCloseProc(
2f20: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e  instanceData, in
2f30: 74 65 72 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  terp);.    }.   
2f40: 20 72 65 74 75 72 6e 20 45 49 4e 56 41 4c 3b 0a   return EINVAL;.
2f50: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
2f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
2fa0: 2a 0a 20 2a 20 44 69 67 65 73 74 49 6e 70 75 74  *. * DigestInput
2fb0: 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61  Proc --. *. *.Ca
2fc0: 6c 6c 65 64 20 62 79 20 74 68 65 20 67 65 6e 65  lled by the gene
2fd0: 72 69 63 20 49 4f 20 73 79 73 74 65 6d 20 74 6f  ric IO system to
2fe0: 20 72 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20   read data from 
2ff0: 74 72 61 6e 73 66 6f 72 6d 20 61 6e 64 0a 20 2a  transform and. *
3000: 09 70 6c 61 63 65 20 69 6e 20 62 75 66 2e 20 54  .place in buf. T
3010: 72 61 6e 73 66 6f 72 6d 20 67 65 74 73 20 64 61  ransform gets da
3020: 74 61 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65  ta from the unde
3030: 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 2e 0a  rlying channel..
3040: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20   *. * Returns:. 
3050: 2a 09 54 6f 74 61 6c 20 62 79 74 65 73 20 72 65  *.Total bytes re
3060: 61 64 20 6f 72 20 2d 31 20 66 6f 72 20 61 6e 20  ad or -1 for an 
3070: 65 72 72 6f 72 20 61 6c 6f 6e 67 20 77 69 74 68  error along with
3080: 20 61 20 50 4f 53 49 58 20 65 72 72 6f 72 0a 20   a POSIX error. 
3090: 2a 09 63 6f 64 65 20 69 6e 20 65 72 72 6f 72 43  *.code in errorC
30a0: 6f 64 65 50 74 72 2e 20 55 73 65 20 45 41 47 41  odePtr. Use EAGA
30b0: 49 4e 20 66 6f 72 20 6e 6f 6e 62 6c 6f 63 6b 69  IN for nonblocki
30c0: 6e 67 20 61 6e 64 20 6e 6f 20 64 61 74 61 2e 0a  ng and no data..
30d0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
30e0: 74 73 3a 0a 20 2a 09 52 65 61 64 20 64 61 74 61  ts:. *.Read data
30f0: 20 66 72 6f 6d 20 74 72 61 6e 73 66 6f 72 6d 20   from transform 
3100: 61 6e 64 20 77 72 69 74 65 20 74 6f 20 62 75 66  and write to buf
3110: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
3120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
3160: 0a 69 6e 74 20 44 69 67 65 73 74 49 6e 70 75 74  .int DigestInput
3170: 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20  Proc(ClientData 
3180: 63 6c 69 65 6e 74 44 61 74 61 2c 20 63 68 61 72  clientData, char
3190: 20 2a 62 75 66 2c 20 69 6e 74 20 74 6f 52 65 61   *buf, int toRea
31a0: 64 2c 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64  d, int *errorCod
31b0: 65 50 74 72 29 20 7b 0a 20 20 20 20 44 69 67 65  ePtr) {.    Dige
31c0: 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74  stState *statePt
31d0: 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 65  r = (DigestState
31e0: 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a   *) clientData;.
31f0: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20      Tcl_Channel 
3200: 70 61 72 65 6e 74 3b 0a 20 20 20 20 69 6e 74 20  parent;.    int 
3210: 72 65 61 64 3b 0a 20 20 20 20 2a 65 72 72 6f 72  read;.    *error
3220: 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 0a 20 20  CodePtr = 0;..  
3230: 20 20 2f 2a 20 41 62 6f 72 74 20 69 66 20 6e 6f    /* Abort if no
3240: 74 68 69 6e 67 20 74 6f 20 70 72 6f 63 65 73 73  thing to process
3250: 20 2a 2f 0a 20 20 20 20 69 66 20 28 74 6f 52 65   */.    if (toRe
3260: 61 64 20 3c 3d 20 30 20 7c 7c 20 73 74 61 74 65  ad <= 0 || state
3270: 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63  Ptr->self == (Tc
3280: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29  l_Channel) NULL)
3290: 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20   {..return 0;.  
32a0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
32b0: 62 79 74 65 73 20 66 72 6f 6d 20 75 6e 64 65 72  bytes from under
32c0: 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 20 2a 2f  lying channel */
32d0: 0a 20 20 20 20 70 61 72 65 6e 74 20 3d 20 54 63  .    parent = Tc
32e0: 6c 5f 47 65 74 53 74 61 63 6b 65 64 43 68 61 6e  l_GetStackedChan
32f0: 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 65  nel(statePtr->se
3300: 6c 66 29 3b 0a 20 20 20 20 72 65 61 64 20 3d 20  lf);.    read = 
3310: 54 63 6c 5f 52 65 61 64 52 61 77 28 70 61 72 65  Tcl_ReadRaw(pare
3320: 6e 74 2c 20 62 75 66 2c 20 74 6f 52 65 61 64 29  nt, buf, toRead)
3330: 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65  ;..    /* Update
3340: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a   hash function *
3350: 2f 0a 20 20 20 20 69 66 20 28 72 65 61 64 20 3e  /.    if (read >
3360: 20 30 29 20 7b 0a 09 2f 2a 20 48 61 76 65 20 64   0) {../* Have d
3370: 61 74 61 20 2a 2f 0a 09 69 66 20 28 44 69 67 65  ata */..if (Dige
3380: 73 74 55 70 64 61 74 65 28 73 74 61 74 65 50 74  stUpdate(statePt
3390: 72 2c 20 62 75 66 2c 20 28 73 69 7a 65 5f 74 29  r, buf, (size_t)
33a0: 20 72 65 61 64 2c 20 30 29 20 21 3d 20 54 43 4c   read, 0) != TCL
33b0: 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  _OK) {..    Tcl_
33c0: 53 65 74 43 68 61 6e 6e 65 6c 45 72 72 6f 72 28  SetChannelError(
33d0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20  statePtr->self, 
33e0: 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 22 55  Tcl_ObjPrintf("U
33f0: 70 64 61 74 65 20 66 61 69 6c 65 64 3a 20 25 73  pdate failed: %s
3400: 22 2c 20 52 45 41 53 4f 4e 28 29 29 29 3b 0a 09  ", REASON()));..
3410: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74      *errorCodePt
3420: 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 09 20 20 20  r = EINVAL;..   
3430: 20 72 65 74 75 72 6e 20 30 3b 0a 09 7d 0a 09 2f   return 0;..}../
3440: 2a 20 54 68 69 73 20 69 73 20 63 6f 72 72 65 63  * This is correc
3450: 74 20 2a 2f 0a 09 72 65 61 64 20 3d 20 2d 31 3b  t */..read = -1;
3460: 0a 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20  ..*errorCodePtr 
3470: 3d 20 45 41 47 41 49 4e 3b 0a 0a 20 20 20 20 7d  = EAGAIN;..    }
3480: 20 65 6c 73 65 20 69 66 20 28 72 65 61 64 20 3c   else if (read <
3490: 20 30 29 20 7b 0a 09 2f 2a 20 45 72 72 6f 72 20   0) {../* Error 
34a0: 2a 2f 0a 09 2a 65 72 72 6f 72 43 6f 64 65 50 74  */..*errorCodePt
34b0: 72 20 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f  r = Tcl_GetErrno
34c0: 28 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20  ();..    } else 
34d0: 69 66 20 28 21 28 73 74 61 74 65 50 74 72 2d 3e  if (!(statePtr->
34e0: 66 6c 61 67 73 20 26 20 43 48 41 4e 5f 45 4f 46  flags & CHAN_EOF
34f0: 29 29 20 7b 0a 09 2f 2a 20 45 4f 46 20 2a 2f 0a  )) {../* EOF */.
3500: 09 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74  .Tcl_Obj *result
3510: 4f 62 6a 3b 0a 09 69 66 20 28 44 69 67 65 73 74  Obj;..if (Digest
3520: 46 69 6e 61 6c 69 7a 65 28 73 74 61 74 65 50 74  Finalize(statePt
3530: 72 2d 3e 69 6e 74 65 72 70 2c 20 73 74 61 74 65  r->interp, state
3540: 50 74 72 2c 20 26 72 65 73 75 6c 74 4f 62 6a 29  Ptr, &resultObj)
3550: 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20   == TCL_OK) {.. 
3560: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
3570: 20 2a 64 61 74 61 20 3d 20 54 63 6c 5f 47 65 74   *data = Tcl_Get
3580: 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
3590: 28 72 65 73 75 6c 74 4f 62 6a 2c 20 26 72 65 61  (resultObj, &rea
35a0: 64 29 3b 0a 09 20 20 20 20 6d 65 6d 63 70 79 28  d);..    memcpy(
35b0: 62 75 66 2c 20 64 61 74 61 2c 20 72 65 61 64 29  buf, data, read)
35c0: 3b 0a 09 20 20 20 20 54 63 6c 5f 44 65 63 72 52  ;..    Tcl_DecrR
35d0: 65 66 43 6f 75 6e 74 28 72 65 73 75 6c 74 4f 62  efCount(resultOb
35e0: 6a 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  j);...} else {..
35f0: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e      Tcl_SetChann
3600: 65 6c 45 72 72 6f 72 28 73 74 61 74 65 50 74 72  elError(statePtr
3610: 2d 3e 73 65 6c 66 2c 20 54 63 6c 5f 4f 62 6a 50  ->self, Tcl_ObjP
3620: 72 69 6e 74 66 28 22 46 69 6e 61 6c 69 7a 65 20  rintf("Finalize 
3630: 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 52 45 41  failed: %s", REA
3640: 53 4f 4e 28 29 29 29 3b 0a 09 20 20 20 20 2a 65  SON()));..    *e
3650: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49  rrorCodePtr = EI
3660: 4e 56 41 4c 3b 0a 09 20 20 20 20 72 65 61 64 20  NVAL;..    read 
3670: 3d 20 30 3b 0a 09 7d 0a 09 73 74 61 74 65 50 74  = 0;..}..statePt
3680: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 48 41 4e  r->flags |= CHAN
3690: 5f 45 4f 46 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _EOF;.    }.    
36a0: 72 65 74 75 72 6e 20 72 65 61 64 3b 0a 7d 0a 0a  return read;.}..
36b0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
36c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
3700: 2a 20 44 69 67 65 73 74 4f 75 74 70 75 74 50 72  * DigestOutputPr
3710: 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c  oc --. *. *.Call
3720: 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 69  ed by the generi
3730: 63 20 49 4f 20 73 79 73 74 65 6d 20 74 6f 20 77  c IO system to w
3740: 72 69 74 65 20 64 61 74 61 20 69 6e 20 62 75 66  rite data in buf
3750: 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 2e 0a 20   to transform.. 
3760: 2a 09 54 68 65 20 74 72 61 6e 73 66 6f 72 6d 20  *.The transform 
3770: 77 72 69 74 65 73 20 74 68 65 20 72 65 73 75 6c  writes the resul
3780: 74 20 74 6f 20 74 68 65 20 75 6e 64 65 72 6c 79  t to the underly
3790: 69 6e 67 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a  ing channel.. *.
37a0: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54   * Returns:. *.T
37b0: 6f 74 61 6c 20 62 79 74 65 73 20 77 72 69 74 74  otal bytes writt
37c0: 65 6e 20 6f 72 20 2d 31 20 66 6f 72 20 61 6e 20  en or -1 for an 
37d0: 65 72 72 6f 72 20 61 6c 6f 6e 67 20 77 69 74 68  error along with
37e0: 20 61 20 50 4f 53 49 58 20 65 72 72 6f 72 0a 20   a POSIX error. 
37f0: 2a 09 63 6f 64 65 20 69 6e 20 65 72 72 6f 72 43  *.code in errorC
3800: 6f 64 65 50 74 72 2e 20 55 73 65 20 45 41 47 41  odePtr. Use EAGA
3810: 49 4e 20 66 6f 72 20 6e 6f 6e 62 6c 6f 63 6b 69  IN for nonblocki
3820: 6e 67 20 61 6e 64 20 63 61 6e 27 74 20 77 72 69  ng and can't wri
3830: 74 65 20 64 61 74 61 2e 0a 20 2a 0a 20 2a 20 53  te data.. *. * S
3840: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
3850: 47 65 74 20 64 61 74 61 20 66 72 6f 6d 20 62 75  Get data from bu
3860: 66 20 61 6e 64 20 75 70 64 61 74 65 20 64 69 67  f and update dig
3870: 65 73 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  est. *. *-------
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 2d 2d 2d 2d 0a  ---------------.
38c0: 20 2a 2f 0a 20 69 6e 74 20 44 69 67 65 73 74 4f   */. int DigestO
38d0: 75 74 70 75 74 50 72 6f 63 28 43 6c 69 65 6e 74  utputProc(Client
38e0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
38f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 62 75 66   const char *buf
3900: 2c 20 69 6e 74 20 74 6f 57 72 69 74 65 2c 20 69  , int toWrite, i
3910: 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72  nt *errorCodePtr
3920: 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74  ) {.    DigestSt
3930: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
3940: 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 29 20  (DigestState *) 
3950: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20  clientData;.    
3960: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
3970: 30 3b 0a 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74  0;..    /* Abort
3980: 20 69 66 20 6e 6f 74 68 69 6e 67 20 74 6f 20 70   if nothing to p
3990: 72 6f 63 65 73 73 20 2a 2f 0a 20 20 20 20 69 66  rocess */.    if
39a0: 20 28 74 6f 57 72 69 74 65 20 3c 3d 20 30 20 7c   (toWrite <= 0 |
39b0: 7c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  | statePtr->self
39c0: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c   == (Tcl_Channel
39d0: 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  ) NULL) {..retur
39e0: 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  n 0;.    }..    
39f0: 2f 2a 20 55 70 64 61 74 65 20 68 61 73 68 20 66  /* Update hash f
3a00: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69  unction */.    i
3a10: 66 20 28 44 69 67 65 73 74 55 70 64 61 74 65 28  f (DigestUpdate(
3a20: 73 74 61 74 65 50 74 72 2c 20 62 75 66 2c 20 28  statePtr, buf, (
3a30: 73 69 7a 65 5f 74 29 20 74 6f 57 72 69 74 65 2c  size_t) toWrite,
3a40: 20 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b   0) != TCL_OK) {
3a50: 0a 09 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c  ..Tcl_SetChannel
3a60: 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2d 3e  Error(statePtr->
3a70: 73 65 6c 66 2c 20 54 63 6c 5f 4f 62 6a 50 72 69  self, Tcl_ObjPri
3a80: 6e 74 66 28 22 55 70 64 61 74 65 20 66 61 69 6c  ntf("Update fail
3a90: 65 64 3a 20 25 73 22 2c 20 52 45 41 53 4f 4e 28  ed: %s", REASON(
3aa0: 29 29 29 3b 0a 09 2a 65 72 72 6f 72 43 6f 64 65  )));..*errorCode
3ab0: 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 09 72  Ptr = EINVAL;..r
3ac0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
3ad0: 20 20 20 72 65 74 75 72 6e 20 74 6f 57 72 69 74     return toWrit
3ae0: 65 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  e;.}../*. *-----
3af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b30: 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 53 65  -. *. * DigestSe
3b40: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20  tOptionProc --. 
3b50: 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79 20 74  *. *.Called by t
3b60: 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 73 79  he generic IO sy
3b70: 73 74 65 6d 20 74 6f 20 73 65 74 20 63 68 61 6e  stem to set chan
3b80: 6e 65 6c 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 20  nel option name 
3b90: 74 6f 20 76 61 6c 75 65 2e 0a 20 2a 0a 20 2a 20  to value.. *. * 
3ba0: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f  Returns:. *.TCL_
3bb0: 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
3bc0: 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 20 69 66   or TCL_ERROR if
3bd0: 20 66 61 69 6c 65 64 20 61 6c 6f 6e 67 20 77 69   failed along wi
3be0: 74 68 20 61 6e 20 65 72 72 6f 72 0a 20 2a 09 6d  th an error. *.m
3bf0: 65 73 73 61 67 65 20 69 6e 20 69 6e 74 65 72 70  essage in interp
3c00: 20 61 6e 64 20 54 63 6c 5f 53 65 74 45 72 72 6e   and Tcl_SetErrn
3c10: 6f 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  o.. *. * Side ef
3c20: 66 65 63 74 73 3a 0a 20 2a 09 55 70 64 61 74 65  fects:. *.Update
3c30: 73 20 63 68 61 6e 6e 65 6c 20 6f 70 74 69 6f 6e  s channel option
3c40: 20 74 6f 20 6e 65 77 20 76 61 6c 75 65 2e 0a 20   to new value.. 
3c50: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
3c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
3ca0: 74 61 74 69 63 20 69 6e 74 20 44 69 67 65 73 74  tatic int Digest
3cb0: 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 43 6c  SetOptionProc(Cl
3cc0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
3cd0: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
3ce0: 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74 20 63  *interp, const c
3cf0: 68 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c  har *optionName,
3d00: 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70  ..const char *op
3d10: 74 69 6f 6e 56 61 6c 75 65 29 20 7b 0a 20 20 20  tionValue) {.   
3d20: 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74   DigestState *st
3d30: 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 74  atePtr = (Digest
3d40: 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44  State *) clientD
3d50: 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61  ata;.    Tcl_Cha
3d60: 6e 6e 65 6c 20 70 61 72 65 6e 74 3b 0a 20 20 20  nnel parent;.   
3d70: 20 54 63 6c 5f 44 72 69 76 65 72 53 65 74 4f 70   Tcl_DriverSetOp
3d80: 74 69 6f 6e 50 72 6f 63 20 2a 73 65 74 4f 70 74  tionProc *setOpt
3d90: 69 6f 6e 50 72 6f 63 3b 0a 0a 20 20 20 20 2f 2a  ionProc;..    /*
3da0: 20 41 62 6f 72 74 20 69 66 20 6e 6f 20 63 68 61   Abort if no cha
3db0: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28  nnel */.    if (
3dc0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d  statePtr->self =
3dd0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
3de0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
3df0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
3e00: 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 67 61 74  ..    /* Delegat
3e10: 65 20 6f 70 74 69 6f 6e 73 20 64 6f 77 6e 73 74  e options downst
3e20: 72 65 61 6d 20 2a 2f 0a 20 20 20 20 70 61 72 65  ream */.    pare
3e30: 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 63  nt = Tcl_GetStac
3e40: 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 65  kedChannel(state
3e50: 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 20  Ptr->self);.    
3e60: 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 3d 20  setOptionProc = 
3e70: 54 63 6c 5f 43 68 61 6e 6e 65 6c 53 65 74 4f 70  Tcl_ChannelSetOp
3e80: 74 69 6f 6e 50 72 6f 63 28 54 63 6c 5f 47 65 74  tionProc(Tcl_Get
3e90: 43 68 61 6e 6e 65 6c 54 79 70 65 28 70 61 72 65  ChannelType(pare
3ea0: 6e 74 29 29 3b 0a 20 20 20 20 69 66 20 28 73 65  nt));.    if (se
3eb0: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 21 3d 20 4e  tOptionProc != N
3ec0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 28  ULL) {..return (
3ed0: 2a 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 29 28  *setOptionProc)(
3ee0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e  Tcl_GetChannelIn
3ef0: 73 74 61 6e 63 65 44 61 74 61 28 70 61 72 65 6e  stanceData(paren
3f00: 74 29 2c 20 69 6e 74 65 72 70 2c 20 6f 70 74 69  t), interp, opti
3f10: 6f 6e 4e 61 6d 65 2c 20 6f 70 74 69 6f 6e 56 61  onName, optionVa
3f20: 6c 75 65 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  lue);.    } else
3f30: 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f   {..Tcl_SetErrno
3f40: 28 45 49 4e 56 41 4c 29 3b 0a 09 72 65 74 75 72  (EINVAL);..retur
3f50: 6e 20 54 63 6c 5f 42 61 64 43 68 61 6e 6e 65 6c  n Tcl_BadChannel
3f60: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f  Option(interp, o
3f70: 70 74 69 6f 6e 4e 61 6d 65 2c 20 4e 55 4c 4c 29  ptionName, NULL)
3f80: 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a  ;.    }.}../*. *
3f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fd0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67  ------. *. * Dig
3fe0: 65 73 74 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63  estGetOptionProc
3ff0: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64   --. *. *.Called
4000: 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20   by the generic 
4010: 49 4f 20 73 79 73 74 65 6d 20 74 6f 20 67 65 74  IO system to get
4020: 20 63 68 61 6e 6e 65 6c 20 6f 70 74 69 6f 6e 20   channel option 
4030: 6e 61 6d 65 27 73 20 76 61 6c 75 65 2e 0a 20 2a  name's value.. *
4040: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09  . * Returns:. *.
4050: 54 43 4c 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  TCL_OK if succes
4060: 73 66 75 6c 20 6f 72 20 54 43 4c 5f 45 52 52 4f  sful or TCL_ERRO
4070: 52 20 69 66 20 66 61 69 6c 65 64 20 61 6c 6f 6e  R if failed alon
4080: 67 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 0a  g with an error.
4090: 20 2a 09 6d 65 73 73 61 67 65 20 69 6e 20 69 6e   *.message in in
40a0: 74 65 72 70 20 61 6e 64 20 54 63 6c 5f 53 65 74  terp and Tcl_Set
40b0: 45 72 72 6e 6f 2e 0a 20 2a 0a 20 2a 20 53 69 64  Errno.. *. * Sid
40c0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65  e effects:. *.Se
40d0: 74 73 20 72 65 73 75 6c 74 20 74 6f 20 6f 70 74  ts result to opt
40e0: 69 6f 6e 27 73 20 76 61 6c 75 65 0a 20 2a 0a 20  ion's value. *. 
40f0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
4100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4130: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
4140: 69 63 20 69 6e 74 20 44 69 67 65 73 74 47 65 74  ic int DigestGet
4150: 4f 70 74 69 6f 6e 50 72 6f 63 28 43 6c 69 65 6e  OptionProc(Clien
4160: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
4170: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
4180: 74 65 72 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  terp, const char
4190: 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c 0a 09 54   *optionName,..T
41a0: 63 6c 5f 44 53 74 72 69 6e 67 20 2a 6f 70 74 69  cl_DString *opti
41b0: 6f 6e 56 61 6c 75 65 29 20 7b 0a 20 20 20 20 44  onValue) {.    D
41c0: 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74  igestState *stat
41d0: 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74  ePtr = (DigestSt
41e0: 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74  ate *) clientDat
41f0: 61 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e  a;.    Tcl_Chann
4200: 65 6c 20 70 61 72 65 6e 74 3b 0a 20 20 20 20 54  el parent;.    T
4210: 63 6c 5f 44 72 69 76 65 72 47 65 74 4f 70 74 69  cl_DriverGetOpti
4220: 6f 6e 50 72 6f 63 20 2a 67 65 74 4f 70 74 69 6f  onProc *getOptio
4230: 6e 50 72 6f 63 3b 0a 0a 20 20 20 20 2f 2a 20 41  nProc;..    /* A
4240: 62 6f 72 74 20 69 66 20 6e 6f 20 63 68 61 6e 6e  bort if no chann
4250: 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74  el */.    if (st
4260: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20  atePtr->self == 
4270: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
4280: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  LL) {..return TC
4290: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
42a0: 20 20 20 20 2f 2a 20 44 65 6c 65 67 61 74 65 20      /* Delegate 
42b0: 6f 70 74 69 6f 6e 73 20 64 6f 77 6e 73 74 72 65  options downstre
42c0: 61 6d 20 2a 2f 0a 20 20 20 20 70 61 72 65 6e 74  am */.    parent
42d0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 63 6b 65   = Tcl_GetStacke
42e0: 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74  dChannel(statePt
42f0: 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 20 67 65  r->self);.    ge
4300: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 3d 20 54 63  tOptionProc = Tc
4310: 6c 5f 43 68 61 6e 6e 65 6c 47 65 74 4f 70 74 69  l_ChannelGetOpti
4320: 6f 6e 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 68  onProc(Tcl_GetCh
4330: 61 6e 6e 65 6c 54 79 70 65 28 70 61 72 65 6e 74  annelType(parent
4340: 29 29 3b 0a 20 20 20 20 69 66 20 28 67 65 74 4f  ));.    if (getO
4350: 70 74 69 6f 6e 50 72 6f 63 20 21 3d 20 4e 55 4c  ptionProc != NUL
4360: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 28 2a 67  L) {..return (*g
4370: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 29 28 54 63  etOptionProc)(Tc
4380: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74  l_GetChannelInst
4390: 61 6e 63 65 44 61 74 61 28 70 61 72 65 6e 74 29  anceData(parent)
43a0: 2c 20 69 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e  , interp, option
43b0: 4e 61 6d 65 2c 20 6f 70 74 69 6f 6e 56 61 6c 75  Name, optionValu
43c0: 65 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  e);.    } else i
43d0: 66 20 28 6f 70 74 69 6f 6e 4e 61 6d 65 20 3d 3d  f (optionName ==
43e0: 20 28 63 68 61 72 2a 29 20 4e 55 4c 4c 29 20 7b   (char*) NULL) {
43f0: 0a 09 2f 2a 20 52 65 71 75 65 73 74 20 69 73 20  ../* Request is 
4400: 71 75 65 72 79 20 66 6f 72 20 61 6c 6c 20 6f 70  query for all op
4410: 74 69 6f 6e 73 2c 20 74 68 69 73 20 69 73 20 6f  tions, this is o
4420: 6b 2e 20 2a 2f 0a 09 72 65 74 75 72 6e 20 54 43  k. */..return TC
4430: 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  L_OK;.    } else
4440: 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f   {..Tcl_SetErrno
4450: 28 45 49 4e 56 41 4c 29 3b 0a 09 72 65 74 75 72  (EINVAL);..retur
4460: 6e 20 54 63 6c 5f 42 61 64 43 68 61 6e 6e 65 6c  n Tcl_BadChannel
4470: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f  Option(interp, o
4480: 70 74 69 6f 6e 4e 61 6d 65 2c 20 4e 55 4c 4c 29  ptionName, NULL)
4490: 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a  ;.    }.}../*. *
44a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
44b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
44c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
44d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
44e0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67  ------. *. * Dig
44f0: 65 73 74 54 69 6d 65 72 48 61 6e 64 6c 65 72 20  estTimerHandler 
4500: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20  --. *. *.Called 
4510: 62 79 20 74 68 65 20 6e 6f 74 69 66 69 65 72 20  by the notifier 
4520: 76 69 61 20 74 69 6d 65 72 20 74 6f 20 66 6c 75  via timer to flu
4530: 73 68 20 6f 75 74 20 70 65 6e 64 69 6e 67 20 69  sh out pending i
4540: 6e 70 75 74 20 64 61 74 61 2e 0a 20 2a 0a 20 2a  nput data.. *. *
4550: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 4e 6f 74   Returns:. *.Not
4560: 68 69 6e 67 0a 20 2a 0a 20 2a 20 53 69 64 65 20  hing. *. * Side 
4570: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20  effects:. *.May 
4580: 63 61 6c 6c 20 54 63 6c 5f 4e 6f 74 69 66 79 43  call Tcl_NotifyC
4590: 68 61 6e 6e 65 6c 0a 20 2a 0a 20 2a 2d 2d 2d 2d  hannel. *. *----
45a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
45b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
45c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
45d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
45e0: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  --. */.static vo
45f0: 69 64 20 44 69 67 65 73 74 54 69 6d 65 72 48 61  id DigestTimerHa
4600: 6e 64 6c 65 72 28 43 6c 69 65 6e 74 44 61 74 61  ndler(ClientData
4610: 20 63 6c 69 65 6e 74 44 61 74 61 29 20 7b 0a 20   clientData) {. 
4620: 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a     DigestState *
4630: 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65  statePtr = (Dige
4640: 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e  stState *) clien
4650: 74 44 61 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 41  tData;..    /* A
4660: 62 6f 72 74 20 69 66 20 6e 6f 20 63 68 61 6e 6e  bort if no chann
4670: 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74  el */.    if (st
4680: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20  atePtr->self == 
4690: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
46a0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 3b 0a 20  LL) {..return;. 
46b0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 65     }..    /* Cle
46c0: 61 72 20 74 69 6d 65 72 20 74 6f 6b 65 6e 20 2a  ar timer token *
46d0: 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  /.    statePtr->
46e0: 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d  timer = (Tcl_Tim
46f0: 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 0a  erToken) NULL;..
4700: 20 20 20 20 2f 2a 20 46 69 72 65 20 65 76 65 6e      /* Fire even
4710: 74 20 69 66 20 74 68 65 72 65 20 69 73 20 70 65  t if there is pe
4720: 6e 64 69 6e 67 20 64 61 74 61 2c 20 73 6b 69 70  nding data, skip
4730: 20 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20   otherwise */.  
4740: 20 20 69 66 20 28 28 73 74 61 74 65 50 74 72 2d    if ((statePtr-
4750: 3e 77 61 74 63 68 4d 61 73 6b 20 26 20 54 43 4c  >watchMask & TCL
4760: 5f 52 45 41 44 41 42 4c 45 29 20 26 26 20 28 54  _READABLE) && (T
4770: 63 6c 5f 49 6e 70 75 74 42 75 66 66 65 72 65 64  cl_InputBuffered
4780: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
4790: 20 3e 20 30 29 29 20 7b 0a 09 54 63 6c 5f 4e 6f   > 0)) {..Tcl_No
47a0: 74 69 66 79 43 68 61 6e 6e 65 6c 28 73 74 61 74  tifyChannel(stat
47b0: 65 50 74 72 2d 3e 73 65 6c 66 2c 20 54 43 4c 5f  ePtr->self, TCL_
47c0: 52 45 41 44 41 42 4c 45 29 3b 0a 20 20 20 20 7d  READABLE);.    }
47d0: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
47e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
4820: 20 2a 0a 20 2a 20 44 69 67 65 73 74 57 61 74 63   *. * DigestWatc
4830: 68 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 49  hProc --. *. *.I
4840: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 6f  nitialize the no
4850: 74 69 66 69 65 72 20 74 6f 20 77 61 74 63 68 20  tifier to watch 
4860: 66 6f 72 20 65 76 65 6e 74 73 20 66 72 6f 6d 20  for events from 
4870: 74 68 69 73 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a  this channel.. *
4880: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09  . * Returns:. *.
4890: 4e 6f 74 68 69 6e 67 20 28 63 61 6e 27 74 20 72  Nothing (can't r
48a0: 65 74 75 72 6e 20 65 72 72 6f 72 20 6d 65 73 73  eturn error mess
48b0: 61 67 65 73 29 0a 20 2a 0a 20 2a 20 53 69 64 65  ages). *. * Side
48c0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 6f 6e   effects:. *.Con
48d0: 66 69 67 75 72 65 20 6e 6f 74 69 66 69 65 72 20  figure notifier 
48e0: 73 6f 20 66 75 74 75 72 65 20 65 76 65 6e 74 73  so future events
48f0: 20 6f 6e 20 74 68 65 20 63 68 61 6e 6e 65 6c 20   on the channel 
4900: 77 69 6c 6c 20 62 65 20 73 65 65 6e 20 62 79 20  will be seen by 
4910: 54 63 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  Tcl.. *. *------
4920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4960: 0a 20 2a 2f 0a 76 6f 69 64 20 44 69 67 65 73 74  . */.void Digest
4970: 57 61 74 63 68 50 72 6f 63 28 43 6c 69 65 6e 74  WatchProc(Client
4980: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
4990: 20 69 6e 74 20 6d 61 73 6b 29 20 7b 0a 20 20 20   int mask) {.   
49a0: 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74   DigestState *st
49b0: 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 74  atePtr = (Digest
49c0: 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44  State *) clientD
49d0: 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61  ata;.    Tcl_Cha
49e0: 6e 6e 65 6c 20 70 61 72 65 6e 74 3b 0a 20 20 20  nnel parent;.   
49f0: 20 54 63 6c 5f 44 72 69 76 65 72 57 61 74 63 68   Tcl_DriverWatch
4a00: 50 72 6f 63 20 2a 77 61 74 63 68 50 72 6f 63 3b  Proc *watchProc;
4a10: 0a 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 69  ..    /* Abort i
4a20: 66 20 6e 6f 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  f no channel */.
4a30: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
4a40: 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43  ->self == (Tcl_C
4a50: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a  hannel) NULL) {.
4a60: 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a  .return;.    }..
4a70: 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 4f 52 2d      /* Store OR-
4a80: 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f  ed combination o
4a90: 66 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 2c 20  f TCL_READABLE, 
4aa0: 54 43 4c 5f 57 52 49 54 41 42 4c 45 20 61 6e 64  TCL_WRITABLE and
4ab0: 20 54 43 4c 5f 45 58 43 45 50 54 49 4f 4e 20 2a   TCL_EXCEPTION *
4ac0: 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  /.    statePtr->
4ad0: 77 61 74 63 68 4d 61 73 6b 20 3d 20 6d 61 73 6b  watchMask = mask
4ae0: 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 70 61 67  ;..    /* Propag
4af0: 61 74 65 20 6d 61 73 6b 20 69 6e 66 6f 20 74 6f  ate mask info to
4b00: 20 70 61 72 65 6e 74 20 63 68 61 6e 6e 65 6c 20   parent channel 
4b10: 2a 2f 0a 20 20 20 20 70 61 72 65 6e 74 20 3d 20  */.    parent = 
4b20: 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 64 43 68  Tcl_GetStackedCh
4b30: 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e  annel(statePtr->
4b40: 73 65 6c 66 29 3b 0a 20 20 20 20 77 61 74 63 68  self);.    watch
4b50: 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68 61 6e 6e  Proc = Tcl_Chann
4b60: 65 6c 57 61 74 63 68 50 72 6f 63 28 54 63 6c 5f  elWatchProc(Tcl_
4b70: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 70  GetChannelType(p
4b80: 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 77 61 74  arent));.    wat
4b90: 63 68 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 68  chProc(Tcl_GetCh
4ba0: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74  annelInstanceDat
4bb0: 61 28 70 61 72 65 6e 74 29 2c 20 6d 61 73 6b 29  a(parent), mask)
4bc0: 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65  ;..    /* Remove
4bd0: 20 70 65 6e 64 69 6e 67 20 74 69 6d 65 72 20 2a   pending timer *
4be0: 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  /.    if (stateP
4bf0: 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63  tr->timer != (Tc
4c00: 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55  l_TimerToken) NU
4c10: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74  LL) {..Tcl_Delet
4c20: 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74  eTimerHandler(st
4c30: 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a  atePtr->timer);.
4c40: 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72  .statePtr->timer
4c50: 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b   = (Tcl_TimerTok
4c60: 65 6e 29 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  en) NULL;.    }.
4c70: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
4c80: 20 69 73 20 64 61 74 61 20 70 65 6e 64 69 6e 67   is data pending
4c90: 2c 20 73 65 74 20 6e 65 77 20 74 69 6d 65 72 20  , set new timer 
4ca0: 74 6f 20 63 61 6c 6c 20 54 63 6c 5f 4e 6f 74 69  to call Tcl_Noti
4cb0: 66 79 43 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20  fyChannel */.   
4cc0: 20 69 66 20 28 28 6d 61 73 6b 20 26 20 54 43 4c   if ((mask & TCL
4cd0: 5f 52 45 41 44 41 42 4c 45 29 20 26 26 20 28 54  _READABLE) && (T
4ce0: 63 6c 5f 49 6e 70 75 74 42 75 66 66 65 72 65 64  cl_InputBuffered
4cf0: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
4d00: 20 3e 20 30 29 29 20 7b 0a 09 73 74 61 74 65 50   > 0)) {..stateP
4d10: 74 72 2d 3e 74 69 6d 65 72 20 3d 20 54 63 6c 5f  tr->timer = Tcl_
4d20: 43 72 65 61 74 65 54 69 6d 65 72 48 61 6e 64 6c  CreateTimerHandl
4d30: 65 72 28 52 45 41 44 5f 44 45 4c 41 59 2c 20 44  er(READ_DELAY, D
4d40: 69 67 65 73 74 54 69 6d 65 72 48 61 6e 64 6c 65  igestTimerHandle
4d50: 72 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  r, (ClientData) 
4d60: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 7d  statePtr);.    }
4d70: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
4d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
4dc0: 20 2a 0a 20 2a 20 44 69 67 65 73 74 47 65 74 48   *. * DigestGetH
4dd0: 61 6e 64 6c 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a  andleProc --. *.
4de0: 20 2a 09 43 61 6c 6c 65 64 20 66 72 6f 6d 20 54   *.Called from T
4df0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 48 61 6e  cl_GetChannelHan
4e00: 64 6c 65 20 74 6f 20 72 65 74 72 69 65 76 65 20  dle to retrieve 
4e10: 4f 53 20 73 70 65 63 69 66 69 63 20 66 69 6c 65  OS specific file
4e20: 20 68 61 6e 64 6c 65 0a 20 2a 09 66 72 6f 6d 20   handle. *.from 
4e30: 69 6e 73 69 64 65 20 74 68 69 73 20 63 68 61 6e  inside this chan
4e40: 6e 65 6c 2e 20 4e 6f 74 20 75 73 65 64 20 66 6f  nel. Not used fo
4e50: 72 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  r transformation
4e60: 73 3f 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73  s?. *. * Returns
4e70: 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 66 6f 72 20  :. *.TCL_OK for 
4e80: 73 75 63 63 65 73 73 20 6f 72 20 54 43 4c 5f 45  success or TCL_E
4e90: 52 52 4f 52 20 66 6f 72 20 65 72 72 6f 72 20 6f  RROR for error o
4ea0: 72 20 69 66 20 6e 6f 74 20 73 75 70 70 6f 72 74  r if not support
4eb0: 65 64 2e 20 49 66 0a 20 2a 09 64 69 72 65 63 74  ed. If. *.direct
4ec0: 69 6f 6e 20 69 73 20 54 43 4c 5f 52 45 41 44 41  ion is TCL_READA
4ed0: 42 4c 45 2c 20 73 65 74 73 20 68 61 6e 64 6c 65  BLE, sets handle
4ee0: 50 74 72 20 74 6f 20 74 68 65 20 68 61 6e 64 6c  Ptr to the handl
4ef0: 65 20 75 73 65 64 20 66 6f 72 0a 20 2a 09 69 6e  e used for. *.in
4f00: 70 75 74 2c 20 6f 72 20 69 66 20 54 43 4c 5f 57  put, or if TCL_W
4f10: 52 49 54 41 42 4c 45 20 73 65 74 73 20 74 6f 20  RITABLE sets to 
4f20: 74 68 65 20 68 61 6e 64 6c 65 20 75 73 65 64 20  the handle used 
4f30: 66 6f 72 20 6f 75 74 70 75 74 2e 0a 20 2a 0a 20  for output.. *. 
4f40: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
4f50: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d   *.None. *. *---
4f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4fa0: 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65  ---. */.int Dige
4fb0: 73 74 47 65 74 48 61 6e 64 6c 65 50 72 6f 63 28  stGetHandleProc(
4fc0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
4fd0: 74 44 61 74 61 2c 20 69 6e 74 20 64 69 72 65 63  tData, int direc
4fe0: 74 69 6f 6e 2c 20 43 6c 69 65 6e 74 44 61 74 61  tion, ClientData
4ff0: 20 2a 68 61 6e 64 6c 65 50 74 72 29 20 7b 0a 20   *handlePtr) {. 
5000: 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a     DigestState *
5010: 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65  statePtr = (Dige
5020: 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e  stState *) clien
5030: 74 44 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 43  tData;.    Tcl_C
5040: 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 3b 0a 0a  hannel parent;..
5050: 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 69 66 20      /* Abort if 
5060: 6e 6f 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20  no channel */.  
5070: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
5080: 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61  self == (Tcl_Cha
5090: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72  nnel) NULL) {..r
50a0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
50b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 61 72 65  .    }..    pare
50c0: 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 63  nt = Tcl_GetStac
50d0: 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 65  kedChannel(state
50e0: 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 20  Ptr->self);.    
50f0: 72 65 74 75 72 6e 20 54 63 6c 5f 47 65 74 43 68  return Tcl_GetCh
5100: 61 6e 6e 65 6c 48 61 6e 64 6c 65 28 70 61 72 65  annelHandle(pare
5110: 6e 74 2c 20 64 69 72 65 63 74 69 6f 6e 2c 20 68  nt, direction, h
5120: 61 6e 64 6c 65 50 74 72 29 3b 0a 7d 0a 0a 2f 2a  andlePtr);.}../*
5130: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
5140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
5180: 44 69 67 65 73 74 4e 6f 74 69 66 79 50 72 6f 63  DigestNotifyProc
5190: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64   --. *. *.Called
51a0: 20 62 79 20 54 63 6c 20 74 6f 20 69 6e 66 6f 72   by Tcl to infor
51b0: 6d 20 75 73 20 6f 66 20 61 63 74 69 76 69 74 79  m us of activity
51c0: 20 6f 6e 20 74 68 65 20 75 6e 64 65 72 6c 79 69   on the underlyi
51d0: 6e 67 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20  ng channel.. *. 
51e0: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 55 6e  * Returns:. *.Un
51f0: 63 68 61 6e 67 65 64 20 69 6e 74 65 72 65 73 74  changed interest
5200: 4d 61 73 6b 20 77 68 69 63 68 20 69 73 20 61 6e  Mask which is an
5210: 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69   OR-ed combinati
5220: 6f 6e 20 6f 66 20 54 43 4c 5f 52 45 41 44 41 42  on of TCL_READAB
5230: 4c 45 20 6f 72 20 54 43 4c 5f 57 52 49 54 41 42  LE or TCL_WRITAB
5240: 4c 45 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  LE. *. * Side ef
5250: 66 65 63 74 73 3a 0a 20 2a 09 43 61 6e 63 65 6c  fects:. *.Cancel
5260: 73 20 61 6e 79 20 70 65 6e 64 69 6e 67 20 74 69  s any pending ti
5270: 6d 65 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  mer.. *. *------
5280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52c0: 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 4e  . */.int DigestN
52d0: 6f 74 69 66 79 50 72 6f 63 28 43 6c 69 65 6e 74  otifyProc(Client
52e0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
52f0: 20 69 6e 74 20 69 6e 74 65 72 65 73 74 4d 61 73   int interestMas
5300: 6b 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53  k) {.    DigestS
5310: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
5320: 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 29   (DigestState *)
5330: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20   clientData;..  
5340: 20 20 2f 2a 20 53 6b 69 70 20 74 69 6d 65 72 20    /* Skip timer 
5350: 65 76 65 6e 74 20 61 73 20 72 65 64 75 6e 64 61  event as redunda
5360: 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74  nt */.    if (st
5370: 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d  atePtr->timer !=
5380: 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e   (Tcl_TimerToken
5390: 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44  ) NULL) {..Tcl_D
53a0: 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65  eleteTimerHandle
53b0: 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65  r(statePtr->time
53c0: 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74  r);..statePtr->t
53d0: 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65  imer = (Tcl_Time
53e0: 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 20 20  rToken) NULL;.  
53f0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 69    }.    return i
5400: 6e 74 65 72 65 73 74 4d 61 73 6b 3b 0a 7d 0a 0a  nterestMask;.}..
5410: 2f 2a 0a 20 2a 0a 20 2a 20 43 68 61 6e 6e 65 6c  /*. *. * Channel
5420: 20 74 79 70 65 20 73 74 72 75 63 74 75 72 65 20   type structure 
5430: 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20 64  definition for d
5440: 69 67 65 73 74 20 74 72 61 6e 73 66 6f 72 6d 61  igest transforma
5450: 74 69 6f 6e 73 2e 0a 20 2a 0a 20 2a 2f 0a 73 74  tions.. *. */.st
5460: 61 74 69 63 20 63 6f 6e 73 74 20 54 63 6c 5f 43  atic const Tcl_C
5470: 68 61 6e 6e 65 6c 54 79 70 65 20 64 69 67 65 73  hannelType diges
5480: 74 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d 20 7b  tChannelType = {
5490: 0a 20 20 20 20 22 64 69 67 65 73 74 22 2c 09 09  .    "digest",..
54a0: 09 2f 2a 20 54 79 70 65 20 6e 61 6d 65 20 2a 2f  ./* Type name */
54b0: 0a 20 20 20 20 54 43 4c 5f 43 48 41 4e 4e 45 4c  .    TCL_CHANNEL
54c0: 5f 56 45 52 53 49 4f 4e 5f 35 2c 09 2f 2a 20 76  _VERSION_5,./* v
54d0: 35 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20  5 channel */.   
54e0: 20 44 69 67 65 73 74 43 6c 6f 73 65 50 72 6f 63   DigestCloseProc
54f0: 2c 09 09 2f 2a 20 43 6c 6f 73 65 20 70 72 6f 63  ,../* Close proc
5500: 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 49 6e   */.    DigestIn
5510: 70 75 74 50 72 6f 63 2c 09 09 2f 2a 20 49 6e 70  putProc,../* Inp
5520: 75 74 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 44  ut proc */.    D
5530: 69 67 65 73 74 4f 75 74 70 75 74 50 72 6f 63 2c  igestOutputProc,
5540: 09 09 2f 2a 20 4f 75 74 70 75 74 20 70 72 6f 63  ../* Output proc
5550: 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 09   */.    NULL,...
5560: 2f 2a 20 53 65 65 6b 20 70 72 6f 63 20 2a 2f 0a  /* Seek proc */.
5570: 20 20 20 20 44 69 67 65 73 74 53 65 74 4f 70 74      DigestSetOpt
5580: 69 6f 6e 50 72 6f 63 2c 09 2f 2a 20 53 65 74 20  ionProc,./* Set 
5590: 6f 70 74 69 6f 6e 20 70 72 6f 63 20 2a 2f 0a 20  option proc */. 
55a0: 20 20 20 44 69 67 65 73 74 47 65 74 4f 70 74 69     DigestGetOpti
55b0: 6f 6e 50 72 6f 63 2c 09 2f 2a 20 47 65 74 20 6f  onProc,./* Get o
55c0: 70 74 69 6f 6e 20 70 72 6f 63 20 2a 2f 0a 20 20  ption proc */.  
55d0: 20 20 44 69 67 65 73 74 57 61 74 63 68 50 72 6f    DigestWatchPro
55e0: 63 2c 09 09 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  c,../* Initializ
55f0: 65 20 6e 6f 74 69 66 69 65 72 20 2a 2f 0a 20 20  e notifier */.  
5600: 20 20 44 69 67 65 73 74 47 65 74 48 61 6e 64 6c    DigestGetHandl
5610: 65 50 72 6f 63 2c 09 2f 2a 20 47 65 74 20 4f 53  eProc,./* Get OS
5620: 20 68 61 6e 64 6c 65 73 20 6f 75 74 20 6f 66 20   handles out of 
5630: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 44  channel */.    D
5640: 69 67 65 73 74 43 6c 6f 73 65 32 50 72 6f 63 2c  igestClose2Proc,
5650: 09 09 2f 2a 20 63 6c 6f 73 65 32 70 72 6f 63 20  ../* close2proc 
5660: 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 42 6c 6f  */.    DigestBlo
5670: 63 6b 4d 6f 64 65 50 72 6f 63 2c 09 2f 2a 20 53  ckModeProc,./* S
5680: 65 74 20 62 6c 6f 63 6b 69 6e 67 2f 6e 6f 6e 62  et blocking/nonb
5690: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2a 2f 0a 20  locking mode*/. 
56a0: 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 46 6c     NULL,.../* Fl
56b0: 75 73 68 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20  ush proc */.    
56c0: 44 69 67 65 73 74 4e 6f 74 69 66 79 50 72 6f 63  DigestNotifyProc
56d0: 2c 09 09 2f 2a 20 48 61 6e 64 6c 69 6e 67 20 6f  ,../* Handling o
56e0: 66 20 65 76 65 6e 74 73 20 62 75 62 62 6c 69 6e  f events bubblin
56f0: 67 20 75 70 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c  g up */.    NULL
5700: 2c 09 09 09 2f 2a 20 57 69 64 65 20 73 65 65 6b  ,.../* Wide seek
5710: 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 4e 55 4c   proc */.    NUL
5720: 4c 2c 09 09 09 2f 2a 20 54 68 72 65 61 64 20 61  L,.../* Thread a
5730: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 4e 55 4c  ction */.    NUL
5740: 4c 09 09 09 2f 2a 20 54 72 75 6e 63 61 74 65 20  L.../* Truncate 
5750: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  */.};../*. *----
5760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57a0: 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 43  --. *. * DigestC
57b0: 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 20 2d 2d  hannelHandler --
57c0: 0a 20 2a 0a 20 2a 09 43 72 65 61 74 65 20 61 20  . *. *.Create a 
57d0: 73 74 61 63 6b 65 64 20 63 68 61 6e 6e 65 6c 20  stacked channel 
57e0: 66 6f 72 20 61 20 6d 65 73 73 61 67 65 20 64 69  for a message di
57f0: 67 65 73 74 20 74 72 61 6e 73 66 6f 72 6d 61 74  gest transformat
5800: 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72  ion.. *. * Retur
5810: 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72  ns:. *.TCL_OK or
5820: 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a   TCL_ERROR. *. *
5830: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
5840: 2a 09 41 64 64 73 20 74 72 61 6e 73 66 6f 72 6d  *.Adds transform
5850: 20 74 6f 20 63 68 61 6e 6e 65 6c 20 61 6e 64 20   to channel and 
5860: 73 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20 63  sets result to c
5870: 68 61 6e 6e 65 6c 20 69 64 20 6f 72 20 65 72 72  hannel id or err
5880: 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20  or message.. *. 
5890: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
58a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
58b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
58c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
58d0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
58e0: 69 63 20 69 6e 74 20 44 69 67 65 73 74 43 68 61  ic int DigestCha
58f0: 6e 6e 65 6c 48 61 6e 64 6c 65 72 28 54 63 6c 5f  nnelHandler(Tcl_
5900: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
5910: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 68 61 6e  const char *chan
5920: 6e 65 6c 2c 20 54 63 6c 5f 4f 62 6a 20 2a 64 69  nel, Tcl_Obj *di
5930: 67 65 73 74 4f 62 6a 2c 0a 09 54 63 6c 5f 4f 62  gestObj,..Tcl_Ob
5940: 6a 20 2a 63 69 70 68 65 72 4f 62 6a 2c 20 69 6e  j *cipherObj, in
5950: 74 20 66 6f 72 6d 61 74 2c 20 54 63 6c 5f 4f 62  t format, Tcl_Ob
5960: 6a 20 2a 6b 65 79 4f 62 6a 2c 20 54 63 6c 5f 4f  j *keyObj, Tcl_O
5970: 62 6a 20 2a 6d 61 63 4f 62 6a 29 20 7b 0a 20 20  bj *macObj) {.  
5980: 20 20 69 6e 74 20 6d 6f 64 65 3b 20 2f 2a 20 4f    int mode; /* O
5990: 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  R-ed combination
59a0: 20 6f 66 20 54 43 4c 5f 52 45 41 44 41 42 4c 45   of TCL_READABLE
59b0: 20 61 6e 64 20 54 43 4c 5f 57 52 49 54 41 42 4c   and TCL_WRITABL
59c0: 45 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 43 68 61  E */.    Tcl_Cha
59d0: 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 44  nnel chan;.    D
59e0: 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74  igestState *stat
59f0: 65 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e  ePtr;..    dprin
5a00: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
5a10: 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 65 20 61     /* Validate a
5a20: 72 67 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 63  rgs */.    if (c
5a30: 68 61 6e 6e 65 6c 20 3d 3d 20 28 63 6f 6e 73 74  hannel == (const
5a40: 20 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 20 7b   char *) NULL) {
5a50: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
5a60: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
5a70: 2a 20 47 65 74 20 63 68 61 6e 6e 65 6c 20 49 64  * Get channel Id
5a80: 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54   */.    chan = T
5a90: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e  cl_GetChannel(in
5aa0: 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c 2c 20 26  terp, channel, &
5ab0: 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63  mode);.    if (c
5ac0: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  han == (Tcl_Chan
5ad0: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  nel) NULL) {..re
5ae0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
5af0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
5b00: 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61  ke sure to opera
5b10: 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73  te on the topmos
5b20: 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20  t channel */.   
5b30: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54   chan = Tcl_GetT
5b40: 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b  opChannel(chan);
5b50: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75  ..    /* Configu
5b60: 72 65 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20  re channel */.  
5b70: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c    Tcl_SetChannel
5b80: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63  Option(interp, c
5b90: 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69  han, "-translati
5ba0: 6f 6e 22 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a  on", "binary");.
5bb0: 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43      if (Tcl_GetC
5bc0: 68 61 6e 6e 65 6c 42 75 66 66 65 72 53 69 7a 65  hannelBufferSize
5bd0: 28 63 68 61 6e 29 20 3c 20 45 56 50 5f 4d 41 58  (chan) < EVP_MAX
5be0: 5f 4d 44 5f 53 49 5a 45 20 2a 20 32 29 20 7b 0a  _MD_SIZE * 2) {.
5bf0: 09 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 42  .Tcl_SetChannelB
5c00: 75 66 66 65 72 53 69 7a 65 28 63 68 61 6e 2c 20  ufferSize(chan, 
5c10: 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45 20  EVP_MAX_MD_SIZE 
5c20: 2a 20 32 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  * 2);.    }..   
5c30: 20 2f 2a 20 43 72 65 61 74 65 20 73 74 61 74 65   /* Create state
5c40: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
5c50: 2a 2f 0a 20 20 20 20 69 66 20 28 28 73 74 61 74  */.    if ((stat
5c60: 65 50 74 72 20 3d 20 44 69 67 65 73 74 53 74 61  ePtr = DigestSta
5c70: 74 65 4e 65 77 28 69 6e 74 65 72 70 2c 20 66 6f  teNew(interp, fo
5c80: 72 6d 61 74 29 29 20 3d 3d 20 4e 55 4c 4c 29 20  rmat)) == NULL) 
5c90: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
5ca0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4d 65 6d  ult(interp, "Mem
5cb0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
5cc0: 72 72 6f 72 22 2c 20 28 63 68 61 72 20 2a 29 20  rror", (char *) 
5cd0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
5ce0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
5cf0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 65      statePtr->se
5d00: 6c 66 20 3d 20 63 68 61 6e 3b 0a 20 20 20 20 73  lf = chan;.    s
5d10: 74 61 74 65 50 74 72 2d 3e 6d 6f 64 65 20 3d 20  tatePtr->mode = 
5d20: 6d 6f 64 65 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e  mode;..    /* In
5d30: 69 74 69 61 6c 69 7a 65 20 68 61 73 68 20 66 75  itialize hash fu
5d40: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66  nction */.    if
5d50: 20 28 44 69 67 65 73 74 49 6e 69 74 69 61 6c 69   (DigestInitiali
5d60: 7a 65 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  ze(interp, state
5d70: 50 74 72 2c 20 64 69 67 65 73 74 4f 62 6a 2c 20  Ptr, digestObj, 
5d80: 63 69 70 68 65 72 4f 62 6a 2c 20 6b 65 79 4f 62  cipherObj, keyOb
5d90: 6a 2c 20 6d 61 63 4f 62 6a 29 20 21 3d 20 54 43  j, macObj) != TC
5da0: 4c 5f 4f 4b 29 20 7b 0a 09 44 69 67 65 73 74 53  L_OK) {..DigestS
5db0: 74 61 74 65 46 72 65 65 28 73 74 61 74 65 50 74  tateFree(statePt
5dc0: 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  r);..return TCL_
5dd0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
5de0: 20 20 2f 2a 20 53 74 61 63 6b 20 63 68 61 6e 6e    /* Stack chann
5df0: 65 6c 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50  el */.    stateP
5e00: 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53  tr->self = Tcl_S
5e10: 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65  tackChannel(inte
5e20: 72 70 2c 20 26 64 69 67 65 73 74 43 68 61 6e 6e  rp, &digestChann
5e30: 65 6c 54 79 70 65 2c 20 28 43 6c 69 65 6e 74 44  elType, (ClientD
5e40: 61 74 61 29 20 73 74 61 74 65 50 74 72 2c 20 6d  ata) statePtr, m
5e50: 6f 64 65 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20  ode, chan);.    
5e60: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 65  if (statePtr->se
5e70: 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e  lf == (Tcl_Chann
5e80: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 44 69 67  el) NULL) {..Dig
5e90: 65 73 74 53 74 61 74 65 46 72 65 65 28 73 74 61  estStateFree(sta
5ea0: 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20  tePtr);..return 
5eb0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
5ec0: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 72 65 73  ..    /* Set res
5ed0: 75 6c 74 20 74 6f 20 63 68 61 6e 6e 65 6c 20 49  ult to channel I
5ee0: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 65 74  d */.    Tcl_Set
5ef0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
5f00: 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 43  char *) Tcl_GetC
5f10: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29  hannelName(chan)
5f20: 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
5f30: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
5f40: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  OK;.}../*. *----
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 2d 2d  ----------------
5f90: 2d 2d 0a 20 2a 0a 20 2a 20 55 6e 73 74 61 63 6b  --. *. * Unstack
5fa0: 20 43 68 61 6e 6e 65 6c 20 2d 2d 0a 20 2a 0a 20   Channel --. *. 
5fb0: 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  *.This function 
5fc0: 72 65 6d 6f 76 65 73 20 74 68 65 20 73 74 61 63  removes the stac
5fd0: 6b 65 64 20 63 68 61 6e 6e 65 6c 20 66 72 6f 6d  ked channel from
5fe0: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a   the top of the.
5ff0: 20 2a 09 63 68 61 6e 6e 65 6c 20 73 74 61 63 6b   *.channel stack
6000: 20 69 66 20 69 74 20 69 73 20 61 20 64 69 67 65   if it is a dige
6010: 73 74 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20  st channel.. *. 
6020: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43  * Returns:. *.TC
6030: 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f  L_OK or TCL_ERRO
6040: 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  R. *. * Side eff
6050: 65 63 74 73 3a 0a 20 2a 09 52 65 6d 6f 76 65 73  ects:. *.Removes
6060: 20 74 72 61 6e 73 66 6f 72 6d 20 66 72 6f 6d 20   transform from 
6070: 63 68 61 6e 6e 65 6c 20 6f 72 20 73 65 74 73 20  channel or sets 
6080: 72 65 73 75 6c 74 20 74 6f 20 65 72 72 6f 72 20  result to error 
6090: 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 2d 2d  message.. *. *--
60a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60e0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
60f0: 69 6e 74 20 44 69 67 65 73 74 55 6e 73 74 61 63  int DigestUnstac
6100: 6b 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61  kObjCmd(ClientDa
6110: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
6120: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
6130: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
6140: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
6150: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68  []) {.    Tcl_Ch
6160: 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20  annel chan;.    
6170: 69 6e 74 20 6d 6f 64 65 3b 20 2f 2a 20 4f 52 2d  int mode; /* OR-
6180: 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f  ed combination o
6190: 66 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 61  f TCL_READABLE a
61a0: 6e 64 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 20  nd TCL_WRITABLE 
61b0: 20 2a 2f 0a 0a 20 20 20 20 64 70 72 69 6e 74 66   */..    dprintf
61c0: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
61d0: 20 2f 2a 20 56 61 6c 69 64 61 74 65 20 61 72 67   /* Validate arg
61e0: 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69 66   count */.    if
61f0: 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09   (objc != 2) {..
6200: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
6210: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
6220: 2c 20 22 63 68 61 6e 6e 65 6c 49 64 22 29 3b 0a  , "channelId");.
6230: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
6240: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
6250: 20 47 65 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a   Get channel */.
6260: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
6270: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  etChannel(interp
6280: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  , Tcl_GetStringF
6290: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20  romObj(objv[1], 
62a0: 4e 55 4c 4c 29 2c 20 26 6d 6f 64 65 29 3b 0a 20  NULL), &mode);. 
62b0: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28     if (chan == (
62c0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
62d0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  L) {..return TCL
62e0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
62f0: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
6300: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
6310: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65  e topmost channe
6320: 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20  l */.    chan = 
6330: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65  Tcl_GetTopChanne
6340: 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a  l(chan);..    /*
6350: 20 43 68 65 63 6b 20 69 66 20 64 69 67 65 73 74   Check if digest
6360: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20   channel */.    
6370: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  if (Tcl_GetChann
6380: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20  elType(chan) != 
6390: 26 64 69 67 65 73 74 43 68 61 6e 6e 65 6c 54 79  &digestChannelTy
63a0: 70 65 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  pe) {..Tcl_Appen
63b0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
63c0: 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22  "bad channel \""
63d0: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  , Tcl_GetChannel
63e0: 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20 20  Name(chan),..   
63f0: 20 22 5c 22 3a 20 6e 6f 74 20 61 20 64 69 67 65   "\": not a dige
6400: 73 74 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c  st channel", NUL
6410: 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f  L);..Tcl_SetErro
6420: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54  rCode(interp, "T
6430: 4c 53 22 2c 20 22 55 4e 53 54 41 43 4b 22 2c 20  LS", "UNSTACK", 
6440: 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41  "CHANNEL", "INVA
6450: 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  LID", (char *) N
6460: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  ULL);..return TC
6470: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
6480: 20 20 20 20 2f 2a 20 50 6f 70 20 74 72 61 6e 73      /* Pop trans
6490: 66 6f 72 6d 20 66 72 6f 6d 20 63 68 61 6e 6e 65  form from channe
64a0: 6c 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  l */.    return 
64b0: 54 63 6c 5f 55 6e 73 74 61 63 6b 43 68 61 6e 6e  Tcl_UnstackChann
64c0: 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29  el(interp, chan)
64d0: 3b 0a 20 20 20 20 09 63 6c 69 65 6e 74 44 61 74  ;.    .clientDat
64e0: 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a  a = clientData;.
64f0: 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../************
6500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6530: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d  *******/../*. *-
6540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6580: 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 49  --. *. * DigestI
6590: 6e 73 74 61 6e 63 65 4f 62 6a 43 6d 64 20 2d 2d  nstanceObjCmd --
65a0: 0a 20 2a 0a 20 2a 09 48 61 6e 64 6c 65 72 20 66  . *. *.Handler f
65b0: 6f 72 20 64 69 67 65 73 74 20 63 6f 6d 6d 61 6e  or digest comman
65c0: 64 20 69 6e 73 74 61 6e 63 65 73 2e 20 55 73 65  d instances. Use
65d0: 64 20 74 6f 20 61 64 64 20 64 61 74 61 20 74 6f  d to add data to
65e0: 20 68 61 73 68 0a 20 2a 09 66 75 6e 63 74 69 6f   hash. *.functio
65f0: 6e 20 6f 72 20 72 65 74 72 69 65 76 65 20 6d 65  n or retrieve me
6600: 73 73 61 67 65 20 64 69 67 65 73 74 2e 0a 20 2a  ssage digest.. *
6610: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09  . * Returns:. *.
6620: 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52  TCL_OK or TCL_ER
6630: 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ROR. *. * Side e
6640: 66 66 65 63 74 73 3a 0a 20 2a 09 41 64 64 73 20  ffects:. *.Adds 
6650: 64 61 74 61 20 74 6f 20 68 61 73 68 20 6f 72 20  data to hash or 
6660: 72 65 74 75 72 6e 73 20 6d 65 73 73 61 67 65 20  returns message 
6670: 64 69 67 65 73 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d  digest. *. *----
6680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
66a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
66b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
66c0: 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 49 6e   */.int DigestIn
66d0: 73 74 61 6e 63 65 4f 62 6a 43 6d 64 28 43 6c 69  stanceObjCmd(Cli
66e0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
66f0: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
6700: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
6710: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
6720: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 44   objv[]) {.    D
6730: 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74  igestState *stat
6740: 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74  ePtr = (DigestSt
6750: 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74  ate *) clientDat
6760: 61 3b 0a 20 20 20 20 69 6e 74 20 66 6e 2c 20 64  a;.    int fn, d
6770: 61 74 61 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 20  ata_len = 0;.   
6780: 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 4e 55   char *data = NU
6790: 4c 4c 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63  LL;.    static c
67a0: 6f 6e 73 74 20 63 68 61 72 20 2a 69 6e 73 74 61  onst char *insta
67b0: 6e 63 65 5f 66 6e 73 20 5b 5d 20 3d 20 7b 20 22  nce_fns [] = { "
67c0: 66 69 6e 61 6c 69 7a 65 22 2c 20 22 75 70 64 61  finalize", "upda
67d0: 74 65 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 0a 20 20  te", NULL };..  
67e0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
67f0: 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c  d");..    /* Val
6800: 69 64 61 74 65 20 61 72 67 20 63 6f 75 6e 74 20  idate arg count 
6810: 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  */.    if (objc 
6820: 3c 20 32 20 7c 7c 20 6f 62 6a 63 20 3e 20 33 29  < 2 || objc > 3)
6830: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d   {..Tcl_WrongNum
6840: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
6850: 6f 62 6a 76 2c 20 22 66 75 6e 63 74 69 6f 6e 20  objv, "function 
6860: 3f 64 61 74 61 3f 22 29 3b 0a 09 72 65 74 75 72  ?data?");..retur
6870: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
6880: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 66   }..    /* Get f
6890: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69  unction */.    i
68a0: 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46  f (Tcl_GetIndexF
68b0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
68c0: 62 6a 76 5b 31 5d 2c 20 69 6e 73 74 61 6e 63 65  bjv[1], instance
68d0: 5f 66 6e 73 2c 20 22 66 75 6e 63 74 69 6f 6e 22  _fns, "function"
68e0: 2c 20 30 2c 20 26 66 6e 29 20 21 3d 20 54 43 4c  , 0, &fn) != TCL
68f0: 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  _OK) {..return T
6900: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
6910: 0a 20 20 20 20 2f 2a 20 44 6f 20 66 75 6e 63 74  .    /* Do funct
6920: 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 66  ion */.    if (f
6930: 6e 29 20 7b 0a 09 2f 2a 20 47 65 74 20 64 61 74  n) {../* Get dat
6940: 61 20 6f 72 20 72 65 74 75 72 6e 20 65 72 72 6f  a or return erro
6950: 72 20 69 66 20 6e 6f 6e 65 20 2a 2f 0a 09 69 66  r if none */..if
6960: 20 28 6f 62 6a 63 20 3d 3d 20 33 29 20 7b 0a 09   (objc == 3) {..
6970: 20 20 20 20 64 61 74 61 20 3d 20 54 63 6c 5f 47      data = Tcl_G
6980: 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
6990: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 64 61 74  bj(objv[2], &dat
69a0: 61 5f 6c 65 6e 29 3b 0a 09 7d 20 65 6c 73 65 20  a_len);..} else 
69b0: 7b 0a 09 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  {..    Tcl_Wrong
69c0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
69d0: 31 2c 20 6f 62 6a 76 2c 20 22 75 70 64 61 74 65  1, objv, "update
69e0: 20 64 61 74 61 22 29 3b 0a 09 20 20 20 20 72 65   data");..    re
69f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6a00: 09 7d 0a 0a 09 2f 2a 20 55 70 64 61 74 65 20 68  .}.../* Update h
6a10: 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ash function */.
6a20: 09 69 66 20 28 44 69 67 65 73 74 55 70 64 61 74  .if (DigestUpdat
6a30: 65 28 73 74 61 74 65 50 74 72 2c 20 64 61 74 61  e(statePtr, data
6a40: 2c 20 28 73 69 7a 65 5f 74 29 20 64 61 74 61 5f  , (size_t) data_
6a50: 6c 65 6e 2c 20 31 29 20 21 3d 20 54 43 4c 5f 4f  len, 1) != TCL_O
6a60: 4b 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e  K) {..    return
6a70: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a   TCL_ERROR;..}..
6a80: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a      } else {../*
6a90: 20 46 69 6e 61 6c 69 7a 65 20 68 61 73 68 20 66   Finalize hash f
6aa0: 75 6e 63 74 69 6f 6e 20 61 6e 64 20 63 61 6c 63  unction and calc
6ab0: 75 6c 61 74 65 20 6d 65 73 73 61 67 65 20 64 69  ulate message di
6ac0: 67 65 73 74 20 2a 2f 0a 09 69 66 20 28 44 69 67  gest */..if (Dig
6ad0: 65 73 74 46 69 6e 61 6c 69 7a 65 28 69 6e 74 65  estFinalize(inte
6ae0: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 4e 55  rp, statePtr, NU
6af0: 4c 4c 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  LL) != TCL_OK) {
6b00: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
6b10: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 54 63 6c  _ERROR;..}...Tcl
6b20: 5f 44 65 6c 65 74 65 43 6f 6d 6d 61 6e 64 46 72  _DeleteCommandFr
6b30: 6f 6d 54 6f 6b 65 6e 28 69 6e 74 65 72 70 2c 20  omToken(interp, 
6b40: 73 74 61 74 65 50 74 72 2d 3e 74 6f 6b 65 6e 29  statePtr->token)
6b50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
6b60: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
6b70: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
6b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6bb0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67  ------. *. * Dig
6bc0: 65 73 74 43 6f 6d 6d 61 6e 64 44 65 6c 65 74 65  estCommandDelete
6bd0: 48 61 6e 64 6c 65 72 20 2d 2d 0a 20 2a 0a 20 2a  Handler --. *. *
6be0: 09 20 43 61 6c 6c 62 61 63 6b 20 74 6f 20 63 6c  . Callback to cl
6bf0: 65 61 6e 2d 75 70 20 77 68 65 6e 20 64 69 67 65  ean-up when dige
6c00: 73 74 20 69 6e 73 74 61 6e 63 65 20 63 6f 6d 6d  st instance comm
6c10: 61 6e 64 20 69 73 20 64 65 6c 65 74 65 64 2e 0a  and is deleted..
6c20: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20   *. * Returns:. 
6c30: 2a 09 4e 6f 74 68 69 6e 67 0a 20 2a 0a 20 2a 20  *.Nothing. *. * 
6c40: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
6c50: 09 44 65 73 74 72 6f 79 73 20 73 74 61 74 65 20  .Destroys state 
6c60: 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20  info structure. 
6c70: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
6c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6cb0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64  -------. */.void
6cc0: 20 44 69 67 65 73 74 43 6f 6d 6d 61 6e 64 44 65   DigestCommandDe
6cd0: 6c 65 74 65 48 61 6e 64 6c 65 72 28 43 6c 69 65  leteHandler(Clie
6ce0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
6cf0: 61 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53  a) {.    DigestS
6d00: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
6d10: 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 29   (DigestState *)
6d20: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20   clientData;..  
6d30: 20 20 2f 2a 20 43 6c 65 61 6e 2d 75 70 20 2a 2f    /* Clean-up */
6d40: 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65  .    DigestState
6d50: 46 72 65 65 28 73 74 61 74 65 50 74 72 29 3b 0a  Free(statePtr);.
6d60: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
6d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
6db0: 2a 20 44 69 67 65 73 74 43 6f 6d 6d 61 6e 64 48  * DigestCommandH
6dc0: 61 6e 64 6c 65 72 20 2d 2d 0a 20 2a 0a 20 2a 09  andler --. *. *.
6dd0: 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20   Create command 
6de0: 74 6f 20 61 6c 6c 6f 77 20 75 73 65 72 20 74 6f  to allow user to
6df0: 20 61 64 64 20 64 61 74 61 20 74 6f 20 68 61 73   add data to has
6e00: 68 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 0a 20  h function.. *. 
6e10: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43  * Returns:. *.TC
6e20: 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f  L_OK or TCL_ERRO
6e30: 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  R. *. * Side eff
6e40: 65 63 74 73 3a 0a 20 2a 09 43 72 65 61 74 65 73  ects:. *.Creates
6e50: 20 63 6f 6d 6d 61 6e 64 20 6f 72 20 65 72 72 6f   command or erro
6e60: 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d  r message. *. *-
6e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6eb0: 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73  --. */.int Diges
6ec0: 74 43 6f 6d 6d 61 6e 64 48 61 6e 64 6c 65 72 28  tCommandHandler(
6ed0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
6ee0: 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64  rp, Tcl_Obj *cmd
6ef0: 4f 62 6a 2c 20 54 63 6c 5f 4f 62 6a 20 2a 64 69  Obj, Tcl_Obj *di
6f00: 67 65 73 74 4f 62 6a 2c 0a 09 54 63 6c 5f 4f 62  gestObj,..Tcl_Ob
6f10: 6a 20 2a 63 69 70 68 65 72 4f 62 6a 2c 20 69 6e  j *cipherObj, in
6f20: 74 20 66 6f 72 6d 61 74 2c 20 54 63 6c 5f 4f 62  t format, Tcl_Ob
6f30: 6a 20 2a 6b 65 79 4f 62 6a 2c 20 54 63 6c 5f 4f  j *keyObj, Tcl_O
6f40: 62 6a 20 2a 6d 61 63 4f 62 6a 29 20 7b 0a 20 20  bj *macObj) {.  
6f50: 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73    DigestState *s
6f60: 74 61 74 65 50 74 72 3b 0a 20 20 20 20 63 68 61  tatePtr;.    cha
6f70: 72 20 2a 63 6d 64 4e 61 6d 65 20 3d 20 54 63 6c  r *cmdName = Tcl
6f80: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
6f90: 6a 28 63 6d 64 4f 62 6a 2c 20 4e 55 4c 4c 29 3b  j(cmdObj, NULL);
6fa0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
6fb0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a  alled");..    /*
6fc0: 20 43 72 65 61 74 65 20 73 74 61 74 65 20 64 61   Create state da
6fd0: 74 61 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ta structure */.
6fe0: 20 20 20 20 69 66 20 28 28 73 74 61 74 65 50 74      if ((statePt
6ff0: 72 20 3d 20 44 69 67 65 73 74 53 74 61 74 65 4e  r = DigestStateN
7000: 65 77 28 69 6e 74 65 72 70 2c 20 66 6f 72 6d 61  ew(interp, forma
7010: 74 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  t)) == NULL) {..
7020: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
7030: 28 69 6e 74 65 72 70 2c 20 22 4d 65 6d 6f 72 79  (interp, "Memory
7040: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
7050: 72 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  r", (char *) NUL
7060: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  L);..return TCL_
7070: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
7080: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
7090: 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  hash function */
70a0: 0a 20 20 20 20 69 66 20 28 44 69 67 65 73 74 49  .    if (DigestI
70b0: 6e 69 74 69 61 6c 69 7a 65 28 69 6e 74 65 72 70  nitialize(interp
70c0: 2c 20 73 74 61 74 65 50 74 72 2c 20 64 69 67 65  , statePtr, dige
70d0: 73 74 4f 62 6a 2c 20 63 69 70 68 65 72 4f 62 6a  stObj, cipherObj
70e0: 2c 20 6b 65 79 4f 62 6a 2c 20 6d 61 63 4f 62 6a  , keyObj, macObj
70f0: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
7100: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7110: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
7120: 43 72 65 61 74 65 20 69 6e 73 74 61 6e 63 65 20  Create instance 
7130: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 73  command */.    s
7140: 74 61 74 65 50 74 72 2d 3e 74 6f 6b 65 6e 20 3d  tatePtr->token =
7150: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
7160: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 63 6d  mmand(interp, cm
7170: 64 4e 61 6d 65 2c 20 44 69 67 65 73 74 49 6e 73  dName, DigestIns
7180: 74 61 6e 63 65 4f 62 6a 43 6d 64 2c 0a 09 28 43  tanceObjCmd,..(C
7190: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65  lientData) state
71a0: 50 74 72 2c 20 44 69 67 65 73 74 43 6f 6d 6d 61  Ptr, DigestComma
71b0: 6e 64 44 65 6c 65 74 65 48 61 6e 64 6c 65 72 29  ndDeleteHandler)
71c0: 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ;.    if (stateP
71d0: 74 72 2d 3e 74 6f 6b 65 6e 20 3d 3d 20 4e 55 4c  tr->token == NUL
71e0: 4c 29 20 7b 0a 09 44 69 67 65 73 74 53 74 61 74  L) {..DigestStat
71f0: 65 46 72 65 65 28 73 74 61 74 65 50 74 72 29 3b  eFree(statePtr);
7200: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
7210: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
7220: 2a 20 52 65 74 75 72 6e 20 63 6f 6d 6d 61 6e 64  * Return command
7230: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 54 63 6c   name */.    Tcl
7240: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
7250: 74 65 72 70 2c 20 63 6d 64 4f 62 6a 29 3b 0a 20  terp, cmdObj);. 
7260: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
7270: 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}.../*********
7280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
72a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
72b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
72c0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
72d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
72e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
72f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7300: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65  -----. *. * Dige
7310: 73 74 44 61 74 61 48 61 6e 64 6c 65 72 20 2d 2d  stDataHandler --
7320: 0a 20 2a 0a 20 2a 09 52 65 74 75 72 6e 20 6d 65  . *. *.Return me
7330: 73 73 61 67 65 20 64 69 67 65 73 74 20 66 6f 72  ssage digest for
7340: 20 64 61 74 61 20 75 73 69 6e 67 20 75 73 65 72   data using user
7350: 20 73 70 65 63 69 66 69 65 64 20 68 61 73 68 20   specified hash 
7360: 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20  function.. *. * 
7370: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f  Returns:. *.TCL_
7380: 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a  OK or TCL_ERROR.
7390: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
73a0: 74 73 3a 0a 20 2a 09 53 65 74 73 20 72 65 73 75  ts:. *.Sets resu
73b0: 6c 74 20 74 6f 20 6d 65 73 73 61 67 65 20 64 69  lt to message di
73c0: 67 65 73 74 20 6f 72 20 65 72 72 6f 72 20 6d 65  gest or error me
73d0: 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  ssage. *. *-----
73e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
73f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
7420: 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 44 61 74  */.int DigestDat
7430: 61 48 61 6e 64 6c 65 72 28 54 63 6c 5f 49 6e 74  aHandler(Tcl_Int
7440: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c  erp *interp, Tcl
7450: 5f 4f 62 6a 20 2a 64 61 74 61 4f 62 6a 2c 20 54  _Obj *dataObj, T
7460: 63 6c 5f 4f 62 6a 20 2a 64 69 67 65 73 74 4f 62  cl_Obj *digestOb
7470: 6a 2c 0a 09 54 63 6c 5f 4f 62 6a 20 2a 63 69 70  j,..Tcl_Obj *cip
7480: 68 65 72 4f 62 6a 2c 20 69 6e 74 20 66 6f 72 6d  herObj, int form
7490: 61 74 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79  at, Tcl_Obj *key
74a0: 4f 62 6a 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6d 61  Obj, Tcl_Obj *ma
74b0: 63 4f 62 6a 29 20 7b 0a 20 20 20 20 63 68 61 72  cObj) {.    char
74c0: 20 2a 64 61 74 61 3b 0a 20 20 20 20 69 6e 74 20   *data;.    int 
74d0: 64 61 74 61 5f 6c 65 6e 3b 0a 20 20 20 20 44 69  data_len;.    Di
74e0: 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65  gestState *state
74f0: 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  Ptr;..    dprint
7500: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
7510: 20 20 2f 2a 20 47 65 74 20 64 61 74 61 20 2a 2f    /* Get data */
7520: 0a 20 20 20 20 64 61 74 61 20 3d 20 54 63 6c 5f  .    data = Tcl_
7530: 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
7540: 4f 62 6a 28 64 61 74 61 4f 62 6a 2c 20 26 64 61  Obj(dataObj, &da
7550: 74 61 5f 6c 65 6e 29 3b 0a 20 20 20 20 69 66 20  ta_len);.    if 
7560: 28 64 61 74 61 20 3d 3d 20 4e 55 4c 4c 29 20 7b  (data == NULL) {
7570: 0a 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28  ..Tcl_SetResult(
7580: 69 6e 74 65 72 70 2c 20 22 4e 6f 20 64 61 74 61  interp, "No data
7590: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  ", NULL);..retur
75a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
75b0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
75c0: 65 20 73 74 61 74 65 20 64 61 74 61 20 73 74 72  e state data str
75d0: 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 69 66  ucture */.    if
75e0: 20 28 28 73 74 61 74 65 50 74 72 20 3d 20 44 69   ((statePtr = Di
75f0: 67 65 73 74 53 74 61 74 65 4e 65 77 28 69 6e 74  gestStateNew(int
7600: 65 72 70 2c 20 66 6f 72 6d 61 74 29 29 20 3d 3d  erp, format)) ==
7610: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70   NULL) {..Tcl_Ap
7620: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
7630: 70 2c 20 22 4d 65 6d 6f 72 79 20 61 6c 6c 6f 63  p, "Memory alloc
7640: 61 74 69 6f 6e 20 65 72 72 6f 72 22 2c 20 28 63  ation error", (c
7650: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72  har *) NULL);..r
7660: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7670: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
7680: 61 6c 63 20 44 69 67 65 73 74 20 2a 2f 0a 20 20  alc Digest */.  
7690: 20 20 69 66 20 28 44 69 67 65 73 74 49 6e 69 74    if (DigestInit
76a0: 69 61 6c 69 7a 65 28 69 6e 74 65 72 70 2c 20 73  ialize(interp, s
76b0: 74 61 74 65 50 74 72 2c 20 64 69 67 65 73 74 4f  tatePtr, digestO
76c0: 62 6a 2c 20 63 69 70 68 65 72 4f 62 6a 2c 20 6b  bj, cipherObj, k
76d0: 65 79 4f 62 6a 2c 20 6d 61 63 4f 62 6a 29 20 21  eyObj, macObj) !
76e0: 3d 20 54 43 4c 5f 4f 4b 20 7c 7c 0a 09 44 69 67  = TCL_OK ||..Dig
76f0: 65 73 74 55 70 64 61 74 65 28 73 74 61 74 65 50  estUpdate(stateP
7700: 74 72 2c 20 64 61 74 61 2c 20 28 73 69 7a 65 5f  tr, data, (size_
7710: 74 29 20 64 61 74 61 5f 6c 65 6e 2c 20 31 29 20  t) data_len, 1) 
7720: 21 3d 20 54 43 4c 5f 4f 4b 20 7c 7c 0a 09 44 69  != TCL_OK ||..Di
7730: 67 65 73 74 46 69 6e 61 6c 69 7a 65 28 69 6e 74  gestFinalize(int
7740: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 4e  erp, statePtr, N
7750: 55 4c 4c 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  ULL) != TCL_OK) 
7760: 7b 0a 09 44 69 67 65 73 74 53 74 61 74 65 46 72  {..DigestStateFr
7770: 65 65 28 73 74 61 74 65 50 74 72 29 3b 0a 09 72  ee(statePtr);..r
7780: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7790: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
77a0: 6c 65 61 6e 2d 75 70 20 2a 2f 0a 20 20 20 20 44  lean-up */.    D
77b0: 69 67 65 73 74 53 74 61 74 65 46 72 65 65 28 73  igestStateFree(s
77c0: 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 72 65  tatePtr);.    re
77d0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
77e0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
77f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7820: 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  ****/../*. *----
7830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
7870: 20 2a 0a 20 2a 20 44 69 67 65 73 74 46 69 6c 65   *. * DigestFile
7880: 48 61 6e 64 6c 65 72 20 2d 2d 0a 20 2a 0a 20 2a  Handler --. *. *
7890: 09 52 65 74 75 72 6e 20 6d 65 73 73 61 67 65 20  .Return message 
78a0: 64 69 67 65 73 74 20 66 6f 72 20 66 69 6c 65 20  digest for file 
78b0: 75 73 69 6e 67 20 75 73 65 72 20 73 70 65 63 69  using user speci
78c0: 66 69 65 64 20 68 61 73 68 20 66 75 6e 63 74 69  fied hash functi
78d0: 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  on.. *. * Return
78e0: 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20  s:. *.TCL_OK or 
78f0: 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20  TCL_ERROR. *. * 
7900: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
7910: 09 52 65 73 75 6c 74 20 69 73 20 6d 65 73 73 61  .Result is messa
7920: 67 65 20 64 69 67 65 73 74 20 6f 72 20 65 72 72  ge digest or err
7930: 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a  or message. *. *
7940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7980: 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65  ---. */.int Dige
7990: 73 74 46 69 6c 65 48 61 6e 64 6c 65 72 28 54 63  stFileHandler(Tc
79a0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
79b0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 69 6e 46 69 6c  , Tcl_Obj *inFil
79c0: 65 4f 62 6a 2c 20 54 63 6c 5f 4f 62 6a 20 2a 64  eObj, Tcl_Obj *d
79d0: 69 67 65 73 74 4f 62 6a 2c 0a 09 54 63 6c 5f 4f  igestObj,..Tcl_O
79e0: 62 6a 20 2a 63 69 70 68 65 72 4f 62 6a 2c 20 69  bj *cipherObj, i
79f0: 6e 74 20 66 6f 72 6d 61 74 2c 20 54 63 6c 5f 4f  nt format, Tcl_O
7a00: 62 6a 20 2a 6b 65 79 4f 62 6a 2c 20 54 63 6c 5f  bj *keyObj, Tcl_
7a10: 4f 62 6a 20 2a 6d 61 63 4f 62 6a 29 20 7b 0a 20  Obj *macObj) {. 
7a20: 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a     DigestState *
7a30: 73 74 61 74 65 50 74 72 3b 0a 20 20 20 20 54 63  statePtr;.    Tc
7a40: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 20 3d  l_Channel chan =
7a50: 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e 73 69 67   NULL;.    unsig
7a60: 6e 65 64 20 63 68 61 72 20 62 75 66 5b 42 55 46  ned char buf[BUF
7a70: 46 45 52 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 69  FER_SIZE];.    i
7a80: 6e 74 20 72 65 73 20 3d 20 54 43 4c 5f 4f 4b 2c  nt res = TCL_OK,
7a90: 20 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 72 69 6e   len;..    dprin
7aa0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
7ab0: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 73 74 61     /* Create sta
7ac0: 74 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  te data structur
7ad0: 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 73 74  e */.    if ((st
7ae0: 61 74 65 50 74 72 20 3d 20 44 69 67 65 73 74 53  atePtr = DigestS
7af0: 74 61 74 65 4e 65 77 28 69 6e 74 65 72 70 2c 20  tateNew(interp, 
7b00: 66 6f 72 6d 61 74 29 29 20 3d 3d 20 4e 55 4c 4c  format)) == NULL
7b10: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
7b20: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4d  esult(interp, "M
7b30: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
7b40: 20 65 72 72 6f 72 22 2c 20 28 63 68 61 72 20 2a   error", (char *
7b50: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  ) NULL);..return
7b60: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
7b70: 7d 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66  }..    /* Open f
7b80: 69 6c 65 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  ile channel */. 
7b90: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 46 53     chan = Tcl_FS
7ba0: 4f 70 65 6e 46 69 6c 65 43 68 61 6e 6e 65 6c 28  OpenFileChannel(
7bb0: 69 6e 74 65 72 70 2c 20 69 6e 46 69 6c 65 4f 62  interp, inFileOb
7bc0: 6a 2c 20 22 72 62 22 2c 20 30 34 34 34 29 3b 0a  j, "rb", 0444);.
7bd0: 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20      if (chan == 
7be0: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
7bf0: 4c 4c 29 20 7b 0a 09 44 69 67 65 73 74 53 74 61  LL) {..DigestSta
7c00: 74 65 46 72 65 65 28 73 74 61 74 65 50 74 72 29  teFree(statePtr)
7c10: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
7c20: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
7c30: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 20 63 68 61  /* Configure cha
7c40: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28  nnel */.    if (
7c50: 28 72 65 73 20 3d 20 54 63 6c 5f 53 65 74 43 68  (res = Tcl_SetCh
7c60: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
7c70: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e  rp, chan, "-tran
7c80: 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72  slation", "binar
7c90: 79 22 29 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  y")) != TCL_OK) 
7ca0: 7b 0a 09 67 6f 74 6f 20 64 6f 6e 65 3b 0a 20 20  {..goto done;.  
7cb0: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74 43    }.    Tcl_SetC
7cc0: 68 61 6e 6e 65 6c 42 75 66 66 65 72 53 69 7a 65  hannelBufferSize
7cd0: 28 63 68 61 6e 2c 20 42 55 46 46 45 52 5f 53 49  (chan, BUFFER_SI
7ce0: 5a 45 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 69  ZE);..    /* Ini
7cf0: 74 69 61 6c 69 7a 65 20 68 61 73 68 20 66 75 6e  tialize hash fun
7d00: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 20  ction */.    if 
7d10: 28 28 72 65 73 20 3d 20 44 69 67 65 73 74 49 6e  ((res = DigestIn
7d20: 69 74 69 61 6c 69 7a 65 28 69 6e 74 65 72 70 2c  itialize(interp,
7d30: 20 73 74 61 74 65 50 74 72 2c 20 64 69 67 65 73   statePtr, diges
7d40: 74 4f 62 6a 2c 20 63 69 70 68 65 72 4f 62 6a 2c  tObj, cipherObj,
7d50: 20 6b 65 79 4f 62 6a 2c 20 6d 61 63 4f 62 6a 29   keyObj, macObj)
7d60: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
7d70: 67 6f 74 6f 20 64 6f 6e 65 3b 0a 20 20 20 20 7d  goto done;.    }
7d80: 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 66 69  ..    /* Read fi
7d90: 6c 65 20 64 61 74 61 20 61 6e 64 20 75 70 64 61  le data and upda
7da0: 74 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e  te hash function
7db0: 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 20 28 21   */.    while (!
7dc0: 54 63 6c 5f 45 6f 66 28 63 68 61 6e 29 29 20 7b  Tcl_Eof(chan)) {
7dd0: 0a 09 6c 65 6e 20 3d 20 54 63 6c 5f 52 65 61 64  ..len = Tcl_Read
7de0: 52 61 77 28 63 68 61 6e 2c 20 28 63 68 61 72 20  Raw(chan, (char 
7df0: 2a 29 20 62 75 66 2c 20 42 55 46 46 45 52 5f 53  *) buf, BUFFER_S
7e00: 49 5a 45 29 3b 0a 09 69 66 20 28 6c 65 6e 20 3e  IZE);..if (len >
7e10: 20 30 29 20 7b 0a 09 20 20 20 20 69 66 20 28 28   0) {..    if ((
7e20: 72 65 73 20 3d 20 44 69 67 65 73 74 55 70 64 61  res = DigestUpda
7e30: 74 65 28 73 74 61 74 65 50 74 72 2c 20 26 62 75  te(statePtr, &bu
7e40: 66 5b 30 5d 2c 20 28 73 69 7a 65 5f 74 29 20 6c  f[0], (size_t) l
7e50: 65 6e 2c 20 31 29 29 20 21 3d 20 54 43 4c 5f 4f  en, 1)) != TCL_O
7e60: 4b 29 20 7b 0a 09 09 67 6f 74 6f 20 64 6f 6e 65  K) {...goto done
7e70: 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20  ;..    }..}.    
7e80: 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69  }..    /* Finali
7e90: 7a 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e  ze hash function
7ea0: 20 61 6e 64 20 63 61 6c 63 75 6c 61 74 65 20 6d   and calculate m
7eb0: 65 73 73 61 67 65 20 64 69 67 65 73 74 20 2a 2f  essage digest */
7ec0: 0a 20 20 20 20 72 65 73 20 3d 20 44 69 67 65 73  .    res = Diges
7ed0: 74 46 69 6e 61 6c 69 7a 65 28 69 6e 74 65 72 70  tFinalize(interp
7ee0: 2c 20 73 74 61 74 65 50 74 72 2c 20 4e 55 4c 4c  , statePtr, NULL
7ef0: 29 3b 0a 0a 64 6f 6e 65 3a 0a 20 20 20 20 2f 2a  );..done:.    /*
7f00: 20 43 6c 6f 73 65 20 63 68 61 6e 6e 65 6c 20 2a   Close channel *
7f10: 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 43 6c  /.    if (Tcl_Cl
7f20: 6f 73 65 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  ose(interp, chan
7f30: 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20  ) == TCL_ERROR) 
7f40: 7b 0a 09 72 65 73 20 3d 20 54 43 4c 5f 45 52 52  {..res = TCL_ERR
7f50: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
7f60: 2a 20 43 6c 65 61 6e 2d 75 70 20 2a 2f 0a 20 20  * Clean-up */.  
7f70: 20 20 44 69 67 65 73 74 53 74 61 74 65 46 72 65    DigestStateFre
7f80: 65 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20  e(statePtr);.   
7f90: 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
7fa0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
7fb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7fc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7fd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7fe0: 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  ****/../*. *----
7ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
8030: 20 2a 0a 20 2a 20 44 69 67 65 73 74 4d 61 69 6e   *. * DigestMain
8040: 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 75 72 6e   --. *. *.Return
8050: 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20   message digest 
8060: 6f 72 20 4d 65 73 73 61 67 65 20 41 75 74 68 65  or Message Authe
8070: 6e 74 69 63 61 74 69 6f 6e 20 43 6f 64 65 20 28  ntication Code (
8080: 4d 41 43 29 20 6f 66 0a 20 2a 09 64 61 74 61 20  MAC) of. *.data 
8090: 75 73 69 6e 67 20 75 73 65 72 20 73 70 65 63 69  using user speci
80a0: 66 69 65 64 20 68 61 73 68 20 66 75 6e 63 74 69  fied hash functi
80b0: 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  on.. *. * Return
80c0: 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20  s:. *.TCL_OK or 
80d0: 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20  TCL_ERROR. *. * 
80e0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
80f0: 09 53 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20  .Sets result to 
8100: 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20 6f  message digest o
8110: 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  r error message.
8120: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
8130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8160: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
8170: 74 69 63 20 69 6e 74 20 44 69 67 65 73 74 4d 61  tic int DigestMa
8180: 69 6e 28 69 6e 74 20 74 79 70 65 2c 20 54 63 6c  in(int type, Tcl
8190: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
81a0: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
81b0: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
81c0: 29 20 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 2c  ) {.    int idx,
81d0: 20 73 74 61 72 74 20 3d 20 31 2c 20 66 6f 72 6d   start = 1, form
81e0: 61 74 20 3d 20 48 45 58 5f 46 4f 52 4d 41 54 2c  at = HEX_FORMAT,
81f0: 20 72 65 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20   res = TCL_OK;. 
8200: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 69 70 68     Tcl_Obj *ciph
8210: 65 72 4f 62 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 63  erObj = NULL, *c
8220: 6d 64 4f 62 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 64  mdObj = NULL, *d
8230: 61 74 61 4f 62 6a 20 3d 20 4e 55 4c 4c 2c 20 2a  ataObj = NULL, *
8240: 64 69 67 65 73 74 4f 62 6a 20 3d 20 4e 55 4c 4c  digestObj = NULL
8250: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 66  ;.    Tcl_Obj *f
8260: 69 6c 65 4f 62 6a 20 3d 20 4e 55 4c 4c 2c 20 2a  ileObj = NULL, *
8270: 6b 65 79 4f 62 6a 20 3d 20 4e 55 4c 4c 2c 20 2a  keyObj = NULL, *
8280: 6d 61 63 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20  macObj = NULL;. 
8290: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63     const char *c
82a0: 68 61 6e 6e 65 6c 20 3d 20 4e 55 4c 4c 2c 20 2a  hannel = NULL, *
82b0: 6f 70 74 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  opt;..    dprint
82c0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
82d0: 20 20 2f 2a 20 43 6c 65 61 72 20 69 6e 74 65 72    /* Clear inter
82e0: 70 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20  p result */.    
82f0: 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
8300: 69 6e 74 65 72 70 29 3b 0a 0a 20 20 20 20 2f 2a  interp);..    /*
8310: 20 56 61 6c 69 64 61 74 65 20 61 72 67 20 63 6f   Validate arg co
8320: 75 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f  unt */.    if (o
8330: 62 6a 63 20 3c 20 33 20 7c 7c 20 6f 62 6a 63 20  bjc < 3 || objc 
8340: 3e 20 31 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f  > 12) {..Tcl_Wro
8350: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
8360: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 62 69  , 1, objv, "?-bi
8370: 6e 7c 2d 68 65 78 3f 20 3f 2d 63 69 70 68 65 72  n|-hex? ?-cipher
8380: 20 6e 61 6d 65 3f 20 3f 2d 64 69 67 65 73 74 20   name? ?-digest 
8390: 6e 61 6d 65 3f 20 3f 2d 6b 65 79 20 6b 65 79 3f  name? ?-key key?
83a0: 20 3f 2d 6d 61 63 20 6e 61 6d 65 3f 20 5b 2d 63   ?-mac name? [-c
83b0: 68 61 6e 6e 65 6c 20 63 68 61 6e 20 7c 20 2d 63  hannel chan | -c
83c0: 6f 6d 6d 61 6e 64 20 63 6d 64 4e 61 6d 65 20 7c  ommand cmdName |
83d0: 20 2d 66 69 6c 65 20 66 69 6c 65 6e 61 6d 65 20   -file filename 
83e0: 7c 20 3f 2d 64 61 74 61 3f 20 64 61 74 61 5d 22  | ?-data? data]"
83f0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
8400: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
8410: 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65   /* Special case
8420: 20 6f 66 20 66 69 72 73 74 20 61 72 67 20 69 73   of first arg is
8430: 20 64 69 67 65 73 74 2c 20 63 69 70 68 65 72 2c   digest, cipher,
8440: 20 6f 72 20 6d 61 63 20 2a 2f 0a 20 20 20 20 6f   or mac */.    o
8450: 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  pt = Tcl_GetStri
8460: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 73  ngFromObj(objv[s
8470: 74 61 72 74 5d 2c 20 4e 55 4c 4c 29 3b 0a 20 20  tart], NULL);.  
8480: 20 20 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20    if (opt[0] != 
8490: 27 2d 27 29 20 7b 0a 09 69 66 20 28 74 79 70 65  '-') {..if (type
84a0: 20 3d 3d 20 54 59 50 45 5f 4d 44 20 7c 7c 20 74   == TYPE_MD || t
84b0: 79 70 65 20 3d 3d 20 54 59 50 45 5f 48 4d 41 43  ype == TYPE_HMAC
84c0: 29 20 7b 0a 09 20 20 20 20 64 69 67 65 73 74 4f  ) {..    digestO
84d0: 62 6a 20 3d 20 6f 62 6a 76 5b 73 74 61 72 74 5d  bj = objv[start]
84e0: 3b 0a 09 20 20 20 20 73 74 61 72 74 2b 2b 3b 0a  ;..    start++;.
84f0: 09 7d 20 65 6c 73 65 20 69 66 20 28 74 79 70 65  .} else if (type
8500: 20 3d 3d 20 54 59 50 45 5f 43 4d 41 43 29 20 7b   == TYPE_CMAC) {
8510: 0a 09 20 20 20 20 63 69 70 68 65 72 4f 62 6a 20  ..    cipherObj 
8520: 3d 20 6f 62 6a 76 5b 73 74 61 72 74 5d 3b 0a 09  = objv[start];..
8530: 20 20 20 20 73 74 61 72 74 2b 2b 3b 0a 09 7d 20      start++;..} 
8540: 65 6c 73 65 20 69 66 20 28 74 79 70 65 20 3d 3d  else if (type ==
8550: 20 54 59 50 45 5f 4d 41 43 29 20 7b 0a 09 20 20   TYPE_MAC) {..  
8560: 20 20 6d 61 63 4f 62 6a 20 3d 20 6f 62 6a 76 5b    macObj = objv[
8570: 73 74 61 72 74 5d 3b 0a 09 20 20 20 20 73 74 61  start];..    sta
8580: 72 74 2b 2b 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  rt++;..}.    }..
8590: 20 20 20 20 2f 2a 20 47 65 74 20 6f 70 74 69 6f      /* Get optio
85a0: 6e 73 20 2a 2f 0a 20 20 20 20 66 6f 72 20 28 69  ns */.    for (i
85b0: 64 78 20 3d 20 73 74 61 72 74 3b 20 69 64 78 20  dx = start; idx 
85c0: 3c 20 6f 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b  < objc; idx++) {
85d0: 0a 09 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53  ..opt = Tcl_GetS
85e0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
85f0: 76 5b 69 64 78 5d 2c 20 4e 55 4c 4c 29 3b 0a 0a  v[idx], NULL);..
8600: 09 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27  .if (opt[0] != '
8610: 2d 27 29 20 7b 0a 09 20 20 20 20 62 72 65 61 6b  -') {..    break
8620: 3b 0a 09 7d 0a 0a 09 4f 50 54 46 4c 41 47 28 22  ;..}...OPTFLAG("
8630: 2d 62 69 6e 22 2c 20 66 6f 72 6d 61 74 2c 20 42  -bin", format, B
8640: 49 4e 5f 46 4f 52 4d 41 54 29 3b 0a 09 4f 50 54  IN_FORMAT);..OPT
8650: 46 4c 41 47 28 22 2d 62 69 6e 61 72 79 22 2c 20  FLAG("-binary", 
8660: 66 6f 72 6d 61 74 2c 20 42 49 4e 5f 46 4f 52 4d  format, BIN_FORM
8670: 41 54 29 3b 0a 09 4f 50 54 46 4c 41 47 28 22 2d  AT);..OPTFLAG("-
8680: 68 65 78 22 2c 20 66 6f 72 6d 61 74 2c 20 48 45  hex", format, HE
8690: 58 5f 46 4f 52 4d 41 54 29 3b 0a 09 4f 50 54 46  X_FORMAT);..OPTF
86a0: 4c 41 47 28 22 2d 68 65 78 61 64 65 63 69 6d 61  LAG("-hexadecima
86b0: 6c 22 2c 20 66 6f 72 6d 61 74 2c 20 48 45 58 5f  l", format, HEX_
86c0: 46 4f 52 4d 41 54 29 3b 0a 09 4f 50 54 53 54 52  FORMAT);..OPTSTR
86d0: 28 22 2d 63 68 61 6e 22 2c 20 63 68 61 6e 6e 65  ("-chan", channe
86e0: 6c 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 68  l);..OPTSTR("-ch
86f0: 61 6e 6e 65 6c 22 2c 20 63 68 61 6e 6e 65 6c 29  annel", channel)
8700: 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 63 69 70 68  ;..OPTOBJ("-ciph
8710: 65 72 22 2c 20 63 69 70 68 65 72 4f 62 6a 29 3b  er", cipherObj);
8720: 0a 09 4f 50 54 4f 42 4a 28 22 2d 63 6f 6d 6d 61  ..OPTOBJ("-comma
8730: 6e 64 22 2c 20 63 6d 64 4f 62 6a 29 3b 0a 09 4f  nd", cmdObj);..O
8740: 50 54 4f 42 4a 28 22 2d 64 61 74 61 22 2c 20 64  PTOBJ("-data", d
8750: 61 74 61 4f 62 6a 29 3b 0a 09 4f 50 54 4f 42 4a  ataObj);..OPTOBJ
8760: 28 22 2d 64 69 67 65 73 74 22 2c 20 64 69 67 65  ("-digest", dige
8770: 73 74 4f 62 6a 29 3b 0a 09 4f 50 54 4f 42 4a 28  stObj);..OPTOBJ(
8780: 22 2d 66 69 6c 65 22 2c 20 66 69 6c 65 4f 62 6a  "-file", fileObj
8790: 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 66 69 6c  );..OPTOBJ("-fil
87a0: 65 6e 61 6d 65 22 2c 20 66 69 6c 65 4f 62 6a 29  ename", fileObj)
87b0: 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 6b 65 79 22  ;..OPTOBJ("-key"
87c0: 2c 20 6b 65 79 4f 62 6a 29 3b 0a 09 4f 50 54 4f  , keyObj);..OPTO
87d0: 42 4a 28 22 2d 6d 61 63 22 2c 20 6d 61 63 4f 62  BJ("-mac", macOb
87e0: 6a 29 3b 0a 0a 09 4f 50 54 42 41 44 28 22 6f 70  j);...OPTBAD("op
87f0: 74 69 6f 6e 22 2c 20 22 2d 62 69 6e 2c 20 2d 63  tion", "-bin, -c
8800: 68 61 6e 6e 65 6c 2c 20 2d 63 69 70 68 65 72 2c  hannel, -cipher,
8810: 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 61 74 61   -command, -data
8820: 2c 20 2d 64 69 67 65 73 74 2c 20 2d 66 69 6c 65  , -digest, -file
8830: 2c 20 2d 66 69 6c 65 6e 61 6d 65 2c 20 2d 68 65  , -filename, -he
8840: 78 2c 20 2d 6b 65 79 2c 20 6f 72 20 2d 6d 61 63  x, -key, or -mac
8850: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ");..return TCL_
8860: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
8870: 20 20 2f 2a 20 49 66 20 6f 6e 6c 79 20 31 20 61    /* If only 1 a
8880: 72 67 20 6c 65 66 74 2c 20 69 74 27 73 20 74 68  rg left, it's th
8890: 65 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 69 66  e data */.    if
88a0: 20 28 69 64 78 20 3c 20 6f 62 6a 63 20 26 26 20   (idx < objc && 
88b0: 64 61 74 61 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29  dataObj == NULL)
88c0: 20 7b 0a 09 64 61 74 61 4f 62 6a 20 3d 20 6f 62   {..dataObj = ob
88d0: 6a 76 5b 69 64 78 5d 3b 0a 20 20 20 20 7d 0a 0a  jv[idx];.    }..
88e0: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 79 70      /* Check typ
88f0: 65 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 74 79  es */.    if (ty
8900: 70 65 20 3d 3d 20 54 59 50 45 5f 4d 44 20 26 26  pe == TYPE_MD &&
8910: 20 63 69 70 68 65 72 4f 62 6a 20 21 3d 20 4e 55   cipherObj != NU
8920: 4c 4c 29 20 7b 0a 09 74 79 70 65 20 3d 20 54 59  LL) {..type = TY
8930: 50 45 5f 43 4d 41 43 3b 0a 20 20 20 20 7d 20 65  PE_CMAC;.    } e
8940: 6c 73 65 20 69 66 20 28 74 79 70 65 20 3d 3d 20  lse if (type == 
8950: 54 59 50 45 5f 4d 44 20 26 26 20 6b 65 79 4f 62  TYPE_MD && keyOb
8960: 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 74 79  j != NULL) {..ty
8970: 70 65 20 3d 20 54 59 50 45 5f 48 4d 41 43 3b 0a  pe = TYPE_HMAC;.
8980: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 61      }..    /* Ca
8990: 6c 63 20 64 69 67 65 73 74 20 6f 6e 20 66 69 6c  lc digest on fil
89a0: 65 2c 20 73 74 61 63 6b 65 64 20 63 68 61 6e 6e  e, stacked chann
89b0: 65 6c 2c 20 75 73 69 6e 67 20 69 6e 73 74 61 6e  el, using instan
89c0: 63 65 20 63 6f 6d 6d 61 6e 64 2c 20 6f 72 20 64  ce command, or d
89d0: 61 74 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 20 20  ata blob */.    
89e0: 69 66 20 28 66 69 6c 65 4f 62 6a 20 21 3d 20 4e  if (fileObj != N
89f0: 55 4c 4c 29 20 7b 0a 09 72 65 73 20 3d 20 44 69  ULL) {..res = Di
8a00: 67 65 73 74 46 69 6c 65 48 61 6e 64 6c 65 72 28  gestFileHandler(
8a10: 69 6e 74 65 72 70 2c 20 66 69 6c 65 4f 62 6a 2c  interp, fileObj,
8a20: 20 64 69 67 65 73 74 4f 62 6a 2c 20 63 69 70 68   digestObj, ciph
8a30: 65 72 4f 62 6a 2c 20 66 6f 72 6d 61 74 20 7c 20  erObj, format | 
8a40: 74 79 70 65 2c 20 6b 65 79 4f 62 6a 2c 20 6d 61  type, keyObj, ma
8a50: 63 4f 62 6a 29 3b 0a 20 20 20 20 7d 20 65 6c 73  cObj);.    } els
8a60: 65 20 69 66 20 28 63 68 61 6e 6e 65 6c 20 21 3d  e if (channel !=
8a70: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 20 3d 20   NULL) {..res = 
8a80: 44 69 67 65 73 74 43 68 61 6e 6e 65 6c 48 61 6e  DigestChannelHan
8a90: 64 6c 65 72 28 69 6e 74 65 72 70 2c 20 63 68 61  dler(interp, cha
8aa0: 6e 6e 65 6c 2c 20 64 69 67 65 73 74 4f 62 6a 2c  nnel, digestObj,
8ab0: 20 63 69 70 68 65 72 4f 62 6a 2c 20 66 6f 72 6d   cipherObj, form
8ac0: 61 74 20 7c 20 74 79 70 65 2c 20 6b 65 79 4f 62  at | type, keyOb
8ad0: 6a 2c 20 6d 61 63 4f 62 6a 29 3b 0a 20 20 20 20  j, macObj);.    
8ae0: 7d 20 65 6c 73 65 20 69 66 20 28 63 6d 64 4f 62  } else if (cmdOb
8af0: 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  j != NULL) {..re
8b00: 73 20 3d 20 44 69 67 65 73 74 43 6f 6d 6d 61 6e  s = DigestComman
8b10: 64 48 61 6e 64 6c 65 72 28 69 6e 74 65 72 70 2c  dHandler(interp,
8b20: 20 63 6d 64 4f 62 6a 2c 20 64 69 67 65 73 74 4f   cmdObj, digestO
8b30: 62 6a 2c 20 63 69 70 68 65 72 4f 62 6a 2c 20 66  bj, cipherObj, f
8b40: 6f 72 6d 61 74 20 7c 20 74 79 70 65 2c 20 6b 65  ormat | type, ke
8b50: 79 4f 62 6a 2c 20 6d 61 63 4f 62 6a 29 3b 0a 20  yObj, macObj);. 
8b60: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 64 61     } else if (da
8b70: 74 61 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b  taObj != NULL) {
8b80: 0a 09 72 65 73 20 3d 20 44 69 67 65 73 74 44 61  ..res = DigestDa
8b90: 74 61 48 61 6e 64 6c 65 72 28 69 6e 74 65 72 70  taHandler(interp
8ba0: 2c 20 64 61 74 61 4f 62 6a 2c 20 64 69 67 65 73  , dataObj, diges
8bb0: 74 4f 62 6a 2c 20 63 69 70 68 65 72 4f 62 6a 2c  tObj, cipherObj,
8bc0: 20 66 6f 72 6d 61 74 20 7c 20 74 79 70 65 2c 20   format | type, 
8bd0: 6b 65 79 4f 62 6a 2c 20 6d 61 63 4f 62 6a 29 3b  keyObj, macObj);
8be0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54  .    } else {..T
8bf0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
8c00: 69 6e 74 65 72 70 2c 20 22 4e 6f 20 6f 70 65 72  interp, "No oper
8c10: 61 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 3a  ation specified:
8c20: 20 55 73 65 20 2d 63 68 61 6e 6e 65 6c 2c 20 2d   Use -channel, -
8c30: 63 6f 6d 6d 61 6e 64 2c 20 2d 64 61 74 61 2c 20  command, -data, 
8c40: 6f 72 20 2d 66 69 6c 65 20 6f 70 74 69 6f 6e 22  or -file option"
8c50: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 73 20 3d 20  , NULL);..res = 
8c60: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
8c70: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b  .    return res;
8c80: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
8c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
8cd0: 20 2a 20 4d 65 73 73 61 67 65 20 44 69 67 65 73   * Message Diges
8ce0: 74 20 61 6e 64 20 4d 65 73 73 61 67 65 20 41 75  t and Message Au
8cf0: 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 43 6f 64  thentication Cod
8d00: 65 20 43 6f 6d 6d 61 6e 64 73 20 2d 2d 0a 20 2a  e Commands --. *
8d10: 0a 20 2a 09 52 65 74 75 72 6e 20 4d 65 73 73 61  . *.Return Messa
8d20: 67 65 20 44 69 67 65 73 74 20 28 4d 44 29 20 6f  ge Digest (MD) o
8d30: 72 20 4d 65 73 73 61 67 65 20 41 75 74 68 65 6e  r Message Authen
8d40: 74 69 63 61 74 69 6f 6e 20 43 6f 64 65 20 28 4d  tication Code (M
8d50: 41 43 29 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72  AC).. *. * Retur
8d60: 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72  ns:. *.TCL_OK or
8d70: 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a   TCL_ERROR. *. *
8d80: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
8d90: 2a 09 53 65 74 73 20 72 65 73 75 6c 74 20 74 6f  *.Sets result to
8da0: 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20   message digest 
8db0: 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  or error message
8dc0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
8dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
8e10: 61 74 69 63 20 69 6e 74 20 4d 64 4f 62 6a 43 6d  atic int MdObjCm
8e20: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  d(ClientData cli
8e30: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  entData, Tcl_Int
8e40: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
8e50: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
8e60: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a  const objv[]) {.
8e70: 20 20 20 20 72 65 74 75 72 6e 20 44 69 67 65 73      return Diges
8e80: 74 4d 61 69 6e 28 54 59 50 45 5f 4d 44 2c 20 69  tMain(TYPE_MD, i
8e90: 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a  nterp, objc, obj
8ea0: 76 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  v);.}..static in
8eb0: 74 20 43 4d 41 43 4f 62 6a 43 6d 64 28 43 6c 69  t CMACObjCmd(Cli
8ec0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
8ed0: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
8ee0: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
8ef0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
8f00: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 72   objv[]) {.    r
8f10: 65 74 75 72 6e 20 44 69 67 65 73 74 4d 61 69 6e  eturn DigestMain
8f20: 28 54 59 50 45 5f 43 4d 41 43 2c 20 69 6e 74 65  (TYPE_CMAC, inte
8f30: 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b  rp, objc, objv);
8f40: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 48  .}..static int H
8f50: 4d 41 43 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74  MACObjCmd(Client
8f60: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
8f70: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
8f80: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
8f90: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
8fa0: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74 75  jv[]) {.    retu
8fb0: 72 6e 20 44 69 67 65 73 74 4d 61 69 6e 28 54 59  rn DigestMain(TY
8fc0: 50 45 5f 48 4d 41 43 2c 20 69 6e 74 65 72 70 2c  PE_HMAC, interp,
8fd0: 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 7d 0a   objc, objv);.}.
8fe0: 0a 73 74 61 74 69 63 20 69 6e 74 20 4d 41 43 4f  .static int MACO
8ff0: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
9000: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
9010: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
9020: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
9030: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
9040: 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 44  ) {.    return D
9050: 69 67 65 73 74 4d 61 69 6e 28 54 59 50 45 5f 4d  igestMain(TYPE_M
9060: 41 43 2c 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63  AC, interp, objc
9070: 2c 20 6f 62 6a 76 29 3b 0a 7d 0a 0a 2f 2a 0a 20  , objv);.}../*. 
9080: 2a 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 2d 2d 2d 2d  ----------------
90c0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 65 73 73 61  ----. *. * Messa
90d0: 67 65 20 44 69 67 65 73 74 20 43 6f 6e 76 65 6e  ge Digest Conven
90e0: 69 65 6e 63 65 20 43 6f 6d 6d 61 6e 64 73 20 2d  ience Commands -
90f0: 2d 0a 20 2a 0a 20 2a 09 43 6f 6e 76 65 6e 69 65  -. *. *.Convenie
9100: 6e 63 65 20 63 6f 6d 6d 61 6e 64 73 20 66 6f 72  nce commands for
9110: 20 73 65 6c 65 63 74 20 6d 65 73 73 61 67 65 20   select message 
9120: 64 69 67 65 73 74 73 2e 0a 20 2a 0a 20 2a 20 52  digests.. *. * R
9130: 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f  eturns:. *.TCL_O
9140: 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20  K or TCL_ERROR. 
9150: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
9160: 73 3a 0a 20 2a 09 53 65 74 73 20 72 65 73 75 6c  s:. *.Sets resul
9170: 74 20 74 6f 20 6d 65 73 73 61 67 65 20 64 69 67  t to message dig
9180: 65 73 74 20 6f 72 20 65 72 72 6f 72 20 6d 65 73  est or error mes
9190: 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  sage. *. *------
91a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
91e0: 2f 0a 20 23 64 65 66 69 6e 65 20 76 61 6c 69 64  /. #define valid
91f0: 61 74 65 5f 61 72 67 63 28 6f 62 6a 63 2c 20 6f  ate_argc(objc, o
9200: 62 6a 76 29 20 7b 20 5c 0a 20 20 20 20 69 66 20  bjv) { \.    if 
9210: 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 20 5c 0a  (objc != 2) { \.
9220: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
9230: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
9240: 76 2c 20 22 64 61 74 61 22 29 3b 20 5c 0a 09 72  v, "data"); \..r
9250: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9260: 20 5c 0a 20 20 20 20 7d 20 5c 0a 7d 0a 20 0a 69   \.    } \.}. .i
9270: 6e 74 20 4d 44 34 4f 62 6a 43 6d 64 28 43 6c 69  nt MD4ObjCmd(Cli
9280: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
9290: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
92a0: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
92b0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
92c0: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 76   objv[]) {.    v
92d0: 61 6c 69 64 61 74 65 5f 61 72 67 63 28 6f 62 6a  alidate_argc(obj
92e0: 63 2c 20 6f 62 6a 76 29 3b 0a 20 20 20 20 72 65  c, objv);.    re
92f0: 74 75 72 6e 20 44 69 67 65 73 74 44 61 74 61 48  turn DigestDataH
9300: 61 6e 64 6c 65 72 28 69 6e 74 65 72 70 2c 20 6f  andler(interp, o
9310: 62 6a 76 5b 31 5d 2c 20 45 56 50 5f 6d 64 34 28  bjv[1], EVP_md4(
9320: 29 2c 20 4e 55 4c 4c 2c 20 48 45 58 5f 46 4f 52  ), NULL, HEX_FOR
9330: 4d 41 54 20 7c 20 54 59 50 45 5f 4d 44 2c 20 4e  MAT | TYPE_MD, N
9340: 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 69  ULL, NULL);.}..i
9350: 6e 74 20 4d 44 35 4f 62 6a 43 6d 64 28 43 6c 69  nt MD5ObjCmd(Cli
9360: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
9370: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
9380: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
9390: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
93a0: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 76   objv[]) {.    v
93b0: 61 6c 69 64 61 74 65 5f 61 72 67 63 28 6f 62 6a  alidate_argc(obj
93c0: 63 2c 20 6f 62 6a 76 29 3b 0a 20 20 20 20 72 65  c, objv);.    re
93d0: 74 75 72 6e 20 44 69 67 65 73 74 44 61 74 61 48  turn DigestDataH
93e0: 61 6e 64 6c 65 72 28 69 6e 74 65 72 70 2c 20 6f  andler(interp, o
93f0: 62 6a 76 5b 31 5d 2c 20 45 56 50 5f 6d 64 35 28  bjv[1], EVP_md5(
9400: 29 2c 20 4e 55 4c 4c 2c 20 48 45 58 5f 46 4f 52  ), NULL, HEX_FOR
9410: 4d 41 54 20 7c 20 54 59 50 45 5f 4d 44 2c 20 4e  MAT | TYPE_MD, N
9420: 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 69  ULL, NULL);.}..i
9430: 6e 74 20 53 48 41 31 4f 62 6a 43 6d 64 28 43 6c  nt SHA1ObjCmd(Cl
9440: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
9450: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
9460: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
9470: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
9480: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
9490: 76 61 6c 69 64 61 74 65 5f 61 72 67 63 28 6f 62  validate_argc(ob
94a0: 6a 63 2c 20 6f 62 6a 76 29 3b 0a 20 20 20 20 72  jc, objv);.    r
94b0: 65 74 75 72 6e 20 44 69 67 65 73 74 44 61 74 61  eturn DigestData
94c0: 48 61 6e 64 6c 65 72 28 69 6e 74 65 72 70 2c 20  Handler(interp, 
94d0: 6f 62 6a 76 5b 31 5d 2c 20 45 56 50 5f 73 68 61  objv[1], EVP_sha
94e0: 31 28 29 2c 20 4e 55 4c 4c 2c 20 48 45 58 5f 46  1(), NULL, HEX_F
94f0: 4f 52 4d 41 54 20 7c 20 54 59 50 45 5f 4d 44 2c  ORMAT | TYPE_MD,
9500: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a   NULL, NULL);.}.
9510: 0a 69 6e 74 20 53 48 41 32 35 36 4f 62 6a 43 6d  .int SHA256ObjCm
9520: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  d(ClientData cli
9530: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  entData, Tcl_Int
9540: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
9550: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
9560: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a  const objv[]) {.
9570: 20 20 20 20 76 61 6c 69 64 61 74 65 5f 61 72 67      validate_arg
9580: 63 28 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 20  c(objc, objv);. 
9590: 20 20 20 72 65 74 75 72 6e 20 44 69 67 65 73 74     return Digest
95a0: 44 61 74 61 48 61 6e 64 6c 65 72 28 69 6e 74 65  DataHandler(inte
95b0: 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 45 56 50  rp, objv[1], EVP
95c0: 5f 73 68 61 32 35 36 28 29 2c 20 4e 55 4c 4c 2c  _sha256(), NULL,
95d0: 20 48 45 58 5f 46 4f 52 4d 41 54 20 7c 20 54 59   HEX_FORMAT | TY
95e0: 50 45 5f 4d 44 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  PE_MD, NULL, NUL
95f0: 4c 29 3b 0a 7d 0a 0a 69 6e 74 20 53 48 41 35 31  L);.}..int SHA51
9600: 32 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61  2ObjCmd(ClientDa
9610: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
9620: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
9630: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
9640: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
9650: 5b 5d 29 20 7b 0a 20 20 20 20 76 61 6c 69 64 61  []) {.    valida
9660: 74 65 5f 61 72 67 63 28 6f 62 6a 63 2c 20 6f 62  te_argc(objc, ob
9670: 6a 76 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  jv);.    return 
9680: 44 69 67 65 73 74 44 61 74 61 48 61 6e 64 6c 65  DigestDataHandle
9690: 72 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31  r(interp, objv[1
96a0: 5d 2c 20 45 56 50 5f 73 68 61 35 31 32 28 29 2c  ], EVP_sha512(),
96b0: 20 4e 55 4c 4c 2c 20 48 45 58 5f 46 4f 52 4d 41   NULL, HEX_FORMA
96c0: 54 20 7c 20 54 59 50 45 5f 4d 44 2c 20 4e 55 4c  T | TYPE_MD, NUL
96d0: 4c 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 2f 2a 0a  L, NULL);.}../*.
96e0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
96f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9720: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f  -----. *. * Tls_
9730: 44 69 67 65 73 74 43 6f 6d 6d 61 6e 64 73 20 2d  DigestCommands -
9740: 2d 0a 20 2a 0a 20 2a 09 43 72 65 61 74 65 20 64  -. *. *.Create d
9750: 69 67 65 73 74 20 63 6f 6d 6d 61 6e 64 73 0a 20  igest commands. 
9760: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a  *. * Returns:. *
9770: 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45  .TCL_OK or TCL_E
9780: 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20  RROR. *. * Side 
9790: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 72 65 61  effects:. *.Crea
97a0: 74 65 73 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a  tes commands. *.
97b0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
97c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
97d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
97e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
97f0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 54 6c  -----. */.int Tl
9800: 73 5f 44 69 67 65 73 74 43 6f 6d 6d 61 6e 64 73  s_DigestCommands
9810: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
9820: 65 72 70 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43  erp) {.    Tcl_C
9830: 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
9840: 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 64 69  interp, "tls::di
9850: 67 65 73 74 22 2c 20 4d 64 4f 62 6a 43 6d 64 2c  gest", MdObjCmd,
9860: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c   (ClientData) 0,
9870: 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
9880: 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
9890: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
98a0: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
98b0: 74 6c 73 3a 3a 6d 64 22 2c 20 4d 64 4f 62 6a 43  tls::md", MdObjC
98c0: 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
98d0: 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65   0, (Tcl_CmdDele
98e0: 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
98f0: 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
9900: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
9910: 2c 20 22 74 6c 73 3a 3a 63 6d 61 63 22 2c 20 43  , "tls::cmac", C
9920: 4d 41 43 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65  MACObjCmd, (Clie
9930: 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f  ntData) 0, (Tcl_
9940: 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
9950: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f   NULL);.    Tcl_
9960: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
9970: 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 68  (interp, "tls::h
9980: 6d 61 63 22 2c 20 48 4d 41 43 4f 62 6a 43 6d 64  mac", HMACObjCmd
9990: 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30  , (ClientData) 0
99a0: 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
99b0: 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Proc *) NULL);. 
99c0: 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
99d0: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
99e0: 22 74 6c 73 3a 3a 6d 61 63 22 2c 20 4d 41 43 4f  "tls::mac", MACO
99f0: 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61  bjCmd, (ClientDa
9a00: 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44  ta) 0, (Tcl_CmdD
9a10: 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
9a20: 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  L);.    Tcl_Crea
9a30: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
9a40: 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 64 34 22 2c  erp, "tls::md4",
9a50: 20 4d 44 34 4f 62 6a 43 6d 64 2c 20 28 43 6c 69   MD4ObjCmd, (Cli
9a60: 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c  entData) 0, (Tcl
9a70: 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
9a80: 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c  ) NULL);.    Tcl
9a90: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
9aa0: 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  d(interp, "tls::
9ab0: 6d 64 35 22 2c 20 4d 44 35 4f 62 6a 43 6d 64 2c  md5", MD5ObjCmd,
9ac0: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c   (ClientData) 0,
9ad0: 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
9ae0: 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
9af0: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
9b00: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
9b10: 74 6c 73 3a 3a 73 68 61 31 22 2c 20 53 48 41 31  tls::sha1", SHA1
9b20: 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44  ObjCmd, (ClientD
9b30: 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64  ata) 0, (Tcl_Cmd
9b40: 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
9b50: 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65  LL);.    Tcl_Cre
9b60: 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
9b70: 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 68 61 32  terp, "tls::sha2
9b80: 35 36 22 2c 20 53 48 41 32 35 36 4f 62 6a 43 6d  56", SHA256ObjCm
9b90: 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  d, (ClientData) 
9ba0: 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  0, (Tcl_CmdDelet
9bb0: 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
9bc0: 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
9bd0: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
9be0: 20 22 74 6c 73 3a 3a 73 68 61 35 31 32 22 2c 20   "tls::sha512", 
9bf0: 53 48 41 35 31 32 4f 62 6a 43 6d 64 2c 20 28 43  SHA512ObjCmd, (C
9c00: 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54  lientData) 0, (T
9c10: 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
9c20: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
9c30: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
9c40: 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  and(interp, "tls
9c50: 3a 3a 75 6e 73 74 61 63 6b 22 2c 20 44 69 67 65  ::unstack", Dige
9c60: 73 74 55 6e 73 74 61 63 6b 4f 62 6a 43 6d 64 2c  stUnstackObjCmd,
9c70: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c   (ClientData) 0,
9c80: 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
9c90: 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
9ca0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
9cb0: 0a 7d 0a 0a                                      .}..