0000: 2f 2a 0a 20 2a 20 44 69 67 65 73 74 20 43 6f 6d /*. * Digest Com
0010: 6d 61 6e 64 20 61 6e 64 20 53 74 61 63 6b 65 64 mand and Stacked
0020: 20 54 72 61 6e 73 66 6f 72 6d 20 43 68 61 6e 6e Transform Chann
0030: 65 6c 0a 20 2a 0a 20 2a 20 43 6f 70 79 72 69 67 el. *. * Copyrig
0040: 68 74 20 28 43 29 20 32 30 32 33 20 42 72 69 61 ht (C) 2023 Bria
0050: 6e 20 4f 27 48 61 67 61 6e 0a 20 2a 0a 20 2a 2f n O'Hagan. *. */
0060: 0a 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 49 ..#include "tlsI
0070: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 nt.h".#include "
0080: 74 63 6c 4f 70 74 73 2e 68 22 0a 23 69 6e 63 6c tclOpts.h".#incl
0090: 75 64 65 20 3c 74 63 6c 2e 68 3e 0a 23 69 6e 63 ude <tcl.h>.#inc
00a0: 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 lude <stdio.h>.#
00b0: 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e include <string.
00c0: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 h>.#include <ope
00d0: 6e 73 73 6c 2f 65 76 70 2e 68 3e 0a 0a 2f 2a 20 nssl/evp.h>../*
00e0: 43 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 63 6f 6e Constants */.con
00f0: 73 74 20 63 68 61 72 20 2a 68 65 78 20 3d 20 22 st char *hex = "
0100: 30 31 32 33 34 35 36 37 38 39 41 42 43 44 45 46 0123456789ABCDEF
0110: 22 3b 0a 23 64 65 66 69 6e 65 20 52 45 41 53 4f ";.#define REASO
0120: 4e 28 29 09 45 52 52 5f 72 65 61 73 6f 6e 5f 65 N().ERR_reason_e
0130: 72 72 6f 72 5f 73 74 72 69 6e 67 28 45 52 52 5f rror_string(ERR_
0140: 67 65 74 5f 65 72 72 6f 72 28 29 29 0a 23 64 65 get_error()).#de
0150: 66 69 6e 65 20 42 55 46 46 45 52 5f 53 49 5a 45 fine BUFFER_SIZE
0160: 20 36 35 35 33 36 0a 23 64 65 66 69 6e 65 20 42 65536.#define B
0170: 49 4e 5f 46 4f 52 4d 41 54 20 30 0a 23 64 65 66 IN_FORMAT 0.#def
0180: 69 6e 65 20 48 45 58 5f 46 4f 52 4d 41 54 20 31 ine HEX_FORMAT 1
0190: 0a 0a 2f 2a 0a 20 2a 20 54 68 69 73 20 73 74 72 ../*. * This str
01a0: 75 63 74 75 72 65 20 64 65 73 63 72 69 62 65 73 ucture describes
01b0: 20 74 68 65 20 70 65 72 2d 69 6e 73 74 61 6e 63 the per-instanc
01c0: 65 20 73 74 61 74 65 20 6f 66 20 61 6e 20 53 53 e state of an SS
01d0: 4c 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a L channel.. *. *
01e0: 20 54 68 65 20 53 53 4c 20 70 72 6f 63 65 73 73 The SSL process
01f0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 69 73 20 6d ing context is m
0200: 61 69 6e 74 61 69 6e 65 64 20 68 65 72 65 2c 20 aintained here,
0210: 69 6e 20 74 68 65 20 43 6c 69 65 6e 74 44 61 74 in the ClientDat
0220: 61 0a 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 a. */.typedef st
0230: 72 75 63 74 20 44 69 67 65 73 74 53 74 61 74 65 ruct DigestState
0240: 20 7b 0a 09 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 {..Tcl_Channel
0250: 73 65 6c 66 3b 09 2f 2a 20 54 68 69 73 20 73 6f self;./* This so
0260: 63 6b 65 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a cket channel */.
0270: 09 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 20 .Tcl_TimerToken
0280: 74 69 6d 65 72 3b 09 2f 2a 20 54 69 6d 65 72 20 timer;./* Timer
0290: 66 6f 72 20 72 65 61 64 20 65 76 65 6e 74 73 20 for read events
02a0: 2a 2f 0a 0a 09 69 6e 74 20 66 6c 61 67 73 3b 09 */...int flags;.
02b0: 09 2f 2a 20 43 68 61 6e 20 63 6f 6e 66 69 67 20 ./* Chan config
02c0: 66 6c 61 67 73 20 2a 2f 0a 09 69 6e 74 20 77 61 flags */..int wa
02d0: 74 63 68 4d 61 73 6b 3b 09 09 2f 2a 20 43 75 72 tchMask;../* Cur
02e0: 72 65 6e 74 20 57 61 74 63 68 50 72 6f 63 20 6d rent WatchProc m
02f0: 61 73 6b 20 2a 2f 0a 09 69 6e 74 20 6d 6f 64 65 ask */..int mode
0300: 3b 09 09 2f 2a 20 43 75 72 72 65 6e 74 20 6d 6f ;../* Current mo
0310: 64 65 20 6f 66 20 70 61 72 65 6e 74 20 63 68 61 de of parent cha
0320: 6e 6e 65 6c 20 2a 2f 0a 09 69 6e 74 20 66 6f 72 nnel */..int for
0330: 6d 61 74 3b 09 09 2f 2a 20 4f 75 74 70 75 74 20 mat;../* Output
0340: 66 6f 72 6d 61 74 20 2a 2f 0a 0a 09 54 63 6c 5f format */...Tcl_
0350: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 09 Interp *interp;.
0360: 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 65 72 /* Current inter
0370: 70 72 65 74 65 72 20 2a 2f 0a 09 45 56 50 5f 4d preter */..EVP_M
0380: 44 5f 43 54 58 20 2a 63 74 78 3b 09 2f 2a 20 4d D_CTX *ctx;./* M
0390: 44 20 43 6f 6e 74 65 78 74 20 2a 2f 0a 7d 20 44 D Context */.} D
03a0: 69 67 65 73 74 53 74 61 74 65 3b 0a 0a 2f 2a 2a igestState;../**
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
03d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
03e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
03f0: 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d */../*. *-------
0400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
0440: 20 2a 20 44 69 67 65 73 74 46 69 6c 65 20 2d 2d * DigestFile --
0450: 0a 20 2a 0a 20 2a 09 52 65 74 75 72 6e 20 6d 65 . *. *.Return me
0460: 73 73 61 67 65 20 64 69 67 65 73 74 20 66 6f 72 ssage digest for
0470: 20 66 69 6c 65 20 75 73 69 6e 67 20 75 73 65 72 file using user
0480: 20 73 70 65 63 69 66 69 65 64 20 68 61 73 68 20 specified hash
0490: 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 function.. *. *
04a0: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f Returns:. *.TCL_
04b0: 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a OK or TCL_ERROR.
04c0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
04d0: 74 73 3a 0a 20 2a 09 52 65 73 75 6c 74 20 69 73 ts:. *.Result is
04e0: 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20 message digest
04f0: 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 or error message
0500: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
0510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e ---------. */.in
0550: 74 20 44 69 67 65 73 74 46 69 6c 65 28 54 63 6c t DigestFile(Tcl
0560: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
0570: 20 54 63 6c 5f 4f 62 6a 20 2a 66 69 6c 65 6e 61 Tcl_Obj *filena
0580: 6d 65 2c 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 me, const EVP_MD
0590: 20 2a 6d 64 2c 20 69 6e 74 20 66 6f 72 6d 61 74 *md, int format
05a0: 2c 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4f ,..Tcl_Obj *keyO
05b0: 62 6a 29 20 7b 0a 20 20 20 20 45 56 50 5f 4d 44 bj) {. EVP_MD
05c0: 5f 43 54 58 20 2a 63 74 78 20 3d 20 28 45 56 50 _CTX *ctx = (EVP
05d0: 5f 4d 44 5f 43 54 58 20 2a 29 20 4e 55 4c 4c 3b _MD_CTX *) NULL;
05e0: 0a 20 20 20 20 48 4d 41 43 5f 43 54 58 20 2a 68 . HMAC_CTX *h
05f0: 63 74 78 20 3d 20 28 48 4d 41 43 5f 43 54 58 20 ctx = (HMAC_CTX
0600: 2a 29 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c *) NULL;. Tcl
0610: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 _Channel chan;.
0620: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 unsigned char
0630: 20 62 75 66 5b 42 55 46 46 45 52 5f 53 49 5a 45 buf[BUFFER_SIZE
0640: 5d 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 ];. unsigned
0650: 63 68 61 72 20 6d 64 5f 62 75 66 5b 45 56 50 5f char md_buf[EVP_
0660: 4d 41 58 5f 4d 44 5f 53 49 5a 45 5d 3b 0a 20 20 MAX_MD_SIZE];.
0670: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6d unsigned int m
0680: 64 5f 6c 65 6e 3b 0a 20 20 20 20 75 6e 73 69 67 d_len;. unsig
0690: 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 3b 0a 20 ned char *key;.
06a0: 20 20 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 2c 20 int key_len,
06b0: 72 65 73 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 res;.. /* Ope
06c0: 6e 20 66 69 6c 65 20 63 68 61 6e 6e 65 6c 20 2a n file channel *
06d0: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c /. chan = Tcl
06e0: 5f 46 53 4f 70 65 6e 46 69 6c 65 43 68 61 6e 6e _FSOpenFileChann
06f0: 65 6c 28 69 6e 74 65 72 70 2c 20 66 69 6c 65 6e el(interp, filen
0700: 61 6d 65 2c 20 22 72 62 22 2c 20 30 34 34 34 29 ame, "rb", 0444)
0710: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d ;. if (chan =
0720: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
0730: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
0740: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
0750: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 .. /* Configu
0760: 72 65 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 re channel */.
0770: 20 20 69 66 20 28 54 63 6c 5f 53 65 74 43 68 61 if (Tcl_SetCha
0780: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
0790: 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 p, chan, "-trans
07a0: 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72 79 lation", "binary
07b0: 22 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 29 ") == TCL_ERROR)
07c0: 20 7b 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a {..goto error;.
07d0: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65 }. Tcl_Se
07e0: 74 43 68 61 6e 6e 65 6c 42 75 66 66 65 72 53 69 tChannelBufferSi
07f0: 7a 65 28 63 68 61 6e 2c 20 42 55 46 46 45 52 5f ze(chan, BUFFER_
0800: 53 49 5a 45 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 SIZE);.. /* C
0810: 72 65 61 74 65 20 6d 65 73 73 61 67 65 20 64 69 reate message di
0820: 67 65 73 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a gest context */.
0830: 20 20 20 20 69 66 20 28 6b 65 79 4f 62 6a 20 3d if (keyObj =
0840: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 74 78 20 3d = NULL) {..ctx =
0850: 20 45 56 50 5f 4d 44 5f 43 54 58 5f 6e 65 77 28 EVP_MD_CTX_new(
0860: 29 3b 0a 09 72 65 73 20 3d 20 28 63 74 78 20 21 );..res = (ctx !
0870: 3d 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 20 65 = NULL);. } e
0880: 6c 73 65 20 7b 0a 09 68 63 74 78 20 3d 20 48 4d lse {..hctx = HM
0890: 41 43 5f 43 54 58 5f 6e 65 77 28 29 3b 0a 09 72 AC_CTX_new();..r
08a0: 65 73 20 3d 20 28 68 63 74 78 20 21 3d 20 4e 55 es = (hctx != NU
08b0: 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 LL);. }. i
08c0: 66 20 28 21 72 65 73 29 20 7b 0a 09 54 63 6c 5f f (!res) {..Tcl_
08d0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
08e0: 65 72 70 2c 20 22 43 72 65 61 74 65 20 64 69 67 erp, "Create dig
08f0: 65 73 74 20 63 6f 6e 74 65 78 74 20 66 61 69 6c est context fail
0900: 65 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c ed: ", REASON(),
0910: 20 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65 72 NULL);..goto er
0920: 72 6f 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ror;. }..
0930: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 68 61 /* Initialize ha
0940: 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 sh function */.
0950: 20 20 20 69 66 20 28 6b 65 79 4f 62 6a 20 3d 3d if (keyObj ==
0960: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 20 3d 20 NULL) {..res =
0970: 45 56 50 5f 44 69 67 65 73 74 49 6e 69 74 5f 65 EVP_DigestInit_e
0980: 78 28 63 74 78 2c 20 6d 64 2c 20 4e 55 4c 4c 29 x(ctx, md, NULL)
0990: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
09a0: 6b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 key = Tcl_GetByt
09b0: 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6b 65 eArrayFromObj(ke
09c0: 79 4f 62 6a 2c 20 26 6b 65 79 5f 6c 65 6e 29 3b yObj, &key_len);
09d0: 0a 09 72 65 73 20 3d 20 48 4d 41 43 5f 49 6e 69 ..res = HMAC_Ini
09e0: 74 5f 65 78 28 68 63 74 78 2c 20 28 63 6f 6e 73 t_ex(hctx, (cons
09f0: 74 20 76 6f 69 64 20 2a 29 20 6b 65 79 2c 20 6b t void *) key, k
0a00: 65 79 5f 6c 65 6e 2c 20 6d 64 2c 20 4e 55 4c 4c ey_len, md, NULL
0a10: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 );. }. if
0a20: 28 21 72 65 73 29 20 7b 0a 09 54 63 6c 5f 41 70 (!res) {..Tcl_Ap
0a30: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
0a40: 70 2c 20 22 49 6e 69 74 69 61 6c 69 7a 65 20 64 p, "Initialize d
0a50: 69 67 65 73 74 20 66 61 69 6c 65 64 3a 20 22 2c igest failed: ",
0a60: 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 REASON(), NULL)
0a70: 3b 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 ;..goto error;.
0a80: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 61 }.. /* Rea
0a90: 64 20 66 69 6c 65 20 64 61 74 61 20 61 6e 64 20 d file data and
0aa0: 75 70 64 61 74 65 20 68 61 73 68 20 66 75 6e 63 update hash func
0ab0: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 77 68 69 6c tion */. whil
0ac0: 65 20 28 21 54 63 6c 5f 45 6f 66 28 63 68 61 6e e (!Tcl_Eof(chan
0ad0: 29 29 20 7b 0a 09 69 6e 74 20 6c 65 6e 20 3d 20 )) {..int len =
0ae0: 54 63 6c 5f 52 65 61 64 52 61 77 28 63 68 61 6e Tcl_ReadRaw(chan
0af0: 2c 20 28 63 68 61 72 20 2a 29 20 62 75 66 2c 20 , (char *) buf,
0b00: 42 55 46 46 45 52 5f 53 49 5a 45 29 3b 0a 09 69 BUFFER_SIZE);..i
0b10: 66 20 28 6b 65 79 4f 62 6a 20 3d 3d 20 4e 55 4c f (keyObj == NUL
0b20: 4c 29 20 7b 0a 09 20 20 20 20 72 65 73 20 3d 20 L) {.. res =
0b30: 45 56 50 5f 44 69 67 65 73 74 55 70 64 61 74 65 EVP_DigestUpdate
0b40: 28 63 74 78 2c 20 26 62 75 66 2c 20 28 73 69 7a (ctx, &buf, (siz
0b50: 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 7d 20 65 6c e_t) len);..} el
0b60: 73 65 20 7b 0a 09 20 20 20 20 72 65 73 20 3d 20 se {.. res =
0b70: 48 4d 41 43 5f 55 70 64 61 74 65 28 68 63 74 78 HMAC_Update(hctx
0b80: 2c 20 26 62 75 66 5b 30 5d 2c 20 28 73 69 7a 65 , &buf[0], (size
0b90: 5f 74 29 20 6c 65 6e 29 3b 0a 09 7d 0a 09 69 66 _t) len);..}..if
0ba0: 20 28 6c 65 6e 20 3e 20 30 20 26 26 20 21 72 65 (len > 0 && !re
0bb0: 73 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 s) {.. Tcl_Ap
0bc0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
0bd0: 70 2c 20 22 55 70 64 61 74 65 20 64 69 67 65 73 p, "Update diges
0be0: 74 20 66 61 69 6c 65 64 3a 20 22 2c 20 52 45 41 t failed: ", REA
0bf0: 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 20 SON(), NULL);..
0c00: 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 09 goto error;..
0c10: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 }. }.. /*
0c20: 43 6c 6f 73 65 20 63 68 61 6e 6e 65 6c 20 2a 2f Close channel */
0c30: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 43 6c 6f . if (Tcl_Clo
0c40: 73 65 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 se(interp, chan)
0c50: 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b == TCL_ERROR) {
0c60: 0a 09 63 68 61 6e 20 3d 20 28 54 63 6c 5f 43 68 ..chan = (Tcl_Ch
0c70: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 3b 0a 09 67 6f annel) NULL;..go
0c80: 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a to error;. }.
0c90: 20 20 20 20 63 68 61 6e 20 3d 20 28 54 63 6c 5f chan = (Tcl_
0ca0: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 3b 0a 0a Channel) NULL;..
0cb0: 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 /* Finalize
0cc0: 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 61 6e hash function an
0cd0: 64 20 63 61 6c 63 75 6c 61 74 65 20 6d 65 73 73 d calculate mess
0ce0: 61 67 65 20 64 69 67 65 73 74 20 2a 2f 0a 20 20 age digest */.
0cf0: 20 20 69 66 20 28 6b 65 79 4f 62 6a 20 3d 3d 20 if (keyObj ==
0d00: 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 20 3d 20 45 NULL) {..res = E
0d10: 56 50 5f 44 69 67 65 73 74 46 69 6e 61 6c 5f 65 VP_DigestFinal_e
0d20: 78 28 63 74 78 2c 20 6d 64 5f 62 75 66 2c 20 26 x(ctx, md_buf, &
0d30: 6d 64 5f 6c 65 6e 29 3b 0a 20 20 20 20 7d 20 65 md_len);. } e
0d40: 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 48 4d 41 lse {..res = HMA
0d50: 43 5f 46 69 6e 61 6c 28 68 63 74 78 2c 20 6d 64 C_Final(hctx, md
0d60: 5f 62 75 66 2c 20 26 6d 64 5f 6c 65 6e 29 3b 0a _buf, &md_len);.
0d70: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 72 }. if (!r
0d80: 65 73 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e es) {..Tcl_Appen
0d90: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
0da0: 22 46 69 6e 61 6c 69 7a 65 20 64 69 67 65 73 74 "Finalize digest
0db0: 20 66 61 69 6c 65 64 3a 20 22 2c 20 52 45 41 53 failed: ", REAS
0dc0: 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 67 6f ON(), NULL);..go
0dd0: 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a to error;. }.
0de0: 0a 20 20 20 20 2f 2a 20 44 6f 6e 65 20 77 69 74 . /* Done wit
0df0: 68 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 20 20 h struct */.
0e00: 45 56 50 5f 4d 44 5f 43 54 58 5f 66 72 65 65 28 EVP_MD_CTX_free(
0e10: 63 74 78 29 3b 0a 20 20 20 20 63 74 78 20 3d 20 ctx);. ctx =
0e20: 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 NULL;.. /* Re
0e30: 74 75 72 6e 20 6d 65 73 73 61 67 65 20 64 69 67 turn message dig
0e40: 65 73 74 20 61 73 20 65 69 74 68 65 72 20 61 20 est as either a
0e50: 62 69 6e 61 72 79 20 6f 72 20 68 65 78 20 73 74 binary or hex st
0e60: 72 69 6e 67 20 2a 2f 0a 20 20 20 20 69 66 20 28 ring */. if (
0e70: 66 6f 72 6d 61 74 20 3d 3d 20 42 49 4e 5f 46 4f format == BIN_FO
0e80: 52 4d 41 54 29 20 7b 0a 09 54 63 6c 5f 53 65 74 RMAT) {..Tcl_Set
0e90: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
0ea0: 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 , Tcl_NewByteArr
0eb0: 61 79 4f 62 6a 28 6d 64 5f 62 75 66 2c 20 6d 64 ayObj(md_buf, md
0ec0: 5f 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 7d 20 65 _len));.. } e
0ed0: 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a lse {..Tcl_Obj *
0ee0: 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f resultObj = Tcl_
0ef0: 4e 65 77 4f 62 6a 28 29 3b 0a 09 75 6e 73 69 67 NewObj();..unsig
0f00: 6e 65 64 20 63 68 61 72 20 2a 70 74 72 20 3d 20 ned char *ptr =
0f10: 54 63 6c 5f 53 65 74 42 79 74 65 41 72 72 61 79 Tcl_SetByteArray
0f20: 4c 65 6e 67 74 68 28 72 65 73 75 6c 74 4f 62 6a Length(resultObj
0f30: 2c 20 6d 64 5f 6c 65 6e 2a 32 29 3b 0a 0a 09 66 , md_len*2);...f
0f40: 6f 72 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 or (unsigned int
0f50: 20 69 20 3d 20 30 3b 20 69 20 3c 20 6d 64 5f 6c i = 0; i < md_l
0f60: 65 6e 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 en; i++) {..
0f70: 2a 70 74 72 2b 2b 20 3d 20 68 65 78 5b 28 6d 64 *ptr++ = hex[(md
0f80: 5f 62 75 66 5b 69 5d 20 3e 3e 20 34 29 20 26 20 _buf[i] >> 4) &
0f90: 30 78 30 46 5d 3b 0a 09 20 20 20 20 2a 70 74 72 0x0F];.. *ptr
0fa0: 2b 2b 20 3d 20 68 65 78 5b 6d 64 5f 62 75 66 5b ++ = hex[md_buf[
0fb0: 69 5d 20 26 20 30 78 30 46 5d 3b 0a 09 7d 0a 09 i] & 0x0F];..}..
0fc0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
0fd0: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f (interp, resultO
0fe0: 62 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 bj);. }. r
0ff0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 65 eturn TCL_OK;..e
1000: 72 72 6f 72 3a 0a 20 20 20 20 69 66 20 28 63 68 rror:. if (ch
1010: 61 6e 20 21 3d 20 28 54 63 6c 5f 43 68 61 6e 6e an != (Tcl_Chann
1020: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c el) NULL) {..Tcl
1030: 5f 43 6c 6f 73 65 28 69 6e 74 65 72 70 2c 20 63 _Close(interp, c
1040: 68 61 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 han);. }.
1050: 69 66 20 28 63 74 78 20 21 3d 20 28 45 56 50 5f if (ctx != (EVP_
1060: 4d 44 5f 43 54 58 20 2a 29 20 4e 55 4c 4c 29 20 MD_CTX *) NULL)
1070: 7b 0a 09 45 56 50 5f 4d 44 5f 43 54 58 5f 66 72 {..EVP_MD_CTX_fr
1080: 65 65 28 63 74 78 29 3b 0a 20 20 20 20 7d 0a 20 ee(ctx);. }.
1090: 20 20 20 69 66 20 28 68 63 74 78 20 21 3d 20 28 if (hctx != (
10a0: 48 4d 41 43 5f 43 54 58 20 2a 29 20 4e 55 4c 4c HMAC_CTX *) NULL
10b0: 29 20 7b 0a 09 48 4d 41 43 5f 43 54 58 5f 66 72 ) {..HMAC_CTX_fr
10c0: 65 65 28 68 63 74 78 29 3b 0a 20 20 20 20 7d 0a ee(hctx);. }.
10d0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
10e0: 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a RROR;.}../******
10f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a *************/..
1130: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
1140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1170: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 --------. *. * D
1180: 69 67 65 73 74 42 6c 6f 63 6b 4d 6f 64 65 50 72 igestBlockModePr
1190: 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 oc --. *. *.This
11a0: 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e procedure is in
11b0: 76 6f 6b 65 64 20 62 79 20 74 68 65 20 67 65 6e voked by the gen
11c0: 65 72 69 63 20 49 4f 20 6c 65 76 65 6c 0a 20 2a eric IO level. *
11d0: 20 20 20 20 20 20 20 74 6f 20 73 65 74 20 62 6c to set bl
11e0: 6f 63 6b 69 6e 67 20 61 6e 64 20 6e 6f 6e 62 6c ocking and nonbl
11f0: 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 2e 0a 20 2a ocking modes.. *
1200: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 . * Returns:. *.
1210: 30 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 0 if successful
1220: 6f 72 20 50 4f 53 49 58 20 65 72 72 6f 72 20 63 or POSIX error c
1230: 6f 64 65 20 69 66 20 66 61 69 6c 65 64 2e 0a 20 ode if failed..
1240: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
1250: 73 3a 0a 20 2a 09 53 65 74 73 20 74 68 65 20 64 s:. *.Sets the d
1260: 65 76 69 63 65 20 69 6e 74 6f 20 62 6c 6f 63 6b evice into block
1270: 69 6e 67 20 6f 72 20 6e 6f 6e 62 6c 6f 63 6b 69 ing or nonblocki
1280: 6e 67 20 6d 6f 64 65 2e 0a 20 2a 09 43 61 6e 20 ng mode.. *.Can
1290: 63 61 6c 6c 20 54 63 6c 5f 53 65 74 43 68 61 6e call Tcl_SetChan
12a0: 6e 65 6c 45 72 72 6f 72 2e 0a 20 2a 0a 20 2a 2d nelError.. *. *-
12b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12f0: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
1300: 74 20 44 69 67 65 73 74 42 6c 6f 63 6b 4d 6f 64 t DigestBlockMod
1310: 65 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 eProc(ClientData
1320: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e 74 clientData, int
1330: 20 6d 6f 64 65 29 20 7b 0a 20 20 20 20 44 69 67 mode) {. Dig
1340: 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 estState *stateP
1350: 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 tr = (DigestStat
1360: 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b e *) clientData;
1370: 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 20 3d .. if (mode =
1380: 3d 20 54 43 4c 5f 4d 4f 44 45 5f 4e 4f 4e 42 4c = TCL_MODE_NONBL
1390: 4f 43 4b 49 4e 47 29 20 7b 0a 09 73 74 61 74 65 OCKING) {..state
13a0: 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c Ptr->flags |= TL
13b0: 53 5f 54 43 4c 5f 41 53 59 4e 43 3b 0a 20 20 20 S_TCL_ASYNC;.
13c0: 20 7d 20 65 6c 73 65 20 7b 0a 09 73 74 61 74 65 } else {..state
13d0: 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 Ptr->flags &= ~(
13e0: 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29 3b 0a TLS_TCL_ASYNC);.
13f0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e }. return
1400: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 0;.}../*. *----
1410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
1450: 20 2a 0a 20 2a 20 44 69 67 65 73 74 46 72 65 65 *. * DigestFree
1460: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 --. *. *.This p
1470: 72 6f 63 65 64 75 72 65 20 72 65 6d 6f 76 65 73 rocedure removes
1480: 20 61 20 64 69 67 65 73 74 20 73 74 61 74 65 20 a digest state
1490: 73 74 72 75 63 74 75 72 65 0a 20 2a 0a 20 2a 20 structure. *. *
14a0: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 4e 6f 74 68 Returns:. *.Noth
14b0: 69 6e 67 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ing. *. * Side e
14c0: 66 66 65 63 74 73 3a 0a 20 2a 09 52 65 6d 6f 76 ffects:. *.Remov
14d0: 65 73 20 73 74 72 75 63 74 75 72 65 0a 20 2a 0a es structure. *.
14e0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
14f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1520: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 44 -----. */.void D
1530: 69 67 65 73 74 46 72 65 65 20 28 44 69 67 65 73 igestFree (Diges
1540: 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 tState *statePtr
1550: 29 20 7b 0a 20 20 20 20 69 66 20 28 73 74 61 74 ) {. if (stat
1560: 65 50 74 72 20 3d 3d 20 28 44 69 67 65 73 74 53 ePtr == (DigestS
1570: 74 61 74 65 20 2a 29 20 4e 55 4c 4c 29 20 72 65 tate *) NULL) re
1580: 74 75 72 6e 3b 0a 20 20 20 20 0a 20 20 20 20 69 turn;. . i
1590: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 f (statePtr->ctx
15a0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 45 56 50 != NULL) {..EVP
15b0: 5f 4d 44 5f 43 54 58 5f 66 72 65 65 28 73 74 61 _MD_CTX_free(sta
15c0: 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20 tePtr->ctx);.
15d0: 20 7d 0a 20 20 20 20 63 6b 66 72 65 65 28 73 74 }. ckfree(st
15e0: 61 74 65 50 74 72 29 3b 0a 7d 0a 0a 2f 2a 0a 20 atePtr);.}../*.
15f0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
1600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1630: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 ----. *. * Diges
1640: 74 43 6c 6f 73 65 50 72 6f 63 20 2d 2d 0a 20 2a tCloseProc --. *
1650: 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 . *.This procedu
1660: 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 re is invoked by
1670: 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 the generic IO
1680: 6c 65 76 65 6c 20 74 6f 20 70 65 72 66 6f 72 6d level to perform
1690: 0a 20 2a 09 63 68 61 6e 6e 65 6c 2d 74 79 70 65 . *.channel-type
16a0: 2d 73 70 65 63 69 66 69 63 20 63 6c 65 61 6e 75 -specific cleanu
16b0: 70 20 77 68 65 6e 20 64 69 67 65 73 74 20 63 68 p when digest ch
16c0: 61 6e 6e 65 6c 20 69 73 20 63 6c 6f 73 65 64 2e annel is closed.
16d0: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a . *. * Returns:.
16e0: 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c *.TCL_OK or TCL
16f0: 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 _ERROR. *. * Sid
1700: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 57 72 e effects:. *.Wr
1710: 69 74 65 73 20 64 69 67 65 73 74 20 74 6f 20 6f ites digest to o
1720: 75 74 70 75 74 20 61 6e 64 20 63 6c 6f 73 65 73 utput and closes
1730: 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a the channel.. *
1740: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
1750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1780: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 ------. */.int D
1790: 69 67 65 73 74 43 6c 6f 73 65 50 72 6f 63 28 43 igestCloseProc(C
17a0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
17b0: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
17c0: 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 *interp) {.
17d0: 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 DigestState *sta
17e0: 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 tePtr = (DigestS
17f0: 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 tate *) clientDa
1800: 74 61 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 75 ta;. int resu
1810: 6c 74 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 lt = 0;.. /*
1820: 43 61 6e 63 65 6c 20 61 63 74 69 76 65 20 74 69 Cancel active ti
1830: 6d 65 72 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 mer, if any */.
1840: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
1850: 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 >timer != (Tcl_T
1860: 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 imerToken) NULL)
1870: 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 {..Tcl_DeleteTi
1880: 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 merHandler(state
1890: 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 Ptr->timer);..st
18a0: 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 atePtr->timer =
18b0: 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 (Tcl_TimerToken)
18c0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 NULL;. }..
18d0: 20 20 2f 2a 20 43 6c 65 61 6e 2d 75 70 20 2a 2f /* Clean-up */
18e0: 0a 20 20 20 20 44 69 67 65 73 74 46 72 65 65 28 . DigestFree(
18f0: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 72 statePtr);. r
1900: 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a 7d 0a eturn result;.}.
1910: 0a 2f 2a 0a 20 2a 20 53 61 6d 65 20 61 73 20 44 ./*. * Same as D
1920: 69 67 65 73 74 43 6c 6f 73 65 50 72 6f 63 20 62 igestCloseProc b
1930: 75 74 20 77 69 74 68 20 69 6e 64 69 76 69 64 75 ut with individu
1940: 61 6c 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 al read and writ
1950: 65 20 63 6c 6f 73 65 20 63 6f 6e 74 72 6f 6c 0a e close control.
1960: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 */.static int D
1970: 69 67 65 73 74 43 6c 6f 73 65 32 50 72 6f 63 28 igestClose2Proc(
1980: 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 ClientData insta
1990: 6e 63 65 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 nceData, Tcl_Int
19a0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
19b0: 20 66 6c 61 67 73 29 20 7b 0a 0a 20 20 20 20 69 flags) {.. i
19c0: 66 20 28 28 66 6c 61 67 73 20 26 20 28 54 43 4c f ((flags & (TCL
19d0: 5f 43 4c 4f 53 45 5f 52 45 41 44 20 7c 20 54 43 _CLOSE_READ | TC
19e0: 4c 5f 43 4c 4f 53 45 5f 57 52 49 54 45 29 29 20 L_CLOSE_WRITE))
19f0: 3d 3d 20 30 29 20 7b 0a 09 72 65 74 75 72 6e 20 == 0) {..return
1a00: 44 69 67 65 73 74 43 6c 6f 73 65 50 72 6f 63 28 DigestCloseProc(
1a10: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e instanceData, in
1a20: 74 65 72 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 terp);. }.
1a30: 20 72 65 74 75 72 6e 20 45 49 4e 56 41 4c 3b 0a return EINVAL;.
1a40: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d }../*. *--------
1a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
1a90: 2a 0a 20 2a 20 44 69 67 65 73 74 49 6e 70 75 74 *. * DigestInput
1aa0: 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 Proc --. *. *.Ca
1ab0: 6c 6c 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 lled by the gene
1ac0: 72 69 63 20 49 4f 20 73 79 73 74 65 6d 20 74 6f ric IO system to
1ad0: 20 72 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 read data from
1ae0: 74 72 61 6e 73 66 6f 72 6d 2e 0a 20 2a 0a 20 2a transform.. *. *
1af0: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 6f 74 Returns:. *.Tot
1b00: 61 6c 20 62 79 74 65 73 20 72 65 61 64 0a 20 2a al bytes read. *
1b10: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
1b20: 3a 0a 20 2a 09 52 65 61 64 20 64 61 74 61 20 66 :. *.Read data f
1b30: 72 6f 6d 20 74 72 61 6e 73 66 6f 72 6d 20 61 6e rom transform an
1b40: 64 20 77 72 69 74 65 20 74 6f 20 62 75 66 0a 20 d write to buf.
1b50: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
1b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 ----------. */.i
1ba0: 6e 74 20 44 69 67 65 73 74 49 6e 70 75 74 50 72 nt DigestInputPr
1bb0: 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c oc(ClientData cl
1bc0: 69 65 6e 74 44 61 74 61 2c 20 63 68 61 72 20 2a ientData, char *
1bd0: 62 75 66 2c 20 69 6e 74 20 74 6f 52 65 61 64 2c buf, int toRead,
1be0: 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 int *errorCodeP
1bf0: 74 72 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 tr) {. Digest
1c00: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 State *statePtr
1c10: 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a = (DigestState *
1c20: 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 ) clientData;.
1c30: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 70 61 Tcl_Channel pa
1c40: 72 65 6e 74 3b 0a 20 20 20 20 69 6e 74 20 72 65 rent;. int re
1c50: 61 64 3b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f ad;. *errorCo
1c60: 64 65 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20 dePtr = 0;..
1c70: 69 66 20 28 74 6f 52 65 61 64 20 3c 3d 20 30 20 if (toRead <= 0
1c80: 7c 7c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c || statePtr->sel
1c90: 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 f == (Tcl_Channe
1ca0: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 l) NULL) {..retu
1cb0: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 rn 0;. }..
1cc0: 20 2f 2a 20 47 65 74 20 62 79 74 65 73 20 66 72 /* Get bytes fr
1cd0: 6f 6d 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 68 om underlying ch
1ce0: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 70 61 72 annel */. par
1cf0: 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 ent = Tcl_GetSta
1d00: 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 ckedChannel(stat
1d10: 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 ePtr->self);.
1d20: 20 72 65 61 64 20 3d 20 54 63 6c 5f 52 65 61 64 read = Tcl_Read
1d30: 52 61 77 28 70 61 72 65 6e 74 2c 20 62 75 66 2c Raw(parent, buf,
1d40: 20 74 6f 52 65 61 64 29 3b 0a 0a 20 20 20 20 2f toRead);.. /
1d50: 2a 20 41 64 64 20 74 6f 20 6d 65 73 73 61 67 65 * Add to message
1d60: 20 64 69 67 65 73 74 20 2a 2f 0a 20 20 20 20 69 digest */. i
1d70: 66 20 28 72 65 61 64 20 3e 20 30 29 20 7b 0a 09 f (read > 0) {..
1d80: 2f 2a 20 4f 4b 20 2a 2f 0a 09 69 66 20 28 21 45 /* OK */..if (!E
1d90: 56 50 5f 44 69 67 65 73 74 55 70 64 61 74 65 28 VP_DigestUpdate(
1da0: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 62 statePtr->ctx, b
1db0: 75 66 2c 20 72 65 61 64 29 29 20 7b 0a 09 20 20 uf, read)) {..
1dc0: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c Tcl_SetChannel
1dd0: 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2d 3e Error(statePtr->
1de0: 73 65 6c 66 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 self, Tcl_ObjPri
1df0: 6e 74 66 28 22 44 69 67 65 73 74 20 75 70 64 61 ntf("Digest upda
1e00: 74 65 20 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 te failed: %s",
1e10: 52 45 41 53 4f 4e 28 29 29 29 3b 0a 09 20 20 20 REASON()));..
1e20: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d *errorCodePtr =
1e30: 20 45 49 4e 56 41 4c 3b 0a 09 20 20 20 20 72 65 EINVAL;.. re
1e40: 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 09 2a 65 72 turn -1;..}..*er
1e50: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 rorCodePtr = EAG
1e60: 41 49 4e 3b 0a 09 72 65 61 64 20 3d 20 2d 31 3b AIN;..read = -1;
1e70: 0a 09 20 20 20 20 0a 20 20 20 20 7d 20 65 6c 73 .. . } els
1e80: 65 20 69 66 20 28 72 65 61 64 20 3c 20 30 29 20 e if (read < 0)
1e90: 7b 0a 09 2f 2a 20 45 72 72 6f 72 20 2a 2f 0a 09 {../* Error */..
1ea0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 *errorCodePtr =
1eb0: 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b 0a Tcl_GetErrno();.
1ec0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
1ed0: 21 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 !(statePtr->flag
1ee0: 73 20 26 20 30 78 31 30 29 29 20 7b 0a 09 2f 2a s & 0x10)) {../*
1ef0: 20 45 4f 46 20 2a 2f 0a 09 2a 65 72 72 6f 72 43 EOF */..*errorC
1f00: 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 75 6e 73 odePtr = 0;..uns
1f10: 69 67 6e 65 64 20 63 68 61 72 20 6d 64 5f 62 75 igned char md_bu
1f20: 66 5b 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a f[EVP_MAX_MD_SIZ
1f30: 45 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e E];..unsigned in
1f40: 74 20 6d 64 5f 6c 65 6e 20 3d 20 30 3b 0a 0a 09 t md_len = 0;...
1f50: 2f 2a 20 47 65 74 20 6d 65 73 73 61 67 65 20 64 /* Get message d
1f60: 69 67 65 73 74 20 2a 2f 0a 09 69 66 20 28 21 45 igest */..if (!E
1f70: 56 50 5f 44 69 67 65 73 74 46 69 6e 61 6c 5f 65 VP_DigestFinal_e
1f80: 78 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c x(statePtr->ctx,
1f90: 20 6d 64 5f 62 75 66 2c 20 26 6d 64 5f 6c 65 6e md_buf, &md_len
1fa0: 29 29 20 7b 0a 09 20 20 20 20 2a 65 72 72 6f 72 )) {.. *error
1fb0: 43 6f 64 65 50 74 72 20 3d 20 45 49 4e 56 41 4c CodePtr = EINVAL
1fc0: 3b 0a 0a 09 2f 2a 20 57 72 69 74 65 20 6d 65 73 ;.../* Write mes
1fd0: 73 61 67 65 20 64 69 67 65 73 74 20 74 6f 20 6f sage digest to o
1fe0: 75 74 70 75 74 20 63 68 61 6e 6e 65 6c 20 61 73 utput channel as
1ff0: 20 62 79 74 65 20 61 72 72 61 79 20 6f 72 20 68 byte array or h
2000: 65 78 20 73 74 72 69 6e 67 20 2a 2f 0a 09 7d 20 ex string */..}
2010: 65 6c 73 65 20 69 66 20 28 6d 64 5f 6c 65 6e 20 else if (md_len
2020: 3e 20 30 29 20 7b 0a 09 20 20 20 20 69 66 20 28 > 0) {.. if (
2030: 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 statePtr->format
2040: 20 3d 3d 20 42 49 4e 5f 46 4f 52 4d 41 54 29 20 == BIN_FORMAT)
2050: 7b 0a 09 09 72 65 61 64 20 3d 20 6d 64 5f 6c 65 {...read = md_le
2060: 6e 3b 0a 09 09 6d 65 6d 63 70 79 28 62 75 66 2c n;...memcpy(buf,
2070: 20 6d 64 5f 62 75 66 2c 20 72 65 61 64 29 3b 0a md_buf, read);.
2080: 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 .. } else {..
2090: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 68 .unsigned char h
20a0: 65 78 5f 62 75 66 5b 45 56 50 5f 4d 41 58 5f 4d ex_buf[EVP_MAX_M
20b0: 44 5f 53 49 5a 45 2a 32 5d 3b 0a 09 09 75 6e 73 D_SIZE*2];...uns
20c0: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 74 72 20 igned char *ptr
20d0: 3d 20 68 65 78 5f 62 75 66 3b 0a 0a 09 09 66 6f = hex_buf;....fo
20e0: 72 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 r (unsigned int
20f0: 69 20 3d 20 30 3b 20 69 20 3c 20 6d 64 5f 6c 65 i = 0; i < md_le
2100: 6e 3b 20 69 2b 2b 29 20 7b 0a 09 09 20 20 20 20 n; i++) {...
2110: 2a 70 74 72 2b 2b 20 3d 20 68 65 78 5b 28 6d 64 *ptr++ = hex[(md
2120: 5f 62 75 66 5b 69 5d 20 3e 3e 20 34 29 20 26 20 _buf[i] >> 4) &
2130: 30 78 30 46 5d 3b 0a 09 09 20 20 20 20 2a 70 74 0x0F];... *pt
2140: 72 2b 2b 20 3d 20 68 65 78 5b 6d 64 5f 62 75 66 r++ = hex[md_buf
2150: 5b 69 5d 20 26 20 30 78 30 46 5d 3b 0a 09 09 7d [i] & 0x0F];...}
2160: 0a 09 09 72 65 61 64 20 3d 20 6d 64 5f 6c 65 6e ...read = md_len
2170: 2a 32 3b 0a 09 09 6d 65 6d 63 70 79 28 62 75 66 *2;...memcpy(buf
2180: 2c 20 68 65 78 5f 62 75 66 2c 20 72 65 61 64 29 , hex_buf, read)
2190: 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 73 74 61 ;.. }..}..sta
21a0: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 tePtr->flags |=
21b0: 30 78 31 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0x10;. }.
21c0: 72 65 74 75 72 6e 20 72 65 61 64 3b 0a 7d 0a 0a return read;.}..
21d0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
21e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
21f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
2220: 2a 20 44 69 67 65 73 74 4f 75 74 70 75 74 50 72 * DigestOutputPr
2230: 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c oc --. *. *.Call
2240: 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 ed by the generi
2250: 63 20 49 4f 20 73 79 73 74 65 6d 20 74 6f 20 77 c IO system to w
2260: 72 69 74 65 20 64 61 74 61 20 74 6f 20 74 72 61 rite data to tra
2270: 6e 73 66 6f 72 6d 2e 0a 20 2a 0a 20 2a 20 52 65 nsform.. *. * Re
2280: 74 75 72 6e 73 3a 0a 20 2a 09 54 6f 74 61 6c 20 turns:. *.Total
2290: 62 79 74 65 73 20 77 72 69 74 74 65 6e 0a 20 2a bytes written. *
22a0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
22b0: 3a 0a 20 2a 09 47 65 74 20 64 61 74 61 20 66 72 :. *.Get data fr
22c0: 6f 6d 20 62 75 66 20 61 6e 64 20 75 70 64 61 74 om buf and updat
22d0: 65 20 64 69 67 65 73 74 0a 20 2a 0a 20 2a 2d 2d e digest. *. *--
22e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
22f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2320: 2d 2d 2d 2d 0a 20 2a 2f 0a 20 69 6e 74 20 44 69 ----. */. int Di
2330: 67 65 73 74 4f 75 74 70 75 74 50 72 6f 63 28 43 gestOutputProc(C
2340: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
2350: 44 61 74 61 2c 20 63 6f 6e 73 74 20 63 68 61 72 Data, const char
2360: 20 2a 62 75 66 2c 20 69 6e 74 20 74 6f 57 72 69 *buf, int toWri
2370: 74 65 2c 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f te, int *errorCo
2380: 64 65 50 74 72 29 20 7b 0a 20 20 20 20 44 69 67 dePtr) {. Dig
2390: 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 estState *stateP
23a0: 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 tr = (DigestStat
23b0: 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b e *) clientData;
23c0: 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 . *errorCodeP
23d0: 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 20 tr = 0;.. if
23e0: 28 74 6f 57 72 69 74 65 20 3c 3d 20 30 20 7c 7c (toWrite <= 0 ||
23f0: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 statePtr->self
2400: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 == (Tcl_Channel)
2410: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
2420: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 0;. }. re
2430: 74 75 72 6e 20 74 6f 57 72 69 74 65 3b 0a 7d 0a turn toWrite;.}.
2440: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
2450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
2490: 20 2a 20 44 69 67 65 73 74 53 65 74 4f 70 74 69 * DigestSetOpti
24a0: 6f 6e 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 onProc --. *. *.
24b0: 43 61 6c 6c 65 64 20 62 79 20 74 68 65 20 67 65 Called by the ge
24c0: 6e 65 72 69 63 20 49 4f 20 73 79 73 74 65 6d 20 neric IO system
24d0: 74 6f 20 73 65 74 20 63 68 61 6e 6e 65 6c 20 6f to set channel o
24e0: 70 74 69 6f 6e 20 74 6f 20 76 61 6c 75 65 2e 0a ption to value..
24f0: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 *. * Returns:.
2500: 2a 09 54 43 4c 5f 4f 4b 20 69 66 20 73 75 63 63 *.TCL_OK if succ
2510: 65 73 73 66 75 6c 20 6f 72 20 54 43 4c 5f 45 52 essful or TCL_ER
2520: 52 4f 52 20 69 66 20 66 61 69 6c 65 64 2e 0a 20 ROR if failed..
2530: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
2540: 73 3a 0a 20 2a 09 55 70 64 61 74 65 73 20 63 68 s:. *.Updates ch
2550: 61 6e 6e 65 6c 20 6f 70 74 69 6f 6e 20 74 6f 20 annel option to
2560: 6e 65 77 20 76 61 6c 75 65 2e 0a 20 2a 0a 20 2a new value.. *. *
2570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
25a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
25b0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
25c0: 63 20 69 6e 74 20 44 69 67 65 73 74 53 65 74 4f c int DigestSetO
25d0: 70 74 69 6f 6e 50 72 6f 63 28 43 6c 69 65 6e 74 ptionProc(Client
25e0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
25f0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
2600: 65 72 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 erp, const char
2610: 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c 0a 09 63 6f *optionName,..co
2620: 6e 73 74 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e nst char *option
2630: 56 61 6c 75 65 29 20 7b 0a 20 20 20 20 44 69 67 Value) {. Dig
2640: 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 estState *stateP
2650: 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 tr = (DigestStat
2660: 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b e *) clientData;
2670: 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c . Tcl_Channel
2680: 20 70 61 72 65 6e 74 3b 0a 20 20 20 20 54 63 6c parent;. Tcl
2690: 5f 44 72 69 76 65 72 53 65 74 4f 70 74 69 6f 6e _DriverSetOption
26a0: 50 72 6f 63 20 2a 73 65 74 4f 70 74 69 6f 6e 50 Proc *setOptionP
26b0: 72 6f 63 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 roc;.. if (st
26c0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 atePtr->self ==
26d0: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 (Tcl_Channel) NU
26e0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 LL) {..return TC
26f0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
2700: 20 20 20 20 2f 2a 20 44 65 6c 65 67 61 74 65 20 /* Delegate
2710: 6f 70 74 69 6f 6e 73 20 64 6f 77 6e 73 74 72 65 options downstre
2720: 61 6d 20 2a 2f 0a 20 20 20 20 70 61 72 65 6e 74 am */. parent
2730: 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 = Tcl_GetStacke
2740: 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 dChannel(statePt
2750: 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 20 73 65 r->self);. se
2760: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 3d 20 54 63 tOptionProc = Tc
2770: 6c 5f 43 68 61 6e 6e 65 6c 53 65 74 4f 70 74 69 l_ChannelSetOpti
2780: 6f 6e 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 68 onProc(Tcl_GetCh
2790: 61 6e 6e 65 6c 54 79 70 65 28 70 61 72 65 6e 74 annelType(parent
27a0: 29 29 3b 0a 20 20 20 20 69 66 20 28 73 65 74 4f ));. if (setO
27b0: 70 74 69 6f 6e 50 72 6f 63 20 21 3d 20 4e 55 4c ptionProc != NUL
27c0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 28 2a 73 L) {..return (*s
27d0: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 29 28 54 63 etOptionProc)(Tc
27e0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 l_GetChannelInst
27f0: 61 6e 63 65 44 61 74 61 28 70 61 72 65 6e 74 29 anceData(parent)
2800: 2c 20 69 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e , interp, option
2810: 4e 61 6d 65 2c 20 6f 70 74 69 6f 6e 56 61 6c 75 Name, optionValu
2820: 65 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b e);. } else {
2830: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
2840: 4f 52 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a OR;. }.}../*.
2850: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
2860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2890: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 --------. *. * D
28a0: 69 67 65 73 74 47 65 74 4f 70 74 69 6f 6e 50 72 igestGetOptionPr
28b0: 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c oc --. *. *.Call
28c0: 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 ed by the generi
28d0: 63 20 49 4f 20 73 79 73 74 65 6d 20 74 6f 20 67 c IO system to g
28e0: 65 74 20 63 68 61 6e 6e 65 6c 20 6f 70 74 69 6f et channel optio
28f0: 6e 27 73 20 76 61 6c 75 65 2e 0a 20 2a 0a 20 2a n's value.. *. *
2900: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c Returns:. *.TCL
2910: 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 _OK if successfu
2920: 6c 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 20 69 l or TCL_ERROR i
2930: 66 20 66 61 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20 f failed.. *. *
2940: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
2950: 09 53 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20 .Sets result to
2960: 6f 70 74 69 6f 6e 27 73 20 76 61 6c 75 65 0a 20 option's value.
2970: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
2980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
29a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
29b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
29c0: 74 61 74 69 63 20 69 6e 74 20 44 69 67 65 73 74 tatic int Digest
29d0: 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 43 6c GetOptionProc(Cl
29e0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
29f0: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
2a00: 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74 20 63 *interp, const c
2a10: 68 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c har *optionName,
2a20: 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 20 2a 6f ..Tcl_DString *o
2a30: 70 74 69 6f 6e 56 61 6c 75 65 29 20 7b 0a 20 20 ptionValue) {.
2a40: 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 DigestState *s
2a50: 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 tatePtr = (Diges
2a60: 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 tState *) client
2a70: 44 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 43 68 Data;. Tcl_Ch
2a80: 61 6e 6e 65 6c 20 70 61 72 65 6e 74 3b 0a 20 20 annel parent;.
2a90: 20 20 54 63 6c 5f 44 72 69 76 65 72 47 65 74 4f Tcl_DriverGetO
2aa0: 70 74 69 6f 6e 50 72 6f 63 20 2a 67 65 74 4f 70 ptionProc *getOp
2ab0: 74 69 6f 6e 50 72 6f 63 3b 0a 0a 20 20 20 20 69 tionProc;.. i
2ac0: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c f (statePtr->sel
2ad0: 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 f == (Tcl_Channe
2ae0: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 l) NULL) {..retu
2af0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
2b00: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 }.. /* Dele
2b10: 67 61 74 65 20 6f 70 74 69 6f 6e 73 20 64 6f 77 gate options dow
2b20: 6e 73 74 72 65 61 6d 20 2a 2f 0a 20 20 20 20 70 nstream */. p
2b30: 61 72 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 arent = Tcl_GetS
2b40: 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 tackedChannel(st
2b50: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 20 atePtr->self);.
2b60: 20 20 20 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 getOptionProc
2b70: 20 3d 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 47 65 = Tcl_ChannelGe
2b80: 74 4f 70 74 69 6f 6e 50 72 6f 63 28 54 63 6c 5f tOptionProc(Tcl_
2b90: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 70 GetChannelType(p
2ba0: 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 69 66 20 arent));. if
2bb0: 28 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 21 (getOptionProc !
2bc0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 = NULL) {..retur
2bd0: 6e 20 28 2a 67 65 74 4f 70 74 69 6f 6e 50 72 6f n (*getOptionPro
2be0: 63 29 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 c)(Tcl_GetChanne
2bf0: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 70 61 lInstanceData(pa
2c00: 72 65 6e 74 29 2c 20 69 6e 74 65 72 70 2c 20 6f rent), interp, o
2c10: 70 74 69 6f 6e 4e 61 6d 65 2c 20 6f 70 74 69 6f ptionName, optio
2c20: 6e 56 61 6c 75 65 29 3b 0a 20 20 20 20 7d 20 65 nValue);. } e
2c30: 6c 73 65 20 69 66 20 28 6f 70 74 69 6f 6e 4e 61 lse if (optionNa
2c40: 6d 65 20 3d 3d 20 28 63 68 61 72 2a 29 20 4e 55 me == (char*) NU
2c50: 4c 4c 29 20 7b 0a 09 2f 2a 20 52 65 71 75 65 73 LL) {../* Reques
2c60: 74 20 69 73 20 71 75 65 72 79 20 66 6f 72 20 61 t is query for a
2c70: 6c 6c 20 6f 70 74 69 6f 6e 73 2c 20 74 68 69 73 ll options, this
2c80: 20 69 73 20 6f 6b 2e 20 2a 2f 0a 09 72 65 74 75 is ok. */..retu
2c90: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d rn TCL_OK;. }
2ca0: 0a 0a 20 20 20 20 2f 2a 20 52 65 71 75 65 73 74 .. /* Request
2cb0: 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 for a specific
2cc0: 6f 70 74 69 6f 6e 20 68 61 73 20 74 6f 20 66 61 option has to fa
2cd0: 69 6c 2c 20 77 65 20 64 6f 6e 27 74 20 68 61 76 il, we don't hav
2ce0: 65 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 72 65 e any. */. re
2cf0: 74 75 72 6e 20 54 63 6c 5f 42 61 64 43 68 61 6e turn Tcl_BadChan
2d00: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
2d10: 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 22 22 , optionName, ""
2d20: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d );.}../*. *-----
2d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2d70: 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 54 69 -. *. * DigestTi
2d80: 6d 65 72 48 61 6e 64 6c 65 72 20 2d 2d 0a 20 2a merHandler --. *
2d90: 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79 20 74 68 . *.Called by th
2da0: 65 20 6e 6f 74 69 66 69 65 72 20 76 69 61 20 74 e notifier via t
2db0: 69 6d 65 72 20 74 6f 20 66 6c 75 73 68 20 6f 75 imer to flush ou
2dc0: 74 20 70 65 6e 64 69 6e 67 20 69 6e 70 75 74 20 t pending input
2dd0: 64 61 74 61 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 data.. *. * Retu
2de0: 72 6e 73 3a 0a 20 2a 09 4e 6f 74 68 69 6e 67 0a rns:. *.Nothing.
2df0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
2e00: 74 73 3a 0a 20 2a 09 4d 61 79 20 63 61 6c 6c 20 ts:. *.May call
2e10: 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61 6e 6e 65 Tcl_NotifyChanne
2e20: 6c 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d l. *. *---------
2e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
2e70: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44 69 /.static void Di
2e80: 67 65 73 74 54 69 6d 65 72 48 61 6e 64 6c 65 72 gestTimerHandler
2e90: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
2ea0: 6e 74 44 61 74 61 29 20 7b 0a 20 20 20 20 44 69 ntData) {. Di
2eb0: 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 gestState *state
2ec0: 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 Ptr = (DigestSta
2ed0: 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 te *) clientData
2ee0: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 ;.. if (state
2ef0: 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 Ptr->self == (Tc
2f00: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 l_Channel) NULL)
2f10: 20 7b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 {..return;.
2f20: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 72 20 }.. /* Clear
2f30: 74 69 6d 65 72 20 74 6f 6b 65 6e 20 2a 2f 0a 20 timer token */.
2f40: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 74 69 6d statePtr->tim
2f50: 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 er = (Tcl_TimerT
2f60: 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 0a 20 20 20 oken) NULL;..
2f70: 20 2f 2a 20 46 69 72 65 20 65 76 65 6e 74 20 69 /* Fire event i
2f80: 66 20 74 68 65 72 65 20 69 73 20 70 65 6e 64 69 f there is pendi
2f90: 6e 67 20 64 61 74 61 2c 20 73 6b 69 70 20 6f 74 ng data, skip ot
2fa0: 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 20 20 69 herwise */. i
2fb0: 66 20 28 28 73 74 61 74 65 50 74 72 2d 3e 77 61 f ((statePtr->wa
2fc0: 74 63 68 4d 61 73 6b 20 26 20 54 43 4c 5f 52 45 tchMask & TCL_RE
2fd0: 41 44 41 42 4c 45 29 20 26 26 20 28 54 63 6c 5f ADABLE) && (Tcl_
2fe0: 49 6e 70 75 74 42 75 66 66 65 72 65 64 28 73 74 InputBuffered(st
2ff0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 20 3e 20 atePtr->self) >
3000: 30 29 29 20 7b 0a 09 54 63 6c 5f 4e 6f 74 69 66 0)) {..Tcl_Notif
3010: 79 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 yChannel(statePt
3020: 72 2d 3e 73 65 6c 66 2c 20 54 43 4c 5f 52 45 41 r->self, TCL_REA
3030: 44 41 42 4c 45 29 3b 0a 20 20 20 20 7d 0a 7d 0a DABLE);. }.}.
3040: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
3050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
3090: 20 2a 20 44 69 67 65 73 74 57 61 74 63 68 50 72 * DigestWatchPr
30a0: 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 49 6e 69 74 oc --. *. *.Init
30b0: 69 61 6c 69 7a 65 20 74 68 65 20 6e 6f 74 69 66 ialize the notif
30c0: 69 65 72 20 74 6f 20 77 61 74 63 68 20 66 6f 72 ier to watch for
30d0: 20 65 76 65 6e 74 73 20 66 72 6f 6d 20 74 68 69 events from thi
30e0: 73 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a s channel.. *. *
30f0: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 4e 6f 74 Returns:. *.Not
3100: 68 69 6e 67 0a 20 2a 0a 20 2a 20 53 69 64 65 20 hing. *. * Side
3110: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 6f 6e 66 effects:. *.Conf
3120: 69 67 75 72 65 20 6e 6f 74 69 66 69 65 72 20 73 igure notifier s
3130: 6f 20 66 75 74 75 72 65 20 65 76 65 6e 74 73 20 o future events
3140: 6f 6e 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 77 on the channel w
3150: 69 6c 6c 20 62 65 20 73 65 65 6e 20 62 79 20 54 ill be seen by T
3160: 63 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d cl.. *. *-------
3170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
31a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
31b0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52 45 41 44 */.#define READ
31c0: 5f 44 45 4c 41 59 09 35 0a 76 6f 69 64 20 44 69 _DELAY.5.void Di
31d0: 67 65 73 74 57 61 74 63 68 50 72 6f 63 28 43 6c gestWatchProc(Cl
31e0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
31f0: 61 74 61 2c 20 69 6e 74 20 6d 61 73 6b 29 20 7b ata, int mask) {
3200: 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65 . DigestState
3210: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 *statePtr = (Di
3220: 67 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 gestState *) cli
3230: 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 54 63 6c entData;. Tcl
3240: 5f 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 3b _Channel parent;
3250: 0a 20 20 20 20 54 63 6c 5f 44 72 69 76 65 72 57 . Tcl_DriverW
3260: 61 74 63 68 50 72 6f 63 20 2a 77 61 74 63 68 50 atchProc *watchP
3270: 72 6f 63 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 roc;.. if (st
3280: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 atePtr->self ==
3290: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 (Tcl_Channel) NU
32a0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 3b 0a 20 LL) {..return;.
32b0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 74 6f }.. /* Sto
32c0: 72 65 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61 re OR-ed combina
32d0: 74 69 6f 6e 20 6f 66 20 54 43 4c 5f 52 45 41 44 tion of TCL_READ
32e0: 41 42 4c 45 2c 20 54 43 4c 5f 57 52 49 54 41 42 ABLE, TCL_WRITAB
32f0: 4c 45 20 61 6e 64 20 54 43 4c 5f 45 58 43 45 50 LE and TCL_EXCEP
3300: 54 49 4f 4e 20 2a 2f 0a 20 20 20 20 73 74 61 74 TION */. stat
3310: 65 50 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b 20 ePtr->watchMask
3320: 3d 20 6d 61 73 6b 3b 0a 0a 20 20 20 20 2f 2a 20 = mask;.. /*
3330: 50 72 6f 70 61 67 61 74 65 20 6d 61 73 6b 20 69 Propagate mask i
3340: 6e 66 6f 20 74 6f 20 70 61 72 65 6e 74 20 63 68 nfo to parent ch
3350: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 70 61 72 annel */. par
3360: 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 ent = Tcl_GetSta
3370: 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 ckedChannel(stat
3380: 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 ePtr->self);.
3390: 20 77 61 74 63 68 50 72 6f 63 20 3d 20 54 63 6c watchProc = Tcl
33a0: 5f 43 68 61 6e 6e 65 6c 57 61 74 63 68 50 72 6f _ChannelWatchPro
33b0: 63 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c c(Tcl_GetChannel
33c0: 54 79 70 65 28 70 61 72 65 6e 74 29 29 3b 0a 20 Type(parent));.
33d0: 20 20 20 77 61 74 63 68 50 72 6f 63 28 54 63 6c watchProc(Tcl
33e0: 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 _GetChannelInsta
33f0: 6e 63 65 44 61 74 61 28 70 61 72 65 6e 74 29 2c nceData(parent),
3400: 20 6d 61 73 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 mask);.. /*
3410: 52 65 6d 6f 76 65 20 70 65 6e 64 69 6e 67 20 74 Remove pending t
3420: 69 6d 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 28 imer */. if (
3430: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 statePtr->timer
3440: 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b != (Tcl_TimerTok
3450: 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c en) NULL) {..Tcl
3460: 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 _DeleteTimerHand
3470: 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69 ler(statePtr->ti
3480: 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d mer);..statePtr-
3490: 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 >timer = (Tcl_Ti
34a0: 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a merToken) NULL;.
34b0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 }.. /* If
34c0: 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20 70 there is data p
34d0: 65 6e 64 69 6e 67 2c 20 73 65 74 20 6e 65 77 20 ending, set new
34e0: 74 69 6d 65 72 20 74 6f 20 63 61 6c 6c 20 54 63 timer to call Tc
34f0: 6c 5f 4e 6f 74 69 66 79 43 68 61 6e 6e 65 6c 20 l_NotifyChannel
3500: 2a 2f 0a 20 20 20 20 69 66 20 28 28 6d 61 73 6b */. if ((mask
3510: 20 26 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 29 & TCL_READABLE)
3520: 20 26 26 20 28 54 63 6c 5f 49 6e 70 75 74 42 75 && (Tcl_InputBu
3530: 66 66 65 72 65 64 28 73 74 61 74 65 50 74 72 2d ffered(statePtr-
3540: 3e 73 65 6c 66 29 20 3e 20 30 29 29 20 7b 0a 09 >self) > 0)) {..
3550: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 statePtr->timer
3560: 3d 20 54 63 6c 5f 43 72 65 61 74 65 54 69 6d 65 = Tcl_CreateTime
3570: 72 48 61 6e 64 6c 65 72 28 52 45 41 44 5f 44 45 rHandler(READ_DE
3580: 4c 41 59 2c 20 44 69 67 65 73 74 54 69 6d 65 72 LAY, DigestTimer
3590: 48 61 6e 64 6c 65 72 2c 20 28 43 6c 69 65 6e 74 Handler, (Client
35a0: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b Data) statePtr);
35b0: 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2d . }.}../*. *-
35c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3600: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 -----. *. * Dige
3610: 73 74 47 65 74 48 61 6e 64 6c 65 50 72 6f 63 20 stGetHandleProc
3620: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 --. *. *.Called
3630: 66 72 6f 6d 20 54 63 6c 5f 47 65 74 43 68 61 6e from Tcl_GetChan
3640: 6e 65 6c 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 nelHandle to ret
3650: 72 69 65 76 65 20 4f 53 20 73 70 65 63 69 66 69 rieve OS specifi
3660: 63 20 66 69 6c 65 20 68 61 6e 64 6c 65 0a 20 2a c file handle. *
3670: 09 66 72 6f 6d 20 69 6e 73 69 64 65 20 74 68 69 .from inside thi
3680: 73 20 63 68 61 6e 6e 65 6c 2e 20 4e 6f 74 20 75 s channel. Not u
3690: 73 65 64 20 66 6f 72 20 74 72 61 6e 73 66 6f 72 sed for transfor
36a0: 6d 61 74 69 6f 6e 73 3f 0a 20 2a 0a 20 2a 20 52 mations?. *. * R
36b0: 65 74 75 72 6e 73 3a 0a 20 2a 09 49 66 20 64 69 eturns:. *.If di
36c0: 72 65 63 74 69 6f 6e 20 69 73 20 54 43 4c 5f 52 rection is TCL_R
36d0: 45 41 44 41 42 4c 45 20 72 65 74 75 72 6e 20 74 EADABLE return t
36e0: 68 65 20 68 61 6e 64 6c 65 20 75 73 65 64 20 66 he handle used f
36f0: 6f 72 20 69 6e 70 75 74 2c 20 6f 72 20 69 66 0a or input, or if.
3700: 20 2a 09 54 43 4c 5f 57 52 49 54 41 42 4c 45 20 *.TCL_WRITABLE
3710: 72 65 74 75 72 6e 20 74 68 65 20 68 61 6e 64 6c return the handl
3720: 65 20 75 73 65 64 20 66 6f 72 20 6f 75 74 70 75 e used for outpu
3730: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 t.. *. * Side ef
3740: 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 fects:. *.None.
3750: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
3760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 ----------. */.i
37a0: 6e 74 20 44 69 67 65 73 74 47 65 74 48 61 6e 64 nt DigestGetHand
37b0: 6c 65 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 leProc(ClientDat
37c0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e a clientData, in
37d0: 74 20 64 69 72 65 63 74 69 6f 6e 2c 20 43 6c 69 t direction, Cli
37e0: 65 6e 74 44 61 74 61 20 2a 68 61 6e 64 6c 65 50 entData *handleP
37f0: 74 72 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 tr) {. Digest
3800: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 State *statePtr
3810: 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a = (DigestState *
3820: 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 ) clientData;..
3830: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
3840: 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 >self == (Tcl_Ch
3850: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 annel) NULL) {..
3860: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
3870: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 ;. }. retu
3880: 72 6e 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 rn Tcl_GetChanne
3890: 6c 48 61 6e 64 6c 65 28 54 63 6c 5f 47 65 74 53 lHandle(Tcl_GetS
38a0: 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 tackedChannel(st
38b0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 64 atePtr->self), d
38c0: 69 72 65 63 74 69 6f 6e 2c 20 68 61 6e 64 6c 65 irection, handle
38d0: 50 74 72 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d Ptr);.}../*. *--
38e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
38f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3920: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 ----. *. * Diges
3930: 74 4e 6f 74 69 66 79 50 72 6f 63 20 2d 2d 0a 20 tNotifyProc --.
3940: 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79 20 54 *. *.Called by T
3950: 63 6c 20 74 6f 20 69 6e 66 6f 72 6d 20 75 73 20 cl to inform us
3960: 6f 66 20 61 63 74 69 76 69 74 79 20 6f 6e 20 74 of activity on t
3970: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 68 he underlying ch
3980: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 74 annel.. *. * Ret
3990: 75 72 6e 73 3a 0a 20 2a 09 55 6e 63 68 61 6e 67 urns:. *.Unchang
39a0: 65 64 20 69 6e 74 65 72 65 73 74 4d 61 73 6b 20 ed interestMask
39b0: 77 68 69 63 68 20 69 73 20 61 6e 20 4f 52 2d 65 which is an OR-e
39c0: 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 d combination of
39d0: 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 6f 72 TCL_READABLE or
39e0: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 0a 20 2a TCL_WRITABLE. *
39f0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
3a00: 3a 0a 20 2a 09 43 61 6e 63 65 6c 73 20 61 6e 79 :. *.Cancels any
3a10: 20 70 65 6e 64 69 6e 67 20 74 69 6d 65 72 2e 0a pending timer..
3a20: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
3a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
3a70: 69 6e 74 20 44 69 67 65 73 74 4e 6f 74 69 66 79 int DigestNotify
3a80: 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 Proc(ClientData
3a90: 63 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e 74 20 clientData, int
3aa0: 69 6e 74 65 72 65 73 74 4d 61 73 6b 29 20 7b 0a interestMask) {.
3ab0: 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20 DigestState
3ac0: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 *statePtr = (Dig
3ad0: 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 estState *) clie
3ae0: 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 ntData;.. /*
3af0: 53 6b 69 70 20 74 69 6d 65 72 20 65 76 65 6e 74 Skip timer event
3b00: 20 61 73 20 72 65 64 75 6e 64 61 6e 74 20 2a 2f as redundant */
3b10: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
3b20: 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c r->timer != (Tcl
3b30: 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c _TimerToken) NUL
3b40: 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 L) {..Tcl_Delete
3b50: 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61 TimerHandler(sta
3b60: 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 tePtr->timer);..
3b70: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 statePtr->timer
3b80: 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 = (Tcl_TimerToke
3b90: 6e 29 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 n) NULL;. }.
3ba0: 20 20 20 72 65 74 75 72 6e 20 69 6e 74 65 72 65 return intere
3bb0: 73 74 4d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a stMask;.}../*. *
3bc0: 0a 20 2a 20 43 68 61 6e 6e 65 6c 20 74 79 70 65 . * Channel type
3bd0: 20 73 74 72 75 63 74 75 72 65 20 64 65 66 69 6e structure defin
3be0: 69 74 69 6f 6e 20 66 6f 72 20 64 69 67 65 73 74 ition for digest
3bf0: 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 73 transformations
3c00: 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 .. *. */.static
3c10: 63 6f 6e 73 74 20 54 63 6c 5f 43 68 61 6e 6e 65 const Tcl_Channe
3c20: 6c 54 79 70 65 20 64 69 67 65 73 74 43 68 61 6e lType digestChan
3c30: 6e 65 6c 54 79 70 65 20 3d 20 7b 0a 20 20 20 20 nelType = {.
3c40: 22 64 69 67 65 73 74 22 2c 09 09 09 2f 2a 20 54 "digest",.../* T
3c50: 79 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 ype name */.
3c60: 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 TCL_CHANNEL_VERS
3c70: 49 4f 4e 5f 35 2c 09 2f 2a 20 76 35 20 63 68 61 ION_5,./* v5 cha
3c80: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 44 69 67 65 nnel */. Dige
3c90: 73 74 43 6c 6f 73 65 50 72 6f 63 2c 09 09 2f 2a stCloseProc,../*
3ca0: 20 43 6c 6f 73 65 20 70 72 6f 63 20 2a 2f 0a 20 Close proc */.
3cb0: 20 20 20 44 69 67 65 73 74 49 6e 70 75 74 50 72 DigestInputPr
3cc0: 6f 63 2c 09 09 2f 2a 20 49 6e 70 75 74 20 70 72 oc,../* Input pr
3cd0: 6f 63 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 oc */. Digest
3ce0: 4f 75 74 70 75 74 50 72 6f 63 2c 09 09 2f 2a 20 OutputProc,../*
3cf0: 4f 75 74 70 75 74 20 70 72 6f 63 20 2a 2f 0a 20 Output proc */.
3d00: 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 53 65 NULL,.../* Se
3d10: 65 6b 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 44 ek proc */. D
3d20: 69 67 65 73 74 53 65 74 4f 70 74 69 6f 6e 50 72 igestSetOptionPr
3d30: 6f 63 2c 09 2f 2a 20 53 65 74 20 6f 70 74 69 6f oc,./* Set optio
3d40: 6e 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 44 69 n proc */. Di
3d50: 67 65 73 74 47 65 74 4f 70 74 69 6f 6e 50 72 6f gestGetOptionPro
3d60: 63 2c 09 2f 2a 20 47 65 74 20 6f 70 74 69 6f 6e c,./* Get option
3d70: 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 44 69 67 proc */. Dig
3d80: 65 73 74 57 61 74 63 68 50 72 6f 63 2c 09 09 2f estWatchProc,../
3d90: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6e 6f 74 * Initialize not
3da0: 69 66 69 65 72 20 2a 2f 0a 20 20 20 20 44 69 67 ifier */. Dig
3db0: 65 73 74 47 65 74 48 61 6e 64 6c 65 50 72 6f 63 estGetHandleProc
3dc0: 2c 09 2f 2a 20 47 65 74 20 4f 53 20 68 61 6e 64 ,./* Get OS hand
3dd0: 6c 65 73 20 6f 75 74 20 6f 66 20 63 68 61 6e 6e les out of chann
3de0: 65 6c 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 el */. Digest
3df0: 43 6c 6f 73 65 32 50 72 6f 63 2c 09 09 2f 2a 20 Close2Proc,../*
3e00: 63 6c 6f 73 65 32 70 72 6f 63 20 2a 2f 0a 20 20 close2proc */.
3e10: 20 20 44 69 67 65 73 74 42 6c 6f 63 6b 4d 6f 64 DigestBlockMod
3e20: 65 50 72 6f 63 2c 09 2f 2a 20 53 65 74 20 62 6c eProc,./* Set bl
3e30: 6f 63 6b 69 6e 67 2f 6e 6f 6e 62 6c 6f 63 6b 69 ocking/nonblocki
3e40: 6e 67 20 6d 6f 64 65 2a 2f 0a 20 20 20 20 4e 55 ng mode*/. NU
3e50: 4c 4c 2c 09 09 09 2f 2a 20 46 6c 75 73 68 20 70 LL,.../* Flush p
3e60: 72 6f 63 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 roc */. Diges
3e70: 74 4e 6f 74 69 66 79 50 72 6f 63 2c 09 09 2f 2a tNotifyProc,../*
3e80: 20 48 61 6e 64 6c 69 6e 67 20 6f 66 20 65 76 65 Handling of eve
3e90: 6e 74 73 20 62 75 62 62 6c 69 6e 67 20 75 70 20 nts bubbling up
3ea0: 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f */. NULL,.../
3eb0: 2a 20 57 69 64 65 20 73 65 65 6b 20 70 72 6f 63 * Wide seek proc
3ec0: 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 09 */. NULL,...
3ed0: 2f 2a 20 54 68 72 65 61 64 20 61 63 74 69 6f 6e /* Thread action
3ee0: 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 09 09 09 2f */. NULL.../
3ef0: 2a 20 54 72 75 6e 63 61 74 65 20 2a 2f 0a 7d 3b * Truncate */.};
3f00: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
3f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
3f50: 0a 20 2a 20 44 69 67 65 73 74 43 68 61 6e 6e 65 . * DigestChanne
3f60: 6c 20 2d 2d 0a 20 2a 0a 20 2a 09 43 72 65 61 74 l --. *. *.Creat
3f70: 65 20 61 20 73 74 61 63 6b 65 64 20 63 68 61 6e e a stacked chan
3f80: 6e 65 6c 20 66 6f 72 20 61 20 6d 65 73 73 61 67 nel for a messag
3f90: 65 20 64 69 67 65 73 74 20 74 72 61 6e 73 66 6f e digest transfo
3fa0: 72 6d 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 rmation.. *. * R
3fb0: 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f eturns:. *.TCL_O
3fc0: 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 K or TCL_ERROR.
3fd0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
3fe0: 73 3a 0a 20 2a 09 41 64 64 73 20 74 72 61 6e 73 s:. *.Adds trans
3ff0: 66 6f 72 6d 20 74 6f 20 63 68 61 6e 6e 65 6c 20 form to channel
4000: 61 6e 64 20 73 65 74 73 20 72 65 73 75 6c 74 20 and sets result
4010: 74 6f 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 20 to channel name
4020: 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 or error message
4030: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
4040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
4080: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 44 69 67 /.static int.Dig
4090: 65 73 74 43 68 61 6e 6e 65 6c 28 54 63 6c 5f 49 estChannel(Tcl_I
40a0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 63 nterp *interp, c
40b0: 6f 6e 73 74 20 63 68 61 72 20 2a 63 68 61 6e 6e onst char *chann
40c0: 65 6c 2c 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 el, const EVP_MD
40d0: 20 2a 6d 64 2c 20 69 6e 74 20 66 6f 72 6d 61 74 *md, int format
40e0: 29 20 7b 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 ) {. int mode
40f0: 3b 20 2f 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 69 ; /* OR-ed combi
4100: 6e 61 74 69 6f 6e 20 6f 66 20 54 43 4c 5f 52 45 nation of TCL_RE
4110: 41 44 41 42 4c 45 20 61 6e 64 20 54 43 4c 5f 57 ADABLE and TCL_W
4120: 52 49 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 54 RITABLE */. T
4130: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b cl_Channel chan;
4140: 0a 20 20 20 20 45 56 50 5f 4d 44 5f 43 54 58 20 . EVP_MD_CTX
4150: 2a 63 74 78 3b 0a 20 20 20 20 44 69 67 65 73 74 *ctx;. Digest
4160: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b State *statePtr;
4170: 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 .. /* Validat
4180: 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 69 66 e args */. if
4190: 20 28 63 68 61 6e 6e 65 6c 20 3d 3d 20 28 63 6f (channel == (co
41a0: 6e 73 74 20 63 68 61 72 20 2a 29 20 4e 55 4c 4c nst char *) NULL
41b0: 20 7c 7c 20 6d 64 20 3d 3d 20 28 63 6f 6e 73 74 || md == (const
41c0: 20 45 56 50 5f 4d 44 20 2a 29 20 4e 55 4c 4c 29 EVP_MD *) NULL)
41d0: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
41e0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
41f0: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 chan = Tcl_GetC
4200: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 hannel(interp, c
4210: 68 61 6e 6e 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a hannel, &mode);.
4220: 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 if (chan ==
4230: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 (Tcl_Channel) NU
4240: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 LL) {..return TC
4250: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
4260: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 /* Make sure
4270: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 to operate on t
4280: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e he topmost chann
4290: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d el */. chan =
42a0: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e Tcl_GetTopChann
42b0: 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f el(chan);.. /
42c0: 2a 20 43 72 65 61 74 65 20 69 6e 74 65 72 6e 61 * Create interna
42d0: 6c 20 73 74 6f 72 61 67 65 20 73 74 72 75 63 74 l storage struct
42e0: 75 72 65 73 20 2a 2f 0a 20 20 20 20 63 74 78 20 ures */. ctx
42f0: 3d 20 45 56 50 5f 4d 44 5f 43 54 58 5f 6e 65 77 = EVP_MD_CTX_new
4300: 28 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 ();. statePtr
4310: 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20 = (DigestState
4320: 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 *) ckalloc((unsi
4330: 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 44 69 67 gned) sizeof(Dig
4340: 65 73 74 53 74 61 74 65 29 29 3b 0a 20 20 20 20 estState));.
4350: 69 66 20 28 63 74 78 20 21 3d 20 4e 55 4c 4c 20 if (ctx != NULL
4360: 26 26 20 73 74 61 74 65 50 74 72 20 21 3d 20 4e && statePtr != N
4370: 55 4c 4c 29 20 7b 0a 09 6d 65 6d 73 65 74 28 73 ULL) {..memset(s
4380: 74 61 74 65 50 74 72 2c 20 30 2c 20 73 69 7a 65 tatePtr, 0, size
4390: 6f 66 28 44 69 67 65 73 74 53 74 61 74 65 29 29 of(DigestState))
43a0: 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 73 65 6c ;..statePtr->sel
43b0: 66 09 3d 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 f.= chan;../* Th
43c0: 69 73 20 73 6f 63 6b 65 74 20 63 68 61 6e 6e 65 is socket channe
43d0: 6c 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e l */..statePtr->
43e0: 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d timer = (Tcl_Tim
43f0: 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 09 2f erToken) NULL;./
4400: 2a 20 54 69 6d 65 72 20 74 6f 20 66 6c 75 73 68 * Timer to flush
4410: 20 64 61 74 61 20 2a 2f 0a 09 73 74 61 74 65 50 data */..stateP
4420: 74 72 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 09 09 tr->flags = 0;..
4430: 2f 2a 20 43 68 61 6e 20 63 6f 6e 66 69 67 20 66 /* Chan config f
4440: 6c 61 67 73 20 2a 2f 0a 09 73 74 61 74 65 50 74 lags */..statePt
4450: 72 2d 3e 77 61 74 63 68 4d 61 73 6b 20 3d 20 30 r->watchMask = 0
4460: 3b 09 2f 2a 20 43 75 72 72 65 6e 74 20 57 61 74 ;./* Current Wat
4470: 63 68 50 72 6f 63 20 6d 61 73 6b 20 2a 2f 0a 09 chProc mask */..
4480: 73 74 61 74 65 50 74 72 2d 3e 6d 6f 64 65 09 3d statePtr->mode.=
4490: 20 6d 6f 64 65 3b 09 09 2f 2a 20 43 75 72 72 65 mode;../* Curre
44a0: 6e 74 20 6d 6f 64 65 20 6f 66 20 70 61 72 65 6e nt mode of paren
44b0: 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 09 73 74 t channel */..st
44c0: 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 3d atePtr->format =
44d0: 20 66 6f 72 6d 61 74 3b 09 2f 2a 20 4f 75 74 70 format;./* Outp
44e0: 75 74 20 66 6f 72 6d 61 74 20 2a 2f 0a 09 73 74 ut format */..st
44f0: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 20 3d atePtr->interp =
4500: 20 69 6e 74 65 72 70 3b 09 2f 2a 20 43 75 72 72 interp;./* Curr
4510: 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72 20 ent interpreter
4520: 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 74 */..statePtr->ct
4530: 78 20 3d 20 63 74 78 3b 09 09 2f 2a 20 53 53 4c x = ctx;../* SSL
4540: 20 43 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 20 20 Context */.
4550: 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 41 70 } else {..Tcl_Ap
4560: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
4570: 70 2c 20 22 49 6e 69 74 69 61 6c 69 7a 65 20 64 p, "Initialize d
4580: 69 67 65 73 74 20 65 72 72 6f 72 3a 20 6d 65 6d igest error: mem
4590: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 ory allocation f
45a0: 61 69 6c 75 72 65 22 2c 20 28 63 68 61 72 20 2a ailure", (char *
45b0: 29 20 4e 55 4c 4c 29 3b 0a 09 45 56 50 5f 4d 44 ) NULL);..EVP_MD
45c0: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
45d0: 09 44 69 67 65 73 74 46 72 65 65 28 73 74 61 74 .DigestFree(stat
45e0: 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 ePtr);..return T
45f0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
4600: 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 . /* Initiali
4610: 7a 65 20 64 69 67 65 73 74 20 2a 2f 0a 23 69 66 ze digest */.#if
4620: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
4630: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 _NUMBER < 0x3000
4640: 30 30 30 30 4c 0a 20 20 20 20 69 66 20 28 21 45 0000L. if (!E
4650: 56 50 5f 44 69 67 65 73 74 49 6e 69 74 5f 65 78 VP_DigestInit_ex
4660: 28 63 74 78 2c 20 6d 64 2c 20 4e 55 4c 4c 29 29 (ctx, md, NULL))
4670: 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 20 28 21 .#else. if (!
4680: 45 56 50 5f 44 69 67 65 73 74 49 6e 69 74 5f 65 EVP_DigestInit_e
4690: 78 32 28 63 74 78 2c 20 6d 64 2c 20 4e 55 4c 4c x2(ctx, md, NULL
46a0: 29 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a )).#endif. {.
46b0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
46c0: 74 28 69 6e 74 65 72 70 2c 20 22 49 6e 69 74 69 t(interp, "Initi
46d0: 61 6c 69 7a 65 20 64 69 67 65 73 74 20 65 72 72 alize digest err
46e0: 6f 72 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c or: ", REASON(),
46f0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
4700: 0a 09 45 56 50 5f 4d 44 5f 43 54 58 5f 66 72 65 ..EVP_MD_CTX_fre
4710: 65 28 63 74 78 29 3b 0a 09 44 69 67 65 73 74 46 e(ctx);..DigestF
4720: 72 65 65 28 73 74 61 74 65 50 74 72 29 3b 0a 09 ree(statePtr);..
4730: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
4740: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
4750: 43 6f 6e 66 69 67 75 72 65 20 63 68 61 6e 6e 65 Configure channe
4760: 6c 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 65 74 l */. Tcl_Set
4770: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
4780: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 terp, chan, "-tr
4790: 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e anslation", "bin
47a0: 61 72 79 22 29 3b 0a 20 20 20 20 69 66 20 28 54 ary");. if (T
47b0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 42 75 66 cl_GetChannelBuf
47c0: 66 65 72 53 69 7a 65 28 63 68 61 6e 29 20 3c 20 ferSize(chan) <
47d0: 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45 20 EVP_MAX_MD_SIZE
47e0: 2a 20 32 29 20 7b 0a 09 54 63 6c 5f 53 65 74 43 * 2) {..Tcl_SetC
47f0: 68 61 6e 6e 65 6c 42 75 66 66 65 72 53 69 7a 65 hannelBufferSize
4800: 28 63 68 61 6e 2c 20 45 56 50 5f 4d 41 58 5f 4d (chan, EVP_MAX_M
4810: 44 5f 53 49 5a 45 20 2a 20 32 29 3b 0a 20 20 20 D_SIZE * 2);.
4820: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 74 61 63 6b }.. /* Stack
4830: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 channel */.
4840: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d statePtr->self =
4850: 20 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e 6e 65 Tcl_StackChanne
4860: 6c 28 69 6e 74 65 72 70 2c 20 26 64 69 67 65 73 l(interp, &diges
4870: 74 43 68 61 6e 6e 65 6c 54 79 70 65 2c 20 28 43 tChannelType, (C
4880: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 lientData) state
4890: 50 74 72 2c 20 6d 6f 64 65 2c 20 63 68 61 6e 29 Ptr, mode, chan)
48a0: 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 ;. if (stateP
48b0: 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c tr->self == (Tcl
48c0: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
48d0: 7b 0a 09 45 56 50 5f 4d 44 5f 43 54 58 5f 66 72 {..EVP_MD_CTX_fr
48e0: 65 65 28 63 74 78 29 3b 0a 09 44 69 67 65 73 74 ee(ctx);..Digest
48f0: 46 72 65 65 28 73 74 61 74 65 50 74 72 29 3b 0a Free(statePtr);.
4900: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
4910: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 R;. }.. Tc
4920: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 l_SetResult(inte
4930: 72 70 2c 20 28 63 68 61 72 20 2a 29 20 54 63 6c rp, (char *) Tcl
4940: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
4950: 63 68 61 6e 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 chan), TCL_VOLAT
4960: 49 4c 45 29 3b 0a 20 20 20 20 72 65 74 75 72 6e ILE);. return
4970: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 TCL_OK;.}../*.
4980: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
4990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
49a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
49b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
49c0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e -------. *. * Un
49d0: 73 74 61 63 6b 20 43 68 61 6e 6e 65 6c 20 2d 2d stack Channel --
49e0: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 . *. *.This proc
49f0: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 edure is invoked
4a00: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 to process the
4a10: 22 75 6e 73 74 61 63 6b 22 20 54 43 4c 20 63 6f "unstack" TCL co
4a20: 6d 6d 61 6e 64 2e 0a 20 2a 09 53 65 65 20 74 68 mmand.. *.See th
4a30: 65 20 75 73 65 72 20 64 6f 63 75 6d 65 6e 74 61 e user documenta
4a40: 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c 73 tion for details
4a50: 20 6f 6e 20 77 68 61 74 20 69 74 20 64 6f 65 73 on what it does
4a60: 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a .. *. * Returns:
4a70: 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 . *.TCL_OK or TC
4a80: 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 L_ERROR. *. * Si
4a90: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 52 de effects:. *.R
4aa0: 65 6d 6f 76 65 73 20 74 72 61 6e 73 66 6f 72 6d emoves transform
4ab0: 20 66 72 6f 6d 20 63 68 61 6e 6e 65 6c 20 6f 72 from channel or
4ac0: 20 73 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20 sets result to
4ad0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 error message..
4ae0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
4af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 2f 0a 73 ----------. */.s
4b30: 74 61 74 69 63 20 69 6e 74 0a 55 6e 73 74 61 63 tatic int.Unstac
4b40: 6b 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 kObjCmd(ClientDa
4b50: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
4b60: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
4b70: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
4b80: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
4b90: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 []) {. Tcl_Ch
4ba0: 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 annel chan;.
4bb0: 69 6e 74 20 6d 6f 64 65 3b 20 2f 2a 20 4f 52 2d int mode; /* OR-
4bc0: 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f ed combination o
4bd0: 66 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 61 f TCL_READABLE a
4be0: 6e 64 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 20 nd TCL_WRITABLE
4bf0: 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a */.. if (obj
4c00: 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 c != 2) {..Tcl_W
4c10: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
4c20: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 rp, 1, objv, "ch
4c30: 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e annel");..return
4c40: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
4c50: 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 68 }.. /* Get ch
4c60: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 annel */. cha
4c70: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e n = Tcl_GetChann
4c80: 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 el(interp, Tcl_G
4c90: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
4ca0: 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 objv[1], NULL),
4cb0: 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 28 &mode);. if (
4cc0: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 chan == (Tcl_Cha
4cd0: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 nnel) NULL) {..r
4ce0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
4cf0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d . }.. /* M
4d00: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 ake sure to oper
4d10: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f ate on the topmo
4d20: 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 st channel */.
4d30: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
4d40: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 TopChannel(chan)
4d50: 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 ;.. /* Check
4d60: 69 66 20 64 69 67 65 73 74 20 63 68 61 6e 6e 65 if digest channe
4d70: 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c l */. if (Tcl
4d80: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 _GetChannelType(
4d90: 63 68 61 6e 29 20 21 3d 20 26 64 69 67 65 73 74 chan) != &digest
4da0: 43 68 61 6e 6e 65 6c 54 79 70 65 29 20 7b 0a 09 ChannelType) {..
4db0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
4dc0: 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 (interp, "bad ch
4dd0: 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 annel \"", Tcl_G
4de0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 etChannelName(ch
4df0: 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e an),.. "\": n
4e00: 6f 74 20 61 20 64 69 67 65 73 74 20 63 68 61 6e ot a digest chan
4e10: 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 nel", NULL);..Tc
4e20: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 l_SetErrorCode(i
4e30: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 55 nterp, "TLS", "U
4e40: 4e 53 54 41 43 4b 22 2c 20 22 43 48 41 4e 4e 45 NSTACK", "CHANNE
4e50: 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 L", "INVALID", (
4e60: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
4e70: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
4e80: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
4e90: 50 6f 70 20 74 72 61 6e 73 66 6f 72 6d 20 66 72 Pop transform fr
4ea0: 6f 6d 20 63 68 61 6e 6e 65 6c 2c 20 6c 65 61 76 om channel, leav
4eb0: 65 73 20 65 72 72 6f 72 20 69 6e 66 6f 20 69 6e es error info in
4ec0: 20 69 6e 74 65 72 70 20 72 65 73 75 6c 74 20 2a interp result *
4ed0: 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 55 6e /. if (Tcl_Un
4ee0: 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 stackChannel(int
4ef0: 65 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54 43 erp, chan) == TC
4f00: 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 72 65 74 75 L_ERROR) {..retu
4f10: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
4f20: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 }. return T
4f30: 43 4c 5f 4f 4b 3b 0a 20 20 20 20 09 63 6c 69 65 CL_OK;. .clie
4f40: 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 ntData = clientD
4f50: 61 74 61 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a ata;.}../*******
4f60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
4f70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
4f80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
4f90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f ************/../
4fa0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
4fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4fe0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 -------. *. * Di
4ff0: 67 65 73 74 48 61 73 68 46 75 6e 63 74 69 6f 6e gestHashFunction
5000: 20 2d 2d 0a 20 2a 0a 20 2a 09 20 43 61 6c 63 75 --. *. *. Calcu
5010: 6c 61 74 65 20 6d 65 73 73 61 67 65 20 64 69 67 late message dig
5020: 65 73 74 20 75 73 69 6e 67 20 68 61 73 68 20 66 est using hash f
5030: 75 6e 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 unction.. *. * R
5040: 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f eturns:. *.TCL_O
5050: 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 K or TCL_ERROR.
5060: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
5070: 73 3a 0a 20 2a 09 53 65 74 73 20 72 65 73 75 6c s:. *.Sets resul
5080: 74 20 74 6f 20 6d 65 73 73 61 67 65 20 64 69 67 t to message dig
5090: 65 73 74 20 6f 72 20 65 72 72 6f 72 20 6d 65 73 est or error mes
50a0: 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d sage. *. *------
50b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
50c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
50d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
50e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
50f0: 2f 0a 69 6e 74 0a 44 69 67 65 73 74 48 61 73 68 /.int.DigestHash
5100: 46 75 6e 63 74 69 6f 6e 28 54 63 6c 5f 49 6e 74 Function(Tcl_Int
5110: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
5120: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
5130: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 2c 0a 09 63 const objv[],..c
5140: 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 2c onst EVP_MD *md,
5150: 20 69 6e 74 20 66 6f 72 6d 61 74 2c 20 54 63 6c int format, Tcl
5160: 5f 4f 62 6a 20 2a 6b 65 79 4f 62 6a 29 20 7b 0a _Obj *keyObj) {.
5170: 20 20 20 20 63 68 61 72 20 2a 64 61 74 61 3b 0a char *data;.
5180: 20 20 20 20 69 6e 74 20 6c 65 6e 2c 20 72 65 73 int len, res
5190: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 ;. unsigned i
51a0: 6e 74 20 6d 64 5f 6c 65 6e 3b 0a 20 20 20 20 75 nt md_len;. u
51b0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d 64 5f nsigned char md_
51c0: 62 75 66 5b 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 buf[EVP_MAX_MD_S
51d0: 49 5a 45 5d 3b 0a 0a 20 20 20 20 69 66 20 28 6f IZE];.. if (o
51e0: 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c bjc != 2) {..Tcl
51f0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
5200: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
5210: 64 61 74 61 22 29 3b 0a 09 72 65 74 75 72 6e 20 data");..return
5220: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
5230: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 64 61 74 .. /* Get dat
5240: 61 20 2a 2f 0a 20 20 20 20 64 61 74 61 20 3d 20 a */. data =
5250: 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 Tcl_GetByteArray
5260: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c FromObj(objv[1],
5270: 20 26 6c 65 6e 29 3b 0a 20 20 20 20 69 66 20 28 &len);. if (
5280: 64 61 74 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 data == NULL ||
5290: 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 54 63 6c len == 0) {..Tcl
52a0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 _SetResult(inter
52b0: 70 2c 20 22 4e 6f 20 64 61 74 61 22 2c 20 4e 55 p, "No data", NU
52c0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c LL);..return TCL
52d0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
52e0: 20 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 /* Calculate
52f0: 64 69 67 65 73 74 20 62 61 73 65 64 20 6f 6e 20 digest based on
5300: 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f hash function */
5310: 0a 20 20 20 20 69 66 20 28 6b 65 79 4f 62 6a 20 . if (keyObj
5320: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 20 == NULL) {..res
5330: 3d 20 45 56 50 5f 44 69 67 65 73 74 28 64 61 74 = EVP_Digest(dat
5340: 61 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 2c a, (size_t) len,
5350: 20 6d 64 5f 62 75 66 2c 20 26 6d 64 5f 6c 65 6e md_buf, &md_len
5360: 2c 20 6d 64 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 , md, NULL);.
5370: 20 7d 20 65 6c 73 65 20 7b 0a 09 75 6e 73 69 67 } else {..unsig
5380: 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 2c 20 2a ned char *key, *
5390: 68 6d 61 63 3b 0a 09 69 6e 74 20 6b 65 79 5f 6c hmac;..int key_l
53a0: 65 6e 3b 0a 0a 09 6b 65 79 20 3d 20 54 63 6c 5f en;...key = Tcl_
53b0: 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d GetByteArrayFrom
53c0: 4f 62 6a 28 6b 65 79 4f 62 6a 2c 20 26 6b 65 79 Obj(keyObj, &key
53d0: 5f 6c 65 6e 29 3b 0a 09 68 6d 61 63 20 3d 20 48 _len);..hmac = H
53e0: 4d 41 43 28 6d 64 2c 20 28 63 6f 6e 73 74 20 76 MAC(md, (const v
53f0: 6f 69 64 20 2a 29 20 6b 65 79 2c 20 6b 65 79 5f oid *) key, key_
5400: 6c 65 6e 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 len, (const unsi
5410: 67 6e 65 64 20 63 68 61 72 20 2a 29 20 64 61 74 gned char *) dat
5420: 61 2c 0a 09 20 20 20 20 28 73 69 7a 65 5f 74 29 a,.. (size_t)
5430: 20 6c 65 6e 2c 20 6d 64 5f 62 75 66 2c 20 26 6d len, md_buf, &m
5440: 64 5f 6c 65 6e 29 3b 0a 09 72 65 73 20 3d 20 28 d_len);..res = (
5450: 68 6d 61 63 20 21 3d 20 4e 55 4c 4c 29 3b 0a 20 hmac != NULL);.
5460: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 75 74 }.. /* Out
5470: 70 75 74 20 64 69 67 65 73 74 20 74 6f 20 72 65 put digest to re
5480: 73 75 6c 74 20 70 65 72 20 66 6f 72 6d 61 74 20 sult per format
5490: 28 62 69 6e 20 6f 72 20 68 65 78 29 20 2a 2f 0a (bin or hex) */.
54a0: 20 20 20 20 69 66 20 28 72 65 73 29 20 7b 0a 09 if (res) {..
54b0: 69 66 20 28 66 6f 72 6d 61 74 20 3d 3d 20 42 49 if (format == BI
54c0: 4e 5f 46 4f 52 4d 41 54 29 20 7b 0a 09 20 20 20 N_FORMAT) {..
54d0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c Tcl_SetObjResul
54e0: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 t(interp, Tcl_Ne
54f0: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 6d 64 wByteArrayObj(md
5500: 5f 62 75 66 2c 20 6d 64 5f 6c 65 6e 29 29 3b 0a _buf, md_len));.
5510: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 ..} else {..
5520: 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f Tcl_Obj *resultO
5530: 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 bj = Tcl_NewObj(
5540: 29 3b 0a 09 20 20 20 20 75 6e 73 69 67 6e 65 64 );.. unsigned
5550: 20 63 68 61 72 20 2a 70 74 72 20 3d 20 54 63 6c char *ptr = Tcl
5560: 5f 53 65 74 42 79 74 65 41 72 72 61 79 4c 65 6e _SetByteArrayLen
5570: 67 74 68 28 72 65 73 75 6c 74 4f 62 6a 2c 20 6d gth(resultObj, m
5580: 64 5f 6c 65 6e 2a 32 29 3b 0a 0a 09 20 20 20 20 d_len*2);...
5590: 66 6f 72 20 28 75 6e 73 69 67 6e 65 64 20 69 6e for (unsigned in
55a0: 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 6d 64 5f t i = 0; i < md_
55b0: 6c 65 6e 3b 20 69 2b 2b 29 20 7b 0a 09 09 2a 70 len; i++) {...*p
55c0: 74 72 2b 2b 20 3d 20 68 65 78 5b 28 6d 64 5f 62 tr++ = hex[(md_b
55d0: 75 66 5b 69 5d 20 3e 3e 20 34 29 20 26 20 30 78 uf[i] >> 4) & 0x
55e0: 30 46 5d 3b 0a 09 09 2a 70 74 72 2b 2b 20 3d 20 0F];...*ptr++ =
55f0: 68 65 78 5b 6d 64 5f 62 75 66 5b 69 5d 20 26 20 hex[md_buf[i] &
5600: 30 78 30 46 5d 3b 0a 09 20 20 20 20 7d 0a 09 54 0x0F];.. }..T
5610: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
5620: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
5630: 6a 29 3b 0a 09 7d 0a 0a 20 20 20 20 7d 20 65 6c j);..}.. } el
5640: 73 65 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 se {..Tcl_Append
5650: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
5660: 48 61 73 68 20 63 61 6c 63 75 6c 61 74 69 6f 6e Hash calculation
5670: 20 65 72 72 6f 72 3a 22 2c 20 52 45 41 53 4f 4e error:", REASON
5680: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (), (char *) NUL
5690: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f L);..return TCL_
56a0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
56b0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
56c0: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d }../*. *--------
56d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
56e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
56f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
5710: 2a 20 44 69 67 65 73 74 4f 62 6a 43 6d 64 20 2d * DigestObjCmd -
5720: 2d 0a 20 2a 0a 20 2a 09 52 65 74 75 72 6e 20 6d -. *. *.Return m
5730: 65 73 73 61 67 65 20 64 69 67 65 73 74 20 75 73 essage digest us
5740: 69 6e 67 20 75 73 65 72 20 73 70 65 63 69 66 69 ing user specifi
5750: 65 64 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e ed hash function
5760: 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a .. *. * Returns:
5770: 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 . *.TCL_OK or TC
5780: 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 L_ERROR. *. * Si
5790: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 de effects:. *.S
57a0: 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20 6d 65 ets result to me
57b0: 73 73 61 67 65 20 64 69 67 65 73 74 20 6f 72 20 ssage digest or
57c0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a error message. *
57d0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
57e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
57f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5810: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
5820: 63 20 69 6e 74 0a 44 69 67 65 73 74 4f 62 6a 43 c int.DigestObjC
5830: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c md(ClientData cl
5840: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e ientData, Tcl_In
5850: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e terp *interp, in
5860: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 t objc, Tcl_Obj
5870: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b *const objv[]) {
5880: 0a 20 20 20 20 69 6e 74 20 69 64 78 2c 20 6c 65 . int idx, le
5890: 6e 2c 20 66 6f 72 6d 61 74 20 3d 20 48 45 58 5f n, format = HEX_
58a0: 46 4f 52 4d 41 54 2c 20 6b 65 79 5f 6c 65 6e 20 FORMAT, key_len
58b0: 3d 20 30 2c 20 64 61 74 61 5f 6c 65 6e 20 3d 20 = 0, data_len =
58c0: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 0;. const cha
58d0: 72 20 2a 64 69 67 65 73 74 6e 61 6d 65 2c 20 2a r *digestname, *
58e0: 63 68 61 6e 6e 65 6c 20 3d 20 4e 55 4c 4c 3b 0a channel = NULL;.
58f0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 64 61 74 Tcl_Obj *dat
5900: 61 4f 62 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 66 69 aObj = NULL, *fi
5910: 6c 65 4f 62 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 6b leObj = NULL, *k
5920: 65 79 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 eyObj = NULL;.
5930: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 unsigned char
5940: 2a 6b 65 79 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 *key = NULL;.
5950: 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d const EVP_MD *m
5960: 64 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 d;.. Tcl_Rese
5970: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b tResult(interp);
5980: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c .. if (objc <
5990: 20 33 20 7c 7c 20 6f 62 6a 63 20 3e 20 37 29 20 3 || objc > 7)
59a0: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 {..Tcl_WrongNumA
59b0: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f rgs(interp, 1, o
59c0: 62 6a 76 2c 20 22 74 79 70 65 20 3f 2d 62 69 6e bjv, "type ?-bin
59d0: 7c 2d 68 65 78 3f 20 3f 2d 6b 65 79 20 68 6d 61 |-hex? ?-key hma
59e0: 63 5f 6b 65 79 3f 20 5b 2d 63 68 61 6e 6e 65 6c c_key? [-channel
59f0: 20 63 68 61 6e 20 7c 20 2d 66 69 6c 65 20 66 69 chan | -file fi
5a00: 6c 65 6e 61 6d 65 20 7c 20 3f 2d 64 61 74 61 3f lename | ?-data?
5a10: 20 64 61 74 61 5d 22 29 3b 0a 09 72 65 74 75 72 data]");..retur
5a20: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
5a30: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 64 }.. /* Get d
5a40: 69 67 65 73 74 20 2a 2f 0a 20 20 20 20 64 69 67 igest */. dig
5a50: 65 73 74 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 estname = Tcl_Ge
5a60: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f tStringFromObj(o
5a70: 62 6a 76 5b 31 5d 2c 20 26 6c 65 6e 29 3b 0a 20 bjv[1], &len);.
5a80: 20 20 20 69 66 20 28 64 69 67 65 73 74 6e 61 6d if (digestnam
5a90: 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 28 6d 64 e == NULL || (md
5aa0: 20 3d 20 45 56 50 5f 67 65 74 5f 64 69 67 65 73 = EVP_get_diges
5ab0: 74 62 79 6e 61 6d 65 28 64 69 67 65 73 74 6e 61 tbyname(digestna
5ac0: 6d 65 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a me)) == NULL) {.
5ad0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
5ae0: 74 28 69 6e 74 65 72 70 2c 20 22 49 6e 76 61 6c t(interp, "Inval
5af0: 69 64 20 64 69 67 65 73 74 20 74 79 70 65 20 5c id digest type \
5b00: 22 22 2c 20 64 69 67 65 73 74 6e 61 6d 65 2c 20 "", digestname,
5b10: 22 5c 22 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 "\"", NULL);..re
5b20: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
5b30: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 70 }.. /* Op
5b40: 74 69 6d 61 6c 20 63 61 73 65 20 66 6f 72 20 62 timal case for b
5b50: 6c 6f 62 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 lob of data */.
5b60: 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 33 if (objc == 3
5b70: 29 20 7b 0a 09 72 65 74 75 72 6e 20 44 69 67 65 ) {..return Dige
5b80: 73 74 48 61 73 68 46 75 6e 63 74 69 6f 6e 28 69 stHashFunction(i
5b90: 6e 74 65 72 70 2c 20 2d 2d 6f 62 6a 63 2c 20 2b nterp, --objc, +
5ba0: 2b 6f 62 6a 76 2c 20 6d 64 2c 20 66 6f 72 6d 61 +objv, md, forma
5bb0: 74 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a t, NULL);. }.
5bc0: 0a 20 20 20 20 2f 2a 20 47 65 74 20 6f 70 74 69 . /* Get opti
5bd0: 6f 6e 73 20 2a 2f 0a 20 20 20 20 66 6f 72 20 28 ons */. for (
5be0: 69 64 78 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f idx = 2; idx < o
5bf0: 62 6a 63 2d 31 3b 20 69 64 78 2b 2b 29 20 7b 0a bjc-1; idx++) {.
5c00: 09 63 68 61 72 20 2a 6f 70 74 20 3d 20 54 63 6c .char *opt = Tcl
5c10: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
5c20: 6a 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 4e 55 4c j(objv[idx], NUL
5c30: 4c 29 3b 0a 0a 09 69 66 20 28 6f 70 74 5b 30 5d L);...if (opt[0]
5c40: 20 21 3d 20 27 2d 27 29 0a 09 20 20 20 20 62 72 != '-').. br
5c50: 65 61 6b 3b 0a 0a 09 4f 50 54 46 4c 41 47 28 22 eak;...OPTFLAG("
5c60: 2d 62 69 6e 22 2c 20 66 6f 72 6d 61 74 2c 20 42 -bin", format, B
5c70: 49 4e 5f 46 4f 52 4d 41 54 29 3b 0a 09 4f 50 54 IN_FORMAT);..OPT
5c80: 46 4c 41 47 28 22 2d 62 69 6e 61 72 79 22 2c 20 FLAG("-binary",
5c90: 66 6f 72 6d 61 74 2c 20 42 49 4e 5f 46 4f 52 4d format, BIN_FORM
5ca0: 41 54 29 3b 0a 09 4f 50 54 46 4c 41 47 28 22 2d AT);..OPTFLAG("-
5cb0: 68 65 78 22 2c 20 66 6f 72 6d 61 74 2c 20 48 45 hex", format, HE
5cc0: 58 5f 46 4f 52 4d 41 54 29 3b 0a 09 4f 50 54 46 X_FORMAT);..OPTF
5cd0: 4c 41 47 28 22 2d 68 65 78 61 64 65 63 69 6d 61 LAG("-hexadecima
5ce0: 6c 22 2c 20 66 6f 72 6d 61 74 2c 20 48 45 58 5f l", format, HEX_
5cf0: 46 4f 52 4d 41 54 29 3b 0a 09 4f 50 54 4f 42 4a FORMAT);..OPTOBJ
5d00: 28 22 2d 64 61 74 61 22 2c 20 64 61 74 61 4f 62 ("-data", dataOb
5d10: 6a 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 68 j);..OPTSTR("-ch
5d20: 61 6e 22 2c 20 63 68 61 6e 6e 65 6c 29 3b 0a 09 an", channel);..
5d30: 4f 50 54 53 54 52 28 22 2d 63 68 61 6e 6e 65 6c OPTSTR("-channel
5d40: 22 2c 20 63 68 61 6e 6e 65 6c 29 3b 0a 09 4f 50 ", channel);..OP
5d50: 54 4f 42 4a 28 22 2d 66 69 6c 65 22 2c 20 66 69 TOBJ("-file", fi
5d60: 6c 65 4f 62 6a 29 3b 0a 09 4f 50 54 4f 42 4a 28 leObj);..OPTOBJ(
5d70: 22 2d 66 69 6c 65 6e 61 6d 65 22 2c 20 66 69 6c "-filename", fil
5d80: 65 4f 62 6a 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 eObj);..OPTOBJ("
5d90: 2d 6b 65 79 22 2c 20 6b 65 79 4f 62 6a 29 3b 0a -key", keyObj);.
5da0: 0a 09 4f 50 54 42 41 44 28 22 6f 70 74 69 6f 6e ..OPTBAD("option
5db0: 22 2c 20 22 2d 62 69 6e 2c 20 2d 64 61 74 61 2c ", "-bin, -data,
5dc0: 20 2d 66 69 6c 65 2c 20 2d 66 69 6c 65 6e 61 6d -file, -filenam
5dd0: 65 2c 20 2d 68 65 78 2c 20 6f 72 20 2d 6b 65 79 e, -hex, or -key
5de0: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ");..return TCL_
5df0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
5e00: 20 20 2f 2a 20 49 66 20 6e 6f 20 6f 70 74 69 6f /* If no optio
5e10: 6e 20 66 6f 72 20 6c 61 73 74 20 61 72 67 2c 20 n for last arg,
5e20: 74 68 65 6e 20 69 74 73 20 74 68 65 20 64 61 74 then its the dat
5e30: 61 20 2a 2f 0a 20 20 20 20 69 66 20 28 69 64 78 a */. if (idx
5e40: 20 3c 20 6f 62 6a 63 29 20 7b 0a 09 64 61 74 61 < objc) {..data
5e50: 4f 62 6a 20 3d 20 6f 62 6a 76 5b 69 64 78 5d 3b Obj = objv[idx];
5e60: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 . }.. /* C
5e70: 61 6c 63 20 64 69 67 65 73 74 20 6f 6e 20 66 69 alc digest on fi
5e80: 6c 65 2c 20 73 74 61 63 6b 65 64 20 63 68 61 6e le, stacked chan
5e90: 6e 65 6c 2c 20 6f 72 20 64 61 74 61 20 62 6c 6f nel, or data blo
5ea0: 62 20 2a 2f 0a 20 20 20 20 69 66 20 28 66 69 6c b */. if (fil
5eb0: 65 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a eObj != NULL) {.
5ec0: 09 72 65 74 75 72 6e 20 44 69 67 65 73 74 46 69 .return DigestFi
5ed0: 6c 65 28 69 6e 74 65 72 70 2c 20 66 69 6c 65 4f le(interp, fileO
5ee0: 62 6a 2c 20 6d 64 2c 20 66 6f 72 6d 61 74 2c 20 bj, md, format,
5ef0: 6b 65 79 4f 62 6a 29 3b 0a 20 20 20 20 7d 20 65 keyObj);. } e
5f00: 6c 73 65 20 69 66 20 28 63 68 61 6e 6e 65 6c 20 lse if (channel
5f10: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 != NULL) {..retu
5f20: 72 6e 20 44 69 67 65 73 74 43 68 61 6e 6e 65 6c rn DigestChannel
5f30: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c (interp, channel
5f40: 2c 20 6d 64 2c 20 66 6f 72 6d 61 74 29 3b 0a 20 , md, format);.
5f50: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 64 61 } else if (da
5f60: 74 61 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b taObj != NULL) {
5f70: 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 73 5b ..Tcl_Obj *objs[
5f80: 32 5d 3b 0a 09 6f 62 6a 73 5b 30 5d 20 3d 20 4e 2];..objs[0] = N
5f90: 55 4c 4c 3b 0a 09 6f 62 6a 73 5b 31 5d 20 3d 20 ULL;..objs[1] =
5fa0: 64 61 74 61 4f 62 6a 3b 0a 09 72 65 74 75 72 6e dataObj;..return
5fb0: 20 44 69 67 65 73 74 48 61 73 68 46 75 6e 63 74 DigestHashFunct
5fc0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f ion(interp, 2, o
5fd0: 62 6a 73 2c 20 6d 64 2c 20 66 6f 72 6d 61 74 2c bjs, md, format,
5fe0: 20 6b 65 79 4f 62 6a 29 3b 0a 20 20 20 20 7d 0a keyObj);. }.
5ff0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
6000: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e esult(interp, "N
6010: 6f 20 64 61 74 61 20 73 70 65 63 69 66 69 65 64 o data specified
6020: 2e 22 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 72 .", NULL);. r
6030: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
6040: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d .}../*. *-------
6050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
6090: 20 2a 20 4d 65 73 73 61 67 65 20 44 69 67 65 73 * Message Diges
60a0: 74 20 43 6f 6e 76 65 6e 69 65 6e 63 65 20 43 6f t Convenience Co
60b0: 6d 6d 61 6e 64 73 20 2d 2d 0a 20 2a 0a 20 2a 09 mmands --. *. *.
60c0: 43 6f 6e 76 65 6e 69 65 6e 63 65 20 63 6f 6d 6d Convenience comm
60d0: 61 6e 64 73 20 66 6f 72 20 6d 65 73 73 61 67 65 ands for message
60e0: 20 64 69 67 65 73 74 73 2e 0a 20 2a 0a 20 2a 20 digests.. *. *
60f0: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f Returns:. *.TCL_
6100: 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a OK or TCL_ERROR.
6110: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
6120: 74 73 3a 0a 20 2a 09 53 65 74 73 20 72 65 73 75 ts:. *.Sets resu
6130: 6c 74 20 74 6f 20 6d 65 73 73 61 67 65 20 64 69 lt to message di
6140: 67 65 73 74 20 6f 72 20 65 72 72 6f 72 20 6d 65 gest or error me
6150: 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d ssage. *. *-----
6160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
61a0: 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 4d 44 34 */.int DigestMD4
61b0: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 Cmd(ClientData c
61c0: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 lientData, Tcl_I
61d0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
61e0: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a nt objc, Tcl_Obj
61f0: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 *const objv[])
6200: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 44 69 67 {. return Dig
6210: 65 73 74 48 61 73 68 46 75 6e 63 74 69 6f 6e 28 estHashFunction(
6220: 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 interp, objc, ob
6230: 6a 76 2c 20 45 56 50 5f 6d 64 34 28 29 2c 20 48 jv, EVP_md4(), H
6240: 45 58 5f 46 4f 52 4d 41 54 2c 20 4e 55 4c 4c 29 EX_FORMAT, NULL)
6250: 3b 0a 7d 0a 0a 69 6e 74 20 44 69 67 65 73 74 4d ;.}..int DigestM
6260: 44 35 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 D5Cmd(ClientData
6270: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
6280: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
6290: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
62a0: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
62b0: 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 44 ) {. return D
62c0: 69 67 65 73 74 48 61 73 68 46 75 6e 63 74 69 6f igestHashFunctio
62d0: 6e 28 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 n(interp, objc,
62e0: 6f 62 6a 76 2c 20 45 56 50 5f 6d 64 35 28 29 2c objv, EVP_md5(),
62f0: 20 48 45 58 5f 46 4f 52 4d 41 54 2c 20 4e 55 4c HEX_FORMAT, NUL
6300: 4c 29 3b 0a 7d 0a 0a 69 6e 74 20 44 69 67 65 73 L);.}..int Diges
6310: 74 53 48 41 31 43 6d 64 28 43 6c 69 65 6e 74 44 tSHA1Cmd(ClientD
6320: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
6330: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
6340: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 rp, int objc, Tc
6350: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
6360: 76 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 72 v[]) {. retur
6370: 6e 20 44 69 67 65 73 74 48 61 73 68 46 75 6e 63 n DigestHashFunc
6380: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f 62 6a tion(interp, obj
6390: 63 2c 20 6f 62 6a 76 2c 20 45 56 50 5f 73 68 61 c, objv, EVP_sha
63a0: 31 28 29 2c 20 48 45 58 5f 46 4f 52 4d 41 54 2c 1(), HEX_FORMAT,
63b0: 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 69 6e 74 20 44 NULL);.}..int D
63c0: 69 67 65 73 74 53 48 41 32 35 36 43 6d 64 28 43 igestSHA256Cmd(C
63d0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
63e0: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
63f0: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
6400: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
6410: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
6420: 20 72 65 74 75 72 6e 20 44 69 67 65 73 74 48 61 return DigestHa
6430: 73 68 46 75 6e 63 74 69 6f 6e 28 69 6e 74 65 72 shFunction(inter
6440: 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 45 p, objc, objv, E
6450: 56 50 5f 73 68 61 32 35 36 28 29 2c 20 48 45 58 VP_sha256(), HEX
6460: 5f 46 4f 52 4d 41 54 2c 20 4e 55 4c 4c 29 3b 0a _FORMAT, NULL);.
6470: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d }../*. *--------
6480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
64a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
64b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
64c0: 2a 20 54 6c 73 5f 44 69 67 65 73 74 43 6f 6d 6d * Tls_DigestComm
64d0: 61 6e 64 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43 72 ands --. *. *.Cr
64e0: 65 61 74 65 20 64 69 67 65 73 74 20 63 6f 6d 6d eate digest comm
64f0: 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 74 75 72 ands. *. * Retur
6500: 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 ns:. *.TCL_OK or
6510: 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a TCL_ERROR. *. *
6520: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
6530: 2a 09 43 72 65 61 74 65 73 20 63 6f 6d 6d 61 6e *.Creates comman
6540: 64 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d ds. *. *--------
6550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
6590: 69 6e 74 20 54 6c 73 5f 44 69 67 65 73 74 43 6f int Tls_DigestCo
65a0: 6d 6d 61 6e 64 73 28 54 63 6c 5f 49 6e 74 65 72 mmands(Tcl_Inter
65b0: 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 p *interp) {.
65c0: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
65d0: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 mmand(interp, "t
65e0: 6c 73 3a 3a 64 69 67 65 73 74 22 2c 20 44 69 67 ls::digest", Dig
65f0: 65 73 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 estObjCmd, (Clie
6600: 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f ntData) 0, (Tcl_
6610: 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 CmdDeleteProc *)
6620: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f NULL);. Tcl_
6630: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 CreateObjCommand
6640: 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d (interp, "tls::m
6650: 64 34 22 2c 20 44 69 67 65 73 74 4d 44 34 43 6d d4", DigestMD4Cm
6660: 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
6670: 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 0, (Tcl_CmdDelet
6680: 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
6690: 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
66a0: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
66b0: 20 22 74 6c 73 3a 3a 6d 64 35 22 2c 20 44 69 67 "tls::md5", Dig
66c0: 65 73 74 4d 44 35 43 6d 64 2c 20 28 43 6c 69 65 estMD5Cmd, (Clie
66d0: 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f ntData) 0, (Tcl_
66e0: 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 CmdDeleteProc *)
66f0: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f NULL);. Tcl_
6700: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 CreateObjCommand
6710: 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 (interp, "tls::s
6720: 68 61 31 22 2c 20 44 69 67 65 73 74 53 48 41 31 ha1", DigestSHA1
6730: 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 Cmd, (ClientData
6740: 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c ) 0, (Tcl_CmdDel
6750: 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 eteProc *) NULL)
6760: 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 ;. Tcl_Create
6770: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
6780: 70 2c 20 22 74 6c 73 3a 3a 73 68 61 32 35 36 22 p, "tls::sha256"
6790: 2c 20 44 69 67 65 73 74 53 48 41 32 35 36 43 6d , DigestSHA256Cm
67a0: 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
67b0: 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 0, (Tcl_CmdDelet
67c0: 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
67d0: 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
67e0: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
67f0: 20 22 74 6c 73 3a 3a 75 6e 73 74 61 63 6b 22 2c "tls::unstack",
6800: 20 55 6e 73 74 61 63 6b 4f 62 6a 43 6d 64 2c 20 UnstackObjCmd,
6810: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 (ClientData) 0,
6820: 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
6830: 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 oc *) NULL);.
6840: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
6850: 7d 0a 0a }..