Hex Artifact Content

Artifact 7b2ad31134ab1ced6abc3b0c1b4d7478dc40df63166da4daab65762cfe3c412d:


0000: 0a 2f 2a 0a 20 2a 20 44 69 67 65 73 74 20 43 6f  ./*. * Digest Co
0010: 6d 6d 61 6e 64 20 61 6e 64 20 53 74 61 63 6b 65  mmand and Stacke
0020: 64 20 54 72 61 6e 73 66 6f 72 6d 20 43 68 61 6e  d Transform Chan
0030: 6e 65 6c 0a 20 2a 0a 20 2a 20 43 6f 70 79 72 69  nel. *. * Copyri
0040: 67 68 74 20 28 43 29 20 32 30 32 33 20 42 72 69  ght (C) 2023 Bri
0050: 61 6e 20 4f 27 48 61 67 61 6e 0a 20 2a 0a 20 2a  an O'Hagan. *. *
0060: 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73  /..#include "tls
0070: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0080: 22 74 63 6c 4f 70 74 73 2e 68 22 0a 23 69 6e 63  "tclOpts.h".#inc
0090: 6c 75 64 65 20 3c 74 63 6c 2e 68 3e 0a 23 69 6e  lude <tcl.h>.#in
00a0: 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a  clude <stdio.h>.
00b0: 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67  #include <string
00c0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70  .h>.#include <op
00d0: 65 6e 73 73 6c 2f 65 76 70 2e 68 3e 0a 0a 2f 2a  enssl/evp.h>../*
00e0: 20 43 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 63 6f   Constants */.co
00f0: 6e 73 74 20 63 68 61 72 20 2a 68 65 78 20 3d 20  nst char *hex = 
0100: 22 30 31 32 33 34 35 36 37 38 39 41 42 43 44 45  "0123456789ABCDE
0110: 46 22 3b 0a 23 64 65 66 69 6e 65 20 52 45 41 53  F";.#define REAS
0120: 4f 4e 28 29 09 45 52 52 5f 72 65 61 73 6f 6e 5f  ON().ERR_reason_
0130: 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 45 52 52  error_string(ERR
0140: 5f 67 65 74 5f 65 72 72 6f 72 28 29 29 0a 23 64  _get_error()).#d
0150: 65 66 69 6e 65 20 42 55 46 46 45 52 5f 53 49 5a  efine BUFFER_SIZ
0160: 45 20 36 35 35 33 36 0a 23 64 65 66 69 6e 65 20  E 65536.#define 
0170: 42 49 4e 5f 46 4f 52 4d 41 54 20 30 0a 23 64 65  BIN_FORMAT 0.#de
0180: 66 69 6e 65 20 48 45 58 5f 46 4f 52 4d 41 54 20  fine HEX_FORMAT 
0190: 31 0a 0a 2f 2a 0a 20 2a 20 54 68 69 73 20 73 74  1../*. * This st
01a0: 72 75 63 74 75 72 65 20 64 65 73 63 72 69 62 65  ructure describe
01b0: 73 20 74 68 65 20 70 65 72 2d 69 6e 73 74 61 6e  s the per-instan
01c0: 63 65 20 73 74 61 74 65 20 6f 66 20 61 6e 20 53  ce state of an S
01d0: 53 4c 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20  SL channel.. *. 
01e0: 2a 20 54 68 65 20 53 53 4c 20 70 72 6f 63 65 73  * The SSL proces
01f0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 69 73 20  sing context is 
0200: 6d 61 69 6e 74 61 69 6e 65 64 20 68 65 72 65 2c  maintained here,
0210: 20 69 6e 20 74 68 65 20 43 6c 69 65 6e 74 44 61   in the ClientDa
0220: 74 61 0a 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  ta. */.typedef s
0230: 74 72 75 63 74 20 44 69 67 65 73 74 53 74 61 74  truct DigestStat
0240: 65 20 7b 0a 09 54 63 6c 5f 43 68 61 6e 6e 65 6c  e {..Tcl_Channel
0250: 20 73 65 6c 66 3b 09 2f 2a 20 54 68 69 73 20 73   self;./* This s
0260: 6f 63 6b 65 74 20 63 68 61 6e 6e 65 6c 20 2a 2f  ocket channel */
0270: 0a 09 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e  ..Tcl_TimerToken
0280: 20 74 69 6d 65 72 3b 09 2f 2a 20 54 69 6d 65 72   timer;./* Timer
0290: 20 66 6f 72 20 72 65 61 64 20 65 76 65 6e 74 73   for read events
02a0: 20 2a 2f 0a 0a 09 69 6e 74 20 66 6c 61 67 73 3b   */...int flags;
02b0: 09 09 2f 2a 20 43 68 61 6e 20 63 6f 6e 66 69 67  ../* Chan config
02c0: 20 66 6c 61 67 73 20 2a 2f 0a 09 69 6e 74 20 77   flags */..int w
02d0: 61 74 63 68 4d 61 73 6b 3b 09 09 2f 2a 20 43 75  atchMask;../* Cu
02e0: 72 72 65 6e 74 20 57 61 74 63 68 50 72 6f 63 20  rrent WatchProc 
02f0: 6d 61 73 6b 20 2a 2f 0a 09 69 6e 74 20 6d 6f 64  mask */..int mod
0300: 65 3b 09 09 2f 2a 20 43 75 72 72 65 6e 74 20 6d  e;../* Current m
0310: 6f 64 65 20 6f 66 20 70 61 72 65 6e 74 20 63 68  ode of parent ch
0320: 61 6e 6e 65 6c 20 2a 2f 0a 09 69 6e 74 20 66 6f  annel */..int fo
0330: 72 6d 61 74 3b 09 09 2f 2a 20 4f 75 74 70 75 74  rmat;../* Output
0340: 20 66 6f 72 6d 61 74 20 2a 2f 0a 0a 09 54 63 6c   format */...Tcl
0350: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b  _Interp *interp;
0360: 09 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 65  ./* Current inte
0370: 72 70 72 65 74 65 72 20 2a 2f 0a 09 45 56 50 5f  rpreter */..EVP_
0380: 4d 44 5f 43 54 58 20 2a 63 74 78 3b 09 2f 2a 20  MD_CTX *ctx;./* 
0390: 4d 44 20 43 6f 6e 74 65 78 74 20 2a 2f 0a 7d 20  MD Context */.} 
03a0: 44 69 67 65 73 74 53 74 61 74 65 3b 0a 0a 2f 2a  DigestState;../*
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03f0: 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  **/../*. *------
0400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
0440: 0a 20 2a 20 44 69 67 65 73 74 46 69 6c 65 20 2d  . * DigestFile -
0450: 2d 0a 20 2a 0a 20 2a 09 52 65 74 75 72 6e 20 6d  -. *. *.Return m
0460: 65 73 73 61 67 65 20 64 69 67 65 73 74 20 66 6f  essage digest fo
0470: 72 20 66 69 6c 65 20 75 73 69 6e 67 20 75 73 65  r file using use
0480: 72 20 73 70 65 63 69 66 69 65 64 20 68 61 73 68  r specified hash
0490: 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a   function.. *. *
04a0: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c   Returns:. *.TCL
04b0: 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52  _OK or TCL_ERROR
04c0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
04d0: 63 74 73 3a 0a 20 2a 09 52 65 73 75 6c 74 20 69  cts:. *.Result i
04e0: 73 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74  s message digest
04f0: 20 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67   or error messag
0500: 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  e. *. *---------
0510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69  ----------. */.i
0550: 6e 74 20 44 69 67 65 73 74 46 69 6c 65 28 54 63  nt DigestFile(Tc
0560: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
0570: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 66 69 6c 65 6e  , Tcl_Obj *filen
0580: 61 6d 65 2c 20 63 6f 6e 73 74 20 45 56 50 5f 4d  ame, const EVP_M
0590: 44 20 2a 6d 64 2c 20 69 6e 74 20 66 6f 72 6d 61  D *md, int forma
05a0: 74 2c 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79  t,..Tcl_Obj *key
05b0: 4f 62 6a 29 20 7b 0a 20 20 20 20 45 56 50 5f 4d  Obj) {.    EVP_M
05c0: 44 5f 43 54 58 20 2a 63 74 78 20 3d 20 28 45 56  D_CTX *ctx = (EV
05d0: 50 5f 4d 44 5f 43 54 58 20 2a 29 20 4e 55 4c 4c  P_MD_CTX *) NULL
05e0: 3b 0a 20 20 20 20 48 4d 41 43 5f 43 54 58 20 2a  ;.    HMAC_CTX *
05f0: 68 63 74 78 20 3d 20 28 48 4d 41 43 5f 43 54 58  hctx = (HMAC_CTX
0600: 20 2a 29 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63   *) NULL;.    Tc
0610: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a  l_Channel chan;.
0620: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
0630: 72 20 62 75 66 5b 42 55 46 46 45 52 5f 53 49 5a  r buf[BUFFER_SIZ
0640: 45 5d 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  E];.    unsigned
0650: 20 63 68 61 72 20 6d 64 5f 62 75 66 5b 45 56 50   char md_buf[EVP
0660: 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45 5d 3b 0a 20  _MAX_MD_SIZE];. 
0670: 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
0680: 6d 64 5f 6c 65 6e 3b 0a 20 20 20 20 75 6e 73 69  md_len;.    unsi
0690: 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 3b 0a  gned char *key;.
06a0: 20 20 20 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 2c      int key_len,
06b0: 20 72 65 73 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70   res;..    /* Op
06c0: 65 6e 20 66 69 6c 65 20 63 68 61 6e 6e 65 6c 20  en file channel 
06d0: 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  */.    chan = Tc
06e0: 6c 5f 46 53 4f 70 65 6e 46 69 6c 65 43 68 61 6e  l_FSOpenFileChan
06f0: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 66 69 6c 65  nel(interp, file
0700: 6e 61 6d 65 2c 20 22 72 62 22 2c 20 30 34 34 34  name, "rb", 0444
0710: 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20  );.    if (chan 
0720: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29  == (Tcl_Channel)
0730: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
0740: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
0750: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67  }..    /* Config
0760: 75 72 65 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  ure channel */. 
0770: 20 20 20 69 66 20 28 54 63 6c 5f 53 65 74 43 68     if (Tcl_SetCh
0780: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
0790: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e  rp, chan, "-tran
07a0: 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72  slation", "binar
07b0: 79 22 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52  y") == TCL_ERROR
07c0: 29 20 7b 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b  ) {..goto error;
07d0: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53  .    }.    Tcl_S
07e0: 65 74 43 68 61 6e 6e 65 6c 42 75 66 66 65 72 53  etChannelBufferS
07f0: 69 7a 65 28 63 68 61 6e 2c 20 42 55 46 46 45 52  ize(chan, BUFFER
0800: 5f 53 49 5a 45 29 3b 0a 0a 20 20 20 20 2f 2a 20  _SIZE);..    /* 
0810: 43 72 65 61 74 65 20 6d 65 73 73 61 67 65 20 64  Create message d
0820: 69 67 65 73 74 20 63 6f 6e 74 65 78 74 20 2a 2f  igest context */
0830: 0a 20 20 20 20 69 66 20 28 6b 65 79 4f 62 6a 20  .    if (keyObj 
0840: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 74 78 20  == NULL) {..ctx 
0850: 3d 20 45 56 50 5f 4d 44 5f 43 54 58 5f 6e 65 77  = EVP_MD_CTX_new
0860: 28 29 3b 0a 09 72 65 73 20 3d 20 28 63 74 78 20  ();..res = (ctx 
0870: 21 3d 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 20  != NULL);.    } 
0880: 65 6c 73 65 20 7b 0a 09 68 63 74 78 20 3d 20 48  else {..hctx = H
0890: 4d 41 43 5f 43 54 58 5f 6e 65 77 28 29 3b 0a 09  MAC_CTX_new();..
08a0: 72 65 73 20 3d 20 28 68 63 74 78 20 21 3d 20 4e  res = (hctx != N
08b0: 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ULL);.    }.    
08c0: 69 66 20 28 21 72 65 73 29 20 7b 0a 09 54 63 6c  if (!res) {..Tcl
08d0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
08e0: 74 65 72 70 2c 20 22 43 72 65 61 74 65 20 64 69  terp, "Create di
08f0: 67 65 73 74 20 63 6f 6e 74 65 78 74 20 66 61 69  gest context fai
0900: 6c 65 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29  led: ", REASON()
0910: 2c 20 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65  , NULL);..goto e
0920: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rror;.    }..   
0930: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 68   /* Initialize h
0940: 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ash function */.
0950: 20 20 20 20 69 66 20 28 6b 65 79 4f 62 6a 20 3d      if (keyObj =
0960: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 20 3d  = NULL) {..res =
0970: 20 45 56 50 5f 44 69 67 65 73 74 49 6e 69 74 5f   EVP_DigestInit_
0980: 65 78 28 63 74 78 2c 20 6d 64 2c 20 4e 55 4c 4c  ex(ctx, md, NULL
0990: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
09a0: 09 6b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42 79  .key = Tcl_GetBy
09b0: 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6b  teArrayFromObj(k
09c0: 65 79 4f 62 6a 2c 20 26 6b 65 79 5f 6c 65 6e 29  eyObj, &key_len)
09d0: 3b 0a 09 72 65 73 20 3d 20 48 4d 41 43 5f 49 6e  ;..res = HMAC_In
09e0: 69 74 5f 65 78 28 68 63 74 78 2c 20 28 63 6f 6e  it_ex(hctx, (con
09f0: 73 74 20 76 6f 69 64 20 2a 29 20 6b 65 79 2c 20  st void *) key, 
0a00: 6b 65 79 5f 6c 65 6e 2c 20 6d 64 2c 20 4e 55 4c  key_len, md, NUL
0a10: 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  L);.    }.    if
0a20: 20 28 21 72 65 73 29 20 7b 0a 09 54 63 6c 5f 41   (!res) {..Tcl_A
0a30: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
0a40: 72 70 2c 20 22 49 6e 69 74 69 61 6c 69 7a 65 20  rp, "Initialize 
0a50: 64 69 67 65 73 74 20 66 61 69 6c 65 64 3a 20 22  digest failed: "
0a60: 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c  , REASON(), NULL
0a70: 29 3b 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a  );..goto error;.
0a80: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
0a90: 61 64 20 66 69 6c 65 20 64 61 74 61 20 61 6e 64  ad file data and
0aa0: 20 75 70 64 61 74 65 20 68 61 73 68 20 66 75 6e   update hash fun
0ab0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 77 68 69  ction */.    whi
0ac0: 6c 65 20 28 21 54 63 6c 5f 45 6f 66 28 63 68 61  le (!Tcl_Eof(cha
0ad0: 6e 29 29 20 7b 0a 09 69 6e 74 20 6c 65 6e 20 3d  n)) {..int len =
0ae0: 20 54 63 6c 5f 52 65 61 64 52 61 77 28 63 68 61   Tcl_ReadRaw(cha
0af0: 6e 2c 20 28 63 68 61 72 20 2a 29 20 62 75 66 2c  n, (char *) buf,
0b00: 20 42 55 46 46 45 52 5f 53 49 5a 45 29 3b 0a 09   BUFFER_SIZE);..
0b10: 69 66 20 28 6b 65 79 4f 62 6a 20 3d 3d 20 4e 55  if (keyObj == NU
0b20: 4c 4c 29 20 7b 0a 09 20 20 20 20 72 65 73 20 3d  LL) {..    res =
0b30: 20 45 56 50 5f 44 69 67 65 73 74 55 70 64 61 74   EVP_DigestUpdat
0b40: 65 28 63 74 78 2c 20 26 62 75 66 2c 20 28 73 69  e(ctx, &buf, (si
0b50: 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 7d 20 65  ze_t) len);..} e
0b60: 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 73 20 3d  lse {..    res =
0b70: 20 48 4d 41 43 5f 55 70 64 61 74 65 28 68 63 74   HMAC_Update(hct
0b80: 78 2c 20 26 62 75 66 5b 30 5d 2c 20 28 73 69 7a  x, &buf[0], (siz
0b90: 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 7d 0a 09 69  e_t) len);..}..i
0ba0: 66 20 28 6c 65 6e 20 3e 20 30 20 26 26 20 21 72  f (len > 0 && !r
0bb0: 65 73 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41  es) {..    Tcl_A
0bc0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
0bd0: 72 70 2c 20 22 55 70 64 61 74 65 20 64 69 67 65  rp, "Update dige
0be0: 73 74 20 66 61 69 6c 65 64 3a 20 22 2c 20 52 45  st failed: ", RE
0bf0: 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09  ASON(), NULL);..
0c00: 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 3b 0a      goto error;.
0c10: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  .}.    }..    /*
0c20: 20 43 6c 6f 73 65 20 63 68 61 6e 6e 65 6c 20 2a   Close channel *
0c30: 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 43 6c  /.    if (Tcl_Cl
0c40: 6f 73 65 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  ose(interp, chan
0c50: 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20  ) == TCL_ERROR) 
0c60: 7b 0a 09 63 68 61 6e 20 3d 20 28 54 63 6c 5f 43  {..chan = (Tcl_C
0c70: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 3b 0a 09 67  hannel) NULL;..g
0c80: 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 7d  oto error;.    }
0c90: 0a 20 20 20 20 63 68 61 6e 20 3d 20 28 54 63 6c  .    chan = (Tcl
0ca0: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 3b 0a  _Channel) NULL;.
0cb0: 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65  .    /* Finalize
0cc0: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 61   hash function a
0cd0: 6e 64 20 63 61 6c 63 75 6c 61 74 65 20 6d 65 73  nd calculate mes
0ce0: 73 61 67 65 20 64 69 67 65 73 74 20 2a 2f 0a 20  sage digest */. 
0cf0: 20 20 20 69 66 20 28 6b 65 79 4f 62 6a 20 3d 3d     if (keyObj ==
0d00: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 20 3d 20   NULL) {..res = 
0d10: 45 56 50 5f 44 69 67 65 73 74 46 69 6e 61 6c 5f  EVP_DigestFinal_
0d20: 65 78 28 63 74 78 2c 20 6d 64 5f 62 75 66 2c 20  ex(ctx, md_buf, 
0d30: 26 6d 64 5f 6c 65 6e 29 3b 0a 20 20 20 20 7d 20  &md_len);.    } 
0d40: 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 48 4d  else {..res = HM
0d50: 41 43 5f 46 69 6e 61 6c 28 68 63 74 78 2c 20 6d  AC_Final(hctx, m
0d60: 64 5f 62 75 66 2c 20 26 6d 64 5f 6c 65 6e 29 3b  d_buf, &md_len);
0d70: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21  .    }.    if (!
0d80: 72 65 73 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  res) {..Tcl_Appe
0d90: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
0da0: 20 22 46 69 6e 61 6c 69 7a 65 20 64 69 67 65 73   "Finalize diges
0db0: 74 20 66 61 69 6c 65 64 3a 20 22 2c 20 52 45 41  t failed: ", REA
0dc0: 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 67  SON(), NULL);..g
0dd0: 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 7d  oto error;.    }
0de0: 0a 0a 20 20 20 20 2f 2a 20 44 6f 6e 65 20 77 69  ..    /* Done wi
0df0: 74 68 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 20  th struct */.   
0e00: 20 45 56 50 5f 4d 44 5f 43 54 58 5f 66 72 65 65   EVP_MD_CTX_free
0e10: 28 63 74 78 29 3b 0a 20 20 20 20 63 74 78 20 3d  (ctx);.    ctx =
0e20: 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 52   NULL;..    /* R
0e30: 65 74 75 72 6e 20 6d 65 73 73 61 67 65 20 64 69  eturn message di
0e40: 67 65 73 74 20 61 73 20 65 69 74 68 65 72 20 61  gest as either a
0e50: 20 62 69 6e 61 72 79 20 6f 72 20 68 65 78 20 73   binary or hex s
0e60: 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 69 66 20  tring */.    if 
0e70: 28 66 6f 72 6d 61 74 20 3d 3d 20 42 49 4e 5f 46  (format == BIN_F
0e80: 4f 52 4d 41 54 29 20 7b 0a 09 54 63 6c 5f 53 65  ORMAT) {..Tcl_Se
0e90: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
0ea0: 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72  p, Tcl_NewByteAr
0eb0: 72 61 79 4f 62 6a 28 6d 64 5f 62 75 66 2c 20 6d  rayObj(md_buf, m
0ec0: 64 5f 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 7d 20  d_len));..    } 
0ed0: 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20  else {..Tcl_Obj 
0ee0: 2a 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c  *resultObj = Tcl
0ef0: 5f 4e 65 77 4f 62 6a 28 29 3b 0a 09 75 6e 73 69  _NewObj();..unsi
0f00: 67 6e 65 64 20 63 68 61 72 20 2a 70 74 72 20 3d  gned char *ptr =
0f10: 20 54 63 6c 5f 53 65 74 42 79 74 65 41 72 72 61   Tcl_SetByteArra
0f20: 79 4c 65 6e 67 74 68 28 72 65 73 75 6c 74 4f 62  yLength(resultOb
0f30: 6a 2c 20 6d 64 5f 6c 65 6e 2a 32 29 3b 0a 0a 09  j, md_len*2);...
0f40: 66 6f 72 20 28 75 6e 73 69 67 6e 65 64 20 69 6e  for (unsigned in
0f50: 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 6d 64 5f  t i = 0; i < md_
0f60: 6c 65 6e 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20  len; i++) {..   
0f70: 20 2a 70 74 72 2b 2b 20 3d 20 68 65 78 5b 28 6d   *ptr++ = hex[(m
0f80: 64 5f 62 75 66 5b 69 5d 20 3e 3e 20 34 29 20 26  d_buf[i] >> 4) &
0f90: 20 30 78 30 46 5d 3b 0a 09 20 20 20 20 2a 70 74   0x0F];..    *pt
0fa0: 72 2b 2b 20 3d 20 68 65 78 5b 6d 64 5f 62 75 66  r++ = hex[md_buf
0fb0: 5b 69 5d 20 26 20 30 78 30 46 5d 3b 0a 09 7d 0a  [i] & 0x0F];..}.
0fc0: 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c  .Tcl_SetObjResul
0fd0: 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74  t(interp, result
0fe0: 4f 62 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Obj);.    }.    
0ff0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a  return TCL_OK;..
1000: 65 72 72 6f 72 3a 0a 20 20 20 20 69 66 20 28 63  error:.    if (c
1010: 68 61 6e 20 21 3d 20 28 54 63 6c 5f 43 68 61 6e  han != (Tcl_Chan
1020: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63  nel) NULL) {..Tc
1030: 6c 5f 43 6c 6f 73 65 28 69 6e 74 65 72 70 2c 20  l_Close(interp, 
1040: 63 68 61 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  chan);.    }.   
1050: 20 69 66 20 28 63 74 78 20 21 3d 20 28 45 56 50   if (ctx != (EVP
1060: 5f 4d 44 5f 43 54 58 20 2a 29 20 4e 55 4c 4c 29  _MD_CTX *) NULL)
1070: 20 7b 0a 09 45 56 50 5f 4d 44 5f 43 54 58 5f 66   {..EVP_MD_CTX_f
1080: 72 65 65 28 63 74 78 29 3b 0a 20 20 20 20 7d 0a  ree(ctx);.    }.
1090: 20 20 20 20 69 66 20 28 68 63 74 78 20 21 3d 20      if (hctx != 
10a0: 28 48 4d 41 43 5f 43 54 58 20 2a 29 20 4e 55 4c  (HMAC_CTX *) NUL
10b0: 4c 29 20 7b 0a 09 48 4d 41 43 5f 43 54 58 5f 66  L) {..HMAC_CTX_f
10c0: 72 65 65 28 68 63 74 78 29 3b 0a 20 20 20 20 7d  ree(hctx);.    }
10d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
10e0: 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a  ERROR;.}../*****
10f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
1130: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
1140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
1180: 44 69 67 65 73 74 42 6c 6f 63 6b 4d 6f 64 65 50  DigestBlockModeP
1190: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  roc --. *. *.Thi
11a0: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69  s procedure is i
11b0: 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 67 65  nvoked by the ge
11c0: 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 6c 0a 20  neric IO level. 
11d0: 2a 20 20 20 20 20 20 20 74 6f 20 73 65 74 20 62  *       to set b
11e0: 6c 6f 63 6b 69 6e 67 20 61 6e 64 20 6e 6f 6e 62  locking and nonb
11f0: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 2e 0a 20  locking modes.. 
1200: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a  *. * Returns:. *
1210: 09 30 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  .0 if successful
1220: 20 6f 72 20 50 4f 53 49 58 20 65 72 72 6f 72 20   or POSIX error 
1230: 63 6f 64 65 20 69 66 20 66 61 69 6c 65 64 2e 0a  code if failed..
1240: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
1250: 74 73 3a 0a 20 2a 09 53 65 74 73 20 74 68 65 20  ts:. *.Sets the 
1260: 64 65 76 69 63 65 20 69 6e 74 6f 20 62 6c 6f 63  device into bloc
1270: 6b 69 6e 67 20 6f 72 20 6e 6f 6e 62 6c 6f 63 6b  king or nonblock
1280: 69 6e 67 20 6d 6f 64 65 2e 0a 20 2a 09 43 61 6e  ing mode.. *.Can
1290: 20 63 61 6c 6c 20 54 63 6c 5f 53 65 74 43 68 61   call Tcl_SetCha
12a0: 6e 6e 65 6c 45 72 72 6f 72 2e 0a 20 2a 0a 20 2a  nnelError.. *. *
12b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
1300: 6e 74 20 44 69 67 65 73 74 42 6c 6f 63 6b 4d 6f  nt DigestBlockMo
1310: 64 65 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74  deProc(ClientDat
1320: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e  a clientData, in
1330: 74 20 6d 6f 64 65 29 20 7b 0a 20 20 20 20 44 69  t mode) {.    Di
1340: 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65  gestState *state
1350: 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 61  Ptr = (DigestSta
1360: 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61  te *) clientData
1370: 3b 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 20  ;..    if (mode 
1380: 3d 3d 20 54 43 4c 5f 4d 4f 44 45 5f 4e 4f 4e 42  == TCL_MODE_NONB
1390: 4c 4f 43 4b 49 4e 47 29 20 7b 0a 09 73 74 61 74  LOCKING) {..stat
13a0: 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54  ePtr->flags |= T
13b0: 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 3b 0a 20 20  LS_TCL_ASYNC;.  
13c0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 74 61 74    } else {..stat
13d0: 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e  ePtr->flags &= ~
13e0: 28 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29 3b  (TLS_TCL_ASYNC);
13f0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
1400: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  n 0;.}../*. *---
1410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1450: 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 46 72 65  . *. * DigestFre
1460: 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  e --. *. *.This 
1470: 70 72 6f 63 65 64 75 72 65 20 72 65 6d 6f 76 65  procedure remove
1480: 73 20 61 20 64 69 67 65 73 74 20 73 74 61 74 65  s a digest state
1490: 20 73 74 72 75 63 74 75 72 65 0a 20 2a 0a 20 2a   structure. *. *
14a0: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 4e 6f 74   Returns:. *.Not
14b0: 68 69 6e 67 0a 20 2a 0a 20 2a 20 53 69 64 65 20  hing. *. * Side 
14c0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 52 65 6d 6f  effects:. *.Remo
14d0: 76 65 73 20 73 74 72 75 63 74 75 72 65 0a 20 2a  ves structure. *
14e0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
14f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1520: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20  ------. */.void 
1530: 44 69 67 65 73 74 46 72 65 65 20 28 44 69 67 65  DigestFree (Dige
1540: 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74  stState *statePt
1550: 72 29 20 7b 0a 20 20 20 20 69 66 20 28 73 74 61  r) {.    if (sta
1560: 74 65 50 74 72 20 3d 3d 20 28 44 69 67 65 73 74  tePtr == (Digest
1570: 53 74 61 74 65 20 2a 29 20 4e 55 4c 4c 29 20 72  State *) NULL) r
1580: 65 74 75 72 6e 3b 0a 20 20 20 20 0a 20 20 20 20  eturn;.    .    
1590: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 74  if (statePtr->ct
15a0: 78 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 45 56  x != NULL) {..EV
15b0: 50 5f 4d 44 5f 43 54 58 5f 66 72 65 65 28 73 74  P_MD_CTX_free(st
15c0: 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20  atePtr->ctx);.  
15d0: 20 20 7d 0a 20 20 20 20 63 6b 66 72 65 65 28 73    }.    ckfree(s
15e0: 74 61 74 65 50 74 72 29 3b 0a 7d 0a 0a 2f 2a 0a  tatePtr);.}../*.
15f0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
1600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1630: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65  -----. *. * Dige
1640: 73 74 43 6c 6f 73 65 50 72 6f 63 20 2d 2d 0a 20  stCloseProc --. 
1650: 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64  *. *.This proced
1660: 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 62  ure is invoked b
1670: 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f  y the generic IO
1680: 20 6c 65 76 65 6c 20 74 6f 20 70 65 72 66 6f 72   level to perfor
1690: 6d 0a 20 2a 09 63 68 61 6e 6e 65 6c 2d 74 79 70  m. *.channel-typ
16a0: 65 2d 73 70 65 63 69 66 69 63 20 63 6c 65 61 6e  e-specific clean
16b0: 75 70 20 77 68 65 6e 20 64 69 67 65 73 74 20 63  up when digest c
16c0: 68 61 6e 6e 65 6c 20 69 73 20 63 6c 6f 73 65 64  hannel is closed
16d0: 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a  .. *. * Returns:
16e0: 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43  . *.TCL_OK or TC
16f0: 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69  L_ERROR. *. * Si
1700: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 57  de effects:. *.W
1710: 72 69 74 65 73 20 64 69 67 65 73 74 20 74 6f 20  rites digest to 
1720: 6f 75 74 70 75 74 20 61 6e 64 20 63 6c 6f 73 65  output and close
1730: 73 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e 0a 20  s the channel.. 
1740: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
1750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1780: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20  -------. */.int 
1790: 44 69 67 65 73 74 43 6c 6f 73 65 50 72 6f 63 28  DigestCloseProc(
17a0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
17b0: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
17c0: 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20  p *interp) {.   
17d0: 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74   DigestState *st
17e0: 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 74  atePtr = (Digest
17f0: 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44  State *) clientD
1800: 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 72 65 73  ata;.    int res
1810: 75 6c 74 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  ult = 0;..    /*
1820: 20 43 61 6e 63 65 6c 20 61 63 74 69 76 65 20 74   Cancel active t
1830: 69 6d 65 72 2c 20 69 66 20 61 6e 79 20 2a 2f 0a  imer, if any */.
1840: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
1850: 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f  ->timer != (Tcl_
1860: 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c  TimerToken) NULL
1870: 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54  ) {..Tcl_DeleteT
1880: 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74  imerHandler(stat
1890: 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73  ePtr->timer);..s
18a0: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d  tatePtr->timer =
18b0: 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e   (Tcl_TimerToken
18c0: 29 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20  ) NULL;.    }.. 
18d0: 20 20 20 2f 2a 20 43 6c 65 61 6e 2d 75 70 20 2a     /* Clean-up *
18e0: 2f 0a 20 20 20 20 44 69 67 65 73 74 46 72 65 65  /.    DigestFree
18f0: 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20  (statePtr);.    
1900: 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a 7d  return result;.}
1910: 0a 0a 2f 2a 0a 20 2a 20 53 61 6d 65 20 61 73 20  ../*. * Same as 
1920: 44 69 67 65 73 74 43 6c 6f 73 65 50 72 6f 63 20  DigestCloseProc 
1930: 62 75 74 20 77 69 74 68 20 69 6e 64 69 76 69 64  but with individ
1940: 75 61 6c 20 72 65 61 64 20 61 6e 64 20 77 72 69  ual read and wri
1950: 74 65 20 63 6c 6f 73 65 20 63 6f 6e 74 72 6f 6c  te close control
1960: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
1970: 44 69 67 65 73 74 43 6c 6f 73 65 32 50 72 6f 63  DigestClose2Proc
1980: 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74  (ClientData inst
1990: 61 6e 63 65 44 61 74 61 2c 20 54 63 6c 5f 49 6e  anceData, Tcl_In
19a0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
19b0: 74 20 66 6c 61 67 73 29 20 7b 0a 0a 20 20 20 20  t flags) {..    
19c0: 69 66 20 28 28 66 6c 61 67 73 20 26 20 28 54 43  if ((flags & (TC
19d0: 4c 5f 43 4c 4f 53 45 5f 52 45 41 44 20 7c 20 54  L_CLOSE_READ | T
19e0: 43 4c 5f 43 4c 4f 53 45 5f 57 52 49 54 45 29 29  CL_CLOSE_WRITE))
19f0: 20 3d 3d 20 30 29 20 7b 0a 09 72 65 74 75 72 6e   == 0) {..return
1a00: 20 44 69 67 65 73 74 43 6c 6f 73 65 50 72 6f 63   DigestCloseProc
1a10: 28 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69  (instanceData, i
1a20: 6e 74 65 72 70 29 3b 0a 20 20 20 20 7d 0a 20 20  nterp);.    }.  
1a30: 20 20 72 65 74 75 72 6e 20 45 49 4e 56 41 4c 3b    return EINVAL;
1a40: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
1a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1a90: 20 2a 0a 20 2a 20 44 69 67 65 73 74 49 6e 70 75   *. * DigestInpu
1aa0: 74 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43  tProc --. *. *.C
1ab0: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 67 65 6e  alled by the gen
1ac0: 65 72 69 63 20 49 4f 20 73 79 73 74 65 6d 20 74  eric IO system t
1ad0: 6f 20 72 65 61 64 20 64 61 74 61 20 66 72 6f 6d  o read data from
1ae0: 20 74 72 61 6e 73 66 6f 72 6d 2e 0a 20 2a 0a 20   transform.. *. 
1af0: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 6f  * Returns:. *.To
1b00: 74 61 6c 20 62 79 74 65 73 20 72 65 61 64 0a 20  tal bytes read. 
1b10: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
1b20: 73 3a 0a 20 2a 09 52 65 61 64 20 64 61 74 61 20  s:. *.Read data 
1b30: 66 72 6f 6d 20 74 72 61 6e 73 66 6f 72 6d 20 61  from transform a
1b40: 6e 64 20 77 72 69 74 65 20 74 6f 20 62 75 66 0a  nd write to buf.
1b50: 20 2a 0a 20 2a 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 2d 2d  ----------------
1b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
1ba0: 69 6e 74 20 44 69 67 65 73 74 49 6e 70 75 74 50  int DigestInputP
1bb0: 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 63  roc(ClientData c
1bc0: 6c 69 65 6e 74 44 61 74 61 2c 20 63 68 61 72 20  lientData, char 
1bd0: 2a 62 75 66 2c 20 69 6e 74 20 74 6f 52 65 61 64  *buf, int toRead
1be0: 2c 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65  , int *errorCode
1bf0: 50 74 72 29 20 7b 0a 20 20 20 20 44 69 67 65 73  Ptr) {.    Diges
1c00: 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72  tState *statePtr
1c10: 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20   = (DigestState 
1c20: 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20  *) clientData;. 
1c30: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 70     Tcl_Channel p
1c40: 61 72 65 6e 74 3b 0a 20 20 20 20 69 6e 74 20 72  arent;.    int r
1c50: 65 61 64 3b 0a 20 20 20 20 2a 65 72 72 6f 72 43  ead;.    *errorC
1c60: 6f 64 65 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20  odePtr = 0;..   
1c70: 20 69 66 20 28 74 6f 52 65 61 64 20 3c 3d 20 30   if (toRead <= 0
1c80: 20 7c 7c 20 73 74 61 74 65 50 74 72 2d 3e 73 65   || statePtr->se
1c90: 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e  lf == (Tcl_Chann
1ca0: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74  el) NULL) {..ret
1cb0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  urn 0;.    }..  
1cc0: 20 20 2f 2a 20 47 65 74 20 62 79 74 65 73 20 66    /* Get bytes f
1cd0: 72 6f 6d 20 75 6e 64 65 72 6c 79 69 6e 67 20 63  rom underlying c
1ce0: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 70 61  hannel */.    pa
1cf0: 72 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74  rent = Tcl_GetSt
1d00: 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 61  ackedChannel(sta
1d10: 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 20 20  tePtr->self);.  
1d20: 20 20 72 65 61 64 20 3d 20 54 63 6c 5f 52 65 61    read = Tcl_Rea
1d30: 64 52 61 77 28 70 61 72 65 6e 74 2c 20 62 75 66  dRaw(parent, buf
1d40: 2c 20 74 6f 52 65 61 64 29 3b 0a 0a 20 20 20 20  , toRead);..    
1d50: 2f 2a 20 41 64 64 20 74 6f 20 6d 65 73 73 61 67  /* Add to messag
1d60: 65 20 64 69 67 65 73 74 20 2a 2f 0a 20 20 20 20  e digest */.    
1d70: 69 66 20 28 72 65 61 64 20 3e 20 30 29 20 7b 0a  if (read > 0) {.
1d80: 09 2f 2a 20 4f 4b 20 2a 2f 0a 09 69 66 20 28 21  ./* OK */..if (!
1d90: 45 56 50 5f 44 69 67 65 73 74 55 70 64 61 74 65  EVP_DigestUpdate
1da0: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
1db0: 62 75 66 2c 20 72 65 61 64 29 29 20 7b 0a 09 20  buf, read)) {.. 
1dc0: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65     Tcl_SetChanne
1dd0: 6c 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2d  lError(statePtr-
1de0: 3e 73 65 6c 66 2c 20 54 63 6c 5f 4f 62 6a 50 72  >self, Tcl_ObjPr
1df0: 69 6e 74 66 28 22 44 69 67 65 73 74 20 75 70 64  intf("Digest upd
1e00: 61 74 65 20 66 61 69 6c 65 64 3a 20 25 73 22 2c  ate failed: %s",
1e10: 20 52 45 41 53 4f 4e 28 29 29 29 3b 0a 09 20 20   REASON()));..  
1e20: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20    *errorCodePtr 
1e30: 3d 20 45 49 4e 56 41 4c 3b 0a 09 20 20 20 20 72  = EINVAL;..    r
1e40: 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 09 2a 65  eturn -1;..}..*e
1e50: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41  rrorCodePtr = EA
1e60: 47 41 49 4e 3b 0a 09 72 65 61 64 20 3d 20 2d 31  GAIN;..read = -1
1e70: 3b 0a 09 20 20 20 20 0a 20 20 20 20 7d 20 65 6c  ;..    .    } el
1e80: 73 65 20 69 66 20 28 72 65 61 64 20 3c 20 30 29  se if (read < 0)
1e90: 20 7b 0a 09 2f 2a 20 45 72 72 6f 72 20 2a 2f 0a   {../* Error */.
1ea0: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d  .*errorCodePtr =
1eb0: 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b   Tcl_GetErrno();
1ec0: 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
1ed0: 28 21 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61  (!(statePtr->fla
1ee0: 67 73 20 26 20 30 78 31 30 29 29 20 7b 0a 09 2f  gs & 0x10)) {../
1ef0: 2a 20 45 4f 46 20 2a 2f 0a 09 2a 65 72 72 6f 72  * EOF */..*error
1f00: 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 75 6e  CodePtr = 0;..un
1f10: 73 69 67 6e 65 64 20 63 68 61 72 20 6d 64 5f 62  signed char md_b
1f20: 75 66 5b 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49  uf[EVP_MAX_MD_SI
1f30: 5a 45 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69  ZE];..unsigned i
1f40: 6e 74 20 6d 64 5f 6c 65 6e 20 3d 20 30 3b 0a 0a  nt md_len = 0;..
1f50: 09 2f 2a 20 47 65 74 20 6d 65 73 73 61 67 65 20  ./* Get message 
1f60: 64 69 67 65 73 74 20 2a 2f 0a 09 69 66 20 28 21  digest */..if (!
1f70: 45 56 50 5f 44 69 67 65 73 74 46 69 6e 61 6c 5f  EVP_DigestFinal_
1f80: 65 78 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  ex(statePtr->ctx
1f90: 2c 20 6d 64 5f 62 75 66 2c 20 26 6d 64 5f 6c 65  , md_buf, &md_le
1fa0: 6e 29 29 20 7b 0a 09 20 20 20 20 2a 65 72 72 6f  n)) {..    *erro
1fb0: 72 43 6f 64 65 50 74 72 20 3d 20 45 49 4e 56 41  rCodePtr = EINVA
1fc0: 4c 3b 0a 0a 09 2f 2a 20 57 72 69 74 65 20 6d 65  L;.../* Write me
1fd0: 73 73 61 67 65 20 64 69 67 65 73 74 20 74 6f 20  ssage digest to 
1fe0: 6f 75 74 70 75 74 20 63 68 61 6e 6e 65 6c 20 61  output channel a
1ff0: 73 20 62 79 74 65 20 61 72 72 61 79 20 6f 72 20  s byte array or 
2000: 68 65 78 20 73 74 72 69 6e 67 20 2a 2f 0a 09 7d  hex string */..}
2010: 20 65 6c 73 65 20 69 66 20 28 6d 64 5f 6c 65 6e   else if (md_len
2020: 20 3e 20 30 29 20 7b 0a 09 20 20 20 20 69 66 20   > 0) {..    if 
2030: 28 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61  (statePtr->forma
2040: 74 20 3d 3d 20 42 49 4e 5f 46 4f 52 4d 41 54 29  t == BIN_FORMAT)
2050: 20 7b 0a 09 09 72 65 61 64 20 3d 20 6d 64 5f 6c   {...read = md_l
2060: 65 6e 3b 0a 09 09 6d 65 6d 63 70 79 28 62 75 66  en;...memcpy(buf
2070: 2c 20 6d 64 5f 62 75 66 2c 20 72 65 61 64 29 3b  , md_buf, read);
2080: 0a 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  ...    } else {.
2090: 09 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
20a0: 68 65 78 5f 62 75 66 5b 45 56 50 5f 4d 41 58 5f  hex_buf[EVP_MAX_
20b0: 4d 44 5f 53 49 5a 45 2a 32 5d 3b 0a 09 09 75 6e  MD_SIZE*2];...un
20c0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 74 72  signed char *ptr
20d0: 20 3d 20 68 65 78 5f 62 75 66 3b 0a 0a 09 09 66   = hex_buf;....f
20e0: 6f 72 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  or (unsigned int
20f0: 20 69 20 3d 20 30 3b 20 69 20 3c 20 6d 64 5f 6c   i = 0; i < md_l
2100: 65 6e 3b 20 69 2b 2b 29 20 7b 0a 09 09 20 20 20  en; i++) {...   
2110: 20 2a 70 74 72 2b 2b 20 3d 20 68 65 78 5b 28 6d   *ptr++ = hex[(m
2120: 64 5f 62 75 66 5b 69 5d 20 3e 3e 20 34 29 20 26  d_buf[i] >> 4) &
2130: 20 30 78 30 46 5d 3b 0a 09 09 20 20 20 20 2a 70   0x0F];...    *p
2140: 74 72 2b 2b 20 3d 20 68 65 78 5b 6d 64 5f 62 75  tr++ = hex[md_bu
2150: 66 5b 69 5d 20 26 20 30 78 30 46 5d 3b 0a 09 09  f[i] & 0x0F];...
2160: 7d 0a 09 09 72 65 61 64 20 3d 20 6d 64 5f 6c 65  }...read = md_le
2170: 6e 2a 32 3b 0a 09 09 6d 65 6d 63 70 79 28 62 75  n*2;...memcpy(bu
2180: 66 2c 20 68 65 78 5f 62 75 66 2c 20 72 65 61 64  f, hex_buf, read
2190: 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 73 74  );..    }..}..st
21a0: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d  atePtr->flags |=
21b0: 20 30 78 31 30 3b 0a 20 20 20 20 7d 0a 20 20 20   0x10;.    }.   
21c0: 20 72 65 74 75 72 6e 20 72 65 61 64 3b 0a 7d 0a   return read;.}.
21d0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
21e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
2220: 20 2a 20 44 69 67 65 73 74 4f 75 74 70 75 74 50   * DigestOutputP
2230: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c  roc --. *. *.Cal
2240: 6c 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72  led by the gener
2250: 69 63 20 49 4f 20 73 79 73 74 65 6d 20 74 6f 20  ic IO system to 
2260: 77 72 69 74 65 20 64 61 74 61 20 74 6f 20 74 72  write data to tr
2270: 61 6e 73 66 6f 72 6d 2e 0a 20 2a 0a 20 2a 20 52  ansform.. *. * R
2280: 65 74 75 72 6e 73 3a 0a 20 2a 09 54 6f 74 61 6c  eturns:. *.Total
2290: 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 0a 20   bytes written. 
22a0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
22b0: 73 3a 0a 20 2a 09 47 65 74 20 64 61 74 61 20 66  s:. *.Get data f
22c0: 72 6f 6d 20 62 75 66 20 61 6e 64 20 75 70 64 61  rom buf and upda
22d0: 74 65 20 64 69 67 65 73 74 0a 20 2a 0a 20 2a 2d  te digest. *. *-
22e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2320: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 20 69 6e 74 20 44  -----. */. int D
2330: 69 67 65 73 74 4f 75 74 70 75 74 50 72 6f 63 28  igestOutputProc(
2340: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
2350: 74 44 61 74 61 2c 20 63 6f 6e 73 74 20 63 68 61  tData, const cha
2360: 72 20 2a 62 75 66 2c 20 69 6e 74 20 74 6f 57 72  r *buf, int toWr
2370: 69 74 65 2c 20 69 6e 74 20 2a 65 72 72 6f 72 43  ite, int *errorC
2380: 6f 64 65 50 74 72 29 20 7b 0a 20 20 20 20 44 69  odePtr) {.    Di
2390: 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65  gestState *state
23a0: 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 61  Ptr = (DigestSta
23b0: 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61  te *) clientData
23c0: 3b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65  ;.    *errorCode
23d0: 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  Ptr = 0;..    if
23e0: 20 28 74 6f 57 72 69 74 65 20 3c 3d 20 30 20 7c   (toWrite <= 0 |
23f0: 7c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  | statePtr->self
2400: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c   == (Tcl_Channel
2410: 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  ) NULL) {..retur
2420: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  n 0;.    }.    r
2430: 65 74 75 72 6e 20 74 6f 57 72 69 74 65 3b 0a 7d  eturn toWrite;.}
2440: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
2450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a  -------------. *
2490: 0a 20 2a 20 44 69 67 65 73 74 53 65 74 4f 70 74  . * DigestSetOpt
24a0: 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a  ionProc --. *. *
24b0: 09 43 61 6c 6c 65 64 20 62 79 20 74 68 65 20 67  .Called by the g
24c0: 65 6e 65 72 69 63 20 49 4f 20 73 79 73 74 65 6d  eneric IO system
24d0: 20 74 6f 20 73 65 74 20 63 68 61 6e 6e 65 6c 20   to set channel 
24e0: 6f 70 74 69 6f 6e 20 74 6f 20 76 61 6c 75 65 2e  option to value.
24f0: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a  . *. * Returns:.
2500: 20 2a 09 54 43 4c 5f 4f 4b 20 69 66 20 73 75 63   *.TCL_OK if suc
2510: 63 65 73 73 66 75 6c 20 6f 72 20 54 43 4c 5f 45  cessful or TCL_E
2520: 52 52 4f 52 20 69 66 20 66 61 69 6c 65 64 2e 0a  RROR if failed..
2530: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
2540: 74 73 3a 0a 20 2a 09 55 70 64 61 74 65 73 20 63  ts:. *.Updates c
2550: 68 61 6e 6e 65 6c 20 6f 70 74 69 6f 6e 20 74 6f  hannel option to
2560: 20 6e 65 77 20 76 61 6c 75 65 2e 0a 20 2a 0a 20   new value.. *. 
2570: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
2580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
25a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
25b0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
25c0: 69 63 20 69 6e 74 20 44 69 67 65 73 74 53 65 74  ic int DigestSet
25d0: 4f 70 74 69 6f 6e 50 72 6f 63 28 43 6c 69 65 6e  OptionProc(Clien
25e0: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
25f0: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
2600: 74 65 72 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  terp, const char
2610: 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c 0a 09 63   *optionName,..c
2620: 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70 74 69 6f  onst char *optio
2630: 6e 56 61 6c 75 65 29 20 7b 0a 20 20 20 20 44 69  nValue) {.    Di
2640: 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65  gestState *state
2650: 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 61  Ptr = (DigestSta
2660: 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61  te *) clientData
2670: 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65  ;.    Tcl_Channe
2680: 6c 20 70 61 72 65 6e 74 3b 0a 20 20 20 20 54 63  l parent;.    Tc
2690: 6c 5f 44 72 69 76 65 72 53 65 74 4f 70 74 69 6f  l_DriverSetOptio
26a0: 6e 50 72 6f 63 20 2a 73 65 74 4f 70 74 69 6f 6e  nProc *setOption
26b0: 50 72 6f 63 3b 0a 0a 20 20 20 20 69 66 20 28 73  Proc;..    if (s
26c0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d  tatePtr->self ==
26d0: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e   (Tcl_Channel) N
26e0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  ULL) {..return T
26f0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
2700: 0a 20 20 20 20 2f 2a 20 44 65 6c 65 67 61 74 65  .    /* Delegate
2710: 20 6f 70 74 69 6f 6e 73 20 64 6f 77 6e 73 74 72   options downstr
2720: 65 61 6d 20 2a 2f 0a 20 20 20 20 70 61 72 65 6e  eam */.    paren
2730: 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 63 6b  t = Tcl_GetStack
2740: 65 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50  edChannel(stateP
2750: 74 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 20 73  tr->self);.    s
2760: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 3d 20 54  etOptionProc = T
2770: 63 6c 5f 43 68 61 6e 6e 65 6c 53 65 74 4f 70 74  cl_ChannelSetOpt
2780: 69 6f 6e 50 72 6f 63 28 54 63 6c 5f 47 65 74 43  ionProc(Tcl_GetC
2790: 68 61 6e 6e 65 6c 54 79 70 65 28 70 61 72 65 6e  hannelType(paren
27a0: 74 29 29 3b 0a 20 20 20 20 69 66 20 28 73 65 74  t));.    if (set
27b0: 4f 70 74 69 6f 6e 50 72 6f 63 20 21 3d 20 4e 55  OptionProc != NU
27c0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 28 2a  LL) {..return (*
27d0: 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 29 28 54  setOptionProc)(T
27e0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73  cl_GetChannelIns
27f0: 74 61 6e 63 65 44 61 74 61 28 70 61 72 65 6e 74  tanceData(parent
2800: 29 2c 20 69 6e 74 65 72 70 2c 20 6f 70 74 69 6f  ), interp, optio
2810: 6e 4e 61 6d 65 2c 20 6f 70 74 69 6f 6e 56 61 6c  nName, optionVal
2820: 75 65 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ue);.    } else 
2830: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
2840: 52 4f 52 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a  ROR;.    }.}../*
2850: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
2860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
28a0: 44 69 67 65 73 74 47 65 74 4f 70 74 69 6f 6e 50  DigestGetOptionP
28b0: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c  roc --. *. *.Cal
28c0: 6c 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72  led by the gener
28d0: 69 63 20 49 4f 20 73 79 73 74 65 6d 20 74 6f 20  ic IO system to 
28e0: 67 65 74 20 63 68 61 6e 6e 65 6c 20 6f 70 74 69  get channel opti
28f0: 6f 6e 27 73 20 76 61 6c 75 65 2e 0a 20 2a 0a 20  on's value.. *. 
2900: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43  * Returns:. *.TC
2910: 4c 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66  L_OK if successf
2920: 75 6c 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 20  ul or TCL_ERROR 
2930: 69 66 20 66 61 69 6c 65 64 2e 0a 20 2a 0a 20 2a  if failed.. *. *
2940: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
2950: 2a 09 53 65 74 73 20 72 65 73 75 6c 74 20 74 6f  *.Sets result to
2960: 20 6f 70 74 69 6f 6e 27 73 20 76 61 6c 75 65 0a   option's value.
2970: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
2980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
29c0: 73 74 61 74 69 63 20 69 6e 74 20 44 69 67 65 73  static int Diges
29d0: 74 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 43  tGetOptionProc(C
29e0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
29f0: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
2a00: 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74 20   *interp, const 
2a10: 63 68 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65  char *optionName
2a20: 2c 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 20 2a  ,..Tcl_DString *
2a30: 6f 70 74 69 6f 6e 56 61 6c 75 65 29 20 7b 0a 20  optionValue) {. 
2a40: 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a     DigestState *
2a50: 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65  statePtr = (Dige
2a60: 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e  stState *) clien
2a70: 74 44 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 43  tData;.    Tcl_C
2a80: 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 3b 0a 20  hannel parent;. 
2a90: 20 20 20 54 63 6c 5f 44 72 69 76 65 72 47 65 74     Tcl_DriverGet
2aa0: 4f 70 74 69 6f 6e 50 72 6f 63 20 2a 67 65 74 4f  OptionProc *getO
2ab0: 70 74 69 6f 6e 50 72 6f 63 3b 0a 0a 20 20 20 20  ptionProc;..    
2ac0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 65  if (statePtr->se
2ad0: 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e  lf == (Tcl_Chann
2ae0: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74  el) NULL) {..ret
2af0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2b00: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c     }..    /* Del
2b10: 65 67 61 74 65 20 6f 70 74 69 6f 6e 73 20 64 6f  egate options do
2b20: 77 6e 73 74 72 65 61 6d 20 2a 2f 0a 20 20 20 20  wnstream */.    
2b30: 70 61 72 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74  parent = Tcl_Get
2b40: 53 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73  StackedChannel(s
2b50: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a  tatePtr->self);.
2b60: 20 20 20 20 67 65 74 4f 70 74 69 6f 6e 50 72 6f      getOptionPro
2b70: 63 20 3d 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 47  c = Tcl_ChannelG
2b80: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 54 63 6c  etOptionProc(Tcl
2b90: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28  _GetChannelType(
2ba0: 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 69 66  parent));.    if
2bb0: 20 28 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20   (getOptionProc 
2bc0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  != NULL) {..retu
2bd0: 72 6e 20 28 2a 67 65 74 4f 70 74 69 6f 6e 50 72  rn (*getOptionPr
2be0: 6f 63 29 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  oc)(Tcl_GetChann
2bf0: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 70  elInstanceData(p
2c00: 61 72 65 6e 74 29 2c 20 69 6e 74 65 72 70 2c 20  arent), interp, 
2c10: 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 6f 70 74 69  optionName, opti
2c20: 6f 6e 56 61 6c 75 65 29 3b 0a 20 20 20 20 7d 20  onValue);.    } 
2c30: 65 6c 73 65 20 69 66 20 28 6f 70 74 69 6f 6e 4e  else if (optionN
2c40: 61 6d 65 20 3d 3d 20 28 63 68 61 72 2a 29 20 4e  ame == (char*) N
2c50: 55 4c 4c 29 20 7b 0a 09 2f 2a 20 52 65 71 75 65  ULL) {../* Reque
2c60: 73 74 20 69 73 20 71 75 65 72 79 20 66 6f 72 20  st is query for 
2c70: 61 6c 6c 20 6f 70 74 69 6f 6e 73 2c 20 74 68 69  all options, thi
2c80: 73 20 69 73 20 6f 6b 2e 20 2a 2f 0a 09 72 65 74  s is ok. */..ret
2c90: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  urn TCL_OK;.    
2ca0: 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 71 75 65 73  }..    /* Reques
2cb0: 74 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63  t for a specific
2cc0: 20 6f 70 74 69 6f 6e 20 68 61 73 20 74 6f 20 66   option has to f
2cd0: 61 69 6c 2c 20 77 65 20 64 6f 6e 27 74 20 68 61  ail, we don't ha
2ce0: 76 65 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 72  ve any. */.    r
2cf0: 65 74 75 72 6e 20 54 63 6c 5f 42 61 64 43 68 61  eturn Tcl_BadCha
2d00: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
2d10: 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 22  p, optionName, "
2d20: 22 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  ");.}../*. *----
2d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d70: 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 54  --. *. * DigestT
2d80: 69 6d 65 72 48 61 6e 64 6c 65 72 20 2d 2d 0a 20  imerHandler --. 
2d90: 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79 20 74  *. *.Called by t
2da0: 68 65 20 6e 6f 74 69 66 69 65 72 20 76 69 61 20  he notifier via 
2db0: 74 69 6d 65 72 20 74 6f 20 66 6c 75 73 68 20 6f  timer to flush o
2dc0: 75 74 20 70 65 6e 64 69 6e 67 20 69 6e 70 75 74  ut pending input
2dd0: 20 64 61 74 61 2e 0a 20 2a 0a 20 2a 20 52 65 74   data.. *. * Ret
2de0: 75 72 6e 73 3a 0a 20 2a 09 4e 6f 74 68 69 6e 67  urns:. *.Nothing
2df0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
2e00: 63 74 73 3a 0a 20 2a 09 4d 61 79 20 63 61 6c 6c  cts:. *.May call
2e10: 20 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61 6e 6e   Tcl_NotifyChann
2e20: 65 6c 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  el. *. *--------
2e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e40: 2d 2d 2d 2d 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 0a 20  --------------. 
2e70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44  */.static void D
2e80: 69 67 65 73 74 54 69 6d 65 72 48 61 6e 64 6c 65  igestTimerHandle
2e90: 72 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  r(ClientData cli
2ea0: 65 6e 74 44 61 74 61 29 20 7b 0a 20 20 20 20 44  entData) {.    D
2eb0: 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74  igestState *stat
2ec0: 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74  ePtr = (DigestSt
2ed0: 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74  ate *) clientDat
2ee0: 61 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74  a;..    if (stat
2ef0: 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54  ePtr->self == (T
2f00: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c  cl_Channel) NULL
2f10: 29 20 7b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20  ) {..return;.   
2f20: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 72   }..    /* Clear
2f30: 20 74 69 6d 65 72 20 74 6f 6b 65 6e 20 2a 2f 0a   timer token */.
2f40: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 74 69      statePtr->ti
2f50: 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72  mer = (Tcl_Timer
2f60: 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 0a 20 20  Token) NULL;..  
2f70: 20 20 2f 2a 20 46 69 72 65 20 65 76 65 6e 74 20    /* Fire event 
2f80: 69 66 20 74 68 65 72 65 20 69 73 20 70 65 6e 64  if there is pend
2f90: 69 6e 67 20 64 61 74 61 2c 20 73 6b 69 70 20 6f  ing data, skip o
2fa0: 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 20 20  therwise */.    
2fb0: 69 66 20 28 28 73 74 61 74 65 50 74 72 2d 3e 77  if ((statePtr->w
2fc0: 61 74 63 68 4d 61 73 6b 20 26 20 54 43 4c 5f 52  atchMask & TCL_R
2fd0: 45 41 44 41 42 4c 45 29 20 26 26 20 28 54 63 6c  EADABLE) && (Tcl
2fe0: 5f 49 6e 70 75 74 42 75 66 66 65 72 65 64 28 73  _InputBuffered(s
2ff0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 20 3e  tatePtr->self) >
3000: 20 30 29 29 20 7b 0a 09 54 63 6c 5f 4e 6f 74 69   0)) {..Tcl_Noti
3010: 66 79 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50  fyChannel(stateP
3020: 74 72 2d 3e 73 65 6c 66 2c 20 54 43 4c 5f 52 45  tr->self, TCL_RE
3030: 41 44 41 42 4c 45 29 3b 0a 20 20 20 20 7d 0a 7d  ADABLE);.    }.}
3040: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
3050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
3090: 0a 20 2a 20 44 69 67 65 73 74 57 61 74 63 68 50  . * DigestWatchP
30a0: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 49 6e 69  roc --. *. *.Ini
30b0: 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 6f 74 69  tialize the noti
30c0: 66 69 65 72 20 74 6f 20 77 61 74 63 68 20 66 6f  fier to watch fo
30d0: 72 20 65 76 65 6e 74 73 20 66 72 6f 6d 20 74 68  r events from th
30e0: 69 73 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20  is channel.. *. 
30f0: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 4e 6f  * Returns:. *.No
3100: 74 68 69 6e 67 0a 20 2a 0a 20 2a 20 53 69 64 65  thing. *. * Side
3110: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 6f 6e   effects:. *.Con
3120: 66 69 67 75 72 65 20 6e 6f 74 69 66 69 65 72 20  figure notifier 
3130: 73 6f 20 66 75 74 75 72 65 20 65 76 65 6e 74 73  so future events
3140: 20 6f 6e 20 74 68 65 20 63 68 61 6e 6e 65 6c 20   on the channel 
3150: 77 69 6c 6c 20 62 65 20 73 65 65 6e 20 62 79 20  will be seen by 
3160: 54 63 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  Tcl.. *. *------
3170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
31a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
31b0: 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52 45 41  . */.#define REA
31c0: 44 5f 44 45 4c 41 59 09 35 0a 76 6f 69 64 20 44  D_DELAY.5.void D
31d0: 69 67 65 73 74 57 61 74 63 68 50 72 6f 63 28 43  igestWatchProc(C
31e0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
31f0: 44 61 74 61 2c 20 69 6e 74 20 6d 61 73 6b 29 20  Data, int mask) 
3200: 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74  {.    DigestStat
3210: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44  e *statePtr = (D
3220: 69 67 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c  igestState *) cl
3230: 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 54 63  ientData;.    Tc
3240: 6c 5f 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74  l_Channel parent
3250: 3b 0a 20 20 20 20 54 63 6c 5f 44 72 69 76 65 72  ;.    Tcl_Driver
3260: 57 61 74 63 68 50 72 6f 63 20 2a 77 61 74 63 68  WatchProc *watch
3270: 50 72 6f 63 3b 0a 0a 20 20 20 20 69 66 20 28 73  Proc;..    if (s
3280: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d  tatePtr->self ==
3290: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e   (Tcl_Channel) N
32a0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 3b 0a  ULL) {..return;.
32b0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 74      }..    /* St
32c0: 6f 72 65 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e  ore OR-ed combin
32d0: 61 74 69 6f 6e 20 6f 66 20 54 43 4c 5f 52 45 41  ation of TCL_REA
32e0: 44 41 42 4c 45 2c 20 54 43 4c 5f 57 52 49 54 41  DABLE, TCL_WRITA
32f0: 42 4c 45 20 61 6e 64 20 54 43 4c 5f 45 58 43 45  BLE and TCL_EXCE
3300: 50 54 49 4f 4e 20 2a 2f 0a 20 20 20 20 73 74 61  PTION */.    sta
3310: 74 65 50 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b  tePtr->watchMask
3320: 20 3d 20 6d 61 73 6b 3b 0a 0a 20 20 20 20 2f 2a   = mask;..    /*
3330: 20 50 72 6f 70 61 67 61 74 65 20 6d 61 73 6b 20   Propagate mask 
3340: 69 6e 66 6f 20 74 6f 20 70 61 72 65 6e 74 20 63  info to parent c
3350: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 70 61  hannel */.    pa
3360: 72 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74  rent = Tcl_GetSt
3370: 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 61  ackedChannel(sta
3380: 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 20 20  tePtr->self);.  
3390: 20 20 77 61 74 63 68 50 72 6f 63 20 3d 20 54 63    watchProc = Tc
33a0: 6c 5f 43 68 61 6e 6e 65 6c 57 61 74 63 68 50 72  l_ChannelWatchPr
33b0: 6f 63 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  oc(Tcl_GetChanne
33c0: 6c 54 79 70 65 28 70 61 72 65 6e 74 29 29 3b 0a  lType(parent));.
33d0: 20 20 20 20 77 61 74 63 68 50 72 6f 63 28 54 63      watchProc(Tc
33e0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74  l_GetChannelInst
33f0: 61 6e 63 65 44 61 74 61 28 70 61 72 65 6e 74 29  anceData(parent)
3400: 2c 20 6d 61 73 6b 29 3b 0a 0a 20 20 20 20 2f 2a  , mask);..    /*
3410: 20 52 65 6d 6f 76 65 20 70 65 6e 64 69 6e 67 20   Remove pending 
3420: 74 69 6d 65 72 20 2a 2f 0a 20 20 20 20 69 66 20  timer */.    if 
3430: 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72  (statePtr->timer
3440: 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f   != (Tcl_TimerTo
3450: 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63  ken) NULL) {..Tc
3460: 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e  l_DeleteTimerHan
3470: 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74  dler(statePtr->t
3480: 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72  imer);..statePtr
3490: 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54  ->timer = (Tcl_T
34a0: 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b  imerToken) NULL;
34b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
34c0: 66 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20  f there is data 
34d0: 70 65 6e 64 69 6e 67 2c 20 73 65 74 20 6e 65 77  pending, set new
34e0: 20 74 69 6d 65 72 20 74 6f 20 63 61 6c 6c 20 54   timer to call T
34f0: 63 6c 5f 4e 6f 74 69 66 79 43 68 61 6e 6e 65 6c  cl_NotifyChannel
3500: 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 6d 61 73   */.    if ((mas
3510: 6b 20 26 20 54 43 4c 5f 52 45 41 44 41 42 4c 45  k & TCL_READABLE
3520: 29 20 26 26 20 28 54 63 6c 5f 49 6e 70 75 74 42  ) && (Tcl_InputB
3530: 75 66 66 65 72 65 64 28 73 74 61 74 65 50 74 72  uffered(statePtr
3540: 2d 3e 73 65 6c 66 29 20 3e 20 30 29 29 20 7b 0a  ->self) > 0)) {.
3550: 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72  .statePtr->timer
3560: 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 54 69 6d   = Tcl_CreateTim
3570: 65 72 48 61 6e 64 6c 65 72 28 52 45 41 44 5f 44  erHandler(READ_D
3580: 45 4c 41 59 2c 20 44 69 67 65 73 74 54 69 6d 65  ELAY, DigestTime
3590: 72 48 61 6e 64 6c 65 72 2c 20 28 43 6c 69 65 6e  rHandler, (Clien
35a0: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29  tData) statePtr)
35b0: 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a  ;.    }.}../*. *
35c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 44 69 67  ------. *. * Dig
3610: 65 73 74 47 65 74 48 61 6e 64 6c 65 50 72 6f 63  estGetHandleProc
3620: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64   --. *. *.Called
3630: 20 66 72 6f 6d 20 54 63 6c 5f 47 65 74 43 68 61   from Tcl_GetCha
3640: 6e 6e 65 6c 48 61 6e 64 6c 65 20 74 6f 20 72 65  nnelHandle to re
3650: 74 72 69 65 76 65 20 4f 53 20 73 70 65 63 69 66  trieve OS specif
3660: 69 63 20 66 69 6c 65 20 68 61 6e 64 6c 65 0a 20  ic file handle. 
3670: 2a 09 66 72 6f 6d 20 69 6e 73 69 64 65 20 74 68  *.from inside th
3680: 69 73 20 63 68 61 6e 6e 65 6c 2e 20 4e 6f 74 20  is channel. Not 
3690: 75 73 65 64 20 66 6f 72 20 74 72 61 6e 73 66 6f  used for transfo
36a0: 72 6d 61 74 69 6f 6e 73 3f 0a 20 2a 0a 20 2a 20  rmations?. *. * 
36b0: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 49 66 20 64  Returns:. *.If d
36c0: 69 72 65 63 74 69 6f 6e 20 69 73 20 54 43 4c 5f  irection is TCL_
36d0: 52 45 41 44 41 42 4c 45 20 72 65 74 75 72 6e 20  READABLE return 
36e0: 74 68 65 20 68 61 6e 64 6c 65 20 75 73 65 64 20  the handle used 
36f0: 66 6f 72 20 69 6e 70 75 74 2c 20 6f 72 20 69 66  for input, or if
3700: 0a 20 2a 09 54 43 4c 5f 57 52 49 54 41 42 4c 45  . *.TCL_WRITABLE
3710: 20 72 65 74 75 72 6e 20 74 68 65 20 68 61 6e 64   return the hand
3720: 6c 65 20 75 73 65 64 20 66 6f 72 20 6f 75 74 70  le used for outp
3730: 75 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ut.. *. * Side e
3740: 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a  ffects:. *.None.
3750: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
3760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
37a0: 69 6e 74 20 44 69 67 65 73 74 47 65 74 48 61 6e  int DigestGetHan
37b0: 64 6c 65 50 72 6f 63 28 43 6c 69 65 6e 74 44 61  dleProc(ClientDa
37c0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 69  ta clientData, i
37d0: 6e 74 20 64 69 72 65 63 74 69 6f 6e 2c 20 43 6c  nt direction, Cl
37e0: 69 65 6e 74 44 61 74 61 20 2a 68 61 6e 64 6c 65  ientData *handle
37f0: 50 74 72 29 20 7b 0a 20 20 20 20 44 69 67 65 73  Ptr) {.    Diges
3800: 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72  tState *statePtr
3810: 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20   = (DigestState 
3820: 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a  *) clientData;..
3830: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
3840: 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43  ->self == (Tcl_C
3850: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a  hannel) NULL) {.
3860: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
3870: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  R;.    }.    ret
3880: 75 72 6e 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  urn Tcl_GetChann
3890: 65 6c 48 61 6e 64 6c 65 28 54 63 6c 5f 47 65 74  elHandle(Tcl_Get
38a0: 53 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73  StackedChannel(s
38b0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20  tatePtr->self), 
38c0: 64 69 72 65 63 74 69 6f 6e 2c 20 68 61 6e 64 6c  direction, handl
38d0: 65 50 74 72 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d  ePtr);.}../*. *-
38e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3920: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65  -----. *. * Dige
3930: 73 74 4e 6f 74 69 66 79 50 72 6f 63 20 2d 2d 0a  stNotifyProc --.
3940: 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79 20   *. *.Called by 
3950: 54 63 6c 20 74 6f 20 69 6e 66 6f 72 6d 20 75 73  Tcl to inform us
3960: 20 6f 66 20 61 63 74 69 76 69 74 79 20 6f 6e 20   of activity on 
3970: 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 63  the underlying c
3980: 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65  hannel.. *. * Re
3990: 74 75 72 6e 73 3a 0a 20 2a 09 55 6e 63 68 61 6e  turns:. *.Unchan
39a0: 67 65 64 20 69 6e 74 65 72 65 73 74 4d 61 73 6b  ged interestMask
39b0: 20 77 68 69 63 68 20 69 73 20 61 6e 20 4f 52 2d   which is an OR-
39c0: 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f  ed combination o
39d0: 66 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 6f  f TCL_READABLE o
39e0: 72 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 0a 20  r TCL_WRITABLE. 
39f0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
3a00: 73 3a 0a 20 2a 09 43 61 6e 63 65 6c 73 20 61 6e  s:. *.Cancels an
3a10: 79 20 70 65 6e 64 69 6e 67 20 74 69 6d 65 72 2e  y pending timer.
3a20: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
3a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 2f  ------------. */
3a70: 0a 69 6e 74 20 44 69 67 65 73 74 4e 6f 74 69 66  .int DigestNotif
3a80: 79 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61  yProc(ClientData
3a90: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e 74   clientData, int
3aa0: 20 69 6e 74 65 72 65 73 74 4d 61 73 6b 29 20 7b   interestMask) {
3ab0: 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65  .    DigestState
3ac0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44 69   *statePtr = (Di
3ad0: 67 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69  gestState *) cli
3ae0: 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 2f 2a  entData;..    /*
3af0: 20 53 6b 69 70 20 74 69 6d 65 72 20 65 76 65 6e   Skip timer even
3b00: 74 20 61 73 20 72 65 64 75 6e 64 61 6e 74 20 2a  t as redundant *
3b10: 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  /.    if (stateP
3b20: 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63  tr->timer != (Tc
3b30: 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55  l_TimerToken) NU
3b40: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74  LL) {..Tcl_Delet
3b50: 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74  eTimerHandler(st
3b60: 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a  atePtr->timer);.
3b70: 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72  .statePtr->timer
3b80: 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b   = (Tcl_TimerTok
3b90: 65 6e 29 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  en) NULL;.    }.
3ba0: 20 20 20 20 72 65 74 75 72 6e 20 69 6e 74 65 72      return inter
3bb0: 65 73 74 4d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 20  estMask;.}../*. 
3bc0: 2a 0a 20 2a 20 43 68 61 6e 6e 65 6c 20 74 79 70  *. * Channel typ
3bd0: 65 20 73 74 72 75 63 74 75 72 65 20 64 65 66 69  e structure defi
3be0: 6e 69 74 69 6f 6e 20 66 6f 72 20 64 69 67 65 73  nition for diges
3bf0: 74 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  t transformation
3c00: 73 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  s.. *. */.static
3c10: 20 63 6f 6e 73 74 20 54 63 6c 5f 43 68 61 6e 6e   const Tcl_Chann
3c20: 65 6c 54 79 70 65 20 64 69 67 65 73 74 43 68 61  elType digestCha
3c30: 6e 6e 65 6c 54 79 70 65 20 3d 20 7b 0a 20 20 20  nnelType = {.   
3c40: 20 22 64 69 67 65 73 74 22 2c 09 09 09 2f 2a 20   "digest",.../* 
3c50: 54 79 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  Type name */.   
3c60: 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 52   TCL_CHANNEL_VER
3c70: 53 49 4f 4e 5f 35 2c 09 2f 2a 20 76 35 20 63 68  SION_5,./* v5 ch
3c80: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 44 69 67  annel */.    Dig
3c90: 65 73 74 43 6c 6f 73 65 50 72 6f 63 2c 09 09 2f  estCloseProc,../
3ca0: 2a 20 43 6c 6f 73 65 20 70 72 6f 63 20 2a 2f 0a  * Close proc */.
3cb0: 20 20 20 20 44 69 67 65 73 74 49 6e 70 75 74 50      DigestInputP
3cc0: 72 6f 63 2c 09 09 2f 2a 20 49 6e 70 75 74 20 70  roc,../* Input p
3cd0: 72 6f 63 20 2a 2f 0a 20 20 20 20 44 69 67 65 73  roc */.    Diges
3ce0: 74 4f 75 74 70 75 74 50 72 6f 63 2c 09 09 2f 2a  tOutputProc,../*
3cf0: 20 4f 75 74 70 75 74 20 70 72 6f 63 20 2a 2f 0a   Output proc */.
3d00: 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 53      NULL,.../* S
3d10: 65 65 6b 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20  eek proc */.    
3d20: 44 69 67 65 73 74 53 65 74 4f 70 74 69 6f 6e 50  DigestSetOptionP
3d30: 72 6f 63 2c 09 2f 2a 20 53 65 74 20 6f 70 74 69  roc,./* Set opti
3d40: 6f 6e 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 44  on proc */.    D
3d50: 69 67 65 73 74 47 65 74 4f 70 74 69 6f 6e 50 72  igestGetOptionPr
3d60: 6f 63 2c 09 2f 2a 20 47 65 74 20 6f 70 74 69 6f  oc,./* Get optio
3d70: 6e 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 44 69  n proc */.    Di
3d80: 67 65 73 74 57 61 74 63 68 50 72 6f 63 2c 09 09  gestWatchProc,..
3d90: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6e 6f  /* Initialize no
3da0: 74 69 66 69 65 72 20 2a 2f 0a 20 20 20 20 44 69  tifier */.    Di
3db0: 67 65 73 74 47 65 74 48 61 6e 64 6c 65 50 72 6f  gestGetHandlePro
3dc0: 63 2c 09 2f 2a 20 47 65 74 20 4f 53 20 68 61 6e  c,./* Get OS han
3dd0: 64 6c 65 73 20 6f 75 74 20 6f 66 20 63 68 61 6e  dles out of chan
3de0: 6e 65 6c 20 2a 2f 0a 20 20 20 20 44 69 67 65 73  nel */.    Diges
3df0: 74 43 6c 6f 73 65 32 50 72 6f 63 2c 09 09 2f 2a  tClose2Proc,../*
3e00: 20 63 6c 6f 73 65 32 70 72 6f 63 20 2a 2f 0a 20   close2proc */. 
3e10: 20 20 20 44 69 67 65 73 74 42 6c 6f 63 6b 4d 6f     DigestBlockMo
3e20: 64 65 50 72 6f 63 2c 09 2f 2a 20 53 65 74 20 62  deProc,./* Set b
3e30: 6c 6f 63 6b 69 6e 67 2f 6e 6f 6e 62 6c 6f 63 6b  locking/nonblock
3e40: 69 6e 67 20 6d 6f 64 65 2a 2f 0a 20 20 20 20 4e  ing mode*/.    N
3e50: 55 4c 4c 2c 09 09 09 2f 2a 20 46 6c 75 73 68 20  ULL,.../* Flush 
3e60: 70 72 6f 63 20 2a 2f 0a 20 20 20 20 44 69 67 65  proc */.    Dige
3e70: 73 74 4e 6f 74 69 66 79 50 72 6f 63 2c 09 09 2f  stNotifyProc,../
3e80: 2a 20 48 61 6e 64 6c 69 6e 67 20 6f 66 20 65 76  * Handling of ev
3e90: 65 6e 74 73 20 62 75 62 62 6c 69 6e 67 20 75 70  ents bubbling up
3ea0: 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 09   */.    NULL,...
3eb0: 2f 2a 20 57 69 64 65 20 73 65 65 6b 20 70 72 6f  /* Wide seek pro
3ec0: 63 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09  c */.    NULL,..
3ed0: 09 2f 2a 20 54 68 72 65 61 64 20 61 63 74 69 6f  ./* Thread actio
3ee0: 6e 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 09 09 09  n */.    NULL...
3ef0: 2f 2a 20 54 72 75 6e 63 61 74 65 20 2a 2f 0a 7d  /* Truncate */.}
3f00: 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  ;../*. *--------
3f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
3f50: 2a 0a 20 2a 20 44 69 67 65 73 74 43 68 61 6e 6e  *. * DigestChann
3f60: 65 6c 20 2d 2d 0a 20 2a 0a 20 2a 09 43 72 65 61  el --. *. *.Crea
3f70: 74 65 20 61 20 73 74 61 63 6b 65 64 20 63 68 61  te a stacked cha
3f80: 6e 6e 65 6c 20 66 6f 72 20 61 20 6d 65 73 73 61  nnel for a messa
3f90: 67 65 20 64 69 67 65 73 74 20 74 72 61 6e 73 66  ge digest transf
3fa0: 6f 72 6d 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20  ormation.. *. * 
3fb0: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f  Returns:. *.TCL_
3fc0: 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a  OK or TCL_ERROR.
3fd0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
3fe0: 74 73 3a 0a 20 2a 09 41 64 64 73 20 74 72 61 6e  ts:. *.Adds tran
3ff0: 73 66 6f 72 6d 20 74 6f 20 63 68 61 6e 6e 65 6c  sform to channel
4000: 20 61 6e 64 20 73 65 74 73 20 72 65 73 75 6c 74   and sets result
4010: 20 74 6f 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65   to channel name
4020: 20 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67   or error messag
4030: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  e.. *. *--------
4040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
4080: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 44 69  */.static int.Di
4090: 67 65 73 74 43 68 61 6e 6e 65 6c 28 54 63 6c 5f  gestChannel(Tcl_
40a0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
40b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 68 61 6e  const char *chan
40c0: 6e 65 6c 2c 20 63 6f 6e 73 74 20 45 56 50 5f 4d  nel, const EVP_M
40d0: 44 20 2a 6d 64 2c 20 69 6e 74 20 66 6f 72 6d 61  D *md, int forma
40e0: 74 29 20 7b 0a 20 20 20 20 69 6e 74 20 6d 6f 64  t) {.    int mod
40f0: 65 3b 20 2f 2a 20 4f 52 2d 65 64 20 63 6f 6d 62  e; /* OR-ed comb
4100: 69 6e 61 74 69 6f 6e 20 6f 66 20 54 43 4c 5f 52  ination of TCL_R
4110: 45 41 44 41 42 4c 45 20 61 6e 64 20 54 43 4c 5f  EADABLE and TCL_
4120: 57 52 49 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20  WRITABLE */.    
4130: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e  Tcl_Channel chan
4140: 3b 0a 20 20 20 20 45 56 50 5f 4d 44 5f 43 54 58  ;.    EVP_MD_CTX
4150: 20 2a 63 74 78 3b 0a 20 20 20 20 44 69 67 65 73   *ctx;.    Diges
4160: 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72  tState *statePtr
4170: 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 61  ;..    /* Valida
4180: 74 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 69  te args */.    i
4190: 66 20 28 63 68 61 6e 6e 65 6c 20 3d 3d 20 28 63  f (channel == (c
41a0: 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 4e 55 4c  onst char *) NUL
41b0: 4c 20 7c 7c 20 6d 64 20 3d 3d 20 28 63 6f 6e 73  L || md == (cons
41c0: 74 20 45 56 50 5f 4d 44 20 2a 29 20 4e 55 4c 4c  t EVP_MD *) NULL
41d0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
41e0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
41f0: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
4200: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
4210: 63 68 61 6e 6e 65 6c 2c 20 26 6d 6f 64 65 29 3b  channel, &mode);
4220: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d  .    if (chan ==
4230: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e   (Tcl_Channel) N
4240: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  ULL) {..return T
4250: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
4260: 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
4270: 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20  e to operate on 
4280: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e  the topmost chan
4290: 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20  nel */.    chan 
42a0: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e  = Tcl_GetTopChan
42b0: 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20  nel(chan);..    
42c0: 2f 2a 20 43 72 65 61 74 65 20 69 6e 74 65 72 6e  /* Create intern
42d0: 61 6c 20 73 74 6f 72 61 67 65 20 73 74 72 75 63  al storage struc
42e0: 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 63 74 78  tures */.    ctx
42f0: 20 3d 20 45 56 50 5f 4d 44 5f 43 54 58 5f 6e 65   = EVP_MD_CTX_ne
4300: 77 28 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74  w();.    statePt
4310: 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 65  r = (DigestState
4320: 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73   *) ckalloc((uns
4330: 69 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 44 69  igned) sizeof(Di
4340: 67 65 73 74 53 74 61 74 65 29 29 3b 0a 20 20 20  gestState));.   
4350: 20 69 66 20 28 63 74 78 20 21 3d 20 4e 55 4c 4c   if (ctx != NULL
4360: 20 26 26 20 73 74 61 74 65 50 74 72 20 21 3d 20   && statePtr != 
4370: 4e 55 4c 4c 29 20 7b 0a 09 6d 65 6d 73 65 74 28  NULL) {..memset(
4380: 73 74 61 74 65 50 74 72 2c 20 30 2c 20 73 69 7a  statePtr, 0, siz
4390: 65 6f 66 28 44 69 67 65 73 74 53 74 61 74 65 29  eof(DigestState)
43a0: 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 73 65  );..statePtr->se
43b0: 6c 66 09 3d 20 63 68 61 6e 3b 09 09 2f 2a 20 54  lf.= chan;../* T
43c0: 68 69 73 20 73 6f 63 6b 65 74 20 63 68 61 6e 6e  his socket chann
43d0: 65 6c 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d  el */..statePtr-
43e0: 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69  >timer = (Tcl_Ti
43f0: 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 09  merToken) NULL;.
4400: 2f 2a 20 54 69 6d 65 72 20 74 6f 20 66 6c 75 73  /* Timer to flus
4410: 68 20 64 61 74 61 20 2a 2f 0a 09 73 74 61 74 65  h data */..state
4420: 50 74 72 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 09  Ptr->flags = 0;.
4430: 09 2f 2a 20 43 68 61 6e 20 63 6f 6e 66 69 67 20  ./* Chan config 
4440: 66 6c 61 67 73 20 2a 2f 0a 09 73 74 61 74 65 50  flags */..stateP
4450: 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b 20 3d 20  tr->watchMask = 
4460: 30 3b 09 2f 2a 20 43 75 72 72 65 6e 74 20 57 61  0;./* Current Wa
4470: 74 63 68 50 72 6f 63 20 6d 61 73 6b 20 2a 2f 0a  tchProc mask */.
4480: 09 73 74 61 74 65 50 74 72 2d 3e 6d 6f 64 65 09  .statePtr->mode.
4490: 3d 20 6d 6f 64 65 3b 09 09 2f 2a 20 43 75 72 72  = mode;../* Curr
44a0: 65 6e 74 20 6d 6f 64 65 20 6f 66 20 70 61 72 65  ent mode of pare
44b0: 6e 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 09 73  nt channel */..s
44c0: 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20  tatePtr->format 
44d0: 3d 20 66 6f 72 6d 61 74 3b 09 2f 2a 20 4f 75 74  = format;./* Out
44e0: 70 75 74 20 66 6f 72 6d 61 74 20 2a 2f 0a 09 73  put format */..s
44f0: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 20  tatePtr->interp 
4500: 3d 20 69 6e 74 65 72 70 3b 09 2f 2a 20 43 75 72  = interp;./* Cur
4510: 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72  rent interpreter
4520: 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 63   */..statePtr->c
4530: 74 78 20 3d 20 63 74 78 3b 09 09 2f 2a 20 53 53  tx = ctx;../* SS
4540: 4c 20 43 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 20  L Context */.   
4550: 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 41   } else {..Tcl_A
4560: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
4570: 72 70 2c 20 22 49 6e 69 74 69 61 6c 69 7a 65 20  rp, "Initialize 
4580: 64 69 67 65 73 74 20 65 72 72 6f 72 3a 20 6d 65  digest error: me
4590: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
45a0: 66 61 69 6c 75 72 65 22 2c 20 28 63 68 61 72 20  failure", (char 
45b0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 45 56 50 5f 4d  *) NULL);..EVP_M
45c0: 44 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  D_CTX_free(ctx);
45d0: 0a 09 44 69 67 65 73 74 46 72 65 65 28 73 74 61  ..DigestFree(sta
45e0: 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20  tePtr);..return 
45f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
4600: 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  ..    /* Initial
4610: 69 7a 65 20 64 69 67 65 73 74 20 2a 2f 0a 23 69  ize digest */.#i
4620: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
4630: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30  N_NUMBER < 0x300
4640: 30 30 30 30 30 4c 0a 20 20 20 20 69 66 20 28 21  00000L.    if (!
4650: 45 56 50 5f 44 69 67 65 73 74 49 6e 69 74 5f 65  EVP_DigestInit_e
4660: 78 28 63 74 78 2c 20 6d 64 2c 20 4e 55 4c 4c 29  x(ctx, md, NULL)
4670: 29 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 20 28  ).#else.    if (
4680: 21 45 56 50 5f 44 69 67 65 73 74 49 6e 69 74 5f  !EVP_DigestInit_
4690: 65 78 32 28 63 74 78 2c 20 6d 64 2c 20 4e 55 4c  ex2(ctx, md, NUL
46a0: 4c 29 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b  L)).#endif.    {
46b0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
46c0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 49 6e 69 74  lt(interp, "Init
46d0: 69 61 6c 69 7a 65 20 64 69 67 65 73 74 20 65 72  ialize digest er
46e0: 72 6f 72 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29  ror: ", REASON()
46f0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
4700: 3b 0a 09 45 56 50 5f 4d 44 5f 43 54 58 5f 66 72  ;..EVP_MD_CTX_fr
4710: 65 65 28 63 74 78 29 3b 0a 09 44 69 67 65 73 74  ee(ctx);..Digest
4720: 46 72 65 65 28 73 74 61 74 65 50 74 72 29 3b 0a  Free(statePtr);.
4730: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
4740: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
4750: 20 43 6f 6e 66 69 67 75 72 65 20 63 68 61 6e 6e   Configure chann
4760: 65 6c 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 65  el */.    Tcl_Se
4770: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
4780: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74  nterp, chan, "-t
4790: 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69  ranslation", "bi
47a0: 6e 61 72 79 22 29 3b 0a 20 20 20 20 69 66 20 28  nary");.    if (
47b0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 42 75  Tcl_GetChannelBu
47c0: 66 66 65 72 53 69 7a 65 28 63 68 61 6e 29 20 3c  fferSize(chan) <
47d0: 20 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45   EVP_MAX_MD_SIZE
47e0: 20 2a 20 32 29 20 7b 0a 09 54 63 6c 5f 53 65 74   * 2) {..Tcl_Set
47f0: 43 68 61 6e 6e 65 6c 42 75 66 66 65 72 53 69 7a  ChannelBufferSiz
4800: 65 28 63 68 61 6e 2c 20 45 56 50 5f 4d 41 58 5f  e(chan, EVP_MAX_
4810: 4d 44 5f 53 49 5a 45 20 2a 20 32 29 3b 0a 20 20  MD_SIZE * 2);.  
4820: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 74 61 63    }..    /* Stac
4830: 6b 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20  k channel */.   
4840: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20   statePtr->self 
4850: 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e 6e  = Tcl_StackChann
4860: 65 6c 28 69 6e 74 65 72 70 2c 20 26 64 69 67 65  el(interp, &dige
4870: 73 74 43 68 61 6e 6e 65 6c 54 79 70 65 2c 20 28  stChannelType, (
4880: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74  ClientData) stat
4890: 65 50 74 72 2c 20 6d 6f 64 65 2c 20 63 68 61 6e  ePtr, mode, chan
48a0: 29 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  );.    if (state
48b0: 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63  Ptr->self == (Tc
48c0: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29  l_Channel) NULL)
48d0: 20 7b 0a 09 45 56 50 5f 4d 44 5f 43 54 58 5f 66   {..EVP_MD_CTX_f
48e0: 72 65 65 28 63 74 78 29 3b 0a 09 44 69 67 65 73  ree(ctx);..Diges
48f0: 74 46 72 65 65 28 73 74 61 74 65 50 74 72 29 3b  tFree(statePtr);
4900: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
4910: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54  OR;.    }..    T
4920: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
4930: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 20 54 63  erp, (char *) Tc
4940: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
4950: 28 63 68 61 6e 29 2c 20 54 43 4c 5f 56 4f 4c 41  (chan), TCL_VOLA
4960: 54 49 4c 45 29 3b 0a 20 20 20 20 72 65 74 75 72  TILE);.    retur
4970: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
4980: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
4990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49c0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55  --------. *. * U
49d0: 6e 73 74 61 63 6b 20 43 68 61 6e 6e 65 6c 20 2d  nstack Channel -
49e0: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f  -. *. *.This pro
49f0: 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65  cedure is invoke
4a00: 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65  d to process the
4a10: 20 22 75 6e 73 74 61 63 6b 22 20 54 43 4c 20 63   "unstack" TCL c
4a20: 6f 6d 6d 61 6e 64 2e 0a 20 2a 09 53 65 65 20 74  ommand.. *.See t
4a30: 68 65 20 75 73 65 72 20 64 6f 63 75 6d 65 6e 74  he user document
4a40: 61 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c  ation for detail
4a50: 73 20 6f 6e 20 77 68 61 74 20 69 74 20 64 6f 65  s on what it doe
4a60: 73 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73  s.. *. * Returns
4a70: 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54  :. *.TCL_OK or T
4a80: 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53  CL_ERROR. *. * S
4a90: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
4aa0: 52 65 6d 6f 76 65 73 20 74 72 61 6e 73 66 6f 72  Removes transfor
4ab0: 6d 20 66 72 6f 6d 20 63 68 61 6e 6e 65 6c 20 6f  m from channel o
4ac0: 72 20 73 65 74 73 20 72 65 73 75 6c 74 20 74 6f  r sets result to
4ad0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a   error message..
4ae0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
4af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
4b30: 73 74 61 74 69 63 20 69 6e 74 0a 55 6e 73 74 61  static int.Unsta
4b40: 63 6b 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44  ckObjCmd(ClientD
4b50: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
4b60: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
4b70: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
4b80: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
4b90: 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43  v[]) {.    Tcl_C
4ba0: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20  hannel chan;.   
4bb0: 20 69 6e 74 20 6d 6f 64 65 3b 20 2f 2a 20 4f 52   int mode; /* OR
4bc0: 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  -ed combination 
4bd0: 6f 66 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 20  of TCL_READABLE 
4be0: 61 6e 64 20 54 43 4c 5f 57 52 49 54 41 42 4c 45  and TCL_WRITABLE
4bf0: 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 6f 62    */..    if (ob
4c00: 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f  jc != 2) {..Tcl_
4c10: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
4c20: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63  erp, 1, objv, "c
4c30: 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72  hannel");..retur
4c40: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
4c50: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63   }..    /* Get c
4c60: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68  hannel */.    ch
4c70: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e  an = Tcl_GetChan
4c80: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  nel(interp, Tcl_
4c90: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
4ca0: 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c  (objv[1], NULL),
4cb0: 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20   &mode);.    if 
4cc0: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68  (chan == (Tcl_Ch
4cd0: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
4ce0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
4cf0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
4d00: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65  Make sure to ope
4d10: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d  rate on the topm
4d20: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  ost channel */. 
4d30: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
4d40: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
4d50: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  );..    /* Check
4d60: 20 69 66 20 64 69 67 65 73 74 20 63 68 61 6e 6e   if digest chann
4d70: 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 63  el */.    if (Tc
4d80: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65  l_GetChannelType
4d90: 28 63 68 61 6e 29 20 21 3d 20 26 64 69 67 65 73  (chan) != &diges
4da0: 74 43 68 61 6e 6e 65 6c 54 79 70 65 29 20 7b 0a  tChannelType) {.
4db0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
4dc0: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63  t(interp, "bad c
4dd0: 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f  hannel \"", Tcl_
4de0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63  GetChannelName(c
4df0: 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20  han),..    "\": 
4e00: 6e 6f 74 20 61 20 64 69 67 65 73 74 20 63 68 61  not a digest cha
4e10: 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54  nnel", NULL);..T
4e20: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
4e30: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
4e40: 55 4e 53 54 41 43 4b 22 2c 20 22 43 48 41 4e 4e  UNSTACK", "CHANN
4e50: 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20  EL", "INVALID", 
4e60: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
4e70: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
4e80: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
4e90: 20 50 6f 70 20 74 72 61 6e 73 66 6f 72 6d 20 66   Pop transform f
4ea0: 72 6f 6d 20 63 68 61 6e 6e 65 6c 2c 20 6c 65 61  rom channel, lea
4eb0: 76 65 73 20 65 72 72 6f 72 20 69 6e 66 6f 20 69  ves error info i
4ec0: 6e 20 69 6e 74 65 72 70 20 72 65 73 75 6c 74 20  n interp result 
4ed0: 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 55  */.    if (Tcl_U
4ee0: 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e  nstackChannel(in
4ef0: 74 65 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54  terp, chan) == T
4f00: 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 72 65 74  CL_ERROR) {..ret
4f10: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
4f20: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
4f30: 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 09 63 6c 69  TCL_OK;.    .cli
4f40: 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74  entData = client
4f50: 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a  Data;.}../******
4f60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4f70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4f80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4f90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
4fa0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
4fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4fe0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44  --------. *. * D
4ff0: 69 67 65 73 74 48 61 73 68 46 75 6e 63 74 69 6f  igestHashFunctio
5000: 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 20 43 61 6c 63  n --. *. *. Calc
5010: 75 6c 61 74 65 20 6d 65 73 73 61 67 65 20 64 69  ulate message di
5020: 67 65 73 74 20 75 73 69 6e 67 20 68 61 73 68 20  gest using hash 
5030: 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20  function.. *. * 
5040: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f  Returns:. *.TCL_
5050: 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a  OK or TCL_ERROR.
5060: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
5070: 74 73 3a 0a 20 2a 09 53 65 74 73 20 72 65 73 75  ts:. *.Sets resu
5080: 6c 74 20 74 6f 20 6d 65 73 73 61 67 65 20 64 69  lt to message di
5090: 67 65 73 74 20 6f 72 20 65 72 72 6f 72 20 6d 65  gest or error me
50a0: 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  ssage. *. *-----
50b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
50f0: 2a 2f 0a 69 6e 74 0a 44 69 67 65 73 74 48 61 73  */.int.DigestHas
5100: 68 46 75 6e 63 74 69 6f 6e 28 54 63 6c 5f 49 6e  hFunction(Tcl_In
5110: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
5120: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
5130: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 2c 0a 09  *const objv[],..
5140: 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64  const EVP_MD *md
5150: 2c 20 69 6e 74 20 66 6f 72 6d 61 74 2c 20 54 63  , int format, Tc
5160: 6c 5f 4f 62 6a 20 2a 6b 65 79 4f 62 6a 29 20 7b  l_Obj *keyObj) {
5170: 0a 20 20 20 20 63 68 61 72 20 2a 64 61 74 61 3b  .    char *data;
5180: 0a 20 20 20 20 69 6e 74 20 6c 65 6e 2c 20 72 65  .    int len, re
5190: 73 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  s;.    unsigned 
51a0: 69 6e 74 20 6d 64 5f 6c 65 6e 3b 0a 20 20 20 20  int md_len;.    
51b0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d 64  unsigned char md
51c0: 5f 62 75 66 5b 45 56 50 5f 4d 41 58 5f 4d 44 5f  _buf[EVP_MAX_MD_
51d0: 53 49 5a 45 5d 3b 0a 0a 20 20 20 20 69 66 20 28  SIZE];..    if (
51e0: 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63  objc != 2) {..Tc
51f0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
5200: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
5210: 22 64 61 74 61 22 29 3b 0a 09 72 65 74 75 72 6e  "data");..return
5220: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
5230: 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 64 61  }..    /* Get da
5240: 74 61 20 2a 2f 0a 20 20 20 20 64 61 74 61 20 3d  ta */.    data =
5250: 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61   Tcl_GetByteArra
5260: 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d  yFromObj(objv[1]
5270: 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 69 66 20  , &len);.    if 
5280: 28 64 61 74 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c  (data == NULL ||
5290: 20 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 54 63   len == 0) {..Tc
52a0: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
52b0: 72 70 2c 20 22 4e 6f 20 64 61 74 61 22 2c 20 4e  rp, "No data", N
52c0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  ULL);..return TC
52d0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
52e0: 20 20 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65      /* Calculate
52f0: 20 64 69 67 65 73 74 20 62 61 73 65 64 20 6f 6e   digest based on
5300: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a   hash function *
5310: 2f 0a 20 20 20 20 69 66 20 28 6b 65 79 4f 62 6a  /.    if (keyObj
5320: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73   == NULL) {..res
5330: 20 3d 20 45 56 50 5f 44 69 67 65 73 74 28 64 61   = EVP_Digest(da
5340: 74 61 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e  ta, (size_t) len
5350: 2c 20 6d 64 5f 62 75 66 2c 20 26 6d 64 5f 6c 65  , md_buf, &md_le
5360: 6e 2c 20 6d 64 2c 20 4e 55 4c 4c 29 3b 0a 20 20  n, md, NULL);.  
5370: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 75 6e 73 69    } else {..unsi
5380: 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 2c 20  gned char *key, 
5390: 2a 68 6d 61 63 3b 0a 09 69 6e 74 20 6b 65 79 5f  *hmac;..int key_
53a0: 6c 65 6e 3b 0a 0a 09 6b 65 79 20 3d 20 54 63 6c  len;...key = Tcl
53b0: 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
53c0: 6d 4f 62 6a 28 6b 65 79 4f 62 6a 2c 20 26 6b 65  mObj(keyObj, &ke
53d0: 79 5f 6c 65 6e 29 3b 0a 09 68 6d 61 63 20 3d 20  y_len);..hmac = 
53e0: 48 4d 41 43 28 6d 64 2c 20 28 63 6f 6e 73 74 20  HMAC(md, (const 
53f0: 76 6f 69 64 20 2a 29 20 6b 65 79 2c 20 6b 65 79  void *) key, key
5400: 5f 6c 65 6e 2c 20 28 63 6f 6e 73 74 20 75 6e 73  _len, (const uns
5410: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 64 61  igned char *) da
5420: 74 61 2c 0a 09 20 20 20 20 28 73 69 7a 65 5f 74  ta,..    (size_t
5430: 29 20 6c 65 6e 2c 20 6d 64 5f 62 75 66 2c 20 26  ) len, md_buf, &
5440: 6d 64 5f 6c 65 6e 29 3b 0a 09 72 65 73 20 3d 20  md_len);..res = 
5450: 28 68 6d 61 63 20 21 3d 20 4e 55 4c 4c 29 3b 0a  (hmac != NULL);.
5460: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 75      }..    /* Ou
5470: 74 70 75 74 20 64 69 67 65 73 74 20 74 6f 20 72  tput digest to r
5480: 65 73 75 6c 74 20 70 65 72 20 66 6f 72 6d 61 74  esult per format
5490: 20 28 62 69 6e 20 6f 72 20 68 65 78 29 20 2a 2f   (bin or hex) */
54a0: 0a 20 20 20 20 69 66 20 28 72 65 73 29 20 7b 0a  .    if (res) {.
54b0: 09 69 66 20 28 66 6f 72 6d 61 74 20 3d 3d 20 42  .if (format == B
54c0: 49 4e 5f 46 4f 52 4d 41 54 29 20 7b 0a 09 20 20  IN_FORMAT) {..  
54d0: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
54e0: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
54f0: 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 6d  ewByteArrayObj(m
5500: 64 5f 62 75 66 2c 20 6d 64 5f 6c 65 6e 29 29 3b  d_buf, md_len));
5510: 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20  ...} else {..   
5520: 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74   Tcl_Obj *result
5530: 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  Obj = Tcl_NewObj
5540: 28 29 3b 0a 09 20 20 20 20 75 6e 73 69 67 6e 65  ();..    unsigne
5550: 64 20 63 68 61 72 20 2a 70 74 72 20 3d 20 54 63  d char *ptr = Tc
5560: 6c 5f 53 65 74 42 79 74 65 41 72 72 61 79 4c 65  l_SetByteArrayLe
5570: 6e 67 74 68 28 72 65 73 75 6c 74 4f 62 6a 2c 20  ngth(resultObj, 
5580: 6d 64 5f 6c 65 6e 2a 32 29 3b 0a 0a 09 20 20 20  md_len*2);...   
5590: 20 66 6f 72 20 28 75 6e 73 69 67 6e 65 64 20 69   for (unsigned i
55a0: 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 6d 64  nt i = 0; i < md
55b0: 5f 6c 65 6e 3b 20 69 2b 2b 29 20 7b 0a 09 09 2a  _len; i++) {...*
55c0: 70 74 72 2b 2b 20 3d 20 68 65 78 5b 28 6d 64 5f  ptr++ = hex[(md_
55d0: 62 75 66 5b 69 5d 20 3e 3e 20 34 29 20 26 20 30  buf[i] >> 4) & 0
55e0: 78 30 46 5d 3b 0a 09 09 2a 70 74 72 2b 2b 20 3d  x0F];...*ptr++ =
55f0: 20 68 65 78 5b 6d 64 5f 62 75 66 5b 69 5d 20 26   hex[md_buf[i] &
5600: 20 30 78 30 46 5d 3b 0a 09 20 20 20 20 7d 0a 09   0x0F];..    }..
5610: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
5620: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f  (interp, resultO
5630: 62 6a 29 3b 0a 09 7d 0a 0a 20 20 20 20 7d 20 65  bj);..}..    } e
5640: 6c 73 65 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  lse {..Tcl_Appen
5650: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
5660: 22 48 61 73 68 20 63 61 6c 63 75 6c 61 74 69 6f  "Hash calculatio
5670: 6e 20 65 72 72 6f 72 3a 22 2c 20 52 45 41 53 4f  n error:", REASO
5680: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  N(), (char *) NU
5690: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
56a0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
56b0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
56c0: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
56d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
5710: 20 2a 20 44 69 67 65 73 74 4f 62 6a 43 6d 64 20   * DigestObjCmd 
5720: 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 75 72 6e 20  --. *. *.Return 
5730: 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20 75  message digest u
5740: 73 69 6e 67 20 75 73 65 72 20 73 70 65 63 69 66  sing user specif
5750: 69 65 64 20 68 61 73 68 20 66 75 6e 63 74 69 6f  ied hash functio
5760: 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73  n.. *. * Returns
5770: 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54  :. *.TCL_OK or T
5780: 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53  CL_ERROR. *. * S
5790: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
57a0: 53 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20 6d  Sets result to m
57b0: 65 73 73 61 67 65 20 64 69 67 65 73 74 20 6f 72  essage digest or
57c0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20   error message. 
57d0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
57e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5810: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
5820: 69 63 20 69 6e 74 0a 44 69 67 65 73 74 4f 62 6a  ic int.DigestObj
5830: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63  Cmd(ClientData c
5840: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
5850: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
5860: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
5870: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20   *const objv[]) 
5880: 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 2c 20 6c  {.    int idx, l
5890: 65 6e 2c 20 66 6f 72 6d 61 74 20 3d 20 48 45 58  en, format = HEX
58a0: 5f 46 4f 52 4d 41 54 2c 20 6b 65 79 5f 6c 65 6e  _FORMAT, key_len
58b0: 20 3d 20 30 2c 20 64 61 74 61 5f 6c 65 6e 20 3d   = 0, data_len =
58c0: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
58d0: 61 72 20 2a 64 69 67 65 73 74 6e 61 6d 65 2c 20  ar *digestname, 
58e0: 2a 63 68 61 6e 6e 65 6c 20 3d 20 4e 55 4c 4c 3b  *channel = NULL;
58f0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 64 61  .    Tcl_Obj *da
5900: 74 61 4f 62 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 66  taObj = NULL, *f
5910: 69 6c 65 4f 62 6a 20 3d 20 4e 55 4c 4c 2c 20 2a  ileObj = NULL, *
5920: 6b 65 79 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20  keyObj = NULL;. 
5930: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
5940: 20 2a 6b 65 79 20 3d 20 4e 55 4c 4c 3b 0a 20 20   *key = NULL;.  
5950: 20 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a    const EVP_MD *
5960: 6d 64 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 73  md;..    Tcl_Res
5970: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  etResult(interp)
5980: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  ;..    if (objc 
5990: 3c 20 33 20 7c 7c 20 6f 62 6a 63 20 3e 20 37 29  < 3 || objc > 7)
59a0: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d   {..Tcl_WrongNum
59b0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
59c0: 6f 62 6a 76 2c 20 22 74 79 70 65 20 3f 2d 62 69  objv, "type ?-bi
59d0: 6e 7c 2d 68 65 78 3f 20 3f 2d 6b 65 79 20 68 6d  n|-hex? ?-key hm
59e0: 61 63 5f 6b 65 79 3f 20 5b 2d 63 68 61 6e 6e 65  ac_key? [-channe
59f0: 6c 20 63 68 61 6e 20 7c 20 2d 66 69 6c 65 20 66  l chan | -file f
5a00: 69 6c 65 6e 61 6d 65 20 7c 20 3f 2d 64 61 74 61  ilename | ?-data
5a10: 3f 20 64 61 74 61 5d 22 29 3b 0a 09 72 65 74 75  ? data]");..retu
5a20: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
5a30: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
5a40: 64 69 67 65 73 74 20 2a 2f 0a 20 20 20 20 64 69  digest */.    di
5a50: 67 65 73 74 6e 61 6d 65 20 3d 20 54 63 6c 5f 47  gestname = Tcl_G
5a60: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
5a70: 6f 62 6a 76 5b 31 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[1], &len);.
5a80: 20 20 20 20 69 66 20 28 64 69 67 65 73 74 6e 61      if (digestna
5a90: 6d 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 28 6d  me == NULL || (m
5aa0: 64 20 3d 20 45 56 50 5f 67 65 74 5f 64 69 67 65  d = EVP_get_dige
5ab0: 73 74 62 79 6e 61 6d 65 28 64 69 67 65 73 74 6e  stbyname(digestn
5ac0: 61 6d 65 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b  ame)) == NULL) {
5ad0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
5ae0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 49 6e 76 61  lt(interp, "Inva
5af0: 6c 69 64 20 64 69 67 65 73 74 20 74 79 70 65 20  lid digest type 
5b00: 5c 22 22 2c 20 64 69 67 65 73 74 6e 61 6d 65 2c  \"", digestname,
5b10: 20 22 5c 22 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72   "\"", NULL);..r
5b20: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
5b30: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f  .    }..    /* O
5b40: 70 74 69 6d 61 6c 20 63 61 73 65 20 66 6f 72 20  ptimal case for 
5b50: 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 2a 2f 0a  blob of data */.
5b60: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20      if (objc == 
5b70: 33 29 20 7b 0a 09 72 65 74 75 72 6e 20 44 69 67  3) {..return Dig
5b80: 65 73 74 48 61 73 68 46 75 6e 63 74 69 6f 6e 28  estHashFunction(
5b90: 69 6e 74 65 72 70 2c 20 2d 2d 6f 62 6a 63 2c 20  interp, --objc, 
5ba0: 2b 2b 6f 62 6a 76 2c 20 6d 64 2c 20 66 6f 72 6d  ++objv, md, form
5bb0: 61 74 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d  at, NULL);.    }
5bc0: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 6f 70 74  ..    /* Get opt
5bd0: 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 66 6f 72 20  ions */.    for 
5be0: 28 69 64 78 20 3d 20 32 3b 20 69 64 78 20 3c 20  (idx = 2; idx < 
5bf0: 6f 62 6a 63 2d 31 3b 20 69 64 78 2b 2b 29 20 7b  objc-1; idx++) {
5c00: 0a 09 63 68 61 72 20 2a 6f 70 74 20 3d 20 54 63  ..char *opt = Tc
5c10: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
5c20: 62 6a 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 4e 55  bj(objv[idx], NU
5c30: 4c 4c 29 3b 0a 0a 09 69 66 20 28 6f 70 74 5b 30  LL);...if (opt[0
5c40: 5d 20 21 3d 20 27 2d 27 29 0a 09 20 20 20 20 62  ] != '-')..    b
5c50: 72 65 61 6b 3b 0a 0a 09 4f 50 54 46 4c 41 47 28  reak;...OPTFLAG(
5c60: 22 2d 62 69 6e 22 2c 20 66 6f 72 6d 61 74 2c 20  "-bin", format, 
5c70: 42 49 4e 5f 46 4f 52 4d 41 54 29 3b 0a 09 4f 50  BIN_FORMAT);..OP
5c80: 54 46 4c 41 47 28 22 2d 62 69 6e 61 72 79 22 2c  TFLAG("-binary",
5c90: 20 66 6f 72 6d 61 74 2c 20 42 49 4e 5f 46 4f 52   format, BIN_FOR
5ca0: 4d 41 54 29 3b 0a 09 4f 50 54 46 4c 41 47 28 22  MAT);..OPTFLAG("
5cb0: 2d 68 65 78 22 2c 20 66 6f 72 6d 61 74 2c 20 48  -hex", format, H
5cc0: 45 58 5f 46 4f 52 4d 41 54 29 3b 0a 09 4f 50 54  EX_FORMAT);..OPT
5cd0: 46 4c 41 47 28 22 2d 68 65 78 61 64 65 63 69 6d  FLAG("-hexadecim
5ce0: 61 6c 22 2c 20 66 6f 72 6d 61 74 2c 20 48 45 58  al", format, HEX
5cf0: 5f 46 4f 52 4d 41 54 29 3b 0a 09 4f 50 54 4f 42  _FORMAT);..OPTOB
5d00: 4a 28 22 2d 64 61 74 61 22 2c 20 64 61 74 61 4f  J("-data", dataO
5d10: 62 6a 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63  bj);..OPTSTR("-c
5d20: 68 61 6e 22 2c 20 63 68 61 6e 6e 65 6c 29 3b 0a  han", channel);.
5d30: 09 4f 50 54 53 54 52 28 22 2d 63 68 61 6e 6e 65  .OPTSTR("-channe
5d40: 6c 22 2c 20 63 68 61 6e 6e 65 6c 29 3b 0a 09 4f  l", channel);..O
5d50: 50 54 4f 42 4a 28 22 2d 66 69 6c 65 22 2c 20 66  PTOBJ("-file", f
5d60: 69 6c 65 4f 62 6a 29 3b 0a 09 4f 50 54 4f 42 4a  ileObj);..OPTOBJ
5d70: 28 22 2d 66 69 6c 65 6e 61 6d 65 22 2c 20 66 69  ("-filename", fi
5d80: 6c 65 4f 62 6a 29 3b 0a 09 4f 50 54 4f 42 4a 28  leObj);..OPTOBJ(
5d90: 22 2d 6b 65 79 22 2c 20 6b 65 79 4f 62 6a 29 3b  "-key", keyObj);
5da0: 0a 0a 09 4f 50 54 42 41 44 28 22 6f 70 74 69 6f  ...OPTBAD("optio
5db0: 6e 22 2c 20 22 2d 62 69 6e 2c 20 2d 64 61 74 61  n", "-bin, -data
5dc0: 2c 20 2d 66 69 6c 65 2c 20 2d 66 69 6c 65 6e 61  , -file, -filena
5dd0: 6d 65 2c 20 2d 68 65 78 2c 20 6f 72 20 2d 6b 65  me, -hex, or -ke
5de0: 79 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  y");..return TCL
5df0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
5e00: 20 20 20 2f 2a 20 49 66 20 6e 6f 20 6f 70 74 69     /* If no opti
5e10: 6f 6e 20 66 6f 72 20 6c 61 73 74 20 61 72 67 2c  on for last arg,
5e20: 20 74 68 65 6e 20 69 74 73 20 74 68 65 20 64 61   then its the da
5e30: 74 61 20 2a 2f 0a 20 20 20 20 69 66 20 28 69 64  ta */.    if (id
5e40: 78 20 3c 20 6f 62 6a 63 29 20 7b 0a 09 64 61 74  x < objc) {..dat
5e50: 61 4f 62 6a 20 3d 20 6f 62 6a 76 5b 69 64 78 5d  aObj = objv[idx]
5e60: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
5e70: 43 61 6c 63 20 64 69 67 65 73 74 20 6f 6e 20 66  Calc digest on f
5e80: 69 6c 65 2c 20 73 74 61 63 6b 65 64 20 63 68 61  ile, stacked cha
5e90: 6e 6e 65 6c 2c 20 6f 72 20 64 61 74 61 20 62 6c  nnel, or data bl
5ea0: 6f 62 20 2a 2f 0a 20 20 20 20 69 66 20 28 66 69  ob */.    if (fi
5eb0: 6c 65 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b  leObj != NULL) {
5ec0: 0a 09 72 65 74 75 72 6e 20 44 69 67 65 73 74 46  ..return DigestF
5ed0: 69 6c 65 28 69 6e 74 65 72 70 2c 20 66 69 6c 65  ile(interp, file
5ee0: 4f 62 6a 2c 20 6d 64 2c 20 66 6f 72 6d 61 74 2c  Obj, md, format,
5ef0: 20 6b 65 79 4f 62 6a 29 3b 0a 20 20 20 20 7d 20   keyObj);.    } 
5f00: 65 6c 73 65 20 69 66 20 28 63 68 61 6e 6e 65 6c  else if (channel
5f10: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74   != NULL) {..ret
5f20: 75 72 6e 20 44 69 67 65 73 74 43 68 61 6e 6e 65  urn DigestChanne
5f30: 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 6e 65  l(interp, channe
5f40: 6c 2c 20 6d 64 2c 20 66 6f 72 6d 61 74 29 3b 0a  l, md, format);.
5f50: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 64      } else if (d
5f60: 61 74 61 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20  ataObj != NULL) 
5f70: 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 73  {..Tcl_Obj *objs
5f80: 5b 32 5d 3b 0a 09 6f 62 6a 73 5b 30 5d 20 3d 20  [2];..objs[0] = 
5f90: 4e 55 4c 4c 3b 0a 09 6f 62 6a 73 5b 31 5d 20 3d  NULL;..objs[1] =
5fa0: 20 64 61 74 61 4f 62 6a 3b 0a 09 72 65 74 75 72   dataObj;..retur
5fb0: 6e 20 44 69 67 65 73 74 48 61 73 68 46 75 6e 63  n DigestHashFunc
5fc0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 32 2c 20  tion(interp, 2, 
5fd0: 6f 62 6a 73 2c 20 6d 64 2c 20 66 6f 72 6d 61 74  objs, md, format
5fe0: 2c 20 6b 65 79 4f 62 6a 29 3b 0a 20 20 20 20 7d  , keyObj);.    }
5ff0: 0a 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
6000: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
6010: 4e 6f 20 64 61 74 61 20 73 70 65 63 69 66 69 65  No data specifie
6020: 64 2e 22 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  d.", NULL);.    
6030: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
6040: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ;.}../*. *------
6050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
6090: 0a 20 2a 20 4d 65 73 73 61 67 65 20 44 69 67 65  . * Message Dige
60a0: 73 74 20 43 6f 6e 76 65 6e 69 65 6e 63 65 20 43  st Convenience C
60b0: 6f 6d 6d 61 6e 64 73 20 2d 2d 0a 20 2a 0a 20 2a  ommands --. *. *
60c0: 09 43 6f 6e 76 65 6e 69 65 6e 63 65 20 63 6f 6d  .Convenience com
60d0: 6d 61 6e 64 73 20 66 6f 72 20 6d 65 73 73 61 67  mands for messag
60e0: 65 20 64 69 67 65 73 74 73 2e 0a 20 2a 0a 20 2a  e digests.. *. *
60f0: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c   Returns:. *.TCL
6100: 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52  _OK or TCL_ERROR
6110: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
6120: 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 72 65 73  cts:. *.Sets res
6130: 75 6c 74 20 74 6f 20 6d 65 73 73 61 67 65 20 64  ult to message d
6140: 69 67 65 73 74 20 6f 72 20 65 72 72 6f 72 20 6d  igest or error m
6150: 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d  essage. *. *----
6160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
61a0: 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 4d 44   */.int DigestMD
61b0: 34 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20  4Cmd(ClientData 
61c0: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f  clientData, Tcl_
61d0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
61e0: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
61f0: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j *const objv[])
6200: 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 44 69   {.    return Di
6210: 67 65 73 74 48 61 73 68 46 75 6e 63 74 69 6f 6e  gestHashFunction
6220: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f  (interp, objc, o
6230: 62 6a 76 2c 20 45 56 50 5f 6d 64 34 28 29 2c 20  bjv, EVP_md4(), 
6240: 48 45 58 5f 46 4f 52 4d 41 54 2c 20 4e 55 4c 4c  HEX_FORMAT, NULL
6250: 29 3b 0a 7d 0a 0a 69 6e 74 20 44 69 67 65 73 74  );.}..int Digest
6260: 4d 44 35 43 6d 64 28 43 6c 69 65 6e 74 44 61 74  MD5Cmd(ClientDat
6270: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63  a clientData, Tc
6280: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
6290: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f  , int objc, Tcl_
62a0: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b  Obj *const objv[
62b0: 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ]) {.    return 
62c0: 44 69 67 65 73 74 48 61 73 68 46 75 6e 63 74 69  DigestHashFuncti
62d0: 6f 6e 28 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c  on(interp, objc,
62e0: 20 6f 62 6a 76 2c 20 45 56 50 5f 6d 64 35 28 29   objv, EVP_md5()
62f0: 2c 20 48 45 58 5f 46 4f 52 4d 41 54 2c 20 4e 55  , HEX_FORMAT, NU
6300: 4c 4c 29 3b 0a 7d 0a 0a 69 6e 74 20 44 69 67 65  LL);.}..int Dige
6310: 73 74 53 48 41 31 43 6d 64 28 43 6c 69 65 6e 74  stSHA1Cmd(Client
6320: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
6330: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
6340: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
6350: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
6360: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74 75  jv[]) {.    retu
6370: 72 6e 20 44 69 67 65 73 74 48 61 73 68 46 75 6e  rn DigestHashFun
6380: 63 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f 62  ction(interp, ob
6390: 6a 63 2c 20 6f 62 6a 76 2c 20 45 56 50 5f 73 68  jc, objv, EVP_sh
63a0: 61 31 28 29 2c 20 48 45 58 5f 46 4f 52 4d 41 54  a1(), HEX_FORMAT
63b0: 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 69 6e 74 20  , NULL);.}..int 
63c0: 44 69 67 65 73 74 53 48 41 32 35 36 43 6d 64 28  DigestSHA256Cmd(
63d0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
63e0: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
63f0: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
6400: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
6410: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
6420: 20 20 72 65 74 75 72 6e 20 44 69 67 65 73 74 48    return DigestH
6430: 61 73 68 46 75 6e 63 74 69 6f 6e 28 69 6e 74 65  ashFunction(inte
6440: 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20  rp, objc, objv, 
6450: 45 56 50 5f 73 68 61 32 35 36 28 29 2c 20 48 45  EVP_sha256(), HE
6460: 58 5f 46 4f 52 4d 41 54 2c 20 4e 55 4c 4c 29 3b  X_FORMAT, NULL);
6470: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
6480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
64c0: 20 2a 20 54 6c 73 5f 44 69 67 65 73 74 43 6f 6d   * Tls_DigestCom
64d0: 6d 61 6e 64 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43  mands --. *. *.C
64e0: 72 65 61 74 65 20 64 69 67 65 73 74 20 63 6f 6d  reate digest com
64f0: 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 74 75  mands. *. * Retu
6500: 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f  rns:. *.TCL_OK o
6510: 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20  r TCL_ERROR. *. 
6520: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
6530: 20 2a 09 43 72 65 61 74 65 73 20 63 6f 6d 6d 61   *.Creates comma
6540: 6e 64 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  nds. *. *-------
6550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
6590: 0a 69 6e 74 20 54 6c 73 5f 44 69 67 65 73 74 43  .int Tls_DigestC
65a0: 6f 6d 6d 61 6e 64 73 28 54 63 6c 5f 49 6e 74 65  ommands(Tcl_Inte
65b0: 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20  rp *interp) {.  
65c0: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
65d0: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
65e0: 74 6c 73 3a 3a 64 69 67 65 73 74 22 2c 20 44 69  tls::digest", Di
65f0: 67 65 73 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  gestObjCmd, (Cli
6600: 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c  entData) 0, (Tcl
6610: 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
6620: 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c  ) NULL);.    Tcl
6630: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
6640: 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  d(interp, "tls::
6650: 6d 64 34 22 2c 20 44 69 67 65 73 74 4d 44 34 43  md4", DigestMD4C
6660: 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
6670: 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65   0, (Tcl_CmdDele
6680: 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
6690: 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
66a0: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
66b0: 2c 20 22 74 6c 73 3a 3a 6d 64 35 22 2c 20 44 69  , "tls::md5", Di
66c0: 67 65 73 74 4d 44 35 43 6d 64 2c 20 28 43 6c 69  gestMD5Cmd, (Cli
66d0: 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c  entData) 0, (Tcl
66e0: 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
66f0: 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c  ) NULL);.    Tcl
6700: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
6710: 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  d(interp, "tls::
6720: 73 68 61 31 22 2c 20 44 69 67 65 73 74 53 48 41  sha1", DigestSHA
6730: 31 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74  1Cmd, (ClientDat
6740: 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65  a) 0, (Tcl_CmdDe
6750: 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c  leteProc *) NULL
6760: 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  );.    Tcl_Creat
6770: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
6780: 72 70 2c 20 22 74 6c 73 3a 3a 73 68 61 32 35 36  rp, "tls::sha256
6790: 22 2c 20 44 69 67 65 73 74 53 48 41 32 35 36 43  ", DigestSHA256C
67a0: 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
67b0: 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65   0, (Tcl_CmdDele
67c0: 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
67d0: 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
67e0: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
67f0: 2c 20 22 74 6c 73 3a 3a 75 6e 73 74 61 63 6b 22  , "tls::unstack"
6800: 2c 20 55 6e 73 74 61 63 6b 4f 62 6a 43 6d 64 2c  , UnstackObjCmd,
6810: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c   (ClientData) 0,
6820: 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
6830: 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
6840: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
6850: 0a 7d 0a 0a                                      .}..