Hex Artifact Content

Artifact feada0df14951cb417b2410ce8ecd6f52b141a16ec817901b28b47903dc4963f:


0000: 2f 2a 0a 20 2a 20 44 69 67 65 73 74 20 43 6f 6d  /*. * Digest Com
0010: 6d 61 6e 64 20 61 6e 64 20 53 74 61 63 6b 65 64  mand and Stacked
0020: 20 54 72 61 6e 73 66 6f 72 6d 20 43 68 61 6e 6e   Transform Chann
0030: 65 6c 0a 20 2a 0a 20 2a 20 43 6f 70 79 72 69 67  el. *. * Copyrig
0040: 68 74 20 28 43 29 20 32 30 32 33 20 42 72 69 61  ht (C) 2023 Bria
0050: 6e 20 4f 27 48 61 67 61 6e 0a 20 2a 0a 20 2a 2f  n O'Hagan. *. */
0060: 0a 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 49  ..#include "tlsI
0070: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  nt.h".#include "
0080: 74 63 6c 4f 70 74 73 2e 68 22 0a 23 69 6e 63 6c  tclOpts.h".#incl
0090: 75 64 65 20 3c 74 63 6c 2e 68 3e 0a 23 69 6e 63  ude <tcl.h>.#inc
00a0: 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23  lude <stdio.h>.#
00b0: 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e  include <string.
00c0: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65  h>.#include <ope
00d0: 6e 73 73 6c 2f 65 76 70 2e 68 3e 0a 0a 2f 2a 20  nssl/evp.h>../* 
00e0: 43 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 63 6f 6e  Constants */.con
00f0: 73 74 20 63 68 61 72 20 2a 68 65 78 20 3d 20 22  st char *hex = "
0100: 30 31 32 33 34 35 36 37 38 39 41 42 43 44 45 46  0123456789ABCDEF
0110: 22 3b 0a 23 64 65 66 69 6e 65 20 52 45 41 53 4f  ";.#define REASO
0120: 4e 28 29 09 45 52 52 5f 72 65 61 73 6f 6e 5f 65  N().ERR_reason_e
0130: 72 72 6f 72 5f 73 74 72 69 6e 67 28 45 52 52 5f  rror_string(ERR_
0140: 67 65 74 5f 65 72 72 6f 72 28 29 29 0a 0a 0a 2f  get_error()).../
0150: 2a 0a 20 2a 20 54 68 69 73 20 73 74 72 75 63 74  *. * This struct
0160: 75 72 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ure describes th
0170: 65 20 70 65 72 2d 69 6e 73 74 61 6e 63 65 20 73  e per-instance s
0180: 74 61 74 65 20 6f 66 20 61 6e 20 53 53 4c 20 63  tate of an SSL c
0190: 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 54 68  hannel.. *. * Th
01a0: 65 20 53 53 4c 20 70 72 6f 63 65 73 73 69 6e 67  e SSL processing
01b0: 20 63 6f 6e 74 65 78 74 20 69 73 20 6d 61 69 6e   context is main
01c0: 74 61 69 6e 65 64 20 68 65 72 65 2c 20 69 6e 20  tained here, in 
01d0: 74 68 65 20 43 6c 69 65 6e 74 44 61 74 61 0a 20  the ClientData. 
01e0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
01f0: 74 20 44 69 67 65 73 74 53 74 61 74 65 20 7b 0a  t DigestState {.
0200: 09 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 73 65 6c  .Tcl_Channel sel
0210: 66 3b 09 2f 2a 20 54 68 69 73 20 73 6f 63 6b 65  f;./* This socke
0220: 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 09 54 63  t channel */..Tc
0230: 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 20 74 69 6d  l_TimerToken tim
0240: 65 72 3b 09 2f 2a 20 54 69 6d 65 72 20 66 6f 72  er;./* Timer for
0250: 20 72 65 61 64 20 65 76 65 6e 74 73 20 2a 2f 0a   read events */.
0260: 0a 09 69 6e 74 20 66 6c 61 67 73 3b 09 09 2f 2a  ..int flags;../*
0270: 20 43 68 61 6e 20 63 6f 6e 66 69 67 20 66 6c 61   Chan config fla
0280: 67 73 20 2a 2f 0a 09 69 6e 74 20 77 61 74 63 68  gs */..int watch
0290: 4d 61 73 6b 3b 09 09 2f 2a 20 43 75 72 72 65 6e  Mask;../* Curren
02a0: 74 20 57 61 74 63 68 50 72 6f 63 20 6d 61 73 6b  t WatchProc mask
02b0: 20 2a 2f 0a 09 69 6e 74 20 6d 6f 64 65 3b 09 09   */..int mode;..
02c0: 2f 2a 20 43 75 72 72 65 6e 74 20 6d 6f 64 65 20  /* Current mode 
02d0: 6f 66 20 70 61 72 65 6e 74 20 63 68 61 6e 6e 65  of parent channe
02e0: 6c 20 2a 2f 0a 09 69 6e 74 20 66 6f 72 6d 61 74  l */..int format
02f0: 3b 09 09 2f 2a 20 4f 75 74 70 75 74 20 66 6f 72  ;../* Output for
0300: 6d 61 74 20 2a 2f 0a 0a 09 54 63 6c 5f 49 6e 74  mat */...Tcl_Int
0310: 65 72 70 20 2a 69 6e 74 65 72 70 3b 09 2f 2a 20  erp *interp;./* 
0320: 43 75 72 72 65 6e 74 20 69 6e 74 65 72 70 72 65  Current interpre
0330: 74 65 72 20 2a 2f 0a 09 45 56 50 5f 4d 44 5f 43  ter */..EVP_MD_C
0340: 54 58 20 2a 63 74 78 3b 09 2f 2a 20 4d 44 20 43  TX *ctx;./* MD C
0350: 6f 6e 74 65 78 74 20 2a 2f 0a 7d 20 44 69 67 65  ontext */.} Dige
0360: 73 74 53 74 61 74 65 3b 0a 0a 2f 2a 2a 2a 2a 2a  stState;../*****
0370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
03b0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
03c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
0400: 44 69 67 65 73 74 46 69 6c 65 20 2d 2d 0a 20 2a  DigestFile --. *
0410: 0a 20 2a 09 52 65 74 75 72 6e 20 6d 65 73 73 61  . *.Return messa
0420: 67 65 20 64 69 67 65 73 74 20 66 6f 72 20 66 69  ge digest for fi
0430: 6c 65 20 75 73 69 6e 67 20 75 73 65 72 20 73 70  le using user sp
0440: 65 63 69 66 69 65 64 20 68 61 73 68 20 66 75 6e  ecified hash fun
0450: 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74  ction.. *. * Ret
0460: 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20  urns:. *.TCL_OK 
0470: 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a  or TCL_ERROR. *.
0480: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
0490: 0a 20 2a 09 52 65 73 75 6c 74 20 69 73 20 6d 65  . *.Result is me
04a0: 73 73 61 67 65 20 64 69 67 65 73 74 20 6f 72 20  ssage digest or 
04b0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a  error message. *
04c0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
04d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
04e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
04f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0500: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44  ------. */.int D
0510: 69 67 65 73 74 46 69 6c 65 28 54 63 6c 5f 49 6e  igestFile(Tcl_In
0520: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 63  terp *interp, Tc
0530: 6c 5f 4f 62 6a 20 2a 66 69 6c 65 6e 61 6d 65 2c  l_Obj *filename,
0540: 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d   const EVP_MD *m
0550: 64 2c 20 69 6e 74 20 66 6f 72 6d 61 74 29 20 7b  d, int format) {
0560: 0a 20 20 20 20 45 56 50 5f 4d 44 5f 43 54 58 20  .    EVP_MD_CTX 
0570: 2a 63 74 78 3b 0a 20 20 20 20 54 63 6c 5f 43 68  *ctx;.    Tcl_Ch
0580: 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20  annel chan;.    
0590: 63 68 61 72 20 62 75 66 5b 33 32 37 36 38 5d 3b  char buf[32768];
05a0: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
05b0: 61 72 20 6d 64 5f 62 75 66 5b 45 56 50 5f 4d 41  ar md_buf[EVP_MA
05c0: 58 5f 4d 44 5f 53 49 5a 45 5d 3b 0a 20 20 20 20  X_MD_SIZE];.    
05d0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6d 64 5f  unsigned int md_
05e0: 6c 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65  len;..    /* Ope
05f0: 6e 20 66 69 6c 65 20 63 68 61 6e 6e 65 6c 20 2a  n file channel *
0600: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  /.    chan = Tcl
0610: 5f 46 53 4f 70 65 6e 46 69 6c 65 43 68 61 6e 6e  _FSOpenFileChann
0620: 65 6c 28 69 6e 74 65 72 70 2c 20 66 69 6c 65 6e  el(interp, filen
0630: 61 6d 65 2c 20 22 72 62 22 2c 20 30 34 34 34 29  ame, "rb", 0444)
0640: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d  ;.    if (chan =
0650: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  = NULL) {..retur
0660: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
0670: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 66 69   }..    /* Confi
0680: 67 75 72 65 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  gure channel */.
0690: 20 20 20 20 69 66 20 28 54 63 6c 5f 53 65 74 43      if (Tcl_SetC
06a0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
06b0: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61  erp, chan, "-tra
06c0: 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61  nslation", "bina
06d0: 72 79 22 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f  ry") == TCL_ERRO
06e0: 52 20 7c 7c 0a 09 54 63 6c 5f 53 65 74 43 68 61  R ||..Tcl_SetCha
06f0: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
0700: 70 2c 20 63 68 61 6e 2c 20 22 2d 62 75 66 66 65  p, chan, "-buffe
0710: 72 73 69 7a 65 22 2c 20 22 33 32 37 36 38 22 29  rsize", "32768")
0720: 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b   == TCL_ERROR) {
0730: 0a 09 54 63 6c 5f 43 6c 6f 73 65 28 69 6e 74 65  ..Tcl_Close(inte
0740: 72 70 2c 20 63 68 61 6e 29 3b 0a 09 72 65 74 75  rp, chan);..retu
0750: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
0760: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61    }..    /* Crea
0770: 74 65 20 6d 65 73 73 61 67 65 20 64 69 67 65 73  te message diges
0780: 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 20  t context */.   
0790: 20 63 74 78 20 3d 20 45 56 50 5f 4d 44 5f 43 54   ctx = EVP_MD_CT
07a0: 58 5f 6e 65 77 28 29 3b 0a 20 20 20 20 69 66 20  X_new();.    if 
07b0: 28 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  (ctx == NULL) {.
07c0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
07d0: 74 28 69 6e 74 65 72 70 2c 20 22 43 72 65 61 74  t(interp, "Creat
07e0: 65 20 64 69 67 65 73 74 20 63 6f 6e 74 65 78 74  e digest context
07f0: 20 66 61 69 6c 65 64 3a 20 22 2c 20 52 45 41 53   failed: ", REAS
0800: 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63  ON(), NULL);..Tc
0810: 6c 5f 43 6c 6f 73 65 28 69 6e 74 65 72 70 2c 20  l_Close(interp, 
0820: 63 68 61 6e 29 3b 0a 09 72 65 74 75 72 6e 20 54  chan);..return T
0830: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
0840: 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  .    /* Initiali
0850: 7a 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e  ze hash function
0860: 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f   */.#if OPENSSL_
0870: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
0880: 20 30 78 33 30 30 30 30 30 30 30 4c 0a 20 20 20   0x30000000L.   
0890: 20 69 66 20 28 21 45 56 50 5f 44 69 67 65 73 74   if (!EVP_Digest
08a0: 49 6e 69 74 5f 65 78 28 63 74 78 2c 20 6d 64 2c  Init_ex(ctx, md,
08b0: 20 4e 55 4c 4c 29 29 0a 23 65 6c 73 65 0a 20 20   NULL)).#else.  
08c0: 20 20 69 66 20 28 21 45 56 50 5f 44 69 67 65 73    if (!EVP_Diges
08d0: 74 49 6e 69 74 5f 65 78 32 28 63 74 78 2c 20 6d  tInit_ex2(ctx, m
08e0: 64 2c 20 4e 55 4c 4c 29 29 0a 23 65 6e 64 69 66  d, NULL)).#endif
08f0: 0a 20 20 20 20 7b 0a 09 54 63 6c 5f 41 70 70 65  .    {..Tcl_Appe
0900: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
0910: 20 22 49 6e 69 74 69 61 6c 69 7a 65 20 64 69 67   "Initialize dig
0920: 65 73 74 20 66 61 69 6c 65 64 3a 20 22 2c 20 52  est failed: ", R
0930: 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a  EASON(), NULL);.
0940: 09 54 63 6c 5f 43 6c 6f 73 65 28 69 6e 74 65 72  .Tcl_Close(inter
0950: 70 2c 20 63 68 61 6e 29 3b 0a 09 45 56 50 5f 4d  p, chan);..EVP_M
0960: 44 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  D_CTX_free(ctx);
0970: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
0980: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
0990: 2a 20 52 65 61 64 20 66 69 6c 65 20 64 61 74 61  * Read file data
09a0: 20 61 6e 64 20 75 70 64 61 74 65 20 68 61 73 68   and update hash
09b0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20   function */.   
09c0: 20 77 68 69 6c 65 20 28 21 54 63 6c 5f 45 6f 66   while (!Tcl_Eof
09d0: 28 63 68 61 6e 29 29 20 7b 0a 09 69 6e 74 20 6c  (chan)) {..int l
09e0: 65 6e 20 3d 20 54 63 6c 5f 52 65 61 64 52 61 77  en = Tcl_ReadRaw
09f0: 28 63 68 61 6e 2c 20 62 75 66 2c 20 33 32 37 36  (chan, buf, 3276
0a00: 38 29 3b 0a 09 69 66 20 28 6c 65 6e 20 3e 20 30  8);..if (len > 0
0a10: 20 26 26 20 21 45 56 50 5f 44 69 67 65 73 74 55   && !EVP_DigestU
0a20: 70 64 61 74 65 28 63 74 78 2c 20 26 62 75 66 2c  pdate(ctx, &buf,
0a30: 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 29 20   (size_t) len)) 
0a40: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  {..    Tcl_Appen
0a50: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
0a60: 22 55 70 64 61 74 65 20 64 69 67 65 73 74 20 66  "Update digest f
0a70: 61 69 6c 65 64 3a 20 22 2c 20 52 45 41 53 4f 4e  ailed: ", REASON
0a80: 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  (), NULL);..    
0a90: 54 63 6c 5f 43 6c 6f 73 65 28 69 6e 74 65 72 70  Tcl_Close(interp
0aa0: 2c 20 63 68 61 6e 29 3b 0a 09 20 20 20 20 45 56  , chan);..    EV
0ab0: 50 5f 4d 44 5f 43 54 58 5f 66 72 65 65 28 63 74  P_MD_CTX_free(ct
0ac0: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  x);..    return 
0ad0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20  TCL_ERROR;..}.  
0ae0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 6f 73    }..    /* Clos
0af0: 65 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20  e channel */.   
0b00: 20 69 66 20 28 54 63 6c 5f 43 6c 6f 73 65 28 69   if (Tcl_Close(i
0b10: 6e 74 65 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20  nterp, chan) == 
0b20: 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 45 56  TCL_ERROR) {..EV
0b30: 50 5f 4d 44 5f 43 54 58 5f 66 72 65 65 28 63 74  P_MD_CTX_free(ct
0b40: 78 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  x);..return TCL_
0b50: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
0b60: 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 68 61    /* Finalize ha
0b70: 73 68 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  sh function and 
0b80: 63 61 6c 63 75 6c 61 74 65 20 6d 65 73 73 61 67  calculate messag
0b90: 65 20 64 69 67 65 73 74 20 2a 2f 0a 20 20 20 20  e digest */.    
0ba0: 69 66 20 28 21 45 56 50 5f 44 69 67 65 73 74 46  if (!EVP_DigestF
0bb0: 69 6e 61 6c 5f 65 78 28 63 74 78 2c 20 6d 64 5f  inal_ex(ctx, md_
0bc0: 62 75 66 2c 20 26 6d 64 5f 6c 65 6e 29 29 20 7b  buf, &md_len)) {
0bd0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
0be0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 46 69 6e 61  lt(interp, "Fina
0bf0: 6c 69 7a 65 20 64 69 67 65 73 74 20 66 61 69 6c  lize digest fail
0c00: 65 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c  ed: ", REASON(),
0c10: 20 4e 55 4c 4c 29 3b 0a 09 45 56 50 5f 4d 44 5f   NULL);..EVP_MD_
0c20: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
0c30: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
0c40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 45 56 50 5f  ;.    }.    EVP_
0c50: 4d 44 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  MD_CTX_free(ctx)
0c60: 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ;..    /* Return
0c70: 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20   message digest 
0c80: 61 73 20 65 69 74 68 65 72 20 61 20 62 69 6e 61  as either a bina
0c90: 72 79 20 6f 72 20 68 65 78 20 73 74 72 69 6e 67  ry or hex string
0ca0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 66 6f 72 6d   */.    if (form
0cb0: 61 74 20 3d 3d 20 30 29 20 7b 0a 09 54 63 6c 5f  at == 0) {..Tcl_
0cc0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
0cd0: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65  erp, Tcl_NewByte
0ce0: 41 72 72 61 79 4f 62 6a 28 6d 64 5f 62 75 66 2c  ArrayObj(md_buf,
0cf0: 20 6d 64 5f 6c 65 6e 29 29 3b 0a 0a 20 20 20 20   md_len));..    
0d00: 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f 62  } else {..Tcl_Ob
0d10: 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54  j *resultObj = T
0d20: 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 09 75 6e  cl_NewObj();..un
0d30: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 74 72  signed char *ptr
0d40: 20 3d 20 54 63 6c 5f 53 65 74 42 79 74 65 41 72   = Tcl_SetByteAr
0d50: 72 61 79 4c 65 6e 67 74 68 28 72 65 73 75 6c 74  rayLength(result
0d60: 4f 62 6a 2c 20 6d 64 5f 6c 65 6e 2a 32 29 3b 0a  Obj, md_len*2);.
0d70: 0a 09 66 6f 72 20 28 75 6e 73 69 67 6e 65 64 20  ..for (unsigned 
0d80: 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 6d  int i = 0; i < m
0d90: 64 5f 6c 65 6e 3b 20 69 2b 2b 29 20 7b 0a 09 20  d_len; i++) {.. 
0da0: 20 20 20 2a 70 74 72 2b 2b 20 3d 20 68 65 78 5b     *ptr++ = hex[
0db0: 28 6d 64 5f 62 75 66 5b 69 5d 20 3e 3e 20 34 29  (md_buf[i] >> 4)
0dc0: 20 26 20 30 78 30 46 5d 3b 0a 09 20 20 20 20 2a   & 0x0F];..    *
0dd0: 70 74 72 2b 2b 20 3d 20 68 65 78 5b 6d 64 5f 62  ptr++ = hex[md_b
0de0: 75 66 5b 69 5d 20 26 20 30 78 30 46 5d 3b 0a 09  uf[i] & 0x0F];..
0df0: 7d 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  }..Tcl_SetObjRes
0e00: 75 6c 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75  ult(interp, resu
0e10: 6c 74 4f 62 6a 29 3b 0a 20 20 20 20 7d 0a 20 20  ltObj);.    }.  
0e20: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
0e30: 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}../***********
0e40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0e50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0e60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0e70: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a  ********/../*. *
0e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ec0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74  ---. *. * Digest
0ed0: 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 2d 2d  BlockModeProc --
0ee0: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
0ef0: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64  edure is invoked
0f00: 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20   by the generic 
0f10: 49 4f 20 6c 65 76 65 6c 0a 20 2a 20 20 20 20 20  IO level. *     
0f20: 20 20 74 6f 20 73 65 74 20 62 6c 6f 63 6b 69 6e    to set blockin
0f30: 67 20 61 6e 64 20 6e 6f 6e 62 6c 6f 63 6b 69 6e  g and nonblockin
0f40: 67 20 6d 6f 64 65 73 2e 0a 20 2a 0a 20 2a 20 52  g modes.. *. * R
0f50: 65 74 75 72 6e 73 3a 0a 20 2a 09 30 20 69 66 20  eturns:. *.0 if 
0f60: 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 50 4f  successful or PO
0f70: 53 49 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69  SIX error code i
0f80: 66 20 66 61 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20  f failed.. *. * 
0f90: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
0fa0: 09 53 65 74 73 20 74 68 65 20 64 65 76 69 63 65  .Sets the device
0fb0: 20 69 6e 74 6f 20 62 6c 6f 63 6b 69 6e 67 20 6f   into blocking o
0fc0: 72 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f  r nonblocking mo
0fd0: 64 65 2e 0a 20 2a 09 43 61 6e 20 63 61 6c 6c 20  de.. *.Can call 
0fe0: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 45 72  Tcl_SetChannelEr
0ff0: 72 6f 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ror.. *. *------
1000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
1040: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 69 67  /.static int Dig
1050: 65 73 74 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63  estBlockModeProc
1060: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
1070: 6e 74 44 61 74 61 2c 20 69 6e 74 20 6d 6f 64 65  ntData, int mode
1080: 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74  ) {.    DigestSt
1090: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
10a0: 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 29 20  (DigestState *) 
10b0: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20  clientData;..   
10c0: 20 69 66 20 28 6d 6f 64 65 20 3d 3d 20 54 43 4c   if (mode == TCL
10d0: 5f 4d 4f 44 45 5f 4e 4f 4e 42 4c 4f 43 4b 49 4e  _MODE_NONBLOCKIN
10e0: 47 29 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e  G) {..statePtr->
10f0: 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c  flags |= TLS_TCL
1100: 5f 41 53 59 4e 43 3b 0a 20 20 20 20 7d 20 65 6c  _ASYNC;.    } el
1110: 73 65 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e  se {..statePtr->
1120: 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54  flags &= ~(TLS_T
1130: 43 4c 5f 41 53 59 4e 43 29 3b 0a 20 20 20 20 7d  CL_ASYNC);.    }
1140: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  .    return 0;.}
1150: 0a 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d  ----------------
1180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
11a0: 20 44 69 67 65 73 74 46 72 65 65 20 2d 2d 0a 20   DigestFree --. 
11b0: 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64  *. *.This proced
11c0: 75 72 65 20 72 65 6d 6f 76 65 73 20 61 20 64 69  ure removes a di
11d0: 67 65 73 74 20 73 74 61 74 65 20 73 74 72 75 63  gest state struc
11e0: 74 75 72 65 0a 20 2a 0a 20 2a 20 52 65 74 75 72  ture. *. * Retur
11f0: 6e 73 3a 0a 20 2a 09 4e 6f 74 68 69 6e 67 0a 20  ns:. *.Nothing. 
1200: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
1210: 73 3a 0a 20 2a 09 52 65 6d 6f 76 65 73 20 73 74  s:. *.Removes st
1220: 72 75 63 74 75 72 65 0a 20 2a 0a 20 2a 2d 2d 2d  ructure. *. *---
1230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1270: 0a 20 2a 2f 0a 76 6f 69 64 20 44 69 67 65 73 74  . */.void Digest
1280: 46 72 65 65 20 28 44 69 67 65 73 74 53 74 61 74  Free (DigestStat
1290: 65 20 2a 73 74 61 74 65 50 74 72 29 20 7b 0a 20  e *statePtr) {. 
12a0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 20     if (statePtr 
12b0: 3d 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20  == (DigestState 
12c0: 2a 29 20 4e 55 4c 4c 29 20 72 65 74 75 72 6e 3b  *) NULL) return;
12d0: 0a 20 20 20 20 0a 20 20 20 20 69 66 20 28 73 74  .    .    if (st
12e0: 61 74 65 50 74 72 2d 3e 63 74 78 20 21 3d 20 4e  atePtr->ctx != N
12f0: 55 4c 4c 29 20 7b 0a 09 45 56 50 5f 4d 44 5f 43  ULL) {..EVP_MD_C
1300: 54 58 5f 66 72 65 65 28 73 74 61 74 65 50 74 72  TX_free(statePtr
1310: 2d 3e 63 74 78 29 3b 0a 20 20 20 20 7d 0a 20 20  ->ctx);.    }.  
1320: 20 20 63 6b 66 72 65 65 28 73 74 61 74 65 50 74    ckfree(statePt
1330: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  r);.}../*. *----
1340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1380: 20 2a 0a 20 2a 20 44 69 67 65 73 74 43 6c 6f 73   *. * DigestClos
1390: 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54  eProc --. *. *.T
13a0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73  his procedure is
13b0: 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20   invoked by the 
13c0: 67 65 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 6c  generic IO level
13d0: 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20 2a 09 63   to perform. *.c
13e0: 68 61 6e 6e 65 6c 2d 74 79 70 65 2d 73 70 65 63  hannel-type-spec
13f0: 69 66 69 63 20 63 6c 65 61 6e 75 70 20 77 68 65  ific cleanup whe
1400: 6e 20 64 69 67 65 73 74 20 63 68 61 6e 6e 65 6c  n digest channel
1410: 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20 2a 0a 20   is closed.. *. 
1420: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43  * Returns:. *.TC
1430: 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f  L_OK or TCL_ERRO
1440: 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  R. *. * Side eff
1450: 65 63 74 73 3a 0a 20 2a 09 57 72 69 74 65 73 20  ects:. *.Writes 
1460: 64 69 67 65 73 74 20 74 6f 20 6f 75 74 70 75 74  digest to output
1470: 20 61 6e 64 20 63 6c 6f 73 65 73 20 74 68 65 20   and closes the 
1480: 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d  channel.. *. *--
1490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d0: 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74  -. */.int Digest
14e0: 43 6c 6f 73 65 50 72 6f 63 28 43 6c 69 65 6e 74  CloseProc(Client
14f0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
1500: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1510: 65 72 70 29 20 7b 0a 20 20 20 20 44 69 67 65 73  erp) {.    Diges
1520: 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72  tState *statePtr
1530: 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20   = (DigestState 
1540: 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20  *) clientData;. 
1550: 20 20 20 69 6e 74 20 72 65 73 75 6c 74 20 3d 20     int result = 
1560: 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 6e 63 65  0;..    /* Cance
1570: 6c 20 61 63 74 69 76 65 20 74 69 6d 65 72 2c 20  l active timer, 
1580: 69 66 20 61 6e 79 20 2a 2f 0a 20 20 20 20 69 66  if any */.    if
1590: 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65   (statePtr->time
15a0: 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54  r != (Tcl_TimerT
15b0: 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54  oken) NULL) {..T
15c0: 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61  cl_DeleteTimerHa
15d0: 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e  ndler(statePtr->
15e0: 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74  timer);..statePt
15f0: 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f  r->timer = (Tcl_
1600: 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c  TimerToken) NULL
1610: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1620: 43 6c 65 61 6e 2d 75 70 20 2a 2f 0a 20 20 20 20  Clean-up */.    
1630: 44 69 67 65 73 74 46 72 65 65 28 73 74 61 74 65  DigestFree(state
1640: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Ptr);.    return
1650: 20 72 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 20   result;.}../*. 
1660: 2a 20 53 61 6d 65 20 61 73 20 44 69 67 65 73 74  * Same as Digest
1670: 43 6c 6f 73 65 50 72 6f 63 20 62 75 74 20 77 69  CloseProc but wi
1680: 74 68 20 69 6e 64 69 76 69 64 75 61 6c 20 72 65  th individual re
1690: 61 64 20 61 6e 64 20 77 72 69 74 65 20 63 6c 6f  ad and write clo
16a0: 73 65 20 63 6f 6e 74 72 6f 6c 0a 20 2a 2f 0a 73  se control. */.s
16b0: 74 61 74 69 63 20 69 6e 74 20 44 69 67 65 73 74  tatic int Digest
16c0: 43 6c 6f 73 65 32 50 72 6f 63 28 43 6c 69 65 6e  Close2Proc(Clien
16d0: 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61  tData instanceDa
16e0: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
16f0: 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67  interp, int flag
1700: 73 29 20 7b 0a 0a 20 20 20 20 69 66 20 28 28 66  s) {..    if ((f
1710: 6c 61 67 73 20 26 20 28 54 43 4c 5f 43 4c 4f 53  lags & (TCL_CLOS
1720: 45 5f 52 45 41 44 20 7c 20 54 43 4c 5f 43 4c 4f  E_READ | TCL_CLO
1730: 53 45 5f 57 52 49 54 45 29 29 20 3d 3d 20 30 29  SE_WRITE)) == 0)
1740: 20 7b 0a 09 72 65 74 75 72 6e 20 44 69 67 65 73   {..return Diges
1750: 74 43 6c 6f 73 65 50 72 6f 63 28 69 6e 73 74 61  tCloseProc(insta
1760: 6e 63 65 44 61 74 61 2c 20 69 6e 74 65 72 70 29  nceData, interp)
1770: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
1780: 72 6e 20 45 49 4e 56 41 4c 3b 0a 7d 0a 0a 2f 2a  rn EINVAL;.}../*
1790: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
17a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
17e0: 44 69 67 65 73 74 49 6e 70 75 74 50 72 6f 63 20  DigestInputProc 
17f0: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20  --. *. *.Called 
1800: 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49  by the generic I
1810: 4f 20 73 79 73 74 65 6d 20 74 6f 20 72 65 61 64  O system to read
1820: 20 64 61 74 61 20 66 72 6f 6d 20 74 72 61 6e 73   data from trans
1830: 66 6f 72 6d 2e 0a 20 2a 0a 20 2a 20 52 65 74 75  form.. *. * Retu
1840: 72 6e 73 3a 0a 20 2a 09 54 6f 74 61 6c 20 62 79  rns:. *.Total by
1850: 74 65 73 20 72 65 61 64 0a 20 2a 0a 20 2a 20 53  tes read. *. * S
1860: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
1870: 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 74  Read data from t
1880: 72 61 6e 73 66 6f 72 6d 20 61 6e 64 20 77 72 69  ransform and wri
1890: 74 65 20 74 6f 20 62 75 66 0a 20 2a 0a 20 2a 2d  te to buf. *. *-
18a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18e0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69  -----. */.int Di
18f0: 67 65 73 74 49 6e 70 75 74 50 72 6f 63 28 43 6c  gestInputProc(Cl
1900: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
1910: 61 74 61 2c 20 63 68 61 72 20 2a 62 75 66 2c 20  ata, char *buf, 
1920: 69 6e 74 20 74 6f 52 65 61 64 2c 20 69 6e 74 20  int toRead, int 
1930: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 20 7b  *errorCodePtr) {
1940: 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65  .    DigestState
1950: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44 69   *statePtr = (Di
1960: 67 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69  gestState *) cli
1970: 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 54 63 6c  entData;.    Tcl
1980: 5f 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 3b  _Channel parent;
1990: 0a 20 20 20 20 69 6e 74 20 72 65 61 64 3b 0a 20  .    int read;. 
19a0: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72     *errorCodePtr
19b0: 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 20 28 74   = 0;..    if (t
19c0: 6f 52 65 61 64 20 3c 3d 20 30 20 7c 7c 20 73 74  oRead <= 0 || st
19d0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20  atePtr->self == 
19e0: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
19f0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b  LL) {..return 0;
1a00: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
1a10: 65 74 20 62 79 74 65 73 20 66 72 6f 6d 20 75 6e  et bytes from un
1a20: 64 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c  derlying channel
1a30: 20 2a 2f 0a 20 20 20 20 70 61 72 65 6e 74 20 3d   */.    parent =
1a40: 20 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 64 43   Tcl_GetStackedC
1a50: 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d  hannel(statePtr-
1a60: 3e 73 65 6c 66 29 3b 0a 20 20 20 20 72 65 61 64  >self);.    read
1a70: 20 3d 20 54 63 6c 5f 52 65 61 64 52 61 77 28 70   = Tcl_ReadRaw(p
1a80: 61 72 65 6e 74 2c 20 62 75 66 2c 20 74 6f 52 65  arent, buf, toRe
1a90: 61 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 64  ad);..    /* Add
1aa0: 20 74 6f 20 6d 65 73 73 61 67 65 20 64 69 67 65   to message dige
1ab0: 73 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65  st */.    if (re
1ac0: 61 64 20 3e 20 30 29 20 7b 0a 09 2f 2a 20 4f 4b  ad > 0) {../* OK
1ad0: 20 2a 2f 0a 09 69 66 20 28 21 45 56 50 5f 44 69   */..if (!EVP_Di
1ae0: 67 65 73 74 55 70 64 61 74 65 28 73 74 61 74 65  gestUpdate(state
1af0: 50 74 72 2d 3e 63 74 78 2c 20 62 75 66 2c 20 72  Ptr->ctx, buf, r
1b00: 65 61 64 29 29 20 7b 0a 09 20 20 20 20 54 63 6c  ead)) {..    Tcl
1b10: 5f 53 65 74 43 68 61 6e 6e 65 6c 45 72 72 6f 72  _SetChannelError
1b20: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c  (statePtr->self,
1b30: 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 22   Tcl_ObjPrintf("
1b40: 44 69 67 65 73 74 20 75 70 64 61 74 65 20 66 61  Digest update fa
1b50: 69 6c 65 64 3a 20 25 73 22 2c 20 52 45 41 53 4f  iled: %s", REASO
1b60: 4e 28 29 29 29 3b 0a 09 20 20 20 20 2a 65 72 72  N()));..    *err
1b70: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49 4e 56  orCodePtr = EINV
1b80: 41 4c 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  AL;..    return 
1b90: 2d 31 3b 0a 09 7d 0a 09 2a 65 72 72 6f 72 43 6f  -1;..}..*errorCo
1ba0: 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a  dePtr = EAGAIN;.
1bb0: 09 72 65 61 64 20 3d 20 2d 31 3b 0a 09 20 20 20  .read = -1;..   
1bc0: 20 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20   .    } else if 
1bd0: 28 72 65 61 64 20 3c 20 30 29 20 7b 0a 09 2f 2a  (read < 0) {../*
1be0: 20 45 72 72 6f 72 20 2a 2f 0a 09 2a 65 72 72 6f   Error */..*erro
1bf0: 72 43 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f 47  rCodePtr = Tcl_G
1c00: 65 74 45 72 72 6e 6f 28 29 3b 0a 0a 20 20 20 20  etErrno();..    
1c10: 7d 20 65 6c 73 65 20 69 66 20 28 21 28 73 74 61  } else if (!(sta
1c20: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 30  tePtr->flags & 0
1c30: 78 31 30 29 29 20 7b 0a 09 2f 2a 20 45 4f 46 20  x10)) {../* EOF 
1c40: 2a 2f 0a 09 2a 65 72 72 6f 72 43 6f 64 65 50 74  */..*errorCodePt
1c50: 72 20 3d 20 30 3b 0a 09 75 6e 73 69 67 6e 65 64  r = 0;..unsigned
1c60: 20 63 68 61 72 20 6d 64 5f 62 75 66 5b 45 56 50   char md_buf[EVP
1c70: 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45 5d 3b 0a 09  _MAX_MD_SIZE];..
1c80: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6d 64 5f  unsigned int md_
1c90: 6c 65 6e 20 3d 20 30 3b 0a 0a 09 2f 2a 20 47 65  len = 0;.../* Ge
1ca0: 74 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74  t message digest
1cb0: 20 2a 2f 0a 09 69 66 20 28 21 45 56 50 5f 44 69   */..if (!EVP_Di
1cc0: 67 65 73 74 46 69 6e 61 6c 5f 65 78 28 73 74 61  gestFinal_ex(sta
1cd0: 74 65 50 74 72 2d 3e 63 74 78 2c 20 6d 64 5f 62  tePtr->ctx, md_b
1ce0: 75 66 2c 20 26 6d 64 5f 6c 65 6e 29 29 20 7b 0a  uf, &md_len)) {.
1cf0: 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50  .    *errorCodeP
1d00: 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 0a 09 2f  tr = EINVAL;.../
1d10: 2a 20 57 72 69 74 65 20 6d 65 73 73 61 67 65 20  * Write message 
1d20: 64 69 67 65 73 74 20 74 6f 20 6f 75 74 70 75 74  digest to output
1d30: 20 63 68 61 6e 6e 65 6c 20 61 73 20 62 79 74 65   channel as byte
1d40: 20 61 72 72 61 79 20 6f 72 20 68 65 78 20 73 74   array or hex st
1d50: 72 69 6e 67 20 2a 2f 0a 09 7d 20 65 6c 73 65 20  ring */..} else 
1d60: 69 66 20 28 6d 64 5f 6c 65 6e 20 3e 20 30 29 20  if (md_len > 0) 
1d70: 7b 0a 09 20 20 20 20 69 66 20 28 73 74 61 74 65  {..    if (state
1d80: 50 74 72 2d 3e 66 6f 72 6d 61 74 20 3d 3d 20 30  Ptr->format == 0
1d90: 29 20 7b 0a 09 09 72 65 61 64 20 3d 20 6d 64 5f  ) {...read = md_
1da0: 6c 65 6e 3b 0a 09 09 6d 65 6d 63 70 79 28 62 75  len;...memcpy(bu
1db0: 66 2c 20 6d 64 5f 62 75 66 2c 20 72 65 61 64 29  f, md_buf, read)
1dc0: 3b 0a 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b  ;...    } else {
1dd0: 0a 09 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ...unsigned char
1de0: 20 68 65 78 5f 62 75 66 5b 45 56 50 5f 4d 41 58   hex_buf[EVP_MAX
1df0: 5f 4d 44 5f 53 49 5a 45 2a 32 5d 3b 0a 09 09 75  _MD_SIZE*2];...u
1e00: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 74  nsigned char *pt
1e10: 72 20 3d 20 68 65 78 5f 62 75 66 3b 0a 0a 09 09  r = hex_buf;....
1e20: 66 6f 72 20 28 75 6e 73 69 67 6e 65 64 20 69 6e  for (unsigned in
1e30: 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 6d 64 5f  t i = 0; i < md_
1e40: 6c 65 6e 3b 20 69 2b 2b 29 20 7b 0a 09 09 20 20  len; i++) {...  
1e50: 20 20 2a 70 74 72 2b 2b 20 3d 20 68 65 78 5b 28    *ptr++ = hex[(
1e60: 6d 64 5f 62 75 66 5b 69 5d 20 3e 3e 20 34 29 20  md_buf[i] >> 4) 
1e70: 26 20 30 78 30 46 5d 3b 0a 09 09 20 20 20 20 2a  & 0x0F];...    *
1e80: 70 74 72 2b 2b 20 3d 20 68 65 78 5b 6d 64 5f 62  ptr++ = hex[md_b
1e90: 75 66 5b 69 5d 20 26 20 30 78 30 46 5d 3b 0a 09  uf[i] & 0x0F];..
1ea0: 09 7d 0a 09 09 72 65 61 64 20 3d 20 6d 64 5f 6c  .}...read = md_l
1eb0: 65 6e 2a 32 3b 0a 09 09 6d 65 6d 63 70 79 28 62  en*2;...memcpy(b
1ec0: 75 66 2c 20 68 65 78 5f 62 75 66 2c 20 72 65 61  uf, hex_buf, rea
1ed0: 64 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 73  d);..    }..}..s
1ee0: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c  tatePtr->flags |
1ef0: 3d 20 30 78 31 30 3b 0a 20 20 20 20 7d 0a 20 20  = 0x10;.    }.  
1f00: 20 20 72 65 74 75 72 6e 20 72 65 61 64 3b 0a 7d    return read;.}
1f10: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
1f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
1f60: 0a 20 2a 20 44 69 67 65 73 74 4f 75 74 70 75 74  . * DigestOutput
1f70: 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61  Proc --. *. *.Ca
1f80: 6c 6c 65 64 20 62 79 20 74 68 65 20 67 65 6e 65  lled by the gene
1f90: 72 69 63 20 49 4f 20 73 79 73 74 65 6d 20 74 6f  ric IO system to
1fa0: 20 77 72 69 74 65 20 64 61 74 61 20 74 6f 20 74   write data to t
1fb0: 72 61 6e 73 66 6f 72 6d 2e 0a 20 2a 0a 20 2a 20  ransform.. *. * 
1fc0: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 6f 74 61  Returns:. *.Tota
1fd0: 6c 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 0a  l bytes written.
1fe0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
1ff0: 74 73 3a 0a 20 2a 09 47 65 74 20 64 61 74 61 20  ts:. *.Get data 
2000: 66 72 6f 6d 20 62 75 66 20 61 6e 64 20 75 70 64  from buf and upd
2010: 61 74 65 20 64 69 67 65 73 74 0a 20 2a 0a 20 2a  ate digest. *. *
2020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2060: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 20 69 6e 74 20  ------. */. int 
2070: 44 69 67 65 73 74 4f 75 74 70 75 74 50 72 6f 63  DigestOutputProc
2080: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
2090: 6e 74 44 61 74 61 2c 20 63 6f 6e 73 74 20 63 68  ntData, const ch
20a0: 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 74 6f 57  ar *buf, int toW
20b0: 72 69 74 65 2c 20 69 6e 74 20 2a 65 72 72 6f 72  rite, int *error
20c0: 43 6f 64 65 50 74 72 29 20 7b 0a 20 20 20 20 44  CodePtr) {.    D
20d0: 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74  igestState *stat
20e0: 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74  ePtr = (DigestSt
20f0: 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74  ate *) clientDat
2100: 61 3b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64  a;.    *errorCod
2110: 65 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20 69  ePtr = 0;..    i
2120: 66 20 28 74 6f 57 72 69 74 65 20 3c 3d 20 30 20  f (toWrite <= 0 
2130: 7c 7c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  || statePtr->sel
2140: 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65  f == (Tcl_Channe
2150: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  l) NULL) {..retu
2160: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
2170: 72 65 74 75 72 6e 20 74 6f 57 72 69 74 65 3b 0a  return toWrite;.
2180: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
2190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
21d0: 2a 0a 20 2a 20 44 69 67 65 73 74 53 65 74 4f 70  *. * DigestSetOp
21e0: 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20  tionProc --. *. 
21f0: 2a 09 43 61 6c 6c 65 64 20 62 79 20 74 68 65 20  *.Called by the 
2200: 67 65 6e 65 72 69 63 20 49 4f 20 73 79 73 74 65  generic IO syste
2210: 6d 20 74 6f 20 73 65 74 20 63 68 61 6e 6e 65 6c  m to set channel
2220: 20 6f 70 74 69 6f 6e 20 74 6f 20 76 61 6c 75 65   option to value
2230: 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a  .. *. * Returns:
2240: 0a 20 2a 09 54 43 4c 5f 4f 4b 20 69 66 20 73 75  . *.TCL_OK if su
2250: 63 63 65 73 73 66 75 6c 20 6f 72 20 54 43 4c 5f  ccessful or TCL_
2260: 45 52 52 4f 52 20 69 66 20 66 61 69 6c 65 64 2e  ERROR if failed.
2270: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
2280: 63 74 73 3a 0a 20 2a 09 55 70 64 61 74 65 73 20  cts:. *.Updates 
2290: 63 68 61 6e 6e 65 6c 20 6f 70 74 69 6f 6e 20 74  channel option t
22a0: 6f 20 6e 65 77 20 76 61 6c 75 65 2e 0a 20 2a 0a  o new value.. *.
22b0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
22c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 2f 0a 73 74 61  --------. */.sta
2300: 74 69 63 20 69 6e 74 20 44 69 67 65 73 74 53 65  tic int DigestSe
2310: 74 4f 70 74 69 6f 6e 50 72 6f 63 28 43 6c 69 65  tOptionProc(Clie
2320: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
2330: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
2340: 6e 74 65 72 70 2c 20 63 6f 6e 73 74 20 63 68 61  nterp, const cha
2350: 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c 0a 09  r *optionName,..
2360: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70 74 69  const char *opti
2370: 6f 6e 56 61 6c 75 65 29 20 7b 0a 20 20 20 20 44  onValue) {.    D
2380: 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74  igestState *stat
2390: 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74  ePtr = (DigestSt
23a0: 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74  ate *) clientDat
23b0: 61 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e  a;.    Tcl_Chann
23c0: 65 6c 20 70 61 72 65 6e 74 3b 0a 20 20 20 20 54  el parent;.    T
23d0: 63 6c 5f 44 72 69 76 65 72 53 65 74 4f 70 74 69  cl_DriverSetOpti
23e0: 6f 6e 50 72 6f 63 20 2a 73 65 74 4f 70 74 69 6f  onProc *setOptio
23f0: 6e 50 72 6f 63 3b 0a 0a 20 20 20 20 69 66 20 28  nProc;..    if (
2400: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d  statePtr->self =
2410: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
2420: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
2430: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
2440: 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 67 61 74  ..    /* Delegat
2450: 65 20 6f 70 74 69 6f 6e 73 20 64 6f 77 6e 73 74  e options downst
2460: 72 65 61 6d 20 2a 2f 0a 20 20 20 20 70 61 72 65  ream */.    pare
2470: 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 63  nt = Tcl_GetStac
2480: 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 65  kedChannel(state
2490: 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 20  Ptr->self);.    
24a0: 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 3d 20  setOptionProc = 
24b0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 53 65 74 4f 70  Tcl_ChannelSetOp
24c0: 74 69 6f 6e 50 72 6f 63 28 54 63 6c 5f 47 65 74  tionProc(Tcl_Get
24d0: 43 68 61 6e 6e 65 6c 54 79 70 65 28 70 61 72 65  ChannelType(pare
24e0: 6e 74 29 29 3b 0a 20 20 20 20 69 66 20 28 73 65  nt));.    if (se
24f0: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 21 3d 20 4e  tOptionProc != N
2500: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 28  ULL) {..return (
2510: 2a 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 29 28  *setOptionProc)(
2520: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e  Tcl_GetChannelIn
2530: 73 74 61 6e 63 65 44 61 74 61 28 70 61 72 65 6e  stanceData(paren
2540: 74 29 2c 20 69 6e 74 65 72 70 2c 20 6f 70 74 69  t), interp, opti
2550: 6f 6e 4e 61 6d 65 2c 20 6f 70 74 69 6f 6e 56 61  onName, optionVa
2560: 6c 75 65 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  lue);.    } else
2570: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
2580: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f  RROR;.    }.}../
2590: 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
25c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
25d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
25e0: 20 44 69 67 65 73 74 47 65 74 4f 70 74 69 6f 6e   DigestGetOption
25f0: 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61  Proc --. *. *.Ca
2600: 6c 6c 65 64 20 62 79 20 74 68 65 20 67 65 6e 65  lled by the gene
2610: 72 69 63 20 49 4f 20 73 79 73 74 65 6d 20 74 6f  ric IO system to
2620: 20 67 65 74 20 63 68 61 6e 6e 65 6c 20 6f 70 74   get channel opt
2630: 69 6f 6e 27 73 20 76 61 6c 75 65 2e 0a 20 2a 0a  ion's value.. *.
2640: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54   * Returns:. *.T
2650: 43 4c 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  CL_OK if success
2660: 66 75 6c 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52  ful or TCL_ERROR
2670: 20 69 66 20 66 61 69 6c 65 64 2e 0a 20 2a 0a 20   if failed.. *. 
2680: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
2690: 20 2a 09 53 65 74 73 20 72 65 73 75 6c 74 20 74   *.Sets result t
26a0: 6f 20 6f 70 74 69 6f 6e 27 73 20 76 61 6c 75 65  o option's value
26b0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
26c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
26d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
26e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
26f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
2700: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 69 67 65  .static int Dige
2710: 73 74 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28  stGetOptionProc(
2720: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
2730: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
2740: 70 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74  p *interp, const
2750: 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d   char *optionNam
2760: 65 2c 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 20  e,..Tcl_DString 
2770: 2a 6f 70 74 69 6f 6e 56 61 6c 75 65 29 20 7b 0a  *optionValue) {.
2780: 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20      DigestState 
2790: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67  *statePtr = (Dig
27a0: 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65  estState *) clie
27b0: 6e 74 44 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f  ntData;.    Tcl_
27c0: 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 3b 0a  Channel parent;.
27d0: 20 20 20 20 54 63 6c 5f 44 72 69 76 65 72 47 65      Tcl_DriverGe
27e0: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2a 67 65 74  tOptionProc *get
27f0: 4f 70 74 69 6f 6e 50 72 6f 63 3b 0a 0a 20 20 20  OptionProc;..   
2800: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73   if (statePtr->s
2810: 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  elf == (Tcl_Chan
2820: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  nel) NULL) {..re
2830: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2840: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
2850: 6c 65 67 61 74 65 20 6f 70 74 69 6f 6e 73 20 64  legate options d
2860: 6f 77 6e 73 74 72 65 61 6d 20 2a 2f 0a 20 20 20  ownstream */.   
2870: 20 70 61 72 65 6e 74 20 3d 20 54 63 6c 5f 47 65   parent = Tcl_Ge
2880: 74 53 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28  tStackedChannel(
2890: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b  statePtr->self);
28a0: 0a 20 20 20 20 67 65 74 4f 70 74 69 6f 6e 50 72  .    getOptionPr
28b0: 6f 63 20 3d 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  oc = Tcl_Channel
28c0: 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 54 63  GetOptionProc(Tc
28d0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65  l_GetChannelType
28e0: 28 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 69  (parent));.    i
28f0: 66 20 28 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63  f (getOptionProc
2900: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74   != NULL) {..ret
2910: 75 72 6e 20 28 2a 67 65 74 4f 70 74 69 6f 6e 50  urn (*getOptionP
2920: 72 6f 63 29 28 54 63 6c 5f 47 65 74 43 68 61 6e  roc)(Tcl_GetChan
2930: 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28  nelInstanceData(
2940: 70 61 72 65 6e 74 29 2c 20 69 6e 74 65 72 70 2c  parent), interp,
2950: 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 6f 70 74   optionName, opt
2960: 69 6f 6e 56 61 6c 75 65 29 3b 0a 20 20 20 20 7d  ionValue);.    }
2970: 20 65 6c 73 65 20 69 66 20 28 6f 70 74 69 6f 6e   else if (option
2980: 4e 61 6d 65 20 3d 3d 20 28 63 68 61 72 2a 29 20  Name == (char*) 
2990: 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 52 65 71 75  NULL) {../* Requ
29a0: 65 73 74 20 69 73 20 71 75 65 72 79 20 66 6f 72  est is query for
29b0: 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 2c 20 74 68   all options, th
29c0: 69 73 20 69 73 20 6f 6b 2e 20 2a 2f 0a 09 72 65  is is ok. */..re
29d0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20  turn TCL_OK;.   
29e0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 71 75 65   }..    /* Reque
29f0: 73 74 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  st for a specifi
2a00: 63 20 6f 70 74 69 6f 6e 20 68 61 73 20 74 6f 20  c option has to 
2a10: 66 61 69 6c 2c 20 77 65 20 64 6f 6e 27 74 20 68  fail, we don't h
2a20: 61 76 65 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20  ave any. */.    
2a30: 72 65 74 75 72 6e 20 54 63 6c 5f 42 61 64 43 68  return Tcl_BadCh
2a40: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
2a50: 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20  rp, optionName, 
2a60: 22 22 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  "");.}../*. *---
2a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ab0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74  ---. *. * Digest
2ac0: 54 69 6d 65 72 48 61 6e 64 6c 65 72 20 2d 2d 0a  TimerHandler --.
2ad0: 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79 20   *. *.Called by 
2ae0: 74 68 65 20 6e 6f 74 69 66 69 65 72 20 76 69 61  the notifier via
2af0: 20 74 69 6d 65 72 20 74 6f 20 66 6c 75 73 68 20   timer to flush 
2b00: 6f 75 74 20 70 65 6e 64 69 6e 67 20 69 6e 70 75  out pending inpu
2b10: 74 20 64 61 74 61 2e 0a 20 2a 0a 20 2a 20 52 65  t data.. *. * Re
2b20: 74 75 72 6e 73 3a 0a 20 2a 09 4e 6f 74 68 69 6e  turns:. *.Nothin
2b30: 67 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  g. *. * Side eff
2b40: 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 63 61 6c  ects:. *.May cal
2b50: 6c 20 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61 6e  l Tcl_NotifyChan
2b60: 6e 65 6c 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  nel. *. *-------
2b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2bb0: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
2bc0: 44 69 67 65 73 74 54 69 6d 65 72 48 61 6e 64 6c  DigestTimerHandl
2bd0: 65 72 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  er(ClientData cl
2be0: 69 65 6e 74 44 61 74 61 29 20 7b 0a 20 20 20 20  ientData) {.    
2bf0: 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61  DigestState *sta
2c00: 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53  tePtr = (DigestS
2c10: 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61  tate *) clientDa
2c20: 74 61 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61  ta;..    if (sta
2c30: 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28  tePtr->self == (
2c40: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
2c50: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 3b 0a 20 20  L) {..return;.  
2c60: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61    }..    /* Clea
2c70: 72 20 74 69 6d 65 72 20 74 6f 6b 65 6e 20 2a 2f  r timer token */
2c80: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 74  .    statePtr->t
2c90: 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65  imer = (Tcl_Time
2ca0: 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 0a 20  rToken) NULL;.. 
2cb0: 20 20 20 2f 2a 20 46 69 72 65 20 65 76 65 6e 74     /* Fire event
2cc0: 20 69 66 20 74 68 65 72 65 20 69 73 20 70 65 6e   if there is pen
2cd0: 64 69 6e 67 20 64 61 74 61 2c 20 73 6b 69 70 20  ding data, skip 
2ce0: 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 20  otherwise */.   
2cf0: 20 69 66 20 28 28 73 74 61 74 65 50 74 72 2d 3e   if ((statePtr->
2d00: 77 61 74 63 68 4d 61 73 6b 20 26 20 54 43 4c 5f  watchMask & TCL_
2d10: 52 45 41 44 41 42 4c 45 29 20 26 26 20 28 54 63  READABLE) && (Tc
2d20: 6c 5f 49 6e 70 75 74 42 75 66 66 65 72 65 64 28  l_InputBuffered(
2d30: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 20  statePtr->self) 
2d40: 3e 20 30 29 29 20 7b 0a 09 54 63 6c 5f 4e 6f 74  > 0)) {..Tcl_Not
2d50: 69 66 79 43 68 61 6e 6e 65 6c 28 73 74 61 74 65  ifyChannel(state
2d60: 50 74 72 2d 3e 73 65 6c 66 2c 20 54 43 4c 5f 52  Ptr->self, TCL_R
2d70: 45 41 44 41 42 4c 45 29 3b 0a 20 20 20 20 7d 0a  EADABLE);.    }.
2d80: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
2d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
2dd0: 2a 0a 20 2a 20 44 69 67 65 73 74 57 61 74 63 68  *. * DigestWatch
2de0: 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 49 6e  Proc --. *. *.In
2df0: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 6f 74  itialize the not
2e00: 69 66 69 65 72 20 74 6f 20 77 61 74 63 68 20 66  ifier to watch f
2e10: 6f 72 20 65 76 65 6e 74 73 20 66 72 6f 6d 20 74  or events from t
2e20: 68 69 73 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a  his channel.. *.
2e30: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 4e   * Returns:. *.N
2e40: 6f 74 68 69 6e 67 0a 20 2a 0a 20 2a 20 53 69 64  othing. *. * Sid
2e50: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 6f  e effects:. *.Co
2e60: 6e 66 69 67 75 72 65 20 6e 6f 74 69 66 69 65 72  nfigure notifier
2e70: 20 73 6f 20 66 75 74 75 72 65 20 65 76 65 6e 74   so future event
2e80: 73 20 6f 6e 20 74 68 65 20 63 68 61 6e 6e 65 6c  s on the channel
2e90: 20 77 69 6c 6c 20 62 65 20 73 65 65 6e 20 62 79   will be seen by
2ea0: 20 54 63 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d   Tcl.. *. *-----
2eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ef0: 2d 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52 45  -. */.#define RE
2f00: 41 44 5f 44 45 4c 41 59 09 35 0a 76 6f 69 64 20  AD_DELAY.5.void 
2f10: 44 69 67 65 73 74 57 61 74 63 68 50 72 6f 63 28  DigestWatchProc(
2f20: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
2f30: 74 44 61 74 61 2c 20 69 6e 74 20 6d 61 73 6b 29  tData, int mask)
2f40: 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74 61   {.    DigestSta
2f50: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
2f60: 44 69 67 65 73 74 53 74 61 74 65 20 2a 29 20 63  DigestState *) c
2f70: 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 54  lientData;.    T
2f80: 63 6c 5f 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e  cl_Channel paren
2f90: 74 3b 0a 20 20 20 20 54 63 6c 5f 44 72 69 76 65  t;.    Tcl_Drive
2fa0: 72 57 61 74 63 68 50 72 6f 63 20 2a 77 61 74 63  rWatchProc *watc
2fb0: 68 50 72 6f 63 3b 0a 0a 20 20 20 20 69 66 20 28  hProc;..    if (
2fc0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d  statePtr->self =
2fd0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
2fe0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 3b  NULL) {..return;
2ff0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
3000: 74 6f 72 65 20 4f 52 2d 65 64 20 63 6f 6d 62 69  tore OR-ed combi
3010: 6e 61 74 69 6f 6e 20 6f 66 20 54 43 4c 5f 52 45  nation of TCL_RE
3020: 41 44 41 42 4c 45 2c 20 54 43 4c 5f 57 52 49 54  ADABLE, TCL_WRIT
3030: 41 42 4c 45 20 61 6e 64 20 54 43 4c 5f 45 58 43  ABLE and TCL_EXC
3040: 45 50 54 49 4f 4e 20 2a 2f 0a 20 20 20 20 73 74  EPTION */.    st
3050: 61 74 65 50 74 72 2d 3e 77 61 74 63 68 4d 61 73  atePtr->watchMas
3060: 6b 20 3d 20 6d 61 73 6b 3b 0a 0a 20 20 20 20 2f  k = mask;..    /
3070: 2a 20 50 72 6f 70 61 67 61 74 65 20 6d 61 73 6b  * Propagate mask
3080: 20 69 6e 66 6f 20 74 6f 20 70 61 72 65 6e 74 20   info to parent 
3090: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 70  channel */.    p
30a0: 61 72 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53  arent = Tcl_GetS
30b0: 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74  tackedChannel(st
30c0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 20  atePtr->self);. 
30d0: 20 20 20 77 61 74 63 68 50 72 6f 63 20 3d 20 54     watchProc = T
30e0: 63 6c 5f 43 68 61 6e 6e 65 6c 57 61 74 63 68 50  cl_ChannelWatchP
30f0: 72 6f 63 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  roc(Tcl_GetChann
3100: 65 6c 54 79 70 65 28 70 61 72 65 6e 74 29 29 3b  elType(parent));
3110: 0a 20 20 20 20 77 61 74 63 68 50 72 6f 63 28 54  .    watchProc(T
3120: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73  cl_GetChannelIns
3130: 74 61 6e 63 65 44 61 74 61 28 70 61 72 65 6e 74  tanceData(parent
3140: 29 2c 20 6d 61 73 6b 29 3b 0a 0a 20 20 20 20 2f  ), mask);..    /
3150: 2a 20 52 65 6d 6f 76 65 20 70 65 6e 64 69 6e 67  * Remove pending
3160: 20 74 69 6d 65 72 20 2a 2f 0a 20 20 20 20 69 66   timer */.    if
3170: 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65   (statePtr->time
3180: 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54  r != (Tcl_TimerT
3190: 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54  oken) NULL) {..T
31a0: 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61  cl_DeleteTimerHa
31b0: 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e  ndler(statePtr->
31c0: 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74  timer);..statePt
31d0: 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f  r->timer = (Tcl_
31e0: 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c  TimerToken) NULL
31f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
3200: 49 66 20 74 68 65 72 65 20 69 73 20 64 61 74 61  If there is data
3210: 20 70 65 6e 64 69 6e 67 2c 20 73 65 74 20 6e 65   pending, set ne
3220: 77 20 74 69 6d 65 72 20 74 6f 20 63 61 6c 6c 20  w timer to call 
3230: 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61 6e 6e 65  Tcl_NotifyChanne
3240: 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 6d 61  l */.    if ((ma
3250: 73 6b 20 26 20 54 43 4c 5f 52 45 41 44 41 42 4c  sk & TCL_READABL
3260: 45 29 20 26 26 20 28 54 63 6c 5f 49 6e 70 75 74  E) && (Tcl_Input
3270: 42 75 66 66 65 72 65 64 28 73 74 61 74 65 50 74  Buffered(statePt
3280: 72 2d 3e 73 65 6c 66 29 20 3e 20 30 29 29 20 7b  r->self) > 0)) {
3290: 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65  ..statePtr->time
32a0: 72 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 54 69  r = Tcl_CreateTi
32b0: 6d 65 72 48 61 6e 64 6c 65 72 28 52 45 41 44 5f  merHandler(READ_
32c0: 44 45 4c 41 59 2c 20 44 69 67 65 73 74 54 69 6d  DELAY, DigestTim
32d0: 65 72 48 61 6e 64 6c 65 72 2c 20 28 43 6c 69 65  erHandler, (Clie
32e0: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72  ntData) statePtr
32f0: 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20  );.    }.}../*. 
3300: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
3310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3340: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69  -------. *. * Di
3350: 67 65 73 74 47 65 74 48 61 6e 64 6c 65 50 72 6f  gestGetHandlePro
3360: 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65  c --. *. *.Calle
3370: 64 20 66 72 6f 6d 20 54 63 6c 5f 47 65 74 43 68  d from Tcl_GetCh
3380: 61 6e 6e 65 6c 48 61 6e 64 6c 65 20 74 6f 20 72  annelHandle to r
3390: 65 74 72 69 65 76 65 20 4f 53 20 73 70 65 63 69  etrieve OS speci
33a0: 66 69 63 20 66 69 6c 65 20 68 61 6e 64 6c 65 0a  fic file handle.
33b0: 20 2a 09 66 72 6f 6d 20 69 6e 73 69 64 65 20 74   *.from inside t
33c0: 68 69 73 20 63 68 61 6e 6e 65 6c 2e 20 4e 6f 74  his channel. Not
33d0: 20 75 73 65 64 20 66 6f 72 20 74 72 61 6e 73 66   used for transf
33e0: 6f 72 6d 61 74 69 6f 6e 73 3f 0a 20 2a 0a 20 2a  ormations?. *. *
33f0: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 49 66 20   Returns:. *.If 
3400: 64 69 72 65 63 74 69 6f 6e 20 69 73 20 54 43 4c  direction is TCL
3410: 5f 52 45 41 44 41 42 4c 45 20 72 65 74 75 72 6e  _READABLE return
3420: 20 74 68 65 20 68 61 6e 64 6c 65 20 75 73 65 64   the handle used
3430: 20 66 6f 72 20 69 6e 70 75 74 2c 20 6f 72 20 69   for input, or i
3440: 66 0a 20 2a 09 54 43 4c 5f 57 52 49 54 41 42 4c  f. *.TCL_WRITABL
3450: 45 20 72 65 74 75 72 6e 20 74 68 65 20 68 61 6e  E return the han
3460: 64 6c 65 20 75 73 65 64 20 66 6f 72 20 6f 75 74  dle used for out
3470: 70 75 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  put.. *. * Side 
3480: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65  effects:. *.None
3490: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
34a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
34e0: 0a 69 6e 74 20 44 69 67 65 73 74 47 65 74 48 61  .int DigestGetHa
34f0: 6e 64 6c 65 50 72 6f 63 28 43 6c 69 65 6e 74 44  ndleProc(ClientD
3500: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
3510: 69 6e 74 20 64 69 72 65 63 74 69 6f 6e 2c 20 43  int direction, C
3520: 6c 69 65 6e 74 44 61 74 61 20 2a 68 61 6e 64 6c  lientData *handl
3530: 65 50 74 72 29 20 7b 0a 20 20 20 20 44 69 67 65  ePtr) {.    Dige
3540: 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74  stState *statePt
3550: 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 65  r = (DigestState
3560: 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a   *) clientData;.
3570: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
3580: 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f  r->self == (Tcl_
3590: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
35a0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
35b0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  OR;.    }.    re
35c0: 74 75 72 6e 20 54 63 6c 5f 47 65 74 43 68 61 6e  turn Tcl_GetChan
35d0: 6e 65 6c 48 61 6e 64 6c 65 28 54 63 6c 5f 47 65  nelHandle(Tcl_Ge
35e0: 74 53 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28  tStackedChannel(
35f0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c  statePtr->self),
3600: 20 64 69 72 65 63 74 69 6f 6e 2c 20 68 61 6e 64   direction, hand
3610: 6c 65 50 74 72 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  lePtr);.}../*. *
3620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3660: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67  ------. *. * Dig
3670: 65 73 74 4e 6f 74 69 66 79 50 72 6f 63 20 2d 2d  estNotifyProc --
3680: 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79  . *. *.Called by
3690: 20 54 63 6c 20 74 6f 20 69 6e 66 6f 72 6d 20 75   Tcl to inform u
36a0: 73 20 6f 66 20 61 63 74 69 76 69 74 79 20 6f 6e  s of activity on
36b0: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
36c0: 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52  channel.. *. * R
36d0: 65 74 75 72 6e 73 3a 0a 20 2a 09 55 6e 63 68 61  eturns:. *.Uncha
36e0: 6e 67 65 64 20 69 6e 74 65 72 65 73 74 4d 61 73  nged interestMas
36f0: 6b 20 77 68 69 63 68 20 69 73 20 61 6e 20 4f 52  k which is an OR
3700: 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  -ed combination 
3710: 6f 66 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 20  of TCL_READABLE 
3720: 6f 72 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 0a  or TCL_WRITABLE.
3730: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
3740: 74 73 3a 0a 20 2a 09 43 61 6e 63 65 6c 73 20 61  ts:. *.Cancels a
3750: 6e 79 20 70 65 6e 64 69 6e 67 20 74 69 6d 65 72  ny pending timer
3760: 2e 0a 20 2a 0a 20 2a 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 2d 2d 2d 2d 2d  ----------------
37a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
37b0: 2f 0a 69 6e 74 20 44 69 67 65 73 74 4e 6f 74 69  /.int DigestNoti
37c0: 66 79 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74  fyProc(ClientDat
37d0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e  a clientData, in
37e0: 74 20 69 6e 74 65 72 65 73 74 4d 61 73 6b 29 20  t interestMask) 
37f0: 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74  {.    DigestStat
3800: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44  e *statePtr = (D
3810: 69 67 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c  igestState *) cl
3820: 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 2f  ientData;..    /
3830: 2a 20 53 6b 69 70 20 74 69 6d 65 72 20 65 76 65  * Skip timer eve
3840: 6e 74 20 61 73 20 72 65 64 75 6e 64 61 6e 74 20  nt as redundant 
3850: 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  */.    if (state
3860: 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54  Ptr->timer != (T
3870: 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e  cl_TimerToken) N
3880: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65  ULL) {..Tcl_Dele
3890: 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73  teTimerHandler(s
38a0: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b  tatePtr->timer);
38b0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65  ..statePtr->time
38c0: 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f  r = (Tcl_TimerTo
38d0: 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  ken) NULL;.    }
38e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 69 6e 74 65  .    return inte
38f0: 72 65 73 74 4d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a  restMask;.}../*.
3900: 20 2a 0a 20 2a 20 43 68 61 6e 6e 65 6c 20 74 79   *. * Channel ty
3910: 70 65 20 73 74 72 75 63 74 75 72 65 20 64 65 66  pe structure def
3920: 69 6e 69 74 69 6f 6e 20 66 6f 72 20 64 69 67 65  inition for dige
3930: 73 74 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f  st transformatio
3940: 6e 73 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  ns.. *. */.stati
3950: 63 20 63 6f 6e 73 74 20 54 63 6c 5f 43 68 61 6e  c const Tcl_Chan
3960: 6e 65 6c 54 79 70 65 20 64 69 67 65 73 74 43 68  nelType digestCh
3970: 61 6e 6e 65 6c 54 79 70 65 20 3d 20 7b 0a 20 20  annelType = {.  
3980: 20 20 22 64 69 67 65 73 74 22 2c 09 09 09 2f 2a    "digest",.../*
3990: 20 54 79 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   Type name */.  
39a0: 20 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45    TCL_CHANNEL_VE
39b0: 52 53 49 4f 4e 5f 35 2c 09 2f 2a 20 76 35 20 63  RSION_5,./* v5 c
39c0: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 44 69  hannel */.    Di
39d0: 67 65 73 74 43 6c 6f 73 65 50 72 6f 63 2c 09 09  gestCloseProc,..
39e0: 2f 2a 20 43 6c 6f 73 65 20 70 72 6f 63 20 2a 2f  /* Close proc */
39f0: 0a 20 20 20 20 44 69 67 65 73 74 49 6e 70 75 74  .    DigestInput
3a00: 50 72 6f 63 2c 09 09 2f 2a 20 49 6e 70 75 74 20  Proc,../* Input 
3a10: 70 72 6f 63 20 2a 2f 0a 20 20 20 20 44 69 67 65  proc */.    Dige
3a20: 73 74 4f 75 74 70 75 74 50 72 6f 63 2c 09 09 2f  stOutputProc,../
3a30: 2a 20 4f 75 74 70 75 74 20 70 72 6f 63 20 2a 2f  * Output proc */
3a40: 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20  .    NULL,.../* 
3a50: 53 65 65 6b 20 70 72 6f 63 20 2a 2f 0a 20 20 20  Seek proc */.   
3a60: 20 44 69 67 65 73 74 53 65 74 4f 70 74 69 6f 6e   DigestSetOption
3a70: 50 72 6f 63 2c 09 2f 2a 20 53 65 74 20 6f 70 74  Proc,./* Set opt
3a80: 69 6f 6e 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20  ion proc */.    
3a90: 44 69 67 65 73 74 47 65 74 4f 70 74 69 6f 6e 50  DigestGetOptionP
3aa0: 72 6f 63 2c 09 2f 2a 20 47 65 74 20 6f 70 74 69  roc,./* Get opti
3ab0: 6f 6e 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 44  on proc */.    D
3ac0: 69 67 65 73 74 57 61 74 63 68 50 72 6f 63 2c 09  igestWatchProc,.
3ad0: 09 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6e  ./* Initialize n
3ae0: 6f 74 69 66 69 65 72 20 2a 2f 0a 20 20 20 20 44  otifier */.    D
3af0: 69 67 65 73 74 47 65 74 48 61 6e 64 6c 65 50 72  igestGetHandlePr
3b00: 6f 63 2c 09 2f 2a 20 47 65 74 20 4f 53 20 68 61  oc,./* Get OS ha
3b10: 6e 64 6c 65 73 20 6f 75 74 20 6f 66 20 63 68 61  ndles out of cha
3b20: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 44 69 67 65  nnel */.    Dige
3b30: 73 74 43 6c 6f 73 65 32 50 72 6f 63 2c 09 09 2f  stClose2Proc,../
3b40: 2a 20 63 6c 6f 73 65 32 70 72 6f 63 20 2a 2f 0a  * close2proc */.
3b50: 20 20 20 20 44 69 67 65 73 74 42 6c 6f 63 6b 4d      DigestBlockM
3b60: 6f 64 65 50 72 6f 63 2c 09 2f 2a 20 53 65 74 20  odeProc,./* Set 
3b70: 62 6c 6f 63 6b 69 6e 67 2f 6e 6f 6e 62 6c 6f 63  blocking/nonbloc
3b80: 6b 69 6e 67 20 6d 6f 64 65 2a 2f 0a 20 20 20 20  king mode*/.    
3b90: 4e 55 4c 4c 2c 09 09 09 2f 2a 20 46 6c 75 73 68  NULL,.../* Flush
3ba0: 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 44 69 67   proc */.    Dig
3bb0: 65 73 74 4e 6f 74 69 66 79 50 72 6f 63 2c 09 09  estNotifyProc,..
3bc0: 2f 2a 20 48 61 6e 64 6c 69 6e 67 20 6f 66 20 65  /* Handling of e
3bd0: 76 65 6e 74 73 20 62 75 62 62 6c 69 6e 67 20 75  vents bubbling u
3be0: 70 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09  p */.    NULL,..
3bf0: 09 2f 2a 20 57 69 64 65 20 73 65 65 6b 20 70 72  ./* Wide seek pr
3c00: 6f 63 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09  oc */.    NULL,.
3c10: 09 09 2f 2a 20 54 68 72 65 61 64 20 61 63 74 69  ../* Thread acti
3c20: 6f 6e 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 09 09  on */.    NULL..
3c30: 09 2f 2a 20 54 72 75 6e 63 61 74 65 20 2a 2f 0a  ./* Truncate */.
3c40: 7d 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  };../*. *-------
3c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
3c90: 20 2a 0a 20 2a 20 44 69 67 65 73 74 43 68 61 6e   *. * DigestChan
3ca0: 6e 65 6c 20 2d 2d 0a 20 2a 0a 20 2a 09 43 72 65  nel --. *. *.Cre
3cb0: 61 74 65 20 61 20 73 74 61 63 6b 65 64 20 63 68  ate a stacked ch
3cc0: 61 6e 6e 65 6c 20 66 6f 72 20 61 20 6d 65 73 73  annel for a mess
3cd0: 61 67 65 20 64 69 67 65 73 74 20 74 72 61 6e 73  age digest trans
3ce0: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a  formation.. *. *
3cf0: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c   Returns:. *.TCL
3d00: 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52  _OK or TCL_ERROR
3d10: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
3d20: 63 74 73 3a 0a 20 2a 09 41 64 64 73 20 74 72 61  cts:. *.Adds tra
3d30: 6e 73 66 6f 72 6d 20 74 6f 20 63 68 61 6e 6e 65  nsform to channe
3d40: 6c 20 61 6e 64 20 73 65 74 73 20 72 65 73 75 6c  l and sets resul
3d50: 74 20 74 6f 20 63 68 61 6e 6e 65 6c 20 6e 61 6d  t to channel nam
3d60: 65 20 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61  e or error messa
3d70: 67 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ge.. *. *-------
3d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
3dc0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 44   */.static int.D
3dd0: 69 67 65 73 74 43 68 61 6e 6e 65 6c 28 54 63 6c  igestChannel(Tcl
3de0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
3df0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 68 61   const char *cha
3e00: 6e 6e 65 6c 2c 20 63 6f 6e 73 74 20 45 56 50 5f  nnel, const EVP_
3e10: 4d 44 20 2a 6d 64 2c 20 69 6e 74 20 66 6f 72 6d  MD *md, int form
3e20: 61 74 29 20 7b 0a 20 20 20 20 69 6e 74 20 6d 6f  at) {.    int mo
3e30: 64 65 3b 20 2f 2a 20 4f 52 2d 65 64 20 63 6f 6d  de; /* OR-ed com
3e40: 62 69 6e 61 74 69 6f 6e 20 6f 66 20 54 43 4c 5f  bination of TCL_
3e50: 52 45 41 44 41 42 4c 45 20 61 6e 64 20 54 43 4c  READABLE and TCL
3e60: 5f 57 52 49 54 41 42 4c 45 20 2a 2f 0a 20 20 20  _WRITABLE */.   
3e70: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61   Tcl_Channel cha
3e80: 6e 3b 0a 20 20 20 20 45 56 50 5f 4d 44 5f 43 54  n;.    EVP_MD_CT
3e90: 58 20 2a 63 74 78 3b 0a 20 20 20 20 44 69 67 65  X *ctx;.    Dige
3ea0: 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74  stState *statePt
3eb0: 72 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64  r;..    /* Valid
3ec0: 61 74 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20  ate args */.    
3ed0: 69 66 20 28 63 68 61 6e 6e 65 6c 20 3d 3d 20 28  if (channel == (
3ee0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 4e 55  const char *) NU
3ef0: 4c 4c 20 7c 7c 20 6d 64 20 3d 3d 20 28 63 6f 6e  LL || md == (con
3f00: 73 74 20 45 56 50 5f 4d 44 20 2a 29 20 4e 55 4c  st EVP_MD *) NUL
3f10: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  L) {..return TCL
3f20: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
3f30: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
3f40: 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c  tChannel(interp,
3f50: 20 63 68 61 6e 6e 65 6c 2c 20 26 6d 6f 64 65 29   channel, &mode)
3f60: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d  ;.    if (chan =
3f70: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
3f80: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
3f90: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
3fa0: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
3fb0: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  re to operate on
3fc0: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61   the topmost cha
3fd0: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e  nnel */.    chan
3fe0: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61   = Tcl_GetTopCha
3ff0: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20  nnel(chan);..   
4000: 20 2f 2a 20 43 72 65 61 74 65 20 69 6e 74 65 72   /* Create inter
4010: 6e 61 6c 20 73 74 6f 72 61 67 65 20 73 74 72 75  nal storage stru
4020: 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 63 74  ctures */.    ct
4030: 78 20 3d 20 45 56 50 5f 4d 44 5f 43 54 58 5f 6e  x = EVP_MD_CTX_n
4040: 65 77 28 29 3b 0a 20 20 20 20 73 74 61 74 65 50  ew();.    stateP
4050: 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 74  tr = (DigestStat
4060: 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e  e *) ckalloc((un
4070: 73 69 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 44  signed) sizeof(D
4080: 69 67 65 73 74 53 74 61 74 65 29 29 3b 0a 20 20  igestState));.  
4090: 20 20 69 66 20 28 63 74 78 20 21 3d 20 4e 55 4c    if (ctx != NUL
40a0: 4c 20 26 26 20 73 74 61 74 65 50 74 72 20 21 3d  L && statePtr !=
40b0: 20 4e 55 4c 4c 29 20 7b 0a 09 6d 65 6d 73 65 74   NULL) {..memset
40c0: 28 73 74 61 74 65 50 74 72 2c 20 30 2c 20 73 69  (statePtr, 0, si
40d0: 7a 65 6f 66 28 44 69 67 65 73 74 53 74 61 74 65  zeof(DigestState
40e0: 29 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 73  ));..statePtr->s
40f0: 65 6c 66 09 3d 20 63 68 61 6e 3b 09 09 2f 2a 20  elf.= chan;../* 
4100: 54 68 69 73 20 73 6f 63 6b 65 74 20 63 68 61 6e  This socket chan
4110: 6e 65 6c 20 2a 2f 0a 09 73 74 61 74 65 50 74 72  nel */..statePtr
4120: 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54  ->timer = (Tcl_T
4130: 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b  imerToken) NULL;
4140: 09 2f 2a 20 54 69 6d 65 72 20 74 6f 20 66 6c 75  ./* Timer to flu
4150: 73 68 20 64 61 74 61 20 2a 2f 0a 09 73 74 61 74  sh data */..stat
4160: 65 50 74 72 2d 3e 66 6c 61 67 73 20 3d 20 30 3b  ePtr->flags = 0;
4170: 09 09 2f 2a 20 43 68 61 6e 20 63 6f 6e 66 69 67  ../* Chan config
4180: 20 66 6c 61 67 73 20 2a 2f 0a 09 73 74 61 74 65   flags */..state
4190: 50 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b 20 3d  Ptr->watchMask =
41a0: 20 30 3b 09 2f 2a 20 43 75 72 72 65 6e 74 20 57   0;./* Current W
41b0: 61 74 63 68 50 72 6f 63 20 6d 61 73 6b 20 2a 2f  atchProc mask */
41c0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 6d 6f 64 65  ..statePtr->mode
41d0: 09 3d 20 6d 6f 64 65 3b 09 09 2f 2a 20 43 75 72  .= mode;../* Cur
41e0: 72 65 6e 74 20 6d 6f 64 65 20 6f 66 20 70 61 72  rent mode of par
41f0: 65 6e 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 09  ent channel */..
4200: 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74  statePtr->format
4210: 20 3d 20 66 6f 72 6d 61 74 3b 09 2f 2a 20 4f 75   = format;./* Ou
4220: 74 70 75 74 20 66 6f 72 6d 61 74 20 2a 2f 0a 09  tput format */..
4230: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
4240: 20 3d 20 69 6e 74 65 72 70 3b 09 2f 2a 20 43 75   = interp;./* Cu
4250: 72 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65  rrent interprete
4260: 72 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e  r */..statePtr->
4270: 63 74 78 20 3d 20 63 74 78 3b 09 09 2f 2a 20 53  ctx = ctx;../* S
4280: 53 4c 20 43 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  SL Context */.  
4290: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f    } else {..Tcl_
42a0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
42b0: 65 72 70 2c 20 22 49 6e 69 74 69 61 6c 69 7a 65  erp, "Initialize
42c0: 20 64 69 67 65 73 74 20 65 72 72 6f 72 3a 20 6d   digest error: m
42d0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
42e0: 20 66 61 69 6c 75 72 65 22 2c 20 28 63 68 61 72   failure", (char
42f0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 45 56 50 5f   *) NULL);..EVP_
4300: 4d 44 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  MD_CTX_free(ctx)
4310: 3b 0a 09 44 69 67 65 73 74 46 72 65 65 28 73 74  ;..DigestFree(st
4320: 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e  atePtr);..return
4330: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
4340: 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  }..    /* Initia
4350: 6c 69 7a 65 20 64 69 67 65 73 74 20 2a 2f 0a 23  lize digest */.#
4360: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
4370: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30  ON_NUMBER < 0x30
4380: 30 30 30 30 30 30 4c 0a 20 20 20 20 69 66 20 28  000000L.    if (
4390: 21 45 56 50 5f 44 69 67 65 73 74 49 6e 69 74 5f  !EVP_DigestInit_
43a0: 65 78 28 63 74 78 2c 20 6d 64 2c 20 4e 55 4c 4c  ex(ctx, md, NULL
43b0: 29 29 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 20  )).#else.    if 
43c0: 28 21 45 56 50 5f 44 69 67 65 73 74 49 6e 69 74  (!EVP_DigestInit
43d0: 5f 65 78 32 28 63 74 78 2c 20 6d 64 2c 20 4e 55  _ex2(ctx, md, NU
43e0: 4c 4c 29 29 0a 23 65 6e 64 69 66 0a 20 20 20 20  LL)).#endif.    
43f0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
4400: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 49 6e 69  ult(interp, "Ini
4410: 74 69 61 6c 69 7a 65 20 64 69 67 65 73 74 20 65  tialize digest e
4420: 72 72 6f 72 3a 20 22 2c 20 52 45 41 53 4f 4e 28  rror: ", REASON(
4430: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ), (char *) NULL
4440: 29 3b 0a 09 45 56 50 5f 4d 44 5f 43 54 58 5f 66  );..EVP_MD_CTX_f
4450: 72 65 65 28 63 74 78 29 3b 0a 09 44 69 67 65 73  ree(ctx);..Diges
4460: 74 46 72 65 65 28 73 74 61 74 65 50 74 72 29 3b  tFree(statePtr);
4470: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
4480: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
4490: 2a 20 43 6f 6e 66 69 67 75 72 65 20 63 68 61 6e  * Configure chan
44a0: 6e 65 6c 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 53  nel */.    Tcl_S
44b0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
44c0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d  interp, chan, "-
44d0: 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62  translation", "b
44e0: 69 6e 61 72 79 22 29 3b 0a 20 20 20 20 69 66 20  inary");.    if 
44f0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 42  (Tcl_GetChannelB
4500: 75 66 66 65 72 53 69 7a 65 28 63 68 61 6e 29 20  ufferSize(chan) 
4510: 3c 20 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a  < EVP_MAX_MD_SIZ
4520: 45 20 2a 20 32 29 20 7b 0a 09 54 63 6c 5f 53 65  E * 2) {..Tcl_Se
4530: 74 43 68 61 6e 6e 65 6c 42 75 66 66 65 72 53 69  tChannelBufferSi
4540: 7a 65 28 63 68 61 6e 2c 20 45 56 50 5f 4d 41 58  ze(chan, EVP_MAX
4550: 5f 4d 44 5f 53 49 5a 45 20 2a 20 32 29 3b 0a 20  _MD_SIZE * 2);. 
4560: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 74 61     }..    /* Sta
4570: 63 6b 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20  ck channel */.  
4580: 20 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66    statePtr->self
4590: 20 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e   = Tcl_StackChan
45a0: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 26 64 69 67  nel(interp, &dig
45b0: 65 73 74 43 68 61 6e 6e 65 6c 54 79 70 65 2c 20  estChannelType, 
45c0: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61  (ClientData) sta
45d0: 74 65 50 74 72 2c 20 6d 6f 64 65 2c 20 63 68 61  tePtr, mode, cha
45e0: 6e 29 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74  n);.    if (stat
45f0: 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54  ePtr->self == (T
4600: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c  cl_Channel) NULL
4610: 29 20 7b 0a 09 45 56 50 5f 4d 44 5f 43 54 58 5f  ) {..EVP_MD_CTX_
4620: 66 72 65 65 28 63 74 78 29 3b 0a 09 44 69 67 65  free(ctx);..Dige
4630: 73 74 46 72 65 65 28 73 74 61 74 65 50 74 72 29  stFree(statePtr)
4640: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
4650: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
4660: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
4670: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 20 54  terp, (char *) T
4680: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
4690: 65 28 63 68 61 6e 29 2c 20 54 43 4c 5f 56 4f 4c  e(chan), TCL_VOL
46a0: 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 65 74 75  ATILE);.    retu
46b0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
46c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
46d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
46e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
46f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4700: 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  **/../*. *------
4710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
4750: 0a 20 2a 20 44 69 67 65 73 74 48 61 73 68 46 75  . * DigestHashFu
4760: 6e 63 74 69 6f 6e 20 2d 2d 0a 20 2a 0a 20 2a 09  nction --. *. *.
4770: 20 43 61 6c 63 75 6c 61 74 65 20 6d 65 73 73 61   Calculate messa
4780: 67 65 20 64 69 67 65 73 74 20 75 73 69 6e 67 20  ge digest using 
4790: 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 0a 20  hash function.. 
47a0: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a  *. * Returns:. *
47b0: 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45  .TCL_OK or TCL_E
47c0: 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20  RROR. *. * Side 
47d0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73  effects:. *.Sets
47e0: 20 72 65 73 75 6c 74 20 74 6f 20 6d 65 73 73 61   result to messa
47f0: 67 65 20 64 69 67 65 73 74 20 6f 72 20 65 72 72  ge digest or err
4800: 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a  or message. *. *
4810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4850: 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 0a 44 69 67 65  ---. */.int.Dige
4860: 73 74 48 61 73 68 46 75 6e 63 74 69 6f 6e 28 54  stHashFunction(T
4870: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
4880: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
4890: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
48a0: 5b 5d 2c 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44  [], const EVP_MD
48b0: 20 2a 6d 64 2c 20 69 6e 74 20 66 6f 72 6d 61 74   *md, int format
48c0: 29 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 64 61  ) {.    char *da
48d0: 74 61 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b  ta;.    int len;
48e0: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  .    unsigned in
48f0: 74 20 6d 64 5f 6c 65 6e 3b 0a 20 20 20 20 75 6e  t md_len;.    un
4900: 73 69 67 6e 65 64 20 63 68 61 72 20 6d 64 5f 62  signed char md_b
4910: 75 66 5b 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49  uf[EVP_MAX_MD_SI
4920: 5a 45 5d 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62  ZE];..    if (ob
4930: 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f  jc != 2) {..Tcl_
4940: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
4950: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 64  erp, 1, objv, "d
4960: 61 74 61 22 29 3b 0a 09 72 65 74 75 72 6e 20 54  ata");..return T
4970: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
4980: 0a 20 20 20 20 2f 2a 20 47 65 74 20 64 61 74 61  .    /* Get data
4990: 20 2a 2f 0a 20 20 20 20 64 61 74 61 20 3d 20 54   */.    data = T
49a0: 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46  cl_GetByteArrayF
49b0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20  romObj(objv[1], 
49c0: 26 6c 65 6e 29 3b 0a 20 20 20 20 69 66 20 28 64  &len);.    if (d
49d0: 61 74 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 6c  ata == NULL || l
49e0: 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 54 63 6c 5f  en == 0) {..Tcl_
49f0: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
4a00: 2c 20 22 4e 6f 20 64 61 74 61 22 2c 20 4e 55 4c  , "No data", NUL
4a10: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  L);..return TCL_
4a20: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
4a30: 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 68    /* Calculate h
4a40: 61 73 68 20 76 61 6c 75 65 2c 20 63 72 65 61 74  ash value, creat
4a50: 65 20 62 69 6e 2f 68 65 78 20 72 65 70 72 65 73  e bin/hex repres
4a60: 65 6e 74 61 74 69 6f 6e 2c 20 61 6e 64 20 77 72  entation, and wr
4a70: 69 74 65 20 74 6f 20 72 65 73 75 6c 74 20 2a 2f  ite to result */
4a80: 0a 20 20 20 20 69 66 20 28 45 56 50 5f 44 69 67  .    if (EVP_Dig
4a90: 65 73 74 28 64 61 74 61 2c 20 28 73 69 7a 65 5f  est(data, (size_
4aa0: 74 29 20 6c 65 6e 2c 20 6d 64 5f 62 75 66 2c 20  t) len, md_buf, 
4ab0: 26 6d 64 5f 6c 65 6e 2c 20 6d 64 2c 20 4e 55 4c  &md_len, md, NUL
4ac0: 4c 29 29 20 7b 0a 09 69 66 20 28 66 6f 72 6d 61  L)) {..if (forma
4ad0: 74 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20 54  t == 0) {..    T
4ae0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
4af0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
4b00: 79 74 65 41 72 72 61 79 4f 62 6a 28 6d 64 5f 62  yteArrayObj(md_b
4b10: 75 66 2c 20 6d 64 5f 6c 65 6e 29 29 3b 0a 0a 09  uf, md_len));...
4b20: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 54 63  } else {..    Tc
4b30: 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a  l_Obj *resultObj
4b40: 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b   = Tcl_NewObj();
4b50: 0a 09 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ..    unsigned c
4b60: 68 61 72 20 2a 70 74 72 20 3d 20 54 63 6c 5f 53  har *ptr = Tcl_S
4b70: 65 74 42 79 74 65 41 72 72 61 79 4c 65 6e 67 74  etByteArrayLengt
4b80: 68 28 72 65 73 75 6c 74 4f 62 6a 2c 20 6d 64 5f  h(resultObj, md_
4b90: 6c 65 6e 2a 32 29 3b 0a 0a 09 20 20 20 20 66 6f  len*2);...    fo
4ba0: 72 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  r (unsigned int 
4bb0: 69 20 3d 20 30 3b 20 69 20 3c 20 6d 64 5f 6c 65  i = 0; i < md_le
4bc0: 6e 3b 20 69 2b 2b 29 20 7b 0a 09 09 2a 70 74 72  n; i++) {...*ptr
4bd0: 2b 2b 20 3d 20 68 65 78 5b 28 6d 64 5f 62 75 66  ++ = hex[(md_buf
4be0: 5b 69 5d 20 3e 3e 20 34 29 20 26 20 30 78 30 46  [i] >> 4) & 0x0F
4bf0: 5d 3b 0a 09 09 2a 70 74 72 2b 2b 20 3d 20 68 65  ];...*ptr++ = he
4c00: 78 5b 6d 64 5f 62 75 66 5b 69 5d 20 26 20 30 78  x[md_buf[i] & 0x
4c10: 30 46 5d 3b 0a 09 20 20 20 20 7d 0a 09 54 63 6c  0F];..    }..Tcl
4c20: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
4c30: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 29  terp, resultObj)
4c40: 3b 0a 09 7d 0a 0a 20 20 20 20 7d 20 65 6c 73 65  ;..}..    } else
4c50: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
4c60: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 48 61  sult(interp, "Ha
4c70: 73 68 20 63 61 6c 63 75 6c 61 74 69 6f 6e 20 65  sh calculation e
4c80: 72 72 6f 72 3a 22 2c 20 52 45 41 53 4f 4e 28 29  rror:", REASON()
4c90: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
4ca0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
4cb0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ROR;.    }.    r
4cc0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
4cd0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
4ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
4d20: 44 69 67 65 73 74 4f 62 6a 43 6d 64 20 2d 2d 0a  DigestObjCmd --.
4d30: 20 2a 0a 20 2a 09 52 65 74 75 72 6e 20 6d 65 73   *. *.Return mes
4d40: 73 61 67 65 20 64 69 67 65 73 74 20 75 73 69 6e  sage digest usin
4d50: 67 20 75 73 65 72 20 73 70 65 63 69 66 69 65 64  g user specified
4d60: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 0a   hash function..
4d70: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20   *. * Returns:. 
4d80: 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f  *.TCL_OK or TCL_
4d90: 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65  ERROR. *. * Side
4da0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74   effects:. *.Set
4db0: 73 20 72 65 73 75 6c 74 20 74 6f 20 6d 65 73 73  s result to mess
4dc0: 61 67 65 20 64 69 67 65 73 74 20 6f 72 20 65 72  age digest or er
4dd0: 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20  ror message. *. 
4de0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
4df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4e20: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
4e30: 69 6e 74 0a 44 69 67 65 73 74 4f 62 6a 43 6d 64  int.DigestObjCmd
4e40: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
4e50: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ntData, Tcl_Inte
4e60: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
4e70: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63  objc, Tcl_Obj *c
4e80: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20  onst objv[]) {. 
4e90: 20 20 20 69 6e 74 20 69 64 78 2c 20 6c 65 6e 2c     int idx, len,
4ea0: 20 66 6f 72 6d 61 74 20 3d 20 31 2c 20 6b 65 79   format = 1, key
4eb0: 5f 6c 65 6e 20 3d 20 30 2c 20 64 61 74 61 5f 6c  _len = 0, data_l
4ec0: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  en = 0;.    cons
4ed0: 74 20 63 68 61 72 20 2a 64 69 67 65 73 74 6e 61  t char *digestna
4ee0: 6d 65 2c 20 2a 63 68 61 6e 6e 65 6c 20 3d 20 4e  me, *channel = N
4ef0: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  ULL;.    Tcl_Obj
4f00: 20 2a 64 61 74 61 4f 62 6a 20 3d 20 4e 55 4c 4c   *dataObj = NULL
4f10: 2c 20 2a 66 69 6c 65 4f 62 6a 20 3d 20 4e 55 4c  , *fileObj = NUL
4f20: 4c 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  L;.    unsigned 
4f30: 63 68 61 72 20 2a 6b 65 79 20 3d 20 4e 55 4c 4c  char *key = NULL
4f40: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45 56 50 5f  ;.    const EVP_
4f50: 4d 44 20 2a 6d 64 3b 0a 0a 20 20 20 20 54 63 6c  MD *md;..    Tcl
4f60: 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
4f70: 65 72 70 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f  erp);..    if (o
4f80: 62 6a 63 20 3c 20 33 20 7c 7c 20 6f 62 6a 63 20  bjc < 3 || objc 
4f90: 3e 20 35 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e  > 5) {..Tcl_Wron
4fa0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
4fb0: 20 31 2c 20 6f 62 6a 76 2c 20 22 74 79 70 65 20   1, objv, "type 
4fc0: 3f 2d 62 69 6e 7c 2d 68 65 78 3f 20 5b 2d 63 68  ?-bin|-hex? [-ch
4fd0: 61 6e 6e 65 6c 20 63 68 61 6e 20 7c 20 2d 66 69  annel chan | -fi
4fe0: 6c 65 20 66 69 6c 65 6e 61 6d 65 20 7c 20 3f 2d  le filename | ?-
4ff0: 64 61 74 61 3f 20 64 61 74 61 5d 22 29 3b 0a 09  data? data]");..
5000: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
5010: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
5020: 47 65 74 20 64 69 67 65 73 74 20 2a 2f 0a 20 20  Get digest */.  
5030: 20 20 64 69 67 65 73 74 6e 61 6d 65 20 3d 20 54    digestname = T
5040: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
5050: 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 26 6c 65  Obj(objv[1], &le
5060: 6e 29 3b 0a 20 20 20 20 69 66 20 28 64 69 67 65  n);.    if (dige
5070: 73 74 6e 61 6d 65 20 3d 3d 20 4e 55 4c 4c 20 7c  stname == NULL |
5080: 7c 20 28 6d 64 20 3d 20 45 56 50 5f 67 65 74 5f  | (md = EVP_get_
5090: 64 69 67 65 73 74 62 79 6e 61 6d 65 28 64 69 67  digestbyname(dig
50a0: 65 73 74 6e 61 6d 65 29 29 20 3d 3d 20 4e 55 4c  estname)) == NUL
50b0: 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  L) {..Tcl_Append
50c0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
50d0: 49 6e 76 61 6c 69 64 20 64 69 67 65 73 74 20 74  Invalid digest t
50e0: 79 70 65 20 5c 22 22 2c 20 64 69 67 65 73 74 6e  ype \"", digestn
50f0: 61 6d 65 2c 20 22 5c 22 22 2c 20 4e 55 4c 4c 29  ame, "\"", NULL)
5100: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
5110: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
5120: 2f 2a 20 4f 70 74 69 6d 61 6c 20 63 61 73 65 20  /* Optimal case 
5130: 66 6f 72 20 62 6c 6f 62 20 6f 66 20 64 61 74 61  for blob of data
5140: 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63   */.    if (objc
5150: 20 3d 3d 20 33 29 20 7b 0a 09 72 65 74 75 72 6e   == 3) {..return
5160: 20 44 69 67 65 73 74 48 61 73 68 46 75 6e 63 74   DigestHashFunct
5170: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 2d 2d 6f 62  ion(interp, --ob
5180: 6a 63 2c 20 2b 2b 6f 62 6a 76 2c 20 6d 64 2c 20  jc, ++objv, md, 
5190: 66 6f 72 6d 61 74 29 3b 0a 20 20 20 20 7d 0a 0a  format);.    }..
51a0: 20 20 20 20 2f 2a 20 47 65 74 20 6f 70 74 69 6f      /* Get optio
51b0: 6e 73 20 2a 2f 0a 20 20 20 20 66 6f 72 20 28 69  ns */.    for (i
51c0: 64 78 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62  dx = 2; idx < ob
51d0: 6a 63 2d 31 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  jc-1; idx++) {..
51e0: 63 68 61 72 20 2a 6f 70 74 20 3d 20 54 63 6c 5f  char *opt = Tcl_
51f0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
5200: 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 4e 55 4c 4c  (objv[idx], NULL
5210: 29 3b 0a 0a 09 69 66 20 28 6f 70 74 5b 30 5d 20  );...if (opt[0] 
5220: 21 3d 20 27 2d 27 29 0a 09 20 20 20 20 62 72 65  != '-')..    bre
5230: 61 6b 3b 0a 0a 09 4f 50 54 46 4c 41 47 28 22 2d  ak;...OPTFLAG("-
5240: 62 69 6e 22 2c 20 66 6f 72 6d 61 74 2c 20 30 29  bin", format, 0)
5250: 3b 0a 09 4f 50 54 46 4c 41 47 28 22 2d 62 69 6e  ;..OPTFLAG("-bin
5260: 61 72 79 22 2c 20 66 6f 72 6d 61 74 2c 20 30 29  ary", format, 0)
5270: 3b 0a 09 4f 50 54 46 4c 41 47 28 22 2d 68 65 78  ;..OPTFLAG("-hex
5280: 22 2c 20 66 6f 72 6d 61 74 2c 20 31 29 3b 0a 09  ", format, 1);..
5290: 4f 50 54 46 4c 41 47 28 22 2d 68 65 78 61 64 65  OPTFLAG("-hexade
52a0: 63 69 6d 61 6c 22 2c 20 66 6f 72 6d 61 74 2c 20  cimal", format, 
52b0: 31 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 64 61  1);..OPTOBJ("-da
52c0: 74 61 22 2c 20 64 61 74 61 4f 62 6a 29 3b 0a 09  ta", dataObj);..
52d0: 4f 50 54 53 54 52 28 22 2d 63 68 61 6e 22 2c 20  OPTSTR("-chan", 
52e0: 63 68 61 6e 6e 65 6c 29 3b 0a 09 4f 50 54 53 54  channel);..OPTST
52f0: 52 28 22 2d 63 68 61 6e 6e 65 6c 22 2c 20 63 68  R("-channel", ch
5300: 61 6e 6e 65 6c 29 3b 0a 09 4f 50 54 4f 42 4a 28  annel);..OPTOBJ(
5310: 22 2d 66 69 6c 65 22 2c 20 66 69 6c 65 4f 62 6a  "-file", fileObj
5320: 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 66 69 6c  );..OPTOBJ("-fil
5330: 65 6e 61 6d 65 22 2c 20 66 69 6c 65 4f 62 6a 29  ename", fileObj)
5340: 3b 0a 0a 09 4f 50 54 42 41 44 28 22 6f 70 74 69  ;...OPTBAD("opti
5350: 6f 6e 22 2c 20 22 2d 62 69 6e 2c 20 2d 64 61 74  on", "-bin, -dat
5360: 61 2c 20 2d 66 69 6c 65 2c 20 2d 66 69 6c 65 6e  a, -file, -filen
5370: 61 6d 65 2c 20 2d 6b 65 79 2c 20 6f 72 20 2d 68  ame, -key, or -h
5380: 65 78 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  ex");..return TC
5390: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
53a0: 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 6f 70 74      /* If no opt
53b0: 69 6f 6e 20 66 6f 72 20 6c 61 73 74 20 61 72 67  ion for last arg
53c0: 2c 20 74 68 65 6e 20 69 74 73 20 74 68 65 20 64  , then its the d
53d0: 61 74 61 20 2a 2f 0a 20 20 20 20 69 66 20 28 69  ata */.    if (i
53e0: 64 78 20 3c 20 6f 62 6a 63 29 20 7b 0a 09 64 61  dx < objc) {..da
53f0: 74 61 4f 62 6a 20 3d 20 6f 62 6a 76 5b 69 64 78  taObj = objv[idx
5400: 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  ];.    }..    /*
5410: 20 43 61 6c 63 20 64 69 67 65 73 74 20 6f 6e 20   Calc digest on 
5420: 66 69 6c 65 2c 20 73 74 61 63 6b 65 64 20 63 68  file, stacked ch
5430: 61 6e 6e 65 6c 2c 20 6f 72 20 64 61 74 61 20 62  annel, or data b
5440: 6c 6f 62 20 2a 2f 0a 20 20 20 20 69 66 20 28 66  lob */.    if (f
5450: 69 6c 65 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20  ileObj != NULL) 
5460: 7b 0a 09 72 65 74 75 72 6e 20 44 69 67 65 73 74  {..return Digest
5470: 46 69 6c 65 28 69 6e 74 65 72 70 2c 20 66 69 6c  File(interp, fil
5480: 65 4f 62 6a 2c 20 6d 64 2c 20 66 6f 72 6d 61 74  eObj, md, format
5490: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  );.    } else if
54a0: 20 28 63 68 61 6e 6e 65 6c 20 21 3d 20 4e 55 4c   (channel != NUL
54b0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 44 69 67  L) {..return Dig
54c0: 65 73 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  estChannel(inter
54d0: 70 2c 20 63 68 61 6e 6e 65 6c 2c 20 6d 64 2c 20  p, channel, md, 
54e0: 66 6f 72 6d 61 74 29 3b 0a 20 20 20 20 7d 20 65  format);.    } e
54f0: 6c 73 65 20 69 66 20 28 64 61 74 61 4f 62 6a 20  lse if (dataObj 
5500: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f  != NULL) {..Tcl_
5510: 4f 62 6a 20 2a 6f 62 6a 73 5b 32 5d 3b 0a 09 6f  Obj *objs[2];..o
5520: 62 6a 73 5b 30 5d 20 3d 20 4e 55 4c 4c 3b 0a 09  bjs[0] = NULL;..
5530: 6f 62 6a 73 5b 31 5d 20 3d 20 64 61 74 61 4f 62  objs[1] = dataOb
5540: 6a 3b 0a 09 72 65 74 75 72 6e 20 44 69 67 65 73  j;..return Diges
5550: 74 48 61 73 68 46 75 6e 63 74 69 6f 6e 28 69 6e  tHashFunction(in
5560: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 73 2c 20 6d  terp, 2, objs, m
5570: 64 2c 20 66 6f 72 6d 61 74 29 3b 0a 20 20 20 20  d, format);.    
5580: 7d 0a 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  }..    Tcl_Appen
5590: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
55a0: 22 4e 6f 20 64 61 74 61 20 73 70 65 63 69 66 69  "No data specifi
55b0: 65 64 2e 22 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  ed.", NULL);.   
55c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
55d0: 52 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  R;.}../*. *-----
55e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
5620: 2a 0a 20 2a 20 4d 65 73 73 61 67 65 20 44 69 67  *. * Message Dig
5630: 65 73 74 20 43 6f 6e 76 65 6e 69 65 6e 63 65 20  est Convenience 
5640: 43 6f 6d 6d 61 6e 64 73 20 2d 2d 0a 20 2a 0a 20  Commands --. *. 
5650: 2a 09 43 6f 6e 76 65 6e 69 65 6e 63 65 20 63 6f  *.Convenience co
5660: 6d 6d 61 6e 64 73 20 66 6f 72 20 6d 65 73 73 61  mmands for messa
5670: 67 65 20 64 69 67 65 73 74 73 2e 0a 20 2a 0a 20  ge digests.. *. 
5680: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43  * Returns:. *.TC
5690: 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f  L_OK or TCL_ERRO
56a0: 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  R. *. * Side eff
56b0: 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 72 65  ects:. *.Sets re
56c0: 73 75 6c 74 20 74 6f 20 6d 65 73 73 61 67 65 20  sult to message 
56d0: 64 69 67 65 73 74 20 6f 72 20 65 72 72 6f 72 20  digest or error 
56e0: 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d  message. *. *---
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 2d 2d 2d 2d  ----------------
5710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5730: 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 4d  . */.int DigestM
5740: 44 34 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  D4Cmd(ClientData
5750: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
5760: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
5770: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
5780: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
5790: 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 44  ) {.    return D
57a0: 69 67 65 73 74 48 61 73 68 46 75 6e 63 74 69 6f  igestHashFunctio
57b0: 6e 28 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20  n(interp, objc, 
57c0: 6f 62 6a 76 2c 20 45 56 50 5f 6d 64 34 28 29 2c  objv, EVP_md4(),
57d0: 20 31 29 3b 0a 7d 0a 0a 69 6e 74 20 44 69 67 65   1);.}..int Dige
57e0: 73 74 4d 44 35 43 6d 64 28 43 6c 69 65 6e 74 44  stMD5Cmd(ClientD
57f0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
5800: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
5810: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
5820: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
5830: 76 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 72  v[]) {.    retur
5840: 6e 20 44 69 67 65 73 74 48 61 73 68 46 75 6e 63  n DigestHashFunc
5850: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f 62 6a  tion(interp, obj
5860: 63 2c 20 6f 62 6a 76 2c 20 45 56 50 5f 6d 64 35  c, objv, EVP_md5
5870: 28 29 2c 20 31 29 3b 0a 7d 0a 0a 69 6e 74 20 44  (), 1);.}..int D
5880: 69 67 65 73 74 53 48 41 31 43 6d 64 28 43 6c 69  igestSHA1Cmd(Cli
5890: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
58a0: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
58b0: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
58c0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
58d0: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 72   objv[]) {.    r
58e0: 65 74 75 72 6e 20 44 69 67 65 73 74 48 61 73 68  eturn DigestHash
58f0: 46 75 6e 63 74 69 6f 6e 28 69 6e 74 65 72 70 2c  Function(interp,
5900: 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 45 56 50   objc, objv, EVP
5910: 5f 73 68 61 31 28 29 2c 20 31 29 3b 0a 7d 0a 0a  _sha1(), 1);.}..
5920: 69 6e 74 20 44 69 67 65 73 74 53 48 41 32 35 36  int DigestSHA256
5930: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63  Cmd(ClientData c
5940: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
5950: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
5960: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
5970: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20   *const objv[]) 
5980: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 44 69 67  {.    return Dig
5990: 65 73 74 48 61 73 68 46 75 6e 63 74 69 6f 6e 28  estHashFunction(
59a0: 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62  interp, objc, ob
59b0: 6a 76 2c 20 45 56 50 5f 73 68 61 32 35 36 28 29  jv, EVP_sha256()
59c0: 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d  , 1);.}../*. *--
59d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a10: 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 44 69 67 65  -. *. * Tls_Dige
5a20: 73 74 43 6f 6d 6d 61 6e 64 73 20 2d 2d 0a 20 2a  stCommands --. *
5a30: 0a 20 2a 09 43 72 65 61 74 65 20 64 69 67 65 73  . *.Create diges
5a40: 74 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a  t commands. *. *
5a50: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c   Returns:. *.TCL
5a60: 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52  _OK or TCL_ERROR
5a70: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
5a80: 63 74 73 3a 0a 20 2a 09 43 72 65 61 74 65 73 20  cts:. *.Creates 
5a90: 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 2d 2d  commands. *. *--
5aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ae0: 2d 0a 20 2a 2f 0a 69 6e 74 20 54 6c 73 5f 44 69  -. */.int Tls_Di
5af0: 67 65 73 74 43 6f 6d 6d 61 6e 64 73 28 54 63 6c  gestCommands(Tcl
5b00: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
5b10: 20 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74   {.    Tcl_Creat
5b20: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
5b30: 72 70 2c 20 22 74 6c 73 3a 3a 64 69 67 65 73 74  rp, "tls::digest
5b40: 22 2c 20 44 69 67 65 73 74 4f 62 6a 43 6d 64 2c  ", DigestObjCmd,
5b50: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c   (ClientData) 0,
5b60: 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
5b70: 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
5b80: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
5b90: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
5ba0: 74 6c 73 3a 3a 6d 64 34 22 2c 20 44 69 67 65 73  tls::md4", Diges
5bb0: 74 4d 44 34 43 6d 64 2c 20 28 43 6c 69 65 6e 74  tMD4Cmd, (Client
5bc0: 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d  Data) 0, (Tcl_Cm
5bd0: 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
5be0: 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72  ULL);.    Tcl_Cr
5bf0: 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
5c00: 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 64 35  nterp, "tls::md5
5c10: 22 2c 20 44 69 67 65 73 74 4d 44 35 43 6d 64 2c  ", DigestMD5Cmd,
5c20: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c   (ClientData) 0,
5c30: 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
5c40: 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
5c50: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
5c60: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
5c70: 74 6c 73 3a 3a 73 68 61 31 22 2c 20 44 69 67 65  tls::sha1", Dige
5c80: 73 74 53 48 41 31 43 6d 64 2c 20 28 43 6c 69 65  stSHA1Cmd, (Clie
5c90: 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f  ntData) 0, (Tcl_
5ca0: 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
5cb0: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f   NULL);.    Tcl_
5cc0: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
5cd0: 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73  (interp, "tls::s
5ce0: 68 61 32 35 36 22 2c 20 44 69 67 65 73 74 53 48  ha256", DigestSH
5cf0: 41 32 35 36 43 6d 64 2c 20 28 43 6c 69 65 6e 74  A256Cmd, (Client
5d00: 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d  Data) 0, (Tcl_Cm
5d10: 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
5d20: 55 4c 4c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ULL);.    return
5d30: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a               TCL_OK;.}..