0000: 2f 2a 0a 20 2a 20 44 69 67 65 73 74 20 43 6f 6d /*. * Digest Com
0010: 6d 61 6e 64 20 61 6e 64 20 53 74 61 63 6b 65 64 mand and Stacked
0020: 20 54 72 61 6e 73 66 6f 72 6d 20 43 68 61 6e 6e Transform Chann
0030: 65 6c 0a 20 2a 0a 20 2a 20 43 6f 70 79 72 69 67 el. *. * Copyrig
0040: 68 74 20 28 43 29 20 32 30 32 33 20 42 72 69 61 ht (C) 2023 Bria
0050: 6e 20 4f 27 48 61 67 61 6e 0a 20 2a 0a 20 2a 2f n O'Hagan. *. */
0060: 0a 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 49 ..#include "tlsI
0070: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 nt.h".#include "
0080: 74 63 6c 4f 70 74 73 2e 68 22 0a 23 69 6e 63 6c tclOpts.h".#incl
0090: 75 64 65 20 3c 74 63 6c 2e 68 3e 0a 23 69 6e 63 ude <tcl.h>.#inc
00a0: 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 lude <stdio.h>.#
00b0: 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e include <string.
00c0: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 h>.#include <ope
00d0: 6e 73 73 6c 2f 65 76 70 2e 68 3e 0a 0a 2f 2a 20 nssl/evp.h>../*
00e0: 43 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 63 6f 6e Constants */.con
00f0: 73 74 20 63 68 61 72 20 2a 68 65 78 20 3d 20 22 st char *hex = "
0100: 30 31 32 33 34 35 36 37 38 39 41 42 43 44 45 46 0123456789ABCDEF
0110: 22 3b 0a 23 64 65 66 69 6e 65 20 52 45 41 53 4f ";.#define REASO
0120: 4e 28 29 09 45 52 52 5f 72 65 61 73 6f 6e 5f 65 N().ERR_reason_e
0130: 72 72 6f 72 5f 73 74 72 69 6e 67 28 45 52 52 5f rror_string(ERR_
0140: 67 65 74 5f 65 72 72 6f 72 28 29 29 0a 0a 0a 2f get_error()).../
0150: 2a 0a 20 2a 20 54 68 69 73 20 73 74 72 75 63 74 *. * This struct
0160: 75 72 65 20 64 65 73 63 72 69 62 65 73 20 74 68 ure describes th
0170: 65 20 70 65 72 2d 69 6e 73 74 61 6e 63 65 20 73 e per-instance s
0180: 74 61 74 65 20 6f 66 20 61 6e 20 53 53 4c 20 63 tate of an SSL c
0190: 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 54 68 hannel.. *. * Th
01a0: 65 20 53 53 4c 20 70 72 6f 63 65 73 73 69 6e 67 e SSL processing
01b0: 20 63 6f 6e 74 65 78 74 20 69 73 20 6d 61 69 6e context is main
01c0: 74 61 69 6e 65 64 20 68 65 72 65 2c 20 69 6e 20 tained here, in
01d0: 74 68 65 20 43 6c 69 65 6e 74 44 61 74 61 0a 20 the ClientData.
01e0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 */.typedef struc
01f0: 74 20 44 69 67 65 73 74 53 74 61 74 65 20 7b 0a t DigestState {.
0200: 09 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 73 65 6c .Tcl_Channel sel
0210: 66 3b 09 2f 2a 20 54 68 69 73 20 73 6f 63 6b 65 f;./* This socke
0220: 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 09 54 63 t channel */..Tc
0230: 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 20 74 69 6d l_TimerToken tim
0240: 65 72 3b 09 2f 2a 20 54 69 6d 65 72 20 66 6f 72 er;./* Timer for
0250: 20 72 65 61 64 20 65 76 65 6e 74 73 20 2a 2f 0a read events */.
0260: 0a 09 69 6e 74 20 66 6c 61 67 73 3b 09 09 2f 2a ..int flags;../*
0270: 20 43 68 61 6e 20 63 6f 6e 66 69 67 20 66 6c 61 Chan config fla
0280: 67 73 20 2a 2f 0a 09 69 6e 74 20 77 61 74 63 68 gs */..int watch
0290: 4d 61 73 6b 3b 09 09 2f 2a 20 43 75 72 72 65 6e Mask;../* Curren
02a0: 74 20 57 61 74 63 68 50 72 6f 63 20 6d 61 73 6b t WatchProc mask
02b0: 20 2a 2f 0a 09 69 6e 74 20 6d 6f 64 65 3b 09 09 */..int mode;..
02c0: 2f 2a 20 43 75 72 72 65 6e 74 20 6d 6f 64 65 20 /* Current mode
02d0: 6f 66 20 70 61 72 65 6e 74 20 63 68 61 6e 6e 65 of parent channe
02e0: 6c 20 2a 2f 0a 09 69 6e 74 20 66 6f 72 6d 61 74 l */..int format
02f0: 3b 09 09 2f 2a 20 4f 75 74 70 75 74 20 66 6f 72 ;../* Output for
0300: 6d 61 74 20 2a 2f 0a 0a 09 54 63 6c 5f 49 6e 74 mat */...Tcl_Int
0310: 65 72 70 20 2a 69 6e 74 65 72 70 3b 09 2f 2a 20 erp *interp;./*
0320: 43 75 72 72 65 6e 74 20 69 6e 74 65 72 70 72 65 Current interpre
0330: 74 65 72 20 2a 2f 0a 09 45 56 50 5f 4d 44 5f 43 ter */..EVP_MD_C
0340: 54 58 20 2a 63 74 78 3b 09 2f 2a 20 4d 44 20 43 TX *ctx;./* MD C
0350: 6f 6e 74 65 78 74 20 2a 2f 0a 7d 20 44 69 67 65 ontext */.} Dige
0360: 73 74 53 74 61 74 65 3b 0a 0a 2f 2a 2a 2a 2a 2a stState;../*****
0370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
03a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a **************/.
03b0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
03c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
03d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
03e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
03f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
0400: 44 69 67 65 73 74 46 69 6c 65 20 2d 2d 0a 20 2a DigestFile --. *
0410: 0a 20 2a 09 52 65 74 75 72 6e 20 6d 65 73 73 61 . *.Return messa
0420: 67 65 20 64 69 67 65 73 74 20 66 6f 72 20 66 69 ge digest for fi
0430: 6c 65 20 75 73 69 6e 67 20 75 73 65 72 20 73 70 le using user sp
0440: 65 63 69 66 69 65 64 20 68 61 73 68 20 66 75 6e ecified hash fun
0450: 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 ction.. *. * Ret
0460: 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 urns:. *.TCL_OK
0470: 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a or TCL_ERROR. *.
0480: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
0490: 0a 20 2a 09 52 65 73 75 6c 74 20 69 73 20 6d 65 . *.Result is me
04a0: 73 73 61 67 65 20 64 69 67 65 73 74 20 6f 72 20 ssage digest or
04b0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a error message. *
04c0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
04d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
04e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
04f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0500: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 ------. */.int D
0510: 69 67 65 73 74 46 69 6c 65 28 54 63 6c 5f 49 6e igestFile(Tcl_In
0520: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 63 terp *interp, Tc
0530: 6c 5f 4f 62 6a 20 2a 66 69 6c 65 6e 61 6d 65 2c l_Obj *filename,
0540: 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d const EVP_MD *m
0550: 64 2c 20 69 6e 74 20 66 6f 72 6d 61 74 29 20 7b d, int format) {
0560: 0a 20 20 20 20 45 56 50 5f 4d 44 5f 43 54 58 20 . EVP_MD_CTX
0570: 2a 63 74 78 3b 0a 20 20 20 20 54 63 6c 5f 43 68 *ctx;. Tcl_Ch
0580: 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 annel chan;.
0590: 63 68 61 72 20 62 75 66 5b 33 32 37 36 38 5d 3b char buf[32768];
05a0: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 . unsigned ch
05b0: 61 72 20 6d 64 5f 62 75 66 5b 45 56 50 5f 4d 41 ar md_buf[EVP_MA
05c0: 58 5f 4d 44 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 X_MD_SIZE];.
05d0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6d 64 5f unsigned int md_
05e0: 6c 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 len;.. /* Ope
05f0: 6e 20 66 69 6c 65 20 63 68 61 6e 6e 65 6c 20 2a n file channel *
0600: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c /. chan = Tcl
0610: 5f 46 53 4f 70 65 6e 46 69 6c 65 43 68 61 6e 6e _FSOpenFileChann
0620: 65 6c 28 69 6e 74 65 72 70 2c 20 66 69 6c 65 6e el(interp, filen
0630: 61 6d 65 2c 20 22 72 62 22 2c 20 30 34 34 34 29 ame, "rb", 0444)
0640: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d ;. if (chan =
0650: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 = NULL) {..retur
0660: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
0670: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 66 69 }.. /* Confi
0680: 67 75 72 65 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a gure channel */.
0690: 20 20 20 20 69 66 20 28 54 63 6c 5f 53 65 74 43 if (Tcl_SetC
06a0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
06b0: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 erp, chan, "-tra
06c0: 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61 nslation", "bina
06d0: 72 79 22 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f ry") == TCL_ERRO
06e0: 52 20 7c 7c 0a 09 54 63 6c 5f 53 65 74 43 68 61 R ||..Tcl_SetCha
06f0: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
0700: 70 2c 20 63 68 61 6e 2c 20 22 2d 62 75 66 66 65 p, chan, "-buffe
0710: 72 73 69 7a 65 22 2c 20 22 33 32 37 36 38 22 29 rsize", "32768")
0720: 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b == TCL_ERROR) {
0730: 0a 09 54 63 6c 5f 43 6c 6f 73 65 28 69 6e 74 65 ..Tcl_Close(inte
0740: 72 70 2c 20 63 68 61 6e 29 3b 0a 09 72 65 74 75 rp, chan);..retu
0750: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
0760: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 }.. /* Crea
0770: 74 65 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 te message diges
0780: 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 20 t context */.
0790: 20 63 74 78 20 3d 20 45 56 50 5f 4d 44 5f 43 54 ctx = EVP_MD_CT
07a0: 58 5f 6e 65 77 28 29 3b 0a 20 20 20 20 69 66 20 X_new();. if
07b0: 28 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a (ctx == NULL) {.
07c0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
07d0: 74 28 69 6e 74 65 72 70 2c 20 22 43 72 65 61 74 t(interp, "Creat
07e0: 65 20 64 69 67 65 73 74 20 63 6f 6e 74 65 78 74 e digest context
07f0: 20 66 61 69 6c 65 64 3a 20 22 2c 20 52 45 41 53 failed: ", REAS
0800: 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 ON(), NULL);..Tc
0810: 6c 5f 43 6c 6f 73 65 28 69 6e 74 65 72 70 2c 20 l_Close(interp,
0820: 63 68 61 6e 29 3b 0a 09 72 65 74 75 72 6e 20 54 chan);..return T
0830: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
0840: 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 . /* Initiali
0850: 7a 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e ze hash function
0860: 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f */.#if OPENSSL_
0870: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c VERSION_NUMBER <
0880: 20 30 78 33 30 30 30 30 30 30 30 4c 0a 20 20 20 0x30000000L.
0890: 20 69 66 20 28 21 45 56 50 5f 44 69 67 65 73 74 if (!EVP_Digest
08a0: 49 6e 69 74 5f 65 78 28 63 74 78 2c 20 6d 64 2c Init_ex(ctx, md,
08b0: 20 4e 55 4c 4c 29 29 0a 23 65 6c 73 65 0a 20 20 NULL)).#else.
08c0: 20 20 69 66 20 28 21 45 56 50 5f 44 69 67 65 73 if (!EVP_Diges
08d0: 74 49 6e 69 74 5f 65 78 32 28 63 74 78 2c 20 6d tInit_ex2(ctx, m
08e0: 64 2c 20 4e 55 4c 4c 29 29 0a 23 65 6e 64 69 66 d, NULL)).#endif
08f0: 0a 20 20 20 20 7b 0a 09 54 63 6c 5f 41 70 70 65 . {..Tcl_Appe
0900: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
0910: 20 22 49 6e 69 74 69 61 6c 69 7a 65 20 64 69 67 "Initialize dig
0920: 65 73 74 20 66 61 69 6c 65 64 3a 20 22 2c 20 52 est failed: ", R
0930: 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a EASON(), NULL);.
0940: 09 54 63 6c 5f 43 6c 6f 73 65 28 69 6e 74 65 72 .Tcl_Close(inter
0950: 70 2c 20 63 68 61 6e 29 3b 0a 09 45 56 50 5f 4d p, chan);..EVP_M
0960: 44 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b D_CTX_free(ctx);
0970: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
0980: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
0990: 2a 20 52 65 61 64 20 66 69 6c 65 20 64 61 74 61 * Read file data
09a0: 20 61 6e 64 20 75 70 64 61 74 65 20 68 61 73 68 and update hash
09b0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 function */.
09c0: 20 77 68 69 6c 65 20 28 21 54 63 6c 5f 45 6f 66 while (!Tcl_Eof
09d0: 28 63 68 61 6e 29 29 20 7b 0a 09 69 6e 74 20 6c (chan)) {..int l
09e0: 65 6e 20 3d 20 54 63 6c 5f 52 65 61 64 52 61 77 en = Tcl_ReadRaw
09f0: 28 63 68 61 6e 2c 20 62 75 66 2c 20 33 32 37 36 (chan, buf, 3276
0a00: 38 29 3b 0a 09 69 66 20 28 6c 65 6e 20 3e 20 30 8);..if (len > 0
0a10: 20 26 26 20 21 45 56 50 5f 44 69 67 65 73 74 55 && !EVP_DigestU
0a20: 70 64 61 74 65 28 63 74 78 2c 20 26 62 75 66 2c pdate(ctx, &buf,
0a30: 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 29 20 (size_t) len))
0a40: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e {.. Tcl_Appen
0a50: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
0a60: 22 55 70 64 61 74 65 20 64 69 67 65 73 74 20 66 "Update digest f
0a70: 61 69 6c 65 64 3a 20 22 2c 20 52 45 41 53 4f 4e ailed: ", REASON
0a80: 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 (), NULL);..
0a90: 54 63 6c 5f 43 6c 6f 73 65 28 69 6e 74 65 72 70 Tcl_Close(interp
0aa0: 2c 20 63 68 61 6e 29 3b 0a 09 20 20 20 20 45 56 , chan);.. EV
0ab0: 50 5f 4d 44 5f 43 54 58 5f 66 72 65 65 28 63 74 P_MD_CTX_free(ct
0ac0: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 x);.. return
0ad0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 TCL_ERROR;..}.
0ae0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 }.. /* Clos
0af0: 65 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 e channel */.
0b00: 20 69 66 20 28 54 63 6c 5f 43 6c 6f 73 65 28 69 if (Tcl_Close(i
0b10: 6e 74 65 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20 nterp, chan) ==
0b20: 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 45 56 TCL_ERROR) {..EV
0b30: 50 5f 4d 44 5f 43 54 58 5f 66 72 65 65 28 63 74 P_MD_CTX_free(ct
0b40: 78 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f x);..return TCL_
0b50: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
0b60: 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 68 61 /* Finalize ha
0b70: 73 68 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 sh function and
0b80: 63 61 6c 63 75 6c 61 74 65 20 6d 65 73 73 61 67 calculate messag
0b90: 65 20 64 69 67 65 73 74 20 2a 2f 0a 20 20 20 20 e digest */.
0ba0: 69 66 20 28 21 45 56 50 5f 44 69 67 65 73 74 46 if (!EVP_DigestF
0bb0: 69 6e 61 6c 5f 65 78 28 63 74 78 2c 20 6d 64 5f inal_ex(ctx, md_
0bc0: 62 75 66 2c 20 26 6d 64 5f 6c 65 6e 29 29 20 7b buf, &md_len)) {
0bd0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
0be0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 46 69 6e 61 lt(interp, "Fina
0bf0: 6c 69 7a 65 20 64 69 67 65 73 74 20 66 61 69 6c lize digest fail
0c00: 65 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c ed: ", REASON(),
0c10: 20 4e 55 4c 4c 29 3b 0a 09 45 56 50 5f 4d 44 5f NULL);..EVP_MD_
0c20: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
0c30: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
0c40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 45 56 50 5f ;. }. EVP_
0c50: 4d 44 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 MD_CTX_free(ctx)
0c60: 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 74 75 72 6e ;.. /* Return
0c70: 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20 message digest
0c80: 61 73 20 65 69 74 68 65 72 20 61 20 62 69 6e 61 as either a bina
0c90: 72 79 20 6f 72 20 68 65 78 20 73 74 72 69 6e 67 ry or hex string
0ca0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 66 6f 72 6d */. if (form
0cb0: 61 74 20 3d 3d 20 30 29 20 7b 0a 09 54 63 6c 5f at == 0) {..Tcl_
0cc0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 SetObjResult(int
0cd0: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 erp, Tcl_NewByte
0ce0: 41 72 72 61 79 4f 62 6a 28 6d 64 5f 62 75 66 2c ArrayObj(md_buf,
0cf0: 20 6d 64 5f 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 md_len));..
0d00: 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 } else {..Tcl_Ob
0d10: 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 j *resultObj = T
0d20: 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 09 75 6e cl_NewObj();..un
0d30: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 74 72 signed char *ptr
0d40: 20 3d 20 54 63 6c 5f 53 65 74 42 79 74 65 41 72 = Tcl_SetByteAr
0d50: 72 61 79 4c 65 6e 67 74 68 28 72 65 73 75 6c 74 rayLength(result
0d60: 4f 62 6a 2c 20 6d 64 5f 6c 65 6e 2a 32 29 3b 0a Obj, md_len*2);.
0d70: 0a 09 66 6f 72 20 28 75 6e 73 69 67 6e 65 64 20 ..for (unsigned
0d80: 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 6d int i = 0; i < m
0d90: 64 5f 6c 65 6e 3b 20 69 2b 2b 29 20 7b 0a 09 20 d_len; i++) {..
0da0: 20 20 20 2a 70 74 72 2b 2b 20 3d 20 68 65 78 5b *ptr++ = hex[
0db0: 28 6d 64 5f 62 75 66 5b 69 5d 20 3e 3e 20 34 29 (md_buf[i] >> 4)
0dc0: 20 26 20 30 78 30 46 5d 3b 0a 09 20 20 20 20 2a & 0x0F];.. *
0dd0: 70 74 72 2b 2b 20 3d 20 68 65 78 5b 6d 64 5f 62 ptr++ = hex[md_b
0de0: 75 66 5b 69 5d 20 26 20 30 78 30 46 5d 3b 0a 09 uf[i] & 0x0F];..
0df0: 7d 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 }..Tcl_SetObjRes
0e00: 75 6c 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 ult(interp, resu
0e10: 6c 74 4f 62 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 ltObj);. }.
0e20: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
0e30: 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .}../***********
0e40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0e50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0e60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0e70: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a ********/../*. *
0e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ec0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 ---. *. * Digest
0ed0: 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 2d 2d BlockModeProc --
0ee0: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 . *. *.This proc
0ef0: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 edure is invoked
0f00: 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 by the generic
0f10: 49 4f 20 6c 65 76 65 6c 0a 20 2a 20 20 20 20 20 IO level. *
0f20: 20 20 74 6f 20 73 65 74 20 62 6c 6f 63 6b 69 6e to set blockin
0f30: 67 20 61 6e 64 20 6e 6f 6e 62 6c 6f 63 6b 69 6e g and nonblockin
0f40: 67 20 6d 6f 64 65 73 2e 0a 20 2a 0a 20 2a 20 52 g modes.. *. * R
0f50: 65 74 75 72 6e 73 3a 0a 20 2a 09 30 20 69 66 20 eturns:. *.0 if
0f60: 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 50 4f successful or PO
0f70: 53 49 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 SIX error code i
0f80: 66 20 66 61 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20 f failed.. *. *
0f90: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
0fa0: 09 53 65 74 73 20 74 68 65 20 64 65 76 69 63 65 .Sets the device
0fb0: 20 69 6e 74 6f 20 62 6c 6f 63 6b 69 6e 67 20 6f into blocking o
0fc0: 72 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f r nonblocking mo
0fd0: 64 65 2e 0a 20 2a 09 43 61 6e 20 63 61 6c 6c 20 de.. *.Can call
0fe0: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 45 72 Tcl_SetChannelEr
0ff0: 72 6f 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ror.. *. *------
1000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
1040: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 69 67 /.static int Dig
1050: 65 73 74 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 estBlockModeProc
1060: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
1070: 6e 74 44 61 74 61 2c 20 69 6e 74 20 6d 6f 64 65 ntData, int mode
1080: 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74 ) {. DigestSt
1090: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 ate *statePtr =
10a0: 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 29 20 (DigestState *)
10b0: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 clientData;..
10c0: 20 69 66 20 28 6d 6f 64 65 20 3d 3d 20 54 43 4c if (mode == TCL
10d0: 5f 4d 4f 44 45 5f 4e 4f 4e 42 4c 4f 43 4b 49 4e _MODE_NONBLOCKIN
10e0: 47 29 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e G) {..statePtr->
10f0: 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c flags |= TLS_TCL
1100: 5f 41 53 59 4e 43 3b 0a 20 20 20 20 7d 20 65 6c _ASYNC;. } el
1110: 73 65 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e se {..statePtr->
1120: 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54 flags &= ~(TLS_T
1130: 43 4c 5f 41 53 59 4e 43 29 3b 0a 20 20 20 20 7d CL_ASYNC);. }
1140: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d . return 0;.}
1150: 0a 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d ----------------
1180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
11a0: 20 44 69 67 65 73 74 46 72 65 65 20 2d 2d 0a 20 DigestFree --.
11b0: 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 *. *.This proced
11c0: 75 72 65 20 72 65 6d 6f 76 65 73 20 61 20 64 69 ure removes a di
11d0: 67 65 73 74 20 73 74 61 74 65 20 73 74 72 75 63 gest state struc
11e0: 74 75 72 65 0a 20 2a 0a 20 2a 20 52 65 74 75 72 ture. *. * Retur
11f0: 6e 73 3a 0a 20 2a 09 4e 6f 74 68 69 6e 67 0a 20 ns:. *.Nothing.
1200: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
1210: 73 3a 0a 20 2a 09 52 65 6d 6f 76 65 73 20 73 74 s:. *.Removes st
1220: 72 75 63 74 75 72 65 0a 20 2a 0a 20 2a 2d 2d 2d ructure. *. *---
1230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1270: 0a 20 2a 2f 0a 76 6f 69 64 20 44 69 67 65 73 74 . */.void Digest
1280: 46 72 65 65 20 28 44 69 67 65 73 74 53 74 61 74 Free (DigestStat
1290: 65 20 2a 73 74 61 74 65 50 74 72 29 20 7b 0a 20 e *statePtr) {.
12a0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 20 if (statePtr
12b0: 3d 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20 == (DigestState
12c0: 2a 29 20 4e 55 4c 4c 29 20 72 65 74 75 72 6e 3b *) NULL) return;
12d0: 0a 20 20 20 20 0a 20 20 20 20 69 66 20 28 73 74 . . if (st
12e0: 61 74 65 50 74 72 2d 3e 63 74 78 20 21 3d 20 4e atePtr->ctx != N
12f0: 55 4c 4c 29 20 7b 0a 09 45 56 50 5f 4d 44 5f 43 ULL) {..EVP_MD_C
1300: 54 58 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 TX_free(statePtr
1310: 2d 3e 63 74 78 29 3b 0a 20 20 20 20 7d 0a 20 20 ->ctx);. }.
1320: 20 20 63 6b 66 72 65 65 28 73 74 61 74 65 50 74 ckfree(statePt
1330: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d r);.}../*. *----
1340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
1380: 20 2a 0a 20 2a 20 44 69 67 65 73 74 43 6c 6f 73 *. * DigestClos
1390: 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 eProc --. *. *.T
13a0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 his procedure is
13b0: 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 invoked by the
13c0: 67 65 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 6c generic IO level
13d0: 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20 2a 09 63 to perform. *.c
13e0: 68 61 6e 6e 65 6c 2d 74 79 70 65 2d 73 70 65 63 hannel-type-spec
13f0: 69 66 69 63 20 63 6c 65 61 6e 75 70 20 77 68 65 ific cleanup whe
1400: 6e 20 64 69 67 65 73 74 20 63 68 61 6e 6e 65 6c n digest channel
1410: 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20 2a 0a 20 is closed.. *.
1420: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 * Returns:. *.TC
1430: 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f L_OK or TCL_ERRO
1440: 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 R. *. * Side eff
1450: 65 63 74 73 3a 0a 20 2a 09 57 72 69 74 65 73 20 ects:. *.Writes
1460: 64 69 67 65 73 74 20 74 6f 20 6f 75 74 70 75 74 digest to output
1470: 20 61 6e 64 20 63 6c 6f 73 65 73 20 74 68 65 20 and closes the
1480: 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d channel.. *. *--
1490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14d0: 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 -. */.int Digest
14e0: 43 6c 6f 73 65 50 72 6f 63 28 43 6c 69 65 6e 74 CloseProc(Client
14f0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
1500: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
1510: 65 72 70 29 20 7b 0a 20 20 20 20 44 69 67 65 73 erp) {. Diges
1520: 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 tState *statePtr
1530: 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20 = (DigestState
1540: 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 *) clientData;.
1550: 20 20 20 69 6e 74 20 72 65 73 75 6c 74 20 3d 20 int result =
1560: 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 6e 63 65 0;.. /* Cance
1570: 6c 20 61 63 74 69 76 65 20 74 69 6d 65 72 2c 20 l active timer,
1580: 69 66 20 61 6e 79 20 2a 2f 0a 20 20 20 20 69 66 if any */. if
1590: 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 (statePtr->time
15a0: 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 r != (Tcl_TimerT
15b0: 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 oken) NULL) {..T
15c0: 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 cl_DeleteTimerHa
15d0: 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e ndler(statePtr->
15e0: 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 timer);..statePt
15f0: 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f r->timer = (Tcl_
1600: 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c TimerToken) NULL
1610: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
1620: 43 6c 65 61 6e 2d 75 70 20 2a 2f 0a 20 20 20 20 Clean-up */.
1630: 44 69 67 65 73 74 46 72 65 65 28 73 74 61 74 65 DigestFree(state
1640: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e Ptr);. return
1650: 20 72 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 20 result;.}../*.
1660: 2a 20 53 61 6d 65 20 61 73 20 44 69 67 65 73 74 * Same as Digest
1670: 43 6c 6f 73 65 50 72 6f 63 20 62 75 74 20 77 69 CloseProc but wi
1680: 74 68 20 69 6e 64 69 76 69 64 75 61 6c 20 72 65 th individual re
1690: 61 64 20 61 6e 64 20 77 72 69 74 65 20 63 6c 6f ad and write clo
16a0: 73 65 20 63 6f 6e 74 72 6f 6c 0a 20 2a 2f 0a 73 se control. */.s
16b0: 74 61 74 69 63 20 69 6e 74 20 44 69 67 65 73 74 tatic int Digest
16c0: 43 6c 6f 73 65 32 50 72 6f 63 28 43 6c 69 65 6e Close2Proc(Clien
16d0: 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 tData instanceDa
16e0: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a ta, Tcl_Interp *
16f0: 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 interp, int flag
1700: 73 29 20 7b 0a 0a 20 20 20 20 69 66 20 28 28 66 s) {.. if ((f
1710: 6c 61 67 73 20 26 20 28 54 43 4c 5f 43 4c 4f 53 lags & (TCL_CLOS
1720: 45 5f 52 45 41 44 20 7c 20 54 43 4c 5f 43 4c 4f E_READ | TCL_CLO
1730: 53 45 5f 57 52 49 54 45 29 29 20 3d 3d 20 30 29 SE_WRITE)) == 0)
1740: 20 7b 0a 09 72 65 74 75 72 6e 20 44 69 67 65 73 {..return Diges
1750: 74 43 6c 6f 73 65 50 72 6f 63 28 69 6e 73 74 61 tCloseProc(insta
1760: 6e 63 65 44 61 74 61 2c 20 69 6e 74 65 72 70 29 nceData, interp)
1770: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 ;. }. retu
1780: 72 6e 20 45 49 4e 56 41 4c 3b 0a 7d 0a 0a 2f 2a rn EINVAL;.}../*
1790: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
17a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
17e0: 44 69 67 65 73 74 49 6e 70 75 74 50 72 6f 63 20 DigestInputProc
17f0: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 --. *. *.Called
1800: 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 by the generic I
1810: 4f 20 73 79 73 74 65 6d 20 74 6f 20 72 65 61 64 O system to read
1820: 20 64 61 74 61 20 66 72 6f 6d 20 74 72 61 6e 73 data from trans
1830: 66 6f 72 6d 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 form.. *. * Retu
1840: 72 6e 73 3a 0a 20 2a 09 54 6f 74 61 6c 20 62 79 rns:. *.Total by
1850: 74 65 73 20 72 65 61 64 0a 20 2a 0a 20 2a 20 53 tes read. *. * S
1860: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
1870: 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 74 Read data from t
1880: 72 61 6e 73 66 6f 72 6d 20 61 6e 64 20 77 72 69 ransform and wri
1890: 74 65 20 74 6f 20 62 75 66 0a 20 2a 0a 20 2a 2d te to buf. *. *-
18a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
18b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
18c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
18d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
18e0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 -----. */.int Di
18f0: 67 65 73 74 49 6e 70 75 74 50 72 6f 63 28 43 6c gestInputProc(Cl
1900: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
1910: 61 74 61 2c 20 63 68 61 72 20 2a 62 75 66 2c 20 ata, char *buf,
1920: 69 6e 74 20 74 6f 52 65 61 64 2c 20 69 6e 74 20 int toRead, int
1930: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 20 7b *errorCodePtr) {
1940: 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65 . DigestState
1950: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 *statePtr = (Di
1960: 67 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 gestState *) cli
1970: 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 54 63 6c entData;. Tcl
1980: 5f 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 3b _Channel parent;
1990: 0a 20 20 20 20 69 6e 74 20 72 65 61 64 3b 0a 20 . int read;.
19a0: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 *errorCodePtr
19b0: 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 20 28 74 = 0;.. if (t
19c0: 6f 52 65 61 64 20 3c 3d 20 30 20 7c 7c 20 73 74 oRead <= 0 || st
19d0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 atePtr->self ==
19e0: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 (Tcl_Channel) NU
19f0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b LL) {..return 0;
1a00: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 . }.. /* G
1a10: 65 74 20 62 79 74 65 73 20 66 72 6f 6d 20 75 6e et bytes from un
1a20: 64 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c derlying channel
1a30: 20 2a 2f 0a 20 20 20 20 70 61 72 65 6e 74 20 3d */. parent =
1a40: 20 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 64 43 Tcl_GetStackedC
1a50: 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d hannel(statePtr-
1a60: 3e 73 65 6c 66 29 3b 0a 20 20 20 20 72 65 61 64 >self);. read
1a70: 20 3d 20 54 63 6c 5f 52 65 61 64 52 61 77 28 70 = Tcl_ReadRaw(p
1a80: 61 72 65 6e 74 2c 20 62 75 66 2c 20 74 6f 52 65 arent, buf, toRe
1a90: 61 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 64 ad);.. /* Add
1aa0: 20 74 6f 20 6d 65 73 73 61 67 65 20 64 69 67 65 to message dige
1ab0: 73 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 st */. if (re
1ac0: 61 64 20 3e 20 30 29 20 7b 0a 09 2f 2a 20 4f 4b ad > 0) {../* OK
1ad0: 20 2a 2f 0a 09 69 66 20 28 21 45 56 50 5f 44 69 */..if (!EVP_Di
1ae0: 67 65 73 74 55 70 64 61 74 65 28 73 74 61 74 65 gestUpdate(state
1af0: 50 74 72 2d 3e 63 74 78 2c 20 62 75 66 2c 20 72 Ptr->ctx, buf, r
1b00: 65 61 64 29 29 20 7b 0a 09 20 20 20 20 54 63 6c ead)) {.. Tcl
1b10: 5f 53 65 74 43 68 61 6e 6e 65 6c 45 72 72 6f 72 _SetChannelError
1b20: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c (statePtr->self,
1b30: 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 22 Tcl_ObjPrintf("
1b40: 44 69 67 65 73 74 20 75 70 64 61 74 65 20 66 61 Digest update fa
1b50: 69 6c 65 64 3a 20 25 73 22 2c 20 52 45 41 53 4f iled: %s", REASO
1b60: 4e 28 29 29 29 3b 0a 09 20 20 20 20 2a 65 72 72 N()));.. *err
1b70: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49 4e 56 orCodePtr = EINV
1b80: 41 4c 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 AL;.. return
1b90: 2d 31 3b 0a 09 7d 0a 09 2a 65 72 72 6f 72 43 6f -1;..}..*errorCo
1ba0: 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a dePtr = EAGAIN;.
1bb0: 09 72 65 61 64 20 3d 20 2d 31 3b 0a 09 20 20 20 .read = -1;..
1bc0: 20 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 . } else if
1bd0: 28 72 65 61 64 20 3c 20 30 29 20 7b 0a 09 2f 2a (read < 0) {../*
1be0: 20 45 72 72 6f 72 20 2a 2f 0a 09 2a 65 72 72 6f Error */..*erro
1bf0: 72 43 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f 47 rCodePtr = Tcl_G
1c00: 65 74 45 72 72 6e 6f 28 29 3b 0a 0a 20 20 20 20 etErrno();..
1c10: 7d 20 65 6c 73 65 20 69 66 20 28 21 28 73 74 61 } else if (!(sta
1c20: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 30 tePtr->flags & 0
1c30: 78 31 30 29 29 20 7b 0a 09 2f 2a 20 45 4f 46 20 x10)) {../* EOF
1c40: 2a 2f 0a 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 */..*errorCodePt
1c50: 72 20 3d 20 30 3b 0a 09 75 6e 73 69 67 6e 65 64 r = 0;..unsigned
1c60: 20 63 68 61 72 20 6d 64 5f 62 75 66 5b 45 56 50 char md_buf[EVP
1c70: 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45 5d 3b 0a 09 _MAX_MD_SIZE];..
1c80: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6d 64 5f unsigned int md_
1c90: 6c 65 6e 20 3d 20 30 3b 0a 0a 09 2f 2a 20 47 65 len = 0;.../* Ge
1ca0: 74 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 t message digest
1cb0: 20 2a 2f 0a 09 69 66 20 28 21 45 56 50 5f 44 69 */..if (!EVP_Di
1cc0: 67 65 73 74 46 69 6e 61 6c 5f 65 78 28 73 74 61 gestFinal_ex(sta
1cd0: 74 65 50 74 72 2d 3e 63 74 78 2c 20 6d 64 5f 62 tePtr->ctx, md_b
1ce0: 75 66 2c 20 26 6d 64 5f 6c 65 6e 29 29 20 7b 0a uf, &md_len)) {.
1cf0: 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 . *errorCodeP
1d00: 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 0a 09 2f tr = EINVAL;.../
1d10: 2a 20 57 72 69 74 65 20 6d 65 73 73 61 67 65 20 * Write message
1d20: 64 69 67 65 73 74 20 74 6f 20 6f 75 74 70 75 74 digest to output
1d30: 20 63 68 61 6e 6e 65 6c 20 61 73 20 62 79 74 65 channel as byte
1d40: 20 61 72 72 61 79 20 6f 72 20 68 65 78 20 73 74 array or hex st
1d50: 72 69 6e 67 20 2a 2f 0a 09 7d 20 65 6c 73 65 20 ring */..} else
1d60: 69 66 20 28 6d 64 5f 6c 65 6e 20 3e 20 30 29 20 if (md_len > 0)
1d70: 7b 0a 09 20 20 20 20 69 66 20 28 73 74 61 74 65 {.. if (state
1d80: 50 74 72 2d 3e 66 6f 72 6d 61 74 20 3d 3d 20 30 Ptr->format == 0
1d90: 29 20 7b 0a 09 09 72 65 61 64 20 3d 20 6d 64 5f ) {...read = md_
1da0: 6c 65 6e 3b 0a 09 09 6d 65 6d 63 70 79 28 62 75 len;...memcpy(bu
1db0: 66 2c 20 6d 64 5f 62 75 66 2c 20 72 65 61 64 29 f, md_buf, read)
1dc0: 3b 0a 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b ;... } else {
1dd0: 0a 09 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 ...unsigned char
1de0: 20 68 65 78 5f 62 75 66 5b 45 56 50 5f 4d 41 58 hex_buf[EVP_MAX
1df0: 5f 4d 44 5f 53 49 5a 45 2a 32 5d 3b 0a 09 09 75 _MD_SIZE*2];...u
1e00: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 74 nsigned char *pt
1e10: 72 20 3d 20 68 65 78 5f 62 75 66 3b 0a 0a 09 09 r = hex_buf;....
1e20: 66 6f 72 20 28 75 6e 73 69 67 6e 65 64 20 69 6e for (unsigned in
1e30: 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 6d 64 5f t i = 0; i < md_
1e40: 6c 65 6e 3b 20 69 2b 2b 29 20 7b 0a 09 09 20 20 len; i++) {...
1e50: 20 20 2a 70 74 72 2b 2b 20 3d 20 68 65 78 5b 28 *ptr++ = hex[(
1e60: 6d 64 5f 62 75 66 5b 69 5d 20 3e 3e 20 34 29 20 md_buf[i] >> 4)
1e70: 26 20 30 78 30 46 5d 3b 0a 09 09 20 20 20 20 2a & 0x0F];... *
1e80: 70 74 72 2b 2b 20 3d 20 68 65 78 5b 6d 64 5f 62 ptr++ = hex[md_b
1e90: 75 66 5b 69 5d 20 26 20 30 78 30 46 5d 3b 0a 09 uf[i] & 0x0F];..
1ea0: 09 7d 0a 09 09 72 65 61 64 20 3d 20 6d 64 5f 6c .}...read = md_l
1eb0: 65 6e 2a 32 3b 0a 09 09 6d 65 6d 63 70 79 28 62 en*2;...memcpy(b
1ec0: 75 66 2c 20 68 65 78 5f 62 75 66 2c 20 72 65 61 uf, hex_buf, rea
1ed0: 64 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 73 d);.. }..}..s
1ee0: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c tatePtr->flags |
1ef0: 3d 20 30 78 31 30 3b 0a 20 20 20 20 7d 0a 20 20 = 0x10;. }.
1f00: 20 20 72 65 74 75 72 6e 20 72 65 61 64 3b 0a 7d return read;.}
1f10: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
1f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
1f60: 0a 20 2a 20 44 69 67 65 73 74 4f 75 74 70 75 74 . * DigestOutput
1f70: 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 Proc --. *. *.Ca
1f80: 6c 6c 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 lled by the gene
1f90: 72 69 63 20 49 4f 20 73 79 73 74 65 6d 20 74 6f ric IO system to
1fa0: 20 77 72 69 74 65 20 64 61 74 61 20 74 6f 20 74 write data to t
1fb0: 72 61 6e 73 66 6f 72 6d 2e 0a 20 2a 0a 20 2a 20 ransform.. *. *
1fc0: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 6f 74 61 Returns:. *.Tota
1fd0: 6c 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 0a l bytes written.
1fe0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
1ff0: 74 73 3a 0a 20 2a 09 47 65 74 20 64 61 74 61 20 ts:. *.Get data
2000: 66 72 6f 6d 20 62 75 66 20 61 6e 64 20 75 70 64 from buf and upd
2010: 61 74 65 20 64 69 67 65 73 74 0a 20 2a 0a 20 2a ate digest. *. *
2020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2060: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 20 69 6e 74 20 ------. */. int
2070: 44 69 67 65 73 74 4f 75 74 70 75 74 50 72 6f 63 DigestOutputProc
2080: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
2090: 6e 74 44 61 74 61 2c 20 63 6f 6e 73 74 20 63 68 ntData, const ch
20a0: 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 74 6f 57 ar *buf, int toW
20b0: 72 69 74 65 2c 20 69 6e 74 20 2a 65 72 72 6f 72 rite, int *error
20c0: 43 6f 64 65 50 74 72 29 20 7b 0a 20 20 20 20 44 CodePtr) {. D
20d0: 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 igestState *stat
20e0: 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 ePtr = (DigestSt
20f0: 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 ate *) clientDat
2100: 61 3b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 a;. *errorCod
2110: 65 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20 69 ePtr = 0;.. i
2120: 66 20 28 74 6f 57 72 69 74 65 20 3c 3d 20 30 20 f (toWrite <= 0
2130: 7c 7c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c || statePtr->sel
2140: 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 f == (Tcl_Channe
2150: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 l) NULL) {..retu
2160: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 rn 0;. }.
2170: 72 65 74 75 72 6e 20 74 6f 57 72 69 74 65 3b 0a return toWrite;.
2180: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d }../*. *--------
2190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
21a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
21b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
21c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
21d0: 2a 0a 20 2a 20 44 69 67 65 73 74 53 65 74 4f 70 *. * DigestSetOp
21e0: 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 tionProc --. *.
21f0: 2a 09 43 61 6c 6c 65 64 20 62 79 20 74 68 65 20 *.Called by the
2200: 67 65 6e 65 72 69 63 20 49 4f 20 73 79 73 74 65 generic IO syste
2210: 6d 20 74 6f 20 73 65 74 20 63 68 61 6e 6e 65 6c m to set channel
2220: 20 6f 70 74 69 6f 6e 20 74 6f 20 76 61 6c 75 65 option to value
2230: 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a .. *. * Returns:
2240: 0a 20 2a 09 54 43 4c 5f 4f 4b 20 69 66 20 73 75 . *.TCL_OK if su
2250: 63 63 65 73 73 66 75 6c 20 6f 72 20 54 43 4c 5f ccessful or TCL_
2260: 45 52 52 4f 52 20 69 66 20 66 61 69 6c 65 64 2e ERROR if failed.
2270: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
2280: 63 74 73 3a 0a 20 2a 09 55 70 64 61 74 65 73 20 cts:. *.Updates
2290: 63 68 61 6e 6e 65 6c 20 6f 70 74 69 6f 6e 20 74 channel option t
22a0: 6f 20 6e 65 77 20 76 61 6c 75 65 2e 0a 20 2a 0a o new value.. *.
22b0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
22c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
22d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 2f 0a 73 74 61 --------. */.sta
2300: 74 69 63 20 69 6e 74 20 44 69 67 65 73 74 53 65 tic int DigestSe
2310: 74 4f 70 74 69 6f 6e 50 72 6f 63 28 43 6c 69 65 tOptionProc(Clie
2320: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
2330: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
2340: 6e 74 65 72 70 2c 20 63 6f 6e 73 74 20 63 68 61 nterp, const cha
2350: 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c 0a 09 r *optionName,..
2360: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70 74 69 const char *opti
2370: 6f 6e 56 61 6c 75 65 29 20 7b 0a 20 20 20 20 44 onValue) {. D
2380: 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 igestState *stat
2390: 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 ePtr = (DigestSt
23a0: 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 ate *) clientDat
23b0: 61 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e a;. Tcl_Chann
23c0: 65 6c 20 70 61 72 65 6e 74 3b 0a 20 20 20 20 54 el parent;. T
23d0: 63 6c 5f 44 72 69 76 65 72 53 65 74 4f 70 74 69 cl_DriverSetOpti
23e0: 6f 6e 50 72 6f 63 20 2a 73 65 74 4f 70 74 69 6f onProc *setOptio
23f0: 6e 50 72 6f 63 3b 0a 0a 20 20 20 20 69 66 20 28 nProc;.. if (
2400: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d statePtr->self =
2410: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
2420: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
2430: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
2440: 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 67 61 74 .. /* Delegat
2450: 65 20 6f 70 74 69 6f 6e 73 20 64 6f 77 6e 73 74 e options downst
2460: 72 65 61 6d 20 2a 2f 0a 20 20 20 20 70 61 72 65 ream */. pare
2470: 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 63 nt = Tcl_GetStac
2480: 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 kedChannel(state
2490: 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 20 Ptr->self);.
24a0: 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 3d 20 setOptionProc =
24b0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 53 65 74 4f 70 Tcl_ChannelSetOp
24c0: 74 69 6f 6e 50 72 6f 63 28 54 63 6c 5f 47 65 74 tionProc(Tcl_Get
24d0: 43 68 61 6e 6e 65 6c 54 79 70 65 28 70 61 72 65 ChannelType(pare
24e0: 6e 74 29 29 3b 0a 20 20 20 20 69 66 20 28 73 65 nt));. if (se
24f0: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 21 3d 20 4e tOptionProc != N
2500: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 28 ULL) {..return (
2510: 2a 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 29 28 *setOptionProc)(
2520: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e Tcl_GetChannelIn
2530: 73 74 61 6e 63 65 44 61 74 61 28 70 61 72 65 6e stanceData(paren
2540: 74 29 2c 20 69 6e 74 65 72 70 2c 20 6f 70 74 69 t), interp, opti
2550: 6f 6e 4e 61 6d 65 2c 20 6f 70 74 69 6f 6e 56 61 onName, optionVa
2560: 6c 75 65 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 lue);. } else
2570: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
2580: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f RROR;. }.}../
2590: 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
25c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
25d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
25e0: 20 44 69 67 65 73 74 47 65 74 4f 70 74 69 6f 6e DigestGetOption
25f0: 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 Proc --. *. *.Ca
2600: 6c 6c 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 lled by the gene
2610: 72 69 63 20 49 4f 20 73 79 73 74 65 6d 20 74 6f ric IO system to
2620: 20 67 65 74 20 63 68 61 6e 6e 65 6c 20 6f 70 74 get channel opt
2630: 69 6f 6e 27 73 20 76 61 6c 75 65 2e 0a 20 2a 0a ion's value.. *.
2640: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 * Returns:. *.T
2650: 43 4c 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 CL_OK if success
2660: 66 75 6c 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 ful or TCL_ERROR
2670: 20 69 66 20 66 61 69 6c 65 64 2e 0a 20 2a 0a 20 if failed.. *.
2680: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
2690: 20 2a 09 53 65 74 73 20 72 65 73 75 6c 74 20 74 *.Sets result t
26a0: 6f 20 6f 70 74 69 6f 6e 27 73 20 76 61 6c 75 65 o option's value
26b0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
26c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
26d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
26e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
26f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
2700: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 69 67 65 .static int Dige
2710: 73 74 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 stGetOptionProc(
2720: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
2730: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
2740: 70 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74 p *interp, const
2750: 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d char *optionNam
2760: 65 2c 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 20 e,..Tcl_DString
2770: 2a 6f 70 74 69 6f 6e 56 61 6c 75 65 29 20 7b 0a *optionValue) {.
2780: 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20 DigestState
2790: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 *statePtr = (Dig
27a0: 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 estState *) clie
27b0: 6e 74 44 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f ntData;. Tcl_
27c0: 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 3b 0a Channel parent;.
27d0: 20 20 20 20 54 63 6c 5f 44 72 69 76 65 72 47 65 Tcl_DriverGe
27e0: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2a 67 65 74 tOptionProc *get
27f0: 4f 70 74 69 6f 6e 50 72 6f 63 3b 0a 0a 20 20 20 OptionProc;..
2800: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 if (statePtr->s
2810: 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e elf == (Tcl_Chan
2820: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 nel) NULL) {..re
2830: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
2840: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 }.. /* De
2850: 6c 65 67 61 74 65 20 6f 70 74 69 6f 6e 73 20 64 legate options d
2860: 6f 77 6e 73 74 72 65 61 6d 20 2a 2f 0a 20 20 20 ownstream */.
2870: 20 70 61 72 65 6e 74 20 3d 20 54 63 6c 5f 47 65 parent = Tcl_Ge
2880: 74 53 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 tStackedChannel(
2890: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b statePtr->self);
28a0: 0a 20 20 20 20 67 65 74 4f 70 74 69 6f 6e 50 72 . getOptionPr
28b0: 6f 63 20 3d 20 54 63 6c 5f 43 68 61 6e 6e 65 6c oc = Tcl_Channel
28c0: 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 54 63 GetOptionProc(Tc
28d0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 l_GetChannelType
28e0: 28 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 69 (parent));. i
28f0: 66 20 28 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 f (getOptionProc
2900: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 != NULL) {..ret
2910: 75 72 6e 20 28 2a 67 65 74 4f 70 74 69 6f 6e 50 urn (*getOptionP
2920: 72 6f 63 29 28 54 63 6c 5f 47 65 74 43 68 61 6e roc)(Tcl_GetChan
2930: 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 nelInstanceData(
2940: 70 61 72 65 6e 74 29 2c 20 69 6e 74 65 72 70 2c parent), interp,
2950: 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 6f 70 74 optionName, opt
2960: 69 6f 6e 56 61 6c 75 65 29 3b 0a 20 20 20 20 7d ionValue);. }
2970: 20 65 6c 73 65 20 69 66 20 28 6f 70 74 69 6f 6e else if (option
2980: 4e 61 6d 65 20 3d 3d 20 28 63 68 61 72 2a 29 20 Name == (char*)
2990: 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 52 65 71 75 NULL) {../* Requ
29a0: 65 73 74 20 69 73 20 71 75 65 72 79 20 66 6f 72 est is query for
29b0: 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 2c 20 74 68 all options, th
29c0: 69 73 20 69 73 20 6f 6b 2e 20 2a 2f 0a 09 72 65 is is ok. */..re
29d0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 turn TCL_OK;.
29e0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 71 75 65 }.. /* Reque
29f0: 73 74 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 st for a specifi
2a00: 63 20 6f 70 74 69 6f 6e 20 68 61 73 20 74 6f 20 c option has to
2a10: 66 61 69 6c 2c 20 77 65 20 64 6f 6e 27 74 20 68 fail, we don't h
2a20: 61 76 65 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 ave any. */.
2a30: 72 65 74 75 72 6e 20 54 63 6c 5f 42 61 64 43 68 return Tcl_BadCh
2a40: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
2a50: 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 rp, optionName,
2a60: 22 22 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d "");.}../*. *---
2a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ab0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 ---. *. * Digest
2ac0: 54 69 6d 65 72 48 61 6e 64 6c 65 72 20 2d 2d 0a TimerHandler --.
2ad0: 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79 20 *. *.Called by
2ae0: 74 68 65 20 6e 6f 74 69 66 69 65 72 20 76 69 61 the notifier via
2af0: 20 74 69 6d 65 72 20 74 6f 20 66 6c 75 73 68 20 timer to flush
2b00: 6f 75 74 20 70 65 6e 64 69 6e 67 20 69 6e 70 75 out pending inpu
2b10: 74 20 64 61 74 61 2e 0a 20 2a 0a 20 2a 20 52 65 t data.. *. * Re
2b20: 74 75 72 6e 73 3a 0a 20 2a 09 4e 6f 74 68 69 6e turns:. *.Nothin
2b30: 67 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 g. *. * Side eff
2b40: 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 63 61 6c ects:. *.May cal
2b50: 6c 20 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61 6e l Tcl_NotifyChan
2b60: 6e 65 6c 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d nel. *. *-------
2b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
2bb0: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 */.static void
2bc0: 44 69 67 65 73 74 54 69 6d 65 72 48 61 6e 64 6c DigestTimerHandl
2bd0: 65 72 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c er(ClientData cl
2be0: 69 65 6e 74 44 61 74 61 29 20 7b 0a 20 20 20 20 ientData) {.
2bf0: 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 DigestState *sta
2c00: 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 tePtr = (DigestS
2c10: 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 tate *) clientDa
2c20: 74 61 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 ta;.. if (sta
2c30: 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 tePtr->self == (
2c40: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c Tcl_Channel) NUL
2c50: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 L) {..return;.
2c60: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 }.. /* Clea
2c70: 72 20 74 69 6d 65 72 20 74 6f 6b 65 6e 20 2a 2f r timer token */
2c80: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 74 . statePtr->t
2c90: 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 imer = (Tcl_Time
2ca0: 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 0a 20 rToken) NULL;..
2cb0: 20 20 20 2f 2a 20 46 69 72 65 20 65 76 65 6e 74 /* Fire event
2cc0: 20 69 66 20 74 68 65 72 65 20 69 73 20 70 65 6e if there is pen
2cd0: 64 69 6e 67 20 64 61 74 61 2c 20 73 6b 69 70 20 ding data, skip
2ce0: 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 20 otherwise */.
2cf0: 20 69 66 20 28 28 73 74 61 74 65 50 74 72 2d 3e if ((statePtr->
2d00: 77 61 74 63 68 4d 61 73 6b 20 26 20 54 43 4c 5f watchMask & TCL_
2d10: 52 45 41 44 41 42 4c 45 29 20 26 26 20 28 54 63 READABLE) && (Tc
2d20: 6c 5f 49 6e 70 75 74 42 75 66 66 65 72 65 64 28 l_InputBuffered(
2d30: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 20 statePtr->self)
2d40: 3e 20 30 29 29 20 7b 0a 09 54 63 6c 5f 4e 6f 74 > 0)) {..Tcl_Not
2d50: 69 66 79 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 ifyChannel(state
2d60: 50 74 72 2d 3e 73 65 6c 66 2c 20 54 43 4c 5f 52 Ptr->self, TCL_R
2d70: 45 41 44 41 42 4c 45 29 3b 0a 20 20 20 20 7d 0a EADABLE);. }.
2d80: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d }../*. *--------
2d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
2dd0: 2a 0a 20 2a 20 44 69 67 65 73 74 57 61 74 63 68 *. * DigestWatch
2de0: 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 49 6e Proc --. *. *.In
2df0: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 6f 74 itialize the not
2e00: 69 66 69 65 72 20 74 6f 20 77 61 74 63 68 20 66 ifier to watch f
2e10: 6f 72 20 65 76 65 6e 74 73 20 66 72 6f 6d 20 74 or events from t
2e20: 68 69 73 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a his channel.. *.
2e30: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 4e * Returns:. *.N
2e40: 6f 74 68 69 6e 67 0a 20 2a 0a 20 2a 20 53 69 64 othing. *. * Sid
2e50: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 6f e effects:. *.Co
2e60: 6e 66 69 67 75 72 65 20 6e 6f 74 69 66 69 65 72 nfigure notifier
2e70: 20 73 6f 20 66 75 74 75 72 65 20 65 76 65 6e 74 so future event
2e80: 73 20 6f 6e 20 74 68 65 20 63 68 61 6e 6e 65 6c s on the channel
2e90: 20 77 69 6c 6c 20 62 65 20 73 65 65 6e 20 62 79 will be seen by
2ea0: 20 54 63 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d Tcl.. *. *-----
2eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ef0: 2d 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52 45 -. */.#define RE
2f00: 41 44 5f 44 45 4c 41 59 09 35 0a 76 6f 69 64 20 AD_DELAY.5.void
2f10: 44 69 67 65 73 74 57 61 74 63 68 50 72 6f 63 28 DigestWatchProc(
2f20: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
2f30: 74 44 61 74 61 2c 20 69 6e 74 20 6d 61 73 6b 29 tData, int mask)
2f40: 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 {. DigestSta
2f50: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 te *statePtr = (
2f60: 44 69 67 65 73 74 53 74 61 74 65 20 2a 29 20 63 DigestState *) c
2f70: 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 54 lientData;. T
2f80: 63 6c 5f 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e cl_Channel paren
2f90: 74 3b 0a 20 20 20 20 54 63 6c 5f 44 72 69 76 65 t;. Tcl_Drive
2fa0: 72 57 61 74 63 68 50 72 6f 63 20 2a 77 61 74 63 rWatchProc *watc
2fb0: 68 50 72 6f 63 3b 0a 0a 20 20 20 20 69 66 20 28 hProc;.. if (
2fc0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d statePtr->self =
2fd0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
2fe0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 3b NULL) {..return;
2ff0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 . }.. /* S
3000: 74 6f 72 65 20 4f 52 2d 65 64 20 63 6f 6d 62 69 tore OR-ed combi
3010: 6e 61 74 69 6f 6e 20 6f 66 20 54 43 4c 5f 52 45 nation of TCL_RE
3020: 41 44 41 42 4c 45 2c 20 54 43 4c 5f 57 52 49 54 ADABLE, TCL_WRIT
3030: 41 42 4c 45 20 61 6e 64 20 54 43 4c 5f 45 58 43 ABLE and TCL_EXC
3040: 45 50 54 49 4f 4e 20 2a 2f 0a 20 20 20 20 73 74 EPTION */. st
3050: 61 74 65 50 74 72 2d 3e 77 61 74 63 68 4d 61 73 atePtr->watchMas
3060: 6b 20 3d 20 6d 61 73 6b 3b 0a 0a 20 20 20 20 2f k = mask;.. /
3070: 2a 20 50 72 6f 70 61 67 61 74 65 20 6d 61 73 6b * Propagate mask
3080: 20 69 6e 66 6f 20 74 6f 20 70 61 72 65 6e 74 20 info to parent
3090: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 70 channel */. p
30a0: 61 72 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 arent = Tcl_GetS
30b0: 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 tackedChannel(st
30c0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 20 atePtr->self);.
30d0: 20 20 20 77 61 74 63 68 50 72 6f 63 20 3d 20 54 watchProc = T
30e0: 63 6c 5f 43 68 61 6e 6e 65 6c 57 61 74 63 68 50 cl_ChannelWatchP
30f0: 72 6f 63 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e roc(Tcl_GetChann
3100: 65 6c 54 79 70 65 28 70 61 72 65 6e 74 29 29 3b elType(parent));
3110: 0a 20 20 20 20 77 61 74 63 68 50 72 6f 63 28 54 . watchProc(T
3120: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 cl_GetChannelIns
3130: 74 61 6e 63 65 44 61 74 61 28 70 61 72 65 6e 74 tanceData(parent
3140: 29 2c 20 6d 61 73 6b 29 3b 0a 0a 20 20 20 20 2f ), mask);.. /
3150: 2a 20 52 65 6d 6f 76 65 20 70 65 6e 64 69 6e 67 * Remove pending
3160: 20 74 69 6d 65 72 20 2a 2f 0a 20 20 20 20 69 66 timer */. if
3170: 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 (statePtr->time
3180: 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 r != (Tcl_TimerT
3190: 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 oken) NULL) {..T
31a0: 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 cl_DeleteTimerHa
31b0: 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e ndler(statePtr->
31c0: 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 timer);..statePt
31d0: 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f r->timer = (Tcl_
31e0: 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c TimerToken) NULL
31f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
3200: 49 66 20 74 68 65 72 65 20 69 73 20 64 61 74 61 If there is data
3210: 20 70 65 6e 64 69 6e 67 2c 20 73 65 74 20 6e 65 pending, set ne
3220: 77 20 74 69 6d 65 72 20 74 6f 20 63 61 6c 6c 20 w timer to call
3230: 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61 6e 6e 65 Tcl_NotifyChanne
3240: 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 6d 61 l */. if ((ma
3250: 73 6b 20 26 20 54 43 4c 5f 52 45 41 44 41 42 4c sk & TCL_READABL
3260: 45 29 20 26 26 20 28 54 63 6c 5f 49 6e 70 75 74 E) && (Tcl_Input
3270: 42 75 66 66 65 72 65 64 28 73 74 61 74 65 50 74 Buffered(statePt
3280: 72 2d 3e 73 65 6c 66 29 20 3e 20 30 29 29 20 7b r->self) > 0)) {
3290: 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 ..statePtr->time
32a0: 72 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 54 69 r = Tcl_CreateTi
32b0: 6d 65 72 48 61 6e 64 6c 65 72 28 52 45 41 44 5f merHandler(READ_
32c0: 44 45 4c 41 59 2c 20 44 69 67 65 73 74 54 69 6d DELAY, DigestTim
32d0: 65 72 48 61 6e 64 6c 65 72 2c 20 28 43 6c 69 65 erHandler, (Clie
32e0: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 ntData) statePtr
32f0: 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20 );. }.}../*.
3300: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
3310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3340: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 -------. *. * Di
3350: 67 65 73 74 47 65 74 48 61 6e 64 6c 65 50 72 6f gestGetHandlePro
3360: 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 c --. *. *.Calle
3370: 64 20 66 72 6f 6d 20 54 63 6c 5f 47 65 74 43 68 d from Tcl_GetCh
3380: 61 6e 6e 65 6c 48 61 6e 64 6c 65 20 74 6f 20 72 annelHandle to r
3390: 65 74 72 69 65 76 65 20 4f 53 20 73 70 65 63 69 etrieve OS speci
33a0: 66 69 63 20 66 69 6c 65 20 68 61 6e 64 6c 65 0a fic file handle.
33b0: 20 2a 09 66 72 6f 6d 20 69 6e 73 69 64 65 20 74 *.from inside t
33c0: 68 69 73 20 63 68 61 6e 6e 65 6c 2e 20 4e 6f 74 his channel. Not
33d0: 20 75 73 65 64 20 66 6f 72 20 74 72 61 6e 73 66 used for transf
33e0: 6f 72 6d 61 74 69 6f 6e 73 3f 0a 20 2a 0a 20 2a ormations?. *. *
33f0: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 49 66 20 Returns:. *.If
3400: 64 69 72 65 63 74 69 6f 6e 20 69 73 20 54 43 4c direction is TCL
3410: 5f 52 45 41 44 41 42 4c 45 20 72 65 74 75 72 6e _READABLE return
3420: 20 74 68 65 20 68 61 6e 64 6c 65 20 75 73 65 64 the handle used
3430: 20 66 6f 72 20 69 6e 70 75 74 2c 20 6f 72 20 69 for input, or i
3440: 66 0a 20 2a 09 54 43 4c 5f 57 52 49 54 41 42 4c f. *.TCL_WRITABL
3450: 45 20 72 65 74 75 72 6e 20 74 68 65 20 68 61 6e E return the han
3460: 64 6c 65 20 75 73 65 64 20 66 6f 72 20 6f 75 74 dle used for out
3470: 70 75 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 put.. *. * Side
3480: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 effects:. *.None
3490: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
34a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
34e0: 0a 69 6e 74 20 44 69 67 65 73 74 47 65 74 48 61 .int DigestGetHa
34f0: 6e 64 6c 65 50 72 6f 63 28 43 6c 69 65 6e 74 44 ndleProc(ClientD
3500: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
3510: 69 6e 74 20 64 69 72 65 63 74 69 6f 6e 2c 20 43 int direction, C
3520: 6c 69 65 6e 74 44 61 74 61 20 2a 68 61 6e 64 6c lientData *handl
3530: 65 50 74 72 29 20 7b 0a 20 20 20 20 44 69 67 65 ePtr) {. Dige
3540: 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 stState *statePt
3550: 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 r = (DigestState
3560: 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a *) clientData;.
3570: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
3580: 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f r->self == (Tcl_
3590: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
35a0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
35b0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 OR;. }. re
35c0: 74 75 72 6e 20 54 63 6c 5f 47 65 74 43 68 61 6e turn Tcl_GetChan
35d0: 6e 65 6c 48 61 6e 64 6c 65 28 54 63 6c 5f 47 65 nelHandle(Tcl_Ge
35e0: 74 53 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 tStackedChannel(
35f0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c statePtr->self),
3600: 20 64 69 72 65 63 74 69 6f 6e 2c 20 68 61 6e 64 direction, hand
3610: 6c 65 50 74 72 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a lePtr);.}../*. *
3620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3660: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 ------. *. * Dig
3670: 65 73 74 4e 6f 74 69 66 79 50 72 6f 63 20 2d 2d estNotifyProc --
3680: 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79 . *. *.Called by
3690: 20 54 63 6c 20 74 6f 20 69 6e 66 6f 72 6d 20 75 Tcl to inform u
36a0: 73 20 6f 66 20 61 63 74 69 76 69 74 79 20 6f 6e s of activity on
36b0: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 the underlying
36c0: 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 channel.. *. * R
36d0: 65 74 75 72 6e 73 3a 0a 20 2a 09 55 6e 63 68 61 eturns:. *.Uncha
36e0: 6e 67 65 64 20 69 6e 74 65 72 65 73 74 4d 61 73 nged interestMas
36f0: 6b 20 77 68 69 63 68 20 69 73 20 61 6e 20 4f 52 k which is an OR
3700: 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 -ed combination
3710: 6f 66 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 of TCL_READABLE
3720: 6f 72 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 0a or TCL_WRITABLE.
3730: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
3740: 74 73 3a 0a 20 2a 09 43 61 6e 63 65 6c 73 20 61 ts:. *.Cancels a
3750: 6e 79 20 70 65 6e 64 69 6e 67 20 74 69 6d 65 72 ny pending timer
3760: 2e 0a 20 2a 0a 20 2a 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 2d 2d 2d 2d 2d ----------------
37a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
37b0: 2f 0a 69 6e 74 20 44 69 67 65 73 74 4e 6f 74 69 /.int DigestNoti
37c0: 66 79 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 fyProc(ClientDat
37d0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e a clientData, in
37e0: 74 20 69 6e 74 65 72 65 73 74 4d 61 73 6b 29 20 t interestMask)
37f0: 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74 {. DigestStat
3800: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44 e *statePtr = (D
3810: 69 67 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c igestState *) cl
3820: 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 2f ientData;.. /
3830: 2a 20 53 6b 69 70 20 74 69 6d 65 72 20 65 76 65 * Skip timer eve
3840: 6e 74 20 61 73 20 72 65 64 75 6e 64 61 6e 74 20 nt as redundant
3850: 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 */. if (state
3860: 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 Ptr->timer != (T
3870: 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e cl_TimerToken) N
3880: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 ULL) {..Tcl_Dele
3890: 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 teTimerHandler(s
38a0: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b tatePtr->timer);
38b0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 ..statePtr->time
38c0: 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f r = (Tcl_TimerTo
38d0: 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d ken) NULL;. }
38e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 69 6e 74 65 . return inte
38f0: 72 65 73 74 4d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a restMask;.}../*.
3900: 20 2a 0a 20 2a 20 43 68 61 6e 6e 65 6c 20 74 79 *. * Channel ty
3910: 70 65 20 73 74 72 75 63 74 75 72 65 20 64 65 66 pe structure def
3920: 69 6e 69 74 69 6f 6e 20 66 6f 72 20 64 69 67 65 inition for dige
3930: 73 74 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f st transformatio
3940: 6e 73 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 ns.. *. */.stati
3950: 63 20 63 6f 6e 73 74 20 54 63 6c 5f 43 68 61 6e c const Tcl_Chan
3960: 6e 65 6c 54 79 70 65 20 64 69 67 65 73 74 43 68 nelType digestCh
3970: 61 6e 6e 65 6c 54 79 70 65 20 3d 20 7b 0a 20 20 annelType = {.
3980: 20 20 22 64 69 67 65 73 74 22 2c 09 09 09 2f 2a "digest",.../*
3990: 20 54 79 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 Type name */.
39a0: 20 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 TCL_CHANNEL_VE
39b0: 52 53 49 4f 4e 5f 35 2c 09 2f 2a 20 76 35 20 63 RSION_5,./* v5 c
39c0: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 44 69 hannel */. Di
39d0: 67 65 73 74 43 6c 6f 73 65 50 72 6f 63 2c 09 09 gestCloseProc,..
39e0: 2f 2a 20 43 6c 6f 73 65 20 70 72 6f 63 20 2a 2f /* Close proc */
39f0: 0a 20 20 20 20 44 69 67 65 73 74 49 6e 70 75 74 . DigestInput
3a00: 50 72 6f 63 2c 09 09 2f 2a 20 49 6e 70 75 74 20 Proc,../* Input
3a10: 70 72 6f 63 20 2a 2f 0a 20 20 20 20 44 69 67 65 proc */. Dige
3a20: 73 74 4f 75 74 70 75 74 50 72 6f 63 2c 09 09 2f stOutputProc,../
3a30: 2a 20 4f 75 74 70 75 74 20 70 72 6f 63 20 2a 2f * Output proc */
3a40: 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 . NULL,.../*
3a50: 53 65 65 6b 20 70 72 6f 63 20 2a 2f 0a 20 20 20 Seek proc */.
3a60: 20 44 69 67 65 73 74 53 65 74 4f 70 74 69 6f 6e DigestSetOption
3a70: 50 72 6f 63 2c 09 2f 2a 20 53 65 74 20 6f 70 74 Proc,./* Set opt
3a80: 69 6f 6e 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 ion proc */.
3a90: 44 69 67 65 73 74 47 65 74 4f 70 74 69 6f 6e 50 DigestGetOptionP
3aa0: 72 6f 63 2c 09 2f 2a 20 47 65 74 20 6f 70 74 69 roc,./* Get opti
3ab0: 6f 6e 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 44 on proc */. D
3ac0: 69 67 65 73 74 57 61 74 63 68 50 72 6f 63 2c 09 igestWatchProc,.
3ad0: 09 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6e ./* Initialize n
3ae0: 6f 74 69 66 69 65 72 20 2a 2f 0a 20 20 20 20 44 otifier */. D
3af0: 69 67 65 73 74 47 65 74 48 61 6e 64 6c 65 50 72 igestGetHandlePr
3b00: 6f 63 2c 09 2f 2a 20 47 65 74 20 4f 53 20 68 61 oc,./* Get OS ha
3b10: 6e 64 6c 65 73 20 6f 75 74 20 6f 66 20 63 68 61 ndles out of cha
3b20: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 44 69 67 65 nnel */. Dige
3b30: 73 74 43 6c 6f 73 65 32 50 72 6f 63 2c 09 09 2f stClose2Proc,../
3b40: 2a 20 63 6c 6f 73 65 32 70 72 6f 63 20 2a 2f 0a * close2proc */.
3b50: 20 20 20 20 44 69 67 65 73 74 42 6c 6f 63 6b 4d DigestBlockM
3b60: 6f 64 65 50 72 6f 63 2c 09 2f 2a 20 53 65 74 20 odeProc,./* Set
3b70: 62 6c 6f 63 6b 69 6e 67 2f 6e 6f 6e 62 6c 6f 63 blocking/nonbloc
3b80: 6b 69 6e 67 20 6d 6f 64 65 2a 2f 0a 20 20 20 20 king mode*/.
3b90: 4e 55 4c 4c 2c 09 09 09 2f 2a 20 46 6c 75 73 68 NULL,.../* Flush
3ba0: 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 44 69 67 proc */. Dig
3bb0: 65 73 74 4e 6f 74 69 66 79 50 72 6f 63 2c 09 09 estNotifyProc,..
3bc0: 2f 2a 20 48 61 6e 64 6c 69 6e 67 20 6f 66 20 65 /* Handling of e
3bd0: 76 65 6e 74 73 20 62 75 62 62 6c 69 6e 67 20 75 vents bubbling u
3be0: 70 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 p */. NULL,..
3bf0: 09 2f 2a 20 57 69 64 65 20 73 65 65 6b 20 70 72 ./* Wide seek pr
3c00: 6f 63 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 oc */. NULL,.
3c10: 09 09 2f 2a 20 54 68 72 65 61 64 20 61 63 74 69 ../* Thread acti
3c20: 6f 6e 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 09 09 on */. NULL..
3c30: 09 2f 2a 20 54 72 75 6e 63 61 74 65 20 2a 2f 0a ./* Truncate */.
3c40: 7d 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d };../*. *-------
3c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
3c90: 20 2a 0a 20 2a 20 44 69 67 65 73 74 43 68 61 6e *. * DigestChan
3ca0: 6e 65 6c 20 2d 2d 0a 20 2a 0a 20 2a 09 43 72 65 nel --. *. *.Cre
3cb0: 61 74 65 20 61 20 73 74 61 63 6b 65 64 20 63 68 ate a stacked ch
3cc0: 61 6e 6e 65 6c 20 66 6f 72 20 61 20 6d 65 73 73 annel for a mess
3cd0: 61 67 65 20 64 69 67 65 73 74 20 74 72 61 6e 73 age digest trans
3ce0: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a formation.. *. *
3cf0: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c Returns:. *.TCL
3d00: 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 _OK or TCL_ERROR
3d10: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
3d20: 63 74 73 3a 0a 20 2a 09 41 64 64 73 20 74 72 61 cts:. *.Adds tra
3d30: 6e 73 66 6f 72 6d 20 74 6f 20 63 68 61 6e 6e 65 nsform to channe
3d40: 6c 20 61 6e 64 20 73 65 74 73 20 72 65 73 75 6c l and sets resul
3d50: 74 20 74 6f 20 63 68 61 6e 6e 65 6c 20 6e 61 6d t to channel nam
3d60: 65 20 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 e or error messa
3d70: 67 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ge.. *. *-------
3d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
3dc0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 44 */.static int.D
3dd0: 69 67 65 73 74 43 68 61 6e 6e 65 6c 28 54 63 6c igestChannel(Tcl
3de0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
3df0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 68 61 const char *cha
3e00: 6e 6e 65 6c 2c 20 63 6f 6e 73 74 20 45 56 50 5f nnel, const EVP_
3e10: 4d 44 20 2a 6d 64 2c 20 69 6e 74 20 66 6f 72 6d MD *md, int form
3e20: 61 74 29 20 7b 0a 20 20 20 20 69 6e 74 20 6d 6f at) {. int mo
3e30: 64 65 3b 20 2f 2a 20 4f 52 2d 65 64 20 63 6f 6d de; /* OR-ed com
3e40: 62 69 6e 61 74 69 6f 6e 20 6f 66 20 54 43 4c 5f bination of TCL_
3e50: 52 45 41 44 41 42 4c 45 20 61 6e 64 20 54 43 4c READABLE and TCL
3e60: 5f 57 52 49 54 41 42 4c 45 20 2a 2f 0a 20 20 20 _WRITABLE */.
3e70: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 Tcl_Channel cha
3e80: 6e 3b 0a 20 20 20 20 45 56 50 5f 4d 44 5f 43 54 n;. EVP_MD_CT
3e90: 58 20 2a 63 74 78 3b 0a 20 20 20 20 44 69 67 65 X *ctx;. Dige
3ea0: 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 stState *statePt
3eb0: 72 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 r;.. /* Valid
3ec0: 61 74 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 ate args */.
3ed0: 69 66 20 28 63 68 61 6e 6e 65 6c 20 3d 3d 20 28 if (channel == (
3ee0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 4e 55 const char *) NU
3ef0: 4c 4c 20 7c 7c 20 6d 64 20 3d 3d 20 28 63 6f 6e LL || md == (con
3f00: 73 74 20 45 56 50 5f 4d 44 20 2a 29 20 4e 55 4c st EVP_MD *) NUL
3f10: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c L) {..return TCL
3f20: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
3f30: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 chan = Tcl_Ge
3f40: 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c tChannel(interp,
3f50: 20 63 68 61 6e 6e 65 6c 2c 20 26 6d 6f 64 65 29 channel, &mode)
3f60: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d ;. if (chan =
3f70: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
3f80: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
3f90: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
3fa0: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 .. /* Make su
3fb0: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e re to operate on
3fc0: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
3fd0: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e nnel */. chan
3fe0: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 = Tcl_GetTopCha
3ff0: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 nnel(chan);..
4000: 20 2f 2a 20 43 72 65 61 74 65 20 69 6e 74 65 72 /* Create inter
4010: 6e 61 6c 20 73 74 6f 72 61 67 65 20 73 74 72 75 nal storage stru
4020: 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 63 74 ctures */. ct
4030: 78 20 3d 20 45 56 50 5f 4d 44 5f 43 54 58 5f 6e x = EVP_MD_CTX_n
4040: 65 77 28 29 3b 0a 20 20 20 20 73 74 61 74 65 50 ew();. stateP
4050: 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 tr = (DigestStat
4060: 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e e *) ckalloc((un
4070: 73 69 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 44 signed) sizeof(D
4080: 69 67 65 73 74 53 74 61 74 65 29 29 3b 0a 20 20 igestState));.
4090: 20 20 69 66 20 28 63 74 78 20 21 3d 20 4e 55 4c if (ctx != NUL
40a0: 4c 20 26 26 20 73 74 61 74 65 50 74 72 20 21 3d L && statePtr !=
40b0: 20 4e 55 4c 4c 29 20 7b 0a 09 6d 65 6d 73 65 74 NULL) {..memset
40c0: 28 73 74 61 74 65 50 74 72 2c 20 30 2c 20 73 69 (statePtr, 0, si
40d0: 7a 65 6f 66 28 44 69 67 65 73 74 53 74 61 74 65 zeof(DigestState
40e0: 29 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 73 ));..statePtr->s
40f0: 65 6c 66 09 3d 20 63 68 61 6e 3b 09 09 2f 2a 20 elf.= chan;../*
4100: 54 68 69 73 20 73 6f 63 6b 65 74 20 63 68 61 6e This socket chan
4110: 6e 65 6c 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 nel */..statePtr
4120: 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 ->timer = (Tcl_T
4130: 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b imerToken) NULL;
4140: 09 2f 2a 20 54 69 6d 65 72 20 74 6f 20 66 6c 75 ./* Timer to flu
4150: 73 68 20 64 61 74 61 20 2a 2f 0a 09 73 74 61 74 sh data */..stat
4160: 65 50 74 72 2d 3e 66 6c 61 67 73 20 3d 20 30 3b ePtr->flags = 0;
4170: 09 09 2f 2a 20 43 68 61 6e 20 63 6f 6e 66 69 67 ../* Chan config
4180: 20 66 6c 61 67 73 20 2a 2f 0a 09 73 74 61 74 65 flags */..state
4190: 50 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b 20 3d Ptr->watchMask =
41a0: 20 30 3b 09 2f 2a 20 43 75 72 72 65 6e 74 20 57 0;./* Current W
41b0: 61 74 63 68 50 72 6f 63 20 6d 61 73 6b 20 2a 2f atchProc mask */
41c0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 6d 6f 64 65 ..statePtr->mode
41d0: 09 3d 20 6d 6f 64 65 3b 09 09 2f 2a 20 43 75 72 .= mode;../* Cur
41e0: 72 65 6e 74 20 6d 6f 64 65 20 6f 66 20 70 61 72 rent mode of par
41f0: 65 6e 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 09 ent channel */..
4200: 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 statePtr->format
4210: 20 3d 20 66 6f 72 6d 61 74 3b 09 2f 2a 20 4f 75 = format;./* Ou
4220: 74 70 75 74 20 66 6f 72 6d 61 74 20 2a 2f 0a 09 tput format */..
4230: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
4240: 20 3d 20 69 6e 74 65 72 70 3b 09 2f 2a 20 43 75 = interp;./* Cu
4250: 72 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65 rrent interprete
4260: 72 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e r */..statePtr->
4270: 63 74 78 20 3d 20 63 74 78 3b 09 09 2f 2a 20 53 ctx = ctx;../* S
4280: 53 4c 20 43 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 SL Context */.
4290: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f } else {..Tcl_
42a0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
42b0: 65 72 70 2c 20 22 49 6e 69 74 69 61 6c 69 7a 65 erp, "Initialize
42c0: 20 64 69 67 65 73 74 20 65 72 72 6f 72 3a 20 6d digest error: m
42d0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e emory allocation
42e0: 20 66 61 69 6c 75 72 65 22 2c 20 28 63 68 61 72 failure", (char
42f0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 45 56 50 5f *) NULL);..EVP_
4300: 4d 44 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 MD_CTX_free(ctx)
4310: 3b 0a 09 44 69 67 65 73 74 46 72 65 65 28 73 74 ;..DigestFree(st
4320: 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e atePtr);..return
4330: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
4340: 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 }.. /* Initia
4350: 6c 69 7a 65 20 64 69 67 65 73 74 20 2a 2f 0a 23 lize digest */.#
4360: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
4370: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 ON_NUMBER < 0x30
4380: 30 30 30 30 30 30 4c 0a 20 20 20 20 69 66 20 28 000000L. if (
4390: 21 45 56 50 5f 44 69 67 65 73 74 49 6e 69 74 5f !EVP_DigestInit_
43a0: 65 78 28 63 74 78 2c 20 6d 64 2c 20 4e 55 4c 4c ex(ctx, md, NULL
43b0: 29 29 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 20 )).#else. if
43c0: 28 21 45 56 50 5f 44 69 67 65 73 74 49 6e 69 74 (!EVP_DigestInit
43d0: 5f 65 78 32 28 63 74 78 2c 20 6d 64 2c 20 4e 55 _ex2(ctx, md, NU
43e0: 4c 4c 29 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 LL)).#endif.
43f0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
4400: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 49 6e 69 ult(interp, "Ini
4410: 74 69 61 6c 69 7a 65 20 64 69 67 65 73 74 20 65 tialize digest e
4420: 72 72 6f 72 3a 20 22 2c 20 52 45 41 53 4f 4e 28 rror: ", REASON(
4430: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ), (char *) NULL
4440: 29 3b 0a 09 45 56 50 5f 4d 44 5f 43 54 58 5f 66 );..EVP_MD_CTX_f
4450: 72 65 65 28 63 74 78 29 3b 0a 09 44 69 67 65 73 ree(ctx);..Diges
4460: 74 46 72 65 65 28 73 74 61 74 65 50 74 72 29 3b tFree(statePtr);
4470: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
4480: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
4490: 2a 20 43 6f 6e 66 69 67 75 72 65 20 63 68 61 6e * Configure chan
44a0: 6e 65 6c 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 nel */. Tcl_S
44b0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
44c0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d interp, chan, "-
44d0: 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62 translation", "b
44e0: 69 6e 61 72 79 22 29 3b 0a 20 20 20 20 69 66 20 inary");. if
44f0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 42 (Tcl_GetChannelB
4500: 75 66 66 65 72 53 69 7a 65 28 63 68 61 6e 29 20 ufferSize(chan)
4510: 3c 20 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a < EVP_MAX_MD_SIZ
4520: 45 20 2a 20 32 29 20 7b 0a 09 54 63 6c 5f 53 65 E * 2) {..Tcl_Se
4530: 74 43 68 61 6e 6e 65 6c 42 75 66 66 65 72 53 69 tChannelBufferSi
4540: 7a 65 28 63 68 61 6e 2c 20 45 56 50 5f 4d 41 58 ze(chan, EVP_MAX
4550: 5f 4d 44 5f 53 49 5a 45 20 2a 20 32 29 3b 0a 20 _MD_SIZE * 2);.
4560: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 74 61 }.. /* Sta
4570: 63 6b 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 ck channel */.
4580: 20 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 statePtr->self
4590: 20 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e = Tcl_StackChan
45a0: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 26 64 69 67 nel(interp, &dig
45b0: 65 73 74 43 68 61 6e 6e 65 6c 54 79 70 65 2c 20 estChannelType,
45c0: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 (ClientData) sta
45d0: 74 65 50 74 72 2c 20 6d 6f 64 65 2c 20 63 68 61 tePtr, mode, cha
45e0: 6e 29 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74 n);. if (stat
45f0: 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 ePtr->self == (T
4600: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c cl_Channel) NULL
4610: 29 20 7b 0a 09 45 56 50 5f 4d 44 5f 43 54 58 5f ) {..EVP_MD_CTX_
4620: 66 72 65 65 28 63 74 78 29 3b 0a 09 44 69 67 65 free(ctx);..Dige
4630: 73 74 46 72 65 65 28 73 74 61 74 65 50 74 72 29 stFree(statePtr)
4640: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
4650: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
4660: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e Tcl_SetResult(in
4670: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 20 54 terp, (char *) T
4680: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
4690: 65 28 63 68 61 6e 29 2c 20 54 43 4c 5f 56 4f 4c e(chan), TCL_VOL
46a0: 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 65 74 75 ATILE);. retu
46b0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a rn TCL_OK;.}../*
46c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
46d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
46e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
46f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
4700: 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d **/../*. *------
4710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
4750: 0a 20 2a 20 44 69 67 65 73 74 48 61 73 68 46 75 . * DigestHashFu
4760: 6e 63 74 69 6f 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 nction --. *. *.
4770: 20 43 61 6c 63 75 6c 61 74 65 20 6d 65 73 73 61 Calculate messa
4780: 67 65 20 64 69 67 65 73 74 20 75 73 69 6e 67 20 ge digest using
4790: 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 hash function..
47a0: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a *. * Returns:. *
47b0: 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 .TCL_OK or TCL_E
47c0: 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 RROR. *. * Side
47d0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 effects:. *.Sets
47e0: 20 72 65 73 75 6c 74 20 74 6f 20 6d 65 73 73 61 result to messa
47f0: 67 65 20 64 69 67 65 73 74 20 6f 72 20 65 72 72 ge digest or err
4800: 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a or message. *. *
4810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4850: 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 0a 44 69 67 65 ---. */.int.Dige
4860: 73 74 48 61 73 68 46 75 6e 63 74 69 6f 6e 28 54 stHashFunction(T
4870: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
4880: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
4890: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
48a0: 5b 5d 2c 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 [], const EVP_MD
48b0: 20 2a 6d 64 2c 20 69 6e 74 20 66 6f 72 6d 61 74 *md, int format
48c0: 29 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 64 61 ) {. char *da
48d0: 74 61 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b ta;. int len;
48e0: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e . unsigned in
48f0: 74 20 6d 64 5f 6c 65 6e 3b 0a 20 20 20 20 75 6e t md_len;. un
4900: 73 69 67 6e 65 64 20 63 68 61 72 20 6d 64 5f 62 signed char md_b
4910: 75 66 5b 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 uf[EVP_MAX_MD_SI
4920: 5a 45 5d 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 ZE];.. if (ob
4930: 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f jc != 2) {..Tcl_
4940: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
4950: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 64 erp, 1, objv, "d
4960: 61 74 61 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 ata");..return T
4970: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
4980: 0a 20 20 20 20 2f 2a 20 47 65 74 20 64 61 74 61 . /* Get data
4990: 20 2a 2f 0a 20 20 20 20 64 61 74 61 20 3d 20 54 */. data = T
49a0: 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 cl_GetByteArrayF
49b0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 romObj(objv[1],
49c0: 26 6c 65 6e 29 3b 0a 20 20 20 20 69 66 20 28 64 &len);. if (d
49d0: 61 74 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 6c ata == NULL || l
49e0: 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 54 63 6c 5f en == 0) {..Tcl_
49f0: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 SetResult(interp
4a00: 2c 20 22 4e 6f 20 64 61 74 61 22 2c 20 4e 55 4c , "No data", NUL
4a10: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f L);..return TCL_
4a20: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
4a30: 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 68 /* Calculate h
4a40: 61 73 68 20 76 61 6c 75 65 2c 20 63 72 65 61 74 ash value, creat
4a50: 65 20 62 69 6e 2f 68 65 78 20 72 65 70 72 65 73 e bin/hex repres
4a60: 65 6e 74 61 74 69 6f 6e 2c 20 61 6e 64 20 77 72 entation, and wr
4a70: 69 74 65 20 74 6f 20 72 65 73 75 6c 74 20 2a 2f ite to result */
4a80: 0a 20 20 20 20 69 66 20 28 45 56 50 5f 44 69 67 . if (EVP_Dig
4a90: 65 73 74 28 64 61 74 61 2c 20 28 73 69 7a 65 5f est(data, (size_
4aa0: 74 29 20 6c 65 6e 2c 20 6d 64 5f 62 75 66 2c 20 t) len, md_buf,
4ab0: 26 6d 64 5f 6c 65 6e 2c 20 6d 64 2c 20 4e 55 4c &md_len, md, NUL
4ac0: 4c 29 29 20 7b 0a 09 69 66 20 28 66 6f 72 6d 61 L)) {..if (forma
4ad0: 74 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 t == 0) {.. T
4ae0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
4af0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 interp, Tcl_NewB
4b00: 79 74 65 41 72 72 61 79 4f 62 6a 28 6d 64 5f 62 yteArrayObj(md_b
4b10: 75 66 2c 20 6d 64 5f 6c 65 6e 29 29 3b 0a 0a 09 uf, md_len));...
4b20: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 54 63 } else {.. Tc
4b30: 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a l_Obj *resultObj
4b40: 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b = Tcl_NewObj();
4b50: 0a 09 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 .. unsigned c
4b60: 68 61 72 20 2a 70 74 72 20 3d 20 54 63 6c 5f 53 har *ptr = Tcl_S
4b70: 65 74 42 79 74 65 41 72 72 61 79 4c 65 6e 67 74 etByteArrayLengt
4b80: 68 28 72 65 73 75 6c 74 4f 62 6a 2c 20 6d 64 5f h(resultObj, md_
4b90: 6c 65 6e 2a 32 29 3b 0a 0a 09 20 20 20 20 66 6f len*2);... fo
4ba0: 72 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 r (unsigned int
4bb0: 69 20 3d 20 30 3b 20 69 20 3c 20 6d 64 5f 6c 65 i = 0; i < md_le
4bc0: 6e 3b 20 69 2b 2b 29 20 7b 0a 09 09 2a 70 74 72 n; i++) {...*ptr
4bd0: 2b 2b 20 3d 20 68 65 78 5b 28 6d 64 5f 62 75 66 ++ = hex[(md_buf
4be0: 5b 69 5d 20 3e 3e 20 34 29 20 26 20 30 78 30 46 [i] >> 4) & 0x0F
4bf0: 5d 3b 0a 09 09 2a 70 74 72 2b 2b 20 3d 20 68 65 ];...*ptr++ = he
4c00: 78 5b 6d 64 5f 62 75 66 5b 69 5d 20 26 20 30 78 x[md_buf[i] & 0x
4c10: 30 46 5d 3b 0a 09 20 20 20 20 7d 0a 09 54 63 6c 0F];.. }..Tcl
4c20: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
4c30: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 29 terp, resultObj)
4c40: 3b 0a 09 7d 0a 0a 20 20 20 20 7d 20 65 6c 73 65 ;..}.. } else
4c50: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
4c60: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 48 61 sult(interp, "Ha
4c70: 73 68 20 63 61 6c 63 75 6c 61 74 69 6f 6e 20 65 sh calculation e
4c80: 72 72 6f 72 3a 22 2c 20 52 45 41 53 4f 4e 28 29 rror:", REASON()
4c90: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
4ca0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
4cb0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 ROR;. }. r
4cc0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a eturn TCL_OK;.}.
4cd0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
4ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
4d20: 44 69 67 65 73 74 4f 62 6a 43 6d 64 20 2d 2d 0a DigestObjCmd --.
4d30: 20 2a 0a 20 2a 09 52 65 74 75 72 6e 20 6d 65 73 *. *.Return mes
4d40: 73 61 67 65 20 64 69 67 65 73 74 20 75 73 69 6e sage digest usin
4d50: 67 20 75 73 65 72 20 73 70 65 63 69 66 69 65 64 g user specified
4d60: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 0a hash function..
4d70: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 *. * Returns:.
4d80: 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f *.TCL_OK or TCL_
4d90: 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 ERROR. *. * Side
4da0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 effects:. *.Set
4db0: 73 20 72 65 73 75 6c 74 20 74 6f 20 6d 65 73 73 s result to mess
4dc0: 61 67 65 20 64 69 67 65 73 74 20 6f 72 20 65 72 age digest or er
4dd0: 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 ror message. *.
4de0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
4df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4e20: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
4e30: 69 6e 74 0a 44 69 67 65 73 74 4f 62 6a 43 6d 64 int.DigestObjCmd
4e40: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
4e50: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ntData, Tcl_Inte
4e60: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
4e70: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 objc, Tcl_Obj *c
4e80: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 onst objv[]) {.
4e90: 20 20 20 69 6e 74 20 69 64 78 2c 20 6c 65 6e 2c int idx, len,
4ea0: 20 66 6f 72 6d 61 74 20 3d 20 31 2c 20 6b 65 79 format = 1, key
4eb0: 5f 6c 65 6e 20 3d 20 30 2c 20 64 61 74 61 5f 6c _len = 0, data_l
4ec0: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 en = 0;. cons
4ed0: 74 20 63 68 61 72 20 2a 64 69 67 65 73 74 6e 61 t char *digestna
4ee0: 6d 65 2c 20 2a 63 68 61 6e 6e 65 6c 20 3d 20 4e me, *channel = N
4ef0: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a ULL;. Tcl_Obj
4f00: 20 2a 64 61 74 61 4f 62 6a 20 3d 20 4e 55 4c 4c *dataObj = NULL
4f10: 2c 20 2a 66 69 6c 65 4f 62 6a 20 3d 20 4e 55 4c , *fileObj = NUL
4f20: 4c 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 L;. unsigned
4f30: 63 68 61 72 20 2a 6b 65 79 20 3d 20 4e 55 4c 4c char *key = NULL
4f40: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45 56 50 5f ;. const EVP_
4f50: 4d 44 20 2a 6d 64 3b 0a 0a 20 20 20 20 54 63 6c MD *md;.. Tcl
4f60: 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 _ResetResult(int
4f70: 65 72 70 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f erp);.. if (o
4f80: 62 6a 63 20 3c 20 33 20 7c 7c 20 6f 62 6a 63 20 bjc < 3 || objc
4f90: 3e 20 35 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e > 5) {..Tcl_Wron
4fa0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
4fb0: 20 31 2c 20 6f 62 6a 76 2c 20 22 74 79 70 65 20 1, objv, "type
4fc0: 3f 2d 62 69 6e 7c 2d 68 65 78 3f 20 5b 2d 63 68 ?-bin|-hex? [-ch
4fd0: 61 6e 6e 65 6c 20 63 68 61 6e 20 7c 20 2d 66 69 annel chan | -fi
4fe0: 6c 65 20 66 69 6c 65 6e 61 6d 65 20 7c 20 3f 2d le filename | ?-
4ff0: 64 61 74 61 3f 20 64 61 74 61 5d 22 29 3b 0a 09 data? data]");..
5000: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
5010: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
5020: 47 65 74 20 64 69 67 65 73 74 20 2a 2f 0a 20 20 Get digest */.
5030: 20 20 64 69 67 65 73 74 6e 61 6d 65 20 3d 20 54 digestname = T
5040: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
5050: 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 26 6c 65 Obj(objv[1], &le
5060: 6e 29 3b 0a 20 20 20 20 69 66 20 28 64 69 67 65 n);. if (dige
5070: 73 74 6e 61 6d 65 20 3d 3d 20 4e 55 4c 4c 20 7c stname == NULL |
5080: 7c 20 28 6d 64 20 3d 20 45 56 50 5f 67 65 74 5f | (md = EVP_get_
5090: 64 69 67 65 73 74 62 79 6e 61 6d 65 28 64 69 67 digestbyname(dig
50a0: 65 73 74 6e 61 6d 65 29 29 20 3d 3d 20 4e 55 4c estname)) == NUL
50b0: 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 L) {..Tcl_Append
50c0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
50d0: 49 6e 76 61 6c 69 64 20 64 69 67 65 73 74 20 74 Invalid digest t
50e0: 79 70 65 20 5c 22 22 2c 20 64 69 67 65 73 74 6e ype \"", digestn
50f0: 61 6d 65 2c 20 22 5c 22 22 2c 20 4e 55 4c 4c 29 ame, "\"", NULL)
5100: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
5110: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
5120: 2f 2a 20 4f 70 74 69 6d 61 6c 20 63 61 73 65 20 /* Optimal case
5130: 66 6f 72 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 for blob of data
5140: 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 */. if (objc
5150: 20 3d 3d 20 33 29 20 7b 0a 09 72 65 74 75 72 6e == 3) {..return
5160: 20 44 69 67 65 73 74 48 61 73 68 46 75 6e 63 74 DigestHashFunct
5170: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 2d 2d 6f 62 ion(interp, --ob
5180: 6a 63 2c 20 2b 2b 6f 62 6a 76 2c 20 6d 64 2c 20 jc, ++objv, md,
5190: 66 6f 72 6d 61 74 29 3b 0a 20 20 20 20 7d 0a 0a format);. }..
51a0: 20 20 20 20 2f 2a 20 47 65 74 20 6f 70 74 69 6f /* Get optio
51b0: 6e 73 20 2a 2f 0a 20 20 20 20 66 6f 72 20 28 69 ns */. for (i
51c0: 64 78 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62 dx = 2; idx < ob
51d0: 6a 63 2d 31 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 jc-1; idx++) {..
51e0: 63 68 61 72 20 2a 6f 70 74 20 3d 20 54 63 6c 5f char *opt = Tcl_
51f0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
5200: 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 4e 55 4c 4c (objv[idx], NULL
5210: 29 3b 0a 0a 09 69 66 20 28 6f 70 74 5b 30 5d 20 );...if (opt[0]
5220: 21 3d 20 27 2d 27 29 0a 09 20 20 20 20 62 72 65 != '-').. bre
5230: 61 6b 3b 0a 0a 09 4f 50 54 46 4c 41 47 28 22 2d ak;...OPTFLAG("-
5240: 62 69 6e 22 2c 20 66 6f 72 6d 61 74 2c 20 30 29 bin", format, 0)
5250: 3b 0a 09 4f 50 54 46 4c 41 47 28 22 2d 62 69 6e ;..OPTFLAG("-bin
5260: 61 72 79 22 2c 20 66 6f 72 6d 61 74 2c 20 30 29 ary", format, 0)
5270: 3b 0a 09 4f 50 54 46 4c 41 47 28 22 2d 68 65 78 ;..OPTFLAG("-hex
5280: 22 2c 20 66 6f 72 6d 61 74 2c 20 31 29 3b 0a 09 ", format, 1);..
5290: 4f 50 54 46 4c 41 47 28 22 2d 68 65 78 61 64 65 OPTFLAG("-hexade
52a0: 63 69 6d 61 6c 22 2c 20 66 6f 72 6d 61 74 2c 20 cimal", format,
52b0: 31 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 64 61 1);..OPTOBJ("-da
52c0: 74 61 22 2c 20 64 61 74 61 4f 62 6a 29 3b 0a 09 ta", dataObj);..
52d0: 4f 50 54 53 54 52 28 22 2d 63 68 61 6e 22 2c 20 OPTSTR("-chan",
52e0: 63 68 61 6e 6e 65 6c 29 3b 0a 09 4f 50 54 53 54 channel);..OPTST
52f0: 52 28 22 2d 63 68 61 6e 6e 65 6c 22 2c 20 63 68 R("-channel", ch
5300: 61 6e 6e 65 6c 29 3b 0a 09 4f 50 54 4f 42 4a 28 annel);..OPTOBJ(
5310: 22 2d 66 69 6c 65 22 2c 20 66 69 6c 65 4f 62 6a "-file", fileObj
5320: 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 66 69 6c );..OPTOBJ("-fil
5330: 65 6e 61 6d 65 22 2c 20 66 69 6c 65 4f 62 6a 29 ename", fileObj)
5340: 3b 0a 0a 09 4f 50 54 42 41 44 28 22 6f 70 74 69 ;...OPTBAD("opti
5350: 6f 6e 22 2c 20 22 2d 62 69 6e 2c 20 2d 64 61 74 on", "-bin, -dat
5360: 61 2c 20 2d 66 69 6c 65 2c 20 2d 66 69 6c 65 6e a, -file, -filen
5370: 61 6d 65 2c 20 2d 6b 65 79 2c 20 6f 72 20 2d 68 ame, -key, or -h
5380: 65 78 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 ex");..return TC
5390: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
53a0: 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 6f 70 74 /* If no opt
53b0: 69 6f 6e 20 66 6f 72 20 6c 61 73 74 20 61 72 67 ion for last arg
53c0: 2c 20 74 68 65 6e 20 69 74 73 20 74 68 65 20 64 , then its the d
53d0: 61 74 61 20 2a 2f 0a 20 20 20 20 69 66 20 28 69 ata */. if (i
53e0: 64 78 20 3c 20 6f 62 6a 63 29 20 7b 0a 09 64 61 dx < objc) {..da
53f0: 74 61 4f 62 6a 20 3d 20 6f 62 6a 76 5b 69 64 78 taObj = objv[idx
5400: 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a ];. }.. /*
5410: 20 43 61 6c 63 20 64 69 67 65 73 74 20 6f 6e 20 Calc digest on
5420: 66 69 6c 65 2c 20 73 74 61 63 6b 65 64 20 63 68 file, stacked ch
5430: 61 6e 6e 65 6c 2c 20 6f 72 20 64 61 74 61 20 62 annel, or data b
5440: 6c 6f 62 20 2a 2f 0a 20 20 20 20 69 66 20 28 66 lob */. if (f
5450: 69 6c 65 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 ileObj != NULL)
5460: 7b 0a 09 72 65 74 75 72 6e 20 44 69 67 65 73 74 {..return Digest
5470: 46 69 6c 65 28 69 6e 74 65 72 70 2c 20 66 69 6c File(interp, fil
5480: 65 4f 62 6a 2c 20 6d 64 2c 20 66 6f 72 6d 61 74 eObj, md, format
5490: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 );. } else if
54a0: 20 28 63 68 61 6e 6e 65 6c 20 21 3d 20 4e 55 4c (channel != NUL
54b0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 44 69 67 L) {..return Dig
54c0: 65 73 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 estChannel(inter
54d0: 70 2c 20 63 68 61 6e 6e 65 6c 2c 20 6d 64 2c 20 p, channel, md,
54e0: 66 6f 72 6d 61 74 29 3b 0a 20 20 20 20 7d 20 65 format);. } e
54f0: 6c 73 65 20 69 66 20 28 64 61 74 61 4f 62 6a 20 lse if (dataObj
5500: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f != NULL) {..Tcl_
5510: 4f 62 6a 20 2a 6f 62 6a 73 5b 32 5d 3b 0a 09 6f Obj *objs[2];..o
5520: 62 6a 73 5b 30 5d 20 3d 20 4e 55 4c 4c 3b 0a 09 bjs[0] = NULL;..
5530: 6f 62 6a 73 5b 31 5d 20 3d 20 64 61 74 61 4f 62 objs[1] = dataOb
5540: 6a 3b 0a 09 72 65 74 75 72 6e 20 44 69 67 65 73 j;..return Diges
5550: 74 48 61 73 68 46 75 6e 63 74 69 6f 6e 28 69 6e tHashFunction(in
5560: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 73 2c 20 6d terp, 2, objs, m
5570: 64 2c 20 66 6f 72 6d 61 74 29 3b 0a 20 20 20 20 d, format);.
5580: 7d 0a 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e }.. Tcl_Appen
5590: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
55a0: 22 4e 6f 20 64 61 74 61 20 73 70 65 63 69 66 69 "No data specifi
55b0: 65 64 2e 22 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 ed.", NULL);.
55c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
55d0: 52 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d R;.}../*. *-----
55e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
55f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
5620: 2a 0a 20 2a 20 4d 65 73 73 61 67 65 20 44 69 67 *. * Message Dig
5630: 65 73 74 20 43 6f 6e 76 65 6e 69 65 6e 63 65 20 est Convenience
5640: 43 6f 6d 6d 61 6e 64 73 20 2d 2d 0a 20 2a 0a 20 Commands --. *.
5650: 2a 09 43 6f 6e 76 65 6e 69 65 6e 63 65 20 63 6f *.Convenience co
5660: 6d 6d 61 6e 64 73 20 66 6f 72 20 6d 65 73 73 61 mmands for messa
5670: 67 65 20 64 69 67 65 73 74 73 2e 0a 20 2a 0a 20 ge digests.. *.
5680: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 * Returns:. *.TC
5690: 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f L_OK or TCL_ERRO
56a0: 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 R. *. * Side eff
56b0: 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 72 65 ects:. *.Sets re
56c0: 73 75 6c 74 20 74 6f 20 6d 65 73 73 61 67 65 20 sult to message
56d0: 64 69 67 65 73 74 20 6f 72 20 65 72 72 6f 72 20 digest or error
56e0: 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d message. *. *---
56f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5730: 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 4d . */.int DigestM
5740: 44 34 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 D4Cmd(ClientData
5750: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
5760: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
5770: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
5780: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
5790: 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 44 ) {. return D
57a0: 69 67 65 73 74 48 61 73 68 46 75 6e 63 74 69 6f igestHashFunctio
57b0: 6e 28 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 n(interp, objc,
57c0: 6f 62 6a 76 2c 20 45 56 50 5f 6d 64 34 28 29 2c objv, EVP_md4(),
57d0: 20 31 29 3b 0a 7d 0a 0a 69 6e 74 20 44 69 67 65 1);.}..int Dige
57e0: 73 74 4d 44 35 43 6d 64 28 43 6c 69 65 6e 74 44 stMD5Cmd(ClientD
57f0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
5800: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
5810: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 rp, int objc, Tc
5820: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
5830: 76 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 72 v[]) {. retur
5840: 6e 20 44 69 67 65 73 74 48 61 73 68 46 75 6e 63 n DigestHashFunc
5850: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f 62 6a tion(interp, obj
5860: 63 2c 20 6f 62 6a 76 2c 20 45 56 50 5f 6d 64 35 c, objv, EVP_md5
5870: 28 29 2c 20 31 29 3b 0a 7d 0a 0a 69 6e 74 20 44 (), 1);.}..int D
5880: 69 67 65 73 74 53 48 41 31 43 6d 64 28 43 6c 69 igestSHA1Cmd(Cli
5890: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
58a0: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a ta, Tcl_Interp *
58b0: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 interp, int objc
58c0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 , Tcl_Obj *const
58d0: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 72 objv[]) {. r
58e0: 65 74 75 72 6e 20 44 69 67 65 73 74 48 61 73 68 eturn DigestHash
58f0: 46 75 6e 63 74 69 6f 6e 28 69 6e 74 65 72 70 2c Function(interp,
5900: 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 45 56 50 objc, objv, EVP
5910: 5f 73 68 61 31 28 29 2c 20 31 29 3b 0a 7d 0a 0a _sha1(), 1);.}..
5920: 69 6e 74 20 44 69 67 65 73 74 53 48 41 32 35 36 int DigestSHA256
5930: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 Cmd(ClientData c
5940: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 lientData, Tcl_I
5950: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
5960: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a nt objc, Tcl_Obj
5970: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 *const objv[])
5980: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 44 69 67 {. return Dig
5990: 65 73 74 48 61 73 68 46 75 6e 63 74 69 6f 6e 28 estHashFunction(
59a0: 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 interp, objc, ob
59b0: 6a 76 2c 20 45 56 50 5f 73 68 61 32 35 36 28 29 jv, EVP_sha256()
59c0: 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d , 1);.}../*. *--
59d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
59e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
59f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5a10: 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 44 69 67 65 -. *. * Tls_Dige
5a20: 73 74 43 6f 6d 6d 61 6e 64 73 20 2d 2d 0a 20 2a stCommands --. *
5a30: 0a 20 2a 09 43 72 65 61 74 65 20 64 69 67 65 73 . *.Create diges
5a40: 74 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a t commands. *. *
5a50: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c Returns:. *.TCL
5a60: 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 _OK or TCL_ERROR
5a70: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
5a80: 63 74 73 3a 0a 20 2a 09 43 72 65 61 74 65 73 20 cts:. *.Creates
5a90: 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 2d 2d commands. *. *--
5aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ae0: 2d 0a 20 2a 2f 0a 69 6e 74 20 54 6c 73 5f 44 69 -. */.int Tls_Di
5af0: 67 65 73 74 43 6f 6d 6d 61 6e 64 73 28 54 63 6c gestCommands(Tcl
5b00: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 _Interp *interp)
5b10: 20 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 {. Tcl_Creat
5b20: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
5b30: 72 70 2c 20 22 74 6c 73 3a 3a 64 69 67 65 73 74 rp, "tls::digest
5b40: 22 2c 20 44 69 67 65 73 74 4f 62 6a 43 6d 64 2c ", DigestObjCmd,
5b50: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c (ClientData) 0,
5b60: 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 (Tcl_CmdDeleteP
5b70: 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 roc *) NULL);.
5b80: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
5b90: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
5ba0: 74 6c 73 3a 3a 6d 64 34 22 2c 20 44 69 67 65 73 tls::md4", Diges
5bb0: 74 4d 44 34 43 6d 64 2c 20 28 43 6c 69 65 6e 74 tMD4Cmd, (Client
5bc0: 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d Data) 0, (Tcl_Cm
5bd0: 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e dDeleteProc *) N
5be0: 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 ULL);. Tcl_Cr
5bf0: 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
5c00: 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 64 35 nterp, "tls::md5
5c10: 22 2c 20 44 69 67 65 73 74 4d 44 35 43 6d 64 2c ", DigestMD5Cmd,
5c20: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c (ClientData) 0,
5c30: 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 (Tcl_CmdDeleteP
5c40: 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 roc *) NULL);.
5c50: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
5c60: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
5c70: 74 6c 73 3a 3a 73 68 61 31 22 2c 20 44 69 67 65 tls::sha1", Dige
5c80: 73 74 53 48 41 31 43 6d 64 2c 20 28 43 6c 69 65 stSHA1Cmd, (Clie
5c90: 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f ntData) 0, (Tcl_
5ca0: 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 CmdDeleteProc *)
5cb0: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f NULL);. Tcl_
5cc0: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 CreateObjCommand
5cd0: 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 (interp, "tls::s
5ce0: 68 61 32 35 36 22 2c 20 44 69 67 65 73 74 53 48 ha256", DigestSH
5cf0: 41 32 35 36 43 6d 64 2c 20 28 43 6c 69 65 6e 74 A256Cmd, (Client
5d00: 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d Data) 0, (Tcl_Cm
5d10: 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e dDeleteProc *) N
5d20: 55 4c 4c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e ULL);. return
5d30: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a TCL_OK;.}..