Hex Artifact Content

Artifact ecefe3e7e3bb0729d2b2c84048cdfe2fed80328e8ce04b61b391fc7050f1755a:


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 2a 2a 2a 2a  d.#endif../*****
0350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
0390: 0a 2f 2a 0a 20 2a 20 54 68 69 73 20 73 74 72 75  ./*. * This stru
03a0: 63 74 75 72 65 20 64 65 66 69 6e 65 73 20 74 68  cture defines th
03b0: 65 20 70 65 72 2d 69 6e 73 74 61 6e 63 65 20 73  e per-instance s
03c0: 74 61 74 65 20 6f 66 20 61 20 64 69 67 65 73 74  tate of a digest
03d0: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 2a 2f 0a   operation.. */.
03e0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 44  typedef struct D
03f0: 69 67 65 73 74 53 74 61 74 65 20 7b 0a 09 54 63  igestState {..Tc
0400: 6c 5f 43 68 61 6e 6e 65 6c 20 73 65 6c 66 3b 09  l_Channel self;.
0410: 2f 2a 20 54 68 69 73 20 73 6f 63 6b 65 74 20 63  /* This socket c
0420: 68 61 6e 6e 65 6c 20 2a 2f 0a 09 54 63 6c 5f 54  hannel */..Tcl_T
0430: 69 6d 65 72 54 6f 6b 65 6e 20 74 69 6d 65 72 3b  imerToken timer;
0440: 09 2f 2a 20 54 69 6d 65 72 20 66 6f 72 20 72 65  ./* Timer for re
0450: 61 64 20 65 76 65 6e 74 73 20 2a 2f 0a 0a 09 69  ad events */...i
0460: 6e 74 20 66 6c 61 67 73 3b 09 09 2f 2a 20 43 68  nt flags;../* Ch
0470: 61 6e 20 63 6f 6e 66 69 67 20 66 6c 61 67 73 20  an config flags 
0480: 2a 2f 0a 09 69 6e 74 20 77 61 74 63 68 4d 61 73  */..int watchMas
0490: 6b 3b 09 09 2f 2a 20 43 75 72 72 65 6e 74 20 57  k;../* Current W
04a0: 61 74 63 68 50 72 6f 63 20 6d 61 73 6b 20 2a 2f  atchProc mask */
04b0: 0a 09 69 6e 74 20 6d 6f 64 65 3b 09 09 2f 2a 20  ..int mode;../* 
04c0: 43 75 72 72 65 6e 74 20 6d 6f 64 65 20 6f 66 20  Current mode of 
04d0: 70 61 72 65 6e 74 20 63 68 61 6e 6e 65 6c 20 2a  parent channel *
04e0: 2f 0a 09 69 6e 74 20 66 6f 72 6d 61 74 3b 09 09  /..int format;..
04f0: 2f 2a 20 44 69 67 65 73 74 20 66 6f 72 6d 61 74  /* Digest format
0500: 20 61 6e 64 20 6f 70 65 72 61 74 69 6f 6e 20 2a   and operation *
0510: 2f 0a 0a 09 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /...Tcl_Interp *
0520: 69 6e 74 65 72 70 3b 09 2f 2a 20 43 75 72 72 65  interp;./* Curre
0530: 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a  nt interpreter *
0540: 2f 0a 09 45 56 50 5f 4d 44 5f 43 54 58 20 2a 63  /..EVP_MD_CTX *c
0550: 74 78 3b 09 2f 2a 20 4d 44 20 43 6f 6e 74 65 78  tx;./* MD Contex
0560: 74 20 2a 2f 0a 09 48 4d 41 43 5f 43 54 58 20 2a  t */..HMAC_CTX *
0570: 68 63 74 78 3b 09 09 2f 2a 20 48 4d 41 43 20 63  hctx;../* HMAC c
0580: 6f 6e 74 65 78 74 20 2a 2f 0a 09 43 4d 41 43 5f  ontext */..CMAC_
0590: 43 54 58 20 2a 63 63 74 78 3b 09 09 2f 2a 20 43  CTX *cctx;../* C
05a0: 4d 41 43 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09  MAC context */..
05b0: 54 63 6c 5f 43 6f 6d 6d 61 6e 64 20 74 6f 6b 65  Tcl_Command toke
05c0: 6e 3b 09 2f 2a 20 43 6f 6d 6d 61 6e 64 20 74 6f  n;./* Command to
05d0: 6b 65 6e 20 2a 2f 0a 7d 20 44 69 67 65 73 74 53  ken */.} DigestS
05e0: 74 61 74 65 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  tate;../*. *----
05f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
0630: 20 2a 0a 20 2a 20 44 69 67 65 73 74 53 74 61 74   *. * DigestStat
0640: 65 4e 65 77 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  eNew --. *. *.Th
0650: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 72 65 61  is function crea
0660: 74 65 73 20 61 20 70 65 72 2d 69 6e 73 74 61 6e  tes a per-instan
0670: 63 65 20 73 74 61 74 65 20 64 61 74 61 20 73 74  ce state data st
0680: 72 75 63 74 75 72 65 0a 20 2a 0a 20 2a 20 52 65  ructure. *. * Re
0690: 74 75 72 6e 73 3a 0a 20 2a 09 44 69 67 65 73 74  turns:. *.Digest
06a0: 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74   structure point
06b0: 65 72 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  er. *. * Side ef
06c0: 66 65 63 74 73 3a 0a 20 2a 09 43 72 65 61 74 65  fects:. *.Create
06d0: 73 20 73 74 72 75 63 74 75 72 65 0a 20 2a 0a 20  s structure. *. 
06e0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
06f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0720: 2d 2d 2d 2d 0a 20 2a 2f 0a 44 69 67 65 73 74 53  ----. */.DigestS
0730: 74 61 74 65 20 2a 44 69 67 65 73 74 53 74 61 74  tate *DigestStat
0740: 65 4e 65 77 28 54 63 6c 5f 49 6e 74 65 72 70 20  eNew(Tcl_Interp 
0750: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6f 72  *interp, int for
0760: 6d 61 74 29 20 7b 0a 20 20 20 20 44 69 67 65 73  mat) {.    Diges
0770: 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72  tState *statePtr
0780: 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 20  ;..    statePtr 
0790: 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a  = (DigestState *
07a0: 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 67  ) ckalloc((unsig
07b0: 6e 65 64 29 20 73 69 7a 65 6f 66 28 44 69 67 65  ned) sizeof(Dige
07c0: 73 74 53 74 61 74 65 29 29 3b 0a 20 20 20 20 69  stState));.    i
07d0: 66 20 28 73 74 61 74 65 50 74 72 20 21 3d 20 4e  f (statePtr != N
07e0: 55 4c 4c 29 20 7b 0a 09 6d 65 6d 73 65 74 28 73  ULL) {..memset(s
07f0: 74 61 74 65 50 74 72 2c 20 30 2c 20 73 69 7a 65  tatePtr, 0, size
0800: 6f 66 28 44 69 67 65 73 74 53 74 61 74 65 29 29  of(DigestState))
0810: 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  ;..statePtr->sel
0820: 66 09 3d 20 4e 55 4c 4c 3b 09 09 2f 2a 20 54 68  f.= NULL;../* Th
0830: 69 73 20 73 6f 63 6b 65 74 20 63 68 61 6e 6e 65  is socket channe
0840: 6c 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e  l */..statePtr->
0850: 74 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b 09 09 2f  timer = NULL;../
0860: 2a 20 54 69 6d 65 72 20 74 6f 20 66 6c 75 73 68  * Timer to flush
0870: 20 64 61 74 61 20 2a 2f 0a 09 73 74 61 74 65 50   data */..stateP
0880: 74 72 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 09 09  tr->flags = 0;..
0890: 2f 2a 20 43 68 61 6e 20 63 6f 6e 66 69 67 20 66  /* Chan config f
08a0: 6c 61 67 73 20 2a 2f 0a 09 73 74 61 74 65 50 74  lags */..statePt
08b0: 72 2d 3e 77 61 74 63 68 4d 61 73 6b 20 3d 20 30  r->watchMask = 0
08c0: 3b 09 2f 2a 20 43 75 72 72 65 6e 74 20 57 61 74  ;./* Current Wat
08d0: 63 68 50 72 6f 63 20 6d 61 73 6b 20 2a 2f 0a 09  chProc mask */..
08e0: 73 74 61 74 65 50 74 72 2d 3e 6d 6f 64 65 09 3d  statePtr->mode.=
08f0: 20 30 3b 09 09 2f 2a 20 43 75 72 72 65 6e 74 20   0;../* Current 
0900: 6d 6f 64 65 20 6f 66 20 70 61 72 65 6e 74 20 63  mode of parent c
0910: 68 61 6e 6e 65 6c 20 2a 2f 0a 09 73 74 61 74 65  hannel */..state
0920: 50 74 72 2d 3e 66 6f 72 6d 61 74 20 3d 20 66 6f  Ptr->format = fo
0930: 72 6d 61 74 3b 09 2f 2a 20 44 69 67 65 73 74 20  rmat;./* Digest 
0940: 66 6f 72 6d 61 74 20 61 6e 64 20 6f 70 65 72 61  format and opera
0950: 74 69 6f 6e 20 2a 2f 0a 09 73 74 61 74 65 50 74  tion */..statePt
0960: 72 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  r->interp = inte
0970: 72 70 3b 09 2f 2a 20 43 75 72 72 65 6e 74 20 69  rp;./* Current i
0980: 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 09 73  nterpreter */..s
0990: 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 4e  tatePtr->ctx = N
09a0: 55 4c 4c 3b 09 09 2f 2a 20 4d 44 20 43 6f 6e 74  ULL;../* MD Cont
09b0: 65 78 74 20 2a 2f 0a 09 73 74 61 74 65 50 74 72  ext */..statePtr
09c0: 2d 3e 68 63 74 78 20 3d 20 4e 55 4c 4c 3b 09 09  ->hctx = NULL;..
09d0: 2f 2a 20 48 4d 41 43 20 43 6f 6e 74 65 78 74 20  /* HMAC Context 
09e0: 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 63  */..statePtr->cc
09f0: 74 78 20 3d 20 4e 55 4c 4c 3b 09 09 2f 2a 20 43  tx = NULL;../* C
0a00: 4d 41 43 20 43 6f 6e 74 65 78 74 20 2a 2f 0a 09  MAC Context */..
0a10: 73 74 61 74 65 50 74 72 2d 3e 74 6f 6b 65 6e 20  statePtr->token 
0a20: 3d 20 4e 55 4c 4c 3b 09 09 2f 2a 20 43 6f 6d 6d  = NULL;../* Comm
0a30: 61 6e 64 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20  and token */.   
0a40: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 73 74   }.    return st
0a50: 61 74 65 50 74 72 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  atePtr;.}../*. *
0a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0aa0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74  ---. *. * Digest
0ab0: 53 74 61 74 65 46 72 65 65 20 2d 2d 0a 20 2a 0a  StateFree --. *.
0ac0: 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e   *.This function
0ad0: 20 64 65 6c 65 74 65 73 20 61 20 64 69 67 65 73   deletes a diges
0ae0: 74 20 73 74 61 74 65 20 73 74 72 75 63 74 75 72  t state structur
0af0: 65 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a  e. *. * Returns:
0b00: 0a 20 2a 09 4e 6f 74 68 69 6e 67 0a 20 2a 0a 20  . *.Nothing. *. 
0b10: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
0b20: 20 2a 09 52 65 6d 6f 76 65 73 20 73 74 72 75 63   *.Removes struc
0b30: 74 75 72 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ture. *. *------
0b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
0b80: 2f 0a 76 6f 69 64 20 44 69 67 65 73 74 53 74 61  /.void DigestSta
0b90: 74 65 46 72 65 65 28 44 69 67 65 73 74 53 74 61  teFree(DigestSta
0ba0: 74 65 20 2a 73 74 61 74 65 50 74 72 29 20 7b 0a  te *statePtr) {.
0bb0: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
0bc0: 20 3d 3d 20 28 44 69 67 65 73 74 53 74 61 74 65   == (DigestState
0bd0: 20 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74   *) NULL) {..ret
0be0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  urn;.    }..    
0bf0: 2f 2a 20 52 65 6d 6f 76 65 20 70 65 6e 64 69 6e  /* Remove pendin
0c00: 67 20 74 69 6d 65 72 20 2a 2f 0a 20 20 20 20 69  g timer */.    i
0c10: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d  f (statePtr->tim
0c20: 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72  er != (Tcl_Timer
0c30: 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09  Token) NULL) {..
0c40: 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48  Tcl_DeleteTimerH
0c50: 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d  andler(statePtr-
0c60: 3e 74 69 6d 65 72 29 3b 0a 20 20 20 20 7d 0a 0a  >timer);.    }..
0c70: 20 20 20 20 2f 2a 20 46 72 65 65 20 63 6f 6e 74      /* Free cont
0c80: 65 78 74 20 73 74 72 75 63 74 75 72 65 73 20 2a  ext structures *
0c90: 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  /.    if (stateP
0ca0: 74 72 2d 3e 63 74 78 20 21 3d 20 28 45 56 50 5f  tr->ctx != (EVP_
0cb0: 4d 44 5f 43 54 58 20 2a 29 20 4e 55 4c 4c 29 20  MD_CTX *) NULL) 
0cc0: 7b 0a 09 45 56 50 5f 4d 44 5f 43 54 58 5f 66 72  {..EVP_MD_CTX_fr
0cd0: 65 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  ee(statePtr->ctx
0ce0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  );.    }.    if 
0cf0: 28 73 74 61 74 65 50 74 72 2d 3e 68 63 74 78 20  (statePtr->hctx 
0d00: 21 3d 20 28 48 4d 41 43 5f 43 54 58 20 2a 29 20  != (HMAC_CTX *) 
0d10: 4e 55 4c 4c 29 20 7b 0a 09 48 4d 41 43 5f 43 54  NULL) {..HMAC_CT
0d20: 58 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d  X_free(statePtr-
0d30: 3e 68 63 74 78 29 3b 0a 20 20 20 20 7d 0a 20 20  >hctx);.    }.  
0d40: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
0d50: 63 63 74 78 20 21 3d 20 28 43 4d 41 43 5f 43 54  cctx != (CMAC_CT
0d60: 58 20 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 43 4d  X *) NULL) {..CM
0d70: 41 43 5f 43 54 58 5f 66 72 65 65 28 73 74 61 74  AC_CTX_free(stat
0d80: 65 50 74 72 2d 3e 63 63 74 78 29 3b 0a 20 20 20  ePtr->cctx);.   
0d90: 20 7d 0a 20 20 20 20 63 6b 66 72 65 65 28 73 74   }.    ckfree(st
0da0: 61 74 65 50 74 72 29 3b 0a 7d 0a 0a 2f 2a 2a 2a  atePtr);.}../***
0db0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0dc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0dd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0de0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0df0: 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  /../*. *--------
0e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
0e40: 2a 20 44 69 67 65 73 74 49 6e 69 74 69 61 6c 69  * DigestInitiali
0e50: 7a 65 20 2d 2d 0a 20 2a 0a 20 2a 09 49 6e 69 74  ze --. *. *.Init
0e60: 69 61 6c 69 7a 65 20 61 20 68 61 73 68 20 66 75  ialize a hash fu
0e70: 6e 63 74 69 6f 6e 0a 20 2a 0a 20 2a 20 52 65 74  nction. *. * Ret
0e80: 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20  urns:. *.TCL_OK 
0e90: 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72  if successful or
0ea0: 20 54 43 4c 5f 45 52 52 4f 52 20 66 6f 72 20 66   TCL_ERROR for f
0eb0: 61 69 6c 75 72 65 20 77 69 74 68 20 72 65 73 75  ailure with resu
0ec0: 6c 74 20 73 65 74 0a 20 2a 09 74 6f 20 65 72 72  lt set. *.to err
0ed0: 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20  or message.. *. 
0ee0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
0ef0: 20 2a 09 4e 6f 20 72 65 73 75 6c 74 20 6f 72 20   *.No result or 
0f00: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a  error message. *
0f10: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
0f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f50: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44  ------. */.int D
0f60: 69 67 65 73 74 49 6e 69 74 69 61 6c 69 7a 65 28  igestInitialize(
0f70: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
0f80: 72 70 2c 20 44 69 67 65 73 74 53 74 61 74 65 20  rp, DigestState 
0f90: 2a 73 74 61 74 65 50 74 72 2c 20 63 6f 6e 73 74  *statePtr, const
0fa0: 20 45 56 50 5f 4d 44 20 2a 6d 64 2c 0a 09 63 6f   EVP_MD *md,..co
0fb0: 6e 73 74 20 45 56 50 5f 43 49 50 48 45 52 20 2a  nst EVP_CIPHER *
0fc0: 63 69 70 68 65 72 2c 20 54 63 6c 5f 4f 62 6a 20  cipher, Tcl_Obj 
0fd0: 2a 6b 65 79 4f 62 6a 2c 20 45 56 50 5f 4d 41 43  *keyObj, EVP_MAC
0fe0: 20 2a 6d 61 63 29 20 7b 0a 20 20 20 20 69 6e 74   *mac) {.    int
0ff0: 20 6b 65 79 5f 6c 65 6e 20 3d 20 30 2c 20 72 65   key_len = 0, re
1000: 73 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74  s = 0;.    const
1010: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1020: 6b 65 79 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20  key = NULL;..   
1030: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
1040: 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61  ");..    /* Crea
1050: 74 65 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20  te contexts */. 
1060: 20 20 20 73 77 69 74 63 68 28 73 74 61 74 65 50     switch(stateP
1070: 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20 30 78 46  tr->format & 0xF
1080: 46 30 29 20 7b 0a 20 20 20 20 63 61 73 65 20 54  F0) {.    case T
1090: 59 50 45 5f 4d 44 3a 0a 09 73 74 61 74 65 50 74  YPE_MD:..statePt
10a0: 72 2d 3e 63 74 78 20 3d 20 45 56 50 5f 4d 44 5f  r->ctx = EVP_MD_
10b0: 43 54 58 5f 6e 65 77 28 29 3b 0a 09 72 65 73 20  CTX_new();..res 
10c0: 3d 20 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  = (statePtr->ctx
10d0: 20 21 3d 20 4e 55 4c 4c 29 3b 0a 09 62 72 65 61   != NULL);..brea
10e0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 59 50 45  k;.    case TYPE
10f0: 5f 48 4d 41 43 3a 0a 09 73 74 61 74 65 50 74 72  _HMAC:..statePtr
1100: 2d 3e 68 63 74 78 20 3d 20 48 4d 41 43 5f 43 54  ->hctx = HMAC_CT
1110: 58 5f 6e 65 77 28 29 3b 0a 09 72 65 73 20 3d 20  X_new();..res = 
1120: 28 73 74 61 74 65 50 74 72 2d 3e 68 63 74 78 20  (statePtr->hctx 
1130: 21 3d 20 4e 55 4c 4c 29 3b 0a 09 62 72 65 61 6b  != NULL);..break
1140: 3b 0a 20 20 20 20 63 61 73 65 20 54 59 50 45 5f  ;.    case TYPE_
1150: 43 4d 41 43 3a 0a 09 73 74 61 74 65 50 74 72 2d  CMAC:..statePtr-
1160: 3e 63 63 74 78 20 3d 20 43 4d 41 43 5f 43 54 58  >cctx = CMAC_CTX
1170: 5f 6e 65 77 28 29 3b 0a 09 72 65 73 20 3d 20 28  _new();..res = (
1180: 73 74 61 74 65 50 74 72 2d 3e 63 63 74 78 20 21  statePtr->cctx !
1190: 3d 20 4e 55 4c 4c 29 3b 0a 09 62 72 65 61 6b 3b  = NULL);..break;
11a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
11b0: 21 72 65 73 29 20 7b 0a 09 54 63 6c 5f 41 70 70  !res) {..Tcl_App
11c0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
11d0: 2c 20 22 43 72 65 61 74 65 20 63 6f 6e 74 65 78  , "Create contex
11e0: 74 20 66 61 69 6c 65 64 3a 20 22 2c 20 52 45 41  t failed: ", REA
11f0: 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 72  SON(), NULL);..r
1200: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1210: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
1220: 65 74 20 6b 65 79 20 2a 2f 0a 20 20 20 20 69 66  et key */.    if
1230: 20 28 6b 65 79 4f 62 6a 20 21 3d 20 4e 55 4c 4c   (keyObj != NULL
1240: 29 20 7b 0a 09 6b 65 79 20 3d 20 54 63 6c 5f 47  ) {..key = Tcl_G
1250: 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
1260: 62 6a 28 6b 65 79 4f 62 6a 2c 20 26 6b 65 79 5f  bj(keyObj, &key_
1270: 6c 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  len);.    }..   
1280: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 63   /* Initialize c
1290: 72 79 70 74 6f 67 72 61 70 68 79 20 66 75 6e 63  ryptography func
12a0: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 77 69 74  tion */.    swit
12b0: 63 68 28 73 74 61 74 65 50 74 72 2d 3e 66 6f 72  ch(statePtr->for
12c0: 6d 61 74 20 26 20 30 78 46 46 30 29 20 7b 0a 20  mat & 0xFF0) {. 
12d0: 20 20 20 63 61 73 65 20 54 59 50 45 5f 4d 44 3a     case TYPE_MD:
12e0: 0a 09 72 65 73 20 3d 20 45 56 50 5f 44 69 67 65  ..res = EVP_Dige
12f0: 73 74 49 6e 69 74 5f 65 78 28 73 74 61 74 65 50  stInit_ex(stateP
1300: 74 72 2d 3e 63 74 78 2c 20 6d 64 2c 20 4e 55 4c  tr->ctx, md, NUL
1310: 4c 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  L);..break;.    
1320: 63 61 73 65 20 54 59 50 45 5f 48 4d 41 43 3a 0a  case TYPE_HMAC:.
1330: 09 72 65 73 20 3d 20 48 4d 41 43 5f 49 6e 69 74  .res = HMAC_Init
1340: 5f 65 78 28 73 74 61 74 65 50 74 72 2d 3e 68 63  _ex(statePtr->hc
1350: 74 78 2c 20 28 63 6f 6e 73 74 20 76 6f 69 64 20  tx, (const void 
1360: 2a 29 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 2c  *) key, key_len,
1370: 20 6d 64 2c 20 4e 55 4c 4c 29 3b 0a 09 62 72 65   md, NULL);..bre
1380: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 59 50  ak;.    case TYP
1390: 45 5f 43 4d 41 43 3a 0a 09 72 65 73 20 3d 20 43  E_CMAC:..res = C
13a0: 4d 41 43 5f 49 6e 69 74 28 73 74 61 74 65 50 74  MAC_Init(statePt
13b0: 72 2d 3e 63 63 74 78 2c 20 28 63 6f 6e 73 74 20  r->cctx, (const 
13c0: 76 6f 69 64 20 2a 29 20 6b 65 79 2c 20 6b 65 79  void *) key, key
13d0: 5f 6c 65 6e 2c 20 63 69 70 68 65 72 2c 20 4e 55  _len, cipher, NU
13e0: 4c 4c 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20  LL);..break;.   
13f0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 21 72 65 73   }..    if (!res
1400: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
1410: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 49  esult(interp, "I
1420: 6e 69 74 69 61 6c 69 7a 65 20 66 61 69 6c 65 64  nitialize failed
1430: 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e  : ", REASON(), N
1440: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  ULL);..return TC
1450: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
1460: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
1470: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ;.}../*. *------
1480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
14c0: 0a 20 2a 20 44 69 67 65 73 74 55 70 64 61 74 65  . * DigestUpdate
14d0: 20 2d 2d 0a 20 2a 0a 20 2a 09 55 70 64 61 74 65   --. *. *.Update
14e0: 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e   a hash function
14f0: 20 77 69 74 68 20 64 61 74 61 0a 20 2a 0a 20 2a   with data. *. *
1500: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c   Returns:. *.TCL
1510: 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75  _OK if successfu
1520: 6c 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 20 66  l or TCL_ERROR f
1530: 6f 72 20 66 61 69 6c 75 72 65 20 77 69 74 68 20  or failure with 
1540: 72 65 73 75 6c 74 20 73 65 74 0a 20 2a 09 74 6f  result set. *.to
1550: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
1560: 66 20 64 6f 5f 72 65 73 75 6c 74 20 69 73 20 74  f do_result is t
1570: 72 75 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  rue.. *. * Side 
1580: 65 66 66 65 63 74 73 3a 0a 20 2a 09 41 64 64 73  effects:. *.Adds
1590: 20 62 75 66 20 64 61 74 61 20 74 6f 20 68 61 73   buf data to has
15a0: 68 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20 73 65  h function or se
15b0: 74 73 20 72 65 73 75 6c 74 20 74 6f 20 65 72 72  ts result to err
15c0: 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a  or message. *. *
15d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1610: 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65  ---. */.int Dige
1620: 73 74 55 70 64 61 74 65 28 44 69 67 65 73 74 53  stUpdate(DigestS
1630: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20  tate *statePtr, 
1640: 63 68 61 72 20 2a 62 75 66 2c 20 73 69 7a 65 5f  char *buf, size_
1650: 74 20 72 65 61 64 2c 20 69 6e 74 20 64 6f 5f 72  t read, int do_r
1660: 65 73 75 6c 74 29 20 7b 0a 20 20 20 20 69 6e 74  esult) {.    int
1670: 20 72 65 73 20 3d 20 30 3b 0a 0a 20 20 20 20 64   res = 0;..    d
1680: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
1690: 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 28 73 74  ;..    switch(st
16a0: 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26  atePtr->format &
16b0: 20 30 78 46 46 30 29 20 7b 0a 20 20 20 20 63 61   0xFF0) {.    ca
16c0: 73 65 20 54 59 50 45 5f 4d 44 3a 0a 20 20 20 20  se TYPE_MD:.    
16d0: 20 20 20 20 72 65 73 20 3d 20 45 56 50 5f 44 69      res = EVP_Di
16e0: 67 65 73 74 55 70 64 61 74 65 28 73 74 61 74 65  gestUpdate(state
16f0: 50 74 72 2d 3e 63 74 78 2c 20 62 75 66 2c 20 72  Ptr->ctx, buf, r
1700: 65 61 64 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20  ead);..break;.  
1710: 20 20 63 61 73 65 20 54 59 50 45 5f 48 4d 41 43    case TYPE_HMAC
1720: 3a 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20  :.        res = 
1730: 48 4d 41 43 5f 55 70 64 61 74 65 28 73 74 61 74  HMAC_Update(stat
1740: 65 50 74 72 2d 3e 68 63 74 78 2c 20 62 75 66 2c  ePtr->hctx, buf,
1750: 20 72 65 61 64 29 3b 0a 09 62 72 65 61 6b 3b 0a   read);..break;.
1760: 20 20 20 20 63 61 73 65 20 54 59 50 45 5f 43 4d      case TYPE_CM
1770: 41 43 3a 0a 20 20 20 20 20 20 20 20 72 65 73 20  AC:.        res 
1780: 3d 20 43 4d 41 43 5f 55 70 64 61 74 65 28 73 74  = CMAC_Update(st
1790: 61 74 65 50 74 72 2d 3e 63 63 74 78 2c 20 62 75  atePtr->cctx, bu
17a0: 66 2c 20 72 65 61 64 29 3b 0a 09 62 72 65 61 6b  f, read);..break
17b0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
17c0: 28 21 72 65 73 20 26 26 20 64 6f 5f 72 65 73 75  (!res && do_resu
17d0: 6c 74 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  lt) {..Tcl_Appen
17e0: 64 52 65 73 75 6c 74 28 73 74 61 74 65 50 74 72  dResult(statePtr
17f0: 2d 3e 69 6e 74 65 72 70 2c 20 22 55 70 64 61 74  ->interp, "Updat
1800: 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 52 45 41  e failed: ", REA
1810: 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 72  SON(), NULL);..r
1820: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1830: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
1840: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1850: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
1860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1890: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65  -----. *. * Dige
18a0: 73 74 46 69 6e 61 6c 69 7a 65 20 2d 2d 0a 20 2a  stFinalize --. *
18b0: 0a 20 2a 09 46 69 6e 61 6c 69 7a 65 20 61 20 68  . *.Finalize a h
18c0: 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  ash function and
18d0: 20 72 65 74 75 72 6e 20 74 68 65 20 6d 65 73 73   return the mess
18e0: 61 67 65 20 64 69 67 65 73 74 0a 20 2a 0a 20 2a  age digest. *. *
18f0: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c   Returns:. *.TCL
1900: 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75  _OK if successfu
1910: 6c 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 20 66  l or TCL_ERROR f
1920: 6f 72 20 66 61 69 6c 75 72 65 20 77 69 74 68 20  or failure with 
1930: 72 65 73 75 6c 74 20 73 65 74 0a 20 2a 09 74 6f  result set. *.to
1940: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a   error message..
1950: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
1960: 74 73 3a 0a 20 2a 09 53 65 74 73 20 72 65 73 75  ts:. *.Sets resu
1970: 6c 74 20 74 6f 20 6d 65 73 73 61 67 65 20 64 69  lt to message di
1980: 67 65 73 74 20 6f 72 20 61 6e 20 65 72 72 6f 72  gest or an error
1990: 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 2d   message.. *. *-
19a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19e0: 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73  --. */.int Diges
19f0: 74 46 69 6e 61 6c 69 7a 65 28 54 63 6c 5f 49 6e  tFinalize(Tcl_In
1a00: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 44 69  terp *interp, Di
1a10: 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65  gestState *state
1a20: 50 74 72 2c 20 54 63 6c 5f 4f 62 6a 20 2a 2a 72  Ptr, Tcl_Obj **r
1a30: 65 73 75 6c 74 4f 62 6a 29 20 7b 0a 20 20 20 20  esultObj) {.    
1a40: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d 64  unsigned char md
1a50: 5f 62 75 66 5b 45 56 50 5f 4d 41 58 5f 4d 44 5f  _buf[EVP_MAX_MD_
1a60: 53 49 5a 45 5d 3b 0a 20 20 20 20 75 6e 73 69 67  SIZE];.    unsig
1a70: 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 20 20  ned int ulen;.  
1a80: 20 20 69 6e 74 20 72 65 73 20 3d 20 30 2c 20 6d    int res = 0, m
1a90: 64 5f 6c 65 6e 20 3d 20 30 3b 0a 0a 20 20 20 20  d_len = 0;..    
1aa0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
1ab0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c  );..    /* Final
1ac0: 69 7a 65 20 63 72 79 70 74 6f 67 72 61 70 68 79  ize cryptography
1ad0: 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 67 65   function and ge
1ae0: 74 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20  t result */.    
1af0: 73 77 69 74 63 68 28 73 74 61 74 65 50 74 72 2d  switch(statePtr-
1b00: 3e 66 6f 72 6d 61 74 20 26 20 30 78 46 46 30 29  >format & 0xFF0)
1b10: 20 7b 0a 20 20 20 20 63 61 73 65 20 54 59 50 45   {.    case TYPE
1b20: 5f 4d 44 3a 0a 09 69 66 20 28 21 28 73 74 61 74  _MD:..if (!(stat
1b30: 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20 49  ePtr->format & I
1b40: 53 5f 58 4f 46 29 29 20 7b 0a 09 20 20 20 20 72  S_XOF)) {..    r
1b50: 65 73 20 3d 20 45 56 50 5f 44 69 67 65 73 74 46  es = EVP_DigestF
1b60: 69 6e 61 6c 5f 65 78 28 73 74 61 74 65 50 74 72  inal_ex(statePtr
1b70: 2d 3e 63 74 78 2c 20 6d 64 5f 62 75 66 2c 20 26  ->ctx, md_buf, &
1b80: 75 6c 65 6e 29 3b 0a 09 20 20 20 20 6d 64 5f 6c  ulen);..    md_l
1b90: 65 6e 20 3d 20 28 69 6e 74 29 20 75 6c 65 6e 3b  en = (int) ulen;
1ba0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
1bb0: 72 65 73 20 3d 20 45 56 50 5f 44 69 67 65 73 74  res = EVP_Digest
1bc0: 46 69 6e 61 6c 58 4f 46 28 73 74 61 74 65 50 74  FinalXOF(statePt
1bd0: 72 2d 3e 63 74 78 2c 20 6d 64 5f 62 75 66 2c 20  r->ctx, md_buf, 
1be0: 28 73 69 7a 65 5f 74 29 20 45 56 50 5f 4d 41 58  (size_t) EVP_MAX
1bf0: 5f 4d 44 5f 53 49 5a 45 29 3b 0a 09 20 20 20 20  _MD_SIZE);..    
1c00: 6d 64 5f 6c 65 6e 20 3d 20 45 56 50 5f 4d 41 58  md_len = EVP_MAX
1c10: 5f 4d 44 5f 53 49 5a 45 3b 0a 09 7d 0a 09 62 72  _MD_SIZE;..}..br
1c20: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 59  eak;.    case TY
1c30: 50 45 5f 48 4d 41 43 3a 0a 09 72 65 73 20 3d 20  PE_HMAC:..res = 
1c40: 48 4d 41 43 5f 46 69 6e 61 6c 28 73 74 61 74 65  HMAC_Final(state
1c50: 50 74 72 2d 3e 68 63 74 78 2c 20 6d 64 5f 62 75  Ptr->hctx, md_bu
1c60: 66 2c 20 26 75 6c 65 6e 29 3b 0a 09 6d 64 5f 6c  f, &ulen);..md_l
1c70: 65 6e 20 3d 20 28 69 6e 74 29 20 75 6c 65 6e 3b  en = (int) ulen;
1c80: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ..break;.    cas
1c90: 65 20 54 59 50 45 5f 43 4d 41 43 3a 0a 09 73 69  e TYPE_CMAC:..si
1ca0: 7a 65 5f 74 20 73 69 7a 65 3b 0a 09 72 65 73 20  ze_t size;..res 
1cb0: 3d 20 43 4d 41 43 5f 46 69 6e 61 6c 28 73 74 61  = CMAC_Final(sta
1cc0: 74 65 50 74 72 2d 3e 63 63 74 78 2c 20 6d 64 5f  tePtr->cctx, md_
1cd0: 62 75 66 2c 20 26 73 69 7a 65 29 3b 0a 09 6d 64  buf, &size);..md
1ce0: 5f 6c 65 6e 20 3d 20 28 69 6e 74 29 20 73 69 7a  _len = (int) siz
1cf0: 65 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d  e;..break;.    }
1d00: 0a 0a 20 20 20 20 69 66 20 28 21 72 65 73 29 20  ..    if (!res) 
1d10: 7b 0a 09 69 66 20 28 72 65 73 75 6c 74 4f 62 6a  {..if (resultObj
1d20: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   == NULL) {..   
1d30: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1d40: 74 28 69 6e 74 65 72 70 2c 20 22 46 69 6e 61 6c  t(interp, "Final
1d50: 69 7a 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 52  ize failed: ", R
1d60: 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a  EASON(), NULL);.
1d70: 09 7d 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  .}..return TCL_E
1d80: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
1d90: 20 2f 2a 20 52 65 74 75 72 6e 20 6d 65 73 73 61   /* Return messa
1da0: 67 65 20 64 69 67 65 73 74 20 61 73 20 65 69 74  ge digest as eit
1db0: 68 65 72 20 61 20 62 69 6e 61 72 79 20 6f 72 20  her a binary or 
1dc0: 68 65 78 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  hex string */.  
1dd0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
1de0: 66 6f 72 6d 61 74 20 26 20 42 49 4e 5f 46 4f 52  format & BIN_FOR
1df0: 4d 41 54 29 20 7b 0a 09 69 66 20 28 72 65 73 75  MAT) {..if (resu
1e00: 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b  ltObj == NULL) {
1e10: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ..    Tcl_SetObj
1e20: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
1e30: 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f  cl_NewByteArrayO
1e40: 62 6a 28 6d 64 5f 62 75 66 2c 20 6d 64 5f 6c 65  bj(md_buf, md_le
1e50: 6e 29 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  n));..} else {..
1e60: 20 20 20 20 2a 72 65 73 75 6c 74 4f 62 6a 20 3d      *resultObj =
1e70: 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
1e80: 79 4f 62 6a 28 6d 64 5f 62 75 66 2c 20 6d 64 5f  yObj(md_buf, md_
1e90: 6c 65 6e 29 3b 0a 09 20 20 20 20 54 63 6c 5f 49  len);..    Tcl_I
1ea0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 2a 72 65 73  ncrRefCount(*res
1eb0: 75 6c 74 4f 62 6a 29 3b 0a 09 7d 0a 0a 20 20 20  ultObj);..}..   
1ec0: 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f   } else {..Tcl_O
1ed0: 62 6a 20 2a 6e 65 77 4f 62 6a 20 3d 20 54 63 6c  bj *newObj = Tcl
1ee0: 5f 4e 65 77 4f 62 6a 28 29 3b 0a 09 75 6e 73 69  _NewObj();..unsi
1ef0: 67 6e 65 64 20 63 68 61 72 20 2a 70 74 72 20 3d  gned char *ptr =
1f00: 20 54 63 6c 5f 53 65 74 42 79 74 65 41 72 72 61   Tcl_SetByteArra
1f10: 79 4c 65 6e 67 74 68 28 6e 65 77 4f 62 6a 2c 20  yLength(newObj, 
1f20: 6d 64 5f 6c 65 6e 2a 32 29 3b 0a 0a 09 66 6f 72  md_len*2);...for
1f30: 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c   (int i = 0; i <
1f40: 20 6d 64 5f 6c 65 6e 3b 20 69 2b 2b 29 20 7b 0a   md_len; i++) {.
1f50: 09 20 20 20 20 2a 70 74 72 2b 2b 20 3d 20 68 65  .    *ptr++ = he
1f60: 78 5b 28 6d 64 5f 62 75 66 5b 69 5d 20 3e 3e 20  x[(md_buf[i] >> 
1f70: 34 29 20 26 20 30 78 30 46 5d 3b 0a 09 20 20 20  4) & 0x0F];..   
1f80: 20 2a 70 74 72 2b 2b 20 3d 20 68 65 78 5b 6d 64   *ptr++ = hex[md
1f90: 5f 62 75 66 5b 69 5d 20 26 20 30 78 30 46 5d 3b  _buf[i] & 0x0F];
1fa0: 0a 09 7d 0a 0a 09 69 66 20 28 72 65 73 75 6c 74  ..}...if (result
1fb0: 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Obj == NULL) {..
1fc0: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
1fd0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6e 65 77  sult(interp, new
1fe0: 4f 62 6a 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  Obj);..} else {.
1ff0: 09 20 20 20 20 2a 72 65 73 75 6c 74 4f 62 6a 20  .    *resultObj 
2000: 3d 20 6e 65 77 4f 62 6a 3b 0a 09 20 20 20 20 54  = newObj;..    T
2010: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
2020: 2a 72 65 73 75 6c 74 4f 62 6a 29 3b 0a 09 7d 0a  *resultObj);..}.
2030: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
2040: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 2a 2a   TCL_OK;.}../***
2050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2090: 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  /../*. *--------
20a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
20e0: 2a 20 44 69 67 65 73 74 42 6c 6f 63 6b 4d 6f 64  * DigestBlockMod
20f0: 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54  eProc --. *. *.T
2100: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2110: 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 67  invoked by the g
2120: 65 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 6c 0a  eneric IO level.
2130: 20 2a 09 74 6f 20 73 65 74 20 62 6c 6f 63 6b 69   *.to set blocki
2140: 6e 67 20 61 6e 64 20 6e 6f 6e 62 6c 6f 63 6b 69  ng and nonblocki
2150: 6e 67 20 6d 6f 64 65 73 2e 0a 20 2a 0a 20 2a 20  ng modes.. *. * 
2160: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 30 20 69 66  Returns:. *.0 if
2170: 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 50   successful or P
2180: 4f 53 49 58 20 65 72 72 6f 72 20 63 6f 64 65 20  OSIX error code 
2190: 69 66 20 66 61 69 6c 65 64 2e 0a 20 2a 0a 20 2a  if failed.. *. *
21a0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
21b0: 2a 09 53 65 74 73 20 74 68 65 20 64 65 76 69 63  *.Sets the devic
21c0: 65 20 69 6e 74 6f 20 62 6c 6f 63 6b 69 6e 67 20  e into blocking 
21d0: 6f 72 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d  or nonblocking m
21e0: 6f 64 65 2e 0a 20 2a 09 43 61 6e 20 63 61 6c 6c  ode.. *.Can call
21f0: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 45   Tcl_SetChannelE
2200: 72 72 6f 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  rror.. *. *-----
2210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
2250: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 69  */.static int Di
2260: 67 65 73 74 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f  gestBlockModePro
2270: 63 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  c(ClientData cli
2280: 65 6e 74 44 61 74 61 2c 20 69 6e 74 20 6d 6f 64  entData, int mod
2290: 65 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53  e) {.    DigestS
22a0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
22b0: 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 29   (DigestState *)
22c0: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20   clientData;..  
22d0: 20 20 69 66 20 28 6d 6f 64 65 20 3d 3d 20 54 43    if (mode == TC
22e0: 4c 5f 4d 4f 44 45 5f 4e 4f 4e 42 4c 4f 43 4b 49  L_MODE_NONBLOCKI
22f0: 4e 47 29 20 7b 0a 09 73 74 61 74 65 50 74 72 2d  NG) {..statePtr-
2300: 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43  >flags |= TLS_TC
2310: 4c 5f 41 53 59 4e 43 3b 0a 20 20 20 20 7d 20 65  L_ASYNC;.    } e
2320: 6c 73 65 20 7b 0a 09 73 74 61 74 65 50 74 72 2d  lse {..statePtr-
2330: 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f  >flags &= ~(TLS_
2340: 54 43 4c 5f 41 53 59 4e 43 29 3b 0a 20 20 20 20  TCL_ASYNC);.    
2350: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  }.    return 0;.
2360: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
2370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
23b0: 2a 20 44 69 67 65 73 74 43 6c 6f 73 65 50 72 6f  * DigestClosePro
23c0: 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  c --. *. *.This 
23d0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f  function is invo
23e0: 6b 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72  ked by the gener
23f0: 69 63 20 49 4f 20 6c 65 76 65 6c 20 74 6f 20 70  ic IO level to p
2400: 65 72 66 6f 72 6d 0a 20 2a 09 63 68 61 6e 6e 65  erform. *.channe
2410: 6c 2d 74 79 70 65 20 73 70 65 63 69 66 69 63 20  l-type specific 
2420: 63 6c 65 61 6e 75 70 20 77 68 65 6e 20 74 68 65  cleanup when the
2430: 20 63 68 61 6e 6e 65 6c 20 69 73 20 63 6c 6f 73   channel is clos
2440: 65 64 2e 20 41 6c 6c 0a 20 2a 09 71 75 65 75 65  ed. All. *.queue
2450: 64 20 6f 75 74 70 75 74 20 69 73 20 66 6c 75 73  d output is flus
2460: 68 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  hed prior to cal
2470: 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
2480: 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  on.. *. * Return
2490: 73 3a 0a 20 2a 09 30 20 69 66 20 73 75 63 63 65  s:. *.0 if succe
24a0: 73 73 66 75 6c 20 6f 72 20 50 4f 53 49 58 20 65  ssful or POSIX e
24b0: 72 72 6f 72 20 63 6f 64 65 20 69 66 20 66 61 69  rror code if fai
24c0: 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  led.. *. * Side 
24d0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 44 65 6c 65  effects:. *.Dele
24e0: 74 65 73 20 73 74 6f 72 65 64 20 73 74 61 74 65  tes stored state
24f0: 20 64 61 74 61 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d   data.. *. *----
2500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2540: 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 43 6c   */.int DigestCl
2550: 6f 73 65 50 72 6f 63 28 43 6c 69 65 6e 74 44 61  oseProc(ClientDa
2560: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
2570: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2580: 70 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53  p) {.    DigestS
2590: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
25a0: 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 29   (DigestState *)
25b0: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20   clientData;..  
25c0: 20 20 2f 2a 20 43 61 6e 63 65 6c 20 61 63 74 69    /* Cancel acti
25d0: 76 65 20 74 69 6d 65 72 2c 20 69 66 20 61 6e 79  ve timer, if any
25e0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74   */.    if (stat
25f0: 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28  ePtr->timer != (
2600: 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20  Tcl_TimerToken) 
2610: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c  NULL) {..Tcl_Del
2620: 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28  eteTimerHandler(
2630: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29  statePtr->timer)
2640: 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d  ;..statePtr->tim
2650: 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54  er = (Tcl_TimerT
2660: 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 20 20 20 20  oken) NULL;.    
2670: 7d 0a 0a 20 20 20 20 2f 2a 20 4f 75 74 70 75 74  }..    /* Output
2680: 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20   message digest 
2690: 69 66 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 64  if not already d
26a0: 6f 6e 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 21  one */.    if (!
26b0: 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73  (statePtr->flags
26c0: 20 26 20 43 48 41 4e 5f 45 4f 46 29 29 20 7b 0a   & CHAN_EOF)) {.
26d0: 09 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 70 61 72  .Tcl_Channel par
26e0: 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 61  ent = Tcl_GetSta
26f0: 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 61 74  ckedChannel(stat
2700: 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 09 54 63  ePtr->self);..Tc
2710: 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a  l_Obj *resultObj
2720: 3b 0a 09 69 6e 74 20 77 72 69 74 74 65 6e 3b 0a  ;..int written;.
2730: 0a 09 69 66 20 28 44 69 67 65 73 74 46 69 6e 61  ..if (DigestFina
2740: 6c 69 7a 65 28 73 74 61 74 65 50 74 72 2d 3e 69  lize(statePtr->i
2750: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c  nterp, statePtr,
2760: 20 26 72 65 73 75 6c 74 4f 62 6a 29 20 3d 3d 20   &resultObj) == 
2770: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 75  TCL_OK) {..    u
2780: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
2790: 74 61 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65  ta = Tcl_GetByte
27a0: 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 72 65 73  ArrayFromObj(res
27b0: 75 6c 74 4f 62 6a 2c 20 26 77 72 69 74 74 65 6e  ultObj, &written
27c0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 57 72 69 74  );..    Tcl_Writ
27d0: 65 52 61 77 28 70 61 72 65 6e 74 2c 20 64 61 74  eRaw(parent, dat
27e0: 61 2c 20 77 72 69 74 74 65 6e 29 3b 0a 09 20 20  a, written);..  
27f0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
2800: 6e 74 28 72 65 73 75 6c 74 4f 62 6a 29 3b 0a 09  nt(resultObj);..
2810: 7d 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61  }..statePtr->fla
2820: 67 73 20 7c 3d 20 43 48 41 4e 5f 45 4f 46 3b 0a  gs |= CHAN_EOF;.
2830: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c      }..    /* Cl
2840: 65 61 6e 2d 75 70 20 2a 2f 0a 20 20 20 20 44 69  ean-up */.    Di
2850: 67 65 73 74 53 74 61 74 65 46 72 65 65 28 73 74  gestStateFree(st
2860: 61 74 65 50 74 72 29 3b 0a 20 20 20 20 72 65 74  atePtr);.    ret
2870: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  urn 0;.}../*. * 
2880: 53 61 6d 65 20 61 73 20 44 69 67 65 73 74 43 6c  Same as DigestCl
2890: 6f 73 65 50 72 6f 63 20 62 75 74 20 77 69 74 68  oseProc but with
28a0: 20 69 6e 64 69 76 69 64 75 61 6c 20 72 65 61 64   individual read
28b0: 20 61 6e 64 20 77 72 69 74 65 20 63 6c 6f 73 65   and write close
28c0: 20 63 6f 6e 74 72 6f 6c 0a 20 2a 2f 0a 73 74 61   control. */.sta
28d0: 74 69 63 20 69 6e 74 20 44 69 67 65 73 74 43 6c  tic int DigestCl
28e0: 6f 73 65 32 50 72 6f 63 28 43 6c 69 65 6e 74 44  ose2Proc(ClientD
28f0: 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61  ata instanceData
2900: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
2910: 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  terp, int flags)
2920: 20 7b 0a 0a 20 20 20 20 69 66 20 28 28 66 6c 61   {..    if ((fla
2930: 67 73 20 26 20 28 54 43 4c 5f 43 4c 4f 53 45 5f  gs & (TCL_CLOSE_
2940: 52 45 41 44 20 7c 20 54 43 4c 5f 43 4c 4f 53 45  READ | TCL_CLOSE
2950: 5f 57 52 49 54 45 29 29 20 3d 3d 20 30 29 20 7b  _WRITE)) == 0) {
2960: 0a 09 72 65 74 75 72 6e 20 44 69 67 65 73 74 43  ..return DigestC
2970: 6c 6f 73 65 50 72 6f 63 28 69 6e 73 74 61 6e 63  loseProc(instanc
2980: 65 44 61 74 61 2c 20 69 6e 74 65 72 70 29 3b 0a  eData, interp);.
2990: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
29a0: 20 45 49 4e 56 41 4c 3b 0a 7d 0a 0a 2f 2a 0a 20   EINVAL;.}../*. 
29b0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
29c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29f0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69  -------. *. * Di
2a00: 67 65 73 74 49 6e 70 75 74 50 72 6f 63 20 2d 2d  gestInputProc --
2a10: 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79  . *. *.Called by
2a20: 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20   the generic IO 
2a30: 73 79 73 74 65 6d 20 74 6f 20 72 65 61 64 20 64  system to read d
2a40: 61 74 61 20 66 72 6f 6d 20 74 72 61 6e 73 66 6f  ata from transfo
2a50: 72 6d 20 61 6e 64 0a 20 2a 09 70 6c 61 63 65 20  rm and. *.place 
2a60: 69 6e 20 62 75 66 2e 20 54 72 61 6e 73 66 6f 72  in buf. Transfor
2a70: 6d 20 67 65 74 73 20 64 61 74 61 20 66 72 6f 6d  m gets data from
2a80: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
2a90: 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52  channel.. *. * R
2aa0: 65 74 75 72 6e 73 3a 0a 20 2a 09 54 6f 74 61 6c  eturns:. *.Total
2ab0: 20 62 79 74 65 73 20 72 65 61 64 20 6f 72 20 2d   bytes read or -
2ac0: 31 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 20 61  1 for an error a
2ad0: 6c 6f 6e 67 20 77 69 74 68 20 61 20 50 4f 53 49  long with a POSI
2ae0: 58 20 65 72 72 6f 72 0a 20 2a 09 63 6f 64 65 20  X error. *.code 
2af0: 69 6e 20 65 72 72 6f 72 43 6f 64 65 50 74 72 2e  in errorCodePtr.
2b00: 20 55 73 65 20 45 41 47 41 49 4e 20 66 6f 72 20   Use EAGAIN for 
2b10: 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 61 6e 64 20  nonblocking and 
2b20: 6e 6f 20 64 61 74 61 2e 0a 20 2a 0a 20 2a 20 53  no data.. *. * S
2b30: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
2b40: 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 74  Read data from t
2b50: 72 61 6e 73 66 6f 72 6d 20 61 6e 64 20 77 72 69  ransform and wri
2b60: 74 65 20 74 6f 20 62 75 66 0a 20 2a 0a 20 2a 2d  te to buf. *. *-
2b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2bb0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69  -----. */.int Di
2bc0: 67 65 73 74 49 6e 70 75 74 50 72 6f 63 28 43 6c  gestInputProc(Cl
2bd0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
2be0: 61 74 61 2c 20 63 68 61 72 20 2a 62 75 66 2c 20  ata, char *buf, 
2bf0: 69 6e 74 20 74 6f 52 65 61 64 2c 20 69 6e 74 20  int toRead, int 
2c00: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 20 7b  *errorCodePtr) {
2c10: 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65  .    DigestState
2c20: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44 69   *statePtr = (Di
2c30: 67 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69  gestState *) cli
2c40: 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 54 63 6c  entData;.    Tcl
2c50: 5f 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 3b  _Channel parent;
2c60: 0a 20 20 20 20 69 6e 74 20 72 65 61 64 3b 0a 20  .    int read;. 
2c70: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72     *errorCodePtr
2c80: 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 41 62   = 0;..    /* Ab
2c90: 6f 72 74 20 69 66 20 6e 6f 74 68 69 6e 67 20 74  ort if nothing t
2ca0: 6f 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 20  o process */.   
2cb0: 20 69 66 20 28 74 6f 52 65 61 64 20 3c 3d 20 30   if (toRead <= 0
2cc0: 20 7c 7c 20 73 74 61 74 65 50 74 72 2d 3e 73 65   || statePtr->se
2cd0: 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e  lf == (Tcl_Chann
2ce0: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74  el) NULL) {..ret
2cf0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  urn 0;.    }..  
2d00: 20 20 2f 2a 20 47 65 74 20 62 79 74 65 73 20 66    /* Get bytes f
2d10: 72 6f 6d 20 75 6e 64 65 72 6c 79 69 6e 67 20 63  rom underlying c
2d20: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 70 61  hannel */.    pa
2d30: 72 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74  rent = Tcl_GetSt
2d40: 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 61  ackedChannel(sta
2d50: 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 20 20  tePtr->self);.  
2d60: 20 20 72 65 61 64 20 3d 20 54 63 6c 5f 52 65 61    read = Tcl_Rea
2d70: 64 52 61 77 28 70 61 72 65 6e 74 2c 20 62 75 66  dRaw(parent, buf
2d80: 2c 20 74 6f 52 65 61 64 29 3b 0a 0a 20 20 20 20  , toRead);..    
2d90: 2f 2a 20 55 70 64 61 74 65 20 68 61 73 68 20 66  /* Update hash f
2da0: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69  unction */.    i
2db0: 66 20 28 72 65 61 64 20 3e 20 30 29 20 7b 0a 09  f (read > 0) {..
2dc0: 2f 2a 20 48 61 76 65 20 64 61 74 61 20 2a 2f 0a  /* Have data */.
2dd0: 09 69 66 20 28 44 69 67 65 73 74 55 70 64 61 74  .if (DigestUpdat
2de0: 65 28 73 74 61 74 65 50 74 72 2c 20 62 75 66 2c  e(statePtr, buf,
2df0: 20 28 73 69 7a 65 5f 74 29 20 72 65 61 64 2c 20   (size_t) read, 
2e00: 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  0) != TCL_OK) {.
2e10: 09 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e  .    Tcl_SetChan
2e20: 6e 65 6c 45 72 72 6f 72 28 73 74 61 74 65 50 74  nelError(statePt
2e30: 72 2d 3e 73 65 6c 66 2c 20 54 63 6c 5f 4f 62 6a  r->self, Tcl_Obj
2e40: 50 72 69 6e 74 66 28 22 55 70 64 61 74 65 20 66  Printf("Update f
2e50: 61 69 6c 65 64 3a 20 25 73 22 2c 20 52 45 41 53  ailed: %s", REAS
2e60: 4f 4e 28 29 29 29 3b 0a 09 20 20 20 20 2a 65 72  ON()));..    *er
2e70: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49 4e  rorCodePtr = EIN
2e80: 56 41 4c 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  VAL;..    return
2e90: 20 30 3b 0a 09 7d 0a 09 2f 2a 20 54 68 69 73 20   0;..}../* This 
2ea0: 69 73 20 63 6f 72 72 65 63 74 20 2a 2f 0a 09 72  is correct */..r
2eb0: 65 61 64 20 3d 20 2d 31 3b 0a 09 2a 65 72 72 6f  ead = -1;..*erro
2ec0: 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49  rCodePtr = EAGAI
2ed0: 4e 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  N;..    } else i
2ee0: 66 20 28 72 65 61 64 20 3c 20 30 29 20 7b 0a 09  f (read < 0) {..
2ef0: 2f 2a 20 45 72 72 6f 72 20 2a 2f 0a 09 2a 65 72  /* Error */..*er
2f00: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 54 63 6c  rorCodePtr = Tcl
2f10: 5f 47 65 74 45 72 72 6e 6f 28 29 3b 0a 0a 20 20  _GetErrno();..  
2f20: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 21 28 73    } else if (!(s
2f30: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26  tatePtr->flags &
2f40: 20 43 48 41 4e 5f 45 4f 46 29 29 20 7b 0a 09 2f   CHAN_EOF)) {../
2f50: 2a 20 45 4f 46 20 2a 2f 0a 09 54 63 6c 5f 4f 62  * EOF */..Tcl_Ob
2f60: 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 3b 0a 09 69  j *resultObj;..i
2f70: 66 20 28 44 69 67 65 73 74 46 69 6e 61 6c 69 7a  f (DigestFinaliz
2f80: 65 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  e(statePtr->inte
2f90: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 26 72  rp, statePtr, &r
2fa0: 65 73 75 6c 74 4f 62 6a 29 20 3d 3d 20 54 43 4c  esultObj) == TCL
2fb0: 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 75 6e 73 69  _OK) {..    unsi
2fc0: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20  gned char *data 
2fd0: 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
2fe0: 61 79 46 72 6f 6d 4f 62 6a 28 72 65 73 75 6c 74  ayFromObj(result
2ff0: 4f 62 6a 2c 20 26 72 65 61 64 29 3b 0a 09 20 20  Obj, &read);..  
3000: 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 64 61    memcpy(buf, da
3010: 74 61 2c 20 72 65 61 64 29 3b 0a 09 20 20 20 20  ta, read);..    
3020: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
3030: 28 72 65 73 75 6c 74 4f 62 6a 29 3b 0a 0a 09 7d  (resultObj);...}
3040: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 54 63 6c   else {..    Tcl
3050: 5f 53 65 74 43 68 61 6e 6e 65 6c 45 72 72 6f 72  _SetChannelError
3060: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c  (statePtr->self,
3070: 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 22   Tcl_ObjPrintf("
3080: 46 69 6e 61 6c 69 7a 65 20 66 61 69 6c 65 64 3a  Finalize failed:
3090: 20 25 73 22 2c 20 52 45 41 53 4f 4e 28 29 29 29   %s", REASON()))
30a0: 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64  ;..    *errorCod
30b0: 65 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 09  ePtr = EINVAL;..
30c0: 20 20 20 20 72 65 61 64 20 3d 20 30 3b 0a 09 7d      read = 0;..}
30d0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67  ..statePtr->flag
30e0: 73 20 7c 3d 20 43 48 41 4e 5f 45 4f 46 3b 0a 20  s |= CHAN_EOF;. 
30f0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
3100: 72 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d  read;.}../*. *--
3110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3150: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73  ----. *. * Diges
3160: 74 4f 75 74 70 75 74 50 72 6f 63 20 2d 2d 0a 20  tOutputProc --. 
3170: 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79 20 74  *. *.Called by t
3180: 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 73 79  he generic IO sy
3190: 73 74 65 6d 20 74 6f 20 77 72 69 74 65 20 64 61  stem to write da
31a0: 74 61 20 69 6e 20 62 75 66 20 74 6f 20 74 72 61  ta in buf to tra
31b0: 6e 73 66 6f 72 6d 2e 0a 20 2a 09 54 68 65 20 74  nsform.. *.The t
31c0: 72 61 6e 73 66 6f 72 6d 20 77 72 69 74 65 73 20  ransform writes 
31d0: 74 68 65 20 72 65 73 75 6c 74 20 74 6f 20 74 68  the result to th
31e0: 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 68 61  e underlying cha
31f0: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 74 75  nnel.. *. * Retu
3200: 72 6e 73 3a 0a 20 2a 09 54 6f 74 61 6c 20 62 79  rns:. *.Total by
3210: 74 65 73 20 77 72 69 74 74 65 6e 20 6f 72 20 2d  tes written or -
3220: 31 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 20 61  1 for an error a
3230: 6c 6f 6e 67 20 77 69 74 68 20 61 20 50 4f 53 49  long with a POSI
3240: 58 20 65 72 72 6f 72 0a 20 2a 09 63 6f 64 65 20  X error. *.code 
3250: 69 6e 20 65 72 72 6f 72 43 6f 64 65 50 74 72 2e  in errorCodePtr.
3260: 20 55 73 65 20 45 41 47 41 49 4e 20 66 6f 72 20   Use EAGAIN for 
3270: 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 61 6e 64 20  nonblocking and 
3280: 63 61 6e 27 74 20 77 72 69 74 65 20 64 61 74 61  can't write data
3290: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
32a0: 65 63 74 73 3a 0a 20 2a 09 47 65 74 20 64 61 74  ects:. *.Get dat
32b0: 61 20 66 72 6f 6d 20 62 75 66 20 61 6e 64 20 75  a from buf and u
32c0: 70 64 61 74 65 20 64 69 67 65 73 74 0a 20 2a 0a  pdate digest. *.
32d0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
32e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
32f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3310: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 20 69 6e  --------. */. in
3320: 74 20 44 69 67 65 73 74 4f 75 74 70 75 74 50 72  t DigestOutputPr
3330: 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  oc(ClientData cl
3340: 69 65 6e 74 44 61 74 61 2c 20 63 6f 6e 73 74 20  ientData, const 
3350: 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 74  char *buf, int t
3360: 6f 57 72 69 74 65 2c 20 69 6e 74 20 2a 65 72 72  oWrite, int *err
3370: 6f 72 43 6f 64 65 50 74 72 29 20 7b 0a 20 20 20  orCodePtr) {.   
3380: 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74   DigestState *st
3390: 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 74  atePtr = (Digest
33a0: 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44  State *) clientD
33b0: 61 74 61 3b 0a 20 20 20 20 2a 65 72 72 6f 72 43  ata;.    *errorC
33c0: 6f 64 65 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20  odePtr = 0;..   
33d0: 20 2f 2a 20 41 62 6f 72 74 20 69 66 20 6e 6f 74   /* Abort if not
33e0: 68 69 6e 67 20 74 6f 20 70 72 6f 63 65 73 73 20  hing to process 
33f0: 2a 2f 0a 20 20 20 20 69 66 20 28 74 6f 57 72 69  */.    if (toWri
3400: 74 65 20 3c 3d 20 30 20 7c 7c 20 73 74 61 74 65  te <= 0 || state
3410: 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63  Ptr->self == (Tc
3420: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29  l_Channel) NULL)
3430: 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20   {..return 0;.  
3440: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61    }..    /* Upda
3450: 74 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e  te hash function
3460: 20 2a 2f 0a 20 20 20 20 69 66 20 28 74 6f 57 72   */.    if (toWr
3470: 69 74 65 20 3e 20 30 20 26 26 20 44 69 67 65 73  ite > 0 && Diges
3480: 74 55 70 64 61 74 65 28 73 74 61 74 65 50 74 72  tUpdate(statePtr
3490: 2c 20 62 75 66 2c 20 28 73 69 7a 65 5f 74 29 20  , buf, (size_t) 
34a0: 74 6f 57 72 69 74 65 2c 20 30 29 20 21 3d 20 54  toWrite, 0) != T
34b0: 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 53 65  CL_OK) {..Tcl_Se
34c0: 74 43 68 61 6e 6e 65 6c 45 72 72 6f 72 28 73 74  tChannelError(st
34d0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 54 63  atePtr->self, Tc
34e0: 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 22 55 70 64  l_ObjPrintf("Upd
34f0: 61 74 65 20 66 61 69 6c 65 64 3a 20 25 73 22 2c  ate failed: %s",
3500: 20 52 45 41 53 4f 4e 28 29 29 29 3b 0a 09 2a 65   REASON()));..*e
3510: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49  rrorCodePtr = EI
3520: 4e 56 41 4c 3b 0a 09 72 65 74 75 72 6e 20 30 3b  NVAL;..return 0;
3530: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
3540: 6e 20 74 6f 57 72 69 74 65 3b 0a 7d 0a 0a 2f 2a  n toWrite;.}../*
3550: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
3560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
35a0: 44 69 67 65 73 74 53 65 74 4f 70 74 69 6f 6e 50  DigestSetOptionP
35b0: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c  roc --. *. *.Cal
35c0: 6c 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72  led by the gener
35d0: 69 63 20 49 4f 20 73 79 73 74 65 6d 20 74 6f 20  ic IO system to 
35e0: 73 65 74 20 63 68 61 6e 6e 65 6c 20 6f 70 74 69  set channel opti
35f0: 6f 6e 20 6e 61 6d 65 20 74 6f 20 76 61 6c 75 65  on name to value
3600: 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a  .. *. * Returns:
3610: 0a 20 2a 09 54 43 4c 5f 4f 4b 20 69 66 20 73 75  . *.TCL_OK if su
3620: 63 63 65 73 73 66 75 6c 20 6f 72 20 54 43 4c 5f  ccessful or TCL_
3630: 45 52 52 4f 52 20 69 66 20 66 61 69 6c 65 64 20  ERROR if failed 
3640: 61 6c 6f 6e 67 20 77 69 74 68 20 61 6e 20 65 72  along with an er
3650: 72 6f 72 0a 20 2a 09 6d 65 73 73 61 67 65 20 69  ror. *.message i
3660: 6e 20 69 6e 74 65 72 70 20 61 6e 64 20 54 63 6c  n interp and Tcl
3670: 5f 53 65 74 45 72 72 6e 6f 2e 0a 20 2a 0a 20 2a  _SetErrno.. *. *
3680: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
3690: 2a 09 55 70 64 61 74 65 73 20 63 68 61 6e 6e 65  *.Updates channe
36a0: 6c 20 6f 70 74 69 6f 6e 20 74 6f 20 6e 65 77 20  l option to new 
36b0: 76 61 6c 75 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  value.. *. *----
36c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3700: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
3710: 74 20 44 69 67 65 73 74 53 65 74 4f 70 74 69 6f  t DigestSetOptio
3720: 6e 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61  nProc(ClientData
3730: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
3740: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
3750: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70 74   const char *opt
3760: 69 6f 6e 4e 61 6d 65 2c 0a 09 63 6f 6e 73 74 20  ionName,..const 
3770: 63 68 61 72 20 2a 6f 70 74 69 6f 6e 56 61 6c 75  char *optionValu
3780: 65 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53  e) {.    DigestS
3790: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
37a0: 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 29   (DigestState *)
37b0: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20   clientData;.   
37c0: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 70 61 72   Tcl_Channel par
37d0: 65 6e 74 3b 0a 20 20 20 20 54 63 6c 5f 44 72 69  ent;.    Tcl_Dri
37e0: 76 65 72 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63  verSetOptionProc
37f0: 20 2a 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 3b   *setOptionProc;
3800: 0a 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 69  ..    /* Abort i
3810: 66 20 6e 6f 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  f no channel */.
3820: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
3830: 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43  ->self == (Tcl_C
3840: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a  hannel) NULL) {.
3850: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
3860: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
3870: 20 44 65 6c 65 67 61 74 65 20 6f 70 74 69 6f 6e   Delegate option
3880: 73 20 64 6f 77 6e 73 74 72 65 61 6d 20 2a 2f 0a  s downstream */.
3890: 20 20 20 20 70 61 72 65 6e 74 20 3d 20 54 63 6c      parent = Tcl
38a0: 5f 47 65 74 53 74 61 63 6b 65 64 43 68 61 6e 6e  _GetStackedChann
38b0: 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  el(statePtr->sel
38c0: 66 29 3b 0a 20 20 20 20 73 65 74 4f 70 74 69 6f  f);.    setOptio
38d0: 6e 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68 61 6e  nProc = Tcl_Chan
38e0: 6e 65 6c 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63  nelSetOptionProc
38f0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54  (Tcl_GetChannelT
3900: 79 70 65 28 70 61 72 65 6e 74 29 29 3b 0a 20 20  ype(parent));.  
3910: 20 20 69 66 20 28 73 65 74 4f 70 74 69 6f 6e 50    if (setOptionP
3920: 72 6f 63 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  roc != NULL) {..
3930: 72 65 74 75 72 6e 20 28 2a 73 65 74 4f 70 74 69  return (*setOpti
3940: 6f 6e 50 72 6f 63 29 28 54 63 6c 5f 47 65 74 43  onProc)(Tcl_GetC
3950: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61  hannelInstanceDa
3960: 74 61 28 70 61 72 65 6e 74 29 2c 20 69 6e 74 65  ta(parent), inte
3970: 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20  rp, optionName, 
3980: 6f 70 74 69 6f 6e 56 61 6c 75 65 29 3b 0a 20 20  optionValue);.  
3990: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f    } else {..Tcl_
39a0: 53 65 74 45 72 72 6e 6f 28 45 49 4e 56 41 4c 29  SetErrno(EINVAL)
39b0: 3b 0a 09 72 65 74 75 72 6e 20 54 63 6c 5f 42 61  ;..return Tcl_Ba
39c0: 64 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  dChannelOption(i
39d0: 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d  nterp, optionNam
39e0: 65 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a  e, NULL);.    }.
39f0: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
3a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
3a40: 2a 0a 20 2a 20 44 69 67 65 73 74 47 65 74 4f 70  *. * DigestGetOp
3a50: 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20  tionProc --. *. 
3a60: 2a 09 43 61 6c 6c 65 64 20 62 79 20 74 68 65 20  *.Called by the 
3a70: 67 65 6e 65 72 69 63 20 49 4f 20 73 79 73 74 65  generic IO syste
3a80: 6d 20 74 6f 20 67 65 74 20 63 68 61 6e 6e 65 6c  m to get channel
3a90: 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 27 73 20 76   option name's v
3aa0: 61 6c 75 65 2e 0a 20 2a 0a 20 2a 20 52 65 74 75  alue.. *. * Retu
3ab0: 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 69  rns:. *.TCL_OK i
3ac0: 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20  f successful or 
3ad0: 54 43 4c 5f 45 52 52 4f 52 20 69 66 20 66 61 69  TCL_ERROR if fai
3ae0: 6c 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 61  led along with a
3af0: 6e 20 65 72 72 6f 72 0a 20 2a 09 6d 65 73 73 61  n error. *.messa
3b00: 67 65 20 69 6e 20 69 6e 74 65 72 70 20 61 6e 64  ge in interp and
3b10: 20 54 63 6c 5f 53 65 74 45 72 72 6e 6f 2e 0a 20   Tcl_SetErrno.. 
3b20: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
3b30: 73 3a 0a 20 2a 09 53 65 74 73 20 72 65 73 75 6c  s:. *.Sets resul
3b40: 74 20 74 6f 20 6f 70 74 69 6f 6e 27 73 20 76 61  t to option's va
3b50: 6c 75 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  lue. *. *-------
3b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
3ba0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44   */.static int D
3bb0: 69 67 65 73 74 47 65 74 4f 70 74 69 6f 6e 50 72  igestGetOptionPr
3bc0: 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  oc(ClientData cl
3bd0: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e  ientData, Tcl_In
3be0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 63 6f  terp *interp, co
3bf0: 6e 73 74 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e  nst char *option
3c00: 4e 61 6d 65 2c 0a 09 54 63 6c 5f 44 53 74 72 69  Name,..Tcl_DStri
3c10: 6e 67 20 2a 6f 70 74 69 6f 6e 56 61 6c 75 65 29  ng *optionValue)
3c20: 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74 61   {.    DigestSta
3c30: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
3c40: 44 69 67 65 73 74 53 74 61 74 65 20 2a 29 20 63  DigestState *) c
3c50: 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 54  lientData;.    T
3c60: 63 6c 5f 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e  cl_Channel paren
3c70: 74 3b 0a 20 20 20 20 54 63 6c 5f 44 72 69 76 65  t;.    Tcl_Drive
3c80: 72 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2a  rGetOptionProc *
3c90: 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 3b 0a 0a  getOptionProc;..
3ca0: 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 69 66 20      /* Abort if 
3cb0: 6e 6f 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20  no channel */.  
3cc0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
3cd0: 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61  self == (Tcl_Cha
3ce0: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72  nnel) NULL) {..r
3cf0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
3d00: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
3d10: 65 6c 65 67 61 74 65 20 6f 70 74 69 6f 6e 73 20  elegate options 
3d20: 64 6f 77 6e 73 74 72 65 61 6d 20 2a 2f 0a 20 20  downstream */.  
3d30: 20 20 70 61 72 65 6e 74 20 3d 20 54 63 6c 5f 47    parent = Tcl_G
3d40: 65 74 53 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c  etStackedChannel
3d50: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
3d60: 3b 0a 20 20 20 20 67 65 74 4f 70 74 69 6f 6e 50  ;.    getOptionP
3d70: 72 6f 63 20 3d 20 54 63 6c 5f 43 68 61 6e 6e 65  roc = Tcl_Channe
3d80: 6c 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 54  lGetOptionProc(T
3d90: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70  cl_GetChannelTyp
3da0: 65 28 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20  e(parent));.    
3db0: 69 66 20 28 67 65 74 4f 70 74 69 6f 6e 50 72 6f  if (getOptionPro
3dc0: 63 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  c != NULL) {..re
3dd0: 74 75 72 6e 20 28 2a 67 65 74 4f 70 74 69 6f 6e  turn (*getOption
3de0: 50 72 6f 63 29 28 54 63 6c 5f 47 65 74 43 68 61  Proc)(Tcl_GetCha
3df0: 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61  nnelInstanceData
3e00: 28 70 61 72 65 6e 74 29 2c 20 69 6e 74 65 72 70  (parent), interp
3e10: 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 6f 70  , optionName, op
3e20: 74 69 6f 6e 56 61 6c 75 65 29 3b 0a 20 20 20 20  tionValue);.    
3e30: 7d 20 65 6c 73 65 20 69 66 20 28 6f 70 74 69 6f  } else if (optio
3e40: 6e 4e 61 6d 65 20 3d 3d 20 28 63 68 61 72 2a 29  nName == (char*)
3e50: 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 52 65 71   NULL) {../* Req
3e60: 75 65 73 74 20 69 73 20 71 75 65 72 79 20 66 6f  uest is query fo
3e70: 72 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 2c 20 74  r all options, t
3e80: 68 69 73 20 69 73 20 6f 6b 2e 20 2a 2f 0a 09 72  his is ok. */..r
3e90: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20  eturn TCL_OK;.  
3ea0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f    } else {..Tcl_
3eb0: 53 65 74 45 72 72 6e 6f 28 45 49 4e 56 41 4c 29  SetErrno(EINVAL)
3ec0: 3b 0a 09 72 65 74 75 72 6e 20 54 63 6c 5f 42 61  ;..return Tcl_Ba
3ed0: 64 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  dChannelOption(i
3ee0: 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d  nterp, optionNam
3ef0: 65 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a  e, NULL);.    }.
3f00: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
3f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
3f50: 2a 0a 20 2a 20 44 69 67 65 73 74 54 69 6d 65 72  *. * DigestTimer
3f60: 48 61 6e 64 6c 65 72 20 2d 2d 0a 20 2a 0a 20 2a  Handler --. *. *
3f70: 09 43 61 6c 6c 65 64 20 62 79 20 74 68 65 20 6e  .Called by the n
3f80: 6f 74 69 66 69 65 72 20 76 69 61 20 74 69 6d 65  otifier via time
3f90: 72 20 74 6f 20 66 6c 75 73 68 20 6f 75 74 20 70  r to flush out p
3fa0: 65 6e 64 69 6e 67 20 69 6e 70 75 74 20 64 61 74  ending input dat
3fb0: 61 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73  a.. *. * Returns
3fc0: 3a 0a 20 2a 09 4e 6f 74 68 69 6e 67 0a 20 2a 0a  :. *.Nothing. *.
3fd0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
3fe0: 0a 20 2a 09 4d 61 79 20 63 61 6c 6c 20 54 63 6c  . *.May call Tcl
3ff0: 5f 4e 6f 74 69 66 79 43 68 61 6e 6e 65 6c 0a 20  _NotifyChannel. 
4000: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
4010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
4050: 74 61 74 69 63 20 76 6f 69 64 20 44 69 67 65 73  tatic void Diges
4060: 74 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 43 6c  tTimerHandler(Cl
4070: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
4080: 61 74 61 29 20 7b 0a 20 20 20 20 44 69 67 65 73  ata) {.    Diges
4090: 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72  tState *statePtr
40a0: 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20   = (DigestState 
40b0: 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a  *) clientData;..
40c0: 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 69 66 20      /* Abort if 
40d0: 6e 6f 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20  no channel */.  
40e0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
40f0: 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61  self == (Tcl_Cha
4100: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72  nnel) NULL) {..r
4110: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20  eturn;.    }..  
4120: 20 20 2f 2a 20 43 6c 65 61 72 20 74 69 6d 65 72    /* Clear timer
4130: 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 73 74   token */.    st
4140: 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20  atePtr->timer = 
4150: 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29  (Tcl_TimerToken)
4160: 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 46   NULL;..    /* F
4170: 69 72 65 20 65 76 65 6e 74 20 69 66 20 74 68 65  ire event if the
4180: 72 65 20 69 73 20 70 65 6e 64 69 6e 67 20 64 61  re is pending da
4190: 74 61 2c 20 73 6b 69 70 20 6f 74 68 65 72 77 69  ta, skip otherwi
41a0: 73 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 73  se */.    if ((s
41b0: 74 61 74 65 50 74 72 2d 3e 77 61 74 63 68 4d 61  tatePtr->watchMa
41c0: 73 6b 20 26 20 54 43 4c 5f 52 45 41 44 41 42 4c  sk & TCL_READABL
41d0: 45 29 20 26 26 20 28 54 63 6c 5f 49 6e 70 75 74  E) && (Tcl_Input
41e0: 42 75 66 66 65 72 65 64 28 73 74 61 74 65 50 74  Buffered(statePt
41f0: 72 2d 3e 73 65 6c 66 29 20 3e 20 30 29 29 20 7b  r->self) > 0)) {
4200: 0a 09 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61 6e  ..Tcl_NotifyChan
4210: 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 65  nel(statePtr->se
4220: 6c 66 2c 20 54 43 4c 5f 52 45 41 44 41 42 4c 45  lf, TCL_READABLE
4230: 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20  );.    }.}../*. 
4240: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
4250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4280: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69  -------. *. * Di
4290: 67 65 73 74 57 61 74 63 68 50 72 6f 63 20 2d 2d  gestWatchProc --
42a0: 0a 20 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a  . *. *.Initializ
42b0: 65 20 74 68 65 20 6e 6f 74 69 66 69 65 72 20 74  e the notifier t
42c0: 6f 20 77 61 74 63 68 20 66 6f 72 20 65 76 65 6e  o watch for even
42d0: 74 73 20 66 72 6f 6d 20 74 68 69 73 20 63 68 61  ts from this cha
42e0: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 74 75  nnel.. *. * Retu
42f0: 72 6e 73 3a 0a 20 2a 09 4e 6f 74 68 69 6e 67 20  rns:. *.Nothing 
4300: 28 63 61 6e 27 74 20 72 65 74 75 72 6e 20 65 72  (can't return er
4310: 72 6f 72 20 6d 65 73 73 61 67 65 73 29 0a 20 2a  ror messages). *
4320: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
4330: 3a 0a 20 2a 09 43 6f 6e 66 69 67 75 72 65 20 6e  :. *.Configure n
4340: 6f 74 69 66 69 65 72 20 73 6f 20 66 75 74 75 72  otifier so futur
4350: 65 20 65 76 65 6e 74 73 20 6f 6e 20 74 68 65 20  e events on the 
4360: 63 68 61 6e 6e 65 6c 20 77 69 6c 6c 20 62 65 20  channel will be 
4370: 73 65 65 6e 20 62 79 20 54 63 6c 2e 0a 20 2a 0a  seen by Tcl.. *.
4380: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
4390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43c0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69  --------. */.voi
43d0: 64 20 44 69 67 65 73 74 57 61 74 63 68 50 72 6f  d DigestWatchPro
43e0: 63 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  c(ClientData cli
43f0: 65 6e 74 44 61 74 61 2c 20 69 6e 74 20 6d 61 73  entData, int mas
4400: 6b 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53  k) {.    DigestS
4410: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
4420: 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 29   (DigestState *)
4430: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20   clientData;.   
4440: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 70 61 72   Tcl_Channel par
4450: 65 6e 74 3b 0a 20 20 20 20 54 63 6c 5f 44 72 69  ent;.    Tcl_Dri
4460: 76 65 72 57 61 74 63 68 50 72 6f 63 20 2a 77 61  verWatchProc *wa
4470: 74 63 68 50 72 6f 63 3b 0a 0a 20 20 20 20 2f 2a  tchProc;..    /*
4480: 20 41 62 6f 72 74 20 69 66 20 6e 6f 20 63 68 61   Abort if no cha
4490: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28  nnel */.    if (
44a0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d  statePtr->self =
44b0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
44c0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 3b  NULL) {..return;
44d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
44e0: 74 6f 72 65 20 4f 52 2d 65 64 20 63 6f 6d 62 69  tore OR-ed combi
44f0: 6e 61 74 69 6f 6e 20 6f 66 20 54 43 4c 5f 52 45  nation of TCL_RE
4500: 41 44 41 42 4c 45 2c 20 54 43 4c 5f 57 52 49 54  ADABLE, TCL_WRIT
4510: 41 42 4c 45 20 61 6e 64 20 54 43 4c 5f 45 58 43  ABLE and TCL_EXC
4520: 45 50 54 49 4f 4e 20 2a 2f 0a 20 20 20 20 73 74  EPTION */.    st
4530: 61 74 65 50 74 72 2d 3e 77 61 74 63 68 4d 61 73  atePtr->watchMas
4540: 6b 20 3d 20 6d 61 73 6b 3b 0a 0a 20 20 20 20 2f  k = mask;..    /
4550: 2a 20 50 72 6f 70 61 67 61 74 65 20 6d 61 73 6b  * Propagate mask
4560: 20 69 6e 66 6f 20 74 6f 20 70 61 72 65 6e 74 20   info to parent 
4570: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 70  channel */.    p
4580: 61 72 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53  arent = Tcl_GetS
4590: 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74  tackedChannel(st
45a0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 20  atePtr->self);. 
45b0: 20 20 20 77 61 74 63 68 50 72 6f 63 20 3d 20 54     watchProc = T
45c0: 63 6c 5f 43 68 61 6e 6e 65 6c 57 61 74 63 68 50  cl_ChannelWatchP
45d0: 72 6f 63 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  roc(Tcl_GetChann
45e0: 65 6c 54 79 70 65 28 70 61 72 65 6e 74 29 29 3b  elType(parent));
45f0: 0a 20 20 20 20 77 61 74 63 68 50 72 6f 63 28 54  .    watchProc(T
4600: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73  cl_GetChannelIns
4610: 74 61 6e 63 65 44 61 74 61 28 70 61 72 65 6e 74  tanceData(parent
4620: 29 2c 20 6d 61 73 6b 29 3b 0a 0a 20 20 20 20 2f  ), mask);..    /
4630: 2a 20 52 65 6d 6f 76 65 20 70 65 6e 64 69 6e 67  * Remove pending
4640: 20 74 69 6d 65 72 20 2a 2f 0a 20 20 20 20 69 66   timer */.    if
4650: 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65   (statePtr->time
4660: 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54  r != (Tcl_TimerT
4670: 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54  oken) NULL) {..T
4680: 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61  cl_DeleteTimerHa
4690: 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e  ndler(statePtr->
46a0: 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74  timer);..statePt
46b0: 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f  r->timer = (Tcl_
46c0: 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c  TimerToken) NULL
46d0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
46e0: 49 66 20 74 68 65 72 65 20 69 73 20 64 61 74 61  If there is data
46f0: 20 70 65 6e 64 69 6e 67 2c 20 73 65 74 20 6e 65   pending, set ne
4700: 77 20 74 69 6d 65 72 20 74 6f 20 63 61 6c 6c 20  w timer to call 
4710: 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61 6e 6e 65  Tcl_NotifyChanne
4720: 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 6d 61  l */.    if ((ma
4730: 73 6b 20 26 20 54 43 4c 5f 52 45 41 44 41 42 4c  sk & TCL_READABL
4740: 45 29 20 26 26 20 28 54 63 6c 5f 49 6e 70 75 74  E) && (Tcl_Input
4750: 42 75 66 66 65 72 65 64 28 73 74 61 74 65 50 74  Buffered(statePt
4760: 72 2d 3e 73 65 6c 66 29 20 3e 20 30 29 29 20 7b  r->self) > 0)) {
4770: 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65  ..statePtr->time
4780: 72 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 54 69  r = Tcl_CreateTi
4790: 6d 65 72 48 61 6e 64 6c 65 72 28 52 45 41 44 5f  merHandler(READ_
47a0: 44 45 4c 41 59 2c 20 44 69 67 65 73 74 54 69 6d  DELAY, DigestTim
47b0: 65 72 48 61 6e 64 6c 65 72 2c 20 28 43 6c 69 65  erHandler, (Clie
47c0: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72  ntData) statePtr
47d0: 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20  );.    }.}../*. 
47e0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
47f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4820: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69  -------. *. * Di
4830: 67 65 73 74 47 65 74 48 61 6e 64 6c 65 50 72 6f  gestGetHandlePro
4840: 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65  c --. *. *.Calle
4850: 64 20 66 72 6f 6d 20 54 63 6c 5f 47 65 74 43 68  d from Tcl_GetCh
4860: 61 6e 6e 65 6c 48 61 6e 64 6c 65 20 74 6f 20 72  annelHandle to r
4870: 65 74 72 69 65 76 65 20 4f 53 20 73 70 65 63 69  etrieve OS speci
4880: 66 69 63 20 66 69 6c 65 20 68 61 6e 64 6c 65 0a  fic file handle.
4890: 20 2a 09 66 72 6f 6d 20 69 6e 73 69 64 65 20 74   *.from inside t
48a0: 68 69 73 20 63 68 61 6e 6e 65 6c 2e 20 4e 6f 74  his channel. Not
48b0: 20 75 73 65 64 20 66 6f 72 20 74 72 61 6e 73 66   used for transf
48c0: 6f 72 6d 61 74 69 6f 6e 73 3f 0a 20 2a 0a 20 2a  ormations?. *. *
48d0: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c   Returns:. *.TCL
48e0: 5f 4f 4b 20 66 6f 72 20 73 75 63 63 65 73 73 20  _OK for success 
48f0: 6f 72 20 54 43 4c 5f 45 52 52 4f 52 20 66 6f 72  or TCL_ERROR for
4900: 20 65 72 72 6f 72 20 6f 72 20 69 66 20 6e 6f 74   error or if not
4910: 20 73 75 70 70 6f 72 74 65 64 2e 20 49 66 0a 20   supported. If. 
4920: 2a 09 64 69 72 65 63 74 69 6f 6e 20 69 73 20 54  *.direction is T
4930: 43 4c 5f 52 45 41 44 41 42 4c 45 2c 20 73 65 74  CL_READABLE, set
4940: 73 20 68 61 6e 64 6c 65 50 74 72 20 74 6f 20 74  s handlePtr to t
4950: 68 65 20 68 61 6e 64 6c 65 20 75 73 65 64 20 66  he handle used f
4960: 6f 72 0a 20 2a 09 69 6e 70 75 74 2c 20 6f 72 20  or. *.input, or 
4970: 69 66 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 20  if TCL_WRITABLE 
4980: 73 65 74 73 20 74 6f 20 74 68 65 20 68 61 6e 64  sets to the hand
4990: 6c 65 20 75 73 65 64 20 66 6f 72 20 6f 75 74 70  le used for outp
49a0: 75 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ut.. *. * Side e
49b0: 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a  ffects:. *.None.
49c0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
49d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
4a10: 69 6e 74 20 44 69 67 65 73 74 47 65 74 48 61 6e  int DigestGetHan
4a20: 64 6c 65 50 72 6f 63 28 43 6c 69 65 6e 74 44 61  dleProc(ClientDa
4a30: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 69  ta clientData, i
4a40: 6e 74 20 64 69 72 65 63 74 69 6f 6e 2c 20 43 6c  nt direction, Cl
4a50: 69 65 6e 74 44 61 74 61 20 2a 68 61 6e 64 6c 65  ientData *handle
4a60: 50 74 72 29 20 7b 0a 20 20 20 20 44 69 67 65 73  Ptr) {.    Diges
4a70: 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72  tState *statePtr
4a80: 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20   = (DigestState 
4a90: 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20  *) clientData;. 
4aa0: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 70     Tcl_Channel p
4ab0: 61 72 65 6e 74 3b 0a 0a 20 20 20 20 2f 2a 20 41  arent;..    /* A
4ac0: 62 6f 72 74 20 69 66 20 6e 6f 20 63 68 61 6e 6e  bort if no chann
4ad0: 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74  el */.    if (st
4ae0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20  atePtr->self == 
4af0: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
4b00: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  LL) {..return TC
4b10: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
4b20: 20 20 20 20 70 61 72 65 6e 74 20 3d 20 54 63 6c      parent = Tcl
4b30: 5f 47 65 74 53 74 61 63 6b 65 64 43 68 61 6e 6e  _GetStackedChann
4b40: 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  el(statePtr->sel
4b50: 66 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  f);.    return T
4b60: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 48 61 6e  cl_GetChannelHan
4b70: 64 6c 65 28 70 61 72 65 6e 74 2c 20 64 69 72 65  dle(parent, dire
4b80: 63 74 69 6f 6e 2c 20 68 61 6e 64 6c 65 50 74 72  ction, handlePtr
4b90: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  );.}../*. *-----
4ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4be0: 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 4e 6f  -. *. * DigestNo
4bf0: 74 69 66 79 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20  tifyProc --. *. 
4c00: 2a 09 43 61 6c 6c 65 64 20 62 79 20 54 63 6c 20  *.Called by Tcl 
4c10: 74 6f 20 69 6e 66 6f 72 6d 20 75 73 20 6f 66 20  to inform us of 
4c20: 61 63 74 69 76 69 74 79 20 6f 6e 20 74 68 65 20  activity on the 
4c30: 75 6e 64 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e  underlying chann
4c40: 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  el.. *. * Return
4c50: 73 3a 0a 20 2a 09 55 6e 63 68 61 6e 67 65 64 20  s:. *.Unchanged 
4c60: 69 6e 74 65 72 65 73 74 4d 61 73 6b 20 77 68 69  interestMask whi
4c70: 63 68 20 69 73 20 61 6e 20 4f 52 2d 65 64 20 63  ch is an OR-ed c
4c80: 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 54 43  ombination of TC
4c90: 4c 5f 52 45 41 44 41 42 4c 45 20 6f 72 20 54 43  L_READABLE or TC
4ca0: 4c 5f 57 52 49 54 41 42 4c 45 0a 20 2a 0a 20 2a  L_WRITABLE. *. *
4cb0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
4cc0: 2a 09 43 61 6e 63 65 6c 73 20 61 6e 79 20 70 65  *.Cancels any pe
4cd0: 6e 64 69 6e 67 20 74 69 6d 65 72 2e 0a 20 2a 0a  nding timer.. *.
4ce0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
4cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d20: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74  --------. */.int
4d30: 20 44 69 67 65 73 74 4e 6f 74 69 66 79 50 72 6f   DigestNotifyPro
4d40: 63 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  c(ClientData cli
4d50: 65 6e 74 44 61 74 61 2c 20 69 6e 74 20 69 6e 74  entData, int int
4d60: 65 72 65 73 74 4d 61 73 6b 29 20 7b 0a 20 20 20  erestMask) {.   
4d70: 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74   DigestState *st
4d80: 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 74  atePtr = (Digest
4d90: 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44  State *) clientD
4da0: 61 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 53 6b 69  ata;..    /* Ski
4db0: 70 20 74 69 6d 65 72 20 65 76 65 6e 74 20 61 73  p timer event as
4dc0: 20 72 65 64 75 6e 64 61 6e 74 20 2a 2f 0a 20 20   redundant */.  
4dd0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
4de0: 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69  timer != (Tcl_Ti
4df0: 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20  merToken) NULL) 
4e00: 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d  {..Tcl_DeleteTim
4e10: 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50  erHandler(stateP
4e20: 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61  tr->timer);..sta
4e30: 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28  tePtr->timer = (
4e40: 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20  Tcl_TimerToken) 
4e50: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  NULL;.    }.    
4e60: 72 65 74 75 72 6e 20 69 6e 74 65 72 65 73 74 4d  return interestM
4e70: 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 0a 20 2a  ask;.}../*. *. *
4e80: 20 43 68 61 6e 6e 65 6c 20 74 79 70 65 20 73 74   Channel type st
4e90: 72 75 63 74 75 72 65 20 64 65 66 69 6e 69 74 69  ructure definiti
4ea0: 6f 6e 20 66 6f 72 20 64 69 67 65 73 74 20 74 72  on for digest tr
4eb0: 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 73 2e 0a 20  ansformations.. 
4ec0: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  *. */.static con
4ed0: 73 74 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79  st Tcl_ChannelTy
4ee0: 70 65 20 64 69 67 65 73 74 43 68 61 6e 6e 65 6c  pe digestChannel
4ef0: 54 79 70 65 20 3d 20 7b 0a 20 20 20 20 22 64 69  Type = {.    "di
4f00: 67 65 73 74 22 2c 09 09 09 2f 2a 20 54 79 70 65  gest",.../* Type
4f10: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 54 43 4c   name */.    TCL
4f20: 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e  _CHANNEL_VERSION
4f30: 5f 35 2c 09 2f 2a 20 76 35 20 63 68 61 6e 6e 65  _5,./* v5 channe
4f40: 6c 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 43  l */.    DigestC
4f50: 6c 6f 73 65 50 72 6f 63 2c 09 09 2f 2a 20 43 6c  loseProc,../* Cl
4f60: 6f 73 65 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20  ose proc */.    
4f70: 44 69 67 65 73 74 49 6e 70 75 74 50 72 6f 63 2c  DigestInputProc,
4f80: 09 09 2f 2a 20 49 6e 70 75 74 20 70 72 6f 63 20  ../* Input proc 
4f90: 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 4f 75 74  */.    DigestOut
4fa0: 70 75 74 50 72 6f 63 2c 09 09 2f 2a 20 4f 75 74  putProc,../* Out
4fb0: 70 75 74 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20  put proc */.    
4fc0: 4e 55 4c 4c 2c 09 09 09 2f 2a 20 53 65 65 6b 20  NULL,.../* Seek 
4fd0: 70 72 6f 63 20 2a 2f 0a 20 20 20 20 44 69 67 65  proc */.    Dige
4fe0: 73 74 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 2c  stSetOptionProc,
4ff0: 09 2f 2a 20 53 65 74 20 6f 70 74 69 6f 6e 20 70  ./* Set option p
5000: 72 6f 63 20 2a 2f 0a 20 20 20 20 44 69 67 65 73  roc */.    Diges
5010: 74 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 2c 09  tGetOptionProc,.
5020: 2f 2a 20 47 65 74 20 6f 70 74 69 6f 6e 20 70 72  /* Get option pr
5030: 6f 63 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74  oc */.    Digest
5040: 57 61 74 63 68 50 72 6f 63 2c 09 09 2f 2a 20 49  WatchProc,../* I
5050: 6e 69 74 69 61 6c 69 7a 65 20 6e 6f 74 69 66 69  nitialize notifi
5060: 65 72 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74  er */.    Digest
5070: 47 65 74 48 61 6e 64 6c 65 50 72 6f 63 2c 09 2f  GetHandleProc,./
5080: 2a 20 47 65 74 20 4f 53 20 68 61 6e 64 6c 65 73  * Get OS handles
5090: 20 6f 75 74 20 6f 66 20 63 68 61 6e 6e 65 6c 20   out of channel 
50a0: 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 43 6c 6f  */.    DigestClo
50b0: 73 65 32 50 72 6f 63 2c 09 09 2f 2a 20 63 6c 6f  se2Proc,../* clo
50c0: 73 65 32 70 72 6f 63 20 2a 2f 0a 20 20 20 20 44  se2proc */.    D
50d0: 69 67 65 73 74 42 6c 6f 63 6b 4d 6f 64 65 50 72  igestBlockModePr
50e0: 6f 63 2c 09 2f 2a 20 53 65 74 20 62 6c 6f 63 6b  oc,./* Set block
50f0: 69 6e 67 2f 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20  ing/nonblocking 
5100: 6d 6f 64 65 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c  mode*/.    NULL,
5110: 09 09 09 2f 2a 20 46 6c 75 73 68 20 70 72 6f 63  .../* Flush proc
5120: 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 4e 6f   */.    DigestNo
5130: 74 69 66 79 50 72 6f 63 2c 09 09 2f 2a 20 48 61  tifyProc,../* Ha
5140: 6e 64 6c 69 6e 67 20 6f 66 20 65 76 65 6e 74 73  ndling of events
5150: 20 62 75 62 62 6c 69 6e 67 20 75 70 20 2a 2f 0a   bubbling up */.
5160: 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 57      NULL,.../* W
5170: 69 64 65 20 73 65 65 6b 20 70 72 6f 63 20 2a 2f  ide seek proc */
5180: 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20  .    NULL,.../* 
5190: 54 68 72 65 61 64 20 61 63 74 69 6f 6e 20 2a 2f  Thread action */
51a0: 0a 20 20 20 20 4e 55 4c 4c 09 09 09 2f 2a 20 54  .    NULL.../* T
51b0: 72 75 6e 63 61 74 65 20 2a 2f 0a 7d 3b 0a 0a 2f  runcate */.};../
51c0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
51d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
5210: 20 44 69 67 65 73 74 43 68 61 6e 6e 65 6c 48 61   DigestChannelHa
5220: 6e 64 6c 65 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43  ndler --. *. *.C
5230: 72 65 61 74 65 20 61 20 73 74 61 63 6b 65 64 20  reate a stacked 
5240: 63 68 61 6e 6e 65 6c 20 66 6f 72 20 61 20 6d 65  channel for a me
5250: 73 73 61 67 65 20 64 69 67 65 73 74 20 74 72 61  ssage digest tra
5260: 6e 73 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 2a 0a  nsformation.. *.
5270: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54   * Returns:. *.T
5280: 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52  CL_OK or TCL_ERR
5290: 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  OR. *. * Side ef
52a0: 66 65 63 74 73 3a 0a 20 2a 09 41 64 64 73 20 74  fects:. *.Adds t
52b0: 72 61 6e 73 66 6f 72 6d 20 74 6f 20 63 68 61 6e  ransform to chan
52c0: 6e 65 6c 20 61 6e 64 20 73 65 74 73 20 72 65 73  nel and sets res
52d0: 75 6c 74 20 74 6f 20 63 68 61 6e 6e 65 6c 20 69  ult to channel i
52e0: 64 20 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61  d or error messa
52f0: 67 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ge.. *. *-------
5300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
5340: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44   */.static int D
5350: 69 67 65 73 74 43 68 61 6e 6e 65 6c 48 61 6e 64  igestChannelHand
5360: 6c 65 72 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ler(Tcl_Interp *
5370: 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74 20 63 68  interp, const ch
5380: 61 72 20 2a 63 68 61 6e 6e 65 6c 2c 20 63 6f 6e  ar *channel, con
5390: 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 2c 0a 09  st EVP_MD *md,..
53a0: 63 6f 6e 73 74 20 45 56 50 5f 43 49 50 48 45 52  const EVP_CIPHER
53b0: 20 2a 63 69 70 68 65 72 2c 20 69 6e 74 20 66 6f   *cipher, int fo
53c0: 72 6d 61 74 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6b  rmat, Tcl_Obj *k
53d0: 65 79 4f 62 6a 2c 20 45 56 50 5f 4d 41 43 20 2a  eyObj, EVP_MAC *
53e0: 6d 61 63 29 20 7b 0a 20 20 20 20 69 6e 74 20 6d  mac) {.    int m
53f0: 6f 64 65 3b 20 2f 2a 20 4f 52 2d 65 64 20 63 6f  ode; /* OR-ed co
5400: 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 54 43 4c  mbination of TCL
5410: 5f 52 45 41 44 41 42 4c 45 20 61 6e 64 20 54 43  _READABLE and TC
5420: 4c 5f 57 52 49 54 41 42 4c 45 20 2a 2f 0a 20 20  L_WRITABLE */.  
5430: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68    Tcl_Channel ch
5440: 61 6e 3b 0a 20 20 20 20 44 69 67 65 73 74 53 74  an;.    DigestSt
5450: 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 0a  ate *statePtr;..
5460: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
5470: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 56  led");..    /* V
5480: 61 6c 69 64 61 74 65 20 61 72 67 73 20 2a 2f 0a  alidate args */.
5490: 20 20 20 20 69 66 20 28 63 68 61 6e 6e 65 6c 20      if (channel 
54a0: 3d 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  == (const char *
54b0: 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  ) NULL) {..retur
54c0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
54d0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63   }..    /* Get c
54e0: 68 61 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20 20 20  hannel Id */.   
54f0: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43   chan = Tcl_GetC
5500: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63  hannel(interp, c
5510: 68 61 6e 6e 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a  hannel, &mode);.
5520: 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20      if (chan == 
5530: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
5540: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  LL) {..return TC
5550: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
5560: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
5570: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
5580: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e  he topmost chann
5590: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d  el */.    chan =
55a0: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e   Tcl_GetTopChann
55b0: 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f  el(chan);..    /
55c0: 2a 20 43 72 65 61 74 65 20 73 74 61 74 65 20 64  * Create state d
55d0: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ata structure */
55e0: 0a 20 20 20 20 69 66 20 28 28 73 74 61 74 65 50  .    if ((stateP
55f0: 74 72 20 3d 20 44 69 67 65 73 74 53 74 61 74 65  tr = DigestState
5600: 4e 65 77 28 69 6e 74 65 72 70 2c 20 66 6f 72 6d  New(interp, form
5610: 61 74 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  at)) == NULL) {.
5620: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
5630: 74 28 69 6e 74 65 72 70 2c 20 22 4d 65 6d 6f 72  t(interp, "Memor
5640: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
5650: 6f 72 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  or", (char *) NU
5660: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
5670: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
5680: 20 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66    statePtr->self
5690: 20 3d 20 63 68 61 6e 3b 0a 20 20 20 20 73 74 61   = chan;.    sta
56a0: 74 65 50 74 72 2d 3e 6d 6f 64 65 20 3d 20 6d 6f  tePtr->mode = mo
56b0: 64 65 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74  de;..    /* Init
56c0: 69 61 6c 69 7a 65 20 68 61 73 68 20 66 75 6e 63  ialize hash func
56d0: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28  tion */.    if (
56e0: 44 69 67 65 73 74 49 6e 69 74 69 61 6c 69 7a 65  DigestInitialize
56f0: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
5700: 72 2c 20 6d 64 2c 20 63 69 70 68 65 72 2c 20 6b  r, md, cipher, k
5710: 65 79 4f 62 6a 2c 20 6d 61 63 29 20 21 3d 20 54  eyObj, mac) != T
5720: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e  CL_OK) {..return
5730: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
5740: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67  }..    /* Config
5750: 75 72 65 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  ure channel */. 
5760: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65     Tcl_SetChanne
5770: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
5780: 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74  chan, "-translat
5790: 69 6f 6e 22 2c 20 22 62 69 6e 61 72 79 22 29 3b  ion", "binary");
57a0: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74  .    if (Tcl_Get
57b0: 43 68 61 6e 6e 65 6c 42 75 66 66 65 72 53 69 7a  ChannelBufferSiz
57c0: 65 28 63 68 61 6e 29 20 3c 20 45 56 50 5f 4d 41  e(chan) < EVP_MA
57d0: 58 5f 4d 44 5f 53 49 5a 45 20 2a 20 32 29 20 7b  X_MD_SIZE * 2) {
57e0: 0a 09 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c  ..Tcl_SetChannel
57f0: 42 75 66 66 65 72 53 69 7a 65 28 63 68 61 6e 2c  BufferSize(chan,
5800: 20 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45   EVP_MAX_MD_SIZE
5810: 20 2a 20 32 29 3b 0a 20 20 20 20 7d 0a 0a 20 20   * 2);.    }..  
5820: 20 20 2f 2a 20 53 74 61 63 6b 20 63 68 61 6e 6e    /* Stack chann
5830: 65 6c 2c 20 61 62 6f 72 74 20 66 6f 72 20 65 72  el, abort for er
5840: 72 6f 72 20 2a 2f 0a 20 20 20 20 73 74 61 74 65  ror */.    state
5850: 50 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f  Ptr->self = Tcl_
5860: 53 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74  StackChannel(int
5870: 65 72 70 2c 20 26 64 69 67 65 73 74 43 68 61 6e  erp, &digestChan
5880: 6e 65 6c 54 79 70 65 2c 20 28 43 6c 69 65 6e 74  nelType, (Client
5890: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2c 20  Data) statePtr, 
58a0: 6d 6f 64 65 2c 20 63 68 61 6e 29 3b 0a 20 20 20  mode, chan);.   
58b0: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73   if (statePtr->s
58c0: 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  elf == (Tcl_Chan
58d0: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 44 69  nel) NULL) {..Di
58e0: 67 65 73 74 53 74 61 74 65 46 72 65 65 28 73 74  gestStateFree(st
58f0: 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e  atePtr);..return
5900: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
5910: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 72 65  }..    /* Set re
5920: 73 75 6c 74 20 74 6f 20 63 68 61 6e 6e 65 6c 20  sult to channel 
5930: 49 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 65  Id */.    Tcl_Se
5940: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
5950: 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74  (char *) Tcl_Get
5960: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e  ChannelName(chan
5970: 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  ), TCL_VOLATILE)
5980: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
5990: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  _OK;.}../*. *---
59a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59e0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e 73 74 61 63  ---. *. * Unstac
59f0: 6b 20 43 68 61 6e 6e 65 6c 20 2d 2d 0a 20 2a 0a  k Channel --. *.
5a00: 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e   *.This function
5a10: 20 72 65 6d 6f 76 65 73 20 74 68 65 20 73 74 61   removes the sta
5a20: 63 6b 65 64 20 63 68 61 6e 6e 65 6c 20 66 72 6f  cked channel fro
5a30: 6d 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  m the top of the
5a40: 0a 20 2a 09 63 68 61 6e 6e 65 6c 20 73 74 61 63  . *.channel stac
5a50: 6b 20 69 66 20 69 74 20 69 73 20 61 20 64 69 67  k if it is a dig
5a60: 65 73 74 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a  est channel.. *.
5a70: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54   * Returns:. *.T
5a80: 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52  CL_OK or TCL_ERR
5a90: 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  OR. *. * Side ef
5aa0: 66 65 63 74 73 3a 0a 20 2a 09 52 65 6d 6f 76 65  fects:. *.Remove
5ab0: 73 20 74 72 61 6e 73 66 6f 72 6d 20 66 72 6f 6d  s transform from
5ac0: 20 63 68 61 6e 6e 65 6c 20 6f 72 20 73 65 74 73   channel or sets
5ad0: 20 72 65 73 75 6c 74 20 74 6f 20 65 72 72 6f 72   result to error
5ae0: 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 2d   message.. *. *-
5af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b30: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
5b40: 20 69 6e 74 20 44 69 67 65 73 74 55 6e 73 74 61   int DigestUnsta
5b50: 63 6b 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44  ckObjCmd(ClientD
5b60: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
5b70: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
5b80: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
5b90: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
5ba0: 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43  v[]) {.    Tcl_C
5bb0: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20  hannel chan;.   
5bc0: 20 69 6e 74 20 6d 6f 64 65 3b 20 2f 2a 20 4f 52   int mode; /* OR
5bd0: 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  -ed combination 
5be0: 6f 66 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 20  of TCL_READABLE 
5bf0: 61 6e 64 20 54 43 4c 5f 57 52 49 54 41 42 4c 45  and TCL_WRITABLE
5c00: 20 20 2a 2f 0a 0a 20 20 20 20 64 70 72 69 6e 74    */..    dprint
5c10: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
5c20: 20 20 2f 2a 20 56 61 6c 69 64 61 74 65 20 61 72    /* Validate ar
5c30: 67 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69  g count */.    i
5c40: 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a  f (objc != 2) {.
5c50: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
5c60: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
5c70: 76 2c 20 22 63 68 61 6e 6e 65 6c 49 64 22 29 3b  v, "channelId");
5c80: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
5c90: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
5ca0: 2a 20 47 65 74 20 63 68 61 6e 6e 65 6c 20 2a 2f  * Get channel */
5cb0: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
5cc0: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  GetChannel(inter
5cd0: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
5ce0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c  FromObj(objv[1],
5cf0: 20 4e 55 4c 4c 29 2c 20 26 6d 6f 64 65 29 3b 0a   NULL), &mode);.
5d00: 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20      if (chan == 
5d10: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
5d20: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  LL) {..return TC
5d30: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
5d40: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
5d50: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
5d60: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e  he topmost chann
5d70: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d  el */.    chan =
5d80: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e   Tcl_GetTopChann
5d90: 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f  el(chan);..    /
5da0: 2a 20 43 68 65 63 6b 20 69 66 20 64 69 67 65 73  * Check if diges
5db0: 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20  t channel */.   
5dc0: 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e   if (Tcl_GetChan
5dd0: 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d  nelType(chan) !=
5de0: 20 26 64 69 67 65 73 74 43 68 61 6e 6e 65 6c 54   &digestChannelT
5df0: 79 70 65 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  ype) {..Tcl_Appe
5e00: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
5e10: 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22   "bad channel \"
5e20: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
5e30: 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20  lName(chan),..  
5e40: 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 64 69 67    "\": not a dig
5e50: 65 73 74 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55  est channel", NU
5e60: 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72  LL);..Tcl_SetErr
5e70: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22  orCode(interp, "
5e80: 54 4c 53 22 2c 20 22 55 4e 53 54 41 43 4b 22 2c  TLS", "UNSTACK",
5e90: 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56   "CHANNEL", "INV
5ea0: 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ALID", (char *) 
5eb0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
5ec0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
5ed0: 0a 20 20 20 20 2f 2a 20 50 6f 70 20 74 72 61 6e  .    /* Pop tran
5ee0: 73 66 6f 72 6d 20 66 72 6f 6d 20 63 68 61 6e 6e  sform from chann
5ef0: 65 6c 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  el */.    return
5f00: 20 54 63 6c 5f 55 6e 73 74 61 63 6b 43 68 61 6e   Tcl_UnstackChan
5f10: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  nel(interp, chan
5f20: 29 3b 0a 20 20 20 20 09 63 6c 69 65 6e 74 44 61  );.    .clientDa
5f30: 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b  ta = clientData;
5f40: 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}../***********
5f50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5f60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5f70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5f80: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a  ********/../*. *
5f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fd0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74  ---. *. * Digest
5fe0: 49 6e 73 74 61 6e 63 65 4f 62 6a 43 6d 64 20 2d  InstanceObjCmd -
5ff0: 2d 0a 20 2a 0a 20 2a 09 48 61 6e 64 6c 65 72 20  -. *. *.Handler 
6000: 66 6f 72 20 64 69 67 65 73 74 20 63 6f 6d 6d 61  for digest comma
6010: 6e 64 20 69 6e 73 74 61 6e 63 65 73 2e 20 55 73  nd instances. Us
6020: 65 64 20 74 6f 20 61 64 64 20 64 61 74 61 20 74  ed to add data t
6030: 6f 20 68 61 73 68 0a 20 2a 09 66 75 6e 63 74 69  o hash. *.functi
6040: 6f 6e 20 6f 72 20 72 65 74 72 69 65 76 65 20 6d  on or retrieve m
6050: 65 73 73 61 67 65 20 64 69 67 65 73 74 2e 0a 20  essage digest.. 
6060: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a  *. * Returns:. *
6070: 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45  .TCL_OK or TCL_E
6080: 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20  RROR. *. * Side 
6090: 65 66 66 65 63 74 73 3a 0a 20 2a 09 41 64 64 73  effects:. *.Adds
60a0: 20 64 61 74 61 20 74 6f 20 68 61 73 68 20 6f 72   data to hash or
60b0: 20 72 65 74 75 72 6e 73 20 6d 65 73 73 61 67 65   returns message
60c0: 20 64 69 67 65 73 74 0a 20 2a 0a 20 2a 2d 2d 2d   digest. *. *---
60d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6110: 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 49  . */.int DigestI
6120: 6e 73 74 61 6e 63 65 4f 62 6a 43 6d 64 28 43 6c  nstanceObjCmd(Cl
6130: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
6140: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
6150: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
6160: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
6170: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
6180: 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61  DigestState *sta
6190: 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53  tePtr = (DigestS
61a0: 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61  tate *) clientDa
61b0: 74 61 3b 0a 20 20 20 20 69 6e 74 20 66 6e 2c 20  ta;.    int fn, 
61c0: 64 61 74 61 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20  data_len = 0;.  
61d0: 20 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 4e    char *data = N
61e0: 55 4c 4c 3b 0a 20 20 20 20 73 74 61 74 69 63 20  ULL;.    static 
61f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 6e 73 74  const char *inst
6200: 61 6e 63 65 5f 66 6e 73 20 5b 5d 20 3d 20 7b 20  ance_fns [] = { 
6210: 22 66 69 6e 61 6c 69 7a 65 22 2c 20 22 75 70 64  "finalize", "upd
6220: 61 74 65 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 0a 20  ate", NULL };.. 
6230: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
6240: 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61  ed");..    /* Va
6250: 6c 69 64 61 74 65 20 61 72 67 20 63 6f 75 6e 74  lidate arg count
6260: 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63   */.    if (objc
6270: 20 3c 20 32 20 7c 7c 20 6f 62 6a 63 20 3e 20 33   < 2 || objc > 3
6280: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75  ) {..Tcl_WrongNu
6290: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
62a0: 20 6f 62 6a 76 2c 20 22 66 75 6e 63 74 69 6f 6e   objv, "function
62b0: 20 3f 64 61 74 61 3f 22 29 3b 0a 09 72 65 74 75   ?data?");..retu
62c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
62d0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
62e0: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  function */.    
62f0: 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78  if (Tcl_GetIndex
6300: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
6310: 6f 62 6a 76 5b 31 5d 2c 20 69 6e 73 74 61 6e 63  objv[1], instanc
6320: 65 5f 66 6e 73 2c 20 22 66 75 6e 63 74 69 6f 6e  e_fns, "function
6330: 22 2c 20 30 2c 20 26 66 6e 29 20 21 3d 20 54 43  ", 0, &fn) != TC
6340: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20  L_OK) {..return 
6350: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
6360: 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 66 75 6e 63  ..    /* Do func
6370: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28  tion */.    if (
6380: 66 6e 29 20 7b 0a 09 2f 2a 20 47 65 74 20 64 61  fn) {../* Get da
6390: 74 61 20 6f 72 20 72 65 74 75 72 6e 20 65 72 72  ta or return err
63a0: 6f 72 20 69 66 20 6e 6f 6e 65 20 2a 2f 0a 09 69  or if none */..i
63b0: 66 20 28 6f 62 6a 63 20 3d 3d 20 33 29 20 7b 0a  f (objc == 3) {.
63c0: 09 20 20 20 20 64 61 74 61 20 3d 20 54 63 6c 5f  .    data = Tcl_
63d0: 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
63e0: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 64 61  Obj(objv[2], &da
63f0: 74 61 5f 6c 65 6e 29 3b 0a 09 7d 20 65 6c 73 65  ta_len);..} else
6400: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 57 72 6f 6e   {..    Tcl_Wron
6410: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
6420: 20 31 2c 20 6f 62 6a 76 2c 20 22 75 70 64 61 74   1, objv, "updat
6430: 65 20 64 61 74 61 22 29 3b 0a 09 20 20 20 20 72  e data");..    r
6440: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
6450: 0a 09 7d 0a 0a 09 2f 2a 20 55 70 64 61 74 65 20  ..}.../* Update 
6460: 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  hash function */
6470: 0a 09 69 66 20 28 44 69 67 65 73 74 55 70 64 61  ..if (DigestUpda
6480: 74 65 28 73 74 61 74 65 50 74 72 2c 20 64 61 74  te(statePtr, dat
6490: 61 2c 20 28 73 69 7a 65 5f 74 29 20 64 61 74 61  a, (size_t) data
64a0: 5f 6c 65 6e 2c 20 31 29 20 21 3d 20 54 43 4c 5f  _len, 1) != TCL_
64b0: 4f 4b 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72  OK) {..    retur
64c0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
64d0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f  .    } else {../
64e0: 2a 20 46 69 6e 61 6c 69 7a 65 20 68 61 73 68 20  * Finalize hash 
64f0: 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 63 61 6c  function and cal
6500: 63 75 6c 61 74 65 20 6d 65 73 73 61 67 65 20 64  culate message d
6510: 69 67 65 73 74 20 2a 2f 0a 09 69 66 20 28 44 69  igest */..if (Di
6520: 67 65 73 74 46 69 6e 61 6c 69 7a 65 28 69 6e 74  gestFinalize(int
6530: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 4e  erp, statePtr, N
6540: 55 4c 4c 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  ULL) != TCL_OK) 
6550: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  {..    return TC
6560: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 54 63  L_ERROR;..}...Tc
6570: 6c 5f 44 65 6c 65 74 65 43 6f 6d 6d 61 6e 64 46  l_DeleteCommandF
6580: 72 6f 6d 54 6f 6b 65 6e 28 69 6e 74 65 72 70 2c  romToken(interp,
6590: 20 73 74 61 74 65 50 74 72 2d 3e 74 6f 6b 65 6e   statePtr->token
65a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
65b0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
65c0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
65d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6600: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69  -------. *. * Di
6610: 67 65 73 74 43 6f 6d 6d 61 6e 64 44 65 6c 65 74  gestCommandDelet
6620: 65 48 61 6e 64 6c 65 72 20 2d 2d 0a 20 2a 0a 20  eHandler --. *. 
6630: 2a 09 20 43 61 6c 6c 62 61 63 6b 20 74 6f 20 63  *. Callback to c
6640: 6c 65 61 6e 2d 75 70 20 77 68 65 6e 20 64 69 67  lean-up when dig
6650: 65 73 74 20 69 6e 73 74 61 6e 63 65 20 63 6f 6d  est instance com
6660: 6d 61 6e 64 20 69 73 20 64 65 6c 65 74 65 64 2e  mand is deleted.
6670: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a  . *. * Returns:.
6680: 20 2a 09 4e 6f 74 68 69 6e 67 0a 20 2a 0a 20 2a   *.Nothing. *. *
6690: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
66a0: 2a 09 44 65 73 74 72 6f 79 73 20 73 74 61 74 65  *.Destroys state
66b0: 20 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a   info structure.
66c0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
66d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
66e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
66f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6700: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69  --------. */.voi
6710: 64 20 44 69 67 65 73 74 43 6f 6d 6d 61 6e 64 44  d DigestCommandD
6720: 65 6c 65 74 65 48 61 6e 64 6c 65 72 28 43 6c 69  eleteHandler(Cli
6730: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
6740: 74 61 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74  ta) {.    Digest
6750: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20  State *statePtr 
6760: 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a  = (DigestState *
6770: 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20  ) clientData;.. 
6780: 20 20 20 2f 2a 20 43 6c 65 61 6e 2d 75 70 20 2a     /* Clean-up *
6790: 2f 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74  /.    DigestStat
67a0: 65 46 72 65 65 28 73 74 61 74 65 50 74 72 29 3b  eFree(statePtr);
67b0: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
67c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
6800: 20 2a 20 44 69 67 65 73 74 43 6f 6d 6d 61 6e 64   * DigestCommand
6810: 48 61 6e 64 6c 65 72 20 2d 2d 0a 20 2a 0a 20 2a  Handler --. *. *
6820: 09 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64  . Create command
6830: 20 74 6f 20 61 6c 6c 6f 77 20 75 73 65 72 20 74   to allow user t
6840: 6f 20 61 64 64 20 64 61 74 61 20 74 6f 20 68 61  o add data to ha
6850: 73 68 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 0a  sh function.. *.
6860: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54   * Returns:. *.T
6870: 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52  CL_OK or TCL_ERR
6880: 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  OR. *. * Side ef
6890: 66 65 63 74 73 3a 0a 20 2a 09 43 72 65 61 74 65  fects:. *.Create
68a0: 73 20 63 6f 6d 6d 61 6e 64 20 6f 72 20 65 72 72  s command or err
68b0: 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a  or message. *. *
68c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
68d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
68e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
68f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6900: 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65  ---. */.int Dige
6910: 73 74 43 6f 6d 6d 61 6e 64 48 61 6e 64 6c 65 72  stCommandHandler
6920: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
6930: 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d  erp, Tcl_Obj *cm
6940: 64 4f 62 6a 2c 20 63 6f 6e 73 74 20 45 56 50 5f  dObj, const EVP_
6950: 4d 44 20 2a 6d 64 2c 0a 09 63 6f 6e 73 74 20 45  MD *md,..const E
6960: 56 50 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65  VP_CIPHER *ciphe
6970: 72 2c 20 69 6e 74 20 66 6f 72 6d 61 74 2c 20 54  r, int format, T
6980: 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4f 62 6a 2c 20  cl_Obj *keyObj, 
6990: 45 56 50 5f 4d 41 43 20 2a 6d 61 63 29 20 7b 0a  EVP_MAC *mac) {.
69a0: 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20      DigestState 
69b0: 2a 73 74 61 74 65 50 74 72 3b 0a 20 20 20 20 63  *statePtr;.    c
69c0: 68 61 72 20 2a 63 6d 64 4e 61 6d 65 20 3d 20 54  har *cmdName = T
69d0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
69e0: 4f 62 6a 28 63 6d 64 4f 62 6a 2c 20 4e 55 4c 4c  Obj(cmdObj, NULL
69f0: 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  );..    dprintf(
6a00: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
6a10: 2f 2a 20 43 72 65 61 74 65 20 73 74 61 74 65 20  /* Create state 
6a20: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20 2a  data structure *
6a30: 2f 0a 20 20 20 20 69 66 20 28 28 73 74 61 74 65  /.    if ((state
6a40: 50 74 72 20 3d 20 44 69 67 65 73 74 53 74 61 74  Ptr = DigestStat
6a50: 65 4e 65 77 28 69 6e 74 65 72 70 2c 20 66 6f 72  eNew(interp, for
6a60: 6d 61 74 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b  mat)) == NULL) {
6a70: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
6a80: 6c 74 28 69 6e 74 65 72 70 2c 20 22 4d 65 6d 6f  lt(interp, "Memo
6a90: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
6aa0: 72 6f 72 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ror", (char *) N
6ab0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  ULL);..return TC
6ac0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
6ad0: 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
6ae0: 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20  e hash function 
6af0: 2a 2f 0a 20 20 20 20 69 66 20 28 44 69 67 65 73  */.    if (Diges
6b00: 74 49 6e 69 74 69 61 6c 69 7a 65 28 69 6e 74 65  tInitialize(inte
6b10: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 6d 64  rp, statePtr, md
6b20: 2c 20 63 69 70 68 65 72 2c 20 6b 65 79 4f 62 6a  , cipher, keyObj
6b30: 2c 20 6d 61 63 29 20 21 3d 20 54 43 4c 5f 4f 4b  , mac) != TCL_OK
6b40: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
6b50: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
6b60: 20 20 2f 2a 20 43 72 65 61 74 65 20 69 6e 73 74    /* Create inst
6b70: 61 6e 63 65 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  ance command */.
6b80: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 74 6f      statePtr->to
6b90: 6b 65 6e 20 3d 20 54 63 6c 5f 43 72 65 61 74 65  ken = Tcl_Create
6ba0: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
6bb0: 70 2c 20 63 6d 64 4e 61 6d 65 2c 20 44 69 67 65  p, cmdName, Dige
6bc0: 73 74 49 6e 73 74 61 6e 63 65 4f 62 6a 43 6d 64  stInstanceObjCmd
6bd0: 2c 0a 09 28 43 6c 69 65 6e 74 44 61 74 61 29 20  ,..(ClientData) 
6be0: 73 74 61 74 65 50 74 72 2c 20 44 69 67 65 73 74  statePtr, Digest
6bf0: 43 6f 6d 6d 61 6e 64 44 65 6c 65 74 65 48 61 6e  CommandDeleteHan
6c00: 64 6c 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 52  dler);..    /* R
6c10: 65 74 75 72 6e 20 63 6f 6d 6d 61 6e 64 20 6e 61  eturn command na
6c20: 6d 65 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 65  me */.    Tcl_Se
6c30: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
6c40: 70 2c 20 63 6d 64 4f 62 6a 29 3b 0a 20 20 20 20  p, cmdObj);.    
6c50: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
6c60: 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
6c70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6c80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6c90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6ca0: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d  *******/../*. *-
6cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6cf0: 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 44  --. *. * DigestD
6d00: 61 74 61 48 61 6e 64 6c 65 72 20 2d 2d 0a 20 2a  ataHandler --. *
6d10: 0a 20 2a 09 52 65 74 75 72 6e 20 6d 65 73 73 61  . *.Return messa
6d20: 67 65 20 64 69 67 65 73 74 20 66 6f 72 20 64 61  ge digest for da
6d30: 74 61 20 75 73 69 6e 67 20 75 73 65 72 20 73 70  ta using user sp
6d40: 65 63 69 66 69 65 64 20 68 61 73 68 20 66 75 6e  ecified hash fun
6d50: 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74  ction.. *. * Ret
6d60: 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20  urns:. *.TCL_OK 
6d70: 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a  or TCL_ERROR. *.
6d80: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
6d90: 0a 20 2a 09 53 65 74 73 20 72 65 73 75 6c 74 20  . *.Sets result 
6da0: 74 6f 20 6d 65 73 73 61 67 65 20 64 69 67 65 73  to message diges
6db0: 74 20 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61  t or error messa
6dc0: 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  ge. *. *--------
6dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
6e10: 69 6e 74 20 44 69 67 65 73 74 44 61 74 61 48 61  int DigestDataHa
6e20: 6e 64 6c 65 72 28 54 63 6c 5f 49 6e 74 65 72 70  ndler(Tcl_Interp
6e30: 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62   *interp, Tcl_Ob
6e40: 6a 20 2a 64 61 74 61 4f 62 6a 2c 20 63 6f 6e 73  j *dataObj, cons
6e50: 74 20 45 56 50 5f 4d 44 20 2a 6d 64 2c 0a 09 63  t EVP_MD *md,..c
6e60: 6f 6e 73 74 20 45 56 50 5f 43 49 50 48 45 52 20  onst EVP_CIPHER 
6e70: 2a 63 69 70 68 65 72 2c 20 69 6e 74 20 66 6f 72  *cipher, int for
6e80: 6d 61 74 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6b 65  mat, Tcl_Obj *ke
6e90: 79 4f 62 6a 2c 20 45 56 50 5f 4d 41 43 20 2a 6d  yObj, EVP_MAC *m
6ea0: 61 63 29 20 7b 0a 20 20 20 20 63 68 61 72 20 2a  ac) {.    char *
6eb0: 64 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 64 61  data;.    int da
6ec0: 74 61 5f 6c 65 6e 3b 0a 20 20 20 20 44 69 67 65  ta_len;.    Dige
6ed0: 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74  stState *statePt
6ee0: 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  r;..    dprintf(
6ef0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
6f00: 2f 2a 20 47 65 74 20 64 61 74 61 20 2a 2f 0a 20  /* Get data */. 
6f10: 20 20 20 64 61 74 61 20 3d 20 54 63 6c 5f 47 65     data = Tcl_Ge
6f20: 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62  tByteArrayFromOb
6f30: 6a 28 64 61 74 61 4f 62 6a 2c 20 26 64 61 74 61  j(dataObj, &data
6f40: 5f 6c 65 6e 29 3b 0a 20 20 20 20 69 66 20 28 64  _len);.    if (d
6f50: 61 74 61 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ata == NULL) {..
6f60: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
6f70: 74 65 72 70 2c 20 22 4e 6f 20 64 61 74 61 22 2c  terp, "No data",
6f80: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
6f90: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
6fa0: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
6fb0: 73 74 61 74 65 20 64 61 74 61 20 73 74 72 75 63  state data struc
6fc0: 74 75 72 65 20 2a 2f 0a 20 20 20 20 69 66 20 28  ture */.    if (
6fd0: 28 73 74 61 74 65 50 74 72 20 3d 20 44 69 67 65  (statePtr = Dige
6fe0: 73 74 53 74 61 74 65 4e 65 77 28 69 6e 74 65 72  stStateNew(inter
6ff0: 70 2c 20 66 6f 72 6d 61 74 29 29 20 3d 3d 20 4e  p, format)) == N
7000: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  ULL) {..Tcl_Appe
7010: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
7020: 20 22 4d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74   "Memory allocat
7030: 69 6f 6e 20 65 72 72 6f 72 22 2c 20 28 63 68 61  ion error", (cha
7040: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  r *) NULL);..ret
7050: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
7060: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 61 6c     }..    /* Cal
7070: 63 20 44 69 67 65 73 74 2c 20 61 62 6f 72 74 20  c Digest, abort 
7080: 66 6f 72 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20  for error */.   
7090: 20 69 66 20 28 44 69 67 65 73 74 49 6e 69 74 69   if (DigestIniti
70a0: 61 6c 69 7a 65 28 69 6e 74 65 72 70 2c 20 73 74  alize(interp, st
70b0: 61 74 65 50 74 72 2c 20 6d 64 2c 20 63 69 70 68  atePtr, md, ciph
70c0: 65 72 2c 20 6b 65 79 4f 62 6a 2c 20 6d 61 63 29  er, keyObj, mac)
70d0: 20 21 3d 20 54 43 4c 5f 4f 4b 20 7c 7c 0a 09 44   != TCL_OK ||..D
70e0: 69 67 65 73 74 55 70 64 61 74 65 28 73 74 61 74  igestUpdate(stat
70f0: 65 50 74 72 2c 20 64 61 74 61 2c 20 28 73 69 7a  ePtr, data, (siz
7100: 65 5f 74 29 20 64 61 74 61 5f 6c 65 6e 2c 20 31  e_t) data_len, 1
7110: 29 20 21 3d 20 54 43 4c 5f 4f 4b 20 7c 7c 0a 09  ) != TCL_OK ||..
7120: 44 69 67 65 73 74 46 69 6e 61 6c 69 7a 65 28 69  DigestFinalize(i
7130: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c  nterp, statePtr,
7140: 20 4e 55 4c 4c 29 20 21 3d 20 54 43 4c 5f 4f 4b   NULL) != TCL_OK
7150: 29 20 7b 0a 09 44 69 67 65 73 74 53 74 61 74 65  ) {..DigestState
7160: 46 72 65 65 28 73 74 61 74 65 50 74 72 29 3b 0a  Free(statePtr);.
7170: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
7180: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
7190: 20 43 6c 65 61 6e 2d 75 70 20 2a 2f 0a 20 20 20   Clean-up */.   
71a0: 20 44 69 67 65 73 74 53 74 61 74 65 46 72 65 65   DigestStateFree
71b0: 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20  (statePtr);.    
71c0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
71d0: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
71e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
71f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7210: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d  ******/../*. *--
7220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7260: 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 46 69  -. *. * DigestFi
7270: 6c 65 48 61 6e 64 6c 65 72 20 2d 2d 0a 20 2a 0a  leHandler --. *.
7280: 20 2a 09 52 65 74 75 72 6e 20 6d 65 73 73 61 67   *.Return messag
7290: 65 20 64 69 67 65 73 74 20 66 6f 72 20 66 69 6c  e digest for fil
72a0: 65 20 75 73 69 6e 67 20 75 73 65 72 20 73 70 65  e using user spe
72b0: 63 69 66 69 65 64 20 68 61 73 68 20 66 75 6e 63  cified hash func
72c0: 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 75  tion.. *. * Retu
72d0: 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f  rns:. *.TCL_OK o
72e0: 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20  r TCL_ERROR. *. 
72f0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
7300: 20 2a 09 52 65 73 75 6c 74 20 69 73 20 6d 65 73   *.Result is mes
7310: 73 61 67 65 20 64 69 67 65 73 74 20 6f 72 20 65  sage digest or e
7320: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a  rror message. *.
7330: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
7340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7370: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69  -----. */.int Di
7380: 67 65 73 74 46 69 6c 65 48 61 6e 64 6c 65 72 28  gestFileHandler(
7390: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
73a0: 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 69 6e 46  rp, Tcl_Obj *inF
73b0: 69 6c 65 4f 62 6a 2c 20 63 6f 6e 73 74 20 45 56  ileObj, const EV
73c0: 50 5f 4d 44 20 2a 6d 64 2c 0a 09 63 6f 6e 73 74  P_MD *md,..const
73d0: 20 45 56 50 5f 43 49 50 48 45 52 20 2a 63 69 70   EVP_CIPHER *cip
73e0: 68 65 72 2c 20 69 6e 74 20 66 6f 72 6d 61 74 2c  her, int format,
73f0: 20 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4f 62 6a   Tcl_Obj *keyObj
7400: 2c 20 45 56 50 5f 4d 41 43 20 2a 6d 61 63 29 20  , EVP_MAC *mac) 
7410: 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74  {.    DigestStat
7420: 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 20 20  e *statePtr;.   
7430: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61   Tcl_Channel cha
7440: 6e 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e  n = NULL;.    un
7450: 73 69 67 6e 65 64 20 63 68 61 72 20 62 75 66 5b  signed char buf[
7460: 42 55 46 46 45 52 5f 53 49 5a 45 5d 3b 0a 20 20  BUFFER_SIZE];.  
7470: 20 20 69 6e 74 20 72 65 73 20 3d 20 54 43 4c 5f    int res = TCL_
7480: 4f 4b 2c 20 6c 65 6e 3b 0a 0a 20 20 20 20 64 70  OK, len;..    dp
7490: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
74a0: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
74b0: 73 74 61 74 65 20 64 61 74 61 20 73 74 72 75 63  state data struc
74c0: 74 75 72 65 20 2a 2f 0a 20 20 20 20 69 66 20 28  ture */.    if (
74d0: 28 73 74 61 74 65 50 74 72 20 3d 20 44 69 67 65  (statePtr = Dige
74e0: 73 74 53 74 61 74 65 4e 65 77 28 69 6e 74 65 72  stStateNew(inter
74f0: 70 2c 20 66 6f 72 6d 61 74 29 29 20 3d 3d 20 4e  p, format)) == N
7500: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  ULL) {..Tcl_Appe
7510: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
7520: 20 22 4d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74   "Memory allocat
7530: 69 6f 6e 20 65 72 72 6f 72 22 2c 20 28 63 68 61  ion error", (cha
7540: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  r *) NULL);..ret
7550: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
7560: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 70 65     }..    /* Ope
7570: 6e 20 66 69 6c 65 20 63 68 61 6e 6e 65 6c 2c 20  n file channel, 
7580: 61 62 6f 72 74 20 66 6f 72 20 65 72 72 6f 72 20  abort for error 
7590: 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  */.    chan = Tc
75a0: 6c 5f 46 53 4f 70 65 6e 46 69 6c 65 43 68 61 6e  l_FSOpenFileChan
75b0: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 69 6e 46 69  nel(interp, inFi
75c0: 6c 65 4f 62 6a 2c 20 22 72 62 22 2c 20 30 34 34  leObj, "rb", 044
75d0: 34 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e  4);.    if (chan
75e0: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c   == (Tcl_Channel
75f0: 29 20 4e 55 4c 4c 29 20 7b 0a 09 44 69 67 65 73  ) NULL) {..Diges
7600: 74 53 74 61 74 65 46 72 65 65 28 73 74 61 74 65  tStateFree(state
7610: 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  Ptr);..return TC
7620: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
7630: 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65      /* Configure
7640: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20   channel */.    
7650: 69 66 20 28 28 72 65 73 20 3d 20 54 63 6c 5f 53  if ((res = Tcl_S
7660: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
7670: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d  interp, chan, "-
7680: 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62  translation", "b
7690: 69 6e 61 72 79 22 29 29 20 21 3d 20 54 43 4c 5f  inary")) != TCL_
76a0: 4f 4b 29 20 7b 0a 09 67 6f 74 6f 20 64 6f 6e 65  OK) {..goto done
76b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  ;.    }.    Tcl_
76c0: 53 65 74 43 68 61 6e 6e 65 6c 42 75 66 66 65 72  SetChannelBuffer
76d0: 53 69 7a 65 28 63 68 61 6e 2c 20 42 55 46 46 45  Size(chan, BUFFE
76e0: 52 5f 53 49 5a 45 29 3b 0a 0a 20 20 20 20 2f 2a  R_SIZE);..    /*
76f0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 68 61 73 68   Initialize hash
7700: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20   function */.   
7710: 20 69 66 20 28 28 72 65 73 20 3d 20 44 69 67 65   if ((res = Dige
7720: 73 74 49 6e 69 74 69 61 6c 69 7a 65 28 69 6e 74  stInitialize(int
7730: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 6d  erp, statePtr, m
7740: 64 2c 20 63 69 70 68 65 72 2c 20 6b 65 79 4f 62  d, cipher, keyOb
7750: 6a 2c 20 6d 61 63 29 29 20 21 3d 20 54 43 4c 5f  j, mac)) != TCL_
7760: 4f 4b 29 20 7b 0a 09 67 6f 74 6f 20 64 6f 6e 65  OK) {..goto done
7770: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
7780: 52 65 61 64 20 66 69 6c 65 20 64 61 74 61 20 61  Read file data a
7790: 6e 64 20 75 70 64 61 74 65 20 68 61 73 68 20 66  nd update hash f
77a0: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 77  unction */.    w
77b0: 68 69 6c 65 20 28 21 54 63 6c 5f 45 6f 66 28 63  hile (!Tcl_Eof(c
77c0: 68 61 6e 29 29 20 7b 0a 09 6c 65 6e 20 3d 20 54  han)) {..len = T
77d0: 63 6c 5f 52 65 61 64 52 61 77 28 63 68 61 6e 2c  cl_ReadRaw(chan,
77e0: 20 28 63 68 61 72 20 2a 29 20 62 75 66 2c 20 42   (char *) buf, B
77f0: 55 46 46 45 52 5f 53 49 5a 45 29 3b 0a 09 69 66  UFFER_SIZE);..if
7800: 20 28 6c 65 6e 20 3e 20 30 29 20 7b 0a 09 20 20   (len > 0) {..  
7810: 20 20 69 66 20 28 44 69 67 65 73 74 55 70 64 61    if (DigestUpda
7820: 74 65 28 73 74 61 74 65 50 74 72 2c 20 26 62 75  te(statePtr, &bu
7830: 66 5b 30 5d 2c 20 28 73 69 7a 65 5f 74 29 20 6c  f[0], (size_t) l
7840: 65 6e 2c 20 31 29 20 21 3d 20 54 43 4c 5f 4f 4b  en, 1) != TCL_OK
7850: 29 20 7b 0a 09 09 72 65 73 20 3d 20 54 43 4c 5f  ) {...res = TCL_
7860: 45 52 52 4f 52 3b 0a 09 09 67 6f 74 6f 20 64 6f  ERROR;...goto do
7870: 6e 65 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20  ne;..    }..}.  
7880: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61    }..    /* Fina
7890: 6c 69 7a 65 20 68 61 73 68 20 66 75 6e 63 74 69  lize hash functi
78a0: 6f 6e 20 61 6e 64 20 63 61 6c 63 75 6c 61 74 65  on and calculate
78b0: 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20   message digest 
78c0: 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 44 69 67  */.    res = Dig
78d0: 65 73 74 46 69 6e 61 6c 69 7a 65 28 69 6e 74 65  estFinalize(inte
78e0: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 4e 55  rp, statePtr, NU
78f0: 4c 4c 29 3b 0a 0a 64 6f 6e 65 3a 0a 20 20 20 20  LL);..done:.    
7900: 2f 2a 20 43 6c 6f 73 65 20 63 68 61 6e 6e 65 6c  /* Close channel
7910: 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f   */.    if (Tcl_
7920: 43 6c 6f 73 65 28 69 6e 74 65 72 70 2c 20 63 68  Close(interp, ch
7930: 61 6e 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52  an) == TCL_ERROR
7940: 29 20 7b 0a 09 72 65 73 20 3d 20 54 43 4c 5f 45  ) {..res = TCL_E
7950: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
7960: 20 2f 2a 20 43 6c 65 61 6e 2d 75 70 20 2a 2f 0a   /* Clean-up */.
7970: 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65 46      DigestStateF
7980: 72 65 65 28 73 74 61 74 65 50 74 72 29 3b 0a 20  ree(statePtr);. 
7990: 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d     return res;.}
79a0: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
79b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
79c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
79d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
79e0: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d  ******/../*. *--
79f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a30: 2d 0a 20 2a 0a 20 2a 20 47 65 74 44 69 67 65 73  -. *. * GetDiges
7a40: 74 20 2d 2d 20 47 65 74 20 6d 65 73 73 61 67 65  t -- Get message
7a50: 20 64 69 67 65 73 74 0a 20 2a 0a 20 2a 20 52 65   digest. *. * Re
7a60: 74 75 72 6e 73 3a 0a 20 2a 09 45 56 50 5f 4d 44  turns:. *.EVP_MD
7a70: 20 2a 20 6f 72 20 4e 55 4c 4c 0a 20 2a 0a 20 2a   * or NULL. *. *
7a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ac0: 2d 2d 2d 0a 20 2a 2f 0a 45 56 50 5f 4d 44 20 2a  ---. */.EVP_MD *
7ad0: 47 65 74 44 69 67 65 73 74 28 54 63 6c 5f 49 6e  GetDigest(Tcl_In
7ae0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 63  terp *interp, Tc
7af0: 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c 20 69  l_Obj *objPtr, i
7b00: 6e 74 20 2a 66 6f 72 6d 61 74 29 20 7b 0a 20 20  nt *format) {.  
7b10: 20 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a    const EVP_MD *
7b20: 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63  md = NULL;.    c
7b30: 68 61 72 20 2a 64 69 67 65 73 74 4e 61 6d 65 20  har *digestName 
7b40: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
7b50: 72 6f 6d 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 4e  romObj(objPtr, N
7b60: 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 64  ULL);..    if (d
7b70: 69 67 65 73 74 4e 61 6d 65 20 21 3d 20 4e 55 4c  igestName != NUL
7b80: 4c 29 20 7b 0a 09 6d 64 20 3d 20 45 56 50 5f 67  L) {..md = EVP_g
7b90: 65 74 5f 64 69 67 65 73 74 62 79 6e 61 6d 65 28  et_digestbyname(
7ba0: 64 69 67 65 73 74 4e 61 6d 65 29 3b 0a 09 69 66  digestName);..if
7bb0: 20 28 6d 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a   (md == NULL) {.
7bc0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
7bd0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 49  esult(interp, "I
7be0: 6e 76 61 6c 69 64 20 64 69 67 65 73 74 20 5c 22  nvalid digest \"
7bf0: 22 2c 20 64 69 67 65 73 74 4e 61 6d 65 2c 20 22  ", digestName, "
7c00: 5c 22 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  \"", NULL);..   
7c10: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d   return NULL;..}
7c20: 20 65 6c 73 65 20 69 66 20 28 6d 64 20 3d 3d 20   else if (md == 
7c30: 45 56 50 5f 73 68 61 6b 65 31 32 38 28 29 20 7c  EVP_shake128() |
7c40: 7c 20 6d 64 20 3d 3d 20 45 56 50 5f 73 68 61 6b  | md == EVP_shak
7c50: 65 32 35 36 28 29 29 20 7b 0a 09 20 20 20 20 2a  e256()) {..    *
7c60: 66 6f 72 6d 61 74 20 7c 3d 20 49 53 5f 58 4f 46  format |= IS_XOF
7c70: 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20  ;..}.    } else 
7c80: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
7c90: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20  ult(interp, "No 
7ca0: 64 69 67 65 73 74 20 73 70 65 63 69 66 69 65 64  digest specified
7cb0: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  ", NULL);..retur
7cc0: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  n NULL;.    }.  
7cd0: 20 20 72 65 74 75 72 6e 20 6d 64 3b 0a 7d 0a 0a    return md;.}..
7ce0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
7cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d20: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 47  --------. *. * G
7d30: 65 74 43 69 70 68 65 72 20 2d 2d 20 47 65 74 20  etCipher -- Get 
7d40: 63 69 70 68 65 72 0a 20 2a 0a 20 2a 20 52 65 74  cipher. *. * Ret
7d50: 75 72 6e 73 3a 0a 20 2a 09 45 56 50 5f 43 49 50  urns:. *.EVP_CIP
7d60: 48 45 52 20 2a 20 6f 72 20 4e 55 4c 4c 0a 20 2a  HER * or NULL. *
7d70: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
7d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7db0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 45 56 50 5f 43  ------. */.EVP_C
7dc0: 49 50 48 45 52 20 2a 47 65 74 43 69 70 68 65 72  IPHER *GetCipher
7dd0: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
7de0: 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62  erp, Tcl_Obj *ob
7df0: 6a 50 74 72 2c 20 69 6e 74 20 2a 74 79 70 65 29  jPtr, int *type)
7e00: 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 45 56 50   {.    const EVP
7e10: 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 20  _CIPHER *cipher 
7e20: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72  = NULL;.    char
7e30: 20 2a 63 69 70 68 65 72 4e 61 6d 65 20 3d 20 54   *cipherName = T
7e40: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
7e50: 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 4e 55 4c 4c  Obj(objPtr, NULL
7e60: 29 3b 0a 0a 20 20 20 20 69 66 20 28 63 69 70 68  );..    if (ciph
7e70: 65 72 4e 61 6d 65 20 21 3d 20 4e 55 4c 4c 29 20  erName != NULL) 
7e80: 7b 0a 09 63 69 70 68 65 72 20 3d 20 45 56 50 5f  {..cipher = EVP_
7e90: 67 65 74 5f 63 69 70 68 65 72 62 79 6e 61 6d 65  get_cipherbyname
7ea0: 28 63 69 70 68 65 72 4e 61 6d 65 29 3b 0a 09 2a  (cipherName);..*
7eb0: 74 79 70 65 20 3d 20 54 59 50 45 5f 43 4d 41 43  type = TYPE_CMAC
7ec0: 3b 0a 09 69 66 20 28 63 69 70 68 65 72 20 3d 3d  ;..if (cipher ==
7ed0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63   NULL) {..    Tc
7ee0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
7ef0: 6e 74 65 72 70 2c 20 22 49 6e 76 61 6c 69 64 20  nterp, "Invalid 
7f00: 63 69 70 68 65 72 20 5c 22 22 2c 20 63 69 70 68  cipher \"", ciph
7f10: 65 72 4e 61 6d 65 2c 20 22 5c 22 22 2c 20 4e 55  erName, "\"", NU
7f20: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  LL);..    return
7f30: 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20   NULL;..}.    } 
7f40: 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 41 70 70 65  else {..Tcl_Appe
7f50: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
7f60: 20 22 4e 6f 20 63 69 70 68 65 72 20 73 70 65 63   "No cipher spec
7f70: 69 66 69 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09  ified", NULL);..
7f80: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
7f90: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 63 69   }.    return ci
7fa0: 70 68 65 72 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d  pher;.}../*. *--
7fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ff0: 2d 0a 20 2a 0a 20 2a 20 47 65 74 4b 65 79 20 2d  -. *. * GetKey -
8000: 2d 20 47 65 74 20 6b 65 79 0a 20 2a 0a 20 2a 20  - Get key. *. * 
8010: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 75 6e 73 69  Returns:. *.unsi
8020: 67 6e 65 64 20 63 68 61 72 20 2a 20 6f 72 20 4e  gned char * or N
8030: 55 4c 4c 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ULL. *. *-------
8040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
8080: 0a 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  .unsigned char *
8090: 47 65 74 4b 65 79 28 54 63 6c 5f 49 6e 74 65 72  GetKey(Tcl_Inter
80a0: 70 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f  p *interp, Tcl_O
80b0: 62 6a 20 2a 6f 62 6a 50 74 72 2c 20 69 6e 74 20  bj *objPtr, int 
80c0: 2a 74 79 70 65 29 20 7b 0a 20 20 20 20 75 6e 73  *type) {.    uns
80d0: 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 20  igned char *key 
80e0: 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
80f0: 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 50 74 72  ayFromObj(objPtr
8100: 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66  , NULL);..    if
8110: 20 28 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b   (key == NULL) {
8120: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
8130: 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20 6b  lt(interp, "No k
8140: 65 79 20 73 70 65 63 69 66 69 65 64 22 2c 20 4e  ey specified", N
8150: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55  ULL);..return NU
8160: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LL;.    }.    if
8170: 20 28 2a 74 79 70 65 20 3d 3d 20 54 59 50 45 5f   (*type == TYPE_
8180: 4d 44 29 20 7b 0a 09 2a 74 79 70 65 20 3d 20 54  MD) {..*type = T
8190: 59 50 45 5f 48 4d 41 43 3b 0a 20 20 20 20 7d 0a  YPE_HMAC;.    }.
81a0: 20 20 20 20 72 65 74 75 72 6e 20 6b 65 79 3b 0a      return key;.
81b0: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
81c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
81d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
81e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
81f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
8200: 2a 20 47 65 74 4d 41 43 20 2d 2d 20 47 65 74 20  * GetMAC -- Get 
8210: 4d 41 43 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  MAC. *. * Return
8220: 73 3a 0a 20 2a 09 45 56 50 5f 4d 41 43 20 2a 20  s:. *.EVP_MAC * 
8230: 6f 72 20 4e 55 4c 4c 0a 20 2a 0a 20 2a 2d 2d 2d  or NULL. *. *---
8240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8280: 0a 20 2a 2f 0a 45 56 50 5f 4d 41 43 20 2a 47 65  . */.EVP_MAC *Ge
8290: 74 4d 41 43 28 54 63 6c 5f 49 6e 74 65 72 70 20  tMAC(Tcl_Interp 
82a0: 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a  *interp, Tcl_Obj
82b0: 20 2a 6f 62 6a 50 74 72 2c 20 69 6e 74 20 2a 74   *objPtr, int *t
82c0: 79 70 65 29 20 7b 0a 20 20 20 20 45 56 50 5f 4d  ype) {.    EVP_M
82d0: 41 43 20 2a 6d 61 63 20 3d 20 4e 55 4c 4c 3b 0a  AC *mac = NULL;.
82e0: 20 20 20 20 63 68 61 72 20 2a 6d 61 63 4e 61 6d      char *macNam
82f0: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
8300: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 50 74 72 2c  gFromObj(objPtr,
8310: 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20   NULL);..    if 
8320: 28 6d 61 63 4e 61 6d 65 20 21 3d 20 4e 55 4c 4c  (macName != NULL
8330: 29 20 7b 0a 09 69 66 20 28 73 74 72 63 6d 70 28  ) {..if (strcmp(
8340: 6d 61 63 4e 61 6d 65 2c 20 22 63 6d 61 63 22 29  macName, "cmac")
8350: 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20 2a 74   == 0) {..    *t
8360: 79 70 65 20 3d 20 54 59 50 45 5f 43 4d 41 43 3b  ype = TYPE_CMAC;
8370: 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72  ..} else if (str
8380: 63 6d 70 28 6d 61 63 4e 61 6d 65 2c 20 22 68 6d  cmp(macName, "hm
8390: 61 63 22 29 20 3d 3d 20 30 29 20 7b 0a 09 20 20  ac") == 0) {..  
83a0: 20 20 2a 74 79 70 65 20 3d 20 54 59 50 45 5f 48    *type = TYPE_H
83b0: 4d 41 43 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  MAC;..} else {..
83c0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
83d0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 49 6e  sult(interp, "In
83e0: 76 61 6c 69 64 20 4d 41 43 20 5c 22 22 2c 20 6d  valid MAC \"", m
83f0: 61 63 4e 61 6d 65 2c 20 22 5c 22 22 2c 20 4e 55  acName, "\"", NU
8400: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  LL);..    return
8410: 20 4e 55 4c 4c 3b 0a 09 7d 0a 09 6d 61 63 20 3d   NULL;..}..mac =
8420: 20 28 76 6f 69 64 20 2a 29 20 6d 61 63 4e 61 6d   (void *) macNam
8430: 65 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  e;.    } else {.
8440: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
8450: 74 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20 4d 41  t(interp, "No MA
8460: 43 20 73 70 65 63 69 66 69 65 64 22 2c 20 4e 55  C specified", NU
8470: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  LL);..return NUL
8480: 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  L;.    }.    ret
8490: 75 72 6e 20 6d 61 63 3b 0a 7d 0a 0a 2f 2a 2a 2a  urn mac;.}../***
84a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
84b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
84c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
84d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
84e0: 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  /../*. *--------
84f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
8530: 2a 20 44 69 67 65 73 74 4d 61 69 6e 20 2d 2d 0a  * DigestMain --.
8540: 20 2a 0a 20 2a 09 52 65 74 75 72 6e 20 6d 65 73   *. *.Return mes
8550: 73 61 67 65 20 64 69 67 65 73 74 20 6f 72 20 4d  sage digest or M
8560: 65 73 73 61 67 65 20 41 75 74 68 65 6e 74 69 63  essage Authentic
8570: 61 74 69 6f 6e 20 43 6f 64 65 20 28 4d 41 43 29  ation Code (MAC)
8580: 20 6f 66 0a 20 2a 09 64 61 74 61 20 75 73 69 6e   of. *.data usin
8590: 67 20 75 73 65 72 20 73 70 65 63 69 66 69 65 64  g user specified
85a0: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 0a   hash function..
85b0: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20   *. * Returns:. 
85c0: 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f  *.TCL_OK or TCL_
85d0: 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65  ERROR. *. * Side
85e0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74   effects:. *.Set
85f0: 73 20 72 65 73 75 6c 74 20 74 6f 20 6d 65 73 73  s result to mess
8600: 61 67 65 20 64 69 67 65 73 74 20 6f 72 20 65 72  age digest or er
8610: 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20  ror message. *. 
8620: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
8630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8660: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
8670: 69 6e 74 20 44 69 67 65 73 74 4d 61 69 6e 28 69  int DigestMain(i
8680: 6e 74 20 74 79 70 65 2c 20 54 63 6c 5f 49 6e 74  nt type, Tcl_Int
8690: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
86a0: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
86b0: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a  const objv[]) {.
86c0: 20 20 20 20 69 6e 74 20 69 64 78 2c 20 73 74 61      int idx, sta
86d0: 72 74 20 3d 20 31 2c 20 66 6f 72 6d 61 74 20 3d  rt = 1, format =
86e0: 20 48 45 58 5f 46 4f 52 4d 41 54 2c 20 72 65 73   HEX_FORMAT, res
86f0: 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 54   = TCL_OK;.    T
8700: 63 6c 5f 4f 62 6a 20 2a 63 69 70 68 65 72 4f 62  cl_Obj *cipherOb
8710: 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 63 6d 64 4f 62  j = NULL, *cmdOb
8720: 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 64 61 74 61 4f  j = NULL, *dataO
8730: 62 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 64 69 67 65  bj = NULL, *dige
8740: 73 74 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20  stObj = NULL;.  
8750: 20 20 54 63 6c 5f 4f 62 6a 20 2a 66 69 6c 65 4f    Tcl_Obj *fileO
8760: 62 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 6b 65 79 4f  bj = NULL, *keyO
8770: 62 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 6d 61 63 4f  bj = NULL, *macO
8780: 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63  bj = NULL;.    c
8790: 6f 6e 73 74 20 63 68 61 72 20 2a 63 68 61 6e 6e  onst char *chann
87a0: 65 6c 20 3d 20 4e 55 4c 4c 2c 20 2a 6f 70 74 3b  el = NULL, *opt;
87b0: 0a 20 20 20 20 63 6f 6e 73 74 20 45 56 50 5f 4d  .    const EVP_M
87c0: 44 20 2a 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20  D *md = NULL;.  
87d0: 20 20 63 6f 6e 73 74 20 45 56 50 5f 43 49 50 48    const EVP_CIPH
87e0: 45 52 20 2a 63 69 70 68 65 72 20 3d 20 4e 55 4c  ER *cipher = NUL
87f0: 4c 3b 0a 20 20 20 20 45 56 50 5f 4d 41 43 20 2a  L;.    EVP_MAC *
8800: 6d 61 63 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20  mac = NULL;..   
8810: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
8820: 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61  ");..    /* Clea
8830: 72 20 69 6e 74 65 72 70 20 72 65 73 75 6c 74 20  r interp result 
8840: 2a 2f 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74  */.    Tcl_Reset
8850: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
8860: 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 65  .    /* Validate
8870: 20 61 72 67 20 63 6f 75 6e 74 20 2a 2f 0a 20 20   arg count */.  
8880: 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 33 20 7c    if (objc < 3 |
8890: 7c 20 6f 62 6a 63 20 3e 20 31 32 29 20 7b 0a 09  | objc > 12) {..
88a0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
88b0: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
88c0: 2c 20 22 3f 2d 62 69 6e 7c 2d 68 65 78 3f 20 3f  , "?-bin|-hex? ?
88d0: 2d 63 69 70 68 65 72 20 6e 61 6d 65 3f 20 3f 2d  -cipher name? ?-
88e0: 64 69 67 65 73 74 20 6e 61 6d 65 3f 20 3f 2d 6b  digest name? ?-k
88f0: 65 79 20 6b 65 79 3f 20 3f 2d 6d 61 63 20 6e 61  ey key? ?-mac na
8900: 6d 65 3f 20 5b 2d 63 68 61 6e 6e 65 6c 20 63 68  me? [-channel ch
8910: 61 6e 20 7c 20 2d 63 6f 6d 6d 61 6e 64 20 63 6d  an | -command cm
8920: 64 4e 61 6d 65 20 7c 20 2d 66 69 6c 65 20 66 69  dName | -file fi
8930: 6c 65 6e 61 6d 65 20 7c 20 3f 2d 64 61 74 61 3f  lename | ?-data?
8940: 20 64 61 74 61 5d 22 29 3b 0a 09 72 65 74 75 72   data]");..retur
8950: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
8960: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 70 65 63 69   }..    /* Speci
8970: 61 6c 20 63 61 73 65 20 6f 66 20 66 69 72 73 74  al case of first
8980: 20 61 72 67 20 69 73 20 64 69 67 65 73 74 2c 20   arg is digest, 
8990: 63 69 70 68 65 72 2c 20 6f 72 20 6d 61 63 20 2a  cipher, or mac *
89a0: 2f 0a 20 20 20 20 6f 70 74 20 3d 20 54 63 6c 5f  /.    opt = Tcl_
89b0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
89c0: 28 6f 62 6a 76 5b 73 74 61 72 74 5d 2c 20 4e 55  (objv[start], NU
89d0: 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 6f 70 74  LL);.    if (opt
89e0: 5b 30 5d 20 21 3d 20 27 2d 27 29 20 7b 0a 09 69  [0] != '-') {..i
89f0: 66 20 28 74 79 70 65 20 3d 3d 20 54 59 50 45 5f  f (type == TYPE_
8a00: 4d 44 20 7c 7c 20 74 79 70 65 20 3d 3d 20 54 59  MD || type == TY
8a10: 50 45 5f 48 4d 41 43 29 20 7b 0a 09 20 20 20 20  PE_HMAC) {..    
8a20: 64 69 67 65 73 74 4f 62 6a 20 3d 20 6f 62 6a 76  digestObj = objv
8a30: 5b 73 74 61 72 74 5d 3b 0a 09 20 20 20 20 73 74  [start];..    st
8a40: 61 72 74 2b 2b 3b 0a 09 7d 20 65 6c 73 65 20 69  art++;..} else i
8a50: 66 20 28 74 79 70 65 20 3d 3d 20 54 59 50 45 5f  f (type == TYPE_
8a60: 43 4d 41 43 29 20 7b 0a 09 20 20 20 20 63 69 70  CMAC) {..    cip
8a70: 68 65 72 4f 62 6a 20 3d 20 6f 62 6a 76 5b 73 74  herObj = objv[st
8a80: 61 72 74 5d 3b 0a 09 20 20 20 20 73 74 61 72 74  art];..    start
8a90: 2b 2b 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28  ++;..} else if (
8aa0: 74 79 70 65 20 3d 3d 20 54 59 50 45 5f 4d 41 43  type == TYPE_MAC
8ab0: 29 20 7b 0a 09 20 20 20 20 6d 61 63 4f 62 6a 20  ) {..    macObj 
8ac0: 3d 20 6f 62 6a 76 5b 73 74 61 72 74 5d 3b 0a 09  = objv[start];..
8ad0: 20 20 20 20 73 74 61 72 74 2b 2b 3b 0a 09 7d 0a      start++;..}.
8ae0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
8af0: 74 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 20  t options */.   
8b00: 20 66 6f 72 20 28 69 64 78 20 3d 20 73 74 61 72   for (idx = star
8b10: 74 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20 69  t; idx < objc; i
8b20: 64 78 2b 2b 29 20 7b 0a 09 6f 70 74 20 3d 20 54  dx++) {..opt = T
8b30: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
8b40: 4f 62 6a 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 4e  Obj(objv[idx], N
8b50: 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 6f 70 74 5b  ULL);...if (opt[
8b60: 30 5d 20 21 3d 20 27 2d 27 29 20 7b 0a 09 20 20  0] != '-') {..  
8b70: 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 4f 50    break;..}...OP
8b80: 54 46 4c 41 47 28 22 2d 62 69 6e 22 2c 20 66 6f  TFLAG("-bin", fo
8b90: 72 6d 61 74 2c 20 42 49 4e 5f 46 4f 52 4d 41 54  rmat, BIN_FORMAT
8ba0: 29 3b 0a 09 4f 50 54 46 4c 41 47 28 22 2d 62 69  );..OPTFLAG("-bi
8bb0: 6e 61 72 79 22 2c 20 66 6f 72 6d 61 74 2c 20 42  nary", format, B
8bc0: 49 4e 5f 46 4f 52 4d 41 54 29 3b 0a 09 4f 50 54  IN_FORMAT);..OPT
8bd0: 46 4c 41 47 28 22 2d 68 65 78 22 2c 20 66 6f 72  FLAG("-hex", for
8be0: 6d 61 74 2c 20 48 45 58 5f 46 4f 52 4d 41 54 29  mat, HEX_FORMAT)
8bf0: 3b 0a 09 4f 50 54 46 4c 41 47 28 22 2d 68 65 78  ;..OPTFLAG("-hex
8c00: 61 64 65 63 69 6d 61 6c 22 2c 20 66 6f 72 6d 61  adecimal", forma
8c10: 74 2c 20 48 45 58 5f 46 4f 52 4d 41 54 29 3b 0a  t, HEX_FORMAT);.
8c20: 09 4f 50 54 53 54 52 28 22 2d 63 68 61 6e 22 2c  .OPTSTR("-chan",
8c30: 20 63 68 61 6e 6e 65 6c 29 3b 0a 09 4f 50 54 53   channel);..OPTS
8c40: 54 52 28 22 2d 63 68 61 6e 6e 65 6c 22 2c 20 63  TR("-channel", c
8c50: 68 61 6e 6e 65 6c 29 3b 0a 09 4f 50 54 4f 42 4a  hannel);..OPTOBJ
8c60: 28 22 2d 63 69 70 68 65 72 22 2c 20 63 69 70 68  ("-cipher", ciph
8c70: 65 72 4f 62 6a 29 3b 0a 09 4f 50 54 4f 42 4a 28  erObj);..OPTOBJ(
8c80: 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 63 6d 64 4f  "-command", cmdO
8c90: 62 6a 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 64  bj);..OPTOBJ("-d
8ca0: 61 74 61 22 2c 20 64 61 74 61 4f 62 6a 29 3b 0a  ata", dataObj);.
8cb0: 09 4f 50 54 4f 42 4a 28 22 2d 64 69 67 65 73 74  .OPTOBJ("-digest
8cc0: 22 2c 20 64 69 67 65 73 74 4f 62 6a 29 3b 0a 09  ", digestObj);..
8cd0: 4f 50 54 4f 42 4a 28 22 2d 66 69 6c 65 22 2c 20  OPTOBJ("-file", 
8ce0: 66 69 6c 65 4f 62 6a 29 3b 0a 09 4f 50 54 4f 42  fileObj);..OPTOB
8cf0: 4a 28 22 2d 66 69 6c 65 6e 61 6d 65 22 2c 20 66  J("-filename", f
8d00: 69 6c 65 4f 62 6a 29 3b 0a 09 4f 50 54 4f 42 4a  ileObj);..OPTOBJ
8d10: 28 22 2d 6b 65 79 22 2c 20 6b 65 79 4f 62 6a 29  ("-key", keyObj)
8d20: 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 6d 61 63 22  ;..OPTOBJ("-mac"
8d30: 2c 20 6d 61 63 4f 62 6a 29 3b 0a 0a 09 4f 50 54  , macObj);...OPT
8d40: 42 41 44 28 22 6f 70 74 69 6f 6e 22 2c 20 22 2d  BAD("option", "-
8d50: 62 69 6e 2c 20 2d 63 68 61 6e 6e 65 6c 2c 20 2d  bin, -channel, -
8d60: 63 69 70 68 65 72 2c 20 2d 63 6f 6d 6d 61 6e 64  cipher, -command
8d70: 2c 20 2d 64 61 74 61 2c 20 2d 64 69 67 65 73 74  , -data, -digest
8d80: 2c 20 2d 66 69 6c 65 2c 20 2d 66 69 6c 65 6e 61  , -file, -filena
8d90: 6d 65 2c 20 2d 68 65 78 2c 20 2d 6b 65 79 2c 20  me, -hex, -key, 
8da0: 6f 72 20 2d 6d 61 63 22 29 3b 0a 09 72 65 74 75  or -mac");..retu
8db0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
8dc0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6f    }..    /* If o
8dd0: 6e 6c 79 20 31 20 61 72 67 20 6c 65 66 74 2c 20  nly 1 arg left, 
8de0: 69 74 27 73 20 74 68 65 20 64 61 74 61 20 2a 2f  it's the data */
8df0: 0a 20 20 20 20 69 66 20 28 69 64 78 20 3c 20 6f  .    if (idx < o
8e00: 62 6a 63 20 26 26 20 64 61 74 61 4f 62 6a 20 3d  bjc && dataObj =
8e10: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 64 61 74 61 4f  = NULL) {..dataO
8e20: 62 6a 20 3d 20 6f 62 6a 76 5b 69 64 78 5d 3b 0a  bj = objv[idx];.
8e30: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
8e40: 74 20 63 69 70 68 65 72 20 2a 2f 0a 20 20 20 20  t cipher */.    
8e50: 69 66 20 28 63 69 70 68 65 72 4f 62 6a 20 21 3d  if (cipherObj !=
8e60: 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 28 63   NULL) {..if ((c
8e70: 69 70 68 65 72 20 3d 20 47 65 74 43 69 70 68 65  ipher = GetCiphe
8e80: 72 28 69 6e 74 65 72 70 2c 20 63 69 70 68 65 72  r(interp, cipher
8e90: 4f 62 6a 2c 20 26 74 79 70 65 29 29 20 3d 3d 20  Obj, &type)) == 
8ea0: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 72 65 74  NULL) {..    ret
8eb0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
8ec0: 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  }.    } else if 
8ed0: 28 74 79 70 65 20 3d 3d 20 54 59 50 45 5f 43 4d  (type == TYPE_CM
8ee0: 41 43 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  AC) {..Tcl_Appen
8ef0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
8f00: 22 4e 6f 20 63 69 70 68 65 72 20 73 70 65 63 69  "No cipher speci
8f10: 66 69 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72  fied", NULL);..r
8f20: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8f30: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
8f40: 65 74 20 6d 65 73 73 61 67 65 20 64 69 67 65 73  et message diges
8f50: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 64 69 67  t */.    if (dig
8f60: 65 73 74 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20  estObj != NULL) 
8f70: 7b 0a 09 69 66 20 28 28 6d 64 20 3d 20 47 65 74  {..if ((md = Get
8f80: 44 69 67 65 73 74 28 69 6e 74 65 72 70 2c 20 64  Digest(interp, d
8f90: 69 67 65 73 74 4f 62 6a 2c 20 26 66 6f 72 6d 61  igestObj, &forma
8fa0: 74 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  t)) == NULL) {..
8fb0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
8fc0: 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 20 65  RROR;..}.    } e
8fd0: 6c 73 65 20 69 66 20 28 74 79 70 65 20 3d 3d 20  lse if (type == 
8fe0: 54 59 50 45 5f 4d 44 20 7c 7c 20 74 79 70 65 20  TYPE_MD || type 
8ff0: 3d 3d 20 54 59 50 45 5f 48 4d 41 43 29 20 7b 0a  == TYPE_HMAC) {.
9000: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
9010: 74 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20 64 69  t(interp, "No di
9020: 67 65 73 74 20 73 70 65 63 69 66 69 65 64 22 2c  gest specified",
9030: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
9040: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
9050: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 6b 65 79  ..    /* Get key
9060: 20 2a 2f 0a 20 20 20 20 69 66 20 28 6b 65 79 4f   */.    if (keyO
9070: 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69  bj != NULL) {..i
9080: 66 20 28 47 65 74 4b 65 79 28 69 6e 74 65 72 70  f (GetKey(interp
9090: 2c 20 6b 65 79 4f 62 6a 2c 20 26 74 79 70 65 29  , keyObj, &type)
90a0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   == NULL) {..   
90b0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
90c0: 52 3b 09 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73  R;...}.    } els
90d0: 65 20 69 66 20 28 74 79 70 65 20 21 3d 20 54 59  e if (type != TY
90e0: 50 45 5f 4d 44 29 20 7b 0a 09 54 63 6c 5f 41 70  PE_MD) {..Tcl_Ap
90f0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
9100: 70 2c 20 22 4e 6f 20 6b 65 79 20 73 70 65 63 69  p, "No key speci
9110: 66 69 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72  fied", NULL);..r
9120: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9130: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
9140: 65 74 20 4d 41 43 20 2a 2f 0a 20 20 20 20 69 66  et MAC */.    if
9150: 20 28 6d 61 63 4f 62 6a 20 21 3d 20 4e 55 4c 4c   (macObj != NULL
9160: 29 20 7b 0a 09 69 66 20 28 28 6d 61 63 20 3d 20  ) {..if ((mac = 
9170: 47 65 74 4d 41 43 28 69 6e 74 65 72 70 2c 20 6d  GetMAC(interp, m
9180: 61 63 4f 62 6a 2c 20 26 74 79 70 65 29 29 20 3d  acObj, &type)) =
9190: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 72  = NULL) {..    r
91a0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
91b0: 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  ..}.    } else i
91c0: 66 20 28 74 79 70 65 20 3d 3d 20 54 59 50 45 5f  f (type == TYPE_
91d0: 4d 41 43 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  MAC) {..Tcl_Appe
91e0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
91f0: 20 22 4e 6f 20 4d 41 43 20 73 70 65 63 69 66 69   "No MAC specifi
9200: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  ed", NULL);..ret
9210: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9220: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 61 6c     }..    /* Cal
9230: 63 20 64 69 67 65 73 74 20 6f 6e 20 66 69 6c 65  c digest on file
9240: 2c 20 73 74 61 63 6b 65 64 20 63 68 61 6e 6e 65  , stacked channe
9250: 6c 2c 20 75 73 69 6e 67 20 69 6e 73 74 61 6e 63  l, using instanc
9260: 65 20 63 6f 6d 6d 61 6e 64 2c 20 6f 72 20 64 61  e command, or da
9270: 74 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 20 20 69  ta blob */.    i
9280: 66 20 28 66 69 6c 65 4f 62 6a 20 21 3d 20 4e 55  f (fileObj != NU
9290: 4c 4c 29 20 7b 0a 09 72 65 73 20 3d 20 44 69 67  LL) {..res = Dig
92a0: 65 73 74 46 69 6c 65 48 61 6e 64 6c 65 72 28 69  estFileHandler(i
92b0: 6e 74 65 72 70 2c 20 66 69 6c 65 4f 62 6a 2c 20  nterp, fileObj, 
92c0: 6d 64 2c 20 63 69 70 68 65 72 2c 20 66 6f 72 6d  md, cipher, form
92d0: 61 74 20 7c 20 74 79 70 65 2c 20 6b 65 79 4f 62  at | type, keyOb
92e0: 6a 2c 20 6d 61 63 29 3b 0a 20 20 20 20 7d 20 65  j, mac);.    } e
92f0: 6c 73 65 20 69 66 20 28 63 68 61 6e 6e 65 6c 20  lse if (channel 
9300: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 20  != NULL) {..res 
9310: 3d 20 44 69 67 65 73 74 43 68 61 6e 6e 65 6c 48  = DigestChannelH
9320: 61 6e 64 6c 65 72 28 69 6e 74 65 72 70 2c 20 63  andler(interp, c
9330: 68 61 6e 6e 65 6c 2c 20 6d 64 2c 20 63 69 70 68  hannel, md, ciph
9340: 65 72 2c 20 66 6f 72 6d 61 74 20 7c 20 74 79 70  er, format | typ
9350: 65 2c 20 6b 65 79 4f 62 6a 2c 20 6d 61 63 29 3b  e, keyObj, mac);
9360: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
9370: 63 6d 64 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20  cmdObj != NULL) 
9380: 7b 0a 09 72 65 73 20 3d 20 44 69 67 65 73 74 43  {..res = DigestC
9390: 6f 6d 6d 61 6e 64 48 61 6e 64 6c 65 72 28 69 6e  ommandHandler(in
93a0: 74 65 72 70 2c 20 63 6d 64 4f 62 6a 2c 20 6d 64  terp, cmdObj, md
93b0: 2c 20 63 69 70 68 65 72 2c 20 66 6f 72 6d 61 74  , cipher, format
93c0: 20 7c 20 74 79 70 65 2c 20 6b 65 79 4f 62 6a 2c   | type, keyObj,
93d0: 20 6d 61 63 29 3b 0a 20 20 20 20 7d 20 65 6c 73   mac);.    } els
93e0: 65 20 69 66 20 28 64 61 74 61 4f 62 6a 20 21 3d  e if (dataObj !=
93f0: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 20 3d 20   NULL) {..res = 
9400: 44 69 67 65 73 74 44 61 74 61 48 61 6e 64 6c 65  DigestDataHandle
9410: 72 28 69 6e 74 65 72 70 2c 20 64 61 74 61 4f 62  r(interp, dataOb
9420: 6a 2c 20 6d 64 2c 20 63 69 70 68 65 72 2c 20 66  j, md, cipher, f
9430: 6f 72 6d 61 74 20 7c 20 74 79 70 65 2c 20 6b 65  ormat | type, ke
9440: 79 4f 62 6a 2c 20 6d 61 63 29 3b 0a 20 20 20 20  yObj, mac);.    
9450: 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 41 70  } else {..Tcl_Ap
9460: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
9470: 70 2c 20 22 4e 6f 20 6f 70 65 72 61 74 69 6f 6e  p, "No operation
9480: 20 73 70 65 63 69 66 69 65 64 3a 20 55 73 65 20   specified: Use 
9490: 2d 63 68 61 6e 6e 65 6c 2c 20 2d 63 6f 6d 6d 61  -channel, -comma
94a0: 6e 64 2c 20 2d 64 61 74 61 2c 20 6f 72 20 2d 66  nd, -data, or -f
94b0: 69 6c 65 20 6f 70 74 69 6f 6e 22 2c 20 4e 55 4c  ile option", NUL
94c0: 4c 29 3b 0a 09 72 65 73 20 3d 20 54 43 4c 5f 45  L);..res = TCL_E
94d0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
94e0: 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f  return res;.}../
94f0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
9500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9530: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 65  -------. *. * Me
9540: 73 73 61 67 65 20 44 69 67 65 73 74 20 61 6e 64  ssage Digest and
9550: 20 4d 65 73 73 61 67 65 20 41 75 74 68 65 6e 74   Message Authent
9560: 69 63 61 74 69 6f 6e 20 43 6f 64 65 20 43 6f 6d  ication Code Com
9570: 6d 61 6e 64 73 20 2d 2d 0a 20 2a 0a 20 2a 09 52  mands --. *. *.R
9580: 65 74 75 72 6e 20 4d 65 73 73 61 67 65 20 44 69  eturn Message Di
9590: 67 65 73 74 20 28 4d 44 29 20 6f 72 20 4d 65 73  gest (MD) or Mes
95a0: 73 61 67 65 20 41 75 74 68 65 6e 74 69 63 61 74  sage Authenticat
95b0: 69 6f 6e 20 43 6f 64 65 20 28 4d 41 43 29 2e 0a  ion Code (MAC)..
95c0: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20   *. * Returns:. 
95d0: 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f  *.TCL_OK or TCL_
95e0: 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65  ERROR. *. * Side
95f0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74   effects:. *.Set
9600: 73 20 72 65 73 75 6c 74 20 74 6f 20 6d 65 73 73  s result to mess
9610: 61 67 65 20 64 69 67 65 73 74 20 6f 72 20 65 72  age digest or er
9620: 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20  ror message. *. 
9630: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
9640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9670: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
9680: 69 6e 74 20 4d 64 4f 62 6a 43 6d 64 28 43 6c 69  int MdObjCmd(Cli
9690: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
96a0: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
96b0: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
96c0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
96d0: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 72   objv[]) {.    r
96e0: 65 74 75 72 6e 20 44 69 67 65 73 74 4d 61 69 6e  eturn DigestMain
96f0: 28 54 59 50 45 5f 4d 44 2c 20 69 6e 74 65 72 70  (TYPE_MD, interp
9700: 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 7d  , objc, objv);.}
9710: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 43 4d 41  ..static int CMA
9720: 43 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61  CObjCmd(ClientDa
9730: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
9740: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
9750: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
9760: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
9770: 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  []) {.    return
9780: 20 44 69 67 65 73 74 4d 61 69 6e 28 54 59 50 45   DigestMain(TYPE
9790: 5f 43 4d 41 43 2c 20 69 6e 74 65 72 70 2c 20 6f  _CMAC, interp, o
97a0: 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 7d 0a 0a 73  bjc, objv);.}..s
97b0: 74 61 74 69 63 20 69 6e 74 20 48 4d 41 43 4f 62  tatic int HMACOb
97c0: 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20  jCmd(ClientData 
97d0: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f  clientData, Tcl_
97e0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
97f0: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
9800: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j *const objv[])
9810: 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 44 69   {.    return Di
9820: 67 65 73 74 4d 61 69 6e 28 54 59 50 45 5f 48 4d  gestMain(TYPE_HM
9830: 41 43 2c 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63  AC, interp, objc
9840: 2c 20 6f 62 6a 76 29 3b 0a 7d 0a 0a 73 74 61 74  , objv);.}..stat
9850: 69 63 20 69 6e 74 20 4d 41 43 4f 62 6a 43 6d 64  ic int MACObjCmd
9860: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
9870: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ntData, Tcl_Inte
9880: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
9890: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63  objc, Tcl_Obj *c
98a0: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20  onst objv[]) {. 
98b0: 20 20 20 72 65 74 75 72 6e 20 44 69 67 65 73 74     return Digest
98c0: 4d 61 69 6e 28 54 59 50 45 5f 4d 41 43 2c 20 69  Main(TYPE_MAC, i
98d0: 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a  nterp, objc, obj
98e0: 76 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  v);.}../*. *----
98f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
9930: 20 2a 0a 20 2a 20 4d 65 73 73 61 67 65 20 44 69   *. * Message Di
9940: 67 65 73 74 20 43 6f 6e 76 65 6e 69 65 6e 63 65  gest Convenience
9950: 20 43 6f 6d 6d 61 6e 64 73 20 2d 2d 0a 20 2a 0a   Commands --. *.
9960: 20 2a 09 43 6f 6e 76 65 6e 69 65 6e 63 65 20 63   *.Convenience c
9970: 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 73 65 6c 65  ommands for sele
9980: 63 74 20 6d 65 73 73 61 67 65 20 64 69 67 65 73  ct message diges
9990: 74 73 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  ts.. *. * Return
99a0: 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20  s:. *.TCL_OK or 
99b0: 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20  TCL_ERROR. *. * 
99c0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
99d0: 09 53 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20  .Sets result to 
99e0: 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20 6f  message digest o
99f0: 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  r error message.
9a00: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
9a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9a40: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 20 23 64  --------. */. #d
9a50: 65 66 69 6e 65 20 76 61 6c 69 64 61 74 65 5f 61  efine validate_a
9a60: 72 67 63 28 6f 62 6a 63 2c 20 6f 62 6a 76 29 20  rgc(objc, objv) 
9a70: 7b 20 5c 0a 20 20 20 20 69 66 20 28 6f 62 6a 63  { \.    if (objc
9a80: 20 21 3d 20 32 29 20 7b 20 5c 0a 09 54 63 6c 5f   != 2) { \..Tcl_
9a90: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
9aa0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 64  erp, 1, objv, "d
9ab0: 61 74 61 22 29 3b 20 5c 0a 09 72 65 74 75 72 6e  ata"); \..return
9ac0: 20 54 43 4c 5f 45 52 52 4f 52 3b 20 5c 0a 20 20   TCL_ERROR; \.  
9ad0: 20 20 7d 20 5c 0a 7d 0a 20 0a 69 6e 74 20 4d 44    } \.}. .int MD
9ae0: 34 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61  4ObjCmd(ClientDa
9af0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
9b00: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
9b10: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
9b20: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
9b30: 5b 5d 29 20 7b 0a 20 20 20 20 76 61 6c 69 64 61  []) {.    valida
9b40: 74 65 5f 61 72 67 63 28 6f 62 6a 63 2c 20 6f 62  te_argc(objc, ob
9b50: 6a 76 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  jv);.    return 
9b60: 44 69 67 65 73 74 44 61 74 61 48 61 6e 64 6c 65  DigestDataHandle
9b70: 72 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31  r(interp, objv[1
9b80: 5d 2c 20 45 56 50 5f 6d 64 34 28 29 2c 20 4e 55  ], EVP_md4(), NU
9b90: 4c 4c 2c 20 48 45 58 5f 46 4f 52 4d 41 54 20 7c  LL, HEX_FORMAT |
9ba0: 20 54 59 50 45 5f 4d 44 2c 20 4e 55 4c 4c 2c 20   TYPE_MD, NULL, 
9bb0: 4e 55 4c 4c 29 3b 0a 7d 0a 0a 69 6e 74 20 4d 44  NULL);.}..int MD
9bc0: 35 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61  5ObjCmd(ClientDa
9bd0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
9be0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
9bf0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
9c00: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
9c10: 5b 5d 29 20 7b 0a 20 20 20 20 76 61 6c 69 64 61  []) {.    valida
9c20: 74 65 5f 61 72 67 63 28 6f 62 6a 63 2c 20 6f 62  te_argc(objc, ob
9c30: 6a 76 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  jv);.    return 
9c40: 44 69 67 65 73 74 44 61 74 61 48 61 6e 64 6c 65  DigestDataHandle
9c50: 72 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31  r(interp, objv[1
9c60: 5d 2c 20 45 56 50 5f 6d 64 35 28 29 2c 20 4e 55  ], EVP_md5(), NU
9c70: 4c 4c 2c 20 48 45 58 5f 46 4f 52 4d 41 54 20 7c  LL, HEX_FORMAT |
9c80: 20 54 59 50 45 5f 4d 44 2c 20 4e 55 4c 4c 2c 20   TYPE_MD, NULL, 
9c90: 4e 55 4c 4c 29 3b 0a 7d 0a 0a 69 6e 74 20 53 48  NULL);.}..int SH
9ca0: 41 31 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44  A1ObjCmd(ClientD
9cb0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
9cc0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
9cd0: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
9ce0: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
9cf0: 76 5b 5d 29 20 7b 0a 20 20 20 20 76 61 6c 69 64  v[]) {.    valid
9d00: 61 74 65 5f 61 72 67 63 28 6f 62 6a 63 2c 20 6f  ate_argc(objc, o
9d10: 62 6a 76 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  bjv);.    return
9d20: 20 44 69 67 65 73 74 44 61 74 61 48 61 6e 64 6c   DigestDataHandl
9d30: 65 72 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  er(interp, objv[
9d40: 31 5d 2c 20 45 56 50 5f 73 68 61 31 28 29 2c 20  1], EVP_sha1(), 
9d50: 4e 55 4c 4c 2c 20 48 45 58 5f 46 4f 52 4d 41 54  NULL, HEX_FORMAT
9d60: 20 7c 20 54 59 50 45 5f 4d 44 2c 20 4e 55 4c 4c   | TYPE_MD, NULL
9d70: 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 69 6e 74 20  , NULL);.}..int 
9d80: 53 48 41 32 35 36 4f 62 6a 43 6d 64 28 43 6c 69  SHA256ObjCmd(Cli
9d90: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
9da0: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
9db0: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
9dc0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
9dd0: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 76   objv[]) {.    v
9de0: 61 6c 69 64 61 74 65 5f 61 72 67 63 28 6f 62 6a  alidate_argc(obj
9df0: 63 2c 20 6f 62 6a 76 29 3b 0a 20 20 20 20 72 65  c, objv);.    re
9e00: 74 75 72 6e 20 44 69 67 65 73 74 44 61 74 61 48  turn DigestDataH
9e10: 61 6e 64 6c 65 72 28 69 6e 74 65 72 70 2c 20 6f  andler(interp, o
9e20: 62 6a 76 5b 31 5d 2c 20 45 56 50 5f 73 68 61 32  bjv[1], EVP_sha2
9e30: 35 36 28 29 2c 20 4e 55 4c 4c 2c 20 48 45 58 5f  56(), NULL, HEX_
9e40: 46 4f 52 4d 41 54 20 7c 20 54 59 50 45 5f 4d 44  FORMAT | TYPE_MD
9e50: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 7d  , NULL, NULL);.}
9e60: 0a 0a 69 6e 74 20 53 48 41 35 31 32 4f 62 6a 43  ..int SHA512ObjC
9e70: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  md(ClientData cl
9e80: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e  ientData, Tcl_In
9e90: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
9ea0: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
9eb0: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b  *const objv[]) {
9ec0: 0a 20 20 20 20 76 61 6c 69 64 61 74 65 5f 61 72  .    validate_ar
9ed0: 67 63 28 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a  gc(objc, objv);.
9ee0: 20 20 20 20 72 65 74 75 72 6e 20 44 69 67 65 73      return Diges
9ef0: 74 44 61 74 61 48 61 6e 64 6c 65 72 28 69 6e 74  tDataHandler(int
9f00: 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 45 56  erp, objv[1], EV
9f10: 50 5f 73 68 61 35 31 32 28 29 2c 20 4e 55 4c 4c  P_sha512(), NULL
9f20: 2c 20 48 45 58 5f 46 4f 52 4d 41 54 20 7c 20 54  , HEX_FORMAT | T
9f30: 59 50 45 5f 4d 44 2c 20 4e 55 4c 4c 2c 20 4e 55  YPE_MD, NULL, NU
9f40: 4c 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  LL);.}../*. *---
9f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9f90: 0a 20 2a 0a 20 2a 20 54 6c 73 5f 44 69 67 65 73  . *. * Tls_Diges
9fa0: 74 43 6f 6d 6d 61 6e 64 73 20 2d 2d 0a 20 2a 0a  tCommands --. *.
9fb0: 20 2a 09 43 72 65 61 74 65 20 64 69 67 65 73 74   *.Create digest
9fc0: 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20   commands. *. * 
9fd0: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f  Returns:. *.TCL_
9fe0: 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a  OK or TCL_ERROR.
9ff0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
a000: 74 73 3a 0a 20 2a 09 43 72 65 61 74 65 73 20 63  ts:. *.Creates c
a010: 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 2d 2d 2d  ommands. *. *---
a020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a060: 0a 20 2a 2f 0a 69 6e 74 20 54 6c 73 5f 44 69 67  . */.int Tls_Dig
a070: 65 73 74 43 6f 6d 6d 61 6e 64 73 28 54 63 6c 5f  estCommands(Tcl_
a080: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20  Interp *interp) 
a090: 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  {.    Tcl_Create
a0a0: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
a0b0: 70 2c 20 22 74 6c 73 3a 3a 64 69 67 65 73 74 22  p, "tls::digest"
a0c0: 2c 20 4d 64 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  , MdObjCmd, (Cli
a0d0: 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c  entData) 0, (Tcl
a0e0: 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
a0f0: 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c  ) NULL);.    Tcl
a100: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
a110: 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  d(interp, "tls::
a120: 6d 64 22 2c 20 4d 64 4f 62 6a 43 6d 64 2c 20 28  md", MdObjCmd, (
a130: 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28  ClientData) 0, (
a140: 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
a150: 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  c *) NULL);.    
a160: 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
a170: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c  mand(interp, "tl
a180: 73 3a 3a 63 6d 61 63 22 2c 20 43 4d 41 43 4f 62  s::cmac", CMACOb
a190: 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74  jCmd, (ClientDat
a1a0: 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65  a) 0, (Tcl_CmdDe
a1b0: 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c  leteProc *) NULL
a1c0: 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  );.    Tcl_Creat
a1d0: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
a1e0: 72 70 2c 20 22 74 6c 73 3a 3a 68 6d 61 63 22 2c  rp, "tls::hmac",
a1f0: 20 48 4d 41 43 4f 62 6a 43 6d 64 2c 20 28 43 6c   HMACObjCmd, (Cl
a200: 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63  ientData) 0, (Tc
a210: 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
a220: 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63  *) NULL);.    Tc
a230: 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
a240: 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a  nd(interp, "tls:
a250: 3a 6d 61 63 22 2c 20 4d 41 43 4f 62 6a 43 6d 64  :mac", MACObjCmd
a260: 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30  , (ClientData) 0
a270: 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
a280: 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Proc *) NULL);. 
a290: 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
a2a0: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
a2b0: 22 74 6c 73 3a 3a 6d 64 34 22 2c 20 4d 44 34 4f  "tls::md4", MD4O
a2c0: 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61  bjCmd, (ClientDa
a2d0: 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44  ta) 0, (Tcl_CmdD
a2e0: 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
a2f0: 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  L);.    Tcl_Crea
a300: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
a310: 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 64 35 22 2c  erp, "tls::md5",
a320: 20 4d 44 35 4f 62 6a 43 6d 64 2c 20 28 43 6c 69   MD5ObjCmd, (Cli
a330: 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c  entData) 0, (Tcl
a340: 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
a350: 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c  ) NULL);.    Tcl
a360: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
a370: 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  d(interp, "tls::
a380: 73 68 61 31 22 2c 20 53 48 41 31 4f 62 6a 43 6d  sha1", SHA1ObjCm
a390: 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  d, (ClientData) 
a3a0: 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  0, (Tcl_CmdDelet
a3b0: 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
a3c0: 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
a3d0: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
a3e0: 20 22 74 6c 73 3a 3a 73 68 61 32 35 36 22 2c 20   "tls::sha256", 
a3f0: 53 48 41 32 35 36 4f 62 6a 43 6d 64 2c 20 28 43  SHA256ObjCmd, (C
a400: 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54  lientData) 0, (T
a410: 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
a420: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
a430: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
a440: 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  and(interp, "tls
a450: 3a 3a 73 68 61 35 31 32 22 2c 20 53 48 41 35 31  ::sha512", SHA51
a460: 32 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  2ObjCmd, (Client
a470: 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d  Data) 0, (Tcl_Cm
a480: 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
a490: 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72  ULL);.    Tcl_Cr
a4a0: 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
a4b0: 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 75 6e 73  nterp, "tls::uns
a4c0: 74 61 63 6b 22 2c 20 44 69 67 65 73 74 55 6e 73  tack", DigestUns
a4d0: 74 61 63 6b 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  tackObjCmd, (Cli
a4e0: 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c  entData) 0, (Tcl
a4f0: 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
a500: 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 72 65 74  ) NULL);.    ret
a510: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a     urn TCL_OK;.}..