0000: 2f 2a 0a 20 2a 20 4d 65 73 73 61 67 65 20 44 69 /*. * Message Di
0010: 67 65 73 74 20 28 4d 44 29 20 61 6e 64 20 4d 65 gest (MD) and Me
0020: 73 73 61 67 65 20 41 75 74 68 65 6e 74 69 63 61 ssage Authentica
0030: 74 69 6f 6e 20 43 6f 64 65 20 28 4d 41 43 29 20 tion Code (MAC)
0040: 4d 6f 64 75 6c 65 0a 20 2a 0a 20 2a 20 50 72 6f Module. *. * Pro
0050: 76 69 64 65 73 20 63 6f 6d 6d 61 6e 64 73 20 74 vides commands t
0060: 6f 20 63 61 6c 63 75 6c 61 74 65 20 61 20 6d 65 o calculate a me
0070: 73 73 61 67 65 20 64 69 67 65 73 74 20 28 4d 44 ssage digest (MD
0080: 29 20 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a 20 ) or message. *
0090: 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 63 authentication c
00a0: 6f 64 65 20 28 4d 41 43 29 20 75 73 69 6e 67 20 ode (MAC) using
00b0: 61 20 73 70 65 63 69 66 69 65 64 20 68 61 73 68 a specified hash
00c0: 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 2f 6f 72 function and/or
00d0: 20 63 69 70 68 65 72 2e 0a 20 2a 0a 20 2a 20 43 cipher.. *. * C
00e0: 6f 70 79 72 69 67 68 74 20 28 43 29 20 32 30 32 opyright (C) 202
00f0: 33 20 42 72 69 61 6e 20 4f 27 48 61 67 61 6e 0a 3 Brian O'Hagan.
0100: 20 2a 0a 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 *. */..#include
0110: 20 22 74 6c 73 49 6e 74 2e 68 22 0a 23 69 6e 63 "tlsInt.h".#inc
0120: 6c 75 64 65 20 22 74 63 6c 4f 70 74 73 2e 68 22 lude "tclOpts.h"
0130: 0a 23 69 6e 63 6c 75 64 65 20 3c 74 63 6c 2e 68 .#include <tcl.h
0140: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 >.#include <stdi
0150: 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 o.h>.#include <s
0160: 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 tring.h>.#includ
0170: 65 20 3c 6f 70 65 6e 73 73 6c 2f 65 76 70 2e 68 e <openssl/evp.h
0180: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e >.#include <open
0190: 73 73 6c 2f 63 6d 61 63 2e 68 3e 0a 23 69 6e 63 ssl/cmac.h>.#inc
01a0: 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 68 6d lude <openssl/hm
01b0: 61 63 2e 68 3e 0a 0a 2f 2a 20 43 6f 6e 73 74 61 ac.h>../* Consta
01c0: 6e 74 73 20 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 nts */.const cha
01d0: 72 20 2a 68 65 78 20 3d 20 22 30 31 32 33 34 35 r *hex = "012345
01e0: 36 37 38 39 61 62 63 64 65 66 22 3b 0a 0a 2f 2a 6789abcdef";../*
01f0: 20 4d 61 63 72 6f 73 20 2a 2f 0a 23 64 65 66 69 Macros */.#defi
0200: 6e 65 20 42 55 46 46 45 52 5f 53 49 5a 45 09 36 ne BUFFER_SIZE.6
0210: 35 35 33 36 0a 23 64 65 66 69 6e 65 20 43 48 41 5536.#define CHA
0220: 4e 5f 45 4f 46 09 30 78 31 30 0a 23 64 65 66 69 N_EOF.0x10.#defi
0230: 6e 65 20 52 45 41 44 5f 44 45 4c 41 59 09 35 0a ne READ_DELAY.5.
0240: 0a 2f 2a 20 44 69 67 65 73 74 20 66 6f 72 6d 61 ./* Digest forma
0250: 74 20 61 6e 64 20 6f 70 65 72 61 74 69 6f 6e 20 t and operation
0260: 2a 2f 0a 23 64 65 66 69 6e 65 20 42 49 4e 5f 46 */.#define BIN_F
0270: 4f 52 4d 41 54 09 30 78 30 31 0a 23 64 65 66 69 ORMAT.0x01.#defi
0280: 6e 65 20 48 45 58 5f 46 4f 52 4d 41 54 09 30 78 ne HEX_FORMAT.0x
0290: 30 32 0a 23 64 65 66 69 6e 65 20 49 53 5f 58 4f 02.#define IS_XO
02a0: 46 09 09 30 78 30 38 0a 23 64 65 66 69 6e 65 20 F..0x08.#define
02b0: 54 59 50 45 5f 4d 44 09 09 30 78 31 30 0a 23 64 TYPE_MD..0x10.#d
02c0: 65 66 69 6e 65 20 54 59 50 45 5f 48 4d 41 43 09 efine TYPE_HMAC.
02d0: 30 78 32 30 0a 23 64 65 66 69 6e 65 20 54 59 50 0x20.#define TYP
02e0: 45 5f 43 4d 41 43 09 30 78 34 30 0a 23 64 65 66 E_CMAC.0x40.#def
02f0: 69 6e 65 20 54 59 50 45 5f 4d 41 43 09 30 78 38 ine TYPE_MAC.0x8
0300: 30 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 0..#if OPENSSL_V
0310: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 3d ERSION_NUMBER <=
0320: 20 30 78 33 30 30 30 30 30 30 30 4c 0a 23 64 65 0x30000000L.#de
0330: 66 69 6e 65 20 45 56 50 5f 4d 41 43 20 76 6f 69 fine EVP_MAC voi
0340: 64 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 d.#endif../*. *
0350: 54 68 69 73 20 73 74 72 75 63 74 75 72 65 20 64 This structure d
0360: 65 66 69 6e 65 73 20 74 68 65 20 70 65 72 2d 69 efines the per-i
0370: 6e 73 74 61 6e 63 65 20 73 74 61 74 65 20 6f 66 nstance state of
0380: 20 61 20 64 69 67 65 73 74 20 6f 70 65 72 61 74 a digest operat
0390: 69 6f 6e 2e 0a 20 2a 2f 0a 74 79 70 65 64 65 66 ion.. */.typedef
03a0: 20 73 74 72 75 63 74 20 44 69 67 65 73 74 53 74 struct DigestSt
03b0: 61 74 65 20 7b 0a 09 54 63 6c 5f 43 68 61 6e 6e ate {..Tcl_Chann
03c0: 65 6c 20 73 65 6c 66 3b 09 2f 2a 20 54 68 69 73 el self;./* This
03d0: 20 73 6f 63 6b 65 74 20 63 68 61 6e 6e 65 6c 20 socket channel
03e0: 2a 2f 0a 09 54 63 6c 5f 54 69 6d 65 72 54 6f 6b */..Tcl_TimerTok
03f0: 65 6e 20 74 69 6d 65 72 3b 09 2f 2a 20 54 69 6d en timer;./* Tim
0400: 65 72 20 66 6f 72 20 72 65 61 64 20 65 76 65 6e er for read even
0410: 74 73 20 2a 2f 0a 0a 09 69 6e 74 20 66 6c 61 67 ts */...int flag
0420: 73 3b 09 09 2f 2a 20 43 68 61 6e 20 63 6f 6e 66 s;../* Chan conf
0430: 69 67 20 66 6c 61 67 73 20 2a 2f 0a 09 69 6e 74 ig flags */..int
0440: 20 77 61 74 63 68 4d 61 73 6b 3b 09 09 2f 2a 20 watchMask;../*
0450: 43 75 72 72 65 6e 74 20 57 61 74 63 68 50 72 6f Current WatchPro
0460: 63 20 6d 61 73 6b 20 2a 2f 0a 09 69 6e 74 20 6d c mask */..int m
0470: 6f 64 65 3b 09 09 2f 2a 20 43 75 72 72 65 6e 74 ode;../* Current
0480: 20 6d 6f 64 65 20 6f 66 20 70 61 72 65 6e 74 20 mode of parent
0490: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 09 69 6e 74 20 channel */..int
04a0: 66 6f 72 6d 61 74 3b 09 09 2f 2a 20 44 69 67 65 format;../* Dige
04b0: 73 74 20 66 6f 72 6d 61 74 20 61 6e 64 20 6f 70 st format and op
04c0: 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 09 54 63 6c eration */...Tcl
04d0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b _Interp *interp;
04e0: 09 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 65 ./* Current inte
04f0: 72 70 72 65 74 65 72 20 2a 2f 0a 09 45 56 50 5f rpreter */..EVP_
0500: 4d 44 5f 43 54 58 20 2a 63 74 78 3b 09 2f 2a 20 MD_CTX *ctx;./*
0510: 4d 44 20 43 6f 6e 74 65 78 74 20 2a 2f 0a 09 48 MD Context */..H
0520: 4d 41 43 5f 43 54 58 20 2a 68 63 74 78 3b 09 09 MAC_CTX *hctx;..
0530: 2f 2a 20 48 4d 41 43 20 43 6f 6e 74 65 78 74 20 /* HMAC Context
0540: 2a 2f 0a 09 43 4d 41 43 5f 43 54 58 20 2a 63 63 */..CMAC_CTX *cc
0550: 74 78 3b 09 09 2f 2a 20 43 4d 41 43 20 43 6f 6e tx;../* CMAC Con
0560: 74 65 78 74 20 2a 2f 0a 09 54 63 6c 5f 43 6f 6d text */..Tcl_Com
0570: 6d 61 6e 64 20 74 6f 6b 65 6e 3b 09 2f 2a 20 43 mand token;./* C
0580: 6f 6d 6d 61 6e 64 20 74 6f 6b 65 6e 20 2a 2f 0a ommand token */.
0590: 7d 20 44 69 67 65 73 74 53 74 61 74 65 3b 0a 0a } DigestState;..
05a0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
05b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
05c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
05d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
05e0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 --------. *. * D
05f0: 69 67 65 73 74 53 74 61 74 65 4e 65 77 20 2d 2d igestStateNew --
0600: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 . *. *.This func
0610: 74 69 6f 6e 20 63 72 65 61 74 65 73 20 61 20 70 tion creates a p
0620: 65 72 2d 69 6e 73 74 61 6e 63 65 20 73 74 61 74 er-instance stat
0630: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 e data structure
0640: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a . *. * Returns:.
0650: 20 2a 09 44 69 67 65 73 74 20 73 74 72 75 63 74 *.Digest struct
0660: 75 72 65 20 70 6f 69 6e 74 65 72 0a 20 2a 0a 20 ure pointer. *.
0670: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
0680: 20 2a 09 43 72 65 61 74 65 73 20 73 74 72 75 63 *.Creates struc
0690: 74 75 72 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ture. *. *------
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
06e0: 2f 0a 44 69 67 65 73 74 53 74 61 74 65 20 2a 44 /.DigestState *D
06f0: 69 67 65 73 74 53 74 61 74 65 4e 65 77 28 54 63 igestStateNew(Tc
0700: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
0710: 2c 20 69 6e 74 20 66 6f 72 6d 61 74 29 20 7b 0a , int format) {.
0720: 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20 DigestState
0730: 2a 73 74 61 74 65 50 74 72 3b 0a 0a 20 20 20 20 *statePtr;..
0740: 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 statePtr = (Dige
0750: 73 74 53 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c stState *) ckall
0760: 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69 oc((unsigned) si
0770: 7a 65 6f 66 28 44 69 67 65 73 74 53 74 61 74 65 zeof(DigestState
0780: 29 29 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74 ));. if (stat
0790: 65 50 74 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a ePtr != NULL) {.
07a0: 09 6d 65 6d 73 65 74 28 73 74 61 74 65 50 74 72 .memset(statePtr
07b0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 44 69 67 65 , 0, sizeof(Dige
07c0: 73 74 53 74 61 74 65 29 29 3b 0a 09 73 74 61 74 stState));..stat
07d0: 65 50 74 72 2d 3e 73 65 6c 66 09 3d 20 4e 55 4c ePtr->self.= NUL
07e0: 4c 3b 09 09 2f 2a 20 54 68 69 73 20 73 6f 63 6b L;../* This sock
07f0: 65 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 09 73 et channel */..s
0800: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d tatePtr->timer =
0810: 20 4e 55 4c 4c 3b 09 09 2f 2a 20 54 69 6d 65 72 NULL;../* Timer
0820: 20 74 6f 20 66 6c 75 73 68 20 64 61 74 61 20 2a to flush data *
0830: 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 /..statePtr->fla
0840: 67 73 20 3d 20 30 3b 09 09 2f 2a 20 43 68 61 6e gs = 0;../* Chan
0850: 20 63 6f 6e 66 69 67 20 66 6c 61 67 73 20 2a 2f config flags */
0860: 0a 09 73 74 61 74 65 50 74 72 2d 3e 77 61 74 63 ..statePtr->watc
0870: 68 4d 61 73 6b 20 3d 20 30 3b 09 2f 2a 20 43 75 hMask = 0;./* Cu
0880: 72 72 65 6e 74 20 57 61 74 63 68 50 72 6f 63 20 rrent WatchProc
0890: 6d 61 73 6b 20 2a 2f 0a 09 73 74 61 74 65 50 74 mask */..statePt
08a0: 72 2d 3e 6d 6f 64 65 09 3d 20 30 3b 09 09 2f 2a r->mode.= 0;../*
08b0: 20 43 75 72 72 65 6e 74 20 6d 6f 64 65 20 6f 66 Current mode of
08c0: 20 70 61 72 65 6e 74 20 63 68 61 6e 6e 65 6c 20 parent channel
08d0: 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6f */..statePtr->fo
08e0: 72 6d 61 74 20 3d 20 66 6f 72 6d 61 74 3b 09 2f rmat = format;./
08f0: 2a 20 44 69 67 65 73 74 20 66 6f 72 6d 61 74 20 * Digest format
0900: 61 6e 64 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f and operation */
0910: 0a 09 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 ..statePtr->inte
0920: 72 70 20 3d 20 69 6e 74 65 72 70 3b 09 2f 2a 20 rp = interp;./*
0930: 43 75 72 72 65 6e 74 20 69 6e 74 65 72 70 72 65 Current interpre
0940: 74 65 72 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 ter */..statePtr
0950: 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 09 09 2f ->ctx = NULL;../
0960: 2a 20 4d 44 20 43 6f 6e 74 65 78 74 20 2a 2f 0a * MD Context */.
0970: 09 73 74 61 74 65 50 74 72 2d 3e 68 63 74 78 20 .statePtr->hctx
0980: 3d 20 4e 55 4c 4c 3b 09 09 2f 2a 20 48 4d 41 43 = NULL;../* HMAC
0990: 20 43 6f 6e 74 65 78 74 20 2a 2f 0a 09 73 74 61 Context */..sta
09a0: 74 65 50 74 72 2d 3e 63 63 74 78 20 3d 20 4e 55 tePtr->cctx = NU
09b0: 4c 4c 3b 09 09 2f 2a 20 43 4d 41 43 20 43 6f 6e LL;../* CMAC Con
09c0: 74 65 78 74 20 2a 2f 0a 09 73 74 61 74 65 50 74 text */..statePt
09d0: 72 2d 3e 74 6f 6b 65 6e 20 3d 20 4e 55 4c 4c 3b r->token = NULL;
09e0: 09 09 2f 2a 20 43 6f 6d 6d 61 6e 64 20 74 6f 6b ../* Command tok
09f0: 65 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 en */. }.
0a00: 72 65 74 75 72 6e 20 73 74 61 74 65 50 74 72 3b return statePtr;
0a10: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d .}../*. *-------
0a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
0a60: 20 2a 20 44 69 67 65 73 74 53 74 61 74 65 46 72 * DigestStateFr
0a70: 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 ee --. *. *.This
0a80: 20 66 75 6e 63 74 69 6f 6e 20 64 65 6c 65 74 65 function delete
0a90: 73 20 61 20 64 69 67 65 73 74 20 73 74 61 74 65 s a digest state
0aa0: 20 73 74 72 75 63 74 75 72 65 0a 20 2a 0a 20 2a structure. *. *
0ab0: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 4e 6f 74 Returns:. *.Not
0ac0: 68 69 6e 67 0a 20 2a 0a 20 2a 20 53 69 64 65 20 hing. *. * Side
0ad0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 52 65 6d 6f effects:. *.Remo
0ae0: 76 65 73 20 73 74 72 75 63 74 75 72 65 0a 20 2a ves structure. *
0af0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
0b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b30: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 ------. */.void
0b40: 44 69 67 65 73 74 53 74 61 74 65 46 72 65 65 28 DigestStateFree(
0b50: 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 DigestState *sta
0b60: 74 65 50 74 72 29 20 7b 0a 20 20 20 20 69 66 20 tePtr) {. if
0b70: 28 73 74 61 74 65 50 74 72 20 3d 3d 20 28 44 69 (statePtr == (Di
0b80: 67 65 73 74 53 74 61 74 65 20 2a 29 20 4e 55 4c gestState *) NUL
0b90: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 L) {..return;.
0ba0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f }.. /* Remo
0bb0: 76 65 20 70 65 6e 64 69 6e 67 20 74 69 6d 65 72 ve pending timer
0bc0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 */. if (stat
0bd0: 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 ePtr->timer != (
0be0: 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 Tcl_TimerToken)
0bf0: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c NULL) {..Tcl_Del
0c00: 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 eteTimerHandler(
0c10: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 statePtr->timer)
0c20: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
0c30: 46 72 65 65 20 63 6f 6e 74 65 78 74 20 73 74 72 Free context str
0c40: 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 69 uctures */. i
0c50: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 f (statePtr->ctx
0c60: 20 21 3d 20 28 45 56 50 5f 4d 44 5f 43 54 58 20 != (EVP_MD_CTX
0c70: 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 45 56 50 5f *) NULL) {..EVP_
0c80: 4d 44 5f 43 54 58 5f 66 72 65 65 28 73 74 61 74 MD_CTX_free(stat
0c90: 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20 ePtr->ctx);.
0ca0: 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 }. if (stateP
0cb0: 74 72 2d 3e 68 63 74 78 20 21 3d 20 28 48 4d 41 tr->hctx != (HMA
0cc0: 43 5f 43 54 58 20 2a 29 20 4e 55 4c 4c 29 20 7b C_CTX *) NULL) {
0cd0: 0a 09 48 4d 41 43 5f 43 54 58 5f 66 72 65 65 28 ..HMAC_CTX_free(
0ce0: 73 74 61 74 65 50 74 72 2d 3e 68 63 74 78 29 3b statePtr->hctx);
0cf0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 . }. if (s
0d00: 74 61 74 65 50 74 72 2d 3e 63 63 74 78 20 21 3d tatePtr->cctx !=
0d10: 20 28 43 4d 41 43 5f 43 54 58 20 2a 29 20 4e 55 (CMAC_CTX *) NU
0d20: 4c 4c 29 20 7b 0a 09 43 4d 41 43 5f 43 54 58 5f LL) {..CMAC_CTX_
0d30: 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 63 free(statePtr->c
0d40: 63 74 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 ctx);. }.
0d50: 63 6b 66 72 65 65 28 73 74 61 74 65 50 74 72 29 ckfree(statePtr)
0d60: 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ;.}../**********
0d70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0d80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0d90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0da0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 *********/../*.
0db0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
0dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0df0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 ----. *. * Diges
0e00: 74 49 6e 69 74 69 61 6c 69 7a 65 20 2d 2d 0a 20 tInitialize --.
0e10: 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 20 *. *.Initialize
0e20: 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 0a a hash function.
0e30: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 *. * Returns:.
0e40: 2a 09 54 43 4c 5f 4f 4b 20 69 66 20 73 75 63 63 *.TCL_OK if succ
0e50: 65 73 73 66 75 6c 20 6f 72 20 54 43 4c 5f 45 52 essful or TCL_ER
0e60: 52 4f 52 20 66 6f 72 20 66 61 69 6c 75 72 65 20 ROR for failure
0e70: 77 69 74 68 20 72 65 73 75 6c 74 20 73 65 74 0a with result set.
0e80: 20 2a 09 74 6f 20 65 72 72 6f 72 20 6d 65 73 73 *.to error mess
0e90: 61 67 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 age.. *. * Side
0ea0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 20 72 effects:. *.No r
0eb0: 65 73 75 6c 74 20 6f 72 20 65 72 72 6f 72 20 6d esult or error m
0ec0: 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d essage. *. *----
0ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
0f10: 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 49 6e */.int DigestIn
0f20: 69 74 69 61 6c 69 7a 65 28 54 63 6c 5f 49 6e 74 itialize(Tcl_Int
0f30: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 44 69 67 erp *interp, Dig
0f40: 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 estState *stateP
0f50: 74 72 2c 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 tr, const EVP_MD
0f60: 20 2a 6d 64 2c 0a 09 63 6f 6e 73 74 20 45 56 50 *md,..const EVP
0f70: 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 2c _CIPHER *cipher,
0f80: 20 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4f 62 6a Tcl_Obj *keyObj
0f90: 2c 20 45 56 50 5f 4d 41 43 20 2a 6d 61 63 29 20 , EVP_MAC *mac)
0fa0: 7b 0a 20 20 20 20 69 6e 74 20 6b 65 79 5f 6c 65 {. int key_le
0fb0: 6e 20 3d 20 30 2c 20 72 65 73 20 3d 20 30 3b 0a n = 0, res = 0;.
0fc0: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e const unsign
0fd0: 65 64 20 63 68 61 72 20 2a 6b 65 79 20 3d 20 4e ed char *key = N
0fe0: 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 ULL;.. /* Cre
0ff0: 61 74 65 20 6d 65 73 73 61 67 65 20 64 69 67 65 ate message dige
1000: 73 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 st context */.
1010: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
1020: 66 6f 72 6d 61 74 20 26 20 54 59 50 45 5f 4d 44 format & TYPE_MD
1030: 29 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 ) {..statePtr->c
1040: 74 78 20 3d 20 45 56 50 5f 4d 44 5f 43 54 58 5f tx = EVP_MD_CTX_
1050: 6e 65 77 28 29 3b 0a 09 72 65 73 20 3d 20 28 73 new();..res = (s
1060: 74 61 74 65 50 74 72 2d 3e 63 74 78 20 21 3d 20 tatePtr->ctx !=
1070: 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 NULL);. } els
1080: 65 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e e if (statePtr->
1090: 66 6f 72 6d 61 74 20 26 20 54 59 50 45 5f 48 4d format & TYPE_HM
10a0: 41 43 29 20 7b 0a 09 73 74 61 74 65 50 74 72 2d AC) {..statePtr-
10b0: 3e 68 63 74 78 20 3d 20 48 4d 41 43 5f 43 54 58 >hctx = HMAC_CTX
10c0: 5f 6e 65 77 28 29 3b 0a 09 72 65 73 20 3d 20 28 _new();..res = (
10d0: 73 74 61 74 65 50 74 72 2d 3e 68 63 74 78 20 21 statePtr->hctx !
10e0: 3d 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 20 65 = NULL);. } e
10f0: 6c 73 65 20 69 66 20 28 73 74 61 74 65 50 74 72 lse if (statePtr
1100: 2d 3e 66 6f 72 6d 61 74 20 26 20 54 59 50 45 5f ->format & TYPE_
1110: 43 4d 41 43 29 20 7b 0a 09 73 74 61 74 65 50 74 CMAC) {..statePt
1120: 72 2d 3e 63 63 74 78 20 3d 20 43 4d 41 43 5f 43 r->cctx = CMAC_C
1130: 54 58 5f 6e 65 77 28 29 3b 0a 09 72 65 73 20 3d TX_new();..res =
1140: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 63 74 78 (statePtr->cctx
1150: 20 21 3d 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d != NULL);. }
1160: 0a 20 20 20 20 69 66 20 28 21 72 65 73 29 20 7b . if (!res) {
1170: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
1180: 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 72 65 61 lt(interp, "Crea
1190: 74 65 20 63 6f 6e 74 65 78 74 20 66 61 69 6c 65 te context faile
11a0: 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 d: ", REASON(),
11b0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NULL);..return T
11c0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
11d0: 0a 20 20 20 20 2f 2a 20 47 65 74 20 6b 65 79 20 . /* Get key
11e0: 2a 2f 0a 20 20 20 20 69 66 20 28 6b 65 79 4f 62 */. if (keyOb
11f0: 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6b 65 j != NULL) {..ke
1200: 79 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 y = Tcl_GetByteA
1210: 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6b 65 79 4f rrayFromObj(keyO
1220: 62 6a 2c 20 26 6b 65 79 5f 6c 65 6e 29 3b 0a 20 bj, &key_len);.
1230: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 }.. /* Ini
1240: 74 69 61 6c 69 7a 65 20 68 61 73 68 20 66 75 6e tialize hash fun
1250: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 20 ction */. if
1260: 28 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 (statePtr->forma
1270: 74 20 26 20 54 59 50 45 5f 4d 44 29 20 7b 0a 09 t & TYPE_MD) {..
1280: 72 65 73 20 3d 20 45 56 50 5f 44 69 67 65 73 74 res = EVP_Digest
1290: 49 6e 69 74 5f 65 78 28 73 74 61 74 65 50 74 72 Init_ex(statePtr
12a0: 2d 3e 63 74 78 2c 20 6d 64 2c 20 4e 55 4c 4c 29 ->ctx, md, NULL)
12b0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 ;. } else if
12c0: 28 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 (statePtr->forma
12d0: 74 20 26 20 54 59 50 45 5f 48 4d 41 43 29 20 7b t & TYPE_HMAC) {
12e0: 0a 09 72 65 73 20 3d 20 48 4d 41 43 5f 49 6e 69 ..res = HMAC_Ini
12f0: 74 5f 65 78 28 73 74 61 74 65 50 74 72 2d 3e 68 t_ex(statePtr->h
1300: 63 74 78 2c 20 28 63 6f 6e 73 74 20 76 6f 69 64 ctx, (const void
1310: 20 2a 29 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e *) key, key_len
1320: 2c 20 6d 64 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 , md, NULL);.
1330: 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 61 74 } else if (stat
1340: 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20 54 ePtr->format & T
1350: 59 50 45 5f 43 4d 41 43 29 20 7b 0a 09 72 65 73 YPE_CMAC) {..res
1360: 20 3d 20 43 4d 41 43 5f 49 6e 69 74 28 73 74 61 = CMAC_Init(sta
1370: 74 65 50 74 72 2d 3e 63 63 74 78 2c 20 28 63 6f tePtr->cctx, (co
1380: 6e 73 74 20 76 6f 69 64 20 2a 29 20 6b 65 79 2c nst void *) key,
1390: 20 6b 65 79 5f 6c 65 6e 2c 20 63 69 70 68 65 72 key_len, cipher
13a0: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 , NULL);. }.
13b0: 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 0a 09 if (!res) {..
13c0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
13d0: 28 69 6e 74 65 72 70 2c 20 22 49 6e 69 74 69 61 (interp, "Initia
13e0: 6c 69 7a 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 lize failed: ",
13f0: 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b REASON(), NULL);
1400: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
1410: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 OR;. }. re
1420: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a turn TCL_OK;.}..
1430: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
1440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1470: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 --------. *. * D
1480: 69 67 65 73 74 55 70 64 61 74 65 20 2d 2d 0a 20 igestUpdate --.
1490: 2a 0a 20 2a 09 55 70 64 61 74 65 20 61 20 68 61 *. *.Update a ha
14a0: 73 68 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 sh function with
14b0: 20 64 61 74 61 0a 20 2a 0a 20 2a 20 52 65 74 75 data. *. * Retu
14c0: 72 6e 73 3a 0a 20 2a 09 31 20 69 66 20 73 75 63 rns:. *.1 if suc
14d0: 63 65 73 73 66 75 6c 20 6f 72 20 30 20 66 6f 72 cessful or 0 for
14e0: 20 66 61 69 6c 75 72 65 0a 20 2a 0a 20 2a 20 53 failure. *. * S
14f0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
1500: 41 64 64 73 20 62 75 66 20 64 61 74 61 20 74 6f Adds buf data to
1510: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 6f hash function o
1520: 72 20 73 65 74 73 20 72 65 73 75 6c 74 20 74 6f r sets result to
1530: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 error message.
1540: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
1550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 2f 0a 69 6e 74 20 -------. */.int
1590: 44 69 67 65 73 74 55 70 64 61 74 65 28 44 69 67 DigestUpdate(Dig
15a0: 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 estState *stateP
15b0: 74 72 2c 20 63 68 61 72 20 2a 62 75 66 2c 20 73 tr, char *buf, s
15c0: 69 7a 65 5f 74 20 72 65 61 64 2c 20 69 6e 74 20 ize_t read, int
15d0: 64 6f 5f 72 65 73 75 6c 74 29 20 7b 0a 20 20 20 do_result) {.
15e0: 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 0a 20 int res = 0;..
15f0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
1600: 3e 66 6f 72 6d 61 74 20 26 20 54 59 50 45 5f 4d >format & TYPE_M
1610: 44 29 20 7b 0a 09 72 65 73 20 3d 20 45 56 50 5f D) {..res = EVP_
1620: 44 69 67 65 73 74 55 70 64 61 74 65 28 73 74 61 DigestUpdate(sta
1630: 74 65 50 74 72 2d 3e 63 74 78 2c 20 62 75 66 2c tePtr->ctx, buf,
1640: 20 72 65 61 64 29 3b 0a 20 20 20 20 7d 20 65 6c read);. } el
1650: 73 65 20 69 66 20 28 73 74 61 74 65 50 74 72 2d se if (statePtr-
1660: 3e 66 6f 72 6d 61 74 20 26 20 54 59 50 45 5f 48 >format & TYPE_H
1670: 4d 41 43 29 20 7b 0a 09 72 65 73 20 3d 20 48 4d MAC) {..res = HM
1680: 41 43 5f 55 70 64 61 74 65 28 73 74 61 74 65 50 AC_Update(stateP
1690: 74 72 2d 3e 68 63 74 78 2c 20 62 75 66 2c 20 72 tr->hctx, buf, r
16a0: 65 61 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 ead);. } else
16b0: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 if (statePtr->f
16c0: 6f 72 6d 61 74 20 26 20 54 59 50 45 5f 43 4d 41 ormat & TYPE_CMA
16d0: 43 29 20 7b 0a 09 72 65 73 20 3d 20 43 4d 41 43 C) {..res = CMAC
16e0: 5f 55 70 64 61 74 65 28 73 74 61 74 65 50 74 72 _Update(statePtr
16f0: 2d 3e 63 63 74 78 2c 20 62 75 66 2c 20 72 65 61 ->cctx, buf, rea
1700: 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 d);. }. if
1710: 20 28 21 72 65 73 20 26 26 20 64 6f 5f 72 65 73 (!res && do_res
1720: 75 6c 74 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 ult) {..Tcl_Appe
1730: 6e 64 52 65 73 75 6c 74 28 73 74 61 74 65 50 74 ndResult(statePt
1740: 72 2d 3e 69 6e 74 65 72 70 2c 20 22 55 70 64 61 r->interp, "Upda
1750: 74 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 52 45 te failed: ", RE
1760: 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 ASON(), NULL);..
1770: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
1780: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 ;. }. retu
1790: 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 20 2a rn res;.}../*. *
17a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17e0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 ---. *. * Digest
17f0: 46 69 6e 61 6c 69 7a 65 20 2d 2d 0a 20 2a 0a 20 Finalize --. *.
1800: 2a 09 46 69 6e 61 6c 69 7a 65 20 61 20 68 61 73 *.Finalize a has
1810: 68 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 72 h function and r
1820: 65 74 75 72 6e 20 74 68 65 20 6d 65 73 73 61 67 eturn the messag
1830: 65 20 64 69 67 65 73 74 0a 20 2a 0a 20 2a 20 52 e digest. *. * R
1840: 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f eturns:. *.TCL_O
1850: 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 K if successful
1860: 6f 72 20 54 43 4c 5f 45 52 52 4f 52 20 66 6f 72 or TCL_ERROR for
1870: 20 66 61 69 6c 75 72 65 20 77 69 74 68 20 72 65 failure with re
1880: 73 75 6c 74 20 73 65 74 0a 20 2a 09 74 6f 20 65 sult set. *.to e
1890: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a rror message.. *
18a0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
18b0: 3a 0a 20 2a 09 53 65 74 73 20 72 65 73 75 6c 74 :. *.Sets result
18c0: 20 74 6f 20 6d 65 73 73 61 67 65 20 64 69 67 65 to message dige
18d0: 73 74 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 6d st or an error m
18e0: 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d essage.. *. *---
18f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1930: 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 46 . */.int DigestF
1940: 69 6e 61 6c 69 7a 65 28 54 63 6c 5f 49 6e 74 65 inalize(Tcl_Inte
1950: 72 70 20 2a 69 6e 74 65 72 70 2c 20 44 69 67 65 rp *interp, Dige
1960: 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 stState *statePt
1970: 72 2c 20 54 63 6c 5f 4f 62 6a 20 2a 2a 72 65 73 r, Tcl_Obj **res
1980: 75 6c 74 4f 62 6a 29 20 7b 0a 20 20 20 20 75 6e ultObj) {. un
1990: 73 69 67 6e 65 64 20 63 68 61 72 20 6d 64 5f 62 signed char md_b
19a0: 75 66 5b 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 uf[EVP_MAX_MD_SI
19b0: 5a 45 5d 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 ZE];. unsigne
19c0: 64 20 69 6e 74 20 6d 64 5f 6c 65 6e 3b 0a 20 20 d int md_len;.
19d0: 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 0a int res = 0;..
19e0: 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 /* Finalize
19f0: 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 61 6e hash function an
1a00: 64 20 63 61 6c 63 75 6c 61 74 65 20 6d 65 73 73 d calculate mess
1a10: 61 67 65 20 64 69 67 65 73 74 20 2a 2f 0a 20 20 age digest */.
1a20: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
1a30: 66 6f 72 6d 61 74 20 26 20 54 59 50 45 5f 4d 44 format & TYPE_MD
1a40: 29 20 7b 0a 09 69 66 20 28 21 28 73 74 61 74 65 ) {..if (!(state
1a50: 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20 49 53 Ptr->format & IS
1a60: 5f 58 4f 46 29 29 20 7b 0a 09 20 20 20 20 72 65 _XOF)) {.. re
1a70: 73 20 3d 20 45 56 50 5f 44 69 67 65 73 74 46 69 s = EVP_DigestFi
1a80: 6e 61 6c 5f 65 78 28 73 74 61 74 65 50 74 72 2d nal_ex(statePtr-
1a90: 3e 63 74 78 2c 20 6d 64 5f 62 75 66 2c 20 26 6d >ctx, md_buf, &m
1aa0: 64 5f 6c 65 6e 29 3b 0a 09 7d 20 65 6c 73 65 20 d_len);..} else
1ab0: 7b 0a 09 20 20 20 20 72 65 73 20 3d 20 45 56 50 {.. res = EVP
1ac0: 5f 44 69 67 65 73 74 46 69 6e 61 6c 58 4f 46 28 _DigestFinalXOF(
1ad0: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 6d statePtr->ctx, m
1ae0: 64 5f 62 75 66 2c 20 45 56 50 5f 4d 41 58 5f 4d d_buf, EVP_MAX_M
1af0: 44 5f 53 49 5a 45 29 3b 0a 09 7d 0a 0a 20 20 20 D_SIZE);..}..
1b00: 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 61 74 } else if (stat
1b10: 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20 54 ePtr->format & T
1b20: 59 50 45 5f 48 4d 41 43 29 20 7b 0a 09 72 65 73 YPE_HMAC) {..res
1b30: 20 3d 20 48 4d 41 43 5f 46 69 6e 61 6c 28 73 74 = HMAC_Final(st
1b40: 61 74 65 50 74 72 2d 3e 68 63 74 78 2c 20 6d 64 atePtr->hctx, md
1b50: 5f 62 75 66 2c 20 26 6d 64 5f 6c 65 6e 29 3b 0a _buf, &md_len);.
1b60: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
1b70: 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 statePtr->format
1b80: 20 26 20 54 59 50 45 5f 43 4d 41 43 29 20 7b 0a & TYPE_CMAC) {.
1b90: 09 73 69 7a 65 5f 74 20 6c 65 6e 3b 0a 09 72 65 .size_t len;..re
1ba0: 73 20 3d 20 43 4d 41 43 5f 46 69 6e 61 6c 28 73 s = CMAC_Final(s
1bb0: 74 61 74 65 50 74 72 2d 3e 63 63 74 78 2c 20 6d tatePtr->cctx, m
1bc0: 64 5f 62 75 66 2c 20 26 6c 65 6e 29 3b 0a 09 6d d_buf, &len);..m
1bd0: 64 5f 6c 65 6e 20 3d 20 28 75 6e 73 69 67 6e 65 d_len = (unsigne
1be0: 64 20 69 6e 74 29 20 6c 65 6e 3b 0a 20 20 20 20 d int) len;.
1bf0: 7d 0a 0a 20 20 20 20 69 66 20 28 21 72 65 73 29 }.. if (!res)
1c00: 20 7b 0a 09 69 66 20 28 72 65 73 75 6c 74 4f 62 {..if (resultOb
1c10: 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 j == NULL) {..
1c20: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
1c30: 6c 74 28 69 6e 74 65 72 70 2c 20 22 46 69 6e 61 lt(interp, "Fina
1c40: 6c 69 7a 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 lize failed: ",
1c50: 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b REASON(), NULL);
1c60: 0a 09 7d 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ..}..return TCL_
1c70: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
1c80: 20 20 2f 2a 20 52 65 74 75 72 6e 20 6d 65 73 73 /* Return mess
1c90: 61 67 65 20 64 69 67 65 73 74 20 61 73 20 65 69 age digest as ei
1ca0: 74 68 65 72 20 61 20 62 69 6e 61 72 79 20 6f 72 ther a binary or
1cb0: 20 68 65 78 20 73 74 72 69 6e 67 20 2a 2f 0a 20 hex string */.
1cc0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
1cd0: 3e 66 6f 72 6d 61 74 20 26 20 42 49 4e 5f 46 4f >format & BIN_FO
1ce0: 52 4d 41 54 29 20 7b 0a 09 69 66 20 28 72 65 73 RMAT) {..if (res
1cf0: 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 ultObj == NULL)
1d00: 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 {.. Tcl_SetOb
1d10: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
1d20: 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 Tcl_NewByteArray
1d30: 4f 62 6a 28 6d 64 5f 62 75 66 2c 20 6d 64 5f 6c Obj(md_buf, md_l
1d40: 65 6e 29 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a en));..} else {.
1d50: 09 20 20 20 20 2a 72 65 73 75 6c 74 4f 62 6a 20 . *resultObj
1d60: 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 = Tcl_NewByteArr
1d70: 61 79 4f 62 6a 28 6d 64 5f 62 75 66 2c 20 6d 64 ayObj(md_buf, md
1d80: 5f 6c 65 6e 29 3b 0a 09 20 20 20 20 54 63 6c 5f _len);.. Tcl_
1d90: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 2a 72 65 IncrRefCount(*re
1da0: 73 75 6c 74 4f 62 6a 29 3b 0a 09 7d 0a 0a 20 20 sultObj);..}..
1db0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f } else {..Tcl_
1dc0: 4f 62 6a 20 2a 6e 65 77 4f 62 6a 20 3d 20 54 63 Obj *newObj = Tc
1dd0: 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 09 75 6e 73 l_NewObj();..uns
1de0: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 74 72 20 igned char *ptr
1df0: 3d 20 54 63 6c 5f 53 65 74 42 79 74 65 41 72 72 = Tcl_SetByteArr
1e00: 61 79 4c 65 6e 67 74 68 28 6e 65 77 4f 62 6a 2c ayLength(newObj,
1e10: 20 6d 64 5f 6c 65 6e 2a 32 29 3b 0a 0a 09 66 6f md_len*2);...fo
1e20: 72 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 r (unsigned int
1e30: 69 20 3d 20 30 3b 20 69 20 3c 20 6d 64 5f 6c 65 i = 0; i < md_le
1e40: 6e 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 2a n; i++) {.. *
1e50: 70 74 72 2b 2b 20 3d 20 68 65 78 5b 28 6d 64 5f ptr++ = hex[(md_
1e60: 62 75 66 5b 69 5d 20 3e 3e 20 34 29 20 26 20 30 buf[i] >> 4) & 0
1e70: 78 30 46 5d 3b 0a 09 20 20 20 20 2a 70 74 72 2b x0F];.. *ptr+
1e80: 2b 20 3d 20 68 65 78 5b 6d 64 5f 62 75 66 5b 69 + = hex[md_buf[i
1e90: 5d 20 26 20 30 78 30 46 5d 3b 0a 09 7d 0a 0a 09 ] & 0x0F];..}...
1ea0: 69 66 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d 3d if (resultObj ==
1eb0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 NULL) {.. Tc
1ec0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
1ed0: 6e 74 65 72 70 2c 20 6e 65 77 4f 62 6a 29 3b 0a nterp, newObj);.
1ee0: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 2a .} else {.. *
1ef0: 72 65 73 75 6c 74 4f 62 6a 20 3d 20 6e 65 77 4f resultObj = newO
1f00: 62 6a 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 bj;.. Tcl_Inc
1f10: 72 52 65 66 43 6f 75 6e 74 28 2a 72 65 73 75 6c rRefCount(*resul
1f20: 74 4f 62 6a 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a tObj);..}. }.
1f30: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
1f40: 4b 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a K;.}../*********
1f50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1f60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1f70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1f80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a **********/../*.
1f90: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
1fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1fd0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 -----. *. * Dige
1fe0: 73 74 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 stBlockModeProc
1ff0: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 --. *. *.This fu
2000: 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 nction is invoke
2010: 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 d by the generic
2020: 20 49 4f 20 6c 65 76 65 6c 0a 20 2a 09 74 6f 20 IO level. *.to
2030: 73 65 74 20 62 6c 6f 63 6b 69 6e 67 20 61 6e 64 set blocking and
2040: 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 nonblocking mod
2050: 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e es.. *. * Return
2060: 73 3a 0a 20 2a 09 30 20 69 66 20 73 75 63 63 65 s:. *.0 if succe
2070: 73 73 66 75 6c 20 6f 72 20 50 4f 53 49 58 20 65 ssful or POSIX e
2080: 72 72 6f 72 20 63 6f 64 65 20 69 66 20 66 61 69 rror code if fai
2090: 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 led.. *. * Side
20a0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 effects:. *.Sets
20b0: 20 74 68 65 20 64 65 76 69 63 65 20 69 6e 74 6f the device into
20c0: 20 62 6c 6f 63 6b 69 6e 67 20 6f 72 20 6e 6f 6e blocking or non
20d0: 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 blocking mode..
20e0: 2a 09 43 61 6e 20 63 61 6c 6c 20 54 63 6c 5f 53 *.Can call Tcl_S
20f0: 65 74 43 68 61 6e 6e 65 6c 45 72 72 6f 72 2e 0a etChannelError..
2100: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
2110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2140: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
2150: 74 69 63 20 69 6e 74 20 44 69 67 65 73 74 42 6c tic int DigestBl
2160: 6f 63 6b 4d 6f 64 65 50 72 6f 63 28 43 6c 69 65 ockModeProc(Clie
2170: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
2180: 61 2c 20 69 6e 74 20 6d 6f 64 65 29 20 7b 0a 20 a, int mode) {.
2190: 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a DigestState *
21a0: 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 statePtr = (Dige
21b0: 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e stState *) clien
21c0: 74 44 61 74 61 3b 0a 0a 20 20 20 20 69 66 20 28 tData;.. if (
21d0: 6d 6f 64 65 20 3d 3d 20 54 43 4c 5f 4d 4f 44 45 mode == TCL_MODE
21e0: 5f 4e 4f 4e 42 4c 4f 43 4b 49 4e 47 29 20 7b 0a _NONBLOCKING) {.
21f0: 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 .statePtr->flags
2200: 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e |= TLS_TCL_ASYN
2210: 43 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a C;. } else {.
2220: 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 .statePtr->flags
2230: 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 41 53 &= ~(TLS_TCL_AS
2240: 59 4e 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 YNC);. }.
2250: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a return 0;.}../*.
2260: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
2270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
22a0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 -----. *. * Dige
22b0: 73 74 43 6c 6f 73 65 50 72 6f 63 20 2d 2d 0a 20 stCloseProc --.
22c0: 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 *. *.This functi
22d0: 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 on is invoked by
22e0: 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 the generic IO
22f0: 6c 65 76 65 6c 20 74 6f 20 70 65 72 66 6f 72 6d level to perform
2300: 0a 20 2a 09 63 68 61 6e 6e 65 6c 2d 74 79 70 65 . *.channel-type
2310: 20 73 70 65 63 69 66 69 63 20 63 6c 65 61 6e 75 specific cleanu
2320: 70 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e 6e p when the chann
2330: 65 6c 20 69 73 20 63 6c 6f 73 65 64 2e 20 41 6c el is closed. Al
2340: 6c 0a 20 2a 09 71 75 65 75 65 64 20 6f 75 74 70 l. *.queued outp
2350: 75 74 20 69 73 20 66 6c 75 73 68 65 64 20 70 72 ut is flushed pr
2360: 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 ior to calling t
2370: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a his function.. *
2380: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 . * Returns:. *.
2390: 30 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 0 if successful
23a0: 6f 72 20 50 4f 53 49 58 20 65 72 72 6f 72 20 63 or POSIX error c
23b0: 6f 64 65 20 69 66 20 66 61 69 6c 65 64 2e 0a 20 ode if failed..
23c0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
23d0: 73 3a 0a 20 2a 09 44 65 6c 65 74 65 73 20 73 74 s:. *.Deletes st
23e0: 6f 72 65 64 20 73 74 61 74 65 20 64 61 74 61 2e ored state data.
23f0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
2400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e ---------. */.in
2440: 74 20 44 69 67 65 73 74 43 6c 6f 73 65 50 72 6f t DigestClosePro
2450: 63 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 c(ClientData cli
2460: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 entData, Tcl_Int
2470: 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 erp *interp) {.
2480: 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a DigestState *
2490: 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 statePtr = (Dige
24a0: 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e stState *) clien
24b0: 74 44 61 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 43 tData;.. /* C
24c0: 61 6e 63 65 6c 20 61 63 74 69 76 65 20 74 69 6d ancel active tim
24d0: 65 72 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 er, if any */.
24e0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
24f0: 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 timer != (Tcl_Ti
2500: 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 merToken) NULL)
2510: 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d {..Tcl_DeleteTim
2520: 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 erHandler(stateP
2530: 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 tr->timer);..sta
2540: 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28 tePtr->timer = (
2550: 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 Tcl_TimerToken)
2560: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 NULL;. }..
2570: 20 2f 2a 20 4f 75 74 70 75 74 20 6d 65 73 73 61 /* Output messa
2580: 67 65 20 64 69 67 65 73 74 20 69 66 20 6e 6f 74 ge digest if not
2590: 20 61 6c 72 65 61 64 79 20 64 6f 6e 65 20 2a 2f already done */
25a0: 0a 20 20 20 20 69 66 20 28 21 28 73 74 61 74 65 . if (!(state
25b0: 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 43 48 41 Ptr->flags & CHA
25c0: 4e 5f 45 4f 46 29 29 20 7b 0a 09 54 63 6c 5f 43 N_EOF)) {..Tcl_C
25d0: 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 20 3d 20 hannel parent =
25e0: 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 64 43 68 Tcl_GetStackedCh
25f0: 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e annel(statePtr->
2600: 73 65 6c 66 29 3b 0a 09 54 63 6c 5f 4f 62 6a 20 self);..Tcl_Obj
2610: 2a 72 65 73 75 6c 74 4f 62 6a 3b 0a 09 69 6e 74 *resultObj;..int
2620: 20 77 72 69 74 74 65 6e 3b 0a 0a 09 69 66 20 28 written;...if (
2630: 44 69 67 65 73 74 46 69 6e 61 6c 69 7a 65 28 73 DigestFinalize(s
2640: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c tatePtr->interp,
2650: 20 73 74 61 74 65 50 74 72 2c 20 26 72 65 73 75 statePtr, &resu
2660: 6c 74 4f 62 6a 29 20 3d 3d 20 54 43 4c 5f 4f 4b ltObj) == TCL_OK
2670: 29 20 7b 0a 09 20 20 20 20 75 6e 73 69 67 6e 65 ) {.. unsigne
2680: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 54 d char *data = T
2690: 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 cl_GetByteArrayF
26a0: 72 6f 6d 4f 62 6a 28 72 65 73 75 6c 74 4f 62 6a romObj(resultObj
26b0: 2c 20 26 77 72 69 74 74 65 6e 29 3b 0a 09 20 20 , &written);..
26c0: 20 20 54 63 6c 5f 57 72 69 74 65 52 61 77 28 70 Tcl_WriteRaw(p
26d0: 61 72 65 6e 74 2c 20 64 61 74 61 2c 20 77 72 69 arent, data, wri
26e0: 74 74 65 6e 29 3b 0a 09 20 20 20 20 54 63 6c 5f tten);.. Tcl_
26f0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 72 65 73 DecrRefCount(res
2700: 75 6c 74 4f 62 6a 29 3b 0a 09 7d 0a 09 73 74 61 ultObj);..}..sta
2710: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 tePtr->flags |=
2720: 43 48 41 4e 5f 45 4f 46 3b 0a 20 20 20 20 7d 0a CHAN_EOF;. }.
2730: 0a 20 20 20 20 2f 2a 20 43 6c 65 61 6e 2d 75 70 . /* Clean-up
2740: 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 53 74 */. DigestSt
2750: 61 74 65 46 72 65 65 28 73 74 61 74 65 50 74 72 ateFree(statePtr
2760: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b );. return 0;
2770: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 61 6d 65 20 61 .}../*. * Same a
2780: 73 20 44 69 67 65 73 74 43 6c 6f 73 65 50 72 6f s DigestClosePro
2790: 63 20 62 75 74 20 77 69 74 68 20 69 6e 64 69 76 c but with indiv
27a0: 69 64 75 61 6c 20 72 65 61 64 20 61 6e 64 20 77 idual read and w
27b0: 72 69 74 65 20 63 6c 6f 73 65 20 63 6f 6e 74 72 rite close contr
27c0: 6f 6c 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e ol. */.static in
27d0: 74 20 44 69 67 65 73 74 43 6c 6f 73 65 32 50 72 t DigestClose2Pr
27e0: 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e oc(ClientData in
27f0: 73 74 61 6e 63 65 44 61 74 61 2c 20 54 63 6c 5f stanceData, Tcl_
2800: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
2810: 69 6e 74 20 66 6c 61 67 73 29 20 7b 0a 0a 20 20 int flags) {..
2820: 20 20 69 66 20 28 28 66 6c 61 67 73 20 26 20 28 if ((flags & (
2830: 54 43 4c 5f 43 4c 4f 53 45 5f 52 45 41 44 20 7c TCL_CLOSE_READ |
2840: 20 54 43 4c 5f 43 4c 4f 53 45 5f 57 52 49 54 45 TCL_CLOSE_WRITE
2850: 29 29 20 3d 3d 20 30 29 20 7b 0a 09 72 65 74 75 )) == 0) {..retu
2860: 72 6e 20 44 69 67 65 73 74 43 6c 6f 73 65 50 72 rn DigestClosePr
2870: 6f 63 28 69 6e 73 74 61 6e 63 65 44 61 74 61 2c oc(instanceData,
2880: 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 7d 0a interp);. }.
2890: 20 20 20 20 72 65 74 75 72 6e 20 45 49 4e 56 41 return EINVA
28a0: 4c 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d L;.}../*. *-----
28b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28f0: 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 49 6e -. *. * DigestIn
2900: 70 75 74 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a putProc --. *. *
2910: 09 43 61 6c 6c 65 64 20 62 79 20 74 68 65 20 67 .Called by the g
2920: 65 6e 65 72 69 63 20 49 4f 20 73 79 73 74 65 6d eneric IO system
2930: 20 74 6f 20 72 65 61 64 20 64 61 74 61 20 66 72 to read data fr
2940: 6f 6d 20 74 72 61 6e 73 66 6f 72 6d 20 61 6e 64 om transform and
2950: 0a 20 2a 09 70 6c 61 63 65 20 69 6e 20 62 75 66 . *.place in buf
2960: 2e 20 54 72 61 6e 73 66 6f 72 6d 20 67 65 74 73 . Transform gets
2970: 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 75 data from the u
2980: 6e 64 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 nderlying channe
2990: 6c 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 l.. *. * Returns
29a0: 3a 0a 20 2a 09 54 6f 74 61 6c 20 62 79 74 65 73 :. *.Total bytes
29b0: 20 72 65 61 64 20 6f 72 20 2d 31 20 66 6f 72 20 read or -1 for
29c0: 61 6e 20 65 72 72 6f 72 20 61 6c 6f 6e 67 20 77 an error along w
29d0: 69 74 68 20 61 20 50 4f 53 49 58 20 65 72 72 6f ith a POSIX erro
29e0: 72 0a 20 2a 09 63 6f 64 65 20 69 6e 20 65 72 72 r. *.code in err
29f0: 6f 72 43 6f 64 65 50 74 72 2e 20 55 73 65 20 45 orCodePtr. Use E
2a00: 41 47 41 49 4e 20 66 6f 72 20 6e 6f 6e 62 6c 6f AGAIN for nonblo
2a10: 63 6b 69 6e 67 20 61 6e 64 20 6e 6f 20 64 61 74 cking and no dat
2a20: 61 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 a.. *. * Side ef
2a30: 66 65 63 74 73 3a 0a 20 2a 09 52 65 61 64 20 64 fects:. *.Read d
2a40: 61 74 61 20 66 72 6f 6d 20 74 72 61 6e 73 66 6f ata from transfo
2a50: 72 6d 20 61 6e 64 20 77 72 69 74 65 20 74 6f 20 rm and write to
2a60: 62 75 66 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d buf. *. *-------
2a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
2ab0: 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 49 6e */.int DigestIn
2ac0: 70 75 74 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 putProc(ClientDa
2ad0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 63 ta clientData, c
2ae0: 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 74 6f har *buf, int to
2af0: 52 65 61 64 2c 20 69 6e 74 20 2a 65 72 72 6f 72 Read, int *error
2b00: 43 6f 64 65 50 74 72 29 20 7b 0a 20 20 20 20 44 CodePtr) {. D
2b10: 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 igestState *stat
2b20: 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 ePtr = (DigestSt
2b30: 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 ate *) clientDat
2b40: 61 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e a;. Tcl_Chann
2b50: 65 6c 20 70 61 72 65 6e 74 3b 0a 20 20 20 20 69 el parent;. i
2b60: 6e 74 20 72 65 61 64 3b 0a 20 20 20 20 2a 65 72 nt read;. *er
2b70: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a rorCodePtr = 0;.
2b80: 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 69 66 . /* Abort if
2b90: 20 6e 6f 74 68 69 6e 67 20 74 6f 20 70 72 6f 63 nothing to proc
2ba0: 65 73 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 74 ess */. if (t
2bb0: 6f 52 65 61 64 20 3c 3d 20 30 20 7c 7c 20 73 74 oRead <= 0 || st
2bc0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 atePtr->self ==
2bd0: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 (Tcl_Channel) NU
2be0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b LL) {..return 0;
2bf0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 . }.. /* G
2c00: 65 74 20 62 79 74 65 73 20 66 72 6f 6d 20 75 6e et bytes from un
2c10: 64 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c derlying channel
2c20: 20 2a 2f 0a 20 20 20 20 70 61 72 65 6e 74 20 3d */. parent =
2c30: 20 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 64 43 Tcl_GetStackedC
2c40: 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d hannel(statePtr-
2c50: 3e 73 65 6c 66 29 3b 0a 20 20 20 20 72 65 61 64 >self);. read
2c60: 20 3d 20 54 63 6c 5f 52 65 61 64 52 61 77 28 70 = Tcl_ReadRaw(p
2c70: 61 72 65 6e 74 2c 20 62 75 66 2c 20 74 6f 52 65 arent, buf, toRe
2c80: 61 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 ad);.. /* Upd
2c90: 61 74 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f ate hash functio
2ca0: 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 61 n */. if (rea
2cb0: 64 20 3e 20 30 29 20 7b 0a 09 2f 2a 20 48 61 76 d > 0) {../* Hav
2cc0: 65 20 64 61 74 61 20 2a 2f 0a 09 69 66 20 28 21 e data */..if (!
2cd0: 44 69 67 65 73 74 55 70 64 61 74 65 28 73 74 61 DigestUpdate(sta
2ce0: 74 65 50 74 72 2c 20 62 75 66 2c 20 28 73 69 7a tePtr, buf, (siz
2cf0: 65 5f 74 29 20 72 65 61 64 2c 20 30 29 29 20 7b e_t) read, 0)) {
2d00: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 .. Tcl_SetCha
2d10: 6e 6e 65 6c 45 72 72 6f 72 28 73 74 61 74 65 50 nnelError(stateP
2d20: 74 72 2d 3e 73 65 6c 66 2c 20 54 63 6c 5f 4f 62 tr->self, Tcl_Ob
2d30: 6a 50 72 69 6e 74 66 28 22 55 70 64 61 74 65 20 jPrintf("Update
2d40: 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 52 45 41 failed: %s", REA
2d50: 53 4f 4e 28 29 29 29 3b 0a 09 20 20 20 20 2a 65 SON()));.. *e
2d60: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49 rrorCodePtr = EI
2d70: 4e 56 41 4c 3b 0a 09 20 20 20 20 72 65 74 75 72 NVAL;.. retur
2d80: 6e 20 30 3b 0a 09 7d 0a 09 2f 2a 20 54 68 69 73 n 0;..}../* This
2d90: 20 69 73 20 63 6f 72 72 65 63 74 20 2a 2f 0a 09 is correct */..
2da0: 72 65 61 64 20 3d 20 2d 31 3b 0a 09 2a 65 72 72 read = -1;..*err
2db0: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41 orCodePtr = EAGA
2dc0: 49 4e 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 IN;.. } else
2dd0: 69 66 20 28 72 65 61 64 20 3c 20 30 29 20 7b 0a if (read < 0) {.
2de0: 09 2f 2a 20 45 72 72 6f 72 20 2a 2f 0a 09 2a 65 ./* Error */..*e
2df0: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 54 63 rrorCodePtr = Tc
2e00: 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b 0a 0a 20 l_GetErrno();..
2e10: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 21 28 } else if (!(
2e20: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 statePtr->flags
2e30: 26 20 43 48 41 4e 5f 45 4f 46 29 29 20 7b 0a 09 & CHAN_EOF)) {..
2e40: 2f 2a 20 45 4f 46 20 2a 2f 0a 09 54 63 6c 5f 4f /* EOF */..Tcl_O
2e50: 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 3b 0a 09 bj *resultObj;..
2e60: 69 66 20 28 44 69 67 65 73 74 46 69 6e 61 6c 69 if (DigestFinali
2e70: 7a 65 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 ze(statePtr->int
2e80: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 26 erp, statePtr, &
2e90: 72 65 73 75 6c 74 4f 62 6a 29 20 3d 3d 20 54 43 resultObj) == TC
2ea0: 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 75 6e 73 L_OK) {.. uns
2eb0: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 igned char *data
2ec0: 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 = Tcl_GetByteAr
2ed0: 72 61 79 46 72 6f 6d 4f 62 6a 28 72 65 73 75 6c rayFromObj(resul
2ee0: 74 4f 62 6a 2c 20 26 72 65 61 64 29 3b 0a 09 20 tObj, &read);..
2ef0: 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 64 memcpy(buf, d
2f00: 61 74 61 2c 20 72 65 61 64 29 3b 0a 09 20 20 20 ata, read);..
2f10: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e Tcl_DecrRefCoun
2f20: 74 28 72 65 73 75 6c 74 4f 62 6a 29 3b 0a 0a 09 t(resultObj);...
2f30: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 54 63 } else {.. Tc
2f40: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 45 72 72 6f l_SetChannelErro
2f50: 72 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 r(statePtr->self
2f60: 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 , Tcl_ObjPrintf(
2f70: 22 46 69 6e 61 6c 69 7a 65 20 66 61 69 6c 65 64 "Finalize failed
2f80: 3a 20 25 73 22 2c 20 52 45 41 53 4f 4e 28 29 29 : %s", REASON())
2f90: 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f );.. *errorCo
2fa0: 64 65 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a dePtr = EINVAL;.
2fb0: 09 20 20 20 20 72 65 61 64 20 3d 20 30 3b 0a 09 . read = 0;..
2fc0: 7d 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 }..statePtr->fla
2fd0: 67 73 20 7c 3d 20 43 48 41 4e 5f 45 4f 46 3b 0a gs |= CHAN_EOF;.
2fe0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e }. return
2ff0: 20 72 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d read;.}../*. *-
3000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3040: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 -----. *. * Dige
3050: 73 74 4f 75 74 70 75 74 50 72 6f 63 20 2d 2d 0a stOutputProc --.
3060: 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79 20 *. *.Called by
3070: 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 73 the generic IO s
3080: 79 73 74 65 6d 20 74 6f 20 77 72 69 74 65 20 64 ystem to write d
3090: 61 74 61 20 69 6e 20 62 75 66 20 74 6f 20 74 72 ata in buf to tr
30a0: 61 6e 73 66 6f 72 6d 2e 0a 20 2a 09 54 68 65 20 ansform.. *.The
30b0: 74 72 61 6e 73 66 6f 72 6d 20 77 72 69 74 65 73 transform writes
30c0: 20 74 68 65 20 72 65 73 75 6c 74 20 74 6f 20 74 the result to t
30d0: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 68 he underlying ch
30e0: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 74 annel.. *. * Ret
30f0: 75 72 6e 73 3a 0a 20 2a 09 54 6f 74 61 6c 20 62 urns:. *.Total b
3100: 79 74 65 73 20 77 72 69 74 74 65 6e 20 6f 72 20 ytes written or
3110: 2d 31 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 20 -1 for an error
3120: 61 6c 6f 6e 67 20 77 69 74 68 20 61 20 50 4f 53 along with a POS
3130: 49 58 20 65 72 72 6f 72 0a 20 2a 09 63 6f 64 65 IX error. *.code
3140: 20 69 6e 20 65 72 72 6f 72 43 6f 64 65 50 74 72 in errorCodePtr
3150: 2e 20 55 73 65 20 45 41 47 41 49 4e 20 66 6f 72 . Use EAGAIN for
3160: 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 61 6e 64 nonblocking and
3170: 20 63 61 6e 27 74 20 77 72 69 74 65 20 64 61 74 can't write dat
3180: 61 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 a.. *. * Side ef
3190: 66 65 63 74 73 3a 0a 20 2a 09 47 65 74 20 64 61 fects:. *.Get da
31a0: 74 61 20 66 72 6f 6d 20 62 75 66 20 61 6e 64 20 ta from buf and
31b0: 75 70 64 61 74 65 20 64 69 67 65 73 74 0a 20 2a update digest. *
31c0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
31d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
31e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
31f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 20 69 ---------. */. i
3210: 6e 74 20 44 69 67 65 73 74 4f 75 74 70 75 74 50 nt DigestOutputP
3220: 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 63 roc(ClientData c
3230: 6c 69 65 6e 74 44 61 74 61 2c 20 63 6f 6e 73 74 lientData, const
3240: 20 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 char *buf, int
3250: 74 6f 57 72 69 74 65 2c 20 69 6e 74 20 2a 65 72 toWrite, int *er
3260: 72 6f 72 43 6f 64 65 50 74 72 29 20 7b 0a 20 20 rorCodePtr) {.
3270: 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 DigestState *s
3280: 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 tatePtr = (Diges
3290: 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 tState *) client
32a0: 44 61 74 61 3b 0a 20 20 20 20 2a 65 72 72 6f 72 Data;. *error
32b0: 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 0a 20 20 CodePtr = 0;..
32c0: 20 20 2f 2a 20 41 62 6f 72 74 20 69 66 20 6e 6f /* Abort if no
32d0: 74 68 69 6e 67 20 74 6f 20 70 72 6f 63 65 73 73 thing to process
32e0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 74 6f 57 72 */. if (toWr
32f0: 69 74 65 20 3c 3d 20 30 20 7c 7c 20 73 74 61 74 ite <= 0 || stat
3300: 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 ePtr->self == (T
3310: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c cl_Channel) NULL
3320: 29 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 ) {..return 0;.
3330: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64 }.. /* Upd
3340: 61 74 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f ate hash functio
3350: 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 74 6f 57 n */. if (toW
3360: 72 69 74 65 20 3e 20 30 20 26 26 20 21 44 69 67 rite > 0 && !Dig
3370: 65 73 74 55 70 64 61 74 65 28 73 74 61 74 65 50 estUpdate(stateP
3380: 74 72 2c 20 62 75 66 2c 20 28 73 69 7a 65 5f 74 tr, buf, (size_t
3390: 29 20 74 6f 57 72 69 74 65 2c 20 30 29 29 20 7b ) toWrite, 0)) {
33a0: 0a 09 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c ..Tcl_SetChannel
33b0: 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2d 3e Error(statePtr->
33c0: 73 65 6c 66 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 self, Tcl_ObjPri
33d0: 6e 74 66 28 22 55 70 64 61 74 65 20 66 61 69 6c ntf("Update fail
33e0: 65 64 3a 20 25 73 22 2c 20 52 45 41 53 4f 4e 28 ed: %s", REASON(
33f0: 29 29 29 3b 0a 09 2a 65 72 72 6f 72 43 6f 64 65 )));..*errorCode
3400: 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 09 72 Ptr = EINVAL;..r
3410: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 eturn 0;. }.
3420: 20 20 20 72 65 74 75 72 6e 20 74 6f 57 72 69 74 return toWrit
3430: 65 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d e;.}../*. *-----
3440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3480: 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 53 65 -. *. * DigestSe
3490: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20 tOptionProc --.
34a0: 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79 20 74 *. *.Called by t
34b0: 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 73 79 he generic IO sy
34c0: 73 74 65 6d 20 74 6f 20 73 65 74 20 63 68 61 6e stem to set chan
34d0: 6e 65 6c 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 20 nel option name
34e0: 74 6f 20 76 61 6c 75 65 2e 0a 20 2a 0a 20 2a 20 to value.. *. *
34f0: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f Returns:. *.TCL_
3500: 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c OK if successful
3510: 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 20 69 66 or TCL_ERROR if
3520: 20 66 61 69 6c 65 64 20 61 6c 6f 6e 67 20 77 69 failed along wi
3530: 74 68 20 61 6e 20 65 72 72 6f 72 0a 20 2a 09 6d th an error. *.m
3540: 65 73 73 61 67 65 20 69 6e 20 69 6e 74 65 72 70 essage in interp
3550: 20 61 6e 64 20 54 63 6c 5f 53 65 74 45 72 72 6e and Tcl_SetErrn
3560: 6f 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 o.. *. * Side ef
3570: 66 65 63 74 73 3a 0a 20 2a 09 55 70 64 61 74 65 fects:. *.Update
3580: 73 20 63 68 61 6e 6e 65 6c 20 6f 70 74 69 6f 6e s channel option
3590: 20 74 6f 20 6e 65 77 20 76 61 6c 75 65 2e 0a 20 to new value..
35a0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
35b0: 2d 2d 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 0a 20 2a 2f 0a 73 ----------. */.s
35f0: 74 61 74 69 63 20 69 6e 74 20 44 69 67 65 73 74 tatic int Digest
3600: 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 43 6c SetOptionProc(Cl
3610: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
3620: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
3630: 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74 20 63 *interp, const c
3640: 68 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c har *optionName,
3650: 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70 ..const char *op
3660: 74 69 6f 6e 56 61 6c 75 65 29 20 7b 0a 20 20 20 tionValue) {.
3670: 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 DigestState *st
3680: 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 atePtr = (Digest
3690: 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 State *) clientD
36a0: 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 ata;. Tcl_Cha
36b0: 6e 6e 65 6c 20 70 61 72 65 6e 74 3b 0a 20 20 20 nnel parent;.
36c0: 20 54 63 6c 5f 44 72 69 76 65 72 53 65 74 4f 70 Tcl_DriverSetOp
36d0: 74 69 6f 6e 50 72 6f 63 20 2a 73 65 74 4f 70 74 tionProc *setOpt
36e0: 69 6f 6e 50 72 6f 63 3b 0a 0a 20 20 20 20 2f 2a ionProc;.. /*
36f0: 20 41 62 6f 72 74 20 69 66 20 6e 6f 20 63 68 61 Abort if no cha
3700: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 nnel */. if (
3710: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d statePtr->self =
3720: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
3730: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
3740: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
3750: 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 67 61 74 .. /* Delegat
3760: 65 20 6f 70 74 69 6f 6e 73 20 64 6f 77 6e 73 74 e options downst
3770: 72 65 61 6d 20 2a 2f 0a 20 20 20 20 70 61 72 65 ream */. pare
3780: 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 63 nt = Tcl_GetStac
3790: 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 kedChannel(state
37a0: 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 20 Ptr->self);.
37b0: 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 3d 20 setOptionProc =
37c0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 53 65 74 4f 70 Tcl_ChannelSetOp
37d0: 74 69 6f 6e 50 72 6f 63 28 54 63 6c 5f 47 65 74 tionProc(Tcl_Get
37e0: 43 68 61 6e 6e 65 6c 54 79 70 65 28 70 61 72 65 ChannelType(pare
37f0: 6e 74 29 29 3b 0a 20 20 20 20 69 66 20 28 73 65 nt));. if (se
3800: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 21 3d 20 4e tOptionProc != N
3810: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 28 ULL) {..return (
3820: 2a 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 29 28 *setOptionProc)(
3830: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e Tcl_GetChannelIn
3840: 73 74 61 6e 63 65 44 61 74 61 28 70 61 72 65 6e stanceData(paren
3850: 74 29 2c 20 69 6e 74 65 72 70 2c 20 6f 70 74 69 t), interp, opti
3860: 6f 6e 4e 61 6d 65 2c 20 6f 70 74 69 6f 6e 56 61 onName, optionVa
3870: 6c 75 65 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 lue);. } else
3880: 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f {..Tcl_SetErrno
3890: 28 45 49 4e 56 41 4c 29 3b 0a 09 72 65 74 75 72 (EINVAL);..retur
38a0: 6e 20 54 63 6c 5f 42 61 64 43 68 61 6e 6e 65 6c n Tcl_BadChannel
38b0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f Option(interp, o
38c0: 70 74 69 6f 6e 4e 61 6d 65 2c 20 4e 55 4c 4c 29 ptionName, NULL)
38d0: 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a ;. }.}../*. *
38e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
38f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3920: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 ------. *. * Dig
3930: 65 73 74 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 estGetOptionProc
3940: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 --. *. *.Called
3950: 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 by the generic
3960: 49 4f 20 73 79 73 74 65 6d 20 74 6f 20 67 65 74 IO system to get
3970: 20 63 68 61 6e 6e 65 6c 20 6f 70 74 69 6f 6e 20 channel option
3980: 6e 61 6d 65 27 73 20 76 61 6c 75 65 2e 0a 20 2a name's value.. *
3990: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 . * Returns:. *.
39a0: 54 43 4c 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 TCL_OK if succes
39b0: 73 66 75 6c 20 6f 72 20 54 43 4c 5f 45 52 52 4f sful or TCL_ERRO
39c0: 52 20 69 66 20 66 61 69 6c 65 64 20 61 6c 6f 6e R if failed alon
39d0: 67 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 0a g with an error.
39e0: 20 2a 09 6d 65 73 73 61 67 65 20 69 6e 20 69 6e *.message in in
39f0: 74 65 72 70 20 61 6e 64 20 54 63 6c 5f 53 65 74 terp and Tcl_Set
3a00: 45 72 72 6e 6f 2e 0a 20 2a 0a 20 2a 20 53 69 64 Errno.. *. * Sid
3a10: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 e effects:. *.Se
3a20: 74 73 20 72 65 73 75 6c 74 20 74 6f 20 6f 70 74 ts result to opt
3a30: 69 6f 6e 27 73 20 76 61 6c 75 65 0a 20 2a 0a 20 ion's value. *.
3a40: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
3a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a80: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
3a90: 69 63 20 69 6e 74 20 44 69 67 65 73 74 47 65 74 ic int DigestGet
3aa0: 4f 70 74 69 6f 6e 50 72 6f 63 28 43 6c 69 65 6e OptionProc(Clien
3ab0: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
3ac0: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
3ad0: 74 65 72 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 terp, const char
3ae0: 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c 0a 09 54 *optionName,..T
3af0: 63 6c 5f 44 53 74 72 69 6e 67 20 2a 6f 70 74 69 cl_DString *opti
3b00: 6f 6e 56 61 6c 75 65 29 20 7b 0a 20 20 20 20 44 onValue) {. D
3b10: 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 igestState *stat
3b20: 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 ePtr = (DigestSt
3b30: 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 ate *) clientDat
3b40: 61 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e a;. Tcl_Chann
3b50: 65 6c 20 70 61 72 65 6e 74 3b 0a 20 20 20 20 54 el parent;. T
3b60: 63 6c 5f 44 72 69 76 65 72 47 65 74 4f 70 74 69 cl_DriverGetOpti
3b70: 6f 6e 50 72 6f 63 20 2a 67 65 74 4f 70 74 69 6f onProc *getOptio
3b80: 6e 50 72 6f 63 3b 0a 0a 20 20 20 20 2f 2a 20 41 nProc;.. /* A
3b90: 62 6f 72 74 20 69 66 20 6e 6f 20 63 68 61 6e 6e bort if no chann
3ba0: 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 el */. if (st
3bb0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 atePtr->self ==
3bc0: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 (Tcl_Channel) NU
3bd0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 LL) {..return TC
3be0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
3bf0: 20 20 20 20 2f 2a 20 44 65 6c 65 67 61 74 65 20 /* Delegate
3c00: 6f 70 74 69 6f 6e 73 20 64 6f 77 6e 73 74 72 65 options downstre
3c10: 61 6d 20 2a 2f 0a 20 20 20 20 70 61 72 65 6e 74 am */. parent
3c20: 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 = Tcl_GetStacke
3c30: 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 dChannel(statePt
3c40: 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 20 67 65 r->self);. ge
3c50: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 3d 20 54 63 tOptionProc = Tc
3c60: 6c 5f 43 68 61 6e 6e 65 6c 47 65 74 4f 70 74 69 l_ChannelGetOpti
3c70: 6f 6e 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 68 onProc(Tcl_GetCh
3c80: 61 6e 6e 65 6c 54 79 70 65 28 70 61 72 65 6e 74 annelType(parent
3c90: 29 29 3b 0a 20 20 20 20 69 66 20 28 67 65 74 4f ));. if (getO
3ca0: 70 74 69 6f 6e 50 72 6f 63 20 21 3d 20 4e 55 4c ptionProc != NUL
3cb0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 28 2a 67 L) {..return (*g
3cc0: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 29 28 54 63 etOptionProc)(Tc
3cd0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 l_GetChannelInst
3ce0: 61 6e 63 65 44 61 74 61 28 70 61 72 65 6e 74 29 anceData(parent)
3cf0: 2c 20 69 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e , interp, option
3d00: 4e 61 6d 65 2c 20 6f 70 74 69 6f 6e 56 61 6c 75 Name, optionValu
3d10: 65 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 e);. } else i
3d20: 66 20 28 6f 70 74 69 6f 6e 4e 61 6d 65 20 3d 3d f (optionName ==
3d30: 20 28 63 68 61 72 2a 29 20 4e 55 4c 4c 29 20 7b (char*) NULL) {
3d40: 0a 09 2f 2a 20 52 65 71 75 65 73 74 20 69 73 20 ../* Request is
3d50: 71 75 65 72 79 20 66 6f 72 20 61 6c 6c 20 6f 70 query for all op
3d60: 74 69 6f 6e 73 2c 20 74 68 69 73 20 69 73 20 6f tions, this is o
3d70: 6b 2e 20 2a 2f 0a 09 72 65 74 75 72 6e 20 54 43 k. */..return TC
3d80: 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 L_OK;. } else
3d90: 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f {..Tcl_SetErrno
3da0: 28 45 49 4e 56 41 4c 29 3b 0a 09 72 65 74 75 72 (EINVAL);..retur
3db0: 6e 20 54 63 6c 5f 42 61 64 43 68 61 6e 6e 65 6c n Tcl_BadChannel
3dc0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f Option(interp, o
3dd0: 70 74 69 6f 6e 4e 61 6d 65 2c 20 4e 55 4c 4c 29 ptionName, NULL)
3de0: 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a ;. }.}../*. *
3df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e30: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 ------. *. * Dig
3e40: 65 73 74 54 69 6d 65 72 48 61 6e 64 6c 65 72 20 estTimerHandler
3e50: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 --. *. *.Called
3e60: 62 79 20 74 68 65 20 6e 6f 74 69 66 69 65 72 20 by the notifier
3e70: 76 69 61 20 74 69 6d 65 72 20 74 6f 20 66 6c 75 via timer to flu
3e80: 73 68 20 6f 75 74 20 70 65 6e 64 69 6e 67 20 69 sh out pending i
3e90: 6e 70 75 74 20 64 61 74 61 2e 0a 20 2a 0a 20 2a nput data.. *. *
3ea0: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 4e 6f 74 Returns:. *.Not
3eb0: 68 69 6e 67 0a 20 2a 0a 20 2a 20 53 69 64 65 20 hing. *. * Side
3ec0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 effects:. *.May
3ed0: 63 61 6c 6c 20 54 63 6c 5f 4e 6f 74 69 66 79 43 call Tcl_NotifyC
3ee0: 68 61 6e 6e 65 6c 0a 20 2a 0a 20 2a 2d 2d 2d 2d hannel. *. *----
3ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3f30: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f --. */.static vo
3f40: 69 64 20 44 69 67 65 73 74 54 69 6d 65 72 48 61 id DigestTimerHa
3f50: 6e 64 6c 65 72 28 43 6c 69 65 6e 74 44 61 74 61 ndler(ClientData
3f60: 20 63 6c 69 65 6e 74 44 61 74 61 29 20 7b 0a 20 clientData) {.
3f70: 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a DigestState *
3f80: 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 statePtr = (Dige
3f90: 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e stState *) clien
3fa0: 74 44 61 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 41 tData;.. /* A
3fb0: 62 6f 72 74 20 69 66 20 6e 6f 20 63 68 61 6e 6e bort if no chann
3fc0: 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 el */. if (st
3fd0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 atePtr->self ==
3fe0: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 (Tcl_Channel) NU
3ff0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 3b 0a 20 LL) {..return;.
4000: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 }.. /* Cle
4010: 61 72 20 74 69 6d 65 72 20 74 6f 6b 65 6e 20 2a ar timer token *
4020: 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e /. statePtr->
4030: 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d timer = (Tcl_Tim
4040: 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 0a erToken) NULL;..
4050: 20 20 20 20 2f 2a 20 46 69 72 65 20 65 76 65 6e /* Fire even
4060: 74 20 69 66 20 74 68 65 72 65 20 69 73 20 70 65 t if there is pe
4070: 6e 64 69 6e 67 20 64 61 74 61 2c 20 73 6b 69 70 nding data, skip
4080: 20 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 otherwise */.
4090: 20 20 69 66 20 28 28 73 74 61 74 65 50 74 72 2d if ((statePtr-
40a0: 3e 77 61 74 63 68 4d 61 73 6b 20 26 20 54 43 4c >watchMask & TCL
40b0: 5f 52 45 41 44 41 42 4c 45 29 20 26 26 20 28 54 _READABLE) && (T
40c0: 63 6c 5f 49 6e 70 75 74 42 75 66 66 65 72 65 64 cl_InputBuffered
40d0: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 (statePtr->self)
40e0: 20 3e 20 30 29 29 20 7b 0a 09 54 63 6c 5f 4e 6f > 0)) {..Tcl_No
40f0: 74 69 66 79 43 68 61 6e 6e 65 6c 28 73 74 61 74 tifyChannel(stat
4100: 65 50 74 72 2d 3e 73 65 6c 66 2c 20 54 43 4c 5f ePtr->self, TCL_
4110: 52 45 41 44 41 42 4c 45 29 3b 0a 20 20 20 20 7d READABLE);. }
4120: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d .}../*. *-------
4130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
4170: 20 2a 0a 20 2a 20 44 69 67 65 73 74 57 61 74 63 *. * DigestWatc
4180: 68 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 49 hProc --. *. *.I
4190: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 6f nitialize the no
41a0: 74 69 66 69 65 72 20 74 6f 20 77 61 74 63 68 20 tifier to watch
41b0: 66 6f 72 20 65 76 65 6e 74 73 20 66 72 6f 6d 20 for events from
41c0: 74 68 69 73 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a this channel.. *
41d0: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 . * Returns:. *.
41e0: 4e 6f 74 68 69 6e 67 20 28 63 61 6e 27 74 20 72 Nothing (can't r
41f0: 65 74 75 72 6e 20 65 72 72 6f 72 20 6d 65 73 73 eturn error mess
4200: 61 67 65 73 29 0a 20 2a 0a 20 2a 20 53 69 64 65 ages). *. * Side
4210: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 6f 6e effects:. *.Con
4220: 66 69 67 75 72 65 20 6e 6f 74 69 66 69 65 72 20 figure notifier
4230: 73 6f 20 66 75 74 75 72 65 20 65 76 65 6e 74 73 so future events
4240: 20 6f 6e 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 on the channel
4250: 77 69 6c 6c 20 62 65 20 73 65 65 6e 20 62 79 20 will be seen by
4260: 54 63 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d Tcl.. *. *------
4270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
42a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
42b0: 0a 20 2a 2f 0a 76 6f 69 64 20 44 69 67 65 73 74 . */.void Digest
42c0: 57 61 74 63 68 50 72 6f 63 28 43 6c 69 65 6e 74 WatchProc(Client
42d0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
42e0: 20 69 6e 74 20 6d 61 73 6b 29 20 7b 0a 20 20 20 int mask) {.
42f0: 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 DigestState *st
4300: 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 atePtr = (Digest
4310: 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 State *) clientD
4320: 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 ata;. Tcl_Cha
4330: 6e 6e 65 6c 20 70 61 72 65 6e 74 3b 0a 20 20 20 nnel parent;.
4340: 20 54 63 6c 5f 44 72 69 76 65 72 57 61 74 63 68 Tcl_DriverWatch
4350: 50 72 6f 63 20 2a 77 61 74 63 68 50 72 6f 63 3b Proc *watchProc;
4360: 0a 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 69 .. /* Abort i
4370: 66 20 6e 6f 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a f no channel */.
4380: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
4390: 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 ->self == (Tcl_C
43a0: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a hannel) NULL) {.
43b0: 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a .return;. }..
43c0: 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 4f 52 2d /* Store OR-
43d0: 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f ed combination o
43e0: 66 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 2c 20 f TCL_READABLE,
43f0: 54 43 4c 5f 57 52 49 54 41 42 4c 45 20 61 6e 64 TCL_WRITABLE and
4400: 20 54 43 4c 5f 45 58 43 45 50 54 49 4f 4e 20 2a TCL_EXCEPTION *
4410: 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e /. statePtr->
4420: 77 61 74 63 68 4d 61 73 6b 20 3d 20 6d 61 73 6b watchMask = mask
4430: 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 70 61 67 ;.. /* Propag
4440: 61 74 65 20 6d 61 73 6b 20 69 6e 66 6f 20 74 6f ate mask info to
4450: 20 70 61 72 65 6e 74 20 63 68 61 6e 6e 65 6c 20 parent channel
4460: 2a 2f 0a 20 20 20 20 70 61 72 65 6e 74 20 3d 20 */. parent =
4470: 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 64 43 68 Tcl_GetStackedCh
4480: 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e annel(statePtr->
4490: 73 65 6c 66 29 3b 0a 20 20 20 20 77 61 74 63 68 self);. watch
44a0: 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68 61 6e 6e Proc = Tcl_Chann
44b0: 65 6c 57 61 74 63 68 50 72 6f 63 28 54 63 6c 5f elWatchProc(Tcl_
44c0: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 70 GetChannelType(p
44d0: 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 77 61 74 arent));. wat
44e0: 63 68 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 68 chProc(Tcl_GetCh
44f0: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 annelInstanceDat
4500: 61 28 70 61 72 65 6e 74 29 2c 20 6d 61 73 6b 29 a(parent), mask)
4510: 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 ;.. /* Remove
4520: 20 70 65 6e 64 69 6e 67 20 74 69 6d 65 72 20 2a pending timer *
4530: 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 /. if (stateP
4540: 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 tr->timer != (Tc
4550: 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 l_TimerToken) NU
4560: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 LL) {..Tcl_Delet
4570: 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 eTimerHandler(st
4580: 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a atePtr->timer);.
4590: 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 .statePtr->timer
45a0: 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b = (Tcl_TimerTok
45b0: 65 6e 29 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a en) NULL;. }.
45c0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 . /* If there
45d0: 20 69 73 20 64 61 74 61 20 70 65 6e 64 69 6e 67 is data pending
45e0: 2c 20 73 65 74 20 6e 65 77 20 74 69 6d 65 72 20 , set new timer
45f0: 74 6f 20 63 61 6c 6c 20 54 63 6c 5f 4e 6f 74 69 to call Tcl_Noti
4600: 66 79 43 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 fyChannel */.
4610: 20 69 66 20 28 28 6d 61 73 6b 20 26 20 54 43 4c if ((mask & TCL
4620: 5f 52 45 41 44 41 42 4c 45 29 20 26 26 20 28 54 _READABLE) && (T
4630: 63 6c 5f 49 6e 70 75 74 42 75 66 66 65 72 65 64 cl_InputBuffered
4640: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 (statePtr->self)
4650: 20 3e 20 30 29 29 20 7b 0a 09 73 74 61 74 65 50 > 0)) {..stateP
4660: 74 72 2d 3e 74 69 6d 65 72 20 3d 20 54 63 6c 5f tr->timer = Tcl_
4670: 43 72 65 61 74 65 54 69 6d 65 72 48 61 6e 64 6c CreateTimerHandl
4680: 65 72 28 52 45 41 44 5f 44 45 4c 41 59 2c 20 44 er(READ_DELAY, D
4690: 69 67 65 73 74 54 69 6d 65 72 48 61 6e 64 6c 65 igestTimerHandle
46a0: 72 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 r, (ClientData)
46b0: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 7d statePtr);. }
46c0: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d .}../*. *-------
46d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
46e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
46f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
4710: 20 2a 0a 20 2a 20 44 69 67 65 73 74 47 65 74 48 *. * DigestGetH
4720: 61 6e 64 6c 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a andleProc --. *.
4730: 20 2a 09 43 61 6c 6c 65 64 20 66 72 6f 6d 20 54 *.Called from T
4740: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 48 61 6e cl_GetChannelHan
4750: 64 6c 65 20 74 6f 20 72 65 74 72 69 65 76 65 20 dle to retrieve
4760: 4f 53 20 73 70 65 63 69 66 69 63 20 66 69 6c 65 OS specific file
4770: 20 68 61 6e 64 6c 65 0a 20 2a 09 66 72 6f 6d 20 handle. *.from
4780: 69 6e 73 69 64 65 20 74 68 69 73 20 63 68 61 6e inside this chan
4790: 6e 65 6c 2e 20 4e 6f 74 20 75 73 65 64 20 66 6f nel. Not used fo
47a0: 72 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e r transformation
47b0: 73 3f 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 s?. *. * Returns
47c0: 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 66 6f 72 20 :. *.TCL_OK for
47d0: 73 75 63 63 65 73 73 20 6f 72 20 54 43 4c 5f 45 success or TCL_E
47e0: 52 52 4f 52 20 66 6f 72 20 65 72 72 6f 72 20 6f RROR for error o
47f0: 72 20 69 66 20 6e 6f 74 20 73 75 70 70 6f 72 74 r if not support
4800: 65 64 2e 20 49 66 0a 20 2a 09 64 69 72 65 63 74 ed. If. *.direct
4810: 69 6f 6e 20 69 73 20 54 43 4c 5f 52 45 41 44 41 ion is TCL_READA
4820: 42 4c 45 2c 20 73 65 74 73 20 68 61 6e 64 6c 65 BLE, sets handle
4830: 50 74 72 20 74 6f 20 74 68 65 20 68 61 6e 64 6c Ptr to the handl
4840: 65 20 75 73 65 64 20 66 6f 72 0a 20 2a 09 69 6e e used for. *.in
4850: 70 75 74 2c 20 6f 72 20 69 66 20 54 43 4c 5f 57 put, or if TCL_W
4860: 52 49 54 41 42 4c 45 20 73 65 74 73 20 74 6f 20 RITABLE sets to
4870: 74 68 65 20 68 61 6e 64 6c 65 20 75 73 65 64 20 the handle used
4880: 66 6f 72 20 6f 75 74 70 75 74 2e 0a 20 2a 0a 20 for output.. *.
4890: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
48a0: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d *.None. *. *---
48b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48f0: 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 ---. */.int Dige
4900: 73 74 47 65 74 48 61 6e 64 6c 65 50 72 6f 63 28 stGetHandleProc(
4910: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
4920: 74 44 61 74 61 2c 20 69 6e 74 20 64 69 72 65 63 tData, int direc
4930: 74 69 6f 6e 2c 20 43 6c 69 65 6e 74 44 61 74 61 tion, ClientData
4940: 20 2a 68 61 6e 64 6c 65 50 74 72 29 20 7b 0a 20 *handlePtr) {.
4950: 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a DigestState *
4960: 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 statePtr = (Dige
4970: 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e stState *) clien
4980: 74 44 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 43 tData;. Tcl_C
4990: 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 3b 0a 0a hannel parent;..
49a0: 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 69 66 20 /* Abort if
49b0: 6e 6f 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 no channel */.
49c0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
49d0: 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 self == (Tcl_Cha
49e0: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 nnel) NULL) {..r
49f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
4a00: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 61 72 65 . }.. pare
4a10: 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 63 nt = Tcl_GetStac
4a20: 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 kedChannel(state
4a30: 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 20 Ptr->self);.
4a40: 72 65 74 75 72 6e 20 54 63 6c 5f 47 65 74 43 68 return Tcl_GetCh
4a50: 61 6e 6e 65 6c 48 61 6e 64 6c 65 28 70 61 72 65 annelHandle(pare
4a60: 6e 74 2c 20 64 69 72 65 63 74 69 6f 6e 2c 20 68 nt, direction, h
4a70: 61 6e 64 6c 65 50 74 72 29 3b 0a 7d 0a 0a 2f 2a andlePtr);.}../*
4a80: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
4a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
4ad0: 44 69 67 65 73 74 4e 6f 74 69 66 79 50 72 6f 63 DigestNotifyProc
4ae0: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 --. *. *.Called
4af0: 20 62 79 20 54 63 6c 20 74 6f 20 69 6e 66 6f 72 by Tcl to infor
4b00: 6d 20 75 73 20 6f 66 20 61 63 74 69 76 69 74 79 m us of activity
4b10: 20 6f 6e 20 74 68 65 20 75 6e 64 65 72 6c 79 69 on the underlyi
4b20: 6e 67 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 ng channel.. *.
4b30: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 55 6e * Returns:. *.Un
4b40: 63 68 61 6e 67 65 64 20 69 6e 74 65 72 65 73 74 changed interest
4b50: 4d 61 73 6b 20 77 68 69 63 68 20 69 73 20 61 6e Mask which is an
4b60: 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 OR-ed combinati
4b70: 6f 6e 20 6f 66 20 54 43 4c 5f 52 45 41 44 41 42 on of TCL_READAB
4b80: 4c 45 20 6f 72 20 54 43 4c 5f 57 52 49 54 41 42 LE or TCL_WRITAB
4b90: 4c 45 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 LE. *. * Side ef
4ba0: 66 65 63 74 73 3a 0a 20 2a 09 43 61 6e 63 65 6c fects:. *.Cancel
4bb0: 73 20 61 6e 79 20 70 65 6e 64 69 6e 67 20 74 69 s any pending ti
4bc0: 6d 65 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d mer.. *. *------
4bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c10: 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 4e . */.int DigestN
4c20: 6f 74 69 66 79 50 72 6f 63 28 43 6c 69 65 6e 74 otifyProc(Client
4c30: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
4c40: 20 69 6e 74 20 69 6e 74 65 72 65 73 74 4d 61 73 int interestMas
4c50: 6b 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53 k) {. DigestS
4c60: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d tate *statePtr =
4c70: 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 29 (DigestState *)
4c80: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 clientData;..
4c90: 20 20 2f 2a 20 53 6b 69 70 20 74 69 6d 65 72 20 /* Skip timer
4ca0: 65 76 65 6e 74 20 61 73 20 72 65 64 75 6e 64 61 event as redunda
4cb0: 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 nt */. if (st
4cc0: 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d atePtr->timer !=
4cd0: 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e (Tcl_TimerToken
4ce0: 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 ) NULL) {..Tcl_D
4cf0: 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 eleteTimerHandle
4d00: 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 r(statePtr->time
4d10: 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 r);..statePtr->t
4d20: 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 imer = (Tcl_Time
4d30: 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 20 20 rToken) NULL;.
4d40: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 69 }. return i
4d50: 6e 74 65 72 65 73 74 4d 61 73 6b 3b 0a 7d 0a 0a nterestMask;.}..
4d60: 2f 2a 0a 20 2a 0a 20 2a 20 43 68 61 6e 6e 65 6c /*. *. * Channel
4d70: 20 74 79 70 65 20 73 74 72 75 63 74 75 72 65 20 type structure
4d80: 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20 64 definition for d
4d90: 69 67 65 73 74 20 74 72 61 6e 73 66 6f 72 6d 61 igest transforma
4da0: 74 69 6f 6e 73 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 tions.. *. */.st
4db0: 61 74 69 63 20 63 6f 6e 73 74 20 54 63 6c 5f 43 atic const Tcl_C
4dc0: 68 61 6e 6e 65 6c 54 79 70 65 20 64 69 67 65 73 hannelType diges
4dd0: 74 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d 20 7b tChannelType = {
4de0: 0a 20 20 20 20 22 64 69 67 65 73 74 22 2c 09 09 . "digest",..
4df0: 09 2f 2a 20 54 79 70 65 20 6e 61 6d 65 20 2a 2f ./* Type name */
4e00: 0a 20 20 20 20 54 43 4c 5f 43 48 41 4e 4e 45 4c . TCL_CHANNEL
4e10: 5f 56 45 52 53 49 4f 4e 5f 35 2c 09 2f 2a 20 76 _VERSION_5,./* v
4e20: 35 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 5 channel */.
4e30: 20 44 69 67 65 73 74 43 6c 6f 73 65 50 72 6f 63 DigestCloseProc
4e40: 2c 09 09 2f 2a 20 43 6c 6f 73 65 20 70 72 6f 63 ,../* Close proc
4e50: 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 49 6e */. DigestIn
4e60: 70 75 74 50 72 6f 63 2c 09 09 2f 2a 20 49 6e 70 putProc,../* Inp
4e70: 75 74 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 44 ut proc */. D
4e80: 69 67 65 73 74 4f 75 74 70 75 74 50 72 6f 63 2c igestOutputProc,
4e90: 09 09 2f 2a 20 4f 75 74 70 75 74 20 70 72 6f 63 ../* Output proc
4ea0: 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 09 */. NULL,...
4eb0: 2f 2a 20 53 65 65 6b 20 70 72 6f 63 20 2a 2f 0a /* Seek proc */.
4ec0: 20 20 20 20 44 69 67 65 73 74 53 65 74 4f 70 74 DigestSetOpt
4ed0: 69 6f 6e 50 72 6f 63 2c 09 2f 2a 20 53 65 74 20 ionProc,./* Set
4ee0: 6f 70 74 69 6f 6e 20 70 72 6f 63 20 2a 2f 0a 20 option proc */.
4ef0: 20 20 20 44 69 67 65 73 74 47 65 74 4f 70 74 69 DigestGetOpti
4f00: 6f 6e 50 72 6f 63 2c 09 2f 2a 20 47 65 74 20 6f onProc,./* Get o
4f10: 70 74 69 6f 6e 20 70 72 6f 63 20 2a 2f 0a 20 20 ption proc */.
4f20: 20 20 44 69 67 65 73 74 57 61 74 63 68 50 72 6f DigestWatchPro
4f30: 63 2c 09 09 2f 2a 20 49 6e 69 74 69 61 6c 69 7a c,../* Initializ
4f40: 65 20 6e 6f 74 69 66 69 65 72 20 2a 2f 0a 20 20 e notifier */.
4f50: 20 20 44 69 67 65 73 74 47 65 74 48 61 6e 64 6c DigestGetHandl
4f60: 65 50 72 6f 63 2c 09 2f 2a 20 47 65 74 20 4f 53 eProc,./* Get OS
4f70: 20 68 61 6e 64 6c 65 73 20 6f 75 74 20 6f 66 20 handles out of
4f80: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 44 channel */. D
4f90: 69 67 65 73 74 43 6c 6f 73 65 32 50 72 6f 63 2c igestClose2Proc,
4fa0: 09 09 2f 2a 20 63 6c 6f 73 65 32 70 72 6f 63 20 ../* close2proc
4fb0: 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 42 6c 6f */. DigestBlo
4fc0: 63 6b 4d 6f 64 65 50 72 6f 63 2c 09 2f 2a 20 53 ckModeProc,./* S
4fd0: 65 74 20 62 6c 6f 63 6b 69 6e 67 2f 6e 6f 6e 62 et blocking/nonb
4fe0: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2a 2f 0a 20 locking mode*/.
4ff0: 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 46 6c NULL,.../* Fl
5000: 75 73 68 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 ush proc */.
5010: 44 69 67 65 73 74 4e 6f 74 69 66 79 50 72 6f 63 DigestNotifyProc
5020: 2c 09 09 2f 2a 20 48 61 6e 64 6c 69 6e 67 20 6f ,../* Handling o
5030: 66 20 65 76 65 6e 74 73 20 62 75 62 62 6c 69 6e f events bubblin
5040: 67 20 75 70 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c g up */. NULL
5050: 2c 09 09 09 2f 2a 20 57 69 64 65 20 73 65 65 6b ,.../* Wide seek
5060: 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 4e 55 4c proc */. NUL
5070: 4c 2c 09 09 09 2f 2a 20 54 68 72 65 61 64 20 61 L,.../* Thread a
5080: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 4e 55 4c ction */. NUL
5090: 4c 09 09 09 2f 2a 20 54 72 75 6e 63 61 74 65 20 L.../* Truncate
50a0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d */.};../*. *----
50b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
50c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
50d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
50e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
50f0: 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 43 --. *. * DigestC
5100: 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 20 2d 2d hannelHandler --
5110: 0a 20 2a 0a 20 2a 09 43 72 65 61 74 65 20 61 20 . *. *.Create a
5120: 73 74 61 63 6b 65 64 20 63 68 61 6e 6e 65 6c 20 stacked channel
5130: 66 6f 72 20 61 20 6d 65 73 73 61 67 65 20 64 69 for a message di
5140: 67 65 73 74 20 74 72 61 6e 73 66 6f 72 6d 61 74 gest transformat
5150: 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 ion.. *. * Retur
5160: 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 ns:. *.TCL_OK or
5170: 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a TCL_ERROR. *. *
5180: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
5190: 2a 09 41 64 64 73 20 74 72 61 6e 73 66 6f 72 6d *.Adds transform
51a0: 20 74 6f 20 63 68 61 6e 6e 65 6c 20 61 6e 64 20 to channel and
51b0: 73 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20 63 sets result to c
51c0: 68 61 6e 6e 65 6c 20 69 64 20 6f 72 20 65 72 72 hannel id or err
51d0: 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20 or message.. *.
51e0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
51f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5220: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
5230: 69 63 20 69 6e 74 0a 44 69 67 65 73 74 43 68 61 ic int.DigestCha
5240: 6e 6e 65 6c 48 61 6e 64 6c 65 72 28 54 63 6c 5f nnelHandler(Tcl_
5250: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
5260: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 68 61 6e const char *chan
5270: 6e 65 6c 2c 20 63 6f 6e 73 74 20 45 56 50 5f 4d nel, const EVP_M
5280: 44 20 2a 6d 64 2c 0a 09 63 6f 6e 73 74 20 45 56 D *md,..const EV
5290: 50 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 P_CIPHER *cipher
52a0: 2c 20 69 6e 74 20 66 6f 72 6d 61 74 2c 20 54 63 , int format, Tc
52b0: 6c 5f 4f 62 6a 20 2a 6b 65 79 4f 62 6a 2c 20 45 l_Obj *keyObj, E
52c0: 56 50 5f 4d 41 43 20 2a 6d 61 63 29 20 7b 0a 20 VP_MAC *mac) {.
52d0: 20 20 20 69 6e 74 20 6d 6f 64 65 3b 20 2f 2a 20 int mode; /*
52e0: 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f OR-ed combinatio
52f0: 6e 20 6f 66 20 54 43 4c 5f 52 45 41 44 41 42 4c n of TCL_READABL
5300: 45 20 61 6e 64 20 54 43 4c 5f 57 52 49 54 41 42 E and TCL_WRITAB
5310: 4c 45 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 43 68 LE */. Tcl_Ch
5320: 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 annel chan;.
5330: 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 DigestState *sta
5340: 74 65 50 74 72 3b 0a 0a 20 20 20 20 2f 2a 20 56 tePtr;.. /* V
5350: 61 6c 69 64 61 74 65 20 61 72 67 73 20 2a 2f 0a alidate args */.
5360: 20 20 20 20 69 66 20 28 63 68 61 6e 6e 65 6c 20 if (channel
5370: 3d 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a == (const char *
5380: 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 ) NULL) {..retur
5390: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
53a0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 }.. /* Get c
53b0: 68 61 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20 20 20 hannel Id */.
53c0: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 chan = Tcl_GetC
53d0: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 hannel(interp, c
53e0: 68 61 6e 6e 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a hannel, &mode);.
53f0: 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 if (chan ==
5400: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 (Tcl_Channel) NU
5410: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 LL) {..return TC
5420: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
5430: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 /* Make sure
5440: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 to operate on t
5450: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e he topmost chann
5460: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d el */. chan =
5470: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e Tcl_GetTopChann
5480: 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f el(chan);.. /
5490: 2a 20 43 72 65 61 74 65 20 73 74 61 74 65 20 64 * Create state d
54a0: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 2a 2f ata structure */
54b0: 0a 20 20 20 20 69 66 20 28 28 73 74 61 74 65 50 . if ((stateP
54c0: 74 72 20 3d 20 44 69 67 65 73 74 53 74 61 74 65 tr = DigestState
54d0: 4e 65 77 28 69 6e 74 65 72 70 2c 20 66 6f 72 6d New(interp, form
54e0: 61 74 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a at)) == NULL) {.
54f0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
5500: 74 28 69 6e 74 65 72 70 2c 20 22 4d 65 6d 6f 72 t(interp, "Memor
5510: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 y allocation err
5520: 6f 72 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 or", (char *) NU
5530: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c LL);..return TCL
5540: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
5550: 20 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 statePtr->self
5560: 20 3d 20 63 68 61 6e 3b 0a 20 20 20 20 73 74 61 = chan;. sta
5570: 74 65 50 74 72 2d 3e 6d 6f 64 65 20 3d 20 6d 6f tePtr->mode = mo
5580: 64 65 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 de;.. /* Init
5590: 69 61 6c 69 7a 65 20 68 61 73 68 20 66 75 6e 63 ialize hash func
55a0: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 tion */. if (
55b0: 44 69 67 65 73 74 49 6e 69 74 69 61 6c 69 7a 65 DigestInitialize
55c0: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 (interp, statePt
55d0: 72 2c 20 6d 64 2c 20 63 69 70 68 65 72 2c 20 6b r, md, cipher, k
55e0: 65 79 4f 62 6a 2c 20 6d 61 63 29 20 21 3d 20 54 eyObj, mac) != T
55f0: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e CL_OK) {..return
5600: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
5610: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 }.. /* Config
5620: 75 72 65 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 ure channel */.
5630: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 Tcl_SetChanne
5640: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
5650: 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 chan, "-translat
5660: 69 6f 6e 22 2c 20 22 62 69 6e 61 72 79 22 29 3b ion", "binary");
5670: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 . if (Tcl_Get
5680: 43 68 61 6e 6e 65 6c 42 75 66 66 65 72 53 69 7a ChannelBufferSiz
5690: 65 28 63 68 61 6e 29 20 3c 20 45 56 50 5f 4d 41 e(chan) < EVP_MA
56a0: 58 5f 4d 44 5f 53 49 5a 45 20 2a 20 32 29 20 7b X_MD_SIZE * 2) {
56b0: 0a 09 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c ..Tcl_SetChannel
56c0: 42 75 66 66 65 72 53 69 7a 65 28 63 68 61 6e 2c BufferSize(chan,
56d0: 20 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45 EVP_MAX_MD_SIZE
56e0: 20 2a 20 32 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 * 2);. }..
56f0: 20 20 2f 2a 20 53 74 61 63 6b 20 63 68 61 6e 6e /* Stack chann
5700: 65 6c 2c 20 61 62 6f 72 74 20 66 6f 72 20 65 72 el, abort for er
5710: 72 6f 72 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 ror */. state
5720: 50 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f Ptr->self = Tcl_
5730: 53 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 StackChannel(int
5740: 65 72 70 2c 20 26 64 69 67 65 73 74 43 68 61 6e erp, &digestChan
5750: 6e 65 6c 54 79 70 65 2c 20 28 43 6c 69 65 6e 74 nelType, (Client
5760: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2c 20 Data) statePtr,
5770: 6d 6f 64 65 2c 20 63 68 61 6e 29 3b 0a 20 20 20 mode, chan);.
5780: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 if (statePtr->s
5790: 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e elf == (Tcl_Chan
57a0: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 44 69 nel) NULL) {..Di
57b0: 67 65 73 74 53 74 61 74 65 46 72 65 65 28 73 74 gestStateFree(st
57c0: 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e atePtr);..return
57d0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
57e0: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 72 65 }.. /* Set re
57f0: 73 75 6c 74 20 74 6f 20 63 68 61 6e 6e 65 6c 20 sult to channel
5800: 49 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 65 Id */. Tcl_Se
5810: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 tResult(interp,
5820: 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 (char *) Tcl_Get
5830: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e ChannelName(chan
5840: 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 ), TCL_VOLATILE)
5850: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c ;. return TCL
5860: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d _OK;.}../*. *---
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 2d 2d 2d 2d ----------------
58a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
58b0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e 73 74 61 63 ---. *. * Unstac
58c0: 6b 20 43 68 61 6e 6e 65 6c 20 2d 2d 0a 20 2a 0a k Channel --. *.
58d0: 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e *.This function
58e0: 20 72 65 6d 6f 76 65 73 20 74 68 65 20 73 74 61 removes the sta
58f0: 63 6b 65 64 20 63 68 61 6e 6e 65 6c 20 66 72 6f cked channel fro
5900: 6d 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 m the top of the
5910: 0a 20 2a 09 63 68 61 6e 6e 65 6c 20 73 74 61 63 . *.channel stac
5920: 6b 20 69 66 20 69 74 20 69 73 20 61 20 64 69 67 k if it is a dig
5930: 65 73 74 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a est channel.. *.
5940: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 * Returns:. *.T
5950: 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 CL_OK or TCL_ERR
5960: 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 OR. *. * Side ef
5970: 66 65 63 74 73 3a 0a 20 2a 09 52 65 6d 6f 76 65 fects:. *.Remove
5980: 73 20 74 72 61 6e 73 66 6f 72 6d 20 66 72 6f 6d s transform from
5990: 20 63 68 61 6e 6e 65 6c 20 6f 72 20 73 65 74 73 channel or sets
59a0: 20 72 65 73 75 6c 74 20 74 6f 20 65 72 72 6f 72 result to error
59b0: 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 2d message.. *. *-
59c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
59d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
59e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
59f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5a00: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
5a10: 20 69 6e 74 0a 44 69 67 65 73 74 55 6e 73 74 61 int.DigestUnsta
5a20: 63 6b 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 ckObjCmd(ClientD
5a30: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
5a40: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
5a50: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 rp, int objc, Tc
5a60: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
5a70: 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 v[]) {. Tcl_C
5a80: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 hannel chan;.
5a90: 20 69 6e 74 20 6d 6f 64 65 3b 20 2f 2a 20 4f 52 int mode; /* OR
5aa0: 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 -ed combination
5ab0: 6f 66 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 of TCL_READABLE
5ac0: 61 6e 64 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 and TCL_WRITABLE
5ad0: 20 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 56 61 6c */.. /* Val
5ae0: 69 64 61 74 65 20 61 72 67 20 63 6f 75 6e 74 20 idate arg count
5af0: 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 */. if (objc
5b00: 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f != 2) {..Tcl_Wro
5b10: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
5b20: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e , 1, objv, "chan
5b30: 6e 65 6c 49 64 22 29 3b 0a 09 72 65 74 75 72 6e nelId");..return
5b40: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
5b50: 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 68 }.. /* Get ch
5b60: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 annel */. cha
5b70: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e n = Tcl_GetChann
5b80: 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 el(interp, Tcl_G
5b90: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
5ba0: 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 objv[1], NULL),
5bb0: 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 28 &mode);. if (
5bc0: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 chan == (Tcl_Cha
5bd0: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 nnel) NULL) {..r
5be0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
5bf0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d . }.. /* M
5c00: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 ake sure to oper
5c10: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f ate on the topmo
5c20: 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 st channel */.
5c30: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
5c40: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 TopChannel(chan)
5c50: 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 ;.. /* Check
5c60: 69 66 20 64 69 67 65 73 74 20 63 68 61 6e 6e 65 if digest channe
5c70: 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c l */. if (Tcl
5c80: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 _GetChannelType(
5c90: 63 68 61 6e 29 20 21 3d 20 26 64 69 67 65 73 74 chan) != &digest
5ca0: 43 68 61 6e 6e 65 6c 54 79 70 65 29 20 7b 0a 09 ChannelType) {..
5cb0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
5cc0: 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 (interp, "bad ch
5cd0: 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 annel \"", Tcl_G
5ce0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 etChannelName(ch
5cf0: 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e an),.. "\": n
5d00: 6f 74 20 61 20 64 69 67 65 73 74 20 63 68 61 6e ot a digest chan
5d10: 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 nel", NULL);..Tc
5d20: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 l_SetErrorCode(i
5d30: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 55 nterp, "TLS", "U
5d40: 4e 53 54 41 43 4b 22 2c 20 22 43 48 41 4e 4e 45 NSTACK", "CHANNE
5d50: 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 L", "INVALID", (
5d60: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
5d70: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
5d80: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
5d90: 50 6f 70 20 74 72 61 6e 73 66 6f 72 6d 20 66 72 Pop transform fr
5da0: 6f 6d 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 om channel */.
5db0: 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 55 6e 73 return Tcl_Uns
5dc0: 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 tackChannel(inte
5dd0: 72 70 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 09 rp, chan);. .
5de0: 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 clientData = cli
5df0: 65 6e 74 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 2a 2a entData;.}../***
5e00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5e10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5e20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5e30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5e40: 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d /../*. *--------
5e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
5e90: 2a 20 44 69 67 65 73 74 49 6e 73 74 61 6e 63 65 * DigestInstance
5ea0: 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 ObjCmd --. *. *.
5eb0: 48 61 6e 64 6c 65 72 20 66 6f 72 20 64 69 67 65 Handler for dige
5ec0: 73 74 20 63 6f 6d 6d 61 6e 64 20 69 6e 73 74 61 st command insta
5ed0: 6e 63 65 73 2e 20 55 73 65 64 20 74 6f 20 61 64 nces. Used to ad
5ee0: 64 20 64 61 74 61 20 74 6f 20 68 61 73 68 0a 20 d data to hash.
5ef0: 2a 09 66 75 6e 63 74 69 6f 6e 20 6f 72 20 72 65 *.function or re
5f00: 74 72 69 65 76 65 20 6d 65 73 73 61 67 65 20 64 trieve message d
5f10: 69 67 65 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 74 igest.. *. * Ret
5f20: 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 urns:. *.TCL_OK
5f30: 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a or TCL_ERROR. *.
5f40: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
5f50: 0a 20 2a 09 41 64 64 73 20 64 61 74 61 20 74 6f . *.Adds data to
5f60: 20 68 61 73 68 20 6f 72 20 72 65 74 75 72 6e 73 hash or returns
5f70: 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 0a message digest.
5f80: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
5f90: 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 69 6e 74 --------. */.int
5fd0: 20 44 69 67 65 73 74 49 6e 73 74 61 6e 63 65 4f DigestInstanceO
5fe0: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 bjCmd(ClientData
5ff0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
6000: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
6010: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
6020: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
6030: 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74 ) {. DigestSt
6040: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 ate *statePtr =
6050: 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 29 20 (DigestState *)
6060: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 clientData;.
6070: 69 6e 74 20 66 6e 2c 20 6c 65 6e 20 3d 20 30 3b int fn, len = 0;
6080: 0a 20 20 20 20 63 68 61 72 20 2a 62 75 66 20 3d . char *buf =
6090: 20 4e 55 4c 4c 3b 0a 20 20 20 20 73 74 61 74 69 NULL;. stati
60a0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 6e c const char *in
60b0: 73 74 61 6e 63 65 5f 66 6e 73 20 5b 5d 20 3d 20 stance_fns [] =
60c0: 7b 20 22 66 69 6e 61 6c 69 7a 65 22 2c 20 22 75 { "finalize", "u
60d0: 70 64 61 74 65 22 2c 20 4e 55 4c 4c 20 7d 3b 0a pdate", NULL };.
60e0: 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 65 . /* Validate
60f0: 20 61 72 67 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 arg count */.
6100: 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 20 7c if (objc < 2 |
6110: 7c 20 6f 62 6a 63 20 3e 20 33 29 20 7b 0a 09 54 | objc > 3) {..T
6120: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
6130: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c interp, 1, objv,
6140: 20 22 66 75 6e 63 74 69 6f 6e 20 3f 64 61 74 61 "function ?data
6150: 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c ?");..return TCL
6160: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
6170: 20 20 20 2f 2a 20 47 65 74 20 66 75 6e 63 74 69 /* Get functi
6180: 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 on */. if (Tc
6190: 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 l_GetIndexFromOb
61a0: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 j(interp, objv[1
61b0: 5d 2c 20 69 6e 73 74 61 6e 63 65 5f 66 6e 73 2c ], instance_fns,
61c0: 20 22 66 75 6e 63 74 69 6f 6e 22 2c 20 30 2c 20 "function", 0,
61d0: 26 66 6e 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 &fn) != TCL_OK)
61e0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
61f0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
6200: 2f 2a 20 44 6f 20 66 75 6e 63 74 69 6f 6e 20 2a /* Do function *
6210: 2f 0a 20 20 20 20 69 66 20 28 66 6e 29 20 7b 0a /. if (fn) {.
6220: 09 2f 2a 20 47 65 74 20 64 61 74 61 20 6f 72 20 ./* Get data or
6230: 72 65 74 75 72 6e 20 65 72 72 6f 72 20 69 66 20 return error if
6240: 6e 6f 6e 65 20 2a 2f 0a 09 69 66 20 28 6f 62 6a none */..if (obj
6250: 63 20 3d 3d 20 33 29 20 7b 0a 09 20 20 20 20 62 c == 3) {.. b
6260: 75 66 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 uf = Tcl_GetByte
6270: 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a ArrayFromObj(obj
6280: 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 09 7d 20 v[2], &len);..}
6290: 65 6c 73 65 20 7b 0a 09 20 20 20 20 54 63 6c 5f else {.. Tcl_
62a0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
62b0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 75 erp, 1, objv, "u
62c0: 70 64 61 74 65 20 64 61 74 61 22 29 3b 0a 09 20 pdate data");..
62d0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
62e0: 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 55 70 64 ROR;..}.../* Upd
62f0: 61 74 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f ate hash functio
6300: 6e 20 2a 2f 0a 09 69 66 20 28 21 44 69 67 65 73 n */..if (!Diges
6310: 74 55 70 64 61 74 65 28 73 74 61 74 65 50 74 72 tUpdate(statePtr
6320: 2c 20 62 75 66 2c 20 28 73 69 7a 65 5f 74 29 20 , buf, (size_t)
6330: 6c 65 6e 2c 20 31 29 29 20 7b 0a 09 20 20 20 20 len, 1)) {..
6340: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
6350: 3b 0a 09 7d 0a 0a 20 20 20 20 7d 20 65 6c 73 65 ;..}.. } else
6360: 20 7b 0a 09 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 {../* Finalize
6370: 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 61 6e hash function an
6380: 64 20 63 61 6c 63 75 6c 61 74 65 20 6d 65 73 73 d calculate mess
6390: 61 67 65 20 64 69 67 65 73 74 20 2a 2f 0a 09 69 age digest */..i
63a0: 66 20 28 44 69 67 65 73 74 46 69 6e 61 6c 69 7a f (DigestFinaliz
63b0: 65 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 e(interp, stateP
63c0: 74 72 2c 20 4e 55 4c 4c 29 20 21 3d 20 54 43 4c tr, NULL) != TCL
63d0: 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 72 65 74 75 _OK) {.. retu
63e0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
63f0: 0a 0a 09 54 63 6c 5f 44 65 6c 65 74 65 43 6f 6d ...Tcl_DeleteCom
6400: 6d 61 6e 64 46 72 6f 6d 54 6f 6b 65 6e 28 69 6e mandFromToken(in
6410: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e terp, statePtr->
6420: 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 token);. }.
6430: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
6440: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d .}../*. *-------
6450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
6490: 20 2a 20 44 69 67 65 73 74 43 6f 6d 6d 61 6e 64 * DigestCommand
64a0: 44 65 6c 65 74 65 48 61 6e 64 6c 65 72 20 2d 2d DeleteHandler --
64b0: 0a 20 2a 0a 20 2a 09 20 43 61 6c 6c 62 61 63 6b . *. *. Callback
64c0: 20 74 6f 20 63 6c 65 61 6e 2d 75 70 20 77 68 65 to clean-up whe
64d0: 6e 20 64 69 67 65 73 74 20 69 6e 73 74 61 6e 63 n digest instanc
64e0: 65 20 63 6f 6d 6d 61 6e 64 20 69 73 20 64 65 6c e command is del
64f0: 65 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 eted.. *. * Retu
6500: 72 6e 73 3a 0a 20 2a 09 4e 6f 74 68 69 6e 67 0a rns:. *.Nothing.
6510: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
6520: 74 73 3a 0a 20 2a 09 44 65 73 74 72 6f 79 73 20 ts:. *.Destroys
6530: 73 74 61 74 65 20 69 6e 66 6f 20 73 74 72 75 63 state info struc
6540: 74 75 72 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ture. *. *------
6550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
6590: 2f 0a 76 6f 69 64 20 44 69 67 65 73 74 43 6f 6d /.void DigestCom
65a0: 6d 61 6e 64 44 65 6c 65 74 65 48 61 6e 64 6c 65 mandDeleteHandle
65b0: 72 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 r(ClientData cli
65c0: 65 6e 74 44 61 74 61 29 20 7b 0a 20 20 20 20 44 entData) {. D
65d0: 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 igestState *stat
65e0: 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 ePtr = (DigestSt
65f0: 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 ate *) clientDat
6600: 61 3b 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 6e a;.. /* Clean
6610: 2d 75 70 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 -up */. Diges
6620: 74 53 74 61 74 65 46 72 65 65 28 73 74 61 74 65 tStateFree(state
6630: 50 74 72 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d Ptr);.}../*. *--
6640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6680: 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 43 6f -. *. * DigestCo
6690: 6d 6d 61 6e 64 48 61 6e 64 6c 65 72 20 2d 2d 0a mmandHandler --.
66a0: 20 2a 0a 20 2a 09 20 43 72 65 61 74 65 20 63 6f *. *. Create co
66b0: 6d 6d 61 6e 64 20 74 6f 20 61 6c 6c 6f 77 20 75 mmand to allow u
66c0: 73 65 72 20 74 6f 20 61 64 64 20 64 61 74 61 20 ser to add data
66d0: 74 6f 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e to hash function
66e0: 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a .. *. * Returns:
66f0: 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 . *.TCL_OK or TC
6700: 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 L_ERROR. *. * Si
6710: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 de effects:. *.C
6720: 72 65 61 74 65 73 20 63 6f 6d 6d 61 6e 64 20 6f reates command o
6730: 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a r error message.
6740: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
6750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6780: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 --------. */.int
6790: 20 44 69 67 65 73 74 43 6f 6d 6d 61 6e 64 48 61 DigestCommandHa
67a0: 6e 64 6c 65 72 28 54 63 6c 5f 49 6e 74 65 72 70 ndler(Tcl_Interp
67b0: 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 *interp, Tcl_Ob
67c0: 6a 20 2a 63 6d 64 4f 62 6a 2c 20 63 6f 6e 73 74 j *cmdObj, const
67d0: 20 45 56 50 5f 4d 44 20 2a 6d 64 2c 0a 09 63 6f EVP_MD *md,..co
67e0: 6e 73 74 20 45 56 50 5f 43 49 50 48 45 52 20 2a nst EVP_CIPHER *
67f0: 63 69 70 68 65 72 2c 20 69 6e 74 20 66 6f 72 6d cipher, int form
6800: 61 74 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79 at, Tcl_Obj *key
6810: 4f 62 6a 2c 20 45 56 50 5f 4d 41 43 20 2a 6d 61 Obj, EVP_MAC *ma
6820: 63 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53 c) {. DigestS
6830: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a tate *statePtr;.
6840: 20 20 20 20 63 68 61 72 20 2a 63 6d 64 4e 61 6d char *cmdNam
6850: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e e = Tcl_GetStrin
6860: 67 46 72 6f 6d 4f 62 6a 28 63 6d 64 4f 62 6a 2c gFromObj(cmdObj,
6870: 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 NULL);.. /*
6880: 43 72 65 61 74 65 20 73 74 61 74 65 20 64 61 74 Create state dat
6890: 61 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 a structure */.
68a0: 20 20 20 69 66 20 28 28 73 74 61 74 65 50 74 72 if ((statePtr
68b0: 20 3d 20 44 69 67 65 73 74 53 74 61 74 65 4e 65 = DigestStateNe
68c0: 77 28 69 6e 74 65 72 70 2c 20 66 6f 72 6d 61 74 w(interp, format
68d0: 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 )) == NULL) {..T
68e0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
68f0: 69 6e 74 65 72 70 2c 20 22 4d 65 6d 6f 72 79 20 interp, "Memory
6900: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 allocation error
6910: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
6920: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
6930: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
6940: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 68 /* Initialize h
6950: 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a ash function */.
6960: 20 20 20 20 69 66 20 28 44 69 67 65 73 74 49 6e if (DigestIn
6970: 69 74 69 61 6c 69 7a 65 28 69 6e 74 65 72 70 2c itialize(interp,
6980: 20 73 74 61 74 65 50 74 72 2c 20 6d 64 2c 20 63 statePtr, md, c
6990: 69 70 68 65 72 2c 20 6b 65 79 4f 62 6a 2c 20 6d ipher, keyObj, m
69a0: 61 63 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b ac) != TCL_OK) {
69b0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
69c0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
69d0: 2a 20 43 72 65 61 74 65 20 69 6e 73 74 61 6e 63 * Create instanc
69e0: 65 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 e command */.
69f0: 20 73 74 61 74 65 50 74 72 2d 3e 74 6f 6b 65 6e statePtr->token
6a00: 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a = Tcl_CreateObj
6a10: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
6a20: 63 6d 64 4e 61 6d 65 2c 20 44 69 67 65 73 74 49 cmdName, DigestI
6a30: 6e 73 74 61 6e 63 65 4f 62 6a 43 6d 64 2c 0a 09 nstanceObjCmd,..
6a40: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 (ClientData) sta
6a50: 74 65 50 74 72 2c 20 44 69 67 65 73 74 43 6f 6d tePtr, DigestCom
6a60: 6d 61 6e 64 44 65 6c 65 74 65 48 61 6e 64 6c 65 mandDeleteHandle
6a70: 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 74 75 r);.. /* Retu
6a80: 72 6e 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 rn command name
6a90: 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 */. Tcl_SetOb
6aa0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
6ab0: 63 6d 64 4f 62 6a 29 3b 0a 20 20 20 20 72 65 74 cmdObj);. ret
6ac0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a urn TCL_OK;.}...
6ad0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /***************
6ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6af0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6b00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6b10: 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d ****/../*. *----
6b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
6b60: 20 2a 0a 20 2a 20 44 69 67 65 73 74 44 61 74 61 *. * DigestData
6b70: 48 61 6e 64 6c 65 72 20 2d 2d 0a 20 2a 0a 20 2a Handler --. *. *
6b80: 09 52 65 74 75 72 6e 20 6d 65 73 73 61 67 65 20 .Return message
6b90: 64 69 67 65 73 74 20 66 6f 72 20 64 61 74 61 20 digest for data
6ba0: 75 73 69 6e 67 20 75 73 65 72 20 73 70 65 63 69 using user speci
6bb0: 66 69 65 64 20 68 61 73 68 20 66 75 6e 63 74 69 fied hash functi
6bc0: 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e on.. *. * Return
6bd0: 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 s:. *.TCL_OK or
6be0: 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 TCL_ERROR. *. *
6bf0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
6c00: 09 53 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20 .Sets result to
6c10: 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20 6f message digest o
6c20: 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a r error message.
6c30: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
6c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c70: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 --------. */.int
6c80: 0a 44 69 67 65 73 74 44 61 74 61 48 61 6e 64 6c .DigestDataHandl
6c90: 65 72 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 er(Tcl_Interp *i
6ca0: 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a nterp, Tcl_Obj *
6cb0: 64 61 74 61 4f 62 6a 2c 20 63 6f 6e 73 74 20 45 dataObj, const E
6cc0: 56 50 5f 4d 44 20 2a 6d 64 2c 0a 09 63 6f 6e 73 VP_MD *md,..cons
6cd0: 74 20 45 56 50 5f 43 49 50 48 45 52 20 2a 63 69 t EVP_CIPHER *ci
6ce0: 70 68 65 72 2c 20 69 6e 74 20 66 6f 72 6d 61 74 pher, int format
6cf0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4f 62 , Tcl_Obj *keyOb
6d00: 6a 2c 20 45 56 50 5f 4d 41 43 20 2a 6d 61 63 29 j, EVP_MAC *mac)
6d10: 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 64 61 74 {. char *dat
6d20: 61 3b 0a 20 20 20 20 69 6e 74 20 64 61 74 61 5f a;. int data_
6d30: 6c 65 6e 3b 0a 20 20 20 20 44 69 67 65 73 74 53 len;. DigestS
6d40: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a tate *statePtr;.
6d50: 0a 20 20 20 20 2f 2a 20 47 65 74 20 64 61 74 61 . /* Get data
6d60: 20 2a 2f 0a 20 20 20 20 64 61 74 61 20 3d 20 54 */. data = T
6d70: 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 cl_GetByteArrayF
6d80: 72 6f 6d 4f 62 6a 28 64 61 74 61 4f 62 6a 2c 20 romObj(dataObj,
6d90: 26 64 61 74 61 5f 6c 65 6e 29 3b 0a 20 20 20 20 &data_len);.
6da0: 69 66 20 28 64 61 74 61 20 3d 3d 20 4e 55 4c 4c if (data == NULL
6db0: 29 20 7b 0a 09 54 63 6c 5f 53 65 74 52 65 73 75 ) {..Tcl_SetResu
6dc0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20 64 lt(interp, "No d
6dd0: 61 74 61 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 ata", NULL);..re
6de0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
6df0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 }.. /* Cr
6e00: 65 61 74 65 20 73 74 61 74 65 20 64 61 74 61 20 eate state data
6e10: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 structure */.
6e20: 20 69 66 20 28 28 73 74 61 74 65 50 74 72 20 3d if ((statePtr =
6e30: 20 44 69 67 65 73 74 53 74 61 74 65 4e 65 77 28 DigestStateNew(
6e40: 69 6e 74 65 72 70 2c 20 66 6f 72 6d 61 74 29 29 interp, format))
6e50: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c == NULL) {..Tcl
6e60: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
6e70: 74 65 72 70 2c 20 22 4d 65 6d 6f 72 79 20 61 6c terp, "Memory al
6e80: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 22 2c location error",
6e90: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
6ea0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
6eb0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
6ec0: 2a 20 43 61 6c 63 20 44 69 67 65 73 74 2c 20 61 * Calc Digest, a
6ed0: 62 6f 72 74 20 66 6f 72 20 65 72 72 6f 72 20 2a bort for error *
6ee0: 2f 0a 20 20 20 20 69 66 20 28 44 69 67 65 73 74 /. if (Digest
6ef0: 49 6e 69 74 69 61 6c 69 7a 65 28 69 6e 74 65 72 Initialize(inter
6f00: 70 2c 20 73 74 61 74 65 50 74 72 2c 20 6d 64 2c p, statePtr, md,
6f10: 20 63 69 70 68 65 72 2c 20 6b 65 79 4f 62 6a 2c cipher, keyObj,
6f20: 20 6d 61 63 29 20 21 3d 20 54 43 4c 5f 4f 4b 20 mac) != TCL_OK
6f30: 7c 7c 0a 09 44 69 67 65 73 74 55 70 64 61 74 65 ||..DigestUpdate
6f40: 28 73 74 61 74 65 50 74 72 2c 20 64 61 74 61 2c (statePtr, data,
6f50: 20 28 73 69 7a 65 5f 74 29 20 64 61 74 61 5f 6c (size_t) data_l
6f60: 65 6e 2c 20 31 29 20 3d 3d 20 30 20 7c 7c 0a 09 en, 1) == 0 ||..
6f70: 44 69 67 65 73 74 46 69 6e 61 6c 69 7a 65 28 69 DigestFinalize(i
6f80: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c nterp, statePtr,
6f90: 20 4e 55 4c 4c 29 20 21 3d 20 54 43 4c 5f 4f 4b NULL) != TCL_OK
6fa0: 29 20 7b 0a 09 44 69 67 65 73 74 53 74 61 74 65 ) {..DigestState
6fb0: 46 72 65 65 28 73 74 61 74 65 50 74 72 29 3b 0a Free(statePtr);.
6fc0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
6fd0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
6fe0: 20 43 6c 65 61 6e 2d 75 70 20 2a 2f 0a 20 20 20 Clean-up */.
6ff0: 20 44 69 67 65 73 74 53 74 61 74 65 46 72 65 65 DigestStateFree
7000: 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 (statePtr);.
7010: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d return TCL_OK;.}
7020: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ../*************
7030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
7040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
7050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
7060: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d ******/../*. *--
7070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
70a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
70b0: 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 46 69 -. *. * DigestFi
70c0: 6c 65 48 61 6e 64 6c 65 72 20 2d 2d 0a 20 2a 0a leHandler --. *.
70d0: 20 2a 09 52 65 74 75 72 6e 20 6d 65 73 73 61 67 *.Return messag
70e0: 65 20 64 69 67 65 73 74 20 66 6f 72 20 66 69 6c e digest for fil
70f0: 65 20 75 73 69 6e 67 20 75 73 65 72 20 73 70 65 e using user spe
7100: 63 69 66 69 65 64 20 68 61 73 68 20 66 75 6e 63 cified hash func
7110: 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 tion.. *. * Retu
7120: 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f rns:. *.TCL_OK o
7130: 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 r TCL_ERROR. *.
7140: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
7150: 20 2a 09 52 65 73 75 6c 74 20 69 73 20 6d 65 73 *.Result is mes
7160: 73 61 67 65 20 64 69 67 65 73 74 20 6f 72 20 65 sage digest or e
7170: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a rror message. *.
7180: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
7190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
71a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
71b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
71c0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 -----. */.int Di
71d0: 67 65 73 74 46 69 6c 65 48 61 6e 64 6c 65 72 28 gestFileHandler(
71e0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
71f0: 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 66 69 6c rp, Tcl_Obj *fil
7200: 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 45 56 50 ename, const EVP
7210: 5f 4d 44 20 2a 6d 64 2c 0a 09 63 6f 6e 73 74 20 _MD *md,..const
7220: 45 56 50 5f 43 49 50 48 45 52 20 2a 63 69 70 68 EVP_CIPHER *ciph
7230: 65 72 2c 20 69 6e 74 20 66 6f 72 6d 61 74 2c 20 er, int format,
7240: 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4f 62 6a 2c Tcl_Obj *keyObj,
7250: 20 45 56 50 5f 4d 41 43 20 2a 6d 61 63 29 20 7b EVP_MAC *mac) {
7260: 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65 . DigestState
7270: 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 20 20 20 *statePtr;.
7280: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e Tcl_Channel chan
7290: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e 73 = NULL;. uns
72a0: 69 67 6e 65 64 20 63 68 61 72 20 62 75 66 5b 42 igned char buf[B
72b0: 55 46 46 45 52 5f 53 49 5a 45 5d 3b 0a 20 20 20 UFFER_SIZE];.
72c0: 20 69 6e 74 20 72 65 73 20 3d 20 54 43 4c 5f 4f int res = TCL_O
72d0: 4b 2c 20 6c 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 K, len;.. /*
72e0: 43 72 65 61 74 65 20 73 74 61 74 65 20 64 61 74 Create state dat
72f0: 61 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 a structure */.
7300: 20 20 20 69 66 20 28 28 73 74 61 74 65 50 74 72 if ((statePtr
7310: 20 3d 20 44 69 67 65 73 74 53 74 61 74 65 4e 65 = DigestStateNe
7320: 77 28 69 6e 74 65 72 70 2c 20 66 6f 72 6d 61 74 w(interp, format
7330: 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 )) == NULL) {..T
7340: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
7350: 69 6e 74 65 72 70 2c 20 22 4d 65 6d 6f 72 79 20 interp, "Memory
7360: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 allocation error
7370: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
7380: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
7390: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
73a0: 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 63 68 /* Open file ch
73b0: 61 6e 6e 65 6c 2c 20 61 62 6f 72 74 20 66 6f 72 annel, abort for
73c0: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 63 68 error */. ch
73d0: 61 6e 20 3d 20 54 63 6c 5f 46 53 4f 70 65 6e 46 an = Tcl_FSOpenF
73e0: 69 6c 65 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 ileChannel(inter
73f0: 70 2c 20 66 69 6c 65 6e 61 6d 65 2c 20 22 72 62 p, filename, "rb
7400: 22 2c 20 30 34 34 34 29 3b 0a 20 20 20 20 69 66 ", 0444);. if
7410: 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 (chan == (Tcl_C
7420: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a hannel) NULL) {.
7430: 09 44 69 67 65 73 74 53 74 61 74 65 46 72 65 65 .DigestStateFree
7440: 28 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 (statePtr);..ret
7450: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
7460: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e }.. /* Con
7470: 66 69 67 75 72 65 20 63 68 61 6e 6e 65 6c 20 2a figure channel *
7480: 2f 0a 20 20 20 20 69 66 20 28 28 72 65 73 20 3d /. if ((res =
7490: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f Tcl_SetChannelO
74a0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 ption(interp, ch
74b0: 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f an, "-translatio
74c0: 6e 22 2c 20 22 62 69 6e 61 72 79 22 29 29 20 3d n", "binary")) =
74d0: 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 = TCL_ERROR) {..
74e0: 67 6f 74 6f 20 64 6f 6e 65 3b 0a 20 20 20 20 7d goto done;. }
74f0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e . Tcl_SetChan
7500: 6e 65 6c 42 75 66 66 65 72 53 69 7a 65 28 63 68 nelBufferSize(ch
7510: 61 6e 2c 20 42 55 46 46 45 52 5f 53 49 5a 45 29 an, BUFFER_SIZE)
7520: 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 ;.. /* Initia
7530: 6c 69 7a 65 20 68 61 73 68 20 66 75 6e 63 74 69 lize hash functi
7540: 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 72 on */. if ((r
7550: 65 73 20 3d 20 44 69 67 65 73 74 49 6e 69 74 69 es = DigestIniti
7560: 61 6c 69 7a 65 28 69 6e 74 65 72 70 2c 20 73 74 alize(interp, st
7570: 61 74 65 50 74 72 2c 20 6d 64 2c 20 63 69 70 68 atePtr, md, ciph
7580: 65 72 2c 20 6b 65 79 4f 62 6a 2c 20 6d 61 63 29 er, keyObj, mac)
7590: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
75a0: 67 6f 74 6f 20 64 6f 6e 65 3b 0a 20 20 20 20 7d goto done;. }
75b0: 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 66 69 .. /* Read fi
75c0: 6c 65 20 64 61 74 61 20 61 6e 64 20 75 70 64 61 le data and upda
75d0: 74 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e te hash function
75e0: 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 20 28 21 */. while (!
75f0: 54 63 6c 5f 45 6f 66 28 63 68 61 6e 29 29 20 7b Tcl_Eof(chan)) {
7600: 0a 09 6c 65 6e 20 3d 20 54 63 6c 5f 52 65 61 64 ..len = Tcl_Read
7610: 52 61 77 28 63 68 61 6e 2c 20 28 63 68 61 72 20 Raw(chan, (char
7620: 2a 29 20 62 75 66 2c 20 42 55 46 46 45 52 5f 53 *) buf, BUFFER_S
7630: 49 5a 45 29 3b 0a 09 69 66 20 28 6c 65 6e 20 3e IZE);..if (len >
7640: 20 30 29 20 7b 0a 09 20 20 20 20 69 66 20 28 21 0) {.. if (!
7650: 44 69 67 65 73 74 55 70 64 61 74 65 28 73 74 61 DigestUpdate(sta
7660: 74 65 50 74 72 2c 20 26 62 75 66 5b 30 5d 2c 20 tePtr, &buf[0],
7670: 28 73 69 7a 65 5f 74 29 20 6c 65 6e 2c 20 31 29 (size_t) len, 1)
7680: 29 20 7b 0a 09 09 72 65 73 20 3d 20 54 43 4c 5f ) {...res = TCL_
7690: 45 52 52 4f 52 3b 0a 09 09 67 6f 74 6f 20 64 6f ERROR;...goto do
76a0: 6e 65 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 ne;.. }..}.
76b0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 }.. /* Fina
76c0: 6c 69 7a 65 20 68 61 73 68 20 66 75 6e 63 74 69 lize hash functi
76d0: 6f 6e 20 61 6e 64 20 63 61 6c 63 75 6c 61 74 65 on and calculate
76e0: 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20 message digest
76f0: 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 44 69 67 */. res = Dig
7700: 65 73 74 46 69 6e 61 6c 69 7a 65 28 69 6e 74 65 estFinalize(inte
7710: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 4e 55 rp, statePtr, NU
7720: 4c 4c 29 3b 0a 0a 64 6f 6e 65 3a 0a 20 20 20 20 LL);..done:.
7730: 2f 2a 20 43 6c 6f 73 65 20 63 68 61 6e 6e 65 6c /* Close channel
7740: 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f */. if (Tcl_
7750: 43 6c 6f 73 65 28 69 6e 74 65 72 70 2c 20 63 68 Close(interp, ch
7760: 61 6e 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 an) == TCL_ERROR
7770: 29 20 7b 0a 09 72 65 73 20 3d 20 54 43 4c 5f 45 ) {..res = TCL_E
7780: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
7790: 20 2f 2a 20 43 6c 65 61 6e 2d 75 70 20 2a 2f 0a /* Clean-up */.
77a0: 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65 46 DigestStateF
77b0: 72 65 65 28 73 74 61 74 65 50 74 72 29 3b 0a 20 ree(statePtr);.
77c0: 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d return res;.}
77d0: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ../*************
77e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
77f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
7800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
7810: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d ******/../*. *--
7820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7860: 2d 0a 20 2a 0a 20 2a 20 47 65 74 44 69 67 65 73 -. *. * GetDiges
7870: 74 20 2d 2d 20 47 65 74 20 6d 65 73 73 61 67 65 t -- Get message
7880: 20 64 69 67 65 73 74 0a 20 2a 0a 20 2a 20 52 65 digest. *. * Re
7890: 74 75 72 6e 73 3a 0a 20 2a 09 45 56 50 5f 4d 44 turns:. *.EVP_MD
78a0: 20 2a 20 6f 72 20 4e 55 4c 4c 0a 20 2a 0a 20 2a * or NULL. *. *
78b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
78c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
78d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
78e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
78f0: 2d 2d 2d 0a 20 2a 2f 0a 45 56 50 5f 4d 44 20 2a ---. */.EVP_MD *
7900: 47 65 74 44 69 67 65 73 74 28 54 63 6c 5f 49 6e GetDigest(Tcl_In
7910: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 63 terp *interp, Tc
7920: 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c 20 69 l_Obj *objPtr, i
7930: 6e 74 20 2a 66 6f 72 6d 61 74 29 20 7b 0a 20 20 nt *format) {.
7940: 20 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a const EVP_MD *
7950: 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 md = NULL;. c
7960: 68 61 72 20 2a 64 69 67 65 73 74 4e 61 6d 65 20 har *digestName
7970: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 = Tcl_GetStringF
7980: 72 6f 6d 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 4e romObj(objPtr, N
7990: 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 64 ULL);.. if (d
79a0: 69 67 65 73 74 4e 61 6d 65 20 21 3d 20 4e 55 4c igestName != NUL
79b0: 4c 29 20 7b 0a 09 6d 64 20 3d 20 45 56 50 5f 67 L) {..md = EVP_g
79c0: 65 74 5f 64 69 67 65 73 74 62 79 6e 61 6d 65 28 et_digestbyname(
79d0: 64 69 67 65 73 74 4e 61 6d 65 29 3b 0a 09 69 66 digestName);..if
79e0: 20 28 6d 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a (md == NULL) {.
79f0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
7a00: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 49 esult(interp, "I
7a10: 6e 76 61 6c 69 64 20 64 69 67 65 73 74 20 5c 22 nvalid digest \"
7a20: 22 2c 20 64 69 67 65 73 74 4e 61 6d 65 2c 20 22 ", digestName, "
7a30: 5c 22 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 \"", NULL);..
7a40: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d return NULL;..}
7a50: 20 65 6c 73 65 20 69 66 20 28 6d 64 20 3d 3d 20 else if (md ==
7a60: 45 56 50 5f 73 68 61 6b 65 31 32 38 28 29 20 7c EVP_shake128() |
7a70: 7c 20 6d 64 20 3d 3d 20 45 56 50 5f 73 68 61 6b | md == EVP_shak
7a80: 65 32 35 36 28 29 29 20 7b 0a 09 20 20 20 20 2a e256()) {.. *
7a90: 66 6f 72 6d 61 74 20 7c 3d 20 49 53 5f 58 4f 46 format |= IS_XOF
7aa0: 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 ;..}. } else
7ab0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
7ac0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20 ult(interp, "No
7ad0: 64 69 67 65 73 74 20 73 70 65 63 69 66 69 65 64 digest specified
7ae0: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 ", NULL);..retur
7af0: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 n NULL;. }.
7b00: 20 20 72 65 74 75 72 6e 20 6d 64 3b 0a 7d 0a 0a return md;.}..
7b10: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
7b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7b50: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 47 --------. *. * G
7b60: 65 74 43 69 70 68 65 72 20 2d 2d 20 47 65 74 20 etCipher -- Get
7b70: 63 69 70 68 65 72 0a 20 2a 0a 20 2a 20 52 65 74 cipher. *. * Ret
7b80: 75 72 6e 73 3a 0a 20 2a 09 45 56 50 5f 43 49 50 urns:. *.EVP_CIP
7b90: 48 45 52 20 2a 20 6f 72 20 4e 55 4c 4c 0a 20 2a HER * or NULL. *
7ba0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
7bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7be0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 45 56 50 5f 43 ------. */.EVP_C
7bf0: 49 50 48 45 52 20 2a 47 65 74 43 69 70 68 65 72 IPHER *GetCipher
7c00: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 (Tcl_Interp *int
7c10: 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 erp, Tcl_Obj *ob
7c20: 6a 50 74 72 2c 20 69 6e 74 20 2a 74 79 70 65 29 jPtr, int *type)
7c30: 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 45 56 50 {. const EVP
7c40: 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 20 _CIPHER *cipher
7c50: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 = NULL;. char
7c60: 20 2a 63 69 70 68 65 72 4e 61 6d 65 20 3d 20 54 *cipherName = T
7c70: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
7c80: 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 4e 55 4c 4c Obj(objPtr, NULL
7c90: 29 3b 0a 0a 20 20 20 20 69 66 20 28 63 69 70 68 );.. if (ciph
7ca0: 65 72 4e 61 6d 65 20 21 3d 20 4e 55 4c 4c 29 20 erName != NULL)
7cb0: 7b 0a 09 63 69 70 68 65 72 20 3d 20 45 56 50 5f {..cipher = EVP_
7cc0: 67 65 74 5f 63 69 70 68 65 72 62 79 6e 61 6d 65 get_cipherbyname
7cd0: 28 63 69 70 68 65 72 4e 61 6d 65 29 3b 0a 09 2a (cipherName);..*
7ce0: 74 79 70 65 20 3d 20 54 59 50 45 5f 43 4d 41 43 type = TYPE_CMAC
7cf0: 3b 0a 09 69 66 20 28 63 69 70 68 65 72 20 3d 3d ;..if (cipher ==
7d00: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 NULL) {.. Tc
7d10: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
7d20: 6e 74 65 72 70 2c 20 22 49 6e 76 61 6c 69 64 20 nterp, "Invalid
7d30: 63 69 70 68 65 72 20 5c 22 22 2c 20 63 69 70 68 cipher \"", ciph
7d40: 65 72 4e 61 6d 65 2c 20 22 5c 22 22 2c 20 4e 55 erName, "\"", NU
7d50: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e LL);.. return
7d60: 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 NULL;..}. }
7d70: 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 41 70 70 65 else {..Tcl_Appe
7d80: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
7d90: 20 22 4e 6f 20 63 69 70 68 65 72 20 73 70 65 63 "No cipher spec
7da0: 69 66 69 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 ified", NULL);..
7db0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
7dc0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 63 69 }. return ci
7dd0: 70 68 65 72 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d pher;.}../*. *--
7de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e20: 2d 0a 20 2a 0a 20 2a 20 47 65 74 4b 65 79 20 2d -. *. * GetKey -
7e30: 2d 20 47 65 74 20 6b 65 79 0a 20 2a 0a 20 2a 20 - Get key. *. *
7e40: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 75 6e 73 69 Returns:. *.unsi
7e50: 67 6e 65 64 20 63 68 61 72 20 2a 20 6f 72 20 4e gned char * or N
7e60: 55 4c 4c 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ULL. *. *-------
7e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
7eb0: 0a 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a .unsigned char *
7ec0: 47 65 74 4b 65 79 28 54 63 6c 5f 49 6e 74 65 72 GetKey(Tcl_Inter
7ed0: 70 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f p *interp, Tcl_O
7ee0: 62 6a 20 2a 6f 62 6a 50 74 72 2c 20 69 6e 74 20 bj *objPtr, int
7ef0: 2a 74 79 70 65 29 20 7b 0a 20 20 20 20 75 6e 73 *type) {. uns
7f00: 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 20 igned char *key
7f10: 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 = Tcl_GetByteArr
7f20: 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 50 74 72 ayFromObj(objPtr
7f30: 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 , NULL);.. if
7f40: 20 28 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b (key == NULL) {
7f50: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
7f60: 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20 6b lt(interp, "No k
7f70: 65 79 20 73 70 65 63 69 66 69 65 64 22 2c 20 4e ey specified", N
7f80: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 ULL);..return NU
7f90: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 LL;. }. if
7fa0: 20 28 2a 74 79 70 65 20 3d 3d 20 54 59 50 45 5f (*type == TYPE_
7fb0: 4d 44 29 20 7b 0a 09 2a 74 79 70 65 20 3d 20 54 MD) {..*type = T
7fc0: 59 50 45 5f 48 4d 41 43 3b 0a 20 20 20 20 7d 0a YPE_HMAC;. }.
7fd0: 20 20 20 20 72 65 74 75 72 6e 20 6b 65 79 3b 0a return key;.
7fe0: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d }../*. *--------
7ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
8030: 2a 20 47 65 74 4d 41 43 20 2d 2d 20 47 65 74 20 * GetMAC -- Get
8040: 4d 41 43 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e MAC. *. * Return
8050: 73 3a 0a 20 2a 09 45 56 50 5f 4d 41 43 20 2a 20 s:. *.EVP_MAC *
8060: 6f 72 20 4e 55 4c 4c 0a 20 2a 0a 20 2a 2d 2d 2d or NULL. *. *---
8070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
80a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
80b0: 0a 20 2a 2f 0a 45 56 50 5f 4d 41 43 20 2a 47 65 . */.EVP_MAC *Ge
80c0: 74 4d 41 43 28 54 63 6c 5f 49 6e 74 65 72 70 20 tMAC(Tcl_Interp
80d0: 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a *interp, Tcl_Obj
80e0: 20 2a 6f 62 6a 50 74 72 2c 20 69 6e 74 20 2a 74 *objPtr, int *t
80f0: 79 70 65 29 20 7b 0a 20 20 20 20 45 56 50 5f 4d ype) {. EVP_M
8100: 41 43 20 2a 6d 61 63 20 3d 20 4e 55 4c 4c 3b 0a AC *mac = NULL;.
8110: 20 20 20 20 63 68 61 72 20 2a 6d 61 63 4e 61 6d char *macNam
8120: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e e = Tcl_GetStrin
8130: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 50 74 72 2c gFromObj(objPtr,
8140: 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 NULL);.. if
8150: 28 6d 61 63 4e 61 6d 65 20 21 3d 20 4e 55 4c 4c (macName != NULL
8160: 29 20 7b 0a 09 69 66 20 28 73 74 72 63 6d 70 28 ) {..if (strcmp(
8170: 6d 61 63 4e 61 6d 65 2c 20 22 63 6d 61 63 22 29 macName, "cmac")
8180: 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20 2a 74 == 0) {.. *t
8190: 79 70 65 20 3d 20 54 59 50 45 5f 43 4d 41 43 3b ype = TYPE_CMAC;
81a0: 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 ..} else if (str
81b0: 63 6d 70 28 6d 61 63 4e 61 6d 65 2c 20 22 68 6d cmp(macName, "hm
81c0: 61 63 22 29 20 3d 3d 20 30 29 20 7b 0a 09 20 20 ac") == 0) {..
81d0: 20 20 2a 74 79 70 65 20 3d 20 54 59 50 45 5f 48 *type = TYPE_H
81e0: 4d 41 43 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 MAC;..} else {..
81f0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
8200: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 49 6e sult(interp, "In
8210: 76 61 6c 69 64 20 4d 41 43 20 5c 22 22 2c 20 6d valid MAC \"", m
8220: 61 63 4e 61 6d 65 2c 20 22 5c 22 22 2c 20 4e 55 acName, "\"", NU
8230: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e LL);.. return
8240: 20 4e 55 4c 4c 3b 0a 09 7d 0a 09 6d 61 63 20 3d NULL;..}..mac =
8250: 20 28 76 6f 69 64 20 2a 29 20 6d 61 63 4e 61 6d (void *) macNam
8260: 65 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a e;. } else {.
8270: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
8280: 74 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20 4d 41 t(interp, "No MA
8290: 43 20 73 70 65 63 69 66 69 65 64 22 2c 20 4e 55 C specified", NU
82a0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c LL);..return NUL
82b0: 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 L;. }. ret
82c0: 75 72 6e 20 6d 61 63 3b 0a 7d 0a 0a 2f 2a 2a 2a urn mac;.}../***
82d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
82e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
82f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
8300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
8310: 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d /../*. *--------
8320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
8360: 2a 20 44 69 67 65 73 74 4d 61 69 6e 20 2d 2d 0a * DigestMain --.
8370: 20 2a 0a 20 2a 09 52 65 74 75 72 6e 20 6d 65 73 *. *.Return mes
8380: 73 61 67 65 20 64 69 67 65 73 74 20 6f 72 20 4d sage digest or M
8390: 65 73 73 61 67 65 20 41 75 74 68 65 6e 74 69 63 essage Authentic
83a0: 61 74 69 6f 6e 20 43 6f 64 65 20 28 4d 41 43 29 ation Code (MAC)
83b0: 20 6f 66 0a 20 2a 09 64 61 74 61 20 75 73 69 6e of. *.data usin
83c0: 67 20 75 73 65 72 20 73 70 65 63 69 66 69 65 64 g user specified
83d0: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 0a hash function..
83e0: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 *. * Returns:.
83f0: 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f *.TCL_OK or TCL_
8400: 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 ERROR. *. * Side
8410: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 effects:. *.Set
8420: 73 20 72 65 73 75 6c 74 20 74 6f 20 6d 65 73 73 s result to mess
8430: 61 67 65 20 64 69 67 65 73 74 20 6f 72 20 65 72 age digest or er
8440: 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 ror message. *.
8450: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
8460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8490: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
84a0: 69 6e 74 20 44 69 67 65 73 74 4d 61 69 6e 28 69 int DigestMain(i
84b0: 6e 74 20 74 79 70 65 2c 20 54 63 6c 5f 49 6e 74 nt type, Tcl_Int
84c0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
84d0: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
84e0: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a const objv[]) {.
84f0: 20 20 20 20 69 6e 74 20 69 64 78 2c 20 73 74 61 int idx, sta
8500: 72 74 20 3d 20 31 2c 20 66 6f 72 6d 61 74 20 3d rt = 1, format =
8510: 20 48 45 58 5f 46 4f 52 4d 41 54 2c 20 72 65 73 HEX_FORMAT, res
8520: 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 54 = TCL_OK;. T
8530: 63 6c 5f 4f 62 6a 20 2a 63 69 70 68 65 72 4f 62 cl_Obj *cipherOb
8540: 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 63 6d 64 4f 62 j = NULL, *cmdOb
8550: 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 64 61 74 61 4f j = NULL, *dataO
8560: 62 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 64 69 67 65 bj = NULL, *dige
8570: 73 74 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 stObj = NULL;.
8580: 20 20 54 63 6c 5f 4f 62 6a 20 2a 66 69 6c 65 4f Tcl_Obj *fileO
8590: 62 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 6b 65 79 4f bj = NULL, *keyO
85a0: 62 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 6d 61 63 4f bj = NULL, *macO
85b0: 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 bj = NULL;. c
85c0: 6f 6e 73 74 20 63 68 61 72 20 2a 63 68 61 6e 6e onst char *chann
85d0: 65 6c 20 3d 20 4e 55 4c 4c 2c 20 2a 6f 70 74 3b el = NULL, *opt;
85e0: 0a 20 20 20 20 63 6f 6e 73 74 20 45 56 50 5f 4d . const EVP_M
85f0: 44 20 2a 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 D *md = NULL;.
8600: 20 20 63 6f 6e 73 74 20 45 56 50 5f 43 49 50 48 const EVP_CIPH
8610: 45 52 20 2a 63 69 70 68 65 72 20 3d 20 4e 55 4c ER *cipher = NUL
8620: 4c 3b 0a 20 20 20 20 45 56 50 5f 4d 41 43 20 2a L;. EVP_MAC *
8630: 6d 61 63 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 mac = NULL;..
8640: 20 2f 2a 20 43 6c 65 61 72 20 69 6e 74 65 72 70 /* Clear interp
8650: 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 54 result */. T
8660: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 cl_ResetResult(i
8670: 6e 74 65 72 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 nterp);.. /*
8680: 56 61 6c 69 64 61 74 65 20 61 72 67 20 63 6f 75 Validate arg cou
8690: 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 nt */. if (ob
86a0: 6a 63 20 3c 20 33 20 7c 7c 20 6f 62 6a 63 20 3e jc < 3 || objc >
86b0: 20 31 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 12) {..Tcl_Wron
86c0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
86d0: 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 62 69 6e 1, objv, "?-bin
86e0: 7c 2d 68 65 78 3f 20 3f 2d 63 69 70 68 65 72 20 |-hex? ?-cipher
86f0: 6e 61 6d 65 3f 20 3f 2d 64 69 67 65 73 74 20 6e name? ?-digest n
8700: 61 6d 65 3f 20 3f 2d 6b 65 79 20 6b 65 79 3f 20 ame? ?-key key?
8710: 3f 2d 6d 61 63 20 6e 61 6d 65 3f 20 5b 2d 63 68 ?-mac name? [-ch
8720: 61 6e 6e 65 6c 20 63 68 61 6e 20 7c 20 2d 63 6f annel chan | -co
8730: 6d 6d 61 6e 64 20 63 6d 64 4e 61 6d 65 20 7c 20 mmand cmdName |
8740: 2d 66 69 6c 65 20 66 69 6c 65 6e 61 6d 65 20 7c -file filename |
8750: 20 3f 2d 64 61 74 61 3f 20 64 61 74 61 5d 22 29 ?-data? data]")
8760: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
8770: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
8780: 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 20 /* Special case
8790: 6f 66 20 66 69 72 73 74 20 61 72 67 20 69 73 20 of first arg is
87a0: 64 69 67 65 73 74 2c 20 63 69 70 68 65 72 2c 20 digest, cipher,
87b0: 6f 72 20 6d 61 63 20 2a 2f 0a 20 20 20 20 6f 70 or mac */. op
87c0: 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e t = Tcl_GetStrin
87d0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 73 74 gFromObj(objv[st
87e0: 61 72 74 5d 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 art], NULL);.
87f0: 20 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27 if (opt[0] != '
8800: 2d 27 29 20 7b 0a 09 69 66 20 28 74 79 70 65 20 -') {..if (type
8810: 3d 3d 20 54 59 50 45 5f 4d 44 20 7c 7c 20 74 79 == TYPE_MD || ty
8820: 70 65 20 3d 3d 20 54 59 50 45 5f 48 4d 41 43 29 pe == TYPE_HMAC)
8830: 20 7b 0a 09 20 20 20 20 64 69 67 65 73 74 4f 62 {.. digestOb
8840: 6a 20 3d 20 6f 62 6a 76 5b 73 74 61 72 74 5d 3b j = objv[start];
8850: 0a 09 20 20 20 20 73 74 61 72 74 2b 2b 3b 0a 09 .. start++;..
8860: 7d 20 65 6c 73 65 20 69 66 20 28 74 79 70 65 20 } else if (type
8870: 3d 3d 20 54 59 50 45 5f 43 4d 41 43 29 20 7b 0a == TYPE_CMAC) {.
8880: 09 20 20 20 20 63 69 70 68 65 72 4f 62 6a 20 3d . cipherObj =
8890: 20 6f 62 6a 76 5b 73 74 61 72 74 5d 3b 0a 09 20 objv[start];..
88a0: 20 20 20 73 74 61 72 74 2b 2b 3b 0a 09 7d 20 65 start++;..} e
88b0: 6c 73 65 20 69 66 20 28 74 79 70 65 20 3d 3d 20 lse if (type ==
88c0: 54 59 50 45 5f 4d 41 43 29 20 7b 0a 09 20 20 20 TYPE_MAC) {..
88d0: 20 6d 61 63 4f 62 6a 20 3d 20 6f 62 6a 76 5b 73 macObj = objv[s
88e0: 74 61 72 74 5d 3b 0a 09 20 20 20 20 73 74 61 72 tart];.. star
88f0: 74 2b 2b 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 t++;..}. }..
8900: 20 20 20 2f 2a 20 47 65 74 20 6f 70 74 69 6f 6e /* Get option
8910: 73 20 2a 2f 0a 20 20 20 20 66 6f 72 20 28 69 64 s */. for (id
8920: 78 20 3d 20 73 74 61 72 74 3b 20 69 64 78 20 3c x = start; idx <
8930: 20 6f 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a objc; idx++) {.
8940: 09 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 .opt = Tcl_GetSt
8950: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 ringFromObj(objv
8960: 5b 69 64 78 5d 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 [idx], NULL);...
8970: 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d if (opt[0] != '-
8980: 27 29 20 7b 0a 09 20 20 20 20 62 72 65 61 6b 3b ') {.. break;
8990: 0a 09 7d 0a 0a 09 4f 50 54 46 4c 41 47 28 22 2d ..}...OPTFLAG("-
89a0: 62 69 6e 22 2c 20 66 6f 72 6d 61 74 2c 20 42 49 bin", format, BI
89b0: 4e 5f 46 4f 52 4d 41 54 29 3b 0a 09 4f 50 54 46 N_FORMAT);..OPTF
89c0: 4c 41 47 28 22 2d 62 69 6e 61 72 79 22 2c 20 66 LAG("-binary", f
89d0: 6f 72 6d 61 74 2c 20 42 49 4e 5f 46 4f 52 4d 41 ormat, BIN_FORMA
89e0: 54 29 3b 0a 09 4f 50 54 46 4c 41 47 28 22 2d 68 T);..OPTFLAG("-h
89f0: 65 78 22 2c 20 66 6f 72 6d 61 74 2c 20 48 45 58 ex", format, HEX
8a00: 5f 46 4f 52 4d 41 54 29 3b 0a 09 4f 50 54 46 4c _FORMAT);..OPTFL
8a10: 41 47 28 22 2d 68 65 78 61 64 65 63 69 6d 61 6c AG("-hexadecimal
8a20: 22 2c 20 66 6f 72 6d 61 74 2c 20 48 45 58 5f 46 ", format, HEX_F
8a30: 4f 52 4d 41 54 29 3b 0a 09 4f 50 54 53 54 52 28 ORMAT);..OPTSTR(
8a40: 22 2d 63 68 61 6e 22 2c 20 63 68 61 6e 6e 65 6c "-chan", channel
8a50: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 68 61 );..OPTSTR("-cha
8a60: 6e 6e 65 6c 22 2c 20 63 68 61 6e 6e 65 6c 29 3b nnel", channel);
8a70: 0a 09 4f 50 54 4f 42 4a 28 22 2d 63 69 70 68 65 ..OPTOBJ("-ciphe
8a80: 72 22 2c 20 63 69 70 68 65 72 4f 62 6a 29 3b 0a r", cipherObj);.
8a90: 09 4f 50 54 4f 42 4a 28 22 2d 63 6f 6d 6d 61 6e .OPTOBJ("-comman
8aa0: 64 22 2c 20 63 6d 64 4f 62 6a 29 3b 0a 09 4f 50 d", cmdObj);..OP
8ab0: 54 4f 42 4a 28 22 2d 64 61 74 61 22 2c 20 64 61 TOBJ("-data", da
8ac0: 74 61 4f 62 6a 29 3b 0a 09 4f 50 54 4f 42 4a 28 taObj);..OPTOBJ(
8ad0: 22 2d 64 69 67 65 73 74 22 2c 20 64 69 67 65 73 "-digest", diges
8ae0: 74 4f 62 6a 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 tObj);..OPTOBJ("
8af0: 2d 66 69 6c 65 22 2c 20 66 69 6c 65 4f 62 6a 29 -file", fileObj)
8b00: 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 66 69 6c 65 ;..OPTOBJ("-file
8b10: 6e 61 6d 65 22 2c 20 66 69 6c 65 4f 62 6a 29 3b name", fileObj);
8b20: 0a 09 4f 50 54 4f 42 4a 28 22 2d 6b 65 79 22 2c ..OPTOBJ("-key",
8b30: 20 6b 65 79 4f 62 6a 29 3b 0a 09 4f 50 54 4f 42 keyObj);..OPTOB
8b40: 4a 28 22 2d 6d 61 63 22 2c 20 6d 61 63 4f 62 6a J("-mac", macObj
8b50: 29 3b 0a 0a 09 4f 50 54 42 41 44 28 22 6f 70 74 );...OPTBAD("opt
8b60: 69 6f 6e 22 2c 20 22 2d 62 69 6e 2c 20 2d 63 68 ion", "-bin, -ch
8b70: 61 6e 6e 65 6c 2c 20 2d 63 69 70 68 65 72 2c 20 annel, -cipher,
8b80: 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 61 74 61 2c -command, -data,
8b90: 20 2d 64 69 67 65 73 74 2c 20 2d 66 69 6c 65 2c -digest, -file,
8ba0: 20 2d 66 69 6c 65 6e 61 6d 65 2c 20 2d 68 65 78 -filename, -hex
8bb0: 2c 20 2d 6b 65 79 2c 20 6f 72 20 2d 6d 61 63 22 , -key, or -mac"
8bc0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
8bd0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
8be0: 20 2f 2a 20 49 66 20 6f 6e 6c 79 20 31 20 61 72 /* If only 1 ar
8bf0: 67 20 6c 65 66 74 2c 20 69 74 27 73 20 74 68 65 g left, it's the
8c00: 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 69 66 20 data */. if
8c10: 28 69 64 78 20 3c 20 6f 62 6a 63 20 26 26 20 64 (idx < objc && d
8c20: 61 74 61 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 ataObj == NULL)
8c30: 7b 0a 09 64 61 74 61 4f 62 6a 20 3d 20 6f 62 6a {..dataObj = obj
8c40: 76 5b 69 64 78 5d 3b 0a 20 20 20 20 7d 0a 0a 20 v[idx];. }..
8c50: 20 20 20 2f 2a 20 47 65 74 20 63 69 70 68 65 72 /* Get cipher
8c60: 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 69 70 68 */. if (ciph
8c70: 65 72 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b erObj != NULL) {
8c80: 0a 09 69 66 20 28 28 63 69 70 68 65 72 20 3d 20 ..if ((cipher =
8c90: 47 65 74 43 69 70 68 65 72 28 69 6e 74 65 72 70 GetCipher(interp
8ca0: 2c 20 63 69 70 68 65 72 4f 62 6a 2c 20 26 74 79 , cipherObj, &ty
8cb0: 70 65 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a pe)) == NULL) {.
8cc0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
8cd0: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 20 ERROR;..}. }
8ce0: 65 6c 73 65 20 69 66 20 28 74 79 70 65 20 3d 3d else if (type ==
8cf0: 20 54 59 50 45 5f 43 4d 41 43 29 20 7b 0a 09 54 TYPE_CMAC) {..T
8d00: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
8d10: 69 6e 74 65 72 70 2c 20 22 4e 6f 20 63 69 70 68 interp, "No ciph
8d20: 65 72 20 73 70 65 63 69 66 69 65 64 22 2c 20 4e er specified", N
8d30: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 ULL);..return TC
8d40: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
8d50: 20 20 20 20 2f 2a 20 47 65 74 20 6d 65 73 73 61 /* Get messa
8d60: 67 65 20 64 69 67 65 73 74 20 2a 2f 0a 20 20 20 ge digest */.
8d70: 20 69 66 20 28 64 69 67 65 73 74 4f 62 6a 20 21 if (digestObj !
8d80: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 28 = NULL) {..if ((
8d90: 6d 64 20 3d 20 47 65 74 44 69 67 65 73 74 28 69 md = GetDigest(i
8da0: 6e 74 65 72 70 2c 20 64 69 67 65 73 74 4f 62 6a nterp, digestObj
8db0: 2c 20 26 66 6f 72 6d 61 74 29 29 20 3d 3d 20 4e , &format)) == N
8dc0: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 72 65 74 75 ULL) {.. retu
8dd0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
8de0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
8df0: 74 79 70 65 20 3d 3d 20 54 59 50 45 5f 4d 44 20 type == TYPE_MD
8e00: 7c 7c 20 74 79 70 65 20 3d 3d 20 54 59 50 45 5f || type == TYPE_
8e10: 48 4d 41 43 29 20 7b 0a 09 54 63 6c 5f 41 70 70 HMAC) {..Tcl_App
8e20: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
8e30: 2c 20 22 4e 6f 20 64 69 67 65 73 74 20 73 70 65 , "No digest spe
8e40: 63 69 66 69 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a cified", NULL);.
8e50: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
8e60: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
8e70: 20 47 65 74 20 6b 65 79 20 2a 2f 0a 20 20 20 20 Get key */.
8e80: 69 66 20 28 6b 65 79 4f 62 6a 20 21 3d 20 4e 55 if (keyObj != NU
8e90: 4c 4c 29 20 7b 0a 09 69 66 20 28 47 65 74 4b 65 LL) {..if (GetKe
8ea0: 79 28 69 6e 74 65 72 70 2c 20 6b 65 79 4f 62 6a y(interp, keyObj
8eb0: 2c 20 26 74 79 70 65 29 20 3d 3d 20 4e 55 4c 4c , &type) == NULL
8ec0: 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 ) {.. return
8ed0: 54 43 4c 5f 45 52 52 4f 52 3b 09 0a 09 7d 0a 20 TCL_ERROR;...}.
8ee0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 74 79 } else if (ty
8ef0: 70 65 20 21 3d 20 54 59 50 45 5f 4d 44 29 20 7b pe != TYPE_MD) {
8f00: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
8f10: 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20 6b lt(interp, "No k
8f20: 65 79 20 73 70 65 63 69 66 69 65 64 22 2c 20 4e ey specified", N
8f30: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 ULL);..return TC
8f40: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
8f50: 20 20 20 20 2f 2a 20 47 65 74 20 4d 41 43 20 2a /* Get MAC *
8f60: 2f 0a 20 20 20 20 69 66 20 28 6d 61 63 4f 62 6a /. if (macObj
8f70: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 != NULL) {..if
8f80: 28 28 6d 61 63 20 3d 20 47 65 74 4d 41 43 28 69 ((mac = GetMAC(i
8f90: 6e 74 65 72 70 2c 20 6d 61 63 4f 62 6a 2c 20 26 nterp, macObj, &
8fa0: 74 79 70 65 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 type)) == NULL)
8fb0: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 {.. return TC
8fc0: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 L_ERROR;..}.
8fd0: 7d 20 65 6c 73 65 20 69 66 20 28 74 79 70 65 20 } else if (type
8fe0: 3d 3d 20 54 59 50 45 5f 4d 41 43 29 20 7b 0a 09 == TYPE_MAC) {..
8ff0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
9000: 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20 4d 41 43 (interp, "No MAC
9010: 20 73 70 65 63 69 66 69 65 64 22 2c 20 4e 55 4c specified", NUL
9020: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f L);..return TCL_
9030: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
9040: 20 20 2f 2a 20 43 61 6c 63 20 64 69 67 65 73 74 /* Calc digest
9050: 20 6f 6e 20 66 69 6c 65 2c 20 73 74 61 63 6b 65 on file, stacke
9060: 64 20 63 68 61 6e 6e 65 6c 2c 20 75 73 69 6e 67 d channel, using
9070: 20 69 6e 73 74 61 6e 63 65 20 63 6f 6d 6d 61 6e instance comman
9080: 64 2c 20 6f 72 20 64 61 74 61 20 62 6c 6f 62 20 d, or data blob
9090: 2a 2f 0a 20 20 20 20 69 66 20 28 66 69 6c 65 4f */. if (fileO
90a0: 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 bj != NULL) {..r
90b0: 65 73 20 3d 20 44 69 67 65 73 74 46 69 6c 65 48 es = DigestFileH
90c0: 61 6e 64 6c 65 72 28 69 6e 74 65 72 70 2c 20 66 andler(interp, f
90d0: 69 6c 65 4f 62 6a 2c 20 6d 64 2c 20 63 69 70 68 ileObj, md, ciph
90e0: 65 72 2c 20 66 6f 72 6d 61 74 20 7c 20 74 79 70 er, format | typ
90f0: 65 2c 20 6b 65 79 4f 62 6a 2c 20 6d 61 63 29 3b e, keyObj, mac);
9100: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
9110: 63 68 61 6e 6e 65 6c 20 21 3d 20 4e 55 4c 4c 29 channel != NULL)
9120: 20 7b 0a 09 72 65 73 20 3d 20 44 69 67 65 73 74 {..res = Digest
9130: 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 28 69 ChannelHandler(i
9140: 6e 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c 2c 20 nterp, channel,
9150: 6d 64 2c 20 63 69 70 68 65 72 2c 20 66 6f 72 6d md, cipher, form
9160: 61 74 20 7c 20 74 79 70 65 2c 20 6b 65 79 4f 62 at | type, keyOb
9170: 6a 2c 20 6d 61 63 29 3b 0a 20 20 20 20 7d 20 65 j, mac);. } e
9180: 6c 73 65 20 69 66 20 28 63 6d 64 4f 62 6a 20 21 lse if (cmdObj !
9190: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 20 3d = NULL) {..res =
91a0: 20 44 69 67 65 73 74 43 6f 6d 6d 61 6e 64 48 61 DigestCommandHa
91b0: 6e 64 6c 65 72 28 69 6e 74 65 72 70 2c 20 63 6d ndler(interp, cm
91c0: 64 4f 62 6a 2c 20 6d 64 2c 20 63 69 70 68 65 72 dObj, md, cipher
91d0: 2c 20 66 6f 72 6d 61 74 20 7c 20 74 79 70 65 2c , format | type,
91e0: 20 6b 65 79 4f 62 6a 2c 20 6d 61 63 29 3b 0a 20 keyObj, mac);.
91f0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 64 61 } else if (da
9200: 74 61 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b taObj != NULL) {
9210: 0a 09 72 65 73 20 3d 20 44 69 67 65 73 74 44 61 ..res = DigestDa
9220: 74 61 48 61 6e 64 6c 65 72 28 69 6e 74 65 72 70 taHandler(interp
9230: 2c 20 64 61 74 61 4f 62 6a 2c 20 6d 64 2c 20 63 , dataObj, md, c
9240: 69 70 68 65 72 2c 20 66 6f 72 6d 61 74 20 7c 20 ipher, format |
9250: 74 79 70 65 2c 20 6b 65 79 4f 62 6a 2c 20 6d 61 type, keyObj, ma
9260: 63 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b c);. } else {
9270: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
9280: 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20 6f lt(interp, "No o
9290: 70 65 72 61 74 69 6f 6e 20 73 70 65 63 69 66 69 peration specifi
92a0: 65 64 3a 20 55 73 65 20 2d 63 68 61 6e 6e 65 6c ed: Use -channel
92b0: 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 61 74 , -command, -dat
92c0: 61 2c 20 6f 72 20 2d 66 69 6c 65 20 6f 70 74 69 a, or -file opti
92d0: 6f 6e 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 73 on", NULL);..res
92e0: 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 = TCL_ERROR;.
92f0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 }. return r
9300: 65 73 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d es;.}../*. *----
9310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
9350: 20 2a 0a 20 2a 20 4d 65 73 73 61 67 65 20 44 69 *. * Message Di
9360: 67 65 73 74 20 61 6e 64 20 4d 65 73 73 61 67 65 gest and Message
9370: 20 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 Authentication
9380: 43 6f 64 65 20 43 6f 6d 6d 61 6e 64 73 20 2d 2d Code Commands --
9390: 0a 20 2a 0a 20 2a 09 52 65 74 75 72 6e 20 4d 65 . *. *.Return Me
93a0: 73 73 61 67 65 20 44 69 67 65 73 74 20 28 4d 44 ssage Digest (MD
93b0: 29 20 6f 72 20 4d 65 73 73 61 67 65 20 41 75 74 ) or Message Aut
93c0: 68 65 6e 74 69 63 61 74 69 6f 6e 20 43 6f 64 65 hentication Code
93d0: 20 28 4d 41 43 29 2e 0a 20 2a 0a 20 2a 20 52 65 (MAC).. *. * Re
93e0: 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b turns:. *.TCL_OK
93f0: 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a or TCL_ERROR. *
9400: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
9410: 3a 0a 20 2a 09 53 65 74 73 20 72 65 73 75 6c 74 :. *.Sets result
9420: 20 74 6f 20 6d 65 73 73 61 67 65 20 64 69 67 65 to message dige
9430: 73 74 20 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 st or error mess
9440: 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d age. *. *-------
9450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
9490: 0a 73 74 61 74 69 63 20 69 6e 74 20 4d 64 4f 62 .static int MdOb
94a0: 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 jCmd(ClientData
94b0: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f clientData, Tcl_
94c0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
94d0: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 int objc, Tcl_Ob
94e0: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 j *const objv[])
94f0: 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 44 69 {. return Di
9500: 67 65 73 74 4d 61 69 6e 28 54 59 50 45 5f 4d 44 gestMain(TYPE_MD
9510: 2c 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 , interp, objc,
9520: 6f 62 6a 76 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 objv);.}..static
9530: 20 69 6e 74 20 43 4d 41 43 4f 62 6a 43 6d 64 28 int CMACObjCmd(
9540: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
9550: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
9560: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
9570: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
9580: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
9590: 20 20 72 65 74 75 72 6e 20 44 69 67 65 73 74 4d return DigestM
95a0: 61 69 6e 28 54 59 50 45 5f 43 4d 41 43 2c 20 69 ain(TYPE_CMAC, i
95b0: 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a nterp, objc, obj
95c0: 76 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e v);.}..static in
95d0: 74 20 48 4d 41 43 4f 62 6a 43 6d 64 28 43 6c 69 t HMACObjCmd(Cli
95e0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
95f0: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a ta, Tcl_Interp *
9600: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 interp, int objc
9610: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 , Tcl_Obj *const
9620: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 72 objv[]) {. r
9630: 65 74 75 72 6e 20 44 69 67 65 73 74 4d 61 69 6e eturn DigestMain
9640: 28 54 59 50 45 5f 48 4d 41 43 2c 20 69 6e 74 65 (TYPE_HMAC, inte
9650: 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b rp, objc, objv);
9660: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 4d .}..static int M
9670: 41 43 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 ACObjCmd(ClientD
9680: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
9690: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
96a0: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 rp, int objc, Tc
96b0: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
96c0: 76 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 72 v[]) {. retur
96d0: 6e 20 44 69 67 65 73 74 4d 61 69 6e 28 54 59 50 n DigestMain(TYP
96e0: 45 5f 4d 41 43 2c 20 69 6e 74 65 72 70 2c 20 6f E_MAC, interp, o
96f0: 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 7d 0a 0a 2f bjc, objv);.}../
9700: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
9710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9740: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 65 -------. *. * Me
9750: 73 73 61 67 65 20 44 69 67 65 73 74 20 43 6f 6e ssage Digest Con
9760: 76 65 6e 69 65 6e 63 65 20 43 6f 6d 6d 61 6e 64 venience Command
9770: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43 6f 6e 76 65 s --. *. *.Conve
9780: 6e 69 65 6e 63 65 20 63 6f 6d 6d 61 6e 64 73 20 nience commands
9790: 66 6f 72 20 73 65 6c 65 63 74 20 6d 65 73 73 61 for select messa
97a0: 67 65 20 64 69 67 65 73 74 73 2e 0a 20 2a 0a 20 ge digests.. *.
97b0: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 * Returns:. *.TC
97c0: 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f L_OK or TCL_ERRO
97d0: 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 R. *. * Side eff
97e0: 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 72 65 ects:. *.Sets re
97f0: 73 75 6c 74 20 74 6f 20 6d 65 73 73 61 67 65 20 sult to message
9800: 64 69 67 65 73 74 20 6f 72 20 65 72 72 6f 72 20 digest or error
9810: 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d message. *. *---
9820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9860: 0a 20 2a 2f 0a 20 23 64 65 66 69 6e 65 20 76 61 . */. #define va
9870: 6c 69 64 61 74 65 5f 61 72 67 63 28 6f 62 6a 63 lidate_argc(objc
9880: 2c 20 6f 62 6a 76 29 20 7b 20 5c 0a 20 20 20 20 , objv) { \.
9890: 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b if (objc != 2) {
98a0: 20 5c 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d \..Tcl_WrongNum
98b0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 Args(interp, 1,
98c0: 6f 62 6a 76 2c 20 22 64 61 74 61 22 29 3b 20 5c objv, "data"); \
98d0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
98e0: 4f 52 3b 20 5c 0a 20 20 20 20 7d 20 5c 0a 7d 0a OR; \. } \.}.
98f0: 20 0a 69 6e 74 20 4d 44 34 4f 62 6a 43 6d 64 28 .int MD4ObjCmd(
9900: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
9910: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
9920: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
9930: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
9940: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
9950: 20 20 76 61 6c 69 64 61 74 65 5f 61 72 67 63 28 validate_argc(
9960: 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 20 20 20 objc, objv);.
9970: 20 72 65 74 75 72 6e 20 44 69 67 65 73 74 44 61 return DigestDa
9980: 74 61 48 61 6e 64 6c 65 72 28 69 6e 74 65 72 70 taHandler(interp
9990: 2c 20 6f 62 6a 76 5b 31 5d 2c 20 45 56 50 5f 6d , objv[1], EVP_m
99a0: 64 34 28 29 2c 20 4e 55 4c 4c 2c 20 48 45 58 5f d4(), NULL, HEX_
99b0: 46 4f 52 4d 41 54 20 7c 20 54 59 50 45 5f 4d 44 FORMAT | TYPE_MD
99c0: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 7d , NULL, NULL);.}
99d0: 0a 0a 69 6e 74 20 4d 44 35 4f 62 6a 43 6d 64 28 ..int MD5ObjCmd(
99e0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
99f0: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
9a00: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
9a10: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
9a20: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
9a30: 20 20 76 61 6c 69 64 61 74 65 5f 61 72 67 63 28 validate_argc(
9a40: 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 20 20 20 objc, objv);.
9a50: 20 72 65 74 75 72 6e 20 44 69 67 65 73 74 44 61 return DigestDa
9a60: 74 61 48 61 6e 64 6c 65 72 28 69 6e 74 65 72 70 taHandler(interp
9a70: 2c 20 6f 62 6a 76 5b 31 5d 2c 20 45 56 50 5f 6d , objv[1], EVP_m
9a80: 64 35 28 29 2c 20 4e 55 4c 4c 2c 20 48 45 58 5f d5(), NULL, HEX_
9a90: 46 4f 52 4d 41 54 20 7c 20 54 59 50 45 5f 4d 44 FORMAT | TYPE_MD
9aa0: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 7d , NULL, NULL);.}
9ab0: 0a 0a 69 6e 74 20 53 48 41 31 4f 62 6a 43 6d 64 ..int SHA1ObjCmd
9ac0: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
9ad0: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ntData, Tcl_Inte
9ae0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
9af0: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 objc, Tcl_Obj *c
9b00: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 onst objv[]) {.
9b10: 20 20 20 76 61 6c 69 64 61 74 65 5f 61 72 67 63 validate_argc
9b20: 28 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 20 20 (objc, objv);.
9b30: 20 20 72 65 74 75 72 6e 20 44 69 67 65 73 74 44 return DigestD
9b40: 61 74 61 48 61 6e 64 6c 65 72 28 69 6e 74 65 72 ataHandler(inter
9b50: 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 45 56 50 5f p, objv[1], EVP_
9b60: 73 68 61 31 28 29 2c 20 4e 55 4c 4c 2c 20 48 45 sha1(), NULL, HE
9b70: 58 5f 46 4f 52 4d 41 54 20 7c 20 54 59 50 45 5f X_FORMAT | TYPE_
9b80: 4d 44 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b MD, NULL, NULL);
9b90: 0a 7d 0a 0a 69 6e 74 20 53 48 41 32 35 36 4f 62 .}..int SHA256Ob
9ba0: 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 jCmd(ClientData
9bb0: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f clientData, Tcl_
9bc0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
9bd0: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 int objc, Tcl_Ob
9be0: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 j *const objv[])
9bf0: 20 7b 0a 20 20 20 20 76 61 6c 69 64 61 74 65 5f {. validate_
9c00: 61 72 67 63 28 6f 62 6a 63 2c 20 6f 62 6a 76 29 argc(objc, objv)
9c10: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 44 69 67 ;. return Dig
9c20: 65 73 74 44 61 74 61 48 61 6e 64 6c 65 72 28 69 estDataHandler(i
9c30: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 nterp, objv[1],
9c40: 45 56 50 5f 73 68 61 32 35 36 28 29 2c 20 4e 55 EVP_sha256(), NU
9c50: 4c 4c 2c 20 48 45 58 5f 46 4f 52 4d 41 54 20 7c LL, HEX_FORMAT |
9c60: 20 54 59 50 45 5f 4d 44 2c 20 4e 55 4c 4c 2c 20 TYPE_MD, NULL,
9c70: 4e 55 4c 4c 29 3b 0a 7d 0a 0a 69 6e 74 20 53 48 NULL);.}..int SH
9c80: 41 35 31 32 4f 62 6a 43 6d 64 28 43 6c 69 65 6e A512ObjCmd(Clien
9c90: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
9ca0: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
9cb0: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
9cc0: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
9cd0: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 76 61 6c bjv[]) {. val
9ce0: 69 64 61 74 65 5f 61 72 67 63 28 6f 62 6a 63 2c idate_argc(objc,
9cf0: 20 6f 62 6a 76 29 3b 0a 20 20 20 20 72 65 74 75 objv);. retu
9d00: 72 6e 20 44 69 67 65 73 74 44 61 74 61 48 61 6e rn DigestDataHan
9d10: 64 6c 65 72 28 69 6e 74 65 72 70 2c 20 6f 62 6a dler(interp, obj
9d20: 76 5b 31 5d 2c 20 45 56 50 5f 73 68 61 35 31 32 v[1], EVP_sha512
9d30: 28 29 2c 20 4e 55 4c 4c 2c 20 48 45 58 5f 46 4f (), NULL, HEX_FO
9d40: 52 4d 41 54 20 7c 20 54 59 50 45 5f 4d 44 2c 20 RMAT | TYPE_MD,
9d50: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a NULL, NULL);.}..
9d60: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
9d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9da0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
9db0: 6c 73 5f 44 69 67 65 73 74 43 6f 6d 6d 61 6e 64 ls_DigestCommand
9dc0: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43 72 65 61 74 s --. *. *.Creat
9dd0: 65 20 64 69 67 65 73 74 20 63 6f 6d 6d 61 6e 64 e digest command
9de0: 73 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a s. *. * Returns:
9df0: 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 . *.TCL_OK or TC
9e00: 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 L_ERROR. *. * Si
9e10: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 de effects:. *.C
9e20: 72 65 61 74 65 73 20 63 6f 6d 6d 61 6e 64 73 0a reates commands.
9e30: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
9e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9e70: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 --------. */.int
9e80: 20 54 6c 73 5f 44 69 67 65 73 74 43 6f 6d 6d 61 Tls_DigestComma
9e90: 6e 64 73 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a nds(Tcl_Interp *
9ea0: 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 54 63 interp) {. Tc
9eb0: 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
9ec0: 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a nd(interp, "tls:
9ed0: 3a 64 69 67 65 73 74 22 2c 20 4d 64 4f 62 6a 43 :digest", MdObjC
9ee0: 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
9ef0: 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 0, (Tcl_CmdDele
9f00: 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
9f10: 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
9f20: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
9f30: 2c 20 22 74 6c 73 3a 3a 6d 64 22 2c 20 4d 64 4f , "tls::md", MdO
9f40: 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
9f50: 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 ta) 0, (Tcl_CmdD
9f60: 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
9f70: 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
9f80: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
9f90: 65 72 70 2c 20 22 74 6c 73 3a 3a 63 6d 61 63 22 erp, "tls::cmac"
9fa0: 2c 20 43 4d 41 43 4f 62 6a 43 6d 64 2c 20 28 43 , CMACObjCmd, (C
9fb0: 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 lientData) 0, (T
9fc0: 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
9fd0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
9fe0: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
9ff0: 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
a000: 3a 3a 68 6d 61 63 22 2c 20 48 4d 41 43 4f 62 6a ::hmac", HMACObj
a010: 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 Cmd, (ClientData
a020: 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c ) 0, (Tcl_CmdDel
a030: 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 eteProc *) NULL)
a040: 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 ;. Tcl_Create
a050: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
a060: 70 2c 20 22 74 6c 73 3a 3a 6d 61 63 22 2c 20 4d p, "tls::mac", M
a070: 41 43 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e ACObjCmd, (Clien
a080: 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 tData) 0, (Tcl_C
a090: 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
a0a0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 NULL);. Tcl_C
a0b0: 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
a0c0: 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 64 interp, "tls::md
a0d0: 34 22 2c 20 4d 44 34 4f 62 6a 43 6d 64 2c 20 28 4", MD4ObjCmd, (
a0e0: 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 ClientData) 0, (
a0f0: 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f Tcl_CmdDeletePro
a100: 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 c *) NULL);.
a110: 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
a120: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c mand(interp, "tl
a130: 73 3a 3a 6d 64 35 22 2c 20 4d 44 35 4f 62 6a 43 s::md5", MD5ObjC
a140: 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
a150: 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 0, (Tcl_CmdDele
a160: 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
a170: 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
a180: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
a190: 2c 20 22 74 6c 73 3a 3a 73 68 61 31 22 2c 20 53 , "tls::sha1", S
a1a0: 48 41 31 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 HA1ObjCmd, (Clie
a1b0: 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f ntData) 0, (Tcl_
a1c0: 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 CmdDeleteProc *)
a1d0: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f NULL);. Tcl_
a1e0: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 CreateObjCommand
a1f0: 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 (interp, "tls::s
a200: 68 61 32 35 36 22 2c 20 53 48 41 32 35 36 4f 62 ha256", SHA256Ob
a210: 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 jCmd, (ClientDat
a220: 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 a) 0, (Tcl_CmdDe
a230: 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c leteProc *) NULL
a240: 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 );. Tcl_Creat
a250: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
a260: 72 70 2c 20 22 74 6c 73 3a 3a 73 68 61 35 31 32 rp, "tls::sha512
a270: 22 2c 20 53 48 41 35 31 32 4f 62 6a 43 6d 64 2c ", SHA512ObjCmd,
a280: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c (ClientData) 0,
a290: 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 (Tcl_CmdDeleteP
a2a0: 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 roc *) NULL);.
a2b0: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
a2c0: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
a2d0: 74 6c 73 3a 3a 75 6e 73 74 61 63 6b 22 2c 20 44 tls::unstack", D
a2e0: 69 67 65 73 74 55 6e 73 74 61 63 6b 4f 62 6a 43 igestUnstackObjC
a2f0: 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
a300: 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 0, (Tcl_CmdDele
a310: 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
a320: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
a330: 4f 4b 3b 0a 7d 0a 0a OK;.}..