Hex Artifact Content

Artifact 83013db8978bdc20549a341ec5cc6c2d063960f420b3cb8ad16711355b20de9b:


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 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56  0..#if OPENSSL_V
0310: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 3d  ERSION_NUMBER <=
0320: 20 30 78 33 30 30 30 30 30 30 30 4c 0a 23 64 65   0x30000000L.#de
0330: 66 69 6e 65 20 45 56 50 5f 4d 41 43 20 76 6f 69  fine EVP_MAC voi
0340: 64 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20  d.#endif../*. * 
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 43 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 43 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 63 6f 6e 73 74 20 45 56 50 5f 4d 44  tr, const EVP_MD
0f60: 20 2a 6d 64 2c 0a 09 63 6f 6e 73 74 20 45 56 50   *md,..const EVP
0f70: 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 2c  _CIPHER *cipher,
0f80: 20 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4f 62 6a   Tcl_Obj *keyObj
0f90: 2c 20 45 56 50 5f 4d 41 43 20 2a 6d 61 63 29 20  , EVP_MAC *mac) 
0fa0: 7b 0a 20 20 20 20 69 6e 74 20 6b 65 79 5f 6c 65  {.    int key_le
0fb0: 6e 20 3d 20 30 2c 20 72 65 73 20 3d 20 30 3b 0a  n = 0, res = 0;.
0fc0: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
0fd0: 65 64 20 63 68 61 72 20 2a 6b 65 79 20 3d 20 4e  ed char *key = N
0fe0: 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65  ULL;..    /* Cre
0ff0: 61 74 65 20 6d 65 73 73 61 67 65 20 64 69 67 65  ate message dige
1000: 73 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  st context */.  
1010: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
1020: 66 6f 72 6d 61 74 20 26 20 54 59 50 45 5f 4d 44  format & TYPE_MD
1030: 29 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63  ) {..statePtr->c
1040: 74 78 20 3d 20 45 56 50 5f 4d 44 5f 43 54 58 5f  tx = EVP_MD_CTX_
1050: 6e 65 77 28 29 3b 0a 09 72 65 73 20 3d 20 28 73  new();..res = (s
1060: 74 61 74 65 50 74 72 2d 3e 63 74 78 20 21 3d 20  tatePtr->ctx != 
1070: 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 20 65 6c 73  NULL);.    } els
1080: 65 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e  e if (statePtr->
1090: 66 6f 72 6d 61 74 20 26 20 54 59 50 45 5f 48 4d  format & TYPE_HM
10a0: 41 43 29 20 7b 0a 09 73 74 61 74 65 50 74 72 2d  AC) {..statePtr-
10b0: 3e 68 63 74 78 20 3d 20 48 4d 41 43 5f 43 54 58  >hctx = HMAC_CTX
10c0: 5f 6e 65 77 28 29 3b 0a 09 72 65 73 20 3d 20 28  _new();..res = (
10d0: 73 74 61 74 65 50 74 72 2d 3e 68 63 74 78 20 21  statePtr->hctx !
10e0: 3d 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 20 65  = NULL);.    } e
10f0: 6c 73 65 20 69 66 20 28 73 74 61 74 65 50 74 72  lse if (statePtr
1100: 2d 3e 66 6f 72 6d 61 74 20 26 20 54 59 50 45 5f  ->format & TYPE_
1110: 43 4d 41 43 29 20 7b 0a 09 73 74 61 74 65 50 74  CMAC) {..statePt
1120: 72 2d 3e 63 63 74 78 20 3d 20 43 4d 41 43 5f 43  r->cctx = CMAC_C
1130: 54 58 5f 6e 65 77 28 29 3b 0a 09 72 65 73 20 3d  TX_new();..res =
1140: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 63 74 78   (statePtr->cctx
1150: 20 21 3d 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d   != NULL);.    }
1160: 0a 20 20 20 20 69 66 20 28 21 72 65 73 29 20 7b  .    if (!res) {
1170: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
1180: 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 72 65 61  lt(interp, "Crea
1190: 74 65 20 63 6f 6e 74 65 78 74 20 66 61 69 6c 65  te context faile
11a0: 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20  d: ", REASON(), 
11b0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
11c0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
11d0: 0a 20 20 20 20 2f 2a 20 47 65 74 20 6b 65 79 20  .    /* Get key 
11e0: 2a 2f 0a 20 20 20 20 69 66 20 28 6b 65 79 4f 62  */.    if (keyOb
11f0: 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6b 65  j != NULL) {..ke
1200: 79 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41  y = Tcl_GetByteA
1210: 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6b 65 79 4f  rrayFromObj(keyO
1220: 62 6a 2c 20 26 6b 65 79 5f 6c 65 6e 29 3b 0a 20  bj, &key_len);. 
1230: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 69     }..    /* Ini
1240: 74 69 61 6c 69 7a 65 20 68 61 73 68 20 66 75 6e  tialize hash fun
1250: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 20  ction */.    if 
1260: 28 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61  (statePtr->forma
1270: 74 20 26 20 54 59 50 45 5f 4d 44 29 20 7b 0a 09  t & TYPE_MD) {..
1280: 72 65 73 20 3d 20 45 56 50 5f 44 69 67 65 73 74  res = EVP_Digest
1290: 49 6e 69 74 5f 65 78 28 73 74 61 74 65 50 74 72  Init_ex(statePtr
12a0: 2d 3e 63 74 78 2c 20 6d 64 2c 20 4e 55 4c 4c 29  ->ctx, md, NULL)
12b0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ;.    } else if 
12c0: 28 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61  (statePtr->forma
12d0: 74 20 26 20 54 59 50 45 5f 48 4d 41 43 29 20 7b  t & TYPE_HMAC) {
12e0: 0a 09 72 65 73 20 3d 20 48 4d 41 43 5f 49 6e 69  ..res = HMAC_Ini
12f0: 74 5f 65 78 28 73 74 61 74 65 50 74 72 2d 3e 68  t_ex(statePtr->h
1300: 63 74 78 2c 20 28 63 6f 6e 73 74 20 76 6f 69 64  ctx, (const void
1310: 20 2a 29 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e   *) key, key_len
1320: 2c 20 6d 64 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  , md, NULL);.   
1330: 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 61 74   } else if (stat
1340: 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20 54  ePtr->format & T
1350: 59 50 45 5f 43 4d 41 43 29 20 7b 0a 09 72 65 73  YPE_CMAC) {..res
1360: 20 3d 20 43 4d 41 43 5f 49 6e 69 74 28 73 74 61   = CMAC_Init(sta
1370: 74 65 50 74 72 2d 3e 63 63 74 78 2c 20 28 63 6f  tePtr->cctx, (co
1380: 6e 73 74 20 76 6f 69 64 20 2a 29 20 6b 65 79 2c  nst void *) key,
1390: 20 6b 65 79 5f 6c 65 6e 2c 20 63 69 70 68 65 72   key_len, cipher
13a0: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20  , NULL);.    }. 
13b0: 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 0a 09     if (!res) {..
13c0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
13d0: 28 69 6e 74 65 72 70 2c 20 22 49 6e 69 74 69 61  (interp, "Initia
13e0: 6c 69 7a 65 20 66 61 69 6c 65 64 3a 20 22 2c 20  lize failed: ", 
13f0: 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b  REASON(), NULL);
1400: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
1410: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  OR;.    }.    re
1420: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1430: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
1440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1470: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44  --------. *. * D
1480: 69 67 65 73 74 55 70 64 61 74 65 20 2d 2d 0a 20  igestUpdate --. 
1490: 2a 0a 20 2a 09 55 70 64 61 74 65 20 61 20 68 61  *. *.Update a ha
14a0: 73 68 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  sh function with
14b0: 20 64 61 74 61 0a 20 2a 0a 20 2a 20 52 65 74 75   data. *. * Retu
14c0: 72 6e 73 3a 0a 20 2a 09 31 20 69 66 20 73 75 63  rns:. *.1 if suc
14d0: 63 65 73 73 66 75 6c 20 6f 72 20 30 20 66 6f 72  cessful or 0 for
14e0: 20 66 61 69 6c 75 72 65 0a 20 2a 0a 20 2a 20 53   failure. *. * S
14f0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
1500: 41 64 64 73 20 62 75 66 20 64 61 74 61 20 74 6f  Adds buf data to
1510: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 6f   hash function o
1520: 72 20 73 65 74 73 20 72 65 73 75 6c 74 20 74 6f  r sets result to
1530: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20   error message. 
1540: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
1550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1580: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20  -------. */.int 
1590: 44 69 67 65 73 74 55 70 64 61 74 65 28 44 69 67  DigestUpdate(Dig
15a0: 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50  estState *stateP
15b0: 74 72 2c 20 63 68 61 72 20 2a 62 75 66 2c 20 73  tr, char *buf, s
15c0: 69 7a 65 5f 74 20 72 65 61 64 2c 20 69 6e 74 20  ize_t read, int 
15d0: 64 6f 5f 72 65 73 75 6c 74 29 20 7b 0a 20 20 20  do_result) {.   
15e0: 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 0a 20   int res = 0;.. 
15f0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
1600: 3e 66 6f 72 6d 61 74 20 26 20 54 59 50 45 5f 4d  >format & TYPE_M
1610: 44 29 20 7b 0a 09 72 65 73 20 3d 20 45 56 50 5f  D) {..res = EVP_
1620: 44 69 67 65 73 74 55 70 64 61 74 65 28 73 74 61  DigestUpdate(sta
1630: 74 65 50 74 72 2d 3e 63 74 78 2c 20 62 75 66 2c  tePtr->ctx, buf,
1640: 20 72 65 61 64 29 3b 0a 20 20 20 20 7d 20 65 6c   read);.    } el
1650: 73 65 20 69 66 20 28 73 74 61 74 65 50 74 72 2d  se if (statePtr-
1660: 3e 66 6f 72 6d 61 74 20 26 20 54 59 50 45 5f 48  >format & TYPE_H
1670: 4d 41 43 29 20 7b 0a 09 72 65 73 20 3d 20 48 4d  MAC) {..res = HM
1680: 41 43 5f 55 70 64 61 74 65 28 73 74 61 74 65 50  AC_Update(stateP
1690: 74 72 2d 3e 68 63 74 78 2c 20 62 75 66 2c 20 72  tr->hctx, buf, r
16a0: 65 61 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  ead);.    } else
16b0: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66   if (statePtr->f
16c0: 6f 72 6d 61 74 20 26 20 54 59 50 45 5f 43 4d 41  ormat & TYPE_CMA
16d0: 43 29 20 7b 0a 09 72 65 73 20 3d 20 43 4d 41 43  C) {..res = CMAC
16e0: 5f 55 70 64 61 74 65 28 73 74 61 74 65 50 74 72  _Update(statePtr
16f0: 2d 3e 63 63 74 78 2c 20 62 75 66 2c 20 72 65 61  ->cctx, buf, rea
1700: 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  d);.    }.    if
1710: 20 28 21 72 65 73 20 26 26 20 64 6f 5f 72 65 73   (!res && do_res
1720: 75 6c 74 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  ult) {..Tcl_Appe
1730: 6e 64 52 65 73 75 6c 74 28 73 74 61 74 65 50 74  ndResult(statePt
1740: 72 2d 3e 69 6e 74 65 72 70 2c 20 22 55 70 64 61  r->interp, "Upda
1750: 74 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 52 45  te failed: ", RE
1760: 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09  ASON(), NULL);..
1770: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1780: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
1790: 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  rn res;.}../*. *
17a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17e0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74  ---. *. * Digest
17f0: 46 69 6e 61 6c 69 7a 65 20 2d 2d 0a 20 2a 0a 20  Finalize --. *. 
1800: 2a 09 46 69 6e 61 6c 69 7a 65 20 61 20 68 61 73  *.Finalize a has
1810: 68 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 72  h function and r
1820: 65 74 75 72 6e 20 74 68 65 20 6d 65 73 73 61 67  eturn the messag
1830: 65 20 64 69 67 65 73 74 0a 20 2a 0a 20 2a 20 52  e digest. *. * R
1840: 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f  eturns:. *.TCL_O
1850: 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20  K if successful 
1860: 6f 72 20 54 43 4c 5f 45 52 52 4f 52 20 66 6f 72  or TCL_ERROR for
1870: 20 66 61 69 6c 75 72 65 20 77 69 74 68 20 72 65   failure with re
1880: 73 75 6c 74 20 73 65 74 0a 20 2a 09 74 6f 20 65  sult set. *.to e
1890: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a  rror message.. *
18a0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
18b0: 3a 0a 20 2a 09 53 65 74 73 20 72 65 73 75 6c 74  :. *.Sets result
18c0: 20 74 6f 20 6d 65 73 73 61 67 65 20 64 69 67 65   to message dige
18d0: 73 74 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 6d  st or an error m
18e0: 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d  essage.. *. *---
18f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1930: 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 46  . */.int DigestF
1940: 69 6e 61 6c 69 7a 65 28 54 63 6c 5f 49 6e 74 65  inalize(Tcl_Inte
1950: 72 70 20 2a 69 6e 74 65 72 70 2c 20 44 69 67 65  rp *interp, Dige
1960: 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74  stState *statePt
1970: 72 2c 20 54 63 6c 5f 4f 62 6a 20 2a 2a 72 65 73  r, Tcl_Obj **res
1980: 75 6c 74 4f 62 6a 29 20 7b 0a 20 20 20 20 75 6e  ultObj) {.    un
1990: 73 69 67 6e 65 64 20 63 68 61 72 20 6d 64 5f 62  signed char md_b
19a0: 75 66 5b 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49  uf[EVP_MAX_MD_SI
19b0: 5a 45 5d 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  ZE];.    unsigne
19c0: 64 20 69 6e 74 20 6d 64 5f 6c 65 6e 3b 0a 20 20  d int md_len;.  
19d0: 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 0a    int res = 0;..
19e0: 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20      /* Finalize 
19f0: 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 61 6e  hash function an
1a00: 64 20 63 61 6c 63 75 6c 61 74 65 20 6d 65 73 73  d calculate mess
1a10: 61 67 65 20 64 69 67 65 73 74 20 2a 2f 0a 20 20  age digest */.  
1a20: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
1a30: 66 6f 72 6d 61 74 20 26 20 54 59 50 45 5f 4d 44  format & TYPE_MD
1a40: 29 20 7b 0a 09 69 66 20 28 21 28 73 74 61 74 65  ) {..if (!(state
1a50: 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20 49 53  Ptr->format & IS
1a60: 5f 58 4f 46 29 29 20 7b 0a 09 20 20 20 20 72 65  _XOF)) {..    re
1a70: 73 20 3d 20 45 56 50 5f 44 69 67 65 73 74 46 69  s = EVP_DigestFi
1a80: 6e 61 6c 5f 65 78 28 73 74 61 74 65 50 74 72 2d  nal_ex(statePtr-
1a90: 3e 63 74 78 2c 20 6d 64 5f 62 75 66 2c 20 26 6d  >ctx, md_buf, &m
1aa0: 64 5f 6c 65 6e 29 3b 0a 09 7d 20 65 6c 73 65 20  d_len);..} else 
1ab0: 7b 0a 09 20 20 20 20 72 65 73 20 3d 20 45 56 50  {..    res = EVP
1ac0: 5f 44 69 67 65 73 74 46 69 6e 61 6c 58 4f 46 28  _DigestFinalXOF(
1ad0: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 6d  statePtr->ctx, m
1ae0: 64 5f 62 75 66 2c 20 45 56 50 5f 4d 41 58 5f 4d  d_buf, EVP_MAX_M
1af0: 44 5f 53 49 5a 45 29 3b 0a 09 7d 0a 0a 20 20 20  D_SIZE);..}..   
1b00: 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 61 74   } else if (stat
1b10: 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20 54  ePtr->format & T
1b20: 59 50 45 5f 48 4d 41 43 29 20 7b 0a 09 72 65 73  YPE_HMAC) {..res
1b30: 20 3d 20 48 4d 41 43 5f 46 69 6e 61 6c 28 73 74   = HMAC_Final(st
1b40: 61 74 65 50 74 72 2d 3e 68 63 74 78 2c 20 6d 64  atePtr->hctx, md
1b50: 5f 62 75 66 2c 20 26 6d 64 5f 6c 65 6e 29 3b 0a  _buf, &md_len);.
1b60: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
1b70: 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74  statePtr->format
1b80: 20 26 20 54 59 50 45 5f 43 4d 41 43 29 20 7b 0a   & TYPE_CMAC) {.
1b90: 09 73 69 7a 65 5f 74 20 6c 65 6e 3b 0a 09 72 65  .size_t len;..re
1ba0: 73 20 3d 20 43 4d 41 43 5f 46 69 6e 61 6c 28 73  s = CMAC_Final(s
1bb0: 74 61 74 65 50 74 72 2d 3e 63 63 74 78 2c 20 6d  tatePtr->cctx, m
1bc0: 64 5f 62 75 66 2c 20 26 6c 65 6e 29 3b 0a 09 6d  d_buf, &len);..m
1bd0: 64 5f 6c 65 6e 20 3d 20 28 75 6e 73 69 67 6e 65  d_len = (unsigne
1be0: 64 20 69 6e 74 29 20 6c 65 6e 3b 0a 20 20 20 20  d int) len;.    
1bf0: 7d 0a 0a 20 20 20 20 69 66 20 28 21 72 65 73 29  }..    if (!res)
1c00: 20 7b 0a 09 69 66 20 28 72 65 73 75 6c 74 4f 62   {..if (resultOb
1c10: 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  j == NULL) {..  
1c20: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1c30: 6c 74 28 69 6e 74 65 72 70 2c 20 22 46 69 6e 61  lt(interp, "Fina
1c40: 6c 69 7a 65 20 66 61 69 6c 65 64 3a 20 22 2c 20  lize failed: ", 
1c50: 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b  REASON(), NULL);
1c60: 0a 09 7d 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ..}..return TCL_
1c70: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
1c80: 20 20 2f 2a 20 52 65 74 75 72 6e 20 6d 65 73 73    /* Return mess
1c90: 61 67 65 20 64 69 67 65 73 74 20 61 73 20 65 69  age digest as ei
1ca0: 74 68 65 72 20 61 20 62 69 6e 61 72 79 20 6f 72  ther a binary or
1cb0: 20 68 65 78 20 73 74 72 69 6e 67 20 2a 2f 0a 20   hex string */. 
1cc0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
1cd0: 3e 66 6f 72 6d 61 74 20 26 20 42 49 4e 5f 46 4f  >format & BIN_FO
1ce0: 52 4d 41 54 29 20 7b 0a 09 69 66 20 28 72 65 73  RMAT) {..if (res
1cf0: 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20  ultObj == NULL) 
1d00: 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  {..    Tcl_SetOb
1d10: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
1d20: 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79  Tcl_NewByteArray
1d30: 4f 62 6a 28 6d 64 5f 62 75 66 2c 20 6d 64 5f 6c  Obj(md_buf, md_l
1d40: 65 6e 29 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  en));..} else {.
1d50: 09 20 20 20 20 2a 72 65 73 75 6c 74 4f 62 6a 20  .    *resultObj 
1d60: 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  = Tcl_NewByteArr
1d70: 61 79 4f 62 6a 28 6d 64 5f 62 75 66 2c 20 6d 64  ayObj(md_buf, md
1d80: 5f 6c 65 6e 29 3b 0a 09 20 20 20 20 54 63 6c 5f  _len);..    Tcl_
1d90: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 2a 72 65  IncrRefCount(*re
1da0: 73 75 6c 74 4f 62 6a 29 3b 0a 09 7d 0a 0a 20 20  sultObj);..}..  
1db0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f    } else {..Tcl_
1dc0: 4f 62 6a 20 2a 6e 65 77 4f 62 6a 20 3d 20 54 63  Obj *newObj = Tc
1dd0: 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 09 75 6e 73  l_NewObj();..uns
1de0: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 74 72 20  igned char *ptr 
1df0: 3d 20 54 63 6c 5f 53 65 74 42 79 74 65 41 72 72  = Tcl_SetByteArr
1e00: 61 79 4c 65 6e 67 74 68 28 6e 65 77 4f 62 6a 2c  ayLength(newObj,
1e10: 20 6d 64 5f 6c 65 6e 2a 32 29 3b 0a 0a 09 66 6f   md_len*2);...fo
1e20: 72 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  r (unsigned int 
1e30: 69 20 3d 20 30 3b 20 69 20 3c 20 6d 64 5f 6c 65  i = 0; i < md_le
1e40: 6e 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 2a  n; i++) {..    *
1e50: 70 74 72 2b 2b 20 3d 20 68 65 78 5b 28 6d 64 5f  ptr++ = hex[(md_
1e60: 62 75 66 5b 69 5d 20 3e 3e 20 34 29 20 26 20 30  buf[i] >> 4) & 0
1e70: 78 30 46 5d 3b 0a 09 20 20 20 20 2a 70 74 72 2b  x0F];..    *ptr+
1e80: 2b 20 3d 20 68 65 78 5b 6d 64 5f 62 75 66 5b 69  + = hex[md_buf[i
1e90: 5d 20 26 20 30 78 30 46 5d 3b 0a 09 7d 0a 0a 09  ] & 0x0F];..}...
1ea0: 69 66 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d 3d  if (resultObj ==
1eb0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63   NULL) {..    Tc
1ec0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1ed0: 6e 74 65 72 70 2c 20 6e 65 77 4f 62 6a 29 3b 0a  nterp, newObj);.
1ee0: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 2a  .} else {..    *
1ef0: 72 65 73 75 6c 74 4f 62 6a 20 3d 20 6e 65 77 4f  resultObj = newO
1f00: 62 6a 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63  bj;..    Tcl_Inc
1f10: 72 52 65 66 43 6f 75 6e 74 28 2a 72 65 73 75 6c  rRefCount(*resul
1f20: 74 4f 62 6a 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a  tObj);..}.    }.
1f30: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
1f40: 4b 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  K;.}../*********
1f50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
1f90: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
1fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fd0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65  -----. *. * Dige
1fe0: 73 74 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20  stBlockModeProc 
1ff0: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75  --. *. *.This fu
2000: 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65  nction is invoke
2010: 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 63  d by the generic
2020: 20 49 4f 20 6c 65 76 65 6c 0a 20 2a 09 74 6f 20   IO level. *.to 
2030: 73 65 74 20 62 6c 6f 63 6b 69 6e 67 20 61 6e 64  set blocking and
2040: 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64   nonblocking mod
2050: 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  es.. *. * Return
2060: 73 3a 0a 20 2a 09 30 20 69 66 20 73 75 63 63 65  s:. *.0 if succe
2070: 73 73 66 75 6c 20 6f 72 20 50 4f 53 49 58 20 65  ssful or POSIX e
2080: 72 72 6f 72 20 63 6f 64 65 20 69 66 20 66 61 69  rror code if fai
2090: 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  led.. *. * Side 
20a0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73  effects:. *.Sets
20b0: 20 74 68 65 20 64 65 76 69 63 65 20 69 6e 74 6f   the device into
20c0: 20 62 6c 6f 63 6b 69 6e 67 20 6f 72 20 6e 6f 6e   blocking or non
20d0: 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20  blocking mode.. 
20e0: 2a 09 43 61 6e 20 63 61 6c 6c 20 54 63 6c 5f 53  *.Can call Tcl_S
20f0: 65 74 43 68 61 6e 6e 65 6c 45 72 72 6f 72 2e 0a  etChannelError..
2100: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
2110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2140: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
2150: 74 69 63 20 69 6e 74 20 44 69 67 65 73 74 42 6c  tic int DigestBl
2160: 6f 63 6b 4d 6f 64 65 50 72 6f 63 28 43 6c 69 65  ockModeProc(Clie
2170: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
2180: 61 2c 20 69 6e 74 20 6d 6f 64 65 29 20 7b 0a 20  a, int mode) {. 
2190: 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a     DigestState *
21a0: 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65  statePtr = (Dige
21b0: 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e  stState *) clien
21c0: 74 44 61 74 61 3b 0a 0a 20 20 20 20 69 66 20 28  tData;..    if (
21d0: 6d 6f 64 65 20 3d 3d 20 54 43 4c 5f 4d 4f 44 45  mode == TCL_MODE
21e0: 5f 4e 4f 4e 42 4c 4f 43 4b 49 4e 47 29 20 7b 0a  _NONBLOCKING) {.
21f0: 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73  .statePtr->flags
2200: 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e   |= TLS_TCL_ASYN
2210: 43 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  C;.    } else {.
2220: 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73  .statePtr->flags
2230: 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 41 53   &= ~(TLS_TCL_AS
2240: 59 4e 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  YNC);.    }.    
2250: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
2260: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
2270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22a0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65  -----. *. * Dige
22b0: 73 74 43 6c 6f 73 65 50 72 6f 63 20 2d 2d 0a 20  stCloseProc --. 
22c0: 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69  *. *.This functi
22d0: 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79  on is invoked by
22e0: 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20   the generic IO 
22f0: 6c 65 76 65 6c 20 74 6f 20 70 65 72 66 6f 72 6d  level to perform
2300: 0a 20 2a 09 63 68 61 6e 6e 65 6c 2d 74 79 70 65  . *.channel-type
2310: 20 73 70 65 63 69 66 69 63 20 63 6c 65 61 6e 75   specific cleanu
2320: 70 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e 6e  p when the chann
2330: 65 6c 20 69 73 20 63 6c 6f 73 65 64 2e 20 41 6c  el is closed. Al
2340: 6c 0a 20 2a 09 71 75 65 75 65 64 20 6f 75 74 70  l. *.queued outp
2350: 75 74 20 69 73 20 66 6c 75 73 68 65 64 20 70 72  ut is flushed pr
2360: 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74  ior to calling t
2370: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a  his function.. *
2380: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09  . * Returns:. *.
2390: 30 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20  0 if successful 
23a0: 6f 72 20 50 4f 53 49 58 20 65 72 72 6f 72 20 63  or POSIX error c
23b0: 6f 64 65 20 69 66 20 66 61 69 6c 65 64 2e 0a 20  ode if failed.. 
23c0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
23d0: 73 3a 0a 20 2a 09 44 65 6c 65 74 65 73 20 73 74  s:. *.Deletes st
23e0: 6f 72 65 64 20 73 74 61 74 65 20 64 61 74 61 2e  ored state data.
23f0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
2400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e  ---------. */.in
2440: 74 20 44 69 67 65 73 74 43 6c 6f 73 65 50 72 6f  t DigestClosePro
2450: 63 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  c(ClientData cli
2460: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  entData, Tcl_Int
2470: 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20  erp *interp) {. 
2480: 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a     DigestState *
2490: 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65  statePtr = (Dige
24a0: 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e  stState *) clien
24b0: 74 44 61 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 43  tData;..    /* C
24c0: 61 6e 63 65 6c 20 61 63 74 69 76 65 20 74 69 6d  ancel active tim
24d0: 65 72 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20  er, if any */.  
24e0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
24f0: 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69  timer != (Tcl_Ti
2500: 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20  merToken) NULL) 
2510: 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d  {..Tcl_DeleteTim
2520: 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50  erHandler(stateP
2530: 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61  tr->timer);..sta
2540: 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28  tePtr->timer = (
2550: 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20  Tcl_TimerToken) 
2560: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  NULL;.    }..   
2570: 20 2f 2a 20 4f 75 74 70 75 74 20 6d 65 73 73 61   /* Output messa
2580: 67 65 20 64 69 67 65 73 74 20 69 66 20 6e 6f 74  ge digest if not
2590: 20 61 6c 72 65 61 64 79 20 64 6f 6e 65 20 2a 2f   already done */
25a0: 0a 20 20 20 20 69 66 20 28 21 28 73 74 61 74 65  .    if (!(state
25b0: 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 43 48 41  Ptr->flags & CHA
25c0: 4e 5f 45 4f 46 29 29 20 7b 0a 09 54 63 6c 5f 43  N_EOF)) {..Tcl_C
25d0: 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 20 3d 20  hannel parent = 
25e0: 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 64 43 68  Tcl_GetStackedCh
25f0: 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e  annel(statePtr->
2600: 73 65 6c 66 29 3b 0a 09 54 63 6c 5f 4f 62 6a 20  self);..Tcl_Obj 
2610: 2a 72 65 73 75 6c 74 4f 62 6a 3b 0a 09 69 6e 74  *resultObj;..int
2620: 20 77 72 69 74 74 65 6e 3b 0a 0a 09 69 66 20 28   written;...if (
2630: 44 69 67 65 73 74 46 69 6e 61 6c 69 7a 65 28 73  DigestFinalize(s
2640: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c  tatePtr->interp,
2650: 20 73 74 61 74 65 50 74 72 2c 20 26 72 65 73 75   statePtr, &resu
2660: 6c 74 4f 62 6a 29 20 3d 3d 20 54 43 4c 5f 4f 4b  ltObj) == TCL_OK
2670: 29 20 7b 0a 09 20 20 20 20 75 6e 73 69 67 6e 65  ) {..    unsigne
2680: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 54  d char *data = T
2690: 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46  cl_GetByteArrayF
26a0: 72 6f 6d 4f 62 6a 28 72 65 73 75 6c 74 4f 62 6a  romObj(resultObj
26b0: 2c 20 26 77 72 69 74 74 65 6e 29 3b 0a 09 20 20  , &written);..  
26c0: 20 20 54 63 6c 5f 57 72 69 74 65 52 61 77 28 70    Tcl_WriteRaw(p
26d0: 61 72 65 6e 74 2c 20 64 61 74 61 2c 20 77 72 69  arent, data, wri
26e0: 74 74 65 6e 29 3b 0a 09 20 20 20 20 54 63 6c 5f  tten);..    Tcl_
26f0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 72 65 73  DecrRefCount(res
2700: 75 6c 74 4f 62 6a 29 3b 0a 09 7d 0a 09 73 74 61  ultObj);..}..sta
2710: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  tePtr->flags |= 
2720: 43 48 41 4e 5f 45 4f 46 3b 0a 20 20 20 20 7d 0a  CHAN_EOF;.    }.
2730: 0a 20 20 20 20 2f 2a 20 43 6c 65 61 6e 2d 75 70  .    /* Clean-up
2740: 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 53 74   */.    DigestSt
2750: 61 74 65 46 72 65 65 28 73 74 61 74 65 50 74 72  ateFree(statePtr
2760: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
2770: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 61 6d 65 20 61  .}../*. * Same a
2780: 73 20 44 69 67 65 73 74 43 6c 6f 73 65 50 72 6f  s DigestClosePro
2790: 63 20 62 75 74 20 77 69 74 68 20 69 6e 64 69 76  c but with indiv
27a0: 69 64 75 61 6c 20 72 65 61 64 20 61 6e 64 20 77  idual read and w
27b0: 72 69 74 65 20 63 6c 6f 73 65 20 63 6f 6e 74 72  rite close contr
27c0: 6f 6c 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ol. */.static in
27d0: 74 20 44 69 67 65 73 74 43 6c 6f 73 65 32 50 72  t DigestClose2Pr
27e0: 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e  oc(ClientData in
27f0: 73 74 61 6e 63 65 44 61 74 61 2c 20 54 63 6c 5f  stanceData, Tcl_
2800: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
2810: 69 6e 74 20 66 6c 61 67 73 29 20 7b 0a 0a 20 20  int flags) {..  
2820: 20 20 69 66 20 28 28 66 6c 61 67 73 20 26 20 28    if ((flags & (
2830: 54 43 4c 5f 43 4c 4f 53 45 5f 52 45 41 44 20 7c  TCL_CLOSE_READ |
2840: 20 54 43 4c 5f 43 4c 4f 53 45 5f 57 52 49 54 45   TCL_CLOSE_WRITE
2850: 29 29 20 3d 3d 20 30 29 20 7b 0a 09 72 65 74 75  )) == 0) {..retu
2860: 72 6e 20 44 69 67 65 73 74 43 6c 6f 73 65 50 72  rn DigestClosePr
2870: 6f 63 28 69 6e 73 74 61 6e 63 65 44 61 74 61 2c  oc(instanceData,
2880: 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 7d 0a   interp);.    }.
2890: 20 20 20 20 72 65 74 75 72 6e 20 45 49 4e 56 41      return EINVA
28a0: 4c 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  L;.}../*. *-----
28b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28f0: 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 49 6e  -. *. * DigestIn
2900: 70 75 74 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a  putProc --. *. *
2910: 09 43 61 6c 6c 65 64 20 62 79 20 74 68 65 20 67  .Called by the g
2920: 65 6e 65 72 69 63 20 49 4f 20 73 79 73 74 65 6d  eneric IO system
2930: 20 74 6f 20 72 65 61 64 20 64 61 74 61 20 66 72   to read data fr
2940: 6f 6d 20 74 72 61 6e 73 66 6f 72 6d 20 61 6e 64  om transform and
2950: 0a 20 2a 09 70 6c 61 63 65 20 69 6e 20 62 75 66  . *.place in buf
2960: 2e 20 54 72 61 6e 73 66 6f 72 6d 20 67 65 74 73  . Transform gets
2970: 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 75   data from the u
2980: 6e 64 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65  nderlying channe
2990: 6c 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73  l.. *. * Returns
29a0: 3a 0a 20 2a 09 54 6f 74 61 6c 20 62 79 74 65 73  :. *.Total bytes
29b0: 20 72 65 61 64 20 6f 72 20 2d 31 20 66 6f 72 20   read or -1 for 
29c0: 61 6e 20 65 72 72 6f 72 20 61 6c 6f 6e 67 20 77  an error along w
29d0: 69 74 68 20 61 20 50 4f 53 49 58 20 65 72 72 6f  ith a POSIX erro
29e0: 72 0a 20 2a 09 63 6f 64 65 20 69 6e 20 65 72 72  r. *.code in err
29f0: 6f 72 43 6f 64 65 50 74 72 2e 20 55 73 65 20 45  orCodePtr. Use E
2a00: 41 47 41 49 4e 20 66 6f 72 20 6e 6f 6e 62 6c 6f  AGAIN for nonblo
2a10: 63 6b 69 6e 67 20 61 6e 64 20 6e 6f 20 64 61 74  cking and no dat
2a20: 61 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  a.. *. * Side ef
2a30: 66 65 63 74 73 3a 0a 20 2a 09 52 65 61 64 20 64  fects:. *.Read d
2a40: 61 74 61 20 66 72 6f 6d 20 74 72 61 6e 73 66 6f  ata from transfo
2a50: 72 6d 20 61 6e 64 20 77 72 69 74 65 20 74 6f 20  rm and write to 
2a60: 62 75 66 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  buf. *. *-------
2a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2ab0: 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 49 6e   */.int DigestIn
2ac0: 70 75 74 50 72 6f 63 28 43 6c 69 65 6e 74 44 61  putProc(ClientDa
2ad0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 63  ta clientData, c
2ae0: 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 74 6f  har *buf, int to
2af0: 52 65 61 64 2c 20 69 6e 74 20 2a 65 72 72 6f 72  Read, int *error
2b00: 43 6f 64 65 50 74 72 29 20 7b 0a 20 20 20 20 44  CodePtr) {.    D
2b10: 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74  igestState *stat
2b20: 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74  ePtr = (DigestSt
2b30: 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74  ate *) clientDat
2b40: 61 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e  a;.    Tcl_Chann
2b50: 65 6c 20 70 61 72 65 6e 74 3b 0a 20 20 20 20 69  el parent;.    i
2b60: 6e 74 20 72 65 61 64 3b 0a 20 20 20 20 2a 65 72  nt read;.    *er
2b70: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a  rorCodePtr = 0;.
2b80: 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 69 66  .    /* Abort if
2b90: 20 6e 6f 74 68 69 6e 67 20 74 6f 20 70 72 6f 63   nothing to proc
2ba0: 65 73 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 74  ess */.    if (t
2bb0: 6f 52 65 61 64 20 3c 3d 20 30 20 7c 7c 20 73 74  oRead <= 0 || st
2bc0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20  atePtr->self == 
2bd0: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
2be0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b  LL) {..return 0;
2bf0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
2c00: 65 74 20 62 79 74 65 73 20 66 72 6f 6d 20 75 6e  et bytes from un
2c10: 64 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c  derlying channel
2c20: 20 2a 2f 0a 20 20 20 20 70 61 72 65 6e 74 20 3d   */.    parent =
2c30: 20 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 64 43   Tcl_GetStackedC
2c40: 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d  hannel(statePtr-
2c50: 3e 73 65 6c 66 29 3b 0a 20 20 20 20 72 65 61 64  >self);.    read
2c60: 20 3d 20 54 63 6c 5f 52 65 61 64 52 61 77 28 70   = Tcl_ReadRaw(p
2c70: 61 72 65 6e 74 2c 20 62 75 66 2c 20 74 6f 52 65  arent, buf, toRe
2c80: 61 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64  ad);..    /* Upd
2c90: 61 74 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f  ate hash functio
2ca0: 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 61  n */.    if (rea
2cb0: 64 20 3e 20 30 29 20 7b 0a 09 2f 2a 20 48 61 76  d > 0) {../* Hav
2cc0: 65 20 64 61 74 61 20 2a 2f 0a 09 69 66 20 28 21  e data */..if (!
2cd0: 44 69 67 65 73 74 55 70 64 61 74 65 28 73 74 61  DigestUpdate(sta
2ce0: 74 65 50 74 72 2c 20 62 75 66 2c 20 28 73 69 7a  tePtr, buf, (siz
2cf0: 65 5f 74 29 20 72 65 61 64 2c 20 30 29 29 20 7b  e_t) read, 0)) {
2d00: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61  ..    Tcl_SetCha
2d10: 6e 6e 65 6c 45 72 72 6f 72 28 73 74 61 74 65 50  nnelError(stateP
2d20: 74 72 2d 3e 73 65 6c 66 2c 20 54 63 6c 5f 4f 62  tr->self, Tcl_Ob
2d30: 6a 50 72 69 6e 74 66 28 22 55 70 64 61 74 65 20  jPrintf("Update 
2d40: 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 52 45 41  failed: %s", REA
2d50: 53 4f 4e 28 29 29 29 3b 0a 09 20 20 20 20 2a 65  SON()));..    *e
2d60: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49  rrorCodePtr = EI
2d70: 4e 56 41 4c 3b 0a 09 20 20 20 20 72 65 74 75 72  NVAL;..    retur
2d80: 6e 20 30 3b 0a 09 7d 0a 09 2f 2a 20 54 68 69 73  n 0;..}../* This
2d90: 20 69 73 20 63 6f 72 72 65 63 74 20 2a 2f 0a 09   is correct */..
2da0: 72 65 61 64 20 3d 20 2d 31 3b 0a 09 2a 65 72 72  read = -1;..*err
2db0: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41  orCodePtr = EAGA
2dc0: 49 4e 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20  IN;..    } else 
2dd0: 69 66 20 28 72 65 61 64 20 3c 20 30 29 20 7b 0a  if (read < 0) {.
2de0: 09 2f 2a 20 45 72 72 6f 72 20 2a 2f 0a 09 2a 65  ./* Error */..*e
2df0: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 54 63  rrorCodePtr = Tc
2e00: 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b 0a 0a 20  l_GetErrno();.. 
2e10: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 21 28     } else if (!(
2e20: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20  statePtr->flags 
2e30: 26 20 43 48 41 4e 5f 45 4f 46 29 29 20 7b 0a 09  & CHAN_EOF)) {..
2e40: 2f 2a 20 45 4f 46 20 2a 2f 0a 09 54 63 6c 5f 4f  /* EOF */..Tcl_O
2e50: 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 3b 0a 09  bj *resultObj;..
2e60: 69 66 20 28 44 69 67 65 73 74 46 69 6e 61 6c 69  if (DigestFinali
2e70: 7a 65 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  ze(statePtr->int
2e80: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 26  erp, statePtr, &
2e90: 72 65 73 75 6c 74 4f 62 6a 29 20 3d 3d 20 54 43  resultObj) == TC
2ea0: 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 75 6e 73  L_OK) {..    uns
2eb0: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
2ec0: 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72   = Tcl_GetByteAr
2ed0: 72 61 79 46 72 6f 6d 4f 62 6a 28 72 65 73 75 6c  rayFromObj(resul
2ee0: 74 4f 62 6a 2c 20 26 72 65 61 64 29 3b 0a 09 20  tObj, &read);.. 
2ef0: 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 64     memcpy(buf, d
2f00: 61 74 61 2c 20 72 65 61 64 29 3b 0a 09 20 20 20  ata, read);..   
2f10: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
2f20: 74 28 72 65 73 75 6c 74 4f 62 6a 29 3b 0a 0a 09  t(resultObj);...
2f30: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 54 63  } else {..    Tc
2f40: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 45 72 72 6f  l_SetChannelErro
2f50: 72 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  r(statePtr->self
2f60: 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28  , Tcl_ObjPrintf(
2f70: 22 46 69 6e 61 6c 69 7a 65 20 66 61 69 6c 65 64  "Finalize failed
2f80: 3a 20 25 73 22 2c 20 52 45 41 53 4f 4e 28 29 29  : %s", REASON())
2f90: 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f  );..    *errorCo
2fa0: 64 65 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a  dePtr = EINVAL;.
2fb0: 09 20 20 20 20 72 65 61 64 20 3d 20 30 3b 0a 09  .    read = 0;..
2fc0: 7d 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61  }..statePtr->fla
2fd0: 67 73 20 7c 3d 20 43 48 41 4e 5f 45 4f 46 3b 0a  gs |= CHAN_EOF;.
2fe0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
2ff0: 20 72 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d   read;.}../*. *-
3000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3040: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65  -----. *. * Dige
3050: 73 74 4f 75 74 70 75 74 50 72 6f 63 20 2d 2d 0a  stOutputProc --.
3060: 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79 20   *. *.Called by 
3070: 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 73  the generic IO s
3080: 79 73 74 65 6d 20 74 6f 20 77 72 69 74 65 20 64  ystem to write d
3090: 61 74 61 20 69 6e 20 62 75 66 20 74 6f 20 74 72  ata in buf to tr
30a0: 61 6e 73 66 6f 72 6d 2e 0a 20 2a 09 54 68 65 20  ansform.. *.The 
30b0: 74 72 61 6e 73 66 6f 72 6d 20 77 72 69 74 65 73  transform writes
30c0: 20 74 68 65 20 72 65 73 75 6c 74 20 74 6f 20 74   the result to t
30d0: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 68  he underlying ch
30e0: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 74  annel.. *. * Ret
30f0: 75 72 6e 73 3a 0a 20 2a 09 54 6f 74 61 6c 20 62  urns:. *.Total b
3100: 79 74 65 73 20 77 72 69 74 74 65 6e 20 6f 72 20  ytes written or 
3110: 2d 31 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 20  -1 for an error 
3120: 61 6c 6f 6e 67 20 77 69 74 68 20 61 20 50 4f 53  along with a POS
3130: 49 58 20 65 72 72 6f 72 0a 20 2a 09 63 6f 64 65  IX error. *.code
3140: 20 69 6e 20 65 72 72 6f 72 43 6f 64 65 50 74 72   in errorCodePtr
3150: 2e 20 55 73 65 20 45 41 47 41 49 4e 20 66 6f 72  . Use EAGAIN for
3160: 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 61 6e 64   nonblocking and
3170: 20 63 61 6e 27 74 20 77 72 69 74 65 20 64 61 74   can't write dat
3180: 61 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  a.. *. * Side ef
3190: 66 65 63 74 73 3a 0a 20 2a 09 47 65 74 20 64 61  fects:. *.Get da
31a0: 74 61 20 66 72 6f 6d 20 62 75 66 20 61 6e 64 20  ta from buf and 
31b0: 75 70 64 61 74 65 20 64 69 67 65 73 74 0a 20 2a  update digest. *
31c0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
31d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
31e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
31f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 20 69  ---------. */. i
3210: 6e 74 20 44 69 67 65 73 74 4f 75 74 70 75 74 50  nt DigestOutputP
3220: 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 63  roc(ClientData c
3230: 6c 69 65 6e 74 44 61 74 61 2c 20 63 6f 6e 73 74  lientData, const
3240: 20 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20   char *buf, int 
3250: 74 6f 57 72 69 74 65 2c 20 69 6e 74 20 2a 65 72  toWrite, int *er
3260: 72 6f 72 43 6f 64 65 50 74 72 29 20 7b 0a 20 20  rorCodePtr) {.  
3270: 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73    DigestState *s
3280: 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 73  tatePtr = (Diges
3290: 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74  tState *) client
32a0: 44 61 74 61 3b 0a 20 20 20 20 2a 65 72 72 6f 72  Data;.    *error
32b0: 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 0a 20 20  CodePtr = 0;..  
32c0: 20 20 2f 2a 20 41 62 6f 72 74 20 69 66 20 6e 6f    /* Abort if no
32d0: 74 68 69 6e 67 20 74 6f 20 70 72 6f 63 65 73 73  thing to process
32e0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 74 6f 57 72   */.    if (toWr
32f0: 69 74 65 20 3c 3d 20 30 20 7c 7c 20 73 74 61 74  ite <= 0 || stat
3300: 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54  ePtr->self == (T
3310: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c  cl_Channel) NULL
3320: 29 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20  ) {..return 0;. 
3330: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64     }..    /* Upd
3340: 61 74 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f  ate hash functio
3350: 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 74 6f 57  n */.    if (toW
3360: 72 69 74 65 20 3e 20 30 20 26 26 20 21 44 69 67  rite > 0 && !Dig
3370: 65 73 74 55 70 64 61 74 65 28 73 74 61 74 65 50  estUpdate(stateP
3380: 74 72 2c 20 62 75 66 2c 20 28 73 69 7a 65 5f 74  tr, buf, (size_t
3390: 29 20 74 6f 57 72 69 74 65 2c 20 30 29 29 20 7b  ) toWrite, 0)) {
33a0: 0a 09 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c  ..Tcl_SetChannel
33b0: 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2d 3e  Error(statePtr->
33c0: 73 65 6c 66 2c 20 54 63 6c 5f 4f 62 6a 50 72 69  self, Tcl_ObjPri
33d0: 6e 74 66 28 22 55 70 64 61 74 65 20 66 61 69 6c  ntf("Update fail
33e0: 65 64 3a 20 25 73 22 2c 20 52 45 41 53 4f 4e 28  ed: %s", REASON(
33f0: 29 29 29 3b 0a 09 2a 65 72 72 6f 72 43 6f 64 65  )));..*errorCode
3400: 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 09 72  Ptr = EINVAL;..r
3410: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
3420: 20 20 20 72 65 74 75 72 6e 20 74 6f 57 72 69 74     return toWrit
3430: 65 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  e;.}../*. *-----
3440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3480: 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 53 65  -. *. * DigestSe
3490: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20  tOptionProc --. 
34a0: 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79 20 74  *. *.Called by t
34b0: 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 73 79  he generic IO sy
34c0: 73 74 65 6d 20 74 6f 20 73 65 74 20 63 68 61 6e  stem to set chan
34d0: 6e 65 6c 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 20  nel option name 
34e0: 74 6f 20 76 61 6c 75 65 2e 0a 20 2a 0a 20 2a 20  to value.. *. * 
34f0: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f  Returns:. *.TCL_
3500: 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
3510: 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 20 69 66   or TCL_ERROR if
3520: 20 66 61 69 6c 65 64 20 61 6c 6f 6e 67 20 77 69   failed along wi
3530: 74 68 20 61 6e 20 65 72 72 6f 72 0a 20 2a 09 6d  th an error. *.m
3540: 65 73 73 61 67 65 20 69 6e 20 69 6e 74 65 72 70  essage in interp
3550: 20 61 6e 64 20 54 63 6c 5f 53 65 74 45 72 72 6e   and Tcl_SetErrn
3560: 6f 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  o.. *. * Side ef
3570: 66 65 63 74 73 3a 0a 20 2a 09 55 70 64 61 74 65  fects:. *.Update
3580: 73 20 63 68 61 6e 6e 65 6c 20 6f 70 74 69 6f 6e  s channel option
3590: 20 74 6f 20 6e 65 77 20 76 61 6c 75 65 2e 0a 20   to new value.. 
35a0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
35b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
35f0: 74 61 74 69 63 20 69 6e 74 20 44 69 67 65 73 74  tatic int Digest
3600: 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 43 6c  SetOptionProc(Cl
3610: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
3620: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
3630: 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74 20 63  *interp, const c
3640: 68 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c  har *optionName,
3650: 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70  ..const char *op
3660: 74 69 6f 6e 56 61 6c 75 65 29 20 7b 0a 20 20 20  tionValue) {.   
3670: 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74   DigestState *st
3680: 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 74  atePtr = (Digest
3690: 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44  State *) clientD
36a0: 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61  ata;.    Tcl_Cha
36b0: 6e 6e 65 6c 20 70 61 72 65 6e 74 3b 0a 20 20 20  nnel parent;.   
36c0: 20 54 63 6c 5f 44 72 69 76 65 72 53 65 74 4f 70   Tcl_DriverSetOp
36d0: 74 69 6f 6e 50 72 6f 63 20 2a 73 65 74 4f 70 74  tionProc *setOpt
36e0: 69 6f 6e 50 72 6f 63 3b 0a 0a 20 20 20 20 2f 2a  ionProc;..    /*
36f0: 20 41 62 6f 72 74 20 69 66 20 6e 6f 20 63 68 61   Abort if no cha
3700: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28  nnel */.    if (
3710: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d  statePtr->self =
3720: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
3730: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
3740: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
3750: 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 67 61 74  ..    /* Delegat
3760: 65 20 6f 70 74 69 6f 6e 73 20 64 6f 77 6e 73 74  e options downst
3770: 72 65 61 6d 20 2a 2f 0a 20 20 20 20 70 61 72 65  ream */.    pare
3780: 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 63  nt = Tcl_GetStac
3790: 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 65  kedChannel(state
37a0: 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 20  Ptr->self);.    
37b0: 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 3d 20  setOptionProc = 
37c0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 53 65 74 4f 70  Tcl_ChannelSetOp
37d0: 74 69 6f 6e 50 72 6f 63 28 54 63 6c 5f 47 65 74  tionProc(Tcl_Get
37e0: 43 68 61 6e 6e 65 6c 54 79 70 65 28 70 61 72 65  ChannelType(pare
37f0: 6e 74 29 29 3b 0a 20 20 20 20 69 66 20 28 73 65  nt));.    if (se
3800: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 21 3d 20 4e  tOptionProc != N
3810: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 28  ULL) {..return (
3820: 2a 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 29 28  *setOptionProc)(
3830: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e  Tcl_GetChannelIn
3840: 73 74 61 6e 63 65 44 61 74 61 28 70 61 72 65 6e  stanceData(paren
3850: 74 29 2c 20 69 6e 74 65 72 70 2c 20 6f 70 74 69  t), interp, opti
3860: 6f 6e 4e 61 6d 65 2c 20 6f 70 74 69 6f 6e 56 61  onName, optionVa
3870: 6c 75 65 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  lue);.    } else
3880: 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f   {..Tcl_SetErrno
3890: 28 45 49 4e 56 41 4c 29 3b 0a 09 72 65 74 75 72  (EINVAL);..retur
38a0: 6e 20 54 63 6c 5f 42 61 64 43 68 61 6e 6e 65 6c  n Tcl_BadChannel
38b0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f  Option(interp, o
38c0: 70 74 69 6f 6e 4e 61 6d 65 2c 20 4e 55 4c 4c 29  ptionName, NULL)
38d0: 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a  ;.    }.}../*. *
38e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3920: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67  ------. *. * Dig
3930: 65 73 74 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63  estGetOptionProc
3940: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64   --. *. *.Called
3950: 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20   by the generic 
3960: 49 4f 20 73 79 73 74 65 6d 20 74 6f 20 67 65 74  IO system to get
3970: 20 63 68 61 6e 6e 65 6c 20 6f 70 74 69 6f 6e 20   channel option 
3980: 6e 61 6d 65 27 73 20 76 61 6c 75 65 2e 0a 20 2a  name's value.. *
3990: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09  . * Returns:. *.
39a0: 54 43 4c 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  TCL_OK if succes
39b0: 73 66 75 6c 20 6f 72 20 54 43 4c 5f 45 52 52 4f  sful or TCL_ERRO
39c0: 52 20 69 66 20 66 61 69 6c 65 64 20 61 6c 6f 6e  R if failed alon
39d0: 67 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 0a  g with an error.
39e0: 20 2a 09 6d 65 73 73 61 67 65 20 69 6e 20 69 6e   *.message in in
39f0: 74 65 72 70 20 61 6e 64 20 54 63 6c 5f 53 65 74  terp and Tcl_Set
3a00: 45 72 72 6e 6f 2e 0a 20 2a 0a 20 2a 20 53 69 64  Errno.. *. * Sid
3a10: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65  e effects:. *.Se
3a20: 74 73 20 72 65 73 75 6c 74 20 74 6f 20 6f 70 74  ts result to opt
3a30: 69 6f 6e 27 73 20 76 61 6c 75 65 0a 20 2a 0a 20  ion's value. *. 
3a40: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
3a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a80: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
3a90: 69 63 20 69 6e 74 20 44 69 67 65 73 74 47 65 74  ic int DigestGet
3aa0: 4f 70 74 69 6f 6e 50 72 6f 63 28 43 6c 69 65 6e  OptionProc(Clien
3ab0: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
3ac0: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
3ad0: 74 65 72 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  terp, const char
3ae0: 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c 0a 09 54   *optionName,..T
3af0: 63 6c 5f 44 53 74 72 69 6e 67 20 2a 6f 70 74 69  cl_DString *opti
3b00: 6f 6e 56 61 6c 75 65 29 20 7b 0a 20 20 20 20 44  onValue) {.    D
3b10: 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74  igestState *stat
3b20: 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74  ePtr = (DigestSt
3b30: 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74  ate *) clientDat
3b40: 61 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e  a;.    Tcl_Chann
3b50: 65 6c 20 70 61 72 65 6e 74 3b 0a 20 20 20 20 54  el parent;.    T
3b60: 63 6c 5f 44 72 69 76 65 72 47 65 74 4f 70 74 69  cl_DriverGetOpti
3b70: 6f 6e 50 72 6f 63 20 2a 67 65 74 4f 70 74 69 6f  onProc *getOptio
3b80: 6e 50 72 6f 63 3b 0a 0a 20 20 20 20 2f 2a 20 41  nProc;..    /* A
3b90: 62 6f 72 74 20 69 66 20 6e 6f 20 63 68 61 6e 6e  bort if no chann
3ba0: 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74  el */.    if (st
3bb0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20  atePtr->self == 
3bc0: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
3bd0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  LL) {..return TC
3be0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
3bf0: 20 20 20 20 2f 2a 20 44 65 6c 65 67 61 74 65 20      /* Delegate 
3c00: 6f 70 74 69 6f 6e 73 20 64 6f 77 6e 73 74 72 65  options downstre
3c10: 61 6d 20 2a 2f 0a 20 20 20 20 70 61 72 65 6e 74  am */.    parent
3c20: 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 63 6b 65   = Tcl_GetStacke
3c30: 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74  dChannel(statePt
3c40: 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 20 67 65  r->self);.    ge
3c50: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 3d 20 54 63  tOptionProc = Tc
3c60: 6c 5f 43 68 61 6e 6e 65 6c 47 65 74 4f 70 74 69  l_ChannelGetOpti
3c70: 6f 6e 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 68  onProc(Tcl_GetCh
3c80: 61 6e 6e 65 6c 54 79 70 65 28 70 61 72 65 6e 74  annelType(parent
3c90: 29 29 3b 0a 20 20 20 20 69 66 20 28 67 65 74 4f  ));.    if (getO
3ca0: 70 74 69 6f 6e 50 72 6f 63 20 21 3d 20 4e 55 4c  ptionProc != NUL
3cb0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 28 2a 67  L) {..return (*g
3cc0: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 29 28 54 63  etOptionProc)(Tc
3cd0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74  l_GetChannelInst
3ce0: 61 6e 63 65 44 61 74 61 28 70 61 72 65 6e 74 29  anceData(parent)
3cf0: 2c 20 69 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e  , interp, option
3d00: 4e 61 6d 65 2c 20 6f 70 74 69 6f 6e 56 61 6c 75  Name, optionValu
3d10: 65 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  e);.    } else i
3d20: 66 20 28 6f 70 74 69 6f 6e 4e 61 6d 65 20 3d 3d  f (optionName ==
3d30: 20 28 63 68 61 72 2a 29 20 4e 55 4c 4c 29 20 7b   (char*) NULL) {
3d40: 0a 09 2f 2a 20 52 65 71 75 65 73 74 20 69 73 20  ../* Request is 
3d50: 71 75 65 72 79 20 66 6f 72 20 61 6c 6c 20 6f 70  query for all op
3d60: 74 69 6f 6e 73 2c 20 74 68 69 73 20 69 73 20 6f  tions, this is o
3d70: 6b 2e 20 2a 2f 0a 09 72 65 74 75 72 6e 20 54 43  k. */..return TC
3d80: 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  L_OK;.    } else
3d90: 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f   {..Tcl_SetErrno
3da0: 28 45 49 4e 56 41 4c 29 3b 0a 09 72 65 74 75 72  (EINVAL);..retur
3db0: 6e 20 54 63 6c 5f 42 61 64 43 68 61 6e 6e 65 6c  n Tcl_BadChannel
3dc0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f  Option(interp, o
3dd0: 70 74 69 6f 6e 4e 61 6d 65 2c 20 4e 55 4c 4c 29  ptionName, NULL)
3de0: 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a  ;.    }.}../*. *
3df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e30: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67  ------. *. * Dig
3e40: 65 73 74 54 69 6d 65 72 48 61 6e 64 6c 65 72 20  estTimerHandler 
3e50: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20  --. *. *.Called 
3e60: 62 79 20 74 68 65 20 6e 6f 74 69 66 69 65 72 20  by the notifier 
3e70: 76 69 61 20 74 69 6d 65 72 20 74 6f 20 66 6c 75  via timer to flu
3e80: 73 68 20 6f 75 74 20 70 65 6e 64 69 6e 67 20 69  sh out pending i
3e90: 6e 70 75 74 20 64 61 74 61 2e 0a 20 2a 0a 20 2a  nput data.. *. *
3ea0: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 4e 6f 74   Returns:. *.Not
3eb0: 68 69 6e 67 0a 20 2a 0a 20 2a 20 53 69 64 65 20  hing. *. * Side 
3ec0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20  effects:. *.May 
3ed0: 63 61 6c 6c 20 54 63 6c 5f 4e 6f 74 69 66 79 43  call Tcl_NotifyC
3ee0: 68 61 6e 6e 65 6c 0a 20 2a 0a 20 2a 2d 2d 2d 2d  hannel. *. *----
3ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f30: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  --. */.static vo
3f40: 69 64 20 44 69 67 65 73 74 54 69 6d 65 72 48 61  id DigestTimerHa
3f50: 6e 64 6c 65 72 28 43 6c 69 65 6e 74 44 61 74 61  ndler(ClientData
3f60: 20 63 6c 69 65 6e 74 44 61 74 61 29 20 7b 0a 20   clientData) {. 
3f70: 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a     DigestState *
3f80: 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65  statePtr = (Dige
3f90: 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e  stState *) clien
3fa0: 74 44 61 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 41  tData;..    /* A
3fb0: 62 6f 72 74 20 69 66 20 6e 6f 20 63 68 61 6e 6e  bort if no chann
3fc0: 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74  el */.    if (st
3fd0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20  atePtr->self == 
3fe0: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
3ff0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 3b 0a 20  LL) {..return;. 
4000: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 65     }..    /* Cle
4010: 61 72 20 74 69 6d 65 72 20 74 6f 6b 65 6e 20 2a  ar timer token *
4020: 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  /.    statePtr->
4030: 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d  timer = (Tcl_Tim
4040: 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 0a  erToken) NULL;..
4050: 20 20 20 20 2f 2a 20 46 69 72 65 20 65 76 65 6e      /* Fire even
4060: 74 20 69 66 20 74 68 65 72 65 20 69 73 20 70 65  t if there is pe
4070: 6e 64 69 6e 67 20 64 61 74 61 2c 20 73 6b 69 70  nding data, skip
4080: 20 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20   otherwise */.  
4090: 20 20 69 66 20 28 28 73 74 61 74 65 50 74 72 2d    if ((statePtr-
40a0: 3e 77 61 74 63 68 4d 61 73 6b 20 26 20 54 43 4c  >watchMask & TCL
40b0: 5f 52 45 41 44 41 42 4c 45 29 20 26 26 20 28 54  _READABLE) && (T
40c0: 63 6c 5f 49 6e 70 75 74 42 75 66 66 65 72 65 64  cl_InputBuffered
40d0: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
40e0: 20 3e 20 30 29 29 20 7b 0a 09 54 63 6c 5f 4e 6f   > 0)) {..Tcl_No
40f0: 74 69 66 79 43 68 61 6e 6e 65 6c 28 73 74 61 74  tifyChannel(stat
4100: 65 50 74 72 2d 3e 73 65 6c 66 2c 20 54 43 4c 5f  ePtr->self, TCL_
4110: 52 45 41 44 41 42 4c 45 29 3b 0a 20 20 20 20 7d  READABLE);.    }
4120: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
4130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
4170: 20 2a 0a 20 2a 20 44 69 67 65 73 74 57 61 74 63   *. * DigestWatc
4180: 68 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 49  hProc --. *. *.I
4190: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 6f  nitialize the no
41a0: 74 69 66 69 65 72 20 74 6f 20 77 61 74 63 68 20  tifier to watch 
41b0: 66 6f 72 20 65 76 65 6e 74 73 20 66 72 6f 6d 20  for events from 
41c0: 74 68 69 73 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a  this channel.. *
41d0: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09  . * Returns:. *.
41e0: 4e 6f 74 68 69 6e 67 20 28 63 61 6e 27 74 20 72  Nothing (can't r
41f0: 65 74 75 72 6e 20 65 72 72 6f 72 20 6d 65 73 73  eturn error mess
4200: 61 67 65 73 29 0a 20 2a 0a 20 2a 20 53 69 64 65  ages). *. * Side
4210: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 6f 6e   effects:. *.Con
4220: 66 69 67 75 72 65 20 6e 6f 74 69 66 69 65 72 20  figure notifier 
4230: 73 6f 20 66 75 74 75 72 65 20 65 76 65 6e 74 73  so future events
4240: 20 6f 6e 20 74 68 65 20 63 68 61 6e 6e 65 6c 20   on the channel 
4250: 77 69 6c 6c 20 62 65 20 73 65 65 6e 20 62 79 20  will be seen by 
4260: 54 63 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  Tcl.. *. *------
4270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42b0: 0a 20 2a 2f 0a 76 6f 69 64 20 44 69 67 65 73 74  . */.void Digest
42c0: 57 61 74 63 68 50 72 6f 63 28 43 6c 69 65 6e 74  WatchProc(Client
42d0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
42e0: 20 69 6e 74 20 6d 61 73 6b 29 20 7b 0a 20 20 20   int mask) {.   
42f0: 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74   DigestState *st
4300: 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 74  atePtr = (Digest
4310: 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44  State *) clientD
4320: 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61  ata;.    Tcl_Cha
4330: 6e 6e 65 6c 20 70 61 72 65 6e 74 3b 0a 20 20 20  nnel parent;.   
4340: 20 54 63 6c 5f 44 72 69 76 65 72 57 61 74 63 68   Tcl_DriverWatch
4350: 50 72 6f 63 20 2a 77 61 74 63 68 50 72 6f 63 3b  Proc *watchProc;
4360: 0a 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 69  ..    /* Abort i
4370: 66 20 6e 6f 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  f no channel */.
4380: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
4390: 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43  ->self == (Tcl_C
43a0: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a  hannel) NULL) {.
43b0: 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a  .return;.    }..
43c0: 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 4f 52 2d      /* Store OR-
43d0: 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f  ed combination o
43e0: 66 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 2c 20  f TCL_READABLE, 
43f0: 54 43 4c 5f 57 52 49 54 41 42 4c 45 20 61 6e 64  TCL_WRITABLE and
4400: 20 54 43 4c 5f 45 58 43 45 50 54 49 4f 4e 20 2a   TCL_EXCEPTION *
4410: 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  /.    statePtr->
4420: 77 61 74 63 68 4d 61 73 6b 20 3d 20 6d 61 73 6b  watchMask = mask
4430: 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 70 61 67  ;..    /* Propag
4440: 61 74 65 20 6d 61 73 6b 20 69 6e 66 6f 20 74 6f  ate mask info to
4450: 20 70 61 72 65 6e 74 20 63 68 61 6e 6e 65 6c 20   parent channel 
4460: 2a 2f 0a 20 20 20 20 70 61 72 65 6e 74 20 3d 20  */.    parent = 
4470: 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 64 43 68  Tcl_GetStackedCh
4480: 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e  annel(statePtr->
4490: 73 65 6c 66 29 3b 0a 20 20 20 20 77 61 74 63 68  self);.    watch
44a0: 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68 61 6e 6e  Proc = Tcl_Chann
44b0: 65 6c 57 61 74 63 68 50 72 6f 63 28 54 63 6c 5f  elWatchProc(Tcl_
44c0: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 70  GetChannelType(p
44d0: 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 77 61 74  arent));.    wat
44e0: 63 68 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 68  chProc(Tcl_GetCh
44f0: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74  annelInstanceDat
4500: 61 28 70 61 72 65 6e 74 29 2c 20 6d 61 73 6b 29  a(parent), mask)
4510: 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65  ;..    /* Remove
4520: 20 70 65 6e 64 69 6e 67 20 74 69 6d 65 72 20 2a   pending timer *
4530: 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  /.    if (stateP
4540: 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63  tr->timer != (Tc
4550: 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55  l_TimerToken) NU
4560: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74  LL) {..Tcl_Delet
4570: 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74  eTimerHandler(st
4580: 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a  atePtr->timer);.
4590: 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72  .statePtr->timer
45a0: 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b   = (Tcl_TimerTok
45b0: 65 6e 29 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  en) NULL;.    }.
45c0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
45d0: 20 69 73 20 64 61 74 61 20 70 65 6e 64 69 6e 67   is data pending
45e0: 2c 20 73 65 74 20 6e 65 77 20 74 69 6d 65 72 20  , set new timer 
45f0: 74 6f 20 63 61 6c 6c 20 54 63 6c 5f 4e 6f 74 69  to call Tcl_Noti
4600: 66 79 43 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20  fyChannel */.   
4610: 20 69 66 20 28 28 6d 61 73 6b 20 26 20 54 43 4c   if ((mask & TCL
4620: 5f 52 45 41 44 41 42 4c 45 29 20 26 26 20 28 54  _READABLE) && (T
4630: 63 6c 5f 49 6e 70 75 74 42 75 66 66 65 72 65 64  cl_InputBuffered
4640: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
4650: 20 3e 20 30 29 29 20 7b 0a 09 73 74 61 74 65 50   > 0)) {..stateP
4660: 74 72 2d 3e 74 69 6d 65 72 20 3d 20 54 63 6c 5f  tr->timer = Tcl_
4670: 43 72 65 61 74 65 54 69 6d 65 72 48 61 6e 64 6c  CreateTimerHandl
4680: 65 72 28 52 45 41 44 5f 44 45 4c 41 59 2c 20 44  er(READ_DELAY, D
4690: 69 67 65 73 74 54 69 6d 65 72 48 61 6e 64 6c 65  igestTimerHandle
46a0: 72 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  r, (ClientData) 
46b0: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 7d  statePtr);.    }
46c0: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
46d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
4710: 20 2a 0a 20 2a 20 44 69 67 65 73 74 47 65 74 48   *. * DigestGetH
4720: 61 6e 64 6c 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a  andleProc --. *.
4730: 20 2a 09 43 61 6c 6c 65 64 20 66 72 6f 6d 20 54   *.Called from T
4740: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 48 61 6e  cl_GetChannelHan
4750: 64 6c 65 20 74 6f 20 72 65 74 72 69 65 76 65 20  dle to retrieve 
4760: 4f 53 20 73 70 65 63 69 66 69 63 20 66 69 6c 65  OS specific file
4770: 20 68 61 6e 64 6c 65 0a 20 2a 09 66 72 6f 6d 20   handle. *.from 
4780: 69 6e 73 69 64 65 20 74 68 69 73 20 63 68 61 6e  inside this chan
4790: 6e 65 6c 2e 20 4e 6f 74 20 75 73 65 64 20 66 6f  nel. Not used fo
47a0: 72 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  r transformation
47b0: 73 3f 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73  s?. *. * Returns
47c0: 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 66 6f 72 20  :. *.TCL_OK for 
47d0: 73 75 63 63 65 73 73 20 6f 72 20 54 43 4c 5f 45  success or TCL_E
47e0: 52 52 4f 52 20 66 6f 72 20 65 72 72 6f 72 20 6f  RROR for error o
47f0: 72 20 69 66 20 6e 6f 74 20 73 75 70 70 6f 72 74  r if not support
4800: 65 64 2e 20 49 66 0a 20 2a 09 64 69 72 65 63 74  ed. If. *.direct
4810: 69 6f 6e 20 69 73 20 54 43 4c 5f 52 45 41 44 41  ion is TCL_READA
4820: 42 4c 45 2c 20 73 65 74 73 20 68 61 6e 64 6c 65  BLE, sets handle
4830: 50 74 72 20 74 6f 20 74 68 65 20 68 61 6e 64 6c  Ptr to the handl
4840: 65 20 75 73 65 64 20 66 6f 72 0a 20 2a 09 69 6e  e used for. *.in
4850: 70 75 74 2c 20 6f 72 20 69 66 20 54 43 4c 5f 57  put, or if TCL_W
4860: 52 49 54 41 42 4c 45 20 73 65 74 73 20 74 6f 20  RITABLE sets to 
4870: 74 68 65 20 68 61 6e 64 6c 65 20 75 73 65 64 20  the handle used 
4880: 66 6f 72 20 6f 75 74 70 75 74 2e 0a 20 2a 0a 20  for output.. *. 
4890: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
48a0: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d   *.None. *. *---
48b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48f0: 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65  ---. */.int Dige
4900: 73 74 47 65 74 48 61 6e 64 6c 65 50 72 6f 63 28  stGetHandleProc(
4910: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
4920: 74 44 61 74 61 2c 20 69 6e 74 20 64 69 72 65 63  tData, int direc
4930: 74 69 6f 6e 2c 20 43 6c 69 65 6e 74 44 61 74 61  tion, ClientData
4940: 20 2a 68 61 6e 64 6c 65 50 74 72 29 20 7b 0a 20   *handlePtr) {. 
4950: 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a     DigestState *
4960: 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65  statePtr = (Dige
4970: 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e  stState *) clien
4980: 74 44 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 43  tData;.    Tcl_C
4990: 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 3b 0a 0a  hannel parent;..
49a0: 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 69 66 20      /* Abort if 
49b0: 6e 6f 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20  no channel */.  
49c0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
49d0: 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61  self == (Tcl_Cha
49e0: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72  nnel) NULL) {..r
49f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
4a00: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 61 72 65  .    }..    pare
4a10: 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 63  nt = Tcl_GetStac
4a20: 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 65  kedChannel(state
4a30: 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 20  Ptr->self);.    
4a40: 72 65 74 75 72 6e 20 54 63 6c 5f 47 65 74 43 68  return Tcl_GetCh
4a50: 61 6e 6e 65 6c 48 61 6e 64 6c 65 28 70 61 72 65  annelHandle(pare
4a60: 6e 74 2c 20 64 69 72 65 63 74 69 6f 6e 2c 20 68  nt, direction, h
4a70: 61 6e 64 6c 65 50 74 72 29 3b 0a 7d 0a 0a 2f 2a  andlePtr);.}../*
4a80: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
4a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
4ad0: 44 69 67 65 73 74 4e 6f 74 69 66 79 50 72 6f 63  DigestNotifyProc
4ae0: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64   --. *. *.Called
4af0: 20 62 79 20 54 63 6c 20 74 6f 20 69 6e 66 6f 72   by Tcl to infor
4b00: 6d 20 75 73 20 6f 66 20 61 63 74 69 76 69 74 79  m us of activity
4b10: 20 6f 6e 20 74 68 65 20 75 6e 64 65 72 6c 79 69   on the underlyi
4b20: 6e 67 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20  ng channel.. *. 
4b30: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 55 6e  * Returns:. *.Un
4b40: 63 68 61 6e 67 65 64 20 69 6e 74 65 72 65 73 74  changed interest
4b50: 4d 61 73 6b 20 77 68 69 63 68 20 69 73 20 61 6e  Mask which is an
4b60: 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69   OR-ed combinati
4b70: 6f 6e 20 6f 66 20 54 43 4c 5f 52 45 41 44 41 42  on of TCL_READAB
4b80: 4c 45 20 6f 72 20 54 43 4c 5f 57 52 49 54 41 42  LE or TCL_WRITAB
4b90: 4c 45 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  LE. *. * Side ef
4ba0: 66 65 63 74 73 3a 0a 20 2a 09 43 61 6e 63 65 6c  fects:. *.Cancel
4bb0: 73 20 61 6e 79 20 70 65 6e 64 69 6e 67 20 74 69  s any pending ti
4bc0: 6d 65 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  mer.. *. *------
4bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c10: 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 4e  . */.int DigestN
4c20: 6f 74 69 66 79 50 72 6f 63 28 43 6c 69 65 6e 74  otifyProc(Client
4c30: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
4c40: 20 69 6e 74 20 69 6e 74 65 72 65 73 74 4d 61 73   int interestMas
4c50: 6b 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53  k) {.    DigestS
4c60: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
4c70: 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 29   (DigestState *)
4c80: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20   clientData;..  
4c90: 20 20 2f 2a 20 53 6b 69 70 20 74 69 6d 65 72 20    /* Skip timer 
4ca0: 65 76 65 6e 74 20 61 73 20 72 65 64 75 6e 64 61  event as redunda
4cb0: 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74  nt */.    if (st
4cc0: 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d  atePtr->timer !=
4cd0: 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e   (Tcl_TimerToken
4ce0: 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44  ) NULL) {..Tcl_D
4cf0: 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65  eleteTimerHandle
4d00: 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65  r(statePtr->time
4d10: 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74  r);..statePtr->t
4d20: 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65  imer = (Tcl_Time
4d30: 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 20 20  rToken) NULL;.  
4d40: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 69    }.    return i
4d50: 6e 74 65 72 65 73 74 4d 61 73 6b 3b 0a 7d 0a 0a  nterestMask;.}..
4d60: 2f 2a 0a 20 2a 0a 20 2a 20 43 68 61 6e 6e 65 6c  /*. *. * Channel
4d70: 20 74 79 70 65 20 73 74 72 75 63 74 75 72 65 20   type structure 
4d80: 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20 64  definition for d
4d90: 69 67 65 73 74 20 74 72 61 6e 73 66 6f 72 6d 61  igest transforma
4da0: 74 69 6f 6e 73 2e 0a 20 2a 0a 20 2a 2f 0a 73 74  tions.. *. */.st
4db0: 61 74 69 63 20 63 6f 6e 73 74 20 54 63 6c 5f 43  atic const Tcl_C
4dc0: 68 61 6e 6e 65 6c 54 79 70 65 20 64 69 67 65 73  hannelType diges
4dd0: 74 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d 20 7b  tChannelType = {
4de0: 0a 20 20 20 20 22 64 69 67 65 73 74 22 2c 09 09  .    "digest",..
4df0: 09 2f 2a 20 54 79 70 65 20 6e 61 6d 65 20 2a 2f  ./* Type name */
4e00: 0a 20 20 20 20 54 43 4c 5f 43 48 41 4e 4e 45 4c  .    TCL_CHANNEL
4e10: 5f 56 45 52 53 49 4f 4e 5f 35 2c 09 2f 2a 20 76  _VERSION_5,./* v
4e20: 35 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20  5 channel */.   
4e30: 20 44 69 67 65 73 74 43 6c 6f 73 65 50 72 6f 63   DigestCloseProc
4e40: 2c 09 09 2f 2a 20 43 6c 6f 73 65 20 70 72 6f 63  ,../* Close proc
4e50: 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 49 6e   */.    DigestIn
4e60: 70 75 74 50 72 6f 63 2c 09 09 2f 2a 20 49 6e 70  putProc,../* Inp
4e70: 75 74 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 44  ut proc */.    D
4e80: 69 67 65 73 74 4f 75 74 70 75 74 50 72 6f 63 2c  igestOutputProc,
4e90: 09 09 2f 2a 20 4f 75 74 70 75 74 20 70 72 6f 63  ../* Output proc
4ea0: 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 09   */.    NULL,...
4eb0: 2f 2a 20 53 65 65 6b 20 70 72 6f 63 20 2a 2f 0a  /* Seek proc */.
4ec0: 20 20 20 20 44 69 67 65 73 74 53 65 74 4f 70 74      DigestSetOpt
4ed0: 69 6f 6e 50 72 6f 63 2c 09 2f 2a 20 53 65 74 20  ionProc,./* Set 
4ee0: 6f 70 74 69 6f 6e 20 70 72 6f 63 20 2a 2f 0a 20  option proc */. 
4ef0: 20 20 20 44 69 67 65 73 74 47 65 74 4f 70 74 69     DigestGetOpti
4f00: 6f 6e 50 72 6f 63 2c 09 2f 2a 20 47 65 74 20 6f  onProc,./* Get o
4f10: 70 74 69 6f 6e 20 70 72 6f 63 20 2a 2f 0a 20 20  ption proc */.  
4f20: 20 20 44 69 67 65 73 74 57 61 74 63 68 50 72 6f    DigestWatchPro
4f30: 63 2c 09 09 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  c,../* Initializ
4f40: 65 20 6e 6f 74 69 66 69 65 72 20 2a 2f 0a 20 20  e notifier */.  
4f50: 20 20 44 69 67 65 73 74 47 65 74 48 61 6e 64 6c    DigestGetHandl
4f60: 65 50 72 6f 63 2c 09 2f 2a 20 47 65 74 20 4f 53  eProc,./* Get OS
4f70: 20 68 61 6e 64 6c 65 73 20 6f 75 74 20 6f 66 20   handles out of 
4f80: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 44  channel */.    D
4f90: 69 67 65 73 74 43 6c 6f 73 65 32 50 72 6f 63 2c  igestClose2Proc,
4fa0: 09 09 2f 2a 20 63 6c 6f 73 65 32 70 72 6f 63 20  ../* close2proc 
4fb0: 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 42 6c 6f  */.    DigestBlo
4fc0: 63 6b 4d 6f 64 65 50 72 6f 63 2c 09 2f 2a 20 53  ckModeProc,./* S
4fd0: 65 74 20 62 6c 6f 63 6b 69 6e 67 2f 6e 6f 6e 62  et blocking/nonb
4fe0: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2a 2f 0a 20  locking mode*/. 
4ff0: 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 46 6c     NULL,.../* Fl
5000: 75 73 68 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20  ush proc */.    
5010: 44 69 67 65 73 74 4e 6f 74 69 66 79 50 72 6f 63  DigestNotifyProc
5020: 2c 09 09 2f 2a 20 48 61 6e 64 6c 69 6e 67 20 6f  ,../* Handling o
5030: 66 20 65 76 65 6e 74 73 20 62 75 62 62 6c 69 6e  f events bubblin
5040: 67 20 75 70 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c  g up */.    NULL
5050: 2c 09 09 09 2f 2a 20 57 69 64 65 20 73 65 65 6b  ,.../* Wide seek
5060: 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 4e 55 4c   proc */.    NUL
5070: 4c 2c 09 09 09 2f 2a 20 54 68 72 65 61 64 20 61  L,.../* Thread a
5080: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 4e 55 4c  ction */.    NUL
5090: 4c 09 09 09 2f 2a 20 54 72 75 6e 63 61 74 65 20  L.../* Truncate 
50a0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  */.};../*. *----
50b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50f0: 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 43  --. *. * DigestC
5100: 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 20 2d 2d  hannelHandler --
5110: 0a 20 2a 0a 20 2a 09 43 72 65 61 74 65 20 61 20  . *. *.Create a 
5120: 73 74 61 63 6b 65 64 20 63 68 61 6e 6e 65 6c 20  stacked channel 
5130: 66 6f 72 20 61 20 6d 65 73 73 61 67 65 20 64 69  for a message di
5140: 67 65 73 74 20 74 72 61 6e 73 66 6f 72 6d 61 74  gest transformat
5150: 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72  ion.. *. * Retur
5160: 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72  ns:. *.TCL_OK or
5170: 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a   TCL_ERROR. *. *
5180: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
5190: 2a 09 41 64 64 73 20 74 72 61 6e 73 66 6f 72 6d  *.Adds transform
51a0: 20 74 6f 20 63 68 61 6e 6e 65 6c 20 61 6e 64 20   to channel and 
51b0: 73 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20 63  sets result to c
51c0: 68 61 6e 6e 65 6c 20 69 64 20 6f 72 20 65 72 72  hannel id or err
51d0: 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20  or message.. *. 
51e0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
51f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5220: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
5230: 69 63 20 69 6e 74 0a 44 69 67 65 73 74 43 68 61  ic int.DigestCha
5240: 6e 6e 65 6c 48 61 6e 64 6c 65 72 28 54 63 6c 5f  nnelHandler(Tcl_
5250: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
5260: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 68 61 6e  const char *chan
5270: 6e 65 6c 2c 20 63 6f 6e 73 74 20 45 56 50 5f 4d  nel, const EVP_M
5280: 44 20 2a 6d 64 2c 0a 09 63 6f 6e 73 74 20 45 56  D *md,..const EV
5290: 50 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65 72  P_CIPHER *cipher
52a0: 2c 20 69 6e 74 20 66 6f 72 6d 61 74 2c 20 54 63  , int format, Tc
52b0: 6c 5f 4f 62 6a 20 2a 6b 65 79 4f 62 6a 2c 20 45  l_Obj *keyObj, E
52c0: 56 50 5f 4d 41 43 20 2a 6d 61 63 29 20 7b 0a 20  VP_MAC *mac) {. 
52d0: 20 20 20 69 6e 74 20 6d 6f 64 65 3b 20 2f 2a 20     int mode; /* 
52e0: 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f  OR-ed combinatio
52f0: 6e 20 6f 66 20 54 43 4c 5f 52 45 41 44 41 42 4c  n of TCL_READABL
5300: 45 20 61 6e 64 20 54 43 4c 5f 57 52 49 54 41 42  E and TCL_WRITAB
5310: 4c 45 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 43 68  LE */.    Tcl_Ch
5320: 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20  annel chan;.    
5330: 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61  DigestState *sta
5340: 74 65 50 74 72 3b 0a 0a 20 20 20 20 2f 2a 20 56  tePtr;..    /* V
5350: 61 6c 69 64 61 74 65 20 61 72 67 73 20 2a 2f 0a  alidate args */.
5360: 20 20 20 20 69 66 20 28 63 68 61 6e 6e 65 6c 20      if (channel 
5370: 3d 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  == (const char *
5380: 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  ) NULL) {..retur
5390: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
53a0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63   }..    /* Get c
53b0: 68 61 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20 20 20  hannel Id */.   
53c0: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43   chan = Tcl_GetC
53d0: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63  hannel(interp, c
53e0: 68 61 6e 6e 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a  hannel, &mode);.
53f0: 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20      if (chan == 
5400: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
5410: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  LL) {..return TC
5420: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
5430: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
5440: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
5450: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e  he topmost chann
5460: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d  el */.    chan =
5470: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e   Tcl_GetTopChann
5480: 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f  el(chan);..    /
5490: 2a 20 43 72 65 61 74 65 20 73 74 61 74 65 20 64  * Create state d
54a0: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ata structure */
54b0: 0a 20 20 20 20 69 66 20 28 28 73 74 61 74 65 50  .    if ((stateP
54c0: 74 72 20 3d 20 44 69 67 65 73 74 53 74 61 74 65  tr = DigestState
54d0: 4e 65 77 28 69 6e 74 65 72 70 2c 20 66 6f 72 6d  New(interp, form
54e0: 61 74 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  at)) == NULL) {.
54f0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
5500: 74 28 69 6e 74 65 72 70 2c 20 22 4d 65 6d 6f 72  t(interp, "Memor
5510: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
5520: 6f 72 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  or", (char *) NU
5530: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
5540: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
5550: 20 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66    statePtr->self
5560: 20 3d 20 63 68 61 6e 3b 0a 20 20 20 20 73 74 61   = chan;.    sta
5570: 74 65 50 74 72 2d 3e 6d 6f 64 65 20 3d 20 6d 6f  tePtr->mode = mo
5580: 64 65 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74  de;..    /* Init
5590: 69 61 6c 69 7a 65 20 68 61 73 68 20 66 75 6e 63  ialize hash func
55a0: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28  tion */.    if (
55b0: 44 69 67 65 73 74 49 6e 69 74 69 61 6c 69 7a 65  DigestInitialize
55c0: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
55d0: 72 2c 20 6d 64 2c 20 63 69 70 68 65 72 2c 20 6b  r, md, cipher, k
55e0: 65 79 4f 62 6a 2c 20 6d 61 63 29 20 21 3d 20 54  eyObj, mac) != T
55f0: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e  CL_OK) {..return
5600: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
5610: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67  }..    /* Config
5620: 75 72 65 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  ure channel */. 
5630: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65     Tcl_SetChanne
5640: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
5650: 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74  chan, "-translat
5660: 69 6f 6e 22 2c 20 22 62 69 6e 61 72 79 22 29 3b  ion", "binary");
5670: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74  .    if (Tcl_Get
5680: 43 68 61 6e 6e 65 6c 42 75 66 66 65 72 53 69 7a  ChannelBufferSiz
5690: 65 28 63 68 61 6e 29 20 3c 20 45 56 50 5f 4d 41  e(chan) < EVP_MA
56a0: 58 5f 4d 44 5f 53 49 5a 45 20 2a 20 32 29 20 7b  X_MD_SIZE * 2) {
56b0: 0a 09 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c  ..Tcl_SetChannel
56c0: 42 75 66 66 65 72 53 69 7a 65 28 63 68 61 6e 2c  BufferSize(chan,
56d0: 20 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45   EVP_MAX_MD_SIZE
56e0: 20 2a 20 32 29 3b 0a 20 20 20 20 7d 0a 0a 20 20   * 2);.    }..  
56f0: 20 20 2f 2a 20 53 74 61 63 6b 20 63 68 61 6e 6e    /* Stack chann
5700: 65 6c 2c 20 61 62 6f 72 74 20 66 6f 72 20 65 72  el, abort for er
5710: 72 6f 72 20 2a 2f 0a 20 20 20 20 73 74 61 74 65  ror */.    state
5720: 50 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f  Ptr->self = Tcl_
5730: 53 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74  StackChannel(int
5740: 65 72 70 2c 20 26 64 69 67 65 73 74 43 68 61 6e  erp, &digestChan
5750: 6e 65 6c 54 79 70 65 2c 20 28 43 6c 69 65 6e 74  nelType, (Client
5760: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2c 20  Data) statePtr, 
5770: 6d 6f 64 65 2c 20 63 68 61 6e 29 3b 0a 20 20 20  mode, chan);.   
5780: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73   if (statePtr->s
5790: 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  elf == (Tcl_Chan
57a0: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 44 69  nel) NULL) {..Di
57b0: 67 65 73 74 53 74 61 74 65 46 72 65 65 28 73 74  gestStateFree(st
57c0: 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e  atePtr);..return
57d0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
57e0: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 72 65  }..    /* Set re
57f0: 73 75 6c 74 20 74 6f 20 63 68 61 6e 6e 65 6c 20  sult to channel 
5800: 49 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 65  Id */.    Tcl_Se
5810: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
5820: 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74  (char *) Tcl_Get
5830: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e  ChannelName(chan
5840: 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  ), TCL_VOLATILE)
5850: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
5860: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  _OK;.}../*. *---
5870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5890: 2d 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 0a 20 2a 0a 20 2a 20 55 6e 73 74 61 63  ---. *. * Unstac
58c0: 6b 20 43 68 61 6e 6e 65 6c 20 2d 2d 0a 20 2a 0a  k Channel --. *.
58d0: 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e   *.This function
58e0: 20 72 65 6d 6f 76 65 73 20 74 68 65 20 73 74 61   removes the sta
58f0: 63 6b 65 64 20 63 68 61 6e 6e 65 6c 20 66 72 6f  cked channel fro
5900: 6d 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  m the top of the
5910: 0a 20 2a 09 63 68 61 6e 6e 65 6c 20 73 74 61 63  . *.channel stac
5920: 6b 20 69 66 20 69 74 20 69 73 20 61 20 64 69 67  k if it is a dig
5930: 65 73 74 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a  est channel.. *.
5940: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54   * Returns:. *.T
5950: 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52  CL_OK or TCL_ERR
5960: 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  OR. *. * Side ef
5970: 66 65 63 74 73 3a 0a 20 2a 09 52 65 6d 6f 76 65  fects:. *.Remove
5980: 73 20 74 72 61 6e 73 66 6f 72 6d 20 66 72 6f 6d  s transform from
5990: 20 63 68 61 6e 6e 65 6c 20 6f 72 20 73 65 74 73   channel or sets
59a0: 20 72 65 73 75 6c 74 20 74 6f 20 65 72 72 6f 72   result to error
59b0: 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 2d   message.. *. *-
59c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a00: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
5a10: 20 69 6e 74 0a 44 69 67 65 73 74 55 6e 73 74 61   int.DigestUnsta
5a20: 63 6b 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44  ckObjCmd(ClientD
5a30: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
5a40: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
5a50: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
5a60: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
5a70: 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43  v[]) {.    Tcl_C
5a80: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20  hannel chan;.   
5a90: 20 69 6e 74 20 6d 6f 64 65 3b 20 2f 2a 20 4f 52   int mode; /* OR
5aa0: 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  -ed combination 
5ab0: 6f 66 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 20  of TCL_READABLE 
5ac0: 61 6e 64 20 54 43 4c 5f 57 52 49 54 41 42 4c 45  and TCL_WRITABLE
5ad0: 20 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 56 61 6c    */..    /* Val
5ae0: 69 64 61 74 65 20 61 72 67 20 63 6f 75 6e 74 20  idate arg count 
5af0: 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  */.    if (objc 
5b00: 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f  != 2) {..Tcl_Wro
5b10: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
5b20: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e  , 1, objv, "chan
5b30: 6e 65 6c 49 64 22 29 3b 0a 09 72 65 74 75 72 6e  nelId");..return
5b40: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
5b50: 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 68  }..    /* Get ch
5b60: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61  annel */.    cha
5b70: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  n = Tcl_GetChann
5b80: 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  el(interp, Tcl_G
5b90: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
5ba0: 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20  objv[1], NULL), 
5bb0: 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 28  &mode);.    if (
5bc0: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61  chan == (Tcl_Cha
5bd0: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72  nnel) NULL) {..r
5be0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
5bf0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
5c00: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72  ake sure to oper
5c10: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f  ate on the topmo
5c20: 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20  st channel */.  
5c30: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
5c40: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29  TopChannel(chan)
5c50: 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
5c60: 69 66 20 64 69 67 65 73 74 20 63 68 61 6e 6e 65  if digest channe
5c70: 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c  l */.    if (Tcl
5c80: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28  _GetChannelType(
5c90: 63 68 61 6e 29 20 21 3d 20 26 64 69 67 65 73 74  chan) != &digest
5ca0: 43 68 61 6e 6e 65 6c 54 79 70 65 29 20 7b 0a 09  ChannelType) {..
5cb0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
5cc0: 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68  (interp, "bad ch
5cd0: 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47  annel \"", Tcl_G
5ce0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68  etChannelName(ch
5cf0: 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e  an),..    "\": n
5d00: 6f 74 20 61 20 64 69 67 65 73 74 20 63 68 61 6e  ot a digest chan
5d10: 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63  nel", NULL);..Tc
5d20: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
5d30: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 55  nterp, "TLS", "U
5d40: 4e 53 54 41 43 4b 22 2c 20 22 43 48 41 4e 4e 45  NSTACK", "CHANNE
5d50: 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28  L", "INVALID", (
5d60: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
5d70: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
5d80: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
5d90: 50 6f 70 20 74 72 61 6e 73 66 6f 72 6d 20 66 72  Pop transform fr
5da0: 6f 6d 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20  om channel */.  
5db0: 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 55 6e 73    return Tcl_Uns
5dc0: 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65  tackChannel(inte
5dd0: 72 70 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 09  rp, chan);.    .
5de0: 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69  clientData = cli
5df0: 65 6e 74 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 2a 2a  entData;.}../***
5e00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5e10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5e20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5e30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5e40: 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  /../*. *--------
5e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
5e90: 2a 20 44 69 67 65 73 74 49 6e 73 74 61 6e 63 65  * DigestInstance
5ea0: 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09  ObjCmd --. *. *.
5eb0: 48 61 6e 64 6c 65 72 20 66 6f 72 20 64 69 67 65  Handler for dige
5ec0: 73 74 20 63 6f 6d 6d 61 6e 64 20 69 6e 73 74 61  st command insta
5ed0: 6e 63 65 73 2e 20 55 73 65 64 20 74 6f 20 61 64  nces. Used to ad
5ee0: 64 20 64 61 74 61 20 74 6f 20 68 61 73 68 0a 20  d data to hash. 
5ef0: 2a 09 66 75 6e 63 74 69 6f 6e 20 6f 72 20 72 65  *.function or re
5f00: 74 72 69 65 76 65 20 6d 65 73 73 61 67 65 20 64  trieve message d
5f10: 69 67 65 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 74  igest.. *. * Ret
5f20: 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20  urns:. *.TCL_OK 
5f30: 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a  or TCL_ERROR. *.
5f40: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
5f50: 0a 20 2a 09 41 64 64 73 20 64 61 74 61 20 74 6f  . *.Adds data to
5f60: 20 68 61 73 68 20 6f 72 20 72 65 74 75 72 6e 73   hash or returns
5f70: 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 0a   message digest.
5f80: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
5f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fc0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74  --------. */.int
5fd0: 20 44 69 67 65 73 74 49 6e 73 74 61 6e 63 65 4f   DigestInstanceO
5fe0: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
5ff0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
6000: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
6010: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
6020: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
6030: 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74  ) {.    DigestSt
6040: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
6050: 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 29 20  (DigestState *) 
6060: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20  clientData;.    
6070: 69 6e 74 20 66 6e 2c 20 6c 65 6e 20 3d 20 30 3b  int fn, len = 0;
6080: 0a 20 20 20 20 63 68 61 72 20 2a 62 75 66 20 3d  .    char *buf =
6090: 20 4e 55 4c 4c 3b 0a 20 20 20 20 73 74 61 74 69   NULL;.    stati
60a0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 6e  c const char *in
60b0: 73 74 61 6e 63 65 5f 66 6e 73 20 5b 5d 20 3d 20  stance_fns [] = 
60c0: 7b 20 22 66 69 6e 61 6c 69 7a 65 22 2c 20 22 75  { "finalize", "u
60d0: 70 64 61 74 65 22 2c 20 4e 55 4c 4c 20 7d 3b 0a  pdate", NULL };.
60e0: 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 65  .    /* Validate
60f0: 20 61 72 67 20 63 6f 75 6e 74 20 2a 2f 0a 20 20   arg count */.  
6100: 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 20 7c    if (objc < 2 |
6110: 7c 20 6f 62 6a 63 20 3e 20 33 29 20 7b 0a 09 54  | objc > 3) {..T
6120: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
6130: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
6140: 20 22 66 75 6e 63 74 69 6f 6e 20 3f 64 61 74 61   "function ?data
6150: 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  ?");..return TCL
6160: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
6170: 20 20 20 2f 2a 20 47 65 74 20 66 75 6e 63 74 69     /* Get functi
6180: 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 63  on */.    if (Tc
6190: 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62  l_GetIndexFromOb
61a0: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31  j(interp, objv[1
61b0: 5d 2c 20 69 6e 73 74 61 6e 63 65 5f 66 6e 73 2c  ], instance_fns,
61c0: 20 22 66 75 6e 63 74 69 6f 6e 22 2c 20 30 2c 20   "function", 0, 
61d0: 26 66 6e 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  &fn) != TCL_OK) 
61e0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
61f0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
6200: 2f 2a 20 44 6f 20 66 75 6e 63 74 69 6f 6e 20 2a  /* Do function *
6210: 2f 0a 20 20 20 20 69 66 20 28 66 6e 29 20 7b 0a  /.    if (fn) {.
6220: 09 2f 2a 20 47 65 74 20 64 61 74 61 20 6f 72 20  ./* Get data or 
6230: 72 65 74 75 72 6e 20 65 72 72 6f 72 20 69 66 20  return error if 
6240: 6e 6f 6e 65 20 2a 2f 0a 09 69 66 20 28 6f 62 6a  none */..if (obj
6250: 63 20 3d 3d 20 33 29 20 7b 0a 09 20 20 20 20 62  c == 3) {..    b
6260: 75 66 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65  uf = Tcl_GetByte
6270: 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a  ArrayFromObj(obj
6280: 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 09 7d 20  v[2], &len);..} 
6290: 65 6c 73 65 20 7b 0a 09 20 20 20 20 54 63 6c 5f  else {..    Tcl_
62a0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
62b0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 75  erp, 1, objv, "u
62c0: 70 64 61 74 65 20 64 61 74 61 22 29 3b 0a 09 20  pdate data");.. 
62d0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
62e0: 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 55 70 64  ROR;..}.../* Upd
62f0: 61 74 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f  ate hash functio
6300: 6e 20 2a 2f 0a 09 69 66 20 28 21 44 69 67 65 73  n */..if (!Diges
6310: 74 55 70 64 61 74 65 28 73 74 61 74 65 50 74 72  tUpdate(statePtr
6320: 2c 20 62 75 66 2c 20 28 73 69 7a 65 5f 74 29 20  , buf, (size_t) 
6330: 6c 65 6e 2c 20 31 29 29 20 7b 0a 09 20 20 20 20  len, 1)) {..    
6340: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
6350: 3b 0a 09 7d 0a 0a 20 20 20 20 7d 20 65 6c 73 65  ;..}..    } else
6360: 20 7b 0a 09 2f 2a 20 46 69 6e 61 6c 69 7a 65 20   {../* Finalize 
6370: 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 61 6e  hash function an
6380: 64 20 63 61 6c 63 75 6c 61 74 65 20 6d 65 73 73  d calculate mess
6390: 61 67 65 20 64 69 67 65 73 74 20 2a 2f 0a 09 69  age digest */..i
63a0: 66 20 28 44 69 67 65 73 74 46 69 6e 61 6c 69 7a  f (DigestFinaliz
63b0: 65 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50  e(interp, stateP
63c0: 74 72 2c 20 4e 55 4c 4c 29 20 21 3d 20 54 43 4c  tr, NULL) != TCL
63d0: 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 72 65 74 75  _OK) {..    retu
63e0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
63f0: 0a 0a 09 54 63 6c 5f 44 65 6c 65 74 65 43 6f 6d  ...Tcl_DeleteCom
6400: 6d 61 6e 64 46 72 6f 6d 54 6f 6b 65 6e 28 69 6e  mandFromToken(in
6410: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e  terp, statePtr->
6420: 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  token);.    }.  
6430: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
6440: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
6450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
6490: 20 2a 20 44 69 67 65 73 74 43 6f 6d 6d 61 6e 64   * DigestCommand
64a0: 44 65 6c 65 74 65 48 61 6e 64 6c 65 72 20 2d 2d  DeleteHandler --
64b0: 0a 20 2a 0a 20 2a 09 20 43 61 6c 6c 62 61 63 6b  . *. *. Callback
64c0: 20 74 6f 20 63 6c 65 61 6e 2d 75 70 20 77 68 65   to clean-up whe
64d0: 6e 20 64 69 67 65 73 74 20 69 6e 73 74 61 6e 63  n digest instanc
64e0: 65 20 63 6f 6d 6d 61 6e 64 20 69 73 20 64 65 6c  e command is del
64f0: 65 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 74 75  eted.. *. * Retu
6500: 72 6e 73 3a 0a 20 2a 09 4e 6f 74 68 69 6e 67 0a  rns:. *.Nothing.
6510: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
6520: 74 73 3a 0a 20 2a 09 44 65 73 74 72 6f 79 73 20  ts:. *.Destroys 
6530: 73 74 61 74 65 20 69 6e 66 6f 20 73 74 72 75 63  state info struc
6540: 74 75 72 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ture. *. *------
6550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
6590: 2f 0a 76 6f 69 64 20 44 69 67 65 73 74 43 6f 6d  /.void DigestCom
65a0: 6d 61 6e 64 44 65 6c 65 74 65 48 61 6e 64 6c 65  mandDeleteHandle
65b0: 72 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  r(ClientData cli
65c0: 65 6e 74 44 61 74 61 29 20 7b 0a 20 20 20 20 44  entData) {.    D
65d0: 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74  igestState *stat
65e0: 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74  ePtr = (DigestSt
65f0: 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74  ate *) clientDat
6600: 61 3b 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 6e  a;..    /* Clean
6610: 2d 75 70 20 2a 2f 0a 20 20 20 20 44 69 67 65 73  -up */.    Diges
6620: 74 53 74 61 74 65 46 72 65 65 28 73 74 61 74 65  tStateFree(state
6630: 50 74 72 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d  Ptr);.}../*. *--
6640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6680: 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 43 6f  -. *. * DigestCo
6690: 6d 6d 61 6e 64 48 61 6e 64 6c 65 72 20 2d 2d 0a  mmandHandler --.
66a0: 20 2a 0a 20 2a 09 20 43 72 65 61 74 65 20 63 6f   *. *. Create co
66b0: 6d 6d 61 6e 64 20 74 6f 20 61 6c 6c 6f 77 20 75  mmand to allow u
66c0: 73 65 72 20 74 6f 20 61 64 64 20 64 61 74 61 20  ser to add data 
66d0: 74 6f 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e  to hash function
66e0: 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a  .. *. * Returns:
66f0: 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43  . *.TCL_OK or TC
6700: 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69  L_ERROR. *. * Si
6710: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
6720: 72 65 61 74 65 73 20 63 6f 6d 6d 61 6e 64 20 6f  reates command o
6730: 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  r error message.
6740: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
6750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6780: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74  --------. */.int
6790: 20 44 69 67 65 73 74 43 6f 6d 6d 61 6e 64 48 61   DigestCommandHa
67a0: 6e 64 6c 65 72 28 54 63 6c 5f 49 6e 74 65 72 70  ndler(Tcl_Interp
67b0: 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62   *interp, Tcl_Ob
67c0: 6a 20 2a 63 6d 64 4f 62 6a 2c 20 63 6f 6e 73 74  j *cmdObj, const
67d0: 20 45 56 50 5f 4d 44 20 2a 6d 64 2c 0a 09 63 6f   EVP_MD *md,..co
67e0: 6e 73 74 20 45 56 50 5f 43 49 50 48 45 52 20 2a  nst EVP_CIPHER *
67f0: 63 69 70 68 65 72 2c 20 69 6e 74 20 66 6f 72 6d  cipher, int form
6800: 61 74 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79  at, Tcl_Obj *key
6810: 4f 62 6a 2c 20 45 56 50 5f 4d 41 43 20 2a 6d 61  Obj, EVP_MAC *ma
6820: 63 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53  c) {.    DigestS
6830: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a  tate *statePtr;.
6840: 20 20 20 20 63 68 61 72 20 2a 63 6d 64 4e 61 6d      char *cmdNam
6850: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
6860: 67 46 72 6f 6d 4f 62 6a 28 63 6d 64 4f 62 6a 2c  gFromObj(cmdObj,
6870: 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20   NULL);..    /* 
6880: 43 72 65 61 74 65 20 73 74 61 74 65 20 64 61 74  Create state dat
6890: 61 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  a structure */. 
68a0: 20 20 20 69 66 20 28 28 73 74 61 74 65 50 74 72     if ((statePtr
68b0: 20 3d 20 44 69 67 65 73 74 53 74 61 74 65 4e 65   = DigestStateNe
68c0: 77 28 69 6e 74 65 72 70 2c 20 66 6f 72 6d 61 74  w(interp, format
68d0: 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54  )) == NULL) {..T
68e0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
68f0: 69 6e 74 65 72 70 2c 20 22 4d 65 6d 6f 72 79 20  interp, "Memory 
6900: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
6910: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
6920: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
6930: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
6940: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 68   /* Initialize h
6950: 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ash function */.
6960: 20 20 20 20 69 66 20 28 44 69 67 65 73 74 49 6e      if (DigestIn
6970: 69 74 69 61 6c 69 7a 65 28 69 6e 74 65 72 70 2c  itialize(interp,
6980: 20 73 74 61 74 65 50 74 72 2c 20 6d 64 2c 20 63   statePtr, md, c
6990: 69 70 68 65 72 2c 20 6b 65 79 4f 62 6a 2c 20 6d  ipher, keyObj, m
69a0: 61 63 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  ac) != TCL_OK) {
69b0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
69c0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
69d0: 2a 20 43 72 65 61 74 65 20 69 6e 73 74 61 6e 63  * Create instanc
69e0: 65 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20  e command */.   
69f0: 20 73 74 61 74 65 50 74 72 2d 3e 74 6f 6b 65 6e   statePtr->token
6a00: 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a   = Tcl_CreateObj
6a10: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
6a20: 63 6d 64 4e 61 6d 65 2c 20 44 69 67 65 73 74 49  cmdName, DigestI
6a30: 6e 73 74 61 6e 63 65 4f 62 6a 43 6d 64 2c 0a 09  nstanceObjCmd,..
6a40: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61  (ClientData) sta
6a50: 74 65 50 74 72 2c 20 44 69 67 65 73 74 43 6f 6d  tePtr, DigestCom
6a60: 6d 61 6e 64 44 65 6c 65 74 65 48 61 6e 64 6c 65  mandDeleteHandle
6a70: 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 74 75  r);..    /* Retu
6a80: 72 6e 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20  rn command name 
6a90: 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  */.    Tcl_SetOb
6aa0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
6ab0: 63 6d 64 4f 62 6a 29 3b 0a 20 20 20 20 72 65 74  cmdObj);.    ret
6ac0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
6ad0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
6ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6af0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b10: 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  ****/../*. *----
6b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
6b60: 20 2a 0a 20 2a 20 44 69 67 65 73 74 44 61 74 61   *. * DigestData
6b70: 48 61 6e 64 6c 65 72 20 2d 2d 0a 20 2a 0a 20 2a  Handler --. *. *
6b80: 09 52 65 74 75 72 6e 20 6d 65 73 73 61 67 65 20  .Return message 
6b90: 64 69 67 65 73 74 20 66 6f 72 20 64 61 74 61 20  digest for data 
6ba0: 75 73 69 6e 67 20 75 73 65 72 20 73 70 65 63 69  using user speci
6bb0: 66 69 65 64 20 68 61 73 68 20 66 75 6e 63 74 69  fied hash functi
6bc0: 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  on.. *. * Return
6bd0: 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20  s:. *.TCL_OK or 
6be0: 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20  TCL_ERROR. *. * 
6bf0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
6c00: 09 53 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20  .Sets result to 
6c10: 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20 6f  message digest o
6c20: 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  r error message.
6c30: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
6c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c70: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74  --------. */.int
6c80: 0a 44 69 67 65 73 74 44 61 74 61 48 61 6e 64 6c  .DigestDataHandl
6c90: 65 72 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  er(Tcl_Interp *i
6ca0: 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a  nterp, Tcl_Obj *
6cb0: 64 61 74 61 4f 62 6a 2c 20 63 6f 6e 73 74 20 45  dataObj, const E
6cc0: 56 50 5f 4d 44 20 2a 6d 64 2c 0a 09 63 6f 6e 73  VP_MD *md,..cons
6cd0: 74 20 45 56 50 5f 43 49 50 48 45 52 20 2a 63 69  t EVP_CIPHER *ci
6ce0: 70 68 65 72 2c 20 69 6e 74 20 66 6f 72 6d 61 74  pher, int format
6cf0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4f 62  , Tcl_Obj *keyOb
6d00: 6a 2c 20 45 56 50 5f 4d 41 43 20 2a 6d 61 63 29  j, EVP_MAC *mac)
6d10: 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 64 61 74   {.    char *dat
6d20: 61 3b 0a 20 20 20 20 69 6e 74 20 64 61 74 61 5f  a;.    int data_
6d30: 6c 65 6e 3b 0a 20 20 20 20 44 69 67 65 73 74 53  len;.    DigestS
6d40: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a  tate *statePtr;.
6d50: 0a 20 20 20 20 2f 2a 20 47 65 74 20 64 61 74 61  .    /* Get data
6d60: 20 2a 2f 0a 20 20 20 20 64 61 74 61 20 3d 20 54   */.    data = T
6d70: 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46  cl_GetByteArrayF
6d80: 72 6f 6d 4f 62 6a 28 64 61 74 61 4f 62 6a 2c 20  romObj(dataObj, 
6d90: 26 64 61 74 61 5f 6c 65 6e 29 3b 0a 20 20 20 20  &data_len);.    
6da0: 69 66 20 28 64 61 74 61 20 3d 3d 20 4e 55 4c 4c  if (data == NULL
6db0: 29 20 7b 0a 09 54 63 6c 5f 53 65 74 52 65 73 75  ) {..Tcl_SetResu
6dc0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20 64  lt(interp, "No d
6dd0: 61 74 61 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65  ata", NULL);..re
6de0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6df0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72      }..    /* Cr
6e00: 65 61 74 65 20 73 74 61 74 65 20 64 61 74 61 20  eate state data 
6e10: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20  structure */.   
6e20: 20 69 66 20 28 28 73 74 61 74 65 50 74 72 20 3d   if ((statePtr =
6e30: 20 44 69 67 65 73 74 53 74 61 74 65 4e 65 77 28   DigestStateNew(
6e40: 69 6e 74 65 72 70 2c 20 66 6f 72 6d 61 74 29 29  interp, format))
6e50: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c   == NULL) {..Tcl
6e60: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
6e70: 74 65 72 70 2c 20 22 4d 65 6d 6f 72 79 20 61 6c  terp, "Memory al
6e80: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 22 2c  location error",
6e90: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
6ea0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
6eb0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
6ec0: 2a 20 43 61 6c 63 20 44 69 67 65 73 74 2c 20 61  * Calc Digest, a
6ed0: 62 6f 72 74 20 66 6f 72 20 65 72 72 6f 72 20 2a  bort for error *
6ee0: 2f 0a 20 20 20 20 69 66 20 28 44 69 67 65 73 74  /.    if (Digest
6ef0: 49 6e 69 74 69 61 6c 69 7a 65 28 69 6e 74 65 72  Initialize(inter
6f00: 70 2c 20 73 74 61 74 65 50 74 72 2c 20 6d 64 2c  p, statePtr, md,
6f10: 20 63 69 70 68 65 72 2c 20 6b 65 79 4f 62 6a 2c   cipher, keyObj,
6f20: 20 6d 61 63 29 20 21 3d 20 54 43 4c 5f 4f 4b 20   mac) != TCL_OK 
6f30: 7c 7c 0a 09 44 69 67 65 73 74 55 70 64 61 74 65  ||..DigestUpdate
6f40: 28 73 74 61 74 65 50 74 72 2c 20 64 61 74 61 2c  (statePtr, data,
6f50: 20 28 73 69 7a 65 5f 74 29 20 64 61 74 61 5f 6c   (size_t) data_l
6f60: 65 6e 2c 20 31 29 20 3d 3d 20 30 20 7c 7c 0a 09  en, 1) == 0 ||..
6f70: 44 69 67 65 73 74 46 69 6e 61 6c 69 7a 65 28 69  DigestFinalize(i
6f80: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c  nterp, statePtr,
6f90: 20 4e 55 4c 4c 29 20 21 3d 20 54 43 4c 5f 4f 4b   NULL) != TCL_OK
6fa0: 29 20 7b 0a 09 44 69 67 65 73 74 53 74 61 74 65  ) {..DigestState
6fb0: 46 72 65 65 28 73 74 61 74 65 50 74 72 29 3b 0a  Free(statePtr);.
6fc0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
6fd0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
6fe0: 20 43 6c 65 61 6e 2d 75 70 20 2a 2f 0a 20 20 20   Clean-up */.   
6ff0: 20 44 69 67 65 73 74 53 74 61 74 65 46 72 65 65   DigestStateFree
7000: 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20  (statePtr);.    
7010: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
7020: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
7030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7060: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d  ******/../*. *--
7070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
70a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
70b0: 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 46 69  -. *. * DigestFi
70c0: 6c 65 48 61 6e 64 6c 65 72 20 2d 2d 0a 20 2a 0a  leHandler --. *.
70d0: 20 2a 09 52 65 74 75 72 6e 20 6d 65 73 73 61 67   *.Return messag
70e0: 65 20 64 69 67 65 73 74 20 66 6f 72 20 66 69 6c  e digest for fil
70f0: 65 20 75 73 69 6e 67 20 75 73 65 72 20 73 70 65  e using user spe
7100: 63 69 66 69 65 64 20 68 61 73 68 20 66 75 6e 63  cified hash func
7110: 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 75  tion.. *. * Retu
7120: 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f  rns:. *.TCL_OK o
7130: 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20  r TCL_ERROR. *. 
7140: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
7150: 20 2a 09 52 65 73 75 6c 74 20 69 73 20 6d 65 73   *.Result is mes
7160: 73 61 67 65 20 64 69 67 65 73 74 20 6f 72 20 65  sage digest or e
7170: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a  rror message. *.
7180: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
7190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71c0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69  -----. */.int Di
71d0: 67 65 73 74 46 69 6c 65 48 61 6e 64 6c 65 72 28  gestFileHandler(
71e0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
71f0: 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 66 69 6c  rp, Tcl_Obj *fil
7200: 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 45 56 50  ename, const EVP
7210: 5f 4d 44 20 2a 6d 64 2c 0a 09 63 6f 6e 73 74 20  _MD *md,..const 
7220: 45 56 50 5f 43 49 50 48 45 52 20 2a 63 69 70 68  EVP_CIPHER *ciph
7230: 65 72 2c 20 69 6e 74 20 66 6f 72 6d 61 74 2c 20  er, int format, 
7240: 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4f 62 6a 2c  Tcl_Obj *keyObj,
7250: 20 45 56 50 5f 4d 41 43 20 2a 6d 61 63 29 20 7b   EVP_MAC *mac) {
7260: 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65  .    DigestState
7270: 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 20 20 20   *statePtr;.    
7280: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e  Tcl_Channel chan
7290: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e 73   = NULL;.    uns
72a0: 69 67 6e 65 64 20 63 68 61 72 20 62 75 66 5b 42  igned char buf[B
72b0: 55 46 46 45 52 5f 53 49 5a 45 5d 3b 0a 20 20 20  UFFER_SIZE];.   
72c0: 20 69 6e 74 20 72 65 73 20 3d 20 54 43 4c 5f 4f   int res = TCL_O
72d0: 4b 2c 20 6c 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20  K, len;..    /* 
72e0: 43 72 65 61 74 65 20 73 74 61 74 65 20 64 61 74  Create state dat
72f0: 61 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  a structure */. 
7300: 20 20 20 69 66 20 28 28 73 74 61 74 65 50 74 72     if ((statePtr
7310: 20 3d 20 44 69 67 65 73 74 53 74 61 74 65 4e 65   = DigestStateNe
7320: 77 28 69 6e 74 65 72 70 2c 20 66 6f 72 6d 61 74  w(interp, format
7330: 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54  )) == NULL) {..T
7340: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
7350: 69 6e 74 65 72 70 2c 20 22 4d 65 6d 6f 72 79 20  interp, "Memory 
7360: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
7370: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
7380: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
7390: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
73a0: 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 63 68   /* Open file ch
73b0: 61 6e 6e 65 6c 2c 20 61 62 6f 72 74 20 66 6f 72  annel, abort for
73c0: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 63 68   error */.    ch
73d0: 61 6e 20 3d 20 54 63 6c 5f 46 53 4f 70 65 6e 46  an = Tcl_FSOpenF
73e0: 69 6c 65 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  ileChannel(inter
73f0: 70 2c 20 66 69 6c 65 6e 61 6d 65 2c 20 22 72 62  p, filename, "rb
7400: 22 2c 20 30 34 34 34 29 3b 0a 20 20 20 20 69 66  ", 0444);.    if
7410: 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43   (chan == (Tcl_C
7420: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a  hannel) NULL) {.
7430: 09 44 69 67 65 73 74 53 74 61 74 65 46 72 65 65  .DigestStateFree
7440: 28 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74  (statePtr);..ret
7450: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
7460: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e     }..    /* Con
7470: 66 69 67 75 72 65 20 63 68 61 6e 6e 65 6c 20 2a  figure channel *
7480: 2f 0a 20 20 20 20 69 66 20 28 28 72 65 73 20 3d  /.    if ((res =
7490: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_SetChannelO
74a0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68  ption(interp, ch
74b0: 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f  an, "-translatio
74c0: 6e 22 2c 20 22 62 69 6e 61 72 79 22 29 29 20 3d  n", "binary")) =
74d0: 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09  = TCL_ERROR) {..
74e0: 67 6f 74 6f 20 64 6f 6e 65 3b 0a 20 20 20 20 7d  goto done;.    }
74f0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e  .    Tcl_SetChan
7500: 6e 65 6c 42 75 66 66 65 72 53 69 7a 65 28 63 68  nelBufferSize(ch
7510: 61 6e 2c 20 42 55 46 46 45 52 5f 53 49 5a 45 29  an, BUFFER_SIZE)
7520: 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  ;..    /* Initia
7530: 6c 69 7a 65 20 68 61 73 68 20 66 75 6e 63 74 69  lize hash functi
7540: 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 72  on */.    if ((r
7550: 65 73 20 3d 20 44 69 67 65 73 74 49 6e 69 74 69  es = DigestIniti
7560: 61 6c 69 7a 65 28 69 6e 74 65 72 70 2c 20 73 74  alize(interp, st
7570: 61 74 65 50 74 72 2c 20 6d 64 2c 20 63 69 70 68  atePtr, md, ciph
7580: 65 72 2c 20 6b 65 79 4f 62 6a 2c 20 6d 61 63 29  er, keyObj, mac)
7590: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
75a0: 67 6f 74 6f 20 64 6f 6e 65 3b 0a 20 20 20 20 7d  goto done;.    }
75b0: 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 66 69  ..    /* Read fi
75c0: 6c 65 20 64 61 74 61 20 61 6e 64 20 75 70 64 61  le data and upda
75d0: 74 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e  te hash function
75e0: 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 20 28 21   */.    while (!
75f0: 54 63 6c 5f 45 6f 66 28 63 68 61 6e 29 29 20 7b  Tcl_Eof(chan)) {
7600: 0a 09 6c 65 6e 20 3d 20 54 63 6c 5f 52 65 61 64  ..len = Tcl_Read
7610: 52 61 77 28 63 68 61 6e 2c 20 28 63 68 61 72 20  Raw(chan, (char 
7620: 2a 29 20 62 75 66 2c 20 42 55 46 46 45 52 5f 53  *) buf, BUFFER_S
7630: 49 5a 45 29 3b 0a 09 69 66 20 28 6c 65 6e 20 3e  IZE);..if (len >
7640: 20 30 29 20 7b 0a 09 20 20 20 20 69 66 20 28 21   0) {..    if (!
7650: 44 69 67 65 73 74 55 70 64 61 74 65 28 73 74 61  DigestUpdate(sta
7660: 74 65 50 74 72 2c 20 26 62 75 66 5b 30 5d 2c 20  tePtr, &buf[0], 
7670: 28 73 69 7a 65 5f 74 29 20 6c 65 6e 2c 20 31 29  (size_t) len, 1)
7680: 29 20 7b 0a 09 09 72 65 73 20 3d 20 54 43 4c 5f  ) {...res = TCL_
7690: 45 52 52 4f 52 3b 0a 09 09 67 6f 74 6f 20 64 6f  ERROR;...goto do
76a0: 6e 65 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20  ne;..    }..}.  
76b0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61    }..    /* Fina
76c0: 6c 69 7a 65 20 68 61 73 68 20 66 75 6e 63 74 69  lize hash functi
76d0: 6f 6e 20 61 6e 64 20 63 61 6c 63 75 6c 61 74 65  on and calculate
76e0: 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20   message digest 
76f0: 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 44 69 67  */.    res = Dig
7700: 65 73 74 46 69 6e 61 6c 69 7a 65 28 69 6e 74 65  estFinalize(inte
7710: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 4e 55  rp, statePtr, NU
7720: 4c 4c 29 3b 0a 0a 64 6f 6e 65 3a 0a 20 20 20 20  LL);..done:.    
7730: 2f 2a 20 43 6c 6f 73 65 20 63 68 61 6e 6e 65 6c  /* Close channel
7740: 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f   */.    if (Tcl_
7750: 43 6c 6f 73 65 28 69 6e 74 65 72 70 2c 20 63 68  Close(interp, ch
7760: 61 6e 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52  an) == TCL_ERROR
7770: 29 20 7b 0a 09 72 65 73 20 3d 20 54 43 4c 5f 45  ) {..res = TCL_E
7780: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
7790: 20 2f 2a 20 43 6c 65 61 6e 2d 75 70 20 2a 2f 0a   /* Clean-up */.
77a0: 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65 46      DigestStateF
77b0: 72 65 65 28 73 74 61 74 65 50 74 72 29 3b 0a 20  ree(statePtr);. 
77c0: 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d     return res;.}
77d0: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
77e0: 2a 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 2f 0a 0a 2f 2a 0a 20 2a 2d 2d  ******/../*. *--
7820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 47 65 74 44 69 67 65 73  -. *. * GetDiges
7870: 74 20 2d 2d 20 47 65 74 20 6d 65 73 73 61 67 65  t -- Get message
7880: 20 64 69 67 65 73 74 0a 20 2a 0a 20 2a 20 52 65   digest. *. * Re
7890: 74 75 72 6e 73 3a 0a 20 2a 09 45 56 50 5f 4d 44  turns:. *.EVP_MD
78a0: 20 2a 20 6f 72 20 4e 55 4c 4c 0a 20 2a 0a 20 2a   * or NULL. *. *
78b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
78c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
78d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
78e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
78f0: 2d 2d 2d 0a 20 2a 2f 0a 45 56 50 5f 4d 44 20 2a  ---. */.EVP_MD *
7900: 47 65 74 44 69 67 65 73 74 28 54 63 6c 5f 49 6e  GetDigest(Tcl_In
7910: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 63  terp *interp, Tc
7920: 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c 20 69  l_Obj *objPtr, i
7930: 6e 74 20 2a 66 6f 72 6d 61 74 29 20 7b 0a 20 20  nt *format) {.  
7940: 20 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a    const EVP_MD *
7950: 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63  md = NULL;.    c
7960: 68 61 72 20 2a 64 69 67 65 73 74 4e 61 6d 65 20  har *digestName 
7970: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
7980: 72 6f 6d 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 4e  romObj(objPtr, N
7990: 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 64  ULL);..    if (d
79a0: 69 67 65 73 74 4e 61 6d 65 20 21 3d 20 4e 55 4c  igestName != NUL
79b0: 4c 29 20 7b 0a 09 6d 64 20 3d 20 45 56 50 5f 67  L) {..md = EVP_g
79c0: 65 74 5f 64 69 67 65 73 74 62 79 6e 61 6d 65 28  et_digestbyname(
79d0: 64 69 67 65 73 74 4e 61 6d 65 29 3b 0a 09 69 66  digestName);..if
79e0: 20 28 6d 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a   (md == NULL) {.
79f0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
7a00: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 49  esult(interp, "I
7a10: 6e 76 61 6c 69 64 20 64 69 67 65 73 74 20 5c 22  nvalid digest \"
7a20: 22 2c 20 64 69 67 65 73 74 4e 61 6d 65 2c 20 22  ", digestName, "
7a30: 5c 22 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  \"", NULL);..   
7a40: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d   return NULL;..}
7a50: 20 65 6c 73 65 20 69 66 20 28 6d 64 20 3d 3d 20   else if (md == 
7a60: 45 56 50 5f 73 68 61 6b 65 31 32 38 28 29 20 7c  EVP_shake128() |
7a70: 7c 20 6d 64 20 3d 3d 20 45 56 50 5f 73 68 61 6b  | md == EVP_shak
7a80: 65 32 35 36 28 29 29 20 7b 0a 09 20 20 20 20 2a  e256()) {..    *
7a90: 66 6f 72 6d 61 74 20 7c 3d 20 49 53 5f 58 4f 46  format |= IS_XOF
7aa0: 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20  ;..}.    } else 
7ab0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
7ac0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20  ult(interp, "No 
7ad0: 64 69 67 65 73 74 20 73 70 65 63 69 66 69 65 64  digest specified
7ae0: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  ", NULL);..retur
7af0: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  n NULL;.    }.  
7b00: 20 20 72 65 74 75 72 6e 20 6d 64 3b 0a 7d 0a 0a    return md;.}..
7b10: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
7b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7b50: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 47  --------. *. * G
7b60: 65 74 43 69 70 68 65 72 20 2d 2d 20 47 65 74 20  etCipher -- Get 
7b70: 63 69 70 68 65 72 0a 20 2a 0a 20 2a 20 52 65 74  cipher. *. * Ret
7b80: 75 72 6e 73 3a 0a 20 2a 09 45 56 50 5f 43 49 50  urns:. *.EVP_CIP
7b90: 48 45 52 20 2a 20 6f 72 20 4e 55 4c 4c 0a 20 2a  HER * or NULL. *
7ba0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
7bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7be0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 45 56 50 5f 43  ------. */.EVP_C
7bf0: 49 50 48 45 52 20 2a 47 65 74 43 69 70 68 65 72  IPHER *GetCipher
7c00: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
7c10: 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62  erp, Tcl_Obj *ob
7c20: 6a 50 74 72 2c 20 69 6e 74 20 2a 74 79 70 65 29  jPtr, int *type)
7c30: 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 45 56 50   {.    const EVP
7c40: 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 20  _CIPHER *cipher 
7c50: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72  = NULL;.    char
7c60: 20 2a 63 69 70 68 65 72 4e 61 6d 65 20 3d 20 54   *cipherName = T
7c70: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
7c80: 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 4e 55 4c 4c  Obj(objPtr, NULL
7c90: 29 3b 0a 0a 20 20 20 20 69 66 20 28 63 69 70 68  );..    if (ciph
7ca0: 65 72 4e 61 6d 65 20 21 3d 20 4e 55 4c 4c 29 20  erName != NULL) 
7cb0: 7b 0a 09 63 69 70 68 65 72 20 3d 20 45 56 50 5f  {..cipher = EVP_
7cc0: 67 65 74 5f 63 69 70 68 65 72 62 79 6e 61 6d 65  get_cipherbyname
7cd0: 28 63 69 70 68 65 72 4e 61 6d 65 29 3b 0a 09 2a  (cipherName);..*
7ce0: 74 79 70 65 20 3d 20 54 59 50 45 5f 43 4d 41 43  type = TYPE_CMAC
7cf0: 3b 0a 09 69 66 20 28 63 69 70 68 65 72 20 3d 3d  ;..if (cipher ==
7d00: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63   NULL) {..    Tc
7d10: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
7d20: 6e 74 65 72 70 2c 20 22 49 6e 76 61 6c 69 64 20  nterp, "Invalid 
7d30: 63 69 70 68 65 72 20 5c 22 22 2c 20 63 69 70 68  cipher \"", ciph
7d40: 65 72 4e 61 6d 65 2c 20 22 5c 22 22 2c 20 4e 55  erName, "\"", NU
7d50: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  LL);..    return
7d60: 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20   NULL;..}.    } 
7d70: 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 41 70 70 65  else {..Tcl_Appe
7d80: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
7d90: 20 22 4e 6f 20 63 69 70 68 65 72 20 73 70 65 63   "No cipher spec
7da0: 69 66 69 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09  ified", NULL);..
7db0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
7dc0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 63 69   }.    return ci
7dd0: 70 68 65 72 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d  pher;.}../*. *--
7de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e20: 2d 0a 20 2a 0a 20 2a 20 47 65 74 4b 65 79 20 2d  -. *. * GetKey -
7e30: 2d 20 47 65 74 20 6b 65 79 0a 20 2a 0a 20 2a 20  - Get key. *. * 
7e40: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 75 6e 73 69  Returns:. *.unsi
7e50: 67 6e 65 64 20 63 68 61 72 20 2a 20 6f 72 20 4e  gned char * or N
7e60: 55 4c 4c 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ULL. *. *-------
7e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
7eb0: 0a 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  .unsigned char *
7ec0: 47 65 74 4b 65 79 28 54 63 6c 5f 49 6e 74 65 72  GetKey(Tcl_Inter
7ed0: 70 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f  p *interp, Tcl_O
7ee0: 62 6a 20 2a 6f 62 6a 50 74 72 2c 20 69 6e 74 20  bj *objPtr, int 
7ef0: 2a 74 79 70 65 29 20 7b 0a 20 20 20 20 75 6e 73  *type) {.    uns
7f00: 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 20  igned char *key 
7f10: 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
7f20: 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 50 74 72  ayFromObj(objPtr
7f30: 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66  , NULL);..    if
7f40: 20 28 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b   (key == NULL) {
7f50: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
7f60: 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20 6b  lt(interp, "No k
7f70: 65 79 20 73 70 65 63 69 66 69 65 64 22 2c 20 4e  ey specified", N
7f80: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55  ULL);..return NU
7f90: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LL;.    }.    if
7fa0: 20 28 2a 74 79 70 65 20 3d 3d 20 54 59 50 45 5f   (*type == TYPE_
7fb0: 4d 44 29 20 7b 0a 09 2a 74 79 70 65 20 3d 20 54  MD) {..*type = T
7fc0: 59 50 45 5f 48 4d 41 43 3b 0a 20 20 20 20 7d 0a  YPE_HMAC;.    }.
7fd0: 20 20 20 20 72 65 74 75 72 6e 20 6b 65 79 3b 0a      return key;.
7fe0: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 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 0a 20 2a 0a 20  -----------. *. 
8030: 2a 20 47 65 74 4d 41 43 20 2d 2d 20 47 65 74 20  * GetMAC -- Get 
8040: 4d 41 43 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  MAC. *. * Return
8050: 73 3a 0a 20 2a 09 45 56 50 5f 4d 41 43 20 2a 20  s:. *.EVP_MAC * 
8060: 6f 72 20 4e 55 4c 4c 0a 20 2a 0a 20 2a 2d 2d 2d  or NULL. *. *---
8070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
80a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
80b0: 0a 20 2a 2f 0a 45 56 50 5f 4d 41 43 20 2a 47 65  . */.EVP_MAC *Ge
80c0: 74 4d 41 43 28 54 63 6c 5f 49 6e 74 65 72 70 20  tMAC(Tcl_Interp 
80d0: 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a  *interp, Tcl_Obj
80e0: 20 2a 6f 62 6a 50 74 72 2c 20 69 6e 74 20 2a 74   *objPtr, int *t
80f0: 79 70 65 29 20 7b 0a 20 20 20 20 45 56 50 5f 4d  ype) {.    EVP_M
8100: 41 43 20 2a 6d 61 63 20 3d 20 4e 55 4c 4c 3b 0a  AC *mac = NULL;.
8110: 20 20 20 20 63 68 61 72 20 2a 6d 61 63 4e 61 6d      char *macNam
8120: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
8130: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 50 74 72 2c  gFromObj(objPtr,
8140: 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20   NULL);..    if 
8150: 28 6d 61 63 4e 61 6d 65 20 21 3d 20 4e 55 4c 4c  (macName != NULL
8160: 29 20 7b 0a 09 69 66 20 28 73 74 72 63 6d 70 28  ) {..if (strcmp(
8170: 6d 61 63 4e 61 6d 65 2c 20 22 63 6d 61 63 22 29  macName, "cmac")
8180: 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20 2a 74   == 0) {..    *t
8190: 79 70 65 20 3d 20 54 59 50 45 5f 43 4d 41 43 3b  ype = TYPE_CMAC;
81a0: 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72  ..} else if (str
81b0: 63 6d 70 28 6d 61 63 4e 61 6d 65 2c 20 22 68 6d  cmp(macName, "hm
81c0: 61 63 22 29 20 3d 3d 20 30 29 20 7b 0a 09 20 20  ac") == 0) {..  
81d0: 20 20 2a 74 79 70 65 20 3d 20 54 59 50 45 5f 48    *type = TYPE_H
81e0: 4d 41 43 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  MAC;..} else {..
81f0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
8200: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 49 6e  sult(interp, "In
8210: 76 61 6c 69 64 20 4d 41 43 20 5c 22 22 2c 20 6d  valid MAC \"", m
8220: 61 63 4e 61 6d 65 2c 20 22 5c 22 22 2c 20 4e 55  acName, "\"", NU
8230: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  LL);..    return
8240: 20 4e 55 4c 4c 3b 0a 09 7d 0a 09 6d 61 63 20 3d   NULL;..}..mac =
8250: 20 28 76 6f 69 64 20 2a 29 20 6d 61 63 4e 61 6d   (void *) macNam
8260: 65 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  e;.    } else {.
8270: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
8280: 74 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20 4d 41  t(interp, "No MA
8290: 43 20 73 70 65 63 69 66 69 65 64 22 2c 20 4e 55  C specified", NU
82a0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  LL);..return NUL
82b0: 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  L;.    }.    ret
82c0: 75 72 6e 20 6d 61 63 3b 0a 7d 0a 0a 2f 2a 2a 2a  urn mac;.}../***
82d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8310: 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  /../*. *--------
8320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
8360: 2a 20 44 69 67 65 73 74 4d 61 69 6e 20 2d 2d 0a  * DigestMain --.
8370: 20 2a 0a 20 2a 09 52 65 74 75 72 6e 20 6d 65 73   *. *.Return mes
8380: 73 61 67 65 20 64 69 67 65 73 74 20 6f 72 20 4d  sage digest or M
8390: 65 73 73 61 67 65 20 41 75 74 68 65 6e 74 69 63  essage Authentic
83a0: 61 74 69 6f 6e 20 43 6f 64 65 20 28 4d 41 43 29  ation Code (MAC)
83b0: 20 6f 66 0a 20 2a 09 64 61 74 61 20 75 73 69 6e   of. *.data usin
83c0: 67 20 75 73 65 72 20 73 70 65 63 69 66 69 65 64  g user specified
83d0: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 0a   hash function..
83e0: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20   *. * Returns:. 
83f0: 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f  *.TCL_OK or TCL_
8400: 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65  ERROR. *. * Side
8410: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74   effects:. *.Set
8420: 73 20 72 65 73 75 6c 74 20 74 6f 20 6d 65 73 73  s result to mess
8430: 61 67 65 20 64 69 67 65 73 74 20 6f 72 20 65 72  age digest or er
8440: 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20  ror message. *. 
8450: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
8460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8490: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
84a0: 69 6e 74 20 44 69 67 65 73 74 4d 61 69 6e 28 69  int DigestMain(i
84b0: 6e 74 20 74 79 70 65 2c 20 54 63 6c 5f 49 6e 74  nt type, Tcl_Int
84c0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
84d0: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
84e0: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a  const objv[]) {.
84f0: 20 20 20 20 69 6e 74 20 69 64 78 2c 20 73 74 61      int idx, sta
8500: 72 74 20 3d 20 31 2c 20 66 6f 72 6d 61 74 20 3d  rt = 1, format =
8510: 20 48 45 58 5f 46 4f 52 4d 41 54 2c 20 72 65 73   HEX_FORMAT, res
8520: 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 54   = TCL_OK;.    T
8530: 63 6c 5f 4f 62 6a 20 2a 63 69 70 68 65 72 4f 62  cl_Obj *cipherOb
8540: 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 63 6d 64 4f 62  j = NULL, *cmdOb
8550: 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 64 61 74 61 4f  j = NULL, *dataO
8560: 62 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 64 69 67 65  bj = NULL, *dige
8570: 73 74 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20  stObj = NULL;.  
8580: 20 20 54 63 6c 5f 4f 62 6a 20 2a 66 69 6c 65 4f    Tcl_Obj *fileO
8590: 62 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 6b 65 79 4f  bj = NULL, *keyO
85a0: 62 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 6d 61 63 4f  bj = NULL, *macO
85b0: 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63  bj = NULL;.    c
85c0: 6f 6e 73 74 20 63 68 61 72 20 2a 63 68 61 6e 6e  onst char *chann
85d0: 65 6c 20 3d 20 4e 55 4c 4c 2c 20 2a 6f 70 74 3b  el = NULL, *opt;
85e0: 0a 20 20 20 20 63 6f 6e 73 74 20 45 56 50 5f 4d  .    const EVP_M
85f0: 44 20 2a 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20  D *md = NULL;.  
8600: 20 20 63 6f 6e 73 74 20 45 56 50 5f 43 49 50 48    const EVP_CIPH
8610: 45 52 20 2a 63 69 70 68 65 72 20 3d 20 4e 55 4c  ER *cipher = NUL
8620: 4c 3b 0a 20 20 20 20 45 56 50 5f 4d 41 43 20 2a  L;.    EVP_MAC *
8630: 6d 61 63 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20  mac = NULL;..   
8640: 20 2f 2a 20 43 6c 65 61 72 20 69 6e 74 65 72 70   /* Clear interp
8650: 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 54   result */.    T
8660: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69  cl_ResetResult(i
8670: 6e 74 65 72 70 29 3b 0a 0a 20 20 20 20 2f 2a 20  nterp);..    /* 
8680: 56 61 6c 69 64 61 74 65 20 61 72 67 20 63 6f 75  Validate arg cou
8690: 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62  nt */.    if (ob
86a0: 6a 63 20 3c 20 33 20 7c 7c 20 6f 62 6a 63 20 3e  jc < 3 || objc >
86b0: 20 31 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e   12) {..Tcl_Wron
86c0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
86d0: 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 62 69 6e   1, objv, "?-bin
86e0: 7c 2d 68 65 78 3f 20 3f 2d 63 69 70 68 65 72 20  |-hex? ?-cipher 
86f0: 6e 61 6d 65 3f 20 3f 2d 64 69 67 65 73 74 20 6e  name? ?-digest n
8700: 61 6d 65 3f 20 3f 2d 6b 65 79 20 6b 65 79 3f 20  ame? ?-key key? 
8710: 3f 2d 6d 61 63 20 6e 61 6d 65 3f 20 5b 2d 63 68  ?-mac name? [-ch
8720: 61 6e 6e 65 6c 20 63 68 61 6e 20 7c 20 2d 63 6f  annel chan | -co
8730: 6d 6d 61 6e 64 20 63 6d 64 4e 61 6d 65 20 7c 20  mmand cmdName | 
8740: 2d 66 69 6c 65 20 66 69 6c 65 6e 61 6d 65 20 7c  -file filename |
8750: 20 3f 2d 64 61 74 61 3f 20 64 61 74 61 5d 22 29   ?-data? data]")
8760: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
8770: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
8780: 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 20  /* Special case 
8790: 6f 66 20 66 69 72 73 74 20 61 72 67 20 69 73 20  of first arg is 
87a0: 64 69 67 65 73 74 2c 20 63 69 70 68 65 72 2c 20  digest, cipher, 
87b0: 6f 72 20 6d 61 63 20 2a 2f 0a 20 20 20 20 6f 70  or mac */.    op
87c0: 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  t = Tcl_GetStrin
87d0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 73 74  gFromObj(objv[st
87e0: 61 72 74 5d 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  art], NULL);.   
87f0: 20 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27   if (opt[0] != '
8800: 2d 27 29 20 7b 0a 09 69 66 20 28 74 79 70 65 20  -') {..if (type 
8810: 3d 3d 20 54 59 50 45 5f 4d 44 20 7c 7c 20 74 79  == TYPE_MD || ty
8820: 70 65 20 3d 3d 20 54 59 50 45 5f 48 4d 41 43 29  pe == TYPE_HMAC)
8830: 20 7b 0a 09 20 20 20 20 64 69 67 65 73 74 4f 62   {..    digestOb
8840: 6a 20 3d 20 6f 62 6a 76 5b 73 74 61 72 74 5d 3b  j = objv[start];
8850: 0a 09 20 20 20 20 73 74 61 72 74 2b 2b 3b 0a 09  ..    start++;..
8860: 7d 20 65 6c 73 65 20 69 66 20 28 74 79 70 65 20  } else if (type 
8870: 3d 3d 20 54 59 50 45 5f 43 4d 41 43 29 20 7b 0a  == TYPE_CMAC) {.
8880: 09 20 20 20 20 63 69 70 68 65 72 4f 62 6a 20 3d  .    cipherObj =
8890: 20 6f 62 6a 76 5b 73 74 61 72 74 5d 3b 0a 09 20   objv[start];.. 
88a0: 20 20 20 73 74 61 72 74 2b 2b 3b 0a 09 7d 20 65     start++;..} e
88b0: 6c 73 65 20 69 66 20 28 74 79 70 65 20 3d 3d 20  lse if (type == 
88c0: 54 59 50 45 5f 4d 41 43 29 20 7b 0a 09 20 20 20  TYPE_MAC) {..   
88d0: 20 6d 61 63 4f 62 6a 20 3d 20 6f 62 6a 76 5b 73   macObj = objv[s
88e0: 74 61 72 74 5d 3b 0a 09 20 20 20 20 73 74 61 72  tart];..    star
88f0: 74 2b 2b 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  t++;..}.    }.. 
8900: 20 20 20 2f 2a 20 47 65 74 20 6f 70 74 69 6f 6e     /* Get option
8910: 73 20 2a 2f 0a 20 20 20 20 66 6f 72 20 28 69 64  s */.    for (id
8920: 78 20 3d 20 73 74 61 72 74 3b 20 69 64 78 20 3c  x = start; idx <
8930: 20 6f 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a   objc; idx++) {.
8940: 09 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74  .opt = Tcl_GetSt
8950: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
8960: 5b 69 64 78 5d 2c 20 4e 55 4c 4c 29 3b 0a 0a 09  [idx], NULL);...
8970: 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d  if (opt[0] != '-
8980: 27 29 20 7b 0a 09 20 20 20 20 62 72 65 61 6b 3b  ') {..    break;
8990: 0a 09 7d 0a 0a 09 4f 50 54 46 4c 41 47 28 22 2d  ..}...OPTFLAG("-
89a0: 62 69 6e 22 2c 20 66 6f 72 6d 61 74 2c 20 42 49  bin", format, BI
89b0: 4e 5f 46 4f 52 4d 41 54 29 3b 0a 09 4f 50 54 46  N_FORMAT);..OPTF
89c0: 4c 41 47 28 22 2d 62 69 6e 61 72 79 22 2c 20 66  LAG("-binary", f
89d0: 6f 72 6d 61 74 2c 20 42 49 4e 5f 46 4f 52 4d 41  ormat, BIN_FORMA
89e0: 54 29 3b 0a 09 4f 50 54 46 4c 41 47 28 22 2d 68  T);..OPTFLAG("-h
89f0: 65 78 22 2c 20 66 6f 72 6d 61 74 2c 20 48 45 58  ex", format, HEX
8a00: 5f 46 4f 52 4d 41 54 29 3b 0a 09 4f 50 54 46 4c  _FORMAT);..OPTFL
8a10: 41 47 28 22 2d 68 65 78 61 64 65 63 69 6d 61 6c  AG("-hexadecimal
8a20: 22 2c 20 66 6f 72 6d 61 74 2c 20 48 45 58 5f 46  ", format, HEX_F
8a30: 4f 52 4d 41 54 29 3b 0a 09 4f 50 54 53 54 52 28  ORMAT);..OPTSTR(
8a40: 22 2d 63 68 61 6e 22 2c 20 63 68 61 6e 6e 65 6c  "-chan", channel
8a50: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 68 61  );..OPTSTR("-cha
8a60: 6e 6e 65 6c 22 2c 20 63 68 61 6e 6e 65 6c 29 3b  nnel", channel);
8a70: 0a 09 4f 50 54 4f 42 4a 28 22 2d 63 69 70 68 65  ..OPTOBJ("-ciphe
8a80: 72 22 2c 20 63 69 70 68 65 72 4f 62 6a 29 3b 0a  r", cipherObj);.
8a90: 09 4f 50 54 4f 42 4a 28 22 2d 63 6f 6d 6d 61 6e  .OPTOBJ("-comman
8aa0: 64 22 2c 20 63 6d 64 4f 62 6a 29 3b 0a 09 4f 50  d", cmdObj);..OP
8ab0: 54 4f 42 4a 28 22 2d 64 61 74 61 22 2c 20 64 61  TOBJ("-data", da
8ac0: 74 61 4f 62 6a 29 3b 0a 09 4f 50 54 4f 42 4a 28  taObj);..OPTOBJ(
8ad0: 22 2d 64 69 67 65 73 74 22 2c 20 64 69 67 65 73  "-digest", diges
8ae0: 74 4f 62 6a 29 3b 0a 09 4f 50 54 4f 42 4a 28 22  tObj);..OPTOBJ("
8af0: 2d 66 69 6c 65 22 2c 20 66 69 6c 65 4f 62 6a 29  -file", fileObj)
8b00: 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 66 69 6c 65  ;..OPTOBJ("-file
8b10: 6e 61 6d 65 22 2c 20 66 69 6c 65 4f 62 6a 29 3b  name", fileObj);
8b20: 0a 09 4f 50 54 4f 42 4a 28 22 2d 6b 65 79 22 2c  ..OPTOBJ("-key",
8b30: 20 6b 65 79 4f 62 6a 29 3b 0a 09 4f 50 54 4f 42   keyObj);..OPTOB
8b40: 4a 28 22 2d 6d 61 63 22 2c 20 6d 61 63 4f 62 6a  J("-mac", macObj
8b50: 29 3b 0a 0a 09 4f 50 54 42 41 44 28 22 6f 70 74  );...OPTBAD("opt
8b60: 69 6f 6e 22 2c 20 22 2d 62 69 6e 2c 20 2d 63 68  ion", "-bin, -ch
8b70: 61 6e 6e 65 6c 2c 20 2d 63 69 70 68 65 72 2c 20  annel, -cipher, 
8b80: 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 61 74 61 2c  -command, -data,
8b90: 20 2d 64 69 67 65 73 74 2c 20 2d 66 69 6c 65 2c   -digest, -file,
8ba0: 20 2d 66 69 6c 65 6e 61 6d 65 2c 20 2d 68 65 78   -filename, -hex
8bb0: 2c 20 2d 6b 65 79 2c 20 6f 72 20 2d 6d 61 63 22  , -key, or -mac"
8bc0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
8bd0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
8be0: 20 2f 2a 20 49 66 20 6f 6e 6c 79 20 31 20 61 72   /* If only 1 ar
8bf0: 67 20 6c 65 66 74 2c 20 69 74 27 73 20 74 68 65  g left, it's the
8c00: 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 69 66 20   data */.    if 
8c10: 28 69 64 78 20 3c 20 6f 62 6a 63 20 26 26 20 64  (idx < objc && d
8c20: 61 74 61 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20  ataObj == NULL) 
8c30: 7b 0a 09 64 61 74 61 4f 62 6a 20 3d 20 6f 62 6a  {..dataObj = obj
8c40: 76 5b 69 64 78 5d 3b 0a 20 20 20 20 7d 0a 0a 20  v[idx];.    }.. 
8c50: 20 20 20 2f 2a 20 47 65 74 20 63 69 70 68 65 72     /* Get cipher
8c60: 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 69 70 68   */.    if (ciph
8c70: 65 72 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b  erObj != NULL) {
8c80: 0a 09 69 66 20 28 28 63 69 70 68 65 72 20 3d 20  ..if ((cipher = 
8c90: 47 65 74 43 69 70 68 65 72 28 69 6e 74 65 72 70  GetCipher(interp
8ca0: 2c 20 63 69 70 68 65 72 4f 62 6a 2c 20 26 74 79  , cipherObj, &ty
8cb0: 70 65 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  pe)) == NULL) {.
8cc0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
8cd0: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 20  ERROR;..}.    } 
8ce0: 65 6c 73 65 20 69 66 20 28 74 79 70 65 20 3d 3d  else if (type ==
8cf0: 20 54 59 50 45 5f 43 4d 41 43 29 20 7b 0a 09 54   TYPE_CMAC) {..T
8d00: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
8d10: 69 6e 74 65 72 70 2c 20 22 4e 6f 20 63 69 70 68  interp, "No ciph
8d20: 65 72 20 73 70 65 63 69 66 69 65 64 22 2c 20 4e  er specified", N
8d30: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  ULL);..return TC
8d40: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
8d50: 20 20 20 20 2f 2a 20 47 65 74 20 6d 65 73 73 61      /* Get messa
8d60: 67 65 20 64 69 67 65 73 74 20 2a 2f 0a 20 20 20  ge digest */.   
8d70: 20 69 66 20 28 64 69 67 65 73 74 4f 62 6a 20 21   if (digestObj !
8d80: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 28  = NULL) {..if ((
8d90: 6d 64 20 3d 20 47 65 74 44 69 67 65 73 74 28 69  md = GetDigest(i
8da0: 6e 74 65 72 70 2c 20 64 69 67 65 73 74 4f 62 6a  nterp, digestObj
8db0: 2c 20 26 66 6f 72 6d 61 74 29 29 20 3d 3d 20 4e  , &format)) == N
8dc0: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 72 65 74 75  ULL) {..    retu
8dd0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
8de0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
8df0: 74 79 70 65 20 3d 3d 20 54 59 50 45 5f 4d 44 20  type == TYPE_MD 
8e00: 7c 7c 20 74 79 70 65 20 3d 3d 20 54 59 50 45 5f  || type == TYPE_
8e10: 48 4d 41 43 29 20 7b 0a 09 54 63 6c 5f 41 70 70  HMAC) {..Tcl_App
8e20: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8e30: 2c 20 22 4e 6f 20 64 69 67 65 73 74 20 73 70 65  , "No digest spe
8e40: 63 69 66 69 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a  cified", NULL);.
8e50: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
8e60: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
8e70: 20 47 65 74 20 6b 65 79 20 2a 2f 0a 20 20 20 20   Get key */.    
8e80: 69 66 20 28 6b 65 79 4f 62 6a 20 21 3d 20 4e 55  if (keyObj != NU
8e90: 4c 4c 29 20 7b 0a 09 69 66 20 28 47 65 74 4b 65  LL) {..if (GetKe
8ea0: 79 28 69 6e 74 65 72 70 2c 20 6b 65 79 4f 62 6a  y(interp, keyObj
8eb0: 2c 20 26 74 79 70 65 29 20 3d 3d 20 4e 55 4c 4c  , &type) == NULL
8ec0: 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  ) {..    return 
8ed0: 54 43 4c 5f 45 52 52 4f 52 3b 09 0a 09 7d 0a 20  TCL_ERROR;...}. 
8ee0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 74 79     } else if (ty
8ef0: 70 65 20 21 3d 20 54 59 50 45 5f 4d 44 29 20 7b  pe != TYPE_MD) {
8f00: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
8f10: 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20 6b  lt(interp, "No k
8f20: 65 79 20 73 70 65 63 69 66 69 65 64 22 2c 20 4e  ey specified", N
8f30: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  ULL);..return TC
8f40: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
8f50: 20 20 20 20 2f 2a 20 47 65 74 20 4d 41 43 20 2a      /* Get MAC *
8f60: 2f 0a 20 20 20 20 69 66 20 28 6d 61 63 4f 62 6a  /.    if (macObj
8f70: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20   != NULL) {..if 
8f80: 28 28 6d 61 63 20 3d 20 47 65 74 4d 41 43 28 69  ((mac = GetMAC(i
8f90: 6e 74 65 72 70 2c 20 6d 61 63 4f 62 6a 2c 20 26  nterp, macObj, &
8fa0: 74 79 70 65 29 29 20 3d 3d 20 4e 55 4c 4c 29 20  type)) == NULL) 
8fb0: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  {..    return TC
8fc0: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20  L_ERROR;..}.    
8fd0: 7d 20 65 6c 73 65 20 69 66 20 28 74 79 70 65 20  } else if (type 
8fe0: 3d 3d 20 54 59 50 45 5f 4d 41 43 29 20 7b 0a 09  == TYPE_MAC) {..
8ff0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
9000: 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20 4d 41 43  (interp, "No MAC
9010: 20 73 70 65 63 69 66 69 65 64 22 2c 20 4e 55 4c   specified", NUL
9020: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  L);..return TCL_
9030: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
9040: 20 20 2f 2a 20 43 61 6c 63 20 64 69 67 65 73 74    /* Calc digest
9050: 20 6f 6e 20 66 69 6c 65 2c 20 73 74 61 63 6b 65   on file, stacke
9060: 64 20 63 68 61 6e 6e 65 6c 2c 20 75 73 69 6e 67  d channel, using
9070: 20 69 6e 73 74 61 6e 63 65 20 63 6f 6d 6d 61 6e   instance comman
9080: 64 2c 20 6f 72 20 64 61 74 61 20 62 6c 6f 62 20  d, or data blob 
9090: 2a 2f 0a 20 20 20 20 69 66 20 28 66 69 6c 65 4f  */.    if (fileO
90a0: 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  bj != NULL) {..r
90b0: 65 73 20 3d 20 44 69 67 65 73 74 46 69 6c 65 48  es = DigestFileH
90c0: 61 6e 64 6c 65 72 28 69 6e 74 65 72 70 2c 20 66  andler(interp, f
90d0: 69 6c 65 4f 62 6a 2c 20 6d 64 2c 20 63 69 70 68  ileObj, md, ciph
90e0: 65 72 2c 20 66 6f 72 6d 61 74 20 7c 20 74 79 70  er, format | typ
90f0: 65 2c 20 6b 65 79 4f 62 6a 2c 20 6d 61 63 29 3b  e, keyObj, mac);
9100: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
9110: 63 68 61 6e 6e 65 6c 20 21 3d 20 4e 55 4c 4c 29  channel != NULL)
9120: 20 7b 0a 09 72 65 73 20 3d 20 44 69 67 65 73 74   {..res = Digest
9130: 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 28 69  ChannelHandler(i
9140: 6e 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c 2c 20  nterp, channel, 
9150: 6d 64 2c 20 63 69 70 68 65 72 2c 20 66 6f 72 6d  md, cipher, form
9160: 61 74 20 7c 20 74 79 70 65 2c 20 6b 65 79 4f 62  at | type, keyOb
9170: 6a 2c 20 6d 61 63 29 3b 0a 20 20 20 20 7d 20 65  j, mac);.    } e
9180: 6c 73 65 20 69 66 20 28 63 6d 64 4f 62 6a 20 21  lse if (cmdObj !
9190: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 20 3d  = NULL) {..res =
91a0: 20 44 69 67 65 73 74 43 6f 6d 6d 61 6e 64 48 61   DigestCommandHa
91b0: 6e 64 6c 65 72 28 69 6e 74 65 72 70 2c 20 63 6d  ndler(interp, cm
91c0: 64 4f 62 6a 2c 20 6d 64 2c 20 63 69 70 68 65 72  dObj, md, cipher
91d0: 2c 20 66 6f 72 6d 61 74 20 7c 20 74 79 70 65 2c  , format | type,
91e0: 20 6b 65 79 4f 62 6a 2c 20 6d 61 63 29 3b 0a 20   keyObj, mac);. 
91f0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 64 61     } else if (da
9200: 74 61 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b  taObj != NULL) {
9210: 0a 09 72 65 73 20 3d 20 44 69 67 65 73 74 44 61  ..res = DigestDa
9220: 74 61 48 61 6e 64 6c 65 72 28 69 6e 74 65 72 70  taHandler(interp
9230: 2c 20 64 61 74 61 4f 62 6a 2c 20 6d 64 2c 20 63  , dataObj, md, c
9240: 69 70 68 65 72 2c 20 66 6f 72 6d 61 74 20 7c 20  ipher, format | 
9250: 74 79 70 65 2c 20 6b 65 79 4f 62 6a 2c 20 6d 61  type, keyObj, ma
9260: 63 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  c);.    } else {
9270: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
9280: 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20 6f  lt(interp, "No o
9290: 70 65 72 61 74 69 6f 6e 20 73 70 65 63 69 66 69  peration specifi
92a0: 65 64 3a 20 55 73 65 20 2d 63 68 61 6e 6e 65 6c  ed: Use -channel
92b0: 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 61 74  , -command, -dat
92c0: 61 2c 20 6f 72 20 2d 66 69 6c 65 20 6f 70 74 69  a, or -file opti
92d0: 6f 6e 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 73  on", NULL);..res
92e0: 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20   = TCL_ERROR;.  
92f0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
9300: 65 73 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  es;.}../*. *----
9310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
9350: 20 2a 0a 20 2a 20 4d 65 73 73 61 67 65 20 44 69   *. * Message Di
9360: 67 65 73 74 20 61 6e 64 20 4d 65 73 73 61 67 65  gest and Message
9370: 20 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20   Authentication 
9380: 43 6f 64 65 20 43 6f 6d 6d 61 6e 64 73 20 2d 2d  Code Commands --
9390: 0a 20 2a 0a 20 2a 09 52 65 74 75 72 6e 20 4d 65  . *. *.Return Me
93a0: 73 73 61 67 65 20 44 69 67 65 73 74 20 28 4d 44  ssage Digest (MD
93b0: 29 20 6f 72 20 4d 65 73 73 61 67 65 20 41 75 74  ) or Message Aut
93c0: 68 65 6e 74 69 63 61 74 69 6f 6e 20 43 6f 64 65  hentication Code
93d0: 20 28 4d 41 43 29 2e 0a 20 2a 0a 20 2a 20 52 65   (MAC).. *. * Re
93e0: 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b  turns:. *.TCL_OK
93f0: 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a   or TCL_ERROR. *
9400: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
9410: 3a 0a 20 2a 09 53 65 74 73 20 72 65 73 75 6c 74  :. *.Sets result
9420: 20 74 6f 20 6d 65 73 73 61 67 65 20 64 69 67 65   to message dige
9430: 73 74 20 6f 72 20 65 72 72 6f 72 20 6d 65 73 73  st or error mess
9440: 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  age. *. *-------
9450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
9490: 0a 73 74 61 74 69 63 20 69 6e 74 20 4d 64 4f 62  .static int MdOb
94a0: 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20  jCmd(ClientData 
94b0: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f  clientData, Tcl_
94c0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
94d0: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
94e0: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j *const objv[])
94f0: 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 44 69   {.    return Di
9500: 67 65 73 74 4d 61 69 6e 28 54 59 50 45 5f 4d 44  gestMain(TYPE_MD
9510: 2c 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20  , interp, objc, 
9520: 6f 62 6a 76 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  objv);.}..static
9530: 20 69 6e 74 20 43 4d 41 43 4f 62 6a 43 6d 64 28   int CMACObjCmd(
9540: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
9550: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
9560: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
9570: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
9580: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
9590: 20 20 72 65 74 75 72 6e 20 44 69 67 65 73 74 4d    return DigestM
95a0: 61 69 6e 28 54 59 50 45 5f 43 4d 41 43 2c 20 69  ain(TYPE_CMAC, i
95b0: 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a  nterp, objc, obj
95c0: 76 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  v);.}..static in
95d0: 74 20 48 4d 41 43 4f 62 6a 43 6d 64 28 43 6c 69  t HMACObjCmd(Cli
95e0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
95f0: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
9600: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
9610: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
9620: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 72   objv[]) {.    r
9630: 65 74 75 72 6e 20 44 69 67 65 73 74 4d 61 69 6e  eturn DigestMain
9640: 28 54 59 50 45 5f 48 4d 41 43 2c 20 69 6e 74 65  (TYPE_HMAC, inte
9650: 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b  rp, objc, objv);
9660: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 4d  .}..static int M
9670: 41 43 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44  ACObjCmd(ClientD
9680: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
9690: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
96a0: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
96b0: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
96c0: 76 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 72  v[]) {.    retur
96d0: 6e 20 44 69 67 65 73 74 4d 61 69 6e 28 54 59 50  n DigestMain(TYP
96e0: 45 5f 4d 41 43 2c 20 69 6e 74 65 72 70 2c 20 6f  E_MAC, interp, o
96f0: 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 7d 0a 0a 2f  bjc, objv);.}../
9700: 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9740: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 65  -------. *. * Me
9750: 73 73 61 67 65 20 44 69 67 65 73 74 20 43 6f 6e  ssage Digest Con
9760: 76 65 6e 69 65 6e 63 65 20 43 6f 6d 6d 61 6e 64  venience Command
9770: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43 6f 6e 76 65  s --. *. *.Conve
9780: 6e 69 65 6e 63 65 20 63 6f 6d 6d 61 6e 64 73 20  nience commands 
9790: 66 6f 72 20 73 65 6c 65 63 74 20 6d 65 73 73 61  for select messa
97a0: 67 65 20 64 69 67 65 73 74 73 2e 0a 20 2a 0a 20  ge digests.. *. 
97b0: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43  * Returns:. *.TC
97c0: 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f  L_OK or TCL_ERRO
97d0: 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  R. *. * Side eff
97e0: 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 72 65  ects:. *.Sets re
97f0: 73 75 6c 74 20 74 6f 20 6d 65 73 73 61 67 65 20  sult to message 
9800: 64 69 67 65 73 74 20 6f 72 20 65 72 72 6f 72 20  digest or error 
9810: 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d  message. *. *---
9820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9860: 0a 20 2a 2f 0a 20 23 64 65 66 69 6e 65 20 76 61  . */. #define va
9870: 6c 69 64 61 74 65 5f 61 72 67 63 28 6f 62 6a 63  lidate_argc(objc
9880: 2c 20 6f 62 6a 76 29 20 7b 20 5c 0a 20 20 20 20  , objv) { \.    
9890: 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b  if (objc != 2) {
98a0: 20 5c 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d   \..Tcl_WrongNum
98b0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
98c0: 6f 62 6a 76 2c 20 22 64 61 74 61 22 29 3b 20 5c  objv, "data"); \
98d0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
98e0: 4f 52 3b 20 5c 0a 20 20 20 20 7d 20 5c 0a 7d 0a  OR; \.    } \.}.
98f0: 20 0a 69 6e 74 20 4d 44 34 4f 62 6a 43 6d 64 28   .int MD4ObjCmd(
9900: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
9910: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
9920: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
9930: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
9940: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
9950: 20 20 76 61 6c 69 64 61 74 65 5f 61 72 67 63 28    validate_argc(
9960: 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 20 20 20  objc, objv);.   
9970: 20 72 65 74 75 72 6e 20 44 69 67 65 73 74 44 61   return DigestDa
9980: 74 61 48 61 6e 64 6c 65 72 28 69 6e 74 65 72 70  taHandler(interp
9990: 2c 20 6f 62 6a 76 5b 31 5d 2c 20 45 56 50 5f 6d  , objv[1], EVP_m
99a0: 64 34 28 29 2c 20 4e 55 4c 4c 2c 20 48 45 58 5f  d4(), NULL, HEX_
99b0: 46 4f 52 4d 41 54 20 7c 20 54 59 50 45 5f 4d 44  FORMAT | TYPE_MD
99c0: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 7d  , NULL, NULL);.}
99d0: 0a 0a 69 6e 74 20 4d 44 35 4f 62 6a 43 6d 64 28  ..int MD5ObjCmd(
99e0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
99f0: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
9a00: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
9a10: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
9a20: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
9a30: 20 20 76 61 6c 69 64 61 74 65 5f 61 72 67 63 28    validate_argc(
9a40: 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 20 20 20  objc, objv);.   
9a50: 20 72 65 74 75 72 6e 20 44 69 67 65 73 74 44 61   return DigestDa
9a60: 74 61 48 61 6e 64 6c 65 72 28 69 6e 74 65 72 70  taHandler(interp
9a70: 2c 20 6f 62 6a 76 5b 31 5d 2c 20 45 56 50 5f 6d  , objv[1], EVP_m
9a80: 64 35 28 29 2c 20 4e 55 4c 4c 2c 20 48 45 58 5f  d5(), NULL, HEX_
9a90: 46 4f 52 4d 41 54 20 7c 20 54 59 50 45 5f 4d 44  FORMAT | TYPE_MD
9aa0: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 7d  , NULL, NULL);.}
9ab0: 0a 0a 69 6e 74 20 53 48 41 31 4f 62 6a 43 6d 64  ..int SHA1ObjCmd
9ac0: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
9ad0: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ntData, Tcl_Inte
9ae0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
9af0: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63  objc, Tcl_Obj *c
9b00: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20  onst objv[]) {. 
9b10: 20 20 20 76 61 6c 69 64 61 74 65 5f 61 72 67 63     validate_argc
9b20: 28 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 20 20  (objc, objv);.  
9b30: 20 20 72 65 74 75 72 6e 20 44 69 67 65 73 74 44    return DigestD
9b40: 61 74 61 48 61 6e 64 6c 65 72 28 69 6e 74 65 72  ataHandler(inter
9b50: 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 45 56 50 5f  p, objv[1], EVP_
9b60: 73 68 61 31 28 29 2c 20 4e 55 4c 4c 2c 20 48 45  sha1(), NULL, HE
9b70: 58 5f 46 4f 52 4d 41 54 20 7c 20 54 59 50 45 5f  X_FORMAT | TYPE_
9b80: 4d 44 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b  MD, NULL, NULL);
9b90: 0a 7d 0a 0a 69 6e 74 20 53 48 41 32 35 36 4f 62  .}..int SHA256Ob
9ba0: 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20  jCmd(ClientData 
9bb0: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f  clientData, Tcl_
9bc0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
9bd0: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
9be0: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j *const objv[])
9bf0: 20 7b 0a 20 20 20 20 76 61 6c 69 64 61 74 65 5f   {.    validate_
9c00: 61 72 67 63 28 6f 62 6a 63 2c 20 6f 62 6a 76 29  argc(objc, objv)
9c10: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 44 69 67  ;.    return Dig
9c20: 65 73 74 44 61 74 61 48 61 6e 64 6c 65 72 28 69  estDataHandler(i
9c30: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
9c40: 45 56 50 5f 73 68 61 32 35 36 28 29 2c 20 4e 55  EVP_sha256(), NU
9c50: 4c 4c 2c 20 48 45 58 5f 46 4f 52 4d 41 54 20 7c  LL, HEX_FORMAT |
9c60: 20 54 59 50 45 5f 4d 44 2c 20 4e 55 4c 4c 2c 20   TYPE_MD, NULL, 
9c70: 4e 55 4c 4c 29 3b 0a 7d 0a 0a 69 6e 74 20 53 48  NULL);.}..int SH
9c80: 41 35 31 32 4f 62 6a 43 6d 64 28 43 6c 69 65 6e  A512ObjCmd(Clien
9c90: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
9ca0: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
9cb0: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
9cc0: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
9cd0: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 76 61 6c  bjv[]) {.    val
9ce0: 69 64 61 74 65 5f 61 72 67 63 28 6f 62 6a 63 2c  idate_argc(objc,
9cf0: 20 6f 62 6a 76 29 3b 0a 20 20 20 20 72 65 74 75   objv);.    retu
9d00: 72 6e 20 44 69 67 65 73 74 44 61 74 61 48 61 6e  rn DigestDataHan
9d10: 64 6c 65 72 28 69 6e 74 65 72 70 2c 20 6f 62 6a  dler(interp, obj
9d20: 76 5b 31 5d 2c 20 45 56 50 5f 73 68 61 35 31 32  v[1], EVP_sha512
9d30: 28 29 2c 20 4e 55 4c 4c 2c 20 48 45 58 5f 46 4f  (), NULL, HEX_FO
9d40: 52 4d 41 54 20 7c 20 54 59 50 45 5f 4d 44 2c 20  RMAT | TYPE_MD, 
9d50: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a  NULL, NULL);.}..
9d60: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
9d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9da0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
9db0: 6c 73 5f 44 69 67 65 73 74 43 6f 6d 6d 61 6e 64  ls_DigestCommand
9dc0: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43 72 65 61 74  s --. *. *.Creat
9dd0: 65 20 64 69 67 65 73 74 20 63 6f 6d 6d 61 6e 64  e digest command
9de0: 73 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a  s. *. * Returns:
9df0: 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43  . *.TCL_OK or TC
9e00: 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69  L_ERROR. *. * Si
9e10: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
9e20: 72 65 61 74 65 73 20 63 6f 6d 6d 61 6e 64 73 0a  reates commands.
9e30: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
9e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9e70: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74  --------. */.int
9e80: 20 54 6c 73 5f 44 69 67 65 73 74 43 6f 6d 6d 61   Tls_DigestComma
9e90: 6e 64 73 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nds(Tcl_Interp *
9ea0: 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 54 63  interp) {.    Tc
9eb0: 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
9ec0: 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a  nd(interp, "tls:
9ed0: 3a 64 69 67 65 73 74 22 2c 20 4d 64 4f 62 6a 43  :digest", MdObjC
9ee0: 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
9ef0: 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65   0, (Tcl_CmdDele
9f00: 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
9f10: 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
9f20: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
9f30: 2c 20 22 74 6c 73 3a 3a 6d 64 22 2c 20 4d 64 4f  , "tls::md", MdO
9f40: 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61  bjCmd, (ClientDa
9f50: 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44  ta) 0, (Tcl_CmdD
9f60: 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
9f70: 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  L);.    Tcl_Crea
9f80: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
9f90: 65 72 70 2c 20 22 74 6c 73 3a 3a 63 6d 61 63 22  erp, "tls::cmac"
9fa0: 2c 20 43 4d 41 43 4f 62 6a 43 6d 64 2c 20 28 43  , CMACObjCmd, (C
9fb0: 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54  lientData) 0, (T
9fc0: 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
9fd0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
9fe0: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
9ff0: 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  and(interp, "tls
a000: 3a 3a 68 6d 61 63 22 2c 20 48 4d 41 43 4f 62 6a  ::hmac", HMACObj
a010: 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  Cmd, (ClientData
a020: 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ) 0, (Tcl_CmdDel
a030: 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
a040: 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
a050: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
a060: 70 2c 20 22 74 6c 73 3a 3a 6d 61 63 22 2c 20 4d  p, "tls::mac", M
a070: 41 43 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e  ACObjCmd, (Clien
a080: 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43  tData) 0, (Tcl_C
a090: 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
a0a0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43  NULL);.    Tcl_C
a0b0: 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
a0c0: 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 64  interp, "tls::md
a0d0: 34 22 2c 20 4d 44 34 4f 62 6a 43 6d 64 2c 20 28  4", MD4ObjCmd, (
a0e0: 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28  ClientData) 0, (
a0f0: 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
a100: 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  c *) NULL);.    
a110: 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
a120: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c  mand(interp, "tl
a130: 73 3a 3a 6d 64 35 22 2c 20 4d 44 35 4f 62 6a 43  s::md5", MD5ObjC
a140: 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
a150: 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65   0, (Tcl_CmdDele
a160: 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
a170: 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
a180: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
a190: 2c 20 22 74 6c 73 3a 3a 73 68 61 31 22 2c 20 53  , "tls::sha1", S
a1a0: 48 41 31 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65  HA1ObjCmd, (Clie
a1b0: 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f  ntData) 0, (Tcl_
a1c0: 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
a1d0: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f   NULL);.    Tcl_
a1e0: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
a1f0: 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73  (interp, "tls::s
a200: 68 61 32 35 36 22 2c 20 53 48 41 32 35 36 4f 62  ha256", SHA256Ob
a210: 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74  jCmd, (ClientDat
a220: 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65  a) 0, (Tcl_CmdDe
a230: 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c  leteProc *) NULL
a240: 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  );.    Tcl_Creat
a250: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
a260: 72 70 2c 20 22 74 6c 73 3a 3a 73 68 61 35 31 32  rp, "tls::sha512
a270: 22 2c 20 53 48 41 35 31 32 4f 62 6a 43 6d 64 2c  ", SHA512ObjCmd,
a280: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c   (ClientData) 0,
a290: 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
a2a0: 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
a2b0: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
a2c0: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
a2d0: 74 6c 73 3a 3a 75 6e 73 74 61 63 6b 22 2c 20 44  tls::unstack", D
a2e0: 69 67 65 73 74 55 6e 73 74 61 63 6b 4f 62 6a 43  igestUnstackObjC
a2f0: 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
a300: 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65   0, (Tcl_CmdDele
a310: 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
a320: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
a330: 4f 4b 3b 0a 7d 0a 0a                             OK;.}..