Hex Artifact Content

Artifact f6606c060c32cdac1de2a68ec7281e2497d7ddcd4e85106c6e32c814ac487b7b:


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 7d 20  AC Context */.} 
03f0: 44 69 67 65 73 74 53 74 61 74 65 3b 0a 0a 2f 2a  DigestState;../*
0400: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
0410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0440: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67  ------. *. * Dig
0450: 65 73 74 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a  estFree --. *. *
0460: 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20  .This procedure 
0470: 72 65 6d 6f 76 65 73 20 61 20 64 69 67 65 73 74  removes a digest
0480: 20 73 74 61 74 65 20 73 74 72 75 63 74 75 72 65   state structure
0490: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a  . *. * Returns:.
04a0: 20 2a 09 4e 6f 74 68 69 6e 67 0a 20 2a 0a 20 2a   *.Nothing. *. *
04b0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
04c0: 2a 09 52 65 6d 6f 76 65 73 20 73 74 72 75 63 74  *.Removes struct
04d0: 75 72 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ure. *. *-------
04e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
04f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
0520: 0a 76 6f 69 64 20 44 69 67 65 73 74 46 72 65 65  .void DigestFree
0530: 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 73   (DigestState *s
0540: 74 61 74 65 50 74 72 29 20 7b 0a 20 20 20 20 69  tatePtr) {.    i
0550: 66 20 28 73 74 61 74 65 50 74 72 20 3d 3d 20 28  f (statePtr == (
0560: 44 69 67 65 73 74 53 74 61 74 65 20 2a 29 20 4e  DigestState *) N
0570: 55 4c 4c 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  ULL) return;..  
0580: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
0590: 63 74 78 20 21 3d 20 28 45 56 50 5f 4d 44 5f 43  ctx != (EVP_MD_C
05a0: 54 58 20 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 45  TX *) NULL) {..E
05b0: 56 50 5f 4d 44 5f 43 54 58 5f 66 72 65 65 28 73  VP_MD_CTX_free(s
05c0: 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20  tatePtr->ctx);. 
05d0: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61     }.    if (sta
05e0: 74 65 50 74 72 2d 3e 68 63 74 78 20 21 3d 20 28  tePtr->hctx != (
05f0: 48 4d 41 43 5f 43 54 58 20 2a 29 20 4e 55 4c 4c  HMAC_CTX *) NULL
0600: 29 20 7b 0a 09 48 4d 41 43 5f 43 54 58 5f 66 72  ) {..HMAC_CTX_fr
0610: 65 65 28 73 74 61 74 65 50 74 72 2d 3e 68 63 74  ee(statePtr->hct
0620: 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6b  x);.    }.    ck
0630: 66 72 65 65 28 73 74 61 74 65 50 74 72 29 3b 0a  free(statePtr);.
0640: 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../************
0650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0680: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d  *******/../*. *-
0690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06d0: 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 46  --. *. * DigestF
06e0: 69 6c 65 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74  ile --. *. *.Ret
06f0: 75 72 6e 20 6d 65 73 73 61 67 65 20 64 69 67 65  urn message dige
0700: 73 74 20 66 6f 72 20 66 69 6c 65 20 75 73 69 6e  st for file usin
0710: 67 20 75 73 65 72 20 73 70 65 63 69 66 69 65 64  g user specified
0720: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 0a   hash function..
0730: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20   *. * Returns:. 
0740: 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f  *.TCL_OK or TCL_
0750: 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65  ERROR. *. * Side
0760: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 52 65 73   effects:. *.Res
0770: 75 6c 74 20 69 73 20 6d 65 73 73 61 67 65 20 64  ult is message d
0780: 69 67 65 73 74 20 6f 72 20 65 72 72 6f 72 20 6d  igest or error m
0790: 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d  essage. *. *----
07a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
07e0: 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 46 69   */.int DigestFi
07f0: 6c 65 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  le(Tcl_Interp *i
0800: 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a  nterp, Tcl_Obj *
0810: 66 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20  filename, const 
0820: 45 56 50 5f 4d 44 20 2a 6d 64 2c 20 69 6e 74 20  EVP_MD *md, int 
0830: 66 6f 72 6d 61 74 2c 0a 09 54 63 6c 5f 4f 62 6a  format,..Tcl_Obj
0840: 20 2a 6b 65 79 4f 62 6a 29 20 7b 0a 20 20 20 20   *keyObj) {.    
0850: 45 56 50 5f 4d 44 5f 43 54 58 20 2a 63 74 78 20  EVP_MD_CTX *ctx 
0860: 3d 20 28 45 56 50 5f 4d 44 5f 43 54 58 20 2a 29  = (EVP_MD_CTX *)
0870: 20 4e 55 4c 4c 3b 0a 20 20 20 20 48 4d 41 43 5f   NULL;.    HMAC_
0880: 43 54 58 20 2a 68 63 74 78 20 3d 20 28 48 4d 41  CTX *hctx = (HMA
0890: 43 5f 43 54 58 20 2a 29 20 4e 55 4c 4c 3b 0a 20  C_CTX *) NULL;. 
08a0: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63     Tcl_Channel c
08b0: 68 61 6e 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  han;.    unsigne
08c0: 64 20 63 68 61 72 20 62 75 66 5b 42 55 46 46 45  d char buf[BUFFE
08d0: 52 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 75 6e 73  R_SIZE];.    uns
08e0: 69 67 6e 65 64 20 63 68 61 72 20 6d 64 5f 62 75  igned char md_bu
08f0: 66 5b 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a  f[EVP_MAX_MD_SIZ
0900: 45 5d 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  E];.    unsigned
0910: 20 69 6e 74 20 6d 64 5f 6c 65 6e 3b 0a 20 20 20   int md_len;.   
0920: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
0930: 6b 65 79 3b 0a 20 20 20 20 69 6e 74 20 6b 65 79  key;.    int key
0940: 5f 6c 65 6e 2c 20 72 65 73 3b 0a 0a 20 20 20 20  _len, res;..    
0950: 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 63 68 61  /* Open file cha
0960: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e  nnel */.    chan
0970: 20 3d 20 54 63 6c 5f 46 53 4f 70 65 6e 46 69 6c   = Tcl_FSOpenFil
0980: 65 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c  eChannel(interp,
0990: 20 66 69 6c 65 6e 61 6d 65 2c 20 22 72 62 22 2c   filename, "rb",
09a0: 20 30 34 34 34 29 3b 0a 20 20 20 20 69 66 20 28   0444);.    if (
09b0: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61  chan == (Tcl_Cha
09c0: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72  nnel) NULL) {..r
09d0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
09e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
09f0: 6f 6e 66 69 67 75 72 65 20 63 68 61 6e 6e 65 6c  onfigure channel
0a00: 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f   */.    if (Tcl_
0a10: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  SetChannelOption
0a20: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22  (interp, chan, "
0a30: 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22  -translation", "
0a40: 62 69 6e 61 72 79 22 29 20 3d 3d 20 54 43 4c 5f  binary") == TCL_
0a50: 45 52 52 4f 52 29 20 7b 0a 09 67 6f 74 6f 20 65  ERROR) {..goto e
0a60: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
0a70: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 42 75  Tcl_SetChannelBu
0a80: 66 66 65 72 53 69 7a 65 28 63 68 61 6e 2c 20 42  fferSize(chan, B
0a90: 55 46 46 45 52 5f 53 49 5a 45 29 3b 0a 0a 20 20  UFFER_SIZE);..  
0aa0: 20 20 2f 2a 20 43 72 65 61 74 65 20 6d 65 73 73    /* Create mess
0ab0: 61 67 65 20 64 69 67 65 73 74 20 63 6f 6e 74 65  age digest conte
0ac0: 78 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 6b 65  xt */.    if (ke
0ad0: 79 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  yObj == NULL) {.
0ae0: 09 63 74 78 20 3d 20 45 56 50 5f 4d 44 5f 43 54  .ctx = EVP_MD_CT
0af0: 58 5f 6e 65 77 28 29 3b 0a 09 72 65 73 20 3d 20  X_new();..res = 
0b00: 28 63 74 78 20 21 3d 20 4e 55 4c 4c 29 3b 0a 20  (ctx != NULL);. 
0b10: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 68 63 74     } else {..hct
0b20: 78 20 3d 20 48 4d 41 43 5f 43 54 58 5f 6e 65 77  x = HMAC_CTX_new
0b30: 28 29 3b 0a 09 72 65 73 20 3d 20 28 68 63 74 78  ();..res = (hctx
0b40: 20 21 3d 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d   != NULL);.    }
0b50: 0a 20 20 20 20 69 66 20 28 21 72 65 73 29 20 7b  .    if (!res) {
0b60: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
0b70: 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 72 65 61  lt(interp, "Crea
0b80: 74 65 20 64 69 67 65 73 74 20 63 6f 6e 74 65 78  te digest contex
0b90: 74 20 66 61 69 6c 65 64 3a 20 22 2c 20 52 45 41  t failed: ", REA
0ba0: 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 67  SON(), NULL);..g
0bb0: 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 7d  oto error;.    }
0bc0: 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  ..    /* Initial
0bd0: 69 7a 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f  ize hash functio
0be0: 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 6b 65 79  n */.    if (key
0bf0: 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Obj == NULL) {..
0c00: 72 65 73 20 3d 20 45 56 50 5f 44 69 67 65 73 74  res = EVP_Digest
0c10: 49 6e 69 74 5f 65 78 28 63 74 78 2c 20 6d 64 2c  Init_ex(ctx, md,
0c20: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 20 65 6c   NULL);.    } el
0c30: 73 65 20 7b 0a 09 6b 65 79 20 3d 20 54 63 6c 5f  se {..key = Tcl_
0c40: 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
0c50: 4f 62 6a 28 6b 65 79 4f 62 6a 2c 20 26 6b 65 79  Obj(keyObj, &key
0c60: 5f 6c 65 6e 29 3b 0a 09 72 65 73 20 3d 20 48 4d  _len);..res = HM
0c70: 41 43 5f 49 6e 69 74 5f 65 78 28 68 63 74 78 2c  AC_Init_ex(hctx,
0c80: 20 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 29 20   (const void *) 
0c90: 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 2c 20 6d 64  key, key_len, md
0ca0: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20  , NULL);.    }. 
0cb0: 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 0a 09     if (!res) {..
0cc0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
0cd0: 28 69 6e 74 65 72 70 2c 20 22 49 6e 69 74 69 61  (interp, "Initia
0ce0: 6c 69 7a 65 20 64 69 67 65 73 74 20 66 61 69 6c  lize digest fail
0cf0: 65 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c  ed: ", REASON(),
0d00: 20 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65 72   NULL);..goto er
0d10: 72 6f 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ror;.    }..    
0d20: 2f 2a 20 52 65 61 64 20 66 69 6c 65 20 64 61 74  /* Read file dat
0d30: 61 20 61 6e 64 20 75 70 64 61 74 65 20 68 61 73  a and update has
0d40: 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  h function */.  
0d50: 20 20 77 68 69 6c 65 20 28 21 54 63 6c 5f 45 6f    while (!Tcl_Eo
0d60: 66 28 63 68 61 6e 29 29 20 7b 0a 09 69 6e 74 20  f(chan)) {..int 
0d70: 6c 65 6e 20 3d 20 54 63 6c 5f 52 65 61 64 52 61  len = Tcl_ReadRa
0d80: 77 28 63 68 61 6e 2c 20 28 63 68 61 72 20 2a 29  w(chan, (char *)
0d90: 20 62 75 66 2c 20 42 55 46 46 45 52 5f 53 49 5a   buf, BUFFER_SIZ
0da0: 45 29 3b 0a 09 69 66 20 28 6c 65 6e 20 3e 20 30  E);..if (len > 0
0db0: 29 20 7b 0a 09 20 20 20 20 69 66 20 28 6b 65 79  ) {..    if (key
0dc0: 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Obj == NULL) {..
0dd0: 09 72 65 73 20 3d 20 45 56 50 5f 44 69 67 65 73  .res = EVP_Diges
0de0: 74 55 70 64 61 74 65 28 63 74 78 2c 20 26 62 75  tUpdate(ctx, &bu
0df0: 66 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29  f, (size_t) len)
0e00: 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  ;..    } else {.
0e10: 09 09 72 65 73 20 3d 20 48 4d 41 43 5f 55 70 64  ..res = HMAC_Upd
0e20: 61 74 65 28 68 63 74 78 2c 20 26 62 75 66 5b 30  ate(hctx, &buf[0
0e30: 5d 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29  ], (size_t) len)
0e40: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 69 66  ;..    }..    if
0e50: 20 28 21 72 65 73 29 20 7b 0a 09 09 54 63 6c 5f   (!res) {...Tcl_
0e60: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
0e70: 65 72 70 2c 20 22 55 70 64 61 74 65 20 64 69 67  erp, "Update dig
0e80: 65 73 74 20 66 61 69 6c 65 64 3a 20 22 2c 20 52  est failed: ", R
0e90: 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a  EASON(), NULL);.
0ea0: 09 09 72 65 73 20 3d 20 54 43 4c 5f 45 52 52 4f  ..res = TCL_ERRO
0eb0: 52 3b 0a 09 09 67 6f 74 6f 20 65 72 72 6f 72 3b  R;...goto error;
0ec0: 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d  ..    }..}.    }
0ed0: 0a 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20 63  ..    /* Close c
0ee0: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66  hannel */.    if
0ef0: 20 28 54 63 6c 5f 43 6c 6f 73 65 28 69 6e 74 65   (Tcl_Close(inte
0f00: 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54 43 4c  rp, chan) == TCL
0f10: 5f 45 52 52 4f 52 29 20 7b 0a 09 63 68 61 6e 20  _ERROR) {..chan 
0f20: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
0f30: 4e 55 4c 4c 3b 0a 09 67 6f 74 6f 20 65 72 72 6f  NULL;..goto erro
0f40: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 68 61  r;.    }.    cha
0f50: 6e 20 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c  n = (Tcl_Channel
0f60: 29 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20  ) NULL;..    /* 
0f70: 46 69 6e 61 6c 69 7a 65 20 68 61 73 68 20 66 75  Finalize hash fu
0f80: 6e 63 74 69 6f 6e 20 61 6e 64 20 63 61 6c 63 75  nction and calcu
0f90: 6c 61 74 65 20 6d 65 73 73 61 67 65 20 64 69 67  late message dig
0fa0: 65 73 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 6b  est */.    if (k
0fb0: 65 79 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b  eyObj == NULL) {
0fc0: 0a 09 72 65 73 20 3d 20 45 56 50 5f 44 69 67 65  ..res = EVP_Dige
0fd0: 73 74 46 69 6e 61 6c 5f 65 78 28 63 74 78 2c 20  stFinal_ex(ctx, 
0fe0: 6d 64 5f 62 75 66 2c 20 26 6d 64 5f 6c 65 6e 29  md_buf, &md_len)
0ff0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
1000: 72 65 73 20 3d 20 48 4d 41 43 5f 46 69 6e 61 6c  res = HMAC_Final
1010: 28 68 63 74 78 2c 20 6d 64 5f 62 75 66 2c 20 26  (hctx, md_buf, &
1020: 6d 64 5f 6c 65 6e 29 3b 0a 20 20 20 20 7d 0a 20  md_len);.    }. 
1030: 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 0a 09     if (!res) {..
1040: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1050: 28 69 6e 74 65 72 70 2c 20 22 46 69 6e 61 6c 69  (interp, "Finali
1060: 7a 65 20 64 69 67 65 73 74 20 66 61 69 6c 65 64  ze digest failed
1070: 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e  : ", REASON(), N
1080: 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65 72 72 6f  ULL);..goto erro
1090: 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  r;.    }..    /*
10a0: 20 44 6f 6e 65 20 77 69 74 68 20 73 74 72 75 63   Done with struc
10b0: 74 20 2a 2f 0a 20 20 20 20 45 56 50 5f 4d 44 5f  t */.    EVP_MD_
10c0: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 20  CTX_free(ctx);. 
10d0: 20 20 20 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 0a     ctx = NULL;..
10e0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 6d 65      /* Return me
10f0: 73 73 61 67 65 20 64 69 67 65 73 74 20 61 73 20  ssage digest as 
1100: 65 69 74 68 65 72 20 61 20 62 69 6e 61 72 79 20  either a binary 
1110: 6f 72 20 68 65 78 20 73 74 72 69 6e 67 20 2a 2f  or hex string */
1120: 0a 20 20 20 20 69 66 20 28 66 6f 72 6d 61 74 20  .    if (format 
1130: 3d 3d 20 42 49 4e 5f 46 4f 52 4d 41 54 29 20 7b  == BIN_FORMAT) {
1140: 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75  ..Tcl_SetObjResu
1150: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
1160: 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 6d  ewByteArrayObj(m
1170: 64 5f 62 75 66 2c 20 6d 64 5f 6c 65 6e 29 29 3b  d_buf, md_len));
1180: 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ..    } else {..
1190: 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f  Tcl_Obj *resultO
11a0: 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28  bj = Tcl_NewObj(
11b0: 29 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  );..unsigned cha
11c0: 72 20 2a 70 74 72 20 3d 20 54 63 6c 5f 53 65 74  r *ptr = Tcl_Set
11d0: 42 79 74 65 41 72 72 61 79 4c 65 6e 67 74 68 28  ByteArrayLength(
11e0: 72 65 73 75 6c 74 4f 62 6a 2c 20 6d 64 5f 6c 65  resultObj, md_le
11f0: 6e 2a 32 29 3b 0a 0a 09 66 6f 72 20 28 75 6e 73  n*2);...for (uns
1200: 69 67 6e 65 64 20 69 6e 74 20 69 20 3d 20 30 3b  igned int i = 0;
1210: 20 69 20 3c 20 6d 64 5f 6c 65 6e 3b 20 69 2b 2b   i < md_len; i++
1220: 29 20 7b 0a 09 20 20 20 20 2a 70 74 72 2b 2b 20  ) {..    *ptr++ 
1230: 3d 20 68 65 78 5b 28 6d 64 5f 62 75 66 5b 69 5d  = hex[(md_buf[i]
1240: 20 3e 3e 20 34 29 20 26 20 30 78 30 46 5d 3b 0a   >> 4) & 0x0F];.
1250: 09 20 20 20 20 2a 70 74 72 2b 2b 20 3d 20 68 65  .    *ptr++ = he
1260: 78 5b 6d 64 5f 62 75 66 5b 69 5d 20 26 20 30 78  x[md_buf[i] & 0x
1270: 30 46 5d 3b 0a 09 7d 0a 09 54 63 6c 5f 53 65 74  0F];..}..Tcl_Set
1280: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
1290: 2c 20 72 65 73 75 6c 74 4f 62 6a 29 3b 0a 20 20  , resultObj);.  
12a0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54    }.    return T
12b0: 43 4c 5f 4f 4b 3b 0a 0a 65 72 72 6f 72 3a 0a 20  CL_OK;..error:. 
12c0: 20 20 20 69 66 20 28 63 68 61 6e 20 21 3d 20 28     if (chan != (
12d0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
12e0: 4c 29 20 7b 0a 09 54 63 6c 5f 43 6c 6f 73 65 28  L) {..Tcl_Close(
12f0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 3b 0a 20  interp, chan);. 
1300: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 63 74 78     }.    if (ctx
1310: 20 21 3d 20 28 45 56 50 5f 4d 44 5f 43 54 58 20   != (EVP_MD_CTX 
1320: 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 45 56 50 5f  *) NULL) {..EVP_
1330: 4d 44 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  MD_CTX_free(ctx)
1340: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
1350: 68 63 74 78 20 21 3d 20 28 48 4d 41 43 5f 43 54  hctx != (HMAC_CT
1360: 58 20 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 48 4d  X *) NULL) {..HM
1370: 41 43 5f 43 54 58 5f 66 72 65 65 28 68 63 74 78  AC_CTX_free(hctx
1380: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
1390: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d  urn TCL_ERROR;.}
13a0: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
13b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13e0: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d  ******/../*. *--
13f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1430: 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 42 6c  -. *. * DigestBl
1440: 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 2d 2d 0a 20  ockModeProc --. 
1450: 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64  *. *.This proced
1460: 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 62  ure is invoked b
1470: 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f  y the generic IO
1480: 20 6c 65 76 65 6c 0a 20 2a 20 20 20 20 20 20 20   level. *       
1490: 74 6f 20 73 65 74 20 62 6c 6f 63 6b 69 6e 67 20  to set blocking 
14a0: 61 6e 64 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20  and nonblocking 
14b0: 6d 6f 64 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 74  modes.. *. * Ret
14c0: 75 72 6e 73 3a 0a 20 2a 09 30 20 69 66 20 73 75  urns:. *.0 if su
14d0: 63 63 65 73 73 66 75 6c 20 6f 72 20 50 4f 53 49  ccessful or POSI
14e0: 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  X error code if 
14f0: 66 61 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 69  failed.. *. * Si
1500: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53  de effects:. *.S
1510: 65 74 73 20 74 68 65 20 64 65 76 69 63 65 20 69  ets the device i
1520: 6e 74 6f 20 62 6c 6f 63 6b 69 6e 67 20 6f 72 20  nto blocking or 
1530: 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  nonblocking mode
1540: 2e 0a 20 2a 09 43 61 6e 20 63 61 6c 6c 20 54 63  .. *.Can call Tc
1550: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 45 72 72 6f  l_SetChannelErro
1560: 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  r.. *. *--------
1570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
15b0: 73 74 61 74 69 63 20 69 6e 74 20 44 69 67 65 73  static int Diges
15c0: 74 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 28 43  tBlockModeProc(C
15d0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
15e0: 44 61 74 61 2c 20 69 6e 74 20 6d 6f 64 65 29 20  Data, int mode) 
15f0: 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74  {.    DigestStat
1600: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44  e *statePtr = (D
1610: 69 67 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c  igestState *) cl
1620: 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 69  ientData;..    i
1630: 66 20 28 6d 6f 64 65 20 3d 3d 20 54 43 4c 5f 4d  f (mode == TCL_M
1640: 4f 44 45 5f 4e 4f 4e 42 4c 4f 43 4b 49 4e 47 29  ODE_NONBLOCKING)
1650: 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c   {..statePtr->fl
1660: 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 41  ags |= TLS_TCL_A
1670: 53 59 4e 43 3b 0a 20 20 20 20 7d 20 65 6c 73 65  SYNC;.    } else
1680: 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c   {..statePtr->fl
1690: 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c  ags &= ~(TLS_TCL
16a0: 5f 41 53 59 4e 43 29 3b 0a 20 20 20 20 7d 0a 20  _ASYNC);.    }. 
16b0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a     return 0;.}..
16c0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
16d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1700: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44  --------. *. * D
1710: 69 67 65 73 74 43 6c 6f 73 65 50 72 6f 63 20 2d  igestCloseProc -
1720: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f  -. *. *.This pro
1730: 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65  cedure is invoke
1740: 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 63  d by the generic
1750: 20 49 4f 20 6c 65 76 65 6c 20 74 6f 20 70 65 72   IO level to per
1760: 66 6f 72 6d 0a 20 2a 09 63 68 61 6e 6e 65 6c 2d  form. *.channel-
1770: 74 79 70 65 2d 73 70 65 63 69 66 69 63 20 63 6c  type-specific cl
1780: 65 61 6e 75 70 20 77 68 65 6e 20 63 68 61 6e 6e  eanup when chann
1790: 65 6c 20 69 73 20 63 6c 6f 73 65 64 2e 20 41 6c  el is closed. Al
17a0: 6c 0a 20 2a 09 71 75 65 75 65 64 20 6f 75 74 70  l. *.queued outp
17b0: 75 74 20 69 73 20 66 6c 75 73 68 65 64 20 70 72  ut is flushed pr
17c0: 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74  ior to calling t
17d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a  his function.. *
17e0: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09  . * Returns:. *.
17f0: 30 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20  0 if successful 
1800: 6f 72 20 50 4f 53 49 58 20 65 72 72 6f 72 20 63  or POSIX error c
1810: 6f 64 65 20 69 66 20 66 61 69 6c 65 64 2e 0a 20  ode if failed.. 
1820: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
1830: 73 3a 0a 20 2a 09 57 72 69 74 65 73 20 64 69 67  s:. *.Writes dig
1840: 65 73 74 20 74 6f 20 6f 75 74 70 75 74 20 61 6e  est to output an
1850: 64 20 63 6c 6f 73 65 73 20 74 68 65 20 63 68 61  d closes the cha
1860: 6e 6e 65 6c 2e 20 53 74 6f 72 65 73 20 65 72 72  nnel. Stores err
1870: 6f 72 0a 20 2a 09 6d 65 73 73 61 67 65 73 20 69  or. *.messages i
1880: 6e 20 69 6e 74 65 72 70 20 72 65 73 75 6c 74 2e  n interp result.
1890: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
18a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e  ---------. */.in
18e0: 74 20 44 69 67 65 73 74 43 6c 6f 73 65 50 72 6f  t DigestClosePro
18f0: 63 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  c(ClientData cli
1900: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  entData, Tcl_Int
1910: 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20  erp *interp) {. 
1920: 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a     DigestState *
1930: 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65  statePtr = (Dige
1940: 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e  stState *) clien
1950: 74 44 61 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 43  tData;..    /* C
1960: 61 6e 63 65 6c 20 61 63 74 69 76 65 20 74 69 6d  ancel active tim
1970: 65 72 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20  er, if any */.  
1980: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
1990: 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69  timer != (Tcl_Ti
19a0: 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20  merToken) NULL) 
19b0: 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d  {..Tcl_DeleteTim
19c0: 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50  erHandler(stateP
19d0: 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61  tr->timer);..sta
19e0: 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28  tePtr->timer = (
19f0: 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20  Tcl_TimerToken) 
1a00: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  NULL;.    }..   
1a10: 20 2f 2a 20 43 6c 65 61 6e 2d 75 70 20 2a 2f 0a   /* Clean-up */.
1a20: 20 20 20 20 44 69 67 65 73 74 46 72 65 65 28 73      DigestFree(s
1a30: 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 72 65  tatePtr);.    re
1a40: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  turn 0;.}../*. *
1a50: 20 53 61 6d 65 20 61 73 20 44 69 67 65 73 74 43   Same as DigestC
1a60: 6c 6f 73 65 50 72 6f 63 20 62 75 74 20 77 69 74  loseProc but wit
1a70: 68 20 69 6e 64 69 76 69 64 75 61 6c 20 72 65 61  h individual rea
1a80: 64 20 61 6e 64 20 77 72 69 74 65 20 63 6c 6f 73  d and write clos
1a90: 65 20 63 6f 6e 74 72 6f 6c 0a 20 2a 2f 0a 73 74  e control. */.st
1aa0: 61 74 69 63 20 69 6e 74 20 44 69 67 65 73 74 43  atic int DigestC
1ab0: 6c 6f 73 65 32 50 72 6f 63 28 43 6c 69 65 6e 74  lose2Proc(Client
1ac0: 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74  Data instanceDat
1ad0: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
1ae0: 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73  nterp, int flags
1af0: 29 20 7b 0a 0a 20 20 20 20 69 66 20 28 28 66 6c  ) {..    if ((fl
1b00: 61 67 73 20 26 20 28 54 43 4c 5f 43 4c 4f 53 45  ags & (TCL_CLOSE
1b10: 5f 52 45 41 44 20 7c 20 54 43 4c 5f 43 4c 4f 53  _READ | TCL_CLOS
1b20: 45 5f 57 52 49 54 45 29 29 20 3d 3d 20 30 29 20  E_WRITE)) == 0) 
1b30: 7b 0a 09 72 65 74 75 72 6e 20 44 69 67 65 73 74  {..return Digest
1b40: 43 6c 6f 73 65 50 72 6f 63 28 69 6e 73 74 61 6e  CloseProc(instan
1b50: 63 65 44 61 74 61 2c 20 69 6e 74 65 72 70 29 3b  ceData, interp);
1b60: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
1b70: 6e 20 45 49 4e 56 41 4c 3b 0a 7d 0a 0a 2f 2a 0a  n EINVAL;.}../*.
1b80: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
1b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bc0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44  --------. *. * D
1bd0: 69 67 65 73 74 49 6e 70 75 74 50 72 6f 63 20 2d  igestInputProc -
1be0: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62  -. *. *.Called b
1bf0: 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f  y the generic IO
1c00: 20 73 79 73 74 65 6d 20 74 6f 20 72 65 61 64 20   system to read 
1c10: 64 61 74 61 20 66 72 6f 6d 20 74 72 61 6e 73 66  data from transf
1c20: 6f 72 6d 20 61 6e 64 0a 20 2a 09 70 6c 61 63 65  orm and. *.place
1c30: 20 69 6e 20 62 75 66 2e 0a 20 2a 0a 20 2a 20 52   in buf.. *. * R
1c40: 65 74 75 72 6e 73 3a 0a 20 2a 09 54 6f 74 61 6c  eturns:. *.Total
1c50: 20 62 79 74 65 73 20 72 65 61 64 20 6f 72 20 2d   bytes read or -
1c60: 31 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 20 61  1 for an error a
1c70: 6c 6f 6e 67 20 77 69 74 68 20 61 20 50 4f 53 49  long with a POSI
1c80: 58 20 65 72 72 6f 72 0a 20 2a 09 63 6f 64 65 20  X error. *.code 
1c90: 69 6e 20 65 72 72 6f 72 43 6f 64 65 50 74 72 2e  in errorCodePtr.
1ca0: 20 55 73 65 20 45 41 47 41 49 4e 20 66 6f 72 20   Use EAGAIN for 
1cb0: 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 61 6e 64 20  nonblocking and 
1cc0: 6e 6f 20 64 61 74 61 2e 0a 20 2a 0a 20 2a 20 53  no data.. *. * S
1cd0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
1ce0: 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 74  Read data from t
1cf0: 72 61 6e 73 66 6f 72 6d 20 61 6e 64 20 77 72 69  ransform and wri
1d00: 74 65 20 74 6f 20 62 75 66 0a 20 2a 0a 20 2a 2d  te to buf. *. *-
1d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d50: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69  -----. */.int Di
1d60: 67 65 73 74 49 6e 70 75 74 50 72 6f 63 28 43 6c  gestInputProc(Cl
1d70: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
1d80: 61 74 61 2c 20 63 68 61 72 20 2a 62 75 66 2c 20  ata, char *buf, 
1d90: 69 6e 74 20 74 6f 52 65 61 64 2c 20 69 6e 74 20  int toRead, int 
1da0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 20 7b  *errorCodePtr) {
1db0: 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65  .    DigestState
1dc0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44 69   *statePtr = (Di
1dd0: 67 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69  gestState *) cli
1de0: 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 54 63 6c  entData;.    Tcl
1df0: 5f 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 3b  _Channel parent;
1e00: 0a 20 20 20 20 69 6e 74 20 72 65 61 64 2c 20 72  .    int read, r
1e10: 65 73 3b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f  es;.    *errorCo
1e20: 64 65 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20  dePtr = 0;..    
1e30: 69 66 20 28 74 6f 52 65 61 64 20 3c 3d 20 30 20  if (toRead <= 0 
1e40: 7c 7c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  || statePtr->sel
1e50: 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65  f == (Tcl_Channe
1e60: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  l) NULL) {..retu
1e70: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 0;.    }..   
1e80: 20 2f 2a 20 47 65 74 20 62 79 74 65 73 20 66 72   /* Get bytes fr
1e90: 6f 6d 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 68  om underlying ch
1ea0: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 70 61 72  annel */.    par
1eb0: 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 61  ent = Tcl_GetSta
1ec0: 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 61 74  ckedChannel(stat
1ed0: 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 20  ePtr->self);.   
1ee0: 20 72 65 61 64 20 3d 20 54 63 6c 5f 52 65 61 64   read = Tcl_Read
1ef0: 52 61 77 28 70 61 72 65 6e 74 2c 20 62 75 66 2c  Raw(parent, buf,
1f00: 20 74 6f 52 65 61 64 29 3b 0a 0a 20 20 20 20 2f   toRead);..    /
1f10: 2a 20 41 64 64 20 74 6f 20 6d 65 73 73 61 67 65  * Add to message
1f20: 20 64 69 67 65 73 74 20 2a 2f 0a 20 20 20 20 69   digest */.    i
1f30: 66 20 28 72 65 61 64 20 3e 20 30 29 20 7b 0a 09  f (read > 0) {..
1f40: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 74  if (statePtr->ct
1f50: 78 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  x != NULL) {..  
1f60: 20 20 72 65 73 20 3d 20 45 56 50 5f 44 69 67 65    res = EVP_Dige
1f70: 73 74 55 70 64 61 74 65 28 73 74 61 74 65 50 74  stUpdate(statePt
1f80: 72 2d 3e 63 74 78 2c 20 62 75 66 2c 20 28 73 69  r->ctx, buf, (si
1f90: 7a 65 5f 74 29 20 72 65 61 64 29 3b 0a 09 7d 20  ze_t) read);..} 
1fa0: 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 73 20  else {..    res 
1fb0: 3d 20 48 4d 41 43 5f 55 70 64 61 74 65 28 73 74  = HMAC_Update(st
1fc0: 61 74 65 50 74 72 2d 3e 68 63 74 78 2c 20 62 75  atePtr->hctx, bu
1fd0: 66 2c 20 28 73 69 7a 65 5f 74 29 20 72 65 61 64  f, (size_t) read
1fe0: 29 3b 0a 09 7d 0a 09 69 66 20 28 21 72 65 73 29  );..}..if (!res)
1ff0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 43   {..    Tcl_SetC
2000: 68 61 6e 6e 65 6c 45 72 72 6f 72 28 73 74 61 74  hannelError(stat
2010: 65 50 74 72 2d 3e 73 65 6c 66 2c 20 54 63 6c 5f  ePtr->self, Tcl_
2020: 4f 62 6a 50 72 69 6e 74 66 28 22 44 69 67 65 73  ObjPrintf("Diges
2030: 74 20 75 70 64 61 74 65 20 66 61 69 6c 65 64 3a  t update failed:
2040: 20 25 73 22 2c 20 52 45 41 53 4f 4e 28 29 29 29   %s", REASON()))
2050: 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64  ;..    *errorCod
2060: 65 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 09  ePtr = EINVAL;..
2070: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09      return -1;..
2080: 7d 0a 09 2f 2a 20 54 68 69 73 20 69 73 20 63 6f  }../* This is co
2090: 72 72 65 63 74 20 2a 2f 0a 09 72 65 61 64 20 3d  rrect */..read =
20a0: 20 2d 31 3b 0a 09 2a 65 72 72 6f 72 43 6f 64 65   -1;..*errorCode
20b0: 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 20  Ptr = EAGAIN;.. 
20c0: 20 20 20 0a 20 20 20 20 7d 20 65 6c 73 65 20 69     .    } else i
20d0: 66 20 28 72 65 61 64 20 3c 20 30 29 20 7b 0a 09  f (read < 0) {..
20e0: 2f 2a 20 45 72 72 6f 72 20 2a 2f 0a 09 2a 65 72  /* Error */..*er
20f0: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 54 63 6c  rorCodePtr = Tcl
2100: 5f 47 65 74 45 72 72 6e 6f 28 29 3b 0a 0a 20 20  _GetErrno();..  
2110: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 21 28 73    } else if (!(s
2120: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26  tatePtr->flags &
2130: 20 43 48 41 4e 5f 45 4f 46 29 29 20 7b 0a 09 2f   CHAN_EOF)) {../
2140: 2a 20 45 4f 46 20 2a 2f 0a 09 2a 65 72 72 6f 72  * EOF */..*error
2150: 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 75 6e  CodePtr = 0;..un
2160: 73 69 67 6e 65 64 20 63 68 61 72 20 6d 64 5f 62  signed char md_b
2170: 75 66 5b 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49  uf[EVP_MAX_MD_SI
2180: 5a 45 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69  ZE];..unsigned i
2190: 6e 74 20 6d 64 5f 6c 65 6e 20 3d 20 30 3b 0a 0a  nt md_len = 0;..
21a0: 09 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 68 61 73  ./* Finalize has
21b0: 68 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 63  h function and c
21c0: 61 6c 63 75 6c 61 74 65 20 6d 65 73 73 61 67 65  alculate message
21d0: 20 64 69 67 65 73 74 20 2a 2f 0a 09 69 66 20 28   digest */..if (
21e0: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 21 3d  statePtr->ctx !=
21f0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 72 65   NULL) {..    re
2200: 73 20 3d 20 45 56 50 5f 44 69 67 65 73 74 46 69  s = EVP_DigestFi
2210: 6e 61 6c 5f 65 78 28 73 74 61 74 65 50 74 72 2d  nal_ex(statePtr-
2220: 3e 63 74 78 2c 20 6d 64 5f 62 75 66 2c 20 26 6d  >ctx, md_buf, &m
2230: 64 5f 6c 65 6e 29 3b 0a 09 7d 20 65 6c 73 65 20  d_len);..} else 
2240: 7b 0a 09 20 20 20 20 72 65 73 20 3d 20 48 4d 41  {..    res = HMA
2250: 43 5f 46 69 6e 61 6c 28 73 74 61 74 65 50 74 72  C_Final(statePtr
2260: 2d 3e 68 63 74 78 2c 20 6d 64 5f 62 75 66 2c 20  ->hctx, md_buf, 
2270: 26 6d 64 5f 6c 65 6e 29 3b 0a 09 7d 0a 09 69 66  &md_len);..}..if
2280: 20 28 21 72 65 73 29 20 7b 0a 09 20 20 20 20 2a   (!res) {..    *
2290: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45  errorCodePtr = E
22a0: 49 4e 56 41 4c 3b 0a 0a 09 2f 2a 20 57 72 69 74  INVAL;.../* Writ
22b0: 65 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74  e message digest
22c0: 20 74 6f 20 6f 75 74 70 75 74 20 63 68 61 6e 6e   to output chann
22d0: 65 6c 20 61 73 20 62 79 74 65 20 61 72 72 61 79  el as byte array
22e0: 20 6f 72 20 68 65 78 20 73 74 72 69 6e 67 20 2a   or hex string *
22f0: 2f 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 64  /..} else if (md
2300: 5f 6c 65 6e 20 3e 20 30 29 20 7b 0a 09 20 20 20  _len > 0) {..   
2310: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66   if (statePtr->f
2320: 6f 72 6d 61 74 20 3d 3d 20 42 49 4e 5f 46 4f 52  ormat == BIN_FOR
2330: 4d 41 54 29 20 7b 0a 09 09 72 65 61 64 20 3d 20  MAT) {...read = 
2340: 6d 64 5f 6c 65 6e 3b 0a 09 09 6d 65 6d 63 70 79  md_len;...memcpy
2350: 28 62 75 66 2c 20 6d 64 5f 62 75 66 2c 20 72 65  (buf, md_buf, re
2360: 61 64 29 3b 0a 0a 09 20 20 20 20 7d 20 65 6c 73  ad);...    } els
2370: 65 20 7b 0a 09 09 75 6e 73 69 67 6e 65 64 20 63  e {...unsigned c
2380: 68 61 72 20 68 65 78 5f 62 75 66 5b 45 56 50 5f  har hex_buf[EVP_
2390: 4d 41 58 5f 4d 44 5f 53 49 5a 45 2a 32 5d 3b 0a  MAX_MD_SIZE*2];.
23a0: 09 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
23b0: 2a 70 74 72 20 3d 20 68 65 78 5f 62 75 66 3b 0a  *ptr = hex_buf;.
23c0: 0a 09 09 66 6f 72 20 28 75 6e 73 69 67 6e 65 64  ...for (unsigned
23d0: 20 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20   int i = 0; i < 
23e0: 6d 64 5f 6c 65 6e 3b 20 69 2b 2b 29 20 7b 0a 09  md_len; i++) {..
23f0: 09 20 20 20 20 2a 70 74 72 2b 2b 20 3d 20 68 65  .    *ptr++ = he
2400: 78 5b 28 6d 64 5f 62 75 66 5b 69 5d 20 3e 3e 20  x[(md_buf[i] >> 
2410: 34 29 20 26 20 30 78 30 46 5d 3b 0a 09 09 20 20  4) & 0x0F];...  
2420: 20 20 2a 70 74 72 2b 2b 20 3d 20 68 65 78 5b 6d    *ptr++ = hex[m
2430: 64 5f 62 75 66 5b 69 5d 20 26 20 30 78 30 46 5d  d_buf[i] & 0x0F]
2440: 3b 0a 09 09 7d 0a 09 09 72 65 61 64 20 3d 20 6d  ;...}...read = m
2450: 64 5f 6c 65 6e 2a 32 3b 0a 09 09 6d 65 6d 63 70  d_len*2;...memcp
2460: 79 28 62 75 66 2c 20 68 65 78 5f 62 75 66 2c 20  y(buf, hex_buf, 
2470: 72 65 61 64 29 3b 0a 09 20 20 20 20 7d 0a 09 7d  read);..    }..}
2480: 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67  ..statePtr->flag
2490: 73 20 7c 3d 20 43 48 41 4e 5f 45 4f 46 3b 0a 20  s |= CHAN_EOF;. 
24a0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
24b0: 72 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d  read;.}../*. *--
24c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2500: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73  ----. *. * Diges
2510: 74 4f 75 74 70 75 74 50 72 6f 63 20 2d 2d 0a 20  tOutputProc --. 
2520: 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79 20 74  *. *.Called by t
2530: 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 73 79  he generic IO sy
2540: 73 74 65 6d 20 74 6f 20 77 72 69 74 65 20 64 61  stem to write da
2550: 74 61 20 69 6e 20 62 75 66 20 74 6f 20 74 72 61  ta in buf to tra
2560: 6e 73 66 6f 72 6d 2e 0a 20 2a 0a 20 2a 20 52 65  nsform.. *. * Re
2570: 74 75 72 6e 73 3a 0a 20 2a 09 54 6f 74 61 6c 20  turns:. *.Total 
2580: 62 79 74 65 73 20 77 72 69 74 74 65 6e 20 6f 72  bytes written or
2590: 20 2d 31 20 66 6f 72 20 61 6e 20 65 72 72 6f 72   -1 for an error
25a0: 20 61 6c 6f 6e 67 20 77 69 74 68 20 61 20 50 4f   along with a PO
25b0: 53 49 58 20 65 72 72 6f 72 0a 20 2a 09 63 6f 64  SIX error. *.cod
25c0: 65 20 69 6e 20 65 72 72 6f 72 43 6f 64 65 50 74  e in errorCodePt
25d0: 72 2e 20 55 73 65 20 45 41 47 41 49 4e 20 66 6f  r. Use EAGAIN fo
25e0: 72 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 61 6e  r nonblocking an
25f0: 64 20 63 61 6e 27 74 20 77 72 69 74 65 20 64 61  d can't write da
2600: 74 61 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ta.. *. * Side e
2610: 66 66 65 63 74 73 3a 0a 20 2a 09 47 65 74 20 64  ffects:. *.Get d
2620: 61 74 61 20 66 72 6f 6d 20 62 75 66 20 61 6e 64  ata from buf and
2630: 20 75 70 64 61 74 65 20 64 69 67 65 73 74 0a 20   update digest. 
2640: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
2650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 20  ----------. */. 
2690: 69 6e 74 20 44 69 67 65 73 74 4f 75 74 70 75 74  int DigestOutput
26a0: 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20  Proc(ClientData 
26b0: 63 6c 69 65 6e 74 44 61 74 61 2c 20 63 6f 6e 73  clientData, cons
26c0: 74 20 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74  t char *buf, int
26d0: 20 74 6f 57 72 69 74 65 2c 20 69 6e 74 20 2a 65   toWrite, int *e
26e0: 72 72 6f 72 43 6f 64 65 50 74 72 29 20 7b 0a 20  rrorCodePtr) {. 
26f0: 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a     DigestState *
2700: 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65  statePtr = (Dige
2710: 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e  stState *) clien
2720: 74 44 61 74 61 3b 0a 20 20 20 20 2a 65 72 72 6f  tData;.    *erro
2730: 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 20 20  rCodePtr = 0;.  
2740: 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 20 20    int res;..    
2750: 69 66 20 28 74 6f 57 72 69 74 65 20 3c 3d 20 30  if (toWrite <= 0
2760: 20 7c 7c 20 73 74 61 74 65 50 74 72 2d 3e 73 65   || statePtr->se
2770: 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e  lf == (Tcl_Chann
2780: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74  el) NULL) {..ret
2790: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  urn 0;.    }..  
27a0: 20 20 2f 2a 20 41 64 64 20 74 6f 20 6d 65 73 73    /* Add to mess
27b0: 61 67 65 20 64 69 67 65 73 74 20 2a 2f 0a 20 20  age digest */.  
27c0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
27d0: 63 74 78 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ctx != NULL) {..
27e0: 72 65 73 20 3d 20 45 56 50 5f 44 69 67 65 73 74  res = EVP_Digest
27f0: 55 70 64 61 74 65 28 73 74 61 74 65 50 74 72 2d  Update(statePtr-
2800: 3e 63 74 78 2c 20 62 75 66 2c 20 28 73 69 7a 65  >ctx, buf, (size
2810: 5f 74 29 20 74 6f 57 72 69 74 65 29 3b 0a 20 20  _t) toWrite);.  
2820: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20    } else {..res 
2830: 3d 20 48 4d 41 43 5f 55 70 64 61 74 65 28 73 74  = HMAC_Update(st
2840: 61 74 65 50 74 72 2d 3e 68 63 74 78 2c 20 62 75  atePtr->hctx, bu
2850: 66 2c 20 28 73 69 7a 65 5f 74 29 20 74 6f 57 72  f, (size_t) toWr
2860: 69 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ite);.    }.    
2870: 69 66 20 28 21 72 65 73 29 20 7b 0a 09 54 63 6c  if (!res) {..Tcl
2880: 5f 53 65 74 43 68 61 6e 6e 65 6c 45 72 72 6f 72  _SetChannelError
2890: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c  (statePtr->self,
28a0: 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 22   Tcl_ObjPrintf("
28b0: 44 69 67 65 73 74 20 75 70 64 61 74 65 20 66 61  Digest update fa
28c0: 69 6c 65 64 3a 20 25 73 22 2c 20 52 45 41 53 4f  iled: %s", REASO
28d0: 4e 28 29 29 29 3b 0a 09 2a 65 72 72 6f 72 43 6f  N()));..*errorCo
28e0: 64 65 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a  dePtr = EINVAL;.
28f0: 09 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20  .return -1;.    
2900: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 74 6f 57  }.    return toW
2910: 72 69 74 65 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d  rite;.}../*. *--
2920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2960: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73  ----. *. * Diges
2970: 74 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2d  tSetOptionProc -
2980: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62  -. *. *.Called b
2990: 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f  y the generic IO
29a0: 20 73 79 73 74 65 6d 20 74 6f 20 73 65 74 20 63   system to set c
29b0: 68 61 6e 6e 65 6c 20 6f 70 74 69 6f 6e 20 6e 61  hannel option na
29c0: 6d 65 20 74 6f 20 76 61 6c 75 65 2e 0a 20 2a 0a  me to value.. *.
29d0: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54   * Returns:. *.T
29e0: 43 4c 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  CL_OK if success
29f0: 66 75 6c 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52  ful or TCL_ERROR
2a00: 20 69 66 20 66 61 69 6c 65 64 20 61 6c 6f 6e 67   if failed along
2a10: 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 0a 20   with an error. 
2a20: 2a 09 6d 65 73 73 61 67 65 20 69 6e 20 69 6e 74  *.message in int
2a30: 65 72 70 20 61 6e 64 20 54 63 6c 5f 53 65 74 45  erp and Tcl_SetE
2a40: 72 72 6e 6f 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  rrno.. *. * Side
2a50: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 55 70 64   effects:. *.Upd
2a60: 61 74 65 73 20 63 68 61 6e 6e 65 6c 20 6f 70 74  ates channel opt
2a70: 69 6f 6e 20 74 6f 20 6e 65 77 20 76 61 6c 75 65  ion to new value
2a80: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
2a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
2ad0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 69 67  /.static int Dig
2ae0: 65 73 74 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63  estSetOptionProc
2af0: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
2b00: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ntData, Tcl_Inte
2b10: 72 70 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73  rp *interp, cons
2b20: 74 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e 4e 61  t char *optionNa
2b30: 6d 65 2c 0a 09 63 6f 6e 73 74 20 63 68 61 72 20  me,..const char 
2b40: 2a 6f 70 74 69 6f 6e 56 61 6c 75 65 29 20 7b 0a  *optionValue) {.
2b50: 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20      DigestState 
2b60: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67  *statePtr = (Dig
2b70: 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65  estState *) clie
2b80: 6e 74 44 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f  ntData;.    Tcl_
2b90: 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 3b 0a  Channel parent;.
2ba0: 20 20 20 20 54 63 6c 5f 44 72 69 76 65 72 53 65      Tcl_DriverSe
2bb0: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2a 73 65 74  tOptionProc *set
2bc0: 4f 70 74 69 6f 6e 50 72 6f 63 3b 0a 0a 20 20 20  OptionProc;..   
2bd0: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73   if (statePtr->s
2be0: 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  elf == (Tcl_Chan
2bf0: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  nel) NULL) {..re
2c00: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2c10: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
2c20: 6c 65 67 61 74 65 20 6f 70 74 69 6f 6e 73 20 64  legate options d
2c30: 6f 77 6e 73 74 72 65 61 6d 20 2a 2f 0a 20 20 20  ownstream */.   
2c40: 20 70 61 72 65 6e 74 20 3d 20 54 63 6c 5f 47 65   parent = Tcl_Ge
2c50: 74 53 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28  tStackedChannel(
2c60: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b  statePtr->self);
2c70: 0a 20 20 20 20 73 65 74 4f 70 74 69 6f 6e 50 72  .    setOptionPr
2c80: 6f 63 20 3d 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  oc = Tcl_Channel
2c90: 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 54 63  SetOptionProc(Tc
2ca0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65  l_GetChannelType
2cb0: 28 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 69  (parent));.    i
2cc0: 66 20 28 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63  f (setOptionProc
2cd0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74   != NULL) {..ret
2ce0: 75 72 6e 20 28 2a 73 65 74 4f 70 74 69 6f 6e 50  urn (*setOptionP
2cf0: 72 6f 63 29 28 54 63 6c 5f 47 65 74 43 68 61 6e  roc)(Tcl_GetChan
2d00: 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28  nelInstanceData(
2d10: 70 61 72 65 6e 74 29 2c 20 69 6e 74 65 72 70 2c  parent), interp,
2d20: 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 6f 70 74   optionName, opt
2d30: 69 6f 6e 56 61 6c 75 65 29 3b 0a 20 20 20 20 7d  ionValue);.    }
2d40: 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 53 65 74   else {..Tcl_Set
2d50: 45 72 72 6e 6f 28 45 49 4e 56 41 4c 29 3b 0a 09  Errno(EINVAL);..
2d60: 72 65 74 75 72 6e 20 54 63 6c 5f 42 61 64 43 68  return Tcl_BadCh
2d70: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
2d80: 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20  rp, optionName, 
2d90: 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a  NULL);.    }.}..
2da0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
2db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
2df0: 2a 20 44 69 67 65 73 74 47 65 74 4f 70 74 69 6f  * DigestGetOptio
2e00: 6e 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43  nProc --. *. *.C
2e10: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 67 65 6e  alled by the gen
2e20: 65 72 69 63 20 49 4f 20 73 79 73 74 65 6d 20 74  eric IO system t
2e30: 6f 20 67 65 74 20 63 68 61 6e 6e 65 6c 20 6f 70  o get channel op
2e40: 74 69 6f 6e 20 6e 61 6d 65 27 73 20 76 61 6c 75  tion name's valu
2e50: 65 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73  e.. *. * Returns
2e60: 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 69 66 20 73  :. *.TCL_OK if s
2e70: 75 63 63 65 73 73 66 75 6c 20 6f 72 20 54 43 4c  uccessful or TCL
2e80: 5f 45 52 52 4f 52 20 69 66 20 66 61 69 6c 65 64  _ERROR if failed
2e90: 20 61 6c 6f 6e 67 20 77 69 74 68 20 61 6e 20 65   along with an e
2ea0: 72 72 6f 72 0a 20 2a 09 6d 65 73 73 61 67 65 20  rror. *.message 
2eb0: 69 6e 20 69 6e 74 65 72 70 20 61 6e 64 20 54 63  in interp and Tc
2ec0: 6c 5f 53 65 74 45 72 72 6e 6f 2e 0a 20 2a 0a 20  l_SetErrno.. *. 
2ed0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
2ee0: 20 2a 09 53 65 74 73 20 72 65 73 75 6c 74 20 74   *.Sets result t
2ef0: 6f 20 6f 70 74 69 6f 6e 27 73 20 76 61 6c 75 65  o option's value
2f00: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
2f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
2f50: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 69 67 65  .static int Dige
2f60: 73 74 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28  stGetOptionProc(
2f70: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
2f80: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
2f90: 70 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74  p *interp, const
2fa0: 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d   char *optionNam
2fb0: 65 2c 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 20  e,..Tcl_DString 
2fc0: 2a 6f 70 74 69 6f 6e 56 61 6c 75 65 29 20 7b 0a  *optionValue) {.
2fd0: 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20      DigestState 
2fe0: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67  *statePtr = (Dig
2ff0: 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65  estState *) clie
3000: 6e 74 44 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f  ntData;.    Tcl_
3010: 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 3b 0a  Channel parent;.
3020: 20 20 20 20 54 63 6c 5f 44 72 69 76 65 72 47 65      Tcl_DriverGe
3030: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2a 67 65 74  tOptionProc *get
3040: 4f 70 74 69 6f 6e 50 72 6f 63 3b 0a 0a 20 20 20  OptionProc;..   
3050: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73   if (statePtr->s
3060: 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  elf == (Tcl_Chan
3070: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  nel) NULL) {..re
3080: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
3090: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
30a0: 6c 65 67 61 74 65 20 6f 70 74 69 6f 6e 73 20 64  legate options d
30b0: 6f 77 6e 73 74 72 65 61 6d 20 2a 2f 0a 20 20 20  ownstream */.   
30c0: 20 70 61 72 65 6e 74 20 3d 20 54 63 6c 5f 47 65   parent = Tcl_Ge
30d0: 74 53 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28  tStackedChannel(
30e0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b  statePtr->self);
30f0: 0a 20 20 20 20 67 65 74 4f 70 74 69 6f 6e 50 72  .    getOptionPr
3100: 6f 63 20 3d 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  oc = Tcl_Channel
3110: 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 54 63  GetOptionProc(Tc
3120: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65  l_GetChannelType
3130: 28 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 69  (parent));.    i
3140: 66 20 28 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63  f (getOptionProc
3150: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74   != NULL) {..ret
3160: 75 72 6e 20 28 2a 67 65 74 4f 70 74 69 6f 6e 50  urn (*getOptionP
3170: 72 6f 63 29 28 54 63 6c 5f 47 65 74 43 68 61 6e  roc)(Tcl_GetChan
3180: 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28  nelInstanceData(
3190: 70 61 72 65 6e 74 29 2c 20 69 6e 74 65 72 70 2c  parent), interp,
31a0: 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 6f 70 74   optionName, opt
31b0: 69 6f 6e 56 61 6c 75 65 29 3b 0a 20 20 20 20 7d  ionValue);.    }
31c0: 20 65 6c 73 65 20 69 66 20 28 6f 70 74 69 6f 6e   else if (option
31d0: 4e 61 6d 65 20 3d 3d 20 28 63 68 61 72 2a 29 20  Name == (char*) 
31e0: 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 52 65 71 75  NULL) {../* Requ
31f0: 65 73 74 20 69 73 20 71 75 65 72 79 20 66 6f 72  est is query for
3200: 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 2c 20 74 68   all options, th
3210: 69 73 20 69 73 20 6f 6b 2e 20 2a 2f 0a 09 72 65  is is ok. */..re
3220: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20  turn TCL_OK;.   
3230: 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 53   } else {..Tcl_S
3240: 65 74 45 72 72 6e 6f 28 45 49 4e 56 41 4c 29 3b  etErrno(EINVAL);
3250: 0a 09 72 65 74 75 72 6e 20 54 63 6c 5f 42 61 64  ..return Tcl_Bad
3260: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
3270: 74 65 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65  terp, optionName
3280: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 7d  , NULL);.    }.}
3290: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
32a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
32b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
32c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
32d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
32e0: 0a 20 2a 20 44 69 67 65 73 74 54 69 6d 65 72 48  . * DigestTimerH
32f0: 61 6e 64 6c 65 72 20 2d 2d 0a 20 2a 0a 20 2a 09  andler --. *. *.
3300: 43 61 6c 6c 65 64 20 62 79 20 74 68 65 20 6e 6f  Called by the no
3310: 74 69 66 69 65 72 20 76 69 61 20 74 69 6d 65 72  tifier via timer
3320: 20 74 6f 20 66 6c 75 73 68 20 6f 75 74 20 70 65   to flush out pe
3330: 6e 64 69 6e 67 20 69 6e 70 75 74 20 64 61 74 61  nding input data
3340: 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a  .. *. * Returns:
3350: 0a 20 2a 09 4e 6f 74 68 69 6e 67 0a 20 2a 0a 20  . *.Nothing. *. 
3360: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
3370: 20 2a 09 4d 61 79 20 63 61 6c 6c 20 54 63 6c 5f   *.May call Tcl_
3380: 4e 6f 74 69 66 79 43 68 61 6e 6e 65 6c 0a 20 2a  NotifyChannel. *
3390: 0a 20 2a 2d 2d 2d 2d 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 0a 20 2a 2f 0a 73 74  ---------. */.st
33e0: 61 74 69 63 20 76 6f 69 64 20 44 69 67 65 73 74  atic void Digest
33f0: 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 43 6c 69  TimerHandler(Cli
3400: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
3410: 74 61 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74  ta) {.    Digest
3420: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20  State *statePtr 
3430: 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a  = (DigestState *
3440: 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20  ) clientData;.. 
3450: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
3460: 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68  >self == (Tcl_Ch
3470: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
3480: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20  return;.    }.. 
3490: 20 20 20 2f 2a 20 43 6c 65 61 72 20 74 69 6d 65     /* Clear time
34a0: 72 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 73  r token */.    s
34b0: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d  tatePtr->timer =
34c0: 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e   (Tcl_TimerToken
34d0: 29 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20  ) NULL;..    /* 
34e0: 46 69 72 65 20 65 76 65 6e 74 20 69 66 20 74 68  Fire event if th
34f0: 65 72 65 20 69 73 20 70 65 6e 64 69 6e 67 20 64  ere is pending d
3500: 61 74 61 2c 20 73 6b 69 70 20 6f 74 68 65 72 77  ata, skip otherw
3510: 69 73 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 28  ise */.    if ((
3520: 73 74 61 74 65 50 74 72 2d 3e 77 61 74 63 68 4d  statePtr->watchM
3530: 61 73 6b 20 26 20 54 43 4c 5f 52 45 41 44 41 42  ask & TCL_READAB
3540: 4c 45 29 20 26 26 20 28 54 63 6c 5f 49 6e 70 75  LE) && (Tcl_Inpu
3550: 74 42 75 66 66 65 72 65 64 28 73 74 61 74 65 50  tBuffered(stateP
3560: 74 72 2d 3e 73 65 6c 66 29 20 3e 20 30 29 29 20  tr->self) > 0)) 
3570: 7b 0a 09 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61  {..Tcl_NotifyCha
3580: 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73  nnel(statePtr->s
3590: 65 6c 66 2c 20 54 43 4c 5f 52 45 41 44 41 42 4c  elf, TCL_READABL
35a0: 45 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a  E);.    }.}../*.
35b0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
35c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35f0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44  --------. *. * D
3600: 69 67 65 73 74 57 61 74 63 68 50 72 6f 63 20 2d  igestWatchProc -
3610: 2d 0a 20 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69  -. *. *.Initiali
3620: 7a 65 20 74 68 65 20 6e 6f 74 69 66 69 65 72 20  ze the notifier 
3630: 74 6f 20 77 61 74 63 68 20 66 6f 72 20 65 76 65  to watch for eve
3640: 6e 74 73 20 66 72 6f 6d 20 74 68 69 73 20 63 68  nts from this ch
3650: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 74  annel.. *. * Ret
3660: 75 72 6e 73 3a 0a 20 2a 09 4e 6f 74 68 69 6e 67  urns:. *.Nothing
3670: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
3680: 63 74 73 3a 0a 20 2a 09 43 6f 6e 66 69 67 75 72  cts:. *.Configur
3690: 65 20 6e 6f 74 69 66 69 65 72 20 73 6f 20 66 75  e notifier so fu
36a0: 74 75 72 65 20 65 76 65 6e 74 73 20 6f 6e 20 74  ture events on t
36b0: 68 65 20 63 68 61 6e 6e 65 6c 20 77 69 6c 6c 20  he channel will 
36c0: 62 65 20 73 65 65 6e 20 62 79 20 54 63 6c 2e 0a  be seen by Tcl..
36d0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
36e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
3720: 23 64 65 66 69 6e 65 20 52 45 41 44 5f 44 45 4c  #define READ_DEL
3730: 41 59 09 35 0a 76 6f 69 64 20 44 69 67 65 73 74  AY.5.void Digest
3740: 57 61 74 63 68 50 72 6f 63 28 43 6c 69 65 6e 74  WatchProc(Client
3750: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
3760: 20 69 6e 74 20 6d 61 73 6b 29 20 7b 0a 20 20 20   int mask) {.   
3770: 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74   DigestState *st
3780: 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 74  atePtr = (Digest
3790: 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44  State *) clientD
37a0: 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61  ata;.    Tcl_Cha
37b0: 6e 6e 65 6c 20 70 61 72 65 6e 74 3b 0a 20 20 20  nnel parent;.   
37c0: 20 54 63 6c 5f 44 72 69 76 65 72 57 61 74 63 68   Tcl_DriverWatch
37d0: 50 72 6f 63 20 2a 77 61 74 63 68 50 72 6f 63 3b  Proc *watchProc;
37e0: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ..    if (stateP
37f0: 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c  tr->self == (Tcl
3800: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20  _Channel) NULL) 
3810: 7b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d  {..return;.    }
3820: 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 4f  ..    /* Store O
3830: 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  R-ed combination
3840: 20 6f 66 20 54 43 4c 5f 52 45 41 44 41 42 4c 45   of TCL_READABLE
3850: 2c 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 20 61  , TCL_WRITABLE a
3860: 6e 64 20 54 43 4c 5f 45 58 43 45 50 54 49 4f 4e  nd TCL_EXCEPTION
3870: 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72   */.    statePtr
3880: 2d 3e 77 61 74 63 68 4d 61 73 6b 20 3d 20 6d 61  ->watchMask = ma
3890: 73 6b 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 70  sk;..    /* Prop
38a0: 61 67 61 74 65 20 6d 61 73 6b 20 69 6e 66 6f 20  agate mask info 
38b0: 74 6f 20 70 61 72 65 6e 74 20 63 68 61 6e 6e 65  to parent channe
38c0: 6c 20 2a 2f 0a 20 20 20 20 70 61 72 65 6e 74 20  l */.    parent 
38d0: 3d 20 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 64  = Tcl_GetStacked
38e0: 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72  Channel(statePtr
38f0: 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 20 77 61 74  ->self);.    wat
3900: 63 68 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68 61  chProc = Tcl_Cha
3910: 6e 6e 65 6c 57 61 74 63 68 50 72 6f 63 28 54 63  nnelWatchProc(Tc
3920: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65  l_GetChannelType
3930: 28 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 77  (parent));.    w
3940: 61 74 63 68 50 72 6f 63 28 54 63 6c 5f 47 65 74  atchProc(Tcl_Get
3950: 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44  ChannelInstanceD
3960: 61 74 61 28 70 61 72 65 6e 74 29 2c 20 6d 61 73  ata(parent), mas
3970: 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f  k);..    /* Remo
3980: 76 65 20 70 65 6e 64 69 6e 67 20 74 69 6d 65 72  ve pending timer
3990: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74   */.    if (stat
39a0: 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28  ePtr->timer != (
39b0: 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20  Tcl_TimerToken) 
39c0: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c  NULL) {..Tcl_Del
39d0: 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28  eteTimerHandler(
39e0: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29  statePtr->timer)
39f0: 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d  ;..statePtr->tim
3a00: 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54  er = (Tcl_TimerT
3a10: 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 20 20 20 20  oken) NULL;.    
3a20: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
3a30: 72 65 20 69 73 20 64 61 74 61 20 70 65 6e 64 69  re is data pendi
3a40: 6e 67 2c 20 73 65 74 20 6e 65 77 20 74 69 6d 65  ng, set new time
3a50: 72 20 74 6f 20 63 61 6c 6c 20 54 63 6c 5f 4e 6f  r to call Tcl_No
3a60: 74 69 66 79 43 68 61 6e 6e 65 6c 20 2a 2f 0a 20  tifyChannel */. 
3a70: 20 20 20 69 66 20 28 28 6d 61 73 6b 20 26 20 54     if ((mask & T
3a80: 43 4c 5f 52 45 41 44 41 42 4c 45 29 20 26 26 20  CL_READABLE) && 
3a90: 28 54 63 6c 5f 49 6e 70 75 74 42 75 66 66 65 72  (Tcl_InputBuffer
3aa0: 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  ed(statePtr->sel
3ab0: 66 29 20 3e 20 30 29 29 20 7b 0a 09 73 74 61 74  f) > 0)) {..stat
3ac0: 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 54 63  ePtr->timer = Tc
3ad0: 6c 5f 43 72 65 61 74 65 54 69 6d 65 72 48 61 6e  l_CreateTimerHan
3ae0: 64 6c 65 72 28 52 45 41 44 5f 44 45 4c 41 59 2c  dler(READ_DELAY,
3af0: 20 44 69 67 65 73 74 54 69 6d 65 72 48 61 6e 64   DigestTimerHand
3b00: 6c 65 72 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  ler, (ClientData
3b10: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20  ) statePtr);.   
3b20: 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d   }.}../*. *-----
3b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b70: 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 47 65  -. *. * DigestGe
3b80: 74 48 61 6e 64 6c 65 50 72 6f 63 20 2d 2d 0a 20  tHandleProc --. 
3b90: 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 66 72 6f 6d  *. *.Called from
3ba0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 48   Tcl_GetChannelH
3bb0: 61 6e 64 6c 65 20 74 6f 20 72 65 74 72 69 65 76  andle to retriev
3bc0: 65 20 4f 53 20 73 70 65 63 69 66 69 63 20 66 69  e OS specific fi
3bd0: 6c 65 20 68 61 6e 64 6c 65 0a 20 2a 09 66 72 6f  le handle. *.fro
3be0: 6d 20 69 6e 73 69 64 65 20 74 68 69 73 20 63 68  m inside this ch
3bf0: 61 6e 6e 65 6c 2e 20 4e 6f 74 20 75 73 65 64 20  annel. Not used 
3c00: 66 6f 72 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  for transformati
3c10: 6f 6e 73 3f 0a 20 2a 0a 20 2a 20 52 65 74 75 72  ons?. *. * Retur
3c20: 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 66 6f  ns:. *.TCL_OK fo
3c30: 72 20 73 75 63 63 65 73 73 20 6f 72 20 54 43 4c  r success or TCL
3c40: 5f 45 52 52 4f 52 20 66 6f 72 20 65 72 72 6f 72  _ERROR for error
3c50: 20 6f 72 20 69 66 20 6e 6f 74 20 73 75 70 70 6f   or if not suppo
3c60: 72 74 65 64 2e 20 49 66 0a 20 2a 09 64 69 72 65  rted. If. *.dire
3c70: 63 74 69 6f 6e 20 69 73 20 54 43 4c 5f 52 45 41  ction is TCL_REA
3c80: 44 41 42 4c 45 2c 20 73 65 74 73 20 68 61 6e 64  DABLE, sets hand
3c90: 6c 65 50 74 72 20 74 6f 20 74 68 65 20 68 61 6e  lePtr to the han
3ca0: 64 6c 65 20 75 73 65 64 20 66 6f 72 0a 20 2a 09  dle used for. *.
3cb0: 69 6e 70 75 74 2c 20 6f 72 20 69 66 20 54 43 4c  input, or if TCL
3cc0: 5f 57 52 49 54 41 42 4c 45 20 73 65 74 73 20 74  _WRITABLE sets t
3cd0: 6f 20 74 68 65 20 68 61 6e 64 6c 65 20 75 73 65  o the handle use
3ce0: 64 20 66 6f 72 20 6f 75 74 70 75 74 2e 0a 20 2a  d for output.. *
3cf0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
3d00: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d  :. *.None. *. *-
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 0a 20 2a 2f 0a 69 6e 74 20 44 69  -----. */.int Di
3d60: 67 65 73 74 47 65 74 48 61 6e 64 6c 65 50 72 6f  gestGetHandlePro
3d70: 63 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  c(ClientData cli
3d80: 65 6e 74 44 61 74 61 2c 20 69 6e 74 20 64 69 72  entData, int dir
3d90: 65 63 74 69 6f 6e 2c 20 43 6c 69 65 6e 74 44 61  ection, ClientDa
3da0: 74 61 20 2a 68 61 6e 64 6c 65 50 74 72 29 20 7b  ta *handlePtr) {
3db0: 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65  .    DigestState
3dc0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44 69   *statePtr = (Di
3dd0: 67 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69  gestState *) cli
3de0: 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 69 66  entData;..    if
3df0: 20 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66   (statePtr->self
3e00: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c   == (Tcl_Channel
3e10: 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  ) NULL) {..retur
3e20: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
3e30: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63   }.    return Tc
3e40: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 48 61 6e 64  l_GetChannelHand
3e50: 6c 65 28 54 63 6c 5f 47 65 74 53 74 61 63 6b 65  le(Tcl_GetStacke
3e60: 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74  dChannel(statePt
3e70: 72 2d 3e 73 65 6c 66 29 2c 20 64 69 72 65 63 74  r->self), direct
3e80: 69 6f 6e 2c 20 68 61 6e 64 6c 65 50 74 72 29 3b  ion, handlePtr);
3e90: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
3ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
3ee0: 20 2a 0a 20 2a 20 44 69 67 65 73 74 4e 6f 74 69   *. * DigestNoti
3ef0: 66 79 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09  fyProc --. *. *.
3f00: 43 61 6c 6c 65 64 20 62 79 20 54 63 6c 20 74 6f  Called by Tcl to
3f10: 20 69 6e 66 6f 72 6d 20 75 73 20 6f 66 20 61 63   inform us of ac
3f20: 74 69 76 69 74 79 20 6f 6e 20 74 68 65 20 75 6e  tivity on the un
3f30: 64 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c  derlying channel
3f40: 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a  .. *. * Returns:
3f50: 0a 20 2a 09 55 6e 63 68 61 6e 67 65 64 20 69 6e  . *.Unchanged in
3f60: 74 65 72 65 73 74 4d 61 73 6b 20 77 68 69 63 68  terestMask which
3f70: 20 69 73 20 61 6e 20 4f 52 2d 65 64 20 63 6f 6d   is an OR-ed com
3f80: 62 69 6e 61 74 69 6f 6e 20 6f 66 20 54 43 4c 5f  bination of TCL_
3f90: 52 45 41 44 41 42 4c 45 20 6f 72 20 54 43 4c 5f  READABLE or TCL_
3fa0: 57 52 49 54 41 42 4c 45 0a 20 2a 0a 20 2a 20 53  WRITABLE. *. * S
3fb0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
3fc0: 43 61 6e 63 65 6c 73 20 61 6e 79 20 70 65 6e 64  Cancels any pend
3fd0: 69 6e 67 20 74 69 6d 65 72 2e 0a 20 2a 0a 20 2a  ing timer.. *. *
3fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4020: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44  ------. */.int D
4030: 69 67 65 73 74 4e 6f 74 69 66 79 50 72 6f 63 28  igestNotifyProc(
4040: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
4050: 74 44 61 74 61 2c 20 69 6e 74 20 69 6e 74 65 72  tData, int inter
4060: 65 73 74 4d 61 73 6b 29 20 7b 0a 20 20 20 20 44  estMask) {.    D
4070: 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74  igestState *stat
4080: 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74  ePtr = (DigestSt
4090: 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74  ate *) clientDat
40a0: 61 3b 0a 0a 20 20 20 20 2f 2a 20 53 6b 69 70 20  a;..    /* Skip 
40b0: 74 69 6d 65 72 20 65 76 65 6e 74 20 61 73 20 72  timer event as r
40c0: 65 64 75 6e 64 61 6e 74 20 2a 2f 0a 20 20 20 20  edundant */.    
40d0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69  if (statePtr->ti
40e0: 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65  mer != (Tcl_Time
40f0: 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a  rToken) NULL) {.
4100: 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72  .Tcl_DeleteTimer
4110: 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72  Handler(statePtr
4120: 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65  ->timer);..state
4130: 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63  Ptr->timer = (Tc
4140: 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55  l_TimerToken) NU
4150: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  LL;.    }.    re
4160: 74 75 72 6e 20 69 6e 74 65 72 65 73 74 4d 61 73  turn interestMas
4170: 6b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 0a 20 2a 20 43  k;.}../*. *. * C
4180: 68 61 6e 6e 65 6c 20 74 79 70 65 20 73 74 72 75  hannel type stru
4190: 63 74 75 72 65 20 64 65 66 69 6e 69 74 69 6f 6e  cture definition
41a0: 20 66 6f 72 20 64 69 67 65 73 74 20 74 72 61 6e   for digest tran
41b0: 73 66 6f 72 6d 61 74 69 6f 6e 73 2e 0a 20 2a 0a  sformations.. *.
41c0: 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74   */.static const
41d0: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65   Tcl_ChannelType
41e0: 20 64 69 67 65 73 74 43 68 61 6e 6e 65 6c 54 79   digestChannelTy
41f0: 70 65 20 3d 20 7b 0a 20 20 20 20 22 64 69 67 65  pe = {.    "dige
4200: 73 74 22 2c 09 09 09 2f 2a 20 54 79 70 65 20 6e  st",.../* Type n
4210: 61 6d 65 20 2a 2f 0a 20 20 20 20 54 43 4c 5f 43  ame */.    TCL_C
4220: 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 35  HANNEL_VERSION_5
4230: 2c 09 2f 2a 20 76 35 20 63 68 61 6e 6e 65 6c 20  ,./* v5 channel 
4240: 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 43 6c 6f  */.    DigestClo
4250: 73 65 50 72 6f 63 2c 09 09 2f 2a 20 43 6c 6f 73  seProc,../* Clos
4260: 65 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 44 69  e proc */.    Di
4270: 67 65 73 74 49 6e 70 75 74 50 72 6f 63 2c 09 09  gestInputProc,..
4280: 2f 2a 20 49 6e 70 75 74 20 70 72 6f 63 20 2a 2f  /* Input proc */
4290: 0a 20 20 20 20 44 69 67 65 73 74 4f 75 74 70 75  .    DigestOutpu
42a0: 74 50 72 6f 63 2c 09 09 2f 2a 20 4f 75 74 70 75  tProc,../* Outpu
42b0: 74 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 4e 55  t proc */.    NU
42c0: 4c 4c 2c 09 09 09 2f 2a 20 53 65 65 6b 20 70 72  LL,.../* Seek pr
42d0: 6f 63 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74  oc */.    Digest
42e0: 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 2c 09 2f  SetOptionProc,./
42f0: 2a 20 53 65 74 20 6f 70 74 69 6f 6e 20 70 72 6f  * Set option pro
4300: 63 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 47  c */.    DigestG
4310: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 2c 09 2f 2a  etOptionProc,./*
4320: 20 47 65 74 20 6f 70 74 69 6f 6e 20 70 72 6f 63   Get option proc
4330: 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 57 61   */.    DigestWa
4340: 74 63 68 50 72 6f 63 2c 09 09 2f 2a 20 49 6e 69  tchProc,../* Ini
4350: 74 69 61 6c 69 7a 65 20 6e 6f 74 69 66 69 65 72  tialize notifier
4360: 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 47 65   */.    DigestGe
4370: 74 48 61 6e 64 6c 65 50 72 6f 63 2c 09 2f 2a 20  tHandleProc,./* 
4380: 47 65 74 20 4f 53 20 68 61 6e 64 6c 65 73 20 6f  Get OS handles o
4390: 75 74 20 6f 66 20 63 68 61 6e 6e 65 6c 20 2a 2f  ut of channel */
43a0: 0a 20 20 20 20 44 69 67 65 73 74 43 6c 6f 73 65  .    DigestClose
43b0: 32 50 72 6f 63 2c 09 09 2f 2a 20 63 6c 6f 73 65  2Proc,../* close
43c0: 32 70 72 6f 63 20 2a 2f 0a 20 20 20 20 44 69 67  2proc */.    Dig
43d0: 65 73 74 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63  estBlockModeProc
43e0: 2c 09 2f 2a 20 53 65 74 20 62 6c 6f 63 6b 69 6e  ,./* Set blockin
43f0: 67 2f 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f  g/nonblocking mo
4400: 64 65 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09  de*/.    NULL,..
4410: 09 2f 2a 20 46 6c 75 73 68 20 70 72 6f 63 20 2a  ./* Flush proc *
4420: 2f 0a 20 20 20 20 44 69 67 65 73 74 4e 6f 74 69  /.    DigestNoti
4430: 66 79 50 72 6f 63 2c 09 09 2f 2a 20 48 61 6e 64  fyProc,../* Hand
4440: 6c 69 6e 67 20 6f 66 20 65 76 65 6e 74 73 20 62  ling of events b
4450: 75 62 62 6c 69 6e 67 20 75 70 20 2a 2f 0a 20 20  ubbling up */.  
4460: 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 57 69 64    NULL,.../* Wid
4470: 65 20 73 65 65 6b 20 70 72 6f 63 20 2a 2f 0a 20  e seek proc */. 
4480: 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 54 68     NULL,.../* Th
4490: 72 65 61 64 20 61 63 74 69 6f 6e 20 2a 2f 0a 20  read action */. 
44a0: 20 20 20 4e 55 4c 4c 09 09 09 2f 2a 20 54 72 75     NULL.../* Tru
44b0: 6e 63 61 74 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  ncate */.};../*.
44c0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
44d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
44e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
44f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4500: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44  --------. *. * D
4510: 69 67 65 73 74 43 68 61 6e 6e 65 6c 20 2d 2d 0a  igestChannel --.
4520: 20 2a 0a 20 2a 09 43 72 65 61 74 65 20 61 20 73   *. *.Create a s
4530: 74 61 63 6b 65 64 20 63 68 61 6e 6e 65 6c 20 66  tacked channel f
4540: 6f 72 20 61 20 6d 65 73 73 61 67 65 20 64 69 67  or a message dig
4550: 65 73 74 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  est transformati
4560: 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  on.. *. * Return
4570: 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20  s:. *.TCL_OK or 
4580: 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20  TCL_ERROR. *. * 
4590: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
45a0: 09 41 64 64 73 20 74 72 61 6e 73 66 6f 72 6d 20  .Adds transform 
45b0: 74 6f 20 63 68 61 6e 6e 65 6c 20 61 6e 64 20 73  to channel and s
45c0: 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20 63 68  ets result to ch
45d0: 61 6e 6e 65 6c 20 6e 61 6d 65 20 6f 72 20 65 72  annel name or er
45e0: 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a  ror message.. *.
45f0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
4600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4630: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
4640: 74 69 63 20 69 6e 74 0a 44 69 67 65 73 74 43 68  tic int.DigestCh
4650: 61 6e 6e 65 6c 28 54 63 6c 5f 49 6e 74 65 72 70  annel(Tcl_Interp
4660: 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74 20   *interp, const 
4670: 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c 2c 20 63  char *channel, c
4680: 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 2c  onst EVP_MD *md,
4690: 20 69 6e 74 20 66 6f 72 6d 61 74 2c 0a 09 54 63   int format,..Tc
46a0: 6c 5f 4f 62 6a 20 2a 6b 65 79 4f 62 6a 29 20 7b  l_Obj *keyObj) {
46b0: 0a 20 20 20 20 69 6e 74 20 72 65 73 2c 20 6d 6f  .    int res, mo
46c0: 64 65 3b 20 2f 2a 20 4f 52 2d 65 64 20 63 6f 6d  de; /* OR-ed com
46d0: 62 69 6e 61 74 69 6f 6e 20 6f 66 20 54 43 4c 5f  bination of TCL_
46e0: 52 45 41 44 41 42 4c 45 20 61 6e 64 20 54 43 4c  READABLE and TCL
46f0: 5f 57 52 49 54 41 42 4c 45 20 2a 2f 0a 20 20 20  _WRITABLE */.   
4700: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61   Tcl_Channel cha
4710: 6e 3b 0a 20 20 20 20 44 69 67 65 73 74 53 74 61  n;.    DigestSta
4720: 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 20  te *statePtr;.  
4730: 20 20 45 56 50 5f 4d 44 5f 43 54 58 20 2a 63 74    EVP_MD_CTX *ct
4740: 78 20 3d 20 28 45 56 50 5f 4d 44 5f 43 54 58 20  x = (EVP_MD_CTX 
4750: 2a 29 20 4e 55 4c 4c 3b 0a 20 20 20 20 48 4d 41  *) NULL;.    HMA
4760: 43 5f 43 54 58 20 2a 68 63 74 78 20 3d 20 28 48  C_CTX *hctx = (H
4770: 4d 41 43 5f 43 54 58 20 2a 29 20 4e 55 4c 4c 3b  MAC_CTX *) NULL;
4780: 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74  ..    /* Validat
4790: 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 69 66  e args */.    if
47a0: 20 28 63 68 61 6e 6e 65 6c 20 3d 3d 20 28 63 6f   (channel == (co
47b0: 6e 73 74 20 63 68 61 72 20 2a 29 20 4e 55 4c 4c  nst char *) NULL
47c0: 20 7c 7c 20 6d 64 20 3d 3d 20 28 63 6f 6e 73 74   || md == (const
47d0: 20 45 56 50 5f 4d 44 20 2a 29 20 4e 55 4c 4c 29   EVP_MD *) NULL)
47e0: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
47f0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
4800: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43   chan = Tcl_GetC
4810: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63  hannel(interp, c
4820: 68 61 6e 6e 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a  hannel, &mode);.
4830: 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20      if (chan == 
4840: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
4850: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  LL) {..return TC
4860: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
4870: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
4880: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
4890: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e  he topmost chann
48a0: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d  el */.    chan =
48b0: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e   Tcl_GetTopChann
48c0: 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f  el(chan);..    /
48d0: 2a 20 43 72 65 61 74 65 20 69 6e 74 65 72 6e 61  * Create interna
48e0: 6c 20 73 74 6f 72 61 67 65 20 73 74 72 75 63 74  l storage struct
48f0: 75 72 65 20 2a 2f 0a 20 20 20 20 73 74 61 74 65  ure */.    state
4900: 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 61  Ptr = (DigestSta
4910: 74 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75  te *) ckalloc((u
4920: 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 6f 66 28  nsigned) sizeof(
4930: 44 69 67 65 73 74 53 74 61 74 65 29 29 3b 0a 20  DigestState));. 
4940: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 20     if (statePtr 
4950: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6d 65 6d 73  != NULL) {..mems
4960: 65 74 28 73 74 61 74 65 50 74 72 2c 20 30 2c 20  et(statePtr, 0, 
4970: 73 69 7a 65 6f 66 28 44 69 67 65 73 74 53 74 61  sizeof(DigestSta
4980: 74 65 29 29 3b 0a 09 73 74 61 74 65 50 74 72 2d  te));..statePtr-
4990: 3e 73 65 6c 66 09 3d 20 63 68 61 6e 3b 09 09 2f  >self.= chan;../
49a0: 2a 20 54 68 69 73 20 73 6f 63 6b 65 74 20 63 68  * This socket ch
49b0: 61 6e 6e 65 6c 20 2a 2f 0a 09 73 74 61 74 65 50  annel */..stateP
49c0: 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c  tr->timer = (Tcl
49d0: 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c  _TimerToken) NUL
49e0: 4c 3b 09 2f 2a 20 54 69 6d 65 72 20 74 6f 20 66  L;./* Timer to f
49f0: 6c 75 73 68 20 64 61 74 61 20 2a 2f 0a 09 73 74  lush data */..st
4a00: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 3d 20  atePtr->flags = 
4a10: 30 3b 09 09 2f 2a 20 43 68 61 6e 20 63 6f 6e 66  0;../* Chan conf
4a20: 69 67 20 66 6c 61 67 73 20 2a 2f 0a 09 73 74 61  ig flags */..sta
4a30: 74 65 50 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b  tePtr->watchMask
4a40: 20 3d 20 30 3b 09 2f 2a 20 43 75 72 72 65 6e 74   = 0;./* Current
4a50: 20 57 61 74 63 68 50 72 6f 63 20 6d 61 73 6b 20   WatchProc mask 
4a60: 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 6d 6f  */..statePtr->mo
4a70: 64 65 09 3d 20 6d 6f 64 65 3b 09 09 2f 2a 20 43  de.= mode;../* C
4a80: 75 72 72 65 6e 74 20 6d 6f 64 65 20 6f 66 20 70  urrent mode of p
4a90: 61 72 65 6e 74 20 63 68 61 6e 6e 65 6c 20 2a 2f  arent channel */
4aa0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d  ..statePtr->form
4ab0: 61 74 20 3d 20 66 6f 72 6d 61 74 3b 09 2f 2a 20  at = format;./* 
4ac0: 4f 75 74 70 75 74 20 66 6f 72 6d 61 74 20 2a 2f  Output format */
4ad0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  ..statePtr->inte
4ae0: 72 70 20 3d 20 69 6e 74 65 72 70 3b 09 2f 2a 20  rp = interp;./* 
4af0: 43 75 72 72 65 6e 74 20 69 6e 74 65 72 70 72 65  Current interpre
4b00: 74 65 72 20 2a 2f 0a 09 73 74 61 74 65 50 74 72  ter */..statePtr
4b10: 2d 3e 63 74 78 20 3d 20 63 74 78 3b 09 09 2f 2a  ->ctx = ctx;../*
4b20: 20 4d 44 20 43 6f 6e 74 65 78 74 20 2a 2f 0a 09   MD Context */..
4b30: 73 74 61 74 65 50 74 72 2d 3e 68 63 74 78 20 3d  statePtr->hctx =
4b40: 20 68 63 74 78 3b 09 09 2f 2a 20 48 4d 41 43 20   hctx;../* HMAC 
4b50: 43 6f 6e 74 65 78 74 20 2a 2f 0a 09 73 74 61 74  Context */..stat
4b60: 65 50 74 72 2d 3e 6d 61 63 20 3d 20 4e 55 4c 4c  ePtr->mac = NULL
4b70: 3b 09 09 2f 2a 20 4d 41 43 20 43 6f 6e 74 65 78  ;../* MAC Contex
4b80: 74 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 65 20  t */.    } else 
4b90: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
4ba0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 49 6e 69  ult(interp, "Ini
4bb0: 74 69 61 6c 69 7a 65 20 64 69 67 65 73 74 20 65  tialize digest e
4bc0: 72 72 6f 72 3a 20 6d 65 6d 6f 72 79 20 61 6c 6c  rror: memory all
4bd0: 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 22  ocation failure"
4be0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
4bf0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
4c00: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
4c10: 2f 2a 20 43 72 65 61 74 65 20 6d 65 73 73 61 67  /* Create messag
4c20: 65 20 64 69 67 65 73 74 20 63 6f 6e 74 65 78 74  e digest context
4c30: 20 2a 2f 0a 20 20 20 20 69 66 20 28 6b 65 79 4f   */.    if (keyO
4c40: 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63  bj == NULL) {..c
4c50: 74 78 20 3d 20 45 56 50 5f 4d 44 5f 43 54 58 5f  tx = EVP_MD_CTX_
4c60: 6e 65 77 28 29 3b 0a 20 20 20 20 7d 20 65 6c 73  new();.    } els
4c70: 65 20 7b 0a 09 68 63 74 78 20 3d 20 48 4d 41 43  e {..hctx = HMAC
4c80: 5f 43 54 58 5f 6e 65 77 28 29 3b 0a 20 20 20 20  _CTX_new();.    
4c90: 7d 0a 20 20 20 20 69 66 20 28 63 74 78 20 21 3d  }.    if (ctx !=
4ca0: 20 4e 55 4c 4c 20 7c 7c 20 68 63 74 78 20 21 3d   NULL || hctx !=
4cb0: 20 4e 55 4c 4c 29 20 7b 0a 09 73 74 61 74 65 50   NULL) {..stateP
4cc0: 74 72 2d 3e 63 74 78 20 3d 20 63 74 78 3b 0a 09  tr->ctx = ctx;..
4cd0: 73 74 61 74 65 50 74 72 2d 3e 68 63 74 78 20 3d  statePtr->hctx =
4ce0: 20 68 63 74 78 3b 0a 20 20 20 20 7d 20 65 6c 73   hctx;.    } els
4cf0: 65 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  e {..Tcl_AppendR
4d00: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43  esult(interp, "C
4d10: 72 65 61 74 65 20 64 69 67 65 73 74 20 63 6f 6e  reate digest con
4d20: 74 65 78 74 20 66 61 69 6c 65 64 3a 20 22 2c 20  text failed: ", 
4d30: 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b  REASON(), NULL);
4d40: 0a 09 44 69 67 65 73 74 46 72 65 65 28 73 74 61  ..DigestFree(sta
4d50: 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20  tePtr);..return 
4d60: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
4d70: 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  ..    /* Initial
4d80: 69 7a 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f  ize hash functio
4d90: 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 6b 65 79  n */.    if (key
4da0: 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Obj == NULL) {..
4db0: 72 65 73 20 3d 20 45 56 50 5f 44 69 67 65 73 74  res = EVP_Digest
4dc0: 49 6e 69 74 5f 65 78 28 63 74 78 2c 20 6d 64 2c  Init_ex(ctx, md,
4dd0: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 20 65 6c   NULL);.    } el
4de0: 73 65 20 7b 0a 09 69 6e 74 20 6b 65 79 5f 6c 65  se {..int key_le
4df0: 6e 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  n;..unsigned cha
4e00: 72 20 2a 6b 65 79 20 3d 20 54 63 6c 5f 47 65 74  r *key = Tcl_Get
4e10: 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
4e20: 28 6b 65 79 4f 62 6a 2c 20 26 6b 65 79 5f 6c 65  (keyObj, &key_le
4e30: 6e 29 3b 0a 09 72 65 73 20 3d 20 48 4d 41 43 5f  n);..res = HMAC_
4e40: 49 6e 69 74 5f 65 78 28 68 63 74 78 2c 20 28 63  Init_ex(hctx, (c
4e50: 6f 6e 73 74 20 76 6f 69 64 20 2a 29 20 6b 65 79  onst void *) key
4e60: 2c 20 6b 65 79 5f 6c 65 6e 2c 20 6d 64 2c 20 4e  , key_len, md, N
4e70: 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ULL);.    }.    
4e80: 69 66 20 28 21 72 65 73 29 20 7b 0a 09 54 63 6c  if (!res) {..Tcl
4e90: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
4ea0: 74 65 72 70 2c 20 22 49 6e 69 74 69 61 6c 69 7a  terp, "Initializ
4eb0: 65 20 64 69 67 65 73 74 20 66 61 69 6c 65 64 3a  e digest failed:
4ec0: 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63   ", REASON(), (c
4ed0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 44  har *) NULL);..D
4ee0: 69 67 65 73 74 46 72 65 65 28 73 74 61 74 65 50  igestFree(stateP
4ef0: 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  tr);..return TCL
4f00: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
4f10: 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 20     /* Configure 
4f20: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 54  channel */.    T
4f30: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_SetChannelOpt
4f40: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  ion(interp, chan
4f50: 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22  , "-translation"
4f60: 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a 20 20 20  , "binary");.   
4f70: 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e   if (Tcl_GetChan
4f80: 6e 65 6c 42 75 66 66 65 72 53 69 7a 65 28 63 68  nelBufferSize(ch
4f90: 61 6e 29 20 3c 20 45 56 50 5f 4d 41 58 5f 4d 44  an) < EVP_MAX_MD
4fa0: 5f 53 49 5a 45 20 2a 20 32 29 20 7b 0a 09 54 63  _SIZE * 2) {..Tc
4fb0: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 42 75 66 66  l_SetChannelBuff
4fc0: 65 72 53 69 7a 65 28 63 68 61 6e 2c 20 45 56 50  erSize(chan, EVP
4fd0: 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45 20 2a 20 32  _MAX_MD_SIZE * 2
4fe0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
4ff0: 20 53 74 61 63 6b 20 63 68 61 6e 6e 65 6c 20 2a   Stack channel *
5000: 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  /.    statePtr->
5010: 73 65 6c 66 20 3d 20 54 63 6c 5f 53 74 61 63 6b  self = Tcl_Stack
5020: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
5030: 26 64 69 67 65 73 74 43 68 61 6e 6e 65 6c 54 79  &digestChannelTy
5040: 70 65 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  pe, (ClientData)
5050: 20 73 74 61 74 65 50 74 72 2c 20 6d 6f 64 65 2c   statePtr, mode,
5060: 20 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28   chan);.    if (
5070: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d  statePtr->self =
5080: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
5090: 4e 55 4c 4c 29 20 7b 0a 09 44 69 67 65 73 74 46  NULL) {..DigestF
50a0: 72 65 65 28 73 74 61 74 65 50 74 72 29 3b 0a 09  ree(statePtr);..
50b0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
50c0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c  ;.    }..    Tcl
50d0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
50e0: 70 2c 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f  p, (char *) Tcl_
50f0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63  GetChannelName(c
5100: 68 61 6e 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49  han), TCL_VOLATI
5110: 4c 45 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  LE);.    return 
5120: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  TCL_OK;.}../*. *
5130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5170: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e 73  ------. *. * Uns
5180: 74 61 63 6b 20 43 68 61 6e 6e 65 6c 20 2d 2d 0a  tack Channel --.
5190: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65   *. *.This proce
51a0: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20  dure is invoked 
51b0: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22  to process the "
51c0: 75 6e 73 74 61 63 6b 22 20 54 43 4c 20 63 6f 6d  unstack" TCL com
51d0: 6d 61 6e 64 2e 0a 20 2a 09 53 65 65 20 74 68 65  mand.. *.See the
51e0: 20 75 73 65 72 20 64 6f 63 75 6d 65 6e 74 61 74   user documentat
51f0: 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c 73 20  ion for details 
5200: 6f 6e 20 77 68 61 74 20 69 74 20 64 6f 65 73 2e  on what it does.
5210: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a  . *. * Returns:.
5220: 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c   *.TCL_OK or TCL
5230: 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64  _ERROR. *. * Sid
5240: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 52 65  e effects:. *.Re
5250: 6d 6f 76 65 73 20 74 72 61 6e 73 66 6f 72 6d 20  moves transform 
5260: 66 72 6f 6d 20 63 68 61 6e 6e 65 6c 20 6f 72 20  from channel or 
5270: 73 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20 65  sets result to e
5280: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a  rror message.. *
5290: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
52a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
52e0: 61 74 69 63 20 69 6e 74 0a 55 6e 73 74 61 63 6b  atic int.Unstack
52f0: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74  ObjCmd(ClientDat
5300: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63  a clientData, Tc
5310: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
5320: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f  , int objc, Tcl_
5330: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b  Obj *const objv[
5340: 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61  ]) {.    Tcl_Cha
5350: 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 69  nnel chan;.    i
5360: 6e 74 20 6d 6f 64 65 3b 20 2f 2a 20 4f 52 2d 65  nt mode; /* OR-e
5370: 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  d combination of
5380: 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 61 6e   TCL_READABLE an
5390: 64 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 20 20  d TCL_WRITABLE  
53a0: 2a 2f 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63  */..    if (objc
53b0: 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72   != 2) {..Tcl_Wr
53c0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
53d0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61  p, 1, objv, "cha
53e0: 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20  nnel");..return 
53f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
5400: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 68 61  ..    /* Get cha
5410: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e  nnel */.    chan
5420: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   = Tcl_GetChanne
5430: 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  l(interp, Tcl_Ge
5440: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
5450: 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 26  bjv[1], NULL), &
5460: 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63  mode);.    if (c
5470: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  han == (Tcl_Chan
5480: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  nel) NULL) {..re
5490: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
54a0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
54b0: 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61  ke sure to opera
54c0: 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73  te on the topmos
54d0: 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20  t channel */.   
54e0: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54   chan = Tcl_GetT
54f0: 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b  opChannel(chan);
5500: 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69  ..    /* Check i
5510: 66 20 64 69 67 65 73 74 20 63 68 61 6e 6e 65 6c  f digest channel
5520: 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f   */.    if (Tcl_
5530: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63  GetChannelType(c
5540: 68 61 6e 29 20 21 3d 20 26 64 69 67 65 73 74 43  han) != &digestC
5550: 68 61 6e 6e 65 6c 54 79 70 65 29 20 7b 0a 09 54  hannelType) {..T
5560: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
5570: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61  interp, "bad cha
5580: 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65  nnel \"", Tcl_Ge
5590: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61  tChannelName(cha
55a0: 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f  n),..    "\": no
55b0: 74 20 61 20 64 69 67 65 73 74 20 63 68 61 6e 6e  t a digest chann
55c0: 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c  el", NULL);..Tcl
55d0: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e  _SetErrorCode(in
55e0: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 55 4e  terp, "TLS", "UN
55f0: 53 54 41 43 4b 22 2c 20 22 43 48 41 4e 4e 45 4c  STACK", "CHANNEL
5600: 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63  ", "INVALID", (c
5610: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72  har *) NULL);..r
5620: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
5630: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50  .    }..    /* P
5640: 6f 70 20 74 72 61 6e 73 66 6f 72 6d 20 66 72 6f  op transform fro
5650: 6d 20 63 68 61 6e 6e 65 6c 2c 20 6c 65 61 76 65  m channel, leave
5660: 73 20 65 72 72 6f 72 20 69 6e 66 6f 20 69 6e 20  s error info in 
5670: 69 6e 74 65 72 70 20 72 65 73 75 6c 74 20 2a 2f  interp result */
5680: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 55 6e 73  .    if (Tcl_Uns
5690: 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65  tackChannel(inte
56a0: 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54 43 4c  rp, chan) == TCL
56b0: 5f 45 52 52 4f 52 29 20 7b 0a 09 72 65 74 75 72  _ERROR) {..retur
56c0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
56d0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43   }.    return TC
56e0: 4c 5f 4f 4b 3b 0a 20 20 20 20 09 63 6c 69 65 6e  L_OK;.    .clien
56f0: 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61  tData = clientDa
5700: 74 61 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ta;.}../********
5710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
5750: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
5760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5790: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67  ------. *. * Dig
57a0: 65 73 74 48 61 73 68 46 75 6e 63 74 69 6f 6e 20  estHashFunction 
57b0: 2d 2d 0a 20 2a 0a 20 2a 09 20 43 61 6c 63 75 6c  --. *. *. Calcul
57c0: 61 74 65 20 6d 65 73 73 61 67 65 20 64 69 67 65  ate message dige
57d0: 73 74 20 75 73 69 6e 67 20 68 61 73 68 20 66 75  st using hash fu
57e0: 6e 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65  nction.. *. * Re
57f0: 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b  turns:. *.TCL_OK
5800: 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a   or TCL_ERROR. *
5810: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
5820: 3a 0a 20 2a 09 53 65 74 73 20 72 65 73 75 6c 74  :. *.Sets result
5830: 20 74 6f 20 6d 65 73 73 61 67 65 20 64 69 67 65   to message dige
5840: 73 74 20 6f 72 20 65 72 72 6f 72 20 6d 65 73 73  st or error mess
5850: 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  age. *. *-------
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 2d 2d 2d 0a 20 2a 2f  ------------. */
58a0: 0a 69 6e 74 0a 44 69 67 65 73 74 48 61 73 68 46  .int.DigestHashF
58b0: 75 6e 63 74 69 6f 6e 28 54 63 6c 5f 49 6e 74 65  unction(Tcl_Inte
58c0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
58d0: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63  objc, Tcl_Obj *c
58e0: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 2c 0a 09 63 6f  onst objv[],..co
58f0: 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 2c 20  nst EVP_MD *md, 
5900: 69 6e 74 20 66 6f 72 6d 61 74 2c 20 54 63 6c 5f  int format, Tcl_
5910: 4f 62 6a 20 2a 6b 65 79 4f 62 6a 29 20 7b 0a 20  Obj *keyObj) {. 
5920: 20 20 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20     char *data;. 
5930: 20 20 20 69 6e 74 20 6c 65 6e 2c 20 72 65 73 3b     int len, res;
5940: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  .    unsigned in
5950: 74 20 6d 64 5f 6c 65 6e 3b 0a 20 20 20 20 75 6e  t md_len;.    un
5960: 73 69 67 6e 65 64 20 63 68 61 72 20 6d 64 5f 62  signed char md_b
5970: 75 66 5b 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49  uf[EVP_MAX_MD_SI
5980: 5a 45 5d 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62  ZE];..    if (ob
5990: 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f  jc != 2) {..Tcl_
59a0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
59b0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 64  erp, 1, objv, "d
59c0: 61 74 61 22 29 3b 0a 09 72 65 74 75 72 6e 20 54  ata");..return T
59d0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
59e0: 0a 20 20 20 20 2f 2a 20 47 65 74 20 64 61 74 61  .    /* Get data
59f0: 20 2a 2f 0a 20 20 20 20 64 61 74 61 20 3d 20 54   */.    data = T
5a00: 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46  cl_GetByteArrayF
5a10: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20  romObj(objv[1], 
5a20: 26 6c 65 6e 29 3b 0a 20 20 20 20 69 66 20 28 64  &len);.    if (d
5a30: 61 74 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 6c  ata == NULL || l
5a40: 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 54 63 6c 5f  en == 0) {..Tcl_
5a50: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
5a60: 2c 20 22 4e 6f 20 64 61 74 61 22 2c 20 4e 55 4c  , "No data", NUL
5a70: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  L);..return TCL_
5a80: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
5a90: 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 64    /* Calculate d
5aa0: 69 67 65 73 74 20 62 61 73 65 64 20 6f 6e 20 68  igest based on h
5ab0: 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ash function */.
5ac0: 20 20 20 20 69 66 20 28 6b 65 79 4f 62 6a 20 3d      if (keyObj =
5ad0: 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a 29 20 4e 55  = (Tcl_Obj *) NU
5ae0: 4c 4c 29 20 7b 0a 09 72 65 73 20 3d 20 45 56 50  LL) {..res = EVP
5af0: 5f 44 69 67 65 73 74 28 64 61 74 61 2c 20 28 73  _Digest(data, (s
5b00: 69 7a 65 5f 74 29 20 6c 65 6e 2c 20 6d 64 5f 62  ize_t) len, md_b
5b10: 75 66 2c 20 26 6d 64 5f 6c 65 6e 2c 20 6d 64 2c  uf, &md_len, md,
5b20: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 20 65 6c   NULL);.    } el
5b30: 73 65 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63  se {..unsigned c
5b40: 68 61 72 20 2a 6b 65 79 2c 20 2a 68 6d 61 63 20  har *key, *hmac 
5b50: 3d 20 4e 55 4c 4c 3b 0a 09 69 6e 74 20 6b 65 79  = NULL;..int key
5b60: 5f 6c 65 6e 3b 0a 0a 09 6b 65 79 20 3d 20 54 63  _len;...key = Tc
5b70: 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
5b80: 6f 6d 4f 62 6a 28 6b 65 79 4f 62 6a 2c 20 26 6b  omObj(keyObj, &k
5b90: 65 79 5f 6c 65 6e 29 3b 0a 09 68 6d 61 63 20 3d  ey_len);..hmac =
5ba0: 20 48 4d 41 43 28 6d 64 2c 20 28 63 6f 6e 73 74   HMAC(md, (const
5bb0: 20 76 6f 69 64 20 2a 29 20 6b 65 79 2c 20 6b 65   void *) key, ke
5bc0: 79 5f 6c 65 6e 2c 20 28 63 6f 6e 73 74 20 75 6e  y_len, (const un
5bd0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 64  signed char *) d
5be0: 61 74 61 2c 0a 09 20 20 20 20 28 73 69 7a 65 5f  ata,..    (size_
5bf0: 74 29 20 6c 65 6e 2c 20 6d 64 5f 62 75 66 2c 20  t) len, md_buf, 
5c00: 26 6d 64 5f 6c 65 6e 29 3b 0a 09 72 65 73 20 3d  &md_len);..res =
5c10: 20 28 68 6d 61 63 20 21 3d 20 4e 55 4c 4c 29 3b   (hmac != NULL);
5c20: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f  .    }..    /* O
5c30: 75 74 70 75 74 20 64 69 67 65 73 74 20 74 6f 20  utput digest to 
5c40: 72 65 73 75 6c 74 20 70 65 72 20 66 6f 72 6d 61  result per forma
5c50: 74 20 28 62 69 6e 20 6f 72 20 68 65 78 29 20 2a  t (bin or hex) *
5c60: 2f 0a 20 20 20 20 69 66 20 28 72 65 73 29 20 7b  /.    if (res) {
5c70: 0a 09 69 66 20 28 66 6f 72 6d 61 74 20 3d 3d 20  ..if (format == 
5c80: 42 49 4e 5f 46 4f 52 4d 41 54 29 20 7b 0a 09 20  BIN_FORMAT) {.. 
5c90: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
5ca0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
5cb0: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
5cc0: 6d 64 5f 62 75 66 2c 20 6d 64 5f 6c 65 6e 29 29  md_buf, md_len))
5cd0: 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  ;...} else {..  
5ce0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c    Tcl_Obj *resul
5cf0: 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f 62  tObj = Tcl_NewOb
5d00: 6a 28 29 3b 0a 09 20 20 20 20 75 6e 73 69 67 6e  j();..    unsign
5d10: 65 64 20 63 68 61 72 20 2a 70 74 72 20 3d 20 54  ed char *ptr = T
5d20: 63 6c 5f 53 65 74 42 79 74 65 41 72 72 61 79 4c  cl_SetByteArrayL
5d30: 65 6e 67 74 68 28 72 65 73 75 6c 74 4f 62 6a 2c  ength(resultObj,
5d40: 20 6d 64 5f 6c 65 6e 2a 32 29 3b 0a 0a 09 20 20   md_len*2);...  
5d50: 20 20 66 6f 72 20 28 75 6e 73 69 67 6e 65 64 20    for (unsigned 
5d60: 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 6d  int i = 0; i < m
5d70: 64 5f 6c 65 6e 3b 20 69 2b 2b 29 20 7b 0a 09 09  d_len; i++) {...
5d80: 2a 70 74 72 2b 2b 20 3d 20 68 65 78 5b 28 6d 64  *ptr++ = hex[(md
5d90: 5f 62 75 66 5b 69 5d 20 3e 3e 20 34 29 20 26 20  _buf[i] >> 4) & 
5da0: 30 78 30 46 5d 3b 0a 09 09 2a 70 74 72 2b 2b 20  0x0F];...*ptr++ 
5db0: 3d 20 68 65 78 5b 6d 64 5f 62 75 66 5b 69 5d 20  = hex[md_buf[i] 
5dc0: 26 20 30 78 30 46 5d 3b 0a 09 20 20 20 20 7d 0a  & 0x0F];..    }.
5dd0: 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c  .Tcl_SetObjResul
5de0: 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74  t(interp, result
5df0: 4f 62 6a 29 3b 0a 09 7d 0a 0a 20 20 20 20 7d 20  Obj);..}..    } 
5e00: 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 41 70 70 65  else {..Tcl_Appe
5e10: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
5e20: 20 22 48 61 73 68 20 63 61 6c 63 75 6c 61 74 69   "Hash calculati
5e30: 6f 6e 20 65 72 72 6f 72 3a 22 2c 20 52 45 41 53  on error:", REAS
5e40: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
5e50: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  ULL);..return TC
5e60: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
5e70: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
5e80: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ;.}../*. *------
5e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
5ed0: 0a 20 2a 20 44 69 67 65 73 74 4f 62 6a 43 6d 64  . * DigestObjCmd
5ee0: 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 75 72 6e   --. *. *.Return
5ef0: 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20   message digest 
5f00: 75 73 69 6e 67 20 75 73 65 72 20 73 70 65 63 69  using user speci
5f10: 66 69 65 64 20 68 61 73 68 20 66 75 6e 63 74 69  fied hash functi
5f20: 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  on.. *. * Return
5f30: 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20  s:. *.TCL_OK or 
5f40: 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20  TCL_ERROR. *. * 
5f50: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
5f60: 09 53 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20  .Sets result to 
5f70: 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20 6f  message digest o
5f80: 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  r error message.
5f90: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
5fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fd0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
5fe0: 74 69 63 20 69 6e 74 0a 44 69 67 65 73 74 4f 62  tic int.DigestOb
5ff0: 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20  jCmd(ClientData 
6000: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f  clientData, Tcl_
6010: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
6020: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
6030: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j *const objv[])
6040: 20 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 2c 20   {.    int idx, 
6050: 6c 65 6e 2c 20 66 6f 72 6d 61 74 20 3d 20 48 45  len, format = HE
6060: 58 5f 46 4f 52 4d 41 54 2c 20 6b 65 79 5f 6c 65  X_FORMAT, key_le
6070: 6e 20 3d 20 30 2c 20 64 61 74 61 5f 6c 65 6e 20  n = 0, data_len 
6080: 3d 20 30 2c 20 72 65 73 20 3d 20 54 43 4c 5f 4f  = 0, res = TCL_O
6090: 4b 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  K;.    const cha
60a0: 72 20 2a 64 69 67 65 73 74 6e 61 6d 65 2c 20 2a  r *digestname, *
60b0: 63 68 61 6e 6e 65 6c 20 3d 20 4e 55 4c 4c 3b 0a  channel = NULL;.
60c0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 64 61 74      Tcl_Obj *dat
60d0: 61 4f 62 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 66 69  aObj = NULL, *fi
60e0: 6c 65 4f 62 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 6b  leObj = NULL, *k
60f0: 65 79 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20  eyObj = NULL;.  
6100: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
6110: 2a 6b 65 79 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  *key = NULL;.   
6120: 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d   const EVP_MD *m
6130: 64 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 73 65  d;..    Tcl_Rese
6140: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  tResult(interp);
6150: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c  ..    if (objc <
6160: 20 33 20 7c 7c 20 6f 62 6a 63 20 3e 20 37 29 20   3 || objc > 7) 
6170: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  {..Tcl_WrongNumA
6180: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
6190: 62 6a 76 2c 20 22 74 79 70 65 20 3f 2d 62 69 6e  bjv, "type ?-bin
61a0: 7c 2d 68 65 78 3f 20 3f 2d 6b 65 79 20 68 6d 61  |-hex? ?-key hma
61b0: 63 5f 6b 65 79 3f 20 5b 2d 63 68 61 6e 6e 65 6c  c_key? [-channel
61c0: 20 63 68 61 6e 20 7c 20 2d 66 69 6c 65 20 66 69   chan | -file fi
61d0: 6c 65 6e 61 6d 65 20 7c 20 3f 2d 64 61 74 61 3f  lename | ?-data?
61e0: 20 64 61 74 61 5d 22 29 3b 0a 09 72 65 74 75 72   data]");..retur
61f0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
6200: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 64   }..    /* Get d
6210: 69 67 65 73 74 20 2a 2f 0a 20 20 20 20 64 69 67  igest */.    dig
6220: 65 73 74 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65  estname = Tcl_Ge
6230: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
6240: 62 6a 76 5b 31 5d 2c 20 26 6c 65 6e 29 3b 0a 20  bjv[1], &len);. 
6250: 20 20 20 69 66 20 28 64 69 67 65 73 74 6e 61 6d     if (digestnam
6260: 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 28 6d 64  e == NULL || (md
6270: 20 3d 20 45 56 50 5f 67 65 74 5f 64 69 67 65 73   = EVP_get_diges
6280: 74 62 79 6e 61 6d 65 28 64 69 67 65 73 74 6e 61  tbyname(digestna
6290: 6d 65 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  me)) == NULL) {.
62a0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
62b0: 74 28 69 6e 74 65 72 70 2c 20 22 49 6e 76 61 6c  t(interp, "Inval
62c0: 69 64 20 64 69 67 65 73 74 20 74 79 70 65 20 5c  id digest type \
62d0: 22 22 2c 20 64 69 67 65 73 74 6e 61 6d 65 2c 20  "", digestname, 
62e0: 22 5c 22 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65  "\"", NULL);..re
62f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6300: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 70      }..    /* Op
6310: 74 69 6d 61 6c 20 63 61 73 65 20 66 6f 72 20 62  timal case for b
6320: 6c 6f 62 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20  lob of data */. 
6330: 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 33     if (objc == 3
6340: 29 20 7b 0a 09 72 65 74 75 72 6e 20 44 69 67 65  ) {..return Dige
6350: 73 74 48 61 73 68 46 75 6e 63 74 69 6f 6e 28 69  stHashFunction(i
6360: 6e 74 65 72 70 2c 20 2d 2d 6f 62 6a 63 2c 20 2b  nterp, --objc, +
6370: 2b 6f 62 6a 76 2c 20 6d 64 2c 20 66 6f 72 6d 61  +objv, md, forma
6380: 74 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a  t, NULL);.    }.
6390: 0a 20 20 20 20 2f 2a 20 47 65 74 20 6f 70 74 69  .    /* Get opti
63a0: 6f 6e 73 20 2a 2f 0a 20 20 20 20 66 6f 72 20 28  ons */.    for (
63b0: 69 64 78 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f  idx = 2; idx < o
63c0: 62 6a 63 2d 31 3b 20 69 64 78 2b 2b 29 20 7b 0a  bjc-1; idx++) {.
63d0: 09 63 68 61 72 20 2a 6f 70 74 20 3d 20 54 63 6c  .char *opt = Tcl
63e0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
63f0: 6a 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 4e 55 4c  j(objv[idx], NUL
6400: 4c 29 3b 0a 0a 09 69 66 20 28 6f 70 74 5b 30 5d  L);...if (opt[0]
6410: 20 21 3d 20 27 2d 27 29 0a 09 20 20 20 20 62 72   != '-')..    br
6420: 65 61 6b 3b 0a 0a 09 4f 50 54 46 4c 41 47 28 22  eak;...OPTFLAG("
6430: 2d 62 69 6e 22 2c 20 66 6f 72 6d 61 74 2c 20 42  -bin", format, B
6440: 49 4e 5f 46 4f 52 4d 41 54 29 3b 0a 09 4f 50 54  IN_FORMAT);..OPT
6450: 46 4c 41 47 28 22 2d 62 69 6e 61 72 79 22 2c 20  FLAG("-binary", 
6460: 66 6f 72 6d 61 74 2c 20 42 49 4e 5f 46 4f 52 4d  format, BIN_FORM
6470: 41 54 29 3b 0a 09 4f 50 54 46 4c 41 47 28 22 2d  AT);..OPTFLAG("-
6480: 68 65 78 22 2c 20 66 6f 72 6d 61 74 2c 20 48 45  hex", format, HE
6490: 58 5f 46 4f 52 4d 41 54 29 3b 0a 09 4f 50 54 46  X_FORMAT);..OPTF
64a0: 4c 41 47 28 22 2d 68 65 78 61 64 65 63 69 6d 61  LAG("-hexadecima
64b0: 6c 22 2c 20 66 6f 72 6d 61 74 2c 20 48 45 58 5f  l", format, HEX_
64c0: 46 4f 52 4d 41 54 29 3b 0a 09 4f 50 54 4f 42 4a  FORMAT);..OPTOBJ
64d0: 28 22 2d 64 61 74 61 22 2c 20 64 61 74 61 4f 62  ("-data", dataOb
64e0: 6a 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 68  j);..OPTSTR("-ch
64f0: 61 6e 22 2c 20 63 68 61 6e 6e 65 6c 29 3b 0a 09  an", channel);..
6500: 4f 50 54 53 54 52 28 22 2d 63 68 61 6e 6e 65 6c  OPTSTR("-channel
6510: 22 2c 20 63 68 61 6e 6e 65 6c 29 3b 0a 09 4f 50  ", channel);..OP
6520: 54 4f 42 4a 28 22 2d 66 69 6c 65 22 2c 20 66 69  TOBJ("-file", fi
6530: 6c 65 4f 62 6a 29 3b 0a 09 4f 50 54 4f 42 4a 28  leObj);..OPTOBJ(
6540: 22 2d 66 69 6c 65 6e 61 6d 65 22 2c 20 66 69 6c  "-filename", fil
6550: 65 4f 62 6a 29 3b 0a 09 4f 50 54 4f 42 4a 28 22  eObj);..OPTOBJ("
6560: 2d 6b 65 79 22 2c 20 6b 65 79 4f 62 6a 29 3b 0a  -key", keyObj);.
6570: 0a 09 4f 50 54 42 41 44 28 22 6f 70 74 69 6f 6e  ..OPTBAD("option
6580: 22 2c 20 22 2d 62 69 6e 2c 20 2d 64 61 74 61 2c  ", "-bin, -data,
6590: 20 2d 66 69 6c 65 2c 20 2d 66 69 6c 65 6e 61 6d   -file, -filenam
65a0: 65 2c 20 2d 68 65 78 2c 20 6f 72 20 2d 6b 65 79  e, -hex, or -key
65b0: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ");..return TCL_
65c0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
65d0: 20 20 2f 2a 20 49 66 20 6e 6f 20 6f 70 74 69 6f    /* If no optio
65e0: 6e 20 66 6f 72 20 6c 61 73 74 20 61 72 67 2c 20  n for last arg, 
65f0: 74 68 65 6e 20 69 74 73 20 74 68 65 20 64 61 74  then its the dat
6600: 61 20 2a 2f 0a 20 20 20 20 69 66 20 28 69 64 78  a */.    if (idx
6610: 20 3c 20 6f 62 6a 63 29 20 7b 0a 09 64 61 74 61   < objc) {..data
6620: 4f 62 6a 20 3d 20 6f 62 6a 76 5b 69 64 78 5d 3b  Obj = objv[idx];
6630: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
6640: 61 6c 63 20 64 69 67 65 73 74 20 6f 6e 20 66 69  alc digest on fi
6650: 6c 65 2c 20 73 74 61 63 6b 65 64 20 63 68 61 6e  le, stacked chan
6660: 6e 65 6c 2c 20 6f 72 20 64 61 74 61 20 62 6c 6f  nel, or data blo
6670: 62 20 2a 2f 0a 20 20 20 20 69 66 20 28 66 69 6c  b */.    if (fil
6680: 65 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  eObj != NULL) {.
6690: 09 72 65 73 20 3d 20 44 69 67 65 73 74 46 69 6c  .res = DigestFil
66a0: 65 28 69 6e 74 65 72 70 2c 20 66 69 6c 65 4f 62  e(interp, fileOb
66b0: 6a 2c 20 6d 64 2c 20 66 6f 72 6d 61 74 2c 20 6b  j, md, format, k
66c0: 65 79 4f 62 6a 29 3b 0a 20 20 20 20 7d 20 65 6c  eyObj);.    } el
66d0: 73 65 20 69 66 20 28 63 68 61 6e 6e 65 6c 20 21  se if (channel !
66e0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 20 3d  = NULL) {..res =
66f0: 20 44 69 67 65 73 74 43 68 61 6e 6e 65 6c 28 69   DigestChannel(i
6700: 6e 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c 2c 20  nterp, channel, 
6710: 6d 64 2c 20 66 6f 72 6d 61 74 2c 20 6b 65 79 4f  md, format, keyO
6720: 62 6a 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  bj);.    } else 
6730: 69 66 20 28 64 61 74 61 4f 62 6a 20 21 3d 20 4e  if (dataObj != N
6740: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20  ULL) {..Tcl_Obj 
6750: 2a 6f 62 6a 73 5b 32 5d 3b 0a 09 6f 62 6a 73 5b  *objs[2];..objs[
6760: 30 5d 20 3d 20 4e 55 4c 4c 3b 0a 09 6f 62 6a 73  0] = NULL;..objs
6770: 5b 31 5d 20 3d 20 64 61 74 61 4f 62 6a 3b 0a 09  [1] = dataObj;..
6780: 72 65 73 20 3d 20 44 69 67 65 73 74 48 61 73 68  res = DigestHash
6790: 46 75 6e 63 74 69 6f 6e 28 69 6e 74 65 72 70 2c  Function(interp,
67a0: 20 32 2c 20 6f 62 6a 73 2c 20 6d 64 2c 20 66 6f   2, objs, md, fo
67b0: 72 6d 61 74 2c 20 6b 65 79 4f 62 6a 29 3b 0a 20  rmat, keyObj);. 
67c0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
67d0: 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  res;.}../*. *---
67e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6820: 0a 20 2a 0a 20 2a 20 4d 65 73 73 61 67 65 20 44  . *. * Message D
6830: 69 67 65 73 74 20 43 6f 6e 76 65 6e 69 65 6e 63  igest Convenienc
6840: 65 20 43 6f 6d 6d 61 6e 64 73 20 2d 2d 0a 20 2a  e Commands --. *
6850: 0a 20 2a 09 43 6f 6e 76 65 6e 69 65 6e 63 65 20  . *.Convenience 
6860: 63 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 6d 65 73  commands for mes
6870: 73 61 67 65 20 64 69 67 65 73 74 73 2e 0a 20 2a  sage digests.. *
6880: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09  . * Returns:. *.
6890: 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52  TCL_OK or TCL_ER
68a0: 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ROR. *. * Side e
68b0: 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20  ffects:. *.Sets 
68c0: 72 65 73 75 6c 74 20 74 6f 20 6d 65 73 73 61 67  result to messag
68d0: 65 20 64 69 67 65 73 74 20 6f 72 20 65 72 72 6f  e digest or erro
68e0: 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d  r message. *. *-
68f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6930: 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73  --. */.int Diges
6940: 74 4d 44 34 43 6d 64 28 43 6c 69 65 6e 74 44 61  tMD4Cmd(ClientDa
6950: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
6960: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
6970: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
6980: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
6990: 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  []) {.    return
69a0: 20 44 69 67 65 73 74 48 61 73 68 46 75 6e 63 74   DigestHashFunct
69b0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f 62 6a 63  ion(interp, objc
69c0: 2c 20 6f 62 6a 76 2c 20 45 56 50 5f 6d 64 34 28  , objv, EVP_md4(
69d0: 29 2c 20 48 45 58 5f 46 4f 52 4d 41 54 2c 20 4e  ), HEX_FORMAT, N
69e0: 55 4c 4c 29 3b 0a 7d 0a 0a 69 6e 74 20 44 69 67  ULL);.}..int Dig
69f0: 65 73 74 4d 44 35 43 6d 64 28 43 6c 69 65 6e 74  estMD5Cmd(Client
6a00: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
6a10: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
6a20: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
6a30: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
6a40: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74 75  jv[]) {.    retu
6a50: 72 6e 20 44 69 67 65 73 74 48 61 73 68 46 75 6e  rn DigestHashFun
6a60: 63 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f 62  ction(interp, ob
6a70: 6a 63 2c 20 6f 62 6a 76 2c 20 45 56 50 5f 6d 64  jc, objv, EVP_md
6a80: 35 28 29 2c 20 48 45 58 5f 46 4f 52 4d 41 54 2c  5(), HEX_FORMAT,
6a90: 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 69 6e 74 20 44   NULL);.}..int D
6aa0: 69 67 65 73 74 53 48 41 31 43 6d 64 28 43 6c 69  igestSHA1Cmd(Cli
6ab0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
6ac0: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
6ad0: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
6ae0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
6af0: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 72   objv[]) {.    r
6b00: 65 74 75 72 6e 20 44 69 67 65 73 74 48 61 73 68  eturn DigestHash
6b10: 46 75 6e 63 74 69 6f 6e 28 69 6e 74 65 72 70 2c  Function(interp,
6b20: 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 45 56 50   objc, objv, EVP
6b30: 5f 73 68 61 31 28 29 2c 20 48 45 58 5f 46 4f 52  _sha1(), HEX_FOR
6b40: 4d 41 54 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 69  MAT, NULL);.}..i
6b50: 6e 74 20 44 69 67 65 73 74 53 48 41 32 35 36 43  nt DigestSHA256C
6b60: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  md(ClientData cl
6b70: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e  ientData, Tcl_In
6b80: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
6b90: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
6ba0: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b  *const objv[]) {
6bb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 44 69 67 65  .    return Dige
6bc0: 73 74 48 61 73 68 46 75 6e 63 74 69 6f 6e 28 69  stHashFunction(i
6bd0: 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a  nterp, objc, obj
6be0: 76 2c 20 45 56 50 5f 73 68 61 32 35 36 28 29 2c  v, EVP_sha256(),
6bf0: 20 48 45 58 5f 46 4f 52 4d 41 54 2c 20 4e 55 4c   HEX_FORMAT, NUL
6c00: 4c 29 3b 0a 7d 0a 0a 69 6e 74 20 44 69 67 65 73  L);.}..int Diges
6c10: 74 53 48 41 35 31 32 43 6d 64 28 43 6c 69 65 6e  tSHA512Cmd(Clien
6c20: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
6c30: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
6c40: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
6c50: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
6c60: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74  bjv[]) {.    ret
6c70: 75 72 6e 20 44 69 67 65 73 74 48 61 73 68 46 75  urn DigestHashFu
6c80: 6e 63 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f  nction(interp, o
6c90: 62 6a 63 2c 20 6f 62 6a 76 2c 20 45 56 50 5f 73  bjc, objv, EVP_s
6ca0: 68 61 35 31 32 28 29 2c 20 48 45 58 5f 46 4f 52  ha512(), HEX_FOR
6cb0: 4d 41 54 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 2f  MAT, NULL);.}../
6cc0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
6cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d00: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c  -------. *. * Tl
6d10: 73 5f 44 69 67 65 73 74 43 6f 6d 6d 61 6e 64 73  s_DigestCommands
6d20: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 72 65 61 74 65   --. *. *.Create
6d30: 20 64 69 67 65 73 74 20 63 6f 6d 6d 61 6e 64 73   digest commands
6d40: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a  . *. * Returns:.
6d50: 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c   *.TCL_OK or TCL
6d60: 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64  _ERROR. *. * Sid
6d70: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 72  e effects:. *.Cr
6d80: 65 61 74 65 73 20 63 6f 6d 6d 61 6e 64 73 0a 20  eates commands. 
6d90: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
6da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6dd0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20  -------. */.int 
6de0: 54 6c 73 5f 44 69 67 65 73 74 43 6f 6d 6d 61 6e  Tls_DigestComman
6df0: 64 73 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  ds(Tcl_Interp *i
6e00: 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 54 63 6c  nterp) {.    Tcl
6e10: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
6e20: 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  d(interp, "tls::
6e30: 64 69 67 65 73 74 22 2c 20 44 69 67 65 73 74 4f  digest", DigestO
6e40: 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61  bjCmd, (ClientDa
6e50: 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44  ta) 0, (Tcl_CmdD
6e60: 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
6e70: 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  L);.    Tcl_Crea
6e80: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
6e90: 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 64 34 22 2c  erp, "tls::md4",
6ea0: 20 44 69 67 65 73 74 4d 44 34 43 6d 64 2c 20 28   DigestMD4Cmd, (
6eb0: 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28  ClientData) 0, (
6ec0: 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
6ed0: 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  c *) NULL);.    
6ee0: 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
6ef0: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c  mand(interp, "tl
6f00: 73 3a 3a 6d 64 35 22 2c 20 44 69 67 65 73 74 4d  s::md5", DigestM
6f10: 44 35 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61  D5Cmd, (ClientDa
6f20: 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44  ta) 0, (Tcl_CmdD
6f30: 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
6f40: 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  L);.    Tcl_Crea
6f50: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
6f60: 65 72 70 2c 20 22 74 6c 73 3a 3a 73 68 61 31 22  erp, "tls::sha1"
6f70: 2c 20 44 69 67 65 73 74 53 48 41 31 43 6d 64 2c  , DigestSHA1Cmd,
6f80: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c   (ClientData) 0,
6f90: 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
6fa0: 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
6fb0: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
6fc0: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
6fd0: 74 6c 73 3a 3a 73 68 61 32 35 36 22 2c 20 44 69  tls::sha256", Di
6fe0: 67 65 73 74 53 48 41 32 35 36 43 6d 64 2c 20 28  gestSHA256Cmd, (
6ff0: 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28  ClientData) 0, (
7000: 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
7010: 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  c *) NULL);.    
7020: 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
7030: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c  mand(interp, "tl
7040: 73 3a 3a 73 68 61 35 31 32 22 2c 20 44 69 67 65  s::sha512", Dige
7050: 73 74 53 48 41 35 31 32 43 6d 64 2c 20 28 43 6c  stSHA512Cmd, (Cl
7060: 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63  ientData) 0, (Tc
7070: 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
7080: 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63  *) NULL);.    Tc
7090: 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
70a0: 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a  nd(interp, "tls:
70b0: 3a 75 6e 73 74 61 63 6b 22 2c 20 55 6e 73 74 61  :unstack", Unsta
70c0: 63 6b 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e  ckObjCmd, (Clien
70d0: 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43  tData) 0, (Tcl_C
70e0: 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
70f0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 72 65 74 75 72  NULL);.    retur
7100: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a           n TCL_OK;.}..