0000: 2f 2a 0a 20 2a 20 4d 65 73 73 61 67 65 20 44 69 /*. * Message Di
0010: 67 65 73 74 73 20 4d 6f 64 75 6c 65 0a 20 2a 0a gests Module. *.
0020: 20 2a 20 50 72 6f 76 69 64 65 73 20 63 6f 6d 6d * Provides comm
0030: 61 6e 64 73 20 74 6f 20 63 61 6c 63 75 6c 61 74 ands to calculat
0040: 65 20 61 20 6d 65 73 73 61 67 65 20 64 69 67 65 e a message dige
0050: 73 74 20 75 73 69 6e 67 20 61 20 73 70 65 63 69 st using a speci
0060: 66 69 65 64 20 68 61 73 68 20 61 6c 67 6f 72 69 fied hash algori
0070: 74 68 6d 2e 0a 20 2a 0a 20 2a 20 43 6f 70 79 72 thm.. *. * Copyr
0080: 69 67 68 74 20 28 43 29 20 32 30 32 33 20 42 72 ight (C) 2023 Br
0090: 69 61 6e 20 4f 27 48 61 67 61 6e 0a 20 2a 0a 20 ian O'Hagan. *.
00a0: 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c */..#include "tl
00b0: 73 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 sInt.h".#include
00c0: 20 22 74 63 6c 4f 70 74 73 2e 68 22 0a 23 69 6e "tclOpts.h".#in
00d0: 63 6c 75 64 65 20 3c 74 63 6c 2e 68 3e 0a 23 69 clude <tcl.h>.#i
00e0: 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e nclude <stdio.h>
00f0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e .#include <strin
0100: 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f g.h>.#include <o
0110: 70 65 6e 73 73 6c 2f 65 76 70 2e 68 3e 0a 0a 2f penssl/evp.h>../
0120: 2a 20 43 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 63 * Constants */.c
0130: 6f 6e 73 74 20 63 68 61 72 20 2a 68 65 78 20 3d onst char *hex =
0140: 20 22 30 31 32 33 34 35 36 37 38 39 41 42 43 44 "0123456789ABCD
0150: 45 46 22 3b 0a 0a 2f 2a 20 4d 61 63 72 6f 73 20 EF";../* Macros
0160: 2a 2f 0a 23 64 65 66 69 6e 65 20 42 55 46 46 45 */.#define BUFFE
0170: 52 5f 53 49 5a 45 20 36 35 35 33 36 0a 23 64 65 R_SIZE 65536.#de
0180: 66 69 6e 65 20 42 49 4e 5f 46 4f 52 4d 41 54 20 fine BIN_FORMAT
0190: 30 0a 23 64 65 66 69 6e 65 20 48 45 58 5f 46 4f 0.#define HEX_FO
01a0: 52 4d 41 54 20 31 0a 23 64 65 66 69 6e 65 20 43 RMAT 1.#define C
01b0: 48 41 4e 5f 45 4f 46 20 30 78 31 30 0a 0a 2f 2a HAN_EOF 0x10../*
01c0: 0a 20 2a 20 54 68 69 73 20 73 74 72 75 63 74 75 . * This structu
01d0: 72 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 re describes the
01e0: 20 70 65 72 2d 69 6e 73 74 61 6e 63 65 20 73 74 per-instance st
01f0: 61 74 65 20 6f 66 20 61 6e 20 53 53 4c 20 63 68 ate of an SSL ch
0200: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 54 68 65 annel.. *. * The
0210: 20 53 53 4c 20 70 72 6f 63 65 73 73 69 6e 67 20 SSL processing
0220: 63 6f 6e 74 65 78 74 20 69 73 20 6d 61 69 6e 74 context is maint
0230: 61 69 6e 65 64 20 68 65 72 65 2c 20 69 6e 20 74 ained here, in t
0240: 68 65 20 43 6c 69 65 6e 74 44 61 74 61 0a 20 2a he ClientData. *
0250: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 /.typedef struct
0260: 20 44 69 67 65 73 74 53 74 61 74 65 20 7b 0a 09 DigestState {..
0270: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 73 65 6c 66 Tcl_Channel self
0280: 3b 09 2f 2a 20 54 68 69 73 20 73 6f 63 6b 65 74 ;./* This socket
0290: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 09 54 63 6c channel */..Tcl
02a0: 5f 54 69 6d 65 72 54 6f 6b 65 6e 20 74 69 6d 65 _TimerToken time
02b0: 72 3b 09 2f 2a 20 54 69 6d 65 72 20 66 6f 72 20 r;./* Timer for
02c0: 72 65 61 64 20 65 76 65 6e 74 73 20 2a 2f 0a 0a read events */..
02d0: 09 69 6e 74 20 66 6c 61 67 73 3b 09 09 2f 2a 20 .int flags;../*
02e0: 43 68 61 6e 20 63 6f 6e 66 69 67 20 66 6c 61 67 Chan config flag
02f0: 73 20 2a 2f 0a 09 69 6e 74 20 77 61 74 63 68 4d s */..int watchM
0300: 61 73 6b 3b 09 09 2f 2a 20 43 75 72 72 65 6e 74 ask;../* Current
0310: 20 57 61 74 63 68 50 72 6f 63 20 6d 61 73 6b 20 WatchProc mask
0320: 2a 2f 0a 09 69 6e 74 20 6d 6f 64 65 3b 09 09 2f */..int mode;../
0330: 2a 20 43 75 72 72 65 6e 74 20 6d 6f 64 65 20 6f * Current mode o
0340: 66 20 70 61 72 65 6e 74 20 63 68 61 6e 6e 65 6c f parent channel
0350: 20 2a 2f 0a 09 69 6e 74 20 66 6f 72 6d 61 74 3b */..int format;
0360: 09 09 2f 2a 20 4f 75 74 70 75 74 20 66 6f 72 6d ../* Output form
0370: 61 74 20 2a 2f 0a 0a 09 54 63 6c 5f 49 6e 74 65 at */...Tcl_Inte
0380: 72 70 20 2a 69 6e 74 65 72 70 3b 09 2f 2a 20 43 rp *interp;./* C
0390: 75 72 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74 urrent interpret
03a0: 65 72 20 2a 2f 0a 09 45 56 50 5f 4d 44 5f 43 54 er */..EVP_MD_CT
03b0: 58 20 2a 63 74 78 3b 09 2f 2a 20 4d 44 20 43 6f X *ctx;./* MD Co
03c0: 6e 74 65 78 74 20 2a 2f 0a 09 48 4d 41 43 5f 43 ntext */..HMAC_C
03d0: 54 58 20 2a 68 63 74 78 3b 09 09 2f 2a 20 48 4d TX *hctx;../* HM
03e0: 41 43 20 43 6f 6e 74 65 78 74 20 2a 2f 0a 7d 20 AC Context */.}
03f0: 44 69 67 65 73 74 53 74 61 74 65 3b 0a 0a 2f 2a DigestState;../*
0400: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
0410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0440: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 ------. *. * Dig
0450: 65 73 74 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a estFree --. *. *
0460: 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 .This procedure
0470: 72 65 6d 6f 76 65 73 20 61 20 64 69 67 65 73 74 removes a digest
0480: 20 73 74 61 74 65 20 73 74 72 75 63 74 75 72 65 state structure
0490: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a . *. * Returns:.
04a0: 20 2a 09 4e 6f 74 68 69 6e 67 0a 20 2a 0a 20 2a *.Nothing. *. *
04b0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
04c0: 2a 09 52 65 6d 6f 76 65 73 20 73 74 72 75 63 74 *.Removes struct
04d0: 75 72 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ure. *. *-------
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
0520: 0a 76 6f 69 64 20 44 69 67 65 73 74 46 72 65 65 .void DigestFree
0530: 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 (DigestState *s
0540: 74 61 74 65 50 74 72 29 20 7b 0a 20 20 20 20 69 tatePtr) {. i
0550: 66 20 28 73 74 61 74 65 50 74 72 20 3d 3d 20 28 f (statePtr == (
0560: 44 69 67 65 73 74 53 74 61 74 65 20 2a 29 20 4e DigestState *) N
0570: 55 4c 4c 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 ULL) return;..
0580: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
0590: 63 74 78 20 21 3d 20 28 45 56 50 5f 4d 44 5f 43 ctx != (EVP_MD_C
05a0: 54 58 20 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 45 TX *) NULL) {..E
05b0: 56 50 5f 4d 44 5f 43 54 58 5f 66 72 65 65 28 73 VP_MD_CTX_free(s
05c0: 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 tatePtr->ctx);.
05d0: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 }. if (sta
05e0: 74 65 50 74 72 2d 3e 68 63 74 78 20 21 3d 20 28 tePtr->hctx != (
05f0: 48 4d 41 43 5f 43 54 58 20 2a 29 20 4e 55 4c 4c HMAC_CTX *) NULL
0600: 29 20 7b 0a 09 48 4d 41 43 5f 43 54 58 5f 66 72 ) {..HMAC_CTX_fr
0610: 65 65 28 73 74 61 74 65 50 74 72 2d 3e 68 63 74 ee(statePtr->hct
0620: 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6b x);. }. ck
0630: 66 72 65 65 28 73 74 61 74 65 50 74 72 29 3b 0a free(statePtr);.
0640: 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a }../************
0650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0680: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d *******/../*. *-
0690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
06a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
06b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
06c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
06d0: 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 46 --. *. * DigestF
06e0: 69 6c 65 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 ile --. *. *.Ret
06f0: 75 72 6e 20 6d 65 73 73 61 67 65 20 64 69 67 65 urn message dige
0700: 73 74 20 66 6f 72 20 66 69 6c 65 20 75 73 69 6e st for file usin
0710: 67 20 75 73 65 72 20 73 70 65 63 69 66 69 65 64 g user specified
0720: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 0a hash function..
0730: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 *. * Returns:.
0740: 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f *.TCL_OK or TCL_
0750: 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 ERROR. *. * Side
0760: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 52 65 73 effects:. *.Res
0770: 75 6c 74 20 69 73 20 6d 65 73 73 61 67 65 20 64 ult is message d
0780: 69 67 65 73 74 20 6f 72 20 65 72 72 6f 72 20 6d igest or error m
0790: 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d essage. *. *----
07a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
07b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
07c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
07d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
07e0: 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 46 69 */.int DigestFi
07f0: 6c 65 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 le(Tcl_Interp *i
0800: 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a nterp, Tcl_Obj *
0810: 66 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 filename, const
0820: 45 56 50 5f 4d 44 20 2a 6d 64 2c 20 69 6e 74 20 EVP_MD *md, int
0830: 66 6f 72 6d 61 74 2c 0a 09 54 63 6c 5f 4f 62 6a format,..Tcl_Obj
0840: 20 2a 6b 65 79 4f 62 6a 29 20 7b 0a 20 20 20 20 *keyObj) {.
0850: 45 56 50 5f 4d 44 5f 43 54 58 20 2a 63 74 78 20 EVP_MD_CTX *ctx
0860: 3d 20 28 45 56 50 5f 4d 44 5f 43 54 58 20 2a 29 = (EVP_MD_CTX *)
0870: 20 4e 55 4c 4c 3b 0a 20 20 20 20 48 4d 41 43 5f NULL;. HMAC_
0880: 43 54 58 20 2a 68 63 74 78 20 3d 20 28 48 4d 41 CTX *hctx = (HMA
0890: 43 5f 43 54 58 20 2a 29 20 4e 55 4c 4c 3b 0a 20 C_CTX *) NULL;.
08a0: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 Tcl_Channel c
08b0: 68 61 6e 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 han;. unsigne
08c0: 64 20 63 68 61 72 20 62 75 66 5b 42 55 46 46 45 d char buf[BUFFE
08d0: 52 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 75 6e 73 R_SIZE];. uns
08e0: 69 67 6e 65 64 20 63 68 61 72 20 6d 64 5f 62 75 igned char md_bu
08f0: 66 5b 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a f[EVP_MAX_MD_SIZ
0900: 45 5d 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 E];. unsigned
0910: 20 69 6e 74 20 6d 64 5f 6c 65 6e 3b 0a 20 20 20 int md_len;.
0920: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
0930: 6b 65 79 3b 0a 20 20 20 20 69 6e 74 20 6b 65 79 key;. int key
0940: 5f 6c 65 6e 2c 20 72 65 73 3b 0a 0a 20 20 20 20 _len, res;..
0950: 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 63 68 61 /* Open file cha
0960: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e nnel */. chan
0970: 20 3d 20 54 63 6c 5f 46 53 4f 70 65 6e 46 69 6c = Tcl_FSOpenFil
0980: 65 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c eChannel(interp,
0990: 20 66 69 6c 65 6e 61 6d 65 2c 20 22 72 62 22 2c filename, "rb",
09a0: 20 30 34 34 34 29 3b 0a 20 20 20 20 69 66 20 28 0444);. if (
09b0: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 chan == (Tcl_Cha
09c0: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 nnel) NULL) {..r
09d0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
09e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 . }.. /* C
09f0: 6f 6e 66 69 67 75 72 65 20 63 68 61 6e 6e 65 6c onfigure channel
0a00: 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f */. if (Tcl_
0a10: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e SetChannelOption
0a20: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 (interp, chan, "
0a30: 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 -translation", "
0a40: 62 69 6e 61 72 79 22 29 20 3d 3d 20 54 43 4c 5f binary") == TCL_
0a50: 45 52 52 4f 52 29 20 7b 0a 09 67 6f 74 6f 20 65 ERROR) {..goto e
0a60: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 rror;. }.
0a70: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 42 75 Tcl_SetChannelBu
0a80: 66 66 65 72 53 69 7a 65 28 63 68 61 6e 2c 20 42 fferSize(chan, B
0a90: 55 46 46 45 52 5f 53 49 5a 45 29 3b 0a 0a 20 20 UFFER_SIZE);..
0aa0: 20 20 2f 2a 20 43 72 65 61 74 65 20 6d 65 73 73 /* Create mess
0ab0: 61 67 65 20 64 69 67 65 73 74 20 63 6f 6e 74 65 age digest conte
0ac0: 78 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 6b 65 xt */. if (ke
0ad0: 79 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a yObj == NULL) {.
0ae0: 09 63 74 78 20 3d 20 45 56 50 5f 4d 44 5f 43 54 .ctx = EVP_MD_CT
0af0: 58 5f 6e 65 77 28 29 3b 0a 09 72 65 73 20 3d 20 X_new();..res =
0b00: 28 63 74 78 20 21 3d 20 4e 55 4c 4c 29 3b 0a 20 (ctx != NULL);.
0b10: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 68 63 74 } else {..hct
0b20: 78 20 3d 20 48 4d 41 43 5f 43 54 58 5f 6e 65 77 x = HMAC_CTX_new
0b30: 28 29 3b 0a 09 72 65 73 20 3d 20 28 68 63 74 78 ();..res = (hctx
0b40: 20 21 3d 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d != NULL);. }
0b50: 0a 20 20 20 20 69 66 20 28 21 72 65 73 29 20 7b . if (!res) {
0b60: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
0b70: 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 72 65 61 lt(interp, "Crea
0b80: 74 65 20 64 69 67 65 73 74 20 63 6f 6e 74 65 78 te digest contex
0b90: 74 20 66 61 69 6c 65 64 3a 20 22 2c 20 52 45 41 t failed: ", REA
0ba0: 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 67 SON(), NULL);..g
0bb0: 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 7d oto error;. }
0bc0: 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c .. /* Initial
0bd0: 69 7a 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f ize hash functio
0be0: 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 6b 65 79 n */. if (key
0bf0: 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 Obj == NULL) {..
0c00: 72 65 73 20 3d 20 45 56 50 5f 44 69 67 65 73 74 res = EVP_Digest
0c10: 49 6e 69 74 5f 65 78 28 63 74 78 2c 20 6d 64 2c Init_ex(ctx, md,
0c20: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 20 65 6c NULL);. } el
0c30: 73 65 20 7b 0a 09 6b 65 79 20 3d 20 54 63 6c 5f se {..key = Tcl_
0c40: 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d GetByteArrayFrom
0c50: 4f 62 6a 28 6b 65 79 4f 62 6a 2c 20 26 6b 65 79 Obj(keyObj, &key
0c60: 5f 6c 65 6e 29 3b 0a 09 72 65 73 20 3d 20 48 4d _len);..res = HM
0c70: 41 43 5f 49 6e 69 74 5f 65 78 28 68 63 74 78 2c AC_Init_ex(hctx,
0c80: 20 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 29 20 (const void *)
0c90: 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 2c 20 6d 64 key, key_len, md
0ca0: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 , NULL);. }.
0cb0: 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 0a 09 if (!res) {..
0cc0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
0cd0: 28 69 6e 74 65 72 70 2c 20 22 49 6e 69 74 69 61 (interp, "Initia
0ce0: 6c 69 7a 65 20 64 69 67 65 73 74 20 66 61 69 6c lize digest fail
0cf0: 65 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c ed: ", REASON(),
0d00: 20 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65 72 NULL);..goto er
0d10: 72 6f 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ror;. }..
0d20: 2f 2a 20 52 65 61 64 20 66 69 6c 65 20 64 61 74 /* Read file dat
0d30: 61 20 61 6e 64 20 75 70 64 61 74 65 20 68 61 73 a and update has
0d40: 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 h function */.
0d50: 20 20 77 68 69 6c 65 20 28 21 54 63 6c 5f 45 6f while (!Tcl_Eo
0d60: 66 28 63 68 61 6e 29 29 20 7b 0a 09 69 6e 74 20 f(chan)) {..int
0d70: 6c 65 6e 20 3d 20 54 63 6c 5f 52 65 61 64 52 61 len = Tcl_ReadRa
0d80: 77 28 63 68 61 6e 2c 20 28 63 68 61 72 20 2a 29 w(chan, (char *)
0d90: 20 62 75 66 2c 20 42 55 46 46 45 52 5f 53 49 5a buf, BUFFER_SIZ
0da0: 45 29 3b 0a 09 69 66 20 28 6c 65 6e 20 3e 20 30 E);..if (len > 0
0db0: 29 20 7b 0a 09 20 20 20 20 69 66 20 28 6b 65 79 ) {.. if (key
0dc0: 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 Obj == NULL) {..
0dd0: 09 72 65 73 20 3d 20 45 56 50 5f 44 69 67 65 73 .res = EVP_Diges
0de0: 74 55 70 64 61 74 65 28 63 74 78 2c 20 26 62 75 tUpdate(ctx, &bu
0df0: 66 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 f, (size_t) len)
0e00: 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a ;.. } else {.
0e10: 09 09 72 65 73 20 3d 20 48 4d 41 43 5f 55 70 64 ..res = HMAC_Upd
0e20: 61 74 65 28 68 63 74 78 2c 20 26 62 75 66 5b 30 ate(hctx, &buf[0
0e30: 5d 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 ], (size_t) len)
0e40: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 69 66 ;.. }.. if
0e50: 20 28 21 72 65 73 29 20 7b 0a 09 09 54 63 6c 5f (!res) {...Tcl_
0e60: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
0e70: 65 72 70 2c 20 22 55 70 64 61 74 65 20 64 69 67 erp, "Update dig
0e80: 65 73 74 20 66 61 69 6c 65 64 3a 20 22 2c 20 52 est failed: ", R
0e90: 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a EASON(), NULL);.
0ea0: 09 09 72 65 73 20 3d 20 54 43 4c 5f 45 52 52 4f ..res = TCL_ERRO
0eb0: 52 3b 0a 09 09 67 6f 74 6f 20 65 72 72 6f 72 3b R;...goto error;
0ec0: 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d .. }..}. }
0ed0: 0a 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20 63 .. /* Close c
0ee0: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 hannel */. if
0ef0: 20 28 54 63 6c 5f 43 6c 6f 73 65 28 69 6e 74 65 (Tcl_Close(inte
0f00: 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54 43 4c rp, chan) == TCL
0f10: 5f 45 52 52 4f 52 29 20 7b 0a 09 63 68 61 6e 20 _ERROR) {..chan
0f20: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
0f30: 4e 55 4c 4c 3b 0a 09 67 6f 74 6f 20 65 72 72 6f NULL;..goto erro
0f40: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 68 61 r;. }. cha
0f50: 6e 20 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c n = (Tcl_Channel
0f60: 29 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 ) NULL;.. /*
0f70: 46 69 6e 61 6c 69 7a 65 20 68 61 73 68 20 66 75 Finalize hash fu
0f80: 6e 63 74 69 6f 6e 20 61 6e 64 20 63 61 6c 63 75 nction and calcu
0f90: 6c 61 74 65 20 6d 65 73 73 61 67 65 20 64 69 67 late message dig
0fa0: 65 73 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 6b est */. if (k
0fb0: 65 79 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b eyObj == NULL) {
0fc0: 0a 09 72 65 73 20 3d 20 45 56 50 5f 44 69 67 65 ..res = EVP_Dige
0fd0: 73 74 46 69 6e 61 6c 5f 65 78 28 63 74 78 2c 20 stFinal_ex(ctx,
0fe0: 6d 64 5f 62 75 66 2c 20 26 6d 64 5f 6c 65 6e 29 md_buf, &md_len)
0ff0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
1000: 72 65 73 20 3d 20 48 4d 41 43 5f 46 69 6e 61 6c res = HMAC_Final
1010: 28 68 63 74 78 2c 20 6d 64 5f 62 75 66 2c 20 26 (hctx, md_buf, &
1020: 6d 64 5f 6c 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 md_len);. }.
1030: 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 0a 09 if (!res) {..
1040: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
1050: 28 69 6e 74 65 72 70 2c 20 22 46 69 6e 61 6c 69 (interp, "Finali
1060: 7a 65 20 64 69 67 65 73 74 20 66 61 69 6c 65 64 ze digest failed
1070: 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e : ", REASON(), N
1080: 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65 72 72 6f ULL);..goto erro
1090: 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a r;. }.. /*
10a0: 20 44 6f 6e 65 20 77 69 74 68 20 73 74 72 75 63 Done with struc
10b0: 74 20 2a 2f 0a 20 20 20 20 45 56 50 5f 4d 44 5f t */. EVP_MD_
10c0: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 20 CTX_free(ctx);.
10d0: 20 20 20 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 0a ctx = NULL;..
10e0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 6d 65 /* Return me
10f0: 73 73 61 67 65 20 64 69 67 65 73 74 20 61 73 20 ssage digest as
1100: 65 69 74 68 65 72 20 61 20 62 69 6e 61 72 79 20 either a binary
1110: 6f 72 20 68 65 78 20 73 74 72 69 6e 67 20 2a 2f or hex string */
1120: 0a 20 20 20 20 69 66 20 28 66 6f 72 6d 61 74 20 . if (format
1130: 3d 3d 20 42 49 4e 5f 46 4f 52 4d 41 54 29 20 7b == BIN_FORMAT) {
1140: 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 ..Tcl_SetObjResu
1150: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e lt(interp, Tcl_N
1160: 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 6d ewByteArrayObj(m
1170: 64 5f 62 75 66 2c 20 6d 64 5f 6c 65 6e 29 29 3b d_buf, md_len));
1180: 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 .. } else {..
1190: 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f Tcl_Obj *resultO
11a0: 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 bj = Tcl_NewObj(
11b0: 29 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 );..unsigned cha
11c0: 72 20 2a 70 74 72 20 3d 20 54 63 6c 5f 53 65 74 r *ptr = Tcl_Set
11d0: 42 79 74 65 41 72 72 61 79 4c 65 6e 67 74 68 28 ByteArrayLength(
11e0: 72 65 73 75 6c 74 4f 62 6a 2c 20 6d 64 5f 6c 65 resultObj, md_le
11f0: 6e 2a 32 29 3b 0a 0a 09 66 6f 72 20 28 75 6e 73 n*2);...for (uns
1200: 69 67 6e 65 64 20 69 6e 74 20 69 20 3d 20 30 3b igned int i = 0;
1210: 20 69 20 3c 20 6d 64 5f 6c 65 6e 3b 20 69 2b 2b i < md_len; i++
1220: 29 20 7b 0a 09 20 20 20 20 2a 70 74 72 2b 2b 20 ) {.. *ptr++
1230: 3d 20 68 65 78 5b 28 6d 64 5f 62 75 66 5b 69 5d = hex[(md_buf[i]
1240: 20 3e 3e 20 34 29 20 26 20 30 78 30 46 5d 3b 0a >> 4) & 0x0F];.
1250: 09 20 20 20 20 2a 70 74 72 2b 2b 20 3d 20 68 65 . *ptr++ = he
1260: 78 5b 6d 64 5f 62 75 66 5b 69 5d 20 26 20 30 78 x[md_buf[i] & 0x
1270: 30 46 5d 3b 0a 09 7d 0a 09 54 63 6c 5f 53 65 74 0F];..}..Tcl_Set
1280: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
1290: 2c 20 72 65 73 75 6c 74 4f 62 6a 29 3b 0a 20 20 , resultObj);.
12a0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 }. return T
12b0: 43 4c 5f 4f 4b 3b 0a 0a 65 72 72 6f 72 3a 0a 20 CL_OK;..error:.
12c0: 20 20 20 69 66 20 28 63 68 61 6e 20 21 3d 20 28 if (chan != (
12d0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c Tcl_Channel) NUL
12e0: 4c 29 20 7b 0a 09 54 63 6c 5f 43 6c 6f 73 65 28 L) {..Tcl_Close(
12f0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 3b 0a 20 interp, chan);.
1300: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 63 74 78 }. if (ctx
1310: 20 21 3d 20 28 45 56 50 5f 4d 44 5f 43 54 58 20 != (EVP_MD_CTX
1320: 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 45 56 50 5f *) NULL) {..EVP_
1330: 4d 44 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 MD_CTX_free(ctx)
1340: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
1350: 68 63 74 78 20 21 3d 20 28 48 4d 41 43 5f 43 54 hctx != (HMAC_CT
1360: 58 20 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 48 4d X *) NULL) {..HM
1370: 41 43 5f 43 54 58 5f 66 72 65 65 28 68 63 74 78 AC_CTX_free(hctx
1380: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 );. }. ret
1390: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d urn TCL_ERROR;.}
13a0: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ../*************
13b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
13c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
13d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
13e0: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d ******/../*. *--
13f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1430: 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 42 6c -. *. * DigestBl
1440: 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 2d 2d 0a 20 ockModeProc --.
1450: 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 *. *.This proced
1460: 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 ure is invoked b
1470: 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f y the generic IO
1480: 20 6c 65 76 65 6c 0a 20 2a 20 20 20 20 20 20 20 level. *
1490: 74 6f 20 73 65 74 20 62 6c 6f 63 6b 69 6e 67 20 to set blocking
14a0: 61 6e 64 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 and nonblocking
14b0: 6d 6f 64 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 74 modes.. *. * Ret
14c0: 75 72 6e 73 3a 0a 20 2a 09 30 20 69 66 20 73 75 urns:. *.0 if su
14d0: 63 63 65 73 73 66 75 6c 20 6f 72 20 50 4f 53 49 ccessful or POSI
14e0: 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 X error code if
14f0: 66 61 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 failed.. *. * Si
1500: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 de effects:. *.S
1510: 65 74 73 20 74 68 65 20 64 65 76 69 63 65 20 69 ets the device i
1520: 6e 74 6f 20 62 6c 6f 63 6b 69 6e 67 20 6f 72 20 nto blocking or
1530: 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 nonblocking mode
1540: 2e 0a 20 2a 09 43 61 6e 20 63 61 6c 6c 20 54 63 .. *.Can call Tc
1550: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 45 72 72 6f l_SetChannelErro
1560: 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d r.. *. *--------
1570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
15b0: 73 74 61 74 69 63 20 69 6e 74 20 44 69 67 65 73 static int Diges
15c0: 74 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 28 43 tBlockModeProc(C
15d0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
15e0: 44 61 74 61 2c 20 69 6e 74 20 6d 6f 64 65 29 20 Data, int mode)
15f0: 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74 {. DigestStat
1600: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44 e *statePtr = (D
1610: 69 67 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c igestState *) cl
1620: 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 69 ientData;.. i
1630: 66 20 28 6d 6f 64 65 20 3d 3d 20 54 43 4c 5f 4d f (mode == TCL_M
1640: 4f 44 45 5f 4e 4f 4e 42 4c 4f 43 4b 49 4e 47 29 ODE_NONBLOCKING)
1650: 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c {..statePtr->fl
1660: 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 41 ags |= TLS_TCL_A
1670: 53 59 4e 43 3b 0a 20 20 20 20 7d 20 65 6c 73 65 SYNC;. } else
1680: 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c {..statePtr->fl
1690: 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c ags &= ~(TLS_TCL
16a0: 5f 41 53 59 4e 43 29 3b 0a 20 20 20 20 7d 0a 20 _ASYNC);. }.
16b0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a return 0;.}..
16c0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
16d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1700: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 --------. *. * D
1710: 69 67 65 73 74 43 6c 6f 73 65 50 72 6f 63 20 2d igestCloseProc -
1720: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f -. *. *.This pro
1730: 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 cedure is invoke
1740: 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 d by the generic
1750: 20 49 4f 20 6c 65 76 65 6c 20 74 6f 20 70 65 72 IO level to per
1760: 66 6f 72 6d 0a 20 2a 09 63 68 61 6e 6e 65 6c 2d form. *.channel-
1770: 74 79 70 65 2d 73 70 65 63 69 66 69 63 20 63 6c type-specific cl
1780: 65 61 6e 75 70 20 77 68 65 6e 20 63 68 61 6e 6e eanup when chann
1790: 65 6c 20 69 73 20 63 6c 6f 73 65 64 2e 20 41 6c el is closed. Al
17a0: 6c 0a 20 2a 09 71 75 65 75 65 64 20 6f 75 74 70 l. *.queued outp
17b0: 75 74 20 69 73 20 66 6c 75 73 68 65 64 20 70 72 ut is flushed pr
17c0: 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 ior to calling t
17d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a his function.. *
17e0: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 . * Returns:. *.
17f0: 30 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 0 if successful
1800: 6f 72 20 50 4f 53 49 58 20 65 72 72 6f 72 20 63 or POSIX error c
1810: 6f 64 65 20 69 66 20 66 61 69 6c 65 64 2e 0a 20 ode if failed..
1820: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
1830: 73 3a 0a 20 2a 09 57 72 69 74 65 73 20 64 69 67 s:. *.Writes dig
1840: 65 73 74 20 74 6f 20 6f 75 74 70 75 74 20 61 6e est to output an
1850: 64 20 63 6c 6f 73 65 73 20 74 68 65 20 63 68 61 d closes the cha
1860: 6e 6e 65 6c 2e 20 53 74 6f 72 65 73 20 65 72 72 nnel. Stores err
1870: 6f 72 0a 20 2a 09 6d 65 73 73 61 67 65 73 20 69 or. *.messages i
1880: 6e 20 69 6e 74 65 72 70 20 72 65 73 75 6c 74 2e n interp result.
1890: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
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 0a 20 2a 2f 0a 69 6e ---------. */.in
18e0: 74 20 44 69 67 65 73 74 43 6c 6f 73 65 50 72 6f t DigestClosePro
18f0: 63 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 c(ClientData cli
1900: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 entData, Tcl_Int
1910: 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 erp *interp) {.
1920: 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a DigestState *
1930: 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 statePtr = (Dige
1940: 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e stState *) clien
1950: 74 44 61 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 43 tData;.. /* C
1960: 61 6e 63 65 6c 20 61 63 74 69 76 65 20 74 69 6d ancel active tim
1970: 65 72 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 er, if any */.
1980: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
1990: 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 timer != (Tcl_Ti
19a0: 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 merToken) NULL)
19b0: 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d {..Tcl_DeleteTim
19c0: 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 erHandler(stateP
19d0: 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 tr->timer);..sta
19e0: 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28 tePtr->timer = (
19f0: 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 Tcl_TimerToken)
1a00: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 NULL;. }..
1a10: 20 2f 2a 20 43 6c 65 61 6e 2d 75 70 20 2a 2f 0a /* Clean-up */.
1a20: 20 20 20 20 44 69 67 65 73 74 46 72 65 65 28 73 DigestFree(s
1a30: 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 72 65 tatePtr);. re
1a40: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a turn 0;.}../*. *
1a50: 20 53 61 6d 65 20 61 73 20 44 69 67 65 73 74 43 Same as DigestC
1a60: 6c 6f 73 65 50 72 6f 63 20 62 75 74 20 77 69 74 loseProc but wit
1a70: 68 20 69 6e 64 69 76 69 64 75 61 6c 20 72 65 61 h individual rea
1a80: 64 20 61 6e 64 20 77 72 69 74 65 20 63 6c 6f 73 d and write clos
1a90: 65 20 63 6f 6e 74 72 6f 6c 0a 20 2a 2f 0a 73 74 e control. */.st
1aa0: 61 74 69 63 20 69 6e 74 20 44 69 67 65 73 74 43 atic int DigestC
1ab0: 6c 6f 73 65 32 50 72 6f 63 28 43 6c 69 65 6e 74 lose2Proc(Client
1ac0: 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 Data instanceDat
1ad0: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
1ae0: 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 nterp, int flags
1af0: 29 20 7b 0a 0a 20 20 20 20 69 66 20 28 28 66 6c ) {.. if ((fl
1b00: 61 67 73 20 26 20 28 54 43 4c 5f 43 4c 4f 53 45 ags & (TCL_CLOSE
1b10: 5f 52 45 41 44 20 7c 20 54 43 4c 5f 43 4c 4f 53 _READ | TCL_CLOS
1b20: 45 5f 57 52 49 54 45 29 29 20 3d 3d 20 30 29 20 E_WRITE)) == 0)
1b30: 7b 0a 09 72 65 74 75 72 6e 20 44 69 67 65 73 74 {..return Digest
1b40: 43 6c 6f 73 65 50 72 6f 63 28 69 6e 73 74 61 6e CloseProc(instan
1b50: 63 65 44 61 74 61 2c 20 69 6e 74 65 72 70 29 3b ceData, interp);
1b60: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 . }. retur
1b70: 6e 20 45 49 4e 56 41 4c 3b 0a 7d 0a 0a 2f 2a 0a n EINVAL;.}../*.
1b80: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
1b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1bc0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 --------. *. * D
1bd0: 69 67 65 73 74 49 6e 70 75 74 50 72 6f 63 20 2d igestInputProc -
1be0: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62 -. *. *.Called b
1bf0: 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f y the generic IO
1c00: 20 73 79 73 74 65 6d 20 74 6f 20 72 65 61 64 20 system to read
1c10: 64 61 74 61 20 66 72 6f 6d 20 74 72 61 6e 73 66 data from transf
1c20: 6f 72 6d 20 61 6e 64 0a 20 2a 09 70 6c 61 63 65 orm and. *.place
1c30: 20 69 6e 20 62 75 66 2e 0a 20 2a 0a 20 2a 20 52 in buf.. *. * R
1c40: 65 74 75 72 6e 73 3a 0a 20 2a 09 54 6f 74 61 6c eturns:. *.Total
1c50: 20 62 79 74 65 73 20 72 65 61 64 20 6f 72 20 2d bytes read or -
1c60: 31 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 20 61 1 for an error a
1c70: 6c 6f 6e 67 20 77 69 74 68 20 61 20 50 4f 53 49 long with a POSI
1c80: 58 20 65 72 72 6f 72 0a 20 2a 09 63 6f 64 65 20 X error. *.code
1c90: 69 6e 20 65 72 72 6f 72 43 6f 64 65 50 74 72 2e in errorCodePtr.
1ca0: 20 55 73 65 20 45 41 47 41 49 4e 20 66 6f 72 20 Use EAGAIN for
1cb0: 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 61 6e 64 20 nonblocking and
1cc0: 6e 6f 20 64 61 74 61 2e 0a 20 2a 0a 20 2a 20 53 no data.. *. * S
1cd0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
1ce0: 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 74 Read data from t
1cf0: 72 61 6e 73 66 6f 72 6d 20 61 6e 64 20 77 72 69 ransform and wri
1d00: 74 65 20 74 6f 20 62 75 66 0a 20 2a 0a 20 2a 2d te to buf. *. *-
1d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1d50: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 -----. */.int Di
1d60: 67 65 73 74 49 6e 70 75 74 50 72 6f 63 28 43 6c gestInputProc(Cl
1d70: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
1d80: 61 74 61 2c 20 63 68 61 72 20 2a 62 75 66 2c 20 ata, char *buf,
1d90: 69 6e 74 20 74 6f 52 65 61 64 2c 20 69 6e 74 20 int toRead, int
1da0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 20 7b *errorCodePtr) {
1db0: 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65 . DigestState
1dc0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 *statePtr = (Di
1dd0: 67 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 gestState *) cli
1de0: 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 54 63 6c entData;. Tcl
1df0: 5f 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 3b _Channel parent;
1e00: 0a 20 20 20 20 69 6e 74 20 72 65 61 64 2c 20 72 . int read, r
1e10: 65 73 3b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f es;. *errorCo
1e20: 64 65 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20 dePtr = 0;..
1e30: 69 66 20 28 74 6f 52 65 61 64 20 3c 3d 20 30 20 if (toRead <= 0
1e40: 7c 7c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c || statePtr->sel
1e50: 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 f == (Tcl_Channe
1e60: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 l) NULL) {..retu
1e70: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 rn 0;. }..
1e80: 20 2f 2a 20 47 65 74 20 62 79 74 65 73 20 66 72 /* Get bytes fr
1e90: 6f 6d 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 68 om underlying ch
1ea0: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 70 61 72 annel */. par
1eb0: 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 ent = Tcl_GetSta
1ec0: 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 ckedChannel(stat
1ed0: 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 ePtr->self);.
1ee0: 20 72 65 61 64 20 3d 20 54 63 6c 5f 52 65 61 64 read = Tcl_Read
1ef0: 52 61 77 28 70 61 72 65 6e 74 2c 20 62 75 66 2c Raw(parent, buf,
1f00: 20 74 6f 52 65 61 64 29 3b 0a 0a 20 20 20 20 2f toRead);.. /
1f10: 2a 20 41 64 64 20 74 6f 20 6d 65 73 73 61 67 65 * Add to message
1f20: 20 64 69 67 65 73 74 20 2a 2f 0a 20 20 20 20 69 digest */. i
1f30: 66 20 28 72 65 61 64 20 3e 20 30 29 20 7b 0a 09 f (read > 0) {..
1f40: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 74 if (statePtr->ct
1f50: 78 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 x != NULL) {..
1f60: 20 20 72 65 73 20 3d 20 45 56 50 5f 44 69 67 65 res = EVP_Dige
1f70: 73 74 55 70 64 61 74 65 28 73 74 61 74 65 50 74 stUpdate(statePt
1f80: 72 2d 3e 63 74 78 2c 20 62 75 66 2c 20 28 73 69 r->ctx, buf, (si
1f90: 7a 65 5f 74 29 20 72 65 61 64 29 3b 0a 09 7d 20 ze_t) read);..}
1fa0: 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 73 20 else {.. res
1fb0: 3d 20 48 4d 41 43 5f 55 70 64 61 74 65 28 73 74 = HMAC_Update(st
1fc0: 61 74 65 50 74 72 2d 3e 68 63 74 78 2c 20 62 75 atePtr->hctx, bu
1fd0: 66 2c 20 28 73 69 7a 65 5f 74 29 20 72 65 61 64 f, (size_t) read
1fe0: 29 3b 0a 09 7d 0a 09 69 66 20 28 21 72 65 73 29 );..}..if (!res)
1ff0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 43 {.. Tcl_SetC
2000: 68 61 6e 6e 65 6c 45 72 72 6f 72 28 73 74 61 74 hannelError(stat
2010: 65 50 74 72 2d 3e 73 65 6c 66 2c 20 54 63 6c 5f ePtr->self, Tcl_
2020: 4f 62 6a 50 72 69 6e 74 66 28 22 44 69 67 65 73 ObjPrintf("Diges
2030: 74 20 75 70 64 61 74 65 20 66 61 69 6c 65 64 3a t update failed:
2040: 20 25 73 22 2c 20 52 45 41 53 4f 4e 28 29 29 29 %s", REASON()))
2050: 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 ;.. *errorCod
2060: 65 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 09 ePtr = EINVAL;..
2070: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 return -1;..
2080: 7d 0a 09 2f 2a 20 54 68 69 73 20 69 73 20 63 6f }../* This is co
2090: 72 72 65 63 74 20 2a 2f 0a 09 72 65 61 64 20 3d rrect */..read =
20a0: 20 2d 31 3b 0a 09 2a 65 72 72 6f 72 43 6f 64 65 -1;..*errorCode
20b0: 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 20 Ptr = EAGAIN;..
20c0: 20 20 20 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 . } else i
20d0: 66 20 28 72 65 61 64 20 3c 20 30 29 20 7b 0a 09 f (read < 0) {..
20e0: 2f 2a 20 45 72 72 6f 72 20 2a 2f 0a 09 2a 65 72 /* Error */..*er
20f0: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 54 63 6c rorCodePtr = Tcl
2100: 5f 47 65 74 45 72 72 6e 6f 28 29 3b 0a 0a 20 20 _GetErrno();..
2110: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 21 28 73 } else if (!(s
2120: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 tatePtr->flags &
2130: 20 43 48 41 4e 5f 45 4f 46 29 29 20 7b 0a 09 2f CHAN_EOF)) {../
2140: 2a 20 45 4f 46 20 2a 2f 0a 09 2a 65 72 72 6f 72 * EOF */..*error
2150: 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 75 6e CodePtr = 0;..un
2160: 73 69 67 6e 65 64 20 63 68 61 72 20 6d 64 5f 62 signed char md_b
2170: 75 66 5b 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 uf[EVP_MAX_MD_SI
2180: 5a 45 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 ZE];..unsigned i
2190: 6e 74 20 6d 64 5f 6c 65 6e 20 3d 20 30 3b 0a 0a nt md_len = 0;..
21a0: 09 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 68 61 73 ./* Finalize has
21b0: 68 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 63 h function and c
21c0: 61 6c 63 75 6c 61 74 65 20 6d 65 73 73 61 67 65 alculate message
21d0: 20 64 69 67 65 73 74 20 2a 2f 0a 09 69 66 20 28 digest */..if (
21e0: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 21 3d statePtr->ctx !=
21f0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 72 65 NULL) {.. re
2200: 73 20 3d 20 45 56 50 5f 44 69 67 65 73 74 46 69 s = EVP_DigestFi
2210: 6e 61 6c 5f 65 78 28 73 74 61 74 65 50 74 72 2d nal_ex(statePtr-
2220: 3e 63 74 78 2c 20 6d 64 5f 62 75 66 2c 20 26 6d >ctx, md_buf, &m
2230: 64 5f 6c 65 6e 29 3b 0a 09 7d 20 65 6c 73 65 20 d_len);..} else
2240: 7b 0a 09 20 20 20 20 72 65 73 20 3d 20 48 4d 41 {.. res = HMA
2250: 43 5f 46 69 6e 61 6c 28 73 74 61 74 65 50 74 72 C_Final(statePtr
2260: 2d 3e 68 63 74 78 2c 20 6d 64 5f 62 75 66 2c 20 ->hctx, md_buf,
2270: 26 6d 64 5f 6c 65 6e 29 3b 0a 09 7d 0a 09 69 66 &md_len);..}..if
2280: 20 28 21 72 65 73 29 20 7b 0a 09 20 20 20 20 2a (!res) {.. *
2290: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 errorCodePtr = E
22a0: 49 4e 56 41 4c 3b 0a 0a 09 2f 2a 20 57 72 69 74 INVAL;.../* Writ
22b0: 65 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 e message digest
22c0: 20 74 6f 20 6f 75 74 70 75 74 20 63 68 61 6e 6e to output chann
22d0: 65 6c 20 61 73 20 62 79 74 65 20 61 72 72 61 79 el as byte array
22e0: 20 6f 72 20 68 65 78 20 73 74 72 69 6e 67 20 2a or hex string *
22f0: 2f 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 64 /..} else if (md
2300: 5f 6c 65 6e 20 3e 20 30 29 20 7b 0a 09 20 20 20 _len > 0) {..
2310: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 if (statePtr->f
2320: 6f 72 6d 61 74 20 3d 3d 20 42 49 4e 5f 46 4f 52 ormat == BIN_FOR
2330: 4d 41 54 29 20 7b 0a 09 09 72 65 61 64 20 3d 20 MAT) {...read =
2340: 6d 64 5f 6c 65 6e 3b 0a 09 09 6d 65 6d 63 70 79 md_len;...memcpy
2350: 28 62 75 66 2c 20 6d 64 5f 62 75 66 2c 20 72 65 (buf, md_buf, re
2360: 61 64 29 3b 0a 0a 09 20 20 20 20 7d 20 65 6c 73 ad);... } els
2370: 65 20 7b 0a 09 09 75 6e 73 69 67 6e 65 64 20 63 e {...unsigned c
2380: 68 61 72 20 68 65 78 5f 62 75 66 5b 45 56 50 5f har hex_buf[EVP_
2390: 4d 41 58 5f 4d 44 5f 53 49 5a 45 2a 32 5d 3b 0a MAX_MD_SIZE*2];.
23a0: 09 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 ..unsigned char
23b0: 2a 70 74 72 20 3d 20 68 65 78 5f 62 75 66 3b 0a *ptr = hex_buf;.
23c0: 0a 09 09 66 6f 72 20 28 75 6e 73 69 67 6e 65 64 ...for (unsigned
23d0: 20 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 int i = 0; i <
23e0: 6d 64 5f 6c 65 6e 3b 20 69 2b 2b 29 20 7b 0a 09 md_len; i++) {..
23f0: 09 20 20 20 20 2a 70 74 72 2b 2b 20 3d 20 68 65 . *ptr++ = he
2400: 78 5b 28 6d 64 5f 62 75 66 5b 69 5d 20 3e 3e 20 x[(md_buf[i] >>
2410: 34 29 20 26 20 30 78 30 46 5d 3b 0a 09 09 20 20 4) & 0x0F];...
2420: 20 20 2a 70 74 72 2b 2b 20 3d 20 68 65 78 5b 6d *ptr++ = hex[m
2430: 64 5f 62 75 66 5b 69 5d 20 26 20 30 78 30 46 5d d_buf[i] & 0x0F]
2440: 3b 0a 09 09 7d 0a 09 09 72 65 61 64 20 3d 20 6d ;...}...read = m
2450: 64 5f 6c 65 6e 2a 32 3b 0a 09 09 6d 65 6d 63 70 d_len*2;...memcp
2460: 79 28 62 75 66 2c 20 68 65 78 5f 62 75 66 2c 20 y(buf, hex_buf,
2470: 72 65 61 64 29 3b 0a 09 20 20 20 20 7d 0a 09 7d read);.. }..}
2480: 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 ..statePtr->flag
2490: 73 20 7c 3d 20 43 48 41 4e 5f 45 4f 46 3b 0a 20 s |= CHAN_EOF;.
24a0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 }. return
24b0: 72 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d read;.}../*. *--
24c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
24d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
24e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
24f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2500: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 ----. *. * Diges
2510: 74 4f 75 74 70 75 74 50 72 6f 63 20 2d 2d 0a 20 tOutputProc --.
2520: 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79 20 74 *. *.Called by t
2530: 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 73 79 he generic IO sy
2540: 73 74 65 6d 20 74 6f 20 77 72 69 74 65 20 64 61 stem to write da
2550: 74 61 20 69 6e 20 62 75 66 20 74 6f 20 74 72 61 ta in buf to tra
2560: 6e 73 66 6f 72 6d 2e 0a 20 2a 0a 20 2a 20 52 65 nsform.. *. * Re
2570: 74 75 72 6e 73 3a 0a 20 2a 09 54 6f 74 61 6c 20 turns:. *.Total
2580: 62 79 74 65 73 20 77 72 69 74 74 65 6e 20 6f 72 bytes written or
2590: 20 2d 31 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 -1 for an error
25a0: 20 61 6c 6f 6e 67 20 77 69 74 68 20 61 20 50 4f along with a PO
25b0: 53 49 58 20 65 72 72 6f 72 0a 20 2a 09 63 6f 64 SIX error. *.cod
25c0: 65 20 69 6e 20 65 72 72 6f 72 43 6f 64 65 50 74 e in errorCodePt
25d0: 72 2e 20 55 73 65 20 45 41 47 41 49 4e 20 66 6f r. Use EAGAIN fo
25e0: 72 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 61 6e r nonblocking an
25f0: 64 20 63 61 6e 27 74 20 77 72 69 74 65 20 64 61 d can't write da
2600: 74 61 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ta.. *. * Side e
2610: 66 66 65 63 74 73 3a 0a 20 2a 09 47 65 74 20 64 ffects:. *.Get d
2620: 61 74 61 20 66 72 6f 6d 20 62 75 66 20 61 6e 64 ata from buf and
2630: 20 75 70 64 61 74 65 20 64 69 67 65 73 74 0a 20 update digest.
2640: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
2650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 20 ----------. */.
2690: 69 6e 74 20 44 69 67 65 73 74 4f 75 74 70 75 74 int DigestOutput
26a0: 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 Proc(ClientData
26b0: 63 6c 69 65 6e 74 44 61 74 61 2c 20 63 6f 6e 73 clientData, cons
26c0: 74 20 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 t char *buf, int
26d0: 20 74 6f 57 72 69 74 65 2c 20 69 6e 74 20 2a 65 toWrite, int *e
26e0: 72 72 6f 72 43 6f 64 65 50 74 72 29 20 7b 0a 20 rrorCodePtr) {.
26f0: 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a DigestState *
2700: 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 statePtr = (Dige
2710: 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e stState *) clien
2720: 74 44 61 74 61 3b 0a 20 20 20 20 2a 65 72 72 6f tData;. *erro
2730: 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 20 20 rCodePtr = 0;.
2740: 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 20 20 int res;..
2750: 69 66 20 28 74 6f 57 72 69 74 65 20 3c 3d 20 30 if (toWrite <= 0
2760: 20 7c 7c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 || statePtr->se
2770: 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e lf == (Tcl_Chann
2780: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 el) NULL) {..ret
2790: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 urn 0;. }..
27a0: 20 20 2f 2a 20 41 64 64 20 74 6f 20 6d 65 73 73 /* Add to mess
27b0: 61 67 65 20 64 69 67 65 73 74 20 2a 2f 0a 20 20 age digest */.
27c0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
27d0: 63 74 78 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ctx != NULL) {..
27e0: 72 65 73 20 3d 20 45 56 50 5f 44 69 67 65 73 74 res = EVP_Digest
27f0: 55 70 64 61 74 65 28 73 74 61 74 65 50 74 72 2d Update(statePtr-
2800: 3e 63 74 78 2c 20 62 75 66 2c 20 28 73 69 7a 65 >ctx, buf, (size
2810: 5f 74 29 20 74 6f 57 72 69 74 65 29 3b 0a 20 20 _t) toWrite);.
2820: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 } else {..res
2830: 3d 20 48 4d 41 43 5f 55 70 64 61 74 65 28 73 74 = HMAC_Update(st
2840: 61 74 65 50 74 72 2d 3e 68 63 74 78 2c 20 62 75 atePtr->hctx, bu
2850: 66 2c 20 28 73 69 7a 65 5f 74 29 20 74 6f 57 72 f, (size_t) toWr
2860: 69 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 ite);. }.
2870: 69 66 20 28 21 72 65 73 29 20 7b 0a 09 54 63 6c if (!res) {..Tcl
2880: 5f 53 65 74 43 68 61 6e 6e 65 6c 45 72 72 6f 72 _SetChannelError
2890: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c (statePtr->self,
28a0: 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 22 Tcl_ObjPrintf("
28b0: 44 69 67 65 73 74 20 75 70 64 61 74 65 20 66 61 Digest update fa
28c0: 69 6c 65 64 3a 20 25 73 22 2c 20 52 45 41 53 4f iled: %s", REASO
28d0: 4e 28 29 29 29 3b 0a 09 2a 65 72 72 6f 72 43 6f N()));..*errorCo
28e0: 64 65 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a dePtr = EINVAL;.
28f0: 09 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 .return -1;.
2900: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 74 6f 57 }. return toW
2910: 72 69 74 65 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d rite;.}../*. *--
2920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2960: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 ----. *. * Diges
2970: 74 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2d tSetOptionProc -
2980: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62 -. *. *.Called b
2990: 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f y the generic IO
29a0: 20 73 79 73 74 65 6d 20 74 6f 20 73 65 74 20 63 system to set c
29b0: 68 61 6e 6e 65 6c 20 6f 70 74 69 6f 6e 20 6e 61 hannel option na
29c0: 6d 65 20 74 6f 20 76 61 6c 75 65 2e 0a 20 2a 0a me to value.. *.
29d0: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 * Returns:. *.T
29e0: 43 4c 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 CL_OK if success
29f0: 66 75 6c 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 ful or TCL_ERROR
2a00: 20 69 66 20 66 61 69 6c 65 64 20 61 6c 6f 6e 67 if failed along
2a10: 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 0a 20 with an error.
2a20: 2a 09 6d 65 73 73 61 67 65 20 69 6e 20 69 6e 74 *.message in int
2a30: 65 72 70 20 61 6e 64 20 54 63 6c 5f 53 65 74 45 erp and Tcl_SetE
2a40: 72 72 6e 6f 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 rrno.. *. * Side
2a50: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 55 70 64 effects:. *.Upd
2a60: 61 74 65 73 20 63 68 61 6e 6e 65 6c 20 6f 70 74 ates channel opt
2a70: 69 6f 6e 20 74 6f 20 6e 65 77 20 76 61 6c 75 65 ion to new value
2a80: 2e 0a 20 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
2ad0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 69 67 /.static int Dig
2ae0: 65 73 74 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 estSetOptionProc
2af0: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
2b00: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ntData, Tcl_Inte
2b10: 72 70 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73 rp *interp, cons
2b20: 74 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 t char *optionNa
2b30: 6d 65 2c 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 me,..const char
2b40: 2a 6f 70 74 69 6f 6e 56 61 6c 75 65 29 20 7b 0a *optionValue) {.
2b50: 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20 DigestState
2b60: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 *statePtr = (Dig
2b70: 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 estState *) clie
2b80: 6e 74 44 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f ntData;. Tcl_
2b90: 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 3b 0a Channel parent;.
2ba0: 20 20 20 20 54 63 6c 5f 44 72 69 76 65 72 53 65 Tcl_DriverSe
2bb0: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2a 73 65 74 tOptionProc *set
2bc0: 4f 70 74 69 6f 6e 50 72 6f 63 3b 0a 0a 20 20 20 OptionProc;..
2bd0: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 if (statePtr->s
2be0: 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e elf == (Tcl_Chan
2bf0: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 nel) NULL) {..re
2c00: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
2c10: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 }.. /* De
2c20: 6c 65 67 61 74 65 20 6f 70 74 69 6f 6e 73 20 64 legate options d
2c30: 6f 77 6e 73 74 72 65 61 6d 20 2a 2f 0a 20 20 20 ownstream */.
2c40: 20 70 61 72 65 6e 74 20 3d 20 54 63 6c 5f 47 65 parent = Tcl_Ge
2c50: 74 53 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 tStackedChannel(
2c60: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b statePtr->self);
2c70: 0a 20 20 20 20 73 65 74 4f 70 74 69 6f 6e 50 72 . setOptionPr
2c80: 6f 63 20 3d 20 54 63 6c 5f 43 68 61 6e 6e 65 6c oc = Tcl_Channel
2c90: 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 54 63 SetOptionProc(Tc
2ca0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 l_GetChannelType
2cb0: 28 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 69 (parent));. i
2cc0: 66 20 28 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 f (setOptionProc
2cd0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 != NULL) {..ret
2ce0: 75 72 6e 20 28 2a 73 65 74 4f 70 74 69 6f 6e 50 urn (*setOptionP
2cf0: 72 6f 63 29 28 54 63 6c 5f 47 65 74 43 68 61 6e roc)(Tcl_GetChan
2d00: 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 nelInstanceData(
2d10: 70 61 72 65 6e 74 29 2c 20 69 6e 74 65 72 70 2c parent), interp,
2d20: 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 6f 70 74 optionName, opt
2d30: 69 6f 6e 56 61 6c 75 65 29 3b 0a 20 20 20 20 7d ionValue);. }
2d40: 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 53 65 74 else {..Tcl_Set
2d50: 45 72 72 6e 6f 28 45 49 4e 56 41 4c 29 3b 0a 09 Errno(EINVAL);..
2d60: 72 65 74 75 72 6e 20 54 63 6c 5f 42 61 64 43 68 return Tcl_BadCh
2d70: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
2d80: 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 rp, optionName,
2d90: 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a NULL);. }.}..
2da0: 2f 2a 0a 20 2a 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 2d 2d ----------------
2dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
2df0: 2a 20 44 69 67 65 73 74 47 65 74 4f 70 74 69 6f * DigestGetOptio
2e00: 6e 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 nProc --. *. *.C
2e10: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 67 65 6e alled by the gen
2e20: 65 72 69 63 20 49 4f 20 73 79 73 74 65 6d 20 74 eric IO system t
2e30: 6f 20 67 65 74 20 63 68 61 6e 6e 65 6c 20 6f 70 o get channel op
2e40: 74 69 6f 6e 20 6e 61 6d 65 27 73 20 76 61 6c 75 tion name's valu
2e50: 65 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 e.. *. * Returns
2e60: 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 69 66 20 73 :. *.TCL_OK if s
2e70: 75 63 63 65 73 73 66 75 6c 20 6f 72 20 54 43 4c uccessful or TCL
2e80: 5f 45 52 52 4f 52 20 69 66 20 66 61 69 6c 65 64 _ERROR if failed
2e90: 20 61 6c 6f 6e 67 20 77 69 74 68 20 61 6e 20 65 along with an e
2ea0: 72 72 6f 72 0a 20 2a 09 6d 65 73 73 61 67 65 20 rror. *.message
2eb0: 69 6e 20 69 6e 74 65 72 70 20 61 6e 64 20 54 63 in interp and Tc
2ec0: 6c 5f 53 65 74 45 72 72 6e 6f 2e 0a 20 2a 0a 20 l_SetErrno.. *.
2ed0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
2ee0: 20 2a 09 53 65 74 73 20 72 65 73 75 6c 74 20 74 *.Sets result t
2ef0: 6f 20 6f 70 74 69 6f 6e 27 73 20 76 61 6c 75 65 o option's value
2f00: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
2f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
2f50: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 69 67 65 .static int Dige
2f60: 73 74 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 stGetOptionProc(
2f70: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
2f80: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
2f90: 70 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74 p *interp, const
2fa0: 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d char *optionNam
2fb0: 65 2c 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 20 e,..Tcl_DString
2fc0: 2a 6f 70 74 69 6f 6e 56 61 6c 75 65 29 20 7b 0a *optionValue) {.
2fd0: 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20 DigestState
2fe0: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 *statePtr = (Dig
2ff0: 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 estState *) clie
3000: 6e 74 44 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f ntData;. Tcl_
3010: 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 3b 0a Channel parent;.
3020: 20 20 20 20 54 63 6c 5f 44 72 69 76 65 72 47 65 Tcl_DriverGe
3030: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2a 67 65 74 tOptionProc *get
3040: 4f 70 74 69 6f 6e 50 72 6f 63 3b 0a 0a 20 20 20 OptionProc;..
3050: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 if (statePtr->s
3060: 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e elf == (Tcl_Chan
3070: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 nel) NULL) {..re
3080: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
3090: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 }.. /* De
30a0: 6c 65 67 61 74 65 20 6f 70 74 69 6f 6e 73 20 64 legate options d
30b0: 6f 77 6e 73 74 72 65 61 6d 20 2a 2f 0a 20 20 20 ownstream */.
30c0: 20 70 61 72 65 6e 74 20 3d 20 54 63 6c 5f 47 65 parent = Tcl_Ge
30d0: 74 53 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 tStackedChannel(
30e0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b statePtr->self);
30f0: 0a 20 20 20 20 67 65 74 4f 70 74 69 6f 6e 50 72 . getOptionPr
3100: 6f 63 20 3d 20 54 63 6c 5f 43 68 61 6e 6e 65 6c oc = Tcl_Channel
3110: 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 54 63 GetOptionProc(Tc
3120: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 l_GetChannelType
3130: 28 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 69 (parent));. i
3140: 66 20 28 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 f (getOptionProc
3150: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 != NULL) {..ret
3160: 75 72 6e 20 28 2a 67 65 74 4f 70 74 69 6f 6e 50 urn (*getOptionP
3170: 72 6f 63 29 28 54 63 6c 5f 47 65 74 43 68 61 6e roc)(Tcl_GetChan
3180: 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 nelInstanceData(
3190: 70 61 72 65 6e 74 29 2c 20 69 6e 74 65 72 70 2c parent), interp,
31a0: 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 6f 70 74 optionName, opt
31b0: 69 6f 6e 56 61 6c 75 65 29 3b 0a 20 20 20 20 7d ionValue);. }
31c0: 20 65 6c 73 65 20 69 66 20 28 6f 70 74 69 6f 6e else if (option
31d0: 4e 61 6d 65 20 3d 3d 20 28 63 68 61 72 2a 29 20 Name == (char*)
31e0: 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 52 65 71 75 NULL) {../* Requ
31f0: 65 73 74 20 69 73 20 71 75 65 72 79 20 66 6f 72 est is query for
3200: 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 2c 20 74 68 all options, th
3210: 69 73 20 69 73 20 6f 6b 2e 20 2a 2f 0a 09 72 65 is is ok. */..re
3220: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 turn TCL_OK;.
3230: 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 53 } else {..Tcl_S
3240: 65 74 45 72 72 6e 6f 28 45 49 4e 56 41 4c 29 3b etErrno(EINVAL);
3250: 0a 09 72 65 74 75 72 6e 20 54 63 6c 5f 42 61 64 ..return Tcl_Bad
3260: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
3270: 74 65 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 terp, optionName
3280: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 7d , NULL);. }.}
3290: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
32a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
32b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
32c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
32d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
32e0: 0a 20 2a 20 44 69 67 65 73 74 54 69 6d 65 72 48 . * DigestTimerH
32f0: 61 6e 64 6c 65 72 20 2d 2d 0a 20 2a 0a 20 2a 09 andler --. *. *.
3300: 43 61 6c 6c 65 64 20 62 79 20 74 68 65 20 6e 6f Called by the no
3310: 74 69 66 69 65 72 20 76 69 61 20 74 69 6d 65 72 tifier via timer
3320: 20 74 6f 20 66 6c 75 73 68 20 6f 75 74 20 70 65 to flush out pe
3330: 6e 64 69 6e 67 20 69 6e 70 75 74 20 64 61 74 61 nding input data
3340: 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a .. *. * Returns:
3350: 0a 20 2a 09 4e 6f 74 68 69 6e 67 0a 20 2a 0a 20 . *.Nothing. *.
3360: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
3370: 20 2a 09 4d 61 79 20 63 61 6c 6c 20 54 63 6c 5f *.May call Tcl_
3380: 4e 6f 74 69 66 79 43 68 61 6e 6e 65 6c 0a 20 2a NotifyChannel. *
3390: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
33a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
33b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
33c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
33d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
33e0: 61 74 69 63 20 76 6f 69 64 20 44 69 67 65 73 74 atic void Digest
33f0: 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 43 6c 69 TimerHandler(Cli
3400: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
3410: 74 61 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 ta) {. Digest
3420: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 State *statePtr
3430: 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a = (DigestState *
3440: 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 ) clientData;..
3450: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
3460: 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 >self == (Tcl_Ch
3470: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 annel) NULL) {..
3480: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 return;. }..
3490: 20 20 20 2f 2a 20 43 6c 65 61 72 20 74 69 6d 65 /* Clear time
34a0: 72 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 73 r token */. s
34b0: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d tatePtr->timer =
34c0: 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e (Tcl_TimerToken
34d0: 29 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 ) NULL;.. /*
34e0: 46 69 72 65 20 65 76 65 6e 74 20 69 66 20 74 68 Fire event if th
34f0: 65 72 65 20 69 73 20 70 65 6e 64 69 6e 67 20 64 ere is pending d
3500: 61 74 61 2c 20 73 6b 69 70 20 6f 74 68 65 72 77 ata, skip otherw
3510: 69 73 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 ise */. if ((
3520: 73 74 61 74 65 50 74 72 2d 3e 77 61 74 63 68 4d statePtr->watchM
3530: 61 73 6b 20 26 20 54 43 4c 5f 52 45 41 44 41 42 ask & TCL_READAB
3540: 4c 45 29 20 26 26 20 28 54 63 6c 5f 49 6e 70 75 LE) && (Tcl_Inpu
3550: 74 42 75 66 66 65 72 65 64 28 73 74 61 74 65 50 tBuffered(stateP
3560: 74 72 2d 3e 73 65 6c 66 29 20 3e 20 30 29 29 20 tr->self) > 0))
3570: 7b 0a 09 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61 {..Tcl_NotifyCha
3580: 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 nnel(statePtr->s
3590: 65 6c 66 2c 20 54 43 4c 5f 52 45 41 44 41 42 4c elf, TCL_READABL
35a0: 45 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a E);. }.}../*.
35b0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
35c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35f0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 --------. *. * D
3600: 69 67 65 73 74 57 61 74 63 68 50 72 6f 63 20 2d igestWatchProc -
3610: 2d 0a 20 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 -. *. *.Initiali
3620: 7a 65 20 74 68 65 20 6e 6f 74 69 66 69 65 72 20 ze the notifier
3630: 74 6f 20 77 61 74 63 68 20 66 6f 72 20 65 76 65 to watch for eve
3640: 6e 74 73 20 66 72 6f 6d 20 74 68 69 73 20 63 68 nts from this ch
3650: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 74 annel.. *. * Ret
3660: 75 72 6e 73 3a 0a 20 2a 09 4e 6f 74 68 69 6e 67 urns:. *.Nothing
3670: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
3680: 63 74 73 3a 0a 20 2a 09 43 6f 6e 66 69 67 75 72 cts:. *.Configur
3690: 65 20 6e 6f 74 69 66 69 65 72 20 73 6f 20 66 75 e notifier so fu
36a0: 74 75 72 65 20 65 76 65 6e 74 73 20 6f 6e 20 74 ture events on t
36b0: 68 65 20 63 68 61 6e 6e 65 6c 20 77 69 6c 6c 20 he channel will
36c0: 62 65 20 73 65 65 6e 20 62 79 20 54 63 6c 2e 0a be seen by Tcl..
36d0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
36e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
3720: 23 64 65 66 69 6e 65 20 52 45 41 44 5f 44 45 4c #define READ_DEL
3730: 41 59 09 35 0a 76 6f 69 64 20 44 69 67 65 73 74 AY.5.void Digest
3740: 57 61 74 63 68 50 72 6f 63 28 43 6c 69 65 6e 74 WatchProc(Client
3750: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
3760: 20 69 6e 74 20 6d 61 73 6b 29 20 7b 0a 20 20 20 int mask) {.
3770: 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 DigestState *st
3780: 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 atePtr = (Digest
3790: 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 State *) clientD
37a0: 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 ata;. Tcl_Cha
37b0: 6e 6e 65 6c 20 70 61 72 65 6e 74 3b 0a 20 20 20 nnel parent;.
37c0: 20 54 63 6c 5f 44 72 69 76 65 72 57 61 74 63 68 Tcl_DriverWatch
37d0: 50 72 6f 63 20 2a 77 61 74 63 68 50 72 6f 63 3b Proc *watchProc;
37e0: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 .. if (stateP
37f0: 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c tr->self == (Tcl
3800: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
3810: 7b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d {..return;. }
3820: 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 4f .. /* Store O
3830: 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e R-ed combination
3840: 20 6f 66 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 of TCL_READABLE
3850: 2c 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 20 61 , TCL_WRITABLE a
3860: 6e 64 20 54 43 4c 5f 45 58 43 45 50 54 49 4f 4e nd TCL_EXCEPTION
3870: 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 */. statePtr
3880: 2d 3e 77 61 74 63 68 4d 61 73 6b 20 3d 20 6d 61 ->watchMask = ma
3890: 73 6b 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 70 sk;.. /* Prop
38a0: 61 67 61 74 65 20 6d 61 73 6b 20 69 6e 66 6f 20 agate mask info
38b0: 74 6f 20 70 61 72 65 6e 74 20 63 68 61 6e 6e 65 to parent channe
38c0: 6c 20 2a 2f 0a 20 20 20 20 70 61 72 65 6e 74 20 l */. parent
38d0: 3d 20 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 64 = Tcl_GetStacked
38e0: 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 Channel(statePtr
38f0: 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 20 77 61 74 ->self);. wat
3900: 63 68 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68 61 chProc = Tcl_Cha
3910: 6e 6e 65 6c 57 61 74 63 68 50 72 6f 63 28 54 63 nnelWatchProc(Tc
3920: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 l_GetChannelType
3930: 28 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 77 (parent));. w
3940: 61 74 63 68 50 72 6f 63 28 54 63 6c 5f 47 65 74 atchProc(Tcl_Get
3950: 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 ChannelInstanceD
3960: 61 74 61 28 70 61 72 65 6e 74 29 2c 20 6d 61 73 ata(parent), mas
3970: 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f k);.. /* Remo
3980: 76 65 20 70 65 6e 64 69 6e 67 20 74 69 6d 65 72 ve pending timer
3990: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 */. if (stat
39a0: 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 ePtr->timer != (
39b0: 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 Tcl_TimerToken)
39c0: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c NULL) {..Tcl_Del
39d0: 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 eteTimerHandler(
39e0: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 statePtr->timer)
39f0: 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d ;..statePtr->tim
3a00: 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 er = (Tcl_TimerT
3a10: 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 20 20 20 20 oken) NULL;.
3a20: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 }.. /* If the
3a30: 72 65 20 69 73 20 64 61 74 61 20 70 65 6e 64 69 re is data pendi
3a40: 6e 67 2c 20 73 65 74 20 6e 65 77 20 74 69 6d 65 ng, set new time
3a50: 72 20 74 6f 20 63 61 6c 6c 20 54 63 6c 5f 4e 6f r to call Tcl_No
3a60: 74 69 66 79 43 68 61 6e 6e 65 6c 20 2a 2f 0a 20 tifyChannel */.
3a70: 20 20 20 69 66 20 28 28 6d 61 73 6b 20 26 20 54 if ((mask & T
3a80: 43 4c 5f 52 45 41 44 41 42 4c 45 29 20 26 26 20 CL_READABLE) &&
3a90: 28 54 63 6c 5f 49 6e 70 75 74 42 75 66 66 65 72 (Tcl_InputBuffer
3aa0: 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c ed(statePtr->sel
3ab0: 66 29 20 3e 20 30 29 29 20 7b 0a 09 73 74 61 74 f) > 0)) {..stat
3ac0: 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 54 63 ePtr->timer = Tc
3ad0: 6c 5f 43 72 65 61 74 65 54 69 6d 65 72 48 61 6e l_CreateTimerHan
3ae0: 64 6c 65 72 28 52 45 41 44 5f 44 45 4c 41 59 2c dler(READ_DELAY,
3af0: 20 44 69 67 65 73 74 54 69 6d 65 72 48 61 6e 64 DigestTimerHand
3b00: 6c 65 72 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 ler, (ClientData
3b10: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 ) statePtr);.
3b20: 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d }.}../*. *-----
3b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b70: 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 47 65 -. *. * DigestGe
3b80: 74 48 61 6e 64 6c 65 50 72 6f 63 20 2d 2d 0a 20 tHandleProc --.
3b90: 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 66 72 6f 6d *. *.Called from
3ba0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 48 Tcl_GetChannelH
3bb0: 61 6e 64 6c 65 20 74 6f 20 72 65 74 72 69 65 76 andle to retriev
3bc0: 65 20 4f 53 20 73 70 65 63 69 66 69 63 20 66 69 e OS specific fi
3bd0: 6c 65 20 68 61 6e 64 6c 65 0a 20 2a 09 66 72 6f le handle. *.fro
3be0: 6d 20 69 6e 73 69 64 65 20 74 68 69 73 20 63 68 m inside this ch
3bf0: 61 6e 6e 65 6c 2e 20 4e 6f 74 20 75 73 65 64 20 annel. Not used
3c00: 66 6f 72 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 for transformati
3c10: 6f 6e 73 3f 0a 20 2a 0a 20 2a 20 52 65 74 75 72 ons?. *. * Retur
3c20: 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 66 6f ns:. *.TCL_OK fo
3c30: 72 20 73 75 63 63 65 73 73 20 6f 72 20 54 43 4c r success or TCL
3c40: 5f 45 52 52 4f 52 20 66 6f 72 20 65 72 72 6f 72 _ERROR for error
3c50: 20 6f 72 20 69 66 20 6e 6f 74 20 73 75 70 70 6f or if not suppo
3c60: 72 74 65 64 2e 20 49 66 0a 20 2a 09 64 69 72 65 rted. If. *.dire
3c70: 63 74 69 6f 6e 20 69 73 20 54 43 4c 5f 52 45 41 ction is TCL_REA
3c80: 44 41 42 4c 45 2c 20 73 65 74 73 20 68 61 6e 64 DABLE, sets hand
3c90: 6c 65 50 74 72 20 74 6f 20 74 68 65 20 68 61 6e lePtr to the han
3ca0: 64 6c 65 20 75 73 65 64 20 66 6f 72 0a 20 2a 09 dle used for. *.
3cb0: 69 6e 70 75 74 2c 20 6f 72 20 69 66 20 54 43 4c input, or if TCL
3cc0: 5f 57 52 49 54 41 42 4c 45 20 73 65 74 73 20 74 _WRITABLE sets t
3cd0: 6f 20 74 68 65 20 68 61 6e 64 6c 65 20 75 73 65 o the handle use
3ce0: 64 20 66 6f 72 20 6f 75 74 70 75 74 2e 0a 20 2a d for output.. *
3cf0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
3d00: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d :. *.None. *. *-
3d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3d50: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 -----. */.int Di
3d60: 67 65 73 74 47 65 74 48 61 6e 64 6c 65 50 72 6f gestGetHandlePro
3d70: 63 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 c(ClientData cli
3d80: 65 6e 74 44 61 74 61 2c 20 69 6e 74 20 64 69 72 entData, int dir
3d90: 65 63 74 69 6f 6e 2c 20 43 6c 69 65 6e 74 44 61 ection, ClientDa
3da0: 74 61 20 2a 68 61 6e 64 6c 65 50 74 72 29 20 7b ta *handlePtr) {
3db0: 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65 . DigestState
3dc0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 *statePtr = (Di
3dd0: 67 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 gestState *) cli
3de0: 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 69 66 entData;.. if
3df0: 20 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 (statePtr->self
3e00: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c == (Tcl_Channel
3e10: 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 ) NULL) {..retur
3e20: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
3e30: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 }. return Tc
3e40: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 48 61 6e 64 l_GetChannelHand
3e50: 6c 65 28 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 le(Tcl_GetStacke
3e60: 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 dChannel(statePt
3e70: 72 2d 3e 73 65 6c 66 29 2c 20 64 69 72 65 63 74 r->self), direct
3e80: 69 6f 6e 2c 20 68 61 6e 64 6c 65 50 74 72 29 3b ion, handlePtr);
3e90: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d .}../*. *-------
3ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
3ee0: 20 2a 0a 20 2a 20 44 69 67 65 73 74 4e 6f 74 69 *. * DigestNoti
3ef0: 66 79 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 fyProc --. *. *.
3f00: 43 61 6c 6c 65 64 20 62 79 20 54 63 6c 20 74 6f Called by Tcl to
3f10: 20 69 6e 66 6f 72 6d 20 75 73 20 6f 66 20 61 63 inform us of ac
3f20: 74 69 76 69 74 79 20 6f 6e 20 74 68 65 20 75 6e tivity on the un
3f30: 64 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c derlying channel
3f40: 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a .. *. * Returns:
3f50: 0a 20 2a 09 55 6e 63 68 61 6e 67 65 64 20 69 6e . *.Unchanged in
3f60: 74 65 72 65 73 74 4d 61 73 6b 20 77 68 69 63 68 terestMask which
3f70: 20 69 73 20 61 6e 20 4f 52 2d 65 64 20 63 6f 6d is an OR-ed com
3f80: 62 69 6e 61 74 69 6f 6e 20 6f 66 20 54 43 4c 5f bination of TCL_
3f90: 52 45 41 44 41 42 4c 45 20 6f 72 20 54 43 4c 5f READABLE or TCL_
3fa0: 57 52 49 54 41 42 4c 45 0a 20 2a 0a 20 2a 20 53 WRITABLE. *. * S
3fb0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
3fc0: 43 61 6e 63 65 6c 73 20 61 6e 79 20 70 65 6e 64 Cancels any pend
3fd0: 69 6e 67 20 74 69 6d 65 72 2e 0a 20 2a 0a 20 2a ing timer.. *. *
3fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4020: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 ------. */.int D
4030: 69 67 65 73 74 4e 6f 74 69 66 79 50 72 6f 63 28 igestNotifyProc(
4040: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
4050: 74 44 61 74 61 2c 20 69 6e 74 20 69 6e 74 65 72 tData, int inter
4060: 65 73 74 4d 61 73 6b 29 20 7b 0a 20 20 20 20 44 estMask) {. D
4070: 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 igestState *stat
4080: 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 ePtr = (DigestSt
4090: 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 ate *) clientDat
40a0: 61 3b 0a 0a 20 20 20 20 2f 2a 20 53 6b 69 70 20 a;.. /* Skip
40b0: 74 69 6d 65 72 20 65 76 65 6e 74 20 61 73 20 72 timer event as r
40c0: 65 64 75 6e 64 61 6e 74 20 2a 2f 0a 20 20 20 20 edundant */.
40d0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 if (statePtr->ti
40e0: 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 mer != (Tcl_Time
40f0: 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a rToken) NULL) {.
4100: 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 .Tcl_DeleteTimer
4110: 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 Handler(statePtr
4120: 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 ->timer);..state
4130: 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 Ptr->timer = (Tc
4140: 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 l_TimerToken) NU
4150: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 LL;. }. re
4160: 74 75 72 6e 20 69 6e 74 65 72 65 73 74 4d 61 73 turn interestMas
4170: 6b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 0a 20 2a 20 43 k;.}../*. *. * C
4180: 68 61 6e 6e 65 6c 20 74 79 70 65 20 73 74 72 75 hannel type stru
4190: 63 74 75 72 65 20 64 65 66 69 6e 69 74 69 6f 6e cture definition
41a0: 20 66 6f 72 20 64 69 67 65 73 74 20 74 72 61 6e for digest tran
41b0: 73 66 6f 72 6d 61 74 69 6f 6e 73 2e 0a 20 2a 0a sformations.. *.
41c0: 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 */.static const
41d0: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 Tcl_ChannelType
41e0: 20 64 69 67 65 73 74 43 68 61 6e 6e 65 6c 54 79 digestChannelTy
41f0: 70 65 20 3d 20 7b 0a 20 20 20 20 22 64 69 67 65 pe = {. "dige
4200: 73 74 22 2c 09 09 09 2f 2a 20 54 79 70 65 20 6e st",.../* Type n
4210: 61 6d 65 20 2a 2f 0a 20 20 20 20 54 43 4c 5f 43 ame */. TCL_C
4220: 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 35 HANNEL_VERSION_5
4230: 2c 09 2f 2a 20 76 35 20 63 68 61 6e 6e 65 6c 20 ,./* v5 channel
4240: 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 43 6c 6f */. DigestClo
4250: 73 65 50 72 6f 63 2c 09 09 2f 2a 20 43 6c 6f 73 seProc,../* Clos
4260: 65 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 44 69 e proc */. Di
4270: 67 65 73 74 49 6e 70 75 74 50 72 6f 63 2c 09 09 gestInputProc,..
4280: 2f 2a 20 49 6e 70 75 74 20 70 72 6f 63 20 2a 2f /* Input proc */
4290: 0a 20 20 20 20 44 69 67 65 73 74 4f 75 74 70 75 . DigestOutpu
42a0: 74 50 72 6f 63 2c 09 09 2f 2a 20 4f 75 74 70 75 tProc,../* Outpu
42b0: 74 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 4e 55 t proc */. NU
42c0: 4c 4c 2c 09 09 09 2f 2a 20 53 65 65 6b 20 70 72 LL,.../* Seek pr
42d0: 6f 63 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 oc */. Digest
42e0: 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 2c 09 2f SetOptionProc,./
42f0: 2a 20 53 65 74 20 6f 70 74 69 6f 6e 20 70 72 6f * Set option pro
4300: 63 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 47 c */. DigestG
4310: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 2c 09 2f 2a etOptionProc,./*
4320: 20 47 65 74 20 6f 70 74 69 6f 6e 20 70 72 6f 63 Get option proc
4330: 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 57 61 */. DigestWa
4340: 74 63 68 50 72 6f 63 2c 09 09 2f 2a 20 49 6e 69 tchProc,../* Ini
4350: 74 69 61 6c 69 7a 65 20 6e 6f 74 69 66 69 65 72 tialize notifier
4360: 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 47 65 */. DigestGe
4370: 74 48 61 6e 64 6c 65 50 72 6f 63 2c 09 2f 2a 20 tHandleProc,./*
4380: 47 65 74 20 4f 53 20 68 61 6e 64 6c 65 73 20 6f Get OS handles o
4390: 75 74 20 6f 66 20 63 68 61 6e 6e 65 6c 20 2a 2f ut of channel */
43a0: 0a 20 20 20 20 44 69 67 65 73 74 43 6c 6f 73 65 . DigestClose
43b0: 32 50 72 6f 63 2c 09 09 2f 2a 20 63 6c 6f 73 65 2Proc,../* close
43c0: 32 70 72 6f 63 20 2a 2f 0a 20 20 20 20 44 69 67 2proc */. Dig
43d0: 65 73 74 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 estBlockModeProc
43e0: 2c 09 2f 2a 20 53 65 74 20 62 6c 6f 63 6b 69 6e ,./* Set blockin
43f0: 67 2f 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f g/nonblocking mo
4400: 64 65 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 de*/. NULL,..
4410: 09 2f 2a 20 46 6c 75 73 68 20 70 72 6f 63 20 2a ./* Flush proc *
4420: 2f 0a 20 20 20 20 44 69 67 65 73 74 4e 6f 74 69 /. DigestNoti
4430: 66 79 50 72 6f 63 2c 09 09 2f 2a 20 48 61 6e 64 fyProc,../* Hand
4440: 6c 69 6e 67 20 6f 66 20 65 76 65 6e 74 73 20 62 ling of events b
4450: 75 62 62 6c 69 6e 67 20 75 70 20 2a 2f 0a 20 20 ubbling up */.
4460: 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 57 69 64 NULL,.../* Wid
4470: 65 20 73 65 65 6b 20 70 72 6f 63 20 2a 2f 0a 20 e seek proc */.
4480: 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 54 68 NULL,.../* Th
4490: 72 65 61 64 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 read action */.
44a0: 20 20 20 4e 55 4c 4c 09 09 09 2f 2a 20 54 72 75 NULL.../* Tru
44b0: 6e 63 61 74 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a ncate */.};../*.
44c0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
44d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
44e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
44f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4500: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 --------. *. * D
4510: 69 67 65 73 74 43 68 61 6e 6e 65 6c 20 2d 2d 0a igestChannel --.
4520: 20 2a 0a 20 2a 09 43 72 65 61 74 65 20 61 20 73 *. *.Create a s
4530: 74 61 63 6b 65 64 20 63 68 61 6e 6e 65 6c 20 66 tacked channel f
4540: 6f 72 20 61 20 6d 65 73 73 61 67 65 20 64 69 67 or a message dig
4550: 65 73 74 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 est transformati
4560: 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e on.. *. * Return
4570: 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 s:. *.TCL_OK or
4580: 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 TCL_ERROR. *. *
4590: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
45a0: 09 41 64 64 73 20 74 72 61 6e 73 66 6f 72 6d 20 .Adds transform
45b0: 74 6f 20 63 68 61 6e 6e 65 6c 20 61 6e 64 20 73 to channel and s
45c0: 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20 63 68 ets result to ch
45d0: 61 6e 6e 65 6c 20 6e 61 6d 65 20 6f 72 20 65 72 annel name or er
45e0: 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a ror message.. *.
45f0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
4600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4630: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
4640: 74 69 63 20 69 6e 74 0a 44 69 67 65 73 74 43 68 tic int.DigestCh
4650: 61 6e 6e 65 6c 28 54 63 6c 5f 49 6e 74 65 72 70 annel(Tcl_Interp
4660: 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74 20 *interp, const
4670: 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c 2c 20 63 char *channel, c
4680: 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 2c onst EVP_MD *md,
4690: 20 69 6e 74 20 66 6f 72 6d 61 74 2c 0a 09 54 63 int format,..Tc
46a0: 6c 5f 4f 62 6a 20 2a 6b 65 79 4f 62 6a 29 20 7b l_Obj *keyObj) {
46b0: 0a 20 20 20 20 69 6e 74 20 72 65 73 2c 20 6d 6f . int res, mo
46c0: 64 65 3b 20 2f 2a 20 4f 52 2d 65 64 20 63 6f 6d de; /* OR-ed com
46d0: 62 69 6e 61 74 69 6f 6e 20 6f 66 20 54 43 4c 5f bination of TCL_
46e0: 52 45 41 44 41 42 4c 45 20 61 6e 64 20 54 43 4c READABLE and TCL
46f0: 5f 57 52 49 54 41 42 4c 45 20 2a 2f 0a 20 20 20 _WRITABLE */.
4700: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 Tcl_Channel cha
4710: 6e 3b 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 n;. DigestSta
4720: 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 20 te *statePtr;.
4730: 20 20 45 56 50 5f 4d 44 5f 43 54 58 20 2a 63 74 EVP_MD_CTX *ct
4740: 78 20 3d 20 28 45 56 50 5f 4d 44 5f 43 54 58 20 x = (EVP_MD_CTX
4750: 2a 29 20 4e 55 4c 4c 3b 0a 20 20 20 20 48 4d 41 *) NULL;. HMA
4760: 43 5f 43 54 58 20 2a 68 63 74 78 20 3d 20 28 48 C_CTX *hctx = (H
4770: 4d 41 43 5f 43 54 58 20 2a 29 20 4e 55 4c 4c 3b MAC_CTX *) NULL;
4780: 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 .. /* Validat
4790: 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 69 66 e args */. if
47a0: 20 28 63 68 61 6e 6e 65 6c 20 3d 3d 20 28 63 6f (channel == (co
47b0: 6e 73 74 20 63 68 61 72 20 2a 29 20 4e 55 4c 4c nst char *) NULL
47c0: 20 7c 7c 20 6d 64 20 3d 3d 20 28 63 6f 6e 73 74 || md == (const
47d0: 20 45 56 50 5f 4d 44 20 2a 29 20 4e 55 4c 4c 29 EVP_MD *) NULL)
47e0: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
47f0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
4800: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 chan = Tcl_GetC
4810: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 hannel(interp, c
4820: 68 61 6e 6e 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a hannel, &mode);.
4830: 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 if (chan ==
4840: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 (Tcl_Channel) NU
4850: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 LL) {..return TC
4860: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
4870: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 /* Make sure
4880: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 to operate on t
4890: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e he topmost chann
48a0: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d el */. chan =
48b0: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e Tcl_GetTopChann
48c0: 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f el(chan);.. /
48d0: 2a 20 43 72 65 61 74 65 20 69 6e 74 65 72 6e 61 * Create interna
48e0: 6c 20 73 74 6f 72 61 67 65 20 73 74 72 75 63 74 l storage struct
48f0: 75 72 65 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 ure */. state
4900: 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 Ptr = (DigestSta
4910: 74 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 te *) ckalloc((u
4920: 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 nsigned) sizeof(
4930: 44 69 67 65 73 74 53 74 61 74 65 29 29 3b 0a 20 DigestState));.
4940: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 20 if (statePtr
4950: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6d 65 6d 73 != NULL) {..mems
4960: 65 74 28 73 74 61 74 65 50 74 72 2c 20 30 2c 20 et(statePtr, 0,
4970: 73 69 7a 65 6f 66 28 44 69 67 65 73 74 53 74 61 sizeof(DigestSta
4980: 74 65 29 29 3b 0a 09 73 74 61 74 65 50 74 72 2d te));..statePtr-
4990: 3e 73 65 6c 66 09 3d 20 63 68 61 6e 3b 09 09 2f >self.= chan;../
49a0: 2a 20 54 68 69 73 20 73 6f 63 6b 65 74 20 63 68 * This socket ch
49b0: 61 6e 6e 65 6c 20 2a 2f 0a 09 73 74 61 74 65 50 annel */..stateP
49c0: 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c tr->timer = (Tcl
49d0: 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c _TimerToken) NUL
49e0: 4c 3b 09 2f 2a 20 54 69 6d 65 72 20 74 6f 20 66 L;./* Timer to f
49f0: 6c 75 73 68 20 64 61 74 61 20 2a 2f 0a 09 73 74 lush data */..st
4a00: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 3d 20 atePtr->flags =
4a10: 30 3b 09 09 2f 2a 20 43 68 61 6e 20 63 6f 6e 66 0;../* Chan conf
4a20: 69 67 20 66 6c 61 67 73 20 2a 2f 0a 09 73 74 61 ig flags */..sta
4a30: 74 65 50 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b tePtr->watchMask
4a40: 20 3d 20 30 3b 09 2f 2a 20 43 75 72 72 65 6e 74 = 0;./* Current
4a50: 20 57 61 74 63 68 50 72 6f 63 20 6d 61 73 6b 20 WatchProc mask
4a60: 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 6d 6f */..statePtr->mo
4a70: 64 65 09 3d 20 6d 6f 64 65 3b 09 09 2f 2a 20 43 de.= mode;../* C
4a80: 75 72 72 65 6e 74 20 6d 6f 64 65 20 6f 66 20 70 urrent mode of p
4a90: 61 72 65 6e 74 20 63 68 61 6e 6e 65 6c 20 2a 2f arent channel */
4aa0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d ..statePtr->form
4ab0: 61 74 20 3d 20 66 6f 72 6d 61 74 3b 09 2f 2a 20 at = format;./*
4ac0: 4f 75 74 70 75 74 20 66 6f 72 6d 61 74 20 2a 2f Output format */
4ad0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 ..statePtr->inte
4ae0: 72 70 20 3d 20 69 6e 74 65 72 70 3b 09 2f 2a 20 rp = interp;./*
4af0: 43 75 72 72 65 6e 74 20 69 6e 74 65 72 70 72 65 Current interpre
4b00: 74 65 72 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 ter */..statePtr
4b10: 2d 3e 63 74 78 20 3d 20 63 74 78 3b 09 09 2f 2a ->ctx = ctx;../*
4b20: 20 4d 44 20 43 6f 6e 74 65 78 74 20 2a 2f 0a 09 MD Context */..
4b30: 73 74 61 74 65 50 74 72 2d 3e 68 63 74 78 20 3d statePtr->hctx =
4b40: 20 68 63 74 78 3b 09 09 2f 2a 20 48 4d 41 43 20 hctx;../* HMAC
4b50: 43 6f 6e 74 65 78 74 20 2a 2f 0a 09 73 74 61 74 Context */..stat
4b60: 65 50 74 72 2d 3e 6d 61 63 20 3d 20 4e 55 4c 4c ePtr->mac = NULL
4b70: 3b 09 09 2f 2a 20 4d 41 43 20 43 6f 6e 74 65 78 ;../* MAC Contex
4b80: 74 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 65 20 t */. } else
4b90: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
4ba0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 49 6e 69 ult(interp, "Ini
4bb0: 74 69 61 6c 69 7a 65 20 64 69 67 65 73 74 20 65 tialize digest e
4bc0: 72 72 6f 72 3a 20 6d 65 6d 6f 72 79 20 61 6c 6c rror: memory all
4bd0: 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 22 ocation failure"
4be0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
4bf0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
4c00: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
4c10: 2f 2a 20 43 72 65 61 74 65 20 6d 65 73 73 61 67 /* Create messag
4c20: 65 20 64 69 67 65 73 74 20 63 6f 6e 74 65 78 74 e digest context
4c30: 20 2a 2f 0a 20 20 20 20 69 66 20 28 6b 65 79 4f */. if (keyO
4c40: 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 bj == NULL) {..c
4c50: 74 78 20 3d 20 45 56 50 5f 4d 44 5f 43 54 58 5f tx = EVP_MD_CTX_
4c60: 6e 65 77 28 29 3b 0a 20 20 20 20 7d 20 65 6c 73 new();. } els
4c70: 65 20 7b 0a 09 68 63 74 78 20 3d 20 48 4d 41 43 e {..hctx = HMAC
4c80: 5f 43 54 58 5f 6e 65 77 28 29 3b 0a 20 20 20 20 _CTX_new();.
4c90: 7d 0a 20 20 20 20 69 66 20 28 63 74 78 20 21 3d }. if (ctx !=
4ca0: 20 4e 55 4c 4c 20 7c 7c 20 68 63 74 78 20 21 3d NULL || hctx !=
4cb0: 20 4e 55 4c 4c 29 20 7b 0a 09 73 74 61 74 65 50 NULL) {..stateP
4cc0: 74 72 2d 3e 63 74 78 20 3d 20 63 74 78 3b 0a 09 tr->ctx = ctx;..
4cd0: 73 74 61 74 65 50 74 72 2d 3e 68 63 74 78 20 3d statePtr->hctx =
4ce0: 20 68 63 74 78 3b 0a 20 20 20 20 7d 20 65 6c 73 hctx;. } els
4cf0: 65 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 e {..Tcl_AppendR
4d00: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 esult(interp, "C
4d10: 72 65 61 74 65 20 64 69 67 65 73 74 20 63 6f 6e reate digest con
4d20: 74 65 78 74 20 66 61 69 6c 65 64 3a 20 22 2c 20 text failed: ",
4d30: 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b REASON(), NULL);
4d40: 0a 09 44 69 67 65 73 74 46 72 65 65 28 73 74 61 ..DigestFree(sta
4d50: 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 tePtr);..return
4d60: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
4d70: 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c .. /* Initial
4d80: 69 7a 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f ize hash functio
4d90: 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 6b 65 79 n */. if (key
4da0: 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 Obj == NULL) {..
4db0: 72 65 73 20 3d 20 45 56 50 5f 44 69 67 65 73 74 res = EVP_Digest
4dc0: 49 6e 69 74 5f 65 78 28 63 74 78 2c 20 6d 64 2c Init_ex(ctx, md,
4dd0: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 20 65 6c NULL);. } el
4de0: 73 65 20 7b 0a 09 69 6e 74 20 6b 65 79 5f 6c 65 se {..int key_le
4df0: 6e 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 n;..unsigned cha
4e00: 72 20 2a 6b 65 79 20 3d 20 54 63 6c 5f 47 65 74 r *key = Tcl_Get
4e10: 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a ByteArrayFromObj
4e20: 28 6b 65 79 4f 62 6a 2c 20 26 6b 65 79 5f 6c 65 (keyObj, &key_le
4e30: 6e 29 3b 0a 09 72 65 73 20 3d 20 48 4d 41 43 5f n);..res = HMAC_
4e40: 49 6e 69 74 5f 65 78 28 68 63 74 78 2c 20 28 63 Init_ex(hctx, (c
4e50: 6f 6e 73 74 20 76 6f 69 64 20 2a 29 20 6b 65 79 onst void *) key
4e60: 2c 20 6b 65 79 5f 6c 65 6e 2c 20 6d 64 2c 20 4e , key_len, md, N
4e70: 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 ULL);. }.
4e80: 69 66 20 28 21 72 65 73 29 20 7b 0a 09 54 63 6c if (!res) {..Tcl
4e90: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
4ea0: 74 65 72 70 2c 20 22 49 6e 69 74 69 61 6c 69 7a terp, "Initializ
4eb0: 65 20 64 69 67 65 73 74 20 66 61 69 6c 65 64 3a e digest failed:
4ec0: 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 ", REASON(), (c
4ed0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 44 har *) NULL);..D
4ee0: 69 67 65 73 74 46 72 65 65 28 73 74 61 74 65 50 igestFree(stateP
4ef0: 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c tr);..return TCL
4f00: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
4f10: 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 20 /* Configure
4f20: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 54 channel */. T
4f30: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_SetChannelOpt
4f40: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e ion(interp, chan
4f50: 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 , "-translation"
4f60: 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a 20 20 20 , "binary");.
4f70: 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e if (Tcl_GetChan
4f80: 6e 65 6c 42 75 66 66 65 72 53 69 7a 65 28 63 68 nelBufferSize(ch
4f90: 61 6e 29 20 3c 20 45 56 50 5f 4d 41 58 5f 4d 44 an) < EVP_MAX_MD
4fa0: 5f 53 49 5a 45 20 2a 20 32 29 20 7b 0a 09 54 63 _SIZE * 2) {..Tc
4fb0: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 42 75 66 66 l_SetChannelBuff
4fc0: 65 72 53 69 7a 65 28 63 68 61 6e 2c 20 45 56 50 erSize(chan, EVP
4fd0: 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45 20 2a 20 32 _MAX_MD_SIZE * 2
4fe0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a );. }.. /*
4ff0: 20 53 74 61 63 6b 20 63 68 61 6e 6e 65 6c 20 2a Stack channel *
5000: 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e /. statePtr->
5010: 73 65 6c 66 20 3d 20 54 63 6c 5f 53 74 61 63 6b self = Tcl_Stack
5020: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 Channel(interp,
5030: 26 64 69 67 65 73 74 43 68 61 6e 6e 65 6c 54 79 &digestChannelTy
5040: 70 65 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 pe, (ClientData)
5050: 20 73 74 61 74 65 50 74 72 2c 20 6d 6f 64 65 2c statePtr, mode,
5060: 20 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 chan);. if (
5070: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d statePtr->self =
5080: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
5090: 4e 55 4c 4c 29 20 7b 0a 09 44 69 67 65 73 74 46 NULL) {..DigestF
50a0: 72 65 65 28 73 74 61 74 65 50 74 72 29 3b 0a 09 ree(statePtr);..
50b0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
50c0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c ;. }.. Tcl
50d0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 _SetResult(inter
50e0: 70 2c 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f p, (char *) Tcl_
50f0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 GetChannelName(c
5100: 68 61 6e 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 han), TCL_VOLATI
5110: 4c 45 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 LE);. return
5120: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a TCL_OK;.}../*. *
5130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5170: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e 73 ------. *. * Uns
5180: 74 61 63 6b 20 43 68 61 6e 6e 65 6c 20 2d 2d 0a tack Channel --.
5190: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 *. *.This proce
51a0: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 dure is invoked
51b0: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 to process the "
51c0: 75 6e 73 74 61 63 6b 22 20 54 43 4c 20 63 6f 6d unstack" TCL com
51d0: 6d 61 6e 64 2e 0a 20 2a 09 53 65 65 20 74 68 65 mand.. *.See the
51e0: 20 75 73 65 72 20 64 6f 63 75 6d 65 6e 74 61 74 user documentat
51f0: 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c 73 20 ion for details
5200: 6f 6e 20 77 68 61 74 20 69 74 20 64 6f 65 73 2e on what it does.
5210: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a . *. * Returns:.
5220: 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c *.TCL_OK or TCL
5230: 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 _ERROR. *. * Sid
5240: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 52 65 e effects:. *.Re
5250: 6d 6f 76 65 73 20 74 72 61 6e 73 66 6f 72 6d 20 moves transform
5260: 66 72 6f 6d 20 63 68 61 6e 6e 65 6c 20 6f 72 20 from channel or
5270: 73 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20 65 sets result to e
5280: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a rror message.. *
5290: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
52a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
52b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
52c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
52d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
52e0: 61 74 69 63 20 69 6e 74 0a 55 6e 73 74 61 63 6b atic int.Unstack
52f0: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 ObjCmd(ClientDat
5300: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
5310: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
5320: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
5330: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
5340: 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 ]) {. Tcl_Cha
5350: 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 69 nnel chan;. i
5360: 6e 74 20 6d 6f 64 65 3b 20 2f 2a 20 4f 52 2d 65 nt mode; /* OR-e
5370: 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 d combination of
5380: 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 61 6e TCL_READABLE an
5390: 64 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 20 20 d TCL_WRITABLE
53a0: 2a 2f 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 */.. if (objc
53b0: 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 != 2) {..Tcl_Wr
53c0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
53d0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 p, 1, objv, "cha
53e0: 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 nnel");..return
53f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
5400: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 68 61 .. /* Get cha
5410: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e nnel */. chan
5420: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 = Tcl_GetChanne
5430: 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 l(interp, Tcl_Ge
5440: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f tStringFromObj(o
5450: 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 26 bjv[1], NULL), &
5460: 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63 mode);. if (c
5470: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e han == (Tcl_Chan
5480: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 nel) NULL) {..re
5490: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
54a0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 }.. /* Ma
54b0: 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 ke sure to opera
54c0: 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 te on the topmos
54d0: 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 t channel */.
54e0: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 chan = Tcl_GetT
54f0: 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b opChannel(chan);
5500: 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 .. /* Check i
5510: 66 20 64 69 67 65 73 74 20 63 68 61 6e 6e 65 6c f digest channel
5520: 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f */. if (Tcl_
5530: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 GetChannelType(c
5540: 68 61 6e 29 20 21 3d 20 26 64 69 67 65 73 74 43 han) != &digestC
5550: 68 61 6e 6e 65 6c 54 79 70 65 29 20 7b 0a 09 54 hannelType) {..T
5560: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
5570: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 interp, "bad cha
5580: 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 nnel \"", Tcl_Ge
5590: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 tChannelName(cha
55a0: 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f n),.. "\": no
55b0: 74 20 61 20 64 69 67 65 73 74 20 63 68 61 6e 6e t a digest chann
55c0: 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c el", NULL);..Tcl
55d0: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e _SetErrorCode(in
55e0: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 55 4e terp, "TLS", "UN
55f0: 53 54 41 43 4b 22 2c 20 22 43 48 41 4e 4e 45 4c STACK", "CHANNEL
5600: 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 ", "INVALID", (c
5610: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 har *) NULL);..r
5620: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
5630: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 . }.. /* P
5640: 6f 70 20 74 72 61 6e 73 66 6f 72 6d 20 66 72 6f op transform fro
5650: 6d 20 63 68 61 6e 6e 65 6c 2c 20 6c 65 61 76 65 m channel, leave
5660: 73 20 65 72 72 6f 72 20 69 6e 66 6f 20 69 6e 20 s error info in
5670: 69 6e 74 65 72 70 20 72 65 73 75 6c 74 20 2a 2f interp result */
5680: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 55 6e 73 . if (Tcl_Uns
5690: 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 tackChannel(inte
56a0: 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54 43 4c rp, chan) == TCL
56b0: 5f 45 52 52 4f 52 29 20 7b 0a 09 72 65 74 75 72 _ERROR) {..retur
56c0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
56d0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 }. return TC
56e0: 4c 5f 4f 4b 3b 0a 20 20 20 20 09 63 6c 69 65 6e L_OK;. .clien
56f0: 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 tData = clientDa
5700: 74 61 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a ta;.}../********
5710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a ***********/../*
5750: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
5760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5790: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 ------. *. * Dig
57a0: 65 73 74 48 61 73 68 46 75 6e 63 74 69 6f 6e 20 estHashFunction
57b0: 2d 2d 0a 20 2a 0a 20 2a 09 20 43 61 6c 63 75 6c --. *. *. Calcul
57c0: 61 74 65 20 6d 65 73 73 61 67 65 20 64 69 67 65 ate message dige
57d0: 73 74 20 75 73 69 6e 67 20 68 61 73 68 20 66 75 st using hash fu
57e0: 6e 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 nction.. *. * Re
57f0: 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b turns:. *.TCL_OK
5800: 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a or TCL_ERROR. *
5810: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
5820: 3a 0a 20 2a 09 53 65 74 73 20 72 65 73 75 6c 74 :. *.Sets result
5830: 20 74 6f 20 6d 65 73 73 61 67 65 20 64 69 67 65 to message dige
5840: 73 74 20 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 st or error mess
5850: 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d age. *. *-------
5860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
58a0: 0a 69 6e 74 0a 44 69 67 65 73 74 48 61 73 68 46 .int.DigestHashF
58b0: 75 6e 63 74 69 6f 6e 28 54 63 6c 5f 49 6e 74 65 unction(Tcl_Inte
58c0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
58d0: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 objc, Tcl_Obj *c
58e0: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 2c 0a 09 63 6f onst objv[],..co
58f0: 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 2c 20 nst EVP_MD *md,
5900: 69 6e 74 20 66 6f 72 6d 61 74 2c 20 54 63 6c 5f int format, Tcl_
5910: 4f 62 6a 20 2a 6b 65 79 4f 62 6a 29 20 7b 0a 20 Obj *keyObj) {.
5920: 20 20 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 char *data;.
5930: 20 20 20 69 6e 74 20 6c 65 6e 2c 20 72 65 73 3b int len, res;
5940: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e . unsigned in
5950: 74 20 6d 64 5f 6c 65 6e 3b 0a 20 20 20 20 75 6e t md_len;. un
5960: 73 69 67 6e 65 64 20 63 68 61 72 20 6d 64 5f 62 signed char md_b
5970: 75 66 5b 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 uf[EVP_MAX_MD_SI
5980: 5a 45 5d 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 ZE];.. if (ob
5990: 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f jc != 2) {..Tcl_
59a0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
59b0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 64 erp, 1, objv, "d
59c0: 61 74 61 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 ata");..return T
59d0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
59e0: 0a 20 20 20 20 2f 2a 20 47 65 74 20 64 61 74 61 . /* Get data
59f0: 20 2a 2f 0a 20 20 20 20 64 61 74 61 20 3d 20 54 */. data = T
5a00: 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 cl_GetByteArrayF
5a10: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 romObj(objv[1],
5a20: 26 6c 65 6e 29 3b 0a 20 20 20 20 69 66 20 28 64 &len);. if (d
5a30: 61 74 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 6c ata == NULL || l
5a40: 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 54 63 6c 5f en == 0) {..Tcl_
5a50: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 SetResult(interp
5a60: 2c 20 22 4e 6f 20 64 61 74 61 22 2c 20 4e 55 4c , "No data", NUL
5a70: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f L);..return TCL_
5a80: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
5a90: 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 64 /* Calculate d
5aa0: 69 67 65 73 74 20 62 61 73 65 64 20 6f 6e 20 68 igest based on h
5ab0: 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a ash function */.
5ac0: 20 20 20 20 69 66 20 28 6b 65 79 4f 62 6a 20 3d if (keyObj =
5ad0: 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a 29 20 4e 55 = (Tcl_Obj *) NU
5ae0: 4c 4c 29 20 7b 0a 09 72 65 73 20 3d 20 45 56 50 LL) {..res = EVP
5af0: 5f 44 69 67 65 73 74 28 64 61 74 61 2c 20 28 73 _Digest(data, (s
5b00: 69 7a 65 5f 74 29 20 6c 65 6e 2c 20 6d 64 5f 62 ize_t) len, md_b
5b10: 75 66 2c 20 26 6d 64 5f 6c 65 6e 2c 20 6d 64 2c uf, &md_len, md,
5b20: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 20 65 6c NULL);. } el
5b30: 73 65 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 se {..unsigned c
5b40: 68 61 72 20 2a 6b 65 79 2c 20 2a 68 6d 61 63 20 har *key, *hmac
5b50: 3d 20 4e 55 4c 4c 3b 0a 09 69 6e 74 20 6b 65 79 = NULL;..int key
5b60: 5f 6c 65 6e 3b 0a 0a 09 6b 65 79 20 3d 20 54 63 _len;...key = Tc
5b70: 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 l_GetByteArrayFr
5b80: 6f 6d 4f 62 6a 28 6b 65 79 4f 62 6a 2c 20 26 6b omObj(keyObj, &k
5b90: 65 79 5f 6c 65 6e 29 3b 0a 09 68 6d 61 63 20 3d ey_len);..hmac =
5ba0: 20 48 4d 41 43 28 6d 64 2c 20 28 63 6f 6e 73 74 HMAC(md, (const
5bb0: 20 76 6f 69 64 20 2a 29 20 6b 65 79 2c 20 6b 65 void *) key, ke
5bc0: 79 5f 6c 65 6e 2c 20 28 63 6f 6e 73 74 20 75 6e y_len, (const un
5bd0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 64 signed char *) d
5be0: 61 74 61 2c 0a 09 20 20 20 20 28 73 69 7a 65 5f ata,.. (size_
5bf0: 74 29 20 6c 65 6e 2c 20 6d 64 5f 62 75 66 2c 20 t) len, md_buf,
5c00: 26 6d 64 5f 6c 65 6e 29 3b 0a 09 72 65 73 20 3d &md_len);..res =
5c10: 20 28 68 6d 61 63 20 21 3d 20 4e 55 4c 4c 29 3b (hmac != NULL);
5c20: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f . }.. /* O
5c30: 75 74 70 75 74 20 64 69 67 65 73 74 20 74 6f 20 utput digest to
5c40: 72 65 73 75 6c 74 20 70 65 72 20 66 6f 72 6d 61 result per forma
5c50: 74 20 28 62 69 6e 20 6f 72 20 68 65 78 29 20 2a t (bin or hex) *
5c60: 2f 0a 20 20 20 20 69 66 20 28 72 65 73 29 20 7b /. if (res) {
5c70: 0a 09 69 66 20 28 66 6f 72 6d 61 74 20 3d 3d 20 ..if (format ==
5c80: 42 49 4e 5f 46 4f 52 4d 41 54 29 20 7b 0a 09 20 BIN_FORMAT) {..
5c90: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 Tcl_SetObjRes
5ca0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f ult(interp, Tcl_
5cb0: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 NewByteArrayObj(
5cc0: 6d 64 5f 62 75 66 2c 20 6d 64 5f 6c 65 6e 29 29 md_buf, md_len))
5cd0: 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 ;...} else {..
5ce0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c Tcl_Obj *resul
5cf0: 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 tObj = Tcl_NewOb
5d00: 6a 28 29 3b 0a 09 20 20 20 20 75 6e 73 69 67 6e j();.. unsign
5d10: 65 64 20 63 68 61 72 20 2a 70 74 72 20 3d 20 54 ed char *ptr = T
5d20: 63 6c 5f 53 65 74 42 79 74 65 41 72 72 61 79 4c cl_SetByteArrayL
5d30: 65 6e 67 74 68 28 72 65 73 75 6c 74 4f 62 6a 2c ength(resultObj,
5d40: 20 6d 64 5f 6c 65 6e 2a 32 29 3b 0a 0a 09 20 20 md_len*2);...
5d50: 20 20 66 6f 72 20 28 75 6e 73 69 67 6e 65 64 20 for (unsigned
5d60: 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 6d int i = 0; i < m
5d70: 64 5f 6c 65 6e 3b 20 69 2b 2b 29 20 7b 0a 09 09 d_len; i++) {...
5d80: 2a 70 74 72 2b 2b 20 3d 20 68 65 78 5b 28 6d 64 *ptr++ = hex[(md
5d90: 5f 62 75 66 5b 69 5d 20 3e 3e 20 34 29 20 26 20 _buf[i] >> 4) &
5da0: 30 78 30 46 5d 3b 0a 09 09 2a 70 74 72 2b 2b 20 0x0F];...*ptr++
5db0: 3d 20 68 65 78 5b 6d 64 5f 62 75 66 5b 69 5d 20 = hex[md_buf[i]
5dc0: 26 20 30 78 30 46 5d 3b 0a 09 20 20 20 20 7d 0a & 0x0F];.. }.
5dd0: 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c .Tcl_SetObjResul
5de0: 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 t(interp, result
5df0: 4f 62 6a 29 3b 0a 09 7d 0a 0a 20 20 20 20 7d 20 Obj);..}.. }
5e00: 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 41 70 70 65 else {..Tcl_Appe
5e10: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
5e20: 20 22 48 61 73 68 20 63 61 6c 63 75 6c 61 74 69 "Hash calculati
5e30: 6f 6e 20 65 72 72 6f 72 3a 22 2c 20 52 45 41 53 on error:", REAS
5e40: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e ON(), (char *) N
5e50: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 ULL);..return TC
5e60: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 L_ERROR;. }.
5e70: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
5e80: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ;.}../*. *------
5e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
5ed0: 0a 20 2a 20 44 69 67 65 73 74 4f 62 6a 43 6d 64 . * DigestObjCmd
5ee0: 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 75 72 6e --. *. *.Return
5ef0: 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20 message digest
5f00: 75 73 69 6e 67 20 75 73 65 72 20 73 70 65 63 69 using user speci
5f10: 66 69 65 64 20 68 61 73 68 20 66 75 6e 63 74 69 fied hash functi
5f20: 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e on.. *. * Return
5f30: 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 s:. *.TCL_OK or
5f40: 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 TCL_ERROR. *. *
5f50: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
5f60: 09 53 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20 .Sets result to
5f70: 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20 6f message digest o
5f80: 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a r error message.
5f90: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
5fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5fd0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
5fe0: 74 69 63 20 69 6e 74 0a 44 69 67 65 73 74 4f 62 tic int.DigestOb
5ff0: 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 jCmd(ClientData
6000: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f clientData, Tcl_
6010: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
6020: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 int objc, Tcl_Ob
6030: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 j *const objv[])
6040: 20 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 2c 20 {. int idx,
6050: 6c 65 6e 2c 20 66 6f 72 6d 61 74 20 3d 20 48 45 len, format = HE
6060: 58 5f 46 4f 52 4d 41 54 2c 20 6b 65 79 5f 6c 65 X_FORMAT, key_le
6070: 6e 20 3d 20 30 2c 20 64 61 74 61 5f 6c 65 6e 20 n = 0, data_len
6080: 3d 20 30 2c 20 72 65 73 20 3d 20 54 43 4c 5f 4f = 0, res = TCL_O
6090: 4b 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 K;. const cha
60a0: 72 20 2a 64 69 67 65 73 74 6e 61 6d 65 2c 20 2a r *digestname, *
60b0: 63 68 61 6e 6e 65 6c 20 3d 20 4e 55 4c 4c 3b 0a channel = NULL;.
60c0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 64 61 74 Tcl_Obj *dat
60d0: 61 4f 62 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 66 69 aObj = NULL, *fi
60e0: 6c 65 4f 62 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 6b leObj = NULL, *k
60f0: 65 79 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 eyObj = NULL;.
6100: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 unsigned char
6110: 2a 6b 65 79 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 *key = NULL;.
6120: 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d const EVP_MD *m
6130: 64 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 d;.. Tcl_Rese
6140: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b tResult(interp);
6150: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c .. if (objc <
6160: 20 33 20 7c 7c 20 6f 62 6a 63 20 3e 20 37 29 20 3 || objc > 7)
6170: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 {..Tcl_WrongNumA
6180: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f rgs(interp, 1, o
6190: 62 6a 76 2c 20 22 74 79 70 65 20 3f 2d 62 69 6e bjv, "type ?-bin
61a0: 7c 2d 68 65 78 3f 20 3f 2d 6b 65 79 20 68 6d 61 |-hex? ?-key hma
61b0: 63 5f 6b 65 79 3f 20 5b 2d 63 68 61 6e 6e 65 6c c_key? [-channel
61c0: 20 63 68 61 6e 20 7c 20 2d 66 69 6c 65 20 66 69 chan | -file fi
61d0: 6c 65 6e 61 6d 65 20 7c 20 3f 2d 64 61 74 61 3f lename | ?-data?
61e0: 20 64 61 74 61 5d 22 29 3b 0a 09 72 65 74 75 72 data]");..retur
61f0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
6200: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 64 }.. /* Get d
6210: 69 67 65 73 74 20 2a 2f 0a 20 20 20 20 64 69 67 igest */. dig
6220: 65 73 74 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 estname = Tcl_Ge
6230: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f tStringFromObj(o
6240: 62 6a 76 5b 31 5d 2c 20 26 6c 65 6e 29 3b 0a 20 bjv[1], &len);.
6250: 20 20 20 69 66 20 28 64 69 67 65 73 74 6e 61 6d if (digestnam
6260: 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 28 6d 64 e == NULL || (md
6270: 20 3d 20 45 56 50 5f 67 65 74 5f 64 69 67 65 73 = EVP_get_diges
6280: 74 62 79 6e 61 6d 65 28 64 69 67 65 73 74 6e 61 tbyname(digestna
6290: 6d 65 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a me)) == NULL) {.
62a0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
62b0: 74 28 69 6e 74 65 72 70 2c 20 22 49 6e 76 61 6c t(interp, "Inval
62c0: 69 64 20 64 69 67 65 73 74 20 74 79 70 65 20 5c id digest type \
62d0: 22 22 2c 20 64 69 67 65 73 74 6e 61 6d 65 2c 20 "", digestname,
62e0: 22 5c 22 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 "\"", NULL);..re
62f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
6300: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 70 }.. /* Op
6310: 74 69 6d 61 6c 20 63 61 73 65 20 66 6f 72 20 62 timal case for b
6320: 6c 6f 62 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 lob of data */.
6330: 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 33 if (objc == 3
6340: 29 20 7b 0a 09 72 65 74 75 72 6e 20 44 69 67 65 ) {..return Dige
6350: 73 74 48 61 73 68 46 75 6e 63 74 69 6f 6e 28 69 stHashFunction(i
6360: 6e 74 65 72 70 2c 20 2d 2d 6f 62 6a 63 2c 20 2b nterp, --objc, +
6370: 2b 6f 62 6a 76 2c 20 6d 64 2c 20 66 6f 72 6d 61 +objv, md, forma
6380: 74 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a t, NULL);. }.
6390: 0a 20 20 20 20 2f 2a 20 47 65 74 20 6f 70 74 69 . /* Get opti
63a0: 6f 6e 73 20 2a 2f 0a 20 20 20 20 66 6f 72 20 28 ons */. for (
63b0: 69 64 78 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f idx = 2; idx < o
63c0: 62 6a 63 2d 31 3b 20 69 64 78 2b 2b 29 20 7b 0a bjc-1; idx++) {.
63d0: 09 63 68 61 72 20 2a 6f 70 74 20 3d 20 54 63 6c .char *opt = Tcl
63e0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
63f0: 6a 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 4e 55 4c j(objv[idx], NUL
6400: 4c 29 3b 0a 0a 09 69 66 20 28 6f 70 74 5b 30 5d L);...if (opt[0]
6410: 20 21 3d 20 27 2d 27 29 0a 09 20 20 20 20 62 72 != '-').. br
6420: 65 61 6b 3b 0a 0a 09 4f 50 54 46 4c 41 47 28 22 eak;...OPTFLAG("
6430: 2d 62 69 6e 22 2c 20 66 6f 72 6d 61 74 2c 20 42 -bin", format, B
6440: 49 4e 5f 46 4f 52 4d 41 54 29 3b 0a 09 4f 50 54 IN_FORMAT);..OPT
6450: 46 4c 41 47 28 22 2d 62 69 6e 61 72 79 22 2c 20 FLAG("-binary",
6460: 66 6f 72 6d 61 74 2c 20 42 49 4e 5f 46 4f 52 4d format, BIN_FORM
6470: 41 54 29 3b 0a 09 4f 50 54 46 4c 41 47 28 22 2d AT);..OPTFLAG("-
6480: 68 65 78 22 2c 20 66 6f 72 6d 61 74 2c 20 48 45 hex", format, HE
6490: 58 5f 46 4f 52 4d 41 54 29 3b 0a 09 4f 50 54 46 X_FORMAT);..OPTF
64a0: 4c 41 47 28 22 2d 68 65 78 61 64 65 63 69 6d 61 LAG("-hexadecima
64b0: 6c 22 2c 20 66 6f 72 6d 61 74 2c 20 48 45 58 5f l", format, HEX_
64c0: 46 4f 52 4d 41 54 29 3b 0a 09 4f 50 54 4f 42 4a FORMAT);..OPTOBJ
64d0: 28 22 2d 64 61 74 61 22 2c 20 64 61 74 61 4f 62 ("-data", dataOb
64e0: 6a 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 68 j);..OPTSTR("-ch
64f0: 61 6e 22 2c 20 63 68 61 6e 6e 65 6c 29 3b 0a 09 an", channel);..
6500: 4f 50 54 53 54 52 28 22 2d 63 68 61 6e 6e 65 6c OPTSTR("-channel
6510: 22 2c 20 63 68 61 6e 6e 65 6c 29 3b 0a 09 4f 50 ", channel);..OP
6520: 54 4f 42 4a 28 22 2d 66 69 6c 65 22 2c 20 66 69 TOBJ("-file", fi
6530: 6c 65 4f 62 6a 29 3b 0a 09 4f 50 54 4f 42 4a 28 leObj);..OPTOBJ(
6540: 22 2d 66 69 6c 65 6e 61 6d 65 22 2c 20 66 69 6c "-filename", fil
6550: 65 4f 62 6a 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 eObj);..OPTOBJ("
6560: 2d 6b 65 79 22 2c 20 6b 65 79 4f 62 6a 29 3b 0a -key", keyObj);.
6570: 0a 09 4f 50 54 42 41 44 28 22 6f 70 74 69 6f 6e ..OPTBAD("option
6580: 22 2c 20 22 2d 62 69 6e 2c 20 2d 64 61 74 61 2c ", "-bin, -data,
6590: 20 2d 66 69 6c 65 2c 20 2d 66 69 6c 65 6e 61 6d -file, -filenam
65a0: 65 2c 20 2d 68 65 78 2c 20 6f 72 20 2d 6b 65 79 e, -hex, or -key
65b0: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ");..return TCL_
65c0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
65d0: 20 20 2f 2a 20 49 66 20 6e 6f 20 6f 70 74 69 6f /* If no optio
65e0: 6e 20 66 6f 72 20 6c 61 73 74 20 61 72 67 2c 20 n for last arg,
65f0: 74 68 65 6e 20 69 74 73 20 74 68 65 20 64 61 74 then its the dat
6600: 61 20 2a 2f 0a 20 20 20 20 69 66 20 28 69 64 78 a */. if (idx
6610: 20 3c 20 6f 62 6a 63 29 20 7b 0a 09 64 61 74 61 < objc) {..data
6620: 4f 62 6a 20 3d 20 6f 62 6a 76 5b 69 64 78 5d 3b Obj = objv[idx];
6630: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 . }.. /* C
6640: 61 6c 63 20 64 69 67 65 73 74 20 6f 6e 20 66 69 alc digest on fi
6650: 6c 65 2c 20 73 74 61 63 6b 65 64 20 63 68 61 6e le, stacked chan
6660: 6e 65 6c 2c 20 6f 72 20 64 61 74 61 20 62 6c 6f nel, or data blo
6670: 62 20 2a 2f 0a 20 20 20 20 69 66 20 28 66 69 6c b */. if (fil
6680: 65 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a eObj != NULL) {.
6690: 09 72 65 73 20 3d 20 44 69 67 65 73 74 46 69 6c .res = DigestFil
66a0: 65 28 69 6e 74 65 72 70 2c 20 66 69 6c 65 4f 62 e(interp, fileOb
66b0: 6a 2c 20 6d 64 2c 20 66 6f 72 6d 61 74 2c 20 6b j, md, format, k
66c0: 65 79 4f 62 6a 29 3b 0a 20 20 20 20 7d 20 65 6c eyObj);. } el
66d0: 73 65 20 69 66 20 28 63 68 61 6e 6e 65 6c 20 21 se if (channel !
66e0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 20 3d = NULL) {..res =
66f0: 20 44 69 67 65 73 74 43 68 61 6e 6e 65 6c 28 69 DigestChannel(i
6700: 6e 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c 2c 20 nterp, channel,
6710: 6d 64 2c 20 66 6f 72 6d 61 74 2c 20 6b 65 79 4f md, format, keyO
6720: 62 6a 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 bj);. } else
6730: 69 66 20 28 64 61 74 61 4f 62 6a 20 21 3d 20 4e if (dataObj != N
6740: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 ULL) {..Tcl_Obj
6750: 2a 6f 62 6a 73 5b 32 5d 3b 0a 09 6f 62 6a 73 5b *objs[2];..objs[
6760: 30 5d 20 3d 20 4e 55 4c 4c 3b 0a 09 6f 62 6a 73 0] = NULL;..objs
6770: 5b 31 5d 20 3d 20 64 61 74 61 4f 62 6a 3b 0a 09 [1] = dataObj;..
6780: 72 65 73 20 3d 20 44 69 67 65 73 74 48 61 73 68 res = DigestHash
6790: 46 75 6e 63 74 69 6f 6e 28 69 6e 74 65 72 70 2c Function(interp,
67a0: 20 32 2c 20 6f 62 6a 73 2c 20 6d 64 2c 20 66 6f 2, objs, md, fo
67b0: 72 6d 61 74 2c 20 6b 65 79 4f 62 6a 29 3b 0a 20 rmat, keyObj);.
67c0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 }. return
67d0: 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d res;.}../*. *---
67e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
67f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6820: 0a 20 2a 0a 20 2a 20 4d 65 73 73 61 67 65 20 44 . *. * Message D
6830: 69 67 65 73 74 20 43 6f 6e 76 65 6e 69 65 6e 63 igest Convenienc
6840: 65 20 43 6f 6d 6d 61 6e 64 73 20 2d 2d 0a 20 2a e Commands --. *
6850: 0a 20 2a 09 43 6f 6e 76 65 6e 69 65 6e 63 65 20 . *.Convenience
6860: 63 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 6d 65 73 commands for mes
6870: 73 61 67 65 20 64 69 67 65 73 74 73 2e 0a 20 2a sage digests.. *
6880: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 . * Returns:. *.
6890: 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 TCL_OK or TCL_ER
68a0: 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ROR. *. * Side e
68b0: 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 ffects:. *.Sets
68c0: 72 65 73 75 6c 74 20 74 6f 20 6d 65 73 73 61 67 result to messag
68d0: 65 20 64 69 67 65 73 74 20 6f 72 20 65 72 72 6f e digest or erro
68e0: 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d r message. *. *-
68f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6930: 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 --. */.int Diges
6940: 74 4d 44 34 43 6d 64 28 43 6c 69 65 6e 74 44 61 tMD4Cmd(ClientDa
6950: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
6960: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
6970: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
6980: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
6990: 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e []) {. return
69a0: 20 44 69 67 65 73 74 48 61 73 68 46 75 6e 63 74 DigestHashFunct
69b0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f 62 6a 63 ion(interp, objc
69c0: 2c 20 6f 62 6a 76 2c 20 45 56 50 5f 6d 64 34 28 , objv, EVP_md4(
69d0: 29 2c 20 48 45 58 5f 46 4f 52 4d 41 54 2c 20 4e ), HEX_FORMAT, N
69e0: 55 4c 4c 29 3b 0a 7d 0a 0a 69 6e 74 20 44 69 67 ULL);.}..int Dig
69f0: 65 73 74 4d 44 35 43 6d 64 28 43 6c 69 65 6e 74 estMD5Cmd(Client
6a00: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
6a10: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
6a20: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 erp, int objc, T
6a30: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
6a40: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 jv[]) {. retu
6a50: 72 6e 20 44 69 67 65 73 74 48 61 73 68 46 75 6e rn DigestHashFun
6a60: 63 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f 62 ction(interp, ob
6a70: 6a 63 2c 20 6f 62 6a 76 2c 20 45 56 50 5f 6d 64 jc, objv, EVP_md
6a80: 35 28 29 2c 20 48 45 58 5f 46 4f 52 4d 41 54 2c 5(), HEX_FORMAT,
6a90: 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 69 6e 74 20 44 NULL);.}..int D
6aa0: 69 67 65 73 74 53 48 41 31 43 6d 64 28 43 6c 69 igestSHA1Cmd(Cli
6ab0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
6ac0: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a ta, Tcl_Interp *
6ad0: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 interp, int objc
6ae0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 , Tcl_Obj *const
6af0: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 72 objv[]) {. r
6b00: 65 74 75 72 6e 20 44 69 67 65 73 74 48 61 73 68 eturn DigestHash
6b10: 46 75 6e 63 74 69 6f 6e 28 69 6e 74 65 72 70 2c Function(interp,
6b20: 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 45 56 50 objc, objv, EVP
6b30: 5f 73 68 61 31 28 29 2c 20 48 45 58 5f 46 4f 52 _sha1(), HEX_FOR
6b40: 4d 41 54 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 69 MAT, NULL);.}..i
6b50: 6e 74 20 44 69 67 65 73 74 53 48 41 32 35 36 43 nt DigestSHA256C
6b60: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c md(ClientData cl
6b70: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e ientData, Tcl_In
6b80: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e terp *interp, in
6b90: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 t objc, Tcl_Obj
6ba0: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b *const objv[]) {
6bb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 44 69 67 65 . return Dige
6bc0: 73 74 48 61 73 68 46 75 6e 63 74 69 6f 6e 28 69 stHashFunction(i
6bd0: 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a nterp, objc, obj
6be0: 76 2c 20 45 56 50 5f 73 68 61 32 35 36 28 29 2c v, EVP_sha256(),
6bf0: 20 48 45 58 5f 46 4f 52 4d 41 54 2c 20 4e 55 4c HEX_FORMAT, NUL
6c00: 4c 29 3b 0a 7d 0a 0a 69 6e 74 20 44 69 67 65 73 L);.}..int Diges
6c10: 74 53 48 41 35 31 32 43 6d 64 28 43 6c 69 65 6e tSHA512Cmd(Clien
6c20: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
6c30: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
6c40: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
6c50: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
6c60: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74 bjv[]) {. ret
6c70: 75 72 6e 20 44 69 67 65 73 74 48 61 73 68 46 75 urn DigestHashFu
6c80: 6e 63 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f nction(interp, o
6c90: 62 6a 63 2c 20 6f 62 6a 76 2c 20 45 56 50 5f 73 bjc, objv, EVP_s
6ca0: 68 61 35 31 32 28 29 2c 20 48 45 58 5f 46 4f 52 ha512(), HEX_FOR
6cb0: 4d 41 54 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 2f MAT, NULL);.}../
6cc0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
6cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d00: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c -------. *. * Tl
6d10: 73 5f 44 69 67 65 73 74 43 6f 6d 6d 61 6e 64 73 s_DigestCommands
6d20: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 72 65 61 74 65 --. *. *.Create
6d30: 20 64 69 67 65 73 74 20 63 6f 6d 6d 61 6e 64 73 digest commands
6d40: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a . *. * Returns:.
6d50: 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c *.TCL_OK or TCL
6d60: 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 _ERROR. *. * Sid
6d70: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 72 e effects:. *.Cr
6d80: 65 61 74 65 73 20 63 6f 6d 6d 61 6e 64 73 0a 20 eates commands.
6d90: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
6da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6dd0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 -------. */.int
6de0: 54 6c 73 5f 44 69 67 65 73 74 43 6f 6d 6d 61 6e Tls_DigestComman
6df0: 64 73 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 ds(Tcl_Interp *i
6e00: 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 54 63 6c nterp) {. Tcl
6e10: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
6e20: 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a d(interp, "tls::
6e30: 64 69 67 65 73 74 22 2c 20 44 69 67 65 73 74 4f digest", DigestO
6e40: 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
6e50: 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 ta) 0, (Tcl_CmdD
6e60: 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
6e70: 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
6e80: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
6e90: 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 64 34 22 2c erp, "tls::md4",
6ea0: 20 44 69 67 65 73 74 4d 44 34 43 6d 64 2c 20 28 DigestMD4Cmd, (
6eb0: 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 ClientData) 0, (
6ec0: 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f Tcl_CmdDeletePro
6ed0: 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 c *) NULL);.
6ee0: 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
6ef0: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c mand(interp, "tl
6f00: 73 3a 3a 6d 64 35 22 2c 20 44 69 67 65 73 74 4d s::md5", DigestM
6f10: 44 35 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 D5Cmd, (ClientDa
6f20: 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 ta) 0, (Tcl_CmdD
6f30: 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
6f40: 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
6f50: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
6f60: 65 72 70 2c 20 22 74 6c 73 3a 3a 73 68 61 31 22 erp, "tls::sha1"
6f70: 2c 20 44 69 67 65 73 74 53 48 41 31 43 6d 64 2c , DigestSHA1Cmd,
6f80: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c (ClientData) 0,
6f90: 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 (Tcl_CmdDeleteP
6fa0: 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 roc *) NULL);.
6fb0: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
6fc0: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
6fd0: 74 6c 73 3a 3a 73 68 61 32 35 36 22 2c 20 44 69 tls::sha256", Di
6fe0: 67 65 73 74 53 48 41 32 35 36 43 6d 64 2c 20 28 gestSHA256Cmd, (
6ff0: 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 ClientData) 0, (
7000: 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f Tcl_CmdDeletePro
7010: 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 c *) NULL);.
7020: 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
7030: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c mand(interp, "tl
7040: 73 3a 3a 73 68 61 35 31 32 22 2c 20 44 69 67 65 s::sha512", Dige
7050: 73 74 53 48 41 35 31 32 43 6d 64 2c 20 28 43 6c stSHA512Cmd, (Cl
7060: 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 ientData) 0, (Tc
7070: 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
7080: 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 *) NULL);. Tc
7090: 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
70a0: 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a nd(interp, "tls:
70b0: 3a 75 6e 73 74 61 63 6b 22 2c 20 55 6e 73 74 61 :unstack", Unsta
70c0: 63 6b 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e ckObjCmd, (Clien
70d0: 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 tData) 0, (Tcl_C
70e0: 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
70f0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 72 65 74 75 72 NULL);. retur
7100: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a n TCL_OK;.}..