0000: 0a 2f 2a 0a 20 2a 20 44 69 67 65 73 74 20 43 6f ./*. * Digest Co
0010: 6d 6d 61 6e 64 20 61 6e 64 20 53 74 61 63 6b 65 mmand and Stacke
0020: 64 20 54 72 61 6e 73 66 6f 72 6d 20 43 68 61 6e d Transform Chan
0030: 6e 65 6c 0a 20 2a 0a 20 2a 20 43 6f 70 79 72 69 nel. *. * Copyri
0040: 67 68 74 20 28 43 29 20 32 30 32 33 20 42 72 69 ght (C) 2023 Bri
0050: 61 6e 20 4f 27 48 61 67 61 6e 0a 20 2a 0a 20 2a an O'Hagan. *. *
0060: 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 /..#include "tls
0070: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 Int.h".#include
0080: 22 74 63 6c 4f 70 74 73 2e 68 22 0a 23 69 6e 63 "tclOpts.h".#inc
0090: 6c 75 64 65 20 3c 74 63 6c 2e 68 3e 0a 23 69 6e lude <tcl.h>.#in
00a0: 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a clude <stdio.h>.
00b0: 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 #include <string
00c0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 .h>.#include <op
00d0: 65 6e 73 73 6c 2f 65 76 70 2e 68 3e 0a 0a 2f 2a enssl/evp.h>../*
00e0: 20 43 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 63 6f Constants */.co
00f0: 6e 73 74 20 63 68 61 72 20 2a 68 65 78 20 3d 20 nst char *hex =
0100: 22 30 31 32 33 34 35 36 37 38 39 41 42 43 44 45 "0123456789ABCDE
0110: 46 22 3b 0a 23 64 65 66 69 6e 65 20 52 45 41 53 F";.#define REAS
0120: 4f 4e 28 29 09 45 52 52 5f 72 65 61 73 6f 6e 5f ON().ERR_reason_
0130: 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 45 52 52 error_string(ERR
0140: 5f 67 65 74 5f 65 72 72 6f 72 28 29 29 0a 23 64 _get_error()).#d
0150: 65 66 69 6e 65 20 42 55 46 46 45 52 5f 53 49 5a efine BUFFER_SIZ
0160: 45 20 36 35 35 33 36 0a 23 64 65 66 69 6e 65 20 E 65536.#define
0170: 42 49 4e 5f 46 4f 52 4d 41 54 20 30 0a 23 64 65 BIN_FORMAT 0.#de
0180: 66 69 6e 65 20 48 45 58 5f 46 4f 52 4d 41 54 20 fine HEX_FORMAT
0190: 31 0a 0a 2f 2a 0a 20 2a 20 54 68 69 73 20 73 74 1../*. * This st
01a0: 72 75 63 74 75 72 65 20 64 65 73 63 72 69 62 65 ructure describe
01b0: 73 20 74 68 65 20 70 65 72 2d 69 6e 73 74 61 6e s the per-instan
01c0: 63 65 20 73 74 61 74 65 20 6f 66 20 61 6e 20 53 ce state of an S
01d0: 53 4c 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 SL channel.. *.
01e0: 2a 20 54 68 65 20 53 53 4c 20 70 72 6f 63 65 73 * The SSL proces
01f0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 69 73 20 sing context is
0200: 6d 61 69 6e 74 61 69 6e 65 64 20 68 65 72 65 2c maintained here,
0210: 20 69 6e 20 74 68 65 20 43 6c 69 65 6e 74 44 61 in the ClientDa
0220: 74 61 0a 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 ta. */.typedef s
0230: 74 72 75 63 74 20 44 69 67 65 73 74 53 74 61 74 truct DigestStat
0240: 65 20 7b 0a 09 54 63 6c 5f 43 68 61 6e 6e 65 6c e {..Tcl_Channel
0250: 20 73 65 6c 66 3b 09 2f 2a 20 54 68 69 73 20 73 self;./* This s
0260: 6f 63 6b 65 74 20 63 68 61 6e 6e 65 6c 20 2a 2f ocket channel */
0270: 0a 09 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e ..Tcl_TimerToken
0280: 20 74 69 6d 65 72 3b 09 2f 2a 20 54 69 6d 65 72 timer;./* Timer
0290: 20 66 6f 72 20 72 65 61 64 20 65 76 65 6e 74 73 for read events
02a0: 20 2a 2f 0a 0a 09 69 6e 74 20 66 6c 61 67 73 3b */...int flags;
02b0: 09 09 2f 2a 20 43 68 61 6e 20 63 6f 6e 66 69 67 ../* Chan config
02c0: 20 66 6c 61 67 73 20 2a 2f 0a 09 69 6e 74 20 77 flags */..int w
02d0: 61 74 63 68 4d 61 73 6b 3b 09 09 2f 2a 20 43 75 atchMask;../* Cu
02e0: 72 72 65 6e 74 20 57 61 74 63 68 50 72 6f 63 20 rrent WatchProc
02f0: 6d 61 73 6b 20 2a 2f 0a 09 69 6e 74 20 6d 6f 64 mask */..int mod
0300: 65 3b 09 09 2f 2a 20 43 75 72 72 65 6e 74 20 6d e;../* Current m
0310: 6f 64 65 20 6f 66 20 70 61 72 65 6e 74 20 63 68 ode of parent ch
0320: 61 6e 6e 65 6c 20 2a 2f 0a 09 69 6e 74 20 66 6f annel */..int fo
0330: 72 6d 61 74 3b 09 09 2f 2a 20 4f 75 74 70 75 74 rmat;../* Output
0340: 20 66 6f 72 6d 61 74 20 2a 2f 0a 0a 09 54 63 6c format */...Tcl
0350: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b _Interp *interp;
0360: 09 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 65 ./* Current inte
0370: 72 70 72 65 74 65 72 20 2a 2f 0a 09 45 56 50 5f rpreter */..EVP_
0380: 4d 44 5f 43 54 58 20 2a 63 74 78 3b 09 2f 2a 20 MD_CTX *ctx;./*
0390: 4d 44 20 43 6f 6e 74 65 78 74 20 2a 2f 0a 7d 20 MD Context */.}
03a0: 44 69 67 65 73 74 53 74 61 74 65 3b 0a 0a 2f 2a DigestState;../*
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 2a 2f 0a 0a 2f 2a 0a 20 2a 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 2d 0a 20 2a -------------. *
0440: 0a 20 2a 20 44 69 67 65 73 74 46 69 6c 65 20 2d . * DigestFile -
0450: 2d 0a 20 2a 0a 20 2a 09 52 65 74 75 72 6e 20 6d -. *. *.Return m
0460: 65 73 73 61 67 65 20 64 69 67 65 73 74 20 66 6f essage digest fo
0470: 72 20 66 69 6c 65 20 75 73 69 6e 67 20 75 73 65 r file using use
0480: 72 20 73 70 65 63 69 66 69 65 64 20 68 61 73 68 r specified hash
0490: 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a function.. *. *
04a0: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c Returns:. *.TCL
04b0: 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 _OK or TCL_ERROR
04c0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
04d0: 63 74 73 3a 0a 20 2a 09 52 65 73 75 6c 74 20 69 cts:. *.Result i
04e0: 73 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 s message digest
04f0: 20 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 or error messag
0500: 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d e. *. *---------
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 2d 0a 20 2a 2f 0a 69 ----------. */.i
0550: 6e 74 20 44 69 67 65 73 74 46 69 6c 65 28 54 63 nt DigestFile(Tc
0560: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
0570: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 66 69 6c 65 6e , Tcl_Obj *filen
0580: 61 6d 65 2c 20 63 6f 6e 73 74 20 45 56 50 5f 4d ame, const EVP_M
0590: 44 20 2a 6d 64 2c 20 69 6e 74 20 66 6f 72 6d 61 D *md, int forma
05a0: 74 2c 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79 t,..Tcl_Obj *key
05b0: 4f 62 6a 29 20 7b 0a 20 20 20 20 45 56 50 5f 4d Obj) {. EVP_M
05c0: 44 5f 43 54 58 20 2a 63 74 78 20 3d 20 28 45 56 D_CTX *ctx = (EV
05d0: 50 5f 4d 44 5f 43 54 58 20 2a 29 20 4e 55 4c 4c P_MD_CTX *) NULL
05e0: 3b 0a 20 20 20 20 48 4d 41 43 5f 43 54 58 20 2a ;. HMAC_CTX *
05f0: 68 63 74 78 20 3d 20 28 48 4d 41 43 5f 43 54 58 hctx = (HMAC_CTX
0600: 20 2a 29 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 *) NULL;. Tc
0610: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a l_Channel chan;.
0620: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 unsigned cha
0630: 72 20 62 75 66 5b 42 55 46 46 45 52 5f 53 49 5a r buf[BUFFER_SIZ
0640: 45 5d 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 E];. unsigned
0650: 20 63 68 61 72 20 6d 64 5f 62 75 66 5b 45 56 50 char md_buf[EVP
0660: 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45 5d 3b 0a 20 _MAX_MD_SIZE];.
0670: 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 unsigned int
0680: 6d 64 5f 6c 65 6e 3b 0a 20 20 20 20 75 6e 73 69 md_len;. unsi
0690: 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 3b 0a gned char *key;.
06a0: 20 20 20 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 2c int key_len,
06b0: 20 72 65 73 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 res;.. /* Op
06c0: 65 6e 20 66 69 6c 65 20 63 68 61 6e 6e 65 6c 20 en file channel
06d0: 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 */. chan = Tc
06e0: 6c 5f 46 53 4f 70 65 6e 46 69 6c 65 43 68 61 6e l_FSOpenFileChan
06f0: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 66 69 6c 65 nel(interp, file
0700: 6e 61 6d 65 2c 20 22 72 62 22 2c 20 30 34 34 34 name, "rb", 0444
0710: 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 );. if (chan
0720: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 == (Tcl_Channel)
0730: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
0740: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
0750: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 }.. /* Config
0760: 75 72 65 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 ure channel */.
0770: 20 20 20 69 66 20 28 54 63 6c 5f 53 65 74 43 68 if (Tcl_SetCh
0780: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
0790: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e rp, chan, "-tran
07a0: 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72 slation", "binar
07b0: 79 22 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 y") == TCL_ERROR
07c0: 29 20 7b 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b ) {..goto error;
07d0: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 . }. Tcl_S
07e0: 65 74 43 68 61 6e 6e 65 6c 42 75 66 66 65 72 53 etChannelBufferS
07f0: 69 7a 65 28 63 68 61 6e 2c 20 42 55 46 46 45 52 ize(chan, BUFFER
0800: 5f 53 49 5a 45 29 3b 0a 0a 20 20 20 20 2f 2a 20 _SIZE);.. /*
0810: 43 72 65 61 74 65 20 6d 65 73 73 61 67 65 20 64 Create message d
0820: 69 67 65 73 74 20 63 6f 6e 74 65 78 74 20 2a 2f igest context */
0830: 0a 20 20 20 20 69 66 20 28 6b 65 79 4f 62 6a 20 . if (keyObj
0840: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 74 78 20 == NULL) {..ctx
0850: 3d 20 45 56 50 5f 4d 44 5f 43 54 58 5f 6e 65 77 = EVP_MD_CTX_new
0860: 28 29 3b 0a 09 72 65 73 20 3d 20 28 63 74 78 20 ();..res = (ctx
0870: 21 3d 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 20 != NULL);. }
0880: 65 6c 73 65 20 7b 0a 09 68 63 74 78 20 3d 20 48 else {..hctx = H
0890: 4d 41 43 5f 43 54 58 5f 6e 65 77 28 29 3b 0a 09 MAC_CTX_new();..
08a0: 72 65 73 20 3d 20 28 68 63 74 78 20 21 3d 20 4e res = (hctx != N
08b0: 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 ULL);. }.
08c0: 69 66 20 28 21 72 65 73 29 20 7b 0a 09 54 63 6c if (!res) {..Tcl
08d0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
08e0: 74 65 72 70 2c 20 22 43 72 65 61 74 65 20 64 69 terp, "Create di
08f0: 67 65 73 74 20 63 6f 6e 74 65 78 74 20 66 61 69 gest context fai
0900: 6c 65 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 led: ", REASON()
0910: 2c 20 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65 , NULL);..goto e
0920: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 rror;. }..
0930: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 68 /* Initialize h
0940: 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a ash function */.
0950: 20 20 20 20 69 66 20 28 6b 65 79 4f 62 6a 20 3d if (keyObj =
0960: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 20 3d = NULL) {..res =
0970: 20 45 56 50 5f 44 69 67 65 73 74 49 6e 69 74 5f EVP_DigestInit_
0980: 65 78 28 63 74 78 2c 20 6d 64 2c 20 4e 55 4c 4c ex(ctx, md, NULL
0990: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
09a0: 09 6b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42 79 .key = Tcl_GetBy
09b0: 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6b teArrayFromObj(k
09c0: 65 79 4f 62 6a 2c 20 26 6b 65 79 5f 6c 65 6e 29 eyObj, &key_len)
09d0: 3b 0a 09 72 65 73 20 3d 20 48 4d 41 43 5f 49 6e ;..res = HMAC_In
09e0: 69 74 5f 65 78 28 68 63 74 78 2c 20 28 63 6f 6e it_ex(hctx, (con
09f0: 73 74 20 76 6f 69 64 20 2a 29 20 6b 65 79 2c 20 st void *) key,
0a00: 6b 65 79 5f 6c 65 6e 2c 20 6d 64 2c 20 4e 55 4c key_len, md, NUL
0a10: 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 L);. }. if
0a20: 20 28 21 72 65 73 29 20 7b 0a 09 54 63 6c 5f 41 (!res) {..Tcl_A
0a30: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
0a40: 72 70 2c 20 22 49 6e 69 74 69 61 6c 69 7a 65 20 rp, "Initialize
0a50: 64 69 67 65 73 74 20 66 61 69 6c 65 64 3a 20 22 digest failed: "
0a60: 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c , REASON(), NULL
0a70: 29 3b 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a );..goto error;.
0a80: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 }.. /* Re
0a90: 61 64 20 66 69 6c 65 20 64 61 74 61 20 61 6e 64 ad file data and
0aa0: 20 75 70 64 61 74 65 20 68 61 73 68 20 66 75 6e update hash fun
0ab0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 77 68 69 ction */. whi
0ac0: 6c 65 20 28 21 54 63 6c 5f 45 6f 66 28 63 68 61 le (!Tcl_Eof(cha
0ad0: 6e 29 29 20 7b 0a 09 69 6e 74 20 6c 65 6e 20 3d n)) {..int len =
0ae0: 20 54 63 6c 5f 52 65 61 64 52 61 77 28 63 68 61 Tcl_ReadRaw(cha
0af0: 6e 2c 20 28 63 68 61 72 20 2a 29 20 62 75 66 2c n, (char *) buf,
0b00: 20 42 55 46 46 45 52 5f 53 49 5a 45 29 3b 0a 09 BUFFER_SIZE);..
0b10: 69 66 20 28 6b 65 79 4f 62 6a 20 3d 3d 20 4e 55 if (keyObj == NU
0b20: 4c 4c 29 20 7b 0a 09 20 20 20 20 72 65 73 20 3d LL) {.. res =
0b30: 20 45 56 50 5f 44 69 67 65 73 74 55 70 64 61 74 EVP_DigestUpdat
0b40: 65 28 63 74 78 2c 20 26 62 75 66 2c 20 28 73 69 e(ctx, &buf, (si
0b50: 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 7d 20 65 ze_t) len);..} e
0b60: 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 73 20 3d lse {.. res =
0b70: 20 48 4d 41 43 5f 55 70 64 61 74 65 28 68 63 74 HMAC_Update(hct
0b80: 78 2c 20 26 62 75 66 5b 30 5d 2c 20 28 73 69 7a x, &buf[0], (siz
0b90: 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 7d 0a 09 69 e_t) len);..}..i
0ba0: 66 20 28 6c 65 6e 20 3e 20 30 20 26 26 20 21 72 f (len > 0 && !r
0bb0: 65 73 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 es) {.. Tcl_A
0bc0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
0bd0: 72 70 2c 20 22 55 70 64 61 74 65 20 64 69 67 65 rp, "Update dige
0be0: 73 74 20 66 61 69 6c 65 64 3a 20 22 2c 20 52 45 st failed: ", RE
0bf0: 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 ASON(), NULL);..
0c00: 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 3b 0a goto error;.
0c10: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a .}. }.. /*
0c20: 20 43 6c 6f 73 65 20 63 68 61 6e 6e 65 6c 20 2a Close channel *
0c30: 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 43 6c /. if (Tcl_Cl
0c40: 6f 73 65 28 69 6e 74 65 72 70 2c 20 63 68 61 6e ose(interp, chan
0c50: 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20 ) == TCL_ERROR)
0c60: 7b 0a 09 63 68 61 6e 20 3d 20 28 54 63 6c 5f 43 {..chan = (Tcl_C
0c70: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 3b 0a 09 67 hannel) NULL;..g
0c80: 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 7d oto error;. }
0c90: 0a 20 20 20 20 63 68 61 6e 20 3d 20 28 54 63 6c . chan = (Tcl
0ca0: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 3b 0a _Channel) NULL;.
0cb0: 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 . /* Finalize
0cc0: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 61 hash function a
0cd0: 6e 64 20 63 61 6c 63 75 6c 61 74 65 20 6d 65 73 nd calculate mes
0ce0: 73 61 67 65 20 64 69 67 65 73 74 20 2a 2f 0a 20 sage digest */.
0cf0: 20 20 20 69 66 20 28 6b 65 79 4f 62 6a 20 3d 3d if (keyObj ==
0d00: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 20 3d 20 NULL) {..res =
0d10: 45 56 50 5f 44 69 67 65 73 74 46 69 6e 61 6c 5f EVP_DigestFinal_
0d20: 65 78 28 63 74 78 2c 20 6d 64 5f 62 75 66 2c 20 ex(ctx, md_buf,
0d30: 26 6d 64 5f 6c 65 6e 29 3b 0a 20 20 20 20 7d 20 &md_len);. }
0d40: 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 48 4d else {..res = HM
0d50: 41 43 5f 46 69 6e 61 6c 28 68 63 74 78 2c 20 6d AC_Final(hctx, m
0d60: 64 5f 62 75 66 2c 20 26 6d 64 5f 6c 65 6e 29 3b d_buf, &md_len);
0d70: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 . }. if (!
0d80: 72 65 73 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 res) {..Tcl_Appe
0d90: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
0da0: 20 22 46 69 6e 61 6c 69 7a 65 20 64 69 67 65 73 "Finalize diges
0db0: 74 20 66 61 69 6c 65 64 3a 20 22 2c 20 52 45 41 t failed: ", REA
0dc0: 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 67 SON(), NULL);..g
0dd0: 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 7d oto error;. }
0de0: 0a 0a 20 20 20 20 2f 2a 20 44 6f 6e 65 20 77 69 .. /* Done wi
0df0: 74 68 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 20 th struct */.
0e00: 20 45 56 50 5f 4d 44 5f 43 54 58 5f 66 72 65 65 EVP_MD_CTX_free
0e10: 28 63 74 78 29 3b 0a 20 20 20 20 63 74 78 20 3d (ctx);. ctx =
0e20: 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 52 NULL;.. /* R
0e30: 65 74 75 72 6e 20 6d 65 73 73 61 67 65 20 64 69 eturn message di
0e40: 67 65 73 74 20 61 73 20 65 69 74 68 65 72 20 61 gest as either a
0e50: 20 62 69 6e 61 72 79 20 6f 72 20 68 65 78 20 73 binary or hex s
0e60: 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 69 66 20 tring */. if
0e70: 28 66 6f 72 6d 61 74 20 3d 3d 20 42 49 4e 5f 46 (format == BIN_F
0e80: 4f 52 4d 41 54 29 20 7b 0a 09 54 63 6c 5f 53 65 ORMAT) {..Tcl_Se
0e90: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
0ea0: 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 p, Tcl_NewByteAr
0eb0: 72 61 79 4f 62 6a 28 6d 64 5f 62 75 66 2c 20 6d rayObj(md_buf, m
0ec0: 64 5f 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 7d 20 d_len));.. }
0ed0: 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 else {..Tcl_Obj
0ee0: 2a 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c *resultObj = Tcl
0ef0: 5f 4e 65 77 4f 62 6a 28 29 3b 0a 09 75 6e 73 69 _NewObj();..unsi
0f00: 67 6e 65 64 20 63 68 61 72 20 2a 70 74 72 20 3d gned char *ptr =
0f10: 20 54 63 6c 5f 53 65 74 42 79 74 65 41 72 72 61 Tcl_SetByteArra
0f20: 79 4c 65 6e 67 74 68 28 72 65 73 75 6c 74 4f 62 yLength(resultOb
0f30: 6a 2c 20 6d 64 5f 6c 65 6e 2a 32 29 3b 0a 0a 09 j, md_len*2);...
0f40: 66 6f 72 20 28 75 6e 73 69 67 6e 65 64 20 69 6e for (unsigned in
0f50: 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 6d 64 5f t i = 0; i < md_
0f60: 6c 65 6e 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 len; i++) {..
0f70: 20 2a 70 74 72 2b 2b 20 3d 20 68 65 78 5b 28 6d *ptr++ = hex[(m
0f80: 64 5f 62 75 66 5b 69 5d 20 3e 3e 20 34 29 20 26 d_buf[i] >> 4) &
0f90: 20 30 78 30 46 5d 3b 0a 09 20 20 20 20 2a 70 74 0x0F];.. *pt
0fa0: 72 2b 2b 20 3d 20 68 65 78 5b 6d 64 5f 62 75 66 r++ = hex[md_buf
0fb0: 5b 69 5d 20 26 20 30 78 30 46 5d 3b 0a 09 7d 0a [i] & 0x0F];..}.
0fc0: 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c .Tcl_SetObjResul
0fd0: 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 t(interp, result
0fe0: 4f 62 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 Obj);. }.
0ff0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a return TCL_OK;..
1000: 65 72 72 6f 72 3a 0a 20 20 20 20 69 66 20 28 63 error:. if (c
1010: 68 61 6e 20 21 3d 20 28 54 63 6c 5f 43 68 61 6e han != (Tcl_Chan
1020: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 nel) NULL) {..Tc
1030: 6c 5f 43 6c 6f 73 65 28 69 6e 74 65 72 70 2c 20 l_Close(interp,
1040: 63 68 61 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 chan);. }.
1050: 20 69 66 20 28 63 74 78 20 21 3d 20 28 45 56 50 if (ctx != (EVP
1060: 5f 4d 44 5f 43 54 58 20 2a 29 20 4e 55 4c 4c 29 _MD_CTX *) NULL)
1070: 20 7b 0a 09 45 56 50 5f 4d 44 5f 43 54 58 5f 66 {..EVP_MD_CTX_f
1080: 72 65 65 28 63 74 78 29 3b 0a 20 20 20 20 7d 0a ree(ctx);. }.
1090: 20 20 20 20 69 66 20 28 68 63 74 78 20 21 3d 20 if (hctx !=
10a0: 28 48 4d 41 43 5f 43 54 58 20 2a 29 20 4e 55 4c (HMAC_CTX *) NUL
10b0: 4c 29 20 7b 0a 09 48 4d 41 43 5f 43 54 58 5f 66 L) {..HMAC_CTX_f
10c0: 72 65 65 28 68 63 74 78 29 3b 0a 20 20 20 20 7d ree(hctx);. }
10d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
10e0: 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a ERROR;.}../*****
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 2a 2f 0a **************/.
1130: 0a 2f 2a 0a 20 2a 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 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
1180: 44 69 67 65 73 74 42 6c 6f 63 6b 4d 6f 64 65 50 DigestBlockModeP
1190: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 roc --. *. *.Thi
11a0: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 s procedure is i
11b0: 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 67 65 nvoked by the ge
11c0: 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 6c 0a 20 neric IO level.
11d0: 2a 20 20 20 20 20 20 20 74 6f 20 73 65 74 20 62 * to set b
11e0: 6c 6f 63 6b 69 6e 67 20 61 6e 64 20 6e 6f 6e 62 locking and nonb
11f0: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 2e 0a 20 locking modes..
1200: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a *. * Returns:. *
1210: 09 30 20 69 66 20 73 75 63 63 65 73 73 66 75 6c .0 if successful
1220: 20 6f 72 20 50 4f 53 49 58 20 65 72 72 6f 72 20 or POSIX error
1230: 63 6f 64 65 20 69 66 20 66 61 69 6c 65 64 2e 0a code if failed..
1240: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
1250: 74 73 3a 0a 20 2a 09 53 65 74 73 20 74 68 65 20 ts:. *.Sets the
1260: 64 65 76 69 63 65 20 69 6e 74 6f 20 62 6c 6f 63 device into bloc
1270: 6b 69 6e 67 20 6f 72 20 6e 6f 6e 62 6c 6f 63 6b king or nonblock
1280: 69 6e 67 20 6d 6f 64 65 2e 0a 20 2a 09 43 61 6e ing mode.. *.Can
1290: 20 63 61 6c 6c 20 54 63 6c 5f 53 65 74 43 68 61 call Tcl_SetCha
12a0: 6e 6e 65 6c 45 72 72 6f 72 2e 0a 20 2a 0a 20 2a nnelError.. *. *
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 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
1300: 6e 74 20 44 69 67 65 73 74 42 6c 6f 63 6b 4d 6f nt DigestBlockMo
1310: 64 65 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 deProc(ClientDat
1320: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e a clientData, in
1330: 74 20 6d 6f 64 65 29 20 7b 0a 20 20 20 20 44 69 t mode) {. Di
1340: 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 gestState *state
1350: 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 Ptr = (DigestSta
1360: 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 te *) clientData
1370: 3b 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 20 ;.. if (mode
1380: 3d 3d 20 54 43 4c 5f 4d 4f 44 45 5f 4e 4f 4e 42 == TCL_MODE_NONB
1390: 4c 4f 43 4b 49 4e 47 29 20 7b 0a 09 73 74 61 74 LOCKING) {..stat
13a0: 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 ePtr->flags |= T
13b0: 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 3b 0a 20 20 LS_TCL_ASYNC;.
13c0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 74 61 74 } else {..stat
13d0: 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e ePtr->flags &= ~
13e0: 28 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29 3b (TLS_TCL_ASYNC);
13f0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 . }. retur
1400: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d n 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 2d ----------------
1450: 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 46 72 65 . *. * DigestFre
1460: 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 e --. *. *.This
1470: 70 72 6f 63 65 64 75 72 65 20 72 65 6d 6f 76 65 procedure remove
1480: 73 20 61 20 64 69 67 65 73 74 20 73 74 61 74 65 s a digest state
1490: 20 73 74 72 75 63 74 75 72 65 0a 20 2a 0a 20 2a structure. *. *
14a0: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 4e 6f 74 Returns:. *.Not
14b0: 68 69 6e 67 0a 20 2a 0a 20 2a 20 53 69 64 65 20 hing. *. * Side
14c0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 52 65 6d 6f effects:. *.Remo
14d0: 76 65 73 20 73 74 72 75 63 74 75 72 65 0a 20 2a ves structure. *
14e0: 0a 20 2a 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 2d 0a 20 2a 2f 0a 76 6f 69 64 20 ------. */.void
1530: 44 69 67 65 73 74 46 72 65 65 20 28 44 69 67 65 DigestFree (Dige
1540: 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 stState *statePt
1550: 72 29 20 7b 0a 20 20 20 20 69 66 20 28 73 74 61 r) {. if (sta
1560: 74 65 50 74 72 20 3d 3d 20 28 44 69 67 65 73 74 tePtr == (Digest
1570: 53 74 61 74 65 20 2a 29 20 4e 55 4c 4c 29 20 72 State *) NULL) r
1580: 65 74 75 72 6e 3b 0a 20 20 20 20 0a 20 20 20 20 eturn;. .
1590: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 74 if (statePtr->ct
15a0: 78 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 45 56 x != NULL) {..EV
15b0: 50 5f 4d 44 5f 43 54 58 5f 66 72 65 65 28 73 74 P_MD_CTX_free(st
15c0: 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20 atePtr->ctx);.
15d0: 20 20 7d 0a 20 20 20 20 63 6b 66 72 65 65 28 73 }. ckfree(s
15e0: 74 61 74 65 50 74 72 29 3b 0a 7d 0a 0a 2f 2a 0a tatePtr);.}../*.
15f0: 20 2a 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 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 -----. *. * Dige
1640: 73 74 43 6c 6f 73 65 50 72 6f 63 20 2d 2d 0a 20 stCloseProc --.
1650: 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 *. *.This proced
1660: 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 ure is invoked b
1670: 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f y the generic IO
1680: 20 6c 65 76 65 6c 20 74 6f 20 70 65 72 66 6f 72 level to perfor
1690: 6d 0a 20 2a 09 63 68 61 6e 6e 65 6c 2d 74 79 70 m. *.channel-typ
16a0: 65 2d 73 70 65 63 69 66 69 63 20 63 6c 65 61 6e e-specific clean
16b0: 75 70 20 77 68 65 6e 20 64 69 67 65 73 74 20 63 up when digest c
16c0: 68 61 6e 6e 65 6c 20 69 73 20 63 6c 6f 73 65 64 hannel is closed
16d0: 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a .. *. * Returns:
16e0: 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 . *.TCL_OK or TC
16f0: 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 L_ERROR. *. * Si
1700: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 57 de effects:. *.W
1710: 72 69 74 65 73 20 64 69 67 65 73 74 20 74 6f 20 rites digest to
1720: 6f 75 74 70 75 74 20 61 6e 64 20 63 6c 6f 73 65 output and close
1730: 73 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e 0a 20 s the channel..
1740: 2a 0a 20 2a 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 2d 0a 20 2a 2f 0a 69 6e 74 20 -------. */.int
1790: 44 69 67 65 73 74 43 6c 6f 73 65 50 72 6f 63 28 DigestCloseProc(
17a0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
17b0: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
17c0: 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 p *interp) {.
17d0: 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 DigestState *st
17e0: 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 atePtr = (Digest
17f0: 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 State *) clientD
1800: 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 ata;. int res
1810: 75 6c 74 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a ult = 0;.. /*
1820: 20 43 61 6e 63 65 6c 20 61 63 74 69 76 65 20 74 Cancel active t
1830: 69 6d 65 72 2c 20 69 66 20 61 6e 79 20 2a 2f 0a imer, if any */.
1840: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
1850: 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f ->timer != (Tcl_
1860: 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c TimerToken) NULL
1870: 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 ) {..Tcl_DeleteT
1880: 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 imerHandler(stat
1890: 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 ePtr->timer);..s
18a0: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d tatePtr->timer =
18b0: 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e (Tcl_TimerToken
18c0: 29 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 ) NULL;. }..
18d0: 20 20 20 2f 2a 20 43 6c 65 61 6e 2d 75 70 20 2a /* Clean-up *
18e0: 2f 0a 20 20 20 20 44 69 67 65 73 74 46 72 65 65 /. DigestFree
18f0: 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 (statePtr);.
1900: 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a 7d return result;.}
1910: 0a 0a 2f 2a 0a 20 2a 20 53 61 6d 65 20 61 73 20 ../*. * Same as
1920: 44 69 67 65 73 74 43 6c 6f 73 65 50 72 6f 63 20 DigestCloseProc
1930: 62 75 74 20 77 69 74 68 20 69 6e 64 69 76 69 64 but with individ
1940: 75 61 6c 20 72 65 61 64 20 61 6e 64 20 77 72 69 ual read and wri
1950: 74 65 20 63 6c 6f 73 65 20 63 6f 6e 74 72 6f 6c te close control
1960: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 . */.static int
1970: 44 69 67 65 73 74 43 6c 6f 73 65 32 50 72 6f 63 DigestClose2Proc
1980: 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 (ClientData inst
1990: 61 6e 63 65 44 61 74 61 2c 20 54 63 6c 5f 49 6e anceData, Tcl_In
19a0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e terp *interp, in
19b0: 74 20 66 6c 61 67 73 29 20 7b 0a 0a 20 20 20 20 t flags) {..
19c0: 69 66 20 28 28 66 6c 61 67 73 20 26 20 28 54 43 if ((flags & (TC
19d0: 4c 5f 43 4c 4f 53 45 5f 52 45 41 44 20 7c 20 54 L_CLOSE_READ | T
19e0: 43 4c 5f 43 4c 4f 53 45 5f 57 52 49 54 45 29 29 CL_CLOSE_WRITE))
19f0: 20 3d 3d 20 30 29 20 7b 0a 09 72 65 74 75 72 6e == 0) {..return
1a00: 20 44 69 67 65 73 74 43 6c 6f 73 65 50 72 6f 63 DigestCloseProc
1a10: 28 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69 (instanceData, i
1a20: 6e 74 65 72 70 29 3b 0a 20 20 20 20 7d 0a 20 20 nterp);. }.
1a30: 20 20 72 65 74 75 72 6e 20 45 49 4e 56 41 4c 3b return EINVAL;
1a40: 0a 7d 0a 0a 2f 2a 0a 20 2a 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 2d 0a ---------------.
1a90: 20 2a 0a 20 2a 20 44 69 67 65 73 74 49 6e 70 75 *. * DigestInpu
1aa0: 74 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 tProc --. *. *.C
1ab0: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 67 65 6e alled by the gen
1ac0: 65 72 69 63 20 49 4f 20 73 79 73 74 65 6d 20 74 eric IO system t
1ad0: 6f 20 72 65 61 64 20 64 61 74 61 20 66 72 6f 6d o read data from
1ae0: 20 74 72 61 6e 73 66 6f 72 6d 2e 0a 20 2a 0a 20 transform.. *.
1af0: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 6f * Returns:. *.To
1b00: 74 61 6c 20 62 79 74 65 73 20 72 65 61 64 0a 20 tal bytes read.
1b10: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
1b20: 73 3a 0a 20 2a 09 52 65 61 64 20 64 61 74 61 20 s:. *.Read data
1b30: 66 72 6f 6d 20 74 72 61 6e 73 66 6f 72 6d 20 61 from transform a
1b40: 6e 64 20 77 72 69 74 65 20 74 6f 20 62 75 66 0a nd write to buf.
1b50: 20 2a 0a 20 2a 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 2d 0a 20 2a 2f 0a -----------. */.
1ba0: 69 6e 74 20 44 69 67 65 73 74 49 6e 70 75 74 50 int DigestInputP
1bb0: 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 63 roc(ClientData c
1bc0: 6c 69 65 6e 74 44 61 74 61 2c 20 63 68 61 72 20 lientData, char
1bd0: 2a 62 75 66 2c 20 69 6e 74 20 74 6f 52 65 61 64 *buf, int toRead
1be0: 2c 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 , int *errorCode
1bf0: 50 74 72 29 20 7b 0a 20 20 20 20 44 69 67 65 73 Ptr) {. Diges
1c00: 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 tState *statePtr
1c10: 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20 = (DigestState
1c20: 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 *) clientData;.
1c30: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 70 Tcl_Channel p
1c40: 61 72 65 6e 74 3b 0a 20 20 20 20 69 6e 74 20 72 arent;. int r
1c50: 65 61 64 3b 0a 20 20 20 20 2a 65 72 72 6f 72 43 ead;. *errorC
1c60: 6f 64 65 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 odePtr = 0;..
1c70: 20 69 66 20 28 74 6f 52 65 61 64 20 3c 3d 20 30 if (toRead <= 0
1c80: 20 7c 7c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 || statePtr->se
1c90: 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e lf == (Tcl_Chann
1ca0: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 el) NULL) {..ret
1cb0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 urn 0;. }..
1cc0: 20 20 2f 2a 20 47 65 74 20 62 79 74 65 73 20 66 /* Get bytes f
1cd0: 72 6f 6d 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 rom underlying c
1ce0: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 70 61 hannel */. pa
1cf0: 72 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 rent = Tcl_GetSt
1d00: 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 61 ackedChannel(sta
1d10: 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 tePtr->self);.
1d20: 20 20 72 65 61 64 20 3d 20 54 63 6c 5f 52 65 61 read = Tcl_Rea
1d30: 64 52 61 77 28 70 61 72 65 6e 74 2c 20 62 75 66 dRaw(parent, buf
1d40: 2c 20 74 6f 52 65 61 64 29 3b 0a 0a 20 20 20 20 , toRead);..
1d50: 2f 2a 20 41 64 64 20 74 6f 20 6d 65 73 73 61 67 /* Add to messag
1d60: 65 20 64 69 67 65 73 74 20 2a 2f 0a 20 20 20 20 e digest */.
1d70: 69 66 20 28 72 65 61 64 20 3e 20 30 29 20 7b 0a if (read > 0) {.
1d80: 09 2f 2a 20 4f 4b 20 2a 2f 0a 09 69 66 20 28 21 ./* OK */..if (!
1d90: 45 56 50 5f 44 69 67 65 73 74 55 70 64 61 74 65 EVP_DigestUpdate
1da0: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
1db0: 62 75 66 2c 20 72 65 61 64 29 29 20 7b 0a 09 20 buf, read)) {..
1dc0: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 Tcl_SetChanne
1dd0: 6c 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2d lError(statePtr-
1de0: 3e 73 65 6c 66 2c 20 54 63 6c 5f 4f 62 6a 50 72 >self, Tcl_ObjPr
1df0: 69 6e 74 66 28 22 44 69 67 65 73 74 20 75 70 64 intf("Digest upd
1e00: 61 74 65 20 66 61 69 6c 65 64 3a 20 25 73 22 2c ate failed: %s",
1e10: 20 52 45 41 53 4f 4e 28 29 29 29 3b 0a 09 20 20 REASON()));..
1e20: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 *errorCodePtr
1e30: 3d 20 45 49 4e 56 41 4c 3b 0a 09 20 20 20 20 72 = EINVAL;.. r
1e40: 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 09 2a 65 eturn -1;..}..*e
1e50: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41 rrorCodePtr = EA
1e60: 47 41 49 4e 3b 0a 09 72 65 61 64 20 3d 20 2d 31 GAIN;..read = -1
1e70: 3b 0a 09 20 20 20 20 0a 20 20 20 20 7d 20 65 6c ;.. . } el
1e80: 73 65 20 69 66 20 28 72 65 61 64 20 3c 20 30 29 se if (read < 0)
1e90: 20 7b 0a 09 2f 2a 20 45 72 72 6f 72 20 2a 2f 0a {../* Error */.
1ea0: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d .*errorCodePtr =
1eb0: 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b Tcl_GetErrno();
1ec0: 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
1ed0: 28 21 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 (!(statePtr->fla
1ee0: 67 73 20 26 20 30 78 31 30 29 29 20 7b 0a 09 2f gs & 0x10)) {../
1ef0: 2a 20 45 4f 46 20 2a 2f 0a 09 2a 65 72 72 6f 72 * EOF */..*error
1f00: 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 75 6e CodePtr = 0;..un
1f10: 73 69 67 6e 65 64 20 63 68 61 72 20 6d 64 5f 62 signed char md_b
1f20: 75 66 5b 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 uf[EVP_MAX_MD_SI
1f30: 5a 45 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 ZE];..unsigned i
1f40: 6e 74 20 6d 64 5f 6c 65 6e 20 3d 20 30 3b 0a 0a nt md_len = 0;..
1f50: 09 2f 2a 20 47 65 74 20 6d 65 73 73 61 67 65 20 ./* Get message
1f60: 64 69 67 65 73 74 20 2a 2f 0a 09 69 66 20 28 21 digest */..if (!
1f70: 45 56 50 5f 44 69 67 65 73 74 46 69 6e 61 6c 5f EVP_DigestFinal_
1f80: 65 78 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 ex(statePtr->ctx
1f90: 2c 20 6d 64 5f 62 75 66 2c 20 26 6d 64 5f 6c 65 , md_buf, &md_le
1fa0: 6e 29 29 20 7b 0a 09 20 20 20 20 2a 65 72 72 6f n)) {.. *erro
1fb0: 72 43 6f 64 65 50 74 72 20 3d 20 45 49 4e 56 41 rCodePtr = EINVA
1fc0: 4c 3b 0a 0a 09 2f 2a 20 57 72 69 74 65 20 6d 65 L;.../* Write me
1fd0: 73 73 61 67 65 20 64 69 67 65 73 74 20 74 6f 20 ssage digest to
1fe0: 6f 75 74 70 75 74 20 63 68 61 6e 6e 65 6c 20 61 output channel a
1ff0: 73 20 62 79 74 65 20 61 72 72 61 79 20 6f 72 20 s byte array or
2000: 68 65 78 20 73 74 72 69 6e 67 20 2a 2f 0a 09 7d hex string */..}
2010: 20 65 6c 73 65 20 69 66 20 28 6d 64 5f 6c 65 6e else if (md_len
2020: 20 3e 20 30 29 20 7b 0a 09 20 20 20 20 69 66 20 > 0) {.. if
2030: 28 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 (statePtr->forma
2040: 74 20 3d 3d 20 42 49 4e 5f 46 4f 52 4d 41 54 29 t == BIN_FORMAT)
2050: 20 7b 0a 09 09 72 65 61 64 20 3d 20 6d 64 5f 6c {...read = md_l
2060: 65 6e 3b 0a 09 09 6d 65 6d 63 70 79 28 62 75 66 en;...memcpy(buf
2070: 2c 20 6d 64 5f 62 75 66 2c 20 72 65 61 64 29 3b , md_buf, read);
2080: 0a 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a ... } else {.
2090: 09 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 ..unsigned char
20a0: 68 65 78 5f 62 75 66 5b 45 56 50 5f 4d 41 58 5f hex_buf[EVP_MAX_
20b0: 4d 44 5f 53 49 5a 45 2a 32 5d 3b 0a 09 09 75 6e MD_SIZE*2];...un
20c0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 74 72 signed char *ptr
20d0: 20 3d 20 68 65 78 5f 62 75 66 3b 0a 0a 09 09 66 = hex_buf;....f
20e0: 6f 72 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 or (unsigned int
20f0: 20 69 20 3d 20 30 3b 20 69 20 3c 20 6d 64 5f 6c i = 0; i < md_l
2100: 65 6e 3b 20 69 2b 2b 29 20 7b 0a 09 09 20 20 20 en; i++) {...
2110: 20 2a 70 74 72 2b 2b 20 3d 20 68 65 78 5b 28 6d *ptr++ = hex[(m
2120: 64 5f 62 75 66 5b 69 5d 20 3e 3e 20 34 29 20 26 d_buf[i] >> 4) &
2130: 20 30 78 30 46 5d 3b 0a 09 09 20 20 20 20 2a 70 0x0F];... *p
2140: 74 72 2b 2b 20 3d 20 68 65 78 5b 6d 64 5f 62 75 tr++ = hex[md_bu
2150: 66 5b 69 5d 20 26 20 30 78 30 46 5d 3b 0a 09 09 f[i] & 0x0F];...
2160: 7d 0a 09 09 72 65 61 64 20 3d 20 6d 64 5f 6c 65 }...read = md_le
2170: 6e 2a 32 3b 0a 09 09 6d 65 6d 63 70 79 28 62 75 n*2;...memcpy(bu
2180: 66 2c 20 68 65 78 5f 62 75 66 2c 20 72 65 61 64 f, hex_buf, read
2190: 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 73 74 );.. }..}..st
21a0: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d atePtr->flags |=
21b0: 20 30 78 31 30 3b 0a 20 20 20 20 7d 0a 20 20 20 0x10;. }.
21c0: 20 72 65 74 75 72 6e 20 72 65 61 64 3b 0a 7d 0a return read;.}.
21d0: 0a 2f 2a 0a 20 2a 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 2d 0a 20 2a 0a ------------. *.
2220: 20 2a 20 44 69 67 65 73 74 4f 75 74 70 75 74 50 * DigestOutputP
2230: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c roc --. *. *.Cal
2240: 6c 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 led by the gener
2250: 69 63 20 49 4f 20 73 79 73 74 65 6d 20 74 6f 20 ic IO system to
2260: 77 72 69 74 65 20 64 61 74 61 20 74 6f 20 74 72 write data to tr
2270: 61 6e 73 66 6f 72 6d 2e 0a 20 2a 0a 20 2a 20 52 ansform.. *. * R
2280: 65 74 75 72 6e 73 3a 0a 20 2a 09 54 6f 74 61 6c eturns:. *.Total
2290: 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 0a 20 bytes written.
22a0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
22b0: 73 3a 0a 20 2a 09 47 65 74 20 64 61 74 61 20 66 s:. *.Get data f
22c0: 72 6f 6d 20 62 75 66 20 61 6e 64 20 75 70 64 61 rom buf and upda
22d0: 74 65 20 64 69 67 65 73 74 0a 20 2a 0a 20 2a 2d te 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 2d 0a 20 2a 2f 0a 20 69 6e 74 20 44 -----. */. int D
2330: 69 67 65 73 74 4f 75 74 70 75 74 50 72 6f 63 28 igestOutputProc(
2340: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
2350: 74 44 61 74 61 2c 20 63 6f 6e 73 74 20 63 68 61 tData, const cha
2360: 72 20 2a 62 75 66 2c 20 69 6e 74 20 74 6f 57 72 r *buf, int toWr
2370: 69 74 65 2c 20 69 6e 74 20 2a 65 72 72 6f 72 43 ite, int *errorC
2380: 6f 64 65 50 74 72 29 20 7b 0a 20 20 20 20 44 69 odePtr) {. Di
2390: 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 gestState *state
23a0: 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 Ptr = (DigestSta
23b0: 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 te *) clientData
23c0: 3b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 ;. *errorCode
23d0: 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 Ptr = 0;.. if
23e0: 20 28 74 6f 57 72 69 74 65 20 3c 3d 20 30 20 7c (toWrite <= 0 |
23f0: 7c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 | statePtr->self
2400: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c == (Tcl_Channel
2410: 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 ) NULL) {..retur
2420: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 n 0;. }. r
2430: 65 74 75 72 6e 20 74 6f 57 72 69 74 65 3b 0a 7d eturn toWrite;.}
2440: 0a 0a 2f 2a 0a 20 2a 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 2d 0a 20 2a -------------. *
2490: 0a 20 2a 20 44 69 67 65 73 74 53 65 74 4f 70 74 . * DigestSetOpt
24a0: 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a ionProc --. *. *
24b0: 09 43 61 6c 6c 65 64 20 62 79 20 74 68 65 20 67 .Called by the g
24c0: 65 6e 65 72 69 63 20 49 4f 20 73 79 73 74 65 6d eneric IO system
24d0: 20 74 6f 20 73 65 74 20 63 68 61 6e 6e 65 6c 20 to set channel
24e0: 6f 70 74 69 6f 6e 20 74 6f 20 76 61 6c 75 65 2e option to value.
24f0: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a . *. * Returns:.
2500: 20 2a 09 54 43 4c 5f 4f 4b 20 69 66 20 73 75 63 *.TCL_OK if suc
2510: 63 65 73 73 66 75 6c 20 6f 72 20 54 43 4c 5f 45 cessful or TCL_E
2520: 52 52 4f 52 20 69 66 20 66 61 69 6c 65 64 2e 0a RROR if failed..
2530: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
2540: 74 73 3a 0a 20 2a 09 55 70 64 61 74 65 73 20 63 ts:. *.Updates c
2550: 68 61 6e 6e 65 6c 20 6f 70 74 69 6f 6e 20 74 6f hannel option to
2560: 20 6e 65 77 20 76 61 6c 75 65 2e 0a 20 2a 0a 20 new value.. *.
2570: 2a 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 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
25c0: 69 63 20 69 6e 74 20 44 69 67 65 73 74 53 65 74 ic int DigestSet
25d0: 4f 70 74 69 6f 6e 50 72 6f 63 28 43 6c 69 65 6e OptionProc(Clien
25e0: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
25f0: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
2600: 74 65 72 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 terp, const char
2610: 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c 0a 09 63 *optionName,..c
2620: 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70 74 69 6f onst char *optio
2630: 6e 56 61 6c 75 65 29 20 7b 0a 20 20 20 20 44 69 nValue) {. Di
2640: 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 gestState *state
2650: 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 Ptr = (DigestSta
2660: 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 te *) clientData
2670: 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 ;. Tcl_Channe
2680: 6c 20 70 61 72 65 6e 74 3b 0a 20 20 20 20 54 63 l parent;. Tc
2690: 6c 5f 44 72 69 76 65 72 53 65 74 4f 70 74 69 6f l_DriverSetOptio
26a0: 6e 50 72 6f 63 20 2a 73 65 74 4f 70 74 69 6f 6e nProc *setOption
26b0: 50 72 6f 63 3b 0a 0a 20 20 20 20 69 66 20 28 73 Proc;.. if (s
26c0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d tatePtr->self ==
26d0: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e (Tcl_Channel) N
26e0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 ULL) {..return T
26f0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
2700: 0a 20 20 20 20 2f 2a 20 44 65 6c 65 67 61 74 65 . /* Delegate
2710: 20 6f 70 74 69 6f 6e 73 20 64 6f 77 6e 73 74 72 options downstr
2720: 65 61 6d 20 2a 2f 0a 20 20 20 20 70 61 72 65 6e eam */. paren
2730: 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 63 6b t = Tcl_GetStack
2740: 65 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 edChannel(stateP
2750: 74 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 20 73 tr->self);. s
2760: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 3d 20 54 etOptionProc = T
2770: 63 6c 5f 43 68 61 6e 6e 65 6c 53 65 74 4f 70 74 cl_ChannelSetOpt
2780: 69 6f 6e 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 ionProc(Tcl_GetC
2790: 68 61 6e 6e 65 6c 54 79 70 65 28 70 61 72 65 6e hannelType(paren
27a0: 74 29 29 3b 0a 20 20 20 20 69 66 20 28 73 65 74 t));. if (set
27b0: 4f 70 74 69 6f 6e 50 72 6f 63 20 21 3d 20 4e 55 OptionProc != NU
27c0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 28 2a LL) {..return (*
27d0: 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 29 28 54 setOptionProc)(T
27e0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 cl_GetChannelIns
27f0: 74 61 6e 63 65 44 61 74 61 28 70 61 72 65 6e 74 tanceData(parent
2800: 29 2c 20 69 6e 74 65 72 70 2c 20 6f 70 74 69 6f ), interp, optio
2810: 6e 4e 61 6d 65 2c 20 6f 70 74 69 6f 6e 56 61 6c nName, optionVal
2820: 75 65 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 ue);. } else
2830: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
2840: 52 4f 52 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a ROR;. }.}../*
2850: 0a 20 2a 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 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
28a0: 44 69 67 65 73 74 47 65 74 4f 70 74 69 6f 6e 50 DigestGetOptionP
28b0: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c roc --. *. *.Cal
28c0: 6c 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 led by the gener
28d0: 69 63 20 49 4f 20 73 79 73 74 65 6d 20 74 6f 20 ic IO system to
28e0: 67 65 74 20 63 68 61 6e 6e 65 6c 20 6f 70 74 69 get channel opti
28f0: 6f 6e 27 73 20 76 61 6c 75 65 2e 0a 20 2a 0a 20 on's value.. *.
2900: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 * Returns:. *.TC
2910: 4c 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 L_OK if successf
2920: 75 6c 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 20 ul or TCL_ERROR
2930: 69 66 20 66 61 69 6c 65 64 2e 0a 20 2a 0a 20 2a if failed.. *. *
2940: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
2950: 2a 09 53 65 74 73 20 72 65 73 75 6c 74 20 74 6f *.Sets result to
2960: 20 6f 70 74 69 6f 6e 27 73 20 76 61 6c 75 65 0a option's value.
2970: 20 2a 0a 20 2a 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 2d 0a 20 2a 2f 0a -----------. */.
29c0: 73 74 61 74 69 63 20 69 6e 74 20 44 69 67 65 73 static int Diges
29d0: 74 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 43 tGetOptionProc(C
29e0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
29f0: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
2a00: 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74 20 *interp, const
2a10: 63 68 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65 char *optionName
2a20: 2c 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 20 2a ,..Tcl_DString *
2a30: 6f 70 74 69 6f 6e 56 61 6c 75 65 29 20 7b 0a 20 optionValue) {.
2a40: 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a DigestState *
2a50: 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 statePtr = (Dige
2a60: 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e stState *) clien
2a70: 74 44 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 43 tData;. Tcl_C
2a80: 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 3b 0a 20 hannel parent;.
2a90: 20 20 20 54 63 6c 5f 44 72 69 76 65 72 47 65 74 Tcl_DriverGet
2aa0: 4f 70 74 69 6f 6e 50 72 6f 63 20 2a 67 65 74 4f OptionProc *getO
2ab0: 70 74 69 6f 6e 50 72 6f 63 3b 0a 0a 20 20 20 20 ptionProc;..
2ac0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 65 if (statePtr->se
2ad0: 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e lf == (Tcl_Chann
2ae0: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 el) NULL) {..ret
2af0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
2b00: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c }.. /* Del
2b10: 65 67 61 74 65 20 6f 70 74 69 6f 6e 73 20 64 6f egate options do
2b20: 77 6e 73 74 72 65 61 6d 20 2a 2f 0a 20 20 20 20 wnstream */.
2b30: 70 61 72 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74 parent = Tcl_Get
2b40: 53 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73 StackedChannel(s
2b50: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a tatePtr->self);.
2b60: 20 20 20 20 67 65 74 4f 70 74 69 6f 6e 50 72 6f getOptionPro
2b70: 63 20 3d 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 47 c = Tcl_ChannelG
2b80: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 54 63 6c etOptionProc(Tcl
2b90: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 _GetChannelType(
2ba0: 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 69 66 parent));. if
2bb0: 20 28 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 (getOptionProc
2bc0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 != NULL) {..retu
2bd0: 72 6e 20 28 2a 67 65 74 4f 70 74 69 6f 6e 50 72 rn (*getOptionPr
2be0: 6f 63 29 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e oc)(Tcl_GetChann
2bf0: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 70 elInstanceData(p
2c00: 61 72 65 6e 74 29 2c 20 69 6e 74 65 72 70 2c 20 arent), interp,
2c10: 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 6f 70 74 69 optionName, opti
2c20: 6f 6e 56 61 6c 75 65 29 3b 0a 20 20 20 20 7d 20 onValue);. }
2c30: 65 6c 73 65 20 69 66 20 28 6f 70 74 69 6f 6e 4e else if (optionN
2c40: 61 6d 65 20 3d 3d 20 28 63 68 61 72 2a 29 20 4e ame == (char*) N
2c50: 55 4c 4c 29 20 7b 0a 09 2f 2a 20 52 65 71 75 65 ULL) {../* Reque
2c60: 73 74 20 69 73 20 71 75 65 72 79 20 66 6f 72 20 st is query for
2c70: 61 6c 6c 20 6f 70 74 69 6f 6e 73 2c 20 74 68 69 all options, thi
2c80: 73 20 69 73 20 6f 6b 2e 20 2a 2f 0a 09 72 65 74 s is ok. */..ret
2c90: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 urn TCL_OK;.
2ca0: 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 71 75 65 73 }.. /* Reques
2cb0: 74 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 t for a specific
2cc0: 20 6f 70 74 69 6f 6e 20 68 61 73 20 74 6f 20 66 option has to f
2cd0: 61 69 6c 2c 20 77 65 20 64 6f 6e 27 74 20 68 61 ail, we don't ha
2ce0: 76 65 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 72 ve any. */. r
2cf0: 65 74 75 72 6e 20 54 63 6c 5f 42 61 64 43 68 61 eturn Tcl_BadCha
2d00: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
2d10: 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 22 p, optionName, "
2d20: 22 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 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 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 54 --. *. * DigestT
2d80: 69 6d 65 72 48 61 6e 64 6c 65 72 20 2d 2d 0a 20 imerHandler --.
2d90: 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79 20 74 *. *.Called by t
2da0: 68 65 20 6e 6f 74 69 66 69 65 72 20 76 69 61 20 he notifier via
2db0: 74 69 6d 65 72 20 74 6f 20 66 6c 75 73 68 20 6f timer to flush o
2dc0: 75 74 20 70 65 6e 64 69 6e 67 20 69 6e 70 75 74 ut pending input
2dd0: 20 64 61 74 61 2e 0a 20 2a 0a 20 2a 20 52 65 74 data.. *. * Ret
2de0: 75 72 6e 73 3a 0a 20 2a 09 4e 6f 74 68 69 6e 67 urns:. *.Nothing
2df0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
2e00: 63 74 73 3a 0a 20 2a 09 4d 61 79 20 63 61 6c 6c cts:. *.May call
2e10: 20 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61 6e 6e Tcl_NotifyChann
2e20: 65 6c 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d el. *. *--------
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 2d 0a 20 --------------.
2e70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44 */.static void D
2e80: 69 67 65 73 74 54 69 6d 65 72 48 61 6e 64 6c 65 igestTimerHandle
2e90: 72 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 r(ClientData cli
2ea0: 65 6e 74 44 61 74 61 29 20 7b 0a 20 20 20 20 44 entData) {. D
2eb0: 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 igestState *stat
2ec0: 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 ePtr = (DigestSt
2ed0: 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 ate *) clientDat
2ee0: 61 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 a;.. if (stat
2ef0: 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 ePtr->self == (T
2f00: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c cl_Channel) NULL
2f10: 29 20 7b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 ) {..return;.
2f20: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 72 }.. /* Clear
2f30: 20 74 69 6d 65 72 20 74 6f 6b 65 6e 20 2a 2f 0a timer token */.
2f40: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 74 69 statePtr->ti
2f50: 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 mer = (Tcl_Timer
2f60: 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 0a 20 20 Token) NULL;..
2f70: 20 20 2f 2a 20 46 69 72 65 20 65 76 65 6e 74 20 /* Fire event
2f80: 69 66 20 74 68 65 72 65 20 69 73 20 70 65 6e 64 if there is pend
2f90: 69 6e 67 20 64 61 74 61 2c 20 73 6b 69 70 20 6f ing data, skip o
2fa0: 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 20 20 therwise */.
2fb0: 69 66 20 28 28 73 74 61 74 65 50 74 72 2d 3e 77 if ((statePtr->w
2fc0: 61 74 63 68 4d 61 73 6b 20 26 20 54 43 4c 5f 52 atchMask & TCL_R
2fd0: 45 41 44 41 42 4c 45 29 20 26 26 20 28 54 63 6c EADABLE) && (Tcl
2fe0: 5f 49 6e 70 75 74 42 75 66 66 65 72 65 64 28 73 _InputBuffered(s
2ff0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 20 3e tatePtr->self) >
3000: 20 30 29 29 20 7b 0a 09 54 63 6c 5f 4e 6f 74 69 0)) {..Tcl_Noti
3010: 66 79 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 fyChannel(stateP
3020: 74 72 2d 3e 73 65 6c 66 2c 20 54 43 4c 5f 52 45 tr->self, TCL_RE
3030: 41 44 41 42 4c 45 29 3b 0a 20 20 20 20 7d 0a 7d ADABLE);. }.}
3040: 0a 0a 2f 2a 0a 20 2a 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 2d 0a 20 2a -------------. *
3090: 0a 20 2a 20 44 69 67 65 73 74 57 61 74 63 68 50 . * DigestWatchP
30a0: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 49 6e 69 roc --. *. *.Ini
30b0: 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 6f 74 69 tialize the noti
30c0: 66 69 65 72 20 74 6f 20 77 61 74 63 68 20 66 6f fier to watch fo
30d0: 72 20 65 76 65 6e 74 73 20 66 72 6f 6d 20 74 68 r events from th
30e0: 69 73 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 is channel.. *.
30f0: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 4e 6f * Returns:. *.No
3100: 74 68 69 6e 67 0a 20 2a 0a 20 2a 20 53 69 64 65 thing. *. * Side
3110: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 6f 6e effects:. *.Con
3120: 66 69 67 75 72 65 20 6e 6f 74 69 66 69 65 72 20 figure notifier
3130: 73 6f 20 66 75 74 75 72 65 20 65 76 65 6e 74 73 so future events
3140: 20 6f 6e 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 on the channel
3150: 77 69 6c 6c 20 62 65 20 73 65 65 6e 20 62 79 20 will be seen by
3160: 54 63 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d Tcl.. *. *------
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 2d ----------------
31b0: 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52 45 41 . */.#define REA
31c0: 44 5f 44 45 4c 41 59 09 35 0a 76 6f 69 64 20 44 D_DELAY.5.void D
31d0: 69 67 65 73 74 57 61 74 63 68 50 72 6f 63 28 43 igestWatchProc(C
31e0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
31f0: 44 61 74 61 2c 20 69 6e 74 20 6d 61 73 6b 29 20 Data, int mask)
3200: 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74 {. DigestStat
3210: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44 e *statePtr = (D
3220: 69 67 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c igestState *) cl
3230: 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 54 63 ientData;. Tc
3240: 6c 5f 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 l_Channel parent
3250: 3b 0a 20 20 20 20 54 63 6c 5f 44 72 69 76 65 72 ;. Tcl_Driver
3260: 57 61 74 63 68 50 72 6f 63 20 2a 77 61 74 63 68 WatchProc *watch
3270: 50 72 6f 63 3b 0a 0a 20 20 20 20 69 66 20 28 73 Proc;.. if (s
3280: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d tatePtr->self ==
3290: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e (Tcl_Channel) N
32a0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 3b 0a ULL) {..return;.
32b0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 74 }.. /* St
32c0: 6f 72 65 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e ore OR-ed combin
32d0: 61 74 69 6f 6e 20 6f 66 20 54 43 4c 5f 52 45 41 ation of TCL_REA
32e0: 44 41 42 4c 45 2c 20 54 43 4c 5f 57 52 49 54 41 DABLE, TCL_WRITA
32f0: 42 4c 45 20 61 6e 64 20 54 43 4c 5f 45 58 43 45 BLE and TCL_EXCE
3300: 50 54 49 4f 4e 20 2a 2f 0a 20 20 20 20 73 74 61 PTION */. sta
3310: 74 65 50 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b tePtr->watchMask
3320: 20 3d 20 6d 61 73 6b 3b 0a 0a 20 20 20 20 2f 2a = mask;.. /*
3330: 20 50 72 6f 70 61 67 61 74 65 20 6d 61 73 6b 20 Propagate mask
3340: 69 6e 66 6f 20 74 6f 20 70 61 72 65 6e 74 20 63 info to parent c
3350: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 70 61 hannel */. pa
3360: 72 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 rent = Tcl_GetSt
3370: 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 61 ackedChannel(sta
3380: 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 tePtr->self);.
3390: 20 20 77 61 74 63 68 50 72 6f 63 20 3d 20 54 63 watchProc = Tc
33a0: 6c 5f 43 68 61 6e 6e 65 6c 57 61 74 63 68 50 72 l_ChannelWatchPr
33b0: 6f 63 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 oc(Tcl_GetChanne
33c0: 6c 54 79 70 65 28 70 61 72 65 6e 74 29 29 3b 0a lType(parent));.
33d0: 20 20 20 20 77 61 74 63 68 50 72 6f 63 28 54 63 watchProc(Tc
33e0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 l_GetChannelInst
33f0: 61 6e 63 65 44 61 74 61 28 70 61 72 65 6e 74 29 anceData(parent)
3400: 2c 20 6d 61 73 6b 29 3b 0a 0a 20 20 20 20 2f 2a , mask);.. /*
3410: 20 52 65 6d 6f 76 65 20 70 65 6e 64 69 6e 67 20 Remove pending
3420: 74 69 6d 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 timer */. if
3430: 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 (statePtr->timer
3440: 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f != (Tcl_TimerTo
3450: 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 ken) NULL) {..Tc
3460: 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e l_DeleteTimerHan
3470: 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 dler(statePtr->t
3480: 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72 imer);..statePtr
3490: 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 ->timer = (Tcl_T
34a0: 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b imerToken) NULL;
34b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 . }.. /* I
34c0: 66 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20 f there is data
34d0: 70 65 6e 64 69 6e 67 2c 20 73 65 74 20 6e 65 77 pending, set new
34e0: 20 74 69 6d 65 72 20 74 6f 20 63 61 6c 6c 20 54 timer to call T
34f0: 63 6c 5f 4e 6f 74 69 66 79 43 68 61 6e 6e 65 6c cl_NotifyChannel
3500: 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 6d 61 73 */. if ((mas
3510: 6b 20 26 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 k & TCL_READABLE
3520: 29 20 26 26 20 28 54 63 6c 5f 49 6e 70 75 74 42 ) && (Tcl_InputB
3530: 75 66 66 65 72 65 64 28 73 74 61 74 65 50 74 72 uffered(statePtr
3540: 2d 3e 73 65 6c 66 29 20 3e 20 30 29 29 20 7b 0a ->self) > 0)) {.
3550: 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 .statePtr->timer
3560: 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 54 69 6d = Tcl_CreateTim
3570: 65 72 48 61 6e 64 6c 65 72 28 52 45 41 44 5f 44 erHandler(READ_D
3580: 45 4c 41 59 2c 20 44 69 67 65 73 74 54 69 6d 65 ELAY, DigestTime
3590: 72 48 61 6e 64 6c 65 72 2c 20 28 43 6c 69 65 6e rHandler, (Clien
35a0: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 tData) statePtr)
35b0: 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a ;. }.}../*. *
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 2d 0a 20 2a 0a 20 2a 20 44 69 67 ------. *. * Dig
3610: 65 73 74 47 65 74 48 61 6e 64 6c 65 50 72 6f 63 estGetHandleProc
3620: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 --. *. *.Called
3630: 20 66 72 6f 6d 20 54 63 6c 5f 47 65 74 43 68 61 from Tcl_GetCha
3640: 6e 6e 65 6c 48 61 6e 64 6c 65 20 74 6f 20 72 65 nnelHandle to re
3650: 74 72 69 65 76 65 20 4f 53 20 73 70 65 63 69 66 trieve OS specif
3660: 69 63 20 66 69 6c 65 20 68 61 6e 64 6c 65 0a 20 ic file handle.
3670: 2a 09 66 72 6f 6d 20 69 6e 73 69 64 65 20 74 68 *.from inside th
3680: 69 73 20 63 68 61 6e 6e 65 6c 2e 20 4e 6f 74 20 is channel. Not
3690: 75 73 65 64 20 66 6f 72 20 74 72 61 6e 73 66 6f used for transfo
36a0: 72 6d 61 74 69 6f 6e 73 3f 0a 20 2a 0a 20 2a 20 rmations?. *. *
36b0: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 49 66 20 64 Returns:. *.If d
36c0: 69 72 65 63 74 69 6f 6e 20 69 73 20 54 43 4c 5f irection is TCL_
36d0: 52 45 41 44 41 42 4c 45 20 72 65 74 75 72 6e 20 READABLE return
36e0: 74 68 65 20 68 61 6e 64 6c 65 20 75 73 65 64 20 the handle used
36f0: 66 6f 72 20 69 6e 70 75 74 2c 20 6f 72 20 69 66 for input, or if
3700: 0a 20 2a 09 54 43 4c 5f 57 52 49 54 41 42 4c 45 . *.TCL_WRITABLE
3710: 20 72 65 74 75 72 6e 20 74 68 65 20 68 61 6e 64 return the hand
3720: 6c 65 20 75 73 65 64 20 66 6f 72 20 6f 75 74 70 le used for outp
3730: 75 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ut.. *. * Side e
3740: 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a ffects:. *.None.
3750: 20 2a 0a 20 2a 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 2d 0a 20 2a 2f 0a -----------. */.
37a0: 69 6e 74 20 44 69 67 65 73 74 47 65 74 48 61 6e int DigestGetHan
37b0: 64 6c 65 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 dleProc(ClientDa
37c0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 69 ta clientData, i
37d0: 6e 74 20 64 69 72 65 63 74 69 6f 6e 2c 20 43 6c nt direction, Cl
37e0: 69 65 6e 74 44 61 74 61 20 2a 68 61 6e 64 6c 65 ientData *handle
37f0: 50 74 72 29 20 7b 0a 20 20 20 20 44 69 67 65 73 Ptr) {. Diges
3800: 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 tState *statePtr
3810: 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20 = (DigestState
3820: 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a *) clientData;..
3830: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
3840: 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 ->self == (Tcl_C
3850: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a hannel) NULL) {.
3860: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
3870: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 R;. }. ret
3880: 75 72 6e 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e urn Tcl_GetChann
3890: 65 6c 48 61 6e 64 6c 65 28 54 63 6c 5f 47 65 74 elHandle(Tcl_Get
38a0: 53 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73 StackedChannel(s
38b0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 tatePtr->self),
38c0: 64 69 72 65 63 74 69 6f 6e 2c 20 68 61 6e 64 6c direction, handl
38d0: 65 50 74 72 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d ePtr);.}../*. *-
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 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 -----. *. * Dige
3930: 73 74 4e 6f 74 69 66 79 50 72 6f 63 20 2d 2d 0a stNotifyProc --.
3940: 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79 20 *. *.Called by
3950: 54 63 6c 20 74 6f 20 69 6e 66 6f 72 6d 20 75 73 Tcl to inform us
3960: 20 6f 66 20 61 63 74 69 76 69 74 79 20 6f 6e 20 of activity on
3970: 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 the underlying c
3980: 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 hannel.. *. * Re
3990: 74 75 72 6e 73 3a 0a 20 2a 09 55 6e 63 68 61 6e turns:. *.Unchan
39a0: 67 65 64 20 69 6e 74 65 72 65 73 74 4d 61 73 6b ged interestMask
39b0: 20 77 68 69 63 68 20 69 73 20 61 6e 20 4f 52 2d which is an OR-
39c0: 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f ed combination o
39d0: 66 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 6f f TCL_READABLE o
39e0: 72 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 0a 20 r TCL_WRITABLE.
39f0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
3a00: 73 3a 0a 20 2a 09 43 61 6e 63 65 6c 73 20 61 6e s:. *.Cancels an
3a10: 79 20 70 65 6e 64 69 6e 67 20 74 69 6d 65 72 2e y pending timer.
3a20: 0a 20 2a 0a 20 2a 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 2d 0a 20 2a 2f ------------. */
3a70: 0a 69 6e 74 20 44 69 67 65 73 74 4e 6f 74 69 66 .int DigestNotif
3a80: 79 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 yProc(ClientData
3a90: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e 74 clientData, int
3aa0: 20 69 6e 74 65 72 65 73 74 4d 61 73 6b 29 20 7b interestMask) {
3ab0: 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65 . DigestState
3ac0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 *statePtr = (Di
3ad0: 67 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 gestState *) cli
3ae0: 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 2f 2a entData;.. /*
3af0: 20 53 6b 69 70 20 74 69 6d 65 72 20 65 76 65 6e Skip timer even
3b00: 74 20 61 73 20 72 65 64 75 6e 64 61 6e 74 20 2a t as redundant *
3b10: 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 /. if (stateP
3b20: 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 tr->timer != (Tc
3b30: 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 l_TimerToken) NU
3b40: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 LL) {..Tcl_Delet
3b50: 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 eTimerHandler(st
3b60: 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a atePtr->timer);.
3b70: 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 .statePtr->timer
3b80: 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b = (Tcl_TimerTok
3b90: 65 6e 29 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a en) NULL;. }.
3ba0: 20 20 20 20 72 65 74 75 72 6e 20 69 6e 74 65 72 return inter
3bb0: 65 73 74 4d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 20 estMask;.}../*.
3bc0: 2a 0a 20 2a 20 43 68 61 6e 6e 65 6c 20 74 79 70 *. * Channel typ
3bd0: 65 20 73 74 72 75 63 74 75 72 65 20 64 65 66 69 e structure defi
3be0: 6e 69 74 69 6f 6e 20 66 6f 72 20 64 69 67 65 73 nition for diges
3bf0: 74 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e t transformation
3c00: 73 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 s.. *. */.static
3c10: 20 63 6f 6e 73 74 20 54 63 6c 5f 43 68 61 6e 6e const Tcl_Chann
3c20: 65 6c 54 79 70 65 20 64 69 67 65 73 74 43 68 61 elType digestCha
3c30: 6e 6e 65 6c 54 79 70 65 20 3d 20 7b 0a 20 20 20 nnelType = {.
3c40: 20 22 64 69 67 65 73 74 22 2c 09 09 09 2f 2a 20 "digest",.../*
3c50: 54 79 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 Type name */.
3c60: 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 TCL_CHANNEL_VER
3c70: 53 49 4f 4e 5f 35 2c 09 2f 2a 20 76 35 20 63 68 SION_5,./* v5 ch
3c80: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 44 69 67 annel */. Dig
3c90: 65 73 74 43 6c 6f 73 65 50 72 6f 63 2c 09 09 2f estCloseProc,../
3ca0: 2a 20 43 6c 6f 73 65 20 70 72 6f 63 20 2a 2f 0a * Close proc */.
3cb0: 20 20 20 20 44 69 67 65 73 74 49 6e 70 75 74 50 DigestInputP
3cc0: 72 6f 63 2c 09 09 2f 2a 20 49 6e 70 75 74 20 70 roc,../* Input p
3cd0: 72 6f 63 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 roc */. Diges
3ce0: 74 4f 75 74 70 75 74 50 72 6f 63 2c 09 09 2f 2a tOutputProc,../*
3cf0: 20 4f 75 74 70 75 74 20 70 72 6f 63 20 2a 2f 0a Output proc */.
3d00: 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 53 NULL,.../* S
3d10: 65 65 6b 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 eek proc */.
3d20: 44 69 67 65 73 74 53 65 74 4f 70 74 69 6f 6e 50 DigestSetOptionP
3d30: 72 6f 63 2c 09 2f 2a 20 53 65 74 20 6f 70 74 69 roc,./* Set opti
3d40: 6f 6e 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 44 on proc */. D
3d50: 69 67 65 73 74 47 65 74 4f 70 74 69 6f 6e 50 72 igestGetOptionPr
3d60: 6f 63 2c 09 2f 2a 20 47 65 74 20 6f 70 74 69 6f oc,./* Get optio
3d70: 6e 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 44 69 n proc */. Di
3d80: 67 65 73 74 57 61 74 63 68 50 72 6f 63 2c 09 09 gestWatchProc,..
3d90: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6e 6f /* Initialize no
3da0: 74 69 66 69 65 72 20 2a 2f 0a 20 20 20 20 44 69 tifier */. Di
3db0: 67 65 73 74 47 65 74 48 61 6e 64 6c 65 50 72 6f gestGetHandlePro
3dc0: 63 2c 09 2f 2a 20 47 65 74 20 4f 53 20 68 61 6e c,./* Get OS han
3dd0: 64 6c 65 73 20 6f 75 74 20 6f 66 20 63 68 61 6e dles out of chan
3de0: 6e 65 6c 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 nel */. Diges
3df0: 74 43 6c 6f 73 65 32 50 72 6f 63 2c 09 09 2f 2a tClose2Proc,../*
3e00: 20 63 6c 6f 73 65 32 70 72 6f 63 20 2a 2f 0a 20 close2proc */.
3e10: 20 20 20 44 69 67 65 73 74 42 6c 6f 63 6b 4d 6f DigestBlockMo
3e20: 64 65 50 72 6f 63 2c 09 2f 2a 20 53 65 74 20 62 deProc,./* Set b
3e30: 6c 6f 63 6b 69 6e 67 2f 6e 6f 6e 62 6c 6f 63 6b locking/nonblock
3e40: 69 6e 67 20 6d 6f 64 65 2a 2f 0a 20 20 20 20 4e ing mode*/. N
3e50: 55 4c 4c 2c 09 09 09 2f 2a 20 46 6c 75 73 68 20 ULL,.../* Flush
3e60: 70 72 6f 63 20 2a 2f 0a 20 20 20 20 44 69 67 65 proc */. Dige
3e70: 73 74 4e 6f 74 69 66 79 50 72 6f 63 2c 09 09 2f stNotifyProc,../
3e80: 2a 20 48 61 6e 64 6c 69 6e 67 20 6f 66 20 65 76 * Handling of ev
3e90: 65 6e 74 73 20 62 75 62 62 6c 69 6e 67 20 75 70 ents bubbling up
3ea0: 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 09 */. NULL,...
3eb0: 2f 2a 20 57 69 64 65 20 73 65 65 6b 20 70 72 6f /* Wide seek pro
3ec0: 63 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 c */. NULL,..
3ed0: 09 2f 2a 20 54 68 72 65 61 64 20 61 63 74 69 6f ./* Thread actio
3ee0: 6e 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 09 09 09 n */. NULL...
3ef0: 2f 2a 20 54 72 75 6e 63 61 74 65 20 2a 2f 0a 7d /* Truncate */.}
3f00: 3b 0a 0a 2f 2a 0a 20 2a 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 2d 0a 20 --------------.
3f50: 2a 0a 20 2a 20 44 69 67 65 73 74 43 68 61 6e 6e *. * DigestChann
3f60: 65 6c 20 2d 2d 0a 20 2a 0a 20 2a 09 43 72 65 61 el --. *. *.Crea
3f70: 74 65 20 61 20 73 74 61 63 6b 65 64 20 63 68 61 te a stacked cha
3f80: 6e 6e 65 6c 20 66 6f 72 20 61 20 6d 65 73 73 61 nnel for a messa
3f90: 67 65 20 64 69 67 65 73 74 20 74 72 61 6e 73 66 ge digest transf
3fa0: 6f 72 6d 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 ormation.. *. *
3fb0: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f Returns:. *.TCL_
3fc0: 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a OK or TCL_ERROR.
3fd0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
3fe0: 74 73 3a 0a 20 2a 09 41 64 64 73 20 74 72 61 6e ts:. *.Adds tran
3ff0: 73 66 6f 72 6d 20 74 6f 20 63 68 61 6e 6e 65 6c sform to channel
4000: 20 61 6e 64 20 73 65 74 73 20 72 65 73 75 6c 74 and sets result
4010: 20 74 6f 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 to channel name
4020: 20 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 or error messag
4030: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
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 2d 0a 20 --------------.
4080: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 44 69 */.static int.Di
4090: 67 65 73 74 43 68 61 6e 6e 65 6c 28 54 63 6c 5f gestChannel(Tcl_
40a0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
40b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 68 61 6e const char *chan
40c0: 6e 65 6c 2c 20 63 6f 6e 73 74 20 45 56 50 5f 4d nel, const EVP_M
40d0: 44 20 2a 6d 64 2c 20 69 6e 74 20 66 6f 72 6d 61 D *md, int forma
40e0: 74 29 20 7b 0a 20 20 20 20 69 6e 74 20 6d 6f 64 t) {. int mod
40f0: 65 3b 20 2f 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 e; /* OR-ed comb
4100: 69 6e 61 74 69 6f 6e 20 6f 66 20 54 43 4c 5f 52 ination of TCL_R
4110: 45 41 44 41 42 4c 45 20 61 6e 64 20 54 43 4c 5f EADABLE and TCL_
4120: 57 52 49 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 WRITABLE */.
4130: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e Tcl_Channel chan
4140: 3b 0a 20 20 20 20 45 56 50 5f 4d 44 5f 43 54 58 ;. EVP_MD_CTX
4150: 20 2a 63 74 78 3b 0a 20 20 20 20 44 69 67 65 73 *ctx;. Diges
4160: 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 tState *statePtr
4170: 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 ;.. /* Valida
4180: 74 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 69 te args */. i
4190: 66 20 28 63 68 61 6e 6e 65 6c 20 3d 3d 20 28 63 f (channel == (c
41a0: 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 4e 55 4c onst char *) NUL
41b0: 4c 20 7c 7c 20 6d 64 20 3d 3d 20 28 63 6f 6e 73 L || md == (cons
41c0: 74 20 45 56 50 5f 4d 44 20 2a 29 20 4e 55 4c 4c t EVP_MD *) NULL
41d0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
41e0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
41f0: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
4200: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 Channel(interp,
4210: 63 68 61 6e 6e 65 6c 2c 20 26 6d 6f 64 65 29 3b channel, &mode);
4220: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d . if (chan ==
4230: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e (Tcl_Channel) N
4240: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 ULL) {..return T
4250: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
4260: 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 . /* Make sur
4270: 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 e to operate on
4280: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e the topmost chan
4290: 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 nel */. chan
42a0: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e = Tcl_GetTopChan
42b0: 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 nel(chan);..
42c0: 2f 2a 20 43 72 65 61 74 65 20 69 6e 74 65 72 6e /* Create intern
42d0: 61 6c 20 73 74 6f 72 61 67 65 20 73 74 72 75 63 al storage struc
42e0: 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 63 74 78 tures */. ctx
42f0: 20 3d 20 45 56 50 5f 4d 44 5f 43 54 58 5f 6e 65 = EVP_MD_CTX_ne
4300: 77 28 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 w();. statePt
4310: 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 r = (DigestState
4320: 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 *) ckalloc((uns
4330: 69 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 44 69 igned) sizeof(Di
4340: 67 65 73 74 53 74 61 74 65 29 29 3b 0a 20 20 20 gestState));.
4350: 20 69 66 20 28 63 74 78 20 21 3d 20 4e 55 4c 4c if (ctx != NULL
4360: 20 26 26 20 73 74 61 74 65 50 74 72 20 21 3d 20 && statePtr !=
4370: 4e 55 4c 4c 29 20 7b 0a 09 6d 65 6d 73 65 74 28 NULL) {..memset(
4380: 73 74 61 74 65 50 74 72 2c 20 30 2c 20 73 69 7a statePtr, 0, siz
4390: 65 6f 66 28 44 69 67 65 73 74 53 74 61 74 65 29 eof(DigestState)
43a0: 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 73 65 );..statePtr->se
43b0: 6c 66 09 3d 20 63 68 61 6e 3b 09 09 2f 2a 20 54 lf.= chan;../* T
43c0: 68 69 73 20 73 6f 63 6b 65 74 20 63 68 61 6e 6e his socket chann
43d0: 65 6c 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d el */..statePtr-
43e0: 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 >timer = (Tcl_Ti
43f0: 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 09 merToken) NULL;.
4400: 2f 2a 20 54 69 6d 65 72 20 74 6f 20 66 6c 75 73 /* Timer to flus
4410: 68 20 64 61 74 61 20 2a 2f 0a 09 73 74 61 74 65 h data */..state
4420: 50 74 72 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 09 Ptr->flags = 0;.
4430: 09 2f 2a 20 43 68 61 6e 20 63 6f 6e 66 69 67 20 ./* Chan config
4440: 66 6c 61 67 73 20 2a 2f 0a 09 73 74 61 74 65 50 flags */..stateP
4450: 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b 20 3d 20 tr->watchMask =
4460: 30 3b 09 2f 2a 20 43 75 72 72 65 6e 74 20 57 61 0;./* Current Wa
4470: 74 63 68 50 72 6f 63 20 6d 61 73 6b 20 2a 2f 0a tchProc mask */.
4480: 09 73 74 61 74 65 50 74 72 2d 3e 6d 6f 64 65 09 .statePtr->mode.
4490: 3d 20 6d 6f 64 65 3b 09 09 2f 2a 20 43 75 72 72 = mode;../* Curr
44a0: 65 6e 74 20 6d 6f 64 65 20 6f 66 20 70 61 72 65 ent mode of pare
44b0: 6e 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 09 73 nt channel */..s
44c0: 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 tatePtr->format
44d0: 3d 20 66 6f 72 6d 61 74 3b 09 2f 2a 20 4f 75 74 = format;./* Out
44e0: 70 75 74 20 66 6f 72 6d 61 74 20 2a 2f 0a 09 73 put format */..s
44f0: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 20 tatePtr->interp
4500: 3d 20 69 6e 74 65 72 70 3b 09 2f 2a 20 43 75 72 = interp;./* Cur
4510: 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72 rent interpreter
4520: 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 */..statePtr->c
4530: 74 78 20 3d 20 63 74 78 3b 09 09 2f 2a 20 53 53 tx = ctx;../* SS
4540: 4c 20 43 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 20 L Context */.
4550: 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 41 } else {..Tcl_A
4560: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
4570: 72 70 2c 20 22 49 6e 69 74 69 61 6c 69 7a 65 20 rp, "Initialize
4580: 64 69 67 65 73 74 20 65 72 72 6f 72 3a 20 6d 65 digest error: me
4590: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 mory allocation
45a0: 66 61 69 6c 75 72 65 22 2c 20 28 63 68 61 72 20 failure", (char
45b0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 45 56 50 5f 4d *) NULL);..EVP_M
45c0: 44 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b D_CTX_free(ctx);
45d0: 0a 09 44 69 67 65 73 74 46 72 65 65 28 73 74 61 ..DigestFree(sta
45e0: 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 tePtr);..return
45f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
4600: 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c .. /* Initial
4610: 69 7a 65 20 64 69 67 65 73 74 20 2a 2f 0a 23 69 ize digest */.#i
4620: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
4630: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 N_NUMBER < 0x300
4640: 30 30 30 30 30 4c 0a 20 20 20 20 69 66 20 28 21 00000L. if (!
4650: 45 56 50 5f 44 69 67 65 73 74 49 6e 69 74 5f 65 EVP_DigestInit_e
4660: 78 28 63 74 78 2c 20 6d 64 2c 20 4e 55 4c 4c 29 x(ctx, md, NULL)
4670: 29 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 20 28 ).#else. if (
4680: 21 45 56 50 5f 44 69 67 65 73 74 49 6e 69 74 5f !EVP_DigestInit_
4690: 65 78 32 28 63 74 78 2c 20 6d 64 2c 20 4e 55 4c ex2(ctx, md, NUL
46a0: 4c 29 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b L)).#endif. {
46b0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
46c0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 49 6e 69 74 lt(interp, "Init
46d0: 69 61 6c 69 7a 65 20 64 69 67 65 73 74 20 65 72 ialize digest er
46e0: 72 6f 72 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 ror: ", REASON()
46f0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
4700: 3b 0a 09 45 56 50 5f 4d 44 5f 43 54 58 5f 66 72 ;..EVP_MD_CTX_fr
4710: 65 65 28 63 74 78 29 3b 0a 09 44 69 67 65 73 74 ee(ctx);..Digest
4720: 46 72 65 65 28 73 74 61 74 65 50 74 72 29 3b 0a Free(statePtr);.
4730: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
4740: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
4750: 20 43 6f 6e 66 69 67 75 72 65 20 63 68 61 6e 6e Configure chann
4760: 65 6c 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 65 el */. Tcl_Se
4770: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
4780: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 nterp, chan, "-t
4790: 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 ranslation", "bi
47a0: 6e 61 72 79 22 29 3b 0a 20 20 20 20 69 66 20 28 nary");. if (
47b0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 42 75 Tcl_GetChannelBu
47c0: 66 66 65 72 53 69 7a 65 28 63 68 61 6e 29 20 3c fferSize(chan) <
47d0: 20 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45 EVP_MAX_MD_SIZE
47e0: 20 2a 20 32 29 20 7b 0a 09 54 63 6c 5f 53 65 74 * 2) {..Tcl_Set
47f0: 43 68 61 6e 6e 65 6c 42 75 66 66 65 72 53 69 7a ChannelBufferSiz
4800: 65 28 63 68 61 6e 2c 20 45 56 50 5f 4d 41 58 5f e(chan, EVP_MAX_
4810: 4d 44 5f 53 49 5a 45 20 2a 20 32 29 3b 0a 20 20 MD_SIZE * 2);.
4820: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 74 61 63 }.. /* Stac
4830: 6b 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 k channel */.
4840: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 statePtr->self
4850: 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e 6e = Tcl_StackChann
4860: 65 6c 28 69 6e 74 65 72 70 2c 20 26 64 69 67 65 el(interp, &dige
4870: 73 74 43 68 61 6e 6e 65 6c 54 79 70 65 2c 20 28 stChannelType, (
4880: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
4890: 65 50 74 72 2c 20 6d 6f 64 65 2c 20 63 68 61 6e ePtr, mode, chan
48a0: 29 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 );. if (state
48b0: 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 Ptr->self == (Tc
48c0: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 l_Channel) NULL)
48d0: 20 7b 0a 09 45 56 50 5f 4d 44 5f 43 54 58 5f 66 {..EVP_MD_CTX_f
48e0: 72 65 65 28 63 74 78 29 3b 0a 09 44 69 67 65 73 ree(ctx);..Diges
48f0: 74 46 72 65 65 28 73 74 61 74 65 50 74 72 29 3b tFree(statePtr);
4900: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
4910: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 OR;. }.. T
4920: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 cl_SetResult(int
4930: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 20 54 63 erp, (char *) Tc
4940: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
4950: 28 63 68 61 6e 29 2c 20 54 43 4c 5f 56 4f 4c 41 (chan), TCL_VOLA
4960: 54 49 4c 45 29 3b 0a 20 20 20 20 72 65 74 75 72 TILE);. retur
4970: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a n TCL_OK;.}../*.
4980: 20 2a 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 2d 0a 20 2a 0a 20 2a 20 55 --------. *. * U
49d0: 6e 73 74 61 63 6b 20 43 68 61 6e 6e 65 6c 20 2d nstack Channel -
49e0: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f -. *. *.This pro
49f0: 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 cedure is invoke
4a00: 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 d to process the
4a10: 20 22 75 6e 73 74 61 63 6b 22 20 54 43 4c 20 63 "unstack" TCL c
4a20: 6f 6d 6d 61 6e 64 2e 0a 20 2a 09 53 65 65 20 74 ommand.. *.See t
4a30: 68 65 20 75 73 65 72 20 64 6f 63 75 6d 65 6e 74 he user document
4a40: 61 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c ation for detail
4a50: 73 20 6f 6e 20 77 68 61 74 20 69 74 20 64 6f 65 s on what it doe
4a60: 73 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 s.. *. * Returns
4a70: 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 :. *.TCL_OK or T
4a80: 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 CL_ERROR. *. * S
4a90: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
4aa0: 52 65 6d 6f 76 65 73 20 74 72 61 6e 73 66 6f 72 Removes transfor
4ab0: 6d 20 66 72 6f 6d 20 63 68 61 6e 6e 65 6c 20 6f m from channel o
4ac0: 72 20 73 65 74 73 20 72 65 73 75 6c 74 20 74 6f r sets result to
4ad0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a error message..
4ae0: 20 2a 0a 20 2a 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 2d 0a 20 2a 2f 0a -----------. */.
4b30: 73 74 61 74 69 63 20 69 6e 74 0a 55 6e 73 74 61 static int.Unsta
4b40: 63 6b 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 ckObjCmd(ClientD
4b50: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
4b60: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
4b70: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 rp, int objc, Tc
4b80: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
4b90: 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 v[]) {. Tcl_C
4ba0: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 hannel chan;.
4bb0: 20 69 6e 74 20 6d 6f 64 65 3b 20 2f 2a 20 4f 52 int mode; /* OR
4bc0: 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 -ed combination
4bd0: 6f 66 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 of TCL_READABLE
4be0: 61 6e 64 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 and TCL_WRITABLE
4bf0: 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 6f 62 */.. if (ob
4c00: 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f jc != 2) {..Tcl_
4c10: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
4c20: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 erp, 1, objv, "c
4c30: 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 hannel");..retur
4c40: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
4c50: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 }.. /* Get c
4c60: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 hannel */. ch
4c70: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e an = Tcl_GetChan
4c80: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f nel(interp, Tcl_
4c90: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
4ca0: 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c (objv[1], NULL),
4cb0: 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 &mode);. if
4cc0: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 (chan == (Tcl_Ch
4cd0: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 annel) NULL) {..
4ce0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
4cf0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
4d00: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 Make sure to ope
4d10: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d rate on the topm
4d20: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 ost channel */.
4d30: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 chan = Tcl_Ge
4d40: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e tTopChannel(chan
4d50: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b );.. /* Check
4d60: 20 69 66 20 64 69 67 65 73 74 20 63 68 61 6e 6e if digest chann
4d70: 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 el */. if (Tc
4d80: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 l_GetChannelType
4d90: 28 63 68 61 6e 29 20 21 3d 20 26 64 69 67 65 73 (chan) != &diges
4da0: 74 43 68 61 6e 6e 65 6c 54 79 70 65 29 20 7b 0a tChannelType) {.
4db0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
4dc0: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 t(interp, "bad c
4dd0: 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f hannel \"", Tcl_
4de0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 GetChannelName(c
4df0: 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 han),.. "\":
4e00: 6e 6f 74 20 61 20 64 69 67 65 73 74 20 63 68 61 not a digest cha
4e10: 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 nnel", NULL);..T
4e20: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
4e30: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 interp, "TLS", "
4e40: 55 4e 53 54 41 43 4b 22 2c 20 22 43 48 41 4e 4e UNSTACK", "CHANN
4e50: 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 EL", "INVALID",
4e60: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
4e70: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
4e80: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
4e90: 20 50 6f 70 20 74 72 61 6e 73 66 6f 72 6d 20 66 Pop transform f
4ea0: 72 6f 6d 20 63 68 61 6e 6e 65 6c 2c 20 6c 65 61 rom channel, lea
4eb0: 76 65 73 20 65 72 72 6f 72 20 69 6e 66 6f 20 69 ves error info i
4ec0: 6e 20 69 6e 74 65 72 70 20 72 65 73 75 6c 74 20 n interp result
4ed0: 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 55 */. if (Tcl_U
4ee0: 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e nstackChannel(in
4ef0: 74 65 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54 terp, chan) == T
4f00: 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 72 65 74 CL_ERROR) {..ret
4f10: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
4f20: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 }. return
4f30: 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 09 63 6c 69 TCL_OK;. .cli
4f40: 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 entData = client
4f50: 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a Data;.}../******
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 2a 2f 0a 0a *************/..
4fa0: 2f 2a 0a 20 2a 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 2d 0a 20 2a 0a 20 2a 20 44 --------. *. * D
4ff0: 69 67 65 73 74 48 61 73 68 46 75 6e 63 74 69 6f igestHashFunctio
5000: 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 20 43 61 6c 63 n --. *. *. Calc
5010: 75 6c 61 74 65 20 6d 65 73 73 61 67 65 20 64 69 ulate message di
5020: 67 65 73 74 20 75 73 69 6e 67 20 68 61 73 68 20 gest using hash
5030: 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 function.. *. *
5040: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f Returns:. *.TCL_
5050: 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a OK or TCL_ERROR.
5060: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
5070: 74 73 3a 0a 20 2a 09 53 65 74 73 20 72 65 73 75 ts:. *.Sets resu
5080: 6c 74 20 74 6f 20 6d 65 73 73 61 67 65 20 64 69 lt to message di
5090: 67 65 73 74 20 6f 72 20 65 72 72 6f 72 20 6d 65 gest or error me
50a0: 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d ssage. *. *-----
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 2d 0a 20 --------------.
50f0: 2a 2f 0a 69 6e 74 0a 44 69 67 65 73 74 48 61 73 */.int.DigestHas
5100: 68 46 75 6e 63 74 69 6f 6e 28 54 63 6c 5f 49 6e hFunction(Tcl_In
5110: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e terp *interp, in
5120: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 t objc, Tcl_Obj
5130: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 2c 0a 09 *const objv[],..
5140: 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 const EVP_MD *md
5150: 2c 20 69 6e 74 20 66 6f 72 6d 61 74 2c 20 54 63 , int format, Tc
5160: 6c 5f 4f 62 6a 20 2a 6b 65 79 4f 62 6a 29 20 7b l_Obj *keyObj) {
5170: 0a 20 20 20 20 63 68 61 72 20 2a 64 61 74 61 3b . char *data;
5180: 0a 20 20 20 20 69 6e 74 20 6c 65 6e 2c 20 72 65 . int len, re
5190: 73 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 s;. unsigned
51a0: 69 6e 74 20 6d 64 5f 6c 65 6e 3b 0a 20 20 20 20 int md_len;.
51b0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d 64 unsigned char md
51c0: 5f 62 75 66 5b 45 56 50 5f 4d 41 58 5f 4d 44 5f _buf[EVP_MAX_MD_
51d0: 53 49 5a 45 5d 3b 0a 0a 20 20 20 20 69 66 20 28 SIZE];.. if (
51e0: 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 objc != 2) {..Tc
51f0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
5200: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
5210: 22 64 61 74 61 22 29 3b 0a 09 72 65 74 75 72 6e "data");..return
5220: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
5230: 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 64 61 }.. /* Get da
5240: 74 61 20 2a 2f 0a 20 20 20 20 64 61 74 61 20 3d ta */. data =
5250: 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 Tcl_GetByteArra
5260: 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d yFromObj(objv[1]
5270: 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 69 66 20 , &len);. if
5280: 28 64 61 74 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c (data == NULL ||
5290: 20 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 54 63 len == 0) {..Tc
52a0: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 l_SetResult(inte
52b0: 72 70 2c 20 22 4e 6f 20 64 61 74 61 22 2c 20 4e rp, "No data", N
52c0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 ULL);..return TC
52d0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
52e0: 20 20 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 /* Calculate
52f0: 20 64 69 67 65 73 74 20 62 61 73 65 64 20 6f 6e digest based on
5300: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a hash function *
5310: 2f 0a 20 20 20 20 69 66 20 28 6b 65 79 4f 62 6a /. if (keyObj
5320: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 == NULL) {..res
5330: 20 3d 20 45 56 50 5f 44 69 67 65 73 74 28 64 61 = EVP_Digest(da
5340: 74 61 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e ta, (size_t) len
5350: 2c 20 6d 64 5f 62 75 66 2c 20 26 6d 64 5f 6c 65 , md_buf, &md_le
5360: 6e 2c 20 6d 64 2c 20 4e 55 4c 4c 29 3b 0a 20 20 n, md, NULL);.
5370: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 75 6e 73 69 } else {..unsi
5380: 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 2c 20 gned char *key,
5390: 2a 68 6d 61 63 3b 0a 09 69 6e 74 20 6b 65 79 5f *hmac;..int key_
53a0: 6c 65 6e 3b 0a 0a 09 6b 65 79 20 3d 20 54 63 6c len;...key = Tcl
53b0: 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f _GetByteArrayFro
53c0: 6d 4f 62 6a 28 6b 65 79 4f 62 6a 2c 20 26 6b 65 mObj(keyObj, &ke
53d0: 79 5f 6c 65 6e 29 3b 0a 09 68 6d 61 63 20 3d 20 y_len);..hmac =
53e0: 48 4d 41 43 28 6d 64 2c 20 28 63 6f 6e 73 74 20 HMAC(md, (const
53f0: 76 6f 69 64 20 2a 29 20 6b 65 79 2c 20 6b 65 79 void *) key, key
5400: 5f 6c 65 6e 2c 20 28 63 6f 6e 73 74 20 75 6e 73 _len, (const uns
5410: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 64 61 igned char *) da
5420: 74 61 2c 0a 09 20 20 20 20 28 73 69 7a 65 5f 74 ta,.. (size_t
5430: 29 20 6c 65 6e 2c 20 6d 64 5f 62 75 66 2c 20 26 ) len, md_buf, &
5440: 6d 64 5f 6c 65 6e 29 3b 0a 09 72 65 73 20 3d 20 md_len);..res =
5450: 28 68 6d 61 63 20 21 3d 20 4e 55 4c 4c 29 3b 0a (hmac != NULL);.
5460: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 75 }.. /* Ou
5470: 74 70 75 74 20 64 69 67 65 73 74 20 74 6f 20 72 tput digest to r
5480: 65 73 75 6c 74 20 70 65 72 20 66 6f 72 6d 61 74 esult per format
5490: 20 28 62 69 6e 20 6f 72 20 68 65 78 29 20 2a 2f (bin or hex) */
54a0: 0a 20 20 20 20 69 66 20 28 72 65 73 29 20 7b 0a . if (res) {.
54b0: 09 69 66 20 28 66 6f 72 6d 61 74 20 3d 3d 20 42 .if (format == B
54c0: 49 4e 5f 46 4f 52 4d 41 54 29 20 7b 0a 09 20 20 IN_FORMAT) {..
54d0: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 Tcl_SetObjResu
54e0: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e lt(interp, Tcl_N
54f0: 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 6d ewByteArrayObj(m
5500: 64 5f 62 75 66 2c 20 6d 64 5f 6c 65 6e 29 29 3b d_buf, md_len));
5510: 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 ...} else {..
5520: 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 Tcl_Obj *result
5530: 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a Obj = Tcl_NewObj
5540: 28 29 3b 0a 09 20 20 20 20 75 6e 73 69 67 6e 65 ();.. unsigne
5550: 64 20 63 68 61 72 20 2a 70 74 72 20 3d 20 54 63 d char *ptr = Tc
5560: 6c 5f 53 65 74 42 79 74 65 41 72 72 61 79 4c 65 l_SetByteArrayLe
5570: 6e 67 74 68 28 72 65 73 75 6c 74 4f 62 6a 2c 20 ngth(resultObj,
5580: 6d 64 5f 6c 65 6e 2a 32 29 3b 0a 0a 09 20 20 20 md_len*2);...
5590: 20 66 6f 72 20 28 75 6e 73 69 67 6e 65 64 20 69 for (unsigned i
55a0: 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 6d 64 nt i = 0; i < md
55b0: 5f 6c 65 6e 3b 20 69 2b 2b 29 20 7b 0a 09 09 2a _len; i++) {...*
55c0: 70 74 72 2b 2b 20 3d 20 68 65 78 5b 28 6d 64 5f ptr++ = hex[(md_
55d0: 62 75 66 5b 69 5d 20 3e 3e 20 34 29 20 26 20 30 buf[i] >> 4) & 0
55e0: 78 30 46 5d 3b 0a 09 09 2a 70 74 72 2b 2b 20 3d x0F];...*ptr++ =
55f0: 20 68 65 78 5b 6d 64 5f 62 75 66 5b 69 5d 20 26 hex[md_buf[i] &
5600: 20 30 78 30 46 5d 3b 0a 09 20 20 20 20 7d 0a 09 0x0F];.. }..
5610: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
5620: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f (interp, resultO
5630: 62 6a 29 3b 0a 09 7d 0a 0a 20 20 20 20 7d 20 65 bj);..}.. } e
5640: 6c 73 65 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e lse {..Tcl_Appen
5650: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
5660: 22 48 61 73 68 20 63 61 6c 63 75 6c 61 74 69 6f "Hash calculatio
5670: 6e 20 65 72 72 6f 72 3a 22 2c 20 52 45 41 53 4f n error:", REASO
5680: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 N(), (char *) NU
5690: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c LL);..return TCL
56a0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
56b0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
56c0: 0a 7d 0a 0a 2f 2a 0a 20 2a 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 2d 0a 20 2a 0a ------------. *.
5710: 20 2a 20 44 69 67 65 73 74 4f 62 6a 43 6d 64 20 * DigestObjCmd
5720: 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 75 72 6e 20 --. *. *.Return
5730: 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20 75 message digest u
5740: 73 69 6e 67 20 75 73 65 72 20 73 70 65 63 69 66 sing user specif
5750: 69 65 64 20 68 61 73 68 20 66 75 6e 63 74 69 6f ied hash functio
5760: 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 n.. *. * Returns
5770: 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 :. *.TCL_OK or T
5780: 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 CL_ERROR. *. * S
5790: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
57a0: 53 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20 6d Sets result to m
57b0: 65 73 73 61 67 65 20 64 69 67 65 73 74 20 6f 72 essage digest or
57c0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 error message.
57d0: 2a 0a 20 2a 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 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
5820: 69 63 20 69 6e 74 0a 44 69 67 65 73 74 4f 62 6a ic int.DigestObj
5830: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 Cmd(ClientData c
5840: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 lientData, Tcl_I
5850: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
5860: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a nt objc, Tcl_Obj
5870: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 *const objv[])
5880: 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 2c 20 6c {. int idx, l
5890: 65 6e 2c 20 66 6f 72 6d 61 74 20 3d 20 48 45 58 en, format = HEX
58a0: 5f 46 4f 52 4d 41 54 2c 20 6b 65 79 5f 6c 65 6e _FORMAT, key_len
58b0: 20 3d 20 30 2c 20 64 61 74 61 5f 6c 65 6e 20 3d = 0, data_len =
58c0: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 0;. const ch
58d0: 61 72 20 2a 64 69 67 65 73 74 6e 61 6d 65 2c 20 ar *digestname,
58e0: 2a 63 68 61 6e 6e 65 6c 20 3d 20 4e 55 4c 4c 3b *channel = NULL;
58f0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 64 61 . Tcl_Obj *da
5900: 74 61 4f 62 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 66 taObj = NULL, *f
5910: 69 6c 65 4f 62 6a 20 3d 20 4e 55 4c 4c 2c 20 2a ileObj = NULL, *
5920: 6b 65 79 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 keyObj = NULL;.
5930: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 unsigned char
5940: 20 2a 6b 65 79 20 3d 20 4e 55 4c 4c 3b 0a 20 20 *key = NULL;.
5950: 20 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a const EVP_MD *
5960: 6d 64 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 73 md;.. Tcl_Res
5970: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 etResult(interp)
5980: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 ;.. if (objc
5990: 3c 20 33 20 7c 7c 20 6f 62 6a 63 20 3e 20 37 29 < 3 || objc > 7)
59a0: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d {..Tcl_WrongNum
59b0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 Args(interp, 1,
59c0: 6f 62 6a 76 2c 20 22 74 79 70 65 20 3f 2d 62 69 objv, "type ?-bi
59d0: 6e 7c 2d 68 65 78 3f 20 3f 2d 6b 65 79 20 68 6d n|-hex? ?-key hm
59e0: 61 63 5f 6b 65 79 3f 20 5b 2d 63 68 61 6e 6e 65 ac_key? [-channe
59f0: 6c 20 63 68 61 6e 20 7c 20 2d 66 69 6c 65 20 66 l chan | -file f
5a00: 69 6c 65 6e 61 6d 65 20 7c 20 3f 2d 64 61 74 61 ilename | ?-data
5a10: 3f 20 64 61 74 61 5d 22 29 3b 0a 09 72 65 74 75 ? data]");..retu
5a20: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
5a30: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 }.. /* Get
5a40: 64 69 67 65 73 74 20 2a 2f 0a 20 20 20 20 64 69 digest */. di
5a50: 67 65 73 74 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 gestname = Tcl_G
5a60: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
5a70: 6f 62 6a 76 5b 31 5d 2c 20 26 6c 65 6e 29 3b 0a objv[1], &len);.
5a80: 20 20 20 20 69 66 20 28 64 69 67 65 73 74 6e 61 if (digestna
5a90: 6d 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 28 6d me == NULL || (m
5aa0: 64 20 3d 20 45 56 50 5f 67 65 74 5f 64 69 67 65 d = EVP_get_dige
5ab0: 73 74 62 79 6e 61 6d 65 28 64 69 67 65 73 74 6e stbyname(digestn
5ac0: 61 6d 65 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b ame)) == NULL) {
5ad0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
5ae0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 49 6e 76 61 lt(interp, "Inva
5af0: 6c 69 64 20 64 69 67 65 73 74 20 74 79 70 65 20 lid digest type
5b00: 5c 22 22 2c 20 64 69 67 65 73 74 6e 61 6d 65 2c \"", digestname,
5b10: 20 22 5c 22 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 "\"", NULL);..r
5b20: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
5b30: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f . }.. /* O
5b40: 70 74 69 6d 61 6c 20 63 61 73 65 20 66 6f 72 20 ptimal case for
5b50: 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 2a 2f 0a blob of data */.
5b60: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 if (objc ==
5b70: 33 29 20 7b 0a 09 72 65 74 75 72 6e 20 44 69 67 3) {..return Dig
5b80: 65 73 74 48 61 73 68 46 75 6e 63 74 69 6f 6e 28 estHashFunction(
5b90: 69 6e 74 65 72 70 2c 20 2d 2d 6f 62 6a 63 2c 20 interp, --objc,
5ba0: 2b 2b 6f 62 6a 76 2c 20 6d 64 2c 20 66 6f 72 6d ++objv, md, form
5bb0: 61 74 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d at, NULL);. }
5bc0: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 6f 70 74 .. /* Get opt
5bd0: 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 66 6f 72 20 ions */. for
5be0: 28 69 64 78 20 3d 20 32 3b 20 69 64 78 20 3c 20 (idx = 2; idx <
5bf0: 6f 62 6a 63 2d 31 3b 20 69 64 78 2b 2b 29 20 7b objc-1; idx++) {
5c00: 0a 09 63 68 61 72 20 2a 6f 70 74 20 3d 20 54 63 ..char *opt = Tc
5c10: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
5c20: 62 6a 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 4e 55 bj(objv[idx], NU
5c30: 4c 4c 29 3b 0a 0a 09 69 66 20 28 6f 70 74 5b 30 LL);...if (opt[0
5c40: 5d 20 21 3d 20 27 2d 27 29 0a 09 20 20 20 20 62 ] != '-').. b
5c50: 72 65 61 6b 3b 0a 0a 09 4f 50 54 46 4c 41 47 28 reak;...OPTFLAG(
5c60: 22 2d 62 69 6e 22 2c 20 66 6f 72 6d 61 74 2c 20 "-bin", format,
5c70: 42 49 4e 5f 46 4f 52 4d 41 54 29 3b 0a 09 4f 50 BIN_FORMAT);..OP
5c80: 54 46 4c 41 47 28 22 2d 62 69 6e 61 72 79 22 2c TFLAG("-binary",
5c90: 20 66 6f 72 6d 61 74 2c 20 42 49 4e 5f 46 4f 52 format, BIN_FOR
5ca0: 4d 41 54 29 3b 0a 09 4f 50 54 46 4c 41 47 28 22 MAT);..OPTFLAG("
5cb0: 2d 68 65 78 22 2c 20 66 6f 72 6d 61 74 2c 20 48 -hex", format, H
5cc0: 45 58 5f 46 4f 52 4d 41 54 29 3b 0a 09 4f 50 54 EX_FORMAT);..OPT
5cd0: 46 4c 41 47 28 22 2d 68 65 78 61 64 65 63 69 6d FLAG("-hexadecim
5ce0: 61 6c 22 2c 20 66 6f 72 6d 61 74 2c 20 48 45 58 al", format, HEX
5cf0: 5f 46 4f 52 4d 41 54 29 3b 0a 09 4f 50 54 4f 42 _FORMAT);..OPTOB
5d00: 4a 28 22 2d 64 61 74 61 22 2c 20 64 61 74 61 4f J("-data", dataO
5d10: 62 6a 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 bj);..OPTSTR("-c
5d20: 68 61 6e 22 2c 20 63 68 61 6e 6e 65 6c 29 3b 0a han", channel);.
5d30: 09 4f 50 54 53 54 52 28 22 2d 63 68 61 6e 6e 65 .OPTSTR("-channe
5d40: 6c 22 2c 20 63 68 61 6e 6e 65 6c 29 3b 0a 09 4f l", channel);..O
5d50: 50 54 4f 42 4a 28 22 2d 66 69 6c 65 22 2c 20 66 PTOBJ("-file", f
5d60: 69 6c 65 4f 62 6a 29 3b 0a 09 4f 50 54 4f 42 4a ileObj);..OPTOBJ
5d70: 28 22 2d 66 69 6c 65 6e 61 6d 65 22 2c 20 66 69 ("-filename", fi
5d80: 6c 65 4f 62 6a 29 3b 0a 09 4f 50 54 4f 42 4a 28 leObj);..OPTOBJ(
5d90: 22 2d 6b 65 79 22 2c 20 6b 65 79 4f 62 6a 29 3b "-key", keyObj);
5da0: 0a 0a 09 4f 50 54 42 41 44 28 22 6f 70 74 69 6f ...OPTBAD("optio
5db0: 6e 22 2c 20 22 2d 62 69 6e 2c 20 2d 64 61 74 61 n", "-bin, -data
5dc0: 2c 20 2d 66 69 6c 65 2c 20 2d 66 69 6c 65 6e 61 , -file, -filena
5dd0: 6d 65 2c 20 2d 68 65 78 2c 20 6f 72 20 2d 6b 65 me, -hex, or -ke
5de0: 79 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c y");..return TCL
5df0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
5e00: 20 20 20 2f 2a 20 49 66 20 6e 6f 20 6f 70 74 69 /* If no opti
5e10: 6f 6e 20 66 6f 72 20 6c 61 73 74 20 61 72 67 2c on for last arg,
5e20: 20 74 68 65 6e 20 69 74 73 20 74 68 65 20 64 61 then its the da
5e30: 74 61 20 2a 2f 0a 20 20 20 20 69 66 20 28 69 64 ta */. if (id
5e40: 78 20 3c 20 6f 62 6a 63 29 20 7b 0a 09 64 61 74 x < objc) {..dat
5e50: 61 4f 62 6a 20 3d 20 6f 62 6a 76 5b 69 64 78 5d aObj = objv[idx]
5e60: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
5e70: 43 61 6c 63 20 64 69 67 65 73 74 20 6f 6e 20 66 Calc digest on f
5e80: 69 6c 65 2c 20 73 74 61 63 6b 65 64 20 63 68 61 ile, stacked cha
5e90: 6e 6e 65 6c 2c 20 6f 72 20 64 61 74 61 20 62 6c nnel, or data bl
5ea0: 6f 62 20 2a 2f 0a 20 20 20 20 69 66 20 28 66 69 ob */. if (fi
5eb0: 6c 65 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b leObj != NULL) {
5ec0: 0a 09 72 65 74 75 72 6e 20 44 69 67 65 73 74 46 ..return DigestF
5ed0: 69 6c 65 28 69 6e 74 65 72 70 2c 20 66 69 6c 65 ile(interp, file
5ee0: 4f 62 6a 2c 20 6d 64 2c 20 66 6f 72 6d 61 74 2c Obj, md, format,
5ef0: 20 6b 65 79 4f 62 6a 29 3b 0a 20 20 20 20 7d 20 keyObj);. }
5f00: 65 6c 73 65 20 69 66 20 28 63 68 61 6e 6e 65 6c else if (channel
5f10: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 != NULL) {..ret
5f20: 75 72 6e 20 44 69 67 65 73 74 43 68 61 6e 6e 65 urn DigestChanne
5f30: 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 6e 65 l(interp, channe
5f40: 6c 2c 20 6d 64 2c 20 66 6f 72 6d 61 74 29 3b 0a l, md, format);.
5f50: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 64 } else if (d
5f60: 61 74 61 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 ataObj != NULL)
5f70: 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 73 {..Tcl_Obj *objs
5f80: 5b 32 5d 3b 0a 09 6f 62 6a 73 5b 30 5d 20 3d 20 [2];..objs[0] =
5f90: 4e 55 4c 4c 3b 0a 09 6f 62 6a 73 5b 31 5d 20 3d NULL;..objs[1] =
5fa0: 20 64 61 74 61 4f 62 6a 3b 0a 09 72 65 74 75 72 dataObj;..retur
5fb0: 6e 20 44 69 67 65 73 74 48 61 73 68 46 75 6e 63 n DigestHashFunc
5fc0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 32 2c 20 tion(interp, 2,
5fd0: 6f 62 6a 73 2c 20 6d 64 2c 20 66 6f 72 6d 61 74 objs, md, format
5fe0: 2c 20 6b 65 79 4f 62 6a 29 3b 0a 20 20 20 20 7d , keyObj);. }
5ff0: 0a 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
6000: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
6010: 4e 6f 20 64 61 74 61 20 73 70 65 63 69 66 69 65 No data specifie
6020: 64 2e 22 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 d.", NULL);.
6030: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
6040: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 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 2d 0a 20 2a -------------. *
6090: 0a 20 2a 20 4d 65 73 73 61 67 65 20 44 69 67 65 . * Message Dige
60a0: 73 74 20 43 6f 6e 76 65 6e 69 65 6e 63 65 20 43 st Convenience C
60b0: 6f 6d 6d 61 6e 64 73 20 2d 2d 0a 20 2a 0a 20 2a ommands --. *. *
60c0: 09 43 6f 6e 76 65 6e 69 65 6e 63 65 20 63 6f 6d .Convenience com
60d0: 6d 61 6e 64 73 20 66 6f 72 20 6d 65 73 73 61 67 mands for messag
60e0: 65 20 64 69 67 65 73 74 73 2e 0a 20 2a 0a 20 2a e digests.. *. *
60f0: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c Returns:. *.TCL
6100: 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 _OK or TCL_ERROR
6110: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
6120: 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 72 65 73 cts:. *.Sets res
6130: 75 6c 74 20 74 6f 20 6d 65 73 73 61 67 65 20 64 ult to message d
6140: 69 67 65 73 74 20 6f 72 20 65 72 72 6f 72 20 6d igest or error m
6150: 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d essage. *. *----
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 2d 0a ---------------.
61a0: 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 4d 44 */.int DigestMD
61b0: 34 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 4Cmd(ClientData
61c0: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f clientData, Tcl_
61d0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
61e0: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 int objc, Tcl_Ob
61f0: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 j *const objv[])
6200: 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 44 69 {. return Di
6210: 67 65 73 74 48 61 73 68 46 75 6e 63 74 69 6f 6e gestHashFunction
6220: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f (interp, objc, o
6230: 62 6a 76 2c 20 45 56 50 5f 6d 64 34 28 29 2c 20 bjv, EVP_md4(),
6240: 48 45 58 5f 46 4f 52 4d 41 54 2c 20 4e 55 4c 4c HEX_FORMAT, NULL
6250: 29 3b 0a 7d 0a 0a 69 6e 74 20 44 69 67 65 73 74 );.}..int Digest
6260: 4d 44 35 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 MD5Cmd(ClientDat
6270: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
6280: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
6290: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
62a0: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
62b0: 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 ]) {. return
62c0: 44 69 67 65 73 74 48 61 73 68 46 75 6e 63 74 69 DigestHashFuncti
62d0: 6f 6e 28 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c on(interp, objc,
62e0: 20 6f 62 6a 76 2c 20 45 56 50 5f 6d 64 35 28 29 objv, EVP_md5()
62f0: 2c 20 48 45 58 5f 46 4f 52 4d 41 54 2c 20 4e 55 , HEX_FORMAT, NU
6300: 4c 4c 29 3b 0a 7d 0a 0a 69 6e 74 20 44 69 67 65 LL);.}..int Dige
6310: 73 74 53 48 41 31 43 6d 64 28 43 6c 69 65 6e 74 stSHA1Cmd(Client
6320: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
6330: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
6340: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 erp, int objc, T
6350: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
6360: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 jv[]) {. retu
6370: 72 6e 20 44 69 67 65 73 74 48 61 73 68 46 75 6e rn DigestHashFun
6380: 63 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f 62 ction(interp, ob
6390: 6a 63 2c 20 6f 62 6a 76 2c 20 45 56 50 5f 73 68 jc, objv, EVP_sh
63a0: 61 31 28 29 2c 20 48 45 58 5f 46 4f 52 4d 41 54 a1(), HEX_FORMAT
63b0: 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 69 6e 74 20 , NULL);.}..int
63c0: 44 69 67 65 73 74 53 48 41 32 35 36 43 6d 64 28 DigestSHA256Cmd(
63d0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
63e0: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
63f0: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
6400: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
6410: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
6420: 20 20 72 65 74 75 72 6e 20 44 69 67 65 73 74 48 return DigestH
6430: 61 73 68 46 75 6e 63 74 69 6f 6e 28 69 6e 74 65 ashFunction(inte
6440: 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 rp, objc, objv,
6450: 45 56 50 5f 73 68 61 32 35 36 28 29 2c 20 48 45 EVP_sha256(), HE
6460: 58 5f 46 4f 52 4d 41 54 2c 20 4e 55 4c 4c 29 3b X_FORMAT, NULL);
6470: 0a 7d 0a 0a 2f 2a 0a 20 2a 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 2d 0a 20 2a 0a ------------. *.
64c0: 20 2a 20 54 6c 73 5f 44 69 67 65 73 74 43 6f 6d * Tls_DigestCom
64d0: 6d 61 6e 64 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43 mands --. *. *.C
64e0: 72 65 61 74 65 20 64 69 67 65 73 74 20 63 6f 6d reate digest com
64f0: 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 74 75 mands. *. * Retu
6500: 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f rns:. *.TCL_OK o
6510: 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 r TCL_ERROR. *.
6520: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
6530: 20 2a 09 43 72 65 61 74 65 73 20 63 6f 6d 6d 61 *.Creates comma
6540: 6e 64 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d nds. *. *-------
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 2d 0a 20 2a 2f ------------. */
6590: 0a 69 6e 74 20 54 6c 73 5f 44 69 67 65 73 74 43 .int Tls_DigestC
65a0: 6f 6d 6d 61 6e 64 73 28 54 63 6c 5f 49 6e 74 65 ommands(Tcl_Inte
65b0: 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 rp *interp) {.
65c0: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
65d0: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
65e0: 74 6c 73 3a 3a 64 69 67 65 73 74 22 2c 20 44 69 tls::digest", Di
65f0: 67 65 73 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 gestObjCmd, (Cli
6600: 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c entData) 0, (Tcl
6610: 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a _CmdDeleteProc *
6620: 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c ) NULL);. Tcl
6630: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
6640: 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a d(interp, "tls::
6650: 6d 64 34 22 2c 20 44 69 67 65 73 74 4d 44 34 43 md4", DigestMD4C
6660: 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
6670: 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 0, (Tcl_CmdDele
6680: 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
6690: 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
66a0: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
66b0: 2c 20 22 74 6c 73 3a 3a 6d 64 35 22 2c 20 44 69 , "tls::md5", Di
66c0: 67 65 73 74 4d 44 35 43 6d 64 2c 20 28 43 6c 69 gestMD5Cmd, (Cli
66d0: 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c entData) 0, (Tcl
66e0: 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a _CmdDeleteProc *
66f0: 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c ) NULL);. Tcl
6700: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
6710: 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a d(interp, "tls::
6720: 73 68 61 31 22 2c 20 44 69 67 65 73 74 53 48 41 sha1", DigestSHA
6730: 31 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 1Cmd, (ClientDat
6740: 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 a) 0, (Tcl_CmdDe
6750: 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c leteProc *) NULL
6760: 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 );. Tcl_Creat
6770: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
6780: 72 70 2c 20 22 74 6c 73 3a 3a 73 68 61 32 35 36 rp, "tls::sha256
6790: 22 2c 20 44 69 67 65 73 74 53 48 41 32 35 36 43 ", DigestSHA256C
67a0: 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
67b0: 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 0, (Tcl_CmdDele
67c0: 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
67d0: 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
67e0: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
67f0: 2c 20 22 74 6c 73 3a 3a 75 6e 73 74 61 63 6b 22 , "tls::unstack"
6800: 2c 20 55 6e 73 74 61 63 6b 4f 62 6a 43 6d 64 2c , UnstackObjCmd,
6810: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c (ClientData) 0,
6820: 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 (Tcl_CmdDeleteP
6830: 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 roc *) NULL);.
6840: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
6850: 0a 7d 0a 0a .}..