Hex Artifact Content

Artifact 7c8820a0b31e0574bbe974f86e473ecd24e0d3e9927f1fe891fbf496aa0aa49b:


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 61 6c 67 6f 72 69  fied hash algori
0070: 74 68 6d 2e 0a 20 2a 0a 20 2a 20 43 6f 70 79 72  thm.. *. * Copyr
0080: 69 67 68 74 20 28 43 29 20 32 30 32 33 20 42 72  ight (C) 2023 Br
0090: 69 61 6e 20 4f 27 48 61 67 61 6e 0a 20 2a 0a 20  ian O'Hagan. *. 
00a0: 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c  */..#include "tl
00b0: 73 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65  sInt.h".#include
00c0: 20 22 74 63 6c 4f 70 74 73 2e 68 22 0a 23 69 6e   "tclOpts.h".#in
00d0: 63 6c 75 64 65 20 3c 74 63 6c 2e 68 3e 0a 23 69  clude <tcl.h>.#i
00e0: 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e  nclude <stdio.h>
00f0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e  .#include <strin
0100: 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f  g.h>.#include <o
0110: 70 65 6e 73 73 6c 2f 65 76 70 2e 68 3e 0a 0a 2f  penssl/evp.h>../
0120: 2a 20 43 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 63  * Constants */.c
0130: 6f 6e 73 74 20 63 68 61 72 20 2a 68 65 78 20 3d  onst char *hex =
0140: 20 22 30 31 32 33 34 35 36 37 38 39 41 42 43 44   "0123456789ABCD
0150: 45 46 22 3b 0a 0a 2f 2a 20 4d 61 63 72 6f 73 20  EF";../* Macros 
0160: 2a 2f 0a 23 64 65 66 69 6e 65 20 42 55 46 46 45  */.#define BUFFE
0170: 52 5f 53 49 5a 45 20 36 35 35 33 36 0a 23 64 65  R_SIZE 65536.#de
0180: 66 69 6e 65 20 42 49 4e 5f 46 4f 52 4d 41 54 20  fine BIN_FORMAT 
0190: 30 0a 23 64 65 66 69 6e 65 20 48 45 58 5f 46 4f  0.#define HEX_FO
01a0: 52 4d 41 54 20 31 0a 23 64 65 66 69 6e 65 20 43  RMAT 1.#define C
01b0: 48 41 4e 5f 45 4f 46 20 30 78 31 30 0a 0a 2f 2a  HAN_EOF 0x10../*
01c0: 0a 20 2a 20 54 68 69 73 20 73 74 72 75 63 74 75  . * This structu
01d0: 72 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65  re describes the
01e0: 20 70 65 72 2d 69 6e 73 74 61 6e 63 65 20 73 74   per-instance st
01f0: 61 74 65 20 6f 66 20 61 6e 20 53 53 4c 20 63 68  ate of an SSL ch
0200: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 54 68 65  annel.. *. * The
0210: 20 53 53 4c 20 70 72 6f 63 65 73 73 69 6e 67 20   SSL processing 
0220: 63 6f 6e 74 65 78 74 20 69 73 20 6d 61 69 6e 74  context is maint
0230: 61 69 6e 65 64 20 68 65 72 65 2c 20 69 6e 20 74  ained here, in t
0240: 68 65 20 43 6c 69 65 6e 74 44 61 74 61 0a 20 2a  he ClientData. *
0250: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0260: 20 44 69 67 65 73 74 53 74 61 74 65 20 7b 0a 09   DigestState {..
0270: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 73 65 6c 66  Tcl_Channel self
0280: 3b 09 2f 2a 20 54 68 69 73 20 73 6f 63 6b 65 74  ;./* This socket
0290: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 09 54 63 6c   channel */..Tcl
02a0: 5f 54 69 6d 65 72 54 6f 6b 65 6e 20 74 69 6d 65  _TimerToken time
02b0: 72 3b 09 2f 2a 20 54 69 6d 65 72 20 66 6f 72 20  r;./* Timer for 
02c0: 72 65 61 64 20 65 76 65 6e 74 73 20 2a 2f 0a 0a  read events */..
02d0: 09 69 6e 74 20 66 6c 61 67 73 3b 09 09 2f 2a 20  .int flags;../* 
02e0: 43 68 61 6e 20 63 6f 6e 66 69 67 20 66 6c 61 67  Chan config flag
02f0: 73 20 2a 2f 0a 09 69 6e 74 20 77 61 74 63 68 4d  s */..int watchM
0300: 61 73 6b 3b 09 09 2f 2a 20 43 75 72 72 65 6e 74  ask;../* Current
0310: 20 57 61 74 63 68 50 72 6f 63 20 6d 61 73 6b 20   WatchProc mask 
0320: 2a 2f 0a 09 69 6e 74 20 6d 6f 64 65 3b 09 09 2f  */..int mode;../
0330: 2a 20 43 75 72 72 65 6e 74 20 6d 6f 64 65 20 6f  * Current mode o
0340: 66 20 70 61 72 65 6e 74 20 63 68 61 6e 6e 65 6c  f parent channel
0350: 20 2a 2f 0a 09 69 6e 74 20 66 6f 72 6d 61 74 3b   */..int format;
0360: 09 09 2f 2a 20 4f 75 74 70 75 74 20 66 6f 72 6d  ../* Output form
0370: 61 74 20 2a 2f 0a 0a 09 54 63 6c 5f 49 6e 74 65  at */...Tcl_Inte
0380: 72 70 20 2a 69 6e 74 65 72 70 3b 09 2f 2a 20 43  rp *interp;./* C
0390: 75 72 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74  urrent interpret
03a0: 65 72 20 2a 2f 0a 09 45 56 50 5f 4d 44 5f 43 54  er */..EVP_MD_CT
03b0: 58 20 2a 63 74 78 3b 09 2f 2a 20 4d 44 20 43 6f  X *ctx;./* MD Co
03c0: 6e 74 65 78 74 20 2a 2f 0a 09 48 4d 41 43 5f 43  ntext */..HMAC_C
03d0: 54 58 20 2a 68 63 74 78 3b 09 09 2f 2a 20 48 4d  TX *hctx;../* HM
03e0: 41 43 20 43 6f 6e 74 65 78 74 20 2a 2f 0a 09 54  AC Context */..T
03f0: 63 6c 5f 43 6f 6d 6d 61 6e 64 20 74 6f 6b 65 6e  cl_Command token
0400: 3b 09 2f 2a 20 43 6f 6d 6d 61 6e 64 20 74 6f 6b  ;./* Command tok
0410: 65 6e 20 2a 2f 0a 7d 20 44 69 67 65 73 74 53 74  en */.} DigestSt
0420: 61 74 65 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ate;../*. *-----
0430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
0470: 2a 0a 20 2a 20 54 6c 73 5f 44 69 67 65 73 74 4e  *. * Tls_DigestN
0480: 65 77 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  ew --. *. *.This
0490: 20 66 75 6e 63 74 69 6f 6e 20 63 72 65 61 74 65   function create
04a0: 73 20 61 20 64 69 67 65 73 74 20 73 74 61 74 65  s a digest state
04b0: 20 73 74 72 75 63 74 75 72 65 0a 20 2a 0a 20 2a   structure. *. *
04c0: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 44 69 67   Returns:. *.Dig
04d0: 65 73 74 20 73 74 72 75 63 74 75 72 65 20 70 6f  est structure po
04e0: 69 6e 74 65 72 0a 20 2a 0a 20 2a 20 53 69 64 65  inter. *. * Side
04f0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 72 65   effects:. *.Cre
0500: 61 74 65 73 20 73 74 72 75 63 74 75 72 65 0a 20  ates structure. 
0510: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
0520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0550: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44 69 67 65  -------. */.Dige
0560: 73 74 53 74 61 74 65 20 2a 54 6c 73 5f 44 69 67  stState *Tls_Dig
0570: 65 73 74 4e 65 77 28 54 63 6c 5f 49 6e 74 65 72  estNew(Tcl_Inter
0580: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66  p *interp, int f
0590: 6f 72 6d 61 74 29 20 7b 0a 20 20 20 20 44 69 67  ormat) {.    Dig
05a0: 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50  estState *stateP
05b0: 74 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20  tr = NULL;..    
05c0: 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65  statePtr = (Dige
05d0: 73 74 53 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c  stState *) ckall
05e0: 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69  oc((unsigned) si
05f0: 7a 65 6f 66 28 44 69 67 65 73 74 53 74 61 74 65  zeof(DigestState
0600: 29 29 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74  ));.    if (stat
0610: 65 50 74 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  ePtr != NULL) {.
0620: 09 6d 65 6d 73 65 74 28 73 74 61 74 65 50 74 72  .memset(statePtr
0630: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 44 69 67 65  , 0, sizeof(Dige
0640: 73 74 53 74 61 74 65 29 29 3b 0a 09 73 74 61 74  stState));..stat
0650: 65 50 74 72 2d 3e 73 65 6c 66 09 3d 20 4e 55 4c  ePtr->self.= NUL
0660: 4c 3b 09 09 2f 2a 20 54 68 69 73 20 73 6f 63 6b  L;../* This sock
0670: 65 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 09 73  et channel */..s
0680: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d  tatePtr->timer =
0690: 20 4e 55 4c 4c 3b 09 09 2f 2a 20 54 69 6d 65 72   NULL;../* Timer
06a0: 20 74 6f 20 66 6c 75 73 68 20 64 61 74 61 20 2a   to flush data *
06b0: 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61  /..statePtr->fla
06c0: 67 73 20 3d 20 30 3b 09 09 2f 2a 20 43 68 61 6e  gs = 0;../* Chan
06d0: 20 63 6f 6e 66 69 67 20 66 6c 61 67 73 20 2a 2f   config flags */
06e0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 77 61 74 63  ..statePtr->watc
06f0: 68 4d 61 73 6b 20 3d 20 30 3b 09 2f 2a 20 43 75  hMask = 0;./* Cu
0700: 72 72 65 6e 74 20 57 61 74 63 68 50 72 6f 63 20  rrent WatchProc 
0710: 6d 61 73 6b 20 2a 2f 0a 09 73 74 61 74 65 50 74  mask */..statePt
0720: 72 2d 3e 6d 6f 64 65 09 3d 20 30 3b 09 09 2f 2a  r->mode.= 0;../*
0730: 20 43 75 72 72 65 6e 74 20 6d 6f 64 65 20 6f 66   Current mode of
0740: 20 70 61 72 65 6e 74 20 63 68 61 6e 6e 65 6c 20   parent channel 
0750: 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6f  */..statePtr->fo
0760: 72 6d 61 74 20 3d 20 66 6f 72 6d 61 74 3b 09 2f  rmat = format;./
0770: 2a 20 4f 75 74 70 75 74 20 66 6f 72 6d 61 74 20  * Output format 
0780: 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 69 6e  */..statePtr->in
0790: 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 09 2f  terp = interp;./
07a0: 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 65 72 70  * Current interp
07b0: 72 65 74 65 72 20 2a 2f 0a 09 73 74 61 74 65 50  reter */..stateP
07c0: 74 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 09  tr->ctx = NULL;.
07d0: 09 2f 2a 20 4d 44 20 43 6f 6e 74 65 78 74 20 2a  ./* MD Context *
07e0: 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 68 63 74  /..statePtr->hct
07f0: 78 20 3d 20 4e 55 4c 4c 3b 09 09 2f 2a 20 48 4d  x = NULL;../* HM
0800: 41 43 20 43 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  AC Context */.  
0810: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 73    }.    return s
0820: 74 61 74 65 50 74 72 3b 0a 7d 0a 0a 2f 2a 0a 20  tatePtr;.}../*. 
0830: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
0840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0870: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 44  ----. *. * Tls_D
0880: 69 67 65 73 74 46 72 65 65 20 2d 2d 0a 20 2a 0a  igestFree --. *.
0890: 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e   *.This function
08a0: 20 72 65 6d 6f 76 65 73 20 61 20 64 69 67 65 73   removes a diges
08b0: 74 20 73 74 61 74 65 20 73 74 72 75 63 74 75 72  t state structur
08c0: 65 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a  e. *. * Returns:
08d0: 0a 20 2a 09 4e 6f 74 68 69 6e 67 0a 20 2a 0a 20  . *.Nothing. *. 
08e0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
08f0: 20 2a 09 52 65 6d 6f 76 65 73 20 73 74 72 75 63   *.Removes struc
0900: 74 75 72 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ture. *. *------
0910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
0950: 2f 0a 76 6f 69 64 20 54 6c 73 5f 44 69 67 65 73  /.void Tls_Diges
0960: 74 46 72 65 65 28 44 69 67 65 73 74 53 74 61 74  tFree(DigestStat
0970: 65 20 2a 73 74 61 74 65 50 74 72 29 20 7b 0a 20  e *statePtr) {. 
0980: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 20     if (statePtr 
0990: 3d 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20  == (DigestState 
09a0: 2a 29 20 4e 55 4c 4c 29 20 72 65 74 75 72 6e 3b  *) NULL) return;
09b0: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ..    if (stateP
09c0: 74 72 2d 3e 63 74 78 20 21 3d 20 28 45 56 50 5f  tr->ctx != (EVP_
09d0: 4d 44 5f 43 54 58 20 2a 29 20 4e 55 4c 4c 29 20  MD_CTX *) NULL) 
09e0: 7b 0a 09 45 56 50 5f 4d 44 5f 43 54 58 5f 66 72  {..EVP_MD_CTX_fr
09f0: 65 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  ee(statePtr->ctx
0a00: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  );.    }.    if 
0a10: 28 73 74 61 74 65 50 74 72 2d 3e 68 63 74 78 20  (statePtr->hctx 
0a20: 21 3d 20 28 48 4d 41 43 5f 43 54 58 20 2a 29 20  != (HMAC_CTX *) 
0a30: 4e 55 4c 4c 29 20 7b 0a 09 48 4d 41 43 5f 43 54  NULL) {..HMAC_CT
0a40: 58 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d  X_free(statePtr-
0a50: 3e 68 63 74 78 29 3b 0a 20 20 20 20 7d 0a 20 20  >hctx);.    }.  
0a60: 20 20 63 6b 66 72 65 65 28 73 74 61 74 65 50 74    ckfree(statePt
0a70: 72 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  r);.}../********
0a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
0ac0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
0ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b00: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73  ------. *. * Tls
0b10: 5f 44 69 67 65 73 74 49 6e 69 74 20 2d 2d 0a 20  _DigestInit --. 
0b20: 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 20  *. *.Initialize 
0b30: 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 0a  a hash function.
0b40: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20   *. * Returns:. 
0b50: 2a 09 54 43 4c 5f 4f 4b 20 69 66 20 73 75 63 63  *.TCL_OK if succ
0b60: 65 73 73 66 75 6c 20 6f 72 20 54 43 4c 5f 45 52  essful or TCL_ER
0b70: 52 4f 52 20 66 6f 72 20 66 61 69 6c 75 72 65 20  ROR for failure 
0b80: 77 69 74 68 20 72 65 73 75 6c 74 20 73 65 74 0a  with result set.
0b90: 20 2a 09 74 6f 20 65 72 72 6f 72 20 6d 65 73 73   *.to error mess
0ba0: 61 67 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  age.. *. * Side 
0bb0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 20 72  effects:. *.No r
0bc0: 65 73 75 6c 74 20 6f 72 20 65 72 72 6f 72 20 6d  esult or error m
0bd0: 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d  essage. *. *----
0be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
0c20: 20 2a 2f 0a 69 6e 74 20 54 6c 73 5f 44 69 67 65   */.int Tls_Dige
0c30: 73 74 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  stInit(Tcl_Inter
0c40: 70 20 2a 69 6e 74 65 72 70 2c 20 44 69 67 65 73  p *interp, Diges
0c50: 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72  tState *statePtr
0c60: 2c 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a  , const EVP_MD *
0c70: 6d 64 2c 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6b 65  md,..Tcl_Obj *ke
0c80: 79 4f 62 6a 29 20 7b 0a 20 20 20 20 69 6e 74 20  yObj) {.    int 
0c90: 6b 65 79 5f 6c 65 6e 2c 20 72 65 73 3b 0a 20 20  key_len, res;.  
0ca0: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
0cb0: 20 63 68 61 72 20 2a 6b 65 79 3b 0a 0a 20 20 20   char *key;..   
0cc0: 20 2f 2a 20 43 72 65 61 74 65 20 6d 65 73 73 61   /* Create messa
0cd0: 67 65 20 64 69 67 65 73 74 20 63 6f 6e 74 65 78  ge digest contex
0ce0: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 6b 65 79  t */.    if (key
0cf0: 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Obj == NULL) {..
0d00: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20  statePtr->ctx = 
0d10: 45 56 50 5f 4d 44 5f 43 54 58 5f 6e 65 77 28 29  EVP_MD_CTX_new()
0d20: 3b 0a 09 72 65 73 20 3d 20 28 73 74 61 74 65 50  ;..res = (stateP
0d30: 74 72 2d 3e 63 74 78 20 21 3d 20 4e 55 4c 4c 29  tr->ctx != NULL)
0d40: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
0d50: 73 74 61 74 65 50 74 72 2d 3e 68 63 74 78 20 3d  statePtr->hctx =
0d60: 20 48 4d 41 43 5f 43 54 58 5f 6e 65 77 28 29 3b   HMAC_CTX_new();
0d70: 0a 09 72 65 73 20 3d 20 28 73 74 61 74 65 50 74  ..res = (statePt
0d80: 72 2d 3e 68 63 74 78 20 21 3d 20 4e 55 4c 4c 29  r->hctx != NULL)
0d90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
0da0: 21 72 65 73 29 20 7b 0a 09 54 63 6c 5f 41 70 70  !res) {..Tcl_App
0db0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
0dc0: 2c 20 22 43 72 65 61 74 65 20 64 69 67 65 73 74  , "Create digest
0dd0: 20 63 6f 6e 74 65 78 74 20 66 61 69 6c 65 64 3a   context failed:
0de0: 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55   ", REASON(), NU
0df0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
0e00: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
0e10: 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
0e20: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a   hash function *
0e30: 2f 0a 20 20 20 20 69 66 20 28 6b 65 79 4f 62 6a  /.    if (keyObj
0e40: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73   == NULL) {..res
0e50: 20 3d 20 45 56 50 5f 44 69 67 65 73 74 49 6e 69   = EVP_DigestIni
0e60: 74 5f 65 78 28 73 74 61 74 65 50 74 72 2d 3e 63  t_ex(statePtr->c
0e70: 74 78 2c 20 6d 64 2c 20 4e 55 4c 4c 29 3b 0a 20  tx, md, NULL);. 
0e80: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6b 65 79     } else {..key
0e90: 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72   = Tcl_GetByteAr
0ea0: 72 61 79 46 72 6f 6d 4f 62 6a 28 6b 65 79 4f 62  rayFromObj(keyOb
0eb0: 6a 2c 20 26 6b 65 79 5f 6c 65 6e 29 3b 0a 09 72  j, &key_len);..r
0ec0: 65 73 20 3d 20 48 4d 41 43 5f 49 6e 69 74 5f 65  es = HMAC_Init_e
0ed0: 78 28 73 74 61 74 65 50 74 72 2d 3e 68 63 74 78  x(statePtr->hctx
0ee0: 2c 20 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 29  , (const void *)
0ef0: 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 2c 20 6d   key, key_len, m
0f00: 64 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a  d, NULL);.    }.
0f10: 20 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 0a      if (!res) {.
0f20: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
0f30: 74 28 69 6e 74 65 72 70 2c 20 22 49 6e 69 74 69  t(interp, "Initi
0f40: 61 6c 69 7a 65 20 64 69 67 65 73 74 20 66 61 69  alize digest fai
0f50: 6c 65 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29  led: ", REASON()
0f60: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  , NULL);..return
0f70: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
0f80: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  }.    return TCL
0f90: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  _OK;.}../*. *---
0fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fe0: 0a 20 2a 0a 20 2a 20 54 6c 73 5f 44 69 67 65 73  . *. * Tls_Diges
0ff0: 74 55 70 64 61 74 65 20 2d 2d 0a 20 2a 0a 20 2a  tUpdate --. *. *
1000: 09 55 70 64 61 74 65 20 61 20 68 61 73 68 20 66  .Update a hash f
1010: 75 6e 63 74 69 6f 6e 0a 20 2a 0a 20 2a 20 52 65  unction. *. * Re
1020: 74 75 72 6e 73 3a 0a 20 2a 09 31 20 69 66 20 73  turns:. *.1 if s
1030: 75 63 63 65 73 73 66 75 6c 20 6f 72 20 30 20 66  uccessful or 0 f
1040: 6f 72 20 66 61 69 6c 75 72 65 0a 20 2a 0a 20 2a  or failure. *. *
1050: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
1060: 2a 09 41 64 64 73 20 62 75 66 20 74 6f 20 68 61  *.Adds buf to ha
1070: 73 68 20 66 75 6e 63 74 69 6f 6e 0a 20 2a 0a 20  sh function. *. 
1080: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
1090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10c0: 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 54 6c 73  ----. */.int Tls
10d0: 5f 44 69 67 65 73 74 55 70 64 61 74 65 28 44 69  _DigestUpdate(Di
10e0: 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65  gestState *state
10f0: 50 74 72 2c 20 63 68 61 72 20 2a 62 75 66 2c 20  Ptr, char *buf, 
1100: 73 69 7a 65 5f 74 20 72 65 61 64 29 20 7b 0a 20  size_t read) {. 
1110: 20 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 20     int res;..   
1120: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63   if (statePtr->c
1130: 74 78 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  tx != NULL) {..r
1140: 65 73 20 3d 20 45 56 50 5f 44 69 67 65 73 74 55  es = EVP_DigestU
1150: 70 64 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e  pdate(statePtr->
1160: 63 74 78 2c 20 62 75 66 2c 20 72 65 61 64 29 3b  ctx, buf, read);
1170: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72  .    } else {..r
1180: 65 73 20 3d 20 48 4d 41 43 5f 55 70 64 61 74 65  es = HMAC_Update
1190: 28 73 74 61 74 65 50 74 72 2d 3e 68 63 74 78 2c  (statePtr->hctx,
11a0: 20 62 75 66 2c 20 72 65 61 64 29 3b 0a 20 20 20   buf, read);.   
11b0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65   }.    return re
11c0: 73 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  s;.}../*. *-----
11d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
1210: 2a 0a 20 2a 20 54 6c 73 5f 44 69 67 65 73 74 46  *. * Tls_DigestF
1220: 69 6e 69 61 6c 69 7a 65 20 2d 2d 0a 20 2a 0a 20  inialize --. *. 
1230: 2a 09 46 69 6e 61 6c 69 7a 65 20 61 20 68 61 73  *.Finalize a has
1240: 68 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 67  h function and g
1250: 65 6e 65 72 61 74 65 20 61 20 6d 65 73 73 61 67  enerate a messag
1260: 65 20 64 69 67 65 73 74 0a 20 2a 0a 20 2a 20 52  e digest. *. * R
1270: 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f  eturns:. *.TCL_O
1280: 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20  K if successful 
1290: 6f 72 20 54 43 4c 5f 45 52 52 4f 52 20 66 6f 72  or TCL_ERROR for
12a0: 20 66 61 69 6c 75 72 65 20 77 69 74 68 20 72 65   failure with re
12b0: 73 75 6c 74 20 73 65 74 0a 20 2a 09 74 6f 20 65  sult set. *.to e
12c0: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a  rror message.. *
12d0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
12e0: 3a 0a 20 2a 09 53 65 74 73 20 72 65 73 75 6c 74  :. *.Sets result
12f0: 20 74 6f 20 6d 65 73 73 61 67 65 20 64 69 67 65   to message dige
1300: 73 74 20 66 6f 72 20 68 61 73 68 20 66 75 6e 63  st for hash func
1310: 74 69 6f 6e 20 6f 72 20 61 6e 20 65 72 72 6f 72  tion or an error
1320: 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 2d   message.. *. *-
1330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1370: 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 20 54 6c 73 5f  --. */..int Tls_
1380: 44 69 67 65 73 74 46 69 6e 69 61 6c 69 7a 65 28  DigestFinialize(
1390: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
13a0: 72 70 2c 20 44 69 67 65 73 74 53 74 61 74 65 20  rp, DigestState 
13b0: 2a 73 74 61 74 65 50 74 72 29 20 7b 0a 20 20 20  *statePtr) {.   
13c0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d   unsigned char m
13d0: 64 5f 62 75 66 5b 45 56 50 5f 4d 41 58 5f 4d 44  d_buf[EVP_MAX_MD
13e0: 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 75 6e 73 69  _SIZE];.    unsi
13f0: 67 6e 65 64 20 69 6e 74 20 6d 64 5f 6c 65 6e 3b  gned int md_len;
1400: 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20  .    int res;.. 
1410: 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 68     /* Finalize h
1420: 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  ash function and
1430: 20 63 61 6c 63 75 6c 61 74 65 20 6d 65 73 73 61   calculate messa
1440: 67 65 20 64 69 67 65 73 74 20 2a 2f 0a 20 20 20  ge digest */.   
1450: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63   if (statePtr->c
1460: 74 78 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  tx != NULL) {..r
1470: 65 73 20 3d 20 45 56 50 5f 44 69 67 65 73 74 46  es = EVP_DigestF
1480: 69 6e 61 6c 5f 65 78 28 73 74 61 74 65 50 74 72  inal_ex(statePtr
1490: 2d 3e 63 74 78 2c 20 6d 64 5f 62 75 66 2c 20 26  ->ctx, md_buf, &
14a0: 6d 64 5f 6c 65 6e 29 3b 0a 20 20 20 20 7d 20 65  md_len);.    } e
14b0: 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 48 4d 41  lse {..res = HMA
14c0: 43 5f 46 69 6e 61 6c 28 73 74 61 74 65 50 74 72  C_Final(statePtr
14d0: 2d 3e 68 63 74 78 2c 20 6d 64 5f 62 75 66 2c 20  ->hctx, md_buf, 
14e0: 26 6d 64 5f 6c 65 6e 29 3b 0a 20 20 20 20 7d 0a  &md_len);.    }.
14f0: 20 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 0a      if (!res) {.
1500: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
1510: 74 28 69 6e 74 65 72 70 2c 20 22 46 69 6e 61 6c  t(interp, "Final
1520: 69 7a 65 20 64 69 67 65 73 74 20 66 61 69 6c 65  ize digest faile
1530: 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20  d: ", REASON(), 
1540: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
1550: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
1560: 0a 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 6d  .    /* Return m
1570: 65 73 73 61 67 65 20 64 69 67 65 73 74 20 61 73  essage digest as
1580: 20 65 69 74 68 65 72 20 61 20 62 69 6e 61 72 79   either a binary
1590: 20 6f 72 20 68 65 78 20 73 74 72 69 6e 67 20 2a   or hex string *
15a0: 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  /.    if (stateP
15b0: 74 72 2d 3e 66 6f 72 6d 61 74 20 3d 3d 20 42 49  tr->format == BI
15c0: 4e 5f 46 4f 52 4d 41 54 29 20 7b 0a 09 54 63 6c  N_FORMAT) {..Tcl
15d0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
15e0: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74  terp, Tcl_NewByt
15f0: 65 41 72 72 61 79 4f 62 6a 28 6d 64 5f 62 75 66  eArrayObj(md_buf
1600: 2c 20 6d 64 5f 6c 65 6e 29 29 3b 0a 0a 20 20 20  , md_len));..   
1610: 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f   } else {..Tcl_O
1620: 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 20 3d 20  bj *resultObj = 
1630: 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 09 75  Tcl_NewObj();..u
1640: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 74  nsigned char *pt
1650: 72 20 3d 20 54 63 6c 5f 53 65 74 42 79 74 65 41  r = Tcl_SetByteA
1660: 72 72 61 79 4c 65 6e 67 74 68 28 72 65 73 75 6c  rrayLength(resul
1670: 74 4f 62 6a 2c 20 6d 64 5f 6c 65 6e 2a 32 29 3b  tObj, md_len*2);
1680: 0a 0a 09 66 6f 72 20 28 75 6e 73 69 67 6e 65 64  ...for (unsigned
1690: 20 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20   int i = 0; i < 
16a0: 6d 64 5f 6c 65 6e 3b 20 69 2b 2b 29 20 7b 0a 09  md_len; i++) {..
16b0: 20 20 20 20 2a 70 74 72 2b 2b 20 3d 20 68 65 78      *ptr++ = hex
16c0: 5b 28 6d 64 5f 62 75 66 5b 69 5d 20 3e 3e 20 34  [(md_buf[i] >> 4
16d0: 29 20 26 20 30 78 30 46 5d 3b 0a 09 20 20 20 20  ) & 0x0F];..    
16e0: 2a 70 74 72 2b 2b 20 3d 20 68 65 78 5b 6d 64 5f  *ptr++ = hex[md_
16f0: 62 75 66 5b 69 5d 20 26 20 30 78 30 46 5d 3b 0a  buf[i] & 0x0F];.
1700: 09 7d 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65  .}..Tcl_SetObjRe
1710: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 72 65 73  sult(interp, res
1720: 75 6c 74 4f 62 6a 29 3b 0a 20 20 20 20 7d 0a 20  ultObj);.    }. 
1730: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
1740: 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../**********
1750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 0a  *********/.../*.
1790: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
17a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17d0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f  -----. *. * Tls_
17e0: 44 69 67 65 73 74 46 69 6c 65 20 2d 2d 0a 20 2a  DigestFile --. *
17f0: 0a 20 2a 09 52 65 74 75 72 6e 20 6d 65 73 73 61  . *.Return messa
1800: 67 65 20 64 69 67 65 73 74 20 66 6f 72 20 66 69  ge digest for fi
1810: 6c 65 20 75 73 69 6e 67 20 75 73 65 72 20 73 70  le using user sp
1820: 65 63 69 66 69 65 64 20 68 61 73 68 20 66 75 6e  ecified hash fun
1830: 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74  ction.. *. * Ret
1840: 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20  urns:. *.TCL_OK 
1850: 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a  or TCL_ERROR. *.
1860: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
1870: 0a 20 2a 09 52 65 73 75 6c 74 20 69 73 20 6d 65  . *.Result is me
1880: 73 73 61 67 65 20 64 69 67 65 73 74 20 6f 72 20  ssage digest or 
1890: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a  error message. *
18a0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
18b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18e0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 54  ------. */.int T
18f0: 6c 73 5f 44 69 67 65 73 74 46 69 6c 65 28 54 63  ls_DigestFile(Tc
1900: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1910: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 66 69 6c 65 6e  , Tcl_Obj *filen
1920: 61 6d 65 2c 20 63 6f 6e 73 74 20 45 56 50 5f 4d  ame, const EVP_M
1930: 44 20 2a 6d 64 2c 20 69 6e 74 20 66 6f 72 6d 61  D *md, int forma
1940: 74 2c 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79  t,..Tcl_Obj *key
1950: 4f 62 6a 29 20 7b 0a 20 20 20 20 44 69 67 65 73  Obj) {.    Diges
1960: 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72  tState *statePtr
1970: 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65  ;.    Tcl_Channe
1980: 6c 20 63 68 61 6e 20 3d 20 4e 55 4c 4c 3b 0a 20  l chan = NULL;. 
1990: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
19a0: 20 62 75 66 5b 42 55 46 46 45 52 5f 53 49 5a 45   buf[BUFFER_SIZE
19b0: 5d 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 20 3d  ];.    int res =
19c0: 20 54 43 4c 5f 4f 4b 2c 20 6c 65 6e 3b 0a 0a 20   TCL_OK, len;.. 
19d0: 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20     /* Open file 
19e0: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63  channel */.    c
19f0: 68 61 6e 20 3d 20 54 63 6c 5f 46 53 4f 70 65 6e  han = Tcl_FSOpen
1a00: 46 69 6c 65 43 68 61 6e 6e 65 6c 28 69 6e 74 65  FileChannel(inte
1a10: 72 70 2c 20 66 69 6c 65 6e 61 6d 65 2c 20 22 72  rp, filename, "r
1a20: 62 22 2c 20 30 34 34 34 29 3b 0a 20 20 20 20 69  b", 0444);.    i
1a30: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f  f (chan == (Tcl_
1a40: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
1a50: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
1a60: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
1a70: 2a 20 43 6f 6e 66 69 67 75 72 65 20 63 68 61 6e  * Configure chan
1a80: 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 54  nel */.    if (T
1a90: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_SetChannelOpt
1aa0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  ion(interp, chan
1ab0: 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22  , "-translation"
1ac0: 2c 20 22 62 69 6e 61 72 79 22 29 20 3d 3d 20 54  , "binary") == T
1ad0: 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 72 65 73  CL_ERROR) {..res
1ae0: 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 67   = TCL_ERROR;..g
1af0: 6f 74 6f 20 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a  oto done;.    }.
1b00: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e      Tcl_SetChann
1b10: 65 6c 42 75 66 66 65 72 53 69 7a 65 28 63 68 61  elBufferSize(cha
1b20: 6e 2c 20 42 55 46 46 45 52 5f 53 49 5a 45 29 3b  n, BUFFER_SIZE);
1b30: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
1b40: 73 74 72 75 63 74 20 2a 2f 0a 20 20 20 20 69 66  struct */.    if
1b50: 20 28 28 73 74 61 74 65 50 74 72 20 3d 20 54 6c   ((statePtr = Tl
1b60: 73 5f 44 69 67 65 73 74 4e 65 77 28 69 6e 74 65  s_DigestNew(inte
1b70: 72 70 2c 20 66 6f 72 6d 61 74 29 29 20 3d 3d 20  rp, format)) == 
1b80: 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 20 3d 20 54  NULL) {..res = T
1b90: 43 4c 5f 45 52 52 4f 52 3b 0a 09 67 6f 74 6f 20  CL_ERROR;..goto 
1ba0: 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  done;.    }..   
1bb0: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 68   /* Initialize h
1bc0: 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ash function */.
1bd0: 20 20 20 20 69 66 20 28 28 72 65 73 20 3d 20 54      if ((res = T
1be0: 6c 73 5f 44 69 67 65 73 74 49 6e 69 74 28 69 6e  ls_DigestInit(in
1bf0: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20  terp, statePtr, 
1c00: 6d 64 2c 20 6b 65 79 4f 62 6a 29 29 20 21 3d 20  md, keyObj)) != 
1c10: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 67 6f 74 6f 20  TCL_OK) {..goto 
1c20: 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  done;.    }..   
1c30: 20 2f 2a 20 52 65 61 64 20 66 69 6c 65 20 64 61   /* Read file da
1c40: 74 61 20 61 6e 64 20 75 70 64 61 74 65 20 68 61  ta and update ha
1c50: 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  sh function */. 
1c60: 20 20 20 77 68 69 6c 65 20 28 21 54 63 6c 5f 45     while (!Tcl_E
1c70: 6f 66 28 63 68 61 6e 29 29 20 7b 0a 09 6c 65 6e  of(chan)) {..len
1c80: 20 3d 20 54 63 6c 5f 52 65 61 64 52 61 77 28 63   = Tcl_ReadRaw(c
1c90: 68 61 6e 2c 20 28 63 68 61 72 20 2a 29 20 62 75  han, (char *) bu
1ca0: 66 2c 20 42 55 46 46 45 52 5f 53 49 5a 45 29 3b  f, BUFFER_SIZE);
1cb0: 0a 09 69 66 20 28 6c 65 6e 20 3e 20 30 29 20 7b  ..if (len > 0) {
1cc0: 0a 09 20 20 20 20 69 66 20 28 21 54 6c 73 5f 44  ..    if (!Tls_D
1cd0: 69 67 65 73 74 55 70 64 61 74 65 28 73 74 61 74  igestUpdate(stat
1ce0: 65 50 74 72 2c 20 26 62 75 66 5b 30 5d 2c 20 28  ePtr, &buf[0], (
1cf0: 73 69 7a 65 5f 74 29 20 6c 65 6e 29 29 20 7b 0a  size_t) len)) {.
1d00: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
1d10: 6c 74 28 69 6e 74 65 72 70 2c 20 22 55 70 64 61  lt(interp, "Upda
1d20: 74 65 20 64 69 67 65 73 74 20 66 61 69 6c 65 64  te digest failed
1d30: 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e  : ", REASON(), N
1d40: 55 4c 4c 29 3b 0a 09 09 72 65 73 20 3d 20 54 43  ULL);...res = TC
1d50: 4c 5f 45 52 52 4f 52 3b 0a 09 09 67 6f 74 6f 20  L_ERROR;...goto 
1d60: 64 6f 6e 65 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a  done;..    }..}.
1d70: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69      }..    /* Fi
1d80: 6e 61 6c 69 7a 65 20 68 61 73 68 20 66 75 6e 63  nalize hash func
1d90: 74 69 6f 6e 20 61 6e 64 20 63 61 6c 63 75 6c 61  tion and calcula
1da0: 74 65 20 6d 65 73 73 61 67 65 20 64 69 67 65 73  te message diges
1db0: 74 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 54  t */.    res = T
1dc0: 6c 73 5f 44 69 67 65 73 74 46 69 6e 69 61 6c 69  ls_DigestFiniali
1dd0: 7a 65 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  ze(interp, state
1de0: 50 74 72 29 3b 0a 0a 64 6f 6e 65 3a 0a 20 20 20  Ptr);..done:.   
1df0: 20 2f 2a 20 43 6c 6f 73 65 20 63 68 61 6e 6e 65   /* Close channe
1e00: 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c  l */.    if (Tcl
1e10: 5f 43 6c 6f 73 65 28 69 6e 74 65 72 70 2c 20 63  _Close(interp, c
1e20: 68 61 6e 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f  han) == TCL_ERRO
1e30: 52 29 20 7b 0a 09 63 68 61 6e 20 3d 20 28 54 63  R) {..chan = (Tc
1e40: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 3b  l_Channel) NULL;
1e50: 0a 09 72 65 73 20 3d 20 54 43 4c 5f 45 52 52 4f  ..res = TCL_ERRO
1e60: 52 3b 0a 09 67 6f 74 6f 20 64 6f 6e 65 3b 0a 20  R;..goto done;. 
1e70: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 65     }..    /* Cle
1e80: 61 6e 2d 75 70 20 2a 2f 0a 20 20 20 20 54 6c 73  an-up */.    Tls
1e90: 5f 44 69 67 65 73 74 46 72 65 65 28 73 74 61 74  _DigestFree(stat
1ea0: 65 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ePtr);.    retur
1eb0: 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a  n res;.}../*****
1ec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
1f00: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
1f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
1f50: 44 69 67 65 73 74 42 6c 6f 63 6b 4d 6f 64 65 50  DigestBlockModeP
1f60: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  roc --. *. *.Thi
1f70: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  s function is in
1f80: 76 6f 6b 65 64 20 62 79 20 74 68 65 20 67 65 6e  voked by the gen
1f90: 65 72 69 63 20 49 4f 20 6c 65 76 65 6c 0a 20 2a  eric IO level. *
1fa0: 20 20 20 20 20 20 20 74 6f 20 73 65 74 20 62 6c         to set bl
1fb0: 6f 63 6b 69 6e 67 20 61 6e 64 20 6e 6f 6e 62 6c  ocking and nonbl
1fc0: 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 2e 0a 20 2a  ocking modes.. *
1fd0: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09  . * Returns:. *.
1fe0: 30 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20  0 if successful 
1ff0: 6f 72 20 50 4f 53 49 58 20 65 72 72 6f 72 20 63  or POSIX error c
2000: 6f 64 65 20 69 66 20 66 61 69 6c 65 64 2e 0a 20  ode if failed.. 
2010: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
2020: 73 3a 0a 20 2a 09 53 65 74 73 20 74 68 65 20 64  s:. *.Sets the d
2030: 65 76 69 63 65 20 69 6e 74 6f 20 62 6c 6f 63 6b  evice into block
2040: 69 6e 67 20 6f 72 20 6e 6f 6e 62 6c 6f 63 6b 69  ing or nonblocki
2050: 6e 67 20 6d 6f 64 65 2e 0a 20 2a 09 43 61 6e 20  ng mode.. *.Can 
2060: 63 61 6c 6c 20 54 63 6c 5f 53 65 74 43 68 61 6e  call Tcl_SetChan
2070: 6e 65 6c 45 72 72 6f 72 2e 0a 20 2a 0a 20 2a 2d  nelError.. *. *-
2080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20c0: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
20d0: 74 20 44 69 67 65 73 74 42 6c 6f 63 6b 4d 6f 64  t DigestBlockMod
20e0: 65 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61  eProc(ClientData
20f0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e 74   clientData, int
2100: 20 6d 6f 64 65 29 20 7b 0a 20 20 20 20 44 69 67   mode) {.    Dig
2110: 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50  estState *stateP
2120: 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 74  tr = (DigestStat
2130: 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b  e *) clientData;
2140: 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 20 3d  ..    if (mode =
2150: 3d 20 54 43 4c 5f 4d 4f 44 45 5f 4e 4f 4e 42 4c  = TCL_MODE_NONBL
2160: 4f 43 4b 49 4e 47 29 20 7b 0a 09 73 74 61 74 65  OCKING) {..state
2170: 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c  Ptr->flags |= TL
2180: 53 5f 54 43 4c 5f 41 53 59 4e 43 3b 0a 20 20 20  S_TCL_ASYNC;.   
2190: 20 7d 20 65 6c 73 65 20 7b 0a 09 73 74 61 74 65   } else {..state
21a0: 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28  Ptr->flags &= ~(
21b0: 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29 3b 0a  TLS_TCL_ASYNC);.
21c0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
21d0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d   0;.}../*. *----
21e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2220: 20 2a 0a 20 2a 20 44 69 67 65 73 74 43 6c 6f 73   *. * DigestClos
2230: 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54  eProc --. *. *.T
2240: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2250: 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 67  invoked by the g
2260: 65 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 6c 20  eneric IO level 
2270: 74 6f 20 70 65 72 66 6f 72 6d 0a 20 2a 09 63 68  to perform. *.ch
2280: 61 6e 6e 65 6c 2d 74 79 70 65 2d 73 70 65 63 69  annel-type-speci
2290: 66 69 63 20 63 6c 65 61 6e 75 70 20 77 68 65 6e  fic cleanup when
22a0: 20 63 68 61 6e 6e 65 6c 20 69 73 20 63 6c 6f 73   channel is clos
22b0: 65 64 2e 20 41 6c 6c 0a 20 2a 09 71 75 65 75 65  ed. All. *.queue
22c0: 64 20 6f 75 74 70 75 74 20 69 73 20 66 6c 75 73  d output is flus
22d0: 68 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  hed prior to cal
22e0: 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
22f0: 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  on.. *. * Return
2300: 73 3a 0a 20 2a 09 30 20 69 66 20 73 75 63 63 65  s:. *.0 if succe
2310: 73 73 66 75 6c 20 6f 72 20 50 4f 53 49 58 20 65  ssful or POSIX e
2320: 72 72 6f 72 20 63 6f 64 65 20 69 66 20 66 61 69  rror code if fai
2330: 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  led.. *. * Side 
2340: 65 66 66 65 63 74 73 3a 0a 20 2a 09 57 72 69 74  effects:. *.Writ
2350: 65 73 20 64 69 67 65 73 74 20 74 6f 20 6f 75 74  es digest to out
2360: 70 75 74 20 61 6e 64 20 63 6c 6f 73 65 73 20 74  put and closes t
2370: 68 65 20 63 68 61 6e 6e 65 6c 2e 20 53 74 6f 72  he channel. Stor
2380: 65 73 20 65 72 72 6f 72 0a 20 2a 09 6d 65 73 73  es error. *.mess
2390: 61 67 65 73 20 69 6e 20 69 6e 74 65 72 70 20 72  ages in interp r
23a0: 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  esult.. *. *----
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: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
23f0: 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 43 6c   */.int DigestCl
2400: 6f 73 65 50 72 6f 63 28 43 6c 69 65 6e 74 44 61  oseProc(ClientDa
2410: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
2420: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2430: 70 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53  p) {.    DigestS
2440: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
2450: 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 29   (DigestState *)
2460: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20   clientData;..  
2470: 20 20 2f 2a 20 43 61 6e 63 65 6c 20 61 63 74 69    /* Cancel acti
2480: 76 65 20 74 69 6d 65 72 2c 20 69 66 20 61 6e 79  ve timer, if any
2490: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74   */.    if (stat
24a0: 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28  ePtr->timer != (
24b0: 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20  Tcl_TimerToken) 
24c0: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c  NULL) {..Tcl_Del
24d0: 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28  eteTimerHandler(
24e0: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29  statePtr->timer)
24f0: 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d  ;..statePtr->tim
2500: 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54  er = (Tcl_TimerT
2510: 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 20 20 20 20  oken) NULL;.    
2520: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 6e 2d  }..    /* Clean-
2530: 75 70 20 2a 2f 0a 20 20 20 20 54 6c 73 5f 44 69  up */.    Tls_Di
2540: 67 65 73 74 46 72 65 65 28 73 74 61 74 65 50 74  gestFree(statePt
2550: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  r);.    return 0
2560: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 61 6d 65 20  ;.}../*. * Same 
2570: 61 73 20 44 69 67 65 73 74 43 6c 6f 73 65 50 72  as DigestClosePr
2580: 6f 63 20 62 75 74 20 77 69 74 68 20 69 6e 64 69  oc but with indi
2590: 76 69 64 75 61 6c 20 72 65 61 64 20 61 6e 64 20  vidual read and 
25a0: 77 72 69 74 65 20 63 6c 6f 73 65 20 63 6f 6e 74  write close cont
25b0: 72 6f 6c 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  rol. */.static i
25c0: 6e 74 20 44 69 67 65 73 74 43 6c 6f 73 65 32 50  nt DigestClose2P
25d0: 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69  roc(ClientData i
25e0: 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 54 63 6c  nstanceData, Tcl
25f0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2600: 20 69 6e 74 20 66 6c 61 67 73 29 20 7b 0a 0a 20   int flags) {.. 
2610: 20 20 20 69 66 20 28 28 66 6c 61 67 73 20 26 20     if ((flags & 
2620: 28 54 43 4c 5f 43 4c 4f 53 45 5f 52 45 41 44 20  (TCL_CLOSE_READ 
2630: 7c 20 54 43 4c 5f 43 4c 4f 53 45 5f 57 52 49 54  | TCL_CLOSE_WRIT
2640: 45 29 29 20 3d 3d 20 30 29 20 7b 0a 09 72 65 74  E)) == 0) {..ret
2650: 75 72 6e 20 44 69 67 65 73 74 43 6c 6f 73 65 50  urn DigestCloseP
2660: 72 6f 63 28 69 6e 73 74 61 6e 63 65 44 61 74 61  roc(instanceData
2670: 2c 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 7d  , interp);.    }
2680: 0a 20 20 20 20 72 65 74 75 72 6e 20 45 49 4e 56  .    return EINV
2690: 41 4c 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  AL;.}../*. *----
26a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
26b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
26c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
26d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
26e0: 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 49  --. *. * DigestI
26f0: 6e 70 75 74 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20  nputProc --. *. 
2700: 2a 09 43 61 6c 6c 65 64 20 62 79 20 74 68 65 20  *.Called by the 
2710: 67 65 6e 65 72 69 63 20 49 4f 20 73 79 73 74 65  generic IO syste
2720: 6d 20 74 6f 20 72 65 61 64 20 64 61 74 61 20 66  m to read data f
2730: 72 6f 6d 20 74 72 61 6e 73 66 6f 72 6d 20 61 6e  rom transform an
2740: 64 0a 20 2a 09 70 6c 61 63 65 20 69 6e 20 62 75  d. *.place in bu
2750: 66 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73  f.. *. * Returns
2760: 3a 0a 20 2a 09 54 6f 74 61 6c 20 62 79 74 65 73  :. *.Total bytes
2770: 20 72 65 61 64 20 6f 72 20 2d 31 20 66 6f 72 20   read or -1 for 
2780: 61 6e 20 65 72 72 6f 72 20 61 6c 6f 6e 67 20 77  an error along w
2790: 69 74 68 20 61 20 50 4f 53 49 58 20 65 72 72 6f  ith a POSIX erro
27a0: 72 0a 20 2a 09 63 6f 64 65 20 69 6e 20 65 72 72  r. *.code in err
27b0: 6f 72 43 6f 64 65 50 74 72 2e 20 55 73 65 20 45  orCodePtr. Use E
27c0: 41 47 41 49 4e 20 66 6f 72 20 6e 6f 6e 62 6c 6f  AGAIN for nonblo
27d0: 63 6b 69 6e 67 20 61 6e 64 20 6e 6f 20 64 61 74  cking and no dat
27e0: 61 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  a.. *. * Side ef
27f0: 66 65 63 74 73 3a 0a 20 2a 09 52 65 61 64 20 64  fects:. *.Read d
2800: 61 74 61 20 66 72 6f 6d 20 74 72 61 6e 73 66 6f  ata from transfo
2810: 72 6d 20 61 6e 64 20 77 72 69 74 65 20 74 6f 20  rm and write to 
2820: 62 75 66 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  buf. *. *-------
2830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2870: 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 49 6e   */.int DigestIn
2880: 70 75 74 50 72 6f 63 28 43 6c 69 65 6e 74 44 61  putProc(ClientDa
2890: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 63  ta clientData, c
28a0: 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 74 6f  har *buf, int to
28b0: 52 65 61 64 2c 20 69 6e 74 20 2a 65 72 72 6f 72  Read, int *error
28c0: 43 6f 64 65 50 74 72 29 20 7b 0a 20 20 20 20 44  CodePtr) {.    D
28d0: 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74  igestState *stat
28e0: 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74  ePtr = (DigestSt
28f0: 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74  ate *) clientDat
2900: 61 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e  a;.    Tcl_Chann
2910: 65 6c 20 70 61 72 65 6e 74 3b 0a 20 20 20 20 69  el parent;.    i
2920: 6e 74 20 72 65 61 64 2c 20 72 65 73 3b 0a 20 20  nt read, res;.  
2930: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20    *errorCodePtr 
2940: 3d 20 30 3b 0a 0a 20 20 20 20 69 66 20 28 74 6f  = 0;..    if (to
2950: 52 65 61 64 20 3c 3d 20 30 20 7c 7c 20 73 74 61  Read <= 0 || sta
2960: 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28  tePtr->self == (
2970: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
2980: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b 0a  L) {..return 0;.
2990: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
29a0: 74 20 62 79 74 65 73 20 66 72 6f 6d 20 75 6e 64  t bytes from und
29b0: 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 20  erlying channel 
29c0: 2a 2f 0a 20 20 20 20 70 61 72 65 6e 74 20 3d 20  */.    parent = 
29d0: 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 64 43 68  Tcl_GetStackedCh
29e0: 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e  annel(statePtr->
29f0: 73 65 6c 66 29 3b 0a 20 20 20 20 72 65 61 64 20  self);.    read 
2a00: 3d 20 54 63 6c 5f 52 65 61 64 52 61 77 28 70 61  = Tcl_ReadRaw(pa
2a10: 72 65 6e 74 2c 20 62 75 66 2c 20 74 6f 52 65 61  rent, buf, toRea
2a20: 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61  d);..    /* Upda
2a30: 74 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e  te hash function
2a40: 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 61 64   */.    if (read
2a50: 20 3e 20 30 29 20 7b 0a 09 69 66 20 28 21 54 6c   > 0) {..if (!Tl
2a60: 73 5f 44 69 67 65 73 74 55 70 64 61 74 65 28 73  s_DigestUpdate(s
2a70: 74 61 74 65 50 74 72 2c 20 62 75 66 2c 20 28 73  tatePtr, buf, (s
2a80: 69 7a 65 5f 74 29 20 72 65 61 64 29 29 20 7b 0a  ize_t) read)) {.
2a90: 09 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e  .    Tcl_SetChan
2aa0: 6e 65 6c 45 72 72 6f 72 28 73 74 61 74 65 50 74  nelError(statePt
2ab0: 72 2d 3e 73 65 6c 66 2c 20 54 63 6c 5f 4f 62 6a  r->self, Tcl_Obj
2ac0: 50 72 69 6e 74 66 28 22 44 69 67 65 73 74 20 75  Printf("Digest u
2ad0: 70 64 61 74 65 20 66 61 69 6c 65 64 3a 20 25 73  pdate failed: %s
2ae0: 22 2c 20 52 45 41 53 4f 4e 28 29 29 29 3b 0a 09  ", REASON()));..
2af0: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74      *errorCodePt
2b00: 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 09 20 20 20  r = EINVAL;..   
2b10: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 09   return -1;..}..
2b20: 2f 2a 20 54 68 69 73 20 69 73 20 63 6f 72 72 65  /* This is corre
2b30: 63 74 20 2a 2f 0a 09 72 65 61 64 20 3d 20 2d 31  ct */..read = -1
2b40: 3b 0a 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72  ;..*errorCodePtr
2b50: 20 3d 20 45 41 47 41 49 4e 3b 0a 09 20 20 20 20   = EAGAIN;..    
2b60: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
2b70: 72 65 61 64 20 3c 20 30 29 20 7b 0a 09 2f 2a 20  read < 0) {../* 
2b80: 45 72 72 6f 72 20 2a 2f 0a 09 2a 65 72 72 6f 72  Error */..*error
2b90: 43 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f 47 65  CodePtr = Tcl_Ge
2ba0: 74 45 72 72 6e 6f 28 29 3b 0a 0a 20 20 20 20 7d  tErrno();..    }
2bb0: 20 65 6c 73 65 20 69 66 20 28 21 28 73 74 61 74   else if (!(stat
2bc0: 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 43 48  ePtr->flags & CH
2bd0: 41 4e 5f 45 4f 46 29 29 20 7b 0a 09 2f 2a 20 45  AN_EOF)) {../* E
2be0: 4f 46 20 2a 2f 0a 09 2a 65 72 72 6f 72 43 6f 64  OF */..*errorCod
2bf0: 65 50 74 72 20 3d 20 30 3b 0a 09 75 6e 73 69 67  ePtr = 0;..unsig
2c00: 6e 65 64 20 63 68 61 72 20 6d 64 5f 62 75 66 5b  ned char md_buf[
2c10: 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45 5d  EVP_MAX_MD_SIZE]
2c20: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  ;..unsigned int 
2c30: 6d 64 5f 6c 65 6e 20 3d 20 30 3b 0a 0a 09 2f 2a  md_len = 0;.../*
2c40: 20 46 69 6e 61 6c 69 7a 65 20 68 61 73 68 20 66   Finalize hash f
2c50: 75 6e 63 74 69 6f 6e 20 61 6e 64 20 63 61 6c 63  unction and calc
2c60: 75 6c 61 74 65 20 6d 65 73 73 61 67 65 20 64 69  ulate message di
2c70: 67 65 73 74 20 2a 2f 0a 09 69 66 20 28 73 74 61  gest */..if (sta
2c80: 74 65 50 74 72 2d 3e 63 74 78 20 21 3d 20 4e 55  tePtr->ctx != NU
2c90: 4c 4c 29 20 7b 0a 09 20 20 20 20 72 65 73 20 3d  LL) {..    res =
2ca0: 20 45 56 50 5f 44 69 67 65 73 74 46 69 6e 61 6c   EVP_DigestFinal
2cb0: 5f 65 78 28 73 74 61 74 65 50 74 72 2d 3e 63 74  _ex(statePtr->ct
2cc0: 78 2c 20 6d 64 5f 62 75 66 2c 20 26 6d 64 5f 6c  x, md_buf, &md_l
2cd0: 65 6e 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  en);..} else {..
2ce0: 20 20 20 20 72 65 73 20 3d 20 48 4d 41 43 5f 46      res = HMAC_F
2cf0: 69 6e 61 6c 28 73 74 61 74 65 50 74 72 2d 3e 68  inal(statePtr->h
2d00: 63 74 78 2c 20 6d 64 5f 62 75 66 2c 20 26 6d 64  ctx, md_buf, &md
2d10: 5f 6c 65 6e 29 3b 0a 09 7d 0a 09 69 66 20 28 21  _len);..}..if (!
2d20: 72 65 73 29 20 7b 0a 09 20 20 20 20 2a 65 72 72  res) {..    *err
2d30: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49 4e 56  orCodePtr = EINV
2d40: 41 4c 3b 0a 0a 09 2f 2a 20 57 72 69 74 65 20 6d  AL;.../* Write m
2d50: 65 73 73 61 67 65 20 64 69 67 65 73 74 20 74 6f  essage digest to
2d60: 20 6f 75 74 70 75 74 20 63 68 61 6e 6e 65 6c 20   output channel 
2d70: 61 73 20 62 79 74 65 20 61 72 72 61 79 20 6f 72  as byte array or
2d80: 20 68 65 78 20 73 74 72 69 6e 67 20 2a 2f 0a 09   hex string */..
2d90: 7d 20 65 6c 73 65 20 69 66 20 28 6d 64 5f 6c 65  } else if (md_le
2da0: 6e 20 3e 20 30 29 20 7b 0a 09 20 20 20 20 69 66  n > 0) {..    if
2db0: 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d   (statePtr->form
2dc0: 61 74 20 3d 3d 20 42 49 4e 5f 46 4f 52 4d 41 54  at == BIN_FORMAT
2dd0: 20 26 26 20 74 6f 52 65 61 64 20 3e 3d 20 28 69   && toRead >= (i
2de0: 6e 74 29 20 6d 64 5f 6c 65 6e 29 20 7b 0a 09 09  nt) md_len) {...
2df0: 72 65 61 64 20 3d 20 6d 64 5f 6c 65 6e 3b 0a 09  read = md_len;..
2e00: 09 6d 65 6d 63 70 79 28 62 75 66 2c 20 6d 64 5f  .memcpy(buf, md_
2e10: 62 75 66 2c 20 72 65 61 64 29 3b 0a 0a 09 20 20  buf, read);...  
2e20: 20 20 7d 20 65 6c 73 65 20 69 66 28 73 74 61 74    } else if(stat
2e30: 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 3d 3d 20  ePtr->format == 
2e40: 48 45 58 5f 46 4f 52 4d 41 54 20 26 26 20 74 6f  HEX_FORMAT && to
2e50: 52 65 61 64 20 3e 3d 20 28 69 6e 74 29 20 28 6d  Read >= (int) (m
2e60: 64 5f 6c 65 6e 2a 32 29 29 20 7b 0a 09 09 75 6e  d_len*2)) {...un
2e70: 73 69 67 6e 65 64 20 63 68 61 72 20 68 65 78 5f  signed char hex_
2e80: 62 75 66 5b 45 56 50 5f 4d 41 58 5f 4d 44 5f 53  buf[EVP_MAX_MD_S
2e90: 49 5a 45 2a 32 5d 3b 0a 09 09 75 6e 73 69 67 6e  IZE*2];...unsign
2ea0: 65 64 20 63 68 61 72 20 2a 70 74 72 20 3d 20 68  ed char *ptr = h
2eb0: 65 78 5f 62 75 66 3b 0a 0a 09 09 66 6f 72 20 28  ex_buf;....for (
2ec0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 20 3d  unsigned int i =
2ed0: 20 30 3b 20 69 20 3c 20 6d 64 5f 6c 65 6e 3b 20   0; i < md_len; 
2ee0: 69 2b 2b 29 20 7b 0a 09 09 20 20 20 20 2a 70 74  i++) {...    *pt
2ef0: 72 2b 2b 20 3d 20 68 65 78 5b 28 6d 64 5f 62 75  r++ = hex[(md_bu
2f00: 66 5b 69 5d 20 3e 3e 20 34 29 20 26 20 30 78 30  f[i] >> 4) & 0x0
2f10: 46 5d 3b 0a 09 09 20 20 20 20 2a 70 74 72 2b 2b  F];...    *ptr++
2f20: 20 3d 20 68 65 78 5b 6d 64 5f 62 75 66 5b 69 5d   = hex[md_buf[i]
2f30: 20 26 20 30 78 30 46 5d 3b 0a 09 09 7d 0a 09 09   & 0x0F];...}...
2f40: 72 65 61 64 20 3d 20 6d 64 5f 6c 65 6e 2a 32 3b  read = md_len*2;
2f50: 0a 09 09 6d 65 6d 63 70 79 28 62 75 66 2c 20 68  ...memcpy(buf, h
2f60: 65 78 5f 62 75 66 2c 20 72 65 61 64 29 3b 0a 09  ex_buf, read);..
2f70: 20 20 20 20 7d 0a 09 7d 0a 09 73 74 61 74 65 50      }..}..stateP
2f80: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 48 41  tr->flags |= CHA
2f90: 4e 5f 45 4f 46 3b 0a 20 20 20 20 7d 0a 20 20 20  N_EOF;.    }.   
2fa0: 20 72 65 74 75 72 6e 20 72 65 61 64 3b 0a 7d 0a   return read;.}.
2fb0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
2fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
3000: 20 2a 20 44 69 67 65 73 74 4f 75 74 70 75 74 50   * DigestOutputP
3010: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c  roc --. *. *.Cal
3020: 6c 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72  led by the gener
3030: 69 63 20 49 4f 20 73 79 73 74 65 6d 20 74 6f 20  ic IO system to 
3040: 77 72 69 74 65 20 64 61 74 61 20 69 6e 20 62 75  write data in bu
3050: 66 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 2e 0a  f to transform..
3060: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20   *. * Returns:. 
3070: 2a 09 54 6f 74 61 6c 20 62 79 74 65 73 20 77 72  *.Total bytes wr
3080: 69 74 74 65 6e 20 6f 72 20 2d 31 20 66 6f 72 20  itten or -1 for 
3090: 61 6e 20 65 72 72 6f 72 20 61 6c 6f 6e 67 20 77  an error along w
30a0: 69 74 68 20 61 20 50 4f 53 49 58 20 65 72 72 6f  ith a POSIX erro
30b0: 72 0a 20 2a 09 63 6f 64 65 20 69 6e 20 65 72 72  r. *.code in err
30c0: 6f 72 43 6f 64 65 50 74 72 2e 20 55 73 65 20 45  orCodePtr. Use E
30d0: 41 47 41 49 4e 20 66 6f 72 20 6e 6f 6e 62 6c 6f  AGAIN for nonblo
30e0: 63 6b 69 6e 67 20 61 6e 64 20 63 61 6e 27 74 20  cking and can't 
30f0: 77 72 69 74 65 20 64 61 74 61 2e 0a 20 2a 0a 20  write data.. *. 
3100: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
3110: 20 2a 09 47 65 74 20 64 61 74 61 20 66 72 6f 6d   *.Get data from
3120: 20 62 75 66 20 61 6e 64 20 75 70 64 61 74 65 20   buf and update 
3130: 64 69 67 65 73 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d  digest. *. *----
3140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3180: 2d 2d 0a 20 2a 2f 0a 20 69 6e 74 20 44 69 67 65  --. */. int Dige
3190: 73 74 4f 75 74 70 75 74 50 72 6f 63 28 43 6c 69  stOutputProc(Cli
31a0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
31b0: 74 61 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ta, const char *
31c0: 62 75 66 2c 20 69 6e 74 20 74 6f 57 72 69 74 65  buf, int toWrite
31d0: 2c 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65  , int *errorCode
31e0: 50 74 72 29 20 7b 0a 20 20 20 20 44 69 67 65 73  Ptr) {.    Diges
31f0: 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72  tState *statePtr
3200: 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20   = (DigestState 
3210: 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20  *) clientData;. 
3220: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72     *errorCodePtr
3230: 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 20 28 74   = 0;..    if (t
3240: 6f 57 72 69 74 65 20 3c 3d 20 30 20 7c 7c 20 73  oWrite <= 0 || s
3250: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d  tatePtr->self ==
3260: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e   (Tcl_Channel) N
3270: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 30  ULL) {..return 0
3280: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
3290: 55 70 64 61 74 65 20 68 61 73 68 20 66 75 6e 63  Update hash func
32a0: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28  tion */.    if (
32b0: 74 6f 57 72 69 74 65 20 3e 20 30 20 26 26 20 21  toWrite > 0 && !
32c0: 54 6c 73 5f 44 69 67 65 73 74 55 70 64 61 74 65  Tls_DigestUpdate
32d0: 28 73 74 61 74 65 50 74 72 2c 20 62 75 66 2c 20  (statePtr, buf, 
32e0: 28 73 69 7a 65 5f 74 29 20 74 6f 57 72 69 74 65  (size_t) toWrite
32f0: 29 29 20 7b 0a 09 54 63 6c 5f 53 65 74 43 68 61  )) {..Tcl_SetCha
3300: 6e 6e 65 6c 45 72 72 6f 72 28 73 74 61 74 65 50  nnelError(stateP
3310: 74 72 2d 3e 73 65 6c 66 2c 20 54 63 6c 5f 4f 62  tr->self, Tcl_Ob
3320: 6a 50 72 69 6e 74 66 28 22 44 69 67 65 73 74 20  jPrintf("Digest 
3330: 75 70 64 61 74 65 20 66 61 69 6c 65 64 3a 20 25  update failed: %
3340: 73 22 2c 20 52 45 41 53 4f 4e 28 29 29 29 3b 0a  s", REASON()));.
3350: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d  .*errorCodePtr =
3360: 20 45 49 4e 56 41 4c 3b 0a 09 72 65 74 75 72 6e   EINVAL;..return
3370: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   -1;.    }.    r
3380: 65 74 75 72 6e 20 74 6f 57 72 69 74 65 3b 0a 7d  eturn toWrite;.}
3390: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
33a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
33e0: 0a 20 2a 20 44 69 67 65 73 74 53 65 74 4f 70 74  . * DigestSetOpt
33f0: 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a  ionProc --. *. *
3400: 09 43 61 6c 6c 65 64 20 62 79 20 74 68 65 20 67  .Called by the g
3410: 65 6e 65 72 69 63 20 49 4f 20 73 79 73 74 65 6d  eneric IO system
3420: 20 74 6f 20 73 65 74 20 63 68 61 6e 6e 65 6c 20   to set channel 
3430: 6f 70 74 69 6f 6e 20 6e 61 6d 65 20 74 6f 20 76  option name to v
3440: 61 6c 75 65 2e 0a 20 2a 0a 20 2a 20 52 65 74 75  alue.. *. * Retu
3450: 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 69  rns:. *.TCL_OK i
3460: 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20  f successful or 
3470: 54 43 4c 5f 45 52 52 4f 52 20 69 66 20 66 61 69  TCL_ERROR if fai
3480: 6c 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 61  led along with a
3490: 6e 20 65 72 72 6f 72 0a 20 2a 09 6d 65 73 73 61  n error. *.messa
34a0: 67 65 20 69 6e 20 69 6e 74 65 72 70 20 61 6e 64  ge in interp and
34b0: 20 54 63 6c 5f 53 65 74 45 72 72 6e 6f 2e 0a 20   Tcl_SetErrno.. 
34c0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
34d0: 73 3a 0a 20 2a 09 55 70 64 61 74 65 73 20 63 68  s:. *.Updates ch
34e0: 61 6e 6e 65 6c 20 6f 70 74 69 6f 6e 20 74 6f 20  annel option to 
34f0: 6e 65 77 20 76 61 6c 75 65 2e 0a 20 2a 0a 20 2a  new value.. *. *
3500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3540: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
3550: 63 20 69 6e 74 20 44 69 67 65 73 74 53 65 74 4f  c int DigestSetO
3560: 70 74 69 6f 6e 50 72 6f 63 28 43 6c 69 65 6e 74  ptionProc(Client
3570: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
3580: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
3590: 65 72 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  erp, const char 
35a0: 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c 0a 09 63 6f  *optionName,..co
35b0: 6e 73 74 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e  nst char *option
35c0: 56 61 6c 75 65 29 20 7b 0a 20 20 20 20 44 69 67  Value) {.    Dig
35d0: 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50  estState *stateP
35e0: 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 74  tr = (DigestStat
35f0: 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b  e *) clientData;
3600: 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  .    Tcl_Channel
3610: 20 70 61 72 65 6e 74 3b 0a 20 20 20 20 54 63 6c   parent;.    Tcl
3620: 5f 44 72 69 76 65 72 53 65 74 4f 70 74 69 6f 6e  _DriverSetOption
3630: 50 72 6f 63 20 2a 73 65 74 4f 70 74 69 6f 6e 50  Proc *setOptionP
3640: 72 6f 63 3b 0a 0a 20 20 20 20 69 66 20 28 73 74  roc;..    if (st
3650: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20  atePtr->self == 
3660: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
3670: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  LL) {..return TC
3680: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
3690: 20 20 20 20 2f 2a 20 44 65 6c 65 67 61 74 65 20      /* Delegate 
36a0: 6f 70 74 69 6f 6e 73 20 64 6f 77 6e 73 74 72 65  options downstre
36b0: 61 6d 20 2a 2f 0a 20 20 20 20 70 61 72 65 6e 74  am */.    parent
36c0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 63 6b 65   = Tcl_GetStacke
36d0: 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74  dChannel(statePt
36e0: 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 20 73 65  r->self);.    se
36f0: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 3d 20 54 63  tOptionProc = Tc
3700: 6c 5f 43 68 61 6e 6e 65 6c 53 65 74 4f 70 74 69  l_ChannelSetOpti
3710: 6f 6e 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 68  onProc(Tcl_GetCh
3720: 61 6e 6e 65 6c 54 79 70 65 28 70 61 72 65 6e 74  annelType(parent
3730: 29 29 3b 0a 20 20 20 20 69 66 20 28 73 65 74 4f  ));.    if (setO
3740: 70 74 69 6f 6e 50 72 6f 63 20 21 3d 20 4e 55 4c  ptionProc != NUL
3750: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 28 2a 73  L) {..return (*s
3760: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 29 28 54 63  etOptionProc)(Tc
3770: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74  l_GetChannelInst
3780: 61 6e 63 65 44 61 74 61 28 70 61 72 65 6e 74 29  anceData(parent)
3790: 2c 20 69 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e  , interp, option
37a0: 4e 61 6d 65 2c 20 6f 70 74 69 6f 6e 56 61 6c 75  Name, optionValu
37b0: 65 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  e);.    } else {
37c0: 0a 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 45  ..Tcl_SetErrno(E
37d0: 49 4e 56 41 4c 29 3b 0a 09 72 65 74 75 72 6e 20  INVAL);..return 
37e0: 54 63 6c 5f 42 61 64 43 68 61 6e 6e 65 6c 4f 70  Tcl_BadChannelOp
37f0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f 70 74  tion(interp, opt
3800: 69 6f 6e 4e 61 6d 65 2c 20 4e 55 4c 4c 29 3b 0a  ionName, NULL);.
3810: 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d      }.}../*. *--
3820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3860: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73  ----. *. * Diges
3870: 74 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2d  tGetOptionProc -
3880: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62  -. *. *.Called b
3890: 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f  y the generic IO
38a0: 20 73 79 73 74 65 6d 20 74 6f 20 67 65 74 20 63   system to get c
38b0: 68 61 6e 6e 65 6c 20 6f 70 74 69 6f 6e 20 6e 61  hannel option na
38c0: 6d 65 27 73 20 76 61 6c 75 65 2e 0a 20 2a 0a 20  me's value.. *. 
38d0: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43  * Returns:. *.TC
38e0: 4c 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66  L_OK if successf
38f0: 75 6c 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 20  ul or TCL_ERROR 
3900: 69 66 20 66 61 69 6c 65 64 20 61 6c 6f 6e 67 20  if failed along 
3910: 77 69 74 68 20 61 6e 20 65 72 72 6f 72 0a 20 2a  with an error. *
3920: 09 6d 65 73 73 61 67 65 20 69 6e 20 69 6e 74 65  .message in inte
3930: 72 70 20 61 6e 64 20 54 63 6c 5f 53 65 74 45 72  rp and Tcl_SetEr
3940: 72 6e 6f 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  rno.. *. * Side 
3950: 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73  effects:. *.Sets
3960: 20 72 65 73 75 6c 74 20 74 6f 20 6f 70 74 69 6f   result to optio
3970: 6e 27 73 20 76 61 6c 75 65 0a 20 2a 0a 20 2a 2d  n's value. *. *-
3980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
39d0: 20 69 6e 74 20 44 69 67 65 73 74 47 65 74 4f 70   int DigestGetOp
39e0: 74 69 6f 6e 50 72 6f 63 28 43 6c 69 65 6e 74 44  tionProc(ClientD
39f0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
3a00: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
3a10: 72 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  rp, const char *
3a20: 6f 70 74 69 6f 6e 4e 61 6d 65 2c 0a 09 54 63 6c  optionName,..Tcl
3a30: 5f 44 53 74 72 69 6e 67 20 2a 6f 70 74 69 6f 6e  _DString *option
3a40: 56 61 6c 75 65 29 20 7b 0a 20 20 20 20 44 69 67  Value) {.    Dig
3a50: 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50  estState *stateP
3a60: 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 74  tr = (DigestStat
3a70: 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b  e *) clientData;
3a80: 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  .    Tcl_Channel
3a90: 20 70 61 72 65 6e 74 3b 0a 20 20 20 20 54 63 6c   parent;.    Tcl
3aa0: 5f 44 72 69 76 65 72 47 65 74 4f 70 74 69 6f 6e  _DriverGetOption
3ab0: 50 72 6f 63 20 2a 67 65 74 4f 70 74 69 6f 6e 50  Proc *getOptionP
3ac0: 72 6f 63 3b 0a 0a 20 20 20 20 69 66 20 28 73 74  roc;..    if (st
3ad0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20  atePtr->self == 
3ae0: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
3af0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  LL) {..return TC
3b00: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
3b10: 20 20 20 20 2f 2a 20 44 65 6c 65 67 61 74 65 20      /* Delegate 
3b20: 6f 70 74 69 6f 6e 73 20 64 6f 77 6e 73 74 72 65  options downstre
3b30: 61 6d 20 2a 2f 0a 20 20 20 20 70 61 72 65 6e 74  am */.    parent
3b40: 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 63 6b 65   = Tcl_GetStacke
3b50: 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74  dChannel(statePt
3b60: 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 20 67 65  r->self);.    ge
3b70: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 3d 20 54 63  tOptionProc = Tc
3b80: 6c 5f 43 68 61 6e 6e 65 6c 47 65 74 4f 70 74 69  l_ChannelGetOpti
3b90: 6f 6e 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 68  onProc(Tcl_GetCh
3ba0: 61 6e 6e 65 6c 54 79 70 65 28 70 61 72 65 6e 74  annelType(parent
3bb0: 29 29 3b 0a 20 20 20 20 69 66 20 28 67 65 74 4f  ));.    if (getO
3bc0: 70 74 69 6f 6e 50 72 6f 63 20 21 3d 20 4e 55 4c  ptionProc != NUL
3bd0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 28 2a 67  L) {..return (*g
3be0: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 29 28 54 63  etOptionProc)(Tc
3bf0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74  l_GetChannelInst
3c00: 61 6e 63 65 44 61 74 61 28 70 61 72 65 6e 74 29  anceData(parent)
3c10: 2c 20 69 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e  , interp, option
3c20: 4e 61 6d 65 2c 20 6f 70 74 69 6f 6e 56 61 6c 75  Name, optionValu
3c30: 65 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  e);.    } else i
3c40: 66 20 28 6f 70 74 69 6f 6e 4e 61 6d 65 20 3d 3d  f (optionName ==
3c50: 20 28 63 68 61 72 2a 29 20 4e 55 4c 4c 29 20 7b   (char*) NULL) {
3c60: 0a 09 2f 2a 20 52 65 71 75 65 73 74 20 69 73 20  ../* Request is 
3c70: 71 75 65 72 79 20 66 6f 72 20 61 6c 6c 20 6f 70  query for all op
3c80: 74 69 6f 6e 73 2c 20 74 68 69 73 20 69 73 20 6f  tions, this is o
3c90: 6b 2e 20 2a 2f 0a 09 72 65 74 75 72 6e 20 54 43  k. */..return TC
3ca0: 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  L_OK;.    } else
3cb0: 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f   {..Tcl_SetErrno
3cc0: 28 45 49 4e 56 41 4c 29 3b 0a 09 72 65 74 75 72  (EINVAL);..retur
3cd0: 6e 20 54 63 6c 5f 42 61 64 43 68 61 6e 6e 65 6c  n Tcl_BadChannel
3ce0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f  Option(interp, o
3cf0: 70 74 69 6f 6e 4e 61 6d 65 2c 20 4e 55 4c 4c 29  ptionName, NULL)
3d00: 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a  ;.    }.}../*. *
3d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3d50: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67  ------. *. * Dig
3d60: 65 73 74 54 69 6d 65 72 48 61 6e 64 6c 65 72 20  estTimerHandler 
3d70: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20  --. *. *.Called 
3d80: 62 79 20 74 68 65 20 6e 6f 74 69 66 69 65 72 20  by the notifier 
3d90: 76 69 61 20 74 69 6d 65 72 20 74 6f 20 66 6c 75  via timer to flu
3da0: 73 68 20 6f 75 74 20 70 65 6e 64 69 6e 67 20 69  sh out pending i
3db0: 6e 70 75 74 20 64 61 74 61 2e 0a 20 2a 0a 20 2a  nput data.. *. *
3dc0: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 4e 6f 74   Returns:. *.Not
3dd0: 68 69 6e 67 0a 20 2a 0a 20 2a 20 53 69 64 65 20  hing. *. * Side 
3de0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20  effects:. *.May 
3df0: 63 61 6c 6c 20 54 63 6c 5f 4e 6f 74 69 66 79 43  call Tcl_NotifyC
3e00: 68 61 6e 6e 65 6c 0a 20 2a 0a 20 2a 2d 2d 2d 2d  hannel. *. *----
3e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e50: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  --. */.static vo
3e60: 69 64 20 44 69 67 65 73 74 54 69 6d 65 72 48 61  id DigestTimerHa
3e70: 6e 64 6c 65 72 28 43 6c 69 65 6e 74 44 61 74 61  ndler(ClientData
3e80: 20 63 6c 69 65 6e 74 44 61 74 61 29 20 7b 0a 20   clientData) {. 
3e90: 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a     DigestState *
3ea0: 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65  statePtr = (Dige
3eb0: 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e  stState *) clien
3ec0: 74 44 61 74 61 3b 0a 0a 20 20 20 20 69 66 20 28  tData;..    if (
3ed0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d  statePtr->self =
3ee0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
3ef0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 3b  NULL) {..return;
3f00: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
3f10: 6c 65 61 72 20 74 69 6d 65 72 20 74 6f 6b 65 6e  lear timer token
3f20: 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72   */.    statePtr
3f30: 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54  ->timer = (Tcl_T
3f40: 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b  imerToken) NULL;
3f50: 0a 0a 20 20 20 20 2f 2a 20 46 69 72 65 20 65 76  ..    /* Fire ev
3f60: 65 6e 74 20 69 66 20 74 68 65 72 65 20 69 73 20  ent if there is 
3f70: 70 65 6e 64 69 6e 67 20 64 61 74 61 2c 20 73 6b  pending data, sk
3f80: 69 70 20 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a  ip otherwise */.
3f90: 20 20 20 20 69 66 20 28 28 73 74 61 74 65 50 74      if ((statePt
3fa0: 72 2d 3e 77 61 74 63 68 4d 61 73 6b 20 26 20 54  r->watchMask & T
3fb0: 43 4c 5f 52 45 41 44 41 42 4c 45 29 20 26 26 20  CL_READABLE) && 
3fc0: 28 54 63 6c 5f 49 6e 70 75 74 42 75 66 66 65 72  (Tcl_InputBuffer
3fd0: 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  ed(statePtr->sel
3fe0: 66 29 20 3e 20 30 29 29 20 7b 0a 09 54 63 6c 5f  f) > 0)) {..Tcl_
3ff0: 4e 6f 74 69 66 79 43 68 61 6e 6e 65 6c 28 73 74  NotifyChannel(st
4000: 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 54 43  atePtr->self, TC
4010: 4c 5f 52 45 41 44 41 42 4c 45 29 3b 0a 20 20 20  L_READABLE);.   
4020: 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d   }.}../*. *-----
4030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4070: 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 57 61  -. *. * DigestWa
4080: 74 63 68 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a  tchProc --. *. *
4090: 09 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20  .Initialize the 
40a0: 6e 6f 74 69 66 69 65 72 20 74 6f 20 77 61 74 63  notifier to watc
40b0: 68 20 66 6f 72 20 65 76 65 6e 74 73 20 66 72 6f  h for events fro
40c0: 6d 20 74 68 69 73 20 63 68 61 6e 6e 65 6c 2e 0a  m this channel..
40d0: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20   *. * Returns:. 
40e0: 2a 09 4e 6f 74 68 69 6e 67 0a 20 2a 0a 20 2a 20  *.Nothing. *. * 
40f0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
4100: 09 43 6f 6e 66 69 67 75 72 65 20 6e 6f 74 69 66  .Configure notif
4110: 69 65 72 20 73 6f 20 66 75 74 75 72 65 20 65 76  ier so future ev
4120: 65 6e 74 73 20 6f 6e 20 74 68 65 20 63 68 61 6e  ents on the chan
4130: 6e 65 6c 20 77 69 6c 6c 20 62 65 20 73 65 65 6e  nel will be seen
4140: 20 62 79 20 54 63 6c 2e 0a 20 2a 0a 20 2a 2d 2d   by Tcl.. *. *--
4150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4190: 2d 2d 2d 2d 0a 20 2a 2f 0a 23 64 65 66 69 6e 65  ----. */.#define
41a0: 20 52 45 41 44 5f 44 45 4c 41 59 09 35 0a 76 6f   READ_DELAY.5.vo
41b0: 69 64 20 44 69 67 65 73 74 57 61 74 63 68 50 72  id DigestWatchPr
41c0: 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  oc(ClientData cl
41d0: 69 65 6e 74 44 61 74 61 2c 20 69 6e 74 20 6d 61  ientData, int ma
41e0: 73 6b 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74  sk) {.    Digest
41f0: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20  State *statePtr 
4200: 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a  = (DigestState *
4210: 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20  ) clientData;.  
4220: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 70 61    Tcl_Channel pa
4230: 72 65 6e 74 3b 0a 20 20 20 20 54 63 6c 5f 44 72  rent;.    Tcl_Dr
4240: 69 76 65 72 57 61 74 63 68 50 72 6f 63 20 2a 77  iverWatchProc *w
4250: 61 74 63 68 50 72 6f 63 3b 0a 0a 20 20 20 20 69  atchProc;..    i
4260: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  f (statePtr->sel
4270: 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65  f == (Tcl_Channe
4280: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  l) NULL) {..retu
4290: 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rn;.    }..    /
42a0: 2a 20 53 74 6f 72 65 20 4f 52 2d 65 64 20 63 6f  * Store OR-ed co
42b0: 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 54 43 4c  mbination of TCL
42c0: 5f 52 45 41 44 41 42 4c 45 2c 20 54 43 4c 5f 57  _READABLE, TCL_W
42d0: 52 49 54 41 42 4c 45 20 61 6e 64 20 54 43 4c 5f  RITABLE and TCL_
42e0: 45 58 43 45 50 54 49 4f 4e 20 2a 2f 0a 20 20 20  EXCEPTION */.   
42f0: 20 73 74 61 74 65 50 74 72 2d 3e 77 61 74 63 68   statePtr->watch
4300: 4d 61 73 6b 20 3d 20 6d 61 73 6b 3b 0a 0a 20 20  Mask = mask;..  
4310: 20 20 2f 2a 20 50 72 6f 70 61 67 61 74 65 20 6d    /* Propagate m
4320: 61 73 6b 20 69 6e 66 6f 20 74 6f 20 70 61 72 65  ask info to pare
4330: 6e 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20  nt channel */.  
4340: 20 20 70 61 72 65 6e 74 20 3d 20 54 63 6c 5f 47    parent = Tcl_G
4350: 65 74 53 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c  etStackedChannel
4360: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
4370: 3b 0a 20 20 20 20 77 61 74 63 68 50 72 6f 63 20  ;.    watchProc 
4380: 3d 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 57 61 74  = Tcl_ChannelWat
4390: 63 68 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 68  chProc(Tcl_GetCh
43a0: 61 6e 6e 65 6c 54 79 70 65 28 70 61 72 65 6e 74  annelType(parent
43b0: 29 29 3b 0a 20 20 20 20 77 61 74 63 68 50 72 6f  ));.    watchPro
43c0: 63 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  c(Tcl_GetChannel
43d0: 49 6e 73 74 61 6e 63 65 44 61 74 61 28 70 61 72  InstanceData(par
43e0: 65 6e 74 29 2c 20 6d 61 73 6b 29 3b 0a 0a 20 20  ent), mask);..  
43f0: 20 20 2f 2a 20 52 65 6d 6f 76 65 20 70 65 6e 64    /* Remove pend
4400: 69 6e 67 20 74 69 6d 65 72 20 2a 2f 0a 20 20 20  ing timer */.   
4410: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74   if (statePtr->t
4420: 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d  imer != (Tcl_Tim
4430: 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b  erToken) NULL) {
4440: 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65  ..Tcl_DeleteTime
4450: 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74  rHandler(statePt
4460: 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74  r->timer);..stat
4470: 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54  ePtr->timer = (T
4480: 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e  cl_TimerToken) N
4490: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ULL;.    }..    
44a0: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 64  /* If there is d
44b0: 61 74 61 20 70 65 6e 64 69 6e 67 2c 20 73 65 74  ata pending, set
44c0: 20 6e 65 77 20 74 69 6d 65 72 20 74 6f 20 63 61   new timer to ca
44d0: 6c 6c 20 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61  ll Tcl_NotifyCha
44e0: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28  nnel */.    if (
44f0: 28 6d 61 73 6b 20 26 20 54 43 4c 5f 52 45 41 44  (mask & TCL_READ
4500: 41 42 4c 45 29 20 26 26 20 28 54 63 6c 5f 49 6e  ABLE) && (Tcl_In
4510: 70 75 74 42 75 66 66 65 72 65 64 28 73 74 61 74  putBuffered(stat
4520: 65 50 74 72 2d 3e 73 65 6c 66 29 20 3e 20 30 29  ePtr->self) > 0)
4530: 29 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74  ) {..statePtr->t
4540: 69 6d 65 72 20 3d 20 54 63 6c 5f 43 72 65 61 74  imer = Tcl_Creat
4550: 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 52 45  eTimerHandler(RE
4560: 41 44 5f 44 45 4c 41 59 2c 20 44 69 67 65 73 74  AD_DELAY, Digest
4570: 54 69 6d 65 72 48 61 6e 64 6c 65 72 2c 20 28 43  TimerHandler, (C
4580: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65  lientData) state
4590: 50 74 72 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f  Ptr);.    }.}../
45a0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
45b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
45c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
45d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
45e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
45f0: 20 44 69 67 65 73 74 47 65 74 48 61 6e 64 6c 65   DigestGetHandle
4600: 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61  Proc --. *. *.Ca
4610: 6c 6c 65 64 20 66 72 6f 6d 20 54 63 6c 5f 47 65  lled from Tcl_Ge
4620: 74 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 20 74  tChannelHandle t
4630: 6f 20 72 65 74 72 69 65 76 65 20 4f 53 20 73 70  o retrieve OS sp
4640: 65 63 69 66 69 63 20 66 69 6c 65 20 68 61 6e 64  ecific file hand
4650: 6c 65 0a 20 2a 09 66 72 6f 6d 20 69 6e 73 69 64  le. *.from insid
4660: 65 20 74 68 69 73 20 63 68 61 6e 6e 65 6c 2e 20  e this channel. 
4670: 4e 6f 74 20 75 73 65 64 20 66 6f 72 20 74 72 61  Not used for tra
4680: 6e 73 66 6f 72 6d 61 74 69 6f 6e 73 3f 0a 20 2a  nsformations?. *
4690: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09  . * Returns:. *.
46a0: 54 43 4c 5f 4f 4b 20 66 6f 72 20 73 75 63 63 65  TCL_OK for succe
46b0: 73 73 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 20  ss or TCL_ERROR 
46c0: 66 6f 72 20 65 72 72 6f 72 20 6f 72 20 69 66 20  for error or if 
46d0: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 2e 20 49  not supported. I
46e0: 66 0a 20 2a 09 64 69 72 65 63 74 69 6f 6e 20 69  f. *.direction i
46f0: 73 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 2c 20  s TCL_READABLE, 
4700: 73 65 74 73 20 68 61 6e 64 6c 65 50 74 72 20 74  sets handlePtr t
4710: 6f 20 74 68 65 20 68 61 6e 64 6c 65 20 75 73 65  o the handle use
4720: 64 20 66 6f 72 0a 20 2a 09 69 6e 70 75 74 2c 20  d for. *.input, 
4730: 6f 72 20 69 66 20 54 43 4c 5f 57 52 49 54 41 42  or if TCL_WRITAB
4740: 4c 45 20 73 65 74 73 20 74 6f 20 74 68 65 20 68  LE sets to the h
4750: 61 6e 64 6c 65 20 75 73 65 64 20 66 6f 72 20 6f  andle used for o
4760: 75 74 70 75 74 2e 0a 20 2a 0a 20 2a 20 53 69 64  utput.. *. * Sid
4770: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f  e effects:. *.No
4780: 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  ne. *. *--------
4790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
47d0: 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 47 65 74  */.int DigestGet
47e0: 48 61 6e 64 6c 65 50 72 6f 63 28 43 6c 69 65 6e  HandleProc(Clien
47f0: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
4800: 2c 20 69 6e 74 20 64 69 72 65 63 74 69 6f 6e 2c  , int direction,
4810: 20 43 6c 69 65 6e 74 44 61 74 61 20 2a 68 61 6e   ClientData *han
4820: 64 6c 65 50 74 72 29 20 7b 0a 20 20 20 20 44 69  dlePtr) {.    Di
4830: 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65  gestState *state
4840: 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 61  Ptr = (DigestSta
4850: 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61  te *) clientData
4860: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  ;..    if (state
4870: 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63  Ptr->self == (Tc
4880: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29  l_Channel) NULL)
4890: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
48a0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
48b0: 72 65 74 75 72 6e 20 54 63 6c 5f 47 65 74 43 68  return Tcl_GetCh
48c0: 61 6e 6e 65 6c 48 61 6e 64 6c 65 28 54 63 6c 5f  annelHandle(Tcl_
48d0: 47 65 74 53 74 61 63 6b 65 64 43 68 61 6e 6e 65  GetStackedChanne
48e0: 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  l(statePtr->self
48f0: 29 2c 20 64 69 72 65 63 74 69 6f 6e 2c 20 68 61  ), direction, ha
4900: 6e 64 6c 65 50 74 72 29 3b 0a 7d 0a 0a 2f 2a 0a  ndlePtr);.}../*.
4910: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
4920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4950: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44  --------. *. * D
4960: 69 67 65 73 74 4e 6f 74 69 66 79 50 72 6f 63 20  igestNotifyProc 
4970: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20  --. *. *.Called 
4980: 62 79 20 54 63 6c 20 74 6f 20 69 6e 66 6f 72 6d  by Tcl to inform
4990: 20 75 73 20 6f 66 20 61 63 74 69 76 69 74 79 20   us of activity 
49a0: 6f 6e 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  on the underlyin
49b0: 67 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a  g channel.. *. *
49c0: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 55 6e 63   Returns:. *.Unc
49d0: 68 61 6e 67 65 64 20 69 6e 74 65 72 65 73 74 4d  hanged interestM
49e0: 61 73 6b 20 77 68 69 63 68 20 69 73 20 61 6e 20  ask which is an 
49f0: 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f  OR-ed combinatio
4a00: 6e 20 6f 66 20 54 43 4c 5f 52 45 41 44 41 42 4c  n of TCL_READABL
4a10: 45 20 6f 72 20 54 43 4c 5f 57 52 49 54 41 42 4c  E or TCL_WRITABL
4a20: 45 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  E. *. * Side eff
4a30: 65 63 74 73 3a 0a 20 2a 09 43 61 6e 63 65 6c 73  ects:. *.Cancels
4a40: 20 61 6e 79 20 70 65 6e 64 69 6e 67 20 74 69 6d   any pending tim
4a50: 65 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  er.. *. *-------
4a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
4aa0: 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 4e 6f   */.int DigestNo
4ab0: 74 69 66 79 50 72 6f 63 28 43 6c 69 65 6e 74 44  tifyProc(ClientD
4ac0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
4ad0: 69 6e 74 20 69 6e 74 65 72 65 73 74 4d 61 73 6b  int interestMask
4ae0: 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74  ) {.    DigestSt
4af0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
4b00: 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 29 20  (DigestState *) 
4b10: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20  clientData;..   
4b20: 20 2f 2a 20 53 6b 69 70 20 74 69 6d 65 72 20 65   /* Skip timer e
4b30: 76 65 6e 74 20 61 73 20 72 65 64 75 6e 64 61 6e  vent as redundan
4b40: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61  t */.    if (sta
4b50: 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20  tePtr->timer != 
4b60: 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29  (Tcl_TimerToken)
4b70: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65   NULL) {..Tcl_De
4b80: 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72  leteTimerHandler
4b90: 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72  (statePtr->timer
4ba0: 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69  );..statePtr->ti
4bb0: 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72  mer = (Tcl_Timer
4bc0: 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 20 20 20  Token) NULL;.   
4bd0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 69 6e   }.    return in
4be0: 74 65 72 65 73 74 4d 61 73 6b 3b 0a 7d 0a 0a 2f  terestMask;.}../
4bf0: 2a 0a 20 2a 0a 20 2a 20 43 68 61 6e 6e 65 6c 20  *. *. * Channel 
4c00: 74 79 70 65 20 73 74 72 75 63 74 75 72 65 20 64  type structure d
4c10: 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20 64 69  efinition for di
4c20: 67 65 73 74 20 74 72 61 6e 73 66 6f 72 6d 61 74  gest transformat
4c30: 69 6f 6e 73 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61  ions.. *. */.sta
4c40: 74 69 63 20 63 6f 6e 73 74 20 54 63 6c 5f 43 68  tic const Tcl_Ch
4c50: 61 6e 6e 65 6c 54 79 70 65 20 64 69 67 65 73 74  annelType digest
4c60: 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d 20 7b 0a  ChannelType = {.
4c70: 20 20 20 20 22 64 69 67 65 73 74 22 2c 09 09 09      "digest",...
4c80: 2f 2a 20 54 79 70 65 20 6e 61 6d 65 20 2a 2f 0a  /* Type name */.
4c90: 20 20 20 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f      TCL_CHANNEL_
4ca0: 56 45 52 53 49 4f 4e 5f 35 2c 09 2f 2a 20 76 35  VERSION_5,./* v5
4cb0: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20   channel */.    
4cc0: 44 69 67 65 73 74 43 6c 6f 73 65 50 72 6f 63 2c  DigestCloseProc,
4cd0: 09 09 2f 2a 20 43 6c 6f 73 65 20 70 72 6f 63 20  ../* Close proc 
4ce0: 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 49 6e 70  */.    DigestInp
4cf0: 75 74 50 72 6f 63 2c 09 09 2f 2a 20 49 6e 70 75  utProc,../* Inpu
4d00: 74 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 44 69  t proc */.    Di
4d10: 67 65 73 74 4f 75 74 70 75 74 50 72 6f 63 2c 09  gestOutputProc,.
4d20: 09 2f 2a 20 4f 75 74 70 75 74 20 70 72 6f 63 20  ./* Output proc 
4d30: 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f  */.    NULL,.../
4d40: 2a 20 53 65 65 6b 20 70 72 6f 63 20 2a 2f 0a 20  * Seek proc */. 
4d50: 20 20 20 44 69 67 65 73 74 53 65 74 4f 70 74 69     DigestSetOpti
4d60: 6f 6e 50 72 6f 63 2c 09 2f 2a 20 53 65 74 20 6f  onProc,./* Set o
4d70: 70 74 69 6f 6e 20 70 72 6f 63 20 2a 2f 0a 20 20  ption proc */.  
4d80: 20 20 44 69 67 65 73 74 47 65 74 4f 70 74 69 6f    DigestGetOptio
4d90: 6e 50 72 6f 63 2c 09 2f 2a 20 47 65 74 20 6f 70  nProc,./* Get op
4da0: 74 69 6f 6e 20 70 72 6f 63 20 2a 2f 0a 20 20 20  tion proc */.   
4db0: 20 44 69 67 65 73 74 57 61 74 63 68 50 72 6f 63   DigestWatchProc
4dc0: 2c 09 09 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  ,../* Initialize
4dd0: 20 6e 6f 74 69 66 69 65 72 20 2a 2f 0a 20 20 20   notifier */.   
4de0: 20 44 69 67 65 73 74 47 65 74 48 61 6e 64 6c 65   DigestGetHandle
4df0: 50 72 6f 63 2c 09 2f 2a 20 47 65 74 20 4f 53 20  Proc,./* Get OS 
4e00: 68 61 6e 64 6c 65 73 20 6f 75 74 20 6f 66 20 63  handles out of c
4e10: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 44 69  hannel */.    Di
4e20: 67 65 73 74 43 6c 6f 73 65 32 50 72 6f 63 2c 09  gestClose2Proc,.
4e30: 09 2f 2a 20 63 6c 6f 73 65 32 70 72 6f 63 20 2a  ./* close2proc *
4e40: 2f 0a 20 20 20 20 44 69 67 65 73 74 42 6c 6f 63  /.    DigestBloc
4e50: 6b 4d 6f 64 65 50 72 6f 63 2c 09 2f 2a 20 53 65  kModeProc,./* Se
4e60: 74 20 62 6c 6f 63 6b 69 6e 67 2f 6e 6f 6e 62 6c  t blocking/nonbl
4e70: 6f 63 6b 69 6e 67 20 6d 6f 64 65 2a 2f 0a 20 20  ocking mode*/.  
4e80: 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 46 6c 75    NULL,.../* Flu
4e90: 73 68 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 44  sh proc */.    D
4ea0: 69 67 65 73 74 4e 6f 74 69 66 79 50 72 6f 63 2c  igestNotifyProc,
4eb0: 09 09 2f 2a 20 48 61 6e 64 6c 69 6e 67 20 6f 66  ../* Handling of
4ec0: 20 65 76 65 6e 74 73 20 62 75 62 62 6c 69 6e 67   events bubbling
4ed0: 20 75 70 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c   up */.    NULL,
4ee0: 09 09 09 2f 2a 20 57 69 64 65 20 73 65 65 6b 20  .../* Wide seek 
4ef0: 70 72 6f 63 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c  proc */.    NULL
4f00: 2c 09 09 09 2f 2a 20 54 68 72 65 61 64 20 61 63  ,.../* Thread ac
4f10: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c  tion */.    NULL
4f20: 09 09 09 2f 2a 20 54 72 75 6e 63 61 74 65 20 2a  .../* Truncate *
4f30: 2f 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  /.};../*. *-----
4f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4f80: 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 44 69 67 65  -. *. * Tls_Dige
4f90: 73 74 43 68 61 6e 6e 65 6c 20 2d 2d 0a 20 2a 0a  stChannel --. *.
4fa0: 20 2a 09 43 72 65 61 74 65 20 61 20 73 74 61 63   *.Create a stac
4fb0: 6b 65 64 20 63 68 61 6e 6e 65 6c 20 66 6f 72 20  ked channel for 
4fc0: 61 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74  a message digest
4fd0: 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 2e   transformation.
4fe0: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a  . *. * Returns:.
4ff0: 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c   *.TCL_OK or TCL
5000: 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64  _ERROR. *. * Sid
5010: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 41 64  e effects:. *.Ad
5020: 64 73 20 74 72 61 6e 73 66 6f 72 6d 20 74 6f 20  ds transform to 
5030: 63 68 61 6e 6e 65 6c 20 61 6e 64 20 73 65 74 73  channel and sets
5040: 20 72 65 73 75 6c 74 20 74 6f 20 63 68 61 6e 6e   result to chann
5050: 65 6c 20 6e 61 6d 65 20 6f 72 20 65 72 72 6f 72  el name or error
5060: 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 2d   message.. *. *-
5070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50b0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
50c0: 20 69 6e 74 0a 54 6c 73 5f 44 69 67 65 73 74 43   int.Tls_DigestC
50d0: 68 61 6e 6e 65 6c 28 54 63 6c 5f 49 6e 74 65 72  hannel(Tcl_Inter
50e0: 70 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74  p *interp, const
50f0: 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c 2c 20   char *channel, 
5100: 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64  const EVP_MD *md
5110: 2c 20 69 6e 74 20 66 6f 72 6d 61 74 2c 0a 09 54  , int format,..T
5120: 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4f 62 6a 29 20  cl_Obj *keyObj) 
5130: 7b 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 20  {.    int mode; 
5140: 2f 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61  /* OR-ed combina
5150: 74 69 6f 6e 20 6f 66 20 54 43 4c 5f 52 45 41 44  tion of TCL_READ
5160: 41 42 4c 45 20 61 6e 64 20 54 43 4c 5f 57 52 49  ABLE and TCL_WRI
5170: 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 54 63 6c  TABLE */.    Tcl
5180: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20  _Channel chan;. 
5190: 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a     DigestState *
51a0: 73 74 61 74 65 50 74 72 3b 0a 20 20 20 20 45 56  statePtr;.    EV
51b0: 50 5f 4d 44 5f 43 54 58 20 2a 63 74 78 20 3d 20  P_MD_CTX *ctx = 
51c0: 28 45 56 50 5f 4d 44 5f 43 54 58 20 2a 29 20 4e  (EVP_MD_CTX *) N
51d0: 55 4c 4c 3b 0a 20 20 20 20 48 4d 41 43 5f 43 54  ULL;.    HMAC_CT
51e0: 58 20 2a 68 63 74 78 20 3d 20 28 48 4d 41 43 5f  X *hctx = (HMAC_
51f0: 43 54 58 20 2a 29 20 4e 55 4c 4c 3b 0a 0a 20 20  CTX *) NULL;..  
5200: 20 20 2f 2a 20 56 61 6c 69 64 61 74 65 20 61 72    /* Validate ar
5210: 67 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 68  gs */.    if (ch
5220: 61 6e 6e 65 6c 20 3d 3d 20 28 63 6f 6e 73 74 20  annel == (const 
5230: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 20 7c 7c 20  char *) NULL || 
5240: 6d 64 20 3d 3d 20 28 63 6f 6e 73 74 20 45 56 50  md == (const EVP
5250: 5f 4d 44 20 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09  _MD *) NULL) {..
5260: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
5270: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61  ;.    }..    cha
5280: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  n = Tcl_GetChann
5290: 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 6e  el(interp, chann
52a0: 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20  el, &mode);.    
52b0: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c  if (chan == (Tcl
52c0: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20  _Channel) NULL) 
52d0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
52e0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
52f0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20  /* Make sure to 
5300: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74  operate on the t
5310: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a  opmost channel *
5320: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  /.    chan = Tcl
5330: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63  _GetTopChannel(c
5340: 68 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72  han);..    /* Cr
5350: 65 61 74 65 20 73 74 72 75 63 74 20 2a 2f 0a 20  eate struct */. 
5360: 20 20 20 69 66 20 28 28 73 74 61 74 65 50 74 72     if ((statePtr
5370: 20 3d 20 54 6c 73 5f 44 69 67 65 73 74 4e 65 77   = Tls_DigestNew
5380: 28 69 6e 74 65 72 70 2c 20 66 6f 72 6d 61 74 29  (interp, format)
5390: 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63  ) == NULL) {..Tc
53a0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
53b0: 6e 74 65 72 70 2c 20 22 49 6e 69 74 69 61 6c 69  nterp, "Initiali
53c0: 7a 65 20 64 69 67 65 73 74 20 65 72 72 6f 72 3a  ze digest error:
53d0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
53e0: 6f 6e 20 66 61 69 6c 75 72 65 22 2c 20 28 63 68  on failure", (ch
53f0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65  ar *) NULL);..re
5400: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
5410: 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50      }.    stateP
5420: 74 72 2d 3e 73 65 6c 66 20 3d 20 63 68 61 6e 3b  tr->self = chan;
5430: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 6d  .    statePtr->m
5440: 6f 64 65 20 3d 20 6d 6f 64 65 3b 0a 0a 20 20 20  ode = mode;..   
5450: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 68   /* Initialize h
5460: 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ash function */.
5470: 20 20 20 20 69 66 20 28 54 6c 73 5f 44 69 67 65      if (Tls_Dige
5480: 73 74 49 6e 69 74 28 69 6e 74 65 72 70 2c 20 73  stInit(interp, s
5490: 74 61 74 65 50 74 72 2c 20 6d 64 2c 20 6b 65 79  tatePtr, md, key
54a0: 4f 62 6a 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  Obj) != TCL_OK) 
54b0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
54c0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
54d0: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 20 63 68 61  /* Configure cha
54e0: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  nnel */.    Tcl_
54f0: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  SetChannelOption
5500: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22  (interp, chan, "
5510: 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22  -translation", "
5520: 62 69 6e 61 72 79 22 29 3b 0a 20 20 20 20 69 66  binary");.    if
5530: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c   (Tcl_GetChannel
5540: 42 75 66 66 65 72 53 69 7a 65 28 63 68 61 6e 29  BufferSize(chan)
5550: 20 3c 20 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49   < EVP_MAX_MD_SI
5560: 5a 45 20 2a 20 32 29 20 7b 0a 09 54 63 6c 5f 53  ZE * 2) {..Tcl_S
5570: 65 74 43 68 61 6e 6e 65 6c 42 75 66 66 65 72 53  etChannelBufferS
5580: 69 7a 65 28 63 68 61 6e 2c 20 45 56 50 5f 4d 41  ize(chan, EVP_MA
5590: 58 5f 4d 44 5f 53 49 5a 45 20 2a 20 32 29 3b 0a  X_MD_SIZE * 2);.
55a0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 74      }..    /* St
55b0: 61 63 6b 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  ack channel */. 
55c0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c     statePtr->sel
55d0: 66 20 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68 61  f = Tcl_StackCha
55e0: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 26 64 69  nnel(interp, &di
55f0: 67 65 73 74 43 68 61 6e 6e 65 6c 54 79 70 65 2c  gestChannelType,
5600: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74   (ClientData) st
5610: 61 74 65 50 74 72 2c 20 6d 6f 64 65 2c 20 63 68  atePtr, mode, ch
5620: 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 73 74 61  an);.    if (sta
5630: 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28  tePtr->self == (
5640: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
5650: 4c 29 20 7b 0a 09 54 6c 73 5f 44 69 67 65 73 74  L) {..Tls_Digest
5660: 46 72 65 65 28 73 74 61 74 65 50 74 72 29 3b 0a  Free(statePtr);.
5670: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
5680: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63  R;.    }..    Tc
5690: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
56a0: 72 70 2c 20 28 63 68 61 72 20 2a 29 20 54 63 6c  rp, (char *) Tcl
56b0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
56c0: 63 68 61 6e 29 2c 20 54 43 4c 5f 56 4f 4c 41 54  chan), TCL_VOLAT
56d0: 49 4c 45 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ILE);.    return
56e0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20   TCL_OK;.}../*. 
56f0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
5700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5730: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e  -------. *. * Un
5740: 73 74 61 63 6b 20 43 68 61 6e 6e 65 6c 20 2d 2d  stack Channel --
5750: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63  . *. *.This func
5760: 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20  tion is invoked 
5770: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22  to process the "
5780: 75 6e 73 74 61 63 6b 22 20 54 43 4c 20 63 6f 6d  unstack" TCL com
5790: 6d 61 6e 64 2e 0a 20 2a 09 53 65 65 20 74 68 65  mand.. *.See the
57a0: 20 75 73 65 72 20 64 6f 63 75 6d 65 6e 74 61 74   user documentat
57b0: 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c 73 20  ion for details 
57c0: 6f 6e 20 77 68 61 74 20 69 74 20 64 6f 65 73 2e  on what it does.
57d0: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a  . *. * Returns:.
57e0: 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c   *.TCL_OK or TCL
57f0: 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64  _ERROR. *. * Sid
5800: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 52 65  e effects:. *.Re
5810: 6d 6f 76 65 73 20 74 72 61 6e 73 66 6f 72 6d 20  moves transform 
5820: 66 72 6f 6d 20 63 68 61 6e 6e 65 6c 20 6f 72 20  from channel or 
5830: 73 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20 65  sets result to e
5840: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a  rror message.. *
5850: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
5860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
58a0: 61 74 69 63 20 69 6e 74 0a 55 6e 73 74 61 63 6b  atic int.Unstack
58b0: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74  ObjCmd(ClientDat
58c0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63  a clientData, Tc
58d0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
58e0: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f  , int objc, Tcl_
58f0: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b  Obj *const objv[
5900: 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61  ]) {.    Tcl_Cha
5910: 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 69  nnel chan;.    i
5920: 6e 74 20 6d 6f 64 65 3b 20 2f 2a 20 4f 52 2d 65  nt mode; /* OR-e
5930: 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  d combination of
5940: 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 61 6e   TCL_READABLE an
5950: 64 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 20 20  d TCL_WRITABLE  
5960: 2a 2f 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63  */..    if (objc
5970: 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72   != 2) {..Tcl_Wr
5980: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
5990: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61  p, 1, objv, "cha
59a0: 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20  nnel");..return 
59b0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
59c0: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 68 61  ..    /* Get cha
59d0: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e  nnel */.    chan
59e0: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   = Tcl_GetChanne
59f0: 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  l(interp, Tcl_Ge
5a00: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
5a10: 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 26  bjv[1], NULL), &
5a20: 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63  mode);.    if (c
5a30: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  han == (Tcl_Chan
5a40: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  nel) NULL) {..re
5a50: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
5a60: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
5a70: 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61  ke sure to opera
5a80: 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73  te on the topmos
5a90: 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20  t channel */.   
5aa0: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54   chan = Tcl_GetT
5ab0: 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b  opChannel(chan);
5ac0: 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69  ..    /* Check i
5ad0: 66 20 64 69 67 65 73 74 20 63 68 61 6e 6e 65 6c  f digest channel
5ae0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f   */.    if (Tcl_
5af0: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63  GetChannelType(c
5b00: 68 61 6e 29 20 21 3d 20 26 64 69 67 65 73 74 43  han) != &digestC
5b10: 68 61 6e 6e 65 6c 54 79 70 65 29 20 7b 0a 09 54  hannelType) {..T
5b20: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
5b30: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61  interp, "bad cha
5b40: 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65  nnel \"", Tcl_Ge
5b50: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61  tChannelName(cha
5b60: 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f  n),..    "\": no
5b70: 74 20 61 20 64 69 67 65 73 74 20 63 68 61 6e 6e  t a digest chann
5b80: 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c  el", NULL);..Tcl
5b90: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e  _SetErrorCode(in
5ba0: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 55 4e  terp, "TLS", "UN
5bb0: 53 54 41 43 4b 22 2c 20 22 43 48 41 4e 4e 45 4c  STACK", "CHANNEL
5bc0: 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63  ", "INVALID", (c
5bd0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72  har *) NULL);..r
5be0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
5bf0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50  .    }..    /* P
5c00: 6f 70 20 74 72 61 6e 73 66 6f 72 6d 20 66 72 6f  op transform fro
5c10: 6d 20 63 68 61 6e 6e 65 6c 2c 20 6c 65 61 76 65  m channel, leave
5c20: 73 20 65 72 72 6f 72 20 69 6e 66 6f 20 69 6e 20  s error info in 
5c30: 69 6e 74 65 72 70 20 72 65 73 75 6c 74 20 2a 2f  interp result */
5c40: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 55 6e 73  .    if (Tcl_Uns
5c50: 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65  tackChannel(inte
5c60: 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54 43 4c  rp, chan) == TCL
5c70: 5f 45 52 52 4f 52 29 20 7b 0a 09 72 65 74 75 72  _ERROR) {..retur
5c80: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
5c90: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43   }.    return TC
5ca0: 4c 5f 4f 4b 3b 0a 20 20 20 20 09 63 6c 69 65 6e  L_OK;.    .clien
5cb0: 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61  tData = clientDa
5cc0: 74 61 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ta;.}../********
5cd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5cf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5d00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 73 74  ***********/..st
5d10: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
5d20: 2a 69 6e 73 74 61 6e 63 65 5f 66 6e 73 20 5b 5d  *instance_fns []
5d30: 20 3d 20 7b 20 22 66 69 6e 61 6c 69 7a 65 22 2c   = { "finalize",
5d40: 20 22 75 70 64 61 74 65 22 2c 20 4e 55 4c 4c 20   "update", NULL 
5d50: 7d 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  };../*. *-------
5d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
5da0: 20 2a 20 49 6e 73 74 61 6e 63 65 4f 62 6a 43 6d   * InstanceObjCm
5db0: 64 20 2d 2d 0a 20 2a 0a 20 2a 09 20 48 61 6e 64  d --. *. *. Hand
5dc0: 6c 65 72 20 66 6f 72 20 64 69 67 65 73 74 20 61  ler for digest a
5dd0: 63 63 75 6d 75 6c 61 74 6f 72 20 63 6f 6d 6d 61  ccumulator comma
5de0: 6e 64 20 69 6e 73 74 61 6e 63 65 73 2e 0a 20 2a  nd instances.. *
5df0: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09  . * Returns:. *.
5e00: 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52  TCL_OK or TCL_ER
5e10: 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ROR. *. * Side e
5e20: 66 66 65 63 74 73 3a 0a 20 2a 09 41 64 64 73 20  ffects:. *.Adds 
5e30: 64 61 74 61 20 74 6f 20 68 61 73 68 20 6f 72 20  data to hash or 
5e40: 72 65 74 75 72 6e 73 20 6d 65 73 73 61 67 65 20  returns message 
5e50: 64 69 67 65 73 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d  digest. *. *----
5e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
5ea0: 20 2a 2f 0a 69 6e 74 20 49 6e 73 74 61 6e 63 65   */.int Instance
5eb0: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74  ObjCmd(ClientDat
5ec0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63  a clientData, Tc
5ed0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
5ee0: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f  , int objc, Tcl_
5ef0: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b  Obj *const objv[
5f00: 5d 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53  ]) {.    DigestS
5f10: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
5f20: 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 29   (DigestState *)
5f30: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20   clientData;.   
5f40: 20 69 6e 74 20 66 6e 2c 20 6c 65 6e 20 3d 20 30   int fn, len = 0
5f50: 3b 0a 20 20 20 20 63 68 61 72 20 2a 62 75 66 20  ;.    char *buf 
5f60: 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 69 66 20  = NULL;..    if 
5f70: 28 6f 62 6a 63 20 3c 20 32 20 7c 7c 20 6f 62 6a  (objc < 2 || obj
5f80: 63 20 3e 20 33 29 20 7b 0a 09 54 63 6c 5f 57 72  c > 3) {..Tcl_Wr
5f90: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
5fa0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 66 75 6e  p, 1, objv, "fun
5fb0: 63 74 69 6f 6e 20 3f 64 61 74 61 3f 22 29 3b 0a  ction ?data?");.
5fc0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
5fd0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
5fe0: 20 46 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20   Function */.   
5ff0: 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65   if (Tcl_GetInde
6000: 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  xFromObj(interp,
6010: 20 6f 62 6a 76 5b 31 5d 2c 20 69 6e 73 74 61 6e   objv[1], instan
6020: 63 65 5f 66 6e 73 2c 20 22 66 75 6e 63 74 69 6f  ce_fns, "functio
6030: 6e 22 2c 20 30 2c 20 26 66 6e 29 20 21 3d 20 54  n", 0, &fn) != T
6040: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e  CL_OK) {..return
6050: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
6060: 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 66 75 6e  }..    /* Do fun
6070: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 20  ction */.    if 
6080: 28 66 6e 29 20 7b 0a 09 2f 2a 20 55 70 64 61 74  (fn) {../* Updat
6090: 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20  e hash function 
60a0: 2a 2f 0a 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20  */..if (objc == 
60b0: 33 29 20 7b 0a 09 20 20 20 20 62 75 66 20 3d 20  3) {..    buf = 
60c0: 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
60d0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
60e0: 20 26 6c 65 6e 29 3b 0a 09 7d 20 65 6c 73 65 20   &len);..} else 
60f0: 7b 0a 09 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  {..    Tcl_Wrong
6100: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
6110: 31 2c 20 6f 62 6a 76 2c 20 22 75 70 64 61 74 65  1, objv, "update
6120: 20 64 61 74 61 22 29 3b 0a 09 20 20 20 20 72 65   data");..    re
6130: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6140: 09 7d 0a 0a 09 69 66 20 28 21 54 6c 73 5f 44 69  .}...if (!Tls_Di
6150: 67 65 73 74 55 70 64 61 74 65 28 73 74 61 74 65  gestUpdate(state
6160: 50 74 72 2c 20 62 75 66 2c 20 28 73 69 7a 65 5f  Ptr, buf, (size_
6170: 74 29 20 6c 65 6e 29 29 20 7b 0a 09 20 20 20 20  t) len)) {..    
6180: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
6190: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a  (interp, Tcl_Obj
61a0: 50 72 69 6e 74 66 28 22 44 69 67 65 73 74 20 75  Printf("Digest u
61b0: 70 64 61 74 65 20 66 61 69 6c 65 64 3a 20 25 73  pdate failed: %s
61c0: 22 2c 20 52 45 41 53 4f 4e 28 29 29 29 3b 0a 09  ", REASON()));..
61d0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
61e0: 52 52 4f 52 3b 0a 09 7d 0a 0a 20 20 20 20 7d 20  RROR;..}..    } 
61f0: 65 6c 73 65 20 7b 0a 09 2f 2a 20 46 69 6e 61 6c  else {../* Final
6200: 69 7a 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f  ize hash functio
6210: 6e 20 61 6e 64 20 63 61 6c 63 75 6c 61 74 65 20  n and calculate 
6220: 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20 2a  message digest *
6230: 2f 0a 09 69 66 20 28 54 6c 73 5f 44 69 67 65 73  /..if (Tls_Diges
6240: 74 46 69 6e 69 61 6c 69 7a 65 28 69 6e 74 65 72  tFinialize(inter
6250: 70 2c 20 73 74 61 74 65 50 74 72 29 20 21 3d 20  p, statePtr) != 
6260: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54  TCL_OK) {..    T
6270: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
6280: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50  interp, Tcl_ObjP
6290: 72 69 6e 74 66 28 22 44 69 67 65 73 74 20 66 69  rintf("Digest fi
62a0: 6e 61 6c 69 7a 65 20 66 61 69 6c 65 64 3a 20 25  nalize failed: %
62b0: 73 22 2c 20 52 45 41 53 4f 4e 28 29 29 29 3b 0a  s", REASON()));.
62c0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
62d0: 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 54 63 6c 5f  ERROR;..}...Tcl_
62e0: 44 65 6c 65 74 65 43 6f 6d 6d 61 6e 64 46 72 6f  DeleteCommandFro
62f0: 6d 54 6f 6b 65 6e 28 69 6e 74 65 72 70 2c 20 73  mToken(interp, s
6300: 74 61 74 65 50 74 72 2d 3e 74 6f 6b 65 6e 29 3b  tatePtr->token);
6310: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
6320: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
6330: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
6340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6370: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6e 73 74  -----. *. * Inst
6380: 61 6e 63 65 44 65 6c 43 61 6c 6c 62 61 63 6b 20  anceDelCallback 
6390: 2d 2d 0a 20 2a 0a 20 2a 09 20 43 61 6c 6c 62 61  --. *. *. Callba
63a0: 63 6b 20 74 6f 20 63 6c 65 61 6e 2d 75 70 20 77  ck to clean-up w
63b0: 68 65 6e 20 64 69 67 65 73 74 20 69 6e 73 74 61  hen digest insta
63c0: 6e 63 65 20 63 6f 6d 6d 61 6e 64 20 69 73 20 64  nce command is d
63d0: 65 6c 65 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 65  eleted.. *. * Re
63e0: 74 75 72 6e 73 3a 0a 20 2a 09 4e 6f 74 68 69 6e  turns:. *.Nothin
63f0: 67 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  g. *. * Side eff
6400: 65 63 74 73 3a 0a 20 2a 09 44 65 73 74 72 6f 79  ects:. *.Destroy
6410: 73 20 73 74 72 75 63 74 0a 20 2a 0a 20 2a 2d 2d  s struct. *. *--
6420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6460: 2d 0a 20 2a 2f 0a 76 6f 69 64 20 49 6e 73 74 61  -. */.void Insta
6470: 6e 63 65 44 65 6c 43 61 6c 6c 62 61 63 6b 28 43  nceDelCallback(C
6480: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
6490: 44 61 74 61 29 20 7b 0a 20 20 20 20 44 69 67 65  Data) {.    Dige
64a0: 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74  stState *statePt
64b0: 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 65  r = (DigestState
64c0: 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a   *) clientData;.
64d0: 0a 20 20 20 20 2f 2a 20 43 6c 65 61 6e 2d 75 70  .    /* Clean-up
64e0: 20 2a 2f 0a 20 20 20 20 54 6c 73 5f 44 69 67 65   */.    Tls_Dige
64f0: 73 74 46 72 65 65 28 73 74 61 74 65 50 74 72 29  stFree(statePtr)
6500: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
6550: 0a 20 2a 20 54 6c 73 5f 44 69 67 65 73 74 49 6e  . * Tls_DigestIn
6560: 73 74 61 6e 63 65 20 2d 2d 0a 20 2a 0a 20 2a 09  stance --. *. *.
6570: 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20   Create command 
6580: 74 6f 20 61 6c 6c 6f 77 20 75 73 65 72 20 74 6f  to allow user to
6590: 20 61 64 64 20 64 61 74 61 20 74 6f 20 68 61 73   add data to has
65a0: 68 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 0a 20  h function.. *. 
65b0: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43  * Returns:. *.TC
65c0: 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f  L_OK or TCL_ERRO
65d0: 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  R. *. * Side eff
65e0: 65 63 74 73 3a 0a 20 2a 09 43 72 65 61 74 65 73  ects:. *.Creates
65f0: 20 63 6f 6d 6d 61 6e 64 20 6f 72 20 65 72 72 6f   command or erro
6600: 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d  r message. *. *-
6610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6650: 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 54 6c 73 5f 44  --. */.int Tls_D
6660: 69 67 65 73 74 49 6e 73 74 61 6e 63 65 28 54 63  igestInstance(Tc
6670: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
6680: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 4f 62  , Tcl_Obj *cmdOb
6690: 6a 2c 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20  j, const EVP_MD 
66a0: 2a 6d 64 2c 20 69 6e 74 20 66 6f 72 6d 61 74 2c  *md, int format,
66b0: 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4f 62  ..Tcl_Obj *keyOb
66c0: 6a 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53  j) {.    DigestS
66d0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a  tate *statePtr;.
66e0: 20 20 20 20 63 68 61 72 20 2a 63 6d 64 4e 61 6d      char *cmdNam
66f0: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
6700: 67 46 72 6f 6d 4f 62 6a 28 63 6d 64 4f 62 6a 2c  gFromObj(cmdObj,
6710: 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20   NULL);..    /* 
6720: 43 72 65 61 74 65 20 73 74 72 75 63 74 20 2a 2f  Create struct */
6730: 0a 20 20 20 20 69 66 20 28 28 73 74 61 74 65 50  .    if ((stateP
6740: 74 72 20 3d 20 54 6c 73 5f 44 69 67 65 73 74 4e  tr = Tls_DigestN
6750: 65 77 28 69 6e 74 65 72 70 2c 20 66 6f 72 6d 61  ew(interp, forma
6760: 74 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  t)) == NULL) {..
6770: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
6780: 28 69 6e 74 65 72 70 2c 20 22 49 6e 69 74 69 61  (interp, "Initia
6790: 6c 69 7a 65 20 64 69 67 65 73 74 20 65 72 72 6f  lize digest erro
67a0: 72 3a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  r: memory alloca
67b0: 74 69 6f 6e 20 66 61 69 6c 75 72 65 22 2c 20 28  tion failure", (
67c0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
67d0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
67e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
67f0: 49 6e 69 74 69 61 6c 69 7a 65 20 68 61 73 68 20  Initialize hash 
6800: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  function */.    
6810: 69 66 20 28 54 6c 73 5f 44 69 67 65 73 74 49 6e  if (Tls_DigestIn
6820: 69 74 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  it(interp, state
6830: 50 74 72 2c 20 6d 64 2c 20 6b 65 79 4f 62 6a 29  Ptr, md, keyObj)
6840: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72   != TCL_OK) {..r
6850: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
6860: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
6870: 72 65 61 74 65 20 69 6e 73 74 61 6e 63 65 20 63  reate instance c
6880: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 73 74  ommand */.    st
6890: 61 74 65 50 74 72 2d 3e 74 6f 6b 65 6e 20 3d 20  atePtr->token = 
68a0: 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
68b0: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 63 6d 64  mand(interp, cmd
68c0: 4e 61 6d 65 2c 20 49 6e 73 74 61 6e 63 65 4f 62  Name, InstanceOb
68d0: 6a 43 6d 64 2c 0a 09 28 43 6c 69 65 6e 74 44 61  jCmd,..(ClientDa
68e0: 74 61 29 20 73 74 61 74 65 50 74 72 2c 20 49 6e  ta) statePtr, In
68f0: 73 74 61 6e 63 65 44 65 6c 43 61 6c 6c 62 61 63  stanceDelCallbac
6900: 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 74 75  k);..    /* Retu
6910: 72 6e 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20  rn command name 
6920: 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  */.    Tcl_SetOb
6930: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
6940: 63 6d 64 4f 62 6a 29 3b 0a 20 20 20 20 72 65 74  cmdObj);.    ret
6950: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
6960: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
6970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
69a0: 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  ****/../*. *----
69b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
69c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
69d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
69e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
69f0: 20 2a 0a 20 2a 20 54 6c 73 5f 44 69 67 65 73 74   *. * Tls_Digest
6a00: 44 61 74 61 20 2d 2d 0a 20 2a 0a 20 2a 09 20 43  Data --. *. *. C
6a10: 61 6c 63 75 6c 61 74 65 20 6d 65 73 73 61 67 65  alculate message
6a20: 20 64 69 67 65 73 74 20 75 73 69 6e 67 20 68 61   digest using ha
6a30: 73 68 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 0a  sh function.. *.
6a40: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54   * Returns:. *.T
6a50: 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52  CL_OK or TCL_ERR
6a60: 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  OR. *. * Side ef
6a70: 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 72  fects:. *.Sets r
6a80: 65 73 75 6c 74 20 74 6f 20 6d 65 73 73 61 67 65  esult to message
6a90: 20 64 69 67 65 73 74 20 6f 72 20 65 72 72 6f 72   digest or error
6aa0: 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d   message. *. *--
6ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6af0: 2d 0a 20 2a 2f 0a 69 6e 74 0a 54 6c 73 5f 44 69  -. */.int.Tls_Di
6b00: 67 65 73 74 44 61 74 61 28 54 63 6c 5f 49 6e 74  gestData(Tcl_Int
6b10: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
6b20: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
6b30: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 2c 0a 09 63  const objv[],..c
6b40: 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 2c  onst EVP_MD *md,
6b50: 20 69 6e 74 20 66 6f 72 6d 61 74 2c 20 54 63 6c   int format, Tcl
6b60: 5f 4f 62 6a 20 2a 6b 65 79 4f 62 6a 29 20 7b 0a  _Obj *keyObj) {.
6b70: 20 20 20 20 63 68 61 72 20 2a 64 61 74 61 3b 0a      char *data;.
6b80: 20 20 20 20 69 6e 74 20 6c 65 6e 2c 20 72 65 73      int len, res
6b90: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69  ;.    unsigned i
6ba0: 6e 74 20 6d 64 5f 6c 65 6e 3b 0a 20 20 20 20 75  nt md_len;.    u
6bb0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d 64 5f  nsigned char md_
6bc0: 62 75 66 5b 45 56 50 5f 4d 41 58 5f 4d 44 5f 53  buf[EVP_MAX_MD_S
6bd0: 49 5a 45 5d 3b 0a 0a 20 20 20 20 69 66 20 28 6f  IZE];..    if (o
6be0: 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c  bjc != 2) {..Tcl
6bf0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
6c00: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
6c10: 64 61 74 61 22 29 3b 0a 09 72 65 74 75 72 6e 20  data");..return 
6c20: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
6c30: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 64 61 74  ..    /* Get dat
6c40: 61 20 2a 2f 0a 20 20 20 20 64 61 74 61 20 3d 20  a */.    data = 
6c50: 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
6c60: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c  FromObj(objv[1],
6c70: 20 26 6c 65 6e 29 3b 0a 20 20 20 20 69 66 20 28   &len);.    if (
6c80: 64 61 74 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  data == NULL || 
6c90: 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 54 63 6c  len == 0) {..Tcl
6ca0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
6cb0: 70 2c 20 22 4e 6f 20 64 61 74 61 22 2c 20 4e 55  p, "No data", NU
6cc0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
6cd0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
6ce0: 20 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20     /* Calculate 
6cf0: 64 69 67 65 73 74 20 62 61 73 65 64 20 6f 6e 20  digest based on 
6d00: 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  hash function */
6d10: 0a 20 20 20 20 69 66 20 28 6b 65 79 4f 62 6a 20  .    if (keyObj 
6d20: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a 29 20 4e  == (Tcl_Obj *) N
6d30: 55 4c 4c 29 20 7b 0a 09 72 65 73 20 3d 20 45 56  ULL) {..res = EV
6d40: 50 5f 44 69 67 65 73 74 28 64 61 74 61 2c 20 28  P_Digest(data, (
6d50: 73 69 7a 65 5f 74 29 20 6c 65 6e 2c 20 6d 64 5f  size_t) len, md_
6d60: 62 75 66 2c 20 26 6d 64 5f 6c 65 6e 2c 20 6d 64  buf, &md_len, md
6d70: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 20 65  , NULL);.    } e
6d80: 6c 73 65 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20  lse {..unsigned 
6d90: 63 68 61 72 20 2a 6b 65 79 2c 20 2a 68 6d 61 63  char *key, *hmac
6da0: 20 3d 20 4e 55 4c 4c 3b 0a 09 69 6e 74 20 6b 65   = NULL;..int ke
6db0: 79 5f 6c 65 6e 3b 0a 0a 09 6b 65 79 20 3d 20 54  y_len;...key = T
6dc0: 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46  cl_GetByteArrayF
6dd0: 72 6f 6d 4f 62 6a 28 6b 65 79 4f 62 6a 2c 20 26  romObj(keyObj, &
6de0: 6b 65 79 5f 6c 65 6e 29 3b 0a 09 68 6d 61 63 20  key_len);..hmac 
6df0: 3d 20 48 4d 41 43 28 6d 64 2c 20 28 63 6f 6e 73  = HMAC(md, (cons
6e00: 74 20 76 6f 69 64 20 2a 29 20 6b 65 79 2c 20 6b  t void *) key, k
6e10: 65 79 5f 6c 65 6e 2c 20 28 63 6f 6e 73 74 20 75  ey_len, (const u
6e20: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
6e30: 64 61 74 61 2c 0a 09 20 20 20 20 28 73 69 7a 65  data,..    (size
6e40: 5f 74 29 20 6c 65 6e 2c 20 6d 64 5f 62 75 66 2c  _t) len, md_buf,
6e50: 20 26 6d 64 5f 6c 65 6e 29 3b 0a 09 72 65 73 20   &md_len);..res 
6e60: 3d 20 28 68 6d 61 63 20 21 3d 20 4e 55 4c 4c 29  = (hmac != NULL)
6e70: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
6e80: 4f 75 74 70 75 74 20 64 69 67 65 73 74 20 74 6f  Output digest to
6e90: 20 72 65 73 75 6c 74 20 70 65 72 20 66 6f 72 6d   result per form
6ea0: 61 74 20 28 62 69 6e 20 6f 72 20 68 65 78 29 20  at (bin or hex) 
6eb0: 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 73 29 20  */.    if (res) 
6ec0: 7b 0a 09 69 66 20 28 66 6f 72 6d 61 74 20 3d 3d  {..if (format ==
6ed0: 20 42 49 4e 5f 46 4f 52 4d 41 54 29 20 7b 0a 09   BIN_FORMAT) {..
6ee0: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
6ef0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
6f00: 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a  _NewByteArrayObj
6f10: 28 6d 64 5f 62 75 66 2c 20 6d 64 5f 6c 65 6e 29  (md_buf, md_len)
6f20: 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20  );...} else {.. 
6f30: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75     Tcl_Obj *resu
6f40: 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f  ltObj = Tcl_NewO
6f50: 62 6a 28 29 3b 0a 09 20 20 20 20 75 6e 73 69 67  bj();..    unsig
6f60: 6e 65 64 20 63 68 61 72 20 2a 70 74 72 20 3d 20  ned char *ptr = 
6f70: 54 63 6c 5f 53 65 74 42 79 74 65 41 72 72 61 79  Tcl_SetByteArray
6f80: 4c 65 6e 67 74 68 28 72 65 73 75 6c 74 4f 62 6a  Length(resultObj
6f90: 2c 20 6d 64 5f 6c 65 6e 2a 32 29 3b 0a 0a 09 20  , md_len*2);... 
6fa0: 20 20 20 66 6f 72 20 28 75 6e 73 69 67 6e 65 64     for (unsigned
6fb0: 20 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20   int i = 0; i < 
6fc0: 6d 64 5f 6c 65 6e 3b 20 69 2b 2b 29 20 7b 0a 09  md_len; i++) {..
6fd0: 09 2a 70 74 72 2b 2b 20 3d 20 68 65 78 5b 28 6d  .*ptr++ = hex[(m
6fe0: 64 5f 62 75 66 5b 69 5d 20 3e 3e 20 34 29 20 26  d_buf[i] >> 4) &
6ff0: 20 30 78 30 46 5d 3b 0a 09 09 2a 70 74 72 2b 2b   0x0F];...*ptr++
7000: 20 3d 20 68 65 78 5b 6d 64 5f 62 75 66 5b 69 5d   = hex[md_buf[i]
7010: 20 26 20 30 78 30 46 5d 3b 0a 09 20 20 20 20 7d   & 0x0F];..    }
7020: 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75  ..Tcl_SetObjResu
7030: 6c 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  lt(interp, resul
7040: 74 4f 62 6a 29 3b 0a 09 7d 0a 0a 20 20 20 20 7d  tObj);..}..    }
7050: 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 41 70 70   else {..Tcl_App
7060: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
7070: 2c 20 22 48 61 73 68 20 63 61 6c 63 75 6c 61 74  , "Hash calculat
7080: 69 6f 6e 20 65 72 72 6f 72 3a 22 2c 20 52 45 41  ion error:", REA
7090: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
70a0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
70b0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
70c0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
70d0: 4b 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  K;.}.../********
70e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
70f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
7120: 0a 20 2a 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 2d 2d 2d 2d  ----------------
7160: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67  ------. *. * Dig
7170: 65 73 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a  estObjCmd --. *.
7180: 20 2a 09 52 65 74 75 72 6e 20 6d 65 73 73 61 67   *.Return messag
7190: 65 20 64 69 67 65 73 74 20 75 73 69 6e 67 20 75  e digest using u
71a0: 73 65 72 20 73 70 65 63 69 66 69 65 64 20 68 61  ser specified ha
71b0: 73 68 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 0a  sh function.. *.
71c0: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54   * Returns:. *.T
71d0: 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52  CL_OK or TCL_ERR
71e0: 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  OR. *. * Side ef
71f0: 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 72  fects:. *.Sets r
7200: 65 73 75 6c 74 20 74 6f 20 6d 65 73 73 61 67 65  esult to message
7210: 20 64 69 67 65 73 74 20 6f 72 20 65 72 72 6f 72   digest or error
7220: 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d   message. *. *--
7230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7270: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
7280: 0a 44 69 67 65 73 74 4f 62 6a 43 6d 64 28 43 6c  .DigestObjCmd(Cl
7290: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
72a0: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
72b0: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
72c0: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
72d0: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
72e0: 69 6e 74 20 69 64 78 2c 20 6c 65 6e 2c 20 66 6f  int idx, len, fo
72f0: 72 6d 61 74 20 3d 20 48 45 58 5f 46 4f 52 4d 41  rmat = HEX_FORMA
7300: 54 2c 20 6b 65 79 5f 6c 65 6e 20 3d 20 30 2c 20  T, key_len = 0, 
7310: 64 61 74 61 5f 6c 65 6e 20 3d 20 30 2c 20 72 65  data_len = 0, re
7320: 73 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  s = TCL_ERROR;. 
7330: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64     const char *d
7340: 69 67 65 73 74 6e 61 6d 65 2c 20 2a 63 68 61 6e  igestname, *chan
7350: 6e 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  nel = NULL;.    
7360: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 4f 62 6a 20  Tcl_Obj *cmdObj 
7370: 3d 20 4e 55 4c 4c 2c 20 2a 64 61 74 61 4f 62 6a  = NULL, *dataObj
7380: 20 3d 20 4e 55 4c 4c 2c 20 2a 66 69 6c 65 4f 62   = NULL, *fileOb
7390: 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 6b 65 79 4f 62  j = NULL, *keyOb
73a0: 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e  j = NULL;.    un
73b0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79  signed char *key
73c0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 6f 6e   = NULL;.    con
73d0: 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 3b 0a 0a  st EVP_MD *md;..
73e0: 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73      Tcl_ResetRes
73f0: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 0a 20 20  ult(interp);..  
7400: 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 33 20 7c    if (objc < 3 |
7410: 7c 20 6f 62 6a 63 20 3e 20 37 29 20 7b 0a 09 54  | objc > 7) {..T
7420: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
7430: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
7440: 20 22 74 79 70 65 20 3f 2d 62 69 6e 7c 2d 68 65   "type ?-bin|-he
7450: 78 3f 20 3f 2d 6b 65 79 20 68 6d 61 63 5f 6b 65  x? ?-key hmac_ke
7460: 79 3f 20 5b 2d 63 68 61 6e 6e 65 6c 20 63 68 61  y? [-channel cha
7470: 6e 20 7c 20 2d 63 6f 6d 6d 61 6e 64 20 63 6d 64  n | -command cmd
7480: 4e 61 6d 65 20 7c 20 2d 66 69 6c 65 20 66 69 6c  Name | -file fil
7490: 65 6e 61 6d 65 20 7c 20 3f 2d 64 61 74 61 3f 20  ename | ?-data? 
74a0: 64 61 74 61 5d 22 29 3b 0a 09 72 65 74 75 72 6e  data]");..return
74b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
74c0: 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 64 69  }..    /* Get di
74d0: 67 65 73 74 20 2a 2f 0a 20 20 20 20 64 69 67 65  gest */.    dige
74e0: 73 74 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74  stname = Tcl_Get
74f0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
7500: 6a 76 5b 31 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20  jv[1], &len);.  
7510: 20 20 69 66 20 28 64 69 67 65 73 74 6e 61 6d 65    if (digestname
7520: 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 28 6d 64 20   == NULL || (md 
7530: 3d 20 45 56 50 5f 67 65 74 5f 64 69 67 65 73 74  = EVP_get_digest
7540: 62 79 6e 61 6d 65 28 64 69 67 65 73 74 6e 61 6d  byname(digestnam
7550: 65 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  e)) == NULL) {..
7560: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
7570: 28 69 6e 74 65 72 70 2c 20 22 49 6e 76 61 6c 69  (interp, "Invali
7580: 64 20 64 69 67 65 73 74 20 74 79 70 65 20 5c 22  d digest type \"
7590: 22 2c 20 64 69 67 65 73 74 6e 61 6d 65 2c 20 22  ", digestname, "
75a0: 5c 22 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  \"", NULL);..ret
75b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
75c0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 70 74     }..    /* Opt
75d0: 69 6d 61 6c 20 63 61 73 65 20 66 6f 72 20 62 6c  imal case for bl
75e0: 6f 62 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20  ob of data */.  
75f0: 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 33 29    if (objc == 3)
7600: 20 7b 0a 09 72 65 74 75 72 6e 20 54 6c 73 5f 44   {..return Tls_D
7610: 69 67 65 73 74 44 61 74 61 28 69 6e 74 65 72 70  igestData(interp
7620: 2c 20 2d 2d 6f 62 6a 63 2c 20 2b 2b 6f 62 6a 76  , --objc, ++objv
7630: 2c 20 6d 64 2c 20 66 6f 72 6d 61 74 2c 20 4e 55  , md, format, NU
7640: 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  LL);.    }..    
7650: 2f 2a 20 47 65 74 20 6f 70 74 69 6f 6e 73 20 2a  /* Get options *
7660: 2f 0a 20 20 20 20 66 6f 72 20 28 69 64 78 20 3d  /.    for (idx =
7670: 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63 2d 31   2; idx < objc-1
7680: 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 63 68 61 72  ; idx++) {..char
7690: 20 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53   *opt = Tcl_GetS
76a0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
76b0: 76 5b 69 64 78 5d 2c 20 4e 55 4c 4c 29 3b 0a 0a  v[idx], NULL);..
76c0: 09 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27  .if (opt[0] != '
76d0: 2d 27 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  -')..    break;.
76e0: 0a 09 4f 50 54 46 4c 41 47 28 22 2d 62 69 6e 22  ..OPTFLAG("-bin"
76f0: 2c 20 66 6f 72 6d 61 74 2c 20 42 49 4e 5f 46 4f  , format, BIN_FO
7700: 52 4d 41 54 29 3b 0a 09 4f 50 54 46 4c 41 47 28  RMAT);..OPTFLAG(
7710: 22 2d 62 69 6e 61 72 79 22 2c 20 66 6f 72 6d 61  "-binary", forma
7720: 74 2c 20 42 49 4e 5f 46 4f 52 4d 41 54 29 3b 0a  t, BIN_FORMAT);.
7730: 09 4f 50 54 46 4c 41 47 28 22 2d 68 65 78 22 2c  .OPTFLAG("-hex",
7740: 20 66 6f 72 6d 61 74 2c 20 48 45 58 5f 46 4f 52   format, HEX_FOR
7750: 4d 41 54 29 3b 0a 09 4f 50 54 46 4c 41 47 28 22  MAT);..OPTFLAG("
7760: 2d 68 65 78 61 64 65 63 69 6d 61 6c 22 2c 20 66  -hexadecimal", f
7770: 6f 72 6d 61 74 2c 20 48 45 58 5f 46 4f 52 4d 41  ormat, HEX_FORMA
7780: 54 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 64 61  T);..OPTOBJ("-da
7790: 74 61 22 2c 20 64 61 74 61 4f 62 6a 29 3b 0a 09  ta", dataObj);..
77a0: 4f 50 54 53 54 52 28 22 2d 63 68 61 6e 22 2c 20  OPTSTR("-chan", 
77b0: 63 68 61 6e 6e 65 6c 29 3b 0a 09 4f 50 54 53 54  channel);..OPTST
77c0: 52 28 22 2d 63 68 61 6e 6e 65 6c 22 2c 20 63 68  R("-channel", ch
77d0: 61 6e 6e 65 6c 29 3b 0a 09 4f 50 54 4f 42 4a 28  annel);..OPTOBJ(
77e0: 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 63 6d 64 4f  "-command", cmdO
77f0: 62 6a 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 66  bj);..OPTOBJ("-f
7800: 69 6c 65 22 2c 20 66 69 6c 65 4f 62 6a 29 3b 0a  ile", fileObj);.
7810: 09 4f 50 54 4f 42 4a 28 22 2d 66 69 6c 65 6e 61  .OPTOBJ("-filena
7820: 6d 65 22 2c 20 66 69 6c 65 4f 62 6a 29 3b 0a 09  me", fileObj);..
7830: 4f 50 54 4f 42 4a 28 22 2d 6b 65 79 22 2c 20 6b  OPTOBJ("-key", k
7840: 65 79 4f 62 6a 29 3b 0a 0a 09 4f 50 54 42 41 44  eyObj);...OPTBAD
7850: 28 22 6f 70 74 69 6f 6e 22 2c 20 22 2d 62 69 6e  ("option", "-bin
7860: 2c 20 2d 63 68 61 6e 6e 65 6c 2c 20 2d 63 6f 6d  , -channel, -com
7870: 6d 61 6e 64 2c 20 2d 64 61 74 61 2c 20 2d 66 69  mand, -data, -fi
7880: 6c 65 2c 20 2d 66 69 6c 65 6e 61 6d 65 2c 20 2d  le, -filename, -
7890: 68 65 78 2c 20 6f 72 20 2d 6b 65 79 22 29 3b 0a  hex, or -key");.
78a0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
78b0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
78c0: 20 49 66 20 6e 6f 20 6f 70 74 69 6f 6e 20 66 6f   If no option fo
78d0: 72 20 6c 61 73 74 20 61 72 67 2c 20 74 68 65 6e  r last arg, then
78e0: 20 69 74 73 20 74 68 65 20 64 61 74 61 20 2a 2f   its the data */
78f0: 0a 20 20 20 20 69 66 20 28 69 64 78 20 3c 20 6f  .    if (idx < o
7900: 62 6a 63 29 20 7b 0a 09 64 61 74 61 4f 62 6a 20  bjc) {..dataObj 
7910: 3d 20 6f 62 6a 76 5b 69 64 78 5d 3b 0a 20 20 20  = objv[idx];.   
7920: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 63 20   }..    /* Calc 
7930: 64 69 67 65 73 74 20 6f 6e 20 66 69 6c 65 2c 20  digest on file, 
7940: 73 74 61 63 6b 65 64 20 63 68 61 6e 6e 65 6c 2c  stacked channel,
7950: 20 6f 72 20 64 61 74 61 20 62 6c 6f 62 20 2a 2f   or data blob */
7960: 0a 20 20 20 20 69 66 20 28 66 69 6c 65 4f 62 6a  .    if (fileObj
7970: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73   != NULL) {..res
7980: 20 3d 20 54 6c 73 5f 44 69 67 65 73 74 46 69 6c   = Tls_DigestFil
7990: 65 28 69 6e 74 65 72 70 2c 20 66 69 6c 65 4f 62  e(interp, fileOb
79a0: 6a 2c 20 6d 64 2c 20 66 6f 72 6d 61 74 2c 20 6b  j, md, format, k
79b0: 65 79 4f 62 6a 29 3b 0a 20 20 20 20 7d 20 65 6c  eyObj);.    } el
79c0: 73 65 20 69 66 20 28 63 68 61 6e 6e 65 6c 20 21  se if (channel !
79d0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 20 3d  = NULL) {..res =
79e0: 20 54 6c 73 5f 44 69 67 65 73 74 43 68 61 6e 6e   Tls_DigestChann
79f0: 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 6e  el(interp, chann
7a00: 65 6c 2c 20 6d 64 2c 20 66 6f 72 6d 61 74 2c 20  el, md, format, 
7a10: 6b 65 79 4f 62 6a 29 3b 0a 20 20 20 20 7d 20 65  keyObj);.    } e
7a20: 6c 73 65 20 69 66 20 28 63 6d 64 4f 62 6a 20 21  lse if (cmdObj !
7a30: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 20 3d  = NULL) {..res =
7a40: 20 54 6c 73 5f 44 69 67 65 73 74 49 6e 73 74 61   Tls_DigestInsta
7a50: 6e 63 65 28 69 6e 74 65 72 70 2c 20 63 6d 64 4f  nce(interp, cmdO
7a60: 62 6a 2c 20 6d 64 2c 20 66 6f 72 6d 61 74 2c 20  bj, md, format, 
7a70: 6b 65 79 4f 62 6a 29 3b 0a 20 20 20 20 7d 20 65  keyObj);.    } e
7a80: 6c 73 65 20 69 66 20 28 64 61 74 61 4f 62 6a 20  lse if (dataObj 
7a90: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f  != NULL) {..Tcl_
7aa0: 4f 62 6a 20 2a 6f 62 6a 73 5b 32 5d 3b 0a 09 6f  Obj *objs[2];..o
7ab0: 62 6a 73 5b 30 5d 20 3d 20 4e 55 4c 4c 3b 0a 09  bjs[0] = NULL;..
7ac0: 6f 62 6a 73 5b 31 5d 20 3d 20 64 61 74 61 4f 62  objs[1] = dataOb
7ad0: 6a 3b 0a 09 72 65 73 20 3d 20 54 6c 73 5f 44 69  j;..res = Tls_Di
7ae0: 67 65 73 74 44 61 74 61 28 69 6e 74 65 72 70 2c  gestData(interp,
7af0: 20 32 2c 20 6f 62 6a 73 2c 20 6d 64 2c 20 66 6f   2, objs, md, fo
7b00: 72 6d 61 74 2c 20 6b 65 79 4f 62 6a 29 3b 0a 20  rmat, keyObj);. 
7b10: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
7b20: 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  res;.}../*. *---
7b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7b70: 0a 20 2a 0a 20 2a 20 4d 65 73 73 61 67 65 20 44  . *. * Message D
7b80: 69 67 65 73 74 20 43 6f 6e 76 65 6e 69 65 6e 63  igest Convenienc
7b90: 65 20 43 6f 6d 6d 61 6e 64 73 20 2d 2d 0a 20 2a  e Commands --. *
7ba0: 0a 20 2a 09 43 6f 6e 76 65 6e 69 65 6e 63 65 20  . *.Convenience 
7bb0: 63 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 6d 65 73  commands for mes
7bc0: 73 61 67 65 20 64 69 67 65 73 74 73 2e 0a 20 2a  sage digests.. *
7bd0: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09  . * Returns:. *.
7be0: 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52  TCL_OK or TCL_ER
7bf0: 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ROR. *. * Side e
7c00: 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20  ffects:. *.Sets 
7c10: 72 65 73 75 6c 74 20 74 6f 20 6d 65 73 73 61 67  result to messag
7c20: 65 20 64 69 67 65 73 74 20 6f 72 20 65 72 72 6f  e digest or erro
7c30: 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d  r message. *. *-
7c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c80: 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73  --. */.int Diges
7c90: 74 4d 44 34 43 6d 64 28 43 6c 69 65 6e 74 44 61  tMD4Cmd(ClientDa
7ca0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
7cb0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
7cc0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
7cd0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
7ce0: 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  []) {.    return
7cf0: 20 54 6c 73 5f 44 69 67 65 73 74 44 61 74 61 28   Tls_DigestData(
7d00: 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62  interp, objc, ob
7d10: 6a 76 2c 20 45 56 50 5f 6d 64 34 28 29 2c 20 48  jv, EVP_md4(), H
7d20: 45 58 5f 46 4f 52 4d 41 54 2c 20 4e 55 4c 4c 29  EX_FORMAT, NULL)
7d30: 3b 0a 7d 0a 0a 69 6e 74 20 44 69 67 65 73 74 4d  ;.}..int DigestM
7d40: 44 35 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  D5Cmd(ClientData
7d50: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
7d60: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
7d70: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
7d80: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
7d90: 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ) {.    return T
7da0: 6c 73 5f 44 69 67 65 73 74 44 61 74 61 28 69 6e  ls_DigestData(in
7db0: 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76  terp, objc, objv
7dc0: 2c 20 45 56 50 5f 6d 64 35 28 29 2c 20 48 45 58  , EVP_md5(), HEX
7dd0: 5f 46 4f 52 4d 41 54 2c 20 4e 55 4c 4c 29 3b 0a  _FORMAT, NULL);.
7de0: 7d 0a 0a 69 6e 74 20 44 69 67 65 73 74 53 48 41  }..int DigestSHA
7df0: 31 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20  1Cmd(ClientData 
7e00: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f  clientData, Tcl_
7e10: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
7e20: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
7e30: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j *const objv[])
7e40: 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 6c   {.    return Tl
7e50: 73 5f 44 69 67 65 73 74 44 61 74 61 28 69 6e 74  s_DigestData(int
7e60: 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c  erp, objc, objv,
7e70: 20 45 56 50 5f 73 68 61 31 28 29 2c 20 48 45 58   EVP_sha1(), HEX
7e80: 5f 46 4f 52 4d 41 54 2c 20 4e 55 4c 4c 29 3b 0a  _FORMAT, NULL);.
7e90: 7d 0a 0a 69 6e 74 20 44 69 67 65 73 74 53 48 41  }..int DigestSHA
7ea0: 32 35 36 43 6d 64 28 43 6c 69 65 6e 74 44 61 74  256Cmd(ClientDat
7eb0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63  a clientData, Tc
7ec0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
7ed0: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f  , int objc, Tcl_
7ee0: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b  Obj *const objv[
7ef0: 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ]) {.    return 
7f00: 54 6c 73 5f 44 69 67 65 73 74 44 61 74 61 28 69  Tls_DigestData(i
7f10: 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a  nterp, objc, obj
7f20: 76 2c 20 45 56 50 5f 73 68 61 32 35 36 28 29 2c  v, EVP_sha256(),
7f30: 20 48 45 58 5f 46 4f 52 4d 41 54 2c 20 4e 55 4c   HEX_FORMAT, NUL
7f40: 4c 29 3b 0a 7d 0a 0a 69 6e 74 20 44 69 67 65 73  L);.}..int Diges
7f50: 74 53 48 41 35 31 32 43 6d 64 28 43 6c 69 65 6e  tSHA512Cmd(Clien
7f60: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
7f70: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
7f80: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
7f90: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
7fa0: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74  bjv[]) {.    ret
7fb0: 75 72 6e 20 54 6c 73 5f 44 69 67 65 73 74 44 61  urn Tls_DigestDa
7fc0: 74 61 28 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c  ta(interp, objc,
7fd0: 20 6f 62 6a 76 2c 20 45 56 50 5f 73 68 61 35 31   objv, EVP_sha51
7fe0: 32 28 29 2c 20 48 45 58 5f 46 4f 52 4d 41 54 2c  2(), HEX_FORMAT,
7ff0: 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a   NULL);.}../*. *
8000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8040: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 44 69  ---. *. * Tls_Di
8050: 67 65 73 74 43 6f 6d 6d 61 6e 64 73 20 2d 2d 0a  gestCommands --.
8060: 20 2a 0a 20 2a 09 43 72 65 61 74 65 20 64 69 67   *. *.Create dig
8070: 65 73 74 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a  est commands. *.
8080: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54   * Returns:. *.T
8090: 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52  CL_OK or TCL_ERR
80a0: 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  OR. *. * Side ef
80b0: 66 65 63 74 73 3a 0a 20 2a 09 43 72 65 61 74 65  fects:. *.Create
80c0: 73 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a  s commands. *. *
80d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
80e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
80f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8110: 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 54 6c 73 5f  ---. */.int Tls_
8120: 44 69 67 65 73 74 43 6f 6d 6d 61 6e 64 73 28 54  DigestCommands(T
8130: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
8140: 70 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65  p) {.    Tcl_Cre
8150: 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
8160: 74 65 72 70 2c 20 22 74 6c 73 3a 3a 64 69 67 65  terp, "tls::dige
8170: 73 74 22 2c 20 44 69 67 65 73 74 4f 62 6a 43 6d  st", DigestObjCm
8180: 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  d, (ClientData) 
8190: 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  0, (Tcl_CmdDelet
81a0: 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
81b0: 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
81c0: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
81d0: 20 22 74 6c 73 3a 3a 6d 64 34 22 2c 20 44 69 67   "tls::md4", Dig
81e0: 65 73 74 4d 44 34 43 6d 64 2c 20 28 43 6c 69 65  estMD4Cmd, (Clie
81f0: 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f  ntData) 0, (Tcl_
8200: 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
8210: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f   NULL);.    Tcl_
8220: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
8230: 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d  (interp, "tls::m
8240: 64 35 22 2c 20 44 69 67 65 73 74 4d 44 35 43 6d  d5", DigestMD5Cm
8250: 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  d, (ClientData) 
8260: 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  0, (Tcl_CmdDelet
8270: 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
8280: 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
8290: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
82a0: 20 22 74 6c 73 3a 3a 73 68 61 31 22 2c 20 44 69   "tls::sha1", Di
82b0: 67 65 73 74 53 48 41 31 43 6d 64 2c 20 28 43 6c  gestSHA1Cmd, (Cl
82c0: 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63  ientData) 0, (Tc
82d0: 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
82e0: 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63  *) NULL);.    Tc
82f0: 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
8300: 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a  nd(interp, "tls:
8310: 3a 73 68 61 32 35 36 22 2c 20 44 69 67 65 73 74  :sha256", Digest
8320: 53 48 41 32 35 36 43 6d 64 2c 20 28 43 6c 69 65  SHA256Cmd, (Clie
8330: 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f  ntData) 0, (Tcl_
8340: 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
8350: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f   NULL);.    Tcl_
8360: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
8370: 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73  (interp, "tls::s
8380: 68 61 35 31 32 22 2c 20 44 69 67 65 73 74 53 48  ha512", DigestSH
8390: 41 35 31 32 43 6d 64 2c 20 28 43 6c 69 65 6e 74  A512Cmd, (Client
83a0: 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d  Data) 0, (Tcl_Cm
83b0: 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
83c0: 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72  ULL);.    Tcl_Cr
83d0: 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
83e0: 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 75 6e 73  nterp, "tls::uns
83f0: 74 61 63 6b 22 2c 20 55 6e 73 74 61 63 6b 4f 62  tack", UnstackOb
8400: 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74  jCmd, (ClientDat
8410: 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65  a) 0, (Tcl_CmdDe
8420: 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c  leteProc *) NULL
8430: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
8440: 4c 5f 4f 4b 3b 0a 7d 0a 0a                       L_OK;.}..