Hex Artifact Content

Artifact cd70ba21395f5e006c2e01fe91246a4a0fad6c760863fc71894b6169dbe0e4d8:


0000: 2f 2a 0a 20 2a 20 4d 65 73 73 61 67 65 20 44 69  /*. * Message Di
0010: 67 65 73 74 73 20 4d 6f 64 75 6c 65 0a 20 2a 0a  gests Module. *.
0020: 20 2a 20 50 72 6f 76 69 64 65 73 20 63 6f 6d 6d   * Provides comm
0030: 61 6e 64 73 20 74 6f 20 63 61 6c 63 75 6c 61 74  ands to calculat
0040: 65 20 61 20 6d 65 73 73 61 67 65 20 64 69 67 65  e a message dige
0050: 73 74 20 75 73 69 6e 67 20 61 20 73 70 65 63 69  st using a speci
0060: 66 69 65 64 20 68 61 73 68 20 66 75 6e 63 74 69  fied hash functi
0070: 6f 6e 2e 0a 20 2a 0a 20 2a 20 43 6f 70 79 72 69  on.. *. * Copyri
0080: 67 68 74 20 28 43 29 20 32 30 32 33 20 42 72 69  ght (C) 2023 Bri
0090: 61 6e 20 4f 27 48 61 67 61 6e 0a 20 2a 0a 20 2a  an O'Hagan. *. *
00a0: 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73  /..#include "tls
00b0: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
00c0: 22 74 63 6c 4f 70 74 73 2e 68 22 0a 23 69 6e 63  "tclOpts.h".#inc
00d0: 6c 75 64 65 20 3c 74 63 6c 2e 68 3e 0a 23 69 6e  lude <tcl.h>.#in
00e0: 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a  clude <stdio.h>.
00f0: 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67  #include <string
0100: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70  .h>.#include <op
0110: 65 6e 73 73 6c 2f 65 76 70 2e 68 3e 0a 23 69 6e  enssl/evp.h>.#in
0120: 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 63  clude <openssl/c
0130: 6d 61 63 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  mac.h>.#include 
0140: 3c 6f 70 65 6e 73 73 6c 2f 68 6d 61 63 2e 68 3e  <openssl/hmac.h>
0150: 0a 0a 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20 2a  ../* Constants *
0160: 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 68 65  /.const char *he
0170: 78 20 3d 20 22 30 31 32 33 34 35 36 37 38 39 41  x = "0123456789A
0180: 42 43 44 45 46 22 3b 0a 0a 2f 2a 20 4d 61 63 72  BCDEF";../* Macr
0190: 6f 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 42 55  os */.#define BU
01a0: 46 46 45 52 5f 53 49 5a 45 20 36 35 35 33 36 0a  FFER_SIZE 65536.
01b0: 23 64 65 66 69 6e 65 20 42 49 4e 5f 46 4f 52 4d  #define BIN_FORM
01c0: 41 54 20 30 0a 23 64 65 66 69 6e 65 20 48 45 58  AT 0.#define HEX
01d0: 5f 46 4f 52 4d 41 54 20 31 0a 23 64 65 66 69 6e  _FORMAT 1.#defin
01e0: 65 20 43 48 41 4e 5f 45 4f 46 20 30 78 31 30 0a  e CHAN_EOF 0x10.
01f0: 23 64 65 66 69 6e 65 20 54 59 50 45 5f 4d 44 20  #define TYPE_MD 
0200: 20 20 20 30 78 32 30 0a 23 64 65 66 69 6e 65 20     0x20.#define 
0210: 54 59 50 45 5f 48 4d 41 43 20 20 30 78 34 30 0a  TYPE_HMAC  0x40.
0220: 23 64 65 66 69 6e 65 20 54 59 50 45 5f 43 4d 41  #define TYPE_CMA
0230: 43 20 20 30 78 38 30 0a 0a 2f 2a 0a 20 2a 20 54  C  0x80../*. * T
0240: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 64 65  his structure de
0250: 66 69 6e 65 73 20 74 68 65 20 70 65 72 2d 69 6e  fines the per-in
0260: 73 74 61 6e 63 65 20 73 74 61 74 65 20 6f 66 20  stance state of 
0270: 61 20 64 69 67 65 73 74 20 6f 70 65 72 61 74 69  a digest operati
0280: 6f 6e 2e 0a 20 2a 2f 0a 74 79 70 65 64 65 66 20  on.. */.typedef 
0290: 73 74 72 75 63 74 20 44 69 67 65 73 74 53 74 61  struct DigestSta
02a0: 74 65 20 7b 0a 09 54 63 6c 5f 43 68 61 6e 6e 65  te {..Tcl_Channe
02b0: 6c 20 73 65 6c 66 3b 09 2f 2a 20 54 68 69 73 20  l self;./* This 
02c0: 73 6f 63 6b 65 74 20 63 68 61 6e 6e 65 6c 20 2a  socket channel *
02d0: 2f 0a 09 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65  /..Tcl_TimerToke
02e0: 6e 20 74 69 6d 65 72 3b 09 2f 2a 20 54 69 6d 65  n timer;./* Time
02f0: 72 20 66 6f 72 20 72 65 61 64 20 65 76 65 6e 74  r for read event
0300: 73 20 2a 2f 0a 0a 09 69 6e 74 20 66 6c 61 67 73  s */...int flags
0310: 3b 09 09 2f 2a 20 43 68 61 6e 20 63 6f 6e 66 69  ;../* Chan confi
0320: 67 20 66 6c 61 67 73 20 2a 2f 0a 09 69 6e 74 20  g flags */..int 
0330: 77 61 74 63 68 4d 61 73 6b 3b 09 09 2f 2a 20 43  watchMask;../* C
0340: 75 72 72 65 6e 74 20 57 61 74 63 68 50 72 6f 63  urrent WatchProc
0350: 20 6d 61 73 6b 20 2a 2f 0a 09 69 6e 74 20 6d 6f   mask */..int mo
0360: 64 65 3b 09 09 2f 2a 20 43 75 72 72 65 6e 74 20  de;../* Current 
0370: 6d 6f 64 65 20 6f 66 20 70 61 72 65 6e 74 20 63  mode of parent c
0380: 68 61 6e 6e 65 6c 20 2a 2f 0a 09 69 6e 74 20 66  hannel */..int f
0390: 6f 72 6d 61 74 3b 09 09 2f 2a 20 44 69 67 65 73  ormat;../* Diges
03a0: 74 20 66 6f 72 6d 61 74 20 61 6e 64 20 6f 70 65  t format and ope
03b0: 72 61 74 69 6f 6e 20 2a 2f 0a 0a 09 54 63 6c 5f  ration */...Tcl_
03c0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 09  Interp *interp;.
03d0: 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 65 72  /* Current inter
03e0: 70 72 65 74 65 72 20 2a 2f 0a 09 45 56 50 5f 4d  preter */..EVP_M
03f0: 44 5f 43 54 58 20 2a 63 74 78 3b 09 2f 2a 20 4d  D_CTX *ctx;./* M
0400: 44 20 43 6f 6e 74 65 78 74 20 2a 2f 0a 09 48 4d  D Context */..HM
0410: 41 43 5f 43 54 58 20 2a 68 63 74 78 3b 09 09 2f  AC_CTX *hctx;../
0420: 2a 20 48 4d 41 43 20 43 6f 6e 74 65 78 74 20 2a  * HMAC Context *
0430: 2f 0a 09 43 4d 41 43 5f 43 54 58 20 2a 63 63 74  /..CMAC_CTX *cct
0440: 78 3b 09 09 2f 2a 20 43 4d 41 43 20 43 6f 6e 74  x;../* CMAC Cont
0450: 65 78 74 20 2a 2f 0a 09 54 63 6c 5f 43 6f 6d 6d  ext */..Tcl_Comm
0460: 61 6e 64 20 74 6f 6b 65 6e 3b 09 2f 2a 20 43 6f  and token;./* Co
0470: 6d 6d 61 6e 64 20 74 6f 6b 65 6e 20 2a 2f 0a 7d  mmand token */.}
0480: 20 44 69 67 65 73 74 53 74 61 74 65 3b 0a 0a 2f   DigestState;../
0490: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
04a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
04b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
04c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
04d0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c  -------. *. * Tl
04e0: 73 5f 44 69 67 65 73 74 4e 65 77 20 2d 2d 0a 20  s_DigestNew --. 
04f0: 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69  *. *.This functi
0500: 6f 6e 20 63 72 65 61 74 65 73 20 61 20 64 69 67  on creates a dig
0510: 65 73 74 20 73 74 61 74 65 20 73 74 72 75 63 74  est state struct
0520: 75 72 65 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  ure. *. * Return
0530: 73 3a 0a 20 2a 09 44 69 67 65 73 74 20 73 74 72  s:. *.Digest str
0540: 75 63 74 75 72 65 20 70 6f 69 6e 74 65 72 0a 20  ucture pointer. 
0550: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
0560: 73 3a 0a 20 2a 09 43 72 65 61 74 65 73 20 73 74  s:. *.Creates st
0570: 72 75 63 74 75 72 65 0a 20 2a 0a 20 2a 2d 2d 2d  ructure. *. *---
0580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05c0: 0a 20 2a 2f 0a 44 69 67 65 73 74 53 74 61 74 65  . */.DigestState
05d0: 20 2a 54 6c 73 5f 44 69 67 65 73 74 4e 65 77 28   *Tls_DigestNew(
05e0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
05f0: 72 70 2c 20 69 6e 74 20 66 6f 72 6d 61 74 29 20  rp, int format) 
0600: 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74  {.    DigestStat
0610: 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 0a 20 20  e *statePtr;..  
0620: 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 44 69    statePtr = (Di
0630: 67 65 73 74 53 74 61 74 65 20 2a 29 20 63 6b 61  gestState *) cka
0640: 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20  lloc((unsigned) 
0650: 73 69 7a 65 6f 66 28 44 69 67 65 73 74 53 74 61  sizeof(DigestSta
0660: 74 65 29 29 3b 0a 20 20 20 20 69 66 20 28 73 74  te));.    if (st
0670: 61 74 65 50 74 72 20 21 3d 20 4e 55 4c 4c 29 20  atePtr != NULL) 
0680: 7b 0a 09 6d 65 6d 73 65 74 28 73 74 61 74 65 50  {..memset(stateP
0690: 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 44 69  tr, 0, sizeof(Di
06a0: 67 65 73 74 53 74 61 74 65 29 29 3b 0a 09 73 74  gestState));..st
06b0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 09 3d 20 4e  atePtr->self.= N
06c0: 55 4c 4c 3b 09 09 2f 2a 20 54 68 69 73 20 73 6f  ULL;../* This so
06d0: 63 6b 65 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  cket channel */.
06e0: 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72  .statePtr->timer
06f0: 20 3d 20 4e 55 4c 4c 3b 09 09 2f 2a 20 54 69 6d   = NULL;../* Tim
0700: 65 72 20 74 6f 20 66 6c 75 73 68 20 64 61 74 61  er to flush data
0710: 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 66   */..statePtr->f
0720: 6c 61 67 73 20 3d 20 30 3b 09 09 2f 2a 20 43 68  lags = 0;../* Ch
0730: 61 6e 20 63 6f 6e 66 69 67 20 66 6c 61 67 73 20  an config flags 
0740: 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 77 61  */..statePtr->wa
0750: 74 63 68 4d 61 73 6b 20 3d 20 30 3b 09 2f 2a 20  tchMask = 0;./* 
0760: 43 75 72 72 65 6e 74 20 57 61 74 63 68 50 72 6f  Current WatchPro
0770: 63 20 6d 61 73 6b 20 2a 2f 0a 09 73 74 61 74 65  c mask */..state
0780: 50 74 72 2d 3e 6d 6f 64 65 09 3d 20 30 3b 09 09  Ptr->mode.= 0;..
0790: 2f 2a 20 43 75 72 72 65 6e 74 20 6d 6f 64 65 20  /* Current mode 
07a0: 6f 66 20 70 61 72 65 6e 74 20 63 68 61 6e 6e 65  of parent channe
07b0: 6c 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e  l */..statePtr->
07c0: 66 6f 72 6d 61 74 20 3d 20 66 6f 72 6d 61 74 3b  format = format;
07d0: 09 2f 2a 20 44 69 67 65 73 74 20 66 6f 72 6d 61  ./* Digest forma
07e0: 74 20 61 6e 64 20 6f 70 65 72 61 74 69 6f 6e 20  t and operation 
07f0: 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 69 6e  */..statePtr->in
0800: 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 09 2f  terp = interp;./
0810: 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 65 72 70  * Current interp
0820: 72 65 74 65 72 20 2a 2f 0a 09 73 74 61 74 65 50  reter */..stateP
0830: 74 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 09  tr->ctx = NULL;.
0840: 09 2f 2a 20 4d 44 20 43 6f 6e 74 65 78 74 20 2a  ./* MD Context *
0850: 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 68 63 74  /..statePtr->hct
0860: 78 20 3d 20 4e 55 4c 4c 3b 09 09 2f 2a 20 48 4d  x = NULL;../* HM
0870: 41 43 20 43 6f 6e 74 65 78 74 20 2a 2f 0a 09 73  AC Context */..s
0880: 74 61 74 65 50 74 72 2d 3e 63 63 74 78 20 3d 20  tatePtr->cctx = 
0890: 4e 55 4c 4c 3b 09 09 2f 2a 20 43 4d 41 43 20 43  NULL;../* CMAC C
08a0: 6f 6e 74 65 78 74 20 2a 2f 0a 09 73 74 61 74 65  ontext */..state
08b0: 50 74 72 2d 3e 74 6f 6b 65 6e 20 3d 20 4e 55 4c  Ptr->token = NUL
08c0: 4c 3b 09 09 2f 2a 20 43 6f 6d 6d 61 6e 64 20 74  L;../* Command t
08d0: 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  oken */.    }.  
08e0: 20 20 72 65 74 75 72 6e 20 73 74 61 74 65 50 74    return statePt
08f0: 72 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  r;.}../*. *-----
0900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
0940: 2a 0a 20 2a 20 54 6c 73 5f 44 69 67 65 73 74 46  *. * Tls_DigestF
0950: 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  ree --. *. *.Thi
0960: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 6d 6f 76  s function remov
0970: 65 73 20 61 20 64 69 67 65 73 74 20 73 74 61 74  es a digest stat
0980: 65 20 73 74 72 75 63 74 75 72 65 0a 20 2a 0a 20  e structure. *. 
0990: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 4e 6f  * Returns:. *.No
09a0: 74 68 69 6e 67 0a 20 2a 0a 20 2a 20 53 69 64 65  thing. *. * Side
09b0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 52 65 6d   effects:. *.Rem
09c0: 6f 76 65 73 20 73 74 72 75 63 74 75 72 65 0a 20  oves structure. 
09d0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
09e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a10: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64  -------. */.void
0a20: 20 54 6c 73 5f 44 69 67 65 73 74 46 72 65 65 28   Tls_DigestFree(
0a30: 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61  DigestState *sta
0a40: 74 65 50 74 72 29 20 7b 0a 20 20 20 20 69 66 20  tePtr) {.    if 
0a50: 28 73 74 61 74 65 50 74 72 20 3d 3d 20 28 44 69  (statePtr == (Di
0a60: 67 65 73 74 53 74 61 74 65 20 2a 29 20 4e 55 4c  gestState *) NUL
0a70: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 3b 0a 20 20  L) {..return;.  
0a80: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61    }..    if (sta
0a90: 74 65 50 74 72 2d 3e 63 74 78 20 21 3d 20 28 45  tePtr->ctx != (E
0aa0: 56 50 5f 4d 44 5f 43 54 58 20 2a 29 20 4e 55 4c  VP_MD_CTX *) NUL
0ab0: 4c 29 20 7b 0a 09 45 56 50 5f 4d 44 5f 43 54 58  L) {..EVP_MD_CTX
0ac0: 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e  _free(statePtr->
0ad0: 63 74 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ctx);.    }.    
0ae0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 68 63  if (statePtr->hc
0af0: 74 78 20 21 3d 20 28 48 4d 41 43 5f 43 54 58 20  tx != (HMAC_CTX 
0b00: 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 48 4d 41 43  *) NULL) {..HMAC
0b10: 5f 43 54 58 5f 66 72 65 65 28 73 74 61 74 65 50  _CTX_free(stateP
0b20: 74 72 2d 3e 68 63 74 78 29 3b 0a 20 20 20 20 7d  tr->hctx);.    }
0b30: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
0b40: 72 2d 3e 63 63 74 78 20 21 3d 20 28 43 4d 41 43  r->cctx != (CMAC
0b50: 5f 43 54 58 20 2a 29 20 4e 55 4c 4c 29 20 7b 0a  _CTX *) NULL) {.
0b60: 09 43 4d 41 43 5f 43 54 58 5f 66 72 65 65 28 73  .CMAC_CTX_free(s
0b70: 74 61 74 65 50 74 72 2d 3e 63 63 74 78 29 3b 0a  tatePtr->cctx);.
0b80: 20 20 20 20 7d 0a 20 20 20 20 63 6b 66 72 65 65      }.    ckfree
0b90: 28 73 74 61 74 65 50 74 72 29 3b 0a 7d 0a 0a 2f  (statePtr);.}../
0ba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0bb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0bc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0bd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0be0: 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ***/../*. *-----
0bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
0c30: 2a 0a 20 2a 20 54 6c 73 5f 44 69 67 65 73 74 49  *. * Tls_DigestI
0c40: 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 49 6e 69  nit --. *. *.Ini
0c50: 74 69 61 6c 69 7a 65 20 61 20 68 61 73 68 20 66  tialize a hash f
0c60: 75 6e 63 74 69 6f 6e 0a 20 2a 0a 20 2a 20 52 65  unction. *. * Re
0c70: 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b  turns:. *.TCL_OK
0c80: 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f   if successful o
0c90: 72 20 54 43 4c 5f 45 52 52 4f 52 20 66 6f 72 20  r TCL_ERROR for 
0ca0: 66 61 69 6c 75 72 65 20 77 69 74 68 20 72 65 73  failure with res
0cb0: 75 6c 74 20 73 65 74 0a 20 2a 09 74 6f 20 65 72  ult set. *.to er
0cc0: 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a  ror message.. *.
0cd0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
0ce0: 0a 20 2a 09 4e 6f 20 72 65 73 75 6c 74 20 6f 72  . *.No result or
0cf0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20   error message. 
0d00: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
0d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d40: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20  -------. */.int 
0d50: 54 6c 73 5f 44 69 67 65 73 74 49 6e 69 74 28 54  Tls_DigestInit(T
0d60: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
0d70: 70 2c 20 44 69 67 65 73 74 53 74 61 74 65 20 2a  p, DigestState *
0d80: 73 74 61 74 65 50 74 72 2c 20 63 6f 6e 73 74 20  statePtr, const 
0d90: 45 56 50 5f 4d 44 20 2a 6d 64 2c 0a 09 63 6f 6e  EVP_MD *md,..con
0da0: 73 74 20 45 56 50 5f 43 49 50 48 45 52 20 2a 63  st EVP_CIPHER *c
0db0: 69 70 68 65 72 2c 20 54 63 6c 5f 4f 62 6a 20 2a  ipher, Tcl_Obj *
0dc0: 6b 65 79 4f 62 6a 29 20 7b 0a 20 20 20 20 69 6e  keyObj) {.    in
0dd0: 74 20 6b 65 79 5f 6c 65 6e 2c 20 72 65 73 20 3d  t key_len, res =
0de0: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e   0;.    const un
0df0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79  signed char *key
0e00: 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ;..    /* Create
0e10: 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20   message digest 
0e20: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 20 20 69  context */.    i
0e30: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6f 72  f (statePtr->for
0e40: 6d 61 74 20 26 20 54 59 50 45 5f 4d 44 29 20 7b  mat & TYPE_MD) {
0e50: 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20  ..statePtr->ctx 
0e60: 3d 20 45 56 50 5f 4d 44 5f 43 54 58 5f 6e 65 77  = EVP_MD_CTX_new
0e70: 28 29 3b 0a 09 72 65 73 20 3d 20 28 73 74 61 74  ();..res = (stat
0e80: 65 50 74 72 2d 3e 63 74 78 20 21 3d 20 4e 55 4c  ePtr->ctx != NUL
0e90: 4c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  L);.    } else i
0ea0: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6f 72  f (statePtr->for
0eb0: 6d 61 74 20 26 20 54 59 50 45 5f 48 4d 41 43 29  mat & TYPE_HMAC)
0ec0: 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 68 63   {..statePtr->hc
0ed0: 74 78 20 3d 20 48 4d 41 43 5f 43 54 58 5f 6e 65  tx = HMAC_CTX_ne
0ee0: 77 28 29 3b 0a 09 72 65 73 20 3d 20 28 73 74 61  w();..res = (sta
0ef0: 74 65 50 74 72 2d 3e 68 63 74 78 20 21 3d 20 4e  tePtr->hctx != N
0f00: 55 4c 4c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  ULL);.    } else
0f10: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66   if (statePtr->f
0f20: 6f 72 6d 61 74 20 26 20 54 59 50 45 5f 43 4d 41  ormat & TYPE_CMA
0f30: 43 29 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e  C) {..statePtr->
0f40: 63 63 74 78 20 3d 20 43 4d 41 43 5f 43 54 58 5f  cctx = CMAC_CTX_
0f50: 6e 65 77 28 29 3b 0a 09 72 65 73 20 3d 20 28 73  new();..res = (s
0f60: 74 61 74 65 50 74 72 2d 3e 63 63 74 78 20 21 3d  tatePtr->cctx !=
0f70: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20   NULL);.    }.  
0f80: 20 20 69 66 20 28 21 72 65 73 29 20 7b 0a 09 54    if (!res) {..T
0f90: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
0fa0: 69 6e 74 65 72 70 2c 20 22 43 72 65 61 74 65 20  interp, "Create 
0fb0: 64 69 67 65 73 74 20 63 6f 6e 74 65 78 74 20 66  digest context f
0fc0: 61 69 6c 65 64 3a 20 22 2c 20 52 45 41 53 4f 4e  ailed: ", REASON
0fd0: 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75  (), NULL);..retu
0fe0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
0ff0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74    }..    /* Init
1000: 69 61 6c 69 7a 65 20 68 61 73 68 20 66 75 6e 63  ialize hash func
1010: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28  tion */.    if (
1020: 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74  statePtr->format
1030: 20 26 20 54 59 50 45 5f 4d 44 29 20 7b 0a 09 72   & TYPE_MD) {..r
1040: 65 73 20 3d 20 45 56 50 5f 44 69 67 65 73 74 49  es = EVP_DigestI
1050: 6e 69 74 5f 65 78 28 73 74 61 74 65 50 74 72 2d  nit_ex(statePtr-
1060: 3e 63 74 78 2c 20 6d 64 2c 20 4e 55 4c 4c 29 3b  >ctx, md, NULL);
1070: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
1080: 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74  statePtr->format
1090: 20 26 20 54 59 50 45 5f 48 4d 41 43 29 20 7b 0a   & TYPE_HMAC) {.
10a0: 09 6b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42 79  .key = Tcl_GetBy
10b0: 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6b  teArrayFromObj(k
10c0: 65 79 4f 62 6a 2c 20 26 6b 65 79 5f 6c 65 6e 29  eyObj, &key_len)
10d0: 3b 0a 09 72 65 73 20 3d 20 48 4d 41 43 5f 49 6e  ;..res = HMAC_In
10e0: 69 74 5f 65 78 28 73 74 61 74 65 50 74 72 2d 3e  it_ex(statePtr->
10f0: 68 63 74 78 2c 20 28 63 6f 6e 73 74 20 76 6f 69  hctx, (const voi
1100: 64 20 2a 29 20 6b 65 79 2c 20 6b 65 79 5f 6c 65  d *) key, key_le
1110: 6e 2c 20 6d 64 2c 20 4e 55 4c 4c 29 3b 0a 20 20  n, md, NULL);.  
1120: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 61    } else if (sta
1130: 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20  tePtr->format & 
1140: 54 59 50 45 5f 43 4d 41 43 29 20 7b 0a 09 6b 65  TYPE_CMAC) {..ke
1150: 79 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41  y = Tcl_GetByteA
1160: 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6b 65 79 4f  rrayFromObj(keyO
1170: 62 6a 2c 20 26 6b 65 79 5f 6c 65 6e 29 3b 0a 09  bj, &key_len);..
1180: 72 65 73 20 3d 20 43 4d 41 43 5f 49 6e 69 74 28  res = CMAC_Init(
1190: 73 74 61 74 65 50 74 72 2d 3e 63 63 74 78 2c 20  statePtr->cctx, 
11a0: 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 29 20 6b  (const void *) k
11b0: 65 79 2c 20 6b 65 79 5f 6c 65 6e 2c 20 63 69 70  ey, key_len, cip
11c0: 68 65 72 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  her, NULL);.    
11d0: 7d 0a 20 20 20 20 69 66 20 28 21 72 65 73 29 20  }.    if (!res) 
11e0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
11f0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 49 6e 69  ult(interp, "Ini
1200: 74 69 61 6c 69 7a 65 20 64 69 67 65 73 74 20 66  tialize digest f
1210: 61 69 6c 65 64 3a 20 22 2c 20 52 45 41 53 4f 4e  ailed: ", REASON
1220: 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75  (), NULL);..retu
1230: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1240: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54    }.    return T
1250: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d  CL_OK;.}../*. *-
1260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12a0: 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 44 69 67  --. *. * Tls_Dig
12b0: 65 73 74 55 70 64 61 74 65 20 2d 2d 0a 20 2a 0a  estUpdate --. *.
12c0: 20 2a 09 55 70 64 61 74 65 20 61 20 68 61 73 68   *.Update a hash
12d0: 20 66 75 6e 63 74 69 6f 6e 0a 20 2a 0a 20 2a 20   function. *. * 
12e0: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 31 20 69 66  Returns:. *.1 if
12f0: 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 30   successful or 0
1300: 20 66 6f 72 20 66 61 69 6c 75 72 65 0a 20 2a 0a   for failure. *.
1310: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
1320: 0a 20 2a 09 41 64 64 73 20 62 75 66 20 74 6f 20  . *.Adds buf to 
1330: 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 0a 20 2a  hash function. *
1340: 0a 20 2a 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 2d  ----------------
1380: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 54  ------. */.int T
1390: 6c 73 5f 44 69 67 65 73 74 55 70 64 61 74 65 28  ls_DigestUpdate(
13a0: 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61  DigestState *sta
13b0: 74 65 50 74 72 2c 20 63 68 61 72 20 2a 62 75 66  tePtr, char *buf
13c0: 2c 20 73 69 7a 65 5f 74 20 72 65 61 64 29 20 7b  , size_t read) {
13d0: 0a 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 30  .    int res = 0
13e0: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  ;..    if (state
13f0: 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20 54 59  Ptr->format & TY
1400: 50 45 5f 4d 44 29 20 7b 0a 09 72 65 73 20 3d 20  PE_MD) {..res = 
1410: 45 56 50 5f 44 69 67 65 73 74 55 70 64 61 74 65  EVP_DigestUpdate
1420: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
1430: 62 75 66 2c 20 72 65 61 64 29 3b 0a 20 20 20 20  buf, read);.    
1440: 7d 20 65 6c 73 65 20 69 66 20 28 73 74 61 74 65  } else if (state
1450: 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20 54 59  Ptr->format & TY
1460: 50 45 5f 48 4d 41 43 29 20 7b 0a 09 72 65 73 20  PE_HMAC) {..res 
1470: 3d 20 48 4d 41 43 5f 55 70 64 61 74 65 28 73 74  = HMAC_Update(st
1480: 61 74 65 50 74 72 2d 3e 68 63 74 78 2c 20 62 75  atePtr->hctx, bu
1490: 66 2c 20 72 65 61 64 29 3b 0a 20 20 20 20 7d 20  f, read);.    } 
14a0: 65 6c 73 65 20 69 66 20 28 73 74 61 74 65 50 74  else if (statePt
14b0: 72 2d 3e 66 6f 72 6d 61 74 20 26 20 54 59 50 45  r->format & TYPE
14c0: 5f 43 4d 41 43 29 20 7b 0a 09 72 65 73 20 3d 20  _CMAC) {..res = 
14d0: 43 4d 41 43 5f 55 70 64 61 74 65 28 73 74 61 74  CMAC_Update(stat
14e0: 65 50 74 72 2d 3e 63 63 74 78 2c 20 62 75 66 2c  ePtr->cctx, buf,
14f0: 20 72 65 61 64 29 3b 0a 20 20 20 20 7d 0a 20 20   read);.    }.  
1500: 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
1510: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
1520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
1560: 54 6c 73 5f 44 69 67 65 73 74 46 69 6e 69 61 6c  Tls_DigestFinial
1570: 69 7a 65 20 2d 2d 0a 20 2a 0a 20 2a 09 46 69 6e  ize --. *. *.Fin
1580: 61 6c 69 7a 65 20 61 20 68 61 73 68 20 66 75 6e  alize a hash fun
1590: 63 74 69 6f 6e 20 61 6e 64 20 67 65 6e 65 72 61  ction and genera
15a0: 74 65 20 61 20 6d 65 73 73 61 67 65 20 64 69 67  te a message dig
15b0: 65 73 74 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  est. *. * Return
15c0: 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 69 66 20  s:. *.TCL_OK if 
15d0: 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 54 43  successful or TC
15e0: 4c 5f 45 52 52 4f 52 20 66 6f 72 20 66 61 69 6c  L_ERROR for fail
15f0: 75 72 65 20 77 69 74 68 20 72 65 73 75 6c 74 20  ure with result 
1600: 73 65 74 0a 20 2a 09 74 6f 20 65 72 72 6f 72 20  set. *.to error 
1610: 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 20 53  message.. *. * S
1620: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
1630: 53 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20 6d  Sets result to m
1640: 65 73 73 61 67 65 20 64 69 67 65 73 74 20 66 6f  essage digest fo
1650: 72 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20  r hash function 
1660: 6f 72 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  or an error mess
1670: 61 67 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  age.. *. *------
1680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
16c0: 2f 0a 0a 69 6e 74 20 54 6c 73 5f 44 69 67 65 73  /..int Tls_Diges
16d0: 74 46 69 6e 69 61 6c 69 7a 65 28 54 63 6c 5f 49  tFinialize(Tcl_I
16e0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 44  nterp *interp, D
16f0: 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74  igestState *stat
1700: 65 50 74 72 29 20 7b 0a 20 20 20 20 75 6e 73 69  ePtr) {.    unsi
1710: 67 6e 65 64 20 63 68 61 72 20 6d 64 5f 62 75 66  gned char md_buf
1720: 5b 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45  [EVP_MAX_MD_SIZE
1730: 5d 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  ];.    unsigned 
1740: 69 6e 74 20 6d 64 5f 6c 65 6e 3b 0a 20 20 20 20  int md_len;.    
1750: 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 0a 20 20  int res = 0;..  
1760: 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 68 61    /* Finalize ha
1770: 73 68 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  sh function and 
1780: 63 61 6c 63 75 6c 61 74 65 20 6d 65 73 73 61 67  calculate messag
1790: 65 20 64 69 67 65 73 74 20 2a 2f 0a 20 20 20 20  e digest */.    
17a0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6f  if (statePtr->fo
17b0: 72 6d 61 74 20 26 20 54 59 50 45 5f 4d 44 29 20  rmat & TYPE_MD) 
17c0: 7b 0a 09 72 65 73 20 3d 20 45 56 50 5f 44 69 67  {..res = EVP_Dig
17d0: 65 73 74 46 69 6e 61 6c 5f 65 78 28 73 74 61 74  estFinal_ex(stat
17e0: 65 50 74 72 2d 3e 63 74 78 2c 20 6d 64 5f 62 75  ePtr->ctx, md_bu
17f0: 66 2c 20 26 6d 64 5f 6c 65 6e 29 3b 0a 20 20 20  f, &md_len);.   
1800: 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 61 74   } else if (stat
1810: 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20 54  ePtr->format & T
1820: 59 50 45 5f 48 4d 41 43 29 20 7b 0a 09 72 65 73  YPE_HMAC) {..res
1830: 20 3d 20 48 4d 41 43 5f 46 69 6e 61 6c 28 73 74   = HMAC_Final(st
1840: 61 74 65 50 74 72 2d 3e 68 63 74 78 2c 20 6d 64  atePtr->hctx, md
1850: 5f 62 75 66 2c 20 26 6d 64 5f 6c 65 6e 29 3b 0a  _buf, &md_len);.
1860: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
1870: 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20  tatePtr->format 
1880: 26 20 54 59 50 45 5f 43 4d 41 43 29 20 7b 0a 09  & TYPE_CMAC) {..
1890: 73 69 7a 65 5f 74 20 6c 65 6e 3b 0a 09 72 65 73  size_t len;..res
18a0: 20 3d 20 43 4d 41 43 5f 46 69 6e 61 6c 28 73 74   = CMAC_Final(st
18b0: 61 74 65 50 74 72 2d 3e 63 63 74 78 2c 20 6d 64  atePtr->cctx, md
18c0: 5f 62 75 66 2c 20 26 6c 65 6e 29 3b 0a 09 6d 64  _buf, &len);..md
18d0: 5f 6c 65 6e 20 3d 20 28 75 6e 73 69 67 6e 65 64  _len = (unsigned
18e0: 20 69 6e 74 29 20 6c 65 6e 3b 0a 20 20 20 20 7d   int) len;.    }
18f0: 0a 20 20 20 20 69 66 20 28 21 72 65 73 29 20 7b  .    if (!res) {
1900: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
1910: 6c 74 28 69 6e 74 65 72 70 2c 20 22 46 69 6e 61  lt(interp, "Fina
1920: 6c 69 7a 65 20 64 69 67 65 73 74 20 66 61 69 6c  lize digest fail
1930: 65 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c  ed: ", REASON(),
1940: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
1950: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
1960: 0a 0a 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  ..    /* Return 
1970: 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20 61  message digest a
1980: 73 20 65 69 74 68 65 72 20 61 20 62 69 6e 61 72  s either a binar
1990: 79 20 6f 72 20 68 65 78 20 73 74 72 69 6e 67 20  y or hex string 
19a0: 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  */.    if (state
19b0: 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20 42 49  Ptr->format & BI
19c0: 4e 5f 46 4f 52 4d 41 54 29 20 7b 0a 09 54 63 6c  N_FORMAT) {..Tcl
19d0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
19e0: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74  terp, Tcl_NewByt
19f0: 65 41 72 72 61 79 4f 62 6a 28 6d 64 5f 62 75 66  eArrayObj(md_buf
1a00: 2c 20 6d 64 5f 6c 65 6e 29 29 3b 0a 0a 20 20 20  , md_len));..   
1a10: 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f   } else {..Tcl_O
1a20: 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 20 3d 20  bj *resultObj = 
1a30: 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 09 75  Tcl_NewObj();..u
1a40: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 74  nsigned char *pt
1a50: 72 20 3d 20 54 63 6c 5f 53 65 74 42 79 74 65 41  r = Tcl_SetByteA
1a60: 72 72 61 79 4c 65 6e 67 74 68 28 72 65 73 75 6c  rrayLength(resul
1a70: 74 4f 62 6a 2c 20 6d 64 5f 6c 65 6e 2a 32 29 3b  tObj, md_len*2);
1a80: 0a 0a 09 66 6f 72 20 28 75 6e 73 69 67 6e 65 64  ...for (unsigned
1a90: 20 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20   int i = 0; i < 
1aa0: 6d 64 5f 6c 65 6e 3b 20 69 2b 2b 29 20 7b 0a 09  md_len; i++) {..
1ab0: 20 20 20 20 2a 70 74 72 2b 2b 20 3d 20 68 65 78      *ptr++ = hex
1ac0: 5b 28 6d 64 5f 62 75 66 5b 69 5d 20 3e 3e 20 34  [(md_buf[i] >> 4
1ad0: 29 20 26 20 30 78 30 46 5d 3b 0a 09 20 20 20 20  ) & 0x0F];..    
1ae0: 2a 70 74 72 2b 2b 20 3d 20 68 65 78 5b 6d 64 5f  *ptr++ = hex[md_
1af0: 62 75 66 5b 69 5d 20 26 20 30 78 30 46 5d 3b 0a  buf[i] & 0x0F];.
1b00: 09 7d 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65  .}..Tcl_SetObjRe
1b10: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 72 65 73  sult(interp, res
1b20: 75 6c 74 4f 62 6a 29 3b 0a 20 20 20 20 7d 0a 20  ultObj);.    }. 
1b30: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
1b40: 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../**********
1b50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20  *********/../*. 
1b90: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
1ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bd0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 44  ----. *. * Tls_D
1be0: 69 67 65 73 74 46 69 6c 65 20 2d 2d 0a 20 2a 0a  igestFile --. *.
1bf0: 20 2a 09 52 65 74 75 72 6e 20 6d 65 73 73 61 67   *.Return messag
1c00: 65 20 64 69 67 65 73 74 20 66 6f 72 20 66 69 6c  e digest for fil
1c10: 65 20 75 73 69 6e 67 20 75 73 65 72 20 73 70 65  e using user spe
1c20: 63 69 66 69 65 64 20 68 61 73 68 20 66 75 6e 63  cified hash func
1c30: 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 75  tion.. *. * Retu
1c40: 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f  rns:. *.TCL_OK o
1c50: 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20  r TCL_ERROR. *. 
1c60: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
1c70: 20 2a 09 52 65 73 75 6c 74 20 69 73 20 6d 65 73   *.Result is mes
1c80: 73 61 67 65 20 64 69 67 65 73 74 20 6f 72 20 65  sage digest or e
1c90: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a  rror message. *.
1ca0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
1cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ce0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 54 6c  -----. */.int Tl
1cf0: 73 5f 44 69 67 65 73 74 46 69 6c 65 28 54 63 6c  s_DigestFile(Tcl
1d00: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1d10: 20 54 63 6c 5f 4f 62 6a 20 2a 66 69 6c 65 6e 61   Tcl_Obj *filena
1d20: 6d 65 2c 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44  me, const EVP_MD
1d30: 20 2a 6d 64 2c 0a 09 63 6f 6e 73 74 20 45 56 50   *md,..const EVP
1d40: 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 2c  _CIPHER *cipher,
1d50: 20 69 6e 74 20 66 6f 72 6d 61 74 2c 20 54 63 6c   int format, Tcl
1d60: 5f 4f 62 6a 20 2a 6b 65 79 4f 62 6a 29 20 7b 0a  _Obj *keyObj) {.
1d70: 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20      DigestState 
1d80: 2a 73 74 61 74 65 50 74 72 3b 0a 20 20 20 20 54  *statePtr;.    T
1d90: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 20  cl_Channel chan 
1da0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e 73 69  = NULL;.    unsi
1db0: 67 6e 65 64 20 63 68 61 72 20 62 75 66 5b 42 55  gned char buf[BU
1dc0: 46 46 45 52 5f 53 49 5a 45 5d 3b 0a 20 20 20 20  FFER_SIZE];.    
1dd0: 69 6e 74 20 72 65 73 20 3d 20 54 43 4c 5f 4f 4b  int res = TCL_OK
1de0: 2c 20 6c 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 4f  , len;..    /* O
1df0: 70 65 6e 20 66 69 6c 65 20 63 68 61 6e 6e 65 6c  pen file channel
1e00: 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54   */.    chan = T
1e10: 63 6c 5f 46 53 4f 70 65 6e 46 69 6c 65 43 68 61  cl_FSOpenFileCha
1e20: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 66 69 6c  nnel(interp, fil
1e30: 65 6e 61 6d 65 2c 20 22 72 62 22 2c 20 30 34 34  ename, "rb", 044
1e40: 34 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e  4);.    if (chan
1e50: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c   == (Tcl_Channel
1e60: 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  ) NULL) {..retur
1e70: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
1e80: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 66 69   }..    /* Confi
1e90: 67 75 72 65 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  gure channel */.
1ea0: 20 20 20 20 69 66 20 28 28 72 65 73 20 3d 20 54      if ((res = T
1eb0: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_SetChannelOpt
1ec0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  ion(interp, chan
1ed0: 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22  , "-translation"
1ee0: 2c 20 22 62 69 6e 61 72 79 22 29 29 20 3d 3d 20  , "binary")) == 
1ef0: 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 67 6f  TCL_ERROR) {..go
1f00: 74 6f 20 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20  to done;.    }. 
1f10: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65     Tcl_SetChanne
1f20: 6c 42 75 66 66 65 72 53 69 7a 65 28 63 68 61 6e  lBufferSize(chan
1f30: 2c 20 42 55 46 46 45 52 5f 53 49 5a 45 29 3b 0a  , BUFFER_SIZE);.
1f40: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 73  .    /* Create s
1f50: 74 61 74 65 20 64 61 74 61 20 73 74 72 75 63 74  tate data struct
1f60: 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 73 74 61   */.    if ((sta
1f70: 74 65 50 74 72 20 3d 20 54 6c 73 5f 44 69 67 65  tePtr = Tls_Dige
1f80: 73 74 4e 65 77 28 69 6e 74 65 72 70 2c 20 66 6f  stNew(interp, fo
1f90: 72 6d 61 74 29 29 20 3d 3d 20 4e 55 4c 4c 29 20  rmat)) == NULL) 
1fa0: 7b 0a 09 72 65 73 20 3d 20 54 43 4c 5f 45 52 52  {..res = TCL_ERR
1fb0: 4f 52 3b 0a 09 67 6f 74 6f 20 64 6f 6e 65 3b 0a  OR;..goto done;.
1fc0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e      }..    /* In
1fd0: 69 74 69 61 6c 69 7a 65 20 68 61 73 68 20 66 75  itialize hash fu
1fe0: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66  nction */.    if
1ff0: 20 28 28 72 65 73 20 3d 20 54 6c 73 5f 44 69 67   ((res = Tls_Dig
2000: 65 73 74 49 6e 69 74 28 69 6e 74 65 72 70 2c 20  estInit(interp, 
2010: 73 74 61 74 65 50 74 72 2c 20 6d 64 2c 20 63 69  statePtr, md, ci
2020: 70 68 65 72 2c 20 6b 65 79 4f 62 6a 29 29 20 21  pher, keyObj)) !
2030: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 67 6f 74  = TCL_OK) {..got
2040: 6f 20 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 0a 20  o done;.    }.. 
2050: 20 20 20 2f 2a 20 52 65 61 64 20 66 69 6c 65 20     /* Read file 
2060: 64 61 74 61 20 61 6e 64 20 75 70 64 61 74 65 20  data and update 
2070: 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  hash function */
2080: 0a 20 20 20 20 77 68 69 6c 65 20 28 21 54 63 6c  .    while (!Tcl
2090: 5f 45 6f 66 28 63 68 61 6e 29 29 20 7b 0a 09 6c  _Eof(chan)) {..l
20a0: 65 6e 20 3d 20 54 63 6c 5f 52 65 61 64 52 61 77  en = Tcl_ReadRaw
20b0: 28 63 68 61 6e 2c 20 28 63 68 61 72 20 2a 29 20  (chan, (char *) 
20c0: 62 75 66 2c 20 42 55 46 46 45 52 5f 53 49 5a 45  buf, BUFFER_SIZE
20d0: 29 3b 0a 09 69 66 20 28 6c 65 6e 20 3e 20 30 29  );..if (len > 0)
20e0: 20 7b 0a 09 20 20 20 20 69 66 20 28 21 54 6c 73   {..    if (!Tls
20f0: 5f 44 69 67 65 73 74 55 70 64 61 74 65 28 73 74  _DigestUpdate(st
2100: 61 74 65 50 74 72 2c 20 26 62 75 66 5b 30 5d 2c  atePtr, &buf[0],
2110: 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 29 20   (size_t) len)) 
2120: 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  {...Tcl_AppendRe
2130: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 55 70  sult(interp, "Up
2140: 64 61 74 65 20 64 69 67 65 73 74 20 66 61 69 6c  date digest fail
2150: 65 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c  ed: ", REASON(),
2160: 20 4e 55 4c 4c 29 3b 0a 09 09 72 65 73 20 3d 20   NULL);...res = 
2170: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 67 6f 74  TCL_ERROR;...got
2180: 6f 20 64 6f 6e 65 3b 0a 09 20 20 20 20 7d 0a 09  o done;..    }..
2190: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
21a0: 46 69 6e 61 6c 69 7a 65 20 68 61 73 68 20 66 75  Finalize hash fu
21b0: 6e 63 74 69 6f 6e 20 61 6e 64 20 63 61 6c 63 75  nction and calcu
21c0: 6c 61 74 65 20 6d 65 73 73 61 67 65 20 64 69 67  late message dig
21d0: 65 73 74 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d  est */.    res =
21e0: 20 54 6c 73 5f 44 69 67 65 73 74 46 69 6e 69 61   Tls_DigestFinia
21f0: 6c 69 7a 65 28 69 6e 74 65 72 70 2c 20 73 74 61  lize(interp, sta
2200: 74 65 50 74 72 29 3b 0a 0a 64 6f 6e 65 3a 0a 20  tePtr);..done:. 
2210: 20 20 20 2f 2a 20 43 6c 6f 73 65 20 63 68 61 6e     /* Close chan
2220: 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 54  nel */.    if (T
2230: 63 6c 5f 43 6c 6f 73 65 28 69 6e 74 65 72 70 2c  cl_Close(interp,
2240: 20 63 68 61 6e 29 20 3d 3d 20 54 43 4c 5f 45 52   chan) == TCL_ER
2250: 52 4f 52 29 20 7b 0a 09 72 65 73 20 3d 20 54 43  ROR) {..res = TC
2260: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
2270: 20 20 20 20 2f 2a 20 43 6c 65 61 6e 2d 75 70 20      /* Clean-up 
2280: 2a 2f 0a 20 20 20 20 54 6c 73 5f 44 69 67 65 73  */.    Tls_Diges
2290: 74 46 72 65 65 28 73 74 61 74 65 50 74 72 29 3b  tFree(statePtr);
22a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b  .    return res;
22b0: 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}../***********
22c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22f0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a  ********/../*. *
2300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2340: 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74  ---. *. * Digest
2350: 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 2d 2d  BlockModeProc --
2360: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63  . *. *.This func
2370: 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20  tion is invoked 
2380: 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49  by the generic I
2390: 4f 20 6c 65 76 65 6c 0a 20 2a 20 20 20 20 20 20  O level. *      
23a0: 20 74 6f 20 73 65 74 20 62 6c 6f 63 6b 69 6e 67   to set blocking
23b0: 20 61 6e 64 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67   and nonblocking
23c0: 20 6d 6f 64 65 73 2e 0a 20 2a 0a 20 2a 20 52 65   modes.. *. * Re
23d0: 74 75 72 6e 73 3a 0a 20 2a 09 30 20 69 66 20 73  turns:. *.0 if s
23e0: 75 63 63 65 73 73 66 75 6c 20 6f 72 20 50 4f 53  uccessful or POS
23f0: 49 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  IX error code if
2400: 20 66 61 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53   failed.. *. * S
2410: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
2420: 53 65 74 73 20 74 68 65 20 64 65 76 69 63 65 20  Sets the device 
2430: 69 6e 74 6f 20 62 6c 6f 63 6b 69 6e 67 20 6f 72  into blocking or
2440: 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64   nonblocking mod
2450: 65 2e 0a 20 2a 09 43 61 6e 20 63 61 6c 6c 20 54  e.. *.Can call T
2460: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 45 72 72  cl_SetChannelErr
2470: 6f 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  or.. *. *-------
2480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
24c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 69 67 65  .static int Dige
24d0: 73 74 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 28  stBlockModeProc(
24e0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
24f0: 74 44 61 74 61 2c 20 69 6e 74 20 6d 6f 64 65 29  tData, int mode)
2500: 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74 61   {.    DigestSta
2510: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
2520: 44 69 67 65 73 74 53 74 61 74 65 20 2a 29 20 63  DigestState *) c
2530: 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20  lientData;..    
2540: 69 66 20 28 6d 6f 64 65 20 3d 3d 20 54 43 4c 5f  if (mode == TCL_
2550: 4d 4f 44 45 5f 4e 4f 4e 42 4c 4f 43 4b 49 4e 47  MODE_NONBLOCKING
2560: 29 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 66  ) {..statePtr->f
2570: 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f  lags |= TLS_TCL_
2580: 41 53 59 4e 43 3b 0a 20 20 20 20 7d 20 65 6c 73  ASYNC;.    } els
2590: 65 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 66  e {..statePtr->f
25a0: 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43  lags &= ~(TLS_TC
25b0: 4c 5f 41 53 59 4e 43 29 3b 0a 20 20 20 20 7d 0a  L_ASYNC);.    }.
25c0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a      return 0;.}.
25d0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
25e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
25f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
2620: 44 69 67 65 73 74 43 6c 6f 73 65 50 72 6f 63 20  DigestCloseProc 
2630: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75  --. *. *.This fu
2640: 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65  nction is invoke
2650: 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 63  d by the generic
2660: 20 49 4f 20 6c 65 76 65 6c 20 74 6f 20 70 65 72   IO level to per
2670: 66 6f 72 6d 0a 20 2a 09 63 68 61 6e 6e 65 6c 2d  form. *.channel-
2680: 74 79 70 65 2d 73 70 65 63 69 66 69 63 20 63 6c  type-specific cl
2690: 65 61 6e 75 70 20 77 68 65 6e 20 63 68 61 6e 6e  eanup when chann
26a0: 65 6c 20 69 73 20 63 6c 6f 73 65 64 2e 20 41 6c  el is closed. Al
26b0: 6c 0a 20 2a 09 71 75 65 75 65 64 20 6f 75 74 70  l. *.queued outp
26c0: 75 74 20 69 73 20 66 6c 75 73 68 65 64 20 70 72  ut is flushed pr
26d0: 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74  ior to calling t
26e0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a  his function.. *
26f0: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09  . * Returns:. *.
2700: 30 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20  0 if successful 
2710: 6f 72 20 50 4f 53 49 58 20 65 72 72 6f 72 20 63  or POSIX error c
2720: 6f 64 65 20 69 66 20 66 61 69 6c 65 64 2e 0a 20  ode if failed.. 
2730: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
2740: 73 3a 0a 20 2a 09 57 72 69 74 65 73 20 64 69 67  s:. *.Writes dig
2750: 65 73 74 20 74 6f 20 6f 75 74 70 75 74 20 61 6e  est to output an
2760: 64 20 63 6c 6f 73 65 73 20 74 68 65 20 63 68 61  d closes the cha
2770: 6e 6e 65 6c 2e 20 53 74 6f 72 65 73 20 65 72 72  nnel. Stores err
2780: 6f 72 0a 20 2a 09 6d 65 73 73 61 67 65 73 20 69  or. *.messages i
2790: 6e 20 69 6e 74 65 72 70 20 72 65 73 75 6c 74 20  n interp result 
27a0: 75 73 69 6e 67 20 54 63 6c 5f 47 65 74 43 68 61  using Tcl_GetCha
27b0: 6e 6e 65 6c 45 72 72 6f 72 49 6e 74 65 72 70 2e  nnelErrorInterp.
27c0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
27d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e  ---------. */.in
2810: 74 20 44 69 67 65 73 74 43 6c 6f 73 65 50 72 6f  t DigestClosePro
2820: 63 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  c(ClientData cli
2830: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  entData, Tcl_Int
2840: 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20  erp *interp) {. 
2850: 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a     DigestState *
2860: 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65  statePtr = (Dige
2870: 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e  stState *) clien
2880: 74 44 61 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 43  tData;..    /* C
2890: 61 6e 63 65 6c 20 61 63 74 69 76 65 20 74 69 6d  ancel active tim
28a0: 65 72 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20  er, if any */.  
28b0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
28c0: 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69  timer != (Tcl_Ti
28d0: 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20  merToken) NULL) 
28e0: 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d  {..Tcl_DeleteTim
28f0: 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50  erHandler(stateP
2900: 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61  tr->timer);..sta
2910: 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28  tePtr->timer = (
2920: 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20  Tcl_TimerToken) 
2930: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  NULL;.    }..   
2940: 20 2f 2a 20 43 6c 65 61 6e 2d 75 70 20 2a 2f 0a   /* Clean-up */.
2950: 20 20 20 20 54 6c 73 5f 44 69 67 65 73 74 46 72      Tls_DigestFr
2960: 65 65 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20  ee(statePtr);.  
2970: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2980: 2a 0a 20 2a 20 53 61 6d 65 20 61 73 20 44 69 67  *. * Same as Dig
2990: 65 73 74 43 6c 6f 73 65 50 72 6f 63 20 62 75 74  estCloseProc but
29a0: 20 77 69 74 68 20 69 6e 64 69 76 69 64 75 61 6c   with individual
29b0: 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   read and write 
29c0: 63 6c 6f 73 65 20 63 6f 6e 74 72 6f 6c 0a 20 2a  close control. *
29d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 69 67  /.static int Dig
29e0: 65 73 74 43 6c 6f 73 65 32 50 72 6f 63 28 43 6c  estClose2Proc(Cl
29f0: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63  ientData instanc
2a00: 65 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  eData, Tcl_Inter
2a10: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66  p *interp, int f
2a20: 6c 61 67 73 29 20 7b 0a 0a 20 20 20 20 69 66 20  lags) {..    if 
2a30: 28 28 66 6c 61 67 73 20 26 20 28 54 43 4c 5f 43  ((flags & (TCL_C
2a40: 4c 4f 53 45 5f 52 45 41 44 20 7c 20 54 43 4c 5f  LOSE_READ | TCL_
2a50: 43 4c 4f 53 45 5f 57 52 49 54 45 29 29 20 3d 3d  CLOSE_WRITE)) ==
2a60: 20 30 29 20 7b 0a 09 72 65 74 75 72 6e 20 44 69   0) {..return Di
2a70: 67 65 73 74 43 6c 6f 73 65 50 72 6f 63 28 69 6e  gestCloseProc(in
2a80: 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e 74 65  stanceData, inte
2a90: 72 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  rp);.    }.    r
2aa0: 65 74 75 72 6e 20 45 49 4e 56 41 4c 3b 0a 7d 0a  eturn EINVAL;.}.
2ab0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
2ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
2b00: 20 2a 20 44 69 67 65 73 74 49 6e 70 75 74 50 72   * DigestInputPr
2b10: 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c  oc --. *. *.Call
2b20: 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 69  ed by the generi
2b30: 63 20 49 4f 20 73 79 73 74 65 6d 20 74 6f 20 72  c IO system to r
2b40: 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 74 72  ead data from tr
2b50: 61 6e 73 66 6f 72 6d 20 61 6e 64 0a 20 2a 09 70  ansform and. *.p
2b60: 6c 61 63 65 20 69 6e 20 62 75 66 2e 0a 20 2a 0a  lace in buf.. *.
2b70: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54   * Returns:. *.T
2b80: 6f 74 61 6c 20 62 79 74 65 73 20 72 65 61 64 20  otal bytes read 
2b90: 6f 72 20 2d 31 20 66 6f 72 20 61 6e 20 65 72 72  or -1 for an err
2ba0: 6f 72 20 61 6c 6f 6e 67 20 77 69 74 68 20 61 20  or along with a 
2bb0: 50 4f 53 49 58 20 65 72 72 6f 72 0a 20 2a 09 63  POSIX error. *.c
2bc0: 6f 64 65 20 69 6e 20 65 72 72 6f 72 43 6f 64 65  ode in errorCode
2bd0: 50 74 72 2e 20 55 73 65 20 45 41 47 41 49 4e 20  Ptr. Use EAGAIN 
2be0: 66 6f 72 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20  for nonblocking 
2bf0: 61 6e 64 20 6e 6f 20 64 61 74 61 2e 0a 20 2a 0a  and no data.. *.
2c00: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
2c10: 0a 20 2a 09 52 65 61 64 20 64 61 74 61 20 66 72  . *.Read data fr
2c20: 6f 6d 20 74 72 61 6e 73 66 6f 72 6d 20 61 6e 64  om transform and
2c30: 20 77 72 69 74 65 20 74 6f 20 62 75 66 0a 20 2a   write to buf. *
2c40: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
2c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e  ---------. */.in
2c90: 74 20 44 69 67 65 73 74 49 6e 70 75 74 50 72 6f  t DigestInputPro
2ca0: 63 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  c(ClientData cli
2cb0: 65 6e 74 44 61 74 61 2c 20 63 68 61 72 20 2a 62  entData, char *b
2cc0: 75 66 2c 20 69 6e 74 20 74 6f 52 65 61 64 2c 20  uf, int toRead, 
2cd0: 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74  int *errorCodePt
2ce0: 72 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53  r) {.    DigestS
2cf0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
2d00: 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 29   (DigestState *)
2d10: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20   clientData;.   
2d20: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 70 61 72   Tcl_Channel par
2d30: 65 6e 74 3b 0a 20 20 20 20 69 6e 74 20 72 65 61  ent;.    int rea
2d40: 64 2c 20 72 65 73 20 3d 20 30 3b 0a 20 20 20 20  d, res = 0;.    
2d50: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
2d60: 30 3b 0a 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74  0;..    /* Abort
2d70: 20 69 66 20 6e 6f 74 68 69 6e 67 20 74 6f 20 70   if nothing to p
2d80: 72 6f 63 65 73 73 20 2a 2f 0a 20 20 20 20 69 66  rocess */.    if
2d90: 20 28 74 6f 52 65 61 64 20 3c 3d 20 30 20 7c 7c   (toRead <= 0 ||
2da0: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20   statePtr->self 
2db0: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29  == (Tcl_Channel)
2dc0: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
2dd0: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
2de0: 2a 20 47 65 74 20 62 79 74 65 73 20 66 72 6f 6d  * Get bytes from
2df0: 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 68 61 6e   underlying chan
2e00: 6e 65 6c 20 2a 2f 0a 20 20 20 20 70 61 72 65 6e  nel */.    paren
2e10: 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 63 6b  t = Tcl_GetStack
2e20: 65 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50  edChannel(stateP
2e30: 74 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 20 72  tr->self);.    r
2e40: 65 61 64 20 3d 20 54 63 6c 5f 52 65 61 64 52 61  ead = Tcl_ReadRa
2e50: 77 28 70 61 72 65 6e 74 2c 20 62 75 66 2c 20 74  w(parent, buf, t
2e60: 6f 52 65 61 64 29 3b 0a 0a 20 20 20 20 2f 2a 20  oRead);..    /* 
2e70: 55 70 64 61 74 65 20 68 61 73 68 20 66 75 6e 63  Update hash func
2e80: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28  tion */.    if (
2e90: 72 65 61 64 20 3e 20 30 29 20 7b 0a 09 69 66 20  read > 0) {..if 
2ea0: 28 21 54 6c 73 5f 44 69 67 65 73 74 55 70 64 61  (!Tls_DigestUpda
2eb0: 74 65 28 73 74 61 74 65 50 74 72 2c 20 62 75 66  te(statePtr, buf
2ec0: 2c 20 28 73 69 7a 65 5f 74 29 20 72 65 61 64 29  , (size_t) read)
2ed0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74  ) {..    Tcl_Set
2ee0: 43 68 61 6e 6e 65 6c 45 72 72 6f 72 28 73 74 61  ChannelError(sta
2ef0: 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 54 63 6c  tePtr->self, Tcl
2f00: 5f 4f 62 6a 50 72 69 6e 74 66 28 22 44 69 67 65  _ObjPrintf("Dige
2f10: 73 74 20 75 70 64 61 74 65 20 66 61 69 6c 65 64  st update failed
2f20: 3a 20 25 73 22 2c 20 52 45 41 53 4f 4e 28 29 29  : %s", REASON())
2f30: 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f  );..    *errorCo
2f40: 64 65 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a  dePtr = EINVAL;.
2f50: 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
2f60: 09 7d 0a 09 2f 2a 20 54 68 69 73 20 69 73 20 63  .}../* This is c
2f70: 6f 72 72 65 63 74 20 2a 2f 0a 09 72 65 61 64 20  orrect */..read 
2f80: 3d 20 2d 31 3b 0a 09 2a 65 72 72 6f 72 43 6f 64  = -1;..*errorCod
2f90: 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09  ePtr = EAGAIN;..
2fa0: 20 20 20 20 0a 20 20 20 20 7d 20 65 6c 73 65 20      .    } else 
2fb0: 69 66 20 28 72 65 61 64 20 3c 20 30 29 20 7b 0a  if (read < 0) {.
2fc0: 09 2f 2a 20 45 72 72 6f 72 20 2a 2f 0a 09 2a 65  ./* Error */..*e
2fd0: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 54 63  rrorCodePtr = Tc
2fe0: 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b 0a 0a 20  l_GetErrno();.. 
2ff0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 21 28     } else if (!(
3000: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20  statePtr->flags 
3010: 26 20 43 48 41 4e 5f 45 4f 46 29 29 20 7b 0a 09  & CHAN_EOF)) {..
3020: 2f 2a 20 45 4f 46 20 2a 2f 0a 09 75 6e 73 69 67  /* EOF */..unsig
3030: 6e 65 64 20 63 68 61 72 20 6d 64 5f 62 75 66 5b  ned char md_buf[
3040: 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45 5d  EVP_MAX_MD_SIZE]
3050: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  ;..unsigned int 
3060: 6d 64 5f 6c 65 6e 20 3d 20 30 3b 0a 0a 09 2f 2a  md_len = 0;.../*
3070: 20 46 69 6e 61 6c 69 7a 65 20 68 61 73 68 20 66   Finalize hash f
3080: 75 6e 63 74 69 6f 6e 20 61 6e 64 20 63 61 6c 63  unction and calc
3090: 75 6c 61 74 65 20 6d 65 73 73 61 67 65 20 64 69  ulate message di
30a0: 67 65 73 74 20 2a 2f 0a 09 69 66 20 28 73 74 61  gest */..if (sta
30b0: 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20  tePtr->format & 
30c0: 54 59 50 45 5f 4d 44 29 20 7b 0a 09 20 20 20 20  TYPE_MD) {..    
30d0: 72 65 73 20 3d 20 45 56 50 5f 44 69 67 65 73 74  res = EVP_Digest
30e0: 46 69 6e 61 6c 5f 65 78 28 73 74 61 74 65 50 74  Final_ex(statePt
30f0: 72 2d 3e 63 74 78 2c 20 6d 64 5f 62 75 66 2c 20  r->ctx, md_buf, 
3100: 26 6d 64 5f 6c 65 6e 29 3b 0a 09 7d 20 65 6c 73  &md_len);..} els
3110: 65 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e  e if (statePtr->
3120: 66 6f 72 6d 61 74 20 26 20 54 59 50 45 5f 48 4d  format & TYPE_HM
3130: 41 43 29 20 7b 0a 09 20 20 20 20 72 65 73 20 3d  AC) {..    res =
3140: 20 48 4d 41 43 5f 46 69 6e 61 6c 28 73 74 61 74   HMAC_Final(stat
3150: 65 50 74 72 2d 3e 68 63 74 78 2c 20 6d 64 5f 62  ePtr->hctx, md_b
3160: 75 66 2c 20 26 6d 64 5f 6c 65 6e 29 3b 0a 09 7d  uf, &md_len);..}
3170: 20 65 6c 73 65 20 69 66 20 28 73 74 61 74 65 50   else if (stateP
3180: 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20 54 59 50  tr->format & TYP
3190: 45 5f 43 4d 41 43 29 20 7b 0a 09 20 20 20 20 73  E_CMAC) {..    s
31a0: 69 7a 65 5f 74 20 6c 65 6e 3b 0a 09 20 20 20 20  ize_t len;..    
31b0: 72 65 73 20 3d 20 43 4d 41 43 5f 46 69 6e 61 6c  res = CMAC_Final
31c0: 28 73 74 61 74 65 50 74 72 2d 3e 63 63 74 78 2c  (statePtr->cctx,
31d0: 20 6d 64 5f 62 75 66 2c 20 26 6c 65 6e 29 3b 0a   md_buf, &len);.
31e0: 09 20 20 20 20 6d 64 5f 6c 65 6e 20 3d 20 28 75  .    md_len = (u
31f0: 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6c 65 6e  nsigned int) len
3200: 3b 0a 09 7d 0a 09 69 66 20 28 21 72 65 73 29 20  ;..}..if (!res) 
3210: 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 43 68  {..    Tcl_SetCh
3220: 61 6e 6e 65 6c 45 72 72 6f 72 28 73 74 61 74 65  annelError(state
3230: 50 74 72 2d 3e 73 65 6c 66 2c 20 54 63 6c 5f 4f  Ptr->self, Tcl_O
3240: 62 6a 50 72 69 6e 74 66 28 22 44 69 67 65 73 74  bjPrintf("Digest
3250: 20 66 69 6e 61 6c 69 7a 65 20 66 61 69 6c 65 64   finalize failed
3260: 3a 20 25 73 22 2c 20 52 45 41 53 4f 4e 28 29 29  : %s", REASON())
3270: 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f  );..    *errorCo
3280: 64 65 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a  dePtr = EINVAL;.
3290: 0a 09 2f 2a 20 57 72 69 74 65 20 6d 65 73 73 61  ../* Write messa
32a0: 67 65 20 64 69 67 65 73 74 20 74 6f 20 6f 75 74  ge digest to out
32b0: 70 75 74 20 63 68 61 6e 6e 65 6c 20 61 73 20 62  put channel as b
32c0: 79 74 65 20 61 72 72 61 79 20 6f 72 20 68 65 78  yte array or hex
32d0: 20 73 74 72 69 6e 67 20 2a 2f 0a 09 7d 20 65 6c   string */..} el
32e0: 73 65 20 69 66 20 28 6d 64 5f 6c 65 6e 20 3e 20  se if (md_len > 
32f0: 30 29 20 7b 0a 09 20 20 20 20 69 66 20 28 28 73  0) {..    if ((s
3300: 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20  tatePtr->format 
3310: 26 20 42 49 4e 5f 46 4f 52 4d 41 54 29 20 26 26  & BIN_FORMAT) &&
3320: 20 74 6f 52 65 61 64 20 3e 3d 20 28 69 6e 74 29   toRead >= (int)
3330: 20 6d 64 5f 6c 65 6e 29 20 7b 0a 09 09 72 65 61   md_len) {...rea
3340: 64 20 3d 20 6d 64 5f 6c 65 6e 3b 0a 09 09 6d 65  d = md_len;...me
3350: 6d 63 70 79 28 62 75 66 2c 20 6d 64 5f 62 75 66  mcpy(buf, md_buf
3360: 2c 20 72 65 61 64 29 3b 0a 0a 09 20 20 20 20 7d  , read);...    }
3370: 20 65 6c 73 65 20 69 66 28 28 73 74 61 74 65 50   else if((stateP
3380: 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20 48 45 58  tr->format & HEX
3390: 5f 46 4f 52 4d 41 54 29 20 26 26 20 74 6f 52 65  _FORMAT) && toRe
33a0: 61 64 20 3e 3d 20 28 69 6e 74 29 20 28 6d 64 5f  ad >= (int) (md_
33b0: 6c 65 6e 2a 32 29 29 20 7b 0a 09 09 75 6e 73 69  len*2)) {...unsi
33c0: 67 6e 65 64 20 63 68 61 72 20 68 65 78 5f 62 75  gned char hex_bu
33d0: 66 5b 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a  f[EVP_MAX_MD_SIZ
33e0: 45 2a 32 5d 3b 0a 09 09 75 6e 73 69 67 6e 65 64  E*2];...unsigned
33f0: 20 63 68 61 72 20 2a 70 74 72 20 3d 20 68 65 78   char *ptr = hex
3400: 5f 62 75 66 3b 0a 0a 09 09 66 6f 72 20 28 75 6e  _buf;....for (un
3410: 73 69 67 6e 65 64 20 69 6e 74 20 69 20 3d 20 30  signed int i = 0
3420: 3b 20 69 20 3c 20 6d 64 5f 6c 65 6e 3b 20 69 2b  ; i < md_len; i+
3430: 2b 29 20 7b 0a 09 09 20 20 20 20 2a 70 74 72 2b  +) {...    *ptr+
3440: 2b 20 3d 20 68 65 78 5b 28 6d 64 5f 62 75 66 5b  + = hex[(md_buf[
3450: 69 5d 20 3e 3e 20 34 29 20 26 20 30 78 30 46 5d  i] >> 4) & 0x0F]
3460: 3b 0a 09 09 20 20 20 20 2a 70 74 72 2b 2b 20 3d  ;...    *ptr++ =
3470: 20 68 65 78 5b 6d 64 5f 62 75 66 5b 69 5d 20 26   hex[md_buf[i] &
3480: 20 30 78 30 46 5d 3b 0a 09 09 7d 0a 09 09 72 65   0x0F];...}...re
3490: 61 64 20 3d 20 6d 64 5f 6c 65 6e 2a 32 3b 0a 09  ad = md_len*2;..
34a0: 09 6d 65 6d 63 70 79 28 62 75 66 2c 20 68 65 78  .memcpy(buf, hex
34b0: 5f 62 75 66 2c 20 72 65 61 64 29 3b 0a 09 20 20  _buf, read);..  
34c0: 20 20 7d 0a 09 7d 0a 09 73 74 61 74 65 50 74 72    }..}..statePtr
34d0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 48 41 4e 5f  ->flags |= CHAN_
34e0: 45 4f 46 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  EOF;.    }.    r
34f0: 65 74 75 72 6e 20 72 65 61 64 3b 0a 7d 0a 0a 2f  eturn read;.}../
3500: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
3510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
3550: 20 44 69 67 65 73 74 4f 75 74 70 75 74 50 72 6f   DigestOutputPro
3560: 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65  c --. *. *.Calle
3570: 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 63  d by the generic
3580: 20 49 4f 20 73 79 73 74 65 6d 20 74 6f 20 77 72   IO system to wr
3590: 69 74 65 20 64 61 74 61 20 69 6e 20 62 75 66 20  ite data in buf 
35a0: 74 6f 20 74 72 61 6e 73 66 6f 72 6d 2e 0a 20 2a  to transform.. *
35b0: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09  . * Returns:. *.
35c0: 54 6f 74 61 6c 20 62 79 74 65 73 20 77 72 69 74  Total bytes writ
35d0: 74 65 6e 20 6f 72 20 2d 31 20 66 6f 72 20 61 6e  ten or -1 for an
35e0: 20 65 72 72 6f 72 20 61 6c 6f 6e 67 20 77 69 74   error along wit
35f0: 68 20 61 20 50 4f 53 49 58 20 65 72 72 6f 72 0a  h a POSIX error.
3600: 20 2a 09 63 6f 64 65 20 69 6e 20 65 72 72 6f 72   *.code in error
3610: 43 6f 64 65 50 74 72 2e 20 55 73 65 20 45 41 47  CodePtr. Use EAG
3620: 41 49 4e 20 66 6f 72 20 6e 6f 6e 62 6c 6f 63 6b  AIN for nonblock
3630: 69 6e 67 20 61 6e 64 20 63 61 6e 27 74 20 77 72  ing and can't wr
3640: 69 74 65 20 64 61 74 61 2e 0a 20 2a 0a 20 2a 20  ite data.. *. * 
3650: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
3660: 09 47 65 74 20 64 61 74 61 20 66 72 6f 6d 20 62  .Get data from b
3670: 75 66 20 61 6e 64 20 75 70 64 61 74 65 20 64 69  uf and update di
3680: 67 65 73 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  gest. *. *------
3690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36d0: 0a 20 2a 2f 0a 20 69 6e 74 20 44 69 67 65 73 74  . */. int Digest
36e0: 4f 75 74 70 75 74 50 72 6f 63 28 43 6c 69 65 6e  OutputProc(Clien
36f0: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
3700: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 62 75  , const char *bu
3710: 66 2c 20 69 6e 74 20 74 6f 57 72 69 74 65 2c 20  f, int toWrite, 
3720: 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74  int *errorCodePt
3730: 72 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53  r) {.    DigestS
3740: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
3750: 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 29   (DigestState *)
3760: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20   clientData;.   
3770: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d   *errorCodePtr =
3780: 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 41 62 6f 72   0;..    /* Abor
3790: 74 20 69 66 20 6e 6f 74 68 69 6e 67 20 74 6f 20  t if nothing to 
37a0: 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 20 20 69  process */.    i
37b0: 66 20 28 74 6f 57 72 69 74 65 20 3c 3d 20 30 20  f (toWrite <= 0 
37c0: 7c 7c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  || statePtr->sel
37d0: 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65  f == (Tcl_Channe
37e0: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  l) NULL) {..retu
37f0: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 0;.    }..   
3800: 20 2f 2a 20 55 70 64 61 74 65 20 68 61 73 68 20   /* Update hash 
3810: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  function */.    
3820: 69 66 20 28 74 6f 57 72 69 74 65 20 3e 20 30 20  if (toWrite > 0 
3830: 26 26 20 21 54 6c 73 5f 44 69 67 65 73 74 55 70  && !Tls_DigestUp
3840: 64 61 74 65 28 73 74 61 74 65 50 74 72 2c 20 62  date(statePtr, b
3850: 75 66 2c 20 28 73 69 7a 65 5f 74 29 20 74 6f 57  uf, (size_t) toW
3860: 72 69 74 65 29 29 20 7b 0a 09 54 63 6c 5f 53 65  rite)) {..Tcl_Se
3870: 74 43 68 61 6e 6e 65 6c 45 72 72 6f 72 28 73 74  tChannelError(st
3880: 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 54 63  atePtr->self, Tc
3890: 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 22 44 69 67  l_ObjPrintf("Dig
38a0: 65 73 74 20 75 70 64 61 74 65 20 66 61 69 6c 65  est update faile
38b0: 64 3a 20 25 73 22 2c 20 52 45 41 53 4f 4e 28 29  d: %s", REASON()
38c0: 29 29 3b 0a 09 2a 65 72 72 6f 72 43 6f 64 65 50  ));..*errorCodeP
38d0: 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 09 72 65  tr = EINVAL;..re
38e0: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
38f0: 20 20 20 72 65 74 75 72 6e 20 74 6f 57 72 69 74     return toWrit
3900: 65 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  e;.}../*. *-----
3910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3950: 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 53 65  -. *. * DigestSe
3960: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20  tOptionProc --. 
3970: 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79 20 74  *. *.Called by t
3980: 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 73 79  he generic IO sy
3990: 73 74 65 6d 20 74 6f 20 73 65 74 20 63 68 61 6e  stem to set chan
39a0: 6e 65 6c 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 20  nel option name 
39b0: 74 6f 20 76 61 6c 75 65 2e 0a 20 2a 0a 20 2a 20  to value.. *. * 
39c0: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f  Returns:. *.TCL_
39d0: 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
39e0: 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 20 69 66   or TCL_ERROR if
39f0: 20 66 61 69 6c 65 64 20 61 6c 6f 6e 67 20 77 69   failed along wi
3a00: 74 68 20 61 6e 20 65 72 72 6f 72 0a 20 2a 09 6d  th an error. *.m
3a10: 65 73 73 61 67 65 20 69 6e 20 69 6e 74 65 72 70  essage in interp
3a20: 20 61 6e 64 20 54 63 6c 5f 53 65 74 45 72 72 6e   and Tcl_SetErrn
3a30: 6f 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  o.. *. * Side ef
3a40: 66 65 63 74 73 3a 0a 20 2a 09 55 70 64 61 74 65  fects:. *.Update
3a50: 73 20 63 68 61 6e 6e 65 6c 20 6f 70 74 69 6f 6e  s channel option
3a60: 20 74 6f 20 6e 65 77 20 76 61 6c 75 65 2e 0a 20   to new value.. 
3a70: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
3a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
3ac0: 74 61 74 69 63 20 69 6e 74 20 44 69 67 65 73 74  tatic int Digest
3ad0: 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 43 6c  SetOptionProc(Cl
3ae0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
3af0: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
3b00: 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74 20 63  *interp, const c
3b10: 68 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c  har *optionName,
3b20: 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70  ..const char *op
3b30: 74 69 6f 6e 56 61 6c 75 65 29 20 7b 0a 20 20 20  tionValue) {.   
3b40: 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74   DigestState *st
3b50: 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 74  atePtr = (Digest
3b60: 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44  State *) clientD
3b70: 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61  ata;.    Tcl_Cha
3b80: 6e 6e 65 6c 20 70 61 72 65 6e 74 3b 0a 20 20 20  nnel parent;.   
3b90: 20 54 63 6c 5f 44 72 69 76 65 72 53 65 74 4f 70   Tcl_DriverSetOp
3ba0: 74 69 6f 6e 50 72 6f 63 20 2a 73 65 74 4f 70 74  tionProc *setOpt
3bb0: 69 6f 6e 50 72 6f 63 3b 0a 0a 20 20 20 20 2f 2a  ionProc;..    /*
3bc0: 20 41 62 6f 72 74 20 69 66 20 6e 6f 20 63 68 61   Abort if no cha
3bd0: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28  nnel */.    if (
3be0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d  statePtr->self =
3bf0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
3c00: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
3c10: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
3c20: 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 67 61 74  ..    /* Delegat
3c30: 65 20 6f 70 74 69 6f 6e 73 20 64 6f 77 6e 73 74  e options downst
3c40: 72 65 61 6d 20 2a 2f 0a 20 20 20 20 70 61 72 65  ream */.    pare
3c50: 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 63  nt = Tcl_GetStac
3c60: 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 65  kedChannel(state
3c70: 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 20  Ptr->self);.    
3c80: 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 3d 20  setOptionProc = 
3c90: 54 63 6c 5f 43 68 61 6e 6e 65 6c 53 65 74 4f 70  Tcl_ChannelSetOp
3ca0: 74 69 6f 6e 50 72 6f 63 28 54 63 6c 5f 47 65 74  tionProc(Tcl_Get
3cb0: 43 68 61 6e 6e 65 6c 54 79 70 65 28 70 61 72 65  ChannelType(pare
3cc0: 6e 74 29 29 3b 0a 20 20 20 20 69 66 20 28 73 65  nt));.    if (se
3cd0: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 21 3d 20 4e  tOptionProc != N
3ce0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 28  ULL) {..return (
3cf0: 2a 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 29 28  *setOptionProc)(
3d00: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e  Tcl_GetChannelIn
3d10: 73 74 61 6e 63 65 44 61 74 61 28 70 61 72 65 6e  stanceData(paren
3d20: 74 29 2c 20 69 6e 74 65 72 70 2c 20 6f 70 74 69  t), interp, opti
3d30: 6f 6e 4e 61 6d 65 2c 20 6f 70 74 69 6f 6e 56 61  onName, optionVa
3d40: 6c 75 65 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  lue);.    } else
3d50: 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f   {..Tcl_SetErrno
3d60: 28 45 49 4e 56 41 4c 29 3b 0a 09 72 65 74 75 72  (EINVAL);..retur
3d70: 6e 20 54 63 6c 5f 42 61 64 43 68 61 6e 6e 65 6c  n Tcl_BadChannel
3d80: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f  Option(interp, o
3d90: 70 74 69 6f 6e 4e 61 6d 65 2c 20 4e 55 4c 4c 29  ptionName, NULL)
3da0: 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a  ;.    }.}../*. *
3db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3df0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67  ------. *. * Dig
3e00: 65 73 74 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63  estGetOptionProc
3e10: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64   --. *. *.Called
3e20: 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20   by the generic 
3e30: 49 4f 20 73 79 73 74 65 6d 20 74 6f 20 67 65 74  IO system to get
3e40: 20 63 68 61 6e 6e 65 6c 20 6f 70 74 69 6f 6e 20   channel option 
3e50: 6e 61 6d 65 27 73 20 76 61 6c 75 65 2e 0a 20 2a  name's value.. *
3e60: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09  . * Returns:. *.
3e70: 54 43 4c 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  TCL_OK if succes
3e80: 73 66 75 6c 20 6f 72 20 54 43 4c 5f 45 52 52 4f  sful or TCL_ERRO
3e90: 52 20 69 66 20 66 61 69 6c 65 64 20 61 6c 6f 6e  R if failed alon
3ea0: 67 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 0a  g with an error.
3eb0: 20 2a 09 6d 65 73 73 61 67 65 20 69 6e 20 69 6e   *.message in in
3ec0: 74 65 72 70 20 61 6e 64 20 54 63 6c 5f 53 65 74  terp and Tcl_Set
3ed0: 45 72 72 6e 6f 2e 0a 20 2a 0a 20 2a 20 53 69 64  Errno.. *. * Sid
3ee0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65  e effects:. *.Se
3ef0: 74 73 20 72 65 73 75 6c 74 20 74 6f 20 6f 70 74  ts result to opt
3f00: 69 6f 6e 27 73 20 76 61 6c 75 65 0a 20 2a 0a 20  ion's value. *. 
3f10: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
3f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f50: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
3f60: 69 63 20 69 6e 74 20 44 69 67 65 73 74 47 65 74  ic int DigestGet
3f70: 4f 70 74 69 6f 6e 50 72 6f 63 28 43 6c 69 65 6e  OptionProc(Clien
3f80: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
3f90: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
3fa0: 74 65 72 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  terp, const char
3fb0: 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c 0a 09 54   *optionName,..T
3fc0: 63 6c 5f 44 53 74 72 69 6e 67 20 2a 6f 70 74 69  cl_DString *opti
3fd0: 6f 6e 56 61 6c 75 65 29 20 7b 0a 20 20 20 20 44  onValue) {.    D
3fe0: 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74  igestState *stat
3ff0: 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74  ePtr = (DigestSt
4000: 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74  ate *) clientDat
4010: 61 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e  a;.    Tcl_Chann
4020: 65 6c 20 70 61 72 65 6e 74 3b 0a 20 20 20 20 54  el parent;.    T
4030: 63 6c 5f 44 72 69 76 65 72 47 65 74 4f 70 74 69  cl_DriverGetOpti
4040: 6f 6e 50 72 6f 63 20 2a 67 65 74 4f 70 74 69 6f  onProc *getOptio
4050: 6e 50 72 6f 63 3b 0a 0a 20 20 20 20 2f 2a 20 41  nProc;..    /* A
4060: 62 6f 72 74 20 69 66 20 6e 6f 20 63 68 61 6e 6e  bort if no chann
4070: 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74  el */.    if (st
4080: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20  atePtr->self == 
4090: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
40a0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  LL) {..return TC
40b0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
40c0: 20 20 20 20 2f 2a 20 44 65 6c 65 67 61 74 65 20      /* Delegate 
40d0: 6f 70 74 69 6f 6e 73 20 64 6f 77 6e 73 74 72 65  options downstre
40e0: 61 6d 20 2a 2f 0a 20 20 20 20 70 61 72 65 6e 74  am */.    parent
40f0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 63 6b 65   = Tcl_GetStacke
4100: 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74  dChannel(statePt
4110: 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 20 67 65  r->self);.    ge
4120: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 3d 20 54 63  tOptionProc = Tc
4130: 6c 5f 43 68 61 6e 6e 65 6c 47 65 74 4f 70 74 69  l_ChannelGetOpti
4140: 6f 6e 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 68  onProc(Tcl_GetCh
4150: 61 6e 6e 65 6c 54 79 70 65 28 70 61 72 65 6e 74  annelType(parent
4160: 29 29 3b 0a 20 20 20 20 69 66 20 28 67 65 74 4f  ));.    if (getO
4170: 70 74 69 6f 6e 50 72 6f 63 20 21 3d 20 4e 55 4c  ptionProc != NUL
4180: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 28 2a 67  L) {..return (*g
4190: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 29 28 54 63  etOptionProc)(Tc
41a0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74  l_GetChannelInst
41b0: 61 6e 63 65 44 61 74 61 28 70 61 72 65 6e 74 29  anceData(parent)
41c0: 2c 20 69 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e  , interp, option
41d0: 4e 61 6d 65 2c 20 6f 70 74 69 6f 6e 56 61 6c 75  Name, optionValu
41e0: 65 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  e);.    } else i
41f0: 66 20 28 6f 70 74 69 6f 6e 4e 61 6d 65 20 3d 3d  f (optionName ==
4200: 20 28 63 68 61 72 2a 29 20 4e 55 4c 4c 29 20 7b   (char*) NULL) {
4210: 0a 09 2f 2a 20 52 65 71 75 65 73 74 20 69 73 20  ../* Request is 
4220: 71 75 65 72 79 20 66 6f 72 20 61 6c 6c 20 6f 70  query for all op
4230: 74 69 6f 6e 73 2c 20 74 68 69 73 20 69 73 20 6f  tions, this is o
4240: 6b 2e 20 2a 2f 0a 09 72 65 74 75 72 6e 20 54 43  k. */..return TC
4250: 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  L_OK;.    } else
4260: 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f   {..Tcl_SetErrno
4270: 28 45 49 4e 56 41 4c 29 3b 0a 09 72 65 74 75 72  (EINVAL);..retur
4280: 6e 20 54 63 6c 5f 42 61 64 43 68 61 6e 6e 65 6c  n Tcl_BadChannel
4290: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f  Option(interp, o
42a0: 70 74 69 6f 6e 4e 61 6d 65 2c 20 4e 55 4c 4c 29  ptionName, NULL)
42b0: 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a  ;.    }.}../*. *
42c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4300: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67  ------. *. * Dig
4310: 65 73 74 54 69 6d 65 72 48 61 6e 64 6c 65 72 20  estTimerHandler 
4320: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20  --. *. *.Called 
4330: 62 79 20 74 68 65 20 6e 6f 74 69 66 69 65 72 20  by the notifier 
4340: 76 69 61 20 74 69 6d 65 72 20 74 6f 20 66 6c 75  via timer to flu
4350: 73 68 20 6f 75 74 20 70 65 6e 64 69 6e 67 20 69  sh out pending i
4360: 6e 70 75 74 20 64 61 74 61 2e 0a 20 2a 0a 20 2a  nput data.. *. *
4370: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 4e 6f 74   Returns:. *.Not
4380: 68 69 6e 67 0a 20 2a 0a 20 2a 20 53 69 64 65 20  hing. *. * Side 
4390: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20  effects:. *.May 
43a0: 63 61 6c 6c 20 54 63 6c 5f 4e 6f 74 69 66 79 43  call Tcl_NotifyC
43b0: 68 61 6e 6e 65 6c 0a 20 2a 0a 20 2a 2d 2d 2d 2d  hannel. *. *----
43c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4400: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  --. */.static vo
4410: 69 64 20 44 69 67 65 73 74 54 69 6d 65 72 48 61  id DigestTimerHa
4420: 6e 64 6c 65 72 28 43 6c 69 65 6e 74 44 61 74 61  ndler(ClientData
4430: 20 63 6c 69 65 6e 74 44 61 74 61 29 20 7b 0a 20   clientData) {. 
4440: 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a     DigestState *
4450: 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65  statePtr = (Dige
4460: 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e  stState *) clien
4470: 74 44 61 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 41  tData;..    /* A
4480: 62 6f 72 74 20 69 66 20 6e 6f 20 63 68 61 6e 6e  bort if no chann
4490: 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74  el */.    if (st
44a0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20  atePtr->self == 
44b0: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
44c0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 3b 0a 20  LL) {..return;. 
44d0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 65     }..    /* Cle
44e0: 61 72 20 74 69 6d 65 72 20 74 6f 6b 65 6e 20 2a  ar timer token *
44f0: 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  /.    statePtr->
4500: 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d  timer = (Tcl_Tim
4510: 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 0a  erToken) NULL;..
4520: 20 20 20 20 2f 2a 20 46 69 72 65 20 65 76 65 6e      /* Fire even
4530: 74 20 69 66 20 74 68 65 72 65 20 69 73 20 70 65  t if there is pe
4540: 6e 64 69 6e 67 20 64 61 74 61 2c 20 73 6b 69 70  nding data, skip
4550: 20 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20   otherwise */.  
4560: 20 20 69 66 20 28 28 73 74 61 74 65 50 74 72 2d    if ((statePtr-
4570: 3e 77 61 74 63 68 4d 61 73 6b 20 26 20 54 43 4c  >watchMask & TCL
4580: 5f 52 45 41 44 41 42 4c 45 29 20 26 26 20 28 54  _READABLE) && (T
4590: 63 6c 5f 49 6e 70 75 74 42 75 66 66 65 72 65 64  cl_InputBuffered
45a0: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
45b0: 20 3e 20 30 29 29 20 7b 0a 09 54 63 6c 5f 4e 6f   > 0)) {..Tcl_No
45c0: 74 69 66 79 43 68 61 6e 6e 65 6c 28 73 74 61 74  tifyChannel(stat
45d0: 65 50 74 72 2d 3e 73 65 6c 66 2c 20 54 43 4c 5f  ePtr->self, TCL_
45e0: 52 45 41 44 41 42 4c 45 29 3b 0a 20 20 20 20 7d  READABLE);.    }
45f0: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
4600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
4640: 20 2a 0a 20 2a 20 44 69 67 65 73 74 57 61 74 63   *. * DigestWatc
4650: 68 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 49  hProc --. *. *.I
4660: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 6f  nitialize the no
4670: 74 69 66 69 65 72 20 74 6f 20 77 61 74 63 68 20  tifier to watch 
4680: 66 6f 72 20 65 76 65 6e 74 73 20 66 72 6f 6d 20  for events from 
4690: 74 68 69 73 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a  this channel.. *
46a0: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09  . * Returns:. *.
46b0: 4e 6f 74 68 69 6e 67 20 28 63 61 6e 27 74 20 72  Nothing (can't r
46c0: 65 74 75 72 6e 20 65 72 72 6f 72 20 6d 65 73 73  eturn error mess
46d0: 61 67 65 73 29 0a 20 2a 0a 20 2a 20 53 69 64 65  ages). *. * Side
46e0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 6f 6e   effects:. *.Con
46f0: 66 69 67 75 72 65 20 6e 6f 74 69 66 69 65 72 20  figure notifier 
4700: 73 6f 20 66 75 74 75 72 65 20 65 76 65 6e 74 73  so future events
4710: 20 6f 6e 20 74 68 65 20 63 68 61 6e 6e 65 6c 20   on the channel 
4720: 77 69 6c 6c 20 62 65 20 73 65 65 6e 20 62 79 20  will be seen by 
4730: 54 63 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  Tcl.. *. *------
4740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4780: 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52 45 41  . */.#define REA
4790: 44 5f 44 45 4c 41 59 09 35 0a 76 6f 69 64 20 44  D_DELAY.5.void D
47a0: 69 67 65 73 74 57 61 74 63 68 50 72 6f 63 28 43  igestWatchProc(C
47b0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
47c0: 44 61 74 61 2c 20 69 6e 74 20 6d 61 73 6b 29 20  Data, int mask) 
47d0: 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74  {.    DigestStat
47e0: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44  e *statePtr = (D
47f0: 69 67 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c  igestState *) cl
4800: 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 54 63  ientData;.    Tc
4810: 6c 5f 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74  l_Channel parent
4820: 3b 0a 20 20 20 20 54 63 6c 5f 44 72 69 76 65 72  ;.    Tcl_Driver
4830: 57 61 74 63 68 50 72 6f 63 20 2a 77 61 74 63 68  WatchProc *watch
4840: 50 72 6f 63 3b 0a 0a 20 20 20 20 2f 2a 20 41 62  Proc;..    /* Ab
4850: 6f 72 74 20 69 66 20 6e 6f 20 63 68 61 6e 6e 65  ort if no channe
4860: 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61  l */.    if (sta
4870: 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28  tePtr->self == (
4880: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
4890: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 3b 0a 20 20  L) {..return;.  
48a0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72    }..    /* Stor
48b0: 65 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74  e OR-ed combinat
48c0: 69 6f 6e 20 6f 66 20 54 43 4c 5f 52 45 41 44 41  ion of TCL_READA
48d0: 42 4c 45 2c 20 54 43 4c 5f 57 52 49 54 41 42 4c  BLE, TCL_WRITABL
48e0: 45 20 61 6e 64 20 54 43 4c 5f 45 58 43 45 50 54  E and TCL_EXCEPT
48f0: 49 4f 4e 20 2a 2f 0a 20 20 20 20 73 74 61 74 65  ION */.    state
4900: 50 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b 20 3d  Ptr->watchMask =
4910: 20 6d 61 73 6b 3b 0a 0a 20 20 20 20 2f 2a 20 50   mask;..    /* P
4920: 72 6f 70 61 67 61 74 65 20 6d 61 73 6b 20 69 6e  ropagate mask in
4930: 66 6f 20 74 6f 20 70 61 72 65 6e 74 20 63 68 61  fo to parent cha
4940: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 70 61 72 65  nnel */.    pare
4950: 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 63  nt = Tcl_GetStac
4960: 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 65  kedChannel(state
4970: 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 20  Ptr->self);.    
4980: 77 61 74 63 68 50 72 6f 63 20 3d 20 54 63 6c 5f  watchProc = Tcl_
4990: 43 68 61 6e 6e 65 6c 57 61 74 63 68 50 72 6f 63  ChannelWatchProc
49a0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54  (Tcl_GetChannelT
49b0: 79 70 65 28 70 61 72 65 6e 74 29 29 3b 0a 20 20  ype(parent));.  
49c0: 20 20 77 61 74 63 68 50 72 6f 63 28 54 63 6c 5f    watchProc(Tcl_
49d0: 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e  GetChannelInstan
49e0: 63 65 44 61 74 61 28 70 61 72 65 6e 74 29 2c 20  ceData(parent), 
49f0: 6d 61 73 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 52  mask);..    /* R
4a00: 65 6d 6f 76 65 20 70 65 6e 64 69 6e 67 20 74 69  emove pending ti
4a10: 6d 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 28 73  mer */.    if (s
4a20: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21  tatePtr->timer !
4a30: 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65  = (Tcl_TimerToke
4a40: 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f  n) NULL) {..Tcl_
4a50: 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c  DeleteTimerHandl
4a60: 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d  er(statePtr->tim
4a70: 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  er);..statePtr->
4a80: 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d  timer = (Tcl_Tim
4a90: 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 20  erToken) NULL;. 
4aa0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
4ab0: 74 68 65 72 65 20 69 73 20 64 61 74 61 20 70 65  there is data pe
4ac0: 6e 64 69 6e 67 2c 20 73 65 74 20 6e 65 77 20 74  nding, set new t
4ad0: 69 6d 65 72 20 74 6f 20 63 61 6c 6c 20 54 63 6c  imer to call Tcl
4ae0: 5f 4e 6f 74 69 66 79 43 68 61 6e 6e 65 6c 20 2a  _NotifyChannel *
4af0: 2f 0a 20 20 20 20 69 66 20 28 28 6d 61 73 6b 20  /.    if ((mask 
4b00: 26 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 29 20  & TCL_READABLE) 
4b10: 26 26 20 28 54 63 6c 5f 49 6e 70 75 74 42 75 66  && (Tcl_InputBuf
4b20: 66 65 72 65 64 28 73 74 61 74 65 50 74 72 2d 3e  fered(statePtr->
4b30: 73 65 6c 66 29 20 3e 20 30 29 29 20 7b 0a 09 73  self) > 0)) {..s
4b40: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d  tatePtr->timer =
4b50: 20 54 63 6c 5f 43 72 65 61 74 65 54 69 6d 65 72   Tcl_CreateTimer
4b60: 48 61 6e 64 6c 65 72 28 52 45 41 44 5f 44 45 4c  Handler(READ_DEL
4b70: 41 59 2c 20 44 69 67 65 73 74 54 69 6d 65 72 48  AY, DigestTimerH
4b80: 61 6e 64 6c 65 72 2c 20 28 43 6c 69 65 6e 74 44  andler, (ClientD
4b90: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a  ata) statePtr);.
4ba0: 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d      }.}../*. *--
4bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4bf0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73  ----. *. * Diges
4c00: 74 47 65 74 48 61 6e 64 6c 65 50 72 6f 63 20 2d  tGetHandleProc -
4c10: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 66  -. *. *.Called f
4c20: 72 6f 6d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  rom Tcl_GetChann
4c30: 65 6c 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 72  elHandle to retr
4c40: 69 65 76 65 20 4f 53 20 73 70 65 63 69 66 69 63  ieve OS specific
4c50: 20 66 69 6c 65 20 68 61 6e 64 6c 65 0a 20 2a 09   file handle. *.
4c60: 66 72 6f 6d 20 69 6e 73 69 64 65 20 74 68 69 73  from inside this
4c70: 20 63 68 61 6e 6e 65 6c 2e 20 4e 6f 74 20 75 73   channel. Not us
4c80: 65 64 20 66 6f 72 20 74 72 61 6e 73 66 6f 72 6d  ed for transform
4c90: 61 74 69 6f 6e 73 3f 0a 20 2a 0a 20 2a 20 52 65  ations?. *. * Re
4ca0: 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b  turns:. *.TCL_OK
4cb0: 20 66 6f 72 20 73 75 63 63 65 73 73 20 6f 72 20   for success or 
4cc0: 54 43 4c 5f 45 52 52 4f 52 20 66 6f 72 20 65 72  TCL_ERROR for er
4cd0: 72 6f 72 20 6f 72 20 69 66 20 6e 6f 74 20 73 75  ror or if not su
4ce0: 70 70 6f 72 74 65 64 2e 20 49 66 0a 20 2a 09 64  pported. If. *.d
4cf0: 69 72 65 63 74 69 6f 6e 20 69 73 20 54 43 4c 5f  irection is TCL_
4d00: 52 45 41 44 41 42 4c 45 2c 20 73 65 74 73 20 68  READABLE, sets h
4d10: 61 6e 64 6c 65 50 74 72 20 74 6f 20 74 68 65 20  andlePtr to the 
4d20: 68 61 6e 64 6c 65 20 75 73 65 64 20 66 6f 72 0a  handle used for.
4d30: 20 2a 09 69 6e 70 75 74 2c 20 6f 72 20 69 66 20   *.input, or if 
4d40: 54 43 4c 5f 57 52 49 54 41 42 4c 45 20 73 65 74  TCL_WRITABLE set
4d50: 73 20 74 6f 20 74 68 65 20 68 61 6e 64 6c 65 20  s to the handle 
4d60: 75 73 65 64 20 66 6f 72 20 6f 75 74 70 75 74 2e  used for output.
4d70: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
4d80: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a  cts:. *.None. *.
4d90: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
4da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4dd0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74  --------. */.int
4de0: 20 44 69 67 65 73 74 47 65 74 48 61 6e 64 6c 65   DigestGetHandle
4df0: 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20  Proc(ClientData 
4e00: 63 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e 74 20  clientData, int 
4e10: 64 69 72 65 63 74 69 6f 6e 2c 20 43 6c 69 65 6e  direction, Clien
4e20: 74 44 61 74 61 20 2a 68 61 6e 64 6c 65 50 74 72  tData *handlePtr
4e30: 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74  ) {.    DigestSt
4e40: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
4e50: 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 29 20  (DigestState *) 
4e60: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20  clientData;.    
4e70: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 70 61 72 65  Tcl_Channel pare
4e80: 6e 74 3b 0a 0a 20 20 20 20 2f 2a 20 41 62 6f 72  nt;..    /* Abor
4e90: 74 20 69 66 20 6e 6f 20 63 68 61 6e 6e 65 6c 20  t if no channel 
4ea0: 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  */.    if (state
4eb0: 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63  Ptr->self == (Tc
4ec0: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29  l_Channel) NULL)
4ed0: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
4ee0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
4ef0: 20 70 61 72 65 6e 74 20 3d 20 54 63 6c 5f 47 65   parent = Tcl_Ge
4f00: 74 53 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28  tStackedChannel(
4f10: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b  statePtr->self);
4f20: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f  .    return Tcl_
4f30: 47 65 74 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65  GetChannelHandle
4f40: 28 70 61 72 65 6e 74 2c 20 64 69 72 65 63 74 69  (parent, directi
4f50: 6f 6e 2c 20 68 61 6e 64 6c 65 50 74 72 29 3b 0a  on, handlePtr);.
4f60: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
4f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
4fb0: 2a 0a 20 2a 20 44 69 67 65 73 74 4e 6f 74 69 66  *. * DigestNotif
4fc0: 79 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43  yProc --. *. *.C
4fd0: 61 6c 6c 65 64 20 62 79 20 54 63 6c 20 74 6f 20  alled by Tcl to 
4fe0: 69 6e 66 6f 72 6d 20 75 73 20 6f 66 20 61 63 74  inform us of act
4ff0: 69 76 69 74 79 20 6f 6e 20 74 68 65 20 75 6e 64  ivity on the und
5000: 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 2e  erlying channel.
5010: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a  . *. * Returns:.
5020: 20 2a 09 55 6e 63 68 61 6e 67 65 64 20 69 6e 74   *.Unchanged int
5030: 65 72 65 73 74 4d 61 73 6b 20 77 68 69 63 68 20  erestMask which 
5040: 69 73 20 61 6e 20 4f 52 2d 65 64 20 63 6f 6d 62  is an OR-ed comb
5050: 69 6e 61 74 69 6f 6e 20 6f 66 20 54 43 4c 5f 52  ination of TCL_R
5060: 45 41 44 41 42 4c 45 20 6f 72 20 54 43 4c 5f 57  EADABLE or TCL_W
5070: 52 49 54 41 42 4c 45 0a 20 2a 0a 20 2a 20 53 69  RITABLE. *. * Si
5080: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
5090: 61 6e 63 65 6c 73 20 61 6e 79 20 70 65 6e 64 69  ancels any pendi
50a0: 6e 67 20 74 69 6d 65 72 2e 0a 20 2a 0a 20 2a 2d  ng timer.. *. *-
50b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50f0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69  -----. */.int Di
5100: 67 65 73 74 4e 6f 74 69 66 79 50 72 6f 63 28 43  gestNotifyProc(C
5110: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
5120: 44 61 74 61 2c 20 69 6e 74 20 69 6e 74 65 72 65  Data, int intere
5130: 73 74 4d 61 73 6b 29 20 7b 0a 20 20 20 20 44 69  stMask) {.    Di
5140: 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65  gestState *state
5150: 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 61  Ptr = (DigestSta
5160: 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61  te *) clientData
5170: 3b 0a 0a 20 20 20 20 2f 2a 20 53 6b 69 70 20 74  ;..    /* Skip t
5180: 69 6d 65 72 20 65 76 65 6e 74 20 61 73 20 72 65  imer event as re
5190: 64 75 6e 64 61 6e 74 20 2a 2f 0a 20 20 20 20 69  dundant */.    i
51a0: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d  f (statePtr->tim
51b0: 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72  er != (Tcl_Timer
51c0: 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09  Token) NULL) {..
51d0: 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48  Tcl_DeleteTimerH
51e0: 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d  andler(statePtr-
51f0: 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50  >timer);..stateP
5200: 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c  tr->timer = (Tcl
5210: 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c  _TimerToken) NUL
5220: 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  L;.    }.    ret
5230: 75 72 6e 20 69 6e 74 65 72 65 73 74 4d 61 73 6b  urn interestMask
5240: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 0a 20 2a 20 43 68  ;.}../*. *. * Ch
5250: 61 6e 6e 65 6c 20 74 79 70 65 20 73 74 72 75 63  annel type struc
5260: 74 75 72 65 20 64 65 66 69 6e 69 74 69 6f 6e 20  ture definition 
5270: 66 6f 72 20 64 69 67 65 73 74 20 74 72 61 6e 73  for digest trans
5280: 66 6f 72 6d 61 74 69 6f 6e 73 2e 0a 20 2a 0a 20  formations.. *. 
5290: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
52a0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20  Tcl_ChannelType 
52b0: 64 69 67 65 73 74 43 68 61 6e 6e 65 6c 54 79 70  digestChannelTyp
52c0: 65 20 3d 20 7b 0a 20 20 20 20 22 64 69 67 65 73  e = {.    "diges
52d0: 74 22 2c 09 09 09 2f 2a 20 54 79 70 65 20 6e 61  t",.../* Type na
52e0: 6d 65 20 2a 2f 0a 20 20 20 20 54 43 4c 5f 43 48  me */.    TCL_CH
52f0: 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 35 2c  ANNEL_VERSION_5,
5300: 09 2f 2a 20 76 35 20 63 68 61 6e 6e 65 6c 20 2a  ./* v5 channel *
5310: 2f 0a 20 20 20 20 44 69 67 65 73 74 43 6c 6f 73  /.    DigestClos
5320: 65 50 72 6f 63 2c 09 09 2f 2a 20 43 6c 6f 73 65  eProc,../* Close
5330: 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 44 69 67   proc */.    Dig
5340: 65 73 74 49 6e 70 75 74 50 72 6f 63 2c 09 09 2f  estInputProc,../
5350: 2a 20 49 6e 70 75 74 20 70 72 6f 63 20 2a 2f 0a  * Input proc */.
5360: 20 20 20 20 44 69 67 65 73 74 4f 75 74 70 75 74      DigestOutput
5370: 50 72 6f 63 2c 09 09 2f 2a 20 4f 75 74 70 75 74  Proc,../* Output
5380: 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 4e 55 4c   proc */.    NUL
5390: 4c 2c 09 09 09 2f 2a 20 53 65 65 6b 20 70 72 6f  L,.../* Seek pro
53a0: 63 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 53  c */.    DigestS
53b0: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 2c 09 2f 2a  etOptionProc,./*
53c0: 20 53 65 74 20 6f 70 74 69 6f 6e 20 70 72 6f 63   Set option proc
53d0: 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 47 65   */.    DigestGe
53e0: 74 4f 70 74 69 6f 6e 50 72 6f 63 2c 09 2f 2a 20  tOptionProc,./* 
53f0: 47 65 74 20 6f 70 74 69 6f 6e 20 70 72 6f 63 20  Get option proc 
5400: 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 57 61 74  */.    DigestWat
5410: 63 68 50 72 6f 63 2c 09 09 2f 2a 20 49 6e 69 74  chProc,../* Init
5420: 69 61 6c 69 7a 65 20 6e 6f 74 69 66 69 65 72 20  ialize notifier 
5430: 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 47 65 74  */.    DigestGet
5440: 48 61 6e 64 6c 65 50 72 6f 63 2c 09 2f 2a 20 47  HandleProc,./* G
5450: 65 74 20 4f 53 20 68 61 6e 64 6c 65 73 20 6f 75  et OS handles ou
5460: 74 20 6f 66 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  t of channel */.
5470: 20 20 20 20 44 69 67 65 73 74 43 6c 6f 73 65 32      DigestClose2
5480: 50 72 6f 63 2c 09 09 2f 2a 20 63 6c 6f 73 65 32  Proc,../* close2
5490: 70 72 6f 63 20 2a 2f 0a 20 20 20 20 44 69 67 65  proc */.    Dige
54a0: 73 74 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 2c  stBlockModeProc,
54b0: 09 2f 2a 20 53 65 74 20 62 6c 6f 63 6b 69 6e 67  ./* Set blocking
54c0: 2f 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64  /nonblocking mod
54d0: 65 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 09  e*/.    NULL,...
54e0: 2f 2a 20 46 6c 75 73 68 20 70 72 6f 63 20 2a 2f  /* Flush proc */
54f0: 0a 20 20 20 20 44 69 67 65 73 74 4e 6f 74 69 66  .    DigestNotif
5500: 79 50 72 6f 63 2c 09 09 2f 2a 20 48 61 6e 64 6c  yProc,../* Handl
5510: 69 6e 67 20 6f 66 20 65 76 65 6e 74 73 20 62 75  ing of events bu
5520: 62 62 6c 69 6e 67 20 75 70 20 2a 2f 0a 20 20 20  bbling up */.   
5530: 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 57 69 64 65   NULL,.../* Wide
5540: 20 73 65 65 6b 20 70 72 6f 63 20 2a 2f 0a 20 20   seek proc */.  
5550: 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 54 68 72    NULL,.../* Thr
5560: 65 61 64 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ead action */.  
5570: 20 20 4e 55 4c 4c 09 09 09 2f 2a 20 54 72 75 6e    NULL.../* Trun
5580: 63 61 74 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 20  cate */.};../*. 
5590: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
55a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55d0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c  -------. *. * Tl
55e0: 73 5f 44 69 67 65 73 74 43 68 61 6e 6e 65 6c 20  s_DigestChannel 
55f0: 2d 2d 0a 20 2a 0a 20 2a 09 43 72 65 61 74 65 20  --. *. *.Create 
5600: 61 20 73 74 61 63 6b 65 64 20 63 68 61 6e 6e 65  a stacked channe
5610: 6c 20 66 6f 72 20 61 20 6d 65 73 73 61 67 65 20  l for a message 
5620: 64 69 67 65 73 74 20 74 72 61 6e 73 66 6f 72 6d  digest transform
5630: 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74  ation.. *. * Ret
5640: 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20  urns:. *.TCL_OK 
5650: 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a  or TCL_ERROR. *.
5660: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
5670: 0a 20 2a 09 41 64 64 73 20 74 72 61 6e 73 66 6f  . *.Adds transfo
5680: 72 6d 20 74 6f 20 63 68 61 6e 6e 65 6c 20 61 6e  rm to channel an
5690: 64 20 73 65 74 73 20 72 65 73 75 6c 74 20 74 6f  d sets result to
56a0: 20 63 68 61 6e 6e 65 6c 20 69 64 20 6f 72 20 65   channel id or e
56b0: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a  rror message.. *
56c0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
56d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
5710: 61 74 69 63 20 69 6e 74 0a 54 6c 73 5f 44 69 67  atic int.Tls_Dig
5720: 65 73 74 43 68 61 6e 6e 65 6c 28 54 63 6c 5f 49  estChannel(Tcl_I
5730: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 63  nterp *interp, c
5740: 6f 6e 73 74 20 63 68 61 72 20 2a 63 68 61 6e 6e  onst char *chann
5750: 65 6c 2c 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44  el, const EVP_MD
5760: 20 2a 6d 64 2c 0a 09 63 6f 6e 73 74 20 45 56 50   *md,..const EVP
5770: 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 2c  _CIPHER *cipher,
5780: 20 69 6e 74 20 66 6f 72 6d 61 74 2c 20 54 63 6c   int format, Tcl
5790: 5f 4f 62 6a 20 2a 6b 65 79 4f 62 6a 29 20 7b 0a  _Obj *keyObj) {.
57a0: 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 20 2f 2a      int mode; /*
57b0: 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69   OR-ed combinati
57c0: 6f 6e 20 6f 66 20 54 43 4c 5f 52 45 41 44 41 42  on of TCL_READAB
57d0: 4c 45 20 61 6e 64 20 54 43 4c 5f 57 52 49 54 41  LE and TCL_WRITA
57e0: 42 4c 45 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 43  BLE */.    Tcl_C
57f0: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20  hannel chan;.   
5800: 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74   DigestState *st
5810: 61 74 65 50 74 72 3b 0a 0a 20 20 20 20 2f 2a 20  atePtr;..    /* 
5820: 56 61 6c 69 64 61 74 65 20 61 72 67 73 20 2a 2f  Validate args */
5830: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 6e 65 6c  .    if (channel
5840: 20 3d 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20   == (const char 
5850: 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  *) NULL) {..retu
5860: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
5870: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
5880: 63 68 61 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20 20  channel Id */.  
5890: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
58a0: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
58b0: 63 68 61 6e 6e 65 6c 2c 20 26 6d 6f 64 65 29 3b  channel, &mode);
58c0: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d  .    if (chan ==
58d0: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e   (Tcl_Channel) N
58e0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  ULL) {..return T
58f0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
5900: 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
5910: 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20  e to operate on 
5920: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e  the topmost chan
5930: 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20  nel */.    chan 
5940: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e  = Tcl_GetTopChan
5950: 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20  nel(chan);..    
5960: 2f 2a 20 43 72 65 61 74 65 20 73 74 61 74 65 20  /* Create state 
5970: 64 61 74 61 20 73 74 72 75 63 74 20 2a 2f 0a 20  data struct */. 
5980: 20 20 20 69 66 20 28 28 73 74 61 74 65 50 74 72     if ((statePtr
5990: 20 3d 20 54 6c 73 5f 44 69 67 65 73 74 4e 65 77   = Tls_DigestNew
59a0: 28 69 6e 74 65 72 70 2c 20 66 6f 72 6d 61 74 29  (interp, format)
59b0: 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63  ) == NULL) {..Tc
59c0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
59d0: 6e 74 65 72 70 2c 20 22 49 6e 69 74 69 61 6c 69  nterp, "Initiali
59e0: 7a 65 20 64 69 67 65 73 74 20 65 72 72 6f 72 3a  ze digest error:
59f0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
5a00: 6f 6e 20 66 61 69 6c 75 72 65 22 2c 20 28 63 68  on failure", (ch
5a10: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65  ar *) NULL);..re
5a20: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
5a30: 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50      }.    stateP
5a40: 74 72 2d 3e 73 65 6c 66 20 3d 20 63 68 61 6e 3b  tr->self = chan;
5a50: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 6d  .    statePtr->m
5a60: 6f 64 65 20 3d 20 6d 6f 64 65 3b 0a 0a 20 20 20  ode = mode;..   
5a70: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 68   /* Initialize h
5a80: 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ash function */.
5a90: 20 20 20 20 69 66 20 28 54 6c 73 5f 44 69 67 65      if (Tls_Dige
5aa0: 73 74 49 6e 69 74 28 69 6e 74 65 72 70 2c 20 73  stInit(interp, s
5ab0: 74 61 74 65 50 74 72 2c 20 6d 64 2c 20 63 69 70  tatePtr, md, cip
5ac0: 68 65 72 2c 20 6b 65 79 4f 62 6a 29 20 21 3d 20  her, keyObj) != 
5ad0: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72  TCL_OK) {..retur
5ae0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
5af0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 66 69   }..    /* Confi
5b00: 67 75 72 65 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  gure channel */.
5b10: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e      Tcl_SetChann
5b20: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
5b30: 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61   chan, "-transla
5b40: 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72 79 22 29  tion", "binary")
5b50: 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65  ;.    if (Tcl_Ge
5b60: 74 43 68 61 6e 6e 65 6c 42 75 66 66 65 72 53 69  tChannelBufferSi
5b70: 7a 65 28 63 68 61 6e 29 20 3c 20 45 56 50 5f 4d  ze(chan) < EVP_M
5b80: 41 58 5f 4d 44 5f 53 49 5a 45 20 2a 20 32 29 20  AX_MD_SIZE * 2) 
5b90: 7b 0a 09 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65  {..Tcl_SetChanne
5ba0: 6c 42 75 66 66 65 72 53 69 7a 65 28 63 68 61 6e  lBufferSize(chan
5bb0: 2c 20 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a  , EVP_MAX_MD_SIZ
5bc0: 45 20 2a 20 32 29 3b 0a 20 20 20 20 7d 0a 0a 20  E * 2);.    }.. 
5bd0: 20 20 20 2f 2a 20 53 74 61 63 6b 20 63 68 61 6e     /* Stack chan
5be0: 6e 65 6c 20 2a 2f 0a 20 20 20 20 73 74 61 74 65  nel */.    state
5bf0: 50 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f  Ptr->self = Tcl_
5c00: 53 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74  StackChannel(int
5c10: 65 72 70 2c 20 26 64 69 67 65 73 74 43 68 61 6e  erp, &digestChan
5c20: 6e 65 6c 54 79 70 65 2c 20 28 43 6c 69 65 6e 74  nelType, (Client
5c30: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2c 20  Data) statePtr, 
5c40: 6d 6f 64 65 2c 20 63 68 61 6e 29 3b 0a 20 20 20  mode, chan);.   
5c50: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73   if (statePtr->s
5c60: 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  elf == (Tcl_Chan
5c70: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 6c  nel) NULL) {..Tl
5c80: 73 5f 44 69 67 65 73 74 46 72 65 65 28 73 74 61  s_DigestFree(sta
5c90: 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20  tePtr);..return 
5ca0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
5cb0: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 72 65 73  ..    /* Set res
5cc0: 75 6c 74 20 74 6f 20 63 68 61 6e 6e 65 6c 20 49  ult to channel I
5cd0: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 65 74  d */.    Tcl_Set
5ce0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
5cf0: 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 43  char *) Tcl_GetC
5d00: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29  hannelName(chan)
5d10: 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
5d20: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
5d30: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  OK;.}../*. *----
5d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d80: 2d 2d 0a 20 2a 0a 20 2a 20 55 6e 73 74 61 63 6b  --. *. * Unstack
5d90: 20 43 68 61 6e 6e 65 6c 20 2d 2d 0a 20 2a 0a 20   Channel --. *. 
5da0: 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  *.This function 
5db0: 72 65 6d 6f 76 65 73 20 74 68 65 20 73 74 61 63  removes the stac
5dc0: 6b 65 64 20 63 68 61 6e 6e 65 6c 20 66 72 6f 6d  ked channel from
5dd0: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a   the top of the.
5de0: 20 2a 09 63 68 61 6e 6e 65 6c 20 73 74 61 63 6b   *.channel stack
5df0: 20 69 66 20 69 74 20 69 73 20 61 20 64 69 67 65   if it is a dige
5e00: 73 74 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20  st channel.. *. 
5e10: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43  * Returns:. *.TC
5e20: 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f  L_OK or TCL_ERRO
5e30: 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  R. *. * Side eff
5e40: 65 63 74 73 3a 0a 20 2a 09 52 65 6d 6f 76 65 73  ects:. *.Removes
5e50: 20 74 72 61 6e 73 66 6f 72 6d 20 66 72 6f 6d 20   transform from 
5e60: 63 68 61 6e 6e 65 6c 20 6f 72 20 73 65 74 73 20  channel or sets 
5e70: 72 65 73 75 6c 74 20 74 6f 20 65 72 72 6f 72 20  result to error 
5e80: 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 2d 2d  message.. *. *--
5e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ed0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
5ee0: 69 6e 74 0a 55 6e 73 74 61 63 6b 4f 62 6a 43 6d  int.UnstackObjCm
5ef0: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  d(ClientData cli
5f00: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  entData, Tcl_Int
5f10: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
5f20: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
5f30: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a  const objv[]) {.
5f40: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20      Tcl_Channel 
5f50: 63 68 61 6e 3b 0a 20 20 20 20 69 6e 74 20 6d 6f  chan;.    int mo
5f60: 64 65 3b 20 2f 2a 20 4f 52 2d 65 64 20 63 6f 6d  de; /* OR-ed com
5f70: 62 69 6e 61 74 69 6f 6e 20 6f 66 20 54 43 4c 5f  bination of TCL_
5f80: 52 45 41 44 41 42 4c 45 20 61 6e 64 20 54 43 4c  READABLE and TCL
5f90: 5f 57 52 49 54 41 42 4c 45 20 20 2a 2f 0a 0a 20  _WRITABLE  */.. 
5fa0: 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 65 20 61     /* Validate a
5fb0: 72 67 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20  rg count */.    
5fc0: 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b  if (objc != 2) {
5fd0: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72  ..Tcl_WrongNumAr
5fe0: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
5ff0: 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a  jv, "channel");.
6000: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
6010: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
6020: 20 47 65 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a   Get channel */.
6030: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
6040: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  etChannel(interp
6050: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  , Tcl_GetStringF
6060: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20  romObj(objv[1], 
6070: 4e 55 4c 4c 29 2c 20 26 6d 6f 64 65 29 3b 0a 20  NULL), &mode);. 
6080: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28     if (chan == (
6090: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
60a0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  L) {..return TCL
60b0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
60c0: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
60d0: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
60e0: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65  e topmost channe
60f0: 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20  l */.    chan = 
6100: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65  Tcl_GetTopChanne
6110: 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a  l(chan);..    /*
6120: 20 43 68 65 63 6b 20 69 66 20 64 69 67 65 73 74   Check if digest
6130: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20   channel */.    
6140: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  if (Tcl_GetChann
6150: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20  elType(chan) != 
6160: 26 64 69 67 65 73 74 43 68 61 6e 6e 65 6c 54 79  &digestChannelTy
6170: 70 65 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  pe) {..Tcl_Appen
6180: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
6190: 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22  "bad channel \""
61a0: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  , Tcl_GetChannel
61b0: 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20 20  Name(chan),..   
61c0: 20 22 5c 22 3a 20 6e 6f 74 20 61 20 64 69 67 65   "\": not a dige
61d0: 73 74 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c  st channel", NUL
61e0: 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f  L);..Tcl_SetErro
61f0: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54  rCode(interp, "T
6200: 4c 53 22 2c 20 22 55 4e 53 54 41 43 4b 22 2c 20  LS", "UNSTACK", 
6210: 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41  "CHANNEL", "INVA
6220: 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  LID", (char *) N
6230: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  ULL);..return TC
6240: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
6250: 20 20 20 20 2f 2a 20 50 6f 70 20 74 72 61 6e 73      /* Pop trans
6260: 66 6f 72 6d 20 66 72 6f 6d 20 63 68 61 6e 6e 65  form from channe
6270: 6c 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  l */.    return 
6280: 54 63 6c 5f 55 6e 73 74 61 63 6b 43 68 61 6e 6e  Tcl_UnstackChann
6290: 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29  el(interp, chan)
62a0: 3b 0a 20 20 20 20 09 63 6c 69 65 6e 74 44 61 74  ;.    .clientDat
62b0: 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a  a = clientData;.
62c0: 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../************
62d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
62e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
62f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6300: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 73 74 61 74 69 63  *******/..static
6310: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 6e 73   const char *ins
6320: 74 61 6e 63 65 5f 66 6e 73 20 5b 5d 20 3d 20 7b  tance_fns [] = {
6330: 20 22 66 69 6e 61 6c 69 7a 65 22 2c 20 22 75 70   "finalize", "up
6340: 64 61 74 65 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 0a  date", NULL };..
6350: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
6360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6390: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49  --------. *. * I
63a0: 6e 73 74 61 6e 63 65 4f 62 6a 43 6d 64 20 2d 2d  nstanceObjCmd --
63b0: 0a 20 2a 0a 20 2a 09 48 61 6e 64 6c 65 72 20 66  . *. *.Handler f
63c0: 6f 72 20 64 69 67 65 73 74 20 63 6f 6d 6d 61 6e  or digest comman
63d0: 64 20 69 6e 73 74 61 6e 63 65 73 2e 20 55 73 65  d instances. Use
63e0: 64 20 74 6f 20 61 64 64 20 64 61 74 61 20 74 6f  d to add data to
63f0: 20 68 61 73 68 0a 20 2a 09 66 75 6e 63 74 69 6f   hash. *.functio
6400: 6e 20 6f 72 20 72 65 74 72 69 65 76 65 20 6d 65  n or retrieve me
6410: 73 73 61 67 65 20 64 69 67 65 73 74 2e 0a 20 2a  ssage digest.. *
6420: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09  . * Returns:. *.
6430: 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52  TCL_OK or TCL_ER
6440: 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ROR. *. * Side e
6450: 66 66 65 63 74 73 3a 0a 20 2a 09 41 64 64 73 20  ffects:. *.Adds 
6460: 64 61 74 61 20 74 6f 20 68 61 73 68 20 6f 72 20  data to hash or 
6470: 72 65 74 75 72 6e 73 20 6d 65 73 73 61 67 65 20  returns message 
6480: 64 69 67 65 73 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d  digest. *. *----
6490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
64d0: 20 2a 2f 0a 69 6e 74 20 49 6e 73 74 61 6e 63 65   */.int Instance
64e0: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74  ObjCmd(ClientDat
64f0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63  a clientData, Tc
6500: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
6510: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f  , int objc, Tcl_
6520: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b  Obj *const objv[
6530: 5d 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53  ]) {.    DigestS
6540: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
6550: 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 29   (DigestState *)
6560: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20   clientData;.   
6570: 20 69 6e 74 20 66 6e 2c 20 6c 65 6e 20 3d 20 30   int fn, len = 0
6580: 3b 0a 20 20 20 20 63 68 61 72 20 2a 62 75 66 20  ;.    char *buf 
6590: 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20  = NULL;..    /* 
65a0: 56 61 6c 69 64 61 74 65 20 61 72 67 20 63 6f 75  Validate arg cou
65b0: 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62  nt */.    if (ob
65c0: 6a 63 20 3c 20 32 20 7c 7c 20 6f 62 6a 63 20 3e  jc < 2 || objc >
65d0: 20 33 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67   3) {..Tcl_Wrong
65e0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
65f0: 31 2c 20 6f 62 6a 76 2c 20 22 66 75 6e 63 74 69  1, objv, "functi
6600: 6f 6e 20 3f 64 61 74 61 3f 22 29 3b 0a 09 72 65  on ?data?");..re
6610: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6620: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
6630: 74 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  t function */.  
6640: 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64    if (Tcl_GetInd
6650: 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  exFromObj(interp
6660: 2c 20 6f 62 6a 76 5b 31 5d 2c 20 69 6e 73 74 61  , objv[1], insta
6670: 6e 63 65 5f 66 6e 73 2c 20 22 66 75 6e 63 74 69  nce_fns, "functi
6680: 6f 6e 22 2c 20 30 2c 20 26 66 6e 29 20 21 3d 20  on", 0, &fn) != 
6690: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72  TCL_OK) {..retur
66a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
66b0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 66 75   }..    /* Do fu
66c0: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66  nction */.    if
66d0: 20 28 66 6e 29 20 7b 0a 09 2f 2a 20 47 65 74 20   (fn) {../* Get 
66e0: 64 61 74 61 20 6f 72 20 72 65 74 75 72 6e 20 65  data or return e
66f0: 72 72 6f 72 20 69 66 20 6e 6f 6e 65 20 2a 2f 0a  rror if none */.
6700: 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20 33 29 20  .if (objc == 3) 
6710: 7b 0a 09 20 20 20 20 62 75 66 20 3d 20 54 63 6c  {..    buf = Tcl
6720: 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
6730: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c  mObj(objv[2], &l
6740: 65 6e 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  en);..} else {..
6750: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
6760: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
6770: 6f 62 6a 76 2c 20 22 75 70 64 61 74 65 20 64 61  objv, "update da
6780: 74 61 22 29 3b 0a 09 20 20 20 20 72 65 74 75 72  ta");..    retur
6790: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
67a0: 0a 09 2f 2a 20 55 70 64 61 74 65 20 68 61 73 68  ../* Update hash
67b0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 09 69 66   function */..if
67c0: 20 28 21 54 6c 73 5f 44 69 67 65 73 74 55 70 64   (!Tls_DigestUpd
67d0: 61 74 65 28 73 74 61 74 65 50 74 72 2c 20 62 75  ate(statePtr, bu
67e0: 66 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29  f, (size_t) len)
67f0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74  ) {..    Tcl_Set
6800: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
6810: 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28  , Tcl_ObjPrintf(
6820: 22 44 69 67 65 73 74 20 75 70 64 61 74 65 20 66  "Digest update f
6830: 61 69 6c 65 64 3a 20 25 73 22 2c 20 52 45 41 53  ailed: %s", REAS
6840: 4f 4e 28 29 29 29 3b 0a 09 20 20 20 20 72 65 74  ON()));..    ret
6850: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
6860: 7d 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  }..    } else {.
6870: 09 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 68 61 73  ./* Finalize has
6880: 68 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 63  h function and c
6890: 61 6c 63 75 6c 61 74 65 20 6d 65 73 73 61 67 65  alculate message
68a0: 20 64 69 67 65 73 74 20 2a 2f 0a 09 69 66 20 28   digest */..if (
68b0: 54 6c 73 5f 44 69 67 65 73 74 46 69 6e 69 61 6c  Tls_DigestFinial
68c0: 69 7a 65 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ize(interp, stat
68d0: 65 50 74 72 29 20 21 3d 20 54 43 4c 5f 4f 4b 29  ePtr) != TCL_OK)
68e0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 4f   {..    Tcl_SetO
68f0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
6900: 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 22   Tcl_ObjPrintf("
6910: 44 69 67 65 73 74 20 66 69 6e 61 6c 69 7a 65 20  Digest finalize 
6920: 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 52 45 41  failed: %s", REA
6930: 53 4f 4e 28 29 29 29 3b 0a 09 20 20 20 20 72 65  SON()));..    re
6940: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6950: 09 7d 0a 0a 09 54 63 6c 5f 44 65 6c 65 74 65 43  .}...Tcl_DeleteC
6960: 6f 6d 6d 61 6e 64 46 72 6f 6d 54 6f 6b 65 6e 28  ommandFromToken(
6970: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
6980: 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a  ->token);.    }.
6990: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
69a0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  K;.}../*. *-----
69b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
69c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
69d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
69e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
69f0: 2a 0a 20 2a 20 49 6e 73 74 61 6e 63 65 44 65 6c  *. * InstanceDel
6a00: 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20  Callback --. *. 
6a10: 2a 09 20 43 61 6c 6c 62 61 63 6b 20 74 6f 20 63  *. Callback to c
6a20: 6c 65 61 6e 2d 75 70 20 77 68 65 6e 20 64 69 67  lean-up when dig
6a30: 65 73 74 20 69 6e 73 74 61 6e 63 65 20 63 6f 6d  est instance com
6a40: 6d 61 6e 64 20 69 73 20 64 65 6c 65 74 65 64 2e  mand is deleted.
6a50: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a  . *. * Returns:.
6a60: 20 2a 09 4e 6f 74 68 69 6e 67 0a 20 2a 0a 20 2a   *.Nothing. *. *
6a70: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
6a80: 2a 09 44 65 73 74 72 6f 79 73 20 73 74 72 75 63  *.Destroys struc
6a90: 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  t. *. *---------
6aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76  ----------. */.v
6ae0: 6f 69 64 20 49 6e 73 74 61 6e 63 65 44 65 6c 43  oid InstanceDelC
6af0: 61 6c 6c 62 61 63 6b 28 43 6c 69 65 6e 74 44 61  allback(ClientDa
6b00: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 29 20 7b  ta clientData) {
6b10: 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65  .    DigestState
6b20: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44 69   *statePtr = (Di
6b30: 67 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69  gestState *) cli
6b40: 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 2f 2a  entData;..    /*
6b50: 20 43 6c 65 61 6e 2d 75 70 20 2a 2f 0a 20 20 20   Clean-up */.   
6b60: 20 54 6c 73 5f 44 69 67 65 73 74 46 72 65 65 28   Tls_DigestFree(
6b70: 73 74 61 74 65 50 74 72 29 3b 0a 7d 0a 0a 2f 2a  statePtr);.}../*
6b80: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
6b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6bc0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73  ------. *. * Tls
6bd0: 5f 44 69 67 65 73 74 49 6e 73 74 61 6e 63 65 20  _DigestInstance 
6be0: 2d 2d 0a 20 2a 0a 20 2a 09 20 43 72 65 61 74 65  --. *. *. Create
6bf0: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 61 6c 6c 6f   command to allo
6c00: 77 20 75 73 65 72 20 74 6f 20 61 64 64 20 64 61  w user to add da
6c10: 74 61 20 74 6f 20 68 61 73 68 20 66 75 6e 63 74  ta to hash funct
6c20: 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72  ion.. *. * Retur
6c30: 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72  ns:. *.TCL_OK or
6c40: 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a   TCL_ERROR. *. *
6c50: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
6c60: 2a 09 43 72 65 61 74 65 73 20 63 6f 6d 6d 61 6e  *.Creates comman
6c70: 64 20 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61  d or error messa
6c80: 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  ge. *. *--------
6c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
6cd0: 69 6e 74 20 54 6c 73 5f 44 69 67 65 73 74 49 6e  int Tls_DigestIn
6ce0: 73 74 61 6e 63 65 28 54 63 6c 5f 49 6e 74 65 72  stance(Tcl_Inter
6cf0: 70 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f  p *interp, Tcl_O
6d00: 62 6a 20 2a 63 6d 64 4f 62 6a 2c 20 63 6f 6e 73  bj *cmdObj, cons
6d10: 74 20 45 56 50 5f 4d 44 20 2a 6d 64 2c 0a 09 63  t EVP_MD *md,..c
6d20: 6f 6e 73 74 20 45 56 50 5f 43 49 50 48 45 52 20  onst EVP_CIPHER 
6d30: 2a 63 69 70 68 65 72 2c 20 69 6e 74 20 66 6f 72  *cipher, int for
6d40: 6d 61 74 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6b 65  mat, Tcl_Obj *ke
6d50: 79 4f 62 6a 29 20 7b 0a 20 20 20 20 44 69 67 65  yObj) {.    Dige
6d60: 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74  stState *statePt
6d70: 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 6d 64  r;.    char *cmd
6d80: 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Name = Tcl_GetSt
6d90: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 63 6d 64 4f  ringFromObj(cmdO
6da0: 62 6a 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20  bj, NULL);..    
6db0: 2f 2a 20 43 72 65 61 74 65 20 73 74 61 74 65 20  /* Create state 
6dc0: 64 61 74 61 20 73 74 72 75 63 74 20 2a 2f 0a 20  data struct */. 
6dd0: 20 20 20 69 66 20 28 28 73 74 61 74 65 50 74 72     if ((statePtr
6de0: 20 3d 20 54 6c 73 5f 44 69 67 65 73 74 4e 65 77   = Tls_DigestNew
6df0: 28 69 6e 74 65 72 70 2c 20 66 6f 72 6d 61 74 29  (interp, format)
6e00: 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63  ) == NULL) {..Tc
6e10: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
6e20: 6e 74 65 72 70 2c 20 22 49 6e 69 74 69 61 6c 69  nterp, "Initiali
6e30: 7a 65 20 64 69 67 65 73 74 20 65 72 72 6f 72 3a  ze digest error:
6e40: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
6e50: 6f 6e 20 66 61 69 6c 75 72 65 22 2c 20 28 63 68  on failure", (ch
6e60: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65  ar *) NULL);..re
6e70: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6e80: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e      }..    /* In
6e90: 69 74 69 61 6c 69 7a 65 20 68 61 73 68 20 66 75  itialize hash fu
6ea0: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66  nction */.    if
6eb0: 20 28 54 6c 73 5f 44 69 67 65 73 74 49 6e 69 74   (Tls_DigestInit
6ec0: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
6ed0: 72 2c 20 6d 64 2c 20 63 69 70 68 65 72 2c 20 6b  r, md, cipher, k
6ee0: 65 79 4f 62 6a 29 20 21 3d 20 54 43 4c 5f 4f 4b  eyObj) != TCL_OK
6ef0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
6f00: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
6f10: 20 20 2f 2a 20 43 72 65 61 74 65 20 69 6e 73 74    /* Create inst
6f20: 61 6e 63 65 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  ance command */.
6f30: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 74 6f      statePtr->to
6f40: 6b 65 6e 20 3d 20 54 63 6c 5f 43 72 65 61 74 65  ken = Tcl_Create
6f50: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
6f60: 70 2c 20 63 6d 64 4e 61 6d 65 2c 20 49 6e 73 74  p, cmdName, Inst
6f70: 61 6e 63 65 4f 62 6a 43 6d 64 2c 0a 09 28 43 6c  anceObjCmd,..(Cl
6f80: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50  ientData) stateP
6f90: 74 72 2c 20 49 6e 73 74 61 6e 63 65 44 65 6c 43  tr, InstanceDelC
6fa0: 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f  allback);..    /
6fb0: 2a 20 52 65 74 75 72 6e 20 63 6f 6d 6d 61 6e 64  * Return command
6fc0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 54 63 6c   name */.    Tcl
6fd0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
6fe0: 74 65 72 70 2c 20 63 6d 64 4f 62 6a 29 3b 0a 20  terp, cmdObj);. 
6ff0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
7000: 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}.../*********
7010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
7050: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
7060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7090: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f  -----. *. * Tls_
70a0: 44 69 67 65 73 74 44 61 74 61 20 2d 2d 0a 20 2a  DigestData --. *
70b0: 0a 20 2a 09 52 65 74 75 72 6e 20 6d 65 73 73 61  . *.Return messa
70c0: 67 65 20 64 69 67 65 73 74 20 66 6f 72 20 64 61  ge digest for da
70d0: 74 61 20 75 73 69 6e 67 20 75 73 65 72 20 73 70  ta using user sp
70e0: 65 63 69 66 69 65 64 20 68 61 73 68 20 66 75 6e  ecified hash fun
70f0: 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74  ction.. *. * Ret
7100: 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20  urns:. *.TCL_OK 
7110: 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a  or TCL_ERROR. *.
7120: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
7130: 0a 20 2a 09 53 65 74 73 20 72 65 73 75 6c 74 20  . *.Sets result 
7140: 74 6f 20 6d 65 73 73 61 67 65 20 64 69 67 65 73  to message diges
7150: 74 20 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61  t or error messa
7160: 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  ge. *. *--------
7170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
71b0: 69 6e 74 0a 54 6c 73 5f 44 69 67 65 73 74 44 61  int.Tls_DigestDa
71c0: 74 61 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  ta(Tcl_Interp *i
71d0: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
71e0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20   Tcl_Obj *const 
71f0: 6f 62 6a 76 5b 5d 2c 0a 09 63 6f 6e 73 74 20 45  objv[],..const E
7200: 56 50 5f 4d 44 20 2a 6d 64 2c 20 63 6f 6e 73 74  VP_MD *md, const
7210: 20 45 56 50 5f 43 49 50 48 45 52 20 2a 63 69 70   EVP_CIPHER *cip
7220: 68 65 72 2c 20 69 6e 74 20 66 6f 72 6d 61 74 2c  her, int format,
7230: 20 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4f 62 6a   Tcl_Obj *keyObj
7240: 29 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 64 61  ) {.    char *da
7250: 74 61 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 2c  ta;.    int len,
7260: 20 72 65 73 3b 0a 20 20 20 20 75 6e 73 69 67 6e   res;.    unsign
7270: 65 64 20 69 6e 74 20 6d 64 5f 6c 65 6e 3b 0a 20  ed int md_len;. 
7280: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
7290: 20 6d 64 5f 62 75 66 5b 45 56 50 5f 4d 41 58 5f   md_buf[EVP_MAX_
72a0: 4d 44 5f 53 49 5a 45 5d 3b 0a 0a 20 20 20 20 2f  MD_SIZE];..    /
72b0: 2a 20 56 61 6c 69 64 61 74 65 20 61 72 67 20 63  * Validate arg c
72c0: 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20 28  ount */.    if (
72d0: 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63  objc != 2) {..Tc
72e0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
72f0: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
7300: 22 64 61 74 61 22 29 3b 0a 09 72 65 74 75 72 6e  "data");..return
7310: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
7320: 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 64 61  }..    /* Get da
7330: 74 61 20 2a 2f 0a 20 20 20 20 64 61 74 61 20 3d  ta */.    data =
7340: 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61   Tcl_GetByteArra
7350: 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d  yFromObj(objv[1]
7360: 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 69 66 20  , &len);.    if 
7370: 28 64 61 74 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c  (data == NULL ||
7380: 20 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 54 63   len == 0) {..Tc
7390: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
73a0: 72 70 2c 20 22 4e 6f 20 64 61 74 61 22 2c 20 4e  rp, "No data", N
73b0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  ULL);..return TC
73c0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
73d0: 20 20 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65      /* Calculate
73e0: 20 64 69 67 65 73 74 20 62 61 73 65 64 20 6f 6e   digest based on
73f0: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a   hash function *
7400: 2f 0a 20 20 20 20 69 66 20 28 6b 65 79 4f 62 6a  /.    if (keyObj
7410: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a 29 20   == (Tcl_Obj *) 
7420: 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 20 3d 20 45  NULL) {..res = E
7430: 56 50 5f 44 69 67 65 73 74 28 64 61 74 61 2c 20  VP_Digest(data, 
7440: 28 73 69 7a 65 5f 74 29 20 6c 65 6e 2c 20 6d 64  (size_t) len, md
7450: 5f 62 75 66 2c 20 26 6d 64 5f 6c 65 6e 2c 20 6d  _buf, &md_len, m
7460: 64 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 20  d, NULL);.    } 
7470: 65 6c 73 65 20 7b 0a 09 75 6e 73 69 67 6e 65 64  else {..unsigned
7480: 20 63 68 61 72 20 2a 6b 65 79 2c 20 2a 68 6d 61   char *key, *hma
7490: 63 20 3d 20 4e 55 4c 4c 3b 0a 09 69 6e 74 20 6b  c = NULL;..int k
74a0: 65 79 5f 6c 65 6e 3b 0a 0a 09 6b 65 79 20 3d 20  ey_len;...key = 
74b0: 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
74c0: 46 72 6f 6d 4f 62 6a 28 6b 65 79 4f 62 6a 2c 20  FromObj(keyObj, 
74d0: 26 6b 65 79 5f 6c 65 6e 29 3b 0a 09 68 6d 61 63  &key_len);..hmac
74e0: 20 3d 20 48 4d 41 43 28 6d 64 2c 20 28 63 6f 6e   = HMAC(md, (con
74f0: 73 74 20 76 6f 69 64 20 2a 29 20 6b 65 79 2c 20  st void *) key, 
7500: 6b 65 79 5f 6c 65 6e 2c 20 28 63 6f 6e 73 74 20  key_len, (const 
7510: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
7520: 20 64 61 74 61 2c 0a 09 20 20 20 20 28 73 69 7a   data,..    (siz
7530: 65 5f 74 29 20 6c 65 6e 2c 20 6d 64 5f 62 75 66  e_t) len, md_buf
7540: 2c 20 26 6d 64 5f 6c 65 6e 29 3b 0a 09 72 65 73  , &md_len);..res
7550: 20 3d 20 28 68 6d 61 63 20 21 3d 20 4e 55 4c 4c   = (hmac != NULL
7560: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
7570: 20 4f 75 74 70 75 74 20 64 69 67 65 73 74 20 74   Output digest t
7580: 6f 20 72 65 73 75 6c 74 20 70 65 72 20 66 6f 72  o result per for
7590: 6d 61 74 20 28 62 69 6e 20 6f 72 20 68 65 78 29  mat (bin or hex)
75a0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 73 29   */.    if (res)
75b0: 20 7b 0a 09 69 66 20 28 66 6f 72 6d 61 74 20 26   {..if (format &
75c0: 20 42 49 4e 5f 46 4f 52 4d 41 54 29 20 7b 0a 09   BIN_FORMAT) {..
75d0: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
75e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
75f0: 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a  _NewByteArrayObj
7600: 28 6d 64 5f 62 75 66 2c 20 6d 64 5f 6c 65 6e 29  (md_buf, md_len)
7610: 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20  );...} else {.. 
7620: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75     Tcl_Obj *resu
7630: 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f  ltObj = Tcl_NewO
7640: 62 6a 28 29 3b 0a 09 20 20 20 20 75 6e 73 69 67  bj();..    unsig
7650: 6e 65 64 20 63 68 61 72 20 2a 70 74 72 20 3d 20  ned char *ptr = 
7660: 54 63 6c 5f 53 65 74 42 79 74 65 41 72 72 61 79  Tcl_SetByteArray
7670: 4c 65 6e 67 74 68 28 72 65 73 75 6c 74 4f 62 6a  Length(resultObj
7680: 2c 20 6d 64 5f 6c 65 6e 2a 32 29 3b 0a 0a 09 20  , md_len*2);... 
7690: 20 20 20 66 6f 72 20 28 75 6e 73 69 67 6e 65 64     for (unsigned
76a0: 20 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20   int i = 0; i < 
76b0: 6d 64 5f 6c 65 6e 3b 20 69 2b 2b 29 20 7b 0a 09  md_len; i++) {..
76c0: 09 2a 70 74 72 2b 2b 20 3d 20 68 65 78 5b 28 6d  .*ptr++ = hex[(m
76d0: 64 5f 62 75 66 5b 69 5d 20 3e 3e 20 34 29 20 26  d_buf[i] >> 4) &
76e0: 20 30 78 30 46 5d 3b 0a 09 09 2a 70 74 72 2b 2b   0x0F];...*ptr++
76f0: 20 3d 20 68 65 78 5b 6d 64 5f 62 75 66 5b 69 5d   = hex[md_buf[i]
7700: 20 26 20 30 78 30 46 5d 3b 0a 09 20 20 20 20 7d   & 0x0F];..    }
7710: 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75  ..Tcl_SetObjResu
7720: 6c 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  lt(interp, resul
7730: 74 4f 62 6a 29 3b 0a 09 7d 0a 0a 20 20 20 20 7d  tObj);..}..    }
7740: 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 41 70 70   else {..Tcl_App
7750: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
7760: 2c 20 22 48 61 73 68 20 63 61 6c 63 75 6c 61 74  , "Hash calculat
7770: 69 6f 6e 20 65 72 72 6f 72 3a 22 2c 20 52 45 41  ion error:", REA
7780: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
7790: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
77a0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
77b0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
77c0: 4b 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  K;.}.../********
77d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
7810: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
7820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7850: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67  ------. *. * Dig
7860: 65 73 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a  estObjCmd --. *.
7870: 20 2a 09 52 65 74 75 72 6e 20 6d 65 73 73 61 67   *.Return messag
7880: 65 20 64 69 67 65 73 74 20 75 73 69 6e 67 20 75  e digest using u
7890: 73 65 72 20 73 70 65 63 69 66 69 65 64 20 68 61  ser specified ha
78a0: 73 68 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 0a  sh function.. *.
78b0: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54   * Returns:. *.T
78c0: 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52  CL_OK or TCL_ERR
78d0: 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  OR. *. * Side ef
78e0: 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 72  fects:. *.Sets r
78f0: 65 73 75 6c 74 20 74 6f 20 6d 65 73 73 61 67 65  esult to message
7900: 20 64 69 67 65 73 74 20 6f 72 20 65 72 72 6f 72   digest or error
7910: 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d   message. *. *--
7920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7960: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
7970: 0a 44 69 67 65 73 74 4f 62 6a 43 6d 64 28 43 6c  .DigestObjCmd(Cl
7980: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
7990: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
79a0: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
79b0: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
79c0: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
79d0: 69 6e 74 20 69 64 78 2c 20 6c 65 6e 2c 20 66 6f  int idx, len, fo
79e0: 72 6d 61 74 20 3d 20 48 45 58 5f 46 4f 52 4d 41  rmat = HEX_FORMA
79f0: 54 2c 20 72 65 73 20 3d 20 54 43 4c 5f 4f 4b 2c  T, res = TCL_OK,
7a00: 20 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20   flags = 0;.    
7a10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 69 67 65  const char *dige
7a20: 73 74 6e 61 6d 65 2c 20 2a 63 68 61 6e 6e 65 6c  stname, *channel
7a30: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c   = NULL;.    Tcl
7a40: 5f 4f 62 6a 20 2a 63 6d 64 4f 62 6a 20 3d 20 4e  _Obj *cmdObj = N
7a50: 55 4c 4c 2c 20 2a 64 61 74 61 4f 62 6a 20 3d 20  ULL, *dataObj = 
7a60: 4e 55 4c 4c 2c 20 2a 66 69 6c 65 4f 62 6a 20 3d  NULL, *fileObj =
7a70: 20 4e 55 4c 4c 2c 20 2a 6b 65 79 4f 62 6a 20 3d   NULL, *keyObj =
7a80: 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e 73 69 67   NULL;.    unsig
7a90: 6e 65 64 20 63 68 61 72 20 2a 63 69 70 68 65 72  ned char *cipher
7aa0: 4e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  Name = NULL;.   
7ab0: 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d   const EVP_MD *m
7ac0: 64 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45 56 50  d;.    const EVP
7ad0: 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 3b  _CIPHER *cipher;
7ae0: 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 72 20 69  ..    /* Clear i
7af0: 6e 74 65 72 70 20 72 65 73 75 6c 74 20 2a 2f 0a  nterp result */.
7b00: 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73      Tcl_ResetRes
7b10: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 0a 20 20  ult(interp);..  
7b20: 20 20 2f 2a 20 56 61 6c 69 64 61 74 65 20 61 72    /* Validate ar
7b30: 67 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69  g count */.    i
7b40: 66 20 28 6f 62 6a 63 20 3c 20 33 20 7c 7c 20 6f  f (objc < 3 || o
7b50: 62 6a 63 20 3e 20 39 29 20 7b 0a 09 54 63 6c 5f  bjc > 9) {..Tcl_
7b60: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
7b70: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 64  erp, 1, objv, "d
7b80: 69 67 65 73 74 20 3f 2d 62 69 6e 7c 2d 68 65 78  igest ?-bin|-hex
7b90: 3f 20 3f 2d 63 69 70 68 65 72 20 6e 61 6d 65 3f  ? ?-cipher name?
7ba0: 20 3f 2d 6b 65 79 20 68 6d 61 63 5f 6b 65 79 3f   ?-key hmac_key?
7bb0: 20 5b 2d 63 68 61 6e 6e 65 6c 20 63 68 61 6e 20   [-channel chan 
7bc0: 7c 20 2d 63 6f 6d 6d 61 6e 64 20 63 6d 64 4e 61  | -command cmdNa
7bd0: 6d 65 20 7c 20 2d 66 69 6c 65 20 66 69 6c 65 6e  me | -file filen
7be0: 61 6d 65 20 7c 20 3f 2d 64 61 74 61 3f 20 64 61  ame | ?-data? da
7bf0: 74 61 5d 22 29 3b 0a 09 72 65 74 75 72 6e 20 54  ta]");..return T
7c00: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
7c10: 0a 20 20 20 20 2f 2a 20 47 65 74 20 64 69 67 65  .    /* Get dige
7c20: 73 74 20 2a 2f 0a 20 20 20 20 64 69 67 65 73 74  st */.    digest
7c30: 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  name = Tcl_GetSt
7c40: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
7c50: 5b 31 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  [1], &len);.    
7c60: 69 66 20 28 64 69 67 65 73 74 6e 61 6d 65 20 3d  if (digestname =
7c70: 3d 20 4e 55 4c 4c 20 7c 7c 20 28 6d 64 20 3d 20  = NULL || (md = 
7c80: 45 56 50 5f 67 65 74 5f 64 69 67 65 73 74 62 79  EVP_get_digestby
7c90: 6e 61 6d 65 28 64 69 67 65 73 74 6e 61 6d 65 29  name(digestname)
7ca0: 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63  ) == NULL) {..Tc
7cb0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
7cc0: 6e 74 65 72 70 2c 20 22 49 6e 76 61 6c 69 64 20  nterp, "Invalid 
7cd0: 64 69 67 65 73 74 20 5c 22 22 2c 20 64 69 67 65  digest \"", dige
7ce0: 73 74 6e 61 6d 65 2c 20 22 5c 22 22 2c 20 4e 55  stname, "\"", NU
7cf0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
7d00: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
7d10: 20 20 20 2f 2a 20 4f 70 74 69 6d 61 6c 20 63 61     /* Optimal ca
7d20: 73 65 20 66 6f 72 20 62 6c 6f 62 20 6f 66 20 64  se for blob of d
7d30: 61 74 61 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f  ata */.    if (o
7d40: 62 6a 63 20 3d 3d 20 33 20 26 26 20 74 79 70 65  bjc == 3 && type
7d50: 20 3d 3d 20 54 59 50 45 5f 4d 44 29 20 7b 0a 09   == TYPE_MD) {..
7d60: 72 65 74 75 72 6e 20 54 6c 73 5f 44 69 67 65 73  return Tls_Diges
7d70: 74 44 61 74 61 28 69 6e 74 65 72 70 2c 20 2d 2d  tData(interp, --
7d80: 6f 62 6a 63 2c 20 2b 2b 6f 62 6a 76 2c 20 6d 64  objc, ++objv, md
7d90: 2c 20 4e 55 4c 4c 2c 20 48 45 58 5f 46 4f 52 4d  , NULL, HEX_FORM
7da0: 41 54 20 7c 20 54 59 50 45 5f 4d 44 2c 20 4e 55  AT | TYPE_MD, NU
7db0: 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  LL);.    }..    
7dc0: 2f 2a 20 47 65 74 20 6f 70 74 69 6f 6e 73 20 2a  /* Get options *
7dd0: 2f 0a 20 20 20 20 66 6f 72 20 28 69 64 78 20 3d  /.    for (idx =
7de0: 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63 2d 31   2; idx < objc-1
7df0: 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 63 68 61 72  ; idx++) {..char
7e00: 20 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53   *opt = Tcl_GetS
7e10: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
7e20: 76 5b 69 64 78 5d 2c 20 4e 55 4c 4c 29 3b 0a 0a  v[idx], NULL);..
7e30: 09 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27  .if (opt[0] != '
7e40: 2d 27 29 20 7b 0a 09 20 20 20 20 62 72 65 61 6b  -') {..    break
7e50: 3b 0a 09 7d 0a 0a 09 4f 50 54 46 4c 41 47 28 22  ;..}...OPTFLAG("
7e60: 2d 62 69 6e 22 2c 20 66 6f 72 6d 61 74 2c 20 42  -bin", format, B
7e70: 49 4e 5f 46 4f 52 4d 41 54 29 3b 0a 09 4f 50 54  IN_FORMAT);..OPT
7e80: 46 4c 41 47 28 22 2d 62 69 6e 61 72 79 22 2c 20  FLAG("-binary", 
7e90: 66 6f 72 6d 61 74 2c 20 42 49 4e 5f 46 4f 52 4d  format, BIN_FORM
7ea0: 41 54 29 3b 0a 09 4f 50 54 46 4c 41 47 28 22 2d  AT);..OPTFLAG("-
7eb0: 68 65 78 22 2c 20 66 6f 72 6d 61 74 2c 20 48 45  hex", format, HE
7ec0: 58 5f 46 4f 52 4d 41 54 29 3b 0a 09 4f 50 54 46  X_FORMAT);..OPTF
7ed0: 4c 41 47 28 22 2d 68 65 78 61 64 65 63 69 6d 61  LAG("-hexadecima
7ee0: 6c 22 2c 20 66 6f 72 6d 61 74 2c 20 48 45 58 5f  l", format, HEX_
7ef0: 46 4f 52 4d 41 54 29 3b 0a 09 4f 50 54 53 54 52  FORMAT);..OPTSTR
7f00: 28 22 2d 63 68 61 6e 22 2c 20 63 68 61 6e 6e 65  ("-chan", channe
7f10: 6c 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 68  l);..OPTSTR("-ch
7f20: 61 6e 6e 65 6c 22 2c 20 63 68 61 6e 6e 65 6c 29  annel", channel)
7f30: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68  ;..OPTSTR("-ciph
7f40: 65 72 22 2c 20 63 69 70 68 65 72 4e 61 6d 65 29  er", cipherName)
7f50: 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 63 6f 6d 6d  ;..OPTOBJ("-comm
7f60: 61 6e 64 22 2c 20 63 6d 64 4f 62 6a 29 3b 0a 09  and", cmdObj);..
7f70: 4f 50 54 4f 42 4a 28 22 2d 64 61 74 61 22 2c 20  OPTOBJ("-data", 
7f80: 64 61 74 61 4f 62 6a 29 3b 0a 09 4f 50 54 4f 42  dataObj);..OPTOB
7f90: 4a 28 22 2d 66 69 6c 65 22 2c 20 66 69 6c 65 4f  J("-file", fileO
7fa0: 62 6a 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 66  bj);..OPTOBJ("-f
7fb0: 69 6c 65 6e 61 6d 65 22 2c 20 66 69 6c 65 4f 62  ilename", fileOb
7fc0: 6a 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 6b 65  j);..OPTOBJ("-ke
7fd0: 79 22 2c 20 6b 65 79 4f 62 6a 29 3b 0a 0a 09 4f  y", keyObj);...O
7fe0: 50 54 42 41 44 28 22 6f 70 74 69 6f 6e 22 2c 20  PTBAD("option", 
7ff0: 22 2d 62 69 6e 2c 20 2d 63 68 61 6e 6e 65 6c 2c  "-bin, -channel,
8000: 20 2d 63 69 70 68 65 72 2c 20 2d 63 6f 6d 6d 61   -cipher, -comma
8010: 6e 64 2c 20 2d 64 61 74 61 2c 20 2d 66 69 6c 65  nd, -data, -file
8020: 2c 20 2d 66 69 6c 65 6e 61 6d 65 2c 20 2d 68 65  , -filename, -he
8030: 78 2c 20 6f 72 20 2d 6b 65 79 22 29 3b 0a 09 72  x, or -key");..r
8040: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8050: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
8060: 66 20 6e 6f 20 6f 70 74 69 6f 6e 20 66 6f 72 20  f no option for 
8070: 6c 61 73 74 20 61 72 67 2c 20 74 68 65 6e 20 69  last arg, then i
8080: 74 73 20 74 68 65 20 64 61 74 61 20 2a 2f 0a 20  ts the data */. 
8090: 20 20 20 69 66 20 28 69 64 78 20 3c 20 6f 62 6a     if (idx < obj
80a0: 63 29 20 7b 0a 09 64 61 74 61 4f 62 6a 20 3d 20  c) {..dataObj = 
80b0: 6f 62 6a 76 5b 69 64 78 5d 3b 0a 20 20 20 20 7d  objv[idx];.    }
80c0: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 69 70  ..    /* Get cip
80d0: 68 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 28 63  her */.    if (c
80e0: 69 70 68 65 72 4e 61 6d 65 20 21 3d 20 4e 55 4c  ipherName != NUL
80f0: 4c 29 20 7b 0a 09 63 69 70 68 65 72 20 3d 20 45  L) {..cipher = E
8100: 56 50 5f 67 65 74 5f 63 69 70 68 65 72 62 79 6e  VP_get_cipherbyn
8110: 61 6d 65 28 63 69 70 68 65 72 4e 61 6d 65 29 3b  ame(cipherName);
8120: 0a 09 69 66 20 28 63 69 70 68 65 72 20 3d 3d 20  ..if (cipher == 
8130: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c  NULL) {..    Tcl
8140: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
8150: 74 65 72 70 2c 20 22 49 6e 76 61 6c 69 64 20 63  terp, "Invalid c
8160: 69 70 68 65 72 20 5c 22 22 2c 20 63 69 70 68 65  ipher \"", ciphe
8170: 72 4e 61 6d 65 2c 20 22 5c 22 22 2c 20 4e 55 4c  rName, "\"", NUL
8180: 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  L);..    return 
8190: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20  TCL_ERROR;..}.  
81a0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 66 69    }..    /* Defi
81b0: 6e 65 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  ne operation to 
81c0: 70 65 72 66 6f 72 6d 20 2a 2f 0a 20 20 20 20 69  perform */.    i
81d0: 66 20 28 63 69 70 68 65 72 20 21 3d 20 4e 55 4c  f (cipher != NUL
81e0: 4c 29 20 7b 0a 09 66 6f 72 6d 61 74 20 7c 3d 20  L) {..format |= 
81f0: 54 59 50 45 5f 43 4d 41 43 3b 0a 20 20 20 20 7d  TYPE_CMAC;.    }
8200: 20 65 6c 73 65 20 69 66 20 28 6b 65 79 4f 62 6a   else if (keyObj
8210: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 66 6f 72   != NULL) {..for
8220: 6d 61 74 20 7c 3d 20 54 59 50 45 5f 48 4d 41 43  mat |= TYPE_HMAC
8230: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
8240: 66 6f 72 6d 61 74 20 7c 3d 20 54 59 50 45 5f 4d  format |= TYPE_M
8250: 44 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  D;.    }..    /*
8260: 20 43 61 6c 63 20 64 69 67 65 73 74 20 6f 6e 20   Calc digest on 
8270: 66 69 6c 65 2c 20 73 74 61 63 6b 65 64 20 63 68  file, stacked ch
8280: 61 6e 6e 65 6c 2c 20 75 73 69 6e 67 20 69 6e 73  annel, using ins
8290: 74 61 6e 63 65 20 63 6f 6d 6d 61 6e 64 2c 20 6f  tance command, o
82a0: 72 20 64 61 74 61 20 62 6c 6f 62 20 2a 2f 0a 20  r data blob */. 
82b0: 20 20 20 69 66 20 28 66 69 6c 65 4f 62 6a 20 21     if (fileObj !
82c0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 20 3d  = NULL) {..res =
82d0: 20 54 6c 73 5f 44 69 67 65 73 74 46 69 6c 65 28   Tls_DigestFile(
82e0: 69 6e 74 65 72 70 2c 20 66 69 6c 65 4f 62 6a 2c  interp, fileObj,
82f0: 20 6d 64 2c 20 63 69 70 68 65 72 2c 20 66 6f 72   md, cipher, for
8300: 6d 61 74 2c 20 6b 65 79 4f 62 6a 29 3b 0a 20 20  mat, keyObj);.  
8310: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 68 61    } else if (cha
8320: 6e 6e 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  nnel != NULL) {.
8330: 09 72 65 73 20 3d 20 54 6c 73 5f 44 69 67 65 73  .res = Tls_Diges
8340: 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c  tChannel(interp,
8350: 20 63 68 61 6e 6e 65 6c 2c 20 6d 64 2c 20 63 69   channel, md, ci
8360: 70 68 65 72 2c 20 66 6f 72 6d 61 74 2c 20 6b 65  pher, format, ke
8370: 79 4f 62 6a 29 3b 0a 20 20 20 20 7d 20 65 6c 73  yObj);.    } els
8380: 65 20 69 66 20 28 63 6d 64 4f 62 6a 20 21 3d 20  e if (cmdObj != 
8390: 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 20 3d 20 54  NULL) {..res = T
83a0: 6c 73 5f 44 69 67 65 73 74 49 6e 73 74 61 6e 63  ls_DigestInstanc
83b0: 65 28 69 6e 74 65 72 70 2c 20 63 6d 64 4f 62 6a  e(interp, cmdObj
83c0: 2c 20 6d 64 2c 20 63 69 70 68 65 72 2c 20 66 6f  , md, cipher, fo
83d0: 72 6d 61 74 2c 20 6b 65 79 4f 62 6a 29 3b 0a 20  rmat, keyObj);. 
83e0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 64 61     } else if (da
83f0: 74 61 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b  taObj != NULL) {
8400: 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 73 5b  ..Tcl_Obj *objs[
8410: 32 5d 3b 0a 09 6f 62 6a 73 5b 30 5d 20 3d 20 4e  2];..objs[0] = N
8420: 55 4c 4c 3b 0a 09 6f 62 6a 73 5b 31 5d 20 3d 20  ULL;..objs[1] = 
8430: 64 61 74 61 4f 62 6a 3b 0a 09 72 65 73 20 3d 20  dataObj;..res = 
8440: 54 6c 73 5f 44 69 67 65 73 74 44 61 74 61 28 69  Tls_DigestData(i
8450: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 73 2c 20  nterp, 2, objs, 
8460: 6d 64 2c 20 63 69 70 68 65 72 2c 20 66 6f 72 6d  md, cipher, form
8470: 61 74 2c 20 6b 65 79 4f 62 6a 29 3b 0a 20 20 20  at, keyObj);.   
8480: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65   }.    return re
8490: 73 3b 0a 7d 0a 0a 69 6e 74 20 43 4d 41 43 4f 62  s;.}..int CMACOb
84a0: 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20  jCmd(ClientData 
84b0: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f  clientData, Tcl_
84c0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
84d0: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
84e0: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j *const objv[])
84f0: 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 44 69   {.    return Di
8500: 67 65 73 74 4f 62 6a 43 6d 64 28 63 6c 69 65 6e  gestObjCmd(clien
8510: 74 44 61 74 61 2c 20 69 6e 74 65 72 70 2c 20 6f  tData, interp, o
8520: 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 7d 0a 0a 69  bjc, objv);.}..i
8530: 6e 74 20 48 4d 41 43 4f 62 6a 43 6d 64 28 43 6c  nt HMACObjCmd(Cl
8540: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
8550: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
8560: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
8570: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
8580: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
8590: 72 65 74 75 72 6e 20 44 69 67 65 73 74 4f 62 6a  return DigestObj
85a0: 43 6d 64 28 63 6c 69 65 6e 74 44 61 74 61 2c 20  Cmd(clientData, 
85b0: 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62  interp, objc, ob
85c0: 6a 76 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  jv);.}../*. *---
85d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
85e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
85f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8610: 0a 20 2a 0a 20 2a 20 4d 65 73 73 61 67 65 20 44  . *. * Message D
8620: 69 67 65 73 74 20 43 6f 6e 76 65 6e 69 65 6e 63  igest Convenienc
8630: 65 20 43 6f 6d 6d 61 6e 64 73 20 2d 2d 0a 20 2a  e Commands --. *
8640: 0a 20 2a 09 43 6f 6e 76 65 6e 69 65 6e 63 65 20  . *.Convenience 
8650: 63 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 6d 65 73  commands for mes
8660: 73 61 67 65 20 64 69 67 65 73 74 73 2e 0a 20 2a  sage digests.. *
8670: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09  . * Returns:. *.
8680: 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52  TCL_OK or TCL_ER
8690: 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ROR. *. * Side e
86a0: 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20  ffects:. *.Sets 
86b0: 72 65 73 75 6c 74 20 74 6f 20 6d 65 73 73 61 67  result to messag
86c0: 65 20 64 69 67 65 73 74 20 6f 72 20 65 72 72 6f  e digest or erro
86d0: 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d  r message. *. *-
86e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
86f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8720: 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73  --. */.int Diges
8730: 74 4d 44 34 43 6d 64 28 43 6c 69 65 6e 74 44 61  tMD4Cmd(ClientDa
8740: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
8750: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
8760: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
8770: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
8780: 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  []) {.    return
8790: 20 54 6c 73 5f 44 69 67 65 73 74 44 61 74 61 28   Tls_DigestData(
87a0: 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62  interp, objc, ob
87b0: 6a 76 2c 20 45 56 50 5f 6d 64 34 28 29 2c 20 4e  jv, EVP_md4(), N
87c0: 55 4c 4c 2c 20 48 45 58 5f 46 4f 52 4d 41 54 2c  ULL, HEX_FORMAT,
87d0: 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 69 6e 74 20 44   NULL);.}..int D
87e0: 69 67 65 73 74 4d 44 35 43 6d 64 28 43 6c 69 65  igestMD5Cmd(Clie
87f0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
8800: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
8810: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
8820: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20   Tcl_Obj *const 
8830: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 72 65  objv[]) {.    re
8840: 74 75 72 6e 20 54 6c 73 5f 44 69 67 65 73 74 44  turn Tls_DigestD
8850: 61 74 61 28 69 6e 74 65 72 70 2c 20 6f 62 6a 63  ata(interp, objc
8860: 2c 20 6f 62 6a 76 2c 20 45 56 50 5f 6d 64 35 28  , objv, EVP_md5(
8870: 29 2c 20 4e 55 4c 4c 2c 20 48 45 58 5f 46 4f 52  ), NULL, HEX_FOR
8880: 4d 41 54 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 69  MAT, NULL);.}..i
8890: 6e 74 20 44 69 67 65 73 74 53 48 41 31 43 6d 64  nt DigestSHA1Cmd
88a0: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
88b0: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ntData, Tcl_Inte
88c0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
88d0: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63  objc, Tcl_Obj *c
88e0: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20  onst objv[]) {. 
88f0: 20 20 20 72 65 74 75 72 6e 20 54 6c 73 5f 44 69     return Tls_Di
8900: 67 65 73 74 44 61 74 61 28 69 6e 74 65 72 70 2c  gestData(interp,
8910: 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 45 56 50   objc, objv, EVP
8920: 5f 73 68 61 31 28 29 2c 20 4e 55 4c 4c 2c 20 48  _sha1(), NULL, H
8930: 45 58 5f 46 4f 52 4d 41 54 2c 20 4e 55 4c 4c 29  EX_FORMAT, NULL)
8940: 3b 0a 7d 0a 0a 69 6e 74 20 44 69 67 65 73 74 53  ;.}..int DigestS
8950: 48 41 32 35 36 43 6d 64 28 43 6c 69 65 6e 74 44  HA256Cmd(ClientD
8960: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
8970: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
8980: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
8990: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
89a0: 76 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 72  v[]) {.    retur
89b0: 6e 20 54 6c 73 5f 44 69 67 65 73 74 44 61 74 61  n Tls_DigestData
89c0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f  (interp, objc, o
89d0: 62 6a 76 2c 20 45 56 50 5f 73 68 61 32 35 36 28  bjv, EVP_sha256(
89e0: 29 2c 20 4e 55 4c 4c 2c 20 48 45 58 5f 46 4f 52  ), NULL, HEX_FOR
89f0: 4d 41 54 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 69  MAT, NULL);.}..i
8a00: 6e 74 20 44 69 67 65 73 74 53 48 41 35 31 32 43  nt DigestSHA512C
8a10: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  md(ClientData cl
8a20: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e  ientData, Tcl_In
8a30: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
8a40: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
8a50: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b  *const objv[]) {
8a60: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 6c 73 5f  .    return Tls_
8a70: 44 69 67 65 73 74 44 61 74 61 28 69 6e 74 65 72  DigestData(inter
8a80: 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 45  p, objc, objv, E
8a90: 56 50 5f 73 68 61 35 31 32 28 29 2c 20 4e 55 4c  VP_sha512(), NUL
8aa0: 4c 2c 20 48 45 58 5f 46 4f 52 4d 41 54 2c 20 4e  L, HEX_FORMAT, N
8ab0: 55 4c 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d  ULL);.}../*. *--
8ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b00: 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 44 69 67 65  -. *. * Tls_Dige
8b10: 73 74 43 6f 6d 6d 61 6e 64 73 20 2d 2d 0a 20 2a  stCommands --. *
8b20: 0a 20 2a 09 43 72 65 61 74 65 20 64 69 67 65 73  . *.Create diges
8b30: 74 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a  t commands. *. *
8b40: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c   Returns:. *.TCL
8b50: 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52  _OK or TCL_ERROR
8b60: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
8b70: 63 74 73 3a 0a 20 2a 09 43 72 65 61 74 65 73 20  cts:. *.Creates 
8b80: 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 2d 2d  commands. *. *--
8b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8bd0: 2d 0a 20 2a 2f 0a 69 6e 74 20 54 6c 73 5f 44 69  -. */.int Tls_Di
8be0: 67 65 73 74 43 6f 6d 6d 61 6e 64 73 28 54 63 6c  gestCommands(Tcl
8bf0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
8c00: 20 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74   {.    Tcl_Creat
8c10: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
8c20: 72 70 2c 20 22 74 6c 73 3a 3a 64 69 67 65 73 74  rp, "tls::digest
8c30: 22 2c 20 44 69 67 65 73 74 4f 62 6a 43 6d 64 2c  ", DigestObjCmd,
8c40: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c   (ClientData) 0,
8c50: 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
8c60: 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
8c70: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
8c80: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
8c90: 74 6c 73 3a 3a 63 6d 61 63 22 2c 20 43 4d 41 43  tls::cmac", CMAC
8ca0: 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44  ObjCmd, (ClientD
8cb0: 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64  ata) 0, (Tcl_Cmd
8cc0: 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
8cd0: 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65  LL);.    Tcl_Cre
8ce0: 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
8cf0: 74 65 72 70 2c 20 22 74 6c 73 3a 3a 68 6d 61 63  terp, "tls::hmac
8d00: 22 2c 20 48 4d 41 43 4f 62 6a 43 6d 64 2c 20 28  ", HMACObjCmd, (
8d10: 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28  ClientData) 0, (
8d20: 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
8d30: 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  c *) NULL);.    
8d40: 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
8d50: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c  mand(interp, "tl
8d60: 73 3a 3a 6d 64 34 22 2c 20 44 69 67 65 73 74 4d  s::md4", DigestM
8d70: 44 34 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61  D4Cmd, (ClientDa
8d80: 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44  ta) 0, (Tcl_CmdD
8d90: 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
8da0: 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  L);.    Tcl_Crea
8db0: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
8dc0: 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 64 35 22 2c  erp, "tls::md5",
8dd0: 20 44 69 67 65 73 74 4d 44 35 43 6d 64 2c 20 28   DigestMD5Cmd, (
8de0: 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28  ClientData) 0, (
8df0: 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
8e00: 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  c *) NULL);.    
8e10: 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
8e20: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c  mand(interp, "tl
8e30: 73 3a 3a 73 68 61 31 22 2c 20 44 69 67 65 73 74  s::sha1", Digest
8e40: 53 48 41 31 43 6d 64 2c 20 28 43 6c 69 65 6e 74  SHA1Cmd, (Client
8e50: 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d  Data) 0, (Tcl_Cm
8e60: 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
8e70: 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72  ULL);.    Tcl_Cr
8e80: 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
8e90: 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 68 61  nterp, "tls::sha
8ea0: 32 35 36 22 2c 20 44 69 67 65 73 74 53 48 41 32  256", DigestSHA2
8eb0: 35 36 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61  56Cmd, (ClientDa
8ec0: 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44  ta) 0, (Tcl_CmdD
8ed0: 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
8ee0: 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  L);.    Tcl_Crea
8ef0: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
8f00: 65 72 70 2c 20 22 74 6c 73 3a 3a 73 68 61 35 31  erp, "tls::sha51
8f10: 32 22 2c 20 44 69 67 65 73 74 53 48 41 35 31 32  2", DigestSHA512
8f20: 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  Cmd, (ClientData
8f30: 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ) 0, (Tcl_CmdDel
8f40: 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
8f50: 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
8f60: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
8f70: 70 2c 20 22 74 6c 73 3a 3a 75 6e 73 74 61 63 6b  p, "tls::unstack
8f80: 22 2c 20 55 6e 73 74 61 63 6b 4f 62 6a 43 6d 64  ", UnstackObjCmd
8f90: 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30  , (ClientData) 0
8fa0: 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
8fb0: 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Proc *) NULL);. 
8fc0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
8fd0: 3b 0a 7d 0a 0a                                   ;.}..