Hex Artifact Content

Artifact f2bddde2af320906b6c735eadc424f45a90ca0d5e1b3b5f5c139ef7aecf25701:


0000: 2f 2a 0a 20 2a 20 4d 65 73 73 61 67 65 20 44 69  /*. * Message Di
0010: 67 65 73 74 20 28 4d 44 29 20 61 6e 64 20 4d 65  gest (MD) and Me
0020: 73 73 61 67 65 20 41 75 74 68 65 6e 74 69 63 61  ssage Authentica
0030: 74 69 6f 6e 20 43 6f 64 65 20 28 4d 41 43 29 20  tion Code (MAC) 
0040: 4d 6f 64 75 6c 65 0a 20 2a 0a 20 2a 20 50 72 6f  Module. *. * Pro
0050: 76 69 64 65 73 20 63 6f 6d 6d 61 6e 64 73 20 74  vides commands t
0060: 6f 20 63 61 6c 63 75 6c 61 74 65 20 61 20 4d 65  o calculate a Me
0070: 73 73 61 67 65 20 44 69 67 65 73 74 20 28 4d 44  ssage Digest (MD
0080: 29 20 6f 72 20 61 20 4d 65 73 73 61 67 65 0a 20  ) or a Message. 
0090: 2a 20 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e  * Authentication
00a0: 20 43 6f 64 65 20 28 4d 41 43 29 2e 0a 20 2a 0a   Code (MAC).. *.
00b0: 20 2a 20 43 6f 70 79 72 69 67 68 74 20 28 43 29   * Copyright (C)
00c0: 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48 61   2023 Brian O'Ha
00d0: 67 61 6e 0a 20 2a 0a 20 2a 2f 0a 0a 23 69 6e 63  gan. *. */..#inc
00e0: 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68 22 0a  lude "tlsInt.h".
00f0: 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 4f 70 74  #include "tclOpt
0100: 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 74  s.h".#include <t
0110: 63 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  cl.h>.#include <
0120: 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64  stdio.h>.#includ
0130: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e  e <string.h>.#in
0140: 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 65  clude <openssl/e
0150: 76 70 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  vp.h>.#include <
0160: 6f 70 65 6e 73 73 6c 2f 63 6d 61 63 2e 68 3e 0a  openssl/cmac.h>.
0170: 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73  #include <openss
0180: 6c 2f 68 6d 61 63 2e 68 3e 0a 0a 2f 2a 20 43 6f  l/hmac.h>../* Co
0190: 6e 73 74 61 6e 74 73 20 2a 2f 0a 63 6f 6e 73 74  nstants */.const
01a0: 20 63 68 61 72 20 2a 68 65 78 20 3d 20 22 30 31   char *hex = "01
01b0: 32 33 34 35 36 37 38 39 61 62 63 64 65 66 22 3b  23456789abcdef";
01c0: 0a 0a 2f 2a 20 4d 61 63 72 6f 73 20 2a 2f 0a 23  ../* Macros */.#
01d0: 64 65 66 69 6e 65 20 42 55 46 46 45 52 5f 53 49  define BUFFER_SI
01e0: 5a 45 09 36 35 35 33 36 0a 23 64 65 66 69 6e 65  ZE.65536.#define
01f0: 20 43 48 41 4e 5f 45 4f 46 09 30 78 31 30 0a 23   CHAN_EOF.0x10.#
0200: 64 65 66 69 6e 65 20 52 45 41 44 5f 44 45 4c 41  define READ_DELA
0210: 59 09 35 0a 0a 2f 2a 20 44 69 67 65 73 74 20 66  Y.5../* Digest f
0220: 6f 72 6d 61 74 20 61 6e 64 20 6f 70 65 72 61 74  ormat and operat
0230: 69 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 42  ion */.#define B
0240: 49 4e 5f 46 4f 52 4d 41 54 09 30 78 30 31 0a 23  IN_FORMAT.0x01.#
0250: 64 65 66 69 6e 65 20 48 45 58 5f 46 4f 52 4d 41  define HEX_FORMA
0260: 54 09 30 78 30 32 0a 23 64 65 66 69 6e 65 20 49  T.0x02.#define I
0270: 53 5f 58 4f 46 09 09 30 78 30 38 0a 23 64 65 66  S_XOF..0x08.#def
0280: 69 6e 65 20 54 59 50 45 5f 4d 44 09 09 30 78 31  ine TYPE_MD..0x1
0290: 30 0a 23 64 65 66 69 6e 65 20 54 59 50 45 5f 48  0.#define TYPE_H
02a0: 4d 41 43 09 30 78 32 30 0a 23 64 65 66 69 6e 65  MAC.0x20.#define
02b0: 20 54 59 50 45 5f 43 4d 41 43 09 30 78 34 30 0a   TYPE_CMAC.0x40.
02c0: 23 64 65 66 69 6e 65 20 54 59 50 45 5f 4d 41 43  #define TYPE_MAC
02d0: 09 30 78 38 30 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  .0x80../********
02e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
0320: 0a 20 2a 20 54 68 69 73 20 73 74 72 75 63 74 75  . * This structu
0330: 72 65 20 64 65 66 69 6e 65 73 20 74 68 65 20 70  re defines the p
0340: 65 72 2d 69 6e 73 74 61 6e 63 65 20 73 74 61 74  er-instance stat
0350: 65 20 6f 66 20 61 20 64 69 67 65 73 74 20 6f 70  e of a digest op
0360: 65 72 61 74 69 6f 6e 2e 0a 20 2a 2f 0a 74 79 70  eration.. */.typ
0370: 65 64 65 66 20 73 74 72 75 63 74 20 44 69 67 65  edef struct Dige
0380: 73 74 53 74 61 74 65 20 7b 0a 09 54 63 6c 5f 43  stState {..Tcl_C
0390: 68 61 6e 6e 65 6c 20 73 65 6c 66 3b 09 2f 2a 20  hannel self;./* 
03a0: 54 68 69 73 20 73 6f 63 6b 65 74 20 63 68 61 6e  This socket chan
03b0: 6e 65 6c 20 2a 2f 0a 09 54 63 6c 5f 54 69 6d 65  nel */..Tcl_Time
03c0: 72 54 6f 6b 65 6e 20 74 69 6d 65 72 3b 09 2f 2a  rToken timer;./*
03d0: 20 54 69 6d 65 72 20 66 6f 72 20 72 65 61 64 20   Timer for read 
03e0: 65 76 65 6e 74 73 20 2a 2f 0a 0a 09 69 6e 74 20  events */...int 
03f0: 66 6c 61 67 73 3b 09 09 2f 2a 20 43 68 61 6e 20  flags;../* Chan 
0400: 63 6f 6e 66 69 67 20 66 6c 61 67 73 20 2a 2f 0a  config flags */.
0410: 09 69 6e 74 20 77 61 74 63 68 4d 61 73 6b 3b 09  .int watchMask;.
0420: 09 2f 2a 20 43 75 72 72 65 6e 74 20 57 61 74 63  ./* Current Watc
0430: 68 50 72 6f 63 20 6d 61 73 6b 20 2a 2f 0a 09 69  hProc mask */..i
0440: 6e 74 20 6d 6f 64 65 3b 09 09 2f 2a 20 43 75 72  nt mode;../* Cur
0450: 72 65 6e 74 20 6d 6f 64 65 20 6f 66 20 70 61 72  rent mode of par
0460: 65 6e 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 09  ent channel */..
0470: 69 6e 74 20 66 6f 72 6d 61 74 3b 09 09 2f 2a 20  int format;../* 
0480: 44 69 67 65 73 74 20 66 6f 72 6d 61 74 20 61 6e  Digest format an
0490: 64 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a  d operation */..
04a0: 09 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  .Tcl_Interp *int
04b0: 65 72 70 3b 09 2f 2a 20 43 75 72 72 65 6e 74 20  erp;./* Current 
04c0: 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 09  interpreter */..
04d0: 45 56 50 5f 4d 44 5f 43 54 58 20 2a 63 74 78 3b  EVP_MD_CTX *ctx;
04e0: 09 2f 2a 20 4d 44 20 43 6f 6e 74 65 78 74 20 2a  ./* MD Context *
04f0: 2f 0a 09 48 4d 41 43 5f 43 54 58 20 2a 68 63 74  /..HMAC_CTX *hct
0500: 78 3b 09 09 2f 2a 20 48 4d 41 43 20 63 6f 6e 74  x;../* HMAC cont
0510: 65 78 74 20 2a 2f 0a 09 43 4d 41 43 5f 43 54 58  ext */..CMAC_CTX
0520: 20 2a 63 63 74 78 3b 09 09 2f 2a 20 43 4d 41 43   *cctx;../* CMAC
0530: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 54 63 6c   context */..Tcl
0540: 5f 43 6f 6d 6d 61 6e 64 20 74 6f 6b 65 6e 3b 09  _Command token;.
0550: 2f 2a 20 43 6f 6d 6d 61 6e 64 20 74 6f 6b 65 6e  /* Command token
0560: 20 2a 2f 0a 7d 20 44 69 67 65 73 74 53 74 61 74   */.} DigestStat
0570: 65 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  e;../*. *-------
0580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
05c0: 20 2a 20 44 69 67 65 73 74 53 74 61 74 65 4e 65   * DigestStateNe
05d0: 77 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  w --. *. *.This 
05e0: 66 75 6e 63 74 69 6f 6e 20 63 72 65 61 74 65 73  function creates
05f0: 20 61 20 70 65 72 2d 69 6e 73 74 61 6e 63 65 20   a per-instance 
0600: 73 74 61 74 65 20 64 61 74 61 20 73 74 72 75 63  state data struc
0610: 74 75 72 65 0a 20 2a 0a 20 2a 20 52 65 74 75 72  ture. *. * Retur
0620: 6e 73 3a 0a 20 2a 09 44 69 67 65 73 74 20 73 74  ns:. *.Digest st
0630: 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 72 0a  ructure pointer.
0640: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
0650: 74 73 3a 0a 20 2a 09 43 72 65 61 74 65 73 20 73  ts:. *.Creates s
0660: 74 72 75 63 74 75 72 65 0a 20 2a 0a 20 2a 2d 2d  tructure. *. *--
0670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06b0: 2d 0a 20 2a 2f 0a 44 69 67 65 73 74 53 74 61 74  -. */.DigestStat
06c0: 65 20 2a 44 69 67 65 73 74 53 74 61 74 65 4e 65  e *DigestStateNe
06d0: 77 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  w(Tcl_Interp *in
06e0: 74 65 72 70 2c 20 69 6e 74 20 66 6f 72 6d 61 74  terp, int format
06f0: 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74  ) {.    DigestSt
0700: 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 0a  ate *statePtr;..
0710: 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28      statePtr = (
0720: 44 69 67 65 73 74 53 74 61 74 65 20 2a 29 20 63  DigestState *) c
0730: 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64  kalloc((unsigned
0740: 29 20 73 69 7a 65 6f 66 28 44 69 67 65 73 74 53  ) sizeof(DigestS
0750: 74 61 74 65 29 29 3b 0a 20 20 20 20 69 66 20 28  tate));.    if (
0760: 73 74 61 74 65 50 74 72 20 21 3d 20 4e 55 4c 4c  statePtr != NULL
0770: 29 20 7b 0a 09 6d 65 6d 73 65 74 28 73 74 61 74  ) {..memset(stat
0780: 65 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ePtr, 0, sizeof(
0790: 44 69 67 65 73 74 53 74 61 74 65 29 29 3b 0a 09  DigestState));..
07a0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 09 3d  statePtr->self.=
07b0: 20 4e 55 4c 4c 3b 09 09 2f 2a 20 54 68 69 73 20   NULL;../* This 
07c0: 73 6f 63 6b 65 74 20 63 68 61 6e 6e 65 6c 20 2a  socket channel *
07d0: 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d  /..statePtr->tim
07e0: 65 72 20 3d 20 4e 55 4c 4c 3b 09 09 2f 2a 20 54  er = NULL;../* T
07f0: 69 6d 65 72 20 74 6f 20 66 6c 75 73 68 20 64 61  imer to flush da
0800: 74 61 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d  ta */..statePtr-
0810: 3e 66 6c 61 67 73 20 3d 20 30 3b 09 09 2f 2a 20  >flags = 0;../* 
0820: 43 68 61 6e 20 63 6f 6e 66 69 67 20 66 6c 61 67  Chan config flag
0830: 73 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e  s */..statePtr->
0840: 77 61 74 63 68 4d 61 73 6b 20 3d 20 30 3b 09 2f  watchMask = 0;./
0850: 2a 20 43 75 72 72 65 6e 74 20 57 61 74 63 68 50  * Current WatchP
0860: 72 6f 63 20 6d 61 73 6b 20 2a 2f 0a 09 73 74 61  roc mask */..sta
0870: 74 65 50 74 72 2d 3e 6d 6f 64 65 09 3d 20 30 3b  tePtr->mode.= 0;
0880: 09 09 2f 2a 20 43 75 72 72 65 6e 74 20 6d 6f 64  ../* Current mod
0890: 65 20 6f 66 20 70 61 72 65 6e 74 20 63 68 61 6e  e of parent chan
08a0: 6e 65 6c 20 2a 2f 0a 09 73 74 61 74 65 50 74 72  nel */..statePtr
08b0: 2d 3e 66 6f 72 6d 61 74 20 3d 20 66 6f 72 6d 61  ->format = forma
08c0: 74 3b 09 2f 2a 20 44 69 67 65 73 74 20 66 6f 72  t;./* Digest for
08d0: 6d 61 74 20 61 6e 64 20 6f 70 65 72 61 74 69 6f  mat and operatio
08e0: 6e 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e  n */..statePtr->
08f0: 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
0900: 09 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 65  ./* Current inte
0910: 72 70 72 65 74 65 72 20 2a 2f 0a 09 73 74 61 74  rpreter */..stat
0920: 65 50 74 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c  ePtr->ctx = NULL
0930: 3b 09 09 2f 2a 20 4d 44 20 43 6f 6e 74 65 78 74  ;../* MD Context
0940: 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 68   */..statePtr->h
0950: 63 74 78 20 3d 20 4e 55 4c 4c 3b 09 09 2f 2a 20  ctx = NULL;../* 
0960: 48 4d 41 43 20 43 6f 6e 74 65 78 74 20 2a 2f 0a  HMAC Context */.
0970: 09 73 74 61 74 65 50 74 72 2d 3e 63 63 74 78 20  .statePtr->cctx 
0980: 3d 20 4e 55 4c 4c 3b 09 09 2f 2a 20 43 4d 41 43  = NULL;../* CMAC
0990: 20 43 6f 6e 74 65 78 74 20 2a 2f 0a 09 73 74 61   Context */..sta
09a0: 74 65 50 74 72 2d 3e 74 6f 6b 65 6e 20 3d 20 4e  tePtr->token = N
09b0: 55 4c 4c 3b 09 09 2f 2a 20 43 6f 6d 6d 61 6e 64  ULL;../* Command
09c0: 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 7d 0a   token */.    }.
09d0: 20 20 20 20 72 65 74 75 72 6e 20 73 74 61 74 65      return state
09e0: 50 74 72 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  Ptr;.}../*. *---
09f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a10: 2d 2d 2d 2d 2d 2d 2d 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: 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 53 74 61  . *. * DigestSta
0a40: 74 65 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09  teFree --. *. *.
0a50: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65  This function de
0a60: 6c 65 74 65 73 20 61 20 64 69 67 65 73 74 20 73  letes a digest s
0a70: 74 61 74 65 20 73 74 72 75 63 74 75 72 65 0a 20  tate structure. 
0a80: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a  *. * Returns:. *
0a90: 09 4e 6f 74 68 69 6e 67 0a 20 2a 0a 20 2a 20 53  .Nothing. *. * S
0aa0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
0ab0: 52 65 6d 6f 76 65 73 20 73 74 72 75 63 74 75 72  Removes structur
0ac0: 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  e. *. *---------
0ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76  ----------. */.v
0b10: 6f 69 64 20 44 69 67 65 73 74 53 74 61 74 65 46  oid DigestStateF
0b20: 72 65 65 28 44 69 67 65 73 74 53 74 61 74 65 20  ree(DigestState 
0b30: 2a 73 74 61 74 65 50 74 72 29 20 7b 0a 20 20 20  *statePtr) {.   
0b40: 20 69 66 20 28 73 74 61 74 65 50 74 72 20 3d 3d   if (statePtr ==
0b50: 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 29   (DigestState *)
0b60: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
0b70: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
0b80: 52 65 6d 6f 76 65 20 70 65 6e 64 69 6e 67 20 74  Remove pending t
0b90: 69 6d 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 28  imer */.    if (
0ba0: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20  statePtr->timer 
0bb0: 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b  != (Tcl_TimerTok
0bc0: 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c  en) NULL) {..Tcl
0bd0: 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64  _DeleteTimerHand
0be0: 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69  ler(statePtr->ti
0bf0: 6d 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  mer);.    }..   
0c00: 20 2f 2a 20 46 72 65 65 20 63 6f 6e 74 65 78 74   /* Free context
0c10: 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20   structures */. 
0c20: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
0c30: 3e 63 74 78 20 21 3d 20 28 45 56 50 5f 4d 44 5f  >ctx != (EVP_MD_
0c40: 43 54 58 20 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09  CTX *) NULL) {..
0c50: 45 56 50 5f 4d 44 5f 43 54 58 5f 66 72 65 65 28  EVP_MD_CTX_free(
0c60: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a  statePtr->ctx);.
0c70: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74      }.    if (st
0c80: 61 74 65 50 74 72 2d 3e 68 63 74 78 20 21 3d 20  atePtr->hctx != 
0c90: 28 48 4d 41 43 5f 43 54 58 20 2a 29 20 4e 55 4c  (HMAC_CTX *) NUL
0ca0: 4c 29 20 7b 0a 09 48 4d 41 43 5f 43 54 58 5f 66  L) {..HMAC_CTX_f
0cb0: 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 68 63  ree(statePtr->hc
0cc0: 74 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  tx);.    }.    i
0cd0: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 63 74  f (statePtr->cct
0ce0: 78 20 21 3d 20 28 43 4d 41 43 5f 43 54 58 20 2a  x != (CMAC_CTX *
0cf0: 29 20 4e 55 4c 4c 29 20 7b 0a 09 43 4d 41 43 5f  ) NULL) {..CMAC_
0d00: 43 54 58 5f 66 72 65 65 28 73 74 61 74 65 50 74  CTX_free(statePt
0d10: 72 2d 3e 63 63 74 78 29 3b 0a 20 20 20 20 7d 0a  r->cctx);.    }.
0d20: 20 20 20 20 63 6b 66 72 65 65 28 73 74 61 74 65      ckfree(state
0d30: 50 74 72 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a  Ptr);.}../******
0d40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0d50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0d60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0d70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
0d80: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
0d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0dc0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44  --------. *. * D
0dd0: 69 67 65 73 74 49 6e 69 74 69 61 6c 69 7a 65 20  igestInitialize 
0de0: 2d 2d 0a 20 2a 0a 20 2a 09 49 6e 69 74 69 61 6c  --. *. *.Initial
0df0: 69 7a 65 20 61 20 68 61 73 68 20 66 75 6e 63 74  ize a hash funct
0e00: 69 6f 6e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  ion. *. * Return
0e10: 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 69 66 20  s:. *.TCL_OK if 
0e20: 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 54 43  successful or TC
0e30: 4c 5f 45 52 52 4f 52 20 66 6f 72 20 66 61 69 6c  L_ERROR for fail
0e40: 75 72 65 20 77 69 74 68 20 72 65 73 75 6c 74 20  ure with result 
0e50: 73 65 74 0a 20 2a 09 74 6f 20 65 72 72 6f 72 20  set. *.to error 
0e60: 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 20 53  message.. *. * S
0e70: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
0e80: 4e 6f 20 72 65 73 75 6c 74 20 6f 72 20 65 72 72  No result or err
0e90: 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a  or message. *. *
0ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ee0: 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65  ---. */.int Dige
0ef0: 73 74 49 6e 69 74 69 61 6c 69 7a 65 28 54 63 6c  stInitialize(Tcl
0f00: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
0f10: 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74   DigestState *st
0f20: 61 74 65 50 74 72 2c 20 54 63 6c 5f 4f 62 6a 20  atePtr, Tcl_Obj 
0f30: 2a 64 69 67 65 73 74 4f 62 6a 2c 0a 09 54 63 6c  *digestObj,..Tcl
0f40: 5f 4f 62 6a 20 2a 63 69 70 68 65 72 4f 62 6a 2c  _Obj *cipherObj,
0f50: 20 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4f 62 6a   Tcl_Obj *keyObj
0f60: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6d 61 63 4f 62  , Tcl_Obj *macOb
0f70: 6a 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 65 73  j) {.    int res
0f80: 20 3d 20 30 2c 20 74 79 70 65 20 3d 20 73 74 61   = 0, type = sta
0f90: 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20  tePtr->format & 
0fa0: 30 78 46 46 30 3b 0a 20 20 20 20 63 6f 6e 73 74  0xFF0;.    const
0fb0: 20 45 56 50 5f 4d 44 20 2a 6d 64 20 3d 20 4e 55   EVP_MD *md = NU
0fc0: 4c 4c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45 56  LL;.    const EV
0fd0: 50 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65 72  P_CIPHER *cipher
0fe0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 6f 6e   = NULL;.    con
0ff0: 73 74 20 76 6f 69 64 20 2a 6b 65 79 20 3d 20 4e  st void *key = N
1000: 55 4c 4c 2c 20 2a 69 76 20 3d 20 4e 55 4c 4c 2c  ULL, *iv = NULL,
1010: 20 2a 73 61 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 20   *salt = NULL;. 
1020: 20 20 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 20 3d     int key_len =
1030: 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66   0;..    dprintf
1040: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
1050: 20 2f 2a 20 47 65 74 20 64 69 67 65 73 74 20 2a   /* Get digest *
1060: 2f 0a 20 20 20 20 6d 64 20 3d 20 55 74 69 6c 5f  /.    md = Util_
1070: 47 65 74 44 69 67 65 73 74 28 69 6e 74 65 72 70  GetDigest(interp
1080: 2c 20 64 69 67 65 73 74 4f 62 6a 2c 20 74 79 70  , digestObj, typ
1090: 65 20 21 3d 20 54 59 50 45 5f 43 4d 41 43 29 3b  e != TYPE_CMAC);
10a0: 0a 20 20 20 20 69 66 20 28 6d 64 20 3d 3d 20 4e  .    if (md == N
10b0: 55 4c 4c 20 26 26 20 74 79 70 65 20 21 3d 20 54  ULL && type != T
10c0: 59 50 45 5f 43 4d 41 43 29 20 7b 0a 09 72 65 74  YPE_CMAC) {..ret
10d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10e0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74     }..    /* Get
10f0: 20 63 69 70 68 65 72 20 2a 2f 0a 20 20 20 20 63   cipher */.    c
1100: 69 70 68 65 72 20 3d 20 55 74 69 6c 5f 47 65 74  ipher = Util_Get
1110: 43 69 70 68 65 72 28 69 6e 74 65 72 70 2c 20 63  Cipher(interp, c
1120: 69 70 68 65 72 4f 62 6a 2c 20 74 79 70 65 20 3d  ipherObj, type =
1130: 3d 20 54 59 50 45 5f 43 4d 41 43 29 3b 0a 20 20  = TYPE_CMAC);.  
1140: 20 20 69 66 20 28 63 69 70 68 65 72 20 3d 3d 20    if (cipher == 
1150: 4e 55 4c 4c 20 26 26 20 74 79 70 65 20 3d 3d 20  NULL && type == 
1160: 54 59 50 45 5f 43 4d 41 43 29 20 7b 0a 09 72 65  TYPE_CMAC) {..re
1170: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1180: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
1190: 74 20 6b 65 79 20 2a 2f 0a 20 20 20 20 6b 65 79  t key */.    key
11a0: 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a   = (const void *
11b0: 29 20 55 74 69 6c 5f 47 65 74 4b 65 79 28 69 6e  ) Util_GetKey(in
11c0: 74 65 72 70 2c 20 6b 65 79 4f 62 6a 2c 20 26 6b  terp, keyObj, &k
11d0: 65 79 5f 6c 65 6e 2c 20 22 6b 65 79 22 2c 20 30  ey_len, "key", 0
11e0: 2c 20 74 79 70 65 20 21 3d 20 54 59 50 45 5f 4d  , type != TYPE_M
11f0: 44 29 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 20  D);.    if (key 
1200: 3d 3d 20 4e 55 4c 4c 20 26 26 20 74 79 70 65 20  == NULL && type 
1210: 21 3d 20 54 59 50 45 5f 4d 44 29 20 7b 0a 09 72  != TYPE_MD) {..r
1220: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1230: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
1240: 72 65 61 74 65 20 63 6f 6e 74 65 78 74 73 20 2a  reate contexts *
1250: 2f 0a 20 20 20 20 73 77 69 74 63 68 28 74 79 70  /.    switch(typ
1260: 65 29 20 7b 0a 20 20 20 20 63 61 73 65 20 54 59  e) {.    case TY
1270: 50 45 5f 4d 44 3a 0a 09 73 74 61 74 65 50 74 72  PE_MD:..statePtr
1280: 2d 3e 63 74 78 20 3d 20 45 56 50 5f 4d 44 5f 43  ->ctx = EVP_MD_C
1290: 54 58 5f 6e 65 77 28 29 3b 0a 09 72 65 73 20 3d  TX_new();..res =
12a0: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20   (statePtr->ctx 
12b0: 21 3d 20 4e 55 4c 4c 29 3b 0a 09 62 72 65 61 6b  != NULL);..break
12c0: 3b 0a 20 20 20 20 63 61 73 65 20 54 59 50 45 5f  ;.    case TYPE_
12d0: 48 4d 41 43 3a 0a 09 73 74 61 74 65 50 74 72 2d  HMAC:..statePtr-
12e0: 3e 68 63 74 78 20 3d 20 48 4d 41 43 5f 43 54 58  >hctx = HMAC_CTX
12f0: 5f 6e 65 77 28 29 3b 0a 09 72 65 73 20 3d 20 28  _new();..res = (
1300: 73 74 61 74 65 50 74 72 2d 3e 68 63 74 78 20 21  statePtr->hctx !
1310: 3d 20 4e 55 4c 4c 29 3b 0a 09 62 72 65 61 6b 3b  = NULL);..break;
1320: 0a 20 20 20 20 63 61 73 65 20 54 59 50 45 5f 43  .    case TYPE_C
1330: 4d 41 43 3a 0a 09 73 74 61 74 65 50 74 72 2d 3e  MAC:..statePtr->
1340: 63 63 74 78 20 3d 20 43 4d 41 43 5f 43 54 58 5f  cctx = CMAC_CTX_
1350: 6e 65 77 28 29 3b 0a 09 72 65 73 20 3d 20 28 73  new();..res = (s
1360: 74 61 74 65 50 74 72 2d 3e 63 63 74 78 20 21 3d  tatePtr->cctx !=
1370: 20 4e 55 4c 4c 29 3b 0a 09 62 72 65 61 6b 3b 0a   NULL);..break;.
1380: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 21      }..    if (!
1390: 72 65 73 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  res) {..Tcl_Appe
13a0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
13b0: 20 22 43 72 65 61 74 65 20 63 6f 6e 74 65 78 74   "Create context
13c0: 20 66 61 69 6c 65 64 22 2c 20 4e 55 4c 4c 29 3b   failed", NULL);
13d0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
13e0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
13f0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 63 72 79  * Initialize cry
1400: 70 74 6f 67 72 61 70 68 79 20 66 75 6e 63 74 69  ptography functi
1410: 6f 6e 20 2a 2f 0a 20 20 20 20 73 77 69 74 63 68  on */.    switch
1420: 28 74 79 70 65 29 20 7b 0a 20 20 20 20 63 61 73  (type) {.    cas
1430: 65 20 54 59 50 45 5f 4d 44 3a 0a 09 72 65 73 20  e TYPE_MD:..res 
1440: 3d 20 45 56 50 5f 44 69 67 65 73 74 49 6e 69 74  = EVP_DigestInit
1450: 5f 65 78 28 73 74 61 74 65 50 74 72 2d 3e 63 74  _ex(statePtr->ct
1460: 78 2c 20 6d 64 2c 20 4e 55 4c 4c 29 3b 0a 09 62  x, md, NULL);..b
1470: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1480: 59 50 45 5f 48 4d 41 43 3a 0a 09 72 65 73 20 3d  YPE_HMAC:..res =
1490: 20 48 4d 41 43 5f 49 6e 69 74 5f 65 78 28 73 74   HMAC_Init_ex(st
14a0: 61 74 65 50 74 72 2d 3e 68 63 74 78 2c 20 6b 65  atePtr->hctx, ke
14b0: 79 2c 20 6b 65 79 5f 6c 65 6e 2c 20 6d 64 2c 20  y, key_len, md, 
14c0: 4e 55 4c 4c 29 3b 0a 09 62 72 65 61 6b 3b 0a 20  NULL);..break;. 
14d0: 20 20 20 63 61 73 65 20 54 59 50 45 5f 43 4d 41     case TYPE_CMA
14e0: 43 3a 0a 09 72 65 73 20 3d 20 43 4d 41 43 5f 49  C:..res = CMAC_I
14f0: 6e 69 74 28 73 74 61 74 65 50 74 72 2d 3e 63 63  nit(statePtr->cc
1500: 74 78 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e  tx, key, key_len
1510: 2c 20 63 69 70 68 65 72 2c 20 4e 55 4c 4c 29 3b  , cipher, NULL);
1520: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a  ..break;.    }..
1530: 20 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 0a      if (!res) {.
1540: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
1550: 74 28 69 6e 74 65 72 70 2c 20 22 49 6e 69 74 69  t(interp, "Initi
1560: 61 6c 69 7a 65 20 66 61 69 6c 65 64 3a 20 22 2c  alize failed: ",
1570: 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29   REASON(), NULL)
1580: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
1590: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ROR;.    }.    r
15a0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
15b0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
15c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
1600: 44 69 67 65 73 74 55 70 64 61 74 65 20 2d 2d 0a  DigestUpdate --.
1610: 20 2a 0a 20 2a 09 55 70 64 61 74 65 20 61 20 68   *. *.Update a h
1620: 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  ash function wit
1630: 68 20 64 61 74 61 0a 20 2a 0a 20 2a 20 52 65 74  h data. *. * Ret
1640: 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20  urns:. *.TCL_OK 
1650: 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72  if successful or
1660: 20 54 43 4c 5f 45 52 52 4f 52 20 66 6f 72 20 66   TCL_ERROR for f
1670: 61 69 6c 75 72 65 20 77 69 74 68 20 72 65 73 75  ailure with resu
1680: 6c 74 20 73 65 74 0a 20 2a 09 74 6f 20 65 72 72  lt set. *.to err
1690: 6f 72 20 6d 65 73 73 61 67 65 20 69 66 20 64 6f  or message if do
16a0: 5f 72 65 73 75 6c 74 20 69 73 20 74 72 75 65 2e  _result is true.
16b0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
16c0: 63 74 73 3a 0a 20 2a 09 41 64 64 73 20 62 75 66  cts:. *.Adds buf
16d0: 20 64 61 74 61 20 74 6f 20 68 61 73 68 20 66 75   data to hash fu
16e0: 6e 63 74 69 6f 6e 20 6f 72 20 73 65 74 73 20 72  nction or sets r
16f0: 65 73 75 6c 74 20 74 6f 20 65 72 72 6f 72 20 6d  esult to error m
1700: 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d  essage. *. *----
1710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1750: 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 55 70   */.int DigestUp
1760: 64 61 74 65 28 44 69 67 65 73 74 53 74 61 74 65  date(DigestState
1770: 20 2a 73 74 61 74 65 50 74 72 2c 20 63 68 61 72   *statePtr, char
1780: 20 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20 72 65   *buf, size_t re
1790: 61 64 2c 20 69 6e 74 20 64 6f 5f 72 65 73 75 6c  ad, int do_resul
17a0: 74 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 65 73  t) {.    int res
17b0: 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e   = 0;..    dprin
17c0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
17d0: 20 20 20 73 77 69 74 63 68 28 73 74 61 74 65 50     switch(stateP
17e0: 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20 30 78 46  tr->format & 0xF
17f0: 46 30 29 20 7b 0a 20 20 20 20 63 61 73 65 20 54  F0) {.    case T
1800: 59 50 45 5f 4d 44 3a 0a 20 20 20 20 20 20 20 20  YPE_MD:.        
1810: 72 65 73 20 3d 20 45 56 50 5f 44 69 67 65 73 74  res = EVP_Digest
1820: 55 70 64 61 74 65 28 73 74 61 74 65 50 74 72 2d  Update(statePtr-
1830: 3e 63 74 78 2c 20 62 75 66 2c 20 72 65 61 64 29  >ctx, buf, read)
1840: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;..break;.    ca
1850: 73 65 20 54 59 50 45 5f 48 4d 41 43 3a 0a 20 20  se TYPE_HMAC:.  
1860: 20 20 20 20 20 20 72 65 73 20 3d 20 48 4d 41 43        res = HMAC
1870: 5f 55 70 64 61 74 65 28 73 74 61 74 65 50 74 72  _Update(statePtr
1880: 2d 3e 68 63 74 78 2c 20 62 75 66 2c 20 72 65 61  ->hctx, buf, rea
1890: 64 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  d);..break;.    
18a0: 63 61 73 65 20 54 59 50 45 5f 43 4d 41 43 3a 0a  case TYPE_CMAC:.
18b0: 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 43 4d          res = CM
18c0: 41 43 5f 55 70 64 61 74 65 28 73 74 61 74 65 50  AC_Update(stateP
18d0: 74 72 2d 3e 63 63 74 78 2c 20 62 75 66 2c 20 72  tr->cctx, buf, r
18e0: 65 61 64 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20  ead);..break;.  
18f0: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 21 72 65    }..    if (!re
1900: 73 20 26 26 20 64 6f 5f 72 65 73 75 6c 74 29 20  s && do_result) 
1910: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
1920: 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 69 6e  ult(statePtr->in
1930: 74 65 72 70 2c 20 22 55 70 64 61 74 65 20 66 61  terp, "Update fa
1940: 69 6c 65 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28  iled: ", REASON(
1950: 29 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  ), NULL);..retur
1960: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
1970: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43   }.    return TC
1980: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d  L_OK;.}../*. *--
1990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19d0: 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 46 69  -. *. * DigestFi
19e0: 6e 61 6c 69 7a 65 20 2d 2d 0a 20 2a 0a 20 2a 09  nalize --. *. *.
19f0: 46 69 6e 61 6c 69 7a 65 20 61 20 68 61 73 68 20  Finalize a hash 
1a00: 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 72 65 74  function and ret
1a10: 75 72 6e 20 74 68 65 20 6d 65 73 73 61 67 65 20  urn the message 
1a20: 64 69 67 65 73 74 0a 20 2a 0a 20 2a 20 52 65 74  digest. *. * Ret
1a30: 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20  urns:. *.TCL_OK 
1a40: 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72  if successful or
1a50: 20 54 43 4c 5f 45 52 52 4f 52 20 66 6f 72 20 66   TCL_ERROR for f
1a60: 61 69 6c 75 72 65 20 77 69 74 68 20 72 65 73 75  ailure with resu
1a70: 6c 74 20 73 65 74 0a 20 2a 09 74 6f 20 65 72 72  lt set. *.to err
1a80: 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20  or message.. *. 
1a90: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
1aa0: 20 2a 09 53 65 74 73 20 72 65 73 75 6c 74 20 74   *.Sets result t
1ab0: 6f 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74  o message digest
1ac0: 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 6d 65 73   or an error mes
1ad0: 73 61 67 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  sage.. *. *-----
1ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
1b20: 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 46 69 6e  */.int DigestFin
1b30: 61 6c 69 7a 65 28 54 63 6c 5f 49 6e 74 65 72 70  alize(Tcl_Interp
1b40: 20 2a 69 6e 74 65 72 70 2c 20 44 69 67 65 73 74   *interp, Digest
1b50: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c  State *statePtr,
1b60: 20 54 63 6c 5f 4f 62 6a 20 2a 2a 72 65 73 75 6c   Tcl_Obj **resul
1b70: 74 4f 62 6a 29 20 7b 0a 20 20 20 20 75 6e 73 69  tObj) {.    unsi
1b80: 67 6e 65 64 20 63 68 61 72 20 6d 64 5f 62 75 66  gned char md_buf
1b90: 5b 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45  [EVP_MAX_MD_SIZE
1ba0: 5d 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  ];.    unsigned 
1bb0: 69 6e 74 20 75 6c 65 6e 3b 0a 20 20 20 20 69 6e  int ulen;.    in
1bc0: 74 20 72 65 73 20 3d 20 30 2c 20 6d 64 5f 6c 65  t res = 0, md_le
1bd0: 6e 20 3d 20 30 2c 20 74 79 70 65 20 3d 20 73 74  n = 0, type = st
1be0: 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26  atePtr->format &
1bf0: 20 30 78 46 46 30 3b 0a 0a 20 20 20 20 64 70 72   0xFF0;..    dpr
1c00: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
1c10: 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65  .    /* Finalize
1c20: 20 63 72 79 70 74 6f 67 72 61 70 68 79 20 66 75   cryptography fu
1c30: 6e 63 74 69 6f 6e 20 61 6e 64 20 67 65 74 20 72  nction and get r
1c40: 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 73 77 69  esult */.    swi
1c50: 74 63 68 28 74 79 70 65 29 20 7b 0a 20 20 20 20  tch(type) {.    
1c60: 63 61 73 65 20 54 59 50 45 5f 4d 44 3a 0a 09 69  case TYPE_MD:..i
1c70: 66 20 28 21 28 73 74 61 74 65 50 74 72 2d 3e 66  f (!(statePtr->f
1c80: 6f 72 6d 61 74 20 26 20 49 53 5f 58 4f 46 29 29  ormat & IS_XOF))
1c90: 20 7b 0a 09 20 20 20 20 72 65 73 20 3d 20 45 56   {..    res = EV
1ca0: 50 5f 44 69 67 65 73 74 46 69 6e 61 6c 5f 65 78  P_DigestFinal_ex
1cb0: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
1cc0: 6d 64 5f 62 75 66 2c 20 26 75 6c 65 6e 29 3b 0a  md_buf, &ulen);.
1cd0: 09 20 20 20 20 6d 64 5f 6c 65 6e 20 3d 20 28 69  .    md_len = (i
1ce0: 6e 74 29 20 75 6c 65 6e 3b 0a 09 7d 20 65 6c 73  nt) ulen;..} els
1cf0: 65 20 7b 0a 09 20 20 20 20 72 65 73 20 3d 20 45  e {..    res = E
1d00: 56 50 5f 44 69 67 65 73 74 46 69 6e 61 6c 58 4f  VP_DigestFinalXO
1d10: 46 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c  F(statePtr->ctx,
1d20: 20 6d 64 5f 62 75 66 2c 20 28 73 69 7a 65 5f 74   md_buf, (size_t
1d30: 29 20 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a  ) EVP_MAX_MD_SIZ
1d40: 45 29 3b 0a 09 20 20 20 20 6d 64 5f 6c 65 6e 20  E);..    md_len 
1d50: 3d 20 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a  = EVP_MAX_MD_SIZ
1d60: 45 3b 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20  E;..}..break;.  
1d70: 20 20 63 61 73 65 20 54 59 50 45 5f 48 4d 41 43    case TYPE_HMAC
1d80: 3a 0a 09 72 65 73 20 3d 20 48 4d 41 43 5f 46 69  :..res = HMAC_Fi
1d90: 6e 61 6c 28 73 74 61 74 65 50 74 72 2d 3e 68 63  nal(statePtr->hc
1da0: 74 78 2c 20 6d 64 5f 62 75 66 2c 20 26 75 6c 65  tx, md_buf, &ule
1db0: 6e 29 3b 0a 09 6d 64 5f 6c 65 6e 20 3d 20 28 69  n);..md_len = (i
1dc0: 6e 74 29 20 75 6c 65 6e 3b 0a 09 62 72 65 61 6b  nt) ulen;..break
1dd0: 3b 0a 20 20 20 20 63 61 73 65 20 54 59 50 45 5f  ;.    case TYPE_
1de0: 43 4d 41 43 3a 0a 09 73 69 7a 65 5f 74 20 73 69  CMAC:..size_t si
1df0: 7a 65 3b 0a 09 72 65 73 20 3d 20 43 4d 41 43 5f  ze;..res = CMAC_
1e00: 46 69 6e 61 6c 28 73 74 61 74 65 50 74 72 2d 3e  Final(statePtr->
1e10: 63 63 74 78 2c 20 6d 64 5f 62 75 66 2c 20 26 73  cctx, md_buf, &s
1e20: 69 7a 65 29 3b 0a 09 6d 64 5f 6c 65 6e 20 3d 20  ize);..md_len = 
1e30: 28 69 6e 74 29 20 73 69 7a 65 3b 0a 09 62 72 65  (int) size;..bre
1e40: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ak;.    }..    i
1e50: 66 20 28 21 72 65 73 29 20 7b 0a 09 69 66 20 28  f (!res) {..if (
1e60: 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c  resultObj == NUL
1e70: 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70  L) {..    Tcl_Ap
1e80: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1e90: 70 2c 20 22 46 69 6e 61 6c 69 7a 65 20 66 61 69  p, "Finalize fai
1ea0: 6c 65 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29  led: ", REASON()
1eb0: 2c 20 4e 55 4c 4c 29 3b 0a 09 7d 0a 09 72 65 74  , NULL);..}..ret
1ec0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1ed0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 74     }..    /* Ret
1ee0: 75 72 6e 20 6d 65 73 73 61 67 65 20 64 69 67 65  urn message dige
1ef0: 73 74 20 61 73 20 65 69 74 68 65 72 20 61 20 62  st as either a b
1f00: 69 6e 61 72 79 20 6f 72 20 68 65 78 20 73 74 72  inary or hex str
1f10: 69 6e 67 20 2a 2f 0a 20 20 20 20 69 66 20 28 73  ing */.    if (s
1f20: 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20  tatePtr->format 
1f30: 26 20 42 49 4e 5f 46 4f 52 4d 41 54 29 20 7b 0a  & BIN_FORMAT) {.
1f40: 09 69 66 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d  .if (resultObj =
1f50: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54  = NULL) {..    T
1f60: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1f70: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
1f80: 79 74 65 41 72 72 61 79 4f 62 6a 28 6d 64 5f 62  yteArrayObj(md_b
1f90: 75 66 2c 20 6d 64 5f 6c 65 6e 29 29 3b 0a 09 7d  uf, md_len));..}
1fa0: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 2a 72 65   else {..    *re
1fb0: 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65  sultObj = Tcl_Ne
1fc0: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 6d 64  wByteArrayObj(md
1fd0: 5f 62 75 66 2c 20 6d 64 5f 6c 65 6e 29 3b 0a 09  _buf, md_len);..
1fe0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
1ff0: 6f 75 6e 74 28 2a 72 65 73 75 6c 74 4f 62 6a 29  ount(*resultObj)
2000: 3b 0a 09 7d 0a 0a 20 20 20 20 7d 20 65 6c 73 65  ;..}..    } else
2010: 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6e 65 77   {..Tcl_Obj *new
2020: 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  Obj = Tcl_NewObj
2030: 28 29 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  ();..unsigned ch
2040: 61 72 20 2a 70 74 72 20 3d 20 54 63 6c 5f 53 65  ar *ptr = Tcl_Se
2050: 74 42 79 74 65 41 72 72 61 79 4c 65 6e 67 74 68  tByteArrayLength
2060: 28 6e 65 77 4f 62 6a 2c 20 6d 64 5f 6c 65 6e 2a  (newObj, md_len*
2070: 32 29 3b 0a 0a 09 66 6f 72 20 28 69 6e 74 20 69  2);...for (int i
2080: 20 3d 20 30 3b 20 69 20 3c 20 6d 64 5f 6c 65 6e   = 0; i < md_len
2090: 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 2a 70  ; i++) {..    *p
20a0: 74 72 2b 2b 20 3d 20 68 65 78 5b 28 6d 64 5f 62  tr++ = hex[(md_b
20b0: 75 66 5b 69 5d 20 3e 3e 20 34 29 20 26 20 30 78  uf[i] >> 4) & 0x
20c0: 30 46 5d 3b 0a 09 20 20 20 20 2a 70 74 72 2b 2b  0F];..    *ptr++
20d0: 20 3d 20 68 65 78 5b 6d 64 5f 62 75 66 5b 69 5d   = hex[md_buf[i]
20e0: 20 26 20 30 78 30 46 5d 3b 0a 09 7d 0a 0a 09 69   & 0x0F];..}...i
20f0: 66 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20  f (resultObj == 
2100: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c  NULL) {..    Tcl
2110: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
2120: 74 65 72 70 2c 20 6e 65 77 4f 62 6a 29 3b 0a 09  terp, newObj);..
2130: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 2a 72  } else {..    *r
2140: 65 73 75 6c 74 4f 62 6a 20 3d 20 6e 65 77 4f 62  esultObj = newOb
2150: 6a 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72  j;..    Tcl_Incr
2160: 52 65 66 43 6f 75 6e 74 28 2a 72 65 73 75 6c 74  RefCount(*result
2170: 4f 62 6a 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20  Obj);..}.    }. 
2180: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
2190: 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../**********
21a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20  *********/../*. 
21e0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
21f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2220: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73  ----. *. * Diges
2230: 74 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 2d  tBlockModeProc -
2240: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e  -. *. *.This fun
2250: 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64  ction is invoked
2260: 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20   by the generic 
2270: 49 4f 20 6c 65 76 65 6c 0a 20 2a 09 74 6f 20 73  IO level. *.to s
2280: 65 74 20 62 6c 6f 63 6b 69 6e 67 20 61 6e 64 20  et blocking and 
2290: 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  nonblocking mode
22a0: 73 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73  s.. *. * Returns
22b0: 3a 0a 20 2a 09 30 20 69 66 20 73 75 63 63 65 73  :. *.0 if succes
22c0: 73 66 75 6c 20 6f 72 20 50 4f 53 49 58 20 65 72  sful or POSIX er
22d0: 72 6f 72 20 63 6f 64 65 20 69 66 20 66 61 69 6c  ror code if fail
22e0: 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ed.. *. * Side e
22f0: 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20  ffects:. *.Sets 
2300: 74 68 65 20 64 65 76 69 63 65 20 69 6e 74 6f 20  the device into 
2310: 62 6c 6f 63 6b 69 6e 67 20 6f 72 20 6e 6f 6e 62  blocking or nonb
2320: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 2a  locking mode.. *
2330: 09 43 61 6e 20 63 61 6c 6c 20 54 63 6c 5f 53 65  .Can call Tcl_Se
2340: 74 43 68 61 6e 6e 65 6c 45 72 72 6f 72 2e 0a 20  tChannelError.. 
2350: 2a 0a 20 2a 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 2d 2d 2d 2d  ----------------
2370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2390: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
23a0: 69 63 20 69 6e 74 20 44 69 67 65 73 74 42 6c 6f  ic int DigestBlo
23b0: 63 6b 4d 6f 64 65 50 72 6f 63 28 43 6c 69 65 6e  ckModeProc(Clien
23c0: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
23d0: 2c 20 69 6e 74 20 6d 6f 64 65 29 20 7b 0a 20 20  , int mode) {.  
23e0: 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73    DigestState *s
23f0: 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 73  tatePtr = (Diges
2400: 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74  tState *) client
2410: 44 61 74 61 3b 0a 0a 20 20 20 20 69 66 20 28 6d  Data;..    if (m
2420: 6f 64 65 20 3d 3d 20 54 43 4c 5f 4d 4f 44 45 5f  ode == TCL_MODE_
2430: 4e 4f 4e 42 4c 4f 43 4b 49 4e 47 29 20 7b 0a 09  NONBLOCKING) {..
2440: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20  statePtr->flags 
2450: 7c 3d 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43  |= TLS_TCL_ASYNC
2460: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
2470: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20  statePtr->flags 
2480: 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 41 53 59  &= ~(TLS_TCL_ASY
2490: 4e 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  NC);.    }.    r
24a0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20  eturn 0;.}../*. 
24b0: 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24f0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73  ----. *. * Diges
2500: 74 43 6c 6f 73 65 50 72 6f 63 20 2d 2d 0a 20 2a  tCloseProc --. *
2510: 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f  . *.This functio
2520: 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20  n is invoked by 
2530: 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c  the generic IO l
2540: 65 76 65 6c 20 74 6f 20 70 65 72 66 6f 72 6d 0a  evel to perform.
2550: 20 2a 09 63 68 61 6e 6e 65 6c 2d 74 79 70 65 20   *.channel-type 
2560: 73 70 65 63 69 66 69 63 20 63 6c 65 61 6e 75 70  specific cleanup
2570: 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e 6e 65   when the channe
2580: 6c 20 69 73 20 63 6c 6f 73 65 64 2e 20 41 6c 6c  l is closed. All
2590: 0a 20 2a 09 71 75 65 75 65 64 20 6f 75 74 70 75  . *.queued outpu
25a0: 74 20 69 73 20 66 6c 75 73 68 65 64 20 70 72 69  t is flushed pri
25b0: 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
25c0: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 0a  is function.. *.
25d0: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 30   * Returns:. *.0
25e0: 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f   if successful o
25f0: 72 20 50 4f 53 49 58 20 65 72 72 6f 72 20 63 6f  r POSIX error co
2600: 64 65 20 69 66 20 66 61 69 6c 65 64 2e 0a 20 2a  de if failed.. *
2610: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
2620: 3a 0a 20 2a 09 44 65 6c 65 74 65 73 20 73 74 6f  :. *.Deletes sto
2630: 72 65 64 20 73 74 61 74 65 20 64 61 74 61 2e 0a  red state data..
2640: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
2650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2680: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74  --------. */.int
2690: 20 44 69 67 65 73 74 43 6c 6f 73 65 50 72 6f 63   DigestCloseProc
26a0: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
26b0: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ntData, Tcl_Inte
26c0: 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20  rp *interp) {.  
26d0: 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73    DigestState *s
26e0: 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 73  tatePtr = (Diges
26f0: 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74  tState *) client
2700: 44 61 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 43 61  Data;..    /* Ca
2710: 6e 63 65 6c 20 61 63 74 69 76 65 20 74 69 6d 65  ncel active time
2720: 72 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 20  r, if any */.   
2730: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74   if (statePtr->t
2740: 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d  imer != (Tcl_Tim
2750: 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b  erToken) NULL) {
2760: 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65  ..Tcl_DeleteTime
2770: 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74  rHandler(statePt
2780: 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74  r->timer);..stat
2790: 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54  ePtr->timer = (T
27a0: 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e  cl_TimerToken) N
27b0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ULL;.    }..    
27c0: 2f 2a 20 4f 75 74 70 75 74 20 6d 65 73 73 61 67  /* Output messag
27d0: 65 20 64 69 67 65 73 74 20 69 66 20 6e 6f 74 20  e digest if not 
27e0: 61 6c 72 65 61 64 79 20 64 6f 6e 65 20 2a 2f 0a  already done */.
27f0: 20 20 20 20 69 66 20 28 21 28 73 74 61 74 65 50      if (!(stateP
2800: 74 72 2d 3e 66 6c 61 67 73 20 26 20 43 48 41 4e  tr->flags & CHAN
2810: 5f 45 4f 46 29 29 20 7b 0a 09 54 63 6c 5f 43 68  _EOF)) {..Tcl_Ch
2820: 61 6e 6e 65 6c 20 70 61 72 65 6e 74 20 3d 20 54  annel parent = T
2830: 63 6c 5f 47 65 74 53 74 61 63 6b 65 64 43 68 61  cl_GetStackedCha
2840: 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73  nnel(statePtr->s
2850: 65 6c 66 29 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a  elf);..Tcl_Obj *
2860: 72 65 73 75 6c 74 4f 62 6a 3b 0a 09 69 6e 74 20  resultObj;..int 
2870: 77 72 69 74 74 65 6e 3b 0a 0a 09 69 66 20 28 44  written;...if (D
2880: 69 67 65 73 74 46 69 6e 61 6c 69 7a 65 28 73 74  igestFinalize(st
2890: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20  atePtr->interp, 
28a0: 73 74 61 74 65 50 74 72 2c 20 26 72 65 73 75 6c  statePtr, &resul
28b0: 74 4f 62 6a 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29  tObj) == TCL_OK)
28c0: 20 7b 0a 09 20 20 20 20 75 6e 73 69 67 6e 65 64   {..    unsigned
28d0: 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 54 63   char *data = Tc
28e0: 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
28f0: 6f 6d 4f 62 6a 28 72 65 73 75 6c 74 4f 62 6a 2c  omObj(resultObj,
2900: 20 26 77 72 69 74 74 65 6e 29 3b 0a 09 20 20 20   &written);..   
2910: 20 54 63 6c 5f 57 72 69 74 65 52 61 77 28 70 61   Tcl_WriteRaw(pa
2920: 72 65 6e 74 2c 20 64 61 74 61 2c 20 77 72 69 74  rent, data, writ
2930: 74 65 6e 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44  ten);..    Tcl_D
2940: 65 63 72 52 65 66 43 6f 75 6e 74 28 72 65 73 75  ecrRefCount(resu
2950: 6c 74 4f 62 6a 29 3b 0a 09 7d 0a 09 73 74 61 74  ltObj);..}..stat
2960: 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 43  ePtr->flags |= C
2970: 48 41 4e 5f 45 4f 46 3b 0a 20 20 20 20 7d 0a 0a  HAN_EOF;.    }..
2980: 20 20 20 20 2f 2a 20 43 6c 65 61 6e 2d 75 70 20      /* Clean-up 
2990: 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 53 74 61  */.    DigestSta
29a0: 74 65 46 72 65 65 28 73 74 61 74 65 50 74 72 29  teFree(statePtr)
29b0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
29c0: 7d 0a 0a 2f 2a 0a 20 2a 20 53 61 6d 65 20 61 73  }../*. * Same as
29d0: 20 44 69 67 65 73 74 43 6c 6f 73 65 50 72 6f 63   DigestCloseProc
29e0: 20 62 75 74 20 77 69 74 68 20 69 6e 64 69 76 69   but with indivi
29f0: 64 75 61 6c 20 72 65 61 64 20 61 6e 64 20 77 72  dual read and wr
2a00: 69 74 65 20 63 6c 6f 73 65 20 63 6f 6e 74 72 6f  ite close contro
2a10: 6c 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l. */.static int
2a20: 20 44 69 67 65 73 74 43 6c 6f 73 65 32 50 72 6f   DigestClose2Pro
2a30: 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73  c(ClientData ins
2a40: 74 61 6e 63 65 44 61 74 61 2c 20 54 63 6c 5f 49  tanceData, Tcl_I
2a50: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
2a60: 6e 74 20 66 6c 61 67 73 29 20 7b 0a 0a 20 20 20  nt flags) {..   
2a70: 20 69 66 20 28 28 66 6c 61 67 73 20 26 20 28 54   if ((flags & (T
2a80: 43 4c 5f 43 4c 4f 53 45 5f 52 45 41 44 20 7c 20  CL_CLOSE_READ | 
2a90: 54 43 4c 5f 43 4c 4f 53 45 5f 57 52 49 54 45 29  TCL_CLOSE_WRITE)
2aa0: 29 20 3d 3d 20 30 29 20 7b 0a 09 72 65 74 75 72  ) == 0) {..retur
2ab0: 6e 20 44 69 67 65 73 74 43 6c 6f 73 65 50 72 6f  n DigestClosePro
2ac0: 63 28 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20  c(instanceData, 
2ad0: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 7d 0a 20  interp);.    }. 
2ae0: 20 20 20 72 65 74 75 72 6e 20 45 49 4e 56 41 4c     return EINVAL
2af0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b40: 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 49 6e 70  . *. * DigestInp
2b50: 75 74 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09  utProc --. *. *.
2b60: 43 61 6c 6c 65 64 20 62 79 20 74 68 65 20 67 65  Called by the ge
2b70: 6e 65 72 69 63 20 49 4f 20 73 79 73 74 65 6d 20  neric IO system 
2b80: 74 6f 20 72 65 61 64 20 64 61 74 61 20 66 72 6f  to read data fro
2b90: 6d 20 74 72 61 6e 73 66 6f 72 6d 20 61 6e 64 0a  m transform and.
2ba0: 20 2a 09 70 6c 61 63 65 20 69 6e 20 62 75 66 2e   *.place in buf.
2bb0: 20 54 72 61 6e 73 66 6f 72 6d 20 67 65 74 73 20   Transform gets 
2bc0: 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 75 6e  data from the un
2bd0: 64 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c  derlying channel
2be0: 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a  .. *. * Returns:
2bf0: 0a 20 2a 09 54 6f 74 61 6c 20 62 79 74 65 73 20  . *.Total bytes 
2c00: 72 65 61 64 20 6f 72 20 2d 31 20 66 6f 72 20 61  read or -1 for a
2c10: 6e 20 65 72 72 6f 72 20 61 6c 6f 6e 67 20 77 69  n error along wi
2c20: 74 68 20 61 20 50 4f 53 49 58 20 65 72 72 6f 72  th a POSIX error
2c30: 0a 20 2a 09 63 6f 64 65 20 69 6e 20 65 72 72 6f  . *.code in erro
2c40: 72 43 6f 64 65 50 74 72 2e 20 55 73 65 20 45 41  rCodePtr. Use EA
2c50: 47 41 49 4e 20 66 6f 72 20 6e 6f 6e 62 6c 6f 63  GAIN for nonbloc
2c60: 6b 69 6e 67 20 61 6e 64 20 6e 6f 20 64 61 74 61  king and no data
2c70: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
2c80: 65 63 74 73 3a 0a 20 2a 09 52 65 61 64 20 64 61  ects:. *.Read da
2c90: 74 61 20 66 72 6f 6d 20 74 72 61 6e 73 66 6f 72  ta from transfor
2ca0: 6d 20 61 6e 64 20 77 72 69 74 65 20 74 6f 20 62  m and write to b
2cb0: 75 66 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  uf. *. *--------
2cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
2d00: 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 49 6e 70  */.int DigestInp
2d10: 75 74 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74  utProc(ClientDat
2d20: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 63 68  a clientData, ch
2d30: 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 74 6f 52  ar *buf, int toR
2d40: 65 61 64 2c 20 69 6e 74 20 2a 65 72 72 6f 72 43  ead, int *errorC
2d50: 6f 64 65 50 74 72 29 20 7b 0a 20 20 20 20 44 69  odePtr) {.    Di
2d60: 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65  gestState *state
2d70: 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 61  Ptr = (DigestSta
2d80: 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61  te *) clientData
2d90: 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65  ;.    Tcl_Channe
2da0: 6c 20 70 61 72 65 6e 74 3b 0a 20 20 20 20 69 6e  l parent;.    in
2db0: 74 20 72 65 61 64 3b 0a 20 20 20 20 2a 65 72 72  t read;.    *err
2dc0: 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 0a  orCodePtr = 0;..
2dd0: 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 69 66 20      /* Abort if 
2de0: 6e 6f 74 68 69 6e 67 20 74 6f 20 70 72 6f 63 65  nothing to proce
2df0: 73 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 74 6f  ss */.    if (to
2e00: 52 65 61 64 20 3c 3d 20 30 20 7c 7c 20 73 74 61  Read <= 0 || sta
2e10: 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28  tePtr->self == (
2e20: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
2e30: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b 0a  L) {..return 0;.
2e40: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
2e50: 74 20 62 79 74 65 73 20 66 72 6f 6d 20 75 6e 64  t bytes from und
2e60: 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 20  erlying channel 
2e70: 2a 2f 0a 20 20 20 20 70 61 72 65 6e 74 20 3d 20  */.    parent = 
2e80: 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 64 43 68  Tcl_GetStackedCh
2e90: 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e  annel(statePtr->
2ea0: 73 65 6c 66 29 3b 0a 20 20 20 20 72 65 61 64 20  self);.    read 
2eb0: 3d 20 54 63 6c 5f 52 65 61 64 52 61 77 28 70 61  = Tcl_ReadRaw(pa
2ec0: 72 65 6e 74 2c 20 62 75 66 2c 20 74 6f 52 65 61  rent, buf, toRea
2ed0: 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61  d);..    /* Upda
2ee0: 74 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e  te hash function
2ef0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 61 64   */.    if (read
2f00: 20 3e 20 30 29 20 7b 0a 09 2f 2a 20 48 61 76 65   > 0) {../* Have
2f10: 20 64 61 74 61 20 2a 2f 0a 09 69 66 20 28 44 69   data */..if (Di
2f20: 67 65 73 74 55 70 64 61 74 65 28 73 74 61 74 65  gestUpdate(state
2f30: 50 74 72 2c 20 62 75 66 2c 20 28 73 69 7a 65 5f  Ptr, buf, (size_
2f40: 74 29 20 72 65 61 64 2c 20 30 29 20 21 3d 20 54  t) read, 0) != T
2f50: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 63  CL_OK) {..    Tc
2f60: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 45 72 72 6f  l_SetChannelErro
2f70: 72 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  r(statePtr->self
2f80: 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28  , Tcl_ObjPrintf(
2f90: 22 55 70 64 61 74 65 20 66 61 69 6c 65 64 3a 20  "Update failed: 
2fa0: 25 73 22 2c 20 52 45 41 53 4f 4e 28 29 29 29 3b  %s", REASON()));
2fb0: 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65  ..    *errorCode
2fc0: 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 09 20  Ptr = EINVAL;.. 
2fd0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 09 7d 0a     return 0;..}.
2fe0: 09 2f 2a 20 54 68 69 73 20 69 73 20 63 6f 72 72  ./* This is corr
2ff0: 65 63 74 20 2a 2f 0a 09 72 65 61 64 20 3d 20 2d  ect */..read = -
3000: 31 3b 0a 09 2a 65 72 72 6f 72 43 6f 64 65 50 74  1;..*errorCodePt
3010: 72 20 3d 20 45 41 47 41 49 4e 3b 0a 0a 20 20 20  r = EAGAIN;..   
3020: 20 7d 20 65 6c 73 65 20 69 66 20 28 72 65 61 64   } else if (read
3030: 20 3c 20 30 29 20 7b 0a 09 2f 2a 20 45 72 72 6f   < 0) {../* Erro
3040: 72 20 2a 2f 0a 09 2a 65 72 72 6f 72 43 6f 64 65  r */..*errorCode
3050: 50 74 72 20 3d 20 54 63 6c 5f 47 65 74 45 72 72  Ptr = Tcl_GetErr
3060: 6e 6f 28 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73  no();..    } els
3070: 65 20 69 66 20 28 21 28 73 74 61 74 65 50 74 72  e if (!(statePtr
3080: 2d 3e 66 6c 61 67 73 20 26 20 43 48 41 4e 5f 45  ->flags & CHAN_E
3090: 4f 46 29 29 20 7b 0a 09 2f 2a 20 45 4f 46 20 2a  OF)) {../* EOF *
30a0: 2f 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75  /..Tcl_Obj *resu
30b0: 6c 74 4f 62 6a 3b 0a 09 69 66 20 28 44 69 67 65  ltObj;..if (Dige
30c0: 73 74 46 69 6e 61 6c 69 7a 65 28 73 74 61 74 65  stFinalize(state
30d0: 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 73 74 61  Ptr->interp, sta
30e0: 74 65 50 74 72 2c 20 26 72 65 73 75 6c 74 4f 62  tePtr, &resultOb
30f0: 6a 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  j) == TCL_OK) {.
3100: 09 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
3110: 61 72 20 2a 64 61 74 61 20 3d 20 54 63 6c 5f 47  ar *data = Tcl_G
3120: 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
3130: 62 6a 28 72 65 73 75 6c 74 4f 62 6a 2c 20 26 72  bj(resultObj, &r
3140: 65 61 64 29 3b 0a 09 20 20 20 20 6d 65 6d 63 70  ead);..    memcp
3150: 79 28 62 75 66 2c 20 64 61 74 61 2c 20 72 65 61  y(buf, data, rea
3160: 64 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 65 63  d);..    Tcl_Dec
3170: 72 52 65 66 43 6f 75 6e 74 28 72 65 73 75 6c 74  rRefCount(result
3180: 4f 62 6a 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b  Obj);...} else {
3190: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61  ..    Tcl_SetCha
31a0: 6e 6e 65 6c 45 72 72 6f 72 28 73 74 61 74 65 50  nnelError(stateP
31b0: 74 72 2d 3e 73 65 6c 66 2c 20 54 63 6c 5f 4f 62  tr->self, Tcl_Ob
31c0: 6a 50 72 69 6e 74 66 28 22 46 69 6e 61 6c 69 7a  jPrintf("Finaliz
31d0: 65 20 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 52  e failed: %s", R
31e0: 45 41 53 4f 4e 28 29 29 29 3b 0a 09 20 20 20 20  EASON()));..    
31f0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
3200: 45 49 4e 56 41 4c 3b 0a 09 20 20 20 20 72 65 61  EINVAL;..    rea
3210: 64 20 3d 20 30 3b 0a 09 7d 0a 09 73 74 61 74 65  d = 0;..}..state
3220: 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 48  Ptr->flags |= CH
3230: 41 4e 5f 45 4f 46 3b 0a 20 20 20 20 7d 0a 20 20  AN_EOF;.    }.  
3240: 20 20 72 65 74 75 72 6e 20 72 65 61 64 3b 0a 7d    return read;.}
3250: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
3260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
32a0: 0a 20 2a 20 44 69 67 65 73 74 4f 75 74 70 75 74  . * DigestOutput
32b0: 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61  Proc --. *. *.Ca
32c0: 6c 6c 65 64 20 62 79 20 74 68 65 20 67 65 6e 65  lled by the gene
32d0: 72 69 63 20 49 4f 20 73 79 73 74 65 6d 20 74 6f  ric IO system to
32e0: 20 77 72 69 74 65 20 64 61 74 61 20 69 6e 20 62   write data in b
32f0: 75 66 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 2e  uf to transform.
3300: 0a 20 2a 09 54 68 65 20 74 72 61 6e 73 66 6f 72  . *.The transfor
3310: 6d 20 77 72 69 74 65 73 20 74 68 65 20 72 65 73  m writes the res
3320: 75 6c 74 20 74 6f 20 74 68 65 20 75 6e 64 65 72  ult to the under
3330: 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 2e 0a 20  lying channel.. 
3340: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a  *. * Returns:. *
3350: 09 54 6f 74 61 6c 20 62 79 74 65 73 20 77 72 69  .Total bytes wri
3360: 74 74 65 6e 20 6f 72 20 2d 31 20 66 6f 72 20 61  tten or -1 for a
3370: 6e 20 65 72 72 6f 72 20 61 6c 6f 6e 67 20 77 69  n error along wi
3380: 74 68 20 61 20 50 4f 53 49 58 20 65 72 72 6f 72  th a POSIX error
3390: 0a 20 2a 09 63 6f 64 65 20 69 6e 20 65 72 72 6f  . *.code in erro
33a0: 72 43 6f 64 65 50 74 72 2e 20 55 73 65 20 45 41  rCodePtr. Use EA
33b0: 47 41 49 4e 20 66 6f 72 20 6e 6f 6e 62 6c 6f 63  GAIN for nonbloc
33c0: 6b 69 6e 67 20 61 6e 64 20 63 61 6e 27 74 20 77  king and can't w
33d0: 72 69 74 65 20 64 61 74 61 2e 0a 20 2a 0a 20 2a  rite data.. *. *
33e0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
33f0: 2a 09 47 65 74 20 64 61 74 61 20 66 72 6f 6d 20  *.Get data from 
3400: 62 75 66 20 61 6e 64 20 75 70 64 61 74 65 20 64  buf and update d
3410: 69 67 65 73 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  igest. *. *-----
3420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3460: 2d 0a 20 2a 2f 0a 20 69 6e 74 20 44 69 67 65 73  -. */. int Diges
3470: 74 4f 75 74 70 75 74 50 72 6f 63 28 43 6c 69 65  tOutputProc(Clie
3480: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
3490: 61 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 62  a, const char *b
34a0: 75 66 2c 20 69 6e 74 20 74 6f 57 72 69 74 65 2c  uf, int toWrite,
34b0: 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50   int *errorCodeP
34c0: 74 72 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74  tr) {.    Digest
34d0: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20  State *statePtr 
34e0: 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a  = (DigestState *
34f0: 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20  ) clientData;.  
3500: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20    *errorCodePtr 
3510: 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 41 62 6f  = 0;..    /* Abo
3520: 72 74 20 69 66 20 6e 6f 74 68 69 6e 67 20 74 6f  rt if nothing to
3530: 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 20 20   process */.    
3540: 69 66 20 28 74 6f 57 72 69 74 65 20 3c 3d 20 30  if (toWrite <= 0
3550: 20 7c 7c 20 73 74 61 74 65 50 74 72 2d 3e 73 65   || statePtr->se
3560: 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e  lf == (Tcl_Chann
3570: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74  el) NULL) {..ret
3580: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  urn 0;.    }..  
3590: 20 20 2f 2a 20 55 70 64 61 74 65 20 68 61 73 68    /* Update hash
35a0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20   function */.   
35b0: 20 69 66 20 28 44 69 67 65 73 74 55 70 64 61 74   if (DigestUpdat
35c0: 65 28 73 74 61 74 65 50 74 72 2c 20 62 75 66 2c  e(statePtr, buf,
35d0: 20 28 73 69 7a 65 5f 74 29 20 74 6f 57 72 69 74   (size_t) toWrit
35e0: 65 2c 20 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29  e, 0) != TCL_OK)
35f0: 20 7b 0a 09 54 63 6c 5f 53 65 74 43 68 61 6e 6e   {..Tcl_SetChann
3600: 65 6c 45 72 72 6f 72 28 73 74 61 74 65 50 74 72  elError(statePtr
3610: 2d 3e 73 65 6c 66 2c 20 54 63 6c 5f 4f 62 6a 50  ->self, Tcl_ObjP
3620: 72 69 6e 74 66 28 22 55 70 64 61 74 65 20 66 61  rintf("Update fa
3630: 69 6c 65 64 3a 20 25 73 22 2c 20 52 45 41 53 4f  iled: %s", REASO
3640: 4e 28 29 29 29 3b 0a 09 2a 65 72 72 6f 72 43 6f  N()));..*errorCo
3650: 64 65 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a  dePtr = EINVAL;.
3660: 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d  .return 0;.    }
3670: 0a 20 20 20 20 72 65 74 75 72 6e 20 74 6f 57 72  .    return toWr
3680: 69 74 65 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  ite;.}../*. *---
3690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36d0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74  ---. *. * Digest
36e0: 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2d 2d  SetOptionProc --
36f0: 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79  . *. *.Called by
3700: 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20   the generic IO 
3710: 73 79 73 74 65 6d 20 74 6f 20 73 65 74 20 63 68  system to set ch
3720: 61 6e 6e 65 6c 20 6f 70 74 69 6f 6e 20 6e 61 6d  annel option nam
3730: 65 20 74 6f 20 76 61 6c 75 65 2e 0a 20 2a 0a 20  e to value.. *. 
3740: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43  * Returns:. *.TC
3750: 4c 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66  L_OK if successf
3760: 75 6c 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 20  ul or TCL_ERROR 
3770: 69 66 20 66 61 69 6c 65 64 20 61 6c 6f 6e 67 20  if failed along 
3780: 77 69 74 68 20 61 6e 20 65 72 72 6f 72 0a 20 2a  with an error. *
3790: 09 6d 65 73 73 61 67 65 20 69 6e 20 69 6e 74 65  .message in inte
37a0: 72 70 20 61 6e 64 20 54 63 6c 5f 53 65 74 45 72  rp and Tcl_SetEr
37b0: 72 6e 6f 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  rno.. *. * Side 
37c0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 55 70 64 61  effects:. *.Upda
37d0: 74 65 73 20 63 68 61 6e 6e 65 6c 20 6f 70 74 69  tes channel opti
37e0: 6f 6e 20 74 6f 20 6e 65 77 20 76 61 6c 75 65 2e  on to new value.
37f0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
3800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
3840: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 69 67 65  .static int Dige
3850: 73 74 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28  stSetOptionProc(
3860: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
3870: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
3880: 70 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74  p *interp, const
3890: 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d   char *optionNam
38a0: 65 2c 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a  e,..const char *
38b0: 6f 70 74 69 6f 6e 56 61 6c 75 65 29 20 7b 0a 20  optionValue) {. 
38c0: 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a     DigestState *
38d0: 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65  statePtr = (Dige
38e0: 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e  stState *) clien
38f0: 74 44 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 43  tData;.    Tcl_C
3900: 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 3b 0a 20  hannel parent;. 
3910: 20 20 20 54 63 6c 5f 44 72 69 76 65 72 53 65 74     Tcl_DriverSet
3920: 4f 70 74 69 6f 6e 50 72 6f 63 20 2a 73 65 74 4f  OptionProc *setO
3930: 70 74 69 6f 6e 50 72 6f 63 3b 0a 0a 20 20 20 20  ptionProc;..    
3940: 2f 2a 20 41 62 6f 72 74 20 69 66 20 6e 6f 20 63  /* Abort if no c
3950: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66  hannel */.    if
3960: 20 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66   (statePtr->self
3970: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c   == (Tcl_Channel
3980: 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  ) NULL) {..retur
3990: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
39a0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 67   }..    /* Deleg
39b0: 61 74 65 20 6f 70 74 69 6f 6e 73 20 64 6f 77 6e  ate options down
39c0: 73 74 72 65 61 6d 20 2a 2f 0a 20 20 20 20 70 61  stream */.    pa
39d0: 72 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74  rent = Tcl_GetSt
39e0: 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 61  ackedChannel(sta
39f0: 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 20 20  tePtr->self);.  
3a00: 20 20 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20    setOptionProc 
3a10: 3d 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 53 65 74  = Tcl_ChannelSet
3a20: 4f 70 74 69 6f 6e 50 72 6f 63 28 54 63 6c 5f 47  OptionProc(Tcl_G
3a30: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 70 61  etChannelType(pa
3a40: 72 65 6e 74 29 29 3b 0a 20 20 20 20 69 66 20 28  rent));.    if (
3a50: 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 21 3d  setOptionProc !=
3a60: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
3a70: 20 28 2a 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63   (*setOptionProc
3a80: 29 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  )(Tcl_GetChannel
3a90: 49 6e 73 74 61 6e 63 65 44 61 74 61 28 70 61 72  InstanceData(par
3aa0: 65 6e 74 29 2c 20 69 6e 74 65 72 70 2c 20 6f 70  ent), interp, op
3ab0: 74 69 6f 6e 4e 61 6d 65 2c 20 6f 70 74 69 6f 6e  tionName, option
3ac0: 56 61 6c 75 65 29 3b 0a 20 20 20 20 7d 20 65 6c  Value);.    } el
3ad0: 73 65 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72 72  se {..Tcl_SetErr
3ae0: 6e 6f 28 45 49 4e 56 41 4c 29 3b 0a 09 72 65 74  no(EINVAL);..ret
3af0: 75 72 6e 20 54 63 6c 5f 42 61 64 43 68 61 6e 6e  urn Tcl_BadChann
3b00: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
3b10: 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 4e 55 4c   optionName, NUL
3b20: 4c 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a  L);.    }.}../*.
3b30: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
3b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b70: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44  --------. *. * D
3b80: 69 67 65 73 74 47 65 74 4f 70 74 69 6f 6e 50 72  igestGetOptionPr
3b90: 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c  oc --. *. *.Call
3ba0: 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 69  ed by the generi
3bb0: 63 20 49 4f 20 73 79 73 74 65 6d 20 74 6f 20 67  c IO system to g
3bc0: 65 74 20 63 68 61 6e 6e 65 6c 20 6f 70 74 69 6f  et channel optio
3bd0: 6e 20 6e 61 6d 65 27 73 20 76 61 6c 75 65 2e 0a  n name's value..
3be0: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20   *. * Returns:. 
3bf0: 2a 09 54 43 4c 5f 4f 4b 20 69 66 20 73 75 63 63  *.TCL_OK if succ
3c00: 65 73 73 66 75 6c 20 6f 72 20 54 43 4c 5f 45 52  essful or TCL_ER
3c10: 52 4f 52 20 69 66 20 66 61 69 6c 65 64 20 61 6c  ROR if failed al
3c20: 6f 6e 67 20 77 69 74 68 20 61 6e 20 65 72 72 6f  ong with an erro
3c30: 72 0a 20 2a 09 6d 65 73 73 61 67 65 20 69 6e 20  r. *.message in 
3c40: 69 6e 74 65 72 70 20 61 6e 64 20 54 63 6c 5f 53  interp and Tcl_S
3c50: 65 74 45 72 72 6e 6f 2e 0a 20 2a 0a 20 2a 20 53  etErrno.. *. * S
3c60: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
3c70: 53 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20 6f  Sets result to o
3c80: 70 74 69 6f 6e 27 73 20 76 61 6c 75 65 0a 20 2a  ption's value. *
3c90: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
3ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
3ce0: 61 74 69 63 20 69 6e 74 20 44 69 67 65 73 74 47  atic int DigestG
3cf0: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 43 6c 69  etOptionProc(Cli
3d00: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
3d10: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
3d20: 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74 20 63 68  interp, const ch
3d30: 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c 0a  ar *optionName,.
3d40: 09 54 63 6c 5f 44 53 74 72 69 6e 67 20 2a 6f 70  .Tcl_DString *op
3d50: 74 69 6f 6e 56 61 6c 75 65 29 20 7b 0a 20 20 20  tionValue) {.   
3d60: 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74   DigestState *st
3d70: 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 74  atePtr = (Digest
3d80: 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44  State *) clientD
3d90: 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61  ata;.    Tcl_Cha
3da0: 6e 6e 65 6c 20 70 61 72 65 6e 74 3b 0a 20 20 20  nnel parent;.   
3db0: 20 54 63 6c 5f 44 72 69 76 65 72 47 65 74 4f 70   Tcl_DriverGetOp
3dc0: 74 69 6f 6e 50 72 6f 63 20 2a 67 65 74 4f 70 74  tionProc *getOpt
3dd0: 69 6f 6e 50 72 6f 63 3b 0a 0a 20 20 20 20 2f 2a  ionProc;..    /*
3de0: 20 41 62 6f 72 74 20 69 66 20 6e 6f 20 63 68 61   Abort if no cha
3df0: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28  nnel */.    if (
3e00: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d  statePtr->self =
3e10: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
3e20: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
3e30: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
3e40: 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 67 61 74  ..    /* Delegat
3e50: 65 20 6f 70 74 69 6f 6e 73 20 64 6f 77 6e 73 74  e options downst
3e60: 72 65 61 6d 20 2a 2f 0a 20 20 20 20 70 61 72 65  ream */.    pare
3e70: 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 63  nt = Tcl_GetStac
3e80: 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 65  kedChannel(state
3e90: 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 20  Ptr->self);.    
3ea0: 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 3d 20  getOptionProc = 
3eb0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 47 65 74 4f 70  Tcl_ChannelGetOp
3ec0: 74 69 6f 6e 50 72 6f 63 28 54 63 6c 5f 47 65 74  tionProc(Tcl_Get
3ed0: 43 68 61 6e 6e 65 6c 54 79 70 65 28 70 61 72 65  ChannelType(pare
3ee0: 6e 74 29 29 3b 0a 20 20 20 20 69 66 20 28 67 65  nt));.    if (ge
3ef0: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 21 3d 20 4e  tOptionProc != N
3f00: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 28  ULL) {..return (
3f10: 2a 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 29 28  *getOptionProc)(
3f20: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e  Tcl_GetChannelIn
3f30: 73 74 61 6e 63 65 44 61 74 61 28 70 61 72 65 6e  stanceData(paren
3f40: 74 29 2c 20 69 6e 74 65 72 70 2c 20 6f 70 74 69  t), interp, opti
3f50: 6f 6e 4e 61 6d 65 2c 20 6f 70 74 69 6f 6e 56 61  onName, optionVa
3f60: 6c 75 65 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  lue);.    } else
3f70: 20 69 66 20 28 6f 70 74 69 6f 6e 4e 61 6d 65 20   if (optionName 
3f80: 3d 3d 20 28 63 68 61 72 2a 29 20 4e 55 4c 4c 29  == (char*) NULL)
3f90: 20 7b 0a 09 2f 2a 20 52 65 71 75 65 73 74 20 69   {../* Request i
3fa0: 73 20 71 75 65 72 79 20 66 6f 72 20 61 6c 6c 20  s query for all 
3fb0: 6f 70 74 69 6f 6e 73 2c 20 74 68 69 73 20 69 73  options, this is
3fc0: 20 6f 6b 2e 20 2a 2f 0a 09 72 65 74 75 72 6e 20   ok. */..return 
3fd0: 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c  TCL_OK;.    } el
3fe0: 73 65 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72 72  se {..Tcl_SetErr
3ff0: 6e 6f 28 45 49 4e 56 41 4c 29 3b 0a 09 72 65 74  no(EINVAL);..ret
4000: 75 72 6e 20 54 63 6c 5f 42 61 64 43 68 61 6e 6e  urn Tcl_BadChann
4010: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
4020: 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 4e 55 4c   optionName, NUL
4030: 4c 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a  L);.    }.}../*.
4040: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
4050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4080: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44  --------. *. * D
4090: 69 67 65 73 74 54 69 6d 65 72 48 61 6e 64 6c 65  igestTimerHandle
40a0: 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65  r --. *. *.Calle
40b0: 64 20 62 79 20 74 68 65 20 6e 6f 74 69 66 69 65  d by the notifie
40c0: 72 20 76 69 61 20 74 69 6d 65 72 20 74 6f 20 66  r via timer to f
40d0: 6c 75 73 68 20 6f 75 74 20 70 65 6e 64 69 6e 67  lush out pending
40e0: 20 69 6e 70 75 74 20 64 61 74 61 2e 0a 20 2a 0a   input data.. *.
40f0: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 4e   * Returns:. *.N
4100: 6f 74 68 69 6e 67 0a 20 2a 0a 20 2a 20 53 69 64  othing. *. * Sid
4110: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61  e effects:. *.Ma
4120: 79 20 63 61 6c 6c 20 54 63 6c 5f 4e 6f 74 69 66  y call Tcl_Notif
4130: 79 43 68 61 6e 6e 65 6c 0a 20 2a 0a 20 2a 2d 2d  yChannel. *. *--
4140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4180: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
4190: 76 6f 69 64 20 44 69 67 65 73 74 54 69 6d 65 72  void DigestTimer
41a0: 48 61 6e 64 6c 65 72 28 43 6c 69 65 6e 74 44 61  Handler(ClientDa
41b0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 29 20 7b  ta clientData) {
41c0: 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65  .    DigestState
41d0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44 69   *statePtr = (Di
41e0: 67 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69  gestState *) cli
41f0: 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 2f 2a  entData;..    /*
4200: 20 41 62 6f 72 74 20 69 66 20 6e 6f 20 63 68 61   Abort if no cha
4210: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28  nnel */.    if (
4220: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d  statePtr->self =
4230: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
4240: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 3b  NULL) {..return;
4250: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
4260: 6c 65 61 72 20 74 69 6d 65 72 20 74 6f 6b 65 6e  lear timer token
4270: 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72   */.    statePtr
4280: 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54  ->timer = (Tcl_T
4290: 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b  imerToken) NULL;
42a0: 0a 0a 20 20 20 20 2f 2a 20 46 69 72 65 20 65 76  ..    /* Fire ev
42b0: 65 6e 74 20 69 66 20 74 68 65 72 65 20 69 73 20  ent if there is 
42c0: 70 65 6e 64 69 6e 67 20 64 61 74 61 2c 20 73 6b  pending data, sk
42d0: 69 70 20 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a  ip otherwise */.
42e0: 20 20 20 20 69 66 20 28 28 73 74 61 74 65 50 74      if ((statePt
42f0: 72 2d 3e 77 61 74 63 68 4d 61 73 6b 20 26 20 54  r->watchMask & T
4300: 43 4c 5f 52 45 41 44 41 42 4c 45 29 20 26 26 20  CL_READABLE) && 
4310: 28 54 63 6c 5f 49 6e 70 75 74 42 75 66 66 65 72  (Tcl_InputBuffer
4320: 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  ed(statePtr->sel
4330: 66 29 20 3e 20 30 29 29 20 7b 0a 09 54 63 6c 5f  f) > 0)) {..Tcl_
4340: 4e 6f 74 69 66 79 43 68 61 6e 6e 65 6c 28 73 74  NotifyChannel(st
4350: 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 54 43  atePtr->self, TC
4360: 4c 5f 52 45 41 44 41 42 4c 45 29 3b 0a 20 20 20  L_READABLE);.   
4370: 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d   }.}../*. *-----
4380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43c0: 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 57 61  -. *. * DigestWa
43d0: 74 63 68 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a  tchProc --. *. *
43e0: 09 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20  .Initialize the 
43f0: 6e 6f 74 69 66 69 65 72 20 74 6f 20 77 61 74 63  notifier to watc
4400: 68 20 66 6f 72 20 65 76 65 6e 74 73 20 66 72 6f  h for events fro
4410: 6d 20 74 68 69 73 20 63 68 61 6e 6e 65 6c 2e 0a  m this channel..
4420: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20   *. * Returns:. 
4430: 2a 09 4e 6f 74 68 69 6e 67 20 28 63 61 6e 27 74  *.Nothing (can't
4440: 20 72 65 74 75 72 6e 20 65 72 72 6f 72 20 6d 65   return error me
4450: 73 73 61 67 65 73 29 0a 20 2a 0a 20 2a 20 53 69  ssages). *. * Si
4460: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
4470: 6f 6e 66 69 67 75 72 65 20 6e 6f 74 69 66 69 65  onfigure notifie
4480: 72 20 73 6f 20 66 75 74 75 72 65 20 65 76 65 6e  r so future even
4490: 74 73 20 6f 6e 20 74 68 65 20 63 68 61 6e 6e 65  ts on the channe
44a0: 6c 20 77 69 6c 6c 20 62 65 20 73 65 65 6e 20 62  l will be seen b
44b0: 79 20 54 63 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  y Tcl.. *. *----
44c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
44d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
44e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
44f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4500: 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 44 69 67 65  --. */.void Dige
4510: 73 74 57 61 74 63 68 50 72 6f 63 28 43 6c 69 65  stWatchProc(Clie
4520: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
4530: 61 2c 20 69 6e 74 20 6d 61 73 6b 29 20 7b 0a 20  a, int mask) {. 
4540: 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a     DigestState *
4550: 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65  statePtr = (Dige
4560: 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e  stState *) clien
4570: 74 44 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 43  tData;.    Tcl_C
4580: 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 3b 0a 20  hannel parent;. 
4590: 20 20 20 54 63 6c 5f 44 72 69 76 65 72 57 61 74     Tcl_DriverWat
45a0: 63 68 50 72 6f 63 20 2a 77 61 74 63 68 50 72 6f  chProc *watchPro
45b0: 63 3b 0a 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74  c;..    /* Abort
45c0: 20 69 66 20 6e 6f 20 63 68 61 6e 6e 65 6c 20 2a   if no channel *
45d0: 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  /.    if (stateP
45e0: 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c  tr->self == (Tcl
45f0: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20  _Channel) NULL) 
4600: 7b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d  {..return;.    }
4610: 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 4f  ..    /* Store O
4620: 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  R-ed combination
4630: 20 6f 66 20 54 43 4c 5f 52 45 41 44 41 42 4c 45   of TCL_READABLE
4640: 2c 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 20 61  , TCL_WRITABLE a
4650: 6e 64 20 54 43 4c 5f 45 58 43 45 50 54 49 4f 4e  nd TCL_EXCEPTION
4660: 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72   */.    statePtr
4670: 2d 3e 77 61 74 63 68 4d 61 73 6b 20 3d 20 6d 61  ->watchMask = ma
4680: 73 6b 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 70  sk;..    /* Prop
4690: 61 67 61 74 65 20 6d 61 73 6b 20 69 6e 66 6f 20  agate mask info 
46a0: 74 6f 20 70 61 72 65 6e 74 20 63 68 61 6e 6e 65  to parent channe
46b0: 6c 20 2a 2f 0a 20 20 20 20 70 61 72 65 6e 74 20  l */.    parent 
46c0: 3d 20 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 64  = Tcl_GetStacked
46d0: 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72  Channel(statePtr
46e0: 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 20 77 61 74  ->self);.    wat
46f0: 63 68 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68 61  chProc = Tcl_Cha
4700: 6e 6e 65 6c 57 61 74 63 68 50 72 6f 63 28 54 63  nnelWatchProc(Tc
4710: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65  l_GetChannelType
4720: 28 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 77  (parent));.    w
4730: 61 74 63 68 50 72 6f 63 28 54 63 6c 5f 47 65 74  atchProc(Tcl_Get
4740: 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44  ChannelInstanceD
4750: 61 74 61 28 70 61 72 65 6e 74 29 2c 20 6d 61 73  ata(parent), mas
4760: 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f  k);..    /* Remo
4770: 76 65 20 70 65 6e 64 69 6e 67 20 74 69 6d 65 72  ve pending timer
4780: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74   */.    if (stat
4790: 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28  ePtr->timer != (
47a0: 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20  Tcl_TimerToken) 
47b0: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c  NULL) {..Tcl_Del
47c0: 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28  eteTimerHandler(
47d0: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29  statePtr->timer)
47e0: 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d  ;..statePtr->tim
47f0: 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54  er = (Tcl_TimerT
4800: 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 20 20 20 20  oken) NULL;.    
4810: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
4820: 72 65 20 69 73 20 64 61 74 61 20 70 65 6e 64 69  re is data pendi
4830: 6e 67 2c 20 73 65 74 20 6e 65 77 20 74 69 6d 65  ng, set new time
4840: 72 20 74 6f 20 63 61 6c 6c 20 54 63 6c 5f 4e 6f  r to call Tcl_No
4850: 74 69 66 79 43 68 61 6e 6e 65 6c 20 2a 2f 0a 20  tifyChannel */. 
4860: 20 20 20 69 66 20 28 28 6d 61 73 6b 20 26 20 54     if ((mask & T
4870: 43 4c 5f 52 45 41 44 41 42 4c 45 29 20 26 26 20  CL_READABLE) && 
4880: 28 54 63 6c 5f 49 6e 70 75 74 42 75 66 66 65 72  (Tcl_InputBuffer
4890: 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  ed(statePtr->sel
48a0: 66 29 20 3e 20 30 29 29 20 7b 0a 09 73 74 61 74  f) > 0)) {..stat
48b0: 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 54 63  ePtr->timer = Tc
48c0: 6c 5f 43 72 65 61 74 65 54 69 6d 65 72 48 61 6e  l_CreateTimerHan
48d0: 64 6c 65 72 28 52 45 41 44 5f 44 45 4c 41 59 2c  dler(READ_DELAY,
48e0: 20 44 69 67 65 73 74 54 69 6d 65 72 48 61 6e 64   DigestTimerHand
48f0: 6c 65 72 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  ler, (ClientData
4900: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20  ) statePtr);.   
4910: 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d   }.}../*. *-----
4920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4960: 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 47 65  -. *. * DigestGe
4970: 74 48 61 6e 64 6c 65 50 72 6f 63 20 2d 2d 0a 20  tHandleProc --. 
4980: 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 66 72 6f 6d  *. *.Called from
4990: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 48   Tcl_GetChannelH
49a0: 61 6e 64 6c 65 20 74 6f 20 72 65 74 72 69 65 76  andle to retriev
49b0: 65 20 4f 53 20 73 70 65 63 69 66 69 63 20 66 69  e OS specific fi
49c0: 6c 65 20 68 61 6e 64 6c 65 0a 20 2a 09 66 72 6f  le handle. *.fro
49d0: 6d 20 69 6e 73 69 64 65 20 74 68 69 73 20 63 68  m inside this ch
49e0: 61 6e 6e 65 6c 2e 20 4e 6f 74 20 75 73 65 64 20  annel. Not used 
49f0: 66 6f 72 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  for transformati
4a00: 6f 6e 73 3f 0a 20 2a 0a 20 2a 20 52 65 74 75 72  ons?. *. * Retur
4a10: 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 66 6f  ns:. *.TCL_OK fo
4a20: 72 20 73 75 63 63 65 73 73 20 6f 72 20 54 43 4c  r success or TCL
4a30: 5f 45 52 52 4f 52 20 66 6f 72 20 65 72 72 6f 72  _ERROR for error
4a40: 20 6f 72 20 69 66 20 6e 6f 74 20 73 75 70 70 6f   or if not suppo
4a50: 72 74 65 64 2e 20 49 66 0a 20 2a 09 64 69 72 65  rted. If. *.dire
4a60: 63 74 69 6f 6e 20 69 73 20 54 43 4c 5f 52 45 41  ction is TCL_REA
4a70: 44 41 42 4c 45 2c 20 73 65 74 73 20 68 61 6e 64  DABLE, sets hand
4a80: 6c 65 50 74 72 20 74 6f 20 74 68 65 20 68 61 6e  lePtr to the han
4a90: 64 6c 65 20 75 73 65 64 20 66 6f 72 0a 20 2a 09  dle used for. *.
4aa0: 69 6e 70 75 74 2c 20 6f 72 20 69 66 20 54 43 4c  input, or if TCL
4ab0: 5f 57 52 49 54 41 42 4c 45 20 73 65 74 73 20 74  _WRITABLE sets t
4ac0: 6f 20 74 68 65 20 68 61 6e 64 6c 65 20 75 73 65  o the handle use
4ad0: 64 20 66 6f 72 20 6f 75 74 70 75 74 2e 0a 20 2a  d for output.. *
4ae0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
4af0: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d  :. *.None. *. *-
4b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b40: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69  -----. */.int Di
4b50: 67 65 73 74 47 65 74 48 61 6e 64 6c 65 50 72 6f  gestGetHandlePro
4b60: 63 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  c(ClientData cli
4b70: 65 6e 74 44 61 74 61 2c 20 69 6e 74 20 64 69 72  entData, int dir
4b80: 65 63 74 69 6f 6e 2c 20 43 6c 69 65 6e 74 44 61  ection, ClientDa
4b90: 74 61 20 2a 68 61 6e 64 6c 65 50 74 72 29 20 7b  ta *handlePtr) {
4ba0: 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65  .    DigestState
4bb0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44 69   *statePtr = (Di
4bc0: 67 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69  gestState *) cli
4bd0: 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 54 63 6c  entData;.    Tcl
4be0: 5f 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 3b  _Channel parent;
4bf0: 0a 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 69  ..    /* Abort i
4c00: 66 20 6e 6f 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  f no channel */.
4c10: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
4c20: 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43  ->self == (Tcl_C
4c30: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a  hannel) NULL) {.
4c40: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
4c50: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 61  R;.    }..    pa
4c60: 72 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74  rent = Tcl_GetSt
4c70: 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 61  ackedChannel(sta
4c80: 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 20 20  tePtr->self);.  
4c90: 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 47 65 74    return Tcl_Get
4ca0: 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 28 70 61  ChannelHandle(pa
4cb0: 72 65 6e 74 2c 20 64 69 72 65 63 74 69 6f 6e 2c  rent, direction,
4cc0: 20 68 61 6e 64 6c 65 50 74 72 29 3b 0a 7d 0a 0a   handlePtr);.}..
4cd0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
4ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
4d20: 2a 20 44 69 67 65 73 74 4e 6f 74 69 66 79 50 72  * DigestNotifyPr
4d30: 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c  oc --. *. *.Call
4d40: 65 64 20 62 79 20 54 63 6c 20 74 6f 20 69 6e 66  ed by Tcl to inf
4d50: 6f 72 6d 20 75 73 20 6f 66 20 61 63 74 69 76 69  orm us of activi
4d60: 74 79 20 6f 6e 20 74 68 65 20 75 6e 64 65 72 6c  ty on the underl
4d70: 79 69 6e 67 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a  ying channel.. *
4d80: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09  . * Returns:. *.
4d90: 55 6e 63 68 61 6e 67 65 64 20 69 6e 74 65 72 65  Unchanged intere
4da0: 73 74 4d 61 73 6b 20 77 68 69 63 68 20 69 73 20  stMask which is 
4db0: 61 6e 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61  an OR-ed combina
4dc0: 74 69 6f 6e 20 6f 66 20 54 43 4c 5f 52 45 41 44  tion of TCL_READ
4dd0: 41 42 4c 45 20 6f 72 20 54 43 4c 5f 57 52 49 54  ABLE or TCL_WRIT
4de0: 41 42 4c 45 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ABLE. *. * Side 
4df0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6e 63  effects:. *.Canc
4e00: 65 6c 73 20 61 6e 79 20 70 65 6e 64 69 6e 67 20  els any pending 
4e10: 74 69 6d 65 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  timer.. *. *----
4e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4e60: 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73  --. */.int Diges
4e70: 74 4e 6f 74 69 66 79 50 72 6f 63 28 43 6c 69 65  tNotifyProc(Clie
4e80: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
4e90: 61 2c 20 69 6e 74 20 69 6e 74 65 72 65 73 74 4d  a, int interestM
4ea0: 61 73 6b 29 20 7b 0a 20 20 20 20 44 69 67 65 73  ask) {.    Diges
4eb0: 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72  tState *statePtr
4ec0: 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20   = (DigestState 
4ed0: 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a  *) clientData;..
4ee0: 20 20 20 20 2f 2a 20 53 6b 69 70 20 74 69 6d 65      /* Skip time
4ef0: 72 20 65 76 65 6e 74 20 61 73 20 72 65 64 75 6e  r event as redun
4f00: 64 61 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20 28  dant */.    if (
4f10: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20  statePtr->timer 
4f20: 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b  != (Tcl_TimerTok
4f30: 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c  en) NULL) {..Tcl
4f40: 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64  _DeleteTimerHand
4f50: 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69  ler(statePtr->ti
4f60: 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d  mer);..statePtr-
4f70: 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69  >timer = (Tcl_Ti
4f80: 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a  merToken) NULL;.
4f90: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
4fa0: 20 69 6e 74 65 72 65 73 74 4d 61 73 6b 3b 0a 7d   interestMask;.}
4fb0: 0a 0a 2f 2a 0a 20 2a 0a 20 2a 20 43 68 61 6e 6e  ../*. *. * Chann
4fc0: 65 6c 20 74 79 70 65 20 73 74 72 75 63 74 75 72  el type structur
4fd0: 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72  e definition for
4fe0: 20 64 69 67 65 73 74 20 74 72 61 6e 73 66 6f 72   digest transfor
4ff0: 6d 61 74 69 6f 6e 73 2e 0a 20 2a 0a 20 2a 2f 0a  mations.. *. */.
5000: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 54 63 6c  static const Tcl
5010: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 64 69 67  _ChannelType dig
5020: 65 73 74 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d  estChannelType =
5030: 20 7b 0a 20 20 20 20 22 64 69 67 65 73 74 22 2c   {.    "digest",
5040: 09 09 09 2f 2a 20 54 79 70 65 20 6e 61 6d 65 20  .../* Type name 
5050: 2a 2f 0a 20 20 20 20 54 43 4c 5f 43 48 41 4e 4e  */.    TCL_CHANN
5060: 45 4c 5f 56 45 52 53 49 4f 4e 5f 35 2c 09 2f 2a  EL_VERSION_5,./*
5070: 20 76 35 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20   v5 channel */. 
5080: 20 20 20 44 69 67 65 73 74 43 6c 6f 73 65 50 72     DigestClosePr
5090: 6f 63 2c 09 09 2f 2a 20 43 6c 6f 73 65 20 70 72  oc,../* Close pr
50a0: 6f 63 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74  oc */.    Digest
50b0: 49 6e 70 75 74 50 72 6f 63 2c 09 09 2f 2a 20 49  InputProc,../* I
50c0: 6e 70 75 74 20 70 72 6f 63 20 2a 2f 0a 20 20 20  nput proc */.   
50d0: 20 44 69 67 65 73 74 4f 75 74 70 75 74 50 72 6f   DigestOutputPro
50e0: 63 2c 09 09 2f 2a 20 4f 75 74 70 75 74 20 70 72  c,../* Output pr
50f0: 6f 63 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09  oc */.    NULL,.
5100: 09 09 2f 2a 20 53 65 65 6b 20 70 72 6f 63 20 2a  ../* Seek proc *
5110: 2f 0a 20 20 20 20 44 69 67 65 73 74 53 65 74 4f  /.    DigestSetO
5120: 70 74 69 6f 6e 50 72 6f 63 2c 09 2f 2a 20 53 65  ptionProc,./* Se
5130: 74 20 6f 70 74 69 6f 6e 20 70 72 6f 63 20 2a 2f  t option proc */
5140: 0a 20 20 20 20 44 69 67 65 73 74 47 65 74 4f 70  .    DigestGetOp
5150: 74 69 6f 6e 50 72 6f 63 2c 09 2f 2a 20 47 65 74  tionProc,./* Get
5160: 20 6f 70 74 69 6f 6e 20 70 72 6f 63 20 2a 2f 0a   option proc */.
5170: 20 20 20 20 44 69 67 65 73 74 57 61 74 63 68 50      DigestWatchP
5180: 72 6f 63 2c 09 09 2f 2a 20 49 6e 69 74 69 61 6c  roc,../* Initial
5190: 69 7a 65 20 6e 6f 74 69 66 69 65 72 20 2a 2f 0a  ize notifier */.
51a0: 20 20 20 20 44 69 67 65 73 74 47 65 74 48 61 6e      DigestGetHan
51b0: 64 6c 65 50 72 6f 63 2c 09 2f 2a 20 47 65 74 20  dleProc,./* Get 
51c0: 4f 53 20 68 61 6e 64 6c 65 73 20 6f 75 74 20 6f  OS handles out o
51d0: 66 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20  f channel */.   
51e0: 20 44 69 67 65 73 74 43 6c 6f 73 65 32 50 72 6f   DigestClose2Pro
51f0: 63 2c 09 09 2f 2a 20 63 6c 6f 73 65 32 70 72 6f  c,../* close2pro
5200: 63 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 42  c */.    DigestB
5210: 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 2c 09 2f 2a  lockModeProc,./*
5220: 20 53 65 74 20 62 6c 6f 63 6b 69 6e 67 2f 6e 6f   Set blocking/no
5230: 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2a 2f  nblocking mode*/
5240: 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20  .    NULL,.../* 
5250: 46 6c 75 73 68 20 70 72 6f 63 20 2a 2f 0a 20 20  Flush proc */.  
5260: 20 20 44 69 67 65 73 74 4e 6f 74 69 66 79 50 72    DigestNotifyPr
5270: 6f 63 2c 09 09 2f 2a 20 48 61 6e 64 6c 69 6e 67  oc,../* Handling
5280: 20 6f 66 20 65 76 65 6e 74 73 20 62 75 62 62 6c   of events bubbl
5290: 69 6e 67 20 75 70 20 2a 2f 0a 20 20 20 20 4e 55  ing up */.    NU
52a0: 4c 4c 2c 09 09 09 2f 2a 20 57 69 64 65 20 73 65  LL,.../* Wide se
52b0: 65 6b 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 4e  ek proc */.    N
52c0: 55 4c 4c 2c 09 09 09 2f 2a 20 54 68 72 65 61 64  ULL,.../* Thread
52d0: 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 4e   action */.    N
52e0: 55 4c 4c 09 09 09 2f 2a 20 54 72 75 6e 63 61 74  ULL.../* Truncat
52f0: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2d 2d  e */.};../*. *--
5300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5340: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73  ----. *. * Diges
5350: 74 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 20  tChannelHandler 
5360: 2d 2d 0a 20 2a 0a 20 2a 09 43 72 65 61 74 65 20  --. *. *.Create 
5370: 61 20 73 74 61 63 6b 65 64 20 63 68 61 6e 6e 65  a stacked channe
5380: 6c 20 66 6f 72 20 61 20 6d 65 73 73 61 67 65 20  l for a message 
5390: 64 69 67 65 73 74 20 74 72 61 6e 73 66 6f 72 6d  digest transform
53a0: 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74  ation.. *. * Ret
53b0: 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20  urns:. *.TCL_OK 
53c0: 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a  or TCL_ERROR. *.
53d0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
53e0: 0a 20 2a 09 41 64 64 73 20 74 72 61 6e 73 66 6f  . *.Adds transfo
53f0: 72 6d 20 74 6f 20 63 68 61 6e 6e 65 6c 20 61 6e  rm to channel an
5400: 64 20 73 65 74 73 20 72 65 73 75 6c 74 20 74 6f  d sets result to
5410: 20 63 68 61 6e 6e 65 6c 20 69 64 20 6f 72 20 65   channel id or e
5420: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a  rror message.. *
5430: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
5440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
5480: 61 74 69 63 20 69 6e 74 20 44 69 67 65 73 74 43  atic int DigestC
5490: 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 28 54 63  hannelHandler(Tc
54a0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
54b0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 68  , const char *ch
54c0: 61 6e 6e 65 6c 2c 20 54 63 6c 5f 4f 62 6a 20 2a  annel, Tcl_Obj *
54d0: 64 69 67 65 73 74 4f 62 6a 2c 0a 09 54 63 6c 5f  digestObj,..Tcl_
54e0: 4f 62 6a 20 2a 63 69 70 68 65 72 4f 62 6a 2c 20  Obj *cipherObj, 
54f0: 69 6e 74 20 66 6f 72 6d 61 74 2c 20 54 63 6c 5f  int format, Tcl_
5500: 4f 62 6a 20 2a 6b 65 79 4f 62 6a 2c 20 54 63 6c  Obj *keyObj, Tcl
5510: 5f 4f 62 6a 20 2a 6d 61 63 4f 62 6a 29 20 7b 0a  _Obj *macObj) {.
5520: 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 20 2f 2a      int mode; /*
5530: 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69   OR-ed combinati
5540: 6f 6e 20 6f 66 20 54 43 4c 5f 52 45 41 44 41 42  on of TCL_READAB
5550: 4c 45 20 61 6e 64 20 54 43 4c 5f 57 52 49 54 41  LE and TCL_WRITA
5560: 42 4c 45 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 43  BLE */.    Tcl_C
5570: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20  hannel chan;.   
5580: 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74   DigestState *st
5590: 61 74 65 50 74 72 3b 0a 0a 20 20 20 20 64 70 72  atePtr;..    dpr
55a0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
55b0: 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 65  .    /* Validate
55c0: 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 69 66 20   args */.    if 
55d0: 28 63 68 61 6e 6e 65 6c 20 3d 3d 20 28 63 6f 6e  (channel == (con
55e0: 73 74 20 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  st char *) NULL)
55f0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
5600: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 6f  sult(interp, "No
5610: 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72   channel", (char
5620: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75   *) NULL);..retu
5630: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
5640: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
5650: 63 68 61 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20 20  channel Id */.  
5660: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
5670: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
5680: 63 68 61 6e 6e 65 6c 2c 20 26 6d 6f 64 65 29 3b  channel, &mode);
5690: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d  .    if (chan ==
56a0: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e   (Tcl_Channel) N
56b0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  ULL) {..return T
56c0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
56d0: 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
56e0: 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20  e to operate on 
56f0: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e  the topmost chan
5700: 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20  nel */.    chan 
5710: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e  = Tcl_GetTopChan
5720: 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20  nel(chan);..    
5730: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 20 63 68 61  /* Configure cha
5740: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  nnel */.    Tcl_
5750: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  SetChannelOption
5760: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22  (interp, chan, "
5770: 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22  -translation", "
5780: 62 69 6e 61 72 79 22 29 3b 0a 20 20 20 20 69 66  binary");.    if
5790: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c   (Tcl_GetChannel
57a0: 42 75 66 66 65 72 53 69 7a 65 28 63 68 61 6e 29  BufferSize(chan)
57b0: 20 3c 20 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49   < EVP_MAX_MD_SI
57c0: 5a 45 20 2a 20 32 29 20 7b 0a 09 54 63 6c 5f 53  ZE * 2) {..Tcl_S
57d0: 65 74 43 68 61 6e 6e 65 6c 42 75 66 66 65 72 53  etChannelBufferS
57e0: 69 7a 65 28 63 68 61 6e 2c 20 45 56 50 5f 4d 41  ize(chan, EVP_MA
57f0: 58 5f 4d 44 5f 53 49 5a 45 20 2a 20 32 29 3b 0a  X_MD_SIZE * 2);.
5800: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72      }..    /* Cr
5810: 65 61 74 65 20 73 74 61 74 65 20 64 61 74 61 20  eate state data 
5820: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20  structure */.   
5830: 20 69 66 20 28 28 73 74 61 74 65 50 74 72 20 3d   if ((statePtr =
5840: 20 44 69 67 65 73 74 53 74 61 74 65 4e 65 77 28   DigestStateNew(
5850: 69 6e 74 65 72 70 2c 20 66 6f 72 6d 61 74 29 29  interp, format))
5860: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c   == NULL) {..Tcl
5870: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
5880: 74 65 72 70 2c 20 22 4d 65 6d 6f 72 79 20 61 6c  terp, "Memory al
5890: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 22 2c  location error",
58a0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
58b0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
58c0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74  OR;.    }.    st
58d0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 63  atePtr->self = c
58e0: 68 61 6e 3b 0a 20 20 20 20 73 74 61 74 65 50 74  han;.    statePt
58f0: 72 2d 3e 6d 6f 64 65 20 3d 20 6d 6f 64 65 3b 0a  r->mode = mode;.
5900: 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  .    /* Initiali
5910: 7a 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e  ze hash function
5920: 20 2a 2f 0a 20 20 20 20 69 66 20 28 44 69 67 65   */.    if (Dige
5930: 73 74 49 6e 69 74 69 61 6c 69 7a 65 28 69 6e 74  stInitialize(int
5940: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 64  erp, statePtr, d
5950: 69 67 65 73 74 4f 62 6a 2c 20 63 69 70 68 65 72  igestObj, cipher
5960: 4f 62 6a 2c 20 6b 65 79 4f 62 6a 2c 20 6d 61 63  Obj, keyObj, mac
5970: 4f 62 6a 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  Obj) != TCL_OK) 
5980: 7b 0a 09 44 69 67 65 73 74 53 74 61 74 65 46 72  {..DigestStateFr
5990: 65 65 28 73 74 61 74 65 50 74 72 29 3b 0a 09 72  ee(statePtr);..r
59a0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
59b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
59c0: 74 61 63 6b 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  tack channel */.
59d0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 65      statePtr->se
59e0: 6c 66 20 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68  lf = Tcl_StackCh
59f0: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 26 64  annel(interp, &d
5a00: 69 67 65 73 74 43 68 61 6e 6e 65 6c 54 79 70 65  igestChannelType
5a10: 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73  , (ClientData) s
5a20: 74 61 74 65 50 74 72 2c 20 6d 6f 64 65 2c 20 63  tatePtr, mode, c
5a30: 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 73 74  han);.    if (st
5a40: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20  atePtr->self == 
5a50: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
5a60: 4c 4c 29 20 7b 0a 09 44 69 67 65 73 74 53 74 61  LL) {..DigestSta
5a70: 74 65 46 72 65 65 28 73 74 61 74 65 50 74 72 29  teFree(statePtr)
5a80: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
5a90: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
5aa0: 2f 2a 20 53 65 74 20 72 65 73 75 6c 74 20 74 6f  /* Set result to
5ab0: 20 63 68 61 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20   channel Id */. 
5ac0: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
5ad0: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
5ae0: 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  ) Tcl_GetChannel
5af0: 4e 61 6d 65 28 63 68 61 6e 29 2c 20 54 43 4c 5f  Name(chan), TCL_
5b00: 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72  VOLATILE);.    r
5b10: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
5b20: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
5b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
5b70: 20 2a 20 55 6e 73 74 61 63 6b 20 43 68 61 6e 6e   * Unstack Chann
5b80: 65 6c 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  el --. *. *.This
5b90: 20 66 75 6e 63 74 69 6f 6e 20 72 65 6d 6f 76 65   function remove
5ba0: 73 20 74 68 65 20 73 74 61 63 6b 65 64 20 63 68  s the stacked ch
5bb0: 61 6e 6e 65 6c 20 66 72 6f 6d 20 74 68 65 20 74  annel from the t
5bc0: 6f 70 20 6f 66 20 74 68 65 0a 20 2a 09 63 68 61  op of the. *.cha
5bd0: 6e 6e 65 6c 20 73 74 61 63 6b 20 69 66 20 69 74  nnel stack if it
5be0: 20 69 73 20 61 20 64 69 67 65 73 74 20 63 68 61   is a digest cha
5bf0: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 74 75  nnel.. *. * Retu
5c00: 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f  rns:. *.TCL_OK o
5c10: 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20  r TCL_ERROR. *. 
5c20: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
5c30: 20 2a 09 52 65 6d 6f 76 65 73 20 74 72 61 6e 73   *.Removes trans
5c40: 66 6f 72 6d 20 66 72 6f 6d 20 63 68 61 6e 6e 65  form from channe
5c50: 6c 20 6f 72 20 73 65 74 73 20 72 65 73 75 6c 74  l or sets result
5c60: 20 74 6f 20 65 72 72 6f 72 20 6d 65 73 73 61 67   to error messag
5c70: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  e.. *. *--------
5c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
5cc0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 69  */.static int Di
5cd0: 67 65 73 74 55 6e 73 74 61 63 6b 4f 62 6a 43 6d  gestUnstackObjCm
5ce0: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  d(ClientData cli
5cf0: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  entData, Tcl_Int
5d00: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
5d10: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
5d20: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a  const objv[]) {.
5d30: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20      Tcl_Channel 
5d40: 63 68 61 6e 3b 0a 20 20 20 20 69 6e 74 20 6d 6f  chan;.    int mo
5d50: 64 65 3b 20 2f 2a 20 4f 52 2d 65 64 20 63 6f 6d  de; /* OR-ed com
5d60: 62 69 6e 61 74 69 6f 6e 20 6f 66 20 54 43 4c 5f  bination of TCL_
5d70: 52 45 41 44 41 42 4c 45 20 61 6e 64 20 54 43 4c  READABLE and TCL
5d80: 5f 57 52 49 54 41 42 4c 45 20 20 2a 2f 0a 0a 20  _WRITABLE  */.. 
5d90: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
5da0: 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61  ed");..    /* Va
5db0: 6c 69 64 61 74 65 20 61 72 67 20 63 6f 75 6e 74  lidate arg count
5dc0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63   */.    if (objc
5dd0: 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72   != 2) {..Tcl_Wr
5de0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
5df0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61  p, 1, objv, "cha
5e00: 6e 6e 65 6c 49 64 22 29 3b 0a 09 72 65 74 75 72  nnelId");..retur
5e10: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
5e20: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63   }..    /* Get c
5e30: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68  hannel */.    ch
5e40: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e  an = Tcl_GetChan
5e50: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  nel(interp, Tcl_
5e60: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
5e70: 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c  (objv[1], NULL),
5e80: 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20   &mode);.    if 
5e90: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68  (chan == (Tcl_Ch
5ea0: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
5eb0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
5ec0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
5ed0: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65  Make sure to ope
5ee0: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d  rate on the topm
5ef0: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  ost channel */. 
5f00: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
5f10: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
5f20: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  );..    /* Check
5f30: 20 69 66 20 64 69 67 65 73 74 20 63 68 61 6e 6e   if digest chann
5f40: 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 63  el */.    if (Tc
5f50: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65  l_GetChannelType
5f60: 28 63 68 61 6e 29 20 21 3d 20 26 64 69 67 65 73  (chan) != &diges
5f70: 74 43 68 61 6e 6e 65 6c 54 79 70 65 29 20 7b 0a  tChannelType) {.
5f80: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
5f90: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63  t(interp, "bad c
5fa0: 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f  hannel \"", Tcl_
5fb0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63  GetChannelName(c
5fc0: 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20  han),..    "\": 
5fd0: 6e 6f 74 20 61 20 64 69 67 65 73 74 20 63 68 61  not a digest cha
5fe0: 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54  nnel", NULL);..T
5ff0: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
6000: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
6010: 55 4e 53 54 41 43 4b 22 2c 20 22 43 48 41 4e 4e  UNSTACK", "CHANN
6020: 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20  EL", "INVALID", 
6030: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
6040: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
6050: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
6060: 20 50 6f 70 20 74 72 61 6e 73 66 6f 72 6d 20 66   Pop transform f
6070: 72 6f 6d 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  rom channel */. 
6080: 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 55 6e     return Tcl_Un
6090: 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74  stackChannel(int
60a0: 65 72 70 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20  erp, chan);.    
60b0: 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c  .clientData = cl
60c0: 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 2a  ientData;.}../**
60d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
60e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
60f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6110: 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  */../*. *-------
6120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
6160: 20 2a 20 44 69 67 65 73 74 49 6e 73 74 61 6e 63   * DigestInstanc
6170: 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a  eObjCmd --. *. *
6180: 09 48 61 6e 64 6c 65 72 20 66 6f 72 20 64 69 67  .Handler for dig
6190: 65 73 74 20 63 6f 6d 6d 61 6e 64 20 69 6e 73 74  est command inst
61a0: 61 6e 63 65 73 2e 20 55 73 65 64 20 74 6f 20 61  ances. Used to a
61b0: 64 64 20 64 61 74 61 20 74 6f 20 68 61 73 68 0a  dd data to hash.
61c0: 20 2a 09 66 75 6e 63 74 69 6f 6e 20 6f 72 20 72   *.function or r
61d0: 65 74 72 69 65 76 65 20 6d 65 73 73 61 67 65 20  etrieve message 
61e0: 64 69 67 65 73 74 2e 0a 20 2a 0a 20 2a 20 52 65  digest.. *. * Re
61f0: 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b  turns:. *.TCL_OK
6200: 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a   or TCL_ERROR. *
6210: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
6220: 3a 0a 20 2a 09 41 64 64 73 20 64 61 74 61 20 74  :. *.Adds data t
6230: 6f 20 68 61 73 68 20 6f 72 20 72 65 74 75 72 6e  o hash or return
6240: 73 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74  s message digest
6250: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
6260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e  ---------. */.in
62a0: 74 20 44 69 67 65 73 74 49 6e 73 74 61 6e 63 65  t DigestInstance
62b0: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74  ObjCmd(ClientDat
62c0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63  a clientData, Tc
62d0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
62e0: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f  , int objc, Tcl_
62f0: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b  Obj *const objv[
6300: 5d 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53  ]) {.    DigestS
6310: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
6320: 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 29   (DigestState *)
6330: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20   clientData;.   
6340: 20 69 6e 74 20 66 6e 2c 20 64 61 74 61 5f 6c 65   int fn, data_le
6350: 6e 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20  n = 0;.    char 
6360: 2a 64 61 74 61 20 3d 20 4e 55 4c 4c 3b 0a 20 20  *data = NULL;.  
6370: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
6380: 68 61 72 20 2a 69 6e 73 74 61 6e 63 65 5f 66 6e  har *instance_fn
6390: 73 20 5b 5d 20 3d 20 7b 20 22 66 69 6e 61 6c 69  s [] = { "finali
63a0: 7a 65 22 2c 20 22 75 70 64 61 74 65 22 2c 20 4e  ze", "update", N
63b0: 55 4c 4c 20 7d 3b 0a 0a 20 20 20 20 64 70 72 69  ULL };..    dpri
63c0: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
63d0: 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 65 20      /* Validate 
63e0: 61 72 67 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20  arg count */.   
63f0: 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 20 7c 7c   if (objc < 2 ||
6400: 20 6f 62 6a 63 20 3e 20 33 29 20 7b 0a 09 54 63   objc > 3) {..Tc
6410: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
6420: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
6430: 22 66 75 6e 63 74 69 6f 6e 20 3f 64 61 74 61 3f  "function ?data?
6440: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ");..return TCL_
6450: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
6460: 20 20 2f 2a 20 47 65 74 20 66 75 6e 63 74 69 6f    /* Get functio
6470: 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c  n */.    if (Tcl
6480: 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a  _GetIndexFromObj
6490: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d  (interp, objv[1]
64a0: 2c 20 69 6e 73 74 61 6e 63 65 5f 66 6e 73 2c 20  , instance_fns, 
64b0: 22 66 75 6e 63 74 69 6f 6e 22 2c 20 30 2c 20 26  "function", 0, &
64c0: 66 6e 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  fn) != TCL_OK) {
64d0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
64e0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
64f0: 2a 20 44 6f 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  * Do function */
6500: 0a 20 20 20 20 69 66 20 28 66 6e 29 20 7b 0a 09  .    if (fn) {..
6510: 2f 2a 20 47 65 74 20 64 61 74 61 20 6f 72 20 72  /* Get data or r
6520: 65 74 75 72 6e 20 65 72 72 6f 72 20 69 66 20 6e  eturn error if n
6530: 6f 6e 65 20 2a 2f 0a 09 69 66 20 28 6f 62 6a 63  one */..if (objc
6540: 20 3d 3d 20 33 29 20 7b 0a 09 20 20 20 20 64 61   == 3) {..    da
6550: 74 61 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65  ta = Tcl_GetByte
6560: 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a  ArrayFromObj(obj
6570: 76 5b 32 5d 2c 20 26 64 61 74 61 5f 6c 65 6e 29  v[2], &data_len)
6580: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20  ;..} else {..   
6590: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
65a0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
65b0: 76 2c 20 22 75 70 64 61 74 65 20 64 61 74 61 22  v, "update data"
65c0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
65d0: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f  CL_ERROR;..}.../
65e0: 2a 20 55 70 64 61 74 65 20 68 61 73 68 20 66 75  * Update hash fu
65f0: 6e 63 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 44  nction */..if (D
6600: 69 67 65 73 74 55 70 64 61 74 65 28 73 74 61 74  igestUpdate(stat
6610: 65 50 74 72 2c 20 64 61 74 61 2c 20 28 73 69 7a  ePtr, data, (siz
6620: 65 5f 74 29 20 64 61 74 61 5f 6c 65 6e 2c 20 31  e_t) data_len, 1
6630: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
6640: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
6650: 52 52 4f 52 3b 0a 09 7d 0a 0a 20 20 20 20 7d 20  RROR;..}..    } 
6660: 65 6c 73 65 20 7b 0a 09 2f 2a 20 46 69 6e 61 6c  else {../* Final
6670: 69 7a 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f  ize hash functio
6680: 6e 20 61 6e 64 20 63 61 6c 63 75 6c 61 74 65 20  n and calculate 
6690: 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20 2a  message digest *
66a0: 2f 0a 09 69 66 20 28 44 69 67 65 73 74 46 69 6e  /..if (DigestFin
66b0: 61 6c 69 7a 65 28 69 6e 74 65 72 70 2c 20 73 74  alize(interp, st
66c0: 61 74 65 50 74 72 2c 20 4e 55 4c 4c 29 20 21 3d  atePtr, NULL) !=
66d0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20   TCL_OK) {..    
66e0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
66f0: 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 44 65 6c 65 74  ;..}...Tcl_Delet
6700: 65 43 6f 6d 6d 61 6e 64 46 72 6f 6d 54 6f 6b 65  eCommandFromToke
6710: 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50  n(interp, stateP
6720: 74 72 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20  tr->token);.    
6730: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  }.    return TCL
6740: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  _OK;.}../*. *---
6750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6790: 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 43 6f 6d  . *. * DigestCom
67a0: 6d 61 6e 64 44 65 6c 65 74 65 48 61 6e 64 6c 65  mandDeleteHandle
67b0: 72 20 2d 2d 0a 20 2a 0a 20 2a 09 20 43 61 6c 6c  r --. *. *. Call
67c0: 62 61 63 6b 20 74 6f 20 63 6c 65 61 6e 2d 75 70  back to clean-up
67d0: 20 77 68 65 6e 20 64 69 67 65 73 74 20 69 6e 73   when digest ins
67e0: 74 61 6e 63 65 20 63 6f 6d 6d 61 6e 64 20 69 73  tance command is
67f0: 20 64 65 6c 65 74 65 64 2e 0a 20 2a 0a 20 2a 20   deleted.. *. * 
6800: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 4e 6f 74 68  Returns:. *.Noth
6810: 69 6e 67 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ing. *. * Side e
6820: 66 66 65 63 74 73 3a 0a 20 2a 09 44 65 73 74 72  ffects:. *.Destr
6830: 6f 79 73 20 73 74 61 74 65 20 69 6e 66 6f 20 73  oys state info s
6840: 74 72 75 63 74 75 72 65 0a 20 2a 0a 20 2a 2d 2d  tructure. *. *--
6850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6890: 2d 0a 20 2a 2f 0a 76 6f 69 64 20 44 69 67 65 73  -. */.void Diges
68a0: 74 43 6f 6d 6d 61 6e 64 44 65 6c 65 74 65 48 61  tCommandDeleteHa
68b0: 6e 64 6c 65 72 28 43 6c 69 65 6e 74 44 61 74 61  ndler(ClientData
68c0: 20 63 6c 69 65 6e 74 44 61 74 61 29 20 7b 0a 20   clientData) {. 
68d0: 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a     DigestState *
68e0: 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65  statePtr = (Dige
68f0: 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e  stState *) clien
6900: 74 44 61 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 43  tData;..    /* C
6910: 6c 65 61 6e 2d 75 70 20 2a 2f 0a 20 20 20 20 44  lean-up */.    D
6920: 69 67 65 73 74 53 74 61 74 65 46 72 65 65 28 73  igestStateFree(s
6930: 74 61 74 65 50 74 72 29 3b 0a 7d 0a 0a 2f 2a 0a  tatePtr);.}../*.
6940: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
6950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6980: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65  -----. *. * Dige
6990: 73 74 43 6f 6d 6d 61 6e 64 48 61 6e 64 6c 65 72  stCommandHandler
69a0: 20 2d 2d 0a 20 2a 0a 20 2a 09 20 43 72 65 61 74   --. *. *. Creat
69b0: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 61 6c 6c  e command to all
69c0: 6f 77 20 75 73 65 72 20 74 6f 20 61 64 64 20 64  ow user to add d
69d0: 61 74 61 20 74 6f 20 68 61 73 68 20 66 75 6e 63  ata to hash func
69e0: 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 75  tion.. *. * Retu
69f0: 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f  rns:. *.TCL_OK o
6a00: 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20  r TCL_ERROR. *. 
6a10: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
6a20: 20 2a 09 43 72 65 61 74 65 73 20 63 6f 6d 6d 61   *.Creates comma
6a30: 6e 64 20 6f 72 20 65 72 72 6f 72 20 6d 65 73 73  nd or error mess
6a40: 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  age. *. *-------
6a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
6a90: 0a 69 6e 74 20 44 69 67 65 73 74 43 6f 6d 6d 61  .int DigestComma
6aa0: 6e 64 48 61 6e 64 6c 65 72 28 54 63 6c 5f 49 6e  ndHandler(Tcl_In
6ab0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 63  terp *interp, Tc
6ac0: 6c 5f 4f 62 6a 20 2a 63 6d 64 4f 62 6a 2c 20 54  l_Obj *cmdObj, T
6ad0: 63 6c 5f 4f 62 6a 20 2a 64 69 67 65 73 74 4f 62  cl_Obj *digestOb
6ae0: 6a 2c 0a 09 54 63 6c 5f 4f 62 6a 20 2a 63 69 70  j,..Tcl_Obj *cip
6af0: 68 65 72 4f 62 6a 2c 20 69 6e 74 20 66 6f 72 6d  herObj, int form
6b00: 61 74 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79  at, Tcl_Obj *key
6b10: 4f 62 6a 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6d 61  Obj, Tcl_Obj *ma
6b20: 63 4f 62 6a 29 20 7b 0a 20 20 20 20 44 69 67 65  cObj) {.    Dige
6b30: 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74  stState *statePt
6b40: 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 6d 64  r;.    char *cmd
6b50: 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Name = Tcl_GetSt
6b60: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 63 6d 64 4f  ringFromObj(cmdO
6b70: 62 6a 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20  bj, NULL);..    
6b80: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
6b90: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  );..    /* Creat
6ba0: 65 20 73 74 61 74 65 20 64 61 74 61 20 73 74 72  e state data str
6bb0: 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 69 66  ucture */.    if
6bc0: 20 28 28 73 74 61 74 65 50 74 72 20 3d 20 44 69   ((statePtr = Di
6bd0: 67 65 73 74 53 74 61 74 65 4e 65 77 28 69 6e 74  gestStateNew(int
6be0: 65 72 70 2c 20 66 6f 72 6d 61 74 29 29 20 3d 3d  erp, format)) ==
6bf0: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70   NULL) {..Tcl_Ap
6c00: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
6c10: 70 2c 20 22 4d 65 6d 6f 72 79 20 61 6c 6c 6f 63  p, "Memory alloc
6c20: 61 74 69 6f 6e 20 65 72 72 6f 72 22 2c 20 28 63  ation error", (c
6c30: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72  har *) NULL);..r
6c40: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
6c50: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
6c60: 6e 69 74 69 61 6c 69 7a 65 20 68 61 73 68 20 66  nitialize hash f
6c70: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69  unction */.    i
6c80: 66 20 28 44 69 67 65 73 74 49 6e 69 74 69 61 6c  f (DigestInitial
6c90: 69 7a 65 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ize(interp, stat
6ca0: 65 50 74 72 2c 20 64 69 67 65 73 74 4f 62 6a 2c  ePtr, digestObj,
6cb0: 20 63 69 70 68 65 72 4f 62 6a 2c 20 6b 65 79 4f   cipherObj, keyO
6cc0: 62 6a 2c 20 6d 61 63 4f 62 6a 29 20 21 3d 20 54  bj, macObj) != T
6cd0: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e  CL_OK) {..return
6ce0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
6cf0: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  }..    /* Create
6d00: 20 69 6e 73 74 61 6e 63 65 20 63 6f 6d 6d 61 6e   instance comman
6d10: 64 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74  d */.    statePt
6d20: 72 2d 3e 74 6f 6b 65 6e 20 3d 20 54 63 6c 5f 43  r->token = Tcl_C
6d30: 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
6d40: 69 6e 74 65 72 70 2c 20 63 6d 64 4e 61 6d 65 2c  interp, cmdName,
6d50: 20 44 69 67 65 73 74 49 6e 73 74 61 6e 63 65 4f   DigestInstanceO
6d60: 62 6a 43 6d 64 2c 0a 09 28 43 6c 69 65 6e 74 44  bjCmd,..(ClientD
6d70: 61 74 61 29 20 73 74 61 74 65 50 74 72 2c 20 44  ata) statePtr, D
6d80: 69 67 65 73 74 43 6f 6d 6d 61 6e 64 44 65 6c 65  igestCommandDele
6d90: 74 65 48 61 6e 64 6c 65 72 29 3b 0a 20 20 20 20  teHandler);.    
6da0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 6f  if (statePtr->to
6db0: 6b 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ken == NULL) {..
6dc0: 44 69 67 65 73 74 53 74 61 74 65 46 72 65 65 28  DigestStateFree(
6dd0: 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75  statePtr);..retu
6de0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
6df0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 74 75    }..    /* Retu
6e00: 72 6e 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20  rn command name 
6e10: 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  */.    Tcl_SetOb
6e20: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
6e30: 63 6d 64 4f 62 6a 29 3b 0a 20 20 20 20 72 65 74  cmdObj);.    ret
6e40: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
6e50: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
6e60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6e70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6e80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6e90: 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  ****/../*. *----
6ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
6ee0: 20 2a 0a 20 2a 20 44 69 67 65 73 74 44 61 74 61   *. * DigestData
6ef0: 48 61 6e 64 6c 65 72 20 2d 2d 0a 20 2a 0a 20 2a  Handler --. *. *
6f00: 09 52 65 74 75 72 6e 20 6d 65 73 73 61 67 65 20  .Return message 
6f10: 64 69 67 65 73 74 20 66 6f 72 20 64 61 74 61 20  digest for data 
6f20: 75 73 69 6e 67 20 75 73 65 72 20 73 70 65 63 69  using user speci
6f30: 66 69 65 64 20 68 61 73 68 20 66 75 6e 63 74 69  fied hash functi
6f40: 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  on.. *. * Return
6f50: 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20  s:. *.TCL_OK or 
6f60: 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20  TCL_ERROR. *. * 
6f70: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
6f80: 09 53 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20  .Sets result to 
6f90: 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20 6f  message digest o
6fa0: 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  r error message.
6fb0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
6fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ff0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74  --------. */.int
7000: 20 44 69 67 65 73 74 44 61 74 61 48 61 6e 64 6c   DigestDataHandl
7010: 65 72 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  er(Tcl_Interp *i
7020: 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a  nterp, Tcl_Obj *
7030: 64 61 74 61 4f 62 6a 2c 20 54 63 6c 5f 4f 62 6a  dataObj, Tcl_Obj
7040: 20 2a 64 69 67 65 73 74 4f 62 6a 2c 0a 09 54 63   *digestObj,..Tc
7050: 6c 5f 4f 62 6a 20 2a 63 69 70 68 65 72 4f 62 6a  l_Obj *cipherObj
7060: 2c 20 69 6e 74 20 66 6f 72 6d 61 74 2c 20 54 63  , int format, Tc
7070: 6c 5f 4f 62 6a 20 2a 6b 65 79 4f 62 6a 2c 20 54  l_Obj *keyObj, T
7080: 63 6c 5f 4f 62 6a 20 2a 6d 61 63 4f 62 6a 29 20  cl_Obj *macObj) 
7090: 7b 0a 20 20 20 20 63 68 61 72 20 2a 64 61 74 61  {.    char *data
70a0: 3b 0a 20 20 20 20 69 6e 74 20 64 61 74 61 5f 6c  ;.    int data_l
70b0: 65 6e 3b 0a 20 20 20 20 44 69 67 65 73 74 53 74  en;.    DigestSt
70c0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 0a  ate *statePtr;..
70d0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
70e0: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 47  led");..    /* G
70f0: 65 74 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 64  et data */.    d
7100: 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  ata = Tcl_GetByt
7110: 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 64 61  eArrayFromObj(da
7120: 74 61 4f 62 6a 2c 20 26 64 61 74 61 5f 6c 65 6e  taObj, &data_len
7130: 29 3b 0a 20 20 20 20 69 66 20 28 64 61 74 61 20  );.    if (data 
7140: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f  == NULL) {..Tcl_
7150: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
7160: 2c 20 22 4e 6f 20 64 61 74 61 22 2c 20 4e 55 4c  , "No data", NUL
7170: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  L);..return TCL_
7180: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
7190: 20 20 2f 2a 20 43 72 65 61 74 65 20 73 74 61 74    /* Create stat
71a0: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
71b0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 73 74 61   */.    if ((sta
71c0: 74 65 50 74 72 20 3d 20 44 69 67 65 73 74 53 74  tePtr = DigestSt
71d0: 61 74 65 4e 65 77 28 69 6e 74 65 72 70 2c 20 66  ateNew(interp, f
71e0: 6f 72 6d 61 74 29 29 20 3d 3d 20 4e 55 4c 4c 29  ormat)) == NULL)
71f0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
7200: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4d 65  sult(interp, "Me
7210: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
7220: 65 72 72 6f 72 22 2c 20 28 63 68 61 72 20 2a 29  error", (char *)
7230: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
7240: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
7250: 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 63 20 44 69  ..    /* Calc Di
7260: 67 65 73 74 20 2a 2f 0a 20 20 20 20 69 66 20 28  gest */.    if (
7270: 44 69 67 65 73 74 49 6e 69 74 69 61 6c 69 7a 65  DigestInitialize
7280: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
7290: 72 2c 20 64 69 67 65 73 74 4f 62 6a 2c 20 63 69  r, digestObj, ci
72a0: 70 68 65 72 4f 62 6a 2c 20 6b 65 79 4f 62 6a 2c  pherObj, keyObj,
72b0: 20 6d 61 63 4f 62 6a 29 20 21 3d 20 54 43 4c 5f   macObj) != TCL_
72c0: 4f 4b 20 7c 7c 0a 09 44 69 67 65 73 74 55 70 64  OK ||..DigestUpd
72d0: 61 74 65 28 73 74 61 74 65 50 74 72 2c 20 64 61  ate(statePtr, da
72e0: 74 61 2c 20 28 73 69 7a 65 5f 74 29 20 64 61 74  ta, (size_t) dat
72f0: 61 5f 6c 65 6e 2c 20 31 29 20 21 3d 20 54 43 4c  a_len, 1) != TCL
7300: 5f 4f 4b 20 7c 7c 0a 09 44 69 67 65 73 74 46 69  _OK ||..DigestFi
7310: 6e 61 6c 69 7a 65 28 69 6e 74 65 72 70 2c 20 73  nalize(interp, s
7320: 74 61 74 65 50 74 72 2c 20 4e 55 4c 4c 29 20 21  tatePtr, NULL) !
7330: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 44 69 67  = TCL_OK) {..Dig
7340: 65 73 74 53 74 61 74 65 46 72 65 65 28 73 74 61  estStateFree(sta
7350: 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20  tePtr);..return 
7360: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
7370: 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 6e 2d 75  ..    /* Clean-u
7380: 70 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 53  p */.    DigestS
7390: 74 61 74 65 46 72 65 65 28 73 74 61 74 65 50 74  tateFree(statePt
73a0: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  r);.    return T
73b0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a  CL_OK;.}../*****
73c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
73d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
73e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
73f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
7400: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
7410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
7450: 44 69 67 65 73 74 46 69 6c 65 48 61 6e 64 6c 65  DigestFileHandle
7460: 72 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 75 72  r --. *. *.Retur
7470: 6e 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74  n message digest
7480: 20 66 6f 72 20 66 69 6c 65 20 75 73 69 6e 67 20   for file using 
7490: 75 73 65 72 20 73 70 65 63 69 66 69 65 64 20 68  user specified h
74a0: 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a  ash function.. *
74b0: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09  . * Returns:. *.
74c0: 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52  TCL_OK or TCL_ER
74d0: 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ROR. *. * Side e
74e0: 66 66 65 63 74 73 3a 0a 20 2a 09 52 65 73 75 6c  ffects:. *.Resul
74f0: 74 20 69 73 20 6d 65 73 73 61 67 65 20 64 69 67  t is message dig
7500: 65 73 74 20 6f 72 20 65 72 72 6f 72 20 6d 65 73  est or error mes
7510: 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  sage. *. *------
7520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
7560: 2f 0a 69 6e 74 20 44 69 67 65 73 74 46 69 6c 65  /.int DigestFile
7570: 48 61 6e 64 6c 65 72 28 54 63 6c 5f 49 6e 74 65  Handler(Tcl_Inte
7580: 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f  rp *interp, Tcl_
7590: 4f 62 6a 20 2a 69 6e 46 69 6c 65 4f 62 6a 2c 20  Obj *inFileObj, 
75a0: 54 63 6c 5f 4f 62 6a 20 2a 64 69 67 65 73 74 4f  Tcl_Obj *digestO
75b0: 62 6a 2c 0a 09 54 63 6c 5f 4f 62 6a 20 2a 63 69  bj,..Tcl_Obj *ci
75c0: 70 68 65 72 4f 62 6a 2c 20 69 6e 74 20 66 6f 72  pherObj, int for
75d0: 6d 61 74 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6b 65  mat, Tcl_Obj *ke
75e0: 79 4f 62 6a 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6d  yObj, Tcl_Obj *m
75f0: 61 63 4f 62 6a 29 20 7b 0a 20 20 20 20 44 69 67  acObj) {.    Dig
7600: 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50  estState *stateP
7610: 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  tr;.    Tcl_Chan
7620: 6e 65 6c 20 63 68 61 6e 20 3d 20 4e 55 4c 4c 3b  nel chan = NULL;
7630: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
7640: 61 72 20 62 75 66 5b 42 55 46 46 45 52 5f 53 49  ar buf[BUFFER_SI
7650: 5a 45 5d 3b 0a 20 20 20 20 69 6e 74 20 72 65 73  ZE];.    int res
7660: 20 3d 20 54 43 4c 5f 4f 4b 2c 20 6c 65 6e 3b 0a   = TCL_OK, len;.
7670: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
7680: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20  lled");..    /* 
7690: 43 72 65 61 74 65 20 73 74 61 74 65 20 64 61 74  Create state dat
76a0: 61 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  a structure */. 
76b0: 20 20 20 69 66 20 28 28 73 74 61 74 65 50 74 72     if ((statePtr
76c0: 20 3d 20 44 69 67 65 73 74 53 74 61 74 65 4e 65   = DigestStateNe
76d0: 77 28 69 6e 74 65 72 70 2c 20 66 6f 72 6d 61 74  w(interp, format
76e0: 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54  )) == NULL) {..T
76f0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
7700: 69 6e 74 65 72 70 2c 20 22 4d 65 6d 6f 72 79 20  interp, "Memory 
7710: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
7720: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
7730: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
7740: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
7750: 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 63 68   /* Open file ch
7760: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61  annel */.    cha
7770: 6e 20 3d 20 54 63 6c 5f 46 53 4f 70 65 6e 46 69  n = Tcl_FSOpenFi
7780: 6c 65 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  leChannel(interp
7790: 2c 20 69 6e 46 69 6c 65 4f 62 6a 2c 20 22 72 62  , inFileObj, "rb
77a0: 22 2c 20 30 34 34 34 29 3b 0a 20 20 20 20 69 66  ", 0444);.    if
77b0: 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43   (chan == (Tcl_C
77c0: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a  hannel) NULL) {.
77d0: 09 44 69 67 65 73 74 53 74 61 74 65 46 72 65 65  .DigestStateFree
77e0: 28 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74  (statePtr);..ret
77f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
7800: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e     }..    /* Con
7810: 66 69 67 75 72 65 20 63 68 61 6e 6e 65 6c 20 2a  figure channel *
7820: 2f 0a 20 20 20 20 69 66 20 28 28 72 65 73 20 3d  /.    if ((res =
7830: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_SetChannelO
7840: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68  ption(interp, ch
7850: 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f  an, "-translatio
7860: 6e 22 2c 20 22 62 69 6e 61 72 79 22 29 29 20 21  n", "binary")) !
7870: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 67 6f 74  = TCL_OK) {..got
7880: 6f 20 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20  o done;.    }.  
7890: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c    Tcl_SetChannel
78a0: 42 75 66 66 65 72 53 69 7a 65 28 63 68 61 6e 2c  BufferSize(chan,
78b0: 20 42 55 46 46 45 52 5f 53 49 5a 45 29 3b 0a 0a   BUFFER_SIZE);..
78c0: 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
78d0: 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20  e hash function 
78e0: 2a 2f 0a 20 20 20 20 69 66 20 28 28 72 65 73 20  */.    if ((res 
78f0: 3d 20 44 69 67 65 73 74 49 6e 69 74 69 61 6c 69  = DigestInitiali
7900: 7a 65 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  ze(interp, state
7910: 50 74 72 2c 20 64 69 67 65 73 74 4f 62 6a 2c 20  Ptr, digestObj, 
7920: 63 69 70 68 65 72 4f 62 6a 2c 20 6b 65 79 4f 62  cipherObj, keyOb
7930: 6a 2c 20 6d 61 63 4f 62 6a 29 29 20 21 3d 20 54  j, macObj)) != T
7940: 43 4c 5f 4f 4b 29 20 7b 0a 09 67 6f 74 6f 20 64  CL_OK) {..goto d
7950: 6f 6e 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  one;.    }..    
7960: 2f 2a 20 52 65 61 64 20 66 69 6c 65 20 64 61 74  /* Read file dat
7970: 61 20 61 6e 64 20 75 70 64 61 74 65 20 68 61 73  a and update has
7980: 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  h function */.  
7990: 20 20 77 68 69 6c 65 20 28 21 54 63 6c 5f 45 6f    while (!Tcl_Eo
79a0: 66 28 63 68 61 6e 29 29 20 7b 0a 09 6c 65 6e 20  f(chan)) {..len 
79b0: 3d 20 54 63 6c 5f 52 65 61 64 52 61 77 28 63 68  = Tcl_ReadRaw(ch
79c0: 61 6e 2c 20 28 63 68 61 72 20 2a 29 20 62 75 66  an, (char *) buf
79d0: 2c 20 42 55 46 46 45 52 5f 53 49 5a 45 29 3b 0a  , BUFFER_SIZE);.
79e0: 09 69 66 20 28 6c 65 6e 20 3e 20 30 29 20 7b 0a  .if (len > 0) {.
79f0: 09 20 20 20 20 69 66 20 28 28 72 65 73 20 3d 20  .    if ((res = 
7a00: 44 69 67 65 73 74 55 70 64 61 74 65 28 73 74 61  DigestUpdate(sta
7a10: 74 65 50 74 72 2c 20 26 62 75 66 5b 30 5d 2c 20  tePtr, &buf[0], 
7a20: 28 73 69 7a 65 5f 74 29 20 6c 65 6e 2c 20 31 29  (size_t) len, 1)
7a30: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
7a40: 09 67 6f 74 6f 20 64 6f 6e 65 3b 0a 09 20 20 20  .goto done;..   
7a50: 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20   }..}.    }..   
7a60: 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 68 61 73   /* Finalize has
7a70: 68 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 63  h function and c
7a80: 61 6c 63 75 6c 61 74 65 20 6d 65 73 73 61 67 65  alculate message
7a90: 20 64 69 67 65 73 74 20 2a 2f 0a 20 20 20 20 72   digest */.    r
7aa0: 65 73 20 3d 20 44 69 67 65 73 74 46 69 6e 61 6c  es = DigestFinal
7ab0: 69 7a 65 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ize(interp, stat
7ac0: 65 50 74 72 2c 20 4e 55 4c 4c 29 3b 0a 0a 64 6f  ePtr, NULL);..do
7ad0: 6e 65 3a 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65  ne:.    /* Close
7ae0: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20   channel */.    
7af0: 69 66 20 28 54 63 6c 5f 43 6c 6f 73 65 28 69 6e  if (Tcl_Close(in
7b00: 74 65 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54  terp, chan) == T
7b10: 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 72 65 73  CL_ERROR) {..res
7b20: 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20   = TCL_ERROR;.  
7b30: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61    }..    /* Clea
7b40: 6e 2d 75 70 20 2a 2f 0a 20 20 20 20 44 69 67 65  n-up */.    Dige
7b50: 73 74 53 74 61 74 65 46 72 65 65 28 73 74 61 74  stStateFree(stat
7b60: 65 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ePtr);.    retur
7b70: 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a  n res;.}../*****
7b80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7b90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7bb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
7bc0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
7bd0: 61 72 20 2a 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73  ar *command_opts
7be0: 20 5b 5d 20 3d 20 7b 20 22 2d 62 69 6e 22 2c 20   [] = { "-bin", 
7bf0: 22 2d 62 69 6e 61 72 79 22 2c 20 22 2d 68 65 78  "-binary", "-hex
7c00: 22 2c 20 22 2d 68 65 78 61 64 65 63 69 6d 61 6c  ", "-hexadecimal
7c10: 22 2c 0a 20 20 20 20 22 2d 63 68 61 6e 22 2c 20  ",.    "-chan", 
7c20: 22 2d 63 68 61 6e 6e 65 6c 22 2c 20 22 2d 63 69  "-channel", "-ci
7c30: 70 68 65 72 22 2c 20 22 2d 63 6f 6d 6d 61 6e 64  pher", "-command
7c40: 22 2c 20 22 2d 64 61 74 61 22 2c 20 22 2d 64 69  ", "-data", "-di
7c50: 67 65 73 74 22 2c 20 22 2d 66 69 6c 65 22 2c 20  gest", "-file", 
7c60: 22 2d 66 69 6c 65 6e 61 6d 65 22 2c 0a 20 20 20  "-filename",.   
7c70: 20 22 2d 68 61 73 68 22 2c 20 22 2d 6b 65 79 22   "-hash", "-key"
7c80: 2c 20 22 2d 6d 61 63 22 2c 20 4e 55 4c 4c 7d 3b  , "-mac", NULL};
7c90: 0a 0a 65 6e 75 6d 20 5f 63 6f 6d 6d 61 6e 64 5f  ..enum _command_
7ca0: 6f 70 74 73 20 7b 0a 20 20 20 20 5f 6f 70 74 5f  opts {.    _opt_
7cb0: 62 69 6e 2c 20 5f 6f 70 74 5f 62 69 6e 61 72 79  bin, _opt_binary
7cc0: 2c 20 5f 6f 70 74 5f 68 65 78 2c 20 5f 6f 70 74  , _opt_hex, _opt
7cd0: 5f 68 65 78 61 64 65 63 69 6d 61 6c 2c 20 5f 6f  _hexadecimal, _o
7ce0: 70 74 5f 63 68 61 6e 2c 20 5f 6f 70 74 5f 63 68  pt_chan, _opt_ch
7cf0: 61 6e 6e 65 6c 2c 20 5f 6f 70 74 5f 63 69 70 68  annel, _opt_ciph
7d00: 65 72 2c 0a 20 20 20 20 5f 6f 70 74 5f 63 6f 6d  er,.    _opt_com
7d10: 6d 61 6e 64 2c 20 5f 6f 70 74 5f 64 61 74 61 2c  mand, _opt_data,
7d20: 20 5f 6f 70 74 5f 64 69 67 65 73 74 2c 20 5f 6f   _opt_digest, _o
7d30: 70 74 5f 66 69 6c 65 2c 20 5f 6f 70 74 5f 66 69  pt_file, _opt_fi
7d40: 6c 65 6e 61 6d 65 2c 20 5f 6f 70 74 5f 68 61 73  lename, _opt_has
7d50: 68 2c 20 5f 6f 70 74 5f 6b 65 79 2c 20 5f 6f 70  h, _opt_key, _op
7d60: 74 5f 6d 61 63 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2d  t_mac.};../*. *-
7d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7db0: 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 4d  --. *. * DigestM
7dc0: 61 69 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74  ain --. *. *.Ret
7dd0: 75 72 6e 20 6d 65 73 73 61 67 65 20 64 69 67 65  urn message dige
7de0: 73 74 20 6f 72 20 4d 65 73 73 61 67 65 20 41 75  st or Message Au
7df0: 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 43 6f 64  thentication Cod
7e00: 65 20 28 4d 41 43 29 20 6f 66 0a 20 2a 09 64 61  e (MAC) of. *.da
7e10: 74 61 20 75 73 69 6e 67 20 75 73 65 72 20 73 70  ta using user sp
7e20: 65 63 69 66 69 65 64 20 68 61 73 68 20 66 75 6e  ecified hash fun
7e30: 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74  ction.. *. * Ret
7e40: 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20  urns:. *.TCL_OK 
7e50: 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a  or TCL_ERROR. *.
7e60: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
7e70: 0a 20 2a 09 53 65 74 73 20 72 65 73 75 6c 74 20  . *.Sets result 
7e80: 74 6f 20 6d 65 73 73 61 67 65 20 64 69 67 65 73  to message diges
7e90: 74 20 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61  t or error messa
7ea0: 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  ge. *. *--------
7eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
7ef0: 73 74 61 74 69 63 20 69 6e 74 20 44 69 67 65 73  static int Diges
7f00: 74 4d 61 69 6e 28 69 6e 74 20 74 79 70 65 2c 20  tMain(int type, 
7f10: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
7f20: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
7f30: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
7f40: 76 5b 5d 29 20 7b 0a 20 20 20 20 69 6e 74 20 73  v[]) {.    int s
7f50: 74 61 72 74 20 3d 20 31 2c 20 66 6f 72 6d 61 74  tart = 1, format
7f60: 20 3d 20 48 45 58 5f 46 4f 52 4d 41 54 2c 20 72   = HEX_FORMAT, r
7f70: 65 73 20 3d 20 54 43 4c 5f 4f 4b 2c 20 66 6e 3b  es = TCL_OK, fn;
7f80: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 69  .    Tcl_Obj *ci
7f90: 70 68 65 72 4f 62 6a 20 3d 20 4e 55 4c 4c 2c 20  pherObj = NULL, 
7fa0: 2a 63 6d 64 4f 62 6a 20 3d 20 4e 55 4c 4c 2c 20  *cmdObj = NULL, 
7fb0: 2a 64 61 74 61 4f 62 6a 20 3d 20 4e 55 4c 4c 2c  *dataObj = NULL,
7fc0: 20 2a 64 69 67 65 73 74 4f 62 6a 20 3d 20 4e 55   *digestObj = NU
7fd0: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  LL;.    Tcl_Obj 
7fe0: 2a 66 69 6c 65 4f 62 6a 20 3d 20 4e 55 4c 4c 2c  *fileObj = NULL,
7ff0: 20 2a 6b 65 79 4f 62 6a 20 3d 20 4e 55 4c 4c 2c   *keyObj = NULL,
8000: 20 2a 6d 61 63 4f 62 6a 20 3d 20 4e 55 4c 4c 3b   *macObj = NULL;
8010: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
8020: 2a 63 68 61 6e 6e 65 6c 20 3d 20 4e 55 4c 4c 2c  *channel = NULL,
8030: 20 2a 6f 70 74 3b 0a 0a 20 20 20 20 64 70 72 69   *opt;..    dpri
8040: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
8050: 20 20 20 20 2f 2a 20 43 6c 65 61 72 20 69 6e 74      /* Clear int
8060: 65 72 70 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  erp result */.  
8070: 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c    Tcl_ResetResul
8080: 74 28 69 6e 74 65 72 70 29 3b 0a 0a 20 20 20 20  t(interp);..    
8090: 2f 2a 20 56 61 6c 69 64 61 74 65 20 61 72 67 20  /* Validate arg 
80a0: 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20  count */.    if 
80b0: 28 6f 62 6a 63 20 3c 20 33 20 7c 7c 20 6f 62 6a  (objc < 3 || obj
80c0: 63 20 3e 20 31 32 29 20 7b 0a 09 54 63 6c 5f 57  c > 12) {..Tcl_W
80d0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
80e0: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d  rp, 1, objv, "?-
80f0: 62 69 6e 7c 2d 68 65 78 3f 20 3f 2d 63 69 70 68  bin|-hex? ?-ciph
8100: 65 72 20 6e 61 6d 65 3f 20 3f 2d 64 69 67 65 73  er name? ?-diges
8110: 74 20 6e 61 6d 65 3f 20 3f 2d 6b 65 79 20 6b 65  t name? ?-key ke
8120: 79 3f 20 3f 2d 6d 61 63 20 6e 61 6d 65 3f 20 5b  y? ?-mac name? [
8130: 2d 63 68 61 6e 6e 65 6c 20 63 68 61 6e 20 7c 20  -channel chan | 
8140: 2d 63 6f 6d 6d 61 6e 64 20 63 6d 64 4e 61 6d 65  -command cmdName
8150: 20 7c 20 2d 66 69 6c 65 20 66 69 6c 65 6e 61 6d   | -file filenam
8160: 65 20 7c 20 3f 2d 64 61 74 61 3f 20 64 61 74 61  e | ?-data? data
8170: 5d 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  ]");..return TCL
8180: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
8190: 20 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61     /* Special ca
81a0: 73 65 20 6f 66 20 66 69 72 73 74 20 61 72 67 20  se of first arg 
81b0: 69 73 20 64 69 67 65 73 74 2c 20 63 69 70 68 65  is digest, ciphe
81c0: 72 2c 20 6f 72 20 6d 61 63 20 2a 2f 0a 20 20 20  r, or mac */.   
81d0: 20 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74   opt = Tcl_GetSt
81e0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
81f0: 5b 73 74 61 72 74 5d 2c 20 4e 55 4c 4c 29 3b 0a  [start], NULL);.
8200: 20 20 20 20 69 66 20 28 6f 70 74 5b 30 5d 20 21      if (opt[0] !
8210: 3d 20 27 2d 27 29 20 7b 0a 09 73 77 69 74 63 68  = '-') {..switch
8220: 28 74 79 70 65 29 20 7b 0a 09 63 61 73 65 20 54  (type) {..case T
8230: 59 50 45 5f 4d 44 3a 0a 09 63 61 73 65 20 54 59  YPE_MD:..case TY
8240: 50 45 5f 48 4d 41 43 3a 0a 09 20 20 20 20 64 69  PE_HMAC:..    di
8250: 67 65 73 74 4f 62 6a 20 3d 20 6f 62 6a 76 5b 73  gestObj = objv[s
8260: 74 61 72 74 2b 2b 5d 3b 0a 09 20 20 20 20 62 72  tart++];..    br
8270: 65 61 6b 3b 0a 09 63 61 73 65 20 54 59 50 45 5f  eak;..case TYPE_
8280: 43 4d 41 43 3a 0a 09 20 20 20 20 63 69 70 68 65  CMAC:..    ciphe
8290: 72 4f 62 6a 20 3d 20 6f 62 6a 76 5b 73 74 61 72  rObj = objv[star
82a0: 74 2b 2b 5d 3b 0a 09 20 20 20 20 62 72 65 61 6b  t++];..    break
82b0: 3b 0a 09 63 61 73 65 20 54 59 50 45 5f 4d 41 43  ;..case TYPE_MAC
82c0: 3a 0a 09 20 20 20 20 6d 61 63 4f 62 6a 20 3d 20  :..    macObj = 
82d0: 6f 62 6a 76 5b 73 74 61 72 74 2b 2b 5d 3b 0a 09  objv[start++];..
82e0: 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20      break;..}.  
82f0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
8300: 6f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 66  options */.    f
8310: 6f 72 20 28 69 6e 74 20 69 64 78 20 3d 20 73 74  or (int idx = st
8320: 61 72 74 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b  art; idx < objc;
8330: 20 69 64 78 2b 2b 29 20 7b 0a 09 2f 2a 20 53 70   idx++) {../* Sp
8340: 65 63 69 61 6c 20 63 61 73 65 20 66 6f 72 20 77  ecial case for w
8350: 68 65 6e 20 6c 61 73 74 20 61 72 67 20 69 73 20  hen last arg is 
8360: 64 61 74 61 20 2a 2f 0a 09 69 66 20 28 69 64 78  data */..if (idx
8370: 20 3d 3d 20 6f 62 6a 63 20 2d 20 31 29 20 7b 0a   == objc - 1) {.
8380: 09 20 20 20 20 6f 70 74 20 3d 20 54 63 6c 5f 47  .    opt = Tcl_G
8390: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
83a0: 6f 62 6a 76 5b 69 64 78 5d 2c 20 4e 55 4c 4c 29  objv[idx], NULL)
83b0: 3b 0a 09 20 20 20 20 69 66 20 28 6f 70 74 5b 30  ;..    if (opt[0
83c0: 5d 20 21 3d 20 27 2d 27 20 26 26 20 64 61 74 61  ] != '-' && data
83d0: 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Obj == NULL) {..
83e0: 09 64 61 74 61 4f 62 6a 20 3d 20 6f 62 6a 76 5b  .dataObj = objv[
83f0: 69 64 78 5d 3b 0a 09 09 62 72 65 61 6b 3b 0a 09  idx];...break;..
8400: 20 20 20 20 7d 0a 09 7d 0a 0a 09 2f 2a 20 47 65      }..}.../* Ge
8410: 74 20 6f 70 74 69 6f 6e 20 2a 2f 0a 09 69 66 20  t option */..if 
8420: 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f  (Tcl_GetIndexFro
8430: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
8440: 76 5b 69 64 78 5d 2c 20 63 6f 6d 6d 61 6e 64 5f  v[idx], command_
8450: 6f 70 74 73 2c 20 22 6f 70 74 69 6f 6e 22 2c 20  opts, "option", 
8460: 30 2c 20 26 66 6e 29 20 21 3d 20 54 43 4c 5f 4f  0, &fn) != TCL_O
8470: 4b 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e  K) {..    return
8480: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a   TCL_ERROR;..}..
8490: 09 2f 2a 20 56 61 6c 69 64 61 74 65 20 61 72 67  ./* Validate arg
84a0: 20 68 61 73 20 61 20 76 61 6c 75 65 20 2a 2f 0a   has a value */.
84b0: 09 69 66 20 28 66 6e 20 3e 20 5f 6f 70 74 5f 68  .if (fn > _opt_h
84c0: 65 78 61 64 65 63 69 6d 61 6c 29 20 7b 0a 09 20  exadecimal) {.. 
84d0: 20 20 20 69 66 20 28 2b 2b 69 64 78 20 3e 3d 20     if (++idx >= 
84e0: 6f 62 6a 63 29 20 7b 0a 09 09 54 63 6c 5f 41 70  objc) {...Tcl_Ap
84f0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
8500: 70 2c 20 22 4e 6f 20 76 61 6c 75 65 20 66 6f 72  p, "No value for
8510: 20 6f 70 74 69 6f 6e 20 5c 22 22 2c 20 63 6f 6d   option \"", com
8520: 6d 61 6e 64 5f 6f 70 74 73 5b 66 6e 5d 2c 20 22  mand_opts[fn], "
8530: 5c 22 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  \"", (char *) NU
8540: 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43  LL);...return TC
8550: 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a  L_ERROR;..    }.
8560: 09 7d 0a 0a 09 73 77 69 74 63 68 28 66 6e 29 20  .}...switch(fn) 
8570: 7b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 62 69 6e  {..case _opt_bin
8580: 3a 0a 09 63 61 73 65 20 5f 6f 70 74 5f 62 69 6e  :..case _opt_bin
8590: 61 72 79 3a 0a 09 20 20 20 20 66 6f 72 6d 61 74  ary:..    format
85a0: 20 3d 20 42 49 4e 5f 46 4f 52 4d 41 54 3b 0a 09   = BIN_FORMAT;..
85b0: 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65      break;..case
85c0: 20 5f 6f 70 74 5f 68 65 78 3a 0a 09 63 61 73 65   _opt_hex:..case
85d0: 20 5f 6f 70 74 5f 68 65 78 61 64 65 63 69 6d 61   _opt_hexadecima
85e0: 6c 3a 0a 09 20 20 20 20 66 6f 72 6d 61 74 20 3d  l:..    format =
85f0: 20 48 45 58 5f 46 4f 52 4d 41 54 3b 0a 09 20 20   HEX_FORMAT;..  
8600: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f    break;..case _
8610: 6f 70 74 5f 63 68 61 6e 3a 0a 09 63 61 73 65 20  opt_chan:..case 
8620: 5f 6f 70 74 5f 63 68 61 6e 6e 65 6c 3a 0a 20 20  _opt_channel:.  
8630: 20 20 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 53    .    GET_OPT_S
8640: 54 52 49 4e 47 28 6f 62 6a 76 5b 69 64 78 5d 2c  TRING(objv[idx],
8650: 20 63 68 61 6e 6e 65 6c 2c 20 4e 55 4c 4c 29 3b   channel, NULL);
8660: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61  ..    break;..ca
8670: 73 65 20 5f 6f 70 74 5f 63 69 70 68 65 72 3a 0a  se _opt_cipher:.
8680: 09 20 20 20 20 63 69 70 68 65 72 4f 62 6a 20 3d  .    cipherObj =
8690: 20 6f 62 6a 76 5b 69 64 78 5d 3b 0a 09 20 20 20   objv[idx];..   
86a0: 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f   break;..case _o
86b0: 70 74 5f 63 6f 6d 6d 61 6e 64 3a 0a 09 20 20 20  pt_command:..   
86c0: 20 63 6d 64 4f 62 6a 20 3d 20 6f 62 6a 76 5b 69   cmdObj = objv[i
86d0: 64 78 5d 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b  dx];..    break;
86e0: 0a 09 63 61 73 65 20 5f 6f 70 74 5f 64 61 74 61  ..case _opt_data
86f0: 3a 0a 09 20 20 20 20 64 61 74 61 4f 62 6a 20 3d  :..    dataObj =
8700: 20 6f 62 6a 76 5b 69 64 78 5d 3b 0a 09 20 20 20   objv[idx];..   
8710: 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f   break;..case _o
8720: 70 74 5f 64 69 67 65 73 74 3a 0a 09 63 61 73 65  pt_digest:..case
8730: 20 5f 6f 70 74 5f 68 61 73 68 3a 0a 09 20 20 20   _opt_hash:..   
8740: 20 64 69 67 65 73 74 4f 62 6a 20 3d 20 6f 62 6a   digestObj = obj
8750: 76 5b 69 64 78 5d 3b 0a 09 20 20 20 20 62 72 65  v[idx];..    bre
8760: 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 66  ak;..case _opt_f
8770: 69 6c 65 3a 0a 09 63 61 73 65 20 5f 6f 70 74 5f  ile:..case _opt_
8780: 66 69 6c 65 6e 61 6d 65 3a 0a 09 20 20 20 20 66  filename:..    f
8790: 69 6c 65 4f 62 6a 20 3d 20 6f 62 6a 76 5b 69 64  ileObj = objv[id
87a0: 78 5d 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  x];..    break;.
87b0: 09 63 61 73 65 20 5f 6f 70 74 5f 6b 65 79 3a 0a  .case _opt_key:.
87c0: 09 20 20 20 20 6b 65 79 4f 62 6a 20 3d 20 6f 62  .    keyObj = ob
87d0: 6a 76 5b 69 64 78 5d 3b 0a 09 20 20 20 20 62 72  jv[idx];..    br
87e0: 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f  eak;..case _opt_
87f0: 6d 61 63 3a 0a 09 20 20 20 20 6d 61 63 4f 62 6a  mac:..    macObj
8800: 20 3d 20 6f 62 6a 76 5b 69 64 78 5d 3b 0a 09 20   = objv[idx];.. 
8810: 20 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 20     break;..}.   
8820: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
8830: 20 74 79 70 65 73 20 2a 2f 0a 20 20 20 20 69 66   types */.    if
8840: 20 28 74 79 70 65 20 3d 3d 20 54 59 50 45 5f 4d   (type == TYPE_M
8850: 44 29 20 7b 0a 09 20 69 66 20 28 6d 61 63 4f 62  D) {.. if (macOb
8860: 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  j != NULL) {..  
8870: 20 20 74 79 70 65 20 3d 20 54 59 50 45 5f 4d 41    type = TYPE_MA
8880: 43 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 63  C;..} else if (c
8890: 69 70 68 65 72 4f 62 6a 20 21 3d 20 4e 55 4c 4c  ipherObj != NULL
88a0: 29 20 7b 0a 09 20 20 20 20 74 79 70 65 20 3d 20  ) {..    type = 
88b0: 54 59 50 45 5f 43 4d 41 43 3b 0a 09 7d 20 65 6c  TYPE_CMAC;..} el
88c0: 73 65 20 69 66 20 28 6b 65 79 4f 62 6a 20 21 3d  se if (keyObj !=
88d0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 74 79   NULL) {..    ty
88e0: 70 65 20 3d 20 54 59 50 45 5f 48 4d 41 43 3b 0a  pe = TYPE_HMAC;.
88f0: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  .}.    }..    if
8900: 20 28 74 79 70 65 20 3d 3d 20 54 59 50 45 5f 4d   (type == TYPE_M
8910: 41 43 29 20 7b 0a 09 69 66 20 28 6d 61 63 4f 62  AC) {..if (macOb
8920: 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  j != NULL) {..  
8930: 20 20 63 68 61 72 20 2a 6d 61 63 4e 61 6d 65 20    char *macName 
8940: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
8950: 72 6f 6d 4f 62 6a 28 6d 61 63 4f 62 6a 2c 20 4e  romObj(macObj, N
8960: 55 4c 4c 29 3b 0a 09 20 20 20 20 69 66 20 28 73  ULL);..    if (s
8970: 74 72 63 6d 70 28 6d 61 63 4e 61 6d 65 2c 22 63  trcmp(macName,"c
8980: 6d 61 63 22 29 20 3d 3d 20 30 29 20 7b 0a 09 09  mac") == 0) {...
8990: 74 79 70 65 20 3d 20 54 59 50 45 5f 43 4d 41 43  type = TYPE_CMAC
89a0: 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ;..    } else if
89b0: 20 28 73 74 72 63 6d 70 28 6d 61 63 4e 61 6d 65   (strcmp(macName
89c0: 2c 22 68 6d 61 63 22 29 20 3d 3d 20 30 29 20 7b  ,"hmac") == 0) {
89d0: 0a 09 09 74 79 70 65 20 3d 20 54 59 50 45 5f 48  ...type = TYPE_H
89e0: 4d 41 43 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65  MAC;..    } else
89f0: 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52   {...Tcl_AppendR
8a00: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 69  esult(interp, "i
8a10: 6e 76 61 6c 69 64 20 4d 41 43 20 5c 22 22 2c 20  nvalid MAC \"", 
8a20: 6d 61 63 4e 61 6d 65 2c 20 22 5c 22 22 2c 20 4e  macName, "\"", N
8a30: 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54  ULL);...return T
8a40: 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d  CL_ERROR;..    }
8a50: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
8a60: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8a70: 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 4d 41 43  (interp, "no MAC
8a80: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72  ", NULL);..    r
8a90: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8aa0: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ..}.    }..    /
8ab0: 2a 20 43 61 6c 63 20 64 69 67 65 73 74 20 6f 6e  * Calc digest on
8ac0: 20 66 69 6c 65 2c 20 73 74 61 63 6b 65 64 20 63   file, stacked c
8ad0: 68 61 6e 6e 65 6c 2c 20 75 73 69 6e 67 20 69 6e  hannel, using in
8ae0: 73 74 61 6e 63 65 20 63 6f 6d 6d 61 6e 64 2c 20  stance command, 
8af0: 6f 72 20 64 61 74 61 20 62 6c 6f 62 20 2a 2f 0a  or data blob */.
8b00: 20 20 20 20 69 66 20 28 66 69 6c 65 4f 62 6a 20      if (fileObj 
8b10: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 20  != NULL) {..res 
8b20: 3d 20 44 69 67 65 73 74 46 69 6c 65 48 61 6e 64  = DigestFileHand
8b30: 6c 65 72 28 69 6e 74 65 72 70 2c 20 66 69 6c 65  ler(interp, file
8b40: 4f 62 6a 2c 20 64 69 67 65 73 74 4f 62 6a 2c 20  Obj, digestObj, 
8b50: 63 69 70 68 65 72 4f 62 6a 2c 20 66 6f 72 6d 61  cipherObj, forma
8b60: 74 20 7c 20 74 79 70 65 2c 20 6b 65 79 4f 62 6a  t | type, keyObj
8b70: 2c 20 6d 61 63 4f 62 6a 29 3b 0a 20 20 20 20 7d  , macObj);.    }
8b80: 20 65 6c 73 65 20 69 66 20 28 63 68 61 6e 6e 65   else if (channe
8b90: 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  l != NULL) {..re
8ba0: 73 20 3d 20 44 69 67 65 73 74 43 68 61 6e 6e 65  s = DigestChanne
8bb0: 6c 48 61 6e 64 6c 65 72 28 69 6e 74 65 72 70 2c  lHandler(interp,
8bc0: 20 63 68 61 6e 6e 65 6c 2c 20 64 69 67 65 73 74   channel, digest
8bd0: 4f 62 6a 2c 20 63 69 70 68 65 72 4f 62 6a 2c 20  Obj, cipherObj, 
8be0: 66 6f 72 6d 61 74 20 7c 20 74 79 70 65 2c 20 6b  format | type, k
8bf0: 65 79 4f 62 6a 2c 20 6d 61 63 4f 62 6a 29 3b 0a  eyObj, macObj);.
8c00: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63      } else if (c
8c10: 6d 64 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b  mdObj != NULL) {
8c20: 0a 09 72 65 73 20 3d 20 44 69 67 65 73 74 43 6f  ..res = DigestCo
8c30: 6d 6d 61 6e 64 48 61 6e 64 6c 65 72 28 69 6e 74  mmandHandler(int
8c40: 65 72 70 2c 20 63 6d 64 4f 62 6a 2c 20 64 69 67  erp, cmdObj, dig
8c50: 65 73 74 4f 62 6a 2c 20 63 69 70 68 65 72 4f 62  estObj, cipherOb
8c60: 6a 2c 20 66 6f 72 6d 61 74 20 7c 20 74 79 70 65  j, format | type
8c70: 2c 20 6b 65 79 4f 62 6a 2c 20 6d 61 63 4f 62 6a  , keyObj, macObj
8c80: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  );.    } else if
8c90: 20 28 64 61 74 61 4f 62 6a 20 21 3d 20 4e 55 4c   (dataObj != NUL
8ca0: 4c 29 20 7b 0a 09 72 65 73 20 3d 20 44 69 67 65  L) {..res = Dige
8cb0: 73 74 44 61 74 61 48 61 6e 64 6c 65 72 28 69 6e  stDataHandler(in
8cc0: 74 65 72 70 2c 20 64 61 74 61 4f 62 6a 2c 20 64  terp, dataObj, d
8cd0: 69 67 65 73 74 4f 62 6a 2c 20 63 69 70 68 65 72  igestObj, cipher
8ce0: 4f 62 6a 2c 20 66 6f 72 6d 61 74 20 7c 20 74 79  Obj, format | ty
8cf0: 70 65 2c 20 6b 65 79 4f 62 6a 2c 20 6d 61 63 4f  pe, keyObj, macO
8d00: 62 6a 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  bj);.    } else 
8d10: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
8d20: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20  ult(interp, "No 
8d30: 6f 70 65 72 61 74 69 6f 6e 3a 20 55 73 65 20 2d  operation: Use -
8d40: 63 68 61 6e 6e 65 6c 2c 20 2d 63 6f 6d 6d 61 6e  channel, -comman
8d50: 64 2c 20 2d 64 61 74 61 2c 20 6f 72 20 2d 66 69  d, -data, or -fi
8d60: 6c 65 20 6f 70 74 69 6f 6e 22 2c 20 4e 55 4c 4c  le option", NULL
8d70: 29 3b 0a 09 72 65 73 20 3d 20 54 43 4c 5f 45 52  );..res = TCL_ER
8d80: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ROR;.    }.    r
8d90: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
8da0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
8db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8de0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 65 73  ------. *. * Mes
8df0: 73 61 67 65 20 44 69 67 65 73 74 20 61 6e 64 20  sage Digest and 
8e00: 4d 65 73 73 61 67 65 20 41 75 74 68 65 6e 74 69  Message Authenti
8e10: 63 61 74 69 6f 6e 20 43 6f 64 65 20 43 6f 6d 6d  cation Code Comm
8e20: 61 6e 64 73 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65  ands --. *. *.Re
8e30: 74 75 72 6e 20 4d 65 73 73 61 67 65 20 44 69 67  turn Message Dig
8e40: 65 73 74 20 28 4d 44 29 20 6f 72 20 4d 65 73 73  est (MD) or Mess
8e50: 61 67 65 20 41 75 74 68 65 6e 74 69 63 61 74 69  age Authenticati
8e60: 6f 6e 20 43 6f 64 65 20 28 4d 41 43 29 2e 0a 20  on Code (MAC).. 
8e70: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a  *. * Returns:. *
8e80: 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45  .TCL_OK or TCL_E
8e90: 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20  RROR. *. * Side 
8ea0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73  effects:. *.Sets
8eb0: 20 72 65 73 75 6c 74 20 74 6f 20 6d 65 73 73 61   result to messa
8ec0: 67 65 20 64 69 67 65 73 74 20 6f 72 20 65 72 72  ge digest or err
8ed0: 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a  or message. *. *
8ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f20: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
8f30: 6e 74 20 4d 64 4f 62 6a 43 6d 64 28 43 6c 69 65  nt MdObjCmd(Clie
8f40: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
8f50: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
8f60: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
8f70: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20   Tcl_Obj *const 
8f80: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 72 65  objv[]) {.    re
8f90: 74 75 72 6e 20 44 69 67 65 73 74 4d 61 69 6e 28  turn DigestMain(
8fa0: 54 59 50 45 5f 4d 44 2c 20 69 6e 74 65 72 70 2c  TYPE_MD, interp,
8fb0: 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 7d 0a   objc, objv);.}.
8fc0: 0a 73 74 61 74 69 63 20 69 6e 74 20 43 4d 41 43  .static int CMAC
8fd0: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74  ObjCmd(ClientDat
8fe0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63  a clientData, Tc
8ff0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
9000: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f  , int objc, Tcl_
9010: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b  Obj *const objv[
9020: 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ]) {.    return 
9030: 44 69 67 65 73 74 4d 61 69 6e 28 54 59 50 45 5f  DigestMain(TYPE_
9040: 43 4d 41 43 2c 20 69 6e 74 65 72 70 2c 20 6f 62  CMAC, interp, ob
9050: 6a 63 2c 20 6f 62 6a 76 29 3b 0a 7d 0a 0a 73 74  jc, objv);.}..st
9060: 61 74 69 63 20 69 6e 74 20 48 4d 41 43 4f 62 6a  atic int HMACObj
9070: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63  Cmd(ClientData c
9080: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
9090: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
90a0: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
90b0: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20   *const objv[]) 
90c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 44 69 67  {.    return Dig
90d0: 65 73 74 4d 61 69 6e 28 54 59 50 45 5f 48 4d 41  estMain(TYPE_HMA
90e0: 43 2c 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c  C, interp, objc,
90f0: 20 6f 62 6a 76 29 3b 0a 7d 0a 0a 73 74 61 74 69   objv);.}..stati
9100: 63 20 69 6e 74 20 4d 41 43 4f 62 6a 43 6d 64 28  c int MACObjCmd(
9110: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
9120: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
9130: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
9140: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
9150: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
9160: 20 20 72 65 74 75 72 6e 20 44 69 67 65 73 74 4d    return DigestM
9170: 61 69 6e 28 54 59 50 45 5f 4d 41 43 2c 20 69 6e  ain(TYPE_MAC, in
9180: 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76  terp, objc, objv
9190: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  );.}../*. *-----
91a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
91e0: 2a 0a 20 2a 20 4d 65 73 73 61 67 65 20 44 69 67  *. * Message Dig
91f0: 65 73 74 20 43 6f 6e 76 65 6e 69 65 6e 63 65 20  est Convenience 
9200: 43 6f 6d 6d 61 6e 64 73 20 2d 2d 0a 20 2a 0a 20  Commands --. *. 
9210: 2a 09 43 6f 6e 76 65 6e 69 65 6e 63 65 20 63 6f  *.Convenience co
9220: 6d 6d 61 6e 64 73 20 66 6f 72 20 73 65 6c 65 63  mmands for selec
9230: 74 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74  t message digest
9240: 73 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73  s.. *. * Returns
9250: 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54  :. *.TCL_OK or T
9260: 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53  CL_ERROR. *. * S
9270: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
9280: 53 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20 6d  Sets result to m
9290: 65 73 73 61 67 65 20 64 69 67 65 73 74 20 6f 72  essage digest or
92a0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20   error message. 
92b0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
92c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
92d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
92e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
92f0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 20 69 6e 74  -------. */. int
9300: 20 54 65 6d 70 6c 61 74 65 43 6d 64 28 54 63 6c   TemplateCmd(Tcl
9310: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
9320: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
9330: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
9340: 2c 20 63 68 61 72 20 2a 64 69 67 65 73 74 4e 61  , char *digestNa
9350: 6d 65 2c 20 69 6e 74 20 66 6f 72 6d 61 74 29 20  me, int format) 
9360: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 64  {.    Tcl_Obj *d
9370: 61 74 61 4f 62 6a 2c 20 2a 64 69 67 65 73 74 4f  ataObj, *digestO
9380: 62 6a 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b  bj;.    int res;
9390: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d  ..    if (objc =
93a0: 3d 20 32 29 20 7b 0a 09 64 61 74 61 4f 62 6a 20  = 2) {..dataObj 
93b0: 3d 20 6f 62 6a 76 5b 31 5d 3b 0a 20 20 20 20 7d  = objv[1];.    }
93c0: 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 57 72 6f   else {..Tcl_Wro
93d0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
93e0: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 64 61 74 61  , 1, objv, "data
93f0: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ");..return TCL_
9400: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
9410: 20 20 64 69 67 65 73 74 4f 62 6a 20 3d 20 54 63    digestObj = Tc
9420: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 64  l_NewStringObj(d
9430: 69 67 65 73 74 4e 61 6d 65 2c 20 2d 31 29 3b 0a  igestName, -1);.
9440: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
9450: 6f 75 6e 74 28 64 69 67 65 73 74 4f 62 6a 29 3b  ount(digestObj);
9460: 0a 20 20 20 20 72 65 73 20 3d 20 44 69 67 65 73  .    res = Diges
9470: 74 44 61 74 61 48 61 6e 64 6c 65 72 28 69 6e 74  tDataHandler(int
9480: 65 72 70 2c 20 64 61 74 61 4f 62 6a 2c 20 64 69  erp, dataObj, di
9490: 67 65 73 74 4f 62 6a 2c 20 4e 55 4c 4c 2c 20 66  gestObj, NULL, f
94a0: 6f 72 6d 61 74 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  ormat, NULL, NUL
94b0: 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72  L);.    Tcl_Decr
94c0: 52 65 66 43 6f 75 6e 74 28 64 69 67 65 73 74 4f  RefCount(digestO
94d0: 62 6a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  bj);.    return 
94e0: 72 65 73 3b 0a 7d 0a 20 0a 69 6e 74 20 4d 44 34  res;.}. .int MD4
94f0: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74  ObjCmd(ClientDat
9500: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63  a clientData, Tc
9510: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
9520: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f  , int objc, Tcl_
9530: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b  Obj *const objv[
9540: 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ]) {.    return 
9550: 54 65 6d 70 6c 61 74 65 43 6d 64 28 69 6e 74 65  TemplateCmd(inte
9560: 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20  rp, objc, objv, 
9570: 22 6d 64 34 22 2c 20 48 45 58 5f 46 4f 52 4d 41  "md4", HEX_FORMA
9580: 54 20 7c 20 54 59 50 45 5f 4d 44 29 3b 0a 7d 0a  T | TYPE_MD);.}.
9590: 0a 69 6e 74 20 4d 44 35 4f 62 6a 43 6d 64 28 43  .int MD5ObjCmd(C
95a0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
95b0: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
95c0: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
95d0: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  jc, Tcl_Obj *con
95e0: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20  st objv[]) {.   
95f0: 20 72 65 74 75 72 6e 20 54 65 6d 70 6c 61 74 65   return Template
9600: 43 6d 64 28 69 6e 74 65 72 70 2c 20 6f 62 6a 63  Cmd(interp, objc
9610: 2c 20 6f 62 6a 76 2c 20 22 6d 64 35 22 2c 20 48  , objv, "md5", H
9620: 45 58 5f 46 4f 52 4d 41 54 20 7c 20 54 59 50 45  EX_FORMAT | TYPE
9630: 5f 4d 44 29 3b 0a 7d 0a 0a 69 6e 74 20 53 48 41  _MD);.}..int SHA
9640: 31 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61  1ObjCmd(ClientDa
9650: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
9660: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
9670: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
9680: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
9690: 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  []) {.    return
96a0: 20 54 65 6d 70 6c 61 74 65 43 6d 64 28 69 6e 74   TemplateCmd(int
96b0: 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c  erp, objc, objv,
96c0: 20 22 73 68 61 31 22 2c 20 48 45 58 5f 46 4f 52   "sha1", HEX_FOR
96d0: 4d 41 54 20 7c 20 54 59 50 45 5f 4d 44 29 3b 0a  MAT | TYPE_MD);.
96e0: 7d 0a 0a 69 6e 74 20 53 48 41 32 35 36 4f 62 6a  }..int SHA256Obj
96f0: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63  Cmd(ClientData c
9700: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
9710: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
9720: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
9730: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20   *const objv[]) 
9740: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 65 6d  {.    return Tem
9750: 70 6c 61 74 65 43 6d 64 28 69 6e 74 65 72 70 2c  plateCmd(interp,
9760: 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 22 73 68   objc, objv, "sh
9770: 61 32 35 36 22 2c 20 48 45 58 5f 46 4f 52 4d 41  a256", HEX_FORMA
9780: 54 20 7c 20 54 59 50 45 5f 4d 44 29 3b 0a 7d 0a  T | TYPE_MD);.}.
9790: 0a 69 6e 74 20 53 48 41 35 31 32 4f 62 6a 43 6d  .int SHA512ObjCm
97a0: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  d(ClientData cli
97b0: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  entData, Tcl_Int
97c0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
97d0: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
97e0: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a  const objv[]) {.
97f0: 20 20 20 20 72 65 74 75 72 6e 20 54 65 6d 70 6c      return Templ
9800: 61 74 65 43 6d 64 28 69 6e 74 65 72 70 2c 20 6f  ateCmd(interp, o
9810: 62 6a 63 2c 20 6f 62 6a 76 2c 20 22 73 68 61 35  bjc, objv, "sha5
9820: 31 32 22 2c 20 48 45 58 5f 46 4f 52 4d 41 54 20  12", HEX_FORMAT 
9830: 7c 20 54 59 50 45 5f 4d 44 29 3b 0a 7d 0a 0a 2f  | TYPE_MD);.}../
9840: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
9850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9880: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c  -------. *. * Tl
9890: 73 5f 44 69 67 65 73 74 43 6f 6d 6d 61 6e 64 73  s_DigestCommands
98a0: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 72 65 61 74 65   --. *. *.Create
98b0: 20 64 69 67 65 73 74 20 63 6f 6d 6d 61 6e 64 73   digest commands
98c0: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a  . *. * Returns:.
98d0: 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c   *.TCL_OK or TCL
98e0: 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64  _ERROR. *. * Sid
98f0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 72  e effects:. *.Cr
9900: 65 61 74 65 73 20 63 6f 6d 6d 61 6e 64 73 0a 20  eates commands. 
9910: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
9920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9950: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20  -------. */.int 
9960: 54 6c 73 5f 44 69 67 65 73 74 43 6f 6d 6d 61 6e  Tls_DigestComman
9970: 64 73 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  ds(Tcl_Interp *i
9980: 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 54 63 6c  nterp) {.    Tcl
9990: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
99a0: 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  d(interp, "tls::
99b0: 64 69 67 65 73 74 22 2c 20 4d 64 4f 62 6a 43 6d  digest", MdObjCm
99c0: 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  d, (ClientData) 
99d0: 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  0, (Tcl_CmdDelet
99e0: 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
99f0: 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
9a00: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
9a10: 20 22 74 6c 73 3a 3a 6d 64 22 2c 20 4d 64 4f 62   "tls::md", MdOb
9a20: 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74  jCmd, (ClientDat
9a30: 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65  a) 0, (Tcl_CmdDe
9a40: 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c  leteProc *) NULL
9a50: 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  );.    Tcl_Creat
9a60: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
9a70: 72 70 2c 20 22 74 6c 73 3a 3a 63 6d 61 63 22 2c  rp, "tls::cmac",
9a80: 20 43 4d 41 43 4f 62 6a 43 6d 64 2c 20 28 43 6c   CMACObjCmd, (Cl
9a90: 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63  ientData) 0, (Tc
9aa0: 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
9ab0: 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63  *) NULL);.    Tc
9ac0: 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
9ad0: 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a  nd(interp, "tls:
9ae0: 3a 68 6d 61 63 22 2c 20 48 4d 41 43 4f 62 6a 43  :hmac", HMACObjC
9af0: 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
9b00: 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65   0, (Tcl_CmdDele
9b10: 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
9b20: 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
9b30: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
9b40: 2c 20 22 74 6c 73 3a 3a 6d 61 63 22 2c 20 4d 41  , "tls::mac", MA
9b50: 43 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  CObjCmd, (Client
9b60: 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d  Data) 0, (Tcl_Cm
9b70: 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
9b80: 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72  ULL);.    Tcl_Cr
9b90: 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
9ba0: 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 64 34  nterp, "tls::md4
9bb0: 22 2c 20 4d 44 34 4f 62 6a 43 6d 64 2c 20 28 43  ", MD4ObjCmd, (C
9bc0: 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54  lientData) 0, (T
9bd0: 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
9be0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
9bf0: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
9c00: 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  and(interp, "tls
9c10: 3a 3a 6d 64 35 22 2c 20 4d 44 35 4f 62 6a 43 6d  ::md5", MD5ObjCm
9c20: 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  d, (ClientData) 
9c30: 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  0, (Tcl_CmdDelet
9c40: 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
9c50: 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
9c60: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
9c70: 20 22 74 6c 73 3a 3a 73 68 61 31 22 2c 20 53 48   "tls::sha1", SH
9c80: 41 31 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e  A1ObjCmd, (Clien
9c90: 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43  tData) 0, (Tcl_C
9ca0: 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
9cb0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43  NULL);.    Tcl_C
9cc0: 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
9cd0: 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 68  interp, "tls::sh
9ce0: 61 32 35 36 22 2c 20 53 48 41 32 35 36 4f 62 6a  a256", SHA256Obj
9cf0: 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  Cmd, (ClientData
9d00: 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ) 0, (Tcl_CmdDel
9d10: 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
9d20: 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
9d30: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
9d40: 70 2c 20 22 74 6c 73 3a 3a 73 68 61 35 31 32 22  p, "tls::sha512"
9d50: 2c 20 53 48 41 35 31 32 4f 62 6a 43 6d 64 2c 20  , SHA512ObjCmd, 
9d60: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20  (ClientData) 0, 
9d70: 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
9d80: 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  oc *) NULL);.   
9d90: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
9da0: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74  mmand(interp, "t
9db0: 6c 73 3a 3a 75 6e 73 74 61 63 6b 22 2c 20 44 69  ls::unstack", Di
9dc0: 67 65 73 74 55 6e 73 74 61 63 6b 4f 62 6a 43 6d  gestUnstackObjCm
9dd0: 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  d, (ClientData) 
9de0: 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  0, (Tcl_CmdDelet
9df0: 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
9e00: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
9e10: 4b 3b 0a 7d 0a 0a                                K;.}..