Hex Artifact Content

Artifact 71e9e504fdee9157ffff54b691c3b02dc2f2f7bdd869d2b296007ad0d6267993:


0000: 2f 2a 0a 20 2a 20 4d 65 73 73 61 67 65 20 44 69  /*. * Message Di
0010: 67 65 73 74 73 20 4d 6f 64 75 6c 65 0a 20 2a 0a  gests Module. *.
0020: 20 2a 20 50 72 6f 76 69 64 65 73 20 63 6f 6d 6d   * Provides comm
0030: 61 6e 64 73 20 74 6f 20 63 61 6c 63 75 6c 61 74  ands to calculat
0040: 65 20 61 20 6d 65 73 73 61 67 65 20 64 69 67 65  e a message dige
0050: 73 74 20 75 73 69 6e 67 20 61 20 73 70 65 63 69  st using a speci
0060: 66 69 65 64 20 68 61 73 68 20 66 75 6e 63 74 69  fied hash functi
0070: 6f 6e 2e 0a 20 2a 0a 20 2a 20 43 6f 70 79 72 69  on.. *. * Copyri
0080: 67 68 74 20 28 43 29 20 32 30 32 33 20 42 72 69  ght (C) 2023 Bri
0090: 61 6e 20 4f 27 48 61 67 61 6e 0a 20 2a 0a 20 2a  an O'Hagan. *. *
00a0: 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73  /..#include "tls
00b0: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
00c0: 22 74 63 6c 4f 70 74 73 2e 68 22 0a 23 69 6e 63  "tclOpts.h".#inc
00d0: 6c 75 64 65 20 3c 74 63 6c 2e 68 3e 0a 23 69 6e  lude <tcl.h>.#in
00e0: 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a  clude <stdio.h>.
00f0: 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67  #include <string
0100: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70  .h>.#include <op
0110: 65 6e 73 73 6c 2f 65 76 70 2e 68 3e 0a 23 69 6e  enssl/evp.h>.#in
0120: 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 63  clude <openssl/c
0130: 6d 61 63 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  mac.h>.#include 
0140: 3c 6f 70 65 6e 73 73 6c 2f 68 6d 61 63 2e 68 3e  <openssl/hmac.h>
0150: 0a 0a 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20 2a  ../* Constants *
0160: 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 68 65  /.const char *he
0170: 78 20 3d 20 22 30 31 32 33 34 35 36 37 38 39 41  x = "0123456789A
0180: 42 43 44 45 46 22 3b 0a 0a 2f 2a 20 4d 61 63 72  BCDEF";../* Macr
0190: 6f 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 42 55  os */.#define BU
01a0: 46 46 45 52 5f 53 49 5a 45 20 36 35 35 33 36 0a  FFER_SIZE 65536.
01b0: 23 64 65 66 69 6e 65 20 43 48 41 4e 5f 45 4f 46  #define CHAN_EOF
01c0: 20 30 78 31 30 0a 0a 2f 2a 20 44 69 67 65 73 74   0x10../* Digest
01d0: 20 66 6f 72 6d 61 74 20 61 6e 64 20 6f 70 65 72   format and oper
01e0: 61 74 69 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65  ation */.#define
01f0: 20 42 49 4e 5f 46 4f 52 4d 41 54 20 30 78 30 31   BIN_FORMAT 0x01
0200: 0a 23 64 65 66 69 6e 65 20 48 45 58 5f 46 4f 52  .#define HEX_FOR
0210: 4d 41 54 20 30 78 30 32 0a 23 64 65 66 69 6e 65  MAT 0x02.#define
0220: 20 54 59 50 45 5f 4d 44 20 20 20 20 30 78 31 30   TYPE_MD    0x10
0230: 0a 23 64 65 66 69 6e 65 20 54 59 50 45 5f 48 4d  .#define TYPE_HM
0240: 41 43 20 20 30 78 32 30 0a 23 64 65 66 69 6e 65  AC  0x20.#define
0250: 20 54 59 50 45 5f 43 4d 41 43 20 20 30 78 34 30   TYPE_CMAC  0x40
0260: 0a 0a 2f 2a 0a 20 2a 20 54 68 69 73 20 73 74 72  ../*. * This str
0270: 75 63 74 75 72 65 20 64 65 66 69 6e 65 73 20 74  ucture defines t
0280: 68 65 20 70 65 72 2d 69 6e 73 74 61 6e 63 65 20  he per-instance 
0290: 73 74 61 74 65 20 6f 66 20 61 20 64 69 67 65 73  state of a diges
02a0: 74 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 2a 2f  t operation.. */
02b0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
02c0: 44 69 67 65 73 74 53 74 61 74 65 20 7b 0a 09 54  DigestState {..T
02d0: 63 6c 5f 43 68 61 6e 6e 65 6c 20 73 65 6c 66 3b  cl_Channel self;
02e0: 09 2f 2a 20 54 68 69 73 20 73 6f 63 6b 65 74 20  ./* This socket 
02f0: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 09 54 63 6c 5f  channel */..Tcl_
0300: 54 69 6d 65 72 54 6f 6b 65 6e 20 74 69 6d 65 72  TimerToken timer
0310: 3b 09 2f 2a 20 54 69 6d 65 72 20 66 6f 72 20 72  ;./* Timer for r
0320: 65 61 64 20 65 76 65 6e 74 73 20 2a 2f 0a 0a 09  ead events */...
0330: 69 6e 74 20 66 6c 61 67 73 3b 09 09 2f 2a 20 43  int flags;../* C
0340: 68 61 6e 20 63 6f 6e 66 69 67 20 66 6c 61 67 73  han config flags
0350: 20 2a 2f 0a 09 69 6e 74 20 77 61 74 63 68 4d 61   */..int watchMa
0360: 73 6b 3b 09 09 2f 2a 20 43 75 72 72 65 6e 74 20  sk;../* Current 
0370: 57 61 74 63 68 50 72 6f 63 20 6d 61 73 6b 20 2a  WatchProc mask *
0380: 2f 0a 09 69 6e 74 20 6d 6f 64 65 3b 09 09 2f 2a  /..int mode;../*
0390: 20 43 75 72 72 65 6e 74 20 6d 6f 64 65 20 6f 66   Current mode of
03a0: 20 70 61 72 65 6e 74 20 63 68 61 6e 6e 65 6c 20   parent channel 
03b0: 2a 2f 0a 09 69 6e 74 20 66 6f 72 6d 61 74 3b 09  */..int format;.
03c0: 09 2f 2a 20 44 69 67 65 73 74 20 66 6f 72 6d 61  ./* Digest forma
03d0: 74 20 61 6e 64 20 6f 70 65 72 61 74 69 6f 6e 20  t and operation 
03e0: 2a 2f 0a 0a 09 54 63 6c 5f 49 6e 74 65 72 70 20  */...Tcl_Interp 
03f0: 2a 69 6e 74 65 72 70 3b 09 2f 2a 20 43 75 72 72  *interp;./* Curr
0400: 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72 20  ent interpreter 
0410: 2a 2f 0a 09 45 56 50 5f 4d 44 5f 43 54 58 20 2a  */..EVP_MD_CTX *
0420: 63 74 78 3b 09 2f 2a 20 4d 44 20 43 6f 6e 74 65  ctx;./* MD Conte
0430: 78 74 20 2a 2f 0a 09 48 4d 41 43 5f 43 54 58 20  xt */..HMAC_CTX 
0440: 2a 68 63 74 78 3b 09 09 2f 2a 20 48 4d 41 43 20  *hctx;../* HMAC 
0450: 43 6f 6e 74 65 78 74 20 2a 2f 0a 09 43 4d 41 43  Context */..CMAC
0460: 5f 43 54 58 20 2a 63 63 74 78 3b 09 09 2f 2a 20  _CTX *cctx;../* 
0470: 43 4d 41 43 20 43 6f 6e 74 65 78 74 20 2a 2f 0a  CMAC Context */.
0480: 09 54 63 6c 5f 43 6f 6d 6d 61 6e 64 20 74 6f 6b  .Tcl_Command tok
0490: 65 6e 3b 09 2f 2a 20 43 6f 6d 6d 61 6e 64 20 74  en;./* Command t
04a0: 6f 6b 65 6e 20 2a 2f 0a 7d 20 44 69 67 65 73 74  oken */.} Digest
04b0: 53 74 61 74 65 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  State;../*. *---
04c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
04d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
04e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
04f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0500: 0a 20 2a 0a 20 2a 20 54 6c 73 5f 44 69 67 65 73  . *. * Tls_Diges
0510: 74 4e 65 77 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  tNew --. *. *.Th
0520: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 72 65 61  is function crea
0530: 74 65 73 20 61 20 64 69 67 65 73 74 20 73 74 61  tes a digest sta
0540: 74 65 20 73 74 72 75 63 74 75 72 65 0a 20 2a 0a  te structure. *.
0550: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 44   * Returns:. *.D
0560: 69 67 65 73 74 20 73 74 72 75 63 74 75 72 65 20  igest structure 
0570: 70 6f 69 6e 74 65 72 0a 20 2a 0a 20 2a 20 53 69  pointer. *. * Si
0580: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
0590: 72 65 61 74 65 73 20 73 74 72 75 63 74 75 72 65  reates structure
05a0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
05b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44 69  ---------. */.Di
05f0: 67 65 73 74 53 74 61 74 65 20 2a 54 6c 73 5f 44  gestState *Tls_D
0600: 69 67 65 73 74 4e 65 77 28 54 63 6c 5f 49 6e 74  igestNew(Tcl_Int
0610: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
0620: 20 66 6f 72 6d 61 74 29 20 7b 0a 20 20 20 20 44   format) {.    D
0630: 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74  igestState *stat
0640: 65 50 74 72 3b 0a 0a 20 20 20 20 73 74 61 74 65  ePtr;..    state
0650: 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 61  Ptr = (DigestSta
0660: 74 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75  te *) ckalloc((u
0670: 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 6f 66 28  nsigned) sizeof(
0680: 44 69 67 65 73 74 53 74 61 74 65 29 29 3b 0a 20  DigestState));. 
0690: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 20     if (statePtr 
06a0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6d 65 6d 73  != NULL) {..mems
06b0: 65 74 28 73 74 61 74 65 50 74 72 2c 20 30 2c 20  et(statePtr, 0, 
06c0: 73 69 7a 65 6f 66 28 44 69 67 65 73 74 53 74 61  sizeof(DigestSta
06d0: 74 65 29 29 3b 0a 09 73 74 61 74 65 50 74 72 2d  te));..statePtr-
06e0: 3e 73 65 6c 66 09 3d 20 4e 55 4c 4c 3b 09 09 2f  >self.= NULL;../
06f0: 2a 20 54 68 69 73 20 73 6f 63 6b 65 74 20 63 68  * This socket ch
0700: 61 6e 6e 65 6c 20 2a 2f 0a 09 73 74 61 74 65 50  annel */..stateP
0710: 74 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c 4c  tr->timer = NULL
0720: 3b 09 09 2f 2a 20 54 69 6d 65 72 20 74 6f 20 66  ;../* Timer to f
0730: 6c 75 73 68 20 64 61 74 61 20 2a 2f 0a 09 73 74  lush data */..st
0740: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 3d 20  atePtr->flags = 
0750: 30 3b 09 09 2f 2a 20 43 68 61 6e 20 63 6f 6e 66  0;../* Chan conf
0760: 69 67 20 66 6c 61 67 73 20 2a 2f 0a 09 73 74 61  ig flags */..sta
0770: 74 65 50 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b  tePtr->watchMask
0780: 20 3d 20 30 3b 09 2f 2a 20 43 75 72 72 65 6e 74   = 0;./* Current
0790: 20 57 61 74 63 68 50 72 6f 63 20 6d 61 73 6b 20   WatchProc mask 
07a0: 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 6d 6f  */..statePtr->mo
07b0: 64 65 09 3d 20 30 3b 09 09 2f 2a 20 43 75 72 72  de.= 0;../* Curr
07c0: 65 6e 74 20 6d 6f 64 65 20 6f 66 20 70 61 72 65  ent mode of pare
07d0: 6e 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 09 73  nt channel */..s
07e0: 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20  tatePtr->format 
07f0: 3d 20 66 6f 72 6d 61 74 3b 09 2f 2a 20 44 69 67  = format;./* Dig
0800: 65 73 74 20 66 6f 72 6d 61 74 20 61 6e 64 20 6f  est format and o
0810: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 09 73 74 61  peration */..sta
0820: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 20 3d 20  tePtr->interp = 
0830: 69 6e 74 65 72 70 3b 09 2f 2a 20 43 75 72 72 65  interp;./* Curre
0840: 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a  nt interpreter *
0850: 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 74 78  /..statePtr->ctx
0860: 20 3d 20 4e 55 4c 4c 3b 09 09 2f 2a 20 4d 44 20   = NULL;../* MD 
0870: 43 6f 6e 74 65 78 74 20 2a 2f 0a 09 73 74 61 74  Context */..stat
0880: 65 50 74 72 2d 3e 68 63 74 78 20 3d 20 4e 55 4c  ePtr->hctx = NUL
0890: 4c 3b 09 09 2f 2a 20 48 4d 41 43 20 43 6f 6e 74  L;../* HMAC Cont
08a0: 65 78 74 20 2a 2f 0a 09 73 74 61 74 65 50 74 72  ext */..statePtr
08b0: 2d 3e 63 63 74 78 20 3d 20 4e 55 4c 4c 3b 09 09  ->cctx = NULL;..
08c0: 2f 2a 20 43 4d 41 43 20 43 6f 6e 74 65 78 74 20  /* CMAC Context 
08d0: 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 6f  */..statePtr->to
08e0: 6b 65 6e 20 3d 20 4e 55 4c 4c 3b 09 09 2f 2a 20  ken = NULL;../* 
08f0: 43 6f 6d 6d 61 6e 64 20 74 6f 6b 65 6e 20 2a 2f  Command token */
0900: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
0910: 6e 20 73 74 61 74 65 50 74 72 3b 0a 7d 0a 0a 2f  n statePtr;.}../
0920: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
0930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0960: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c  -------. *. * Tl
0970: 73 5f 44 69 67 65 73 74 46 72 65 65 20 2d 2d 0a  s_DigestFree --.
0980: 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74   *. *.This funct
0990: 69 6f 6e 20 72 65 6d 6f 76 65 73 20 61 20 64 69  ion removes a di
09a0: 67 65 73 74 20 73 74 61 74 65 20 73 74 72 75 63  gest state struc
09b0: 74 75 72 65 0a 20 2a 0a 20 2a 20 52 65 74 75 72  ture. *. * Retur
09c0: 6e 73 3a 0a 20 2a 09 4e 6f 74 68 69 6e 67 0a 20  ns:. *.Nothing. 
09d0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
09e0: 73 3a 0a 20 2a 09 52 65 6d 6f 76 65 73 20 73 74  s:. *.Removes st
09f0: 72 75 63 74 75 72 65 0a 20 2a 0a 20 2a 2d 2d 2d  ructure. *. *---
0a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a40: 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f 44 69  . */.void Tls_Di
0a50: 67 65 73 74 46 72 65 65 28 44 69 67 65 73 74 53  gestFree(DigestS
0a60: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 29 20  tate *statePtr) 
0a70: 7b 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  {.    if (stateP
0a80: 74 72 20 3d 3d 20 28 44 69 67 65 73 74 53 74 61  tr == (DigestSta
0a90: 74 65 20 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 72  te *) NULL) {..r
0aa0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20  eturn;.    }..  
0ab0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
0ac0: 63 74 78 20 21 3d 20 28 45 56 50 5f 4d 44 5f 43  ctx != (EVP_MD_C
0ad0: 54 58 20 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 45  TX *) NULL) {..E
0ae0: 56 50 5f 4d 44 5f 43 54 58 5f 66 72 65 65 28 73  VP_MD_CTX_free(s
0af0: 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20  tatePtr->ctx);. 
0b00: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61     }.    if (sta
0b10: 74 65 50 74 72 2d 3e 68 63 74 78 20 21 3d 20 28  tePtr->hctx != (
0b20: 48 4d 41 43 5f 43 54 58 20 2a 29 20 4e 55 4c 4c  HMAC_CTX *) NULL
0b30: 29 20 7b 0a 09 48 4d 41 43 5f 43 54 58 5f 66 72  ) {..HMAC_CTX_fr
0b40: 65 65 28 73 74 61 74 65 50 74 72 2d 3e 68 63 74  ee(statePtr->hct
0b50: 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  x);.    }.    if
0b60: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 63 74 78   (statePtr->cctx
0b70: 20 21 3d 20 28 43 4d 41 43 5f 43 54 58 20 2a 29   != (CMAC_CTX *)
0b80: 20 4e 55 4c 4c 29 20 7b 0a 09 43 4d 41 43 5f 43   NULL) {..CMAC_C
0b90: 54 58 5f 66 72 65 65 28 73 74 61 74 65 50 74 72  TX_free(statePtr
0ba0: 2d 3e 63 63 74 78 29 3b 0a 20 20 20 20 7d 0a 20  ->cctx);.    }. 
0bb0: 20 20 20 63 6b 66 72 65 65 28 73 74 61 74 65 50     ckfree(stateP
0bc0: 74 72 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  tr);.}../*******
0bd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0be0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0bf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
0c10: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
0c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c50: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c  -------. *. * Tl
0c60: 73 5f 44 69 67 65 73 74 49 6e 69 74 20 2d 2d 0a  s_DigestInit --.
0c70: 20 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65   *. *.Initialize
0c80: 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e   a hash function
0c90: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a  . *. * Returns:.
0ca0: 20 2a 09 54 43 4c 5f 4f 4b 20 69 66 20 73 75 63   *.TCL_OK if suc
0cb0: 63 65 73 73 66 75 6c 20 6f 72 20 54 43 4c 5f 45  cessful or TCL_E
0cc0: 52 52 4f 52 20 66 6f 72 20 66 61 69 6c 75 72 65  RROR for failure
0cd0: 20 77 69 74 68 20 72 65 73 75 6c 74 20 73 65 74   with result set
0ce0: 0a 20 2a 09 74 6f 20 65 72 72 6f 72 20 6d 65 73  . *.to error mes
0cf0: 73 61 67 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  sage.. *. * Side
0d00: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 20   effects:. *.No 
0d10: 72 65 73 75 6c 74 20 6f 72 20 65 72 72 6f 72 20  result or error 
0d20: 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d  message. *. *---
0d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d70: 0a 20 2a 2f 0a 69 6e 74 20 54 6c 73 5f 44 69 67  . */.int Tls_Dig
0d80: 65 73 74 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  estInit(Tcl_Inte
0d90: 72 70 20 2a 69 6e 74 65 72 70 2c 20 44 69 67 65  rp *interp, Dige
0da0: 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74  stState *statePt
0db0: 72 2c 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20  r, const EVP_MD 
0dc0: 2a 6d 64 2c 0a 09 63 6f 6e 73 74 20 45 56 50 5f  *md,..const EVP_
0dd0: 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 2c 20  CIPHER *cipher, 
0de0: 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4f 62 6a 29  Tcl_Obj *keyObj)
0df0: 20 7b 0a 20 20 20 20 69 6e 74 20 6b 65 79 5f 6c   {.    int key_l
0e00: 65 6e 2c 20 72 65 73 20 3d 20 30 3b 0a 20 20 20  en, res = 0;.   
0e10: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
0e20: 63 68 61 72 20 2a 6b 65 79 3b 0a 0a 20 20 20 20  char *key;..    
0e30: 2f 2a 20 43 72 65 61 74 65 20 6d 65 73 73 61 67  /* Create messag
0e40: 65 20 64 69 67 65 73 74 20 63 6f 6e 74 65 78 74  e digest context
0e50: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74   */.    if (stat
0e60: 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20 54  ePtr->format & T
0e70: 59 50 45 5f 4d 44 29 20 7b 0a 09 73 74 61 74 65  YPE_MD) {..state
0e80: 50 74 72 2d 3e 63 74 78 20 3d 20 45 56 50 5f 4d  Ptr->ctx = EVP_M
0e90: 44 5f 43 54 58 5f 6e 65 77 28 29 3b 0a 09 72 65  D_CTX_new();..re
0ea0: 73 20 3d 20 28 73 74 61 74 65 50 74 72 2d 3e 63  s = (statePtr->c
0eb0: 74 78 20 21 3d 20 4e 55 4c 4c 29 3b 0a 20 20 20  tx != NULL);.   
0ec0: 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 61 74   } else if (stat
0ed0: 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20 54  ePtr->format & T
0ee0: 59 50 45 5f 48 4d 41 43 29 20 7b 0a 09 73 74 61  YPE_HMAC) {..sta
0ef0: 74 65 50 74 72 2d 3e 68 63 74 78 20 3d 20 48 4d  tePtr->hctx = HM
0f00: 41 43 5f 43 54 58 5f 6e 65 77 28 29 3b 0a 09 72  AC_CTX_new();..r
0f10: 65 73 20 3d 20 28 73 74 61 74 65 50 74 72 2d 3e  es = (statePtr->
0f20: 68 63 74 78 20 21 3d 20 4e 55 4c 4c 29 3b 0a 20  hctx != NULL);. 
0f30: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
0f40: 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26  atePtr->format &
0f50: 20 54 59 50 45 5f 43 4d 41 43 29 20 7b 0a 09 73   TYPE_CMAC) {..s
0f60: 74 61 74 65 50 74 72 2d 3e 63 63 74 78 20 3d 20  tatePtr->cctx = 
0f70: 43 4d 41 43 5f 43 54 58 5f 6e 65 77 28 29 3b 0a  CMAC_CTX_new();.
0f80: 09 72 65 73 20 3d 20 28 73 74 61 74 65 50 74 72  .res = (statePtr
0f90: 2d 3e 63 63 74 78 20 21 3d 20 4e 55 4c 4c 29 3b  ->cctx != NULL);
0fa0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21  .    }.    if (!
0fb0: 72 65 73 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  res) {..Tcl_Appe
0fc0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
0fd0: 20 22 43 72 65 61 74 65 20 64 69 67 65 73 74 20   "Create digest 
0fe0: 63 6f 6e 74 65 78 74 20 66 61 69 6c 65 64 3a 20  context failed: 
0ff0: 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c  ", REASON(), NUL
1000: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  L);..return TCL_
1010: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
1020: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
1030: 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  hash function */
1040: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
1050: 72 2d 3e 66 6f 72 6d 61 74 20 26 20 54 59 50 45  r->format & TYPE
1060: 5f 4d 44 29 20 7b 0a 09 72 65 73 20 3d 20 45 56  _MD) {..res = EV
1070: 50 5f 44 69 67 65 73 74 49 6e 69 74 5f 65 78 28  P_DigestInit_ex(
1080: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 6d  statePtr->ctx, m
1090: 64 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 20  d, NULL);.    } 
10a0: 65 6c 73 65 20 69 66 20 28 73 74 61 74 65 50 74  else if (statePt
10b0: 72 2d 3e 66 6f 72 6d 61 74 20 26 20 54 59 50 45  r->format & TYPE
10c0: 5f 48 4d 41 43 29 20 7b 0a 09 6b 65 79 20 3d 20  _HMAC) {..key = 
10d0: 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
10e0: 46 72 6f 6d 4f 62 6a 28 6b 65 79 4f 62 6a 2c 20  FromObj(keyObj, 
10f0: 26 6b 65 79 5f 6c 65 6e 29 3b 0a 09 72 65 73 20  &key_len);..res 
1100: 3d 20 48 4d 41 43 5f 49 6e 69 74 5f 65 78 28 73  = HMAC_Init_ex(s
1110: 74 61 74 65 50 74 72 2d 3e 68 63 74 78 2c 20 28  tatePtr->hctx, (
1120: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 29 20 6b 65  const void *) ke
1130: 79 2c 20 6b 65 79 5f 6c 65 6e 2c 20 6d 64 2c 20  y, key_len, md, 
1140: 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 20 65 6c 73  NULL);.    } els
1150: 65 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e  e if (statePtr->
1160: 66 6f 72 6d 61 74 20 26 20 54 59 50 45 5f 43 4d  format & TYPE_CM
1170: 41 43 29 20 7b 0a 09 6b 65 79 20 3d 20 54 63 6c  AC) {..key = Tcl
1180: 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
1190: 6d 4f 62 6a 28 6b 65 79 4f 62 6a 2c 20 26 6b 65  mObj(keyObj, &ke
11a0: 79 5f 6c 65 6e 29 3b 0a 09 72 65 73 20 3d 20 43  y_len);..res = C
11b0: 4d 41 43 5f 49 6e 69 74 28 73 74 61 74 65 50 74  MAC_Init(statePt
11c0: 72 2d 3e 63 63 74 78 2c 20 28 63 6f 6e 73 74 20  r->cctx, (const 
11d0: 76 6f 69 64 20 2a 29 20 6b 65 79 2c 20 6b 65 79  void *) key, key
11e0: 5f 6c 65 6e 2c 20 63 69 70 68 65 72 2c 20 4e 55  _len, cipher, NU
11f0: 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  LL);.    }.    i
1200: 66 20 28 21 72 65 73 29 20 7b 0a 09 54 63 6c 5f  f (!res) {..Tcl_
1210: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1220: 65 72 70 2c 20 22 49 6e 69 74 69 61 6c 69 7a 65  erp, "Initialize
1230: 20 64 69 67 65 73 74 20 66 61 69 6c 65 64 3a 20   digest failed: 
1240: 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c  ", REASON(), NUL
1250: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  L);..return TCL_
1260: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
1270: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1280: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
1290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
12d0: 2a 20 54 6c 73 5f 44 69 67 65 73 74 55 70 64 61  * Tls_DigestUpda
12e0: 74 65 20 2d 2d 0a 20 2a 0a 20 2a 09 55 70 64 61  te --. *. *.Upda
12f0: 74 65 20 61 20 68 61 73 68 20 66 75 6e 63 74 69  te a hash functi
1300: 6f 6e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73  on. *. * Returns
1310: 3a 0a 20 2a 09 31 20 69 66 20 73 75 63 63 65 73  :. *.1 if succes
1320: 73 66 75 6c 20 6f 72 20 30 20 66 6f 72 20 66 61  sful or 0 for fa
1330: 69 6c 75 72 65 0a 20 2a 0a 20 2a 20 53 69 64 65  ilure. *. * Side
1340: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 41 64 64   effects:. *.Add
1350: 73 20 62 75 66 20 74 6f 20 68 61 73 68 20 66 75  s buf to hash fu
1360: 6e 63 74 69 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  nction. *. *----
1370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
13b0: 20 2a 2f 0a 69 6e 74 20 54 6c 73 5f 44 69 67 65   */.int Tls_Dige
13c0: 73 74 55 70 64 61 74 65 28 44 69 67 65 73 74 53  stUpdate(DigestS
13d0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20  tate *statePtr, 
13e0: 63 68 61 72 20 2a 62 75 66 2c 20 73 69 7a 65 5f  char *buf, size_
13f0: 74 20 72 65 61 64 29 20 7b 0a 20 20 20 20 69 6e  t read) {.    in
1400: 74 20 72 65 73 20 3d 20 30 3b 0a 0a 20 20 20 20  t res = 0;..    
1410: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6f  if (statePtr->fo
1420: 72 6d 61 74 20 26 20 54 59 50 45 5f 4d 44 29 20  rmat & TYPE_MD) 
1430: 7b 0a 09 72 65 73 20 3d 20 45 56 50 5f 44 69 67  {..res = EVP_Dig
1440: 65 73 74 55 70 64 61 74 65 28 73 74 61 74 65 50  estUpdate(stateP
1450: 74 72 2d 3e 63 74 78 2c 20 62 75 66 2c 20 72 65  tr->ctx, buf, re
1460: 61 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ad);.    } else 
1470: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6f  if (statePtr->fo
1480: 72 6d 61 74 20 26 20 54 59 50 45 5f 48 4d 41 43  rmat & TYPE_HMAC
1490: 29 20 7b 0a 09 72 65 73 20 3d 20 48 4d 41 43 5f  ) {..res = HMAC_
14a0: 55 70 64 61 74 65 28 73 74 61 74 65 50 74 72 2d  Update(statePtr-
14b0: 3e 68 63 74 78 2c 20 62 75 66 2c 20 72 65 61 64  >hctx, buf, read
14c0: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  );.    } else if
14d0: 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d   (statePtr->form
14e0: 61 74 20 26 20 54 59 50 45 5f 43 4d 41 43 29 20  at & TYPE_CMAC) 
14f0: 7b 0a 09 72 65 73 20 3d 20 43 4d 41 43 5f 55 70  {..res = CMAC_Up
1500: 64 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 63  date(statePtr->c
1510: 63 74 78 2c 20 62 75 66 2c 20 72 65 61 64 29 3b  ctx, buf, read);
1520: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
1530: 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d  n res;.}../*. *-
1540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1580: 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 44 69 67  --. *. * Tls_Dig
1590: 65 73 74 46 69 6e 69 61 6c 69 7a 65 20 2d 2d 0a  estFinialize --.
15a0: 20 2a 0a 20 2a 09 46 69 6e 61 6c 69 7a 65 20 61   *. *.Finalize a
15b0: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 61   hash function a
15c0: 6e 64 20 67 65 6e 65 72 61 74 65 20 61 20 6d 65  nd generate a me
15d0: 73 73 61 67 65 20 64 69 67 65 73 74 0a 20 2a 0a  ssage digest. *.
15e0: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54   * Returns:. *.T
15f0: 43 4c 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  CL_OK if success
1600: 66 75 6c 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52  ful or TCL_ERROR
1610: 20 66 6f 72 20 66 61 69 6c 75 72 65 20 77 69 74   for failure wit
1620: 68 20 72 65 73 75 6c 74 20 73 65 74 0a 20 2a 09  h result set. *.
1630: 74 6f 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  to error message
1640: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
1650: 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 72 65  ects:. *.Sets re
1660: 73 75 6c 74 20 74 6f 20 6d 65 73 73 61 67 65 20  sult to message 
1670: 64 69 67 65 73 74 20 66 6f 72 20 68 61 73 68 20  digest for hash 
1680: 66 75 6e 63 74 69 6f 6e 20 6f 72 20 61 6e 20 65  function or an e
1690: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a  rror message.. *
16a0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
16b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16c0: 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 0a 69 6e 74 20  ------. */..int 
16f0: 54 6c 73 5f 44 69 67 65 73 74 46 69 6e 69 61 6c  Tls_DigestFinial
1700: 69 7a 65 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ize(Tcl_Interp *
1710: 69 6e 74 65 72 70 2c 20 44 69 67 65 73 74 53 74  interp, DigestSt
1720: 61 74 65 20 2a 73 74 61 74 65 50 74 72 29 20 7b  ate *statePtr) {
1730: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
1740: 61 72 20 6d 64 5f 62 75 66 5b 45 56 50 5f 4d 41  ar md_buf[EVP_MA
1750: 58 5f 4d 44 5f 53 49 5a 45 5d 3b 0a 20 20 20 20  X_MD_SIZE];.    
1760: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6d 64 5f  unsigned int md_
1770: 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 72 65 73  len;.    int res
1780: 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 46 69   = 0;..    /* Fi
1790: 6e 61 6c 69 7a 65 20 68 61 73 68 20 66 75 6e 63  nalize hash func
17a0: 74 69 6f 6e 20 61 6e 64 20 63 61 6c 63 75 6c 61  tion and calcula
17b0: 74 65 20 6d 65 73 73 61 67 65 20 64 69 67 65 73  te message diges
17c0: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61  t */.    if (sta
17d0: 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20  tePtr->format & 
17e0: 54 59 50 45 5f 4d 44 29 20 7b 0a 09 72 65 73 20  TYPE_MD) {..res 
17f0: 3d 20 45 56 50 5f 44 69 67 65 73 74 46 69 6e 61  = EVP_DigestFina
1800: 6c 5f 65 78 28 73 74 61 74 65 50 74 72 2d 3e 63  l_ex(statePtr->c
1810: 74 78 2c 20 6d 64 5f 62 75 66 2c 20 26 6d 64 5f  tx, md_buf, &md_
1820: 6c 65 6e 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  len);.    } else
1830: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66   if (statePtr->f
1840: 6f 72 6d 61 74 20 26 20 54 59 50 45 5f 48 4d 41  ormat & TYPE_HMA
1850: 43 29 20 7b 0a 09 72 65 73 20 3d 20 48 4d 41 43  C) {..res = HMAC
1860: 5f 46 69 6e 61 6c 28 73 74 61 74 65 50 74 72 2d  _Final(statePtr-
1870: 3e 68 63 74 78 2c 20 6d 64 5f 62 75 66 2c 20 26  >hctx, md_buf, &
1880: 6d 64 5f 6c 65 6e 29 3b 0a 20 20 20 20 7d 20 65  md_len);.    } e
1890: 6c 73 65 20 69 66 20 28 73 74 61 74 65 50 74 72  lse if (statePtr
18a0: 2d 3e 66 6f 72 6d 61 74 20 26 20 54 59 50 45 5f  ->format & TYPE_
18b0: 43 4d 41 43 29 20 7b 0a 09 73 69 7a 65 5f 74 20  CMAC) {..size_t 
18c0: 6c 65 6e 3b 0a 09 72 65 73 20 3d 20 43 4d 41 43  len;..res = CMAC
18d0: 5f 46 69 6e 61 6c 28 73 74 61 74 65 50 74 72 2d  _Final(statePtr-
18e0: 3e 63 63 74 78 2c 20 6d 64 5f 62 75 66 2c 20 26  >cctx, md_buf, &
18f0: 6c 65 6e 29 3b 0a 09 6d 64 5f 6c 65 6e 20 3d 20  len);..md_len = 
1900: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6c  (unsigned int) l
1910: 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  en;.    }.    if
1920: 20 28 21 72 65 73 29 20 7b 0a 09 54 63 6c 5f 41   (!res) {..Tcl_A
1930: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1940: 72 70 2c 20 22 46 69 6e 61 6c 69 7a 65 20 64 69  rp, "Finalize di
1950: 67 65 73 74 20 66 61 69 6c 65 64 3a 20 22 2c 20  gest failed: ", 
1960: 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b  REASON(), NULL);
1970: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
1980: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
1990: 2a 20 52 65 74 75 72 6e 20 6d 65 73 73 61 67 65  * Return message
19a0: 20 64 69 67 65 73 74 20 61 73 20 65 69 74 68 65   digest as eithe
19b0: 72 20 61 20 62 69 6e 61 72 79 20 6f 72 20 68 65  r a binary or he
19c0: 78 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20  x string */.    
19d0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6f  if (statePtr->fo
19e0: 72 6d 61 74 20 26 20 42 49 4e 5f 46 4f 52 4d 41  rmat & BIN_FORMA
19f0: 54 29 20 7b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a  T) {..Tcl_SetObj
1a00: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
1a10: 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f  cl_NewByteArrayO
1a20: 62 6a 28 6d 64 5f 62 75 66 2c 20 6d 64 5f 6c 65  bj(md_buf, md_le
1a30: 6e 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65  n));..    } else
1a40: 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72 65 73   {..Tcl_Obj *res
1a50: 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77  ultObj = Tcl_New
1a60: 4f 62 6a 28 29 3b 0a 09 75 6e 73 69 67 6e 65 64  Obj();..unsigned
1a70: 20 63 68 61 72 20 2a 70 74 72 20 3d 20 54 63 6c   char *ptr = Tcl
1a80: 5f 53 65 74 42 79 74 65 41 72 72 61 79 4c 65 6e  _SetByteArrayLen
1a90: 67 74 68 28 72 65 73 75 6c 74 4f 62 6a 2c 20 6d  gth(resultObj, m
1aa0: 64 5f 6c 65 6e 2a 32 29 3b 0a 0a 09 66 6f 72 20  d_len*2);...for 
1ab0: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 20  (unsigned int i 
1ac0: 3d 20 30 3b 20 69 20 3c 20 6d 64 5f 6c 65 6e 3b  = 0; i < md_len;
1ad0: 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 2a 70 74   i++) {..    *pt
1ae0: 72 2b 2b 20 3d 20 68 65 78 5b 28 6d 64 5f 62 75  r++ = hex[(md_bu
1af0: 66 5b 69 5d 20 3e 3e 20 34 29 20 26 20 30 78 30  f[i] >> 4) & 0x0
1b00: 46 5d 3b 0a 09 20 20 20 20 2a 70 74 72 2b 2b 20  F];..    *ptr++ 
1b10: 3d 20 68 65 78 5b 6d 64 5f 62 75 66 5b 69 5d 20  = hex[md_buf[i] 
1b20: 26 20 30 78 30 46 5d 3b 0a 09 7d 0a 09 54 63 6c  & 0x0F];..}..Tcl
1b30: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
1b40: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 29  terp, resultObj)
1b50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
1b60: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1b70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bb0: 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  **/../*. *------
1bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
1c00: 0a 20 2a 20 54 6c 73 5f 44 69 67 65 73 74 46 69  . * Tls_DigestFi
1c10: 6c 65 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 75  le --. *. *.Retu
1c20: 72 6e 20 6d 65 73 73 61 67 65 20 64 69 67 65 73  rn message diges
1c30: 74 20 66 6f 72 20 66 69 6c 65 20 75 73 69 6e 67  t for file using
1c40: 20 75 73 65 72 20 73 70 65 63 69 66 69 65 64 20   user specified 
1c50: 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 0a 20  hash function.. 
1c60: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a  *. * Returns:. *
1c70: 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45  .TCL_OK or TCL_E
1c80: 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20  RROR. *. * Side 
1c90: 65 66 66 65 63 74 73 3a 0a 20 2a 09 52 65 73 75  effects:. *.Resu
1ca0: 6c 74 20 69 73 20 6d 65 73 73 61 67 65 20 64 69  lt is message di
1cb0: 67 65 73 74 20 6f 72 20 65 72 72 6f 72 20 6d 65  gest or error me
1cc0: 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  ssage. *. *-----
1cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
1d10: 2a 2f 0a 69 6e 74 20 54 6c 73 5f 44 69 67 65 73  */.int Tls_Diges
1d20: 74 46 69 6c 65 28 54 63 6c 5f 49 6e 74 65 72 70  tFile(Tcl_Interp
1d30: 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62   *interp, Tcl_Ob
1d40: 6a 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e  j *filename, con
1d50: 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 2c 0a 09  st EVP_MD *md,..
1d60: 63 6f 6e 73 74 20 45 56 50 5f 43 49 50 48 45 52  const EVP_CIPHER
1d70: 20 2a 63 69 70 68 65 72 2c 20 69 6e 74 20 66 6f   *cipher, int fo
1d80: 72 6d 61 74 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6b  rmat, Tcl_Obj *k
1d90: 65 79 4f 62 6a 29 20 7b 0a 20 20 20 20 44 69 67  eyObj) {.    Dig
1da0: 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50  estState *stateP
1db0: 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  tr;.    Tcl_Chan
1dc0: 6e 65 6c 20 63 68 61 6e 20 3d 20 4e 55 4c 4c 3b  nel chan = NULL;
1dd0: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
1de0: 61 72 20 62 75 66 5b 42 55 46 46 45 52 5f 53 49  ar buf[BUFFER_SI
1df0: 5a 45 5d 3b 0a 20 20 20 20 69 6e 74 20 72 65 73  ZE];.    int res
1e00: 20 3d 20 54 43 4c 5f 4f 4b 2c 20 6c 65 6e 3b 0a   = TCL_OK, len;.
1e10: 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c  .    /* Open fil
1e20: 65 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20  e channel */.   
1e30: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 46 53 4f 70   chan = Tcl_FSOp
1e40: 65 6e 46 69 6c 65 43 68 61 6e 6e 65 6c 28 69 6e  enFileChannel(in
1e50: 74 65 72 70 2c 20 66 69 6c 65 6e 61 6d 65 2c 20  terp, filename, 
1e60: 22 72 62 22 2c 20 30 34 34 34 29 3b 0a 20 20 20  "rb", 0444);.   
1e70: 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63   if (chan == (Tc
1e80: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29  l_Channel) NULL)
1e90: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
1ea0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
1eb0: 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 20 63 68   /* Configure ch
1ec0: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20  annel */.    if 
1ed0: 28 28 72 65 73 20 3d 20 54 63 6c 5f 53 65 74 43  ((res = Tcl_SetC
1ee0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
1ef0: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61  erp, chan, "-tra
1f00: 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61  nslation", "bina
1f10: 72 79 22 29 29 20 3d 3d 20 54 43 4c 5f 45 52 52  ry")) == TCL_ERR
1f20: 4f 52 29 20 7b 0a 09 67 6f 74 6f 20 64 6f 6e 65  OR) {..goto done
1f30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  ;.    }.    Tcl_
1f40: 53 65 74 43 68 61 6e 6e 65 6c 42 75 66 66 65 72  SetChannelBuffer
1f50: 53 69 7a 65 28 63 68 61 6e 2c 20 42 55 46 46 45  Size(chan, BUFFE
1f60: 52 5f 53 49 5a 45 29 3b 0a 0a 20 20 20 20 2f 2a  R_SIZE);..    /*
1f70: 20 43 72 65 61 74 65 20 73 74 61 74 65 20 64 61   Create state da
1f80: 74 61 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 20  ta struct */.   
1f90: 20 69 66 20 28 28 73 74 61 74 65 50 74 72 20 3d   if ((statePtr =
1fa0: 20 54 6c 73 5f 44 69 67 65 73 74 4e 65 77 28 69   Tls_DigestNew(i
1fb0: 6e 74 65 72 70 2c 20 66 6f 72 6d 61 74 29 29 20  nterp, format)) 
1fc0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 20  == NULL) {..res 
1fd0: 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 67 6f  = TCL_ERROR;..go
1fe0: 74 6f 20 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 0a  to done;.    }..
1ff0: 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
2000: 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20  e hash function 
2010: 2a 2f 0a 20 20 20 20 69 66 20 28 28 72 65 73 20  */.    if ((res 
2020: 3d 20 54 6c 73 5f 44 69 67 65 73 74 49 6e 69 74  = Tls_DigestInit
2030: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
2040: 72 2c 20 6d 64 2c 20 63 69 70 68 65 72 2c 20 6b  r, md, cipher, k
2050: 65 79 4f 62 6a 29 29 20 21 3d 20 54 43 4c 5f 4f  eyObj)) != TCL_O
2060: 4b 29 20 7b 0a 09 67 6f 74 6f 20 64 6f 6e 65 3b  K) {..goto done;
2070: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
2080: 65 61 64 20 66 69 6c 65 20 64 61 74 61 20 61 6e  ead file data an
2090: 64 20 75 70 64 61 74 65 20 68 61 73 68 20 66 75  d update hash fu
20a0: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 77 68  nction */.    wh
20b0: 69 6c 65 20 28 21 54 63 6c 5f 45 6f 66 28 63 68  ile (!Tcl_Eof(ch
20c0: 61 6e 29 29 20 7b 0a 09 6c 65 6e 20 3d 20 54 63  an)) {..len = Tc
20d0: 6c 5f 52 65 61 64 52 61 77 28 63 68 61 6e 2c 20  l_ReadRaw(chan, 
20e0: 28 63 68 61 72 20 2a 29 20 62 75 66 2c 20 42 55  (char *) buf, BU
20f0: 46 46 45 52 5f 53 49 5a 45 29 3b 0a 09 69 66 20  FFER_SIZE);..if 
2100: 28 6c 65 6e 20 3e 20 30 29 20 7b 0a 09 20 20 20  (len > 0) {..   
2110: 20 69 66 20 28 21 54 6c 73 5f 44 69 67 65 73 74   if (!Tls_Digest
2120: 55 70 64 61 74 65 28 73 74 61 74 65 50 74 72 2c  Update(statePtr,
2130: 20 26 62 75 66 5b 30 5d 2c 20 28 73 69 7a 65 5f   &buf[0], (size_
2140: 74 29 20 6c 65 6e 29 29 20 7b 0a 09 09 54 63 6c  t) len)) {...Tcl
2150: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
2160: 74 65 72 70 2c 20 22 55 70 64 61 74 65 20 64 69  terp, "Update di
2170: 67 65 73 74 20 66 61 69 6c 65 64 3a 20 22 2c 20  gest failed: ", 
2180: 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b  REASON(), NULL);
2190: 0a 09 09 72 65 73 20 3d 20 54 43 4c 5f 45 52 52  ...res = TCL_ERR
21a0: 4f 52 3b 0a 09 09 67 6f 74 6f 20 64 6f 6e 65 3b  OR;...goto done;
21b0: 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d  ..    }..}.    }
21c0: 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a  ..    /* Finaliz
21d0: 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20  e hash function 
21e0: 61 6e 64 20 63 61 6c 63 75 6c 61 74 65 20 6d 65  and calculate me
21f0: 73 73 61 67 65 20 64 69 67 65 73 74 20 2a 2f 0a  ssage digest */.
2200: 20 20 20 20 72 65 73 20 3d 20 54 6c 73 5f 44 69      res = Tls_Di
2210: 67 65 73 74 46 69 6e 69 61 6c 69 7a 65 28 69 6e  gestFinialize(in
2220: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 29 3b  terp, statePtr);
2230: 0a 0a 64 6f 6e 65 3a 0a 20 20 20 20 2f 2a 20 43  ..done:.    /* C
2240: 6c 6f 73 65 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  lose channel */.
2250: 20 20 20 20 69 66 20 28 54 63 6c 5f 43 6c 6f 73      if (Tcl_Clos
2260: 65 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 20  e(interp, chan) 
2270: 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a  == TCL_ERROR) {.
2280: 09 72 65 73 20 3d 20 54 43 4c 5f 45 52 52 4f 52  .res = TCL_ERROR
2290: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
22a0: 43 6c 65 61 6e 2d 75 70 20 2a 2f 0a 20 20 20 20  Clean-up */.    
22b0: 54 6c 73 5f 44 69 67 65 73 74 46 72 65 65 28 73  Tls_DigestFree(s
22c0: 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 72 65  tatePtr);.    re
22d0: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 2a  turn res;.}../**
22e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2320: 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  */../*. *-------
2330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
2370: 20 2a 20 44 69 67 65 73 74 42 6c 6f 63 6b 4d 6f   * DigestBlockMo
2380: 64 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09  deProc --. *. *.
2390: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
23a0: 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20   invoked by the 
23b0: 67 65 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 6c  generic IO level
23c0: 0a 20 2a 20 20 20 20 20 20 20 74 6f 20 73 65 74  . *       to set
23d0: 20 62 6c 6f 63 6b 69 6e 67 20 61 6e 64 20 6e 6f   blocking and no
23e0: 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 2e  nblocking modes.
23f0: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a  . *. * Returns:.
2400: 20 2a 09 30 20 69 66 20 73 75 63 63 65 73 73 66   *.0 if successf
2410: 75 6c 20 6f 72 20 50 4f 53 49 58 20 65 72 72 6f  ul or POSIX erro
2420: 72 20 63 6f 64 65 20 69 66 20 66 61 69 6c 65 64  r code if failed
2430: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
2440: 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 74 68  ects:. *.Sets th
2450: 65 20 64 65 76 69 63 65 20 69 6e 74 6f 20 62 6c  e device into bl
2460: 6f 63 6b 69 6e 67 20 6f 72 20 6e 6f 6e 62 6c 6f  ocking or nonblo
2470: 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 2a 09 43  cking mode.. *.C
2480: 61 6e 20 63 61 6c 6c 20 54 63 6c 5f 53 65 74 43  an call Tcl_SetC
2490: 68 61 6e 6e 65 6c 45 72 72 6f 72 2e 0a 20 2a 0a  hannelError.. *.
24a0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
24b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
24f0: 20 69 6e 74 20 44 69 67 65 73 74 42 6c 6f 63 6b   int DigestBlock
2500: 4d 6f 64 65 50 72 6f 63 28 43 6c 69 65 6e 74 44  ModeProc(ClientD
2510: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
2520: 69 6e 74 20 6d 6f 64 65 29 20 7b 0a 20 20 20 20  int mode) {.    
2530: 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61  DigestState *sta
2540: 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53  tePtr = (DigestS
2550: 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61  tate *) clientDa
2560: 74 61 3b 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64  ta;..    if (mod
2570: 65 20 3d 3d 20 54 43 4c 5f 4d 4f 44 45 5f 4e 4f  e == TCL_MODE_NO
2580: 4e 42 4c 4f 43 4b 49 4e 47 29 20 7b 0a 09 73 74  NBLOCKING) {..st
2590: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d  atePtr->flags |=
25a0: 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 3b 0a   TLS_TCL_ASYNC;.
25b0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 74      } else {..st
25c0: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d  atePtr->flags &=
25d0: 20 7e 28 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43   ~(TLS_TCL_ASYNC
25e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
25f0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d  urn 0;.}../*. *-
2600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2640: 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 43  --. *. * DigestC
2650: 6c 6f 73 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20  loseProc --. *. 
2660: 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  *.This function 
2670: 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68  is invoked by th
2680: 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c 65 76  e generic IO lev
2690: 65 6c 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20 2a  el to perform. *
26a0: 09 63 68 61 6e 6e 65 6c 2d 74 79 70 65 2d 73 70  .channel-type-sp
26b0: 65 63 69 66 69 63 20 63 6c 65 61 6e 75 70 20 77  ecific cleanup w
26c0: 68 65 6e 20 63 68 61 6e 6e 65 6c 20 69 73 20 63  hen channel is c
26d0: 6c 6f 73 65 64 2e 20 41 6c 6c 0a 20 2a 09 71 75  losed. All. *.qu
26e0: 65 75 65 64 20 6f 75 74 70 75 74 20 69 73 20 66  eued output is f
26f0: 6c 75 73 68 65 64 20 70 72 69 6f 72 20 74 6f 20  lushed prior to 
2700: 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
2710: 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74  ction.. *. * Ret
2720: 75 72 6e 73 3a 0a 20 2a 09 30 20 69 66 20 73 75  urns:. *.0 if su
2730: 63 63 65 73 73 66 75 6c 20 6f 72 20 50 4f 53 49  ccessful or POSI
2740: 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  X error code if 
2750: 66 61 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 69  failed.. *. * Si
2760: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 57  de effects:. *.W
2770: 72 69 74 65 73 20 64 69 67 65 73 74 20 74 6f 20  rites digest to 
2780: 6f 75 74 70 75 74 20 61 6e 64 20 63 6c 6f 73 65  output and close
2790: 73 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e 20 53  s the channel. S
27a0: 74 6f 72 65 73 20 65 72 72 6f 72 0a 20 2a 09 6d  tores error. *.m
27b0: 65 73 73 61 67 65 73 20 69 6e 20 69 6e 74 65 72  essages in inter
27c0: 70 20 72 65 73 75 6c 74 20 75 73 69 6e 67 20 54  p result using T
27d0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 45 72 72  cl_GetChannelErr
27e0: 6f 72 49 6e 74 65 72 70 2e 0a 20 2a 0a 20 2a 2d  orInterp.. *. *-
27f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2830: 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73  --. */.int Diges
2840: 74 43 6c 6f 73 65 50 72 6f 63 28 43 6c 69 65 6e  tCloseProc(Clien
2850: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
2860: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
2870: 74 65 72 70 29 20 7b 0a 20 20 20 20 44 69 67 65  terp) {.    Dige
2880: 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74  stState *statePt
2890: 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 65  r = (DigestState
28a0: 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a   *) clientData;.
28b0: 0a 20 20 20 20 2f 2a 20 43 61 6e 63 65 6c 20 61  .    /* Cancel a
28c0: 63 74 69 76 65 20 74 69 6d 65 72 2c 20 69 66 20  ctive timer, if 
28d0: 61 6e 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 73  any */.    if (s
28e0: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21  tatePtr->timer !
28f0: 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65  = (Tcl_TimerToke
2900: 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f  n) NULL) {..Tcl_
2910: 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c  DeleteTimerHandl
2920: 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d  er(statePtr->tim
2930: 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  er);..statePtr->
2940: 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d  timer = (Tcl_Tim
2950: 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 20  erToken) NULL;. 
2960: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 65     }..    /* Cle
2970: 61 6e 2d 75 70 20 2a 2f 0a 20 20 20 20 54 6c 73  an-up */.    Tls
2980: 5f 44 69 67 65 73 74 46 72 65 65 28 73 74 61 74  _DigestFree(stat
2990: 65 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ePtr);.    retur
29a0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 61  n 0;.}../*. * Sa
29b0: 6d 65 20 61 73 20 44 69 67 65 73 74 43 6c 6f 73  me as DigestClos
29c0: 65 50 72 6f 63 20 62 75 74 20 77 69 74 68 20 69  eProc but with i
29d0: 6e 64 69 76 69 64 75 61 6c 20 72 65 61 64 20 61  ndividual read a
29e0: 6e 64 20 77 72 69 74 65 20 63 6c 6f 73 65 20 63  nd write close c
29f0: 6f 6e 74 72 6f 6c 0a 20 2a 2f 0a 73 74 61 74 69  ontrol. */.stati
2a00: 63 20 69 6e 74 20 44 69 67 65 73 74 43 6c 6f 73  c int DigestClos
2a10: 65 32 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74  e2Proc(ClientDat
2a20: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20  a instanceData, 
2a30: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2a40: 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 20 7b  rp, int flags) {
2a50: 0a 0a 20 20 20 20 69 66 20 28 28 66 6c 61 67 73  ..    if ((flags
2a60: 20 26 20 28 54 43 4c 5f 43 4c 4f 53 45 5f 52 45   & (TCL_CLOSE_RE
2a70: 41 44 20 7c 20 54 43 4c 5f 43 4c 4f 53 45 5f 57  AD | TCL_CLOSE_W
2a80: 52 49 54 45 29 29 20 3d 3d 20 30 29 20 7b 0a 09  RITE)) == 0) {..
2a90: 72 65 74 75 72 6e 20 44 69 67 65 73 74 43 6c 6f  return DigestClo
2aa0: 73 65 50 72 6f 63 28 69 6e 73 74 61 6e 63 65 44  seProc(instanceD
2ab0: 61 74 61 2c 20 69 6e 74 65 72 70 29 3b 0a 20 20  ata, interp);.  
2ac0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 45    }.    return E
2ad0: 49 4e 56 41 4c 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d  INVAL;.}../*. *-
2ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b20: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65  -----. *. * Dige
2b30: 73 74 49 6e 70 75 74 50 72 6f 63 20 2d 2d 0a 20  stInputProc --. 
2b40: 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79 20 74  *. *.Called by t
2b50: 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 73 79  he generic IO sy
2b60: 73 74 65 6d 20 74 6f 20 72 65 61 64 20 64 61 74  stem to read dat
2b70: 61 20 66 72 6f 6d 20 74 72 61 6e 73 66 6f 72 6d  a from transform
2b80: 20 61 6e 64 0a 20 2a 09 70 6c 61 63 65 20 69 6e   and. *.place in
2b90: 20 62 75 66 2e 0a 20 2a 0a 20 2a 20 52 65 74 75   buf.. *. * Retu
2ba0: 72 6e 73 3a 0a 20 2a 09 54 6f 74 61 6c 20 62 79  rns:. *.Total by
2bb0: 74 65 73 20 72 65 61 64 20 6f 72 20 2d 31 20 66  tes read or -1 f
2bc0: 6f 72 20 61 6e 20 65 72 72 6f 72 20 61 6c 6f 6e  or an error alon
2bd0: 67 20 77 69 74 68 20 61 20 50 4f 53 49 58 20 65  g with a POSIX e
2be0: 72 72 6f 72 0a 20 2a 09 63 6f 64 65 20 69 6e 20  rror. *.code in 
2bf0: 65 72 72 6f 72 43 6f 64 65 50 74 72 2e 20 55 73  errorCodePtr. Us
2c00: 65 20 45 41 47 41 49 4e 20 66 6f 72 20 6e 6f 6e  e EAGAIN for non
2c10: 62 6c 6f 63 6b 69 6e 67 20 61 6e 64 20 6e 6f 20  blocking and no 
2c20: 64 61 74 61 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  data.. *. * Side
2c30: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 52 65 61   effects:. *.Rea
2c40: 64 20 64 61 74 61 20 66 72 6f 6d 20 74 72 61 6e  d data from tran
2c50: 73 66 6f 72 6d 20 61 6e 64 20 77 72 69 74 65 20  sform and write 
2c60: 74 6f 20 62 75 66 0a 20 2a 0a 20 2a 2d 2d 2d 2d  to buf. *. *----
2c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2cb0: 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73  --. */.int Diges
2cc0: 74 49 6e 70 75 74 50 72 6f 63 28 43 6c 69 65 6e  tInputProc(Clien
2cd0: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
2ce0: 2c 20 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74  , char *buf, int
2cf0: 20 74 6f 52 65 61 64 2c 20 69 6e 74 20 2a 65 72   toRead, int *er
2d00: 72 6f 72 43 6f 64 65 50 74 72 29 20 7b 0a 20 20  rorCodePtr) {.  
2d10: 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73    DigestState *s
2d20: 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 73  tatePtr = (Diges
2d30: 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74  tState *) client
2d40: 44 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 43 68  Data;.    Tcl_Ch
2d50: 61 6e 6e 65 6c 20 70 61 72 65 6e 74 3b 0a 20 20  annel parent;.  
2d60: 20 20 69 6e 74 20 72 65 61 64 2c 20 72 65 73 20    int read, res 
2d70: 3d 20 30 3b 0a 20 20 20 20 2a 65 72 72 6f 72 43  = 0;.    *errorC
2d80: 6f 64 65 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20  odePtr = 0;..   
2d90: 20 2f 2a 20 41 62 6f 72 74 20 69 66 20 6e 6f 74   /* Abort if not
2da0: 68 69 6e 67 20 74 6f 20 70 72 6f 63 65 73 73 20  hing to process 
2db0: 2a 2f 0a 20 20 20 20 69 66 20 28 74 6f 52 65 61  */.    if (toRea
2dc0: 64 20 3c 3d 20 30 20 7c 7c 20 73 74 61 74 65 50  d <= 0 || stateP
2dd0: 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c  tr->self == (Tcl
2de0: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20  _Channel) NULL) 
2df0: 7b 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20  {..return 0;.   
2e00: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 62   }..    /* Get b
2e10: 79 74 65 73 20 66 72 6f 6d 20 75 6e 64 65 72 6c  ytes from underl
2e20: 79 69 6e 67 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  ying channel */.
2e30: 20 20 20 20 70 61 72 65 6e 74 20 3d 20 54 63 6c      parent = Tcl
2e40: 5f 47 65 74 53 74 61 63 6b 65 64 43 68 61 6e 6e  _GetStackedChann
2e50: 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  el(statePtr->sel
2e60: 66 29 3b 0a 20 20 20 20 72 65 61 64 20 3d 20 54  f);.    read = T
2e70: 63 6c 5f 52 65 61 64 52 61 77 28 70 61 72 65 6e  cl_ReadRaw(paren
2e80: 74 2c 20 62 75 66 2c 20 74 6f 52 65 61 64 29 3b  t, buf, toRead);
2e90: 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
2ea0: 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  hash function */
2eb0: 0a 20 20 20 20 69 66 20 28 72 65 61 64 20 3e 20  .    if (read > 
2ec0: 30 29 20 7b 0a 09 69 66 20 28 21 54 6c 73 5f 44  0) {..if (!Tls_D
2ed0: 69 67 65 73 74 55 70 64 61 74 65 28 73 74 61 74  igestUpdate(stat
2ee0: 65 50 74 72 2c 20 62 75 66 2c 20 28 73 69 7a 65  ePtr, buf, (size
2ef0: 5f 74 29 20 72 65 61 64 29 29 20 7b 0a 09 20 20  _t) read)) {..  
2f00: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c    Tcl_SetChannel
2f10: 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2d 3e  Error(statePtr->
2f20: 73 65 6c 66 2c 20 54 63 6c 5f 4f 62 6a 50 72 69  self, Tcl_ObjPri
2f30: 6e 74 66 28 22 44 69 67 65 73 74 20 75 70 64 61  ntf("Digest upda
2f40: 74 65 20 66 61 69 6c 65 64 3a 20 25 73 22 2c 20  te failed: %s", 
2f50: 52 45 41 53 4f 4e 28 29 29 29 3b 0a 09 20 20 20  REASON()));..   
2f60: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d   *errorCodePtr =
2f70: 20 45 49 4e 56 41 4c 3b 0a 09 20 20 20 20 72 65   EINVAL;..    re
2f80: 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 09 2f 2a 20  turn -1;..}../* 
2f90: 54 68 69 73 20 69 73 20 63 6f 72 72 65 63 74 20  This is correct 
2fa0: 2a 2f 0a 09 72 65 61 64 20 3d 20 2d 31 3b 0a 09  */..read = -1;..
2fb0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
2fc0: 45 41 47 41 49 4e 3b 0a 09 20 20 20 20 0a 20 20  EAGAIN;..    .  
2fd0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 72 65 61    } else if (rea
2fe0: 64 20 3c 20 30 29 20 7b 0a 09 2f 2a 20 45 72 72  d < 0) {../* Err
2ff0: 6f 72 20 2a 2f 0a 09 2a 65 72 72 6f 72 43 6f 64  or */..*errorCod
3000: 65 50 74 72 20 3d 20 54 63 6c 5f 47 65 74 45 72  ePtr = Tcl_GetEr
3010: 72 6e 6f 28 29 3b 0a 0a 20 20 20 20 7d 20 65 6c  rno();..    } el
3020: 73 65 20 69 66 20 28 21 28 73 74 61 74 65 50 74  se if (!(statePt
3030: 72 2d 3e 66 6c 61 67 73 20 26 20 43 48 41 4e 5f  r->flags & CHAN_
3040: 45 4f 46 29 29 20 7b 0a 09 2f 2a 20 45 4f 46 20  EOF)) {../* EOF 
3050: 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  */..unsigned cha
3060: 72 20 6d 64 5f 62 75 66 5b 45 56 50 5f 4d 41 58  r md_buf[EVP_MAX
3070: 5f 4d 44 5f 53 49 5a 45 5d 3b 0a 09 75 6e 73 69  _MD_SIZE];..unsi
3080: 67 6e 65 64 20 69 6e 74 20 6d 64 5f 6c 65 6e 20  gned int md_len 
3090: 3d 20 30 3b 0a 0a 09 2f 2a 20 46 69 6e 61 6c 69  = 0;.../* Finali
30a0: 7a 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e  ze hash function
30b0: 20 61 6e 64 20 63 61 6c 63 75 6c 61 74 65 20 6d   and calculate m
30c0: 65 73 73 61 67 65 20 64 69 67 65 73 74 20 2a 2f  essage digest */
30d0: 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e  ..if (statePtr->
30e0: 66 6f 72 6d 61 74 20 26 20 54 59 50 45 5f 4d 44  format & TYPE_MD
30f0: 29 20 7b 0a 09 20 20 20 20 72 65 73 20 3d 20 45  ) {..    res = E
3100: 56 50 5f 44 69 67 65 73 74 46 69 6e 61 6c 5f 65  VP_DigestFinal_e
3110: 78 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c  x(statePtr->ctx,
3120: 20 6d 64 5f 62 75 66 2c 20 26 6d 64 5f 6c 65 6e   md_buf, &md_len
3130: 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 73  );..} else if (s
3140: 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20  tatePtr->format 
3150: 26 20 54 59 50 45 5f 48 4d 41 43 29 20 7b 0a 09  & TYPE_HMAC) {..
3160: 20 20 20 20 72 65 73 20 3d 20 48 4d 41 43 5f 46      res = HMAC_F
3170: 69 6e 61 6c 28 73 74 61 74 65 50 74 72 2d 3e 68  inal(statePtr->h
3180: 63 74 78 2c 20 6d 64 5f 62 75 66 2c 20 26 6d 64  ctx, md_buf, &md
3190: 5f 6c 65 6e 29 3b 0a 09 7d 20 65 6c 73 65 20 69  _len);..} else i
31a0: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6f 72  f (statePtr->for
31b0: 6d 61 74 20 26 20 54 59 50 45 5f 43 4d 41 43 29  mat & TYPE_CMAC)
31c0: 20 7b 0a 09 20 20 20 20 73 69 7a 65 5f 74 20 6c   {..    size_t l
31d0: 65 6e 3b 0a 09 20 20 20 20 72 65 73 20 3d 20 43  en;..    res = C
31e0: 4d 41 43 5f 46 69 6e 61 6c 28 73 74 61 74 65 50  MAC_Final(stateP
31f0: 74 72 2d 3e 63 63 74 78 2c 20 6d 64 5f 62 75 66  tr->cctx, md_buf
3200: 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 6d 64  , &len);..    md
3210: 5f 6c 65 6e 20 3d 20 28 75 6e 73 69 67 6e 65 64  _len = (unsigned
3220: 20 69 6e 74 29 20 6c 65 6e 3b 0a 09 7d 0a 09 69   int) len;..}..i
3230: 66 20 28 21 72 65 73 29 20 7b 0a 09 20 20 20 20  f (!res) {..    
3240: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 45 72  Tcl_SetChannelEr
3250: 72 6f 72 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ror(statePtr->se
3260: 6c 66 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74  lf, Tcl_ObjPrint
3270: 66 28 22 44 69 67 65 73 74 20 66 69 6e 61 6c 69  f("Digest finali
3280: 7a 65 20 66 61 69 6c 65 64 3a 20 25 73 22 2c 20  ze failed: %s", 
3290: 52 45 41 53 4f 4e 28 29 29 29 3b 0a 09 20 20 20  REASON()));..   
32a0: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d   *errorCodePtr =
32b0: 20 45 49 4e 56 41 4c 3b 0a 0a 09 2f 2a 20 57 72   EINVAL;.../* Wr
32c0: 69 74 65 20 6d 65 73 73 61 67 65 20 64 69 67 65  ite message dige
32d0: 73 74 20 74 6f 20 6f 75 74 70 75 74 20 63 68 61  st to output cha
32e0: 6e 6e 65 6c 20 61 73 20 62 79 74 65 20 61 72 72  nnel as byte arr
32f0: 61 79 20 6f 72 20 68 65 78 20 73 74 72 69 6e 67  ay or hex string
3300: 20 2a 2f 0a 09 7d 20 65 6c 73 65 20 69 66 20 28   */..} else if (
3310: 6d 64 5f 6c 65 6e 20 3e 20 30 29 20 7b 0a 09 20  md_len > 0) {.. 
3320: 20 20 20 69 66 20 28 28 73 74 61 74 65 50 74 72     if ((statePtr
3330: 2d 3e 66 6f 72 6d 61 74 20 26 20 42 49 4e 5f 46  ->format & BIN_F
3340: 4f 52 4d 41 54 29 20 26 26 20 74 6f 52 65 61 64  ORMAT) && toRead
3350: 20 3e 3d 20 28 69 6e 74 29 20 6d 64 5f 6c 65 6e   >= (int) md_len
3360: 29 20 7b 0a 09 09 72 65 61 64 20 3d 20 6d 64 5f  ) {...read = md_
3370: 6c 65 6e 3b 0a 09 09 6d 65 6d 63 70 79 28 62 75  len;...memcpy(bu
3380: 66 2c 20 6d 64 5f 62 75 66 2c 20 72 65 61 64 29  f, md_buf, read)
3390: 3b 0a 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
33a0: 66 28 28 73 74 61 74 65 50 74 72 2d 3e 66 6f 72  f((statePtr->for
33b0: 6d 61 74 20 26 20 48 45 58 5f 46 4f 52 4d 41 54  mat & HEX_FORMAT
33c0: 29 20 26 26 20 74 6f 52 65 61 64 20 3e 3d 20 28  ) && toRead >= (
33d0: 69 6e 74 29 20 28 6d 64 5f 6c 65 6e 2a 32 29 29  int) (md_len*2))
33e0: 20 7b 0a 09 09 75 6e 73 69 67 6e 65 64 20 63 68   {...unsigned ch
33f0: 61 72 20 68 65 78 5f 62 75 66 5b 45 56 50 5f 4d  ar hex_buf[EVP_M
3400: 41 58 5f 4d 44 5f 53 49 5a 45 2a 32 5d 3b 0a 09  AX_MD_SIZE*2];..
3410: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  .unsigned char *
3420: 70 74 72 20 3d 20 68 65 78 5f 62 75 66 3b 0a 0a  ptr = hex_buf;..
3430: 09 09 66 6f 72 20 28 75 6e 73 69 67 6e 65 64 20  ..for (unsigned 
3440: 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 6d  int i = 0; i < m
3450: 64 5f 6c 65 6e 3b 20 69 2b 2b 29 20 7b 0a 09 09  d_len; i++) {...
3460: 20 20 20 20 2a 70 74 72 2b 2b 20 3d 20 68 65 78      *ptr++ = hex
3470: 5b 28 6d 64 5f 62 75 66 5b 69 5d 20 3e 3e 20 34  [(md_buf[i] >> 4
3480: 29 20 26 20 30 78 30 46 5d 3b 0a 09 09 20 20 20  ) & 0x0F];...   
3490: 20 2a 70 74 72 2b 2b 20 3d 20 68 65 78 5b 6d 64   *ptr++ = hex[md
34a0: 5f 62 75 66 5b 69 5d 20 26 20 30 78 30 46 5d 3b  _buf[i] & 0x0F];
34b0: 0a 09 09 7d 0a 09 09 72 65 61 64 20 3d 20 6d 64  ...}...read = md
34c0: 5f 6c 65 6e 2a 32 3b 0a 09 09 6d 65 6d 63 70 79  _len*2;...memcpy
34d0: 28 62 75 66 2c 20 68 65 78 5f 62 75 66 2c 20 72  (buf, hex_buf, r
34e0: 65 61 64 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a  ead);..    }..}.
34f0: 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73  .statePtr->flags
3500: 20 7c 3d 20 43 48 41 4e 5f 45 4f 46 3b 0a 20 20   |= CHAN_EOF;.  
3510: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
3520: 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  ead;.}../*. *---
3530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3570: 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74  ---. *. * Digest
3580: 4f 75 74 70 75 74 50 72 6f 63 20 2d 2d 0a 20 2a  OutputProc --. *
3590: 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79 20 74 68  . *.Called by th
35a0: 65 20 67 65 6e 65 72 69 63 20 49 4f 20 73 79 73  e generic IO sys
35b0: 74 65 6d 20 74 6f 20 77 72 69 74 65 20 64 61 74  tem to write dat
35c0: 61 20 69 6e 20 62 75 66 20 74 6f 20 74 72 61 6e  a in buf to tran
35d0: 73 66 6f 72 6d 2e 0a 20 2a 0a 20 2a 20 52 65 74  sform.. *. * Ret
35e0: 75 72 6e 73 3a 0a 20 2a 09 54 6f 74 61 6c 20 62  urns:. *.Total b
35f0: 79 74 65 73 20 77 72 69 74 74 65 6e 20 6f 72 20  ytes written or 
3600: 2d 31 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 20  -1 for an error 
3610: 61 6c 6f 6e 67 20 77 69 74 68 20 61 20 50 4f 53  along with a POS
3620: 49 58 20 65 72 72 6f 72 0a 20 2a 09 63 6f 64 65  IX error. *.code
3630: 20 69 6e 20 65 72 72 6f 72 43 6f 64 65 50 74 72   in errorCodePtr
3640: 2e 20 55 73 65 20 45 41 47 41 49 4e 20 66 6f 72  . Use EAGAIN for
3650: 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 61 6e 64   nonblocking and
3660: 20 63 61 6e 27 74 20 77 72 69 74 65 20 64 61 74   can't write dat
3670: 61 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  a.. *. * Side ef
3680: 66 65 63 74 73 3a 0a 20 2a 09 47 65 74 20 64 61  fects:. *.Get da
3690: 74 61 20 66 72 6f 6d 20 62 75 66 20 61 6e 64 20  ta from buf and 
36a0: 75 70 64 61 74 65 20 64 69 67 65 73 74 0a 20 2a  update digest. *
36b0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
36c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36d0: 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 20 69  ---------. */. i
3700: 6e 74 20 44 69 67 65 73 74 4f 75 74 70 75 74 50  nt DigestOutputP
3710: 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 63  roc(ClientData c
3720: 6c 69 65 6e 74 44 61 74 61 2c 20 63 6f 6e 73 74  lientData, const
3730: 20 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20   char *buf, int 
3740: 74 6f 57 72 69 74 65 2c 20 69 6e 74 20 2a 65 72  toWrite, int *er
3750: 72 6f 72 43 6f 64 65 50 74 72 29 20 7b 0a 20 20  rorCodePtr) {.  
3760: 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73    DigestState *s
3770: 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 73  tatePtr = (Diges
3780: 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74  tState *) client
3790: 44 61 74 61 3b 0a 20 20 20 20 2a 65 72 72 6f 72  Data;.    *error
37a0: 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 0a 20 20  CodePtr = 0;..  
37b0: 20 20 2f 2a 20 41 62 6f 72 74 20 69 66 20 6e 6f    /* Abort if no
37c0: 74 68 69 6e 67 20 74 6f 20 70 72 6f 63 65 73 73  thing to process
37d0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 74 6f 57 72   */.    if (toWr
37e0: 69 74 65 20 3c 3d 20 30 20 7c 7c 20 73 74 61 74  ite <= 0 || stat
37f0: 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54  ePtr->self == (T
3800: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c  cl_Channel) NULL
3810: 29 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20  ) {..return 0;. 
3820: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64     }..    /* Upd
3830: 61 74 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f  ate hash functio
3840: 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 74 6f 57  n */.    if (toW
3850: 72 69 74 65 20 3e 20 30 20 26 26 20 21 54 6c 73  rite > 0 && !Tls
3860: 5f 44 69 67 65 73 74 55 70 64 61 74 65 28 73 74  _DigestUpdate(st
3870: 61 74 65 50 74 72 2c 20 62 75 66 2c 20 28 73 69  atePtr, buf, (si
3880: 7a 65 5f 74 29 20 74 6f 57 72 69 74 65 29 29 20  ze_t) toWrite)) 
3890: 7b 0a 09 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65  {..Tcl_SetChanne
38a0: 6c 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2d  lError(statePtr-
38b0: 3e 73 65 6c 66 2c 20 54 63 6c 5f 4f 62 6a 50 72  >self, Tcl_ObjPr
38c0: 69 6e 74 66 28 22 44 69 67 65 73 74 20 75 70 64  intf("Digest upd
38d0: 61 74 65 20 66 61 69 6c 65 64 3a 20 25 73 22 2c  ate failed: %s",
38e0: 20 52 45 41 53 4f 4e 28 29 29 29 3b 0a 09 2a 65   REASON()));..*e
38f0: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49  rrorCodePtr = EI
3900: 4e 56 41 4c 3b 0a 09 72 65 74 75 72 6e 20 2d 31  NVAL;..return -1
3910: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
3920: 72 6e 20 74 6f 57 72 69 74 65 3b 0a 7d 0a 0a 2f  rn toWrite;.}../
3930: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
3940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
3980: 20 44 69 67 65 73 74 53 65 74 4f 70 74 69 6f 6e   DigestSetOption
3990: 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61  Proc --. *. *.Ca
39a0: 6c 6c 65 64 20 62 79 20 74 68 65 20 67 65 6e 65  lled by the gene
39b0: 72 69 63 20 49 4f 20 73 79 73 74 65 6d 20 74 6f  ric IO system to
39c0: 20 73 65 74 20 63 68 61 6e 6e 65 6c 20 6f 70 74   set channel opt
39d0: 69 6f 6e 20 6e 61 6d 65 20 74 6f 20 76 61 6c 75  ion name to valu
39e0: 65 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73  e.. *. * Returns
39f0: 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 69 66 20 73  :. *.TCL_OK if s
3a00: 75 63 63 65 73 73 66 75 6c 20 6f 72 20 54 43 4c  uccessful or TCL
3a10: 5f 45 52 52 4f 52 20 69 66 20 66 61 69 6c 65 64  _ERROR if failed
3a20: 20 61 6c 6f 6e 67 20 77 69 74 68 20 61 6e 20 65   along with an e
3a30: 72 72 6f 72 0a 20 2a 09 6d 65 73 73 61 67 65 20  rror. *.message 
3a40: 69 6e 20 69 6e 74 65 72 70 20 61 6e 64 20 54 63  in interp and Tc
3a50: 6c 5f 53 65 74 45 72 72 6e 6f 2e 0a 20 2a 0a 20  l_SetErrno.. *. 
3a60: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
3a70: 20 2a 09 55 70 64 61 74 65 73 20 63 68 61 6e 6e   *.Updates chann
3a80: 65 6c 20 6f 70 74 69 6f 6e 20 74 6f 20 6e 65 77  el option to new
3a90: 20 76 61 6c 75 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d   value.. *. *---
3aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ae0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
3af0: 6e 74 20 44 69 67 65 73 74 53 65 74 4f 70 74 69  nt DigestSetOpti
3b00: 6f 6e 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74  onProc(ClientDat
3b10: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63  a clientData, Tc
3b20: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
3b30: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70  , const char *op
3b40: 74 69 6f 6e 4e 61 6d 65 2c 0a 09 63 6f 6e 73 74  tionName,..const
3b50: 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e 56 61 6c   char *optionVal
3b60: 75 65 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74  ue) {.    Digest
3b70: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20  State *statePtr 
3b80: 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a  = (DigestState *
3b90: 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20  ) clientData;.  
3ba0: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 70 61    Tcl_Channel pa
3bb0: 72 65 6e 74 3b 0a 20 20 20 20 54 63 6c 5f 44 72  rent;.    Tcl_Dr
3bc0: 69 76 65 72 53 65 74 4f 70 74 69 6f 6e 50 72 6f  iverSetOptionPro
3bd0: 63 20 2a 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63  c *setOptionProc
3be0: 3b 0a 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74 20  ;..    /* Abort 
3bf0: 69 66 20 6e 6f 20 63 68 61 6e 6e 65 6c 20 2a 2f  if no channel */
3c00: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
3c10: 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f  r->self == (Tcl_
3c20: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
3c30: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
3c40: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
3c50: 2a 20 44 65 6c 65 67 61 74 65 20 6f 70 74 69 6f  * Delegate optio
3c60: 6e 73 20 64 6f 77 6e 73 74 72 65 61 6d 20 2a 2f  ns downstream */
3c70: 0a 20 20 20 20 70 61 72 65 6e 74 20 3d 20 54 63  .    parent = Tc
3c80: 6c 5f 47 65 74 53 74 61 63 6b 65 64 43 68 61 6e  l_GetStackedChan
3c90: 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 65  nel(statePtr->se
3ca0: 6c 66 29 3b 0a 20 20 20 20 73 65 74 4f 70 74 69  lf);.    setOpti
3cb0: 6f 6e 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68 61  onProc = Tcl_Cha
3cc0: 6e 6e 65 6c 53 65 74 4f 70 74 69 6f 6e 50 72 6f  nnelSetOptionPro
3cd0: 63 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  c(Tcl_GetChannel
3ce0: 54 79 70 65 28 70 61 72 65 6e 74 29 29 3b 0a 20  Type(parent));. 
3cf0: 20 20 20 69 66 20 28 73 65 74 4f 70 74 69 6f 6e     if (setOption
3d00: 50 72 6f 63 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  Proc != NULL) {.
3d10: 09 72 65 74 75 72 6e 20 28 2a 73 65 74 4f 70 74  .return (*setOpt
3d20: 69 6f 6e 50 72 6f 63 29 28 54 63 6c 5f 47 65 74  ionProc)(Tcl_Get
3d30: 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44  ChannelInstanceD
3d40: 61 74 61 28 70 61 72 65 6e 74 29 2c 20 69 6e 74  ata(parent), int
3d50: 65 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c  erp, optionName,
3d60: 20 6f 70 74 69 6f 6e 56 61 6c 75 65 29 3b 0a 20   optionValue);. 
3d70: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c     } else {..Tcl
3d80: 5f 53 65 74 45 72 72 6e 6f 28 45 49 4e 56 41 4c  _SetErrno(EINVAL
3d90: 29 3b 0a 09 72 65 74 75 72 6e 20 54 63 6c 5f 42  );..return Tcl_B
3da0: 61 64 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  adChannelOption(
3db0: 69 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e 4e 61  interp, optionNa
3dc0: 6d 65 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d  me, NULL);.    }
3dd0: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
3de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
3e20: 20 2a 0a 20 2a 20 44 69 67 65 73 74 47 65 74 4f   *. * DigestGetO
3e30: 70 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20 2a 0a  ptionProc --. *.
3e40: 20 2a 09 43 61 6c 6c 65 64 20 62 79 20 74 68 65   *.Called by the
3e50: 20 67 65 6e 65 72 69 63 20 49 4f 20 73 79 73 74   generic IO syst
3e60: 65 6d 20 74 6f 20 67 65 74 20 63 68 61 6e 6e 65  em to get channe
3e70: 6c 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 27 73 20  l option name's 
3e80: 76 61 6c 75 65 2e 0a 20 2a 0a 20 2a 20 52 65 74  value.. *. * Ret
3e90: 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20  urns:. *.TCL_OK 
3ea0: 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72  if successful or
3eb0: 20 54 43 4c 5f 45 52 52 4f 52 20 69 66 20 66 61   TCL_ERROR if fa
3ec0: 69 6c 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20  iled along with 
3ed0: 61 6e 20 65 72 72 6f 72 0a 20 2a 09 6d 65 73 73  an error. *.mess
3ee0: 61 67 65 20 69 6e 20 69 6e 74 65 72 70 20 61 6e  age in interp an
3ef0: 64 20 54 63 6c 5f 53 65 74 45 72 72 6e 6f 2e 0a  d Tcl_SetErrno..
3f00: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
3f10: 74 73 3a 0a 20 2a 09 53 65 74 73 20 72 65 73 75  ts:. *.Sets resu
3f20: 6c 74 20 74 6f 20 6f 70 74 69 6f 6e 27 73 20 76  lt to option's v
3f30: 61 6c 75 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  alue. *. *------
3f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f80: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
3f90: 44 69 67 65 73 74 47 65 74 4f 70 74 69 6f 6e 50  DigestGetOptionP
3fa0: 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 63  roc(ClientData c
3fb0: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
3fc0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 63  nterp *interp, c
3fd0: 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70 74 69 6f  onst char *optio
3fe0: 6e 4e 61 6d 65 2c 0a 09 54 63 6c 5f 44 53 74 72  nName,..Tcl_DStr
3ff0: 69 6e 67 20 2a 6f 70 74 69 6f 6e 56 61 6c 75 65  ing *optionValue
4000: 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74  ) {.    DigestSt
4010: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
4020: 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 29 20  (DigestState *) 
4030: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20  clientData;.    
4040: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 70 61 72 65  Tcl_Channel pare
4050: 6e 74 3b 0a 20 20 20 20 54 63 6c 5f 44 72 69 76  nt;.    Tcl_Driv
4060: 65 72 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20  erGetOptionProc 
4070: 2a 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 3b 0a  *getOptionProc;.
4080: 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 69 66  .    /* Abort if
4090: 20 6e 6f 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20   no channel */. 
40a0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
40b0: 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68  >self == (Tcl_Ch
40c0: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
40d0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
40e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
40f0: 44 65 6c 65 67 61 74 65 20 6f 70 74 69 6f 6e 73  Delegate options
4100: 20 64 6f 77 6e 73 74 72 65 61 6d 20 2a 2f 0a 20   downstream */. 
4110: 20 20 20 70 61 72 65 6e 74 20 3d 20 54 63 6c 5f     parent = Tcl_
4120: 47 65 74 53 74 61 63 6b 65 64 43 68 61 6e 6e 65  GetStackedChanne
4130: 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  l(statePtr->self
4140: 29 3b 0a 20 20 20 20 67 65 74 4f 70 74 69 6f 6e  );.    getOption
4150: 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68 61 6e 6e  Proc = Tcl_Chann
4160: 65 6c 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28  elGetOptionProc(
4170: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79  Tcl_GetChannelTy
4180: 70 65 28 70 61 72 65 6e 74 29 29 3b 0a 20 20 20  pe(parent));.   
4190: 20 69 66 20 28 67 65 74 4f 70 74 69 6f 6e 50 72   if (getOptionPr
41a0: 6f 63 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  oc != NULL) {..r
41b0: 65 74 75 72 6e 20 28 2a 67 65 74 4f 70 74 69 6f  eturn (*getOptio
41c0: 6e 50 72 6f 63 29 28 54 63 6c 5f 47 65 74 43 68  nProc)(Tcl_GetCh
41d0: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74  annelInstanceDat
41e0: 61 28 70 61 72 65 6e 74 29 2c 20 69 6e 74 65 72  a(parent), inter
41f0: 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 6f  p, optionName, o
4200: 70 74 69 6f 6e 56 61 6c 75 65 29 3b 0a 20 20 20  ptionValue);.   
4210: 20 7d 20 65 6c 73 65 20 69 66 20 28 6f 70 74 69   } else if (opti
4220: 6f 6e 4e 61 6d 65 20 3d 3d 20 28 63 68 61 72 2a  onName == (char*
4230: 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 52 65  ) NULL) {../* Re
4240: 71 75 65 73 74 20 69 73 20 71 75 65 72 79 20 66  quest is query f
4250: 6f 72 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 2c 20  or all options, 
4260: 74 68 69 73 20 69 73 20 6f 6b 2e 20 2a 2f 0a 09  this is ok. */..
4270: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20  return TCL_OK;. 
4280: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c     } else {..Tcl
4290: 5f 53 65 74 45 72 72 6e 6f 28 45 49 4e 56 41 4c  _SetErrno(EINVAL
42a0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 63 6c 5f 42  );..return Tcl_B
42b0: 61 64 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  adChannelOption(
42c0: 69 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e 4e 61  interp, optionNa
42d0: 6d 65 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d  me, NULL);.    }
42e0: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
42f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
4330: 20 2a 0a 20 2a 20 44 69 67 65 73 74 54 69 6d 65   *. * DigestTime
4340: 72 48 61 6e 64 6c 65 72 20 2d 2d 0a 20 2a 0a 20  rHandler --. *. 
4350: 2a 09 43 61 6c 6c 65 64 20 62 79 20 74 68 65 20  *.Called by the 
4360: 6e 6f 74 69 66 69 65 72 20 76 69 61 20 74 69 6d  notifier via tim
4370: 65 72 20 74 6f 20 66 6c 75 73 68 20 6f 75 74 20  er to flush out 
4380: 70 65 6e 64 69 6e 67 20 69 6e 70 75 74 20 64 61  pending input da
4390: 74 61 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  ta.. *. * Return
43a0: 73 3a 0a 20 2a 09 4e 6f 74 68 69 6e 67 0a 20 2a  s:. *.Nothing. *
43b0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
43c0: 3a 0a 20 2a 09 4d 61 79 20 63 61 6c 6c 20 54 63  :. *.May call Tc
43d0: 6c 5f 4e 6f 74 69 66 79 43 68 61 6e 6e 65 6c 0a  l_NotifyChannel.
43e0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
43f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
4430: 73 74 61 74 69 63 20 76 6f 69 64 20 44 69 67 65  static void Dige
4440: 73 74 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 43  stTimerHandler(C
4450: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
4460: 44 61 74 61 29 20 7b 0a 20 20 20 20 44 69 67 65  Data) {.    Dige
4470: 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74  stState *statePt
4480: 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 65  r = (DigestState
4490: 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a   *) clientData;.
44a0: 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 69 66  .    /* Abort if
44b0: 20 6e 6f 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20   no channel */. 
44c0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
44d0: 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68  >self == (Tcl_Ch
44e0: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
44f0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20  return;.    }.. 
4500: 20 20 20 2f 2a 20 43 6c 65 61 72 20 74 69 6d 65     /* Clear time
4510: 72 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 73  r token */.    s
4520: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d  tatePtr->timer =
4530: 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e   (Tcl_TimerToken
4540: 29 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20  ) NULL;..    /* 
4550: 46 69 72 65 20 65 76 65 6e 74 20 69 66 20 74 68  Fire event if th
4560: 65 72 65 20 69 73 20 70 65 6e 64 69 6e 67 20 64  ere is pending d
4570: 61 74 61 2c 20 73 6b 69 70 20 6f 74 68 65 72 77  ata, skip otherw
4580: 69 73 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 28  ise */.    if ((
4590: 73 74 61 74 65 50 74 72 2d 3e 77 61 74 63 68 4d  statePtr->watchM
45a0: 61 73 6b 20 26 20 54 43 4c 5f 52 45 41 44 41 42  ask & TCL_READAB
45b0: 4c 45 29 20 26 26 20 28 54 63 6c 5f 49 6e 70 75  LE) && (Tcl_Inpu
45c0: 74 42 75 66 66 65 72 65 64 28 73 74 61 74 65 50  tBuffered(stateP
45d0: 74 72 2d 3e 73 65 6c 66 29 20 3e 20 30 29 29 20  tr->self) > 0)) 
45e0: 7b 0a 09 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61  {..Tcl_NotifyCha
45f0: 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73  nnel(statePtr->s
4600: 65 6c 66 2c 20 54 43 4c 5f 52 45 41 44 41 42 4c  elf, TCL_READABL
4610: 45 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a  E);.    }.}../*.
4620: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
4630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4660: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44  --------. *. * D
4670: 69 67 65 73 74 57 61 74 63 68 50 72 6f 63 20 2d  igestWatchProc -
4680: 2d 0a 20 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69  -. *. *.Initiali
4690: 7a 65 20 74 68 65 20 6e 6f 74 69 66 69 65 72 20  ze the notifier 
46a0: 74 6f 20 77 61 74 63 68 20 66 6f 72 20 65 76 65  to watch for eve
46b0: 6e 74 73 20 66 72 6f 6d 20 74 68 69 73 20 63 68  nts from this ch
46c0: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 74  annel.. *. * Ret
46d0: 75 72 6e 73 3a 0a 20 2a 09 4e 6f 74 68 69 6e 67  urns:. *.Nothing
46e0: 20 28 63 61 6e 27 74 20 72 65 74 75 72 6e 20 65   (can't return e
46f0: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 29 0a 20  rror messages). 
4700: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
4710: 73 3a 0a 20 2a 09 43 6f 6e 66 69 67 75 72 65 20  s:. *.Configure 
4720: 6e 6f 74 69 66 69 65 72 20 73 6f 20 66 75 74 75  notifier so futu
4730: 72 65 20 65 76 65 6e 74 73 20 6f 6e 20 74 68 65  re events on the
4740: 20 63 68 61 6e 6e 65 6c 20 77 69 6c 6c 20 62 65   channel will be
4750: 20 73 65 65 6e 20 62 79 20 54 63 6c 2e 0a 20 2a   seen by Tcl.. *
4760: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
4770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 64  ---------. */.#d
47b0: 65 66 69 6e 65 20 52 45 41 44 5f 44 45 4c 41 59  efine READ_DELAY
47c0: 09 35 0a 76 6f 69 64 20 44 69 67 65 73 74 57 61  .5.void DigestWa
47d0: 74 63 68 50 72 6f 63 28 43 6c 69 65 6e 74 44 61  tchProc(ClientDa
47e0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 69  ta clientData, i
47f0: 6e 74 20 6d 61 73 6b 29 20 7b 0a 20 20 20 20 44  nt mask) {.    D
4800: 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74  igestState *stat
4810: 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74  ePtr = (DigestSt
4820: 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74  ate *) clientDat
4830: 61 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e  a;.    Tcl_Chann
4840: 65 6c 20 70 61 72 65 6e 74 3b 0a 20 20 20 20 54  el parent;.    T
4850: 63 6c 5f 44 72 69 76 65 72 57 61 74 63 68 50 72  cl_DriverWatchPr
4860: 6f 63 20 2a 77 61 74 63 68 50 72 6f 63 3b 0a 0a  oc *watchProc;..
4870: 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 69 66 20      /* Abort if 
4880: 6e 6f 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20  no channel */.  
4890: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
48a0: 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61  self == (Tcl_Cha
48b0: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72  nnel) NULL) {..r
48c0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20  eturn;.    }..  
48d0: 20 20 2f 2a 20 53 74 6f 72 65 20 4f 52 2d 65 64    /* Store OR-ed
48e0: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
48f0: 54 43 4c 5f 52 45 41 44 41 42 4c 45 2c 20 54 43  TCL_READABLE, TC
4900: 4c 5f 57 52 49 54 41 42 4c 45 20 61 6e 64 20 54  L_WRITABLE and T
4910: 43 4c 5f 45 58 43 45 50 54 49 4f 4e 20 2a 2f 0a  CL_EXCEPTION */.
4920: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 77 61      statePtr->wa
4930: 74 63 68 4d 61 73 6b 20 3d 20 6d 61 73 6b 3b 0a  tchMask = mask;.
4940: 0a 20 20 20 20 2f 2a 20 50 72 6f 70 61 67 61 74  .    /* Propagat
4950: 65 20 6d 61 73 6b 20 69 6e 66 6f 20 74 6f 20 70  e mask info to p
4960: 61 72 65 6e 74 20 63 68 61 6e 6e 65 6c 20 2a 2f  arent channel */
4970: 0a 20 20 20 20 70 61 72 65 6e 74 20 3d 20 54 63  .    parent = Tc
4980: 6c 5f 47 65 74 53 74 61 63 6b 65 64 43 68 61 6e  l_GetStackedChan
4990: 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 65  nel(statePtr->se
49a0: 6c 66 29 3b 0a 20 20 20 20 77 61 74 63 68 50 72  lf);.    watchPr
49b0: 6f 63 20 3d 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  oc = Tcl_Channel
49c0: 57 61 74 63 68 50 72 6f 63 28 54 63 6c 5f 47 65  WatchProc(Tcl_Ge
49d0: 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 70 61 72  tChannelType(par
49e0: 65 6e 74 29 29 3b 0a 20 20 20 20 77 61 74 63 68  ent));.    watch
49f0: 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 68 61 6e  Proc(Tcl_GetChan
4a00: 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28  nelInstanceData(
4a10: 70 61 72 65 6e 74 29 2c 20 6d 61 73 6b 29 3b 0a  parent), mask);.
4a20: 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 70  .    /* Remove p
4a30: 65 6e 64 69 6e 67 20 74 69 6d 65 72 20 2a 2f 0a  ending timer */.
4a40: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
4a50: 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f  ->timer != (Tcl_
4a60: 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c  TimerToken) NULL
4a70: 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54  ) {..Tcl_DeleteT
4a80: 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74  imerHandler(stat
4a90: 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73  ePtr->timer);..s
4aa0: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d  tatePtr->timer =
4ab0: 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e   (Tcl_TimerToken
4ac0: 29 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20  ) NULL;.    }.. 
4ad0: 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
4ae0: 73 20 64 61 74 61 20 70 65 6e 64 69 6e 67 2c 20  s data pending, 
4af0: 73 65 74 20 6e 65 77 20 74 69 6d 65 72 20 74 6f  set new timer to
4b00: 20 63 61 6c 6c 20 54 63 6c 5f 4e 6f 74 69 66 79   call Tcl_Notify
4b10: 43 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69  Channel */.    i
4b20: 66 20 28 28 6d 61 73 6b 20 26 20 54 43 4c 5f 52  f ((mask & TCL_R
4b30: 45 41 44 41 42 4c 45 29 20 26 26 20 28 54 63 6c  EADABLE) && (Tcl
4b40: 5f 49 6e 70 75 74 42 75 66 66 65 72 65 64 28 73  _InputBuffered(s
4b50: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 20 3e  tatePtr->self) >
4b60: 20 30 29 29 20 7b 0a 09 73 74 61 74 65 50 74 72   0)) {..statePtr
4b70: 2d 3e 74 69 6d 65 72 20 3d 20 54 63 6c 5f 43 72  ->timer = Tcl_Cr
4b80: 65 61 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72  eateTimerHandler
4b90: 28 52 45 41 44 5f 44 45 4c 41 59 2c 20 44 69 67  (READ_DELAY, Dig
4ba0: 65 73 74 54 69 6d 65 72 48 61 6e 64 6c 65 72 2c  estTimerHandler,
4bb0: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74   (ClientData) st
4bc0: 61 74 65 50 74 72 29 3b 0a 20 20 20 20 7d 0a 7d  atePtr);.    }.}
4bd0: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
4be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
4c20: 0a 20 2a 20 44 69 67 65 73 74 47 65 74 48 61 6e  . * DigestGetHan
4c30: 64 6c 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a  dleProc --. *. *
4c40: 09 43 61 6c 6c 65 64 20 66 72 6f 6d 20 54 63 6c  .Called from Tcl
4c50: 5f 47 65 74 43 68 61 6e 6e 65 6c 48 61 6e 64 6c  _GetChannelHandl
4c60: 65 20 74 6f 20 72 65 74 72 69 65 76 65 20 4f 53  e to retrieve OS
4c70: 20 73 70 65 63 69 66 69 63 20 66 69 6c 65 20 68   specific file h
4c80: 61 6e 64 6c 65 0a 20 2a 09 66 72 6f 6d 20 69 6e  andle. *.from in
4c90: 73 69 64 65 20 74 68 69 73 20 63 68 61 6e 6e 65  side this channe
4ca0: 6c 2e 20 4e 6f 74 20 75 73 65 64 20 66 6f 72 20  l. Not used for 
4cb0: 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 73 3f  transformations?
4cc0: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a  . *. * Returns:.
4cd0: 20 2a 09 54 43 4c 5f 4f 4b 20 66 6f 72 20 73 75   *.TCL_OK for su
4ce0: 63 63 65 73 73 20 6f 72 20 54 43 4c 5f 45 52 52  ccess or TCL_ERR
4cf0: 4f 52 20 66 6f 72 20 65 72 72 6f 72 20 6f 72 20  OR for error or 
4d00: 69 66 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  if not supported
4d10: 2e 20 49 66 0a 20 2a 09 64 69 72 65 63 74 69 6f  . If. *.directio
4d20: 6e 20 69 73 20 54 43 4c 5f 52 45 41 44 41 42 4c  n is TCL_READABL
4d30: 45 2c 20 73 65 74 73 20 68 61 6e 64 6c 65 50 74  E, sets handlePt
4d40: 72 20 74 6f 20 74 68 65 20 68 61 6e 64 6c 65 20  r to the handle 
4d50: 75 73 65 64 20 66 6f 72 0a 20 2a 09 69 6e 70 75  used for. *.inpu
4d60: 74 2c 20 6f 72 20 69 66 20 54 43 4c 5f 57 52 49  t, or if TCL_WRI
4d70: 54 41 42 4c 45 20 73 65 74 73 20 74 6f 20 74 68  TABLE sets to th
4d80: 65 20 68 61 6e 64 6c 65 20 75 73 65 64 20 66 6f  e handle used fo
4d90: 72 20 6f 75 74 70 75 74 2e 0a 20 2a 0a 20 2a 20  r output.. *. * 
4da0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
4db0: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  .None. *. *-----
4dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4e00: 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74  -. */.int Digest
4e10: 47 65 74 48 61 6e 64 6c 65 50 72 6f 63 28 43 6c  GetHandleProc(Cl
4e20: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
4e30: 61 74 61 2c 20 69 6e 74 20 64 69 72 65 63 74 69  ata, int directi
4e40: 6f 6e 2c 20 43 6c 69 65 6e 74 44 61 74 61 20 2a  on, ClientData *
4e50: 68 61 6e 64 6c 65 50 74 72 29 20 7b 0a 20 20 20  handlePtr) {.   
4e60: 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74   DigestState *st
4e70: 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 74  atePtr = (Digest
4e80: 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44  State *) clientD
4e90: 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61  ata;.    Tcl_Cha
4ea0: 6e 6e 65 6c 20 70 61 72 65 6e 74 3b 0a 0a 20 20  nnel parent;..  
4eb0: 20 20 2f 2a 20 41 62 6f 72 74 20 69 66 20 6e 6f    /* Abort if no
4ec0: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20   channel */.    
4ed0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 65  if (statePtr->se
4ee0: 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e  lf == (Tcl_Chann
4ef0: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74  el) NULL) {..ret
4f00: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
4f10: 20 20 20 7d 0a 0a 20 20 20 20 70 61 72 65 6e 74     }..    parent
4f20: 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 63 6b 65   = Tcl_GetStacke
4f30: 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74  dChannel(statePt
4f40: 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 20 72 65  r->self);.    re
4f50: 74 75 72 6e 20 54 63 6c 5f 47 65 74 43 68 61 6e  turn Tcl_GetChan
4f60: 6e 65 6c 48 61 6e 64 6c 65 28 70 61 72 65 6e 74  nelHandle(parent
4f70: 2c 20 64 69 72 65 63 74 69 6f 6e 2c 20 68 61 6e  , direction, han
4f80: 64 6c 65 50 74 72 29 3b 0a 7d 0a 0a 2f 2a 0a 20  dlePtr);.}../*. 
4f90: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
4fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4fd0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69  -------. *. * Di
4fe0: 67 65 73 74 4e 6f 74 69 66 79 50 72 6f 63 20 2d  gestNotifyProc -
4ff0: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62  -. *. *.Called b
5000: 79 20 54 63 6c 20 74 6f 20 69 6e 66 6f 72 6d 20  y Tcl to inform 
5010: 75 73 20 6f 66 20 61 63 74 69 76 69 74 79 20 6f  us of activity o
5020: 6e 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  n the underlying
5030: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20   channel.. *. * 
5040: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 55 6e 63 68  Returns:. *.Unch
5050: 61 6e 67 65 64 20 69 6e 74 65 72 65 73 74 4d 61  anged interestMa
5060: 73 6b 20 77 68 69 63 68 20 69 73 20 61 6e 20 4f  sk which is an O
5070: 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  R-ed combination
5080: 20 6f 66 20 54 43 4c 5f 52 45 41 44 41 42 4c 45   of TCL_READABLE
5090: 20 6f 72 20 54 43 4c 5f 57 52 49 54 41 42 4c 45   or TCL_WRITABLE
50a0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
50b0: 63 74 73 3a 0a 20 2a 09 43 61 6e 63 65 6c 73 20  cts:. *.Cancels 
50c0: 61 6e 79 20 70 65 6e 64 69 6e 67 20 74 69 6d 65  any pending time
50d0: 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  r.. *. *--------
50e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
5120: 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 4e 6f 74  */.int DigestNot
5130: 69 66 79 50 72 6f 63 28 43 6c 69 65 6e 74 44 61  ifyProc(ClientDa
5140: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 69  ta clientData, i
5150: 6e 74 20 69 6e 74 65 72 65 73 74 4d 61 73 6b 29  nt interestMask)
5160: 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74 61   {.    DigestSta
5170: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
5180: 44 69 67 65 73 74 53 74 61 74 65 20 2a 29 20 63  DigestState *) c
5190: 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20  lientData;..    
51a0: 2f 2a 20 53 6b 69 70 20 74 69 6d 65 72 20 65 76  /* Skip timer ev
51b0: 65 6e 74 20 61 73 20 72 65 64 75 6e 64 61 6e 74  ent as redundant
51c0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74   */.    if (stat
51d0: 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28  ePtr->timer != (
51e0: 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20  Tcl_TimerToken) 
51f0: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c  NULL) {..Tcl_Del
5200: 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28  eteTimerHandler(
5210: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29  statePtr->timer)
5220: 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d  ;..statePtr->tim
5230: 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54  er = (Tcl_TimerT
5240: 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 20 20 20 20  oken) NULL;.    
5250: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 69 6e 74  }.    return int
5260: 65 72 65 73 74 4d 61 73 6b 3b 0a 7d 0a 0a 2f 2a  erestMask;.}../*
5270: 0a 20 2a 0a 20 2a 20 43 68 61 6e 6e 65 6c 20 74  . *. * Channel t
5280: 79 70 65 20 73 74 72 75 63 74 75 72 65 20 64 65  ype structure de
5290: 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20 64 69 67  finition for dig
52a0: 65 73 74 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  est transformati
52b0: 6f 6e 73 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74  ons.. *. */.stat
52c0: 69 63 20 63 6f 6e 73 74 20 54 63 6c 5f 43 68 61  ic const Tcl_Cha
52d0: 6e 6e 65 6c 54 79 70 65 20 64 69 67 65 73 74 43  nnelType digestC
52e0: 68 61 6e 6e 65 6c 54 79 70 65 20 3d 20 7b 0a 20  hannelType = {. 
52f0: 20 20 20 22 64 69 67 65 73 74 22 2c 09 09 09 2f     "digest",.../
5300: 2a 20 54 79 70 65 20 6e 61 6d 65 20 2a 2f 0a 20  * Type name */. 
5310: 20 20 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56     TCL_CHANNEL_V
5320: 45 52 53 49 4f 4e 5f 35 2c 09 2f 2a 20 76 35 20  ERSION_5,./* v5 
5330: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 44  channel */.    D
5340: 69 67 65 73 74 43 6c 6f 73 65 50 72 6f 63 2c 09  igestCloseProc,.
5350: 09 2f 2a 20 43 6c 6f 73 65 20 70 72 6f 63 20 2a  ./* Close proc *
5360: 2f 0a 20 20 20 20 44 69 67 65 73 74 49 6e 70 75  /.    DigestInpu
5370: 74 50 72 6f 63 2c 09 09 2f 2a 20 49 6e 70 75 74  tProc,../* Input
5380: 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 44 69 67   proc */.    Dig
5390: 65 73 74 4f 75 74 70 75 74 50 72 6f 63 2c 09 09  estOutputProc,..
53a0: 2f 2a 20 4f 75 74 70 75 74 20 70 72 6f 63 20 2a  /* Output proc *
53b0: 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a  /.    NULL,.../*
53c0: 20 53 65 65 6b 20 70 72 6f 63 20 2a 2f 0a 20 20   Seek proc */.  
53d0: 20 20 44 69 67 65 73 74 53 65 74 4f 70 74 69 6f    DigestSetOptio
53e0: 6e 50 72 6f 63 2c 09 2f 2a 20 53 65 74 20 6f 70  nProc,./* Set op
53f0: 74 69 6f 6e 20 70 72 6f 63 20 2a 2f 0a 20 20 20  tion proc */.   
5400: 20 44 69 67 65 73 74 47 65 74 4f 70 74 69 6f 6e   DigestGetOption
5410: 50 72 6f 63 2c 09 2f 2a 20 47 65 74 20 6f 70 74  Proc,./* Get opt
5420: 69 6f 6e 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20  ion proc */.    
5430: 44 69 67 65 73 74 57 61 74 63 68 50 72 6f 63 2c  DigestWatchProc,
5440: 09 09 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  ../* Initialize 
5450: 6e 6f 74 69 66 69 65 72 20 2a 2f 0a 20 20 20 20  notifier */.    
5460: 44 69 67 65 73 74 47 65 74 48 61 6e 64 6c 65 50  DigestGetHandleP
5470: 72 6f 63 2c 09 2f 2a 20 47 65 74 20 4f 53 20 68  roc,./* Get OS h
5480: 61 6e 64 6c 65 73 20 6f 75 74 20 6f 66 20 63 68  andles out of ch
5490: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 44 69 67  annel */.    Dig
54a0: 65 73 74 43 6c 6f 73 65 32 50 72 6f 63 2c 09 09  estClose2Proc,..
54b0: 2f 2a 20 63 6c 6f 73 65 32 70 72 6f 63 20 2a 2f  /* close2proc */
54c0: 0a 20 20 20 20 44 69 67 65 73 74 42 6c 6f 63 6b  .    DigestBlock
54d0: 4d 6f 64 65 50 72 6f 63 2c 09 2f 2a 20 53 65 74  ModeProc,./* Set
54e0: 20 62 6c 6f 63 6b 69 6e 67 2f 6e 6f 6e 62 6c 6f   blocking/nonblo
54f0: 63 6b 69 6e 67 20 6d 6f 64 65 2a 2f 0a 20 20 20  cking mode*/.   
5500: 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 46 6c 75 73   NULL,.../* Flus
5510: 68 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 44 69  h proc */.    Di
5520: 67 65 73 74 4e 6f 74 69 66 79 50 72 6f 63 2c 09  gestNotifyProc,.
5530: 09 2f 2a 20 48 61 6e 64 6c 69 6e 67 20 6f 66 20  ./* Handling of 
5540: 65 76 65 6e 74 73 20 62 75 62 62 6c 69 6e 67 20  events bubbling 
5550: 75 70 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09  up */.    NULL,.
5560: 09 09 2f 2a 20 57 69 64 65 20 73 65 65 6b 20 70  ../* Wide seek p
5570: 72 6f 63 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c  roc */.    NULL,
5580: 09 09 09 2f 2a 20 54 68 72 65 61 64 20 61 63 74  .../* Thread act
5590: 69 6f 6e 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 09  ion */.    NULL.
55a0: 09 09 2f 2a 20 54 72 75 6e 63 61 74 65 20 2a 2f  ../* Truncate */
55b0: 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .};../*. *------
55c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5600: 0a 20 2a 0a 20 2a 20 54 6c 73 5f 44 69 67 65 73  . *. * Tls_Diges
5610: 74 43 68 61 6e 6e 65 6c 20 2d 2d 0a 20 2a 0a 20  tChannel --. *. 
5620: 2a 09 43 72 65 61 74 65 20 61 20 73 74 61 63 6b  *.Create a stack
5630: 65 64 20 63 68 61 6e 6e 65 6c 20 66 6f 72 20 61  ed channel for a
5640: 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20   message digest 
5650: 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 2e 0a  transformation..
5660: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20   *. * Returns:. 
5670: 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f  *.TCL_OK or TCL_
5680: 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65  ERROR. *. * Side
5690: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 41 64 64   effects:. *.Add
56a0: 73 20 74 72 61 6e 73 66 6f 72 6d 20 74 6f 20 63  s transform to c
56b0: 68 61 6e 6e 65 6c 20 61 6e 64 20 73 65 74 73 20  hannel and sets 
56c0: 72 65 73 75 6c 74 20 74 6f 20 63 68 61 6e 6e 65  result to channe
56d0: 6c 20 69 64 20 6f 72 20 65 72 72 6f 72 20 6d 65  l id or error me
56e0: 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  ssage.. *. *----
56f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5730: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
5740: 74 0a 54 6c 73 5f 44 69 67 65 73 74 43 68 61 6e  t.Tls_DigestChan
5750: 6e 65 6c 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nel(Tcl_Interp *
5760: 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74 20 63 68  interp, const ch
5770: 61 72 20 2a 63 68 61 6e 6e 65 6c 2c 20 63 6f 6e  ar *channel, con
5780: 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 2c 0a 09  st EVP_MD *md,..
5790: 63 6f 6e 73 74 20 45 56 50 5f 43 49 50 48 45 52  const EVP_CIPHER
57a0: 20 2a 63 69 70 68 65 72 2c 20 69 6e 74 20 66 6f   *cipher, int fo
57b0: 72 6d 61 74 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6b  rmat, Tcl_Obj *k
57c0: 65 79 4f 62 6a 29 20 7b 0a 20 20 20 20 69 6e 74  eyObj) {.    int
57d0: 20 6d 6f 64 65 3b 20 2f 2a 20 4f 52 2d 65 64 20   mode; /* OR-ed 
57e0: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 54  combination of T
57f0: 43 4c 5f 52 45 41 44 41 42 4c 45 20 61 6e 64 20  CL_READABLE and 
5800: 54 43 4c 5f 57 52 49 54 41 42 4c 45 20 2a 2f 0a  TCL_WRITABLE */.
5810: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20      Tcl_Channel 
5820: 63 68 61 6e 3b 0a 20 20 20 20 44 69 67 65 73 74  chan;.    Digest
5830: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b  State *statePtr;
5840: 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74  ..    /* Validat
5850: 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 69 66  e args */.    if
5860: 20 28 63 68 61 6e 6e 65 6c 20 3d 3d 20 28 63 6f   (channel == (co
5870: 6e 73 74 20 63 68 61 72 20 2a 29 20 4e 55 4c 4c  nst char *) NULL
5880: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
5890: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
58a0: 20 20 2f 2a 20 47 65 74 20 63 68 61 6e 6e 65 6c    /* Get channel
58b0: 20 49 64 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20   Id */.    chan 
58c0: 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  = Tcl_GetChannel
58d0: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c  (interp, channel
58e0: 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66  , &mode);.    if
58f0: 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43   (chan == (Tcl_C
5900: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a  hannel) NULL) {.
5910: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
5920: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
5930: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70   Make sure to op
5940: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70  erate on the top
5950: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  most channel */.
5960: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
5970: 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61  etTopChannel(cha
5980: 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61  n);..    /* Crea
5990: 74 65 20 73 74 61 74 65 20 64 61 74 61 20 73 74  te state data st
59a0: 72 75 63 74 20 2a 2f 0a 20 20 20 20 69 66 20 28  ruct */.    if (
59b0: 28 73 74 61 74 65 50 74 72 20 3d 20 54 6c 73 5f  (statePtr = Tls_
59c0: 44 69 67 65 73 74 4e 65 77 28 69 6e 74 65 72 70  DigestNew(interp
59d0: 2c 20 66 6f 72 6d 61 74 29 29 20 3d 3d 20 4e 55  , format)) == NU
59e0: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  LL) {..Tcl_Appen
59f0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
5a00: 22 49 6e 69 74 69 61 6c 69 7a 65 20 64 69 67 65  "Initialize dige
5a10: 73 74 20 65 72 72 6f 72 3a 20 6d 65 6d 6f 72 79  st error: memory
5a20: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
5a30: 75 72 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ure", (char *) N
5a40: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  ULL);..return TC
5a50: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
5a60: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c     statePtr->sel
5a70: 66 20 3d 20 63 68 61 6e 3b 0a 20 20 20 20 73 74  f = chan;.    st
5a80: 61 74 65 50 74 72 2d 3e 6d 6f 64 65 20 3d 20 6d  atePtr->mode = m
5a90: 6f 64 65 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 69  ode;..    /* Ini
5aa0: 74 69 61 6c 69 7a 65 20 68 61 73 68 20 66 75 6e  tialize hash fun
5ab0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 20  ction */.    if 
5ac0: 28 54 6c 73 5f 44 69 67 65 73 74 49 6e 69 74 28  (Tls_DigestInit(
5ad0: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
5ae0: 2c 20 6d 64 2c 20 63 69 70 68 65 72 2c 20 6b 65  , md, cipher, ke
5af0: 79 4f 62 6a 29 20 21 3d 20 54 43 4c 5f 4f 4b 29  yObj) != TCL_OK)
5b00: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
5b10: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
5b20: 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 20 63 68   /* Configure ch
5b30: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 54 63 6c  annel */.    Tcl
5b40: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _SetChannelOptio
5b50: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20  n(interp, chan, 
5b60: 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20  "-translation", 
5b70: 22 62 69 6e 61 72 79 22 29 3b 0a 20 20 20 20 69  "binary");.    i
5b80: 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  f (Tcl_GetChanne
5b90: 6c 42 75 66 66 65 72 53 69 7a 65 28 63 68 61 6e  lBufferSize(chan
5ba0: 29 20 3c 20 45 56 50 5f 4d 41 58 5f 4d 44 5f 53  ) < EVP_MAX_MD_S
5bb0: 49 5a 45 20 2a 20 32 29 20 7b 0a 09 54 63 6c 5f  IZE * 2) {..Tcl_
5bc0: 53 65 74 43 68 61 6e 6e 65 6c 42 75 66 66 65 72  SetChannelBuffer
5bd0: 53 69 7a 65 28 63 68 61 6e 2c 20 45 56 50 5f 4d  Size(chan, EVP_M
5be0: 41 58 5f 4d 44 5f 53 49 5a 45 20 2a 20 32 29 3b  AX_MD_SIZE * 2);
5bf0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
5c00: 74 61 63 6b 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  tack channel */.
5c10: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 65      statePtr->se
5c20: 6c 66 20 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68  lf = Tcl_StackCh
5c30: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 26 64  annel(interp, &d
5c40: 69 67 65 73 74 43 68 61 6e 6e 65 6c 54 79 70 65  igestChannelType
5c50: 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73  , (ClientData) s
5c60: 74 61 74 65 50 74 72 2c 20 6d 6f 64 65 2c 20 63  tatePtr, mode, c
5c70: 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 73 74  han);.    if (st
5c80: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20  atePtr->self == 
5c90: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
5ca0: 4c 4c 29 20 7b 0a 09 54 6c 73 5f 44 69 67 65 73  LL) {..Tls_Diges
5cb0: 74 46 72 65 65 28 73 74 61 74 65 50 74 72 29 3b  tFree(statePtr);
5cc0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
5cd0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
5ce0: 2a 20 53 65 74 20 72 65 73 75 6c 74 20 74 6f 20  * Set result to 
5cf0: 63 68 61 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20 20  channel Id */.  
5d00: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
5d10: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
5d20: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
5d30: 61 6d 65 28 63 68 61 6e 29 2c 20 54 43 4c 5f 56  ame(chan), TCL_V
5d40: 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 65  OLATILE);.    re
5d50: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
5d60: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
5d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
5db0: 2a 20 55 6e 73 74 61 63 6b 20 43 68 61 6e 6e 65  * Unstack Channe
5dc0: 6c 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  l --. *. *.This 
5dd0: 66 75 6e 63 74 69 6f 6e 20 72 65 6d 6f 76 65 73  function removes
5de0: 20 74 68 65 20 73 74 61 63 6b 65 64 20 63 68 61   the stacked cha
5df0: 6e 6e 65 6c 20 66 72 6f 6d 20 74 68 65 20 74 6f  nnel from the to
5e00: 70 20 6f 66 20 74 68 65 0a 20 2a 09 63 68 61 6e  p of the. *.chan
5e10: 6e 65 6c 20 73 74 61 63 6b 20 69 66 20 69 74 20  nel stack if it 
5e20: 69 73 20 61 20 64 69 67 65 73 74 20 63 68 61 6e  is a digest chan
5e30: 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72  nel.. *. * Retur
5e40: 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72  ns:. *.TCL_OK or
5e50: 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a   TCL_ERROR. *. *
5e60: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
5e70: 2a 09 52 65 6d 6f 76 65 73 20 74 72 61 6e 73 66  *.Removes transf
5e80: 6f 72 6d 20 66 72 6f 6d 20 63 68 61 6e 6e 65 6c  orm from channel
5e90: 20 6f 72 20 73 65 74 73 20 72 65 73 75 6c 74 20   or sets result 
5ea0: 74 6f 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  to error message
5eb0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
5ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
5f00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 55 6e 73  /.static int.Uns
5f10: 74 61 63 6b 4f 62 6a 43 6d 64 28 43 6c 69 65 6e  tackObjCmd(Clien
5f20: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
5f30: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
5f40: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
5f50: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
5f60: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c  bjv[]) {.    Tcl
5f70: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20  _Channel chan;. 
5f80: 20 20 20 69 6e 74 20 6d 6f 64 65 3b 20 2f 2a 20     int mode; /* 
5f90: 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f  OR-ed combinatio
5fa0: 6e 20 6f 66 20 54 43 4c 5f 52 45 41 44 41 42 4c  n of TCL_READABL
5fb0: 45 20 61 6e 64 20 54 43 4c 5f 57 52 49 54 41 42  E and TCL_WRITAB
5fc0: 4c 45 20 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 56  LE  */..    /* V
5fd0: 61 6c 69 64 61 74 65 20 61 72 67 20 63 6f 75 6e  alidate arg coun
5fe0: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a  t */.    if (obj
5ff0: 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57  c != 2) {..Tcl_W
6000: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
6010: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68  rp, 1, objv, "ch
6020: 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e  annel");..return
6030: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
6040: 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 68  }..    /* Get ch
6050: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61  annel */.    cha
6060: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  n = Tcl_GetChann
6070: 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  el(interp, Tcl_G
6080: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
6090: 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20  objv[1], NULL), 
60a0: 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 28  &mode);.    if (
60b0: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61  chan == (Tcl_Cha
60c0: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72  nnel) NULL) {..r
60d0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
60e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
60f0: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72  ake sure to oper
6100: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f  ate on the topmo
6110: 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20  st channel */.  
6120: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
6130: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29  TopChannel(chan)
6140: 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
6150: 69 66 20 64 69 67 65 73 74 20 63 68 61 6e 6e 65  if digest channe
6160: 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c  l */.    if (Tcl
6170: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28  _GetChannelType(
6180: 63 68 61 6e 29 20 21 3d 20 26 64 69 67 65 73 74  chan) != &digest
6190: 43 68 61 6e 6e 65 6c 54 79 70 65 29 20 7b 0a 09  ChannelType) {..
61a0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
61b0: 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68  (interp, "bad ch
61c0: 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47  annel \"", Tcl_G
61d0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68  etChannelName(ch
61e0: 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e  an),..    "\": n
61f0: 6f 74 20 61 20 64 69 67 65 73 74 20 63 68 61 6e  ot a digest chan
6200: 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63  nel", NULL);..Tc
6210: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
6220: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 55  nterp, "TLS", "U
6230: 4e 53 54 41 43 4b 22 2c 20 22 43 48 41 4e 4e 45  NSTACK", "CHANNE
6240: 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28  L", "INVALID", (
6250: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
6260: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
6270: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
6280: 50 6f 70 20 74 72 61 6e 73 66 6f 72 6d 20 66 72  Pop transform fr
6290: 6f 6d 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20  om channel */.  
62a0: 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 55 6e 73    return Tcl_Uns
62b0: 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65  tackChannel(inte
62c0: 72 70 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 09  rp, chan);.    .
62d0: 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69  clientData = cli
62e0: 65 6e 74 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 2a 2a  entData;.}../***
62f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6330: 2f 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  /..static const 
6340: 63 68 61 72 20 2a 69 6e 73 74 61 6e 63 65 5f 66  char *instance_f
6350: 6e 73 20 5b 5d 20 3d 20 7b 20 22 66 69 6e 61 6c  ns [] = { "final
6360: 69 7a 65 22 2c 20 22 75 70 64 61 74 65 22 2c 20  ize", "update", 
6370: 4e 55 4c 4c 20 7d 3b 0a 0a 2f 2a 0a 20 2a 2d 2d  NULL };../*. *--
6380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
63a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
63b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
63c0: 2d 0a 20 2a 0a 20 2a 20 49 6e 73 74 61 6e 63 65  -. *. * Instance
63d0: 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09  ObjCmd --. *. *.
63e0: 48 61 6e 64 6c 65 72 20 66 6f 72 20 64 69 67 65  Handler for dige
63f0: 73 74 20 63 6f 6d 6d 61 6e 64 20 69 6e 73 74 61  st command insta
6400: 6e 63 65 73 2e 20 55 73 65 64 20 74 6f 20 61 64  nces. Used to ad
6410: 64 20 64 61 74 61 20 74 6f 20 68 61 73 68 0a 20  d data to hash. 
6420: 2a 09 66 75 6e 63 74 69 6f 6e 20 6f 72 20 72 65  *.function or re
6430: 74 72 69 65 76 65 20 6d 65 73 73 61 67 65 20 64  trieve message d
6440: 69 67 65 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 74  igest.. *. * Ret
6450: 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20  urns:. *.TCL_OK 
6460: 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a  or TCL_ERROR. *.
6470: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
6480: 0a 20 2a 09 41 64 64 73 20 64 61 74 61 20 74 6f  . *.Adds data to
6490: 20 68 61 73 68 20 6f 72 20 72 65 74 75 72 6e 73   hash or returns
64a0: 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 0a   message digest.
64b0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
64c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64f0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74  --------. */.int
6500: 20 49 6e 73 74 61 6e 63 65 4f 62 6a 43 6d 64 28   InstanceObjCmd(
6510: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
6520: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
6530: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
6540: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
6550: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
6560: 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73    DigestState *s
6570: 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 73  tatePtr = (Diges
6580: 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74  tState *) client
6590: 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 66 6e  Data;.    int fn
65a0: 2c 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 63  , len = 0;.    c
65b0: 68 61 72 20 2a 62 75 66 20 3d 20 4e 55 4c 4c 3b  har *buf = NULL;
65c0: 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74  ..    /* Validat
65d0: 65 20 61 72 67 20 63 6f 75 6e 74 20 2a 2f 0a 20  e arg count */. 
65e0: 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 20     if (objc < 2 
65f0: 7c 7c 20 6f 62 6a 63 20 3e 20 33 29 20 7b 0a 09  || objc > 3) {..
6600: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
6610: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
6620: 2c 20 22 66 75 6e 63 74 69 6f 6e 20 3f 64 61 74  , "function ?dat
6630: 61 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  a?");..return TC
6640: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
6650: 20 20 20 20 2f 2a 20 47 65 74 20 66 75 6e 63 74      /* Get funct
6660: 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 54  ion */.    if (T
6670: 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f  cl_GetIndexFromO
6680: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
6690: 31 5d 2c 20 69 6e 73 74 61 6e 63 65 5f 66 6e 73  1], instance_fns
66a0: 2c 20 22 66 75 6e 63 74 69 6f 6e 22 2c 20 30 2c  , "function", 0,
66b0: 20 26 66 6e 29 20 21 3d 20 54 43 4c 5f 4f 4b 29   &fn) != TCL_OK)
66c0: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
66d0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
66e0: 20 2f 2a 20 44 6f 20 66 75 6e 63 74 69 6f 6e 20   /* Do function 
66f0: 2a 2f 0a 20 20 20 20 69 66 20 28 66 6e 29 20 7b  */.    if (fn) {
6700: 0a 09 2f 2a 20 47 65 74 20 64 61 74 61 20 6f 72  ../* Get data or
6710: 20 72 65 74 75 72 6e 20 65 72 72 6f 72 20 69 66   return error if
6720: 20 6e 6f 6e 65 20 2a 2f 0a 09 69 66 20 28 6f 62   none */..if (ob
6730: 6a 63 20 3d 3d 20 33 29 20 7b 0a 09 20 20 20 20  jc == 3) {..    
6740: 62 75 66 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  buf = Tcl_GetByt
6750: 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62  eArrayFromObj(ob
6760: 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 09 7d  jv[2], &len);..}
6770: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 54 63 6c   else {..    Tcl
6780: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
6790: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
67a0: 75 70 64 61 74 65 20 64 61 74 61 22 29 3b 0a 09  update data");..
67b0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
67c0: 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 55 70  RROR;..}.../* Up
67d0: 64 61 74 65 20 68 61 73 68 20 66 75 6e 63 74 69  date hash functi
67e0: 6f 6e 20 2a 2f 0a 09 69 66 20 28 21 54 6c 73 5f  on */..if (!Tls_
67f0: 44 69 67 65 73 74 55 70 64 61 74 65 28 73 74 61  DigestUpdate(sta
6800: 74 65 50 74 72 2c 20 62 75 66 2c 20 28 73 69 7a  tePtr, buf, (siz
6810: 65 5f 74 29 20 6c 65 6e 29 29 20 7b 0a 09 20 20  e_t) len)) {..  
6820: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
6830: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f  lt(interp, Tcl_O
6840: 62 6a 50 72 69 6e 74 66 28 22 44 69 67 65 73 74  bjPrintf("Digest
6850: 20 75 70 64 61 74 65 20 66 61 69 6c 65 64 3a 20   update failed: 
6860: 25 73 22 2c 20 52 45 41 53 4f 4e 28 29 29 29 3b  %s", REASON()));
6870: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
6880: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 20 20 20 20  _ERROR;..}..    
6890: 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 46 69 6e  } else {../* Fin
68a0: 61 6c 69 7a 65 20 68 61 73 68 20 66 75 6e 63 74  alize hash funct
68b0: 69 6f 6e 20 61 6e 64 20 63 61 6c 63 75 6c 61 74  ion and calculat
68c0: 65 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74  e message digest
68d0: 20 2a 2f 0a 09 69 66 20 28 54 6c 73 5f 44 69 67   */..if (Tls_Dig
68e0: 65 73 74 46 69 6e 69 61 6c 69 7a 65 28 69 6e 74  estFinialize(int
68f0: 65 72 70 2c 20 73 74 61 74 65 50 74 72 29 20 21  erp, statePtr) !
6900: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20  = TCL_OK) {..   
6910: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
6920: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62  t(interp, Tcl_Ob
6930: 6a 50 72 69 6e 74 66 28 22 44 69 67 65 73 74 20  jPrintf("Digest 
6940: 66 69 6e 61 6c 69 7a 65 20 66 61 69 6c 65 64 3a  finalize failed:
6950: 20 25 73 22 2c 20 52 45 41 53 4f 4e 28 29 29 29   %s", REASON()))
6960: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
6970: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 54 63  L_ERROR;..}...Tc
6980: 6c 5f 44 65 6c 65 74 65 43 6f 6d 6d 61 6e 64 46  l_DeleteCommandF
6990: 72 6f 6d 54 6f 6b 65 6e 28 69 6e 74 65 72 70 2c  romToken(interp,
69a0: 20 73 74 61 74 65 50 74 72 2d 3e 74 6f 6b 65 6e   statePtr->token
69b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
69c0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
69d0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
69e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
69f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6a10: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6e  -------. *. * In
6a20: 73 74 61 6e 63 65 44 65 6c 43 61 6c 6c 62 61 63  stanceDelCallbac
6a30: 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 20 43 61 6c 6c  k --. *. *. Call
6a40: 62 61 63 6b 20 74 6f 20 63 6c 65 61 6e 2d 75 70  back to clean-up
6a50: 20 77 68 65 6e 20 64 69 67 65 73 74 20 69 6e 73   when digest ins
6a60: 74 61 6e 63 65 20 63 6f 6d 6d 61 6e 64 20 69 73  tance command is
6a70: 20 64 65 6c 65 74 65 64 2e 0a 20 2a 0a 20 2a 20   deleted.. *. * 
6a80: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 4e 6f 74 68  Returns:. *.Noth
6a90: 69 6e 67 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ing. *. * Side e
6aa0: 66 66 65 63 74 73 3a 0a 20 2a 09 44 65 73 74 72  ffects:. *.Destr
6ab0: 6f 79 73 20 73 74 72 75 63 74 0a 20 2a 0a 20 2a  oys struct. *. *
6ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b00: 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 49 6e 73  ---. */.void Ins
6b10: 74 61 6e 63 65 44 65 6c 43 61 6c 6c 62 61 63 6b  tanceDelCallback
6b20: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
6b30: 6e 74 44 61 74 61 29 20 7b 0a 20 20 20 20 44 69  ntData) {.    Di
6b40: 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65  gestState *state
6b50: 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 61  Ptr = (DigestSta
6b60: 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61  te *) clientData
6b70: 3b 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 6e 2d  ;..    /* Clean-
6b80: 75 70 20 2a 2f 0a 20 20 20 20 54 6c 73 5f 44 69  up */.    Tls_Di
6b90: 67 65 73 74 46 72 65 65 28 73 74 61 74 65 50 74  gestFree(statePt
6ba0: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  r);.}../*. *----
6bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
6bf0: 20 2a 0a 20 2a 20 54 6c 73 5f 44 69 67 65 73 74   *. * Tls_Digest
6c00: 49 6e 73 74 61 6e 63 65 20 2d 2d 0a 20 2a 0a 20  Instance --. *. 
6c10: 2a 09 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e  *. Create comman
6c20: 64 20 74 6f 20 61 6c 6c 6f 77 20 75 73 65 72 20  d to allow user 
6c30: 74 6f 20 61 64 64 20 64 61 74 61 20 74 6f 20 68  to add data to h
6c40: 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a  ash function.. *
6c50: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09  . * Returns:. *.
6c60: 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52  TCL_OK or TCL_ER
6c70: 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ROR. *. * Side e
6c80: 66 66 65 63 74 73 3a 0a 20 2a 09 43 72 65 61 74  ffects:. *.Creat
6c90: 65 73 20 63 6f 6d 6d 61 6e 64 20 6f 72 20 65 72  es command or er
6ca0: 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20  ror message. *. 
6cb0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
6cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 69 6e 74 20 54 6c 73  ----. */.int Tls
6d00: 5f 44 69 67 65 73 74 49 6e 73 74 61 6e 63 65 28  _DigestInstance(
6d10: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
6d20: 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64  rp, Tcl_Obj *cmd
6d30: 4f 62 6a 2c 20 63 6f 6e 73 74 20 45 56 50 5f 4d  Obj, const EVP_M
6d40: 44 20 2a 6d 64 2c 0a 09 63 6f 6e 73 74 20 45 56  D *md,..const EV
6d50: 50 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65 72  P_CIPHER *cipher
6d60: 2c 20 69 6e 74 20 66 6f 72 6d 61 74 2c 20 54 63  , int format, Tc
6d70: 6c 5f 4f 62 6a 20 2a 6b 65 79 4f 62 6a 29 20 7b  l_Obj *keyObj) {
6d80: 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65  .    DigestState
6d90: 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 20 20 20   *statePtr;.    
6da0: 63 68 61 72 20 2a 63 6d 64 4e 61 6d 65 20 3d 20  char *cmdName = 
6db0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
6dc0: 6d 4f 62 6a 28 63 6d 64 4f 62 6a 2c 20 4e 55 4c  mObj(cmdObj, NUL
6dd0: 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61  L);..    /* Crea
6de0: 74 65 20 73 74 61 74 65 20 64 61 74 61 20 73 74  te state data st
6df0: 72 75 63 74 20 2a 2f 0a 20 20 20 20 69 66 20 28  ruct */.    if (
6e00: 28 73 74 61 74 65 50 74 72 20 3d 20 54 6c 73 5f  (statePtr = Tls_
6e10: 44 69 67 65 73 74 4e 65 77 28 69 6e 74 65 72 70  DigestNew(interp
6e20: 2c 20 66 6f 72 6d 61 74 29 29 20 3d 3d 20 4e 55  , format)) == NU
6e30: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  LL) {..Tcl_Appen
6e40: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
6e50: 22 49 6e 69 74 69 61 6c 69 7a 65 20 64 69 67 65  "Initialize dige
6e60: 73 74 20 65 72 72 6f 72 3a 20 6d 65 6d 6f 72 79  st error: memory
6e70: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
6e80: 75 72 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ure", (char *) N
6e90: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  ULL);..return TC
6ea0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
6eb0: 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
6ec0: 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20  e hash function 
6ed0: 2a 2f 0a 20 20 20 20 69 66 20 28 54 6c 73 5f 44  */.    if (Tls_D
6ee0: 69 67 65 73 74 49 6e 69 74 28 69 6e 74 65 72 70  igestInit(interp
6ef0: 2c 20 73 74 61 74 65 50 74 72 2c 20 6d 64 2c 20  , statePtr, md, 
6f00: 63 69 70 68 65 72 2c 20 6b 65 79 4f 62 6a 29 20  cipher, keyObj) 
6f10: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65  != TCL_OK) {..re
6f20: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6f30: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72      }..    /* Cr
6f40: 65 61 74 65 20 69 6e 73 74 61 6e 63 65 20 63 6f  eate instance co
6f50: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 73 74 61  mmand */.    sta
6f60: 74 65 50 74 72 2d 3e 74 6f 6b 65 6e 20 3d 20 54  tePtr->token = T
6f70: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
6f80: 61 6e 64 28 69 6e 74 65 72 70 2c 20 63 6d 64 4e  and(interp, cmdN
6f90: 61 6d 65 2c 20 49 6e 73 74 61 6e 63 65 4f 62 6a  ame, InstanceObj
6fa0: 43 6d 64 2c 0a 09 28 43 6c 69 65 6e 74 44 61 74  Cmd,..(ClientDat
6fb0: 61 29 20 73 74 61 74 65 50 74 72 2c 20 49 6e 73  a) statePtr, Ins
6fc0: 74 61 6e 63 65 44 65 6c 43 61 6c 6c 62 61 63 6b  tanceDelCallback
6fd0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 74 75 72  );..    /* Retur
6fe0: 6e 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 2a  n command name *
6ff0: 2f 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  /.    Tcl_SetObj
7000: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 63  Result(interp, c
7010: 6d 64 4f 62 6a 29 3b 0a 20 20 20 20 72 65 74 75  mdObj);.    retu
7020: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  rn TCL_OK;.}.../
7030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7070: 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ***/../*. *-----
7080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
70a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
70b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
70c0: 2a 0a 20 2a 20 54 6c 73 5f 44 69 67 65 73 74 44  *. * Tls_DigestD
70d0: 61 74 61 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74  ata --. *. *.Ret
70e0: 75 72 6e 20 6d 65 73 73 61 67 65 20 64 69 67 65  urn message dige
70f0: 73 74 20 66 6f 72 20 64 61 74 61 20 75 73 69 6e  st for data usin
7100: 67 20 75 73 65 72 20 73 70 65 63 69 66 69 65 64  g user specified
7110: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 0a   hash function..
7120: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20   *. * Returns:. 
7130: 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f  *.TCL_OK or TCL_
7140: 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65  ERROR. *. * Side
7150: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74   effects:. *.Set
7160: 73 20 72 65 73 75 6c 74 20 74 6f 20 6d 65 73 73  s result to mess
7170: 61 67 65 20 64 69 67 65 73 74 20 6f 72 20 65 72  age digest or er
7180: 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20  ror message. *. 
7190: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
71a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71d0: 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 0a 54 6c 73  ----. */.int.Tls
71e0: 5f 44 69 67 65 73 74 44 61 74 61 28 54 63 6c 5f  _DigestData(Tcl_
71f0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
7200: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
7210: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 2c  j *const objv[],
7220: 0a 09 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a  ..const EVP_MD *
7230: 6d 64 2c 20 63 6f 6e 73 74 20 45 56 50 5f 43 49  md, const EVP_CI
7240: 50 48 45 52 20 2a 63 69 70 68 65 72 2c 20 69 6e  PHER *cipher, in
7250: 74 20 66 6f 72 6d 61 74 2c 20 54 63 6c 5f 4f 62  t format, Tcl_Ob
7260: 6a 20 2a 6b 65 79 4f 62 6a 29 20 7b 0a 20 20 20  j *keyObj) {.   
7270: 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 20   char *data;.   
7280: 20 69 6e 74 20 6c 65 6e 2c 20 72 65 73 3b 0a 20   int len, res;. 
7290: 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
72a0: 6d 64 5f 6c 65 6e 3b 0a 20 20 20 20 75 6e 73 69  md_len;.    unsi
72b0: 67 6e 65 64 20 63 68 61 72 20 6d 64 5f 62 75 66  gned char md_buf
72c0: 5b 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45  [EVP_MAX_MD_SIZE
72d0: 5d 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64  ];..    /* Valid
72e0: 61 74 65 20 61 72 67 20 63 6f 75 6e 74 20 2a 2f  ate arg count */
72f0: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d  .    if (objc !=
7300: 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67   2) {..Tcl_Wrong
7310: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
7320: 31 2c 20 6f 62 6a 76 2c 20 22 64 61 74 61 22 29  1, objv, "data")
7330: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
7340: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
7350: 2f 2a 20 47 65 74 20 64 61 74 61 20 2a 2f 0a 20  /* Get data */. 
7360: 20 20 20 64 61 74 61 20 3d 20 54 63 6c 5f 47 65     data = Tcl_Ge
7370: 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62  tByteArrayFromOb
7380: 6a 28 6f 62 6a 76 5b 31 5d 2c 20 26 6c 65 6e 29  j(objv[1], &len)
7390: 3b 0a 20 20 20 20 69 66 20 28 64 61 74 61 20 3d  ;.    if (data =
73a0: 3d 20 4e 55 4c 4c 20 7c 7c 20 6c 65 6e 20 3d 3d  = NULL || len ==
73b0: 20 30 29 20 7b 0a 09 54 63 6c 5f 53 65 74 52 65   0) {..Tcl_SetRe
73c0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 6f  sult(interp, "No
73d0: 20 64 61 74 61 22 2c 20 4e 55 4c 4c 29 3b 0a 09   data", NULL);..
73e0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
73f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
7400: 43 61 6c 63 75 6c 61 74 65 20 64 69 67 65 73 74  Calculate digest
7410: 20 62 61 73 65 64 20 6f 6e 20 68 61 73 68 20 66   based on hash f
7420: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69  unction */.    i
7430: 66 20 28 66 6f 72 6d 61 74 20 26 20 54 59 50 45  f (format & TYPE
7440: 5f 4d 44 29 20 7b 0a 09 72 65 73 20 3d 20 45 56  _MD) {..res = EV
7450: 50 5f 44 69 67 65 73 74 28 64 61 74 61 2c 20 28  P_Digest(data, (
7460: 73 69 7a 65 5f 74 29 20 6c 65 6e 2c 20 6d 64 5f  size_t) len, md_
7470: 62 75 66 2c 20 26 6d 64 5f 6c 65 6e 2c 20 6d 64  buf, &md_len, md
7480: 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 7d 20  , NULL);..    } 
7490: 65 6c 73 65 20 69 66 20 28 66 6f 72 6d 61 74 20  else if (format 
74a0: 26 20 54 59 50 45 5f 48 4d 41 43 29 20 7b 0a 09  & TYPE_HMAC) {..
74b0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b  unsigned char *k
74c0: 65 79 2c 20 2a 68 6d 61 63 20 3d 20 4e 55 4c 4c  ey, *hmac = NULL
74d0: 3b 0a 09 69 6e 74 20 6b 65 79 5f 6c 65 6e 3b 0a  ;..int key_len;.
74e0: 0a 09 6b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42  ..key = Tcl_GetB
74f0: 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
7500: 6b 65 79 4f 62 6a 2c 20 26 6b 65 79 5f 6c 65 6e  keyObj, &key_len
7510: 29 3b 0a 09 68 6d 61 63 20 3d 20 48 4d 41 43 28  );..hmac = HMAC(
7520: 6d 64 2c 20 28 63 6f 6e 73 74 20 76 6f 69 64 20  md, (const void 
7530: 2a 29 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 2c  *) key, key_len,
7540: 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
7550: 20 63 68 61 72 20 2a 29 20 64 61 74 61 2c 0a 09   char *) data,..
7560: 20 20 20 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e      (size_t) len
7570: 2c 20 6d 64 5f 62 75 66 2c 20 26 6d 64 5f 6c 65  , md_buf, &md_le
7580: 6e 29 3b 0a 09 72 65 73 20 3d 20 28 68 6d 61 63  n);..res = (hmac
7590: 20 21 3d 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20   != NULL);..    
75a0: 7d 20 65 6c 73 65 20 69 66 20 28 66 6f 72 6d 61  } else if (forma
75b0: 74 20 26 20 54 59 50 45 5f 43 4d 41 43 29 20 7b  t & TYPE_CMAC) {
75c0: 0a 09 44 69 67 65 73 74 53 74 61 74 65 20 2a 73  ..DigestState *s
75d0: 74 61 74 65 50 74 72 3b 0a 0a 09 69 66 20 28 28  tatePtr;...if ((
75e0: 73 74 61 74 65 50 74 72 20 3d 20 54 6c 73 5f 44  statePtr = Tls_D
75f0: 69 67 65 73 74 4e 65 77 28 69 6e 74 65 72 70 2c  igestNew(interp,
7600: 20 66 6f 72 6d 61 74 29 29 20 3d 3d 20 4e 55 4c   format)) == NUL
7610: 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70  L) {..    Tcl_Ap
7620: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
7630: 70 2c 20 22 4d 65 6d 6f 72 79 20 61 6c 6c 6f 63  p, "Memory alloc
7640: 61 74 69 6f 6e 20 65 72 72 6f 72 22 2c 20 28 63  ation error", (c
7650: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
7660: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
7670: 52 4f 52 3b 0a 09 7d 0a 09 69 66 20 28 54 6c 73  ROR;..}..if (Tls
7680: 5f 44 69 67 65 73 74 49 6e 69 74 28 69 6e 74 65  _DigestInit(inte
7690: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 6d 64  rp, statePtr, md
76a0: 2c 20 63 69 70 68 65 72 2c 20 6b 65 79 4f 62 6a  , cipher, keyObj
76b0: 29 20 21 3d 20 54 43 4c 5f 4f 4b 20 7c 7c 0a 09  ) != TCL_OK ||..
76c0: 20 20 20 20 54 6c 73 5f 44 69 67 65 73 74 55 70      Tls_DigestUp
76d0: 64 61 74 65 28 73 74 61 74 65 50 74 72 2c 20 64  date(statePtr, d
76e0: 61 74 61 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65  ata, (size_t) le
76f0: 6e 29 20 3d 3d 20 30 20 7c 7c 0a 09 20 20 20 20  n) == 0 ||..    
7700: 54 6c 73 5f 44 69 67 65 73 74 46 69 6e 69 61 6c  Tls_DigestFinial
7710: 69 7a 65 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ize(interp, stat
7720: 65 50 74 72 29 20 21 3d 20 54 43 4c 5f 4f 4b 29  ePtr) != TCL_OK)
7730: 20 7b 0a 09 20 20 20 20 54 6c 73 5f 44 69 67 65   {..    Tls_Dige
7740: 73 74 46 72 65 65 28 73 74 61 74 65 50 74 72 29  stFree(statePtr)
7750: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
7760: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 54 6c 73  L_ERROR;..}..Tls
7770: 5f 44 69 67 65 73 74 46 72 65 65 28 73 74 61 74  _DigestFree(stat
7780: 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54  ePtr);..return T
7790: 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  CL_OK;.    }..  
77a0: 20 20 2f 2a 20 4f 75 74 70 75 74 20 64 69 67 65    /* Output dige
77b0: 73 74 20 74 6f 20 72 65 73 75 6c 74 20 70 65 72  st to result per
77c0: 20 66 6f 72 6d 61 74 20 28 62 69 6e 20 6f 72 20   format (bin or 
77d0: 68 65 78 29 20 2a 2f 0a 20 20 20 20 69 66 20 28  hex) */.    if (
77e0: 72 65 73 29 20 7b 0a 09 69 66 20 28 66 6f 72 6d  res) {..if (form
77f0: 61 74 20 26 20 42 49 4e 5f 46 4f 52 4d 41 54 29  at & BIN_FORMAT)
7800: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 4f   {..    Tcl_SetO
7810: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
7820: 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
7830: 79 4f 62 6a 28 6d 64 5f 62 75 66 2c 20 6d 64 5f  yObj(md_buf, md_
7840: 6c 65 6e 29 29 3b 0a 0a 09 7d 20 65 6c 73 65 20  len));...} else 
7850: 7b 0a 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  {..    Tcl_Obj *
7860: 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f  resultObj = Tcl_
7870: 4e 65 77 4f 62 6a 28 29 3b 0a 09 20 20 20 20 75  NewObj();..    u
7880: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 74  nsigned char *pt
7890: 72 20 3d 20 54 63 6c 5f 53 65 74 42 79 74 65 41  r = Tcl_SetByteA
78a0: 72 72 61 79 4c 65 6e 67 74 68 28 72 65 73 75 6c  rrayLength(resul
78b0: 74 4f 62 6a 2c 20 6d 64 5f 6c 65 6e 2a 32 29 3b  tObj, md_len*2);
78c0: 0a 0a 09 20 20 20 20 66 6f 72 20 28 75 6e 73 69  ...    for (unsi
78d0: 67 6e 65 64 20 69 6e 74 20 69 20 3d 20 30 3b 20  gned int i = 0; 
78e0: 69 20 3c 20 6d 64 5f 6c 65 6e 3b 20 69 2b 2b 29  i < md_len; i++)
78f0: 20 7b 0a 09 09 2a 70 74 72 2b 2b 20 3d 20 68 65   {...*ptr++ = he
7900: 78 5b 28 6d 64 5f 62 75 66 5b 69 5d 20 3e 3e 20  x[(md_buf[i] >> 
7910: 34 29 20 26 20 30 78 30 46 5d 3b 0a 09 09 2a 70  4) & 0x0F];...*p
7920: 74 72 2b 2b 20 3d 20 68 65 78 5b 6d 64 5f 62 75  tr++ = hex[md_bu
7930: 66 5b 69 5d 20 26 20 30 78 30 46 5d 3b 0a 09 20  f[i] & 0x0F];.. 
7940: 20 20 20 7d 0a 09 54 63 6c 5f 53 65 74 4f 62 6a     }..Tcl_SetObj
7950: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 72  Result(interp, r
7960: 65 73 75 6c 74 4f 62 6a 29 3b 0a 09 7d 0a 0a 20  esultObj);..}.. 
7970: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c     } else {..Tcl
7980: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
7990: 74 65 72 70 2c 20 22 48 61 73 68 20 63 61 6c 63  terp, "Hash calc
79a0: 75 6c 61 74 69 6f 6e 20 65 72 72 6f 72 3a 22 2c  ulation error:",
79b0: 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72   REASON(), (char
79c0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75   *) NULL);..retu
79d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
79e0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54    }.    return T
79f0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a  CL_OK;.}.../****
7a00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
7a40: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
7a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
7a90: 20 44 69 67 65 73 74 4f 62 6a 43 6d 64 20 2d 2d   DigestObjCmd --
7aa0: 0a 20 2a 0a 20 2a 09 52 65 74 75 72 6e 20 6d 65  . *. *.Return me
7ab0: 73 73 61 67 65 20 64 69 67 65 73 74 20 75 73 69  ssage digest usi
7ac0: 6e 67 20 75 73 65 72 20 73 70 65 63 69 66 69 65  ng user specifie
7ad0: 64 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e  d hash function.
7ae0: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a  . *. * Returns:.
7af0: 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c   *.TCL_OK or TCL
7b00: 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64  _ERROR. *. * Sid
7b10: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65  e effects:. *.Se
7b20: 74 73 20 72 65 73 75 6c 74 20 74 6f 20 6d 65 73  ts result to mes
7b30: 73 61 67 65 20 64 69 67 65 73 74 20 6f 72 20 65  sage digest or e
7b40: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a  rror message. *.
7b50: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
7b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7b90: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
7ba0: 20 69 6e 74 20 44 69 67 65 73 74 4d 61 69 6e 28   int DigestMain(
7bb0: 69 6e 74 20 74 79 70 65 2c 20 54 63 6c 5f 49 6e  int type, Tcl_In
7bc0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
7bd0: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
7be0: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b  *const objv[]) {
7bf0: 0a 20 20 20 20 69 6e 74 20 69 64 78 2c 20 6c 65  .    int idx, le
7c00: 6e 2c 20 66 6f 72 6d 61 74 20 3d 20 48 45 58 5f  n, format = HEX_
7c10: 46 4f 52 4d 41 54 2c 20 72 65 73 20 3d 20 54 43  FORMAT, res = TC
7c20: 4c 5f 4f 4b 2c 20 66 6c 61 67 73 20 3d 20 30 3b  L_OK, flags = 0;
7c30: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
7c40: 2a 64 69 67 65 73 74 4e 61 6d 65 2c 20 2a 63 68  *digestName, *ch
7c50: 61 6e 6e 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20  annel = NULL;.  
7c60: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 4f 62    Tcl_Obj *cmdOb
7c70: 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 64 61 74 61 4f  j = NULL, *dataO
7c80: 62 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 66 69 6c 65  bj = NULL, *file
7c90: 4f 62 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 6b 65 79  Obj = NULL, *key
7ca0: 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  Obj = NULL;.    
7cb0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63  unsigned char *c
7cc0: 69 70 68 65 72 4e 61 6d 65 20 3d 20 4e 55 4c 4c  ipherName = NULL
7cd0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45 56 50 5f  ;.    const EVP_
7ce0: 4d 44 20 2a 6d 64 3b 0a 20 20 20 20 63 6f 6e 73  MD *md;.    cons
7cf0: 74 20 45 56 50 5f 43 49 50 48 45 52 20 2a 63 69  t EVP_CIPHER *ci
7d00: 70 68 65 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20  pher = NULL;..  
7d10: 20 20 2f 2a 20 43 6c 65 61 72 20 69 6e 74 65 72    /* Clear inter
7d20: 70 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20  p result */.    
7d30: 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
7d40: 69 6e 74 65 72 70 29 3b 0a 0a 20 20 20 20 2f 2a  interp);..    /*
7d50: 20 56 61 6c 69 64 61 74 65 20 61 72 67 20 63 6f   Validate arg co
7d60: 75 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f  unt */.    if (o
7d70: 62 6a 63 20 3c 20 33 20 7c 7c 20 6f 62 6a 63 20  bjc < 3 || objc 
7d80: 3e 20 39 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e  > 9) {..Tcl_Wron
7d90: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
7da0: 20 31 2c 20 6f 62 6a 76 2c 20 22 64 69 67 65 73   1, objv, "diges
7db0: 74 20 3f 2d 62 69 6e 7c 2d 68 65 78 3f 20 3f 2d  t ?-bin|-hex? ?-
7dc0: 63 69 70 68 65 72 20 6e 61 6d 65 3f 20 3f 2d 6b  cipher name? ?-k
7dd0: 65 79 20 68 6d 61 63 5f 6b 65 79 3f 20 5b 2d 63  ey hmac_key? [-c
7de0: 68 61 6e 6e 65 6c 20 63 68 61 6e 20 7c 20 2d 63  hannel chan | -c
7df0: 6f 6d 6d 61 6e 64 20 63 6d 64 4e 61 6d 65 20 7c  ommand cmdName |
7e00: 20 2d 66 69 6c 65 20 66 69 6c 65 6e 61 6d 65 20   -file filename 
7e10: 7c 20 3f 2d 64 61 74 61 3f 20 64 61 74 61 5d 22  | ?-data? data]"
7e20: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
7e30: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
7e40: 20 2f 2a 20 47 65 74 20 64 69 67 65 73 74 20 2a   /* Get digest *
7e50: 2f 0a 20 20 20 20 64 69 67 65 73 74 4e 61 6d 65  /.    digestName
7e60: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
7e70: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c  FromObj(objv[1],
7e80: 20 26 6c 65 6e 29 3b 0a 20 20 20 20 69 66 20 28   &len);.    if (
7e90: 64 69 67 65 73 74 4e 61 6d 65 20 3d 3d 20 4e 55  digestName == NU
7ea0: 4c 4c 20 7c 7c 20 28 6d 64 20 3d 20 45 56 50 5f  LL || (md = EVP_
7eb0: 67 65 74 5f 64 69 67 65 73 74 62 79 6e 61 6d 65  get_digestbyname
7ec0: 28 64 69 67 65 73 74 4e 61 6d 65 29 29 20 3d 3d  (digestName)) ==
7ed0: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70   NULL) {..Tcl_Ap
7ee0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
7ef0: 70 2c 20 22 49 6e 76 61 6c 69 64 20 64 69 67 65  p, "Invalid dige
7f00: 73 74 20 5c 22 22 2c 20 64 69 67 65 73 74 4e 61  st \"", digestNa
7f10: 6d 65 2c 20 22 5c 22 22 2c 20 4e 55 4c 4c 29 3b  me, "\"", NULL);
7f20: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
7f30: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
7f40: 2a 20 4f 70 74 69 6d 61 6c 20 63 61 73 65 20 66  * Optimal case f
7f50: 6f 72 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20  or blob of data 
7f60: 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  */.    if (objc 
7f70: 3d 3d 20 33 20 26 26 20 74 79 70 65 20 3d 3d 20  == 3 && type == 
7f80: 54 59 50 45 5f 4d 44 29 20 7b 0a 09 72 65 74 75  TYPE_MD) {..retu
7f90: 72 6e 20 54 6c 73 5f 44 69 67 65 73 74 44 61 74  rn Tls_DigestDat
7fa0: 61 28 69 6e 74 65 72 70 2c 20 2d 2d 6f 62 6a 63  a(interp, --objc
7fb0: 2c 20 2b 2b 6f 62 6a 76 2c 20 6d 64 2c 20 4e 55  , ++objv, md, NU
7fc0: 4c 4c 2c 20 48 45 58 5f 46 4f 52 4d 41 54 20 7c  LL, HEX_FORMAT |
7fd0: 20 54 59 50 45 5f 4d 44 2c 20 4e 55 4c 4c 29 3b   TYPE_MD, NULL);
7fe0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
7ff0: 65 74 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20  et options */.  
8000: 20 20 66 6f 72 20 28 69 64 78 20 3d 20 32 3b 20    for (idx = 2; 
8010: 69 64 78 20 3c 20 6f 62 6a 63 2d 31 3b 20 69 64  idx < objc-1; id
8020: 78 2b 2b 29 20 7b 0a 09 63 68 61 72 20 2a 6f 70  x++) {..char *op
8030: 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  t = Tcl_GetStrin
8040: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69 64  gFromObj(objv[id
8050: 78 5d 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20  x], NULL);...if 
8060: 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d 27 29 20  (opt[0] != '-') 
8070: 7b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d  {..    break;..}
8080: 0a 0a 09 4f 50 54 46 4c 41 47 28 22 2d 62 69 6e  ...OPTFLAG("-bin
8090: 22 2c 20 66 6f 72 6d 61 74 2c 20 42 49 4e 5f 46  ", format, BIN_F
80a0: 4f 52 4d 41 54 29 3b 0a 09 4f 50 54 46 4c 41 47  ORMAT);..OPTFLAG
80b0: 28 22 2d 62 69 6e 61 72 79 22 2c 20 66 6f 72 6d  ("-binary", form
80c0: 61 74 2c 20 42 49 4e 5f 46 4f 52 4d 41 54 29 3b  at, BIN_FORMAT);
80d0: 0a 09 4f 50 54 46 4c 41 47 28 22 2d 68 65 78 22  ..OPTFLAG("-hex"
80e0: 2c 20 66 6f 72 6d 61 74 2c 20 48 45 58 5f 46 4f  , format, HEX_FO
80f0: 52 4d 41 54 29 3b 0a 09 4f 50 54 46 4c 41 47 28  RMAT);..OPTFLAG(
8100: 22 2d 68 65 78 61 64 65 63 69 6d 61 6c 22 2c 20  "-hexadecimal", 
8110: 66 6f 72 6d 61 74 2c 20 48 45 58 5f 46 4f 52 4d  format, HEX_FORM
8120: 41 54 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63  AT);..OPTSTR("-c
8130: 68 61 6e 22 2c 20 63 68 61 6e 6e 65 6c 29 3b 0a  han", channel);.
8140: 09 4f 50 54 53 54 52 28 22 2d 63 68 61 6e 6e 65  .OPTSTR("-channe
8150: 6c 22 2c 20 63 68 61 6e 6e 65 6c 29 3b 0a 09 4f  l", channel);..O
8160: 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 22 2c  PTSTR("-cipher",
8170: 20 63 69 70 68 65 72 4e 61 6d 65 29 3b 0a 09 4f   cipherName);..O
8180: 50 54 4f 42 4a 28 22 2d 63 6f 6d 6d 61 6e 64 22  PTOBJ("-command"
8190: 2c 20 63 6d 64 4f 62 6a 29 3b 0a 09 4f 50 54 4f  , cmdObj);..OPTO
81a0: 42 4a 28 22 2d 64 61 74 61 22 2c 20 64 61 74 61  BJ("-data", data
81b0: 4f 62 6a 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d  Obj);..OPTOBJ("-
81c0: 66 69 6c 65 22 2c 20 66 69 6c 65 4f 62 6a 29 3b  file", fileObj);
81d0: 0a 09 4f 50 54 4f 42 4a 28 22 2d 66 69 6c 65 6e  ..OPTOBJ("-filen
81e0: 61 6d 65 22 2c 20 66 69 6c 65 4f 62 6a 29 3b 0a  ame", fileObj);.
81f0: 09 4f 50 54 4f 42 4a 28 22 2d 6b 65 79 22 2c 20  .OPTOBJ("-key", 
8200: 6b 65 79 4f 62 6a 29 3b 0a 0a 09 4f 50 54 42 41  keyObj);...OPTBA
8210: 44 28 22 6f 70 74 69 6f 6e 22 2c 20 22 2d 62 69  D("option", "-bi
8220: 6e 2c 20 2d 63 68 61 6e 6e 65 6c 2c 20 2d 63 69  n, -channel, -ci
8230: 70 68 65 72 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20  pher, -command, 
8240: 2d 64 61 74 61 2c 20 2d 66 69 6c 65 2c 20 2d 66  -data, -file, -f
8250: 69 6c 65 6e 61 6d 65 2c 20 2d 68 65 78 2c 20 6f  ilename, -hex, o
8260: 72 20 2d 6b 65 79 22 29 3b 0a 09 72 65 74 75 72  r -key");..retur
8270: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
8280: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f   }..    /* If no
8290: 20 6f 70 74 69 6f 6e 20 66 6f 72 20 6c 61 73 74   option for last
82a0: 20 61 72 67 2c 20 74 68 65 6e 20 69 74 73 20 74   arg, then its t
82b0: 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 69  he data */.    i
82c0: 66 20 28 69 64 78 20 3c 20 6f 62 6a 63 29 20 7b  f (idx < objc) {
82d0: 0a 09 64 61 74 61 4f 62 6a 20 3d 20 6f 62 6a 76  ..dataObj = objv
82e0: 5b 69 64 78 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20  [idx];.    }..  
82f0: 20 20 2f 2a 20 47 65 74 20 63 69 70 68 65 72 20    /* Get cipher 
8300: 2a 2f 0a 20 20 20 20 69 66 20 28 63 69 70 68 65  */.    if (ciphe
8310: 72 4e 61 6d 65 20 21 3d 20 4e 55 4c 4c 29 20 7b  rName != NULL) {
8320: 0a 09 63 69 70 68 65 72 20 3d 20 45 56 50 5f 67  ..cipher = EVP_g
8330: 65 74 5f 63 69 70 68 65 72 62 79 6e 61 6d 65 28  et_cipherbyname(
8340: 63 69 70 68 65 72 4e 61 6d 65 29 3b 0a 09 74 79  cipherName);..ty
8350: 70 65 20 3d 20 54 59 50 45 5f 43 4d 41 43 3b 0a  pe = TYPE_CMAC;.
8360: 09 69 66 20 28 63 69 70 68 65 72 20 3d 3d 20 4e  .if (cipher == N
8370: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  ULL) {..    Tcl_
8380: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
8390: 65 72 70 2c 20 22 49 6e 76 61 6c 69 64 20 63 69  erp, "Invalid ci
83a0: 70 68 65 72 20 5c 22 22 2c 20 63 69 70 68 65 72  pher \"", cipher
83b0: 4e 61 6d 65 2c 20 22 5c 22 22 2c 20 4e 55 4c 4c  Name, "\"", NULL
83c0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
83d0: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 20 20  CL_ERROR;..}..  
83e0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 74 79 70    } else if (typ
83f0: 65 20 3d 3d 20 54 59 50 45 5f 43 4d 41 43 29 20  e == TYPE_CMAC) 
8400: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
8410: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20  ult(interp, "No 
8420: 63 69 70 68 65 72 20 73 70 65 63 69 66 69 65 64  cipher specified
8430: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  ", NULL);..retur
8440: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
8450: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 6b   }..    /* Get k
8460: 65 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 6b 65  ey */.    if (ke
8470: 79 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  yObj != NULL) {.
8480: 09 69 66 20 28 74 79 70 65 20 3d 3d 20 54 59 50  .if (type == TYP
8490: 45 5f 4d 44 29 20 7b 0a 09 20 20 20 20 74 79 70  E_MD) {..    typ
84a0: 65 20 3d 20 54 59 50 45 5f 48 4d 41 43 3b 0a 09  e = TYPE_HMAC;..
84b0: 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  }.    } else if 
84c0: 28 74 79 70 65 20 21 3d 20 54 59 50 45 5f 4d 44  (type != TYPE_MD
84d0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
84e0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e  esult(interp, "N
84f0: 6f 20 6b 65 79 20 73 70 65 63 69 66 69 65 64 22  o key specified"
8500: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  , NULL);..return
8510: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
8520: 7d 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 63 20 64  }..    /* Calc d
8530: 69 67 65 73 74 20 6f 6e 20 66 69 6c 65 2c 20 73  igest on file, s
8540: 74 61 63 6b 65 64 20 63 68 61 6e 6e 65 6c 2c 20  tacked channel, 
8550: 75 73 69 6e 67 20 69 6e 73 74 61 6e 63 65 20 63  using instance c
8560: 6f 6d 6d 61 6e 64 2c 20 6f 72 20 64 61 74 61 20  ommand, or data 
8570: 62 6c 6f 62 20 2a 2f 0a 20 20 20 20 69 66 20 28  blob */.    if (
8580: 66 69 6c 65 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29  fileObj != NULL)
8590: 20 7b 0a 09 72 65 73 20 3d 20 54 6c 73 5f 44 69   {..res = Tls_Di
85a0: 67 65 73 74 46 69 6c 65 28 69 6e 74 65 72 70 2c  gestFile(interp,
85b0: 20 66 69 6c 65 4f 62 6a 2c 20 6d 64 2c 20 63 69   fileObj, md, ci
85c0: 70 68 65 72 2c 20 66 6f 72 6d 61 74 20 7c 20 74  pher, format | t
85d0: 79 70 65 2c 20 6b 65 79 4f 62 6a 29 3b 0a 20 20  ype, keyObj);.  
85e0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 68 61    } else if (cha
85f0: 6e 6e 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  nnel != NULL) {.
8600: 09 72 65 73 20 3d 20 54 6c 73 5f 44 69 67 65 73  .res = Tls_Diges
8610: 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c  tChannel(interp,
8620: 20 63 68 61 6e 6e 65 6c 2c 20 6d 64 2c 20 63 69   channel, md, ci
8630: 70 68 65 72 2c 20 66 6f 72 6d 61 74 20 7c 20 74  pher, format | t
8640: 79 70 65 2c 20 6b 65 79 4f 62 6a 29 3b 0a 20 20  ype, keyObj);.  
8650: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6d 64    } else if (cmd
8660: 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Obj != NULL) {..
8670: 72 65 73 20 3d 20 54 6c 73 5f 44 69 67 65 73 74  res = Tls_Digest
8680: 49 6e 73 74 61 6e 63 65 28 69 6e 74 65 72 70 2c  Instance(interp,
8690: 20 63 6d 64 4f 62 6a 2c 20 6d 64 2c 20 63 69 70   cmdObj, md, cip
86a0: 68 65 72 2c 20 66 6f 72 6d 61 74 20 7c 20 74 79  her, format | ty
86b0: 70 65 2c 20 6b 65 79 4f 62 6a 29 3b 0a 20 20 20  pe, keyObj);.   
86c0: 20 7d 20 65 6c 73 65 20 69 66 20 28 64 61 74 61   } else if (data
86d0: 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Obj != NULL) {..
86e0: 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 73 5b 32 5d  Tcl_Obj *objs[2]
86f0: 3b 0a 09 6f 62 6a 73 5b 30 5d 20 3d 20 4e 55 4c  ;..objs[0] = NUL
8700: 4c 3b 0a 09 6f 62 6a 73 5b 31 5d 20 3d 20 64 61  L;..objs[1] = da
8710: 74 61 4f 62 6a 3b 0a 09 72 65 73 20 3d 20 54 6c  taObj;..res = Tl
8720: 73 5f 44 69 67 65 73 74 44 61 74 61 28 69 6e 74  s_DigestData(int
8730: 65 72 70 2c 20 32 2c 20 6f 62 6a 73 2c 20 6d 64  erp, 2, objs, md
8740: 2c 20 63 69 70 68 65 72 2c 20 66 6f 72 6d 61 74  , cipher, format
8750: 20 7c 20 74 79 70 65 2c 20 6b 65 79 4f 62 6a 29   | type, keyObj)
8760: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
8770: 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  rn res;.}../*. *
8780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
87a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
87b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
87c0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 65 73 73 61 67  ---. *. * Messag
87d0: 65 20 44 69 67 65 73 74 20 61 6e 64 20 4d 65 73  e Digest and Mes
87e0: 73 61 67 65 20 41 75 74 68 65 6e 74 69 63 61 74  sage Authenticat
87f0: 69 6f 6e 20 43 6f 64 65 20 43 6f 6d 6d 61 6e 64  ion Code Command
8800: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 75 72  s --. *. *.Retur
8810: 6e 20 4d 65 73 73 61 67 65 20 44 69 67 65 73 74  n Message Digest
8820: 20 28 4d 44 29 20 6f 72 20 4d 65 73 73 61 67 65   (MD) or Message
8830: 20 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20   Authentication 
8840: 43 6f 64 65 20 28 4d 41 43 29 2e 0a 20 2a 0a 20  Code (MAC).. *. 
8850: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43  * Returns:. *.TC
8860: 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f  L_OK or TCL_ERRO
8870: 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  R. *. * Side eff
8880: 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 72 65  ects:. *.Sets re
8890: 73 75 6c 74 20 74 6f 20 6d 65 73 73 61 67 65 20  sult to message 
88a0: 64 69 67 65 73 74 20 6f 72 20 65 72 72 6f 72 20  digest or error 
88b0: 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d  message. *. *---
88c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
88d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
88e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
88f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8900: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
8910: 44 69 67 65 73 74 4f 62 6a 43 6d 64 28 43 6c 69  DigestObjCmd(Cli
8920: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
8930: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
8940: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
8950: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
8960: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 72   objv[]) {.    r
8970: 65 74 75 72 6e 20 44 69 67 65 73 74 4d 61 69 6e  eturn DigestMain
8980: 28 54 59 50 45 5f 4d 44 2c 20 69 6e 74 65 72 70  (TYPE_MD, interp
8990: 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 7d  , objc, objv);.}
89a0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 43 4d 41  ..static int CMA
89b0: 43 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61  CObjCmd(ClientDa
89c0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
89d0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
89e0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
89f0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
8a00: 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  []) {.    return
8a10: 20 44 69 67 65 73 74 4d 61 69 6e 28 54 59 50 45   DigestMain(TYPE
8a20: 5f 43 4d 41 43 2c 20 69 6e 74 65 72 70 2c 20 6f  _CMAC, interp, o
8a30: 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 7d 0a 0a 73  bjc, objv);.}..s
8a40: 74 61 74 69 63 20 69 6e 74 20 48 4d 41 43 4f 62  tatic int HMACOb
8a50: 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20  jCmd(ClientData 
8a60: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f  clientData, Tcl_
8a70: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
8a80: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
8a90: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j *const objv[])
8aa0: 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 44 69   {.    return Di
8ab0: 67 65 73 74 4d 61 69 6e 28 54 59 50 45 5f 48 4d  gestMain(TYPE_HM
8ac0: 41 43 2c 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63  AC, interp, objc
8ad0: 2c 20 6f 62 6a 76 29 3b 0a 7d 0a 0a 2f 2a 0a 20  , objv);.}../*. 
8ae0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
8af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b20: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 65 73 73 61  ----. *. * Messa
8b30: 67 65 20 44 69 67 65 73 74 20 43 6f 6e 76 65 6e  ge Digest Conven
8b40: 69 65 6e 63 65 20 43 6f 6d 6d 61 6e 64 73 20 2d  ience Commands -
8b50: 2d 0a 20 2a 0a 20 2a 09 43 6f 6e 76 65 6e 69 65  -. *. *.Convenie
8b60: 6e 63 65 20 63 6f 6d 6d 61 6e 64 73 20 66 6f 72  nce commands for
8b70: 20 73 65 6c 65 63 74 20 6d 65 73 73 61 67 65 20   select message 
8b80: 64 69 67 65 73 74 73 2e 0a 20 2a 0a 20 2a 20 52  digests.. *. * R
8b90: 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f  eturns:. *.TCL_O
8ba0: 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20  K or TCL_ERROR. 
8bb0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
8bc0: 73 3a 0a 20 2a 09 53 65 74 73 20 72 65 73 75 6c  s:. *.Sets resul
8bd0: 74 20 74 6f 20 6d 65 73 73 61 67 65 20 64 69 67  t to message dig
8be0: 65 73 74 20 6f 72 20 65 72 72 6f 72 20 6d 65 73  est or error mes
8bf0: 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  sage. *. *------
8c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
8c40: 2f 0a 69 6e 74 20 44 69 67 65 73 74 4d 44 34 43  /.int DigestMD4C
8c50: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  md(ClientData cl
8c60: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e  ientData, Tcl_In
8c70: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
8c80: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
8c90: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b  *const objv[]) {
8ca0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 6c 73 5f  .    return Tls_
8cb0: 44 69 67 65 73 74 44 61 74 61 28 69 6e 74 65 72  DigestData(inter
8cc0: 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 45  p, objc, objv, E
8cd0: 56 50 5f 6d 64 34 28 29 2c 20 4e 55 4c 4c 2c 20  VP_md4(), NULL, 
8ce0: 48 45 58 5f 46 4f 52 4d 41 54 20 7c 20 54 59 50  HEX_FORMAT | TYP
8cf0: 45 5f 4d 44 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a  E_MD, NULL);.}..
8d00: 69 6e 74 20 44 69 67 65 73 74 4d 44 35 43 6d 64  int DigestMD5Cmd
8d10: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
8d20: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ntData, Tcl_Inte
8d30: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
8d40: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63  objc, Tcl_Obj *c
8d50: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20  onst objv[]) {. 
8d60: 20 20 20 72 65 74 75 72 6e 20 54 6c 73 5f 44 69     return Tls_Di
8d70: 67 65 73 74 44 61 74 61 28 69 6e 74 65 72 70 2c  gestData(interp,
8d80: 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 45 56 50   objc, objv, EVP
8d90: 5f 6d 64 35 28 29 2c 20 4e 55 4c 4c 2c 20 48 45  _md5(), NULL, HE
8da0: 58 5f 46 4f 52 4d 41 54 20 7c 20 54 59 50 45 5f  X_FORMAT | TYPE_
8db0: 4d 44 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 69 6e  MD, NULL);.}..in
8dc0: 74 20 44 69 67 65 73 74 53 48 41 31 43 6d 64 28  t DigestSHA1Cmd(
8dd0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
8de0: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
8df0: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
8e00: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
8e10: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
8e20: 20 20 72 65 74 75 72 6e 20 54 6c 73 5f 44 69 67    return Tls_Dig
8e30: 65 73 74 44 61 74 61 28 69 6e 74 65 72 70 2c 20  estData(interp, 
8e40: 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 45 56 50 5f  objc, objv, EVP_
8e50: 73 68 61 31 28 29 2c 20 4e 55 4c 4c 2c 20 48 45  sha1(), NULL, HE
8e60: 58 5f 46 4f 52 4d 41 54 20 7c 20 54 59 50 45 5f  X_FORMAT | TYPE_
8e70: 4d 44 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 69 6e  MD, NULL);.}..in
8e80: 74 20 44 69 67 65 73 74 53 48 41 32 35 36 43 6d  t DigestSHA256Cm
8e90: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  d(ClientData cli
8ea0: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  entData, Tcl_Int
8eb0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
8ec0: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
8ed0: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a  const objv[]) {.
8ee0: 20 20 20 20 72 65 74 75 72 6e 20 54 6c 73 5f 44      return Tls_D
8ef0: 69 67 65 73 74 44 61 74 61 28 69 6e 74 65 72 70  igestData(interp
8f00: 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 45 56  , objc, objv, EV
8f10: 50 5f 73 68 61 32 35 36 28 29 2c 20 4e 55 4c 4c  P_sha256(), NULL
8f20: 2c 20 48 45 58 5f 46 4f 52 4d 41 54 20 7c 20 54  , HEX_FORMAT | T
8f30: 59 50 45 5f 4d 44 2c 20 4e 55 4c 4c 29 3b 0a 7d  YPE_MD, NULL);.}
8f40: 0a 0a 69 6e 74 20 44 69 67 65 73 74 53 48 41 35  ..int DigestSHA5
8f50: 31 32 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  12Cmd(ClientData
8f60: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
8f70: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
8f80: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
8f90: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
8fa0: 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ) {.    return T
8fb0: 6c 73 5f 44 69 67 65 73 74 44 61 74 61 28 69 6e  ls_DigestData(in
8fc0: 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76  terp, objc, objv
8fd0: 2c 20 45 56 50 5f 73 68 61 35 31 32 28 29 2c 20  , EVP_sha512(), 
8fe0: 4e 55 4c 4c 2c 20 48 45 58 5f 46 4f 52 4d 41 54  NULL, HEX_FORMAT
8ff0: 20 7c 20 54 59 50 45 5f 4d 44 2c 20 4e 55 4c 4c   | TYPE_MD, NULL
9000: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  );.}../*. *-----
9010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
9050: 2a 0a 20 2a 20 54 6c 73 5f 44 69 67 65 73 74 43  *. * Tls_DigestC
9060: 6f 6d 6d 61 6e 64 73 20 2d 2d 0a 20 2a 0a 20 2a  ommands --. *. *
9070: 09 43 72 65 61 74 65 20 64 69 67 65 73 74 20 63  .Create digest c
9080: 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65  ommands. *. * Re
9090: 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b  turns:. *.TCL_OK
90a0: 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a   or TCL_ERROR. *
90b0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
90c0: 3a 0a 20 2a 09 43 72 65 61 74 65 73 20 63 6f 6d  :. *.Creates com
90d0: 6d 61 6e 64 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  mands. *. *-----
90e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
90f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
9120: 2a 2f 0a 69 6e 74 20 54 6c 73 5f 44 69 67 65 73  */.int Tls_Diges
9130: 74 43 6f 6d 6d 61 6e 64 73 28 54 63 6c 5f 49 6e  tCommands(Tcl_In
9140: 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a  terp *interp) {.
9150: 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
9160: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
9170: 20 22 74 6c 73 3a 3a 64 69 67 65 73 74 22 2c 20   "tls::digest", 
9180: 44 69 67 65 73 74 4f 62 6a 43 6d 64 2c 20 28 43  DigestObjCmd, (C
9190: 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54  lientData) 0, (T
91a0: 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
91b0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
91c0: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
91d0: 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  and(interp, "tls
91e0: 3a 3a 63 6d 61 63 22 2c 20 43 4d 41 43 4f 62 6a  ::cmac", CMACObj
91f0: 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  Cmd, (ClientData
9200: 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ) 0, (Tcl_CmdDel
9210: 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
9220: 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
9230: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
9240: 70 2c 20 22 74 6c 73 3a 3a 68 6d 61 63 22 2c 20  p, "tls::hmac", 
9250: 48 4d 41 43 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  HMACObjCmd, (Cli
9260: 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c  entData) 0, (Tcl
9270: 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
9280: 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c  ) NULL);.    Tcl
9290: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
92a0: 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  d(interp, "tls::
92b0: 6d 64 34 22 2c 20 44 69 67 65 73 74 4d 44 34 43  md4", DigestMD4C
92c0: 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
92d0: 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65   0, (Tcl_CmdDele
92e0: 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
92f0: 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
9300: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
9310: 2c 20 22 74 6c 73 3a 3a 6d 64 35 22 2c 20 44 69  , "tls::md5", Di
9320: 67 65 73 74 4d 44 35 43 6d 64 2c 20 28 43 6c 69  gestMD5Cmd, (Cli
9330: 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c  entData) 0, (Tcl
9340: 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
9350: 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c  ) NULL);.    Tcl
9360: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
9370: 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  d(interp, "tls::
9380: 73 68 61 31 22 2c 20 44 69 67 65 73 74 53 48 41  sha1", DigestSHA
9390: 31 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74  1Cmd, (ClientDat
93a0: 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65  a) 0, (Tcl_CmdDe
93b0: 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c  leteProc *) NULL
93c0: 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  );.    Tcl_Creat
93d0: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
93e0: 72 70 2c 20 22 74 6c 73 3a 3a 73 68 61 32 35 36  rp, "tls::sha256
93f0: 22 2c 20 44 69 67 65 73 74 53 48 41 32 35 36 43  ", DigestSHA256C
9400: 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
9410: 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65   0, (Tcl_CmdDele
9420: 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
9430: 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
9440: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
9450: 2c 20 22 74 6c 73 3a 3a 73 68 61 35 31 32 22 2c  , "tls::sha512",
9460: 20 44 69 67 65 73 74 53 48 41 35 31 32 43 6d 64   DigestSHA512Cmd
9470: 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30  , (ClientData) 0
9480: 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
9490: 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Proc *) NULL);. 
94a0: 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
94b0: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
94c0: 22 74 6c 73 3a 3a 75 6e 73 74 61 63 6b 22 2c 20  "tls::unstack", 
94d0: 55 6e 73 74 61 63 6b 4f 62 6a 43 6d 64 2c 20 28  UnstackObjCmd, (
94e0: 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28  ClientData) 0, (
94f0: 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
9500: 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  c *) NULL);.    
9510: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
9520: 0a 0a                                            ..