Hex Artifact Content

Artifact 1c3c225c54b7637da6f9c0e4dc9a822742d47d590c05124f559d59d7c4926bab:


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 63 6f 6e 74 65 78 74 20  /* HMAC context 
0540: 2a 2f 0a 09 43 4d 41 43 5f 43 54 58 20 2a 63 63  */..CMAC_CTX *cc
0550: 74 78 3b 09 09 2f 2a 20 43 4d 41 43 20 63 6f 6e  tx;../* CMAC con
0560: 74 65 78 74 20 2a 2f 0a 09 54 63 6c 5f 43 6f 6d  text */..Tcl_Com
0570: 6d 61 6e 64 20 74 6f 6b 65 6e 3b 09 2f 2a 20 43  mand token;./* C
0580: 6f 6d 6d 61 6e 64 20 74 6f 6b 65 6e 20 2a 2f 0a  ommand token */.
0590: 7d 20 44 69 67 65 73 74 53 74 61 74 65 3b 0a 0a  } DigestState;..
05a0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
05b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05e0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44  --------. *. * D
05f0: 69 67 65 73 74 53 74 61 74 65 4e 65 77 20 2d 2d  igestStateNew --
0600: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63  . *. *.This func
0610: 74 69 6f 6e 20 63 72 65 61 74 65 73 20 61 20 70  tion creates a p
0620: 65 72 2d 69 6e 73 74 61 6e 63 65 20 73 74 61 74  er-instance stat
0630: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
0640: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a  . *. * Returns:.
0650: 20 2a 09 44 69 67 65 73 74 20 73 74 72 75 63 74   *.Digest struct
0660: 75 72 65 20 70 6f 69 6e 74 65 72 0a 20 2a 0a 20  ure pointer. *. 
0670: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
0680: 20 2a 09 43 72 65 61 74 65 73 20 73 74 72 75 63   *.Creates struc
0690: 74 75 72 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ture. *. *------
06a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
06e0: 2f 0a 44 69 67 65 73 74 53 74 61 74 65 20 2a 44  /.DigestState *D
06f0: 69 67 65 73 74 53 74 61 74 65 4e 65 77 28 54 63  igestStateNew(Tc
0700: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
0710: 2c 20 69 6e 74 20 66 6f 72 6d 61 74 29 20 7b 0a  , int format) {.
0720: 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20      DigestState 
0730: 2a 73 74 61 74 65 50 74 72 3b 0a 0a 20 20 20 20  *statePtr;..    
0740: 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65  statePtr = (Dige
0750: 73 74 53 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c  stState *) ckall
0760: 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69  oc((unsigned) si
0770: 7a 65 6f 66 28 44 69 67 65 73 74 53 74 61 74 65  zeof(DigestState
0780: 29 29 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74  ));.    if (stat
0790: 65 50 74 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  ePtr != NULL) {.
07a0: 09 6d 65 6d 73 65 74 28 73 74 61 74 65 50 74 72  .memset(statePtr
07b0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 44 69 67 65  , 0, sizeof(Dige
07c0: 73 74 53 74 61 74 65 29 29 3b 0a 09 73 74 61 74  stState));..stat
07d0: 65 50 74 72 2d 3e 73 65 6c 66 09 3d 20 4e 55 4c  ePtr->self.= NUL
07e0: 4c 3b 09 09 2f 2a 20 54 68 69 73 20 73 6f 63 6b  L;../* This sock
07f0: 65 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 09 73  et channel */..s
0800: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d  tatePtr->timer =
0810: 20 4e 55 4c 4c 3b 09 09 2f 2a 20 54 69 6d 65 72   NULL;../* Timer
0820: 20 74 6f 20 66 6c 75 73 68 20 64 61 74 61 20 2a   to flush data *
0830: 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61  /..statePtr->fla
0840: 67 73 20 3d 20 30 3b 09 09 2f 2a 20 43 68 61 6e  gs = 0;../* Chan
0850: 20 63 6f 6e 66 69 67 20 66 6c 61 67 73 20 2a 2f   config flags */
0860: 0a 09 73 74 61 74 65 50 74 72 2d 3e 77 61 74 63  ..statePtr->watc
0870: 68 4d 61 73 6b 20 3d 20 30 3b 09 2f 2a 20 43 75  hMask = 0;./* Cu
0880: 72 72 65 6e 74 20 57 61 74 63 68 50 72 6f 63 20  rrent WatchProc 
0890: 6d 61 73 6b 20 2a 2f 0a 09 73 74 61 74 65 50 74  mask */..statePt
08a0: 72 2d 3e 6d 6f 64 65 09 3d 20 30 3b 09 09 2f 2a  r->mode.= 0;../*
08b0: 20 43 75 72 72 65 6e 74 20 6d 6f 64 65 20 6f 66   Current mode of
08c0: 20 70 61 72 65 6e 74 20 63 68 61 6e 6e 65 6c 20   parent channel 
08d0: 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6f  */..statePtr->fo
08e0: 72 6d 61 74 20 3d 20 66 6f 72 6d 61 74 3b 09 2f  rmat = format;./
08f0: 2a 20 44 69 67 65 73 74 20 66 6f 72 6d 61 74 20  * Digest format 
0900: 61 6e 64 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  and operation */
0910: 0a 09 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  ..statePtr->inte
0920: 72 70 20 3d 20 69 6e 74 65 72 70 3b 09 2f 2a 20  rp = interp;./* 
0930: 43 75 72 72 65 6e 74 20 69 6e 74 65 72 70 72 65  Current interpre
0940: 74 65 72 20 2a 2f 0a 09 73 74 61 74 65 50 74 72  ter */..statePtr
0950: 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 09 09 2f  ->ctx = NULL;../
0960: 2a 20 4d 44 20 43 6f 6e 74 65 78 74 20 2a 2f 0a  * MD Context */.
0970: 09 73 74 61 74 65 50 74 72 2d 3e 68 63 74 78 20  .statePtr->hctx 
0980: 3d 20 4e 55 4c 4c 3b 09 09 2f 2a 20 48 4d 41 43  = NULL;../* HMAC
0990: 20 43 6f 6e 74 65 78 74 20 2a 2f 0a 09 73 74 61   Context */..sta
09a0: 74 65 50 74 72 2d 3e 63 63 74 78 20 3d 20 4e 55  tePtr->cctx = NU
09b0: 4c 4c 3b 09 09 2f 2a 20 43 4d 41 43 20 43 6f 6e  LL;../* CMAC Con
09c0: 74 65 78 74 20 2a 2f 0a 09 73 74 61 74 65 50 74  text */..statePt
09d0: 72 2d 3e 74 6f 6b 65 6e 20 3d 20 4e 55 4c 4c 3b  r->token = NULL;
09e0: 09 09 2f 2a 20 43 6f 6d 6d 61 6e 64 20 74 6f 6b  ../* Command tok
09f0: 65 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  en */.    }.    
0a00: 72 65 74 75 72 6e 20 73 74 61 74 65 50 74 72 3b  return statePtr;
0a10: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
0a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
0a60: 20 2a 20 44 69 67 65 73 74 53 74 61 74 65 46 72   * DigestStateFr
0a70: 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  ee --. *. *.This
0a80: 20 66 75 6e 63 74 69 6f 6e 20 64 65 6c 65 74 65   function delete
0a90: 73 20 61 20 64 69 67 65 73 74 20 73 74 61 74 65  s a digest state
0aa0: 20 73 74 72 75 63 74 75 72 65 0a 20 2a 0a 20 2a   structure. *. *
0ab0: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 4e 6f 74   Returns:. *.Not
0ac0: 68 69 6e 67 0a 20 2a 0a 20 2a 20 53 69 64 65 20  hing. *. * Side 
0ad0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 52 65 6d 6f  effects:. *.Remo
0ae0: 76 65 73 20 73 74 72 75 63 74 75 72 65 0a 20 2a  ves structure. *
0af0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
0b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b30: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20  ------. */.void 
0b40: 44 69 67 65 73 74 53 74 61 74 65 46 72 65 65 28  DigestStateFree(
0b50: 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61  DigestState *sta
0b60: 74 65 50 74 72 29 20 7b 0a 20 20 20 20 69 66 20  tePtr) {.    if 
0b70: 28 73 74 61 74 65 50 74 72 20 3d 3d 20 28 44 69  (statePtr == (Di
0b80: 67 65 73 74 53 74 61 74 65 20 2a 29 20 4e 55 4c  gestState *) NUL
0b90: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 3b 0a 20 20  L) {..return;.  
0ba0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f    }..    /* Remo
0bb0: 76 65 20 70 65 6e 64 69 6e 67 20 74 69 6d 65 72  ve pending timer
0bc0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74   */.    if (stat
0bd0: 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28  ePtr->timer != (
0be0: 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20  Tcl_TimerToken) 
0bf0: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c  NULL) {..Tcl_Del
0c00: 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28  eteTimerHandler(
0c10: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29  statePtr->timer)
0c20: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
0c30: 46 72 65 65 20 63 6f 6e 74 65 78 74 20 73 74 72  Free context str
0c40: 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 69  uctures */.    i
0c50: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  f (statePtr->ctx
0c60: 20 21 3d 20 28 45 56 50 5f 4d 44 5f 43 54 58 20   != (EVP_MD_CTX 
0c70: 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 45 56 50 5f  *) NULL) {..EVP_
0c80: 4d 44 5f 43 54 58 5f 66 72 65 65 28 73 74 61 74  MD_CTX_free(stat
0c90: 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20  ePtr->ctx);.    
0ca0: 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  }.    if (stateP
0cb0: 74 72 2d 3e 68 63 74 78 20 21 3d 20 28 48 4d 41  tr->hctx != (HMA
0cc0: 43 5f 43 54 58 20 2a 29 20 4e 55 4c 4c 29 20 7b  C_CTX *) NULL) {
0cd0: 0a 09 48 4d 41 43 5f 43 54 58 5f 66 72 65 65 28  ..HMAC_CTX_free(
0ce0: 73 74 61 74 65 50 74 72 2d 3e 68 63 74 78 29 3b  statePtr->hctx);
0cf0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73  .    }.    if (s
0d00: 74 61 74 65 50 74 72 2d 3e 63 63 74 78 20 21 3d  tatePtr->cctx !=
0d10: 20 28 43 4d 41 43 5f 43 54 58 20 2a 29 20 4e 55   (CMAC_CTX *) NU
0d20: 4c 4c 29 20 7b 0a 09 43 4d 41 43 5f 43 54 58 5f  LL) {..CMAC_CTX_
0d30: 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 63  free(statePtr->c
0d40: 63 74 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ctx);.    }.    
0d50: 63 6b 66 72 65 65 28 73 74 61 74 65 50 74 72 29  ckfree(statePtr)
0d60: 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../**********
0d70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0d80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0d90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0da0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20  *********/../*. 
0db0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
0dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0df0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73  ----. *. * Diges
0e00: 74 49 6e 69 74 69 61 6c 69 7a 65 20 2d 2d 0a 20  tInitialize --. 
0e10: 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 20  *. *.Initialize 
0e20: 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 0a  a hash function.
0e30: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20   *. * Returns:. 
0e40: 2a 09 54 43 4c 5f 4f 4b 20 69 66 20 73 75 63 63  *.TCL_OK if succ
0e50: 65 73 73 66 75 6c 20 6f 72 20 54 43 4c 5f 45 52  essful or TCL_ER
0e60: 52 4f 52 20 66 6f 72 20 66 61 69 6c 75 72 65 20  ROR for failure 
0e70: 77 69 74 68 20 72 65 73 75 6c 74 20 73 65 74 0a  with result set.
0e80: 20 2a 09 74 6f 20 65 72 72 6f 72 20 6d 65 73 73   *.to error mess
0e90: 61 67 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  age.. *. * Side 
0ea0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 20 72  effects:. *.No r
0eb0: 65 73 75 6c 74 20 6f 72 20 65 72 72 6f 72 20 6d  esult or error m
0ec0: 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d  essage. *. *----
0ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
0f10: 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 49 6e   */.int DigestIn
0f20: 69 74 69 61 6c 69 7a 65 28 54 63 6c 5f 49 6e 74  itialize(Tcl_Int
0f30: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 44 69 67  erp *interp, Dig
0f40: 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50  estState *stateP
0f50: 74 72 2c 20 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 64 70 72 69 6e 74  ULL;..    dprint
0ff0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
1000: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6e 74    /* Create cont
1010: 65 78 74 73 20 2a 2f 0a 20 20 20 20 73 77 69 74  exts */.    swit
1020: 63 68 28 73 74 61 74 65 50 74 72 2d 3e 66 6f 72  ch(statePtr->for
1030: 6d 61 74 20 26 20 30 78 46 46 30 29 20 7b 0a 20  mat & 0xFF0) {. 
1040: 20 20 20 63 61 73 65 20 54 59 50 45 5f 4d 44 3a     case TYPE_MD:
1050: 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20  ..statePtr->ctx 
1060: 3d 20 45 56 50 5f 4d 44 5f 43 54 58 5f 6e 65 77  = EVP_MD_CTX_new
1070: 28 29 3b 0a 09 72 65 73 20 3d 20 28 73 74 61 74  ();..res = (stat
1080: 65 50 74 72 2d 3e 63 74 78 20 21 3d 20 4e 55 4c  ePtr->ctx != NUL
1090: 4c 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  L);..break;.    
10a0: 63 61 73 65 20 54 59 50 45 5f 48 4d 41 43 3a 0a  case TYPE_HMAC:.
10b0: 09 73 74 61 74 65 50 74 72 2d 3e 68 63 74 78 20  .statePtr->hctx 
10c0: 3d 20 48 4d 41 43 5f 43 54 58 5f 6e 65 77 28 29  = HMAC_CTX_new()
10d0: 3b 0a 09 72 65 73 20 3d 20 28 73 74 61 74 65 50  ;..res = (stateP
10e0: 74 72 2d 3e 68 63 74 78 20 21 3d 20 4e 55 4c 4c  tr->hctx != NULL
10f0: 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63  );..break;.    c
1100: 61 73 65 20 54 59 50 45 5f 43 4d 41 43 3a 0a 09  ase TYPE_CMAC:..
1110: 73 74 61 74 65 50 74 72 2d 3e 63 63 74 78 20 3d  statePtr->cctx =
1120: 20 43 4d 41 43 5f 43 54 58 5f 6e 65 77 28 29 3b   CMAC_CTX_new();
1130: 0a 09 72 65 73 20 3d 20 28 73 74 61 74 65 50 74  ..res = (statePt
1140: 72 2d 3e 63 63 74 78 20 21 3d 20 4e 55 4c 4c 29  r->cctx != NULL)
1150: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a  ;..break;.    }.
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 63 72 79 70 74 6f 67 72  tialize cryptogr
1250: 61 70 68 79 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  aphy function */
1260: 0a 20 20 20 20 73 77 69 74 63 68 28 73 74 61 74  .    switch(stat
1270: 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20 30  ePtr->format & 0
1280: 78 46 46 30 29 20 7b 0a 20 20 20 20 63 61 73 65  xFF0) {.    case
1290: 20 54 59 50 45 5f 4d 44 3a 0a 09 72 65 73 20 3d   TYPE_MD:..res =
12a0: 20 45 56 50 5f 44 69 67 65 73 74 49 6e 69 74 5f   EVP_DigestInit_
12b0: 65 78 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  ex(statePtr->ctx
12c0: 2c 20 6d 64 2c 20 4e 55 4c 4c 29 3b 0a 09 62 72  , md, NULL);..br
12d0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 59  eak;.    case TY
12e0: 50 45 5f 48 4d 41 43 3a 0a 09 72 65 73 20 3d 20  PE_HMAC:..res = 
12f0: 48 4d 41 43 5f 49 6e 69 74 5f 65 78 28 73 74 61  HMAC_Init_ex(sta
1300: 74 65 50 74 72 2d 3e 68 63 74 78 2c 20 28 63 6f  tePtr->hctx, (co
1310: 6e 73 74 20 76 6f 69 64 20 2a 29 20 6b 65 79 2c  nst void *) key,
1320: 20 6b 65 79 5f 6c 65 6e 2c 20 6d 64 2c 20 4e 55   key_len, md, NU
1330: 4c 4c 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20  LL);..break;.   
1340: 20 63 61 73 65 20 54 59 50 45 5f 43 4d 41 43 3a   case TYPE_CMAC:
1350: 0a 09 72 65 73 20 3d 20 43 4d 41 43 5f 49 6e 69  ..res = CMAC_Ini
1360: 74 28 73 74 61 74 65 50 74 72 2d 3e 63 63 74 78  t(statePtr->cctx
1370: 2c 20 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 29  , (const void *)
1380: 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 2c 20 63   key, key_len, c
1390: 69 70 68 65 72 2c 20 4e 55 4c 4c 29 3b 0a 09 62  ipher, NULL);..b
13a0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
13b0: 20 69 66 20 28 21 72 65 73 29 20 7b 0a 09 54 63   if (!res) {..Tc
13c0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
13d0: 6e 74 65 72 70 2c 20 22 49 6e 69 74 69 61 6c 69  nterp, "Initiali
13e0: 7a 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 52 45  ze failed: ", RE
13f0: 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09  ASON(), NULL);..
1400: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1410: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
1420: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1430: 0a 20 2a 2d 2d 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 0a 20 2a 0a 20 2a 20 44 69 67  ------. *. * Dig
1480: 65 73 74 55 70 64 61 74 65 20 2d 2d 0a 20 2a 0a  estUpdate --. *.
1490: 20 2a 09 55 70 64 61 74 65 20 61 20 68 61 73 68   *.Update a hash
14a0: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 64   function with d
14b0: 61 74 61 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  ata. *. * Return
14c0: 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 69 66 20  s:. *.TCL_OK if 
14d0: 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 54 43  successful or TC
14e0: 4c 5f 45 52 52 4f 52 20 66 6f 72 20 66 61 69 6c  L_ERROR for fail
14f0: 75 72 65 20 77 69 74 68 20 72 65 73 75 6c 74 20  ure with result 
1500: 73 65 74 0a 20 2a 09 74 6f 20 65 72 72 6f 72 20  set. *.to error 
1510: 6d 65 73 73 61 67 65 20 69 66 20 64 6f 5f 72 65  message if do_re
1520: 73 75 6c 74 20 69 73 20 74 72 75 65 2e 0a 20 2a  sult is true.. *
1530: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
1540: 3a 0a 20 2a 09 41 64 64 73 20 62 75 66 20 64 61  :. *.Adds buf da
1550: 74 61 20 74 6f 20 68 61 73 68 20 66 75 6e 63 74  ta to hash funct
1560: 69 6f 6e 20 6f 72 20 73 65 74 73 20 72 65 73 75  ion or sets resu
1570: 6c 74 20 74 6f 20 65 72 72 6f 72 20 6d 65 73 73  lt to error mess
1580: 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  age. *. *-------
1590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
15d0: 0a 69 6e 74 20 44 69 67 65 73 74 55 70 64 61 74  .int DigestUpdat
15e0: 65 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 73  e(DigestState *s
15f0: 74 61 74 65 50 74 72 2c 20 63 68 61 72 20 2a 62  tatePtr, char *b
1600: 75 66 2c 20 73 69 7a 65 5f 74 20 72 65 61 64 2c  uf, size_t read,
1610: 20 69 6e 74 20 64 6f 5f 72 65 73 75 6c 74 29 20   int do_result) 
1620: 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20  {.    int res = 
1630: 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  0;..    dprintf(
1640: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
1650: 73 77 69 74 63 68 28 73 74 61 74 65 50 74 72 2d  switch(statePtr-
1660: 3e 66 6f 72 6d 61 74 20 26 20 30 78 46 46 30 29  >format & 0xFF0)
1670: 20 7b 0a 20 20 20 20 63 61 73 65 20 54 59 50 45   {.    case TYPE
1680: 5f 4d 44 3a 0a 20 20 20 20 20 20 20 20 72 65 73  _MD:.        res
1690: 20 3d 20 45 56 50 5f 44 69 67 65 73 74 55 70 64   = EVP_DigestUpd
16a0: 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74  ate(statePtr->ct
16b0: 78 2c 20 62 75 66 2c 20 72 65 61 64 29 3b 0a 09  x, buf, read);..
16c0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
16d0: 54 59 50 45 5f 48 4d 41 43 3a 0a 20 20 20 20 20  TYPE_HMAC:.     
16e0: 20 20 20 72 65 73 20 3d 20 48 4d 41 43 5f 55 70     res = HMAC_Up
16f0: 64 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 68  date(statePtr->h
1700: 63 74 78 2c 20 62 75 66 2c 20 72 65 61 64 29 3b  ctx, buf, read);
1710: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ..break;.    cas
1720: 65 20 54 59 50 45 5f 43 4d 41 43 3a 0a 20 20 20  e TYPE_CMAC:.   
1730: 20 20 20 20 20 72 65 73 20 3d 20 43 4d 41 43 5f       res = CMAC_
1740: 55 70 64 61 74 65 28 73 74 61 74 65 50 74 72 2d  Update(statePtr-
1750: 3e 63 63 74 78 2c 20 62 75 66 2c 20 72 65 61 64  >cctx, buf, read
1760: 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d  );..break;.    }
1770: 0a 0a 20 20 20 20 69 66 20 28 21 72 65 73 20 26  ..    if (!res &
1780: 26 20 64 6f 5f 72 65 73 75 6c 74 29 20 7b 0a 09  & do_result) {..
1790: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
17a0: 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72  (statePtr->inter
17b0: 70 2c 20 22 55 70 64 61 74 65 20 66 61 69 6c 65  p, "Update faile
17c0: 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20  d: ", REASON(), 
17d0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
17e0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
17f0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
1800: 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  K;.}../*. *-----
1810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
1850: 2a 0a 20 2a 20 44 69 67 65 73 74 46 69 6e 61 6c  *. * DigestFinal
1860: 69 7a 65 20 2d 2d 0a 20 2a 0a 20 2a 09 46 69 6e  ize --. *. *.Fin
1870: 61 6c 69 7a 65 20 61 20 68 61 73 68 20 66 75 6e  alize a hash fun
1880: 63 74 69 6f 6e 20 61 6e 64 20 72 65 74 75 72 6e  ction and return
1890: 20 74 68 65 20 6d 65 73 73 61 67 65 20 64 69 67   the message dig
18a0: 65 73 74 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  est. *. * Return
18b0: 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 69 66 20  s:. *.TCL_OK if 
18c0: 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 54 43  successful or TC
18d0: 4c 5f 45 52 52 4f 52 20 66 6f 72 20 66 61 69 6c  L_ERROR for fail
18e0: 75 72 65 20 77 69 74 68 20 72 65 73 75 6c 74 20  ure with result 
18f0: 73 65 74 0a 20 2a 09 74 6f 20 65 72 72 6f 72 20  set. *.to error 
1900: 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 20 53  message.. *. * S
1910: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
1920: 53 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20 6d  Sets result to m
1930: 65 73 73 61 67 65 20 64 69 67 65 73 74 20 6f 72  essage digest or
1940: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
1950: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  e.. *. *--------
1960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
19a0: 69 6e 74 20 44 69 67 65 73 74 46 69 6e 61 6c 69  int DigestFinali
19b0: 7a 65 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  ze(Tcl_Interp *i
19c0: 6e 74 65 72 70 2c 20 44 69 67 65 73 74 53 74 61  nterp, DigestSta
19d0: 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 54 63  te *statePtr, Tc
19e0: 6c 5f 4f 62 6a 20 2a 2a 72 65 73 75 6c 74 4f 62  l_Obj **resultOb
19f0: 6a 29 20 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65  j) {.    unsigne
1a00: 64 20 63 68 61 72 20 6d 64 5f 62 75 66 5b 45 56  d char md_buf[EV
1a10: 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45 5d 3b 0a  P_MAX_MD_SIZE];.
1a20: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
1a30: 20 75 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 72   ulen;.    int r
1a40: 65 73 20 3d 20 30 2c 20 6d 64 5f 6c 65 6e 20 3d  es = 0, md_len =
1a50: 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66   0;..    dprintf
1a60: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
1a70: 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 63 72 79   /* Finalize cry
1a80: 70 74 6f 67 72 61 70 68 79 20 66 75 6e 63 74 69  ptography functi
1a90: 6f 6e 20 61 6e 64 20 67 65 74 20 72 65 73 75 6c  on and get resul
1aa0: 74 20 2a 2f 0a 20 20 20 20 73 77 69 74 63 68 28  t */.    switch(
1ab0: 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74  statePtr->format
1ac0: 20 26 20 30 78 46 46 30 29 20 7b 0a 20 20 20 20   & 0xFF0) {.    
1ad0: 63 61 73 65 20 54 59 50 45 5f 4d 44 3a 0a 09 69  case TYPE_MD:..i
1ae0: 66 20 28 21 28 73 74 61 74 65 50 74 72 2d 3e 66  f (!(statePtr->f
1af0: 6f 72 6d 61 74 20 26 20 49 53 5f 58 4f 46 29 29  ormat & IS_XOF))
1b00: 20 7b 0a 09 20 20 20 20 72 65 73 20 3d 20 45 56   {..    res = EV
1b10: 50 5f 44 69 67 65 73 74 46 69 6e 61 6c 5f 65 78  P_DigestFinal_ex
1b20: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
1b30: 6d 64 5f 62 75 66 2c 20 26 75 6c 65 6e 29 3b 0a  md_buf, &ulen);.
1b40: 09 20 20 20 20 6d 64 5f 6c 65 6e 20 3d 20 28 69  .    md_len = (i
1b50: 6e 74 29 20 75 6c 65 6e 3b 0a 09 7d 20 65 6c 73  nt) ulen;..} els
1b60: 65 20 7b 0a 09 20 20 20 20 72 65 73 20 3d 20 45  e {..    res = E
1b70: 56 50 5f 44 69 67 65 73 74 46 69 6e 61 6c 58 4f  VP_DigestFinalXO
1b80: 46 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c  F(statePtr->ctx,
1b90: 20 6d 64 5f 62 75 66 2c 20 28 73 69 7a 65 5f 74   md_buf, (size_t
1ba0: 29 20 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a  ) EVP_MAX_MD_SIZ
1bb0: 45 29 3b 0a 09 20 20 20 20 6d 64 5f 6c 65 6e 20  E);..    md_len 
1bc0: 3d 20 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a  = EVP_MAX_MD_SIZ
1bd0: 45 3b 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20  E;..}..break;.  
1be0: 20 20 63 61 73 65 20 54 59 50 45 5f 48 4d 41 43    case TYPE_HMAC
1bf0: 3a 0a 09 72 65 73 20 3d 20 48 4d 41 43 5f 46 69  :..res = HMAC_Fi
1c00: 6e 61 6c 28 73 74 61 74 65 50 74 72 2d 3e 68 63  nal(statePtr->hc
1c10: 74 78 2c 20 6d 64 5f 62 75 66 2c 20 26 75 6c 65  tx, md_buf, &ule
1c20: 6e 29 3b 0a 09 6d 64 5f 6c 65 6e 20 3d 20 28 69  n);..md_len = (i
1c30: 6e 74 29 20 75 6c 65 6e 3b 0a 09 62 72 65 61 6b  nt) ulen;..break
1c40: 3b 0a 20 20 20 20 63 61 73 65 20 54 59 50 45 5f  ;.    case TYPE_
1c50: 43 4d 41 43 3a 0a 09 73 69 7a 65 5f 74 20 73 69  CMAC:..size_t si
1c60: 7a 65 3b 0a 09 72 65 73 20 3d 20 43 4d 41 43 5f  ze;..res = CMAC_
1c70: 46 69 6e 61 6c 28 73 74 61 74 65 50 74 72 2d 3e  Final(statePtr->
1c80: 63 63 74 78 2c 20 6d 64 5f 62 75 66 2c 20 26 73  cctx, md_buf, &s
1c90: 69 7a 65 29 3b 0a 09 6d 64 5f 6c 65 6e 20 3d 20  ize);..md_len = 
1ca0: 28 69 6e 74 29 20 73 69 7a 65 3b 0a 09 62 72 65  (int) size;..bre
1cb0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ak;.    }..    i
1cc0: 66 20 28 21 72 65 73 29 20 7b 0a 09 69 66 20 28  f (!res) {..if (
1cd0: 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c  resultObj == NUL
1ce0: 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70  L) {..    Tcl_Ap
1cf0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1d00: 70 2c 20 22 46 69 6e 61 6c 69 7a 65 20 66 61 69  p, "Finalize fai
1d10: 6c 65 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29  led: ", REASON()
1d20: 2c 20 4e 55 4c 4c 29 3b 0a 09 7d 0a 09 72 65 74  , NULL);..}..ret
1d30: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1d40: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 74     }..    /* Ret
1d50: 75 72 6e 20 6d 65 73 73 61 67 65 20 64 69 67 65  urn message dige
1d60: 73 74 20 61 73 20 65 69 74 68 65 72 20 61 20 62  st as either a b
1d70: 69 6e 61 72 79 20 6f 72 20 68 65 78 20 73 74 72  inary or hex str
1d80: 69 6e 67 20 2a 2f 0a 20 20 20 20 69 66 20 28 73  ing */.    if (s
1d90: 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20  tatePtr->format 
1da0: 26 20 42 49 4e 5f 46 4f 52 4d 41 54 29 20 7b 0a  & BIN_FORMAT) {.
1db0: 09 69 66 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d  .if (resultObj =
1dc0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54  = NULL) {..    T
1dd0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1de0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
1df0: 79 74 65 41 72 72 61 79 4f 62 6a 28 6d 64 5f 62  yteArrayObj(md_b
1e00: 75 66 2c 20 6d 64 5f 6c 65 6e 29 29 3b 0a 09 7d  uf, md_len));..}
1e10: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 2a 72 65   else {..    *re
1e20: 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65  sultObj = Tcl_Ne
1e30: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 6d 64  wByteArrayObj(md
1e40: 5f 62 75 66 2c 20 6d 64 5f 6c 65 6e 29 3b 0a 09  _buf, md_len);..
1e50: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
1e60: 6f 75 6e 74 28 2a 72 65 73 75 6c 74 4f 62 6a 29  ount(*resultObj)
1e70: 3b 0a 09 7d 0a 0a 20 20 20 20 7d 20 65 6c 73 65  ;..}..    } else
1e80: 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6e 65 77   {..Tcl_Obj *new
1e90: 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  Obj = Tcl_NewObj
1ea0: 28 29 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  ();..unsigned ch
1eb0: 61 72 20 2a 70 74 72 20 3d 20 54 63 6c 5f 53 65  ar *ptr = Tcl_Se
1ec0: 74 42 79 74 65 41 72 72 61 79 4c 65 6e 67 74 68  tByteArrayLength
1ed0: 28 6e 65 77 4f 62 6a 2c 20 6d 64 5f 6c 65 6e 2a  (newObj, md_len*
1ee0: 32 29 3b 0a 0a 09 66 6f 72 20 28 69 6e 74 20 69  2);...for (int i
1ef0: 20 3d 20 30 3b 20 69 20 3c 20 6d 64 5f 6c 65 6e   = 0; i < md_len
1f00: 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 2a 70  ; i++) {..    *p
1f10: 74 72 2b 2b 20 3d 20 68 65 78 5b 28 6d 64 5f 62  tr++ = hex[(md_b
1f20: 75 66 5b 69 5d 20 3e 3e 20 34 29 20 26 20 30 78  uf[i] >> 4) & 0x
1f30: 30 46 5d 3b 0a 09 20 20 20 20 2a 70 74 72 2b 2b  0F];..    *ptr++
1f40: 20 3d 20 68 65 78 5b 6d 64 5f 62 75 66 5b 69 5d   = hex[md_buf[i]
1f50: 20 26 20 30 78 30 46 5d 3b 0a 09 7d 0a 0a 09 69   & 0x0F];..}...i
1f60: 66 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20  f (resultObj == 
1f70: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c  NULL) {..    Tcl
1f80: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
1f90: 74 65 72 70 2c 20 6e 65 77 4f 62 6a 29 3b 0a 09  terp, newObj);..
1fa0: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 2a 72  } else {..    *r
1fb0: 65 73 75 6c 74 4f 62 6a 20 3d 20 6e 65 77 4f 62  esultObj = newOb
1fc0: 6a 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72  j;..    Tcl_Incr
1fd0: 52 65 66 43 6f 75 6e 74 28 2a 72 65 73 75 6c 74  RefCount(*result
1fe0: 4f 62 6a 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20  Obj);..}.    }. 
1ff0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
2000: 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../**********
2010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20  *********/../*. 
2050: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
2060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2090: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73  ----. *. * Diges
20a0: 74 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 2d  tBlockModeProc -
20b0: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e  -. *. *.This fun
20c0: 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64  ction is invoked
20d0: 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20   by the generic 
20e0: 49 4f 20 6c 65 76 65 6c 0a 20 2a 09 74 6f 20 73  IO level. *.to s
20f0: 65 74 20 62 6c 6f 63 6b 69 6e 67 20 61 6e 64 20  et blocking and 
2100: 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  nonblocking mode
2110: 73 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73  s.. *. * Returns
2120: 3a 0a 20 2a 09 30 20 69 66 20 73 75 63 63 65 73  :. *.0 if succes
2130: 73 66 75 6c 20 6f 72 20 50 4f 53 49 58 20 65 72  sful or POSIX er
2140: 72 6f 72 20 63 6f 64 65 20 69 66 20 66 61 69 6c  ror code if fail
2150: 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ed.. *. * Side e
2160: 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20  ffects:. *.Sets 
2170: 74 68 65 20 64 65 76 69 63 65 20 69 6e 74 6f 20  the device into 
2180: 62 6c 6f 63 6b 69 6e 67 20 6f 72 20 6e 6f 6e 62  blocking or nonb
2190: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 2a  locking mode.. *
21a0: 09 43 61 6e 20 63 61 6c 6c 20 54 63 6c 5f 53 65  .Can call Tcl_Se
21b0: 74 43 68 61 6e 6e 65 6c 45 72 72 6f 72 2e 0a 20  tChannelError.. 
21c0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
21d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2200: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
2210: 69 63 20 69 6e 74 20 44 69 67 65 73 74 42 6c 6f  ic int DigestBlo
2220: 63 6b 4d 6f 64 65 50 72 6f 63 28 43 6c 69 65 6e  ckModeProc(Clien
2230: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
2240: 2c 20 69 6e 74 20 6d 6f 64 65 29 20 7b 0a 20 20  , int mode) {.  
2250: 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73    DigestState *s
2260: 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 73  tatePtr = (Diges
2270: 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74  tState *) client
2280: 44 61 74 61 3b 0a 0a 20 20 20 20 69 66 20 28 6d  Data;..    if (m
2290: 6f 64 65 20 3d 3d 20 54 43 4c 5f 4d 4f 44 45 5f  ode == TCL_MODE_
22a0: 4e 4f 4e 42 4c 4f 43 4b 49 4e 47 29 20 7b 0a 09  NONBLOCKING) {..
22b0: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20  statePtr->flags 
22c0: 7c 3d 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43  |= TLS_TCL_ASYNC
22d0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
22e0: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20  statePtr->flags 
22f0: 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 41 53 59  &= ~(TLS_TCL_ASY
2300: 4e 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  NC);.    }.    r
2310: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20  eturn 0;.}../*. 
2320: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
2330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2360: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73  ----. *. * Diges
2370: 74 43 6c 6f 73 65 50 72 6f 63 20 2d 2d 0a 20 2a  tCloseProc --. *
2380: 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f  . *.This functio
2390: 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20  n is invoked by 
23a0: 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c  the generic IO l
23b0: 65 76 65 6c 20 74 6f 20 70 65 72 66 6f 72 6d 0a  evel to perform.
23c0: 20 2a 09 63 68 61 6e 6e 65 6c 2d 74 79 70 65 20   *.channel-type 
23d0: 73 70 65 63 69 66 69 63 20 63 6c 65 61 6e 75 70  specific cleanup
23e0: 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e 6e 65   when the channe
23f0: 6c 20 69 73 20 63 6c 6f 73 65 64 2e 20 41 6c 6c  l is closed. All
2400: 0a 20 2a 09 71 75 65 75 65 64 20 6f 75 74 70 75  . *.queued outpu
2410: 74 20 69 73 20 66 6c 75 73 68 65 64 20 70 72 69  t is flushed pri
2420: 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
2430: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 0a  is function.. *.
2440: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 30   * Returns:. *.0
2450: 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f   if successful o
2460: 72 20 50 4f 53 49 58 20 65 72 72 6f 72 20 63 6f  r POSIX error co
2470: 64 65 20 69 66 20 66 61 69 6c 65 64 2e 0a 20 2a  de if failed.. *
2480: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
2490: 3a 0a 20 2a 09 44 65 6c 65 74 65 73 20 73 74 6f  :. *.Deletes sto
24a0: 72 65 64 20 73 74 61 74 65 20 64 61 74 61 2e 0a  red state data..
24b0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
24c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24f0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74  --------. */.int
2500: 20 44 69 67 65 73 74 43 6c 6f 73 65 50 72 6f 63   DigestCloseProc
2510: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
2520: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ntData, Tcl_Inte
2530: 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20  rp *interp) {.  
2540: 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73    DigestState *s
2550: 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 73  tatePtr = (Diges
2560: 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74  tState *) client
2570: 44 61 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 43 61  Data;..    /* Ca
2580: 6e 63 65 6c 20 61 63 74 69 76 65 20 74 69 6d 65  ncel active time
2590: 72 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 20  r, if any */.   
25a0: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74   if (statePtr->t
25b0: 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d  imer != (Tcl_Tim
25c0: 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b  erToken) NULL) {
25d0: 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65  ..Tcl_DeleteTime
25e0: 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74  rHandler(statePt
25f0: 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74  r->timer);..stat
2600: 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54  ePtr->timer = (T
2610: 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e  cl_TimerToken) N
2620: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ULL;.    }..    
2630: 2f 2a 20 4f 75 74 70 75 74 20 6d 65 73 73 61 67  /* Output messag
2640: 65 20 64 69 67 65 73 74 20 69 66 20 6e 6f 74 20  e digest if not 
2650: 61 6c 72 65 61 64 79 20 64 6f 6e 65 20 2a 2f 0a  already done */.
2660: 20 20 20 20 69 66 20 28 21 28 73 74 61 74 65 50      if (!(stateP
2670: 74 72 2d 3e 66 6c 61 67 73 20 26 20 43 48 41 4e  tr->flags & CHAN
2680: 5f 45 4f 46 29 29 20 7b 0a 09 54 63 6c 5f 43 68  _EOF)) {..Tcl_Ch
2690: 61 6e 6e 65 6c 20 70 61 72 65 6e 74 20 3d 20 54  annel parent = T
26a0: 63 6c 5f 47 65 74 53 74 61 63 6b 65 64 43 68 61  cl_GetStackedCha
26b0: 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73  nnel(statePtr->s
26c0: 65 6c 66 29 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a  elf);..Tcl_Obj *
26d0: 72 65 73 75 6c 74 4f 62 6a 3b 0a 09 69 6e 74 20  resultObj;..int 
26e0: 77 72 69 74 74 65 6e 3b 0a 0a 09 69 66 20 28 44  written;...if (D
26f0: 69 67 65 73 74 46 69 6e 61 6c 69 7a 65 28 73 74  igestFinalize(st
2700: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20  atePtr->interp, 
2710: 73 74 61 74 65 50 74 72 2c 20 26 72 65 73 75 6c  statePtr, &resul
2720: 74 4f 62 6a 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29  tObj) == TCL_OK)
2730: 20 7b 0a 09 20 20 20 20 75 6e 73 69 67 6e 65 64   {..    unsigned
2740: 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 54 63   char *data = Tc
2750: 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
2760: 6f 6d 4f 62 6a 28 72 65 73 75 6c 74 4f 62 6a 2c  omObj(resultObj,
2770: 20 26 77 72 69 74 74 65 6e 29 3b 0a 09 20 20 20   &written);..   
2780: 20 54 63 6c 5f 57 72 69 74 65 52 61 77 28 70 61   Tcl_WriteRaw(pa
2790: 72 65 6e 74 2c 20 64 61 74 61 2c 20 77 72 69 74  rent, data, writ
27a0: 74 65 6e 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44  ten);..    Tcl_D
27b0: 65 63 72 52 65 66 43 6f 75 6e 74 28 72 65 73 75  ecrRefCount(resu
27c0: 6c 74 4f 62 6a 29 3b 0a 09 7d 0a 09 73 74 61 74  ltObj);..}..stat
27d0: 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 43  ePtr->flags |= C
27e0: 48 41 4e 5f 45 4f 46 3b 0a 20 20 20 20 7d 0a 0a  HAN_EOF;.    }..
27f0: 20 20 20 20 2f 2a 20 43 6c 65 61 6e 2d 75 70 20      /* Clean-up 
2800: 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 53 74 61  */.    DigestSta
2810: 74 65 46 72 65 65 28 73 74 61 74 65 50 74 72 29  teFree(statePtr)
2820: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
2830: 7d 0a 0a 2f 2a 0a 20 2a 20 53 61 6d 65 20 61 73  }../*. * Same as
2840: 20 44 69 67 65 73 74 43 6c 6f 73 65 50 72 6f 63   DigestCloseProc
2850: 20 62 75 74 20 77 69 74 68 20 69 6e 64 69 76 69   but with indivi
2860: 64 75 61 6c 20 72 65 61 64 20 61 6e 64 20 77 72  dual read and wr
2870: 69 74 65 20 63 6c 6f 73 65 20 63 6f 6e 74 72 6f  ite close contro
2880: 6c 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l. */.static int
2890: 20 44 69 67 65 73 74 43 6c 6f 73 65 32 50 72 6f   DigestClose2Pro
28a0: 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73  c(ClientData ins
28b0: 74 61 6e 63 65 44 61 74 61 2c 20 54 63 6c 5f 49  tanceData, Tcl_I
28c0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
28d0: 6e 74 20 66 6c 61 67 73 29 20 7b 0a 0a 20 20 20  nt flags) {..   
28e0: 20 69 66 20 28 28 66 6c 61 67 73 20 26 20 28 54   if ((flags & (T
28f0: 43 4c 5f 43 4c 4f 53 45 5f 52 45 41 44 20 7c 20  CL_CLOSE_READ | 
2900: 54 43 4c 5f 43 4c 4f 53 45 5f 57 52 49 54 45 29  TCL_CLOSE_WRITE)
2910: 29 20 3d 3d 20 30 29 20 7b 0a 09 72 65 74 75 72  ) == 0) {..retur
2920: 6e 20 44 69 67 65 73 74 43 6c 6f 73 65 50 72 6f  n DigestClosePro
2930: 63 28 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20  c(instanceData, 
2940: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 7d 0a 20  interp);.    }. 
2950: 20 20 20 72 65 74 75 72 6e 20 45 49 4e 56 41 4c     return EINVAL
2960: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ;.}../*. *------
2970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29b0: 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 49 6e 70  . *. * DigestInp
29c0: 75 74 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09  utProc --. *. *.
29d0: 43 61 6c 6c 65 64 20 62 79 20 74 68 65 20 67 65  Called by the ge
29e0: 6e 65 72 69 63 20 49 4f 20 73 79 73 74 65 6d 20  neric IO system 
29f0: 74 6f 20 72 65 61 64 20 64 61 74 61 20 66 72 6f  to read data fro
2a00: 6d 20 74 72 61 6e 73 66 6f 72 6d 20 61 6e 64 0a  m transform and.
2a10: 20 2a 09 70 6c 61 63 65 20 69 6e 20 62 75 66 2e   *.place in buf.
2a20: 20 54 72 61 6e 73 66 6f 72 6d 20 67 65 74 73 20   Transform gets 
2a30: 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 75 6e  data from the un
2a40: 64 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c  derlying channel
2a50: 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a  .. *. * Returns:
2a60: 0a 20 2a 09 54 6f 74 61 6c 20 62 79 74 65 73 20  . *.Total bytes 
2a70: 72 65 61 64 20 6f 72 20 2d 31 20 66 6f 72 20 61  read or -1 for a
2a80: 6e 20 65 72 72 6f 72 20 61 6c 6f 6e 67 20 77 69  n error along wi
2a90: 74 68 20 61 20 50 4f 53 49 58 20 65 72 72 6f 72  th a POSIX error
2aa0: 0a 20 2a 09 63 6f 64 65 20 69 6e 20 65 72 72 6f  . *.code in erro
2ab0: 72 43 6f 64 65 50 74 72 2e 20 55 73 65 20 45 41  rCodePtr. Use EA
2ac0: 47 41 49 4e 20 66 6f 72 20 6e 6f 6e 62 6c 6f 63  GAIN for nonbloc
2ad0: 6b 69 6e 67 20 61 6e 64 20 6e 6f 20 64 61 74 61  king and no data
2ae0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
2af0: 65 63 74 73 3a 0a 20 2a 09 52 65 61 64 20 64 61  ects:. *.Read da
2b00: 74 61 20 66 72 6f 6d 20 74 72 61 6e 73 66 6f 72  ta from transfor
2b10: 6d 20 61 6e 64 20 77 72 69 74 65 20 74 6f 20 62  m and write to b
2b20: 75 66 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  uf. *. *--------
2b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
2b70: 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 49 6e 70  */.int DigestInp
2b80: 75 74 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74  utProc(ClientDat
2b90: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 63 68  a clientData, ch
2ba0: 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 74 6f 52  ar *buf, int toR
2bb0: 65 61 64 2c 20 69 6e 74 20 2a 65 72 72 6f 72 43  ead, int *errorC
2bc0: 6f 64 65 50 74 72 29 20 7b 0a 20 20 20 20 44 69  odePtr) {.    Di
2bd0: 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65  gestState *state
2be0: 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 61  Ptr = (DigestSta
2bf0: 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61  te *) clientData
2c00: 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65  ;.    Tcl_Channe
2c10: 6c 20 70 61 72 65 6e 74 3b 0a 20 20 20 20 69 6e  l parent;.    in
2c20: 74 20 72 65 61 64 3b 0a 20 20 20 20 2a 65 72 72  t read;.    *err
2c30: 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 0a  orCodePtr = 0;..
2c40: 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 69 66 20      /* Abort if 
2c50: 6e 6f 74 68 69 6e 67 20 74 6f 20 70 72 6f 63 65  nothing to proce
2c60: 73 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 74 6f  ss */.    if (to
2c70: 52 65 61 64 20 3c 3d 20 30 20 7c 7c 20 73 74 61  Read <= 0 || sta
2c80: 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28  tePtr->self == (
2c90: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
2ca0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b 0a  L) {..return 0;.
2cb0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
2cc0: 74 20 62 79 74 65 73 20 66 72 6f 6d 20 75 6e 64  t bytes from und
2cd0: 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 20  erlying channel 
2ce0: 2a 2f 0a 20 20 20 20 70 61 72 65 6e 74 20 3d 20  */.    parent = 
2cf0: 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 64 43 68  Tcl_GetStackedCh
2d00: 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e  annel(statePtr->
2d10: 73 65 6c 66 29 3b 0a 20 20 20 20 72 65 61 64 20  self);.    read 
2d20: 3d 20 54 63 6c 5f 52 65 61 64 52 61 77 28 70 61  = Tcl_ReadRaw(pa
2d30: 72 65 6e 74 2c 20 62 75 66 2c 20 74 6f 52 65 61  rent, buf, toRea
2d40: 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61  d);..    /* Upda
2d50: 74 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e  te hash function
2d60: 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 61 64   */.    if (read
2d70: 20 3e 20 30 29 20 7b 0a 09 2f 2a 20 48 61 76 65   > 0) {../* Have
2d80: 20 64 61 74 61 20 2a 2f 0a 09 69 66 20 28 44 69   data */..if (Di
2d90: 67 65 73 74 55 70 64 61 74 65 28 73 74 61 74 65  gestUpdate(state
2da0: 50 74 72 2c 20 62 75 66 2c 20 28 73 69 7a 65 5f  Ptr, buf, (size_
2db0: 74 29 20 72 65 61 64 2c 20 30 29 20 21 3d 20 54  t) read, 0) != T
2dc0: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 63  CL_OK) {..    Tc
2dd0: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 45 72 72 6f  l_SetChannelErro
2de0: 72 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  r(statePtr->self
2df0: 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28  , Tcl_ObjPrintf(
2e00: 22 55 70 64 61 74 65 20 66 61 69 6c 65 64 3a 20  "Update failed: 
2e10: 25 73 22 2c 20 52 45 41 53 4f 4e 28 29 29 29 3b  %s", REASON()));
2e20: 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65  ..    *errorCode
2e30: 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 09 20  Ptr = EINVAL;.. 
2e40: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 09 7d 0a     return 0;..}.
2e50: 09 2f 2a 20 54 68 69 73 20 69 73 20 63 6f 72 72  ./* This is corr
2e60: 65 63 74 20 2a 2f 0a 09 72 65 61 64 20 3d 20 2d  ect */..read = -
2e70: 31 3b 0a 09 2a 65 72 72 6f 72 43 6f 64 65 50 74  1;..*errorCodePt
2e80: 72 20 3d 20 45 41 47 41 49 4e 3b 0a 0a 20 20 20  r = EAGAIN;..   
2e90: 20 7d 20 65 6c 73 65 20 69 66 20 28 72 65 61 64   } else if (read
2ea0: 20 3c 20 30 29 20 7b 0a 09 2f 2a 20 45 72 72 6f   < 0) {../* Erro
2eb0: 72 20 2a 2f 0a 09 2a 65 72 72 6f 72 43 6f 64 65  r */..*errorCode
2ec0: 50 74 72 20 3d 20 54 63 6c 5f 47 65 74 45 72 72  Ptr = Tcl_GetErr
2ed0: 6e 6f 28 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73  no();..    } els
2ee0: 65 20 69 66 20 28 21 28 73 74 61 74 65 50 74 72  e if (!(statePtr
2ef0: 2d 3e 66 6c 61 67 73 20 26 20 43 48 41 4e 5f 45  ->flags & CHAN_E
2f00: 4f 46 29 29 20 7b 0a 09 2f 2a 20 45 4f 46 20 2a  OF)) {../* EOF *
2f10: 2f 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75  /..Tcl_Obj *resu
2f20: 6c 74 4f 62 6a 3b 0a 09 69 66 20 28 44 69 67 65  ltObj;..if (Dige
2f30: 73 74 46 69 6e 61 6c 69 7a 65 28 73 74 61 74 65  stFinalize(state
2f40: 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 73 74 61  Ptr->interp, sta
2f50: 74 65 50 74 72 2c 20 26 72 65 73 75 6c 74 4f 62  tePtr, &resultOb
2f60: 6a 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  j) == TCL_OK) {.
2f70: 09 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
2f80: 61 72 20 2a 64 61 74 61 20 3d 20 54 63 6c 5f 47  ar *data = Tcl_G
2f90: 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
2fa0: 62 6a 28 72 65 73 75 6c 74 4f 62 6a 2c 20 26 72  bj(resultObj, &r
2fb0: 65 61 64 29 3b 0a 09 20 20 20 20 6d 65 6d 63 70  ead);..    memcp
2fc0: 79 28 62 75 66 2c 20 64 61 74 61 2c 20 72 65 61  y(buf, data, rea
2fd0: 64 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 65 63  d);..    Tcl_Dec
2fe0: 72 52 65 66 43 6f 75 6e 74 28 72 65 73 75 6c 74  rRefCount(result
2ff0: 4f 62 6a 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b  Obj);...} else {
3000: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61  ..    Tcl_SetCha
3010: 6e 6e 65 6c 45 72 72 6f 72 28 73 74 61 74 65 50  nnelError(stateP
3020: 74 72 2d 3e 73 65 6c 66 2c 20 54 63 6c 5f 4f 62  tr->self, Tcl_Ob
3030: 6a 50 72 69 6e 74 66 28 22 46 69 6e 61 6c 69 7a  jPrintf("Finaliz
3040: 65 20 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 52  e failed: %s", R
3050: 45 41 53 4f 4e 28 29 29 29 3b 0a 09 20 20 20 20  EASON()));..    
3060: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
3070: 45 49 4e 56 41 4c 3b 0a 09 20 20 20 20 72 65 61  EINVAL;..    rea
3080: 64 20 3d 20 30 3b 0a 09 7d 0a 09 73 74 61 74 65  d = 0;..}..state
3090: 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 48  Ptr->flags |= CH
30a0: 41 4e 5f 45 4f 46 3b 0a 20 20 20 20 7d 0a 20 20  AN_EOF;.    }.  
30b0: 20 20 72 65 74 75 72 6e 20 72 65 61 64 3b 0a 7d    return read;.}
30c0: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
30d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
3110: 0a 20 2a 20 44 69 67 65 73 74 4f 75 74 70 75 74  . * DigestOutput
3120: 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61  Proc --. *. *.Ca
3130: 6c 6c 65 64 20 62 79 20 74 68 65 20 67 65 6e 65  lled by the gene
3140: 72 69 63 20 49 4f 20 73 79 73 74 65 6d 20 74 6f  ric IO system to
3150: 20 77 72 69 74 65 20 64 61 74 61 20 69 6e 20 62   write data in b
3160: 75 66 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 2e  uf to transform.
3170: 0a 20 2a 09 54 68 65 20 74 72 61 6e 73 66 6f 72  . *.The transfor
3180: 6d 20 77 72 69 74 65 73 20 74 68 65 20 72 65 73  m writes the res
3190: 75 6c 74 20 74 6f 20 74 68 65 20 75 6e 64 65 72  ult to the under
31a0: 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 2e 0a 20  lying channel.. 
31b0: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a  *. * Returns:. *
31c0: 09 54 6f 74 61 6c 20 62 79 74 65 73 20 77 72 69  .Total bytes wri
31d0: 74 74 65 6e 20 6f 72 20 2d 31 20 66 6f 72 20 61  tten or -1 for a
31e0: 6e 20 65 72 72 6f 72 20 61 6c 6f 6e 67 20 77 69  n error along wi
31f0: 74 68 20 61 20 50 4f 53 49 58 20 65 72 72 6f 72  th a POSIX error
3200: 0a 20 2a 09 63 6f 64 65 20 69 6e 20 65 72 72 6f  . *.code in erro
3210: 72 43 6f 64 65 50 74 72 2e 20 55 73 65 20 45 41  rCodePtr. Use EA
3220: 47 41 49 4e 20 66 6f 72 20 6e 6f 6e 62 6c 6f 63  GAIN for nonbloc
3230: 6b 69 6e 67 20 61 6e 64 20 63 61 6e 27 74 20 77  king and can't w
3240: 72 69 74 65 20 64 61 74 61 2e 0a 20 2a 0a 20 2a  rite data.. *. *
3250: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
3260: 2a 09 47 65 74 20 64 61 74 61 20 66 72 6f 6d 20  *.Get data from 
3270: 62 75 66 20 61 6e 64 20 75 70 64 61 74 65 20 64  buf and update d
3280: 69 67 65 73 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  igest. *. *-----
3290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
32a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
32b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
32c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
32d0: 2d 0a 20 2a 2f 0a 20 69 6e 74 20 44 69 67 65 73  -. */. int Diges
32e0: 74 4f 75 74 70 75 74 50 72 6f 63 28 43 6c 69 65  tOutputProc(Clie
32f0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
3300: 61 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 62  a, const char *b
3310: 75 66 2c 20 69 6e 74 20 74 6f 57 72 69 74 65 2c  uf, int toWrite,
3320: 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50   int *errorCodeP
3330: 74 72 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74  tr) {.    Digest
3340: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20  State *statePtr 
3350: 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a  = (DigestState *
3360: 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20  ) clientData;.  
3370: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20    *errorCodePtr 
3380: 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 41 62 6f  = 0;..    /* Abo
3390: 72 74 20 69 66 20 6e 6f 74 68 69 6e 67 20 74 6f  rt if nothing to
33a0: 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 20 20   process */.    
33b0: 69 66 20 28 74 6f 57 72 69 74 65 20 3c 3d 20 30  if (toWrite <= 0
33c0: 20 7c 7c 20 73 74 61 74 65 50 74 72 2d 3e 73 65   || statePtr->se
33d0: 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e  lf == (Tcl_Chann
33e0: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74  el) NULL) {..ret
33f0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  urn 0;.    }..  
3400: 20 20 2f 2a 20 55 70 64 61 74 65 20 68 61 73 68    /* Update hash
3410: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20   function */.   
3420: 20 69 66 20 28 74 6f 57 72 69 74 65 20 3e 20 30   if (toWrite > 0
3430: 20 26 26 20 44 69 67 65 73 74 55 70 64 61 74 65   && DigestUpdate
3440: 28 73 74 61 74 65 50 74 72 2c 20 62 75 66 2c 20  (statePtr, buf, 
3450: 28 73 69 7a 65 5f 74 29 20 74 6f 57 72 69 74 65  (size_t) toWrite
3460: 2c 20 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  , 0) != TCL_OK) 
3470: 7b 0a 09 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65  {..Tcl_SetChanne
3480: 6c 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2d  lError(statePtr-
3490: 3e 73 65 6c 66 2c 20 54 63 6c 5f 4f 62 6a 50 72  >self, Tcl_ObjPr
34a0: 69 6e 74 66 28 22 55 70 64 61 74 65 20 66 61 69  intf("Update fai
34b0: 6c 65 64 3a 20 25 73 22 2c 20 52 45 41 53 4f 4e  led: %s", REASON
34c0: 28 29 29 29 3b 0a 09 2a 65 72 72 6f 72 43 6f 64  ()));..*errorCod
34d0: 65 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 09  ePtr = EINVAL;..
34e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
34f0: 20 20 20 20 72 65 74 75 72 6e 20 74 6f 57 72 69      return toWri
3500: 74 65 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  te;.}../*. *----
3510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3550: 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 53  --. *. * DigestS
3560: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a  etOptionProc --.
3570: 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79 20   *. *.Called by 
3580: 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 73  the generic IO s
3590: 79 73 74 65 6d 20 74 6f 20 73 65 74 20 63 68 61  ystem to set cha
35a0: 6e 6e 65 6c 20 6f 70 74 69 6f 6e 20 6e 61 6d 65  nnel option name
35b0: 20 74 6f 20 76 61 6c 75 65 2e 0a 20 2a 0a 20 2a   to value.. *. *
35c0: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c   Returns:. *.TCL
35d0: 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75  _OK if successfu
35e0: 6c 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 20 69  l or TCL_ERROR i
35f0: 66 20 66 61 69 6c 65 64 20 61 6c 6f 6e 67 20 77  f failed along w
3600: 69 74 68 20 61 6e 20 65 72 72 6f 72 0a 20 2a 09  ith an error. *.
3610: 6d 65 73 73 61 67 65 20 69 6e 20 69 6e 74 65 72  message in inter
3620: 70 20 61 6e 64 20 54 63 6c 5f 53 65 74 45 72 72  p and Tcl_SetErr
3630: 6e 6f 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  no.. *. * Side e
3640: 66 66 65 63 74 73 3a 0a 20 2a 09 55 70 64 61 74  ffects:. *.Updat
3650: 65 73 20 63 68 61 6e 6e 65 6c 20 6f 70 74 69 6f  es channel optio
3660: 6e 20 74 6f 20 6e 65 77 20 76 61 6c 75 65 2e 0a  n to new value..
3670: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
3680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
36c0: 73 74 61 74 69 63 20 69 6e 74 20 44 69 67 65 73  static int Diges
36d0: 74 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 43  tSetOptionProc(C
36e0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
36f0: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
3700: 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74 20   *interp, const 
3710: 63 68 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65  char *optionName
3720: 2c 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f  ,..const char *o
3730: 70 74 69 6f 6e 56 61 6c 75 65 29 20 7b 0a 20 20  ptionValue) {.  
3740: 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73    DigestState *s
3750: 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 73  tatePtr = (Diges
3760: 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74  tState *) client
3770: 44 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 43 68  Data;.    Tcl_Ch
3780: 61 6e 6e 65 6c 20 70 61 72 65 6e 74 3b 0a 20 20  annel parent;.  
3790: 20 20 54 63 6c 5f 44 72 69 76 65 72 53 65 74 4f    Tcl_DriverSetO
37a0: 70 74 69 6f 6e 50 72 6f 63 20 2a 73 65 74 4f 70  ptionProc *setOp
37b0: 74 69 6f 6e 50 72 6f 63 3b 0a 0a 20 20 20 20 2f  tionProc;..    /
37c0: 2a 20 41 62 6f 72 74 20 69 66 20 6e 6f 20 63 68  * Abort if no ch
37d0: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20  annel */.    if 
37e0: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20  (statePtr->self 
37f0: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29  == (Tcl_Channel)
3800: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
3810: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
3820: 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 67 61  }..    /* Delega
3830: 74 65 20 6f 70 74 69 6f 6e 73 20 64 6f 77 6e 73  te options downs
3840: 74 72 65 61 6d 20 2a 2f 0a 20 20 20 20 70 61 72  tream */.    par
3850: 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 61  ent = Tcl_GetSta
3860: 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 61 74  ckedChannel(stat
3870: 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 20  ePtr->self);.   
3880: 20 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 3d   setOptionProc =
3890: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 53 65 74 4f   Tcl_ChannelSetO
38a0: 70 74 69 6f 6e 50 72 6f 63 28 54 63 6c 5f 47 65  ptionProc(Tcl_Ge
38b0: 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 70 61 72  tChannelType(par
38c0: 65 6e 74 29 29 3b 0a 20 20 20 20 69 66 20 28 73  ent));.    if (s
38d0: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 21 3d 20  etOptionProc != 
38e0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
38f0: 28 2a 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 29  (*setOptionProc)
3900: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49  (Tcl_GetChannelI
3910: 6e 73 74 61 6e 63 65 44 61 74 61 28 70 61 72 65  nstanceData(pare
3920: 6e 74 29 2c 20 69 6e 74 65 72 70 2c 20 6f 70 74  nt), interp, opt
3930: 69 6f 6e 4e 61 6d 65 2c 20 6f 70 74 69 6f 6e 56  ionName, optionV
3940: 61 6c 75 65 29 3b 0a 20 20 20 20 7d 20 65 6c 73  alue);.    } els
3950: 65 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6e  e {..Tcl_SetErrn
3960: 6f 28 45 49 4e 56 41 4c 29 3b 0a 09 72 65 74 75  o(EINVAL);..retu
3970: 72 6e 20 54 63 6c 5f 42 61 64 43 68 61 6e 6e 65  rn Tcl_BadChanne
3980: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
3990: 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 4e 55 4c 4c  optionName, NULL
39a0: 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20  );.    }.}../*. 
39b0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
39c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39f0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69  -------. *. * Di
3a00: 67 65 73 74 47 65 74 4f 70 74 69 6f 6e 50 72 6f  gestGetOptionPro
3a10: 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65  c --. *. *.Calle
3a20: 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 63  d by the generic
3a30: 20 49 4f 20 73 79 73 74 65 6d 20 74 6f 20 67 65   IO system to ge
3a40: 74 20 63 68 61 6e 6e 65 6c 20 6f 70 74 69 6f 6e  t channel option
3a50: 20 6e 61 6d 65 27 73 20 76 61 6c 75 65 2e 0a 20   name's value.. 
3a60: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a  *. * Returns:. *
3a70: 09 54 43 4c 5f 4f 4b 20 69 66 20 73 75 63 63 65  .TCL_OK if succe
3a80: 73 73 66 75 6c 20 6f 72 20 54 43 4c 5f 45 52 52  ssful or TCL_ERR
3a90: 4f 52 20 69 66 20 66 61 69 6c 65 64 20 61 6c 6f  OR if failed alo
3aa0: 6e 67 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  ng with an error
3ab0: 0a 20 2a 09 6d 65 73 73 61 67 65 20 69 6e 20 69  . *.message in i
3ac0: 6e 74 65 72 70 20 61 6e 64 20 54 63 6c 5f 53 65  nterp and Tcl_Se
3ad0: 74 45 72 72 6e 6f 2e 0a 20 2a 0a 20 2a 20 53 69  tErrno.. *. * Si
3ae0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53  de effects:. *.S
3af0: 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20 6f 70  ets result to op
3b00: 74 69 6f 6e 27 73 20 76 61 6c 75 65 0a 20 2a 0a  tion's value. *.
3b10: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
3b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b50: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
3b60: 74 69 63 20 69 6e 74 20 44 69 67 65 73 74 47 65  tic int DigestGe
3b70: 74 4f 70 74 69 6f 6e 50 72 6f 63 28 43 6c 69 65  tOptionProc(Clie
3b80: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
3b90: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
3ba0: 6e 74 65 72 70 2c 20 63 6f 6e 73 74 20 63 68 61  nterp, const cha
3bb0: 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c 0a 09  r *optionName,..
3bc0: 54 63 6c 5f 44 53 74 72 69 6e 67 20 2a 6f 70 74  Tcl_DString *opt
3bd0: 69 6f 6e 56 61 6c 75 65 29 20 7b 0a 20 20 20 20  ionValue) {.    
3be0: 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61  DigestState *sta
3bf0: 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53  tePtr = (DigestS
3c00: 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61  tate *) clientDa
3c10: 74 61 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  ta;.    Tcl_Chan
3c20: 6e 65 6c 20 70 61 72 65 6e 74 3b 0a 20 20 20 20  nel parent;.    
3c30: 54 63 6c 5f 44 72 69 76 65 72 47 65 74 4f 70 74  Tcl_DriverGetOpt
3c40: 69 6f 6e 50 72 6f 63 20 2a 67 65 74 4f 70 74 69  ionProc *getOpti
3c50: 6f 6e 50 72 6f 63 3b 0a 0a 20 20 20 20 2f 2a 20  onProc;..    /* 
3c60: 41 62 6f 72 74 20 69 66 20 6e 6f 20 63 68 61 6e  Abort if no chan
3c70: 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 73  nel */.    if (s
3c80: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d  tatePtr->self ==
3c90: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e   (Tcl_Channel) N
3ca0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  ULL) {..return T
3cb0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
3cc0: 0a 20 20 20 20 2f 2a 20 44 65 6c 65 67 61 74 65  .    /* Delegate
3cd0: 20 6f 70 74 69 6f 6e 73 20 64 6f 77 6e 73 74 72   options downstr
3ce0: 65 61 6d 20 2a 2f 0a 20 20 20 20 70 61 72 65 6e  eam */.    paren
3cf0: 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 63 6b  t = Tcl_GetStack
3d00: 65 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50  edChannel(stateP
3d10: 74 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 20 67  tr->self);.    g
3d20: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 3d 20 54  etOptionProc = T
3d30: 63 6c 5f 43 68 61 6e 6e 65 6c 47 65 74 4f 70 74  cl_ChannelGetOpt
3d40: 69 6f 6e 50 72 6f 63 28 54 63 6c 5f 47 65 74 43  ionProc(Tcl_GetC
3d50: 68 61 6e 6e 65 6c 54 79 70 65 28 70 61 72 65 6e  hannelType(paren
3d60: 74 29 29 3b 0a 20 20 20 20 69 66 20 28 67 65 74  t));.    if (get
3d70: 4f 70 74 69 6f 6e 50 72 6f 63 20 21 3d 20 4e 55  OptionProc != NU
3d80: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 28 2a  LL) {..return (*
3d90: 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 29 28 54  getOptionProc)(T
3da0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73  cl_GetChannelIns
3db0: 74 61 6e 63 65 44 61 74 61 28 70 61 72 65 6e 74  tanceData(parent
3dc0: 29 2c 20 69 6e 74 65 72 70 2c 20 6f 70 74 69 6f  ), interp, optio
3dd0: 6e 4e 61 6d 65 2c 20 6f 70 74 69 6f 6e 56 61 6c  nName, optionVal
3de0: 75 65 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ue);.    } else 
3df0: 69 66 20 28 6f 70 74 69 6f 6e 4e 61 6d 65 20 3d  if (optionName =
3e00: 3d 20 28 63 68 61 72 2a 29 20 4e 55 4c 4c 29 20  = (char*) NULL) 
3e10: 7b 0a 09 2f 2a 20 52 65 71 75 65 73 74 20 69 73  {../* Request is
3e20: 20 71 75 65 72 79 20 66 6f 72 20 61 6c 6c 20 6f   query for all o
3e30: 70 74 69 6f 6e 73 2c 20 74 68 69 73 20 69 73 20  ptions, this is 
3e40: 6f 6b 2e 20 2a 2f 0a 09 72 65 74 75 72 6e 20 54  ok. */..return T
3e50: 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73  CL_OK;.    } els
3e60: 65 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6e  e {..Tcl_SetErrn
3e70: 6f 28 45 49 4e 56 41 4c 29 3b 0a 09 72 65 74 75  o(EINVAL);..retu
3e80: 72 6e 20 54 63 6c 5f 42 61 64 43 68 61 6e 6e 65  rn Tcl_BadChanne
3e90: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
3ea0: 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 4e 55 4c 4c  optionName, NULL
3eb0: 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20  );.    }.}../*. 
3ec0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
3ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 0a 20 2a 20 44 69  -------. *. * Di
3f10: 67 65 73 74 54 69 6d 65 72 48 61 6e 64 6c 65 72  gestTimerHandler
3f20: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64   --. *. *.Called
3f30: 20 62 79 20 74 68 65 20 6e 6f 74 69 66 69 65 72   by the notifier
3f40: 20 76 69 61 20 74 69 6d 65 72 20 74 6f 20 66 6c   via timer to fl
3f50: 75 73 68 20 6f 75 74 20 70 65 6e 64 69 6e 67 20  ush out pending 
3f60: 69 6e 70 75 74 20 64 61 74 61 2e 0a 20 2a 0a 20  input data.. *. 
3f70: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 4e 6f  * Returns:. *.No
3f80: 74 68 69 6e 67 0a 20 2a 0a 20 2a 20 53 69 64 65  thing. *. * Side
3f90: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79   effects:. *.May
3fa0: 20 63 61 6c 6c 20 54 63 6c 5f 4e 6f 74 69 66 79   call Tcl_Notify
3fb0: 43 68 61 6e 6e 65 6c 0a 20 2a 0a 20 2a 2d 2d 2d  Channel. *. *---
3fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4000: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76  ---. */.static v
4010: 6f 69 64 20 44 69 67 65 73 74 54 69 6d 65 72 48  oid DigestTimerH
4020: 61 6e 64 6c 65 72 28 43 6c 69 65 6e 74 44 61 74  andler(ClientDat
4030: 61 20 63 6c 69 65 6e 74 44 61 74 61 29 20 7b 0a  a clientData) {.
4040: 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20      DigestState 
4050: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67  *statePtr = (Dig
4060: 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65  estState *) clie
4070: 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 2f 2a 20  ntData;..    /* 
4080: 41 62 6f 72 74 20 69 66 20 6e 6f 20 63 68 61 6e  Abort if no chan
4090: 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 73  nel */.    if (s
40a0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d  tatePtr->self ==
40b0: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e   (Tcl_Channel) N
40c0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 3b 0a  ULL) {..return;.
40d0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c      }..    /* Cl
40e0: 65 61 72 20 74 69 6d 65 72 20 74 6f 6b 65 6e 20  ear timer token 
40f0: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  */.    statePtr-
4100: 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69  >timer = (Tcl_Ti
4110: 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a  merToken) NULL;.
4120: 0a 20 20 20 20 2f 2a 20 46 69 72 65 20 65 76 65  .    /* Fire eve
4130: 6e 74 20 69 66 20 74 68 65 72 65 20 69 73 20 70  nt if there is p
4140: 65 6e 64 69 6e 67 20 64 61 74 61 2c 20 73 6b 69  ending data, ski
4150: 70 20 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20  p otherwise */. 
4160: 20 20 20 69 66 20 28 28 73 74 61 74 65 50 74 72     if ((statePtr
4170: 2d 3e 77 61 74 63 68 4d 61 73 6b 20 26 20 54 43  ->watchMask & TC
4180: 4c 5f 52 45 41 44 41 42 4c 45 29 20 26 26 20 28  L_READABLE) && (
4190: 54 63 6c 5f 49 6e 70 75 74 42 75 66 66 65 72 65  Tcl_InputBuffere
41a0: 64 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  d(statePtr->self
41b0: 29 20 3e 20 30 29 29 20 7b 0a 09 54 63 6c 5f 4e  ) > 0)) {..Tcl_N
41c0: 6f 74 69 66 79 43 68 61 6e 6e 65 6c 28 73 74 61  otifyChannel(sta
41d0: 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 54 43 4c  tePtr->self, TCL
41e0: 5f 52 45 41 44 41 42 4c 45 29 3b 0a 20 20 20 20  _READABLE);.    
41f0: 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  }.}../*. *------
4200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4240: 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 57 61 74  . *. * DigestWat
4250: 63 68 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09  chProc --. *. *.
4260: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6e  Initialize the n
4270: 6f 74 69 66 69 65 72 20 74 6f 20 77 61 74 63 68  otifier to watch
4280: 20 66 6f 72 20 65 76 65 6e 74 73 20 66 72 6f 6d   for events from
4290: 20 74 68 69 73 20 63 68 61 6e 6e 65 6c 2e 0a 20   this channel.. 
42a0: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a  *. * Returns:. *
42b0: 09 4e 6f 74 68 69 6e 67 20 28 63 61 6e 27 74 20  .Nothing (can't 
42c0: 72 65 74 75 72 6e 20 65 72 72 6f 72 20 6d 65 73  return error mes
42d0: 73 61 67 65 73 29 0a 20 2a 0a 20 2a 20 53 69 64  sages). *. * Sid
42e0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 6f  e effects:. *.Co
42f0: 6e 66 69 67 75 72 65 20 6e 6f 74 69 66 69 65 72  nfigure notifier
4300: 20 73 6f 20 66 75 74 75 72 65 20 65 76 65 6e 74   so future event
4310: 73 20 6f 6e 20 74 68 65 20 63 68 61 6e 6e 65 6c  s on the channel
4320: 20 77 69 6c 6c 20 62 65 20 73 65 65 6e 20 62 79   will be seen by
4330: 20 54 63 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d   Tcl.. *. *-----
4340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4380: 2d 0a 20 2a 2f 0a 76 6f 69 64 20 44 69 67 65 73  -. */.void Diges
4390: 74 57 61 74 63 68 50 72 6f 63 28 43 6c 69 65 6e  tWatchProc(Clien
43a0: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
43b0: 2c 20 69 6e 74 20 6d 61 73 6b 29 20 7b 0a 20 20  , int mask) {.  
43c0: 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73    DigestState *s
43d0: 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 73  tatePtr = (Diges
43e0: 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74  tState *) client
43f0: 44 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 43 68  Data;.    Tcl_Ch
4400: 61 6e 6e 65 6c 20 70 61 72 65 6e 74 3b 0a 20 20  annel parent;.  
4410: 20 20 54 63 6c 5f 44 72 69 76 65 72 57 61 74 63    Tcl_DriverWatc
4420: 68 50 72 6f 63 20 2a 77 61 74 63 68 50 72 6f 63  hProc *watchProc
4430: 3b 0a 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74 20  ;..    /* Abort 
4440: 69 66 20 6e 6f 20 63 68 61 6e 6e 65 6c 20 2a 2f  if no channel */
4450: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
4460: 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f  r->self == (Tcl_
4470: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
4480: 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a  ..return;.    }.
4490: 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 4f 52  .    /* Store OR
44a0: 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  -ed combination 
44b0: 6f 66 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 2c  of TCL_READABLE,
44c0: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 20 61 6e   TCL_WRITABLE an
44d0: 64 20 54 43 4c 5f 45 58 43 45 50 54 49 4f 4e 20  d TCL_EXCEPTION 
44e0: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  */.    statePtr-
44f0: 3e 77 61 74 63 68 4d 61 73 6b 20 3d 20 6d 61 73  >watchMask = mas
4500: 6b 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 70 61  k;..    /* Propa
4510: 67 61 74 65 20 6d 61 73 6b 20 69 6e 66 6f 20 74  gate mask info t
4520: 6f 20 70 61 72 65 6e 74 20 63 68 61 6e 6e 65 6c  o parent channel
4530: 20 2a 2f 0a 20 20 20 20 70 61 72 65 6e 74 20 3d   */.    parent =
4540: 20 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 64 43   Tcl_GetStackedC
4550: 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d  hannel(statePtr-
4560: 3e 73 65 6c 66 29 3b 0a 20 20 20 20 77 61 74 63  >self);.    watc
4570: 68 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68 61 6e  hProc = Tcl_Chan
4580: 6e 65 6c 57 61 74 63 68 50 72 6f 63 28 54 63 6c  nelWatchProc(Tcl
4590: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28  _GetChannelType(
45a0: 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 77 61  parent));.    wa
45b0: 74 63 68 50 72 6f 63 28 54 63 6c 5f 47 65 74 43  tchProc(Tcl_GetC
45c0: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61  hannelInstanceDa
45d0: 74 61 28 70 61 72 65 6e 74 29 2c 20 6d 61 73 6b  ta(parent), mask
45e0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76  );..    /* Remov
45f0: 65 20 70 65 6e 64 69 6e 67 20 74 69 6d 65 72 20  e pending timer 
4600: 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  */.    if (state
4610: 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54  Ptr->timer != (T
4620: 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e  cl_TimerToken) N
4630: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65  ULL) {..Tcl_Dele
4640: 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73  teTimerHandler(s
4650: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b  tatePtr->timer);
4660: 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65  ..statePtr->time
4670: 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f  r = (Tcl_TimerTo
4680: 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  ken) NULL;.    }
4690: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
46a0: 65 20 69 73 20 64 61 74 61 20 70 65 6e 64 69 6e  e is data pendin
46b0: 67 2c 20 73 65 74 20 6e 65 77 20 74 69 6d 65 72  g, set new timer
46c0: 20 74 6f 20 63 61 6c 6c 20 54 63 6c 5f 4e 6f 74   to call Tcl_Not
46d0: 69 66 79 43 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20  ifyChannel */.  
46e0: 20 20 69 66 20 28 28 6d 61 73 6b 20 26 20 54 43    if ((mask & TC
46f0: 4c 5f 52 45 41 44 41 42 4c 45 29 20 26 26 20 28  L_READABLE) && (
4700: 54 63 6c 5f 49 6e 70 75 74 42 75 66 66 65 72 65  Tcl_InputBuffere
4710: 64 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  d(statePtr->self
4720: 29 20 3e 20 30 29 29 20 7b 0a 09 73 74 61 74 65  ) > 0)) {..state
4730: 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 54 63 6c  Ptr->timer = Tcl
4740: 5f 43 72 65 61 74 65 54 69 6d 65 72 48 61 6e 64  _CreateTimerHand
4750: 6c 65 72 28 52 45 41 44 5f 44 45 4c 41 59 2c 20  ler(READ_DELAY, 
4760: 44 69 67 65 73 74 54 69 6d 65 72 48 61 6e 64 6c  DigestTimerHandl
4770: 65 72 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  er, (ClientData)
4780: 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20   statePtr);.    
4790: 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  }.}../*. *------
47a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47e0: 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 47 65 74  . *. * DigestGet
47f0: 48 61 6e 64 6c 65 50 72 6f 63 20 2d 2d 0a 20 2a  HandleProc --. *
4800: 0a 20 2a 09 43 61 6c 6c 65 64 20 66 72 6f 6d 20  . *.Called from 
4810: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 48 61  Tcl_GetChannelHa
4820: 6e 64 6c 65 20 74 6f 20 72 65 74 72 69 65 76 65  ndle to retrieve
4830: 20 4f 53 20 73 70 65 63 69 66 69 63 20 66 69 6c   OS specific fil
4840: 65 20 68 61 6e 64 6c 65 0a 20 2a 09 66 72 6f 6d  e handle. *.from
4850: 20 69 6e 73 69 64 65 20 74 68 69 73 20 63 68 61   inside this cha
4860: 6e 6e 65 6c 2e 20 4e 6f 74 20 75 73 65 64 20 66  nnel. Not used f
4870: 6f 72 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f  or transformatio
4880: 6e 73 3f 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  ns?. *. * Return
4890: 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 66 6f 72  s:. *.TCL_OK for
48a0: 20 73 75 63 63 65 73 73 20 6f 72 20 54 43 4c 5f   success or TCL_
48b0: 45 52 52 4f 52 20 66 6f 72 20 65 72 72 6f 72 20  ERROR for error 
48c0: 6f 72 20 69 66 20 6e 6f 74 20 73 75 70 70 6f 72  or if not suppor
48d0: 74 65 64 2e 20 49 66 0a 20 2a 09 64 69 72 65 63  ted. If. *.direc
48e0: 74 69 6f 6e 20 69 73 20 54 43 4c 5f 52 45 41 44  tion is TCL_READ
48f0: 41 42 4c 45 2c 20 73 65 74 73 20 68 61 6e 64 6c  ABLE, sets handl
4900: 65 50 74 72 20 74 6f 20 74 68 65 20 68 61 6e 64  ePtr to the hand
4910: 6c 65 20 75 73 65 64 20 66 6f 72 0a 20 2a 09 69  le used for. *.i
4920: 6e 70 75 74 2c 20 6f 72 20 69 66 20 54 43 4c 5f  nput, or if TCL_
4930: 57 52 49 54 41 42 4c 45 20 73 65 74 73 20 74 6f  WRITABLE sets to
4940: 20 74 68 65 20 68 61 6e 64 6c 65 20 75 73 65 64   the handle used
4950: 20 66 6f 72 20 6f 75 74 70 75 74 2e 0a 20 2a 0a   for output.. *.
4960: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
4970: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d  . *.None. *. *--
4980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49c0: 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 67  ----. */.int Dig
49d0: 65 73 74 47 65 74 48 61 6e 64 6c 65 50 72 6f 63  estGetHandleProc
49e0: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
49f0: 6e 74 44 61 74 61 2c 20 69 6e 74 20 64 69 72 65  ntData, int dire
4a00: 63 74 69 6f 6e 2c 20 43 6c 69 65 6e 74 44 61 74  ction, ClientDat
4a10: 61 20 2a 68 61 6e 64 6c 65 50 74 72 29 20 7b 0a  a *handlePtr) {.
4a20: 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20      DigestState 
4a30: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67  *statePtr = (Dig
4a40: 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65  estState *) clie
4a50: 6e 74 44 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f  ntData;.    Tcl_
4a60: 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 3b 0a  Channel parent;.
4a70: 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 69 66  .    /* Abort if
4a80: 20 6e 6f 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20   no channel */. 
4a90: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
4aa0: 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68  >self == (Tcl_Ch
4ab0: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
4ac0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
4ad0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 61 72  ;.    }..    par
4ae0: 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 61  ent = Tcl_GetSta
4af0: 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 61 74  ckedChannel(stat
4b00: 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 20  ePtr->self);.   
4b10: 20 72 65 74 75 72 6e 20 54 63 6c 5f 47 65 74 43   return Tcl_GetC
4b20: 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 28 70 61 72  hannelHandle(par
4b30: 65 6e 74 2c 20 64 69 72 65 63 74 69 6f 6e 2c 20  ent, direction, 
4b40: 68 61 6e 64 6c 65 50 74 72 29 3b 0a 7d 0a 0a 2f  handlePtr);.}../
4b50: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
4b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
4ba0: 20 44 69 67 65 73 74 4e 6f 74 69 66 79 50 72 6f   DigestNotifyPro
4bb0: 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65  c --. *. *.Calle
4bc0: 64 20 62 79 20 54 63 6c 20 74 6f 20 69 6e 66 6f  d by Tcl to info
4bd0: 72 6d 20 75 73 20 6f 66 20 61 63 74 69 76 69 74  rm us of activit
4be0: 79 20 6f 6e 20 74 68 65 20 75 6e 64 65 72 6c 79  y on the underly
4bf0: 69 6e 67 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a  ing channel.. *.
4c00: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 55   * Returns:. *.U
4c10: 6e 63 68 61 6e 67 65 64 20 69 6e 74 65 72 65 73  nchanged interes
4c20: 74 4d 61 73 6b 20 77 68 69 63 68 20 69 73 20 61  tMask which is a
4c30: 6e 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74  n OR-ed combinat
4c40: 69 6f 6e 20 6f 66 20 54 43 4c 5f 52 45 41 44 41  ion of TCL_READA
4c50: 42 4c 45 20 6f 72 20 54 43 4c 5f 57 52 49 54 41  BLE or TCL_WRITA
4c60: 42 4c 45 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  BLE. *. * Side e
4c70: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6e 63 65  ffects:. *.Cance
4c80: 6c 73 20 61 6e 79 20 70 65 6e 64 69 6e 67 20 74  ls any pending t
4c90: 69 6d 65 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  imer.. *. *-----
4ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ce0: 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74  -. */.int Digest
4cf0: 4e 6f 74 69 66 79 50 72 6f 63 28 43 6c 69 65 6e  NotifyProc(Clien
4d00: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
4d10: 2c 20 69 6e 74 20 69 6e 74 65 72 65 73 74 4d 61  , int interestMa
4d20: 73 6b 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74  sk) {.    Digest
4d30: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20  State *statePtr 
4d40: 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a  = (DigestState *
4d50: 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20  ) clientData;.. 
4d60: 20 20 20 2f 2a 20 53 6b 69 70 20 74 69 6d 65 72     /* Skip timer
4d70: 20 65 76 65 6e 74 20 61 73 20 72 65 64 75 6e 64   event as redund
4d80: 61 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73  ant */.    if (s
4d90: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21  tatePtr->timer !
4da0: 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65  = (Tcl_TimerToke
4db0: 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f  n) NULL) {..Tcl_
4dc0: 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c  DeleteTimerHandl
4dd0: 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d  er(statePtr->tim
4de0: 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  er);..statePtr->
4df0: 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d  timer = (Tcl_Tim
4e00: 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 20  erToken) NULL;. 
4e10: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
4e20: 69 6e 74 65 72 65 73 74 4d 61 73 6b 3b 0a 7d 0a  interestMask;.}.
4e30: 0a 2f 2a 0a 20 2a 0a 20 2a 20 43 68 61 6e 6e 65  ./*. *. * Channe
4e40: 6c 20 74 79 70 65 20 73 74 72 75 63 74 75 72 65  l type structure
4e50: 20 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20   definition for 
4e60: 64 69 67 65 73 74 20 74 72 61 6e 73 66 6f 72 6d  digest transform
4e70: 61 74 69 6f 6e 73 2e 0a 20 2a 0a 20 2a 2f 0a 73  ations.. *. */.s
4e80: 74 61 74 69 63 20 63 6f 6e 73 74 20 54 63 6c 5f  tatic const Tcl_
4e90: 43 68 61 6e 6e 65 6c 54 79 70 65 20 64 69 67 65  ChannelType dige
4ea0: 73 74 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d 20  stChannelType = 
4eb0: 7b 0a 20 20 20 20 22 64 69 67 65 73 74 22 2c 09  {.    "digest",.
4ec0: 09 09 2f 2a 20 54 79 70 65 20 6e 61 6d 65 20 2a  ../* Type name *
4ed0: 2f 0a 20 20 20 20 54 43 4c 5f 43 48 41 4e 4e 45  /.    TCL_CHANNE
4ee0: 4c 5f 56 45 52 53 49 4f 4e 5f 35 2c 09 2f 2a 20  L_VERSION_5,./* 
4ef0: 76 35 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20  v5 channel */.  
4f00: 20 20 44 69 67 65 73 74 43 6c 6f 73 65 50 72 6f    DigestClosePro
4f10: 63 2c 09 09 2f 2a 20 43 6c 6f 73 65 20 70 72 6f  c,../* Close pro
4f20: 63 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 49  c */.    DigestI
4f30: 6e 70 75 74 50 72 6f 63 2c 09 09 2f 2a 20 49 6e  nputProc,../* In
4f40: 70 75 74 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20  put proc */.    
4f50: 44 69 67 65 73 74 4f 75 74 70 75 74 50 72 6f 63  DigestOutputProc
4f60: 2c 09 09 2f 2a 20 4f 75 74 70 75 74 20 70 72 6f  ,../* Output pro
4f70: 63 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09  c */.    NULL,..
4f80: 09 2f 2a 20 53 65 65 6b 20 70 72 6f 63 20 2a 2f  ./* Seek proc */
4f90: 0a 20 20 20 20 44 69 67 65 73 74 53 65 74 4f 70  .    DigestSetOp
4fa0: 74 69 6f 6e 50 72 6f 63 2c 09 2f 2a 20 53 65 74  tionProc,./* Set
4fb0: 20 6f 70 74 69 6f 6e 20 70 72 6f 63 20 2a 2f 0a   option proc */.
4fc0: 20 20 20 20 44 69 67 65 73 74 47 65 74 4f 70 74      DigestGetOpt
4fd0: 69 6f 6e 50 72 6f 63 2c 09 2f 2a 20 47 65 74 20  ionProc,./* Get 
4fe0: 6f 70 74 69 6f 6e 20 70 72 6f 63 20 2a 2f 0a 20  option proc */. 
4ff0: 20 20 20 44 69 67 65 73 74 57 61 74 63 68 50 72     DigestWatchPr
5000: 6f 63 2c 09 09 2f 2a 20 49 6e 69 74 69 61 6c 69  oc,../* Initiali
5010: 7a 65 20 6e 6f 74 69 66 69 65 72 20 2a 2f 0a 20  ze notifier */. 
5020: 20 20 20 44 69 67 65 73 74 47 65 74 48 61 6e 64     DigestGetHand
5030: 6c 65 50 72 6f 63 2c 09 2f 2a 20 47 65 74 20 4f  leProc,./* Get O
5040: 53 20 68 61 6e 64 6c 65 73 20 6f 75 74 20 6f 66  S handles out of
5050: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20   channel */.    
5060: 44 69 67 65 73 74 43 6c 6f 73 65 32 50 72 6f 63  DigestClose2Proc
5070: 2c 09 09 2f 2a 20 63 6c 6f 73 65 32 70 72 6f 63  ,../* close2proc
5080: 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 42 6c   */.    DigestBl
5090: 6f 63 6b 4d 6f 64 65 50 72 6f 63 2c 09 2f 2a 20  ockModeProc,./* 
50a0: 53 65 74 20 62 6c 6f 63 6b 69 6e 67 2f 6e 6f 6e  Set blocking/non
50b0: 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2a 2f 0a  blocking mode*/.
50c0: 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 46      NULL,.../* F
50d0: 6c 75 73 68 20 70 72 6f 63 20 2a 2f 0a 20 20 20  lush proc */.   
50e0: 20 44 69 67 65 73 74 4e 6f 74 69 66 79 50 72 6f   DigestNotifyPro
50f0: 63 2c 09 09 2f 2a 20 48 61 6e 64 6c 69 6e 67 20  c,../* Handling 
5100: 6f 66 20 65 76 65 6e 74 73 20 62 75 62 62 6c 69  of events bubbli
5110: 6e 67 20 75 70 20 2a 2f 0a 20 20 20 20 4e 55 4c  ng up */.    NUL
5120: 4c 2c 09 09 09 2f 2a 20 57 69 64 65 20 73 65 65  L,.../* Wide see
5130: 6b 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 4e 55  k proc */.    NU
5140: 4c 4c 2c 09 09 09 2f 2a 20 54 68 72 65 61 64 20  LL,.../* Thread 
5150: 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 4e 55  action */.    NU
5160: 4c 4c 09 09 09 2f 2a 20 54 72 75 6e 63 61 74 65  LL.../* Truncate
5170: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d   */.};../*. *---
5180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51c0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74  ---. *. * Digest
51d0: 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 20 2d  ChannelHandler -
51e0: 2d 0a 20 2a 0a 20 2a 09 43 72 65 61 74 65 20 61  -. *. *.Create a
51f0: 20 73 74 61 63 6b 65 64 20 63 68 61 6e 6e 65 6c   stacked channel
5200: 20 66 6f 72 20 61 20 6d 65 73 73 61 67 65 20 64   for a message d
5210: 69 67 65 73 74 20 74 72 61 6e 73 66 6f 72 6d 61  igest transforma
5220: 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 75  tion.. *. * Retu
5230: 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f  rns:. *.TCL_OK o
5240: 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20  r TCL_ERROR. *. 
5250: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
5260: 20 2a 09 41 64 64 73 20 74 72 61 6e 73 66 6f 72   *.Adds transfor
5270: 6d 20 74 6f 20 63 68 61 6e 6e 65 6c 20 61 6e 64  m to channel and
5280: 20 73 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20   sets result to 
5290: 63 68 61 6e 6e 65 6c 20 69 64 20 6f 72 20 65 72  channel id or er
52a0: 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a  ror message.. *.
52b0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
52c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52f0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
5300: 74 69 63 20 69 6e 74 20 44 69 67 65 73 74 43 68  tic int DigestCh
5310: 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 28 54 63 6c  annelHandler(Tcl
5320: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
5330: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 68 61   const char *cha
5340: 6e 6e 65 6c 2c 20 63 6f 6e 73 74 20 45 56 50 5f  nnel, const EVP_
5350: 4d 44 20 2a 6d 64 2c 0a 09 63 6f 6e 73 74 20 45  MD *md,..const E
5360: 56 50 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65  VP_CIPHER *ciphe
5370: 72 2c 20 69 6e 74 20 66 6f 72 6d 61 74 2c 20 54  r, int format, T
5380: 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4f 62 6a 2c 20  cl_Obj *keyObj, 
5390: 45 56 50 5f 4d 41 43 20 2a 6d 61 63 29 20 7b 0a  EVP_MAC *mac) {.
53a0: 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 20 2f 2a      int mode; /*
53b0: 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69   OR-ed combinati
53c0: 6f 6e 20 6f 66 20 54 43 4c 5f 52 45 41 44 41 42  on of TCL_READAB
53d0: 4c 45 20 61 6e 64 20 54 43 4c 5f 57 52 49 54 41  LE and TCL_WRITA
53e0: 42 4c 45 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 43  BLE */.    Tcl_C
53f0: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20  hannel chan;.   
5400: 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74   DigestState *st
5410: 61 74 65 50 74 72 3b 0a 0a 20 20 20 20 64 70 72  atePtr;..    dpr
5420: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
5430: 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 65  .    /* Validate
5440: 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 69 66 20   args */.    if 
5450: 28 63 68 61 6e 6e 65 6c 20 3d 3d 20 28 63 6f 6e  (channel == (con
5460: 73 74 20 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  st char *) NULL)
5470: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
5480: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
5490: 20 2f 2a 20 47 65 74 20 63 68 61 6e 6e 65 6c 20   /* Get channel 
54a0: 49 64 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d  Id */.    chan =
54b0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28   Tcl_GetChannel(
54c0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c 2c  interp, channel,
54d0: 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20   &mode);.    if 
54e0: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68  (chan == (Tcl_Ch
54f0: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
5500: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
5510: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
5520: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65  Make sure to ope
5530: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d  rate on the topm
5540: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  ost channel */. 
5550: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
5560: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
5570: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  );..    /* Creat
5580: 65 20 73 74 61 74 65 20 64 61 74 61 20 73 74 72  e state data str
5590: 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 69 66  ucture */.    if
55a0: 20 28 28 73 74 61 74 65 50 74 72 20 3d 20 44 69   ((statePtr = Di
55b0: 67 65 73 74 53 74 61 74 65 4e 65 77 28 69 6e 74  gestStateNew(int
55c0: 65 72 70 2c 20 66 6f 72 6d 61 74 29 29 20 3d 3d  erp, format)) ==
55d0: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70   NULL) {..Tcl_Ap
55e0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
55f0: 70 2c 20 22 4d 65 6d 6f 72 79 20 61 6c 6c 6f 63  p, "Memory alloc
5600: 61 74 69 6f 6e 20 65 72 72 6f 72 22 2c 20 28 63  ation error", (c
5610: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72  har *) NULL);..r
5620: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
5630: 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65  .    }.    state
5640: 50 74 72 2d 3e 73 65 6c 66 20 3d 20 63 68 61 6e  Ptr->self = chan
5650: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ;.    statePtr->
5660: 6d 6f 64 65 20 3d 20 6d 6f 64 65 3b 0a 0a 20 20  mode = mode;..  
5670: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
5680: 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  hash function */
5690: 0a 20 20 20 20 69 66 20 28 44 69 67 65 73 74 49  .    if (DigestI
56a0: 6e 69 74 69 61 6c 69 7a 65 28 69 6e 74 65 72 70  nitialize(interp
56b0: 2c 20 73 74 61 74 65 50 74 72 2c 20 6d 64 2c 20  , statePtr, md, 
56c0: 63 69 70 68 65 72 2c 20 6b 65 79 4f 62 6a 2c 20  cipher, keyObj, 
56d0: 6d 61 63 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  mac) != TCL_OK) 
56e0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
56f0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
5700: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 20 63 68 61  /* Configure cha
5710: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  nnel */.    Tcl_
5720: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  SetChannelOption
5730: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22  (interp, chan, "
5740: 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22  -translation", "
5750: 62 69 6e 61 72 79 22 29 3b 0a 20 20 20 20 69 66  binary");.    if
5760: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c   (Tcl_GetChannel
5770: 42 75 66 66 65 72 53 69 7a 65 28 63 68 61 6e 29  BufferSize(chan)
5780: 20 3c 20 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49   < EVP_MAX_MD_SI
5790: 5a 45 20 2a 20 32 29 20 7b 0a 09 54 63 6c 5f 53  ZE * 2) {..Tcl_S
57a0: 65 74 43 68 61 6e 6e 65 6c 42 75 66 66 65 72 53  etChannelBufferS
57b0: 69 7a 65 28 63 68 61 6e 2c 20 45 56 50 5f 4d 41  ize(chan, EVP_MA
57c0: 58 5f 4d 44 5f 53 49 5a 45 20 2a 20 32 29 3b 0a  X_MD_SIZE * 2);.
57d0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 74      }..    /* St
57e0: 61 63 6b 20 63 68 61 6e 6e 65 6c 2c 20 61 62 6f  ack channel, abo
57f0: 72 74 20 66 6f 72 20 65 72 72 6f 72 20 2a 2f 0a  rt for error */.
5800: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 65      statePtr->se
5810: 6c 66 20 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68  lf = Tcl_StackCh
5820: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 26 64  annel(interp, &d
5830: 69 67 65 73 74 43 68 61 6e 6e 65 6c 54 79 70 65  igestChannelType
5840: 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73  , (ClientData) s
5850: 74 61 74 65 50 74 72 2c 20 6d 6f 64 65 2c 20 63  tatePtr, mode, c
5860: 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 73 74  han);.    if (st
5870: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20  atePtr->self == 
5880: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
5890: 4c 4c 29 20 7b 0a 09 44 69 67 65 73 74 53 74 61  LL) {..DigestSta
58a0: 74 65 46 72 65 65 28 73 74 61 74 65 50 74 72 29  teFree(statePtr)
58b0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
58c0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
58d0: 2f 2a 20 53 65 74 20 72 65 73 75 6c 74 20 74 6f  /* Set result to
58e0: 20 63 68 61 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20   channel Id */. 
58f0: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
5900: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
5910: 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  ) Tcl_GetChannel
5920: 4e 61 6d 65 28 63 68 61 6e 29 2c 20 54 43 4c 5f  Name(chan), TCL_
5930: 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72  VOLATILE);.    r
5940: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
5950: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
5960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
59a0: 20 2a 20 55 6e 73 74 61 63 6b 20 43 68 61 6e 6e   * Unstack Chann
59b0: 65 6c 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  el --. *. *.This
59c0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 6d 6f 76 65   function remove
59d0: 73 20 74 68 65 20 73 74 61 63 6b 65 64 20 63 68  s the stacked ch
59e0: 61 6e 6e 65 6c 20 66 72 6f 6d 20 74 68 65 20 74  annel from the t
59f0: 6f 70 20 6f 66 20 74 68 65 0a 20 2a 09 63 68 61  op of the. *.cha
5a00: 6e 6e 65 6c 20 73 74 61 63 6b 20 69 66 20 69 74  nnel stack if it
5a10: 20 69 73 20 61 20 64 69 67 65 73 74 20 63 68 61   is a digest cha
5a20: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 74 75  nnel.. *. * Retu
5a30: 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f  rns:. *.TCL_OK o
5a40: 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20  r TCL_ERROR. *. 
5a50: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
5a60: 20 2a 09 52 65 6d 6f 76 65 73 20 74 72 61 6e 73   *.Removes trans
5a70: 66 6f 72 6d 20 66 72 6f 6d 20 63 68 61 6e 6e 65  form from channe
5a80: 6c 20 6f 72 20 73 65 74 73 20 72 65 73 75 6c 74  l or sets result
5a90: 20 74 6f 20 65 72 72 6f 72 20 6d 65 73 73 61 67   to error messag
5aa0: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  e.. *. *--------
5ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
5af0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 69  */.static int Di
5b00: 67 65 73 74 55 6e 73 74 61 63 6b 4f 62 6a 43 6d  gestUnstackObjCm
5b10: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  d(ClientData cli
5b20: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  entData, Tcl_Int
5b30: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
5b40: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
5b50: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a  const objv[]) {.
5b60: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20      Tcl_Channel 
5b70: 63 68 61 6e 3b 0a 20 20 20 20 69 6e 74 20 6d 6f  chan;.    int mo
5b80: 64 65 3b 20 2f 2a 20 4f 52 2d 65 64 20 63 6f 6d  de; /* OR-ed com
5b90: 62 69 6e 61 74 69 6f 6e 20 6f 66 20 54 43 4c 5f  bination of TCL_
5ba0: 52 45 41 44 41 42 4c 45 20 61 6e 64 20 54 43 4c  READABLE and TCL
5bb0: 5f 57 52 49 54 41 42 4c 45 20 20 2a 2f 0a 0a 20  _WRITABLE  */.. 
5bc0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
5bd0: 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61  ed");..    /* Va
5be0: 6c 69 64 61 74 65 20 61 72 67 20 63 6f 75 6e 74  lidate arg count
5bf0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63   */.    if (objc
5c00: 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72   != 2) {..Tcl_Wr
5c10: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
5c20: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61  p, 1, objv, "cha
5c30: 6e 6e 65 6c 49 64 22 29 3b 0a 09 72 65 74 75 72  nnelId");..retur
5c40: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
5c50: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63   }..    /* Get c
5c60: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68  hannel */.    ch
5c70: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e  an = Tcl_GetChan
5c80: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  nel(interp, Tcl_
5c90: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
5ca0: 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c  (objv[1], NULL),
5cb0: 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20   &mode);.    if 
5cc0: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68  (chan == (Tcl_Ch
5cd0: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
5ce0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
5cf0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
5d00: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65  Make sure to ope
5d10: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d  rate on the topm
5d20: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  ost channel */. 
5d30: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
5d40: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
5d50: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  );..    /* Check
5d60: 20 69 66 20 64 69 67 65 73 74 20 63 68 61 6e 6e   if digest chann
5d70: 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 63  el */.    if (Tc
5d80: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65  l_GetChannelType
5d90: 28 63 68 61 6e 29 20 21 3d 20 26 64 69 67 65 73  (chan) != &diges
5da0: 74 43 68 61 6e 6e 65 6c 54 79 70 65 29 20 7b 0a  tChannelType) {.
5db0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
5dc0: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63  t(interp, "bad c
5dd0: 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f  hannel \"", Tcl_
5de0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63  GetChannelName(c
5df0: 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20  han),..    "\": 
5e00: 6e 6f 74 20 61 20 64 69 67 65 73 74 20 63 68 61  not a digest cha
5e10: 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54  nnel", NULL);..T
5e20: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
5e30: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
5e40: 55 4e 53 54 41 43 4b 22 2c 20 22 43 48 41 4e 4e  UNSTACK", "CHANN
5e50: 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20  EL", "INVALID", 
5e60: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
5e70: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
5e80: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
5e90: 20 50 6f 70 20 74 72 61 6e 73 66 6f 72 6d 20 66   Pop transform f
5ea0: 72 6f 6d 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  rom channel */. 
5eb0: 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 55 6e     return Tcl_Un
5ec0: 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74  stackChannel(int
5ed0: 65 72 70 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20  erp, chan);.    
5ee0: 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c  .clientData = cl
5ef0: 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 2a  ientData;.}../**
5f00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5f10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5f20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5f30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5f40: 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  */../*. *-------
5f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
5f90: 20 2a 20 44 69 67 65 73 74 49 6e 73 74 61 6e 63   * DigestInstanc
5fa0: 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a  eObjCmd --. *. *
5fb0: 09 48 61 6e 64 6c 65 72 20 66 6f 72 20 64 69 67  .Handler for dig
5fc0: 65 73 74 20 63 6f 6d 6d 61 6e 64 20 69 6e 73 74  est command inst
5fd0: 61 6e 63 65 73 2e 20 55 73 65 64 20 74 6f 20 61  ances. Used to a
5fe0: 64 64 20 64 61 74 61 20 74 6f 20 68 61 73 68 0a  dd data to hash.
5ff0: 20 2a 09 66 75 6e 63 74 69 6f 6e 20 6f 72 20 72   *.function or r
6000: 65 74 72 69 65 76 65 20 6d 65 73 73 61 67 65 20  etrieve message 
6010: 64 69 67 65 73 74 2e 0a 20 2a 0a 20 2a 20 52 65  digest.. *. * Re
6020: 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b  turns:. *.TCL_OK
6030: 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a   or TCL_ERROR. *
6040: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
6050: 3a 0a 20 2a 09 41 64 64 73 20 64 61 74 61 20 74  :. *.Adds data t
6060: 6f 20 68 61 73 68 20 6f 72 20 72 65 74 75 72 6e  o hash or return
6070: 73 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74  s message digest
6080: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
6090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e  ---------. */.in
60d0: 74 20 44 69 67 65 73 74 49 6e 73 74 61 6e 63 65  t DigestInstance
60e0: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74  ObjCmd(ClientDat
60f0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63  a clientData, Tc
6100: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
6110: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f  , int objc, Tcl_
6120: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b  Obj *const objv[
6130: 5d 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53  ]) {.    DigestS
6140: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
6150: 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 29   (DigestState *)
6160: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20   clientData;.   
6170: 20 69 6e 74 20 66 6e 2c 20 6c 65 6e 20 3d 20 30   int fn, len = 0
6180: 3b 0a 20 20 20 20 63 68 61 72 20 2a 62 75 66 20  ;.    char *buf 
6190: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 73 74 61 74  = NULL;.    stat
61a0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69  ic const char *i
61b0: 6e 73 74 61 6e 63 65 5f 66 6e 73 20 5b 5d 20 3d  nstance_fns [] =
61c0: 20 7b 20 22 66 69 6e 61 6c 69 7a 65 22 2c 20 22   { "finalize", "
61d0: 75 70 64 61 74 65 22 2c 20 4e 55 4c 4c 20 7d 3b  update", NULL };
61e0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
61f0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a  alled");..    /*
6200: 20 56 61 6c 69 64 61 74 65 20 61 72 67 20 63 6f   Validate arg co
6210: 75 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f  unt */.    if (o
6220: 62 6a 63 20 3c 20 32 20 7c 7c 20 6f 62 6a 63 20  bjc < 2 || objc 
6230: 3e 20 33 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e  > 3) {..Tcl_Wron
6240: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
6250: 20 31 2c 20 6f 62 6a 76 2c 20 22 66 75 6e 63 74   1, objv, "funct
6260: 69 6f 6e 20 3f 64 61 74 61 3f 22 29 3b 0a 09 72  ion ?data?");..r
6270: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
6280: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
6290: 65 74 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  et function */. 
62a0: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e     if (Tcl_GetIn
62b0: 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  dexFromObj(inter
62c0: 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 69 6e 73 74  p, objv[1], inst
62d0: 61 6e 63 65 5f 66 6e 73 2c 20 22 66 75 6e 63 74  ance_fns, "funct
62e0: 69 6f 6e 22 2c 20 30 2c 20 26 66 6e 29 20 21 3d  ion", 0, &fn) !=
62f0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75   TCL_OK) {..retu
6300: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
6310: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 66    }..    /* Do f
6320: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69  unction */.    i
6330: 66 20 28 66 6e 29 20 7b 0a 09 2f 2a 20 47 65 74  f (fn) {../* Get
6340: 20 64 61 74 61 20 6f 72 20 72 65 74 75 72 6e 20   data or return 
6350: 65 72 72 6f 72 20 69 66 20 6e 6f 6e 65 20 2a 2f  error if none */
6360: 0a 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20 33 29  ..if (objc == 3)
6370: 20 7b 0a 09 20 20 20 20 62 75 66 20 3d 20 54 63   {..    buf = Tc
6380: 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
6390: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
63a0: 6c 65 6e 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  len);..} else {.
63b0: 09 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
63c0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
63d0: 20 6f 62 6a 76 2c 20 22 75 70 64 61 74 65 20 64   objv, "update d
63e0: 61 74 61 22 29 3b 0a 09 20 20 20 20 72 65 74 75  ata");..    retu
63f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
6400: 0a 0a 09 2f 2a 20 55 70 64 61 74 65 20 68 61 73  .../* Update has
6410: 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 09 69  h function */..i
6420: 66 20 28 44 69 67 65 73 74 55 70 64 61 74 65 28  f (DigestUpdate(
6430: 73 74 61 74 65 50 74 72 2c 20 62 75 66 2c 20 28  statePtr, buf, (
6440: 73 69 7a 65 5f 74 29 20 6c 65 6e 2c 20 31 29 20  size_t) len, 1) 
6450: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20  != TCL_OK) {..  
6460: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
6470: 4f 52 3b 0a 09 7d 0a 0a 20 20 20 20 7d 20 65 6c  OR;..}..    } el
6480: 73 65 20 7b 0a 09 2f 2a 20 46 69 6e 61 6c 69 7a  se {../* Finaliz
6490: 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20  e hash function 
64a0: 61 6e 64 20 63 61 6c 63 75 6c 61 74 65 20 6d 65  and calculate me
64b0: 73 73 61 67 65 20 64 69 67 65 73 74 20 2a 2f 0a  ssage digest */.
64c0: 09 69 66 20 28 44 69 67 65 73 74 46 69 6e 61 6c  .if (DigestFinal
64d0: 69 7a 65 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ize(interp, stat
64e0: 65 50 74 72 2c 20 4e 55 4c 4c 29 20 21 3d 20 54  ePtr, NULL) != T
64f0: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 72 65  CL_OK) {..    re
6500: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6510: 09 7d 0a 0a 09 54 63 6c 5f 44 65 6c 65 74 65 43  .}...Tcl_DeleteC
6520: 6f 6d 6d 61 6e 64 46 72 6f 6d 54 6f 6b 65 6e 28  ommandFromToken(
6530: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
6540: 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a  ->token);.    }.
6550: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
6560: 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  K;.}../*. *-----
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 2d 2d 2d  ----------------
6590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
65b0: 2a 0a 20 2a 20 44 69 67 65 73 74 43 6f 6d 6d 61  *. * DigestComma
65c0: 6e 64 44 65 6c 65 74 65 48 61 6e 64 6c 65 72 20  ndDeleteHandler 
65d0: 2d 2d 0a 20 2a 0a 20 2a 09 20 43 61 6c 6c 62 61  --. *. *. Callba
65e0: 63 6b 20 74 6f 20 63 6c 65 61 6e 2d 75 70 20 77  ck to clean-up w
65f0: 68 65 6e 20 64 69 67 65 73 74 20 69 6e 73 74 61  hen digest insta
6600: 6e 63 65 20 63 6f 6d 6d 61 6e 64 20 69 73 20 64  nce command is d
6610: 65 6c 65 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 65  eleted.. *. * Re
6620: 74 75 72 6e 73 3a 0a 20 2a 09 4e 6f 74 68 69 6e  turns:. *.Nothin
6630: 67 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  g. *. * Side eff
6640: 65 63 74 73 3a 0a 20 2a 09 44 65 73 74 72 6f 79  ects:. *.Destroy
6650: 73 20 73 74 61 74 65 20 69 6e 66 6f 20 73 74 72  s state info str
6660: 75 63 74 75 72 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d  ucture. *. *----
6670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
66a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
66b0: 20 2a 2f 0a 76 6f 69 64 20 44 69 67 65 73 74 43   */.void DigestC
66c0: 6f 6d 6d 61 6e 64 44 65 6c 65 74 65 48 61 6e 64  ommandDeleteHand
66d0: 6c 65 72 28 43 6c 69 65 6e 74 44 61 74 61 20 63  ler(ClientData c
66e0: 6c 69 65 6e 74 44 61 74 61 29 20 7b 0a 20 20 20  lientData) {.   
66f0: 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74   DigestState *st
6700: 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 74  atePtr = (Digest
6710: 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44  State *) clientD
6720: 61 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 43 6c 65  ata;..    /* Cle
6730: 61 6e 2d 75 70 20 2a 2f 0a 20 20 20 20 44 69 67  an-up */.    Dig
6740: 65 73 74 53 74 61 74 65 46 72 65 65 28 73 74 61  estStateFree(sta
6750: 74 65 50 74 72 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  tePtr);.}../*. *
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 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67a0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74  ---. *. * Digest
67b0: 43 6f 6d 6d 61 6e 64 48 61 6e 64 6c 65 72 20 2d  CommandHandler -
67c0: 2d 0a 20 2a 0a 20 2a 09 20 43 72 65 61 74 65 20  -. *. *. Create 
67d0: 63 6f 6d 6d 61 6e 64 20 74 6f 20 61 6c 6c 6f 77  command to allow
67e0: 20 75 73 65 72 20 74 6f 20 61 64 64 20 64 61 74   user to add dat
67f0: 61 20 74 6f 20 68 61 73 68 20 66 75 6e 63 74 69  a to hash functi
6800: 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  on.. *. * Return
6810: 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20  s:. *.TCL_OK or 
6820: 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20  TCL_ERROR. *. * 
6830: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
6840: 09 43 72 65 61 74 65 73 20 63 6f 6d 6d 61 6e 64  .Creates command
6850: 20 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67   or error messag
6860: 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  e. *. *---------
6870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
68a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69  ----------. */.i
68b0: 6e 74 20 44 69 67 65 73 74 43 6f 6d 6d 61 6e 64  nt DigestCommand
68c0: 48 61 6e 64 6c 65 72 28 54 63 6c 5f 49 6e 74 65  Handler(Tcl_Inte
68d0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f  rp *interp, Tcl_
68e0: 4f 62 6a 20 2a 63 6d 64 4f 62 6a 2c 20 63 6f 6e  Obj *cmdObj, con
68f0: 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 2c 0a 09  st EVP_MD *md,..
6900: 63 6f 6e 73 74 20 45 56 50 5f 43 49 50 48 45 52  const EVP_CIPHER
6910: 20 2a 63 69 70 68 65 72 2c 20 69 6e 74 20 66 6f   *cipher, int fo
6920: 72 6d 61 74 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6b  rmat, Tcl_Obj *k
6930: 65 79 4f 62 6a 2c 20 45 56 50 5f 4d 41 43 20 2a  eyObj, EVP_MAC *
6940: 6d 61 63 29 20 7b 0a 20 20 20 20 44 69 67 65 73  mac) {.    Diges
6950: 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72  tState *statePtr
6960: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 6d 64 4e  ;.    char *cmdN
6970: 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
6980: 69 6e 67 46 72 6f 6d 4f 62 6a 28 63 6d 64 4f 62  ingFromObj(cmdOb
6990: 6a 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 64  j, NULL);..    d
69a0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
69b0: 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ;..    /* Create
69c0: 20 73 74 61 74 65 20 64 61 74 61 20 73 74 72 75   state data stru
69d0: 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 69 66 20  cture */.    if 
69e0: 28 28 73 74 61 74 65 50 74 72 20 3d 20 44 69 67  ((statePtr = Dig
69f0: 65 73 74 53 74 61 74 65 4e 65 77 28 69 6e 74 65  estStateNew(inte
6a00: 72 70 2c 20 66 6f 72 6d 61 74 29 29 20 3d 3d 20  rp, format)) == 
6a10: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70  NULL) {..Tcl_App
6a20: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
6a30: 2c 20 22 4d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  , "Memory alloca
6a40: 74 69 6f 6e 20 65 72 72 6f 72 22 2c 20 28 63 68  tion error", (ch
6a50: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65  ar *) NULL);..re
6a60: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6a70: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e      }..    /* In
6a80: 69 74 69 61 6c 69 7a 65 20 68 61 73 68 20 66 75  itialize hash fu
6a90: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66  nction */.    if
6aa0: 20 28 44 69 67 65 73 74 49 6e 69 74 69 61 6c 69   (DigestInitiali
6ab0: 7a 65 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  ze(interp, state
6ac0: 50 74 72 2c 20 6d 64 2c 20 63 69 70 68 65 72 2c  Ptr, md, cipher,
6ad0: 20 6b 65 79 4f 62 6a 2c 20 6d 61 63 29 20 21 3d   keyObj, mac) !=
6ae0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75   TCL_OK) {..retu
6af0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
6b00: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61    }..    /* Crea
6b10: 74 65 20 69 6e 73 74 61 6e 63 65 20 63 6f 6d 6d  te instance comm
6b20: 61 6e 64 20 2a 2f 0a 20 20 20 20 73 74 61 74 65  and */.    state
6b30: 50 74 72 2d 3e 74 6f 6b 65 6e 20 3d 20 54 63 6c  Ptr->token = Tcl
6b40: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
6b50: 64 28 69 6e 74 65 72 70 2c 20 63 6d 64 4e 61 6d  d(interp, cmdNam
6b60: 65 2c 20 44 69 67 65 73 74 49 6e 73 74 61 6e 63  e, DigestInstanc
6b70: 65 4f 62 6a 43 6d 64 2c 0a 09 28 43 6c 69 65 6e  eObjCmd,..(Clien
6b80: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2c  tData) statePtr,
6b90: 20 44 69 67 65 73 74 43 6f 6d 6d 61 6e 64 44 65   DigestCommandDe
6ba0: 6c 65 74 65 48 61 6e 64 6c 65 72 29 3b 0a 0a 20  leteHandler);.. 
6bb0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 6d     /* Return com
6bc0: 6d 61 6e 64 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  mand name */.   
6bd0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
6be0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 4f 62 6a  t(interp, cmdObj
6bf0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
6c00: 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a  L_OK;.}.../*****
6c10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6c20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6c30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6c40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
6c50: 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
6ca0: 44 69 67 65 73 74 44 61 74 61 48 61 6e 64 6c 65  DigestDataHandle
6cb0: 72 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 75 72  r --. *. *.Retur
6cc0: 6e 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74  n message digest
6cd0: 20 66 6f 72 20 64 61 74 61 20 75 73 69 6e 67 20   for data using 
6ce0: 75 73 65 72 20 73 70 65 63 69 66 69 65 64 20 68  user specified h
6cf0: 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a  ash function.. *
6d00: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09  . * Returns:. *.
6d10: 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52  TCL_OK or TCL_ER
6d20: 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ROR. *. * Side e
6d30: 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20  ffects:. *.Sets 
6d40: 72 65 73 75 6c 74 20 74 6f 20 6d 65 73 73 61 67  result to messag
6d50: 65 20 64 69 67 65 73 74 20 6f 72 20 65 72 72 6f  e digest or erro
6d60: 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d  r message. *. *-
6d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6db0: 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73  --. */.int Diges
6dc0: 74 44 61 74 61 48 61 6e 64 6c 65 72 28 54 63 6c  tDataHandler(Tcl
6dd0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
6de0: 20 54 63 6c 5f 4f 62 6a 20 2a 64 61 74 61 4f 62   Tcl_Obj *dataOb
6df0: 6a 2c 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20  j, const EVP_MD 
6e00: 2a 6d 64 2c 0a 09 63 6f 6e 73 74 20 45 56 50 5f  *md,..const EVP_
6e10: 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 2c 20  CIPHER *cipher, 
6e20: 69 6e 74 20 66 6f 72 6d 61 74 2c 20 54 63 6c 5f  int format, Tcl_
6e30: 4f 62 6a 20 2a 6b 65 79 4f 62 6a 2c 20 45 56 50  Obj *keyObj, EVP
6e40: 5f 4d 41 43 20 2a 6d 61 63 29 20 7b 0a 20 20 20  _MAC *mac) {.   
6e50: 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 20   char *data;.   
6e60: 20 69 6e 74 20 64 61 74 61 5f 6c 65 6e 3b 0a 20   int data_len;. 
6e70: 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a     DigestState *
6e80: 73 74 61 74 65 50 74 72 3b 0a 0a 20 20 20 20 64  statePtr;..    d
6e90: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
6ea0: 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 64 61  ;..    /* Get da
6eb0: 74 61 20 2a 2f 0a 20 20 20 20 64 61 74 61 20 3d  ta */.    data =
6ec0: 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61   Tcl_GetByteArra
6ed0: 79 46 72 6f 6d 4f 62 6a 28 64 61 74 61 4f 62 6a  yFromObj(dataObj
6ee0: 2c 20 26 64 61 74 61 5f 6c 65 6e 29 3b 0a 20 20  , &data_len);.  
6ef0: 20 20 69 66 20 28 64 61 74 61 20 3d 3d 20 4e 55    if (data == NU
6f00: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 53 65 74 52 65  LL) {..Tcl_SetRe
6f10: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 6f  sult(interp, "No
6f20: 20 64 61 74 61 22 2c 20 4e 55 4c 4c 29 3b 0a 09   data", NULL);..
6f30: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
6f40: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
6f50: 43 72 65 61 74 65 20 73 74 61 74 65 20 64 61 74  Create state dat
6f60: 61 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  a structure */. 
6f70: 20 20 20 69 66 20 28 28 73 74 61 74 65 50 74 72     if ((statePtr
6f80: 20 3d 20 44 69 67 65 73 74 53 74 61 74 65 4e 65   = DigestStateNe
6f90: 77 28 69 6e 74 65 72 70 2c 20 66 6f 72 6d 61 74  w(interp, format
6fa0: 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54  )) == NULL) {..T
6fb0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
6fc0: 69 6e 74 65 72 70 2c 20 22 4d 65 6d 6f 72 79 20  interp, "Memory 
6fd0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
6fe0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
6ff0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
7000: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
7010: 20 2f 2a 20 43 61 6c 63 20 44 69 67 65 73 74 2c   /* Calc Digest,
7020: 20 61 62 6f 72 74 20 66 6f 72 20 65 72 72 6f 72   abort for error
7030: 20 2a 2f 0a 20 20 20 20 69 66 20 28 44 69 67 65   */.    if (Dige
7040: 73 74 49 6e 69 74 69 61 6c 69 7a 65 28 69 6e 74  stInitialize(int
7050: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 6d  erp, statePtr, m
7060: 64 2c 20 63 69 70 68 65 72 2c 20 6b 65 79 4f 62  d, cipher, keyOb
7070: 6a 2c 20 6d 61 63 29 20 21 3d 20 54 43 4c 5f 4f  j, mac) != TCL_O
7080: 4b 20 7c 7c 0a 09 44 69 67 65 73 74 55 70 64 61  K ||..DigestUpda
7090: 74 65 28 73 74 61 74 65 50 74 72 2c 20 64 61 74  te(statePtr, dat
70a0: 61 2c 20 28 73 69 7a 65 5f 74 29 20 64 61 74 61  a, (size_t) data
70b0: 5f 6c 65 6e 2c 20 31 29 20 21 3d 20 54 43 4c 5f  _len, 1) != TCL_
70c0: 4f 4b 20 7c 7c 0a 09 44 69 67 65 73 74 46 69 6e  OK ||..DigestFin
70d0: 61 6c 69 7a 65 28 69 6e 74 65 72 70 2c 20 73 74  alize(interp, st
70e0: 61 74 65 50 74 72 2c 20 4e 55 4c 4c 29 20 21 3d  atePtr, NULL) !=
70f0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 44 69 67 65   TCL_OK) {..Dige
7100: 73 74 53 74 61 74 65 46 72 65 65 28 73 74 61 74  stStateFree(stat
7110: 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54  ePtr);..return T
7120: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
7130: 0a 20 20 20 20 2f 2a 20 43 6c 65 61 6e 2d 75 70  .    /* Clean-up
7140: 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 53 74   */.    DigestSt
7150: 61 74 65 46 72 65 65 28 73 74 61 74 65 50 74 72  ateFree(statePtr
7160: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
7170: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a  L_OK;.}../******
7180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
71a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
71b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
71c0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
71d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7200: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44  --------. *. * D
7210: 69 67 65 73 74 46 69 6c 65 48 61 6e 64 6c 65 72  igestFileHandler
7220: 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 75 72 6e   --. *. *.Return
7230: 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20   message digest 
7240: 66 6f 72 20 66 69 6c 65 20 75 73 69 6e 67 20 75  for file using u
7250: 73 65 72 20 73 70 65 63 69 66 69 65 64 20 68 61  ser specified ha
7260: 73 68 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 0a  sh function.. *.
7270: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54   * Returns:. *.T
7280: 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52  CL_OK or TCL_ERR
7290: 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  OR. *. * Side ef
72a0: 66 65 63 74 73 3a 0a 20 2a 09 52 65 73 75 6c 74  fects:. *.Result
72b0: 20 69 73 20 6d 65 73 73 61 67 65 20 64 69 67 65   is message dige
72c0: 73 74 20 6f 72 20 65 72 72 6f 72 20 6d 65 73 73  st or error mess
72d0: 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  age. *. *-------
72e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
72f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
7320: 0a 69 6e 74 20 44 69 67 65 73 74 46 69 6c 65 48  .int DigestFileH
7330: 61 6e 64 6c 65 72 28 54 63 6c 5f 49 6e 74 65 72  andler(Tcl_Inter
7340: 70 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f  p *interp, Tcl_O
7350: 62 6a 20 2a 69 6e 46 69 6c 65 4f 62 6a 2c 20 63  bj *inFileObj, c
7360: 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 2c  onst EVP_MD *md,
7370: 0a 09 63 6f 6e 73 74 20 45 56 50 5f 43 49 50 48  ..const EVP_CIPH
7380: 45 52 20 2a 63 69 70 68 65 72 2c 20 69 6e 74 20  ER *cipher, int 
7390: 66 6f 72 6d 61 74 2c 20 54 63 6c 5f 4f 62 6a 20  format, Tcl_Obj 
73a0: 2a 6b 65 79 4f 62 6a 2c 20 45 56 50 5f 4d 41 43  *keyObj, EVP_MAC
73b0: 20 2a 6d 61 63 29 20 7b 0a 20 20 20 20 44 69 67   *mac) {.    Dig
73c0: 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50  estState *stateP
73d0: 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  tr;.    Tcl_Chan
73e0: 6e 65 6c 20 63 68 61 6e 20 3d 20 4e 55 4c 4c 3b  nel chan = NULL;
73f0: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
7400: 61 72 20 62 75 66 5b 42 55 46 46 45 52 5f 53 49  ar buf[BUFFER_SI
7410: 5a 45 5d 3b 0a 20 20 20 20 69 6e 74 20 72 65 73  ZE];.    int res
7420: 20 3d 20 54 43 4c 5f 4f 4b 2c 20 6c 65 6e 3b 0a   = TCL_OK, len;.
7430: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
7440: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20  lled");..    /* 
7450: 43 72 65 61 74 65 20 73 74 61 74 65 20 64 61 74  Create state dat
7460: 61 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  a structure */. 
7470: 20 20 20 69 66 20 28 28 73 74 61 74 65 50 74 72     if ((statePtr
7480: 20 3d 20 44 69 67 65 73 74 53 74 61 74 65 4e 65   = DigestStateNe
7490: 77 28 69 6e 74 65 72 70 2c 20 66 6f 72 6d 61 74  w(interp, format
74a0: 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54  )) == NULL) {..T
74b0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
74c0: 69 6e 74 65 72 70 2c 20 22 4d 65 6d 6f 72 79 20  interp, "Memory 
74d0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
74e0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
74f0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
7500: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
7510: 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 63 68   /* Open file ch
7520: 61 6e 6e 65 6c 2c 20 61 62 6f 72 74 20 66 6f 72  annel, abort for
7530: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 63 68   error */.    ch
7540: 61 6e 20 3d 20 54 63 6c 5f 46 53 4f 70 65 6e 46  an = Tcl_FSOpenF
7550: 69 6c 65 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  ileChannel(inter
7560: 70 2c 20 69 6e 46 69 6c 65 4f 62 6a 2c 20 22 72  p, inFileObj, "r
7570: 62 22 2c 20 30 34 34 34 29 3b 0a 20 20 20 20 69  b", 0444);.    i
7580: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f  f (chan == (Tcl_
7590: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
75a0: 0a 09 44 69 67 65 73 74 53 74 61 74 65 46 72 65  ..DigestStateFre
75b0: 65 28 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65  e(statePtr);..re
75c0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
75d0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
75e0: 6e 66 69 67 75 72 65 20 63 68 61 6e 6e 65 6c 20  nfigure channel 
75f0: 2a 2f 0a 20 20 20 20 69 66 20 28 28 72 65 73 20  */.    if ((res 
7600: 3d 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c  = Tcl_SetChannel
7610: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63  Option(interp, c
7620: 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69  han, "-translati
7630: 6f 6e 22 2c 20 22 62 69 6e 61 72 79 22 29 29 20  on", "binary")) 
7640: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 67 6f  != TCL_OK) {..go
7650: 74 6f 20 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20  to done;.    }. 
7660: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65     Tcl_SetChanne
7670: 6c 42 75 66 66 65 72 53 69 7a 65 28 63 68 61 6e  lBufferSize(chan
7680: 2c 20 42 55 46 46 45 52 5f 53 49 5a 45 29 3b 0a  , BUFFER_SIZE);.
7690: 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  .    /* Initiali
76a0: 7a 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e  ze hash function
76b0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 72 65 73   */.    if ((res
76c0: 20 3d 20 44 69 67 65 73 74 49 6e 69 74 69 61 6c   = DigestInitial
76d0: 69 7a 65 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ize(interp, stat
76e0: 65 50 74 72 2c 20 6d 64 2c 20 63 69 70 68 65 72  ePtr, md, cipher
76f0: 2c 20 6b 65 79 4f 62 6a 2c 20 6d 61 63 29 29 20  , keyObj, mac)) 
7700: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 67 6f  != TCL_OK) {..go
7710: 74 6f 20 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 0a  to done;.    }..
7720: 20 20 20 20 2f 2a 20 52 65 61 64 20 66 69 6c 65      /* Read file
7730: 20 64 61 74 61 20 61 6e 64 20 75 70 64 61 74 65   data and update
7740: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a   hash function *
7750: 2f 0a 20 20 20 20 77 68 69 6c 65 20 28 21 54 63  /.    while (!Tc
7760: 6c 5f 45 6f 66 28 63 68 61 6e 29 29 20 7b 0a 09  l_Eof(chan)) {..
7770: 6c 65 6e 20 3d 20 54 63 6c 5f 52 65 61 64 52 61  len = Tcl_ReadRa
7780: 77 28 63 68 61 6e 2c 20 28 63 68 61 72 20 2a 29  w(chan, (char *)
7790: 20 62 75 66 2c 20 42 55 46 46 45 52 5f 53 49 5a   buf, BUFFER_SIZ
77a0: 45 29 3b 0a 09 69 66 20 28 6c 65 6e 20 3e 20 30  E);..if (len > 0
77b0: 29 20 7b 0a 09 20 20 20 20 69 66 20 28 44 69 67  ) {..    if (Dig
77c0: 65 73 74 55 70 64 61 74 65 28 73 74 61 74 65 50  estUpdate(stateP
77d0: 74 72 2c 20 26 62 75 66 5b 30 5d 2c 20 28 73 69  tr, &buf[0], (si
77e0: 7a 65 5f 74 29 20 6c 65 6e 2c 20 31 29 20 21 3d  ze_t) len, 1) !=
77f0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 73   TCL_OK) {...res
7800: 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09   = TCL_ERROR;...
7810: 67 6f 74 6f 20 64 6f 6e 65 3b 0a 09 20 20 20 20  goto done;..    
7820: 7d 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  }..}.    }..    
7830: 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 68 61 73 68  /* Finalize hash
7840: 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 63 61   function and ca
7850: 6c 63 75 6c 61 74 65 20 6d 65 73 73 61 67 65 20  lculate message 
7860: 64 69 67 65 73 74 20 2a 2f 0a 20 20 20 20 72 65  digest */.    re
7870: 73 20 3d 20 44 69 67 65 73 74 46 69 6e 61 6c 69  s = DigestFinali
7880: 7a 65 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  ze(interp, state
7890: 50 74 72 2c 20 4e 55 4c 4c 29 3b 0a 0a 64 6f 6e  Ptr, NULL);..don
78a0: 65 3a 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20  e:.    /* Close 
78b0: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69  channel */.    i
78c0: 66 20 28 54 63 6c 5f 43 6c 6f 73 65 28 69 6e 74  f (Tcl_Close(int
78d0: 65 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54 43  erp, chan) == TC
78e0: 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 72 65 73 20  L_ERROR) {..res 
78f0: 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  = TCL_ERROR;.   
7900: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 6e   }..    /* Clean
7910: 2d 75 70 20 2a 2f 0a 20 20 20 20 44 69 67 65 73  -up */.    Diges
7920: 74 53 74 61 74 65 46 72 65 65 28 73 74 61 74 65  tStateFree(state
7930: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Ptr);.    return
7940: 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a   res;.}../******
7950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
7990: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
79a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
79b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
79c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
79d0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 47  --------. *. * G
79e0: 65 74 44 69 67 65 73 74 20 2d 2d 20 47 65 74 20  etDigest -- Get 
79f0: 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 0a 20  message digest. 
7a00: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a  *. * Returns:. *
7a10: 09 45 56 50 5f 4d 44 20 2a 20 6f 72 20 4e 55 4c  .EVP_MD * or NUL
7a20: 4c 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  L. *. *---------
7a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 45  ----------. */.E
7a70: 56 50 5f 4d 44 20 2a 47 65 74 44 69 67 65 73 74  VP_MD *GetDigest
7a80: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
7a90: 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62  erp, Tcl_Obj *ob
7aa0: 6a 50 74 72 2c 20 69 6e 74 20 2a 66 6f 72 6d 61  jPtr, int *forma
7ab0: 74 29 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 45  t) {.    const E
7ac0: 56 50 5f 4d 44 20 2a 6d 64 20 3d 20 4e 55 4c 4c  VP_MD *md = NULL
7ad0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 64 69 67 65  ;.    char *dige
7ae0: 73 74 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74  stName = Tcl_Get
7af0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
7b00: 6a 50 74 72 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20  jPtr, NULL);..  
7b10: 20 20 69 66 20 28 64 69 67 65 73 74 4e 61 6d 65    if (digestName
7b20: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6d 64 20   != NULL) {..md 
7b30: 3d 20 45 56 50 5f 67 65 74 5f 64 69 67 65 73 74  = EVP_get_digest
7b40: 62 79 6e 61 6d 65 28 64 69 67 65 73 74 4e 61 6d  byname(digestNam
7b50: 65 29 3b 0a 09 69 66 20 28 6d 64 20 3d 3d 20 4e  e);..if (md == N
7b60: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  ULL) {..    Tcl_
7b70: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
7b80: 65 72 70 2c 20 22 49 6e 76 61 6c 69 64 20 64 69  erp, "Invalid di
7b90: 67 65 73 74 20 5c 22 22 2c 20 64 69 67 65 73 74  gest \"", digest
7ba0: 4e 61 6d 65 2c 20 22 5c 22 22 2c 20 4e 55 4c 4c  Name, "\"", NULL
7bb0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e  );..    return N
7bc0: 55 4c 4c 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20  ULL;..} else if 
7bd0: 28 6d 64 20 3d 3d 20 45 56 50 5f 73 68 61 6b 65  (md == EVP_shake
7be0: 31 32 38 28 29 20 7c 7c 20 6d 64 20 3d 3d 20 45  128() || md == E
7bf0: 56 50 5f 73 68 61 6b 65 32 35 36 28 29 29 20 7b  VP_shake256()) {
7c00: 0a 09 20 20 20 20 2a 66 6f 72 6d 61 74 20 7c 3d  ..    *format |=
7c10: 20 49 53 5f 58 4f 46 3b 0a 09 7d 0a 20 20 20 20   IS_XOF;..}.    
7c20: 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 41 70  } else {..Tcl_Ap
7c30: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
7c40: 70 2c 20 22 4e 6f 20 64 69 67 65 73 74 20 73 70  p, "No digest sp
7c50: 65 63 69 66 69 65 64 22 2c 20 4e 55 4c 4c 29 3b  ecified", NULL);
7c60: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
7c70: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
7c80: 6d 64 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  md;.}../*. *----
7c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
7cd0: 20 2a 0a 20 2a 20 47 65 74 43 69 70 68 65 72 20   *. * GetCipher 
7ce0: 2d 2d 20 47 65 74 20 63 69 70 68 65 72 0a 20 2a  -- Get cipher. *
7cf0: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09  . * Returns:. *.
7d00: 45 56 50 5f 43 49 50 48 45 52 20 2a 20 6f 72 20  EVP_CIPHER * or 
7d10: 4e 55 4c 4c 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  NULL. *. *------
7d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
7d60: 2f 0a 45 56 50 5f 43 49 50 48 45 52 20 2a 47 65  /.EVP_CIPHER *Ge
7d70: 74 43 69 70 68 65 72 28 54 63 6c 5f 49 6e 74 65  tCipher(Tcl_Inte
7d80: 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f  rp *interp, Tcl_
7d90: 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c 20 69 6e 74  Obj *objPtr, int
7da0: 20 2a 74 79 70 65 29 20 7b 0a 20 20 20 20 63 6f   *type) {.    co
7db0: 6e 73 74 20 45 56 50 5f 43 49 50 48 45 52 20 2a  nst EVP_CIPHER *
7dc0: 63 69 70 68 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20  cipher = NULL;. 
7dd0: 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 4e     char *cipherN
7de0: 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
7df0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 50 74  ingFromObj(objPt
7e00: 72 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69  r, NULL);..    i
7e10: 66 20 28 63 69 70 68 65 72 4e 61 6d 65 20 21 3d  f (cipherName !=
7e20: 20 4e 55 4c 4c 29 20 7b 0a 09 63 69 70 68 65 72   NULL) {..cipher
7e30: 20 3d 20 45 56 50 5f 67 65 74 5f 63 69 70 68 65   = EVP_get_ciphe
7e40: 72 62 79 6e 61 6d 65 28 63 69 70 68 65 72 4e 61  rbyname(cipherNa
7e50: 6d 65 29 3b 0a 09 2a 74 79 70 65 20 3d 20 54 59  me);..*type = TY
7e60: 50 45 5f 43 4d 41 43 3b 0a 09 69 66 20 28 63 69  PE_CMAC;..if (ci
7e70: 70 68 65 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  pher == NULL) {.
7e80: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
7e90: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 49  esult(interp, "I
7ea0: 6e 76 61 6c 69 64 20 63 69 70 68 65 72 20 5c 22  nvalid cipher \"
7eb0: 22 2c 20 63 69 70 68 65 72 4e 61 6d 65 2c 20 22  ", cipherName, "
7ec0: 5c 22 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  \"", NULL);..   
7ed0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d   return NULL;..}
7ee0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54  .    } else {..T
7ef0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
7f00: 69 6e 74 65 72 70 2c 20 22 4e 6f 20 63 69 70 68  interp, "No ciph
7f10: 65 72 20 73 70 65 63 69 66 69 65 64 22 2c 20 4e  er specified", N
7f20: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55  ULL);..return NU
7f30: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  LL;.    }.    re
7f40: 74 75 72 6e 20 63 69 70 68 65 72 3b 0a 7d 0a 0a  turn cipher;.}..
7f50: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
7f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7f90: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 47  --------. *. * G
7fa0: 65 74 4b 65 79 20 2d 2d 20 47 65 74 20 6b 65 79  etKey -- Get key
7fb0: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a  . *. * Returns:.
7fc0: 20 2a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72   *.unsigned char
7fd0: 20 2a 20 6f 72 20 4e 55 4c 4c 0a 20 2a 0a 20 2a   * or NULL. *. *
7fe0: 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 75 6e 73 69 67 6e 65 64  ---. */.unsigned
8030: 20 63 68 61 72 20 2a 47 65 74 4b 65 79 28 54 63   char *GetKey(Tc
8040: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
8050: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74  , Tcl_Obj *objPt
8060: 72 2c 20 69 6e 74 20 2a 74 79 70 65 29 20 7b 0a  r, int *type) {.
8070: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
8080: 72 20 2a 6b 65 79 20 3d 20 54 63 6c 5f 47 65 74  r *key = Tcl_Get
8090: 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
80a0: 28 6f 62 6a 50 74 72 2c 20 4e 55 4c 4c 29 3b 0a  (objPtr, NULL);.
80b0: 0a 20 20 20 20 69 66 20 28 6b 65 79 20 3d 3d 20  .    if (key == 
80c0: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70  NULL) {..Tcl_App
80d0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
80e0: 2c 20 22 4e 6f 20 6b 65 79 20 73 70 65 63 69 66  , "No key specif
80f0: 69 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65  ied", NULL);..re
8100: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
8110: 0a 20 20 20 20 69 66 20 28 2a 74 79 70 65 20 3d  .    if (*type =
8120: 3d 20 54 59 50 45 5f 4d 44 29 20 7b 0a 09 2a 74  = TYPE_MD) {..*t
8130: 79 70 65 20 3d 20 54 59 50 45 5f 48 4d 41 43 3b  ype = TYPE_HMAC;
8140: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
8150: 6e 20 6b 65 79 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d  n key;.}../*. *-
8160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
81a0: 2d 2d 0a 20 2a 0a 20 2a 20 47 65 74 4d 41 43 20  --. *. * GetMAC 
81b0: 2d 2d 20 47 65 74 20 4d 41 43 0a 20 2a 0a 20 2a  -- Get MAC. *. *
81c0: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 45 56 50   Returns:. *.EVP
81d0: 5f 4d 41 43 20 2a 20 6f 72 20 4e 55 4c 4c 0a 20  _MAC * or NULL. 
81e0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
81f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8220: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 45 56 50 5f  -------. */.EVP_
8230: 4d 41 43 20 2a 47 65 74 4d 41 43 28 54 63 6c 5f  MAC *GetMAC(Tcl_
8240: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
8250: 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c  Tcl_Obj *objPtr,
8260: 20 69 6e 74 20 2a 74 79 70 65 29 20 7b 0a 20 20   int *type) {.  
8270: 20 20 45 56 50 5f 4d 41 43 20 2a 6d 61 63 20 3d    EVP_MAC *mac =
8280: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20   NULL;.    char 
8290: 2a 6d 61 63 4e 61 6d 65 20 3d 20 54 63 6c 5f 47  *macName = Tcl_G
82a0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
82b0: 6f 62 6a 50 74 72 2c 20 4e 55 4c 4c 29 3b 0a 0a  objPtr, NULL);..
82c0: 20 20 20 20 69 66 20 28 6d 61 63 4e 61 6d 65 20      if (macName 
82d0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28  != NULL) {..if (
82e0: 73 74 72 63 6d 70 28 6d 61 63 4e 61 6d 65 2c 20  strcmp(macName, 
82f0: 22 63 6d 61 63 22 29 20 3d 3d 20 30 29 20 7b 0a  "cmac") == 0) {.
8300: 09 20 20 20 20 2a 74 79 70 65 20 3d 20 54 59 50  .    *type = TYP
8310: 45 5f 43 4d 41 43 3b 0a 09 7d 20 65 6c 73 65 20  E_CMAC;..} else 
8320: 69 66 20 28 73 74 72 63 6d 70 28 6d 61 63 4e 61  if (strcmp(macNa
8330: 6d 65 2c 20 22 68 6d 61 63 22 29 20 3d 3d 20 30  me, "hmac") == 0
8340: 29 20 7b 0a 09 20 20 20 20 2a 74 79 70 65 20 3d  ) {..    *type =
8350: 20 54 59 50 45 5f 48 4d 41 43 3b 0a 09 7d 20 65   TYPE_HMAC;..} e
8360: 6c 73 65 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41  lse {..    Tcl_A
8370: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
8380: 72 70 2c 20 22 49 6e 76 61 6c 69 64 20 4d 41 43  rp, "Invalid MAC
8390: 20 5c 22 22 2c 20 6d 61 63 4e 61 6d 65 2c 20 22   \"", macName, "
83a0: 5c 22 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  \"", NULL);..   
83b0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d   return NULL;..}
83c0: 0a 09 6d 61 63 20 3d 20 28 76 6f 69 64 20 2a 29  ..mac = (void *)
83d0: 20 6d 61 63 4e 61 6d 65 3b 0a 20 20 20 20 7d 20   macName;.    } 
83e0: 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 41 70 70 65  else {..Tcl_Appe
83f0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
8400: 20 22 4e 6f 20 4d 41 43 20 73 70 65 63 69 66 69   "No MAC specifi
8410: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  ed", NULL);..ret
8420: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  urn NULL;.    }.
8430: 20 20 20 20 72 65 74 75 72 6e 20 6d 61 63 3b 0a      return mac;.
8440: 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../************
8450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8480: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d  *******/../*. *-
8490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
84a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
84b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
84c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
84d0: 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 4d  --. *. * DigestM
84e0: 61 69 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74  ain --. *. *.Ret
84f0: 75 72 6e 20 6d 65 73 73 61 67 65 20 64 69 67 65  urn message dige
8500: 73 74 20 6f 72 20 4d 65 73 73 61 67 65 20 41 75  st or Message Au
8510: 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 43 6f 64  thentication Cod
8520: 65 20 28 4d 41 43 29 20 6f 66 0a 20 2a 09 64 61  e (MAC) of. *.da
8530: 74 61 20 75 73 69 6e 67 20 75 73 65 72 20 73 70  ta using user sp
8540: 65 63 69 66 69 65 64 20 68 61 73 68 20 66 75 6e  ecified hash fun
8550: 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74  ction.. *. * Ret
8560: 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20  urns:. *.TCL_OK 
8570: 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a  or TCL_ERROR. *.
8580: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
8590: 0a 20 2a 09 53 65 74 73 20 72 65 73 75 6c 74 20  . *.Sets result 
85a0: 74 6f 20 6d 65 73 73 61 67 65 20 64 69 67 65 73  to message diges
85b0: 74 20 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61  t or error messa
85c0: 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  ge. *. *--------
85d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
85e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
85f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
8610: 73 74 61 74 69 63 20 69 6e 74 20 44 69 67 65 73  static int Diges
8620: 74 4d 61 69 6e 28 69 6e 74 20 74 79 70 65 2c 20  tMain(int type, 
8630: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
8640: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
8650: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
8660: 76 5b 5d 29 20 7b 0a 20 20 20 20 69 6e 74 20 69  v[]) {.    int i
8670: 64 78 2c 20 73 74 61 72 74 20 3d 20 31 2c 20 66  dx, start = 1, f
8680: 6f 72 6d 61 74 20 3d 20 48 45 58 5f 46 4f 52 4d  ormat = HEX_FORM
8690: 41 54 2c 20 72 65 73 20 3d 20 54 43 4c 5f 4f 4b  AT, res = TCL_OK
86a0: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63  ;.    Tcl_Obj *c
86b0: 69 70 68 65 72 4f 62 6a 20 3d 20 4e 55 4c 4c 2c  ipherObj = NULL,
86c0: 20 2a 63 6d 64 4f 62 6a 20 3d 20 4e 55 4c 4c 2c   *cmdObj = NULL,
86d0: 20 2a 64 61 74 61 4f 62 6a 20 3d 20 4e 55 4c 4c   *dataObj = NULL
86e0: 2c 20 2a 64 69 67 65 73 74 4f 62 6a 20 3d 20 4e  , *digestObj = N
86f0: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  ULL;.    Tcl_Obj
8700: 20 2a 66 69 6c 65 4f 62 6a 20 3d 20 4e 55 4c 4c   *fileObj = NULL
8710: 2c 20 2a 6b 65 79 4f 62 6a 20 3d 20 4e 55 4c 4c  , *keyObj = NULL
8720: 2c 20 2a 6d 61 63 4f 62 6a 20 3d 20 4e 55 4c 4c  , *macObj = NULL
8730: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
8740: 20 2a 63 68 61 6e 6e 65 6c 20 3d 20 4e 55 4c 4c   *channel = NULL
8750: 2c 20 2a 6f 70 74 3b 0a 20 20 20 20 63 6f 6e 73  , *opt;.    cons
8760: 74 20 45 56 50 5f 4d 44 20 2a 6d 64 20 3d 20 4e  t EVP_MD *md = N
8770: 55 4c 4c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45  ULL;.    const E
8780: 56 50 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65  VP_CIPHER *ciphe
8790: 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 45 56  r = NULL;.    EV
87a0: 50 5f 4d 41 43 20 2a 6d 61 63 20 3d 20 4e 55 4c  P_MAC *mac = NUL
87b0: 4c 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  L;..    dprintf(
87c0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
87d0: 2f 2a 20 43 6c 65 61 72 20 69 6e 74 65 72 70 20  /* Clear interp 
87e0: 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 54 63  result */.    Tc
87f0: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
8800: 74 65 72 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 56  terp);..    /* V
8810: 61 6c 69 64 61 74 65 20 61 72 67 20 63 6f 75 6e  alidate arg coun
8820: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a  t */.    if (obj
8830: 63 20 3c 20 33 20 7c 7c 20 6f 62 6a 63 20 3e 20  c < 3 || objc > 
8840: 31 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67  12) {..Tcl_Wrong
8850: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
8860: 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 62 69 6e 7c  1, objv, "?-bin|
8870: 2d 68 65 78 3f 20 3f 2d 63 69 70 68 65 72 20 6e  -hex? ?-cipher n
8880: 61 6d 65 3f 20 3f 2d 64 69 67 65 73 74 20 6e 61  ame? ?-digest na
8890: 6d 65 3f 20 3f 2d 6b 65 79 20 6b 65 79 3f 20 3f  me? ?-key key? ?
88a0: 2d 6d 61 63 20 6e 61 6d 65 3f 20 5b 2d 63 68 61  -mac name? [-cha
88b0: 6e 6e 65 6c 20 63 68 61 6e 20 7c 20 2d 63 6f 6d  nnel chan | -com
88c0: 6d 61 6e 64 20 63 6d 64 4e 61 6d 65 20 7c 20 2d  mand cmdName | -
88d0: 66 69 6c 65 20 66 69 6c 65 6e 61 6d 65 20 7c 20  file filename | 
88e0: 3f 2d 64 61 74 61 3f 20 64 61 74 61 5d 22 29 3b  ?-data? data]");
88f0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
8900: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
8910: 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 20 6f  * Special case o
8920: 66 20 66 69 72 73 74 20 61 72 67 20 69 73 20 64  f first arg is d
8930: 69 67 65 73 74 2c 20 63 69 70 68 65 72 2c 20 6f  igest, cipher, o
8940: 72 20 6d 61 63 20 2a 2f 0a 20 20 20 20 6f 70 74  r mac */.    opt
8950: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
8960: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 73 74 61  FromObj(objv[sta
8970: 72 74 5d 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  rt], NULL);.    
8980: 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d  if (opt[0] != '-
8990: 27 29 20 7b 0a 09 69 66 20 28 74 79 70 65 20 3d  ') {..if (type =
89a0: 3d 20 54 59 50 45 5f 4d 44 20 7c 7c 20 74 79 70  = TYPE_MD || typ
89b0: 65 20 3d 3d 20 54 59 50 45 5f 48 4d 41 43 29 20  e == TYPE_HMAC) 
89c0: 7b 0a 09 20 20 20 20 64 69 67 65 73 74 4f 62 6a  {..    digestObj
89d0: 20 3d 20 6f 62 6a 76 5b 73 74 61 72 74 5d 3b 0a   = objv[start];.
89e0: 09 20 20 20 20 73 74 61 72 74 2b 2b 3b 0a 09 7d  .    start++;..}
89f0: 20 65 6c 73 65 20 69 66 20 28 74 79 70 65 20 3d   else if (type =
8a00: 3d 20 54 59 50 45 5f 43 4d 41 43 29 20 7b 0a 09  = TYPE_CMAC) {..
8a10: 20 20 20 20 63 69 70 68 65 72 4f 62 6a 20 3d 20      cipherObj = 
8a20: 6f 62 6a 76 5b 73 74 61 72 74 5d 3b 0a 09 20 20  objv[start];..  
8a30: 20 20 73 74 61 72 74 2b 2b 3b 0a 09 7d 20 65 6c    start++;..} el
8a40: 73 65 20 69 66 20 28 74 79 70 65 20 3d 3d 20 54  se if (type == T
8a50: 59 50 45 5f 4d 41 43 29 20 7b 0a 09 20 20 20 20  YPE_MAC) {..    
8a60: 6d 61 63 4f 62 6a 20 3d 20 6f 62 6a 76 5b 73 74  macObj = objv[st
8a70: 61 72 74 5d 3b 0a 09 20 20 20 20 73 74 61 72 74  art];..    start
8a80: 2b 2b 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  ++;..}.    }..  
8a90: 20 20 2f 2a 20 47 65 74 20 6f 70 74 69 6f 6e 73    /* Get options
8aa0: 20 2a 2f 0a 20 20 20 20 66 6f 72 20 28 69 64 78   */.    for (idx
8ab0: 20 3d 20 73 74 61 72 74 3b 20 69 64 78 20 3c 20   = start; idx < 
8ac0: 6f 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  objc; idx++) {..
8ad0: 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  opt = Tcl_GetStr
8ae0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
8af0: 69 64 78 5d 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69  idx], NULL);...i
8b00: 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d 27  f (opt[0] != '-'
8b10: 29 20 7b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  ) {..    break;.
8b20: 09 7d 0a 0a 09 4f 50 54 46 4c 41 47 28 22 2d 62  .}...OPTFLAG("-b
8b30: 69 6e 22 2c 20 66 6f 72 6d 61 74 2c 20 42 49 4e  in", format, BIN
8b40: 5f 46 4f 52 4d 41 54 29 3b 0a 09 4f 50 54 46 4c  _FORMAT);..OPTFL
8b50: 41 47 28 22 2d 62 69 6e 61 72 79 22 2c 20 66 6f  AG("-binary", fo
8b60: 72 6d 61 74 2c 20 42 49 4e 5f 46 4f 52 4d 41 54  rmat, BIN_FORMAT
8b70: 29 3b 0a 09 4f 50 54 46 4c 41 47 28 22 2d 68 65  );..OPTFLAG("-he
8b80: 78 22 2c 20 66 6f 72 6d 61 74 2c 20 48 45 58 5f  x", format, HEX_
8b90: 46 4f 52 4d 41 54 29 3b 0a 09 4f 50 54 46 4c 41  FORMAT);..OPTFLA
8ba0: 47 28 22 2d 68 65 78 61 64 65 63 69 6d 61 6c 22  G("-hexadecimal"
8bb0: 2c 20 66 6f 72 6d 61 74 2c 20 48 45 58 5f 46 4f  , format, HEX_FO
8bc0: 52 4d 41 54 29 3b 0a 09 4f 50 54 53 54 52 28 22  RMAT);..OPTSTR("
8bd0: 2d 63 68 61 6e 22 2c 20 63 68 61 6e 6e 65 6c 29  -chan", channel)
8be0: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 68 61 6e  ;..OPTSTR("-chan
8bf0: 6e 65 6c 22 2c 20 63 68 61 6e 6e 65 6c 29 3b 0a  nel", channel);.
8c00: 09 4f 50 54 4f 42 4a 28 22 2d 63 69 70 68 65 72  .OPTOBJ("-cipher
8c10: 22 2c 20 63 69 70 68 65 72 4f 62 6a 29 3b 0a 09  ", cipherObj);..
8c20: 4f 50 54 4f 42 4a 28 22 2d 63 6f 6d 6d 61 6e 64  OPTOBJ("-command
8c30: 22 2c 20 63 6d 64 4f 62 6a 29 3b 0a 09 4f 50 54  ", cmdObj);..OPT
8c40: 4f 42 4a 28 22 2d 64 61 74 61 22 2c 20 64 61 74  OBJ("-data", dat
8c50: 61 4f 62 6a 29 3b 0a 09 4f 50 54 4f 42 4a 28 22  aObj);..OPTOBJ("
8c60: 2d 64 69 67 65 73 74 22 2c 20 64 69 67 65 73 74  -digest", digest
8c70: 4f 62 6a 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d  Obj);..OPTOBJ("-
8c80: 66 69 6c 65 22 2c 20 66 69 6c 65 4f 62 6a 29 3b  file", fileObj);
8c90: 0a 09 4f 50 54 4f 42 4a 28 22 2d 66 69 6c 65 6e  ..OPTOBJ("-filen
8ca0: 61 6d 65 22 2c 20 66 69 6c 65 4f 62 6a 29 3b 0a  ame", fileObj);.
8cb0: 09 4f 50 54 4f 42 4a 28 22 2d 6b 65 79 22 2c 20  .OPTOBJ("-key", 
8cc0: 6b 65 79 4f 62 6a 29 3b 0a 09 4f 50 54 4f 42 4a  keyObj);..OPTOBJ
8cd0: 28 22 2d 6d 61 63 22 2c 20 6d 61 63 4f 62 6a 29  ("-mac", macObj)
8ce0: 3b 0a 0a 09 4f 50 54 42 41 44 28 22 6f 70 74 69  ;...OPTBAD("opti
8cf0: 6f 6e 22 2c 20 22 2d 62 69 6e 2c 20 2d 63 68 61  on", "-bin, -cha
8d00: 6e 6e 65 6c 2c 20 2d 63 69 70 68 65 72 2c 20 2d  nnel, -cipher, -
8d10: 63 6f 6d 6d 61 6e 64 2c 20 2d 64 61 74 61 2c 20  command, -data, 
8d20: 2d 64 69 67 65 73 74 2c 20 2d 66 69 6c 65 2c 20  -digest, -file, 
8d30: 2d 66 69 6c 65 6e 61 6d 65 2c 20 2d 68 65 78 2c  -filename, -hex,
8d40: 20 2d 6b 65 79 2c 20 6f 72 20 2d 6d 61 63 22 29   -key, or -mac")
8d50: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
8d60: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
8d70: 2f 2a 20 49 66 20 6f 6e 6c 79 20 31 20 61 72 67  /* If only 1 arg
8d80: 20 6c 65 66 74 2c 20 69 74 27 73 20 74 68 65 20   left, it's the 
8d90: 64 61 74 61 20 2a 2f 0a 20 20 20 20 69 66 20 28  data */.    if (
8da0: 69 64 78 20 3c 20 6f 62 6a 63 20 26 26 20 64 61  idx < objc && da
8db0: 74 61 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b  taObj == NULL) {
8dc0: 0a 09 64 61 74 61 4f 62 6a 20 3d 20 6f 62 6a 76  ..dataObj = objv
8dd0: 5b 69 64 78 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20  [idx];.    }..  
8de0: 20 20 2f 2a 20 47 65 74 20 63 69 70 68 65 72 20    /* Get cipher 
8df0: 2a 2f 0a 20 20 20 20 69 66 20 28 63 69 70 68 65  */.    if (ciphe
8e00: 72 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  rObj != NULL) {.
8e10: 09 69 66 20 28 28 63 69 70 68 65 72 20 3d 20 47  .if ((cipher = G
8e20: 65 74 43 69 70 68 65 72 28 69 6e 74 65 72 70 2c  etCipher(interp,
8e30: 20 63 69 70 68 65 72 4f 62 6a 2c 20 26 74 79 70   cipherObj, &typ
8e40: 65 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  e)) == NULL) {..
8e50: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
8e60: 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 20 65  RROR;..}.    } e
8e70: 6c 73 65 20 69 66 20 28 74 79 70 65 20 3d 3d 20  lse if (type == 
8e80: 54 59 50 45 5f 43 4d 41 43 29 20 7b 0a 09 54 63  TYPE_CMAC) {..Tc
8e90: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
8ea0: 6e 74 65 72 70 2c 20 22 4e 6f 20 63 69 70 68 65  nterp, "No ciphe
8eb0: 72 20 73 70 65 63 69 66 69 65 64 22 2c 20 4e 55  r specified", NU
8ec0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
8ed0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
8ee0: 20 20 20 2f 2a 20 47 65 74 20 6d 65 73 73 61 67     /* Get messag
8ef0: 65 20 64 69 67 65 73 74 20 2a 2f 0a 20 20 20 20  e digest */.    
8f00: 69 66 20 28 64 69 67 65 73 74 4f 62 6a 20 21 3d  if (digestObj !=
8f10: 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 28 6d   NULL) {..if ((m
8f20: 64 20 3d 20 47 65 74 44 69 67 65 73 74 28 69 6e  d = GetDigest(in
8f30: 74 65 72 70 2c 20 64 69 67 65 73 74 4f 62 6a 2c  terp, digestObj,
8f40: 20 26 66 6f 72 6d 61 74 29 29 20 3d 3d 20 4e 55   &format)) == NU
8f50: 4c 4c 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72  LL) {..    retur
8f60: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
8f70: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 74      } else if (t
8f80: 79 70 65 20 3d 3d 20 54 59 50 45 5f 4d 44 20 7c  ype == TYPE_MD |
8f90: 7c 20 74 79 70 65 20 3d 3d 20 54 59 50 45 5f 48  | type == TYPE_H
8fa0: 4d 41 43 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  MAC) {..Tcl_Appe
8fb0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
8fc0: 20 22 4e 6f 20 64 69 67 65 73 74 20 73 70 65 63   "No digest spec
8fd0: 69 66 69 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09  ified", NULL);..
8fe0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8ff0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
9000: 47 65 74 20 6b 65 79 20 2a 2f 0a 20 20 20 20 69  Get key */.    i
9010: 66 20 28 6b 65 79 4f 62 6a 20 21 3d 20 4e 55 4c  f (keyObj != NUL
9020: 4c 29 20 7b 0a 09 69 66 20 28 47 65 74 4b 65 79  L) {..if (GetKey
9030: 28 69 6e 74 65 72 70 2c 20 6b 65 79 4f 62 6a 2c  (interp, keyObj,
9040: 20 26 74 79 70 65 29 20 3d 3d 20 4e 55 4c 4c 29   &type) == NULL)
9050: 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54   {..    return T
9060: 43 4c 5f 45 52 52 4f 52 3b 09 0a 09 7d 0a 20 20  CL_ERROR;...}.  
9070: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 74 79 70    } else if (typ
9080: 65 20 21 3d 20 54 59 50 45 5f 4d 44 29 20 7b 0a  e != TYPE_MD) {.
9090: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
90a0: 74 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20 6b 65  t(interp, "No ke
90b0: 79 20 73 70 65 63 69 66 69 65 64 22 2c 20 4e 55  y specified", NU
90c0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
90d0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
90e0: 20 20 20 2f 2a 20 47 65 74 20 4d 41 43 20 2a 2f     /* Get MAC */
90f0: 0a 20 20 20 20 69 66 20 28 6d 61 63 4f 62 6a 20  .    if (macObj 
9100: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28  != NULL) {..if (
9110: 28 6d 61 63 20 3d 20 47 65 74 4d 41 43 28 69 6e  (mac = GetMAC(in
9120: 74 65 72 70 2c 20 6d 61 63 4f 62 6a 2c 20 26 74  terp, macObj, &t
9130: 79 70 65 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b  ype)) == NULL) {
9140: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
9150: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d  _ERROR;..}.    }
9160: 20 65 6c 73 65 20 69 66 20 28 74 79 70 65 20 3d   else if (type =
9170: 3d 20 54 59 50 45 5f 4d 41 43 29 20 7b 0a 09 54  = TYPE_MAC) {..T
9180: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
9190: 69 6e 74 65 72 70 2c 20 22 4e 6f 20 4d 41 43 20  interp, "No MAC 
91a0: 73 70 65 63 69 66 69 65 64 22 2c 20 4e 55 4c 4c  specified", NULL
91b0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
91c0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
91d0: 20 2f 2a 20 43 61 6c 63 20 64 69 67 65 73 74 20   /* Calc digest 
91e0: 6f 6e 20 66 69 6c 65 2c 20 73 74 61 63 6b 65 64  on file, stacked
91f0: 20 63 68 61 6e 6e 65 6c 2c 20 75 73 69 6e 67 20   channel, using 
9200: 69 6e 73 74 61 6e 63 65 20 63 6f 6d 6d 61 6e 64  instance command
9210: 2c 20 6f 72 20 64 61 74 61 20 62 6c 6f 62 20 2a  , or data blob *
9220: 2f 0a 20 20 20 20 69 66 20 28 66 69 6c 65 4f 62  /.    if (fileOb
9230: 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  j != NULL) {..re
9240: 73 20 3d 20 44 69 67 65 73 74 46 69 6c 65 48 61  s = DigestFileHa
9250: 6e 64 6c 65 72 28 69 6e 74 65 72 70 2c 20 66 69  ndler(interp, fi
9260: 6c 65 4f 62 6a 2c 20 6d 64 2c 20 63 69 70 68 65  leObj, md, ciphe
9270: 72 2c 20 66 6f 72 6d 61 74 20 7c 20 74 79 70 65  r, format | type
9280: 2c 20 6b 65 79 4f 62 6a 2c 20 6d 61 63 29 3b 0a  , keyObj, mac);.
9290: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63      } else if (c
92a0: 68 61 6e 6e 65 6c 20 21 3d 20 4e 55 4c 4c 29 20  hannel != NULL) 
92b0: 7b 0a 09 72 65 73 20 3d 20 44 69 67 65 73 74 43  {..res = DigestC
92c0: 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 28 69 6e  hannelHandler(in
92d0: 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c 2c 20 6d  terp, channel, m
92e0: 64 2c 20 63 69 70 68 65 72 2c 20 66 6f 72 6d 61  d, cipher, forma
92f0: 74 20 7c 20 74 79 70 65 2c 20 6b 65 79 4f 62 6a  t | type, keyObj
9300: 2c 20 6d 61 63 29 3b 0a 20 20 20 20 7d 20 65 6c  , mac);.    } el
9310: 73 65 20 69 66 20 28 63 6d 64 4f 62 6a 20 21 3d  se if (cmdObj !=
9320: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 20 3d 20   NULL) {..res = 
9330: 44 69 67 65 73 74 43 6f 6d 6d 61 6e 64 48 61 6e  DigestCommandHan
9340: 64 6c 65 72 28 69 6e 74 65 72 70 2c 20 63 6d 64  dler(interp, cmd
9350: 4f 62 6a 2c 20 6d 64 2c 20 63 69 70 68 65 72 2c  Obj, md, cipher,
9360: 20 66 6f 72 6d 61 74 20 7c 20 74 79 70 65 2c 20   format | type, 
9370: 6b 65 79 4f 62 6a 2c 20 6d 61 63 29 3b 0a 20 20  keyObj, mac);.  
9380: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 64 61 74    } else if (dat
9390: 61 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  aObj != NULL) {.
93a0: 09 72 65 73 20 3d 20 44 69 67 65 73 74 44 61 74  .res = DigestDat
93b0: 61 48 61 6e 64 6c 65 72 28 69 6e 74 65 72 70 2c  aHandler(interp,
93c0: 20 64 61 74 61 4f 62 6a 2c 20 6d 64 2c 20 63 69   dataObj, md, ci
93d0: 70 68 65 72 2c 20 66 6f 72 6d 61 74 20 7c 20 74  pher, format | t
93e0: 79 70 65 2c 20 6b 65 79 4f 62 6a 2c 20 6d 61 63  ype, keyObj, mac
93f0: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
9400: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
9410: 74 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20 6f 70  t(interp, "No op
9420: 65 72 61 74 69 6f 6e 20 73 70 65 63 69 66 69 65  eration specifie
9430: 64 3a 20 55 73 65 20 2d 63 68 61 6e 6e 65 6c 2c  d: Use -channel,
9440: 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 61 74 61   -command, -data
9450: 2c 20 6f 72 20 2d 66 69 6c 65 20 6f 70 74 69 6f  , or -file optio
9460: 6e 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 73 20  n", NULL);..res 
9470: 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  = TCL_ERROR;.   
9480: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65   }.    return re
9490: 73 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  s;.}../*. *-----
94a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
94b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
94c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
94d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
94e0: 2a 0a 20 2a 20 4d 65 73 73 61 67 65 20 44 69 67  *. * Message Dig
94f0: 65 73 74 20 61 6e 64 20 4d 65 73 73 61 67 65 20  est and Message 
9500: 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 43  Authentication C
9510: 6f 64 65 20 43 6f 6d 6d 61 6e 64 73 20 2d 2d 0a  ode Commands --.
9520: 20 2a 0a 20 2a 09 52 65 74 75 72 6e 20 4d 65 73   *. *.Return Mes
9530: 73 61 67 65 20 44 69 67 65 73 74 20 28 4d 44 29  sage Digest (MD)
9540: 20 6f 72 20 4d 65 73 73 61 67 65 20 41 75 74 68   or Message Auth
9550: 65 6e 74 69 63 61 74 69 6f 6e 20 43 6f 64 65 20  entication Code 
9560: 28 4d 41 43 29 2e 0a 20 2a 0a 20 2a 20 52 65 74  (MAC).. *. * Ret
9570: 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20  urns:. *.TCL_OK 
9580: 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a  or TCL_ERROR. *.
9590: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
95a0: 0a 20 2a 09 53 65 74 73 20 72 65 73 75 6c 74 20  . *.Sets result 
95b0: 74 6f 20 6d 65 73 73 61 67 65 20 64 69 67 65 73  to message diges
95c0: 74 20 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61  t or error messa
95d0: 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  ge. *. *--------
95e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
95f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
9620: 73 74 61 74 69 63 20 69 6e 74 20 4d 64 4f 62 6a  static int MdObj
9630: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63  Cmd(ClientData c
9640: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
9650: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
9660: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
9670: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20   *const objv[]) 
9680: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 44 69 67  {.    return Dig
9690: 65 73 74 4d 61 69 6e 28 54 59 50 45 5f 4d 44 2c  estMain(TYPE_MD,
96a0: 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f   interp, objc, o
96b0: 62 6a 76 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  bjv);.}..static 
96c0: 69 6e 74 20 43 4d 41 43 4f 62 6a 43 6d 64 28 43  int CMACObjCmd(C
96d0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
96e0: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
96f0: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
9700: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  jc, Tcl_Obj *con
9710: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20  st objv[]) {.   
9720: 20 72 65 74 75 72 6e 20 44 69 67 65 73 74 4d 61   return DigestMa
9730: 69 6e 28 54 59 50 45 5f 43 4d 41 43 2c 20 69 6e  in(TYPE_CMAC, in
9740: 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76  terp, objc, objv
9750: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  );.}..static int
9760: 20 48 4d 41 43 4f 62 6a 43 6d 64 28 43 6c 69 65   HMACObjCmd(Clie
9770: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
9780: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
9790: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
97a0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20   Tcl_Obj *const 
97b0: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 72 65  objv[]) {.    re
97c0: 74 75 72 6e 20 44 69 67 65 73 74 4d 61 69 6e 28  turn DigestMain(
97d0: 54 59 50 45 5f 48 4d 41 43 2c 20 69 6e 74 65 72  TYPE_HMAC, inter
97e0: 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a  p, objc, objv);.
97f0: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 4d 41  }..static int MA
9800: 43 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61  CObjCmd(ClientDa
9810: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
9820: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
9830: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
9840: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
9850: 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  []) {.    return
9860: 20 44 69 67 65 73 74 4d 61 69 6e 28 54 59 50 45   DigestMain(TYPE
9870: 5f 4d 41 43 2c 20 69 6e 74 65 72 70 2c 20 6f 62  _MAC, interp, ob
9880: 6a 63 2c 20 6f 62 6a 76 29 3b 0a 7d 0a 0a 2f 2a  jc, objv);.}../*
9890: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
98a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
98b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
98c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
98d0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 65 73  ------. *. * Mes
98e0: 73 61 67 65 20 44 69 67 65 73 74 20 43 6f 6e 76  sage Digest Conv
98f0: 65 6e 69 65 6e 63 65 20 43 6f 6d 6d 61 6e 64 73  enience Commands
9900: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 6f 6e 76 65 6e   --. *. *.Conven
9910: 69 65 6e 63 65 20 63 6f 6d 6d 61 6e 64 73 20 66  ience commands f
9920: 6f 72 20 73 65 6c 65 63 74 20 6d 65 73 73 61 67  or select messag
9930: 65 20 64 69 67 65 73 74 73 2e 0a 20 2a 0a 20 2a  e digests.. *. *
9940: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c   Returns:. *.TCL
9950: 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52  _OK or TCL_ERROR
9960: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
9970: 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 72 65 73  cts:. *.Sets res
9980: 75 6c 74 20 74 6f 20 6d 65 73 73 61 67 65 20 64  ult to message d
9990: 69 67 65 73 74 20 6f 72 20 65 72 72 6f 72 20 6d  igest or error m
99a0: 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d  essage. *. *----
99b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
99c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
99d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
99e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
99f0: 20 2a 2f 0a 20 23 64 65 66 69 6e 65 20 76 61 6c   */. #define val
9a00: 69 64 61 74 65 5f 61 72 67 63 28 6f 62 6a 63 2c  idate_argc(objc,
9a10: 20 6f 62 6a 76 29 20 7b 20 5c 0a 20 20 20 20 69   objv) { \.    i
9a20: 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 20  f (objc != 2) { 
9a30: 5c 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  \..Tcl_WrongNumA
9a40: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
9a50: 62 6a 76 2c 20 22 64 61 74 61 22 29 3b 20 5c 0a  bjv, "data"); \.
9a60: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
9a70: 52 3b 20 5c 0a 20 20 20 20 7d 20 5c 0a 7d 0a 20  R; \.    } \.}. 
9a80: 0a 69 6e 74 20 4d 44 34 4f 62 6a 43 6d 64 28 43  .int MD4ObjCmd(C
9a90: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
9aa0: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
9ab0: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
9ac0: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  jc, Tcl_Obj *con
9ad0: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20  st objv[]) {.   
9ae0: 20 76 61 6c 69 64 61 74 65 5f 61 72 67 63 28 6f   validate_argc(o
9af0: 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 20 20 20 20  bjc, objv);.    
9b00: 72 65 74 75 72 6e 20 44 69 67 65 73 74 44 61 74  return DigestDat
9b10: 61 48 61 6e 64 6c 65 72 28 69 6e 74 65 72 70 2c  aHandler(interp,
9b20: 20 6f 62 6a 76 5b 31 5d 2c 20 45 56 50 5f 6d 64   objv[1], EVP_md
9b30: 34 28 29 2c 20 4e 55 4c 4c 2c 20 48 45 58 5f 46  4(), NULL, HEX_F
9b40: 4f 52 4d 41 54 20 7c 20 54 59 50 45 5f 4d 44 2c  ORMAT | TYPE_MD,
9b50: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a   NULL, NULL);.}.
9b60: 0a 69 6e 74 20 4d 44 35 4f 62 6a 43 6d 64 28 43  .int MD5ObjCmd(C
9b70: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
9b80: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
9b90: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
9ba0: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  jc, Tcl_Obj *con
9bb0: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20  st objv[]) {.   
9bc0: 20 76 61 6c 69 64 61 74 65 5f 61 72 67 63 28 6f   validate_argc(o
9bd0: 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 20 20 20 20  bjc, objv);.    
9be0: 72 65 74 75 72 6e 20 44 69 67 65 73 74 44 61 74  return DigestDat
9bf0: 61 48 61 6e 64 6c 65 72 28 69 6e 74 65 72 70 2c  aHandler(interp,
9c00: 20 6f 62 6a 76 5b 31 5d 2c 20 45 56 50 5f 6d 64   objv[1], EVP_md
9c10: 35 28 29 2c 20 4e 55 4c 4c 2c 20 48 45 58 5f 46  5(), NULL, HEX_F
9c20: 4f 52 4d 41 54 20 7c 20 54 59 50 45 5f 4d 44 2c  ORMAT | TYPE_MD,
9c30: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a   NULL, NULL);.}.
9c40: 0a 69 6e 74 20 53 48 41 31 4f 62 6a 43 6d 64 28  .int SHA1ObjCmd(
9c50: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
9c60: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
9c70: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
9c80: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
9c90: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
9ca0: 20 20 76 61 6c 69 64 61 74 65 5f 61 72 67 63 28    validate_argc(
9cb0: 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 20 20 20  objc, objv);.   
9cc0: 20 72 65 74 75 72 6e 20 44 69 67 65 73 74 44 61   return DigestDa
9cd0: 74 61 48 61 6e 64 6c 65 72 28 69 6e 74 65 72 70  taHandler(interp
9ce0: 2c 20 6f 62 6a 76 5b 31 5d 2c 20 45 56 50 5f 73  , objv[1], EVP_s
9cf0: 68 61 31 28 29 2c 20 4e 55 4c 4c 2c 20 48 45 58  ha1(), NULL, HEX
9d00: 5f 46 4f 52 4d 41 54 20 7c 20 54 59 50 45 5f 4d  _FORMAT | TYPE_M
9d10: 44 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a  D, NULL, NULL);.
9d20: 7d 0a 0a 69 6e 74 20 53 48 41 32 35 36 4f 62 6a  }..int SHA256Obj
9d30: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63  Cmd(ClientData c
9d40: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
9d50: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
9d60: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
9d70: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20   *const objv[]) 
9d80: 7b 0a 20 20 20 20 76 61 6c 69 64 61 74 65 5f 61  {.    validate_a
9d90: 72 67 63 28 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b  rgc(objc, objv);
9da0: 0a 20 20 20 20 72 65 74 75 72 6e 20 44 69 67 65  .    return Dige
9db0: 73 74 44 61 74 61 48 61 6e 64 6c 65 72 28 69 6e  stDataHandler(in
9dc0: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 45  terp, objv[1], E
9dd0: 56 50 5f 73 68 61 32 35 36 28 29 2c 20 4e 55 4c  VP_sha256(), NUL
9de0: 4c 2c 20 48 45 58 5f 46 4f 52 4d 41 54 20 7c 20  L, HEX_FORMAT | 
9df0: 54 59 50 45 5f 4d 44 2c 20 4e 55 4c 4c 2c 20 4e  TYPE_MD, NULL, N
9e00: 55 4c 4c 29 3b 0a 7d 0a 0a 69 6e 74 20 53 48 41  ULL);.}..int SHA
9e10: 35 31 32 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74  512ObjCmd(Client
9e20: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
9e30: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
9e40: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
9e50: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
9e60: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 76 61 6c 69  jv[]) {.    vali
9e70: 64 61 74 65 5f 61 72 67 63 28 6f 62 6a 63 2c 20  date_argc(objc, 
9e80: 6f 62 6a 76 29 3b 0a 20 20 20 20 72 65 74 75 72  objv);.    retur
9e90: 6e 20 44 69 67 65 73 74 44 61 74 61 48 61 6e 64  n DigestDataHand
9ea0: 6c 65 72 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  ler(interp, objv
9eb0: 5b 31 5d 2c 20 45 56 50 5f 73 68 61 35 31 32 28  [1], EVP_sha512(
9ec0: 29 2c 20 4e 55 4c 4c 2c 20 48 45 58 5f 46 4f 52  ), NULL, HEX_FOR
9ed0: 4d 41 54 20 7c 20 54 59 50 45 5f 4d 44 2c 20 4e  MAT | TYPE_MD, N
9ee0: 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 2f  ULL, NULL);.}../
9ef0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
9f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9f30: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c  -------. *. * Tl
9f40: 73 5f 44 69 67 65 73 74 43 6f 6d 6d 61 6e 64 73  s_DigestCommands
9f50: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 72 65 61 74 65   --. *. *.Create
9f60: 20 64 69 67 65 73 74 20 63 6f 6d 6d 61 6e 64 73   digest commands
9f70: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a  . *. * Returns:.
9f80: 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c   *.TCL_OK or TCL
9f90: 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64  _ERROR. *. * Sid
9fa0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 72  e effects:. *.Cr
9fb0: 65 61 74 65 73 20 63 6f 6d 6d 61 6e 64 73 0a 20  eates commands. 
9fc0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
9fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a000: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20  -------. */.int 
a010: 54 6c 73 5f 44 69 67 65 73 74 43 6f 6d 6d 61 6e  Tls_DigestComman
a020: 64 73 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  ds(Tcl_Interp *i
a030: 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 54 63 6c  nterp) {.    Tcl
a040: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
a050: 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  d(interp, "tls::
a060: 64 69 67 65 73 74 22 2c 20 4d 64 4f 62 6a 43 6d  digest", MdObjCm
a070: 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  d, (ClientData) 
a080: 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  0, (Tcl_CmdDelet
a090: 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
a0a0: 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
a0b0: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
a0c0: 20 22 74 6c 73 3a 3a 6d 64 22 2c 20 4d 64 4f 62   "tls::md", MdOb
a0d0: 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74  jCmd, (ClientDat
a0e0: 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65  a) 0, (Tcl_CmdDe
a0f0: 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c  leteProc *) NULL
a100: 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  );.    Tcl_Creat
a110: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
a120: 72 70 2c 20 22 74 6c 73 3a 3a 63 6d 61 63 22 2c  rp, "tls::cmac",
a130: 20 43 4d 41 43 4f 62 6a 43 6d 64 2c 20 28 43 6c   CMACObjCmd, (Cl
a140: 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63  ientData) 0, (Tc
a150: 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
a160: 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63  *) NULL);.    Tc
a170: 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
a180: 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a  nd(interp, "tls:
a190: 3a 68 6d 61 63 22 2c 20 48 4d 41 43 4f 62 6a 43  :hmac", HMACObjC
a1a0: 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
a1b0: 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65   0, (Tcl_CmdDele
a1c0: 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
a1d0: 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
a1e0: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
a1f0: 2c 20 22 74 6c 73 3a 3a 6d 61 63 22 2c 20 4d 41  , "tls::mac", MA
a200: 43 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  CObjCmd, (Client
a210: 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d  Data) 0, (Tcl_Cm
a220: 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
a230: 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72  ULL);.    Tcl_Cr
a240: 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
a250: 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 64 34  nterp, "tls::md4
a260: 22 2c 20 4d 44 34 4f 62 6a 43 6d 64 2c 20 28 43  ", MD4ObjCmd, (C
a270: 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54  lientData) 0, (T
a280: 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
a290: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
a2a0: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
a2b0: 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  and(interp, "tls
a2c0: 3a 3a 6d 64 35 22 2c 20 4d 44 35 4f 62 6a 43 6d  ::md5", MD5ObjCm
a2d0: 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  d, (ClientData) 
a2e0: 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  0, (Tcl_CmdDelet
a2f0: 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
a300: 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
a310: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
a320: 20 22 74 6c 73 3a 3a 73 68 61 31 22 2c 20 53 48   "tls::sha1", SH
a330: 41 31 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e  A1ObjCmd, (Clien
a340: 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43  tData) 0, (Tcl_C
a350: 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
a360: 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43  NULL);.    Tcl_C
a370: 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
a380: 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 68  interp, "tls::sh
a390: 61 32 35 36 22 2c 20 53 48 41 32 35 36 4f 62 6a  a256", SHA256Obj
a3a0: 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  Cmd, (ClientData
a3b0: 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ) 0, (Tcl_CmdDel
a3c0: 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
a3d0: 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
a3e0: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
a3f0: 70 2c 20 22 74 6c 73 3a 3a 73 68 61 35 31 32 22  p, "tls::sha512"
a400: 2c 20 53 48 41 35 31 32 4f 62 6a 43 6d 64 2c 20  , SHA512ObjCmd, 
a410: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20  (ClientData) 0, 
a420: 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
a430: 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  oc *) NULL);.   
a440: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
a450: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74  mmand(interp, "t
a460: 6c 73 3a 3a 75 6e 73 74 61 63 6b 22 2c 20 44 69  ls::unstack", Di
a470: 67 65 73 74 55 6e 73 74 61 63 6b 4f 62 6a 43 6d  gestUnstackObjCm
a480: 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  d, (ClientData) 
a490: 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  0, (Tcl_CmdDelet
a4a0: 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
a4b0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
a4c0: 4b 3b 0a 7d 0a 0a                                K;.}..