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 4d 65  o calculate a Me
0070: 73 73 61 67 65 20 44 69 67 65 73 74 20 28 4d 44  ssage Digest (MD
0080: 29 20 6f 72 20 61 20 4d 65 73 73 61 67 65 0a 20  ) or a Message. 
0090: 2a 20 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e  * Authentication
00a0: 20 43 6f 64 65 20 28 4d 41 43 29 2e 0a 20 2a 0a   Code (MAC).. *.
00b0: 20 2a 20 43 6f 70 79 72 69 67 68 74 20 28 43 29   * Copyright (C)
00c0: 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48 61   2023 Brian O'Ha
00d0: 67 61 6e 0a 20 2a 0a 20 2a 2f 0a 0a 23 69 6e 63  gan. *. */..#inc
00e0: 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68 22 0a  lude "tlsInt.h".
00f0: 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 4f 70 74  #include "tclOpt
0100: 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 74  s.h".#include <t
0110: 63 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  cl.h>.#include <
0120: 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64  stdio.h>.#includ
0130: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e  e <string.h>.#in
0140: 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 65  clude <openssl/e
0150: 76 70 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  vp.h>.#include <
0160: 6f 70 65 6e 73 73 6c 2f 63 6d 61 63 2e 68 3e 0a  openssl/cmac.h>.
0170: 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73  #include <openss
0180: 6c 2f 68 6d 61 63 2e 68 3e 0a 0a 2f 2a 20 43 6f  l/hmac.h>../* Co
0190: 6e 73 74 61 6e 74 73 20 2a 2f 0a 63 6f 6e 73 74  nstants */.const
01a0: 20 63 68 61 72 20 2a 68 65 78 20 3d 20 22 30 31   char *hex = "01
01b0: 32 33 34 35 36 37 38 39 61 62 63 64 65 66 22 3b  23456789abcdef";
01c0: 0a 0a 2f 2a 20 4d 61 63 72 6f 73 20 2a 2f 0a 23  ../* Macros */.#
01d0: 64 65 66 69 6e 65 20 42 55 46 46 45 52 5f 53 49  define BUFFER_SI
01e0: 5a 45 09 36 35 35 33 36 0a 23 64 65 66 69 6e 65  ZE.65536.#define
01f0: 20 43 48 41 4e 5f 45 4f 46 09 30 78 31 30 0a 23   CHAN_EOF.0x10.#
0200: 64 65 66 69 6e 65 20 52 45 41 44 5f 44 45 4c 41  define READ_DELA
0210: 59 09 35 0a 0a 2f 2a 20 44 69 67 65 73 74 20 66  Y.5../* Digest f
0220: 6f 72 6d 61 74 20 28 62 69 74 73 20 30 2d 33 29  ormat (bits 0-3)
0230: 20 61 6e 64 20 6f 70 65 72 61 74 69 6f 6e 20 28   and operation (
0240: 62 69 74 73 20 34 2d 37 29 20 2a 2f 0a 23 64 65  bits 4-7) */.#de
0250: 66 69 6e 65 20 42 49 4e 5f 46 4f 52 4d 41 54 09  fine BIN_FORMAT.
0260: 30 78 30 31 0a 23 64 65 66 69 6e 65 20 48 45 58  0x01.#define HEX
0270: 5f 46 4f 52 4d 41 54 09 30 78 30 32 0a 2f 2a 23  _FORMAT.0x02./*#
0280: 64 65 66 69 6e 65 20 42 36 34 5f 46 4f 52 4d 41  define B64_FORMA
0290: 54 09 30 78 30 34 2a 2f 0a 23 64 65 66 69 6e 65  T.0x04*/.#define
02a0: 20 49 53 5f 58 4f 46 09 09 30 78 30 38 0a 23 64   IS_XOF..0x08.#d
02b0: 65 66 69 6e 65 20 54 59 50 45 5f 4d 44 09 09 30  efine TYPE_MD..0
02c0: 78 31 30 0a 23 64 65 66 69 6e 65 20 54 59 50 45  x10.#define TYPE
02d0: 5f 48 4d 41 43 09 30 78 32 30 0a 23 64 65 66 69  _HMAC.0x20.#defi
02e0: 6e 65 20 54 59 50 45 5f 43 4d 41 43 09 30 78 34  ne TYPE_CMAC.0x4
02f0: 30 0a 23 64 65 66 69 6e 65 20 54 59 50 45 5f 4d  0.#define TYPE_M
0300: 41 43 09 30 78 38 30 0a 0a 2f 2a 2a 2a 2a 2a 2a  AC.0x80../******
0310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
0350: 2f 2a 0a 20 2a 20 54 68 69 73 20 73 74 72 75 63  /*. * This struc
0360: 74 75 72 65 20 64 65 66 69 6e 65 73 20 74 68 65  ture defines the
0370: 20 70 65 72 2d 69 6e 73 74 61 6e 63 65 20 73 74   per-instance st
0380: 61 74 65 20 6f 66 20 61 20 64 69 67 65 73 74 20  ate of a digest 
0390: 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 2a 2f 0a 74  operation.. */.t
03a0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 44 69  ypedef struct Di
03b0: 67 65 73 74 53 74 61 74 65 20 7b 0a 09 54 63 6c  gestState {..Tcl
03c0: 5f 43 68 61 6e 6e 65 6c 20 73 65 6c 66 3b 09 2f  _Channel self;./
03d0: 2a 20 54 68 69 73 20 73 6f 63 6b 65 74 20 63 68  * This socket ch
03e0: 61 6e 6e 65 6c 20 2a 2f 0a 09 54 63 6c 5f 54 69  annel */..Tcl_Ti
03f0: 6d 65 72 54 6f 6b 65 6e 20 74 69 6d 65 72 3b 09  merToken timer;.
0400: 2f 2a 20 54 69 6d 65 72 20 66 6f 72 20 72 65 61  /* Timer for rea
0410: 64 20 65 76 65 6e 74 73 20 2a 2f 0a 0a 09 69 6e  d events */...in
0420: 74 20 66 6c 61 67 73 3b 09 09 2f 2a 20 43 68 61  t flags;../* Cha
0430: 6e 20 63 6f 6e 66 69 67 20 66 6c 61 67 73 20 2a  n config flags *
0440: 2f 0a 09 69 6e 74 20 77 61 74 63 68 4d 61 73 6b  /..int watchMask
0450: 3b 09 09 2f 2a 20 43 75 72 72 65 6e 74 20 57 61  ;../* Current Wa
0460: 74 63 68 50 72 6f 63 20 6d 61 73 6b 20 2a 2f 0a  tchProc mask */.
0470: 09 69 6e 74 20 6d 6f 64 65 3b 09 09 2f 2a 20 43  .int mode;../* C
0480: 75 72 72 65 6e 74 20 6d 6f 64 65 20 6f 66 20 70  urrent mode of p
0490: 61 72 65 6e 74 20 63 68 61 6e 6e 65 6c 20 2a 2f  arent channel */
04a0: 0a 09 69 6e 74 20 66 6f 72 6d 61 74 3b 09 09 2f  ..int format;../
04b0: 2a 20 44 69 67 65 73 74 20 66 6f 72 6d 61 74 20  * Digest format 
04c0: 61 6e 64 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  and operation */
04d0: 0a 09 69 6e 74 20 6c 65 6e 67 74 68 3b 09 09 2f  ..int length;../
04e0: 2a 20 44 69 67 65 73 74 20 6c 65 6e 67 74 68 20  * Digest length 
04f0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 09 54 63  in bytes */...Tc
0500: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
0510: 3b 09 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 74  ;./* Current int
0520: 65 72 70 72 65 74 65 72 20 2a 2f 0a 09 45 56 50  erpreter */..EVP
0530: 5f 4d 44 5f 43 54 58 20 2a 63 74 78 3b 09 2f 2a  _MD_CTX *ctx;./*
0540: 20 4d 44 20 43 6f 6e 74 65 78 74 20 2a 2f 0a 09   MD Context */..
0550: 48 4d 41 43 5f 43 54 58 20 2a 68 63 74 78 3b 09  HMAC_CTX *hctx;.
0560: 09 2f 2a 20 48 4d 41 43 20 63 6f 6e 74 65 78 74  ./* HMAC context
0570: 20 2a 2f 0a 09 43 4d 41 43 5f 43 54 58 20 2a 63   */..CMAC_CTX *c
0580: 63 74 78 3b 09 09 2f 2a 20 43 4d 41 43 20 63 6f  ctx;../* CMAC co
0590: 6e 74 65 78 74 20 2a 2f 0a 09 54 63 6c 5f 43 6f  ntext */..Tcl_Co
05a0: 6d 6d 61 6e 64 20 74 6f 6b 65 6e 3b 09 2f 2a 20  mmand token;./* 
05b0: 43 6f 6d 6d 61 6e 64 20 74 6f 6b 65 6e 20 2a 2f  Command token */
05c0: 0a 7d 20 44 69 67 65 73 74 53 74 61 74 65 3b 0a  .} DigestState;.
05d0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
05e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
0620: 44 69 67 65 73 74 53 74 61 74 65 4e 65 77 20 2d  DigestStateNew -
0630: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e  -. *. *.This fun
0640: 63 74 69 6f 6e 20 63 72 65 61 74 65 73 20 61 20  ction creates a 
0650: 70 65 72 2d 69 6e 73 74 61 6e 63 65 20 73 74 61  per-instance sta
0660: 74 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  te data structur
0670: 65 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a  e. *. * Returns:
0680: 0a 20 2a 09 44 69 67 65 73 74 20 73 74 72 75 63  . *.Digest struc
0690: 74 75 72 65 20 70 6f 69 6e 74 65 72 0a 20 2a 0a  ture pointer. *.
06a0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
06b0: 0a 20 2a 09 43 72 65 61 74 65 73 20 73 74 72 75  . *.Creates stru
06c0: 63 74 75 72 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  cture. *. *-----
06d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
0710: 2a 2f 0a 44 69 67 65 73 74 53 74 61 74 65 20 2a  */.DigestState *
0720: 44 69 67 65 73 74 53 74 61 74 65 4e 65 77 28 54  DigestStateNew(T
0730: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
0740: 70 2c 20 69 6e 74 20 66 6f 72 6d 61 74 2c 20 69  p, int format, i
0750: 6e 74 20 6c 65 6e 67 74 68 29 20 7b 0a 20 20 20  nt length) {.   
0760: 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74   DigestState *st
0770: 61 74 65 50 74 72 3b 0a 0a 20 20 20 20 73 74 61  atePtr;..    sta
0780: 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53  tePtr = (DigestS
0790: 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 28  tate *) ckalloc(
07a0: 28 75 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 6f  (unsigned) sizeo
07b0: 66 28 44 69 67 65 73 74 53 74 61 74 65 29 29 3b  f(DigestState));
07c0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
07d0: 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6d 65  r != NULL) {..me
07e0: 6d 73 65 74 28 73 74 61 74 65 50 74 72 2c 20 30  mset(statePtr, 0
07f0: 2c 20 73 69 7a 65 6f 66 28 44 69 67 65 73 74 53  , sizeof(DigestS
0800: 74 61 74 65 29 29 3b 0a 09 73 74 61 74 65 50 74  tate));..statePt
0810: 72 2d 3e 73 65 6c 66 09 3d 20 4e 55 4c 4c 3b 09  r->self.= NULL;.
0820: 09 2f 2a 20 54 68 69 73 20 73 6f 63 6b 65 74 20  ./* This socket 
0830: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 09 73 74 61 74  channel */..stat
0840: 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55  ePtr->timer = NU
0850: 4c 4c 3b 09 09 2f 2a 20 54 69 6d 65 72 20 74 6f  LL;../* Timer to
0860: 20 66 6c 75 73 68 20 64 61 74 61 20 2a 2f 0a 09   flush data */..
0870: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20  statePtr->flags 
0880: 3d 20 30 3b 09 09 2f 2a 20 43 68 61 6e 20 63 6f  = 0;../* Chan co
0890: 6e 66 69 67 20 66 6c 61 67 73 20 2a 2f 0a 09 73  nfig flags */..s
08a0: 74 61 74 65 50 74 72 2d 3e 77 61 74 63 68 4d 61  tatePtr->watchMa
08b0: 73 6b 20 3d 20 30 3b 09 2f 2a 20 43 75 72 72 65  sk = 0;./* Curre
08c0: 6e 74 20 57 61 74 63 68 50 72 6f 63 20 6d 61 73  nt WatchProc mas
08d0: 6b 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e  k */..statePtr->
08e0: 6d 6f 64 65 09 3d 20 30 3b 09 09 2f 2a 20 43 75  mode.= 0;../* Cu
08f0: 72 72 65 6e 74 20 6d 6f 64 65 20 6f 66 20 70 61  rrent mode of pa
0900: 72 65 6e 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  rent channel */.
0910: 09 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61  .statePtr->forma
0920: 74 20 3d 20 66 6f 72 6d 61 74 3b 09 2f 2a 20 44  t = format;./* D
0930: 69 67 65 73 74 20 66 6f 72 6d 61 74 20 61 6e 64  igest format and
0940: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 09 73   operation */..s
0950: 74 61 74 65 50 74 72 2d 3e 6c 65 6e 67 74 68 20  tatePtr->length 
0960: 3d 20 6c 65 6e 67 74 68 3b 09 2f 2a 20 44 69 67  = length;./* Dig
0970: 65 73 74 20 6c 65 6e 67 74 68 20 69 6e 20 62 79  est length in by
0980: 74 65 73 20 2a 2f 0a 09 73 74 61 74 65 50 74 72  tes */..statePtr
0990: 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
09a0: 70 3b 09 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e  p;./* Current in
09b0: 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 09 73 74  terpreter */..st
09c0: 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 4e 55  atePtr->ctx = NU
09d0: 4c 4c 3b 09 09 2f 2a 20 4d 44 20 43 6f 6e 74 65  LL;../* MD Conte
09e0: 78 74 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d  xt */..statePtr-
09f0: 3e 68 63 74 78 20 3d 20 4e 55 4c 4c 3b 09 09 2f  >hctx = NULL;../
0a00: 2a 20 48 4d 41 43 20 43 6f 6e 74 65 78 74 20 2a  * HMAC Context *
0a10: 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 63 74  /..statePtr->cct
0a20: 78 20 3d 20 4e 55 4c 4c 3b 09 09 2f 2a 20 43 4d  x = NULL;../* CM
0a30: 41 43 20 43 6f 6e 74 65 78 74 20 2a 2f 0a 09 73  AC Context */..s
0a40: 74 61 74 65 50 74 72 2d 3e 74 6f 6b 65 6e 20 3d  tatePtr->token =
0a50: 20 4e 55 4c 4c 3b 09 09 2f 2a 20 43 6f 6d 6d 61   NULL;../* Comma
0a60: 6e 64 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20  nd token */.    
0a70: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 73 74 61  }.    return sta
0a80: 74 65 50 74 72 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d  tePtr;.}../*. *-
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ad0: 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 53  --. *. * DigestS
0ae0: 74 61 74 65 46 72 65 65 20 2d 2d 0a 20 2a 0a 20  tateFree --. *. 
0af0: 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  *.This function 
0b00: 64 65 6c 65 74 65 73 20 61 20 64 69 67 65 73 74  deletes a digest
0b10: 20 73 74 61 74 65 20 73 74 72 75 63 74 75 72 65   state structure
0b20: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a  . *. * Returns:.
0b30: 20 2a 09 4e 6f 74 68 69 6e 67 0a 20 2a 0a 20 2a   *.Nothing. *. *
0b40: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
0b50: 2a 09 52 65 6d 6f 76 65 73 20 73 74 72 75 63 74  *.Removes struct
0b60: 75 72 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ure. *. *-------
0b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
0bb0: 0a 76 6f 69 64 20 44 69 67 65 73 74 53 74 61 74  .void DigestStat
0bc0: 65 46 72 65 65 28 44 69 67 65 73 74 53 74 61 74  eFree(DigestStat
0bd0: 65 20 2a 73 74 61 74 65 50 74 72 29 20 7b 0a 20  e *statePtr) {. 
0be0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 20     if (statePtr 
0bf0: 3d 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20  == (DigestState 
0c00: 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  *) NULL) {..retu
0c10: 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rn;.    }..    /
0c20: 2a 20 52 65 6d 6f 76 65 20 70 65 6e 64 69 6e 67  * Remove pending
0c30: 20 74 69 6d 65 72 20 2a 2f 0a 20 20 20 20 69 66   timer */.    if
0c40: 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65   (statePtr->time
0c50: 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54  r != (Tcl_TimerT
0c60: 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54  oken) NULL) {..T
0c70: 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61  cl_DeleteTimerHa
0c80: 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e  ndler(statePtr->
0c90: 74 69 6d 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20  timer);.    }.. 
0ca0: 20 20 20 2f 2a 20 46 72 65 65 20 63 6f 6e 74 65     /* Free conte
0cb0: 78 74 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f  xt structures */
0cc0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
0cd0: 72 2d 3e 63 74 78 20 21 3d 20 28 45 56 50 5f 4d  r->ctx != (EVP_M
0ce0: 44 5f 43 54 58 20 2a 29 20 4e 55 4c 4c 29 20 7b  D_CTX *) NULL) {
0cf0: 0a 09 45 56 50 5f 4d 44 5f 43 54 58 5f 66 72 65  ..EVP_MD_CTX_fre
0d00: 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29  e(statePtr->ctx)
0d10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
0d20: 73 74 61 74 65 50 74 72 2d 3e 68 63 74 78 20 21  statePtr->hctx !
0d30: 3d 20 28 48 4d 41 43 5f 43 54 58 20 2a 29 20 4e  = (HMAC_CTX *) N
0d40: 55 4c 4c 29 20 7b 0a 09 48 4d 41 43 5f 43 54 58  ULL) {..HMAC_CTX
0d50: 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e  _free(statePtr->
0d60: 68 63 74 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hctx);.    }.   
0d70: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63   if (statePtr->c
0d80: 63 74 78 20 21 3d 20 28 43 4d 41 43 5f 43 54 58  ctx != (CMAC_CTX
0d90: 20 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 43 4d 41   *) NULL) {..CMA
0da0: 43 5f 43 54 58 5f 66 72 65 65 28 73 74 61 74 65  C_CTX_free(state
0db0: 50 74 72 2d 3e 63 63 74 78 29 3b 0a 20 20 20 20  Ptr->cctx);.    
0dc0: 7d 0a 20 20 20 20 63 6b 66 72 65 65 28 73 74 61  }.    ckfree(sta
0dd0: 74 65 50 74 72 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a  tePtr);.}../****
0de0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0df0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0e00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0e10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
0e20: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
0e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
0e70: 20 44 69 67 65 73 74 49 6e 69 74 69 61 6c 69 7a   DigestInitializ
0e80: 65 20 2d 2d 0a 20 2a 0a 20 2a 09 49 6e 69 74 69  e --. *. *.Initi
0e90: 61 6c 69 7a 65 20 61 20 68 61 73 68 20 66 75 6e  alize a hash fun
0ea0: 63 74 69 6f 6e 0a 20 2a 0a 20 2a 20 52 65 74 75  ction. *. * Retu
0eb0: 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 69  rns:. *.TCL_OK i
0ec0: 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20  f successful or 
0ed0: 54 43 4c 5f 45 52 52 4f 52 20 66 6f 72 20 66 61  TCL_ERROR for fa
0ee0: 69 6c 75 72 65 20 77 69 74 68 20 72 65 73 75 6c  ilure with resul
0ef0: 74 20 73 65 74 0a 20 2a 09 74 6f 20 65 72 72 6f  t set. *.to erro
0f00: 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a  r message.. *. *
0f10: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
0f20: 2a 09 4e 6f 20 72 65 73 75 6c 74 20 6f 72 20 65  *.No result or e
0f30: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a  rror message. *.
0f40: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
0f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f80: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69  -----. */.int Di
0f90: 67 65 73 74 49 6e 69 74 69 61 6c 69 7a 65 28 54  gestInitialize(T
0fa0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
0fb0: 70 2c 20 44 69 67 65 73 74 53 74 61 74 65 20 2a  p, DigestState *
0fc0: 73 74 61 74 65 50 74 72 2c 20 54 63 6c 5f 4f 62  statePtr, Tcl_Ob
0fd0: 6a 20 2a 64 69 67 65 73 74 4f 62 6a 2c 0a 09 54  j *digestObj,..T
0fe0: 63 6c 5f 4f 62 6a 20 2a 63 69 70 68 65 72 4f 62  cl_Obj *cipherOb
0ff0: 6a 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4f  j, Tcl_Obj *keyO
1000: 62 6a 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6d 61 63  bj, Tcl_Obj *mac
1010: 4f 62 6a 29 20 7b 0a 20 20 20 20 69 6e 74 20 72  Obj) {.    int r
1020: 65 73 20 3d 20 30 2c 20 74 79 70 65 20 3d 20 73  es = 0, type = s
1030: 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20  tatePtr->format 
1040: 26 20 30 78 46 46 30 3b 0a 20 20 20 20 63 6f 6e  & 0xFF0;.    con
1050: 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 20 3d 20  st EVP_MD *md = 
1060: 4e 55 4c 4c 3b 0a 20 20 20 20 63 6f 6e 73 74 20  NULL;.    const 
1070: 45 56 50 5f 43 49 50 48 45 52 20 2a 63 69 70 68  EVP_CIPHER *ciph
1080: 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63  er = NULL;.    c
1090: 6f 6e 73 74 20 76 6f 69 64 20 2a 6b 65 79 20 3d  onst void *key =
10a0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 53   NULL;.    Tcl_S
10b0: 69 7a 65 20 6b 65 79 5f 6c 65 6e 20 3d 20 30 3b  ize key_len = 0;
10c0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
10d0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a  alled");..    /*
10e0: 20 47 65 74 20 64 69 67 65 73 74 20 2a 2f 0a 20   Get digest */. 
10f0: 20 20 20 69 66 20 28 74 79 70 65 20 21 3d 20 54     if (type != T
1100: 59 50 45 5f 43 4d 41 43 29 20 7b 0a 09 6d 64 20  YPE_CMAC) {..md 
1110: 3d 20 55 74 69 6c 5f 47 65 74 44 69 67 65 73 74  = Util_GetDigest
1120: 28 69 6e 74 65 72 70 2c 20 64 69 67 65 73 74 4f  (interp, digestO
1130: 62 6a 2c 20 74 79 70 65 20 21 3d 20 54 59 50 45  bj, type != TYPE
1140: 5f 43 4d 41 43 29 3b 0a 09 69 66 20 28 6d 64 20  _CMAC);..if (md 
1150: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  != NULL) {..    
1160: 2f 2a 20 49 73 20 58 4f 46 20 2a 2f 0a 09 20 20  /* Is XOF */..  
1170: 20 20 69 66 20 28 45 56 50 5f 4d 44 5f 66 6c 61    if (EVP_MD_fla
1180: 67 73 28 6d 64 29 20 26 20 45 56 50 5f 4d 44 5f  gs(md) & EVP_MD_
1190: 46 4c 41 47 5f 58 4f 46 29 20 7b 0a 09 09 73 74  FLAG_XOF) {...st
11a0: 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 3d  atePtr->format =
11b0: 20 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61   statePtr->forma
11c0: 74 20 7c 20 49 53 5f 58 4f 46 3b 0a 09 20 20 20  t | IS_XOF;..   
11d0: 20 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20   }..} else {..  
11e0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
11f0: 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  OR;..}.    }..  
1200: 20 20 2f 2a 20 47 65 74 20 63 69 70 68 65 72 20    /* Get cipher 
1210: 2a 2f 0a 20 20 20 20 69 66 20 28 74 79 70 65 20  */.    if (type 
1220: 3d 3d 20 54 59 50 45 5f 43 4d 41 43 29 20 7b 0a  == TYPE_CMAC) {.
1230: 09 63 69 70 68 65 72 20 3d 20 55 74 69 6c 5f 47  .cipher = Util_G
1240: 65 74 43 69 70 68 65 72 28 69 6e 74 65 72 70 2c  etCipher(interp,
1250: 20 63 69 70 68 65 72 4f 62 6a 2c 20 74 79 70 65   cipherObj, type
1260: 20 3d 3d 20 54 59 50 45 5f 43 4d 41 43 29 3b 0a   == TYPE_CMAC);.
1270: 09 69 66 20 28 63 69 70 68 65 72 20 3d 3d 20 4e  .if (cipher == N
1280: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 72 65 74 75  ULL) {..    retu
1290: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
12a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
12b0: 65 74 20 6b 65 79 20 2a 2f 0a 20 20 20 20 69 66  et key */.    if
12c0: 20 28 74 79 70 65 20 21 3d 20 54 59 50 45 5f 4d   (type != TYPE_M
12d0: 44 29 20 7b 0a 09 6b 65 79 20 3d 20 28 63 6f 6e  D) {..key = (con
12e0: 73 74 20 76 6f 69 64 20 2a 29 20 55 74 69 6c 5f  st void *) Util_
12f0: 47 65 74 4b 65 79 28 69 6e 74 65 72 70 2c 20 6b  GetKey(interp, k
1300: 65 79 4f 62 6a 2c 20 26 6b 65 79 5f 6c 65 6e 2c  eyObj, &key_len,
1310: 20 22 6b 65 79 22 2c 20 30 2c 20 74 79 70 65 20   "key", 0, type 
1320: 21 3d 20 54 59 50 45 5f 4d 44 29 3b 0a 09 69 66  != TYPE_MD);..if
1330: 20 28 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b   (key == NULL) {
1340: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
1350: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d  _ERROR;..}.    }
1360: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
1370: 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 20 20  contexts */.    
1380: 73 77 69 74 63 68 28 74 79 70 65 29 20 7b 0a 20  switch(type) {. 
1390: 20 20 20 63 61 73 65 20 54 59 50 45 5f 4d 44 3a     case TYPE_MD:
13a0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20  ..statePtr->ctx 
13b0: 3d 20 45 56 50 5f 4d 44 5f 43 54 58 5f 6e 65 77  = EVP_MD_CTX_new
13c0: 28 29 3b 0a 09 72 65 73 20 3d 20 28 73 74 61 74  ();..res = (stat
13d0: 65 50 74 72 2d 3e 63 74 78 20 21 3d 20 4e 55 4c  ePtr->ctx != NUL
13e0: 4c 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  L);..break;.    
13f0: 63 61 73 65 20 54 59 50 45 5f 48 4d 41 43 3a 0a  case TYPE_HMAC:.
1400: 09 73 74 61 74 65 50 74 72 2d 3e 68 63 74 78 20  .statePtr->hctx 
1410: 3d 20 48 4d 41 43 5f 43 54 58 5f 6e 65 77 28 29  = HMAC_CTX_new()
1420: 3b 0a 09 72 65 73 20 3d 20 28 73 74 61 74 65 50  ;..res = (stateP
1430: 74 72 2d 3e 68 63 74 78 20 21 3d 20 4e 55 4c 4c  tr->hctx != NULL
1440: 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63  );..break;.    c
1450: 61 73 65 20 54 59 50 45 5f 43 4d 41 43 3a 0a 09  ase TYPE_CMAC:..
1460: 73 74 61 74 65 50 74 72 2d 3e 63 63 74 78 20 3d  statePtr->cctx =
1470: 20 43 4d 41 43 5f 43 54 58 5f 6e 65 77 28 29 3b   CMAC_CTX_new();
1480: 0a 09 72 65 73 20 3d 20 28 73 74 61 74 65 50 74  ..res = (statePt
1490: 72 2d 3e 63 63 74 78 20 21 3d 20 4e 55 4c 4c 29  r->cctx != NULL)
14a0: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a  ;..break;.    }.
14b0: 0a 20 20 20 20 69 66 20 28 21 72 65 73 29 20 7b  .    if (!res) {
14c0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
14d0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 72 65 61  lt(interp, "Crea
14e0: 74 65 20 63 6f 6e 74 65 78 74 20 66 61 69 6c 65  te context faile
14f0: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  d", (char *) NUL
1500: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  L);..return TCL_
1510: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
1520: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
1530: 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  hash function */
1540: 0a 20 20 20 20 73 77 69 74 63 68 28 74 79 70 65  .    switch(type
1550: 29 20 7b 0a 20 20 20 20 63 61 73 65 20 54 59 50  ) {.    case TYP
1560: 45 5f 4d 44 3a 0a 09 72 65 73 20 3d 20 45 56 50  E_MD:..res = EVP
1570: 5f 44 69 67 65 73 74 49 6e 69 74 5f 65 78 28 73  _DigestInit_ex(s
1580: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 6d 64  tatePtr->ctx, md
1590: 2c 20 4e 55 4c 4c 29 3b 0a 09 62 72 65 61 6b 3b  , NULL);..break;
15a0: 0a 20 20 20 20 63 61 73 65 20 54 59 50 45 5f 48  .    case TYPE_H
15b0: 4d 41 43 3a 0a 09 72 65 73 20 3d 20 48 4d 41 43  MAC:..res = HMAC
15c0: 5f 49 6e 69 74 5f 65 78 28 73 74 61 74 65 50 74  _Init_ex(statePt
15d0: 72 2d 3e 68 63 74 78 2c 20 6b 65 79 2c 20 28 69  r->hctx, key, (i
15e0: 6e 74 29 20 6b 65 79 5f 6c 65 6e 2c 20 6d 64 2c  nt) key_len, md,
15f0: 20 4e 55 4c 4c 29 3b 0a 09 62 72 65 61 6b 3b 0a   NULL);..break;.
1600: 20 20 20 20 63 61 73 65 20 54 59 50 45 5f 43 4d      case TYPE_CM
1610: 41 43 3a 0a 09 72 65 73 20 3d 20 43 4d 41 43 5f  AC:..res = CMAC_
1620: 49 6e 69 74 28 73 74 61 74 65 50 74 72 2d 3e 63  Init(statePtr->c
1630: 63 74 78 2c 20 6b 65 79 2c 20 28 69 6e 74 29 20  ctx, key, (int) 
1640: 6b 65 79 5f 6c 65 6e 2c 20 63 69 70 68 65 72 2c  key_len, cipher,
1650: 20 4e 55 4c 4c 29 3b 0a 09 62 72 65 61 6b 3b 0a   NULL);..break;.
1660: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 21      }..    if (!
1670: 72 65 73 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  res) {..Tcl_Appe
1680: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1690: 20 22 49 6e 69 74 69 61 6c 69 7a 65 20 66 61 69   "Initialize fai
16a0: 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f  led: ", GET_ERR_
16b0: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
16c0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
16d0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
16e0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43   }.    return TC
16f0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d  L_OK;.}../*. *--
1700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 55 70  -. *. * DigestUp
1750: 64 61 74 65 20 2d 2d 0a 20 2a 0a 20 2a 09 55 70  date --. *. *.Up
1760: 64 61 74 65 20 61 20 68 61 73 68 20 66 75 6e 63  date a hash func
1770: 74 69 6f 6e 20 77 69 74 68 20 64 61 74 61 0a 20  tion with data. 
1780: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a  *. * Returns:. *
1790: 09 54 43 4c 5f 4f 4b 20 69 66 20 73 75 63 63 65  .TCL_OK if succe
17a0: 73 73 66 75 6c 20 6f 72 20 54 43 4c 5f 45 52 52  ssful or TCL_ERR
17b0: 4f 52 20 66 6f 72 20 66 61 69 6c 75 72 65 20 77  OR for failure w
17c0: 69 74 68 20 72 65 73 75 6c 74 20 73 65 74 0a 20  ith result set. 
17d0: 2a 09 74 6f 20 65 72 72 6f 72 20 6d 65 73 73 61  *.to error messa
17e0: 67 65 20 69 66 20 64 6f 5f 72 65 73 75 6c 74 20  ge if do_result 
17f0: 69 73 20 74 72 75 65 2e 0a 20 2a 0a 20 2a 20 53  is true.. *. * S
1800: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
1810: 41 64 64 73 20 62 75 66 20 64 61 74 61 20 74 6f  Adds buf data to
1820: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 6f   hash function o
1830: 72 20 73 65 74 73 20 72 65 73 75 6c 74 20 74 6f  r sets result to
1840: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20   error message. 
1850: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
1860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1890: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20  -------. */.int 
18a0: 44 69 67 65 73 74 55 70 64 61 74 65 28 44 69 67  DigestUpdate(Dig
18b0: 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50  estState *stateP
18c0: 74 72 2c 20 63 68 61 72 20 2a 62 75 66 2c 20 54  tr, char *buf, T
18d0: 63 6c 5f 53 69 7a 65 20 72 65 61 64 2c 20 69 6e  cl_Size read, in
18e0: 74 20 64 6f 5f 72 65 73 75 6c 74 29 20 7b 0a 20  t do_result) {. 
18f0: 20 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a     int res = 0;.
1900: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
1910: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20  lled");..    /* 
1920: 55 70 64 61 74 65 20 68 61 73 68 20 66 75 6e 63  Update hash func
1930: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 77 69 74  tion */.    swit
1940: 63 68 28 73 74 61 74 65 50 74 72 2d 3e 66 6f 72  ch(statePtr->for
1950: 6d 61 74 20 26 20 30 78 46 46 30 29 20 7b 0a 20  mat & 0xFF0) {. 
1960: 20 20 20 63 61 73 65 20 54 59 50 45 5f 4d 44 3a     case TYPE_MD:
1970: 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 45  .        res = E
1980: 56 50 5f 44 69 67 65 73 74 55 70 64 61 74 65 28  VP_DigestUpdate(
1990: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 62  statePtr->ctx, b
19a0: 75 66 2c 20 28 73 69 7a 65 5f 74 29 20 72 65 61  uf, (size_t) rea
19b0: 64 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  d);..break;.    
19c0: 63 61 73 65 20 54 59 50 45 5f 48 4d 41 43 3a 0a  case TYPE_HMAC:.
19d0: 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 48 4d          res = HM
19e0: 41 43 5f 55 70 64 61 74 65 28 73 74 61 74 65 50  AC_Update(stateP
19f0: 74 72 2d 3e 68 63 74 78 2c 20 28 63 6f 6e 73 74  tr->hctx, (const
1a00: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1a10: 29 20 62 75 66 2c 20 28 73 69 7a 65 5f 74 29 20  ) buf, (size_t) 
1a20: 72 65 61 64 29 3b 0a 09 62 72 65 61 6b 3b 0a 20  read);..break;. 
1a30: 20 20 20 63 61 73 65 20 54 59 50 45 5f 43 4d 41     case TYPE_CMA
1a40: 43 3a 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d  C:.        res =
1a50: 20 43 4d 41 43 5f 55 70 64 61 74 65 28 73 74 61   CMAC_Update(sta
1a60: 74 65 50 74 72 2d 3e 63 63 74 78 2c 20 62 75 66  tePtr->cctx, buf
1a70: 2c 20 28 73 69 7a 65 5f 74 29 20 72 65 61 64 29  , (size_t) read)
1a80: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a  ;..break;.    }.
1a90: 0a 20 20 20 20 69 66 20 28 21 72 65 73 20 26 26  .    if (!res &&
1aa0: 20 64 6f 5f 72 65 73 75 6c 74 29 20 7b 0a 09 54   do_result) {..T
1ab0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1ac0: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
1ad0: 2c 20 22 55 70 64 61 74 65 20 66 61 69 6c 65 64  , "Update failed
1ae0: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41  : ", GET_ERR_REA
1af0: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
1b00: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
1b10: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
1b20: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
1b30: 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  K;.}../*. *-----
1b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
1b80: 2a 0a 20 2a 20 44 69 67 65 73 74 46 69 6e 61 6c  *. * DigestFinal
1b90: 69 7a 65 20 2d 2d 0a 20 2a 0a 20 2a 09 46 69 6e  ize --. *. *.Fin
1ba0: 61 6c 69 7a 65 20 61 20 68 61 73 68 20 66 75 6e  alize a hash fun
1bb0: 63 74 69 6f 6e 20 61 6e 64 20 72 65 74 75 72 6e  ction and return
1bc0: 20 74 68 65 20 6d 65 73 73 61 67 65 20 64 69 67   the message dig
1bd0: 65 73 74 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  est. *. * Return
1be0: 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 69 66 20  s:. *.TCL_OK if 
1bf0: 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 54 43  successful or TC
1c00: 4c 5f 45 52 52 4f 52 20 66 6f 72 20 66 61 69 6c  L_ERROR for fail
1c10: 75 72 65 20 77 69 74 68 20 72 65 73 75 6c 74 20  ure with result 
1c20: 73 65 74 0a 20 2a 09 74 6f 20 65 72 72 6f 72 20  set. *.to error 
1c30: 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 20 53  message.. *. * S
1c40: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
1c50: 53 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20 6d  Sets result to m
1c60: 65 73 73 61 67 65 20 64 69 67 65 73 74 20 6f 72  essage digest or
1c70: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
1c80: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  e.. *. *--------
1c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
1cd0: 69 6e 74 20 44 69 67 65 73 74 46 69 6e 61 6c 69  int DigestFinali
1ce0: 7a 65 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  ze(Tcl_Interp *i
1cf0: 6e 74 65 72 70 2c 20 44 69 67 65 73 74 53 74 61  nterp, DigestSta
1d00: 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 54 63  te *statePtr, Tc
1d10: 6c 5f 4f 62 6a 20 2a 2a 72 65 73 75 6c 74 4f 62  l_Obj **resultOb
1d20: 6a 29 20 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65  j) {.    unsigne
1d30: 64 20 63 68 61 72 20 6d 64 5f 62 75 66 5b 45 56  d char md_buf[EV
1d40: 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45 5d 3b 0a  P_MAX_MD_SIZE];.
1d50: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
1d60: 20 75 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 72   ulen;.    int r
1d70: 65 73 20 3d 20 30 2c 20 6d 64 5f 6c 65 6e 20 3d  es = 0, md_len =
1d80: 20 30 2c 20 74 79 70 65 20 3d 20 73 74 61 74 65   0, type = state
1d90: 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20 30 78  Ptr->format & 0x
1da0: 46 46 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  FF0;..    dprint
1db0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
1dc0: 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 68 61    /* Finalize ha
1dd0: 73 68 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  sh function and 
1de0: 67 65 74 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  get result */.  
1df0: 20 20 73 77 69 74 63 68 28 74 79 70 65 29 20 7b    switch(type) {
1e00: 0a 20 20 20 20 63 61 73 65 20 54 59 50 45 5f 4d  .    case TYPE_M
1e10: 44 3a 0a 09 69 66 20 28 21 28 73 74 61 74 65 50  D:..if (!(stateP
1e20: 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20 49 53 5f  tr->format & IS_
1e30: 58 4f 46 29 20 7c 7c 20 73 74 61 74 65 50 74 72  XOF) || statePtr
1e40: 2d 3e 6c 65 6e 67 74 68 20 3d 3d 20 30 29 20 7b  ->length == 0) {
1e50: 0a 09 20 20 20 20 2f 2a 20 4e 6f 6e 20 58 4f 46  ..    /* Non XOF
1e60: 20 6f 72 20 58 4f 46 20 77 69 74 68 20 64 65 66   or XOF with def
1e70: 61 75 6c 74 20 6c 65 6e 67 74 68 20 2a 2f 0a 09  ault length */..
1e80: 20 20 20 20 72 65 73 20 3d 20 45 56 50 5f 44 69      res = EVP_Di
1e90: 67 65 73 74 46 69 6e 61 6c 5f 65 78 28 73 74 61  gestFinal_ex(sta
1ea0: 74 65 50 74 72 2d 3e 63 74 78 2c 20 6d 64 5f 62  tePtr->ctx, md_b
1eb0: 75 66 2c 20 26 75 6c 65 6e 29 3b 0a 09 20 20 20  uf, &ulen);..   
1ec0: 20 6d 64 5f 6c 65 6e 20 3d 20 28 69 6e 74 29 20   md_len = (int) 
1ed0: 75 6c 65 6e 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  ulen;..} else {.
1ee0: 09 20 20 20 20 2f 2a 20 58 4f 46 20 77 69 74 68  .    /* XOF with
1ef0: 20 63 75 73 74 6f 6d 20 6c 65 6e 67 74 68 20 2a   custom length *
1f00: 2f 0a 09 20 20 20 20 6d 64 5f 6c 65 6e 20 3d 20  /..    md_len = 
1f10: 73 74 61 74 65 50 74 72 2d 3e 6c 65 6e 67 74 68  statePtr->length
1f20: 20 3c 20 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49   < EVP_MAX_MD_SI
1f30: 5a 45 20 3f 20 73 74 61 74 65 50 74 72 2d 3e 6c  ZE ? statePtr->l
1f40: 65 6e 67 74 68 20 3a 20 45 56 50 5f 4d 41 58 5f  ength : EVP_MAX_
1f50: 4d 44 5f 53 49 5a 45 3b 0a 09 20 20 20 20 72 65  MD_SIZE;..    re
1f60: 73 20 3d 20 45 56 50 5f 44 69 67 65 73 74 46 69  s = EVP_DigestFi
1f70: 6e 61 6c 58 4f 46 28 73 74 61 74 65 50 74 72 2d  nalXOF(statePtr-
1f80: 3e 63 74 78 2c 20 6d 64 5f 62 75 66 2c 20 28 73  >ctx, md_buf, (s
1f90: 69 7a 65 5f 74 29 20 6d 64 5f 6c 65 6e 29 3b 0a  ize_t) md_len);.
1fa0: 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63  .}..break;.    c
1fb0: 61 73 65 20 54 59 50 45 5f 48 4d 41 43 3a 0a 09  ase TYPE_HMAC:..
1fc0: 72 65 73 20 3d 20 48 4d 41 43 5f 46 69 6e 61 6c  res = HMAC_Final
1fd0: 28 73 74 61 74 65 50 74 72 2d 3e 68 63 74 78 2c  (statePtr->hctx,
1fe0: 20 6d 64 5f 62 75 66 2c 20 26 75 6c 65 6e 29 3b   md_buf, &ulen);
1ff0: 0a 09 6d 64 5f 6c 65 6e 20 3d 20 28 69 6e 74 29  ..md_len = (int)
2000: 20 75 6c 65 6e 3b 0a 09 62 72 65 61 6b 3b 0a 20   ulen;..break;. 
2010: 20 20 20 63 61 73 65 20 54 59 50 45 5f 43 4d 41     case TYPE_CMA
2020: 43 3a 0a 09 7b 0a 09 20 20 20 20 73 69 7a 65 5f  C:..{..    size_
2030: 74 20 6c 65 6e 67 74 68 3b 0a 09 20 20 20 20 72  t length;..    r
2040: 65 73 20 3d 20 43 4d 41 43 5f 46 69 6e 61 6c 28  es = CMAC_Final(
2050: 73 74 61 74 65 50 74 72 2d 3e 63 63 74 78 2c 20  statePtr->cctx, 
2060: 6d 64 5f 62 75 66 2c 20 26 6c 65 6e 67 74 68 29  md_buf, &length)
2070: 3b 0a 09 20 20 20 20 6d 64 5f 6c 65 6e 20 3d 20  ;..    md_len = 
2080: 28 69 6e 74 29 20 6c 65 6e 67 74 68 3b 0a 09 20  (int) length;.. 
2090: 20 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 20     break;..}.   
20a0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 21 72 65 73   }..    if (!res
20b0: 29 20 7b 0a 09 69 66 20 28 72 65 73 75 6c 74 4f  ) {..if (resultO
20c0: 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  bj == NULL) {.. 
20d0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
20e0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 46 69 6e  ult(interp, "Fin
20f0: 61 6c 69 7a 65 20 66 61 69 6c 65 64 3a 20 22 2c  alize failed: ",
2100: 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28   GET_ERR_REASON(
2110: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ), (char *) NULL
2120: 29 3b 0a 09 7d 0a 09 72 65 74 75 72 6e 20 54 43  );..}..return TC
2130: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
2140: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 6d 65      /* Return me
2150: 73 73 61 67 65 20 64 69 67 65 73 74 20 61 73 20  ssage digest as 
2160: 65 69 74 68 65 72 20 61 20 62 69 6e 61 72 79 20  either a binary 
2170: 6f 72 20 68 65 78 20 73 74 72 69 6e 67 20 2a 2f  or hex string */
2180: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
2190: 72 2d 3e 66 6f 72 6d 61 74 20 26 20 42 49 4e 5f  r->format & BIN_
21a0: 46 4f 52 4d 41 54 29 20 7b 0a 09 69 66 20 28 72  FORMAT) {..if (r
21b0: 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c  esultObj == NULL
21c0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74  ) {..    Tcl_Set
21d0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
21e0: 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  , Tcl_NewByteArr
21f0: 61 79 4f 62 6a 28 6d 64 5f 62 75 66 2c 20 28 54  ayObj(md_buf, (T
2200: 63 6c 5f 53 69 7a 65 29 20 6d 64 5f 6c 65 6e 29  cl_Size) md_len)
2210: 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  );..} else {..  
2220: 20 20 2a 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54    *resultObj = T
2230: 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f  cl_NewByteArrayO
2240: 62 6a 28 6d 64 5f 62 75 66 2c 20 28 54 63 6c 5f  bj(md_buf, (Tcl_
2250: 53 69 7a 65 29 20 6d 64 5f 6c 65 6e 29 3b 0a 09  Size) md_len);..
2260: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
2270: 6f 75 6e 74 28 2a 72 65 73 75 6c 74 4f 62 6a 29  ount(*resultObj)
2280: 3b 0a 09 7d 0a 0a 20 20 20 20 7d 20 65 6c 73 65  ;..}..    } else
2290: 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6e 65 77   {..Tcl_Obj *new
22a0: 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  Obj = Tcl_NewObj
22b0: 28 29 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  ();..unsigned ch
22c0: 61 72 20 2a 70 74 72 20 3d 20 54 63 6c 5f 53 65  ar *ptr = Tcl_Se
22d0: 74 42 79 74 65 41 72 72 61 79 4c 65 6e 67 74 68  tByteArrayLength
22e0: 28 6e 65 77 4f 62 6a 2c 20 28 54 63 6c 5f 53 69  (newObj, (Tcl_Si
22f0: 7a 65 29 20 6d 64 5f 6c 65 6e 2a 32 29 3b 0a 0a  ze) md_len*2);..
2300: 09 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b  .for (int i = 0;
2310: 20 69 20 3c 20 6d 64 5f 6c 65 6e 3b 20 69 2b 2b   i < md_len; i++
2320: 29 20 7b 0a 09 20 20 20 20 2a 70 74 72 2b 2b 20  ) {..    *ptr++ 
2330: 3d 20 68 65 78 5b 28 6d 64 5f 62 75 66 5b 69 5d  = hex[(md_buf[i]
2340: 20 3e 3e 20 34 29 20 26 20 30 78 30 46 5d 3b 0a   >> 4) & 0x0F];.
2350: 09 20 20 20 20 2a 70 74 72 2b 2b 20 3d 20 68 65  .    *ptr++ = he
2360: 78 5b 6d 64 5f 62 75 66 5b 69 5d 20 26 20 30 78  x[md_buf[i] & 0x
2370: 30 46 5d 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65  0F];..}...if (re
2380: 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29  sultObj == NULL)
2390: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 4f   {..    Tcl_SetO
23a0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
23b0: 20 6e 65 77 4f 62 6a 29 3b 0a 09 7d 20 65 6c 73   newObj);..} els
23c0: 65 20 7b 0a 09 20 20 20 20 2a 72 65 73 75 6c 74  e {..    *result
23d0: 4f 62 6a 20 3d 20 6e 65 77 4f 62 6a 3b 0a 09 20  Obj = newObj;.. 
23e0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
23f0: 75 6e 74 28 2a 72 65 73 75 6c 74 4f 62 6a 29 3b  unt(*resultObj);
2400: 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ..}.    }.    re
2410: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
2420: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
2430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2460: 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  ****/../*. *----
2470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
24b0: 20 2a 0a 20 2a 20 44 69 67 65 73 74 42 6c 6f 63   *. * DigestBloc
24c0: 6b 4d 6f 64 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a  kModeProc --. *.
24d0: 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e   *.This function
24e0: 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 74   is invoked by t
24f0: 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c 65  he generic IO le
2500: 76 65 6c 0a 20 2a 09 74 6f 20 73 65 74 20 62 6c  vel. *.to set bl
2510: 6f 63 6b 69 6e 67 20 61 6e 64 20 6e 6f 6e 62 6c  ocking and nonbl
2520: 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 2e 0a 20 2a  ocking modes.. *
2530: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09  . * Returns:. *.
2540: 30 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20  0 if successful 
2550: 6f 72 20 50 4f 53 49 58 20 65 72 72 6f 72 20 63  or POSIX error c
2560: 6f 64 65 20 69 66 20 66 61 69 6c 65 64 2e 0a 20  ode if failed.. 
2570: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
2580: 73 3a 0a 20 2a 09 53 65 74 73 20 74 68 65 20 64  s:. *.Sets the d
2590: 65 76 69 63 65 20 69 6e 74 6f 20 62 6c 6f 63 6b  evice into block
25a0: 69 6e 67 20 6f 72 20 6e 6f 6e 62 6c 6f 63 6b 69  ing or nonblocki
25b0: 6e 67 20 6d 6f 64 65 2e 0a 20 2a 09 43 61 6e 20  ng mode.. *.Can 
25c0: 63 61 6c 6c 20 54 63 6c 5f 53 65 74 43 68 61 6e  call Tcl_SetChan
25d0: 6e 65 6c 45 72 72 6f 72 2e 0a 20 2a 0a 20 2a 2d  nelError.. *. *-
25e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
25f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2620: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
2630: 74 20 44 69 67 65 73 74 42 6c 6f 63 6b 4d 6f 64  t DigestBlockMod
2640: 65 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61  eProc(ClientData
2650: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e 74   clientData, int
2660: 20 6d 6f 64 65 29 20 7b 0a 20 20 20 20 44 69 67   mode) {.    Dig
2670: 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50  estState *stateP
2680: 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 74  tr = (DigestStat
2690: 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b  e *) clientData;
26a0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
26b0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
26c0: 20 28 6d 6f 64 65 20 3d 3d 20 54 43 4c 5f 4d 4f   (mode == TCL_MO
26d0: 44 45 5f 4e 4f 4e 42 4c 4f 43 4b 49 4e 47 29 20  DE_NONBLOCKING) 
26e0: 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61  {..statePtr->fla
26f0: 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 41 53  gs |= TLS_TCL_AS
2700: 59 4e 43 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  YNC;.    } else 
2710: 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61  {..statePtr->fla
2720: 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f  gs &= ~(TLS_TCL_
2730: 41 53 59 4e 43 29 3b 0a 20 20 20 20 7d 0a 20 20  ASYNC);.    }.  
2740: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2750: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
2760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2790: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69  -------. *. * Di
27a0: 67 65 73 74 43 6c 6f 73 65 50 72 6f 63 20 2d 2d  gestCloseProc --
27b0: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63  . *. *.This func
27c0: 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20  tion is invoked 
27d0: 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49  by the generic I
27e0: 4f 20 6c 65 76 65 6c 20 74 6f 20 70 65 72 66 6f  O level to perfo
27f0: 72 6d 0a 20 2a 09 63 68 61 6e 6e 65 6c 2d 74 79  rm. *.channel-ty
2800: 70 65 20 73 70 65 63 69 66 69 63 20 63 6c 65 61  pe specific clea
2810: 6e 75 70 20 77 68 65 6e 20 74 68 65 20 63 68 61  nup when the cha
2820: 6e 6e 65 6c 20 69 73 20 63 6c 6f 73 65 64 2e 20  nnel is closed. 
2830: 41 6c 6c 0a 20 2a 09 71 75 65 75 65 64 20 6f 75  All. *.queued ou
2840: 74 70 75 74 20 69 73 20 66 6c 75 73 68 65 64 20  tput is flushed 
2850: 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
2860: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
2870: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20   *. * Returns:. 
2880: 2a 09 30 20 69 66 20 73 75 63 63 65 73 73 66 75  *.0 if successfu
2890: 6c 20 6f 72 20 50 4f 53 49 58 20 65 72 72 6f 72  l or POSIX error
28a0: 20 63 6f 64 65 20 69 66 20 66 61 69 6c 65 64 2e   code if failed.
28b0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
28c0: 63 74 73 3a 0a 20 2a 09 44 65 6c 65 74 65 73 20  cts:. *.Deletes 
28d0: 73 74 6f 72 65 64 20 73 74 61 74 65 20 64 61 74  stored state dat
28e0: 61 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  a.. *. *--------
28f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
2930: 69 6e 74 20 44 69 67 65 73 74 43 6c 6f 73 65 50  int DigestCloseP
2940: 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 63  roc(ClientData c
2950: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
2960: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b  nterp *interp) {
2970: 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65  .    DigestState
2980: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44 69   *statePtr = (Di
2990: 67 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69  gestState *) cli
29a0: 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70  entData;..    dp
29b0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
29c0: 0a 0a 20 20 20 20 2f 2a 20 43 61 6e 63 65 6c 20  ..    /* Cancel 
29d0: 61 63 74 69 76 65 20 74 69 6d 65 72 2c 20 69 66  active timer, if
29e0: 20 61 6e 79 20 2a 2f 0a 20 20 20 20 69 66 20 28   any */.    if (
29f0: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20  statePtr->timer 
2a00: 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b  != (Tcl_TimerTok
2a10: 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c  en) NULL) {..Tcl
2a20: 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64  _DeleteTimerHand
2a30: 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69  ler(statePtr->ti
2a40: 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d  mer);..statePtr-
2a50: 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69  >timer = (Tcl_Ti
2a60: 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a  merToken) NULL;.
2a70: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 75      }..    /* Ou
2a80: 74 70 75 74 20 6d 65 73 73 61 67 65 20 64 69 67  tput message dig
2a90: 65 73 74 20 69 66 20 6e 6f 74 20 61 6c 72 65 61  est if not alrea
2aa0: 64 79 20 64 6f 6e 65 20 2a 2f 0a 20 20 20 20 69  dy done */.    i
2ab0: 66 20 28 21 28 73 74 61 74 65 50 74 72 2d 3e 66  f (!(statePtr->f
2ac0: 6c 61 67 73 20 26 20 43 48 41 4e 5f 45 4f 46 29  lags & CHAN_EOF)
2ad0: 29 20 7b 0a 09 54 63 6c 5f 43 68 61 6e 6e 65 6c  ) {..Tcl_Channel
2ae0: 20 70 61 72 65 6e 74 20 3d 20 54 63 6c 5f 47 65   parent = Tcl_Ge
2af0: 74 53 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28  tStackedChannel(
2b00: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b  statePtr->self);
2b10: 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c  ..Tcl_Obj *resul
2b20: 74 4f 62 6a 3b 0a 09 54 63 6c 5f 53 69 7a 65 20  tObj;..Tcl_Size 
2b30: 77 72 69 74 74 65 6e 2c 20 74 6f 57 72 69 74 65  written, toWrite
2b40: 3b 0a 0a 09 69 66 20 28 44 69 67 65 73 74 46 69  ;...if (DigestFi
2b50: 6e 61 6c 69 7a 65 28 73 74 61 74 65 50 74 72 2d  nalize(statePtr-
2b60: 3e 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  >interp, statePt
2b70: 72 2c 20 26 72 65 73 75 6c 74 4f 62 6a 29 20 3d  r, &resultObj) =
2b80: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20  = TCL_OK) {..   
2b90: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2ba0: 64 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 42 79  data = Tcl_GetBy
2bb0: 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 72  teArrayFromObj(r
2bc0: 65 73 75 6c 74 4f 62 6a 2c 20 26 74 6f 57 72 69  esultObj, &toWri
2bd0: 74 65 29 3b 0a 09 20 20 20 20 77 72 69 74 74 65  te);..    writte
2be0: 6e 20 3d 20 54 63 6c 5f 57 72 69 74 65 52 61 77  n = Tcl_WriteRaw
2bf0: 28 70 61 72 65 6e 74 2c 20 28 63 6f 6e 73 74 20  (parent, (const 
2c00: 63 68 61 72 20 2a 29 20 64 61 74 61 2c 20 74 6f  char *) data, to
2c10: 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 20 20  Write);.        
2c20: 20 20 20 20 69 66 20 28 77 72 69 74 74 65 6e 20      if (written 
2c30: 21 3d 20 74 6f 57 72 69 74 65 29 20 7b 0a 20 20  != toWrite) {.  
2c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c50: 20 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20   Error */.      
2c60: 20 20 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c        }..    Tcl
2c70: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 72 65  _DecrRefCount(re
2c80: 73 75 6c 74 4f 62 6a 29 3b 0a 09 7d 0a 09 73 74  sultObj);..}..st
2c90: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d  atePtr->flags |=
2ca0: 20 43 48 41 4e 5f 45 4f 46 3b 0a 20 20 20 20 7d   CHAN_EOF;.    }
2cb0: 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 6e 2d 75  ..    /* Clean-u
2cc0: 70 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 53  p */.    DigestS
2cd0: 74 61 74 65 46 72 65 65 28 73 74 61 74 65 50 74  tateFree(statePt
2ce0: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  r);.    return 0
2cf0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 61 6d 65 20  ;.}../*. * Same 
2d00: 61 73 20 44 69 67 65 73 74 43 6c 6f 73 65 50 72  as DigestClosePr
2d10: 6f 63 20 62 75 74 20 77 69 74 68 20 69 6e 64 69  oc but with indi
2d20: 76 69 64 75 61 6c 20 72 65 61 64 20 61 6e 64 20  vidual read and 
2d30: 77 72 69 74 65 20 63 6c 6f 73 65 20 63 6f 6e 74  write close cont
2d40: 72 6f 6c 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  rol. */.static i
2d50: 6e 74 20 44 69 67 65 73 74 43 6c 6f 73 65 32 50  nt DigestClose2P
2d60: 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69  roc(ClientData i
2d70: 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 54 63 6c  nstanceData, Tcl
2d80: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2d90: 20 69 6e 74 20 66 6c 61 67 73 29 20 7b 0a 0a 20   int flags) {.. 
2da0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
2db0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 28  ed");..    if ((
2dc0: 66 6c 61 67 73 20 26 20 28 54 43 4c 5f 43 4c 4f  flags & (TCL_CLO
2dd0: 53 45 5f 52 45 41 44 20 7c 20 54 43 4c 5f 43 4c  SE_READ | TCL_CL
2de0: 4f 53 45 5f 57 52 49 54 45 29 29 20 3d 3d 20 30  OSE_WRITE)) == 0
2df0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 44 69 67 65  ) {..return Dige
2e00: 73 74 43 6c 6f 73 65 50 72 6f 63 28 69 6e 73 74  stCloseProc(inst
2e10: 61 6e 63 65 44 61 74 61 2c 20 69 6e 74 65 72 70  anceData, interp
2e20: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
2e30: 75 72 6e 20 45 49 4e 56 41 4c 3b 0a 7d 0a 0a 2f  urn EINVAL;.}../
2e40: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
2e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
2e90: 20 44 69 67 65 73 74 49 6e 70 75 74 50 72 6f 63   DigestInputProc
2ea0: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64   --. *. *.Called
2eb0: 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20   by the generic 
2ec0: 49 4f 20 73 79 73 74 65 6d 20 74 6f 20 72 65 61  IO system to rea
2ed0: 64 20 64 61 74 61 20 66 72 6f 6d 20 74 72 61 6e  d data from tran
2ee0: 73 66 6f 72 6d 20 61 6e 64 0a 20 2a 09 70 6c 61  sform and. *.pla
2ef0: 63 65 20 69 6e 20 62 75 66 2e 20 54 72 61 6e 73  ce in buf. Trans
2f00: 66 6f 72 6d 20 67 65 74 73 20 64 61 74 61 20 66  form gets data f
2f10: 72 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69  rom the underlyi
2f20: 6e 67 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20  ng channel.. *. 
2f30: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 6f  * Returns:. *.To
2f40: 74 61 6c 20 62 79 74 65 73 20 72 65 61 64 20 6f  tal bytes read o
2f50: 72 20 2d 31 20 66 6f 72 20 61 6e 20 65 72 72 6f  r -1 for an erro
2f60: 72 20 61 6c 6f 6e 67 20 77 69 74 68 20 61 20 50  r along with a P
2f70: 4f 53 49 58 20 65 72 72 6f 72 0a 20 2a 09 63 6f  OSIX error. *.co
2f80: 64 65 20 69 6e 20 65 72 72 6f 72 43 6f 64 65 50  de in errorCodeP
2f90: 74 72 2e 20 55 73 65 20 45 41 47 41 49 4e 20 66  tr. Use EAGAIN f
2fa0: 6f 72 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 61  or nonblocking a
2fb0: 6e 64 20 6e 6f 20 64 61 74 61 2e 0a 20 2a 0a 20  nd no data.. *. 
2fc0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
2fd0: 20 2a 09 52 65 61 64 20 64 61 74 61 20 66 72 6f   *.Read data fro
2fe0: 6d 20 74 72 61 6e 73 66 6f 72 6d 20 61 6e 64 20  m transform and 
2ff0: 77 72 69 74 65 20 74 6f 20 62 75 66 0a 20 2a 0a  write to buf. *.
3000: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
3010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3040: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74  --------. */.int
3050: 20 44 69 67 65 73 74 49 6e 70 75 74 50 72 6f 63   DigestInputProc
3060: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
3070: 6e 74 44 61 74 61 2c 20 63 68 61 72 20 2a 62 75  ntData, char *bu
3080: 66 2c 20 69 6e 74 20 74 6f 52 65 61 64 2c 20 69  f, int toRead, i
3090: 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72  nt *errorCodePtr
30a0: 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74  ) {.    DigestSt
30b0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
30c0: 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 29 20  (DigestState *) 
30d0: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20  clientData;.    
30e0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 70 61 72 65  Tcl_Channel pare
30f0: 6e 74 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65  nt;.    Tcl_Size
3100: 20 72 65 61 64 3b 0a 20 20 20 20 2a 65 72 72 6f   read;.    *erro
3110: 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 0a 20  rCodePtr = 0;.. 
3120: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
3130: 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 62  ed");..    /* Ab
3140: 6f 72 74 20 69 66 20 6e 6f 74 68 69 6e 67 20 74  ort if nothing t
3150: 6f 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 20  o process */.   
3160: 20 69 66 20 28 74 6f 52 65 61 64 20 3c 3d 20 30   if (toRead <= 0
3170: 20 7c 7c 20 73 74 61 74 65 50 74 72 2d 3e 73 65   || statePtr->se
3180: 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e  lf == (Tcl_Chann
3190: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74  el) NULL) {..ret
31a0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  urn 0;.    }..  
31b0: 20 20 2f 2a 20 47 65 74 20 62 79 74 65 73 20 66    /* Get bytes f
31c0: 72 6f 6d 20 75 6e 64 65 72 6c 79 69 6e 67 20 63  rom underlying c
31d0: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 70 61  hannel */.    pa
31e0: 72 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74  rent = Tcl_GetSt
31f0: 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 61  ackedChannel(sta
3200: 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 20 20  tePtr->self);.  
3210: 20 20 72 65 61 64 20 3d 20 54 63 6c 5f 52 65 61    read = Tcl_Rea
3220: 64 52 61 77 28 70 61 72 65 6e 74 2c 20 62 75 66  dRaw(parent, buf
3230: 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 74 6f 52  , (Tcl_Size) toR
3240: 65 61 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70  ead);..    /* Up
3250: 64 61 74 65 20 68 61 73 68 20 66 75 6e 63 74 69  date hash functi
3260: 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65  on */.    if (re
3270: 61 64 20 3e 20 30 29 20 7b 0a 09 2f 2a 20 48 61  ad > 0) {../* Ha
3280: 76 65 20 64 61 74 61 20 2a 2f 0a 09 69 66 20 28  ve data */..if (
3290: 44 69 67 65 73 74 55 70 64 61 74 65 28 73 74 61  DigestUpdate(sta
32a0: 74 65 50 74 72 2c 20 62 75 66 2c 20 72 65 61 64  tePtr, buf, read
32b0: 2c 20 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  , 0) != TCL_OK) 
32c0: 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 43 68  {..    Tcl_SetCh
32d0: 61 6e 6e 65 6c 45 72 72 6f 72 28 73 74 61 74 65  annelError(state
32e0: 50 74 72 2d 3e 73 65 6c 66 2c 20 54 63 6c 5f 4f  Ptr->self, Tcl_O
32f0: 62 6a 50 72 69 6e 74 66 28 22 55 70 64 61 74 65  bjPrintf("Update
3300: 20 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 47 45   failed: %s", GE
3310: 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 29 29  T_ERR_REASON()))
3320: 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64  ;..    *errorCod
3330: 65 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 09  ePtr = EINVAL;..
3340: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 09 7d      return 0;..}
3350: 0a 09 2f 2a 20 54 68 69 73 20 69 73 20 63 6f 72  ../* This is cor
3360: 72 65 63 74 20 2a 2f 0a 09 72 65 61 64 20 3d 20  rect */..read = 
3370: 2d 31 3b 0a 09 2a 65 72 72 6f 72 43 6f 64 65 50  -1;..*errorCodeP
3380: 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 0a 20 20  tr = EAGAIN;..  
3390: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 72 65 61    } else if (rea
33a0: 64 20 3c 20 30 29 20 7b 0a 09 2f 2a 20 45 72 72  d < 0) {../* Err
33b0: 6f 72 20 2a 2f 0a 09 2a 65 72 72 6f 72 43 6f 64  or */..*errorCod
33c0: 65 50 74 72 20 3d 20 54 63 6c 5f 47 65 74 45 72  ePtr = Tcl_GetEr
33d0: 72 6e 6f 28 29 3b 0a 0a 20 20 20 20 7d 20 65 6c  rno();..    } el
33e0: 73 65 20 69 66 20 28 21 28 73 74 61 74 65 50 74  se if (!(statePt
33f0: 72 2d 3e 66 6c 61 67 73 20 26 20 43 48 41 4e 5f  r->flags & CHAN_
3400: 45 4f 46 29 29 20 7b 0a 09 2f 2a 20 45 4f 46 20  EOF)) {../* EOF 
3410: 2a 2f 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72 65 73  */..Tcl_Obj *res
3420: 75 6c 74 4f 62 6a 3b 0a 09 69 66 20 28 44 69 67  ultObj;..if (Dig
3430: 65 73 74 46 69 6e 61 6c 69 7a 65 28 73 74 61 74  estFinalize(stat
3440: 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 73 74  ePtr->interp, st
3450: 61 74 65 50 74 72 2c 20 26 72 65 73 75 6c 74 4f  atePtr, &resultO
3460: 62 6a 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b  bj) == TCL_OK) {
3470: 0a 09 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ..    unsigned c
3480: 68 61 72 20 2a 64 61 74 61 20 3d 20 54 63 6c 5f  har *data = Tcl_
3490: 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
34a0: 4f 62 6a 28 72 65 73 75 6c 74 4f 62 6a 2c 20 26  Obj(resultObj, &
34b0: 72 65 61 64 29 3b 0a 09 20 20 20 20 6d 65 6d 63  read);..    memc
34c0: 70 79 28 62 75 66 2c 20 64 61 74 61 2c 20 28 69  py(buf, data, (i
34d0: 6e 74 29 20 72 65 61 64 29 3b 0a 09 20 20 20 20  nt) read);..    
34e0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
34f0: 28 72 65 73 75 6c 74 4f 62 6a 29 3b 0a 0a 09 7d  (resultObj);...}
3500: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 54 63 6c   else {..    Tcl
3510: 5f 53 65 74 43 68 61 6e 6e 65 6c 45 72 72 6f 72  _SetChannelError
3520: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c  (statePtr->self,
3530: 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 22   Tcl_ObjPrintf("
3540: 46 69 6e 61 6c 69 7a 65 20 66 61 69 6c 65 64 3a  Finalize failed:
3550: 20 25 73 22 2c 20 47 45 54 5f 45 52 52 5f 52 45   %s", GET_ERR_RE
3560: 41 53 4f 4e 28 29 29 29 3b 0a 09 20 20 20 20 2a  ASON()));..    *
3570: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45  errorCodePtr = E
3580: 49 4e 56 41 4c 3b 0a 09 20 20 20 20 72 65 61 64  INVAL;..    read
3590: 20 3d 20 30 3b 0a 09 7d 0a 09 73 74 61 74 65 50   = 0;..}..stateP
35a0: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 48 41  tr->flags |= CHA
35b0: 4e 5f 45 4f 46 3b 0a 20 20 20 20 7d 0a 20 20 20  N_EOF;.    }.   
35c0: 20 72 65 74 75 72 6e 20 28 69 6e 74 29 20 72 65   return (int) re
35d0: 61 64 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  ad;.}../*. *----
35e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3620: 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 4f  --. *. * DigestO
3630: 75 74 70 75 74 50 72 6f 63 20 2d 2d 0a 20 2a 0a  utputProc --. *.
3640: 20 2a 09 43 61 6c 6c 65 64 20 62 79 20 74 68 65   *.Called by the
3650: 20 67 65 6e 65 72 69 63 20 49 4f 20 73 79 73 74   generic IO syst
3660: 65 6d 20 74 6f 20 77 72 69 74 65 20 64 61 74 61  em to write data
3670: 20 69 6e 20 62 75 66 20 74 6f 20 74 72 61 6e 73   in buf to trans
3680: 66 6f 72 6d 2e 0a 20 2a 09 54 68 65 20 74 72 61  form.. *.The tra
3690: 6e 73 66 6f 72 6d 20 77 72 69 74 65 73 20 74 68  nsform writes th
36a0: 65 20 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20  e result to the 
36b0: 75 6e 64 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e  underlying chann
36c0: 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  el.. *. * Return
36d0: 73 3a 0a 20 2a 09 54 6f 74 61 6c 20 62 79 74 65  s:. *.Total byte
36e0: 73 20 77 72 69 74 74 65 6e 20 6f 72 20 2d 31 20  s written or -1 
36f0: 66 6f 72 20 61 6e 20 65 72 72 6f 72 20 61 6c 6f  for an error alo
3700: 6e 67 20 77 69 74 68 20 61 20 50 4f 53 49 58 20  ng with a POSIX 
3710: 65 72 72 6f 72 0a 20 2a 09 63 6f 64 65 20 69 6e  error. *.code in
3720: 20 65 72 72 6f 72 43 6f 64 65 50 74 72 2e 20 55   errorCodePtr. U
3730: 73 65 20 45 41 47 41 49 4e 20 66 6f 72 20 6e 6f  se EAGAIN for no
3740: 6e 62 6c 6f 63 6b 69 6e 67 20 61 6e 64 20 63 61  nblocking and ca
3750: 6e 27 74 20 77 72 69 74 65 20 64 61 74 61 2e 0a  n't write data..
3760: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
3770: 74 73 3a 0a 20 2a 09 47 65 74 20 64 61 74 61 20  ts:. *.Get data 
3780: 66 72 6f 6d 20 62 75 66 20 61 6e 64 20 75 70 64  from buf and upd
3790: 61 74 65 20 64 69 67 65 73 74 0a 20 2a 0a 20 2a  ate digest. *. *
37a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37e0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 20 69 6e 74 20  ------. */. int 
37f0: 44 69 67 65 73 74 4f 75 74 70 75 74 50 72 6f 63  DigestOutputProc
3800: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
3810: 6e 74 44 61 74 61 2c 20 63 6f 6e 73 74 20 63 68  ntData, const ch
3820: 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 74 6f 57  ar *buf, int toW
3830: 72 69 74 65 2c 20 69 6e 74 20 2a 65 72 72 6f 72  rite, int *error
3840: 43 6f 64 65 50 74 72 29 20 7b 0a 20 20 20 20 44  CodePtr) {.    D
3850: 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74  igestState *stat
3860: 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74  ePtr = (DigestSt
3870: 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74  ate *) clientDat
3880: 61 3b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64  a;.    *errorCod
3890: 65 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20 64  ePtr = 0;..    d
38a0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
38b0: 3b 0a 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74 20  ;..    /* Abort 
38c0: 69 66 20 6e 6f 74 68 69 6e 67 20 74 6f 20 70 72  if nothing to pr
38d0: 6f 63 65 73 73 20 2a 2f 0a 20 20 20 20 69 66 20  ocess */.    if 
38e0: 28 74 6f 57 72 69 74 65 20 3c 3d 20 30 20 7c 7c  (toWrite <= 0 ||
38f0: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20   statePtr->self 
3900: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29  == (Tcl_Channel)
3910: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
3920: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
3930: 2a 20 55 70 64 61 74 65 20 68 61 73 68 20 66 75  * Update hash fu
3940: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66  nction */.    if
3950: 20 28 44 69 67 65 73 74 55 70 64 61 74 65 28 73   (DigestUpdate(s
3960: 74 61 74 65 50 74 72 2c 20 28 63 68 61 72 20 2a  tatePtr, (char *
3970: 29 20 62 75 66 2c 20 28 54 63 6c 5f 53 69 7a 65  ) buf, (Tcl_Size
3980: 29 20 74 6f 57 72 69 74 65 2c 20 30 29 20 21 3d  ) toWrite, 0) !=
3990: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f   TCL_OK) {..Tcl_
39a0: 53 65 74 43 68 61 6e 6e 65 6c 45 72 72 6f 72 28  SetChannelError(
39b0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20  statePtr->self, 
39c0: 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 22 55  Tcl_ObjPrintf("U
39d0: 70 64 61 74 65 20 66 61 69 6c 65 64 3a 20 25 73  pdate failed: %s
39e0: 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f  ", GET_ERR_REASO
39f0: 4e 28 29 29 29 3b 0a 09 2a 65 72 72 6f 72 43 6f  N()));..*errorCo
3a00: 64 65 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a  dePtr = EINVAL;.
3a10: 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d  .return 0;.    }
3a20: 0a 20 20 20 20 72 65 74 75 72 6e 20 74 6f 57 72  .    return toWr
3a30: 69 74 65 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  ite;.}../*. *---
3a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a80: 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74  ---. *. * Digest
3a90: 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2d 2d  SetOptionProc --
3aa0: 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79  . *. *.Called by
3ab0: 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20   the generic IO 
3ac0: 73 79 73 74 65 6d 20 74 6f 20 73 65 74 20 63 68  system to set ch
3ad0: 61 6e 6e 65 6c 20 6f 70 74 69 6f 6e 20 6e 61 6d  annel option nam
3ae0: 65 20 74 6f 20 76 61 6c 75 65 2e 0a 20 2a 0a 20  e to value.. *. 
3af0: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43  * Returns:. *.TC
3b00: 4c 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66  L_OK if successf
3b10: 75 6c 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 20  ul or TCL_ERROR 
3b20: 69 66 20 66 61 69 6c 65 64 20 61 6c 6f 6e 67 20  if failed along 
3b30: 77 69 74 68 20 61 6e 20 65 72 72 6f 72 0a 20 2a  with an error. *
3b40: 09 6d 65 73 73 61 67 65 20 69 6e 20 69 6e 74 65  .message in inte
3b50: 72 70 20 61 6e 64 20 54 63 6c 5f 53 65 74 45 72  rp and Tcl_SetEr
3b60: 72 6e 6f 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  rno.. *. * Side 
3b70: 65 66 66 65 63 74 73 3a 0a 20 2a 09 55 70 64 61  effects:. *.Upda
3b80: 74 65 73 20 63 68 61 6e 6e 65 6c 20 6f 70 74 69  tes channel opti
3b90: 6f 6e 20 74 6f 20 6e 65 77 20 76 61 6c 75 65 2e  on to new value.
3ba0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
3bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
3bf0: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 69 67 65  .static int Dige
3c00: 73 74 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28  stSetOptionProc(
3c10: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
3c20: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
3c30: 70 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74  p *interp, const
3c40: 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d   char *optionNam
3c50: 65 2c 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a  e,..const char *
3c60: 6f 70 74 69 6f 6e 56 61 6c 75 65 29 20 7b 0a 20  optionValue) {. 
3c70: 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a     DigestState *
3c80: 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65  statePtr = (Dige
3c90: 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e  stState *) clien
3ca0: 74 44 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 43  tData;.    Tcl_C
3cb0: 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 3b 0a 20  hannel parent;. 
3cc0: 20 20 20 54 63 6c 5f 44 72 69 76 65 72 53 65 74     Tcl_DriverSet
3cd0: 4f 70 74 69 6f 6e 50 72 6f 63 20 2a 73 65 74 4f  OptionProc *setO
3ce0: 70 74 69 6f 6e 50 72 6f 63 3b 0a 0a 20 20 20 20  ptionProc;..    
3cf0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
3d00: 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74  );..    /* Abort
3d10: 20 69 66 20 6e 6f 20 63 68 61 6e 6e 65 6c 20 2a   if no channel *
3d20: 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  /.    if (stateP
3d30: 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c  tr->self == (Tcl
3d40: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20  _Channel) NULL) 
3d50: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
3d60: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
3d70: 2f 2a 20 44 65 6c 65 67 61 74 65 20 6f 70 74 69  /* Delegate opti
3d80: 6f 6e 73 20 64 6f 77 6e 73 74 72 65 61 6d 20 2a  ons downstream *
3d90: 2f 0a 20 20 20 20 70 61 72 65 6e 74 20 3d 20 54  /.    parent = T
3da0: 63 6c 5f 47 65 74 53 74 61 63 6b 65 64 43 68 61  cl_GetStackedCha
3db0: 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73  nnel(statePtr->s
3dc0: 65 6c 66 29 3b 0a 20 20 20 20 73 65 74 4f 70 74  elf);.    setOpt
3dd0: 69 6f 6e 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68  ionProc = Tcl_Ch
3de0: 61 6e 6e 65 6c 53 65 74 4f 70 74 69 6f 6e 50 72  annelSetOptionPr
3df0: 6f 63 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  oc(Tcl_GetChanne
3e00: 6c 54 79 70 65 28 70 61 72 65 6e 74 29 29 3b 0a  lType(parent));.
3e10: 20 20 20 20 69 66 20 28 73 65 74 4f 70 74 69 6f      if (setOptio
3e20: 6e 50 72 6f 63 20 21 3d 20 4e 55 4c 4c 29 20 7b  nProc != NULL) {
3e30: 0a 09 72 65 74 75 72 6e 20 28 2a 73 65 74 4f 70  ..return (*setOp
3e40: 74 69 6f 6e 50 72 6f 63 29 28 54 63 6c 5f 47 65  tionProc)(Tcl_Ge
3e50: 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65  tChannelInstance
3e60: 44 61 74 61 28 70 61 72 65 6e 74 29 2c 20 69 6e  Data(parent), in
3e70: 74 65 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65  terp, optionName
3e80: 2c 20 6f 70 74 69 6f 6e 56 61 6c 75 65 29 3b 0a  , optionValue);.
3e90: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63      } else {..Tc
3ea0: 6c 5f 53 65 74 45 72 72 6e 6f 28 45 49 4e 56 41  l_SetErrno(EINVA
3eb0: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 63 6c 5f  L);..return Tcl_
3ec0: 42 61 64 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  BadChannelOption
3ed0: 28 69 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e 4e  (interp, optionN
3ee0: 61 6d 65 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  ame, NULL);.    
3ef0: 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  }.}../*. *------
3f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f40: 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 47 65 74  . *. * DigestGet
3f50: 4f 70 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20 2a  OptionProc --. *
3f60: 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79 20 74 68  . *.Called by th
3f70: 65 20 67 65 6e 65 72 69 63 20 49 4f 20 73 79 73  e generic IO sys
3f80: 74 65 6d 20 74 6f 20 67 65 74 20 63 68 61 6e 6e  tem to get chann
3f90: 65 6c 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 27 73  el option name's
3fa0: 20 76 61 6c 75 65 2e 0a 20 2a 0a 20 2a 20 52 65   value.. *. * Re
3fb0: 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b  turns:. *.TCL_OK
3fc0: 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f   if successful o
3fd0: 72 20 54 43 4c 5f 45 52 52 4f 52 20 69 66 20 66  r TCL_ERROR if f
3fe0: 61 69 6c 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  ailed along with
3ff0: 20 61 6e 20 65 72 72 6f 72 0a 20 2a 09 6d 65 73   an error. *.mes
4000: 73 61 67 65 20 69 6e 20 69 6e 74 65 72 70 20 61  sage in interp a
4010: 6e 64 20 54 63 6c 5f 53 65 74 45 72 72 6e 6f 2e  nd Tcl_SetErrno.
4020: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
4030: 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 72 65 73  cts:. *.Sets res
4040: 75 6c 74 20 74 6f 20 6f 70 74 69 6f 6e 27 73 20  ult to option's 
4050: 76 61 6c 75 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  value. *. *-----
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 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40a0: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
40b0: 20 44 69 67 65 73 74 47 65 74 4f 70 74 69 6f 6e   DigestGetOption
40c0: 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20  Proc(ClientData 
40d0: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f  clientData, Tcl_
40e0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
40f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70 74 69  const char *opti
4100: 6f 6e 4e 61 6d 65 2c 0a 09 54 63 6c 5f 44 53 74  onName,..Tcl_DSt
4110: 72 69 6e 67 20 2a 6f 70 74 69 6f 6e 56 61 6c 75  ring *optionValu
4120: 65 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53  e) {.    DigestS
4130: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
4140: 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 29   (DigestState *)
4150: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20   clientData;.   
4160: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 70 61 72   Tcl_Channel par
4170: 65 6e 74 3b 0a 20 20 20 20 54 63 6c 5f 44 72 69  ent;.    Tcl_Dri
4180: 76 65 72 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63  verGetOptionProc
4190: 20 2a 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 3b   *getOptionProc;
41a0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
41b0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a  alled");..    /*
41c0: 20 41 62 6f 72 74 20 69 66 20 6e 6f 20 63 68 61   Abort if no cha
41d0: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28  nnel */.    if (
41e0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d  statePtr->self =
41f0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
4200: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
4210: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
4220: 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 67 61 74  ..    /* Delegat
4230: 65 20 6f 70 74 69 6f 6e 73 20 64 6f 77 6e 73 74  e options downst
4240: 72 65 61 6d 20 2a 2f 0a 20 20 20 20 70 61 72 65  ream */.    pare
4250: 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 63  nt = Tcl_GetStac
4260: 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 65  kedChannel(state
4270: 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 20  Ptr->self);.    
4280: 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 3d 20  getOptionProc = 
4290: 54 63 6c 5f 43 68 61 6e 6e 65 6c 47 65 74 4f 70  Tcl_ChannelGetOp
42a0: 74 69 6f 6e 50 72 6f 63 28 54 63 6c 5f 47 65 74  tionProc(Tcl_Get
42b0: 43 68 61 6e 6e 65 6c 54 79 70 65 28 70 61 72 65  ChannelType(pare
42c0: 6e 74 29 29 3b 0a 20 20 20 20 69 66 20 28 67 65  nt));.    if (ge
42d0: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 21 3d 20 4e  tOptionProc != N
42e0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 28  ULL) {..return (
42f0: 2a 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 29 28  *getOptionProc)(
4300: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e  Tcl_GetChannelIn
4310: 73 74 61 6e 63 65 44 61 74 61 28 70 61 72 65 6e  stanceData(paren
4320: 74 29 2c 20 69 6e 74 65 72 70 2c 20 6f 70 74 69  t), interp, opti
4330: 6f 6e 4e 61 6d 65 2c 20 6f 70 74 69 6f 6e 56 61  onName, optionVa
4340: 6c 75 65 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  lue);.    } else
4350: 20 69 66 20 28 6f 70 74 69 6f 6e 4e 61 6d 65 20   if (optionName 
4360: 3d 3d 20 28 63 68 61 72 2a 29 20 4e 55 4c 4c 29  == (char*) NULL)
4370: 20 7b 0a 09 2f 2a 20 52 65 71 75 65 73 74 20 69   {../* Request i
4380: 73 20 71 75 65 72 79 20 66 6f 72 20 61 6c 6c 20  s query for all 
4390: 6f 70 74 69 6f 6e 73 2c 20 74 68 69 73 20 69 73  options, this is
43a0: 20 6f 6b 2e 20 2a 2f 0a 09 72 65 74 75 72 6e 20   ok. */..return 
43b0: 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c  TCL_OK;.    } el
43c0: 73 65 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72 72  se {..Tcl_SetErr
43d0: 6e 6f 28 45 49 4e 56 41 4c 29 3b 0a 09 72 65 74  no(EINVAL);..ret
43e0: 75 72 6e 20 54 63 6c 5f 42 61 64 43 68 61 6e 6e  urn Tcl_BadChann
43f0: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
4400: 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 4e 55 4c   optionName, NUL
4410: 4c 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a  L);.    }.}../*.
4420: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
4430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4460: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44  --------. *. * D
4470: 69 67 65 73 74 54 69 6d 65 72 48 61 6e 64 6c 65  igestTimerHandle
4480: 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65  r --. *. *.Calle
4490: 64 20 62 79 20 74 68 65 20 6e 6f 74 69 66 69 65  d by the notifie
44a0: 72 20 76 69 61 20 74 69 6d 65 72 20 74 6f 20 66  r via timer to f
44b0: 6c 75 73 68 20 6f 75 74 20 70 65 6e 64 69 6e 67  lush out pending
44c0: 20 69 6e 70 75 74 20 64 61 74 61 2e 0a 20 2a 0a   input data.. *.
44d0: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 4e   * Returns:. *.N
44e0: 6f 74 68 69 6e 67 0a 20 2a 0a 20 2a 20 53 69 64  othing. *. * Sid
44f0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61  e effects:. *.Ma
4500: 79 20 63 61 6c 6c 20 54 63 6c 5f 4e 6f 74 69 66  y call Tcl_Notif
4510: 79 43 68 61 6e 6e 65 6c 0a 20 2a 0a 20 2a 2d 2d  yChannel. *. *--
4520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4560: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
4570: 76 6f 69 64 20 44 69 67 65 73 74 54 69 6d 65 72  void DigestTimer
4580: 48 61 6e 64 6c 65 72 28 43 6c 69 65 6e 74 44 61  Handler(ClientDa
4590: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 29 20 7b  ta clientData) {
45a0: 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65  .    DigestState
45b0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44 69   *statePtr = (Di
45c0: 67 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69  gestState *) cli
45d0: 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70  entData;..    dp
45e0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
45f0: 0a 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 69  ..    /* Abort i
4600: 66 20 6e 6f 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  f no channel */.
4610: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
4620: 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43  ->self == (Tcl_C
4630: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a  hannel) NULL) {.
4640: 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a  .return;.    }..
4650: 20 20 20 20 2f 2a 20 43 6c 65 61 72 20 74 69 6d      /* Clear tim
4660: 65 72 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20  er token */.    
4670: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20  statePtr->timer 
4680: 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65  = (Tcl_TimerToke
4690: 6e 29 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a  n) NULL;..    /*
46a0: 20 46 69 72 65 20 65 76 65 6e 74 20 69 66 20 74   Fire event if t
46b0: 68 65 72 65 20 69 73 20 70 65 6e 64 69 6e 67 20  here is pending 
46c0: 64 61 74 61 2c 20 73 6b 69 70 20 6f 74 68 65 72  data, skip other
46d0: 77 69 73 65 20 2a 2f 0a 20 20 20 20 69 66 20 28  wise */.    if (
46e0: 28 73 74 61 74 65 50 74 72 2d 3e 77 61 74 63 68  (statePtr->watch
46f0: 4d 61 73 6b 20 26 20 54 43 4c 5f 52 45 41 44 41  Mask & TCL_READA
4700: 42 4c 45 29 20 26 26 20 28 54 63 6c 5f 49 6e 70  BLE) && (Tcl_Inp
4710: 75 74 42 75 66 66 65 72 65 64 28 73 74 61 74 65  utBuffered(state
4720: 50 74 72 2d 3e 73 65 6c 66 29 20 3e 20 30 29 29  Ptr->self) > 0))
4730: 20 7b 0a 09 54 63 6c 5f 4e 6f 74 69 66 79 43 68   {..Tcl_NotifyCh
4740: 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e  annel(statePtr->
4750: 73 65 6c 66 2c 20 54 43 4c 5f 52 45 41 44 41 42  self, TCL_READAB
4760: 4c 45 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a  LE);.    }.}../*
4770: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
4780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
47c0: 44 69 67 65 73 74 57 61 74 63 68 50 72 6f 63 20  DigestWatchProc 
47d0: 2d 2d 0a 20 2a 0a 20 2a 09 49 6e 69 74 69 61 6c  --. *. *.Initial
47e0: 69 7a 65 20 74 68 65 20 6e 6f 74 69 66 69 65 72  ize the notifier
47f0: 20 74 6f 20 77 61 74 63 68 20 66 6f 72 20 65 76   to watch for ev
4800: 65 6e 74 73 20 66 72 6f 6d 20 74 68 69 73 20 63  ents from this c
4810: 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65  hannel.. *. * Re
4820: 74 75 72 6e 73 3a 0a 20 2a 09 4e 6f 74 68 69 6e  turns:. *.Nothin
4830: 67 20 28 63 61 6e 27 74 20 72 65 74 75 72 6e 20  g (can't return 
4840: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 29 0a  error messages).
4850: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
4860: 74 73 3a 0a 20 2a 09 43 6f 6e 66 69 67 75 72 65  ts:. *.Configure
4870: 20 6e 6f 74 69 66 69 65 72 20 73 6f 20 66 75 74   notifier so fut
4880: 75 72 65 20 65 76 65 6e 74 73 20 6f 6e 20 74 68  ure events on th
4890: 65 20 63 68 61 6e 6e 65 6c 20 77 69 6c 6c 20 62  e channel will b
48a0: 65 20 73 65 65 6e 20 62 79 20 54 63 6c 2e 0a 20  e seen by Tcl.. 
48b0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
48c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76  ----------. */.v
4900: 6f 69 64 20 44 69 67 65 73 74 57 61 74 63 68 50  oid DigestWatchP
4910: 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 63  roc(ClientData c
4920: 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e 74 20 6d  lientData, int m
4930: 61 73 6b 29 20 7b 0a 20 20 20 20 44 69 67 65 73  ask) {.    Diges
4940: 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72  tState *statePtr
4950: 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20   = (DigestState 
4960: 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20  *) clientData;. 
4970: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 70     Tcl_Channel p
4980: 61 72 65 6e 74 3b 0a 20 20 20 20 54 63 6c 5f 44  arent;.    Tcl_D
4990: 72 69 76 65 72 57 61 74 63 68 50 72 6f 63 20 2a  riverWatchProc *
49a0: 77 61 74 63 68 50 72 6f 63 3b 0a 0a 20 20 20 20  watchProc;..    
49b0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
49c0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74  );..    /* Abort
49d0: 20 69 66 20 6e 6f 20 63 68 61 6e 6e 65 6c 20 2a   if no channel *
49e0: 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  /.    if (stateP
49f0: 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c  tr->self == (Tcl
4a00: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20  _Channel) NULL) 
4a10: 7b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d  {..return;.    }
4a20: 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 4f  ..    /* Store O
4a30: 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  R-ed combination
4a40: 20 6f 66 20 54 43 4c 5f 52 45 41 44 41 42 4c 45   of TCL_READABLE
4a50: 2c 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 20 61  , TCL_WRITABLE a
4a60: 6e 64 20 54 43 4c 5f 45 58 43 45 50 54 49 4f 4e  nd TCL_EXCEPTION
4a70: 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72   */.    statePtr
4a80: 2d 3e 77 61 74 63 68 4d 61 73 6b 20 3d 20 6d 61  ->watchMask = ma
4a90: 73 6b 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 70  sk;..    /* Prop
4aa0: 61 67 61 74 65 20 6d 61 73 6b 20 69 6e 66 6f 20  agate mask info 
4ab0: 74 6f 20 70 61 72 65 6e 74 20 63 68 61 6e 6e 65  to parent channe
4ac0: 6c 20 2a 2f 0a 20 20 20 20 70 61 72 65 6e 74 20  l */.    parent 
4ad0: 3d 20 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 64  = Tcl_GetStacked
4ae0: 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72  Channel(statePtr
4af0: 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 20 77 61 74  ->self);.    wat
4b00: 63 68 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68 61  chProc = Tcl_Cha
4b10: 6e 6e 65 6c 57 61 74 63 68 50 72 6f 63 28 54 63  nnelWatchProc(Tc
4b20: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65  l_GetChannelType
4b30: 28 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 77  (parent));.    w
4b40: 61 74 63 68 50 72 6f 63 28 54 63 6c 5f 47 65 74  atchProc(Tcl_Get
4b50: 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44  ChannelInstanceD
4b60: 61 74 61 28 70 61 72 65 6e 74 29 2c 20 6d 61 73  ata(parent), mas
4b70: 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f  k);..    /* Remo
4b80: 76 65 20 70 65 6e 64 69 6e 67 20 74 69 6d 65 72  ve pending timer
4b90: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74   */.    if (stat
4ba0: 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28  ePtr->timer != (
4bb0: 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20  Tcl_TimerToken) 
4bc0: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c  NULL) {..Tcl_Del
4bd0: 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28  eteTimerHandler(
4be0: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29  statePtr->timer)
4bf0: 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d  ;..statePtr->tim
4c00: 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54  er = (Tcl_TimerT
4c10: 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 20 20 20 20  oken) NULL;.    
4c20: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
4c30: 72 65 20 69 73 20 64 61 74 61 20 70 65 6e 64 69  re is data pendi
4c40: 6e 67 2c 20 73 65 74 20 6e 65 77 20 74 69 6d 65  ng, set new time
4c50: 72 20 74 6f 20 63 61 6c 6c 20 54 63 6c 5f 4e 6f  r to call Tcl_No
4c60: 74 69 66 79 43 68 61 6e 6e 65 6c 20 2a 2f 0a 20  tifyChannel */. 
4c70: 20 20 20 69 66 20 28 28 6d 61 73 6b 20 26 20 54     if ((mask & T
4c80: 43 4c 5f 52 45 41 44 41 42 4c 45 29 20 26 26 20  CL_READABLE) && 
4c90: 28 54 63 6c 5f 49 6e 70 75 74 42 75 66 66 65 72  (Tcl_InputBuffer
4ca0: 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  ed(statePtr->sel
4cb0: 66 29 20 3e 20 30 29 29 20 7b 0a 09 73 74 61 74  f) > 0)) {..stat
4cc0: 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 54 63  ePtr->timer = Tc
4cd0: 6c 5f 43 72 65 61 74 65 54 69 6d 65 72 48 61 6e  l_CreateTimerHan
4ce0: 64 6c 65 72 28 52 45 41 44 5f 44 45 4c 41 59 2c  dler(READ_DELAY,
4cf0: 20 44 69 67 65 73 74 54 69 6d 65 72 48 61 6e 64   DigestTimerHand
4d00: 6c 65 72 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  ler, (ClientData
4d10: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20  ) statePtr);.   
4d20: 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d   }.}../*. *-----
4d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d70: 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 47 65  -. *. * DigestGe
4d80: 74 48 61 6e 64 6c 65 50 72 6f 63 20 2d 2d 0a 20  tHandleProc --. 
4d90: 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 66 72 6f 6d  *. *.Called from
4da0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 48   Tcl_GetChannelH
4db0: 61 6e 64 6c 65 20 74 6f 20 72 65 74 72 69 65 76  andle to retriev
4dc0: 65 20 4f 53 20 73 70 65 63 69 66 69 63 20 66 69  e OS specific fi
4dd0: 6c 65 20 68 61 6e 64 6c 65 0a 20 2a 09 66 72 6f  le handle. *.fro
4de0: 6d 20 69 6e 73 69 64 65 20 74 68 69 73 20 63 68  m inside this ch
4df0: 61 6e 6e 65 6c 2e 20 4e 6f 74 20 75 73 65 64 20  annel. Not used 
4e00: 66 6f 72 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  for transformati
4e10: 6f 6e 73 3f 0a 20 2a 0a 20 2a 20 52 65 74 75 72  ons?. *. * Retur
4e20: 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 66 6f  ns:. *.TCL_OK fo
4e30: 72 20 73 75 63 63 65 73 73 20 6f 72 20 54 43 4c  r success or TCL
4e40: 5f 45 52 52 4f 52 20 66 6f 72 20 65 72 72 6f 72  _ERROR for error
4e50: 20 6f 72 20 69 66 20 6e 6f 74 20 73 75 70 70 6f   or if not suppo
4e60: 72 74 65 64 2e 20 49 66 0a 20 2a 09 64 69 72 65  rted. If. *.dire
4e70: 63 74 69 6f 6e 20 69 73 20 54 43 4c 5f 52 45 41  ction is TCL_REA
4e80: 44 41 42 4c 45 2c 20 73 65 74 73 20 68 61 6e 64  DABLE, sets hand
4e90: 6c 65 50 74 72 20 74 6f 20 74 68 65 20 68 61 6e  lePtr to the han
4ea0: 64 6c 65 20 75 73 65 64 20 66 6f 72 0a 20 2a 09  dle used for. *.
4eb0: 69 6e 70 75 74 2c 20 6f 72 20 69 66 20 54 43 4c  input, or if TCL
4ec0: 5f 57 52 49 54 41 42 4c 45 20 73 65 74 73 20 74  _WRITABLE sets t
4ed0: 6f 20 74 68 65 20 68 61 6e 64 6c 65 20 75 73 65  o the handle use
4ee0: 64 20 66 6f 72 20 6f 75 74 70 75 74 2e 0a 20 2a  d for output.. *
4ef0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
4f00: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d  :. *.None. *. *-
4f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4f50: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69  -----. */.int Di
4f60: 67 65 73 74 47 65 74 48 61 6e 64 6c 65 50 72 6f  gestGetHandlePro
4f70: 63 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  c(ClientData cli
4f80: 65 6e 74 44 61 74 61 2c 20 69 6e 74 20 64 69 72  entData, int dir
4f90: 65 63 74 69 6f 6e 2c 20 43 6c 69 65 6e 74 44 61  ection, ClientDa
4fa0: 74 61 20 2a 68 61 6e 64 6c 65 50 74 72 29 20 7b  ta *handlePtr) {
4fb0: 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65  .    DigestState
4fc0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44 69   *statePtr = (Di
4fd0: 67 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69  gestState *) cli
4fe0: 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 54 63 6c  entData;.    Tcl
4ff0: 5f 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 3b  _Channel parent;
5000: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
5010: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a  alled");..    /*
5020: 20 41 62 6f 72 74 20 69 66 20 6e 6f 20 63 68 61   Abort if no cha
5030: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28  nnel */.    if (
5040: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d  statePtr->self =
5050: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
5060: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
5070: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
5080: 0a 0a 20 20 20 20 70 61 72 65 6e 74 20 3d 20 54  ..    parent = T
5090: 63 6c 5f 47 65 74 53 74 61 63 6b 65 64 43 68 61  cl_GetStackedCha
50a0: 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73  nnel(statePtr->s
50b0: 65 6c 66 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  elf);.    return
50c0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 48   Tcl_GetChannelH
50d0: 61 6e 64 6c 65 28 70 61 72 65 6e 74 2c 20 64 69  andle(parent, di
50e0: 72 65 63 74 69 6f 6e 2c 20 68 61 6e 64 6c 65 50  rection, handleP
50f0: 74 72 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  tr);.}../*. *---
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 2d 2d 2d 2d  ----------------
5140: 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74  ---. *. * Digest
5150: 4e 6f 74 69 66 79 50 72 6f 63 20 2d 2d 0a 20 2a  NotifyProc --. *
5160: 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79 20 54 63  . *.Called by Tc
5170: 6c 20 74 6f 20 69 6e 66 6f 72 6d 20 75 73 20 6f  l to inform us o
5180: 66 20 61 63 74 69 76 69 74 79 20 6f 6e 20 74 68  f activity on th
5190: 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 68 61  e underlying cha
51a0: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 74 75  nnel.. *. * Retu
51b0: 72 6e 73 3a 0a 20 2a 09 55 6e 63 68 61 6e 67 65  rns:. *.Unchange
51c0: 64 20 69 6e 74 65 72 65 73 74 4d 61 73 6b 20 77  d interestMask w
51d0: 68 69 63 68 20 69 73 20 61 6e 20 4f 52 2d 65 64  hich is an OR-ed
51e0: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
51f0: 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 6f 72 20  TCL_READABLE or 
5200: 54 43 4c 5f 57 52 49 54 41 42 4c 45 0a 20 2a 0a  TCL_WRITABLE. *.
5210: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
5220: 0a 20 2a 09 43 61 6e 63 65 6c 73 20 61 6e 79 20  . *.Cancels any 
5230: 70 65 6e 64 69 6e 67 20 74 69 6d 65 72 2e 0a 20  pending timer.. 
5240: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
5250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69  ----------. */.i
5290: 6e 74 20 44 69 67 65 73 74 4e 6f 74 69 66 79 50  nt DigestNotifyP
52a0: 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 63  roc(ClientData c
52b0: 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e 74 20 69  lientData, int i
52c0: 6e 74 65 72 65 73 74 4d 61 73 6b 29 20 7b 0a 20  nterestMask) {. 
52d0: 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a     DigestState *
52e0: 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65  statePtr = (Dige
52f0: 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e  stState *) clien
5300: 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69  tData;..    dpri
5310: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
5320: 20 20 20 20 2f 2a 20 53 6b 69 70 20 74 69 6d 65      /* Skip time
5330: 72 20 65 76 65 6e 74 20 61 73 20 72 65 64 75 6e  r event as redun
5340: 64 61 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20 28  dant */.    if (
5350: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20  statePtr->timer 
5360: 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b  != (Tcl_TimerTok
5370: 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c  en) NULL) {..Tcl
5380: 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64  _DeleteTimerHand
5390: 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69  ler(statePtr->ti
53a0: 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d  mer);..statePtr-
53b0: 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69  >timer = (Tcl_Ti
53c0: 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a  merToken) NULL;.
53d0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
53e0: 20 69 6e 74 65 72 65 73 74 4d 61 73 6b 3b 0a 7d   interestMask;.}
53f0: 0a 0a 2f 2a 0a 20 2a 0a 20 2a 20 43 68 61 6e 6e  ../*. *. * Chann
5400: 65 6c 20 74 79 70 65 20 73 74 72 75 63 74 75 72  el type structur
5410: 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72  e definition for
5420: 20 64 69 67 65 73 74 20 74 72 61 6e 73 66 6f 72   digest transfor
5430: 6d 61 74 69 6f 6e 73 2e 0a 20 2a 0a 20 2a 2f 0a  mations.. *. */.
5440: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 54 63 6c  static const Tcl
5450: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 64 69 67  _ChannelType dig
5460: 65 73 74 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d  estChannelType =
5470: 20 7b 0a 20 20 20 20 22 64 69 67 65 73 74 22 2c   {.    "digest",
5480: 09 09 09 2f 2a 20 54 79 70 65 20 6e 61 6d 65 20  .../* Type name 
5490: 2a 2f 0a 20 20 20 20 54 43 4c 5f 43 48 41 4e 4e  */.    TCL_CHANN
54a0: 45 4c 5f 56 45 52 53 49 4f 4e 5f 35 2c 09 2f 2a  EL_VERSION_5,./*
54b0: 20 76 35 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20   v5 channel */. 
54c0: 20 20 20 44 69 67 65 73 74 43 6c 6f 73 65 50 72     DigestClosePr
54d0: 6f 63 2c 09 09 2f 2a 20 43 6c 6f 73 65 20 70 72  oc,../* Close pr
54e0: 6f 63 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74  oc */.    Digest
54f0: 49 6e 70 75 74 50 72 6f 63 2c 09 09 2f 2a 20 49  InputProc,../* I
5500: 6e 70 75 74 20 70 72 6f 63 20 2a 2f 0a 20 20 20  nput proc */.   
5510: 20 44 69 67 65 73 74 4f 75 74 70 75 74 50 72 6f   DigestOutputPro
5520: 63 2c 09 09 2f 2a 20 4f 75 74 70 75 74 20 70 72  c,../* Output pr
5530: 6f 63 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09  oc */.    NULL,.
5540: 09 09 2f 2a 20 53 65 65 6b 20 70 72 6f 63 20 2a  ../* Seek proc *
5550: 2f 0a 20 20 20 20 44 69 67 65 73 74 53 65 74 4f  /.    DigestSetO
5560: 70 74 69 6f 6e 50 72 6f 63 2c 09 2f 2a 20 53 65  ptionProc,./* Se
5570: 74 20 6f 70 74 69 6f 6e 20 70 72 6f 63 20 2a 2f  t option proc */
5580: 0a 20 20 20 20 44 69 67 65 73 74 47 65 74 4f 70  .    DigestGetOp
5590: 74 69 6f 6e 50 72 6f 63 2c 09 2f 2a 20 47 65 74  tionProc,./* Get
55a0: 20 6f 70 74 69 6f 6e 20 70 72 6f 63 20 2a 2f 0a   option proc */.
55b0: 20 20 20 20 44 69 67 65 73 74 57 61 74 63 68 50      DigestWatchP
55c0: 72 6f 63 2c 09 09 2f 2a 20 49 6e 69 74 69 61 6c  roc,../* Initial
55d0: 69 7a 65 20 6e 6f 74 69 66 69 65 72 20 2a 2f 0a  ize notifier */.
55e0: 20 20 20 20 44 69 67 65 73 74 47 65 74 48 61 6e      DigestGetHan
55f0: 64 6c 65 50 72 6f 63 2c 09 2f 2a 20 47 65 74 20  dleProc,./* Get 
5600: 4f 53 20 68 61 6e 64 6c 65 73 20 6f 75 74 20 6f  OS handles out o
5610: 66 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20  f channel */.   
5620: 20 44 69 67 65 73 74 43 6c 6f 73 65 32 50 72 6f   DigestClose2Pro
5630: 63 2c 09 09 2f 2a 20 63 6c 6f 73 65 32 70 72 6f  c,../* close2pro
5640: 63 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 42  c */.    DigestB
5650: 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 2c 09 2f 2a  lockModeProc,./*
5660: 20 53 65 74 20 62 6c 6f 63 6b 69 6e 67 2f 6e 6f   Set blocking/no
5670: 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2a 2f  nblocking mode*/
5680: 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20  .    NULL,.../* 
5690: 46 6c 75 73 68 20 70 72 6f 63 20 2a 2f 0a 20 20  Flush proc */.  
56a0: 20 20 44 69 67 65 73 74 4e 6f 74 69 66 79 50 72    DigestNotifyPr
56b0: 6f 63 2c 09 09 2f 2a 20 48 61 6e 64 6c 69 6e 67  oc,../* Handling
56c0: 20 6f 66 20 65 76 65 6e 74 73 20 62 75 62 62 6c   of events bubbl
56d0: 69 6e 67 20 75 70 20 2a 2f 0a 20 20 20 20 4e 55  ing up */.    NU
56e0: 4c 4c 2c 09 09 09 2f 2a 20 57 69 64 65 20 73 65  LL,.../* Wide se
56f0: 65 6b 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 4e  ek proc */.    N
5700: 55 4c 4c 2c 09 09 09 2f 2a 20 54 68 72 65 61 64  ULL,.../* Thread
5710: 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 4e   action */.    N
5720: 55 4c 4c 09 09 09 2f 2a 20 54 72 75 6e 63 61 74  ULL.../* Truncat
5730: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2d 2d  e */.};../*. *--
5740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5780: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73  ----. *. * Diges
5790: 74 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 20  tChannelHandler 
57a0: 2d 2d 0a 20 2a 0a 20 2a 09 43 72 65 61 74 65 20  --. *. *.Create 
57b0: 61 20 73 74 61 63 6b 65 64 20 63 68 61 6e 6e 65  a stacked channe
57c0: 6c 20 66 6f 72 20 61 20 6d 65 73 73 61 67 65 20  l for a message 
57d0: 64 69 67 65 73 74 20 74 72 61 6e 73 66 6f 72 6d  digest transform
57e0: 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74  ation.. *. * Ret
57f0: 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20  urns:. *.TCL_OK 
5800: 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a  or TCL_ERROR. *.
5810: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
5820: 0a 20 2a 09 41 64 64 73 20 74 72 61 6e 73 66 6f  . *.Adds transfo
5830: 72 6d 20 74 6f 20 63 68 61 6e 6e 65 6c 20 61 6e  rm to channel an
5840: 64 20 73 65 74 73 20 72 65 73 75 6c 74 20 74 6f  d sets result to
5850: 20 63 68 61 6e 6e 65 6c 20 69 64 20 6f 72 20 65   channel id or e
5860: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a  rror message.. *
5870: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
5880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
58a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
58b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
58c0: 61 74 69 63 20 69 6e 74 20 44 69 67 65 73 74 43  atic int DigestC
58d0: 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 28 54 63  hannelHandler(Tc
58e0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
58f0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 68  , const char *ch
5900: 61 6e 6e 65 6c 2c 20 54 63 6c 5f 4f 62 6a 20 2a  annel, Tcl_Obj *
5910: 64 69 67 65 73 74 4f 62 6a 2c 0a 09 54 63 6c 5f  digestObj,..Tcl_
5920: 4f 62 6a 20 2a 63 69 70 68 65 72 4f 62 6a 2c 20  Obj *cipherObj, 
5930: 69 6e 74 20 66 6f 72 6d 61 74 2c 20 54 63 6c 5f  int format, Tcl_
5940: 4f 62 6a 20 2a 6b 65 79 4f 62 6a 2c 20 54 63 6c  Obj *keyObj, Tcl
5950: 5f 4f 62 6a 20 2a 6d 61 63 4f 62 6a 2c 20 69 6e  _Obj *macObj, in
5960: 74 20 6c 65 6e 67 74 68 29 20 7b 0a 20 20 20 20  t length) {.    
5970: 69 6e 74 20 6d 6f 64 65 3b 20 2f 2a 20 4f 52 2d  int mode; /* OR-
5980: 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f  ed combination o
5990: 66 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 61  f TCL_READABLE a
59a0: 6e 64 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 20  nd TCL_WRITABLE 
59b0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e  */.    Tcl_Chann
59c0: 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 44 69 67  el chan;.    Dig
59d0: 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50  estState *stateP
59e0: 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  tr;..    dprintf
59f0: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
5a00: 20 2f 2a 20 56 61 6c 69 64 61 74 65 20 61 72 67   /* Validate arg
5a10: 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 68 61  s */.    if (cha
5a20: 6e 6e 65 6c 20 3d 3d 20 28 63 6f 6e 73 74 20 63  nnel == (const c
5a30: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09  har *) NULL) {..
5a40: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
5a50: 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20 63 68 61  (interp, "No cha
5a60: 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 20  nnel", (char *) 
5a70: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
5a80: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
5a90: 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 68 61 6e  .    /* Get chan
5aa0: 6e 65 6c 20 49 64 20 2a 2f 0a 20 20 20 20 63 68  nel Id */.    ch
5ab0: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e  an = Tcl_GetChan
5ac0: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  nel(interp, chan
5ad0: 6e 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20  nel, &mode);.   
5ae0: 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63   if (chan == (Tc
5af0: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29  l_Channel) NULL)
5b00: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
5b10: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
5b20: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f   /* Make sure to
5b30: 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
5b40: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20  topmost channel 
5b50: 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  */.    chan = Tc
5b60: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28  l_GetTopChannel(
5b70: 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  chan);..    /* C
5b80: 6f 6e 66 69 67 75 72 65 20 63 68 61 6e 6e 65 6c  onfigure channel
5b90: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 65 74 43   */.    Tcl_SetC
5ba0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
5bb0: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61  erp, chan, "-tra
5bc0: 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61  nslation", "bina
5bd0: 72 79 22 29 3b 0a 20 20 20 20 69 66 20 28 54 63  ry");.    if (Tc
5be0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 42 75 66 66  l_GetChannelBuff
5bf0: 65 72 53 69 7a 65 28 63 68 61 6e 29 20 3c 20 45  erSize(chan) < E
5c00: 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45 20 2a  VP_MAX_MD_SIZE *
5c10: 20 32 29 20 7b 0a 09 54 63 6c 5f 53 65 74 43 68   2) {..Tcl_SetCh
5c20: 61 6e 6e 65 6c 42 75 66 66 65 72 53 69 7a 65 28  annelBufferSize(
5c30: 63 68 61 6e 2c 20 45 56 50 5f 4d 41 58 5f 4d 44  chan, EVP_MAX_MD
5c40: 5f 53 49 5a 45 20 2a 20 32 29 3b 0a 20 20 20 20  _SIZE * 2);.    
5c50: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  }..    /* Create
5c60: 20 73 74 61 74 65 20 64 61 74 61 20 73 74 72 75   state data stru
5c70: 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 69 66 20  cture */.    if 
5c80: 28 28 73 74 61 74 65 50 74 72 20 3d 20 44 69 67  ((statePtr = Dig
5c90: 65 73 74 53 74 61 74 65 4e 65 77 28 69 6e 74 65  estStateNew(inte
5ca0: 72 70 2c 20 66 6f 72 6d 61 74 2c 20 6c 65 6e 67  rp, format, leng
5cb0: 74 68 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  th)) == NULL) {.
5cc0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
5cd0: 74 28 69 6e 74 65 72 70 2c 20 22 4d 65 6d 6f 72  t(interp, "Memor
5ce0: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
5cf0: 6f 72 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  or", (char *) NU
5d00: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
5d10: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
5d20: 20 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66    statePtr->self
5d30: 20 3d 20 63 68 61 6e 3b 0a 20 20 20 20 73 74 61   = chan;.    sta
5d40: 74 65 50 74 72 2d 3e 6d 6f 64 65 20 3d 20 6d 6f  tePtr->mode = mo
5d50: 64 65 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74  de;..    /* Init
5d60: 69 61 6c 69 7a 65 20 68 61 73 68 20 66 75 6e 63  ialize hash func
5d70: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28  tion */.    if (
5d80: 44 69 67 65 73 74 49 6e 69 74 69 61 6c 69 7a 65  DigestInitialize
5d90: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
5da0: 72 2c 20 64 69 67 65 73 74 4f 62 6a 2c 20 63 69  r, digestObj, ci
5db0: 70 68 65 72 4f 62 6a 2c 20 6b 65 79 4f 62 6a 2c  pherObj, keyObj,
5dc0: 20 6d 61 63 4f 62 6a 29 20 21 3d 20 54 43 4c 5f   macObj) != TCL_
5dd0: 4f 4b 29 20 7b 0a 09 44 69 67 65 73 74 53 74 61  OK) {..DigestSta
5de0: 74 65 46 72 65 65 28 73 74 61 74 65 50 74 72 29  teFree(statePtr)
5df0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
5e00: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
5e10: 2f 2a 20 53 74 61 63 6b 20 63 68 61 6e 6e 65 6c  /* Stack channel
5e20: 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72   */.    statePtr
5e30: 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53 74 61  ->self = Tcl_Sta
5e40: 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  ckChannel(interp
5e50: 2c 20 26 64 69 67 65 73 74 43 68 61 6e 6e 65 6c  , &digestChannel
5e60: 54 79 70 65 2c 20 28 43 6c 69 65 6e 74 44 61 74  Type, (ClientDat
5e70: 61 29 20 73 74 61 74 65 50 74 72 2c 20 6d 6f 64  a) statePtr, mod
5e80: 65 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 69 66  e, chan);.    if
5e90: 20 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66   (statePtr->self
5ea0: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c   == (Tcl_Channel
5eb0: 29 20 4e 55 4c 4c 29 20 7b 0a 09 44 69 67 65 73  ) NULL) {..Diges
5ec0: 74 53 74 61 74 65 46 72 65 65 28 73 74 61 74 65  tStateFree(state
5ed0: 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  Ptr);..return TC
5ee0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
5ef0: 20 20 20 20 2f 2a 20 53 65 74 20 72 65 73 75 6c      /* Set resul
5f00: 74 20 74 6f 20 63 68 61 6e 6e 65 6c 20 49 64 20  t to channel Id 
5f10: 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  */.    Tcl_SetRe
5f20: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
5f30: 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61  ar *) Tcl_GetCha
5f40: 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 20  nnelName(chan), 
5f50: 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20  TCL_VOLATILE);. 
5f60: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
5f70: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ;.}../*. *------
5f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fc0: 0a 20 2a 0a 20 2a 20 55 6e 73 74 61 63 6b 20 43  . *. * Unstack C
5fd0: 68 61 6e 6e 65 6c 20 2d 2d 0a 20 2a 0a 20 2a 09  hannel --. *. *.
5fe0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
5ff0: 6d 6f 76 65 73 20 74 68 65 20 73 74 61 63 6b 65  moves the stacke
6000: 64 20 63 68 61 6e 6e 65 6c 20 66 72 6f 6d 20 74  d channel from t
6010: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a 20 2a  he top of the. *
6020: 09 63 68 61 6e 6e 65 6c 20 73 74 61 63 6b 20 69  .channel stack i
6030: 66 20 69 74 20 69 73 20 61 20 64 69 67 65 73 74  f it is a digest
6040: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20   channel.. *. * 
6050: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f  Returns:. *.TCL_
6060: 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a  OK or TCL_ERROR.
6070: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
6080: 74 73 3a 0a 20 2a 09 52 65 6d 6f 76 65 73 20 74  ts:. *.Removes t
6090: 72 61 6e 73 66 6f 72 6d 20 66 72 6f 6d 20 63 68  ransform from ch
60a0: 61 6e 6e 65 6c 20 6f 72 20 73 65 74 73 20 72 65  annel or sets re
60b0: 73 75 6c 74 20 74 6f 20 65 72 72 6f 72 20 6d 65  sult to error me
60c0: 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  ssage.. *. *----
60d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6110: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
6120: 74 20 44 69 67 65 73 74 55 6e 73 74 61 63 6b 4f  t DigestUnstackO
6130: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
6140: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
6150: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
6160: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
6170: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
6180: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  ) {.    Tcl_Chan
6190: 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 69 6e  nel chan;.    in
61a0: 74 20 6d 6f 64 65 3b 20 2f 2a 20 4f 52 2d 65 64  t mode; /* OR-ed
61b0: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
61c0: 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 61 6e 64  TCL_READABLE and
61d0: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 20 20 2a   TCL_WRITABLE  *
61e0: 2f 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69  /.    (void) cli
61f0: 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70  entData;..    dp
6200: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
6210: 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74  ..    /* Validat
6220: 65 20 61 72 67 20 63 6f 75 6e 74 20 2a 2f 0a 20  e arg count */. 
6230: 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32     if (objc != 2
6240: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75  ) {..Tcl_WrongNu
6250: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
6260: 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 49   objv, "channelI
6270: 64 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  d");..return TCL
6280: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
6290: 20 20 20 2f 2a 20 47 65 74 20 63 68 61 6e 6e 65     /* Get channe
62a0: 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20  l */.    chan = 
62b0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69  Tcl_GetChannel(i
62c0: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
62d0: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
62e0: 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63  mode);.    if (c
62f0: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  han == (Tcl_Chan
6300: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  nel) NULL) {..re
6310: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6320: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
6330: 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61  ke sure to opera
6340: 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73  te on the topmos
6350: 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20  t channel */.   
6360: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54   chan = Tcl_GetT
6370: 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b  opChannel(chan);
6380: 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69  ..    /* Check i
6390: 66 20 64 69 67 65 73 74 20 63 68 61 6e 6e 65 6c  f digest channel
63a0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f   */.    if (Tcl_
63b0: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63  GetChannelType(c
63c0: 68 61 6e 29 20 21 3d 20 26 64 69 67 65 73 74 43  han) != &digestC
63d0: 68 61 6e 6e 65 6c 54 79 70 65 29 20 7b 0a 09 54  hannelType) {..T
63e0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
63f0: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61  interp, "bad cha
6400: 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65  nnel \"", Tcl_Ge
6410: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61  tChannelName(cha
6420: 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f  n),..    "\": no
6430: 74 20 61 20 64 69 67 65 73 74 20 63 68 61 6e 6e  t a digest chann
6440: 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  el", (char *) NU
6450: 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72  LL);..Tcl_SetErr
6460: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22  orCode(interp, "
6470: 54 4c 53 22 2c 20 22 55 4e 53 54 41 43 4b 22 2c  TLS", "UNSTACK",
6480: 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56   "CHANNEL", "INV
6490: 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ALID", (char *) 
64a0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
64b0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
64c0: 0a 20 20 20 20 2f 2a 20 50 6f 70 20 74 72 61 6e  .    /* Pop tran
64d0: 73 66 6f 72 6d 20 66 72 6f 6d 20 63 68 61 6e 6e  sform from chann
64e0: 65 6c 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  el */.    return
64f0: 20 54 63 6c 5f 55 6e 73 74 61 63 6b 43 68 61 6e   Tcl_UnstackChan
6500: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  nel(interp, chan
6510: 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  );.}../*********
6520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
6560: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
6570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65a0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65  -----. *. * Dige
65b0: 73 74 49 6e 73 74 61 6e 63 65 4f 62 6a 43 6d 64  stInstanceObjCmd
65c0: 20 2d 2d 0a 20 2a 0a 20 2a 09 48 61 6e 64 6c 65   --. *. *.Handle
65d0: 72 20 66 6f 72 20 64 69 67 65 73 74 20 63 6f 6d  r for digest com
65e0: 6d 61 6e 64 20 69 6e 73 74 61 6e 63 65 73 2e 20  mand instances. 
65f0: 55 73 65 64 20 74 6f 20 61 64 64 20 64 61 74 61  Used to add data
6600: 20 74 6f 20 68 61 73 68 0a 20 2a 09 66 75 6e 63   to hash. *.func
6610: 74 69 6f 6e 20 6f 72 20 72 65 74 72 69 65 76 65  tion or retrieve
6620: 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 2e   message digest.
6630: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a  . *. * Returns:.
6640: 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c   *.TCL_OK or TCL
6650: 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64  _ERROR. *. * Sid
6660: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 41 64  e effects:. *.Ad
6670: 64 73 20 64 61 74 61 20 74 6f 20 68 61 73 68 20  ds data to hash 
6680: 6f 72 20 72 65 74 75 72 6e 73 20 6d 65 73 73 61  or returns messa
6690: 67 65 20 64 69 67 65 73 74 0a 20 2a 0a 20 2a 2d  ge digest. *. *-
66a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
66b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
66c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
66d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
66e0: 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73  --. */.int Diges
66f0: 74 49 6e 73 74 61 6e 63 65 4f 62 6a 43 6d 64 28  tInstanceObjCmd(
6700: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
6710: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
6720: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
6730: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
6740: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
6750: 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73    DigestState *s
6760: 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 73  tatePtr = (Diges
6770: 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74  tState *) client
6780: 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 66 6e  Data;.    int fn
6790: 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 64  ;.    Tcl_Size d
67a0: 61 74 61 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 20  ata_len = 0;.   
67b0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
67c0: 64 61 74 61 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  data = NULL;.   
67d0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
67e0: 61 72 20 2a 69 6e 73 74 61 6e 63 65 5f 66 6e 73  ar *instance_fns
67f0: 20 5b 5d 20 3d 20 7b 20 22 66 69 6e 61 6c 69 7a   [] = { "finaliz
6800: 65 22 2c 20 22 75 70 64 61 74 65 22 2c 20 4e 55  e", "update", NU
6810: 4c 4c 20 7d 3b 0a 0a 20 20 20 20 64 70 72 69 6e  LL };..    dprin
6820: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
6830: 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 65 20 61     /* Validate a
6840: 72 67 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20  rg count */.    
6850: 69 66 20 28 6f 62 6a 63 20 3c 20 32 20 7c 7c 20  if (objc < 2 || 
6860: 6f 62 6a 63 20 3e 20 33 29 20 7b 0a 09 54 63 6c  objc > 3) {..Tcl
6870: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
6880: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
6890: 66 75 6e 63 74 69 6f 6e 20 3f 64 61 74 61 3f 22  function ?data?"
68a0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
68b0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
68c0: 20 2f 2a 20 47 65 74 20 66 75 6e 63 74 69 6f 6e   /* Get function
68d0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f   */.    if (Tcl_
68e0: 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28  GetIndexFromObj(
68f0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c  interp, objv[1],
6900: 20 69 6e 73 74 61 6e 63 65 5f 66 6e 73 2c 20 22   instance_fns, "
6910: 66 75 6e 63 74 69 6f 6e 22 2c 20 30 2c 20 26 66  function", 0, &f
6920: 6e 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  n) != TCL_OK) {.
6930: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
6940: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
6950: 20 44 6f 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a   Do function */.
6960: 20 20 20 20 69 66 20 28 66 6e 29 20 7b 0a 09 2f      if (fn) {../
6970: 2a 20 47 65 74 20 64 61 74 61 20 6f 72 20 72 65  * Get data or re
6980: 74 75 72 6e 20 65 72 72 6f 72 20 69 66 20 6e 6f  turn error if no
6990: 6e 65 20 2a 2f 0a 09 69 66 20 28 6f 62 6a 63 20  ne */..if (objc 
69a0: 3d 3d 20 33 29 20 7b 0a 09 20 20 20 20 64 61 74  == 3) {..    dat
69b0: 61 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41  a = Tcl_GetByteA
69c0: 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  rrayFromObj(objv
69d0: 5b 32 5d 2c 20 26 64 61 74 61 5f 6c 65 6e 29 3b  [2], &data_len);
69e0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
69f0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
6a00: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
6a10: 2c 20 22 75 70 64 61 74 65 20 64 61 74 61 22 29  , "update data")
6a20: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
6a30: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a  L_ERROR;..}.../*
6a40: 20 55 70 64 61 74 65 20 68 61 73 68 20 66 75 6e   Update hash fun
6a50: 63 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 44 69  ction */..if (Di
6a60: 67 65 73 74 55 70 64 61 74 65 28 73 74 61 74 65  gestUpdate(state
6a70: 50 74 72 2c 20 28 63 68 61 72 20 2a 29 20 64 61  Ptr, (char *) da
6a80: 74 61 2c 20 64 61 74 61 5f 6c 65 6e 2c 20 31 29  ta, data_len, 1)
6a90: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20   != TCL_OK) {.. 
6aa0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
6ab0: 52 4f 52 3b 0a 09 7d 0a 0a 20 20 20 20 7d 20 65  ROR;..}..    } e
6ac0: 6c 73 65 20 7b 0a 09 2f 2a 20 46 69 6e 61 6c 69  lse {../* Finali
6ad0: 7a 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e  ze hash function
6ae0: 20 61 6e 64 20 63 61 6c 63 75 6c 61 74 65 20 6d   and calculate m
6af0: 65 73 73 61 67 65 20 64 69 67 65 73 74 20 2a 2f  essage digest */
6b00: 0a 09 69 66 20 28 44 69 67 65 73 74 46 69 6e 61  ..if (DigestFina
6b10: 6c 69 7a 65 28 69 6e 74 65 72 70 2c 20 73 74 61  lize(interp, sta
6b20: 74 65 50 74 72 2c 20 4e 55 4c 4c 29 20 21 3d 20  tePtr, NULL) != 
6b30: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 72  TCL_OK) {..    r
6b40: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
6b50: 0a 09 7d 0a 0a 09 54 63 6c 5f 44 65 6c 65 74 65  ..}...Tcl_Delete
6b60: 43 6f 6d 6d 61 6e 64 46 72 6f 6d 54 6f 6b 65 6e  CommandFromToken
6b70: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
6b80: 72 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d  r->token);.    }
6b90: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
6ba0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  OK;.}../*. *----
6bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
6bf0: 20 2a 0a 20 2a 20 44 69 67 65 73 74 43 6f 6d 6d   *. * DigestComm
6c00: 61 6e 64 44 65 6c 65 74 65 48 61 6e 64 6c 65 72  andDeleteHandler
6c10: 20 2d 2d 0a 20 2a 0a 20 2a 09 20 43 61 6c 6c 62   --. *. *. Callb
6c20: 61 63 6b 20 74 6f 20 63 6c 65 61 6e 2d 75 70 20  ack to clean-up 
6c30: 77 68 65 6e 20 64 69 67 65 73 74 20 69 6e 73 74  when digest inst
6c40: 61 6e 63 65 20 63 6f 6d 6d 61 6e 64 20 69 73 20  ance command is 
6c50: 64 65 6c 65 74 65 64 2e 0a 20 2a 0a 20 2a 20 52  deleted.. *. * R
6c60: 65 74 75 72 6e 73 3a 0a 20 2a 09 4e 6f 74 68 69  eturns:. *.Nothi
6c70: 6e 67 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ng. *. * Side ef
6c80: 66 65 63 74 73 3a 0a 20 2a 09 44 65 73 74 72 6f  fects:. *.Destro
6c90: 79 73 20 73 74 61 74 65 20 69 6e 66 6f 20 73 74  ys state info st
6ca0: 72 75 63 74 75 72 65 0a 20 2a 0a 20 2a 2d 2d 2d  ructure. *. *---
6cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6cf0: 0a 20 2a 2f 0a 76 6f 69 64 20 44 69 67 65 73 74  . */.void Digest
6d00: 43 6f 6d 6d 61 6e 64 44 65 6c 65 74 65 48 61 6e  CommandDeleteHan
6d10: 64 6c 65 72 28 43 6c 69 65 6e 74 44 61 74 61 20  dler(ClientData 
6d20: 63 6c 69 65 6e 74 44 61 74 61 29 20 7b 0a 20 20  clientData) {.  
6d30: 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73    DigestState *s
6d40: 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 73  tatePtr = (Diges
6d50: 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74  tState *) client
6d60: 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e  Data;..    dprin
6d70: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
6d80: 20 20 20 2f 2a 20 43 6c 65 61 6e 2d 75 70 20 2a     /* Clean-up *
6d90: 2f 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74  /.    DigestStat
6da0: 65 46 72 65 65 28 73 74 61 74 65 50 74 72 29 3b  eFree(statePtr);
6db0: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
6dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
6e00: 20 2a 20 44 69 67 65 73 74 43 6f 6d 6d 61 6e 64   * DigestCommand
6e10: 48 61 6e 64 6c 65 72 20 2d 2d 0a 20 2a 0a 20 2a  Handler --. *. *
6e20: 09 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64  . Create command
6e30: 20 74 6f 20 61 6c 6c 6f 77 20 75 73 65 72 20 74   to allow user t
6e40: 6f 20 61 64 64 20 64 61 74 61 20 74 6f 20 68 61  o add data to ha
6e50: 73 68 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 0a  sh function.. *.
6e60: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54   * Returns:. *.T
6e70: 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52  CL_OK or TCL_ERR
6e80: 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  OR. *. * Side ef
6e90: 66 65 63 74 73 3a 0a 20 2a 09 43 72 65 61 74 65  fects:. *.Create
6ea0: 73 20 63 6f 6d 6d 61 6e 64 20 6f 72 20 65 72 72  s command or err
6eb0: 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a  or message. *. *
6ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f00: 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65  ---. */.int Dige
6f10: 73 74 43 6f 6d 6d 61 6e 64 48 61 6e 64 6c 65 72  stCommandHandler
6f20: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
6f30: 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d  erp, Tcl_Obj *cm
6f40: 64 4f 62 6a 2c 20 54 63 6c 5f 4f 62 6a 20 2a 64  dObj, Tcl_Obj *d
6f50: 69 67 65 73 74 4f 62 6a 2c 0a 09 54 63 6c 5f 4f  igestObj,..Tcl_O
6f60: 62 6a 20 2a 63 69 70 68 65 72 4f 62 6a 2c 20 69  bj *cipherObj, i
6f70: 6e 74 20 66 6f 72 6d 61 74 2c 20 54 63 6c 5f 4f  nt format, Tcl_O
6f80: 62 6a 20 2a 6b 65 79 4f 62 6a 2c 20 54 63 6c 5f  bj *keyObj, Tcl_
6f90: 4f 62 6a 20 2a 6d 61 63 4f 62 6a 2c 20 69 6e 74  Obj *macObj, int
6fa0: 20 6c 65 6e 67 74 68 29 20 7b 0a 20 20 20 20 44   length) {.    D
6fb0: 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74  igestState *stat
6fc0: 65 50 74 72 3b 0a 20 20 20 20 63 68 61 72 20 2a  ePtr;.    char *
6fd0: 63 6d 64 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65  cmdName = Tcl_Ge
6fe0: 74 53 74 72 69 6e 67 28 63 6d 64 4f 62 6a 29 3b  tString(cmdObj);
6ff0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
7000: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a  alled");..    /*
7010: 20 43 72 65 61 74 65 20 73 74 61 74 65 20 64 61   Create state da
7020: 74 61 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ta structure */.
7030: 20 20 20 20 69 66 20 28 28 73 74 61 74 65 50 74      if ((statePt
7040: 72 20 3d 20 44 69 67 65 73 74 53 74 61 74 65 4e  r = DigestStateN
7050: 65 77 28 69 6e 74 65 72 70 2c 20 66 6f 72 6d 61  ew(interp, forma
7060: 74 2c 20 6c 65 6e 67 74 68 29 29 20 3d 3d 20 4e  t, length)) == N
7070: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  ULL) {..Tcl_Appe
7080: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
7090: 20 22 4d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74   "Memory allocat
70a0: 69 6f 6e 20 65 72 72 6f 72 22 2c 20 28 63 68 61  ion error", (cha
70b0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  r *) NULL);..ret
70c0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
70d0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 69     }..    /* Ini
70e0: 74 69 61 6c 69 7a 65 20 68 61 73 68 20 66 75 6e  tialize hash fun
70f0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 20  ction */.    if 
7100: 28 44 69 67 65 73 74 49 6e 69 74 69 61 6c 69 7a  (DigestInitializ
7110: 65 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50  e(interp, stateP
7120: 74 72 2c 20 64 69 67 65 73 74 4f 62 6a 2c 20 63  tr, digestObj, c
7130: 69 70 68 65 72 4f 62 6a 2c 20 6b 65 79 4f 62 6a  ipherObj, keyObj
7140: 2c 20 6d 61 63 4f 62 6a 29 20 21 3d 20 54 43 4c  , macObj) != TCL
7150: 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  _OK) {..return T
7160: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
7170: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 69  .    /* Create i
7180: 6e 73 74 61 6e 63 65 20 63 6f 6d 6d 61 6e 64 20  nstance command 
7190: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  */.    statePtr-
71a0: 3e 74 6f 6b 65 6e 20 3d 20 54 63 6c 5f 43 72 65  >token = Tcl_Cre
71b0: 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
71c0: 74 65 72 70 2c 20 63 6d 64 4e 61 6d 65 2c 20 44  terp, cmdName, D
71d0: 69 67 65 73 74 49 6e 73 74 61 6e 63 65 4f 62 6a  igestInstanceObj
71e0: 43 6d 64 2c 0a 09 28 43 6c 69 65 6e 74 44 61 74  Cmd,..(ClientDat
71f0: 61 29 20 73 74 61 74 65 50 74 72 2c 20 44 69 67  a) statePtr, Dig
7200: 65 73 74 43 6f 6d 6d 61 6e 64 44 65 6c 65 74 65  estCommandDelete
7210: 48 61 6e 64 6c 65 72 29 3b 0a 20 20 20 20 69 66  Handler);.    if
7220: 20 28 73 74 61 74 65 50 74 72 2d 3e 74 6f 6b 65   (statePtr->toke
7230: 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 44 69  n == NULL) {..Di
7240: 67 65 73 74 53 74 61 74 65 46 72 65 65 28 73 74  gestStateFree(st
7250: 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e  atePtr);..return
7260: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
7270: 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  }..    /* Return
7280: 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 2a 2f   command name */
7290: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
72a0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 63 6d  esult(interp, cm
72b0: 64 4f 62 6a 29 3b 0a 20 20 20 20 72 65 74 75 72  dObj);.    retur
72c0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  n TCL_OK;.}.../*
72d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
72e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
72f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7310: 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  **/../*. *------
7320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
7360: 0a 20 2a 20 44 69 67 65 73 74 44 61 74 61 48 61  . * DigestDataHa
7370: 6e 64 6c 65 72 20 2d 2d 0a 20 2a 0a 20 2a 09 52  ndler --. *. *.R
7380: 65 74 75 72 6e 20 6d 65 73 73 61 67 65 20 64 69  eturn message di
7390: 67 65 73 74 20 66 6f 72 20 64 61 74 61 20 75 73  gest for data us
73a0: 69 6e 67 20 75 73 65 72 20 73 70 65 63 69 66 69  ing user specifi
73b0: 65 64 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e  ed hash function
73c0: 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a  .. *. * Returns:
73d0: 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43  . *.TCL_OK or TC
73e0: 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69  L_ERROR. *. * Si
73f0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53  de effects:. *.S
7400: 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20 6d 65  ets result to me
7410: 73 73 61 67 65 20 64 69 67 65 73 74 20 6f 72 20  ssage digest or 
7420: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a  error message. *
7430: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
7440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7470: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44  ------. */.int D
7480: 69 67 65 73 74 44 61 74 61 48 61 6e 64 6c 65 72  igestDataHandler
7490: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
74a0: 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 64 61  erp, Tcl_Obj *da
74b0: 74 61 4f 62 6a 2c 20 54 63 6c 5f 4f 62 6a 20 2a  taObj, Tcl_Obj *
74c0: 64 69 67 65 73 74 4f 62 6a 2c 0a 09 54 63 6c 5f  digestObj,..Tcl_
74d0: 4f 62 6a 20 2a 63 69 70 68 65 72 4f 62 6a 2c 20  Obj *cipherObj, 
74e0: 69 6e 74 20 66 6f 72 6d 61 74 2c 20 54 63 6c 5f  int format, Tcl_
74f0: 4f 62 6a 20 2a 6b 65 79 4f 62 6a 2c 20 54 63 6c  Obj *keyObj, Tcl
7500: 5f 4f 62 6a 20 2a 6d 61 63 4f 62 6a 2c 20 69 6e  _Obj *macObj, in
7510: 74 20 6c 65 6e 67 74 68 29 20 7b 0a 20 20 20 20  t length) {.    
7520: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
7530: 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a  ata;.    Tcl_Siz
7540: 65 20 64 61 74 61 5f 6c 65 6e 3b 0a 20 20 20 20  e data_len;.    
7550: 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61  DigestState *sta
7560: 74 65 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69  tePtr;..    dpri
7570: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
7580: 20 20 20 20 2f 2a 20 47 65 74 20 64 61 74 61 20      /* Get data 
7590: 2a 2f 0a 20 20 20 20 64 61 74 61 20 3d 20 54 63  */.    data = Tc
75a0: 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
75b0: 6f 6d 4f 62 6a 28 64 61 74 61 4f 62 6a 2c 20 26  omObj(dataObj, &
75c0: 64 61 74 61 5f 6c 65 6e 29 3b 0a 20 20 20 20 69  data_len);.    i
75d0: 66 20 28 64 61 74 61 20 3d 3d 20 4e 55 4c 4c 29  f (data == NULL)
75e0: 20 7b 0a 09 54 63 6c 5f 53 65 74 52 65 73 75 6c   {..Tcl_SetResul
75f0: 74 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20 64 61  t(interp, "No da
7600: 74 61 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  ta", NULL);..ret
7610: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
7620: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65     }..    /* Cre
7630: 61 74 65 20 73 74 61 74 65 20 64 61 74 61 20 73  ate state data s
7640: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
7650: 69 66 20 28 28 73 74 61 74 65 50 74 72 20 3d 20  if ((statePtr = 
7660: 44 69 67 65 73 74 53 74 61 74 65 4e 65 77 28 69  DigestStateNew(i
7670: 6e 74 65 72 70 2c 20 66 6f 72 6d 61 74 2c 20 6c  nterp, format, l
7680: 65 6e 67 74 68 29 29 20 3d 3d 20 4e 55 4c 4c 29  ength)) == NULL)
7690: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
76a0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4d 65  sult(interp, "Me
76b0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
76c0: 65 72 72 6f 72 22 2c 20 28 63 68 61 72 20 2a 29  error", (char *)
76d0: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
76e0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
76f0: 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 63 20 44 69  ..    /* Calc Di
7700: 67 65 73 74 20 2a 2f 0a 20 20 20 20 69 66 20 28  gest */.    if (
7710: 44 69 67 65 73 74 49 6e 69 74 69 61 6c 69 7a 65  DigestInitialize
7720: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
7730: 72 2c 20 64 69 67 65 73 74 4f 62 6a 2c 20 63 69  r, digestObj, ci
7740: 70 68 65 72 4f 62 6a 2c 20 6b 65 79 4f 62 6a 2c  pherObj, keyObj,
7750: 20 6d 61 63 4f 62 6a 29 20 21 3d 20 54 43 4c 5f   macObj) != TCL_
7760: 4f 4b 20 7c 7c 0a 09 44 69 67 65 73 74 55 70 64  OK ||..DigestUpd
7770: 61 74 65 28 73 74 61 74 65 50 74 72 2c 20 28 63  ate(statePtr, (c
7780: 68 61 72 20 2a 29 20 64 61 74 61 2c 20 64 61 74  har *) data, dat
7790: 61 5f 6c 65 6e 2c 20 31 29 20 21 3d 20 54 43 4c  a_len, 1) != TCL
77a0: 5f 4f 4b 20 7c 7c 0a 09 44 69 67 65 73 74 46 69  _OK ||..DigestFi
77b0: 6e 61 6c 69 7a 65 28 69 6e 74 65 72 70 2c 20 73  nalize(interp, s
77c0: 74 61 74 65 50 74 72 2c 20 4e 55 4c 4c 29 20 21  tatePtr, NULL) !
77d0: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 44 69 67  = TCL_OK) {..Dig
77e0: 65 73 74 53 74 61 74 65 46 72 65 65 28 73 74 61  estStateFree(sta
77f0: 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20  tePtr);..return 
7800: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
7810: 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 6e 2d 75  ..    /* Clean-u
7820: 70 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 53  p */.    DigestS
7830: 74 61 74 65 46 72 65 65 28 73 74 61 74 65 50 74  tateFree(statePt
7840: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  r);.    return T
7850: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a  CL_OK;.}../*****
7860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
78a0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
78b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
78c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
78d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
78e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
78f0: 44 69 67 65 73 74 46 69 6c 65 48 61 6e 64 6c 65  DigestFileHandle
7900: 72 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 75 72  r --. *. *.Retur
7910: 6e 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74  n message digest
7920: 20 66 6f 72 20 66 69 6c 65 20 75 73 69 6e 67 20   for file using 
7930: 75 73 65 72 20 73 70 65 63 69 66 69 65 64 20 68  user specified h
7940: 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a  ash function.. *
7950: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09  . * Returns:. *.
7960: 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52  TCL_OK or TCL_ER
7970: 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ROR. *. * Side e
7980: 66 66 65 63 74 73 3a 0a 20 2a 09 52 65 73 75 6c  ffects:. *.Resul
7990: 74 20 69 73 20 6d 65 73 73 61 67 65 20 64 69 67  t is message dig
79a0: 65 73 74 20 6f 72 20 65 72 72 6f 72 20 6d 65 73  est or error mes
79b0: 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  sage. *. *------
79c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
79d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
79e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
79f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
7a00: 2f 0a 69 6e 74 20 44 69 67 65 73 74 46 69 6c 65  /.int DigestFile
7a10: 48 61 6e 64 6c 65 72 28 54 63 6c 5f 49 6e 74 65  Handler(Tcl_Inte
7a20: 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f  rp *interp, Tcl_
7a30: 4f 62 6a 20 2a 69 6e 46 69 6c 65 4f 62 6a 2c 20  Obj *inFileObj, 
7a40: 54 63 6c 5f 4f 62 6a 20 2a 64 69 67 65 73 74 4f  Tcl_Obj *digestO
7a50: 62 6a 2c 0a 09 54 63 6c 5f 4f 62 6a 20 2a 63 69  bj,..Tcl_Obj *ci
7a60: 70 68 65 72 4f 62 6a 2c 20 69 6e 74 20 66 6f 72  pherObj, int for
7a70: 6d 61 74 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6b 65  mat, Tcl_Obj *ke
7a80: 79 4f 62 6a 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6d  yObj, Tcl_Obj *m
7a90: 61 63 4f 62 6a 2c 20 69 6e 74 20 6c 65 6e 67 74  acObj, int lengt
7aa0: 68 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53  h) {.    DigestS
7ab0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a  tate *statePtr;.
7ac0: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20      Tcl_Channel 
7ad0: 63 68 61 6e 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  chan = NULL;.   
7ae0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62   unsigned char b
7af0: 75 66 5b 42 55 46 46 45 52 5f 53 49 5a 45 5d 3b  uf[BUFFER_SIZE];
7b00: 0a 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 54  .    int res = T
7b10: 43 4c 5f 4f 4b 3b 0a 0a 20 20 20 20 64 70 72 69  CL_OK;..    dpri
7b20: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
7b30: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 73 74      /* Create st
7b40: 61 74 65 20 64 61 74 61 20 73 74 72 75 63 74 75  ate data structu
7b50: 72 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 73  re */.    if ((s
7b60: 74 61 74 65 50 74 72 20 3d 20 44 69 67 65 73 74  tatePtr = Digest
7b70: 53 74 61 74 65 4e 65 77 28 69 6e 74 65 72 70 2c  StateNew(interp,
7b80: 20 66 6f 72 6d 61 74 2c 20 6c 65 6e 67 74 68 29   format, length)
7b90: 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63  ) == NULL) {..Tc
7ba0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
7bb0: 6e 74 65 72 70 2c 20 22 4d 65 6d 6f 72 79 20 61  nterp, "Memory a
7bc0: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 22  llocation error"
7bd0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
7be0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
7bf0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
7c00: 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 63 68 61  /* Open file cha
7c10: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e  nnel */.    chan
7c20: 20 3d 20 54 63 6c 5f 46 53 4f 70 65 6e 46 69 6c   = Tcl_FSOpenFil
7c30: 65 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c  eChannel(interp,
7c40: 20 69 6e 46 69 6c 65 4f 62 6a 2c 20 22 72 62 22   inFileObj, "rb"
7c50: 2c 20 30 34 34 34 29 3b 0a 20 20 20 20 69 66 20  , 0444);.    if 
7c60: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68  (chan == (Tcl_Ch
7c70: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
7c80: 44 69 67 65 73 74 53 74 61 74 65 46 72 65 65 28  DigestStateFree(
7c90: 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75  statePtr);..retu
7ca0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
7cb0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 66    }..    /* Conf
7cc0: 69 67 75 72 65 20 63 68 61 6e 6e 65 6c 20 2a 2f  igure channel */
7cd0: 0a 20 20 20 20 69 66 20 28 28 72 65 73 20 3d 20  .    if ((res = 
7ce0: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_SetChannelOp
7cf0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61  tion(interp, cha
7d00: 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e  n, "-translation
7d10: 22 2c 20 22 62 69 6e 61 72 79 22 29 29 20 21 3d  ", "binary")) !=
7d20: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 67 6f 74 6f   TCL_OK) {..goto
7d30: 20 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20   done;.    }.   
7d40: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 42   Tcl_SetChannelB
7d50: 75 66 66 65 72 53 69 7a 65 28 63 68 61 6e 2c 20  ufferSize(chan, 
7d60: 42 55 46 46 45 52 5f 53 49 5a 45 29 3b 0a 0a 20  BUFFER_SIZE);.. 
7d70: 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
7d80: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a   hash function *
7d90: 2f 0a 20 20 20 20 69 66 20 28 28 72 65 73 20 3d  /.    if ((res =
7da0: 20 44 69 67 65 73 74 49 6e 69 74 69 61 6c 69 7a   DigestInitializ
7db0: 65 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50  e(interp, stateP
7dc0: 74 72 2c 20 64 69 67 65 73 74 4f 62 6a 2c 20 63  tr, digestObj, c
7dd0: 69 70 68 65 72 4f 62 6a 2c 20 6b 65 79 4f 62 6a  ipherObj, keyObj
7de0: 2c 20 6d 61 63 4f 62 6a 29 29 20 21 3d 20 54 43  , macObj)) != TC
7df0: 4c 5f 4f 4b 29 20 7b 0a 09 67 6f 74 6f 20 64 6f  L_OK) {..goto do
7e00: 6e 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ne;.    }..    /
7e10: 2a 20 52 65 61 64 20 66 69 6c 65 20 64 61 74 61  * Read file data
7e20: 20 61 6e 64 20 75 70 64 61 74 65 20 68 61 73 68   and update hash
7e30: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20   function */.   
7e40: 20 77 68 69 6c 65 20 28 21 54 63 6c 5f 45 6f 66   while (!Tcl_Eof
7e50: 28 63 68 61 6e 29 29 20 7b 0a 09 54 63 6c 5f 53  (chan)) {..Tcl_S
7e60: 69 7a 65 20 6c 65 6e 20 3d 20 54 63 6c 5f 52 65  ize len = Tcl_Re
7e70: 61 64 52 61 77 28 63 68 61 6e 2c 20 28 63 68 61  adRaw(chan, (cha
7e80: 72 20 2a 29 20 62 75 66 2c 20 42 55 46 46 45 52  r *) buf, BUFFER
7e90: 5f 53 49 5a 45 29 3b 0a 09 69 66 20 28 6c 65 6e  _SIZE);..if (len
7ea0: 20 3e 20 30 29 20 7b 0a 09 20 20 20 20 69 66 20   > 0) {..    if 
7eb0: 28 28 72 65 73 20 3d 20 44 69 67 65 73 74 55 70  ((res = DigestUp
7ec0: 64 61 74 65 28 73 74 61 74 65 50 74 72 2c 20 28  date(statePtr, (
7ed0: 63 68 61 72 20 2a 29 20 26 62 75 66 5b 30 5d 2c  char *) &buf[0],
7ee0: 20 6c 65 6e 2c 20 31 29 29 20 21 3d 20 54 43 4c   len, 1)) != TCL
7ef0: 5f 4f 4b 29 20 7b 0a 09 09 67 6f 74 6f 20 64 6f  _OK) {...goto do
7f00: 6e 65 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20  ne;..    }..}.  
7f10: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61    }..    /* Fina
7f20: 6c 69 7a 65 20 68 61 73 68 20 66 75 6e 63 74 69  lize hash functi
7f30: 6f 6e 20 61 6e 64 20 63 61 6c 63 75 6c 61 74 65  on and calculate
7f40: 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20   message digest 
7f50: 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 44 69 67  */.    res = Dig
7f60: 65 73 74 46 69 6e 61 6c 69 7a 65 28 69 6e 74 65  estFinalize(inte
7f70: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 4e 55  rp, statePtr, NU
7f80: 4c 4c 29 3b 0a 0a 64 6f 6e 65 3a 0a 20 20 20 20  LL);..done:.    
7f90: 2f 2a 20 43 6c 6f 73 65 20 63 68 61 6e 6e 65 6c  /* Close channel
7fa0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f   */.    if (Tcl_
7fb0: 43 6c 6f 73 65 28 69 6e 74 65 72 70 2c 20 63 68  Close(interp, ch
7fc0: 61 6e 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52  an) == TCL_ERROR
7fd0: 29 20 7b 0a 09 72 65 73 20 3d 20 54 43 4c 5f 45  ) {..res = TCL_E
7fe0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
7ff0: 20 2f 2a 20 43 6c 65 61 6e 2d 75 70 20 2a 2f 0a   /* Clean-up */.
8000: 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65 46      DigestStateF
8010: 72 65 65 28 73 74 61 74 65 50 74 72 29 3b 0a 20  ree(statePtr);. 
8020: 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d     return res;.}
8030: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
8040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8070: 2a 2a 2a 2a 2a 2a 2f 0a 0a 73 74 61 74 69 63 20  ******/..static 
8080: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6d 6d  const char *comm
8090: 61 6e 64 5f 6f 70 74 73 20 5b 5d 20 3d 20 7b 20  and_opts [] = { 
80a0: 22 2d 62 69 6e 22 2c 20 22 2d 62 69 6e 61 72 79  "-bin", "-binary
80b0: 22 2c 20 22 2d 68 65 78 22 2c 20 22 2d 68 65 78  ", "-hex", "-hex
80c0: 61 64 65 63 69 6d 61 6c 22 2c 0a 20 20 20 20 22  adecimal",.    "
80d0: 2d 63 68 61 6e 22 2c 20 22 2d 63 68 61 6e 6e 65  -chan", "-channe
80e0: 6c 22 2c 20 22 2d 63 69 70 68 65 72 22 2c 20 22  l", "-cipher", "
80f0: 2d 63 6f 6d 6d 61 6e 64 22 2c 20 22 2d 64 61 74  -command", "-dat
8100: 61 22 2c 20 22 2d 64 69 67 65 73 74 22 2c 20 22  a", "-digest", "
8110: 2d 66 69 6c 65 22 2c 20 22 2d 66 69 6c 65 6e 61  -file", "-filena
8120: 6d 65 22 2c 0a 20 20 20 20 22 2d 68 61 73 68 22  me",.    "-hash"
8130: 2c 20 22 2d 6b 65 79 22 2c 20 22 2d 6c 65 6e 67  , "-key", "-leng
8140: 74 68 22 2c 20 22 2d 6d 61 63 22 2c 20 22 2d 73  th", "-mac", "-s
8150: 69 7a 65 22 2c 20 4e 55 4c 4c 7d 3b 0a 0a 65 6e  ize", NULL};..en
8160: 75 6d 20 5f 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73  um _command_opts
8170: 20 7b 0a 20 20 20 20 5f 6f 70 74 5f 62 69 6e 2c   {.    _opt_bin,
8180: 20 5f 6f 70 74 5f 62 69 6e 61 72 79 2c 20 5f 6f   _opt_binary, _o
8190: 70 74 5f 68 65 78 2c 20 5f 6f 70 74 5f 68 65 78  pt_hex, _opt_hex
81a0: 61 64 65 63 69 6d 61 6c 2c 20 5f 6f 70 74 5f 63  adecimal, _opt_c
81b0: 68 61 6e 2c 20 5f 6f 70 74 5f 63 68 61 6e 6e 65  han, _opt_channe
81c0: 6c 2c 20 5f 6f 70 74 5f 63 69 70 68 65 72 2c 0a  l, _opt_cipher,.
81d0: 20 20 20 20 5f 6f 70 74 5f 63 6f 6d 6d 61 6e 64      _opt_command
81e0: 2c 20 5f 6f 70 74 5f 64 61 74 61 2c 20 5f 6f 70  , _opt_data, _op
81f0: 74 5f 64 69 67 65 73 74 2c 20 5f 6f 70 74 5f 66  t_digest, _opt_f
8200: 69 6c 65 2c 20 5f 6f 70 74 5f 66 69 6c 65 6e 61  ile, _opt_filena
8210: 6d 65 2c 20 5f 6f 70 74 5f 68 61 73 68 2c 20 5f  me, _opt_hash, _
8220: 6f 70 74 5f 6b 65 79 2c 0a 20 20 20 20 5f 6f 70  opt_key,.    _op
8230: 74 5f 6c 65 6e 67 74 68 2c 20 5f 6f 70 74 5f 6d  t_length, _opt_m
8240: 61 63 2c 20 5f 6f 70 74 5f 73 69 7a 65 0a 7d 3b  ac, _opt_size.};
8250: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
8260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
82a0: 20 44 69 67 65 73 74 4d 61 69 6e 20 2d 2d 0a 20   DigestMain --. 
82b0: 2a 0a 20 2a 09 52 65 74 75 72 6e 20 6d 65 73 73  *. *.Return mess
82c0: 61 67 65 20 64 69 67 65 73 74 20 6f 72 20 4d 65  age digest or Me
82d0: 73 73 61 67 65 20 41 75 74 68 65 6e 74 69 63 61  ssage Authentica
82e0: 74 69 6f 6e 20 43 6f 64 65 20 28 4d 41 43 29 20  tion Code (MAC) 
82f0: 6f 66 0a 20 2a 09 64 61 74 61 20 75 73 69 6e 67  of. *.data using
8300: 20 75 73 65 72 20 73 70 65 63 69 66 69 65 64 20   user specified 
8310: 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 0a 20  hash function.. 
8320: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a  *. * Returns:. *
8330: 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45  .TCL_OK or TCL_E
8340: 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20  RROR. *. * Side 
8350: 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73  effects:. *.Sets
8360: 20 72 65 73 75 6c 74 20 74 6f 20 6d 65 73 73 61   result to messa
8370: 67 65 20 64 69 67 65 73 74 20 6f 72 20 65 72 72  ge digest or err
8380: 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a  or message. *. *
8390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
83a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
83b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
83c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
83d0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
83e0: 6e 74 20 44 69 67 65 73 74 4d 61 69 6e 28 69 6e  nt DigestMain(in
83f0: 74 20 74 79 70 65 2c 20 54 63 6c 5f 49 6e 74 65  t type, Tcl_Inte
8400: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
8410: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63  objc, Tcl_Obj *c
8420: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20  onst objv[]) {. 
8430: 20 20 20 69 6e 74 20 66 6f 72 6d 61 74 20 3d 20     int format = 
8440: 48 45 58 5f 46 4f 52 4d 41 54 3b 20 2f 2a 20 4f  HEX_FORMAT; /* O
8450: 75 74 70 75 74 20 66 6f 72 6d 61 74 20 2a 2f 0a  utput format */.
8460: 20 20 20 20 69 6e 74 20 6c 65 6e 67 74 68 20 3d      int length =
8470: 20 30 3b 20 2f 2a 20 4d 44 20 6c 65 6e 67 74 68   0; /* MD length
8480: 2c 20 77 68 65 72 65 20 30 3d 64 65 66 61 75 6c  , where 0=defaul
8490: 74 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69 6e  t size */.    in
84a0: 74 20 73 74 61 72 74 20 3d 20 31 2c 20 72 65 73  t start = 1, res
84b0: 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 54   = TCL_OK;.    T
84c0: 63 6c 5f 53 69 7a 65 20 66 6e 3b 0a 20 20 20 20  cl_Size fn;.    
84d0: 54 63 6c 5f 4f 62 6a 20 2a 63 69 70 68 65 72 4f  Tcl_Obj *cipherO
84e0: 62 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 63 6d 64 4f  bj = NULL, *cmdO
84f0: 62 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 64 61 74 61  bj = NULL, *data
8500: 4f 62 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 64 69 67  Obj = NULL, *dig
8510: 65 73 74 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20  estObj = NULL;. 
8520: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 66 69 6c 65     Tcl_Obj *file
8530: 4f 62 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 6b 65 79  Obj = NULL, *key
8540: 4f 62 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 6d 61 63  Obj = NULL, *mac
8550: 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  Obj = NULL;.    
8560: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 68 61 6e  const char *chan
8570: 6e 65 6c 20 3d 20 4e 55 4c 4c 2c 20 2a 6f 70 74  nel = NULL, *opt
8580: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
8590: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f  Called");..    /
85a0: 2a 20 43 6c 65 61 72 20 69 6e 74 65 72 70 20 72  * Clear interp r
85b0: 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 54 63 6c  esult */.    Tcl
85c0: 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
85d0: 65 72 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61  erp);..    /* Va
85e0: 6c 69 64 61 74 65 20 61 72 67 20 63 6f 75 6e 74  lidate arg count
85f0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63   */.    if (objc
8600: 20 3c 20 33 20 7c 7c 20 6f 62 6a 63 20 3e 20 31   < 3 || objc > 1
8610: 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e  2) {..Tcl_WrongN
8620: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
8630: 2c 20 6f 62 6a 76 2c 20 22 3f 2d 62 69 6e 7c 2d  , objv, "?-bin|-
8640: 68 65 78 3f 20 3f 2d 63 69 70 68 65 72 20 6e 61  hex? ?-cipher na
8650: 6d 65 3f 20 3f 2d 64 69 67 65 73 74 20 6e 61 6d  me? ?-digest nam
8660: 65 3f 20 3f 2d 6b 65 79 20 6b 65 79 3f 20 3f 2d  e? ?-key key? ?-
8670: 6d 61 63 20 6e 61 6d 65 3f 20 5b 2d 63 68 61 6e  mac name? [-chan
8680: 6e 65 6c 20 63 68 61 6e 20 7c 20 2d 63 6f 6d 6d  nel chan | -comm
8690: 61 6e 64 20 63 6d 64 4e 61 6d 65 20 7c 20 2d 66  and cmdName | -f
86a0: 69 6c 65 20 66 69 6c 65 6e 61 6d 65 20 7c 20 3f  ile filename | ?
86b0: 2d 64 61 74 61 3f 20 64 61 74 61 5d 22 29 3b 0a  -data? data]");.
86c0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
86d0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
86e0: 20 53 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66   Special case of
86f0: 20 66 69 72 73 74 20 61 72 67 20 69 73 20 64 69   first arg is di
8700: 67 65 73 74 2c 20 63 69 70 68 65 72 2c 20 6f 72  gest, cipher, or
8710: 20 6d 61 63 20 2a 2f 0a 20 20 20 20 6f 70 74 20   mac */.    opt 
8720: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
8730: 6f 62 6a 76 5b 73 74 61 72 74 5d 29 3b 0a 20 20  objv[start]);.  
8740: 20 20 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20    if (opt[0] != 
8750: 27 2d 27 29 20 7b 0a 09 73 77 69 74 63 68 28 74  '-') {..switch(t
8760: 79 70 65 29 20 7b 0a 09 63 61 73 65 20 54 59 50  ype) {..case TYP
8770: 45 5f 4d 44 3a 0a 09 63 61 73 65 20 54 59 50 45  E_MD:..case TYPE
8780: 5f 48 4d 41 43 3a 0a 09 20 20 20 20 64 69 67 65  _HMAC:..    dige
8790: 73 74 4f 62 6a 20 3d 20 6f 62 6a 76 5b 73 74 61  stObj = objv[sta
87a0: 72 74 2b 2b 5d 3b 0a 09 20 20 20 20 62 72 65 61  rt++];..    brea
87b0: 6b 3b 0a 09 63 61 73 65 20 54 59 50 45 5f 43 4d  k;..case TYPE_CM
87c0: 41 43 3a 0a 09 20 20 20 20 63 69 70 68 65 72 4f  AC:..    cipherO
87d0: 62 6a 20 3d 20 6f 62 6a 76 5b 73 74 61 72 74 2b  bj = objv[start+
87e0: 2b 5d 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  +];..    break;.
87f0: 09 63 61 73 65 20 54 59 50 45 5f 4d 41 43 3a 0a  .case TYPE_MAC:.
8800: 09 20 20 20 20 6d 61 63 4f 62 6a 20 3d 20 6f 62  .    macObj = ob
8810: 6a 76 5b 73 74 61 72 74 2b 2b 5d 3b 0a 09 20 20  jv[start++];..  
8820: 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 20 20    break;..}.    
8830: 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 6f 70  }..    /* Get op
8840: 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 66 6f 72  tions */.    for
8850: 20 28 69 6e 74 20 69 64 78 20 3d 20 73 74 61 72   (int idx = star
8860: 74 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20 69  t; idx < objc; i
8870: 64 78 2b 2b 29 20 7b 0a 09 2f 2a 20 53 70 65 63  dx++) {../* Spec
8880: 69 61 6c 20 63 61 73 65 20 66 6f 72 20 77 68 65  ial case for whe
8890: 6e 20 6c 61 73 74 20 61 72 67 20 69 73 20 64 61  n last arg is da
88a0: 74 61 20 2a 2f 0a 09 69 66 20 28 69 64 78 20 3d  ta */..if (idx =
88b0: 3d 20 6f 62 6a 63 20 2d 20 31 29 20 7b 0a 09 20  = objc - 1) {.. 
88c0: 20 20 20 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74     opt = Tcl_Get
88d0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 64 78 5d  String(objv[idx]
88e0: 29 3b 0a 09 20 20 20 20 69 66 20 28 6f 70 74 5b  );..    if (opt[
88f0: 30 5d 20 21 3d 20 27 2d 27 20 26 26 20 64 61 74  0] != '-' && dat
8900: 61 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  aObj == NULL) {.
8910: 09 09 64 61 74 61 4f 62 6a 20 3d 20 6f 62 6a 76  ..dataObj = objv
8920: 5b 69 64 78 5d 3b 0a 09 09 62 72 65 61 6b 3b 0a  [idx];...break;.
8930: 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 2f 2a 20 47  .    }..}.../* G
8940: 65 74 20 6f 70 74 69 6f 6e 20 2a 2f 0a 09 69 66  et option */..if
8950: 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72   (Tcl_GetIndexFr
8960: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
8970: 6a 76 5b 69 64 78 5d 2c 20 63 6f 6d 6d 61 6e 64  jv[idx], command
8980: 5f 6f 70 74 73 2c 20 22 6f 70 74 69 6f 6e 22 2c  _opts, "option",
8990: 20 30 2c 20 26 66 6e 29 20 21 3d 20 54 43 4c 5f   0, &fn) != TCL_
89a0: 4f 4b 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72  OK) {..    retur
89b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
89c0: 0a 09 2f 2a 20 56 61 6c 69 64 61 74 65 20 61 72  ../* Validate ar
89d0: 67 20 68 61 73 20 61 20 76 61 6c 75 65 20 2a 2f  g has a value */
89e0: 0a 09 69 66 20 28 66 6e 20 3e 20 5f 6f 70 74 5f  ..if (fn > _opt_
89f0: 68 65 78 61 64 65 63 69 6d 61 6c 29 20 7b 0a 09  hexadecimal) {..
8a00: 20 20 20 20 69 66 20 28 2b 2b 69 64 78 20 3e 3d      if (++idx >=
8a10: 20 6f 62 6a 63 29 20 7b 0a 09 09 54 63 6c 5f 41   objc) {...Tcl_A
8a20: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
8a30: 72 70 2c 20 22 4e 6f 20 76 61 6c 75 65 20 66 6f  rp, "No value fo
8a40: 72 20 6f 70 74 69 6f 6e 20 5c 22 22 2c 20 63 6f  r option \"", co
8a50: 6d 6d 61 6e 64 5f 6f 70 74 73 5b 66 6e 5d 2c 20  mmand_opts[fn], 
8a60: 22 5c 22 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  "\"", (char *) N
8a70: 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54  ULL);...return T
8a80: 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d  CL_ERROR;..    }
8a90: 0a 09 7d 0a 0a 09 73 77 69 74 63 68 28 66 6e 29  ..}...switch(fn)
8aa0: 20 7b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 62 69   {..case _opt_bi
8ab0: 6e 3a 0a 09 63 61 73 65 20 5f 6f 70 74 5f 62 69  n:..case _opt_bi
8ac0: 6e 61 72 79 3a 0a 09 20 20 20 20 66 6f 72 6d 61  nary:..    forma
8ad0: 74 20 3d 20 42 49 4e 5f 46 4f 52 4d 41 54 3b 0a  t = BIN_FORMAT;.
8ae0: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73  .    break;..cas
8af0: 65 20 5f 6f 70 74 5f 68 65 78 3a 0a 09 63 61 73  e _opt_hex:..cas
8b00: 65 20 5f 6f 70 74 5f 68 65 78 61 64 65 63 69 6d  e _opt_hexadecim
8b10: 61 6c 3a 0a 09 20 20 20 20 66 6f 72 6d 61 74 20  al:..    format 
8b20: 3d 20 48 45 58 5f 46 4f 52 4d 41 54 3b 0a 09 20  = HEX_FORMAT;.. 
8b30: 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20     break;..case 
8b40: 5f 6f 70 74 5f 63 68 61 6e 3a 0a 09 63 61 73 65  _opt_chan:..case
8b50: 20 5f 6f 70 74 5f 63 68 61 6e 6e 65 6c 3a 0a 20   _opt_channel:. 
8b60: 20 20 20 09 20 20 20 20 47 45 54 5f 4f 50 54 5f     .    GET_OPT_
8b70: 53 54 52 49 4e 47 28 6f 62 6a 76 5b 69 64 78 5d  STRING(objv[idx]
8b80: 2c 20 63 68 61 6e 6e 65 6c 2c 20 4e 55 4c 4c 29  , channel, NULL)
8b90: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63  ;..    break;..c
8ba0: 61 73 65 20 5f 6f 70 74 5f 63 69 70 68 65 72 3a  ase _opt_cipher:
8bb0: 0a 09 20 20 20 20 63 69 70 68 65 72 4f 62 6a 20  ..    cipherObj 
8bc0: 3d 20 6f 62 6a 76 5b 69 64 78 5d 3b 0a 09 20 20  = objv[idx];..  
8bd0: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f    break;..case _
8be0: 6f 70 74 5f 63 6f 6d 6d 61 6e 64 3a 0a 09 20 20  opt_command:..  
8bf0: 20 20 63 6d 64 4f 62 6a 20 3d 20 6f 62 6a 76 5b    cmdObj = objv[
8c00: 69 64 78 5d 3b 0a 09 20 20 20 20 62 72 65 61 6b  idx];..    break
8c10: 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 64 61 74  ;..case _opt_dat
8c20: 61 3a 0a 09 20 20 20 20 64 61 74 61 4f 62 6a 20  a:..    dataObj 
8c30: 3d 20 6f 62 6a 76 5b 69 64 78 5d 3b 0a 09 20 20  = objv[idx];..  
8c40: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f    break;..case _
8c50: 6f 70 74 5f 64 69 67 65 73 74 3a 0a 09 63 61 73  opt_digest:..cas
8c60: 65 20 5f 6f 70 74 5f 68 61 73 68 3a 0a 09 20 20  e _opt_hash:..  
8c70: 20 20 64 69 67 65 73 74 4f 62 6a 20 3d 20 6f 62    digestObj = ob
8c80: 6a 76 5b 69 64 78 5d 3b 0a 09 20 20 20 20 62 72  jv[idx];..    br
8c90: 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f  eak;..case _opt_
8ca0: 66 69 6c 65 3a 0a 09 63 61 73 65 20 5f 6f 70 74  file:..case _opt
8cb0: 5f 66 69 6c 65 6e 61 6d 65 3a 0a 09 20 20 20 20  _filename:..    
8cc0: 66 69 6c 65 4f 62 6a 20 3d 20 6f 62 6a 76 5b 69  fileObj = objv[i
8cd0: 64 78 5d 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b  dx];..    break;
8ce0: 0a 09 63 61 73 65 20 5f 6f 70 74 5f 6b 65 79 3a  ..case _opt_key:
8cf0: 0a 09 20 20 20 20 6b 65 79 4f 62 6a 20 3d 20 6f  ..    keyObj = o
8d00: 62 6a 76 5b 69 64 78 5d 3b 0a 09 20 20 20 20 62  bjv[idx];..    b
8d10: 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74  reak;..case _opt
8d20: 5f 6c 65 6e 67 74 68 3a 0a 09 63 61 73 65 20 5f  _length:..case _
8d30: 6f 70 74 5f 73 69 7a 65 3a 0a 20 20 20 20 09 20  opt_size:.    . 
8d40: 20 20 20 47 45 54 5f 4f 50 54 5f 49 4e 54 28 6f     GET_OPT_INT(o
8d50: 62 6a 76 5b 69 64 78 5d 2c 20 26 6c 65 6e 67 74  bjv[idx], &lengt
8d60: 68 29 3b 0a 09 20 20 20 20 69 66 20 28 6c 65 6e  h);..    if (len
8d70: 67 74 68 20 3c 20 31 20 7c 7c 20 6c 65 6e 67 74  gth < 1 || lengt
8d80: 68 20 3e 20 45 56 50 5f 4d 41 58 5f 4d 44 5f 53  h > EVP_MAX_MD_S
8d90: 49 5a 45 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70  IZE) {...Tcl_App
8da0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8db0: 2c 20 22 49 6e 76 61 6c 69 64 20 6c 65 6e 67 74  , "Invalid lengt
8dc0: 68 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  h", (char *) NUL
8dd0: 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c  L);...return TCL
8de0: 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09  _ERROR;..    }..
8df0: 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65      break;..case
8e00: 20 5f 6f 70 74 5f 6d 61 63 3a 0a 09 20 20 20 20   _opt_mac:..    
8e10: 6d 61 63 4f 62 6a 20 3d 20 6f 62 6a 76 5b 69 64  macObj = objv[id
8e20: 78 5d 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  x];..    break;.
8e30: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  .}.    }..    /*
8e40: 20 43 68 65 63 6b 20 74 79 70 65 73 20 2a 2f 0a   Check types */.
8e50: 20 20 20 20 69 66 20 28 74 79 70 65 20 3d 3d 20      if (type == 
8e60: 54 59 50 45 5f 4d 44 29 20 7b 0a 09 20 69 66 20  TYPE_MD) {.. if 
8e70: 28 6d 61 63 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29  (macObj != NULL)
8e80: 20 7b 0a 09 20 20 20 20 74 79 70 65 20 3d 20 54   {..    type = T
8e90: 59 50 45 5f 4d 41 43 3b 0a 09 7d 20 65 6c 73 65  YPE_MAC;..} else
8ea0: 20 69 66 20 28 63 69 70 68 65 72 4f 62 6a 20 21   if (cipherObj !
8eb0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 74  = NULL) {..    t
8ec0: 79 70 65 20 3d 20 54 59 50 45 5f 43 4d 41 43 3b  ype = TYPE_CMAC;
8ed0: 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6b 65 79  ..} else if (key
8ee0: 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Obj != NULL) {..
8ef0: 20 20 20 20 74 79 70 65 20 3d 20 54 59 50 45 5f      type = TYPE_
8f00: 48 4d 41 43 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  HMAC;..}.    }..
8f10: 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 4d      /* Convert M
8f20: 41 43 20 74 6f 20 43 4d 41 43 20 6f 72 20 48 4d  AC to CMAC or HM
8f30: 41 43 20 74 79 70 65 20 2a 2f 0a 20 20 20 20 69  AC type */.    i
8f40: 66 20 28 74 79 70 65 20 3d 3d 20 54 59 50 45 5f  f (type == TYPE_
8f50: 4d 41 43 29 20 7b 0a 09 69 66 20 28 6d 61 63 4f  MAC) {..if (macO
8f60: 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  bj != NULL) {.. 
8f70: 20 20 20 63 68 61 72 20 2a 6d 61 63 4e 61 6d 65     char *macName
8f80: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
8f90: 28 6d 61 63 4f 62 6a 29 3b 0a 09 20 20 20 20 69  (macObj);..    i
8fa0: 66 20 28 73 74 72 63 6d 70 28 6d 61 63 4e 61 6d  f (strcmp(macNam
8fb0: 65 2c 22 63 6d 61 63 22 29 20 3d 3d 20 30 29 20  e,"cmac") == 0) 
8fc0: 7b 0a 09 09 74 79 70 65 20 3d 20 54 59 50 45 5f  {...type = TYPE_
8fd0: 43 4d 41 43 3b 0a 09 20 20 20 20 7d 20 65 6c 73  CMAC;..    } els
8fe0: 65 20 69 66 20 28 73 74 72 63 6d 70 28 6d 61 63  e if (strcmp(mac
8ff0: 4e 61 6d 65 2c 22 68 6d 61 63 22 29 20 3d 3d 20  Name,"hmac") == 
9000: 30 29 20 7b 0a 09 09 74 79 70 65 20 3d 20 54 59  0) {...type = TY
9010: 50 45 5f 48 4d 41 43 3b 0a 09 20 20 20 20 7d 20  PE_HMAC;..    } 
9020: 65 6c 73 65 20 7b 0a 09 09 54 63 6c 5f 41 70 70  else {...Tcl_App
9030: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
9040: 2c 20 22 69 6e 76 61 6c 69 64 20 4d 41 43 20 5c  , "invalid MAC \
9050: 22 22 2c 20 6d 61 63 4e 61 6d 65 2c 20 22 5c 22  "", macName, "\"
9060: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
9070: 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f  );...return TCL_
9080: 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 7d  ERROR;..    }..}
9090: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 54 63 6c   else {..    Tcl
90a0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
90b0: 74 65 72 70 2c 20 22 6e 6f 20 4d 41 43 22 2c 20  terp, "no MAC", 
90c0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
90d0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
90e0: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a  ERROR;..}.    }.
90f0: 0a 20 20 20 20 2f 2a 20 43 61 6c 63 20 64 69 67  .    /* Calc dig
9100: 65 73 74 20 6f 6e 20 66 69 6c 65 2c 20 73 74 61  est on file, sta
9110: 63 6b 65 64 20 63 68 61 6e 6e 65 6c 2c 20 75 73  cked channel, us
9120: 69 6e 67 20 69 6e 73 74 61 6e 63 65 20 63 6f 6d  ing instance com
9130: 6d 61 6e 64 2c 20 6f 72 20 64 61 74 61 20 62 6c  mand, or data bl
9140: 6f 62 20 2a 2f 0a 20 20 20 20 69 66 20 28 66 69  ob */.    if (fi
9150: 6c 65 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b  leObj != NULL) {
9160: 0a 09 72 65 73 20 3d 20 44 69 67 65 73 74 46 69  ..res = DigestFi
9170: 6c 65 48 61 6e 64 6c 65 72 28 69 6e 74 65 72 70  leHandler(interp
9180: 2c 20 66 69 6c 65 4f 62 6a 2c 20 64 69 67 65 73  , fileObj, diges
9190: 74 4f 62 6a 2c 20 63 69 70 68 65 72 4f 62 6a 2c  tObj, cipherObj,
91a0: 20 66 6f 72 6d 61 74 20 7c 20 74 79 70 65 2c 20   format | type, 
91b0: 6b 65 79 4f 62 6a 2c 0a 09 20 20 20 20 6d 61 63  keyObj,..    mac
91c0: 4f 62 6a 2c 20 6c 65 6e 67 74 68 29 3b 0a 20 20  Obj, length);.  
91d0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 68 61    } else if (cha
91e0: 6e 6e 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  nnel != NULL) {.
91f0: 09 72 65 73 20 3d 20 44 69 67 65 73 74 43 68 61  .res = DigestCha
9200: 6e 6e 65 6c 48 61 6e 64 6c 65 72 28 69 6e 74 65  nnelHandler(inte
9210: 72 70 2c 20 63 68 61 6e 6e 65 6c 2c 20 64 69 67  rp, channel, dig
9220: 65 73 74 4f 62 6a 2c 20 63 69 70 68 65 72 4f 62  estObj, cipherOb
9230: 6a 2c 20 66 6f 72 6d 61 74 20 7c 20 74 79 70 65  j, format | type
9240: 2c 20 6b 65 79 4f 62 6a 2c 0a 09 20 20 20 20 6d  , keyObj,..    m
9250: 61 63 4f 62 6a 2c 20 6c 65 6e 67 74 68 29 3b 0a  acObj, length);.
9260: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63      } else if (c
9270: 6d 64 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b  mdObj != NULL) {
9280: 0a 09 72 65 73 20 3d 20 44 69 67 65 73 74 43 6f  ..res = DigestCo
9290: 6d 6d 61 6e 64 48 61 6e 64 6c 65 72 28 69 6e 74  mmandHandler(int
92a0: 65 72 70 2c 20 63 6d 64 4f 62 6a 2c 20 64 69 67  erp, cmdObj, dig
92b0: 65 73 74 4f 62 6a 2c 20 63 69 70 68 65 72 4f 62  estObj, cipherOb
92c0: 6a 2c 20 66 6f 72 6d 61 74 20 7c 20 74 79 70 65  j, format | type
92d0: 2c 20 6b 65 79 4f 62 6a 2c 0a 09 20 20 20 20 6d  , keyObj,..    m
92e0: 61 63 4f 62 6a 2c 20 6c 65 6e 67 74 68 29 3b 0a  acObj, length);.
92f0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 64      } else if (d
9300: 61 74 61 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20  ataObj != NULL) 
9310: 7b 0a 09 72 65 73 20 3d 20 44 69 67 65 73 74 44  {..res = DigestD
9320: 61 74 61 48 61 6e 64 6c 65 72 28 69 6e 74 65 72  ataHandler(inter
9330: 70 2c 20 64 61 74 61 4f 62 6a 2c 20 64 69 67 65  p, dataObj, dige
9340: 73 74 4f 62 6a 2c 20 63 69 70 68 65 72 4f 62 6a  stObj, cipherObj
9350: 2c 20 66 6f 72 6d 61 74 20 7c 20 74 79 70 65 2c  , format | type,
9360: 20 6b 65 79 4f 62 6a 2c 0a 09 20 20 20 20 6d 61   keyObj,..    ma
9370: 63 4f 62 6a 2c 20 6c 65 6e 67 74 68 29 3b 0a 20  cObj, length);. 
9380: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c     } else {..Tcl
9390: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
93a0: 74 65 72 70 2c 20 22 4e 6f 20 6f 70 65 72 61 74  terp, "No operat
93b0: 69 6f 6e 3a 20 55 73 65 20 2d 63 68 61 6e 6e 65  ion: Use -channe
93c0: 6c 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 61  l, -command, -da
93d0: 74 61 2c 20 6f 72 20 2d 66 69 6c 65 20 6f 70 74  ta, or -file opt
93e0: 69 6f 6e 22 2c 0a 09 20 20 20 20 28 63 68 61 72  ion",..    (char
93f0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 73 20   *) NULL);..res 
9400: 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  = TCL_ERROR;.   
9410: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65   }.    return re
9420: 73 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  s;.}../*. *-----
9430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
9470: 2a 0a 20 2a 20 4d 65 73 73 61 67 65 20 44 69 67  *. * Message Dig
9480: 65 73 74 20 61 6e 64 20 4d 65 73 73 61 67 65 20  est and Message 
9490: 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 43  Authentication C
94a0: 6f 64 65 20 43 6f 6d 6d 61 6e 64 73 20 2d 2d 0a  ode Commands --.
94b0: 20 2a 0a 20 2a 09 52 65 74 75 72 6e 20 4d 65 73   *. *.Return Mes
94c0: 73 61 67 65 20 44 69 67 65 73 74 20 28 4d 44 29  sage Digest (MD)
94d0: 20 6f 72 20 4d 65 73 73 61 67 65 20 41 75 74 68   or Message Auth
94e0: 65 6e 74 69 63 61 74 69 6f 6e 20 43 6f 64 65 20  entication Code 
94f0: 28 4d 41 43 29 2e 0a 20 2a 0a 20 2a 20 52 65 74  (MAC).. *. * Ret
9500: 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20  urns:. *.TCL_OK 
9510: 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a  or TCL_ERROR. *.
9520: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
9530: 0a 20 2a 09 53 65 74 73 20 72 65 73 75 6c 74 20  . *.Sets result 
9540: 74 6f 20 6d 65 73 73 61 67 65 20 64 69 67 65 73  to message diges
9550: 74 20 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61  t or error messa
9560: 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  ge. *. *--------
9570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
95a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
95b0: 73 74 61 74 69 63 20 69 6e 74 20 4d 64 4f 62 6a  static int MdObj
95c0: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63  Cmd(ClientData c
95d0: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
95e0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
95f0: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
9600: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20   *const objv[]) 
9610: 7b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69  {.    (void) cli
9620: 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 72 65 74  entData;.    ret
9630: 75 72 6e 20 44 69 67 65 73 74 4d 61 69 6e 28 54  urn DigestMain(T
9640: 59 50 45 5f 4d 44 2c 20 69 6e 74 65 72 70 2c 20  YPE_MD, interp, 
9650: 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 7d 0a 0a  objc, objv);.}..
9660: 73 74 61 74 69 63 20 69 6e 74 20 43 4d 41 43 4f  static int CMACO
9670: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
9680: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
9690: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
96a0: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
96b0: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
96c0: 29 20 7b 0a 20 20 20 20 28 76 6f 69 64 29 20 63  ) {.    (void) c
96d0: 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 72  lientData;.    r
96e0: 65 74 75 72 6e 20 44 69 67 65 73 74 4d 61 69 6e  eturn DigestMain
96f0: 28 54 59 50 45 5f 43 4d 41 43 2c 20 69 6e 74 65  (TYPE_CMAC, inte
9700: 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b  rp, objc, objv);
9710: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 48  .}..static int H
9720: 4d 41 43 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74  MACObjCmd(Client
9730: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
9740: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
9750: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
9760: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
9770: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 28 76 6f 69  jv[]) {.    (voi
9780: 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20  d) clientData;. 
9790: 20 20 20 72 65 74 75 72 6e 20 44 69 67 65 73 74     return Digest
97a0: 4d 61 69 6e 28 54 59 50 45 5f 48 4d 41 43 2c 20  Main(TYPE_HMAC, 
97b0: 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62  interp, objc, ob
97c0: 6a 76 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  jv);.}..static i
97d0: 6e 74 20 4d 41 43 4f 62 6a 43 6d 64 28 43 6c 69  nt MACObjCmd(Cli
97e0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
97f0: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
9800: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
9810: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
9820: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 28   objv[]) {.    (
9830: 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61  void) clientData
9840: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 44 69 67  ;.    return Dig
9850: 65 73 74 4d 61 69 6e 28 54 59 50 45 5f 4d 41 43  estMain(TYPE_MAC
9860: 2c 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20  , interp, objc, 
9870: 6f 62 6a 76 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d  objv);.}../*. *-
9880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
98a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
98b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
98c0: 2d 2d 0a 20 2a 0a 20 2a 20 4d 65 73 73 61 67 65  --. *. * Message
98d0: 20 44 69 67 65 73 74 20 43 6f 6e 76 65 6e 69 65   Digest Convenie
98e0: 6e 63 65 20 43 6f 6d 6d 61 6e 64 73 20 2d 2d 0a  nce Commands --.
98f0: 20 2a 0a 20 2a 09 43 6f 6e 76 65 6e 69 65 6e 63   *. *.Convenienc
9900: 65 20 63 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 73  e commands for s
9910: 65 6c 65 63 74 20 6d 65 73 73 61 67 65 20 64 69  elect message di
9920: 67 65 73 74 73 2e 0a 20 2a 0a 20 2a 20 52 65 74  gests.. *. * Ret
9930: 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20  urns:. *.TCL_OK 
9940: 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a  or TCL_ERROR. *.
9950: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
9960: 0a 20 2a 09 53 65 74 73 20 72 65 73 75 6c 74 20  . *.Sets result 
9970: 74 6f 20 6d 65 73 73 61 67 65 20 64 69 67 65 73  to message diges
9980: 74 20 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61  t or error messa
9990: 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  ge. *. *--------
99a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
99b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
99c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
99d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
99e0: 20 69 6e 74 20 54 65 6d 70 6c 61 74 65 43 6d 64   int TemplateCmd
99f0: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
9a00: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
9a10: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
9a20: 6a 76 5b 5d 2c 20 63 68 61 72 20 2a 64 69 67 65  jv[], char *dige
9a30: 73 74 4e 61 6d 65 2c 20 69 6e 74 20 66 6f 72 6d  stName, int form
9a40: 61 74 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  at) {.    Tcl_Ob
9a50: 6a 20 2a 64 61 74 61 4f 62 6a 2c 20 2a 64 69 67  j *dataObj, *dig
9a60: 65 73 74 4f 62 6a 3b 0a 20 20 20 20 69 6e 74 20  estObj;.    int 
9a70: 72 65 73 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62  res;..    if (ob
9a80: 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 64 61 74 61  jc == 2) {..data
9a90: 4f 62 6a 20 3d 20 6f 62 6a 76 5b 31 5d 3b 0a 20  Obj = objv[1];. 
9aa0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c     } else {..Tcl
9ab0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
9ac0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
9ad0: 64 61 74 61 22 29 3b 0a 09 72 65 74 75 72 6e 20  data");..return 
9ae0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
9af0: 0a 0a 20 20 20 20 64 69 67 65 73 74 4f 62 6a 20  ..    digestObj 
9b00: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
9b10: 62 6a 28 64 69 67 65 73 74 4e 61 6d 65 2c 20 2d  bj(digestName, -
9b20: 31 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72  1);.    Tcl_Incr
9b30: 52 65 66 43 6f 75 6e 74 28 64 69 67 65 73 74 4f  RefCount(digestO
9b40: 62 6a 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 44  bj);.    res = D
9b50: 69 67 65 73 74 44 61 74 61 48 61 6e 64 6c 65 72  igestDataHandler
9b60: 28 69 6e 74 65 72 70 2c 20 64 61 74 61 4f 62 6a  (interp, dataObj
9b70: 2c 20 64 69 67 65 73 74 4f 62 6a 2c 20 4e 55 4c  , digestObj, NUL
9b80: 4c 2c 20 66 6f 72 6d 61 74 2c 20 4e 55 4c 4c 2c  L, format, NULL,
9b90: 20 4e 55 4c 4c 2c 20 45 56 50 5f 4d 41 58 5f 4d   NULL, EVP_MAX_M
9ba0: 44 5f 53 49 5a 45 29 3b 0a 20 20 20 20 54 63 6c  D_SIZE);.    Tcl
9bb0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 64 69  _DecrRefCount(di
9bc0: 67 65 73 74 4f 62 6a 29 3b 0a 20 20 20 20 72 65  gestObj);.    re
9bd0: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 20 0a 69 6e  turn res;.}. .in
9be0: 74 20 4d 44 34 4f 62 6a 43 6d 64 28 43 6c 69 65  t MD4ObjCmd(Clie
9bf0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
9c00: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
9c10: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
9c20: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20   Tcl_Obj *const 
9c30: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 28 76  objv[]) {.    (v
9c40: 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b  oid) clientData;
9c50: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 65 6d 70  .    return Temp
9c60: 6c 61 74 65 43 6d 64 28 69 6e 74 65 72 70 2c 20  lateCmd(interp, 
9c70: 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 22 6d 64 34  objc, objv, "md4
9c80: 22 2c 20 48 45 58 5f 46 4f 52 4d 41 54 20 7c 20  ", HEX_FORMAT | 
9c90: 54 59 50 45 5f 4d 44 29 3b 0a 7d 0a 0a 69 6e 74  TYPE_MD);.}..int
9ca0: 20 4d 44 35 4f 62 6a 43 6d 64 28 43 6c 69 65 6e   MD5ObjCmd(Clien
9cb0: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
9cc0: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
9cd0: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
9ce0: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
9cf0: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 28 76 6f  bjv[]) {.    (vo
9d00: 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a  id) clientData;.
9d10: 20 20 20 20 72 65 74 75 72 6e 20 54 65 6d 70 6c      return Templ
9d20: 61 74 65 43 6d 64 28 69 6e 74 65 72 70 2c 20 6f  ateCmd(interp, o
9d30: 62 6a 63 2c 20 6f 62 6a 76 2c 20 22 6d 64 35 22  bjc, objv, "md5"
9d40: 2c 20 48 45 58 5f 46 4f 52 4d 41 54 20 7c 20 54  , HEX_FORMAT | T
9d50: 59 50 45 5f 4d 44 29 3b 0a 7d 0a 0a 69 6e 74 20  YPE_MD);.}..int 
9d60: 53 48 41 31 4f 62 6a 43 6d 64 28 43 6c 69 65 6e  SHA1ObjCmd(Clien
9d70: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
9d80: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
9d90: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
9da0: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
9db0: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 28 76 6f  bjv[]) {.    (vo
9dc0: 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a  id) clientData;.
9dd0: 20 20 20 20 72 65 74 75 72 6e 20 54 65 6d 70 6c      return Templ
9de0: 61 74 65 43 6d 64 28 69 6e 74 65 72 70 2c 20 6f  ateCmd(interp, o
9df0: 62 6a 63 2c 20 6f 62 6a 76 2c 20 22 73 68 61 31  bjc, objv, "sha1
9e00: 22 2c 20 48 45 58 5f 46 4f 52 4d 41 54 20 7c 20  ", HEX_FORMAT | 
9e10: 54 59 50 45 5f 4d 44 29 3b 0a 7d 0a 0a 69 6e 74  TYPE_MD);.}..int
9e20: 20 53 48 41 32 35 36 4f 62 6a 43 6d 64 28 43 6c   SHA256ObjCmd(Cl
9e30: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
9e40: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
9e50: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
9e60: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
9e70: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
9e80: 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74  (void) clientDat
9e90: 61 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 65  a;.    return Te
9ea0: 6d 70 6c 61 74 65 43 6d 64 28 69 6e 74 65 72 70  mplateCmd(interp
9eb0: 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 22 73  , objc, objv, "s
9ec0: 68 61 32 35 36 22 2c 20 48 45 58 5f 46 4f 52 4d  ha256", HEX_FORM
9ed0: 41 54 20 7c 20 54 59 50 45 5f 4d 44 29 3b 0a 7d  AT | TYPE_MD);.}
9ee0: 0a 0a 69 6e 74 20 53 48 41 35 31 32 4f 62 6a 43  ..int SHA512ObjC
9ef0: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  md(ClientData cl
9f00: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e  ientData, Tcl_In
9f10: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
9f20: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
9f30: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b  *const objv[]) {
9f40: 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65  .    (void) clie
9f50: 6e 74 44 61 74 61 3b 0a 20 20 20 20 72 65 74 75  ntData;.    retu
9f60: 72 6e 20 54 65 6d 70 6c 61 74 65 43 6d 64 28 69  rn TemplateCmd(i
9f70: 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a  nterp, objc, obj
9f80: 76 2c 20 22 73 68 61 35 31 32 22 2c 20 48 45 58  v, "sha512", HEX
9f90: 5f 46 4f 52 4d 41 54 20 7c 20 54 59 50 45 5f 4d  _FORMAT | TYPE_M
9fa0: 44 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  D);.}../*. *----
9fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
9ff0: 20 2a 0a 20 2a 20 54 6c 73 5f 44 69 67 65 73 74   *. * Tls_Digest
a000: 43 6f 6d 6d 61 6e 64 73 20 2d 2d 0a 20 2a 0a 20  Commands --. *. 
a010: 2a 09 43 72 65 61 74 65 20 64 69 67 65 73 74 20  *.Create digest 
a020: 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52  commands. *. * R
a030: 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f  eturns:. *.TCL_O
a040: 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20  K or TCL_ERROR. 
a050: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
a060: 73 3a 0a 20 2a 09 43 72 65 61 74 65 73 20 63 6f  s:. *.Creates co
a070: 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d  mmands. *. *----
a080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a0a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a0b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
a0c0: 20 2a 2f 0a 69 6e 74 20 54 6c 73 5f 44 69 67 65   */.int Tls_Dige
a0d0: 73 74 43 6f 6d 6d 61 6e 64 73 28 54 63 6c 5f 49  stCommands(Tcl_I
a0e0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b  nterp *interp) {
a0f0: 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
a100: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
a110: 2c 20 22 3a 3a 74 6c 73 3a 3a 64 69 67 65 73 74  , "::tls::digest
a120: 22 2c 20 4d 64 4f 62 6a 43 6d 64 2c 20 28 43 6c  ", MdObjCmd, (Cl
a130: 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20  ientData) NULL, 
a140: 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
a150: 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  oc *) NULL);.   
a160: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
a170: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a  mmand(interp, ":
a180: 3a 74 6c 73 3a 3a 68 61 73 68 22 2c 20 4d 64 4f  :tls::hash", MdO
a190: 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61  bjCmd, (ClientDa
a1a0: 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43  ta) NULL, (Tcl_C
a1b0: 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
a1c0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43  NULL);.    Tcl_C
a1d0: 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
a1e0: 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a  interp, "::tls::
a1f0: 6d 64 22 2c 20 4d 64 4f 62 6a 43 6d 64 2c 20 28  md", MdObjCmd, (
a200: 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c  ClientData) NULL
a210: 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
a220: 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Proc *) NULL);. 
a230: 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
a240: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
a250: 22 3a 3a 74 6c 73 3a 3a 63 6d 61 63 22 2c 20 43  "::tls::cmac", C
a260: 4d 41 43 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65  MACObjCmd, (Clie
a270: 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54  ntData) NULL, (T
a280: 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
a290: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
a2a0: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
a2b0: 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74  and(interp, "::t
a2c0: 6c 73 3a 3a 68 6d 61 63 22 2c 20 48 4d 41 43 4f  ls::hmac", HMACO
a2d0: 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61  bjCmd, (ClientDa
a2e0: 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43  ta) NULL, (Tcl_C
a2f0: 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
a300: 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43  NULL);.    Tcl_C
a310: 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
a320: 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a  interp, "::tls::
a330: 6d 61 63 22 2c 20 4d 41 43 4f 62 6a 43 6d 64 2c  mac", MACObjCmd,
a340: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55   (ClientData) NU
a350: 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65  LL, (Tcl_CmdDele
a360: 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
a370: 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
a380: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
a390: 2c 20 22 3a 3a 74 6c 73 3a 3a 6d 64 34 22 2c 20  , "::tls::md4", 
a3a0: 4d 44 34 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65  MD4ObjCmd, (Clie
a3b0: 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54  ntData) NULL, (T
a3c0: 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
a3d0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
a3e0: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
a3f0: 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74  and(interp, "::t
a400: 6c 73 3a 3a 6d 64 35 22 2c 20 4d 44 35 4f 62 6a  ls::md5", MD5Obj
a410: 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  Cmd, (ClientData
a420: 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64  ) NULL, (Tcl_Cmd
a430: 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
a440: 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65  LL);.    Tcl_Cre
a450: 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
a460: 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 73 68  terp, "::tls::sh
a470: 61 31 22 2c 20 53 48 41 31 4f 62 6a 43 6d 64 2c  a1", SHA1ObjCmd,
a480: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55   (ClientData) NU
a490: 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65  LL, (Tcl_CmdDele
a4a0: 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
a4b0: 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
a4c0: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
a4d0: 2c 20 22 3a 3a 74 6c 73 3a 3a 73 68 61 32 35 36  , "::tls::sha256
a4e0: 22 2c 20 53 48 41 32 35 36 4f 62 6a 43 6d 64 2c  ", SHA256ObjCmd,
a4f0: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55   (ClientData) NU
a500: 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65  LL, (Tcl_CmdDele
a510: 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
a520: 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
a530: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
a540: 2c 20 22 3a 3a 74 6c 73 3a 3a 73 68 61 35 31 32  , "::tls::sha512
a550: 22 2c 20 53 48 41 35 31 32 4f 62 6a 43 6d 64 2c  ", SHA512ObjCmd,
a560: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55   (ClientData) NU
a570: 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65  LL, (Tcl_CmdDele
a580: 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
a590: 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
a5a0: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
a5b0: 2c 20 22 3a 3a 74 6c 73 3a 3a 75 6e 73 74 61 63  , "::tls::unstac
a5c0: 6b 22 2c 20 44 69 67 65 73 74 55 6e 73 74 61 63  k", DigestUnstac
a5d0: 6b 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  kObjCmd, (Client
a5e0: 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c  Data) NULL, (Tcl
a5f0: 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
a600: 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 72 65 74  ) NULL);.    ret
a610: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a     urn TCL_OK;.}..