Hex Artifact Content

Artifact 294d7165070a32c531d9ec3cc061dc6ddf072511a01b6b04b63686d7daa16e41:


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 54 59 50 45 5f  02.#define TYPE_
02a0: 4d 44 09 09 30 78 31 30 0a 23 64 65 66 69 6e 65  MD..0x10.#define
02b0: 20 54 59 50 45 5f 48 4d 41 43 09 30 78 32 30 0a   TYPE_HMAC.0x20.
02c0: 23 64 65 66 69 6e 65 20 54 59 50 45 5f 43 4d 41  #define TYPE_CMA
02d0: 43 09 30 78 34 30 0a 0a 2f 2a 0a 20 2a 20 54 68  C.0x40../*. * Th
02e0: 69 73 20 73 74 72 75 63 74 75 72 65 20 64 65 66  is structure def
02f0: 69 6e 65 73 20 74 68 65 20 70 65 72 2d 69 6e 73  ines the per-ins
0300: 74 61 6e 63 65 20 73 74 61 74 65 20 6f 66 20 61  tance state of a
0310: 20 64 69 67 65 73 74 20 6f 70 65 72 61 74 69 6f   digest operatio
0320: 6e 2e 0a 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  n.. */.typedef s
0330: 74 72 75 63 74 20 44 69 67 65 73 74 53 74 61 74  truct DigestStat
0340: 65 20 7b 0a 09 54 63 6c 5f 43 68 61 6e 6e 65 6c  e {..Tcl_Channel
0350: 20 73 65 6c 66 3b 09 2f 2a 20 54 68 69 73 20 73   self;./* This s
0360: 6f 63 6b 65 74 20 63 68 61 6e 6e 65 6c 20 2a 2f  ocket channel */
0370: 0a 09 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e  ..Tcl_TimerToken
0380: 20 74 69 6d 65 72 3b 09 2f 2a 20 54 69 6d 65 72   timer;./* Timer
0390: 20 66 6f 72 20 72 65 61 64 20 65 76 65 6e 74 73   for read events
03a0: 20 2a 2f 0a 0a 09 69 6e 74 20 66 6c 61 67 73 3b   */...int flags;
03b0: 09 09 2f 2a 20 43 68 61 6e 20 63 6f 6e 66 69 67  ../* Chan config
03c0: 20 66 6c 61 67 73 20 2a 2f 0a 09 69 6e 74 20 77   flags */..int w
03d0: 61 74 63 68 4d 61 73 6b 3b 09 09 2f 2a 20 43 75  atchMask;../* Cu
03e0: 72 72 65 6e 74 20 57 61 74 63 68 50 72 6f 63 20  rrent WatchProc 
03f0: 6d 61 73 6b 20 2a 2f 0a 09 69 6e 74 20 6d 6f 64  mask */..int mod
0400: 65 3b 09 09 2f 2a 20 43 75 72 72 65 6e 74 20 6d  e;../* Current m
0410: 6f 64 65 20 6f 66 20 70 61 72 65 6e 74 20 63 68  ode of parent ch
0420: 61 6e 6e 65 6c 20 2a 2f 0a 09 69 6e 74 20 66 6f  annel */..int fo
0430: 72 6d 61 74 3b 09 09 2f 2a 20 44 69 67 65 73 74  rmat;../* Digest
0440: 20 66 6f 72 6d 61 74 20 61 6e 64 20 6f 70 65 72   format and oper
0450: 61 74 69 6f 6e 20 2a 2f 0a 0a 09 54 63 6c 5f 49  ation */...Tcl_I
0460: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 09 2f  nterp *interp;./
0470: 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 65 72 70  * Current interp
0480: 72 65 74 65 72 20 2a 2f 0a 09 45 56 50 5f 4d 44  reter */..EVP_MD
0490: 5f 43 54 58 20 2a 63 74 78 3b 09 2f 2a 20 4d 44  _CTX *ctx;./* MD
04a0: 20 43 6f 6e 74 65 78 74 20 2a 2f 0a 09 48 4d 41   Context */..HMA
04b0: 43 5f 43 54 58 20 2a 68 63 74 78 3b 09 09 2f 2a  C_CTX *hctx;../*
04c0: 20 48 4d 41 43 20 43 6f 6e 74 65 78 74 20 2a 2f   HMAC Context */
04d0: 0a 09 43 4d 41 43 5f 43 54 58 20 2a 63 63 74 78  ..CMAC_CTX *cctx
04e0: 3b 09 09 2f 2a 20 43 4d 41 43 20 43 6f 6e 74 65  ;../* CMAC Conte
04f0: 78 74 20 2a 2f 0a 09 54 63 6c 5f 43 6f 6d 6d 61  xt */..Tcl_Comma
0500: 6e 64 20 74 6f 6b 65 6e 3b 09 2f 2a 20 43 6f 6d  nd token;./* Com
0510: 6d 61 6e 64 20 74 6f 6b 65 6e 20 2a 2f 0a 7d 20  mand token */.} 
0520: 44 69 67 65 73 74 53 74 61 74 65 3b 0a 0a 2f 2a  DigestState;../*
0530: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
0540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0570: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73  ------. *. * Tls
0580: 5f 44 69 67 65 73 74 4e 65 77 20 2d 2d 0a 20 2a  _DigestNew --. *
0590: 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f  . *.This functio
05a0: 6e 20 63 72 65 61 74 65 73 20 61 20 70 65 72 2d  n creates a per-
05b0: 69 6e 73 74 61 6e 63 65 20 73 74 61 74 65 20 64  instance state d
05c0: 61 74 61 20 73 74 72 75 63 74 75 72 65 0a 20 2a  ata structure. *
05d0: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09  . * Returns:. *.
05e0: 44 69 67 65 73 74 20 73 74 72 75 63 74 75 72 65  Digest structure
05f0: 20 70 6f 69 6e 74 65 72 0a 20 2a 0a 20 2a 20 53   pointer. *. * S
0600: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
0610: 43 72 65 61 74 65 73 20 73 74 72 75 63 74 75 72  Creates structur
0620: 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  e. *. *---------
0630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44  ----------. */.D
0670: 69 67 65 73 74 53 74 61 74 65 20 2a 54 6c 73 5f  igestState *Tls_
0680: 44 69 67 65 73 74 4e 65 77 28 54 63 6c 5f 49 6e  DigestNew(Tcl_In
0690: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
06a0: 74 20 66 6f 72 6d 61 74 29 20 7b 0a 20 20 20 20  t format) {.    
06b0: 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61  DigestState *sta
06c0: 74 65 50 74 72 3b 0a 0a 20 20 20 20 73 74 61 74  tePtr;..    stat
06d0: 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74  ePtr = (DigestSt
06e0: 61 74 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 28  ate *) ckalloc((
06f0: 75 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 6f 66  unsigned) sizeof
0700: 28 44 69 67 65 73 74 53 74 61 74 65 29 29 3b 0a  (DigestState));.
0710: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
0720: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6d 65 6d   != NULL) {..mem
0730: 73 65 74 28 73 74 61 74 65 50 74 72 2c 20 30 2c  set(statePtr, 0,
0740: 20 73 69 7a 65 6f 66 28 44 69 67 65 73 74 53 74   sizeof(DigestSt
0750: 61 74 65 29 29 3b 0a 09 73 74 61 74 65 50 74 72  ate));..statePtr
0760: 2d 3e 73 65 6c 66 09 3d 20 4e 55 4c 4c 3b 09 09  ->self.= NULL;..
0770: 2f 2a 20 54 68 69 73 20 73 6f 63 6b 65 74 20 63  /* This socket c
0780: 68 61 6e 6e 65 6c 20 2a 2f 0a 09 73 74 61 74 65  hannel */..state
0790: 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c  Ptr->timer = NUL
07a0: 4c 3b 09 09 2f 2a 20 54 69 6d 65 72 20 74 6f 20  L;../* Timer to 
07b0: 66 6c 75 73 68 20 64 61 74 61 20 2a 2f 0a 09 73  flush data */..s
07c0: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 3d  tatePtr->flags =
07d0: 20 30 3b 09 09 2f 2a 20 43 68 61 6e 20 63 6f 6e   0;../* Chan con
07e0: 66 69 67 20 66 6c 61 67 73 20 2a 2f 0a 09 73 74  fig flags */..st
07f0: 61 74 65 50 74 72 2d 3e 77 61 74 63 68 4d 61 73  atePtr->watchMas
0800: 6b 20 3d 20 30 3b 09 2f 2a 20 43 75 72 72 65 6e  k = 0;./* Curren
0810: 74 20 57 61 74 63 68 50 72 6f 63 20 6d 61 73 6b  t WatchProc mask
0820: 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 6d   */..statePtr->m
0830: 6f 64 65 09 3d 20 30 3b 09 09 2f 2a 20 43 75 72  ode.= 0;../* Cur
0840: 72 65 6e 74 20 6d 6f 64 65 20 6f 66 20 70 61 72  rent mode of par
0850: 65 6e 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 09  ent channel */..
0860: 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74  statePtr->format
0870: 20 3d 20 66 6f 72 6d 61 74 3b 09 2f 2a 20 44 69   = format;./* Di
0880: 67 65 73 74 20 66 6f 72 6d 61 74 20 61 6e 64 20  gest format and 
0890: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 09 73 74  operation */..st
08a0: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 20 3d  atePtr->interp =
08b0: 20 69 6e 74 65 72 70 3b 09 2f 2a 20 43 75 72 72   interp;./* Curr
08c0: 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72 20  ent interpreter 
08d0: 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 74  */..statePtr->ct
08e0: 78 20 3d 20 4e 55 4c 4c 3b 09 09 2f 2a 20 4d 44  x = NULL;../* MD
08f0: 20 43 6f 6e 74 65 78 74 20 2a 2f 0a 09 73 74 61   Context */..sta
0900: 74 65 50 74 72 2d 3e 68 63 74 78 20 3d 20 4e 55  tePtr->hctx = NU
0910: 4c 4c 3b 09 09 2f 2a 20 48 4d 41 43 20 43 6f 6e  LL;../* HMAC Con
0920: 74 65 78 74 20 2a 2f 0a 09 73 74 61 74 65 50 74  text */..statePt
0930: 72 2d 3e 63 63 74 78 20 3d 20 4e 55 4c 4c 3b 09  r->cctx = NULL;.
0940: 09 2f 2a 20 43 4d 41 43 20 43 6f 6e 74 65 78 74  ./* CMAC Context
0950: 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 74   */..statePtr->t
0960: 6f 6b 65 6e 20 3d 20 4e 55 4c 4c 3b 09 09 2f 2a  oken = NULL;../*
0970: 20 43 6f 6d 6d 61 6e 64 20 74 6f 6b 65 6e 20 2a   Command token *
0980: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  /.    }.    retu
0990: 72 6e 20 73 74 61 74 65 50 74 72 3b 0a 7d 0a 0a  rn statePtr;.}..
09a0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
09b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09e0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
09f0: 6c 73 5f 44 69 67 65 73 74 46 72 65 65 20 2d 2d  ls_DigestFree --
0a00: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63  . *. *.This func
0a10: 74 69 6f 6e 20 64 65 6c 65 74 65 73 20 61 20 64  tion deletes a d
0a20: 69 67 65 73 74 20 73 74 61 74 65 20 73 74 72 75  igest state stru
0a30: 63 74 75 72 65 0a 20 2a 0a 20 2a 20 52 65 74 75  cture. *. * Retu
0a40: 72 6e 73 3a 0a 20 2a 09 4e 6f 74 68 69 6e 67 0a  rns:. *.Nothing.
0a50: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
0a60: 74 73 3a 0a 20 2a 09 52 65 6d 6f 76 65 73 20 73  ts:. *.Removes s
0a70: 74 72 75 63 74 75 72 65 0a 20 2a 0a 20 2a 2d 2d  tructure. *. *--
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ac0: 2d 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f 44  -. */.void Tls_D
0ad0: 69 67 65 73 74 46 72 65 65 28 44 69 67 65 73 74  igestFree(Digest
0ae0: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 29  State *statePtr)
0af0: 20 7b 0a 20 20 20 20 69 66 20 28 73 74 61 74 65   {.    if (state
0b00: 50 74 72 20 3d 3d 20 28 44 69 67 65 73 74 53 74  Ptr == (DigestSt
0b10: 61 74 65 20 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09  ate *) NULL) {..
0b20: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20  return;.    }.. 
0b30: 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 70 65 6e     /* Remove pen
0b40: 64 69 6e 67 20 74 69 6d 65 72 20 2a 2f 0a 20 20  ding timer */.  
0b50: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
0b60: 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69  timer != (Tcl_Ti
0b70: 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20  merToken) NULL) 
0b80: 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d  {..Tcl_DeleteTim
0b90: 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50  erHandler(stateP
0ba0: 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 20 20 20 20  tr->timer);.    
0bb0: 7d 0a 0a 20 20 20 20 2f 2a 20 46 72 65 65 20 63  }..    /* Free c
0bc0: 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65  ontext structure
0bd0: 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61  s */.    if (sta
0be0: 74 65 50 74 72 2d 3e 63 74 78 20 21 3d 20 28 45  tePtr->ctx != (E
0bf0: 56 50 5f 4d 44 5f 43 54 58 20 2a 29 20 4e 55 4c  VP_MD_CTX *) NUL
0c00: 4c 29 20 7b 0a 09 45 56 50 5f 4d 44 5f 43 54 58  L) {..EVP_MD_CTX
0c10: 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e  _free(statePtr->
0c20: 63 74 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ctx);.    }.    
0c30: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 68 63  if (statePtr->hc
0c40: 74 78 20 21 3d 20 28 48 4d 41 43 5f 43 54 58 20  tx != (HMAC_CTX 
0c50: 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 48 4d 41 43  *) NULL) {..HMAC
0c60: 5f 43 54 58 5f 66 72 65 65 28 73 74 61 74 65 50  _CTX_free(stateP
0c70: 74 72 2d 3e 68 63 74 78 29 3b 0a 20 20 20 20 7d  tr->hctx);.    }
0c80: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
0c90: 72 2d 3e 63 63 74 78 20 21 3d 20 28 43 4d 41 43  r->cctx != (CMAC
0ca0: 5f 43 54 58 20 2a 29 20 4e 55 4c 4c 29 20 7b 0a  _CTX *) NULL) {.
0cb0: 09 43 4d 41 43 5f 43 54 58 5f 66 72 65 65 28 73  .CMAC_CTX_free(s
0cc0: 74 61 74 65 50 74 72 2d 3e 63 63 74 78 29 3b 0a  tatePtr->cctx);.
0cd0: 20 20 20 20 7d 0a 20 20 20 20 63 6b 66 72 65 65      }.    ckfree
0ce0: 28 73 74 61 74 65 50 74 72 29 3b 0a 7d 0a 0a 2f  (statePtr);.}../
0cf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0d00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0d10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0d20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0d30: 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ***/../*. *-----
0d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
0d80: 2a 0a 20 2a 20 54 6c 73 5f 44 69 67 65 73 74 49  *. * Tls_DigestI
0d90: 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 49 6e 69  nit --. *. *.Ini
0da0: 74 69 61 6c 69 7a 65 20 61 20 68 61 73 68 20 66  tialize a hash f
0db0: 75 6e 63 74 69 6f 6e 0a 20 2a 0a 20 2a 20 52 65  unction. *. * Re
0dc0: 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b  turns:. *.TCL_OK
0dd0: 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f   if successful o
0de0: 72 20 54 43 4c 5f 45 52 52 4f 52 20 66 6f 72 20  r TCL_ERROR for 
0df0: 66 61 69 6c 75 72 65 20 77 69 74 68 20 72 65 73  failure with res
0e00: 75 6c 74 20 73 65 74 0a 20 2a 09 74 6f 20 65 72  ult set. *.to er
0e10: 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a  ror message.. *.
0e20: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
0e30: 0a 20 2a 09 4e 6f 20 72 65 73 75 6c 74 20 6f 72  . *.No result or
0e40: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20   error message. 
0e50: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
0e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e90: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20  -------. */.int 
0ea0: 54 6c 73 5f 44 69 67 65 73 74 49 6e 69 74 28 54  Tls_DigestInit(T
0eb0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
0ec0: 70 2c 20 44 69 67 65 73 74 53 74 61 74 65 20 2a  p, DigestState *
0ed0: 73 74 61 74 65 50 74 72 2c 20 63 6f 6e 73 74 20  statePtr, const 
0ee0: 45 56 50 5f 4d 44 20 2a 6d 64 2c 0a 09 63 6f 6e  EVP_MD *md,..con
0ef0: 73 74 20 45 56 50 5f 43 49 50 48 45 52 20 2a 63  st EVP_CIPHER *c
0f00: 69 70 68 65 72 2c 20 54 63 6c 5f 4f 62 6a 20 2a  ipher, Tcl_Obj *
0f10: 6b 65 79 4f 62 6a 29 20 7b 0a 20 20 20 20 69 6e  keyObj) {.    in
0f20: 74 20 6b 65 79 5f 6c 65 6e 20 3d 20 30 2c 20 72  t key_len = 0, r
0f30: 65 73 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  es = 0;.    cons
0f40: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
0f50: 2a 6b 65 79 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20  *key = NULL;..  
0f60: 20 20 2f 2a 20 43 72 65 61 74 65 20 6d 65 73 73    /* Create mess
0f70: 61 67 65 20 64 69 67 65 73 74 20 63 6f 6e 74 65  age digest conte
0f80: 78 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74  xt */.    if (st
0f90: 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26  atePtr->format &
0fa0: 20 54 59 50 45 5f 4d 44 29 20 7b 0a 09 73 74 61   TYPE_MD) {..sta
0fb0: 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 45 56 50  tePtr->ctx = EVP
0fc0: 5f 4d 44 5f 43 54 58 5f 6e 65 77 28 29 3b 0a 09  _MD_CTX_new();..
0fd0: 72 65 73 20 3d 20 28 73 74 61 74 65 50 74 72 2d  res = (statePtr-
0fe0: 3e 63 74 78 20 21 3d 20 4e 55 4c 4c 29 3b 0a 20  >ctx != NULL);. 
0ff0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
1000: 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26  atePtr->format &
1010: 20 54 59 50 45 5f 48 4d 41 43 29 20 7b 0a 09 73   TYPE_HMAC) {..s
1020: 74 61 74 65 50 74 72 2d 3e 68 63 74 78 20 3d 20  tatePtr->hctx = 
1030: 48 4d 41 43 5f 43 54 58 5f 6e 65 77 28 29 3b 0a  HMAC_CTX_new();.
1040: 09 72 65 73 20 3d 20 28 73 74 61 74 65 50 74 72  .res = (statePtr
1050: 2d 3e 68 63 74 78 20 21 3d 20 4e 55 4c 4c 29 3b  ->hctx != NULL);
1060: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
1070: 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74  statePtr->format
1080: 20 26 20 54 59 50 45 5f 43 4d 41 43 29 20 7b 0a   & TYPE_CMAC) {.
1090: 09 73 74 61 74 65 50 74 72 2d 3e 63 63 74 78 20  .statePtr->cctx 
10a0: 3d 20 43 4d 41 43 5f 43 54 58 5f 6e 65 77 28 29  = CMAC_CTX_new()
10b0: 3b 0a 09 72 65 73 20 3d 20 28 73 74 61 74 65 50  ;..res = (stateP
10c0: 74 72 2d 3e 63 63 74 78 20 21 3d 20 4e 55 4c 4c  tr->cctx != NULL
10d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  );.    }.    if 
10e0: 28 21 72 65 73 29 20 7b 0a 09 54 63 6c 5f 41 70  (!res) {..Tcl_Ap
10f0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1100: 70 2c 20 22 43 72 65 61 74 65 20 63 6f 6e 74 65  p, "Create conte
1110: 78 74 20 66 61 69 6c 65 64 3a 20 22 2c 20 52 45  xt failed: ", RE
1120: 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09  ASON(), NULL);..
1130: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1140: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1150: 47 65 74 20 6b 65 79 20 2a 2f 0a 20 20 20 20 69  Get key */.    i
1160: 66 20 28 6b 65 79 4f 62 6a 20 21 3d 20 4e 55 4c  f (keyObj != NUL
1170: 4c 29 20 7b 0a 09 6b 65 79 20 3d 20 54 63 6c 5f  L) {..key = Tcl_
1180: 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
1190: 4f 62 6a 28 6b 65 79 4f 62 6a 2c 20 26 6b 65 79  Obj(keyObj, &key
11a0: 5f 6c 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  _len);.    }..  
11b0: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
11c0: 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  hash function */
11d0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
11e0: 72 2d 3e 66 6f 72 6d 61 74 20 26 20 54 59 50 45  r->format & TYPE
11f0: 5f 4d 44 29 20 7b 0a 09 72 65 73 20 3d 20 45 56  _MD) {..res = EV
1200: 50 5f 44 69 67 65 73 74 49 6e 69 74 5f 65 78 28  P_DigestInit_ex(
1210: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 6d  statePtr->ctx, m
1220: 64 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 20  d, NULL);.    } 
1230: 65 6c 73 65 20 69 66 20 28 73 74 61 74 65 50 74  else if (statePt
1240: 72 2d 3e 66 6f 72 6d 61 74 20 26 20 54 59 50 45  r->format & TYPE
1250: 5f 48 4d 41 43 29 20 7b 0a 09 72 65 73 20 3d 20  _HMAC) {..res = 
1260: 48 4d 41 43 5f 49 6e 69 74 5f 65 78 28 73 74 61  HMAC_Init_ex(sta
1270: 74 65 50 74 72 2d 3e 68 63 74 78 2c 20 28 63 6f  tePtr->hctx, (co
1280: 6e 73 74 20 76 6f 69 64 20 2a 29 20 6b 65 79 2c  nst void *) key,
1290: 20 6b 65 79 5f 6c 65 6e 2c 20 6d 64 2c 20 4e 55   key_len, md, NU
12a0: 4c 4c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  LL);.    } else 
12b0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6f  if (statePtr->fo
12c0: 72 6d 61 74 20 26 20 54 59 50 45 5f 43 4d 41 43  rmat & TYPE_CMAC
12d0: 29 20 7b 0a 09 72 65 73 20 3d 20 43 4d 41 43 5f  ) {..res = CMAC_
12e0: 49 6e 69 74 28 73 74 61 74 65 50 74 72 2d 3e 63  Init(statePtr->c
12f0: 63 74 78 2c 20 28 63 6f 6e 73 74 20 76 6f 69 64  ctx, (const void
1300: 20 2a 29 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e   *) key, key_len
1310: 2c 20 63 69 70 68 65 72 2c 20 4e 55 4c 4c 29 3b  , cipher, NULL);
1320: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21  .    }.    if (!
1330: 72 65 73 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  res) {..Tcl_Appe
1340: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1350: 20 22 49 6e 69 74 69 61 6c 69 7a 65 20 66 61 69   "Initialize fai
1360: 6c 65 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29  led: ", REASON()
1370: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  , NULL);..return
1380: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
1390: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  }.    return TCL
13a0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  _OK;.}../*. *---
13b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f0: 0a 20 2a 0a 20 2a 20 54 6c 73 5f 44 69 67 65 73  . *. * Tls_Diges
1400: 74 55 70 64 61 74 65 20 2d 2d 0a 20 2a 0a 20 2a  tUpdate --. *. *
1410: 09 55 70 64 61 74 65 20 61 20 68 61 73 68 20 66  .Update a hash f
1420: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 64 61 74  unction with dat
1430: 61 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a  a. *. * Returns:
1440: 0a 20 2a 09 31 20 69 66 20 73 75 63 63 65 73 73  . *.1 if success
1450: 66 75 6c 20 6f 72 20 30 20 66 6f 72 20 66 61 69  ful or 0 for fai
1460: 6c 75 72 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20  lure. *. * Side 
1470: 65 66 66 65 63 74 73 3a 0a 20 2a 09 41 64 64 73  effects:. *.Adds
1480: 20 62 75 66 20 64 61 74 61 20 74 6f 20 68 61 73   buf data to has
1490: 68 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20 73 65  h function or se
14a0: 74 73 20 72 65 73 75 6c 74 20 74 6f 20 65 72 72  ts result to err
14b0: 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a  or message. *. *
14c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1500: 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 54 6c 73 5f  ---. */.int Tls_
1510: 44 69 67 65 73 74 55 70 64 61 74 65 28 44 69 67  DigestUpdate(Dig
1520: 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50  estState *stateP
1530: 74 72 2c 20 63 68 61 72 20 2a 62 75 66 2c 20 73  tr, char *buf, s
1540: 69 7a 65 5f 74 20 72 65 61 64 2c 20 69 6e 74 20  ize_t read, int 
1550: 64 6f 5f 72 65 73 75 6c 74 29 20 7b 0a 20 20 20  do_result) {.   
1560: 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 0a 20   int res = 0;.. 
1570: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
1580: 3e 66 6f 72 6d 61 74 20 26 20 54 59 50 45 5f 4d  >format & TYPE_M
1590: 44 29 20 7b 0a 09 72 65 73 20 3d 20 45 56 50 5f  D) {..res = EVP_
15a0: 44 69 67 65 73 74 55 70 64 61 74 65 28 73 74 61  DigestUpdate(sta
15b0: 74 65 50 74 72 2d 3e 63 74 78 2c 20 62 75 66 2c  tePtr->ctx, buf,
15c0: 20 72 65 61 64 29 3b 0a 20 20 20 20 7d 20 65 6c   read);.    } el
15d0: 73 65 20 69 66 20 28 73 74 61 74 65 50 74 72 2d  se if (statePtr-
15e0: 3e 66 6f 72 6d 61 74 20 26 20 54 59 50 45 5f 48  >format & TYPE_H
15f0: 4d 41 43 29 20 7b 0a 09 72 65 73 20 3d 20 48 4d  MAC) {..res = HM
1600: 41 43 5f 55 70 64 61 74 65 28 73 74 61 74 65 50  AC_Update(stateP
1610: 74 72 2d 3e 68 63 74 78 2c 20 62 75 66 2c 20 72  tr->hctx, buf, r
1620: 65 61 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  ead);.    } else
1630: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66   if (statePtr->f
1640: 6f 72 6d 61 74 20 26 20 54 59 50 45 5f 43 4d 41  ormat & TYPE_CMA
1650: 43 29 20 7b 0a 09 72 65 73 20 3d 20 43 4d 41 43  C) {..res = CMAC
1660: 5f 55 70 64 61 74 65 28 73 74 61 74 65 50 74 72  _Update(statePtr
1670: 2d 3e 63 63 74 78 2c 20 62 75 66 2c 20 72 65 61  ->cctx, buf, rea
1680: 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  d);.    }.    if
1690: 20 28 21 72 65 73 20 26 26 20 64 6f 5f 72 65 73   (!res && do_res
16a0: 75 6c 74 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  ult) {..Tcl_Appe
16b0: 6e 64 52 65 73 75 6c 74 28 73 74 61 74 65 50 74  ndResult(statePt
16c0: 72 2d 3e 69 6e 74 65 72 70 2c 20 22 55 70 64 61  r->interp, "Upda
16d0: 74 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 52 45  te failed: ", RE
16e0: 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09  ASON(), NULL);..
16f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1700: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
1710: 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  rn res;.}../*. *
1720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1760: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 44 69  ---. *. * Tls_Di
1770: 67 65 73 74 46 69 6e 69 61 6c 69 7a 65 20 2d 2d  gestFinialize --
1780: 0a 20 2a 0a 20 2a 09 46 69 6e 61 6c 69 7a 65 20  . *. *.Finalize 
1790: 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20  a hash function 
17a0: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 6d  and return the m
17b0: 65 73 73 61 67 65 20 64 69 67 65 73 74 0a 20 2a  essage digest. *
17c0: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09  . * Returns:. *.
17d0: 54 43 4c 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  TCL_OK if succes
17e0: 73 66 75 6c 20 6f 72 20 54 43 4c 5f 45 52 52 4f  sful or TCL_ERRO
17f0: 52 20 66 6f 72 20 66 61 69 6c 75 72 65 20 77 69  R for failure wi
1800: 74 68 20 72 65 73 75 6c 74 20 73 65 74 0a 20 2a  th result set. *
1810: 09 74 6f 20 65 72 72 6f 72 20 6d 65 73 73 61 67  .to error messag
1820: 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  e.. *. * Side ef
1830: 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 72  fects:. *.Sets r
1840: 65 73 75 6c 74 20 74 6f 20 6d 65 73 73 61 67 65  esult to message
1850: 20 64 69 67 65 73 74 20 6f 72 20 61 6e 20 65 72   digest or an er
1860: 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a  ror message.. *.
1870: 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18b0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 54 6c  -----. */.int Tl
18c0: 73 5f 44 69 67 65 73 74 46 69 6e 69 61 6c 69 7a  s_DigestFinializ
18d0: 65 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  e(Tcl_Interp *in
18e0: 74 65 72 70 2c 20 44 69 67 65 73 74 53 74 61 74  terp, DigestStat
18f0: 65 20 2a 73 74 61 74 65 50 74 72 2c 20 54 63 6c  e *statePtr, Tcl
1900: 5f 4f 62 6a 20 2a 2a 72 65 73 75 6c 74 4f 62 6a  _Obj **resultObj
1910: 29 20 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  ) {.    unsigned
1920: 20 63 68 61 72 20 6d 64 5f 62 75 66 5b 45 56 50   char md_buf[EVP
1930: 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45 5d 3b 0a 20  _MAX_MD_SIZE];. 
1940: 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
1950: 6d 64 5f 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20  md_len;.    int 
1960: 72 65 73 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  res = 0;..    /*
1970: 20 46 69 6e 61 6c 69 7a 65 20 68 61 73 68 20 66   Finalize hash f
1980: 75 6e 63 74 69 6f 6e 20 61 6e 64 20 63 61 6c 63  unction and calc
1990: 75 6c 61 74 65 20 6d 65 73 73 61 67 65 20 64 69  ulate message di
19a0: 67 65 73 74 20 2a 2f 0a 20 20 20 20 69 66 20 28  gest */.    if (
19b0: 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74  statePtr->format
19c0: 20 26 20 54 59 50 45 5f 4d 44 29 20 7b 0a 09 72   & TYPE_MD) {..r
19d0: 65 73 20 3d 20 45 56 50 5f 44 69 67 65 73 74 46  es = EVP_DigestF
19e0: 69 6e 61 6c 5f 65 78 28 73 74 61 74 65 50 74 72  inal_ex(statePtr
19f0: 2d 3e 63 74 78 2c 20 6d 64 5f 62 75 66 2c 20 26  ->ctx, md_buf, &
1a00: 6d 64 5f 6c 65 6e 29 3b 0a 20 20 20 20 7d 20 65  md_len);.    } e
1a10: 6c 73 65 20 69 66 20 28 73 74 61 74 65 50 74 72  lse if (statePtr
1a20: 2d 3e 66 6f 72 6d 61 74 20 26 20 54 59 50 45 5f  ->format & TYPE_
1a30: 48 4d 41 43 29 20 7b 0a 09 72 65 73 20 3d 20 48  HMAC) {..res = H
1a40: 4d 41 43 5f 46 69 6e 61 6c 28 73 74 61 74 65 50  MAC_Final(stateP
1a50: 74 72 2d 3e 68 63 74 78 2c 20 6d 64 5f 62 75 66  tr->hctx, md_buf
1a60: 2c 20 26 6d 64 5f 6c 65 6e 29 3b 0a 20 20 20 20  , &md_len);.    
1a70: 7d 20 65 6c 73 65 20 69 66 20 28 73 74 61 74 65  } else if (state
1a80: 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20 54 59  Ptr->format & TY
1a90: 50 45 5f 43 4d 41 43 29 20 7b 0a 09 73 69 7a 65  PE_CMAC) {..size
1aa0: 5f 74 20 6c 65 6e 3b 0a 09 72 65 73 20 3d 20 43  _t len;..res = C
1ab0: 4d 41 43 5f 46 69 6e 61 6c 28 73 74 61 74 65 50  MAC_Final(stateP
1ac0: 74 72 2d 3e 63 63 74 78 2c 20 6d 64 5f 62 75 66  tr->cctx, md_buf
1ad0: 2c 20 26 6c 65 6e 29 3b 0a 09 6d 64 5f 6c 65 6e  , &len);..md_len
1ae0: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74   = (unsigned int
1af0: 29 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20  ) len;.    }..  
1b00: 20 20 69 66 20 28 21 72 65 73 29 20 7b 0a 09 69    if (!res) {..i
1b10: 66 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20  f (resultObj == 
1b20: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c  NULL) {..    Tcl
1b30: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1b40: 74 65 72 70 2c 20 22 46 69 6e 61 6c 69 7a 65 20  terp, "Finalize 
1b50: 66 61 69 6c 65 64 3a 20 22 2c 20 52 45 41 53 4f  failed: ", REASO
1b60: 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 7d 0a 09  N(), NULL);..}..
1b70: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1b80: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1b90: 52 65 74 75 72 6e 20 6d 65 73 73 61 67 65 20 64  Return message d
1ba0: 69 67 65 73 74 20 61 73 20 65 69 74 68 65 72 20  igest as either 
1bb0: 61 20 62 69 6e 61 72 79 20 6f 72 20 68 65 78 20  a binary or hex 
1bc0: 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 69 66  string */.    if
1bd0: 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d   (statePtr->form
1be0: 61 74 20 26 20 42 49 4e 5f 46 4f 52 4d 41 54 29  at & BIN_FORMAT)
1bf0: 20 7b 0a 09 69 66 20 28 72 65 73 75 6c 74 4f 62   {..if (resultOb
1c00: 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  j == NULL) {..  
1c10: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
1c20: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
1c30: 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 6d  ewByteArrayObj(m
1c40: 64 5f 62 75 66 2c 20 6d 64 5f 6c 65 6e 29 29 3b  d_buf, md_len));
1c50: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
1c60: 2a 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c  *resultObj = Tcl
1c70: 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a  _NewByteArrayObj
1c80: 28 6d 64 5f 62 75 66 2c 20 6d 64 5f 6c 65 6e 29  (md_buf, md_len)
1c90: 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  ;..    Tcl_IncrR
1ca0: 65 66 43 6f 75 6e 74 28 2a 72 65 73 75 6c 74 4f  efCount(*resultO
1cb0: 62 6a 29 3b 0a 09 7d 0a 0a 20 20 20 20 7d 20 65  bj);..}..    } e
1cc0: 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a  lse {..Tcl_Obj *
1cd0: 6e 65 77 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77  newObj = Tcl_New
1ce0: 4f 62 6a 28 29 3b 0a 09 75 6e 73 69 67 6e 65 64  Obj();..unsigned
1cf0: 20 63 68 61 72 20 2a 70 74 72 20 3d 20 54 63 6c   char *ptr = Tcl
1d00: 5f 53 65 74 42 79 74 65 41 72 72 61 79 4c 65 6e  _SetByteArrayLen
1d10: 67 74 68 28 6e 65 77 4f 62 6a 2c 20 6d 64 5f 6c  gth(newObj, md_l
1d20: 65 6e 2a 32 29 3b 0a 0a 09 66 6f 72 20 28 75 6e  en*2);...for (un
1d30: 73 69 67 6e 65 64 20 69 6e 74 20 69 20 3d 20 30  signed int i = 0
1d40: 3b 20 69 20 3c 20 6d 64 5f 6c 65 6e 3b 20 69 2b  ; i < md_len; i+
1d50: 2b 29 20 7b 0a 09 20 20 20 20 2a 70 74 72 2b 2b  +) {..    *ptr++
1d60: 20 3d 20 68 65 78 5b 28 6d 64 5f 62 75 66 5b 69   = hex[(md_buf[i
1d70: 5d 20 3e 3e 20 34 29 20 26 20 30 78 30 46 5d 3b  ] >> 4) & 0x0F];
1d80: 0a 09 20 20 20 20 2a 70 74 72 2b 2b 20 3d 20 68  ..    *ptr++ = h
1d90: 65 78 5b 6d 64 5f 62 75 66 5b 69 5d 20 26 20 30  ex[md_buf[i] & 0
1da0: 78 30 46 5d 3b 0a 09 7d 0a 0a 09 69 66 20 28 72  x0F];..}...if (r
1db0: 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c  esultObj == NULL
1dc0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74  ) {..    Tcl_Set
1dd0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
1de0: 2c 20 6e 65 77 4f 62 6a 29 3b 0a 09 7d 20 65 6c  , newObj);..} el
1df0: 73 65 20 7b 0a 09 20 20 20 20 2a 72 65 73 75 6c  se {..    *resul
1e00: 74 4f 62 6a 20 3d 20 6e 65 77 4f 62 6a 3b 0a 09  tObj = newObj;..
1e10: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
1e20: 6f 75 6e 74 28 2a 72 65 73 75 6c 74 4f 62 6a 29  ount(*resultObj)
1e30: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72  ;..}.    }.    r
1e40: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1e50: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
1e60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e90: 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  *****/../*. *---
1ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ee0: 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 42 6c 6f  . *. * DigestBlo
1ef0: 63 6b 4d 6f 64 65 50 72 6f 63 20 2d 2d 0a 20 2a  ckModeProc --. *
1f00: 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f  . *.This functio
1f10: 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20  n is invoked by 
1f20: 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c  the generic IO l
1f30: 65 76 65 6c 0a 20 2a 09 74 6f 20 73 65 74 20 62  evel. *.to set b
1f40: 6c 6f 63 6b 69 6e 67 20 61 6e 64 20 6e 6f 6e 62  locking and nonb
1f50: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 2e 0a 20  locking modes.. 
1f60: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a  *. * Returns:. *
1f70: 09 30 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  .0 if successful
1f80: 20 6f 72 20 50 4f 53 49 58 20 65 72 72 6f 72 20   or POSIX error 
1f90: 63 6f 64 65 20 69 66 20 66 61 69 6c 65 64 2e 0a  code if failed..
1fa0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
1fb0: 74 73 3a 0a 20 2a 09 53 65 74 73 20 74 68 65 20  ts:. *.Sets the 
1fc0: 64 65 76 69 63 65 20 69 6e 74 6f 20 62 6c 6f 63  device into bloc
1fd0: 6b 69 6e 67 20 6f 72 20 6e 6f 6e 62 6c 6f 63 6b  king or nonblock
1fe0: 69 6e 67 20 6d 6f 64 65 2e 0a 20 2a 09 43 61 6e  ing mode.. *.Can
1ff0: 20 63 61 6c 6c 20 54 63 6c 5f 53 65 74 43 68 61   call Tcl_SetCha
2000: 6e 6e 65 6c 45 72 72 6f 72 2e 0a 20 2a 0a 20 2a  nnelError.. *. *
2010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2050: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
2060: 6e 74 20 44 69 67 65 73 74 42 6c 6f 63 6b 4d 6f  nt DigestBlockMo
2070: 64 65 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74  deProc(ClientDat
2080: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e  a clientData, in
2090: 74 20 6d 6f 64 65 29 20 7b 0a 20 20 20 20 44 69  t mode) {.    Di
20a0: 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65  gestState *state
20b0: 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 61  Ptr = (DigestSta
20c0: 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61  te *) clientData
20d0: 3b 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 20  ;..    if (mode 
20e0: 3d 3d 20 54 43 4c 5f 4d 4f 44 45 5f 4e 4f 4e 42  == TCL_MODE_NONB
20f0: 4c 4f 43 4b 49 4e 47 29 20 7b 0a 09 73 74 61 74  LOCKING) {..stat
2100: 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54  ePtr->flags |= T
2110: 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 3b 0a 20 20  LS_TCL_ASYNC;.  
2120: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 74 61 74    } else {..stat
2130: 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e  ePtr->flags &= ~
2140: 28 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29 3b  (TLS_TCL_ASYNC);
2150: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
2160: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  n 0;.}../*. *---
2170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21b0: 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 43 6c 6f  . *. * DigestClo
21c0: 73 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09  seProc --. *. *.
21d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
21e0: 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20   invoked by the 
21f0: 67 65 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 6c  generic IO level
2200: 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20 2a 09 63   to perform. *.c
2210: 68 61 6e 6e 65 6c 2d 74 79 70 65 20 73 70 65 63  hannel-type spec
2220: 69 66 69 63 20 63 6c 65 61 6e 75 70 20 77 68 65  ific cleanup whe
2230: 6e 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 69 73  n the channel is
2240: 20 63 6c 6f 73 65 64 2e 20 41 6c 6c 0a 20 2a 09   closed. All. *.
2250: 71 75 65 75 65 64 20 6f 75 74 70 75 74 20 69 73  queued output is
2260: 20 66 6c 75 73 68 65 64 20 70 72 69 6f 72 20 74   flushed prior t
2270: 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  o calling this f
2280: 75 6e 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52  unction.. *. * R
2290: 65 74 75 72 6e 73 3a 0a 20 2a 09 30 20 69 66 20  eturns:. *.0 if 
22a0: 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 50 4f  successful or PO
22b0: 53 49 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69  SIX error code i
22c0: 66 20 66 61 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20  f failed.. *. * 
22d0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
22e0: 09 44 65 6c 65 74 65 73 20 73 74 6f 72 65 64 20  .Deletes stored 
22f0: 73 74 61 74 65 20 64 61 74 61 2e 0a 20 2a 0a 20  state data.. *. 
2300: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
2310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2340: 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 67  ----. */.int Dig
2350: 65 73 74 43 6c 6f 73 65 50 72 6f 63 28 43 6c 69  estCloseProc(Cli
2360: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
2370: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
2380: 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 44 69  interp) {.    Di
2390: 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65  gestState *state
23a0: 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 61  Ptr = (DigestSta
23b0: 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61  te *) clientData
23c0: 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 6e 63 65 6c  ;..    /* Cancel
23d0: 20 61 63 74 69 76 65 20 74 69 6d 65 72 2c 20 69   active timer, i
23e0: 66 20 61 6e 79 20 2a 2f 0a 20 20 20 20 69 66 20  f any */.    if 
23f0: 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72  (statePtr->timer
2400: 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f   != (Tcl_TimerTo
2410: 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63  ken) NULL) {..Tc
2420: 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e  l_DeleteTimerHan
2430: 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74  dler(statePtr->t
2440: 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72  imer);..statePtr
2450: 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54  ->timer = (Tcl_T
2460: 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b  imerToken) NULL;
2470: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f  .    }..    /* O
2480: 75 74 70 75 74 20 6d 65 73 73 61 67 65 20 64 69  utput message di
2490: 67 65 73 74 20 69 66 20 6e 6f 74 20 61 6c 72 65  gest if not alre
24a0: 61 64 79 20 64 6f 6e 65 20 2a 2f 0a 20 20 20 20  ady done */.    
24b0: 69 66 20 28 21 28 73 74 61 74 65 50 74 72 2d 3e  if (!(statePtr->
24c0: 66 6c 61 67 73 20 26 20 43 48 41 4e 5f 45 4f 46  flags & CHAN_EOF
24d0: 29 29 20 7b 0a 09 54 63 6c 5f 43 68 61 6e 6e 65  )) {..Tcl_Channe
24e0: 6c 20 70 61 72 65 6e 74 20 3d 20 54 63 6c 5f 47  l parent = Tcl_G
24f0: 65 74 53 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c  etStackedChannel
2500: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
2510: 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75  ;..Tcl_Obj *resu
2520: 6c 74 4f 62 6a 3b 0a 09 69 6e 74 20 77 72 69 74  ltObj;..int writ
2530: 74 65 6e 3b 0a 0a 09 69 66 20 28 44 69 67 65 73  ten;...if (Diges
2540: 74 5f 46 69 6e 61 6c 69 7a 65 28 73 74 61 74 65  t_Finalize(state
2550: 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 73 74 61  Ptr->interp, sta
2560: 74 65 50 74 72 2c 20 26 72 65 73 75 6c 74 4f 62  tePtr, &resultOb
2570: 6a 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  j) == TCL_OK) {.
2580: 09 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
2590: 61 72 20 2a 64 61 74 61 20 3d 20 54 63 6c 5f 47  ar *data = Tcl_G
25a0: 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
25b0: 62 6a 28 72 65 73 75 6c 74 4f 62 6a 2c 20 26 77  bj(resultObj, &w
25c0: 72 69 74 74 65 6e 29 3b 0a 09 20 20 20 20 54 63  ritten);..    Tc
25d0: 6c 5f 57 72 69 74 65 52 61 77 28 70 61 72 65 6e  l_WriteRaw(paren
25e0: 74 2c 20 64 61 74 61 2c 20 77 72 69 74 74 65 6e  t, data, written
25f0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 65 63 72  );..    Tcl_Decr
2600: 52 65 66 43 6f 75 6e 74 28 72 65 73 75 6c 74 4f  RefCount(resultO
2610: 62 6a 29 3b 0a 09 7d 0a 09 73 74 61 74 65 50 74  bj);..}..statePt
2620: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 48 41 4e  r->flags |= CHAN
2630: 5f 45 4f 46 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _EOF;.    }..   
2640: 20 2f 2a 20 43 6c 65 61 6e 2d 75 70 20 2a 2f 0a   /* Clean-up */.
2650: 20 20 20 20 54 6c 73 5f 44 69 67 65 73 74 46 72      Tls_DigestFr
2660: 65 65 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20  ee(statePtr);.  
2670: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2680: 2a 0a 20 2a 20 53 61 6d 65 20 61 73 20 44 69 67  *. * Same as Dig
2690: 65 73 74 43 6c 6f 73 65 50 72 6f 63 20 62 75 74  estCloseProc but
26a0: 20 77 69 74 68 20 69 6e 64 69 76 69 64 75 61 6c   with individual
26b0: 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   read and write 
26c0: 63 6c 6f 73 65 20 63 6f 6e 74 72 6f 6c 0a 20 2a  close control. *
26d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 69 67  /.static int Dig
26e0: 65 73 74 43 6c 6f 73 65 32 50 72 6f 63 28 43 6c  estClose2Proc(Cl
26f0: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63  ientData instanc
2700: 65 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  eData, Tcl_Inter
2710: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66  p *interp, int f
2720: 6c 61 67 73 29 20 7b 0a 0a 20 20 20 20 69 66 20  lags) {..    if 
2730: 28 28 66 6c 61 67 73 20 26 20 28 54 43 4c 5f 43  ((flags & (TCL_C
2740: 4c 4f 53 45 5f 52 45 41 44 20 7c 20 54 43 4c 5f  LOSE_READ | TCL_
2750: 43 4c 4f 53 45 5f 57 52 49 54 45 29 29 20 3d 3d  CLOSE_WRITE)) ==
2760: 20 30 29 20 7b 0a 09 72 65 74 75 72 6e 20 44 69   0) {..return Di
2770: 67 65 73 74 43 6c 6f 73 65 50 72 6f 63 28 69 6e  gestCloseProc(in
2780: 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e 74 65  stanceData, inte
2790: 72 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  rp);.    }.    r
27a0: 65 74 75 72 6e 20 45 49 4e 56 41 4c 3b 0a 7d 0a  eturn EINVAL;.}.
27b0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
27c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
2800: 20 2a 20 44 69 67 65 73 74 49 6e 70 75 74 50 72   * DigestInputPr
2810: 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c  oc --. *. *.Call
2820: 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 69  ed by the generi
2830: 63 20 49 4f 20 73 79 73 74 65 6d 20 74 6f 20 72  c IO system to r
2840: 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 74 72  ead data from tr
2850: 61 6e 73 66 6f 72 6d 20 61 6e 64 0a 20 2a 09 70  ansform and. *.p
2860: 6c 61 63 65 20 69 6e 20 62 75 66 2e 20 54 72 61  lace in buf. Tra
2870: 6e 73 66 6f 72 6d 20 67 65 74 73 20 64 61 74 61  nsform gets data
2880: 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c   from the underl
2890: 79 69 6e 67 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a  ying channel.. *
28a0: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09  . * Returns:. *.
28b0: 54 6f 74 61 6c 20 62 79 74 65 73 20 72 65 61 64  Total bytes read
28c0: 20 6f 72 20 2d 31 20 66 6f 72 20 61 6e 20 65 72   or -1 for an er
28d0: 72 6f 72 20 61 6c 6f 6e 67 20 77 69 74 68 20 61  ror along with a
28e0: 20 50 4f 53 49 58 20 65 72 72 6f 72 0a 20 2a 09   POSIX error. *.
28f0: 63 6f 64 65 20 69 6e 20 65 72 72 6f 72 43 6f 64  code in errorCod
2900: 65 50 74 72 2e 20 55 73 65 20 45 41 47 41 49 4e  ePtr. Use EAGAIN
2910: 20 66 6f 72 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67   for nonblocking
2920: 20 61 6e 64 20 6e 6f 20 64 61 74 61 2e 0a 20 2a   and no data.. *
2930: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
2940: 3a 0a 20 2a 09 52 65 61 64 20 64 61 74 61 20 66  :. *.Read data f
2950: 72 6f 6d 20 74 72 61 6e 73 66 6f 72 6d 20 61 6e  rom transform an
2960: 64 20 77 72 69 74 65 20 74 6f 20 62 75 66 0a 20  d write to buf. 
2970: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
2980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69  ----------. */.i
29c0: 6e 74 20 44 69 67 65 73 74 49 6e 70 75 74 50 72  nt DigestInputPr
29d0: 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  oc(ClientData cl
29e0: 69 65 6e 74 44 61 74 61 2c 20 63 68 61 72 20 2a  ientData, char *
29f0: 62 75 66 2c 20 69 6e 74 20 74 6f 52 65 61 64 2c  buf, int toRead,
2a00: 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50   int *errorCodeP
2a10: 74 72 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74  tr) {.    Digest
2a20: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20  State *statePtr 
2a30: 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a  = (DigestState *
2a40: 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20  ) clientData;.  
2a50: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 70 61    Tcl_Channel pa
2a60: 72 65 6e 74 3b 0a 20 20 20 20 69 6e 74 20 72 65  rent;.    int re
2a70: 61 64 3b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f  ad;.    *errorCo
2a80: 64 65 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20  dePtr = 0;..    
2a90: 2f 2a 20 41 62 6f 72 74 20 69 66 20 6e 6f 74 68  /* Abort if noth
2aa0: 69 6e 67 20 74 6f 20 70 72 6f 63 65 73 73 20 2a  ing to process *
2ab0: 2f 0a 20 20 20 20 69 66 20 28 74 6f 52 65 61 64  /.    if (toRead
2ac0: 20 3c 3d 20 30 20 7c 7c 20 73 74 61 74 65 50 74   <= 0 || statePt
2ad0: 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f  r->self == (Tcl_
2ae0: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
2af0: 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ..return 0;.    
2b00: 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 62 79  }..    /* Get by
2b10: 74 65 73 20 66 72 6f 6d 20 75 6e 64 65 72 6c 79  tes from underly
2b20: 69 6e 67 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  ing channel */. 
2b30: 20 20 20 70 61 72 65 6e 74 20 3d 20 54 63 6c 5f     parent = Tcl_
2b40: 47 65 74 53 74 61 63 6b 65 64 43 68 61 6e 6e 65  GetStackedChanne
2b50: 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  l(statePtr->self
2b60: 29 3b 0a 20 20 20 20 72 65 61 64 20 3d 20 54 63  );.    read = Tc
2b70: 6c 5f 52 65 61 64 52 61 77 28 70 61 72 65 6e 74  l_ReadRaw(parent
2b80: 2c 20 62 75 66 2c 20 74 6f 52 65 61 64 29 3b 0a  , buf, toRead);.
2b90: 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 68  .    /* Update h
2ba0: 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ash function */.
2bb0: 20 20 20 20 69 66 20 28 72 65 61 64 20 3e 20 30      if (read > 0
2bc0: 29 20 7b 0a 09 2f 2a 20 48 61 76 65 20 64 61 74  ) {../* Have dat
2bd0: 61 20 2a 2f 0a 09 69 66 20 28 21 54 6c 73 5f 44  a */..if (!Tls_D
2be0: 69 67 65 73 74 55 70 64 61 74 65 28 73 74 61 74  igestUpdate(stat
2bf0: 65 50 74 72 2c 20 62 75 66 2c 20 28 73 69 7a 65  ePtr, buf, (size
2c00: 5f 74 29 20 72 65 61 64 2c 20 30 29 29 20 7b 0a  _t) read, 0)) {.
2c10: 09 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e  .    Tcl_SetChan
2c20: 6e 65 6c 45 72 72 6f 72 28 73 74 61 74 65 50 74  nelError(statePt
2c30: 72 2d 3e 73 65 6c 66 2c 20 54 63 6c 5f 4f 62 6a  r->self, Tcl_Obj
2c40: 50 72 69 6e 74 66 28 22 55 70 64 61 74 65 20 66  Printf("Update f
2c50: 61 69 6c 65 64 3a 20 25 73 22 2c 20 52 45 41 53  ailed: %s", REAS
2c60: 4f 4e 28 29 29 29 3b 0a 09 20 20 20 20 2a 65 72  ON()));..    *er
2c70: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49 4e  rorCodePtr = EIN
2c80: 56 41 4c 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  VAL;..    return
2c90: 20 30 3b 0a 09 7d 0a 09 2f 2a 20 54 68 69 73 20   0;..}../* This 
2ca0: 69 73 20 63 6f 72 72 65 63 74 20 2a 2f 0a 09 72  is correct */..r
2cb0: 65 61 64 20 3d 20 2d 31 3b 0a 09 2a 65 72 72 6f  ead = -1;..*erro
2cc0: 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49  rCodePtr = EAGAI
2cd0: 4e 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  N;..    } else i
2ce0: 66 20 28 72 65 61 64 20 3c 20 30 29 20 7b 0a 09  f (read < 0) {..
2cf0: 2f 2a 20 45 72 72 6f 72 20 2a 2f 0a 09 2a 65 72  /* Error */..*er
2d00: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 54 63 6c  rorCodePtr = Tcl
2d10: 5f 47 65 74 45 72 72 6e 6f 28 29 3b 0a 0a 20 20  _GetErrno();..  
2d20: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 21 28 73    } else if (!(s
2d30: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26  tatePtr->flags &
2d40: 20 43 48 41 4e 5f 45 4f 46 29 29 20 7b 0a 09 2f   CHAN_EOF)) {../
2d50: 2a 20 45 4f 46 20 2a 2f 0a 09 54 63 6c 5f 4f 62  * EOF */..Tcl_Ob
2d60: 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 3b 0a 09 69  j *resultObj;..i
2d70: 66 20 28 54 6c 73 5f 44 69 67 65 73 74 46 69 6e  f (Tls_DigestFin
2d80: 69 61 6c 69 7a 65 28 73 74 61 74 65 50 74 72 2d  ialize(statePtr-
2d90: 3e 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  >interp, statePt
2da0: 72 2c 20 26 72 65 73 75 6c 74 4f 62 6a 29 20 3d  r, &resultObj) =
2db0: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20  = TCL_OK) {..   
2dc0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2dd0: 64 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 42 79  data = Tcl_GetBy
2de0: 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 72  teArrayFromObj(r
2df0: 65 73 75 6c 74 4f 62 6a 2c 20 26 72 65 61 64 29  esultObj, &read)
2e00: 3b 0a 09 20 20 20 20 6d 65 6d 63 70 79 28 62 75  ;..    memcpy(bu
2e10: 66 2c 20 64 61 74 61 2c 20 72 65 61 64 29 3b 0a  f, data, read);.
2e20: 09 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
2e30: 43 6f 75 6e 74 28 72 65 73 75 6c 74 4f 62 6a 29  Count(resultObj)
2e40: 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  ;...} else {..  
2e50: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c    Tcl_SetChannel
2e60: 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2d 3e  Error(statePtr->
2e70: 73 65 6c 66 2c 20 54 63 6c 5f 4f 62 6a 50 72 69  self, Tcl_ObjPri
2e80: 6e 74 66 28 22 46 69 6e 61 6c 69 7a 65 20 66 61  ntf("Finalize fa
2e90: 69 6c 65 64 3a 20 25 73 22 2c 20 52 45 41 53 4f  iled: %s", REASO
2ea0: 4e 28 29 29 29 3b 0a 09 20 20 20 20 2a 65 72 72  N()));..    *err
2eb0: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49 4e 56  orCodePtr = EINV
2ec0: 41 4c 3b 0a 09 20 20 20 20 72 65 61 64 20 3d 20  AL;..    read = 
2ed0: 30 3b 0a 09 7d 0a 09 73 74 61 74 65 50 74 72 2d  0;..}..statePtr-
2ee0: 3e 66 6c 61 67 73 20 7c 3d 20 43 48 41 4e 5f 45  >flags |= CHAN_E
2ef0: 4f 46 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  OF;.    }.    re
2f00: 74 75 72 6e 20 72 65 61 64 3b 0a 7d 0a 0a 2f 2a  turn read;.}../*
2f10: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
2f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
2f60: 44 69 67 65 73 74 4f 75 74 70 75 74 50 72 6f 63  DigestOutputProc
2f70: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64   --. *. *.Called
2f80: 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20   by the generic 
2f90: 49 4f 20 73 79 73 74 65 6d 20 74 6f 20 77 72 69  IO system to wri
2fa0: 74 65 20 64 61 74 61 20 69 6e 20 62 75 66 20 74  te data in buf t
2fb0: 6f 20 74 72 61 6e 73 66 6f 72 6d 2e 0a 20 2a 09  o transform.. *.
2fc0: 54 68 65 20 74 72 61 6e 73 66 6f 72 6d 20 77 72  The transform wr
2fd0: 69 74 65 73 20 74 68 65 20 72 65 73 75 6c 74 20  ites the result 
2fe0: 74 6f 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  to the underlyin
2ff0: 67 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a  g channel.. *. *
3000: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 6f 74   Returns:. *.Tot
3010: 61 6c 20 62 79 74 65 73 20 77 72 69 74 74 65 6e  al bytes written
3020: 20 6f 72 20 2d 31 20 66 6f 72 20 61 6e 20 65 72   or -1 for an er
3030: 72 6f 72 20 61 6c 6f 6e 67 20 77 69 74 68 20 61  ror along with a
3040: 20 50 4f 53 49 58 20 65 72 72 6f 72 0a 20 2a 09   POSIX error. *.
3050: 63 6f 64 65 20 69 6e 20 65 72 72 6f 72 43 6f 64  code in errorCod
3060: 65 50 74 72 2e 20 55 73 65 20 45 41 47 41 49 4e  ePtr. Use EAGAIN
3070: 20 66 6f 72 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67   for nonblocking
3080: 20 61 6e 64 20 63 61 6e 27 74 20 77 72 69 74 65   and can't write
3090: 20 64 61 74 61 2e 0a 20 2a 0a 20 2a 20 53 69 64   data.. *. * Sid
30a0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 47 65  e effects:. *.Ge
30b0: 74 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66 20  t data from buf 
30c0: 61 6e 64 20 75 70 64 61 74 65 20 64 69 67 65 73  and update diges
30d0: 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  t. *. *---------
30e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
3120: 2f 0a 20 69 6e 74 20 44 69 67 65 73 74 4f 75 74  /. int DigestOut
3130: 70 75 74 50 72 6f 63 28 43 6c 69 65 6e 74 44 61  putProc(ClientDa
3140: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 63  ta clientData, c
3150: 6f 6e 73 74 20 63 68 61 72 20 2a 62 75 66 2c 20  onst char *buf, 
3160: 69 6e 74 20 74 6f 57 72 69 74 65 2c 20 69 6e 74  int toWrite, int
3170: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 20   *errorCodePtr) 
3180: 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74  {.    DigestStat
3190: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44  e *statePtr = (D
31a0: 69 67 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c  igestState *) cl
31b0: 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 2a 65  ientData;.    *e
31c0: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b  rrorCodePtr = 0;
31d0: 0a 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 69  ..    /* Abort i
31e0: 66 20 6e 6f 74 68 69 6e 67 20 74 6f 20 70 72 6f  f nothing to pro
31f0: 63 65 73 73 20 2a 2f 0a 20 20 20 20 69 66 20 28  cess */.    if (
3200: 74 6f 57 72 69 74 65 20 3c 3d 20 30 20 7c 7c 20  toWrite <= 0 || 
3210: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d  statePtr->self =
3220: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
3230: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
3240: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
3250: 20 55 70 64 61 74 65 20 68 61 73 68 20 66 75 6e   Update hash fun
3260: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 20  ction */.    if 
3270: 28 74 6f 57 72 69 74 65 20 3e 20 30 20 26 26 20  (toWrite > 0 && 
3280: 21 54 6c 73 5f 44 69 67 65 73 74 55 70 64 61 74  !Tls_DigestUpdat
3290: 65 28 73 74 61 74 65 50 74 72 2c 20 62 75 66 2c  e(statePtr, buf,
32a0: 20 28 73 69 7a 65 5f 74 29 20 74 6f 57 72 69 74   (size_t) toWrit
32b0: 65 2c 20 30 29 29 20 7b 0a 09 54 63 6c 5f 53 65  e, 0)) {..Tcl_Se
32c0: 74 43 68 61 6e 6e 65 6c 45 72 72 6f 72 28 73 74  tChannelError(st
32d0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 54 63  atePtr->self, Tc
32e0: 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 22 55 70 64  l_ObjPrintf("Upd
32f0: 61 74 65 20 66 61 69 6c 65 64 3a 20 25 73 22 2c  ate failed: %s",
3300: 20 52 45 41 53 4f 4e 28 29 29 29 3b 0a 09 2a 65   REASON()));..*e
3310: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49  rrorCodePtr = EI
3320: 4e 56 41 4c 3b 0a 09 72 65 74 75 72 6e 20 30 3b  NVAL;..return 0;
3330: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
3340: 6e 20 74 6f 57 72 69 74 65 3b 0a 7d 0a 0a 2f 2a  n toWrite;.}../*
3350: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
3360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
33a0: 44 69 67 65 73 74 53 65 74 4f 70 74 69 6f 6e 50  DigestSetOptionP
33b0: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c  roc --. *. *.Cal
33c0: 6c 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72  led by the gener
33d0: 69 63 20 49 4f 20 73 79 73 74 65 6d 20 74 6f 20  ic IO system to 
33e0: 73 65 74 20 63 68 61 6e 6e 65 6c 20 6f 70 74 69  set channel opti
33f0: 6f 6e 20 6e 61 6d 65 20 74 6f 20 76 61 6c 75 65  on name to value
3400: 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a  .. *. * Returns:
3410: 0a 20 2a 09 54 43 4c 5f 4f 4b 20 69 66 20 73 75  . *.TCL_OK if su
3420: 63 63 65 73 73 66 75 6c 20 6f 72 20 54 43 4c 5f  ccessful or TCL_
3430: 45 52 52 4f 52 20 69 66 20 66 61 69 6c 65 64 20  ERROR if failed 
3440: 61 6c 6f 6e 67 20 77 69 74 68 20 61 6e 20 65 72  along with an er
3450: 72 6f 72 0a 20 2a 09 6d 65 73 73 61 67 65 20 69  ror. *.message i
3460: 6e 20 69 6e 74 65 72 70 20 61 6e 64 20 54 63 6c  n interp and Tcl
3470: 5f 53 65 74 45 72 72 6e 6f 2e 0a 20 2a 0a 20 2a  _SetErrno.. *. *
3480: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
3490: 2a 09 55 70 64 61 74 65 73 20 63 68 61 6e 6e 65  *.Updates channe
34a0: 6c 20 6f 70 74 69 6f 6e 20 74 6f 20 6e 65 77 20  l option to new 
34b0: 76 61 6c 75 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  value.. *. *----
34c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3500: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
3510: 74 20 44 69 67 65 73 74 53 65 74 4f 70 74 69 6f  t DigestSetOptio
3520: 6e 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61  nProc(ClientData
3530: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
3540: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
3550: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70 74   const char *opt
3560: 69 6f 6e 4e 61 6d 65 2c 0a 09 63 6f 6e 73 74 20  ionName,..const 
3570: 63 68 61 72 20 2a 6f 70 74 69 6f 6e 56 61 6c 75  char *optionValu
3580: 65 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53  e) {.    DigestS
3590: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
35a0: 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 29   (DigestState *)
35b0: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20   clientData;.   
35c0: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 70 61 72   Tcl_Channel par
35d0: 65 6e 74 3b 0a 20 20 20 20 54 63 6c 5f 44 72 69  ent;.    Tcl_Dri
35e0: 76 65 72 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63  verSetOptionProc
35f0: 20 2a 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 3b   *setOptionProc;
3600: 0a 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 69  ..    /* Abort i
3610: 66 20 6e 6f 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  f no channel */.
3620: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
3630: 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43  ->self == (Tcl_C
3640: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a  hannel) NULL) {.
3650: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
3660: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
3670: 20 44 65 6c 65 67 61 74 65 20 6f 70 74 69 6f 6e   Delegate option
3680: 73 20 64 6f 77 6e 73 74 72 65 61 6d 20 2a 2f 0a  s downstream */.
3690: 20 20 20 20 70 61 72 65 6e 74 20 3d 20 54 63 6c      parent = Tcl
36a0: 5f 47 65 74 53 74 61 63 6b 65 64 43 68 61 6e 6e  _GetStackedChann
36b0: 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  el(statePtr->sel
36c0: 66 29 3b 0a 20 20 20 20 73 65 74 4f 70 74 69 6f  f);.    setOptio
36d0: 6e 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68 61 6e  nProc = Tcl_Chan
36e0: 6e 65 6c 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63  nelSetOptionProc
36f0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54  (Tcl_GetChannelT
3700: 79 70 65 28 70 61 72 65 6e 74 29 29 3b 0a 20 20  ype(parent));.  
3710: 20 20 69 66 20 28 73 65 74 4f 70 74 69 6f 6e 50    if (setOptionP
3720: 72 6f 63 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  roc != NULL) {..
3730: 72 65 74 75 72 6e 20 28 2a 73 65 74 4f 70 74 69  return (*setOpti
3740: 6f 6e 50 72 6f 63 29 28 54 63 6c 5f 47 65 74 43  onProc)(Tcl_GetC
3750: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61  hannelInstanceDa
3760: 74 61 28 70 61 72 65 6e 74 29 2c 20 69 6e 74 65  ta(parent), inte
3770: 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20  rp, optionName, 
3780: 6f 70 74 69 6f 6e 56 61 6c 75 65 29 3b 0a 20 20  optionValue);.  
3790: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f    } else {..Tcl_
37a0: 53 65 74 45 72 72 6e 6f 28 45 49 4e 56 41 4c 29  SetErrno(EINVAL)
37b0: 3b 0a 09 72 65 74 75 72 6e 20 54 63 6c 5f 42 61  ;..return Tcl_Ba
37c0: 64 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  dChannelOption(i
37d0: 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d  nterp, optionNam
37e0: 65 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a  e, NULL);.    }.
37f0: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
3800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
3840: 2a 0a 20 2a 20 44 69 67 65 73 74 47 65 74 4f 70  *. * DigestGetOp
3850: 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20  tionProc --. *. 
3860: 2a 09 43 61 6c 6c 65 64 20 62 79 20 74 68 65 20  *.Called by the 
3870: 67 65 6e 65 72 69 63 20 49 4f 20 73 79 73 74 65  generic IO syste
3880: 6d 20 74 6f 20 67 65 74 20 63 68 61 6e 6e 65 6c  m to get channel
3890: 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 27 73 20 76   option name's v
38a0: 61 6c 75 65 2e 0a 20 2a 0a 20 2a 20 52 65 74 75  alue.. *. * Retu
38b0: 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 69  rns:. *.TCL_OK i
38c0: 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20  f successful or 
38d0: 54 43 4c 5f 45 52 52 4f 52 20 69 66 20 66 61 69  TCL_ERROR if fai
38e0: 6c 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 61  led along with a
38f0: 6e 20 65 72 72 6f 72 0a 20 2a 09 6d 65 73 73 61  n error. *.messa
3900: 67 65 20 69 6e 20 69 6e 74 65 72 70 20 61 6e 64  ge in interp and
3910: 20 54 63 6c 5f 53 65 74 45 72 72 6e 6f 2e 0a 20   Tcl_SetErrno.. 
3920: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
3930: 73 3a 0a 20 2a 09 53 65 74 73 20 72 65 73 75 6c  s:. *.Sets resul
3940: 74 20 74 6f 20 6f 70 74 69 6f 6e 27 73 20 76 61  t to option's va
3950: 6c 75 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  lue. *. *-------
3960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
39a0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44   */.static int D
39b0: 69 67 65 73 74 47 65 74 4f 70 74 69 6f 6e 50 72  igestGetOptionPr
39c0: 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  oc(ClientData cl
39d0: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e  ientData, Tcl_In
39e0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 63 6f  terp *interp, co
39f0: 6e 73 74 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e  nst char *option
3a00: 4e 61 6d 65 2c 0a 09 54 63 6c 5f 44 53 74 72 69  Name,..Tcl_DStri
3a10: 6e 67 20 2a 6f 70 74 69 6f 6e 56 61 6c 75 65 29  ng *optionValue)
3a20: 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74 61   {.    DigestSta
3a30: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
3a40: 44 69 67 65 73 74 53 74 61 74 65 20 2a 29 20 63  DigestState *) c
3a50: 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 54  lientData;.    T
3a60: 63 6c 5f 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e  cl_Channel paren
3a70: 74 3b 0a 20 20 20 20 54 63 6c 5f 44 72 69 76 65  t;.    Tcl_Drive
3a80: 72 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2a  rGetOptionProc *
3a90: 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 3b 0a 0a  getOptionProc;..
3aa0: 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 69 66 20      /* Abort if 
3ab0: 6e 6f 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20  no channel */.  
3ac0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
3ad0: 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61  self == (Tcl_Cha
3ae0: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72  nnel) NULL) {..r
3af0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
3b00: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
3b10: 65 6c 65 67 61 74 65 20 6f 70 74 69 6f 6e 73 20  elegate options 
3b20: 64 6f 77 6e 73 74 72 65 61 6d 20 2a 2f 0a 20 20  downstream */.  
3b30: 20 20 70 61 72 65 6e 74 20 3d 20 54 63 6c 5f 47    parent = Tcl_G
3b40: 65 74 53 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c  etStackedChannel
3b50: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
3b60: 3b 0a 20 20 20 20 67 65 74 4f 70 74 69 6f 6e 50  ;.    getOptionP
3b70: 72 6f 63 20 3d 20 54 63 6c 5f 43 68 61 6e 6e 65  roc = Tcl_Channe
3b80: 6c 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 54  lGetOptionProc(T
3b90: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70  cl_GetChannelTyp
3ba0: 65 28 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20  e(parent));.    
3bb0: 69 66 20 28 67 65 74 4f 70 74 69 6f 6e 50 72 6f  if (getOptionPro
3bc0: 63 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  c != NULL) {..re
3bd0: 74 75 72 6e 20 28 2a 67 65 74 4f 70 74 69 6f 6e  turn (*getOption
3be0: 50 72 6f 63 29 28 54 63 6c 5f 47 65 74 43 68 61  Proc)(Tcl_GetCha
3bf0: 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61  nnelInstanceData
3c00: 28 70 61 72 65 6e 74 29 2c 20 69 6e 74 65 72 70  (parent), interp
3c10: 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 6f 70  , optionName, op
3c20: 74 69 6f 6e 56 61 6c 75 65 29 3b 0a 20 20 20 20  tionValue);.    
3c30: 7d 20 65 6c 73 65 20 69 66 20 28 6f 70 74 69 6f  } else if (optio
3c40: 6e 4e 61 6d 65 20 3d 3d 20 28 63 68 61 72 2a 29  nName == (char*)
3c50: 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 52 65 71   NULL) {../* Req
3c60: 75 65 73 74 20 69 73 20 71 75 65 72 79 20 66 6f  uest is query fo
3c70: 72 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 2c 20 74  r all options, t
3c80: 68 69 73 20 69 73 20 6f 6b 2e 20 2a 2f 0a 09 72  his is ok. */..r
3c90: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20  eturn TCL_OK;.  
3ca0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f    } else {..Tcl_
3cb0: 53 65 74 45 72 72 6e 6f 28 45 49 4e 56 41 4c 29  SetErrno(EINVAL)
3cc0: 3b 0a 09 72 65 74 75 72 6e 20 54 63 6c 5f 42 61  ;..return Tcl_Ba
3cd0: 64 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  dChannelOption(i
3ce0: 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d  nterp, optionNam
3cf0: 65 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a  e, NULL);.    }.
3d00: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
3d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
3d50: 2a 0a 20 2a 20 44 69 67 65 73 74 54 69 6d 65 72  *. * DigestTimer
3d60: 48 61 6e 64 6c 65 72 20 2d 2d 0a 20 2a 0a 20 2a  Handler --. *. *
3d70: 09 43 61 6c 6c 65 64 20 62 79 20 74 68 65 20 6e  .Called by the n
3d80: 6f 74 69 66 69 65 72 20 76 69 61 20 74 69 6d 65  otifier via time
3d90: 72 20 74 6f 20 66 6c 75 73 68 20 6f 75 74 20 70  r to flush out p
3da0: 65 6e 64 69 6e 67 20 69 6e 70 75 74 20 64 61 74  ending input dat
3db0: 61 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73  a.. *. * Returns
3dc0: 3a 0a 20 2a 09 4e 6f 74 68 69 6e 67 0a 20 2a 0a  :. *.Nothing. *.
3dd0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
3de0: 0a 20 2a 09 4d 61 79 20 63 61 6c 6c 20 54 63 6c  . *.May call Tcl
3df0: 5f 4e 6f 74 69 66 79 43 68 61 6e 6e 65 6c 0a 20  _NotifyChannel. 
3e00: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
3e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
3e50: 74 61 74 69 63 20 76 6f 69 64 20 44 69 67 65 73  tatic void Diges
3e60: 74 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 43 6c  tTimerHandler(Cl
3e70: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
3e80: 61 74 61 29 20 7b 0a 20 20 20 20 44 69 67 65 73  ata) {.    Diges
3e90: 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72  tState *statePtr
3ea0: 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20   = (DigestState 
3eb0: 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a  *) clientData;..
3ec0: 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 69 66 20      /* Abort if 
3ed0: 6e 6f 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20  no channel */.  
3ee0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
3ef0: 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61  self == (Tcl_Cha
3f00: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72  nnel) NULL) {..r
3f10: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20  eturn;.    }..  
3f20: 20 20 2f 2a 20 43 6c 65 61 72 20 74 69 6d 65 72    /* Clear timer
3f30: 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 73 74   token */.    st
3f40: 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20  atePtr->timer = 
3f50: 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29  (Tcl_TimerToken)
3f60: 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 46   NULL;..    /* F
3f70: 69 72 65 20 65 76 65 6e 74 20 69 66 20 74 68 65  ire event if the
3f80: 72 65 20 69 73 20 70 65 6e 64 69 6e 67 20 64 61  re is pending da
3f90: 74 61 2c 20 73 6b 69 70 20 6f 74 68 65 72 77 69  ta, skip otherwi
3fa0: 73 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 73  se */.    if ((s
3fb0: 74 61 74 65 50 74 72 2d 3e 77 61 74 63 68 4d 61  tatePtr->watchMa
3fc0: 73 6b 20 26 20 54 43 4c 5f 52 45 41 44 41 42 4c  sk & TCL_READABL
3fd0: 45 29 20 26 26 20 28 54 63 6c 5f 49 6e 70 75 74  E) && (Tcl_Input
3fe0: 42 75 66 66 65 72 65 64 28 73 74 61 74 65 50 74  Buffered(statePt
3ff0: 72 2d 3e 73 65 6c 66 29 20 3e 20 30 29 29 20 7b  r->self) > 0)) {
4000: 0a 09 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61 6e  ..Tcl_NotifyChan
4010: 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 65  nel(statePtr->se
4020: 6c 66 2c 20 54 43 4c 5f 52 45 41 44 41 42 4c 45  lf, TCL_READABLE
4030: 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20  );.    }.}../*. 
4040: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
4050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4080: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69  -------. *. * Di
4090: 67 65 73 74 57 61 74 63 68 50 72 6f 63 20 2d 2d  gestWatchProc --
40a0: 0a 20 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a  . *. *.Initializ
40b0: 65 20 74 68 65 20 6e 6f 74 69 66 69 65 72 20 74  e the notifier t
40c0: 6f 20 77 61 74 63 68 20 66 6f 72 20 65 76 65 6e  o watch for even
40d0: 74 73 20 66 72 6f 6d 20 74 68 69 73 20 63 68 61  ts from this cha
40e0: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 74 75  nnel.. *. * Retu
40f0: 72 6e 73 3a 0a 20 2a 09 4e 6f 74 68 69 6e 67 20  rns:. *.Nothing 
4100: 28 63 61 6e 27 74 20 72 65 74 75 72 6e 20 65 72  (can't return er
4110: 72 6f 72 20 6d 65 73 73 61 67 65 73 29 0a 20 2a  ror messages). *
4120: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
4130: 3a 0a 20 2a 09 43 6f 6e 66 69 67 75 72 65 20 6e  :. *.Configure n
4140: 6f 74 69 66 69 65 72 20 73 6f 20 66 75 74 75 72  otifier so futur
4150: 65 20 65 76 65 6e 74 73 20 6f 6e 20 74 68 65 20  e events on the 
4160: 63 68 61 6e 6e 65 6c 20 77 69 6c 6c 20 62 65 20  channel will be 
4170: 73 65 65 6e 20 62 79 20 54 63 6c 2e 0a 20 2a 0a  seen by Tcl.. *.
4180: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
4190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
41a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
41b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
41c0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69  --------. */.voi
41d0: 64 20 44 69 67 65 73 74 57 61 74 63 68 50 72 6f  d DigestWatchPro
41e0: 63 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  c(ClientData cli
41f0: 65 6e 74 44 61 74 61 2c 20 69 6e 74 20 6d 61 73  entData, int mas
4200: 6b 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53  k) {.    DigestS
4210: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
4220: 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 29   (DigestState *)
4230: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20   clientData;.   
4240: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 70 61 72   Tcl_Channel par
4250: 65 6e 74 3b 0a 20 20 20 20 54 63 6c 5f 44 72 69  ent;.    Tcl_Dri
4260: 76 65 72 57 61 74 63 68 50 72 6f 63 20 2a 77 61  verWatchProc *wa
4270: 74 63 68 50 72 6f 63 3b 0a 0a 20 20 20 20 2f 2a  tchProc;..    /*
4280: 20 41 62 6f 72 74 20 69 66 20 6e 6f 20 63 68 61   Abort if no cha
4290: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28  nnel */.    if (
42a0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d  statePtr->self =
42b0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
42c0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 3b  NULL) {..return;
42d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
42e0: 74 6f 72 65 20 4f 52 2d 65 64 20 63 6f 6d 62 69  tore OR-ed combi
42f0: 6e 61 74 69 6f 6e 20 6f 66 20 54 43 4c 5f 52 45  nation of TCL_RE
4300: 41 44 41 42 4c 45 2c 20 54 43 4c 5f 57 52 49 54  ADABLE, TCL_WRIT
4310: 41 42 4c 45 20 61 6e 64 20 54 43 4c 5f 45 58 43  ABLE and TCL_EXC
4320: 45 50 54 49 4f 4e 20 2a 2f 0a 20 20 20 20 73 74  EPTION */.    st
4330: 61 74 65 50 74 72 2d 3e 77 61 74 63 68 4d 61 73  atePtr->watchMas
4340: 6b 20 3d 20 6d 61 73 6b 3b 0a 0a 20 20 20 20 2f  k = mask;..    /
4350: 2a 20 50 72 6f 70 61 67 61 74 65 20 6d 61 73 6b  * Propagate mask
4360: 20 69 6e 66 6f 20 74 6f 20 70 61 72 65 6e 74 20   info to parent 
4370: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 70  channel */.    p
4380: 61 72 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53  arent = Tcl_GetS
4390: 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74  tackedChannel(st
43a0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 20  atePtr->self);. 
43b0: 20 20 20 77 61 74 63 68 50 72 6f 63 20 3d 20 54     watchProc = T
43c0: 63 6c 5f 43 68 61 6e 6e 65 6c 57 61 74 63 68 50  cl_ChannelWatchP
43d0: 72 6f 63 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  roc(Tcl_GetChann
43e0: 65 6c 54 79 70 65 28 70 61 72 65 6e 74 29 29 3b  elType(parent));
43f0: 0a 20 20 20 20 77 61 74 63 68 50 72 6f 63 28 54  .    watchProc(T
4400: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73  cl_GetChannelIns
4410: 74 61 6e 63 65 44 61 74 61 28 70 61 72 65 6e 74  tanceData(parent
4420: 29 2c 20 6d 61 73 6b 29 3b 0a 0a 20 20 20 20 2f  ), mask);..    /
4430: 2a 20 52 65 6d 6f 76 65 20 70 65 6e 64 69 6e 67  * Remove pending
4440: 20 74 69 6d 65 72 20 2a 2f 0a 20 20 20 20 69 66   timer */.    if
4450: 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65   (statePtr->time
4460: 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54  r != (Tcl_TimerT
4470: 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54  oken) NULL) {..T
4480: 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61  cl_DeleteTimerHa
4490: 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e  ndler(statePtr->
44a0: 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74  timer);..statePt
44b0: 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f  r->timer = (Tcl_
44c0: 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c  TimerToken) NULL
44d0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
44e0: 49 66 20 74 68 65 72 65 20 69 73 20 64 61 74 61  If there is data
44f0: 20 70 65 6e 64 69 6e 67 2c 20 73 65 74 20 6e 65   pending, set ne
4500: 77 20 74 69 6d 65 72 20 74 6f 20 63 61 6c 6c 20  w timer to call 
4510: 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61 6e 6e 65  Tcl_NotifyChanne
4520: 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 6d 61  l */.    if ((ma
4530: 73 6b 20 26 20 54 43 4c 5f 52 45 41 44 41 42 4c  sk & TCL_READABL
4540: 45 29 20 26 26 20 28 54 63 6c 5f 49 6e 70 75 74  E) && (Tcl_Input
4550: 42 75 66 66 65 72 65 64 28 73 74 61 74 65 50 74  Buffered(statePt
4560: 72 2d 3e 73 65 6c 66 29 20 3e 20 30 29 29 20 7b  r->self) > 0)) {
4570: 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65  ..statePtr->time
4580: 72 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 54 69  r = Tcl_CreateTi
4590: 6d 65 72 48 61 6e 64 6c 65 72 28 52 45 41 44 5f  merHandler(READ_
45a0: 44 45 4c 41 59 2c 20 44 69 67 65 73 74 54 69 6d  DELAY, DigestTim
45b0: 65 72 48 61 6e 64 6c 65 72 2c 20 28 43 6c 69 65  erHandler, (Clie
45c0: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72  ntData) statePtr
45d0: 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20  );.    }.}../*. 
45e0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
45f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4620: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69  -------. *. * Di
4630: 67 65 73 74 47 65 74 48 61 6e 64 6c 65 50 72 6f  gestGetHandlePro
4640: 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65  c --. *. *.Calle
4650: 64 20 66 72 6f 6d 20 54 63 6c 5f 47 65 74 43 68  d from Tcl_GetCh
4660: 61 6e 6e 65 6c 48 61 6e 64 6c 65 20 74 6f 20 72  annelHandle to r
4670: 65 74 72 69 65 76 65 20 4f 53 20 73 70 65 63 69  etrieve OS speci
4680: 66 69 63 20 66 69 6c 65 20 68 61 6e 64 6c 65 0a  fic file handle.
4690: 20 2a 09 66 72 6f 6d 20 69 6e 73 69 64 65 20 74   *.from inside t
46a0: 68 69 73 20 63 68 61 6e 6e 65 6c 2e 20 4e 6f 74  his channel. Not
46b0: 20 75 73 65 64 20 66 6f 72 20 74 72 61 6e 73 66   used for transf
46c0: 6f 72 6d 61 74 69 6f 6e 73 3f 0a 20 2a 0a 20 2a  ormations?. *. *
46d0: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c   Returns:. *.TCL
46e0: 5f 4f 4b 20 66 6f 72 20 73 75 63 63 65 73 73 20  _OK for success 
46f0: 6f 72 20 54 43 4c 5f 45 52 52 4f 52 20 66 6f 72  or TCL_ERROR for
4700: 20 65 72 72 6f 72 20 6f 72 20 69 66 20 6e 6f 74   error or if not
4710: 20 73 75 70 70 6f 72 74 65 64 2e 20 49 66 0a 20   supported. If. 
4720: 2a 09 64 69 72 65 63 74 69 6f 6e 20 69 73 20 54  *.direction is T
4730: 43 4c 5f 52 45 41 44 41 42 4c 45 2c 20 73 65 74  CL_READABLE, set
4740: 73 20 68 61 6e 64 6c 65 50 74 72 20 74 6f 20 74  s handlePtr to t
4750: 68 65 20 68 61 6e 64 6c 65 20 75 73 65 64 20 66  he handle used f
4760: 6f 72 0a 20 2a 09 69 6e 70 75 74 2c 20 6f 72 20  or. *.input, or 
4770: 69 66 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 20  if TCL_WRITABLE 
4780: 73 65 74 73 20 74 6f 20 74 68 65 20 68 61 6e 64  sets to the hand
4790: 6c 65 20 75 73 65 64 20 66 6f 72 20 6f 75 74 70  le used for outp
47a0: 75 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ut.. *. * Side e
47b0: 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a  ffects:. *.None.
47c0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
47d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
4810: 69 6e 74 20 44 69 67 65 73 74 47 65 74 48 61 6e  int DigestGetHan
4820: 64 6c 65 50 72 6f 63 28 43 6c 69 65 6e 74 44 61  dleProc(ClientDa
4830: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 69  ta clientData, i
4840: 6e 74 20 64 69 72 65 63 74 69 6f 6e 2c 20 43 6c  nt direction, Cl
4850: 69 65 6e 74 44 61 74 61 20 2a 68 61 6e 64 6c 65  ientData *handle
4860: 50 74 72 29 20 7b 0a 20 20 20 20 44 69 67 65 73  Ptr) {.    Diges
4870: 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72  tState *statePtr
4880: 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20   = (DigestState 
4890: 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20  *) clientData;. 
48a0: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 70     Tcl_Channel p
48b0: 61 72 65 6e 74 3b 0a 0a 20 20 20 20 2f 2a 20 41  arent;..    /* A
48c0: 62 6f 72 74 20 69 66 20 6e 6f 20 63 68 61 6e 6e  bort if no chann
48d0: 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74  el */.    if (st
48e0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20  atePtr->self == 
48f0: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
4900: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  LL) {..return TC
4910: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
4920: 20 20 20 20 70 61 72 65 6e 74 20 3d 20 54 63 6c      parent = Tcl
4930: 5f 47 65 74 53 74 61 63 6b 65 64 43 68 61 6e 6e  _GetStackedChann
4940: 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  el(statePtr->sel
4950: 66 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  f);.    return T
4960: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 48 61 6e  cl_GetChannelHan
4970: 64 6c 65 28 70 61 72 65 6e 74 2c 20 64 69 72 65  dle(parent, dire
4980: 63 74 69 6f 6e 2c 20 68 61 6e 64 6c 65 50 74 72  ction, handlePtr
4990: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  );.}../*. *-----
49a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49c0: 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 4e 6f  -. *. * DigestNo
49f0: 74 69 66 79 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20  tifyProc --. *. 
4a00: 2a 09 43 61 6c 6c 65 64 20 62 79 20 54 63 6c 20  *.Called by Tcl 
4a10: 74 6f 20 69 6e 66 6f 72 6d 20 75 73 20 6f 66 20  to inform us of 
4a20: 61 63 74 69 76 69 74 79 20 6f 6e 20 74 68 65 20  activity on the 
4a30: 75 6e 64 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e  underlying chann
4a40: 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  el.. *. * Return
4a50: 73 3a 0a 20 2a 09 55 6e 63 68 61 6e 67 65 64 20  s:. *.Unchanged 
4a60: 69 6e 74 65 72 65 73 74 4d 61 73 6b 20 77 68 69  interestMask whi
4a70: 63 68 20 69 73 20 61 6e 20 4f 52 2d 65 64 20 63  ch is an OR-ed c
4a80: 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 54 43  ombination of TC
4a90: 4c 5f 52 45 41 44 41 42 4c 45 20 6f 72 20 54 43  L_READABLE or TC
4aa0: 4c 5f 57 52 49 54 41 42 4c 45 0a 20 2a 0a 20 2a  L_WRITABLE. *. *
4ab0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
4ac0: 2a 09 43 61 6e 63 65 6c 73 20 61 6e 79 20 70 65  *.Cancels any pe
4ad0: 6e 64 69 6e 67 20 74 69 6d 65 72 2e 0a 20 2a 0a  nding timer.. *.
4ae0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
4af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b20: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74  --------. */.int
4b30: 20 44 69 67 65 73 74 4e 6f 74 69 66 79 50 72 6f   DigestNotifyPro
4b40: 63 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  c(ClientData cli
4b50: 65 6e 74 44 61 74 61 2c 20 69 6e 74 20 69 6e 74  entData, int int
4b60: 65 72 65 73 74 4d 61 73 6b 29 20 7b 0a 20 20 20  erestMask) {.   
4b70: 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74   DigestState *st
4b80: 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 74  atePtr = (Digest
4b90: 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44  State *) clientD
4ba0: 61 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 53 6b 69  ata;..    /* Ski
4bb0: 70 20 74 69 6d 65 72 20 65 76 65 6e 74 20 61 73  p timer event as
4bc0: 20 72 65 64 75 6e 64 61 6e 74 20 2a 2f 0a 20 20   redundant */.  
4bd0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
4be0: 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69  timer != (Tcl_Ti
4bf0: 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20  merToken) NULL) 
4c00: 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d  {..Tcl_DeleteTim
4c10: 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50  erHandler(stateP
4c20: 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61  tr->timer);..sta
4c30: 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28  tePtr->timer = (
4c40: 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20  Tcl_TimerToken) 
4c50: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  NULL;.    }.    
4c60: 72 65 74 75 72 6e 20 69 6e 74 65 72 65 73 74 4d  return interestM
4c70: 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 0a 20 2a  ask;.}../*. *. *
4c80: 20 43 68 61 6e 6e 65 6c 20 74 79 70 65 20 73 74   Channel type st
4c90: 72 75 63 74 75 72 65 20 64 65 66 69 6e 69 74 69  ructure definiti
4ca0: 6f 6e 20 66 6f 72 20 64 69 67 65 73 74 20 74 72  on for digest tr
4cb0: 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 73 2e 0a 20  ansformations.. 
4cc0: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  *. */.static con
4cd0: 73 74 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79  st Tcl_ChannelTy
4ce0: 70 65 20 64 69 67 65 73 74 43 68 61 6e 6e 65 6c  pe digestChannel
4cf0: 54 79 70 65 20 3d 20 7b 0a 20 20 20 20 22 64 69  Type = {.    "di
4d00: 67 65 73 74 22 2c 09 09 09 2f 2a 20 54 79 70 65  gest",.../* Type
4d10: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 54 43 4c   name */.    TCL
4d20: 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e  _CHANNEL_VERSION
4d30: 5f 35 2c 09 2f 2a 20 76 35 20 63 68 61 6e 6e 65  _5,./* v5 channe
4d40: 6c 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 43  l */.    DigestC
4d50: 6c 6f 73 65 50 72 6f 63 2c 09 09 2f 2a 20 43 6c  loseProc,../* Cl
4d60: 6f 73 65 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20  ose proc */.    
4d70: 44 69 67 65 73 74 49 6e 70 75 74 50 72 6f 63 2c  DigestInputProc,
4d80: 09 09 2f 2a 20 49 6e 70 75 74 20 70 72 6f 63 20  ../* Input proc 
4d90: 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 4f 75 74  */.    DigestOut
4da0: 70 75 74 50 72 6f 63 2c 09 09 2f 2a 20 4f 75 74  putProc,../* Out
4db0: 70 75 74 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20  put proc */.    
4dc0: 4e 55 4c 4c 2c 09 09 09 2f 2a 20 53 65 65 6b 20  NULL,.../* Seek 
4dd0: 70 72 6f 63 20 2a 2f 0a 20 20 20 20 44 69 67 65  proc */.    Dige
4de0: 73 74 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 2c  stSetOptionProc,
4df0: 09 2f 2a 20 53 65 74 20 6f 70 74 69 6f 6e 20 70  ./* Set option p
4e00: 72 6f 63 20 2a 2f 0a 20 20 20 20 44 69 67 65 73  roc */.    Diges
4e10: 74 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 2c 09  tGetOptionProc,.
4e20: 2f 2a 20 47 65 74 20 6f 70 74 69 6f 6e 20 70 72  /* Get option pr
4e30: 6f 63 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74  oc */.    Digest
4e40: 57 61 74 63 68 50 72 6f 63 2c 09 09 2f 2a 20 49  WatchProc,../* I
4e50: 6e 69 74 69 61 6c 69 7a 65 20 6e 6f 74 69 66 69  nitialize notifi
4e60: 65 72 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74  er */.    Digest
4e70: 47 65 74 48 61 6e 64 6c 65 50 72 6f 63 2c 09 2f  GetHandleProc,./
4e80: 2a 20 47 65 74 20 4f 53 20 68 61 6e 64 6c 65 73  * Get OS handles
4e90: 20 6f 75 74 20 6f 66 20 63 68 61 6e 6e 65 6c 20   out of channel 
4ea0: 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 43 6c 6f  */.    DigestClo
4eb0: 73 65 32 50 72 6f 63 2c 09 09 2f 2a 20 63 6c 6f  se2Proc,../* clo
4ec0: 73 65 32 70 72 6f 63 20 2a 2f 0a 20 20 20 20 44  se2proc */.    D
4ed0: 69 67 65 73 74 42 6c 6f 63 6b 4d 6f 64 65 50 72  igestBlockModePr
4ee0: 6f 63 2c 09 2f 2a 20 53 65 74 20 62 6c 6f 63 6b  oc,./* Set block
4ef0: 69 6e 67 2f 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20  ing/nonblocking 
4f00: 6d 6f 64 65 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c  mode*/.    NULL,
4f10: 09 09 09 2f 2a 20 46 6c 75 73 68 20 70 72 6f 63  .../* Flush proc
4f20: 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 4e 6f   */.    DigestNo
4f30: 74 69 66 79 50 72 6f 63 2c 09 09 2f 2a 20 48 61  tifyProc,../* Ha
4f40: 6e 64 6c 69 6e 67 20 6f 66 20 65 76 65 6e 74 73  ndling of events
4f50: 20 62 75 62 62 6c 69 6e 67 20 75 70 20 2a 2f 0a   bubbling up */.
4f60: 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 57      NULL,.../* W
4f70: 69 64 65 20 73 65 65 6b 20 70 72 6f 63 20 2a 2f  ide seek proc */
4f80: 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20  .    NULL,.../* 
4f90: 54 68 72 65 61 64 20 61 63 74 69 6f 6e 20 2a 2f  Thread action */
4fa0: 0a 20 20 20 20 4e 55 4c 4c 09 09 09 2f 2a 20 54  .    NULL.../* T
4fb0: 72 75 6e 63 61 74 65 20 2a 2f 0a 7d 3b 0a 0a 2f  runcate */.};../
4fc0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
4fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
5010: 20 54 6c 73 5f 44 69 67 65 73 74 43 68 61 6e 6e   Tls_DigestChann
5020: 65 6c 20 2d 2d 0a 20 2a 0a 20 2a 09 43 72 65 61  el --. *. *.Crea
5030: 74 65 20 61 20 73 74 61 63 6b 65 64 20 63 68 61  te a stacked cha
5040: 6e 6e 65 6c 20 66 6f 72 20 61 20 6d 65 73 73 61  nnel for a messa
5050: 67 65 20 64 69 67 65 73 74 20 74 72 61 6e 73 66  ge digest transf
5060: 6f 72 6d 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20  ormation.. *. * 
5070: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f  Returns:. *.TCL_
5080: 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a  OK or TCL_ERROR.
5090: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
50a0: 74 73 3a 0a 20 2a 09 41 64 64 73 20 74 72 61 6e  ts:. *.Adds tran
50b0: 73 66 6f 72 6d 20 74 6f 20 63 68 61 6e 6e 65 6c  sform to channel
50c0: 20 61 6e 64 20 73 65 74 73 20 72 65 73 75 6c 74   and sets result
50d0: 20 74 6f 20 63 68 61 6e 6e 65 6c 20 69 64 20 6f   to channel id o
50e0: 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  r error message.
50f0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
5100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
5140: 0a 73 74 61 74 69 63 20 69 6e 74 0a 54 6c 73 5f  .static int.Tls_
5150: 44 69 67 65 73 74 43 68 61 6e 6e 65 6c 28 54 63  DigestChannel(Tc
5160: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
5170: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 68  , const char *ch
5180: 61 6e 6e 65 6c 2c 20 63 6f 6e 73 74 20 45 56 50  annel, const EVP
5190: 5f 4d 44 20 2a 6d 64 2c 0a 09 63 6f 6e 73 74 20  _MD *md,..const 
51a0: 45 56 50 5f 43 49 50 48 45 52 20 2a 63 69 70 68  EVP_CIPHER *ciph
51b0: 65 72 2c 20 69 6e 74 20 66 6f 72 6d 61 74 2c 20  er, int format, 
51c0: 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4f 62 6a 29  Tcl_Obj *keyObj)
51d0: 20 7b 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b   {.    int mode;
51e0: 20 2f 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e   /* OR-ed combin
51f0: 61 74 69 6f 6e 20 6f 66 20 54 43 4c 5f 52 45 41  ation of TCL_REA
5200: 44 41 42 4c 45 20 61 6e 64 20 54 43 4c 5f 57 52  DABLE and TCL_WR
5210: 49 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 54 63  ITABLE */.    Tc
5220: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a  l_Channel chan;.
5230: 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20      DigestState 
5240: 2a 73 74 61 74 65 50 74 72 3b 0a 0a 20 20 20 20  *statePtr;..    
5250: 2f 2a 20 56 61 6c 69 64 61 74 65 20 61 72 67 73  /* Validate args
5260: 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 68 61 6e   */.    if (chan
5270: 6e 65 6c 20 3d 3d 20 28 63 6f 6e 73 74 20 63 68  nel == (const ch
5280: 61 72 20 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 72  ar *) NULL) {..r
5290: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
52a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
52b0: 65 74 20 63 68 61 6e 6e 65 6c 20 49 64 20 2a 2f  et channel Id */
52c0: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
52d0: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  GetChannel(inter
52e0: 70 2c 20 63 68 61 6e 6e 65 6c 2c 20 26 6d 6f 64  p, channel, &mod
52f0: 65 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e  e);.    if (chan
5300: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c   == (Tcl_Channel
5310: 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  ) NULL) {..retur
5320: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
5330: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20   }..    /* Make 
5340: 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20  sure to operate 
5350: 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63  on the topmost c
5360: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68  hannel */.    ch
5370: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43  an = Tcl_GetTopC
5380: 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20  hannel(chan);.. 
5390: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 73 74 61     /* Create sta
53a0: 74 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  te data structur
53b0: 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 73 74  e */.    if ((st
53c0: 61 74 65 50 74 72 20 3d 20 54 6c 73 5f 44 69 67  atePtr = Tls_Dig
53d0: 65 73 74 4e 65 77 28 69 6e 74 65 72 70 2c 20 66  estNew(interp, f
53e0: 6f 72 6d 61 74 29 29 20 3d 3d 20 4e 55 4c 4c 29  ormat)) == NULL)
53f0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
5400: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4d 65  sult(interp, "Me
5410: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
5420: 65 72 72 6f 72 22 2c 20 28 63 68 61 72 20 2a 29  error", (char *)
5430: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
5440: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
5450: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73  .    statePtr->s
5460: 65 6c 66 20 3d 20 63 68 61 6e 3b 0a 20 20 20 20  elf = chan;.    
5470: 73 74 61 74 65 50 74 72 2d 3e 6d 6f 64 65 20 3d  statePtr->mode =
5480: 20 6d 6f 64 65 3b 0a 0a 20 20 20 20 2f 2a 20 49   mode;..    /* I
5490: 6e 69 74 69 61 6c 69 7a 65 20 68 61 73 68 20 66  nitialize hash f
54a0: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69  unction */.    i
54b0: 66 20 28 54 6c 73 5f 44 69 67 65 73 74 49 6e 69  f (Tls_DigestIni
54c0: 74 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50  t(interp, stateP
54d0: 74 72 2c 20 6d 64 2c 20 63 69 70 68 65 72 2c 20  tr, md, cipher, 
54e0: 6b 65 79 4f 62 6a 29 20 21 3d 20 54 43 4c 5f 4f  keyObj) != TCL_O
54f0: 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  K) {..return TCL
5500: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
5510: 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 20     /* Configure 
5520: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 54  channel */.    T
5530: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_SetChannelOpt
5540: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  ion(interp, chan
5550: 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22  , "-translation"
5560: 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a 20 20 20  , "binary");.   
5570: 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e   if (Tcl_GetChan
5580: 6e 65 6c 42 75 66 66 65 72 53 69 7a 65 28 63 68  nelBufferSize(ch
5590: 61 6e 29 20 3c 20 45 56 50 5f 4d 41 58 5f 4d 44  an) < EVP_MAX_MD
55a0: 5f 53 49 5a 45 20 2a 20 32 29 20 7b 0a 09 54 63  _SIZE * 2) {..Tc
55b0: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 42 75 66 66  l_SetChannelBuff
55c0: 65 72 53 69 7a 65 28 63 68 61 6e 2c 20 45 56 50  erSize(chan, EVP
55d0: 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45 20 2a 20 32  _MAX_MD_SIZE * 2
55e0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
55f0: 20 53 74 61 63 6b 20 63 68 61 6e 6e 65 6c 2c 20   Stack channel, 
5600: 61 62 6f 72 74 20 66 6f 72 20 65 72 72 6f 72 20  abort for error 
5610: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  */.    statePtr-
5620: 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53 74 61 63  >self = Tcl_Stac
5630: 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c  kChannel(interp,
5640: 20 26 64 69 67 65 73 74 43 68 61 6e 6e 65 6c 54   &digestChannelT
5650: 79 70 65 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  ype, (ClientData
5660: 29 20 73 74 61 74 65 50 74 72 2c 20 6d 6f 64 65  ) statePtr, mode
5670: 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20  , chan);.    if 
5680: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20  (statePtr->self 
5690: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29  == (Tcl_Channel)
56a0: 20 4e 55 4c 4c 29 20 7b 0a 09 54 6c 73 5f 44 69   NULL) {..Tls_Di
56b0: 67 65 73 74 46 72 65 65 28 73 74 61 74 65 50 74  gestFree(statePt
56c0: 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  r);..return TCL_
56d0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
56e0: 20 20 2f 2a 20 53 65 74 20 72 65 73 75 6c 74 20    /* Set result 
56f0: 74 6f 20 63 68 61 6e 6e 65 6c 20 49 64 20 2a 2f  to channel Id */
5700: 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
5710: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
5720: 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e   *) Tcl_GetChann
5730: 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 20 54 43  elName(chan), TC
5740: 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20  L_VOLATILE);.   
5750: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
5760: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
5770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
57b0: 2a 0a 20 2a 20 55 6e 73 74 61 63 6b 20 43 68 61  *. * Unstack Cha
57c0: 6e 6e 65 6c 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  nnel --. *. *.Th
57d0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 6d 6f  is function remo
57e0: 76 65 73 20 74 68 65 20 73 74 61 63 6b 65 64 20  ves the stacked 
57f0: 63 68 61 6e 6e 65 6c 20 66 72 6f 6d 20 74 68 65  channel from the
5800: 20 74 6f 70 20 6f 66 20 74 68 65 0a 20 2a 09 63   top of the. *.c
5810: 68 61 6e 6e 65 6c 20 73 74 61 63 6b 20 69 66 20  hannel stack if 
5820: 69 74 20 69 73 20 61 20 64 69 67 65 73 74 20 63  it is a digest c
5830: 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65  hannel.. *. * Re
5840: 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b  turns:. *.TCL_OK
5850: 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a   or TCL_ERROR. *
5860: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
5870: 3a 0a 20 2a 09 52 65 6d 6f 76 65 73 20 74 72 61  :. *.Removes tra
5880: 6e 73 66 6f 72 6d 20 66 72 6f 6d 20 63 68 61 6e  nsform from chan
5890: 6e 65 6c 20 6f 72 20 73 65 74 73 20 72 65 73 75  nel or sets resu
58a0: 6c 74 20 74 6f 20 65 72 72 6f 72 20 6d 65 73 73  lt to error mess
58b0: 61 67 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  age.. *. *------
58c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
58d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
58e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
58f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5900: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
5910: 55 6e 73 74 61 63 6b 4f 62 6a 43 6d 64 28 43 6c  UnstackObjCmd(Cl
5920: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
5930: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
5940: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
5950: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
5960: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
5970: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e  Tcl_Channel chan
5980: 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 20  ;.    int mode; 
5990: 2f 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61  /* OR-ed combina
59a0: 74 69 6f 6e 20 6f 66 20 54 43 4c 5f 52 45 41 44  tion of TCL_READ
59b0: 41 42 4c 45 20 61 6e 64 20 54 43 4c 5f 57 52 49  ABLE and TCL_WRI
59c0: 54 41 42 4c 45 20 20 2a 2f 0a 0a 20 20 20 20 2f  TABLE  */..    /
59d0: 2a 20 56 61 6c 69 64 61 74 65 20 61 72 67 20 63  * Validate arg c
59e0: 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20 28  ount */.    if (
59f0: 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63  objc != 2) {..Tc
5a00: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
5a10: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
5a20: 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74  "channel");..ret
5a30: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
5a40: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74     }..    /* Get
5a50: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20   channel */.    
5a60: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68  chan = Tcl_GetCh
5a70: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63  annel(interp, Tc
5a80: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
5a90: 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c  bj(objv[1], NULL
5aa0: 29 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69  ), &mode);.    i
5ab0: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f  f (chan == (Tcl_
5ac0: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
5ad0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
5ae0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
5af0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f  * Make sure to o
5b00: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f  perate on the to
5b10: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f  pmost channel */
5b20: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
5b30: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68  GetTopChannel(ch
5b40: 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  an);..    /* Che
5b50: 63 6b 20 69 66 20 64 69 67 65 73 74 20 63 68 61  ck if digest cha
5b60: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28  nnel */.    if (
5b70: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79  Tcl_GetChannelTy
5b80: 70 65 28 63 68 61 6e 29 20 21 3d 20 26 64 69 67  pe(chan) != &dig
5b90: 65 73 74 43 68 61 6e 6e 65 6c 54 79 70 65 29 20  estChannelType) 
5ba0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
5bb0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64  ult(interp, "bad
5bc0: 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63   channel \"", Tc
5bd0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
5be0: 28 63 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22  (chan),..    "\"
5bf0: 3a 20 6e 6f 74 20 61 20 64 69 67 65 73 74 20 63  : not a digest c
5c00: 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a  hannel", NULL);.
5c10: 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64  .Tcl_SetErrorCod
5c20: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c  e(interp, "TLS",
5c30: 20 22 55 4e 53 54 41 43 4b 22 2c 20 22 43 48 41   "UNSTACK", "CHA
5c40: 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22  NNEL", "INVALID"
5c50: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
5c60: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
5c70: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
5c80: 2f 2a 20 50 6f 70 20 74 72 61 6e 73 66 6f 72 6d  /* Pop transform
5c90: 20 66 72 6f 6d 20 63 68 61 6e 6e 65 6c 20 2a 2f   from channel */
5ca0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f  .    return Tcl_
5cb0: 55 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69  UnstackChannel(i
5cc0: 6e 74 65 72 70 2c 20 63 68 61 6e 29 3b 0a 20 20  nterp, chan);.  
5cd0: 20 20 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20    .clientData = 
5ce0: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0a 2f  clientData;.}../
5cf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5d00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5d10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5d20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5d30: 2a 2a 2a 2f 0a 0a 73 74 61 74 69 63 20 63 6f 6e  ***/..static con
5d40: 73 74 20 63 68 61 72 20 2a 69 6e 73 74 61 6e 63  st char *instanc
5d50: 65 5f 66 6e 73 20 5b 5d 20 3d 20 7b 20 22 66 69  e_fns [] = { "fi
5d60: 6e 61 6c 69 7a 65 22 2c 20 22 75 70 64 61 74 65  nalize", "update
5d70: 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 0a 2f 2a 0a 20  ", NULL };../*. 
5d80: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
5d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5dc0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6e 73 74 61  ----. *. * Insta
5dd0: 6e 63 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a  nceObjCmd --. *.
5de0: 20 2a 09 48 61 6e 64 6c 65 72 20 66 6f 72 20 64   *.Handler for d
5df0: 69 67 65 73 74 20 63 6f 6d 6d 61 6e 64 20 69 6e  igest command in
5e00: 73 74 61 6e 63 65 73 2e 20 55 73 65 64 20 74 6f  stances. Used to
5e10: 20 61 64 64 20 64 61 74 61 20 74 6f 20 68 61 73   add data to has
5e20: 68 0a 20 2a 09 66 75 6e 63 74 69 6f 6e 20 6f 72  h. *.function or
5e30: 20 72 65 74 72 69 65 76 65 20 6d 65 73 73 61 67   retrieve messag
5e40: 65 20 64 69 67 65 73 74 2e 0a 20 2a 0a 20 2a 20  e digest.. *. * 
5e50: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f  Returns:. *.TCL_
5e60: 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a  OK or TCL_ERROR.
5e70: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
5e80: 74 73 3a 0a 20 2a 09 41 64 64 73 20 64 61 74 61  ts:. *.Adds data
5e90: 20 74 6f 20 68 61 73 68 20 6f 72 20 72 65 74 75   to hash or retu
5ea0: 72 6e 73 20 6d 65 73 73 61 67 65 20 64 69 67 65  rns message dige
5eb0: 73 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  st. *. *--------
5ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
5f00: 69 6e 74 20 49 6e 73 74 61 6e 63 65 4f 62 6a 43  int InstanceObjC
5f10: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  md(ClientData cl
5f20: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e  ientData, Tcl_In
5f30: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
5f40: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
5f50: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b  *const objv[]) {
5f60: 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65  .    DigestState
5f70: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44 69   *statePtr = (Di
5f80: 67 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69  gestState *) cli
5f90: 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 69 6e 74  entData;.    int
5fa0: 20 66 6e 2c 20 6c 65 6e 20 3d 20 30 3b 0a 20 20   fn, len = 0;.  
5fb0: 20 20 63 68 61 72 20 2a 62 75 66 20 3d 20 4e 55    char *buf = NU
5fc0: 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69  LL;..    /* Vali
5fd0: 64 61 74 65 20 61 72 67 20 63 6f 75 6e 74 20 2a  date arg count *
5fe0: 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c  /.    if (objc <
5ff0: 20 32 20 7c 7c 20 6f 62 6a 63 20 3e 20 33 29 20   2 || objc > 3) 
6000: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  {..Tcl_WrongNumA
6010: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
6020: 62 6a 76 2c 20 22 66 75 6e 63 74 69 6f 6e 20 3f  bjv, "function ?
6030: 64 61 74 61 3f 22 29 3b 0a 09 72 65 74 75 72 6e  data?");..return
6040: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
6050: 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 66 75  }..    /* Get fu
6060: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66  nction */.    if
6070: 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72   (Tcl_GetIndexFr
6080: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
6090: 6a 76 5b 31 5d 2c 20 69 6e 73 74 61 6e 63 65 5f  jv[1], instance_
60a0: 66 6e 73 2c 20 22 66 75 6e 63 74 69 6f 6e 22 2c  fns, "function",
60b0: 20 30 2c 20 26 66 6e 29 20 21 3d 20 54 43 4c 5f   0, &fn) != TCL_
60c0: 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  OK) {..return TC
60d0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
60e0: 20 20 20 20 2f 2a 20 44 6f 20 66 75 6e 63 74 69      /* Do functi
60f0: 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 66 6e  on */.    if (fn
6100: 29 20 7b 0a 09 2f 2a 20 47 65 74 20 64 61 74 61  ) {../* Get data
6110: 20 6f 72 20 72 65 74 75 72 6e 20 65 72 72 6f 72   or return error
6120: 20 69 66 20 6e 6f 6e 65 20 2a 2f 0a 09 69 66 20   if none */..if 
6130: 28 6f 62 6a 63 20 3d 3d 20 33 29 20 7b 0a 09 20  (objc == 3) {.. 
6140: 20 20 20 62 75 66 20 3d 20 54 63 6c 5f 47 65 74     buf = Tcl_Get
6150: 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
6160: 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b  (objv[2], &len);
6170: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
6180: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
6190: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
61a0: 2c 20 22 75 70 64 61 74 65 20 64 61 74 61 22 29  , "update data")
61b0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
61c0: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a  L_ERROR;..}.../*
61d0: 20 55 70 64 61 74 65 20 68 61 73 68 20 66 75 6e   Update hash fun
61e0: 63 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 21 54  ction */..if (!T
61f0: 6c 73 5f 44 69 67 65 73 74 55 70 64 61 74 65 28  ls_DigestUpdate(
6200: 73 74 61 74 65 50 74 72 2c 20 62 75 66 2c 20 28  statePtr, buf, (
6210: 73 69 7a 65 5f 74 29 20 6c 65 6e 2c 20 31 29 29  size_t) len, 1))
6220: 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54   {..    return T
6230: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 20 20  CL_ERROR;..}..  
6240: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 46    } else {../* F
6250: 69 6e 61 6c 69 7a 65 20 68 61 73 68 20 66 75 6e  inalize hash fun
6260: 63 74 69 6f 6e 20 61 6e 64 20 63 61 6c 63 75 6c  ction and calcul
6270: 61 74 65 20 6d 65 73 73 61 67 65 20 64 69 67 65  ate message dige
6280: 73 74 20 2a 2f 0a 09 69 66 20 28 54 6c 73 5f 44  st */..if (Tls_D
6290: 69 67 65 73 74 46 69 6e 69 61 6c 69 7a 65 28 69  igestFinialize(i
62a0: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c  nterp, statePtr,
62b0: 20 4e 55 4c 4c 29 20 21 3d 20 54 43 4c 5f 4f 4b   NULL) != TCL_OK
62c0: 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  ) {..    return 
62d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09  TCL_ERROR;..}...
62e0: 54 63 6c 5f 44 65 6c 65 74 65 43 6f 6d 6d 61 6e  Tcl_DeleteComman
62f0: 64 46 72 6f 6d 54 6f 6b 65 6e 28 69 6e 74 65 72  dFromToken(inter
6300: 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 74 6f 6b  p, statePtr->tok
6310: 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  en);.    }.    r
6320: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
6330: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
6340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
6380: 49 6e 73 74 61 6e 63 65 44 65 6c 43 61 6c 6c 62  InstanceDelCallb
6390: 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 20 43 61  ack --. *. *. Ca
63a0: 6c 6c 62 61 63 6b 20 74 6f 20 63 6c 65 61 6e 2d  llback to clean-
63b0: 75 70 20 77 68 65 6e 20 64 69 67 65 73 74 20 69  up when digest i
63c0: 6e 73 74 61 6e 63 65 20 63 6f 6d 6d 61 6e 64 20  nstance command 
63d0: 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 2a 0a 20  is deleted.. *. 
63e0: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 4e 6f  * Returns:. *.No
63f0: 74 68 69 6e 67 0a 20 2a 0a 20 2a 20 53 69 64 65  thing. *. * Side
6400: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 44 65 73   effects:. *.Des
6410: 74 72 6f 79 73 20 73 74 72 75 63 74 0a 20 2a 0a  troys struct. *.
6420: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
6430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6460: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 49  -----. */.void I
6470: 6e 73 74 61 6e 63 65 44 65 6c 43 61 6c 6c 62 61  nstanceDelCallba
6480: 63 6b 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  ck(ClientData cl
6490: 69 65 6e 74 44 61 74 61 29 20 7b 0a 20 20 20 20  ientData) {.    
64a0: 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61  DigestState *sta
64b0: 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53  tePtr = (DigestS
64c0: 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61  tate *) clientDa
64d0: 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61  ta;..    /* Clea
64e0: 6e 2d 75 70 20 2a 2f 0a 20 20 20 20 54 6c 73 5f  n-up */.    Tls_
64f0: 44 69 67 65 73 74 46 72 65 65 28 73 74 61 74 65  DigestFree(state
6500: 50 74 72 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d  Ptr);.}../*. *--
6510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6550: 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 44 69 67 65  -. *. * Tls_Dige
6560: 73 74 49 6e 73 74 61 6e 63 65 20 2d 2d 0a 20 2a  stInstance --. *
6570: 0a 20 2a 09 20 43 72 65 61 74 65 20 63 6f 6d 6d  . *. Create comm
6580: 61 6e 64 20 74 6f 20 61 6c 6c 6f 77 20 75 73 65  and to allow use
6590: 72 20 74 6f 20 61 64 64 20 64 61 74 61 20 74 6f  r to add data to
65a0: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 0a   hash function..
65b0: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20   *. * Returns:. 
65c0: 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f  *.TCL_OK or TCL_
65d0: 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65  ERROR. *. * Side
65e0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 72 65   effects:. *.Cre
65f0: 61 74 65 73 20 63 6f 6d 6d 61 6e 64 20 6f 72 20  ates command or 
6600: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a  error message. *
6610: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
6620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6650: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 54  ------. */.int T
6660: 6c 73 5f 44 69 67 65 73 74 49 6e 73 74 61 6e 63  ls_DigestInstanc
6670: 65 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  e(Tcl_Interp *in
6680: 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63  terp, Tcl_Obj *c
6690: 6d 64 4f 62 6a 2c 20 63 6f 6e 73 74 20 45 56 50  mdObj, const EVP
66a0: 5f 4d 44 20 2a 6d 64 2c 0a 09 63 6f 6e 73 74 20  _MD *md,..const 
66b0: 45 56 50 5f 43 49 50 48 45 52 20 2a 63 69 70 68  EVP_CIPHER *ciph
66c0: 65 72 2c 20 69 6e 74 20 66 6f 72 6d 61 74 2c 20  er, int format, 
66d0: 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4f 62 6a 29  Tcl_Obj *keyObj)
66e0: 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74 61   {.    DigestSta
66f0: 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 20  te *statePtr;.  
6700: 20 20 63 68 61 72 20 2a 63 6d 64 4e 61 6d 65 20    char *cmdName 
6710: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
6720: 72 6f 6d 4f 62 6a 28 63 6d 64 4f 62 6a 2c 20 4e  romObj(cmdObj, N
6730: 55 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72  ULL);..    /* Cr
6740: 65 61 74 65 20 73 74 61 74 65 20 64 61 74 61 20  eate state data 
6750: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20  structure */.   
6760: 20 69 66 20 28 28 73 74 61 74 65 50 74 72 20 3d   if ((statePtr =
6770: 20 54 6c 73 5f 44 69 67 65 73 74 4e 65 77 28 69   Tls_DigestNew(i
6780: 6e 74 65 72 70 2c 20 66 6f 72 6d 61 74 29 29 20  nterp, format)) 
6790: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f  == NULL) {..Tcl_
67a0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
67b0: 65 72 70 2c 20 22 4d 65 6d 6f 72 79 20 61 6c 6c  erp, "Memory all
67c0: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 22 2c 20  ocation error", 
67d0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
67e0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
67f0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
6800: 20 49 6e 69 74 69 61 6c 69 7a 65 20 68 61 73 68   Initialize hash
6810: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20   function */.   
6820: 20 69 66 20 28 54 6c 73 5f 44 69 67 65 73 74 49   if (Tls_DigestI
6830: 6e 69 74 28 69 6e 74 65 72 70 2c 20 73 74 61 74  nit(interp, stat
6840: 65 50 74 72 2c 20 6d 64 2c 20 63 69 70 68 65 72  ePtr, md, cipher
6850: 2c 20 6b 65 79 4f 62 6a 29 20 21 3d 20 54 43 4c  , keyObj) != TCL
6860: 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  _OK) {..return T
6870: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
6880: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 69  .    /* Create i
6890: 6e 73 74 61 6e 63 65 20 63 6f 6d 6d 61 6e 64 20  nstance command 
68a0: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  */.    statePtr-
68b0: 3e 74 6f 6b 65 6e 20 3d 20 54 63 6c 5f 43 72 65  >token = Tcl_Cre
68c0: 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
68d0: 74 65 72 70 2c 20 63 6d 64 4e 61 6d 65 2c 20 49  terp, cmdName, I
68e0: 6e 73 74 61 6e 63 65 4f 62 6a 43 6d 64 2c 0a 09  nstanceObjCmd,..
68f0: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61  (ClientData) sta
6900: 74 65 50 74 72 2c 20 49 6e 73 74 61 6e 63 65 44  tePtr, InstanceD
6910: 65 6c 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20  elCallback);..  
6920: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 6d 6d    /* Return comm
6930: 61 6e 64 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  and name */.    
6940: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
6950: 28 69 6e 74 65 72 70 2c 20 63 6d 64 4f 62 6a 29  (interp, cmdObj)
6960: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
6970: 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a  _OK;.}.../******
6980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
69a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
69b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
69c0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
69d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
69e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
69f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6a00: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
6a10: 6c 73 5f 44 69 67 65 73 74 44 61 74 61 20 2d 2d  ls_DigestData --
6a20: 0a 20 2a 0a 20 2a 09 52 65 74 75 72 6e 20 6d 65  . *. *.Return me
6a30: 73 73 61 67 65 20 64 69 67 65 73 74 20 66 6f 72  ssage digest for
6a40: 20 64 61 74 61 20 75 73 69 6e 67 20 75 73 65 72   data using user
6a50: 20 73 70 65 63 69 66 69 65 64 20 68 61 73 68 20   specified hash 
6a60: 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20  function.. *. * 
6a70: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f  Returns:. *.TCL_
6a80: 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a  OK or TCL_ERROR.
6a90: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
6aa0: 74 73 3a 0a 20 2a 09 53 65 74 73 20 72 65 73 75  ts:. *.Sets resu
6ab0: 6c 74 20 74 6f 20 6d 65 73 73 61 67 65 20 64 69  lt to message di
6ac0: 67 65 73 74 20 6f 72 20 65 72 72 6f 72 20 6d 65  gest or error me
6ad0: 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  ssage. *. *-----
6ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
6b20: 2a 2f 0a 69 6e 74 0a 54 6c 73 5f 44 69 67 65 73  */.int.Tls_Diges
6b30: 74 44 61 74 61 28 54 63 6c 5f 49 6e 74 65 72 70  tData(Tcl_Interp
6b40: 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62   *interp, Tcl_Ob
6b50: 6a 20 2a 64 61 74 61 4f 62 6a 2c 20 63 6f 6e 73  j *dataObj, cons
6b60: 74 20 45 56 50 5f 4d 44 20 2a 6d 64 2c 0a 09 63  t EVP_MD *md,..c
6b70: 6f 6e 73 74 20 45 56 50 5f 43 49 50 48 45 52 20  onst EVP_CIPHER 
6b80: 2a 63 69 70 68 65 72 2c 20 69 6e 74 20 66 6f 72  *cipher, int for
6b90: 6d 61 74 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6b 65  mat, Tcl_Obj *ke
6ba0: 79 4f 62 6a 29 20 7b 0a 20 20 20 20 63 68 61 72  yObj) {.    char
6bb0: 20 2a 64 61 74 61 3b 0a 20 20 20 20 69 6e 74 20   *data;.    int 
6bc0: 64 61 74 61 5f 6c 65 6e 3b 0a 20 20 20 20 44 69  data_len;.    Di
6bd0: 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65  gestState *state
6be0: 50 74 72 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74  Ptr;..    /* Get
6bf0: 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 64 61 74   data */.    dat
6c00: 61 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41  a = Tcl_GetByteA
6c10: 72 72 61 79 46 72 6f 6d 4f 62 6a 28 64 61 74 61  rrayFromObj(data
6c20: 4f 62 6a 2c 20 26 64 61 74 61 5f 6c 65 6e 29 3b  Obj, &data_len);
6c30: 0a 20 20 20 20 69 66 20 28 64 61 74 61 20 3d 3d  .    if (data ==
6c40: 20 4e 55 4c 4c 20 7c 7c 20 64 61 74 61 5f 6c 65   NULL || data_le
6c50: 6e 20 3d 3d 20 30 29 20 7b 0a 09 54 63 6c 5f 53  n == 0) {..Tcl_S
6c60: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
6c70: 20 22 4e 6f 20 64 61 74 61 22 2c 20 4e 55 4c 4c   "No data", NULL
6c80: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
6c90: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
6ca0: 20 2f 2a 20 43 72 65 61 74 65 20 73 74 61 74 65   /* Create state
6cb0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
6cc0: 2a 2f 0a 20 20 20 20 69 66 20 28 28 73 74 61 74  */.    if ((stat
6cd0: 65 50 74 72 20 3d 20 54 6c 73 5f 44 69 67 65 73  ePtr = Tls_Diges
6ce0: 74 4e 65 77 28 69 6e 74 65 72 70 2c 20 66 6f 72  tNew(interp, for
6cf0: 6d 61 74 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b  mat)) == NULL) {
6d00: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
6d10: 6c 74 28 69 6e 74 65 72 70 2c 20 22 4d 65 6d 6f  lt(interp, "Memo
6d20: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
6d30: 72 6f 72 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ror", (char *) N
6d40: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  ULL);..return TC
6d50: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
6d60: 20 20 20 20 2f 2a 20 43 61 6c 63 20 44 69 67 65      /* Calc Dige
6d70: 73 74 2c 20 61 62 6f 72 74 20 66 6f 72 20 65 72  st, abort for er
6d80: 72 6f 72 20 2a 2f 0a 20 20 20 20 69 66 20 28 54  ror */.    if (T
6d90: 6c 73 5f 44 69 67 65 73 74 49 6e 69 74 28 69 6e  ls_DigestInit(in
6da0: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20  terp, statePtr, 
6db0: 6d 64 2c 20 63 69 70 68 65 72 2c 20 6b 65 79 4f  md, cipher, keyO
6dc0: 62 6a 29 20 21 3d 20 54 43 4c 5f 4f 4b 20 7c 7c  bj) != TCL_OK ||
6dd0: 0a 09 54 6c 73 5f 44 69 67 65 73 74 55 70 64 61  ..Tls_DigestUpda
6de0: 74 65 28 73 74 61 74 65 50 74 72 2c 20 64 61 74  te(statePtr, dat
6df0: 61 2c 20 28 73 69 7a 65 5f 74 29 20 64 61 74 61  a, (size_t) data
6e00: 5f 6c 65 6e 2c 20 31 29 20 3d 3d 20 30 20 7c 7c  _len, 1) == 0 ||
6e10: 0a 09 54 6c 73 5f 44 69 67 65 73 74 46 69 6e 69  ..Tls_DigestFini
6e20: 61 6c 69 7a 65 28 69 6e 74 65 72 70 2c 20 73 74  alize(interp, st
6e30: 61 74 65 50 74 72 2c 20 4e 55 4c 4c 29 20 21 3d  atePtr, NULL) !=
6e40: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 6c 73 5f   TCL_OK) {..Tls_
6e50: 44 69 67 65 73 74 46 72 65 65 28 73 74 61 74 65  DigestFree(state
6e60: 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  Ptr);..return TC
6e70: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
6e80: 20 20 20 20 2f 2a 20 43 6c 65 61 6e 2d 75 70 20      /* Clean-up 
6e90: 2a 2f 0a 20 20 20 20 54 6c 73 5f 44 69 67 65 73  */.    Tls_Diges
6ea0: 74 46 72 65 65 28 73 74 61 74 65 50 74 72 29 3b  tFree(statePtr);
6eb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
6ec0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  OK;.}../********
6ed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6ee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6ef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6f00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
6f10: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
6f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f50: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73  ------. *. * Tls
6f60: 5f 44 69 67 65 73 74 46 69 6c 65 20 2d 2d 0a 20  _DigestFile --. 
6f70: 2a 0a 20 2a 09 52 65 74 75 72 6e 20 6d 65 73 73  *. *.Return mess
6f80: 61 67 65 20 64 69 67 65 73 74 20 66 6f 72 20 66  age digest for f
6f90: 69 6c 65 20 75 73 69 6e 67 20 75 73 65 72 20 73  ile using user s
6fa0: 70 65 63 69 66 69 65 64 20 68 61 73 68 20 66 75  pecified hash fu
6fb0: 6e 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65  nction.. *. * Re
6fc0: 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b  turns:. *.TCL_OK
6fd0: 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a   or TCL_ERROR. *
6fe0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
6ff0: 3a 0a 20 2a 09 52 65 73 75 6c 74 20 69 73 20 6d  :. *.Result is m
7000: 65 73 73 61 67 65 20 64 69 67 65 73 74 20 6f 72  essage digest or
7010: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20   error message. 
7020: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
7030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7060: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20  -------. */.int 
7070: 54 6c 73 5f 44 69 67 65 73 74 46 69 6c 65 28 54  Tls_DigestFile(T
7080: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
7090: 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 66 69 6c 65  p, Tcl_Obj *file
70a0: 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 45 56 50 5f  name, const EVP_
70b0: 4d 44 20 2a 6d 64 2c 0a 09 63 6f 6e 73 74 20 45  MD *md,..const E
70c0: 56 50 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65  VP_CIPHER *ciphe
70d0: 72 2c 20 69 6e 74 20 66 6f 72 6d 61 74 2c 20 54  r, int format, T
70e0: 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4f 62 6a 29 20  cl_Obj *keyObj) 
70f0: 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74  {.    DigestStat
7100: 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 20 20  e *statePtr;.   
7110: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61   Tcl_Channel cha
7120: 6e 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e  n = NULL;.    un
7130: 73 69 67 6e 65 64 20 63 68 61 72 20 62 75 66 5b  signed char buf[
7140: 42 55 46 46 45 52 5f 53 49 5a 45 5d 3b 0a 20 20  BUFFER_SIZE];.  
7150: 20 20 69 6e 74 20 72 65 73 20 3d 20 54 43 4c 5f    int res = TCL_
7160: 4f 4b 2c 20 6c 65 6e 3b 0a 0a 20 20 20 20 2f 2a  OK, len;..    /*
7170: 20 43 72 65 61 74 65 20 73 74 61 74 65 20 64 61   Create state da
7180: 74 61 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ta structure */.
7190: 20 20 20 20 69 66 20 28 28 73 74 61 74 65 50 74      if ((statePt
71a0: 72 20 3d 20 54 6c 73 5f 44 69 67 65 73 74 4e 65  r = Tls_DigestNe
71b0: 77 28 69 6e 74 65 72 70 2c 20 66 6f 72 6d 61 74  w(interp, format
71c0: 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54  )) == NULL) {..T
71d0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
71e0: 69 6e 74 65 72 70 2c 20 22 4d 65 6d 6f 72 79 20  interp, "Memory 
71f0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
7200: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
7210: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
7220: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
7230: 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 63 68   /* Open file ch
7240: 61 6e 6e 65 6c 2c 20 61 62 6f 72 74 20 66 6f 72  annel, abort for
7250: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 63 68   error */.    ch
7260: 61 6e 20 3d 20 54 63 6c 5f 46 53 4f 70 65 6e 46  an = Tcl_FSOpenF
7270: 69 6c 65 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  ileChannel(inter
7280: 70 2c 20 66 69 6c 65 6e 61 6d 65 2c 20 22 72 62  p, filename, "rb
7290: 22 2c 20 30 34 34 34 29 3b 0a 20 20 20 20 69 66  ", 0444);.    if
72a0: 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43   (chan == (Tcl_C
72b0: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a  hannel) NULL) {.
72c0: 09 54 6c 73 5f 44 69 67 65 73 74 46 72 65 65 28  .Tls_DigestFree(
72d0: 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75  statePtr);..retu
72e0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
72f0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 66    }..    /* Conf
7300: 69 67 75 72 65 20 63 68 61 6e 6e 65 6c 20 2a 2f  igure channel */
7310: 0a 20 20 20 20 69 66 20 28 28 72 65 73 20 3d 20  .    if ((res = 
7320: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_SetChannelOp
7330: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61  tion(interp, cha
7340: 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e  n, "-translation
7350: 22 2c 20 22 62 69 6e 61 72 79 22 29 29 20 3d 3d  ", "binary")) ==
7360: 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 67   TCL_ERROR) {..g
7370: 6f 74 6f 20 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a  oto done;.    }.
7380: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e      Tcl_SetChann
7390: 65 6c 42 75 66 66 65 72 53 69 7a 65 28 63 68 61  elBufferSize(cha
73a0: 6e 2c 20 42 55 46 46 45 52 5f 53 49 5a 45 29 3b  n, BUFFER_SIZE);
73b0: 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  ..    /* Initial
73c0: 69 7a 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f  ize hash functio
73d0: 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 72 65  n */.    if ((re
73e0: 73 20 3d 20 54 6c 73 5f 44 69 67 65 73 74 49 6e  s = Tls_DigestIn
73f0: 69 74 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  it(interp, state
7400: 50 74 72 2c 20 6d 64 2c 20 63 69 70 68 65 72 2c  Ptr, md, cipher,
7410: 20 6b 65 79 4f 62 6a 29 29 20 21 3d 20 54 43 4c   keyObj)) != TCL
7420: 5f 4f 4b 29 20 7b 0a 09 67 6f 74 6f 20 64 6f 6e  _OK) {..goto don
7430: 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  e;.    }..    /*
7440: 20 52 65 61 64 20 66 69 6c 65 20 64 61 74 61 20   Read file data 
7450: 61 6e 64 20 75 70 64 61 74 65 20 68 61 73 68 20  and update hash 
7460: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  function */.    
7470: 77 68 69 6c 65 20 28 21 54 63 6c 5f 45 6f 66 28  while (!Tcl_Eof(
7480: 63 68 61 6e 29 29 20 7b 0a 09 6c 65 6e 20 3d 20  chan)) {..len = 
7490: 54 63 6c 5f 52 65 61 64 52 61 77 28 63 68 61 6e  Tcl_ReadRaw(chan
74a0: 2c 20 28 63 68 61 72 20 2a 29 20 62 75 66 2c 20  , (char *) buf, 
74b0: 42 55 46 46 45 52 5f 53 49 5a 45 29 3b 0a 09 69  BUFFER_SIZE);..i
74c0: 66 20 28 6c 65 6e 20 3e 20 30 29 20 7b 0a 09 20  f (len > 0) {.. 
74d0: 20 20 20 69 66 20 28 21 54 6c 73 5f 44 69 67 65     if (!Tls_Dige
74e0: 73 74 55 70 64 61 74 65 28 73 74 61 74 65 50 74  stUpdate(statePt
74f0: 72 2c 20 26 62 75 66 5b 30 5d 2c 20 28 73 69 7a  r, &buf[0], (siz
7500: 65 5f 74 29 20 6c 65 6e 2c 20 31 29 29 20 7b 0a  e_t) len, 1)) {.
7510: 09 09 72 65 73 20 3d 20 54 43 4c 5f 45 52 52 4f  ..res = TCL_ERRO
7520: 52 3b 0a 09 09 67 6f 74 6f 20 64 6f 6e 65 3b 0a  R;...goto done;.
7530: 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a  .    }..}.    }.
7540: 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65  .    /* Finalize
7550: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 61   hash function a
7560: 6e 64 20 63 61 6c 63 75 6c 61 74 65 20 6d 65 73  nd calculate mes
7570: 73 61 67 65 20 64 69 67 65 73 74 20 2a 2f 0a 20  sage digest */. 
7580: 20 20 20 72 65 73 20 3d 20 54 6c 73 5f 44 69 67     res = Tls_Dig
7590: 65 73 74 46 69 6e 69 61 6c 69 7a 65 28 69 6e 74  estFinialize(int
75a0: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 4e  erp, statePtr, N
75b0: 55 4c 4c 29 3b 0a 0a 64 6f 6e 65 3a 0a 20 20 20  ULL);..done:.   
75c0: 20 2f 2a 20 43 6c 6f 73 65 20 63 68 61 6e 6e 65   /* Close channe
75d0: 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c  l */.    if (Tcl
75e0: 5f 43 6c 6f 73 65 28 69 6e 74 65 72 70 2c 20 63  _Close(interp, c
75f0: 68 61 6e 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f  han) == TCL_ERRO
7600: 52 29 20 7b 0a 09 72 65 73 20 3d 20 54 43 4c 5f  R) {..res = TCL_
7610: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
7620: 20 20 2f 2a 20 43 6c 65 61 6e 2d 75 70 20 2a 2f    /* Clean-up */
7630: 0a 20 20 20 20 54 6c 73 5f 44 69 67 65 73 74 46  .    Tls_DigestF
7640: 72 65 65 28 73 74 61 74 65 50 74 72 29 3b 0a 20  ree(statePtr);. 
7650: 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d     return res;.}
7660: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
7670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
76a0: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d  ******/../*. *--
76b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
76c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
76d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
76e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
76f0: 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 4d 61  -. *. * DigestMa
7700: 69 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 75  in --. *. *.Retu
7710: 72 6e 20 6d 65 73 73 61 67 65 20 64 69 67 65 73  rn message diges
7720: 74 20 6f 72 20 4d 65 73 73 61 67 65 20 41 75 74  t or Message Aut
7730: 68 65 6e 74 69 63 61 74 69 6f 6e 20 43 6f 64 65  hentication Code
7740: 20 28 4d 41 43 29 20 6f 66 0a 20 2a 09 64 61 74   (MAC) of. *.dat
7750: 61 20 75 73 69 6e 67 20 75 73 65 72 20 73 70 65  a using user spe
7760: 63 69 66 69 65 64 20 68 61 73 68 20 66 75 6e 63  cified hash func
7770: 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 75  tion.. *. * Retu
7780: 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f  rns:. *.TCL_OK o
7790: 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20  r TCL_ERROR. *. 
77a0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
77b0: 20 2a 09 53 65 74 73 20 72 65 73 75 6c 74 20 74   *.Sets result t
77c0: 6f 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74  o message digest
77d0: 20 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67   or error messag
77e0: 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  e. *. *---------
77f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
7830: 74 61 74 69 63 20 69 6e 74 20 44 69 67 65 73 74  tatic int Digest
7840: 4d 61 69 6e 28 69 6e 74 20 74 79 70 65 2c 20 54  Main(int type, T
7850: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
7860: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
7870: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
7880: 5b 5d 29 20 7b 0a 20 20 20 20 69 6e 74 20 69 64  []) {.    int id
7890: 78 2c 20 66 6f 72 6d 61 74 20 3d 20 48 45 58 5f  x, format = HEX_
78a0: 46 4f 52 4d 41 54 2c 20 72 65 73 20 3d 20 54 43  FORMAT, res = TC
78b0: 4c 5f 4f 4b 2c 20 66 6c 61 67 73 20 3d 20 30 3b  L_OK, flags = 0;
78c0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
78d0: 2a 64 69 67 65 73 74 4e 61 6d 65 2c 20 2a 63 68  *digestName, *ch
78e0: 61 6e 6e 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20  annel = NULL;.  
78f0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 4f 62    Tcl_Obj *cmdOb
7900: 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 64 61 74 61 4f  j = NULL, *dataO
7910: 62 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 66 69 6c 65  bj = NULL, *file
7920: 4f 62 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 6b 65 79  Obj = NULL, *key
7930: 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  Obj = NULL;.    
7940: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63  unsigned char *c
7950: 69 70 68 65 72 4e 61 6d 65 20 3d 20 4e 55 4c 4c  ipherName = NULL
7960: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45 56 50 5f  ;.    const EVP_
7970: 4d 44 20 2a 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20  MD *md = NULL;. 
7980: 20 20 20 63 6f 6e 73 74 20 45 56 50 5f 43 49 50     const EVP_CIP
7990: 48 45 52 20 2a 63 69 70 68 65 72 20 3d 20 4e 55  HER *cipher = NU
79a0: 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61  LL;..    /* Clea
79b0: 72 20 69 6e 74 65 72 70 20 72 65 73 75 6c 74 20  r interp result 
79c0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74  */.    Tcl_Reset
79d0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
79e0: 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 65  .    /* Validate
79f0: 20 61 72 67 20 63 6f 75 6e 74 20 2a 2f 0a 20 20   arg count */.  
7a00: 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 33 20 7c    if (objc < 3 |
7a10: 7c 20 6f 62 6a 63 20 3e 20 31 32 29 20 7b 0a 09  | objc > 12) {..
7a20: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
7a30: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
7a40: 2c 20 22 3f 2d 62 69 6e 7c 2d 68 65 78 3f 20 3f  , "?-bin|-hex? ?
7a50: 2d 63 69 70 68 65 72 20 6e 61 6d 65 3f 20 3f 2d  -cipher name? ?-
7a60: 64 69 67 65 73 74 20 6e 61 6d 65 3f 20 3f 2d 6b  digest name? ?-k
7a70: 65 79 20 6b 65 79 3f 20 5b 2d 63 68 61 6e 6e 65  ey key? [-channe
7a80: 6c 20 63 68 61 6e 20 7c 20 2d 63 6f 6d 6d 61 6e  l chan | -comman
7a90: 64 20 63 6d 64 4e 61 6d 65 20 7c 20 2d 66 69 6c  d cmdName | -fil
7aa0: 65 20 66 69 6c 65 6e 61 6d 65 20 7c 20 3f 2d 64  e filename | ?-d
7ab0: 61 74 61 3f 20 64 61 74 61 5d 22 29 3b 0a 09 72  ata? data]");..r
7ac0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7ad0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f  .    }..    /* O
7ae0: 70 74 69 6d 61 6c 20 63 61 73 65 20 66 6f 72 20  ptimal case for 
7af0: 61 20 64 69 67 65 73 74 20 61 6e 64 20 62 6c 6f  a digest and blo
7b00: 62 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 20  b of data */.   
7b10: 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 33 20 26   if (objc == 3 &
7b20: 26 20 74 79 70 65 20 3d 3d 20 54 59 50 45 5f 4d  & type == TYPE_M
7b30: 44 29 20 7b 0a 09 64 69 67 65 73 74 4e 61 6d 65  D) {..digestName
7b40: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
7b50: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c  FromObj(objv[1],
7b60: 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 28 6d 64 20  NULL);..if ((md 
7b70: 3d 20 45 56 50 5f 67 65 74 5f 64 69 67 65 73 74  = EVP_get_digest
7b80: 62 79 6e 61 6d 65 28 64 69 67 65 73 74 4e 61 6d  byname(digestNam
7b90: 65 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  e)) != NULL) {..
7ba0: 20 20 20 20 72 65 74 75 72 6e 20 54 6c 73 5f 44      return Tls_D
7bb0: 69 67 65 73 74 44 61 74 61 28 69 6e 74 65 72 70  igestData(interp
7bc0: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 6d 64 2c 20 4e  , objv[2], md, N
7bd0: 55 4c 4c 2c 20 48 45 58 5f 46 4f 52 4d 41 54 20  ULL, HEX_FORMAT 
7be0: 7c 20 54 59 50 45 5f 4d 44 2c 20 4e 55 4c 4c 29  | TYPE_MD, NULL)
7bf0: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20  ;..} else {..   
7c00: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
7c10: 74 28 69 6e 74 65 72 70 2c 20 22 49 6e 76 61 6c  t(interp, "Inval
7c20: 69 64 20 64 69 67 65 73 74 20 5c 22 22 2c 20 64  id digest \"", d
7c30: 69 67 65 73 74 4e 61 6d 65 2c 20 22 5c 22 22 2c  igestName, "\"",
7c40: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74   NULL);..    ret
7c50: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
7c60: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
7c70: 47 65 74 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a 20  Get options */. 
7c80: 20 20 20 66 6f 72 20 28 69 64 78 20 3d 20 31 3b     for (idx = 1;
7c90: 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20 69 64 78   idx < objc; idx
7ca0: 2b 2b 29 20 7b 0a 09 63 68 61 72 20 2a 6f 70 74  ++) {..char *opt
7cb0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
7cc0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69 64 78  FromObj(objv[idx
7cd0: 5d 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28  ], NULL);...if (
7ce0: 6f 70 74 5b 30 5d 20 21 3d 20 27 2d 27 29 20 7b  opt[0] != '-') {
7cf0: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d 0a  ..    break;..}.
7d00: 0a 09 4f 50 54 46 4c 41 47 28 22 2d 62 69 6e 22  ..OPTFLAG("-bin"
7d10: 2c 20 66 6f 72 6d 61 74 2c 20 42 49 4e 5f 46 4f  , format, BIN_FO
7d20: 52 4d 41 54 29 3b 0a 09 4f 50 54 46 4c 41 47 28  RMAT);..OPTFLAG(
7d30: 22 2d 62 69 6e 61 72 79 22 2c 20 66 6f 72 6d 61  "-binary", forma
7d40: 74 2c 20 42 49 4e 5f 46 4f 52 4d 41 54 29 3b 0a  t, BIN_FORMAT);.
7d50: 09 4f 50 54 46 4c 41 47 28 22 2d 68 65 78 22 2c  .OPTFLAG("-hex",
7d60: 20 66 6f 72 6d 61 74 2c 20 48 45 58 5f 46 4f 52   format, HEX_FOR
7d70: 4d 41 54 29 3b 0a 09 4f 50 54 46 4c 41 47 28 22  MAT);..OPTFLAG("
7d80: 2d 68 65 78 61 64 65 63 69 6d 61 6c 22 2c 20 66  -hexadecimal", f
7d90: 6f 72 6d 61 74 2c 20 48 45 58 5f 46 4f 52 4d 41  ormat, HEX_FORMA
7da0: 54 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 68  T);..OPTSTR("-ch
7db0: 61 6e 22 2c 20 63 68 61 6e 6e 65 6c 29 3b 0a 09  an", channel);..
7dc0: 4f 50 54 53 54 52 28 22 2d 63 68 61 6e 6e 65 6c  OPTSTR("-channel
7dd0: 22 2c 20 63 68 61 6e 6e 65 6c 29 3b 0a 09 4f 50  ", channel);..OP
7de0: 54 53 54 52 28 22 2d 63 69 70 68 65 72 22 2c 20  TSTR("-cipher", 
7df0: 63 69 70 68 65 72 4e 61 6d 65 29 3b 0a 09 4f 50  cipherName);..OP
7e00: 54 4f 42 4a 28 22 2d 63 6f 6d 6d 61 6e 64 22 2c  TOBJ("-command",
7e10: 20 63 6d 64 4f 62 6a 29 3b 0a 09 4f 50 54 4f 42   cmdObj);..OPTOB
7e20: 4a 28 22 2d 64 61 74 61 22 2c 20 64 61 74 61 4f  J("-data", dataO
7e30: 62 6a 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 64  bj);..OPTSTR("-d
7e40: 69 67 65 73 74 22 2c 20 64 69 67 65 73 74 4e 61  igest", digestNa
7e50: 6d 65 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 66  me);..OPTOBJ("-f
7e60: 69 6c 65 22 2c 20 66 69 6c 65 4f 62 6a 29 3b 0a  ile", fileObj);.
7e70: 09 4f 50 54 4f 42 4a 28 22 2d 66 69 6c 65 6e 61  .OPTOBJ("-filena
7e80: 6d 65 22 2c 20 66 69 6c 65 4f 62 6a 29 3b 0a 09  me", fileObj);..
7e90: 4f 50 54 4f 42 4a 28 22 2d 6b 65 79 22 2c 20 6b  OPTOBJ("-key", k
7ea0: 65 79 4f 62 6a 29 3b 0a 0a 09 4f 50 54 42 41 44  eyObj);...OPTBAD
7eb0: 28 22 6f 70 74 69 6f 6e 22 2c 20 22 2d 62 69 6e  ("option", "-bin
7ec0: 2c 20 2d 63 68 61 6e 6e 65 6c 2c 20 2d 63 69 70  , -channel, -cip
7ed0: 68 65 72 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d  her, -command, -
7ee0: 64 61 74 61 2c 20 2d 64 69 67 65 73 74 2c 20 2d  data, -digest, -
7ef0: 66 69 6c 65 2c 20 2d 66 69 6c 65 6e 61 6d 65 2c  file, -filename,
7f00: 20 2d 68 65 78 2c 20 6f 72 20 2d 6b 65 79 22 29   -hex, or -key")
7f10: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
7f20: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
7f30: 2f 2a 20 47 65 74 20 63 69 70 68 65 72 20 2a 2f  /* Get cipher */
7f40: 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 4e  .    if (cipherN
7f50: 61 6d 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ame != NULL) {..
7f60: 63 69 70 68 65 72 20 3d 20 45 56 50 5f 67 65 74  cipher = EVP_get
7f70: 5f 63 69 70 68 65 72 62 79 6e 61 6d 65 28 63 69  _cipherbyname(ci
7f80: 70 68 65 72 4e 61 6d 65 29 3b 0a 09 74 79 70 65  pherName);..type
7f90: 20 3d 20 54 59 50 45 5f 43 4d 41 43 3b 0a 09 69   = TYPE_CMAC;..i
7fa0: 66 20 28 63 69 70 68 65 72 20 3d 3d 20 4e 55 4c  f (cipher == NUL
7fb0: 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70  L) {..    Tcl_Ap
7fc0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
7fd0: 70 2c 20 22 49 6e 76 61 6c 69 64 20 63 69 70 68  p, "Invalid ciph
7fe0: 65 72 20 5c 22 22 2c 20 63 69 70 68 65 72 4e 61  er \"", cipherNa
7ff0: 6d 65 2c 20 22 5c 22 22 2c 20 4e 55 4c 4c 29 3b  me, "\"", NULL);
8000: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
8010: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 20 20 20 20  _ERROR;..}..    
8020: 7d 20 65 6c 73 65 20 69 66 20 28 74 79 70 65 20  } else if (type 
8030: 3d 3d 20 54 59 50 45 5f 43 4d 41 43 29 20 7b 0a  == TYPE_CMAC) {.
8040: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
8050: 74 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20 63 69  t(interp, "No ci
8060: 70 68 65 72 20 73 70 65 63 69 66 69 65 64 22 2c  pher specified",
8070: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
8080: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
8090: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 64 69 67  ..    /* Get dig
80a0: 65 73 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 64  est */.    if (d
80b0: 69 67 65 73 74 4e 61 6d 65 20 21 3d 20 4e 55 4c  igestName != NUL
80c0: 4c 29 20 7b 0a 09 6d 64 20 3d 20 45 56 50 5f 67  L) {..md = EVP_g
80d0: 65 74 5f 64 69 67 65 73 74 62 79 6e 61 6d 65 28  et_digestbyname(
80e0: 64 69 67 65 73 74 4e 61 6d 65 29 3b 0a 09 69 66  digestName);..if
80f0: 20 28 6d 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a   (md == NULL) {.
8100: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
8110: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 49  esult(interp, "I
8120: 6e 76 61 6c 69 64 20 64 69 67 65 73 74 20 5c 22  nvalid digest \"
8130: 22 2c 20 64 69 67 65 73 74 4e 61 6d 65 2c 20 22  ", digestName, "
8140: 5c 22 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  \"", NULL);..   
8150: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
8160: 52 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65  R;..}.    } else
8170: 20 69 66 20 28 74 79 70 65 20 3d 3d 20 54 59 50   if (type == TYP
8180: 45 5f 4d 44 20 7c 7c 20 74 79 70 65 20 3d 3d 20  E_MD || type == 
8190: 54 59 50 45 5f 48 4d 41 43 29 20 7b 0a 09 54 63  TYPE_HMAC) {..Tc
81a0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
81b0: 6e 74 65 72 70 2c 20 22 4e 6f 20 64 69 67 65 73  nterp, "No diges
81c0: 74 20 73 70 65 63 69 66 69 65 64 22 2c 20 4e 55  t specified", NU
81d0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
81e0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
81f0: 20 20 20 2f 2a 20 47 65 74 20 6b 65 79 20 2a 2f     /* Get key */
8200: 0a 20 20 20 20 69 66 20 28 6b 65 79 4f 62 6a 20  .    if (keyObj 
8210: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28  != NULL) {..if (
8220: 74 79 70 65 20 3d 3d 20 54 59 50 45 5f 4d 44 29  type == TYPE_MD)
8230: 20 7b 0a 09 20 20 20 20 74 79 70 65 20 3d 20 54   {..    type = T
8240: 59 50 45 5f 48 4d 41 43 3b 0a 09 7d 0a 20 20 20  YPE_HMAC;..}.   
8250: 20 7d 20 65 6c 73 65 20 69 66 20 28 74 79 70 65   } else if (type
8260: 20 21 3d 20 54 59 50 45 5f 4d 44 29 20 7b 0a 09   != TYPE_MD) {..
8270: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8280: 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20 6b 65 79  (interp, "No key
8290: 20 73 70 65 63 69 66 69 65 64 22 2c 20 4e 55 4c   specified", NUL
82a0: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  L);..return TCL_
82b0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
82c0: 20 20 2f 2a 20 43 61 6c 63 20 64 69 67 65 73 74    /* Calc digest
82d0: 20 6f 6e 20 66 69 6c 65 2c 20 73 74 61 63 6b 65   on file, stacke
82e0: 64 20 63 68 61 6e 6e 65 6c 2c 20 75 73 69 6e 67  d channel, using
82f0: 20 69 6e 73 74 61 6e 63 65 20 63 6f 6d 6d 61 6e   instance comman
8300: 64 2c 20 6f 72 20 64 61 74 61 20 62 6c 6f 62 20  d, or data blob 
8310: 2a 2f 0a 20 20 20 20 69 66 20 28 66 69 6c 65 4f  */.    if (fileO
8320: 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  bj != NULL) {..r
8330: 65 73 20 3d 20 54 6c 73 5f 44 69 67 65 73 74 46  es = Tls_DigestF
8340: 69 6c 65 28 69 6e 74 65 72 70 2c 20 66 69 6c 65  ile(interp, file
8350: 4f 62 6a 2c 20 6d 64 2c 20 63 69 70 68 65 72 2c  Obj, md, cipher,
8360: 20 66 6f 72 6d 61 74 20 7c 20 74 79 70 65 2c 20   format | type, 
8370: 6b 65 79 4f 62 6a 29 3b 0a 20 20 20 20 7d 20 65  keyObj);.    } e
8380: 6c 73 65 20 69 66 20 28 63 68 61 6e 6e 65 6c 20  lse if (channel 
8390: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 20  != NULL) {..res 
83a0: 3d 20 54 6c 73 5f 44 69 67 65 73 74 43 68 61 6e  = Tls_DigestChan
83b0: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  nel(interp, chan
83c0: 6e 65 6c 2c 20 6d 64 2c 20 63 69 70 68 65 72 2c  nel, md, cipher,
83d0: 20 66 6f 72 6d 61 74 20 7c 20 74 79 70 65 2c 20   format | type, 
83e0: 6b 65 79 4f 62 6a 29 3b 0a 20 20 20 20 7d 20 65  keyObj);.    } e
83f0: 6c 73 65 20 69 66 20 28 63 6d 64 4f 62 6a 20 21  lse if (cmdObj !
8400: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 20 3d  = NULL) {..res =
8410: 20 54 6c 73 5f 44 69 67 65 73 74 49 6e 73 74 61   Tls_DigestInsta
8420: 6e 63 65 28 69 6e 74 65 72 70 2c 20 63 6d 64 4f  nce(interp, cmdO
8430: 62 6a 2c 20 6d 64 2c 20 63 69 70 68 65 72 2c 20  bj, md, cipher, 
8440: 66 6f 72 6d 61 74 20 7c 20 74 79 70 65 2c 20 6b  format | type, k
8450: 65 79 4f 62 6a 29 3b 0a 20 20 20 20 7d 20 65 6c  eyObj);.    } el
8460: 73 65 20 69 66 20 28 64 61 74 61 4f 62 6a 20 21  se if (dataObj !
8470: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 20 3d  = NULL) {..res =
8480: 20 54 6c 73 5f 44 69 67 65 73 74 44 61 74 61 28   Tls_DigestData(
8490: 69 6e 74 65 72 70 2c 20 64 61 74 61 4f 62 6a 2c  interp, dataObj,
84a0: 20 6d 64 2c 20 63 69 70 68 65 72 2c 20 66 6f 72   md, cipher, for
84b0: 6d 61 74 20 7c 20 74 79 70 65 2c 20 6b 65 79 4f  mat | type, keyO
84c0: 62 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  bj);.    }.    r
84d0: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
84e0: 0a 20 2a 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 4d 65 73  ------. *. * Mes
8530: 73 61 67 65 20 44 69 67 65 73 74 20 61 6e 64 20  sage Digest and 
8540: 4d 65 73 73 61 67 65 20 41 75 74 68 65 6e 74 69  Message Authenti
8550: 63 61 74 69 6f 6e 20 43 6f 64 65 20 43 6f 6d 6d  cation Code Comm
8560: 61 6e 64 73 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65  ands --. *. *.Re
8570: 74 75 72 6e 20 4d 65 73 73 61 67 65 20 44 69 67  turn Message Dig
8580: 65 73 74 20 28 4d 44 29 20 6f 72 20 4d 65 73 73  est (MD) or Mess
8590: 61 67 65 20 41 75 74 68 65 6e 74 69 63 61 74 69  age Authenticati
85a0: 6f 6e 20 43 6f 64 65 20 28 4d 41 43 29 2e 0a 20  on Code (MAC).. 
85b0: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a  *. * Returns:. *
85c0: 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45  .TCL_OK or TCL_E
85d0: 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20  RROR. *. * Side 
85e0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73  effects:. *.Sets
85f0: 20 72 65 73 75 6c 74 20 74 6f 20 6d 65 73 73 61   result to messa
8600: 67 65 20 64 69 67 65 73 74 20 6f 72 20 65 72 72  ge digest or err
8610: 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a  or message. *. *
8620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
8670: 6e 74 20 44 69 67 65 73 74 4f 62 6a 43 6d 64 28  nt DigestObjCmd(
8680: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
8690: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
86a0: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
86b0: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
86c0: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
86d0: 20 20 72 65 74 75 72 6e 20 44 69 67 65 73 74 4d    return DigestM
86e0: 61 69 6e 28 54 59 50 45 5f 4d 44 2c 20 69 6e 74  ain(TYPE_MD, int
86f0: 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29  erp, objc, objv)
8700: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
8710: 43 4d 41 43 4f 62 6a 43 6d 64 28 43 6c 69 65 6e  CMACObjCmd(Clien
8720: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
8730: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
8740: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
8750: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
8760: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74  bjv[]) {.    ret
8770: 75 72 6e 20 44 69 67 65 73 74 4d 61 69 6e 28 54  urn DigestMain(T
8780: 59 50 45 5f 43 4d 41 43 2c 20 69 6e 74 65 72 70  YPE_CMAC, interp
8790: 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 7d  , objc, objv);.}
87a0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 48 4d 41  ..static int HMA
87b0: 43 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61  CObjCmd(ClientDa
87c0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
87d0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
87e0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
87f0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
8800: 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  []) {.    return
8810: 20 44 69 67 65 73 74 4d 61 69 6e 28 54 59 50 45   DigestMain(TYPE
8820: 5f 48 4d 41 43 2c 20 69 6e 74 65 72 70 2c 20 6f  _HMAC, interp, o
8830: 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 7d 0a 0a 2f  bjc, objv);.}../
8840: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
8850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8880: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 65  -------. *. * Me
8890: 73 73 61 67 65 20 44 69 67 65 73 74 20 43 6f 6e  ssage Digest Con
88a0: 76 65 6e 69 65 6e 63 65 20 43 6f 6d 6d 61 6e 64  venience Command
88b0: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43 6f 6e 76 65  s --. *. *.Conve
88c0: 6e 69 65 6e 63 65 20 63 6f 6d 6d 61 6e 64 73 20  nience commands 
88d0: 66 6f 72 20 73 65 6c 65 63 74 20 6d 65 73 73 61  for select messa
88e0: 67 65 20 64 69 67 65 73 74 73 2e 0a 20 2a 0a 20  ge digests.. *. 
88f0: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43  * Returns:. *.TC
8900: 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f  L_OK or TCL_ERRO
8910: 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  R. *. * Side eff
8920: 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 72 65  ects:. *.Sets re
8930: 73 75 6c 74 20 74 6f 20 6d 65 73 73 61 67 65 20  sult to message 
8940: 64 69 67 65 73 74 20 6f 72 20 65 72 72 6f 72 20  digest or error 
8950: 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d  message. *. *---
8960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
89a0: 0a 20 2a 2f 0a 20 23 64 65 66 69 6e 65 20 76 61  . */. #define va
89b0: 6c 69 64 61 74 65 5f 61 72 67 63 28 6f 62 6a 63  lidate_argc(objc
89c0: 2c 20 6f 62 6a 76 29 20 7b 20 5c 0a 20 20 20 20  , objv) { \.    
89d0: 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b  if (objc != 2) {
89e0: 20 5c 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d   \..Tcl_WrongNum
89f0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
8a00: 6f 62 6a 76 2c 20 22 64 61 74 61 22 29 3b 20 5c  objv, "data"); \
8a10: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
8a20: 4f 52 3b 20 5c 0a 20 20 20 20 7d 20 5c 0a 7d 0a  OR; \.    } \.}.
8a30: 20 0a 69 6e 74 20 44 69 67 65 73 74 4d 44 34 43   .int DigestMD4C
8a40: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  md(ClientData cl
8a50: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e  ientData, Tcl_In
8a60: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
8a70: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
8a80: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b  *const objv[]) {
8a90: 0a 20 20 20 20 76 61 6c 69 64 61 74 65 5f 61 72  .    validate_ar
8aa0: 67 63 28 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a  gc(objc, objv);.
8ab0: 20 20 20 20 72 65 74 75 72 6e 20 54 6c 73 5f 44      return Tls_D
8ac0: 69 67 65 73 74 44 61 74 61 28 69 6e 74 65 72 70  igestData(interp
8ad0: 2c 20 6f 62 6a 76 5b 31 5d 2c 20 45 56 50 5f 6d  , objv[1], EVP_m
8ae0: 64 34 28 29 2c 20 4e 55 4c 4c 2c 20 48 45 58 5f  d4(), NULL, HEX_
8af0: 46 4f 52 4d 41 54 20 7c 20 54 59 50 45 5f 4d 44  FORMAT | TYPE_MD
8b00: 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 69 6e 74 20  , NULL);.}..int 
8b10: 44 69 67 65 73 74 4d 44 35 43 6d 64 28 43 6c 69  DigestMD5Cmd(Cli
8b20: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
8b30: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
8b40: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
8b50: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
8b60: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 76   objv[]) {.    v
8b70: 61 6c 69 64 61 74 65 5f 61 72 67 63 28 6f 62 6a  alidate_argc(obj
8b80: 63 2c 20 6f 62 6a 76 29 3b 0a 20 20 20 20 72 65  c, objv);.    re
8b90: 74 75 72 6e 20 54 6c 73 5f 44 69 67 65 73 74 44  turn Tls_DigestD
8ba0: 61 74 61 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  ata(interp, objv
8bb0: 5b 31 5d 2c 20 45 56 50 5f 6d 64 35 28 29 2c 20  [1], EVP_md5(), 
8bc0: 4e 55 4c 4c 2c 20 48 45 58 5f 46 4f 52 4d 41 54  NULL, HEX_FORMAT
8bd0: 20 7c 20 54 59 50 45 5f 4d 44 2c 20 4e 55 4c 4c   | TYPE_MD, NULL
8be0: 29 3b 0a 7d 0a 0a 69 6e 74 20 44 69 67 65 73 74  );.}..int Digest
8bf0: 53 48 41 31 43 6d 64 28 43 6c 69 65 6e 74 44 61  SHA1Cmd(ClientDa
8c00: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
8c10: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
8c20: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
8c30: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
8c40: 5b 5d 29 20 7b 0a 20 20 20 20 76 61 6c 69 64 61  []) {.    valida
8c50: 74 65 5f 61 72 67 63 28 6f 62 6a 63 2c 20 6f 62  te_argc(objc, ob
8c60: 6a 76 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  jv);.    return 
8c70: 54 6c 73 5f 44 69 67 65 73 74 44 61 74 61 28 69  Tls_DigestData(i
8c80: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
8c90: 45 56 50 5f 73 68 61 31 28 29 2c 20 4e 55 4c 4c  EVP_sha1(), NULL
8ca0: 2c 20 48 45 58 5f 46 4f 52 4d 41 54 20 7c 20 54  , HEX_FORMAT | T
8cb0: 59 50 45 5f 4d 44 2c 20 4e 55 4c 4c 29 3b 0a 7d  YPE_MD, NULL);.}
8cc0: 0a 0a 69 6e 74 20 44 69 67 65 73 74 53 48 41 32  ..int DigestSHA2
8cd0: 35 36 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  56Cmd(ClientData
8ce0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
8cf0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
8d00: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
8d10: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
8d20: 29 20 7b 0a 20 20 20 20 76 61 6c 69 64 61 74 65  ) {.    validate
8d30: 5f 61 72 67 63 28 6f 62 6a 63 2c 20 6f 62 6a 76  _argc(objc, objv
8d40: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 6c  );.    return Tl
8d50: 73 5f 44 69 67 65 73 74 44 61 74 61 28 69 6e 74  s_DigestData(int
8d60: 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 45 56  erp, objv[1], EV
8d70: 50 5f 73 68 61 32 35 36 28 29 2c 20 4e 55 4c 4c  P_sha256(), NULL
8d80: 2c 20 48 45 58 5f 46 4f 52 4d 41 54 20 7c 20 54  , HEX_FORMAT | T
8d90: 59 50 45 5f 4d 44 2c 20 4e 55 4c 4c 29 3b 0a 7d  YPE_MD, NULL);.}
8da0: 0a 0a 69 6e 74 20 44 69 67 65 73 74 53 48 41 35  ..int DigestSHA5
8db0: 31 32 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  12Cmd(ClientData
8dc0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
8dd0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
8de0: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
8df0: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
8e00: 29 20 7b 0a 20 20 20 20 76 61 6c 69 64 61 74 65  ) {.    validate
8e10: 5f 61 72 67 63 28 6f 62 6a 63 2c 20 6f 62 6a 76  _argc(objc, objv
8e20: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 6c  );.    return Tl
8e30: 73 5f 44 69 67 65 73 74 44 61 74 61 28 69 6e 74  s_DigestData(int
8e40: 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 45 56  erp, objv[1], EV
8e50: 50 5f 73 68 61 35 31 32 28 29 2c 20 4e 55 4c 4c  P_sha512(), NULL
8e60: 2c 20 48 45 58 5f 46 4f 52 4d 41 54 20 7c 20 54  , HEX_FORMAT | T
8e70: 59 50 45 5f 4d 44 2c 20 4e 55 4c 4c 29 3b 0a 7d  YPE_MD, NULL);.}
8e80: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
8e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
8ed0: 20 54 6c 73 5f 44 69 67 65 73 74 43 6f 6d 6d 61   Tls_DigestComma
8ee0: 6e 64 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43 72 65  nds --. *. *.Cre
8ef0: 61 74 65 20 64 69 67 65 73 74 20 63 6f 6d 6d 61  ate digest comma
8f00: 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  nds. *. * Return
8f10: 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20  s:. *.TCL_OK or 
8f20: 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20  TCL_ERROR. *. * 
8f30: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
8f40: 09 43 72 65 61 74 65 73 20 63 6f 6d 6d 61 6e 64  .Creates command
8f50: 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  s. *. *---------
8f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69  ----------. */.i
8fa0: 6e 74 20 54 6c 73 5f 44 69 67 65 73 74 43 6f 6d  nt Tls_DigestCom
8fb0: 6d 61 6e 64 73 28 54 63 6c 5f 49 6e 74 65 72 70  mands(Tcl_Interp
8fc0: 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20   *interp) {.    
8fd0: 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
8fe0: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c  mand(interp, "tl
8ff0: 73 3a 3a 64 69 67 65 73 74 22 2c 20 44 69 67 65  s::digest", Dige
9000: 73 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e  stObjCmd, (Clien
9010: 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43  tData) 0, (Tcl_C
9020: 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
9030: 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43  NULL);.    Tcl_C
9040: 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
9050: 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 6d  interp, "tls::cm
9060: 61 63 22 2c 20 43 4d 41 43 4f 62 6a 43 6d 64 2c  ac", CMACObjCmd,
9070: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c   (ClientData) 0,
9080: 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
9090: 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
90a0: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
90b0: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
90c0: 74 6c 73 3a 3a 68 6d 61 63 22 2c 20 48 4d 41 43  tls::hmac", HMAC
90d0: 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44  ObjCmd, (ClientD
90e0: 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64  ata) 0, (Tcl_Cmd
90f0: 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
9100: 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65  LL);.    Tcl_Cre
9110: 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
9120: 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 64 34 22  terp, "tls::md4"
9130: 2c 20 44 69 67 65 73 74 4d 44 34 43 6d 64 2c 20  , DigestMD4Cmd, 
9140: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20  (ClientData) 0, 
9150: 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
9160: 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  oc *) NULL);.   
9170: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
9180: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74  mmand(interp, "t
9190: 6c 73 3a 3a 6d 64 35 22 2c 20 44 69 67 65 73 74  ls::md5", Digest
91a0: 4d 44 35 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44  MD5Cmd, (ClientD
91b0: 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64  ata) 0, (Tcl_Cmd
91c0: 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
91d0: 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65  LL);.    Tcl_Cre
91e0: 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
91f0: 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 68 61 31  terp, "tls::sha1
9200: 22 2c 20 44 69 67 65 73 74 53 48 41 31 43 6d 64  ", DigestSHA1Cmd
9210: 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30  , (ClientData) 0
9220: 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
9230: 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Proc *) NULL);. 
9240: 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
9250: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
9260: 22 74 6c 73 3a 3a 73 68 61 32 35 36 22 2c 20 44  "tls::sha256", D
9270: 69 67 65 73 74 53 48 41 32 35 36 43 6d 64 2c 20  igestSHA256Cmd, 
9280: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20  (ClientData) 0, 
9290: 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
92a0: 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  oc *) NULL);.   
92b0: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
92c0: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74  mmand(interp, "t
92d0: 6c 73 3a 3a 73 68 61 35 31 32 22 2c 20 44 69 67  ls::sha512", Dig
92e0: 65 73 74 53 48 41 35 31 32 43 6d 64 2c 20 28 43  estSHA512Cmd, (C
92f0: 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54  lientData) 0, (T
9300: 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
9310: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
9320: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
9330: 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  and(interp, "tls
9340: 3a 3a 75 6e 73 74 61 63 6b 22 2c 20 55 6e 73 74  ::unstack", Unst
9350: 61 63 6b 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65  ackObjCmd, (Clie
9360: 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f  ntData) 0, (Tcl_
9370: 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
9380: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 72 65 74 75   NULL);.    retu
9390: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a        rn TCL_OK;.}..