Hex Artifact Content

Artifact 03763b15bf10201cb6b3ce770c44eaeabf93f8202819333b18f633709bd54886:


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 61  x = "0123456789a
0180: 62 63 64 65 66 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 43 48 41 4e 5f 45 4f 46  #define CHAN_EOF
01c0: 20 30 78 31 30 0a 0a 2f 2a 20 44 69 67 65 73 74   0x10../* Digest
01d0: 20 66 6f 72 6d 61 74 20 61 6e 64 20 6f 70 65 72   format and oper
01e0: 61 74 69 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65  ation */.#define
01f0: 20 42 49 4e 5f 46 4f 52 4d 41 54 20 30 78 30 31   BIN_FORMAT 0x01
0200: 0a 23 64 65 66 69 6e 65 20 48 45 58 5f 46 4f 52  .#define HEX_FOR
0210: 4d 41 54 20 30 78 30 32 0a 23 64 65 66 69 6e 65  MAT 0x02.#define
0220: 20 54 59 50 45 5f 4d 44 20 20 20 20 30 78 31 30   TYPE_MD    0x10
0230: 0a 23 64 65 66 69 6e 65 20 54 59 50 45 5f 48 4d  .#define TYPE_HM
0240: 41 43 20 20 30 78 32 30 0a 23 64 65 66 69 6e 65  AC  0x20.#define
0250: 20 54 59 50 45 5f 43 4d 41 43 20 20 30 78 34 30   TYPE_CMAC  0x40
0260: 0a 0a 2f 2a 0a 20 2a 20 54 68 69 73 20 73 74 72  ../*. * This str
0270: 75 63 74 75 72 65 20 64 65 66 69 6e 65 73 20 74  ucture defines t
0280: 68 65 20 70 65 72 2d 69 6e 73 74 61 6e 63 65 20  he per-instance 
0290: 73 74 61 74 65 20 6f 66 20 61 20 64 69 67 65 73  state of a diges
02a0: 74 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 2a 2f  t operation.. */
02b0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
02c0: 44 69 67 65 73 74 53 74 61 74 65 20 7b 0a 09 54  DigestState {..T
02d0: 63 6c 5f 43 68 61 6e 6e 65 6c 20 73 65 6c 66 3b  cl_Channel self;
02e0: 09 2f 2a 20 54 68 69 73 20 73 6f 63 6b 65 74 20  ./* This socket 
02f0: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 09 54 63 6c 5f  channel */..Tcl_
0300: 54 69 6d 65 72 54 6f 6b 65 6e 20 74 69 6d 65 72  TimerToken timer
0310: 3b 09 2f 2a 20 54 69 6d 65 72 20 66 6f 72 20 72  ;./* Timer for r
0320: 65 61 64 20 65 76 65 6e 74 73 20 2a 2f 0a 0a 09  ead events */...
0330: 69 6e 74 20 66 6c 61 67 73 3b 09 09 2f 2a 20 43  int flags;../* C
0340: 68 61 6e 20 63 6f 6e 66 69 67 20 66 6c 61 67 73  han config flags
0350: 20 2a 2f 0a 09 69 6e 74 20 77 61 74 63 68 4d 61   */..int watchMa
0360: 73 6b 3b 09 09 2f 2a 20 43 75 72 72 65 6e 74 20  sk;../* Current 
0370: 57 61 74 63 68 50 72 6f 63 20 6d 61 73 6b 20 2a  WatchProc mask *
0380: 2f 0a 09 69 6e 74 20 6d 6f 64 65 3b 09 09 2f 2a  /..int mode;../*
0390: 20 43 75 72 72 65 6e 74 20 6d 6f 64 65 20 6f 66   Current mode of
03a0: 20 70 61 72 65 6e 74 20 63 68 61 6e 6e 65 6c 20   parent channel 
03b0: 2a 2f 0a 09 69 6e 74 20 66 6f 72 6d 61 74 3b 09  */..int format;.
03c0: 09 2f 2a 20 44 69 67 65 73 74 20 66 6f 72 6d 61  ./* Digest forma
03d0: 74 20 61 6e 64 20 6f 70 65 72 61 74 69 6f 6e 20  t and operation 
03e0: 2a 2f 0a 0a 09 54 63 6c 5f 49 6e 74 65 72 70 20  */...Tcl_Interp 
03f0: 2a 69 6e 74 65 72 70 3b 09 2f 2a 20 43 75 72 72  *interp;./* Curr
0400: 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72 20  ent interpreter 
0410: 2a 2f 0a 09 45 56 50 5f 4d 44 5f 43 54 58 20 2a  */..EVP_MD_CTX *
0420: 63 74 78 3b 09 2f 2a 20 4d 44 20 43 6f 6e 74 65  ctx;./* MD Conte
0430: 78 74 20 2a 2f 0a 09 48 4d 41 43 5f 43 54 58 20  xt */..HMAC_CTX 
0440: 2a 68 63 74 78 3b 09 09 2f 2a 20 48 4d 41 43 20  *hctx;../* HMAC 
0450: 43 6f 6e 74 65 78 74 20 2a 2f 0a 09 43 4d 41 43  Context */..CMAC
0460: 5f 43 54 58 20 2a 63 63 74 78 3b 09 09 2f 2a 20  _CTX *cctx;../* 
0470: 43 4d 41 43 20 43 6f 6e 74 65 78 74 20 2a 2f 0a  CMAC Context */.
0480: 09 54 63 6c 5f 43 6f 6d 6d 61 6e 64 20 74 6f 6b  .Tcl_Command tok
0490: 65 6e 3b 09 2f 2a 20 43 6f 6d 6d 61 6e 64 20 74  en;./* Command t
04a0: 6f 6b 65 6e 20 2a 2f 0a 7d 20 44 69 67 65 73 74  oken */.} Digest
04b0: 53 74 61 74 65 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  State;../*. *---
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 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
04e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
04f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0500: 0a 20 2a 0a 20 2a 20 54 6c 73 5f 44 69 67 65 73  . *. * Tls_Diges
0510: 74 4e 65 77 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  tNew --. *. *.Th
0520: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 72 65 61  is function crea
0530: 74 65 73 20 61 20 64 69 67 65 73 74 20 73 74 61  tes a digest sta
0540: 74 65 20 73 74 72 75 63 74 75 72 65 0a 20 2a 0a  te structure. *.
0550: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 44   * Returns:. *.D
0560: 69 67 65 73 74 20 73 74 72 75 63 74 75 72 65 20  igest structure 
0570: 70 6f 69 6e 74 65 72 0a 20 2a 0a 20 2a 20 53 69  pointer. *. * Si
0580: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
0590: 72 65 61 74 65 73 20 73 74 72 75 63 74 75 72 65  reates structure
05a0: 0a 20 2a 0a 20 2a 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: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44 69  ---------. */.Di
05f0: 67 65 73 74 53 74 61 74 65 20 2a 54 6c 73 5f 44  gestState *Tls_D
0600: 69 67 65 73 74 4e 65 77 28 54 63 6c 5f 49 6e 74  igestNew(Tcl_Int
0610: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
0620: 20 66 6f 72 6d 61 74 29 20 7b 0a 20 20 20 20 44   format) {.    D
0630: 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74  igestState *stat
0640: 65 50 74 72 3b 0a 0a 20 20 20 20 73 74 61 74 65  ePtr;..    state
0650: 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 61  Ptr = (DigestSta
0660: 74 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75  te *) ckalloc((u
0670: 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 6f 66 28  nsigned) sizeof(
0680: 44 69 67 65 73 74 53 74 61 74 65 29 29 3b 0a 20  DigestState));. 
0690: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 20     if (statePtr 
06a0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6d 65 6d 73  != NULL) {..mems
06b0: 65 74 28 73 74 61 74 65 50 74 72 2c 20 30 2c 20  et(statePtr, 0, 
06c0: 73 69 7a 65 6f 66 28 44 69 67 65 73 74 53 74 61  sizeof(DigestSta
06d0: 74 65 29 29 3b 0a 09 73 74 61 74 65 50 74 72 2d  te));..statePtr-
06e0: 3e 73 65 6c 66 09 3d 20 4e 55 4c 4c 3b 09 09 2f  >self.= NULL;../
06f0: 2a 20 54 68 69 73 20 73 6f 63 6b 65 74 20 63 68  * This socket ch
0700: 61 6e 6e 65 6c 20 2a 2f 0a 09 73 74 61 74 65 50  annel */..stateP
0710: 74 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c 4c  tr->timer = NULL
0720: 3b 09 09 2f 2a 20 54 69 6d 65 72 20 74 6f 20 66  ;../* Timer to f
0730: 6c 75 73 68 20 64 61 74 61 20 2a 2f 0a 09 73 74  lush data */..st
0740: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 3d 20  atePtr->flags = 
0750: 30 3b 09 09 2f 2a 20 43 68 61 6e 20 63 6f 6e 66  0;../* Chan conf
0760: 69 67 20 66 6c 61 67 73 20 2a 2f 0a 09 73 74 61  ig flags */..sta
0770: 74 65 50 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b  tePtr->watchMask
0780: 20 3d 20 30 3b 09 2f 2a 20 43 75 72 72 65 6e 74   = 0;./* Current
0790: 20 57 61 74 63 68 50 72 6f 63 20 6d 61 73 6b 20   WatchProc mask 
07a0: 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 6d 6f  */..statePtr->mo
07b0: 64 65 09 3d 20 30 3b 09 09 2f 2a 20 43 75 72 72  de.= 0;../* Curr
07c0: 65 6e 74 20 6d 6f 64 65 20 6f 66 20 70 61 72 65  ent mode of pare
07d0: 6e 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 09 73  nt channel */..s
07e0: 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20  tatePtr->format 
07f0: 3d 20 66 6f 72 6d 61 74 3b 09 2f 2a 20 44 69 67  = format;./* Dig
0800: 65 73 74 20 66 6f 72 6d 61 74 20 61 6e 64 20 6f  est format and o
0810: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 09 73 74 61  peration */..sta
0820: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 20 3d 20  tePtr->interp = 
0830: 69 6e 74 65 72 70 3b 09 2f 2a 20 43 75 72 72 65  interp;./* Curre
0840: 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a  nt interpreter *
0850: 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 74 78  /..statePtr->ctx
0860: 20 3d 20 4e 55 4c 4c 3b 09 09 2f 2a 20 4d 44 20   = NULL;../* MD 
0870: 43 6f 6e 74 65 78 74 20 2a 2f 0a 09 73 74 61 74  Context */..stat
0880: 65 50 74 72 2d 3e 68 63 74 78 20 3d 20 4e 55 4c  ePtr->hctx = NUL
0890: 4c 3b 09 09 2f 2a 20 48 4d 41 43 20 43 6f 6e 74  L;../* HMAC Cont
08a0: 65 78 74 20 2a 2f 0a 09 73 74 61 74 65 50 74 72  ext */..statePtr
08b0: 2d 3e 63 63 74 78 20 3d 20 4e 55 4c 4c 3b 09 09  ->cctx = NULL;..
08c0: 2f 2a 20 43 4d 41 43 20 43 6f 6e 74 65 78 74 20  /* CMAC Context 
08d0: 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 6f  */..statePtr->to
08e0: 6b 65 6e 20 3d 20 4e 55 4c 4c 3b 09 09 2f 2a 20  ken = NULL;../* 
08f0: 43 6f 6d 6d 61 6e 64 20 74 6f 6b 65 6e 20 2a 2f  Command token */
0900: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
0910: 6e 20 73 74 61 74 65 50 74 72 3b 0a 7d 0a 0a 2f  n statePtr;.}../
0920: 2a 0a 20 2a 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 2d 2d  ----------------
0940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0960: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c  -------. *. * Tl
0970: 73 5f 44 69 67 65 73 74 46 72 65 65 20 2d 2d 0a  s_DigestFree --.
0980: 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74   *. *.This funct
0990: 69 6f 6e 20 72 65 6d 6f 76 65 73 20 61 20 64 69  ion removes a di
09a0: 67 65 73 74 20 73 74 61 74 65 20 73 74 72 75 63  gest state struc
09b0: 74 75 72 65 0a 20 2a 0a 20 2a 20 52 65 74 75 72  ture. *. * Retur
09c0: 6e 73 3a 0a 20 2a 09 4e 6f 74 68 69 6e 67 0a 20  ns:. *.Nothing. 
09d0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
09e0: 73 3a 0a 20 2a 09 52 65 6d 6f 76 65 73 20 73 74  s:. *.Removes st
09f0: 72 75 63 74 75 72 65 0a 20 2a 0a 20 2a 2d 2d 2d  ructure. *. *---
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 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a40: 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f 44 69  . */.void Tls_Di
0a50: 67 65 73 74 46 72 65 65 28 44 69 67 65 73 74 53  gestFree(DigestS
0a60: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 29 20  tate *statePtr) 
0a70: 7b 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  {.    if (stateP
0a80: 74 72 20 3d 3d 20 28 44 69 67 65 73 74 53 74 61  tr == (DigestSta
0a90: 74 65 20 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 72  te *) NULL) {..r
0aa0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20  eturn;.    }..  
0ab0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
0ac0: 63 74 78 20 21 3d 20 28 45 56 50 5f 4d 44 5f 43  ctx != (EVP_MD_C
0ad0: 54 58 20 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 45  TX *) NULL) {..E
0ae0: 56 50 5f 4d 44 5f 43 54 58 5f 66 72 65 65 28 73  VP_MD_CTX_free(s
0af0: 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20  tatePtr->ctx);. 
0b00: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61     }.    if (sta
0b10: 74 65 50 74 72 2d 3e 68 63 74 78 20 21 3d 20 28  tePtr->hctx != (
0b20: 48 4d 41 43 5f 43 54 58 20 2a 29 20 4e 55 4c 4c  HMAC_CTX *) NULL
0b30: 29 20 7b 0a 09 48 4d 41 43 5f 43 54 58 5f 66 72  ) {..HMAC_CTX_fr
0b40: 65 65 28 73 74 61 74 65 50 74 72 2d 3e 68 63 74  ee(statePtr->hct
0b50: 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  x);.    }.    if
0b60: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 63 74 78   (statePtr->cctx
0b70: 20 21 3d 20 28 43 4d 41 43 5f 43 54 58 20 2a 29   != (CMAC_CTX *)
0b80: 20 4e 55 4c 4c 29 20 7b 0a 09 43 4d 41 43 5f 43   NULL) {..CMAC_C
0b90: 54 58 5f 66 72 65 65 28 73 74 61 74 65 50 74 72  TX_free(statePtr
0ba0: 2d 3e 63 63 74 78 29 3b 0a 20 20 20 20 7d 0a 20  ->cctx);.    }. 
0bb0: 20 20 20 63 6b 66 72 65 65 28 73 74 61 74 65 50     ckfree(stateP
0bc0: 74 72 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  tr);.}../*******
0bd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0be0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0bf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
0c10: 2a 0a 20 2a 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 2d 2d  ----------------
0c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c50: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c  -------. *. * Tl
0c60: 73 5f 44 69 67 65 73 74 49 6e 69 74 20 2d 2d 0a  s_DigestInit --.
0c70: 20 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65   *. *.Initialize
0c80: 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e   a hash function
0c90: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a  . *. * Returns:.
0ca0: 20 2a 09 54 43 4c 5f 4f 4b 20 69 66 20 73 75 63   *.TCL_OK if suc
0cb0: 63 65 73 73 66 75 6c 20 6f 72 20 54 43 4c 5f 45  cessful or TCL_E
0cc0: 52 52 4f 52 20 66 6f 72 20 66 61 69 6c 75 72 65  RROR for failure
0cd0: 20 77 69 74 68 20 72 65 73 75 6c 74 20 73 65 74   with result set
0ce0: 0a 20 2a 09 74 6f 20 65 72 72 6f 72 20 6d 65 73  . *.to error mes
0cf0: 73 61 67 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  sage.. *. * Side
0d00: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 20   effects:. *.No 
0d10: 72 65 73 75 6c 74 20 6f 72 20 65 72 72 6f 72 20  result or error 
0d20: 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d  message. *. *---
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 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d70: 0a 20 2a 2f 0a 69 6e 74 20 54 6c 73 5f 44 69 67  . */.int Tls_Dig
0d80: 65 73 74 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  estInit(Tcl_Inte
0d90: 72 70 20 2a 69 6e 74 65 72 70 2c 20 44 69 67 65  rp *interp, Dige
0da0: 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74  stState *statePt
0db0: 72 2c 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20  r, const EVP_MD 
0dc0: 2a 6d 64 2c 0a 09 63 6f 6e 73 74 20 45 56 50 5f  *md,..const EVP_
0dd0: 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 2c 20  CIPHER *cipher, 
0de0: 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4f 62 6a 29  Tcl_Obj *keyObj)
0df0: 20 7b 0a 20 20 20 20 69 6e 74 20 6b 65 79 5f 6c   {.    int key_l
0e00: 65 6e 20 3d 20 30 2c 20 72 65 73 20 3d 20 30 3b  en = 0, res = 0;
0e10: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  .    const unsig
0e20: 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 3b 0a 0a  ned char *key;..
0e30: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 6d 65      /* Create me
0e40: 73 73 61 67 65 20 64 69 67 65 73 74 20 63 6f 6e  ssage digest con
0e50: 74 65 78 74 20 2a 2f 0a 20 20 20 20 69 66 20 28  text */.    if (
0e60: 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74  statePtr->format
0e70: 20 26 20 54 59 50 45 5f 4d 44 29 20 7b 0a 09 73   & TYPE_MD) {..s
0e80: 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 45  tatePtr->ctx = E
0e90: 56 50 5f 4d 44 5f 43 54 58 5f 6e 65 77 28 29 3b  VP_MD_CTX_new();
0ea0: 0a 09 72 65 73 20 3d 20 28 73 74 61 74 65 50 74  ..res = (statePt
0eb0: 72 2d 3e 63 74 78 20 21 3d 20 4e 55 4c 4c 29 3b  r->ctx != NULL);
0ec0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
0ed0: 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74  statePtr->format
0ee0: 20 26 20 54 59 50 45 5f 48 4d 41 43 29 20 7b 0a   & TYPE_HMAC) {.
0ef0: 09 73 74 61 74 65 50 74 72 2d 3e 68 63 74 78 20  .statePtr->hctx 
0f00: 3d 20 48 4d 41 43 5f 43 54 58 5f 6e 65 77 28 29  = HMAC_CTX_new()
0f10: 3b 0a 09 72 65 73 20 3d 20 28 73 74 61 74 65 50  ;..res = (stateP
0f20: 74 72 2d 3e 68 63 74 78 20 21 3d 20 4e 55 4c 4c  tr->hctx != NULL
0f30: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  );.    } else if
0f40: 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d   (statePtr->form
0f50: 61 74 20 26 20 54 59 50 45 5f 43 4d 41 43 29 20  at & TYPE_CMAC) 
0f60: 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 63 74  {..statePtr->cct
0f70: 78 20 3d 20 43 4d 41 43 5f 43 54 58 5f 6e 65 77  x = CMAC_CTX_new
0f80: 28 29 3b 0a 09 72 65 73 20 3d 20 28 73 74 61 74  ();..res = (stat
0f90: 65 50 74 72 2d 3e 63 63 74 78 20 21 3d 20 4e 55  ePtr->cctx != NU
0fa0: 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  LL);.    }.    i
0fb0: 66 20 28 21 72 65 73 29 20 7b 0a 09 54 63 6c 5f  f (!res) {..Tcl_
0fc0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
0fd0: 65 72 70 2c 20 22 43 72 65 61 74 65 20 63 6f 6e  erp, "Create con
0fe0: 74 65 78 74 20 66 61 69 6c 65 64 3a 20 22 2c 20  text failed: ", 
0ff0: 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b  REASON(), NULL);
1000: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
1010: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
1020: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 68 61 73  * Initialize has
1030: 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  h function */.  
1040: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
1050: 66 6f 72 6d 61 74 20 26 20 54 59 50 45 5f 4d 44  format & TYPE_MD
1060: 29 20 7b 0a 09 72 65 73 20 3d 20 45 56 50 5f 44  ) {..res = EVP_D
1070: 69 67 65 73 74 49 6e 69 74 5f 65 78 28 73 74 61  igestInit_ex(sta
1080: 74 65 50 74 72 2d 3e 63 74 78 2c 20 6d 64 2c 20  tePtr->ctx, md, 
1090: 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 20 65 6c 73  NULL);.    } els
10a0: 65 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e  e if (statePtr->
10b0: 66 6f 72 6d 61 74 20 26 20 54 59 50 45 5f 48 4d  format & TYPE_HM
10c0: 41 43 29 20 7b 0a 09 6b 65 79 20 3d 20 54 63 6c  AC) {..key = Tcl
10d0: 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
10e0: 6d 4f 62 6a 28 6b 65 79 4f 62 6a 2c 20 26 6b 65  mObj(keyObj, &ke
10f0: 79 5f 6c 65 6e 29 3b 0a 09 72 65 73 20 3d 20 48  y_len);..res = H
1100: 4d 41 43 5f 49 6e 69 74 5f 65 78 28 73 74 61 74  MAC_Init_ex(stat
1110: 65 50 74 72 2d 3e 68 63 74 78 2c 20 28 63 6f 6e  ePtr->hctx, (con
1120: 73 74 20 76 6f 69 64 20 2a 29 20 6b 65 79 2c 20  st void *) key, 
1130: 6b 65 79 5f 6c 65 6e 2c 20 6d 64 2c 20 4e 55 4c  key_len, md, NUL
1140: 4c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  L);.    } else i
1150: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6f 72  f (statePtr->for
1160: 6d 61 74 20 26 20 54 59 50 45 5f 43 4d 41 43 29  mat & TYPE_CMAC)
1170: 20 7b 0a 09 6b 65 79 20 3d 20 54 63 6c 5f 47 65   {..key = Tcl_Ge
1180: 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62  tByteArrayFromOb
1190: 6a 28 6b 65 79 4f 62 6a 2c 20 26 6b 65 79 5f 6c  j(keyObj, &key_l
11a0: 65 6e 29 3b 0a 09 72 65 73 20 3d 20 43 4d 41 43  en);..res = CMAC
11b0: 5f 49 6e 69 74 28 73 74 61 74 65 50 74 72 2d 3e  _Init(statePtr->
11c0: 63 63 74 78 2c 20 28 63 6f 6e 73 74 20 76 6f 69  cctx, (const voi
11d0: 64 20 2a 29 20 6b 65 79 2c 20 6b 65 79 5f 6c 65  d *) key, key_le
11e0: 6e 2c 20 63 69 70 68 65 72 2c 20 4e 55 4c 4c 29  n, cipher, NULL)
11f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
1200: 21 72 65 73 29 20 7b 0a 09 54 63 6c 5f 41 70 70  !res) {..Tcl_App
1210: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1220: 2c 20 22 49 6e 69 74 69 61 6c 69 7a 65 20 66 61  , "Initialize fa
1230: 69 6c 65 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28  iled: ", REASON(
1240: 29 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  ), NULL);..retur
1250: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
1260: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43   }.    return TC
1270: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d  L_OK;.}../*. *--
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c0: 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 44 69 67 65  -. *. * Tls_Dige
12d0: 73 74 55 70 64 61 74 65 20 2d 2d 0a 20 2a 0a 20  stUpdate --. *. 
12e0: 2a 09 55 70 64 61 74 65 20 61 20 68 61 73 68 20  *.Update a hash 
12f0: 66 75 6e 63 74 69 6f 6e 0a 20 2a 0a 20 2a 20 52  function. *. * R
1300: 65 74 75 72 6e 73 3a 0a 20 2a 09 31 20 69 66 20  eturns:. *.1 if 
1310: 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 30 20  successful or 0 
1320: 66 6f 72 20 66 61 69 6c 75 72 65 0a 20 2a 0a 20  for failure. *. 
1330: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
1340: 20 2a 09 41 64 64 73 20 62 75 66 20 74 6f 20 68   *.Adds buf to h
1350: 61 73 68 20 66 75 6e 63 74 69 6f 6e 0a 20 2a 0a  ash function. *.
1360: 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13a0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 54 6c  -----. */.int Tl
13b0: 73 5f 44 69 67 65 73 74 55 70 64 61 74 65 28 44  s_DigestUpdate(D
13c0: 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74  igestState *stat
13d0: 65 50 74 72 2c 20 63 68 61 72 20 2a 62 75 66 2c  ePtr, char *buf,
13e0: 20 73 69 7a 65 5f 74 20 72 65 61 64 2c 20 69 6e   size_t read, in
13f0: 74 20 73 68 6f 77 29 20 7b 0a 20 20 20 20 69 6e  t show) {.    in
1400: 74 20 72 65 73 20 3d 20 30 3b 0a 0a 20 20 20 20  t res = 0;..    
1410: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6f  if (statePtr->fo
1420: 72 6d 61 74 20 26 20 54 59 50 45 5f 4d 44 29 20  rmat & TYPE_MD) 
1430: 7b 0a 09 72 65 73 20 3d 20 45 56 50 5f 44 69 67  {..res = EVP_Dig
1440: 65 73 74 55 70 64 61 74 65 28 73 74 61 74 65 50  estUpdate(stateP
1450: 74 72 2d 3e 63 74 78 2c 20 62 75 66 2c 20 72 65  tr->ctx, buf, re
1460: 61 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ad);.    } else 
1470: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6f  if (statePtr->fo
1480: 72 6d 61 74 20 26 20 54 59 50 45 5f 48 4d 41 43  rmat & TYPE_HMAC
1490: 29 20 7b 0a 09 72 65 73 20 3d 20 48 4d 41 43 5f  ) {..res = HMAC_
14a0: 55 70 64 61 74 65 28 73 74 61 74 65 50 74 72 2d  Update(statePtr-
14b0: 3e 68 63 74 78 2c 20 62 75 66 2c 20 72 65 61 64  >hctx, buf, read
14c0: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  );.    } else if
14d0: 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d   (statePtr->form
14e0: 61 74 20 26 20 54 59 50 45 5f 43 4d 41 43 29 20  at & TYPE_CMAC) 
14f0: 7b 0a 09 72 65 73 20 3d 20 43 4d 41 43 5f 55 70  {..res = CMAC_Up
1500: 64 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 63  date(statePtr->c
1510: 63 74 78 2c 20 62 75 66 2c 20 72 65 61 64 29 3b  ctx, buf, read);
1520: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21  .    }.    if (!
1530: 72 65 73 20 26 26 20 73 68 6f 77 29 20 7b 0a 09  res && show) {..
1540: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1550: 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72  (statePtr->inter
1560: 70 2c 20 22 55 70 64 61 74 65 20 66 61 69 6c 65  p, "Update faile
1570: 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20  d: ", REASON(), 
1580: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
1590: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
15a0: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a      return res;.
15b0: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
15c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
1600: 2a 20 54 6c 73 5f 44 69 67 65 73 74 46 69 6e 69  * Tls_DigestFini
1610: 61 6c 69 7a 65 20 2d 2d 0a 20 2a 0a 20 2a 09 46  alize --. *. *.F
1620: 69 6e 61 6c 69 7a 65 20 61 20 68 61 73 68 20 66  inalize a hash f
1630: 75 6e 63 74 69 6f 6e 20 61 6e 64 20 67 65 6e 65  unction and gene
1640: 72 61 74 65 20 61 20 6d 65 73 73 61 67 65 20 64  rate a message d
1650: 69 67 65 73 74 0a 20 2a 0a 20 2a 20 52 65 74 75  igest. *. * Retu
1660: 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 69  rns:. *.TCL_OK i
1670: 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20  f successful or 
1680: 54 43 4c 5f 45 52 52 4f 52 20 66 6f 72 20 66 61  TCL_ERROR for fa
1690: 69 6c 75 72 65 20 77 69 74 68 20 72 65 73 75 6c  ilure with resul
16a0: 74 20 73 65 74 0a 20 2a 09 74 6f 20 65 72 72 6f  t set. *.to erro
16b0: 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a  r message.. *. *
16c0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
16d0: 2a 09 53 65 74 73 20 72 65 73 75 6c 74 20 74 6f  *.Sets result to
16e0: 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20   message digest 
16f0: 66 6f 72 20 68 61 73 68 20 66 75 6e 63 74 69 6f  for hash functio
1700: 6e 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 6d 65  n or an error me
1710: 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  ssage.. *. *----
1720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1760: 20 2a 2f 0a 0a 69 6e 74 20 54 6c 73 5f 44 69 67   */..int Tls_Dig
1770: 65 73 74 46 69 6e 69 61 6c 69 7a 65 28 54 63 6c  estFinialize(Tcl
1780: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1790: 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74   DigestState *st
17a0: 61 74 65 50 74 72 29 20 7b 0a 20 20 20 20 75 6e  atePtr) {.    un
17b0: 73 69 67 6e 65 64 20 63 68 61 72 20 6d 64 5f 62  signed char md_b
17c0: 75 66 5b 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49  uf[EVP_MAX_MD_SI
17d0: 5a 45 5d 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  ZE];.    unsigne
17e0: 64 20 69 6e 74 20 6d 64 5f 6c 65 6e 3b 0a 20 20  d int md_len;.  
17f0: 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 0a    int res = 0;..
1800: 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20      /* Finalize 
1810: 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 61 6e  hash function an
1820: 64 20 63 61 6c 63 75 6c 61 74 65 20 6d 65 73 73  d calculate mess
1830: 61 67 65 20 64 69 67 65 73 74 20 2a 2f 0a 20 20  age digest */.  
1840: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
1850: 66 6f 72 6d 61 74 20 26 20 54 59 50 45 5f 4d 44  format & TYPE_MD
1860: 29 20 7b 0a 09 72 65 73 20 3d 20 45 56 50 5f 44  ) {..res = EVP_D
1870: 69 67 65 73 74 46 69 6e 61 6c 5f 65 78 28 73 74  igestFinal_ex(st
1880: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 6d 64 5f  atePtr->ctx, md_
1890: 62 75 66 2c 20 26 6d 64 5f 6c 65 6e 29 3b 0a 20  buf, &md_len);. 
18a0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
18b0: 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26  atePtr->format &
18c0: 20 54 59 50 45 5f 48 4d 41 43 29 20 7b 0a 09 72   TYPE_HMAC) {..r
18d0: 65 73 20 3d 20 48 4d 41 43 5f 46 69 6e 61 6c 28  es = HMAC_Final(
18e0: 73 74 61 74 65 50 74 72 2d 3e 68 63 74 78 2c 20  statePtr->hctx, 
18f0: 6d 64 5f 62 75 66 2c 20 26 6d 64 5f 6c 65 6e 29  md_buf, &md_len)
1900: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ;.    } else if 
1910: 28 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61  (statePtr->forma
1920: 74 20 26 20 54 59 50 45 5f 43 4d 41 43 29 20 7b  t & TYPE_CMAC) {
1930: 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 3b 0a 09 72  ..size_t len;..r
1940: 65 73 20 3d 20 43 4d 41 43 5f 46 69 6e 61 6c 28  es = CMAC_Final(
1950: 73 74 61 74 65 50 74 72 2d 3e 63 63 74 78 2c 20  statePtr->cctx, 
1960: 6d 64 5f 62 75 66 2c 20 26 6c 65 6e 29 3b 0a 09  md_buf, &len);..
1970: 6d 64 5f 6c 65 6e 20 3d 20 28 75 6e 73 69 67 6e  md_len = (unsign
1980: 65 64 20 69 6e 74 29 20 6c 65 6e 3b 0a 20 20 20  ed int) len;.   
1990: 20 7d 0a 20 20 20 20 69 66 20 28 21 72 65 73 29   }.    if (!res)
19a0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
19b0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 46 69  sult(interp, "Fi
19c0: 6e 61 6c 69 7a 65 20 66 61 69 6c 65 64 3a 20 22  nalize failed: "
19d0: 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c  , REASON(), NULL
19e0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
19f0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
1a00: 20 2f 2a 20 52 65 74 75 72 6e 20 6d 65 73 73 61   /* Return messa
1a10: 67 65 20 64 69 67 65 73 74 20 61 73 20 65 69 74  ge digest as eit
1a20: 68 65 72 20 61 20 62 69 6e 61 72 79 20 6f 72 20  her a binary or 
1a30: 68 65 78 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  hex string */.  
1a40: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
1a50: 66 6f 72 6d 61 74 20 26 20 42 49 4e 5f 46 4f 52  format & BIN_FOR
1a60: 4d 41 54 29 20 7b 0a 09 54 63 6c 5f 53 65 74 4f  MAT) {..Tcl_SetO
1a70: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
1a80: 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
1a90: 79 4f 62 6a 28 6d 64 5f 62 75 66 2c 20 6d 64 5f  yObj(md_buf, md_
1aa0: 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c  len));..    } el
1ab0: 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72  se {..Tcl_Obj *r
1ac0: 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e  esultObj = Tcl_N
1ad0: 65 77 4f 62 6a 28 29 3b 0a 09 75 6e 73 69 67 6e  ewObj();..unsign
1ae0: 65 64 20 63 68 61 72 20 2a 70 74 72 20 3d 20 54  ed char *ptr = T
1af0: 63 6c 5f 53 65 74 42 79 74 65 41 72 72 61 79 4c  cl_SetByteArrayL
1b00: 65 6e 67 74 68 28 72 65 73 75 6c 74 4f 62 6a 2c  ength(resultObj,
1b10: 20 6d 64 5f 6c 65 6e 2a 32 29 3b 0a 0a 09 66 6f   md_len*2);...fo
1b20: 72 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  r (unsigned int 
1b30: 69 20 3d 20 30 3b 20 69 20 3c 20 6d 64 5f 6c 65  i = 0; i < md_le
1b40: 6e 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 2a  n; i++) {..    *
1b50: 70 74 72 2b 2b 20 3d 20 68 65 78 5b 28 6d 64 5f  ptr++ = hex[(md_
1b60: 62 75 66 5b 69 5d 20 3e 3e 20 34 29 20 26 20 30  buf[i] >> 4) & 0
1b70: 78 30 46 5d 3b 0a 09 20 20 20 20 2a 70 74 72 2b  x0F];..    *ptr+
1b80: 2b 20 3d 20 68 65 78 5b 6d 64 5f 62 75 66 5b 69  + = hex[md_buf[i
1b90: 5d 20 26 20 30 78 30 46 5d 3b 0a 09 7d 0a 09 54  ] & 0x0F];..}..T
1ba0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1bb0: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
1bc0: 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  j);.    }.    re
1bd0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1be0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
1bf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c20: 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  ****/../*. *----
1c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1c70: 20 2a 0a 20 2a 20 54 6c 73 5f 44 69 67 65 73 74   *. * Tls_Digest
1c80: 46 69 6c 65 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65  File --. *. *.Re
1c90: 74 75 72 6e 20 6d 65 73 73 61 67 65 20 64 69 67  turn message dig
1ca0: 65 73 74 20 66 6f 72 20 66 69 6c 65 20 75 73 69  est for file usi
1cb0: 6e 67 20 75 73 65 72 20 73 70 65 63 69 66 69 65  ng user specifie
1cc0: 64 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e  d hash function.
1cd0: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a  . *. * Returns:.
1ce0: 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c   *.TCL_OK or TCL
1cf0: 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64  _ERROR. *. * Sid
1d00: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 52 65  e effects:. *.Re
1d10: 73 75 6c 74 20 69 73 20 6d 65 73 73 61 67 65 20  sult is message 
1d20: 64 69 67 65 73 74 20 6f 72 20 65 72 72 6f 72 20  digest or error 
1d30: 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d  message. *. *---
1d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d80: 0a 20 2a 2f 0a 69 6e 74 20 54 6c 73 5f 44 69 67  . */.int Tls_Dig
1d90: 65 73 74 46 69 6c 65 28 54 63 6c 5f 49 6e 74 65  estFile(Tcl_Inte
1da0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f  rp *interp, Tcl_
1db0: 4f 62 6a 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 63  Obj *filename, c
1dc0: 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 2c  onst EVP_MD *md,
1dd0: 0a 09 63 6f 6e 73 74 20 45 56 50 5f 43 49 50 48  ..const EVP_CIPH
1de0: 45 52 20 2a 63 69 70 68 65 72 2c 20 69 6e 74 20  ER *cipher, int 
1df0: 66 6f 72 6d 61 74 2c 20 54 63 6c 5f 4f 62 6a 20  format, Tcl_Obj 
1e00: 2a 6b 65 79 4f 62 6a 29 20 7b 0a 20 20 20 20 44  *keyObj) {.    D
1e10: 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74  igestState *stat
1e20: 65 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68  ePtr;.    Tcl_Ch
1e30: 61 6e 6e 65 6c 20 63 68 61 6e 20 3d 20 4e 55 4c  annel chan = NUL
1e40: 4c 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  L;.    unsigned 
1e50: 63 68 61 72 20 62 75 66 5b 42 55 46 46 45 52 5f  char buf[BUFFER_
1e60: 53 49 5a 45 5d 3b 0a 20 20 20 20 69 6e 74 20 72  SIZE];.    int r
1e70: 65 73 20 3d 20 54 43 4c 5f 4f 4b 2c 20 6c 65 6e  es = TCL_OK, len
1e80: 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66  ;..    /* Open f
1e90: 69 6c 65 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  ile channel */. 
1ea0: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 46 53     chan = Tcl_FS
1eb0: 4f 70 65 6e 46 69 6c 65 43 68 61 6e 6e 65 6c 28  OpenFileChannel(
1ec0: 69 6e 74 65 72 70 2c 20 66 69 6c 65 6e 61 6d 65  interp, filename
1ed0: 2c 20 22 72 62 22 2c 20 30 34 34 34 29 3b 0a 20  , "rb", 0444);. 
1ee0: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28     if (chan == (
1ef0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
1f00: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  L) {..return TCL
1f10: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
1f20: 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 20     /* Configure 
1f30: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69  channel */.    i
1f40: 66 20 28 28 72 65 73 20 3d 20 54 63 6c 5f 53 65  f ((res = Tcl_Se
1f50: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
1f60: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74  nterp, chan, "-t
1f70: 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69  ranslation", "bi
1f80: 6e 61 72 79 22 29 29 20 3d 3d 20 54 43 4c 5f 45  nary")) == TCL_E
1f90: 52 52 4f 52 29 20 7b 0a 09 67 6f 74 6f 20 64 6f  RROR) {..goto do
1fa0: 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  ne;.    }.    Tc
1fb0: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 42 75 66 66  l_SetChannelBuff
1fc0: 65 72 53 69 7a 65 28 63 68 61 6e 2c 20 42 55 46  erSize(chan, BUF
1fd0: 46 45 52 5f 53 49 5a 45 29 3b 0a 0a 20 20 20 20  FER_SIZE);..    
1fe0: 2f 2a 20 43 72 65 61 74 65 20 73 74 61 74 65 20  /* Create state 
1ff0: 64 61 74 61 20 73 74 72 75 63 74 20 2a 2f 0a 20  data struct */. 
2000: 20 20 20 69 66 20 28 28 73 74 61 74 65 50 74 72     if ((statePtr
2010: 20 3d 20 54 6c 73 5f 44 69 67 65 73 74 4e 65 77   = Tls_DigestNew
2020: 28 69 6e 74 65 72 70 2c 20 66 6f 72 6d 61 74 29  (interp, format)
2030: 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63  ) == NULL) {..Tc
2040: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
2050: 6e 74 65 72 70 2c 20 22 4d 65 6d 6f 72 79 20 61  nterp, "Memory a
2060: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 22  llocation error"
2070: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
2080: 3b 0a 09 72 65 73 20 3d 20 54 43 4c 5f 45 52 52  ;..res = TCL_ERR
2090: 4f 52 3b 0a 09 67 6f 74 6f 20 64 6f 6e 65 3b 0a  OR;..goto done;.
20a0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e      }..    /* In
20b0: 69 74 69 61 6c 69 7a 65 20 68 61 73 68 20 66 75  itialize hash fu
20c0: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66  nction */.    if
20d0: 20 28 28 72 65 73 20 3d 20 54 6c 73 5f 44 69 67   ((res = Tls_Dig
20e0: 65 73 74 49 6e 69 74 28 69 6e 74 65 72 70 2c 20  estInit(interp, 
20f0: 73 74 61 74 65 50 74 72 2c 20 6d 64 2c 20 63 69  statePtr, md, ci
2100: 70 68 65 72 2c 20 6b 65 79 4f 62 6a 29 29 20 21  pher, keyObj)) !
2110: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 67 6f 74  = TCL_OK) {..got
2120: 6f 20 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 0a 20  o done;.    }.. 
2130: 20 20 20 2f 2a 20 52 65 61 64 20 66 69 6c 65 20     /* Read file 
2140: 64 61 74 61 20 61 6e 64 20 75 70 64 61 74 65 20  data and update 
2150: 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  hash function */
2160: 0a 20 20 20 20 77 68 69 6c 65 20 28 21 54 63 6c  .    while (!Tcl
2170: 5f 45 6f 66 28 63 68 61 6e 29 29 20 7b 0a 09 6c  _Eof(chan)) {..l
2180: 65 6e 20 3d 20 54 63 6c 5f 52 65 61 64 52 61 77  en = Tcl_ReadRaw
2190: 28 63 68 61 6e 2c 20 28 63 68 61 72 20 2a 29 20  (chan, (char *) 
21a0: 62 75 66 2c 20 42 55 46 46 45 52 5f 53 49 5a 45  buf, BUFFER_SIZE
21b0: 29 3b 0a 09 69 66 20 28 6c 65 6e 20 3e 20 30 29  );..if (len > 0)
21c0: 20 7b 0a 09 20 20 20 20 69 66 20 28 21 54 6c 73   {..    if (!Tls
21d0: 5f 44 69 67 65 73 74 55 70 64 61 74 65 28 73 74  _DigestUpdate(st
21e0: 61 74 65 50 74 72 2c 20 26 62 75 66 5b 30 5d 2c  atePtr, &buf[0],
21f0: 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 2c 20 31   (size_t) len, 1
2200: 29 29 20 7b 0a 09 09 72 65 73 20 3d 20 54 43 4c  )) {...res = TCL
2210: 5f 45 52 52 4f 52 3b 0a 09 09 67 6f 74 6f 20 64  _ERROR;...goto d
2220: 6f 6e 65 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20  one;..    }..}. 
2230: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e     }..    /* Fin
2240: 61 6c 69 7a 65 20 68 61 73 68 20 66 75 6e 63 74  alize hash funct
2250: 69 6f 6e 20 61 6e 64 20 63 61 6c 63 75 6c 61 74  ion and calculat
2260: 65 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74  e message digest
2270: 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 54 6c   */.    res = Tl
2280: 73 5f 44 69 67 65 73 74 46 69 6e 69 61 6c 69 7a  s_DigestFinializ
2290: 65 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50  e(interp, stateP
22a0: 74 72 29 3b 0a 0a 64 6f 6e 65 3a 0a 20 20 20 20  tr);..done:.    
22b0: 2f 2a 20 43 6c 6f 73 65 20 63 68 61 6e 6e 65 6c  /* Close channel
22c0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f   */.    if (Tcl_
22d0: 43 6c 6f 73 65 28 69 6e 74 65 72 70 2c 20 63 68  Close(interp, ch
22e0: 61 6e 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52  an) == TCL_ERROR
22f0: 29 20 7b 0a 09 72 65 73 20 3d 20 54 43 4c 5f 45  ) {..res = TCL_E
2300: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
2310: 20 2f 2a 20 43 6c 65 61 6e 2d 75 70 20 2a 2f 0a   /* Clean-up */.
2320: 20 20 20 20 54 6c 73 5f 44 69 67 65 73 74 46 72      Tls_DigestFr
2330: 65 65 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20  ee(statePtr);.  
2340: 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
2350: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
2360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2390: 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  *****/../*. *---
23a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23e0: 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 42 6c 6f  . *. * DigestBlo
23f0: 63 6b 4d 6f 64 65 50 72 6f 63 20 2d 2d 0a 20 2a  ckModeProc --. *
2400: 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f  . *.This functio
2410: 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20  n is invoked by 
2420: 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c  the generic IO l
2430: 65 76 65 6c 0a 20 2a 20 20 20 20 20 20 20 74 6f  evel. *       to
2440: 20 73 65 74 20 62 6c 6f 63 6b 69 6e 67 20 61 6e   set blocking an
2450: 64 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f  d nonblocking mo
2460: 64 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72  des.. *. * Retur
2470: 6e 73 3a 0a 20 2a 09 30 20 69 66 20 73 75 63 63  ns:. *.0 if succ
2480: 65 73 73 66 75 6c 20 6f 72 20 50 4f 53 49 58 20  essful or POSIX 
2490: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 66 61  error code if fa
24a0: 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  iled.. *. * Side
24b0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74   effects:. *.Set
24c0: 73 20 74 68 65 20 64 65 76 69 63 65 20 69 6e 74  s the device int
24d0: 6f 20 62 6c 6f 63 6b 69 6e 67 20 6f 72 20 6e 6f  o blocking or no
24e0: 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a  nblocking mode..
24f0: 20 2a 09 43 61 6e 20 63 61 6c 6c 20 54 63 6c 5f   *.Can call Tcl_
2500: 53 65 74 43 68 61 6e 6e 65 6c 45 72 72 6f 72 2e  SetChannelError.
2510: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
2520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
2560: 61 74 69 63 20 69 6e 74 20 44 69 67 65 73 74 42  atic int DigestB
2570: 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 28 43 6c 69  lockModeProc(Cli
2580: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
2590: 74 61 2c 20 69 6e 74 20 6d 6f 64 65 29 20 7b 0a  ta, int mode) {.
25a0: 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20      DigestState 
25b0: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67  *statePtr = (Dig
25c0: 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65  estState *) clie
25d0: 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 69 66 20  ntData;..    if 
25e0: 28 6d 6f 64 65 20 3d 3d 20 54 43 4c 5f 4d 4f 44  (mode == TCL_MOD
25f0: 45 5f 4e 4f 4e 42 4c 4f 43 4b 49 4e 47 29 20 7b  E_NONBLOCKING) {
2600: 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67  ..statePtr->flag
2610: 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 41 53 59  s |= TLS_TCL_ASY
2620: 4e 43 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  NC;.    } else {
2630: 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67  ..statePtr->flag
2640: 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 41  s &= ~(TLS_TCL_A
2650: 53 59 4e 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20  SYNC);.    }.   
2660: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
2670: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
2680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
26a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
26b0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67  ------. *. * Dig
26c0: 65 73 74 43 6c 6f 73 65 50 72 6f 63 20 2d 2d 0a  estCloseProc --.
26d0: 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74   *. *.This funct
26e0: 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 62  ion is invoked b
26f0: 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f  y the generic IO
2700: 20 6c 65 76 65 6c 20 74 6f 20 70 65 72 66 6f 72   level to perfor
2710: 6d 0a 20 2a 09 63 68 61 6e 6e 65 6c 2d 74 79 70  m. *.channel-typ
2720: 65 2d 73 70 65 63 69 66 69 63 20 63 6c 65 61 6e  e-specific clean
2730: 75 70 20 77 68 65 6e 20 63 68 61 6e 6e 65 6c 20  up when channel 
2740: 69 73 20 63 6c 6f 73 65 64 2e 20 41 6c 6c 0a 20  is closed. All. 
2750: 2a 09 71 75 65 75 65 64 20 6f 75 74 70 75 74 20  *.queued output 
2760: 69 73 20 66 6c 75 73 68 65 64 20 70 72 69 6f 72  is flushed prior
2770: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
2780: 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a   function.. *. *
2790: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 30 20 69   Returns:. *.0 i
27a0: 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20  f successful or 
27b0: 50 4f 53 49 58 20 65 72 72 6f 72 20 63 6f 64 65  POSIX error code
27c0: 20 69 66 20 66 61 69 6c 65 64 2e 0a 20 2a 0a 20   if failed.. *. 
27d0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
27e0: 20 2a 09 57 72 69 74 65 73 20 64 69 67 65 73 74   *.Writes digest
27f0: 20 74 6f 20 6f 75 74 70 75 74 20 61 6e 64 20 63   to output and c
2800: 6c 6f 73 65 73 20 74 68 65 20 63 68 61 6e 6e 65  loses the channe
2810: 6c 2e 20 53 74 6f 72 65 73 20 65 72 72 6f 72 0a  l. Stores error.
2820: 20 2a 09 6d 65 73 73 61 67 65 73 20 69 6e 20 69   *.messages in i
2830: 6e 74 65 72 70 20 72 65 73 75 6c 74 20 75 73 69  nterp result usi
2840: 6e 67 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ng Tcl_GetChanne
2850: 6c 45 72 72 6f 72 49 6e 74 65 72 70 2e 0a 20 2a  lErrorInterp.. *
2860: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
2870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28a0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44  ------. */.int D
28b0: 69 67 65 73 74 43 6c 6f 73 65 50 72 6f 63 28 43  igestCloseProc(C
28c0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
28d0: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
28e0: 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20   *interp) {.    
28f0: 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61  DigestState *sta
2900: 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53  tePtr = (DigestS
2910: 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61  tate *) clientDa
2920: 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 6e 63  ta;..    /* Canc
2930: 65 6c 20 61 63 74 69 76 65 20 74 69 6d 65 72 2c  el active timer,
2940: 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 20 20 69   if any */.    i
2950: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d  f (statePtr->tim
2960: 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72  er != (Tcl_Timer
2970: 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09  Token) NULL) {..
2980: 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48  Tcl_DeleteTimerH
2990: 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d  andler(statePtr-
29a0: 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50  >timer);..stateP
29b0: 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c  tr->timer = (Tcl
29c0: 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c  _TimerToken) NUL
29d0: 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  L;.    }..    /*
29e0: 20 43 6c 65 61 6e 2d 75 70 20 2a 2f 0a 20 20 20   Clean-up */.   
29f0: 20 54 6c 73 5f 44 69 67 65 73 74 46 72 65 65 28   Tls_DigestFree(
2a00: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 72  statePtr);.    r
2a10: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20  eturn 0;.}../*. 
2a20: 2a 20 53 61 6d 65 20 61 73 20 44 69 67 65 73 74  * Same as Digest
2a30: 43 6c 6f 73 65 50 72 6f 63 20 62 75 74 20 77 69  CloseProc but wi
2a40: 74 68 20 69 6e 64 69 76 69 64 75 61 6c 20 72 65  th individual re
2a50: 61 64 20 61 6e 64 20 77 72 69 74 65 20 63 6c 6f  ad and write clo
2a60: 73 65 20 63 6f 6e 74 72 6f 6c 0a 20 2a 2f 0a 73  se control. */.s
2a70: 74 61 74 69 63 20 69 6e 74 20 44 69 67 65 73 74  tatic int Digest
2a80: 43 6c 6f 73 65 32 50 72 6f 63 28 43 6c 69 65 6e  Close2Proc(Clien
2a90: 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61  tData instanceDa
2aa0: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
2ab0: 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67  interp, int flag
2ac0: 73 29 20 7b 0a 0a 20 20 20 20 69 66 20 28 28 66  s) {..    if ((f
2ad0: 6c 61 67 73 20 26 20 28 54 43 4c 5f 43 4c 4f 53  lags & (TCL_CLOS
2ae0: 45 5f 52 45 41 44 20 7c 20 54 43 4c 5f 43 4c 4f  E_READ | TCL_CLO
2af0: 53 45 5f 57 52 49 54 45 29 29 20 3d 3d 20 30 29  SE_WRITE)) == 0)
2b00: 20 7b 0a 09 72 65 74 75 72 6e 20 44 69 67 65 73   {..return Diges
2b10: 74 43 6c 6f 73 65 50 72 6f 63 28 69 6e 73 74 61  tCloseProc(insta
2b20: 6e 63 65 44 61 74 61 2c 20 69 6e 74 65 72 70 29  nceData, interp)
2b30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
2b40: 72 6e 20 45 49 4e 56 41 4c 3b 0a 7d 0a 0a 2f 2a  rn EINVAL;.}../*
2b50: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
2b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
2ba0: 44 69 67 65 73 74 49 6e 70 75 74 50 72 6f 63 20  DigestInputProc 
2bb0: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20  --. *. *.Called 
2bc0: 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49  by the generic I
2bd0: 4f 20 73 79 73 74 65 6d 20 74 6f 20 72 65 61 64  O system to read
2be0: 20 64 61 74 61 20 66 72 6f 6d 20 74 72 61 6e 73   data from trans
2bf0: 66 6f 72 6d 20 61 6e 64 0a 20 2a 09 70 6c 61 63  form and. *.plac
2c00: 65 20 69 6e 20 62 75 66 2e 0a 20 2a 0a 20 2a 20  e in buf.. *. * 
2c10: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 6f 74 61  Returns:. *.Tota
2c20: 6c 20 62 79 74 65 73 20 72 65 61 64 20 6f 72 20  l bytes read or 
2c30: 2d 31 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 20  -1 for an error 
2c40: 61 6c 6f 6e 67 20 77 69 74 68 20 61 20 50 4f 53  along with a POS
2c50: 49 58 20 65 72 72 6f 72 0a 20 2a 09 63 6f 64 65  IX error. *.code
2c60: 20 69 6e 20 65 72 72 6f 72 43 6f 64 65 50 74 72   in errorCodePtr
2c70: 2e 20 55 73 65 20 45 41 47 41 49 4e 20 66 6f 72  . Use EAGAIN for
2c80: 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 61 6e 64   nonblocking and
2c90: 20 6e 6f 20 64 61 74 61 2e 0a 20 2a 0a 20 2a 20   no data.. *. * 
2ca0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
2cb0: 09 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20  .Read data from 
2cc0: 74 72 61 6e 73 66 6f 72 6d 20 61 6e 64 20 77 72  transform and wr
2cd0: 69 74 65 20 74 6f 20 62 75 66 0a 20 2a 0a 20 2a  ite to buf. *. *
2ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d20: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44  ------. */.int D
2d30: 69 67 65 73 74 49 6e 70 75 74 50 72 6f 63 28 43  igestInputProc(C
2d40: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
2d50: 44 61 74 61 2c 20 63 68 61 72 20 2a 62 75 66 2c  Data, char *buf,
2d60: 20 69 6e 74 20 74 6f 52 65 61 64 2c 20 69 6e 74   int toRead, int
2d70: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 20   *errorCodePtr) 
2d80: 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74  {.    DigestStat
2d90: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44  e *statePtr = (D
2da0: 69 67 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c  igestState *) cl
2db0: 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 54 63  ientData;.    Tc
2dc0: 6c 5f 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74  l_Channel parent
2dd0: 3b 0a 20 20 20 20 69 6e 74 20 72 65 61 64 2c 20  ;.    int read, 
2de0: 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 2a 65 72  res = 0;.    *er
2df0: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a  rorCodePtr = 0;.
2e00: 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 69 66  .    /* Abort if
2e10: 20 6e 6f 74 68 69 6e 67 20 74 6f 20 70 72 6f 63   nothing to proc
2e20: 65 73 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 74  ess */.    if (t
2e30: 6f 52 65 61 64 20 3c 3d 20 30 20 7c 7c 20 73 74  oRead <= 0 || st
2e40: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20  atePtr->self == 
2e50: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
2e60: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b  LL) {..return 0;
2e70: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
2e80: 65 74 20 62 79 74 65 73 20 66 72 6f 6d 20 75 6e  et bytes from un
2e90: 64 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c  derlying channel
2ea0: 20 2a 2f 0a 20 20 20 20 70 61 72 65 6e 74 20 3d   */.    parent =
2eb0: 20 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 64 43   Tcl_GetStackedC
2ec0: 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d  hannel(statePtr-
2ed0: 3e 73 65 6c 66 29 3b 0a 20 20 20 20 72 65 61 64  >self);.    read
2ee0: 20 3d 20 54 63 6c 5f 52 65 61 64 52 61 77 28 70   = Tcl_ReadRaw(p
2ef0: 61 72 65 6e 74 2c 20 62 75 66 2c 20 74 6f 52 65  arent, buf, toRe
2f00: 61 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64  ad);..    /* Upd
2f10: 61 74 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f  ate hash functio
2f20: 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 61  n */.    if (rea
2f30: 64 20 3e 20 30 29 20 7b 0a 09 69 66 20 28 21 54  d > 0) {..if (!T
2f40: 6c 73 5f 44 69 67 65 73 74 55 70 64 61 74 65 28  ls_DigestUpdate(
2f50: 73 74 61 74 65 50 74 72 2c 20 62 75 66 2c 20 28  statePtr, buf, (
2f60: 73 69 7a 65 5f 74 29 20 72 65 61 64 2c 20 30 29  size_t) read, 0)
2f70: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74  ) {..    Tcl_Set
2f80: 43 68 61 6e 6e 65 6c 45 72 72 6f 72 28 73 74 61  ChannelError(sta
2f90: 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 54 63 6c  tePtr->self, Tcl
2fa0: 5f 4f 62 6a 50 72 69 6e 74 66 28 22 55 70 64 61  _ObjPrintf("Upda
2fb0: 74 65 20 66 61 69 6c 65 64 3a 20 25 73 22 2c 20  te failed: %s", 
2fc0: 52 45 41 53 4f 4e 28 29 29 29 3b 0a 09 20 20 20  REASON()));..   
2fd0: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d   *errorCodePtr =
2fe0: 20 45 49 4e 56 41 4c 3b 0a 09 20 20 20 20 72 65   EINVAL;..    re
2ff0: 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 09 2f 2a 20  turn -1;..}../* 
3000: 54 68 69 73 20 69 73 20 63 6f 72 72 65 63 74 20  This is correct 
3010: 2a 2f 0a 09 72 65 61 64 20 3d 20 2d 31 3b 0a 09  */..read = -1;..
3020: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
3030: 45 41 47 41 49 4e 3b 0a 09 20 20 20 20 0a 20 20  EAGAIN;..    .  
3040: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 72 65 61    } else if (rea
3050: 64 20 3c 20 30 29 20 7b 0a 09 2f 2a 20 45 72 72  d < 0) {../* Err
3060: 6f 72 20 2a 2f 0a 09 2a 65 72 72 6f 72 43 6f 64  or */..*errorCod
3070: 65 50 74 72 20 3d 20 54 63 6c 5f 47 65 74 45 72  ePtr = Tcl_GetEr
3080: 72 6e 6f 28 29 3b 0a 0a 20 20 20 20 7d 20 65 6c  rno();..    } el
3090: 73 65 20 69 66 20 28 21 28 73 74 61 74 65 50 74  se if (!(statePt
30a0: 72 2d 3e 66 6c 61 67 73 20 26 20 43 48 41 4e 5f  r->flags & CHAN_
30b0: 45 4f 46 29 29 20 7b 0a 09 2f 2a 20 45 4f 46 20  EOF)) {../* EOF 
30c0: 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  */..unsigned cha
30d0: 72 20 6d 64 5f 62 75 66 5b 45 56 50 5f 4d 41 58  r md_buf[EVP_MAX
30e0: 5f 4d 44 5f 53 49 5a 45 5d 3b 0a 09 75 6e 73 69  _MD_SIZE];..unsi
30f0: 67 6e 65 64 20 69 6e 74 20 6d 64 5f 6c 65 6e 20  gned int md_len 
3100: 3d 20 30 3b 0a 0a 09 2f 2a 20 46 69 6e 61 6c 69  = 0;.../* Finali
3110: 7a 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e  ze hash function
3120: 20 61 6e 64 20 63 61 6c 63 75 6c 61 74 65 20 6d   and calculate m
3130: 65 73 73 61 67 65 20 64 69 67 65 73 74 20 2a 2f  essage digest */
3140: 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e  ..if (statePtr->
3150: 66 6f 72 6d 61 74 20 26 20 54 59 50 45 5f 4d 44  format & TYPE_MD
3160: 29 20 7b 0a 09 20 20 20 20 72 65 73 20 3d 20 45  ) {..    res = E
3170: 56 50 5f 44 69 67 65 73 74 46 69 6e 61 6c 5f 65  VP_DigestFinal_e
3180: 78 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c  x(statePtr->ctx,
3190: 20 6d 64 5f 62 75 66 2c 20 26 6d 64 5f 6c 65 6e   md_buf, &md_len
31a0: 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 73  );..} else if (s
31b0: 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20  tatePtr->format 
31c0: 26 20 54 59 50 45 5f 48 4d 41 43 29 20 7b 0a 09  & TYPE_HMAC) {..
31d0: 20 20 20 20 72 65 73 20 3d 20 48 4d 41 43 5f 46      res = HMAC_F
31e0: 69 6e 61 6c 28 73 74 61 74 65 50 74 72 2d 3e 68  inal(statePtr->h
31f0: 63 74 78 2c 20 6d 64 5f 62 75 66 2c 20 26 6d 64  ctx, md_buf, &md
3200: 5f 6c 65 6e 29 3b 0a 09 7d 20 65 6c 73 65 20 69  _len);..} else i
3210: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6f 72  f (statePtr->for
3220: 6d 61 74 20 26 20 54 59 50 45 5f 43 4d 41 43 29  mat & TYPE_CMAC)
3230: 20 7b 0a 09 20 20 20 20 73 69 7a 65 5f 74 20 6c   {..    size_t l
3240: 65 6e 3b 0a 09 20 20 20 20 72 65 73 20 3d 20 43  en;..    res = C
3250: 4d 41 43 5f 46 69 6e 61 6c 28 73 74 61 74 65 50  MAC_Final(stateP
3260: 74 72 2d 3e 63 63 74 78 2c 20 6d 64 5f 62 75 66  tr->cctx, md_buf
3270: 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 6d 64  , &len);..    md
3280: 5f 6c 65 6e 20 3d 20 28 75 6e 73 69 67 6e 65 64  _len = (unsigned
3290: 20 69 6e 74 29 20 6c 65 6e 3b 0a 09 7d 0a 09 69   int) len;..}..i
32a0: 66 20 28 21 72 65 73 29 20 7b 0a 09 20 20 20 20  f (!res) {..    
32b0: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 45 72  Tcl_SetChannelEr
32c0: 72 6f 72 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ror(statePtr->se
32d0: 6c 66 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74  lf, Tcl_ObjPrint
32e0: 66 28 22 46 69 6e 61 6c 69 7a 65 20 66 61 69 6c  f("Finalize fail
32f0: 65 64 3a 20 25 73 22 2c 20 52 45 41 53 4f 4e 28  ed: %s", REASON(
3300: 29 29 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72  )));..    *error
3310: 43 6f 64 65 50 74 72 20 3d 20 45 49 4e 56 41 4c  CodePtr = EINVAL
3320: 3b 0a 0a 09 2f 2a 20 57 72 69 74 65 20 6d 65 73  ;.../* Write mes
3330: 73 61 67 65 20 64 69 67 65 73 74 20 74 6f 20 6f  sage digest to o
3340: 75 74 70 75 74 20 63 68 61 6e 6e 65 6c 20 61 73  utput channel as
3350: 20 62 79 74 65 20 61 72 72 61 79 20 6f 72 20 68   byte array or h
3360: 65 78 20 73 74 72 69 6e 67 20 2a 2f 0a 09 7d 20  ex string */..} 
3370: 65 6c 73 65 20 69 66 20 28 6d 64 5f 6c 65 6e 20  else if (md_len 
3380: 3e 20 30 29 20 7b 0a 09 20 20 20 20 69 66 20 28  > 0) {..    if (
3390: 28 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61  (statePtr->forma
33a0: 74 20 26 20 42 49 4e 5f 46 4f 52 4d 41 54 29 20  t & BIN_FORMAT) 
33b0: 26 26 20 74 6f 52 65 61 64 20 3e 3d 20 28 69 6e  && toRead >= (in
33c0: 74 29 20 6d 64 5f 6c 65 6e 29 20 7b 0a 09 09 72  t) md_len) {...r
33d0: 65 61 64 20 3d 20 6d 64 5f 6c 65 6e 3b 0a 09 09  ead = md_len;...
33e0: 6d 65 6d 63 70 79 28 62 75 66 2c 20 6d 64 5f 62  memcpy(buf, md_b
33f0: 75 66 2c 20 72 65 61 64 29 3b 0a 0a 09 20 20 20  uf, read);...   
3400: 20 7d 20 65 6c 73 65 20 69 66 28 28 73 74 61 74   } else if((stat
3410: 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20 48  ePtr->format & H
3420: 45 58 5f 46 4f 52 4d 41 54 29 20 26 26 20 74 6f  EX_FORMAT) && to
3430: 52 65 61 64 20 3e 3d 20 28 69 6e 74 29 20 28 6d  Read >= (int) (m
3440: 64 5f 6c 65 6e 2a 32 29 29 20 7b 0a 09 09 75 6e  d_len*2)) {...un
3450: 73 69 67 6e 65 64 20 63 68 61 72 20 68 65 78 5f  signed char hex_
3460: 62 75 66 5b 45 56 50 5f 4d 41 58 5f 4d 44 5f 53  buf[EVP_MAX_MD_S
3470: 49 5a 45 2a 32 5d 3b 0a 09 09 75 6e 73 69 67 6e  IZE*2];...unsign
3480: 65 64 20 63 68 61 72 20 2a 70 74 72 20 3d 20 68  ed char *ptr = h
3490: 65 78 5f 62 75 66 3b 0a 0a 09 09 66 6f 72 20 28  ex_buf;....for (
34a0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 20 3d  unsigned int i =
34b0: 20 30 3b 20 69 20 3c 20 6d 64 5f 6c 65 6e 3b 20   0; i < md_len; 
34c0: 69 2b 2b 29 20 7b 0a 09 09 20 20 20 20 2a 70 74  i++) {...    *pt
34d0: 72 2b 2b 20 3d 20 68 65 78 5b 28 6d 64 5f 62 75  r++ = hex[(md_bu
34e0: 66 5b 69 5d 20 3e 3e 20 34 29 20 26 20 30 78 30  f[i] >> 4) & 0x0
34f0: 46 5d 3b 0a 09 09 20 20 20 20 2a 70 74 72 2b 2b  F];...    *ptr++
3500: 20 3d 20 68 65 78 5b 6d 64 5f 62 75 66 5b 69 5d   = hex[md_buf[i]
3510: 20 26 20 30 78 30 46 5d 3b 0a 09 09 7d 0a 09 09   & 0x0F];...}...
3520: 72 65 61 64 20 3d 20 6d 64 5f 6c 65 6e 2a 32 3b  read = md_len*2;
3530: 0a 09 09 6d 65 6d 63 70 79 28 62 75 66 2c 20 68  ...memcpy(buf, h
3540: 65 78 5f 62 75 66 2c 20 72 65 61 64 29 3b 0a 09  ex_buf, read);..
3550: 20 20 20 20 7d 0a 09 7d 0a 09 73 74 61 74 65 50      }..}..stateP
3560: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 48 41  tr->flags |= CHA
3570: 4e 5f 45 4f 46 3b 0a 20 20 20 20 7d 0a 20 20 20  N_EOF;.    }.   
3580: 20 72 65 74 75 72 6e 20 72 65 61 64 3b 0a 7d 0a   return read;.}.
3590: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
35a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
35e0: 20 2a 20 44 69 67 65 73 74 4f 75 74 70 75 74 50   * DigestOutputP
35f0: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c  roc --. *. *.Cal
3600: 6c 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72  led by the gener
3610: 69 63 20 49 4f 20 73 79 73 74 65 6d 20 74 6f 20  ic IO system to 
3620: 77 72 69 74 65 20 64 61 74 61 20 69 6e 20 62 75  write data in bu
3630: 66 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 2e 0a  f to transform..
3640: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20   *. * Returns:. 
3650: 2a 09 54 6f 74 61 6c 20 62 79 74 65 73 20 77 72  *.Total bytes wr
3660: 69 74 74 65 6e 20 6f 72 20 2d 31 20 66 6f 72 20  itten or -1 for 
3670: 61 6e 20 65 72 72 6f 72 20 61 6c 6f 6e 67 20 77  an error along w
3680: 69 74 68 20 61 20 50 4f 53 49 58 20 65 72 72 6f  ith a POSIX erro
3690: 72 0a 20 2a 09 63 6f 64 65 20 69 6e 20 65 72 72  r. *.code in err
36a0: 6f 72 43 6f 64 65 50 74 72 2e 20 55 73 65 20 45  orCodePtr. Use E
36b0: 41 47 41 49 4e 20 66 6f 72 20 6e 6f 6e 62 6c 6f  AGAIN for nonblo
36c0: 63 6b 69 6e 67 20 61 6e 64 20 63 61 6e 27 74 20  cking and can't 
36d0: 77 72 69 74 65 20 64 61 74 61 2e 0a 20 2a 0a 20  write data.. *. 
36e0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
36f0: 20 2a 09 47 65 74 20 64 61 74 61 20 66 72 6f 6d   *.Get data from
3700: 20 62 75 66 20 61 6e 64 20 75 70 64 61 74 65 20   buf and update 
3710: 64 69 67 65 73 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d  digest. *. *----
3720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3760: 2d 2d 0a 20 2a 2f 0a 20 69 6e 74 20 44 69 67 65  --. */. int Dige
3770: 73 74 4f 75 74 70 75 74 50 72 6f 63 28 43 6c 69  stOutputProc(Cli
3780: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
3790: 74 61 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ta, const char *
37a0: 62 75 66 2c 20 69 6e 74 20 74 6f 57 72 69 74 65  buf, int toWrite
37b0: 2c 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65  , int *errorCode
37c0: 50 74 72 29 20 7b 0a 20 20 20 20 44 69 67 65 73  Ptr) {.    Diges
37d0: 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72  tState *statePtr
37e0: 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20   = (DigestState 
37f0: 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20  *) clientData;. 
3800: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72     *errorCodePtr
3810: 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 41 62   = 0;..    /* Ab
3820: 6f 72 74 20 69 66 20 6e 6f 74 68 69 6e 67 20 74  ort if nothing t
3830: 6f 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 20  o process */.   
3840: 20 69 66 20 28 74 6f 57 72 69 74 65 20 3c 3d 20   if (toWrite <= 
3850: 30 20 7c 7c 20 73 74 61 74 65 50 74 72 2d 3e 73  0 || statePtr->s
3860: 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  elf == (Tcl_Chan
3870: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  nel) NULL) {..re
3880: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  turn 0;.    }.. 
3890: 20 20 20 2f 2a 20 55 70 64 61 74 65 20 68 61 73     /* Update has
38a0: 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  h function */.  
38b0: 20 20 69 66 20 28 74 6f 57 72 69 74 65 20 3e 20    if (toWrite > 
38c0: 30 20 26 26 20 21 54 6c 73 5f 44 69 67 65 73 74  0 && !Tls_Digest
38d0: 55 70 64 61 74 65 28 73 74 61 74 65 50 74 72 2c  Update(statePtr,
38e0: 20 62 75 66 2c 20 28 73 69 7a 65 5f 74 29 20 74   buf, (size_t) t
38f0: 6f 57 72 69 74 65 2c 20 30 29 29 20 7b 0a 09 54  oWrite, 0)) {..T
3900: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 45 72 72  cl_SetChannelErr
3910: 6f 72 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  or(statePtr->sel
3920: 66 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66  f, Tcl_ObjPrintf
3930: 28 22 55 70 64 61 74 65 20 66 61 69 6c 65 64 3a  ("Update failed:
3940: 20 25 73 22 2c 20 52 45 41 53 4f 4e 28 29 29 29   %s", REASON()))
3950: 3b 0a 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72  ;..*errorCodePtr
3960: 20 3d 20 45 49 4e 56 41 4c 3b 0a 09 72 65 74 75   = EINVAL;..retu
3970: 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20  rn -1;.    }.   
3980: 20 72 65 74 75 72 6e 20 74 6f 57 72 69 74 65 3b   return toWrite;
3990: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
39a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
39e0: 20 2a 0a 20 2a 20 44 69 67 65 73 74 53 65 74 4f   *. * DigestSetO
39f0: 70 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20 2a 0a  ptionProc --. *.
3a00: 20 2a 09 43 61 6c 6c 65 64 20 62 79 20 74 68 65   *.Called by the
3a10: 20 67 65 6e 65 72 69 63 20 49 4f 20 73 79 73 74   generic IO syst
3a20: 65 6d 20 74 6f 20 73 65 74 20 63 68 61 6e 6e 65  em to set channe
3a30: 6c 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 20 74 6f  l option name to
3a40: 20 76 61 6c 75 65 2e 0a 20 2a 0a 20 2a 20 52 65   value.. *. * Re
3a50: 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b  turns:. *.TCL_OK
3a60: 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f   if successful o
3a70: 72 20 54 43 4c 5f 45 52 52 4f 52 20 69 66 20 66  r TCL_ERROR if f
3a80: 61 69 6c 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  ailed along with
3a90: 20 61 6e 20 65 72 72 6f 72 0a 20 2a 09 6d 65 73   an error. *.mes
3aa0: 73 61 67 65 20 69 6e 20 69 6e 74 65 72 70 20 61  sage in interp a
3ab0: 6e 64 20 54 63 6c 5f 53 65 74 45 72 72 6e 6f 2e  nd Tcl_SetErrno.
3ac0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
3ad0: 63 74 73 3a 0a 20 2a 09 55 70 64 61 74 65 73 20  cts:. *.Updates 
3ae0: 63 68 61 6e 6e 65 6c 20 6f 70 74 69 6f 6e 20 74  channel option t
3af0: 6f 20 6e 65 77 20 76 61 6c 75 65 2e 0a 20 2a 0a  o new value.. *.
3b00: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
3b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b40: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
3b50: 74 69 63 20 69 6e 74 20 44 69 67 65 73 74 53 65  tic int DigestSe
3b60: 74 4f 70 74 69 6f 6e 50 72 6f 63 28 43 6c 69 65  tOptionProc(Clie
3b70: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
3b80: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
3b90: 6e 74 65 72 70 2c 20 63 6f 6e 73 74 20 63 68 61  nterp, const cha
3ba0: 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c 0a 09  r *optionName,..
3bb0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70 74 69  const char *opti
3bc0: 6f 6e 56 61 6c 75 65 29 20 7b 0a 20 20 20 20 44  onValue) {.    D
3bd0: 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74  igestState *stat
3be0: 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74  ePtr = (DigestSt
3bf0: 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74  ate *) clientDat
3c00: 61 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e  a;.    Tcl_Chann
3c10: 65 6c 20 70 61 72 65 6e 74 3b 0a 20 20 20 20 54  el parent;.    T
3c20: 63 6c 5f 44 72 69 76 65 72 53 65 74 4f 70 74 69  cl_DriverSetOpti
3c30: 6f 6e 50 72 6f 63 20 2a 73 65 74 4f 70 74 69 6f  onProc *setOptio
3c40: 6e 50 72 6f 63 3b 0a 0a 20 20 20 20 2f 2a 20 41  nProc;..    /* A
3c50: 62 6f 72 74 20 69 66 20 6e 6f 20 63 68 61 6e 6e  bort if no chann
3c60: 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74  el */.    if (st
3c70: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20  atePtr->self == 
3c80: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
3c90: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  LL) {..return TC
3ca0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
3cb0: 20 20 20 20 2f 2a 20 44 65 6c 65 67 61 74 65 20      /* Delegate 
3cc0: 6f 70 74 69 6f 6e 73 20 64 6f 77 6e 73 74 72 65  options downstre
3cd0: 61 6d 20 2a 2f 0a 20 20 20 20 70 61 72 65 6e 74  am */.    parent
3ce0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 63 6b 65   = Tcl_GetStacke
3cf0: 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74  dChannel(statePt
3d00: 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 20 73 65  r->self);.    se
3d10: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 3d 20 54 63  tOptionProc = Tc
3d20: 6c 5f 43 68 61 6e 6e 65 6c 53 65 74 4f 70 74 69  l_ChannelSetOpti
3d30: 6f 6e 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 68  onProc(Tcl_GetCh
3d40: 61 6e 6e 65 6c 54 79 70 65 28 70 61 72 65 6e 74  annelType(parent
3d50: 29 29 3b 0a 20 20 20 20 69 66 20 28 73 65 74 4f  ));.    if (setO
3d60: 70 74 69 6f 6e 50 72 6f 63 20 21 3d 20 4e 55 4c  ptionProc != NUL
3d70: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 28 2a 73  L) {..return (*s
3d80: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 29 28 54 63  etOptionProc)(Tc
3d90: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74  l_GetChannelInst
3da0: 61 6e 63 65 44 61 74 61 28 70 61 72 65 6e 74 29  anceData(parent)
3db0: 2c 20 69 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e  , interp, option
3dc0: 4e 61 6d 65 2c 20 6f 70 74 69 6f 6e 56 61 6c 75  Name, optionValu
3dd0: 65 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  e);.    } else {
3de0: 0a 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 45  ..Tcl_SetErrno(E
3df0: 49 4e 56 41 4c 29 3b 0a 09 72 65 74 75 72 6e 20  INVAL);..return 
3e00: 54 63 6c 5f 42 61 64 43 68 61 6e 6e 65 6c 4f 70  Tcl_BadChannelOp
3e10: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f 70 74  tion(interp, opt
3e20: 69 6f 6e 4e 61 6d 65 2c 20 4e 55 4c 4c 29 3b 0a  ionName, NULL);.
3e30: 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d      }.}../*. *--
3e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e80: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73  ----. *. * Diges
3e90: 74 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2d  tGetOptionProc -
3ea0: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62  -. *. *.Called b
3eb0: 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f  y the generic IO
3ec0: 20 73 79 73 74 65 6d 20 74 6f 20 67 65 74 20 63   system to get c
3ed0: 68 61 6e 6e 65 6c 20 6f 70 74 69 6f 6e 20 6e 61  hannel option na
3ee0: 6d 65 27 73 20 76 61 6c 75 65 2e 0a 20 2a 0a 20  me's value.. *. 
3ef0: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43  * Returns:. *.TC
3f00: 4c 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66  L_OK if successf
3f10: 75 6c 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 20  ul or TCL_ERROR 
3f20: 69 66 20 66 61 69 6c 65 64 20 61 6c 6f 6e 67 20  if failed along 
3f30: 77 69 74 68 20 61 6e 20 65 72 72 6f 72 0a 20 2a  with an error. *
3f40: 09 6d 65 73 73 61 67 65 20 69 6e 20 69 6e 74 65  .message in inte
3f50: 72 70 20 61 6e 64 20 54 63 6c 5f 53 65 74 45 72  rp and Tcl_SetEr
3f60: 72 6e 6f 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  rno.. *. * Side 
3f70: 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73  effects:. *.Sets
3f80: 20 72 65 73 75 6c 74 20 74 6f 20 6f 70 74 69 6f   result to optio
3f90: 6e 27 73 20 76 61 6c 75 65 0a 20 2a 0a 20 2a 2d  n's value. *. *-
3fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fe0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
3ff0: 20 69 6e 74 20 44 69 67 65 73 74 47 65 74 4f 70   int DigestGetOp
4000: 74 69 6f 6e 50 72 6f 63 28 43 6c 69 65 6e 74 44  tionProc(ClientD
4010: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
4020: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
4030: 72 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  rp, const char *
4040: 6f 70 74 69 6f 6e 4e 61 6d 65 2c 0a 09 54 63 6c  optionName,..Tcl
4050: 5f 44 53 74 72 69 6e 67 20 2a 6f 70 74 69 6f 6e  _DString *option
4060: 56 61 6c 75 65 29 20 7b 0a 20 20 20 20 44 69 67  Value) {.    Dig
4070: 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50  estState *stateP
4080: 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 74  tr = (DigestStat
4090: 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b  e *) clientData;
40a0: 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  .    Tcl_Channel
40b0: 20 70 61 72 65 6e 74 3b 0a 20 20 20 20 54 63 6c   parent;.    Tcl
40c0: 5f 44 72 69 76 65 72 47 65 74 4f 70 74 69 6f 6e  _DriverGetOption
40d0: 50 72 6f 63 20 2a 67 65 74 4f 70 74 69 6f 6e 50  Proc *getOptionP
40e0: 72 6f 63 3b 0a 0a 20 20 20 20 2f 2a 20 41 62 6f  roc;..    /* Abo
40f0: 72 74 20 69 66 20 6e 6f 20 63 68 61 6e 6e 65 6c  rt if no channel
4100: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74   */.    if (stat
4110: 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54  ePtr->self == (T
4120: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c  cl_Channel) NULL
4130: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
4140: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
4150: 20 20 2f 2a 20 44 65 6c 65 67 61 74 65 20 6f 70    /* Delegate op
4160: 74 69 6f 6e 73 20 64 6f 77 6e 73 74 72 65 61 6d  tions downstream
4170: 20 2a 2f 0a 20 20 20 20 70 61 72 65 6e 74 20 3d   */.    parent =
4180: 20 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 64 43   Tcl_GetStackedC
4190: 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d  hannel(statePtr-
41a0: 3e 73 65 6c 66 29 3b 0a 20 20 20 20 67 65 74 4f  >self);.    getO
41b0: 70 74 69 6f 6e 50 72 6f 63 20 3d 20 54 63 6c 5f  ptionProc = Tcl_
41c0: 43 68 61 6e 6e 65 6c 47 65 74 4f 70 74 69 6f 6e  ChannelGetOption
41d0: 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 68 61 6e  Proc(Tcl_GetChan
41e0: 6e 65 6c 54 79 70 65 28 70 61 72 65 6e 74 29 29  nelType(parent))
41f0: 3b 0a 20 20 20 20 69 66 20 28 67 65 74 4f 70 74  ;.    if (getOpt
4200: 69 6f 6e 50 72 6f 63 20 21 3d 20 4e 55 4c 4c 29  ionProc != NULL)
4210: 20 7b 0a 09 72 65 74 75 72 6e 20 28 2a 67 65 74   {..return (*get
4220: 4f 70 74 69 6f 6e 50 72 6f 63 29 28 54 63 6c 5f  OptionProc)(Tcl_
4230: 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e  GetChannelInstan
4240: 63 65 44 61 74 61 28 70 61 72 65 6e 74 29 2c 20  ceData(parent), 
4250: 69 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e 4e 61  interp, optionNa
4260: 6d 65 2c 20 6f 70 74 69 6f 6e 56 61 6c 75 65 29  me, optionValue)
4270: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ;.    } else if 
4280: 28 6f 70 74 69 6f 6e 4e 61 6d 65 20 3d 3d 20 28  (optionName == (
4290: 63 68 61 72 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09  char*) NULL) {..
42a0: 2f 2a 20 52 65 71 75 65 73 74 20 69 73 20 71 75  /* Request is qu
42b0: 65 72 79 20 66 6f 72 20 61 6c 6c 20 6f 70 74 69  ery for all opti
42c0: 6f 6e 73 2c 20 74 68 69 73 20 69 73 20 6f 6b 2e  ons, this is ok.
42d0: 20 2a 2f 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f   */..return TCL_
42e0: 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  OK;.    } else {
42f0: 0a 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 45  ..Tcl_SetErrno(E
4300: 49 4e 56 41 4c 29 3b 0a 09 72 65 74 75 72 6e 20  INVAL);..return 
4310: 54 63 6c 5f 42 61 64 43 68 61 6e 6e 65 6c 4f 70  Tcl_BadChannelOp
4320: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f 70 74  tion(interp, opt
4330: 69 6f 6e 4e 61 6d 65 2c 20 4e 55 4c 4c 29 3b 0a  ionName, NULL);.
4340: 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d      }.}../*. *--
4350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4390: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73  ----. *. * Diges
43a0: 74 54 69 6d 65 72 48 61 6e 64 6c 65 72 20 2d 2d  tTimerHandler --
43b0: 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79  . *. *.Called by
43c0: 20 74 68 65 20 6e 6f 74 69 66 69 65 72 20 76 69   the notifier vi
43d0: 61 20 74 69 6d 65 72 20 74 6f 20 66 6c 75 73 68  a timer to flush
43e0: 20 6f 75 74 20 70 65 6e 64 69 6e 67 20 69 6e 70   out pending inp
43f0: 75 74 20 64 61 74 61 2e 0a 20 2a 0a 20 2a 20 52  ut data.. *. * R
4400: 65 74 75 72 6e 73 3a 0a 20 2a 09 4e 6f 74 68 69  eturns:. *.Nothi
4410: 6e 67 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ng. *. * Side ef
4420: 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 63 61  fects:. *.May ca
4430: 6c 6c 20 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61  ll Tcl_NotifyCha
4440: 6e 6e 65 6c 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  nnel. *. *------
4450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4490: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  . */.static void
44a0: 20 44 69 67 65 73 74 54 69 6d 65 72 48 61 6e 64   DigestTimerHand
44b0: 6c 65 72 28 43 6c 69 65 6e 74 44 61 74 61 20 63  ler(ClientData c
44c0: 6c 69 65 6e 74 44 61 74 61 29 20 7b 0a 20 20 20  lientData) {.   
44d0: 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74   DigestState *st
44e0: 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 74  atePtr = (Digest
44f0: 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44  State *) clientD
4500: 61 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 41 62 6f  ata;..    /* Abo
4510: 72 74 20 69 66 20 6e 6f 20 63 68 61 6e 6e 65 6c  rt if no channel
4520: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74   */.    if (stat
4530: 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54  ePtr->self == (T
4540: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c  cl_Channel) NULL
4550: 29 20 7b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20  ) {..return;.   
4560: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 72   }..    /* Clear
4570: 20 74 69 6d 65 72 20 74 6f 6b 65 6e 20 2a 2f 0a   timer token */.
4580: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 74 69      statePtr->ti
4590: 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72  mer = (Tcl_Timer
45a0: 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 0a 20 20  Token) NULL;..  
45b0: 20 20 2f 2a 20 46 69 72 65 20 65 76 65 6e 74 20    /* Fire event 
45c0: 69 66 20 74 68 65 72 65 20 69 73 20 70 65 6e 64  if there is pend
45d0: 69 6e 67 20 64 61 74 61 2c 20 73 6b 69 70 20 6f  ing data, skip o
45e0: 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 20 20  therwise */.    
45f0: 69 66 20 28 28 73 74 61 74 65 50 74 72 2d 3e 77  if ((statePtr->w
4600: 61 74 63 68 4d 61 73 6b 20 26 20 54 43 4c 5f 52  atchMask & TCL_R
4610: 45 41 44 41 42 4c 45 29 20 26 26 20 28 54 63 6c  EADABLE) && (Tcl
4620: 5f 49 6e 70 75 74 42 75 66 66 65 72 65 64 28 73  _InputBuffered(s
4630: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 20 3e  tatePtr->self) >
4640: 20 30 29 29 20 7b 0a 09 54 63 6c 5f 4e 6f 74 69   0)) {..Tcl_Noti
4650: 66 79 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50  fyChannel(stateP
4660: 74 72 2d 3e 73 65 6c 66 2c 20 54 43 4c 5f 52 45  tr->self, TCL_RE
4670: 41 44 41 42 4c 45 29 3b 0a 20 20 20 20 7d 0a 7d  ADABLE);.    }.}
4680: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
4690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
46d0: 0a 20 2a 20 44 69 67 65 73 74 57 61 74 63 68 50  . * DigestWatchP
46e0: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 49 6e 69  roc --. *. *.Ini
46f0: 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 6f 74 69  tialize the noti
4700: 66 69 65 72 20 74 6f 20 77 61 74 63 68 20 66 6f  fier to watch fo
4710: 72 20 65 76 65 6e 74 73 20 66 72 6f 6d 20 74 68  r events from th
4720: 69 73 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20  is channel.. *. 
4730: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 4e 6f  * Returns:. *.No
4740: 74 68 69 6e 67 20 28 63 61 6e 27 74 20 72 65 74  thing (can't ret
4750: 75 72 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67  urn error messag
4760: 65 73 29 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  es). *. * Side e
4770: 66 66 65 63 74 73 3a 0a 20 2a 09 43 6f 6e 66 69  ffects:. *.Confi
4780: 67 75 72 65 20 6e 6f 74 69 66 69 65 72 20 73 6f  gure notifier so
4790: 20 66 75 74 75 72 65 20 65 76 65 6e 74 73 20 6f   future events o
47a0: 6e 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 77 69  n the channel wi
47b0: 6c 6c 20 62 65 20 73 65 65 6e 20 62 79 20 54 63  ll be seen by Tc
47c0: 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  l.. *. *--------
47d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
4810: 2a 2f 0a 23 64 65 66 69 6e 65 20 52 45 41 44 5f  */.#define READ_
4820: 44 45 4c 41 59 09 35 0a 76 6f 69 64 20 44 69 67  DELAY.5.void Dig
4830: 65 73 74 57 61 74 63 68 50 72 6f 63 28 43 6c 69  estWatchProc(Cli
4840: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
4850: 74 61 2c 20 69 6e 74 20 6d 61 73 6b 29 20 7b 0a  ta, int mask) {.
4860: 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20      DigestState 
4870: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67  *statePtr = (Dig
4880: 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65  estState *) clie
4890: 6e 74 44 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f  ntData;.    Tcl_
48a0: 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 3b 0a  Channel parent;.
48b0: 20 20 20 20 54 63 6c 5f 44 72 69 76 65 72 57 61      Tcl_DriverWa
48c0: 74 63 68 50 72 6f 63 20 2a 77 61 74 63 68 50 72  tchProc *watchPr
48d0: 6f 63 3b 0a 0a 20 20 20 20 2f 2a 20 41 62 6f 72  oc;..    /* Abor
48e0: 74 20 69 66 20 6e 6f 20 63 68 61 6e 6e 65 6c 20  t if no channel 
48f0: 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  */.    if (state
4900: 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63  Ptr->self == (Tc
4910: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29  l_Channel) NULL)
4920: 20 7b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20   {..return;.    
4930: 7d 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  }..    /* Store 
4940: 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f  OR-ed combinatio
4950: 6e 20 6f 66 20 54 43 4c 5f 52 45 41 44 41 42 4c  n of TCL_READABL
4960: 45 2c 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 20  E, TCL_WRITABLE 
4970: 61 6e 64 20 54 43 4c 5f 45 58 43 45 50 54 49 4f  and TCL_EXCEPTIO
4980: 4e 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74  N */.    statePt
4990: 72 2d 3e 77 61 74 63 68 4d 61 73 6b 20 3d 20 6d  r->watchMask = m
49a0: 61 73 6b 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f  ask;..    /* Pro
49b0: 70 61 67 61 74 65 20 6d 61 73 6b 20 69 6e 66 6f  pagate mask info
49c0: 20 74 6f 20 70 61 72 65 6e 74 20 63 68 61 6e 6e   to parent chann
49d0: 65 6c 20 2a 2f 0a 20 20 20 20 70 61 72 65 6e 74  el */.    parent
49e0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 63 6b 65   = Tcl_GetStacke
49f0: 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74  dChannel(statePt
4a00: 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 20 77 61  r->self);.    wa
4a10: 74 63 68 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68  tchProc = Tcl_Ch
4a20: 61 6e 6e 65 6c 57 61 74 63 68 50 72 6f 63 28 54  annelWatchProc(T
4a30: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70  cl_GetChannelTyp
4a40: 65 28 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20  e(parent));.    
4a50: 77 61 74 63 68 50 72 6f 63 28 54 63 6c 5f 47 65  watchProc(Tcl_Ge
4a60: 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65  tChannelInstance
4a70: 44 61 74 61 28 70 61 72 65 6e 74 29 2c 20 6d 61  Data(parent), ma
4a80: 73 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d  sk);..    /* Rem
4a90: 6f 76 65 20 70 65 6e 64 69 6e 67 20 74 69 6d 65  ove pending time
4aa0: 72 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61  r */.    if (sta
4ab0: 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20  tePtr->timer != 
4ac0: 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29  (Tcl_TimerToken)
4ad0: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65   NULL) {..Tcl_De
4ae0: 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72  leteTimerHandler
4af0: 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72  (statePtr->timer
4b00: 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69  );..statePtr->ti
4b10: 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72  mer = (Tcl_Timer
4b20: 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 20 20 20  Token) NULL;.   
4b30: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
4b40: 65 72 65 20 69 73 20 64 61 74 61 20 70 65 6e 64  ere is data pend
4b50: 69 6e 67 2c 20 73 65 74 20 6e 65 77 20 74 69 6d  ing, set new tim
4b60: 65 72 20 74 6f 20 63 61 6c 6c 20 54 63 6c 5f 4e  er to call Tcl_N
4b70: 6f 74 69 66 79 43 68 61 6e 6e 65 6c 20 2a 2f 0a  otifyChannel */.
4b80: 20 20 20 20 69 66 20 28 28 6d 61 73 6b 20 26 20      if ((mask & 
4b90: 54 43 4c 5f 52 45 41 44 41 42 4c 45 29 20 26 26  TCL_READABLE) &&
4ba0: 20 28 54 63 6c 5f 49 6e 70 75 74 42 75 66 66 65   (Tcl_InputBuffe
4bb0: 72 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 65  red(statePtr->se
4bc0: 6c 66 29 20 3e 20 30 29 29 20 7b 0a 09 73 74 61  lf) > 0)) {..sta
4bd0: 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 54  tePtr->timer = T
4be0: 63 6c 5f 43 72 65 61 74 65 54 69 6d 65 72 48 61  cl_CreateTimerHa
4bf0: 6e 64 6c 65 72 28 52 45 41 44 5f 44 45 4c 41 59  ndler(READ_DELAY
4c00: 2c 20 44 69 67 65 73 74 54 69 6d 65 72 48 61 6e  , DigestTimerHan
4c10: 64 6c 65 72 2c 20 28 43 6c 69 65 6e 74 44 61 74  dler, (ClientDat
4c20: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20  a) statePtr);.  
4c30: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d    }.}../*. *----
4c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c80: 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 47  --. *. * DigestG
4c90: 65 74 48 61 6e 64 6c 65 50 72 6f 63 20 2d 2d 0a  etHandleProc --.
4ca0: 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 66 72 6f   *. *.Called fro
4cb0: 6d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  m Tcl_GetChannel
4cc0: 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 72 69 65  Handle to retrie
4cd0: 76 65 20 4f 53 20 73 70 65 63 69 66 69 63 20 66  ve OS specific f
4ce0: 69 6c 65 20 68 61 6e 64 6c 65 0a 20 2a 09 66 72  ile handle. *.fr
4cf0: 6f 6d 20 69 6e 73 69 64 65 20 74 68 69 73 20 63  om inside this c
4d00: 68 61 6e 6e 65 6c 2e 20 4e 6f 74 20 75 73 65 64  hannel. Not used
4d10: 20 66 6f 72 20 74 72 61 6e 73 66 6f 72 6d 61 74   for transformat
4d20: 69 6f 6e 73 3f 0a 20 2a 0a 20 2a 20 52 65 74 75  ions?. *. * Retu
4d30: 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 66  rns:. *.TCL_OK f
4d40: 6f 72 20 73 75 63 63 65 73 73 20 6f 72 20 54 43  or success or TC
4d50: 4c 5f 45 52 52 4f 52 20 66 6f 72 20 65 72 72 6f  L_ERROR for erro
4d60: 72 20 6f 72 20 69 66 20 6e 6f 74 20 73 75 70 70  r or if not supp
4d70: 6f 72 74 65 64 2e 20 49 66 0a 20 2a 09 64 69 72  orted. If. *.dir
4d80: 65 63 74 69 6f 6e 20 69 73 20 54 43 4c 5f 52 45  ection is TCL_RE
4d90: 41 44 41 42 4c 45 2c 20 73 65 74 73 20 68 61 6e  ADABLE, sets han
4da0: 64 6c 65 50 74 72 20 74 6f 20 74 68 65 20 68 61  dlePtr to the ha
4db0: 6e 64 6c 65 20 75 73 65 64 20 66 6f 72 0a 20 2a  ndle used for. *
4dc0: 09 69 6e 70 75 74 2c 20 6f 72 20 69 66 20 54 43  .input, or if TC
4dd0: 4c 5f 57 52 49 54 41 42 4c 45 20 73 65 74 73 20  L_WRITABLE sets 
4de0: 74 6f 20 74 68 65 20 68 61 6e 64 6c 65 20 75 73  to the handle us
4df0: 65 64 20 66 6f 72 20 6f 75 74 70 75 74 2e 0a 20  ed for output.. 
4e00: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
4e10: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a  s:. *.None. *. *
4e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4e60: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44  ------. */.int D
4e70: 69 67 65 73 74 47 65 74 48 61 6e 64 6c 65 50 72  igestGetHandlePr
4e80: 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  oc(ClientData cl
4e90: 69 65 6e 74 44 61 74 61 2c 20 69 6e 74 20 64 69  ientData, int di
4ea0: 72 65 63 74 69 6f 6e 2c 20 43 6c 69 65 6e 74 44  rection, ClientD
4eb0: 61 74 61 20 2a 68 61 6e 64 6c 65 50 74 72 29 20  ata *handlePtr) 
4ec0: 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74  {.    DigestStat
4ed0: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44  e *statePtr = (D
4ee0: 69 67 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c  igestState *) cl
4ef0: 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 54 63  ientData;.    Tc
4f00: 6c 5f 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74  l_Channel parent
4f10: 3b 0a 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74 20  ;..    /* Abort 
4f20: 69 66 20 6e 6f 20 63 68 61 6e 6e 65 6c 20 2a 2f  if no channel */
4f30: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
4f40: 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f  r->self == (Tcl_
4f50: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
4f60: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
4f70: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  OR;.    }..    p
4f80: 61 72 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53  arent = Tcl_GetS
4f90: 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74  tackedChannel(st
4fa0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 20  atePtr->self);. 
4fb0: 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 47 65     return Tcl_Ge
4fc0: 74 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 28 70  tChannelHandle(p
4fd0: 61 72 65 6e 74 2c 20 64 69 72 65 63 74 69 6f 6e  arent, direction
4fe0: 2c 20 68 61 6e 64 6c 65 50 74 72 29 3b 0a 7d 0a  , handlePtr);.}.
4ff0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
5000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
5040: 20 2a 20 44 69 67 65 73 74 4e 6f 74 69 66 79 50   * DigestNotifyP
5050: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c  roc --. *. *.Cal
5060: 6c 65 64 20 62 79 20 54 63 6c 20 74 6f 20 69 6e  led by Tcl to in
5070: 66 6f 72 6d 20 75 73 20 6f 66 20 61 63 74 69 76  form us of activ
5080: 69 74 79 20 6f 6e 20 74 68 65 20 75 6e 64 65 72  ity on the under
5090: 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 2e 0a 20  lying channel.. 
50a0: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a  *. * Returns:. *
50b0: 09 55 6e 63 68 61 6e 67 65 64 20 69 6e 74 65 72  .Unchanged inter
50c0: 65 73 74 4d 61 73 6b 20 77 68 69 63 68 20 69 73  estMask which is
50d0: 20 61 6e 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e   an OR-ed combin
50e0: 61 74 69 6f 6e 20 6f 66 20 54 43 4c 5f 52 45 41  ation of TCL_REA
50f0: 44 41 42 4c 45 20 6f 72 20 54 43 4c 5f 57 52 49  DABLE or TCL_WRI
5100: 54 41 42 4c 45 0a 20 2a 0a 20 2a 20 53 69 64 65  TABLE. *. * Side
5110: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6e   effects:. *.Can
5120: 63 65 6c 73 20 61 6e 79 20 70 65 6e 64 69 6e 67  cels any pending
5130: 20 74 69 6d 65 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d   timer.. *. *---
5140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5180: 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65  ---. */.int Dige
5190: 73 74 4e 6f 74 69 66 79 50 72 6f 63 28 43 6c 69  stNotifyProc(Cli
51a0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
51b0: 74 61 2c 20 69 6e 74 20 69 6e 74 65 72 65 73 74  ta, int interest
51c0: 4d 61 73 6b 29 20 7b 0a 20 20 20 20 44 69 67 65  Mask) {.    Dige
51d0: 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74  stState *statePt
51e0: 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 65  r = (DigestState
51f0: 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a   *) clientData;.
5200: 0a 20 20 20 20 2f 2a 20 53 6b 69 70 20 74 69 6d  .    /* Skip tim
5210: 65 72 20 65 76 65 6e 74 20 61 73 20 72 65 64 75  er event as redu
5220: 6e 64 61 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20  ndant */.    if 
5230: 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72  (statePtr->timer
5240: 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f   != (Tcl_TimerTo
5250: 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63  ken) NULL) {..Tc
5260: 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e  l_DeleteTimerHan
5270: 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74  dler(statePtr->t
5280: 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72  imer);..statePtr
5290: 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54  ->timer = (Tcl_T
52a0: 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b  imerToken) NULL;
52b0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
52c0: 6e 20 69 6e 74 65 72 65 73 74 4d 61 73 6b 3b 0a  n interestMask;.
52d0: 7d 0a 0a 2f 2a 0a 20 2a 0a 20 2a 20 43 68 61 6e  }../*. *. * Chan
52e0: 6e 65 6c 20 74 79 70 65 20 73 74 72 75 63 74 75  nel type structu
52f0: 72 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f  re definition fo
5300: 72 20 64 69 67 65 73 74 20 74 72 61 6e 73 66 6f  r digest transfo
5310: 72 6d 61 74 69 6f 6e 73 2e 0a 20 2a 0a 20 2a 2f  rmations.. *. */
5320: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 54 63  .static const Tc
5330: 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 64 69  l_ChannelType di
5340: 67 65 73 74 43 68 61 6e 6e 65 6c 54 79 70 65 20  gestChannelType 
5350: 3d 20 7b 0a 20 20 20 20 22 64 69 67 65 73 74 22  = {.    "digest"
5360: 2c 09 09 09 2f 2a 20 54 79 70 65 20 6e 61 6d 65  ,.../* Type name
5370: 20 2a 2f 0a 20 20 20 20 54 43 4c 5f 43 48 41 4e   */.    TCL_CHAN
5380: 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 35 2c 09 2f  NEL_VERSION_5,./
5390: 2a 20 76 35 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  * v5 channel */.
53a0: 20 20 20 20 44 69 67 65 73 74 43 6c 6f 73 65 50      DigestCloseP
53b0: 72 6f 63 2c 09 09 2f 2a 20 43 6c 6f 73 65 20 70  roc,../* Close p
53c0: 72 6f 63 20 2a 2f 0a 20 20 20 20 44 69 67 65 73  roc */.    Diges
53d0: 74 49 6e 70 75 74 50 72 6f 63 2c 09 09 2f 2a 20  tInputProc,../* 
53e0: 49 6e 70 75 74 20 70 72 6f 63 20 2a 2f 0a 20 20  Input proc */.  
53f0: 20 20 44 69 67 65 73 74 4f 75 74 70 75 74 50 72    DigestOutputPr
5400: 6f 63 2c 09 09 2f 2a 20 4f 75 74 70 75 74 20 70  oc,../* Output p
5410: 72 6f 63 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c  roc */.    NULL,
5420: 09 09 09 2f 2a 20 53 65 65 6b 20 70 72 6f 63 20  .../* Seek proc 
5430: 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 53 65 74  */.    DigestSet
5440: 4f 70 74 69 6f 6e 50 72 6f 63 2c 09 2f 2a 20 53  OptionProc,./* S
5450: 65 74 20 6f 70 74 69 6f 6e 20 70 72 6f 63 20 2a  et option proc *
5460: 2f 0a 20 20 20 20 44 69 67 65 73 74 47 65 74 4f  /.    DigestGetO
5470: 70 74 69 6f 6e 50 72 6f 63 2c 09 2f 2a 20 47 65  ptionProc,./* Ge
5480: 74 20 6f 70 74 69 6f 6e 20 70 72 6f 63 20 2a 2f  t option proc */
5490: 0a 20 20 20 20 44 69 67 65 73 74 57 61 74 63 68  .    DigestWatch
54a0: 50 72 6f 63 2c 09 09 2f 2a 20 49 6e 69 74 69 61  Proc,../* Initia
54b0: 6c 69 7a 65 20 6e 6f 74 69 66 69 65 72 20 2a 2f  lize notifier */
54c0: 0a 20 20 20 20 44 69 67 65 73 74 47 65 74 48 61  .    DigestGetHa
54d0: 6e 64 6c 65 50 72 6f 63 2c 09 2f 2a 20 47 65 74  ndleProc,./* Get
54e0: 20 4f 53 20 68 61 6e 64 6c 65 73 20 6f 75 74 20   OS handles out 
54f0: 6f 66 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20  of channel */.  
5500: 20 20 44 69 67 65 73 74 43 6c 6f 73 65 32 50 72    DigestClose2Pr
5510: 6f 63 2c 09 09 2f 2a 20 63 6c 6f 73 65 32 70 72  oc,../* close2pr
5520: 6f 63 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74  oc */.    Digest
5530: 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 2c 09 2f  BlockModeProc,./
5540: 2a 20 53 65 74 20 62 6c 6f 63 6b 69 6e 67 2f 6e  * Set blocking/n
5550: 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2a  onblocking mode*
5560: 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a  /.    NULL,.../*
5570: 20 46 6c 75 73 68 20 70 72 6f 63 20 2a 2f 0a 20   Flush proc */. 
5580: 20 20 20 44 69 67 65 73 74 4e 6f 74 69 66 79 50     DigestNotifyP
5590: 72 6f 63 2c 09 09 2f 2a 20 48 61 6e 64 6c 69 6e  roc,../* Handlin
55a0: 67 20 6f 66 20 65 76 65 6e 74 73 20 62 75 62 62  g of events bubb
55b0: 6c 69 6e 67 20 75 70 20 2a 2f 0a 20 20 20 20 4e  ling up */.    N
55c0: 55 4c 4c 2c 09 09 09 2f 2a 20 57 69 64 65 20 73  ULL,.../* Wide s
55d0: 65 65 6b 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20  eek proc */.    
55e0: 4e 55 4c 4c 2c 09 09 09 2f 2a 20 54 68 72 65 61  NULL,.../* Threa
55f0: 64 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  d action */.    
5600: 4e 55 4c 4c 09 09 09 2f 2a 20 54 72 75 6e 63 61  NULL.../* Trunca
5610: 74 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2d  te */.};../*. *-
5620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5660: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f  -----. *. * Tls_
5670: 44 69 67 65 73 74 43 68 61 6e 6e 65 6c 20 2d 2d  DigestChannel --
5680: 0a 20 2a 0a 20 2a 09 43 72 65 61 74 65 20 61 20  . *. *.Create a 
5690: 73 74 61 63 6b 65 64 20 63 68 61 6e 6e 65 6c 20  stacked channel 
56a0: 66 6f 72 20 61 20 6d 65 73 73 61 67 65 20 64 69  for a message di
56b0: 67 65 73 74 20 74 72 61 6e 73 66 6f 72 6d 61 74  gest transformat
56c0: 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72  ion.. *. * Retur
56d0: 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72  ns:. *.TCL_OK or
56e0: 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a   TCL_ERROR. *. *
56f0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
5700: 2a 09 41 64 64 73 20 74 72 61 6e 73 66 6f 72 6d  *.Adds transform
5710: 20 74 6f 20 63 68 61 6e 6e 65 6c 20 61 6e 64 20   to channel and 
5720: 73 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20 63  sets result to c
5730: 68 61 6e 6e 65 6c 20 69 64 20 6f 72 20 65 72 72  hannel id or err
5740: 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20  or message.. *. 
5750: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
5760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5790: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
57a0: 69 63 20 69 6e 74 0a 54 6c 73 5f 44 69 67 65 73  ic int.Tls_Diges
57b0: 74 43 68 61 6e 6e 65 6c 28 54 63 6c 5f 49 6e 74  tChannel(Tcl_Int
57c0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e  erp *interp, con
57d0: 73 74 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c  st char *channel
57e0: 2c 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a  , const EVP_MD *
57f0: 6d 64 2c 0a 09 63 6f 6e 73 74 20 45 56 50 5f 43  md,..const EVP_C
5800: 49 50 48 45 52 20 2a 63 69 70 68 65 72 2c 20 69  IPHER *cipher, i
5810: 6e 74 20 66 6f 72 6d 61 74 2c 20 54 63 6c 5f 4f  nt format, Tcl_O
5820: 62 6a 20 2a 6b 65 79 4f 62 6a 29 20 7b 0a 20 20  bj *keyObj) {.  
5830: 20 20 69 6e 74 20 6d 6f 64 65 3b 20 2f 2a 20 4f    int mode; /* O
5840: 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  R-ed combination
5850: 20 6f 66 20 54 43 4c 5f 52 45 41 44 41 42 4c 45   of TCL_READABLE
5860: 20 61 6e 64 20 54 43 4c 5f 57 52 49 54 41 42 4c   and TCL_WRITABL
5870: 45 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 43 68 61  E */.    Tcl_Cha
5880: 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 44  nnel chan;.    D
5890: 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74  igestState *stat
58a0: 65 50 74 72 3b 0a 0a 20 20 20 20 2f 2a 20 56 61  ePtr;..    /* Va
58b0: 6c 69 64 61 74 65 20 61 72 67 73 20 2a 2f 0a 20  lidate args */. 
58c0: 20 20 20 69 66 20 28 63 68 61 6e 6e 65 6c 20 3d     if (channel =
58d0: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
58e0: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
58f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
5900: 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 68  }..    /* Get ch
5910: 61 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20 20 20 20  annel Id */.    
5920: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68  chan = Tcl_GetCh
5930: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68  annel(interp, ch
5940: 61 6e 6e 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 20  annel, &mode);. 
5950: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28     if (chan == (
5960: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
5970: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  L) {..return TCL
5980: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
5990: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
59a0: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
59b0: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65  e topmost channe
59c0: 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20  l */.    chan = 
59d0: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65  Tcl_GetTopChanne
59e0: 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a  l(chan);..    /*
59f0: 20 43 72 65 61 74 65 20 73 74 61 74 65 20 64 61   Create state da
5a00: 74 61 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 20  ta struct */.   
5a10: 20 69 66 20 28 28 73 74 61 74 65 50 74 72 20 3d   if ((statePtr =
5a20: 20 54 6c 73 5f 44 69 67 65 73 74 4e 65 77 28 69   Tls_DigestNew(i
5a30: 6e 74 65 72 70 2c 20 66 6f 72 6d 61 74 29 29 20  nterp, format)) 
5a40: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f  == NULL) {..Tcl_
5a50: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
5a60: 65 72 70 2c 20 22 4d 65 6d 6f 72 79 20 61 6c 6c  erp, "Memory all
5a70: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 22 2c 20  ocation error", 
5a80: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
5a90: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
5aa0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61  R;.    }.    sta
5ab0: 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 63 68  tePtr->self = ch
5ac0: 61 6e 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72  an;.    statePtr
5ad0: 2d 3e 6d 6f 64 65 20 3d 20 6d 6f 64 65 3b 0a 0a  ->mode = mode;..
5ae0: 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
5af0: 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20  e hash function 
5b00: 2a 2f 0a 20 20 20 20 69 66 20 28 54 6c 73 5f 44  */.    if (Tls_D
5b10: 69 67 65 73 74 49 6e 69 74 28 69 6e 74 65 72 70  igestInit(interp
5b20: 2c 20 73 74 61 74 65 50 74 72 2c 20 6d 64 2c 20  , statePtr, md, 
5b30: 63 69 70 68 65 72 2c 20 6b 65 79 4f 62 6a 29 20  cipher, keyObj) 
5b40: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65  != TCL_OK) {..re
5b50: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
5b60: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
5b70: 6e 66 69 67 75 72 65 20 63 68 61 6e 6e 65 6c 20  nfigure channel 
5b80: 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68  */.    Tcl_SetCh
5b90: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
5ba0: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e  rp, chan, "-tran
5bb0: 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72  slation", "binar
5bc0: 79 22 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c  y");.    if (Tcl
5bd0: 5f 47 65 74 43 68 61 6e 6e 65 6c 42 75 66 66 65  _GetChannelBuffe
5be0: 72 53 69 7a 65 28 63 68 61 6e 29 20 3c 20 45 56  rSize(chan) < EV
5bf0: 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45 20 2a 20  P_MAX_MD_SIZE * 
5c00: 32 29 20 7b 0a 09 54 63 6c 5f 53 65 74 43 68 61  2) {..Tcl_SetCha
5c10: 6e 6e 65 6c 42 75 66 66 65 72 53 69 7a 65 28 63  nnelBufferSize(c
5c20: 68 61 6e 2c 20 45 56 50 5f 4d 41 58 5f 4d 44 5f  han, EVP_MAX_MD_
5c30: 53 49 5a 45 20 2a 20 32 29 3b 0a 20 20 20 20 7d  SIZE * 2);.    }
5c40: 0a 0a 20 20 20 20 2f 2a 20 53 74 61 63 6b 20 63  ..    /* Stack c
5c50: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 73 74  hannel */.    st
5c60: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 54  atePtr->self = T
5c70: 63 6c 5f 53 74 61 63 6b 43 68 61 6e 6e 65 6c 28  cl_StackChannel(
5c80: 69 6e 74 65 72 70 2c 20 26 64 69 67 65 73 74 43  interp, &digestC
5c90: 68 61 6e 6e 65 6c 54 79 70 65 2c 20 28 43 6c 69  hannelType, (Cli
5ca0: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74  entData) statePt
5cb0: 72 2c 20 6d 6f 64 65 2c 20 63 68 61 6e 29 3b 0a  r, mode, chan);.
5cc0: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
5cd0: 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43  ->self == (Tcl_C
5ce0: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a  hannel) NULL) {.
5cf0: 09 54 6c 73 5f 44 69 67 65 73 74 46 72 65 65 28  .Tls_DigestFree(
5d00: 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75  statePtr);..retu
5d10: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
5d20: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
5d30: 72 65 73 75 6c 74 20 74 6f 20 63 68 61 6e 6e 65  result to channe
5d40: 6c 20 49 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  l Id */.    Tcl_
5d50: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
5d60: 2c 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47  , (char *) Tcl_G
5d70: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68  etChannelName(ch
5d80: 61 6e 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  an), TCL_VOLATIL
5d90: 45 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  E);.    return T
5da0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d  CL_OK;.}../*. *-
5db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5df0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e 73 74  -----. *. * Unst
5e00: 61 63 6b 20 43 68 61 6e 6e 65 6c 20 2d 2d 0a 20  ack Channel --. 
5e10: 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69  *. *.This functi
5e20: 6f 6e 20 72 65 6d 6f 76 65 73 20 74 68 65 20 73  on removes the s
5e30: 74 61 63 6b 65 64 20 63 68 61 6e 6e 65 6c 20 66  tacked channel f
5e40: 72 6f 6d 20 74 68 65 20 74 6f 70 20 6f 66 20 74  rom the top of t
5e50: 68 65 0a 20 2a 09 63 68 61 6e 6e 65 6c 20 73 74  he. *.channel st
5e60: 61 63 6b 20 69 66 20 69 74 20 69 73 20 61 20 64  ack if it is a d
5e70: 69 67 65 73 74 20 63 68 61 6e 6e 65 6c 2e 0a 20  igest channel.. 
5e80: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a  *. * Returns:. *
5e90: 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45  .TCL_OK or TCL_E
5ea0: 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20  RROR. *. * Side 
5eb0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 52 65 6d 6f  effects:. *.Remo
5ec0: 76 65 73 20 74 72 61 6e 73 66 6f 72 6d 20 66 72  ves transform fr
5ed0: 6f 6d 20 63 68 61 6e 6e 65 6c 20 6f 72 20 73 65  om channel or se
5ee0: 74 73 20 72 65 73 75 6c 74 20 74 6f 20 65 72 72  ts result to err
5ef0: 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20  or message.. *. 
5f00: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
5f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f40: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
5f50: 69 63 20 69 6e 74 0a 55 6e 73 74 61 63 6b 4f 62  ic int.UnstackOb
5f60: 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20  jCmd(ClientData 
5f70: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f  clientData, Tcl_
5f80: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
5f90: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
5fa0: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j *const objv[])
5fb0: 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e   {.    Tcl_Chann
5fc0: 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 69 6e 74  el chan;.    int
5fd0: 20 6d 6f 64 65 3b 20 2f 2a 20 4f 52 2d 65 64 20   mode; /* OR-ed 
5fe0: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 54  combination of T
5ff0: 43 4c 5f 52 45 41 44 41 42 4c 45 20 61 6e 64 20  CL_READABLE and 
6000: 54 43 4c 5f 57 52 49 54 41 42 4c 45 20 20 2a 2f  TCL_WRITABLE  */
6010: 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74  ..    /* Validat
6020: 65 20 61 72 67 20 63 6f 75 6e 74 20 2a 2f 0a 20  e arg count */. 
6030: 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32     if (objc != 2
6040: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75  ) {..Tcl_WrongNu
6050: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
6060: 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22   objv, "channel"
6070: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
6080: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
6090: 20 2f 2a 20 47 65 74 20 63 68 61 6e 6e 65 6c 20   /* Get channel 
60a0: 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  */.    chan = Tc
60b0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74  l_GetChannel(int
60c0: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
60d0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31  ngFromObj(objv[1
60e0: 5d 2c 20 4e 55 4c 4c 29 2c 20 26 6d 6f 64 65 29  ], NULL), &mode)
60f0: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d  ;.    if (chan =
6100: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
6110: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
6120: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
6130: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
6140: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  re to operate on
6150: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61   the topmost cha
6160: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e  nnel */.    chan
6170: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61   = Tcl_GetTopCha
6180: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20  nnel(chan);..   
6190: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 69 67   /* Check if dig
61a0: 65 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  est channel */. 
61b0: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68     if (Tcl_GetCh
61c0: 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20  annelType(chan) 
61d0: 21 3d 20 26 64 69 67 65 73 74 43 68 61 6e 6e 65  != &digestChanne
61e0: 6c 54 79 70 65 29 20 7b 0a 09 54 63 6c 5f 41 70  lType) {..Tcl_Ap
61f0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
6200: 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20  p, "bad channel 
6210: 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e  \"", Tcl_GetChan
6220: 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09  nelName(chan),..
6230: 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 64      "\": not a d
6240: 69 67 65 73 74 20 63 68 61 6e 6e 65 6c 22 2c 20  igest channel", 
6250: 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45  NULL);..Tcl_SetE
6260: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
6270: 20 22 54 4c 53 22 2c 20 22 55 4e 53 54 41 43 4b   "TLS", "UNSTACK
6280: 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49  ", "CHANNEL", "I
6290: 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a  NVALID", (char *
62a0: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  ) NULL);..return
62b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
62c0: 7d 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 20 74 72  }..    /* Pop tr
62d0: 61 6e 73 66 6f 72 6d 20 66 72 6f 6d 20 63 68 61  ansform from cha
62e0: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 72 65 74 75  nnel */.    retu
62f0: 72 6e 20 54 63 6c 5f 55 6e 73 74 61 63 6b 43 68  rn Tcl_UnstackCh
6300: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68  annel(interp, ch
6310: 61 6e 29 3b 0a 20 20 20 20 09 63 6c 69 65 6e 74  an);.    .client
6320: 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74  Data = clientDat
6330: 61 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  a;.}../*********
6340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 73 74 61  **********/..sta
6380: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
6390: 69 6e 73 74 61 6e 63 65 5f 66 6e 73 20 5b 5d 20  instance_fns [] 
63a0: 3d 20 7b 20 22 66 69 6e 61 6c 69 7a 65 22 2c 20  = { "finalize", 
63b0: 22 75 70 64 61 74 65 22 2c 20 4e 55 4c 4c 20 7d  "update", NULL }
63c0: 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  ;../*. *--------
63d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
63e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
63f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
6410: 2a 20 49 6e 73 74 61 6e 63 65 4f 62 6a 43 6d 64  * InstanceObjCmd
6420: 20 2d 2d 0a 20 2a 0a 20 2a 09 48 61 6e 64 6c 65   --. *. *.Handle
6430: 72 20 66 6f 72 20 64 69 67 65 73 74 20 63 6f 6d  r for digest com
6440: 6d 61 6e 64 20 69 6e 73 74 61 6e 63 65 73 2e 20  mand instances. 
6450: 55 73 65 64 20 74 6f 20 61 64 64 20 64 61 74 61  Used to add data
6460: 20 74 6f 20 68 61 73 68 0a 20 2a 09 66 75 6e 63   to hash. *.func
6470: 74 69 6f 6e 20 6f 72 20 72 65 74 72 69 65 76 65  tion or retrieve
6480: 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 2e   message digest.
6490: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a  . *. * Returns:.
64a0: 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c   *.TCL_OK or TCL
64b0: 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64  _ERROR. *. * Sid
64c0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 41 64  e effects:. *.Ad
64d0: 64 73 20 64 61 74 61 20 74 6f 20 68 61 73 68 20  ds data to hash 
64e0: 6f 72 20 72 65 74 75 72 6e 73 20 6d 65 73 73 61  or returns messa
64f0: 67 65 20 64 69 67 65 73 74 0a 20 2a 0a 20 2a 2d  ge digest. *. *-
6500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6540: 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 49 6e 73 74 61  --. */.int Insta
6550: 6e 63 65 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74  nceObjCmd(Client
6560: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
6570: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
6580: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
6590: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
65a0: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 44 69 67 65  jv[]) {.    Dige
65b0: 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74  stState *statePt
65c0: 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 65  r = (DigestState
65d0: 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a   *) clientData;.
65e0: 20 20 20 20 69 6e 74 20 66 6e 2c 20 6c 65 6e 20      int fn, len 
65f0: 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 62  = 0;.    char *b
6600: 75 66 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20  uf = NULL;..    
6610: 2f 2a 20 56 61 6c 69 64 61 74 65 20 61 72 67 20  /* Validate arg 
6620: 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20  count */.    if 
6630: 28 6f 62 6a 63 20 3c 20 32 20 7c 7c 20 6f 62 6a  (objc < 2 || obj
6640: 63 20 3e 20 33 29 20 7b 0a 09 54 63 6c 5f 57 72  c > 3) {..Tcl_Wr
6650: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
6660: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 66 75 6e  p, 1, objv, "fun
6670: 63 74 69 6f 6e 20 3f 64 61 74 61 3f 22 29 3b 0a  ction ?data?");.
6680: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
6690: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
66a0: 20 47 65 74 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   Get function */
66b0: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74  .    if (Tcl_Get
66c0: 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74  IndexFromObj(int
66d0: 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 69 6e  erp, objv[1], in
66e0: 73 74 61 6e 63 65 5f 66 6e 73 2c 20 22 66 75 6e  stance_fns, "fun
66f0: 63 74 69 6f 6e 22 2c 20 30 2c 20 26 66 6e 29 20  ction", 0, &fn) 
6700: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65  != TCL_OK) {..re
6710: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6720: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f      }..    /* Do
6730: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20   function */.   
6740: 20 69 66 20 28 66 6e 29 20 7b 0a 09 2f 2a 20 47   if (fn) {../* G
6750: 65 74 20 64 61 74 61 20 6f 72 20 72 65 74 75 72  et data or retur
6760: 6e 20 65 72 72 6f 72 20 69 66 20 6e 6f 6e 65 20  n error if none 
6770: 2a 2f 0a 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20  */..if (objc == 
6780: 33 29 20 7b 0a 09 20 20 20 20 62 75 66 20 3d 20  3) {..    buf = 
6790: 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
67a0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
67b0: 20 26 6c 65 6e 29 3b 0a 09 7d 20 65 6c 73 65 20   &len);..} else 
67c0: 7b 0a 09 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  {..    Tcl_Wrong
67d0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
67e0: 31 2c 20 6f 62 6a 76 2c 20 22 75 70 64 61 74 65  1, objv, "update
67f0: 20 64 61 74 61 22 29 3b 0a 09 20 20 20 20 72 65   data");..    re
6800: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6810: 09 7d 0a 0a 09 2f 2a 20 55 70 64 61 74 65 20 68  .}.../* Update h
6820: 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ash function */.
6830: 09 69 66 20 28 21 54 6c 73 5f 44 69 67 65 73 74  .if (!Tls_Digest
6840: 55 70 64 61 74 65 28 73 74 61 74 65 50 74 72 2c  Update(statePtr,
6850: 20 62 75 66 2c 20 28 73 69 7a 65 5f 74 29 20 6c   buf, (size_t) l
6860: 65 6e 2c 20 31 29 29 20 7b 0a 09 20 20 20 20 72  en, 1)) {..    r
6870: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
6880: 0a 09 7d 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20  ..}..    } else 
6890: 7b 0a 09 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 68  {../* Finalize h
68a0: 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  ash function and
68b0: 20 63 61 6c 63 75 6c 61 74 65 20 6d 65 73 73 61   calculate messa
68c0: 67 65 20 64 69 67 65 73 74 20 2a 2f 0a 09 69 66  ge digest */..if
68d0: 20 28 54 6c 73 5f 44 69 67 65 73 74 46 69 6e 69   (Tls_DigestFini
68e0: 61 6c 69 7a 65 28 69 6e 74 65 72 70 2c 20 73 74  alize(interp, st
68f0: 61 74 65 50 74 72 29 20 21 3d 20 54 43 4c 5f 4f  atePtr) != TCL_O
6900: 4b 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e  K) {..    return
6910: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a   TCL_ERROR;..}..
6920: 09 54 63 6c 5f 44 65 6c 65 74 65 43 6f 6d 6d 61  .Tcl_DeleteComma
6930: 6e 64 46 72 6f 6d 54 6f 6b 65 6e 28 69 6e 74 65  ndFromToken(inte
6940: 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 74 6f  rp, statePtr->to
6950: 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ken);.    }.    
6960: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
6970: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
6980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
69a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
69b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
69c0: 20 49 6e 73 74 61 6e 63 65 44 65 6c 43 61 6c 6c   InstanceDelCall
69d0: 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 20 43  back --. *. *. C
69e0: 61 6c 6c 62 61 63 6b 20 74 6f 20 63 6c 65 61 6e  allback to clean
69f0: 2d 75 70 20 77 68 65 6e 20 64 69 67 65 73 74 20  -up when digest 
6a00: 69 6e 73 74 61 6e 63 65 20 63 6f 6d 6d 61 6e 64  instance command
6a10: 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 2a 0a   is deleted.. *.
6a20: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 4e   * Returns:. *.N
6a30: 6f 74 68 69 6e 67 0a 20 2a 0a 20 2a 20 53 69 64  othing. *. * Sid
6a40: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 44 65  e effects:. *.De
6a50: 73 74 72 6f 79 73 20 73 74 72 75 63 74 0a 20 2a  stroys struct. *
6a60: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
6a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6aa0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20  ------. */.void 
6ab0: 49 6e 73 74 61 6e 63 65 44 65 6c 43 61 6c 6c 62  InstanceDelCallb
6ac0: 61 63 6b 28 43 6c 69 65 6e 74 44 61 74 61 20 63  ack(ClientData c
6ad0: 6c 69 65 6e 74 44 61 74 61 29 20 7b 0a 20 20 20  lientData) {.   
6ae0: 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74   DigestState *st
6af0: 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 74  atePtr = (Digest
6b00: 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44  State *) clientD
6b10: 61 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 43 6c 65  ata;..    /* Cle
6b20: 61 6e 2d 75 70 20 2a 2f 0a 20 20 20 20 54 6c 73  an-up */.    Tls
6b30: 5f 44 69 67 65 73 74 46 72 65 65 28 73 74 61 74  _DigestFree(stat
6b40: 65 50 74 72 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d  ePtr);.}../*. *-
6b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b90: 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 44 69 67  --. *. * Tls_Dig
6ba0: 65 73 74 49 6e 73 74 61 6e 63 65 20 2d 2d 0a 20  estInstance --. 
6bb0: 2a 0a 20 2a 09 20 43 72 65 61 74 65 20 63 6f 6d  *. *. Create com
6bc0: 6d 61 6e 64 20 74 6f 20 61 6c 6c 6f 77 20 75 73  mand to allow us
6bd0: 65 72 20 74 6f 20 61 64 64 20 64 61 74 61 20 74  er to add data t
6be0: 6f 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e  o hash function.
6bf0: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a  . *. * Returns:.
6c00: 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c   *.TCL_OK or TCL
6c10: 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64  _ERROR. *. * Sid
6c20: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 72  e effects:. *.Cr
6c30: 65 61 74 65 73 20 63 6f 6d 6d 61 6e 64 20 6f 72  eates command or
6c40: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20   error message. 
6c50: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
6c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c90: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20  -------. */.int 
6ca0: 54 6c 73 5f 44 69 67 65 73 74 49 6e 73 74 61 6e  Tls_DigestInstan
6cb0: 63 65 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  ce(Tcl_Interp *i
6cc0: 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a  nterp, Tcl_Obj *
6cd0: 63 6d 64 4f 62 6a 2c 20 63 6f 6e 73 74 20 45 56  cmdObj, const EV
6ce0: 50 5f 4d 44 20 2a 6d 64 2c 0a 09 63 6f 6e 73 74  P_MD *md,..const
6cf0: 20 45 56 50 5f 43 49 50 48 45 52 20 2a 63 69 70   EVP_CIPHER *cip
6d00: 68 65 72 2c 20 69 6e 74 20 66 6f 72 6d 61 74 2c  her, int format,
6d10: 20 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4f 62 6a   Tcl_Obj *keyObj
6d20: 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74  ) {.    DigestSt
6d30: 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20  ate *statePtr;. 
6d40: 20 20 20 63 68 61 72 20 2a 63 6d 64 4e 61 6d 65     char *cmdName
6d50: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
6d60: 46 72 6f 6d 4f 62 6a 28 63 6d 64 4f 62 6a 2c 20  FromObj(cmdObj, 
6d70: 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  NULL);..    /* C
6d80: 72 65 61 74 65 20 73 74 61 74 65 20 64 61 74 61  reate state data
6d90: 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 20 20 69   struct */.    i
6da0: 66 20 28 28 73 74 61 74 65 50 74 72 20 3d 20 54  f ((statePtr = T
6db0: 6c 73 5f 44 69 67 65 73 74 4e 65 77 28 69 6e 74  ls_DigestNew(int
6dc0: 65 72 70 2c 20 66 6f 72 6d 61 74 29 29 20 3d 3d  erp, format)) ==
6dd0: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70   NULL) {..Tcl_Ap
6de0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
6df0: 70 2c 20 22 4d 65 6d 6f 72 79 20 61 6c 6c 6f 63  p, "Memory alloc
6e00: 61 74 69 6f 6e 20 65 72 72 6f 72 22 2c 20 28 63  ation error", (c
6e10: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72  har *) NULL);..r
6e20: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
6e30: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
6e40: 6e 69 74 69 61 6c 69 7a 65 20 68 61 73 68 20 66  nitialize hash f
6e50: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69  unction */.    i
6e60: 66 20 28 54 6c 73 5f 44 69 67 65 73 74 49 6e 69  f (Tls_DigestIni
6e70: 74 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50  t(interp, stateP
6e80: 74 72 2c 20 6d 64 2c 20 63 69 70 68 65 72 2c 20  tr, md, cipher, 
6e90: 6b 65 79 4f 62 6a 29 20 21 3d 20 54 43 4c 5f 4f  keyObj) != TCL_O
6ea0: 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  K) {..return TCL
6eb0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
6ec0: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 69 6e 73     /* Create ins
6ed0: 74 61 6e 63 65 20 63 6f 6d 6d 61 6e 64 20 2a 2f  tance command */
6ee0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 74  .    statePtr->t
6ef0: 6f 6b 65 6e 20 3d 20 54 63 6c 5f 43 72 65 61 74  oken = Tcl_Creat
6f00: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
6f10: 72 70 2c 20 63 6d 64 4e 61 6d 65 2c 20 49 6e 73  rp, cmdName, Ins
6f20: 74 61 6e 63 65 4f 62 6a 43 6d 64 2c 0a 09 28 43  tanceObjCmd,..(C
6f30: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65  lientData) state
6f40: 50 74 72 2c 20 49 6e 73 74 61 6e 63 65 44 65 6c  Ptr, InstanceDel
6f50: 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20  Callback);..    
6f60: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 6d 6d 61 6e  /* Return comman
6f70: 64 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 54 63  d name */.    Tc
6f80: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
6f90: 6e 74 65 72 70 2c 20 63 6d 64 4f 62 6a 29 3b 0a  nterp, cmdObj);.
6fa0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
6fb0: 4b 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  K;.}.../********
6fc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6fd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
7000: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
7010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7040: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73  ------. *. * Tls
7050: 5f 44 69 67 65 73 74 44 61 74 61 20 2d 2d 0a 20  _DigestData --. 
7060: 2a 0a 20 2a 09 52 65 74 75 72 6e 20 6d 65 73 73  *. *.Return mess
7070: 61 67 65 20 64 69 67 65 73 74 20 66 6f 72 20 64  age digest for d
7080: 61 74 61 20 75 73 69 6e 67 20 75 73 65 72 20 73  ata using user s
7090: 70 65 63 69 66 69 65 64 20 68 61 73 68 20 66 75  pecified hash fu
70a0: 6e 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65  nction.. *. * Re
70b0: 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b  turns:. *.TCL_OK
70c0: 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a   or TCL_ERROR. *
70d0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
70e0: 3a 0a 20 2a 09 53 65 74 73 20 72 65 73 75 6c 74  :. *.Sets result
70f0: 20 74 6f 20 6d 65 73 73 61 67 65 20 64 69 67 65   to message dige
7100: 73 74 20 6f 72 20 65 72 72 6f 72 20 6d 65 73 73  st or error mess
7110: 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  age. *. *-------
7120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
7160: 0a 69 6e 74 0a 54 6c 73 5f 44 69 67 65 73 74 44  .int.Tls_DigestD
7170: 61 74 61 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ata(Tcl_Interp *
7180: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
7190: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
71a0: 20 6f 62 6a 76 5b 5d 2c 0a 09 63 6f 6e 73 74 20   objv[],..const 
71b0: 45 56 50 5f 4d 44 20 2a 6d 64 2c 20 63 6f 6e 73  EVP_MD *md, cons
71c0: 74 20 45 56 50 5f 43 49 50 48 45 52 20 2a 63 69  t EVP_CIPHER *ci
71d0: 70 68 65 72 2c 20 69 6e 74 20 66 6f 72 6d 61 74  pher, int format
71e0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4f 62  , Tcl_Obj *keyOb
71f0: 6a 29 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 64  j) {.    char *d
7200: 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e  ata;.    int len
7210: 2c 20 72 65 73 3b 0a 20 20 20 20 75 6e 73 69 67  , res;.    unsig
7220: 6e 65 64 20 69 6e 74 20 6d 64 5f 6c 65 6e 3b 0a  ned int md_len;.
7230: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
7240: 72 20 6d 64 5f 62 75 66 5b 45 56 50 5f 4d 41 58  r md_buf[EVP_MAX
7250: 5f 4d 44 5f 53 49 5a 45 5d 3b 0a 0a 20 20 20 20  _MD_SIZE];..    
7260: 2f 2a 20 56 61 6c 69 64 61 74 65 20 61 72 67 20  /* Validate arg 
7270: 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20  count */.    if 
7280: 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54  (objc != 2) {..T
7290: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
72a0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
72b0: 20 22 64 61 74 61 22 29 3b 0a 09 72 65 74 75 72   "data");..retur
72c0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
72d0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 64   }..    /* Get d
72e0: 61 74 61 20 2a 2f 0a 20 20 20 20 64 61 74 61 20  ata */.    data 
72f0: 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
7300: 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31  ayFromObj(objv[1
7310: 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 69 66  ], &len);.    if
7320: 20 28 64 61 74 61 20 3d 3d 20 4e 55 4c 4c 20 7c   (data == NULL |
7330: 7c 20 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 54  | len == 0) {..T
7340: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
7350: 65 72 70 2c 20 22 4e 6f 20 64 61 74 61 22 2c 20  erp, "No data", 
7360: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
7370: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
7380: 0a 20 20 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74  .    /* Calculat
7390: 65 20 64 69 67 65 73 74 20 62 61 73 65 64 20 6f  e digest based o
73a0: 6e 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20  n hash function 
73b0: 2a 2f 0a 20 20 20 20 69 66 20 28 66 6f 72 6d 61  */.    if (forma
73c0: 74 20 26 20 54 59 50 45 5f 4d 44 29 20 7b 0a 09  t & TYPE_MD) {..
73d0: 72 65 73 20 3d 20 45 56 50 5f 44 69 67 65 73 74  res = EVP_Digest
73e0: 28 64 61 74 61 2c 20 28 73 69 7a 65 5f 74 29 20  (data, (size_t) 
73f0: 6c 65 6e 2c 20 6d 64 5f 62 75 66 2c 20 26 6d 64  len, md_buf, &md
7400: 5f 6c 65 6e 2c 20 6d 64 2c 20 4e 55 4c 4c 29 3b  _len, md, NULL);
7410: 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
7420: 28 66 6f 72 6d 61 74 20 26 20 54 59 50 45 5f 48  (format & TYPE_H
7430: 4d 41 43 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64  MAC) {..unsigned
7440: 20 63 68 61 72 20 2a 6b 65 79 2c 20 2a 68 6d 61   char *key, *hma
7450: 63 20 3d 20 4e 55 4c 4c 3b 0a 09 69 6e 74 20 6b  c = NULL;..int k
7460: 65 79 5f 6c 65 6e 3b 0a 0a 09 6b 65 79 20 3d 20  ey_len;...key = 
7470: 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
7480: 46 72 6f 6d 4f 62 6a 28 6b 65 79 4f 62 6a 2c 20  FromObj(keyObj, 
7490: 26 6b 65 79 5f 6c 65 6e 29 3b 0a 09 68 6d 61 63  &key_len);..hmac
74a0: 20 3d 20 48 4d 41 43 28 6d 64 2c 20 28 63 6f 6e   = HMAC(md, (con
74b0: 73 74 20 76 6f 69 64 20 2a 29 20 6b 65 79 2c 20  st void *) key, 
74c0: 6b 65 79 5f 6c 65 6e 2c 20 28 63 6f 6e 73 74 20  key_len, (const 
74d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
74e0: 20 64 61 74 61 2c 0a 09 20 20 20 20 28 73 69 7a   data,..    (siz
74f0: 65 5f 74 29 20 6c 65 6e 2c 20 6d 64 5f 62 75 66  e_t) len, md_buf
7500: 2c 20 26 6d 64 5f 6c 65 6e 29 3b 0a 09 72 65 73  , &md_len);..res
7510: 20 3d 20 28 68 6d 61 63 20 21 3d 20 4e 55 4c 4c   = (hmac != NULL
7520: 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  );..    } else i
7530: 66 20 28 66 6f 72 6d 61 74 20 26 20 54 59 50 45  f (format & TYPE
7540: 5f 43 4d 41 43 29 20 7b 0a 09 44 69 67 65 73 74  _CMAC) {..Digest
7550: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b  State *statePtr;
7560: 0a 0a 09 69 66 20 28 28 73 74 61 74 65 50 74 72  ...if ((statePtr
7570: 20 3d 20 54 6c 73 5f 44 69 67 65 73 74 4e 65 77   = Tls_DigestNew
7580: 28 69 6e 74 65 72 70 2c 20 66 6f 72 6d 61 74 29  (interp, format)
7590: 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  ) == NULL) {..  
75a0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
75b0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 4d 65 6d 6f  lt(interp, "Memo
75c0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
75d0: 72 6f 72 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ror", (char *) N
75e0: 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72  ULL);..    retur
75f0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
7600: 09 69 66 20 28 54 6c 73 5f 44 69 67 65 73 74 49  .if (Tls_DigestI
7610: 6e 69 74 28 69 6e 74 65 72 70 2c 20 73 74 61 74  nit(interp, stat
7620: 65 50 74 72 2c 20 6d 64 2c 20 63 69 70 68 65 72  ePtr, md, cipher
7630: 2c 20 6b 65 79 4f 62 6a 29 20 21 3d 20 54 43 4c  , keyObj) != TCL
7640: 5f 4f 4b 20 7c 7c 0a 09 20 20 20 20 54 6c 73 5f  _OK ||..    Tls_
7650: 44 69 67 65 73 74 55 70 64 61 74 65 28 73 74 61  DigestUpdate(sta
7660: 74 65 50 74 72 2c 20 64 61 74 61 2c 20 28 73 69  tePtr, data, (si
7670: 7a 65 5f 74 29 20 6c 65 6e 2c 20 31 29 20 3d 3d  ze_t) len, 1) ==
7680: 20 30 20 7c 7c 0a 09 20 20 20 20 54 6c 73 5f 44   0 ||..    Tls_D
7690: 69 67 65 73 74 46 69 6e 69 61 6c 69 7a 65 28 69  igestFinialize(i
76a0: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 29  nterp, statePtr)
76b0: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20   != TCL_OK) {.. 
76c0: 20 20 20 54 6c 73 5f 44 69 67 65 73 74 46 72 65     Tls_DigestFre
76d0: 65 28 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20  e(statePtr);..  
76e0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
76f0: 4f 52 3b 0a 09 7d 0a 09 54 6c 73 5f 44 69 67 65  OR;..}..Tls_Dige
7700: 73 74 46 72 65 65 28 73 74 61 74 65 50 74 72 29  stFree(statePtr)
7710: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  ;..return TCL_OK
7720: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
7730: 4f 75 74 70 75 74 20 64 69 67 65 73 74 20 74 6f  Output digest to
7740: 20 72 65 73 75 6c 74 20 70 65 72 20 66 6f 72 6d   result per form
7750: 61 74 20 28 62 69 6e 20 6f 72 20 68 65 78 29 20  at (bin or hex) 
7760: 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 73 29 20  */.    if (res) 
7770: 7b 0a 09 69 66 20 28 66 6f 72 6d 61 74 20 26 20  {..if (format & 
7780: 42 49 4e 5f 46 4f 52 4d 41 54 29 20 7b 0a 09 20  BIN_FORMAT) {.. 
7790: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
77a0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
77b0: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
77c0: 6d 64 5f 62 75 66 2c 20 6d 64 5f 6c 65 6e 29 29  md_buf, md_len))
77d0: 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  ;...} else {..  
77e0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c    Tcl_Obj *resul
77f0: 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f 62  tObj = Tcl_NewOb
7800: 6a 28 29 3b 0a 09 20 20 20 20 75 6e 73 69 67 6e  j();..    unsign
7810: 65 64 20 63 68 61 72 20 2a 70 74 72 20 3d 20 54  ed char *ptr = T
7820: 63 6c 5f 53 65 74 42 79 74 65 41 72 72 61 79 4c  cl_SetByteArrayL
7830: 65 6e 67 74 68 28 72 65 73 75 6c 74 4f 62 6a 2c  ength(resultObj,
7840: 20 6d 64 5f 6c 65 6e 2a 32 29 3b 0a 0a 09 20 20   md_len*2);...  
7850: 20 20 66 6f 72 20 28 75 6e 73 69 67 6e 65 64 20    for (unsigned 
7860: 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 6d  int i = 0; i < m
7870: 64 5f 6c 65 6e 3b 20 69 2b 2b 29 20 7b 0a 09 09  d_len; i++) {...
7880: 2a 70 74 72 2b 2b 20 3d 20 68 65 78 5b 28 6d 64  *ptr++ = hex[(md
7890: 5f 62 75 66 5b 69 5d 20 3e 3e 20 34 29 20 26 20  _buf[i] >> 4) & 
78a0: 30 78 30 46 5d 3b 0a 09 09 2a 70 74 72 2b 2b 20  0x0F];...*ptr++ 
78b0: 3d 20 68 65 78 5b 6d 64 5f 62 75 66 5b 69 5d 20  = hex[md_buf[i] 
78c0: 26 20 30 78 30 46 5d 3b 0a 09 20 20 20 20 7d 0a  & 0x0F];..    }.
78d0: 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c  .Tcl_SetObjResul
78e0: 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74  t(interp, result
78f0: 4f 62 6a 29 3b 0a 09 7d 0a 0a 20 20 20 20 7d 20  Obj);..}..    } 
7900: 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 41 70 70 65  else {..Tcl_Appe
7910: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
7920: 20 22 48 61 73 68 20 63 61 6c 63 75 6c 61 74 69   "Hash calculati
7930: 6f 6e 20 65 72 72 6f 72 3a 22 2c 20 52 45 41 53  on error:", REAS
7940: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
7950: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  ULL);..return TC
7960: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
7970: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
7980: 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}.../*********
7990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
79a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
79b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
79c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
79d0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
79e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
79f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a10: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65  -----. *. * Dige
7a20: 73 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20  stObjCmd --. *. 
7a30: 2a 09 52 65 74 75 72 6e 20 6d 65 73 73 61 67 65  *.Return message
7a40: 20 64 69 67 65 73 74 20 75 73 69 6e 67 20 75 73   digest using us
7a50: 65 72 20 73 70 65 63 69 66 69 65 64 20 68 61 73  er specified has
7a60: 68 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 0a 20  h function.. *. 
7a70: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43  * Returns:. *.TC
7a80: 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f  L_OK or TCL_ERRO
7a90: 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  R. *. * Side eff
7aa0: 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 72 65  ects:. *.Sets re
7ab0: 73 75 6c 74 20 74 6f 20 6d 65 73 73 61 67 65 20  sult to message 
7ac0: 64 69 67 65 73 74 20 6f 72 20 65 72 72 6f 72 20  digest or error 
7ad0: 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d  message. *. *---
7ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7b20: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
7b30: 44 69 67 65 73 74 4d 61 69 6e 28 69 6e 74 20 74  DigestMain(int t
7b40: 79 70 65 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ype, Tcl_Interp 
7b50: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
7b60: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
7b70: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
7b80: 69 6e 74 20 69 64 78 2c 20 6c 65 6e 2c 20 66 6f  int idx, len, fo
7b90: 72 6d 61 74 20 3d 20 48 45 58 5f 46 4f 52 4d 41  rmat = HEX_FORMA
7ba0: 54 2c 20 72 65 73 20 3d 20 54 43 4c 5f 4f 4b 2c  T, res = TCL_OK,
7bb0: 20 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20   flags = 0;.    
7bc0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 69 67 65  const char *dige
7bd0: 73 74 4e 61 6d 65 2c 20 2a 63 68 61 6e 6e 65 6c  stName, *channel
7be0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c   = NULL;.    Tcl
7bf0: 5f 4f 62 6a 20 2a 63 6d 64 4f 62 6a 20 3d 20 4e  _Obj *cmdObj = N
7c00: 55 4c 4c 2c 20 2a 64 61 74 61 4f 62 6a 20 3d 20  ULL, *dataObj = 
7c10: 4e 55 4c 4c 2c 20 2a 66 69 6c 65 4f 62 6a 20 3d  NULL, *fileObj =
7c20: 20 4e 55 4c 4c 2c 20 2a 6b 65 79 4f 62 6a 20 3d   NULL, *keyObj =
7c30: 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e 73 69 67   NULL;.    unsig
7c40: 6e 65 64 20 63 68 61 72 20 2a 63 69 70 68 65 72  ned char *cipher
7c50: 4e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  Name = NULL;.   
7c60: 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d   const EVP_MD *m
7c70: 64 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45 56 50  d;.    const EVP
7c80: 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 20  _CIPHER *cipher 
7c90: 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20  = NULL;..    /* 
7ca0: 43 6c 65 61 72 20 69 6e 74 65 72 70 20 72 65 73  Clear interp res
7cb0: 75 6c 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 52  ult */.    Tcl_R
7cc0: 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
7cd0: 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69  p);..    /* Vali
7ce0: 64 61 74 65 20 61 72 67 20 63 6f 75 6e 74 20 2a  date arg count *
7cf0: 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c  /.    if (objc <
7d00: 20 33 20 7c 7c 20 6f 62 6a 63 20 3e 20 39 29 20   3 || objc > 9) 
7d10: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  {..Tcl_WrongNumA
7d20: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
7d30: 62 6a 76 2c 20 22 64 69 67 65 73 74 20 3f 2d 62  bjv, "digest ?-b
7d40: 69 6e 7c 2d 68 65 78 3f 20 3f 2d 63 69 70 68 65  in|-hex? ?-ciphe
7d50: 72 20 6e 61 6d 65 3f 20 3f 2d 6b 65 79 20 68 6d  r name? ?-key hm
7d60: 61 63 5f 6b 65 79 3f 20 5b 2d 63 68 61 6e 6e 65  ac_key? [-channe
7d70: 6c 20 63 68 61 6e 20 7c 20 2d 63 6f 6d 6d 61 6e  l chan | -comman
7d80: 64 20 63 6d 64 4e 61 6d 65 20 7c 20 2d 66 69 6c  d cmdName | -fil
7d90: 65 20 66 69 6c 65 6e 61 6d 65 20 7c 20 3f 2d 64  e filename | ?-d
7da0: 61 74 61 3f 20 64 61 74 61 5d 22 29 3b 0a 09 72  ata? data]");..r
7db0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7dc0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
7dd0: 65 74 20 64 69 67 65 73 74 20 2a 2f 0a 20 20 20  et digest */.   
7de0: 20 64 69 67 65 73 74 4e 61 6d 65 20 3d 20 54 63   digestName = Tc
7df0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
7e00: 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 26 6c 65 6e  bj(objv[1], &len
7e10: 29 3b 0a 20 20 20 20 69 66 20 28 64 69 67 65 73  );.    if (diges
7e20: 74 4e 61 6d 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c  tName == NULL ||
7e30: 20 28 6d 64 20 3d 20 45 56 50 5f 67 65 74 5f 64   (md = EVP_get_d
7e40: 69 67 65 73 74 62 79 6e 61 6d 65 28 64 69 67 65  igestbyname(dige
7e50: 73 74 4e 61 6d 65 29 29 20 3d 3d 20 4e 55 4c 4c  stName)) == NULL
7e60: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
7e70: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 49  esult(interp, "I
7e80: 6e 76 61 6c 69 64 20 64 69 67 65 73 74 20 5c 22  nvalid digest \"
7e90: 22 2c 20 64 69 67 65 73 74 4e 61 6d 65 2c 20 22  ", digestName, "
7ea0: 5c 22 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  \"", NULL);..ret
7eb0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
7ec0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 70 74     }..    /* Opt
7ed0: 69 6d 61 6c 20 63 61 73 65 20 66 6f 72 20 62 6c  imal case for bl
7ee0: 6f 62 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20  ob of data */.  
7ef0: 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 33 20    if (objc == 3 
7f00: 26 26 20 74 79 70 65 20 3d 3d 20 54 59 50 45 5f  && type == TYPE_
7f10: 4d 44 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 6c  MD) {..return Tl
7f20: 73 5f 44 69 67 65 73 74 44 61 74 61 28 69 6e 74  s_DigestData(int
7f30: 65 72 70 2c 20 2d 2d 6f 62 6a 63 2c 20 2b 2b 6f  erp, --objc, ++o
7f40: 62 6a 76 2c 20 6d 64 2c 20 4e 55 4c 4c 2c 20 48  bjv, md, NULL, H
7f50: 45 58 5f 46 4f 52 4d 41 54 20 7c 20 54 59 50 45  EX_FORMAT | TYPE
7f60: 5f 4d 44 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  _MD, NULL);.    
7f70: 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 6f 70  }..    /* Get op
7f80: 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 66 6f 72  tions */.    for
7f90: 20 28 69 64 78 20 3d 20 32 3b 20 69 64 78 20 3c   (idx = 2; idx <
7fa0: 20 6f 62 6a 63 2d 31 3b 20 69 64 78 2b 2b 29 20   objc-1; idx++) 
7fb0: 7b 0a 09 63 68 61 72 20 2a 6f 70 74 20 3d 20 54  {..char *opt = T
7fc0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
7fd0: 4f 62 6a 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 4e  Obj(objv[idx], N
7fe0: 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 6f 70 74 5b  ULL);...if (opt[
7ff0: 30 5d 20 21 3d 20 27 2d 27 29 20 7b 0a 09 20 20  0] != '-') {..  
8000: 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 4f 50    break;..}...OP
8010: 54 46 4c 41 47 28 22 2d 62 69 6e 22 2c 20 66 6f  TFLAG("-bin", fo
8020: 72 6d 61 74 2c 20 42 49 4e 5f 46 4f 52 4d 41 54  rmat, BIN_FORMAT
8030: 29 3b 0a 09 4f 50 54 46 4c 41 47 28 22 2d 62 69  );..OPTFLAG("-bi
8040: 6e 61 72 79 22 2c 20 66 6f 72 6d 61 74 2c 20 42  nary", format, B
8050: 49 4e 5f 46 4f 52 4d 41 54 29 3b 0a 09 4f 50 54  IN_FORMAT);..OPT
8060: 46 4c 41 47 28 22 2d 68 65 78 22 2c 20 66 6f 72  FLAG("-hex", for
8070: 6d 61 74 2c 20 48 45 58 5f 46 4f 52 4d 41 54 29  mat, HEX_FORMAT)
8080: 3b 0a 09 4f 50 54 46 4c 41 47 28 22 2d 68 65 78  ;..OPTFLAG("-hex
8090: 61 64 65 63 69 6d 61 6c 22 2c 20 66 6f 72 6d 61  adecimal", forma
80a0: 74 2c 20 48 45 58 5f 46 4f 52 4d 41 54 29 3b 0a  t, HEX_FORMAT);.
80b0: 09 4f 50 54 53 54 52 28 22 2d 63 68 61 6e 22 2c  .OPTSTR("-chan",
80c0: 20 63 68 61 6e 6e 65 6c 29 3b 0a 09 4f 50 54 53   channel);..OPTS
80d0: 54 52 28 22 2d 63 68 61 6e 6e 65 6c 22 2c 20 63  TR("-channel", c
80e0: 68 61 6e 6e 65 6c 29 3b 0a 09 4f 50 54 53 54 52  hannel);..OPTSTR
80f0: 28 22 2d 63 69 70 68 65 72 22 2c 20 63 69 70 68  ("-cipher", ciph
8100: 65 72 4e 61 6d 65 29 3b 0a 09 4f 50 54 4f 42 4a  erName);..OPTOBJ
8110: 28 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 63 6d 64  ("-command", cmd
8120: 4f 62 6a 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d  Obj);..OPTOBJ("-
8130: 64 61 74 61 22 2c 20 64 61 74 61 4f 62 6a 29 3b  data", dataObj);
8140: 0a 09 4f 50 54 4f 42 4a 28 22 2d 66 69 6c 65 22  ..OPTOBJ("-file"
8150: 2c 20 66 69 6c 65 4f 62 6a 29 3b 0a 09 4f 50 54  , fileObj);..OPT
8160: 4f 42 4a 28 22 2d 66 69 6c 65 6e 61 6d 65 22 2c  OBJ("-filename",
8170: 20 66 69 6c 65 4f 62 6a 29 3b 0a 09 4f 50 54 4f   fileObj);..OPTO
8180: 42 4a 28 22 2d 6b 65 79 22 2c 20 6b 65 79 4f 62  BJ("-key", keyOb
8190: 6a 29 3b 0a 0a 09 4f 50 54 42 41 44 28 22 6f 70  j);...OPTBAD("op
81a0: 74 69 6f 6e 22 2c 20 22 2d 62 69 6e 2c 20 2d 63  tion", "-bin, -c
81b0: 68 61 6e 6e 65 6c 2c 20 2d 63 69 70 68 65 72 2c  hannel, -cipher,
81c0: 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 61 74 61   -command, -data
81d0: 2c 20 2d 66 69 6c 65 2c 20 2d 66 69 6c 65 6e 61  , -file, -filena
81e0: 6d 65 2c 20 2d 68 65 78 2c 20 6f 72 20 2d 6b 65  me, -hex, or -ke
81f0: 79 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  y");..return TCL
8200: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
8210: 20 20 20 2f 2a 20 49 66 20 6e 6f 20 6f 70 74 69     /* If no opti
8220: 6f 6e 20 66 6f 72 20 6c 61 73 74 20 61 72 67 2c  on for last arg,
8230: 20 74 68 65 6e 20 69 74 73 20 74 68 65 20 64 61   then its the da
8240: 74 61 20 2a 2f 0a 20 20 20 20 69 66 20 28 69 64  ta */.    if (id
8250: 78 20 3c 20 6f 62 6a 63 29 20 7b 0a 09 64 61 74  x < objc) {..dat
8260: 61 4f 62 6a 20 3d 20 6f 62 6a 76 5b 69 64 78 5d  aObj = objv[idx]
8270: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
8280: 47 65 74 20 63 69 70 68 65 72 20 2a 2f 0a 20 20  Get cipher */.  
8290: 20 20 69 66 20 28 63 69 70 68 65 72 4e 61 6d 65    if (cipherName
82a0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 69 70   != NULL) {..cip
82b0: 68 65 72 20 3d 20 45 56 50 5f 67 65 74 5f 63 69  her = EVP_get_ci
82c0: 70 68 65 72 62 79 6e 61 6d 65 28 63 69 70 68 65  pherbyname(ciphe
82d0: 72 4e 61 6d 65 29 3b 0a 09 74 79 70 65 20 3d 20  rName);..type = 
82e0: 54 59 50 45 5f 43 4d 41 43 3b 0a 09 69 66 20 28  TYPE_CMAC;..if (
82f0: 63 69 70 68 65 72 20 3d 3d 20 4e 55 4c 4c 29 20  cipher == NULL) 
8300: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  {..    Tcl_Appen
8310: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
8320: 22 49 6e 76 61 6c 69 64 20 63 69 70 68 65 72 20  "Invalid cipher 
8330: 5c 22 22 2c 20 63 69 70 68 65 72 4e 61 6d 65 2c  \"", cipherName,
8340: 20 22 5c 22 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20   "\"", NULL);.. 
8350: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
8360: 52 4f 52 3b 0a 09 7d 0a 0a 20 20 20 20 7d 20 65  ROR;..}..    } e
8370: 6c 73 65 20 69 66 20 28 74 79 70 65 20 3d 3d 20  lse if (type == 
8380: 54 59 50 45 5f 43 4d 41 43 29 20 7b 0a 09 54 63  TYPE_CMAC) {..Tc
8390: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
83a0: 6e 74 65 72 70 2c 20 22 4e 6f 20 63 69 70 68 65  nterp, "No ciphe
83b0: 72 20 73 70 65 63 69 66 69 65 64 22 2c 20 4e 55  r specified", NU
83c0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
83d0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
83e0: 20 20 20 2f 2a 20 47 65 74 20 6b 65 79 20 2a 2f     /* Get key */
83f0: 0a 20 20 20 20 69 66 20 28 6b 65 79 4f 62 6a 20  .    if (keyObj 
8400: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28  != NULL) {..if (
8410: 74 79 70 65 20 3d 3d 20 54 59 50 45 5f 4d 44 29  type == TYPE_MD)
8420: 20 7b 0a 09 20 20 20 20 74 79 70 65 20 3d 20 54   {..    type = T
8430: 59 50 45 5f 48 4d 41 43 3b 0a 09 7d 0a 20 20 20  YPE_HMAC;..}.   
8440: 20 7d 20 65 6c 73 65 20 69 66 20 28 74 79 70 65   } else if (type
8450: 20 21 3d 20 54 59 50 45 5f 4d 44 29 20 7b 0a 09   != TYPE_MD) {..
8460: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8470: 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20 6b 65 79  (interp, "No key
8480: 20 73 70 65 63 69 66 69 65 64 22 2c 20 4e 55 4c   specified", NUL
8490: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  L);..return TCL_
84a0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
84b0: 20 20 2f 2a 20 43 61 6c 63 20 64 69 67 65 73 74    /* Calc digest
84c0: 20 6f 6e 20 66 69 6c 65 2c 20 73 74 61 63 6b 65   on file, stacke
84d0: 64 20 63 68 61 6e 6e 65 6c 2c 20 75 73 69 6e 67  d channel, using
84e0: 20 69 6e 73 74 61 6e 63 65 20 63 6f 6d 6d 61 6e   instance comman
84f0: 64 2c 20 6f 72 20 64 61 74 61 20 62 6c 6f 62 20  d, or data blob 
8500: 2a 2f 0a 20 20 20 20 69 66 20 28 66 69 6c 65 4f  */.    if (fileO
8510: 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  bj != NULL) {..r
8520: 65 73 20 3d 20 54 6c 73 5f 44 69 67 65 73 74 46  es = Tls_DigestF
8530: 69 6c 65 28 69 6e 74 65 72 70 2c 20 66 69 6c 65  ile(interp, file
8540: 4f 62 6a 2c 20 6d 64 2c 20 63 69 70 68 65 72 2c  Obj, md, cipher,
8550: 20 66 6f 72 6d 61 74 20 7c 20 74 79 70 65 2c 20   format | type, 
8560: 6b 65 79 4f 62 6a 29 3b 0a 20 20 20 20 7d 20 65  keyObj);.    } e
8570: 6c 73 65 20 69 66 20 28 63 68 61 6e 6e 65 6c 20  lse if (channel 
8580: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 20  != NULL) {..res 
8590: 3d 20 54 6c 73 5f 44 69 67 65 73 74 43 68 61 6e  = Tls_DigestChan
85a0: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  nel(interp, chan
85b0: 6e 65 6c 2c 20 6d 64 2c 20 63 69 70 68 65 72 2c  nel, md, cipher,
85c0: 20 66 6f 72 6d 61 74 20 7c 20 74 79 70 65 2c 20   format | type, 
85d0: 6b 65 79 4f 62 6a 29 3b 0a 20 20 20 20 7d 20 65  keyObj);.    } e
85e0: 6c 73 65 20 69 66 20 28 63 6d 64 4f 62 6a 20 21  lse if (cmdObj !
85f0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 20 3d  = NULL) {..res =
8600: 20 54 6c 73 5f 44 69 67 65 73 74 49 6e 73 74 61   Tls_DigestInsta
8610: 6e 63 65 28 69 6e 74 65 72 70 2c 20 63 6d 64 4f  nce(interp, cmdO
8620: 62 6a 2c 20 6d 64 2c 20 63 69 70 68 65 72 2c 20  bj, md, cipher, 
8630: 66 6f 72 6d 61 74 20 7c 20 74 79 70 65 2c 20 6b  format | type, k
8640: 65 79 4f 62 6a 29 3b 0a 20 20 20 20 7d 20 65 6c  eyObj);.    } el
8650: 73 65 20 69 66 20 28 64 61 74 61 4f 62 6a 20 21  se if (dataObj !
8660: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4f  = NULL) {..Tcl_O
8670: 62 6a 20 2a 6f 62 6a 73 5b 32 5d 3b 0a 09 6f 62  bj *objs[2];..ob
8680: 6a 73 5b 30 5d 20 3d 20 4e 55 4c 4c 3b 0a 09 6f  js[0] = NULL;..o
8690: 62 6a 73 5b 31 5d 20 3d 20 64 61 74 61 4f 62 6a  bjs[1] = dataObj
86a0: 3b 0a 09 72 65 73 20 3d 20 54 6c 73 5f 44 69 67  ;..res = Tls_Dig
86b0: 65 73 74 44 61 74 61 28 69 6e 74 65 72 70 2c 20  estData(interp, 
86c0: 32 2c 20 6f 62 6a 73 2c 20 6d 64 2c 20 63 69 70  2, objs, md, cip
86d0: 68 65 72 2c 20 66 6f 72 6d 61 74 20 7c 20 74 79  her, format | ty
86e0: 70 65 2c 20 6b 65 79 4f 62 6a 29 3b 0a 20 20 20  pe, keyObj);.   
86f0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65   }.    return re
8700: 73 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  s;.}../*. *-----
8710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
8750: 2a 0a 20 2a 20 4d 65 73 73 61 67 65 20 44 69 67  *. * Message Dig
8760: 65 73 74 20 61 6e 64 20 4d 65 73 73 61 67 65 20  est and Message 
8770: 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 43  Authentication C
8780: 6f 64 65 20 43 6f 6d 6d 61 6e 64 73 20 2d 2d 0a  ode Commands --.
8790: 20 2a 0a 20 2a 09 52 65 74 75 72 6e 20 4d 65 73   *. *.Return Mes
87a0: 73 61 67 65 20 44 69 67 65 73 74 20 28 4d 44 29  sage Digest (MD)
87b0: 20 6f 72 20 4d 65 73 73 61 67 65 20 41 75 74 68   or Message Auth
87c0: 65 6e 74 69 63 61 74 69 6f 6e 20 43 6f 64 65 20  entication Code 
87d0: 28 4d 41 43 29 2e 0a 20 2a 0a 20 2a 20 52 65 74  (MAC).. *. * Ret
87e0: 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20  urns:. *.TCL_OK 
87f0: 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a  or TCL_ERROR. *.
8800: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
8810: 0a 20 2a 09 53 65 74 73 20 72 65 73 75 6c 74 20  . *.Sets result 
8820: 74 6f 20 6d 65 73 73 61 67 65 20 64 69 67 65 73  to message diges
8830: 74 20 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61  t or error messa
8840: 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  ge. *. *--------
8850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
8890: 73 74 61 74 69 63 20 69 6e 74 20 44 69 67 65 73  static int Diges
88a0: 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61  tObjCmd(ClientDa
88b0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
88c0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
88d0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
88e0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
88f0: 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  []) {.    return
8900: 20 44 69 67 65 73 74 4d 61 69 6e 28 54 59 50 45   DigestMain(TYPE
8910: 5f 4d 44 2c 20 69 6e 74 65 72 70 2c 20 6f 62 6a  _MD, interp, obj
8920: 63 2c 20 6f 62 6a 76 29 3b 0a 7d 0a 0a 73 74 61  c, objv);.}..sta
8930: 74 69 63 20 69 6e 74 20 43 4d 41 43 4f 62 6a 43  tic int CMACObjC
8940: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  md(ClientData cl
8950: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e  ientData, Tcl_In
8960: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
8970: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
8980: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b  *const objv[]) {
8990: 0a 20 20 20 20 72 65 74 75 72 6e 20 44 69 67 65  .    return Dige
89a0: 73 74 4d 61 69 6e 28 54 59 50 45 5f 43 4d 41 43  stMain(TYPE_CMAC
89b0: 2c 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20  , interp, objc, 
89c0: 6f 62 6a 76 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  objv);.}..static
89d0: 20 69 6e 74 20 48 4d 41 43 4f 62 6a 43 6d 64 28   int HMACObjCmd(
89e0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
89f0: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
8a00: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
8a10: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
8a20: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
8a30: 20 20 72 65 74 75 72 6e 20 44 69 67 65 73 74 4d    return DigestM
8a40: 61 69 6e 28 54 59 50 45 5f 48 4d 41 43 2c 20 69  ain(TYPE_HMAC, i
8a50: 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a  nterp, objc, obj
8a60: 76 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  v);.}../*. *----
8a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
8ab0: 20 2a 0a 20 2a 20 4d 65 73 73 61 67 65 20 44 69   *. * Message Di
8ac0: 67 65 73 74 20 43 6f 6e 76 65 6e 69 65 6e 63 65  gest Convenience
8ad0: 20 43 6f 6d 6d 61 6e 64 73 20 2d 2d 0a 20 2a 0a   Commands --. *.
8ae0: 20 2a 09 43 6f 6e 76 65 6e 69 65 6e 63 65 20 63   *.Convenience c
8af0: 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 73 65 6c 65  ommands for sele
8b00: 63 74 20 6d 65 73 73 61 67 65 20 64 69 67 65 73  ct message diges
8b10: 74 73 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  ts.. *. * Return
8b20: 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20  s:. *.TCL_OK or 
8b30: 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20  TCL_ERROR. *. * 
8b40: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
8b50: 09 53 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20  .Sets result to 
8b60: 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20 6f  message digest o
8b70: 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  r error message.
8b80: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
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 0a 20 2a 2f 0a 69 6e 74  --------. */.int
8bd0: 20 44 69 67 65 73 74 4d 44 34 43 6d 64 28 43 6c   DigestMD4Cmd(Cl
8be0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
8bf0: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
8c00: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
8c10: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
8c20: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
8c30: 72 65 74 75 72 6e 20 54 6c 73 5f 44 69 67 65 73  return Tls_Diges
8c40: 74 44 61 74 61 28 69 6e 74 65 72 70 2c 20 6f 62  tData(interp, ob
8c50: 6a 63 2c 20 6f 62 6a 76 2c 20 45 56 50 5f 6d 64  jc, objv, EVP_md
8c60: 34 28 29 2c 20 4e 55 4c 4c 2c 20 48 45 58 5f 46  4(), NULL, HEX_F
8c70: 4f 52 4d 41 54 20 7c 20 54 59 50 45 5f 4d 44 2c  ORMAT | TYPE_MD,
8c80: 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 69 6e 74 20 44   NULL);.}..int D
8c90: 69 67 65 73 74 4d 44 35 43 6d 64 28 43 6c 69 65  igestMD5Cmd(Clie
8ca0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
8cb0: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
8cc0: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
8cd0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20   Tcl_Obj *const 
8ce0: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 72 65  objv[]) {.    re
8cf0: 74 75 72 6e 20 54 6c 73 5f 44 69 67 65 73 74 44  turn Tls_DigestD
8d00: 61 74 61 28 69 6e 74 65 72 70 2c 20 6f 62 6a 63  ata(interp, objc
8d10: 2c 20 6f 62 6a 76 2c 20 45 56 50 5f 6d 64 35 28  , objv, EVP_md5(
8d20: 29 2c 20 4e 55 4c 4c 2c 20 48 45 58 5f 46 4f 52  ), NULL, HEX_FOR
8d30: 4d 41 54 20 7c 20 54 59 50 45 5f 4d 44 2c 20 4e  MAT | TYPE_MD, N
8d40: 55 4c 4c 29 3b 0a 7d 0a 0a 69 6e 74 20 44 69 67  ULL);.}..int Dig
8d50: 65 73 74 53 48 41 31 43 6d 64 28 43 6c 69 65 6e  estSHA1Cmd(Clien
8d60: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
8d70: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
8d80: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
8d90: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
8da0: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74  bjv[]) {.    ret
8db0: 75 72 6e 20 54 6c 73 5f 44 69 67 65 73 74 44 61  urn Tls_DigestDa
8dc0: 74 61 28 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c  ta(interp, objc,
8dd0: 20 6f 62 6a 76 2c 20 45 56 50 5f 73 68 61 31 28   objv, EVP_sha1(
8de0: 29 2c 20 4e 55 4c 4c 2c 20 48 45 58 5f 46 4f 52  ), NULL, HEX_FOR
8df0: 4d 41 54 20 7c 20 54 59 50 45 5f 4d 44 2c 20 4e  MAT | TYPE_MD, N
8e00: 55 4c 4c 29 3b 0a 7d 0a 0a 69 6e 74 20 44 69 67  ULL);.}..int Dig
8e10: 65 73 74 53 48 41 32 35 36 43 6d 64 28 43 6c 69  estSHA256Cmd(Cli
8e20: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
8e30: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
8e40: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
8e50: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
8e60: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 72   objv[]) {.    r
8e70: 65 74 75 72 6e 20 54 6c 73 5f 44 69 67 65 73 74  eturn Tls_Digest
8e80: 44 61 74 61 28 69 6e 74 65 72 70 2c 20 6f 62 6a  Data(interp, obj
8e90: 63 2c 20 6f 62 6a 76 2c 20 45 56 50 5f 73 68 61  c, objv, EVP_sha
8ea0: 32 35 36 28 29 2c 20 4e 55 4c 4c 2c 20 48 45 58  256(), NULL, HEX
8eb0: 5f 46 4f 52 4d 41 54 20 7c 20 54 59 50 45 5f 4d  _FORMAT | TYPE_M
8ec0: 44 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 69 6e 74  D, NULL);.}..int
8ed0: 20 44 69 67 65 73 74 53 48 41 35 31 32 43 6d 64   DigestSHA512Cmd
8ee0: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
8ef0: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ntData, Tcl_Inte
8f00: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
8f10: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63  objc, Tcl_Obj *c
8f20: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20  onst objv[]) {. 
8f30: 20 20 20 72 65 74 75 72 6e 20 54 6c 73 5f 44 69     return Tls_Di
8f40: 67 65 73 74 44 61 74 61 28 69 6e 74 65 72 70 2c  gestData(interp,
8f50: 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 45 56 50   objc, objv, EVP
8f60: 5f 73 68 61 35 31 32 28 29 2c 20 4e 55 4c 4c 2c  _sha512(), NULL,
8f70: 20 48 45 58 5f 46 4f 52 4d 41 54 20 7c 20 54 59   HEX_FORMAT | TY
8f80: 50 45 5f 4d 44 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a  PE_MD, NULL);.}.
8f90: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
8fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
8fe0: 54 6c 73 5f 44 69 67 65 73 74 43 6f 6d 6d 61 6e  Tls_DigestComman
8ff0: 64 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43 72 65 61  ds --. *. *.Crea
9000: 74 65 20 64 69 67 65 73 74 20 63 6f 6d 6d 61 6e  te digest comman
9010: 64 73 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73  ds. *. * Returns
9020: 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54  :. *.TCL_OK or T
9030: 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53  CL_ERROR. *. * S
9040: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
9050: 43 72 65 61 74 65 73 20 63 6f 6d 6d 61 6e 64 73  Creates commands
9060: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
9070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
90a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e  ---------. */.in
90b0: 74 20 54 6c 73 5f 44 69 67 65 73 74 43 6f 6d 6d  t Tls_DigestComm
90c0: 61 6e 64 73 28 54 63 6c 5f 49 6e 74 65 72 70 20  ands(Tcl_Interp 
90d0: 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 54  *interp) {.    T
90e0: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
90f0: 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  and(interp, "tls
9100: 3a 3a 64 69 67 65 73 74 22 2c 20 44 69 67 65 73  ::digest", Diges
9110: 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  tObjCmd, (Client
9120: 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d  Data) 0, (Tcl_Cm
9130: 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
9140: 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72  ULL);.    Tcl_Cr
9150: 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
9160: 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 6d 61  nterp, "tls::cma
9170: 63 22 2c 20 43 4d 41 43 4f 62 6a 43 6d 64 2c 20  c", CMACObjCmd, 
9180: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20  (ClientData) 0, 
9190: 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
91a0: 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  oc *) NULL);.   
91b0: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
91c0: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74  mmand(interp, "t
91d0: 6c 73 3a 3a 68 6d 61 63 22 2c 20 48 4d 41 43 4f  ls::hmac", HMACO
91e0: 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61  bjCmd, (ClientDa
91f0: 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44  ta) 0, (Tcl_CmdD
9200: 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
9210: 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  L);.    Tcl_Crea
9220: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
9230: 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 64 34 22 2c  erp, "tls::md4",
9240: 20 44 69 67 65 73 74 4d 44 34 43 6d 64 2c 20 28   DigestMD4Cmd, (
9250: 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28  ClientData) 0, (
9260: 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
9270: 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  c *) NULL);.    
9280: 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
9290: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c  mand(interp, "tl
92a0: 73 3a 3a 6d 64 35 22 2c 20 44 69 67 65 73 74 4d  s::md5", DigestM
92b0: 44 35 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61  D5Cmd, (ClientDa
92c0: 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44  ta) 0, (Tcl_CmdD
92d0: 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
92e0: 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  L);.    Tcl_Crea
92f0: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
9300: 65 72 70 2c 20 22 74 6c 73 3a 3a 73 68 61 31 22  erp, "tls::sha1"
9310: 2c 20 44 69 67 65 73 74 53 48 41 31 43 6d 64 2c  , DigestSHA1Cmd,
9320: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c   (ClientData) 0,
9330: 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
9340: 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
9350: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
9360: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
9370: 74 6c 73 3a 3a 73 68 61 32 35 36 22 2c 20 44 69  tls::sha256", Di
9380: 67 65 73 74 53 48 41 32 35 36 43 6d 64 2c 20 28  gestSHA256Cmd, (
9390: 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28  ClientData) 0, (
93a0: 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
93b0: 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  c *) NULL);.    
93c0: 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
93d0: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c  mand(interp, "tl
93e0: 73 3a 3a 73 68 61 35 31 32 22 2c 20 44 69 67 65  s::sha512", Dige
93f0: 73 74 53 48 41 35 31 32 43 6d 64 2c 20 28 43 6c  stSHA512Cmd, (Cl
9400: 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63  ientData) 0, (Tc
9410: 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
9420: 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63  *) NULL);.    Tc
9430: 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
9440: 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a  nd(interp, "tls:
9450: 3a 75 6e 73 74 61 63 6b 22 2c 20 55 6e 73 74 61  :unstack", Unsta
9460: 63 6b 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e  ckObjCmd, (Clien
9470: 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43  tData) 0, (Tcl_C
9480: 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
9490: 4e 55 4c 4c 29 3b 0a 20 20 20 20 72 65 74 75 72  NULL);.    retur
94a0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a           n TCL_OK;.}..